Subversion Repositories NaviCtrl

Compare Revisions

Ignore whitespace Rev 40 → Rev 41

/trunk/91x_conf.h
41,7 → 41,7
/************************* FMI *************************/
#define _FMI
/************************* WIU *************************/
//#define _WIU
#define _WIU
/************************* TIM *************************/
#define _TIM
#define _TIM0
/trunk/GPS.c
1,4 → 1,14
/*#######################################################################################*/
/*#######################################################################################*/
 
// IMPORTANT NOTE:
 
// This is only a dummy implementation for errorfree compiling of the NaviCtrl sources.
 
// The GPS navigation routines are NOT included !
 
/*#######################################################################################*/
/*#######################################################################################*/
/* !!! THIS IS NOT FREE SOFTWARE !!! */
/*#######################################################################################*/
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7,14 → 17,14
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
25,21 → 35,21
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
52,108 → 62,551
// + 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.
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "91x_lib.h"
#include "main.h"
#include "uart1.h"
#include "GPS.h"
#include "timer.h"
#include "spi_slave.h"
#include "waypoints.h"
#include "i2c.h"
 
u8 OsdBar; // Direction home for OSD
s16 OsdDistance; // Distance home
s16 GPS_Nick;
s16 GPS_Roll;
 
struct str_GPSParameter GPSParameter;
#define M_PI_180 (M_PI / 180.0f)
#define GPS_UPDATETIME_MS 200 // 200ms is 5 Hz
typedef enum
{
GPS_FLIGHT_MODE_UNDEF,
GPS_FLIGHT_MODE_FREE,
GPS_FLIGHT_MODE_AID,
GPS_FLIGHT_MODE_WAYPOINT
} GPS_FlightMode_t;
 
#define GPS_MODE_FREE 0
#define GPS_MODE_AID 1
#define GPS_MODE_HOLD 2
#define GPS_MODE_HOME 3
u32 GpsFlightMode = GPS_MODE_FREE;
typedef struct
{
float Gain;
float P;
float I;
float D;
float A;
float ACC;
u8 MinSat;
s8 StickThreshold;
float WindCorrection;
s32 OperatingRadius;
u32 NaviAngleLimitation;
GPS_FlightMode_t FlightMode;
} __attribute__((packed)) GPS_Parameter_t;
 
typedef struct
{
Status_t Status; // invalid, newdata, processed
s32 North; // in cm
s32 East; // in cm
s32 Bearing; // in deg
s32 Distance; // in cm
} __attribute__((packed)) GPS_Deviation_t;
GPS_Deviation_t TargetDeviation;
 
GPS_Stick_t GPS_Stick;
GPS_Parameter_t GPS_Parameter;
 
// the gps reference positions
GPS_Pos_t GPS_HoldPosition = {0,0,0, INVALID}; // the hold position
GPS_Pos_t GPS_HomePosition = {0,0,0, INVALID}; // the home position
GPS_Pos_t * GPS_pTargetPosition = NULL; // pointer to the actual target position
Waypoint_t* GPS_pWaypoint = NULL; // pointer to the actual waypoint
 
//-------------------------------------------------------------
// Update GPSParamter
void GPS_UpdateParameter(void)
{
static GPS_FlightMode_t FlightMode_Old = GPS_FLIGHT_MODE_UNDEF;
// in case of bad receiving conditions
if(FC.RC_Quality < 100)
{ // set fixed parameter
GPS_Parameter.FlightMode = GPS_FLIGHT_MODE_FREE;
GPS_Parameter.Gain = (float) 100;
GPS_Parameter.P = (float) 90;
GPS_Parameter.I = (float) 90;
GPS_Parameter.D = (float) 90;
GPS_Parameter.A = (float) 90;
GPS_Parameter.ACC = (float) 0;
GPS_Parameter.MinSat = 6;
GPS_Parameter.StickThreshold = 8;
GPS_Parameter.WindCorrection = 0.0;
GPS_Parameter.OperatingRadius = 0; // forces the aircraft to fly to home positon
GPS_Parameter.NaviAngleLimitation = 125;
}
else
{
// update parameter from FC
if(StopNavigation) GPS_Parameter.FlightMode = GPS_FLIGHT_MODE_FREE;
else
{
if (Parameter.NaviGpsModeControl < 50) GPS_Parameter.FlightMode = GPS_FLIGHT_MODE_AID;
else if(Parameter.NaviGpsModeControl < 180) GPS_Parameter.FlightMode = GPS_FLIGHT_MODE_FREE;
else GPS_Parameter.FlightMode = GPS_FLIGHT_MODE_WAYPOINT;
}
GPS_Parameter.Gain = (float)Parameter.NaviGpsGain;
GPS_Parameter.P = (float)Parameter.NaviGpsP;
GPS_Parameter.I = (float)Parameter.NaviGpsI;
GPS_Parameter.D = (float)Parameter.NaviGpsD;
GPS_Parameter.A = (float)Parameter.NaviGpsD;
GPS_Parameter.ACC = (float)Parameter.NaviGpsACC;
GPS_Parameter.MinSat = (u8)Parameter.NaviGpsMinSat;
GPS_Parameter.StickThreshold = (s8)Parameter.NaviStickThreshold;
GPS_Parameter.WindCorrection = (float)Parameter.NaviWindCorrection;
GPS_Parameter.OperatingRadius = (s32)Parameter.NaviOperatingRadius * 100; // conversion of m to cm
GPS_Parameter.NaviAngleLimitation = (u32) Parameter.NaviAngleLimitation * 2;
}
// FlightMode changed?
if(GPS_Parameter.FlightMode != FlightMode_Old) BeepTime = 100; // beep to indicate that mode has switched
FlightMode_Old = GPS_Parameter.FlightMode;
}
 
//-------------------------------------------------------------
// This function defines a good GPS signal condition
u8 GPS_IsSignalOK(void)
{
if( (GPSData.Status != INVALID) && (GPSData.SatFix == SATFIX_3D) && (GPSData.NumOfSats >= GPS_Parameter.MinSat)) return(1);
else return(0);
}
 
//------------------------------------------------------------
// Init variables or send configuration to GPS module
// Checks for manual control action
u8 GPS_IsManuallyControlled(void)
{
if( ( (abs(FC.StickNick) > GPS_Parameter.StickThreshold) || (abs(FC.StickRoll) > GPS_Parameter.StickThreshold)) && (GPS_Parameter.StickThreshold > 0)) return 1;
else return 0;
}
 
//------------------------------------------------------------
// copy GPS position from source position to target position
u8 GPS_CopyPosition(GPS_Pos_t * pGPSPosSrc, GPS_Pos_t* pGPSPosTgt)
{
u8 retval = 0;
if((pGPSPosSrc == NULL) || (pGPSPosTgt == NULL)) return(retval); // bad pointer
// copy only valid positions
if(pGPSPosSrc->Status != INVALID)
{
// if the source GPS position is not invalid
pGPSPosTgt->Longitude = pGPSPosSrc->Longitude;
pGPSPosTgt->Latitude = pGPSPosSrc->Latitude;
pGPSPosTgt->Altitude = pGPSPosSrc->Altitude;
pGPSPosTgt->Status = NEWDATA; // mark data in target position as new
retval = 1;
}
return(retval);
}
 
//------------------------------------------------------------
// clear position data
u8 GPS_ClearPosition(GPS_Pos_t * pGPSPos)
{
u8 retval = FALSE;
if(pGPSPos == NULL) return(retval); // bad pointer
else
{
pGPSPos->Longitude = 0;
pGPSPos->Latitude = 0;
pGPSPos->Altitude = 0;
pGPSPos->Status = INVALID;
retval = TRUE;
}
return (retval);
}
 
 
//------------------------------------------------------------
void GPS_Neutral()
{
GPS_Stick.Nick = 0;
GPS_Stick.Roll = 0;
GPS_Stick.Yaw = 0;
}
 
//------------------------------------------------------------
void GPS_Init(void)
{
GPS_Nick = 0;
GPS_Roll = 0;
OsdDistance = 0;
OsdBar = 0;
SerialPutString("\r\n GPS init...");
UBX_Init();
GPS_Neutral();
GPS_ClearPosition(&GPS_HoldPosition);
GPS_ClearPosition(&GPS_HomePosition);
GPS_pTargetPosition = NULL;
WPList_Init();
GPS_pWaypoint = WPList_Begin();
GPS_UpdateParameter();
SerialPutString("ok");
}
 
GPSParameter.P = 100;
GPSParameter.I = 100;
GPSParameter.D = 100;
GPSParameter.A = 100;
GPSParameter.ACC = 100;
GPSParameter.ModeSchalter = 100;
GPSParameter.Amplification = 100;;
//------------------------------------------------------------
// calculate the bearing to target position from its deviation
s32 DirectionToTarget_N_E(float northdev, float eastdev)
{
s32 bearing;
bearing = (s32)(atan2(northdev, eastdev) / M_PI_180);
bearing = (270L - bearing)%360L;
return(bearing);
}
 
 
//------------------------------------------------------------
// Rescale xy-vector length if length limit is violated
void GPS_LimitXY(s32 *x, s32 *y, s32 limit)
{
s32 dist;
dist = (s32)hypot(*x,*y); // the length of the vector
if ((dist != 0L) && (dist > limit))
// if vector length is larger than the given limit
{ // scale vector compontents so that the length is cut off to limit
*x = (*x * limit) / dist;
*y = (*y * limit) / dist;
}
}
 
u8 Navigation(void)
//------------------------------------------------------------
// transform the integer deg into float radians
inline double RadiansFromGPS(s32 deg)
{
static char GpsFix = 0, NewGpsMode = 0;
static u32 beep_rythm;
u32 tmp_long;
if(NewGPSDataAvail) // there are new data from gps module
{
NewGPSDataAvail = 0;
beep_rythm++;
return ((double)deg * 1e-7f * M_PI_180); // 1E-7 because deg is the value in ° * 1E7
}
 
GPSParameter.ModeSchalter = Parameter_UserParam1;
GPSParameter.Amplification = (float) Parameter_UserParam2 / (100.0);
GPSParameter.P = (float) Parameter_UserParam3;
GPSParameter.I = (float) Parameter_UserParam4;
GPSParameter.D = (float) Parameter_UserParam5;
GPSParameter.A = (float) Parameter_UserParam6;
GPSParameter.ACC = (float) Parameter_UserParam7;
if(SenderOkay < 100) // Empfangsausfall
{
GPSParameter.ModeSchalter = 0;
GPSParameter.Amplification = 100;
GPSParameter.P = (float) 90;
GPSParameter.I = (float) 90;
GPSParameter.D = (float) 90;
GPSParameter.A = (float) 90;
GPSParameter.ACC = (float) 90;
}
//------------------------------------------------------------
// transform the integer deg into float deg
inline double DegFromGPS(s32 deg)
{
return ((double)deg * 1e-7f); // 1E-7 because deg is the value in ° * 1E7
}
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ GPS-Mode
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tmp_long = GpsFlightMode;
if(GPSParameter.ModeSchalter < 20) GpsFlightMode = GPS_MODE_AID;
else
if(GPSParameter.ModeSchalter < 200) GpsFlightMode = GPS_MODE_FREE;
else GpsFlightMode = GPS_MODE_HOME;
if(GpsFlightMode != tmp_long) // Mode changed
{
BeepTime = 100;
NewGpsMode = 1;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//------------------------------------------------------------
// calculate the deviation from the current position to the target position
u8 GPS_CalculateDeviation(GPS_Pos_t * pCurrentPos, GPS_Pos_t * pTargetPos)
{
double temp1, temp2;
// if given pointer is NULL
if((pCurrentPos == NULL) || (pTargetPos == NULL)) goto baddata;
// if positions are invalid
if((pCurrentPos->Status == INVALID) || (pTargetPos->Status == INVALID)) goto baddata;
 
// The deviation from the current to the target position along north and east direction is
// simple the lat/lon difference. To convert that angular deviation into an
// arc length the spherical projection has to be considered.
// The mean earth radius is 6371km. Therfore the arc length per latitude degree
// is always 6371km * 2 * Pi / 360deg = 111.2 km/deg.
// The arc length per longitude degree depends on the correspondig latitude and
// is 111.2km * cos(latitude).
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ Fix okay
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if((GPS_Data.Flags & GPS_FIX) && ((GPS_Data.Used_Sat >= GPS_SAT_MIN) || GpsFix))
{
GpsFix = 1; // hysteresis
// here is a good place to put your GPS code...
GPS_Nick = 0; // do nothing
GPS_Roll = 0; // do nothing
// calculate the shortest longitude deviation from target
temp1 = DegFromGPS(pCurrentPos->Longitude) - DegFromGPS(pTargetPos->Longitude);
// outside an angular difference of -180 deg ... +180 deg its shorter to go the other way around
// In our application we wont fly more than 20.000 km but along the date line this is important.
if(temp1 > 180.0f) temp1 -= 360.0f;
else if (temp1 < -180.0f) temp1 += 360.0f;
temp1 *= cos(RadiansFromGPS(pTargetPos->Latitude));
// calculate latitude deviation from target
// this is allways within -180 deg ... 180 deg
temp2 = DegFromGPS(pCurrentPos->Latitude) - DegFromGPS(pTargetPos->Latitude);
// deviation from target position in cm
// i.e. the distance to walk from the target in northern and eastern direction to reach the current position
 
TargetDeviation.Status = INVALID;
TargetDeviation.North = (s32)(11119492.7f * temp2);
TargetDeviation.East = (s32)(11119492.7f * temp1);
// If the position deviation is small enough to neglect the earth curvature
// (this is for our application always fulfilled) the distance to target
// can be calculated by the pythagoras of north and east deviation.
TargetDeviation.Distance = (s32)(11119492.7f * hypot(temp1, temp2));
if (TargetDeviation.Distance == 0L) TargetDeviation.Bearing = 0L;
else TargetDeviation.Bearing = DirectionToTarget_N_E(temp2, temp1);
TargetDeviation.Status = NEWDATA;
return TRUE;
 
baddata:
TargetDeviation.North = 0L;
TargetDeviation.East = 0L;
TargetDeviation.Distance = 0L;
TargetDeviation.Bearing = 0L;
TargetDeviation.Status = INVALID;
return FALSE;
}
 
//------------------------------------------------------------
void GPS_Navigation(void)
{
static u32 beep_rythm;
static u32 GPSDataTimeout = 0;
 
// pointer to current target position
static GPS_Pos_t * pTargetPositionOld = NULL;
static Waypoint_t* GPS_pWaypointOld = NULL;
 
static GPS_Pos_t RangedTargetPosition = {0,0,0, INVALID}; // the limited target position, this is derived from the target position with repect to the operating radius
static s32 OperatingRadiusOld = -1;
static u8 WPArrived = FALSE;
static u32 WPTime = 0;
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ Check for new data from GPS-receiver
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
switch(GPSData.Status)
{
case INVALID: // no gps data available
// do nothing
break;
 
case PROCESSED: // the current data have been allready processed
// if no new data are available within the timeout switch to invalid state.
if(CheckDelay(GPSDataTimeout)) GPSData.Status = INVALID;
// wait for new gps data
break;
 
case NEWDATA: // handle new gps data
 
// update GPS Parameter from FC-Data via SPI interface
GPS_UpdateParameter();
 
// wait maximum of 3 times the normal data update time before data timemout
GPSDataTimeout = SetDelay(3 * GPS_UPDATETIME_MS);
beep_rythm++;
 
// debug
DebugOut.Analog[21] = (u16)GPSData.Speed_North;
DebugOut.Analog[22] = (u16)GPSData.Speed_East;
DebugOut.Analog[31] = (u16)GPSData.NumOfSats;
 
// If GPS signal condition is sufficient for a reliable position measurement
if(GPS_IsSignalOK())
{
// if the MK is starting or the home position is invalid then store the home position
if((FC.MKFlags & MKFLAG_START) || (GPS_HomePosition.Status == INVALID))
{ // try to update the home position from the current position
if(GPS_CopyPosition(&(GPSData.Position), &GPS_HomePosition))
{
BeepTime = 700; // beep on success
GPS_CopyPosition(&GPS_HomePosition, &(NaviData.HomePosition));
}
GPS_pWaypoint = WPList_Begin(); // go to start of waypoint list, return NULL of the list is empty
}
 
/* The selected flight mode influences the target position pointer and therefore the behavior */
 
// check for current flight mode and set the target pointer GPS_pTargetPosition respectively
switch(GPS_Parameter.FlightMode)
{
// the GPS control is deactived
case GPS_FLIGHT_MODE_FREE:
NaviData.NCFlags &= ~(NC_FLAG_PH | NC_FLAG_CH);
NaviData.NCFlags |= NC_FLAG_FREE;
 
// update hold position
GPS_CopyPosition(&(GPSData.Position), &GPS_HoldPosition);
// no target position
GPS_pTargetPosition = NULL;
break;
 
// the GPS supports the position hold, if the pilot takes no action
case GPS_FLIGHT_MODE_AID:
NaviData.NCFlags &= ~(NC_FLAG_FREE | NC_FLAG_CH);
NaviData.NCFlags |= NC_FLAG_PH;
// reset WPList to begin
GPS_pWaypoint = WPList_Begin();
 
if(GPS_IsManuallyControlled())
{
GPS_CopyPosition(&(GPSData.Position), &GPS_HoldPosition);
GPS_pTargetPosition = NULL;
}
else
{
GPS_pTargetPosition = &GPS_HoldPosition;
}
break;
 
// the GPS control is directed to a target position
// given by a waypoint or by the home position
case GPS_FLIGHT_MODE_WAYPOINT:
NaviData.NCFlags &= ~(NC_FLAG_FREE | NC_FLAG_PH);
NaviData.NCFlags |= NC_FLAG_CH;
 
// waypoint trigger logic
if(GPS_pWaypoint != NULL) // waypoint exist
{
if(GPS_pWaypoint->Position.Status == INVALID) // should never happen
{
GPS_pWaypoint = WPList_Next(); // goto to next WP
WPArrived = FALSE;
BeepTime = 255;
}
else // waypoint position is valid
{
// check if the pointer to the waypoint has been changed or the data have been updated
if((GPS_pWaypoint != GPS_pWaypointOld) || (GPS_pWaypoint->Position.Status == NEWDATA))
{
GPS_pWaypointOld = GPS_pWaypoint;
// reset the arrived bit to break a pending HoldTime of the old WP
WPArrived = FALSE;
}
 
if(TargetDeviation.Status != INVALID)
{ // if the waypoint was not catched and the target area has been reached
if(!WPArrived && (TargetDeviation.Distance < (GPS_pWaypoint->ToleranceRadius * 100)))
{
WPArrived = TRUE;
WPTime = SetDelay(GPS_pWaypoint->HoldTime * 1000); // set hold time stamp
}
}
// if WP has been reached once, wait hold time before trigger to next one
if(WPArrived)
{
/* ToDo: Adjust GPS_pWaypoint->Heading, GPS_pWaypoint->Event handling */
if(CheckDelay(WPTime))
{
GPS_pWaypoint = WPList_Next(); // goto to next waypoint, return NULL if end of list has been reached
WPArrived = FALSE; // which is not arrived
}
} // EOF if(WPArrived)
}
} // EOF waypoint trigger logic
 
if(GPS_pWaypoint != NULL) // Waypoint exist
{
// update the hold position
GPS_CopyPosition(&(GPSData.Position), &GPS_HoldPosition);
GPS_pTargetPosition = &(GPS_pWaypoint->Position);
}
else // no waypoint info available, i.e. the WPList is empty or the end of the list has been reached
{
// fly back to home postion
if(GPS_HomePosition.Status == INVALID)
{
GPS_pTargetPosition = &GPS_HoldPosition; // fall back to hold mode if home position is not available
BeepTime = 255; // beep to indicate missin home position
}
else // the home position is valid
{
// update the hold position
GPS_CopyPosition(&(GPSData.Position), &GPS_HoldPosition);
// set target to home position
GPS_pTargetPosition = &GPS_HomePosition;
}
}
break;
 
case GPS_FLIGHT_MODE_UNDEF:
default:
// update hold position
GPS_CopyPosition(&(GPSData.Position), &GPS_HoldPosition);
// no target position
GPS_pTargetPosition = NULL;
break;
 
}// EOF GPS Mode Handling
 
 
/* Calculation of range target based on the real target */
 
// if no target position exist clear the ranged target position
if(GPS_pTargetPosition == NULL) GPS_ClearPosition(&RangedTargetPosition);
else
{ // if the target position has been changed or the value has been updated or the OperatingRadius has changed
if((GPS_pTargetPosition != pTargetPositionOld) || (GPS_pTargetPosition->Status == NEWDATA) || (GPS_Parameter.OperatingRadius != OperatingRadiusOld) )
{
// calculate deviation of new target position from home position
if(GPS_CalculateDeviation(GPS_pTargetPosition, &GPS_HomePosition))
{
// check distance from home position
if(TargetDeviation.Distance > GPS_Parameter.OperatingRadius)
{
//calculate ranged target position to be within the operation radius area
NaviData.NCFlags |= NC_FLAG_RANGE_LIMIT;
TargetDeviation.Distance = GPS_Parameter.OperatingRadius;
GPS_LimitXY(&(TargetDeviation.East), &(TargetDeviation.North), TargetDeviation.Distance);
 
RangedTargetPosition.Status = INVALID;
RangedTargetPosition.Latitude = GPS_HomePosition.Latitude;
RangedTargetPosition.Latitude += (s32)((float)TargetDeviation.North / 1.11194927f);
RangedTargetPosition.Longitude = GPS_HomePosition.Longitude;
RangedTargetPosition.Longitude += (s32)((float)TargetDeviation.East / (1.11194927f * cos(RadiansFromGPS(GPS_HomePosition.Latitude))) );
RangedTargetPosition.Altitude = GPS_pTargetPosition->Altitude;
RangedTargetPosition.Status = NEWDATA;
}
else
{ // the target is located within the operation radius area
// simple copy the loaction to the ranged target position
GPS_CopyPosition(GPS_pTargetPosition, &RangedTargetPosition);
NaviData.NCFlags &= ~NC_FLAG_RANGE_LIMIT;
}
}
else
{ // deviation could not be determined
GPS_ClearPosition(&RangedTargetPosition);
}
GPS_pTargetPosition->Status = PROCESSED; // mark current target as processed!
}
}
OperatingRadiusOld = GPS_Parameter.OperatingRadius;
// remember last target position pointer
pTargetPositionOld = GPS_pTargetPosition;
 
/* Calculate position deviation from ranged target */
 
// calculate deviation of current position to ranged target position in cm
if(GPS_CalculateDeviation(&(GPSData.Position), &RangedTargetPosition))
{
// implement your control code here based
// in the info available in the TargetDeviation, GPSData and FromFlightCtrl.GyroHeading
GPS_Stick.Nick = 0;
GPS_Stick.Roll = 0;
GPS_Stick.Yaw = 0;
}
else // deviation could not be calculated
{ // do nothing on gps sticks!
GPS_Neutral();
}
 
}// eof if GPSSignal is OK
else // GPSSignal not OK
{
GPS_Neutral();
// beep if signal is not sufficient
if(GPS_Parameter.FlightMode != GPS_FLIGHT_MODE_FREE)
{
if(!(GPSData.Flags & FLAG_GPSFIXOK) && !(beep_rythm % 5)) BeepTime = 100;
else if (GPSData.NumOfSats < GPS_Parameter.MinSat && !(beep_rythm % 5)) BeepTime = 10;
}
}
GPSData.Status = PROCESSED; // mark as processed
break;
}
else
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ No Fix
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
{
GPS_Nick = 0; // reset value
GPS_Roll = 0; // reset value
if(!(GPS_Data.Flags & 0x01) && !(beep_rythm % 5)) BeepTime = 100;
else if (GPS_Data.Used_Sat < GPS_SAT_MIN && !(beep_rythm % 5)) BeepTime = 10;
}
}
return (0);
 
DebugOut.Analog[27] = (s16)TargetDeviation.North;
DebugOut.Analog[28] = (s16)TargetDeviation.East;
DebugOut.Analog[29] = GPS_Stick.Nick;
DebugOut.Analog[30] = GPS_Stick.Roll;
 
// update navi data, send back to ground station
GPS_CopyPosition(&(GPSData.Position), &(NaviData.CurrentPosition));
GPS_CopyPosition(&RangedTargetPosition, &(NaviData.TargetPosition));
NaviData.SatsInUse = GPSData.NumOfSats;
NaviData.TargetPositionDeviation.Distance = TargetDeviation.Distance;
NaviData.TargetPositionDeviation.Bearing = TargetDeviation.Bearing;
NaviData.UBat = FC.UBat;
NaviData.GroundSpeed = (u16)GPSData.Speed_Ground;
NaviData.Heading = (s16)GPSData.Heading;
NaviData.CompassHeading = (s16)FromFlightCtrl.GyroHeading;
NaviData.AngleNick = FromFlightCtrl.IntegralNick / 10;
NaviData.AngleRoll = FromFlightCtrl.IntegralRoll / 10;
NaviData.RC_Quality = (u8) FC.RC_Quality;
NaviData.MKFlags = (u8)FC.MKFlags;
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++
return;
}
 
/trunk/GPS.h
1,36 → 1,24
#ifndef __GPS_H
#define __GPS_H
 
#include "waypoints.h"
 
#define GPS_SAT_MIN 6
#define GPS_FIX 0x01
 
 
struct str_GPSParameter
typedef struct
{
float Amplification;
float P;
float I;
float D;
float V;
float A;
float ACC;
s32 ModeSchalter;
} __attribute__((packed));
s16 Nick;
s16 Roll;
s16 Yaw;
} __attribute__((packed)) GPS_Stick_t;
 
extern struct str_GPSParameter GPSParameter;
extern GPS_Pos_t GPS_HomePosition;
extern GPS_Pos_t * GPS_pTargetPosition;
extern Waypoint_t* GPS_pWaypoint;
 
extern u8 OsdBar;
extern s16 OsdDistance;
extern s16 GPS_Nick;
extern s16 GPS_Roll;
extern GPS_Stick_t GPS_Stick;
 
extern u8 Navigation(void);
extern void GPS_Init(void);
extern s32 TargetListeLong[20];
extern s32 TargetListeLat[20];
extern u32 ActualTargetNumber;
extern u32 StoreTargetNumber;
void GPS_Navigation(void);
void GPS_Init(void);
extern u8 GPS_CopyPosition(GPS_Pos_t * pGPSPosSrc, GPS_Pos_t* pGPSPosTgt);
 
#endif //__GPS_H
 
#endif
/trunk/Hex-Files/Navi-Ctrl_STR9_Release.hex
0,0 → 1,7504
:1000000018F09FE518F09FE518F09FE518F09FE5C0
:1000100018F09FE50000A0E118F09FE518F09FE5BB
:1000200050010000400000004400000048000000B3
:100030004C000000000000005000000054000000D0
:10004000230000EA1A0000EA280000EA2F0000EA74
:10005000000000EA350000EA04E04EE2FF5F2DE90F
:1000600000104FE102002DE92C029FE5000090E511
:1000700028129FE5001091E50000A0E10000A0E13A
:100080001FF021E300402DE914E29FE500F0A0E11C
:100090000040BDE8D2F021E3FC019FE5000080E5CF
:1000A000F8119FE5001081E50200BDE801F06FE165
:1000B000FF9FFDE8FF5F2DE900104FE102002DE9F1
:1000C0000D10A0E1830200EB0200BDE801F06FE13A
:1000D000FF9FFDE8FF5F2DE900104FE102002DE9D1
:1000E000850200EB0200BDE801F06FE1FF9FFDE833
:1000F00004E04EE2FF5F2DE900104FE102002DE920
:10010000860200EB0200BDE801F06FE1FF9FFDE811
:1001100008E04EE2FF5F2DE900104FE102002DE9FB
:100120006D0200EB0200BDE801F06FE1FF9FFDE80A
:1001300004E04EE2FF402DE900104FE102002DE9FE
:10014000750200EB0200BDE801F06FE1FF80FDE801
:1001500050119FE50020A0E3011041E2020051E1AF
:10016000FCFFFF8A40019FE540119FE5341080E5C8
:1001700034019FE538119FE5001080E50000A0E103
:100180000000A0E10000A0E10000A0E10000A0E16B
:100190000000A0E10000A0E10000A0E10000A0E15B
:1001A0000000A0E10000A0E10000A0E10000A0E14B
:1001B0000000A0E10000A0E10000A0E10267A0E3D0
:1001C0006070A0E3B070C6E1E8609FE50370A0E353
:1001D000B070C6E1E0109FE5041080E5081090E5DE
:1001E000011011E2FCFFFF0AD0109FE5001080E52E
:1001F000CC109FE51C1080E5C8109FE5201080E51D
:10020000C4009FE5D1F021E300D0A0E1800040E2EE
:10021000D2F021E300D0A0E1020B40E2D7F021E3CD
:1002200000D0A0E1040040E2DBF021E300D0A0E137
:10023000040040E2D3F021E300D0A0E1800040E2DE
:1002400010F021E300D0A0E101AB4DE27C109FE56E
:100250007C209FE57C309FE5030052E1040091344F
:1002600004008234FBFFFF3A0000A0E368109FE522
:1002700068209FE5020051E104008134FCFFFF3A51
:100280000000A0E358109FE558209FE5020051E1CF
:1002900004008134FCFFFF3A000100EA30F0FFFF68
:1002A000300000FC9000000020A107000020005C4E
:1002B00096010000020002004030080019C00B0047
:1002C00080000200731B000001C8FE0000800104D2
:1002D000F0D0010000000004B8030004C0030004D3
:1002E0000819000408190004081900040DC0A0E151
:1002F00000D82DE904B04CE20200A0E3453500EB44
:100300000000A0E3703500EB020CA0E3183600EB10
:100310008000A0E3B33500EB1C00E0E39D3500EB6B
:100320006000E0E3A53500EBC000A0E31910A0E3F6
:100330000320A0E34B3500EB0100A0E3623500EBA6
:100340000000A0E3333500EB00A81BE90DC0A0E1DD
:1003500010D82DE904B04CE220D04DE22C404BE205
:100360006930A0E300308DE50400A0E114109FE5A2
:100370000020A0E30C30A0E35D5F00EB0400A0E1EF
:10038000652500EB10A81BE95CC401000DC0A0E1CD
:1003900010D82DE904B04CE208D04DE28C109FE556
:1003A0000A30D1E5000053E30000A00310A81B09A8
:1003B0007C009FE5002090E5003091E5030052E1CC
:1003C0000A00000AB020D1E1B020C0E10230D1E53E
:1003D0000230C0E50330D1E50330C0E50130A0E3D1
:1003E0000A30C0E54C309FE50020A0E3B020C3E117
:1003F00038109FE5B020D1E10230D1E50310D1E5FE
:1004000000108DE52C409FE5B010D4E104108DE57F
:1004100024009FE524109FE5355F00EBB030D4E168
:10042000013083E2B030C4E10C009FE510A81BE965
:10043000E0080004E8030004C6030004C803000445
:1004400074C401000DC0A0E100D82DE904B04CE255
:1004500000329FE5003093E5000053E30900001AE5
:100460001603A0E30B0A80E28010A0E30120A0E3C2
:100470001F3800EBE0019FE5E0119FE51C5F00EBFA
:100480000320A0E3490000EAD4319FE5003093E562
:10049000000053E30900001A1603A0E30B0A80E2F0
:1004A0008010A0E30120A0E3113800EBA8019FE534
:1004B000B0119FE50E5F00EB0420A0E33B0000EAD3
:1004C000A4319FE50330D3E5030053E30D00000A98
:1004D0001603A0E30B0A80E28010A0E30120A0E352
:1004E000033800EB70019FE580119FE5005F00EB92
:1004F0000130A0E378219FE5003082E574219FE57B
:100500000030C2E54B0000EA6C319FE50330D3E5D3
:10051000020053E30900000A3C019FE55C119FE5DE
:10052000F35E00EB1603A0E30B0A80E28010A0E369
:100530000120A0E3EE3700EB0220A0E31B0000EA5D
:100540003C319FE5003093E5000053E30900001AB9
:100550001603A0E30B0A80E28010A0E30120A0E3D1
:10056000E33700EBF0009FE518119FE5E05E00EB3C
:100570000520A0E30D0000EA0C319FE50020D3E543
:100580000130D3E5A333B0E10E00000A1603A0E367
:100590000B0A80E28010A0E30120A0E3D43700EB37
:1005A000B4009FE5E4109FE5D15E00EB0620A0E3D8
:1005B000BC309FE5002083E50120A0E3B4309FE537
:1005C0000020C3E51B0000EAC4309FE50830D3E5F6
:1005D000630053E30B00008A1603A0E30B0A80E2DA
:1005E0008010A0E30120A0E3C13700EB68009FE585
:1005F000A0109FE5BE5E00EB0720A0E370309FE5F2
:10060000002083E50B0000EA4C009FE588109FE581
:10061000B75E00EB0020A0E354309FE5002083E5A7
:1006200050309FE50020C3E51603A0E30B0A80E2EB
:100630008010A0E3AE3700EB0020A0E314309FE56C
:10064000002083E538309FE5002083E510309FE5EA
:10065000002083E500A81BE90804000468080004E2
:1006600094C401001C040004ACC4010090090004FF
:10067000C8C40100C0030004C5030004300A00041C
:10068000DCC40100B4040004F4C40100080A00043E
:100690000CC50100A808000420C5010030C50100F8
:1006A0000DC0A0E170D82DE904B04CE264D04DE259
:1006B0000050A0E30CFFFFEB7C004BE2B62600EB02
:1006C0002000A0E30110A0E3DC3400EB2000A0E355
:1006D0000510A0E1EF3400EB633900EBF50000EB0F
:1006E000740600EBF01C00EBE82000EB40039FE5F4
:1006F000892400EBDC2500EB622000EB4F0E00EBC1
:10070000940700EB440B00EB602A00EBDC0F00EBDE
:100710000500A0E3AA0600EB18339FE5000083E57F
:10072000FA00A0E3A60600EB0C339FE5000083E58A
:10073000BB0EA0E3080080E2A10600EBFC329FE5BF
:10074000000083E5E8029FE5732400EBF0029FE5DB
:10075000712400EBFCFEFFEBFC0A00EBE4329FE5AA
:100760000330D3E5030053E30600000AD8029FE5F7
:10077000692400EB1603A0E30B0A80E28010A0E3DB
:100780000120A0E35A3700EBE80D00EBBC329FE5F7
:100790000330D3E5020053E30600000AB0029FE5F0
:1007A0005D2400EB1603A0E30B0A80E28010A0E3B7
:1007B0000120A0E34E3700EB98029FE5562400EBA2
:1007C00094329FE50030D3E5000053E32C23001B57
:1007D0006D2400EBC50700EBE82100EB7C329FE5C0
:1007E000003093E5050053E31F00000A44329FE503
:1007F000000093E5780600EBFF0010E31A00000A02
:100800005C329FE5000093E5730600EBFF0010E308
:100810000400000A4C029FE53F2400EBB50B00EBFF
:10082000FD0A00EB100000EA3C029FE53C129FE548
:10083000C32700EB38329FE50020D3E5FF2002E21A
:1008400028329FE50030D3E5FF3003E2030052E198
:100850000400A0130300A003340D00EB1900A0E373
:10086000570600EBCC319FE5000083E5CC319FE5D6
:10087000000093E5580600EBFF0010E30B00000AB0
:10088000F0319FE5003093E5000053E35D2B000B52
:10089000EBFEFFEBFA0FA0E3490600EB9C319FE56E
:1008A000000083E50120A0E3CC319FE50020C3E5F3
:1008B00084419FE5000094E5470600EBFF0010E34C
:1008C000BEFFFF0A7D0FA0E33D0600EB000084E5BC
:1008D000A8319FE50A30D3E5020013E34800000A7F
:1008E000030055E305F19F97B4FFFFEAFC08000001
:1008F000FC08000070090000D4090000A2FEFFEB14
:100900000040A0E1000050E3ACFFFF0ACE1500EB71
:10091000FF0010E3F8FFFF1A000054E3A7FFFF0AEF
:100920000400A0E17C104BE2232600EBFF0010E363
:100930000600000A0250A0E344019FE5F62300EB05
:100940000400A0E1F42300EB38019FE59AFFFFEAE1
:100950000350A0E330019FE5EF2300EB0400A0E18A
:10096000ED2300EB1C019FE5EB2300EB1F0000EAE9
:1009700018019FE52F30D0E53020D0E5023483E127
:100980003120D0E5023883E13220D0E5023C93E10A
:100990008AFFFF0A1030D0E5010013E387FFFF0A4A
:1009A0001240D0E5030054E384FFFF1A7C604BE261
:1009B0000610A0E1122700EBFF0010E37FFFFF1AF3
:1009C000CC009FE5D42300EB0600A0E1152600EB48
:1009D000150000EA2A0F00EBFF1010E20350A013ED
:1009E0004E0DA013080080120100001A0150A0E172
:1009F0000A00A0E3F20500EB3C309FE5000083E530
:100A00006EFFFFEA020055E36CFFFF1A7C004BE229
:100A1000042600EBFF0010E30300000A74009FE5CA
:100A2000BD2300EB0150A0E364FFFFEA0350A0E305
:100A300062FFFFEA48C5010020080004A008000486
:100A40006008000478C501009009000490C5010009
:100A5000300A0004B0C50100CCC501002305000424
:100A6000680000041804000400C6010040090004E6
:100A7000E8090004400A0004080400041805000402
:100A8000A808000420C601009CCF010038C6010060
:100A9000B804000454C6010070C601000231A0E38E
:100AA000C339A0E1FF20A0E3302083E53F33A0E37A
:100AB000302083E50EF0A0E10231A0E3C339A0E1CC
:100AC0000C209FE5342083E53F33A0E3342083E509
:100AD0000EF0A0E19C0A00000EF0B0E104C02DE58C
:100AE0000DC0A0E10FD82DE904B04CE204009FE551
:100AF000892300EBFEFFFFEA88C6010004C02DE554
:100B00000DC0A0E10FD82DE904B04CE204009FE530
:100B1000812300EBFEFFFFEA98C6010004F05EE2CD
:100B200004C02DE50DC0A0E10FD82DE904B04CE2C2
:100B300004009FE5782300EBFEFFFFEAACC601004E
:100B40000231A0E3C339A0E1FF20A0E3302083E518
:100B50000EF0A0E10231A0E3C339A0E1FF20A0E341
:100B6000302083E50EF0A0E10231A0E3C339A0E11B
:100B7000FF20A0E3302083E50EF0A0E10231A0E3E6
:100B8000C339A0E1FF20A0E3302083E50EF0A0E10F
:100B90000231A0E3C339A0E1FF20A0E3302083E5C8
:100BA0000EF0A0E10231A0E3C339A0E1FF20A0E3F1
:100BB000302083E50EF0A0E10231A0E3C339A0E1CB
:100BC000FF20A0E3302083E50EF0A0E10DC0A0E1FE
:100BD00000D82DE904B04CE2454700EB0231A0E318
:100BE000C339A0E1FF20A0E3302083E500A81BE982
:100BF0000DC0A0E100D82DE904B04CE2B31900EB20
:100C00000231A0E3C339A0E1FF20A0E3302083E557
:100C100000A81BE90231A0E3C339A0E1FF20A0E353
:100C2000302083E50EF0A0E10231A0E3C339A0E15A
:100C3000FF20A0E3302083E50EF0A0E10231A0E325
:100C4000C339A0E1FF20A0E3302083E50EF0A0E14E
:100C50000231A0E3C339A0E1FF20A0E3302083E507
:100C60000EF0A0E10231A0E3C339A0E1FF20A0E330
:100C7000302083E50EF0A0E10231A0E3C339A0E10A
:100C8000FF20A0E3302083E50EF0A0E10EF0A0E10C
:100C90000EF0A0E10EF0A0E10EF0A0E10EF0A0E158
:100CA0000EF0A0E10DC0A0E100D82DE904B04CE2A7
:100CB0001B00A0E30010A0E35A3800EB020BA0E3F6
:100CC000513E00EB000050E30700000A28309FE58A
:100CD0006420A0E3B020C3E1690E00EB0200A0E3B2
:100CE000453E00EB020BA0E3523E00EB1B00A0E3ED
:100CF0000110A0E34B3800EB00A81BE940080004FA
:100D00000EF0A0E10EF0A0E10EF0A0E10EF0A0E1E7
:100D10000030A0E318109FE52020A0E30320C1E7E6
:100D2000013083E2FF3003E24F0053E30EF0A08175
:100D3000F9FFFFEA000000040DC0A0E170D82DE922
:100D400004B04CE204D04DE2F03A9FE50030D3E528
:100D5000010013E30800000AE42A9FE50030D2E511
:100D6000000053E3013043120030C215D43A9F050E
:100D70000020D305C83A9F050020C305BC3A9FE573
:100D80000030D3E5020013E30A00000AB01A9FE521
:100D90000030D1E5AC2A9FE50020D2E5020053E106
:100DA0000030A0030030C105942A9F150030D215F1
:100DB000013083120030C215803A9FE50030D3E540
:100DC000033003E2030053E30020A003703A9F05C1
:100DD0000020C305CDFFFFEB641A9FE50020D1E59D
:100DE000603A9FE50030D3E5030052E10030C18551
:100DF0004C3A9FE50010D3E5090051E31120A09380
:100E0000443A9F950020C3951020A083383A9F85CF
:100E10000020C385283A9F850010D3852C0A9FE5C2
:100E2000170300EB183A9FE50030D3E50C0053E3BD
:100E300003F19F97760200EA6C0E0000FC0E0000A2
:100E40000C1100009812000054130000B8130000A9
:100E5000DC140000241500006C15000004160000CE
:100E600078160000F816000064170000D8599FE5B6
:100E70000040A0E30040C5E5D4099FE5000300EB76
:100E80001430A0E30030C5E5C8099FE50410A0E1D7
:100E90000C20A0E36930A0E3F90200EBB8399FE52C
:100EA000001093E5040051E10400000A1F30A0E3A4
:100EB0000030C5E5A4099FE5F10200EB040000EA5B
:100EC0001F20A0E380399FE50020C3E590099FE53E
:100ED000EB0200EB70499FE52830A0E30030C4E549
:100EE00080099FE580199FE5E50200EB3C30A0E317
:100EF0000030C4E574099FE5470100EA70199FE5D9
:100F00002F20D1E53030D1E5032482E13130D1E525
:100F1000032882E13230D1E5033C92E10F00001A50
:100F200024499FE50030C4E548099FE5D40200EB61
:100F30001430A0E30030C4E53C099FE5D00200EB8B
:100F40002830A0E30030C4E530099FE5CC0200EB77
:100F50003C30A0E30030C4E524099FE52E0100EAFF
:100F60000C399FE51230D3E5020053E30D00000A6F
:100F7000020000CA000053E30300000A170000EA61
:100F8000030053E30E00000A140000EA0020A0E36F
:100F9000B4389FE50020C3E5D4389FE51110D3E5B0
:100FA000E0089FE5130000EA0020A0E398389FE5E1
:100FB0000020C3E5B8389FE51110D3E5C8089FE5C8
:100FC0000C0000EA0020A0E37C389FE50020C3E588
:100FD0009C389FE51110D3E5B0089FE5050000EAB5
:100FE0000020A0E360389FE50020C3E580389FE53E
:100FF0001110D3E598089FE5A10200EB70489FE52A
:101000000020D4E50130D4E5032482E10230D4E5A8
:10101000032882E10330D4E5032C82E174689FE564
:101020009602C1E0C23FA0E1411B63E0813261E072
:10103000033363E0833181E0033183E083C342E023
:1010400000005CE300C06CB2FC579FE51430A0E3E5
:101050000030C5E540089FE50C20A0E1880200EBC8
:101060000420D4E50530D4E5032482E10630D4E53C
:10107000032882E10730D4E5032C82E19632C1E0F7
:10108000C23FA0E1411B63E0813261E0033363E0D2
:10109000833181E0033183E083C342E000005CE3FD
:1010A00000C06CB22830A0E30030C5E5EC079FE536
:1010B0000C20A0E1720200EB0820D4E50930D4E551
:1010C000032482E10A30D4E5032882E10B30D4E521
:1010D000032C82E1C8379FE59302C1E0C23FA0E143
:1010E000411363E0813261E0033181E083C142E07A
:1010F00000005CE300C06CB23C30A0E30030C5E50A
:10110000A0079FE50C20A0E1930100EA60179FE58E
:101110002F20D1E53030D1E5032482E13130D1E513
:10112000032882E13230D1E5033C92E10F00001A3E
:1011300014479FE50030C4E538079FE5500200EBF7
:101140001430A0E30030C4E55C079FE54C0200EBDF
:101150002830A0E30030C4E550079FE5480200EBCB
:101160003C30A0E30030C4E544079FE5AA0000EA54
:10117000FC369FE51230D3E5020053E30D00000A70
:10118000020000CA000053E30300000A170000EA4F
:10119000030053E30E00000A140000EA0020A0E35D
:1011A000A4369FE50020C3E5C4369FE51110D3E5C2
:1011B000D0069FE5130000EA0020A0E388369FE5F3
:1011C0000020C3E5A8369FE51110D3E5B8069FE5DA
:1011D0000C0000EA0020A0E36C369FE50020C3E588
:1011E0008C369FE51110D3E5A0069FE5050000EAC7
:1011F0000020A0E350369FE50020C3E570369FE550
:101200001110D3E588069FE51D0200EB38569FE5D7
:101210001430A0E30030C5E554469FE51710D4E52F
:101220001830D4E5031481E11930D4E5031881E1C5
:101230001A30D4E5031C81E178069FE5100200EB2B
:101240002830A0E30030C5E51B10D4E51C30D4E500
:10125000031481E11D30D4E5031881E11E30D4E58B
:10126000031C81E150069FE5050200EB3C30A0E342
:101270000030C5E51F10D4E52030D4E5031481E12A
:101280002130D4E5031881E12230D4E5031C81E14B
:1012900028069FE55C0100EAAC459FE50030A0E32D
:1012A0000030C4E518069FE5F50100EB14369FE514
:1012B0000A30D3E5000053E30E00001A0030C4E505
:1012C000FC059FE5EE0100EB1430A0E30030C4E51F
:1012D000F4059FE5EA0100EB2830A0E30030C4E507
:1012E000E8059FE5E60100EB3C30A0E30030C4E5F3
:1012F000D4059FE5480000EA4C559FE51430A0E373
:101300000030C5E5C0059FE5DD0100EB2830A0E316
:101310000030C5E5AC459FE50210D4E50320D4E5D7
:10132000B030D4E1A8059FE5D50100EB3C30A0E347
:101330000030C5E50410D4E50520D4E50630D4E539
:10134000B800D4E100008DE588059FE5CC0100EBF5
:10135000360100EAF0549FE50030A0E30030C5E517
:1013600074459FE50910D4E570059FE5C40100EBC5
:101370001430A0E30030C5E50A10D4E50B20D4E515
:101380005C059FE5BE0100EB2830A0E30030C5E519
:101390000C10D4E50D20D4E548059FE5B80100EB1D
:1013A0003C30A0E30030C5E50E10D4E50F20D4E5B5
:1013B00034059FE5E80000EA8C449FE50030A0E397
:1013C0000030C4E524059FE5AD0100EB20159FE545
:1013D0000C30D1E50D20D1E5023483E10E20D1E5BA
:1013E000023883E10F20D1E5023C93E10C00001AA2
:1013F0001430A0E30030C4E5F8049FE5A00100EB41
:101400002830A0E30030C4E5EC049FE59C0100EB2C
:101410003C30A0E30030C4E5D8049FE5980100EB20
:10142000020100EAC8449FE50020D4E50130D4E57C
:10143000032482E10230D4E5032882E10330D4E5BD
:10144000032C82E14C649FE59632C1E0C23FA0E1EB
:10145000411B63E0813261E0033363E0833181E06B
:10146000033183E083C342E000005CE300C06CB260
:10147000D4539FE51430A0E30030C5E57C049FE51C
:101480000C20A0E17E0100EB0420D4E50530D4E57A
:10149000032482E10630D4E5032882E10730D4E555
:1014A000032C82E19602C1E0C23FA0E1411B63E050
:1014B000813261E0033363E0833181E0033183E013
:1014C00083C342E000005CE300C06CB22830A0E3BC
:1014D0000030C5E528049FE5F4FEFFEA68539FE568
:1014E0000030A0E30030C5E518049FE5640100EB7F
:1014F0001430A0E30030C5E50C449FE5D010D4E1E2
:10150000D120D4E104049FE55D0100EB2830A0E385
:101510000030C5E5D310D4E1D220D4E1F0039FE53B
:101520008D0000EA20539FE50030A0E30030C5E5C0
:10153000E0039FE5520100EB1430A0E30030C5E565
:10154000C4439FE50410D4E50520D4E5C8039FE516
:101550004B0100EB2830A0E30030C5E50610D4E5D0
:101560000720D4E5B4039FE57B0000EAD8529FE54D
:101570000030A0E30030C5E5A4439FE50110D4E5A9
:101580000230D4E5031481E10118A0E14118A0E183
:1015900090039FE53A0100EB1430A0E30030C5E56D
:1015A0000310D4E50430D4E5031481E10118A0E16F
:1015B0004118A0E170039FE5310100EB2830A0E362
:1015C0000030C5E50510D4E50630D4E5031481E10B
:1015D0000118A0E14118A0E150039FE5280100EBAC
:1015E0003C30A0E30030C5E50710D4E50830D4E571
:1015F000031481E10118A0E14118A0E130039FE547
:10160000810000EA40529FE50030A0E30030C5E5CC
:101610000C439FE50B10D4E50C30D4E5031481E1B5
:101620000118A0E14118A0E108039FE5140100EBB7
:101630001430A0E30030C5E50D10D4E50E30D4E53C
:10164000031481E10118A0E14118A0E1E8029FE53F
:101650000B0100EB2830A0E30030C5E50F10D4E506
:101660001030D4E5031481E10118A0E14118A0E194
:10167000C8029FE5640000EACC519FE50030A0E37A
:101680000030C5E580429FE50810D4E5B0029FE533
:10169000FB0000EB1430A0E30030C5E50910D4E5F1
:1016A000A0029FE5F60000EB2830A0E30030C5E57E
:1016B00094329FE50010D3E50130D3E5031481E1B6
:1016C0000118A0E14118A0E180029FE5EC0000EBC9
:1016D0003C30A0E30030C5E544329FE50910D3E576
:1016E0000A30D3E5031481E10118A0E14118A0E11B
:1016F0005C029FE5440000EA4C519FE50030A0E306
:101700000030C5E5D0419FE50110D4E50220D4E5C5
:1017100040029FE5DA0000EB1430A0E30030C5E59D
:101720000310D4E50420D4E52C029FE5D40000EB9F
:101730002830A0E30030C5E50510D4E50620D4E547
:1017400018029FE5CE0000EB3C30A0E30030C5E579
:101750000710D4E50820D4E504029FE5C80000EB9B
:10176000320000EA0200A0E3700900EBD8509FE5C8
:101770000030A0E30030C5E5E8319FE50010D3E577
:10178000FF1001E20120D3E5FF2002E20230D3E5A1
:10179000FF3003E2613083E2CC019FE5B80000EB4B
:1017A0001430A0E30030C5E5C0419FE50010D4E54A
:1017B0000130D4E5031481E10118A0E14118A0E152
:1017C000AC019FE5AE0000EB2830A0E30030C5E59A
:1017D0000210D4E50330D4E5031481E10118A0E13F
:1017E0004118A0E18C019FE5A50000EB3C30A0E38F
:1017F0000030C5E50410D4E50530D4E5031481E1DB
:101800000118A0E14118A0E16C019FE59C0000EBEC
:10181000060000EA28109FE50030D1E5013043E2E0
:1018200020209FE50030C2E50030A0E30030C1E594
:101830000020A0E304309FE50020C3E570A81BE969
:10184000F6030004F503000450000004F403000450
:10185000C0C60100C8C60100DCC60100C003000408
:10186000E8C6010040C50100F0C601006808000498
:10187000F4C60100B804000408C7010014C7010041
:101880002CC7010044C701005CC7010070C70100FC
:1018900084C7010098C701006BCA5F6BACC7010029
:1018A000C0C70100D34D6210D4C70100E8C70100D2
:1018B00000C8010018C8010030C8010044C8010078
:1018C00058C801006CC80100E00800047CC8010091
:1018D00094C80100ACC80100C4C801002808000475
:1018E000E0C80100F0C8010004C9010018C90100E6
:1018F0002CC90100500500043CC9010054C9010075
:101900006CC9010080C9010094C90100A808000445
:10191000A0C90100B0C90100C0C90100CCC90100C3
:10192000E0C9010070090004F4C9010004CA010003
:1019300014CA010024CA010034CA010044CA0100CB
:1019400054CA010064CA010078CA0100080A0004F0
:101950008CCA0100A0CA0100B4CA0100C8CA0100B3
:10196000DCCA0100F0CA0100300A000404CB010007
:10197000280A000414CB010020CB01002CCB01006D
:101980001C109FE50030D1E5012083E20020C1E575
:10199000FF3003E20C209FE50300C2E70100A0E353
:1019A0000EF0A0E1F4030004000000040DC0A0E16B
:1019B00030D82DE904B04CE20050A0E10140A0E194
:1019C000000051E330A81B090100D5E4EBFFFFEB59
:1019D000014054E230A81B09FAFFFFEA0DC0A0E164
:1019E00030D82DE904B04CE20050A0E10140A0E164
:1019F000000051E330A81B090100D5E4DFFFFFEB35
:101A0000014054E230A81B09FAFFFFEA0DC0A0E133
:101A100010D82DE904B04CE2FF4000E2043CA0E104
:101A2000000053E310A81BD92000A0E3D3FFFFEB75
:101A3000013044E2FF4003E2043CA0E1000053E334
:101A400010A81BD9F7FFFFEA0DC0A0E110D82DE9BF
:101A500004B04CE2FF4000E2043CA0E1000053E38C
:101A600010A81BD93000A0E3C4FFFFEB013044E213
:101A7000FF4003E2043CA0E1000053E310A81BD99F
:101A8000F7FFFFEA0DC0A0E10F002DE9F0DF2DE91F
:101A900014B04CE248D04DE20080A0E308708BE225
:101AA00004509BE50500A0E10040D5E5000054E3AB
:101AB0000600000A250054E30400000A0140F5E591
:101AC000000054E30100000A250054E3FAFFFF1A66
:101AD000001055E0C0FFFF1B000054E35E01000A48
:101AE000015085E20060A0E364600BE506A0A0E180
:101AF000FF90A0E329604BE50140D5E4750054E375
:101B00000200000A203084E3780053E30B00001A3F
:101B1000010016E30730A0110470871200809315AE
:101B20000600001A0730A0E1047087E2000093E588
:101B3000040016E30038A0112388A0110080A00142
:101B4000200054E30300001A29305BE5000053E352
:101B5000E8FFFF1A140000EA230054E3086086033C
:101B6000E4FFFF0A2D0054E32A0054130C00001A6E
:101B70002A0054E30700001A0730A0E1047087E24E
:101B800000A0D3E5D030D3E1000053E3D9FFFFAA92
:101B900000306AE2FFA003E2103086E3DF6003E278
:101BA000D4FFFFEA2B0054E30100001A29404BE563
:101BB000D0FFFFEA2E0054E31A00001A0140D5E4DA
:101BC0002A0054E30700001A0730A0E1047087E2FE
:101BD000001093E50030E0E3030051E10130A0A1E3
:101BE000FF9003E2C3FFFFEA0010A0E3303044E2BD
:101BF000090053E30600008A013181E0833084E06C
:101C0000301043E20140D5E4303044E2090053E3B0
:101C1000F8FFFF9A0030E0E3030051E10130A0A19A
:101C2000FF9003E2B4FFFFEA300054E30200001A21
:101C3000100016E320608603AEFFFFEA313044E275
:101C4000080053E30900008A0010A0E3013181E09D
:101C5000833084E0301043E20140D5E4303044E288
:101C6000090053E3FFA00182A3FFFF8AF6FFFFEA0A
:101C7000680054E3046086039EFFFF0A6C0054E38F
:101C8000016086039BFFFF0A630054E30800001A0B
:101C900054104BE25C100BE50730A0E1047087E2C2
:101CA0000030D3E554304BE50120A0E36C200BE578
:101CB000AC0000EA640054E3440054130100000A3D
:101CC000690054E31400001A440054E301608603E1
:101CD000010016E30730A0110470871200809315ED
:101CE0000600001A0730A0E1047087E2000093E5C7
:101CF000040016E30038A0114388A0110080A00161
:101D0000000058E3008068B22D30A0B329304BB5F5
:101D10000A30A0E360300BE5580000EA6F0054E39E
:101D20004F0054130400001A4F0054E3016086036F
:101D30000810A0E360100BE54E0000EA700054E3C9
:101D40000700001A0730A0E1047087E2008093E5E5
:101D50001020A0E360200BE5406086E37840A0E31C
:101D6000440000EA730054E32E00001A0730A0E19B
:101D7000047087E2003093E55C300BE50320A0E1BE
:101D8000000053E30D00001A54304BE25C300BE5C9
:101D90002830A0E354304BE56E30A0E353304BE5E0
:101DA0007530A0E352304BE56C30A0E351304BE589
:101DB00050304BE52930A0E34F304BE54E204BE54A
:101DC000093CA0E1433CB0E170300BE51000004A53
:101DD0005C001BE50010A0E30320A0E1CD5800EB60
:101DE000000050E30700000A5C101BE5003061E0D2
:101DF000FF3003E26C300BE5033CA0E170201BE5F3
:101E0000430C52E1570000AAFF9009E26C900BE5E9
:101E1000540000EA5C001BE5D25800EBFF0000E232
:101E20006C000BE54F0000EA750054E355005413B5
:101E30000400001A550054E3016086030A30A0E351
:101E400060300BE50B0000EA780054E358005413AF
:101E50003D00001A1010A0E360100BE5A631A0E1D0
:101E6000013003E2000058E30030A0030130031208
:101E7000000053E3406086130030A0E329304BE5B7
:101E800064900BE5800019E3DF6006022C204BE232
:101E90005C200BE5000059E3000058032300000A12
:101EA00060301BE5030058E10090A0330190A023AF
:101EB0000800A0E10310A0E1984E00EBFF0000E253
:101EC000090050E330308092FF0003920300009A33
:101ED000573080E2FF0003E2580054E3DF000302C2
:101EE0005C101BE5010061E55C100BE50800A0E15A
:101EF00060101BE5374E00EB0080A0E1000059E3C5
:101F0000E6FFFF1A60201BE5080052E30700001AF5
:101F1000080016E30500000A5C101BE50030D1E55F
:101F2000300053E33030A013013061155C100B1505
:101F300028204BE25C101BE5023061E0043043E2F4
:101F4000FF3003E26C300BE5080000EA000054E3C8
:101F50004100000A54204BE25C200BE554404BE565
:101F60000130A0E36C300BE50030A0E329304BE5F5
:101F70006C101BE5FF9001E264201BE5023061E07C
:101F8000FF3003E2800013E30030A01368300BE55C
:101F900029305BE5000053E3013089120200001A8A
:101FA000400016E30100000A023089E2FF9003E2DC
:101FB00068101BE5013089E0FF9003E2300016E372
:101FC0000A006900000CA001400CA0018EFEFF0B6E
:101FD00029305BE5000053E329004B120110A013E8
:101FE0000600001A400016E30500000A3030A0E3A6
:101FF00058304BE557404BE558004BE20210A0E348
:1020000069FEFFEB303006E2200053E30A0069006E
:10201000000CA001400CA0018AFEFF0B68201BE50C
:10202000020CA0E1400CA0E186FEFFEB6C301BE54A
:10203000031CA0E1411CA0E15C001BE55AFEFFEB84
:10204000100016E396FEFF0A0A0069E0000CA0E10A
:10205000400CA0E16CFEFFEB91FEFFEAF0AF1BE944
:102060000DC0A0E100D82DE904B04CE21603A0E3B6
:10207000030A80E20119A0E32B3600EB1623A0E34C
:10208000032A82E2B830D2E1C83083E2B830C2E13C
:102090001C209FE5003092E5013083E2003082E5AC
:1020A0000231A0E3C339A0E1FF20A0E3302083E5A3
:1020B00000A81BE9C00800040DC0A0E110D82DE95C
:1020C00004B04CE220D04DE2E0009FE5121E00EB90
:1020D0000100A0E30010A0E14D2E00EB30404BE2E8
:1020E0000400A0E10B3500EB4010A0E3B0134BE17E
:1020F0000230A0E3BE324BE10110E0E3BA124BE143
:10210000742F00EB803260E0033180E08331A0E186
:102110002333A0E198209FE5921383E02333A0E1CD
:1021200020304BE51603A0E3030A80E20410A0E18F
:10213000093500EB1603A0E3030A80E20119A0E3CE
:102140000120A0E3013600EB1603A0E3030A80E2BE
:102150000010A0E3C53500EB0500A0E30010A0E3EC
:102160000020A0E1DA3300EB0500A0E30110A0E3BA
:102170002C3300EB3C309FE50010A0E3B010C3E12E
:102180000210C3E50310C3E50410C3E50510C3E561
:102190000610C3E5B810C3E10A10C3E518309FE587
:1021A000001083E514009FE5DB1D00EB10A81BE980
:1021B00038CB0100632D3E05E0080004C008000490
:1021C00048CB01000C309FE5003093E5030080E030
:1021D000010040E20EF0A0E1C008000414309FE5C9
:1021E000003093E5000063E0000050E31000A0B36E
:1021F0000000A0A30EF0A0E1C00800040DC0A0E103
:1022000000D82DE904B04CE2EDFFFFEB14309FE560
:10221000000083E5F0FFFFEBFF0000E2000050E369
:1022200000A81B19FCFFFFEAF80300040DC0A0E1A1
:10223000F0DF2DE904B04CE21703A0E3070A80E2C7
:102240000210A0E38E3600EB1773A0E3074A87E283
:10225000C8629FE50050A0E3230000EAC0029FE5AA
:102260000030D0E51B0053E31000008A0030D0E5B9
:10227000FF3003E20330D6E7FF3003E2B830C4E1B9
:10228000A0329FE5001093E50030D0E5FF3003E277
:102290000020D1E50330D6E7032082E00020C1E52D
:1022A0000030D0E5013083E20030C0E50E0000EAE6
:1022B0006C329FE50050C3E56C129FE51950C1E5F3
:1022C00068329FE50020D3E50B00D1E50B20C1E586
:1022D0000120D3E50C00D1E50C20C1E5B050C3E1ED
:1022E0004C029FE51A20A0E3965700EB070A87E20D
:1022F0002110A0E3493600EB010050E317A3A0131F
:1023000007AA8A122C929F157D00001AD2FFFFEABD
:10231000B830DAE1FF8003E21773A0E3074A87E2EF
:10232000F8619FE50050A0E3230000EAF0019FE57B
:102330000030D0E51B0053E31000008A0030D0E5E8
:10234000FF3003E20330D6E7FF3003E2B830C4E1E8
:10235000D0319FE5001093E50030D0E5FF3003E277
:102360000020D1E50330D6E7032082E00020C1E55C
:102370000030D0E5013083E20030C0E50E0000EA15
:102380009C319FE50050C3E59C119FE51950C1E5C4
:1023900098319FE50020D3E50B00D1E50B20C1E586
:1023A0000120D3E50C00D1E50C20C1E5B050C3E11C
:1023B0007C019FE51A20A0E3625700EB070A87E241
:1023C0002110A0E3153600EB010050E3D6FFFF0A11
:1023D000003099E5010053E30C00000A0200003AC6
:1023E000020053E31100000A430000EA0020A0E3CA
:1023F00044319FE50020C3E540119FE50080C1E521
:10240000AA0058E30130A0033C00000A3C0000EAA7
:10241000830058E33800001A20219FE50030D2E500
:10242000833083E20030C2E50230A0E3330000EAEB
:102430000CC19FE500119FE50030D1E5012083E24A
:102440000020C1E5FF3003E20380CCE70030D1E596
:102450001D0053E3E4209F950030D295033088900F
:102460000030C2952600009AD0109FE50030D1E5DB
:10247000080053E11700001AC8409FE50030D4E57A
:10248000000053E30500001ABC009FE50C10A0E11A
:102490001E20A0E32B5700EB0130A0E30030C4E581
:1024A000A8209FE5003092E5013083E2003082E50C
:1024B0009C209FE51C30D2E51D20D2E5023483E14B
:1024C000013083E288109FE51C30C1E52334A0E190
:1024D0001D30C1E5080000EA74209FE51A30D2E5FE
:1024E0001B20D2E5023483E1013083E260109FE5D6
:1024F0001A30C1E52334A0E11B30C1E50030A0E370
:10250000003089E51703A0E3070A80E22210A0E368
:10251000C23500EB010050E3F0AF1B197BFFFFEA6F
:1025200050090004FC030004000400042009000416
:1025300040080004520900041004000404040004CC
:102540000E040004000900040504000470090004DE
:1025500008040004B81300040DC0A0E1F0D82DE970
:1025600004B04CE218D04DE268019FE5EA1C00EB94
:102570000108A0E30110A0E3252D00EB010CA0E36E
:102580000110A0E3222D00EB1603A0E3020980E274
:10259000CE2E00EB34004BE2C22F00EB0150A0E343
:1025A00034404BE20060A0E30160C4E54F30E0E35B
:1025B00034304BE50260C4E50350C4E50670A0E189
:1025C000B460C4E11603A0E3020980E20410A0E1B4
:1025D000622F00EB0400A0E1B22F00EB0150C4E534
:1025E0004030A0E334304BE50260C4E50350C4E55D
:1025F0000230A0E3B430C4E11603A0E3020980E294
:102600000410A0E1552F00EB1703A0E3070A80E2B6
:10261000E73400EB2C404BE20400A0E13F3500EB37
:102620003030E0E3BC324BE10430A0E3BA324BE19E
:102630000830E0E3B2324BE18030E0E3B6324BE108
:102640004030E0E3B8324BE120604BE51703A0E3F4
:10265000070A80E20410A0E1EC3400EB1703A0E3CA
:10266000070A80E20E10A0E30520A0E1423500EB4E
:1026700064009FE564109FE50A20A0E3122000EBB0
:102680001703A0E3070A80E20510A0E1333500EB51
:102690004C209FE57E30E0E30030C2E55530A0E3FA
:1026A0000130C2E51B2082E238309FE5002083E53F
:1026B0001500A0E30610A0E10520A0E1843200EBA4
:1026C0001500A0E30510A0E1D63100EB18009FE54E
:1026D000911C00EBF0A81BE950CB0100400900045D
:1026E00098090004500900040004000460CB0100B4
:1026F0000DC0A0E100D82DE904B04CE2F83B9FE505
:102700000030D3E5000053E300A81B091500A0E347
:102710000010A0E3C33100EBE01B9FE5E02B9FE539
:102720000030D2E50120D2E5023483E10338A0E194
:102730002328A0E1FF2002E20700D1E50720C1E540
:10274000233CA0E10820D1E50830C1E5B40B9FE5AA
:102750000030D0E50120D0E5023483E10338A0E168
:102760002328A0E1FF2002E201C0D1E50120C1E55C
:10277000233CA0E10220D1E50230C1E50230D0E5E2
:102780000320D0E5023483E10338A0E12328A0E14F
:10279000FF2002E203C0D1E50320C1E5233CA0E114
:1027A0000420D1E50430C1E50430D0E50520D0E5B2
:1027B000023483E10338A0E12328A0E1FF2002E2F4
:1027C0000500D1E50520C1E5233CA0E10620D1E5C7
:1027D0000630C1E5300B9FE50030D0E5012083E2F3
:1027E0000020C0E5FF3003E2202B9FE50330D2E755
:1027F0000030C1E50030D0E5040053E30030A08391
:102800000030C085F43A9FE50030D3E5660053E31D
:102810002E00000A020000CA650053E30D00000A02
:10282000740000EA670053E37200001ACC2A9FE5A7
:10283000DC3A9FE50030D3E50D30C2E5D43A9FE5A0
:102840000030D3E50E30C2E5CC3A9FE50030D3E549
:102850000F30C2E5670000EAA01A9FE5BC0A9FE5B9
:102860000020D0E50130D0E5032482E10230D0E53C
:10287000032882E10330D0E5032C82E1FF3002E23D
:102880000DC0D1E50D30C1E52234A0E1FF3003E2F7
:102890000EC0D1E50E30C1E52238A0E1FF3003E2E1
:1028A0000FC0D1E50F30C1E5222CA0E11030D1E5F9
:1028B0001020C1E50420D0E50530D0E5032482E1F5
:1028C0000630D0E5032882E10730D0E5270000EA92
:1028D0004C3A9FE500C093E500005CE33300000A3A
:1028E0000C30DCE50D20DCE5023483E10E20DCE574
:1028F000023883E10F20DCE5023C93E12B00000A63
:10290000F8199FE50020DCE50130DCE5032482E1D5
:102910000230DCE5032882E10330DCE5032C82E1B0
:10292000FF3002E20D00D1E50D30C1E52234A0E117
:10293000FF3003E20E00D1E50E30C1E52238A0E100
:10294000FF3003E20F00D1E50F30C1E5222CA0E1FA
:102950001030D1E51020C1E50420DCE50530DCE5D0
:10296000032482E10630DCE5032882E10730DCE560
:10297000032C82E1FF3002E21100D1E51130C1E504
:102980002234A0E1FF3003E21200D1E51230C1E5AC
:102990002238A0E1FF3003E21300D1E51330C1E596
:1029A000222CA0E11430D1E51420C1E5110000EA89
:1029B00048399FE50D20D3E50020A0E30D20C3E5B5
:1029C0000E10D3E50E20C3E50F10D3E50F20C3E5AD
:1029D0001010D3E51020C3E51110D3E51120C3E595
:1029E0001210D3E51220C3E51310D3E51320C3E57D
:1029F0001410D3E51420C3E51500A0E30110A0E3F3
:102A0000083100EB1C399FE50030D3E50A3043E282
:102A1000040053E303F19F97000200EA302A00000C
:102A200054310000A8310000CC2A0000F831000029
:102A3000F4189FE5EC289FE51130D2E50130C1E59F
:102A40001230D2E50230C1E51330D2E50330C1E5E2
:102A50001430D2E50430C1E51530D2E50530C1E5CA
:102A60001630D2E50630C1E51730D2E50730C1E5B2
:102A70001830D2E50830C1E5B0189FE50030D1E547
:102A8000000053E30020A013A4389F150A20C315AB
:102A90000020C11598189FE588089FE50A30D1E508
:102AA0001920D0E5023083E10A30C1E51A30D0E5C3
:102AB0000930C1E570289FE51B30D0E51430C2E530
:102AC0001C30D0E50030C2E5D40100EA54289FE56F
:102AD0001130D2E5FA0053E348389F951120D39581
:102AE0001600009A1130D2E5FB0053E340389F05F1
:102AF0000420D3051100000A28389FE51130D3E5E2
:102B0000FC0053E328389F050520D3050B00000A7D
:102B100010389FE51130D3E5FD0053E310389F05D1
:102B20000620D3050500000AF8379FE51130D3E5EC
:102B3000FE0053E3F8379F050720D3050100001A74
:102B4000E4379FE50920C3E5DC279FE50930D2E59E
:102B5000000053E30400000ACC279FE50930D2E5CA
:102B6000FF0053E30100001A0030E0E30930C2E542
:102B7000B0279FE51230D2E5FA0053E3A4379F95C2
:102B80001220D3951600009A1230D2E5FB0053E3D1
:102B90009C379F050420D3051100000A84379FE568
:102BA0001230D3E5FC0053E384379F050520D3059D
:102BB0000B00000A6C379FE51230D3E5FD0053E3AC
:102BC0006C379F050620D3050500000A54379FE5A2
:102BD0001230D3E5FE0053E354379F050720D30599
:102BE0000100001A40379FE50A20C3E538279FE51A
:102BF0000A30D2E5000053E30400000A28279FE5CD
:102C00000A30D2E5FF0053E30100001A0030E0E390
:102C10000A30C2E50C279FE51330D2E5FA0053E3F2
:102C200000379F951320D3951600009A1330D2E5F4
:102C3000FB0053E3F8369F050420D3051100000A7A
:102C4000E0369FE51330D3E5FC0053E3E0369F0503
:102C50000520D3050B00000AC8369FE51330D3E5E5
:102C6000FD0053E3C8369F050620D3050500000A82
:102C7000B0369FE51330D3E5FE0053E3B0369F0531
:102C80000720D3050100001A9C369FE50B20C3E501
:102C900094269FE50B30D2E5000053E30400000AC0
:102CA00084269FE50B30D2E5FF0053E30100001AB4
:102CB0000030E0E30B30C2E568269FE51430D2E532
:102CC000FA0053E35C369F951420D3951600009AC2
:102CD0001430D2E5FB0053E354369F050420D3059E
:102CE0001100000A3C369FE51430D3E5FC0053E3A5
:102CF0003C369F050520D3050B00000A24369FE5CE
:102D00001430D3E5FD0053E324369F050620D30598
:102D10000500000A0C369FE51430D3E5FE0053E3AE
:102D20000C369F050720D3050100001AF8359FE5F2
:102D30000C20C3E5F0259FE50C30D2E5000053E3FD
:102D40000400000AE0259FE50C30D2E5FF0053E3C4
:102D50000100001A0030E0E30C30C2E5C4259FE515
:102D60001530D2E5FA0053E3B8359F951520D39579
:102D70001600009A1530D2E5FB0053E3B0359F05ED
:102D80000420D3051100000A98359FE51530D3E5DE
:102D9000FC0053E398359F050520D3050B00000A7E
:102DA00080359FE51530D3E5FD0053E380359F0561
:102DB0000620D3050500000A68359FE51530D3E5E8
:102DC000FE0053E368359F050720D3050100001A74
:102DD00054359FE50D20C3E54C259FE50D30D2E528
:102DE000000053E30400000A3C259FE50D30D2E5C6
:102DF000FF0053E30100001A0030E0E30D30C2E5AC
:102E000020259FE51630D2E5FA0053E314359F954F
:102E10001620D3951600009A1630D2E5FB0053E336
:102E20000C359F050420D3051100000AF4349FE5FA
:102E30001630D3E5FC0053E3F4349F050520D30599
:102E40000B00000ADC349FE51630D3E5FD0053E3A8
:102E5000DC349F050620D3050500000AC4349FE535
:102E60001630D3E5FE0053E3C4349F050720D30595
:102E70000100001AB0349FE50E20C3E5A8249FE5A9
:102E80000E30D2E5000053E30400000A98249FE5C9
:102E90000E30D2E5FF0053E30100001A0030E0E3FA
:102EA0000E30C2E580149FE578249FE51730D2E507
:102EB0000F30C1E51830D2E51030C1E51930D2E548
:102EC000FA0053E35C349F951920D3951700009ABC
:102ED0001930D2E5FB0053E354349F050430D30589
:102EE0001130C1051300000A38349FE51930D3E5CD
:102EF000FC0053E338349F050520D3050B00000A7E
:102F000020349FE51930D3E5FD0053E320349F05BD
:102F10000620D3050500000A08349FE51930D3E5E3
:102F2000FE0053E308349F050720D3050100001A73
:102F3000F4339FE51120C3E5EC239FE51130D2E582
:102F40000A0053E30A30A0930400009AD8239FE5B7
:102F50001130D2E5FF0053E30100001A0030E0E336
:102F60001130C2E5BC239FE51A30D2E5FA0053E3E5
:102F7000B0339F951A20D3951600009A1A30D2E5E7
:102F8000FB0053E3A8339F050420D3051100000A7A
:102F900090339FE51A30D3E5FC0053E390339F054F
:102FA0000520D3050B00000A78339FE51A30D3E5DE
:102FB000FD0053E378339F050620D3050500000A82
:102FC00060339FE51A30D3E5FE0053E360339F057D
:102FD0000720D3050100001A4C339FE51220C3E5FA
:102FE00044239FE51230D2E5000053E30400000AB9
:102FF00034239FE51230D2E5FF0053E30100001AAD
:103000000030E0E31230C2E518239FE51B30D2E523
:10301000FA0053E30C339F951B20D3951600009ABA
:103020001B30D2E5FB0053E304339F050420D30596
:103030001100000AEC329FE51B30D3E5FC0053E39E
:10304000EC329F050520D3050B00000AD4329FE522
:103050001B30D3E5FD0053E3D4329F050620D30592
:103060000500000ABC329FE51B30D3E5FE0053E3A8
:10307000BC329F050720D3050100001AA8329FE546
:103080001320C3E5A0229FE51330D2E5000053E3EF
:103090000400000A90229FE51330D2E5FF0053E3BD
:1030A0000100001A0030E0E31330C2E574229FE50E
:1030B0001C30D2E5FA0053E368329F951C20D3956B
:1030C0001600009A1C30D2E5FB0053E360329F05E6
:1030D0000420D3051100000A48329FE51C30D3E5D7
:1030E000FC0053E348329F050520D3050B00000A7E
:1030F00030329FE51C30D3E5FD0053E330329F05AD
:103100000620D3050500000A18329FE51C30D3E5E0
:10311000FE0053E318329F050720D3050100001A73
:1031200004329FE51520C3E5FC219FE51530D2E56B
:10313000000053E30400000AEC219FE51530D2E5BE
:10314000FF0053E33500001A0030E0E31530C2E51C
:10315000320000EAD8119FE5C8219FE51130D2E581
:103160000330C1E51230D2E50230C1E51330D2E5BB
:103170000130C1E51430D2E50030C1E51530D2E5AB
:103180000430C1E51630D2E50530C1E51730D2E58F
:103190000630C1E51830D2E50730C1E51930D2E577
:1031A0000830C1E51D0000EA88119FE574019FE524
:1031B0000020D1E51130D0E5030052E10400000AFF
:1031C0001130D0E50030C1E50010D1E568019FE580
:1031D000481D00EB64119FE548219FE51330D2E5BF
:1031E0001420D2E5023483E13B30C1E52334A0E171
:1031F0003C30C1E5090000EA44119FE524219FE528
:103200001130D2E50030C1E51230D2E50130C1E520
:103210001330D2E50230C1E51430D2E50330C1E508
:10322000F82000EB0120A0E300319FE50020C3E57A
:103230000020A0E3C0309FE50020C3E504019FE526
:10324000E0109FE50130D1E50220D1E5023483E1B1
:103250000230C0E52334A0E10330C0E50330D1E5FE
:103260000420D1E5023483E10430C0E52334A0E139
:103270000530C0E50530D1E50620D1E5023483E113
:103280000338A0E14338A0E1033263E08330A0E1DA
:10329000B4C09FE59CE3C2E0C33FA0E1C23263E05B
:1032A0000630C0E52334A0E10730C0E50730D1E5A2
:1032B0000820D1E5023483E10338A0E14338A0E1DE
:1032C000033263E08330A0E19CE3C2E0C33FA0E1AE
:1032D000C23263E00830C0E52334A0E10930C0E524
:1032E0000930D1E50A20D1E5023483E13430C0E56C
:1032F0002334A0E13530C0E500A81BE90504000433
:1033000020090004080A0004401700040C0400040B
:1033100060000004540000045C0000045800000435
:10332000B8040004600500047009000428080004C3
:10333000C4030004A80800040D04000440090004AC
:103340000012000490090004B8130004F712DA4BCD
:103350000DC0A0E130D82DE904B04CE218D04DE208
:10336000A4209FE50030E0E30030C2E50130C2E573
:103370000230C2E50330C2E57D0EA0E390FBFFEB17
:103380000008A0E14048A0E17C509FE5D7FCFFEB9E
:103390000030D5E5FF0053E30400001A0408A0E163
:1033A0002008A0E18CFBFFEBFF0010E3F6FFFF0A13
:1033B00054509FE500C0D5E5FF005CE34C009F053D
:1033C0000F00000A28404BE20130D5E50220D5E588
:1033D000612082E200208DE50400A0E130109FE52D
:1033E0000C20A0E1425300EB0400A0E14A1900EBDD
:1033F0000320D5E50400A0E118109FE53C5300EB45
:103400000400A0E1441900EB30A81BE99009000476
:1034100064CB010090CB0100A8CB01000DC0A0E15E
:1034200070D82DE904B04CE210D04DE298029FE52F
:10343000391900EB0108A0E30110A0E3742900EBA7
:103440000108A0E30010A0E3872900EB20004BE275
:10345000142C00EB0140A0E320104BE20140C1E539
:103460000C30A0E320304BE50240C1E50030A0E382
:103470000330C1E5B440C1E11603A0E3020980E2D4
:10348000B62B00EB1603A0E3020980E20410A0E3D0
:103490000420A0E1162C00EB0400A0E148FBFFEBA8
:1034A0000040A0E10400A0E14BFBFFEBFF0010E3B4
:1034B000FBFFFF0A1603A0E3020980E20810A0E365
:1034C0000020A0E30A2C00EB0050A0E30100A0E3E1
:1034D0003BFBFFEB0040A0E10400A0E13EFBFFEB63
:1034E000FF0010E3FBFFFF0A1603A0E3020980E2DE
:1034F0000410A0E30020A0E3FD2B00EB0100A0E3FB
:103500002FFBFFEB0040A0E10400A0E132FBFFEB4A
:10351000FF0010E3FBFFFF0A1603A0E3020980E2AD
:103520000410A0E30120A0E3F12B00EB013085E2C1
:10353000FF5003E2090055E3E3FFFF9A0100A0E317
:103540001FFBFFEB0040A0E10400A0E122FBFFEB2A
:10355000FF0010E3FBFFFF0A1603A0E3020980E26D
:103560000810A0E30120A0E3E12B00EB20004BE2D8
:10357000CC2B00EB0160A0E320104BE20160C1E521
:103580000C30A0E320304BE50260C1E50360C1E5EB
:103590000230A0E3B430C1E11603A0E3020980E2E7
:1035A0006E2B00EB8000A0E30610A0E1182900EBD1
:1035B0008000A0E30610A0E12B2900EB8000A0E32F
:1035C0000010A0E3282900EB1703A0E30D0A80E216
:1035D000AF3100EB28004BE2403200EB28104BE209
:1035E0001030E0E30630C1E50430A0E30730C1E568
:1035F0004E3CA0E3203083E228300BE50050A0E3EE
:103600000540A0E1B450C1E11703A0E30D0A80E238
:10361000B83100EBB4309FE5005083E5B0309FE552
:103620000050C3E5AC309FE50050C3E5A8309FE5EE
:10363000005083E5A4309FE50050C3E5A0309FE52E
:103640000050C3E51703A0E30D0A80E20610A0E1D5
:103650002C3200EB1703A0E30D0A80E20610A0E174
:10366000473200EB1400A0E30510A0E10520A0E123
:10367000972E00EB1400A0E30610A0E1E92D00EB6B
:10368000FA0FA0E3CEFAFFEB58309FE5000083E588
:1036900054309FE50020D3E50020E0E30020C3E59F
:1036A0000110D3E50120C3E51703A0E30D0A80E272
:1036B0000610A0E1243200EB30309FE5006083E586
:1036C0002C009FE5941800EB70A81BE9B8CB010013
:1036D000E009000415040004380A0004C0090004CD
:1036E00014040004200A000418040004080A00045A
:1036F0006800000460CB01000DC0A0E130D82DE9C6
:1037000004B04CE208D04DE210019FE5821800EBB6
:103710001703A0E30D0A80E20010A0E3033200EBE0
:103720001703A0E30D0A80E20110A0E3063200EBCC
:103730001400A0E30010A0E3BA2D00EB1703A0E3F0
:103740000D0A80E20010A0E30D3200EB1703A0E3A6
:103750000D0A80E20010A0E3EA3100EB1703A0E3BA
:103760000D0A80E24A3100EB8000A0E30010A0E3E4
:10377000A72800EB0108A0E30110A0E3A42800EBB8
:103780001C004BE2472B00EB1C104BE20040A0E377
:103790000140C1E50C30A0E31C304BE50240C1E51F
:1037A0000340C1E50450A0E1B440C1E11603A0E329
:1037B000020980E2E92A00EB64309FE5004083E5DE
:1037C00060309FE50040C3E55C309FE50040C3E505
:1037D00058309FE5004083E554309FE50040C3E545
:1037E00050309FE50040C3E50520A0E348309FE549
:1037F000002083E544309FE5004083E540309FE5AD
:103800000020D3E50020E0E30020C3E50110D3E56C
:103810000120C3E52C009FE53F1800EB30A81BE911
:10382000C8CB0100E009000415040004380A0004B4
:10383000C009000414040004200A00046800000405
:1038400018040004080A000460CB01000DC0A0E1C8
:1038500070D82DE904B04CE21703A0E30D0A80E212
:10386000303200EB0008A0E14038A0E12008A0E1E0
:10387000120C10E31753A0130D4A85120600001A0C
:103880000B0000EA0400A0E10110A0E3AE3100EB60
:103890000400A0E10010A0E3AB3100EB0D0A85E2CB
:1038A0000810A0E3C93100EB000050E3F4FFFF1A59
:1038B000350000EA0338A0E12308A0E19A0050E3B4
:1038C000B400000A020000CA930050E370A81B195C
:1038D000060000EABA0050E36000000A823DA0E35F
:1038E000123083E2030050E170A81B192F0000EA98
:1038F0001603A0E30B0A80E24010A0E30120A0E33E
:10390000FB2A00EBEC339FE50030D3E5FF3013E2F8
:103910000220A0030A00000A010053E31600001A67
:10392000D4339FE5003093E5000053E34300000AE1
:10393000C8339FE50030D3E5000053E33F00000AA1
:103940000420A0E3B8339FE5002083E51703A0E33C
:103950000D0A80E20110A0E3823100EB94339FE571
:103960000020D3E5FF2002E21703A0E30D0A80E266
:103970005010A0E3DE3100EB70A81BE91703A0E3B1
:103980000D0A80E20110A0E36F3100EB0120A0E3FB
:103990006C339FE5002083E51603A0E30B0A80E269
:1039A0004010A0E30020A0E3D12A00EB70A81BE99F
:1039B0001703A0E30D0A80E20110A0E3513100EBF0
:1039C0000030A0E33C239FE50030C2E530339FE5A3
:1039D000003093E5020053E30500000A040053E3BE
:1039E0000020A00320339F050020C30570A81B09F9
:1039F000120000EA14439FE50010D4E5FF1001E235
:103A00001703A0E30D0A80E2C03100EBF4129FE53A
:103A10000030D1E50020D4E5023083E00030C1E57C
:103A20000020A0E3E8329FE50020C3E57D0FA0E37E
:103A3000E3F9FFEBDC329FE5000083E570A81BE9AA
:103A40001703A0E30D0A80E20110A0E33E3100EB72
:103A50000120A0E3A8329FE5002083E570A81BE9C0
:103A6000AC429FE50020D4E5FF2002E2A8329FE5AA
:103A70000030D3E5FF3003E2030052E11800002AD2
:103A800098529FE5002095E5000052E30F00000AE0
:103A90000030D4E5FF3003E20310D2E7FF1001E26B
:103AA0001703A0E30D0A80E2983100EB54029FE572
:103AB0000020D4E5FF2002E2001095E50030D0E5BB
:103AC0000220D1E7023083E00030C0E52C0000EA9C
:103AD0001703A0E30D0A80E20010A0E38B3100EB96
:103AE000270000EA1C329FE50010D3E51703A0E38E
:103AF0000D0A80E2853100EBFC319FE5003093E553
:103B0000000053E30A00000AF0319FE50030D3E5DE
:103B1000000053E30600000A0110A0E3D4319FE542
:103B20000010C3E51703A0E30D0A80E2FF3000EBAD
:103B3000130000EA1703A0E30D0A80E20110A0E3DE
:103B4000013100EB0120A0E3B4319FE5002083E5C3
:103B50001603A0E30B0A80E24010A0E30020A0E3DC
:103B6000632A00EBB8119FE52030D1E52120D1E593
:103B7000023483E1013083E22030C1E52334A0E147
:103B80002130C1E588219FE50030D2E5013083E294
:103B90000030C2E570A81BE96C619FE50030D6E5F6
:103BA00058219FE50020D2E5020053E10E00002AD3
:103BB00070519FE50040D6E5FF4004E21703A0E303
:103BC0000D0A80E2543100EB0400C5E734119FE593
:103BD0000030D6E5FF3003E20020D1E50330D5E721
:103BE000032082E00020C1E5340000EA0C419FE59B
:103BF00014319FE50020D3E50030D4E5030052E105
:103C00002E00001A1703A0E30D0A80E20110A0E3C2
:103C1000CD3000EB1703A0E30D0A80E23E3100EB4C
:103C2000E0309FE50030D3E5FF0000E2000053E103
:103C30001200001AC0309FE5000093E5000050E339
:103C40000020D415DC109F153E51001BD0109FE5BD
:103C50002030D1E52120D1E5023483E1013083E237
:103C60002030C1E52334A0E12130C1E5B8209FE533
:103C7000003092E5013083E2003082E5070000EA7F
:103C80009C309FE51E20D3E51F10D3E5012482E17F
:103C9000012082E21E20C3E52224A0E11F20C3E50B
:103CA0000120A0E358309FE5002083E51603A0E340
:103CB0000B0A80E24010A0E30020A0E30C2A00EBF6
:103CC00044209FE50030D2E5013083E20030C2E5B8
:103CD0000020D2E524309FE50030D3E5030052E117
:103CE00070A81B191703A0E30D0A80E20010A0E3DF
:103CF0009C3000EB70A81BE9F8090004C00900041F
:103D0000200A0004680000042004000414040004D5
:103D1000F00900041504000418040004380A000423
:103D2000E0090004B8130004100A00041C04000495
:103D30000DC0A0E110D82DE904B04CE2FF4000E234
:103D4000AC319FE5003093E5010053E310A81B1947
:103D50001703A0E30D0A80E20010A0E3883000EB17
:103D600090319FE50040C3E5013044E2030053E396
:103D700003F19F97450000EA883D0000CC3D00001C
:103D8000EC3D00009C3D00006C219FE56C319FE5FF
:103D9000002083E50420A0E30F0000EA60219FE5F6
:103DA00058319FE5002083E50310A0E354319FE5DF
:103DB0000010C3E550219FE550319FE5002083E5C9
:103DC0004C319FE50010C3E5390000EA44219FE52E
:103DD00028319FE5002083E50620A0E324319FE5FC
:103DE0000020C3E50020A0E32D0000EA28019FE5A4
:103DF00028119FE50030D1E50120D1E5023483E1AF
:103E00003630C0E52334A0E13730C0E5EC309FE523
:103E1000001083E50220A0E3E8309FE50020C3E521
:103E2000FC109FE5FC009FE50330D0E50420D0E5C1
:103E3000023483E10338A0E12328A0E1FF2002E25D
:103E400002C0D1E50220C1E5233CA0E10320D1E579
:103E50000330C1E50130D0E50220D0E5023483E132
:103E60000338A0E12328A0E1FF2002E20000D1E511
:103E70000020C1E5233CA0E10120D1E50130C1E5EE
:103E800088309FE5001083E50420A0E3060000EAE7
:103E90000020A0E364309FE5002083E564309FE5C7
:103EA0000020C3E564309FE5002083E560309FE596
:103EB0000020C3E51703A0E30D0A80E20110A0E390
:103EC0002F3000EB0020A0E35C309FE50020C3E52D
:103ED0001703A0E30D0A80E21010A0E3983000EB76
:103EE0001703A0E30D0A80E20110A0E30F3000EBFE
:103EF00010A81BE968000004F0090004300A00045F
:103F0000C0090004400A0004200A0004E809000473
:103F1000E0090004380A0004280A0004B813000469
:103F2000080A0004000A000470090004F8090004EB
:103F30000DC0A0E170D82DE904B04CE218D04DE2DC
:103F40000A60A0E3E0309FE50020E0E30020C3E545
:103F50000120C3E50220C3E50320C3E50030D3E51B
:103F6000FF0053E31500001AC0409FE5B8509FE5DD
:103F70000100A0E36DFFFFEB7D0FA0E390F8FFEBE6
:103F8000000084E5020000EA0030D5E5FF0053E3BD
:103F90000300001A000094E58FF8FFEBFF0010E328
:103FA000F8FFFF0A013046E2FF6003E20030D5E58A
:103FB000FF0053E30100001A000056E3EBFFFF1A75
:103FC00064509FE50030D5E5FF0053E360009F0596
:103FD0001300000A2C404BE20020D5E5FF2002E24E
:103FE0000130D5E5FF3003E20210D5E5FF1001E214
:103FF000611081E200108DE50400A0E134109FE51E
:104000003B5000EB0400A0E1431600EB0320D5E594
:10401000FF2002E20400A0E11C109FE5345000EBF9
:104020000400A0E13C1600EB70A81BE9300A000474
:1040300018040004DCCB010004CC0100A8CB010073
:104040000DC0A0E170D82DE904B04CE208D04DE2DB
:10405000B0009FE5301600EB030BE0E3F32600EB26
:10406000020CA0E30110A0E3742600EB020CA0E315
:104070000010A0E3872600EB010BA0E30110A0E3F2
:104080006E2600EB0109A0E30110A0E3602600EB1F
:104090000109A0E30010A0E3732600EB20004BE22F
:1040A000002900EB0140A0E320104BE20140C1E5F4
:1040B0000260A0E320604BE50050A0E30250C1E5A0
:1040C0000340C1E5B440C1E11603A0E3060A80E263
:1040D000A22800EBF70D00EB170D00EB0900A0E3A1
:1040E0000510A0E10620A0E1F92B00EB0900A0E3F8
:1040F0000410A0E14B2B00EB3F3A00EB08009FE5DA
:10410000051600EB70A81BE918CC010060CB01007C
:104110000DC0A0E100D82DE904B04CE2010050E34D
:104120001603A003060A80020210A0030020A003C9
:104130001603A013060A80120210A0130120A01378
:10414000EB2800EB00A81BE90DC0A0E110D82DE979
:1041500004B04CE20040A0E30410A0E10430A0E170
:10416000012084E2FF4002E20330D0E7000053E385
:10417000F9FFFF1A023BA0E303E0A0E1463283E22D
:10418000003093E5303003E2200053E30D00000AD5
:10419000EACCA0E360C08CE20120A0E1013081E222
:1041A0000338A0E14318A0E10228A0E122085CE165
:1041B00010A81B3946328EE2003093E5303003E21E
:1041C000200053E3F3FFFF1A013084E2FF4003E2D3
:1041D000021CA0E30420A0E11E3A00EB0100A0E3D2
:1041E0000410A0E1B53200EB0100A0E3B63100EB12
:1041F00010A81BE90DC0A0E100D82DE904B04CE2E5
:1042000004D04DE20D004BE50010A0E3023BA0E31B
:1042100003C0A0E1463283E2003093E5303003E290
:10422000200053E30D00000AEA0CA0E3600080E2E6
:104230000120A0E1013081E20338A0E14318A0E1B0
:104240000228A0E1220850E100A81B3946328CE286
:10425000003093E5303003E2200053E3F3FFFF1A10
:104260000D004BE2021CA0E30220A0E3F93900EBB1
:104270000100A0E30210A0E3903200EB0100A0E3F4
:10428000913100EB00A81BE90DC0A0E1F0DF2DE9A2
:1042900004B04CE200A0A0E10118A0E1011881E205
:1042A0004138A0E1211BA0E10050A0E3010071E32F
:1042B000F0AF1B09026BA0E3466286E20398A0E11F
:1042C000293BA0E10378A0E1018083E2003096E57C
:1042D000303003E2200053E3FBFFFF1A270855E1CB
:1042E0000600002A05038AE0021CA0E34020A0E3A8
:1042F000D83900EB0100A0E34010A0E3070000EA7A
:1043000005038AE03F4809E22448A0E1021CA0E33B
:104310000420A0E1CF3900EB0100A0E30410A0E1EC
:10432000663200EB0100A0E3673100EB013085E26B
:10433000FF5003E2080055E1F0AF1BA9E2FFFFEADE
:104340000020A0E3020050E10200000A0A30D0E59C
:10435000020053E10100001A0200A0E10EF0A0E10A
:10436000B030D0E17B3E43E20C3043E2832C82E16B
:104370000230D0E50F3003E2832A82E10330D0E53A
:104380001F3003E2032882E10430D0E51F3003E24E
:10439000832582E10530D0E53F3003E2832282E1CC
:1043A0000630D0E5A330A0E11F3003E2030082E134
:1043B0000EF0A0E104E02DE50000A0E30010A0E174
:1043C00038E09FE5013281E0033181E083218EE016
:1043D00002C0A0E12432FCE5000053E30200A0018A
:1043E0000130A0030030CC0504F09D04013081E2CF
:1043F000FF1003E2020051E304F09D84F0FFFFEAA6
:10440000800A0004000050E30EF0A0010F0000EA53
:104410000030A0E3892FA0E30230C0E70C3081E731
:10442000043080E50830C0E5BA30C0E10C30C0E5AA
:10443000103080E5143080E5203280E5183080E5CA
:10444000BC31C0E11E30C0E50100A0E30EF0A0E1E8
:104450000020A0E32CC09FE5023282E0033182E01D
:104460008311A0E10C3081E0000053E1E7FFFF0A77
:10447000013082E2FF2003E2020052E30000A08349
:104480000EF0A081F3FFFFEA800A000410402DE93E
:104490000040A0E3D030D0E12F0053E30420A0116E
:1044A0000120A003040054E10700001AD23090E17B
:1044B0002F0053E30000531302408000013082E2DA
:1044C000FF2003E2000054E3F7FFFF0A0030A0E3FF
:1044D0000B30C1E503C0A0E12020A0E30C20C1E720
:1044E00001308CE2FFC003E20A005CE3FAFFFF9AAE
:1044F0000020A0E302C0A0E1D030D0E12F0053E3C0
:104500000120A003023080E0040053E11800002ADB
:104510000A005CE30700008AD23090E12E0053E3EA
:104520000600001A08005CE301308292FF2003922B
:1045300008C0A0930B00009A0000A0E31080BDE823
:1045400002E0D0E761304EE2190053E320304E9292
:104550000230D0870C30C1E7013082E2FF2003E255
:1045600001308CE2FFC003E2023080E0040053E13E
:10457000E6FFFF3A0400A0E11080BDE80008A0E1DA
:104580004008A0E138309FE50030D3E5000053E358
:104590000300A0010EF0A0010038A0E1010853E3E0
:1045A0000200A0930038A0E12338A0E1023043E2EA
:1045B0000C209FE50110D2E5102092E5912320E028
:1045C0000EF0A0E1600A00040DC0A0E100D82DE9C2
:1045D00004B04CE20020A0E12C309FE50000D3E5C0
:1045E000000050E300A81B091C309FE5100093E574
:1045F000020060E00110D3E5764400EB020080E2A7
:104600000008A0E12008A0E100A81BE9600A00045E
:104610000DC0A0E170D82DE904B04CE20060A0E329
:104620000640A0E150509FE5043284E0033184E06D
:10463000830185E0893F80E20030D3E5010053E348
:104640000300001A2E0500EB000086E00008A0E140
:104650004068A0E1013084E2FF4003E2020054E33D
:10466000F0FFFF9ADE0800EB0030A0E30C209FE58E
:104670000030C2E5FF0006E270A81BE9800A0004D2
:10468000600A00040DC0A0E130D82DE904B04CE26E
:104690000040A0E360029FE59F1400EB5C329FE5C1
:1046A0000040C3E50400A0E154129FE50420A0E10E
:1046B000003280E0033180E0833181E0893F83E292
:1046C0000020C3E5013080E2FF0003E2020050E376
:1046D000F6FFFF9A28529FE57A0700EB000050E3AF
:1046E0000300000A1C029FE58B1400EB0140A0E3CD
:1046F000790000EA1F1085E20000A0E33E0900EB0C
:10470000000050E30300000AFC019FE5821400EB67
:104710000240A0E3700000EA1FC085E2073DA0E36D
:10472000023083E20330DCE7060053E30400531356
:104730000200000A0E0053E30040A0131500001A07
:10474000713FA0E3023083E20310DCE7713FA0E396
:10475000033083E20330DCE7031481E1723FA0E31E
:104760000320DCE7021881E1013083E20330DCE75B
:10477000034C81E11F1085E20400A0E11E0900EB5B
:10478000000050E30300000A80019FE5621400EB83
:104790000340A0E3500000EA1FC085E20B30DCE5D7
:1047A0000C20DCE5023483E1020C53E30300000A31
:1047B0005C019FE5581400EB0440A0E3460000EACA
:1047C00038119FE50D30DCE50130C1E51030DCE546
:1047D0000230C1E51130DCE51220DCE5023483E172
:1047E000B430C1E11630DCE51720DCE5023483E1AA
:1047F000B630C1E10E30DCE50F20DCE5023483E1A8
:10480000033084E0083081E5B600D1E10220D1E533
:10481000923023E00C3081E5B420D1E1223283E0F4
:10482000103081E52030DCE52120DCE5023483E135
:104830002220DCE5023883E12320DCE5023C93E121
:104840000300001ACC009FE5331400EB0540A0E301
:10485000210000EAA4109FE52030DCE52120DCE502
:10486000023483E12220DCE5023883E12320DCE509
:10487000023C83E1102091E5023083E0013043E205
:10488000143081E5D633DCE1460053E30F00001A13
:10489000D733DCE1410053E30C00001AD833DCE1EC
:1048A000540053E30900001AD933DCE1310053E32B
:1048B0000600001ADA33DCE1360053E30120A003DE
:1048C00038309F050020C3050040A0030200000A05
:1048D00044009FE5101400EB0640A0E3000054E301
:1048E0000100000A49FFFFEB010000EA2C009FE5F0
:1048F000091400EB0400A0E130A81BE928CC01005A
:10490000600A0004800A00043CCC010060CC010075
:1049100078CC010090CC0100B0CC0100CCCC0100DF
:1049200060CB01000DC0A0E170D82DE904B04CE2CD
:104930000050A0E10160A0E38C309FE50030D3E59A
:10494000000050E3000053130000A00370A81B09EF
:104950000040A0E30410A0E17F2FA0E3032082E247
:10496000053084E01C3083E20310C3E5014084E29B
:10497000020054E1F9FFFF9A0040A0E348309FE5B0
:104980000130D3E5030054E10D00002A040095E551
:10499000000084E0200285E51F1085E2300800EB6E
:1049A000000050E30100000A18FFFFEB0060A0E3E5
:1049B000014084E210309FE50130D3E5030054E16B
:1049C000F1FFFF3A0600A0E170A81BE9600A0004AD
:1049D0000DC0A0E170D82DE904B04CE20040A0E188
:1049E0000060A0E3C8309FE50030D3E5060050E149
:1049F000060053110600A00170A81B09B0509FE5E6
:104A0000103095E5040090E5000053E12500008A90
:104A1000143095E5030050E12200008AE9FEFFEB27
:104A20000068A0E1A627A0E1083095E5A20483E094
:104A30000150C2E3855BA0E1A55BA0E1203294E5D3
:104A4000000053E10700000A200284E51F1084E201
:104A5000690800EB000050E30200000AEBFEFFEBE8
:104A60002608A0E170A81BE9053084E01F20F3E5CB
:104A70000130D3E5032482E10228A0E14268A0E1ED
:104A8000090872E30060A0830600008A0608A0E11E
:104A90002008A0E1B8FEFFEB040084E50030A0E3AD
:104AA0000830C4E5BA30C4E10638A0E12308A0E12B
:104AB00070A81BE9600A00040DC0A0E1F0D92DE93F
:104AC00004B04CE20060A0E10080A0E3EC309FE580
:104AD0000030D3E5080050E1080053110800A001A0
:104AE000F0A91B09030000EAC8FEFFEB0838A0E1AB
:104AF0002308A0E1F0A91BE90070A0E3BC309FE50A
:104B0000080093E5000087E0200286E51F1086E29A
:104B1000390800EB000050E3F2FFFF1A1F5086E255
:104B20000040A0E30438A0E12318A0E18120D5E7EC
:104B3000810085E00130D0E5033492E10C00001AD9
:104B40000030E0E38130C5E70130C0E5200296E5A2
:104B50001F1086E2C20700EB000050E3E1FFFF1ADE
:104B60008734A0E1A33084E00338A0E14388A0E1CA
:104B7000014CA0E3013084E20338A0E14348A0E106
:104B8000FF0853E3E6FFFF9A017087E22C309FE5B0
:104B9000B620D3E10838B0E10030A0130130A00303
:104BA000020057E10030A02301300332000053E33C
:104BB0000838A0012308A001F0A91B09CEFFFFEAD5
:104BC000600A00040DC0A0E1F0D82DE904B04CE269
:104BD0000040A0E10228A0E14228A0E10050A0E3AB
:104BE00008319FE50030D3E5050050E10500531181
:104BF0000500A001F0A81B09010052E30600000A0D
:104C0000020000CA000052E30050A003010000EAC5
:104C1000020052E3105090050000000A145094E581
:104C2000015095E02C00004A103094E5030055E156
:104C3000290000CA003094E5043084E50030A0E388
:104C40000830C4E5BA30C4E1143084E5050053E10E
:104C50002100002A7F67A0E3036886E2143094E510
:104C6000013083E2143084E5BA30D4E1013083E2CC
:104C7000BA30C4E1BA30D4E1260853E11300009AF7
:104C80000030A0E30370A0E1BA30C4E10830D4E5FD
:104C9000013083E20830C4E50820D4E54C309FE5BC
:104CA0000130D3E5030052E10800003A0400A0E11E
:104CB00046FFFFEB0008B0E10870C4150830D405CA
:104CC000013043020830C405023CA003BA30C401DD
:104CD000143094E5050053E1DFFFFF3A143094E50A
:104CE000050053E10100A0130000A003F0A81BE998
:104CF000600A00040DC0A0E1F0D92DE904B04CE237
:104D000002DC4DE20008A0E14008A0E10070A0E351
:104D10000780A0E1DC309FE50030D3E5070053E1D8
:104D20000700A001F0A91B090038A0E1A307A0E13A
:104D3000C0309FE5083093E5A05483E00140C0E314
:104D4000844BA0E1A44BA0E1080055E10600000A55
:104D50000580A0E10500A0E1221E4BE2A60700EBC2
:104D6000000050E30000A013F0A91B19223E4BE203
:104D7000041083E00420D3E70130D1E5032482E16D
:104D80000228A0E1023842E2130873E30070A08316
:104D90000170A0930060A0E30060C1E50160C1E57F
:104DA000A207A0E14C309FE5083093E5A05483E0D2
:104DB0000140C0E3844BA0E1A44BA0E1013027E215
:104DC000080055E101308313060053E10500000A95
:104DD0000800A0E1221E4BE2210700EB060050E193
:104DE0000600A011F0A91B19000057E30100A00361
:104DF000F0A91B09D3FFFFEA600A00040DC0A0E17F
:104E000070D82DE904B04CE20040A0E10060A0E3BE
:104E1000E0309FE50030D3E5060050E10600531175
:104E20000600A00170A81B0922FFFFEB0008A0E10B
:104E30004068A0E1000050E32B00000A0400A0E15C
:104E40000010A0E30220A0E35DFFFFEB040094E567
:104E5000DCFDFFEB0008A0E1A007A0E194309FE596
:104E6000083093E5A02483E00150C0E3855BA0E116
:104E7000A55BA0E1203294E5020053E10500000AA1
:104E8000202284E51F1084E20200A0E15A0700EB13
:104E9000000050E30A00001A052084E00638A0E173
:104EA0002318A0E11F10E2E5233CA0E10130C2E598
:104EB0001F1084E2200294E5E90600EB000050E3B5
:104EC0000200000AD1FDFFEB0000A0E370A81BE97F
:104ED0000608A0E12008A0E1A7FDFFEB040084E59F
:104EE0000030A0E30830C4E5BA30C4E10638A0E1E0
:104EF0002308A0E170A81BE9600A00040DC0A0E12E
:104F0000F0DF2DE904B04CE210D04DE20090A0E1BA
:104F10000370A0E1FF1001E22C100BE5FF2002E27C
:104F200030200BE50010A0E338100BE50140A0E1B4
:104F3000C0329FE50030D3E5010057E10100531175
:104F40002C00000A010050E12A00000A0030A0E312
:104F5000003087E5183097E5000053E30600001A9B
:104F600090329FE5B420D3E14222A0E134200BE54A
:104F70000C3093E5003087E5140000EA74129FE5D9
:104F80000C3091E5182097E5020053E10500008AF6
:104F9000103091E5030052E1B430D1314332A031F9
:104FA00034300B350900003A48229FE5103092E575
:104FB000181097E5010053E10E00008A143092E5C5
:104FC000030051E10B00008A0120D2E534200BE5FB
:104FD000003097E5000053E31B00001A180097E526
:104FE000200287E51F1087E2030700EB000050E373
:104FF0000200000A85FDFFEB0400A0E1F0AF1BE911
:105000001F5087E2BC31D7E18332D5E7000053E37C
:10501000F8FFFF0AE50053E3F6FFFF0ABC31D7E1D2
:10502000833285E00B30D3E5100013E3F1FFFF0A74
:10503000BC31D7E1833285E01A00D3E51B30D3E5DC
:10504000030480E14CFDFFEB000087E5003097E5AD
:10505000043087E50030A0E30830C7E5BA30C7E187
:1050600000A0A0E3043097E503808AE0208287E572
:105070000800A0E11F1087E2DF0600EB000050E30C
:10508000DBFFFF1A1F5087E20060A0E30638A0E1B3
:105090000300A0E12338A0E18322D5E7000052E31A
:1050A0003300000AE50052E33100000A8322A0E148
:1050B000053082E00B30D3E530101BE5033001E012
:1050C0002C101BE5010053E12900001A0010A0E399
:1050D000D52092E1D13099E1030052E10900001A94
:1050E000A005A0E1013081E2FF1003E20A0051E3D4
:1050F0000400008A013080E0D52093E1D13099E1AD
:10510000030052E1F6FFFF0A090051E31800009A7C
:105110000648A0E1A44585E00B30D4E51E30C7E584
:105120001A00D4E51B30D4E5030480E112FDFFEB47
:10513000000087E5040087E50030A0E30830C7E5FC
:10514000BA30C7E1188087E5BC61C7E11C30D4E5FF
:105150001D20D4E5023483E11E20D4E5023883E12A
:105160001F20D4E5023C83E1103087E50140A0E335
:105170001060A0E3013086E20338A0E14368A0E1BB
:105180000F0853E3C0FFFF9A01A08AE2013024E236
:1051900034201BE502005AE10030A0230130033225
:1051A000000053E3AEFFFF1A000054E30900001AA9
:1051B00040309FE5102093E5043097E5030052E16D
:1051C0000400008A0700A0E100FEFFEB0008A0E158
:1051D0004008A0E138000BE538301BE50338B0E1AA
:1051E0000030A0030130A0130430D3E10400A0017B
:1051F000F0AF1B0999FFFFEA600A00040DC0A0E1AF
:10520000F0DF2DE904B04CE228D04DE200A0A0E18F
:105210000260A0E1FF9001E20080A0E33C800BE58A
:1052200040800BE544800BE524349FE50030D3E556
:10523000080052E1080053112D00000A080050E157
:105240002B00000A0030A0E3003082E5181092E540
:10525000030051E10700001AF4339FE5B420D3E1C5
:105260004222A0E130200BE53C100BE50C3093E529
:10527000003086E5140000EAD4139FE50C3091E578
:10528000182092E5020053E10500008A103091E5F4
:10529000030052E1B430D1314332A03130300B350C
:1052A0000900003AA8239FE5103092E5181096E512
:1052B000010053E10E00008A143092E5030051E131
:1052C0000B00008A0120D2E530200BE5003096E586
:1052D000000053E31F00001A180096E5200286E53F
:1052E0001F1086E2440600EB000050E30200000AB3
:1052F000C6FCFFEB44001BE5F0AF1BE91F5086E244
:10530000BC31D6E18332D5E7000053E3F8FFFF0A52
:10531000E50053E3F6FFFF0ABC31D6E1833285E0B6
:105320000B30D3E5100013E3F1FFFF0ABC31D6E1E7
:10533000833285E01A00D3E51B30D3E5030480E116
:105340000008A0E14018A0E13C100BE52008A0E116
:1053500089FCFFEB000086E50600A0E1D5FDFFEB30
:105360000008A0E14028A0E138200BE5000050E350
:10537000B500000A003096E5043086E50030A0E371
:105380000830C6E50030A0E32C300BE5043096E58C
:105390002C101BE5033081E034300BE5203286E52C
:1053A0000300A0E11F1086E2130600EB000050E3AB
:1053B000CEFFFF1A1F5086E20080A0E338201BE5D5
:1053C0000238A0E12318A0E148100BE5FF2001E21C
:1053D0004C200BE50870A0E1233CA0E150300BE528
:1053E0000838A0E1A335D5E7000053E30100000A27
:1053F000E50053E37000001A0010A0E30838A0E1B4
:10540000A305A0E1013080E00120DAE70520C3E731
:10541000013081E2FF1003E20A0051E3F8FFFF9A36
:105420000848A0E1A44585E00B90C4E54C301BE59D
:105430001A30C4E550101BE51B10C4E514029FE5AB
:10544000BEFBFFEB1600C4E52034A0E11730C4E535
:105450002038A0E11830C4E5200CA0E11900C4E513
:105460001C70C4E51D70C4E51E70C4E51F70C4E562
:10547000200296E51F1086E2790500EB000050E35C
:105480009AFFFF1A48001BE53BFCFFEB000086E596
:10549000040086E50870C6E5BA70C6E11E90C6E550
:1054A000107086E534201BE5182086E5BC81C6E136
:1054B000100019E33D00000A0600A0E118FDFFEB13
:1054C000000096E5200286E51F1086E2CA0500EB83
:1054D000000050E385FFFF1A1F5086E22E30A0E344
:1054E0001F30C6E50110A0E32020A0E30120C5E79E
:1054F000013081E2FF1003E20A0051E3FAFFFF9A54
:105500001030A0E30B30C5E54C301BE51A30C5E583
:1055100050101BE51B10C5E51670C5E51770C5E5F5
:105520001870C5E51970C5E51C70C5E51D70C5E5A9
:105530001E70C5E51F70C5E52E30A0E32030C5E51F
:105540002130C5E50210A0E32020A0E3013085E072
:105550002020C3E5013081E2FF1003E20A0051E39D
:10556000F9FFFF9A1030A0E32B30C5E53C201BE586
:105570003A20C5E52234A0E13B30C5E53670C5E5EB
:105580003770C5E53870C5E53970C5E53C70C5E5CF
:105590003D70C5E53E70C5E53F70C5E5200296E566
:1055A0001F1086E22E0500EB000050E34FFFFF1AAC
:1055B0000130A0E344300BE51080A0E3013088E225
:1055C0000338A0E14388A0E10F0853E383FFFF9A6B
:1055D0002C101BE5011081E22C100BE544201BE58B
:1055E000013022E230201BE5020051E10030A0230F
:1055F00001300332000053E363FFFF1A44301BE520
:10560000000053E30900001A44309FE5102093E5A1
:10561000043096E5030052E10400008A0600A0E190
:10562000EAFCFFEB0008A0E14008A0E140000BE528
:1056300040101BE50118B0E10030A0030130A013B9
:1056400044201BE50220D3E14DFFFF1A44001BE577
:10565000F0AF1BE9600A0004E00800040DC0A0E1FF
:10566000F0D92DE904B04CE20CD04DE20350A0E19A
:10567000FF8001E2FF7002E20060A0E3060053E158
:10568000060050110300000AB4309FE50030D3E556
:10569000060053E10100001A0000A0E3F0A91BE995
:1056A0000030A0E3183085E5BC31C5E1D020D0E161
:1056B000013026E2000052E30030A0030130031263
:1056C000000053E31C00000A2C104BE26EFBFFEBC2
:1056D0000040A0E1000050E30A00000AD030D0E111
:1056E000000053E30810A0010720A0011010A01330
:1056F0001820A0132C004BE20530A0E1FEFDFFEBCB
:10570000FF0010E30100001A0600A0E1F0A91BE968
:10571000D030D4E1000053E30160A0030400A0E115
:10572000D020D4E1013026E2000052E30030A00393
:1057300001300312000053E3E2FFFF1A0600A0E16C
:10574000F0A91BE9600A00040DC0A0E1F0D92DE921
:1057500004B04CE20CD04DE20260A0E1FF8001E217
:105760000070A0E3070052E1070050110300000A97
:10577000DC309FE50030D3E5070053E10100001A5B
:105780000000A0E3F0A91BE90030A0E3183082E597
:10579000BC31C2E1D020D0E1013027E2000052E369
:1057A0000030A00301300312000053E32600000A7A
:1057B0002C104BE234FBFFEB0040A0E1000050E373
:1057C0001700000AD010D0E1000051E30150A00101
:1057D0001050A0131820A0E32C004BE20510A0E10C
:1057E0000630A0E1C4FDFFEBFF0010E30E00001A3D
:1057F000D030D4E1000053E30850A0012C004BE26C
:105800000510A0E10620A0E17BFEFFEBFF0010E306
:105810000300000AD030D4E1000053E30170A0037C
:10582000010000EA0700A0E1F0A91BE90400A0E1E3
:10583000D020D4E1013027E2000052E30030A00381
:1058400001300312000053E3D8FFFF1A0700A0E164
:10585000F0A91BE9600A00040DC0A0E170D82DE991
:1058600004B04CE20050A0E1FF6001E20040A0E380
:1058700080319FE50030D3E5040050E1040053116E
:105880004600000ACAFAFFEB0040A0E1000050E326
:1058900070A81B090010A0E3001080E5041080E54B
:1058A0000810C0E5BA10C0E10C60C0E5101080E53A
:1058B000141080E5201280E5181080E5BC11C0E1CD
:1058C0001E10C4E50500A0E11820A0E30430A0E10B
:1058D00061FFFFEBFF0010E33200000A063CA0E18D
:1058E000431CA0E1720051E32400000A020000CA38
:1058F000610051E30300000A250000EA770051E34C
:105900000700000A220000EA1E30D4E5010013E37C
:105910000400A0010010A0030220A0031A00000A46
:105920001B0000EA1E30D4E5010013E31800001A42
:10593000000094E523FBFFEB0008A0E12008A0E1B4
:10594000EBFCFFEB0400A0E15AFCFFEB0008A0E138
:105950002008A0E108FBFFEB000084E5040084E5DB
:105960000020A0E30820C4E5BA20C4E1102084E5AB
:10597000142084E50400A0E10210A0E1020000EA86
:105980000400A0E10010A0E30120A0E18CFCFFEBEB
:10599000020000EA0400A0E1590000EB0040A0E38F
:1059A0000400A0E170A81BE9063CA0E1431CA0E1B3
:1059B000720051E30A00000A010000CA610051E3CD
:1059C000000000EA770051E30500001A0500A0E19D
:1059D0002010A0E30420A0E15AFFFFEBFF5010E2EB
:1059E0000200001A0400A0E1450000EB0040A0E323
:1059F0000400A0E170A81BE9600A00040DC0A0E14A
:105A000070D82DE904B04CE20060A0E1000050E342
:105A10001400000AE0309FE50030D3E5000053E3B6
:105A20001000000A0C30D0E5720053E30D00000AAC
:105A3000010000CA610053E3000000EA770053E36D
:105A40000800001ABA30D6E1000053E30700000A4C
:105A50001F1086E2200296E5010400EB000050E3EF
:105A60000200000AE9FAFFEB0000E0E370A81BE97E
:105A7000180096E5200286E51F1086E25E0400EB22
:105A8000000050E3F6FFFF1A1F5086E2BC21D6E16A
:105A90001030D6E5822285E01C30C2E51130D6E513
:105AA0001D30C2E51230D6E51E30C2E51330D6E512
:105AB0001F30C2E5BC41D6E140009FE51FFAFFEB75
:105AC000844285E01600C4E52034A0E11730C4E527
:105AD0002038A0E11830C4E5200CA0E11900C4E58D
:105AE000200296E50510A0E1DD0300EB000050E385
:105AF0000000A00370A81B09D9FFFFEA600A000498
:105B0000E00800040DC0A0E130D82DE904B04CE25B
:105B10000040A0E10050E0E3000050E30500A001D8
:105B200030A81B09B4FFFFEB0008A0E14058A0E13A
:105B30000400A0E132FAFFEB0500A0E130A81BE968
:105B40000DC0A0E170D82DE904B04CE20040A0E106
:105B50000050E0E3E4309FE50030D3E5000050E37F
:105B6000000053131200000A102090E5000052E3D9
:105B70003000000A143090E5013083E2020053E166
:105B80002C00002A040090E50830D4E5030080E0F2
:105B9000203294E5000053E10700000A200284E56A
:105BA0001F1084E2140400EB000050E30200000A1E
:105BB00096FAFFEB0500A0E170A81BE9BA20D4E13A
:105BC000043082E01F50D3E5143094E5013083E2C5
:105BD000143084E5012082E2BA20C4E1BA30D4E175
:105BE000020C53E31300003A0030A0E30360A0E18D
:105BF000BA30C4E10830D4E5013083E20830C4E5AE
:105C00000820D4E534309FE50130D3E5030052E1AC
:105C10000800003A0400A0E16CFBFFEB0008B0E1D3
:105C20000860C4150830D405013043020830C405AB
:105C3000023CA003BA30C4010500A0E170A81BE932
:105C4000600A00040DC0A0E130D82DE904B04CE298
:105C50000140A0E1FF5000E238319FE50030D3E57C
:105C6000000051E3000053131600000A142091E5D0
:105C7000103091E5030052E10600003ABA30D1E15C
:105C8000020C53E30300003A0100A0E15AFCFFEBD1
:105C90000008B0E10B00000A040094E50830D4E5E8
:105CA000030080E0203294E5000053E10700000A81
:105CB000200284E51F1084E2CF0300EB000050E3D4
:105CC0000200000A51FAFFEB0000E0E330A81BE9F4
:105CD000BA30D4E1043083E01F50C3E5102084E2E1
:105CE0000C0092E8030052E101308202103084057A
:105CF000143094E5013083E2143084E5BA30D4E105
:105D0000013083E2BA30C4E1BA30D4E1020C53E38B
:105D10001E00003A1F1084E2200294E5500300EBBD
:105D2000000050E3E6FFFF1A0030A0E3BA30C4E100
:105D30000830D4E5013083E20830C4E50820D4E51A
:105D400050309FE50130D3E5030052E10F00003AE7
:105D50000400A0E11DFBFFEB0008B0E10030A01340
:105D60000830C4150900001A0400A0E122FCFFEB72
:105D70000008B0E10500001A0830D4E5013043E224
:105D80000830C4E5023CA0E3BA30C4E1CDFFFFEA2D
:105D90000000A0E330A81BE9600A00040DC0A0E1E8
:105DA000F0DD2DE904B04CE20140A0E102A0A0E149
:105DB0000370A0E10080A0E30160A0E3A0309FE5B4
:105DC0000030D3E5080057E1080053110100000A34
:105DD000080050E10100001A0000A0E3F0AD1BE94B
:105DE0000050A0E1020058E10030A023013006324B
:105DF000000053E31800000A000054E30030A00341
:105E000001300612000053E30C00000A0700A0E175
:105E10004AFFFFEB0008A0E14008A0E1010070E3A9
:105E20000100C514014044120060A003000054E3C7
:105E30000030A00301300612000053E3F2FFFF1A06
:105E4000000056E3018088120A0058E10030A023C8
:105E500001300632000053E3E6FFFF1A0800A0E11C
:105E6000F0AD1BE9600A00040DC0A0E1F0DD2DE9F2
:105E700004B04CE20150A0E102A0A0E10370A0E157
:105E80000080A0E30160A0E3A0309FE50030D3E5EF
:105E9000080057E1080053110100000A080050E112
:105EA0000100001A0000A0E3F0AD1BE90040A0E1F2
:105EB000020058E10030A02301300632000053E315
:105EC0001800000A000055E30030A003013006125C
:105ED000000053E30C00000AD000D4E10710A0E159
:105EE00057FFFFEB0008A0E1010870E301408412B6
:105EF000015045120060A003000055E30030A003EC
:105F000001300612000053E3F2FFFF1A000056E3CF
:105F1000018088120A0058E10030A02301300632C7
:105F2000000053E3E6FFFF1A0800A0E1F0AD1BE913
:105F3000600A00040DC0A0E170D82DE904B04CE265
:105F40000040A0E10160A0E10020A0E30250A0E138
:105F500060309FE50030D3E5020051E102005311AB
:105F60000100000A020050E10100001A0000A0E355
:105F700070A81BE9D23090E10300A0E1000053E3D8
:105F8000010072130900000A0610A0E12CFFFFEBCC
:105F90000008A0E14028A0E1013085E2FF5003E2C3
:105FA000D50094E1000050E301007213F5FFFF1AE1
:105FB0000200A0E170A81BE9600A00040DC0A0E186
:105FC000F0D82DE904B04CE20070A0E10260A0E13D
:105FD0000000A0E36C309FE50030D3E5000052E103
:105FE000000053110300000A000057E10040A01117
:105FF0000750A0110F00001A0000A0E3F0A81BE951
:106000000600A0E1CDFEFFEB0008A0E14008A0E102
:10601000010070E30100000A0A0050E30100001AC9
:106020000000A0E30140A0E30100C5E4013044E228
:106030000338A0E14348A0E1010054E30700A0D1E8
:10604000F0A81BD9EDFFFFEA600A00040DC0A0E133
:1060500070D82DE904B04CE20040A0E10060A0E35C
:10606000D3F8FFEB0050A0E10400A0E10610A0E18E
:106070001820A0E30530A0E177FDFFEBFF6000E210
:106080000500A0E1DEF8FFEB0600A0E170A81BE927
:106090000030A0E1140090E5010080E2103093E5AB
:1060A000030050E10000A0330100A0230EF0A0E1A6
:1060B00030402DE90050A0E10140A0E10000A0E344
:1060C0000010A0E1040050E11100002A01C0D5E752
:1060D00000E0A0E38030A0E1FF0003E280200CE2BA
:1060E000803003E2030052E1090020128C30A0E16D
:1060F000FFC003E201308EE2FFE003E207005EE34F
:10610000F3FFFF9A013081E2FF1003E2040051E146
:10611000EDFFFF3A8030A0E1013083E3FF0003E2AE
:106120003080BDE80DC0A0E130D82DE904B04CE2CC
:106130000040A0E11F0400EB470300EB0400A0E1D6
:106140001FF0FFEB0050A0E1020400EBFF4000E273
:106150000500A0E120F0FFEBFF0010E30100001AB2
:10616000FF0054E3F7FFFF1A0400A0E130A81BE989
:106170000DC0A0E170D82DE904B04CE208D04DE28A
:106180000150A0E1FF4000E20060A0E3090400EB41
:10619000310300EB7D0FA0E3E1FFFFEB050400EB13
:1061A000EC0300EB404084E320404BE5253CA0E1BC
:1061B0001F304BE52538A0E11E304BE52534A0E12A
:1061C0001D304BE51C504BE520004BE20510A0E3D1
:1061D000B6FFFFEB1B004BE50640A0E10438A0E151
:1061E00018204BE2233882E0080053E5040400EB5A
:1061F000013084E20338A0E14348A0E1050853E3FD
:10620000F5FFFF9AEB0300EBD20300EBFF0000E287
:106210000620A0E1013086E20338A0E14368A0E156
:106220000228A0E17D0752E370A81B89FF0050E31C
:1062300070A81B19F3FFFFEA0DC0A0E130D82DE9CB
:1062400004B04CE20150A0E1FF4000E23700A0E3BF
:106250000010A0E3C5FFFFEBFF0000E2800010E3A9
:1062600030A81B190400A0E10510A0E1BFFFFFEB5F
:10627000FF0000E230A81BE90DC0A0E1F0D82DE935
:1062800004B04CE20270A0E10360A0E1FF0000E274
:10629000B6FFFFEBFF4010E20450A0131500001AF8
:1062A000C40300EBAB0300EBFF4000E2F00010E39F
:1062B0000A50A0030F00000AFE0054E3F8FFFF1A83
:1062C0000050A0E3060055E10700002AA10300EBFF
:1062D0000538A0E12308C7E7013085E20338A0E1D3
:1062E0004358A0E1230856E1F7FFFF8A990300EB2A
:1062F000980300EB0050A0E3000055E30600000AFD
:106300001C009FE51C109FE50520A0E10430A0E1E2
:10631000774700EB08009FE57F0D00EB0500A0E14B
:10632000F0A81BE928130004F0CC01000DC0A0E187
:10633000F0D82DE904B04CE23CD04DE20070A0E171
:1063400050504BE20040A0E10120D4E40500A0E160
:1063500008119FE5664700EB0500A0E16E0D00EB1C
:1063600058604BE20600A0E10410A0E10220A0E387
:10637000744700EB0040A0E356404BE50500A0E168
:10638000DC109FE50620A0E1594700EB0500A0E1E5
:10639000610D00EB031087E20600A0E10520A0E3F9
:1063A000684700EB53404BE50500A0E1B4109FE5C2
:1063B0000620A0E14E4700EB0500A0E1560D00EBE2
:1063C0000830D7E52322A0E10F3003E20500A0E169
:1063D00094109FE5464700EB0500A0E14E0D00EB51
:1063E00088009FE54C0D00EB0450A0E150404BE2CB
:1063F0000538A0E1233887E00920D3E50400A0E1B7
:106400006C109FE53A4700EB0400A0E1420D00EB61
:10641000013085E20338A0E14358A0E1030853E3CB
:10642000F2FFFF9A4C009FE53B0D00EB0E50D7E5C5
:106430000D30D7E50332A0E1253283E150404BE235
:106440000F2005E27D3E83E20400A0E128109FE5D5
:10645000274700EB0400A0E12F0D00EBF0A81BE99B
:1064600024CD010040CD010058CD01006CCD0100CC
:1064700084CD010094CD01009CCF01009CCD010092
:106480000DC0A0E100D82DE904B04CE20020A0E14D
:106490000A00A0E30010A0E31030A0E375FFFFEBBB
:1064A00000A81BE90DC0A0E100D82DE904B04CE222
:1064B0000020A0E10900A0E30010A0E31030A0E359
:1064C0006CFFFFEB00A81BE90DC0A0E170D82DE91F
:1064D00004B04CE23CD04DE20050A0E31603A0E330
:1064E0000B0A80E20810A0E3F61F00EBFF0010E3A8
:1064F0001A01001A88049FE5070D00EB680200EB03
:1065000080049FE5040D00EB7C049FE5020D00EB89
:1065100078349FE50050C3E5580200EB250300EBFB
:10652000FF00A0E3360300EB015085E20E0055E3C7
:10653000FAFFFF9A030000EA0530A0E1015085E26E
:10654000140053E3DD00008A0000A0E30010A0E186
:1065500006FFFFEBFF0000E2010050E3F5FFFF1A2A
:106560000800A0E36A1FA0E3021081E2FFFEFFEB38
:1065700054004BE5D4355BE1000053E34C404BB293
:1065800054205BB50400A0B104149FB5D30000BA39
:1065900054305BE5040013E30B00000AEC339FE585
:1065A0000120D3E50010A0E3012081E30120C3E531
:1065B0000220D3E50210C3E50320D3E50310C3E5B1
:1065C0000420D3E50410C3E51B0000EABC339FE5BB
:1065D0000120D3E50010A0E3022081E30120C3E500
:1065E0000220D3E50210C3E50320D3E50310C3E581
:1065F0000420D3E50410C3E50150A0E318304BE2BA
:10660000054083E0D30200EB3C0044E5015085E205
:10661000040055E3F8FFFF9A50305BE5AA0053E30E
:1066200070039F15AF00001A51305BE50F3003E295
:10663000010053E360039F151E00001A3A00A0E317
:106640000010A0E3C9FEFFEB54004BE5D4355BE13D
:10665000000053E34C404BB254205BB50400A0B1A2
:1066600038139FB59D0000BA54305BE5040013E376
:106670000150A0030300000A24039FE5A60C00EBD1
:106680000660A0E3B30000EA18304BE2054083E067
:10669000B00200EB3C0044E5015085E2040055E304
:1066A000F8FFFF9A52305BE5303003E2300053E3ED
:1066B0000300000AEC029FE5970C00EB0560A0E3E5
:1066C000A40000EA7D0EA0E3BDEEFFEB0050A0E1C8
:1066D0002900A0E30010A0E3D6FEFFEB54004BE539
:1066E000D4355BE1000053E3780000BA0500A0E177
:1066F000B9EEFFEBFF0010E37D00001A54305BE5BC
:10670000010013E3F1FFFF1A000053E398029F1505
:106710007800001A1000A0E3021CA0E393FEFFEB38
:10672000FF0010E30300000A80029FE57A0C00EBF3
:106730000B60A0E3870000EA74029FE54FFFFFEBC8
:106740000060A0E1000050E368029F150500001AF8
:1067500064029FE552FFFFEB0060A0E1000050E300
:106760000200000A54029FE56B0C00EB790000EA7E
:106770004C029FE5680C00EB10329FE51930D3E521
:106780002333B0E10200000A010053E31A00000ABB
:10679000310000EAF4119FE51E00D1E50F0000E290
:1067A0001FC0D1E503C00CE22030D1E50331A0E1E8
:1067B0000CC583E12130D1E523C38CE12220D1E552
:1067C000032002E22330D1E5A333A0E1823083E14C
:1067D00001208CE2023083E21223A0E11220A0E12A
:1067E000FF3002E20500D1E50530C1E52234A0E129
:1067F000FF3003E20600D1E50E0000EA8C119FE5B0
:1068000020C0D1E53FC00CE22130D1E50334A0E146
:106810000CC883E12230D1E503C08CE18C29A0E1D2
:10682000022782E2FF3002E20500D1E50530C1E532
:106830000630D1E50030A0E30630C1E52238A0E102
:10684000FF3003E20700D1E50730C1E5222CA0E1CB
:106850000830D1E50820C1E5090000EA2C319FE5A8
:106860000520D3E50020A0E30520C3E50610D3E50D
:106870000620C3E50710D3E50720C3E50810D3E5DC
:106880000820C3E504119FE50130D1E50220D1E5E0
:10689000023483E10320D1E5023883E10420D1E50D
:1068A000023C83E1010053E30200000A020053E3CB
:1068B0001300000A140000EA08019FE5110000EA35
:1068C00004019FE5140C00EB0260A0E3210000EA44
:1068D0004C404BE254205BE50400A0E1EC109FE546
:1068E000034600EB0400A0E10B0C00EB0460A0E306
:1068F000180000EAD8009FE5070C00EB0360A0E356
:10690000140000EACC009FE5030C00EB7C409FE5FF
:106910000520D4E50630D4E5032482E10730D4E530
:10692000032882E10830D4E5032C82E14C504BE28D
:10693000222AA0E10500A0E19C109FE5EC4500EBB8
:106940000500A0E1F40B00EB090084E276FEFFEB0A
:106950000130A0E30030C4E5480100EB060000EA86
:10696000BF0100EB0020A0E320309FE50020C3E53D
:106970000160A0E364009FE5E70B00EB0600A0E1E7
:1069800070A81BE9B8CD010060CB0100C8CD0100A3
:10699000F8100004D8CD0100ECCD01000CCE0100B0
:1069A0002CCE010040CE010050CE010070CE01007F
:1069B0007CCE010001110004A0CE010011110004E1
:1069C000B8CE0100CCCE0100D4CE0100E4CE01004F
:1069D000F4CE010008CF010018CF010030CF010034
:1069E00048CF01000DC0A0E110D82DE904B04CE261
:1069F00060009FE5C80B00EB990100EB58309FE564
:106A00000040A0E30040C3E50520D3E50540C3E511
:106A10000620D3E50640C3E50720D3E50740C3E5DC
:106A20000820D3E50840C3E50120D3E50140C3E5D4
:106A30000220D3E50240C3E50320D3E50340C3E5CC
:106A40000420D3E50440C3E510009FE5B20B00EB42
:106A50000400A0E110A81BE95CCF0100F8100004BD
:106A600060CB01000DC0A0E1F0D92DE904B04CE2EB
:106A70000170A0E10060A0E38034A0E11800A0E371
:106A80000310A0E1B9FDFFEBFF4010E20450A0139A
:106A90004C00001AC70100EB0040A0E3AD0100EB81
:106AA000013084E20338A0E14348A0E1130853E336
:106AB000F9FFFF9A0700A0E1021CA0E3190400EB14
:106AC0000008A0E14088A0E1FE00A0E3CC0100EBBB
:106AD0000040A0E37F57A0E3035885E20438A0E11B
:106AE0002308D7E7C60100EB013084E20338A0E1B8
:106AF0004348A0E1050053E1F7FFFF9A0808A0E131
:106B0000200CA0E1BE0100EBFF0008E2BC0100EB9D
:106B1000A80100EB8F0100EBFF4000E20620A0E19E
:106B2000013086E20338A0E14368A0E10228A0E139
:106B30007D0752E31C00008A113004E2010053E398
:106B4000F3FFFF1A1F3004E20B0053E30850A003C9
:106B50001C00000A020000CA050053E30500000AF9
:106B6000020000EA1D0053E30950A0031500000ACB
:106B70000C50A0E3130000EA0050A0E37D0EA0E358
:106B800067FDFFEBFF4000E2FF0054E30600001A40
:106B90000D00A0E30010A0E374FDFFEBFF4010E246
:106BA0000450A0130600001A010000EA0750A0E3F9
:106BB000040000EA670100EBFF4010E20100000A58
:106BC0000950A0E3630100EB000055E30600000A52
:106BD0001C009FE51C109FE50520A0E10430A0E10A
:106BE000434500EB08009FE54B0B00EB0500A0E1DF
:106BF000F0A91BE92813000470CF01000DC0A0E12B
:106C000000D82DE904B04CE20120A0E18034A0E1DD
:106C10001100A0E30310A0E1023CA0E395FDFFEB0F
:106C200000A81BE90010A0E328009FE5813081E067
:106C3000033181E0033181E0003083E03220D3E58D
:106C40003120C3E5013081E2FF1003E2020051E38D
:106C50000EF0A081F4FFFFEA6C0000040DC0A0E17B
:106C6000F0D92DE904B04CE214D04DE20040A0E18F
:106C70000180A0E134E04BE2E8C09FE50F00BCE8F2
:106C80000F00AEE8B0C0DCE1B0C0CEE10400A0E18E
:106C9000344500EBFF5000E2100055E31050A023F4
:106CA00034004BE20410A0E10520A0E1254500EBF3
:106CB0000050A0E334604BE2AC709FE5853085E086
:106CC000033185E0033185E0074083E00600A0E161
:106CD0000410A0E11020A0E32B4500EB000050E3DE
:106CE0001B00001A0800A0E1584500EB3100C4E584
:106CF0003120D4E53330D4E5030052E10200003AFC
:106D00003430D4E5030052E10500009A853085E077
:106D1000033185E0033185E0073083E03220D3E59D
:106D20003120C3E5853085E0033185E0033185E01E
:106D3000073083E03130D3E530009FE530109FE528
:106D400034204BE2EA4400EB20009FE5F20A00EB1E
:106D5000F0A91BE9013085E2FF5003E2020055E390
:106D6000F0A91B89D4FFFFEA04AC01006C00000409
:106D700028130004A0CF01000DC0A0E1F0D82DE938
:106D800004B04CE220D04DE2A5FFFFEBB8009FE538
:106D9000E10A00EBB4009FE57210A0E3ADFAFFEB4F
:106DA0000050A0E1000050E30040A0133C704B12E3
:106DB0000200001A98009FE5D70A00EBF0A81BE933
:106DC0000700A0E11F10A0E30520A0E17AFCFFEB83
:106DD0003C305BE5000053E31800000A0A0053E36F
:106DE0000D0053131100000A200053E30F00000AA6
:106DF0003B0053E30D00000A230053E30B00000A9D
:106E00000700A0E14C109FE5EC4400EB0060A0E11E
:106E1000000050E30500000A0000A0E334109FE5E5
:106E2000E64400EB0010A0E10600A0E18AFFFFEBC2
:106E3000013084E2FF4003E2090054E3DFFFFF9AE0
:106E40000500A0E12EFBFFEBF0A81BE9ACCF010091
:106E5000C8CF0100D8CF0100F4CF01000DC0A0E1E0
:106E600000D82DE904B04CE21603A0E30B0A80E23F
:106E70001010A0E30020A0E39D1D00EB00A81BE97B
:106E80000DC0A0E100D82DE904B04CE21603A0E348
:106E90000B0A80E21010A0E30120A0E3941D00EB98
:106EA00000A81BE90DC0A0E1F0DD2DE904B04CE223
:106EB00020D04DE2020CA0E30110A0E3D41A00EBB5
:106EC0003C004BE2771D00EB0170A0E33C404BE23D
:106ED0000170C4E51030A0E33C304BE50050A0E366
:106EE0000250C4E50350C4E5B470C4E11603A0E346
:106EF0000B0A80E20410A0E1181D00EB0400A0E1E1
:106F0000681D00EB0170C4E55030A0E33C304BE558
:106F10000250C4E50370C4E50230A0E3B430C4E11C
:106F20001603A0E3090A80E20410A0E10B1D00EBA8
:106F30000400A0E15B1D00EB0150C4E52030A0E39C
:106F40003C304BE50250C4E50370C4E50560A0E1A8
:106F5000B450C4E11603A0E3090A80E20410A0E1E2
:106F6000FE1C00EB1703A0E3020980E2902200EB75
:106F700034804BE20800A0E1E82200EB3030E0E38F
:106F8000B4334BE10430E0E3B2334BE18030E0E373
:106F9000BE324BE14030E0E3B0334BE10530A0E3DB
:106FA00028304BE508A0A0E327A04BE51703A0E39A
:106FB000020980E20810A0E1942200EBAFFFFFEB92
:106FC0001703A0E3020980E20710A0E1E32200EB2F
:106FD0000207A0E30710A0E18D1A00EB0150C4E501
:106FE0003CA04BE50250C4E50350C4E5B450C4E1F5
:106FF0001603A0E30B0A80E20410A0E1D71C00EB0B
:10700000020AA0E30710A0E1811A00EB0700A0E14B
:10701000612500EB020BA0E3862500EB502500EB79
:1070200044301BE5FF30C3E344300BE544004BE242
:10703000023BA0E3043080E5362500EB0B00A0E323
:10704000AF1B00EB1B00A0E30510A0E10720A0E3AD
:107050001F2000EB1B00A0E30710A0E1711F00EB55
:10706000F0AD1BE90DC0A0E170D82DE904B04CE2F1
:1070700008D04DE21703A0E3020980E20010A0E36C
:10708000B62200EB1703A0E3020980E2482200EBDE
:1070900020404BE20060A0E30160C4E51030A0E3B3
:1070A00020304BE50260C4E50360C4E50650A0E172
:1070B000B460C4E11603A0E30B0A80E20410A0E16F
:1070C000A61C00EB0160C4E55030A0E320304BE586
:1070D0000260C4E50360C4E5B460C4E11603A0E344
:1070E000090A80E20410A0E19C1C00EB0160C4E5E9
:1070F0002030A0E320304BE50260C4E50360C4E526
:10710000B460C4E11603A0E3090A80E20410A0E120
:10711000921C00EB020CA0E30610A0E13C1A00EB6D
:107120000207A0E30110A0E3391A00EB0160C4E5F7
:107130000830A0E320304BE50260C4E50360C4E5FD
:10714000B460C4E11603A0E30B0A80E20410A0E1DE
:10715000821C00EB70A81BE90DC0A0E110D82DE93E
:1071600004B04CE21743A0E3020984E22110A0E33B
:10717000AA2200EB010050E3FAFFFF1A1703A0E375
:10718000020980E2FF10A0E3972200EB1743A0E37F
:10719000020984E22010A0E3A02200EB010050E3EA
:1071A000FAFFFF1A1703A0E3020980E2922200EB24
:1071B000FF0000E210A81BE90DC0A0E110D82DE9E6
:1071C00004B04CE21743A0E3020984E22010A0E3DC
:1071D000922200EB010050E31743A0030200000AD3
:1071E000F8FFFFEA020984E2832200EB020984E24D
:1071F0002210A0E3892200EB010050E310A81B1924
:10720000F7FFFFEA0DC0A0E130D82DE904B04CE251
:10721000FF5000E21743A0E3020984E22110A0E33B
:107220007E2200EB010050E3FAFFFF1A1703A0E3F0
:10723000020980E20510A0E16B2200EB30A81BE9F7
:107240000DC0A0E130D82DE904B04CE258409FE5D4
:107250000300A0E3ED2600EB0008A0E12008A0E178
:10726000000084E5B020D4E140009FE5251EA0E3A6
:107270000C2E00EB34509FE5002094E50030A0E395
:107280000230C5E70300A0E39A2500EB20009FE54C
:1072900020109FE5002094E50530A0E1944300EB29
:1072A0000C009FE59C0900EB30A81BE924040004B6
:1072B0002811000428130004F8CF01000020A0E3E7
:1072C00004309FE5002083E50EF0A0E128040004CF
:1072D0000DC0A0E100D82DE904B04CE278219FE573
:1072E000211DA0E3461281E2003091E5B030C2E1F9
:1072F000B030D2E164219FE5B020D2E1023003E05A
:10730000010B13E30500000AFB3CA0E3FF3083E21E
:10731000003081E548319FE50FE0A0E104F093E5FE
:1073200034319FE5B030D3E130219FE5B020D2E188
:10733000023003E0020A13E3212DA0134622821239
:10734000DF3CA013FF3083120030821508319FE527
:10735000B030D3E104219FE5B020D2E1023003E058
:10736000010A13E30600000A212DA0E3462282E26F
:10737000EF3CA0E3FF3083E2003082E50000A0E3B1
:107380007C0100EBD0309FE5B030D3E1CC209FE50D
:10739000B020D2E1023003E0020B13E30C00000A3C
:1073A000C0309FE5003093E5000053E30100000A80
:1073B000510100EB010000EA0200A0E36D0100EBC7
:1073C000212DA0E3462282E2F73CA0E3FF3083E2D6
:1073D000003082E580309FE5B030D3E17C209FE52E
:1073E000B020D2E1023003E0020C13E3212DA01300
:1073F00046228212FD3CA013FF308312003082151A
:1074000054309FE5B030D3E150209FE5B020D2E169
:10741000023003E0010C13E30600000A212DA0E373
:10742000462282E2FE3CA0E3FF3083E2003082E5A8
:107430000700A0E34F0100EB1C309FE5B030D3E123
:1074400018209FE5B020D2E1023003E0020913E3E7
:1074500000A81B09672C00EB00A81BE9B011000471
:1074600090180004900100041C0200040DC0A0E16B
:1074700070D82DE904B04CE20050A0E3A8409FE58D
:10748000003094E51250C3E5F60000EB213DA0E387
:10749000463283E2005083E5BF2CA0E38C309FE5A9
:1074A000B020C3E10632A0E3213D83E2002083E562
:1074B000002094E578309FE50730D3E51130C2E530
:1074C000003094E51230D3E5050053E11200001AB4
:1074D000015085E20460A0E1924AA0E37B4E84E281
:1074E0000F4084E2422C00EB003096E51230D3E5E9
:1074F000000053E30300001A0530A0E1015085E2CB
:10750000040053E1F6FFFF9A1C309FE5003093E53D
:107510001230D3E5000053E370A81B090520A0E357
:1075200010309FE50020C3E570A81BE98018000417
:10753000901800042AAC0100300400040DC0A0E142
:1075400010D82DE904B04CE210219FE5003092E5FF
:107550000040A0E31240C3E5003092E51340C3E5CC
:107560000400A0E1612400EB0400A0E1021CA0E300
:10757000792400EB0400A0E11010A0E3872400EBC5
:107580000400A0E1461FA0E3A32500EB0400A0E156
:10759000561FA0E38A2500EB0400A0E1F52400EBD0
:1075A000BC309FE52C10D3E50400A0E1D82500EB0A
:1075B0000400A0E1CF2400EB0100A0E30410A0E14F
:1075C000652400EB0100A0E3021CA0E37C2500EB96
:1075D0000100A0E32010A0E3702400EB0100A0E371
:1075E0000410A0E1812400EB0200A0E3061CA0E34C
:1075F000592400EB0200A0E3091DA0E3702500EB75
:107600000200A0E30410A0E1782400EB0200A0E354
:107610002010A0E3612400EB0300A0E30410A0E12C
:107620004D2400EB0300A0E3251EA0E37A2500EB28
:107630000300A0E34010A0E3B52500EB0300A0E3A6
:10764000031AA0E3692400EB0300A0E30410A0E107
:10765000522400EB0400A0E1CB2B00EB10A81BE9A7
:10766000801800049001000410209FE5003092E58E
:10767000200053E30030A003003082050EF0A0E1AB
:107680002C0400040EF0A0E10DC0A0E110D82DE9FB
:1076900004B04CE2FF0000E20010A0E3210050E340
:1076A0000600001A7C309FE5003093E50030D3E5FA
:1076B0007F3003E2210053E36C109F050B0000EACA
:1076C000200050E30900001A58309FE5003093E590
:1076D0000030D3E57F3003E250209FE5210053E3E3
:1076E0000210A0012020A0E344309FE5002083E5A4
:1076F000000051E30200A00310A81B0924209FE50D
:10770000003092E5201083E5003092E50040A0E3D0
:10771000BA41C3E10400A0E10FE0A0E101F0A0E163
:107720000400A0E110A81BE98018000418780000EC
:10773000407800002C040004FF0000E230309FE598
:10774000003093E50030D3E57F3003E2210053E3BE
:107750000500001A020050E30100000A220050E375
:107760000100001A0000A0E30EF0A0E10200A0E377
:107770000EF0A0E1801800040DC0A0E100D82DE9B2
:1077800004B04CE20008A0E12008A0E104109FE54D
:107790000B2900EB00A81BE9E40100040DC0A0E1E7
:1077A00000D82DE904B04CE20008A0E12008A0E1D7
:1077B00004109FE5022900EB00A81BE9EC0100047E
:1077C0000DC0A0E100D82DE904B04CE21C309FE5CB
:1077D000003093E50530D3E50008A0E12008A0E1E2
:1077E0000C109FE5831181E0F52800EB00A81BE950
:1077F00080180004F4010004FF0000E2FF0011E320
:107800000200A0130EF0A011010050E30200A083BB
:107810000000A0930EF0A0E10008A0E12008B0E174
:1078200010309F05003093050820A003B821C30144
:1078300004009F150EF0A0E18018000484010004EC
:107840000008A0E12008B0E110309F05003093054A
:107850000820A003B821C30104009F150EF0A0E189
:1078600080180004840100040DC0A0E100D82DE9B7
:1078700004B04CE20100A0E324F2FFEB0622A0E3F7
:10788000212D82E20130A0E3003082E50000A0E378
:10789000000082E5213DA0E3463283E2000083E55B
:1078A000071BA0E308309FE5B010C3E1001082E59C
:1078B00000A81BE9901800040DC0A0E130D82DE904
:1078C00004B04CE20652A0E3215D85E20130A0E362
:1078D000003085E5213DA0E3463283E20040A0E38D
:1078E000004083E50400A0E108F2FFEB0330A0E3D1
:1078F000003085E50400A0E130A81BE90120A0E3E9
:1079000034309FE5002083E50622A0E3212D82E2AA
:10791000003092E50338A0E1023783E32338A0E189
:10792000003082E5003092E50338A0E1013783E3BF
:107930002338A0E1003082E50EF0A0E1C011000480
:107940000020A0E328309FE5002083E50622A0E385
:10795000212D82E2003092E50430C3E30338A0E138
:107960002338A0E1003082E5BF3CA0E3003082E58F
:107970000EF0A0E1C01100040DC0A0E100D82DE977
:1079800004B04CE2070050E318319F150000831546
:1079900010319FE5003093E5070053E303F19F9713
:1079A0003E0000EAC4790000DC790000F0790000B4
:1079B000047A0000287A00005C7A0000A07A0000B7
:1079C000A07A0000DDFFFFEB362300EB020910E395
:1079D0003200000AC8FFFFEB300000EAD7FFFFEBE0
:1079E0000420A0E3BC309FE5002083E500A81BE94C
:1079F000B0309FE50220A0E30420C3E50320A0E30C
:107A0000F8FFFFEA9C209FE50430D2E5013043E215
:107A10000430C2E50430D2E5000053E30430A00393
:107A20000030820500A81BE90622A0E3212D82E296
:107A3000003092E50338A0E1013683E32338A0E16A
:107A4000003082E55C209FE50530A0E3003082E550
:107A50000A30A0E30430C2E500A81BE944109FE50A
:107A60000430D1E5013043E20430C1E50430D1E512
:107A7000000053E300A81B190632A0E3213D83E276
:107A8000002093E51020C2E30228A0E12228A0E113
:107A9000002083E50630A0E3003081E500A81BE963
:107AA0000620A0E3CEFFFFEAE01100040DC0A0E134
:107AB00010D82DE904B04CE208D04DE20207A0E353
:107AC0000110A0E3D21700EB18004BE2751A00EB8F
:107AD0000120A0E318104BE20120C1E53F30E0E3B4
:107AE00018304BE50040A0E30240C1E5B420C1E1FD
:107AF0001603A0E30B0A80E2181A00EB1603A0E3BA
:107B00000B0A80E24010A0E30420A0E1781A00EB09
:107B10001603A0E30B0A80E28010A0E30420A0E19A
:107B2000731A00EB10A81BE910402DE900E0A0E15A
:107B30000000A0E300C0A0E1010050E10B00002A1A
:107B400034409FE50038A0E10120DEE4232C22E050
:107B50008220A0E1B42092E1232422E00228A0E1C7
:107B60004208A0E101C08CE201005CE1F4FFFF3AB1
:107B70000008A0E12008A0E11080BDE8EAAC010007
:107B80000008A0E12008A0E148309FE5931082E0C2
:107B9000A233A0E1033183E0033183E0033240E00C
:107BA0000338B0E10700000A030010E30700001AE1
:107BB000A232A0E1033183E0033183E0033140E0EE
:107BC0000338B0E10100000A0100A0E30EF0A0E1DB
:107BD0000000A0E30EF0A0E11F85EB510DC0A0E175
:107BE00070D82DE904B04CE20050A0E1AC129FE542
:107BF0003430D1E53520D1E5023483E13620D1E5BA
:107C0000023883E13720D1E5023C93E1A000000A6D
:107C10000B30D1E5040013E39D00000A0B30D1E5E1
:107C2000080013E39A00000A0030D1E50120D1E5F5
:107C3000023483E10220D1E5023883E10320D1E55B
:107C4000023C83E158229FE5920383E02363A0E195
:107C50000830D1E50920D1E5023483E10338A0E101
:107C60004338A0E10C0056E301304392936A8692B8
:107C7000A76E8692036086920D604682833163E030
:107C80000B4883E21E4D84E2034084E214329FE5F8
:107C9000961383E0234884E00C329FE5930482E04E
:107CA000A227A0E10238A0E12338A0E1033183E05C
:107CB000033183E00332A0E1013083E2B030C5E15B
:107CC000823182E0033282E0033262E0033363E018
:107CD000044063E02421A0E1D0319FE5930281E0DC
:107CE000A115A0E10138A0E12338A0E1033183E030
:107CF000033183E0B020D5E1032182E0B020C5E16B
:107D0000813161E0833181E0033281E0033183E03E
:107D1000833081E0034144E094319FE5931482E095
:107D2000A223A0E10218A0E1B030D5E1213783E021
:107D3000B030C5E1023262E0033182E0833162E0BB
:107D4000033163E0044063E0113DA0E3063083E2C9
:107D5000030054E15C319F95942383900420639049
:107D6000A23083900334A0914328A0910320A083E4
:107D7000B030D5E1023083E0B030C5E10228A0E1A7
:107D80002228A0E1823182E0833182E0033183E066
:107D9000044063E0014084E2B000D5E177FFFFEBEF
:107DA000FF0010E310219FE510319FE50210A001B4
:107DB0000310A0110020A0E3023191E7040053E179
:107DC0000900002A023181E0043093E5030054E108
:107DD0000500008A013082E20230C5E50231D1E7B8
:107DE000043063E00330C5E50C20A0E3013082E2FB
:107DF000FF2003E20B0052E3EEFFFF9AA4309FE561
:107E0000960383E02338A0E1833083E0033263E00C
:107E1000033263E0836346E0A4309FE5961383E07A
:107E2000A335A0E10430C5E5033263E0033263E02B
:107E3000036246E08C309FE5962383E0A332A0E105
:107E40000530C5E5033263E0036146E00660C5E541
:107E500048209FE50010D2E50130D2E5031481E10E
:107E60000230D2E5031881E10330D2E5031C81E141
:107E70002C309FE5930182E02223A0E1823262E070
:107E8000033182E0831141E0B810C5E10130A0E385
:107E9000000000EA0030A0E30A30C5E570A81BE945
:107EA00034040004D34D621007452EC2BD066B3961
:107EB0007F206B3973B06D1661F3196720AF010035
:107EC000ECAE0100C5B3A2918988888880309FE517
:107ED0003420D3E50020A0E33420C3E53510D3E5FA
:107EE0003520C3E53610D3E53620C3E53710D3E59A
:107EF0003720C3E55C309FE51C10D3E51C20C3E5AB
:107F00001D10D3E51D20C3E51E10D3E51E20C3E5DB
:107F10001F10D3E51F20C3E53C309FE52410D3E5B7
:107F20002420C3E52510D3E52520C3E52610D3E59D
:107F30002620C3E52710D3E52720C3E51C309FE5A5
:107F40002F20C3E53020C3E53120C3E53220C3E54F
:107F50000EF0A0E1340400046C0400048C0400045E
:107F6000B80400040DC0A0E1F0D92DE904B04CE242
:107F700014349FE5000093E597E8FFEBFF0010E362
:107F80000020A01304349F150020C315FC239F0577
:107F90000030D205013083020030C2056400A0E346
:107FA00087E8FFEBE0339FE5000083E5DC339FE5E6
:107FB0000030D3E5010053E3F0A91B99D0039FE5FE
:107FC0003430D0E53520D0E5023483E13620D0E5E9
:107FD000023883E13720D0E5023C83E1010053E31E
:107FE000CB00001AAC439FE51C30D4E51D20D4E53E
:107FF000023483E11E20D4E5023883E11F20D4E55A
:10800000023C83E1010053E3C100001A88639FE54D
:108010002430D6E52520D6E5023483E12620D6E5B6
:10802000023883E12720D6E5027C83E1010057E393
:10803000B700001A64239FE5003092E5013083E227
:10804000003082E558139FE51830D1E51920D1E5BD
:10805000023483E1013083E20080A0E31830C1E5FF
:108060002334A0E11930C1E538539FE52F30D5E521
:108070003020D5E5023483E13120D5E5023883E1B3
:108080003220D5E5023C83E1010053E3A000000A61
:108090002F80C5E53080C5E53180C5E53280C5E576
:1080A0000B30D0E51030C5E52F30D0E51130C5E5F7
:1080B0000A30D0E51230C5E51830D0E51920D0E5FA
:1080C000023483E11A20D0E5023883E11B20D0E599
:1080D000023C83E11330C5E52324A0E11420C5E56B
:1080E0002328A0E11520C5E5233CA0E11630C5E515
:1080F0002830D0E52920D0E5023483E12A20D0E5DC
:10810000023883E12B20D0E5023C83E12B30C5E52A
:108110002324A0E12C20C5E52328A0E12D20C5E5DE
:10812000233CA0E12E30C5E57C029FE5AAFEFFEBD3
:108130000430D4E50520D4E5023483E10620D4E5FB
:10814000023883E10720D4E5023C83E10030C5E535
:108150002324A0E10120C5E52328A0E10220C5E5F4
:10816000233CA0E10330C5E50830D4E50920D4E57F
:10817000023483E10A20D4E5023883E10B20D4E500
:10818000023C83E10430C5E52324A0E10520C5E5D8
:108190002328A0E10620C5E5233CA0E10730C5E582
:1081A0001030D4E51120D4E5023483E11220D4E567
:1081B000023883E11320D4E5023C83E10830C5E5B1
:1081C0002324A0E10920C5E52328A0E10A20C5E574
:1081D000233CA0E10B30C5E50C70C5E50D80C5E57D
:1081E0000E80C5E50F80C5E50830D6E50920D6E547
:1081F000023483E10A20D6E5023883E10B20D6E57C
:10820000023C83E11B30C5E52324A0E11C20C5E529
:108210002328A0E11D20C5E5233CA0E11E30C5E5D3
:108220000430D6E50520D6E5023483E10620D6E504
:10823000023883E10720D6E5023C83E11730C5E52B
:108240002324A0E11820C5E52328A0E11920C5E5D5
:10825000233CA0E11A30C5E50C30D6E50D20D6E56B
:10826000023483E10E20D6E5023883E10F20D6E503
:10827000023C83E1003063E21F30C5E52324A0E126
:108280002020C5E52328A0E12120C5E5233CA0E16D
:108290002230C5E51430D6E51520D6E5023483E159
:1082A0001620D6E5023883E11720D6E5023C83E1AB
:1082B0002330C5E52324A0E12420C5E52328A0E13F
:1082C0002520C5E5233CA0E12630C5E51830D6E5DC
:1082D0001920D6E5023483E11A20D6E5023883E17D
:1082E0001B20D6E5023C83E12730C5E52324A0E12D
:1082F0002820C5E52328A0E12920C5E5233CA0E1ED
:108300002A30C5E52F70C5E53080C5E53180C5E56B
:108310003280C5E578309FE53420D3E50020A0E326
:10832000021082E33410C3E53500D3E53520C3E500
:108330003600D3E53620C3E53700D3E53720C3E563
:1083400050309FE51C00D3E51C10C3E51D00D3E5AC
:108350001D20C3E51E00D3E51E20C3E51F00D3E5A5
:108360001F20C3E530309FE52400D3E52410C3E58A
:108370002510D3E52520C3E52610D3E52620C3E547
:108380002710D3E52720C3E5F0A91BE9F804000472
:10839000FC040004340400046C0400048C04000495
:1083A000B4040004B8130004B8040004E008000496
:1083B0000DC0A0E100D82DE904B04CE2FF0000E2BE
:1083C00098329FE5003093E5080053E303F19F974F
:1083D0000B0000EAF88300001484000020840000F1
:1083E0002C840000F88400002C850000A08500008B
:1083F0000486000028860000B50050E30120A00399
:108400000000000A0020A0E350329FE5002083E531
:1084100000A81BE9620050E30220A003F7FFFFEA77
:10842000010050E30320A003F4FFFFEA060050E33D
:108430000E00000A020000CA020050E30300000A16
:108440001B0000EA120050E31100000A180000EAC5
:108450000C229FE50C329FE5002083E5201082E28C
:1084600004329FE5001083E51C2082E2060000EA4A
:10847000F8219FE5EC319FE5002083E5381082E28A
:10848000E4319FE5001083E5342082E2E0319FE58E
:10849000090000EADC219FE5C8319FE5002083E563
:1084A000281082E2C0319FE5001083E5242082E29B
:1084B000F5FFFFEA0020A0E3A0319FE5002083E55F
:1084C00098219FE5003092E5000053E300A81B09C6
:1084D0000430A0E3003082E59C219FE5013080E27A
:1084E0000030C2E50030D2E5013083E28C219FE507
:1084F0000030C2E500A81BE984319FE5B000C3E16C
:1085000074219FE50030D2E5033080E00030C2E501
:1085100068119FE50030D1E50020D2E5023083E00C
:108520000030C1E50520A0E3B6FFFFEA50219FE53A
:10853000B030D2E1003483E0B030C2E138219FE5B1
:108540000030D2E5033080E00030C2E52C119FE519
:108550000030D1E50020D2E5023083E00030C1E5F3
:108560000C319FE5003093E50030D3E5010053E383
:108570000400001A0020A0E3E0309FE5002083E51E
:1085800077FEFFEB00A81BE9E4309FE5002093E5B0
:108590000030A0E30030C2E50620A0E399FFFFEA27
:1085A000C0109FE5002091E5BC309FE5003093E5C9
:1085B000030052E192FFFF2A0100C2E4002081E59E
:1085C000B4209FE50030D2E5033080E00030C2E502
:1085D000A8109FE50030D1E50020D2E5023083E00D
:1085E0000030C1E598209FE5B030D2E1013043E290
:1085F000B030C2E10338B0E10720A00300A81B1986
:1086000080FFFFEA70309FE50030D3E5000053E1C2
:108610000820A00358309F15003093150020A013A8
:108620000020C31577FFFFEA50309FE50030D3E507
:10863000000053E138309F15002093150030A0133F
:108640000030C2156EFFFF1A24309FE5002093E52D
:108650000130A0E30030C2E541FEFFEB68FFFFEA16
:10866000000500046C040004080500040C05000467
:1086700034040004100500048C0400040605000402
:1086800007050004040500040DC0A0E1F0DD2DE99C
:1086900004B04CE208D04DE2E4A09FE50050A0E316
:1086A00000508AE50106A0E30110A0E3D81400EB16
:1086B0002C004BE27B1700EB0170A0E32C404BE257
:1086C0000150C4E50280A0E32C804BE50250C4E5D4
:1086D0000350C4E50560A0E1B450C4E11603A0E373
:1086E0000B0A80E20410A0E11C1700EB0400A0E1DB
:1086F0006C1700EB0150C4E52C704BE50250C4E54B
:108700000350C4E5B450C4E11603A0E30B0A80E2B1
:108710000410A0E1111700EB0400A0E1611700EBC9
:108720000150C4E54030A0E32C304BE50250C4E5D5
:108730000370C4E5B450C4E11603A0E3030980E26A
:108740000410A0E1051700EB0400A0E1551700EBB1
:108750000170C4E57F30E0E32C304BE50250C4E506
:108760000370C4E50330A0E3B430C4E11603A0E312
:10877000030980E20410A0E1F81600EB00808AE50E
:10878000F0AD1BE9140500040DC0A0E1F0D92DE9FE
:1087900004B04CE208D04DE2E4809FE50050A0E335
:1087A000005088E50207A0E30110A0E3981400EB55
:1087B00028004BE23B1700EB0170A0E328404BE29E
:1087C0000150C4E54030A0E328304BE50250C4E539
:1087D0000350C4E50560A0E1B450C4E11603A0E372
:1087E000030980E20410A0E1DC1600EB0400A0E124
:1087F0002C1700EB0150C4E57F30E0E328304BE557
:108800000250C4E50350C4E5B450C4E11603A0E32C
:10881000030980E20410A0E1D01600EB0400A0E1FF
:10882000201700EB0150C4E50230A0E328304BE5EF
:108830000250C4E50370C4E5B450C4E11603A0E3DC
:108840000B0A80E20410A0E1C41600EB0400A0E1D2
:10885000141700EB0170C4E528704BE50250C4E525
:108860000370C4E50330A0E3B430C4E11603A0E311
:108870000B0A80E20410A0E1B81600EB007088E556
:10888000F0A91BE9140500040DC0A0E170D82DE982
:1088900004B04CE21CD04DE2D4009FE51E0400EB76
:1088A0000800A0E30110A0E3591400EBC4409FE5C9
:1088B0009634A0E34339A0E1B030C4E134604BE228
:1088C0000600A0E1201800EB6030A0E3B4334BE1D8
:1088D0000830E0E3B2334BE10050A0E3B0534BE18A
:1088E000B030D4E12C300BE5B8524BE1033CA0E3AF
:1088F000B6324BE11040A0E3B4424BE10230A0E3BA
:1089000020300BE51C300BE51703A0E3010980E2E2
:10891000771700EB1703A0E3010980E20610A0E13E
:10892000931700EB1703A0E3010980E25010A0E3C6
:108930000120A0E31C1800EB1703A0E3010980E26B
:108940000110A0E3111800EB0400A0E10510A0E164
:108950000A20A0E3DE1900EB0400A0E10110A0E36F
:10896000301900EB47FFFFEB0C009FE5EA0300EB3B
:1089700070A81BE908D001002002000460CB0100B0
:108980000DC0A0E130D82DE904B04CE21703A0E3FC
:10899000010980E21010A0E3411800EB000050E351
:1089A0000500001A1703A0E3010980E24010A0E3CC
:1089B0003B1800EB000050E330A81B091703A0E3AD
:1089C000010980E21010A0E33B1800EB1703A0E3BD
:1089D000010980E24010A0E3371800EBA4309FE5C6
:1089E000002093E51733A0E3013983E2030052E14D
:1089F0001753A0030C00000A110000EA1743A0E37C
:108A0000050A84E24510A0E3111800EB010050E3D1
:108A1000FAFFFF0A010985E2761800EB0010A0E1D9
:108A2000FF1001E2050A85E26F1800EB010985E2FB
:108A30004410A0E3061800EB010050E330A81B0926
:108A4000EDFFFFEA1743A0E3080000EA010984E212
:108A5000681800EBFF0000E22C309FE5003093E542
:108A6000010053E30100009A020053E34FFEFF0BA5
:108A7000010984E24410A0E3F51700EB010050E384
:108A800030A81B09F0FFFFEA2802000414050004C7
:108A90000DC0A0E1F0DF2DE904B04CE224D04DE29E
:108AA0001000A0E30110A0E3D91300EB0208A0E33B
:108AB0000110A0E3D61300EB4C004BE2791600EB5B
:108AC0000170A0E34C404BE20050A0E30150C4E52C
:108AD00004A0A0E34CA04BE50260A0E30250C4E573
:108AE0000370C4E50580A0E1B450C4E11603A0E31F
:108AF000090A80E20410A0E1181600EB0400A0E1CE
:108B0000681600EB0170C4E50890A0E34C904BE5BB
:108B10000250C4E5B460C4E11603A0E3090A80E290
:108B20000410A0E10D1600EB44404BE20400A0E16C
:108B3000851700EB6030A0E3B4344BE10830E0E38C
:108B4000B2344BE1B0544BE1E13CA0E33C300BE5E7
:108B5000B8534BE1033CA0E3B6334BE11030A0E344
:108B6000B4334BE130600BE52C600BE51703A0E359
:108B7000050A80E2DE1600EB1703A0E3050A80E297
:108B80000410A0E1FA1600EB1703A0E3050A80E247
:108B90005010A0E30720A0E1831700EB1703A0E328
:108BA000050A80E20710A0E1781700EB1100A0E3AE
:108BB0000510A0E10A20A0E1451900EB1100A0E397
:108BC0000710A0E1971800EB70309FE5000093E5D7
:108BD0007BE5FFEB68309FE5000083E564309FE5AF
:108BE000000093E57D0F80E275E5FFEB58309FE5CF
:108BF000000083E554309FE50050C3E550309FE509
:108C0000005083E54C309FE50050C3E548309FE5B8
:108C10000070C3E544209FE50050C2E50C30A0E39E
:108C20000130C2E50490C2E50A30A0E30230C2E59B
:108C30000350C2E528009FE5370300EBF0AF1BE9C6
:108C400030020004A014000434020004A013000445
:108C500023050004280500042C0500042C02000450
:108C6000181300041CD001000DC0A0E1F0D92DE9BB
:108C700004B04CE21703A0E3050A80E21010A0E361
:108C8000871700EB000050E30500001A1703A0E36C
:108C9000050A80E24010A0E3811700EB000050E3DA
:108CA000F0A91B091703A0E3050A80E21010A0E356
:108CB000811700EB1703A0E3050A80E24010A0E350
:108CC0007D1700EB8C329FE5002093E51733A0E37E
:108CD000053A83E2030052E17C529F150060A01325
:108CE0002F00001A350000EA68429FE5000094E575
:108CF0004510A0E3561700EB010050E3FAFFFF0A0E
:108D00001703A0E3050A80E2BA1700EBFF4000E278
:108D10000030D5E5040053E303F19F97190000EA02
:108D2000348D0000408D0000488D0000508D000003
:108D3000688D00001B0054E31200001A050000EAD1
:108D40001B0054E3020000EA550054E3000000EA6F
:108D5000AA0054E30A00001A0030D5E5013083E28E
:108D60000030C5E5070000EA000054E30400001AE3
:108D70001733A0E3053A83E2D8219FE5003082E56E
:108D800040FEFFEB0060C5E5C8319FE5000093E5BC
:108D90001733A0E3053A83E2030050E10410A01169
:108DA0009117001B1703A0E3050A80E24410A0E31B
:108DB000271700EB010050E3F0A91B09C9FFFFEAE8
:108DC00098619FE598819FE598519FE5570000EADB
:108DD0001703A0E3050A80E2861700EBFF4000E2DC
:108DE00084119FE50020D1E5000052E323005403E5
:108DF0000500001A013082E20030C1E5FF3002E2D6
:108E00000340C8E7B040C5E1480000EA58119FE5BB
:108E10000020D1E5950052E30020A08348319F85D2
:108E20000020C3850020C6854000008A0D0054E361
:108E30000700000A013082E20030C1E5FF3002E2A3
:108E40000340C8E7B030D5E1043083E0B030C5E17D
:108E5000360000EA08E19FE50C319FE50070D3E59C
:108E6000FF4007E20E0084E0022050E5B030D5E17B
:108E7000033062E0B030C5E1012050E5B030D5E10B
:108E8000033062E0B030C5E1B030D5E1033AA0E193
:108E9000233AA0E1B030C5E1D0109FE5B020D5E184
:108EA0002233A0E13D3083E20030C1E5C0C09FE540
:108EB0003F2002E23D2082E20020CCE5022050E586
:108EC0000030D1E5020053E11300001A012050E503
:108ED0000030DCE5020053E10F00001A0130A0E38E
:108EE0000030C6E5032087E088309FE50020C3E519
:108EF0000D30A0E30430CEE70230DEE5520053E34C
:108F00000700001A6BFAFFEB571700EB68309FE57C
:108F10000FE0A0E103F0A0E1010000EA0030A0E3CF
:108F20000030C6E50020A0E33C309FE50020C3E50B
:108F30001703A0E3050A80E24410A0E3C41600EB87
:108F4000010050E3F0A91B090030D6E5000053E30F
:108F5000F0A91B199DFFFFEA28020004390500044F
:108F600023050004581200043405000436050004EB
:108F70003705000438050004240500043C02000401
:108F80000DC0A0E100D82DE904B04CE27C309FE593
:108F90000030D3E5000053E300A81B191703A0E33A
:108FA000050A80E24510A0E3A91600EB000050E39B
:108FB00000A81B1958309FE5B000D3E154309FE55D
:108FC0000030D3E7FF1003E20D0051E30100000A77
:108FD000960050E30500001A34309FE50020A0E31E
:108FE000B020C3E10120A0E320309FE50020C3E5CD
:108FF0001703A0E3050A80E2FB1600EB10209FE5B3
:10900000B030D2E1013083E2B030C2E100A81BE908
:109010002C02000432050004001400040DC0A0E17D
:1090200000D82DE904B04CE200C0A0E30C10A0E190
:109030000008A0E120085CE10D00002AC0209FE5A7
:109040002008A0E10C38A0E12338A0E10330D2E7EA
:10905000FF3003E2013083E00338A0E14318A0E1D0
:1090600001308CE20338A0E143C8A0E1230850E1BD
:10907000F3FFFF8A011AA0E1211AA0E180009FE519
:109080000C20A0E101308CE20338A0E143C8A0E14C
:109090000228A0E12228A0E10138A0E12318A0E1E4
:1090A000233BA0E13D3083E20230C0E701208CE2A7
:1090B0000C38A0E12338A0E13F1001E23D1081E22D
:1090C0000310C0E70228A0E12228A0E10D30A0E3B0
:1090D0000230C0E70010A0E328309FE50010C3E590
:1090E00024309FE50120A0E3B020C3E10110D0E7C8
:1090F000FF1001E21703A0E3050A80E2BA1600EBB5
:1091000000A81BE9001400042C020004320500042E
:109110000DC0A0E10C002DE9F0DD2DE90CB04CE212
:10912000FF0000E2FF1001E20440DBE500C0A0E325
:109130000C50A0E10C80A0E10CE0A0E100229FE532
:1091400001C08CE22330A0E30530C2E701308CE29D
:10915000611081E20C10C2E701C083E20300C2E7A4
:1091600008708BE2050054E10500000A008097E5D5
:10917000043087E2047083E200E093E5013044E2CA
:10918000FF4003E200005EE36900000AB0A19FE532
:109190000520A0E1013085E2FF5003E20210D8E78C
:1091A00001E05EE20030A0130130A003000054E3B0
:1091B0000030A00301300312000053E30600000A50
:1091C000008097E5043087E2047083E200E093E5D5
:1091D0000050A0E3013044E2FF4003E200005EE300
:1091E0000060A0031200000A0520A0E1013085E222
:1091F000FF5003E20260D8E701E05EE20030A01316
:109200000130A003000054E30030A003013003123A
:10921000000053E30600000A008097E5043087E26F
:10922000047083E200E093E50050A0E3013044E2E3
:10923000FF4003E200005EE30000A0031200000A0A
:109240000520A0E1013085E2FF5003E20200D8E7EB
:1092500001E05EE20030A0130130A003000054E3FF
:109260000030A00301300312000053E30600000A9F
:10927000008097E5043087E2047083E200E093E524
:109280000050A0E3013044E2FF4003E20C20A0E1E3
:1092900001308CE20338A0E143C8A0E10228A0E13C
:1092A0002228A0E12131A0E13D3083E20230CAE76B
:1092B0000C20A0E101308CE20338A0E143C8A0E11A
:1092C0000228A0E12228A0E1031001E22632A0E159
:1092D000013283E13D3083E20230CAE70C20A0E195
:1092E00001308CE20338A0E143C8A0E10228A0E1EC
:1092F0002228A0E10F1006E22033A0E1013183E132
:109300003D3083E20230CAE70C20A0E101308CE25C
:109310000338A0E143C8A0E10228A0E12228A0E18F
:109320003F3000E23D3083E20230CAE700005EE3F6
:1093300096FFFF1A0C08A0E12008A0E136FFFFEB22
:10934000F0AD1BE900140004F0412DE90370A0E327
:109350000760A0E114319FE50030D3E5063043E219
:10936000FF5013E23A00000A04819FE50620A0E1C5
:10937000013086E2FF6003E20240D8E73D4044E26C
:10938000FF4004E20620A0E1013086E2FF6003E234
:109390000200D8E73D0040E2FF1000E20620A0E115
:1093A000013086E2FF6003E20220D8E73D2042E27E
:1093B000FFC002E206E0A0E1013086E2FF6003E2C6
:1093C0000E30D8E73D3043E2FF3003E22112A0E146
:1093D000041181E1FF1001E20F0000E22CC1A0E1C5
:1093E00000028CE1032002E202C383E1013045E286
:1093F000FF5003E2FF0055E31500000A0730A0E12B
:10940000012087E2FF7002E20310C8E7013045E265
:10941000FF5003E2FF0055E30D00000A0730A0E112
:10942000012087E2FF7002E20300C8E7013045E255
:10943000FF5003E2FF0055E30500000A0720A0E10A
:10944000013087E2FF7003E202C0C8E7000055E385
:10945000C5FFFF1A1C209FE51C309FE5002083E517
:10946000032047E214309FE50020C3E5F081BDE80A
:1094700024050004581200045B12000428050004AF
:109480002C0500040DC0A0E110D82DE904B04CE279
:10949000D0339FE50030D3E5000053E310A81B094B
:1094A000C4339FE5002093E51733A0E3053A83E238
:1094B000030052E110A81B190030E0E3AC239FE544
:1094C0000030C2E59FFFFFEBA4239FE50130D2E50A
:1094D000630053E38100001A0230D2E5653043E2B5
:1094E000120053E303F19F977C0000EA38950000D7
:1094F000E0960000E0960000E0960000E096000094
:10950000E0960000E0960000E0960000E096000083
:10951000E096000044950000E0960000E096000010
:10952000E096000078950000E0960000CC950000E1
:10953000E0960000609600000120A0E334339FE530
:10954000650000EA30339FE5003093E50030D3E555
:10955000FF3003E2033183E08330A0E11C239FE569
:10956000003082E5000053E30120A01310339F1563
:109570005900001A590000EAFC329FE5004093E5CB
:1095800000339FE54B2FA0E3B020C3E10C30D4E5BE
:109590000D20D4E5023483E10E20D4E5023883E1C6
:1095A0000F20D4E5023C83E1010053E34B00001A95
:1095B000880400EB0400A0E1A60400EBC90400EB62
:1095C000C4329FE5000083E5440000EAA8329FE52D
:1095D000003093E50030D3E5010053E30A00000AB0
:1095E000020000CA000053E30300000A3B0000EA47
:1095F000020053E30A00000A380000EA1A0200EBF6
:109600001733A0E3063A83E2110000EA7C329FE5BB
:109610000A30D3E5014013E23000001A59FCFFEB99
:10962000040000EA64329FE50A30D3E5014013E20A
:109630002A00001A13FCFFEB54329FE52F40C3E5CC
:109640003040C3E53140C3E53240C3E51733A0E302
:10965000013983E210229FE5003082E51F0000EA15
:1096600014329FE5004093E50C30D4E50D20D4E59D
:10967000023483E10E20D4E5023883E10F20D4E5E3
:10968000023C93E10400001A520400EB950400EB45
:10969000F4319FE5000083E50D0000EA0C30D4E5CD
:1096A0000D20D4E5023483E10E20D4E5023883E1B5
:1096B0000F20D4E5023C83E1010053E30400001ACB
:1096C0000400A0E1630400EBB8319FE57D2FA0E327
:1096D000B020C3E10120A0E3B8319FE50020C3E53D
:1096E0008C319FE50230D3E5FF3003E2613043E285
:1096F000150053E303F19F97520000EA54970000CE
:109700007C97000048980000A0970000489800004F
:1097100048980000D4970000E097000048980000A7
:1097200048980000489800001C98000048980000E5
:1097300048980000489800004898000048980000A9
:109740004898000048980000489800004898000099
:109750003C98000040219FE51C319FE5003093E5D7
:109760000030D3E50030C2E50030D2E51F0053E3FE
:109770001F30A0830030C285320000EA1C419FE503
:10978000F4309FE5001093E50400A0E10B20A0E376
:109790006C3A00EB0920D4E504319FE5280000EA8B
:1097A000D4309FE5003093E50030D3E5FF3003E28D
:1097B000033183E08330A0E1E8209FE5003082E5BB
:1097C000000053E30120A013DC309F151C00001A99
:1097D0001C0000EA0120A0E3D0309FE5180000EA59
:1097E000CC109FE590309FE5002093E50030D1E557
:1097F0000020D2E5023083E10030C1E50030D1E540
:10980000000053E30020A013A8309F150020C315CB
:109810000120A0E3A0309FE5090000EA58309FE551
:10982000003093E50020D3E590309FE50020C3E5AC
:109830000120A0E388309FE5010000EA0120A0E3B9
:1098400080309FE50020C3E50020A0E328309FE59D
:10985000002083E570309FE50020C3E504309FE5DC
:109860000020C3E510A81BE923050004280200041A
:109870002D020004581200042005000428050004ED
:10988000340200041F0500044008000464050004BD
:10989000A8080004B8040004210500042402000400
:1098A000A813000431050004300200041D05000463
:1098B0001A050004F6030004220500041B05000439
:1098C000F50300041C050004190500042C05000420
:1098D0000DC0A0E130D82DE904B04CE2FF5000E209
:1098E0000A0055E30D00A003F8FFFF0B1743A0E3A8
:1098F000050A84E24510A0E3551400EB000050E394
:10990000FAFFFF1A1703A0E3050A80E20510A0E1A1
:10991000B51400EB0000A0E330A81BE90DC0A0E1E6
:1099200070D82DE904B04CE20040A0E1000050E303
:1099300070A81B090030D0E50300A0E1000053E34C
:1099400070A81B091733A0E3053A83E234209FE592
:10995000002092E5030052E170A81B1924609FE5E6
:109960001753A0E3055A85E2D8FFFFEB0100F4E5A9
:10997000000050E370A81B09003096E5050053E194
:1099800070A81B19F7FFFFEA280200040DC0A0E130
:1099900030D82DE904B04CE218D04DE250349FE5A8
:1099A0000030D3E5000053E330A81B0944349FE5A1
:1099B000002093E51733A0E3053A83E2030052E168
:1099C00030A81B1930449FE50020D4E5FF0052E386
:1099D0000D00000A0130A0E300308DE51C349FE546
:1099E000023283E004308DE51030A0E308308DE5CD
:1099F0004100A0E30210A0E30120A0E10430A0E1B7
:109A0000C2FDFFEB0030E0E30030C4E5F0439FE52A
:109A10000030D4E5000053E30B00000AD0339FE58B
:109A20000030D3E5000053E30700000A0120A0E363
:109A300000208DE54200A0E30210A0E30430A0E185
:109A4000B2FDFFEB0030A0E30030C4E5B4339FE586
:109A5000003093E5000053E30400000AA8339FE5BB
:109A6000000093E5DCE1FFEBFF0010E30300001AC8
:109A700098339FE50030D3E5000053E31200000A5D
:109A80006C339FE50030D3E5000053E30E00000A7D
:109A90004230A0E300308DE54400A0E30210A0E3D3
:109AA0000120A0E368339FE598FDFFEB54339FE569
:109AB000000093E5C2E1FFEB4C339FE5000083E536
:109AC0000020A0E344339FE50020C3E544439FE525
:109AD0000030D4E5000053E30C00000A10339FE58A
:109AE0000030D3E5000053E30800000A0B30A0E388
:109AF00000308DE54700A0E30210A0E30120A0E3C1
:109B000014339FE581FDFFEB0030A0E30030C4E596
:109B100008339FE50030D3E5000053E31D00000A41
:109B2000CC329FE50030D3E5000053E31900000A72
:109B300080DCFFEB0130A0E300308DE5E0429FE5E3
:109B40000030D4E5033183E0D8229FE5032182E091
:109B500004208DE51430A0E308308DE54800A0E333
:109B60000210A0E30120A0E10430A0E167FDFFEBBB
:109B70000030D4E5013083E20030C4E50030D4E5A4
:109B8000030053E30030A0830030C4850020A0E32D
:109B900088329FE50020C3E58C429FE50030D4E584
:109BA000000053E31400000A44329FE50030D3E57F
:109BB000000053E31000000A5EDCFFEB0120A0E38D
:109BC00000208DE564329FE504308DE508208DE5A9
:109BD00050329FE50C308DE55030A0E310308DE51C
:109BE0004C00A0E30210A0E30320A0E340329FE575
:109BF00046FDFFEB0030A0E30030C4E534429FE5B2
:109C00000030D4E5000053E30C00000AE0319FE58A
:109C10000030D3E5000053E30800000A0A30A0E357
:109C200000308DE55600A0E30210A0E30120A0E380
:109C300004329FE535FDFFEB0030A0E30030C4E5C2
:109C4000F8319FE5003093E5000053E30400000A7B
:109C5000EC319FE5000093E55FE1FFEBFF0010E3CF
:109C60000300001ADC319FE50030D3E5000053E328
:109C70001500000A78319FE50030D3E5000053E37A
:109C80001100000AC0319FE5C0219FE50020D2E508
:109C90004D20C3E55620A0E300208DE54F00A0E352
:109CA0000210A0E30120A0E318FDFFEB8C319FE53B
:109CB000000093E542E1FFEB84319FE5000083E57E
:109CC0000020A0E37C319FE50020C3E580419FE5B3
:109CD0000030D4E5000053E30C00000A10319FE58A
:109CE0000030D3E5000053E30800000A1930A0E378
:109CF00000308DE54500A0E30210A0E30120A0E3C1
:109D000050319FE501FDFFEB0030A0E30030C4E5DA
:109D100044519FE50030D5E5000053E32100000ADF
:109D2000CC309FE50030D3E5000053E31D00000A6E
:109D300028019FE51130D0E5030053E31900009A94
:109D40001C119FE5700400EB14319FE50040A0E377
:109D5000012084E30C20C3E50D40C3E50E40C3E5BC
:109D60000F40C3E50010E0E31010C3E51110C3E598
:109D70001220C3E53C10A0E31310C3E51440C3E573
:109D80001540C3E51640C3E51740C3E51840C3E5D9
:109D90002110A0E300108DE57300A0E30210A0E302
:109DA000DAFCFFEB0040C5E5B8409FE50030D4E5A4
:109DB000000053E330A81B0934309FE50030D3E5A1
:109DC000000053E330A81B099E0200EB14304BE265
:109DD000010063E50120A0E300208DE55700A0E32A
:109DE0000210A0E3C9FCFFEB0030A0E30030C4E5A3
:109DF00030A81BE92C0200042802000424020004FD
:109E000054AF01003105000430020004A014000426
:109E10001D050004B81300041A050004A81300046B
:109E20001B05000422050004000000041C050004BA
:109E300050000004F5030004190500041813000481
:109E400034020004A01300041F05000400120004E3
:109E5000C00300042005000468080004180500047D
:109E6000B8040004F0120004210500040DC0A0E1B4
:109E7000F0D92DE904B04CE224D04DE23C019FE53D
:109E8000A5FEFFEB2000A0E30110A0E3E00E00EB35
:109E90000207A0E30110A0E3DD0E00EB44004BE25B
:109EA000801100EB0160A0E344404BE20050A0E3CE
:109EB0000150C4E50430A0E344304BE50270A0E358
:109EC0000250C4E50360C4E50580A0E1B450C4E1DC
:109ED0001603A0E30B0A80E20410A0E11F1100EBBF
:109EE0000208A0E30610A0E1C90E00EB0400A0E107
:109EF0006C1100EB0160C4E544604BE50250C4E521
:109F0000B470C4E11603A0E3090A80E20410A0E1E2
:109F1000121100EB3C404BE20400A0E18A1200EB7E
:109F20006030A0E3BC334BE10830E0E3BA334BE1EF
:109F3000B8534BE1E13CA0E334300BE5B0534BE1C7
:109F4000033CA0E3BE324BE11030A0E3BC324BE156
:109F500028700BE524700BE51703A0E3060A80E2E6
:109F6000E31100EB1703A0E3060A80E20410A0E16E
:109F7000FF1100EB1703A0E3060A80E25010A0E3F4
:109F80000620A0E1881200EB1703A0E3060A80E296
:109F90000610A0E17D1200EB1200A0E30510A0E185
:109FA0000920A0E34A1400EB1200A0E30610A0E190
:109FB0009C1300EB08009FE557FEFFEBF0A91BE99F
:109FC00030D0010060CB01000DC0A0E1F0D82DE938
:109FD00004B04CE208D04DE2C4009FE54EFEFFEB1A
:109FE0001200A0E30010A0E38E1300EB1703A0E320
:109FF000060A80E20010A0E3641200EB1703A0E35E
:10A00000060A80E2BA1100EB2000A0E30010A0E3F2
:10A010007F0E00EB0207A0E30110A0E37C0E00EB33
:10A0200024004BE21F1100EB0170A0E324404BE23F
:10A030000050A0E30150C4E50430A0E324304BE518
:10A040000250C4E50350C4E50560A0E1B450C4E18A
:10A050001603A0E30B0A80E20410A0E1BF1000EB9E
:10A060000208A0E30710A0E1690E00EB0400A0E1E4
:10A070000C1100EB0150C4E524704BE50250C4E51F
:10A080000350C4E5B450C4E11603A0E3090A80E21A
:10A090000410A0E1B11000EB08009FE51EFEFFEBED
:10A0A000F0A81BE944D0010060CB01000DC0A0E185
:10A0B00030D82DE904B04CE21703A0E3060A80E291
:10A0C0001010A0E3761200EB000050E30500001A28
:10A0D0001703A0E3060A80E24010A0E3701200EB31
:10A0E000000050E330A81B091703A0E3060A80E232
:10A0F0001010A0E3701200EB1703A0E3060A80E241
:10A100004010A0E36C1200EB88309FE5002093E53F
:10A110001733A0E3063A83E2030052E11753A0038A
:10A120000C00000A110000EA1743A0E3050A84E2CC
:10A130004510A0E3461200EB010050E3FAFFFF0ACE
:10A14000060A85E2AB1200EB0010A0E1FF1001E26D
:10A15000050A85E2A41200EB060A85E24410A0E39A
:10A160003B1200EB010050E330A81B09EDFFFFEAB2
:10A170001743A0E3010000EA060A84E29D1200EB07
:10A18000060A84E24410A0E3311200EB010050E320
:10A1900030A81B09F7FFFFEA280200040030A0E303
:10A1A0000030C0E5283080E52C3080E53030C0E557
:10A1B0003A30C0E50100A0E30EF0A0E10DC0A0E13F
:10A1C00070D82DE904B04CE20050A0E10140A0E1BC
:10A1D0000060A0E3060051E10600A00170A81B0981
:10A1E0000100A0E1ECFFFFEB0500A0E16110A0E39E
:10A1F00098EDFFEB0030A0E12C0084E5000050E377
:10A200000500000A0160A0E3286084E510009FE5D6
:10A21000F610A0E30620A0E112EFFFEB0600A0E19C
:10A2200070A81BE954B101000DC0A0E170D82DE960
:10A2300004B04CE20040A0E10160A0E3000050E364
:10A2400070A81B09283090E5000053E32000000AA5
:10A250000050A0E3283094E5020053E30900000A0F
:10A260000200008A010053E30B00000A140000EA18
:10A27000030053E31200001A0400A0E14E0000EBBB
:10A280000230A0E3020000EA0400A0E1250000EB98
:10A290000130A0E3283084E50A0000EA2C3094E580
:10A2A000000053E30600000A2C009FE51510A0E310
:10A2B0000120A0E3EBEEFFEB2C0094E510EEFFEBAA
:10A2C0000160A0E3285084E5283094E5000053E3C2
:10A2D000DFFFFF1A0600A0E170A81BE94CB20100E5
:10A2E0000DC0A0E110D82DE904B04CE20040A0E37D
:10A2F0002CC091E504005CE10700000A0230A0E3F5
:10A30000283081E50140A0E314009FE54610A0E35A
:10A310000420A0E10C30A0E1D2EEFFEB0400A0E1AC
:10A3200010A81BE964B201000DC0A0E110D82DE90E
:10A3300004B04CE20040A0E3283090E5020053E373
:10A340000800001A2C3090E5040053E10500000AD3
:10A350000140A0E3284080E510009FE50E10A0E337
:10A360000420A0E1BFEEFFEB0400A0E110A81BE970
:10A37000ACB201000DC0A0E100D82DE904B04CE260
:10A380000030A0E32CC090E503005CE10700000A68
:10A390000330A0E3283080E518009FE56810A0E3B3
:10A3A0000120A0E30C30A0E1AEEEFFEB0130A0E312
:10A3B0000300A0E100A81BE9BCB201000DC0A0E1B0
:10A3C00000D82DE904B04CE20030A0E32CC090E5A9
:10A3D00003005CE10700000A0230A0E3283080E5BA
:10A3E00018009FE52110A0E30120A0E30C30A0E1BC
:10A3F0009CEEFFEB0130A0E30300A0E100A81BE905
:10A4000028B301000DC0A0E1F0D92DE904B04CE261
:10A4100034D04DE20060A0E10170A0E10000A0E3B3
:10A42000000056E100005111F0A91B090C30D6E5DF
:10A430000D20D6E5023483E10E20D6E5023883E113
:10A440000F20D6E5023C93E1F0A91B0998819FE516
:10A450000C30D8E50D20D8E5023483E10E20D8E594
:10A46000023883E10F20D8E5023C93E1F0A91B09F3
:10A47000283091E5030053E3F0A91B192C3091E536
:10A48000000053E3F0A91B090020D6E50130D6E512
:10A49000032482E10230D6E5032882E10330D6E5C9
:10A4A000032C82E144519FE59502C1E0C23FA0E147
:10A4B00041EB63E08E326EE0033363E083318EE084
:10A4C000033183E083C342E000005CE300C06CB270
:10A4D00054404BE20400A0E114119FE50E20A0E1DE
:10A4E0000C30A0E1023700EB0400A0E12C1097E54E
:10A4F0008FEEFFEB0420D6E50530D6E5032482E19C
:10A500000630D6E5032882E10730D6E5032C82E148
:10A510009532C1E0C23FA0E141EB63E08E326EE0D4
:10A52000033363E083318EE0033183E083C342E091
:10A5300000005CE300C06CB20400A0E1B4109FE531
:10A540000E20A0E10C30A0E1E93600EB0400A0E110
:10A550002C1097E576EEFFEB0810D6E50930D6E52E
:10A56000031481E10A30D6E5031881E10B30D6E50A
:10A57000031C81E10830D8E50920D8E5023483E1E5
:10A580000A20D8E5023883E10B20D8E5023C83E1BC
:10A59000011063E0000051E30010A0B358309FE5C4
:10A5A0009301C2E0C13FA0E142E363E08E326EE07E
:10A5B00003318EE083C141E000005CE300C06CB277
:10A5C00054404BE20400A0E130109FE50E20A0E1D2
:10A5D0000C30A0E1C63600EB0400A0E12C1097E59A
:10A5E00053EEFFEB0100A0E3F0A91BE950050004C6
:10A5F0006BCA5F6B58D0010068D00100D34D621068
:10A6000074D001000DC0A0E130D82DE904B04CE2B7
:10A610000050A0E10140A0E1283091E5030053E3A0
:10A620002200000A283094E5010053E30B00000AE1
:10A630000200003A020053E30F00000A150000EA8E
:10A640000400A0E1D4FEFFEB74009FE50410A0E13C
:10A65000D9FEFFEBFF0010E20130A013040000EA76
:10A6600060009FE50410A0E11CFFFFEBFF0010E27B
:10A670000230A0130500001A070000EA0400A0E160
:10A680003BFFFFEBFF0010E20300000A0330A0E3F2
:10A69000283084E5000000EA0100A0E3010050E357
:10A6A00030A81B19283094E5030053E3DCFFFF1AA0
:10A6B0000500A0E10410A0E151FFFFEBFF0000E264
:10A6C00030A81BE980D001008CD00100FF2002E2FD
:10A6D000000050E30EF0A001001080E50030A0E380
:10A6E0000430C0E5081080E50C1080E50520C0E5C9
:10A6F0000100A0E30EF0A0E1FF1001E20420D0E58C
:10A700000530D0E5030052E10000A0230EF0A021A7
:10A710000C3090E50110C3E40520D0E5001090E571
:10A72000012082E0020053E10130A0210C3080E5DD
:10A730000430D0E5013083E20430C0E50100A0E33D
:10A740000EF0A0E1000051E3000050130000A00350
:10A750000EF0A0010430D0E5000053E30300A00197
:10A760000EF0A001082090E50130D2E40030C1E5F0
:10A770000530D0E5001090E5013083E0030052E1A0
:10A780000120A021082080E50430D0E5013043E21B
:10A790000430C0E50100A0E30EF0A0E10DC0A0E18F
:10A7A00000D82DE904B04CE20430D0E5000053E3BA
:10A7B000FEFFFF0AE2FFFFEBFF0000E200A81BE93B
:10A7C0000DC0A0E100D82DE904B04CE2010000EB7F
:10A7D000FF0000E200A81BE90020A0E354309FE541
:10A7E0000020C3E550309FE50020C3E54C309FE5D5
:10A7F0003920C3E53820C3E50210A0E140C09FE541
:10A800000200A0E1813281E00C3083E00C2083E281
:10A810000C00C3E50100C2E50200C2E50300C2E589
:10A82000013081E2FF1003E2130051E30100A08335
:10A830000EF0A081F2FFFFEA3C0500043D05000494
:10A8400000120004A814000404309FE50000D3E5C2
:10A850000EF0A0E13D0500040DC0A0E130D82DE9C7
:10A8600004B04CE20010A0E16C509FE50000D5E57B
:10A87000130050E30000A08330A81B89FF0000E212
:10A88000800280E054409FE5040080E02120A0E3A6
:10A890002C3600EB0000D5E5FF3000E2833283E088
:10A8A000043083E00C1083E20020A0E301C082E3C7
:10A8B0000CC0C3E50120C1E50220C1E50320C1E5CC
:10A8C000010080E20000C5E50020D5E510309FE5DD
:10A8D0003920C3E50C00A0E130A81BE93D050004C8
:10A8E000A8140004001200040020A0E320309FE51B
:10A8F0000020C3E51C309FE53820C3E518309FE5F4
:10A900000030D3E5020053E110009FE50200A001F2
:10A910000EF0A0E13C050004001200043D05000417
:10A92000A814000434109FE50030D1E5012083E233
:10A930002C309FE50030D3E5030052E10020C1B583
:10A940000030D1B51C209FB53830C2B5833283B0FA
:10A9500014209FB5020083B00000A0A30EF0A0E178
:10A960003C0500043D05000400120004A814000486
:10A970000DC0A0E130D82DE904B04CE290349FE541
:10A980000830D3E5630053E34300008A84349FE535
:10A990000030D3E5000053E37C349F150020A01362
:10A9A0000110821370349F050020A003031082035E
:10A9B0002610C3E52720C3E52820C3E52920C3E5E9
:10A9C00054349FE50020A0E30020C3E50120C3E547
:10A9D0000220C3E53D1082E30310C3E50420C3E574
:10A9E0000520C3E5020052E169C0A00302C0A01126
:10A9F0000CC0E0E106C0C3E542E082E307E0C3E546
:10AA00000820C3E50920C3E5020052E14B00A00382
:10AA10000200A0110000E0E10A00C3E53E1082E35D
:10AA20000B10C3E50C20C3E50D20C3E50EC0C3E544
:10AA30000FE0C3E51020C3E51120C3E51200C3E514
:10AA400013E0C3E51420C3E51520C3E51620C3E5D4
:10AA50001720C3E50610A0E31810C3E50810A0E313
:10AA60001910C3E51A20C3E51B20C3E51C20C3E56C
:10AA70001D20C3E51E20C3E51F20C3E52020C3E53C
:10AA80002120C3E57D1082E32210C3E52320C3E526
:10AA90002420C3E52520C3E5BC0000EA74339FE50C
:10AAA0000030D3E5000053E30D00001A6C339FE53E
:10AAB0000930D3E5310053E35C339F950020A09328
:10AAC000021082930900009A50339FE50930D3E5C4
:10AAD000B30053E340339F850020A083031082839B
:10AAE0000200008A30339FE50020A0E3011082E3DA
:10AAF0002610C3E52720C3E52820C3E52920C3E5A8
:10AB000014539FE514339FE5DA40D3E10400A0E13C
:10AB1000C72E00EB000054E34314A0B3021581B22A
:10AB20008F2D00BB1F2F00EBB12F8FE20C0092E89E
:10AB30004C3100EB2D3300EB0000C5E52034A0E1E3
:10AB40000130C5E52038A0E10230C5E5203CA0E198
:10AB50000330C5E5C0529FE5C0329FE5DB40D3E13D
:10AB60000400A0E1B22E00EB000054E34314A0B3B4
:10AB7000021581B27A2D00BB0A2F00EB9E2F8FE2C7
:10AB80000C0092E8373100EB183300EB0400C5E508
:10AB90002034A0E10530C5E52038A0E10630C5E548
:10ABA000203CA0E10730C5E56C529FE56C329FE583
:10ABB000DC40D3E10400A0E19D2E00EB000054E353
:10ABC0004314A0B3021581B2652D00BBF52E00EB36
:10ABD0008B2F8FE20C0092E81F3000EB033300EB69
:10ABE0000800C5E52034A0E10930C5E52038A0E122
:10ABF0000A30C5E5203CA0E10B30C5E518529FE5C1
:10AC000018329FE5DD40D3E10400A0E1882E00EB7F
:10AC1000000054E34314A0B3021581B2502D00BBD1
:10AC2000E02E00EB1D2E8FE20C0092E80D3100EBC0
:10AC3000EE3200EB0C00C5E52034A0E10D30C5E597
:10AC40002038A0E10E30C5E5203CA0E10F30C5E57D
:10AC5000C4519FE5C4319FE5DD40D3E10400A0E18C
:10AC6000732E00EB000054E34314A0B3021581B22D
:10AC70003B2D00BB1000C5E52034A0E11130C5E537
:10AC80002038A0E11230C5E5203CA0E11330C5E535
:10AC900084519FE584319FE5DE40D3E10400A0E1CB
:10ACA000632E00EB000054E34314A0B3021581B2FD
:10ACB0002B2D00BB1400C5E52034A0E11530C5E5FF
:10ACC0002038A0E11630C5E5203CA0E11730C5E5ED
:10ACD00044219FE544119FE50F30D1E51830C2E5CE
:10ACE0001030D1E51930C2E50250A0E1D241D1E1E6
:10ACF0000400A0E14E2E00EB000054E34314A0B387
:10AD0000021581B2162D00BBA62E00EBF8208FE2B3
:10AD10000C0092E8D33000EBB43200EB1A00C5E52A
:10AD20002034A0E11B30C5E52038A0E11C30C5E58A
:10AD3000203CA0E11D30C5E5DC109FE5DC009FE56F
:10AD40001130D0E5033183E0033183E00331A0E12A
:10AD50001E30C1E52324A0E11F20C1E52328A0E186
:10AD60002020C1E5233CA0E12130C1E51530D0E52C
:10AD70008330A0E12230C1E52324A0E12320C1E5F6
:10AD80000020A0E32420C1E5233CA0E12530C1E55B
:10AD900084109FE52630D1E52720D1E5023483E1F8
:10ADA0002820D1E5023883E12920D1E5023C83E166
:10ADB0006C209FE5002092E5020053E164309F156E
:10ADC0006420A013B020C3114C109FE52630D1E5BC
:10ADD0002720D1E5023483E12820D1E5023883E140
:10ADE0002920D1E5023C83E134209FE5003082E553
:10ADF00030A81BE90000A940000000003333F33FF6
:10AE0000333333330000703F00000000000059402E
:10AE100000000000A8080004C50300046017000437
:10AE200028080004680500044008000474109FE529
:10AE30002F30D1E53020D1E5023483E13120D1E556
:10AE4000023883E13220D1E5023C93E11300000A8D
:10AE50001230D1E5030053E31000001A1030D1E5A1
:10AE6000010013E30D00000A1130D1E538209FE501
:10AE70001820D2E5020053E10300002A2C309FE5A0
:10AE80000030D3E5000053E30400000A0120A0E3F2
:10AE900018309FE50020C3E50200A0E10EF0A0E11C
:10AEA0000000A0E30EF0A0E1B80400046017000465
:10AEB0006C05000448109FE5D030D1E1000053E359
:10AEC000003063B23C209FE5D921D2E1020053E17A
:10AED000040000CAD130D1E1000053E3003063B276
:10AEE000020053E1040000DA18309FE5D931D3E1C4
:10AEF000000053E30100A0C30EF0A0C10000A0E3D6
:10AF00000EF0A0E1A80800046017000401C0A0E151
:10AF10000010A0E301005CE1010050110100A0015C
:10AF20000EF0A0010C30D0E50D20D0E5023483E115
:10AF30000E20D0E5023883E10F20D0E5023C93E1FA
:10AF40003000000A0030D0E50120D0E5023483E172
:10AF50000220D0E5023883E10320D0E5023C83E102
:10AF60000010A0E30030CCE52324A0E10120CCE5D3
:10AF70002328A0E10220CCE5233CA0E10330CCE56E
:10AF80000430D0E50520D0E5023483E10620D0E589
:10AF9000023883E10720D0E5023C83E10430CCE5B0
:10AFA0002324A0E10520CCE52328A0E10620CCE560
:10AFB000233CA0E10730CCE50830D0E50920D0E5FE
:10AFC000023483E10A20D0E5023883E10B20D0E58A
:10AFD000023C83E10830CCE52324A0E10920CCE544
:10AFE0002328A0E10A20CCE5233CA0E10B30CCE5EE
:10AFF000013081E30C30CCE50D10CCE50E10CCE532
:10B000000F10CCE50310A0E10100A0E10EF0A0E1DB
:10B01000000050E30000A0030EF0A0010030A0E308
:10B020000030C0E50130C0E50230C0E50330C0E5C6
:10B030000430C0E50530C0E50630C0E50730C0E5A6
:10B040000830C0E50930C0E50A30C0E50B30C0E586
:10B050000C30C0E50D30C0E50E30C0E50F30C0E566
:10B060000100A0E30EF0A0E11C209FE50030A0E36A
:10B070000030C2E50130C2E50230C2E50330C2E56E
:10B080000430C2E50530C2E50EF0A0E1401700042F
:10B090000DC0A0E100D82DE904B04CE244009FE5CA
:10B0A0001DFAFFEB88F3FFEBEEFFFFEB38009FE5A7
:10B0B000D6FFFFEB34009FE5D4FFFFEB0020A0E3B9
:10B0C0002C309FE5002083E5BCFDFFEB05FEFFEB88
:10B0D00020309FE5000083E524FEFFEB18009FE58C
:10B0E0000DFAFFEB00A81BE998D001004005000411
:10B0F00050050004600500046405000460CB0100F5
:10B100000DC0A0E170D82DE904B04CE20160A0E1CF
:10B11000A42D00EB0150A0E10040A0E10600A0E159
:10B12000A02D00EB0130A0E10020A0E10510A0E17E
:10B130000400A0E1F21E00EB40208FE20C0092E838
:10B14000C82F00EB463100EB430F60E2020080E2C3
:10B15000B634A0E3B63A83E2B73083E29023C3E08B
:10B16000003083E0C02FA0E1433462E0833083E00D
:10B17000033263E0833140E00300A0E170A81BE9E3
:10B1800046DF913F399D52A20DC0A0E1F0D92DE9D3
:10B1900004B04CE20060A0E10180A0E10270A0E1F7
:10B1A000000090E5FE3000EB0150A0E10040A0E17E
:10B1B000000098E5FA3000EB0130A0E10020A0E1AA
:10B1C0000510A0E10400A0E1CE1E00EB243100EB4D
:10B1D0000040A0E1000050E307005011F0A91BD986
:10B1E000003096E5930700E00410A0E19F2900EBF2
:10B1F000000086E5003098E5930700E00410A0E128
:10B200009A2900EB000088E5F0A91BE90DC0A0E138
:10B21000F0DB2DE904B04CE20070A0E10160A0E198
:10B22000000051E300005013D100000A0C30D0E5BB
:10B230000D20D0E5023483E10E20D0E5023883E111
:10B240000F20D0E5023C93E1C900000A0C30D1E5A3
:10B250000D20D1E5023483E10E20D1E5023883E1EF
:10B260000F20D1E5023C93E1C100000A0000D0E5C7
:10B270000130D7E5030480E10230D7E5030880E11F
:10B280000330D7E5030C80E1C53000EB0D2D8FE2D4
:10B290000C0092E8702E00EB0150A0E10040A0E10C
:10B2A0000000D6E50130D6E5030480E10230D6E5A2
:10B2B000030880E10330D6E5030C80E1B83000EBF1
:10B2C000C32F8FE20C0092E8632E00EB0130A0E167
:10B2D0000020A0E10510A0E10400A0E1312E00EB68
:10B2E0000190A0E10080A0E1BB2F8FE20C0092E86A
:10B2F000363000EB000050E3050000DA0910A0E151
:10B300000800A0E1B62F8FE20C0092E8252E00EB9A
:10B310000B0000EA0910A0E10800A0E1B22F8FE2C3
:10B320000C0092E8773000EB000050E3060000AA22
:10B330000910A0E10800A0E1A92F8FE20C0092E81B
:10B34000002E00EB0190A0E10080A0E10400D6E512
:10B350000530D6E5030480E10630D6E5030880E138
:10B360000730D6E5030C80E18D3000EB262E8FE20E
:10B370000C0092E8382E00EB9D2F8FE20C0092E833
:10B38000352E00EBDF1D00EB0130A0E10020A0E135
:10B390000910A0E10800A0E12F2E00EB0190A0E130
:10B3A0000080A0E10400D7E50530D7E5030480E183
:10B3B0000630D7E5030880E10730D7E5030C80E1CC
:10B3C000773000EB822F8FE20C0092E8222E00EB08
:10B3D0000150A0E10040A0E10400D6E50530D6E52B
:10B3E000030480E10630D6E5030880E10730D6E5A6
:10B3F000030C80E16A3000EB752F8FE20C0092E8BD
:10B40000152E00EB0130A0E10020A0E10510A0E125
:10B410000400A0E1E32D00EB0160A0E10050A0E1F9
:10B42000DC419FE50030A0E30030C4E50130C4E515
:10B430000230C4E50330C4E56F2F8FE20C0092E8C0
:10B44000052E00EB863000EB0400C4E52034A0E1BB
:10B450000530C4E52038A0E10630C4E5200CA0E1A9
:10B460000700C4E50910A0E10800A0E1622F8FE207
:10B470000C0092E8F82D00EB793000EB0800C4E5F1
:10B480002034A0E10930C4E52038A0E10A30C4E549
:10B49000200CA0E10B00C4E50910A0E10800A0E128
:10B4A0000630A0E10520A0E1161E00EB522F8FE22E
:10B4B0000C0092E8E82D00EB693000EB1000C4E5C9
:10B4C0002034A0E11130C4E52038A0E11230C4E5F9
:10B4D000200CA0E11300C4E51020D4E51130D4E520
:10B4E000032482E11230D4E5032882E11330D4E54D
:10B4F000033C92E10C30C4050D30C4050E30C40588
:10B500000F30C4051100000AF4409FE50610A0E1C9
:10B510000500A0E1B53000EB0050A0E10910A0E16A
:10B520000800A0E1B13000EB0010A0E10500A0E1AF
:10B53000F2FEFFEB0C00C4E52034A0E10D30C4E5C1
:10B540002038A0E10E30C4E5200CA0E10F00C4E5D6
:10B55000AC309FE50020A0E3011082E30010C3E5BA
:10B560000120C3E50220C3E50320C3E50100A0E1FB
:10B57000F0AB1BE988209FE50030A0E30430C2E572
:10B580000530C2E50630C2E50730C2E50830C2E545
:10B590000930C2E50A30C2E50B30C2E51030C2E521
:10B5A0001130C2E51230C2E51330C2E50C30C2E5FD
:10B5B0000D30C2E50E30C2E50F30C2E50030C2E505
:10B5C0000130C2E50230C2E50330C2E50300A0E16C
:10B5D000F0AB1BE9F2D77A3E000000A00080664085
:10B5E000000000000080764000000000008066C07F
:10B5F0000000000046DF913F399D52A27035654141
:10B60000000000A0481700040DC0A0E1F0DF2DE904
:10B6100004B04CE224D04DE20030A0E334300BE51E
:10B6200038300BE53C300BE540300BE544300BE5A2
:10B6300048300BE57C179FE52F30D1E53020D1E570
:10B64000023483E13120D1E5023883E13220D1E5B3
:10B65000023C83E1010053E32500000A0200003AA6
:10B66000020053E31600000A1E0500EA0020A0E3D2
:10B67000E8369FE5002083E56C379FE5002083E5F1
:10B680005C379FE5002083E5D4369FE5002083E505
:10B6900060379FE5002083E55C379FE5002083E568
:10B6A00028379FE5002083E524379FE5002083E5C8
:10B6B00020379FE5002083E51C379FE5002083E5C8
:10B6C000080500EA9C369FE5000093E5C2DAFFEB2F
:10B6D000FF0010E30305000AD8269FE50030A0E331
:10B6E0002F30C2E53030C2E53130C2E53230C2E53C
:10B6F000FC0400EA9DFCFFEB960FA0E3B0DAFFEB41
:10B7000060369FE5000083E55C269FE5003092E50A
:10B71000013083E2003082E550169FE594469FE5B4
:10B720001730D4E51820D4E5023483E12C30C1E58C
:10B730002334A0E12D30C1E51B30D4E51C20D4E535
:10B74000023483E12E30C1E52334A0E12F30C1E57E
:10B750001130D4E54030C1E50030A0E34130C1E50F
:10B76000B1FDFFEBFF0010E37904000A1730D4E5C8
:10B770001820D4E5023483E11920D4E5023883E1AE
:10B780001A20D4E5023C83E154269FE5003082E58F
:10B790001B30D4E51C20D4E5023483E11D20D4E520
:10B7A000023883E11E20D4E5023C83E138269FE580
:10B7B000003082E52330D4E52420D4E5023483E14F
:10B7C0002520D4E5023883E12620D4E5023C83E13C
:10B7D0008C259FE5003082E594359FE50A30D3E55E
:10B7E000080013E30800001AAC159FE50C30D1E502
:10B7F0000D20D1E5023483E10E20D1E5023883E14A
:10B800000F20D1E5023C93E10D00001AA4059FE54D
:10B8100084159FE5BCFDFFEBFF0010E30500000A67
:10B8200050359FE5AF0FA0E3B000C3E168059FE589
:10B8300044159FE5B4FDFFEB2AFCFFEB3C359FE58B
:10B84000000083E55C159FE52630D1E52720D1E592
:10B85000023483E12820D1E5023883E12920D1E5B3
:10B86000023C83E1030053E303F19F97280100EAC0
:10B8700014BD000080B80000A0B80000E0BA0000CD
:10B880001C259FE54C30D2E50630C3E34C30C2E5C1
:10B890004C30D2E5013083E34C30C2E51C0100EAB4
:10B8A000FC249FE54C30D2E50530C3E34C30C2E5C3
:10B8B0004C30D2E5023083E34C30C2E509FCFFEBAB
:10B8C000B8349FE5000083E5D8149FE52230D1E528
:10B8D0002320D1E5023483E12420D1E5023883E13D
:10B8E0002520D1E5023C83E170249FE5003082E50C
:10B8F0007C349FE50830D3E5630053E30020A09338
:10B90000E8349F95002083950800009A68FDFFEBBE
:10B91000FF0010E30500000A1420A0E3CC349FE5EB
:10B92000002083E58C049FE554149FE576FDFFEB32
:10B93000B8249FE5003092E5000053E340249F05C2
:10B94000F000000A130053E31430A0830030828516
:10B9500098049FE5003090E5020053E30A00009A46
:10B9600050149FE52330D1E52420D1E5023483E152
:10B970002520D1E5023883E12620D1E5023C83E190
:10B98000950053E30230A093003080955C349FE52E
:10B99000003093E5010053E3D8339F05C810A0039E
:10B9A000B010C30144449FE5000094E5FC2E00EB79
:10B9B000003094E5000053E3392E8FB20C0092B8AA
:10B9C000602C00BBE32F8FE20C0092E8A62E00EB68
:10B9D000000050E3110000BAC8539FE5A4339FE56F
:10B9E000D341D3E10400A0E1112B00EB000054E3AC
:10B9F0004314A0B3021581B2D92900BB0020A0E3F3
:10BA00000C00C5E52034A0E10D30C5E52038A0E1EB
:10BA10000E30C5E5203CA0E10F30C5E5200000EA6E
:10BA200080439FE50C30D4E50D20D4E5023483E15A
:10BA30000E20D4E5023883E10F20D4E5025C83E1D7
:10BA4000A8339FE5002093E53C339FE592C383E054
:10BA50002332A0E1013073E20200004A0300A0E1BA
:10BA6000F32A00EB040000EA010003E2A30080E1F6
:10BA7000EF2A00EB0010A0E1B92900EB0510A0E1CE
:10BA8000F82900EB0020A0E30C00C4E52034A0E17D
:10BA90000D30C4E52038A0E10E30C4E5203CA0E123
:10BAA0000F30C4E5FC329FE50420C3E50520C3E563
:10BAB0000620C3E50720C3E51020C3E51120C3E538
:10BAC0001220C3E51320C3E50820C3E50920C3E520
:10BAD0000A20C3E50B20C3E50020A0E3890000EAAB
:10BAE000BC229FE54C30D2E50330C3E34C30C2E5C5
:10BAF0004C30D2E5043083E34C30C2E5A4129FE51C
:10BB00002230D1E52320D1E5023483E12420D1E5A0
:10BB1000023883E12520D1E5023C83E13C229FE508
:10BB2000003082E554529FE5001095E5000051E396
:10BB30005700000A0C20D1E50D30D1E5032482E145
:10BB40000E30D1E5032882E10F30D1E5034C92E1BC
:10BB50000700001A72FBFFEB000085E52C329FE521
:10BB60000040C3E50C329FE5FFE0A0E3B0E0C3E195
:10BB7000470000EA04329FE5001093E510329FE58C
:10BB8000003093E5030051E10800001A0C30D1E5C4
:10BB90000D20D1E5023483E10E20D1E5023883E1A6
:10BBA0000F20D1E5023C83E1010053E30600001AB7
:10BBB000C8319FE5002093E5D4319FE5002083E55F
:10BBC0000020A0E3C4319FE50020C3E5F0119FE50C
:10BBD0000030D1E50120D1E5023483E10220D1E536
:10BBE000023883E10320D1E5023C93E11A00000A08
:10BBF00098019FE50030D0E5000053E31600001ADD
:10BC00001020D1E51130D1E5032482E11230D1E5D5
:10BC1000032882E11330D1E5032C82E15C319FE5FA
:10BC2000001093E51230D1E5033183E0033183E066
:10BC3000030152E1080000AA0130A0E30030C0E592
:10BC40001330D1E5830263E0000183E08001A0E1CD
:10BC50005BD9FFEB3C319FE5000083E52C419FE57C
:10BC60000030D4E5000053E30900000A24319FE5C9
:10BC7000000093E558D9FFEBFF0010E30400000A31
:10BC800027FBFFEBF4309FE5000083E50030A0E3E5
:10BC90000030C4E5E4409FE5003094E5000053E344
:10BCA0000400000A0C019FE5D4109FE596FCFFEB11
:10BCB000002094E5130000EADC109FE50C30D1E58C
:10BCC0000D20D1E5023483E10E20D1E5023883E175
:10BCD0000F20D1E5023C93E10600001AA0309FE559
:10BCE000C8209FE5003082E588309FE5FF00A0E393
:10BCF000B000C3E10E0000EAB8009FE580109FE5A8
:10BD000081FCFFEB90209FE5A0309FE5002083E5BC
:10BD1000070000EA0040A0E340309FE5004083E5D3
:10BD200090009FE558109FE577FCFFEB7C309FE586
:10BD3000004083E574309FE5003093E5000053E355
:10BD40003400001A74009FE5B0FCFFEB0B0100EA21
:10BD50000000F0410000000000002E400000000044
:10BD600070050004A80500047805000474050004AB
:10BD7000B8130004A80800044008000424120004BA
:10BD8000640500044005000428080004CDCCCCCC98
:10BD9000E805000484050004EC05000450050004D7
:10BDA0005B548E3F00120004601700043802000448
:10BDB0006005000480050004B804000489B5F81487
:10BDC000D805000448170004676666667C05000411
:10BDD000880500048C050004900500049405000407
:10BDE000AC050004A0050004B0050004A40500048F
:10BDF000D405000454000004B8050004B405000490
:10BE0000F2D77A3E000000A046DF913F399D52A252
:10BE10008BCAF13F0000006070301FE5001093E511
:10BE200074301FE5003093E5030051E11400001A5F
:10BE30000C30D1E50D20D1E5023483E10E20D1E5AF
:10BE4000023883E10F20D1E5023C83E1010053E396
:10BE50000B00000AB4101FE51E30D1E51F20D1E50C
:10BE6000023483E12020D1E5023883E12120D1E5AD
:10BE7000023C83E1D0201FE5002092E5020053E15F
:10BE8000BE00000ADC101FE5000091E5F8101FE578
:10BE9000DDFCFFEBFF0010E3AE00000AE0801FE5D1
:10BEA0001000D8E51130D8E5030480E11230D8E560
:10BEB000030880E11330D8E5030C80E11C111FE575
:10BEC0001E30D1E51F20D1E5023483E12020D1E5E9
:10BED000023883E12120D1E5021C83E1010050E119
:10BEE000930000DA48211FE54C30D2E5083083E3A7
:10BEF0004C30C2E500A0A0E31010C8E52134A0E159
:10BF00001130C8E52138A0E11230C8E5213CA0E19C
:10BF10001330C8E51020D8E51130D8E5032482E1BC
:10BF20001230D8E5032882E11330D8E5032C82E1F2
:10BF3000080088E2041088E292FCFFEB84511FE5C0
:10BF40000CA0C5E50DA0C5E50EA0C5E50FA0C5E593
:10BF5000BC611FE50470D6E50530D6E5037487E1C2
:10BF60000630D6E5037887E10730D6E5037C87E124
:10BF70000470C5E52734A0E10530C5E52738A0E108
:10BF80000630C5E5273CA0E10730C5E50440D5E50E
:10BF90000530D5E5034484E10630D5E5034884E166
:10BFA0000730D5E5034C84E10400D8E50530D8E539
:10BFB000030480E10630D8E5030880E10730D8E5C6
:10BFC000030C80E19A2900EB30121FE52D2900EBCC
:10BFD000BB2900EB004084E00440C5E52434A0E127
:10BFE0000530C5E52438A0E10630C5E5244CA0E1C4
:10BFF0000740C5E50030D6E50120D6E5023483E1EF
:10C000000220D6E5023883E10320D6E5023C83E135
:10C010000030C5E52324A0E10120C5E52328A0E1E7
:10C020000220C5E5233CA0E10330C5E50040D5E58D
:10C030000130D5E5034484E10230D5E5034884E1CD
:10C040000330D5E5034C84E10800D8E50930D8E594
:10C05000030480E10A30D8E5030880E10B30D8E51D
:10C06000030C80E1722900EBCE2900EB0190A0E1E6
:10C070000080A0E10700A0E1492D00EBA12F4FE2D5
:10C080000C0092E8F42A00EBA22F4FE20C0092E899
:10C09000F12A00EB9B1A00EB292E4FE20C0092E8EC
:10C0A000ED2A00EB0130A0E10020A0E10910A0E1A1
:10C0B0000800A0E1EB2B00EB692D00EB004084E0D1
:10C0C0000040C5E52434A0E10130C5E52438A0E1F5
:10C0D0000230C5E5244CA0E10340C5E534231FE54B
:10C0E000001092E50830D1E50920D1E5023483E162
:10C0F0000A20D1E5023883E10B20D1E5023C83E13F
:10C100000830C5E52324A0E10920C5E52328A0E1E6
:10C110000A20C5E5233CA0E10B30C5E501308AE3E8
:10C120000C30C5E50DA0C5E50EA0C5E50FA0C5E521
:10C130000A0000EA8C331FE5000093E584131FE535
:10C1400071FBFFEBA8231FE54C30D2E50830C3E3B9
:10C150004C30C2E5010000EAA0031FE5ABFBFFEB9A
:10C16000B8331FE5001093E50030A0E3022083E31D
:10C170000C20C1E50D30C1E50E30C1E50F30C1E541
:10C18000E0131FE51E30D1E51F20D1E5023483E125
:10C190002020D1E5023883E12120D1E5023C83E172
:10C1A000FC231FE5003082E500341FE5002093E505
:10C1B00004341FE5002083E508041FE504141FE58F
:10C1C00011FCFFEBFF0010E31401000A04441FE51B
:10C1D00020241FE517C0D2E51830D2E503C48CE156
:10C1E0001930D2E503C88CE11A30D2E503CC8CE1DA
:10C1F000003094E503C08CE02C541FE51BE0D2E531
:10C200001C30D2E503E48EE11D30D2E503E88EE177
:10C210001E30D2E503EC8EE1003095E503E08EE0C0
:10C2200060741FE5970CC3E0CC2FA0E1C32062E04F
:10C2300074041FE50430D0E50510D0E5013483E136
:10C240000610D0E5013883E10710D0E5013C83E119
:10C25000022063E0C23FA0E1A32D82E0C2C24CE015
:10C2600000C084E5971EC3E0CE2FA0E1C32062E0AA
:10C270000830D0E50910D0E5013483E10A10D0E59B
:10C28000013883E10B10D0E5013C83E1022063E03B
:10C29000C23FA0E1A32D82E0C2624EE0006085E5CE
:10C2A0001030D0E51120D0E5023483E11220D0E532
:10C2B000023883E11320D0E5023C83E1AF0F53E362
:10C2C000100000CA0C00A0E1B52C00EB0150A0E169
:10C2D0000040A0E10600A0E1B12C00EB0130A0E19C
:10C2E0000020A0E10510A0E10400A0E1851A00EB08
:10C2F000DB2C00EB9720C3E0C00FA0E1C30060E09F
:10C30000AF0F50E3140000DA4C151FE50430D1E5FF
:10C310000520D1E5023483E10620D1E5023883E12E
:10C320000720D1E5023C83E1033183E064251FE56A
:10C33000003082E50830D1E50920D1E5023483E1FF
:10C340000A20D1E5023883E10B20D1E5023C83E1EC
:10C35000033183E088251FE5003082E5AC451FE509
:10C360002330D4E52420D4E5023483E12520D4E52C
:10C37000023883E12620D4E5023C83E1640053E3E4
:10C380003200009AC8E51FE51030DEE51120DEE539
:10C39000023483E11220DEE5023883E11320DEE57A
:10C3A000023C83E14B0F53E3280000DAE8C51FE5A8
:10C3B00000009CE5800180E00C10DEE50D30DEE53C
:10C3C000031481E10E30DEE5031881E10F30DEE574
:10C3D000031C81E12730D4E52820D4E5023483E131
:10C3E0002920D4E5023883E12A20D4E5023C83E108
:10C3F0003C261FE59342C2E0C33FA0E1C23663E0A2
:10C40000011063E0871F81E2B634A0E3B63A83E20D
:10C41000B73083E293E1C2E0012082E0C13FA0E1B6
:10C42000423463E0833083E0033263E0831141E010
:10C43000010080E0B40040E278361FE59013C3E0CD
:10C44000C00FA0E1430160E000008CE5020000EABB
:10C450000020A0E390361FE5002083E5A4C61FE579
:10C460000C30DCE50D20DCE5023483E10E20DCE558
:10C47000023883E10F20DCE5023C83E1010053E355
:10C480002100001A0000A0E3C4361FE5000083E588
:10C49000D4161FE50430D1E50520D1E5023483E14F
:10C4A0000620D1E5023883E10720D1E5023C83E193
:10C4B000033183E0EC261FE5003082E50830D1E54A
:10C4C0000920D1E5023483E10A20D1E5023883E175
:10C4D0000B20D1E5023C83E1033183E010271FE507
:10C4E000003082E514371FE5000083E518371FE5AB
:10C4F000000083E5023080E30C30CCE50D00CCE594
:10C500000E00CCE50F00CCE54F0000EA44371FE5F4
:10C51000003093E5C32FA0E1A23E83E0C331A0E148
:10C520002C300BE558371FE5003093E5C32FA0E111
:10C53000A23E83E0C331A0E130300BE52C004BE29A
:10C5400030104BE2272DA0E3042082E20DFBFFEB2D
:10C5500080C71FE500209CE52C301BE5032082E00E
:10C5600000208CE588371FE5003093E5000063E28A
:10C57000B0371FE59340C1E0C03FA0E1410163E057
:10C58000C03F20E0C03F43E0000052E3002062B221
:10C59000020053E10030A0C300308CC5CC271FD56A
:10C5A000003092D5033060D0003082D5D8C71FE567
:10C5B00000209CE530301BE5032082E000208CE564
:10C5C000DC371FE5003093E5000063E20C381FE51F
:10C5D00093E0C1E0C03FA0E1410163E0C03F20E043
:10C5E000C03F43E0000052E3002062B2020053E18A
:10C5F0000030A0C300308CC524281FD5003092D550
:10C60000033060D0003082D538081FE538181FE5A8
:10C61000272DA0E3042082E2DAFAFFEB0A0000EA09
:10C620000020A0E360381FE5002083E564381FE5A3
:10C63000002083E568381FE5002083E56C381FE59E
:10C64000002083E570381FE5002083E55C081FE5C6
:10C6500078C81FE578381FE5001093E500309CE5A9
:10C66000013063E0002090E5023083E0A33F83E0E7
:10C67000C330A0E1003080E500108CE588081FE59C
:10C68000A0C81FE5A0381FE5001093E500309CE529
:10C69000013063E0002090E5023083E0A33F83E0B7
:10C6A000C330A0E1003080E500108CE5C4281FE510
:10C6B000003092E5000053E3013043120030821550
:10C6C000D4681FE5D4381FE5000093E5B42B00EBD8
:10C6D0000150A0E10040A0E1E4381FE5000093E52F
:10C6E000AF2B00EB0130A0E10020A0E10510A0E19C
:10C6F0000400A0E1831900EB692F8FE20C0092E89F
:10C70000552900EB0130A0E10020A0E1660F8FE287
:10C71000030090E8232900EBD12B00EB000086E515
:10C72000030050E30430A0D3003086D5F4319FE5F8
:10C73000000093E59A2B00EB0150A0E10040A0E13E
:10C74000EC319FE5000093E5952B00EB0130A0E173
:10C750000020A0E10510A0E10400A0E1691900EBB0
:10C760004F2F8FE20C0092E83B2900EB0130A0E153
:10C770000020A0E14E0F8FE2030090E8092900EBB2
:10C78000B72B00EB54319FE5000083E5130050E325
:10C790001420A0D33C319FD5002083D584319FE560
:10C7A000000093E57E2B00EB0150A0E10040A0E1EA
:10C7B0007C319FE5000093E5792B00EB0130A0E18F
:10C7C0000020A0E10510A0E10400A0E14D1900EB5C
:10C7D000CC208FE20C0092E81F2900EB0130A0E191
:10C7E0000020A0E1D0008FE2030090E8ED2800EBEC
:10C7F0000150A0E10040A0E1DC609FE5000096E56B
:10C80000672B00EB0130A0E10020A0E10510A0E1C2
:10C810000400A0E1ED2A00EB000050E3003096C5D3
:10C82000013083C2003086C5170000CAF4309FE58E
:10C83000000093E55A2B00EB0150A0E10040A0E17D
:10C84000EC309FE5000093E5552B00EB0130A0E1B3
:10C850000020A0E10510A0E10400A0E1291900EBEF
:10C860003C208FE20C0092E8FB2800EB0130A0E1B5
:10C870000020A0E140008FE2030090E8C92800EB0F
:10C88000772B00EB50309FE5000083E548209FE5C3
:10C89000003092E5100053E31130A0D3003082D570
:10C8A000890000EA0000E03F00000000000049406D
:10C8B0000000000000005040000000000000544054
:10C8C0000000000000120004700500049005000440
:10C8D00094050004481700045400000458000004A4
:10C8E0005C00000474050004CDCCCCCC40080004EE
:10C8F000B804000489888888CC05000467666666E9
:10C90000D005000479787878A8080004080A0004A3
:10C9100070090004BC050004C0050004A80500045B
:10C920001F85EB51A0050004B8050004C4050004F0
:10C93000A4050004B4050004C8050004880500042B
:10C940008C050004601700047C05000446DF913F5D
:10C95000399D52A298201FE54C30D2E50730C3E341
:10C960004C30C2E50020A0E3A8301FE5002083E59D
:10C9700048301FE5002083E55C301FE5002083E59B
:10C980006C301FE5002083E568301FE5002083E55B
:10C9900064301FE5002083E558301FE5002083E563
:10C9A0006C301FE5002083E570301FE5002083E533
:10C9B000EC301FE5002083E5F0301FE5002083E523
:10C9C000F4301FE50420C3E50520C3E50620C3E5D8
:10C9D0000720C3E50820C3E50920C3E50A20C3E515
:10C9E0000B20C3E50C20C3E50D20C3E50E20C3E5F5
:10C9F0000F20C3E51020C3E51120C3E51220C3E5D5
:10CA00001320C3E50020E0E338311FE5002083E573
:10CA10005020A0E340311FE5002083E52020A0E363
:10CA200048311FE5002083E5EC101FE52630D1E5F5
:10CA30002720D1E5023483E12820D1E5023883E1C3
:10CA40002920D1E5023C83E1010053E31E00000AE6
:10CA500068311FE51030D3E5010013E30A00001A26
:10CA600084311FE5002093E588311FE5920383E0C0
:10CA70002331A0E1033183E0030052E198311F0527
:10CA80006410A003B010C3010F00000AA4311FE519
:10CA90001120D3E558311FE51830D3E5030052E1EA
:10CAA0000900002AC8311FE5002093E5CC311FE5BD
:10CAB000924383E02331A0E1033183E0030052E19C
:10CAC000DC311F050AC0A003B0C0C301E4311FE57B
:10CAD0000020A0E3021082E32F10C3E53020C3E55D
:10CAE0003120C3E53220C3E5E0C11FE50100DCE5EC
:10CAF0000230DCE5030480E10008A0E14008A0E189
:10CB0000800080E0800180E00001A0E120E21FE5DC
:10CB10009E10C3E0003083E0C00FA0E1430260E05C
:10CB20000530DCE50620DCE5023483E10338A0E1D2
:10CB3000430840E00310DCE50430DCE5031481E148
:10CB40000118A0E14118A0E1811081E0811181E08C
:10CB50000111A0E19E21C3E0013083E0C11FA0E1EB
:10CB6000431261E00730DCE50820DCE5023483E1B4
:10CB70000338A0E1431841E088C21FE588E21FE5C1
:10CB80009E30C2E0C03FA0E1C23163E000209CE5DE
:10CB9000023083E0C32FA0E1222F83E0423143E043
:10CBA00000308CE5000063E0B0C21FE59E41C2E0AA
:10CBB000C13FA0E1C23163E000209CE5023083E088
:10CBC000C32FA0E1222F83E0423143E000308CE507
:10CBD000011063E0D8221FE592C0C3E0C00FA0E1BE
:10CBE000430260E0D8321FE5000083E592E1C3E034
:10CBF000C11FA0E1431261E0E8321FE5001083E5A8
:10CC000000331FE5D230D3E1000053E3003063B2BC
:10CC1000140053E310331FC50000D3C50130D3C542
:10CC200018331FD50900D3D50A30D3D5030480E1CA
:10CC30000008A0E14008A0E17D2600EBD92600EB2A
:10CC4000BF2F4FE20C0092E8032800EBE72A00EB2D
:10CC5000D42600EB0150A0E10040A0E1E71700EB73
:10CC6000E22A00EB0090A0E10510A0E10400A0E1A1
:10CC7000A41700EBDD2A00EB4C000BE570331FE539
:10CC8000000093E56A2600EB0050A0E14C001BE594
:10CC90000510A0E1732500EB0040A0E18C331FE5F7
:10CCA000000093E5622600EB0060A0E10900A0E12E
:10CCB0000610A0E16B2500EB0010A0E10400A0E14C
:10CCC000272500EB7E2600EB0040A0E10900A0E153
:10CCD0000510A0E1632500EB0050A0E14C001BE52E
:10CCE0000610A0E15F2500EB0010A0E10500A0E127
:10CCF000312500EB722600EBD4C31FE500309CE524
:10CD0000034084E000408CE5C41FA0E1211E84E0C4
:10CD1000FC331FE5003093E5940303E004241FE592
:10CD200093E2C2E0C33FA0E1423463E0416283E0AA
:10CD3000C63F26E0C63F43E0000054E3004064B233
:10CD4000040053E10030A0C300308CC528241FD557
:10CD5000003092D5033066D0003082D538241FE5EC
:10CD6000003092E5000053E3013043C2040000CAE2
:10CD70004C241FE5003092E5000053E3010000AAB7
:10CD8000013083E2003082E558C41FE500209CE5B5
:10CD9000022080E000208CE5C20FA0E1200E82E09E
:10CDA0008C341FE5003093E5920303E094141FE5F3
:10CDB0009341C1E0C33FA0E1413463E040A283E07E
:10CDC000CA3F2AE0CA3F43E0000052E3002062B2BB
:10CDD000020053E10030A0C300308CC5AC241FD545
:10CDE000003092D503306AD0003082D5BC241FE5D4
:10CDF000003092E5000053E3013043C2040000CA52
:10CE0000D0241FE5003092E5000053E3010000AAA2
:10CE1000013083E2003082E5FC341FE5000093E539
:10CE2000032600EBE8541FE50C70D5E50D30D5E581
:10CE3000037487E10E30D5E5037887E10F30D5E53F
:10CE4000037C87E10710A0E1062500EB0111A0E3B8
:10CE5000031581E28B2500EB192600EB34000BE56E
:10CE6000F32500EB0040A0E148351FE5000093E505
:10CE7000EF2500EB1060D5E51130D5E5036486E1C0
:10CE80001230D5E5036886E11330D5E5036C86E101
:10CE90000610A0E1F32400EB0010A0E10400A0E1E3
:10CEA000AF2400EB062600EB34000BE5E02500EB99
:10CEB0000080A0E190351FE5000093E5DC2500EB44
:10CEC0001440D5E51530D5E5034484E11630D5E5A9
:10CED000034884E11730D5E5034C84E10410A0E158
:10CEE000E02400EB0010A0E10800A0E19C2400EB8E
:10CEF000F32500EB34000BE5D0351FE5000093E58A
:10CF0000CB2500EB0710A0E1D62400EB0111A0E334
:10CF1000031581E25B2500EBE92500EB38000BE50A
:10CF2000C32500EB0070A0E1FC351FE5000093E590
:10CF3000BF2500EB0610A0E1CA2400EB0010A0E121
:10CF40000700A0E1862400EBDD2500EB38000BE5AF
:10CF5000B72500EB0060A0E128361FE5000093E54F
:10CF6000B32500EB0410A0E1BE2400EB0010A0E10B
:10CF70000600A0E17A2400EBD12500EB38000BE598
:10CF800034004BE238104BE2272CA0E3102082E261
:10CF90007CF8FFEB0440D5E50530D5E5034484E19A
:10CFA0000630D5E5034884E10730D5E5034C84E13C
:10CFB0007C361FE5000093E59D2500EB0410A0E101
:10CFC000A82400EB0F13A0E3A62400EBBC2500EB84
:10CFD0000060A0E19C361FE5000093E5942500EB7E
:10CFE0000410A0E19F2400EB0F13A0E39D2400EBAD
:10CFF000B32500EB00A0A0E1B8361FE5003093E5B3
:10D00000000053E33C600B0540000B053800000AAC
:10D01000D4261FE51A40D2E51B30D2E5034484E153
:10D020001C30D2E5034884E11D30D2E5034C84E195
:10D03000F0361FE5000093E57D2500EB0410A0E12C
:10D04000882400EBD72500EBFD2F8FE20C0092E83F
:10D05000012700EB0150A0E10040A0E1E71600EB42
:10D06000E22900EB0070A0E10510A0E10400A0E1BE
:10D07000A41600EBDD2900EB0080A0E10600A0E192
:10D080006B2500EB0060A0E10800A0E10610A0E124
:10D09000742400EB0040A0E10A00A0E1642500EB4D
:10D0A0000050A0E10700A0E10510A0E16D2400EB15
:10D0B0000010A0E10400A0E13F2400EB802500EB7C
:10D0C0003C000BE50700A0E10610A0E1652400EBA1
:10D0D0000040A0E10800A0E10510A0E1612400EB00
:10D0E0000010A0E10400A0E11D2400EB742500EB7A
:10D0F00040000BE53C004BE240104BE24E2DA0E31C
:10D10000082082E21FF8FFEB3C539FE50840D5E57D
:10D110000930D5E5034484E10A30D5E5034884E1CC
:10D120000B30D5E5034C84E120339FE5000093E507
:10D130003F2500EB0410A0E14A2400EB602500EB42
:10D1400044000BE508339FE5000093E5382500EB2C
:10D150000410A0E1432400EB592500EB48000BE547
:10D1600044004BE248104BE2272DA0E3042082E26A
:10D1700004F8FFEBDC729FE5000097E52C2500EB3F
:10D180000060A0E13C001BE544301BE5030080E0AB
:10D1900034301BE5030080E0252500EB0040D5E599
:10D1A0000130D5E5034484E10230D5E5034884E14C
:10D1B0000330D5E5034C84E10410A0E1292400EB01
:10D1C0000010A0E10600A0E1E52300EB3F14A0E37E
:10D1D000242400EB3A2500EB000087E578629FE508
:10D1E000000096E5122500EB0050A0E140001BE591
:10D1F00048301BE5030080E038301BE5030080E089
:10D200000B2500EB0410A0E1162400EB0010A0E1B8
:10D210000500A0E1D22300EB3F14A0E3112400EBB2
:10D22000272500EB000086E50700A0E10610A0E13D
:10D2300028329FE5002093E5D2F7FFEB20529FE5CF
:10D24000000097E5FA2400EB0080A0E14C001BE50C
:10D250000810A0E1032400EB0040A0E1000096E5E7
:10D26000F32400EB0060A0E10900A0E10610A0E1BA
:10D27000FC2300EB0010A0E10400A0E1B82300EBC8
:10D280000F2500EB0070A0E30000C5E52004A0E13D
:10D290000100C5E50900A0E10810A0E1F12300EBC1
:10D2A0000040A0E14C001BE50610A0E1ED2300EBDF
:10D2B0000010A0E10400A0E1BF2300EB002500EB7B
:10D2C0000200C5E52004A0E10300C5E50470C5E542
:10D2D0000570C5E58C119FE58C219FE50030D2E5F6
:10D2E0002430C1E50130D2E52530C1E57C219FE540
:10D2F0000030D2E52630C1E50130D2E52730C1E566
:10D300006C419FE50430D4E50520D4E5023483E187
:10D310003830C1E52334A0E13930C1E50830D4E527
:10D320000920D4E5023483E13A30C1E52334A0E199
:10D330003B30C1E50030D5E50120D5E5023483E17D
:10D340003C30C1E52334A0E13D30C1E50230D5E5F4
:10D350000320D5E5023483E13E30C1E52334A0E16A
:10D360003F30C1E50C019FE50C119FE5E6F6FFEBB0
:10D3700008019FE508119FE5E3F6FFEBF8109FE534
:10D38000F0009FE51130D0E53A30C1E51030D4E52A
:10D390001120D4E5023483E12030C1E52334A0E13B
:10D3A0002130C1E50C30D4E50D20D4E5023483E111
:10D3B0002230C1E52334A0E12330C1E5C4E09FE57C
:10D3C0000930DEE54130C1E52330D0E52420D0E549
:10D3D000023483E14230C1E52334A0E14330C1E5AA
:10D3E0002730D0E52820D0E5023483E14430C1E580
:10D3F0002334A0E14530C1E58C009FE50930D0E53C
:10D400000A20D0E5023483E14630C1E52334A0E1AF
:10D410004730C1E50130D0E50220D0E5023483E198
:10D420000338A0E14328A0E160C09FE59C42C2E030
:10D43000C33FA0E1423163E04830C1E50330D0E5AD
:10D44000130000EA46DF913F399D52A260170004A5
:10D450009005000494050004980500049C05000450
:10D460007005000440170004B8130004C40500044C
:10D47000C805000448170004B804000400120004A2
:10D48000D805000410120004A80800047009000464
:10D49000676666660420D0E5023483E10338A0E1C4
:10D4A0004328A0E19C02C2E0C33FA0E1423163E017
:10D4B0004930C1E50830DEE54A30C1E50A30DEE535
:10D4C0004B30C1E5F0AF1BE90DC0A0E100D82DE95C
:10D4D00004B04CE2322800EB14208FE20C0092E8FA
:10D4E000DD2500EB10208FE20C0092E8DA2500EB3E
:10D4F00000A81BE9F2D77A3E000000A046DF913F6A
:10D50000399D52A20DC0A0E100D82DE904B04CE233
:10D51000232800EB08208FE20C0092E8CE2500EBD8
:10D5200000A81BE9F2D77A3E000000A018F09FE5A2
:10D5300018F09FE518F09FE518F09FE518F09FE5BB
:10D540000000A0E118F09FE518F09FE57CD60000F0
:10D550006CD5000070D5000074D5000078D50000AF
:10D56000000000007CD5000080D50000230000EA08
:10D570001A0000EA280000EA2F0000EA000000EA92
:10D58000350000EA04E04EE2FF5F2DE900104FE1B4
:10D5900002002DE92C029FE5000090E528129FE58E
:10D5A000001091E50000A0E10000A0E11FF021E3E0
:10D5B00000402DE914E29FE500F0A0E10040BDE845
:10D5C000D2F021E3FC019FE5000080E5F8119FE522
:10D5D000001081E50200BDE801F06FE1FF9FFDE86A
:10D5E000FF5F2DE900104FE102002DE90D10A0E1D1
:10D5F00038CDFFEB0200BDE801F06FE1FF9FFDE8D1
:10D60000FF5F2DE900104FE102002DE93ACDFFEB5D
:10D610000200BDE801F06FE1FF9FFDE804E04EE28B
:10D62000FF5F2DE900104FE102002DE93BCDFFEB3C
:10D630000200BDE801F06FE1FF9FFDE808E04EE267
:10D64000FF5F2DE900104FE102002DE922CDFFEB35
:10D650000200BDE801F06FE1FF9FFDE804E04EE24B
:10D66000FF402DE900104FE102002DE92ACDFFEB2C
:10D670000200BDE801F06FE1FF80FDE850119FE579
:10D680000020A0E3011041E2020051E1FCFFFF8A0B
:10D6900040019FE540119FE5341080E534019FE58E
:10D6A00038119FE5001080E50000A0E10000A0E136
:10D6B0000000A0E10000A0E10000A0E10000A0E166
:10D6C0000000A0E10000A0E10000A0E10000A0E156
:10D6D0000000A0E10000A0E10000A0E10000A0E146
:10D6E0000000A0E10000A0E10267A0E36070A0E3F9
:10D6F000B070C6E1E8609FE50370A0E3B070C6E1DA
:10D70000E0109FE5041080E5081090E5011011E29B
:10D71000FCFFFF0AD0109FE5001080E5CC109FE5CC
:10D720001C1080E5C8109FE5201080E5C4009FE52F
:10D73000D1F021E300D0A0E1800040E2D2F021E36B
:10D7400000D0A0E1020B40E2D7F021E300D0A0E13D
:10D75000040040E2DBF021E300D0A0E1040040E25D
:10D76000D3F021E300D0A0E1800040E210F021E3FB
:10D7700000D0A0E101AB4DE27C109FE57C209FE54D
:10D780007C309FE5030052E10400913404008234B0
:10D79000FBFFFF3A0000A0E368109FE568209FE5CB
:10D7A000020051E104008134FCFFFF3A0000A0E3D5
:10D7B00058109FE558209FE5020051E10400813494
:10D7C000FCFFFF3AB5CBFFEA30F0FFFF300000FC72
:10D7D000BCD5000020A107000020005C96010000DD
:10D7E000020002004030080019C00B008000020057
:10D7F000731B000001C8FE0000800104F0D001008E
:10D8000000000004B8030004C00300040819000469
:10D8100008190004081900041713A0E3021A81E292
:10D82000002091E50320C2E3000050E300208211B4
:10D830000700001A043091E5020713E30200000A12
:10D84000083091E5010013E30100001A0000A0E395
:10D850000EF0A0E11733A0E3023A83E2002083E553
:10D860000100A0E30EF0A0E10DC0A0E170D82DE909
:10D8700004B04CE2FF4000E2FF5001E2FF6002E230
:10D880000000A0E3100000EB010050E30000A01333
:10D8900070A81B191723A0E3022A82E20030A0E33C
:10D8A000043082E5043092E5043483E1043082E5FB
:10D8B000043092E5033085E1043082E5043092E5DE
:10D8C000063883E1043082E570A81BE904D04DE2FC
:10D8D000010050E31500001A1723A0E3022A82E298
:10D8E000043092E5020713E30200000A083092E5D3
:10D8F000010013E32400001A1733A0E3023A83E285
:10D90000082093E5012082E3082083E5042093E5C5
:10D91000022782E3042083E51723A0E3022A82E2A0
:10D92000083092E5000053E3FCFFFF0A140000EA10
:10D930001733A0E3023A83E2003093E5030013E3D8
:10D940001100000A0A30A0E300308DE500309DE5AB
:10D95000000053E30500000A00309DE5013043E27A
:10D9600000308DE500309DE5000053E3F9FFFF1A1C
:10D970001723A0E3022A82E2043092E50237C3E3D0
:10D98000043082E50100A0E3000000EA0000A0E30B
:10D9900004D08DE20EF0A0E11723A0E3022A82E278
:10D9A000003092E51C30C3E3003082E51D0070E3D7
:10D9B0000030921503308011003082150EF0A0E186
:10D9C0001723A0E3022A82E2003092E56030C3E32D
:10D9D000003082E5610070E3003092150330801161
:10D9E000003082150EF0A0E11723A0E3022A82E2A4
:10D9F000003092E5063DC3E3003082E5063DE0E3FA
:10DA0000030050E100309215033080110030821580
:10DA10000EF0A0E1010051E31723A003022A8202C5
:10DA200018309205033080011723A013022A8212B6
:10DA3000183092150030C311183082E50EF0A0E1C5
:10DA4000010051E31723A003022A82021430920539
:10DA5000033080011723A013022A8212143092157A
:10DA60000030C311143082E50EF0A0E1000051E354
:10DA70001723A003022A820220309205033080017E
:10DA80001723A013022A8212203092150030C311EE
:10DA9000203082E50EF0A0E1000051E31723A0033F
:10DAA000022A82021C309205033080011723A01342
:10DAB000022A82121C3092150030C3111C3082E5FC
:10DAC0000EF0A0E1010051E31723A003022A820215
:10DAD00028309205033080011723A013022A8212F6
:10DAE000283092150030C311283082E50EF0A0E1F5
:10DAF000010051E31723A003022A82022430920579
:10DB0000033080011723A013022A821224309215B9
:10DB10000030C311243082E50EF0A0E1010051E392
:10DB20001723A003022A82023030920503308001BD
:10DB30001723A013022A8212303092150030C3112D
:10DB4000303082E50EF0A0E1010051E31723A0037D
:10DB5000022A82022C309205033080011723A01381
:10DB6000022A82122C3092150030C3112C3082E52B
:10DB70000EF0A0E11723A0E3022A82E2003092E532
:10DB8000023CC3E3003082E5020C50E30030920512
:10DB9000023C8303003082050EF0A0E1FF0010E399
:10DBA0000900001A1723A0E3022A82E2003092E55E
:10DBB000023AC3E3003082E5010051E300309205F0
:10DBC000023A83030EF0A011080000EA1723A0E335
:10DBD000022A82E2003092E50139C3E3003082E597
:10DBE000010051E30EF0A011003092E5013983E30A
:10DBF000003082E50EF0A0E10118A0E14118A0E19B
:10DC0000FF0010E31723A003022A82020138A001BB
:10DC10002338A001383082051723A013022A82126C
:10DC20000138A0112338A0113C3082150EF0A0E17C
:10DC30001723A0E3022A82E2003092E5033BC3E30C
:10DC4000003082E5033BE0E3030050E10030921531
:10DC500003308011003082150EF0A0E1010050E386
:10DC60001723A003022A820200309205013A83039F
:10DC70001723A013022A821200309215013AC3130F
:10DC8000003082E50EF0A0E11723A0E3022A82E231
:10DC9000003092E50138C3E3003082E50138E0E36B
:10DCA000030050E1003092150138831300308215D3
:10DCB0000EF0A0E11723A0E3022A82E2003092E5F1
:10DCC0000638C3E3003082E50638E0E3030050E1A4
:10DCD0000030921502388313003082150EF0A0E157
:10DCE0001723A0E3022A82E2343092E54030C3E3F6
:10DCF000343082E5410070E33430921540308313B4
:10DD0000343082150EF0A0E11723A0E3022A82E24C
:10DD1000343092E5013CC3E3343082E5013CE0E37A
:10DD2000030050E134309215013C831334308215E6
:10DD30001723A0E3022A82E2343092E58030C3E365
:10DD4000343082E5810071E33430921580308313E2
:10DD5000343082150EF0A0E1010051E31723A00337
:10DD6000022A8202103092050030C3011723A0134B
:10DD7000022A82121030921503308011103082E591
:10DD80000EF0A0E11733A0E3023A83E2083093E5F6
:10DD9000030010E10000A0030100A0130EF0A0E1B9
:10DDA0001733A0E3023A83E2080083E50EF0A0E116
:10DDB0000DC0A0E100D82DE904B04CE21733A0E378
:10DDC000023A83E2041093E5042093E5FF2C02E27B
:10DDD000043093E5073803E223C8A0E1FF1011E205
:10DDE0000030A0030130A0132204A0E1000052E3A0
:10DDF0000030A00301300312000053E30000A00331
:10DE000000A81B0914309FE5003093E5930000E063
:10DE10008000A0E1111CA0E16E1E00EB00A81BE930
:10DE200000AC01000DC0A0E100D82DE904B04CE227
:10DE30001733A0E3023A83E2003093E5033003E2B4
:10DE4000020053E328309F050000930500A81B093A
:10DE50001733A0E3023A83E2003093E5033003E294
:10DE6000010053E32000A00300A81B09CFFFFFEB34
:10DE700000A81BE900AC01000DC0A0E110D82DE9FD
:10DE800004B04CE21733A0E3023A83E2004093E58A
:10DE90001C4004E2140054E32441A0110A40A003F2
:10DEA000DFFFFFEB3004A0E110A81BE90DC0A0E1EB
:10DEB00010D82DE904B04CE21733A0E3023A83E214
:10DEC000004093E5604004E2A442A0E1E9FFFFEBDB
:10DED0003004A0E110A81BE90DC0A0E110D82DE985
:10DEE00004B04CE21733A0E3023A83E2004093E52A
:10DEF000064D04E2A443A0E1DEFFFFEB3004A0E105
:10DF000010A81BE9FF0000E2070050E30800008AA8
:10DF10001733A0E3023A83E2B02093E50720C2E37F
:10DF2000B02083E5B02093E5022080E1B02083E5B6
:10DF30000EF0A0E10F0050E30800008A1723A0E3D1
:10DF4000022A82E2B03092E53830C3E3B03082E595
:10DF5000081040E2B03092E5813183E1090000EA27
:10DF6000170050E30900008A1723A0E3022A82E287
:10DF7000B03092E5073DC3E3B03082E5101040E2D7
:10DF8000B03092E5013383E1B03082E50EF0A0E1DC
:10DF90001723A0E3022A82E2B03092E50E3CC3E3ED
:10DFA000B03082E5181040E2B03092E5813483E170
:10DFB000F4FFFFEA010050E31723A003022A8202C4
:10DFC0000C309205083083031723A013022A821213
:10DFD0000C3092150830C3130C3082E50EF0A0E12E
:10DFE0001723A0E3022A82E20C3092E5013083E39A
:10DFF0000C3082E50EF0A0E11723A0E3022A82E2B2
:10E000000C3092E5023083E30C3082E50EF0A0E1A3
:10E01000FF0000E2FF1001E2010051E31000001ACE
:10E02000000050E31723A003022A82023430920535
:10E03000013B83030800000A010050E31723A013EB
:10E04000022A821234309215013A83131723A00357
:10E05000022A820234309205023B8303343082E587
:10E060000EF0A0E1000050E31723A003022A820271
:10E0700034309205013BC303F7FFFF0A010050E370
:10E080001723A003022A820234309205023BC30305
:10E090001723A013022A821234309215013AC313B7
:10E0A000EDFFFFEA010050E31723A003022A8202DA
:10E0B00034309205013083031723A013022A821201
:10E0C000343092150130C313343082E50EF0A0E1F4
:10E0D0000DC0A0E110D82DE904B04CE20040A0E151
:10E0E0001633A0E3063A83E2030050E10B00001A66
:10E0F0000109A0E30110A0E35BFEFFEB0109A0E32F
:10E100000010A0E358FEFFEB1723A0E3022A82E2EF
:10E110000030A0E3843082E5443082E5643082E55B
:10E120001633A0E3073A83E2030054E10B00001A20
:10E130000209A0E30110A0E34BFEFFEB0209A0E3FC
:10E140000010A0E348FEFFEB1723A0E3022A82E2BF
:10E150000030A0E3883082E5483082E5683082E50F
:10E160001633A0E3023983E2030054E10B00001AE6
:10E170000108A0E30110A0E33BFEFFEB0108A0E3D0
:10E180000010A0E338FEFFEB1723A0E3022A82E28F
:10E190000030A0E38C3082E54C3082E56C3082E5C3
:10E1A0001633A0E3093A83E2030054E10B00001A9E
:10E1B0000208A0E30110A0E32BFEFFEB0208A0E39E
:10E1C0000010A0E328FEFFEB1723A0E3022A82E25F
:10E1D0000030A0E3903082E5503082E5703082E577
:10E1E0001633A0E30A3A83E2030054E10C00001A5C
:10E1F0000107A0E30110A0E31BFEFFEB0107A0E372
:10E200000010A0E318FEFFEB1723A0E3022A82E22E
:10E210000030A0E3943082E5543082E5743082E52A
:10E22000BC3082E51633A0E30B3A83E2030054E1ED
:10E230000B00001A0207A0E30110A0E30AFEFFEBA7
:10E240000207A0E30010A0E307FEFFEB1723A0E303
:10E25000022A82E20030A0E3983082E5583082E55D
:10E26000783082E51633A0E3033983E2030054E1FA
:10E270000B00001A0106A0E30110A0E3FAFDFFEB7A
:10E280000106A0E30010A0E3F7FDFFEB1723A0E3D6
:10E29000022A82E20030A0E39C3082E55C3082E515
:10E2A0007C3082E51633A0E30D3A83E2030054E1AB
:10E2B0000B00001A0206A0E30110A0E3EAFDFFEB49
:10E2C0000206A0E30010A0E3E7FDFFEB1723A0E3A5
:10E2D000022A82E20030A0E3A03082E5603082E5CD
:10E2E000803082E51633A0E30E3A83E2030054E166
:10E2F0000A00001A0105A0E30110A0E3DAFDFFEB1C
:10E300000105A0E30010A0E3D7FDFFEB1733A0E366
:10E31000023A83E20020A0E3A42083E5AC2083E559
:10E320001633A0E30F3A83E2030054E110A81B194F
:10E330000205A0E30110A0E3CBFDFFEB0205A0E383
:10E340000010A0E3C8FDFFEB1733A0E3023A83E21D
:10E350000020A0E3A82083E5AC2083E510A81BE9FA
:10E360000DC0A0E1F0DD2DE904B04CE20050A0E1C9
:10E370000140A0E18E0000EBFFA000E20130D4E5F7
:10E38000010053E30030D4050024950502308301D9
:10E390000020D415003495150230C311003485E5F2
:10E3A0000010A0E30100A0E31783A0E3028A88E243
:10E3B0000AE1A0E117738EE2027A87E217638EE228
:10E3C000026A86E20030D4E5103103E05331A0E167
:10E3D000010053E32E00001A07005AE32100008ACF
:10E3E00008C08EE08150A0E144309CE50320A0E30A
:10E3F0001235C3E144308CE5B420D4E1010052E38E
:10E4000044309C051235830144308C05B4C0D4E1FE
:10E4100002005CE38120A001443097051C32830197
:10E4200044308705B4C0D4E103005CE38120A0013F
:10E43000443096051C3283014430860517238EE252
:10E44000022A82E210C1A0E1643092E50C30C3E1FF
:10E45000643082E50330D4E5010053E36430920573
:10E4600003308C016430820517238EE2022A82E297
:10E4700010C1A0E1843092E50C30C3E1843082E524
:10E480000230D4E5010053E38430920503308C015F
:10E4900084308205013081E2FF1003E2070051E37E
:10E4A000F0AD1B89C6FFFFEA0030E0E30030C0E5B5
:10E4B0000030A0E30130C0E50230C0E50330C0E524
:10E4C000B430C0E10EF0A0E1FF1001E20131A0E1A3
:10E4D0000330D0E7030011E10000A0030100A01306
:10E4E0000EF0A0E1FF3FA0E30300D0E7FF0000E251
:10E4F0000EF0A0E1FF1001E2010052E30131A001A2
:10E500000310C0070121A0110030A0130230C01772
:10E510000EF0A0E1FF1001E2FF3FA0E30310C0E70F
:10E520000EF0A0E1010050E31733A003023A83028A
:10E53000AC0083051733A013023A83120020A01306
:10E54000AC2083150EF0A0E10DC0A0E130D82DE97C
:10E5500004B04CE2FF5000E2010051E30E00001A4B
:10E560001743A0E3024A84E20500A0E13E0000EB6D
:10E570000008A0E1543094E5203803E0543084E5ED
:10E58000743094E50530C3E1743084E5BC3094E523
:10E59000033085E1BC3084E530A81BE91723A0E3F4
:10E5A000022A82E2BC3092E50530C3E1BC3082E54C
:10E5B00030A81BE91633A0E3073A83E2030050E1D9
:10E5C0000100A0030EF0A0011633A0E3023983E29C
:10E5D000030050E10200A0030EF0A0011633A0E3F7
:10E5E000093A83E2030050E10300A0030EF0A0010A
:10E5F0001633A0E30A3A83E2030050E10400A003CB
:10E600000EF0A0011633A0E30B3A83E2030050E1C1
:10E610000500A0030EF0A0011633A0E3033983E246
:10E62000030050E10600A0030EF0A0011633A0E3A2
:10E630000D3A83E2030050E10700A0030EF0A001B1
:10E640001633A0E30E3A83E2030050E10800A00372
:10E650000EF0A0011633A0E30F3A83E2030050E16D
:10E660000900A0030000A0130EF0A0E1FF0000E2EB
:10E67000010050E3FF0CA003FC0080020EF0A0019B
:10E68000020050E3FF0CA003F30080020EF0A00193
:10E69000040050E3FF0CA003CF0080020EF0A001A5
:10E6A000080050E3FF0CA0033F0080020EF0A00121
:10E6B000100050E33F0BA0030200000A200050E3CB
:10E6C0000200001AF30CA0E3FF0080E20EF0A0E1CC
:10E6D000400050E3CF0CA003FAFFFF0AFF3DA0E388
:10E6E0003F3083E2800050E30000A0130300A0014C
:10E6F0000EF0A0E10DC0A0E100D82DE904B04CE27D
:10E700001733A0E3013983E2030050E10400001A4B
:10E710000800A0E30110A0E3D3FCFFEB0800A0E396
:10E72000070000EA1733A0E3053A83E2030050E153
:10E730000600001A1000A0E30110A0E3CAFCFFEBE2
:10E740001000A0E30010A0E3C7FCFFEB00A81BE94A
:10E750001733A0E3063A83E2030050E100A81B1937
:10E760002000A0E30110A0E3BFFCFFEB2000A0E32A
:10E77000F3FFFFEA0DC0A0E1F0D92DE904B04CE2AF
:10E780000070A0E10180A0E1BC32D0E16030C3E3C1
:10E79000BC32C0E1BC32D0E1B020D1E1023083E133
:10E7A000BC32C0E1B230D1E1080053E3BC32D00149
:10E7B00008308303BC32D0110830C313BC32C7E128
:10E7C000BC32D7E18630C3E3BC32C7E1BC32D7E10B
:10E7D000B420D8E1023083E1BC32C7E190FDFFEB09
:10E7E000803260E0033180E08331A0E10300A0E1EA
:10E7F0000010A0E31733A0E3023A83E2003093E570
:10E80000022C13E20B00001AC14FA0E1A43FA0E1CB
:10E810000240A0E10120A0E10010A0E1031091E07E
:10E820000420A2E0A100A0E1823F80E1C240A0E17B
:10E830000410A0E10300A0E10121A0E1204F82E14A
:10E840000031A0E10460A0E10350A0E1005095E098
:10E850000160A6E00621A0E1254F82E10531A0E19B
:10E86000035095E00460A6E00631A0E1251F83E196
:10E870000501A0E1082098E50222A0E10030A0E314
:10E88000571C00EBBC209FE5921083E0A332A0E16F
:10E89000B432C7E1B432D7E1033183E0033183E01E
:10E8A000030140E00003A0E1320080E2921083E027
:10E8B000A332A0E1B832C7E1B033D7E10339A0E118
:10E8C0002339A0E1B033C7E1B033D7E1BC20D8E1B0
:10E8D000023083E1B033C7E1B033D7E1033CC3E397
:10E8E000B033C7E1B033D7E1BE20D8E1023083E1D5
:10E8F000B033C7E1B031D8E1100053E3BC32D711D7
:10E900001030C313BC32C711F0A91B19BC32D7E1B8
:10E91000103083E3BC32C7E1B433D7E13F30C3E307
:10E92000B433C7E1B821D8E1B433D7E1823183E110
:10E93000B433C7E1B433D7E1B421D8E1023083E185
:10E94000B433C7E1F0A91BE91F85EB516030A0E3A8
:10E95000B030C0E10830E0E3B230C0E10220A0E313
:10E96000B420C0E1963DA0E3083080E50030A0E38C
:10E97000BC30C0E1033CA0E3BE30C0E11030A0E3F6
:10E98000B031C0E1142080E5182080E50EF0A0E150
:10E99000010051E3B033D00101308303B033D01113
:10E9A0000130C313B033C0E10EF0A0E10118A0E1C3
:10E9B0004118A0E1010052E3B833D00101308301D6
:10E9C000B833D0110130C311B833C0E10EF0A0E16B
:10E9D0000118A0E1050871E3B834D0010430C30385
:10E9E000B834D01104308313B834C0E10EF0A0E184
:10E9F000FF1001E2020051E30500001A010052E39A
:10EA0000B834D00102308303B834D0110230C313BC
:10EA1000B834C0E1010051E30EF0A011010052E34F
:10EA2000B834D00101308303B834D0110130C3139E
:10EA3000B834C0E10EF0A0E1010051E3B033D001E1
:10EA400080308303B033D0118030C313B033C0E1C2
:10EA50000EF0A0E10030A0E30118A0E1A12AA0E19E
:10EA60002118A0E11F1001E2010052E3B430D001EF
:10EA70000400000A020052E3B831D0010100000A8C
:10EA8000030052E3BC33D0010100A0E3103113E0D6
:10EA90000000A0030EF0A0E1AA30A0E3B430C0E172
:10EAA0000EF0A0E10118A0E1B034D0E1213813E06C
:10EAB0000000A0030100A0130EF0A0E10118A0E1E6
:10EAC0004118A0E1B414C0E10EF0A0E1FF0000E2A3
:10EAD000020050E31723A003052A82020700000A60
:10EAE000030000CA010050E31723A003012982029A
:10EAF000020000EA030050E31723A003062A820263
:10EB0000010051E3B033D20104308303B033D2119A
:10EB10000430C313B033C2E10EF0A0E10DC0A0E198
:10EB200030D82DE904B04CE20150A0E1FF0000E232
:10EB3000020050E31743A003054A84020700000ABD
:10EB4000030000CA010050E31743A00301498402F7
:10EB5000020000EA030050E31743A003064A8402C0
:10EB6000DCFCFFEB803260E0033180E08302A0E157
:10EB7000830180E08000A0E10510A0E1151B00EBFF
:10EB8000050080E20C309FE5902383E0A331A0E1F3
:10EB9000B032C4E130A81BE9CDCCCCCCFF0000E200
:10EBA000020050E31723A003052A82020700000A8F
:10EBB000030000CA010050E31723A00301298202C9
:10EBC000020000EA030050E31723A003062A820292
:10EBD000010051E3B033D20102308303B033D211CC
:10EBE0000230C313B033C2E10EF0A0E1FF1001E226
:10EBF000B010C0E10EF0A0E1B000D0E1FF0000E2F3
:10EC00000EF0A0E1BC32D0E1013083E3BC32C0E1C0
:10EC10000EF0A0E1000050E31723A00301298202B7
:10EC2000B033D201023B83031723A01301298212C0
:10EC3000B033D211023BC313B033C2E10EF0A0E1F6
:10EC4000000050E31723A00301298202B033D20150
:10EC5000013B83031723A01301298212B033D21181
:10EC6000013BC313B033C2E10EF0A0E10DC0A0E13F
:10EC700000D82DE904B04CE22000A0E30110A0E38D
:10EC800084FBFFEB2000A0E30010A0E381FBFFEB7F
:10EC900000A81BE90008A0E10110A0E34038A0E1B2
:10ECA0002008A0E10F0050E30600008A0231A0E333
:10ECB000C339A0E1003093E5110093E10100A011F8
:10ECC0000000A0030EF0A0E10338A0E12338A0E18A
:10ECD000103043E23F23A0E3002092E5112392E1AC
:10ECE0000000A0030100A0130EF0A0E10008A0E1C5
:10ECF0000110A0E34038A0E12008A0E10F0050E39C
:10ED00000600008A0231A0E3C339A0E1083093E590
:10ED1000110093E10100A0110000A0030EF0A0E19A
:10ED20000338A0E12338A0E1103043E23F23A0E301
:10ED3000082092E5112392E10000A0030100A01336
:10ED40000EF0A0E10008A0E10110A0E34038A0E12E
:10ED50002008A0E10F0050E30600008A0231A0E382
:10ED6000C339A0E1043093E5110093E10100A01143
:10ED70000000A0030EF0A0E10338A0E12338A0E1D9
:10ED8000103043E23F23A0E3042092E5112392E1F7
:10ED90000000A0030100A0130EF0A0E10008A0E114
:10EDA00001C0A0E34028A0E12008A0E10F0050E34B
:10EDB0000B00008A000051E30211A013C119A01139
:10EDC0000228A0112228A0111300001A0221A0E39A
:10EDD000C229A0E10C3092E51C30C3E10C3082E581
:10EDE0000EF0A0E1000051E33F13A0130228A01190
:10EDF0002228A011102042120700001A3F13A0E39E
:10EE00000228A0E12228A0E1102042E20C3091E586
:10EE10001C32C3E10C3081E50EF0A0E10C3091E52D
:10EE20001C3283E1FAFFFFEA0008A0E14008A0E1FC
:10EE300001C0A0E30C0051E11100001A0038A0E16C
:10EE40002318A0E10F0051E30500008A0221A0E38E
:10EE5000C229A0E1103092E51C3183E1103082E537
:10EE60000EF0A0E13F13A0E30028A0E12228A0E1DA
:10EE7000102042E2103091E51C3283E1103081E530
:10EE80000EF0A0E10038A0E12318A0E10F0051E34B
:10EE90000500008A0221A0E3C229A0E1143092E516
:10EEA0001C3183E1143082E50EF0A0E13F13A0E3B2
:10EEB0000028A0E12228A0E1102042E2143091E5D0
:10EEC0001C3283E1143081E50EF0A0E10008A0E1DE
:10EED0004028A0E101C0A0E30C0051E11100001A9C
:10EEE0000238A0E12318A0E10F0051E30500008AD9
:10EEF0000221A0E3C229A0E1183092E51C3183E190
:10EF0000183082E50EF0A0E13F13A0E30228A0E153
:10EF10002228A0E1102042E2183091E51C3283E162
:10EF2000183081E50EF0A0E10238A0E12308A0E14D
:10EF30000F0050E30231A093C339A0911C20A0918F
:10EF40001C2083950238A0812338A0811030438291
:10EF50001C33A0813F23A0831C3082850EF0A0E1EA
:10EF6000010050E30800001A0221A0E3C229A0E139
:10EF7000203092E5013083E3203082E53F23A0E397
:10EF8000203092E5013083E3070000EA0221A0E38C
:10EF9000C229A0E1203092E50130C3E3203082E5B0
:10EFA0003F23A0E3203092E50130C3E3203082E527
:10EFB0000EF0A0E1300090E50EF0A0E10118A0E114
:10EFC0004118A0E10008A0E10F0850E30138A0912A
:10EFD0002337A091002F03950138A0812337A0810A
:10EFE0003F338382002183850EF0A0E10008A0E179
:10EFF0004038A0E12008A0E10F0050E30031A091CB
:10F00000000F13950338A0812337A0813F338382FB
:10F01000C00093850EF0A0E10118A0E14118A0E125
:10F020000008A0E10F0850E30500008A0128A0E1D4
:10F030002227A0E1003E12E5203083E3003E02E5F6
:10F040000EF0A0E10128A0E12227A0E13F2382E207
:10F05000003292E5203083E3003282E50EF0A0E139
:10F060000008A0E10118A0E14118A0E140C8A0E11A
:10F070002008A0E10F0050E30800008A0138A0E159
:10F080002337A0E1002E13E51F20C2E3002E03E585
:10F09000002E13E5022080E1002E03E50EF0A0E132
:10F0A0000128A0E12227A0E13F2382E2003292E57D
:10F0B0001F30C3E3003282E50C38A0E12338A0E121
:10F0C000103043E2001292E5013083E1003282E524
:10F0D0000EF0A0E10DC0A0E170D82DE904B04CE223
:10F0E0000160A0E10008A0E1FF5002E24048A0E179
:10F0F0002008A0E11F0050E300F19F97BF0000EA45
:10F1000080F1000094F10000A8F10000BCF10000C3
:10F11000D0F10000E4F10000F8F100000CF2000072
:10F1200020F2000034F2000048F200005CF200001F
:10F1300070F2000084F2000098F20000ACF20000CF
:10F14000C0F20000D4F20000E8F20000FCF200007F
:10F1500010F3000024F3000038F300004CF300002B
:10F1600060F3000074F3000088F300009CF30000DB
:10F17000B0F30000C4F30000D8F30000ECF300008B
:10F180000408A0E12008A0E10510A0E19C229FE571
:10F19000990000EA0408A0E12008A0E10510A0E120
:10F1A0008C229FE5940000EA0408A0E12008A0E179
:10F1B0000510A0E17C229FE58F0000EA0408A0E191
:10F1C0002008A0E10510A0E16C229FE58A0000EA7A
:10F1D0000408A0E12008A0E10510A0E15C229FE561
:10F1E000850000EA0408A0E12008A0E10510A0E1E4
:10F1F0004C229FE5800000EA0408A0E12008A0E17D
:10F200000510A0E13C229FE57B0000EA0408A0E194
:10F210002008A0E10510A0E12C229FE5760000EA7D
:10F220000408A0E12008A0E10510A0E11C229FE550
:10F23000710000EA0408A0E12008A0E10510A0E1A7
:10F240000C229FE56C0000EA0408A0E12008A0E180
:10F250000510A0E1FC219FE5670000EA0408A0E199
:10F260002008A0E10510A0E1EC219FE5620000EA82
:10F270000408A0E12008A0E10510A0E1DC219FE541
:10F280005D0000EA0408A0E12008A0E10510A0E16B
:10F29000CC219FE5580000EA0408A0E12008A0E185
:10F2A0000510A0E1BC219FE5530000EA0408A0E19D
:10F2B0002008A0E10510A0E1AC219FE54E0000EA86
:10F2C0000408A0E12008A0E10510A0E19C219FE531
:10F2D000490000EA0408A0E12008A0E10510A0E12F
:10F2E0008C219FE5440000EA0408A0E12008A0E189
:10F2F0000510A0E17C219FE53F0000EA0408A0E1A1
:10F300002008A0E10510A0E16C219FE53A0000EA89
:10F310000408A0E12008A0E10510A0E15C219FE520
:10F32000350000EA0408A0E12008A0E10510A0E1F2
:10F330004C219FE5300000EA0408A0E12008A0E18C
:10F340000510A0E13C219FE52B0000EA0408A0E1A4
:10F350002008A0E10510A0E12C219FE5260000EA8D
:10F360000408A0E12008A0E10510A0E11C219FE510
:10F37000210000EA0408A0E12008A0E10510A0E1B6
:10F380000C219FE51C0000EA0408A0E12008A0E190
:10F390000510A0E1FC209FE5170000EA0408A0E1A9
:10F3A0002008A0E10510A0E1EC209FE5120000EA92
:10F3B0000408A0E12008A0E10510A0E1DC209FE501
:10F3C0000D0000EA0408A0E12008A0E10510A0E17A
:10F3D000CC209FE5080000EA0408A0E12008A0E195
:10F3E0000510A0E1BC209FE5030000EA0408A0E1AD
:10F3F0002008A0E10510A0E1AC209FE5EEFEFFEBA8
:10F400000448A0E12448A0E10400A0E10610A0E126
:10F4100061FEFFEB0400A0E10510A0E1FDFEFFEBA3
:10F420000400A0E10510A0E10CFFFFEB70A81BE9B0
:10F43000400B0000540B0000680B00007C0B000028
:10F44000900B000060200000A40B0000B80B00002F
:10F45000CC0B0000F00B0000140C0000280C000086
:10F460003C0C0000500C0000640C0000780C000004
:10F4700080890000688C0000ACA000008C0C0000AB
:10F480004C3800002C220000900C0000940C00006E
:10F49000980C00009C0C0000A00C0000A40C0000C4
:10F4A000000D0000040D0000080D00000C0D000010
:10F4B0000DC0A0E110D82DE904B04CE20040A0E15D
:10F4C0001623A0E3022A82E21633A0E3033A83E282
:10F4D000030050E1020050110100A0030200A0133C
:10F4E0000010A0E360F9FFEB0239A0E3B830C4E1FB
:10F4F000BC30C4E10020A0E3B421C4E10130A0E3AA
:10F50000B831C4E1123CA0E3343083E2B031C4E14D
:10F51000BC21C4E110A81BE90030A0E3B030C0E179
:10F52000B230C0E1B430C0E1B630C0E1B830C0E1C3
:10F53000BA30C0E1BC30C0E1BE30C0E11030C0E53F
:10F54000B231C0E1B431C0E1B631C0E1B831C0E19F
:10F55000BA31C0E1BC31C0E10EF0A0E1B620D1E18A
:10F56000FF3CA0E3FE3083E2030052E1B431D0015E
:10F570000130C3030800000AB431D0E1013083E355
:10F58000B431C0E1B830D1E1020053E3B431D0016D
:10F5900002308303B431D0110230C313B431C0E15F
:10F5A000B821D0E1FF2C02E21030D1E5023083E136
:10F5B000B831C0E1B030D1E1C00053E34600000AE9
:10F5C0000A0000CA200053E37C00000A020000CABF
:10F5D000100053E30EF0A0115F0000EA400053E377
:10F5E0001D00000A800053E30EF0A0112A0000EA7B
:10F5F000050C53E38900000A020000CA010B53E323
:10F600000EF0A011920000EA060C53E38900000AF4
:10F61000010953E30EF0A011B431D0E1013983E3C5
:10F62000B431C0E1BC30D1E1040053E3B431D001C6
:10F6300004308303B431D0110430C313B431C0E1BA
:10F64000BC30D1E1040053E37700000AB431D0E1CB
:10F65000083083E3B431C0E10EF0A0E1B231D1E172
:10F66000020C53E3B431D001013C8303B431D01117
:10F67000013CC313B431C0E1B831D1E1B830C0E1CD
:10F68000B230D1E1020053E3B431D0014030C303C2
:10F69000B431D01140308313EDFFFFEAB431D1E132
:10F6A000020C53E3B431D001023C8303B431D011D6
:10F6B000023CC313B431C0E1BA31D1E1BC30C0E186
:10F6C000B430D1E1020053E3B431D0018030C30340
:10F6D000B431D01180308313DDFFFFEABA31D1E1BC
:10F6E000BC30C0E1B831D1E1B830C0E1B430D1E1D3
:10F6F000020053E3B431D0018030C303B431D011E0
:10F7000080308313B431C0E1B230D1E1020053E361
:10F71000B431D0014030C303B431D0114030831331
:10F72000B431C0E1B231D1E1020C53E3B431D001C4
:10F73000013C8303B431D011013CC313B431C0E1A7
:10F74000B431D1E1020C53E3B431D001023C830364
:10F75000B431D011023CC313BDFFFFEAB231D1E195
:10F76000020C53E3B431D001023C8303B431D01115
:10F77000023CC313B431C0E1B631D1E1020C53E312
:10F78000B431D001013C8303B431D011013CC31327
:10F79000B431C0E1B431D0E1403083E3B431C0E1F1
:10F7A000B431D0E1103083E3B431C0E1B831D1E1FC
:10F7B000B830C0E1BC31D1E1BC30C0E10EF0A0E115
:10F7C000B231D1E1020C53E3B431D001023C8303E6
:10F7D000B431C001B631D1E1020C53E3B431D001F0
:10F7E000013C8303B431C001BA30D1E1040053E3DA
:10F7F000B431D00104308303B431C001B431D0E15D
:10F80000403083E3B431C0E1B431D0E1203083E350
:10F81000B431C0E1B831D1E1B830C0E10EF0A0E1BF
:10F82000BE30D1E1080053E387FFFF0AB431D0E1D5
:10F830000830C3E386FFFFEABE30D1E1080053E39E
:10F84000B431D00108308303B431D0110830C31370
:10F85000B431C0E1BC30D1E1040053E3B431D00194
:10F8600004308303B431D0110430C31378FFFFEAAE
:10F87000010051E30600000AB431D0318338E03191
:10F88000A338E0310500003A020051E30EF0A01168
:10F89000040000EAB431D0E18338A0E1A338A0E14C
:10F8A000B431C0E10EF0A0E1123CA0E3343083E2B9
:10F8B000B031C0E10EF0A0E1FF1001E2B831D0E1BB
:10F8C000FF3C03E2B831C0E1B831D0E1013083E15F
:10F8D000B831C0E10EF0A0E1B801D0E1FF0000E2D4
:10F8E0000EF0A0E1B001D0E10EF0A0E1B000D0E157
:10F8F0000EF0A0E1B400D0E10EF0A0E10228A0E1FA
:10F900004228A0E10118A0E1010851E3B820C0019C
:10F91000BC20C0110EF0A0E10118A0E1BC01D0E1B3
:10F92000210810E00100A0130EF0A0E10118A0E1F1
:10F93000BC31D0E14138C3E1BC31C0E10EF0A0E1FF
:10F94000B400D0E10EF0A0E1B000D0E10EF0A0E1F3
:10F950000118A0E14118A0E1010052E3B831D00143
:10F96000FF30030201308301B831D0110130C311DF
:10F97000B831C0E10EF0A0E10118A0E1B431D0E14E
:10F98000033AC3E3B431C0E1B431D0E1413883E19B
:10F99000B431C0E10EF0A0E1010051E3B831D00173
:10F9A000013B8303B831D011013BC313B831C0E12F
:10F9B0000EF0A0E10DC0A0E100D82DE904B04CE2AA
:10F9C0001733A0E3073A83E2030050E10400001A72
:10F9D000010CA0E30110A0E323F8FFEB010CA0E36E
:10F9E000070000EA1733A0E3023983E2030050E185
:10F9F00000A81B19020CA0E30110A0E31AF8FFEB0A
:10FA0000020CA0E30010A0E317F8FFEB00A81BE92D
:10FA1000B020D1E1FF3CA0E3CF3083E2030052E10C
:10FA20001000001AB030D0E13030C3E3B030C0E194
:10FA3000B430D1E1400053E3B030D0014030830313
:10FA4000B030D0114030C313B030C0E1B630D1E196
:10FA5000800053E3B030D00180308303B030D01148
:10FA60008030C313050000EAB030D0E13030C3E38A
:10FA7000B030C0E1B030D0E1B020D1E1023083E15C
:10FA8000B030C0E1B230D1E1040053E30A00001A03
:10FA9000B430D0E1043083E3B430C0E1BA30D1E116
:10FAA000080053E3B430D00108308303B430D011E0
:10FAB0000830C313B430C0E1100000EAB430D0E124
:10FAC0000430C3E3B430C0E1B030D0E1FF3003E232
:10FAD000B030C0E10C20D1E5B030D0E1023483E198
:10FAE000B030C0E1B031D0E1FF3C03E2B031C0E161
:10FAF0000D30D1E5B021D0E1023083E1B031C0E179
:10FB0000B030D0E10F30C3E3B030C0E1B030D0E16D
:10FB1000B820D1E1023083E1B030C0E10EF0A0E1C5
:10FB20003030E0E3B030C0E10430E0E3B230C0E1B7
:10FB30004030E0E3B430C0E18030E0E3B630C0E113
:10FB40000730A0E3B830C0E10830E0E3BA30C0E1EC
:10FB50000030A0E30C30C0E50D30C0E50EF0A0E1B0
:10FB6000010051E3B430D00102308303B430D0112E
:10FB70000230C313B430C0E10EF0A0E10118A0E1DF
:10FB80004118A0E1010052E3B431D00101308301FA
:10FB9000B431D0110130C311B431C0E10EF0A0E195
:10FBA0000118A0E14118A0E1010052E30700001A8A
:10FBB0000138A0E1020853E3B432D00102308303DC
:10FBC000B432D01101308313B432C0E10EF0A0E1A1
:10FBD0000138A0E1020853E3B432D0010230C3037C
:10FBE000B432D0110130C313F6FFFFEA0118A0E1CF
:10FBF0004118A0E1B810C0E10EF0A0E1B800D0E1DA
:10FC00000EF0A0E1010051E3B430D00101308303D4
:10FC1000B430D0110130C313B430C0E10EF0A0E114
:10FC20000030A0E30118A0E1A12AA0E12118A0E181
:10FC30001F1001E2010052E3BC30D0010100000AB4
:10FC4000020052E3B831D0010100A0E3103113E00B
:10FC50000000A0030EF0A0E11F1001E20130A0E3BC
:10FC60001331A0E1B032C0E10EF0A0E10118A0E133
:10FC7000BC31D0E1213813E00000A0030100A01343
:10FC80000EF0A0E10118A0E14118A0E1B012C0E11E
:10FC90000EF0A0E10DC0A0E110D82DE904B04CE2B7
:10FCA0000040A0E11733A0E3033983E2030050E1F1
:10FCB0000500001A4000A0E30110A0E36AF7FFEB83
:10FCC0004000A0E30010A0E367F7FFEB1733A0E3C9
:10FCD0000D3A83E2030054E110A81B198000A0E351
:10FCE0000110A0E360F7FFEB8000A0E30010A0E3A9
:10FCF0005DF7FFEB10A81BE90DC0A0E1F0D82DE9DE
:10FD000004B04CE20040A0E10160A0E10F70A0E36C
:10FD100070F8FFEB803260E0033180E08351A0E1B6
:10FD20000400A0E10010A0E3760000EB1430D4E55D
:10FD30001F3003E21430C4E5FE34E0E3693843E2E7
:10FD4000C53E43E2030055E11430D495403083931F
:10FD50002500009A7C319FE5030055E11430D495CD
:10FD6000603083932000009ACB37A0E3073983E209
:10FD70004F3083E2030055E11430D495833CE09189
:10FD8000A33CE0911800009A3F33E0E3433943E29B
:10FD9000AE3D43E2030055E11430D4950330E091C9
:10FDA0005F3003920330E0910F00009AFB34E0E3F0
:10FDB000ED3943E2033B43E2030055E11430D495AF
:10FDC000033DE091233DE0910700009AFA34E0E31F
:10FDD000A13A43E20F3C43E2030055E10300008AED
:10FDE0001430D4E5833DE0E1A33DE0E11430C4E507
:10FDF0000400A0E10110A0E3420000EB0630D6E5CC
:10FE0000100053E30030D405103083030030D415C4
:10FE10001030C3130030C4E50730D6E5040053E3C7
:10FE20000030D405043083030030D4150430C313EC
:10FE30000030C4E50430D6E51030C4E51430D4E514
:10FE40000630C3E31430C4E5B420D6E1032C02E24B
:10FE50001430D4E5C23383E11430C4E5001096E5D4
:10FE6000613BA0E32A3E83E2030051E10600008AE1
:10FE70000500A0E1571600EB070040E28007A0E173
:10FE80004078A0E17F3007E20D0000EA001096E51F
:10FE9000613AA0E32A3D83E2030051E10900008AB0
:10FEA0000500A0E14B1600EB090040E228309FE579
:10FEB000902383E08337A0E14378A0E1873CE0E131
:10FEC000A33CE0E10C30C4E50738A0E1A33BA0E18E
:10FED0001C30C4E5F0A81BE9FF596202ABAAAAAA2C
:10FEE0004E3DA0E3083083E2003080E50030A0E31F
:10FEF000B430C0E11030E0E30630C0E50430E0E3A8
:10FF00000730C0E50EF0A0E1010051E30030D0055C
:10FF1000203083030030C0050030D005203083033B
:10FF20000030D0152030C3130030C0E50EF0A0E142
:10FF3000010051E30030D005083083030030D015B4
:10FF40000830C3130030C0E50EF0A0E1010051E31A
:10FF50000030D005023083030030D0150230C313C7
:10FF60000030C0E50EF0A0E1010051E30030D00503
:10FF7000043083030030D0150430C3130030C0E5D3
:10FF80000EF0A0E1010051E30030D0050130830301
:10FF90000030D0150130C3130030C0E50EF0A0E1F1
:10FFA000FF1001E21733A0E3033983E2030050E1BD
:10FFB0000400000A1733A0E30D3A83E2030050E186
:10FFC0000000A0130EF0A0110000D1E70EF0A0E198
:10FFD0000118A0E108C0D0E50030D0E50420D0E54C
:10FFE0000229A0E10C2D82E1043003E20336A0E1F6
:10FFF000223983E1213813E00000A0030100A0139F
:020000021000EC
:100000000EF0A0E10DC0A0E10E002DE910D82DE901
:1000100010B04CE204D04DE20040A0E1B430DBE18E
:10002000B2314BE10A205BE5B2315BE1800053E382
:10003000400053130800000A020C53E30600000AB4
:10004000020B53E3010B53130300000A010A53E3AD
:100050000100000A020A53E30800001A0830D4E540
:10006000B2315BE1400053E31000000A020A53E39F
:100070000030D405203083030030C4051B0000EAA3
:10008000B2315BE1040053E3010053130300000AA3
:10009000080053E30100000A200053E30A00001A9D
:1000A0000430D4E5B2315BE1010053E30100001AF2
:1000B0001820C4E50D0000EAB2315BE1200053E3F3
:1000C000080053131830D405080000EAB2315BE190
:1000D000010C53E3020053130400001A0010A0E3C4
:1000E00088FFFFEB0400A0E10110A0E385FFFFEB18
:1000F00010A81BE9FF1001E2FF2002E2010052E319
:1001000001108103FE1001121810C0E50EF0A0E1ED
:10011000FF1001E21810C0E50EF0A0E11800D0E5D4
:10012000FF0000E20EF0A0E10030A0E10400D0E505
:100130000830D3E5030480E10009A0E12009A0E133
:100140000EF0A0E10DC0A0E110D82DE904B04CE202
:100150000148A0E14448A0E1F2FFFFEB0008A0E164
:10016000040850E10000A0130100A00310A81BE93F
:10017000FF0000E2FF1001E215C3A0E300008CE5E0
:1001800004108CE52221A0E10C208CE52331A0E1B4
:1001900010308CE518309CE5183083E318308CE57E
:1001A0000EF0A0E110402DE90008A0E14008A0E118
:1001B0000228A0E142C8A0E10338A0E143E8A0E1A1
:1001C000F840DDE1010C51E31523A003183092053E
:1001D000013C83031523A01318309215013CC3136F
:1001E000183082E51523A0E3102082E2003092E56A
:1001F0000331A0E16010A0E3B010C3E1002092E55C
:100200000038A0E12338A0E1023183E10C28A0E10D
:10021000223883E10E28A0E1223883E10428A0E1FE
:10022000223883E10320A0E3B020C3E11080BDE8C1
:1002300004D04DE200008DE500309DE52020A0E3D4
:10024000B020C3E100309DE5D020A0E3B020C3E1A1
:1002500004D08DE20EF0A0E104D04DE200008DE567
:1002600000309DE58020A0E3B020C3E100309DE593
:10027000D020A0E3B020C3E104D08DE20EF0A0E1D5
:100280000118A0E14118A0E10330C0E34020A0E341
:10029000B020C3E1B010C0E10EF0A0E1FF0000E229
:1002A0000118A0E14118A0E11523A0E3102082E28B
:1002B000003092E50331A0E1C0C0A0E3B0C0C3E1CB
:1002C000003092E50331A0E1B01083E10EF0A0E12F
:1002D000000090E50EF0A0E1FF0000E21523A0E38E
:1002E000102082E2003092E50331A0E19810A0E3F3
:1002F000B010C3E1003092E50331A0E1000093E7C4
:10030000003092E50331A0E1FF20A0E3B020C3E17B
:100310000EF0A0E104D04DE200108DE5FF0000E2F8
:1003200000309DE57010A0E3B010C3E100309DE502
:10033000B030D3E1800013E3FBFFFF0A00309DE5FE
:10034000B020D3E100309DE5FF10A0E3B010C3E181
:10035000000012E10000A0030100A01304D08DE210
:100360000EF0A0E11523A0E3102082E2003092E518
:100370000331A0E19010A0E3B010C3E1003092E59A
:100380000331A0E1B401D3E1003092E50331A0E1F3
:10039000FF20A0E3B020C3E1A005A0E1010080E2BE
:1003A000030000E20EF0A0E11533A0E3180093E58E
:1003B000010C00E2000050E20100A0130EF0A0E1E9
:1003C00004D04DE200008DE500309DE5B020A0E3B3
:1003D000B020C3E104D08DE20EF0A0E104D04DE2E4
:1003E00000008DE500309DE5D020A0E3B020C3E102
:1003F00004D08DE20EF0A0E104D04DE200008DE5C6
:1004000000309DE55020A0E3B020C3E104D08DE290
:100410000EF0A0E104D04DE200008DE5010051E3B3
:100420000500001A00309DE56020A0E3B020C3E184
:1004300000309DE5B010C3E1050000EA00309DE505
:100440006020A0E3B020C3E100309DE5D020A0E310
:10045000B020C3E100309DE5FF20A0E3B020C3E160
:1004600004D08DE20EF0A0E11523A0E3102082E27B
:10047000003092E50331A0E19010A0E3B010C3E199
:10048000003092E50331A0E1B011D3E1003092E5F4
:100490000331A0E1FF20A0E3B020C3E1010010E19F
:1004A0000000A0030100A0130EF0A0E104D04DE273
:1004B00000008DE50010A0E300309DE57020A0E372
:1004C000B020C3E100309DE5B030D3E1800013E3FC
:1004D0000800001AFF24E0E3012042E2011081E25B
:1004E00000309DE5B030D3E1800013E30100001A35
:1004F000020051E1F8FFFF9A00309DE5FF20A0E3E4
:10050000B020C3E1FF04E0E3000051E00100A013CC
:1005100004D08DE20EF0A0E11613A0E3011A81E2EF
:10052000043091E5042090E5023083E1043081E558
:100530000030D0E5010053E3083091050420900518
:1005400002308301083081051633A013013A83126B
:1005500004109015082093150120C211082083155E
:100560000EF0A0E10DC0A0E100D82DE904B04CE2EE
:10057000020AA0E30110A0E33BF5FFEB020AA0E3AF
:100580000010A0E338F5FFEB00A81BE90030A0E362
:10059000043080E50030C0E50EF0A0E1010050E33A
:1005A0001623A003012A8202003092050230830341
:1005B0001623A013012A8212003092150230031272
:1005C000003082E50EF0A0E11633A0E3013A83E2A9
:1005D000102093E5020080E1100083E50EF0A0E119
:1005E0001633A0E3013A83E20C3093E5030010E1F7
:1005F0000000A0030100A0130EF0A0E11633A0E359
:10060000013A83E20C0083E50EF0A0E11623A0E39B
:10061000012A82E20C3092E5030010E10300000A97
:10062000043092E5030010E10100A0130EF0A011C8
:100630000000A0E30EF0A0E11633A0E3013A83E24C
:100640000C0083E50EF0A0E10632A0E3213D83E239
:100650000008A0E12008A0E1000083E50EF0A0E181
:100660000632A0E3213D83E2000093E50008A0E10B
:100670002008A0E10EF0A0E1213DA0E3463283E294
:100680000008A0E12008A0E1000083E50EF0A0E151
:10069000213DA0E3463283E2000093E50008A0E19B
:1006A0002008A0E10EF0A0E1213DA0E3863283E224
:1006B000000093E50008A0E12008A0E10EF0A0E111
:1006C000213DA0E3C63283E20008A0E12008A0E1BA
:1006D000000083E50EF0A0E1213DA0E3C63283E2F5
:1006E000000093E50008A0E12008A0E10EF0A0E1E1
:1006F0000632A0E3853E83E20700C0E30008A0E1E4
:100700002008A0E1000083E50EF0A0E10632A0E39E
:10071000853E83E2000093E50008A0E12008A0E107
:100720000EF0A0E1FF0000E20632A0E3023B83E20C
:100730000118A0E12118A0E1001183E70EF0A0E16B
:10074000FF0000E20632A0E3023B83E2000193E7F0
:100750000008A0E12008A0E10EF0A0E1FF0000E207
:100760000118A0E10622A0E3022B82E2003192E709
:10077000763CC3E37030C3E3031881E12118A0E1A4
:10078000001182E70EF0A0E1FF0000E20632A0E3D4
:10079000023B83E2000193E7060C00E20EF0A0E1C9
:1007A000FF0000E20118A0E10632A0E3023B83E271
:1007B000003193E7073AC3E34030C3E30338A0E1D5
:1007C0004338A0E14128A0E1010611E310302312D3
:1007D000200012E3203023120622A0E3022B82E243
:1007E0000338A0E12338A0E1003182E70EF0A0E158
:1007F000FF0000E20118A0E10632A0E3023B83E221
:10080000003193E70139C3E37030C3E30338A0E15B
:100810004338A0E14128A0E1010211E3013A23128B
:10082000020A12E3023A23120622A0E3022B82E21A
:100830000338A0E12338A0E1003182E70EF0A0E107
:100840000DC0A0E130D82DE904B04CE2FF5000E229
:10085000FF4001E20500A0E1B8FFFFEB0008A0E1C6
:100860004008A0E1010054E30622A003022B82020B
:10087000013AC0030400000A020054E330A81B1927
:100880000622A0E3022B82E21030C0E30338A0E18D
:100890002338A0E1053182E730A81BE9FF0000E220
:1008A0000632A0E3023B83E2000193E7300000E25E
:1008B0000EF0A0E1FF0000E20632A0E3023B83E27B
:1008C000000193E7030A00E20EF0A0E1FF0000E25E
:1008D0000622A0E3022B82E2003192E7073AC3E34B
:1008E0004030C3E30338A0E12338A0E1303023E2F5
:1008F000003182E70EF0A0E1FF0000E20622A0E353
:10090000022B82E2003192E70139C3E37030C3E386
:100910000338A0E12338A0E1033A23E2003182E763
:100920000EF0A0E1FF0000E20622A0E3022B82E22B
:10093000003192E7013C83E3073AC3E37030C3E33D
:100940000338A0E12338A0E1003182E70EF0A0E1F6
:10095000FF0000E20622A0E3022B82E2003192E7D0
:10096000713CC3E37030C3E30338A0E12338A0E156
:10097000003182E70EF0A0E1FF0000E20622A0E3D2
:10098000022B82E2003192E7713CC3E37030C3E393
:100990000338A0E12338A0E1003182E70EF0A0E1A6
:1009A000FF0000E20622A0E3022B82E2003192E780
:1009B000013C83E3073AC3E37030C3E30338A0E1AB
:1009C0002338A0E1003182E70EF0A0E1FF0000E251
:1009D0000622A0E3022B82E2003192E7013C83E38E
:1009E000073AC3E37030C3E30338A0E12338A0E142
:1009F000003182E70EF0A0E1FF0000E20622A0E352
:100A0000022B82E2003192E7713CC3E37030C3E312
:100A10000338A0E12338A0E1003182E70EF0A0E125
:100A2000FF0000E20632A0E3023B83E2000193E70D
:100A3000300000E2100050E30000A0130100A0030A
:100A40000EF0A0E1FF0000E20632A0E3023B83E2E9
:100A5000000193E7030A00E2010A50E30000A0133B
:100A60000100A0030EF0A0E1FF0000E20622A0E3D7
:100A7000022B82E2003192E77030C3E3033AA0E137
:100A8000233AA0E1003182E70EF0A0E1FF0000E28E
:100A90000622A0E3022B82E2003192E7073AC3E389
:100AA000F030C3E30338A0E12338A0E1003182E74E
:100AB0000EF0A0E1FF0000E20622A0E3022B82E29A
:100AC000003192E7073AC3E37030C3E30338A0E193
:100AD0002338A0E1013983E3003182E70EF0A0E181
:100AE000FF0000E20622A0E3022B82E2003192E73F
:100AF000073AC3E37030C3E30338A0E12338A0E131
:100B0000403083E3003182E70EF0A0E1FF0000E215
:100B10000622A0E3022B82E2003192E7010913E3EF
:100B20000EF0A001003192E7073AC3E37030C3E34F
:100B30000338A0E12338A0E1013983E3003182E7E3
:100B40000EF0A0E1FF0000E20622A0E3022B82E209
:100B5000003192E7400013E30EF0A001003192E76C
:100B6000073AC3E37030C3E30338A0E12338A0E1C0
:100B7000403083E3003182E70EF0A0E1FF0000E2A5
:100B8000FF1001E20622A0E3022B82E2003192E78D
:100B9000073AC3E37030C3E30338A0E12338A0E190
:100BA000013083E1003182E70EF0A0E1FF0000E2B6
:100BB0000632A0E3023B83E2000193E70F0000E26C
:100BC0000EF0A0E1FF0000E206C2A0E385CE8CE2B9
:100BD00000209CE50228A0E18001A0E1222880E01D
:100BE000062282E2B230D2E10338A0E1003082E591
:100BF00000309CE50338A0E1230880E0060280E293
:100C00000310C1E30118A0E12118A0E1003090E534
:100C1000031081E1001080E50EF0A0E1FF0000E28A
:100C200006C2A0E385CE8CE200309CE50338A0E14B
:100C30008001A0E1233880E0063283E2B020D3E1D6
:100C4000002083E500309CE50338A0E1230880E024
:100C5000060280E20118A0E12119A0E10119A0E13A
:100C6000003090E5031081E1001080E50EF0A0E176
:100C7000FF0000E20632A0E3853E83E2003093E508
:100C80000338A0E18001A0E1230880E0060280E2B1
:100C9000B000D0E10EF0A0E1FF0000E20632A0E3D8
:100CA000853E83E2003093E50338A0E18001A0E1B6
:100CB000230880E0060280E2B200D0E10EF0A0E15D
:100CC000FF0000E206C2A0E385CE8CE200209CE596
:100CD0000228A0E18001A0E1222880E0462282E2F1
:100CE000003092E5FF3FC3E30330C3E3003082E509
:100CF00000309CE50338A0E1230880E0460280E252
:100D00000118A0E1003090E5213883E1003080E552
:100D10000EF0A0E110402DE9FFC000E20118A0E1B3
:100D20004118A0E10040A0E30138A0E13F0853E3EF
:100D3000A3E8A0910241A0830138A08123EBA08108
:100D40000602A0E3850E80E2002090E50228A0E1E3
:100D50008C11A0E1222881E0462282E2003092E557
:100D60000231C3E3003082E5003090E50338A0E1B2
:100D7000233881E0463283E2002093E5022084E1BB
:100D8000002083E5003090E50338A0E1233881E0BE
:100D9000463283E2002093E51F23C2E3002083E56F
:100DA000003090E50338A0E1233881E0463283E249
:100DB000002093E50E2D82E1002083E5003090E5D0
:100DC0000338A0E1231881E0461281E2003091E56A
:100DD000FF37C3E30338C3E3003081E51080BDE88B
:100DE000FF0000E20632A0E3853E83E2003093E597
:100DF0000338A0E18001A0E1230880E0460280E200
:100E0000B000D0E1000BA0E1200BA0E10EF0A0E1CA
:100E1000FF0000E20632A0E3853E83E2003093E566
:100E20000338A0E18001A0E1230880E0460280E2CF
:100E3000B200D0E1000BA0E1200BA0E10EF0A0E198
:100E400004E02DE5FF0000E206E2A0E385EE8EE27D
:100E500000C09EE50CC8A0E18001A0E12CC880E0A4
:100E600006C28CE2B230DCE10338A0E100308CE550
:100E700000309EE50338A0E1233880E0063283E2AB
:100E80000310C1E30118A0E12118A0E100C093E51F
:100E90000C1081E1001083E500309EE50338A0E1ED
:100EA000233880E0063283E2B010D3E1001083E5FE
:100EB00000309EE50338A0E1230880E0060280E2CE
:100EC0000228A0E12229A0E10229A0E1003090E55A
:100ED000032082E1002080E504F09DE4FF0000E2B1
:100EE00006C2A0E385CE8CE200209CE50228A0E1AA
:100EF0008001A0E1222880E0062282E2B230D2E125
:100F00000338A0E1003082E500309CE50338A0E121
:100F1000230880E0060280E20310C1E30118A0E18B
:100F20002118A0E1003090E5031081E1001080E578
:100F30000EF0A0E1FF0000E206C2A0E385CE8CE245
:100F400000309CE50338A0E18001A0E1233880E077
:100F5000063283E2B020D3E1002083E500309CE537
:100F60000338A0E1230880E0060280E20118A0E136
:100F70002119A0E10119A0E1003090E5031081E101
:100F8000001080E50EF0A0E1FF0000E20632A0E3D1
:100F9000853E83E2003093E50338A0E18001A0E1C3
:100FA000230880E0060280E2B000D0E10EF0A0E16C
:100FB000FF0000E20632A0E3853E83E2003093E5C5
:100FC0000338A0E18001A0E1230880E0060280E26E
:100FD000B200D0E10EF0A0E10DC0A0E170D82DE983
:100FE00004B04CE2FF4000E2FF6001E20258A0E1E1
:100FF0002558A0E10400A0E10610A0E10520A0E131
:10100000040000EB0400A0E10610A0E10520A0E12F
:101010003F0000EB70A81BE90DC0A0E110D82DE93E
:1010200004B04CE2FFC000E2FF1001E20228A0E1A0
:101030004228A0E100E0A0E3020051E30400001A0E
:101040000218A0E12118A0E10C00A0E11BFFFFEBBA
:1010500010A81BE9010051E310A81B190238A0E1F8
:101060003F0853E3A348A09102E9A0830238A0817E
:10107000234BA0810602A0E3850E80E2002090E5CC
:101080000228A0E18C11A0E1222881E0462282E220
:10109000003092E50239C3E3003082E5003090E58C
:1010A0000338A0E1233881E0463283E2002093E553
:1010B00002208EE1002083E5003090E50338A0E1B6
:1010C000233881E0463283E2002093E51F2BC2E300
:1010D000002083E5003090E50338A0E1233881E06B
:1010E000463283E2002093E5042582E1002083E577
:1010F000003090E50338A0E1231881E0461281E238
:10110000003091E5FF3FC3E30330C3E3003081E5E6
:1011100010A81BE910402DE9FFE000E2FF1001E2FA
:101120000228A0E142C8A0E1020051E30F00001A2A
:101130000602A0E3850E80E2003090E50338A0E1CE
:101140008E11A0E1233881E0463283E2B020D3E162
:10115000002083E5003090E50338A0E1231881E00A
:10116000461281E2003091E50C3883E12E0000EA5E
:10117000010051E31080BD180040A0E30C38A0E14D
:101180003F0853E3A3C8A0910241A0830C38A0817B
:1011900023CBA0810602A0E3850E80E2002090E52B
:1011A0000228A0E18E11A0E1222881E0462282E2FD
:1011B000003092E50231C3E3003082E5003090E573
:1011C0000338A0E1233881E0463283E2002093E532
:1011D000022084E1002083E5003090E50338A0E19F
:1011E000233881E0463283E2002093E51F23C2E3E7
:1011F000002083E5003090E50338A0E1233881E04A
:10120000463283E2002093E50C2D82E1002083E545
:10121000003090E50338A0E1231881E0461281E216
:10122000003091E5FF37C3E30338C3E3003081E5C5
:101230001080BDE8FF0000E20632A0E3853E83E2B5
:10124000003093E50338A0E18001A0E1230880E0AD
:10125000460280E2B000D0E1000BA0E1200BA0E14B
:101260000EF0A0E1FF0000E20632A0E3853E83E23B
:10127000003093E50338A0E18001A0E1230880E07D
:10128000460280E2B200D0E1000BA0E1200BA0E119
:101290000EF0A0E1FF0000E2FF1001E2010051E3C7
:1012A0000800001A0622A0E3022B82E2003192E736
:1012B000073AC3E37030C3E30338A0E12338A0E169
:1012C000403083E3090000EA020051E30EF0A01170
:1012D0000622A0E3022B82E2003192E7073AC3E341
:1012E0007030C3E30338A0E12338A0E1013983E380
:1012F000003182E70EF0A0E1FF1001E20118A0E149
:10130000001C81E12118A0E10100A0E10EF0A0E1A4
:101310000008A0E14008A0E1FF3000E20008A0E1E1
:101320000334A0E1203C83E10300A0E10EF0A0E142
:10133000FF0000E20622A0E3862E82E2003092E562
:10134000EF30C3E3003082E50002A0E1000082E557
:101350000EF0A0E1FF0000E20622A0E3862E82E26A
:10136000003092E50730C3E3003082E5000082E5FB
:101370000EF0A0E1FF0000E2FF1001E285CEA0E345
:1013800086C28CE20111A0E100309CE50F20A0E3B1
:101390001231C3E100308CE500309CE5103183E16F
:1013A00000308CE50EF0A0E1FF0000E2852EA0E306
:1013B000C62282E2003092E50130C3E3003082E5CC
:1013C000852EA0E3862282E2003092E5033AC3E351
:1013D000003082E5010080E2003092E5003683E1D2
:1013E000003082E50EF0A0E1852EA0E3862282E2A5
:1013F000003092E5033AC3E3003082E50EF0A0E14D
:10140000FF0000E2852EA0E3C62282E2003092E5D2
:101410008030C3E3003082E5852EA0E3462282E2DD
:10142000003092E50110A0E3113083E1003082E545
:101430000EF0A0E1FF0000E2852EA0E3462282E24A
:10144000003092E50110A0E31130C3E1003082E5E5
:101450000EF0A0E1FF0000E2852EA0E3C62282E2AA
:10146000003092E51E3CC3E3003082E5003092E597
:10147000803483E1003082E50EF0A0E1FF0000E25D
:10148000852EA0E3C62282E2003092E51E30C3E33F
:10149000003082E5003092E5803083E1003082E563
:1014A0000EF0A0E1853EA0E3C63283E2002093E582
:1014B000012C82E3002083E5002093E5022A82E3E9
:1014C000002083E50EF0A0E1853EA0E3C63283E272
:1014D000002093E5012082E3002083E5002093E5CE
:1014E000202082E3002083E50EF0A0E1853EA0E30A
:1014F000C63283E2002093E5012CC2E3002083E59D
:10150000002093E5022AC2E3002083E50EF0A0E16B
:10151000853EA0E3C63283E2002093E50120C2E3CA
:10152000002083E5002093E52020C2E3002083E52E
:101530000EF0A0E1852EA0E3C62282E2003092E503
:10154000403083E3003082E50EF0A0E1852EA0E379
:10155000C62282E2003092E54030C3E3003082E5EB
:101560000EF0A0E1FF0000E2862EA0E3462282E218
:10157000003092E5FF30C3E3003082E5003092E5B1
:10158000030080E1000082E50EF0A0E1FF0000E230
:10159000862EA0E3462282E2003092E5FF3CC3E3C0
:1015A000003082E5003092E5003483E1003082E5CE
:1015B0000EF0A0E1FF0000E20622A0E3862E82E208
:1015C000003092E5FF3003E2003082E5003092E522
:1015D000003483E1003082E50EF0A0E10632A0E3A2
:1015E000863E83E2003093E50000A0E30EF0A0E128
:1015F0000DC0A0E100D82DE904B04CE20008A0E144
:101600002008B0E12C309F05003093050120A00395
:10161000B821C30100A81B091C309FE5003093E5E9
:101620000FE0A0E100F093E508309FE5003093E57E
:10163000120083E200A81BE980180004601800046F
:101640000DC0A0E110D82DE904B04CE250309FE568
:10165000002093E50510D2E548309FE50130D3E541
:10166000030051E10C00008A0430D2E5000053E38E
:101670000900001AB840D2E1000054E30600001A45
:101680001210C2E520309FE5003093E50FE0A0E1A5
:1016900004F093E50400A0E110A81BE90200A0E318
:1016A00010A81BE9801800048C01000460180004D5
:1016B0000DC0A0E100D82DE904B04CE20008A0E183
:1016C0002008B0E12C309F05003093050120A003D5
:1016D000B821C30100A81B091C309FE5003093E529
:1016E0000FE0A0E108F093E508309FE5003093E5B6
:1016F000140083E200A81BE98018000460180004AD
:101700000DC0A0E130D82DE904B04CE298309FE53F
:10171000002093E594409FE5003094E50900D3E56F
:101720000510D3E50FE0A0E118F092E50050A0E12C
:10173000004094E51230D4E5000053E31800000A9D
:10174000000050E30500001A0830D4E5000053E320
:101750000200001A0430D4E5000053E30100000A3F
:101760000200A0E330A81BE9000050E30C00001ABF
:101770003C309FE5003093E50FE0A0E10CF093E5ED
:1017800028109FE5002091E50930D2E51330C2E52D
:10179000002091E50530D2E51430C2E50500A0E156
:1017A00030A81BE90200A0E330A81BE900180004E0
:1017B00080180004601800040DC0A0E100D82DE9D5
:1017C00004B04CE20008A0E12008B0E1FC309F0525
:1017D000003093050220A003B821C30100A81B0913
:1017E000EC109FE50030A0E3B030C1E1DC309FE5B4
:1017F000002093E50030D2E57F0013E30A00001AD1
:101800001120D2E5200012E30030D11502308313FD
:101810000030C115400012E3B4209F050030D2050E
:101820000130C3032200000A1E0000EA9C309FE53D
:10183000003093E50030D3E57F3003E2010053E34D
:101840008C009F0500A81B0980309FE5002093E5D0
:101850000030D2E57F3003E2020053E30000A01322
:1018600000A81B190920D2E50230A0E10F2002E2F6
:10187000800013E30500000A0632A0E3023B83E286
:10188000023193E7303003E2100053E3040000EA32
:101890000632A0E3023B83E2023193E7033A03E21C
:1018A000010A53E30300001A24209FE50030D2E52B
:1018B000013083E30030C2E518309FE5003093E546
:1018C0000FE0A0E110F093E504009FE500A81BE9FC
:1018D00080180004A0170004601800040DC0A0E1E7
:1018E00030D82DE904B04CE280319FE5002093E52B
:1018F0000000D2E57F0010E21130D2052030C30392
:101900001130C20530A81B09020050E30200A013E9
:1019100030A81B1954319FE5002093E5B430D2E183
:10192000000053E31B00001A0830D2E5000053E327
:101930001800001A34319FE5003093E50900D3E523
:101940008040C0E30410A0E1D930D3E1000053E3AC
:101950000632A0B3023B83B2043193B7302003B206
:101960000632A0A3023B83A2043193A7032A03A259
:10197000FC309FE50030D3E5000052E30300511135
:101980000400002AE4309FE5003093E51230D3E5EF
:10199000000053E30100001A0200A0E330A81BE995
:1019A000800010E30C00000A0632A0E3023B83E251
:1019B000043193E7303003E2100053E32500001AAE
:1019C000FF4004E20400A0E15DFCFFEB0400A0E1A5
:1019D0003010A0E371FBFFEB1E0000EA0652A0E30B
:1019E000025B85E2043195E7033A03E2010A53E31F
:1019F0001800001A000054E30B00001A74309FE531
:101A00002C10D3E50400A0E1C1FCFFEB043195E705
:101A10000139C3E37030C3E30338A0E12338A0E108
:101A2000033A23E2043185E70A0000EAFF0004E2FA
:101A300035FCFFEB0622A0E3022B82E2043192E7A1
:101A40000139C3E37030C3E30338A0E12338A0E1D8
:101A5000033A23E2043182E71C309FE5003093E52E
:101A60000FE0A0E114F093E50000A0E330A81BE92B
:101A7000801800048C010004900100046018000428
:101A80000DC0A0E100D82DE904B04CE2E4309FE5A0
:101A9000003093E509E0D3E580C0CEE3D930D3E14F
:101AA000000053E30632A0B3023B83B20C3193B77C
:101AB000300003B20632A0A3023B83A20C3193A7ED
:101AC000030A03A2B0309FE50030D3E503005CE1D8
:101AD0000C00002A9C309FE5001093E5B420D1E172
:101AE000000050E30030A0130130A003000052E3D7
:101AF00001308313000053E30200001A1230D1E5D5
:101B0000000053E30100001A0200A0E300A81BE953
:101B100080001EE30800000A0622A0E3022B82E2F6
:101B20000C3192E7073AC3E34030C3E30338A0E146
:101B30002338A0E1103023E2070000EA0622A0E3E8
:101B4000022B82E20C3192E70139C3E37030C3E328
:101B50000338A0E12338A0E1013A23E20C3182E707
:101B600018309FE5003093E50FE0A0E118F093E511
:101B70000000A0E300A81BE9801800048C01000409
:101B8000601800040DC0A0E100D82DE904B04CE2BB
:101B900024309FE5002093E51130D2E5203083E327
:101BA0001130C2E514309FE5003093E50FE0A0E16D
:101BB0001CF093E50000A0E300A81BE980180004D6
:101BC0006018000401C0A0E124309FE5002093E5E7
:101BD000BA11D2E10008A0E12008B0E1B430DC0184
:101BE00003306100B831C20100309C150300811040
:101BF0000EF0A0E1801800040DC0A0E1F0D82DE99E
:101C000004B04CE228319FE5003093E5187083E280
:101C1000B821D3E1083097E5000053E300005213E8
:101C20001500000AB440D7E1020054E10240A021AF
:101C30000450A0E10400A0E10FE0A0E108F097E566
:101C40000060A0E1B030D7E1033064E0B030C7E11C
:101C5000B230D7E1043083E0B230C7E10000A0E346
:101C60000CFCFFEB0010A0E10118A0E12118A0E19D
:101C70000600A0E10420A0E18A0300EBB030D7E128
:101C8000000053E30800000AA8309FE5032AA0E300
:101C9000B020C3E10000A0E30010A0E107FCFFEBCF
:101CA00094309FE53020A0E3B020C3E1B020D7E11D
:101CB000B430D7E1030052E174309F250020932512
:101CC0000330A0230500002AB030D7E1000053E321
:101CD0000400000A58309FE5002093E50530A0E39A
:101CE0001030C2E5F0A81BE944309FE5002093E5E1
:101CF0000630A0E31030C2E50612A0E3851E81E2A3
:101D0000002091E50228A0E12228A0E14602A0E3FC
:101D1000003092E7FF3FC3E30330C3E3003082E7C4
:101D2000003091E510309FE53020A0E3B020C3E102
:101D3000F0A81BE980180004B0170004C0170004C5
:101D40000DC0A0E1F0D92DE904B04CE2BC309FE514
:101D5000003093E5187083E2B821D3E11080D3E519
:101D6000000052E3040058030780A003A0309F0541
:101D70001020A0032000000AB440D7E1040052E183
:101D80000280A0830480A093020054E10240A021BD
:101D90000450A0E10400A0E10FE0A0E108F097E505
:101DA0000060A0E10000A0E3B0FBFFEB0010A0E1A9
:101DB0000118A0E12118A0E10600A0E10420A0E1A3
:101DC000240300EB0000A0E30410A0E1BBFBFFEB49
:101DD000B030D7E1033064E0B030C7E1B230D7E1D2
:101DE000043083E0B230C7E124309FE53020A0E327
:101DF000B020C3E11C309FE5032AA0E3B020C3E17B
:101E000008309FE5003093E51080C3E5F0A91BE999
:101E100080180004C0170004B01700040DC0A0E132
:101E200010D82DE904B04CE20200A0E3C4319FE5D4
:101E3000003093E50140D3E50030D3E57F0013E3A4
:101E40003200001A090054E30100001AFBFDFFEB09
:101E5000470000EA050054E30F00001A94319FE5A3
:101E6000002093E5D530D2E1000053E34C0000BAE6
:101E70000430D2E5000053E34900001AB830D2E143
:101E8000000053E34600001A1230D2E5000053E38D
:101E90000000A0033600000A410000EA030054E3FA
:101EA0000C00001A4C319FE5002093E50530D2E587
:101EB000010053E32D00001AB830D2E1000053E3D3
:101EC0002A00001A1130D2E5200013E32700000A8F
:101ED0002BFFFFEB260000EA010054E32400001A68
:101EE00010319FE5002093E50530D2E5010053E372
:101EF0001E00001AB830D2E1000053E31B00001AA4
:101F00001130D2E5200013E31200001A170000EA96
:101F1000E0309FE5003093E50030D3E57F3003E209
:101F2000010053E30300001A0B0054E31000001AF1
:101F3000F2FDFFEB0E0000EAB8309FE5003093E5BC
:101F40000030D3E57F3003E2020053E30700001ABC
:101F5000010054E30100001A5FFEFFEB040000EAF9
:101F6000030054E30200001AC4FEFFEB000000EA85
:101F70000200A0E3000050E30B00000A78309FE568
:101F8000003093E5FF0004E20FE0A0E114F093E5D8
:101F9000030050E309C0A0031200000A000050E350
:101FA0000100000A08C0A0E30E0000EA06C0A0E39A
:101FB0000612A0E3851E81E2002091E50228A0E13F
:101FC0002228A0E14602A0E3003092E7FF3FC3E3EE
:101FD0000330C3E3003082E7003091E51C309FE519
:101FE0003020A0E3B020C3E108309FE5003093E546
:101FF00010C0C3E510A81BE98018000400180004F5
:10200000C01700040DC0A0E170D82DE904B04CE267
:1020100020339FE5002093E50110D2E50040A0E3C6
:102020000450A0E1060051E31200001A0030D2E58E
:102030007F0013E37A00001A0430D2E5010053E375
:10204000F4329F05003093051C4093057400000A8C
:10205000020053E3E0329F050030930520409305D2
:102060006F00000A030053E3CC329F050030930554
:10207000244093056A0000EA000051E34400001A7E
:10208000B0329FE5002093E5B430D2E1000053E385
:102090003F00001ABC30D2E1020053E33C00001ABA
:1020A0000830D2E5000053E33900001A0030D2E5D1
:1020B0007F0013E30200001AB830D2E1000053E3BE
:1020C0003100000A6C629FE5002096E50030D2E501
:1020D0007F3003E2010053E30B00001A58329FE502
:1020E000003093E50900D2E50010A0E30FE0A0E185
:1020F00018F093E5000050E34900001A003096E51F
:102100001230D3E5000053E31E0000EA24329FE5BD
:10211000002093E50030D2E57F3003E2020053E374
:102120003F00001A0910D2E50F1001E20900D2E5C4
:10213000700000E2D930D2E1000053E30632A0B3D0
:10214000023B83B2013193B730C003B20632A0A381
:10215000023B83A2013193A703CA03A2DC319FE5AE
:102160000020D3E5000050E30030A0130130A003AD
:10217000020051E10030A02301300332000053E39C
:102180002700000A00005CE32500000AB0419FE53B
:10219000230000EA080051E30500001A94319FE58E
:1021A000003093E50030D3E57F0013E394419F05B1
:1021B0001B0000EA0A0051E31900001A74319FE580
:1021C000002093E50030D2E57F3003E2010053E3C5
:1021D0001300001A1230D2E5000053E31000000A89
:1021E000B430D2E1000053E30D00001A0810D2E52C
:1021F000000051E30A00001ABC30D2E1010053E3B1
:102200000700001A30319FE5003093E50900D2E560
:102210000FE0A0E118F093E52C319FE5000050E3BA
:102220000340A001000054E30900000A04319FE5C7
:10223000002093E5BA51C2E1003093E5204083E5E8
:102240000000A0E30FE0A0E104F0A0E10000A0E3A3
:102250000A0000EAE0309FE5002093E5D4409FE5C6
:10226000003094E50100D3E50FE0A0E110F092E525
:10227000030050E3002094050930A0031200000A77
:10228000B0309FE5001093E5B821D1E1FF3CA0E319
:10229000FF3083E2030052E10930A0031030C10592
:1022A00070A81B09020050E30400000A84309FE577
:1022B000003093E5B831D3E1000053E30400001A85
:1022C00070309FE5002093E50830A0E31030C2E5B0
:1022D00070A81BE95C309FE5002093E5D030D2E187
:1022E000000053E30B0000AABC10D2E1B831D2E1E8
:1022F000010053E1B811C28138309FE5002093E519
:1023000034309FE5003093E52C30D3E5BC31C2E199
:102310008AFEFFEB70A81BE918309FE5002093E5CB
:102320000330A0E31030C2E520309FE5032AA0E38C
:10233000B020C3E170A81BE9801800040018000455
:102340008C010004B8170100F0150100B01601005F
:10235000B01700040DC0A0E170D82DE904B04CE224
:102360000000A0E34BFAFFEB9F54C0E3FF58C5E326
:10237000065285E388609FE5002096E51030D2E59F
:10238000090053E31000000A0030D5E50030C2E533
:10239000002096E5B030D5E12334A0E10130C2E55C
:1023A000004096E5B200D5E1D8FBFFEBB400C4E1F4
:1023B000004096E5B400D5E1D4FBFFEBB800C4E1E2
:1023C000003096E5B650D5E1BC50C3E130109FE532
:1023D000002091E50130A0E31030C2E5003091E526
:1023E000BC30D3E1000053E30100001A8AFEFFEB8A
:1023F000000000EA02FFFFEB460000EBFF0000E2F6
:1024000070A81BE9801800040DC0A0E110D82DE9C8
:1024100004B04CE28C409FE5003094E51020D3E5F9
:10242000040052E3020052130300001A43FEFFEBC4
:10243000003094E51020D3E5140000EA060052E3D2
:102440001100001A5C309FE5002093E50130D2E5D1
:10245000050053E30800001A0030D2E57F0013E3C3
:102460000500001A0500D2E5470000EB38309FE573
:10247000003093E50FE0A0E120F093E52C309FE5DC
:10248000003093E50FE0A0E108F093E50820A0E319
:1024900010309FE5003093E51020C3E51D0000EBF0
:1024A000FF0000E210A81BE9801800046018000477
:1024B000001800040DC0A0E110D82DE904B04CE2D2
:1024C00048309FE5003093E51040D3E5050054E324
:1024D000030054130100001AC6FDFFEB050000EADB
:1024E000070054E328309F05003093050FE0A0015A
:1024F0000CF093050840A0E310309FE5003093E511
:102500001040C3E5030000EBFF0000E210A81BE948
:1025100080180004001800040DC0A0E100D82DE9C7
:1025200004B04CE250309FE52C10D3E50000A0E34E
:10253000F7F9FFEB44309FE5003093E51030D3E529
:10254000080053E30500001A34309FE5012AA0E398
:10255000B020C3E12C309FE51020A0E3B020C3E100
:1025600018309FE5003093E51000D3E5090050E3F3
:102570000000A0130100A00300A81BE990010004C3
:1025800080180004B0170004C017000410402DE9A3
:10259000FF4000E254309FE50000D3E50010A0E3C7
:1025A000000051E10C00002A06C2A0E302CB8CE23D
:1025B0008FECA0E38FE08EE2FF2001E202319CE786
:1025C0000338A0E123380EE0023083E102318CE7CA
:1025D000011081E2000051E1F6FFFF3A213DA0E346
:1025E000C63283E2802084E3002083E51080BDE8CA
:1025F0008C0100040EF0A0E10DC0A0E170D82DE91F
:1026000004B04CE2D0229FE5213DA0E30310A0E1FD
:10261000463283E2003093E5B030C2E1B030D2E11F
:10262000020913E370A81B09B0529FE50260A0E104
:10263000462281E27F3CA0E3FF3083E2003082E566
:10264000B030D6E10F3003E20030C5E50030D5E50B
:10265000000053E37400001A0642A0E3024B84E238
:10266000003094E5033A03E274229FE5B030C2E102
:10267000003094E5303003E268229FE5B030C2E1DB
:10268000003094E50139C3E37030C3E30338A0E1BF
:102690002338A0E1023A23E2003084E5003094E5DB
:1026A000073AC3E34030C3E30338A0E12338A0E195
:1026B000203023E2003084E5B030D6E1100013E38F
:1026C0000F00001A003094E5073AC3E3F030C3E38B
:1026D0000338A0E12338A0E1003084E549FFFFEB97
:1026E000003094E5220B13E32800000A003094E543
:1026F0007030C3E3033AA0E1233AA0E1003084E55F
:10270000160000EA0622A0E3022B82E2003092E5E6
:102710000338A0E12348A0E1800014E30600000A8A
:10272000003092E5073AC3E3F030C3E30338A0E199
:102730002338A0E1003082E532FFFFEB020B14E307
:102740000800000A0622A0E3022B82E2003092E594
:102750007030C3E3033AA0E1233AA0E1003082E500
:10276000FBFEFFEB090000EA020914E30700000A80
:102770000622A0E3022B82E2003092E57030C3E330
:10278000033AA0E1233AA0E1003082E548FFFFEBE5
:102790000632A0E3023B83E2003093E50139C3E354
:1027A0007030C3E30338A0E14318A0E130319FE566
:1027B000B030D3E1010A13E3011A211220319FE561
:1027C000B030D3E1020A13E3021A21120622A0E379
:1027D000022B82E20138A0E12338A0E1003082E53B
:1027E000003092E5073AC3E34030C3E30338A0E189
:1027F0004318A0E1EC309FE5B030D3E1100013E3C3
:1028000010102112DC309FE5B030D3E1200013E33B
:10281000201021120622A0E3022B82E20138A0E15F
:102820002338A0E1003082E5220000EAAC009FE5F9
:102830000020D0E50612A0E3021B81E2023191E7FD
:102840000338A0E12348A0E1020914E30900000ACB
:10285000023191E77030C3E3033AA0E1233AA0E1EB
:10286000023181E70020D0E57C309FE5023183E032
:102870000FE0A0E104F013E5800014E30D00000A6E
:102880000010D5E50622A0E3022B82E2013192E797
:10289000073AC3E3F030C3E30338A0E12338A0E1F3
:1028A000013182E70020D5E540309FE5023183E029
:1028B0000FE0A0E104F013E51C209FE5211DA0E33B
:1028C000463281E2003093E5B030C2E1B030D2E16F
:1028D000020913E370A81B0954FFFFEAB0110004BA
:1028E00008180004B0170004C017000448010004D1
:1028F0000C0100040DC0A0E1F0D82DE904B04CE2B9
:10290000E4209FE50210A0E1213DA0E3463283E2EE
:10291000003093E5B030C2E1B030D2E1020913E3F8
:10292000F0A81B09217DA0E3467287E2BC509FE519
:102930000662A0E3026B86E27F3CA0E3FF3083E205
:10294000003087E5B030D1E10F3003E20030C5E55B
:102950000020D5E5023196E70338A0E12348A0E145
:10296000020914E30900000A023196E77030C3E35C
:10297000033AA0E1233AA0E1023186E70020D5E541
:102980006C309FE5023183E00FE0A0E104F013E535
:10299000800014E30D00000A0010D5E50622A0E334
:1029A000022B82E2013192E7073AC3E3F030C3E33E
:1029B0000338A0E12338A0E1013182E70020D5E50A
:1029C00030309FE5023183E00FE0A0E104F013E531
:1029D00014109FE5003097E5B030C1E1B030D1E18F
:1029E000020913E3F0A81B09D2FFFFEAB0110004AB
:1029F00008180004480100040C0100040DC0A0E107
:102A000000D82DE904B04CE230209FE530309FE53E
:102A1000002083E50230A0E31030C2E524109FE5DA
:102A200024309FE5001083E520209FE520309FE5BE
:102A3000002083E50FE0A0E100F091E500A81BE98C
:102A400020180004801800049001000400180004FD
:102A5000C0010004601800040228A0E12228A0E1BF
:102A6000032082E29F14C1E3FF18C1E3061281E351
:102A700042C1B0E10EF0A0010030D0E50120D0E568
:102A8000023483E10220D0E5023883E10320D0E55F
:102A9000023C83E1040080E2043081E401C05CE296
:102AA0000EF0A001F3FFFFEA0118A0E14118A0E138
:102AB0000228A0E142C8A0E1000052E30EF0A0010C
:102AC0009F14C1E3FF18C1E3061281E30130D1E492
:102AD0000130C0E401304CE20338A0E143C8A0E17A
:102AE000000053E30EF0A0010130D1E40130C0E456
:102AF00001304CE20338A0E143C8A0E1000053E3F9
:102B00000EF0A001F0FFFFEA0DC0A0E170D82DE9A2
:102B10000140A0E10030A0E1D8309FE504B04CE2D4
:102B200002C1C0E314D04DE203005CE10160A0E10A
:102B30000050A0E1B4208FD20C0092D8160000DA29
:102B4000B4309FE503005CE1030000DA0130A0E14E
:102B50000020A0E1131000EB70A81BE928504BE205
:102B60000520A0E1670200EB03C000E201005CE386
:102B70000B00000A020000CA00005CE30300000A28
:102B8000130000EA02005CE30B00000A100000EAF8
:102B900020C04BE2030095E80C009CE8AA0400EB7F
:102BA00070A81BE920E04BE2030095E80C009EE8CA
:102BB00000C08DE5300800EB030000EA20C04BE2C6
:102BC000030095E80C009CE89F0400EBE01200EB8A
:102BD00070A81BE920E04BE2030095E80C009EE89A
:102BE00001C0A0E300C08DE5230800EB70A81BE93D
:102BF0000000000000000000FB21E93FFFFFEF7F25
:102C00000DC0A0E170D82DE90140A0E10030A0E1A5
:102C1000E4309FE504B04CE202C1C0E314D04DE2C1
:102C200003005CE10160A0E10050A0E1C0208FD270
:102C30000C0092D800C0A0D3170000DABC309FE58A
:102C400003005CE1030000DA0130A0E10020A0E114
:102C5000D40F00EB70A81BE928504BE20520A0E13F
:102C6000280200EB030000E2010050E30D00000A1F
:102C7000020000CA000050E30300000A160000EA48
:102C8000020050E30C00000A130000EA20C04BE2EF
:102C9000030095E80C009CE801C0A0E300C08DE5AE
:102CA000F50700EB70A81BE920C04BE2030095E894
:102CB0000C009CE8640400EB70A81BE920C04BE208
:102CC0000C009CE8030095E801C0A0E300C08DE57E
:102CD000E90700EB9E1200EB70A81BE920C04BE255
:102CE0000C009CE8030095E8570400EB981200EBF9
:102CF00070A81BE90000000000000000FB21E93F74
:102D0000FFFFEF7F000000EAC70000EA0DC0A0E16E
:102D1000F0DB2DE904B04CE230404BE20CD04DE248
:102D20000C0084E90340A0E10230A0E1002064E24D
:102D3000022084E10251C3E3E8629FE5A22F85E10E
:102D400004E0A0E130300BE5060052E10140A0E1D3
:102D50000030A0E10180A0E10070A0E10090A0E1BE
:102D60000420A0E102C1C0E30400008A003064E254
:102D7000033084E1A33F8CE1060053E10500009A93
:102D800030204BE2030092E90830A0E10720A0E1E7
:102D90006C0F00EBF0AB1BE930401BE5033184E224
:102DA000013683E20E3093E10100001AF06B1BE95B
:102DB000400800EA30101BE5413FA0E1023003E289
:102DC00002209CE1A76F83E10900001A030056E38B
:102DD00006F18F90060000EA020000EA010000EA16
:102DE0002A0000EA2C0000EA0810A0E10700A0E198
:102DF000F0AB1BE90EE095E12D00000A24329FE5BF
:102E0000030055E12700001A05005CE11200001ADA
:102E1000030056E306F18F90220000EA020000EA68
:102E2000040000EA060000EA080000EA670F8FE2EB
:102E3000030090E8F0AB1BE9660F8FE2030090E817
:102E4000F0AB1BE9650F8FE2030090E8F0AB1BE9E4
:102E5000190E8FE2030090E8F0AB1BE9030056E384
:102E600006F18F900F0000EA020000EA040000EA79
:102E7000060000EA080000EA170E8FE2030090E85F
:102E8000F0AB1BE95B0F8FE2030090E8F0AB1BE9AE
:102E90005A0F8FE2030090E8F0AB1BE9590F8FE265
:102EA000030090E8F0AB1BE978319FE503005CE19B
:102EB0000700001A000059E3020000AA530F8FE236
:102EC000030090E8F0AB1BE9520F8FE2030090E89B
:102ED000F0AB1BE90C3065E0433AA0E13C0053E362
:102EE000134E8FC2300094C8100000CA30201BE57A
:102EF0003C0073E30030A0A30130A0B3A22F13E085
:102F0000E8408F12300094180800001A30404BE25D
:102F10000C0094E90810A0E10700A0E1511000EBBB
:102F20003F0900EBE30700EB0150A0E10040A0E106
:102F3000010056E30900000A020000CA000056E33F
:102F40000300000A180000EA020056E30B00000A22
:102F5000150000EA0510A0E10400A0E1F0AB1BE9B8
:102F60000520A0E10410A0E10430A0E10540A0E1AB
:102F7000023121E20410A0E10300A0E1F0AB1BE963
:102F800098208FE20C0092E80510A0E10400A0E177
:102F9000040F00EB0130A0E10020A0E15C008FE213
:102FA000030090E8FF0E00EBF0AB1BE96C208FE212
:102FB0000C0092E80510A0E10400A0E1F90E00EB7E
:102FC00038208FE20C0092E8F60E00EBF0AB1BE924
:102FD000FB21E93F182D4454FB21E9BF182D44542F
:102FE0007CD90240D221337F7CD902C0D221337FE9
:102FF0000000000000000000000000800000000051
:10300000FB210940182D4454FB2109C0182D4454BC
:10301000FB21F9BF182D4454FB21F93F182D4454CE
:1030200026A6A13C075C14330000F07F0DC0A0E190
:10303000F0DB2DE904B04CE20190A0E10080A0E1BA
:1030400034D04DE230004BE20C0000E830104BE28F
:1030500030C04BE2000381E906001CE80271C8E3BE
:103060000251C1E3070055E1080000DA0100A0E1C8
:103070000210A0E130204BE2030082E930104BE265
:10308000000301E80730A0E10570A0E10350A0E1D2
:10309000073065E030204BE20F0553E330C04BE2D0
:1030A000180092E930004BE206001CE80730A0E16E
:1030B0000510A0E1180080E930304BE2060003E87B
:1030C000040000DA30404BE2030094E90C001CE8F5
:1030D0009C0E00EBF0AB1BE918349FE50000A0E369
:1030E000030057E150000BE5280000DA08349FE5A3
:1030F000030057E1190000DA30204BE230404BE288
:10310000030092E90C0014E88E0E00EB50C04BE275
:1031100003008CE930004BE2FF34C7E3060090E97E
:103120000F36C3E3023093E130104B0206009109E1
:1031300050304B0206008309C0239FE530C04BE2AC
:1031400018001CE8022025E0042092E150204B02E8
:103150001800820950204BE2030092E9F0AB1BE912
:1031600030C04BE230004BE218009CE9060010E84A
:10317000967547E2965545E20510A0E10730A0E1BB
:10318000060000E818008CE9961FA0E350100BE53C
:103190006C339FE5030055E12E0000CA010655E39C
:1031A0001F0000AA30204BE2180012E8043095E11D
:1031B0000200001A30304BE2030093E9F0AB1BE948
:1031C000320E8FE2030090E840204BE230304BE2B9
:1031D000030082E9030013E8C22F8FE20C0092E89B
:1031E0009D0E00EB30C04BE203000CE850C01BE525
:1031F00030204BE240404BE2030092E9FFCF4CE22B
:103200000C0094E950C00BE5930E00EB50301BE529
:1032100030204BE2023043E2030082E950300BE5FC
:103220000C0000EA30004BE2060010E8965585E2FB
:1032300030C04BE20510A0E118009CE9967587E2CA
:10324000060000E850101BE50730A0E1961F41E2A0
:1032500018008CE950100BE530204BE230404BE277
:10326000030092E90C0014E84E0E00EB30404BE2F4
:1032700050C04BE203008CE90C0014E8531000EB43
:10328000000050E3340000DA0040A0E30030A0E387
:1032900040C04BE20730A0E118008CE930204BE23F
:1032A00040404BE2030092E90C0094E93D0E00EB34
:1032B00040C04BE240204BE203000CE8030092E9DF
:1032C0000130A0E10020A0E1630E00EB30C04BE232
:1032D0000170A0E10060A0E103001CE81C1100EBFC
:1032E00030404BE20130A0E10020A0E1030014E8EF
:1032F000590E00EB30C04BE20150A0E10040A0E1CC
:1033000003009CE940C04BE20C009CE90D0E00EB71
:1033100040C04BE20130A0E10020A0E103001CE826
:103320004D0E00EB0130A0E10020A0E10510A0E16E
:103330000400A0E11B0E00EB0130A0E10020A0E1A1
:103340000710A0E10600A0E1160E00EB170200EB4B
:1033500050204BE2030082E94D0000EA30304BE29E
:10336000030093E90130A0E10020A0E1F50D00EB9E
:1033700030404BE2030084E90040A0E30030A0E3CA
:103380000530A0E10460A0E10350A0E130C04BE2B1
:103390000630A0E10520A0E103001CE8010E00EBCF
:1033A0000040A0E30030A0E30190A0E10080A0E194
:1033B000013687E240004BE2180080E930204BE202
:1033C00040404BE2030092E90C0094E9F50D00EB5C
:1033D00040C04BE240204BE203000CE8030092E9BE
:1033E0000630A0E10520A0E11B0E00EB50404BE2AF
:1033F00050304BE2030003E9030094E9D41000EBE2
:1034000050C04BE20130A0E10020A0E103009CE9A4
:10341000110E00EB40204BE20170A0E10060A0E142
:10342000030092E90930A0E10820A0E10A0E00EBB8
:1034300030C04BE240304BE20150A0E10040A0E13F
:10344000030013E80C001CE8030E00EB0130A0E1C0
:103450000020A0E10510A0E10400A0E1B90D00EBFF
:103460000130A0E10020A0E10710A0E10600A0E1EA
:10347000CC0D00EB50404BE20130A0E10020A0E178
:10348000030014E9C70D00EBC80100EB50C04BE28C
:1034900003008CE950001BE5000050E30E00000A19
:1034A00048108FE2060091E840304BE2060083E9C5
:1034B0000240A0E10130A0E1003A81E040004BE28F
:1034C000180080E90410A0E10300A0E150404BE2A5
:1034D0000C0094E9E00D00EBF0AB1BE950C04BE2AF
:1034E00003009CE9F0AB1BE90000D07F0000000066
:1034F0000000F03F000000000000305FFFFFEF7FA2
:103500000000F07FFFFFAF200DC0A0E1F0DF2DE94C
:103510000140A0E10030A0E1B0329FE5B0A29FE5FC
:103520000291C0E304B04CE250D04DE2030059E1F7
:103530000160A0E10050A0E168000BE544200BE52C
:103540000AA08FE0B37F8FE2800197E80200A0D14C
:103550006000A0D80020A0D3800180D8910100DABB
:1035600070329FE5030059E15C0000CA68201BE54A
:10357000000052E32A0000DA232E8FE20C0092E8CA
:10358000880D00EB50329FE5030059E144301BE504
:103590000180A0E10070A0E1084083E20C00000A75
:1035A000212E8FE20C0092E87E0D00EB44C01BE55B
:1035B0000130A0E10020A0E103008CE80810A0E1A8
:1035C0000700A0E1770D00EB7A2F8FE20C0092E864
:1035D000100000EA852F8FE20C0092E8710D00EBDD
:1035E000212E8FE20C0092E80180A0E10070A0E1A2
:1035F0006C0D00EB0130A0E10020A0E144001BE5D0
:103600000C0080E80810A0E10700A0E1650D00EBC8
:103610001E2E8FE20C0092E8620D00EB0120A0E369
:103620005D0100EA612F8FE20C0092E8450D00EB8E
:10363000A4319FE50180A0E10070A0E144101BE5EA
:10364000030059E1084081E20E00000A592F8FE281
:103650000C0092E80810A0E10700A0E1390D00EB92
:1036600044C01BE50130A0E10020A0E103008CE88C
:103670000810A0E10700A0E14A0D00EB4D2F8FE2FA
:103680000C0092E8120000EA162E8FE20C0092E87D
:103690000810A0E10700A0E12A0D00EB552F8FE2F2
:1036A0000C0092E80180A0E10070A0E1250D00EB84
:1036B0000130A0E10020A0E144001BE50C0080E8FF
:1036C0000810A0E10700A0E1360D00EB492F8FE2C2
:1036D0000C0092E81B0D00EB0020E0E32E0100EA55
:1036E000F8309FE5030059E1D80000CA4C0700EB11
:1036F00050204BE2030082E9C0208FE20C0092E8E8
:10370000550D00EBBC208FE20C0092E80D0D00EB94
:10371000D30F00EB64000BE5A10F00EB60404BE220
:10372000030084E984208FE20C0092E84A0D00EB4C
:1037300050404BE20130A0E10020A0E1030094E9F9
:10374000180D00EB50C04BE260204BE203000CE888
:10375000030092E95C208FE20C0092E83E0D00EB42
:1037600064301BE51F0053E30180A0E10070A0E17D
:103770002A0000CA68309FE564401BE503308AE0F8
:10378000043183E0043013E5030059E12300000A0B
:1037900050C04BE20830A0E10720A0E103001CE884
:1037A000000D00EB44201BE5030082E88C0000EADA
:1037B000FB21F93F0000405461B4D03D3163621AEF
:1037C000305FE43F83C8C96D0000E03F00000000A7
:1037D000FB21E93F2CCDFE037BD90240FB21F93FC1
:1037E000FB21394110B201FCFFFFEF7F08B101FC62
:1037F00061B4D03D0000601A8A19A33B7370032E98
:103800008A19A33B0000002E9A837B39C1492025E9
:1038100000007041000000000000000000000000F7
:1038200050304BE2030013E80830A0E10720A0E18C
:10383000DC0C00EB203AA0E1833AA0E1499AA0E138
:10384000A33AA0E1096063E044401BE5100056E3A1
:10385000030084E8620000DA50004BE2030010E845
:1038600050404BE2030084E960404BE284204FE289
:103870000C0092E8030094E9F70C00EB50C04BE217
:103880000180A0E10070A0E10830A0E10720A0E1E4
:1038900003009CE9C30C00EB60404BE250204BE27C
:1038A000030002E8B4204FE20C0092E8030094E920
:1038B000E90C00EB50C04BE20C001CE80150A0E109
:1038C0000040A0E103009CE9B60C00EB0830A0E149
:1038D0000720A0E1B30C00EB0130A0E10020A0E143
:1038E0000510A0E10400A0E1AE0C00EB50204BE27B
:1038F0000180A0E10070A0E1030012E80830A0E11F
:103900000720A0E1A70C00EB203AA0E1833AA0E158
:10391000A33AA0E1096063E044301BE5030083E8BB
:1039200050004BE2030010E870204BE2310056E3F8
:10393000030082E82A0000DA60404BE2512F4FE298
:103940000C0092E8030094E9C30C00EB50C04BE27A
:103950000180A0E10070A0E10830A0E10720A0E113
:1039600003001CE88F0C00EB50204BE260304BE270
:10397000030002E8030093E95E2F4FE20C0092E897
:10398000B50C00EB70C04BE20150A0E10040A0E19B
:1039900003009CE850C04BE20C001CE8810C00EBDB
:1039A0000830A0E10720A0E17E0C00EB0130A0E18F
:1039B0000020A0E10510A0E10400A0E1790C00EBDB
:1039C00050204BE20180A0E10070A0E1030012E86A
:1039D0000830A0E10720A0E1720C00EB44301BE5A9
:1039E000030083E844401BE550C04BE20C0094E820
:1039F00003001CE86B0C00EB0830A0E10720A0E1FD
:103A0000680C00EB0150A0E10040A0E168001BE55C
:103A100044101BE5000050E3086081E2300086E8B6
:103A20005F0000AA030091E8490F00EB44301BE55A
:103A3000030083E80510A0E10400A0E1440F00EBBF
:103A400064401BE5002064E2030086E8550000EABC
:103A500070321FE5030059E1080000DA0130A0E1EF
:103A60000020A0E14F0C00EB44C01BE50020A0E3C8
:103A700008308CE2030083E803008CE8490000EA88
:103A8000493AA0E1413E43E260300BE50120A0E16C
:103A90000010A0E160001BE5060040E20240A0E14A
:103AA000003A49E060000BE50480A0E10370A0E16A
:103AB0000060A0E30810A0E10700A0E1E80E00EB21
:103AC000B70E00EB40904BE286C189E00150A0E1C7
:103AD0000040A0E10530A0E10420A0E10810A0E131
:103AE0000700A0E130008CE82E0C00EBB92F4FE26C
:103AF0000C0092E8580C00EB016086E2010056E3EE
:103B00000180A0E10070A0E1E9FFFFDA30104BE294
:103B10000350A0E328404BE2800181E8030014E950
:103B2000312E4FE20C0092E8010E00EB000050E352
:103B30000150450208404402F7FFFF0A02C0A0E31B
:103B400000C08DE560C31FE560201BE50CC08AE066
:103B50000900A0E10530A0E144101BE504C08DE59B
:103B60006E0100EB68201BE5000052E364000BE5EA
:103B70000B0000AA44301BE5030093E8F40E00EBB1
:103B800044401BE50300A4E8030094E844400BE52F
:103B9000EF0E00EB64C01BE500206CE2030084E83C
:103BA000000000EA64201BE50200A0E1F0AF1BE981
:103BB0000DC0A0E1F0DB2DE988229FE584329FE56E
:103BC00004B04CE2022000E00150A0E10040A0E17E
:103BD00008D04DE2030052E130404BE20030A0E358
:103BE0000020A0E30170A0E10060A0E100C0A0E11E
:103BF00005E0A0E10C0084E90600001A0130A0E114
:103C00000020A0E1140C00EB0730A0E10620A0E1A9
:103C1000CC0B00EBF0AB1BE9000050E3140000CA32
:103C20000231C0E3053093E1F0AB1B09000050E323
:103C30000F0000AA0130A0E10020A0E1D90B00EBA9
:103C40000730A0E10620A0E10150A0E10040A0E182
:103C50000710A0E10600A0E1D20B00EB0130A0E1CB
:103C60000020A0E10510A0E10400A0E1FD0C00EBA4
:103C7000F0AB1BE94C5AB0E11200001A00005CE303
:103C80000400001AAEC58CE100005CE3155045E26B
:103C90008EEAA0E1FAFFFF0A01061CE30010A0E390
:103CA0000300001A8CC0A0E101061CE3011081E2B0
:103CB000FBFFFF0A052061E0203061E23EC38CE19A
:103CC000015082E21EE1A0E1FF34CCE3FF5F45E258
:103CD0000F36C3E3035045E2010015E301C683E359
:103CE000AE3F8C1003C08C108EE0A0110000A0E34A
:103CF000AE3F8CE00090A0E103C08CE0C550A0E195
:103D00008EE0A0E10060A0E10080A0E10246A0E317
:103D1000042080E00C0052E10CC062D0AE3F8CE089
:103D2000040082D0049089D0A440B0E103C08CE0AC
:103D30008EE0A0E1F5FFFF1A0241A0E30C0050E184
:103D40000020A0E10030A0130130A003041086E0A1
:103D5000040000BA0E0051E10030A083013003924C
:103D6000000053E30900000A000051E30CC062E0C8
:103D7000046081E0048088E0010000AA000056E3AE
:103D8000010082A201005EE101C04C320EE061E060
:103D9000AE3F8CE0A440B0E103C08CE08EE0A0E137
:103DA000E5FFFF1A0EC09CE11800000A8C608FE24C
:103DB000C00096E80710A0E10600A0E10730A0E1EE
:103DC0000620A0E1A80D00EB000050E30F0000BAB0
:103DD000010078E30480A001019089020B00000A31
:103DE0000730A0E10620A0E10710A0E10600A0E155
:103DF000760D00EB000050E3013008D2038088D03C
:103E0000020000DA020078E301908902028088E271
:103E1000C930A0E1FFC583E2A8E0A0E1010019E3F9
:103E200002C68CE202E18E13055A8CE02C500BE5A1
:103E300028E00BE530204BE2030092E9F0AB1BE9F0
:103E40000000F03F000000000000F07F0DC0A0E186
:103E5000F0DB2DE904B04CE20261C0E330C04BE27C
:103E600018D04DE2F90556E30150A0E10040A0E171
:103E700003008CE90C000CE80090A0E30080A0E3B4
:103E8000050000AAF60D00EB000050E30200001A46
:103E90008E0F8FE2030090E8F0AB1BE930104BE28D
:103EA0000C0091E90310A0E10200A0E16A0B00EB15
:103EB000222E8FE20C0092E80150A0E10040A0E128
:103EC000650B00EB852F8FE20C0092E81D0B00EBD9
:103ED0000130A0E10020A0E10510A0E10400A0E174
:103EE0005D0B00EB7F2F8FE20C0092E8150B00EBCF
:103EF0000130A0E10020A0E10510A0E10400A0E154
:103F0000550B00EB792F8FE20C0092E80D0B00EBC4
:103F10000130A0E10020A0E10510A0E10400A0E133
:103F20004D0B00EB732F8FE20C0092E8050B00EBBA
:103F30000130A0E10020A0E10510A0E10400A0E113
:103F4000450B00EB6D2F8FE20C0092E8FD0A00EBB1
:103F50000130A0E10020A0E10510A0E10400A0E1F3
:103F60003D0B00EB40304BE2030083E9A4319FE5B9
:103F7000030056E1220000CA622F8FE20C0092E893
:103F80000510A0E10400A0E1330B00EB40C04BE2C0
:103F90000C009CE90170A0E10060A0E10510A0E127
:103FA0000400A0E12C0B00EB30C04BE230304BE2C0
:103FB0000150A0E10040A0E1030093E90C001CE8DF
:103FC000250B00EB0130A0E10020A0E10510A0E1ED
:103FD0000400A0E1F30A00EB0130A0E10020A0E121
:103FE0000710A0E10600A0E1EE0A00EB0130A0E11D
:103FF0000020A0E1D4008FE2030090E8E90A00EB82
:10400000F0AB1BE910319FE5030056E1028646D272
:104010000090A0D3F4808FC2000398C8E4208FE200
:104020000C0092E80510A0E10400A0E10A0B00EBEF
:104030000930A0E10820A0E1DA0A00EB0930A0E194
:104040000820A0E10170A0E10060A0E17C008FE207
:10405000030090E8D30A00EB40C04BE20C009CE95F
:104060000190A0E10080A0E10510A0E10400A0E122
:10407000F90A00EB30C04BE230304BE20150A0E1D6
:104080000040A0E1030093E90C001CE8F20A00EBF9
:104090000130A0E10020A0E10510A0E10400A0E1B2
:1040A000C00A00EB0130A0E10020A0E10710A0E170
:1040B0000600A0E1BB0A00EB0130A0E10020A0E176
:1040C0000910A0E10800A0E1B60A00EBF0AB1BE983
:1040D0000000F03F00000000E9FAA8BDD43888BE17
:1040E0009EEE213EC4B1B4BD4F7E92BEAD529C80C7
:1040F000A001FA3E9015CB196CC156BF7751C1167D
:104100005555A53F4C5555550000E03F00000000B7
:104110000000D23F000000003233D33F0000E93FEF
:104120000DC0A0E1F0DF2DE904B04CE2B4C39FE57F
:1041300003E042E29E4CCCE0CEEFA0E14CC16EE049
:1041400097DF4DE2A0A39FE56CC20BE59CC39FE502
:1041500004E09BE5013043E20AA08FE06C421BE5DE
:1041600068320BE50CC08AE00EC19CE768E21BE5F3
:10417000000054E30040A0B3843084E00C608EE083
:104180000090A0E3832142E0060059E16C420BE578
:1041900070C20BE55C020BE560120BE5188042E291
:1041A00004406EE00E0000CA463F4BE2000054E3BC
:1041B000895183E0030000BA08109BE5040191E7F0
:1041C000F70C00EB010000EAC90F8FE2030090E852
:1041D000019089E2060059E1030085E8014084E28C
:1041E000F0FFFFDA70221BE50090A0E3020059E126
:1041F000240000CA68321BE50040A0E32F1E8FE2B6
:10420000060091E8030054E10A3D4BE2060083E812
:10421000130000CA5C521BE568C21BE509208CE054
:10422000022064E0463F4BE2823183E00C0093E8D9
:104230000300B5E8880A00EB0AED4BE20130A0E18B
:104240000020A0E103009EE83E0A00EB68321BE577
:10425000014084E20A2D4BE2030054E1030082E8AE
:10426000ECFFFFDA963F4BE270421BE50A2D4BE272
:10427000893183E0060092E8019089E2040059E167
:10428000060083E8DAFFFFDA70321BE564320BE5E3
:1042900064421BE5969F4BE2843189E0000054E3C1
:1042A000C00093E81F0000DA28504BE2962F8FE2FF
:1042B0000C0092E80710A0E10600A0E1660A00EBFE
:1042C000E70C00EBB60C00EB0ACD4BE203008CE8E8
:1042D000892F8FE20C0092E85F0A00EB0130A0E129
:1042E0000020A0E10710A0E10600A0E12D0A00EBEC
:1042F000DB0C00EB843189E000C0A0E10AED4BE269
:10430000030013E950C005E50C009EE80D0A00EB20
:10431000014044E2000054E30170A0E10060A0E12C
:10432000045085E2E0FFFFCA0710A0E10600A0E10B
:104330000820A0E1AD0400EB192E8FE20C0092E8FA
:104340000170A0E10060A0E1430A00EB3D0400EB36
:10435000062D8FE20C0092E83F0A00EB0130A0E14D
:104360000020A0E10710A0E10600A0E10D0A00EB8B
:104370000170A0E10060A0E1B90C00EB74020BE554
:10438000870C00EB0130A0E10020A0E10710A0E1C4
:104390000600A0E1030A00EB000058E30170A0E171
:1043A0000060A0E10010A0E378120BE50E0000DA37
:1043B00064321BE528204BE2031182E0542011E512
:1043C000183068E25293A0E174421BE5192342E0E1
:1043D000173068E25233A0E1094084E078320BE5FF
:1043E00074420BE5542001E5100000EA0600001AB3
:1043F00064E21BE528C04BE20E318CE0543013E53B
:10440000C33BA0E178320BE5080000EACC208FE244
:104410000C0092E80710A0E10600A0E1120C00EBEE
:10442000000050E3580000BA0210A0E378120BE538
:1044300078221BE5000052E3530000DA74421BE5CA
:1044400064321BE50090A0E3014084E2030059E1DF
:104450000950A0E174420BE50E0000AA28204BE2AF
:104460000390A0E1000055E3504012E5FF34E01353
:10447000033064100300001A000054E30134641296
:104480000150A0130000000A503002E5019059E2EB
:10449000042082E2F2FFFF1A000058E3230000DA52
:1044A000010058E30200000A020058E31800000A65
:1044B0001E0000EA64E21BE528C04BE20E218CE0FE
:1044C000543012E5FF34C3E30235C3E3160000EABB
:1044D0000000C03F0000000000002040000000007D
:1044E0000000E03F00000000ABAAAA2A14C1FE03AE
:1044F00028B301FC00000000000000000000704133
:10450000000000000000F03F000000000000703ECE
:104510000000000064321BE528104BE2032181E01B
:10452000543012E5FF34C3E30335C3E3543002E5EE
:1045300078421BE5020054E31300001A0730A0E1A3
:104540000620A0E148004FE2030090E8950900EB47
:10455000000055E30170A0E10060A0E10A00000A3C
:104560000820A0E168004FE2030090E81F0400EB80
:104570000130A0E10020A0E10710A0E10600A0E1C9
:10458000880900EB0170A0E10060A0E1A0204FE2EB
:104590000C0092E80710A0E10600A0E1640B00EB1C
:1045A000000050E35300001A64C21BE570E21BE5F3
:1045B00001904CE20E0059E10040A0E10A0000BA6F
:1045C00028104BE2092181E070C21BE5503012E552
:1045D000019049E20C0059E1034084E1042042E2E9
:1045E000F8FFFFAA000054E34200001A70121BE516
:1045F00028E04BE201318EE0543013E5000053E334
:104600000170A0E30700001A28204BE2013182E08C
:10461000042043E2042042E2503012E5000053E35C
:10462000017087E2FAFFFF0A64321BE5074083E06E
:10463000019083E2040059E184420BE52A0000CA9C
:104640006CC21BE508E09BE568121BE509308CE0B5
:10465000092081E003019EE7463F4BE2824183E06F
:10466000CF0B00EB68221BE5030084E8000052E357
:10467000611F4FE2060091E80A3D4BE2060083E825
:10468000100000BA68C21BE55C521BE50460A0E1A3
:1046900001408CE20C0096E80300B5E86E0900EBDF
:1046A0000AED4BE20130A0E10020A0E103009EE80A
:1046B000240900EB0A2D4BE2014054E2030082E89A
:1046C000086046E2F2FFFF1A963F4BE284421BE588
:1046D0000A2D4BE2893183E0060092E8019089E2DD
:1046E000040059E1060083E8D4FFFFDA64321BE5D9
:1046F000073083E0E4FEFFEA832F4FE20C0092E8EC
:104700000710A0E10600A0E1090B00EB000050E358
:104710001100001A64421BE528C04BE2014044E24C
:1047200004218CE0503012E5000053E364420BE5B5
:10473000188048E23D00001A042042E264E21BE5D2
:10474000503012E501E04EE2000053E364E20BE575
:10475000188048E2F7FFFF0A340000EA002068E210
:104760000710A0E10600A0E1A00300EB9E2F4FE29E
:104770000C0092E80170A0E10060A0E13A0B00EBB0
:1047800064121BE5000050E30141A0E1210000BAE2
:10479000A32F4FE20C0092E80710A0E10600A0E171
:1047A0002D0900EBAE0B00EB7D0B00EB0A2D4BE26D
:1047B000030082E80B2D4FE20C0092E8260900EB83
:1047C0000130A0E10020A0E10710A0E10600A0E177
:1047D000F40800EBA20B00EB28E04BE264C21BE5FF
:1047E0000E3084E00020A0E10A4D4BE2030094E883
:1047F00001C08CE2502003E564C20BE5980B00EB8E
:1048000064121BE528E04BE201318EE0188088E25B
:10481000500003E5050000EA28204BE20710A0E164
:104820000600A0E1024084E08D0B00EB500004E59F
:10483000CD0F4FE2030090E80820A0E16B0300EBEE
:1048400064921BE50A3D4BE2000059E3030083E854
:10485000430000BA28404BE2093184E0500013E5E0
:104860004F0B00EB0ACD4BE20130A0E10020A0E1AC
:1048700003009CE8F80800EB966F4BE2896186E044
:104880000150A0E10040A0E10AED4BE2E22F4FE22F
:104890000C0092E803009EE8300086E8EE0800EB8A
:1048A0000A2D4BE2019059E2030082E8E8FFFF5A2B
:1048B00064921BE5000059E3290000BA0040A0E320
:1048C00070321BE50070A0E37B1F8FE2060091E8C9
:1048D000030057E10A3D4BE2060083E8180000CAD6
:1048E000040057E10450A0E1150000CA073089E038
:1048F000962F4BE2832182E0B8319FE503308AE0B6
:10490000873183E0030093E80C0092E8D20800EBC3
:104910000ACD4BE20130A0E10020A0E103009CE8B9
:10492000880800EB0AED4BE203008EE870121BE5ED
:10493000017087E2010057E1010000CA050057E15C
:10494000E9FFFFDA0A2D4BE26E3F4BE2060092E8E8
:10495000843183E0019059E2060083E8014084E25B
:10496000D6FFFF5A04309BE5030053E303F18F9019
:10497000BE0000EA020000EA190000EA180000EA9E
:104980004F0000EA64921BE54B1F8FE2060091E89E
:104990000A3D4BE2000059E3060083E8090000BA33
:1049A0006E3F4BE2893183E00A4D4BE2030094E80D
:1049B0000C0093E8630800EB0ACD4BE2019059E24A
:1049C00003008CE8F5FFFF5A78E21BE50A2D4BE265
:1049D00000005EE3030092E85D0B001B60421BE5F4
:1049E000320000EA64921BE5CC108FE2060091E8E9
:1049F0000A3D4BE2000059E3060083E8090000BAD3
:104A00006E3F4BE2893183E00A4D4BE2030094E8AC
:104A10000C0093E84B0800EB0ACD4BE2019059E201
:104A200003008CE8F5FFFF5A78E21BE50A2D4BE204
:104A300000005EE3030092E8450B001B60421BE5AB
:104A4000030084E86E3F4BE20ACD4BE2030093E89B
:104A50000C009CE8530800EB0AED4BE203008EE8E3
:104A600064121BE5000051E3090000DA0190A0E1A7
:104A70001B4E4BE20ACD4BE203009CE80C00B4E86D
:104A8000300800EB0AED4BE2019059E203008EE89A
:104A9000F7FFFF1A78121BE560221BE5000051E3C7
:104AA0000A3D4BE2084082E2030093E8280B001B1A
:104AB000030084E86D0000EA38B301FC0000000048
:104AC0000000000064921BE5000059E31B0000DABF
:104AD0006E6F4BE2896186E0300016E9800196E84E
:104AE0000510A0E10400A0E10830A0E10720A0E14A
:104AF000140800EB0AED4BE203008EE80510A0E17C
:104B00000400A0E10A4D4BE20C0094E8250800EBFC
:104B10000130A0E10020A0E10810A0E10700A0E121
:104B2000080800EB0A3D4BE2019049E20C0093E8D3
:104B3000000059E30C0006E9030086E8E3FFFFCA22
:104B400064921BE5010059E31B0000DA6E6F4BE233
:104B5000896186E0300016E9800196E80510A0E141
:104B60000400A0E10830A0E10720A0E1F50700EB78
:104B70000ACD4BE203008CE80AED4BE20C009EE804
:104B80000510A0E10400A0E1060800EB0130A0E15F
:104B90000020A0E10810A0E10700A0E1E90700EB78
:104BA0000A3D4BE2019049E20C0093E8010059E311
:104BB0000C0006E9030086E8E3FFFFCA64921BE5E8
:104BC000431F4FE2060091E80A3D4BE2010059E322
:104BD000060083E80A0000DA6E3F4BE2893183E089
:104BE0000A4D4BE2030094E80C0093E8D50700EB74
:104BF000019049E20ACD4BE2010059E303008CE841
:104C0000F4FFFFCA78E21BE560121BE500005EE3DB
:104C10006E0F4BE2084081E21B6E4BE2105081E2C6
:104C20000700001A0C0090E80C0081E8060096E8E6
:104C30000A3D4BE2060084E80C0093E80C0085E88E
:104C40000A0000EA030090E8C10A00EB60C21BE51D
:104C500003008CE8030096E8BD0A00EB0AED4BE286
:104C6000030084E803009EE8B90A00EB030085E82E
:104C700074121BE5070001E2F0AF1BE90DC0A0E1D3
:104C8000F0DB2DE904B04CE20150A0E10040A0E1CE
:104C90000241C0E330C04BE218D04DE2F90554E3C5
:104CA00003008CE90C000CE8050000AA6C0A00EB7C
:104CB000000050E30200001A30304BE2030093E999
:104CC000F0AB1BE930C04BE203009CE90130A0E1EE
:104CD0000020A0E1E00700EB30C04BE20C009CE9B3
:104CE0000170A0E10060A0E1DB0700EB40304BE287
:104CF000030083E9612F8FE20C0092E80710A0E126
:104D00000600A0E1D40700EB5E2F8FE20C0092E8D2
:104D10008C0700EB0130A0E10020A0E10710A0E12A
:104D20000600A0E1CC0700EB162E8FE20C0092E803
:104D3000840700EB0130A0E10020A0E10710A0E112
:104D40000600A0E1C40700EB522F8FE20C0092E8AE
:104D50007C0700EB0130A0E10020A0E10710A0E1FA
:104D60000600A0E1BC0700EB132E8FE20C0092E8D6
:104D7000740700EB04309BE5000053E30190A0E1D1
:104D80000080A0E11200001A0130A0E10020A0E1A3
:104D90000710A0E10600A0E1AF0700EB412F8FE272
:104DA0000C0092E8670700EB40C04BE20130A0E145
:104DB0000020A0E103009CE9A70700EB30C04BE214
:104DC0000130A0E10020A0E103009CE95D0700EBB9
:104DD000F0AB1BE930C04BE203001CE8CC208FE2B3
:104DE0000C0092E89C0700EB40304BE20150A0E140
:104DF0000040A0E1030093E90930A0E10820A0E110
:104E0000950700EB0130A0E10020A0E10510A0E132
:104E10000400A0E1630700EB0130A0E10020A0E165
:104E20000710A0E10600A0E18B0700EB30C04BE2C9
:104E30000C001CE85B0700EB40304BE20150A0E1A6
:104E40000040A0E1030093E958208FE20C0092E8B3
:104E5000810700EB0130A0E10020A0E10510A0E1F6
:104E60000400A0E14F0700EB30C04BE20130A0E1AD
:104E70000020A0E103009CE94A0700EBF0AB1BE92E
:104E80003AD9E53D7CD5CF5AE6E55ABEEB9C2B8A54
:104E9000E31DC73E7DFEB157A0012ABFD561C119F0
:104EA0001111813FA6F810115555C5BF49555555EB
:104EB0000000E03F000000000DC0A0E1F0DF2DE9A0
:104EC000BC349FE5BCA49FE50241C0E304B04CE2C2
:104ED00008D04DE2030054E10190A0E10080A0E180
:104EE0002C000BE50AA08FE0180000DA98349FE54B
:104EF000030054E10140A0E10030A0E1060000CA37
:104F00000030A0130130A003000054E30030A003E0
:104F100001300312000053E30300000A0930A0E14E
:104F20000820A0E1070700EBF0AF1BE92C101BE500
:104F3000000051E3020000DAED0F8FE2030090E879
:104F4000F0AF1BE93B0E8FE2030090E8F0AF1BE9E6
:104F500038349FE5030054E10F0000CA30349FE568
:104F6000030054E10A0000CAE52F8FE20C0092E82A
:104F7000F40600EB392E8FE20C0092E8130900EBE7
:104F8000000050E3020000DA0910A0E10800A0E1EF
:104F9000F0AF1BE90030E0E3510000EA200100EB34
:104FA000F0339FE5030054E10190A0E10080A0E10F
:104FB000290000CAE0339FE5030054E1150000CA50
:104FC0000130A0E10020A0E1DE0600EBCE2F8FE251
:104FD0000C0092E8F30600EBCD2F8FE20C0092E874
:104FE0000150A0E10040A0E10910A0E10800A0E10B
:104FF000D40600EB0130A0E10020A0E10510A0E103
:105000000400A0E1170800EB0190A0E10080A0E1FE
:105010000010A0E3280000EABB2F8FE20C0092E80A
:10502000E00600EB2E2E8FE20C0092E80150A0E18A
:105030000040A0E10910A0E10800A0E1C10600EBDA
:105040000130A0E10020A0E10510A0E10400A0E1F2
:10505000040800EB0130A0E31F0000EA3C339FE5A9
:10506000030054E1160000CAAB2F8FE20C0092E857
:10507000CC0600EB2A2E8FE20C0092E80150A0E152
:105080000040A0E10910A0E10800A0E1F20600EB59
:105090009D2F8FE20C0092E8AA0600EB0130A0E100
:1050A0000020A0E10510A0E10400A0E1ED0700EB65
:1050B0000190A0E10080A0E10210A0E330100BE518
:1050C000080000EA0930A0E10820A0E1250E8FE2E7
:1050D000030090E8E30700EB0330A0E30190A0E1B8
:1050E0000080A0E130300BE50930A0E10820A0E10C
:1050F0000910A0E10800A0E1D70600EB0130A0E113
:105100000020A0E10170A0E10060A0E1D20600EB68
:10511000852F8FE20C0092E80150A0E10040A0E151
:10512000CD0600EB0130A0E10020A0E1020C8FE2EF
:10513000030090E8830600EB0130A0E10020A0E12D
:105140000510A0E10400A0E1C30600EB0130A0E1DE
:105150000020A0E11E0E8FE2030090E8790600EB2C
:105160000130A0E10020A0E10510A0E10400A0E1D1
:10517000B90600EB0130A0E10020A0E1070D8FE2AD
:10518000030090E86F0600EB0130A0E10020A0E1F1
:105190000510A0E10400A0E1AF0600EB0130A0E1A2
:1051A0000020A0E11A0E8FE2030090E8650600EBF4
:1051B0000130A0E10020A0E10510A0E10400A0E181
:1051C000A50600EB0130A0E10020A0E1060D8FE272
:1051D000030090E85B0600EB0130A0E10020A0E1B5
:1051E0000710A0E10600A0E19B0600EB5A2F8FE21A
:1051F0000C0092E80170A0E10060A0E10510A0E1C0
:105200000400A0E1940600EB0130A0E10020A0E141
:10521000530F8FE2030090E84A0600EB0130A0E153
:105220000020A0E10510A0E10400A0E18A0600EB47
:105230000130A0E10020A0E14B0F8FE2030090E8D5
:10524000400600EB0130A0E10020A0E10510A0E144
:105250000400A0E1800600EB0130A0E10020A0E105
:10526000430F8FE2030090E8360600EB0130A0E127
:105270000020A0E10510A0E10400A0E1760600EB0B
:105280000130A0E10020A0E1EC008FE2030090E8F3
:105290002C0600EB0130A0E10020A0E10510A0E108
:1052A0000400A0E16C0600EB0130A0E10020A0E1C9
:1052B00030101BE5000051E33B0000AA0710A0E1FD
:1052C0000600A0E11F0600EB0130A0E10020A0E1F4
:1052D0000910A0E10800A0E15F0600EB0130A0E1A9
:1052E0000020A0E10910A0E10800A0E12D0600EBDC
:1052F000F0AF1BE9FB21F93F182D4454FB21F9BF06
:10530000182D44543CE4377E9C7500880000F03F23
:105310000000000000000040000000000000F83F16
:10532000000000000000F0BF000000003AAD903F18
:1053300011DA22E34B7BA93FEB0D7624660DB13FDA
:10534000513DD0A0CD45B73F6E204CC52449C23F4A
:10535000FF8300925555D53F0D55555544B4A2BF16
:105360002F6C6A2C2DDEADBF9AFDDE52F2B0B3BFBA
:105370006D9A74AFC671BCBF711623FE9999C9BFEF
:10538000C4EB9899FFFF0F4488B3FE030000F07F41
:10539000FFFFDB3FFFFF1F3EFFFFF23FFFFFE53F49
:1053A000FF7F0340D0B301FCF0B301FC30101BE5DC
:1053B00014C01FE58141A0E10710A0E10600A0E1B3
:1053C0000C508AE0DF0500EB0130A0E10020A0E1F5
:1053D0000910A0E10800A0E11F0600EB3C301FE52A
:1053E00003308AE0055084E0034084E00C0094E838
:1053F000EC0500EB0930A0E10820A0E1E90500EB95
:105400000130A0E10020A0E1030095E8E50500EBF4
:105410002C301BE5000053E3F0AF1BA9CC0800EBD8
:10542000F0AF1BE910402DE90140A0E10030A0E100
:105430000120A0E10010A0E10231C1E30410A0E1CD
:105440000300A0E11080BDE80DC0A0E1F0DB2DE974
:10545000403AA0E1833AA0E1A33AA0E1FF9F43E2F2
:1054600004B04CE2039049E208D04DE20150A0E1C3
:105470000040A0E10030A0E30020A0E330C04BE2F8
:10548000130059E30180A0E10070A0E10060A0E1F9
:105490000540A0E10C008CE9250000CA000059E39A
:1054A000100000AA4B2F8FE20C0092E8A50500EB3C
:1054B0004A2F8FE20C0092E8C40700EB000050E393
:1054C0003F0000DA000057E30040A0A30460A0A161
:1054D0003B0000AA0231C7E3053093E104619F1548
:1054E0001100001A360000EAFC309FE55359A0E194
:1054F000053000E0043093E11A00000AD4208FE266
:105500000C0092E88F0500EBD0208FE20C0092E8AF
:10551000AE0700EB000050E3290000DA000057E37B
:105520000136A0B3536987B00560C6E10040A0E32F
:10553000230000EA330059E3050000DA010B59E3C8
:105540000800001A0130A0E10020A0E17D0500EB79
:10555000F0AB1BE9142049E20030E0E33352A0E154
:10556000050014E10200001A0810A0E10700A0E104
:10557000F0AB1BE95C208FE20C0092E8710500EBB8
:1055800058208FE20C0092E8900700EB000050E3F7
:105590000B0000DA000057E3080000AA140059E3EA
:1055A000016087020500000A0130A0E3342069E2AF
:1055B000132284E0040052E1036087300240A0E13E
:1055C0000540C4E12C600BE528400BE530204BE2A0
:1055D000030092E9F0AB1BE93CE4377E9C75008840
:1055E00000000000000000000000F0BFFFFF0F00FF
:1055F00088319FE50DC0A0E1033000E0F0D92DE92E
:1056000004B04CE243CAA0E10150A0E10040A0E197
:1056100000005CE30170A0E10060A0E100E0A0E117
:105620000280A0E10540A0E11100001A0231C0E3B0
:10563000034094E1F0A91B09122E8FE20C0092E8BE
:10564000850500EB34219FE50140A0E10030A0E199
:105650002C319FE5022000E0422AA0E1030058E13E
:105660000170A0E10060A0E100E0A0E136C042E2EC
:10567000290000BA0C319FE503005CE10500001A27
:105680000710A0E10600A0E10730A0E10620A0E19C
:105690002C0500EBF0A91BE9EC309FE508C08CE07D
:1056A00003005CE1080000DA0730A0E10620A0E179
:1056B000B0008FE2030090E8350000EBA4208FE2F9
:1056C0000C0092E8640500EBF0A91BE900005CE324
:1056D000070000DA7F24CEE30F26C2E30740A0E1F3
:1056E0000630A0E10C3A82E10410A0E10300A0E141
:1056F000F0A91BE936007CE30A0000CA8C309FE564
:10570000030058E1E7FFFFCA60008FE2030090E862
:105710000730A0E10620A0E11D0000EB4C208FE245
:105720000C0092E8E6FFFFEA7F24CEE336C08CE26D
:105730000F26C2E30740A0E10630A0E10C3A82E167
:105740000470A0E10360A0E10710A0E10600A0E161
:1057500020208FE20C0092E83F0500EBF0A91BE946
:1057600000005043000000003CE4377E9C75008838
:105770001F6EA50159F3F8C20000903C0000000024
:105780000000F07FB03CFFFFFF070000FE070000B5
:1057900050C30000F0412DE90180A0E10070A0E1BC
:1057A0000360A0E10250A0E10120A0E10010A0E10F
:1057B0000211C1E3025105E20840A0E10730A0E177
:1057C000053081E10480A0E10370A0E10810A0E1B0
:1057D0000700A0E1F081BDE8000051E31F00000ACE
:1057E0000130A0E30020A0E3010050E11900003ADD
:1057F000010251E3000051310112A0310332A03106
:10580000FAFFFF3A020151E3000051318110A0314B
:105810008330A031FAFFFF3A010050E1010040203F
:1058200003208221A10050E1A1004020A320822179
:10583000210150E12101402023218221A10150E1D9
:10584000A1014020A3218221000050E32332B011A6
:105850002112A011EFFFFF1A0200A0E10EF0A0E15B
:1058600004E02DE55D0000EB0000A0E30080BDE852
:1058700001C020E00130A0E30020A0E3000051E3DC
:10588000001061422100000A000050E30000604265
:10589000010050E11900003A010251E300005131CA
:1058A0000112A0310332A031FAFFFF3A020151E3A5
:1058B000000051318110A0318330A031FAFFFF3A4E
:1058C000010050E10100402003208221A10050E1AD
:1058D000A1004020A3208221210150E1210140208C
:1058E00023218221A10150E1A1014020A321822195
:1058F000000050E32332B0112112A011EFFFFF1A74
:105900000200A0E100005CE3000060420EF0A0E1B4
:1059100004E02DE5310000EB0000A0E30080BDE8CD
:10592000000051E32900000A010051E30100501179
:105930000000A0030EF0A0310130A0E3010251E30A
:10594000000051310112A0310332A031FAFFFF3AB9
:10595000020151E3000051318110A0318330A031A8
:10596000FAFFFF3A0020A0E3010050E101004020CF
:10597000A10050E1A1004020E3208221210150E15B
:105980002101402063218221A10150E1A101402099
:10599000E321822103C0A0E1000050E32332B011D3
:1059A0002112A011EEFFFF1A0E2212E207001C13B3
:1059B0000500000AEC0112E1A10180106C0112E166
:1059C00021018010EC0012E1A10080100EF0A0E196
:1059D00004E02DE5010000EB0000A0E30080BDE83D
:1059E0000EF0A0E10DC0A0E1F0DF2DE904B04CE223
:1059F0000050A0E30040A0E324D04DE230C04BE2D1
:105A0000000051E330000CE80040A0E32C400BE51F
:105A1000480100BA000053E3400100BA004053E2DD
:105A20000180A0E10260A0E10090A0E1CE00001A98
:105A3000010052E14A00009A010852E30210A0E17D
:105A40004300002AFF0052E30800A0830000A09357
:105A5000F4249FE53110A0E10130D2E7003083E06B
:105A6000202073E2203062123933A0111662A01197
:105A7000188283112678A0E10800A0E10710A0E1B8
:105A80001992A011A5FFFFEB0710A0E10040A0E1D3
:105A90000800A0E14FFFFFEB0688A0E12888A0E105
:105AA000980002E02938A0E1044883E1020054E1B3
:105AB00000A0A0E10500002A064094E001A040E219
:105AC0000200002A020054E101A04A32064084305C
:105AD000044062E00710A0E10400A0E18FFFFFEBAB
:105AE0000710A0E10050A0E10400A0E139FFFFEBA6
:105AF000980002E00938A0E12338A0E1055883E1CD
:105B0000020055E10400002A065095E0010040E241
:105B10000100002A020055E1010040320AC880E17C
:105B20000030A0E338300BE538401BE52C301BE596
:105B300034C00BE530400BE530504BE2000053E33E
:105B4000030015E8F0AF1B09000070E20010E1E26D
:105B5000F0AF1BE9010452E31800A0231000A033AA
:105B6000BAFFFFEA000052E30300001A0210A0E1AE
:105B70000100A0E317FFFFEB0060A0E1010856E37E
:105B80007500002AFF0056E30800A0830000A093E0
:105B9000B4239FE53610A0E10130D2E7003083E066
:105BA000202073E23000001A0648A0E10150A0E373
:105BB0002448A0E1088066E026A8A0E138500BE563
:105BC0004C400BE50A10A0E10800A0E153FFFFEBF9
:105BD0000A10A0E10040A0E10800A0E1FDFEFFEBFB
:105BE0004C201BE5900202E02938A0E1044883E143
:105BF000020054E10070A0E10500002A064094E094
:105C0000017040E20200002A020054E101704732B4
:105C100006408430044062E00A10A0E10400A0E1E4
:105C20003EFFFFEB0A10A0E10050A0E10400A0E15C
:105C3000E8FEFFEB4C201BE5900202E00938A0E1F2
:105C40002338A0E1055883E1020055E10400002A51
:105C5000065095E0010040E20100002A020055E1F3
:105C60000100403207C880E1AEFFFFEA201062E287
:105C70001662A0E13871A0E126A8A0E13931A0E1C7
:105C800006C8A0E10700A0E10A10A0E1188283E1A4
:105C90001992A0E14CC00BE520FFFFEB0A10A0E138
:105CA0000040A0E10700A0E1CAFEFFEB4C301BE57D
:105CB0002338A0E10320A0E1900202E04C300BE584
:105CC0002838A0E1044883E14C501BE5020054E170
:105CD0000070A0E13CA00BE540500BE50500002A58
:105CE000064094E0017040E20200002A020054E104
:105CF0000170473206408430044062E03C101BE5EE
:105D00000400A0E105FFFFEB3C101BE50050A0E103
:105D10000400A0E1AFFEFFEB40201BE5900202E093
:105D20000838A0E12338A0E1055883E1020055E1DD
:105D30000500002A065095E0010040E20200002A1A
:105D4000020055E10100403206508530077880E1BD
:105D500038700BE5058062E099FFFFEA010456E325
:105D60001800A0231000A03388FFFFEA010054E1CF
:105D700000C0A08338C00B856AFFFF8A010854E386
:105D80006200002AFF0054E30800A0830000A093F3
:105D9000B4219FE53410A0E10130D2E7003083E068
:105DA000202073E20400001A040058E10600599113
:105DB00001C0A02302C0A03158FFFFEA201062E218
:105DC0003631A0E1144283E13871A0E124A8A0E1BA
:105DD0003931A0E10458A0E10A10A0E10700A0E1D8
:105DE000188283E11992A0E11662A0E144500BE50C
:105DF000CAFEFFEB0A10A0E10050A0E10700A0E1FD
:105E000074FEFFEB44C01BE50020A0E12CC8A0E11C
:105E10009C0202E02838A0E1055883E1020055E128
:105E200048000BE544C00BE50700002A013040E2C2
:105E3000045095E048300BE50300002A020055E1CC
:105E40000130433248300B3504508530055062E054
:105E50000A10A0E10500A0E1B0FEFFEB0A10A0E1EE
:105E60000070A0E10500A0E15AFEFFEB44201BE515
:105E7000900202E00838A0E12338A0E1077883E12E
:105E8000020057E10500002A047097E0010040E29B
:105E90000200002A020057E10470873001004032FE
:105EA00048401BE5077062E004C880E12C08A0E1CF
:105EB0002638A0E10018CCE10328C6E191020EE0EB
:105EC000900202E0930101E0900303E0011092E0F0
:105ED0000138832201E89EE02138A3E0070053E166
:105EE0000600008A0030A0130130A00309005EE123
:105EF0000030A09301300382000053E30000000A49
:105F000001C04CE20050A0E338500BE505FFFFEA6A
:105F1000010454E31800A0231000A0339BFFFFEA04
:105F20002CC01BE50CC0E0E12CC00BE5002072E2A8
:105F30000030E3E2B8FEFFEA0050E0E32C500BE54E
:105F4000000070E20010E1E2B1FEFFEA38B70100A4
:105F50000DC0A0E170D82DE904B04CE20150A0E1E1
:105F60000260A0E10040A0E1AF0000EB000050E3C0
:105F70000100000A0400A0E170A81BE90500A0E1EF
:105F8000A90000EB000050E30100000A0500A0E1B9
:105F900070A81BE90400A0E1A80000EB000050E39A
:105FA0000900000A0500A0E1A40000EB000050E396
:105FB000EFFFFF0A042095E5043094E5020053E169
:105FC000EBFFFF0A70681BE9940000EA0500A0E1FE
:105FD0009A0000EB000050E3EBFFFF1A0500A0E180
:105FE0009B0000EB000050E30B00000A0400A0E15E
:105FF000970000EB000050E3DDFFFF0A0F0094E87C
:106000000F0086E8043094E5042095E50600A0E141
:10601000023003E0043086E570A81BE90400A0E12B
:106020008B0000EB000050E3D7FFFF1A08C094E597
:10603000081095E50C3061E0000053E3003063B2D6
:106040001F0053E30C2094E50CE095E53F0000CAE7
:1060500001005CE1050000DA0C1061E001300EE2A5
:10606000011051E2AEE083E1FBFFFF1A0C10A0E14A
:106070000C0051E1050000DA01C06CE0013002E2E1
:1060800001C05CE2A22083E101C0A001FAFFFF1A77
:10609000040094E5043095E5030050E12500000A72
:1060A000000050E30E20621002206E00000052E358
:1060B000002062B20C2086E50C0096E50030A0A31B
:1060C0000130A0B3043086E5013040E20B0173E3F8
:1060D00008C086E50030A0E10900008A081096E5B6
:1060E0008320A0E1013042E20B0173E3011041E2A1
:1060F0000230A0E10200A081081086850C20868570
:10610000F6FFFF9A0330A0E3000050E3003086E57D
:10611000010000BA0600A0E170A81BE9082096E57E
:10612000013000E2A03083E1012082E20C3086E5FC
:10613000082086E5F6FFFFEA0E3082E008C086E51B
:106140000C3086E5040086E50300A0E1ECFFFFEAE1
:1061500001005CE100E0A0C101C0A0D10020A0D1FD
:10616000CAFFFFEA0DC0A0E130D82DE904B04CE22F
:1061700038D04DE224504BE20030A0E10120A0E1F4
:1061800048004BE20510A0E134404BE248300BE5FB
:106190004C200BE5210600EB4C004BE20410A0E183
:1061A0001E0600EB0410A0E144204BE20500A0E134
:1061B00066FFFFEBBB0500EB30A81BE90DC0A0E1BB
:1061C00030D82DE904B04CE238D04DE224504BE2F7
:1061D0000030A0E10120A0E148004BE20510A0E161
:1061E00034404BE248300BE54C200BE50B0600EB4E
:1061F0004C004BE20410A0E1080600EB30301BE538
:106200000410A0E1013023E244204BE20500A0E1AC
:1062100030300BE54DFFFFEBA20500EB30A81BE98A
:1062200000009FE50EF0A0E114B70100000090E52A
:10623000010050E30000A0830100A0930EF0A0E154
:10624000000090E5040050E30000A0130100A0034B
:106250000EF0A0E1000090E5020050E30000A01362
:106260000100A0030EF0A0E10DC0A0E1F0D92DE9DE
:1062700004B04CE238D04DE230504BE20030A0E1A7
:106280000120A0E154004BE20510A0E140404BE2A8
:1062900054300BE558200BE5E00500EB58004BE2CD
:1062A0000410A0E1DD0500EB0500A0E1660000EBB5
:1062B000000050E350804BE20070A0E30700000AAA
:1062C0002C301BE53C201BE50500A0E1023053E02B
:1062D0000130A0132C300BE5720500EBF0A91BE98F
:1062E0000400A0E1580000EB000050E30600000AA3
:1062F0003C201BE52C301BE50400A0E1023053E0FC
:106300000130A0133C300BE5F2FFFFEA0500A0E1ED
:10631000520000EB000050E30500000A0400A0E179
:10632000530000EB000050E3E4FFFF0A430000EBE2
:10633000E8FFFFEA0400A0E1480000EB000050E3A2
:106340000400000A0500A0E1490000EB000050E352
:10635000E6FFFF0AF4FFFFEA0500A0E1440000EBBE
:10636000000050E3D5FFFF1A0400A0E1400000EB5D
:10637000000050E3DDFFFF1A24201BE534301BE54D
:10638000925386E028001BE538201BE52C101BE506
:10639000020080E03C201BE50630A0E1021051E045
:1063A0000110A0130740A0E1020080E2007053E258
:1063B00048000BE54C100BE5180000BA070177E325
:1063C0000800008A000055E3083098E58770A0E1D6
:1063D000017087B3013043E2070177E38550A0E104
:1063E000083088E5F6FFFF9A7F3007E2400053E36C
:1063F0000400000A0330A0E30C7088E5003088E553
:106400000800A0E1B3FFFFEA800017E30100001AD3
:10641000000055E3F6FFFF0A407087E2F4FFFFEA51
:10642000083098E5010017E3013083E2A550A01180
:10643000083088E502518513A770A0E1DEFFFFEA6E
:1064400000009FE50EF0A0E114B70100000090E508
:10645000010050E30000A0830100A0930EF0A0E132
:10646000000090E5040050E30000A0130100A00329
:106470000EF0A0E1000090E5020050E30000A01340
:106480000100A0030EF0A0E10DC0A0E170D82DE93D
:1064900004B04CE228D04DE228504BE20030A0E19D
:1064A0000120A0E13C004BE20510A0E138404BE2A6
:1064B0003C300BE540200BE5580500EB40004BE27B
:1064C0000410A0E1550500EB0500A0E1490000EB38
:1064D000000050E30200000A0500A0E1F10400EB17
:1064E00070A81BE90400A0E1420000EB000050E3AB
:1064F0000400A011F8FFFF1A24301BE534201BE52F
:106500000500A0E1023023E024300BE53E0000EB63
:10651000000050E30500000A28201BE538301BE589
:10652000030052E1EBFFFF1A2F0000EBEAFFFFEA46
:106530000500A0E1390000EB000050E30060A0E19D
:10654000F4FFFF1A0400A0E12F0000EB000050E36D
:106550000500A01120600B151C600B15DEFFFF1A53
:106560000400A0E12D0000EB000050E30430A01374
:106570000500A01128300B15D7FFFF1A30301BE59E
:1065800020201BE51C101BE52CC01BE5022063E04E
:106590000C0051E10130423220200BE58110A03186
:1065A00020300B350131A0E30C0051E101106C20CB
:1065B00003008021A330B0E18110A0E1F9FFFF1AB0
:1065C0007F3000E2400053E30100000A0C0085E543
:1065D000C0FFFFEA800010E30100001A000051E351
:1065E000F9FFFF0A400080E2F7FFFFEA00009FE5A5
:1065F0000EF0A0E114B70100000090E5010050E3A7
:106600000000A0830100A0930EF0A0E1000090E53F
:10661000040050E30000A0130100A0030EF0A0E16D
:10662000000090E5020050E30000A0130100A00369
:106630000EF0A0E10DC0A0E100D82DE90330A0E3E9
:1066400004B04CE2000050E310D04DE2A02FA0E1D6
:106650001C300BE50230A00318200BE51C300B05A5
:106660001400000A000052E31E30A0E314300BE5D2
:1066700010000B050400000A020150E3CF04A00340
:1066800000A81B09003060E210300BE510201BE56C
:10669000070172E30700008A14101BE58230A0E1B5
:1066A000070173E3011041E20320A0E1FAFFFF9A22
:1066B00014100BE510300BE51C004BE2790400EBE5
:1066C00000A81BE90DC0A0E130D82DE904B04CE2D0
:1066D00014D04DE224504BE20030A0E128004BE200
:1066E0000510A0E128300BE5CC0400EB0500A0E18B
:1066F000270000EB000050E30040A0E10000A013E1
:1067000030A81B190500A0E1170000EB000050E3C2
:106710000400A01130A81B190500A0E1170000EB30
:10672000000050E30400001A1C201BE5000052E3A7
:1067300030A81BB91E0052E3040000DA20301BE52C
:10674000000053E30201E0030201A01330A81BE99B
:1067500020301BE5000053E318301BE51E2062E2E9
:106760003302A0E10000601230A81BE9000090E5B0
:10677000010050E30000A0830100A0930EF0A0E10F
:10678000000090E5040050E30000A0130100A00306
:106790000EF0A0E1000090E5020050E30000A0131D
:1067A0000100A0030EF0A0E10DC0A0E130D82DE95A
:1067B00004B04CE218D04DE20030A0E124104BE2CE
:1067C00028004BE228300BE5940400EB18401BE551
:1067D0000050A0E3053FA0E1245183E1044FA0E174
:1067E0000430A0E124004BE2070090E800508DE562
:1067F000EE0300EB30A81BE90DC0A0E1F0DF2DE9AE
:1068000004B04CE210D04DE20170A0E10280A0E1A2
:106810000060A0E1010100EB000050E30100000A6C
:106820000600A0E1F0AF1BE90700A0E1FB0000EBD0
:10683000000050E30100000A0700A0E1F0AF1BE9EF
:106840000600A0E1FA0000EB000050E30900000A96
:106850000700A0E1F60000EB000050E3EFFFFF0AA5
:10686000042097E5043096E5020053E1EBFFFF0AB0
:10687000F06F1BE9E60000EA0700A0E1EC0000EB86
:10688000000050E3EBFFFF1A0700A0E1ED0000EB72
:10689000000050E30F00000A0600A0E1E90000EB51
:1068A000000050E3DDFFFF0A06E0A0E10F00BEE8B4
:1068B00008C0A0E10F00ACE800309EE500308CE598
:1068C000042096E5043097E50800A0E1032002E0EB
:1068D000042088E5F0AF1BE90600A0E1D90000EB39
:1068E000000050E3D3FFFF1A0C2086E2080096E573
:1068F00008C097E5300092E830E04BE200306CE0F1
:1069000030008EE8000053E3003063B23F0053E3F1
:106910000C3087E2000693E8800000CA0C0050E1CA
:106920000C0000DA00C06CE00020A0E30110A0E33E
:10693000A930A0E1014009E002500AE08A1F83E18A
:10694000AA20A0E101C05CE2019084E102A085E1FF
:10695000F4FFFF1A00C0A0E100005CE1150000DABE
:106960000C0060E030201BE530104BE2300091E875
:10697000A230A0E10020A0E30110A0E3014004E068
:10698000025005E030204BE2300002E92C401BE5CC
:1069900030504BE2841F83E1A420A0E1180015E9E8
:1069A000010050E2013083E1024084E1180085E8F3
:1069B0000C00A001EAFFFF1A041096E5043097E5E9
:1069C000030051E14C00000A000051E34500000AB9
:1069D00030E04BE230009EE8044059E00550CAE048
:1069E000000055E3350000BA0C7088E20030A0E3E7
:1069F000043088E5080088E5300087E8060097E85D
:106A00000040E0E30030E0E3031091E00420A2E066
:106A10001F0272E31100008A2500000A180097E89F
:106A20008420A0E1A34F82E10010E0E30000E0E356
:106A30008330A0E1082098E5030090E00410A1E075
:106A4000012042E21F0271E3082088E5180087E870
:106A50000200008AF0FFFF1A020070E3EEFFFF9AC7
:106A6000043097E50320A0E31E0273E3002088E5CD
:106A70000D00009A060097E80040A0E30130A0E373
:106A8000A1C0A0E1035001E0046002E0080098E525
:106A9000823F8CE1A240A0E1031085E1042086E161
:106AA000010080E2060087E8080088E50800A0E110
:106AB000F0AF1BE9020071E3D7FFFF9AE7FFFFEA9F
:106AC0000430A0E10540A0E1003073E20040E4E2C0
:106AD0000C7088E20120A0E3180087E8042088E514
:106AE000080088E5C4FFFFEA30104BE2300091E86F
:106AF000094054E00A50C5E0B8FFFFEA30404BE2DD
:106B00000C0094E8092092E00A30A3E00C7088E2BF
:106B10000C0087E8041088E5080088E5CFFFFFEA4D
:106B20000C0050E100A0A0C30090A0C3A1FFFFCAC9
:106B30000020A0E30010A0E330304BE2060083E821
:106B40000C00A0E19BFFFFEA0DC0A0E1F0D92DE908
:106B500004B04CE264C04BE24CD04DE234804BE2D6
:106B60000150A0E10040A0E16C604BE20C00A0E10C
:106B70000810A0E148704BE20C0086E830008CE879
:106B8000850400EB0600A0E10710A0E1820400EB01
:106B90000710A0E15C204BE20800A0E115FFFFEB2D
:106BA000D80300EBF0A91BE90DC0A0E1F0D92DE955
:106BB00004B04CE264C04BE24CD04DE234804BE276
:106BC0000150A0E10040A0E16C604BE20C00A0E1AC
:106BD0000810A0E148704BE20C0086E830008CE819
:106BE0006D0400EB0600A0E10710A0E16A0400EBD1
:106BF00044301BE50710A0E1013023E25C204BE2AA
:106C00000800A0E144300BE5FAFEFFEBBD0300EB0A
:106C1000F0A91BE900009FE50EF0A0E124B70100F8
:106C2000000090E5010050E30000A0830100A09364
:106C30000EF0A0E1000090E5040050E30000A01376
:106C40000100A0030EF0A0E1000090E5020050E377
:106C50000000A0130100A0030EF0A0E10DC0A0E110
:106C6000F0DF2DE904B04CE26CC04BE284D04DE281
:106C70000150A0E10040A0E13C704BE274604BE2A7
:106C80000C00A0E10710A0E130008CE80C0086E8C1
:106C900050A04BE2400400EB0600A0E10A10A0E186
:106CA0003D0400EB0700A0E1DF0000EB000050E333
:106CB0000090A0E30080A0E30700000A38301BE545
:106CC0004C201BE50700A0E1023053E00130A01387
:106CD00038300BE58B0300EBF0AF1BE90A00A0E1B5
:106CE000D10000EB000050E30600000A4C201BE539
:106CF00038301BE50A00A0E1023053E00130A01358
:106D00004C300BE5F2FFFFEA0700A0E1CB0000EBFF
:106D1000000050E30500000A0A00A0E1CC0000EBEF
:106D2000000050E3E4FFFF0ABC0000EBE8FFFFEACD
:106D30000A00A0E1C10000EB000050E30400000ADB
:106D40000700A0E1C20000EB000050E3E6FFFF0AED
:106D5000F4FFFFEA0700A0E1BD0000EB000050E3F4
:106D6000D5FFFF1A0A00A0E1B90000EB000050E3D4
:106D7000DDFFFF1A44304BE2060093E830C01BE50C
:106D80000210A0E1912C83E080404BE20C0004E86B
:106D900030204BE2600092E80630A0E103E0A0E181
:106DA00080304BE244001BE5600013E89E50A6E0F3
:106DB000912E83E080401BE590E04BE2060054E119
:106DC00090404BE20C0084E900030EE8901C82E046
:106DD0000300008A0600001A84001BE5050050E14C
:106DE0000300009A893F8FE2180093E890C04BE2BD
:106DF00018000CE80530A0E10040A0E300E0A0E3AB
:106E000080300BE584E00BE580304BE2180013E89E
:106E1000013093E00240A4E0A0C04BE2040052E144
:106E200018008CE90200008A0800001A030051E1F2
:106E30000600009A90204BE2030012E80040A0E315
:106E40000130A0E3030090E00410A1E0030002E899
:106E50000630A0E10040A0E30490A0E10380A0E19F
:106E600090404BE2180094E990604BE208009AE5EC
:106E7000082097E5600016E8038098E004109AE582
:106E8000043097E50490A9E0002082E0058098E0B6
:106E9000A0004BE20690A9E0042082E2013053E01A
:106EA0000130A013030090E95C200BE51E0279E39A
:106EB00080204BE260300BE5030082E91D00009A60
:106EC0007C104BE2220091E8A820A0E1893F82E1FA
:106ED000A560A0E1A120A0E15C001BE5852F82E177
:106EE000A8600BE50060A0E30150A0E3051008E0F6
:106EF000A940A0E1010080E2000051E3AC200BE5D5
:106F00000490A0E10380A0E15C000BE50700000A0B
:106F1000B0204BE2030092E9F8208FE20C0092E8E7
:106F2000031081E1020080E180304BE2030083E93D
:106F30001E0279E3E1FFFF8A1F0279E31200008A53
:106F400078501BE57C601BE55CC01BE58500A0E17B
:106F5000A64F80E18900A0E18630A0E1A82F80E162
:106F600001C04CE28810A0E180E04BE2000055E354
:106F700018008EE95CC00BE50290A0E10180A0E161
:106F80001D0000BA1F0279E3ECFFFF9AFF3008E210
:106F90000040A0E3800053E30600000A64204BE2B7
:106FA0000C3082E2000383E80320A0E364200BE5B9
:106FB00064004BE246FFFFEA000054E3F6FFFF1ACD
:106FC0000020A0E3011CA0E3013008E0024009E03A
:106FD000043093E10300001A7C004BE2030090E8C8
:106FE000010090E1ECFFFF0A0040A0E38030A0E345
:106FF000038098E00490A9E0E7FFFFEA0040A0E3E7
:107000000130A0E3038088E1049089E1DCFFFFEA1E
:1070100000000000010000000000000000000080EF
:1070200000009FE50EF0A0E124B70100000090E50C
:10703000010050E30000A0830100A0930EF0A0E146
:10704000000090E5040050E30000A0130100A0033D
:107050000EF0A0E1000090E5020050E30000A01354
:107060000100A0030EF0A0E10DC0A0E1F0DF2DE9CA
:1070700004B04CE258C04BE250D04DE23C804BE2B1
:1070800060604BE20150A0E10040A0E10C0086E806
:107090000C00A0E10810A0E150704BE230008CE839
:1070A0003D0300EB0600A0E10710A0E13A0300EB6E
:1070B0000800A0E18F0000EB000050E30200000A8E
:1070C0000800A0E18F0200EBF0AF1BE90700A0E190
:1070D000880000EB000050E30700A011F8FFFF1A42
:1070E00038301BE54C201BE50800A0E1023023E00E
:1070F00038300BE5840000EB000050E30500000A87
:107100003C201BE550301BE5030052E1EBFFFF1A6A
:10711000750000EBEAFFFFEA0800A0E17F0000EB4A
:10712000000050E30040A0E1F4FFFF1A0700A0E1D7
:10713000750000EB000050E30600000A0020A0E309
:107140000010A0E330304BE20800A0E134400BE532
:10715000060083E8DAFFFFEA0700A0E16F0000EB1A
:10716000000050E30430A0130800A0113C300B15C0
:10717000D3FFFF1A44304BE2030093E860204BE258
:10718000030002E930304BE2000693E834201BE5AF
:1071900048301BE564401BE5022063E00A0054E12F
:1071A00034200BE50300008A0900001A68001BE583
:1071B000090050E10600009A013042E28A00A0E195
:1071C000A92F80E18910A0E134300BE502A0A0E1F5
:1071D0000190A0E10020A0E30010A0E370304BE29A
:1071E000060083E8F8408FE2300094E864001BE575
:1071F000A430A0E1853F83E1A510A0E10A0050E1A1
:1072000078300BE574100BE50C00008A0200001AC0
:1072100068201BE5090052E10800008A60104BE27B
:10722000030011E9009059E001A0CAE070004BE2B0
:107230000C0090E8042082E1053083E10C0080E836
:1072400070104BE2300011E98A30A0E1A97F83E1A0
:107250008960A0E1052094E107A0A0E10690A0E1EB
:10726000E1FFFF1A70305BE50040A0E3800053E3CC
:107270000400000A70204BE2060092E80C3088E21D
:10728000060083E88DFFFFEA000054E3F8FFFF1AD1
:1072900070004BE2180090E80020A0E3011CA0E37E
:1072A000013003E0024004E0043093E10600000AEC
:1072B0000040A0E38030A0E3060090E8031091E0D6
:1072C0000420A2E0060080E8E9FFFFEA0A9099E1C5
:1072D000E7FFFF0A0040A0E38030A0E370004BE22C
:1072E000F4FFFFEA000000000000001000009FE52E
:1072F0000EF0A0E124B70100000090E5010050E38A
:107300000000A0830100A0930EF0A0E1000090E532
:10731000040050E30000A0130100A0030EF0A0E160
:10732000000090E5020050E30000A0130100A0035C
:107330000EF0A0E10DC0A0E1F0D92DE904B04CE2BF
:1073400050C04BE238D04DE234804BE20150A0E116
:107350000040A0E148704BE20C00A0E158604BE215
:107360000810A0E10C0086E830008CE88A0200EBEF
:107370000600A0E10710A0E1870200EB0800A0E1F1
:107380000D0000EB0030A0E1000053E30700A0E196
:107390000100000A0100A0E3F0A91BE9060000EBD0
:1073A0000030A0E1000053E30800A0E10710A0E1D5
:1073B000F7FFFF1ACB0200EBF0A91BE9000090E5F4
:1073C000010050E30000A0830100A0930EF0A0E1B3
:1073D0000DC0A0E1F0D92DE904B04CE250C04BE261
:1073E00038D04DE234804BE20150A0E10040A0E1F2
:1073F00048704BE20C00A0E158604BE20810A0E19D
:107400000C0086E830008CE8630200EB0600A0E187
:107410000710A0E1600200EB0800A0E10D0000EB06
:107420000030A0E1000053E30700A0E10500001ACE
:10743000080000EB0030A0E1000053E30800A0E1E9
:107440000710A0E10100000A0000E0E3F0A91BE939
:10745000A40200EBF0A91BE9000090E5010050E355
:107460000000A0830100A0930EF0A0E10DC0A0E1F8
:10747000F0D92DE904B04CE250C04BE238D04DE2D7
:1074800034804BE20150A0E10040A0E148704BE2A3
:107490000C00A0E158604BE20810A0E10C0086E867
:1074A00030008CE83C0200EB0600A0E10710A0E1F0
:1074B000390200EB0800A0E10D0000EB0030A0E174
:1074C000000053E30700A0E10500001A080000EBEC
:1074D0000030A0E1000053E30800A0E10710A0E1A4
:1074E0000100000A0000E0E3F0A91BE97D0200EBC7
:1074F000F0A91BE9000090E5010050E30000A08323
:107500000100A0930EF0A0E10DC0A0E1F0D92DE99B
:1075100004B04CE250C04BE238D04DE234804BE234
:107520000150A0E10040A0E148704BE20C00A0E156
:1075300058604BE20810A0E10C0086E830008CE8AF
:10754000150200EB0600A0E10710A0E1120200EB1B
:107550000800A0E10D0000EB0030A0E1000053E3C3
:107560000700A0E10100000A0100A0E3F0A91BE967
:10757000060000EB0030A0E1000053E30800A0E1AA
:107580000710A0E1F7FFFF1A560200EBF0A91BE974
:10759000000090E5010050E30000A0830100A093EB
:1075A0000EF0A0E10DC0A0E110D82DE90330A0E35A
:1075B00004B04CE2000050E314D04DE2A02FA0E153
:1075C00024300BE50230A00320200BE524300B050E
:1075D0001B00000A3C30A0E3000052E31C300BE526
:1075E0000030A001C34FA0010300000A020150E3D4
:1075F00000306012C34FA0111400000A10204BE2AB
:10760000180002E914301BE51F0273E30C00008A26
:1076100010204BE2180012E98420A0E1A34F82E180
:107620008330A0E110204BE2180002E914201BE592
:107630001C301BE51F0272E3013043E21C300BE5F6
:10764000F2FFFF9A24004BE22E0100EB10A81BE989
:1076500004008FE2030090E810A81BE90000E0C1DD
:10766000000000000DC0A0E130D82DE904B04CE2CC
:107670000140A0E10030A0E130204BE21CD04DE2FF
:1076800028504BE20200A0E10510A0E1180082E8BA
:10769000C10100EB0500A0E1280000EB000050E371
:1076A0000040A0E10000A01330A81B190500A0E1D4
:1076B000180000EB000050E30400A01130A81B19D3
:1076C0000500A0E1180000EB000050E30400001AE0
:1076D00020301BE5000053E330A81BB91E0053E324
:1076E000040000DA24301BE5000053E30201E0034C
:1076F0000201A01330A81BE93C2063E220304BE2DA
:10770000030093E9530000EB24301BE5000053E332
:107710000000601230A81BE9000090E5010050E372
:107720000000A0830100A0930EF0A0E1000090E50E
:10773000040050E30000A0130100A0030EF0A0E13C
:10774000000090E5020050E30000A0130100A00338
:107750000EF0A0E10DC0A0E110D82DE904B04CE27C
:107760002CC04BE21CD04DE224404BE20130A0E1A2
:107770000020A0E10C00A0E10410A0E10C008CE8C6
:10778000850100EB0400A0E1020000EB0400A0E191
:10779000DC0000EB10A81BE9043090E5000053E387
:1077A0000030A0130130A003043080E50EF0A0E10A
:1077B0000DC0A0E104D04DE210D82DE908B04CE294
:1077C00014D04DE204308BE50030A0E124300BE50D
:1077D0001C200BE50C009BE910404BE224004BE21F
:1077E00020100BE50C0004E9C60000EB10A81BE913
:1077F0000DC0A0E170D82DE904B04CE234204BE27A
:107800000140A0E10030A0E11CD04DE20200A0E167
:107810002C104BE2180082E85F0100EB20204BE2C5
:10782000180092E80020A0E30311E0E3015003E018
:10783000026004E023CFA0E104318CE1065095E121
:107840002C004BE2070090E801308313244FA0E1A5
:10785000A00000EB70A81BE9000052E370402DE986
:1078600020C062E20140A0E10030A0E10060A0E39E
:107870000050A0E30800000A00005CE33032A0E101
:1078800000E06CE20060A0D3315EA0D13162A0C103
:10789000115C83C10640A0E10530A0E10410A0E125
:1078A0000300A0E17080BDE80DC0A0E1F0DD2DE98E
:1078B00004B04CE20C5090E50040A0E104A090E53B
:1078C000470000EB000050E30080A0E30060A0E16F
:1078D000FF80A013015685130900000AA73BA0E111
:1078E000853483E1E374A0E17F24C7E3FF1008E25D
:1078F0000225C2E3817B82E10231C7E38A0F83E183
:10790000F0AD1BE90400A0E13A0000EB000050E3F9
:107910000200000A0050A0E3FF80A0E3EEFFFFEAB0
:107920000400A0E1380000EB000050E30850A01173
:10793000E9FFFF1A000055E3E7FFFF0A080094E59E
:107940007E0070E3180000AAFF0460E2FF0880E2F6
:10795000FF0C80E2820080E2190050E30850A0C1D1
:10796000060000CA0130A0E31330A0E1013043E279
:10797000030015E13520A0E10250A001015082135F
:107980007F3005E2400053E33F5085120300000AB8
:10799000070175E30180A083A553A0E1CEFFFFEAB4
:1079A000800015E340508512F8FFFFEA7F0050E3A6
:1079B000D7FFFFCA7F3005E2400053E37F8080E2BB
:1079C0003F5085120300000A000055E3A550A0B106
:1079D000018088B2EFFFFFEA800015E34050851276
:1079E000F8FFFFEA000090E5010050E30000A083EB
:1079F0000100A0930EF0A0E1000090E5040050E328
:107A00000000A0130100A0030EF0A0E1000090E52B
:107A1000020050E30000A0130100A0030EF0A0E15B
:107A200004E02DE5B230D0E10320D0E5000090E580
:107A3000A333A0E1A223A0E1FFC4C0E3FFE013E26F
:107A4000042081E502C5CCE31200001A00005CE3CB
:107A50000230A0030D00000A8CC3A0E17E204EE29C
:107A60000330A0E307017CE3003081E5082081E5D5
:107A70000400008A8CC0A0E107017CE3012042E2FF
:107A800008208185FAFFFF9A0CC081E504F09DE48F
:107A9000003081E504F09DE4FF005EE30600000A8B
:107AA0008C33A0E1013183E37F204EE20C3081E58D
:107AB0000330A0E3082081E5F4FFFFEA00005CE367
:107AC0000430A003F1FFFF0A013610E20130A013D9
:107AD000003081E5EBFFFFEA0DC0A0E100D82DE901
:107AE00004B04CE210D04DE200C0A0E11C004BE21B
:107AF0001CC00BE518100BE514200BE510300BE54E
:107B000068FFFFEB00A81BE90DC0A0E1F0DD2DE947
:107B100004B04CE208D04DE20C3080E20040A0E11D
:107B2000600093E8048090E58C0000EB000050E3D7
:107B30000070A0E31C00000A863F8FE2180093E863
:107B40007F7EA0E3035085E1046086E10F7087E249
:107B500028301BE5233AA0E1063683E16336A0E135
:107B600028300BE5B6325BE1872AA0E17F3CC3E316
:107B7000A22AA0E1F030C3E3023283E1B6324BE146
:107B800025205BE5013008E28020C2E3832382E107
:107B900025204BE528301BE528500BE52C300BE564
:107BA00030304BE2030093E9F0AD1BE90400A0E1A3
:107BB0006F0000EB000050E30400000A7F7EA0E3AA
:107BC0000F7087E20060A0E30050A0E3DFFFFFEA50
:107BD0000400A0E16B0000EB000050E3F8FFFF1A87
:107BE000063095E1D9FFFF0A080094E5FF3FE0E386
:107BF000013043E2030050E1350000AABFA360E278
:107C0000FFA78AE2FFAB8AE238005AE31C0000DAE1
:107C10000060A0E30050A0E3FF3005E20040A0E3D5
:107C2000800053E30B00000A0040A0E37F30A0E394
:107C3000035095E00460A6E0010256E32524A0E18C
:107C40000170A023063C82E12644A0E10460A0E18B
:107C50000350A0E1BDFFFFEA000054E3F1FFFF1A6B
:107C60000020A0E3011CA0E3013005E0024006E093
:107C7000043093E1EFFFFF0A0040A0E38030A0E36F
:107C8000EAFFFFEA0A20A0E10010A0E30100A0E360
:107C9000030100EB0040E0E30030E0E3003093E05C
:107CA0000140A4E0042006E0031005E0021091E189
:107CB0000610A0E10500A0E10A20A0E10040A00319
:107CC0000140A013E3FEFFEB045080E1C46F81E1AB
:107CD000D0FFFFEA010B50E3B7FFFFAAFF3005E238
:107CE0000040A0E3FF7F80E2800053E3037087E25F
:107CF0000D00000A0040A0E37F30A0E3035095E0B0
:107D00000460A6E01E0276E30500009AA520A0E12B
:107D1000863F82E1A640A0E1017087E20460A0E115
:107D20000350A0E12524A0E1C5FFFFEA000054E3D1
:107D3000EFFFFF1A0020A0E3011CA0E3013005E0E3
:107D4000024006E0043093E1EDFFFF0A0040A0E3AB
:107D50008030A0E3E8FFFFEA000000000000080018
:107D6000000090E5010050E30000A0830100A09313
:107D70000EF0A0E1000090E5040050E30000A01325
:107D80000100A0030EF0A0E1000090E5020050E326
:107D90000000A0130100A0030EF0A0E1F0402DE9C7
:107DA00000C090E508D04DE204C08DE5B630DDE1BD
:107DB0002332A0E183EAA0E10730DDE5042090E56D
:107DC000AEEAA0E10170A0E1A333A0E1FF64CCE33F
:107DD0007F1EA0E300005EE3043087E50250A0E1CF
:107DE00000208DE50F66C6E30F1081E21E00001A29
:107DF000063092E10230A0031900000A0614A0E147
:107E00000534A0E1254C81E10460A0E10350A0E12C
:107E1000FF2FE0E3012042E20330A0E31F0276E3FC
:107E2000082087E5003087E50900008A8610A0E178
:107E3000082097E5A54F81E18530A0E10460A0E12D
:107E40000350A0E1012042E21F0276E3082087E50B
:107E5000F5FFFF9A0C3087E2600083E808D08DE2DE
:107E6000F080BDE8003087E5FBFFFFEA01005EE13E
:107E70000D00000A0624A0E1254C82E1FF0F4EE22E
:107E800050108FE2060091E80534A0E1030040E2C3
:107E9000015083E1026084E10C3087E2080087E54D
:107EA000600083E80330A0E3EDFFFFEA063092E1D3
:107EB0000430A003EAFFFF0A20108FE2060091E8D9
:107EC000013005E0024006E0043093E10130A013E8
:107ED000003087E5DEFFFFEA000000000000001030
:107EE00000000000000008000DC0A0E170D82DE9DE
:107EF00004B04CE20140A0E10050A0E1590000EBC9
:107F0000000050E30100000A0100A0E370A81BE993
:107F10000400A0E1530000EB000050E3F9FFFF1A5A
:107F20000500A0E1540000EB000050E30600000A49
:107F30000400A0E1500000EB000050E30420941581
:107F4000043095150200631070A81B190500A0E10C
:107F5000490000EB000050E30400000A043095E5FE
:107F6000000053E30100A0030000E01370A81BE928
:107F70000400A0E1400000EB000050E30060A0E13D
:107F80000400000A043094E5000053E30000E0031D
:107F90000100A01370A81BE90500A0E13B0000EB65
:107FA000000050E30400000A0400A0E1370000EBE9
:107FB000000050E30600A01170A81B190500A0E105
:107FC000320000EB000050E3EDFFFF1A0400A0E1D7
:107FD0002E0000EB000050E3DFFFFF1A041095E5D0
:107FE000043094E5030051E10100000A000051E370
:107FF000DBFFFFEA082095E5083094E5030052E135
:10800000F9FFFFCA010000AA000051E3DEFFFFEA0A
:108010000CC085E20C0084E204209CE5043090E56D
:10802000030052E1F0FFFF8A0300001A0C2095E5DF
:108030000C3094E5030052E1EBFFFF8A042090E549
:1080400004309CE5030052E1EEFFFF8A0300001AB2
:108050000C2094E50C3095E5030052E1E9FFFF8A1E
:108060000000A0E370A81BE9000090E5010050E3C8
:108070000000A0830100A0930EF0A0E1000090E5B5
:10808000040050E30000A0130100A0030EF0A0E1E3
:10809000000090E5020050E30000A0130100A003DF
:1080A0000EF0A0E1000052E370402DE920C062E232
:1080B0000140A0E10030A0E10060A0E30050A0E397
:1080C0000800000A00005CE31132A0E100E06CE26D
:1080D0000050A0D3106EA0D11052A0C1306C83C14B
:1080E0000640A0E10530A0E10410A0E10300A0E1FA
:1080F0007080BDE80DC0A0E10E002DE900D82DE98B
:1081000010B04CE20010E0E304209BE508308BE265
:10811000C50000EB00A81BE9000052E302C0A0E18B
:108120000600000A0020D0E5FF3001E2030052E122
:108130000EF0A00101C05CE2010080E2F8FFFF1A2E
:108140000000A0E30EF0A0E1000052E300C0A0E1B7
:108150000EF0A0010130D1E4012052E20130CCE464
:108160000EF0A001FAFFFFEA0030D0E5000053E373
:108170000020A0E10200000A0130F0E5000053E316
:10818000FCFFFF1A000062E00EF0A0E10030A0E367
:10819000012042E2010072E30600000A00C0D0E5BF
:1081A0000130D1E403305CE0010080E20100001AFC
:1081B00000005CE3F5FFFF1A0300A0E10EF0A0E170
:1081C00000442DE910A09FE510209FE50AA08FE054
:1081D00002208AE00044BDE8010000EAA080FE031E
:1081E0007C0300000DC0A0E170D82DE9004050E2F2
:1081F00004B04CE20260A0E10150A0E10200001ACC
:10820000004092E5000054E30E00000A0400A0E1E3
:108210008A0400EB0030F4E7FF3003E2000053E390
:108220000400A0E10510A0E10340A0010300A001AB
:108230000300000A6F0400EB000050E30030A013BD
:108240000130C014000086E50400A0E170A81BE91D
:108250000010A0E30A20A0E3FFFFFFEA0130A0E343
:10826000FFFFFFEA0DC0A0E1F0DF2DE990A19FE53F
:1082700004B04CE208D04DE20040A0E10250A0E181
:108280000AA08FE00060A0E12C100BE530300BE578
:108290000000D4E55C0000EB000050E301408412D4
:1082A000FAFFFF1A0020D4E52B0052E30080A0E182
:1082B0000200000A2D0052E30100001A0180A0E331
:1082C000014084E21020D5E30D00001A0030D4E50F
:1082D000300053E30A5085E20700001A016084E28F
:1082E0000030D6E5203083E3780053E3025045E2C6
:1082F0000640A0E18550A00101408602100055E330
:108300001050A0A3023045E2220053E30070A0E326
:108310002900008A0510A0E10000E0E37FF5FFEBF3
:108320000510A0E10030A0E10000E0E3FF9003E2CF
:1083300028F5FFEB0020D4E5303042E2FF3003E2C5
:10834000090053E30320A0910400009A400052E387
:108350002030828357304382FF2003822820A0935D
:10836000050052E1140000AA016084E2000057E118
:108370000640A0E10700008A0030A0130130A003EE
:10838000090052E10030A09301300382000053E362
:1083900095272700E6FFFF0A30201BE5023008E0A2
:1083A000FF8003E25C309FE503309AE72220A0E3E0
:1083B0000070E0E3002083E5DDFFFFEA2C301BE5E1
:1083C000000053E30060831530201BE5000058E3F4
:1083D0000211E0030211A013000052E30100571143
:1083E00020209F8502209A872230A083003082853A
:1083F0000170A081000058E3000067120700A0018F
:10840000F0AF1BE9EC7FFE03000000000030A0E1AC
:10841000090040E2040050E30000A0830100A093A3
:10842000200053E3010080030EF0A0E10DC0A0E1A5
:1084300030D82DE90140A0E10010E0E104B04CE2A9
:10844000010054E10140A02148D04DE20210A0E11A
:108450000320A0E10130E0E350300BE558309FE508
:1084600000C0A0E104E080E00050A0E35C004BE22B
:1084700034E00BE5BC354BE148C00BE53CC00BE5F7
:1084800040C00BE538C00BE544E00BE51C500BE5A4
:10849000770100EB050054E130A81B0940201BE5E3
:1084A00044301BE5011042E2030052E140100B058D
:1084B00040301BE50050C3E530A81BE990200000C8
:1084C0000DC0A0E130D82DE9000052E304B04CE229
:1084D00004D04DE20240A0E115104BE50050A0E1B0
:1084E00030A81B0915004BE20110A0E30520A0E114
:1084F000840400EB014054E230A81B09F8FFFFEAB6
:108500000DC0A0E1F0DF2DE944A59FE504B04CE2E9
:10851000C0D04DE20180A0E10030A0E30AA08FE0CE
:10852000D8000BE50100A0E10390A0E1DC200BE501
:10853000CC300BE56B0600EB0800A0E1E70500EB93
:108540002620D8E5183098E5090053E1023188E08B
:10855000240083E22030A0E3E4300BE5543088E2CD
:10856000823183C01C2098E50B10A0E3083043C281
:10857000020059E1E0100BE5050000AA28104BE2CB
:10858000012052E2203001E5083083E2041081E24C
:10859000FAFFFF1A204098E5000054E30900001A92
:1085A000DC301BE5101098E5002093E548001BE542
:1085B0000F1C01E2000090E5C23FA0E1700100EB5A
:1085C0000400A0E1F0AF1BE9070054E36400008A57
:1085D00080349FE503308AE0033084E0015053E5A6
:1085E0000A0055E35760A0E30500001A103098E533
:1085F000200013E35760A0032C60A013400013E396
:1086000080608613050054E3005065820400008AF0
:10861000030054E33760A003010054E30610A003F5
:10862000E0100B05043098E5000053E31420D8B5A2
:10863000000090E5E4200BB50F0C00E20520A0E15E
:1086400048101BE5590100EB0530A0E10120A0E135
:108650000010A0E149004BE200608DE5EE0400EB64
:10866000201098E5050051E30050A0E11100009AA8
:108670000030D0E52D0053E3103098E50500001AD6
:10868000023083E30220A0E3015080E2E0200BE50A
:10869000103088E5070000EA020013E30030A01361
:1086A000E0300B150300001AE0201BE5010013E386
:1086B0000420A013E0200BE5049098E5102098E535
:1086C000000059E3C8304BE2030065E00190A0B31D
:1086D000100012E37F6080E20C00000A020051E308
:1086E000E0301BE50630A093030051E30930A003FE
:1086F000060059E104005193E0300BE50300001A35
:108700000030D5E5300053E3809080120190A00343
:108710000030D5E5300053E30B00001AE0101BE5F4
:10872000203098E5050051E30B10A0C3010053E38E
:10873000E0100BE520339F0503509A070560A00366
:108740000400000A000059E30060A003060059E19C
:10875000092066800000008A0020A0E30290A0E1CA
:108760006F0000EA0F0054E30A00008A48101BE57E
:10877000043088E2060091E8D8001BE5250100EBF3
:10878000DC101BE5003091E5003083E00000A0E341
:10879000003081E5F0AF1BE9110054E31C00008AB2
:1087A0000040A0E3D4400BE548101BE50E00001A82
:1087B000003091E5040053E1CC300BE52200000AC3
:1087C000042098E5CC004BE2040052E10020E0B325
:1087D000D4304BE20010A0E1470300EB010070E34E
:1087E0000060A0E1F0AF1B094D0000EAC8504BE269
:1087F000001091E5D4204BE20500A0E1260300EB38
:10880000010070E30060A0E10040C517F0AF1B0954
:10881000430000EA130054E31600008A48101BE5E9
:108820000D00001A005091E5000055E30600000A13
:10883000041098E5000051E30010E0B30500A0E14A
:10884000DE0200EB0060A0E1350000EA0C329FE59B
:1088500003509AE70660A0E3310000EA0030D1E55A
:10886000C8504BE2C8304BE50160A0E30030A0E304
:10887000C7304BE52A0000EA140054E30700001A51
:10888000DC319FE503309AE7C8104BE2000093E526
:108890008020A0E3F90200EB0050A0E1E3FFFFEA33
:1088A000C0119FE501309AE7005093E50020D5E51F
:1088B0000C3098E5030052E11200001AA4319FE544
:1088C00003309AE700C093E59C319FE505C06CE05A
:1088D000D8001BE5041088E248204BE203309AE7F9
:1088E0000FE0A0E10CF193E7000050E33A0000BA7A
:1088F000DC201BE5003092E5003083E00000A0E3BF
:10890000003082E5F0AF1BE901309AE7003093E5D3
:10891000015085E20A3083E2030055E1E2FFFF3AAD
:108920002D0000EAE0301BE50B0053E3092086E050
:108930000200000A050053E3012082D2022082C215
:10894000083098E5DC101BE5020053E103706280FB
:108950000070A093003091E5072082E0023083E0B0
:10896000003081E5E4201BE5103098E5300052E34B
:10897000079089000070A003084013E20400001A69
:108980000720A0E1D8001BE52010A0E3CBFEFFEB01
:108990000470A0E1D4309FE503008AE0E0301BE5DD
:1089A000D8101BE5000083E00C0300EBD8001BE5AA
:1089B0000920A0E13010A0E3C0FEFFEBCC301BE5A6
:1089C000000053E30600001A0500A0E10610A0E134
:1089D000D8201BE54B0300EB170000EA0000E0E3A2
:1089E000F0AF1BE90030A0E3000056E3D4300BE504
:1089F0000F00000A800056E30650A0318050A023EB
:108A0000C8404BE20520A0E1D4304BE2CC104BE251
:108A10000400A0E1B80200EB0050A0E10510A0E1C5
:108A20000400A0E1D8201BE5360300EB056056E00A
:108A3000EFFFFF1A0030A0E3CC300BE5D8001BE5B8
:108A40000720A0E12010A0E39CFEFFEB0000A0E3C4
:108A5000F0AF1BE9507DFE03C4B501FC040000002B
:108A600008000000000000000C00000010000000E2
:108A7000CCB501FC0DC0A0E1F0D92DE904B04CE269
:108A8000A8D04DE2C4804BE20030A0E30070A0E12A
:108A90000800A0E10140A0E1C8300BE50260A0E1C0
:108AA000340400EB000050E30450A0E1090000AAE8
:108AB000C4401BE50400A0E1AAFDFFEB0720A0E1F4
:108AC0000010A0E10400A0E10E0300EB0030E0E3A1
:108AD000C8300BE5280000EA0610A0E10800A0E17C
:108AE0006E0400EB0030D4E5000053E3250053137F
:108AF0000300000A0130F4E5000053E3250053139E
:108B0000FBFFFF1A050054E10800000A041065E0AD
:108B10000500A0E10720A0E1FA0200EB000050E30D
:108B2000E9FFFFBAC8301BE5003083E0C8300BE531
:108B30000030D4E5000053E30F00000A0130F4E5F3
:108B4000250053E30900000A0700A0E10810A0E196
:108B5000C8204BE2C4400BE568FEFFEB000050E389
:108B6000C4401BA50450A0A1DDFFFFAAD6FFFFEA69
:108B70000450A0E1014084E2D9FFFFEAC8001BE5F0
:108B8000F0A91BE9010C51E30020C0050EF0A00183
:108B9000020B51E30100001A0C0080E80EF0A0E186
:108BA000020C51E3B020C001002080150EF0A0E1BE
:108BB000000052E30020A0E1023B00E2090000BAFD
:108BC000000053E30900001A010C50E3000091E596
:108BD000FF000002020C52E30038A0012308A001AC
:108BE0000010A0E30EF0A0E1000053E30100000A32
:108BF000030091E80EF0A0E1010C50E3000091E5C4
:108C0000FF000002020C52E30038A0014308A0015B
:108C1000C01FA0E10EF0A0E10DC0A0E1F0DF2DE942
:108C200004B04CE201DC4DE20890D3E5610059E369
:108C30000C310BE56790A003003093E5410059E348
:108C40000CE11BE54790A003000053E30630A0B3FE
:108C50000CC09EE520310BE501EC4BE20030A0E3B7
:108C600004304EE50250A0E10140A0E10C211BE5DB
:108C700002001CE3042092E528A29FE52B30A013FC
:108C800001CC4B1208010BE51C210BE50AA08FE07B
:108C900004304C150300001A01001CE32030A0131F
:108CA00001EC4B1204304E1500C0A0E301EC4BE286
:108CB0000510A0E10400A0E10530A0E10420A0E13E
:108CC00003C04EE5A60700EB000050E30080A0E1E2
:108CD0000A00000A600059E30630A0930530A08323
:108CE000FF304BE50C211BE50330A0E3E8300BE53A
:108CF000FE604BE22030A0E3103082E55D0100EA27
:108D0000192E8FE20C0092E80510A0E10400A0E10A
:108D100087F9FFEB000050E30030E00314310B054E
:108D20009200000A5B2F8FE20C0092E80510A0E190
:108D30000400A0E1F3F9FFEB000050E3070000AAF4
:108D40002D30A0E301CC4BE20510A0E10400A0E12E
:108D500004304CE57EFAFFEB0150A0E10040A0E1B9
:108D60004E2F8FE20C0092E80510A0E10400A0E174
:108D7000B9F7FFEB0130A0E10020A0E10510A0E170
:108D80000400A0E16AF9FFEB000050E30A00001ABA
:108D9000600059E30430A0930330A083FF304BE51B
:108DA0000CE11BE50330A0E3E8300BE5FE604BE28D
:108DB0002030A0E310308EE52E0100EA016C8FE236
:108DC000C00096E890C04BE288C18CE00710A0E19B
:108DD0000600A0E10730A0E10620A0E1C0008CE879
:108DE0009DF7FFEB018088E20C0058E30170A0E1E1
:108DF0000060A0E1F2FFFFDABC208FE20C0092E8F5
:108E00000510A0E10400A0E1BEF9FFEB0820A0E3FB
:108E1000A00FA0E1013AA0E318010BE514210BE536
:108E200010310BE50C80A0E318C11BE510311BE5E8
:108E300001E048E2C330A0E100005CE328E10BE57B
:108E400090204BE28801A0E124310BE52000000ACC
:108E5000023080E00C0093E80510A0E10400A0E1DE
:108E60007DF7FFEB60208FE20C0092E80170A0E13B
:108E70000060A0E1A3F9FFEB000050E345CF4BB247
:108E800000509CB80750A0B10640A0B10CC06EB015
:108E900014C10BB51F0000EA000000000000000034
:108EA0000000D03F00000000E075FE031400000049
:108EB000180000001C0000003800000084D7974113
:108EC00000000000000024400000000065CDCD41FE
:108ED00000000000023080E00C0093E80510A0E1E3
:108EE0000400A0E15FF8FFEB34204FE20C0092E8B1
:108EF0000170A0E10060A0E15BF9FFEB000050E32E
:108F0000452F4BA20C0092A8032082A014210BA590
:108F10000750A0A10640A0A14A8F4BE2001198E89B
:108F2000010078E310C10BE5BEFFFF1A68204FE295
:108F30000C0092E80510A0E10400A0E14AF9FFEB63
:108F4000000050E3090000BA0510A0E10400A0E110
:108F500094204FE20C0092E842F8FFEB14E11BE58D
:108F600001E08EE214E10BE50150A0E10040A0E138
:108F7000AE704BE20280A0E30510A0E10400A0E186
:108F8000B7F9FFEB0060A0E185F9FFEB0130A0E14C
:108F90000020A0E10510A0E10400A0E101F7FFEB33
:108FA000DC204FE20C0092E82BF7FFEB08311FE5C5
:108FB0000150A0E10040A0E10920A0E303109AE7DE
:108FC0000700A0E10630A0E149FCFFEB018058E278
:108FD000007087E0E7FFFF5A600059E36530A0E3C7
:108FE000F8304BE520211BE54530A093F8304B9538
:108FF00020308992FF900392000052E30030A0D30A
:109000000130A0C3670059E30030A0130130030210
:10901000000053E302C0A0E101C04212660059E320
:109020000940A0E10A00001A14311BE503C08CE0DE
:1090300001007CE3060000AA00C0E0E3B0004BE2C0
:109040003010A0E31420A0E314C10BE5D40000EB22
:1090500014C11BE50020A0E33030A0E313005CE363
:10906000AF304BE5B0204BE50280A0E1AF704BE2A2
:109070009A004BE2050000CA0C2087E00230D2E5DE
:10908000020082E2340053E30080A0930180A083B9
:10909000013070E5083083E00030C0E50020D0E505
:1090A000390052E30030A0930130A083300052E336
:1090B00001308303000053E3F4FFFF1A14111BE592
:1090C000070050E10700A091011081920170878292
:1090D00000E0A0E3670059E301E0E0E50800001AC2
:1090E000040071E30030A0B30130A0A30C0051E1F3
:1090F0000030A0C3013003D20E0053E16790A003FB
:109100006690A013660059E314110BE50010A0133C
:10911000000051E33030A0B30120A0E3013067B577
:10912000FFE04BE5E8200BE50130D7E4303043E2C7
:10913000E4300BE5008067E0FE604BE2E0504BE27C
:10914000190000BA080051E10D0000BA011068E0F2
:10915000000051E3E0800BE5FE204BE5DC700BE501
:109160000E80A0E1FD604BE2D8504BE2FC604BC2A8
:10917000D0504BC2D8100BC5FDE04BC5D4E00BC599
:10918000080000EA000051E3060000DAFE204BE58B
:10919000E0100BE5DC700BE5088061E0FD604BE260
:1091A000D8504BE2017087E00010E0E30CE11BE5D2
:1091B0000C309EE52332A0E1013003E2000058E3C9
:1091C00001308313000053E30300001A20211BE544
:1091D000670054E300005213040000DA0230A0E3F9
:1091E0000130C6E40130A0E3043085E4045085E298
:1091F000011091E2003061420020A0430120C644EA
:109200000430854404208544000058E30130A01355
:109210000130C6140480851404708514670054E37B
:109220000700000A20311BE5088061E0030058E1D7
:10923000038068B00030A0B30130C6B4048085B4A8
:10924000043085B4660059E30A00000A0130A0E347
:109250000130C6E4AC331FE5F8404BE203109AE757
:10926000F8205BE514311BE50400A0E1A0FBFFEB57
:10927000040085E4004085E5010C4BE2061060E047
:10928000010051E3E8504BE2070000DA018041E2BF
:10929000043095E41CC11BE5018058E20CC063E07A
:1092A0001CC10BE5045085E2F8FFFF1A01EC4BE20C
:1092B00004305EE51C211BE5008053E20180A01311
:1092C000022068E0000052E30030A0D31C210BE52F
:1092D0001C310BD5160000DA0CC11BE50C309CE5E7
:1092E000082013E20A00000A0730A0E30030C6E5B8
:1092F0001CE11BE548341FE504E085E403309AE7F0
:109300000020A0E3011081E21C210BE5003085E57F
:10931000070000EA0CC11BE510309CE5300053E368
:10932000E8301B051CE11B050E308300E8300B05FF
:109330001C210B051C211BE50040A0E3083082E046
:1093400001CC4BE20720A0E30020CCE5010054E172
:10935000F0300BE5413F4BE2EC300BE50060A0E163
:10936000F0504BE20C0000AA0180A0E1BC341FE5E4
:109370000120D6E403308AE0021193E708011BE5DF
:109380000C0095E8F30100EB003095E5018058E210
:10939000034084E0085085E2F3FFFF1A0400A0E1D7
:1093A000F0AF1BE9000052E30030A0E10EF0A00195
:1093B000012052E20110C3E40EF0A001FBFFFFEA1E
:1093C000000051E30020A0E10800000A0030D0E5D1
:1093D000000053E30500000A011051E2010080E2A1
:1093E0000200000A0030D0E5000053E3F9FFFF1A45
:1093F000000062E00EF0A0E10030D0E5000053E391
:109400000C00000A0020D1E5000052E301C0A0E1F9
:109410000500000A0030D0E5030052E10EF0A00183
:109420000120FCE5000052E3F9FFFF1A0130F0E5EE
:10943000000053E3F2FFFF1A0000A0E30EF0A0E1EA
:109440000020D1E5000052E304E02DE501C0A0E1D9
:1094500000E0A0E10700000A0030D0E5030052E17F
:1094600001C08CE201C0A0010020DCE50100800207
:10947000000052E3F7FFFF1A00006EE004F09DE4E5
:109480000DC0A0E110D82DE904B04CE20140A0E1EC
:10949000DA0300EB0400A0E110A81BE90DC0A0E175
:1094A00010D82DE9000050E304B04CE200C0A0E168
:1094B00020C04B0201E0A0E120D04DE200E0A0017D
:1094C0000C00A0E128C04BE20240A0E12CC00BE55B
:1094D0001030A0E300C0A0E32C104BE20020E0E33A
:1094E00028E00BE524C00BE500408DE50D0000EB06
:1094F000000050E30100A00310A81BE90DC0A0E18B
:1095000000D82DE904B04CE204D04DE202C0A0E145
:1095100003E0A0E10020E0E30C30A0E100E08DE5F5
:10952000000000EB00A81BE930442DE9A4A09FE552
:10953000010050E10000501310D04DE20140A0E1C5
:1095400003C0A0E10AA08FE00150A0E30300001ACD
:10955000000050E300C0E0030D00A0E10050A0E3D4
:1095600002005CE102C0A02100005CE30C10A0E15D
:10957000002094E51200000A003092E57F0053E3DA
:109580000500009A50209FE502209AE75430A0E39E
:109590000000E0E3003082E50C0000EA0030D2E594
:1095A000FFE003E200005EE30030C0E50E20A00112
:1095B0000300000A011051E2042082E2050080E06D
:1095C000ECFFFF1A0D0050E1002084150C0061E053
:1095D00010D08DE23084BDE8286DFE03000000004D
:1095E0000DC0A0E170D82DE904B04CE20160A0E10B
:1095F0000050A0E1DBFAFFEB0040A0E10410A0E185
:109600000500A0E10630A0E10120A0E3030000EB8B
:10961000000050E30040E0030400A0E170A81BE953
:109620000DC0A0E130D82DE904B04CE203C0A0E1A8
:10963000B030D3E1020B13E380E083E3083083E32F
:109640000140A0E10050A0E30210A0E1B030CC1135
:109650000A00001A000054E30C20A0E1B0E0CCE1C5
:109660000430A0E10400000A940101E0250000EBB1
:109670000410A0E157F0FFEB0030A0E10350A0E19F
:109680000500A0E130A81BE90DC0A0E1000052E3F5
:10969000F0D92DE904B04CE20280A0E10060A0E125
:1096A0000170A0E10250A0E11400000A343096E5F8
:1096B000000055E30540A0A10241E0B3000053E3E0
:1096C0000710A0E10420A0E10000E0032C009615A3
:1096D0000FE0A01103F0A011000050E3B030D6B1AC
:1096E000083083B3B030C6B1040000BA040050E1C2
:1096F0000400A0C1005055E0007087E0EAFFFF1AA7
:10970000080065E0F0A91BE90DC0A0E1F0DF2DE93C
:1097100004B04CE208D04DE2B030D2E178A29FE52F
:10972000205013E20240A0E103C0A0E10070A0E1DC
:109730000180A0E10AA08FE00700000A083083E35F
:10974000B030C2E154329FE503309AE70920A0E32C
:109750000000A0E3002083E5F0AF1BE9016A13E2FB
:109760001400000A1C2092E5203094E5030052E129
:109770000100003A03001CE30900000A010B1CE38E
:109780000120A0030220A0130400A0E10510A0E125
:10979000B50300EB000050E3B030D4110500A01178
:1097A0001700001A143094E5243084E5203084E555
:1097B0001C3084E5150000EA093B03E2010B53E38A
:1097C0001200001A0030A0E30020A0E328104BE2B2
:1097D0000C0021E90400A0E10220A0E3710000EBED
:1097E000000050E30900000AB0319FE503309AE71A
:1097F000003093E5200053E30400000AB030D4E1C8
:109800000600A0E1083083E3B030C4E1F0AF1BE90B
:10981000B030D4E1142094E5033AC3E3000057E3E9
:10982000282084E5B030C4E10790A0E10100A0E366
:109830002200001A0C1094E5142094E51C3094E5E5
:10984000020071E3035062E00260A0E10700001A29
:10985000B030D4E1000057E3023A83E3B030C4E112
:1098600007306910080083100700A001F0AF1BE962
:109870000210A0E10400A0E10520A0E181FFFFEBC0
:10988000143094E5005055E01C3084E5006086E01B
:109890000500000A1C3094E50120D6E40120C3E451
:1098A000015055E21C3084E5F9FFFF1A000057E330
:1098B000142094051C30940503006200F0AF1B09CE
:1098C0001C2094E5143094E5030052E10C00001ACA
:1098D000183094E5033062E0080053E10800008A84
:1098E0000C3094E5020073E30500000A0710A0E1C4
:1098F0000820A0E10400A0E162FFFFEB007087E018
:109900001B0000EA183094E5031062E0080051E102
:109910000810A021000051E30760A0E1088061E089
:109920000500000A1C3094E50120D7E40120C3E4BF
:10993000011051E21C3084E5F9FFFF1A000050E3EA
:109940000B00000A000058E3B9FFFF1AB030D4E161
:10995000010C13E30600000A070056E10400002A88
:109960000130D6E40A0053E3B1FFFF0A070056E1D5
:10997000FAFFFF3AB020D4E124309FE5033002E043
:10998000000053E318309405070069E0283084058F
:10999000023A82E3B030C4E1F0AF1BE9386BFE035A
:1099A00000000000080B00000DC0A0E110D82DE958
:1099B00004B04CE22CC090E50C3080E203005CE186
:1099C0000140A0E10230A0E10A00000A383090E531
:1099D000000053E30500000A0C00A0E10FE0A0E145
:1099E00003F0A0E1000050E30000A0A310A81BA911
:1099F0000000E0E310A81BE90C0090E5060091E8E8
:109A0000C00200EB000051E30030E0B30030A0A33F
:109A1000030084A80300A0E110A81BE90DC0A0E189
:109A2000F0DB2DE9000053E304B04CE20CD04DE232
:109A30000260A0E10150A0E10020A0E30370A0E1DA
:109A40000080A0E128200BE5060000AA060176E3CD
:109A5000007063E20300009A0130A0E328300BE5B8
:109A6000005075E20060E6E20090A0E30090C8E5D7
:109A70000710A0E10000E0E356EFFFEB0710A0E1C4
:109A80002C000BE50000E0E3A4EFFFEB010080E217
:109A9000070050E12C201B05012082020630A0E1C6
:109AA0002C200B0530000BE50560A0E130900B0584
:109AB0000390A0E10900A0E10710A0E197EFFFEB00
:109AC0000710A0E10040A0E10900A0E141EFFFEB99
:109AD0000710A0E10090A0E10600A0E18FEFFFEBEE
:109AE00030501BE50710A0E1940525E00600A0E139
:109AF00038EFFFEB2C301BE50710A0E1930424E0C6
:109B00000500A0E133EFFFEB0710A0E10030A0E17A
:109B10000500A0E1036084E080EFFFEB090050E363
:109B200004209B85303080E2018048E20230808052
:109B3000092096E10050A0E10030C8E5DCFFFF1AE3
:109B400028301BE5000053E32D30A01301306815C9
:109B50000800A0E1F0AB1BE90DC0A0E10E002DE96B
:109B600000D82DE910B04CE204109BE508208BE2F0
:109B7000BFFBFFEB00A81BE90DC0A0E170DC2DE9E5
:109B800010A19FE504B04CE20CD04DE20040A0E1F2
:109B90000150A0E10AA08FE00010A0E3A420A0E300
:109BA000FFFDFFEB183094E500C0A0E31C104BE272
:109BB000013043E2183084E5045021E50020E0E361
:109BC000005084E50C00A0E128304BE228C00BE5F2
:109BD000640200EB010070E3286084120620A011EB
:109BE0000A00A0130500001AAC309FE503308AE09C
:109BF000003084E570AC1BE90000E0E370AC1BE9C9
:109C00000830A0E3010050E2043082E4FBFFFF1AB9
:109C10000030D5E5000053E30520A0E11000000A64
:109C20000030D2E5250053E30900001A0130F2E5C7
:109C3000250053E30600000A002084E50400A0E1AB
:109C4000A80000EB000050E3002094A5010000AA4A
:109C5000E8FFFFEA012082E20030D2E5000053E392
:109C6000EEFFFF1A180094E5010050E2005084E571
:109C70000620A0E10500004A003092E5080053E309
:109C8000DCFFFF0A010050E2042082E2F9FFFF5AE4
:109C90000000A0E370AC1BE9D866FE03D8B501FC58
:109CA0000DC0A0E130D82DE9185090E50030A0E3B8
:109CB000030055E104B04CE20040A0E1501080E503
:109CC00030A81BD9083080E51C5080E5183080E5AD
:109CD000043080E5010000EB185084E530A81BE952
:109CE00018C090E500005CE310402DE9541080E2BC
:109CF000083090E53900001A020153E30400001A0D
:109D0000503090E5042093E4503080E5082080E551
:109D1000542080E5043090E5020153E30400001A6A
:109D2000503090E5042093E4503080E5042080E535
:109D3000542080E51C3090E503005CE1320000AA6D
:109D40000C3180E0282093E5070052E301C08CE24B
:109D50001300000A180000DA020C52E31600000A91
:109D6000020000CA080052E31800000A120000EACC
:109D7000020B52E30400000A0F0000DAB8309FE53E
:109D8000030052E10600000A0B0000EA502090E5B3
:109D9000083082E2503080E5180092E8180081E82F
:109DA000090000EA502090E5083082E2503080E55A
:109DB000180092E8180081E8030000EA503090E5AE
:109DC000042093E4503080E5002081E5081081E212
:109DD0001C3090E503005CE1D8FFFFBA0A0000EAFE
:109DE000020153E32430D00583318100083013058C
:109DF00008308005043090E5020153E32530D0059A
:109E0000833181000830130504308005081090E587
:109E1000000051E31080BDA8103090E5083083E3C6
:109E2000001061E20130C3E32020A0E3142080E5AC
:109E3000081080E5103080E51080BDE807080000BC
:109E400000442DE940A09FE540109FE50AA08FE067
:109E500001308AE0182083E2F23072E1000053E121
:109E60000200000A01308AE0030052E1F9FFFF8A94
:109E700018309FE503308AE0023063E010209FE550
:109E800002208AE0C300D2E70084BDE82064FE031C
:109E9000FCB501FC14B601FC0DC0A0E1080051E3C3
:109EA00030D82DE904B04CE20150A0E10040A0E31D
:109EB0000A00000A010050E1080050130140A0E32D
:109EC0000600000ADDFFFFEB0040A0E10500A0E175
:109ED000DAFFFFEB000054E10040A0C30140A0D333
:109EE0000400A0E130A81BE90DC0A0E1F0DF2DE9DE
:109EF00004B04CE25CD04DE2103090E50020A0E3CD
:109F000080E013E20830A0E3C8A49FE54C300BE5E5
:109F10005C200BE558200BE550300BE50010E0E32A
:109F20000060A0E10280A0E10AA08FE080100BE5B4
:109F3000189090E502C0A0E1005090050F00000AC3
:109F40007B504BE20240A0E128104BE2003096E546
:109F5000043183E0042053E5542041E5043013E547
:109F6000030052E11101001A011081E2553051E560
:109F7000000053E3014084E2F3FFFF1A5D304BE53C
:109F80000030D5E52A0053E30500A0E10700001AE0
:109F900000005CE328204BE20430A0130030A00353
:109FA000023083E00020A0E3282003E5015085E291
:109FB0000010D5E5303041E2090053E30040A0E352
:109FC0000800008A10349FE5030054E1043184D076
:109FD000833081D00110F5E5304043D2303041E28A
:109FE000090053E3F6FFFF9A013050E5250053E3E3
:109FF0002F00001A0020D5E5000054E30030A0D364
:10A000000130A0C3240052E30030A013013003024A
:10A01000000053E30600000A000059E3015085E206
:10A02000E200000A090054E10490A0C154400BE58D
:10A030000E0000EA000059E3050000DA6D0052E36B
:10A040001B00000AD90000EA04E08EE1015085E21D
:10A05000060000EA000055E10390A0E10200009A2A
:10A060000030D0E5300053E31100001A0050A0E1A9
:10A0700068339FE50140A0E303008AE00020D5E5B6
:10A080000130D0E4030052E1EEFFFF0A0020D0E5EA
:10A09000000052E38440A0E1F7FFFF1A013055E5CC
:10A0A000250053E30A300EE20240A0E1A3E0CEE136
:10A0B000B2FFFF1A0030D0E52A0053E31100001A66
:10A0C000000059E30B00000A0130D5E4240053E3FB
:10A0D000B600001A000054E3B40000DA00005CE3AC
:10A0E0000430A0130030A00328104BE2013083E0BD
:10A0F000344003E5020000EA010080E2050050E17F
:10A10000AA00001A0241A0E300005CE30600001A66
:10A110000030D5E52E0053E30480A0E10150850214
:10A1200000C0E00395FFFF0A000000EA80400BE555
:10A13000AC129FE501008AE00020D5E50030D0E5B3
:10A14000030052E1015085020200000A0130F0E5EF
:10A15000000053E3F7FFFF1A01308AE0003063E0AC
:10A16000010053E3040000CA0020D5E50030D0E52B
:10A17000030052E109008002015085020020D5E56C
:10A180000930D0E5000052E303C4A0E18700000AD3
:10A1900050729FE507008AE00030D0E5030052E1ED
:10A1A0001A00001A07308AE0002063E0110052E331
:10A1B000010000DA010B1CE30220421228129FE585
:10A1C00084200BE501308AE0010043E20130F0E534
:10A1D000030052E1FCFFFFCA01308AE0004063E067
:10A1E00008329FE58410A0E103308AE0F32091E17A
:10A1F000FC319FE503308AE0F33091E102208CE1ED
:10A20000032002E007008AE048200BE5020000EA94
:10A210000130F0E5000053E3DEFFFF1A0010D5E542
:10A2200004001EE30F3C0CE20420CEE3032082E195
:10A230000C1086E52030A0033030A01380101BE501
:10A24000143086E50130A0E3020186E9102086E59E
:10A250001C3086E50030D0E5000053E32300001AEF
:10A260000020D5E56D0052E31420A00384200B05E7
:10A270001C3086051D00000A78119FE501309AE721
:10A28000000093E51530A0E384300BE50030D0E505
:10A29000020053E10E00001A58319FE503309AE79F
:10A2A00000C093E550319FE500C06CE00810A0E3CA
:10A2B000040086E248204BE203309AE70FE0A0E179
:10A2C0000CF193E7080050E31C0086E5070000DA74
:10A2D000360000EA01309AE7003093E5010080E2A1
:10A2E0000A3083E2030050E1E7FFFF3A2F0000EA63
:10A2F000000059E31D0000DA0040A0E328804BE293
:10A30000020054E354301BC5342058D5043083C0B8
:10A31000063084D0FF1002D2021043C22420C3D5DD
:10A32000090051E1020000DA090051E30190A0E1C7
:10A330001E0000CA011041E2017186E0280097E585
:10A34000281018E5D3FEFFEB000050E32830181565
:10A35000283087151C3096E5014084E2023083E204
:10A36000030054E1048088E2E4FFFFBA060000EA3B
:10A370001C2096E50130A0E30221A0E1280086E23E
:10A380002630C6E548104BE26EF7FFEB103096E53D
:10A3900084101BE5800013E301508502189086E5C8
:10A3A000201086E5005086050700000A010000EA3B
:10A3B0000000E0E3F0AF1BE9002096E57C304BE2C3
:10A3C000053063E0032182E0002086E51C3096E53D
:10A3D000020083E2F0AF1BE94463FE03FE0F0000BE
:10A3E00020B601FC66B601FC28B601FC3DB601FCB6
:10A3F00046B601FC56B601FC0C000000200000002F
:10A400000DC0A0E1F0DD2DE9E8A09FE504B04CE22D
:10A4100038D04DE27C0050E30040A0E10170A0E1A3
:10A420000260A0E10AA08FE01680A0E30D00008A80
:10A43000C4309FE5000050E303509AE70500000A8E
:10A440000030D5E5000053E301404402000054E32E
:10A45000015085E2F9FFFF1A0030D5E5000053E313
:10A460000080A0130C00001A0010A0E1C12FA0E191
:10A4700000C0A0E327004BE20930E0E300C08DE517
:10A4800065FDFFEB74109FE50E5040E201108AE07D
:10A490000500A0E10E20A0E32AF7FFEB0500A0E1F4
:10A4A00030F7FFEB000057E3014080E20060A003BB
:10A4B000060054E10640A0812280A083000054E3FE
:10A4C0000600000A0420A0E10510A0E10700A0E1B9
:10A4D0001CF7FFEB042087E00030A0E3013042E5E9
:10A4E000000058E318309F1503309A170080831539
:10A4F0000800A0E1F0AD1BE9485EFE032400000067
:10A500007CB601FC0000000070442DE94CA09FE5E2
:10A510000260A0E10150A0E108D04DE20340A0E1BB
:10A520000610A0E10AA08FE00D30A0E10520A0E117
:10A530008C0090EF010A70E324209F8502209A8707
:10A5400000306082003082850000E083000050E32C
:10A55000C01FA01103009D0808D08DE27084BDE8E3
:10A56000485DFE03000000000DC0A0E100DC2DE905
:10A570002CA09FE504B04CE204D04DE2000053E370
:10A5800003C0A0E10AA08FE018309F0503C08A0035
:10A590000230A0E10020E0E300C08DE5020000EB06
:10A5A00000AC1BE9E85CFE039403000010442DE9B5
:10A5B00004D04DE210C09DE5A0A09FE500005CE343
:10A5C00003E0A0E10AA08FE094309F0503C08A0059
:10A5D0000C0050E1000050130140A0E30300001AFA
:10A5E000000050E300E0E0030D00A0E10040A0E324
:10A5F00002005EE102E0A02100005EE30EC0A0E1E7
:10A60000002091E51000000A0030D2E5000053E37D
:10A61000003080E50320A0010B00000A7F0053E317
:10A62000050000DA3C209FE502209AE75430A0E3C1
:10A630000000E0E3003082E5060000EA01C05CE2D1
:10A64000012082E2040180E0EEFFFF1A0D0050E1DC
:10A65000002081150E006CE004D08DE21084BDE86E
:10A66000A85CFE039C0300000000000030402DE9C0
:10A670000140A0E1C45FA0E10230A0E10520A0E11B
:10A680000410A0E13040BDE8FFFFFFEA0DC0A0E1EB
:10A6900070DC2DE9BCA09FE504B04CE208D04DE28F
:10A6A000020053E30350A0E10AA08FE00040A0E1C4
:10A6B0000500009AA0209FE502209AE71630A0E34B
:10A6C0000000E0E3003082E570AC1BE9B030D0E17F
:10A6D000020A13E320304BE2060003E80060E0E3E7
:10A6E0000200000A460000EB000050E31700001AC9
:10A6F000010055E30400001A24104BE20400A0E11D
:10A70000160000EB000050E3100000BA24104BE2EA
:10A710000520A0E10400A0E1A2FCFFEB000050E353
:10A720000A0000BAB030D4E1142094E5033AC3E340
:10A730000010A0E30730C3E3242084E5B030C4E177
:10A74000401084E5202084E51C2084E50160A0E120
:10A750000600A0E170AC1BE9C45BFE030000000032
:10A7600010402DE9B0E0D0E103C00EE200005CE350
:10A770000140A0E10B00000A020B1EE30900000AE1
:10A780000230D0E501005CE303308CE001C043E21D
:10A79000020000CA083090E5000053E30100000AFF
:10A7A0000000E0E31080BDE8020A1EE31C309015B3
:10A7B00014209015033062100CC06310010A1EE3D0
:10A7C000202080120C00121802304310030094E87D
:10A7D00003C08C100C2050E0CC3FC1E0010053E1DD
:10A7E0000C0084E8020000CA0300001A000052E1D5
:10A7F0000100009A00006CE21080BDE80C00A0E1AE
:10A800001080BDE80DC0A0E170DC2DE9A0A09FE59F
:10A81000A0309FE50AA08FE003309AE70050A0E344
:10A82000030050E10040A0E10540A001036CA0E35B
:10A83000016CA003000054E304B04CE21000001AC5
:10A84000004093E5000054E31700000AB020D4E173
:10A85000023C22E2060013E10500000A020A12E3AC
:10A860000300000A0400A0E1E5FFFFEB000050E355
:10A870000050E013104094E5000054E3F2FFFF1A8B
:10A88000090000EAB030D4E1020A13E30600000A2E
:10A890000500A0E10510A0E10420A0E199FBFFEB79
:10A8A000000050E30050A0030050E0130500A0E1B9
:10A8B00070AC1BE9585AFE0328000000000090E528
:10A8C000610000EA000090E56D0000EA000090E5FC
:10A8D000790000EA0DC0A0E110DC2DE958A09FE549
:10A8E00004B04CE20AA08FE00000A0E3C4FFFFEB3D
:10A8F00048309FE503309AE7004093E5000054E3B9
:10A9000010AC1B092C0094E50C3084E2030050E1EC
:10A910000500000A3C3094E5000053E30FE0A0116D
:10A9200003F0A0110030A0E32C3084E5104094E542
:10A93000000054E310AC1B09F1FFFFEA8859FE0345
:10A94000280000000DC0A0E170DC2DE950A09FE5BB
:10A9500050309FE50AA08FE003509AE704B04CE224
:10A960000000A0E3006095E5100000EB38409FE593
:10A97000B4309AE1010060E2003423E0B4308AE1AF
:10A980000100A0E3090000EB04408AE0B834D4E100
:10A99000010060E2003423E0B834C4E1006085E5E2
:10A9A00070AC1BE91859FE03000000006C000000A9
:10A9B0000DC0A0E100D82DE904B04CE23CD04DE23E
:10A9C00048104BE2030000EB000050E30000A0132E
:10A9D0000100A00300A81BE90DC0A0E130D82DE9BB
:10A9E00004B04CE224D04DE20140A0E138204BE21B
:10A9F00050109FE54C0000EB34201BE530104BE27B
:10AA0000021091E828E05BE538301BE50050A0E13A
:10AA1000003084E5042084E5081084E50CC084E55A
:10AA200010E0C4E527104BE2110084E21320A0E3FC
:10AA3000440000EB0010A0E30D20A0E358FAFFEB68
:10AA40000500A0E130A81BE90154000000442DE9F5
:10AA500024A09FE50AA08FE0030090EF010A70E3B5
:10AA60000084BD9814209FE502209AE7003060E240
:10AA70000000E0E3003082E50084BDE81858FE03E2
:10AA80000000000000442DE924A09FE50AA08FE00B
:10AA9000040090EF010A70E30084BD9814209FE544
:10AAA00002209AE7003060E20000E0E3003082E537
:10AAB0000084BDE8E057FE030000000000442DE9DB
:10AAC00024A09FE50AA08FE0060090EF010A70E342
:10AAD0000084BD9814209FE502209AE7003060E2D0
:10AAE0000000E0E3003082E50084BDE8A857FE03E3
:10AAF0000000000000442DE924A09FE50AA08FE09B
:10AB0000360090EF010A70E30084BD9814209FE5A1
:10AB100002209AE7003060E20000E0E3003082E5C6
:10AB20000084BDE87057FE03000000000DC0A0E1E6
:10AB30000E002DE900D82DE910B04CE206009BE98B
:10AB4000EBFFFFEB00A81BE9000052E30EF0A001B1
:10AB50000130D1E4012052E20130C0E40EF0A00146
:10AB6000FAFFFFEA0DC0A0E1F0D92DE904B04CE2F4
:10AB700050C04BE238D04DE234804BE20150A0E1AE
:10AB80000040A0E148704BE20C00A0E158604BE2AD
:10AB90000810A0E10C0086E830008CE87EF4FFEBA2
:10ABA0000600A0E10710A0E17BF4FFEB0800A0E1A4
:10ABB0000D0000EB0030A0E1000053E30700A0E12E
:10ABC0000100000A0100A0E3F0A91BE9060000EB68
:10ABD0000030A0E1000053E30800A0E10710A0E16D
:10ABE000F7FFFF1ABFF4FFEBF0A91BE9000090E5A7
:10ABF000010050E30000A0830100A0930EF0A0E14B
:10AC0000A8610000202020202020202020202020BB
:10AC1000202020200000000012010002020000405D
:10AC200083044057000101020301090243000201AD
:10AC300000C0000904000001020201000524001008
:10AC40000105240100010424020205240600010775
:10AC50000582030800FF09040100020A0000000742
:10AC600005030240000007058102400000040309BB
:10AC70000426037700770077002E004D0069006BF3
:10AC80000072006F004B006F00700074006500726E
:10AC9000002E00640065003C034D0069006B0072EB
:10ACA000006F004B006F00700074006500720020A0
:10ACB000005600690072007400750061006C00208D
:10ACC0000043004F004D00200050006F00720074E0
:10ACD00000200016034D004B002000200020003112
:10ACE000002E003000300030000000002110422013
:10ACF00063308440A550C660E770088129914AA15D
:10AD00006BB18CC1ADD1CEE1EFF1311210027332D3
:10AD10005222B5529442F772D662399318837BB3AC
:10AD20005AA3BDD39CC3FFF3DEE362244334200463
:10AD30000114E664C774A44485546AA54BB52885FC
:10AD40000995EEE5CFF5ACC58DD5533672261116B3
:10AD50003006D776F6669556B4465BB77AA719974C
:10AD60003887DFF7FEE79DD7BCC7C448E55886683B
:10AD7000A7784008611802282338CCC9EDD98EE99C
:10AD8000AFF9488969990AA92BB9F55AD44AB77A13
:10AD9000966A711A500A333A122AFDDBDCCBBFFBEC
:10ADA0009EEB799B588B3BBB1AABA66C877CE44C23
:10ADB000C55C222C033C600C411CAEED8FFDECCD3C
:10ADC000CDDD2AAD0BBD688D499D977EB66ED55EF3
:10ADD000F44E133E322E511E700E9FFFBEEFDDDF8C
:10ADE000FCCF1BBF3AAF599F788F8891A981CAB118
:10ADF000EBA10CD12DC14EF16FE18010A100C2304A
:10AE0000E3200450254046706760B9839893FBA304
:10AE1000DAB33DC31CD37FE35EF3B1029012F32299
:10AE2000D2323542145277625672EAB5CBA5A89554
:10AE300089856EF54FE52CD50DC5E234C324A014E9
:10AE400081046674476424540544DBA7FAB79987E4
:10AE5000B8975FE77EF71DC73CD7D326F236910639
:10AE6000B01657667676154634564CD96DC90EF92C
:10AE70002FE9C899E9898AB9ABA944586548067889
:10AE80002768C018E1088238A3287DCB5CDB3FEB44
:10AE90001EFBF98BD89BBBAB9ABB754A545A376AD9
:10AEA000167AF10AD01AB32A923A2EFD0FED6CDD14
:10AEB0004DCDAABD8BADE89DC98D267C076C645C29
:10AEC000454CA23C832CE01CC10C1FEF3EFF5DCF24
:10AED0007CDF9BAFBABFD98FF89F176E367E554E79
:10AEE000745E932EB23ED10EF01E000000000000F2
:10AEF0001F0000003C0000005B0000007900000023
:10AF000098000000B6000000D5000000F40000002A
:10AF100012010000310100004F0100006E0100002D
:10AF2000000000001F0000003B0000005A0000006D
:10AF30007800000097000000B5000000D400000079
:10AF4000F300000011010000300100004E0100007C
:10AF50006D010000416E676C654E69636B202020B7
:10AF600020202020416E676C65526F6C6C20202081
:10AF7000202020204163634E69636B202020202025
:10AF800020202020416363526F6C6C202020202001
:10AF900020202020202020202020202020202020B1
:10AFA00020202020202020202020202020202020A1
:10AFB0002020202020202020202020202020202091
:10AFC0002020202020202020202020202020202081
:10AFD0002020202020202020202020202020202071
:10AFE0002020202020202020202020202020202061
:10AFF0002020202020202020202020202020202051
:10B0000020202020475053204461746120202020BC
:10B0100020202020535049204572726F722020203A
:10B0200020202020535049204F6B61792020202080
:10B0300020202020493243204572726F7220202048
:10B0400020202020493243204F6B6179202020208E
:10B0500020202020202020202020202020202020F0
:10B06000202020204143435F53706565645F4E207C
:10B07000202020204143435F53706565645F452075
:10B0800020202020202020202020202020202020C0
:10B0900020202020202020202020202020202020B0
:10B0A000202020204E5F53706565642020202020E2
:10B0B00020202020455F53706565642020202020DB
:10B0C00020092000202020202020202020202020B7
:10B0D0002020202020202020202020202020202070
:10B0E000202020204779726F48656164696E67206F
:10B0F00020202020436F6D7061737348656164691F
:10B100006E67202044697374616E6365204E202051
:10B110002020202044697374616E636520452020DF
:10B12000202020204750535F4E69636B2020202051
:10B13000202020204750535F526F6C6C202020202D
:10B1400020202020557365645F5361747320202094
:10B15000202020203C3F786D6C2076657273696FEB
:10B160006E3D22312E302220656E636F64696E67FA
:10B170003D225554462D38223F3E0D0A3C6B6D6CE6
:10B1800020786D6C6E733D22687474703A2F2F6551
:10B19000617274682E676F6F676C652E636F6D2FB9
:10B1A0006B6D6C2F322E32223E0D0A3C446F63755C
:10B1B0006D656E743E0D0A3C6E616D653E4D696B4A
:10B1C000726F6B6F7074657220475053206C6F679D
:10B1D00067696E673C2F6E616D653E0D0A0D0A3C16
:10B1E0005374796C652069643D224D4B5F677073C1
:10B1F0002D7374796C65223E0D0A3C4C696E655363
:10B2000074796C653E0D0A3C636F6C6F723E6666C6
:10B210003030303066663C2F636F6C6F723E0D0AC3
:10B220003C77696474683E323C2F77696474683E89
:10B230000D0A3C2F4C696E655374796C653E0D0A9E
:10B240003C2F5374796C653E0D0A00003C2F446F0F
:10B2500063756D656E743E0D0A3C2F6B6D6C3E0D13
:10B260000A0000003C506C6163656D61726B3E0DBD
:10B270000A3C6E616D653E466C696768743C2F6E72
:10B28000616D653E0D0A3C7374796C6555726C3E58
:10B29000234D4B5F6770732D7374796C653C2F730E
:10B2A00074796C6555726C3E0D0A00003C2F506C31
:10B2B0006163656D61726B3E0D0A00003C4C696E06
:10B2C00065537472696E673E0D0A3C7465737365ED
:10B2D0006C6C6174653E313C2F74657373656C6C86
:10B2E0006174653E0D0A3C616C7469747564654DEA
:10B2F0006F64653E72656C6174697665546F477200
:10B300006F756E643C2F616C7469747564654D6F04
:10B3100064653E0D0A3C636F6F7264696E617465AB
:10B32000733E0D0A000000000D0A3C2F636F6F7220
:10B3300064696E617465733E0D0A3C2F4C696E65DD
:10B34000537472696E673E0D0A0000001F6EA501FE
:10B3500059F3F8C20000000000000000FB21E93FA3
:10B36000182D4454FB21F93F182D4454FB2109406A
:10B37000182D445426A6A13C075C143383F9A2007F
:10B38000444E6E00FC291500D1572700DD34F5002E
:10B3900062DBC0003C999500419043006351FE0080
:10B3A000BBDEAB00B761C5003A6E2400D24D42004F
:10B3B0004906E00009EA2E001C92D100EB1DFE00B8
:10B3C00029B11C00E83EA700F535820044BB2E00E1
:10B3D0009CE98400B4267000417E5F00D69139005C
:10B3E000538339009CF439008B5F840028F9BD0039
:10B3F000F81F3B00DEFF97000F980500112FEF00AC
:10B400000A5A8B006D1F6D00CF7E360009CB2700D6
:10B41000464FB7009E663F002DEA5F00BA277500D1
:10B42000E5EBC7003D7BF100F739070092528A0037
:10B43000FB6BEA001FB15F00085D8D003003560012
:10B440007BFC4600F0AB6B0020BCCF0036F49A00CA
:10B45000E3A91D005E619100081BE6008599650067
:10B46000A0145F008D40680080D8FF0027734D0056
:10B4700006063100CA561500C9A873007BE26000B9
:10B480006B8CC000FB21F93FFB2109407CD91240A5
:10B49000FB2119407A6A1F407CD92240BBFD254020
:10B4A000FB2129403A462C407A6A2F405C473140C4
:10B4B0007CD932409C6B3440BBFD3540DB8F37403C
:10B4C000FB2139401BB43A403A463C405AD83D40F3
:10B4D0007A6A3F404C7E40405C4741406C1042409D
:10B4E0007CD942408CA243409C6B4440AC344540E4
:10B4F000BBFD4540CBC64640DB8F4740EB5848403C
:10B50000FB21494000000000000000000000E03F77
:10B51000000000000000704100000000305FE43FC8
:10B5200083C8C96DFB21F93F0000405461B4D03D90
:10B530003163621A61B4D03D0000601A8A19A33BDE
:10B540007370032E8A19A33B0000002E9A837B3967
:10B55000C14920250000F03F000000001F6EA5013A
:10B5600059F3F8C20000F03F000000005555A53F18
:10B570004C5555556CC156BF7751C116A001FA3EC6
:10B580009015CB194F7E92BEAD529C809EEE213E0F
:10B59000C4B1B4BDE9FAA8BDD43888BE0200000029
:10B5A000030000000400000006000000FB21F93F3A
:10B5B000000000402D44743E000000009846F83C16
:10B5C0000000008051CC783B00000060831BF03904
:10B5D0000000008020257A38000000402282E336F7
:10B5E000000000801DF3693500000000000000002D
:10B5F000000000000000F03F00000000000070416B
:10B60000000000000000703E000000000000E03F6D
:10B61000000000005555C5BF495555551111813FD2
:10B62000A6F81011A0012ABFD561C119E31DC73EBC
:10B630007DFEB157E6E55ABEEB9C2B8A3AD9E53D33
:10B640007CD5CF5A67ACDD3F4FBB6105FB21E93F9D
:10B65000182D44540B73EF3F9BF681D2FB21F93F29
:10B66000182D44547F2B7A3CE2652F2226A6813C7C
:10B67000075C14338807703CBDCBF07A26A6913C5A
:10B68000075C14335555D53F0D5555559999C9BF8C
:10B69000C4EB98992449C23FFF830092C671BCBF96
:10B6A000711623FECD45B73F6E204CC5F2B0B3BF37
:10B6B0006D9A74AF660DB13F513DD0A02DDEADBF88
:10B6C0009AFDDE524B7BA93FEB0D762444B4A2BF1A
:10B6D0002F6C6A2C3AAD903F11DA22E30000F03F64
:10B6E000000000003CE4377E9C7500883CE4377E17
:10B6F0009C75008800005043000000000000903C52
:10B70000000000003CE4377E9C7500881F6EA50198
:10B7100059F3F8C200000000000000000000000023
:10B720000000000000000000000000000000000019
:10B7300000000000000000000001020203030303F8
:10B7400004040404040404040505050505050505B1
:10B750000505050505050505060606060606060691
:10B760000606060606060606060606060606060679
:10B770000606060606060606070707070707070761
:10B780000707070707070707070707070707070749
:10B790000707070707070707070707070707070739
:10B7A0000707070707070707070707070707070729
:10B7B0000707070707070707080808080808080811
:10B7C00008080808080808080808080808080808F9
:10B7D00008080808080808080808080808080808E9
:10B7E00008080808080808080808080808080808D9
:10B7F00008080808080808080808080808080808C9
:10B8000008080808080808080808080808080808B8
:10B8100008080808080808080808080808080808A8
:10B820000808080808080808080808080808080898
:10B830000808080808080808101010080A0A0A0072
:10B840002B002D002000307800305800496E7661C2
:10B850006C6964206D756C74696279746520666FBB
:10B86000726D617420737472696E672E000000003F
:10B8700008000500030004000100000200000004AD
:10B88000000802000700070800010101040201018D
:10B8900001010101202B302D232749006E707858BB
:10B8A0006F756469664665456747614143536373D5
:10B8B000000001070F101112131500100500000001
:10B8C00007000200040001000300001F0500000F34
:10B8D00007080200040001000300686C4C6A7A74D7
:10B8E000715A000204080800000800000108000066
:10B8F000556E6B6E6F776E206572726F72200000EE
:10B9000053756363657373004F7065726174696F1B
:10B910006E206E6F74207065726D6974746564005A
:10B920004E6F20737563682066696C65206F7220A6
:10B930006469726563746F7279004E6F207375630A
:10B94000682070726F6365737300496E74657272FC
:10B9500075707465642073797374656D2063616CB0
:10B960006C00496E7075742F6F75747075742065F6
:10B9700072726F72004E6F20737563682064657613
:10B98000696365206F72206164647265737300413E
:10B990007267756D656E74206C69737420746F6F57
:10B9A000206C6F6E67004578656320666F726D610D
:10B9B00074206572726F72004261642066696C6502
:10B9C0002064657363726970746F72004E6F2063D8
:10B9D00068696C642070726F63657373657300527D
:10B9E00065736F757263652074656D706F726172D7
:10B9F000696C7920756E617661696C61626C650055
:10BA000043616E6E6F7420616C6C6F63617465204E
:10BA10006D656D6F7279005065726D697373696FD2
:10BA20006E2064656E6965640042616420616464CF
:10BA30007265737300426C6F636B20646576696333
:10BA40006520726571756972656400446576696325
:10BA500065206F72207265736F7572636520627501
:10BA600073790046696C6520657869737473004961
:10BA70006E76616C69642063726F73732D64657692
:10BA8000696365206C696E6B004E6F207375636827
:10BA900020646576696365004E6F74206120646977
:10BAA000726563746F7279004973206120646972F2
:10BAB0006563746F727900496E76616C69642061A8
:10BAC0007267756D656E7400546F6F206D616E796D
:10BAD000206F70656E2066696C657320696E2073D7
:10BAE000797374656D00546F6F206D616E79206F8E
:10BAF00070656E2066696C657300496E6170707266
:10BB00006F70726961746520696F63746C20666F11
:10BB1000722064657669636500546578742066698F
:10BB20006C6520627573790046696C6520746F6F6F
:10BB3000206C61726765004E6F20737061636520D1
:10BB40006C656674206F6E20646576696365004974
:10BB50006C6C6567616C207365656B005265616430
:10BB60002D6F6E6C792066696C65207379737465CE
:10BB70006D00546F6F206D616E79206C696E6B7310
:10BB80000042726F6B656E2070697065004E756D56
:10BB900065726963616C20617267756D656E742092
:10BBA0006F7574206F6620646F6D61696E004E75ED
:10BBB0006D65726963616C20726573756C74206F5A
:10BBC0007574206F662072616E6765005265736FD1
:10BBD0007572636520646561646C6F636B20617668
:10BBE0006F696465640046696C65206E616D6520EF
:10BBF000746F6F206C6F6E67004E6F206C6F636B9D
:10BC00007320617661696C61626C650046756E6374
:10BC100074696F6E206E6F7420696D706C656D65F0
:10BC20006E746564004469726563746F7279206E26
:10BC30006F7420656D70747900546F6F206D616E44
:10BC400079206C6576656C73206F662073796D6200
:10BC50006F6C6963206C696E6B7300004E6F206DB2
:10BC6000657373616765206F6620646573697265CB
:10BC7000642074797065004964656E7469666965ED
:10BC8000722072656D6F766564004368616E6E65E3
:10BC90006C206E756D626572206F7574206F662002
:10BCA00072616E6765004C6576656C2032206E6F40
:10BCB000742073796E6368726F6E697A6564004C84
:10BCC0006576656C20332068616C746564004C6532
:10BCD00076656C2033207265736574004C696E6BF9
:10BCE000206E756D626572206F7574206F662072AC
:10BCF000616E67650050726F746F636F6C20647261
:10BD000069766572206E6F74206174746163686512
:10BD100064004E6F204353492073747275637475C9
:10BD2000726520617661696C61626C65004C657654
:10BD3000656C20322068616C74656400496E7661C0
:10BD40006C69642065786368616E676500496E762A
:10BD5000616C6964207265717565737420646573C4
:10BD600063726970746F720045786368616E6765AD
:10BD70002066756C6C004E6F20616E6F64650049C3
:10BD80006E76616C69642072657175657374206389
:10BD90006F646500496E76616C696420736C6F74C2
:10BDA000000042616420666F6E742066696C6520D5
:10BDB000666F726D617400446576696365206E6FAD
:10BDC0007420612073747265616D004E6F20646130
:10BDD000746120617661696C61626C650054696DA3
:10BDE00065722065787069726564004F7574206FA4
:10BDF000662073747265616D73207265736F7572FE
:10BE0000636573004D616368696E65206973206EB8
:10BE10006F74206F6E20746865206E6574776F7222
:10BE20006B005061636B616765206E6F7420696E93
:10BE30007374616C6C6564004F626A656374206939
:10BE4000732072656D6F7465004C696E6B2068615C
:10BE500073206265656E2073657665726564004166
:10BE60006476657274697365206572726F720053CF
:10BE7000726D6F756E74206572726F7200436F6DB4
:10BE80006D756E69636174696F6E206572726F7231
:10BE9000206F6E2073656E640050726F746F636FF5
:10BEA0006C206572726F72004D756C7469686F708A
:10BEB00020617474656D707465640052465320731C
:10BEC00070656369666963206572726F72004261B2
:10BED00064206D6573736167650056616C756520DC
:10BEE000746F6F206C6172676520666F7220646585
:10BEF00066696E65642064617461207479706500A0
:10BF00004E616D65206E6F7420756E697175652068
:10BF10006F6E206E6574776F726B0046696C65207A
:10BF200064657363726970746F7220696E206261F8
:10BF3000642073746174650052656D6F746520616F
:10BF4000646472657373206368616E67656400433F
:10BF5000616E206E6F74206163636573732061206E
:10BF60006E656564656420736861726564206C69E0
:10BF7000627261727900416363657373696E6720F1
:10BF80006120636F7272757074656420736861728A
:10BF90006564206C696272617279002E6C6962203E
:10BFA00073656374696F6E20696E20612E6F75749E
:10BFB00020636F7272757074656400417474656D8E
:10BFC0007074696E6720746F206C696E6B20696E87
:10BFD00020746F6F206D616E792073686172656483
:10BFE000206C69627261726965730043616E6E6F85
:10BFF00074206578656320612073686172656420D0
:10C000006C696272617279206469726563746C79BB
:10C0100000496E76616C6964206F7220696E636F8F
:10C020006D706C657465206D756C7469627974658A
:10C03000206F722077696465206368617261637440
:10C04000657200496E7465727275707465642073F0
:10C05000797374656D2063616C6C2073686F756CA7
:10C060006420626520726573746172746564005344
:10C07000747265616D732070697065206572726F8E
:10C080007200546F6F206D616E79207573657273E5
:10C0900000536F636B6574206F7065726174696FB4
:10C0A0006E206F6E206E6F6E2D736F636B65740004
:10C0B00044657374696E6174696F6E206164647243
:10C0C000657373207265717569726564004D65737F
:10C0D0007361676520746F6F206C6F6E67005072BC
:10C0E0006F746F636F6C2077726F6E6720747970F6
:10C0F0006520666F7220736F636B65740050726F9A
:10C10000746F636F6C206E6F7420617661696C610F
:10C11000626C650050726F746F636F6C206E6F7429
:10C1200020737570706F7274656400536F636B6514
:10C13000742074797065206E6F7420737570706FE1
:10C1400072746564004F7065726174696F6E206E01
:10C150006F7420737570706F727465640050726FC5
:10C16000746F636F6C2066616D696C79206E6F749B
:10C1700020737570706F72746564004164647265D9
:10C1800073732066616D696C79206E6F74207375AE
:10C1900070706F727465642062792070726F746F52
:10C1A000636F6C004164647265737320616C7265C7
:10C1B00061647920696E207573650043616E6E6FEE
:10C1C000742061737369676E20726571756573742D
:10C1D00065642061646472657373004E6574776F83
:10C1E000726B20697320646F776E004E6574776F91
:10C1F000726B20697320756E726561636861626C31
:10C2000065004E6574776F726B2064726F70706535
:10C210006420636F6E6E656374696F6E206F6E204D
:10C22000726573657400536F66747761726520631D
:10C23000617573656420636F6E6E656374696F6E9C
:10C240002061626F727400436F6E6E656374696F14
:10C250006E20726573657420627920706565720066
:10C260004E6F20627566666572207370616365202B
:10C27000617661696C61626C65005472616E7370A5
:10C280006F727420656E64706F696E7420697320BC
:10C29000616C726561647920636F6E6E656374654D
:10C2A00064005472616E73706F727420656E647096
:10C2B0006F696E74206973206E6F7420636F6E6E89
:10C2C00065637465640043616E6E6F742073656EA0
:10C2D00064206166746572207472616E73706F722F
:10C2E0007420656E64706F696E7420736875746411
:10C2F0006F776E00546F6F206D616E792072656686
:10C300006572656E6365733A2063616E6E6F74204B
:10C3100073706C69636500436F6E6E656374696FFB
:10C320006E2074696D6564206F757400436F6E6E66
:10C33000656374696F6E2072656675736564004825
:10C340006F737420697320646F776E004E6F207274
:10C350006F75746520746F20686F7374004F70651B
:10C36000726174696F6E20616C72656164792069B5
:10C370006E2070726F6772657373004F70657261C3
:10C3800074696F6E206E6F7720696E2070726F67B0
:10C3900072657373005374616C65204E465320665A
:10C3A000696C652068616E646C65005374727563B6
:10C3B00074757265206E6565647320636C65616E6B
:10C3C000696E67004E6F7420612058454E495820B1
:10C3D0006E616D656420747970652066696C6500B6
:10C3E0004E6F2058454E49582073656D6170686FD7
:10C3F00072657320617661696C61626C6500497376
:10C400002061206E616D65642074797065206669B5
:10C410006C650052656D6F746520492F4F20657201
:10C42000726F72004469736B2071756F746120655F
:10C4300078636565646564004E6F206D6564697539
:10C440006D20666F756E640057726F6E67206D6544
:0CC450006469756D20747970650000004F
:10C45C000A0D204E6176694374726C205625642E49
:10C46C0025642563000000004C4F472F25303469AC
:10C47C0025303269253032692F47505325303569C4
:10C48C002E4B4D4C000000006E6F20464320636F16
:10C49C006D6D756E69636174696F6E2000000000CC
:10C4AC006E6F204D4B334D616720636F6D6D756EF4
:10C4BC0069636174696F6E20000000004643206E52
:10C4CC006F7420636F6D70617469626C652000001D
:10C4DC004D4B334D6167206E6F7420636F6D7061CF
:10C4EC007469626C652000006E6F204750532063A6
:10C4FC006F6D6D756E69636174696F6E20000000FD
:10C50C0062616420636F6D706173732076616C750A
:10C51C00652000005243205369676E616C206C6F7C
:10C52C00737420004E6F204572726F722020202091
:10C53C002020202020202020202020000D0A2D2D1E
:10C54C002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D0F
:10C55C002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2DFF
:10C56C002D2D2D2D2D2D2D2D2D2D2D000A0D205643
:10C57C00657273696F6E20696E666F726D61746936
:10C58C006F6E3A000A0D20466C696768742D43740F
:10C59C00726C206E6F7420636F6D70617469626C65
:10C5AC00650000000A0D204D4B334D6167206E6F06
:10C5BC007420636F6D70617469626C6500000000BB
:10C5CC000D0A2D2D2D2D2D2D2D2D2D2D2D2D2D2DD2
:10C5DC002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D7F
:10C5EC002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D0D8F
:10C5FC000A0D0A000A0D436F6D6D756E69636174E7
:10C60C00696F6E2D4572726F723A204D4B334D61CE
:10C61C00670A0D000D0A4F70656E696E67206B6DB1
:10C62C006C2D66696C653A20000000000D0A45729D
:10C63C00726F72206F70656E696E67206B6D6C2DFA
:10C64C0066696C653A2000000D0A4572726F7220A3
:10C65C004C6F6767696E6720475053206461746143
:10C66C000D0A00000D0A436C6F73696E67206B6DC9
:10C67C006C2D66696C650D0A000000000D0A4162A4
:10C68C006F72742048616E646C6572000D0A556E91
:10C69C00646566696E65642048616E646C657200E1
:10C6AC000D0A50726566657463682048616E646C2F
:10C6BC00657200005B25695D000000002B2B2020BB
:10C6CC004E6176692D4374726C20202B2B00000078
:10C6DC00205625642E2564256320000020457272A7
:10C6EC003A25640025730000286329204275737372
:10C6FC002C204275736B6572000000004E6F204752
:10C70C0050532064617461004C6F6E3A20202020DD
:10C71C00202020202020202020202020000000008D
:10C72C004C61743A20202020202020202020202022
:10C73C002020202000000000416C743A2020202092
:10C74C00202020202020202020202020000000005D
:10C75C00536174733A25303264204669783A4E6FCF
:10C76C006E650000536174733A253032642046695B
:10C77C00783A324420200000536174733A253032E9
:10C78C0064204669783A3344202000005361747366
:10C79C003A25303264204669783A3F3F2020000029
:10C7AC004C6F6E3A252B336C642E2530376C64201D
:10C7BC00646567004C61743A252B336C642E25300C
:10C7CC00376C642064656700416C743A25346C6482
:10C7DC002E2530336C64206D0000000053706565AD
:10C7EC0064204E3A202020202020202020202020B1
:10C7FC0000000000537065656420453A202020201D
:10C80C00202020202020202000000000537065658F
:10C81C006420543A2020202020202020202020207A
:10C82C00000000005370656564204E3A20252B34BF
:10C83C006C6420636D2F7300537065656420453AFA
:10C84C0020252B346C6420636D2F73005370656549
:10C85C006420543A20252B346C6420636D2F7300B4
:10C86C00475053205554432054696D650000000017
:10C87C0020202020202020202020202020202020AC
:10C88C00202020200000000020204E6F2074696DB5
:10C89C0065206461746121202020202000000000AC
:10C8AC00446174653A20253032692F253032692F66
:10C8BC00253034690000000054696D653A2025303C
:10C8CC0032693A253032693A253032692E253033B7
:10C8DC00690000004E6176694D6F64653A2025331E
:10C8EC00690000004720203A253369205020203A67
:10C8FC0025336920000000004920203A25336920A7
:10C90C004420203A25336920000000004143433A7B
:10C91C00253369205341543A253369200000000027
:10C92C00486F6D6520506F736974696F6E000000FD
:10C93C0020202020202020202020202020202020EB
:10C94C002020202020000000202020204973206E71
:10C95C006F74207365742E2020202020200000008E
:10C96C004C6F6E3A2025336C642E2530376C642066
:10C97C00646567004C61743A2025336C642E253055
:10C98C00376C64206465670052432D537469636B84
:10C99C00730000004E693A2534692020526F3A2505
:10C9AC003469200047733A253469202059613A25AF
:10C9BC003469200052432D506F74697300000000DD
:10C9CC00506F313A2533692020506F323A25336944
:10C9DC0020000000506F333A2533692020506F340B
:10C9EC003A25336920000000496E744E69636B3A36
:10C9FC002020253569000000496E74526F6C6C3A2A
:10CA0C0020202535690000004163634E69636B3A51
:10CA1C002020253569000000416363526F6C6C3A2D
:10CA2C0020202535690000004779726F4E69636BD1
:10CA3C003A202025346900004779726F526F6C6C74
:10CA4C003A202025346900004779726F5961773A92
:10CA5C00202020253469000052432D4C6576656CEE
:10CA6C003A202020202533690000000055626174B3
:10CA7C003A202020202020202025336900000000AF
:10CA8C00436F6D7048656164696E673A2025336940
:10CA9C00000000004779726F48656164696E673AFF
:10CAAC0020253369000000005550313A25336920A8
:10CABC00205550323A253369200000005550333A46
:10CACC0025336920205550343A2533692000000065
:10CADC005550353A25336920205550363A2533695F
:10CAEC00200000005550373A253369202055503826
:10CAFC003A253369200000004D4B334D41472056F9
:10CB0C0025692E25692563004D6167583A20253427
:10CB1C00692000004D6167593A20253469200000D6
:10CB2C004D61675A3A2025346920000054696D65BF
:10CB3C007220696E69742E2E2E0000006F6B0A0D28
:10CB4C00000000000D0A2053504920696E69742EB4
:10CB5C002E2E00006F6B00000A0D204E6F207665A4
:10CB6C007273696F6E20696E666F726D6174696F36
:10CB7C006E2066726F6D20466C69676874437472C0
:10CB8C006C2E00000A0D20466C6967687443747241
:10CB9C006C205625642E25642563000020436F6DA0
:10CBAC0070617469626C653A202564000D0A204935
:10CBBC00324320696E69742E2E2E00000D0A204916
:10CBCC003243206465696E69742E2E2E00000000BD
:10CBDC000A0D4E6F2076657273696F6E20696E66F2
:10CBEC006F726D6174696F6E2066726F6D204D4B44
:10CBFC00334D61672E0000000A0D204D4B334D6103
:10CC0C0067205625642E2564256300000D0A2055E7
:10CC1C00534220696E69742E2E2E00000D0A204698
:10CC2C004154313620696E69742E2E2E000000009E
:10CC3C0053442D4361726420636F756C64206E6F76
:10CC4C007420626520696E697469616C697A6564C7
:10CC5C002E0000004572726F722072656164696EFD
:10CC6C006720746865204D42522E00004572726F29
:10CC7C00722072656164696E672074686520564223
:10CC8C00522E00005642523A20536563746F722044
:10CC9C0073697A65206E6F7420737570706F72741F
:10CCAC0065642E005642523A20426164206E756DC6
:10CCBC00626572206F6620736563746F72732E00E9
:10CCCC005642523A20506172746974696F6E2069D1
:10CCDC007374206E6F742046415431362074797011
:10CCEC00652E00004572726F72202530325820720A
:10CCFC00656164696E6720646174612066726F6D32
:10CD0C002073642063617264202852313D253032D7
:10CD1C0058292E0D0A0000000D0A204D616E756613
:10CD2C00616374757265722049443A2025690D0A55
:10CD3C0000000000204170706C69636174696F6E53
:10CD4C002049443A2025730D0A0000002050726FD0
:10CD5C0064756374204E616D653A2025730D0A006D
:10CD6C002050726F64756374205265762E3A2025BC
:10CD7C00692E25690D0A00002053657269616C20CB
:10CD8C004E6F2E3A20000000253032580000000073
:10CD9C00204D616E756661632E20446174653A2086
:10CDAC0025692F25690D0A0D0A0000000D0A205374
:10CDBC00534320696E69742E2E2E00000D0A2053E9
:10CDCC00444320696E69742E2E2E0000426164204B
:10CDDC00636D64382052313D253032582E000000EE
:10CDEC0042616420636D6438205237206368656348
:10CDFC006B207061747465726E2E0D0A0000000059
:10CE0C004361726420697320696E636F6D70617425
:10CE1C0069626C6520746F20332E33562E0D0A0018
:10CE2C0042616420636D64353820523120253032E4
:10CE3C00782E00004E6F7420616E2053442D4341B8
:10CE4C0052442E004361726420697320696E636FD3
:10CE5C006D70617469626C6520746F20332E33566B
:10CE6C002E000000496E6974206572726F722E007C
:10CE7C004572726F722073657474696E6720626C90
:10CE8C006F636B206C656E67746820746F2035312E
:10CE9C00322E00004572726F722072656164696E89
:10CEAC0067204349442E0D0A000000004572726F42
:10CEBC00722072656164696E67204353442E0000D2
:10CECC006F6B0D0A00000000202053442D4341528B
:10CEDC00442056312E780000726573657420746995
:10CEEC006D656F75740000004261642041636D6470
:10CEFC0034312052313D253032582E00496E697440
:10CF0C002074696D656F75742E00000020205344E9
:10CF1C002D434152442056322E30206F72206C61CA
:10CF2C00746572000D0A2020436170616369747925
:10CF3C00203D202569204D42000000004E6F20430B
:10CF4C0061726420696E20536C6F742E00000000B7
:10CF5C000D0A20534443206465696E69742E2E2E8D
:10CF6C00000000004572726F722025303258207715
:10CF7C00726974696E67206461746120746F2073C8
:10CF8C006420636172642028523D25303258292E6A
:10CF9C000D0A00002573203D2025640A0D000000B9
:10CFAC000A0D52656164696E672073657474696EED
:10CFBC00672066696C652E2E2E0A0D0073657474DD
:10CFCC00696E67312E747874000000004552524F20
:10CFDC00523A2046696C65206E6F7420666F756ED0
:10CFEC006420210A0D0000003D0000005553422032
:10CFFC0028256C64293A2025730A0D000D0A20554A
:10D00C004152543020696E69742E2E2E000000009F
:10D01C000D0A554152543120696E69742E2E2E6FB3
:10D02C006B0000000D0A20554152543220696E6984
:10D03C00742E2E2E000000000D0A20554152543241
:10D04C00206465696E69742E2E2E00000D0A256C05
:10D05C00642E2530376C642C0000000020256C6495
:10D06C002E2530376C642C0020256C642E25303333
:10D07C006C64000064656661756C742E6B6D6C007D
:10D08C004D494B524F4B4F50544552000D0A2047BF
:10D09C00505320696E69742E2E2E0000286E696C18
:10D0AC0029000000286E756C6C290000000000003F
:10D0BC0025302A6400000000252E2A730000000091
:10D0CC00696E6600494E46006E616E004E414E0020
:10D0DC00252A7300252E2A64000000002563252BC9
:04D0EC002E3264007C
:10D0F00048656C6C6F20576F726C64000000000014
:10D10000000000000000000000000000000000001F
:10D11000000000000000000000000000000000000F
:10D1200000000000000000000000000000000000FF
:10D1300000000000000000000000000000000000EF
:10D140000C00000020000000500000004000000023
:10D150006764656766000000050000005061726149
:10D160006D657465723120202020202031323334E7
:10D17000353637383930313233343536373839305F
:10D180003132333435363738393031320100DEC888
:10D19000E6506172616D6574657232202020202036
:10D1A0002031323334353637383930313233343553
:10D1B0003637383930313233343536373839303123
:10D1C0003201000000DC506172616D65746572327D
:10D1D0003220202020203132333435363738393070
:10D1E00031323334353637383930313233343536FD
:10D1F00037383930313201000000DC00BC720000E9
:10D20000F4250100F4250100F4250100F4250100B6
:10D21000F4250100F4250100F4250100F4250100A6
:10D22000F4250100F4250100F4250100F425010096
:10D23000F4250100F4250100F4250100F425010086
:10D2400040720000F4250100F4250100F4250100DE
:10D25000F4250100F4250100F4250100F425010066
:10D26000F4250100F4250100F4250100F425010056
:10D27000F425010000E100000000080004010000A6
:10D280006C7400003C750000687600008476000035
:10D290008876000038770000F87700007877000083
:10D2A0009C770000C07700000000000040000000F4
:10D2B000F4250100F4250100F4250100F425010006
:10D2C000F4250100F4250100F4250100F4250100F6
:10D2D000F425010018AC0100120000002AAC010086
:10D2E000430000006DAC01000400000071AC0100BF
:10D2F0002600000097AC01003C000000D3AC010008
:10D300001600000000000000000000000100000006
:10D3100000E100E1FF0000000050005C016400003B
:10D32000E8030000E8030000FFFFFFFF0DC0A0E1DD
:10D3300000D82DE904B04CE21523A0E30010A0E3CF
:10D34000041082E50630A0E3003082E50C1082E58F
:10D350000830A0E3183082E50FE0A0E101F0A0E181
:04D3600000A81BE91D
:10D36400F4050004A8D00100B0D00100CC020004F0
:10D37400E0180004E0D00100E8D00100B8D00100BA
:0CD38400A018000400B90100DC02000445
:0CD3900000000000000000000000000091
:10D39C00BCD00100C4D0010000CC0100CCD00100F5
:10D3AC00D0D00100D4D00100D8D00100DCD00100D5
:10D3BC00FC050004E00200042803000470030004D0
:04D3CC00E002000477
:10D3D000200100000000000000000000000000002C
:10D3E00028030004180600041807000418060004A7
:10D3F000180600041806000418060004EC020004D5
:10D40000BCA80100C4A8010000000000CCA80100D5
:10D4100000000000000000001001000000000000FB
:10D420000000000001000000700300041807000461
:10D43000180800041807000418070004180700045F
:10D440001807000434030004BCA80100C4A80100AC
:10D4500000000000CCA80100000000000000000057
:10D4600010020000000000000000000002000000A8
:10D4700000000000000000000000000000000000AC
:10D480000000000000000000000000007C03000419
:10D49000BCA80100C4A8010000000000CCA8010045
:08D4A000000000000000000084
:00000001FF
/trunk/Hex-Files
Property changes:
Added: tsvn:logminsize
+10
\ No newline at end of property
/trunk/Navi-Ctrl.Uv2
11,7 → 11,6
Group (USB-Lib)
 
File 1,1,<.\main.c><main.c>
File 1,1,<.\uart.c><uart.c>
File 1,1,<.\interrupt.c><interrupt.c>
File 1,1,<.\ramfunc.c><ramfunc.c>
File 1,1,<.\menu.c><menu.c>
19,12 → 18,10
File 1,1,<.\timer.c><timer.c>
File 1,1,<.\spi_slave.c><spi_slave.c>
File 1,1,<.\i2c.c><i2c.c>
File 1,1,<.\GPS.c><GPS.c>
File 1,1,<.\GPSUart.c><GPSUart.c>
File 1,1,<.\usb.c><usb.c>
File 1,1,<.\fat16.c><fat16.c>
File 1,1,<.\sdc.c><sdc.c>
File 1,1,<.\settings.c><settings.c>
File 1,1,<.\sdc.c><sdc.c>
File 1,1,<.\ssc.c><ssc.c>
File 1,1,<.\usb_desc.c><usb_desc.c>
File 1,1,<.\usb_endp.c><usb_endp.c>
31,16 → 28,21
File 1,1,<.\usb_istr.c><usb_istr.c>
File 1,1,<.\usb_prop.c><usb_prop.c>
File 1,1,<.\usb_pwr.c><usb_pwr.c>
File 1,1,<.\led.c><led.c>
File 1,1,<.\crc16.c><crc16.c>
File 1,1,<.\ubx.c><ubx.c>
File 1,1,<.\uart0.c><uart0.c>
File 1,1,<.\uart1.c><uart1.c>
File 1,1,<.\uart2.c><uart2.c>
File 1,1,<.\kml.c><kml.c>
File 2,5,<.\kml.h><kml.h>
File 2,5,<.\crc16.h><crc16.h>
File 1,1,<.\fifo.c><fifo.c>
File 1,1,<.\waypoints.c><waypoints.c>
File 1,1,<.\GPS.c><GPS.c>
File 2,5,<.\ramfunc.h><ramfunc.h>
File 2,5,<.\main.h><main.h>
File 2,5,<.\uart.h><uart.h>
File 2,5,<.\menu.h><menu.h>
File 2,5,<.\printf_P.h><printf_P.h>
File 2,5,<.\91x_conf.h><91x_conf.h>
File 2,5,<.\settings.h><settings.h>
File 2,5,<.\timer.h><timer.h>
File 2,5,<.\usb.h><usb.h>
File 2,5,<.\spi_slave.h><spi_slave.h>
49,9 → 51,17
File 2,5,<.\ssc.h><ssc.h>
File 2,5,<.\fat16.h><fat16.h>
File 2,5,<.\GPS.h><GPS.h>
File 2,5,<.\GPSUart.h><GPSUart.h>
File 2,5,<.\settings.h><settings.h>
File 2,5,<.\libstr91x\include\91x_lib.h><91x_lib.h>
File 2,5,<.\led.h><led.h>
File 2,5,<.\crc16.h><crc16.h>
File 2,5,<.\ubx.h><ubx.h>
File 2,5,<.\uart0.h><uart0.h>
File 2,5,<.\uart1.h><uart1.h>
File 2,5,<.\uart2.h><uart2.h>
File 2,5,<.\kml_header.h><kml_header.h>
File 2,5,<.\kml.h><kml.h>
File 2,5,<.\fifo.h><fifo.h>
File 2,5,<.\waypoints.h><waypoints.h>
File 3,2,<.\startup912.s><startup912.s>
File 4,1,<.\libstr91x\src\91x_scu.c><91x_scu.c>
File 4,1,<.\libstr91x\src\91x_gpio.c><91x_gpio.c>
64,8 → 74,8
File 4,1,<.\libstr91x\src\91x_wiu.c><91x_wiu.c>
File 6,1,<.\usblibrary\src\usb_regs.c><usb_regs.c>
File 6,1,<.\usblibrary\src\usb_core.c><usb_core.c>
File 6,1,<.\usblibrary\src\usb_int.c><usb_int.c>
File 6,1,<.\usblibrary\src\usb_init.c><usb_init.c>
File 6,1,<.\usblibrary\src\usb_int.c><usb_int.c>
File 6,1,<.\usblibrary\src\usb_mem.c><usb_mem.c>
File 6,5,<.\usbinc\usb_pwr.h><usb_pwr.h>
File 6,5,<.\usbinc\hw_config.h><hw_config.h>
75,13 → 85,13
 
 
Options 1,0,0 // Target 'Navi-Ctrl'
Device (STR910FM32)
Device (STR911FM44)
Vendor (STMicroelectronics)
Cpu (IRAM(0x04000000-0x0400FFFF) IROM(0x0-0x3FFFF) IROM2(0x400000-0x407FFF) CLOCK(25000000) CPUTYPE(ARM9E))
Cpu (IRAM(0x04000000-0x04017FFF) IROM(0x0-0x7FFFF) IROM2(0x400000-0x407FFF) CLOCK(25000000) CPUTYPE(ARM9E))
FlashUt ()
StupF ("STARTUP\ST\STR91x.s" ("STR91x Startup Code"))
FlashDR (UL2ARM(-UU0639C7E -O15 -S0 -C1 -N00("ST uPSD Flash") -D00(04570041) -L00(8) -N01("ARM966E-S Core") -D01(25966041) -L01(4) -N02("ST Boundary Scan") -D02(0457F041) -L02(5) -FO15 -FD4000000 -FC800 -FN2 -FF0STR91xFxx2 -FS00 -FL040000 -FF1STR91xB1 -FS1400000 -FL18000))
DevID (4118)
FlashDR (UL2ARM(-UU0639C7E -O15 -S0 -C1 -N00("ST uPSD Flash") -D00(04570041) -L00(8) -N01("ARM966E-S Core") -D01(25966041) -L01(4) -N02("ST Boundary Scan") -D02(0457F041) -L02(5) -FO15 -FD4000000 -FC800 -FN2 -FF0STR91xFxx4 -FS00 -FL080000 -FF1STR91xB1 -FS1400000 -FL18000))
DevID (4069)
Rgf (91x_lib.H)
Mem ()
C ()
121,8 → 131,8
GCPUTYP (ARM9E)
TFlagsA { 0,12,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
OCMARM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
OCMARAM { 0,0,0,0,4,0,0,1,0 }
OCMAROM { 1,0,0,0,0,0,0,4,0 }
OCMARAM { 0,0,0,0,4,0,128,1,0 }
OCMAROM { 1,0,0,0,0,0,0,8,0 }
OCMXRAM { 0,0,0,0,0,0,0,0,0 }
OCMIRAM2 { 0,0,0,48,0,0,16,0,0 }
OCMIROM2 { 1,0,0,64,0,0,128,0,0 }
153,33 → 163,11
ALDICDR ()
ALDMISC ()
ALDSCAT (.\scripts\flash_str9.ld)
OPTDL (SARM.DLL)(-cSTR91x)(DARMST9.DLL)(-pSTR910)(SARM.DLL)(-cSTR91x)(TARMST9.DLL)(-pSTR910)
OPTDL (SARM.DLL)(-cSTR91x)(DARMST9.DLL)(-pSTR911)(SARM.DLL)(-cSTR91x)(TARMST9.DLL)(-pSTR911)
OPTDBG 48126,0,()()()()()()()()()() (BIN\UL2ARM.DLL)()()()
FLASH1 { 9,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
FLASH1 { 9,0,0,0,1,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0 }
FLASH2 (BIN\UL2ARM.DLL)
FLASH3 ()
FLASH3 ("" ())
FLASH4 ()
EndOpt
 
Options 1,1,0 // Group 'Source Code'
PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
IncBld=2
AlwaysBuild=2
GenAsm=2
AsmAsm=2
PublicsOnly=2
StopCode=11
CustArgs ()
LibMods ()
ACCFLG { 170,2,16,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
ACMISC ()
ACDEFN ()
ACUDEF ()
ACINCD ()
AASFLG { 10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
AAMISC ()
AADEFN ()
AAUDEF ()
AAINCD ()
EndOpt
 
/trunk/Obj/Navi-Ctrl_STR9.hex
0,0 → 1,7120
:1000000018F09FE518F09FE518F09FE518F09FE5C0
:1000100018F09FE50000A0E118F09FE518F09FE5BB
:1000200050010000400000004400000048000000B3
:100030004C000000000000005000000054000000D0
:10004000230000EA1A0000EA280000EA2F0000EA74
:10005000000000EA350000EA04E04EE2FF5F2DE90F
:1000600000104FE102002DE92C029FE5000090E511
:1000700028129FE5001091E50000A0E10000A0E13A
:100080001FF021E300402DE914E29FE500F0A0E11C
:100090000040BDE8D2F021E3FC019FE5000080E5CF
:1000A000F8119FE5001081E50200BDE801F06FE165
:1000B000FF9FFDE8FF5F2DE900104FE102002DE9F1
:1000C0000D10A0E1830200EB0200BDE801F06FE13A
:1000D000FF9FFDE8FF5F2DE900104FE102002DE9D1
:1000E000850200EB0200BDE801F06FE1FF9FFDE833
:1000F00004E04EE2FF5F2DE900104FE102002DE920
:10010000860200EB0200BDE801F06FE1FF9FFDE811
:1001100008E04EE2FF5F2DE900104FE102002DE9FB
:100120006D0200EB0200BDE801F06FE1FF9FFDE80A
:1001300004E04EE2FF402DE900104FE102002DE9FE
:10014000750200EB0200BDE801F06FE1FF80FDE801
:1001500050119FE50020A0E3011041E2020051E1AF
:10016000FCFFFF8A40019FE540119FE5341080E5C8
:1001700034019FE538119FE5001080E50000A0E103
:100180000000A0E10000A0E10000A0E10000A0E16B
:100190000000A0E10000A0E10000A0E10000A0E15B
:1001A0000000A0E10000A0E10000A0E10000A0E14B
:1001B0000000A0E10000A0E10000A0E10267A0E3D0
:1001C0006070A0E3B070C6E1E8609FE50370A0E353
:1001D000B070C6E1E0109FE5041080E5081090E5DE
:1001E000011011E2FCFFFF0AD0109FE5001080E52E
:1001F000CC109FE51C1080E5C8109FE5201080E51D
:10020000C4009FE5D1F021E300D0A0E1800040E2EE
:10021000D2F021E300D0A0E1020B40E2D7F021E3CD
:1002200000D0A0E1040040E2DBF021E300D0A0E137
:10023000040040E2D3F021E300D0A0E1800040E2DE
:1002400010F021E300D0A0E101AB4DE27C109FE56E
:100250007C209FE57C309FE5030052E1040091344F
:1002600004008234FBFFFF3A0000A0E368109FE522
:1002700068209FE5020051E104008134FCFFFF3A51
:100280000000A0E358109FE558209FE5020051E1CF
:1002900004008134FCFFFF3A000100EA30F0FFFF68
:1002A000300000FC9000000020A107000020005C4E
:1002B00096010000020002004030080019C00B0047
:1002C00080000200731B000001C8FE0000800104D2
:1002D000F0B8010000000004B8030004C0030004EB
:1002E000A8180004A8180004A81800040DC0A0E174
:1002F00000D82DE904B04CE20200A0E30E3000EB80
:100300000000A0E3393000EB020CA0E3E13000EB89
:100310008000A0E37C3000EB1C00E0E3663000EBE3
:100320006000E0E36E3000EBC000A0E31910A0E332
:100330000320A0E3143000EB0100A0E32B3000EB1E
:100340000000A0E3FC2F00EB00A81BE90DC0A0E11A
:1003500010D82DE904B04CE220D04DE22C404BE205
:100360006930A0E300308DE50400A0E114109FE5A2
:100370000020A0E30C30A0E35D5900EB0400A0E1F5
:10038000652500EB10A81BE95CAC01000DC0A0E1E5
:1003900010D82DE904B04CE208D04DE28C109FE556
:1003A0000A30D1E5000053E30000A00310A81B09A8
:1003B0007C009FE5002090E5003091E5030052E1CC
:1003C0000A00000AB020D1E1B020C0E10230D1E53E
:1003D0000230C0E50330D1E50330C0E50130A0E3D1
:1003E0000A30C0E54C309FE50020A0E3B020C3E117
:1003F00038109FE5B020D1E10230D1E50310D1E5FE
:1004000000108DE52C409FE5B010D4E104108DE57F
:1004100024009FE524109FE5355900EBB030D4E16E
:10042000013083E2B030C4E10C009FE510A81BE965
:1004300080080004E8030004C6030004C8030004A5
:1004400074AC01000DC0A0E100D82DE904B04CE26D
:1004500000329FE5003093E5000053E30900001AE5
:100460001603A0E30B0A80E28010A0E30120A0E3C2
:10047000E83200EBE0019FE5E0119FE51C5900EB3D
:100480000320A0E3490000EAD4319FE5003093E562
:10049000000053E30900001A1603A0E30B0A80E2F0
:1004A0008010A0E30120A0E3DA3200EBA8019FE571
:1004B000B0119FE50E5900EB0420A0E33B0000EAD9
:1004C000A4319FE50330D3E5030053E30D00000A98
:1004D0001603A0E30B0A80E28010A0E30120A0E352
:1004E000CC3200EB70019FE580119FE5005900EBD5
:1004F0000130A0E378219FE5003082E574219FE57B
:100500000030C2E54B0000EA6C319FE50330D3E5D3
:10051000020053E30900000A3C019FE55C119FE5DE
:10052000F35800EB1603A0E30B0A80E28010A0E36F
:100530000120A0E3B73200EB0220A0E31B0000EA99
:100540003C319FE5003093E5000053E30900001AB9
:100550001603A0E30B0A80E28010A0E30120A0E3D1
:10056000AC3200EBF0009FE518119FE5E05800EB7E
:100570000520A0E30D0000EA0C319FE50020D3E543
:100580000130D3E5A333B0E10E00000A1603A0E367
:100590000B0A80E28010A0E30120A0E39D3200EB73
:1005A000B4009FE5E4109FE5D15800EB0620A0E3DE
:1005B000BC309FE5002083E50120A0E3B4309FE537
:1005C0000020C3E51B0000EAC4309FE50830D3E5F6
:1005D000630053E30B00008A1603A0E30B0A80E2DA
:1005E0008010A0E30120A0E38A3200EB68009FE5C1
:1005F000A0109FE5BE5800EB0720A0E370309FE5F8
:10060000002083E50B0000EA4C009FE588109FE581
:10061000B75800EB0020A0E354309FE5002083E5AD
:1006200050309FE50020C3E51603A0E30B0A80E2EB
:100630008010A0E3773200EB0020A0E314309FE5A8
:10064000002083E538309FE5002083E510309FE5EA
:10065000002083E500A81BE9080400040808000442
:1006600094AC01001C040004ACAC0100300900048F
:10067000C8AC0100C0030004C5030004D009000495
:10068000DCAC0100B4040004F4AC0100A8090004CF
:100690000CAD01004808000420AD010030AD0100A0
:1006A0000DC0A0E170D82DE904B04CE264D04DE259
:1006B0000050A0E30CFFFFEB7C004BE2B62600EB02
:1006C0002000A0E30110A0E3A52F00EB2000A0E391
:1006D0000510A0E1B82F00EB2C3400EBF50000EB87
:1006E000740600EBF01C00EBE82000EB40039FE5F4
:1006F000892400EBDC2500EB622000EB4F0E00EBC1
:10070000940700EB440B00EB292A00EBDC0F00EB15
:100710000500A0E3AA0600EB18339FE5000083E57F
:10072000FA00A0E3A60600EB0C339FE5000083E58A
:10073000BB0EA0E3080080E2A10600EBFC329FE5BF
:10074000000083E5E8029FE5732400EBF0029FE5DB
:10075000712400EBFCFEFFEBFC0A00EBE4329FE5AA
:100760000330D3E5030053E30600000AD8029FE5F7
:10077000692400EB1603A0E30B0A80E28010A0E3DB
:100780000120A0E3233200EBE80D00EBBC329FE533
:100790000330D3E5020053E30600000AB0029FE5F0
:1007A0005D2400EB1603A0E30B0A80E28010A0E3B7
:1007B0000120A0E3173200EB98029FE5562400EBDE
:1007C00094329FE50030D3E5000053E32C23001B57
:1007D0006D2400EBC50700EBE82100EB7C329FE5C0
:1007E000003093E5050053E31F00000A44329FE503
:1007F000000093E5780600EBFF0010E31A00000A02
:100800005C329FE5000093E5730600EBFF0010E308
:100810000400000A4C029FE53F2400EBB50B00EBFF
:10082000FD0A00EB100000EA3C029FE53C129FE548
:10083000C32700EB38329FE50020D3E5FF2002E21A
:1008400028329FE50030D3E5FF3003E2030052E198
:100850000400A0130300A003340D00EB1900A0E373
:10086000570600EBCC319FE5000083E5CC319FE5D6
:10087000000093E5580600EBFF0010E30B00000AB0
:10088000F0319FE5003093E5000053E3262B000B89
:10089000EBFEFFEBFA0FA0E3490600EB9C319FE56E
:1008A000000083E50120A0E3CC319FE50020C3E5F3
:1008B00084419FE5000094E5470600EBFF0010E34C
:1008C000BEFFFF0A7D0FA0E33D0600EB000084E5BC
:1008D000A8319FE50A30D3E5020013E34800000A7F
:1008E000030055E305F19F97B4FFFFEAFC08000001
:1008F000FC08000070090000D4090000A2FEFFEB14
:100900000040A0E1000050E3ACFFFF0ACE1500EB71
:10091000FF0010E3F8FFFF1A000054E3A7FFFF0AEF
:100920000400A0E17C104BE2232600EBFF0010E363
:100930000600000A0250A0E344019FE5F62300EB05
:100940000400A0E1F42300EB38019FE59AFFFFEAE1
:100950000350A0E330019FE5EF2300EB0400A0E18A
:10096000ED2300EB1C019FE5EB2300EB1F0000EAE9
:1009700018019FE52F30D0E53020D0E5023483E127
:100980003120D0E5023883E13220D0E5023C93E10A
:100990008AFFFF0A1030D0E5010013E387FFFF0A4A
:1009A0001240D0E5030054E384FFFF1A7C604BE261
:1009B0000610A0E1122700EBFF0010E37FFFFF1AF3
:1009C000CC009FE5D42300EB0600A0E1152600EB48
:1009D000150000EA2A0F00EBFF1010E20350A013ED
:1009E0004E0DA013080080120100001A0150A0E172
:1009F0000A00A0E3F20500EB3C309FE5000083E530
:100A00006EFFFFEA020055E36CFFFF1A7C004BE229
:100A1000042600EBFF0010E30300000A74009FE5CA
:100A2000BD2300EB0150A0E364FFFFEA0350A0E305
:100A300062FFFFEA48AD0100C0070004400800045F
:100A40000008000478AD01003009000490AD0100F9
:100A5000D0090004B0AD0100CCAD010023050004B5
:100A6000680000041804000400AE0100E00800045F
:100A700088090004E00900040804000418050004C3
:100A80004808000420AE01009CB7010038AE010008
:100A9000B804000454AE010070AE01000231A0E3BE
:100AA000C339A0E1FF20A0E3302083E53F33A0E37A
:100AB000302083E50EF0A0E10231A0E3C339A0E1CC
:100AC0000C209FE5342083E53F33A0E3342083E509
:100AD0000EF0A0E19C0A00000EF0B0E104C02DE58C
:100AE0000DC0A0E10FD82DE904B04CE204009FE551
:100AF000892300EBFEFFFFEA88AE010004C02DE56C
:100B00000DC0A0E10FD82DE904B04CE204009FE530
:100B1000812300EBFEFFFFEA98AE010004F05EE2E5
:100B200004C02DE50DC0A0E10FD82DE904B04CE2C2
:100B300004009FE5782300EBFEFFFFEAACAE010066
:100B40000231A0E3C339A0E1FF20A0E3302083E518
:100B50000EF0A0E10231A0E3C339A0E1FF20A0E341
:100B6000302083E50EF0A0E10231A0E3C339A0E11B
:100B7000FF20A0E3302083E50EF0A0E10231A0E3E6
:100B8000C339A0E1FF20A0E3302083E50EF0A0E10F
:100B90000231A0E3C339A0E1FF20A0E3302083E5C8
:100BA0000EF0A0E10231A0E3C339A0E1FF20A0E3F1
:100BB000302083E50EF0A0E10231A0E3C339A0E1CB
:100BC000FF20A0E3302083E50EF0A0E10DC0A0E1FE
:100BD00000D82DE904B04CE20E4200EB0231A0E354
:100BE000C339A0E1FF20A0E3302083E500A81BE982
:100BF0000DC0A0E100D82DE904B04CE2B31900EB20
:100C00000231A0E3C339A0E1FF20A0E3302083E557
:100C100000A81BE90231A0E3C339A0E1FF20A0E353
:100C2000302083E50EF0A0E10231A0E3C339A0E15A
:100C3000FF20A0E3302083E50EF0A0E10231A0E325
:100C4000C339A0E1FF20A0E3302083E50EF0A0E14E
:100C50000231A0E3C339A0E1FF20A0E3302083E507
:100C60000EF0A0E10231A0E3C339A0E1FF20A0E330
:100C7000302083E50EF0A0E10231A0E3C339A0E10A
:100C8000FF20A0E3302083E50EF0A0E10EF0A0E10C
:100C90000EF0A0E10EF0A0E10EF0A0E10EF0A0E158
:100CA0000EF0A0E10DC0A0E100D82DE904B04CE2A7
:100CB0001B00A0E30010A0E3233300EB020BA0E332
:100CC0001A3900EB000050E30700000A28309FE5C6
:100CD0006420A0E3B020C3E1690E00EB0200A0E3B2
:100CE0000E3900EB020BA0E31B3900EB1B00A0E365
:100CF0000110A0E3143300EB00A81BE9E007000497
:100D00000EF0A0E10EF0A0E10EF0A0E10EF0A0E1E7
:100D10000030A0E318109FE52020A0E30320C1E7E6
:100D2000013083E2FF3003E24F0053E30EF0A08175
:100D3000F9FFFFEA000000040DC0A0E170D82DE922
:100D400004B04CE204D04DE2F03A9FE50030D3E528
:100D5000010013E30800000AE42A9FE50030D2E511
:100D6000000053E3013043120030C215D43A9F050E
:100D70000020D305C83A9F050020C305BC3A9FE573
:100D80000030D3E5020013E30A00000AB01A9FE521
:100D90000030D1E5AC2A9FE50020D2E5020053E106
:100DA0000030A0030030C105942A9F150030D215F1
:100DB000013083120030C215803A9FE50030D3E540
:100DC000033003E2030053E30020A003703A9F05C1
:100DD0000020C305CDFFFFEB641A9FE50020D1E59D
:100DE000603A9FE50030D3E5030052E10030C18551
:100DF0004C3A9FE50010D3E5090051E31120A09380
:100E0000443A9F950020C3951020A083383A9F85CF
:100E10000020C385283A9F850010D3852C0A9FE5C2
:100E2000170300EB183A9FE50030D3E50C0053E3BD
:100E300003F19F97760200EA6C0E0000FC0E0000A2
:100E40000C1100009812000054130000B8130000A9
:100E5000DC140000241500006C15000004160000CE
:100E600078160000F816000064170000D8599FE5B6
:100E70000040A0E30040C5E5D4099FE5000300EB76
:100E80001430A0E30030C5E5C8099FE50410A0E1D7
:100E90000C20A0E36930A0E3F90200EBB8399FE52C
:100EA000001093E5040051E10400000A1F30A0E3A4
:100EB0000030C5E5A4099FE5F10200EB040000EA5B
:100EC0001F20A0E380399FE50020C3E590099FE53E
:100ED000EB0200EB70499FE52830A0E30030C4E549
:100EE00080099FE580199FE5E50200EB3C30A0E317
:100EF0000030C4E574099FE5470100EA70199FE5D9
:100F00002F20D1E53030D1E5032482E13130D1E525
:100F1000032882E13230D1E5033C92E10F00001A50
:100F200024499FE50030C4E548099FE5D40200EB61
:100F30001430A0E30030C4E53C099FE5D00200EB8B
:100F40002830A0E30030C4E530099FE5CC0200EB77
:100F50003C30A0E30030C4E524099FE52E0100EAFF
:100F60000C399FE51230D3E5020053E30D00000A6F
:100F7000020000CA000053E30300000A170000EA61
:100F8000030053E30E00000A140000EA0020A0E36F
:100F9000B4389FE50020C3E5D4389FE51110D3E5B0
:100FA000E0089FE5130000EA0020A0E398389FE5E1
:100FB0000020C3E5B8389FE51110D3E5C8089FE5C8
:100FC0000C0000EA0020A0E37C389FE50020C3E588
:100FD0009C389FE51110D3E5B0089FE5050000EAB5
:100FE0000020A0E360389FE50020C3E580389FE53E
:100FF0001110D3E598089FE5A10200EB70489FE52A
:101000000020D4E50130D4E5032482E10230D4E5A8
:10101000032882E10330D4E5032C82E174689FE564
:101020009602C1E0C23FA0E1411B63E0813261E072
:10103000033363E0833181E0033183E083C342E023
:1010400000005CE300C06CB2FC579FE51430A0E3E5
:101050000030C5E540089FE50C20A0E1880200EBC8
:101060000420D4E50530D4E5032482E10630D4E53C
:10107000032882E10730D4E5032C82E19632C1E0F7
:10108000C23FA0E1411B63E0813261E0033363E0D2
:10109000833181E0033183E083C342E000005CE3FD
:1010A00000C06CB22830A0E30030C5E5EC079FE536
:1010B0000C20A0E1720200EB0820D4E50930D4E551
:1010C000032482E10A30D4E5032882E10B30D4E521
:1010D000032C82E1C8379FE59302C1E0C23FA0E143
:1010E000411363E0813261E0033181E083C142E07A
:1010F00000005CE300C06CB23C30A0E30030C5E50A
:10110000A0079FE50C20A0E1930100EA60179FE58E
:101110002F20D1E53030D1E5032482E13130D1E513
:10112000032882E13230D1E5033C92E10F00001A3E
:1011300014479FE50030C4E538079FE5500200EBF7
:101140001430A0E30030C4E55C079FE54C0200EBDF
:101150002830A0E30030C4E550079FE5480200EBCB
:101160003C30A0E30030C4E544079FE5AA0000EA54
:10117000FC369FE51230D3E5020053E30D00000A70
:10118000020000CA000053E30300000A170000EA4F
:10119000030053E30E00000A140000EA0020A0E35D
:1011A000A4369FE50020C3E5C4369FE51110D3E5C2
:1011B000D0069FE5130000EA0020A0E388369FE5F3
:1011C0000020C3E5A8369FE51110D3E5B8069FE5DA
:1011D0000C0000EA0020A0E36C369FE50020C3E588
:1011E0008C369FE51110D3E5A0069FE5050000EAC7
:1011F0000020A0E350369FE50020C3E570369FE550
:101200001110D3E588069FE51D0200EB38569FE5D7
:101210001430A0E30030C5E554469FE51710D4E52F
:101220001830D4E5031481E11930D4E5031881E1C5
:101230001A30D4E5031C81E178069FE5100200EB2B
:101240002830A0E30030C5E51B10D4E51C30D4E500
:10125000031481E11D30D4E5031881E11E30D4E58B
:10126000031C81E150069FE5050200EB3C30A0E342
:101270000030C5E51F10D4E52030D4E5031481E12A
:101280002130D4E5031881E12230D4E5031C81E14B
:1012900028069FE55C0100EAAC459FE50030A0E32D
:1012A0000030C4E518069FE5F50100EB14369FE514
:1012B0000A30D3E5000053E30E00001A0030C4E505
:1012C000FC059FE5EE0100EB1430A0E30030C4E51F
:1012D000F4059FE5EA0100EB2830A0E30030C4E507
:1012E000E8059FE5E60100EB3C30A0E30030C4E5F3
:1012F000D4059FE5480000EA4C559FE51430A0E373
:101300000030C5E5C0059FE5DD0100EB2830A0E316
:101310000030C5E5AC459FE50210D4E50320D4E5D7
:10132000B030D4E1A8059FE5D50100EB3C30A0E347
:101330000030C5E50410D4E50520D4E50630D4E539
:10134000B800D4E100008DE588059FE5CC0100EBF5
:10135000360100EAF0549FE50030A0E30030C5E517
:1013600074459FE50910D4E570059FE5C40100EBC5
:101370001430A0E30030C5E50A10D4E50B20D4E515
:101380005C059FE5BE0100EB2830A0E30030C5E519
:101390000C10D4E50D20D4E548059FE5B80100EB1D
:1013A0003C30A0E30030C5E50E10D4E50F20D4E5B5
:1013B00034059FE5E80000EA8C449FE50030A0E397
:1013C0000030C4E524059FE5AD0100EB20159FE545
:1013D0000C30D1E50D20D1E5023483E10E20D1E5BA
:1013E000023883E10F20D1E5023C93E10C00001AA2
:1013F0001430A0E30030C4E5F8049FE5A00100EB41
:101400002830A0E30030C4E5EC049FE59C0100EB2C
:101410003C30A0E30030C4E5D8049FE5980100EB20
:10142000020100EAC8449FE50020D4E50130D4E57C
:10143000032482E10230D4E5032882E10330D4E5BD
:10144000032C82E14C649FE59632C1E0C23FA0E1EB
:10145000411B63E0813261E0033363E0833181E06B
:10146000033183E083C342E000005CE300C06CB260
:10147000D4539FE51430A0E30030C5E57C049FE51C
:101480000C20A0E17E0100EB0420D4E50530D4E57A
:10149000032482E10630D4E5032882E10730D4E555
:1014A000032C82E19602C1E0C23FA0E1411B63E050
:1014B000813261E0033363E0833181E0033183E013
:1014C00083C342E000005CE300C06CB22830A0E3BC
:1014D0000030C5E528049FE5F4FEFFEA68539FE568
:1014E0000030A0E30030C5E518049FE5640100EB7F
:1014F0001430A0E30030C5E50C449FE5D010D4E1E2
:10150000D120D4E104049FE55D0100EB2830A0E385
:101510000030C5E5D310D4E1D220D4E1F0039FE53B
:101520008D0000EA20539FE50030A0E30030C5E5C0
:10153000E0039FE5520100EB1430A0E30030C5E565
:10154000C4439FE50410D4E50520D4E5C8039FE516
:101550004B0100EB2830A0E30030C5E50610D4E5D0
:101560000720D4E5B4039FE57B0000EAD8529FE54D
:101570000030A0E30030C5E5A4439FE50110D4E5A9
:101580000230D4E5031481E10118A0E14118A0E183
:1015900090039FE53A0100EB1430A0E30030C5E56D
:1015A0000310D4E50430D4E5031481E10118A0E16F
:1015B0004118A0E170039FE5310100EB2830A0E362
:1015C0000030C5E50510D4E50630D4E5031481E10B
:1015D0000118A0E14118A0E150039FE5280100EBAC
:1015E0003C30A0E30030C5E50710D4E50830D4E571
:1015F000031481E10118A0E14118A0E130039FE547
:10160000810000EA40529FE50030A0E30030C5E5CC
:101610000C439FE50B10D4E50C30D4E5031481E1B5
:101620000118A0E14118A0E108039FE5140100EBB7
:101630001430A0E30030C5E50D10D4E50E30D4E53C
:10164000031481E10118A0E14118A0E1E8029FE53F
:101650000B0100EB2830A0E30030C5E50F10D4E506
:101660001030D4E5031481E10118A0E14118A0E194
:10167000C8029FE5640000EACC519FE50030A0E37A
:101680000030C5E580429FE50810D4E5B0029FE533
:10169000FB0000EB1430A0E30030C5E50910D4E5F1
:1016A000A0029FE5F60000EB2830A0E30030C5E57E
:1016B00094329FE50010D3E50130D3E5031481E1B6
:1016C0000118A0E14118A0E180029FE5EC0000EBC9
:1016D0003C30A0E30030C5E544329FE50910D3E576
:1016E0000A30D3E5031481E10118A0E14118A0E11B
:1016F0005C029FE5440000EA4C519FE50030A0E306
:101700000030C5E5D0419FE50110D4E50220D4E5C5
:1017100040029FE5DA0000EB1430A0E30030C5E59D
:101720000310D4E50420D4E52C029FE5D40000EB9F
:101730002830A0E30030C5E50510D4E50620D4E547
:1017400018029FE5CE0000EB3C30A0E30030C5E579
:101750000710D4E50820D4E504029FE5C80000EB9B
:10176000320000EA0200A0E3700900EBD8509FE5C8
:101770000030A0E30030C5E5E8319FE50010D3E577
:10178000FF1001E20120D3E5FF2002E20230D3E5A1
:10179000FF3003E2613083E2CC019FE5B80000EB4B
:1017A0001430A0E30030C5E5C0419FE50010D4E54A
:1017B0000130D4E5031481E10118A0E14118A0E152
:1017C000AC019FE5AE0000EB2830A0E30030C5E59A
:1017D0000210D4E50330D4E5031481E10118A0E13F
:1017E0004118A0E18C019FE5A50000EB3C30A0E38F
:1017F0000030C5E50410D4E50530D4E5031481E1DB
:101800000118A0E14118A0E16C019FE59C0000EBEC
:10181000060000EA28109FE50030D1E5013043E2E0
:1018200020209FE50030C2E50030A0E30030C1E594
:101830000020A0E304309FE50020C3E570A81BE969
:10184000F6030004F503000450000004F403000450
:10185000C0AE0100C8AE0100DCAE0100C003000450
:10186000E8AE010040AD0100F0AE01000808000440
:10187000F4AE0100B804000408AF010014AF010089
:101880002CAF010044AF01005CAF010070AF01005C
:1018900084AF010098AF01006BCA5F6BACAF010071
:1018A000C0AF0100D34D6210D4AF0100E8AF01001A
:1018B00000B0010018B0010030B0010044B00100D8
:1018C00058B001006CB00100800800047CB0010039
:1018D00094B00100ACB00100C4B00100C80700041E
:1018E000E0B00100F0B0010004B1010018B1010046
:1018F0002CB10100500500043CB1010054B10100BD
:101900006CB1010080B1010094B1010048080004ED
:10191000A0B10100B0B10100C0B10100CCB1010023
:10192000E0B1010010090004F4B1010004B20100AB
:1019300014B2010024B2010034B2010044B201002B
:1019400054B2010064B2010078B20100A809000499
:101950008CB20100A0B20100B4B20100C8B2010013
:10196000DCB20100F0B20100D009000404B30100B0
:10197000C809000414B3010020B301002CB3010016
:101980001C109FE50030D1E5012083E20020C1E575
:10199000FF3003E20C209FE50300C2E70100A0E353
:1019A0000EF0A0E1F4030004000000040DC0A0E16B
:1019B00030D82DE904B04CE20050A0E10140A0E194
:1019C000000051E330A81B090100D5E4EBFFFFEB59
:1019D000014054E230A81B09FAFFFFEA0DC0A0E164
:1019E00030D82DE904B04CE20050A0E10140A0E164
:1019F000000051E330A81B090100D5E4DFFFFFEB35
:101A0000014054E230A81B09FAFFFFEA0DC0A0E133
:101A100010D82DE904B04CE2FF4000E2043CA0E104
:101A2000000053E310A81BD92000A0E3D3FFFFEB75
:101A3000013044E2FF4003E2043CA0E1000053E334
:101A400010A81BD9F7FFFFEA0DC0A0E110D82DE9BF
:101A500004B04CE2FF4000E2043CA0E1000053E38C
:101A600010A81BD93000A0E3C4FFFFEB013044E213
:101A7000FF4003E2043CA0E1000053E310A81BD99F
:101A8000F7FFFFEA0DC0A0E10F002DE9F0DF2DE91F
:101A900014B04CE248D04DE20080A0E308708BE225
:101AA00004509BE50500A0E10040D5E5000054E3AB
:101AB0000600000A250054E30400000A0140F5E591
:101AC000000054E30100000A250054E3FAFFFF1A66
:101AD000001055E0C0FFFF1B000054E35E01000A48
:101AE000015085E20060A0E364600BE506A0A0E180
:101AF000FF90A0E329604BE50140D5E4750054E375
:101B00000200000A203084E3780053E30B00001A3F
:101B1000010016E30730A0110470871200809315AE
:101B20000600001A0730A0E1047087E2000093E588
:101B3000040016E30038A0112388A0110080A00142
:101B4000200054E30300001A29305BE5000053E352
:101B5000E8FFFF1A140000EA230054E3086086033C
:101B6000E4FFFF0A2D0054E32A0054130C00001A6E
:101B70002A0054E30700001A0730A0E1047087E24E
:101B800000A0D3E5D030D3E1000053E3D9FFFFAA92
:101B900000306AE2FFA003E2103086E3DF6003E278
:101BA000D4FFFFEA2B0054E30100001A29404BE563
:101BB000D0FFFFEA2E0054E31A00001A0140D5E4DA
:101BC0002A0054E30700001A0730A0E1047087E2FE
:101BD000001093E50030E0E3030051E10130A0A1E3
:101BE000FF9003E2C3FFFFEA0010A0E3303044E2BD
:101BF000090053E30600008A013181E0833084E06C
:101C0000301043E20140D5E4303044E2090053E3B0
:101C1000F8FFFF9A0030E0E3030051E10130A0A19A
:101C2000FF9003E2B4FFFFEA300054E30200001A21
:101C3000100016E320608603AEFFFFEA313044E275
:101C4000080053E30900008A0010A0E3013181E09D
:101C5000833084E0301043E20140D5E4303044E288
:101C6000090053E3FFA00182A3FFFF8AF6FFFFEA0A
:101C7000680054E3046086039EFFFF0A6C0054E38F
:101C8000016086039BFFFF0A630054E30800001A0B
:101C900054104BE25C100BE50730A0E1047087E2C2
:101CA0000030D3E554304BE50120A0E36C200BE578
:101CB000AC0000EA640054E3440054130100000A3D
:101CC000690054E31400001A440054E301608603E1
:101CD000010016E30730A0110470871200809315ED
:101CE0000600001A0730A0E1047087E2000093E5C7
:101CF000040016E30038A0114388A0110080A00161
:101D0000000058E3008068B22D30A0B329304BB5F5
:101D10000A30A0E360300BE5580000EA6F0054E39E
:101D20004F0054130400001A4F0054E3016086036F
:101D30000810A0E360100BE54E0000EA700054E3C9
:101D40000700001A0730A0E1047087E2008093E5E5
:101D50001020A0E360200BE5406086E37840A0E31C
:101D6000440000EA730054E32E00001A0730A0E19B
:101D7000047087E2003093E55C300BE50320A0E1BE
:101D8000000053E30D00001A54304BE25C300BE5C9
:101D90002830A0E354304BE56E30A0E353304BE5E0
:101DA0007530A0E352304BE56C30A0E351304BE589
:101DB00050304BE52930A0E34F304BE54E204BE54A
:101DC000093CA0E1433CB0E170300BE51000004A53
:101DD0005C001BE50010A0E30320A0E1CD5200EB66
:101DE000000050E30700000A5C101BE5003061E0D2
:101DF000FF3003E26C300BE5033CA0E170201BE5F3
:101E0000430C52E1570000AAFF9009E26C900BE5E9
:101E1000540000EA5C001BE5D25200EBFF0000E238
:101E20006C000BE54F0000EA750054E355005413B5
:101E30000400001A550054E3016086030A30A0E351
:101E400060300BE50B0000EA780054E358005413AF
:101E50003D00001A1010A0E360100BE5A631A0E1D0
:101E6000013003E2000058E30030A0030130031208
:101E7000000053E3406086130030A0E329304BE5B7
:101E800064900BE5800019E3DF6006022C204BE232
:101E90005C200BE5000059E3000058032300000A12
:101EA00060301BE5030058E10090A0330190A023AF
:101EB0000800A0E10310A0E1204900EBFF0000E2D0
:101EC000090050E330308092FF0003920300009A33
:101ED000573080E2FF0003E2580054E3DF000302C2
:101EE0005C101BE5010061E55C100BE50800A0E15A
:101EF00060101BE5BF4800EB0080A0E1000059E343
:101F0000E6FFFF1A60201BE5080052E30700001AF5
:101F1000080016E30500000A5C101BE50030D1E55F
:101F2000300053E33030A013013061155C100B1505
:101F300028204BE25C101BE5023061E0043043E2F4
:101F4000FF3003E26C300BE5080000EA000054E3C8
:101F50004100000A54204BE25C200BE554404BE565
:101F60000130A0E36C300BE50030A0E329304BE5F5
:101F70006C101BE5FF9001E264201BE5023061E07C
:101F8000FF3003E2800013E30030A01368300BE55C
:101F900029305BE5000053E3013089120200001A8A
:101FA000400016E30100000A023089E2FF9003E2DC
:101FB00068101BE5013089E0FF9003E2300016E372
:101FC0000A006900000CA001400CA0018EFEFF0B6E
:101FD00029305BE5000053E329004B120110A013E8
:101FE0000600001A400016E30500000A3030A0E3A6
:101FF00058304BE557404BE558004BE20210A0E348
:1020000069FEFFEB303006E2200053E30A0069006E
:10201000000CA001400CA0018AFEFF0B68201BE50C
:10202000020CA0E1400CA0E186FEFFEB6C301BE54A
:10203000031CA0E1411CA0E15C001BE55AFEFFEB84
:10204000100016E396FEFF0A0A0069E0000CA0E10A
:10205000400CA0E16CFEFFEB91FEFFEAF0AF1BE944
:102060000DC0A0E100D82DE904B04CE21603A0E3B6
:10207000030A80E20119A0E3F43000EB1623A0E389
:10208000032A82E2B830D2E1C83083E2B830C2E13C
:102090001C209FE5003092E5013083E2003082E5AC
:1020A0000231A0E3C339A0E1FF20A0E3302083E5A3
:1020B00000A81BE9600800040DC0A0E110D82DE9BC
:1020C00004B04CE220D04DE2E0009FE5121E00EB90
:1020D0000100A0E30010A0E1162900EB30404BE224
:1020E0000400A0E1D42F00EB4010A0E3B0134BE1BB
:1020F0000230A0E3BE324BE10110E0E3BA124BE143
:102100003D2A00EB803260E0033180E08331A0E1C2
:102110002333A0E198209FE5921383E02333A0E1CD
:1021200020304BE51603A0E3030A80E20410A0E18F
:10213000D22F00EB1603A0E3030A80E20119A0E30B
:102140000120A0E3CA3000EB1603A0E3030A80E2FB
:102150000010A0E38E3000EB0500A0E30010A0E328
:102160000020A0E1A32E00EB0500A0E30110A0E3F6
:10217000F52D00EB3C309FE50010A0E3B010C3E16B
:102180000210C3E50310C3E50410C3E50510C3E561
:102190000610C3E5B810C3E10A10C3E518309FE587
:1021A000001083E514009FE5DB1D00EB10A81BE980
:1021B00038B30100632D3E05800800046008000468
:1021C00048B301000C309FE5003093E5030080E048
:1021D000010040E20EF0A0E16008000414309FE529
:1021E000003093E5000063E0000050E31000A0B36E
:1021F0000000A0A30EF0A0E1600800040DC0A0E163
:1022000000D82DE904B04CE2EDFFFFEB14309FE560
:10221000000083E5F0FFFFEBFF0000E2000050E369
:1022200000A81B19FCFFFFEAF80300040DC0A0E1A1
:10223000F0DF2DE904B04CE21703A0E3070A80E2C7
:102240000210A0E3573100EB1773A0E3074A87E2BF
:10225000C8629FE50050A0E3230000EAC0029FE5AA
:102260000030D0E51B0053E31000008A0030D0E5B9
:10227000FF3003E20330D6E7FF3003E2B830C4E1B9
:10228000A0329FE5001093E50030D0E5FF3003E277
:102290000020D1E50330D6E7032082E00020C1E52D
:1022A0000030D0E5013083E20030C0E50E0000EAE6
:1022B0006C329FE50050C3E56C129FE51950C1E5F3
:1022C00068329FE50020D3E50B00D1E50B20C1E586
:1022D0000120D3E50C00D1E50C20C1E5B050C3E1ED
:1022E0004C029FE51A20A0E3965100EB070A87E213
:1022F0002110A0E3123100EB010050E317A3A0135B
:1023000007AA8A122C929F157D00001AD2FFFFEABD
:10231000B830DAE1FF8003E21773A0E3074A87E2EF
:10232000F8619FE50050A0E3230000EAF0019FE57B
:102330000030D0E51B0053E31000008A0030D0E5E8
:10234000FF3003E20330D6E7FF3003E2B830C4E1E8
:10235000D0319FE5001093E50030D0E5FF3003E277
:102360000020D1E50330D6E7032082E00020C1E55C
:102370000030D0E5013083E20030C0E50E0000EA15
:102380009C319FE50050C3E59C119FE51950C1E5C4
:1023900098319FE50020D3E50B00D1E50B20C1E586
:1023A0000120D3E50C00D1E50C20C1E5B050C3E11C
:1023B0007C019FE51A20A0E3625100EB070A87E247
:1023C0002110A0E3DE3000EB010050E3D6FFFF0A4E
:1023D000003099E5010053E30C00000A0200003AC6
:1023E000020053E31100000A430000EA0020A0E3CA
:1023F00044319FE50020C3E540119FE50080C1E521
:10240000AA0058E30130A0033C00000A3C0000EAA7
:10241000830058E33800001A20219FE50030D2E500
:10242000833083E20030C2E50230A0E3330000EAEB
:102430000CC19FE500119FE50030D1E5012083E24A
:102440000020C1E5FF3003E20380CCE70030D1E596
:102450001D0053E3E4209F950030D295033088900F
:102460000030C2952600009AD0109FE50030D1E5DB
:10247000080053E11700001AC8409FE50030D4E57A
:10248000000053E30500001ABC009FE50C10A0E11A
:102490001E20A0E32B5100EB0130A0E30030C4E587
:1024A000A8209FE5003092E5013083E2003082E50C
:1024B0009C209FE51C30D2E51D20D2E5023483E14B
:1024C000013083E288109FE51C30C1E52334A0E190
:1024D0001D30C1E5080000EA74209FE51A30D2E5FE
:1024E0001B20D2E5023483E1013083E260109FE5D6
:1024F0001A30C1E52334A0E11B30C1E50030A0E370
:10250000003089E51703A0E3070A80E22210A0E368
:102510008B3000EB010050E3F0AF1B197BFFFFEAAB
:10252000F0080004FC03000400040004C0080004D8
:10253000E0070004F208000410040004040400048E
:102540000E040004A008000405040004100900049F
:1025500008040004581300040DC0A0E1F0D82DE9D0
:1025600004B04CE218D04DE268019FE5EA1C00EB94
:102570000108A0E30110A0E3EE2700EB010CA0E3AB
:102580000110A0E3EB2700EB1603A0E3020980E2B1
:10259000972900EB34004BE28B2A00EB0150A0E3BB
:1025A00034404BE20060A0E30160C4E54F30E0E35B
:1025B00034304BE50260C4E50350C4E50670A0E189
:1025C000B460C4E11603A0E3020980E20410A0E1B4
:1025D0002B2A00EB0400A0E17B2A00EB0150C4E5AC
:1025E0004030A0E334304BE50260C4E50350C4E55D
:1025F0000230A0E3B430C4E11603A0E3020980E294
:102600000410A0E11E2A00EB1703A0E3070A80E2F2
:10261000B02F00EB2C404BE20400A0E1083000EBAF
:102620003030E0E3BC324BE10430A0E3BA324BE19E
:102630000830E0E3B2324BE18030E0E3B6324BE108
:102640004030E0E3B8324BE120604BE51703A0E3F4
:10265000070A80E20410A0E1B52F00EB1703A0E306
:10266000070A80E20E10A0E30520A0E10B3000EB8A
:1026700064009FE564109FE50A20A0E3122000EBB0
:102680001703A0E3070A80E20510A0E1FC2F00EB8E
:102690004C209FE57E30E0E30030C2E55530A0E3FA
:1026A0000130C2E51B2082E238309FE5002083E53F
:1026B0001500A0E30610A0E10520A0E14D2D00EBE0
:1026C0001500A0E30510A0E19F2C00EB18009FE58A
:1026D000911C00EBF0A81BE950B30100E0080004D6
:1026E00038090004F00800040004000460B301008D
:1026F0000DC0A0E100D82DE904B04CE2F83B9FE505
:102700000030D3E5000053E300A81B091500A0E347
:102710000010A0E38C2C00EBE01B9FE5E02B9FE575
:102720000030D2E50120D2E5023483E10338A0E194
:102730002328A0E1FF2002E20700D1E50720C1E540
:10274000233CA0E10820D1E50830C1E5B40B9FE5AA
:102750000030D0E50120D0E5023483E10338A0E168
:102760002328A0E1FF2002E201C0D1E50120C1E55C
:10277000233CA0E10220D1E50230C1E50230D0E5E2
:102780000320D0E5023483E10338A0E12328A0E14F
:10279000FF2002E203C0D1E50320C1E5233CA0E114
:1027A0000420D1E50430C1E50430D0E50520D0E5B2
:1027B000023483E10338A0E12328A0E1FF2002E2F4
:1027C0000500D1E50520C1E5233CA0E10620D1E5C7
:1027D0000630C1E5300B9FE50030D0E5012083E2F3
:1027E0000020C0E5FF3003E2202B9FE50330D2E755
:1027F0000030C1E50030D0E5040053E30030A08391
:102800000030C085F43A9FE50030D3E5660053E31D
:102810002E00000A020000CA650053E30D00000A02
:10282000740000EA670053E37200001ACC2A9FE5A7
:10283000DC3A9FE50030D3E50D30C2E5D43A9FE5A0
:102840000030D3E50E30C2E5CC3A9FE50030D3E549
:102850000F30C2E5670000EAA01A9FE5BC0A9FE5B9
:102860000020D0E50130D0E5032482E10230D0E53C
:10287000032882E10330D0E5032C82E1FF3002E23D
:102880000DC0D1E50D30C1E52234A0E1FF3003E2F7
:102890000EC0D1E50E30C1E52238A0E1FF3003E2E1
:1028A0000FC0D1E50F30C1E5222CA0E11030D1E5F9
:1028B0001020C1E50420D0E50530D0E5032482E1F5
:1028C0000630D0E5032882E10730D0E5270000EA92
:1028D0004C3A9FE500C093E500005CE33300000A3A
:1028E0000C30DCE50D20DCE5023483E10E20DCE574
:1028F000023883E10F20DCE5023C93E12B00000A63
:10290000F8199FE50020DCE50130DCE5032482E1D5
:102910000230DCE5032882E10330DCE5032C82E1B0
:10292000FF3002E20D00D1E50D30C1E52234A0E117
:10293000FF3003E20E00D1E50E30C1E52238A0E100
:10294000FF3003E20F00D1E50F30C1E5222CA0E1FA
:102950001030D1E51020C1E50420DCE50530DCE5D0
:10296000032482E10630DCE5032882E10730DCE560
:10297000032C82E1FF3002E21100D1E51130C1E504
:102980002234A0E1FF3003E21200D1E51230C1E5AC
:102990002238A0E1FF3003E21300D1E51330C1E596
:1029A000222CA0E11430D1E51420C1E5110000EA89
:1029B00048399FE50D20D3E50020A0E30D20C3E5B5
:1029C0000E10D3E50E20C3E50F10D3E50F20C3E5AD
:1029D0001010D3E51020C3E51110D3E51120C3E595
:1029E0001210D3E51220C3E51310D3E51320C3E57D
:1029F0001410D3E51420C3E51500A0E30110A0E3F3
:102A0000D12B00EB1C399FE50030D3E50A3043E2BF
:102A1000040053E303F19F97000200EA302A00000C
:102A200054310000A8310000CC2A0000F831000029
:102A3000F4189FE5EC289FE51130D2E50130C1E59F
:102A40001230D2E50230C1E51330D2E50330C1E5E2
:102A50001430D2E50430C1E51530D2E50530C1E5CA
:102A60001630D2E50630C1E51730D2E50730C1E5B2
:102A70001830D2E50830C1E5B0189FE50030D1E547
:102A8000000053E30020A013A4389F150A20C315AB
:102A90000020C11598189FE588089FE50A30D1E508
:102AA0001920D0E5023083E10A30C1E51A30D0E5C3
:102AB0000930C1E570289FE51B30D0E51430C2E530
:102AC0001C30D0E50030C2E5D40100EA54289FE56F
:102AD0001130D2E5FA0053E348389F951120D39581
:102AE0001600009A1130D2E5FB0053E340389F05F1
:102AF0000420D3051100000A28389FE51130D3E5E2
:102B0000FC0053E328389F050520D3050B00000A7D
:102B100010389FE51130D3E5FD0053E310389F05D1
:102B20000620D3050500000AF8379FE51130D3E5EC
:102B3000FE0053E3F8379F050720D3050100001A74
:102B4000E4379FE50920C3E5DC279FE50930D2E59E
:102B5000000053E30400000ACC279FE50930D2E5CA
:102B6000FF0053E30100001A0030E0E30930C2E542
:102B7000B0279FE51230D2E5FA0053E3A4379F95C2
:102B80001220D3951600009A1230D2E5FB0053E3D1
:102B90009C379F050420D3051100000A84379FE568
:102BA0001230D3E5FC0053E384379F050520D3059D
:102BB0000B00000A6C379FE51230D3E5FD0053E3AC
:102BC0006C379F050620D3050500000A54379FE5A2
:102BD0001230D3E5FE0053E354379F050720D30599
:102BE0000100001A40379FE50A20C3E538279FE51A
:102BF0000A30D2E5000053E30400000A28279FE5CD
:102C00000A30D2E5FF0053E30100001A0030E0E390
:102C10000A30C2E50C279FE51330D2E5FA0053E3F2
:102C200000379F951320D3951600009A1330D2E5F4
:102C3000FB0053E3F8369F050420D3051100000A7A
:102C4000E0369FE51330D3E5FC0053E3E0369F0503
:102C50000520D3050B00000AC8369FE51330D3E5E5
:102C6000FD0053E3C8369F050620D3050500000A82
:102C7000B0369FE51330D3E5FE0053E3B0369F0531
:102C80000720D3050100001A9C369FE50B20C3E501
:102C900094269FE50B30D2E5000053E30400000AC0
:102CA00084269FE50B30D2E5FF0053E30100001AB4
:102CB0000030E0E30B30C2E568269FE51430D2E532
:102CC000FA0053E35C369F951420D3951600009AC2
:102CD0001430D2E5FB0053E354369F050420D3059E
:102CE0001100000A3C369FE51430D3E5FC0053E3A5
:102CF0003C369F050520D3050B00000A24369FE5CE
:102D00001430D3E5FD0053E324369F050620D30598
:102D10000500000A0C369FE51430D3E5FE0053E3AE
:102D20000C369F050720D3050100001AF8359FE5F2
:102D30000C20C3E5F0259FE50C30D2E5000053E3FD
:102D40000400000AE0259FE50C30D2E5FF0053E3C4
:102D50000100001A0030E0E30C30C2E5C4259FE515
:102D60001530D2E5FA0053E3B8359F951520D39579
:102D70001600009A1530D2E5FB0053E3B0359F05ED
:102D80000420D3051100000A98359FE51530D3E5DE
:102D9000FC0053E398359F050520D3050B00000A7E
:102DA00080359FE51530D3E5FD0053E380359F0561
:102DB0000620D3050500000A68359FE51530D3E5E8
:102DC000FE0053E368359F050720D3050100001A74
:102DD00054359FE50D20C3E54C259FE50D30D2E528
:102DE000000053E30400000A3C259FE50D30D2E5C6
:102DF000FF0053E30100001A0030E0E30D30C2E5AC
:102E000020259FE51630D2E5FA0053E314359F954F
:102E10001620D3951600009A1630D2E5FB0053E336
:102E20000C359F050420D3051100000AF4349FE5FA
:102E30001630D3E5FC0053E3F4349F050520D30599
:102E40000B00000ADC349FE51630D3E5FD0053E3A8
:102E5000DC349F050620D3050500000AC4349FE535
:102E60001630D3E5FE0053E3C4349F050720D30595
:102E70000100001AB0349FE50E20C3E5A8249FE5A9
:102E80000E30D2E5000053E30400000A98249FE5C9
:102E90000E30D2E5FF0053E30100001A0030E0E3FA
:102EA0000E30C2E580149FE578249FE51730D2E507
:102EB0000F30C1E51830D2E51030C1E51930D2E548
:102EC000FA0053E35C349F951920D3951700009ABC
:102ED0001930D2E5FB0053E354349F050430D30589
:102EE0001130C1051300000A38349FE51930D3E5CD
:102EF000FC0053E338349F050520D3050B00000A7E
:102F000020349FE51930D3E5FD0053E320349F05BD
:102F10000620D3050500000A08349FE51930D3E5E3
:102F2000FE0053E308349F050720D3050100001A73
:102F3000F4339FE51120C3E5EC239FE51130D2E582
:102F40000A0053E30A30A0930400009AD8239FE5B7
:102F50001130D2E5FF0053E30100001A0030E0E336
:102F60001130C2E5BC239FE51A30D2E5FA0053E3E5
:102F7000B0339F951A20D3951600009A1A30D2E5E7
:102F8000FB0053E3A8339F050420D3051100000A7A
:102F900090339FE51A30D3E5FC0053E390339F054F
:102FA0000520D3050B00000A78339FE51A30D3E5DE
:102FB000FD0053E378339F050620D3050500000A82
:102FC00060339FE51A30D3E5FE0053E360339F057D
:102FD0000720D3050100001A4C339FE51220C3E5FA
:102FE00044239FE51230D2E5000053E30400000AB9
:102FF00034239FE51230D2E5FF0053E30100001AAD
:103000000030E0E31230C2E518239FE51B30D2E523
:10301000FA0053E30C339F951B20D3951600009ABA
:103020001B30D2E5FB0053E304339F050420D30596
:103030001100000AEC329FE51B30D3E5FC0053E39E
:10304000EC329F050520D3050B00000AD4329FE522
:103050001B30D3E5FD0053E3D4329F050620D30592
:103060000500000ABC329FE51B30D3E5FE0053E3A8
:10307000BC329F050720D3050100001AA8329FE546
:103080001320C3E5A0229FE51330D2E5000053E3EF
:103090000400000A90229FE51330D2E5FF0053E3BD
:1030A0000100001A0030E0E31330C2E574229FE50E
:1030B0001C30D2E5FA0053E368329F951C20D3956B
:1030C0001600009A1C30D2E5FB0053E360329F05E6
:1030D0000420D3051100000A48329FE51C30D3E5D7
:1030E000FC0053E348329F050520D3050B00000A7E
:1030F00030329FE51C30D3E5FD0053E330329F05AD
:103100000620D3050500000A18329FE51C30D3E5E0
:10311000FE0053E318329F050720D3050100001A73
:1031200004329FE51520C3E5FC219FE51530D2E56B
:10313000000053E30400000AEC219FE51530D2E5BE
:10314000FF0053E33500001A0030E0E31530C2E51C
:10315000320000EAD8119FE5C8219FE51130D2E581
:103160000330C1E51230D2E50230C1E51330D2E5BB
:103170000130C1E51430D2E50030C1E51530D2E5AB
:103180000430C1E51630D2E50530C1E51730D2E58F
:103190000630C1E51830D2E50730C1E51930D2E577
:1031A0000830C1E51D0000EA88119FE574019FE524
:1031B0000020D1E51130D0E5030052E10400000AFF
:1031C0001130D0E50030C1E50010D1E568019FE580
:1031D000481D00EB64119FE548219FE51330D2E5BF
:1031E0001420D2E5023483E13B30C1E52334A0E171
:1031F0003C30C1E5090000EA44119FE524219FE528
:103200001130D2E50030C1E51230D2E50130C1E520
:103210001330D2E50230C1E51430D2E50330C1E508
:10322000C12000EB0120A0E300319FE50020C3E5B1
:103230000020A0E3C0309FE50020C3E504019FE526
:10324000E0109FE50130D1E50220D1E5023483E1B1
:103250000230C0E52334A0E10330C0E50330D1E5FE
:103260000420D1E5023483E10430C0E52334A0E139
:103270000530C0E50530D1E50620D1E5023483E113
:103280000338A0E14338A0E1033263E08330A0E1DA
:10329000B4C09FE59CE3C2E0C33FA0E1C23263E05B
:1032A0000630C0E52334A0E10730C0E50730D1E5A2
:1032B0000820D1E5023483E10338A0E14338A0E1DE
:1032C000033263E08330A0E19CE3C2E0C33FA0E1AE
:1032D000C23263E00830C0E52334A0E10930C0E524
:1032E0000930D1E50A20D1E5023483E13430C0E56C
:1032F0002334A0E13530C0E500A81BE90504000433
:10330000C0080004A8090004E01600040C0400042E
:1033100060000004540000045C0000045800000435
:10332000B80400046005000410090004C807000484
:10333000C4030004480800040D040004E00800046D
:10334000A01100043009000458130004F712DA4BEE
:103350000DC0A0E130D82DE904B04CE218D04DE208
:10336000A4209FE50030E0E30030C2E50130C2E573
:103370000230C2E50330C2E57D0EA0E390FBFFEB17
:103380000008A0E14048A0E17C509FE5D7FCFFEB9E
:103390000030D5E5FF0053E30400001A0408A0E163
:1033A0002008A0E18CFBFFEBFF0010E3F6FFFF0A13
:1033B00054509FE500C0D5E5FF005CE34C009F053D
:1033C0000F00000A28404BE20130D5E50220D5E588
:1033D000612082E200208DE50400A0E130109FE52D
:1033E0000C20A0E1424D00EB0400A0E14A1900EBE3
:1033F0000320D5E50400A0E118109FE53C4D00EB4B
:103400000400A0E1441900EB30A81BE930090004D6
:1034100064B3010090B30100A8B301000DC0A0E1A6
:1034200070D82DE904B04CE210D04DE298029FE52F
:10343000391900EB0108A0E30110A0E33D2400EBE3
:103440000108A0E30010A0E3502400EB20004BE2B1
:10345000DD2600EB0140A0E320104BE20140C1E576
:103460000C30A0E320304BE50240C1E50030A0E382
:103470000330C1E5B440C1E11603A0E3020980E2D4
:103480007F2600EB1603A0E3020980E20410A0E30C
:103490000420A0E1DF2600EB0400A0E148FBFFEBE5
:1034A0000040A0E10400A0E14BFBFFEBFF0010E3B4
:1034B000FBFFFF0A1603A0E3020980E20810A0E365
:1034C0000020A0E3D32600EB0050A0E30100A0E31E
:1034D0003BFBFFEB0040A0E10400A0E13EFBFFEB63
:1034E000FF0010E3FBFFFF0A1603A0E3020980E2DE
:1034F0000410A0E30020A0E3C62600EB0100A0E337
:103500002FFBFFEB0040A0E10400A0E132FBFFEB4A
:10351000FF0010E3FBFFFF0A1603A0E3020980E2AD
:103520000410A0E30120A0E3BA2600EB013085E2FD
:10353000FF5003E2090055E3E3FFFF9A0100A0E317
:103540001FFBFFEB0040A0E10400A0E122FBFFEB2A
:10355000FF0010E3FBFFFF0A1603A0E3020980E26D
:103560000810A0E30120A0E3AA2600EB20004BE214
:10357000952600EB0160A0E320104BE20160C1E55D
:103580000C30A0E320304BE50260C1E50360C1E5EB
:103590000230A0E3B430C1E11603A0E3020980E2E7
:1035A000372600EB8000A0E30610A0E1E12300EB4A
:1035B0008000A0E30610A0E1F42300EB8000A0E36C
:1035C0000010A0E3F12300EB1703A0E30D0A80E253
:1035D000782C00EB28004BE2092D00EB28104BE281
:1035E0001030E0E30630C1E50430A0E30730C1E568
:1035F0004E3CA0E3203083E228300BE50050A0E3EE
:103600000540A0E1B450C1E11703A0E30D0A80E238
:10361000812C00EBB4309FE5005083E5B0309FE58E
:103620000050C3E5AC309FE50050C3E5A8309FE5EE
:10363000005083E5A4309FE50050C3E5A0309FE52E
:103640000050C3E51703A0E30D0A80E20610A0E1D5
:10365000F52C00EB1703A0E30D0A80E20610A0E1B1
:10366000102D00EB1400A0E30510A0E10520A0E15F
:10367000602900EB1400A0E30610A0E1B22800EBE3
:10368000FA0FA0E3CEFAFFEB58309FE5000083E588
:1036900054309FE50020D3E50020E0E30020C3E59F
:1036A0000110D3E50120C3E51703A0E30D0A80E272
:1036B0000610A0E1ED2C00EB30309FE5006083E5C3
:1036C0002C009FE5941800EB70A81BE9B8B301002B
:1036D0008009000415040004D809000460090004EE
:1036E00014040004C009000418040004A80900041C
:1036F0006800000460B301000DC0A0E130D82DE9DE
:1037000004B04CE208D04DE210019FE5821800EBB6
:103710001703A0E30D0A80E20010A0E3CC2C00EB1D
:103720001703A0E30D0A80E20110A0E3CF2C00EB09
:103730001400A0E30010A0E3832800EB1703A0E32C
:103740000D0A80E20010A0E3D62C00EB1703A0E3E3
:103750000D0A80E20010A0E3B32C00EB1703A0E3F6
:103760000D0A80E2132C00EB8000A0E30010A0E320
:10377000702300EB0108A0E30110A0E36D2300EB30
:103780001C004BE2102600EB1C104BE20040A0E3B3
:103790000140C1E50C30A0E31C304BE50240C1E51F
:1037A0000340C1E50450A0E1B440C1E11603A0E329
:1037B000020980E2B22500EB64309FE5004083E51A
:1037C00060309FE50040C3E55C309FE50040C3E505
:1037D00058309FE5004083E554309FE50040C3E545
:1037E00050309FE50040C3E50520A0E348309FE549
:1037F000002083E544309FE5004083E540309FE5AD
:103800000020D3E50020E0E30020C3E50110D3E56C
:103810000120C3E52C009FE53F1800EB30A81BE911
:10382000C8B301008009000415040004D80900048D
:103830006009000414040004C009000468000004C6
:1038400018040004A809000460B301000DC0A0E141
:1038500070D82DE904B04CE21703A0E30D0A80E212
:10386000F92C00EB0008A0E14038A0E12008A0E11D
:10387000120C10E31753A0130D4A85120600001A0C
:103880000B0000EA0400A0E10110A0E3772C00EB9C
:103890000400A0E10010A0E3742C00EB0D0A85E207
:1038A0000810A0E3922C00EB000050E3F4FFFF1A95
:1038B000350000EA0338A0E12308A0E19A0050E3B4
:1038C000B400000A020000CA930050E370A81B195C
:1038D000060000EABA0050E36000000A823DA0E35F
:1038E000123083E2030050E170A81B192F0000EA98
:1038F0001603A0E30B0A80E24010A0E30120A0E33E
:10390000C42500EBEC339FE50030D3E5FF3013E234
:103910000220A0030A00000A010053E31600001A67
:10392000D4339FE5003093E5000053E34300000AE1
:10393000C8339FE50030D3E5000053E33F00000AA1
:103940000420A0E3B8339FE5002083E51703A0E33C
:103950000D0A80E20110A0E34B2C00EB94339FE5AD
:103960000020D3E5FF2002E21703A0E30D0A80E266
:103970005010A0E3A72C00EB70A81BE91703A0E3ED
:103980000D0A80E20110A0E3382C00EB0120A0E337
:103990006C339FE5002083E51603A0E30B0A80E269
:1039A0004010A0E30020A0E39A2500EB70A81BE9DB
:1039B0001703A0E30D0A80E20110A0E31A2C00EB2C
:1039C0000030A0E33C239FE50030C2E530339FE5A3
:1039D000003093E5020053E30500000A040053E3BE
:1039E0000020A00320339F050020C30570A81B09F9
:1039F000120000EA14439FE50010D4E5FF1001E235
:103A00001703A0E30D0A80E2892C00EBF4129FE576
:103A10000030D1E50020D4E5023083E00030C1E57C
:103A20000020A0E3E8329FE50020C3E57D0FA0E37E
:103A3000E3F9FFEBDC329FE5000083E570A81BE9AA
:103A40001703A0E30D0A80E20110A0E3072C00EBAE
:103A50000120A0E3A8329FE5002083E570A81BE9C0
:103A6000AC429FE50020D4E5FF2002E2A8329FE5AA
:103A70000030D3E5FF3003E2030052E11800002AD2
:103A800098529FE5002095E5000052E30F00000AE0
:103A90000030D4E5FF3003E20310D2E7FF1001E26B
:103AA0001703A0E30D0A80E2612C00EB54029FE5AE
:103AB0000020D4E5FF2002E2001095E50030D0E5BB
:103AC0000220D1E7023083E00030C0E52C0000EA9C
:103AD0001703A0E30D0A80E20010A0E3542C00EBD2
:103AE000270000EA1C329FE50010D3E51703A0E38E
:103AF0000D0A80E24E2C00EBFC319FE5003093E58F
:103B0000000053E30A00000AF0319FE50030D3E5DE
:103B1000000053E30600000A0110A0E3D4319FE542
:103B20000010C3E51703A0E30D0A80E2C82B00EBE9
:103B3000130000EA1703A0E30D0A80E20110A0E3DE
:103B4000CA2B00EB0120A0E3B4319FE5002083E500
:103B50001603A0E30B0A80E24010A0E30020A0E3DC
:103B60002C2500EBB8119FE52030D1E52120D1E5CF
:103B7000023483E1013083E22030C1E52334A0E147
:103B80002130C1E588219FE50030D2E5013083E294
:103B90000030C2E570A81BE96C619FE50030D6E5F6
:103BA00058219FE50020D2E5020053E10E00002AD3
:103BB00070519FE50040D6E5FF4004E21703A0E303
:103BC0000D0A80E21D2C00EB0400C5E734119FE5CF
:103BD0000030D6E5FF3003E20020D1E50330D5E721
:103BE000032082E00020C1E5340000EA0C419FE59B
:103BF00014319FE50020D3E50030D4E5030052E105
:103C00002E00001A1703A0E30D0A80E20110A0E3C2
:103C1000962B00EB1703A0E30D0A80E2072C00EBC4
:103C2000E0309FE50030D3E5FF0000E2000053E103
:103C30001200001AC0309FE5000093E5000050E339
:103C40000020D415DC109F153E4B001BD0109FE5C3
:103C50002030D1E52120D1E5023483E1013083E237
:103C60002030C1E52334A0E12130C1E5B8209FE533
:103C7000003092E5013083E2003082E5070000EA7F
:103C80009C309FE51E20D3E51F10D3E5012482E17F
:103C9000012082E21E20C3E52224A0E11F20C3E50B
:103CA0000120A0E358309FE5002083E51603A0E340
:103CB0000B0A80E24010A0E30020A0E3D52400EB33
:103CC00044209FE50030D2E5013083E20030C2E5B8
:103CD0000020D2E524309FE50030D3E5030052E117
:103CE00070A81B191703A0E30D0A80E20010A0E3DF
:103CF000652B00EB70A81BE998090004600900041B
:103D0000C009000468000004200400041404000436
:103D1000900900041504000418040004D8090004E4
:103D20008009000458130004B00900041C040004B6
:103D30000DC0A0E110D82DE904B04CE2FF4000E234
:103D4000AC319FE5003093E5010053E310A81B1947
:103D50001703A0E30D0A80E20010A0E3512B00EB53
:103D600090319FE50040C3E5013044E2030053E396
:103D700003F19F97450000EA883D0000CC3D00001C
:103D8000EC3D00009C3D00006C219FE56C319FE5FF
:103D9000002083E50420A0E30F0000EA60219FE5F6
:103DA00058319FE5002083E50310A0E354319FE5DF
:103DB0000010C3E550219FE550319FE5002083E5C9
:103DC0004C319FE50010C3E5390000EA44219FE52E
:103DD00028319FE5002083E50620A0E324319FE5FC
:103DE0000020C3E50020A0E32D0000EA28019FE5A4
:103DF00028119FE50030D1E50120D1E5023483E1AF
:103E00003630C0E52334A0E13730C0E5EC309FE523
:103E1000001083E50220A0E3E8309FE50020C3E521
:103E2000FC109FE5FC009FE50330D0E50420D0E5C1
:103E3000023483E10338A0E12328A0E1FF2002E25D
:103E400002C0D1E50220C1E5233CA0E10320D1E579
:103E50000330C1E50130D0E50220D0E5023483E132
:103E60000338A0E12328A0E1FF2002E20000D1E511
:103E70000020C1E5233CA0E10120D1E50130C1E5EE
:103E800088309FE5001083E50420A0E3060000EAE7
:103E90000020A0E364309FE5002083E564309FE5C7
:103EA0000020C3E564309FE5002083E560309FE596
:103EB0000020C3E51703A0E30D0A80E20110A0E390
:103EC000F82A00EB0020A0E35C309FE50020C3E56A
:103ED0001703A0E30D0A80E21010A0E3612B00EBB2
:103EE0001703A0E30D0A80E20110A0E3D82A00EB3B
:103EF00010A81BE96800000490090004D009000420
:103F000060090004E0090004C009000488090004F5
:103F100080090004D8090004C809000458130004EB
:103F2000A8090004A009000410090004980900046D
:103F30000DC0A0E170D82DE904B04CE218D04DE2DC
:103F40000A60A0E3E0309FE50020E0E30020C3E545
:103F50000120C3E50220C3E50320C3E50030D3E51B
:103F6000FF0053E31500001AC0409FE5B8509FE5DD
:103F70000100A0E36DFFFFEB7D0FA0E390F8FFEBE6
:103F8000000084E5020000EA0030D5E5FF0053E3BD
:103F90000300001A000094E58FF8FFEBFF0010E328
:103FA000F8FFFF0A013046E2FF6003E20030D5E58A
:103FB000FF0053E30100001A000056E3EBFFFF1A75
:103FC00064509FE50030D5E5FF0053E360009F0596
:103FD0001300000A2C404BE20020D5E5FF2002E24E
:103FE0000130D5E5FF3003E20210D5E5FF1001E214
:103FF000611081E200108DE50400A0E134109FE51E
:104000003B4A00EB0400A0E1431600EB0320D5E59A
:10401000FF2002E20400A0E11C109FE5344A00EBFF
:104020000400A0E13C1600EB70A81BE9D0090004D5
:1040300018040004DCB3010004B40100A8B30100BB
:104040000DC0A0E170D82DE904B04CE208D04DE2DB
:10405000B0009FE5301600EB030BE0E3BC2100EB62
:10406000020CA0E30110A0E33D2100EB020CA0E351
:104070000010A0E3502100EB010BA0E30110A0E32E
:10408000372100EB0109A0E30110A0E3292100EB97
:104090000109A0E30010A0E33C2100EB20004BE26B
:1040A000C92300EB0140A0E320104BE20140C1E531
:1040B0000260A0E320604BE50050A0E30250C1E5A0
:1040C0000340C1E5B440C1E11603A0E3060A80E263
:1040D0006B2300EBF70D00EB170D00EB0900A0E3DD
:1040E0000510A0E10620A0E1C22600EB0900A0E334
:1040F0000410A0E1142600EB083500EB08009FE552
:10410000051600EB70A81BE918B4010060B30100AC
:104110000DC0A0E100D82DE904B04CE2010050E34D
:104120001603A003060A80020210A0030020A003C9
:104130001603A013060A80120210A0130120A01378
:10414000B42300EB00A81BE90DC0A0E110D82DE9B5
:1041500004B04CE20040A0E30410A0E10430A0E170
:10416000012084E2FF4002E20330D0E7000053E385
:10417000F9FFFF1A023BA0E303E0A0E1463283E22D
:10418000003093E5303003E2200053E30D00000AD5
:10419000EACCA0E360C08CE20120A0E1013081E222
:1041A0000338A0E14318A0E10228A0E122085CE165
:1041B00010A81B3946328EE2003093E5303003E21E
:1041C000200053E3F3FFFF1A013084E2FF4003E2D3
:1041D000021CA0E30420A0E1E73400EB0100A0E30F
:1041E0000410A0E17E2D00EB0100A0E37F2C00EB8A
:1041F00010A81BE90DC0A0E100D82DE904B04CE2E5
:1042000004D04DE20D004BE50010A0E3023BA0E31B
:1042100003C0A0E1463283E2003093E5303003E290
:10422000200053E30D00000AEA0CA0E3600080E2E6
:104230000120A0E1013081E20338A0E14318A0E1B0
:104240000228A0E1220850E100A81B3946328CE286
:10425000003093E5303003E2200053E3F3FFFF1A10
:104260000D004BE2021CA0E30220A0E3C23400EBED
:104270000100A0E30210A0E3592D00EB0100A0E330
:104280005A2C00EB00A81BE90DC0A0E1F0DF2DE9DE
:1042900004B04CE200A0A0E10118A0E1011881E205
:1042A0004138A0E1211BA0E10050A0E3010071E32F
:1042B000F0AF1B09026BA0E3466286E20398A0E11F
:1042C000293BA0E10378A0E1018083E2003096E57C
:1042D000303003E2200053E3FBFFFF1A270855E1CB
:1042E0000600002A05038AE0021CA0E34020A0E3A8
:1042F000A13400EB0100A0E34010A0E3070000EAB6
:1043000005038AE03F4809E22448A0E1021CA0E33B
:104310000420A0E1983400EB0100A0E30410A0E128
:104320002F2D00EB0100A0E3302C00EB013085E2E3
:10433000FF5003E2080055E1F0AF1BA9E2FFFFEADE
:104340000020A0E3020050E10200000A0A30D0E59C
:10435000020053E10100001A0200A0E10EF0A0E10A
:10436000B030D0E17B3E43E20C3043E2832C82E16B
:104370000230D0E50F3003E2832A82E10330D0E53A
:104380001F3003E2032882E10430D0E51F3003E24E
:10439000832582E10530D0E53F3003E2832282E1CC
:1043A0000630D0E5A330A0E11F3003E2030082E134
:1043B0000EF0A0E104E02DE50000A0E30010A0E174
:1043C00038E09FE5013281E0033181E083218EE016
:1043D00002C0A0E12432FCE5000053E30200A0018A
:1043E0000130A0030030CC0504F09D04013081E2CF
:1043F000FF1003E2020051E304F09D84F0FFFFEAA6
:10440000200A0004000050E30EF0A0010F0000EAB3
:104410000030A0E3892FA0E30230C0E70C3081E731
:10442000043080E50830C0E5BA30C0E10C30C0E5AA
:10443000103080E5143080E5203280E5183080E5CA
:10444000BC31C0E11E30C0E50100A0E30EF0A0E1E8
:104450000020A0E32CC09FE5023282E0033182E01D
:104460008311A0E10C3081E0000053E1E7FFFF0A77
:10447000013082E2FF2003E2020052E30000A08349
:104480000EF0A081F3FFFFEA200A000410402DE99E
:104490000040A0E3D030D0E12F0053E30420A0116E
:1044A0000120A003040054E10700001AD23090E17B
:1044B0002F0053E30000531302408000013082E2DA
:1044C000FF2003E2000054E3F7FFFF0A0030A0E3FF
:1044D0000B30C1E503C0A0E12020A0E30C20C1E720
:1044E00001308CE2FFC003E20A005CE3FAFFFF9AAE
:1044F0000020A0E302C0A0E1D030D0E12F0053E3C0
:104500000120A003023080E0040053E11800002ADB
:104510000A005CE30700008AD23090E12E0053E3EA
:104520000600001A08005CE301308292FF2003922B
:1045300008C0A0930B00009A0000A0E31080BDE823
:1045400002E0D0E761304EE2190053E320304E9292
:104550000230D0870C30C1E7013082E2FF2003E255
:1045600001308CE2FFC003E2023080E0040053E13E
:10457000E6FFFF3A0400A0E11080BDE80008A0E1DA
:104580004008A0E138309FE50030D3E5000053E358
:104590000300A0010EF0A0010038A0E1010853E3E0
:1045A0000200A0930038A0E12338A0E1023043E2EA
:1045B0000C209FE50110D2E5102092E5912320E028
:1045C0000EF0A0E1000A00040DC0A0E100D82DE922
:1045D00004B04CE20020A0E12C309FE50000D3E5C0
:1045E000000050E300A81B091C309FE5100093E574
:1045F000020060E00110D3E5FE3E00EB020080E225
:104600000008A0E12008A0E100A81BE9000A0004BE
:104610000DC0A0E170D82DE904B04CE20060A0E329
:104620000640A0E150509FE5043284E0033184E06D
:10463000830185E0893F80E20030D3E5010053E348
:104640000300001A2E0500EB000086E00008A0E140
:104650004068A0E1013084E2FF4003E2020054E33D
:10466000F0FFFF9ADE0800EB0030A0E30C209FE58E
:104670000030C2E5FF0006E270A81BE9200A000432
:10468000000A00040DC0A0E130D82DE904B04CE2CE
:104690000040A0E360029FE59F1400EB5C329FE5C1
:1046A0000040C3E50400A0E154129FE50420A0E10E
:1046B000003280E0033180E0833181E0893F83E292
:1046C0000020C3E5013080E2FF0003E2020050E376
:1046D000F6FFFF9A28529FE57A0700EB000050E3AF
:1046E0000300000A1C029FE58B1400EB0140A0E3CD
:1046F000790000EA1F1085E20000A0E33E0900EB0C
:10470000000050E30300000AFC019FE5821400EB67
:104710000240A0E3700000EA1FC085E2073DA0E36D
:10472000023083E20330DCE7060053E30400531356
:104730000200000A0E0053E30040A0131500001A07
:10474000713FA0E3023083E20310DCE7713FA0E396
:10475000033083E20330DCE7031481E1723FA0E31E
:104760000320DCE7021881E1013083E20330DCE75B
:10477000034C81E11F1085E20400A0E11E0900EB5B
:10478000000050E30300000A80019FE5621400EB83
:104790000340A0E3500000EA1FC085E20B30DCE5D7
:1047A0000C20DCE5023483E1020C53E30300000A31
:1047B0005C019FE5581400EB0440A0E3460000EACA
:1047C00038119FE50D30DCE50130C1E51030DCE546
:1047D0000230C1E51130DCE51220DCE5023483E172
:1047E000B430C1E11630DCE51720DCE5023483E1AA
:1047F000B630C1E10E30DCE50F20DCE5023483E1A8
:10480000033084E0083081E5B600D1E10220D1E533
:10481000923023E00C3081E5B420D1E1223283E0F4
:10482000103081E52030DCE52120DCE5023483E135
:104830002220DCE5023883E12320DCE5023C93E121
:104840000300001ACC009FE5331400EB0540A0E301
:10485000210000EAA4109FE52030DCE52120DCE502
:10486000023483E12220DCE5023883E12320DCE509
:10487000023C83E1102091E5023083E0013043E205
:10488000143081E5D633DCE1460053E30F00001A13
:10489000D733DCE1410053E30C00001AD833DCE1EC
:1048A000540053E30900001AD933DCE1310053E32B
:1048B0000600001ADA33DCE1360053E30120A003DE
:1048C00038309F050020C3050040A0030200000A05
:1048D00044009FE5101400EB0640A0E3000054E301
:1048E0000100000A49FFFFEB010000EA2C009FE5F0
:1048F000091400EB0400A0E130A81BE928B4010072
:10490000000A0004200A00043CB4010060B4010065
:1049100078B4010090B40100B0B40100CCB401003F
:1049200060B301000DC0A0E170D82DE904B04CE2E5
:104930000050A0E10160A0E38C309FE50030D3E59A
:10494000000050E3000053130000A00370A81B09EF
:104950000040A0E30410A0E17F2FA0E3032082E247
:10496000053084E01C3083E20310C3E5014084E29B
:10497000020054E1F9FFFF9A0040A0E348309FE5B0
:104980000130D3E5030054E10D00002A040095E551
:10499000000084E0200285E51F1085E2300800EB6E
:1049A000000050E30100000A18FFFFEB0060A0E3E5
:1049B000014084E210309FE50130D3E5030054E16B
:1049C000F1FFFF3A0600A0E170A81BE9000A00040D
:1049D0000DC0A0E170D82DE904B04CE20040A0E188
:1049E0000060A0E3C8309FE50030D3E5060050E149
:1049F000060053110600A00170A81B09B0509FE5E6
:104A0000103095E5040090E5000053E12500008A90
:104A1000143095E5030050E12200008AE9FEFFEB27
:104A20000068A0E1A627A0E1083095E5A20483E094
:104A30000150C2E3855BA0E1A55BA0E1203294E5D3
:104A4000000053E10700000A200284E51F1084E201
:104A5000690800EB000050E30200000AEBFEFFEBE8
:104A60002608A0E170A81BE9053084E01F20F3E5CB
:104A70000130D3E5032482E10228A0E14268A0E1ED
:104A8000090872E30060A0830600008A0608A0E11E
:104A90002008A0E1B8FEFFEB040084E50030A0E3AD
:104AA0000830C4E5BA30C4E10638A0E12308A0E12B
:104AB00070A81BE9000A00040DC0A0E1F0D92DE99F
:104AC00004B04CE20060A0E10080A0E3EC309FE580
:104AD0000030D3E5080050E1080053110800A001A0
:104AE000F0A91B09030000EAC8FEFFEB0838A0E1AB
:104AF0002308A0E1F0A91BE90070A0E3BC309FE50A
:104B0000080093E5000087E0200286E51F1086E29A
:104B1000390800EB000050E3F2FFFF1A1F5086E255
:104B20000040A0E30438A0E12318A0E18120D5E7EC
:104B3000810085E00130D0E5033492E10C00001AD9
:104B40000030E0E38130C5E70130C0E5200296E5A2
:104B50001F1086E2C20700EB000050E3E1FFFF1ADE
:104B60008734A0E1A33084E00338A0E14388A0E1CA
:104B7000014CA0E3013084E20338A0E14348A0E106
:104B8000FF0853E3E6FFFF9A017087E22C309FE5B0
:104B9000B620D3E10838B0E10030A0130130A00303
:104BA000020057E10030A02301300332000053E33C
:104BB0000838A0012308A001F0A91B09CEFFFFEAD5
:104BC000000A00040DC0A0E1F0D82DE904B04CE2C9
:104BD0000040A0E10228A0E14228A0E10050A0E3AB
:104BE00008319FE50030D3E5050050E10500531181
:104BF0000500A001F0A81B09010052E30600000A0D
:104C0000020000CA000052E30050A003010000EAC5
:104C1000020052E3105090050000000A145094E581
:104C2000015095E02C00004A103094E5030055E156
:104C3000290000CA003094E5043084E50030A0E388
:104C40000830C4E5BA30C4E1143084E5050053E10E
:104C50002100002A7F67A0E3036886E2143094E510
:104C6000013083E2143084E5BA30D4E1013083E2CC
:104C7000BA30C4E1BA30D4E1260853E11300009AF7
:104C80000030A0E30370A0E1BA30C4E10830D4E5FD
:104C9000013083E20830C4E50820D4E54C309FE5BC
:104CA0000130D3E5030052E10800003A0400A0E11E
:104CB00046FFFFEB0008B0E10870C4150830D405CA
:104CC000013043020830C405023CA003BA30C401DD
:104CD000143094E5050053E1DFFFFF3A143094E50A
:104CE000050053E10100A0130000A003F0A81BE998
:104CF000000A00040DC0A0E1F0D92DE904B04CE297
:104D000002DC4DE20008A0E14008A0E10070A0E351
:104D10000780A0E1DC309FE50030D3E5070053E1D8
:104D20000700A001F0A91B090038A0E1A307A0E13A
:104D3000C0309FE5083093E5A05483E00140C0E314
:104D4000844BA0E1A44BA0E1080055E10600000A55
:104D50000580A0E10500A0E1221E4BE2A60700EBC2
:104D6000000050E30000A013F0A91B19223E4BE203
:104D7000041083E00420D3E70130D1E5032482E16D
:104D80000228A0E1023842E2130873E30070A08316
:104D90000170A0930060A0E30060C1E50160C1E57F
:104DA000A207A0E14C309FE5083093E5A05483E0D2
:104DB0000140C0E3844BA0E1A44BA0E1013027E215
:104DC000080055E101308313060053E10500000A95
:104DD0000800A0E1221E4BE2210700EB060050E193
:104DE0000600A011F0A91B19000057E30100A00361
:104DF000F0A91B09D3FFFFEA000A00040DC0A0E1DF
:104E000070D82DE904B04CE20040A0E10060A0E3BE
:104E1000E0309FE50030D3E5060050E10600531175
:104E20000600A00170A81B0922FFFFEB0008A0E10B
:104E30004068A0E1000050E32B00000A0400A0E15C
:104E40000010A0E30220A0E35DFFFFEB040094E567
:104E5000DCFDFFEB0008A0E1A007A0E194309FE596
:104E6000083093E5A02483E00150C0E3855BA0E116
:104E7000A55BA0E1203294E5020053E10500000AA1
:104E8000202284E51F1084E20200A0E15A0700EB13
:104E9000000050E30A00001A052084E00638A0E173
:104EA0002318A0E11F10E2E5233CA0E10130C2E598
:104EB0001F1084E2200294E5E90600EB000050E3B5
:104EC0000200000AD1FDFFEB0000A0E370A81BE97F
:104ED0000608A0E12008A0E1A7FDFFEB040084E59F
:104EE0000030A0E30830C4E5BA30C4E10638A0E1E0
:104EF0002308A0E170A81BE9000A00040DC0A0E18E
:104F0000F0DF2DE904B04CE210D04DE20090A0E1BA
:104F10000370A0E1FF1001E22C100BE5FF2002E27C
:104F200030200BE50010A0E338100BE50140A0E1B4
:104F3000C0329FE50030D3E5010057E10100531175
:104F40002C00000A010050E12A00000A0030A0E312
:104F5000003087E5183097E5000053E30600001A9B
:104F600090329FE5B420D3E14222A0E134200BE54A
:104F70000C3093E5003087E5140000EA74129FE5D9
:104F80000C3091E5182097E5020053E10500008AF6
:104F9000103091E5030052E1B430D1314332A031F9
:104FA00034300B350900003A48229FE5103092E575
:104FB000181097E5010053E10E00008A143092E5C5
:104FC000030051E10B00008A0120D2E534200BE5FB
:104FD000003097E5000053E31B00001A180097E526
:104FE000200287E51F1087E2030700EB000050E373
:104FF0000200000A85FDFFEB0400A0E1F0AF1BE911
:105000001F5087E2BC31D7E18332D5E7000053E37C
:10501000F8FFFF0AE50053E3F6FFFF0ABC31D7E1D2
:10502000833285E00B30D3E5100013E3F1FFFF0A74
:10503000BC31D7E1833285E01A00D3E51B30D3E5DC
:10504000030480E14CFDFFEB000087E5003097E5AD
:10505000043087E50030A0E30830C7E5BA30C7E187
:1050600000A0A0E3043097E503808AE0208287E572
:105070000800A0E11F1087E2DF0600EB000050E30C
:10508000DBFFFF1A1F5087E20060A0E30638A0E1B3
:105090000300A0E12338A0E18322D5E7000052E31A
:1050A0003300000AE50052E33100000A8322A0E148
:1050B000053082E00B30D3E530101BE5033001E012
:1050C0002C101BE5010053E12900001A0010A0E399
:1050D000D52092E1D13099E1030052E10900001A94
:1050E000A005A0E1013081E2FF1003E20A0051E3D4
:1050F0000400008A013080E0D52093E1D13099E1AD
:10510000030052E1F6FFFF0A090051E31800009A7C
:105110000648A0E1A44585E00B30D4E51E30C7E584
:105120001A00D4E51B30D4E5030480E112FDFFEB47
:10513000000087E5040087E50030A0E30830C7E5FC
:10514000BA30C7E1188087E5BC61C7E11C30D4E5FF
:105150001D20D4E5023483E11E20D4E5023883E12A
:105160001F20D4E5023C83E1103087E50140A0E335
:105170001060A0E3013086E20338A0E14368A0E1BB
:105180000F0853E3C0FFFF9A01A08AE2013024E236
:1051900034201BE502005AE10030A0230130033225
:1051A000000053E3AEFFFF1A000054E30900001AA9
:1051B00040309FE5102093E5043097E5030052E16D
:1051C0000400008A0700A0E100FEFFEB0008A0E158
:1051D0004008A0E138000BE538301BE50338B0E1AA
:1051E0000030A0030130A0130430D3E10400A0017B
:1051F000F0AF1B0999FFFFEA000A00040DC0A0E10F
:10520000F0DF2DE904B04CE228D04DE200A0A0E18F
:105210000260A0E1FF9001E20080A0E33C800BE58A
:1052200040800BE544800BE524349FE50030D3E556
:10523000080052E1080053112D00000A080050E157
:105240002B00000A0030A0E3003082E5181092E540
:10525000030051E10700001AF4339FE5B420D3E1C5
:105260004222A0E130200BE53C100BE50C3093E529
:10527000003086E5140000EAD4139FE50C3091E578
:10528000182092E5020053E10500008A103091E5F4
:10529000030052E1B430D1314332A03130300B350C
:1052A0000900003AA8239FE5103092E5181096E512
:1052B000010053E10E00008A143092E5030051E131
:1052C0000B00008A0120D2E530200BE5003096E586
:1052D000000053E31F00001A180096E5200286E53F
:1052E0001F1086E2440600EB000050E30200000AB3
:1052F000C6FCFFEB44001BE5F0AF1BE91F5086E244
:10530000BC31D6E18332D5E7000053E3F8FFFF0A52
:10531000E50053E3F6FFFF0ABC31D6E1833285E0B6
:105320000B30D3E5100013E3F1FFFF0ABC31D6E1E7
:10533000833285E01A00D3E51B30D3E5030480E116
:105340000008A0E14018A0E13C100BE52008A0E116
:1053500089FCFFEB000086E50600A0E1D5FDFFEB30
:105360000008A0E14028A0E138200BE5000050E350
:10537000B500000A003096E5043086E50030A0E371
:105380000830C6E50030A0E32C300BE5043096E58C
:105390002C101BE5033081E034300BE5203286E52C
:1053A0000300A0E11F1086E2130600EB000050E3AB
:1053B000CEFFFF1A1F5086E20080A0E338201BE5D5
:1053C0000238A0E12318A0E148100BE5FF2001E21C
:1053D0004C200BE50870A0E1233CA0E150300BE528
:1053E0000838A0E1A335D5E7000053E30100000A27
:1053F000E50053E37000001A0010A0E30838A0E1B4
:10540000A305A0E1013080E00120DAE70520C3E731
:10541000013081E2FF1003E20A0051E3F8FFFF9A36
:105420000848A0E1A44585E00B90C4E54C301BE59D
:105430001A30C4E550101BE51B10C4E514029FE5AB
:10544000BEFBFFEB1600C4E52034A0E11730C4E535
:105450002038A0E11830C4E5200CA0E11900C4E513
:105460001C70C4E51D70C4E51E70C4E51F70C4E562
:10547000200296E51F1086E2790500EB000050E35C
:105480009AFFFF1A48001BE53BFCFFEB000086E596
:10549000040086E50870C6E5BA70C6E11E90C6E550
:1054A000107086E534201BE5182086E5BC81C6E136
:1054B000100019E33D00000A0600A0E118FDFFEB13
:1054C000000096E5200286E51F1086E2CA0500EB83
:1054D000000050E385FFFF1A1F5086E22E30A0E344
:1054E0001F30C6E50110A0E32020A0E30120C5E79E
:1054F000013081E2FF1003E20A0051E3FAFFFF9A54
:105500001030A0E30B30C5E54C301BE51A30C5E583
:1055100050101BE51B10C5E51670C5E51770C5E5F5
:105520001870C5E51970C5E51C70C5E51D70C5E5A9
:105530001E70C5E51F70C5E52E30A0E32030C5E51F
:105540002130C5E50210A0E32020A0E3013085E072
:105550002020C3E5013081E2FF1003E20A0051E39D
:10556000F9FFFF9A1030A0E32B30C5E53C201BE586
:105570003A20C5E52234A0E13B30C5E53670C5E5EB
:105580003770C5E53870C5E53970C5E53C70C5E5CF
:105590003D70C5E53E70C5E53F70C5E5200296E566
:1055A0001F1086E22E0500EB000050E34FFFFF1AAC
:1055B0000130A0E344300BE51080A0E3013088E225
:1055C0000338A0E14388A0E10F0853E383FFFF9A6B
:1055D0002C101BE5011081E22C100BE544201BE58B
:1055E000013022E230201BE5020051E10030A0230F
:1055F00001300332000053E363FFFF1A44301BE520
:10560000000053E30900001A44309FE5102093E5A1
:10561000043096E5030052E10400008A0600A0E190
:10562000EAFCFFEB0008A0E14008A0E140000BE528
:1056300040101BE50118B0E10030A0030130A013B9
:1056400044201BE50220D3E14DFFFF1A44001BE577
:10565000F0AF1BE9000A0004800800040DC0A0E1BF
:10566000F0D92DE904B04CE20CD04DE20350A0E19A
:10567000FF8001E2FF7002E20060A0E3060053E158
:10568000060050110300000AB4309FE50030D3E556
:10569000060053E10100001A0000A0E3F0A91BE995
:1056A0000030A0E3183085E5BC31C5E1D020D0E161
:1056B000013026E2000052E30030A0030130031263
:1056C000000053E31C00000A2C104BE26EFBFFEBC2
:1056D0000040A0E1000050E30A00000AD030D0E111
:1056E000000053E30810A0010720A0011010A01330
:1056F0001820A0132C004BE20530A0E1FEFDFFEBCB
:10570000FF0010E30100001A0600A0E1F0A91BE968
:10571000D030D4E1000053E30160A0030400A0E115
:10572000D020D4E1013026E2000052E30030A00393
:1057300001300312000053E3E2FFFF1A0600A0E16C
:10574000F0A91BE9000A00040DC0A0E1F0D92DE981
:1057500004B04CE20CD04DE20260A0E1FF8001E217
:105760000070A0E3070052E1070050110300000A97
:10577000DC309FE50030D3E5070053E10100001A5B
:105780000000A0E3F0A91BE90030A0E3183082E597
:10579000BC31C2E1D020D0E1013027E2000052E369
:1057A0000030A00301300312000053E32600000A7A
:1057B0002C104BE234FBFFEB0040A0E1000050E373
:1057C0001700000AD010D0E1000051E30150A00101
:1057D0001050A0131820A0E32C004BE20510A0E10C
:1057E0000630A0E1C4FDFFEBFF0010E30E00001A3D
:1057F000D030D4E1000053E30850A0012C004BE26C
:105800000510A0E10620A0E17BFEFFEBFF0010E306
:105810000300000AD030D4E1000053E30170A0037C
:10582000010000EA0700A0E1F0A91BE90400A0E1E3
:10583000D020D4E1013027E2000052E30030A00381
:1058400001300312000053E3D8FFFF1A0700A0E164
:10585000F0A91BE9000A00040DC0A0E170D82DE9F1
:1058600004B04CE20050A0E1FF6001E20040A0E380
:1058700080319FE50030D3E5040050E1040053116E
:105880004600000ACAFAFFEB0040A0E1000050E326
:1058900070A81B090010A0E3001080E5041080E54B
:1058A0000810C0E5BA10C0E10C60C0E5101080E53A
:1058B000141080E5201280E5181080E5BC11C0E1CD
:1058C0001E10C4E50500A0E11820A0E30430A0E10B
:1058D00061FFFFEBFF0010E33200000A063CA0E18D
:1058E000431CA0E1720051E32400000A020000CA38
:1058F000610051E30300000A250000EA770051E34C
:105900000700000A220000EA1E30D4E5010013E37C
:105910000400A0010010A0030220A0031A00000A46
:105920001B0000EA1E30D4E5010013E31800001A42
:10593000000094E523FBFFEB0008A0E12008A0E1B4
:10594000EBFCFFEB0400A0E15AFCFFEB0008A0E138
:105950002008A0E108FBFFEB000084E5040084E5DB
:105960000020A0E30820C4E5BA20C4E1102084E5AB
:10597000142084E50400A0E10210A0E1020000EA86
:105980000400A0E10010A0E30120A0E18CFCFFEBEB
:10599000020000EA0400A0E1590000EB0040A0E38F
:1059A0000400A0E170A81BE9063CA0E1431CA0E1B3
:1059B000720051E30A00000A010000CA610051E3CD
:1059C000000000EA770051E30500001A0500A0E19D
:1059D0002010A0E30420A0E15AFFFFEBFF5010E2EB
:1059E0000200001A0400A0E1450000EB0040A0E323
:1059F0000400A0E170A81BE9000A00040DC0A0E1AA
:105A000070D82DE904B04CE20060A0E1000050E342
:105A10001400000AE0309FE50030D3E5000053E3B6
:105A20001000000A0C30D0E5720053E30D00000AAC
:105A3000010000CA610053E3000000EA770053E36D
:105A40000800001ABA30D6E1000053E30700000A4C
:105A50001F1086E2200296E5010400EB000050E3EF
:105A60000200000AE9FAFFEB0000E0E370A81BE97E
:105A7000180096E5200286E51F1086E25E0400EB22
:105A8000000050E3F6FFFF1A1F5086E2BC21D6E16A
:105A90001030D6E5822285E01C30C2E51130D6E513
:105AA0001D30C2E51230D6E51E30C2E51330D6E512
:105AB0001F30C2E5BC41D6E140009FE51FFAFFEB75
:105AC000844285E01600C4E52034A0E11730C4E527
:105AD0002038A0E11830C4E5200CA0E11900C4E58D
:105AE000200296E50510A0E1DD0300EB000050E385
:105AF0000000A00370A81B09D9FFFFEA000A0004F8
:105B0000800800040DC0A0E130D82DE904B04CE2BB
:105B10000040A0E10050E0E3000050E30500A001D8
:105B200030A81B09B4FFFFEB0008A0E14058A0E13A
:105B30000400A0E132FAFFEB0500A0E130A81BE968
:105B40000DC0A0E170D82DE904B04CE20040A0E106
:105B50000050E0E3E4309FE50030D3E5000050E37F
:105B6000000053131200000A102090E5000052E3D9
:105B70003000000A143090E5013083E2020053E166
:105B80002C00002A040090E50830D4E5030080E0F2
:105B9000203294E5000053E10700000A200284E56A
:105BA0001F1084E2140400EB000050E30200000A1E
:105BB00096FAFFEB0500A0E170A81BE9BA20D4E13A
:105BC000043082E01F50D3E5143094E5013083E2C5
:105BD000143084E5012082E2BA20C4E1BA30D4E175
:105BE000020C53E31300003A0030A0E30360A0E18D
:105BF000BA30C4E10830D4E5013083E20830C4E5AE
:105C00000820D4E534309FE50130D3E5030052E1AC
:105C10000800003A0400A0E16CFBFFEB0008B0E1D3
:105C20000860C4150830D405013043020830C405AB
:105C3000023CA003BA30C4010500A0E170A81BE932
:105C4000000A00040DC0A0E130D82DE904B04CE2F8
:105C50000140A0E1FF5000E238319FE50030D3E57C
:105C6000000051E3000053131600000A142091E5D0
:105C7000103091E5030052E10600003ABA30D1E15C
:105C8000020C53E30300003A0100A0E15AFCFFEBD1
:105C90000008B0E10B00000A040094E50830D4E5E8
:105CA000030080E0203294E5000053E10700000A81
:105CB000200284E51F1084E2CF0300EB000050E3D4
:105CC0000200000A51FAFFEB0000E0E330A81BE9F4
:105CD000BA30D4E1043083E01F50C3E5102084E2E1
:105CE0000C0092E8030052E101308202103084057A
:105CF000143094E5013083E2143084E5BA30D4E105
:105D0000013083E2BA30C4E1BA30D4E1020C53E38B
:105D10001E00003A1F1084E2200294E5500300EBBD
:105D2000000050E3E6FFFF1A0030A0E3BA30C4E100
:105D30000830D4E5013083E20830C4E50820D4E51A
:105D400050309FE50130D3E5030052E10F00003AE7
:105D50000400A0E11DFBFFEB0008B0E10030A01340
:105D60000830C4150900001A0400A0E122FCFFEB72
:105D70000008B0E10500001A0830D4E5013043E224
:105D80000830C4E5023CA0E3BA30C4E1CDFFFFEA2D
:105D90000000A0E330A81BE9000A00040DC0A0E148
:105DA000F0DD2DE904B04CE20140A0E102A0A0E149
:105DB0000370A0E10080A0E30160A0E3A0309FE5B4
:105DC0000030D3E5080057E1080053110100000A34
:105DD000080050E10100001A0000A0E3F0AD1BE94B
:105DE0000050A0E1020058E10030A023013006324B
:105DF000000053E31800000A000054E30030A00341
:105E000001300612000053E30C00000A0700A0E175
:105E10004AFFFFEB0008A0E14008A0E1010070E3A9
:105E20000100C514014044120060A003000054E3C7
:105E30000030A00301300612000053E3F2FFFF1A06
:105E4000000056E3018088120A0058E10030A023C8
:105E500001300632000053E3E6FFFF1A0800A0E11C
:105E6000F0AD1BE9000A00040DC0A0E1F0DD2DE952
:105E700004B04CE20150A0E102A0A0E10370A0E157
:105E80000080A0E30160A0E3A0309FE50030D3E5EF
:105E9000080057E1080053110100000A080050E112
:105EA0000100001A0000A0E3F0AD1BE90040A0E1F2
:105EB000020058E10030A02301300632000053E315
:105EC0001800000A000055E30030A003013006125C
:105ED000000053E30C00000AD000D4E10710A0E159
:105EE00057FFFFEB0008A0E1010870E301408412B6
:105EF000015045120060A003000055E30030A003EC
:105F000001300612000053E3F2FFFF1A000056E3CF
:105F1000018088120A0058E10030A02301300632C7
:105F2000000053E3E6FFFF1A0800A0E1F0AD1BE913
:105F3000000A00040DC0A0E170D82DE904B04CE2C5
:105F40000040A0E10160A0E10020A0E30250A0E138
:105F500060309FE50030D3E5020051E102005311AB
:105F60000100000A020050E10100001A0000A0E355
:105F700070A81BE9D23090E10300A0E1000053E3D8
:105F8000010072130900000A0610A0E12CFFFFEBCC
:105F90000008A0E14028A0E1013085E2FF5003E2C3
:105FA000D50094E1000050E301007213F5FFFF1AE1
:105FB0000200A0E170A81BE9000A00040DC0A0E1E6
:105FC000F0D82DE904B04CE20070A0E10260A0E13D
:105FD0000000A0E36C309FE50030D3E5000052E103
:105FE000000053110300000A000057E10040A01117
:105FF0000750A0110F00001A0000A0E3F0A81BE951
:106000000600A0E1CDFEFFEB0008A0E14008A0E102
:10601000010070E30100000A0A0050E30100001AC9
:106020000000A0E30140A0E30100C5E4013044E228
:106030000338A0E14348A0E1010054E30700A0D1E8
:10604000F0A81BD9EDFFFFEA000A00040DC0A0E193
:1060500070D82DE904B04CE20040A0E10060A0E35C
:10606000D3F8FFEB0050A0E10400A0E10610A0E18E
:106070001820A0E30530A0E177FDFFEBFF6000E210
:106080000500A0E1DEF8FFEB0600A0E170A81BE927
:106090000030A0E1140090E5010080E2103093E5AB
:1060A000030050E10000A0330100A0230EF0A0E1A6
:1060B00030402DE90050A0E10140A0E10000A0E344
:1060C0000010A0E1040050E11100002A01C0D5E752
:1060D00000E0A0E38030A0E1FF0003E280200CE2BA
:1060E000803003E2030052E1090020128C30A0E16D
:1060F000FFC003E201308EE2FFE003E207005EE34F
:10610000F3FFFF9A013081E2FF1003E2040051E146
:10611000EDFFFF3A8030A0E1013083E3FF0003E2AE
:106120003080BDE80DC0A0E130D82DE904B04CE2CC
:106130000040A0E11F0400EB470300EB0400A0E1D6
:106140001FF0FFEB0050A0E1020400EBFF4000E273
:106150000500A0E120F0FFEBFF0010E30100001AB2
:10616000FF0054E3F7FFFF1A0400A0E130A81BE989
:106170000DC0A0E170D82DE904B04CE208D04DE28A
:106180000150A0E1FF4000E20060A0E3090400EB41
:10619000310300EB7D0FA0E3E1FFFFEB050400EB13
:1061A000EC0300EB404084E320404BE5253CA0E1BC
:1061B0001F304BE52538A0E11E304BE52534A0E12A
:1061C0001D304BE51C504BE520004BE20510A0E3D1
:1061D000B6FFFFEB1B004BE50640A0E10438A0E151
:1061E00018204BE2233882E0080053E5040400EB5A
:1061F000013084E20338A0E14348A0E1050853E3FD
:10620000F5FFFF9AEB0300EBD20300EBFF0000E287
:106210000620A0E1013086E20338A0E14368A0E156
:106220000228A0E17D0752E370A81B89FF0050E31C
:1062300070A81B19F3FFFFEA0DC0A0E130D82DE9CB
:1062400004B04CE20150A0E1FF4000E23700A0E3BF
:106250000010A0E3C5FFFFEBFF0000E2800010E3A9
:1062600030A81B190400A0E10510A0E1BFFFFFEB5F
:10627000FF0000E230A81BE90DC0A0E1F0D82DE935
:1062800004B04CE20270A0E10360A0E1FF0000E274
:10629000B6FFFFEBFF4010E20450A0131500001AF8
:1062A000C40300EBAB0300EBFF4000E2F00010E39F
:1062B0000A50A0030F00000AFE0054E3F8FFFF1A83
:1062C0000050A0E3060055E10700002AA10300EBFF
:1062D0000538A0E12308C7E7013085E20338A0E1D3
:1062E0004358A0E1230856E1F7FFFF8A990300EB2A
:1062F000980300EB0050A0E3000055E30600000AFD
:106300001C009FE51C109FE50520A0E10430A0E1E2
:10631000774100EB08009FE57F0D00EB0500A0E151
:10632000F0A81BE9C8120004F0B401000DC0A0E100
:10633000F0D82DE904B04CE23CD04DE20070A0E171
:1063400050504BE20040A0E10120D4E40500A0E160
:1063500008119FE5664100EB0500A0E16E0D00EB22
:1063600058604BE20600A0E10410A0E10220A0E387
:10637000744100EB0040A0E356404BE50500A0E16E
:10638000DC109FE50620A0E1594100EB0500A0E1EB
:10639000610D00EB031087E20600A0E10520A0E3F9
:1063A000684100EB53404BE50500A0E1B4109FE5C8
:1063B0000620A0E14E4100EB0500A0E1560D00EBE8
:1063C0000830D7E52322A0E10F3003E20500A0E169
:1063D00094109FE5464100EB0500A0E14E0D00EB57
:1063E00088009FE54C0D00EB0450A0E150404BE2CB
:1063F0000538A0E1233887E00920D3E50400A0E1B7
:106400006C109FE53A4100EB0400A0E1420D00EB67
:10641000013085E20338A0E14358A0E1030853E3CB
:10642000F2FFFF9A4C009FE53B0D00EB0E50D7E5C5
:106430000D30D7E50332A0E1253283E150404BE235
:106440000F2005E27D3E83E20400A0E128109FE5D5
:10645000274100EB0400A0E12F0D00EBF0A81BE9A1
:1064600024B5010040B5010058B501006CB501002C
:1064700084B5010094B501009CB701009CB50100F2
:106480000DC0A0E100D82DE904B04CE20020A0E14D
:106490000A00A0E30010A0E31030A0E375FFFFEBBB
:1064A00000A81BE90DC0A0E100D82DE904B04CE222
:1064B0000020A0E10900A0E30010A0E31030A0E359
:1064C0006CFFFFEB00A81BE90DC0A0E170D82DE91F
:1064D00004B04CE23CD04DE20050A0E31603A0E330
:1064E0000B0A80E20810A0E3BF1A00EBFF0010E3E4
:1064F0001A01001A88049FE5070D00EB680200EB03
:1065000080049FE5040D00EB7C049FE5020D00EB89
:1065100078349FE50050C3E5580200EB250300EBFB
:10652000FF00A0E3360300EB015085E20E0055E3C7
:10653000FAFFFF9A030000EA0530A0E1015085E26E
:10654000140053E3DD00008A0000A0E30010A0E186
:1065500006FFFFEBFF0000E2010050E3F5FFFF1A2A
:106560000800A0E36A1FA0E3021081E2FFFEFFEB38
:1065700054004BE5D4355BE1000053E34C404BB293
:1065800054205BB50400A0B104149FB5D30000BA39
:1065900054305BE5040013E30B00000AEC339FE585
:1065A0000120D3E50010A0E3012081E30120C3E531
:1065B0000220D3E50210C3E50320D3E50310C3E5B1
:1065C0000420D3E50410C3E51B0000EABC339FE5BB
:1065D0000120D3E50010A0E3022081E30120C3E500
:1065E0000220D3E50210C3E50320D3E50310C3E581
:1065F0000420D3E50410C3E50150A0E318304BE2BA
:10660000054083E0D30200EB3C0044E5015085E205
:10661000040055E3F8FFFF9A50305BE5AA0053E30E
:1066200070039F15AF00001A51305BE50F3003E295
:10663000010053E360039F151E00001A3A00A0E317
:106640000010A0E3C9FEFFEB54004BE5D4355BE13D
:10665000000053E34C404BB254205BB50400A0B1A2
:1066600038139FB59D0000BA54305BE5040013E376
:106670000150A0030300000A24039FE5A60C00EBD1
:106680000660A0E3B30000EA18304BE2054083E067
:10669000B00200EB3C0044E5015085E2040055E304
:1066A000F8FFFF9A52305BE5303003E2300053E3ED
:1066B0000300000AEC029FE5970C00EB0560A0E3E5
:1066C000A40000EA7D0EA0E3BDEEFFEB0050A0E1C8
:1066D0002900A0E30010A0E3D6FEFFEB54004BE539
:1066E000D4355BE1000053E3780000BA0500A0E177
:1066F000B9EEFFEBFF0010E37D00001A54305BE5BC
:10670000010013E3F1FFFF1A000053E398029F1505
:106710007800001A1000A0E3021CA0E393FEFFEB38
:10672000FF0010E30300000A80029FE57A0C00EBF3
:106730000B60A0E3870000EA74029FE54FFFFFEBC8
:106740000060A0E1000050E368029F150500001AF8
:1067500064029FE552FFFFEB0060A0E1000050E300
:106760000200000A54029FE56B0C00EB790000EA7E
:106770004C029FE5680C00EB10329FE51930D3E521
:106780002333B0E10200000A010053E31A00000ABB
:10679000310000EAF4119FE51E00D1E50F0000E290
:1067A0001FC0D1E503C00CE22030D1E50331A0E1E8
:1067B0000CC583E12130D1E523C38CE12220D1E552
:1067C000032002E22330D1E5A333A0E1823083E14C
:1067D00001208CE2023083E21223A0E11220A0E12A
:1067E000FF3002E20500D1E50530C1E52234A0E129
:1067F000FF3003E20600D1E50E0000EA8C119FE5B0
:1068000020C0D1E53FC00CE22130D1E50334A0E146
:106810000CC883E12230D1E503C08CE18C29A0E1D2
:10682000022782E2FF3002E20500D1E50530C1E532
:106830000630D1E50030A0E30630C1E52238A0E102
:10684000FF3003E20700D1E50730C1E5222CA0E1CB
:106850000830D1E50820C1E5090000EA2C319FE5A8
:106860000520D3E50020A0E30520C3E50610D3E50D
:106870000620C3E50710D3E50720C3E50810D3E5DC
:106880000820C3E504119FE50130D1E50220D1E5E0
:10689000023483E10320D1E5023883E10420D1E50D
:1068A000023C83E1010053E30200000A020053E3CB
:1068B0001300000A140000EA08019FE5110000EA35
:1068C00004019FE5140C00EB0260A0E3210000EA44
:1068D0004C404BE254205BE50400A0E1EC109FE546
:1068E000034000EB0400A0E10B0C00EB0460A0E30C
:1068F000180000EAD8009FE5070C00EB0360A0E356
:10690000140000EACC009FE5030C00EB7C409FE5FF
:106910000520D4E50630D4E5032482E10730D4E530
:10692000032882E10830D4E5032C82E14C504BE28D
:10693000222AA0E10500A0E19C109FE5EC3F00EBBE
:106940000500A0E1F40B00EB090084E276FEFFEB0A
:106950000130A0E30030C4E5480100EB060000EA86
:10696000BF0100EB0020A0E320309FE50020C3E53D
:106970000160A0E364009FE5E70B00EB0600A0E1E7
:1069800070A81BE9B8B5010060B30100C8B50100EB
:1069900098100004D8B50100ECB501000CB6010058
:1069A0002CB6010040B6010050B6010070B60100DF
:1069B0007CB60100A1100004A0B60100B1100004D3
:1069C000B8B60100CCB60100D4B60100E4B60100AF
:1069D000F4B6010008B7010018B7010030B7010094
:1069E00048B701000DC0A0E110D82DE904B04CE279
:1069F00060009FE5C80B00EB990100EB58309FE564
:106A00000040A0E30040C3E50520D3E50540C3E511
:106A10000620D3E50640C3E50720D3E50740C3E5DC
:106A20000820D3E50840C3E50120D3E50140C3E5D4
:106A30000220D3E50240C3E50320D3E50340C3E5CC
:106A40000420D3E50440C3E510009FE5B20B00EB42
:106A50000400A0E110A81BE95CB701009810000435
:106A600060B301000DC0A0E1F0D92DE904B04CE203
:106A70000170A0E10060A0E38034A0E11800A0E371
:106A80000310A0E1B9FDFFEBFF4010E20450A0139A
:106A90004C00001AC70100EB0040A0E3AD0100EB81
:106AA000013084E20338A0E14348A0E1130853E336
:106AB000F9FFFF9A0700A0E1021CA0E3190400EB14
:106AC0000008A0E14088A0E1FE00A0E3CC0100EBBB
:106AD0000040A0E37F57A0E3035885E20438A0E11B
:106AE0002308D7E7C60100EB013084E20338A0E1B8
:106AF0004348A0E1050053E1F7FFFF9A0808A0E131
:106B0000200CA0E1BE0100EBFF0008E2BC0100EB9D
:106B1000A80100EB8F0100EBFF4000E20620A0E19E
:106B2000013086E20338A0E14368A0E10228A0E139
:106B30007D0752E31C00008A113004E2010053E398
:106B4000F3FFFF1A1F3004E20B0053E30850A003C9
:106B50001C00000A020000CA050053E30500000AF9
:106B6000020000EA1D0053E30950A0031500000ACB
:106B70000C50A0E3130000EA0050A0E37D0EA0E358
:106B800067FDFFEBFF4000E2FF0054E30600001A40
:106B90000D00A0E30010A0E374FDFFEBFF4010E246
:106BA0000450A0130600001A010000EA0750A0E3F9
:106BB000040000EA670100EBFF4010E20100000A58
:106BC0000950A0E3630100EB000055E30600000A52
:106BD0001C009FE51C109FE50520A0E10430A0E10A
:106BE000433F00EB08009FE54B0B00EB0500A0E1E5
:106BF000F0A91BE9C812000470B701000DC0A0E1A4
:106C000000D82DE904B04CE20120A0E18034A0E1DD
:106C10001100A0E30310A0E1023CA0E395FDFFEB0F
:106C200000A81BE90010A0E328009FE5813081E067
:106C3000033181E0033181E0003083E03220D3E58D
:106C40003120C3E5013081E2FF1003E2020051E38D
:106C50000EF0A081F4FFFFEA6C0000040DC0A0E17B
:106C6000F0D92DE904B04CE214D04DE20040A0E18F
:106C70000180A0E134E04BE2E8C09FE50F00BCE8F2
:106C80000F00AEE8B0C0DCE1B0C0CEE10400A0E18E
:106C9000343F00EBFF5000E2100055E31050A023FA
:106CA00034004BE20410A0E10520A0E1253F00EBF9
:106CB0000050A0E334604BE2AC709FE5853085E086
:106CC000033185E0033185E0074083E00600A0E161
:106CD0000410A0E11020A0E32B3F00EB000050E3E4
:106CE0001B00001A0800A0E1583F00EB3100C4E58A
:106CF0003120D4E53330D4E5030052E10200003AFC
:106D00003430D4E5030052E10500009A853085E077
:106D1000033185E0033185E0073083E03220D3E59D
:106D20003120C3E5853085E0033185E0033185E01E
:106D3000073083E03130D3E530009FE530109FE528
:106D400034204BE2EA3E00EB20009FE5F20A00EB24
:106D5000F0A91BE9013085E2FF5003E2020055E390
:106D6000F0A91B89D4FFFFEA049401006C00000421
:106D7000C8120004A0B701000DC0A0E1F0D82DE9B1
:106D800004B04CE220D04DE2A5FFFFEBB8009FE538
:106D9000E10A00EBB4009FE57210A0E3ADFAFFEB4F
:106DA0000050A0E1000050E30040A0133C704B12E3
:106DB0000200001A98009FE5D70A00EBF0A81BE933
:106DC0000700A0E11F10A0E30520A0E17AFCFFEB83
:106DD0003C305BE5000053E31800000A0A0053E36F
:106DE0000D0053131100000A200053E30F00000AA6
:106DF0003B0053E30D00000A230053E30B00000A9D
:106E00000700A0E14C109FE5EC3E00EB0060A0E124
:106E1000000050E30500000A0000A0E334109FE5E5
:106E2000E63E00EB0010A0E10600A0E18AFFFFEBC8
:106E3000013084E2FF4003E2090054E3DFFFFF9AE0
:106E40000500A0E12EFBFFEBF0A81BE9ACB70100A9
:106E5000C8B70100D8B70100F4B701000DC0A0E128
:106E600000D82DE904B04CE21603A0E30B0A80E23F
:106E70001010A0E30020A0E3661800EB00A81BE9B7
:106E80000DC0A0E100D82DE904B04CE21603A0E348
:106E90000B0A80E21010A0E30120A0E35D1800EBD4
:106EA00000A81BE90DC0A0E1F0DD2DE904B04CE223
:106EB00020D04DE2020CA0E30110A0E39D1500EBF1
:106EC0003C004BE2401800EB0170A0E33C404BE279
:106ED0000170C4E51030A0E33C304BE50050A0E366
:106EE0000250C4E50350C4E5B470C4E11603A0E346
:106EF0000B0A80E20410A0E1E11700EB0400A0E11E
:106F0000311800EB0170C4E55030A0E33C304BE594
:106F10000250C4E50370C4E50230A0E3B430C4E11C
:106F20001603A0E3090A80E20410A0E1D41700EBE5
:106F30000400A0E1241800EB0150C4E52030A0E3D8
:106F40003C304BE50250C4E50370C4E50560A0E1A8
:106F5000B450C4E11603A0E3090A80E20410A0E1E2
:106F6000C71700EB1703A0E3020980E2591D00EBED
:106F700034804BE20800A0E1B11D00EB3030E0E3CB
:106F8000B4334BE10430E0E3B2334BE18030E0E373
:106F9000BE324BE14030E0E3B0334BE10530A0E3DB
:106FA00028304BE508A0A0E327A04BE51703A0E39A
:106FB000020980E20810A0E15D1D00EBAFFFFFEBCE
:106FC0001703A0E3020980E20710A0E1AC1D00EB6B
:106FD0000207A0E30710A0E1561500EB0150C4E53D
:106FE0003CA04BE50250C4E50350C4E5B450C4E1F5
:106FF0001603A0E30B0A80E20410A0E1A01700EB47
:10700000020AA0E30710A0E14A1500EB0700A0E187
:107010002A2000EB020BA0E34F2000EB192000EB2D
:1070200044301BE5FF30C3E344300BE544004BE242
:10703000023BA0E3043080E5FF1F00EB0B00A0E360
:10704000781600EB1B00A0E30510A0E10720A0E3E9
:10705000E81A00EB1B00A0E30710A0E13A1A00EBCE
:10706000F0AD1BE90DC0A0E170D82DE904B04CE2F1
:1070700008D04DE21703A0E3020980E20010A0E36C
:107080007F1D00EB1703A0E3020980E2111D00EB56
:1070900020404BE20060A0E30160C4E51030A0E3B3
:1070A00020304BE50260C4E50360C4E50650A0E172
:1070B000B460C4E11603A0E30B0A80E20410A0E16F
:1070C0006F1700EB0160C4E55030A0E320304BE5C2
:1070D0000260C4E50360C4E5B460C4E11603A0E344
:1070E000090A80E20410A0E1651700EB0160C4E525
:1070F0002030A0E320304BE50260C4E50360C4E526
:10710000B460C4E11603A0E3090A80E20410A0E120
:107110005B1700EB020CA0E30610A0E1051500EBE5
:107120000207A0E30110A0E3021500EB0160C4E533
:107130000830A0E320304BE50260C4E50360C4E5FD
:10714000B460C4E11603A0E30B0A80E20410A0E1DE
:107150004B1700EB70A81BE90DC0A0E110D82DE97A
:1071600004B04CE21743A0E3020984E22110A0E33B
:10717000731D00EB010050E3FAFFFF1A1703A0E3B1
:10718000020980E2FF10A0E3601D00EB1743A0E3BB
:10719000020984E22010A0E3691D00EB010050E326
:1071A000FAFFFF1A1703A0E3020980E25B1D00EB60
:1071B000FF0000E210A81BE90DC0A0E110D82DE9E6
:1071C00004B04CE21743A0E3020984E22010A0E3DC
:1071D0005B1D00EB010050E31743A0030200000A0F
:1071E000F8FFFFEA020984E24C1D00EB020984E289
:1071F0002210A0E3521D00EB010050E310A81B1960
:10720000F7FFFFEA0DC0A0E130D82DE904B04CE251
:10721000FF5000E21743A0E3020984E22110A0E33B
:10722000471D00EB010050E3FAFFFF1A1703A0E32C
:10723000020980E20510A0E1341D00EB30A81BE933
:107240000DC0A0E130D82DE904B04CE258409FE5D4
:107250000300A0E3B62100EB0008A0E12008A0E1B4
:10726000000084E5B020D4E140009FE5251EA0E3A6
:10727000D52800EB34509FE5002094E50030A0E3D2
:107280000230C5E70300A0E3632000EB20009FE588
:1072900020109FE5002094E50530A0E1943D00EB2F
:1072A0000C009FE59C0900EB30A81BE924040004B6
:1072B000C8100004C8120004F8B701000020A0E3C1
:1072C00004309FE5002083E50EF0A0E128040004CF
:1072D0000DC0A0E100D82DE904B04CE278219FE573
:1072E000211DA0E3461281E2003091E5B030C2E1F9
:1072F000B030D2E164219FE5B020D2E1023003E05A
:10730000010B13E30500000AFB3CA0E3FF3083E21E
:10731000003081E548319FE50FE0A0E104F093E5FE
:1073200034319FE5B030D3E130219FE5B020D2E188
:10733000023003E0020A13E3212DA0134622821239
:10734000DF3CA013FF3083120030821508319FE527
:10735000B030D3E104219FE5B020D2E1023003E058
:10736000010A13E30600000A212DA0E3462282E26F
:10737000EF3CA0E3FF3083E2003082E50000A0E3B1
:107380007C0100EBD0309FE5B030D3E1CC209FE50D
:10739000B020D2E1023003E0020B13E30C00000A3C
:1073A000C0309FE5003093E5000053E30100000A80
:1073B000510100EB010000EA0200A0E36D0100EBC7
:1073C000212DA0E3462282E2F73CA0E3FF3083E2D6
:1073D000003082E580309FE5B030D3E17C209FE52E
:1073E000B020D2E1023003E0020C13E3212DA01300
:1073F00046228212FD3CA013FF308312003082151A
:1074000054309FE5B030D3E150209FE5B020D2E169
:10741000023003E0010C13E30600000A212DA0E373
:10742000462282E2FE3CA0E3FF3083E2003082E5A8
:107430000700A0E34F0100EB1C309FE5B030D3E123
:1074400018209FE5B020D2E1023003E0020913E3E7
:1074500000A81B09302700EB00A81BE9501100040D
:1074600030180004900100041C0200040DC0A0E1CB
:1074700070D82DE904B04CE20050A0E3A8409FE58D
:10748000003094E51250C3E5F60000EB213DA0E387
:10749000463283E2005083E5BF2CA0E38C309FE5A9
:1074A000B020C3E10632A0E3213D83E2002083E562
:1074B000002094E578309FE50730D3E51130C2E530
:1074C000003094E51230D3E5050053E11200001AB4
:1074D000015085E20460A0E1924AA0E37B4E84E281
:1074E0000F4084E20B2700EB003096E51230D3E525
:1074F000000053E30300001A0530A0E1015085E2CB
:10750000040053E1F6FFFF9A1C309FE5003093E53D
:107510001230D3E5000053E370A81B090520A0E357
:1075200010309FE50020C3E570A81BE92018000477
:10753000301800042A940100300400040DC0A0E1BA
:1075400010D82DE904B04CE210219FE5003092E5FF
:107550000040A0E31240C3E5003092E51340C3E5CC
:107560000400A0E12A1F00EB0400A0E1021CA0E33C
:10757000421F00EB0400A0E11010A0E3501F00EB3D
:107580000400A0E1461FA0E36C2000EB0400A0E192
:10759000561FA0E3532000EB0400A0E1BE1F00EB48
:1075A000BC309FE52C10D3E50400A0E1A12000EB46
:1075B0000400A0E1981F00EB0100A0E30410A0E18B
:1075C0002E1F00EB0100A0E3021CA0E3452000EB0E
:1075D0000100A0E32010A0E3391F00EB0100A0E3AD
:1075E0000410A0E14A1F00EB0200A0E3061CA0E388
:1075F000221F00EB0200A0E3091DA0E3392000EBED
:107600000200A0E30410A0E1411F00EB0200A0E390
:107610002010A0E32A1F00EB0300A0E30410A0E168
:10762000161F00EB0300A0E3251EA0E3432000EBA0
:107630000300A0E34010A0E37E2000EB0300A0E3E2
:10764000031AA0E3321F00EB0300A0E30410A0E143
:107650001B1F00EB0400A0E1942600EB10A81BE91F
:10766000201800049001000410209FE5003092E5EE
:10767000200053E30030A003003082050EF0A0E1AB
:107680002C0400040EF0A0E10DC0A0E110D82DE9FB
:1076900004B04CE2FF0000E20010A0E3210050E340
:1076A0000600001A7C309FE5003093E50030D3E5FA
:1076B0007F3003E2210053E36C109F050B0000EACA
:1076C000200050E30900001A58309FE5003093E590
:1076D0000030D3E57F3003E250209FE5210053E3E3
:1076E0000210A0012020A0E344309FE5002083E5A4
:1076F000000051E30200A00310A81B0924209FE50D
:10770000003092E5201083E5003092E50040A0E3D0
:10771000BA41C3E10400A0E10FE0A0E101F0A0E163
:107720000400A0E110A81BE920180004187800004C
:10773000407800002C040004FF0000E230309FE598
:10774000003093E50030D3E57F3003E2210053E3BE
:107750000500001A020050E30100000A220050E375
:107760000100001A0000A0E30EF0A0E10200A0E377
:107770000EF0A0E1201800040DC0A0E100D82DE912
:1077800004B04CE20008A0E12008A0E104109FE54D
:10779000D42300EB00A81BE9E40100040DC0A0E124
:1077A00000D82DE904B04CE20008A0E12008A0E1D7
:1077B00004109FE5CB2300EB00A81BE9EC010004BB
:1077C0000DC0A0E100D82DE904B04CE21C309FE5CB
:1077D000003093E50530D3E50008A0E12008A0E1E2
:1077E0000C109FE5831181E0BE2300EB00A81BE98C
:1077F00020180004F4010004FF0000E2FF0011E380
:107800000200A0130EF0A011010050E30200A083BB
:107810000000A0930EF0A0E10008A0E12008B0E174
:1078200010309F05003093050820A003B821C30144
:1078300004009F150EF0A0E120180004840100044C
:107840000008A0E12008B0E110309F05003093054A
:107850000820A003B821C30104009F150EF0A0E189
:1078600020180004840100040DC0A0E100D82DE917
:1078700004B04CE20100A0E324F2FFEB0622A0E3F7
:10788000212D82E20130A0E3003082E50000A0E378
:10789000000082E5213DA0E3463283E2000083E55B
:1078A000071BA0E308309FE5B010C3E1001082E59C
:1078B00000A81BE9301800040DC0A0E130D82DE964
:1078C00004B04CE20652A0E3215D85E20130A0E362
:1078D000003085E5213DA0E3463283E20040A0E38D
:1078E000004083E50400A0E108F2FFEB0330A0E3D1
:1078F000003085E50400A0E130A81BE90120A0E3E9
:1079000034309FE5002083E50622A0E3212D82E2AA
:10791000003092E50338A0E1023783E32338A0E189
:10792000003082E5003092E50338A0E1013783E3BF
:107930002338A0E1003082E50EF0A0E160110004E0
:107940000020A0E328309FE5002083E50622A0E385
:10795000212D82E2003092E50430C3E30338A0E138
:107960002338A0E1003082E5BF3CA0E3003082E58F
:107970000EF0A0E1601100040DC0A0E100D82DE9D7
:1079800004B04CE2070050E318319F150000831546
:1079900010319FE5003093E5070053E303F19F9713
:1079A0003E0000EAC4790000DC790000F0790000B4
:1079B000047A0000287A00005C7A0000A07A0000B7
:1079C000A07A0000DDFFFFEBFF1D00EB020910E3D2
:1079D0003200000AC8FFFFEB300000EAD7FFFFEBE0
:1079E0000420A0E3BC309FE5002083E500A81BE94C
:1079F000B0309FE50220A0E30420C3E50320A0E30C
:107A0000F8FFFFEA9C209FE50430D2E5013043E215
:107A10000430C2E50430D2E5000053E30430A00393
:107A20000030820500A81BE90622A0E3212D82E296
:107A3000003092E50338A0E1013683E32338A0E16A
:107A4000003082E55C209FE50530A0E3003082E550
:107A50000A30A0E30430C2E500A81BE944109FE50A
:107A60000430D1E5013043E20430C1E50430D1E512
:107A7000000053E300A81B190632A0E3213D83E276
:107A8000002093E51020C2E30228A0E12228A0E113
:107A9000002083E50630A0E3003081E500A81BE963
:107AA0000620A0E3CEFFFFEA801100040DC0A0E194
:107AB00010D82DE904B04CE208D04DE20207A0E353
:107AC0000110A0E39B1200EB18004BE23E1500EB07
:107AD0000120A0E318104BE20120C1E53F30E0E3B4
:107AE00018304BE50040A0E30240C1E5B420C1E1FD
:107AF0001603A0E30B0A80E2E11400EB1603A0E3F7
:107B00000B0A80E24010A0E30420A0E1411500EB45
:107B10001603A0E30B0A80E28010A0E30420A0E19A
:107B20003C1500EB10A81BE910402DE900E0A0E196
:107B30000000A0E300C0A0E1010050E10B00002A1A
:107B400034409FE50038A0E10120DEE4232C22E050
:107B50008220A0E1B42092E1232422E00228A0E1C7
:107B60004208A0E101C08CE201005CE1F4FFFF3AB1
:107B70000008A0E12008A0E11080BDE8EA9401001F
:107B80000008A0E12008A0E148309FE5931082E0C2
:107B9000A233A0E1033183E0033183E0033240E00C
:107BA0000338B0E10700000A030010E30700001AE1
:107BB000A232A0E1033183E0033183E0033140E0EE
:107BC0000338B0E10100000A0100A0E30EF0A0E1DB
:107BD0000000A0E30EF0A0E11F85EB510DC0A0E175
:107BE00070D82DE904B04CE20050A0E1AC129FE542
:107BF0003430D1E53520D1E5023483E13620D1E5BA
:107C0000023883E13720D1E5023C93E1A000000A6D
:107C10000B30D1E5040013E39D00000A0B30D1E5E1
:107C2000080013E39A00000A0030D1E50120D1E5F5
:107C3000023483E10220D1E5023883E10320D1E55B
:107C4000023C83E158229FE5920383E02363A0E195
:107C50000830D1E50920D1E5023483E10338A0E101
:107C60004338A0E10C0056E301304392936A8692B8
:107C7000A76E8692036086920D604682833163E030
:107C80000B4883E21E4D84E2034084E214329FE5F8
:107C9000961383E0234884E00C329FE5930482E04E
:107CA000A227A0E10238A0E12338A0E1033183E05C
:107CB000033183E00332A0E1013083E2B030C5E15B
:107CC000823182E0033282E0033262E0033363E018
:107CD000044063E02421A0E1D0319FE5930281E0DC
:107CE000A115A0E10138A0E12338A0E1033183E030
:107CF000033183E0B020D5E1032182E0B020C5E16B
:107D0000813161E0833181E0033281E0033183E03E
:107D1000833081E0034144E094319FE5931482E095
:107D2000A223A0E10218A0E1B030D5E1213783E021
:107D3000B030C5E1023262E0033182E0833162E0BB
:107D4000033163E0044063E0113DA0E3063083E2C9
:107D5000030054E15C319F95942383900420639049
:107D6000A23083900334A0914328A0910320A083E4
:107D7000B030D5E1023083E0B030C5E10228A0E1A7
:107D80002228A0E1823182E0833182E0033183E066
:107D9000044063E0014084E2B000D5E177FFFFEBEF
:107DA000FF0010E310219FE510319FE50210A001B4
:107DB0000310A0110020A0E3023191E7040053E179
:107DC0000900002A023181E0043093E5030054E108
:107DD0000500008A013082E20230C5E50231D1E7B8
:107DE000043063E00330C5E50C20A0E3013082E2FB
:107DF000FF2003E20B0052E3EEFFFF9AA4309FE561
:107E0000960383E02338A0E1833083E0033263E00C
:107E1000033263E0836346E0A4309FE5961383E07A
:107E2000A335A0E10430C5E5033263E0033263E02B
:107E3000036246E08C309FE5962383E0A332A0E105
:107E40000530C5E5033263E0036146E00660C5E541
:107E500048209FE50010D2E50130D2E5031481E10E
:107E60000230D2E5031881E10330D2E5031C81E141
:107E70002C309FE5930182E02223A0E1823262E070
:107E8000033182E0831141E0B810C5E10130A0E385
:107E9000000000EA0030A0E30A30C5E570A81BE945
:107EA00034040004D34D621007452EC2BD066B3961
:107EB0007F206B3973B06D1661F31967209701004D
:107EC000EC960100C5B3A2918988888880309FE52F
:107ED0003420D3E50020A0E33420C3E53510D3E5FA
:107EE0003520C3E53610D3E53620C3E53710D3E59A
:107EF0003720C3E55C309FE51C10D3E51C20C3E5AB
:107F00001D10D3E51D20C3E51E10D3E51E20C3E5DB
:107F10001F10D3E51F20C3E53C309FE52410D3E5B7
:107F20002420C3E52510D3E52520C3E52610D3E59D
:107F30002620C3E52710D3E52720C3E51C309FE5A5
:107F40002F20C3E53020C3E53120C3E53220C3E54F
:107F50000EF0A0E1340400046C0400048C0400045E
:107F6000B80400040DC0A0E1F0D92DE904B04CE242
:107F700014349FE5000093E597E8FFEBFF0010E362
:107F80000020A01304349F150020C315FC239F0577
:107F90000030D205013083020030C2056400A0E346
:107FA00087E8FFEBE0339FE5000083E5DC339FE5E6
:107FB0000030D3E5010053E3F0A91B99D0039FE5FE
:107FC0003430D0E53520D0E5023483E13620D0E5E9
:107FD000023883E13720D0E5023C83E1010053E31E
:107FE000CB00001AAC439FE51C30D4E51D20D4E53E
:107FF000023483E11E20D4E5023883E11F20D4E55A
:10800000023C83E1010053E3C100001A88639FE54D
:108010002430D6E52520D6E5023483E12620D6E5B6
:10802000023883E12720D6E5027C83E1010057E393
:10803000B700001A64239FE5003092E5013083E227
:10804000003082E558139FE51830D1E51920D1E5BD
:10805000023483E1013083E20080A0E31830C1E5FF
:108060002334A0E11930C1E538539FE52F30D5E521
:108070003020D5E5023483E13120D5E5023883E1B3
:108080003220D5E5023C83E1010053E3A000000A61
:108090002F80C5E53080C5E53180C5E53280C5E576
:1080A0000B30D0E51030C5E52F30D0E51130C5E5F7
:1080B0000A30D0E51230C5E51830D0E51920D0E5FA
:1080C000023483E11A20D0E5023883E11B20D0E599
:1080D000023C83E11330C5E52324A0E11420C5E56B
:1080E0002328A0E11520C5E5233CA0E11630C5E515
:1080F0002830D0E52920D0E5023483E12A20D0E5DC
:10810000023883E12B20D0E5023C83E12B30C5E52A
:108110002324A0E12C20C5E52328A0E12D20C5E5DE
:10812000233CA0E12E30C5E57C029FE5AAFEFFEBD3
:108130000430D4E50520D4E5023483E10620D4E5FB
:10814000023883E10720D4E5023C83E10030C5E535
:108150002324A0E10120C5E52328A0E10220C5E5F4
:10816000233CA0E10330C5E50830D4E50920D4E57F
:10817000023483E10A20D4E5023883E10B20D4E500
:10818000023C83E10430C5E52324A0E10520C5E5D8
:108190002328A0E10620C5E5233CA0E10730C5E582
:1081A0001030D4E51120D4E5023483E11220D4E567
:1081B000023883E11320D4E5023C83E10830C5E5B1
:1081C0002324A0E10920C5E52328A0E10A20C5E574
:1081D000233CA0E10B30C5E50C70C5E50D80C5E57D
:1081E0000E80C5E50F80C5E50830D6E50920D6E547
:1081F000023483E10A20D6E5023883E10B20D6E57C
:10820000023C83E11B30C5E52324A0E11C20C5E529
:108210002328A0E11D20C5E5233CA0E11E30C5E5D3
:108220000430D6E50520D6E5023483E10620D6E504
:10823000023883E10720D6E5023C83E11730C5E52B
:108240002324A0E11820C5E52328A0E11920C5E5D5
:10825000233CA0E11A30C5E50C30D6E50D20D6E56B
:10826000023483E10E20D6E5023883E10F20D6E503
:10827000023C83E1003063E21F30C5E52324A0E126
:108280002020C5E52328A0E12120C5E5233CA0E16D
:108290002230C5E51430D6E51520D6E5023483E159
:1082A0001620D6E5023883E11720D6E5023C83E1AB
:1082B0002330C5E52324A0E12420C5E52328A0E13F
:1082C0002520C5E5233CA0E12630C5E51830D6E5DC
:1082D0001920D6E5023483E11A20D6E5023883E17D
:1082E0001B20D6E5023C83E12730C5E52324A0E12D
:1082F0002820C5E52328A0E12920C5E5233CA0E1ED
:108300002A30C5E52F70C5E53080C5E53180C5E56B
:108310003280C5E578309FE53420D3E50020A0E326
:10832000021082E33410C3E53500D3E53520C3E500
:108330003600D3E53620C3E53700D3E53720C3E563
:1083400050309FE51C00D3E51C10C3E51D00D3E5AC
:108350001D20C3E51E00D3E51E20C3E51F00D3E5A5
:108360001F20C3E530309FE52400D3E52410C3E58A
:108370002510D3E52520C3E52610D3E52620C3E547
:108380002710D3E52720C3E5F0A91BE9F804000472
:10839000FC040004340400046C0400048C04000495
:1083A000B404000458130004B80400048008000456
:1083B0000DC0A0E100D82DE904B04CE2FF0000E2BE
:1083C00098329FE5003093E5080053E303F19F974F
:1083D0000B0000EAF88300001484000020840000F1
:1083E0002C840000F88400002C850000A08500008B
:1083F0000486000028860000B50050E30120A00399
:108400000000000A0020A0E350329FE5002083E531
:1084100000A81BE9620050E30220A003F7FFFFEA77
:10842000010050E30320A003F4FFFFEA060050E33D
:108430000E00000A020000CA020050E30300000A16
:108440001B0000EA120050E31100000A180000EAC5
:108450000C229FE50C329FE5002083E5201082E28C
:1084600004329FE5001083E51C2082E2060000EA4A
:10847000F8219FE5EC319FE5002083E5381082E28A
:10848000E4319FE5001083E5342082E2E0319FE58E
:10849000090000EADC219FE5C8319FE5002083E563
:1084A000281082E2C0319FE5001083E5242082E29B
:1084B000F5FFFFEA0020A0E3A0319FE5002083E55F
:1084C00098219FE5003092E5000053E300A81B09C6
:1084D0000430A0E3003082E59C219FE5013080E27A
:1084E0000030C2E50030D2E5013083E28C219FE507
:1084F0000030C2E500A81BE984319FE5B000C3E16C
:1085000074219FE50030D2E5033080E00030C2E501
:1085100068119FE50030D1E50020D2E5023083E00C
:108520000030C1E50520A0E3B6FFFFEA50219FE53A
:10853000B030D2E1003483E0B030C2E138219FE5B1
:108540000030D2E5033080E00030C2E52C119FE519
:108550000030D1E50020D2E5023083E00030C1E5F3
:108560000C319FE5003093E50030D3E5010053E383
:108570000400001A0020A0E3E0309FE5002083E51E
:1085800077FEFFEB00A81BE9E4309FE5002093E5B0
:108590000030A0E30030C2E50620A0E399FFFFEA27
:1085A000C0109FE5002091E5BC309FE5003093E5C9
:1085B000030052E192FFFF2A0100C2E4002081E59E
:1085C000B4209FE50030D2E5033080E00030C2E502
:1085D000A8109FE50030D1E50020D2E5023083E00D
:1085E0000030C1E598209FE5B030D2E1013043E290
:1085F000B030C2E10338B0E10720A00300A81B1986
:1086000080FFFFEA70309FE50030D3E5000053E1C2
:108610000820A00358309F15003093150020A013A8
:108620000020C31577FFFFEA50309FE50030D3E507
:10863000000053E138309F15002093150030A0133F
:108640000030C2156EFFFF1A24309FE5002093E52D
:108650000130A0E30030C2E541FEFFEB68FFFFEA16
:10866000000500046C040004080500040C05000467
:1086700034040004100500048C0400040605000402
:1086800007050004040500040DC0A0E1F0DD2DE99C
:1086900004B04CE208D04DE2E4A09FE50050A0E316
:1086A00000508AE50106A0E30110A0E3A10F00EB52
:1086B0002C004BE2441200EB0170A0E32C404BE293
:1086C0000150C4E50280A0E32C804BE50250C4E5D4
:1086D0000350C4E50560A0E1B450C4E11603A0E373
:1086E0000B0A80E20410A0E1E51100EB0400A0E118
:1086F000351200EB0150C4E52C704BE50250C4E587
:108700000350C4E5B450C4E11603A0E30B0A80E2B1
:108710000410A0E1DA1100EB0400A0E12A1200EB42
:108720000150C4E54030A0E32C304BE50250C4E5D5
:108730000370C4E5B450C4E11603A0E3030980E26A
:108740000410A0E1CE1100EB0400A0E11E1200EB2A
:108750000170C4E57F30E0E32C304BE50250C4E506
:108760000370C4E50330A0E3B430C4E11603A0E312
:10877000030980E20410A0E1C11100EB00808AE54A
:10878000F0AD1BE9140500040DC0A0E1F0D92DE9FE
:1087900004B04CE208D04DE2E4809FE50050A0E335
:1087A000005088E50207A0E30110A0E3610F00EB91
:1087B00028004BE2041200EB0170A0E328404BE2DA
:1087C0000150C4E54030A0E328304BE50250C4E539
:1087D0000350C4E50560A0E1B450C4E11603A0E372
:1087E000030980E20410A0E1A51100EB0400A0E160
:1087F000F51100EB0150C4E57F30E0E328304BE594
:108800000250C4E50350C4E5B450C4E11603A0E32C
:10881000030980E20410A0E1991100EB0400A0E13B
:10882000E91100EB0150C4E50230A0E328304BE52C
:108830000250C4E50370C4E5B450C4E11603A0E3DC
:108840000B0A80E20410A0E18D1100EB0400A0E10E
:10885000DD1100EB0170C4E528704BE50250C4E562
:108860000370C4E50330A0E3B430C4E11603A0E311
:108870000B0A80E20410A0E1811100EB007088E592
:10888000F0A91BE9140500040DC0A0E170D82DE982
:1088900004B04CE21CD04DE2D4009FE51E0400EB76
:1088A0000800A0E30110A0E3220F00EBC4409FE505
:1088B0009634A0E34339A0E1B030C4E134604BE228
:1088C0000600A0E1E91200EB6030A0E3B4334BE115
:1088D0000830E0E3B2334BE10050A0E3B0534BE18A
:1088E000B030D4E12C300BE5B8524BE1033CA0E3AF
:1088F000B6324BE11040A0E3B4424BE10230A0E3BA
:1089000020300BE51C300BE51703A0E3010980E2E2
:10891000401200EB1703A0E3010980E20610A0E17A
:108920005C1200EB1703A0E3010980E25010A0E302
:108930000120A0E3E51200EB1703A0E3010980E2A8
:108940000110A0E3DA1200EB0400A0E10510A0E1A1
:108950000A20A0E3A71400EB0400A0E10110A0E3AB
:10896000F91300EB47FFFFEB0C009FE5EA0300EB78
:1089700070A81BE908B801002002000460B30100E0
:108980000DC0A0E130D82DE904B04CE21703A0E3FC
:10899000010980E21010A0E30A1300EB000050E38D
:1089A0000500001A1703A0E3010980E24010A0E3CC
:1089B000041300EB000050E330A81B091703A0E3E9
:1089C000010980E21010A0E3041300EB1703A0E3F9
:1089D000010980E24010A0E3001300EBA4309FE502
:1089E000002093E51733A0E3013983E2030052E14D
:1089F0001753A0030C00000A110000EA1743A0E37C
:108A0000050A84E24510A0E3DA1200EB010050E30E
:108A1000FAFFFF0A010985E23F1300EB0010A0E115
:108A2000FF1001E2050A85E2381300EB010985E237
:108A30004410A0E3CF1200EB010050E330A81B0963
:108A4000EDFFFFEA1743A0E3080000EA010984E212
:108A5000311300EBFF0000E22C309FE5003093E57E
:108A6000010053E30100009A020053E34FFEFF0BA5
:108A7000010984E24410A0E3BE1200EB010050E3C0
:108A800030A81B09F0FFFFEA2802000414050004C7
:108A90000DC0A0E1F0DF2DE904B04CE224D04DE29E
:108AA0001000A0E30110A0E3A20E00EB0208A0E377
:108AB0000110A0E39F0E00EB4C004BE2421100EBD3
:108AC0000170A0E34C404BE20050A0E30150C4E52C
:108AD00004A0A0E34CA04BE50260A0E30250C4E573
:108AE0000370C4E50580A0E1B450C4E11603A0E31F
:108AF000090A80E20410A0E1E11000EB0400A0E10B
:108B0000311100EB0170C4E50890A0E34C904BE5F7
:108B10000250C4E5B460C4E11603A0E3090A80E290
:108B20000410A0E1D61000EB44404BE20400A0E1A9
:108B30004E1200EB6030A0E3B4344BE10830E0E3C8
:108B4000B2344BE1B0544BE1E13CA0E33C300BE5E7
:108B5000B8534BE1033CA0E3B6334BE11030A0E344
:108B6000B4334BE130600BE52C600BE51703A0E359
:108B7000050A80E2A71100EB1703A0E3050A80E2D3
:108B80000410A0E1C31100EB1703A0E3050A80E283
:108B90005010A0E30720A0E14C1200EB1703A0E364
:108BA000050A80E20710A0E1411200EB1100A0E3EA
:108BB0000510A0E10A20A0E10E1400EB1100A0E3D3
:108BC0000710A0E1601300EB70309FE5000093E513
:108BD0007BE5FFEB68309FE5000083E564309FE5AF
:108BE000000093E57D0F80E275E5FFEB58309FE5CF
:108BF000000083E554309FE50050C3E550309FE509
:108C0000005083E54C309FE50050C3E548309FE5B8
:108C10000070C3E544209FE50050C2E50C30A0E39E
:108C20000130C2E50490C2E50A30A0E30230C2E59B
:108C30000350C2E528009FE5370300EBF0AF1BE9C6
:108C40003002000440140004340200044013000405
:108C500023050004280500042C0500042C02000450
:108C6000B81200041CB801000DC0A0E1F0D92DE934
:108C700004B04CE21703A0E3050A80E21010A0E361
:108C8000501200EB000050E30500001A1703A0E3A8
:108C9000050A80E24010A0E34A1200EB000050E316
:108CA000F0A91B091703A0E3050A80E21010A0E356
:108CB0004A1200EB1703A0E3050A80E24010A0E38C
:108CC000461200EB8C329FE5002093E51733A0E3BA
:108CD000053A83E2030052E17C529F150060A01325
:108CE0002F00001A350000EA68429FE5000094E575
:108CF0004510A0E31F1200EB010050E3FAFFFF0A4A
:108D00001703A0E3050A80E2831200EBFF4000E2B4
:108D10000030D5E5040053E303F19F97190000EA02
:108D2000348D0000408D0000488D0000508D000003
:108D3000688D00001B0054E31200001A050000EAD1
:108D40001B0054E3020000EA550054E3000000EA6F
:108D5000AA0054E30A00001A0030D5E5013083E28E
:108D60000030C5E5070000EA000054E30400001AE3
:108D70001733A0E3053A83E2D8219FE5003082E56E
:108D800040FEFFEB0060C5E5C8319FE5000093E5BC
:108D90001733A0E3053A83E2030050E10410A01169
:108DA0005A12001B1703A0E3050A80E24410A0E357
:108DB000F01100EB010050E3F0A91B09C9FFFFEA25
:108DC00098619FE598819FE598519FE5570000EADB
:108DD0001703A0E3050A80E24F1200EBFF4000E218
:108DE00084119FE50020D1E5000052E323005403E5
:108DF0000500001A013082E20030C1E5FF3002E2D6
:108E00000340C8E7B040C5E1480000EA58119FE5BB
:108E10000020D1E5950052E30020A08348319F85D2
:108E20000020C3850020C6854000008A0D0054E361
:108E30000700000A013082E20030C1E5FF3002E2A3
:108E40000340C8E7B030D5E1043083E0B030C5E17D
:108E5000360000EA08E19FE50C319FE50070D3E59C
:108E6000FF4007E20E0084E0022050E5B030D5E17B
:108E7000033062E0B030C5E1012050E5B030D5E10B
:108E8000033062E0B030C5E1B030D5E1033AA0E193
:108E9000233AA0E1B030C5E1D0109FE5B020D5E184
:108EA0002233A0E13D3083E20030C1E5C0C09FE540
:108EB0003F2002E23D2082E20020CCE5022050E586
:108EC0000030D1E5020053E11300001A012050E503
:108ED0000030DCE5020053E10F00001A0130A0E38E
:108EE0000030C6E5032087E088309FE50020C3E519
:108EF0000D30A0E30430CEE70230DEE5520053E34C
:108F00000700001A6BFAFFEB201200EB68309FE5B8
:108F10000FE0A0E103F0A0E1010000EA0030A0E3CF
:108F20000030C6E50020A0E33C309FE50020C3E50B
:108F30001703A0E3050A80E24410A0E38D1100EBC3
:108F4000010050E3F0A91B090030D6E5000053E30F
:108F5000F0A91B199DFFFFEA28020004390500044F
:108F600023050004F811000434050004360500044C
:108F70003705000438050004240500043C02000401
:108F80000DC0A0E100D82DE904B04CE27C309FE593
:108F90000030D3E5000053E300A81B191703A0E33A
:108FA000050A80E24510A0E3721100EB000050E3D7
:108FB00000A81B1958309FE5B000D3E154309FE55D
:108FC0000030D3E7FF1003E20D0051E30100000A77
:108FD000960050E30500001A34309FE50020A0E31E
:108FE000B020C3E10120A0E320309FE50020C3E5CD
:108FF0001703A0E3050A80E2C41100EB10209FE5EF
:10900000B030D2E1013083E2B030C2E100A81BE908
:109010002C02000432050004A01300040DC0A0E1DE
:1090200000D82DE904B04CE200C0A0E30C10A0E190
:109030000008A0E120085CE10D00002AC0209FE5A7
:109040002008A0E10C38A0E12338A0E10330D2E7EA
:10905000FF3003E2013083E00338A0E14318A0E1D0
:1090600001308CE20338A0E143C8A0E1230850E1BD
:10907000F3FFFF8A011AA0E1211AA0E180009FE519
:109080000C20A0E101308CE20338A0E143C8A0E14C
:109090000228A0E12228A0E10138A0E12318A0E1E4
:1090A000233BA0E13D3083E20230C0E701208CE2A7
:1090B0000C38A0E12338A0E13F1001E23D1081E22D
:1090C0000310C0E70228A0E12228A0E10D30A0E3B0
:1090D0000230C0E70010A0E328309FE50010C3E590
:1090E00024309FE50120A0E3B020C3E10110D0E7C8
:1090F000FF1001E21703A0E3050A80E2831100EBF1
:1091000000A81BE9A01300042C020004320500048F
:109110000DC0A0E10C002DE9F0DD2DE90CB04CE212
:10912000FF0000E2FF1001E20440DBE500C0A0E325
:109130000C50A0E10C80A0E10CE0A0E100229FE532
:1091400001C08CE22330A0E30530C2E701308CE29D
:10915000611081E20C10C2E701C083E20300C2E7A4
:1091600008708BE2050054E10500000A008097E5D5
:10917000043087E2047083E200E093E5013044E2CA
:10918000FF4003E200005EE36900000AB0A19FE532
:109190000520A0E1013085E2FF5003E20210D8E78C
:1091A00001E05EE20030A0130130A003000054E3B0
:1091B0000030A00301300312000053E30600000A50
:1091C000008097E5043087E2047083E200E093E5D5
:1091D0000050A0E3013044E2FF4003E200005EE300
:1091E0000060A0031200000A0520A0E1013085E222
:1091F000FF5003E20260D8E701E05EE20030A01316
:109200000130A003000054E30030A003013003123A
:10921000000053E30600000A008097E5043087E26F
:10922000047083E200E093E50050A0E3013044E2E3
:10923000FF4003E200005EE30000A0031200000A0A
:109240000520A0E1013085E2FF5003E20200D8E7EB
:1092500001E05EE20030A0130130A003000054E3FF
:109260000030A00301300312000053E30600000A9F
:10927000008097E5043087E2047083E200E093E524
:109280000050A0E3013044E2FF4003E20C20A0E1E3
:1092900001308CE20338A0E143C8A0E10228A0E13C
:1092A0002228A0E12131A0E13D3083E20230CAE76B
:1092B0000C20A0E101308CE20338A0E143C8A0E11A
:1092C0000228A0E12228A0E1031001E22632A0E159
:1092D000013283E13D3083E20230CAE70C20A0E195
:1092E00001308CE20338A0E143C8A0E10228A0E1EC
:1092F0002228A0E10F1006E22033A0E1013183E132
:109300003D3083E20230CAE70C20A0E101308CE25C
:109310000338A0E143C8A0E10228A0E12228A0E18F
:109320003F3000E23D3083E20230CAE700005EE3F6
:1093300096FFFF1A0C08A0E12008A0E136FFFFEB22
:10934000F0AD1BE9A0130004F0412DE90370A0E388
:109350000760A0E114319FE50030D3E5063043E219
:10936000FF5013E23A00000A04819FE50620A0E1C5
:10937000013086E2FF6003E20240D8E73D4044E26C
:10938000FF4004E20620A0E1013086E2FF6003E234
:109390000200D8E73D0040E2FF1000E20620A0E115
:1093A000013086E2FF6003E20220D8E73D2042E27E
:1093B000FFC002E206E0A0E1013086E2FF6003E2C6
:1093C0000E30D8E73D3043E2FF3003E22112A0E146
:1093D000041181E1FF1001E20F0000E22CC1A0E1C5
:1093E00000028CE1032002E202C383E1013045E286
:1093F000FF5003E2FF0055E31500000A0730A0E12B
:10940000012087E2FF7002E20310C8E7013045E265
:10941000FF5003E2FF0055E30D00000A0730A0E112
:10942000012087E2FF7002E20300C8E7013045E255
:10943000FF5003E2FF0055E30500000A0720A0E10A
:10944000013087E2FF7003E202C0C8E7000055E385
:10945000C5FFFF1A1C209FE51C309FE5002083E517
:10946000032047E214309FE50020C3E5F081BDE80A
:1094700024050004F8110004FB1100042805000471
:109480002C0500040DC0A0E110D82DE904B04CE279
:10949000D0339FE50030D3E5000053E310A81B094B
:1094A000C4339FE5002093E51733A0E3053A83E238
:1094B000030052E110A81B190030E0E3AC239FE544
:1094C0000030C2E59FFFFFEBA4239FE50130D2E50A
:1094D000630053E38100001A0230D2E5653043E2B5
:1094E000120053E303F19F977C0000EA38950000D7
:1094F000E0960000E0960000E0960000E096000094
:10950000E0960000E0960000E0960000E096000083
:10951000E096000044950000E0960000E096000010
:10952000E096000078950000E0960000CC950000E1
:10953000E0960000609600000120A0E334339FE530
:10954000650000EA30339FE5003093E50030D3E555
:10955000FF3003E2033183E08330A0E11C239FE569
:10956000003082E5000053E30120A01310339F1563
:109570005900001A590000EAFC329FE5004093E5CB
:1095800000339FE54B2FA0E3B020C3E10C30D4E5BE
:109590000D20D4E5023483E10E20D4E5023883E1C6
:1095A0000F20D4E5023C83E1010053E34B00001A95
:1095B000880400EB0400A0E1A60400EBC90400EB62
:1095C000C4329FE5000083E5440000EAA8329FE52D
:1095D000003093E50030D3E5010053E30A00000AB0
:1095E000020000CA000053E30300000A3B0000EA47
:1095F000020053E30A00000A380000EA1A0200EBF6
:109600001733A0E3063A83E2110000EA7C329FE5BB
:109610000A30D3E5014013E23000001A59FCFFEB99
:10962000040000EA64329FE50A30D3E5014013E20A
:109630002A00001A13FCFFEB54329FE52F40C3E5CC
:109640003040C3E53140C3E53240C3E51733A0E302
:10965000013983E210229FE5003082E51F0000EA15
:1096600014329FE5004093E50C30D4E50D20D4E59D
:10967000023483E10E20D4E5023883E10F20D4E5E3
:10968000023C93E10400001A520400EB950400EB45
:10969000F4319FE5000083E50D0000EA0C30D4E5CD
:1096A0000D20D4E5023483E10E20D4E5023883E1B5
:1096B0000F20D4E5023C83E1010053E30400001ACB
:1096C0000400A0E1630400EBB8319FE57D2FA0E327
:1096D000B020C3E10120A0E3B8319FE50020C3E53D
:1096E0008C319FE50230D3E5FF3003E2613043E285
:1096F000150053E303F19F97520000EA54970000CE
:109700007C97000048980000A0970000489800004F
:1097100048980000D4970000E097000048980000A7
:1097200048980000489800001C98000048980000E5
:1097300048980000489800004898000048980000A9
:109740004898000048980000489800004898000099
:109750003C98000040219FE51C319FE5003093E5D7
:109760000030D3E50030C2E50030D2E51F0053E3FE
:109770001F30A0830030C285320000EA1C419FE503
:10978000F4309FE5001093E50400A0E10B20A0E376
:109790006C3400EB0920D4E504319FE5280000EA91
:1097A000D4309FE5003093E50030D3E5FF3003E28D
:1097B000033183E08330A0E1E8209FE5003082E5BB
:1097C000000053E30120A013DC309F151C00001A99
:1097D0001C0000EA0120A0E3D0309FE5180000EA59
:1097E000CC109FE590309FE5002093E50030D1E557
:1097F0000020D2E5023083E10030C1E50030D1E540
:10980000000053E30020A013A8309F150020C315CB
:109810000120A0E3A0309FE5090000EA58309FE551
:10982000003093E50020D3E590309FE50020C3E5AC
:109830000120A0E388309FE5010000EA0120A0E3B9
:1098400080309FE50020C3E50020A0E328309FE59D
:10985000002083E570309FE50020C3E504309FE5DC
:109860000020C3E510A81BE923050004280200041A
:109870002D020004F811000420050004280500044E
:10988000340200041F050004E0070004640500041E
:1098900048080004B8040004210500042402000460
:1098A0004813000431050004300200041D050004C3
:1098B0001A050004F6030004220500041B05000439
:1098C000F50300041C050004190500042C05000420
:1098D0000DC0A0E130D82DE904B04CE2FF5000E209
:1098E0000A0055E30D00A003F8FFFF0B1743A0E3A8
:1098F000050A84E24510A0E31E0F00EB000050E3D0
:10990000FAFFFF1A1703A0E3050A80E20510A0E1A1
:109910007E0F00EB0000A0E330A81BE90DC0A0E122
:1099200070D82DE904B04CE20040A0E1000050E303
:1099300070A81B090030D0E50300A0E1000053E34C
:1099400070A81B091733A0E3053A83E234209FE592
:10995000002092E5030052E170A81B1924609FE5E6
:109960001753A0E3055A85E2D8FFFFEB0100F4E5A9
:10997000000050E370A81B09003096E5050053E194
:1099800070A81B19F7FFFFEA280200040DC0A0E130
:1099900030D82DE904B04CE218D04DE250349FE5A8
:1099A0000030D3E5000053E330A81B0944349FE5A1
:1099B000002093E51733A0E3053A83E2030052E168
:1099C00030A81B1930449FE50020D4E5FF0052E386
:1099D0000D00000A0130A0E300308DE51C349FE546
:1099E000023283E004308DE51030A0E308308DE5CD
:1099F0004100A0E30210A0E30120A0E10430A0E1B7
:109A0000C2FDFFEB0030E0E30030C4E5F0439FE52A
:109A10000030D4E5000053E30B00000AD0339FE58B
:109A20000030D3E5000053E30700000A0120A0E363
:109A300000208DE54200A0E30210A0E30430A0E185
:109A4000B2FDFFEB0030A0E30030C4E5B4339FE586
:109A5000003093E5000053E30400000AA8339FE5BB
:109A6000000093E5DCE1FFEBFF0010E30300001AC8
:109A700098339FE50030D3E5000053E31200000A5D
:109A80006C339FE50030D3E5000053E30E00000A7D
:109A90004230A0E300308DE54400A0E30210A0E3D3
:109AA0000120A0E368339FE598FDFFEB54339FE569
:109AB000000093E5C2E1FFEB4C339FE5000083E536
:109AC0000020A0E344339FE50020C3E544439FE525
:109AD0000030D4E5000053E30C00000A10339FE58A
:109AE0000030D3E5000053E30800000A0B30A0E388
:109AF00000308DE54700A0E30210A0E30120A0E3C1
:109B000014339FE581FDFFEB0030A0E30030C4E596
:109B100008339FE50030D3E5000053E31D00000A41
:109B2000CC329FE50030D3E5000053E31900000A72
:109B300080DCFFEB0130A0E300308DE5E0429FE5E3
:109B40000030D4E5033183E0D8229FE5032182E091
:109B500004208DE51430A0E308308DE54800A0E333
:109B60000210A0E30120A0E10430A0E167FDFFEBBB
:109B70000030D4E5013083E20030C4E50030D4E5A4
:109B8000030053E30030A0830030C4850020A0E32D
:109B900088329FE50020C3E58C429FE50030D4E584
:109BA000000053E31400000A44329FE50030D3E57F
:109BB000000053E31000000A5EDCFFEB0120A0E38D
:109BC00000208DE564329FE504308DE508208DE5A9
:109BD00050329FE50C308DE55030A0E310308DE51C
:109BE0004C00A0E30210A0E30320A0E340329FE575
:109BF00046FDFFEB0030A0E30030C4E534429FE5B2
:109C00000030D4E5000053E30C00000AE0319FE58A
:109C10000030D3E5000053E30800000A0A30A0E357
:109C200000308DE55600A0E30210A0E30120A0E380
:109C300004329FE535FDFFEB0030A0E30030C4E5C2
:109C4000F8319FE5003093E5000053E30400000A7B
:109C5000EC319FE5000093E55FE1FFEBFF0010E3CF
:109C60000300001ADC319FE50030D3E5000053E328
:109C70001500000A78319FE50030D3E5000053E37A
:109C80001100000AC0319FE5C0219FE50020D2E508
:109C90004D20C3E55620A0E300208DE54F00A0E352
:109CA0000210A0E30120A0E318FDFFEB8C319FE53B
:109CB000000093E542E1FFEB84319FE5000083E57E
:109CC0000020A0E37C319FE50020C3E580419FE5B3
:109CD0000030D4E5000053E30C00000A10319FE58A
:109CE0000030D3E5000053E30800000A1930A0E378
:109CF00000308DE54500A0E30210A0E30120A0E3C1
:109D000050319FE501FDFFEB0030A0E30030C4E5DA
:109D100044519FE50030D5E5000053E32100000ADF
:109D2000CC309FE50030D3E5000053E31D00000A6E
:109D300028019FE51130D0E5030053E31900009A94
:109D40001C119FE5390400EB14319FE50040A0E3AE
:109D5000012084E30C20C3E50D40C3E50E40C3E5BC
:109D60000F40C3E50010E0E31010C3E51110C3E598
:109D70001220C3E53C10A0E31310C3E51440C3E573
:109D80001540C3E51640C3E51740C3E51840C3E5D9
:109D90002110A0E300108DE57300A0E30210A0E302
:109DA000DAFCFFEB0040C5E5B8409FE50030D4E5A4
:109DB000000053E330A81B0934309FE50030D3E5A1
:109DC000000053E330A81B099E0200EB14304BE265
:109DD000010063E50120A0E300208DE55700A0E32A
:109DE0000210A0E3C9FCFFEB0030A0E30030C4E5A3
:109DF00030A81BE92C0200042802000424020004FD
:109E0000549701003105000430020004401400049E
:109E10001D050004581300041A050004481300042B
:109E20001B05000422050004000000041C050004BA
:109E300050000004F503000419050004B8120004E2
:109E400034020004401300041F050004A0110004A4
:109E5000C0030004200500040808000418050004DD
:109E6000B804000490120004210500040DC0A0E114
:109E7000F0D92DE904B04CE224D04DE23C019FE53D
:109E8000A5FEFFEB2000A0E30110A0E3A90900EB71
:109E90000207A0E30110A0E3A60900EB44004BE297
:109EA000490C00EB0160A0E344404BE20050A0E30A
:109EB0000150C4E50430A0E344304BE50270A0E358
:109EC0000250C4E50360C4E50580A0E1B450C4E1DC
:109ED0001603A0E30B0A80E20410A0E1E80B00EBFC
:109EE0000208A0E30610A0E1920900EB0400A0E143
:109EF000350C00EB0160C4E544604BE50250C4E55D
:109F0000B470C4E11603A0E3090A80E20410A0E1E2
:109F1000DB0B00EB3C404BE20400A0E1530D00EBF7
:109F20006030A0E3BC334BE10830E0E3BA334BE1EF
:109F3000B8534BE1E13CA0E334300BE5B0534BE1C7
:109F4000033CA0E3BE324BE11030A0E3BC324BE156
:109F500028700BE524700BE51703A0E3060A80E2E6
:109F6000AC0C00EB1703A0E3060A80E20410A0E1AA
:109F7000C80C00EB1703A0E3060A80E25010A0E330
:109F80000620A0E1510D00EB1703A0E3060A80E2D2
:109F90000610A0E1460D00EB1200A0E30510A0E1C1
:109FA0000920A0E3130F00EB1200A0E30610A0E1CC
:109FB000650E00EB08009FE557FEFFEBF0A91BE9DB
:109FC00030B8010060B301000DC0A0E1F0D82DE968
:109FD00004B04CE208D04DE2C4009FE54EFEFFEB1A
:109FE0001200A0E30010A0E3570E00EB1703A0E35C
:109FF000060A80E20010A0E32D0D00EB1703A0E39A
:10A00000060A80E2830C00EB2000A0E30010A0E32E
:10A01000480900EB0207A0E30110A0E3450900EBAB
:10A0200024004BE2E80B00EB0170A0E324404BE27C
:10A030000050A0E30150C4E50430A0E324304BE518
:10A040000250C4E50350C4E50560A0E1B450C4E18A
:10A050001603A0E30B0A80E20410A0E1880B00EBDA
:10A060000208A0E30710A0E1320900EB0400A0E120
:10A07000D50B00EB0150C4E524704BE50250C4E55C
:10A080000350C4E5B450C4E11603A0E3090A80E21A
:10A090000410A0E17A0B00EB08009FE51EFEFFEB29
:10A0A000F0A81BE944B8010060B301000DC0A0E1B5
:10A0B00030D82DE904B04CE21703A0E3060A80E291
:10A0C0001010A0E33F0D00EB000050E30500001A64
:10A0D0001703A0E3060A80E24010A0E3390D00EB6D
:10A0E000000050E330A81B091703A0E3060A80E232
:10A0F0001010A0E3390D00EB1703A0E3060A80E27D
:10A100004010A0E3350D00EB88309FE5002093E57B
:10A110001733A0E3063A83E2030052E11753A0038A
:10A120000C00000A110000EA1743A0E3050A84E2CC
:10A130004510A0E30F0D00EB010050E3FAFFFF0A0A
:10A14000060A85E2740D00EB0010A0E1FF1001E2A9
:10A15000050A85E26D0D00EB060A85E24410A0E3D6
:10A16000040D00EB010050E330A81B09EDFFFFEAEE
:10A170001743A0E3010000EA060A84E2660D00EB43
:10A18000060A84E24410A0E3FA0C00EB010050E35D
:10A1900030A81B09F7FFFFEA280200040030A0E303
:10A1A0000030C0E5283080E52C3080E53030C0E557
:10A1B0003A30C0E50100A0E30EF0A0E10DC0A0E13F
:10A1C00070D82DE904B04CE20050A0E10140A0E1BC
:10A1D0000060A0E3060051E10600A00170A81B0981
:10A1E0000100A0E1ECFFFFEB0500A0E16110A0E39E
:10A1F00098EDFFEB0030A0E12C0084E5000050E377
:10A200000500000A0160A0E3286084E510009FE5D6
:10A21000F610A0E30620A0E112EFFFEB0600A0E19C
:10A2200070A81BE9549901000DC0A0E170D82DE978
:10A2300004B04CE20040A0E10160A0E3000050E364
:10A2400070A81B09283090E5000053E32000000AA5
:10A250000050A0E3283094E5020053E30900000A0F
:10A260000200008A010053E30B00000A140000EA18
:10A27000030053E31200001A0400A0E14E0000EBBB
:10A280000230A0E3020000EA0400A0E1250000EB98
:10A290000130A0E3283084E50A0000EA2C3094E580
:10A2A000000053E30600000A2C009FE51510A0E310
:10A2B0000120A0E3EBEEFFEB2C0094E510EEFFEBAA
:10A2C0000160A0E3285084E5283094E5000053E3C2
:10A2D000DFFFFF1A0600A0E170A81BE94C9A0100FD
:10A2E0000DC0A0E110D82DE904B04CE20040A0E37D
:10A2F0002CC091E504005CE10700000A0230A0E3F5
:10A30000283081E50140A0E314009FE54610A0E35A
:10A310000420A0E10C30A0E1D2EEFFEB0400A0E1AC
:10A3200010A81BE9649A01000DC0A0E110D82DE926
:10A3300004B04CE20040A0E3283090E5020053E373
:10A340000800001A2C3090E5040053E10500000AD3
:10A350000140A0E3284080E510009FE50E10A0E337
:10A360000420A0E1BFEEFFEB0400A0E110A81BE970
:10A37000AC9A01000DC0A0E100D82DE904B04CE278
:10A380000030A0E32CC090E503005CE10700000A68
:10A390000330A0E3283080E518009FE56810A0E3B3
:10A3A0000120A0E30C30A0E1AEEEFFEB0130A0E312
:10A3B0000300A0E100A81BE9BC9A01000DC0A0E1C8
:10A3C00000D82DE904B04CE20030A0E32CC090E5A9
:10A3D00003005CE10700000A0230A0E3283080E5BA
:10A3E00018009FE52110A0E30120A0E30C30A0E1BC
:10A3F0009CEEFFEB0130A0E30300A0E100A81BE905
:10A40000289B01000DC0A0E1F0D92DE904B04CE279
:10A4100034D04DE20060A0E10170A0E10000A0E3B3
:10A42000000056E100005111F0A91B090C30D6E5DF
:10A430000D20D6E5023483E10E20D6E5023883E113
:10A440000F20D6E5023C93E1F0A91B0998819FE516
:10A450000C30D8E50D20D8E5023483E10E20D8E594
:10A46000023883E10F20D8E5023C93E1F0A91B09F3
:10A47000283091E5030053E3F0A91B192C3091E536
:10A48000000053E3F0A91B090020D6E50130D6E512
:10A49000032482E10230D6E5032882E10330D6E5C9
:10A4A000032C82E144519FE59502C1E0C23FA0E147
:10A4B00041EB63E08E326EE0033363E083318EE084
:10A4C000033183E083C342E000005CE300C06CB270
:10A4D00054404BE20400A0E114119FE50E20A0E1DE
:10A4E0000C30A0E1023100EB0400A0E12C1097E554
:10A4F0008FEEFFEB0420D6E50530D6E5032482E19C
:10A500000630D6E5032882E10730D6E5032C82E148
:10A510009532C1E0C23FA0E141EB63E08E326EE0D4
:10A52000033363E083318EE0033183E083C342E091
:10A5300000005CE300C06CB20400A0E1B4109FE531
:10A540000E20A0E10C30A0E1E93000EB0400A0E116
:10A550002C1097E576EEFFEB0810D6E50930D6E52E
:10A56000031481E10A30D6E5031881E10B30D6E50A
:10A57000031C81E10830D8E50920D8E5023483E1E5
:10A580000A20D8E5023883E10B20D8E5023C83E1BC
:10A59000011063E0000051E30010A0B358309FE5C4
:10A5A0009301C2E0C13FA0E142E363E08E326EE07E
:10A5B00003318EE083C141E000005CE300C06CB277
:10A5C00054404BE20400A0E130109FE50E20A0E1D2
:10A5D0000C30A0E1C63000EB0400A0E12C1097E5A0
:10A5E00053EEFFEB0100A0E3F0A91BE950050004C6
:10A5F0006BCA5F6B58B8010068B80100D34D621098
:10A6000074B801000DC0A0E130D82DE904B04CE2CF
:10A610000050A0E10140A0E1283091E5030053E3A0
:10A620002200000A283094E5010053E30B00000AE1
:10A630000200003A020053E30F00000A150000EA8E
:10A640000400A0E1D4FEFFEB74009FE50410A0E13C
:10A65000D9FEFFEBFF0010E20130A013040000EA76
:10A6600060009FE50410A0E11CFFFFEBFF0010E27B
:10A670000230A0130500001A070000EA0400A0E160
:10A680003BFFFFEBFF0010E20300000A0330A0E3F2
:10A69000283084E5000000EA0100A0E3010050E357
:10A6A00030A81B19283094E5030053E3DCFFFF1AA0
:10A6B0000500A0E10410A0E151FFFFEBFF0000E264
:10A6C00030A81BE980B801008CB80100FF2002E22D
:10A6D000000050E30EF0A001001080E50030A0E380
:10A6E0000430C0E5081080E50C1080E50520C0E5C9
:10A6F0000100A0E30EF0A0E1FF1001E20420D0E58C
:10A700000530D0E5030052E10000A0230EF0A021A7
:10A710000C3090E50110C3E40520D0E5001090E571
:10A72000012082E0020053E10130A0210C3080E5DD
:10A730000430D0E5013083E20430C0E50100A0E33D
:10A740000EF0A0E1000051E3000050130000A00350
:10A750000EF0A0010430D0E5000053E30300A00197
:10A760000EF0A001082090E50130D2E40030C1E5F0
:10A770000530D0E5001090E5013083E0030052E1A0
:10A780000120A021082080E50430D0E5013043E21B
:10A790000430C0E50100A0E30EF0A0E10DC0A0E18F
:10A7A00000D82DE904B04CE20430D0E5000053E3BA
:10A7B000FEFFFF0AE2FFFFEBFF0000E200A81BE93B
:10A7C0000DC0A0E100D82DE904B04CE2010000EB7F
:10A7D000FF0000E200A81BE90020A0E354309FE541
:10A7E0000020C3E550309FE50020C3E54C309FE5D5
:10A7F0003920C3E53820C3E50210A0E140C09FE541
:10A800000200A0E1813281E00C3083E00C2083E281
:10A810000C00C3E50100C2E50200C2E50300C2E589
:10A82000013081E2FF1003E2130051E30100A08335
:10A830000EF0A081F2FFFFEA3C0500043D05000494
:10A84000A01100044814000404309FE50000D3E583
:10A850000EF0A0E13D0500040DC0A0E130D82DE9C7
:10A8600004B04CE20010A0E16C509FE50000D5E57B
:10A87000130050E30000A08330A81B89FF0000E212
:10A88000800280E054409FE5040080E02120A0E3A6
:10A890002C3000EB0000D5E5FF3000E2833283E08E
:10A8A000043083E00C1083E20020A0E301C082E3C7
:10A8B0000CC0C3E50120C1E50220C1E50320C1E5CC
:10A8C000010080E20000C5E50020D5E510309FE5DD
:10A8D0003920C3E50C00A0E130A81BE93D050004C8
:10A8E00048140004A01100040020A0E320309FE5DC
:10A8F0000020C3E51C309FE53820C3E518309FE5F4
:10A900000030D3E5020053E110009FE50200A001F2
:10A910000EF0A0E13C050004A01100043D05000478
:10A920004814000434109FE50030D1E5012083E293
:10A930002C309FE50030D3E5030052E10020C1B583
:10A940000030D1B51C209FB53830C2B5833283B0FA
:10A9500014209FB5020083B00000A0A30EF0A0E178
:10A960003C0500043D050004A01100044814000447
:10A970000DC0A0E130D82DE904B04CE2E4339FE5EE
:10A980000830D3E5630053E33900008AD8239FE5FC
:10A990000010A0E3013081E32630C2E52710C2E5B4
:10A9A0002810C2E52910C2E50010C2E50110C2E579
:10A9B000010051E13730A0030130A0110330E0E184
:10A9C0000230C2E5420081E30300C2E50410C2E5A3
:10A9D0000510C2E5010051E14B30A0030130A01188
:10A9E0000330E0E10630C2E50700C2E50810C2E529
:10A9F0000910C2E50A30C2E50B00C2E50C10C2E541
:10AA00000D10C2E50E30C2E50F00C2E51010C2E520
:10AA10001110C2E51230C2E51300C2E51410C2E500
:10AA20001510C2E51610C2E51710C2E50630A0E306
:10AA30001830C2E50830A0E31930C2E51A10C2E5AB
:10AA40001B10C2E51C10C2E51D10C2E51E10C2E5B8
:10AA50001F10C2E52010C2E52110C2E57D3081E360
:10AA60002230C2E52310C2E52410C2E52510C2E55C
:10AA7000A30000EAF4329FE50030D3E5000053E381
:10AA80000D00001AE8329FE50930D3E5310053E3A9
:10AA9000D4329F950020A093021082930900009A5F
:10AAA000CC329FE50930D3E5B30053E3B8329F853C
:10AAB0000020A083031082830200008AA8329FE551
:10AAC0000020A0E3011082E32610C3E52720C3E5A0
:10AAD0002820C3E52920C3E58C529FE590329FE5ED
:10AAE000DA40D3E10400A0E1D12800EB000054E3F8
:10AAF0004314A0B3021581B2212800BB0000C5E5B4
:10AB00002034A0E10130C5E52038A0E10230C5E5E0
:10AB1000203CA0E10330C5E54C529FE550329FE553
:10AB2000DB40D3E10400A0E1C12800EB000054E3C6
:10AB30004314A0B3021581B2112800BB0400C5E57F
:10AB40002034A0E10530C5E52038A0E10630C5E598
:10AB5000203CA0E10730C5E50C529FE510329FE58F
:10AB6000DC40D3E10400A0E1B12800EB000054E395
:10AB70004314A0B3021581B2012800BB0800C5E54B
:10AB80002034A0E10930C5E52038A0E10A30C5E550
:10AB9000203CA0E10B30C5E5CC519FE5D0319FE5CD
:10ABA000DD40D3E10400A0E1A12800EB000054E364
:10ABB0004314A0B3021581B2F12700BB0C00C5E518
:10ABC0002034A0E10D30C5E52038A0E10E30C5E508
:10ABD000203CA0E10F30C5E58C519FE590319FE509
:10ABE000DD40D3E10400A0E1912800EB000054E334
:10ABF0004314A0B3021581B2E12700BB1000C5E5E4
:10AC00002034A0E11130C5E52038A0E11230C5E5BF
:10AC1000203CA0E11330C5E54C519FE550319FE544
:10AC2000DE40D3E10400A0E1812800EB000054E302
:10AC30004314A0B3021581B2D12700BB1400C5E5AF
:10AC40002034A0E11530C5E52038A0E11630C5E577
:10AC5000203CA0E11730C5E50C219FE510119FE5D0
:10AC60000F30D1E51830C2E51030D1E51930C2E51A
:10AC70000250A0E1D241D1E10400A0E16C2800EB38
:10AC8000000054E34314A0B3021581B2BC2700BBFB
:10AC90001A00C5E52034A0E11B30C5E52038A0E14D
:10ACA0001C30C5E5203CA0E11D30C5E5B8109FE58E
:10ACB000BC009FE51130D0E5033183E0033183E030
:10ACC0000331A0E11E30C1E52324A0E11F20C1E52E
:10ACD0002328A0E12020C1E5233CA0E12130C1E5EB
:10ACE0001530D0E58330A0E12230C1E52324A0E176
:10ACF0002320C1E50020A0E32420C1E5233CA0E1FE
:10AD00002530C1E560109FE52630D1E52720D1E54B
:10AD1000023483E12820D1E5023883E12920D1E5FE
:10AD2000023C83E14C209FE5002092E5020053E1C4
:10AD300044309F156420A013B020C31128109FE554
:10AD40002630D1E52720D1E5023483E12820D1E562
:10AD5000023883E12920D1E5023C83E114209FE5FC
:10AD6000003082E530A81BE9480800040017000401
:10AD7000C5030004C807000468050004E0070004D8
:10AD800048109FE52F30D1E53020D1E5023483E132
:10AD90003120D1E5023883E13220D1E5023C93E154
:10ADA0000800000A1230D1E5030053E30500001A41
:10ADB0001130D1E518209FE51820D2E5020053E1BB
:10ADC0000100A0230EF0A0210000A0E30EF0A0E1FE
:10ADD000B80400040017000448109FE5D030D1E10A
:10ADE000000053E3003063B23C209FE5D921D2E15B
:10ADF000020053E1040000CAD130D1E1000053E366
:10AE0000003063B2020053E1040000DA18309FE51D
:10AE1000D931D3E1000053E30100A0C30EF0A0C17B
:10AE20000000A0E30EF0A0E14808000400170004B1
:10AE300001C0A0E10010A0E301005CE1010050119D
:10AE40000100A0010EF0A0010C30D0E50D20D0E5EE
:10AE5000023483E10E20D0E5023883E10F20D0E5F3
:10AE6000023C93E13000000A0030D0E50120D0E53B
:10AE7000023483E10220D0E5023883E10320D0E5EB
:10AE8000023C83E10010A0E30030CCE52324A0E1E4
:10AE90000120CCE52328A0E10220CCE5233CA0E161
:10AEA0000330CCE50430D0E50520D0E5023483E161
:10AEB0000620D0E5023883E10720D0E5023C83E19B
:10AEC0000430CCE52324A0E10520CCE52328A0E133
:10AED0000620CCE5233CA0E10730CCE50830D0E5E6
:10AEE0000920D0E5023483E10A20D0E5023883E16D
:10AEF0000B20D0E5023C83E10830CCE52324A0E11F
:10AF00000920CCE52328A0E10A20CCE5233CA0E1E0
:10AF10000B30CCE5013081E30C30CCE50D10CCE5F5
:10AF20000E10CCE50F10CCE50310A0E10100A0E16C
:10AF30000EF0A0E1000050E30000A0030EF0A0011D
:10AF40000030A0E30030C0E50130C0E50230C0E5CC
:10AF50000330C0E50430C0E50530C0E50630C0E58B
:10AF60000730C0E50830C0E50930C0E50A30C0E56B
:10AF70000B30C0E50C30C0E50D30C0E50E30C0E54B
:10AF80000F30C0E50100A0E30EF0A0E11C209FE51A
:10AF90000030A0E30030C2E50130C2E50230C2E576
:10AFA0000330C2E50430C2E50530C2E50EF0A0E191
:10AFB000E01600040DC0A0E100D82DE904B04CE279
:10AFC00044009FE554FAFFEBBFF3FFEBEEFFFFEB0E
:10AFD00038009FE5D6FFFFEB34009FE5D4FFFFEB81
:10AFE0000020A0E32C309FE5002083E5F3FDFFEB7C
:10AFF0003CFEFFEB20309FE5000083E55BFEFFEBAE
:10B0000018009FE544FAFFEB00A81BE998B801007F
:10B0100040050004500500046005000464050004B8
:10B0200060B301000DC0A0E170D82DE904B04CE27E
:10B030000160A0E1DB2700EB0150A0E10040A0E1AE
:10B040000600A0E1D72700EB0130A0E10020A0E13D
:10B050000510A0E10400A0E1B11900EB40208FE24F
:10B060000C0092E8FF2900EB7D2B00EB430F60E220
:10B07000020080E2B634A0E3B63A83E2B73083E25E
:10B080009023C3E0003083E0C02FA0E1433462E0AE
:10B09000833083E0033263E0833140E00300A0E1CA
:10B0A00070A81BE946DF913F399D52A20DC0A0E177
:10B0B000F0D92DE904B04CE20060A0E10180A0E1EC
:10B0C0000270A0E1000090E5352B00EB0150A0E1FB
:10B0D0000040A0E1000098E5312B00EB0130A0E139
:10B0E0000020A0E10510A0E10400A0E18D1900EB13
:10B0F0005B2B00EB0040A0E1000050E30700501183
:10B10000F0A91BD9003096E5930700E00410A0E1F8
:10B110005E2400EB000086E5003098E5930700E030
:10B120000410A0E1592400EB000088E5F0A91BE918
:10B130000DC0A0E1F0DB2DE904B04CE20070A0E10D
:10B140000160A0E1000051E300005013D100000AAB
:10B150000C30D0E50D20D0E5023483E10E20D0E59F
:10B16000023883E10F20D0E5023C93E1C900000AD8
:10B170000C30D1E50D20D1E5023483E10E20D1E57C
:10B18000023883E10F20D1E5023C93E1C100000ABF
:10B190000000D0E50130D7E5030480E10230D7E5B7
:10B1A000030880E10330D7E5030C80E1FC2A00EBC3
:10B1B0000D2D8FE20C0092E8A72800EB0150A0E1D2
:10B1C0000040A0E10000D6E50130D6E5030480E1AF
:10B1D0000230D6E5030880E10330D6E5030C80E1B8
:10B1E000EF2A00EBC32F8FE20C0092E89A2800EBC5
:10B1F0000130A0E10020A0E10510A0E10400A0E1E1
:10B20000682800EB0190A0E10080A0E1BB2F8FE255
:10B210000C0092E86D2A00EB000050E3050000DA14
:10B220000910A0E10800A0E1B62F8FE20C0092E81F
:10B230005C2800EB0B0000EA0910A0E10800A0E187
:10B24000B22F8FE20C0092E8AE2A00EB000050E330
:10B25000060000AA0910A0E10800A0E1A92F8FE2D2
:10B260000C0092E8372800EB0190A0E10080A0E1FB
:10B270000400D6E50530D6E5030480E10630D6E5C6
:10B28000030880E10730D6E5030C80E1C42A00EB17
:10B29000262E8FE20C0092E86F2800EB9D2F8FE2A4
:10B2A0000C0092E86C2800EBDF1800EB0130A0E105
:10B2B0000020A0E10910A0E10800A0E1662800EB51
:10B2C0000190A0E10080A0E10400D7E50530D7E5BA
:10B2D000030480E10630D7E5030880E10730D7E5B5
:10B2E000030C80E1AE2A00EB822F8FE20C0092E883
:10B2F000592800EB0150A0E10040A0E10400D6E590
:10B300000530D6E5030480E10630D6E5030880E188
:10B310000730D6E5030C80E1A12A00EB752F8FE200
:10B320000C0092E84C2800EB0130A0E10020A0E1E5
:10B330000510A0E10400A0E11A2800EB0160A0E1E3
:10B340000050A0E1DC419FE50030A0E30030C4E5FF
:10B350000130C4E50230C4E50330C4E56F2F8FE24D
:10B360000C0092E83C2800EBBD2A00EB0400C4E589
:10B370002034A0E10530C4E52038A0E10630C4E562
:10B38000200CA0E10700C4E50910A0E10800A0E13D
:10B39000622F8FE20C0092E82F2800EBB02A00EB1E
:10B3A0000800C4E52034A0E10930C4E52038A0E15C
:10B3B0000A30C4E5200CA0E10B00C4E50910A0E1AF
:10B3C0000800A0E10630A0E10520A0E1D51800EBBF
:10B3D000522F8FE20C0092E81F2800EBA02A00EB0E
:10B3E0001000C4E52034A0E11130C4E52038A0E10C
:10B3F0001230C4E5200CA0E11300C4E51020D4E510
:10B400001130D4E5032482E11230D4E5032882E12F
:10B410001330D4E5033C92E10C30C4050D30C40573
:10B420000E30C4050F30C4051100000AF4409FE53A
:10B430000610A0E10500A0E1EC2A00EB0050A0E11D
:10B440000910A0E10800A0E1E82A00EB0010A0E14B
:10B450000500A0E1F2FEFFEB0C00C4E52034A0E102
:10B460000D30C4E52038A0E10E30C4E5200CA0E189
:10B470000F00C4E5AC309FE50020A0E3011082E39B
:10B480000010C3E50120C3E50220C3E50320C3E5A6
:10B490000100A0E1F0AB1BE988209FE50030A0E3AC
:10B4A0000430C2E50530C2E50630C2E50730C2E52A
:10B4B0000830C2E50930C2E50A30C2E50B30C2E50A
:10B4C0001030C2E51130C2E51230C2E51330C2E5DA
:10B4D0000C30C2E50D30C2E50E30C2E50F30C2E5DA
:10B4E0000030C2E50130C2E50230C2E50330C2E5FA
:10B4F0000300A0E1F0AB1BE9F2D77A3E000000A008
:10B5000000806640000000000080764000000000DF
:10B51000008066C00000000046DF913F399D52A2C6
:10B5200070356541000000A0E81600040DC0A0E1E0
:10B53000F0DF2DE904B04CE2444A9FE52F30D4E51A
:10B540003020D4E5023483E13120D4E5023883E1B0
:10B550003220D4E5023C83E1010053E30D00000AF0
:10B560002202003A020053E32002001A143A9FE537
:10B57000000093E518DBFFEBFF0010E31B02000A5D
:10B580000030A0E32F30C4E53030C4E53130C4E5ED
:10B590003230C4E5150200EAF4FCFFEB960FA0E39D
:10B5A00007DBFFEBDC399FE5000083E5D8299FE549
:10B5B000003092E5013083E2003082E5CC099FE55E
:10B5C000BC199FE51730D1E51820D1E5023483E19D
:10B5D0002C30C0E52334A0E12D30C0E51B30D1E58F
:10B5E0001C20D1E5023483E12E30C0E52334A0E1F4
:10B5F0002F30C0E51130D1E54030C0E50030A0E388
:10B600004130C0E5DDFDFFEBFF0010E3C601000A9D
:10B610007C399FE50A30D3E5080013E30800001ADF
:10B6200070199FE50C30D1E50D20D1E5023483E19E
:10B630000E20D1E5023883E10F20D1E5023C93E1F1
:10B640000D00001A38099FE548199FE5F7FDFFEB4B
:10B65000FF0010E30500000A3C399FE5AF0FA0E3AF
:10B66000B000C3E12C099FE530199FE5EFFDFFEB2A
:10B670009CFCFFEB28399FE5000083E524199FE53A
:10B680002630D1E52720D1E5023483E12820D1E519
:10B69000023883E12920D1E5023C83E1030053E332
:10B6A00003F19F979B0000EA18B90000B8B60000AC
:10B6B000D8B6000014B70000EC289FE54C30D2E566
:10B6C0000630C3E34C30C2E54C30D2E5013083E3B1
:10B6D0004C30C2E58F0000EACC289FE54C30D2E523
:10B6E0000530C3E34C30C2E54C30D2E5023083E391
:10B6F0004C30C2E57BFCFFEBA4389FE5000083E5FE
:10B70000B4FDFFEBFF0010E3A0289F058500000AB1
:10B71000800000EA90389FE54C20D3E50320C2E387
:10B720004C20C3E54C20D3E5042082E34C20C3E544
:10B730006C589FE5001095E5000051E35700000AA2
:10B740000C20D1E50D30D1E5032482E10E30D1E5A6
:10B75000032882E10F30D1E5034C92E10700001A83
:10B760006FFCFFEB000085E544389FE50040C3E532
:10B7700024389FE5FF10A0E3B010C3E1470000EAC2
:10B780001C389FE5001093E528389FE5003093E5CD
:10B79000030051E10800001A0C30D1E50D20D1E57D
:10B7A000023483E10E20D1E5023883E10F20D1E598
:10B7B000023C83E1010053E30600001AE0379FE5F5
:10B7C000002093E5EC379FE5002083E50020A0E30F
:10B7D000DC379FE50020C3E5DC179FE50030D1E5AD
:10B7E0000120D1E5023483E10220D1E5023883E172
:10B7F0000320D1E5023C93E11A00000AB0079FE55F
:10B800000030D0E5000053E31600001A1020D1E507
:10B810001130D1E5032482E11230D1E5032882E121
:10B820001330D1E5032C82E174379FE5001093E5D6
:10B830001230D1E5033183E0033183E0030152E1AB
:10B84000080000AA0130A0E30030C0E51330D1E5C4
:10B85000830263E0000183E08001A0E158DAFFEB9E
:10B8600058379FE5000083E544479FE50030D4E565
:10B87000000053E30900000A40379FE5000093E50C
:10B8800055DAFFEBFF0010E30400000A24FCFFEB95
:10B890000C379FE5000083E50030A0E30030C4E5ED
:10B8A000FC469FE5003094E5000053E30400000AE5
:10B8B000CC069FE5F4169FE55CFDFFEB002094E5C8
:10B8C000180000EACC169FE50C30D1E50D20D1E53B
:10B8D000023483E10E20D1E5023883E10F20D1E567
:10B8E000023C93E10600001AC0369FE5D0269FE592
:10B8F000003082E5A0369FE5FF20A0E3B020C3E141
:10B900000A0000EA78069FE5A0169FE547FDFFEBD9
:10B9100080269FE5030000EA64069FE58C169FE5FC
:10B9200042FDFFEB0020A0E394369FE5002083E575
:10B930008C369FE5003093E5000053E30200001AC7
:10B9400080069FE57AFDFFEBD90000EA70369FE59F
:10B95000001093E570369FE5003093E5030051E158
:10B960001400001A0C30D1E50D20D1E5023483E13A
:10B970000E20D1E5023883E10F20D1E5023C83E1BE
:10B98000010053E30B00000A18169FE51E30D1E5B5
:10B990001F20D1E5023483E12020D1E5023883E184
:10B9A0002120D1E5023C83E120269FE5002092E59D
:10B9B000020053E1BE00000A04369FE5000093E553
:10B9C000D0159FE5D9FDFFEBFF0010E3AE00000AA4
:10B9D000E4859FE51000D8E51130D8E5030480E147
:10B9E0001230D8E5030880E11330D8E5030C80E17C
:10B9F000B0159FE51E30D1E51F20D1E5023483E16B
:10BA00002020D1E5023883E12120D1E5021C83E129
:10BA1000010050E1930000DA8C259FE54C30D2E51F
:10BA2000083083E34C30C2E500A0A0E31010C8E565
:10BA30002134A0E11130C8E52138A0E11230C8E579
:10BA4000213CA0E11330C8E51020D8E51130D8E53D
:10BA5000032482E11230D8E5032882E11330D8E5CF
:10BA6000032C82E1080088E2041088E28EFDFFEBDF
:10BA700050559FE50CA0C5E50DA0C5E50EA0C5E598
:10BA80000FA0C5E50C659FE50470D6E50530D6E549
:10BA9000037487E10630D6E5037887E10730D6E501
:10BAA000037C87E10470C5E52734A0E10530C5E5D6
:10BAB0002738A0E10630C5E5273CA0E10730C5E501
:10BAC0000440D5E50530D5E5034484E10630D5E5ED
:10BAD000034884E10730D5E5034C84E10400D8E550
:10BAE0000530D8E5030480E10630D8E5030880E19D
:10BAF0000730D8E5030C80E1CD2400EBD0149FE59E
:10BB0000602400EBEE2400EB004084E00440C5E537
:10BB10002434A0E10530C5E52438A0E10630C5E5B0
:10BB2000244CA0E10740C5E50030D6E50120D6E56C
:10BB3000023483E10220D6E5023883E10320D6E512
:10BB4000023C83E10030C5E52324A0E10120C5E5E6
:10BB50002328A0E10220C5E5233CA0E10330C5E590
:10BB60000040D5E50130D5E5034484E10230D5E558
:10BB7000034884E10330D5E5034C84E10800D8E5AF
:10BB80000930D8E5030480E10A30D8E5030880E1F4
:10BB90000B30D8E5030C80E1A52400EB012500EB78
:10BBA0000190A0E10080A0E10700A0E17C2800EB6B
:10BBB000ED2F8FE20C0092E8272600EB3B2E8FE260
:10BBC0000C0092E8242600EB971600EBEA2F8FE298
:10BBD0000C0092E8202600EB0130A0E10020A0E15B
:10BBE0000910A0E10800A0E11E2700EB9C2800EB53
:10BBF000004084E00040C5E52434A0E10130C5E503
:10BC00002438A0E10230C5E5244CA0E10340C5E59D
:10BC1000AC439FE5001094E50830D1E50920D1E55B
:10BC2000023483E10A20D1E5023883E10B20D1E51B
:10BC3000023C83E10830C5E52324A0E10920C5E5E5
:10BC40002328A0E10A20C5E5233CA0E10B30C5E58F
:10BC500001308AE30C30C5E50DA0C5E50EA0C5E5B1
:10BC60000FA0C5E50A0000EA54339FE5000093E504
:10BC700050139FE56DFCFFEB2C239FE54C30D2E584
:10BC80000830C3E34C30C2E5010000EA34039FE50D
:10BC9000A7FCFFEB28339FE5001093E50030A0E3FD
:10BCA000022083E30C20C1E50D30C1E50E30C1E573
:10BCB0000F30C1E5EC129FE51E30D1E51F20D1E524
:10BCC000023483E12020D1E5023883E12120D1E54F
:10BCD000023C83E1F4229FE5003082E5E0329FE5FB
:10BCE000002093E5E0329FE5002083E590029FE588
:10BCF000D0129FE50DFDFFEBFF0010E30800000AE6
:10BD0000D0229FE50030A0E30030C2E50130C2E55B
:10BD10000230C2E50330C2E50430C2E50530C2E5B9
:10BD20002B0000EA98FCFFEB290000EA96FCFFEBF1
:10BD300070129FE52630D1E52720D1E5023483E15A
:10BD40002820D1E5023883E12920D1E5023C83E1B6
:10BD5000010053E31E00000A24329FE51030D3E5B2
:10BD6000010013E30A00001A1C329FE5002093E54E
:10BD700064329FE5920383E02331A0E1033183E045
:10BD8000030052E110329F056410A003B010C301FC
:10BD90000F00000AE8319FE51120D3E504329FE54A
:10BDA0001830D3E5030052E10900002AD8319FE59D
:10BDB000002093E520329FE5924383E02331A0E108
:10BDC000033183E0030052E1CC319F050A00A00358
:10BDD000B000C301A8319FE50020A0E3021082E378
:10BDE0002F10C3E53020C3E53120C3E53220C3E581
:10BDF00098019FE5C0419FE50430D4E50520D4E5D6
:10BE0000023483E13830C0E52334A0E13930C0E5A5
:10BE10000830D4E50920D4E5023483E13A30C0E5A6
:10BE20002334A0E13B30C0E5A8119FE50030D1E507
:10BE30000120D1E5023483E13C30C0E52334A0E1A8
:10BE40003D30C0E50230D1E50320D1E5023483E185
:10BE50003E30C0E52334A0E13F30C0E520019FE53E
:10BE600044119FE5F1FBFFEB58019FE56C119FE545
:10BE7000EEFBFFEB30119FE504019FE51130D0E5AB
:10BE80003A30C1E51030D4E51120D4E5023483E125
:10BE90002030C1E52334A0E12130C1E50C30D4E5E8
:10BEA0000D20D4E5023483E12230C1E52334A0E142
:10BEB0002330C1E5D8E09FE50930DEE54130C1E53A
:10BEC0002330D0E52420D0E5023483E14230C1E5BF
:10BED0002334A0E14330C1E52730D0E52820D0E568
:10BEE000023483E14430C1E52334A0E14530C1E5AB
:10BEF000EC009FE50930D0E50A20D0E5023483E16B
:10BF00004630C1E52334A0E14730C1E50130D0E53A
:10BF10000220D0E5023483E10338A0E14328A0E108
:10BF2000C0C09FE59C42C2E0C33FA0E1423163E054
:10BF30004830C1E50330D0E50420D0E5023483E188
:10BF40000338A0E14328A0E19C02C2E0C33FA0E186
:10BF5000423163E04930C1E50830DEE54A30C1E5F1
:10BF60000A30DEE54B30C1E5F0AF1BE9F2D77A3E8F
:10BF7000000000A046DF913F399D52A28BCAF13FDD
:10BF800000000060B8040004700500046C050004A3
:10BF9000581300044808000450050004E00700049A
:10BFA000C41100046405000400170004A01100047B
:10BFB000400500048C05000478050004E816000420
:10BFC00090050004600500047C050004740500046D
:10BFD000380200045B548E3FE0160004CDCCCCCC7C
:10BFE000B011000410090004676666660DC0A0E188
:10BFF00000D82DE904B04CE2692700EB14208FE251
:10C000000C0092E8142500EB10208FE20C0092E85F
:10C01000112500EB00A81BE9F2D77A3E000000A032
:10C0200046DF913F399D52A20DC0A0E100D82DE915
:10C0300004B04CE25A2700EB08208FE20C0092E893
:10C04000052500EB00A81BE9F2D77A3E000000A00E
:10C0500018F09FE518F09FE518F09FE518F09FE5B0
:10C0600018F09FE50000A0E118F09FE518F09FE5AB
:10C07000A0C1000090C0000094C0000098C0000063
:10C080009CC0000000000000A0C00000A4C0000090
:10C09000230000EA1A0000EA280000EA2F0000EA64
:10C0A000000000EA350000EA04E04EE2FF5F2DE9FF
:10C0B00000104FE102002DE92C029FE5000090E501
:10C0C00028129FE5001091E50000A0E10000A0E12A
:10C0D0001FF021E300402DE914E29FE500F0A0E10C
:10C0E0000040BDE8D2F021E3FC019FE5000080E5BF
:10C0F000F8119FE5001081E50200BDE801F06FE155
:10C10000FF9FFDE8FF5F2DE900104FE102002DE9E0
:10C110000D10A0E16FD2FFEB0200BDE801F06FE16E
:10C12000FF9FFDE8FF5F2DE900104FE102002DE9C0
:10C1300071D2FFEB0200BDE801F06FE1FF9FFDE867
:10C1400004E04EE2FF5F2DE900104FE102002DE90F
:10C1500072D2FFEB0200BDE801F06FE1FF9FFDE846
:10C1600008E04EE2FF5F2DE900104FE102002DE9EB
:10C1700059D2FFEB0200BDE801F06FE1FF9FFDE83F
:10C1800004E04EE2FF402DE900104FE102002DE9EE
:10C1900061D2FFEB0200BDE801F06FE1FF80FDE836
:10C1A00050119FE50020A0E3011041E2020051E19F
:10C1B000FCFFFF8A40019FE540119FE5341080E5B8
:10C1C00034019FE538119FE5001080E50000A0E1F3
:10C1D0000000A0E10000A0E10000A0E10000A0E15B
:10C1E0000000A0E10000A0E10000A0E10000A0E14B
:10C1F0000000A0E10000A0E10000A0E10000A0E13B
:10C200000000A0E10000A0E10000A0E10267A0E3BF
:10C210006070A0E3B070C6E1E8609FE50370A0E342
:10C22000B070C6E1E0109FE5041080E5081090E5CD
:10C23000011011E2FCFFFF0AD0109FE5001080E51D
:10C24000CC109FE51C1080E5C8109FE5201080E50C
:10C25000C4009FE5D1F021E300D0A0E1800040E2DE
:10C26000D2F021E300D0A0E1020B40E2D7F021E3BD
:10C2700000D0A0E1040040E2DBF021E300D0A0E127
:10C28000040040E2D3F021E300D0A0E1800040E2CE
:10C2900010F021E300D0A0E101AB4DE27C109FE55E
:10C2A0007C209FE57C309FE5030052E1040091343F
:10C2B00004008234FBFFFF3A0000A0E368109FE512
:10C2C00068209FE5020051E104008134FCFFFF3A41
:10C2D0000000A0E358109FE558209FE5020051E1BF
:10C2E00004008134FCFFFF3AECD0FFEA30F0FFFF9E
:10C2F000300000FCE0C0000020A107000020005C2E
:10C3000096010000020002004030080019C00B0036
:10C3100080000200731B000001C8FE0000800104C1
:10C32000F0B8010000000004B8030004C0030004DA
:10C33000A8180004A8180004A81800041713A0E304
:10C34000021A81E2002091E50320C2E3000050E3DD
:10C35000002082110700001A043091E5020713E360
:10C360000200000A083091E5010013E30100001A01
:10C370000000A0E30EF0A0E11733A0E3023A83E24D
:10C38000002083E50100A0E30EF0A0E10DC0A0E1D4
:10C3900070D82DE904B04CE2FF4000E2FF5001E20A
:10C3A000FF6002E20000A0E3100000EB010050E398
:10C3B0000000A01370A81B191723A0E3022A82E231
:10C3C0000030A0E3043082E5043092E5043483E1D8
:10C3D000043082E5043092E5033085E1043082E5E3
:10C3E000043092E5063883E1043082E570A81BE949
:10C3F00004D04DE2010050E31500001A1723A0E31A
:10C40000022A82E2043092E5020713E30200000AE6
:10C41000083092E5010013E32400001A1733A0E36B
:10C42000023A83E2082093E5012082E3082083E5B5
:10C43000042093E5022782E3042083E51723A0E389
:10C44000022A82E2083092E5000053E3FCFFFF0A73
:10C45000140000EA1733A0E3023A83E2003093E5C8
:10C46000030013E31100000A0A30A0E300308DE559
:10C4700000309DE5000053E30500000A00309DE513
:10C48000013043E200308DE500309DE5000053E3CC
:10C49000F9FFFF1A1723A0E3022A82E2043092E593
:10C4A0000237C3E3043082E50100A0E3000000EAA4
:10C4B0000000A0E304D08DE20EF0A0E11723A0E37A
:10C4C000022A82E2003092E51C30C3E3003082E5AC
:10C4D0001D0070E30030921503308011003082158A
:10C4E0000EF0A0E11723A0E3022A82E2003092E5D9
:10C4F0006030C3E3003082E5610070E300309215E4
:10C5000003308011003082150EF0A0E11723A0E364
:10C51000022A82E2003092E5063DC3E3003082E564
:10C52000063DE0E3030050E1003092150330801136
:10C53000003082150EF0A0E1010051E31723A003A3
:10C54000022A820218309205033080011723A013BB
:10C55000022A8212183092150030C311183082E579
:10C560000EF0A0E1010051E31723A003022A82028A
:10C5700014309205033080011723A013022A82127F
:10C58000143092150030C311143082E50EF0A0E192
:10C59000000051E31723A003022A820220309205F3
:10C5A000033080011723A013022A82122030921533
:10C5B0000030C311203082E50EF0A0E1000051E30D
:10C5C0001723A003022A82021C3092050330800147
:10C5D0001723A013022A82121C3092150030C311B7
:10C5E0001C3082E50EF0A0E1010051E31723A00307
:10C5F000022A820228309205033080011723A013FB
:10C60000022A8212283092150030C311283082E5A8
:10C610000EF0A0E1010051E31723A003022A8202D9
:10C6200024309205033080011723A013022A8212BE
:10C63000243092150030C311243082E50EF0A0E1C1
:10C64000010051E31723A003022A82023030920531
:10C65000033080011723A013022A82123030921572
:10C660000030C311303082E50EF0A0E1010051E34B
:10C670001723A003022A82022C3092050330800186
:10C680001723A013022A82122C3092150030C311F6
:10C690002C3082E50EF0A0E11723A0E3022A82E20B
:10C6A000003092E5023CC3E3003082E5020C50E327
:10C6B00000309205023C8303003082050EF0A0E1B9
:10C6C000FF0010E30900001A1723A0E3022A82E208
:10C6D000003092E5023AC3E3003082E5010051E305
:10C6E00000309205023A83030EF0A011080000EA20
:10C6F0001723A0E3022A82E2003092E50139C3E366
:10C70000003082E5010051E30EF0A011003092E507
:10C71000013983E3003082E50EF0A0E10118A0E1C9
:10C720004118A0E1FF0010E31723A003022A8202B0
:10C730000138A0012338A001383082051723A01347
:10C74000022A82120138A0112338A0113C30821530
:10C750000EF0A0E11723A0E3022A82E2003092E566
:10C76000033BC3E3003082E5033BE0E3030050E119
:10C770000030921503308011003082150EF0A0E1D8
:10C78000010050E31723A003022A82020030920521
:10C79000013A83031723A013022A82120030921554
:10C7A000013AC313003082E50EF0A0E11723A0E3A5
:10C7B000022A82E2003092E50138C3E3003082E5CC
:10C7C0000138E0E3030050E1003092150138831393
:10C7D000003082150EF0A0E11723A0E3022A82E2C6
:10C7E000003092E50638C3E3003082E50638E0E326
:10C7F000030050E100309215023883130030821597
:10C800000EF0A0E11723A0E3022A82E2343092E581
:10C810004030C3E3343082E5410070E33430921598
:10C8200040308313343082150EF0A0E11723A0E3CB
:10C83000022A82E2343092E5013CC3E3343082E5DF
:10C84000013CE0E3030050E134309215013C8313D6
:10C85000343082151723A0E3022A82E2343092E5B5
:10C860008030C3E3343082E5810071E334309215C7
:10C8700080308313343082150EF0A0E1010051E3C3
:10C880001723A003022A8202103092050030C30150
:10C890001723A013022A8212103092150330801140
:10C8A000103082E50EF0A0E11733A0E3023A83E2F4
:10C8B000083093E5030010E10000A0030100A0137D
:10C8C0000EF0A0E11733A0E3023A83E2080083E50B
:10C8D0000EF0A0E10DC0A0E100D82DE904B04CE2BB
:10C8E0001733A0E3023A83E2041093E5042093E5B2
:10C8F000FF2C02E2043093E5073803E223C8A0E1ED
:10C90000FF1011E20030A0030130A0132204A0E1C7
:10C91000000052E30030A00301300312000053E393
:10C920000000A00300A81B0914309FE5003093E528
:10C93000930000E08000A0E1111CA0E12D1E00EB9F
:10C9400000A81BE9009401000DC0A0E100D82DE96A
:10C9500004B04CE21733A0E3023A83E2003093E5DF
:10C96000033003E2020053E328309F0500009305E3
:10C9700000A81B091733A0E3023A83E2003093E5D5
:10C98000033003E2010053E32000A00300A81B09C9
:10C99000CFFFFFEB00A81BE9009401000DC0A0E150
:10C9A00010D82DE904B04CE21733A0E3023A83E239
:10C9B000004093E51C4004E2140054E32441A0111C
:10C9C0000A40A003DFFFFFEB3004A0E110A81BE941
:10C9D0000DC0A0E110D82DE904B04CE21733A0E35C
:10C9E000023A83E2004093E5604004E2A442A0E101
:10C9F000E9FFFFEB3004A0E110A81BE90DC0A0E1A6
:10CA000010D82DE904B04CE21733A0E3023A83E2D8
:10CA1000004093E5064D04E2A443A0E1DEFFFFEBF6
:10CA20003004A0E110A81BE9FF0000E2070050E37A
:10CA30000800008A1733A0E3023A83E2B02093E5AE
:10CA40000720C2E3B02083E5B02093E5022080E117
:10CA5000B02083E50EF0A0E10F0050E30800008A4B
:10CA60001723A0E3022A82E2B03092E53830C3E314
:10CA7000B03082E5081040E2B03092E5813183E1C8
:10CA8000090000EA170050E30900008A1723A0E319
:10CA9000022A82E2B03092E5073DC3E3B03082E57E
:10CAA000101040E2B03092E5013383E1B03082E50E
:10CAB0000EF0A0E11723A0E3022A82E2B03092E553
:10CAC0000E3CC3E3B03082E5181040E2B03092E58E
:10CAD000813483E1F4FFFFEA010050E31723A00350
:10CAE000022A82020C309205083083031723A01318
:10CAF000022A82120C3092150830C3130C3082E5E2
:10CB00000EF0A0E11723A0E3022A82E20C3092E5A6
:10CB1000013083E30C3082E50EF0A0E11723A0E39F
:10CB2000022A82E20C3092E5023083E30C3082E587
:10CB30000EF0A0E1FF0000E2FF1001E2010051E36E
:10CB40001000001A000050E31723A003022A8202FB
:10CB500034309205013B83030800000A010050E3D2
:10CB60001723A013022A821234309215013A83133C
:10CB70001723A003022A820234309205023B83036A
:10CB8000343082E50EF0A0E1000050E31723A0034B
:10CB9000022A820234309205013BC303F7FFFF0AE9
:10CBA000010050E31723A003022A820234309205C9
:10CBB000023BC3031723A013022A821234309215BA
:10CBC000013AC313EDFFFFEA010050E31723A0036E
:10CBD000022A820234309205013083031723A01306
:10CBE000022A8212343092150130C313343082E5A8
:10CBF0000EF0A0E10DC0A0E110D82DE904B04CE288
:10CC00000040A0E11633A0E3063A83E2030050E1BE
:10CC10000B00001A0109A0E30110A0E35BFEFFEB8B
:10CC20000109A0E30010A0E358FEFFEB1723A0E3E7
:10CC3000022A82E20030A0E3843082E5443082E5BB
:10CC4000643082E51633A0E3073A83E2030054E13F
:10CC50000B00001A0209A0E30110A0E34BFEFFEB5A
:10CC60000209A0E30010A0E348FEFFEB1723A0E3B6
:10CC7000022A82E20030A0E3883082E5483082E573
:10CC8000683082E51633A0E3023983E2030054E101
:10CC90000B00001A0108A0E30110A0E33BFEFFEB2C
:10CCA0000108A0E30010A0E338FEFFEB1723A0E388
:10CCB000022A82E20030A0E38C3082E54C3082E52B
:10CCC0006C3082E51633A0E3093A83E2030054E1B5
:10CCD0000B00001A0208A0E30110A0E32BFEFFEBFB
:10CCE0000208A0E30010A0E328FEFFEB1723A0E357
:10CCF000022A82E20030A0E3903082E5503082E5E3
:10CD0000703082E51633A0E30A3A83E2030054E16F
:10CD10000C00001A0107A0E30110A0E31BFEFFEBCB
:10CD20000107A0E30010A0E318FEFFEB1723A0E328
:10CD3000022A82E20030A0E3943082E5543082E59A
:10CD4000743082E5BC3082E51633A0E30B3A83E20F
:10CD5000030054E10B00001A0207A0E30110A0E356
:10CD60000AFEFFEB0207A0E30010A0E307FEFFEBC3
:10CD70001723A0E3022A82E20030A0E3983082E584
:10CD8000583082E5783082E51633A0E3033983E238
:10CD9000030054E10B00001A0106A0E30110A0E318
:10CDA000FAFDFFEB0106A0E30010A0E3F7FDFFEBA7
:10CDB0001723A0E3022A82E20030A0E39C3082E540
:10CDC0005C3082E57C3082E51633A0E30D3A83E2E5
:10CDD000030054E10B00001A0206A0E30110A0E3D7
:10CDE000EAFDFFEB0206A0E30010A0E3E7FDFFEB86
:10CDF0001723A0E3022A82E20030A0E3A03082E5FC
:10CE0000603082E5803082E51633A0E30E3A83E29B
:10CE1000030054E10A00001A0105A0E30110A0E399
:10CE2000DAFDFFEB0105A0E30010A0E3D7FDFFEB67
:10CE30001733A0E3023A83E20020A0E3A42083E5B5
:10CE4000AC2083E51633A0E30F3A83E2030054E1FC
:10CE500010A81B190205A0E30110A0E3CBFDFFEB16
:10CE60000205A0E30010A0E3C8FDFFEB1733A0E329
:10CE7000023A83E20020A0E3A82083E5AC2083E50A
:10CE800010A81BE90DC0A0E1F0DD2DE904B04CE2D3
:10CE90000050A0E10140A0E18E0000EBFFA000E205
:10CEA0000130D4E5010053E30030D405002495059A
:10CEB000023083010020D415003495150230C311CF
:10CEC000003485E50010A0E30100A0E31783A0E390
:10CED000028A88E20AE1A0E117738EE2027A87E211
:10CEE00017638EE2026A86E20030D4E5103103E077
:10CEF0005331A0E1010053E32E00001A07005AE36A
:10CF00002100008A08C08EE08150A0E144309CE5F9
:10CF10000320A0E31235C3E144308CE5B420D4E112
:10CF2000010052E344309C051235830144308C05E6
:10CF3000B4C0D4E102005CE38120A0014430970535
:10CF40001C32830144308705B4C0D4E103005CE3A4
:10CF50008120A001443096051C32830144308605AF
:10CF600017238EE2022A82E210C1A0E1643092E52A
:10CF70000C30C3E1643082E50330D4E5010053E3B3
:10CF80006430920503308C016430820517238EE2F1
:10CF9000022A82E210C1A0E1843092E50C30C3E1A4
:10CFA000843082E50230D4E5010053E384309205F9
:10CFB00003308C0184308205013081E2FF1003E2EE
:10CFC000070051E3F0AD1B89C6FFFFEA0030E0E344
:10CFD0000030C0E50030A0E30130C0E50230C0E51C
:10CFE0000330C0E5B430C0E10EF0A0E1FF1001E273
:10CFF0000131A0E10330D0E7030011E10000A003FC
:10D000000100A0130EF0A0E1FF3FA0E30300D0E772
:10D01000FF0000E20EF0A0E1FF1001E2010052E388
:10D020000131A0010310C0070121A0110030A0139D
:10D030000230C0170EF0A0E1FF1001E2FF3FA0E3B5
:10D040000310C0E70EF0A0E1010050E31733A00386
:10D05000023A8302AC0083051733A013023A83120D
:10D060000020A013AC2083150EF0A0E10DC0A0E1BC
:10D0700030D82DE904B04CE2FF5000E2010051E34A
:10D080000E00001A1743A0E3024A84E20500A0E163
:10D090003E0000EB0008A0E1543094E5203803E0A6
:10D0A000543084E5743094E50530C3E1743084E590
:10D0B000BC3094E5033085E1BC3084E530A81BE941
:10D0C0001723A0E3022A82E2BC3092E50530C3E1D7
:10D0D000BC3082E530A81BE91633A0E3073A83E2AF
:10D0E000030050E10100A0030EF0A0011633A0E3FD
:10D0F000023983E2030050E10200A0030EF0A00118
:10D100001633A0E3093A83E2030050E10300A003D1
:10D110000EF0A0011633A0E30A3A83E2030050E1C7
:10D120000400A0030EF0A0011633A0E30B3A83E243
:10D13000030050E10500A0030EF0A0011633A0E3A8
:10D14000033983E2030050E10600A0030EF0A001C2
:10D150001633A0E30D3A83E2030050E10700A00379
:10D160000EF0A0011633A0E30E3A83E2030050E173
:10D170000800A0030EF0A0011633A0E30F3A83E2EB
:10D18000030050E10900A0030000A0130EF0A0E18D
:10D19000FF0000E2010050E3FF0CA003FC0080024E
:10D1A0000EF0A001020050E3FF0CA003F300800288
:10D1B0000EF0A001040050E3FF0CA003CF0080029A
:10D1C0000EF0A001080050E3FF0CA0033F00800216
:10D1D0000EF0A001100050E33F0BA0030200000A74
:10D1E000200050E30200001AF30CA0E3FF0080E2ED
:10D1F0000EF0A0E1400050E3CF0CA003FAFFFF0ABD
:10D20000FF3DA0E33F3083E2800050E30000A01325
:10D210000300A0010EF0A0E10DC0A0E100D82DE9AF
:10D2200004B04CE21733A0E3013983E2030050E17C
:10D230000400001A0800A0E30110A0E3D3FCFFEBF8
:10D240000800A0E3070000EA1733A0E3053A83E2F1
:10D25000030050E10600001A1000A0E30110A0E353
:10D26000CAFCFFEB1000A0E30010A0E3C7FCFFEB3B
:10D2700000A81BE91733A0E3063A83E2030050E15C
:10D2800000A81B192000A0E30110A0E3BFFCFFEBE6
:10D290002000A0E3F3FFFFEA0DC0A0E1F0D92DE9E3
:10D2A00004B04CE20070A0E10180A0E1BC32D0E10A
:10D2B0006030C3E3BC32C0E1BC32D0E1B020D1E188
:10D2C000023083E1BC32C0E1B230D1E1080053E367
:10D2D000BC32D00108308303BC32D0110830C313F4
:10D2E000BC32C7E1BC32D7E18630C3E3BC32C7E110
:10D2F000BC32D7E1B420D8E1023083E1BC32C7E1CF
:10D3000090FDFFEB803260E0033180E08331A0E1EB
:10D310000300A0E10010A0E31733A0E3023A83E288
:10D32000003093E5022C13E20B00001AC14FA0E17C
:10D33000A43FA0E10240A0E10120A0E10010A0E193
:10D34000031091E00420A2E0A100A0E1823F80E16F
:10D35000C240A0E10410A0E10300A0E10121A0E18E
:10D36000204F82E10031A0E10460A0E10350A0E180
:10D37000005095E00160A6E00621A0E1254F82E182
:10D380000531A0E1035095E00460A6E00631A0E17C
:10D39000251F83E10501A0E1082098E50222A0E114
:10D3A0000030A0E3161C00EBBC209FE5921083E048
:10D3B000A332A0E1B432C7E1B432D7E1033183E054
:10D3C000033183E0030140E00003A0E1320080E28A
:10D3D000921083E0A332A0E1B832C7E1B033D7E1C5
:10D3E0000339A0E12339A0E1B033C7E1B033D7E17D
:10D3F000BC20D8E1023083E1B033C7E1B033D7E1DC
:10D40000033CC3E3B033C7E1B033D7E1BE20D8E17A
:10D41000023083E1B033C7E1B031D8E1100053E30B
:10D42000BC32D7111030C313BC32C711F0A91B197D
:10D43000BC32D7E1103083E3BC32C7E1B433D7E16B
:10D440003F30C3E3B433C7E1B821D8E1B433D7E107
:10D45000823183E1B433C7E1B433D7E1B421D8E1F9
:10D46000023083E1B433C7E1F0A91BE91F85EB511A
:10D470006030A0E3B030C0E10830E0E3B230C0E19A
:10D480000220A0E3B420C0E1963DA0E3083080E58F
:10D490000030A0E3BC30C0E1033CA0E3BE30C0E1FB
:10D4A0001030A0E3B031C0E1142080E5182080E501
:10D4B0000EF0A0E1010051E3B033D001013083034D
:10D4C000B033D0110130C313B033C0E10EF0A0E18E
:10D4D0000118A0E14118A0E1010052E3B833D001E6
:10D4E00001308301B833D0110130C311B833C0E12A
:10D4F0000EF0A0E10118A0E1050871E3B834D001F5
:10D500000430C303B834D01104308313B834C0E1FD
:10D510000EF0A0E1FF1001E2020051E30500001A45
:10D52000010052E3B834D00102308303B834D01183
:10D530000230C313B834C0E1010051E30EF0A01172
:10D54000010052E3B834D00101308303B834D01164
:10D550000130C313B834C0E10EF0A0E1010051E383
:10D56000B033D00180308303B033D0118030C31387
:10D57000B033C0E10EF0A0E10030A0E30118A0E15B
:10D58000A12AA0E12118A0E11F1001E2010052E34D
:10D59000B430D0010400000A020052E3B831D001D7
:10D5A0000100000A030052E3BC33D0010100A0E3F4
:10D5B000103113E00000A0030EF0A0E1AA30A0E3B8
:10D5C000B430C0E10EF0A0E10118A0E1B034D0E128
:10D5D000213813E00000A0030100A0130EF0A0E129
:10D5E0000118A0E14118A0E1B414C0E10EF0A0E1DF
:10D5F000FF0000E2020050E31723A003052A820285
:10D600000700000A030000CA010050E31723A0032B
:10D6100001298202020000EA030050E31723A0035D
:10D62000062A8202010051E3B033D20104308303A1
:10D63000B033D2110430C313B033C2E10EF0A0E115
:10D640000DC0A0E130D82DE904B04CE20150A0E1BA
:10D65000FF0000E2020050E31743A003054A8402E2
:10D660000700000A030000CA010050E31743A003AB
:10D6700001498402020000EA030050E31743A003BB
:10D68000064A8402DCFCFFEB803260E0033180E07C
:10D690008302A0E1830180E08000A0E10510A0E109
:10D6A000D41A00EB050080E20C309FE5902383E064
:10D6B000A331A0E1B032C4E130A81BE9CDCCCCCC81
:10D6C000FF0000E2020050E31723A003052A8202B4
:10D6D0000700000A030000CA010050E31723A0035B
:10D6E00001298202020000EA030050E31723A0038D
:10D6F000062A8202010051E3B033D20102308303D3
:10D70000B033D2110230C313B033C2E10EF0A0E146
:10D71000FF1001E2B010C0E10EF0A0E1B000D0E1D6
:10D72000FF0000E20EF0A0E1BC32D0E1013083E363
:10D73000BC32C0E10EF0A0E1000050E31723A003CB
:10D7400001298202B033D201023B83031723A013C5
:10D7500001298212B033D211023BC313B033C2E1AC
:10D760000EF0A0E1000050E31723A003012982027C
:10D77000B033D201013B83031723A0130129821286
:10D78000B033D211013BC313B033C2E10EF0A0E1BC
:10D790000DC0A0E100D82DE904B04CE22000A0E3C8
:10D7A0000110A0E384FBFFEB2000A0E30010A0E346
:10D7B00081FBFFEB00A81BE90008A0E10110A0E33A
:10D7C0004038A0E12008A0E10F0050E30600008AE5
:10D7D0000231A0E3C339A0E1003093E5110093E1E9
:10D7E0000100A0110000A0030EF0A0E10338A0E1A9
:10D7F0002338A0E1103043E23F23A0E3002092E56C
:10D80000112392E10000A0030100A0130EF0A0E19B
:10D810000008A0E10110A0E34038A0E12008A0E149
:10D820000F0050E30600008A0231A0E3C339A0E1F3
:10D83000083093E5110093E10100A0110000A0035E
:10D840000EF0A0E10338A0E12338A0E1103043E25C
:10D850003F23A0E3082092E5112392E10000A003FA
:10D860000100A0130EF0A0E10008A0E10110A0E368
:10D870004038A0E12008A0E10F0050E30600008A34
:10D880000231A0E3C339A0E1043093E5110093E134
:10D890000100A0110000A0030EF0A0E10338A0E1F8
:10D8A0002338A0E1103043E23F23A0E3042092E5B7
:10D8B000112392E10000A0030100A0130EF0A0E1EB
:10D8C0000008A0E101C0A0E34028A0E12008A0E1F9
:10D8D0000F0050E30B00008A000051E30211A01377
:10D8E000C119A0110228A0112228A0111300001AAA
:10D8F0000221A0E3C229A0E10C3092E51C30C3E173
:10D900000C3082E50EF0A0E1000051E33F13A013BC
:10D910000228A0112228A011102042120700001A8C
:10D920003F13A0E30228A0E12228A0E1102042E258
:10D930000C3091E51C32C3E10C3081E50EF0A0E122
:10D940000C3091E51C3283E1FAFFFFEA0008A0E108
:10D950004008A0E101C0A0E30C0051E11100001A51
:10D960000038A0E12318A0E10F0051E30500008A70
:10D970000221A0E3C229A0E1103092E51C3183E12D
:10D98000103082E50EF0A0E13F13A0E30028A0E1F3
:10D990002228A0E1102042E2103091E51C3283E100
:10D9A000103081E50EF0A0E10038A0E12318A0E1DD
:10D9B0000F0051E30500008A0221A0E3C229A0E183
:10D9C000143092E51C3183E1143082E50EF0A0E1C1
:10D9D0003F13A0E30028A0E12228A0E1102042E2AA
:10D9E000143091E51C3283E1143081E50EF0A0E1A2
:10D9F0000008A0E14028A0E101C0A0E30C0051E133
:10DA00001100001A0238A0E12318A0E10F0051E331
:10DA10000500008A0221A0E3C229A0E1183092E5A6
:10DA20001C3183E1183082E50EF0A0E13F13A0E342
:10DA30000228A0E12228A0E1102042E2183091E55E
:10DA40001C3283E1183081E50EF0A0E10238A0E13C
:10DA50002308A0E10F0050E30231A093C339A09145
:10DA60001C20A0911C2083950238A0812338A0811E
:10DA7000103043821C33A0813F23A0831C30828559
:10DA80000EF0A0E1010050E30800001A0221A0E31B
:10DA9000C229A0E1203092E5013083E3203082E505
:10DAA0003F23A0E3203092E5013083E3070000EA42
:10DAB0000221A0E3C229A0E1203092E50130C3E3B6
:10DAC000203082E53F23A0E3203092E50130C3E31C
:10DAD000203082E50EF0A0E1300090E50EF0A0E1EC
:10DAE0000118A0E14118A0E10008A0E10F0850E3EF
:10DAF0000138A0912337A091002F03950138A08110
:10DB00002337A0813F338382002183850EF0A0E17B
:10DB10000008A0E14038A0E12008A0E10F0050E398
:10DB20000031A091000F13950338A0812337A08105
:10DB30003F338382C00093850EF0A0E10118A0E17D
:10DB40004118A0E10008A0E10F0850E30500008A99
:10DB50000128A0E12227A0E1003E12E5203083E366
:10DB6000003E02E50EF0A0E10128A0E12227A0E19D
:10DB70003F2382E2003292E5203083E3003282E5E7
:10DB80000EF0A0E10008A0E10118A0E14118A0E119
:10DB900040C8A0E12008A0E10F0050E30800008A7F
:10DBA0000138A0E12337A0E1002E13E51F20C2E3D6
:10DBB000002E03E5002E13E5022080E1002E03E590
:10DBC0000EF0A0E10128A0E12227A0E13F2382E29C
:10DBD000003292E51F30C3E3003282E50C38A0E149
:10DBE0002338A0E1103043E2001292E5013083E1D6
:10DBF000003282E50EF0A0E10DC0A0E170D82DE961
:10DC000004B04CE20160A0E10008A0E1FF5002E294
:10DC10004048A0E12008A0E11F0050E300F19F97D9
:10DC2000BF0000EAA4DC0000B8DC0000CCDC00008F
:10DC3000E0DC0000F4DC000008DD00001CDD00007A
:10DC400030DD000044DD000058DD00006CDD000028
:10DC500080DD000094DD0000A8DD0000BCDD0000D8
:10DC6000D0DD0000E4DD0000F8DD00000CDE000087
:10DC700020DE000034DE000048DE00005CDE000034
:10DC800070DE000084DE000098DE0000ACDE0000E4
:10DC9000C0DE0000D4DE0000E8DE0000FCDE000094
:10DCA00010DF00000408A0E12008A0E10510A0E1B9
:10DCB0009C229FE5990000EA0408A0E12008A0E169
:10DCC0000510A0E18C229FE5940000EA0408A0E181
:10DCD0002008A0E10510A0E17C229FE58F0000EA6A
:10DCE0000408A0E12008A0E10510A0E16C229FE556
:10DCF0008A0000EA0408A0E12008A0E10510A0E1E4
:10DD00005C229FE5850000EA0408A0E12008A0E16C
:10DD10000510A0E14C229FE5800000EA0408A0E184
:10DD20002008A0E10510A0E13C229FE57B0000EA6D
:10DD30000408A0E12008A0E10510A0E12C229FE545
:10DD4000760000EA0408A0E12008A0E10510A0E1A7
:10DD50001C229FE5710000EA0408A0E12008A0E170
:10DD60000510A0E10C229FE56C0000EA0408A0E188
:10DD70002008A0E10510A0E1FC219FE5670000EA72
:10DD80000408A0E12008A0E10510A0E1EC219FE536
:10DD9000620000EA0408A0E12008A0E10510A0E16B
:10DDA000DC219FE55D0000EA0408A0E12008A0E175
:10DDB0000510A0E1CC219FE5580000EA0408A0E18D
:10DDC0002008A0E10510A0E1BC219FE5530000EA76
:10DDD0000408A0E12008A0E10510A0E1AC219FE526
:10DDE0004E0000EA0408A0E12008A0E10510A0E12F
:10DDF0009C219FE5490000EA0408A0E12008A0E179
:10DE00000510A0E18C219FE5440000EA0408A0E190
:10DE10002008A0E10510A0E17C219FE53F0000EA79
:10DE20000408A0E12008A0E10510A0E16C219FE515
:10DE30003A0000EA0408A0E12008A0E10510A0E1F2
:10DE40005C219FE5350000EA0408A0E12008A0E17C
:10DE50000510A0E14C219FE5300000EA0408A0E194
:10DE60002008A0E10510A0E13C219FE52B0000EA7D
:10DE70000408A0E12008A0E10510A0E12C219FE505
:10DE8000260000EA0408A0E12008A0E10510A0E1B6
:10DE90001C219FE5210000EA0408A0E12008A0E180
:10DEA0000510A0E10C219FE51C0000EA0408A0E198
:10DEB0002008A0E10510A0E1FC209FE5170000EA82
:10DEC0000408A0E12008A0E10510A0E1EC209FE5F6
:10DED000120000EA0408A0E12008A0E10510A0E17A
:10DEE000DC209FE50D0000EA0408A0E12008A0E185
:10DEF0000510A0E1CC209FE5080000EA0408A0E19D
:10DF00002008A0E10510A0E1BC209FE5030000EA85
:10DF10000408A0E12008A0E10510A0E1AC209FE5E5
:10DF2000EEFEFFEB0448A0E12448A0E10400A0E1DC
:10DF30000610A0E161FEFFEB0400A0E10510A0E1E6
:10DF4000FDFEFFEB0400A0E10510A0E10CFFFFEBDC
:10DF500070A81BE9400B0000540B0000680B000088
:10DF60007C0B0000900B000060200000A40B000060
:10DF7000B80B0000CC0B0000F00B0000140C0000EC
:10DF8000280C00003C0C0000500C0000640C000049
:10DF9000780C000080890000688C0000ACA00000B4
:10DFA0008C0C00004C3800002C220000900C00006B
:10DFB000940C0000980C00009C0C0000A00C0000C9
:10DFC000A40C0000000D0000040D0000080D00006E
:10DFD0000C0D00000DC0A0E110D82DE904B04CE2FA
:10DFE0000040A0E11623A0E3022A82E21633A0E358
:10DFF000033A83E2030050E1020050110100A00344
:10E000000200A0130010A0E360F9FFEB0239A0E3C7
:10E01000B830C4E1BC30C4E10020A0E3B421C4E1C5
:10E020000130A0E3B831C4E1123CA0E3343083E214
:10E03000B031C4E1BC21C4E110A81BE90030A0E369
:10E04000B030C0E1B230C0E1B430C0E1B630C0E1C0
:10E05000B830C0E1BA30C0E1BC30C0E1BE30C0E190
:10E060001030C0E5B231C0E1B431C0E1B631C0E139
:10E07000B831C0E1BA31C0E1BC31C0E10EF0A0E17D
:10E08000B620D1E1FF3CA0E3FE3083E2030052E181
:10E09000B431D0010130C3030800000AB431D0E12B
:10E0A000013083E3B431C0E1B830D1E1020053E381
:10E0B000B431D00102308303B431D0110230C31324
:10E0C000B431C0E1B821D0E1FF2C02E21030D1E53B
:10E0D000023083E1B831C0E1B030D1E1C00053E398
:10E0E0004600000A0A0000CA200053E37C00000A30
:10E0F000020000CA100053E30EF0A0115F0000EA16
:10E10000400053E31D00000A800053E30EF0A0110D
:10E110002A0000EA050C53E38900000A020000CA45
:10E12000010B53E30EF0A011920000EA060C53E33A
:10E130008900000A010953E30EF0A011B431D0E1C7
:10E14000013983E3B431C0E1BC30D1E1040053E3D1
:10E15000B431D00104308303B431D0110430C3137F
:10E16000B431C0E1BC30D1E1040053E37700000AD0
:10E17000B431D0E1083083E3B431C0E10EF0A0E166
:10E18000B231D1E1020C53E3B431D001013C83033D
:10E19000B431D011013CC313B431C0E1B831D1E185
:10E1A000B830C0E1B230D1E1020053E3B431D00164
:10E1B0004030C303B431D01140308313EDFFFFEA88
:10E1C000B431D1E1020C53E3B431D001023C8303FA
:10E1D000B431D011023CC313B431C0E1BA31D1E142
:10E1E000BC30C0E1B430D1E1020053E3B431D0011E
:10E1F0008030C303B431D01180308313DDFFFFEAD8
:10E20000BA31D1E1BC30C0E1B831D1E1B830C0E1C0
:10E21000B430D1E1020053E3B431D0018030C30304
:10E22000B431D01180308313B431C0E1B230D1E1C8
:10E23000020053E3B431D0014030C303B431D011F4
:10E2400040308313B431C0E1B231D1E1020C53E369
:10E25000B431D001013C8303B431D011013CC3136C
:10E26000B431C0E1B431D1E1020C53E3B431D00197
:10E27000023C8303B431D011023CC313BDFFFFEA5B
:10E28000B231D1E1020C53E3B431D001023C83033B
:10E29000B431D011023CC313B431C0E1B631D1E185
:10E2A000020C53E3B431D001013C8303B431D011EB
:10E2B000013CC313B431C0E1B431D0E1403083E359
:10E2C000B431C0E1B431D0E1103083E3B431C0E106
:10E2D000B831D1E1B830C0E1BC31D1E1BC30C0E1EE
:10E2E0000EF0A0E1B231D1E1020C53E3B431D00120
:10E2F000023C8303B431C001B631D1E1020C53E3D7
:10E30000B431D001013C8303B431C001BA30D1E152
:10E31000040053E3B431D00104308303B431C001AD
:10E32000B431D0E1403083E3B431C0E1B431D0E165
:10E33000203083E3B431C0E1B831D1E1B830C0E17D
:10E340000EF0A0E1BE30D1E1080053E387FFFF0AE1
:10E35000B431D0E10830C3E386FFFFEABE30D1E13B
:10E36000080053E3B431D00108308303B431D01135
:10E370000830C313B431C0E1BC30D1E1040053E331
:10E38000B431D00104308303B431D0110430C3134D
:10E3900078FFFFEA010051E30600000AB431D031F2
:10E3A0008338E031A338E0310500003A020051E340
:10E3B0000EF0A011040000EAB431D0E18338A0E1EE
:10E3C000A338A0E1B431C0E10EF0A0E1123CA0E31B
:10E3D000343083E2B031C0E10EF0A0E1FF1001E281
:10E3E000B831D0E1FF3C03E2B831C0E1B831D0E14F
:10E3F000013083E1B831C0E10EF0A0E1B801D0E115
:10E40000FF0000E20EF0A0E1B001D0E10EF0A0E1CB
:10E41000B000D0E10EF0A0E1B400D0E10EF0A0E138
:10E420000228A0E14228A0E10118A0E1010851E37F
:10E43000B820C001BC20C0110EF0A0E10118A0E17D
:10E44000BC01D0E1210810E00100A0130EF0A0E112
:10E450000118A0E1BC31D0E14138C3E1BC31C0E1D9
:10E460000EF0A0E1B400D0E10EF0A0E1B000D0E1E8
:10E470000EF0A0E10118A0E14118A0E1010052E373
:10E48000B831D001FF30030201308301B831D0111F
:10E490000130C311B831C0E10EF0A0E10118A0E1D4
:10E4A000B431D0E1033AC3E3B431C0E1B431D0E1D7
:10E4B000413883E1B431C0E10EF0A0E1010051E345
:10E4C000B831D001013B8303B831D011013BC313F4
:10E4D000B831C0E10EF0A0E10DC0A0E100D82DE9F7
:10E4E00004B04CE21733A0E3073A83E2030050E1A3
:10E4F0000400001A010CA0E30110A0E323F8FFEBD5
:10E50000010CA0E3070000EA1733A0E3023983E21D
:10E51000030050E100A81B19020CA0E30110A0E3C6
:10E520001AF8FFEB020CA0E30010A0E317F8FFEBD2
:10E5300000A81BE9B020D1E1FF3CA0E3CF3083E28B
:10E54000030052E11000001AB030D0E13030C3E3D4
:10E55000B030C0E1B430D1E1400053E3B030D0017D
:10E5600040308303B030D0114030C313B030C0E12D
:10E57000B630D1E1800053E3B030D0018030830366
:10E58000B030D0118030C313050000EAB030D0E1C4
:10E590003030C3E3B030C0E1B030D0E1B020D1E1E1
:10E5A000023083E1B030C0E1B230D1E1040053E386
:10E5B0000A00001AB430D0E1043083E3B430C0E183
:10E5C000BA30D1E1080053E3B430D00108308303FE
:10E5D000B430D0110830C313B430C0E1100000EAE9
:10E5E000B430D0E10430C3E3B430C0E1B030D0E1A6
:10E5F000FF3003E2B030C0E10C20D1E5B030D0E113
:10E60000023483E1B030C0E1B031D0E1FF3C03E23D
:10E61000B031C0E10D30D1E5B021D0E1023083E16D
:10E62000B031C0E1B030D0E10F30C3E3B030C0E171
:10E63000B030D0E1B820D1E1023083E1B030C0E1A8
:10E640000EF0A0E13030E0E3B030C0E10430E0E3B0
:10E65000B230C0E14030E0E3B430C0E18030E0E30C
:10E66000B630C0E10730A0E3B830C0E10830E0E3E5
:10E67000BA30C0E10030A0E30C30C0E50D30C0E599
:10E680000EF0A0E1010051E3B430D0010230830369
:10E69000B430D0110230C313B430C0E10EF0A0E1A9
:10E6A0000118A0E14118A0E1010052E3B431D0010A
:10E6B00001308301B431D0110130C311B431C0E154
:10E6C0000EF0A0E10118A0E14118A0E1010052E321
:10E6D0000700001A0138A0E1020853E3B432D00168
:10E6E00002308303B432D01101308313B432C0E15D
:10E6F0000EF0A0E10138A0E1020853E3B432D001EA
:10E700000230C303B432D0110130C313F6FFFFEA65
:10E710000118A0E14118A0E1B810C0E10EF0A0E19D
:10E72000B800D0E10EF0A0E1010051E3B430D00117
:10E7300001308303B430D0110130C313B430C0E1D1
:10E740000EF0A0E10030A0E30118A0E1A12AA0E1B1
:10E750002118A0E11F1001E2010052E3BC30D001FA
:10E760000100000A020052E3B831D0010100A0E329
:10E77000103113E00000A0030EF0A0E11F1001E231
:10E780000130A0E31331A0E1B032C0E10EF0A0E10E
:10E790000118A0E1BC31D0E1213813E00000A00352
:10E7A0000100A0130EF0A0E10118A0E14118A0E1C2
:10E7B000B012C0E10EF0A0E10DC0A0E110D82DE92B
:10E7C00004B04CE20040A0E11733A0E3033983E238
:10E7D000030050E10500001A4000A0E30110A0E38F
:10E7E0006AF7FFEB4000A0E30010A0E367F7FFEB40
:10E7F0001733A0E30D3A83E2030054E110A81B197C
:10E800008000A0E30110A0E360F7FFEB8000A0E32D
:10E810000010A0E35DF7FFEB10A81BE90DC0A0E11D
:10E82000F0D82DE904B04CE20040A0E10160A0E185
:10E830000F70A0E370F8FFEB803260E0033180E0FE
:10E840008351A0E10400A0E10010A0E3760000EBFA
:10E850001430D4E51F3003E21430C4E5FE34E0E3A5
:10E86000693843E2C53E43E2030055E11430D495D4
:10E87000403083932500009A7C319FE5030055E1E9
:10E880001430D495603083932000009ACB37A0E3F6
:10E89000073983E24F3083E2030055E11430D49509
:10E8A000833CE091A33CE0911800009A3F33E0E301
:10E8B000433943E2AE3D43E2030055E11430D495C1
:10E8C0000330E0915F3003920330E0910F00009A33
:10E8D000FB34E0E3ED3943E2033B43E2030055E15F
:10E8E0001430D495033DE091233DE0910700009A58
:10E8F000FA34E0E3A13A43E20F3C43E2030055E17E
:10E900000300008A1430D4E5833DE0E1A33DE0E15B
:10E910001430C4E50400A0E10110A0E3420000EBC4
:10E920000630D6E5100053E30030D40510308303E1
:10E930000030D4151030C3130030C4E50730D6E5DD
:10E94000040053E30030D405043083030030D415B1
:10E950000430C3130030C4E50430D6E51030C4E5FC
:10E960001430D4E50630C3E31430C4E5B420D6E156
:10E97000032C02E21430D4E5C23383E11430C4E541
:10E98000001096E5613BA0E32A3E83E2030051E1DB
:10E990000600008A0500A0E1161600EB070040E221
:10E9A0008007A0E14078A0E17F3007E20D0000EA97
:10E9B000001096E5613AA0E32A3D83E2030051E1AD
:10E9C0000900008A0500A0E10A1600EB090040E2F8
:10E9D00028309FE5902383E08337A0E14378A0E1CE
:10E9E000873CE0E1A33CE0E10C30C4E50738A0E15E
:10E9F000A33BA0E11C30C4E5F0A81BE9FF5962026B
:10EA0000ABAAAAAA4E3DA0E3083083E2003080E51D
:10EA10000030A0E3B430C0E11030E0E30630C0E5E0
:10EA20000430E0E30730C0E50EF0A0E1010051E35F
:10EA30000030D005203083030030C0050030D00501
:10EA4000203083030030D0152030C3130030C0E5E0
:10EA50000EF0A0E1010051E30030D005083083033F
:10EA60000030D0150830C3130030C0E50EF0A0E12F
:10EA7000010051E30030D005023083030030D0158F
:10EA80000230C3130030C0E50EF0A0E1010051E3F5
:10EA90000030D005043083030030D0150430C31398
:10EAA0000030C0E50EF0A0E1010051E30030D005D8
:10EAB000013083030030D0150130C3130030C0E5AE
:10EAC0000EF0A0E1FF1001E21733A0E3033983E267
:10EAD000030050E10400000A1733A0E30D3A83E27B
:10EAE000030050E10000A0130EF0A0110000D1E7D8
:10EAF0000EF0A0E10118A0E108C0D0E50030D0E59B
:10EB00000420D0E50229A0E10C2D82E1043003E2CB
:10EB10000336A0E1223983E1213813E00000A0038D
:10EB20000100A0130EF0A0E10DC0A0E10E002DE940
:10EB300010D82DE910B04CE204D04DE20040A0E125
:10EB4000B430DBE1B2314BE10A205BE5B2315BE18D
:10EB5000800053E3400053130800000A020C53E303
:10EB60000600000A020B53E3010B53130300000AD3
:10EB7000010A53E30100000A020A53E30800001AE5
:10EB80000830D4E5B2315BE1400053E31000000AE5
:10EB9000020A53E30030D405203083030030C4055B
:10EBA0001B0000EAB2315BE1040053E301005313A0
:10EBB0000300000A080053E30100000A200053E3A9
:10EBC0000A00001A0430D4E5B2315BE1010053E3DE
:10EBD0000100001A1820C4E50D0000EAB2315BE123
:10EBE000200053E3080053131830D405080000EA4E
:10EBF000B2315BE1010C53E3020053130400001A2D
:10EC00000010A0E388FFFFEB0400A0E10110A0E3E7
:10EC100085FFFFEB10A81BE9FF1001E2FF2002E2D5
:10EC2000010052E301108103FE1001121810C0E52B
:10EC30000EF0A0E1FF1001E21810C0E50EF0A0E117
:10EC40001800D0E5FF0000E20EF0A0E10030A0E1E6
:10EC50000400D0E50830D3E5030480E10009A0E119
:10EC60002009A0E10EF0A0E10DC0A0E110D82DE92F
:10EC700004B04CE20148A0E14448A0E1F2FFFFEB00
:10EC80000008A0E1040850E10000A0130100A00367
:10EC900010A81BE9FF0000E2FF1001E215C3A0E38A
:10ECA00000008CE504108CE52221A0E10C208CE50D
:10ECB0002331A0E110308CE518309CE5183083E357
:10ECC00018308CE50EF0A0E110402DE90008A0E11D
:10ECD0004008A0E10228A0E142C8A0E10338A0E179
:10ECE00043E8A0E1F840DDE1010C51E31523A00366
:10ECF00018309205013C83031523A0131830921598
:10ED0000013CC313183082E51523A0E3102082E2F2
:10ED1000003092E50331A0E16010A0E3B010C3E140
:10ED2000002092E50038A0E12338A0E1023183E120
:10ED30000C28A0E1223883E10E28A0E1223883E1EB
:10ED40000428A0E1223883E10320A0E3B020C3E13E
:10ED50001080BDE804D04DE200008DE500309DE557
:10ED60002020A0E3B020C3E100309DE5D020A0E347
:10ED7000B020C3E104D08DE20EF0A0E104D04DE25A
:10ED800000008DE500309DE58020A0E3B020C3E1C8
:10ED900000309DE5D020A0E3B020C3E104D08DE297
:10EDA0000EF0A0E10118A0E14118A0E10330C0E39A
:10EDB0004020A0E3B020C3E1B010C0E10EF0A0E11C
:10EDC000FF0000E20118A0E14118A0E11523A0E333
:10EDD000102082E2003092E50331A0E1C0C0A0E340
:10EDE000B0C0C3E1003092E50331A0E1B01083E18F
:10EDF0000EF0A0E1000090E50EF0A0E1FF0000E2BF
:10EE00001523A0E3102082E2003092E50331A0E157
:10EE10009810A0E3B010C3E1003092E50331A0E107
:10EE2000000093E7003092E50331A0E1FF20A0E36A
:10EE3000B020C3E10EF0A0E104D04DE200108DE55A
:10EE4000FF0000E200309DE57010A0E3B010C3E1C8
:10EE500000309DE5B030D3E1800013E3FBFFFF0AF3
:10EE600000309DE5B020D3E100309DE5FF10A0E328
:10EE7000B010C3E1000012E10000A0030100A013E4
:10EE800004D08DE20EF0A0E11523A0E3102082E271
:10EE9000003092E50331A0E19010A0E3B010C3E18F
:10EEA000003092E50331A0E1B401D3E1003092E5F6
:10EEB0000331A0E1FF20A0E3B020C3E1A005A0E161
:10EEC000010080E2030000E20EF0A0E11533A0E3B0
:10EED000180093E5010C00E2000050E20100A013CD
:10EEE0000EF0A0E104D04DE200008DE500309DE57C
:10EEF000B020A0E3B020C3E104D08DE20EF0A0E189
:10EF000004D04DE200008DE500309DE5D020A0E367
:10EF1000B020C3E104D08DE20EF0A0E104D04DE2B8
:10EF200000008DE500309DE55020A0E3B020C3E156
:10EF300004D08DE20EF0A0E104D04DE200008DE59A
:10EF4000010051E30500001A00309DE56020A0E3B8
:10EF5000B020C3E100309DE5B010C3E1050000EA38
:10EF600000309DE56020A0E3B020C3E100309DE5C6
:10EF7000D020A0E3B020C3E100309DE5FF20A0E356
:10EF8000B020C3E104D08DE20EF0A0E11523A0E390
:10EF9000102082E2003092E50331A0E19010A0E35E
:10EFA000B010C3E1003092E50331A0E1B011D3E12C
:10EFB000003092E50331A0E1FF20A0E3B020C3E1DF
:10EFC000010010E10000A0030100A0130EF0A0E179
:10EFD00004D04DE200008DE50010A0E300309DE577
:10EFE0007020A0E3B020C3E100309DE5B030D3E154
:10EFF000800013E30800001AFF24E0E3012042E24E
:10F00000011081E200309DE5B030D3E1800013E3D0
:10F010000100001A020051E1F8FFFF9A00309DE55F
:10F02000FF20A0E3B020C3E1FF04E0E3000051E0D3
:10F030000100A01304D08DE20EF0A0E11613A0E3AE
:10F04000011A81E2043091E5042090E5023083E169
:10F05000043081E50030D0E5010053E3083091052C
:10F060000420900502308301083081051633A01377
:10F07000013A831204109015082093150120C21143
:10F08000082083150EF0A0E10DC0A0E100D82DE905
:10F0900004B04CE2020AA0E30110A0E33BF5FFEB51
:10F0A000020AA0E30010A0E338F5FFEB00A81BE97B
:10F0B0000030A0E3043080E50030C0E50EF0A0E1B0
:10F0C000010050E31623A003012A820200309205BA
:10F0D000023083031623A013012A821200309215F6
:10F0E00002300312003082E50EF0A0E11633A0E3F7
:10F0F000013A83E2102093E5020080E1100083E5ED
:10F100000EF0A0E11633A0E3013A83E20C3093E560
:10F11000030010E10000A0030100A0130EF0A0E125
:10F120001633A0E3013A83E20C0083E50EF0A0E180
:10F130001623A0E3012A82E20C3092E5030010E1DD
:10F140000300000A043092E5030010E10100A0135F
:10F150000EF0A0110000A0E30EF0A0E11633A0E332
:10F16000013A83E20C0083E50EF0A0E10632A0E351
:10F17000213D83E20008A0E12008A0E1000083E532
:10F180000EF0A0E10632A0E3213D83E2000093E50A
:10F190000008A0E12008A0E10EF0A0E1213DA0E3DD
:10F1A000463283E20008A0E12008A0E1000083E5E8
:10F1B0000EF0A0E1213DA0E3463283E2000093E59A
:10F1C0000008A0E12008A0E10EF0A0E1213DA0E3AD
:10F1D000863283E2000093E50008A0E12008A0E168
:10F1E0000EF0A0E1213DA0E3C63283E20008A0E1D9
:10F1F0002008A0E1000083E50EF0A0E1213DA0E39E
:10F20000C63283E2000093E50008A0E12008A0E1F7
:10F210000EF0A0E10632A0E3853E83E20700C0E3E2
:10F220000008A0E12008A0E1000083E50EF0A0E1C5
:10F230000632A0E3853E83E2000093E50008A0E1EA
:10F240002008A0E10EF0A0E1FF0000E20632A0E3FA
:10F25000023B83E20118A0E12118A0E1001183E73D
:10F260000EF0A0E1FF0000E20632A0E3023B83E2E1
:10F27000000193E70008A0E12008A0E10EF0A0E162
:10F28000FF0000E20118A0E10622A0E3022B82E2C7
:10F29000003192E7763CC3E37030C3E3031881E1A9
:10F2A0002118A0E1001182E70EF0A0E1FF0000E2CA
:10F2B0000632A0E3023B83E2000193E7060C00E282
:10F2C0000EF0A0E1FF0000E20118A0E10632A0E389
:10F2D000023B83E2003193E7073AC3E34030C3E3E4
:10F2E0000338A0E14338A0E14128A0E1010611E381
:10F2F00010302312200012E3203023120622A0E354
:10F30000022B82E20338A0E12338A0E1003182E73A
:10F310000EF0A0E1FF0000E20118A0E10632A0E338
:10F32000023B83E2003193E70139C3E37030C3E36A
:10F330000338A0E14338A0E14128A0E1010211E334
:10F34000013A2312020A12E3023A23120622A0E330
:10F35000022B82E20338A0E12338A0E1003182E7EA
:10F360000EF0A0E10DC0A0E130D82DE904B04CE2D0
:10F37000FF5000E2FF4001E20500A0E1B8FFFFEB13
:10F380000008A0E14008A0E1010054E30622A00328
:10F39000022B8202013AC0030400000A020054E377
:10F3A00030A81B190622A0E3022B82E21030C0E332
:10F3B0000338A0E12338A0E1053182E730A81BE93A
:10F3C000FF0000E20632A0E3023B83E2000193E784
:10F3D000300000E20EF0A0E1FF0000E20632A0E300
:10F3E000023B83E2000193E7030A00E20EF0A0E192
:10F3F000FF0000E20622A0E3022B82E2003192E746
:10F40000073AC3E34030C3E30338A0E12338A0E167
:10F41000303023E2003182E70EF0A0E1FF0000E28D
:10F420000622A0E3022B82E2003192E70139C3E316
:10F430007030C3E30338A0E12338A0E1033A23E2AC
:10F44000003182E70EF0A0E1FF0000E20622A0E317
:10F45000022B82E2003192E7013C83E3073AC3E3E7
:10F460007030C3E30338A0E12338A0E1003182E724
:10F470000EF0A0E1FF0000E20622A0E3022B82E2F0
:10F48000003192E7713CC3E37030C3E30338A0E17D
:10F490002338A0E1003182E70EF0A0E1FF0000E296
:10F4A0000622A0E3022B82E2003192E7713CC3E323
:10F4B0007030C3E30338A0E12338A0E1003182E7D4
:10F4C0000EF0A0E1FF0000E20622A0E3022B82E2A0
:10F4D000003192E7013C83E3073AC3E37030C3E3B2
:10F4E0000338A0E12338A0E1003182E70EF0A0E16B
:10F4F000FF0000E20622A0E3022B82E2003192E745
:10F50000013C83E3073AC3E37030C3E30338A0E16F
:10F510002338A0E1003182E70EF0A0E1FF0000E215
:10F520000622A0E3022B82E2003192E7713CC3E3A2
:10F530007030C3E30338A0E12338A0E1003182E753
:10F540000EF0A0E1FF0000E20632A0E3023B83E2FE
:10F55000000193E7300000E2100050E30000A01328
:10F560000100A0030EF0A0E1FF0000E20632A0E3DC
:10F57000023B83E2000193E7030A00E2010A50E341
:10F580000000A0130100A0030EF0A0E1FF0000E2C4
:10F590000622A0E3022B82E2003192E77030C3E33F
:10F5A000033AA0E1233AA0E1003182E70EF0A0E1A6
:10F5B000FF0000E20622A0E3022B82E2003192E784
:10F5C000073AC3E3F030C3E30338A0E12338A0E1F6
:10F5D000003182E70EF0A0E1FF0000E20622A0E386
:10F5E000022B82E2003192E7073AC3E37030C3E3B3
:10F5F0000338A0E12338A0E1013983E3003182E739
:10F600000EF0A0E1FF0000E20622A0E3022B82E25E
:10F61000003192E7073AC3E37030C3E30338A0E157
:10F620002338A0E1403083E3003182E70EF0A0E10F
:10F63000FF0000E20622A0E3022B82E2003192E703
:10F64000010913E30EF0A001003192E7073AC3E38A
:10F650007030C3E30338A0E12338A0E1013983E32C
:10F66000003182E70EF0A0E1FF0000E20622A0E3F5
:10F67000022B82E2003192E7400013E30EF0A0017A
:10F68000003192E7073AC3E37030C3E30338A0E1E7
:10F690002338A0E1403083E3003182E70EF0A0E19F
:10F6A000FF0000E2FF1001E20622A0E3022B82E24B
:10F6B000003192E7073AC3E37030C3E30338A0E1B7
:10F6C0002338A0E1013083E1003182E70EF0A0E1B0
:10F6D000FF0000E20632A0E3023B83E2000193E771
:10F6E0000F0000E20EF0A0E1FF0000E206C2A0E37E
:10F6F00085CE8CE200209CE50228A0E18001A0E1FB
:10F70000222880E0062282E2B230D2E10338A0E172
:10F71000003082E500309CE50338A0E1230880E05A
:10F72000060280E20310C1E30118A0E12118A0E164
:10F73000003090E5031081E1001080E50EF0A0E1BB
:10F74000FF0000E206C2A0E385CE8CE200309CE51B
:10F750000338A0E18001A0E1233880E0063283E293
:10F76000B020D3E1002083E500309CE50338A0E120
:10F77000230880E0060280E20118A0E12119A0E13F
:10F780000119A0E1003090E5031081E1001080E54F
:10F790000EF0A0E1FF0000E20632A0E3853E83E226
:10F7A000003093E50338A0E18001A0E1230880E068
:10F7B000060280E2B000D0E10EF0A0E1FF0000E21E
:10F7C0000632A0E3853E83E2003093E50338A0E1F2
:10F7D0008001A0E1230880E0060280E2B200D0E1CF
:10F7E0000EF0A0E1FF0000E206C2A0E385CE8CE2AD
:10F7F00000209CE50228A0E18001A0E1222880E011
:10F80000462282E2003092E5FF3FC3E30330C3E3C8
:10F81000003082E500309CE50338A0E1230880E059
:10F82000460280E20118A0E1003090E5213883E132
:10F83000003080E50EF0A0E110402DE9FFC000E2AD
:10F840000118A0E14118A0E10040A0E30138A0E1C7
:10F850003F0853E3A3E8A0910241A0830138A081AF
:10F8600023EBA0810602A0E3850E80E2002090E554
:10F870000228A0E18C11A0E1222881E0462282E248
:10F88000003092E50231C3E3003082E5003090E5BC
:10F890000338A0E1233881E0463283E2002093E57B
:10F8A000022084E1002083E5003090E50338A0E1E8
:10F8B000233881E0463283E2002093E51F23C2E330
:10F8C000002083E5003090E50338A0E1233881E093
:10F8D000463283E2002093E50E2D82E1002083E58D
:10F8E000003090E50338A0E1231881E0461281E260
:10F8F000003091E5FF37C3E30338C3E3003081E50F
:10F900001080BDE8FF0000E20632A0E3853E83E2FE
:10F91000003093E50338A0E18001A0E1230880E0F6
:10F92000460280E2B000D0E1000BA0E1200BA0E194
:10F930000EF0A0E1FF0000E20632A0E3853E83E284
:10F94000003093E50338A0E18001A0E1230880E0C6
:10F95000460280E2B200D0E1000BA0E1200BA0E162
:10F960000EF0A0E104E02DE5FF0000E206E2A0E3D6
:10F9700085EE8EE200C09EE50CC8A0E18001A0E10A
:10F980002CC880E006C28CE2B230DCE10338A0E192
:10F9900000308CE500309EE50338A0E1233880E09C
:10F9A000063283E20310C1E30118A0E12118A0E1AF
:10F9B00000C093E50C1081E1001083E500309EE566
:10F9C0000338A0E1233880E0063283E2B010D3E1AF
:10F9D000001083E500309EE50338A0E1230880E0B5
:10F9E000060280E20228A0E12229A0E10229A0E18A
:10F9F000003090E5032082E1002080E504F09DE4E2
:10FA0000FF0000E206C2A0E385CE8CE200209CE568
:10FA10000228A0E18001A0E1222880E0062282E203
:10FA2000B230D2E10338A0E1003082E500309CE53D
:10FA30000338A0E1230880E0060280E20310C1E35E
:10FA40000118A0E12118A0E1003090E5031081E148
:10FA5000001080E50EF0A0E1FF0000E206C2A0E386
:10FA600085CE8CE200309CE50338A0E18001A0E166
:10FA7000233880E0063283E2B020D3E1002083E522
:10FA800000309CE50338A0E1230880E0060280E214
:10FA90000118A0E12119A0E10119A0E1003090E5D1
:10FAA000031081E1001080E50EF0A0E1FF0000E20C
:10FAB0000632A0E3853E83E2003093E50338A0E1FF
:10FAC0008001A0E1230880E0060280E2B000D0E1DE
:10FAD0000EF0A0E1FF0000E20632A0E3853E83E2E3
:10FAE000003093E50338A0E18001A0E1230880E025
:10FAF000060280E2B200D0E10EF0A0E10DC0A0E16C
:10FB000070D82DE904B04CE2FF4000E2FF6001E252
:10FB10000258A0E12558A0E10400A0E10610A0E1F0
:10FB20000520A0E1040000EB0400A0E10610A0E124
:10FB30000520A0E13F0000EB70A81BE90DC0A0E18B
:10FB400010D82DE904B04CE2FFC000E2FF1001E242
:10FB50000228A0E14228A0E100E0A0E3020051E376
:10FB60000400001A0218A0E12118A0E10C00A0E195
:10FB70001BFFFFEB10A81BE9010051E310A81B19A4
:10FB80000238A0E13F0853E3A348A09102E9A08313
:10FB90000238A081234BA0810602A0E3850E80E2FB
:10FBA000002090E50228A0E18C11A0E1222881E04C
:10FBB000462282E2003092E50239C3E3003082E55A
:10FBC000003090E50338A0E1233881E0463283E23B
:10FBD000002093E502208EE1002083E5003090E5CF
:10FBE0000338A0E1233881E0463283E2002093E528
:10FBF0001F2BC2E3002083E5003090E50338A0E12D
:10FC0000233881E0463283E2002093E5042582E137
:10FC1000002083E5003090E50338A0E1231881E05F
:10FC2000461281E2003091E5FF3FC3E30330C3E3B6
:10FC3000003081E510A81BE910402DE9FFE000E24B
:10FC4000FF1001E20228A0E142C8A0E1020051E356
:10FC50000F00001A0602A0E3850E80E2003090E556
:10FC60000338A0E18E11A0E1233881E0463283E21F
:10FC7000B020D3E1002083E5003090E50338A0E117
:10FC8000231881E0461281E2003091E50C3883E1CF
:10FC90002E0000EA010051E31080BD180040A0E3EF
:10FCA0000C38A0E13F0853E3A3C8A0910241A08310
:10FCB0000C38A08123CBA0810602A0E3850E80E250
:10FCC000002090E50228A0E18E11A0E1222881E029
:10FCD000462282E2003092E50231C3E3003082E541
:10FCE000003090E50338A0E1233881E0463283E21A
:10FCF000002093E5022084E1002083E5003090E5B8
:10FD00000338A0E1233881E0463283E2002093E506
:10FD10001F23C2E3002083E5003090E50338A0E113
:10FD2000233881E0463283E2002093E50C2D82E106
:10FD3000002083E5003090E50338A0E1231881E03E
:10FD4000461281E2003091E5FF37C3E30338C3E395
:10FD5000003081E51080BDE8FF0000E20632A0E33C
:10FD6000853E83E2003093E50338A0E18001A0E105
:10FD7000230880E0460280E2B000D0E1000BA0E161
:10FD8000200BA0E10EF0A0E1FF0000E20632A0E3AC
:10FD9000853E83E2003093E50338A0E18001A0E1D5
:10FDA000230880E0460280E2B200D0E1000BA0E12F
:10FDB000200BA0E10EF0A0E1FF0000E2FF1001E245
:10FDC000010051E30800001A0622A0E3022B82E2A0
:10FDD000003192E7073AC3E37030C3E30338A0E190
:10FDE0002338A0E1403083E3090000EA020051E338
:10FDF0000EF0A0110622A0E3022B82E2003192E76E
:10FE0000073AC3E37030C3E30338A0E12338A0E12D
:10FE1000013983E3003182E70EF0A0E1FF1001E237
:10FE20000118A0E1001C81E12118A0E10100A0E17E
:10FE30000EF0A0E10008A0E14008A0E1FF3000E2E0
:10FE40000008A0E10334A0E1203C83E10300A0E12D
:10FE50000EF0A0E1FF0000E20622A0E3862E82E27F
:10FE6000003092E5EF30C3E3003082E50002A0E10C
:10FE7000000082E50EF0A0E1FF0000E20622A0E310
:10FE8000862E82E2003092E50730C3E3003082E53F
:10FE9000000082E50EF0A0E1FF0000E2FF1001E2A9
:10FEA00085CEA0E386C28CE20111A0E100309CE582
:10FEB0000F20A0E31231C3E100308CE500309CE557
:10FEC000103183E100308CE50EF0A0E1FF0000E28C
:10FED000852EA0E3C62282E2003092E50130C3E322
:10FEE000003082E5852EA0E3862282E2003092E592
:10FEF000033AC3E3003082E5010080E2003092E57E
:10FF0000003683E1003082E50EF0A0E1852EA0E30B
:10FF1000862282E2003092E5033AC3E3003082E5B4
:10FF20000EF0A0E1FF0000E2852EA0E3C62282E2EF
:10FF3000003092E58030C3E3003082E5852EA0E3F7
:10FF4000462282E2003092E50110A0E3113083E105
:10FF5000003082E50EF0A0E1FF0000E2852EA0E374
:10FF6000462282E2003092E50110A0E31130C3E1A5
:10FF7000003082E50EF0A0E1FF0000E2852EA0E354
:10FF8000C62282E2003092E51E3CC3E3003082E5E7
:10FF9000003092E5803483E1003082E50EF0A0E18C
:10FFA000FF0000E2852EA0E3C62282E2003092E547
:10FFB0001E30C3E3003082E5003092E5803083E1FB
:10FFC000003082E50EF0A0E1853EA0E3C63283E278
:10FFD000002093E5012C82E3002083E5002093E5D7
:10FFE000022A82E3002083E50EF0A0E1853EA0E333
:10FFF000C63283E2002093E5012082E3002083E5FE
:020000021000EC
:10000000002093E5202082E3002083E50EF0A0E1AC
:10001000853EA0E3C63283E2002093E5012CC2E3D3
:10002000002083E5002093E5022AC2E3002083E557
:100030000EF0A0E1853EA0E3C63283E2002093E506
:100040000120C2E3002083E5002093E52020C2E3E5
:10005000002083E50EF0A0E1852EA0E3C62282E217
:10006000003092E5403083E3003082E50EF0A0E1FD
:10007000852EA0E3C62282E2003092E54030C3E341
:10008000003082E50EF0A0E1FF0000E2862EA0E342
:10009000462282E2003092E5FF30C3E3003082E581
:1000A000003092E5030080E1000082E50EF0A0E15F
:1000B000FF0000E2862EA0E3462282E2003092E5B5
:1000C000FF3CC3E3003082E5003092E5003483E179
:1000D000003082E50EF0A0E1FF0000E20622A0E37E
:1000E000862E82E2003092E5FF3003E2003082E5A6
:1000F000003092E5003483E1003082E50EF0A0E1AB
:100100000632A0E3863E83E2003093E50000A0E3E0
:100110000EF0A0E10DC0A0E100D82DE904B04CE242
:100120000008A0E12008B0E12C309F0500309305C5
:100130000120A003B821C30100A81B091C309FE5C2
:10014000003093E50FE0A0E100F093E508309FE573
:10015000003093E5120083E200A81BE92018000498
:10016000001800040DC0A0E110D82DE904B04CE245
:1001700050309FE5002093E50510D2E548309FE51B
:100180000130D3E5030051E10C00008A0430D2E5D0
:10019000000053E30900001AB840D2E1000054E324
:1001A0000600001A1210C2E520309FE5003093E5EA
:1001B0000FE0A0E104F093E50400A0E110A81BE922
:1001C0000200A0E310A81BE9201800048C01000421
:1001D000001800040DC0A0E100D82DE904B04CE2E5
:1001E0000008A0E12008B0E12C309F050030930505
:1001F0000120A003B821C30100A81B091C309FE502
:10020000003093E50FE0A0E108F093E508309FE5AA
:10021000003093E5140083E200A81BE920180004D5
:10022000001800040DC0A0E130D82DE904B04CE264
:1002300098309FE5002093E594409FE5003094E5D9
:100240000900D3E50510D3E50FE0A0E118F092E531
:100250000050A0E1004094E51230D4E5000053E3E3
:100260001800000A000050E30500001A0830D4E529
:10027000000053E30200001A0430D4E5000053E309
:100280000100000A0200A0E330A81BE9000050E3CF
:100290000C00001A3C309FE5003093E50FE0A0E130
:1002A0000CF093E528109FE5002091E50930D2E598
:1002B0001330C2E5002091E50530D2E51430C2E5E7
:1002C0000500A0E130A81BE90200A0E330A81BE96B
:1002D000A017000420180004001800040DC0A0E1BD
:1002E00000D82DE904B04CE20008A0E12008B0E1FC
:1002F000FC309F05003093050220A003B821C30104
:1003000000A81B09EC109FE50030A0E3B030C1E16C
:10031000DC309FE5002093E50030D2E57F0013E359
:100320000A00001A1120D2E5200012E30030D11596
:10033000023083130030C115400012E3B4209F0542
:100340000030D2050130C3032200000A1E0000EA7B
:100350009C309FE5003093E50030D3E57F3003E229
:10036000010053E38C009F0500A81B0980309FE526
:10037000002093E50030D2E57F3003E2020053E332
:100380000000A01300A81B190920D2E50230A0E14B
:100390000F2002E2800013E30500000A0632A0E30A
:1003A000023B83E2023193E7303003E2100053E373
:1003B000040000EA0632A0E3023B83E2023193E745
:1003C000033A03E2010A53E30300001A24209FE5E5
:1003D0000030D2E5013083E30030C2E518309FE5FC
:1003E000003093E50FE0A0E110F093E504009FE5F5
:1003F00000A81BE92018000440170004001800049E
:100400000DC0A0E130D82DE904B04CE280319FE569
:10041000002093E50000D2E57F0010E21130D20504
:100420002030C3031130C20530A81B09020050E37D
:100430000200A01330A81B1954319FE5002093E55A
:10044000B430D2E1000053E31B00001A0830D2E5BB
:10045000000053E31800001A34319FE5003093E5A3
:100460000900D3E58040C0E30410A0E1D930D3E116
:10047000000053E30632A0B3023B83B2043193B7CA
:10048000302003B20632A0A3023B83A2043193A71B
:10049000032A03A2FC309FE50030D3E5000052E3BD
:1004A000030051110400002AE4309FE5003093E579
:1004B0001230D3E5000053E30100001A0200A0E36C
:1004C00030A81BE9800010E30C00000A0632A0E30C
:1004D000023B83E2043193E7303003E2100053E340
:1004E0002500001AFF4004E20400A0E15DFCFFEBE0
:1004F0000400A0E13010A0E371FBFFEB1E0000EA56
:100500000652A0E3025B85E2043195E7033A03E279
:10051000010A53E31800001A000054E30B00001A0C
:1005200074309FE52C10D3E50400A0E1C1FCFFEB83
:10053000043195E70139C3E37030C3E30338A0E128
:100540002338A0E1033A23E2043185E70A0000EAF8
:10055000FF0004E235FCFFEB0622A0E3022B82E25F
:10056000043192E70139C3E37030C3E30338A0E1FB
:100570002338A0E1033A23E2043182E71C309FE5EF
:10058000003093E50FE0A0E114F093E50000A0E354
:1005900030A81BE9201800048C010004900100041D
:1005A000001800040DC0A0E100D82DE904B04CE211
:1005B000E4309FE5003093E509E0D3E580C0CEE369
:1005C000D930D3E1000053E30632A0B3023B83B23B
:1005D0000C3193B7300003B20632A0A3023B83A2D2
:1005E0000C3193A7030A03A2B0309FE50030D3E596
:1005F00003005CE10C00002A9C309FE5001093E5AD
:10060000B420D1E1000050E30030A0130130A0037A
:10061000000052E301308313000053E30200001A8C
:100620001230D1E5000053E30100001A0200A0E3FC
:1006300000A81BE980001EE30800000A0622A0E3D0
:10064000022B82E20C3192E7073AC3E34030C3E366
:100650000338A0E12338A0E1103023E2070000EACC
:100660000622A0E3022B82E20C3192E70139C3E3B8
:100670007030C3E30338A0E12338A0E1013A23E25C
:100680000C3182E718309FE5003093E50FE0A0E1E0
:1006900018F093E50000A0E300A81BE9201800046F
:1006A0008C010004001800040DC0A0E100D82DE961
:1006B00004B04CE224309FE5002093E51130D2E5F0
:1006C000203083E31130C2E514309FE5003093E51C
:1006D0000FE0A0E11CF093E50000A0E300A81BE9F7
:1006E000201800040018000401C0A0E124309FE598
:1006F000002093E5BA11D2E10008A0E12008B0E1A2
:10070000B430DC0103306100B831C20100309C1507
:10071000030081100EF0A0E1201800040DC0A0E13C
:10072000F0D82DE904B04CE228319FE5003093E584
:10073000187083E2B821D3E1083097E5000053E355
:10074000000052131500000AB440D7E1020054E142
:100750000240A0210450A0E10400A0E10FE0A0E1CC
:1007600008F097E50060A0E1B030D7E1033064E025
:10077000B030C7E1B230D7E1043083E0B230C7E136
:100780000000A0E30CFCFFEB0010A0E10118A0E1C9
:100790002118A0E10600A0E10420A0E18A0300EBFB
:1007A000B030D7E1000053E30800000AA8309FE50D
:1007B000032AA0E3B020C3E10000A0E30010A0E101
:1007C00007FCFFEB94309FE53020A0E3B020C3E1AD
:1007D000B020D7E1B430D7E1030052E174309F2557
:1007E000002093250330A0230500002AB030D7E174
:1007F000000053E30400000A58309FE5002093E511
:100800000530A0E31030C2E5F0A81BE944309FE5B5
:10081000002093E50630A0E31030C2E50612A0E305
:10082000851E81E2002091E50228A0E12228A0E1B6
:100830004602A0E3003092E7FF3FC3E30330C3E387
:10084000003082E7003091E510309FE53020A0E3D2
:10085000B020C3E1F0A81BE92018000450170004E1
:10086000601700040DC0A0E1F0D92DE904B04CE2FE
:10087000BC309FE5003093E5187083E2B821D3E1E6
:100880001080D3E5000052E3040058030780A00362
:10089000A0309F051020A0032000000AB440D7E13B
:1008A000040052E10280A0830480A093020054E17E
:1008B0000240A0210450A0E10400A0E10FE0A0E16B
:1008C00008F097E50060A0E10000A0E3B0FBFFEBBB
:1008D0000010A0E10118A0E12118A0E10600A0E1AC
:1008E0000420A0E1240300EB0000A0E30410A0E139
:1008F000BBFBFFEBB030D7E1033064E0B030C7E1C1
:10090000B230D7E1043083E0B230C7E124309FE554
:100910003020A0E3B020C3E11C309FE5032AA0E310
:10092000B020C3E108309FE5003093E51080C3E5B7
:10093000F0A91BE9201800046017000450170004F8
:100940000DC0A0E110D82DE904B04CE20200A0E3F4
:10095000C4319FE5003093E50140D3E50030D3E595
:100960007F0013E33200001A090054E30100001A6B
:10097000FBFDFFEB470000EA050054E30F00001AFF
:1009800094319FE5002093E5D530D2E1000053E398
:100990004C0000BA0430D2E5000053E34900001ACD
:1009A000B830D2E1000053E34600001A1230D2E51D
:1009B000000053E30000A0033600000A410000EAF3
:1009C000030054E30C00001A4C319FE5002093E52E
:1009D0000530D2E5010053E32D00001AB830D2E112
:1009E000000053E32A00001A1130D2E5200013E37F
:1009F0002700000A2BFFFFEB260000EA010054E36A
:100A00002400001A10319FE5002093E50530D2E55F
:100A1000010053E31E00001AB830D2E1000053E396
:100A20001B00001A1130D2E5200013E31200001A57
:100A3000170000EAE0309FE5003093E50030D3E591
:100A40007F3003E2010053E30300001A0B0054E37C
:100A50001000001AF2FDFFEB0E0000EAB8309FE52F
:100A6000003093E50030D3E57F3003E2020053E32A
:100A70000700001A010054E30100001A5FFEFFEBBB
:100A8000040000EA030054E30200001AC4FEFFEB76
:100A9000000000EA0200A0E3000050E30B00000A9F
:100AA00078309FE5003093E5FF0004E20FE0A0E11D
:100AB00014F093E5030050E309C0A0031200000AFC
:100AC000000050E30100000A08C0A0E30E0000EAA5
:100AD00006C0A0E30612A0E3851E81E2002091E596
:100AE0000228A0E12228A0E14602A0E3003092E71C
:100AF000FF3FC3E30330C3E3003082E7003091E5FA
:100B00001C309FE53020A0E3B020C3E108309FE512
:100B1000003093E510C0C3E510A81BE920180004BD
:100B2000A0170004601700040DC0A0E170D82DE9E3
:100B300004B04CE220339FE5002093E50110D2E59C
:100B40000040A0E30450A0E1060051E31200001AA7
:100B50000030D2E57F0013E37A00001A0430D2E5BA
:100B6000010053E3F4329F05003093051C409305C8
:100B70007400000A020053E3E0329F050030930541
:100B8000204093056F00000A030053E3CC329F0519
:100B900000309305244093056A0000EA000051E309
:100BA0004400001AB0329FE5002093E5B430D2E152
:100BB000000053E33F00001ABC30D2E1020053E3CF
:100BC0003C00001A0830D2E5000053E33900001A57
:100BD0000030D2E57F0013E30200001AB830D2E102
:100BE000000053E33100000A6C629FE5002096E5A7
:100BF0000030D2E57F3003E2010053E30B00001A1E
:100C000058329FE5003093E50900D2E50010A0E3DB
:100C10000FE0A0E118F093E5000050E34900001A4E
:100C2000003096E51230D3E5000053E31E0000EAE1
:100C300024329FE5002093E50030D2E57F3003E2C7
:100C4000020053E33F00001A0910D2E50F1001E241
:100C50000900D2E5700000E2D930D2E1000053E390
:100C60000632A0B3023B83B2013193B730C003B266
:100C70000632A0A3023B83A2013193A703CA03A2B9
:100C8000DC319FE50020D3E5000050E30030A013E5
:100C90000130A003020051E10030A02301300332F3
:100CA000000053E32700000A00005CE32500000A6F
:100CB000B0419FE5230000EA080051E30500001A57
:100CC00094319FE5003093E50030D3E57F0013E3D6
:100CD00094419F051B0000EA0A0051E31900001A25
:100CE00074319FE5002093E50030D2E57F3003E2C8
:100CF000010053E31300001A1230D2E5000053E361
:100D00001000000AB430D2E1000053E30D00001AD5
:100D10000810D2E5000051E30A00001ABC30D2E10D
:100D2000010053E30700001A30319FE5003093E5DE
:100D30000900D2E50FE0A0E118F093E52C319FE522
:100D4000000050E30340A001000054E30900000A42
:100D500004319FE5002093E5BA51C2E1003093E5EC
:100D6000204083E50000A0E30FE0A0E104F0A0E153
:100D70000000A0E30A0000EAE0309FE5002093E5D0
:100D8000D4409FE5003094E50100D3E50FE0A0E1F9
:100D900010F092E5030050E3002094050930A00311
:100DA0001200000AB0309FE5001093E5B821D1E1B0
:100DB000FF3CA0E3FF3083E2030052E10930A003CF
:100DC0001030C10570A81B09020050E30400000A9E
:100DD00084309FE5003093E5B831D3E1000053E360
:100DE0000400001A70309FE5002093E50830A0E36E
:100DF0001030C2E570A81BE95C309FE5002093E548
:100E0000D030D2E1000053E30B0000AABC10D2E1C5
:100E1000B831D2E1010053E1B811C28138309FE509
:100E2000002093E534309FE5003093E52C30D3E586
:100E3000BC31C2E18AFEFFEB70A81BE918309FE5C8
:100E4000002093E50330A0E31030C2E520309FE599
:100E5000032AA0E3B020C3E170A81BE92018000416
:100E6000A01700048C010004DC0201001401010041
:100E7000D4010100501700040DC0A0E170D82DE985
:100E800004B04CE20000A0E34BFAFFEB9F54C0E338
:100E9000FF58C5E3065285E388609FE5002096E58C
:100EA0001030D2E5090053E31000000A0030D5E508
:100EB0000030C2E5002096E5B030D5E12334A0E152
:100EC0000130C2E5004096E5B200D5E1D8FBFFEB6A
:100ED000B400C4E1004096E5B400D5E1D4FBFFEBDB
:100EE000B800C4E1003096E5B650D5E1BC50C3E18E
:100EF00030109FE5002091E50130A0E31030C2E5FD
:100F0000003091E5BC30D3E1000053E30100001A4A
:100F10008AFEFFEB000000EA02FFFFEB460000EB59
:100F2000FF0000E270A81BE9201800040DC0A0E13A
:100F300010D82DE904B04CE28C409FE5003094E5D8
:100F40001020D3E5040052E3020052130300001AFC
:100F500043FEFFEB003094E51020D3E5140000EAD7
:100F6000060052E31100001A5C309FE5002093E573
:100F70000130D2E5050053E30800001A0030D2E545
:100F80007F0013E30500001A0500D2E5470000EBDF
:100F900038309FE5003093E50FE0A0E120F093E5C5
:100FA0002C309FE5003093E50FE0A0E108F093E5D9
:100FB0000820A0E310309FE5003093E51020C3E542
:100FC0001D0000EBFF0000E210A81BE92018000440
:100FD00000180004A01700040DC0A0E110D82DE9EE
:100FE00004B04CE248309FE5003093E51040D3E573
:100FF000050054E3030054130100001AC6FDFFEB83
:10100000050000EA070054E328309F0500309305EF
:101010000FE0A0010CF093050840A0E310309FE51D
:10102000003093E51040C3E5030000EBFF0000E251
:1010300010A81BE920180004A01700040DC0A0E1AF
:1010400000D82DE904B04CE250309FE52C10D3E5D8
:101050000000A0E3F7F9FFEB44309FE5003093E593
:101060001030D3E5080053E30500001A34309FE543
:10107000012AA0E3B020C3E12C309FE51020A0E3BB
:10108000B020C3E118309FE5003093E51000D3E5B0
:10109000090050E30000A0130100A00300A81BE911
:1010A0009001000420180004501700046017000489
:1010B00010402DE9FF4000E254309FE50000D3E5E9
:1010C0000010A0E3000051E10C00002A06C2A0E3DA
:1010D00002CB8CE28FECA0E38FE08EE2FF2001E2F6
:1010E00002319CE70338A0E123380EE0023083E1AF
:1010F00002318CE7011081E2000051E1F6FFFF3A76
:10110000213DA0E3C63283E2802084E3002083E512
:101110001080BDE88C0100040EF0A0E10DC0A0E13C
:1011200070D82DE904B04CE2D0229FE5213DA0E328
:101130000310A0E1463283E2003093E5B030C2E113
:10114000B030D2E1020913E370A81B09B0529FE549
:101150000260A0E1462281E27F3CA0E3FF3083E20F
:10116000003082E5B030D6E10F3003E20030C5E553
:101170000030D5E5000053E37400001A0642A0E3F6
:10118000024B84E2003094E5033A03E274229FE5C7
:10119000B030C2E1003094E5303003E268229FE5D0
:1011A000B030C2E1003094E50139C3E37030C3E3ED
:1011B0000338A0E12338A0E1023A23E2003084E5BD
:1011C000003094E5073AC3E34030C3E30338A0E1BD
:1011D0002338A0E1203023E2003084E5B030D6E1AE
:1011E000100013E30F00001A003094E5073AC3E340
:1011F000F030C3E30338A0E12338A0E1003084E5F8
:1012000049FFFFEB003094E5220B13E32800000AAE
:10121000003094E57030C3E3033AA0E1233AA0E143
:10122000003084E5160000EA0622A0E3022B82E2E9
:10123000003092E50338A0E12348A0E1800014E3E8
:101240000600000A003092E5073AC3E3F030C3E33A
:101250000338A0E12338A0E1003082E532FFFFEB44
:10126000020B14E30800000A0622A0E3022B82E22C
:10127000003092E57030C3E3033AA0E1233AA0E1E5
:10128000003082E5FBFEFFEB090000EA020914E3EF
:101290000700000A0622A0E3022B82E2003092E55A
:1012A0007030C3E3033AA0E1233AA0E1003082E5C5
:1012B00048FFFFEB0632A0E3023B83E2003093E5F8
:1012C0000139C3E37030C3E30338A0E14318A0E160
:1012D00030319FE5B030D3E1010A13E3011A211246
:1012E00020319FE5B030D3E1020A13E3021A211244
:1012F0000622A0E3022B82E20138A0E12338A0E11C
:10130000003082E5003092E5073AC3E34030C3E3A2
:101310000338A0E14318A0E1EC309FE5B030D3E101
:10132000100013E310102112DC309FE5B030D3E140
:10133000200013E3201021120622A0E3022B82E2F8
:101340000138A0E12338A0E1003082E5220000EA64
:10135000AC009FE50020D0E50612A0E3021B81E26D
:10136000023191E70338A0E12348A0E1020914E328
:101370000900000A023191E77030C3E3033AA0E1AB
:10138000233AA0E1023181E70020D0E57C309FE5DF
:10139000023183E00FE0A0E104F013E5800014E3E4
:1013A0000D00000A0010D5E50622A0E3022B82E220
:1013B000013192E7073AC3E3F030C3E30338A0E119
:1013C0002338A0E1013182E70020D5E540309FE5D8
:1013D000023183E00FE0A0E104F013E51C209FE55B
:1013E000211DA0E3463281E2003093E5B030C2E136
:1013F000B030D2E1020913E370A81B0954FFFFEAE1
:1014000050110004A81700045017000460170004CE
:10141000480100040C0100040DC0A0E1F0D82DE942
:1014200004B04CE2E4209FE50210A0E1213DA0E3DE
:10143000463283E2003093E5B030C2E1B030D2E111
:10144000020913E3F0A81B09217DA0E3467287E29D
:10145000BC509FE50662A0E3026B86E27F3CA0E3FE
:10146000FF3083E2003087E5B030D1E10F3003E296
:101470000030C5E50020D5E5023196E70338A0E14C
:101480002348A0E1020914E30900000A023196E7AB
:101490007030C3E3033AA0E1233AA0E1023186E7CA
:1014A0000020D5E56C309FE5023183E00FE0A0E13C
:1014B00004F013E5800014E30D00000A0010D5E5E8
:1014C0000622A0E3022B82E2013192E7073AC3E34E
:1014D000F030C3E30338A0E12338A0E1013182E713
:1014E0000020D5E530309FE5023183E00FE0A0E138
:1014F00004F013E514109FE5003097E5B030C1E12A
:10150000B030D1E1020913E3F0A81B09D2FFFFEAD2
:1015100050110004A8170004480100040C01000445
:101520000DC0A0E100D82DE904B04CE230209FE5C9
:1015300030309FE5002083E50230A0E31030C2E5A3
:1015400024109FE524309FE5001083E520209FE5CF
:1015500020309FE5002083E50FE0A0E100F091E559
:1015600000A81BE9C0170004201800049001000423
:10157000A0170004C0010004001800040228A0E124
:101580002228A0E1032082E29F14C1E3FF18C1E3F7
:10159000061281E342C1B0E10EF0A0010030D0E5B7
:1015A0000120D0E5023483E10220D0E5023883E156
:1015B0000320D0E5023C83E1040080E2043081E4B2
:1015C00001C05CE20EF0A001F3FFFFEA0118A0E108
:1015D0004118A0E10228A0E142C8A0E1000052E3C6
:1015E0000EF0A0019F14C1E3FF18C1E3061281E3CE
:1015F0000130D1E40130C0E401304CE20338A0E115
:1016000043C8A0E1000053E30EF0A0010130D1E493
:101610000130C0E401304CE20338A0E143C8A0E14E
:10162000000053E30EF0A001F0FFFFEA0DC0A0E1BF
:1016300070D82DE90140A0E10030A0E1D8309FE54D
:1016400004B04CE202C1C0E314D04DE203005CE1FF
:101650000160A0E10050A0E1B4208FD20C0092D82C
:10166000160000DAB4309FE503005CE1030000DA05
:101670000130A0E10020A0E14A0F00EB70A81BE9B7
:1016800028504BE20520A0E1260200EB03C000E257
:1016900001005CE30B00000A020000CA00005CE3EA
:1016A0000300000A130000EA02005CE30B00000ADA
:1016B000100000EA20C04BE2030095E80C009CE813
:1016C000690400EB70A81BE920E04BE2030095E8F9
:1016D0000C009EE800C08DE5EF0700EB030000EA78
:1016E00020C04BE2030095E80C009CE85E0400EB90
:1016F000171200EB70A81BE920E04BE2030095E80D
:101700000C009EE801C0A0E300C08DE5E20700EBFD
:1017100070A81BE90000000000000000FB21E93F69
:10172000FFFFEF7F000000EAC70000EA0DC0A0E164
:10173000F0DB2DE904B04CE230404BE20CD04DE23E
:101740000C0084E90340A0E10230A0E1002064E243
:10175000022084E10251C3E3E8629FE5A22F85E104
:1017600004E0A0E130300BE5060052E10140A0E1C9
:101770000030A0E10180A0E10070A0E10090A0E1B4
:101780000420A0E102C1C0E30400008A003064E24A
:10179000033084E1A33F8CE1060053E10500009A89
:1017A00030204BE2030092E90830A0E10720A0E1DD
:1017B000E40E00EBF0AB1BE930401BE5033184E2A3
:1017C000013683E20E3093E10100001AF06B1BE951
:1017D000400800EA30101BE5413FA0E1023003E27F
:1017E00002209CE1A76F83E10900001A030056E381
:1017F00006F18F90060000EA020000EA010000EA0C
:101800002A0000EA2C0000EA0810A0E10700A0E18D
:10181000F0AB1BE90EE095E12D00000A24329FE5B4
:10182000030055E12700001A05005CE11200001AD0
:10183000030056E306F18F90220000EA020000EA5E
:10184000040000EA060000EA080000EA670F8FE2E1
:10185000030090E8F0AB1BE9660F8FE2030090E80D
:10186000F0AB1BE9650F8FE2030090E8F0AB1BE9DA
:10187000190E8FE2030090E8F0AB1BE9030056E37A
:1018800006F18F900F0000EA020000EA040000EA6F
:10189000060000EA080000EA170E8FE2030090E855
:1018A000F0AB1BE95B0F8FE2030090E8F0AB1BE9A4
:1018B0005A0F8FE2030090E8F0AB1BE9590F8FE25B
:1018C000030090E8F0AB1BE978319FE503005CE191
:1018D0000700001A000059E3020000AA530F8FE22C
:1018E000030090E8F0AB1BE9520F8FE2030090E891
:1018F000F0AB1BE90C3065E0433AA0E13C0053E358
:10190000134E8FC2300094C8100000CA30201BE56F
:101910003C0073E30030A0A30130A0B3A22F13E07A
:10192000E8408F12300094180800001A30404BE253
:101930000C0094E90810A0E10700A0E1C90F00EB3A
:101940003F0900EBE30700EB0150A0E10040A0E1FC
:10195000010056E30900000A020000CA000056E335
:101960000300000A180000EA020056E30B00000A18
:10197000150000EA0510A0E10400A0E1F0AB1BE9AE
:101980000520A0E10410A0E10430A0E10540A0E1A1
:10199000023121E20410A0E10300A0E1F0AB1BE959
:1019A00098208FE20C0092E80510A0E10400A0E16D
:1019B0007C0E00EB0130A0E10020A0E15C008FE292
:1019C000030090E8770E00EBF0AB1BE96C208FE290
:1019D0000C0092E80510A0E10400A0E1710E00EBFC
:1019E00038208FE20C0092E86E0E00EBF0AB1BE9A2
:1019F000FB21E93F182D4454FB21E9BF182D445425
:101A00007CD90240D221337F7CD902C0D221337FDE
:101A10000000000000000000000000800000000046
:101A2000FB210940182D4454FB2109C0182D4454B2
:101A3000FB21F9BF182D4454FB21F93F182D4454C4
:101A400026A6A13C075C14330000F07F0DC0A0E186
:101A5000F0DB2DE904B04CE20190A0E10080A0E1B0
:101A600034D04DE230004BE20C0000E830104BE285
:101A700030C04BE2000381E906001CE80271C8E3B4
:101A80000251C1E3070055E1080000DA0100A0E1BE
:101A90000210A0E130204BE2030082E930104BE25B
:101AA000000301E80730A0E10570A0E10350A0E1C8
:101AB000073065E030204BE20F0553E330C04BE2C6
:101AC000180092E930004BE206001CE80730A0E164
:101AD0000510A0E1180080E930304BE2060003E871
:101AE000040000DA30404BE2030094E90C001CE8EB
:101AF000140E00EBF0AB1BE918349FE50000A0E3E7
:101B0000030057E150000BE5280000DA08349FE598
:101B1000030057E1190000DA30204BE230404BE27D
:101B2000030092E90C0014E8060E00EB50C04BE2F3
:101B300003008CE930004BE2FF34C7E3060090E974
:101B40000F36C3E3023093E130104B0206009109D7
:101B500050304B0206008309C0239FE530C04BE2A2
:101B600018001CE8022025E0042092E150204B02DE
:101B70001800820950204BE2030092E9F0AB1BE908
:101B800030C04BE230004BE218009CE9060010E840
:101B9000967547E2965545E20510A0E10730A0E1B1
:101BA000060000E818008CE9961FA0E350100BE532
:101BB0006C339FE5030055E12E0000CA010655E392
:101BC0001F0000AA30204BE2180012E8043095E113
:101BD0000200001A30304BE2030093E9F0AB1BE93E
:101BE000320E8FE2030090E840204BE230304BE2AF
:101BF000030082E9030013E8C22F8FE20C0092E891
:101C0000150E00EB30C04BE203000CE850C01BE5A2
:101C100030204BE240404BE2030092E9FFCF4CE220
:101C20000C0094E950C00BE50B0E00EB50301BE5A7
:101C300030204BE2023043E2030082E950300BE5F2
:101C40000C0000EA30004BE2060010E8965585E2F1
:101C500030C04BE20510A0E118009CE9967587E2C0
:101C6000060000E850101BE50730A0E1961F41E296
:101C700018008CE950100BE530204BE230404BE26D
:101C8000030092E90C0014E8C60D00EB30404BE273
:101C900050C04BE203008CE90C0014E8CB0F00EBC2
:101CA000000050E3340000DA0040A0E30030A0E37D
:101CB00040C04BE20730A0E118008CE930204BE235
:101CC00040404BE2030092E90C0094E9B50D00EBB3
:101CD00040C04BE240204BE203000CE8030092E9D5
:101CE0000130A0E10020A0E1DB0D00EB30C04BE2B1
:101CF0000170A0E10060A0E103001CE8941000EB7B
:101D000030404BE20130A0E10020A0E1030014E8E4
:101D1000D10D00EB30C04BE20150A0E10040A0E14A
:101D200003009CE940C04BE20C009CE9850D00EBF0
:101D300040C04BE20130A0E10020A0E103001CE81C
:101D4000C50D00EB0130A0E10020A0E10510A0E1ED
:101D50000400A0E1930D00EB0130A0E10020A0E120
:101D60000710A0E10600A0E18E0D00EB170200EBCA
:101D700050204BE2030082E94D0000EA30304BE294
:101D8000030093E90130A0E10020A0E16D0D00EB1C
:101D900030404BE2030084E90040A0E30030A0E3C0
:101DA0000530A0E10460A0E10350A0E130C04BE2A7
:101DB0000630A0E10520A0E103001CE8790D00EB4E
:101DC0000040A0E30030A0E30190A0E10080A0E18A
:101DD000013687E240004BE2180080E930204BE2F8
:101DE00040404BE2030092E90C0094E96D0D00EBDA
:101DF00040C04BE240204BE203000CE8030092E9B4
:101E00000630A0E10520A0E1930D00EB50404BE22D
:101E100050304BE2030003E9030094E94C1000EB5F
:101E200050C04BE20130A0E10020A0E103009CE99A
:101E3000890D00EB40204BE20170A0E10060A0E1C1
:101E4000030092E90930A0E10820A0E1820D00EB37
:101E500030C04BE240304BE20150A0E10040A0E135
:101E6000030013E80C001CE87B0D00EB0130A0E13F
:101E70000020A0E10510A0E10400A0E1310D00EB7D
:101E80000130A0E10020A0E10710A0E10600A0E1E0
:101E9000440D00EB50404BE20130A0E10020A0E1F6
:101EA000030014E93F0D00EBC80100EB50C04BE20A
:101EB00003008CE950001BE5000050E30E00000A0F
:101EC00048108FE2060091E840304BE2060083E9BB
:101ED0000240A0E10130A0E1003A81E040004BE285
:101EE000180080E90410A0E10300A0E150404BE29B
:101EF0000C0094E9580D00EBF0AB1BE950C04BE22D
:101F000003009CE9F0AB1BE90000D07F000000005B
:101F10000000F03F000000000000305FFFFFEF7F97
:101F20000000F07FFFFFAF200DC0A0E1F0DF2DE942
:101F30000140A0E10030A0E1B0329FE5B0A29FE5F2
:101F40000291C0E304B04CE250D04DE2030059E1ED
:101F50000160A0E10050A0E168000BE544200BE522
:101F60000AA08FE0B37F8FE2800197E80200A0D142
:101F70006000A0D80020A0D3800180D8910100DAB1
:101F800070329FE5030059E15C0000CA68201BE540
:101F9000000052E32A0000DA232E8FE20C0092E8C0
:101FA000000D00EB50329FE5030059E144301BE582
:101FB0000180A0E10070A0E1084083E20C00000A6B
:101FC000212E8FE20C0092E8F60C00EB44C01BE5DA
:101FD0000130A0E10020A0E103008CE80810A0E19E
:101FE0000700A0E1EF0C00EB7A2F8FE20C0092E8E3
:101FF000100000EA852F8FE20C0092E8E90C00EB5C
:10200000212E8FE20C0092E80180A0E10070A0E197
:10201000E40C00EB0130A0E10020A0E144001BE54E
:102020000C0080E80810A0E10700A0E1DD0C00EB47
:102030001E2E8FE20C0092E8DA0C00EB0120A0E3E8
:102040005D0100EA612F8FE20C0092E8BD0C00EB0D
:10205000A4319FE50180A0E10070A0E144101BE5E0
:10206000030059E1084081E20E00000A592F8FE277
:102070000C0092E80810A0E10700A0E1B10C00EB11
:1020800044C01BE50130A0E10020A0E103008CE882
:102090000810A0E10700A0E1C20C00EB4D2F8FE279
:1020A0000C0092E8120000EA162E8FE20C0092E873
:1020B0000810A0E10700A0E1A20C00EB552F8FE271
:1020C0000C0092E80180A0E10070A0E19D0C00EB03
:1020D0000130A0E10020A0E144001BE50C0080E8F5
:1020E0000810A0E10700A0E1AE0C00EB492F8FE241
:1020F0000C0092E8930C00EB0020E0E32E0100EAD4
:10210000F8309FE5030059E1D80000CA4C0700EB06
:1021100050204BE2030082E9C0208FE20C0092E8DD
:10212000CD0C00EBBC208FE20C0092E8850C00EB9C
:102130004B0F00EB64000BE5190F00EB60404BE226
:10214000030084E984208FE20C0092E8C20C00EBCB
:1021500050404BE20130A0E10020A0E1030094E9EF
:10216000900C00EB50C04BE260204BE203000CE807
:10217000030092E95C208FE20C0092E8B60C00EBC1
:1021800064301BE51F0053E30180A0E10070A0E173
:102190002A0000CA68309FE564401BE503308AE0EE
:1021A000043183E0043013E5030059E12300000A01
:1021B00050C04BE20830A0E10720A0E103001CE87A
:1021C000780C00EB44201BE5030082E88C0000EA59
:1021D000FB21F93F0000405461B4D03D3163621AE5
:1021E000305FE43F83C8C96D0000E03F000000009D
:1021F000FB21E93F0CE3FE037BD90240FB21F93FC1
:10220000FB213941109A01FCFFFFEF7F089901FC87
:1022100061B4D03D0000601A8A19A33B7370032E8D
:102220008A19A33B0000002E9A837B39C1492025DF
:1022300000007041000000000000000000000000ED
:1022400050304BE2030013E80830A0E10720A0E182
:10225000540C00EB203AA0E1833AA0E1499AA0E1B6
:10226000A33AA0E1096063E044401BE5100056E397
:10227000030084E8620000DA50004BE2030010E83B
:1022800050404BE2030084E960404BE284204FE27F
:102290000C0092E8030094E96F0C00EB50C04BE295
:1022A0000180A0E10070A0E10830A0E10720A0E1DA
:1022B00003009CE93B0C00EB60404BE250204BE2FA
:1022C000030002E8B4204FE20C0092E8030094E916
:1022D000610C00EB50C04BE20C001CE80150A0E187
:1022E0000040A0E103009CE92E0C00EB0830A0E1C7
:1022F0000720A0E12B0C00EB0130A0E10020A0E1C1
:102300000510A0E10400A0E1260C00EB50204BE2F8
:102310000180A0E10070A0E1030012E80830A0E114
:102320000720A0E11F0C00EB203AA0E1833AA0E1D6
:10233000A33AA0E1096063E044301BE5030083E8B1
:1023400050004BE2030010E870204BE2310056E3EE
:10235000030082E82A0000DA60404BE2512F4FE28E
:102360000C0092E8030094E93B0C00EB50C04BE2F8
:102370000180A0E10070A0E10830A0E10720A0E109
:1023800003001CE8070C00EB50204BE260304BE2EE
:10239000030002E8030093E95E2F4FE20C0092E88D
:1023A0002D0C00EB70C04BE20150A0E10040A0E119
:1023B00003009CE850C04BE20C001CE8F90B00EB5A
:1023C0000830A0E10720A0E1F60B00EB0130A0E10E
:1023D0000020A0E10510A0E10400A0E1F10B00EB5A
:1023E00050204BE20180A0E10070A0E1030012E860
:1023F0000830A0E10720A0E1EA0B00EB44301BE528
:10240000030083E844401BE550C04BE20C0094E815
:1024100003001CE8E30B00EB0830A0E10720A0E17B
:10242000E00B00EB0150A0E10040A0E168001BE5DB
:1024300044101BE5000050E3086081E2300086E8AC
:102440005F0000AA030091E8C10E00EB44301BE5D9
:10245000030083E80510A0E10400A0E1BC0E00EB3E
:1024600064401BE5002064E2030086E8550000EAB2
:1024700070321FE5030059E1080000DA0130A0E1E5
:102480000020A0E1C70B00EB44C01BE50020A0E347
:1024900008308CE2030083E803008CE8490000EA7E
:1024A000493AA0E1413E43E260300BE50120A0E162
:1024B0000010A0E160001BE5060040E20240A0E140
:1024C000003A49E060000BE50480A0E10370A0E160
:1024D0000060A0E30810A0E10700A0E1600E00EB9F
:1024E0002F0E00EB40904BE286C189E00150A0E145
:1024F0000040A0E10530A0E10420A0E10810A0E127
:102500000700A0E130008CE8A60B00EBB92F4FE2EA
:102510000C0092E8D00B00EB016086E2010056E36C
:102520000180A0E10070A0E1E9FFFFDA30104BE28A
:102530000350A0E328404BE2800181E8030014E946
:10254000312E4FE20C0092E8790D00EB000050E3D1
:102550000150450208404402F7FFFF0A02C0A0E311
:1025600000C08DE560C31FE560201BE50CC08AE05C
:102570000900A0E10530A0E144101BE504C08DE591
:102580006E0100EB68201BE5000052E364000BE5E0
:102590000B0000AA44301BE5030093E86C0E00EB2F
:1025A00044401BE50300A4E8030094E844400BE525
:1025B000670E00EB64C01BE500206CE2030084E8BA
:1025C000000000EA64201BE50200A0E1F0AF1BE977
:1025D0000DC0A0E1F0DB2DE988229FE584329FE564
:1025E00004B04CE2022000E00150A0E10040A0E174
:1025F00008D04DE2030052E130404BE20030A0E34E
:102600000020A0E30170A0E10060A0E100C0A0E113
:1026100005E0A0E10C0084E90600001A0130A0E109
:102620000020A0E18C0B00EB0730A0E10620A0E128
:10263000440B00EBF0AB1BE9000050E3140000CAB0
:102640000231C0E3053093E1F0AB1B09000050E319
:102650000F0000AA0130A0E10020A0E1510B00EB27
:102660000730A0E10620A0E10150A0E10040A0E178
:102670000710A0E10600A0E14A0B00EB0130A0E149
:102680000020A0E10510A0E10400A0E1750C00EB22
:10269000F0AB1BE94C5AB0E11200001A00005CE3F9
:1026A0000400001AAEC58CE100005CE3155045E261
:1026B0008EEAA0E1FAFFFF0A01061CE30010A0E386
:1026C0000300001A8CC0A0E101061CE3011081E2A6
:1026D000FBFFFF0A052061E0203061E23EC38CE190
:1026E000015082E21EE1A0E1FF34CCE3FF5F45E24E
:1026F0000F36C3E3035045E2010015E301C683E34F
:10270000AE3F8C1003C08C108EE0A0110000A0E33F
:10271000AE3F8CE00090A0E103C08CE0C550A0E18A
:102720008EE0A0E10060A0E10080A0E10246A0E30D
:10273000042080E00C0052E10CC062D0AE3F8CE07F
:10274000040082D0049089D0A440B0E103C08CE0A2
:102750008EE0A0E1F5FFFF1A0241A0E30C0050E17A
:102760000020A0E10030A0130130A003041086E097
:10277000040000BA0E0051E10030A0830130039242
:10278000000053E30900000A000051E30CC062E0BE
:10279000046081E0048088E0010000AA000056E3A4
:1027A000010082A201005EE101C04C320EE061E056
:1027B000AE3F8CE0A440B0E103C08CE08EE0A0E12D
:1027C000E5FFFF1A0EC09CE11800000A8C608FE242
:1027D000C00096E80710A0E10600A0E10730A0E1E4
:1027E0000620A0E1200D00EB000050E30F0000BA2E
:1027F000010078E30480A001019089020B00000A27
:102800000730A0E10620A0E10710A0E10600A0E14A
:10281000EE0C00EB000050E3013008D2038088D0BA
:10282000020000DA020078E301908902028088E267
:10283000C930A0E1FFC583E2A8E0A0E1010019E3EF
:1028400002C68CE202E18E13055A8CE02C500BE597
:1028500028E00BE530204BE2030092E9F0AB1BE9E6
:102860000000F03F000000000000F07F0DC0A0E17C
:10287000F0DB2DE904B04CE20261C0E330C04BE272
:1028800018D04DE2F90556E30150A0E10040A0E167
:1028900003008CE90C000CE80090A0E30080A0E3AA
:1028A000050000AA6E0D00EB000050E30200001AC4
:1028B0008E0F8FE2030090E8F0AB1BE930104BE283
:1028C0000C0091E90310A0E10200A0E1E20A00EB94
:1028D000222E8FE20C0092E80150A0E10040A0E11E
:1028E000DD0A00EB852F8FE20C0092E8950A00EBE1
:1028F0000130A0E10020A0E10510A0E10400A0E16A
:10290000D50A00EB7F2F8FE20C0092E88D0A00EBD6
:102910000130A0E10020A0E10510A0E10400A0E149
:10292000CD0A00EB792F8FE20C0092E8850A00EBCC
:102930000130A0E10020A0E10510A0E10400A0E129
:10294000C50A00EB732F8FE20C0092E87D0A00EBC2
:102950000130A0E10020A0E10510A0E10400A0E109
:10296000BD0A00EB6D2F8FE20C0092E8750A00EBB8
:102970000130A0E10020A0E10510A0E10400A0E1E9
:10298000B50A00EB40304BE2030083E9A4319FE538
:10299000030056E1220000CA622F8FE20C0092E889
:1029A0000510A0E10400A0E1AB0A00EB40C04BE23F
:1029B0000C009CE90170A0E10060A0E10510A0E11D
:1029C0000400A0E1A40A00EB30C04BE230304BE23F
:1029D0000150A0E10040A0E1030093E90C001CE8D5
:1029E0009D0A00EB0130A0E10020A0E10510A0E16C
:1029F0000400A0E16B0A00EB0130A0E10020A0E19F
:102A00000710A0E10600A0E1660A00EB0130A0E19A
:102A10000020A0E1D4008FE2030090E8610A00EBFF
:102A2000F0AB1BE910319FE5030056E1028646D268
:102A30000090A0D3F4808FC2000398C8E4208FE2F6
:102A40000C0092E80510A0E10400A0E1820A00EB6E
:102A50000930A0E10820A0E1520A00EB0930A0E112
:102A60000820A0E10170A0E10060A0E17C008FE2FD
:102A7000030090E84B0A00EB40C04BE20C009CE9DD
:102A80000190A0E10080A0E10510A0E10400A0E118
:102A9000710A00EB30C04BE230304BE20150A0E154
:102AA0000040A0E1030093E90C001CE86A0A00EB77
:102AB0000130A0E10020A0E10510A0E10400A0E1A8
:102AC000380A00EB0130A0E10020A0E10710A0E1EE
:102AD0000600A0E1330A00EB0130A0E10020A0E1F4
:102AE0000910A0E10800A0E12E0A00EBF0AB1BE901
:102AF0000000F03F00000000E9FAA8BDD43888BE0D
:102B00009EEE213EC4B1B4BD4F7E92BEAD529C80BC
:102B1000A001FA3E9015CB196CC156BF7751C11672
:102B20005555A53F4C5555550000E03F00000000AD
:102B30000000D23F000000003233D33F0000E93FE5
:102B40000DC0A0E1F0DF2DE904B04CE2B4C39FE575
:102B500003E042E29E4CCCE0CEEFA0E14CC16EE03F
:102B600097DF4DE2A0A39FE56CC20BE59CC39FE5F8
:102B700004E09BE5013043E20AA08FE06C421BE5D4
:102B800068320BE50CC08AE00EC19CE768E21BE5E9
:102B9000000054E30040A0B3843084E00C608EE079
:102BA0000090A0E3832142E0060059E16C420BE56E
:102BB00070C20BE55C020BE560120BE5188042E287
:102BC00004406EE00E0000CA463F4BE2000054E3B2
:102BD000895183E0030000BA08109BE5040191E7E6
:102BE0006F0C00EB010000EAC90F8FE2030090E8D0
:102BF000019089E2060059E1030085E8014084E282
:102C0000F0FFFFDA70221BE50090A0E3020059E11B
:102C1000240000CA68321BE50040A0E32F1E8FE2AB
:102C2000060091E8030054E10A3D4BE2060083E808
:102C3000130000CA5C521BE568C21BE509208CE04A
:102C4000022064E0463F4BE2823183E00C0093E8CF
:102C50000300B5E8000A00EB0AED4BE20130A0E109
:102C60000020A0E103009EE8B60900EB68321BE5F6
:102C7000014084E20A2D4BE2030054E1030082E8A4
:102C8000ECFFFFDA963F4BE270421BE50A2D4BE268
:102C9000893183E0060092E8019089E2040059E15D
:102CA000060083E8DAFFFFDA70321BE564320BE5D9
:102CB00064421BE5969F4BE2843189E0000054E3B7
:102CC000C00093E81F0000DA28504BE2962F8FE2F5
:102CD0000C0092E80710A0E10600A0E1DE0900EB7D
:102CE0005F0C00EB2E0C00EB0ACD4BE203008CE8EE
:102CF000892F8FE20C0092E8D70900EB0130A0E1A8
:102D00000020A0E10710A0E10600A0E1A50900EB6A
:102D1000530C00EB843189E000C0A0E10AED4BE2E6
:102D2000030013E950C005E50C009EE8850900EB9F
:102D3000014044E2000054E30170A0E10060A0E122
:102D4000045085E2E0FFFFCA0710A0E10600A0E101
:102D50000820A0E1AD0400EB192E8FE20C0092E8F0
:102D60000170A0E10060A0E1BB0900EB3D0400EBB5
:102D7000062D8FE20C0092E8B70900EB0130A0E1CC
:102D80000020A0E10710A0E10600A0E1850900EB0A
:102D90000170A0E10060A0E1310C00EB74020BE5D2
:102DA000FF0B00EB0130A0E10020A0E10710A0E143
:102DB0000600A0E17B0900EB000058E30170A0E1F0
:102DC0000060A0E10010A0E378120BE50E0000DA2D
:102DD00064321BE528204BE2031182E0542011E508
:102DE000183068E25293A0E174421BE5192342E0D7
:102DF000173068E25233A0E1094084E078320BE5F5
:102E000074420BE5542001E5100000EA0600001AA8
:102E100064E21BE528C04BE20E318CE0543013E530
:102E2000C33BA0E178320BE5080000EACC208FE23A
:102E30000C0092E80710A0E10600A0E18A0B00EB6D
:102E4000000050E3580000BA0210A0E378120BE52E
:102E500078221BE5000052E3530000DA74421BE5C0
:102E600064321BE50090A0E3014084E2030059E1D5
:102E70000950A0E174420BE50E0000AA28204BE2A5
:102E80000390A0E1000055E3504012E5FF34E01349
:102E9000033064100300001A000054E3013464128C
:102EA0000150A0130000000A503002E5019059E2E1
:102EB000042082E2F2FFFF1A000058E3230000DA48
:102EC000010058E30200000A020058E31800000A5B
:102ED0001E0000EA64E21BE528C04BE20E218CE0F4
:102EE000543012E5FF34C3E30235C3E3160000EAB1
:102EF0000000C03F00000000000020400000000073
:102F00000000E03F00000000ABAAAA2AF4D6FE03AE
:102F1000289B01FC00000000000000000000704140
:102F2000000000000000F03F000000000000703EC4
:102F30000000000064321BE528104BE2032181E011
:102F4000543012E5FF34C3E30335C3E3543002E5E4
:102F500078421BE5020054E31300001A0730A0E199
:102F60000620A0E148004FE2030090E80D0900EBC5
:102F7000000055E30170A0E10060A0E10A00000A32
:102F80000820A0E168004FE2030090E81F0400EB76
:102F90000130A0E10020A0E10710A0E10600A0E1BF
:102FA000000900EB0170A0E10060A0E1A0204FE269
:102FB0000C0092E80710A0E10600A0E1DC0A00EB9B
:102FC000000050E35300001A64C21BE570E21BE5E9
:102FD00001904CE20E0059E10040A0E10A0000BA65
:102FE00028104BE2092181E070C21BE5503012E548
:102FF000019049E20C0059E1034084E1042042E2DF
:10300000F8FFFFAA000054E34200001A70121BE50B
:1030100028E04BE201318EE0543013E5000053E329
:103020000170A0E30700001A28204BE2013182E082
:10303000042043E2042042E2503012E5000053E352
:10304000017087E2FAFFFF0A64321BE5074083E064
:10305000019083E2040059E184420BE52A0000CA92
:103060006CC21BE508E09BE568121BE509308CE0AB
:10307000092081E003019EE7463F4BE2824183E065
:10308000470B00EB68221BE5030084E8000052E3D5
:10309000611F4FE2060091E80A3D4BE2060083E81B
:1030A000100000BA68C21BE55C521BE50460A0E199
:1030B00001408CE20C0096E80300B5E8E60800EB5E
:1030C0000AED4BE20130A0E10020A0E103009EE800
:1030D0009C0800EB0A2D4BE2014054E2030082E819
:1030E000086046E2F2FFFF1A963F4BE284421BE57E
:1030F0000A2D4BE2893183E0060092E8019089E2D3
:10310000040059E1060083E8D4FFFFDA64321BE5CE
:10311000073083E0E4FEFFEA832F4FE20C0092E8E1
:103120000710A0E10600A0E1810A00EB000050E3D7
:103130001100001A64421BE528C04BE2014044E242
:1031400004218CE0503012E5000053E364420BE5AB
:10315000188048E23D00001A042042E264E21BE5C8
:10316000503012E501E04EE2000053E364E20BE56B
:10317000188048E2F7FFFF0A340000EA002068E206
:103180000710A0E10600A0E1A00300EB9E2F4FE294
:103190000C0092E80170A0E10060A0E1B20A00EB2F
:1031A00064121BE5000050E30141A0E1210000BAD8
:1031B000A32F4FE20C0092E80710A0E10600A0E167
:1031C000A50800EB260B00EBF50A00EB0A2D4BE2FD
:1031D000030082E80B2D4FE20C0092E89E0800EB02
:1031E0000130A0E10020A0E10710A0E10600A0E16D
:1031F0006C0800EB1A0B00EB28E04BE264C21BE505
:103200000E3084E00020A0E10A4D4BE2030094E878
:1032100001C08CE2502003E564C20BE5100B00EB0B
:1032200064121BE528E04BE201318EE0188088E251
:10323000500003E5050000EA28204BE20710A0E15A
:103240000600A0E1024084E0050B00EB500004E51D
:10325000CD0F4FE2030090E80820A0E16B0300EBE4
:1032600064921BE50A3D4BE2000059E3030083E84A
:10327000430000BA28404BE2093184E0500013E5D6
:10328000C70A00EB0ACD4BE20130A0E10020A0E12B
:1032900003009CE8700800EB966F4BE2896186E0C2
:1032A0000150A0E10040A0E10AED4BE2E22F4FE225
:1032B0000C0092E803009EE8300086E8660800EB08
:1032C0000A2D4BE2019059E2030082E8E8FFFF5A21
:1032D00064921BE5000059E3290000BA0040A0E316
:1032E00070321BE50070A0E37B1F8FE2060091E8BF
:1032F000030057E10A3D4BE2060083E8180000CACC
:10330000040057E10450A0E1150000CA073089E02D
:10331000962F4BE2832182E0B8319FE503308AE0AB
:10332000873183E0030093E80C0092E84A0800EB41
:103330000ACD4BE20130A0E10020A0E103009CE8AF
:10334000000800EB0AED4BE203008EE870121BE56B
:10335000017087E2010057E1010000CA050057E152
:10336000E9FFFFDA0A2D4BE26E3F4BE2060092E8DE
:10337000843183E0019059E2060083E8014084E251
:10338000D6FFFF5A04309BE5030053E303F18F900F
:10339000BE0000EA020000EA190000EA180000EA94
:1033A0004F0000EA64921BE54B1F8FE2060091E894
:1033B0000A3D4BE2000059E3060083E8090000BA29
:1033C0006E3F4BE2893183E00A4D4BE2030094E803
:1033D0000C0093E8DB0700EB0ACD4BE2019059E2C9
:1033E00003008CE8F5FFFF5A78E21BE50A2D4BE25B
:1033F00000005EE3030092E8D50A001B60421BE573
:10340000320000EA64921BE5CC108FE2060091E8DE
:103410000A3D4BE2000059E3060083E8090000BAC8
:103420006E3F4BE2893183E00A4D4BE2030094E8A2
:103430000C0093E8C30700EB0ACD4BE2019059E280
:1034400003008CE8F5FFFF5A78E21BE50A2D4BE2FA
:1034500000005EE3030092E8BD0A001B60421BE52A
:10346000030084E86E3F4BE20ACD4BE2030093E891
:103470000C009CE8CB0700EB0AED4BE203008EE862
:1034800064121BE5000051E3090000DA0190A0E19D
:103490001B4E4BE20ACD4BE203009CE80C00B4E863
:1034A000A80700EB0AED4BE2019059E203008EE819
:1034B000F7FFFF1A78121BE560221BE5000051E3BD
:1034C0000A3D4BE2084082E2030093E8A00A001B99
:1034D000030084E86D0000EA389B01FC0000000056
:1034E0000000000064921BE5000059E31B0000DAB5
:1034F0006E6F4BE2896186E0300016E9800196E844
:103500000510A0E10400A0E10830A0E10720A0E13F
:103510008C0700EB0AED4BE203008EE80510A0E1FA
:103520000400A0E10A4D4BE20C0094E89D0700EB7B
:103530000130A0E10020A0E10810A0E10700A0E117
:10354000800700EB0A3D4BE2019049E20C0093E852
:10355000000059E30C0006E9030086E8E3FFFFCA18
:1035600064921BE5010059E31B0000DA6E6F4BE229
:10357000896186E0300016E9800196E80510A0E137
:103580000400A0E10830A0E10720A0E16D0700EBF6
:103590000ACD4BE203008CE80AED4BE20C009EE8FA
:1035A0000510A0E10400A0E17E0700EB0130A0E1DE
:1035B0000020A0E10810A0E10700A0E1610700EBF6
:1035C0000A3D4BE2019049E20C0093E8010059E307
:1035D0000C0006E9030086E8E3FFFFCA64921BE5DE
:1035E000431F4FE2060091E80A3D4BE2010059E318
:1035F000060083E80A0000DA6E3F4BE2893183E07F
:103600000A4D4BE2030094E80C0093E84D0700EBF1
:10361000019049E20ACD4BE2010059E303008CE836
:10362000F4FFFFCA78E21BE560121BE500005EE3D1
:103630006E0F4BE2084081E21B6E4BE2105081E2BC
:103640000700001A0C0090E80C0081E8060096E8DC
:103650000A3D4BE2060084E80C0093E80C0085E884
:103660000A0000EA030090E8390A00EB60C21BE59B
:1036700003008CE8030096E8350A00EB0AED4BE204
:10368000030084E803009EE8310A00EB030085E8AC
:1036900074121BE5070001E2F0AF1BE90DC0A0E1C9
:1036A000F0DB2DE904B04CE20150A0E10040A0E1C4
:1036B0000241C0E330C04BE218D04DE2F90554E3BB
:1036C00003008CE90C000CE8050000AAE40900EBFB
:1036D000000050E30200001A30304BE2030093E98F
:1036E000F0AB1BE930C04BE203009CE90130A0E1E4
:1036F0000020A0E1580700EB30C04BE20C009CE931
:103700000170A0E10060A0E1530700EB40304BE204
:10371000030083E9612F8FE20C0092E80710A0E11B
:103720000600A0E14C0700EB5E2F8FE20C0092E850
:10373000040700EB0130A0E10020A0E10710A0E1A8
:103740000600A0E1440700EB162E8FE20C0092E881
:10375000FC0600EB0130A0E10020A0E10710A0E191
:103760000600A0E13C0700EB522F8FE20C0092E82C
:10377000F40600EB0130A0E10020A0E10710A0E179
:103780000600A0E1340700EB132E8FE20C0092E854
:10379000EC0600EB04309BE5000053E30190A0E150
:1037A0000080A0E11200001A0130A0E10020A0E199
:1037B0000710A0E10600A0E1270700EB412F8FE2F0
:1037C0000C0092E8DF0600EB40C04BE20130A0E1C4
:1037D0000020A0E103009CE91F0700EB30C04BE292
:1037E0000130A0E10020A0E103009CE9D50600EB38
:1037F000F0AB1BE930C04BE203001CE8CC208FE2A9
:103800000C0092E8140700EB40304BE20150A0E1BD
:103810000040A0E1030093E90930A0E10820A0E105
:103820000D0700EB0130A0E10020A0E10510A0E1B0
:103830000400A0E1DB0600EB0130A0E10020A0E1E4
:103840000710A0E10600A0E1030700EB30C04BE247
:103850000C001CE8D30600EB40304BE20150A0E125
:103860000040A0E1030093E958208FE20C0092E8A9
:10387000F90600EB0130A0E10020A0E10510A0E175
:103880000400A0E1C70600EB30C04BE20130A0E12C
:103890000020A0E103009CE9C20600EBF0AB1BE9AD
:1038A0003AD9E53D7CD5CF5AE6E55ABEEB9C2B8A4A
:1038B000E31DC73E7DFEB157A0012ABFD561C119E6
:1038C0001111813FA6F810115555C5BF49555555E1
:1038D0000000E03F000000000DC0A0E1F0DF2DE996
:1038E000BC349FE5BCA49FE50241C0E304B04CE2B8
:1038F00008D04DE2030054E10190A0E10080A0E176
:103900002C000BE50AA08FE0180000DA98349FE540
:10391000030054E10140A0E10030A0E1060000CA2C
:103920000030A0130130A003000054E30030A003D6
:1039300001300312000053E30300000A0930A0E144
:103940000820A0E17F0600EBF0AF1BE92C101BE57F
:10395000000051E3020000DAED0F8FE2030090E86F
:10396000F0AF1BE93B0E8FE2030090E8F0AF1BE9DC
:1039700038349FE5030054E10F0000CA30349FE55E
:10398000030054E10A0000CAE52F8FE20C0092E820
:103990006C0600EB392E8FE20C0092E88B0800EBEE
:1039A000000050E3020000DA0910A0E10800A0E1E5
:1039B000F0AF1BE90030E0E3510000EA200100EB2A
:1039C000F0339FE5030054E10190A0E10080A0E105
:1039D000290000CAE0339FE5030054E1150000CA46
:1039E0000130A0E10020A0E1560600EBCE2F8FE2CF
:1039F0000C0092E86B0600EBCD2F8FE20C0092E8F2
:103A00000150A0E10040A0E10910A0E10800A0E100
:103A10004C0600EB0130A0E10020A0E10510A0E180
:103A20000400A0E18F0700EB0190A0E10080A0E17D
:103A30000010A0E3280000EABB2F8FE20C0092E800
:103A4000580600EB2E2E8FE20C0092E80150A0E108
:103A50000040A0E10910A0E10800A0E1390600EB58
:103A60000130A0E10020A0E10510A0E10400A0E1E8
:103A70007C0700EB0130A0E31F0000EA3C339FE528
:103A8000030054E1160000CAAB2F8FE20C0092E84D
:103A9000440600EB2A2E8FE20C0092E80150A0E1D0
:103AA0000040A0E10910A0E10800A0E16A0600EBD7
:103AB0009D2F8FE20C0092E8220600EB0130A0E17E
:103AC0000020A0E10510A0E10400A0E1650700EBE3
:103AD0000190A0E10080A0E10210A0E330100BE50E
:103AE000080000EA0930A0E10820A0E1250E8FE2DD
:103AF000030090E85B0700EB0330A0E30190A0E136
:103B00000080A0E130300BE50930A0E10820A0E101
:103B10000910A0E10800A0E14F0600EB0130A0E190
:103B20000020A0E10170A0E10060A0E14A0600EBE6
:103B3000852F8FE20C0092E80150A0E10040A0E147
:103B4000450600EB0130A0E10020A0E1020C8FE26D
:103B5000030090E8FB0500EB0130A0E10020A0E1AC
:103B60000510A0E10400A0E13B0600EB0130A0E15C
:103B70000020A0E11E0E8FE2030090E8F10500EBAB
:103B80000130A0E10020A0E10510A0E10400A0E1C7
:103B9000310600EB0130A0E10020A0E1070D8FE22B
:103BA000030090E8E70500EB0130A0E10020A0E170
:103BB0000510A0E10400A0E1270600EB0130A0E120
:103BC0000020A0E11A0E8FE2030090E8DD0500EB73
:103BD0000130A0E10020A0E10510A0E10400A0E177
:103BE0001D0600EB0130A0E10020A0E1060D8FE2F0
:103BF000030090E8D30500EB0130A0E10020A0E134
:103C00000710A0E10600A0E1130600EB5A2F8FE297
:103C10000C0092E80170A0E10060A0E10510A0E1B5
:103C20000400A0E10C0600EB0130A0E10020A0E1BF
:103C3000530F8FE2030090E8C20500EB0130A0E1D2
:103C40000020A0E10510A0E10400A0E1020600EBC5
:103C50000130A0E10020A0E14B0F8FE2030090E8CB
:103C6000B80500EB0130A0E10020A0E10510A0E1C3
:103C70000400A0E1F80500EB0130A0E10020A0E184
:103C8000430F8FE2030090E8AE0500EB0130A0E1A6
:103C90000020A0E10510A0E10400A0E1EE0500EB8A
:103CA0000130A0E10020A0E1EC008FE2030090E8E9
:103CB000A40500EB0130A0E10020A0E10510A0E187
:103CC0000400A0E1E40500EB0130A0E10020A0E148
:103CD00030101BE5000051E33B0000AA0710A0E1F3
:103CE0000600A0E1970500EB0130A0E10020A0E173
:103CF0000910A0E10800A0E1D70500EB0130A0E128
:103D00000020A0E10910A0E10800A0E1A50500EB5A
:103D1000F0AF1BE9FB21F93F182D4454FB21F9BFFB
:103D2000182D44543CE4377E9C7500880000F03F19
:103D30000000000000000040000000000000F83F0C
:103D4000000000000000F0BF000000003AAD903F0E
:103D500011DA22E34B7BA93FEB0D7624660DB13FD0
:103D6000513DD0A0CD45B73F6E204CC52449C23F40
:103D7000FF8300925555D53F0D55555544B4A2BF0C
:103D80002F6C6A2C2DDEADBF9AFDDE52F2B0B3BFB0
:103D90006D9A74AFC671BCBF711623FE9999C9BFE5
:103DA000C4EB9899FFFF0F4468C9FE030000F07F41
:103DB000FFFFDB3FFFFF1F3EFFFFF23FFFFFE53F3F
:103DC000FF7F0340D09B01FCF09B01FC30101BE502
:103DD00014C01FE58141A0E10710A0E10600A0E1A9
:103DE0000C508AE0570500EB0130A0E10020A0E173
:103DF0000910A0E10800A0E1970500EB3C301FE5A9
:103E000003308AE0055084E0034084E00C0094E82D
:103E1000640500EB0930A0E10820A0E1610500EB9A
:103E20000130A0E10020A0E1030095E85D0500EB72
:103E30002C301BE5000053E3F0AF1BA9440800EB56
:103E4000F0AF1BE910402DE90140A0E10030A0E1F6
:103E50000120A0E10010A0E10231C1E30410A0E1C3
:103E60000300A0E11080BDE80DC0A0E1F0DB2DE96A
:103E7000403AA0E1833AA0E1A33AA0E1FF9F43E2E8
:103E800004B04CE2039049E208D04DE20150A0E1B9
:103E90000040A0E10030A0E30020A0E330C04BE2EE
:103EA000130059E30180A0E10070A0E10060A0E1EF
:103EB0000540A0E10C008CE9250000CA000059E390
:103EC000100000AA4B2F8FE20C0092E81D0500EBBA
:103ED0004A2F8FE20C0092E83C0700EB000050E311
:103EE0003F0000DA000057E30040A0A30460A0A157
:103EF0003B0000AA0231C7E3053093E104619F153E
:103F00001100001A360000EAFC309FE55359A0E189
:103F1000053000E0043093E11A00000AD4208FE25B
:103F20000C0092E8070500EBD0208FE20C0092E82D
:103F3000260700EB000050E3290000DA000057E3F9
:103F40000136A0B3536987B00560C6E10040A0E325
:103F5000230000EA330059E3050000DA010B59E3BE
:103F60000800001A0130A0E10020A0E1F50400EBF8
:103F7000F0AB1BE9142049E20030E0E33352A0E14A
:103F8000050014E10200001A0810A0E10700A0E1FA
:103F9000F0AB1BE95C208FE20C0092E8E90400EB37
:103FA00058208FE20C0092E8080700EB000050E375
:103FB0000B0000DA000057E3080000AA140059E3E0
:103FC000016087020500000A0130A0E3342069E2A5
:103FD000132284E0040052E1036087300240A0E134
:103FE0000540C4E12C600BE528400BE530204BE296
:103FF000030092E9F0AB1BE93CE4377E9C75008836
:1040000000000000000000000000F0BFFFFF0F00F4
:1040100088319FE50DC0A0E1033000E0F0D92DE923
:1040200004B04CE243CAA0E10150A0E10040A0E18D
:1040300000005CE30170A0E10060A0E100E0A0E10D
:104040000280A0E10540A0E11100001A0231C0E3A6
:10405000034094E1F0A91B09122E8FE20C0092E8B4
:10406000FD0400EB34219FE50140A0E10030A0E118
:104070002C319FE5022000E0422AA0E1030058E134
:104080000170A0E10060A0E100E0A0E136C042E2E2
:10409000290000BA0C319FE503005CE10500001A1D
:1040A0000710A0E10600A0E10730A0E10620A0E192
:1040B000A40400EBF0A91BE9EC309FE508C08CE0FC
:1040C00003005CE1080000DA0730A0E10620A0E16F
:1040D000B0008FE2030090E8350000EBA4208FE2EF
:1040E0000C0092E8DC0400EBF0A91BE900005CE3A3
:1040F000070000DA7F24CEE30F26C2E30740A0E1E9
:104100000630A0E10C3A82E10410A0E10300A0E136
:10411000F0A91BE936007CE30A0000CA8C309FE559
:10412000030058E1E7FFFFCA60008FE2030090E858
:104130000730A0E10620A0E11D0000EB4C208FE23B
:104140000C0092E8E6FFFFEA7F24CEE336C08CE263
:104150000F26C2E30740A0E10630A0E10C3A82E15D
:104160000470A0E10360A0E10710A0E10600A0E157
:1041700020208FE20C0092E8B70400EBF0A91BE9C5
:1041800000005043000000003CE4377E9C7500882E
:104190001F6EA50159F3F8C20000903C000000001A
:1041A0000000F07FB03CFFFFFF070000FE070000AB
:1041B00050C30000F0412DE90180A0E10070A0E1B2
:1041C0000360A0E10250A0E10120A0E10010A0E105
:1041D0000211C1E3025105E20840A0E10730A0E16D
:1041E000053081E10480A0E10370A0E10810A0E1A6
:1041F0000700A0E1F081BDE8000051E31F00000AC4
:104200000130A0E30020A0E3010050E11900003AD2
:10421000010251E3000051310112A0310332A031FB
:10422000FAFFFF3A020151E3000051318110A03141
:104230008330A031FAFFFF3A010050E10100402035
:1042400003208221A10050E1A1004020A32082216F
:10425000210150E12101402023218221A10150E1CF
:10426000A1014020A3218221000050E32332B0119C
:104270002112A011EFFFFF1A0200A0E10EF0A0E151
:1042800004E02DE55D0000EB0000A0E30080BDE848
:1042900001C020E00130A0E30020A0E3000051E3D2
:1042A000001061422100000A000050E3000060425B
:1042B000010050E11900003A010251E300005131C0
:1042C0000112A0310332A031FAFFFF3A020151E39B
:1042D000000051318110A0318330A031FAFFFF3A44
:1042E000010050E10100402003208221A10050E1A3
:1042F000A1004020A3208221210150E12101402082
:1043000023218221A10150E1A1014020A32182218A
:10431000000050E32332B0112112A011EFFFFF1A69
:104320000200A0E100005CE3000060420EF0A0E1AA
:1043300004E02DE5310000EB0000A0E30080BDE8C3
:10434000000051E32900000A010051E3010050116F
:104350000000A0030EF0A0310130A0E3010251E300
:10436000000051310112A0310332A031FAFFFF3AAF
:10437000020151E3000051318110A0318330A0319E
:10438000FAFFFF3A0020A0E3010050E101004020C5
:10439000A10050E1A1004020E3208221210150E151
:1043A0002101402063218221A10150E1A10140208F
:1043B000E321822103C0A0E1000050E32332B011C9
:1043C0002112A011EEFFFF1A0E2212E207001C13A9
:1043D0000500000AEC0112E1A10180106C0112E15C
:1043E00021018010EC0012E1A10080100EF0A0E18C
:1043F00004E02DE5010000EB0000A0E30080BDE833
:104400000EF0A0E10DC0A0E1F0DF2DE904B04CE218
:104410000050A0E30040A0E324D04DE230C04BE2C6
:10442000000051E330000CE80040A0E32C400BE515
:10443000480100BA000053E3400100BA004053E2D3
:104440000180A0E10260A0E10090A0E1CE00001A8E
:10445000010052E14A00009A010852E30210A0E173
:104460004300002AFF0052E30800A0830000A0934D
:10447000F4249FE53110A0E10130D2E7003083E061
:10448000202073E2203062123933A0111662A0118D
:10449000188283112678A0E10800A0E10710A0E1AE
:1044A0001992A011A5FFFFEB0710A0E10040A0E1C9
:1044B0000800A0E14FFFFFEB0688A0E12888A0E1FB
:1044C000980002E02938A0E1044883E1020054E1A9
:1044D00000A0A0E10500002A064094E001A040E20F
:1044E0000200002A020054E101A04A320640843052
:1044F000044062E00710A0E10400A0E18FFFFFEBA1
:104500000710A0E10050A0E10400A0E139FFFFEB9B
:10451000980002E00938A0E12338A0E1055883E1C2
:10452000020055E10400002A065095E0010040E237
:104530000100002A020055E1010040320AC880E172
:104540000030A0E338300BE538401BE52C301BE58C
:1045500034C00BE530400BE530504BE2000053E334
:10456000030015E8F0AF1B09000070E20010E1E263
:10457000F0AF1BE9010452E31800A0231000A033A0
:10458000BAFFFFEA000052E30300001A0210A0E1A4
:104590000100A0E317FFFFEB0060A0E1010856E374
:1045A0007500002AFF0056E30800A0830000A093D6
:1045B000B4239FE53610A0E10130D2E7003083E05C
:1045C000202073E23000001A0648A0E10150A0E369
:1045D0002448A0E1088066E026A8A0E138500BE559
:1045E0004C400BE50A10A0E10800A0E153FFFFEBEF
:1045F0000A10A0E10040A0E10800A0E1FDFEFFEBF1
:104600004C201BE5900202E02938A0E1044883E138
:10461000020054E10070A0E10500002A064094E089
:10462000017040E20200002A020054E101704732AA
:1046300006408430044062E00A10A0E10400A0E1DA
:104640003EFFFFEB0A10A0E10050A0E10400A0E152
:10465000E8FEFFEB4C201BE5900202E00938A0E1E8
:104660002338A0E1055883E1020055E10400002A47
:10467000065095E0010040E20100002A020055E1E9
:104680000100403207C880E1AEFFFFEA201062E27D
:104690001662A0E13871A0E126A8A0E13931A0E1BD
:1046A00006C8A0E10700A0E10A10A0E1188283E19A
:1046B0001992A0E14CC00BE520FFFFEB0A10A0E12E
:1046C0000040A0E10700A0E1CAFEFFEB4C301BE573
:1046D0002338A0E10320A0E1900202E04C300BE57A
:1046E0002838A0E1044883E14C501BE5020054E166
:1046F0000070A0E13CA00BE540500BE50500002A4E
:10470000064094E0017040E20200002A020054E1F9
:104710000170473206408430044062E03C101BE5E3
:104720000400A0E105FFFFEB3C101BE50050A0E1F9
:104730000400A0E1AFFEFFEB40201BE5900202E089
:104740000838A0E12338A0E1055883E1020055E1D3
:104750000500002A065095E0010040E20200002A10
:10476000020055E10100403206508530077880E1B3
:1047700038700BE5058062E099FFFFEA010456E31B
:104780001800A0231000A03388FFFFEA010054E1C5
:1047900000C0A08338C00B856AFFFF8A010854E37C
:1047A0006200002AFF0054E30800A0830000A093E9
:1047B000B4219FE53410A0E10130D2E7003083E05E
:1047C000202073E20400001A040058E10600599109
:1047D00001C0A02302C0A03158FFFFEA201062E20E
:1047E0003631A0E1144283E13871A0E124A8A0E1B0
:1047F0003931A0E10458A0E10A10A0E10700A0E1CE
:10480000188283E11992A0E11662A0E144500BE501
:10481000CAFEFFEB0A10A0E10050A0E10700A0E1F2
:1048200074FEFFEB44C01BE50020A0E12CC8A0E112
:104830009C0202E02838A0E1055883E1020055E11E
:1048400048000BE544C00BE50700002A013040E2B8
:10485000045095E048300BE50300002A020055E1C2
:104860000130433248300B3504508530055062E04A
:104870000A10A0E10500A0E1B0FEFFEB0A10A0E1E4
:104880000070A0E10500A0E15AFEFFEB44201BE50B
:10489000900202E00838A0E12338A0E1077883E124
:1048A000020057E10500002A047097E0010040E291
:1048B0000200002A020057E10470873001004032F4
:1048C00048401BE5077062E004C880E12C08A0E1C5
:1048D0002638A0E10018CCE10328C6E191020EE0E1
:1048E000900202E0930101E0900303E0011092E0E6
:1048F0000138832201E89EE02138A3E0070053E15C
:104900000600008A0030A0130130A00309005EE118
:104910000030A09301300382000053E30000000A3E
:1049200001C04CE20050A0E338500BE505FFFFEA60
:10493000010454E31800A0231000A0339BFFFFEAFA
:104940002CC01BE50CC0E0E12CC00BE5002072E29E
:104950000030E3E2B8FEFFEA0050E0E32C500BE544
:10496000000070E20010E1E2B1FEFFEA389F0100B2
:104970000DC0A0E170D82DE904B04CE20150A0E1D7
:104980000260A0E10040A0E1AF0000EB000050E3B6
:104990000100000A0400A0E170A81BE90500A0E1E5
:1049A000A90000EB000050E30100000A0500A0E1AF
:1049B00070A81BE90400A0E1A80000EB000050E390
:1049C0000900000A0500A0E1A40000EB000050E38C
:1049D000EFFFFF0A042095E5043094E5020053E15F
:1049E000EBFFFF0A70681BE9940000EA0500A0E1F4
:1049F0009A0000EB000050E3EBFFFF1A0500A0E176
:104A00009B0000EB000050E30B00000A0400A0E153
:104A1000970000EB000050E3DDFFFF0A0F0094E871
:104A20000F0086E8043094E5042095E50600A0E137
:104A3000023003E0043086E570A81BE90400A0E121
:104A40008B0000EB000050E3D7FFFF1A08C094E58D
:104A5000081095E50C3061E0000053E3003063B2CC
:104A60001F0053E30C2094E50CE095E53F0000CADD
:104A700001005CE1050000DA0C1061E001300EE29B
:104A8000011051E2AEE083E1FBFFFF1A0C10A0E140
:104A90000C0051E1050000DA01C06CE0013002E2D7
:104AA00001C05CE2A22083E101C0A001FAFFFF1A6D
:104AB000040094E5043095E5030050E12500000A68
:104AC000000050E30E20621002206E00000052E34E
:104AD000002062B20C2086E50C0096E50030A0A311
:104AE0000130A0B3043086E5013040E20B0173E3EE
:104AF00008C086E50030A0E10900008A081096E5AC
:104B00008320A0E1013042E20B0173E3011041E296
:104B10000230A0E10200A081081086850C20868565
:104B2000F6FFFF9A0330A0E3000050E3003086E573
:104B3000010000BA0600A0E170A81BE9082096E574
:104B4000013000E2A03083E1012082E20C3086E5F2
:104B5000082086E5F6FFFFEA0E3082E008C086E511
:104B60000C3086E5040086E50300A0E1ECFFFFEAD7
:104B700001005CE100E0A0C101C0A0D10020A0D1F3
:104B8000CAFFFFEA0DC0A0E130D82DE904B04CE225
:104B900038D04DE224504BE20030A0E10120A0E1EA
:104BA00048004BE20510A0E134404BE248300BE5F1
:104BB0004C200BE5990500EB4C004BE20410A0E102
:104BC000960500EB0410A0E144204BE20500A0E1B3
:104BD00066FFFFEB330500EB30A81BE90DC0A0E139
:104BE00030D82DE904B04CE238D04DE224504BE2ED
:104BF0000030A0E10120A0E148004BE20510A0E157
:104C000034404BE248300BE54C200BE5830500EBCC
:104C10004C004BE20410A0E1800500EB30301BE5B6
:104C20000410A0E1013023E244204BE20500A0E1A2
:104C300030300BE54DFFFFEB1A0500EB30A81BE908
:104C400000009FE50EF0A0E1149F0100000090E538
:104C5000010050E30000A0830100A0930EF0A0E14A
:104C6000000090E5040050E30000A0130100A00341
:104C70000EF0A0E1000090E5020050E30000A01358
:104C80000100A0030EF0A0E10DC0A0E170D82DE955
:104C900004B04CE228D04DE228504BE20030A0E1B5
:104CA0000120A0E13C004BE20510A0E138404BE2BE
:104CB0003C300BE540200BE5580500EB40004BE293
:104CC0000410A0E1550500EB0500A0E1490000EB50
:104CD000000050E30200000A0500A0E1F10400EB2F
:104CE00070A81BE90400A0E1420000EB000050E3C3
:104CF0000400A011F8FFFF1A24301BE534201BE547
:104D00000500A0E1023023E024300BE53E0000EB7B
:104D1000000050E30500000A28201BE538301BE5A1
:104D2000030052E1EBFFFF1A2F0000EBEAFFFFEA5E
:104D30000500A0E1390000EB000050E30060A0E1B5
:104D4000F4FFFF1A0400A0E12F0000EB000050E385
:104D50000500A01120600B151C600B15DEFFFF1A6B
:104D60000400A0E12D0000EB000050E30430A0138C
:104D70000500A01128300B15D7FFFF1A30301BE5B6
:104D800020201BE51C101BE52CC01BE5022063E066
:104D90000C0051E10130423220200BE58110A0319E
:104DA00020300B350131A0E30C0051E101106C20E3
:104DB00003008021A330B0E18110A0E1F9FFFF1AC8
:104DC0007F3000E2400053E30100000A0C0085E55B
:104DD000C0FFFFEA800010E30100001A000051E369
:104DE000F9FFFF0A400080E2F7FFFFEA00009FE5BD
:104DF0000EF0A0E1149F0100000090E5010050E3D7
:104E00000000A0830100A0930EF0A0E1000090E557
:104E1000040050E30000A0130100A0030EF0A0E185
:104E2000000090E5020050E30000A0130100A00381
:104E30000EF0A0E10DC0A0E100D82DE90330A0E301
:104E400004B04CE2000050E310D04DE2A02FA0E1EE
:104E50001C300BE50230A00318200BE51C300B05BD
:104E60001400000A000052E31E30A0E314300BE5EA
:104E700010000B050400000A020150E3CF04A00358
:104E800000A81B09003060E210300BE510201BE584
:104E9000070172E30700008A14101BE58230A0E1CD
:104EA000070173E3011041E20320A0E1FAFFFF9A3A
:104EB00014100BE510300BE51C004BE2790400EBFD
:104EC00000A81BE90DC0A0E130D82DE904B04CE2E8
:104ED00014D04DE224504BE20030A0E128004BE218
:104EE0000510A0E128300BE5CC0400EB0500A0E1A3
:104EF000270000EB000050E30040A0E10000A013F9
:104F000030A81B190500A0E1170000EB000050E3DA
:104F10000400A01130A81B190500A0E1170000EB48
:104F2000000050E30400001A1C201BE5000052E3BF
:104F300030A81BB91E0052E3040000DA20301BE544
:104F4000000053E30201E0030201A01330A81BE9B3
:104F500020301BE5000053E318301BE51E2062E201
:104F60003302A0E10000601230A81BE9000090E5C8
:104F7000010050E30000A0830100A0930EF0A0E127
:104F8000000090E5040050E30000A0130100A0031E
:104F90000EF0A0E1000090E5020050E30000A01335
:104FA0000100A0030EF0A0E10DC0A0E130D82DE972
:104FB00004B04CE218D04DE20030A0E124104BE2E6
:104FC00028004BE228300BE5940400EB18401BE569
:104FD0000050A0E3053FA0E1245183E1044FA0E18C
:104FE0000430A0E124004BE2070090E800508DE57A
:104FF000EE0300EB30A81BE90DC0A0E1F0DF2DE9C6
:1050000004B04CE210D04DE20170A0E10280A0E1BA
:105010000060A0E1010100EB000050E30100000A84
:105020000600A0E1F0AF1BE90700A0E1FB0000EBE8
:10503000000050E30100000A0700A0E1F0AF1BE907
:105040000600A0E1FA0000EB000050E30900000AAE
:105050000700A0E1F60000EB000050E3EFFFFF0ABD
:10506000042097E5043096E5020053E1EBFFFF0AC8
:10507000F06F1BE9E60000EA0700A0E1EC0000EB9E
:10508000000050E3EBFFFF1A0700A0E1ED0000EB8A
:10509000000050E30F00000A0600A0E1E90000EB69
:1050A000000050E3DDFFFF0A06E0A0E10F00BEE8CC
:1050B00008C0A0E10F00ACE800309EE500308CE5B0
:1050C000042096E5043097E50800A0E1032002E003
:1050D000042088E5F0AF1BE90600A0E1D90000EB51
:1050E000000050E3D3FFFF1A0C2086E2080096E58B
:1050F00008C097E5300092E830E04BE200306CE009
:1051000030008EE8000053E3003063B23F0053E309
:105110000C3087E2000693E8800000CA0C0050E1E2
:105120000C0000DA00C06CE00020A0E30110A0E356
:10513000A930A0E1014009E002500AE08A1F83E1A2
:10514000AA20A0E101C05CE2019084E102A085E117
:10515000F4FFFF1A00C0A0E100005CE1150000DAD6
:105160000C0060E030201BE530104BE2300091E88D
:10517000A230A0E10020A0E30110A0E3014004E080
:10518000025005E030204BE2300002E92C401BE5E4
:1051900030504BE2841F83E1A420A0E1180015E900
:1051A000010050E2013083E1024084E1180085E80B
:1051B0000C00A001EAFFFF1A041096E5043097E501
:1051C000030051E14C00000A000051E34500000AD1
:1051D00030E04BE230009EE8044059E00550CAE060
:1051E000000055E3350000BA0C7088E20030A0E3FF
:1051F000043088E5080088E5300087E8060097E875
:105200000040E0E30030E0E3031091E00420A2E07E
:105210001F0272E31100008A2500000A180097E8B7
:105220008420A0E1A34F82E10010E0E30000E0E36E
:105230008330A0E1082098E5030090E00410A1E08D
:10524000012042E21F0271E3082088E5180087E888
:105250000200008AF0FFFF1A020070E3EEFFFF9ADF
:10526000043097E50320A0E31E0273E3002088E5E5
:105270000D00009A060097E80040A0E30130A0E38B
:10528000A1C0A0E1035001E0046002E0080098E53D
:10529000823F8CE1A240A0E1031085E1042086E179
:1052A000010080E2060087E8080088E50800A0E128
:1052B000F0AF1BE9020071E3D7FFFF9AE7FFFFEAB7
:1052C0000430A0E10540A0E1003073E20040E4E2D8
:1052D0000C7088E20120A0E3180087E8042088E52C
:1052E000080088E5C4FFFFEA30104BE2300091E887
:1052F000094054E00A50C5E0B8FFFFEA30404BE2F5
:105300000C0094E8092092E00A30A3E00C7088E2D7
:105310000C0087E8041088E5080088E5CFFFFFEA65
:105320000C0050E100A0A0C30090A0C3A1FFFFCAE1
:105330000020A0E30010A0E330304BE2060083E839
:105340000C00A0E19BFFFFEA0DC0A0E1F0D92DE920
:1053500004B04CE264C04BE24CD04DE234804BE2EE
:105360000150A0E10040A0E16C604BE20C00A0E124
:105370000810A0E148704BE20C0086E830008CE891
:10538000850400EB0600A0E10710A0E1820400EB19
:105390000710A0E15C204BE20800A0E115FFFFEB45
:1053A000D80300EBF0A91BE90DC0A0E1F0D92DE96D
:1053B00004B04CE264C04BE24CD04DE234804BE28E
:1053C0000150A0E10040A0E16C604BE20C00A0E1C4
:1053D0000810A0E148704BE20C0086E830008CE831
:1053E0006D0400EB0600A0E10710A0E16A0400EBE9
:1053F00044301BE50710A0E1013023E25C204BE2C2
:105400000800A0E144300BE5FAFEFFEBBD0300EB22
:10541000F0A91BE900009FE50EF0A0E1249F010028
:10542000000090E5010050E30000A0830100A0937C
:105430000EF0A0E1000090E5040050E30000A0138E
:105440000100A0030EF0A0E1000090E5020050E38F
:105450000000A0130100A0030EF0A0E10DC0A0E128
:10546000F0DF2DE904B04CE26CC04BE284D04DE299
:105470000150A0E10040A0E13C704BE274604BE2BF
:105480000C00A0E10710A0E130008CE80C0086E8D9
:1054900050A04BE2400400EB0600A0E10A10A0E19E
:1054A0003D0400EB0700A0E1DF0000EB000050E34B
:1054B0000090A0E30080A0E30700000A38301BE55D
:1054C0004C201BE50700A0E1023053E00130A0139F
:1054D00038300BE58B0300EBF0AF1BE90A00A0E1CD
:1054E000D10000EB000050E30600000A4C201BE551
:1054F00038301BE50A00A0E1023053E00130A01370
:105500004C300BE5F2FFFFEA0700A0E1CB0000EB17
:10551000000050E30500000A0A00A0E1CC0000EB07
:10552000000050E3E4FFFF0ABC0000EBE8FFFFEAE5
:105530000A00A0E1C10000EB000050E30400000AF3
:105540000700A0E1C20000EB000050E3E6FFFF0A05
:10555000F4FFFFEA0700A0E1BD0000EB000050E30C
:10556000D5FFFF1A0A00A0E1B90000EB000050E3EC
:10557000DDFFFF1A44304BE2060093E830C01BE524
:105580000210A0E1912C83E080404BE20C0004E883
:1055900030204BE2600092E80630A0E103E0A0E199
:1055A00080304BE244001BE5600013E89E50A6E00B
:1055B000912E83E080401BE590E04BE2060054E131
:1055C00090404BE20C0084E900030EE8901C82E05E
:1055D0000300008A0600001A84001BE5050050E164
:1055E0000300009A893F8FE2180093E890C04BE2D5
:1055F00018000CE80530A0E10040A0E300E0A0E3C3
:1056000080300BE584E00BE580304BE2180013E8B6
:10561000013093E00240A4E0A0C04BE2040052E15C
:1056200018008CE90200008A0800001A030051E10A
:105630000600009A90204BE2030012E80040A0E32D
:105640000130A0E3030090E00410A1E0030002E8B1
:105650000630A0E10040A0E30490A0E10380A0E1B7
:1056600090404BE2180094E990604BE208009AE504
:10567000082097E5600016E8038098E004109AE59A
:10568000043097E50490A9E0002082E0058098E0CE
:10569000A0004BE20690A9E0042082E2013053E032
:1056A0000130A013030090E95C200BE51E0279E3B2
:1056B00080204BE260300BE5030082E91D00009A78
:1056C0007C104BE2220091E8A820A0E1893F82E112
:1056D000A560A0E1A120A0E15C001BE5852F82E18F
:1056E000A8600BE50060A0E30150A0E3051008E00E
:1056F000A940A0E1010080E2000051E3AC200BE5ED
:105700000490A0E10380A0E15C000BE50700000A23
:10571000B0204BE2030092E9F8208FE20C0092E8FF
:10572000031081E1020080E180304BE2030083E955
:105730001E0279E3E1FFFF8A1F0279E31200008A6B
:1057400078501BE57C601BE55CC01BE58500A0E193
:10575000A64F80E18900A0E18630A0E1A82F80E17A
:1057600001C04CE28810A0E180E04BE2000055E36C
:1057700018008EE95CC00BE50290A0E10180A0E179
:105780001D0000BA1F0279E3ECFFFF9AFF3008E228
:105790000040A0E3800053E30600000A64204BE2CF
:1057A0000C3082E2000383E80320A0E364200BE5D1
:1057B00064004BE246FFFFEA000054E3F6FFFF1AE5
:1057C0000020A0E3011CA0E3013008E0024009E052
:1057D000043093E10300001A7C004BE2030090E8E0
:1057E000010090E1ECFFFF0A0040A0E38030A0E35D
:1057F000038098E00490A9E0E7FFFFEA0040A0E3FF
:105800000130A0E3038088E1049089E1DCFFFFEA36
:105810000000000001000000000000000000008007
:1058200000009FE50EF0A0E1249F0100000090E53C
:10583000010050E30000A0830100A0930EF0A0E15E
:10584000000090E5040050E30000A0130100A00355
:105850000EF0A0E1000090E5020050E30000A0136C
:105860000100A0030EF0A0E10DC0A0E1F0DF2DE9E2
:1058700004B04CE258C04BE250D04DE23C804BE2C9
:1058800060604BE20150A0E10040A0E10C0086E81E
:105890000C00A0E10810A0E150704BE230008CE851
:1058A0003D0300EB0600A0E10710A0E13A0300EB86
:1058B0000800A0E18F0000EB000050E30200000AA6
:1058C0000800A0E18F0200EBF0AF1BE90700A0E1A8
:1058D000880000EB000050E30700A011F8FFFF1A5A
:1058E00038301BE54C201BE50800A0E1023023E026
:1058F00038300BE5840000EB000050E30500000A9F
:105900003C201BE550301BE5030052E1EBFFFF1A82
:10591000750000EBEAFFFFEA0800A0E17F0000EB62
:10592000000050E30040A0E1F4FFFF1A0700A0E1EF
:10593000750000EB000050E30600000A0020A0E321
:105940000010A0E330304BE20800A0E134400BE54A
:10595000060083E8DAFFFFEA0700A0E16F0000EB32
:10596000000050E30430A0130800A0113C300B15D8
:10597000D3FFFF1A44304BE2030093E860204BE270
:10598000030002E930304BE2000693E834201BE5C7
:1059900048301BE564401BE5022063E00A0054E147
:1059A00034200BE50300008A0900001A68001BE59B
:1059B000090050E10600009A013042E28A00A0E1AD
:1059C000A92F80E18910A0E134300BE502A0A0E10D
:1059D0000190A0E10020A0E30010A0E370304BE2B2
:1059E000060083E8F8408FE2300094E864001BE58D
:1059F000A430A0E1853F83E1A510A0E10A0050E1B9
:105A000078300BE574100BE50C00008A0200001AD8
:105A100068201BE5090052E10800008A60104BE293
:105A2000030011E9009059E001A0CAE070004BE2C8
:105A30000C0090E8042082E1053083E10C0080E84E
:105A400070104BE2300011E98A30A0E1A97F83E1B8
:105A50008960A0E1052094E107A0A0E10690A0E103
:105A6000E1FFFF1A70305BE50040A0E3800053E3E4
:105A70000400000A70204BE2060092E80C3088E235
:105A8000060083E88DFFFFEA000054E3F8FFFF1AE9
:105A900070004BE2180090E80020A0E3011CA0E396
:105AA000013003E0024004E0043093E10600000A04
:105AB0000040A0E38030A0E3060090E8031091E0EE
:105AC0000420A2E0060080E8E9FFFFEA0A9099E1DD
:105AD000E7FFFF0A0040A0E38030A0E370004BE244
:105AE000F4FFFFEA000000000000001000009FE546
:105AF0000EF0A0E1249F0100000090E5010050E3BA
:105B00000000A0830100A0930EF0A0E1000090E54A
:105B1000040050E30000A0130100A0030EF0A0E178
:105B2000000090E5020050E30000A0130100A00374
:105B30000EF0A0E10DC0A0E1F0D92DE904B04CE2D7
:105B400050C04BE238D04DE234804BE20150A0E12E
:105B50000040A0E148704BE20C00A0E158604BE22D
:105B60000810A0E10C0086E830008CE88A0200EB07
:105B70000600A0E10710A0E1870200EB0800A0E109
:105B80000D0000EB0030A0E1000053E30700A0E1AE
:105B90000100000A0100A0E3F0A91BE9060000EBE8
:105BA0000030A0E1000053E30800A0E10710A0E1ED
:105BB000F7FFFF1ACB0200EBF0A91BE9000090E50C
:105BC000010050E30000A0830100A0930EF0A0E1CB
:105BD0000DC0A0E1F0D92DE904B04CE250C04BE279
:105BE00038D04DE234804BE20150A0E10040A0E10A
:105BF00048704BE20C00A0E158604BE20810A0E1B5
:105C00000C0086E830008CE8630200EB0600A0E19F
:105C10000710A0E1600200EB0800A0E10D0000EB1E
:105C20000030A0E1000053E30700A0E10500001AE6
:105C3000080000EB0030A0E1000053E30800A0E101
:105C40000710A0E10100000A0000E0E3F0A91BE951
:105C5000A40200EBF0A91BE9000090E5010050E36D
:105C60000000A0830100A0930EF0A0E10DC0A0E110
:105C7000F0D92DE904B04CE250C04BE238D04DE2EF
:105C800034804BE20150A0E10040A0E148704BE2BB
:105C90000C00A0E158604BE20810A0E10C0086E87F
:105CA00030008CE83C0200EB0600A0E10710A0E108
:105CB000390200EB0800A0E10D0000EB0030A0E18C
:105CC000000053E30700A0E10500001A080000EB04
:105CD0000030A0E1000053E30800A0E10710A0E1BC
:105CE0000100000A0000E0E3F0A91BE97D0200EBDF
:105CF000F0A91BE9000090E5010050E30000A0833B
:105D00000100A0930EF0A0E10DC0A0E1F0D92DE9B3
:105D100004B04CE250C04BE238D04DE234804BE24C
:105D20000150A0E10040A0E148704BE20C00A0E16E
:105D300058604BE20810A0E10C0086E830008CE8C7
:105D4000150200EB0600A0E10710A0E1120200EB33
:105D50000800A0E10D0000EB0030A0E1000053E3DB
:105D60000700A0E10100000A0100A0E3F0A91BE97F
:105D7000060000EB0030A0E1000053E30800A0E1C2
:105D80000710A0E1F7FFFF1A560200EBF0A91BE98C
:105D9000000090E5010050E30000A0830100A09303
:105DA0000EF0A0E10DC0A0E110D82DE90330A0E372
:105DB00004B04CE2000050E314D04DE2A02FA0E16B
:105DC00024300BE50230A00320200BE524300B0526
:105DD0001B00000A3C30A0E3000052E31C300BE53E
:105DE0000030A001C34FA0010300000A020150E3EC
:105DF00000306012C34FA0111400000A10204BE2C3
:105E0000180002E914301BE51F0273E30C00008A3E
:105E100010204BE2180012E98420A0E1A34F82E198
:105E20008330A0E110204BE2180002E914201BE5AA
:105E30001C301BE51F0272E3013043E21C300BE50E
:105E4000F2FFFF9A24004BE22E0100EB10A81BE9A1
:105E500004008FE2030090E810A81BE90000E0C1F5
:105E6000000000000DC0A0E130D82DE904B04CE2E4
:105E70000140A0E10030A0E130204BE21CD04DE217
:105E800028504BE20200A0E10510A0E1180082E8D2
:105E9000C10100EB0500A0E1280000EB000050E389
:105EA0000040A0E10000A01330A81B190500A0E1EC
:105EB000180000EB000050E30400A01130A81B19EB
:105EC0000500A0E1180000EB000050E30400001AF8
:105ED00020301BE5000053E330A81BB91E0053E33C
:105EE000040000DA24301BE5000053E30201E00364
:105EF0000201A01330A81BE93C2063E220304BE2F2
:105F0000030093E9530000EB24301BE5000053E34A
:105F10000000601230A81BE9000090E5010050E38A
:105F20000000A0830100A0930EF0A0E1000090E526
:105F3000040050E30000A0130100A0030EF0A0E154
:105F4000000090E5020050E30000A0130100A00350
:105F50000EF0A0E10DC0A0E110D82DE904B04CE294
:105F60002CC04BE21CD04DE224404BE20130A0E1BA
:105F70000020A0E10C00A0E10410A0E10C008CE8DE
:105F8000850100EB0400A0E1020000EB0400A0E1A9
:105F9000DC0000EB10A81BE9043090E5000053E39F
:105FA0000030A0130130A003043080E50EF0A0E122
:105FB0000DC0A0E104D04DE210D82DE908B04CE2AC
:105FC00014D04DE204308BE50030A0E124300BE525
:105FD0001C200BE50C009BE910404BE224004BE237
:105FE00020100BE50C0004E9C60000EB10A81BE92B
:105FF0000DC0A0E170D82DE904B04CE234204BE292
:106000000140A0E10030A0E11CD04DE20200A0E17F
:106010002C104BE2180082E85F0100EB20204BE2DD
:10602000180092E80020A0E30311E0E3015003E030
:10603000026004E023CFA0E104318CE1065095E139
:106040002C004BE2070090E801308313244FA0E1BD
:10605000A00000EB70A81BE9000052E370402DE99E
:1060600020C062E20140A0E10030A0E10060A0E3B6
:106070000050A0E30800000A00005CE33032A0E119
:1060800000E06CE20060A0D3315EA0D13162A0C11B
:10609000115C83C10640A0E10530A0E10410A0E13D
:1060A0000300A0E17080BDE80DC0A0E1F0DD2DE9A6
:1060B00004B04CE20C5090E50040A0E104A090E553
:1060C000470000EB000050E30080A0E30060A0E187
:1060D000FF80A013015685130900000AA73BA0E129
:1060E000853483E1E374A0E17F24C7E3FF1008E275
:1060F0000225C2E3817B82E10231C7E38A0F83E19B
:10610000F0AD1BE90400A0E13A0000EB000050E311
:106110000200000A0050A0E3FF80A0E3EEFFFFEAC8
:106120000400A0E1380000EB000050E30850A0118B
:10613000E9FFFF1A000055E3E7FFFF0A080094E5B6
:106140007E0070E3180000AAFF0460E2FF0880E20E
:10615000FF0C80E2820080E2190050E30850A0C1E9
:10616000060000CA0130A0E31330A0E1013043E291
:10617000030015E13520A0E10250A0010150821377
:106180007F3005E2400053E33F5085120300000AD0
:10619000070175E30180A083A553A0E1CEFFFFEACC
:1061A000800015E340508512F8FFFFEA7F0050E3BE
:1061B000D7FFFFCA7F3005E2400053E37F8080E2D3
:1061C0003F5085120300000A000055E3A550A0B11E
:1061D000018088B2EFFFFFEA800015E3405085128E
:1061E000F8FFFFEA000090E5010050E30000A08303
:1061F0000100A0930EF0A0E1000090E5040050E340
:106200000000A0130100A0030EF0A0E1000090E543
:10621000020050E30000A0130100A0030EF0A0E173
:1062200004E02DE5B230D0E10320D0E5000090E598
:10623000A333A0E1A223A0E1FFC4C0E3FFE013E287
:10624000042081E502C5CCE31200001A00005CE3E3
:106250000230A0030D00000A8CC3A0E17E204EE2B4
:106260000330A0E307017CE3003081E5082081E5ED
:106270000400008A8CC0A0E107017CE3012042E217
:1062800008208185FAFFFF9A0CC081E504F09DE4A7
:10629000003081E504F09DE4FF005EE30600000AA3
:1062A0008C33A0E1013183E37F204EE20C3081E5A5
:1062B0000330A0E3082081E5F4FFFFEA00005CE37F
:1062C0000430A003F1FFFF0A013610E20130A013F1
:1062D000003081E5EBFFFFEA0DC0A0E100D82DE919
:1062E00004B04CE210D04DE200C0A0E11C004BE233
:1062F0001CC00BE518100BE514200BE510300BE566
:1063000068FFFFEB00A81BE90DC0A0E1F0DD2DE95F
:1063100004B04CE208D04DE20C3080E20040A0E135
:10632000600093E8048090E58C0000EB000050E3EF
:106330000070A0E31C00000A863F8FE2180093E87B
:106340007F7EA0E3035085E1046086E10F7087E261
:1063500028301BE5233AA0E1063683E16336A0E14D
:1063600028300BE5B6325BE1872AA0E17F3CC3E32E
:10637000A22AA0E1F030C3E3023283E1B6324BE15E
:1063800025205BE5013008E28020C2E3832382E11F
:1063900025204BE528301BE528500BE52C300BE57C
:1063A00030304BE2030093E9F0AD1BE90400A0E1BB
:1063B0006F0000EB000050E30400000A7F7EA0E3C2
:1063C0000F7087E20060A0E30050A0E3DFFFFFEA68
:1063D0000400A0E16B0000EB000050E3F8FFFF1A9F
:1063E000063095E1D9FFFF0A080094E5FF3FE0E39E
:1063F000013043E2030050E1350000AABFA360E290
:10640000FFA78AE2FFAB8AE238005AE31C0000DAF9
:106410000060A0E30050A0E3FF3005E20040A0E3ED
:10642000800053E30B00000A0040A0E37F30A0E3AC
:10643000035095E00460A6E0010256E32524A0E1A4
:106440000170A023063C82E12644A0E10460A0E1A3
:106450000350A0E1BDFFFFEA000054E3F1FFFF1A83
:106460000020A0E3011CA0E3013005E0024006E0AB
:10647000043093E1EFFFFF0A0040A0E38030A0E387
:10648000EAFFFFEA0A20A0E10010A0E30100A0E378
:10649000030100EB0040E0E30030E0E3003093E074
:1064A0000140A4E0042006E0031005E0021091E1A1
:1064B0000610A0E10500A0E10A20A0E10040A00331
:1064C0000140A013E3FEFFEB045080E1C46F81E1C3
:1064D000D0FFFFEA010B50E3B7FFFFAAFF3005E250
:1064E0000040A0E3FF7F80E2800053E3037087E277
:1064F0000D00000A0040A0E37F30A0E3035095E0C8
:106500000460A6E01E0276E30500009AA520A0E143
:10651000863F82E1A640A0E1017087E20460A0E12D
:106520000350A0E12524A0E1C5FFFFEA000054E3E9
:10653000EFFFFF1A0020A0E3011CA0E3013005E0FB
:10654000024006E0043093E1EDFFFF0A0040A0E3C3
:106550008030A0E3E8FFFFEA000000000000080030
:10656000000090E5010050E30000A0830100A0932B
:106570000EF0A0E1000090E5040050E30000A0133D
:106580000100A0030EF0A0E1000090E5020050E33E
:106590000000A0130100A0030EF0A0E1F0402DE9DF
:1065A00000C090E508D04DE204C08DE5B630DDE1D5
:1065B0002332A0E183EAA0E10730DDE5042090E585
:1065C000AEEAA0E10170A0E1A333A0E1FF64CCE357
:1065D0007F1EA0E300005EE3043087E50250A0E1E7
:1065E00000208DE50F66C6E30F1081E21E00001A41
:1065F000063092E10230A0031900000A0614A0E15F
:106600000534A0E1254C81E10460A0E10350A0E144
:10661000FF2FE0E3012042E20330A0E31F0276E314
:10662000082087E5003087E50900008A8610A0E190
:10663000082097E5A54F81E18530A0E10460A0E145
:106640000350A0E1012042E21F0276E3082087E523
:10665000F5FFFF9A0C3087E2600083E808D08DE2F6
:10666000F080BDE8003087E5FBFFFFEA01005EE156
:106670000D00000A0624A0E1254C82E1FF0F4EE246
:1066800050108FE2060091E80534A0E1030040E2DB
:10669000015083E1026084E10C3087E2080087E565
:1066A000600083E80330A0E3EDFFFFEA063092E1EB
:1066B0000430A003EAFFFF0A20108FE2060091E8F1
:1066C000013005E0024006E0043093E10130A01300
:1066D000003087E5DEFFFFEA000000000000001048
:1066E00000000000000008000DC0A0E170D82DE9F6
:1066F00004B04CE20140A0E10050A0E1590000EBE1
:10670000000050E30100000A0100A0E370A81BE9AB
:106710000400A0E1530000EB000050E3F9FFFF1A72
:106720000500A0E1540000EB000050E30600000A61
:106730000400A0E1500000EB000050E30420941599
:10674000043095150200631070A81B190500A0E124
:10675000490000EB000050E30400000A043095E516
:10676000000053E30100A0030000E01370A81BE940
:106770000400A0E1400000EB000050E30060A0E155
:106780000400000A043094E5000053E30000E00335
:106790000100A01370A81BE90500A0E13B0000EB7D
:1067A000000050E30400000A0400A0E1370000EB01
:1067B000000050E30600A01170A81B190500A0E11D
:1067C000320000EB000050E3EDFFFF1A0400A0E1EF
:1067D0002E0000EB000050E3DFFFFF1A041095E5E8
:1067E000043094E5030051E10100000A000051E388
:1067F000DBFFFFEA082095E5083094E5030052E14D
:10680000F9FFFFCA010000AA000051E3DEFFFFEA22
:106810000CC085E20C0084E204209CE5043090E585
:10682000030052E1F0FFFF8A0300001A0C2095E5F7
:106830000C3094E5030052E1EBFFFF8A042090E561
:1068400004309CE5030052E1EEFFFF8A0300001ACA
:106850000C2094E50C3095E5030052E1E9FFFF8A36
:106860000000A0E370A81BE9000090E5010050E3E0
:106870000000A0830100A0930EF0A0E1000090E5CD
:10688000040050E30000A0130100A0030EF0A0E1FB
:10689000000090E5020050E30000A0130100A003F7
:1068A0000EF0A0E1000052E370402DE920C062E24A
:1068B0000140A0E10030A0E10060A0E30050A0E3AF
:1068C0000800000A00005CE31132A0E100E06CE285
:1068D0000050A0D3106EA0D11052A0C1306C83C163
:1068E0000640A0E10530A0E10410A0E10300A0E112
:1068F0007080BDE80DC0A0E10E002DE900D82DE9A3
:1069000010B04CE20010E0E304209BE508308BE27D
:10691000C50000EB00A81BE9000052E302C0A0E1A3
:106920000600000A0020D0E5FF3001E2030052E13A
:106930000EF0A00101C05CE2010080E2F8FFFF1A46
:106940000000A0E30EF0A0E1000052E300C0A0E1CF
:106950000EF0A0010130D1E4012052E20130CCE47C
:106960000EF0A001FAFFFFEA0030D0E5000053E38B
:106970000020A0E10200000A0130F0E5000053E32E
:10698000FCFFFF1A000062E00EF0A0E10030A0E37F
:10699000012042E2010072E30600000A00C0D0E5D7
:1069A0000130D1E403305CE0010080E20100001A14
:1069B00000005CE3F5FFFF1A0300A0E10EF0A0E188
:1069C00000442DE910A09FE510209FE50AA08FE06C
:1069D00002208AE00044BDE8010000EAA098FE031E
:1069E000200300000DC0A0E170D82DE9004050E266
:1069F00004B04CE20260A0E10150A0E10200001AE4
:106A0000004092E5000054E30E00000A0400A0E1FB
:106A10008A0400EB0030F4E7FF3003E2000053E3A8
:106A20000400A0E10510A0E10340A0010300A001C3
:106A30000300000A6F0400EB000050E30030A013D5
:106A40000130C014000086E50400A0E170A81BE935
:106A50000010A0E30A20A0E3FFFFFFEA0130A0E35B
:106A6000FFFFFFEA0DC0A0E1F0DF2DE990A19FE557
:106A700004B04CE208D04DE20040A0E10250A0E199
:106A80000AA08FE00060A0E12C100BE530300BE590
:106A90000000D4E55C0000EB000050E301408412EC
:106AA000FAFFFF1A0020D4E52B0052E30080A0E19A
:106AB0000200000A2D0052E30100001A0180A0E349
:106AC000014084E21020D5E30D00001A0030D4E527
:106AD000300053E30A5085E20700001A016084E2A7
:106AE0000030D6E5203083E3780053E3025045E2DE
:106AF0000640A0E18550A00101408602100055E348
:106B00001050A0A3023045E2220053E30070A0E33E
:106B10002900008A0510A0E10000E0E307F6FFEB82
:106B20000510A0E10030A0E10000E0E3FF9003E2E7
:106B3000B0F5FFEB0020D4E5303042E2FF3003E255
:106B4000090053E30320A0910400009A400052E39F
:106B50002030828357304382FF2003822820A09375
:106B6000050052E1140000AA016084E2000057E130
:106B70000640A0E10700008A0030A0130130A00306
:106B8000090052E10030A09301300382000053E37A
:106B900095272700E6FFFF0A30201BE5023008E0BA
:106BA000FF8003E25C309FE503309AE72220A0E3F8
:106BB0000070E0E3002083E5DDFFFFEA2C301BE5F9
:106BC000000053E30060831530201BE5000058E30C
:106BD0000211E0030211A013000052E3010057115B
:106BE00020209F8502209A872230A0830030828552
:106BF0000170A081000058E3000067120700A001A7
:106C0000F0AF1BE9EC97FE03000000000030A0E1AC
:106C1000090040E2040050E30000A0830100A093BB
:106C2000200053E3010080030EF0A0E10DC0A0E1BD
:106C300030D82DE90140A0E10010E0E104B04CE2C1
:106C4000010054E10140A02148D04DE20210A0E132
:106C50000320A0E10130E0E350300BE558309FE520
:106C600000C0A0E104E080E00050A0E35C004BE243
:106C700034E00BE5BC354BE148C00BE53CC00BE50F
:106C800040C00BE538C00BE544E00BE51C500BE5BC
:106C9000770100EB050054E130A81B0940201BE5FB
:106CA00044301BE5011042E2030052E140100B05A5
:106CB00040301BE50050C3E530A81BE990200000E0
:106CC0000DC0A0E130D82DE9000052E304B04CE241
:106CD00004D04DE20240A0E115104BE50050A0E1C8
:106CE00030A81B0915004BE20110A0E30520A0E12C
:106CF000840400EB014054E230A81B09F8FFFFEACE
:106D00000DC0A0E1F0DF2DE944A59FE504B04CE201
:106D1000C0D04DE20180A0E10030A0E30AA08FE0E6
:106D2000D8000BE50100A0E10390A0E1DC200BE519
:106D3000CC300BE56B0600EB0800A0E1E70500EBAB
:106D40002620D8E5183098E5090053E1023188E0A3
:106D5000240083E22030A0E3E4300BE5543088E2E5
:106D6000823183C01C2098E50B10A0E3083043C299
:106D7000020059E1E0100BE5050000AA28104BE2E3
:106D8000012052E2203001E5083083E2041081E264
:106D9000FAFFFF1A204098E5000054E30900001AAA
:106DA000DC301BE5101098E5002093E548001BE55A
:106DB0000F1C01E2000090E5C23FA0E1700100EB72
:106DC0000400A0E1F0AF1BE9070054E36400008A6F
:106DD00080349FE503308AE0033084E0015053E5BE
:106DE0000A0055E35760A0E30500001A103098E54B
:106DF000200013E35760A0032C60A013400013E3AE
:106E000080608613050054E3005065820400008A08
:106E1000030054E33760A003010054E30610A0030D
:106E2000E0100B05043098E5000053E31420D8B5BA
:106E3000000090E5E4200BB50F0C00E20520A0E176
:106E400048101BE5590100EB0530A0E10120A0E14D
:106E50000010A0E149004BE200608DE5EE0400EB7C
:106E6000201098E5050051E30050A0E11100009AC0
:106E70000030D0E52D0053E3103098E50500001AEE
:106E8000023083E30220A0E3015080E2E0200BE522
:106E9000103088E5070000EA020013E30030A01379
:106EA000E0300B150300001AE0201BE5010013E39E
:106EB0000420A013E0200BE5049098E5102098E54D
:106EC000000059E3C8304BE2030065E00190A0B335
:106ED000100012E37F6080E20C00000A020051E320
:106EE000E0301BE50630A093030051E30930A00316
:106EF000060059E104005193E0300BE50300001A4D
:106F00000030D5E5300053E3809080120190A0035B
:106F10000030D5E5300053E30B00001AE0101BE50C
:106F2000203098E5050051E30B10A0C3010053E3A6
:106F3000E0100BE520339F0503509A070560A0037E
:106F40000400000A000059E30060A003060059E1B4
:106F5000092066800000008A0020A0E30290A0E1E2
:106F60006F0000EA0F0054E30A00008A48101BE596
:106F7000043088E2060091E8D8001BE5250100EB0B
:106F8000DC101BE5003091E5003083E00000A0E359
:106F9000003081E5F0AF1BE9110054E31C00008ACA
:106FA0000040A0E3D4400BE548101BE50E00001A9A
:106FB000003091E5040053E1CC300BE52200000ADB
:106FC000042098E5CC004BE2040052E10020E0B33D
:106FD000D4304BE20010A0E1470300EB010070E366
:106FE0000060A0E1F0AF1B094D0000EAC8504BE281
:106FF000001091E5D4204BE20500A0E1260300EB50
:10700000010070E30060A0E10040C517F0AF1B096C
:10701000430000EA130054E31600008A48101BE501
:107020000D00001A005091E5000055E30600000A2B
:10703000041098E5000051E30010E0B30500A0E162
:10704000DE0200EB0060A0E1350000EA0C329FE5B3
:1070500003509AE70660A0E3310000EA0030D1E572
:10706000C8504BE2C8304BE50160A0E30030A0E31C
:10707000C7304BE52A0000EA140054E30700001A69
:10708000DC319FE503309AE7C8104BE2000093E53E
:107090008020A0E3F90200EB0050A0E1E3FFFFEA4B
:1070A000C0119FE501309AE7005093E50020D5E537
:1070B0000C3098E5030052E11200001AA4319FE55C
:1070C00003309AE700C093E59C319FE505C06CE072
:1070D000D8001BE5041088E248204BE203309AE711
:1070E0000FE0A0E10CF193E7000050E33A0000BA92
:1070F000DC201BE5003092E5003083E00000A0E3D7
:10710000003082E5F0AF1BE901309AE7003093E5EB
:10711000015085E20A3083E2030055E1E2FFFF3AC5
:107120002D0000EAE0301BE50B0053E3092086E068
:107130000200000A050053E3012082D2022082C22D
:10714000083098E5DC101BE5020053E10370628013
:107150000070A093003091E5072082E0023083E0C8
:10716000003081E5E4201BE5103098E5300052E363
:10717000079089000070A003084013E20400001A81
:107180000720A0E1D8001BE52010A0E3CBFEFFEB19
:107190000470A0E1D4309FE503008AE0E0301BE5F5
:1071A000D8101BE5000083E00C0300EBD8001BE5C2
:1071B0000920A0E13010A0E3C0FEFFEBCC301BE5BE
:1071C000000053E30600001A0500A0E10610A0E14C
:1071D000D8201BE54B0300EB170000EA0000E0E3BA
:1071E000F0AF1BE90030A0E3000056E3D4300BE51C
:1071F0000F00000A800056E30650A0318050A02303
:10720000C8404BE20520A0E1D4304BE2CC104BE269
:107210000400A0E1B80200EB0050A0E10510A0E1DD
:107220000400A0E1D8201BE5360300EB056056E022
:10723000EFFFFF1A0030A0E3CC300BE5D8001BE5D0
:107240000720A0E12010A0E39CFEFFEB0000A0E3DC
:10725000F0AF1BE95095FE03C49D01FC0400000043
:1072600008000000000000000C00000010000000FA
:10727000CC9D01FC0DC0A0E1F0D92DE904B04CE299
:10728000A8D04DE2C4804BE20030A0E30070A0E142
:107290000800A0E10140A0E1C8300BE50260A0E1D8
:1072A000340400EB000050E30450A0E1090000AA00
:1072B000C4401BE50400A0E1AAFDFFEB0720A0E10C
:1072C0000010A0E10400A0E10E0300EB0030E0E3B9
:1072D000C8300BE5280000EA0610A0E10800A0E194
:1072E0006E0400EB0030D4E5000053E32500531397
:1072F0000300000A0130F4E5000053E325005313B6
:10730000FBFFFF1A050054E10800000A041065E0C5
:107310000500A0E10720A0E1FA0200EB000050E325
:10732000E9FFFFBAC8301BE5003083E0C8300BE549
:107330000030D4E5000053E30F00000A0130F4E50B
:10734000250053E30900000A0700A0E10810A0E1AE
:10735000C8204BE2C4400BE568FEFFEB000050E3A1
:10736000C4401BA50450A0A1DDFFFFAAD6FFFFEA81
:107370000450A0E1014084E2D9FFFFEAC8001BE508
:10738000F0A91BE9010C51E30020C0050EF0A0019B
:10739000020B51E30100001A0C0080E80EF0A0E19E
:1073A000020C51E3B020C001002080150EF0A0E1D6
:1073B000000052E30020A0E1023B00E2090000BA15
:1073C000000053E30900001A010C50E3000091E5AE
:1073D000FF000002020C52E30038A0012308A001C4
:1073E0000010A0E30EF0A0E1000053E30100000A4A
:1073F000030091E80EF0A0E1010C50E3000091E5DC
:10740000FF000002020C52E30038A0014308A00173
:10741000C01FA0E10EF0A0E10DC0A0E1F0DF2DE95A
:1074200004B04CE201DC4DE20890D3E5610059E381
:107430000C310BE56790A003003093E5410059E360
:107440000CE11BE54790A003000053E30630A0B316
:107450000CC09EE520310BE501EC4BE20030A0E3CF
:1074600004304EE50250A0E10140A0E10C211BE5F3
:1074700002001CE3042092E528A29FE52B30A01314
:1074800001CC4B1208010BE51C210BE50AA08FE093
:1074900004304C150300001A01001CE32030A01337
:1074A00001EC4B1204304E1500C0A0E301EC4BE29E
:1074B0000510A0E10400A0E10530A0E10420A0E156
:1074C00003C04EE5A60700EB000050E30080A0E1FA
:1074D0000A00000A600059E30630A0930530A0833B
:1074E000FF304BE50C211BE50330A0E3E8300BE552
:1074F000FE604BE22030A0E3103082E55D0100EA3F
:10750000192E8FE20C0092E80510A0E10400A0E122
:1075100087F9FFEB000050E30030E00314310B0566
:107520009200000A5B2F8FE20C0092E80510A0E1A8
:107530000400A0E1F3F9FFEB000050E3070000AA0C
:107540002D30A0E301CC4BE20510A0E10400A0E146
:1075500004304CE57EFAFFEB0150A0E10040A0E1D1
:107560004E2F8FE20C0092E80510A0E10400A0E18C
:10757000B9F7FFEB0130A0E10020A0E10510A0E188
:107580000400A0E16AF9FFEB000050E30A00001AD2
:10759000600059E30430A0930330A083FF304BE533
:1075A0000CE11BE50330A0E3E8300BE5FE604BE2A5
:1075B0002030A0E310308EE52E0100EA016C8FE24E
:1075C000C00096E890C04BE288C18CE00710A0E1B3
:1075D0000600A0E10730A0E10620A0E1C0008CE891
:1075E0009DF7FFEB018088E20C0058E30170A0E1F9
:1075F0000060A0E1F2FFFFDABC208FE20C0092E80D
:107600000510A0E10400A0E1BEF9FFEB0820A0E313
:10761000A00FA0E1013AA0E318010BE514210BE54E
:1076200010310BE50C80A0E318C11BE510311BE500
:1076300001E048E2C330A0E100005CE328E10BE593
:1076400090204BE28801A0E124310BE52000000AE4
:10765000023080E00C0093E80510A0E10400A0E1F6
:107660007DF7FFEB60208FE20C0092E80170A0E153
:107670000060A0E1A3F9FFEB000050E345CF4BB25F
:1076800000509CB80750A0B10640A0B10CC06EB02D
:1076900014C10BB51F0000EA00000000000000004C
:1076A0000000D03F00000000E08DFE031400000049
:1076B000180000001C0000003800000084D797412B
:1076C00000000000000024400000000065CDCD4116
:1076D00000000000023080E00C0093E80510A0E1FB
:1076E0000400A0E15FF8FFEB34204FE20C0092E8C9
:1076F0000170A0E10060A0E15BF9FFEB000050E346
:10770000452F4BA20C0092A8032082A014210BA5A8
:107710000750A0A10640A0A14A8F4BE2001198E8B3
:10772000010078E310C10BE5BEFFFF1A68204FE2AD
:107730000C0092E80510A0E10400A0E14AF9FFEB7B
:10774000000050E3090000BA0510A0E10400A0E128
:1077500094204FE20C0092E842F8FFEB14E11BE5A5
:1077600001E08EE214E10BE50150A0E10040A0E150
:10777000AE704BE20280A0E30510A0E10400A0E19E
:10778000B7F9FFEB0060A0E185F9FFEB0130A0E164
:107790000020A0E10510A0E10400A0E101F7FFEB4B
:1077A000DC204FE20C0092E82BF7FFEB08311FE5DD
:1077B0000150A0E10040A0E10920A0E303109AE7F6
:1077C0000700A0E10630A0E149FCFFEB018058E290
:1077D000007087E0E7FFFF5A600059E36530A0E3DF
:1077E000F8304BE520211BE54530A093F8304B9550
:1077F00020308992FF900392000052E30030A0D322
:107800000130A0C3670059E30030A0130130030228
:10781000000053E302C0A0E101C04212660059E338
:107820000940A0E10A00001A14311BE503C08CE0F6
:1078300001007CE3060000AA00C0E0E3B0004BE2D8
:107840003010A0E31420A0E314C10BE5D40000EB3A
:1078500014C11BE50020A0E33030A0E313005CE37B
:10786000AF304BE5B0204BE50280A0E1AF704BE2BA
:107870009A004BE2050000CA0C2087E00230D2E5F6
:10788000020082E2340053E30080A0930180A083D1
:10789000013070E5083083E00030C0E50020D0E51D
:1078A000390052E30030A0930130A083300052E34E
:1078B00001308303000053E3F4FFFF1A14111BE5AA
:1078C000070050E10700A0910110819201708782AA
:1078D00000E0A0E3670059E301E0E0E50800001ADA
:1078E000040071E30030A0B30130A0A30C0051E10B
:1078F0000030A0C3013003D20E0053E16790A00313
:107900006690A013660059E314110BE50010A01354
:10791000000051E33030A0B30120A0E3013067B58F
:10792000FFE04BE5E8200BE50130D7E4303043E2DF
:10793000E4300BE5008067E0FE604BE2E0504BE294
:10794000190000BA080051E10D0000BA011068E00A
:10795000000051E3E0800BE5FE204BE5DC700BE519
:107960000E80A0E1FD604BE2D8504BE2FC604BC2C0
:10797000D0504BC2D8100BC5FDE04BC5D4E00BC5B1
:10798000080000EA000051E3060000DAFE204BE5A3
:10799000E0100BE5DC700BE5088061E0FD604BE278
:1079A000D8504BE2017087E00010E0E30CE11BE5EA
:1079B0000C309EE52332A0E1013003E2000058E3E1
:1079C00001308313000053E30300001A20211BE55C
:1079D000670054E300005213040000DA0230A0E311
:1079E0000130C6E40130A0E3043085E4045085E2B0
:1079F000011091E2003061420020A0430120C64402
:107A00000430854404208544000058E30130A0136D
:107A10000130C6140480851404708514670054E393
:107A20000700000A20311BE5088061E0030058E1EF
:107A3000038068B00030A0B30130C6B4048085B4C0
:107A4000043085B4660059E30A00000A0130A0E35F
:107A50000130C6E4AC331FE5F8404BE203109AE76F
:107A6000F8205BE514311BE50400A0E1A0FBFFEB6F
:107A7000040085E4004085E5010C4BE2061060E05F
:107A8000010051E3E8504BE2070000DA018041E2D7
:107A9000043095E41CC11BE5018058E20CC063E092
:107AA0001CC10BE5045085E2F8FFFF1A01EC4BE224
:107AB00004305EE51C211BE5008053E20180A01329
:107AC000022068E0000052E30030A0D31C210BE547
:107AD0001C310BD5160000DA0CC11BE50C309CE5FF
:107AE000082013E20A00000A0730A0E30030C6E5D0
:107AF0001CE11BE548341FE504E085E403309AE708
:107B00000020A0E3011081E21C210BE5003085E597
:107B1000070000EA0CC11BE510309CE5300053E380
:107B2000E8301B051CE11B050E308300E8300B0517
:107B30001C210B051C211BE50040A0E3083082E05E
:107B400001CC4BE20720A0E30020CCE5010054E18A
:107B5000F0300BE5413F4BE2EC300BE50060A0E17B
:107B6000F0504BE20C0000AA0180A0E1BC341FE5FC
:107B70000120D6E403308AE0021193E708011BE5F7
:107B80000C0095E8F30100EB003095E5018058E228
:107B9000034084E0085085E2F3FFFF1A0400A0E1EF
:107BA000F0AF1BE9000052E30030A0E10EF0A001AD
:107BB000012052E20110C3E40EF0A001FBFFFFEA36
:107BC000000051E30020A0E10800000A0030D0E5E9
:107BD000000053E30500000A011051E2010080E2B9
:107BE0000200000A0030D0E5000053E3F9FFFF1A5D
:107BF000000062E00EF0A0E10030D0E5000053E3A9
:107C00000C00000A0020D1E5000052E301C0A0E111
:107C10000500000A0030D0E5030052E10EF0A0019B
:107C20000120FCE5000052E3F9FFFF1A0130F0E506
:107C3000000053E3F2FFFF1A0000A0E30EF0A0E102
:107C40000020D1E5000052E304E02DE501C0A0E1F1
:107C500000E0A0E10700000A0030D0E5030052E197
:107C600001C08CE201C0A0010020DCE5010080021F
:107C7000000052E3F7FFFF1A00006EE004F09DE4FD
:107C80000DC0A0E110D82DE904B04CE20140A0E104
:107C9000DA0300EB0400A0E110A81BE90DC0A0E18D
:107CA00010D82DE9000050E304B04CE200C0A0E180
:107CB00020C04B0201E0A0E120D04DE200E0A00195
:107CC0000C00A0E128C04BE20240A0E12CC00BE573
:107CD0001030A0E300C0A0E32C104BE20020E0E352
:107CE00028E00BE524C00BE500408DE50D0000EB1E
:107CF000000050E30100A00310A81BE90DC0A0E1A3
:107D000000D82DE904B04CE204D04DE202C0A0E15D
:107D100003E0A0E10020E0E30C30A0E100E08DE50D
:107D2000000000EB00A81BE930442DE9A4A09FE56A
:107D3000010050E10000501310D04DE20140A0E1DD
:107D400003C0A0E10AA08FE00150A0E30300001AE5
:107D5000000050E300C0E0030D00A0E10050A0E3EC
:107D600002005CE102C0A02100005CE30C10A0E175
:107D7000002094E51200000A003092E57F0053E3F2
:107D80000500009A50209FE502209AE75430A0E3B6
:107D90000000E0E3003082E50C0000EA0030D2E5AC
:107DA000FFE003E200005EE30030C0E50E20A0012A
:107DB0000300000A011051E2042082E2050080E085
:107DC000ECFFFF1A0D0050E1002084150C0061E06B
:107DD00010D08DE23084BDE82885FE03000000004D
:107DE0000DC0A0E170D82DE904B04CE20160A0E123
:107DF0000050A0E1DBFAFFEB0040A0E10410A0E19D
:107E00000500A0E10630A0E10120A0E3030000EBA3
:107E1000000050E30040E0030400A0E170A81BE96B
:107E20000DC0A0E130D82DE904B04CE203C0A0E1C0
:107E3000B030D3E1020B13E380E083E3083083E347
:107E40000140A0E10050A0E30210A0E1B030CC114D
:107E50000A00001A000054E30C20A0E1B0E0CCE1DD
:107E60000430A0E10400000A940101E0250000EBC9
:107E70000410A0E1DFF0FFEB0030A0E10350A0E12F
:107E80000500A0E130A81BE90DC0A0E1000052E30D
:107E9000F0D92DE904B04CE20280A0E10060A0E13D
:107EA0000170A0E10250A0E11400000A343096E510
:107EB000000055E30540A0A10241E0B3000053E3F8
:107EC0000710A0E10420A0E10000E0032C009615BB
:107ED0000FE0A01103F0A011000050E3B030D6B1C4
:107EE000083083B3B030C6B1040000BA040050E1DA
:107EF0000400A0C1005055E0007087E0EAFFFF1ABF
:107F0000080065E0F0A91BE90DC0A0E1F0DF2DE954
:107F100004B04CE208D04DE2B030D2E178A29FE547
:107F2000205013E20240A0E103C0A0E10070A0E1F4
:107F30000180A0E10AA08FE00700000A083083E377
:107F4000B030C2E154329FE503309AE70920A0E344
:107F50000000A0E3002083E5F0AF1BE9016A13E213
:107F60001400000A1C2092E5203094E5030052E141
:107F70000100003A03001CE30900000A010B1CE3A6
:107F80000120A0030220A0130400A0E10510A0E13D
:107F9000B50300EB000050E3B030D4110500A01190
:107FA0001700001A143094E5243084E5203084E56D
:107FB0001C3084E5150000EA093B03E2010B53E3A2
:107FC0001200001A0030A0E30020A0E328104BE2CA
:107FD0000C0021E90400A0E10220A0E3710000EB05
:107FE000000050E30900000AB0319FE503309AE732
:107FF000003093E5200053E30400000AB030D4E1E0
:108000000600A0E1083083E3B030C4E1F0AF1BE923
:10801000B030D4E1142094E5033AC3E3000057E301
:10802000282084E5B030C4E10790A0E10100A0E37E
:108030002200001A0C1094E5142094E51C3094E5FD
:10804000020071E3035062E00260A0E10700001A41
:10805000B030D4E1000057E3023A83E3B030C4E12A
:1080600007306910080083100700A001F0AF1BE97A
:108070000210A0E10400A0E10520A0E181FFFFEBD8
:10808000143094E5005055E01C3084E5006086E033
:108090000500000A1C3094E50120D6E40120C3E469
:1080A000015055E21C3084E5F9FFFF1A000057E348
:1080B000142094051C30940503006200F0AF1B09E6
:1080C0001C2094E5143094E5030052E10C00001AE2
:1080D000183094E5033062E0080053E10800008A9C
:1080E0000C3094E5020073E30500000A0710A0E1DC
:1080F0000820A0E10400A0E162FFFFEB007087E030
:108100001B0000EA183094E5031062E0080051E11A
:108110000810A021000051E30760A0E1088061E0A1
:108120000500000A1C3094E50120D7E40120C3E4D7
:10813000011051E21C3084E5F9FFFF1A000050E302
:108140000B00000A000058E3B9FFFF1AB030D4E179
:10815000010C13E30600000A070056E10400002AA0
:108160000130D6E40A0053E3B1FFFF0A070056E1ED
:10817000FAFFFF3AB020D4E124309FE5033002E05B
:10818000000053E318309405070069E028308405A7
:10819000023A82E3B030C4E1F0AF1BE93883FE035A
:1081A00000000000080B00000DC0A0E110D82DE970
:1081B00004B04CE22CC090E50C3080E203005CE19E
:1081C0000140A0E10230A0E10A00000A383090E549
:1081D000000053E30500000A0C00A0E10FE0A0E15D
:1081E00003F0A0E1000050E30000A0A310A81BA929
:1081F0000000E0E310A81BE90C0090E5060091E800
:10820000C00200EB000051E30030E0B30030A0A357
:10821000030084A80300A0E110A81BE90DC0A0E1A1
:10822000F0DB2DE9000053E304B04CE20CD04DE24A
:108230000260A0E10150A0E10020A0E30370A0E1F2
:108240000080A0E128200BE5060000AA060176E3E5
:10825000007063E20300009A0130A0E328300BE5D0
:10826000005075E20060E6E20090A0E30090C8E5EF
:108270000710A0E10000E0E3DEEFFFEB0710A0E154
:108280002C000BE50000E0E32CF0FFEB010080E2A6
:10829000070050E12C201B05012082020630A0E1DE
:1082A0002C200B0530000BE50560A0E130900B059C
:1082B0000390A0E10900A0E10710A0E11FF0FFEB8F
:1082C0000710A0E10040A0E10900A0E1C9EFFFEB29
:1082D0000710A0E10090A0E10600A0E117F0FFEB7D
:1082E00030501BE50710A0E1940525E00600A0E151
:1082F000C0EFFFEB2C301BE50710A0E1930424E056
:108300000500A0E1BBEFFFEB0710A0E10030A0E10A
:108310000500A0E1036084E008F0FFEB090050E3F2
:1083200004209B85303080E2018048E2023080806A
:10833000092096E10050A0E10030C8E5DCFFFF1AFB
:1083400028301BE5000053E32D30A01301306815E1
:108350000800A0E1F0AB1BE90DC0A0E10E002DE983
:1083600000D82DE910B04CE204109BE508208BE208
:10837000BFFBFFEB00A81BE90DC0A0E170DC2DE9FD
:1083800010A19FE504B04CE20CD04DE20040A0E10A
:108390000150A0E10AA08FE00010A0E3A420A0E318
:1083A000FFFDFFEB183094E500C0A0E31C104BE28A
:1083B000013043E2183084E5045021E50020E0E379
:1083C000005084E50C00A0E128304BE228C00BE50A
:1083D000640200EB010070E3286084120620A01103
:1083E0000A00A0130500001AAC309FE503308AE0B4
:1083F000003084E570AC1BE90000E0E370AC1BE9E1
:108400000830A0E3010050E2043082E4FBFFFF1AD1
:108410000030D5E5000053E30520A0E11000000A7C
:108420000030D2E5250053E30900001A0130F2E5DF
:10843000250053E30600000A002084E50400A0E1C3
:10844000A80000EB000050E3002094A5010000AA62
:10845000E8FFFFEA012082E20030D2E5000053E3AA
:10846000EEFFFF1A180094E5010050E2005084E589
:108470000620A0E10500004A003092E5080053E321
:10848000DCFFFF0A010050E2042082E2F9FFFF5AFC
:108490000000A0E370AC1BE9D87EFE03D89D01FC70
:1084A0000DC0A0E130D82DE9185090E50030A0E3D0
:1084B000030055E104B04CE20040A0E1501080E51B
:1084C00030A81BD9083080E51C5080E5183080E5C5
:1084D000043080E5010000EB185084E530A81BE96A
:1084E00018C090E500005CE310402DE9541080E2D4
:1084F000083090E53900001A020153E30400001A25
:10850000503090E5042093E4503080E5082080E569
:10851000542080E5043090E5020153E30400001A82
:10852000503090E5042093E4503080E5042080E54D
:10853000542080E51C3090E503005CE1320000AA85
:108540000C3180E0282093E5070052E301C08CE263
:108550001300000A180000DA020C52E31600000AA9
:10856000020000CA080052E31800000A120000EAE4
:10857000020B52E30400000A0F0000DAB8309FE556
:10858000030052E10600000A0B0000EA502090E5CB
:10859000083082E2503080E5180092E8180081E847
:1085A000090000EA502090E5083082E2503080E572
:1085B000180092E8180081E8030000EA503090E5C6
:1085C000042093E4503080E5002081E5081081E22A
:1085D0001C3090E503005CE1D8FFFFBA0A0000EA16
:1085E000020153E32430D0058331810008301305A4
:1085F00008308005043090E5020153E32530D005B2
:10860000833181000830130504308005081090E59F
:10861000000051E31080BDA8103090E5083083E3DE
:10862000001061E20130C3E32020A0E3142080E5C4
:10863000081080E5103080E51080BDE807080000D4
:1086400000442DE940A09FE540109FE50AA08FE07F
:1086500001308AE0182083E2F23072E1000053E139
:108660000200000A01308AE0030052E1F9FFFF8AAC
:1086700018309FE503308AE0023063E010209FE568
:1086800002208AE0C300D2E70084BDE8207CFE031C
:10869000FC9D01FC149E01FC0DC0A0E1080051E30B
:1086A00030D82DE904B04CE20150A0E10040A0E335
:1086B0000A00000A010050E1080050130140A0E345
:1086C0000600000ADDFFFFEB0040A0E10500A0E18D
:1086D000DAFFFFEB000054E10040A0C30140A0D34B
:1086E0000400A0E130A81BE90DC0A0E1F0DF2DE9F6
:1086F00004B04CE25CD04DE2103090E50020A0E3E5
:1087000080E013E20830A0E3C8A49FE54C300BE5FD
:108710005C200BE558200BE550300BE50010E0E342
:108720000060A0E10280A0E10AA08FE080100BE5CC
:10873000189090E502C0A0E1005090050F00000ADB
:108740007B504BE20240A0E128104BE2003096E55E
:10875000043183E0042053E5542041E5043013E55F
:10876000030052E11101001A011081E2553051E578
:10877000000053E3014084E2F3FFFF1A5D304BE554
:108780000030D5E52A0053E30500A0E10700001AF8
:1087900000005CE328204BE20430A0130030A0036B
:1087A000023083E00020A0E3282003E5015085E2A9
:1087B0000010D5E5303041E2090053E30040A0E36A
:1087C0000800008A10349FE5030054E1043184D08E
:1087D000833081D00110F5E5304043D2303041E2A2
:1087E000090053E3F6FFFF9A013050E5250053E3FB
:1087F0002F00001A0020D5E5000054E30030A0D37C
:108800000130A0C3240052E30030A0130130030262
:10881000000053E30600000A000059E3015085E21E
:10882000E200000A090054E10490A0C154400BE5A5
:108830000E0000EA000059E3050000DA6D0052E383
:108840001B00000AD90000EA04E08EE1015085E235
:10885000060000EA000055E10390A0E10200009A42
:108860000030D0E5300053E31100001A0050A0E1C1
:1088700068339FE50140A0E303008AE00020D5E5CE
:108880000130D0E4030052E1EEFFFF0A0020D0E502
:10889000000052E38440A0E1F7FFFF1A013055E5E4
:1088A000250053E30A300EE20240A0E1A3E0CEE14E
:1088B000B2FFFF1A0030D0E52A0053E31100001A7E
:1088C000000059E30B00000A0130D5E4240053E313
:1088D000B600001A000054E3B40000DA00005CE3C4
:1088E0000430A0130030A00328104BE2013083E0D5
:1088F000344003E5020000EA010080E2050050E197
:10890000AA00001A0241A0E300005CE30600001A7E
:108910000030D5E52E0053E30480A0E1015085022C
:1089200000C0E00395FFFF0A000000EA80400BE56D
:10893000AC129FE501008AE00020D5E50030D0E5CB
:10894000030052E1015085020200000A0130F0E507
:10895000000053E3F7FFFF1A01308AE0003063E0C4
:10896000010053E3040000CA0020D5E50030D0E543
:10897000030052E109008002015085020020D5E584
:108980000930D0E5000052E303C4A0E18700000AEB
:1089900050729FE507008AE00030D0E5030052E105
:1089A0001A00001A07308AE0002063E0110052E349
:1089B000010000DA010B1CE30220421228129FE59D
:1089C00084200BE501308AE0010043E20130F0E54C
:1089D000030052E1FCFFFFCA01308AE0004063E07F
:1089E00008329FE58410A0E103308AE0F32091E192
:1089F000FC319FE503308AE0F33091E102208CE105
:108A0000032002E007008AE048200BE5020000EAAC
:108A10000130F0E5000053E3DEFFFF1A0010D5E55A
:108A200004001EE30F3C0CE20420CEE3032082E1AD
:108A30000C1086E52030A0033030A01380101BE519
:108A4000143086E50130A0E3020186E9102086E5B6
:108A50001C3086E50030D0E5000053E32300001A07
:108A60000020D5E56D0052E31420A00384200B05FF
:108A70001C3086051D00000A78119FE501309AE739
:108A8000000093E51530A0E384300BE50030D0E51D
:108A9000020053E10E00001A58319FE503309AE7B7
:108AA00000C093E550319FE500C06CE00810A0E3E2
:108AB000040086E248204BE203309AE70FE0A0E191
:108AC0000CF193E7080050E31C0086E5070000DA8C
:108AD000360000EA01309AE7003093E5010080E2B9
:108AE0000A3083E2030050E1E7FFFF3A2F0000EA7B
:108AF000000059E31D0000DA0040A0E328804BE2AB
:108B0000020054E354301BC5342058D5043083C0D0
:108B1000063084D0FF1002D2021043C22420C3D5F5
:108B2000090051E1020000DA090051E30190A0E1DF
:108B30001E0000CA011041E2017186E0280097E59D
:108B4000281018E5D3FEFFEB000050E3283018157D
:108B5000283087151C3096E5014084E2023083E21C
:108B6000030054E1048088E2E4FFFFBA060000EA53
:108B70001C2096E50130A0E30221A0E1280086E256
:108B80002630C6E548104BE26EF7FFEB103096E555
:108B900084101BE5800013E301508502189086E5E0
:108BA000201086E5005086050700000A010000EA53
:108BB0000000E0E3F0AF1BE9002096E57C304BE2DB
:108BC000053063E0032182E0002086E51C3096E555
:108BD000020083E2F0AF1BE9447BFE03FE0F0000BE
:108BE000209E01FC669E01FC289E01FC3D9E01FC2E
:108BF000469E01FC569E01FC0C0000002000000077
:108C00000DC0A0E1F0DD2DE9E8A09FE504B04CE245
:108C100038D04DE27C0050E30040A0E10170A0E1BB
:108C20000260A0E10AA08FE01680A0E30D00008A98
:108C3000C4309FE5000050E303509AE70500000AA6
:108C40000030D5E5000053E301404402000054E346
:108C5000015085E2F9FFFF1A0030D5E5000053E32B
:108C60000080A0130C00001A0010A0E1C12FA0E1A9
:108C700000C0A0E327004BE20930E0E300C08DE52F
:108C800065FDFFEB74109FE50E5040E201108AE095
:108C90000500A0E10E20A0E32AF7FFEB0500A0E10C
:108CA00030F7FFEB000057E3014080E20060A003D3
:108CB000060054E10640A0812280A083000054E316
:108CC0000600000A0420A0E10510A0E10700A0E1D1
:108CD0001CF7FFEB042087E00030A0E3013042E501
:108CE000000058E318309F1503309A170080831551
:108CF0000800A0E1F0AD1BE94876FE032400000067
:108D00007C9E01FC0000000070442DE94CA09FE512
:108D10000260A0E10150A0E108D04DE20340A0E1D3
:108D20000610A0E10AA08FE00D30A0E10520A0E12F
:108D30008C0090EF010A70E324209F8502209A871F
:108D400000306082003082850000E083000050E344
:108D5000C01FA01103009D0808D08DE27084BDE8FB
:108D60004875FE03000000000DC0A0E100DC2DE905
:108D70002CA09FE504B04CE204D04DE2000053E388
:108D800003C0A0E10AA08FE018309F0503C08A004D
:108D90000230A0E10020E0E300C08DE5020000EB1E
:108DA00000AC1BE9E874FE033803000010442DE911
:108DB00004D04DE210C09DE5A0A09FE500005CE35B
:108DC00003E0A0E10AA08FE094309F0503C08A0071
:108DD0000C0050E1000050130140A0E30300001A12
:108DE000000050E300E0E0030D00A0E10040A0E33C
:108DF00002005EE102E0A02100005EE30EC0A0E1FF
:108E0000002091E51000000A0030D2E5000053E395
:108E1000003080E50320A0010B00000A7F0053E32F
:108E2000050000DA3C209FE502209AE75430A0E3D9
:108E30000000E0E3003082E5060000EA01C05CE2E9
:108E4000012082E2040180E0EEFFFF1A0D0050E1F4
:108E5000002081150E006CE004D08DE21084BDE886
:108E6000A874FE03400300000000000030402DE91C
:108E70000140A0E1C45FA0E10230A0E10520A0E133
:108E80000410A0E13040BDE8FFFFFFEA0DC0A0E103
:108E900070DC2DE9BCA09FE504B04CE208D04DE2A7
:108EA000020053E30350A0E10AA08FE00040A0E1DC
:108EB0000500009AA0209FE502209AE71630A0E363
:108EC0000000E0E3003082E570AC1BE9B030D0E197
:108ED000020A13E320304BE2060003E80060E0E3FF
:108EE0000200000A460000EB000050E31700001AE1
:108EF000010055E30400001A24104BE20400A0E135
:108F0000160000EB000050E3100000BA24104BE202
:108F10000520A0E10400A0E1A2FCFFEB000050E36B
:108F20000A0000BAB030D4E1142094E5033AC3E358
:108F30000010A0E30730C3E3242084E5B030C4E18F
:108F4000401084E5202084E51C2084E50160A0E138
:108F50000600A0E170AC1BE9C473FE030000000032
:108F600010402DE9B0E0D0E103C00EE200005CE368
:108F70000140A0E10B00000A020B1EE30900000AF9
:108F80000230D0E501005CE303308CE001C043E235
:108F9000020000CA083090E5000053E30100000A17
:108FA0000000E0E31080BDE8020A1EE31C309015CB
:108FB00014209015033062100CC06310010A1EE3E8
:108FC000202080120C00121802304310030094E895
:108FD00003C08C100C2050E0CC3FC1E0010053E1F5
:108FE0000C0084E8020000CA0300001A000052E1ED
:108FF0000100009A00006CE21080BDE80C00A0E1C6
:109000001080BDE80DC0A0E170DC2DE9A0A09FE5B7
:10901000A0309FE50AA08FE003309AE70050A0E35C
:10902000030050E10040A0E10540A001036CA0E373
:10903000016CA003000054E304B04CE21000001ADD
:10904000004093E5000054E31700000AB020D4E18B
:10905000023C22E2060013E10500000A020A12E3C4
:109060000300000A0400A0E1E5FFFFEB000050E36D
:109070000050E013104094E5000054E3F2FFFF1AA3
:10908000090000EAB030D4E1020A13E30600000A46
:109090000500A0E10510A0E10420A0E199FBFFEB91
:1090A000000050E30050A0030050E0130500A0E1D1
:1090B00070AC1BE95872FE0328000000000090E528
:1090C000610000EA000090E56D0000EA000090E514
:1090D000790000EA0DC0A0E110DC2DE958A09FE561
:1090E00004B04CE20AA08FE00000A0E3C4FFFFEB55
:1090F00048309FE503309AE7004093E5000054E3D1
:1091000010AC1B092C0094E50C3084E2030050E104
:109110000500000A3C3094E5000053E30FE0A01185
:1091200003F0A0110030A0E32C3084E5104094E55A
:10913000000054E310AC1B09F1FFFFEA8871FE0345
:10914000280000000DC0A0E170DC2DE950A09FE5D3
:1091500050309FE50AA08FE003509AE704B04CE23C
:109160000000A0E3006095E5100000EB38409FE5AB
:10917000B4309AE1010060E2003423E0B4308AE1C7
:109180000100A0E3090000EB04408AE0B834D4E118
:10919000010060E2003423E0B834C4E1006085E5FA
:1091A00070AC1BE91871FE03000000006C000000A9
:1091B0000DC0A0E100D82DE904B04CE23CD04DE256
:1091C00048104BE2030000EB000050E30000A01346
:1091D0000100A00300A81BE90DC0A0E130D82DE9D3
:1091E00004B04CE224D04DE20140A0E138204BE233
:1091F00050109FE54C0000EB34201BE530104BE293
:10920000021091E828E05BE538301BE50050A0E152
:10921000003084E5042084E5081084E50CC084E572
:1092200010E0C4E527104BE2110084E21320A0E314
:10923000440000EB0010A0E30D20A0E358FAFFEB80
:109240000500A0E130A81BE90154000000442DE90D
:1092500024A09FE50AA08FE0030090EF010A70E3CD
:109260000084BD9814209FE502209AE7003060E258
:109270000000E0E3003082E50084BDE81870FE03E2
:109280000000000000442DE924A09FE50AA08FE023
:10929000040090EF010A70E30084BD9814209FE55C
:1092A00002209AE7003060E20000E0E3003082E54F
:1092B0000084BDE8E06FFE030000000000442DE9DB
:1092C00024A09FE50AA08FE0060090EF010A70E35A
:1092D0000084BD9814209FE502209AE7003060E2E8
:1092E0000000E0E3003082E50084BDE8A86FFE03E3
:1092F0000000000000442DE924A09FE50AA08FE0B3
:10930000360090EF010A70E30084BD9814209FE5B9
:1093100002209AE7003060E20000E0E3003082E5DE
:109320000084BDE8706FFE03000000000DC0A0E1E6
:109330000E002DE900D82DE910B04CE206009BE9A3
:10934000EBFFFFEB00A81BE9000052E30EF0A001C9
:109350000130D1E4012052E20130C0E40EF0A0015E
:10936000FAFFFFEA0DC0A0E1F0D92DE904B04CE20C
:1093700050C04BE238D04DE234804BE20150A0E1C6
:109380000040A0E148704BE20C00A0E158604BE2C5
:109390000810A0E10C0086E830008CE87EF4FFEBBA
:1093A0000600A0E10710A0E17BF4FFEB0800A0E1BC
:1093B0000D0000EB0030A0E1000053E30700A0E146
:1093C0000100000A0100A0E3F0A91BE9060000EB80
:1093D0000030A0E1000053E30800A0E10710A0E185
:1093E000F7FFFF1ABFF4FFEBF0A91BE9000090E5BF
:1093F000010050E30000A0830100A0930EF0A0E163
:10940000A8610000202020202020202020202020D3
:109410002020202000000000120100020200004075
:1094200083044057000101020301090243000201C5
:1094300000C0000904000001020201000524001020
:10944000010524010001042402020524060001078D
:109450000582030800FF09040100020A000000075A
:1094600005030240000007058102400000040309D3
:109470000426037700770077002E004D0069006B0B
:109480000072006F004B006F007000740065007286
:10949000002E00640065003C034D0069006B007203
:1094A000006F004B006F00700074006500720020B8
:1094B000005600690072007400750061006C0020A5
:1094C0000043004F004D00200050006F00720074F8
:1094D00000200016034D004B00200020002000312A
:1094E000002E00300030003000000000211042202B
:1094F00063308440A550C660E770088129914AA175
:109500006BB18CC1ADD1CEE1EFF1311210027332EB
:109510005222B5529442F772D662399318837BB3C4
:109520005AA3BDD39CC3FFF3DEE36224433420047B
:109530000114E664C774A44485546AA54BB5288514
:109540000995EEE5CFF5ACC58DD5533672261116CB
:109550003006D776F6669556B4465BB77AA7199764
:109560003887DFF7FEE79DD7BCC7C448E558866853
:10957000A7784008611802282338CCC9EDD98EE9B4
:10958000AFF9488969990AA92BB9F55AD44AB77A2B
:10959000966A711A500A333A122AFDDBDCCBBFFB04
:1095A0009EEB799B588B3BBB1AABA66C877CE44C3B
:1095B000C55C222C033C600C411CAEED8FFDECCD54
:1095C000CDDD2AAD0BBD688D499D977EB66ED55E0B
:1095D000F44E133E322E511E700E9FFFBEEFDDDFA4
:1095E000FCCF1BBF3AAF599F788F8891A981CAB130
:1095F000EBA10CD12DC14EF16FE18010A100C23062
:10960000E3200450254046706760B9839893FBA31C
:10961000DAB33DC31CD37FE35EF3B1029012F322B1
:10962000D2323542145277625672EAB5CBA5A8956C
:1096300089856EF54FE52CD50DC5E234C324A01401
:1096400081046674476424540544DBA7FAB79987FC
:10965000B8975FE77EF71DC73CD7D326F236910651
:10966000B01657667676154634564CD96DC90EF944
:109670002FE9C899E9898AB9ABA9445865480678A1
:109680002768C018E1088238A3287DCB5CDB3FEB5C
:109690001EFBF98BD89BBBAB9ABB754A545A376AF1
:1096A000167AF10AD01AB32A923A2EFD0FED6CDD2C
:1096B0004DCDAABD8BADE89DC98D267C076C645C41
:1096C000454CA23C832CE01CC10C1FEF3EFF5DCF3C
:1096D0007CDF9BAFBABFD98FF89F176E367E554E91
:1096E000745E932EB23ED10EF01E0000000000000A
:1096F0001F0000003C0000005B000000790000003B
:1097000098000000B6000000D5000000F400000042
:1097100012010000310100004F0100006E01000045
:10972000000000001F0000003B0000005A00000085
:109730007800000097000000B5000000D400000091
:10974000F300000011010000300100004E01000094
:109750006D010000416E676C654E69636B202020CF
:1097600020202020416E676C65526F6C6C20202099
:10977000202020204163634E69636B20202020203D
:1097800020202020416363526F6C6C202020202019
:1097900020202020202020202020202020202020C9
:1097A00020202020202020202020202020202020B9
:1097B00020202020202020202020202020202020A9
:1097C0002020202020202020202020202020202099
:1097D0002020202020202020202020202020202089
:1097E0002020202020202020202020202020202079
:1097F0002020202020202020202020202020202069
:1098000020202020475053204461746120202020D4
:1098100020202020535049204572726F7220202052
:1098200020202020535049204F6B61792020202098
:1098300020202020493243204572726F7220202060
:1098400020202020493243204F6B617920202020A6
:109850002020202020202020202020202020202008
:10986000202020204143435F53706565645F4E2094
:10987000202020204143435F53706565645F45208D
:1098800020202020202020202020202020202020D8
:1098900020202020202020202020202020202020C8
:1098A000202020204E5F53706565642020202020FA
:1098B00020202020455F53706565642020202020F3
:1098C00020092000202020202020202020202020CF
:1098D0002020202020202020202020202020202088
:1098E000202020204779726F48656164696E672087
:1098F00020202020436F6D70617373486561646937
:109900006E67202044697374616E6365204E202069
:109910002020202044697374616E636520452020F7
:10992000202020204750535F4E69636B2020202069
:10993000202020204750535F526F6C6C2020202045
:1099400020202020557365645F53617473202020AC
:10995000202020203C3F786D6C2076657273696F03
:109960006E3D22312E302220656E636F64696E6712
:109970003D225554462D38223F3E0D0A3C6B6D6CFE
:1099800020786D6C6E733D22687474703A2F2F6569
:10999000617274682E676F6F676C652E636F6D2FD1
:1099A0006B6D6C2F322E32223E0D0A3C446F637574
:1099B0006D656E743E0D0A3C6E616D653E4D696B62
:1099C000726F6B6F7074657220475053206C6F67B5
:1099D00067696E673C2F6E616D653E0D0A0D0A3C2E
:1099E0005374796C652069643D224D4B5F677073D9
:1099F0002D7374796C65223E0D0A3C4C696E65537B
:109A000074796C653E0D0A3C636F6C6F723E6666DE
:109A10003030303066663C2F636F6C6F723E0D0ADB
:109A20003C77696474683E323C2F77696474683EA1
:109A30000D0A3C2F4C696E655374796C653E0D0AB6
:109A40003C2F5374796C653E0D0A00003C2F446F27
:109A500063756D656E743E0D0A3C2F6B6D6C3E0D2B
:109A60000A0000003C506C6163656D61726B3E0DD5
:109A70000A3C6E616D653E466C696768743C2F6E8A
:109A8000616D653E0D0A3C7374796C6555726C3E70
:109A9000234D4B5F6770732D7374796C653C2F7326
:109AA00074796C6555726C3E0D0A00003C2F506C49
:109AB0006163656D61726B3E0D0A00003C4C696E1E
:109AC00065537472696E673E0D0A3C746573736505
:109AD0006C6C6174653E313C2F74657373656C6C9E
:109AE0006174653E0D0A3C616C7469747564654D02
:109AF0006F64653E72656C6174697665546F477218
:109B00006F756E643C2F616C7469747564654D6F1C
:109B100064653E0D0A3C636F6F7264696E617465C3
:109B2000733E0D0A000000000D0A3C2F636F6F7238
:109B300064696E617465733E0D0A3C2F4C696E65F5
:109B4000537472696E673E0D0A0000001F6EA50116
:109B500059F3F8C20000000000000000FB21E93FBB
:109B6000182D4454FB21F93F182D4454FB21094082
:109B7000182D445426A6A13C075C143383F9A20097
:109B8000444E6E00FC291500D1572700DD34F50046
:109B900062DBC0003C999500419043006351FE0098
:109BA000BBDEAB00B761C5003A6E2400D24D420067
:109BB0004906E00009EA2E001C92D100EB1DFE00D0
:109BC00029B11C00E83EA700F535820044BB2E00F9
:109BD0009CE98400B4267000417E5F00D691390074
:109BE000538339009CF439008B5F840028F9BD0051
:109BF000F81F3B00DEFF97000F980500112FEF00C4
:109C00000A5A8B006D1F6D00CF7E360009CB2700EE
:109C1000464FB7009E663F002DEA5F00BA277500E9
:109C2000E5EBC7003D7BF100F739070092528A004F
:109C3000FB6BEA001FB15F00085D8D00300356002A
:109C40007BFC4600F0AB6B0020BCCF0036F49A00E2
:109C5000E3A91D005E619100081BE600859965007F
:109C6000A0145F008D40680080D8FF0027734D006E
:109C700006063100CA561500C9A873007BE26000D1
:109C80006B8CC000FB21F93FFB2109407CD91240BD
:109C9000FB2119407A6A1F407CD92240BBFD254038
:109CA000FB2129403A462C407A6A2F405C473140DC
:109CB0007CD932409C6B3440BBFD3540DB8F374054
:109CC000FB2139401BB43A403A463C405AD83D400B
:109CD0007A6A3F404C7E40405C4741406C104240B5
:109CE0007CD942408CA243409C6B4440AC344540FC
:109CF000BBFD4540CBC64640DB8F4740EB58484054
:109D0000FB21494000000000000000000000E03F8F
:109D1000000000000000704100000000305FE43FE0
:109D200083C8C96DFB21F93F0000405461B4D03DA8
:109D30003163621A61B4D03D0000601A8A19A33BF6
:109D40007370032E8A19A33B0000002E9A837B397F
:109D5000C14920250000F03F000000001F6EA50152
:109D600059F3F8C20000F03F000000005555A53F30
:109D70004C5555556CC156BF7751C116A001FA3EDE
:109D80009015CB194F7E92BEAD529C809EEE213E27
:109D9000C4B1B4BDE9FAA8BDD43888BE0200000041
:109DA000030000000400000006000000FB21F93F52
:109DB000000000402D44743E000000009846F83C2E
:109DC0000000008051CC783B00000060831BF0391C
:109DD0000000008020257A38000000402282E3360F
:109DE000000000801DF36935000000000000000045
:109DF000000000000000F03F000000000000704183
:109E0000000000000000703E000000000000E03F85
:109E1000000000005555C5BF495555551111813FEA
:109E2000A6F81011A0012ABFD561C119E31DC73ED4
:109E30007DFEB157E6E55ABEEB9C2B8A3AD9E53D4B
:109E40007CD5CF5A67ACDD3F4FBB6105FB21E93FB5
:109E5000182D44540B73EF3F9BF681D2FB21F93F41
:109E6000182D44547F2B7A3CE2652F2226A6813C94
:109E7000075C14338807703CBDCBF07A26A6913C72
:109E8000075C14335555D53F0D5555559999C9BFA4
:109E9000C4EB98992449C23FFF830092C671BCBFAE
:109EA000711623FECD45B73F6E204CC5F2B0B3BF4F
:109EB0006D9A74AF660DB13F513DD0A02DDEADBFA0
:109EC0009AFDDE524B7BA93FEB0D762444B4A2BF32
:109ED0002F6C6A2C3AAD903F11DA22E30000F03F7C
:109EE000000000003CE4377E9C7500883CE4377E2F
:109EF0009C75008800005043000000000000903C6A
:109F0000000000003CE4377E9C7500881F6EA501B0
:109F100059F3F8C20000000000000000000000003B
:109F20000000000000000000000000000000000031
:109F30000000000000000000000102020303030310
:109F400004040404040404040505050505050505C9
:109F500005050505050505050606060606060606A9
:109F60000606060606060606060606060606060691
:109F70000606060606060606070707070707070779
:109F80000707070707070707070707070707070761
:109F90000707070707070707070707070707070751
:109FA0000707070707070707070707070707070741
:109FB0000707070707070707080808080808080829
:109FC0000808080808080808080808080808080811
:109FD0000808080808080808080808080808080801
:109FE00008080808080808080808080808080808F1
:109FF00008080808080808080808080808080808E1
:10A0000008080808080808080808080808080808D0
:10A0100008080808080808080808080808080808C0
:10A0200008080808080808080808080808080808B0
:10A030000808080808080808101010080A0A0A008A
:10A040002B002D002000307800305800496E7661DA
:10A050006C6964206D756C74696279746520666FD3
:10A06000726D617420737472696E672E0000000057
:10A0700008000500030004000100000200000004C5
:10A0800000080200070007080001010104020101A5
:10A0900001010101202B302D232749006E707858D3
:10A0A0006F756469664665456747614143536373ED
:10A0B000000001070F101112131500100500000019
:10A0C00007000200040001000300001F0500000F4C
:10A0D00007080200040001000300686C4C6A7A74EF
:10A0E000715A00020408080000080000010800007E
:10A0F000556E6B6E6F776E206572726F7220000006
:10A1000053756363657373004F7065726174696F33
:10A110006E206E6F74207065726D69747465640072
:10A120004E6F20737563682066696C65206F7220BE
:10A130006469726563746F7279004E6F2073756322
:10A14000682070726F6365737300496E7465727214
:10A1500075707465642073797374656D2063616CC8
:10A160006C00496E7075742F6F757470757420650E
:10A1700072726F72004E6F2073756368206465762B
:10A18000696365206F722061646472657373004156
:10A190007267756D656E74206C69737420746F6F6F
:10A1A000206C6F6E67004578656320666F726D6125
:10A1B00074206572726F72004261642066696C651A
:10A1C0002064657363726970746F72004E6F2063F0
:10A1D00068696C642070726F636573736573005295
:10A1E00065736F757263652074656D706F726172EF
:10A1F000696C7920756E617661696C61626C65006D
:10A2000043616E6E6F7420616C6C6F636174652066
:10A210006D656D6F7279005065726D697373696FEA
:10A220006E2064656E6965640042616420616464E7
:10A230007265737300426C6F636B2064657669634B
:10A24000652072657175697265640044657669633D
:10A2500065206F72207265736F7572636520627519
:10A2600073790046696C6520657869737473004979
:10A270006E76616C69642063726F73732D646576AA
:10A28000696365206C696E6B004E6F20737563683F
:10A2900020646576696365004E6F7420612064698F
:10A2A000726563746F72790049732061206469720A
:10A2B0006563746F727900496E76616C69642061C0
:10A2C0007267756D656E7400546F6F206D616E7985
:10A2D000206F70656E2066696C657320696E2073EF
:10A2E000797374656D00546F6F206D616E79206FA6
:10A2F00070656E2066696C657300496E617070727E
:10A300006F70726961746520696F63746C20666F29
:10A3100072206465766963650054657874206669A7
:10A320006C6520627573790046696C6520746F6F87
:10A33000206C61726765004E6F20737061636520E9
:10A340006C656674206F6E2064657669636500498C
:10A350006C6C6567616C207365656B005265616448
:10A360002D6F6E6C792066696C65207379737465E6
:10A370006D00546F6F206D616E79206C696E6B7328
:10A380000042726F6B656E2070697065004E756D6E
:10A3900065726963616C20617267756D656E7420AA
:10A3A0006F7574206F6620646F6D61696E004E7505
:10A3B0006D65726963616C20726573756C74206F72
:10A3C0007574206F662072616E6765005265736FE9
:10A3D0007572636520646561646C6F636B20617680
:10A3E0006F696465640046696C65206E616D652007
:10A3F000746F6F206C6F6E67004E6F206C6F636BB5
:10A400007320617661696C61626C650046756E638C
:10A4100074696F6E206E6F7420696D706C656D6508
:10A420006E746564004469726563746F7279206E3E
:10A430006F7420656D70747900546F6F206D616E5C
:10A4400079206C6576656C73206F662073796D6218
:10A450006F6C6963206C696E6B7300004E6F206DCA
:10A46000657373616765206F6620646573697265E3
:10A47000642074797065004964656E746966696505
:10A48000722072656D6F766564004368616E6E65FB
:10A490006C206E756D626572206F7574206F66201A
:10A4A00072616E6765004C6576656C2032206E6F58
:10A4B000742073796E6368726F6E697A6564004C9C
:10A4C0006576656C20332068616C746564004C654A
:10A4D00076656C2033207265736574004C696E6B11
:10A4E000206E756D626572206F7574206F662072C4
:10A4F000616E67650050726F746F636F6C20647279
:10A5000069766572206E6F7420617474616368652A
:10A5100064004E6F204353492073747275637475E1
:10A52000726520617661696C61626C65004C65766C
:10A53000656C20322068616C74656400496E7661D8
:10A540006C69642065786368616E676500496E7642
:10A55000616C6964207265717565737420646573DC
:10A5600063726970746F720045786368616E6765C5
:10A570002066756C6C004E6F20616E6F64650049DB
:10A580006E76616C696420726571756573742063A1
:10A590006F646500496E76616C696420736C6F74DA
:10A5A000000042616420666F6E742066696C6520ED
:10A5B000666F726D617400446576696365206E6FC5
:10A5C0007420612073747265616D004E6F20646148
:10A5D000746120617661696C61626C650054696DBB
:10A5E00065722065787069726564004F7574206FBC
:10A5F000662073747265616D73207265736F757216
:10A60000636573004D616368696E65206973206ED0
:10A610006F74206F6E20746865206E6574776F723A
:10A620006B005061636B616765206E6F7420696EAB
:10A630007374616C6C6564004F626A656374206951
:10A64000732072656D6F7465004C696E6B20686174
:10A6500073206265656E207365766572656400417E
:10A660006476657274697365206572726F720053E7
:10A67000726D6F756E74206572726F7200436F6DCC
:10A680006D756E69636174696F6E206572726F7249
:10A69000206F6E2073656E640050726F746F636F0D
:10A6A0006C206572726F72004D756C7469686F70A2
:10A6B00020617474656D7074656400524653207334
:10A6C00070656369666963206572726F72004261CA
:10A6D00064206D6573736167650056616C756520F4
:10A6E000746F6F206C6172676520666F722064659D
:10A6F00066696E65642064617461207479706500B8
:10A700004E616D65206E6F7420756E697175652080
:10A710006F6E206E6574776F726B0046696C652092
:10A7200064657363726970746F7220696E20626110
:10A73000642073746174650052656D6F7465206187
:10A74000646472657373206368616E676564004357
:10A75000616E206E6F742061636365737320612086
:10A760006E656564656420736861726564206C69F8
:10A77000627261727900416363657373696E672009
:10A780006120636F727275707465642073686172A2
:10A790006564206C696272617279002E6C69622056
:10A7A00073656374696F6E20696E20612E6F7574B6
:10A7B00020636F7272757074656400417474656DA6
:10A7C0007074696E6720746F206C696E6B20696E9F
:10A7D00020746F6F206D616E79207368617265649B
:10A7E000206C69627261726965730043616E6E6F9D
:10A7F00074206578656320612073686172656420E8
:10A800006C696272617279206469726563746C79D3
:10A8100000496E76616C6964206F7220696E636FA7
:10A820006D706C657465206D756C746962797465A2
:10A83000206F722077696465206368617261637458
:10A84000657200496E746572727570746564207308
:10A85000797374656D2063616C6C2073686F756CBF
:10A86000642062652072657374617274656400535C
:10A87000747265616D732070697065206572726FA6
:10A880007200546F6F206D616E79207573657273FD
:10A8900000536F636B6574206F7065726174696FCC
:10A8A0006E206F6E206E6F6E2D736F636B6574001C
:10A8B00044657374696E6174696F6E20616464725B
:10A8C000657373207265717569726564004D657397
:10A8D0007361676520746F6F206C6F6E67005072D4
:10A8E0006F746F636F6C2077726F6E67207479700E
:10A8F0006520666F7220736F636B65740050726FB2
:10A90000746F636F6C206E6F7420617661696C6127
:10A91000626C650050726F746F636F6C206E6F7441
:10A9200020737570706F7274656400536F636B652C
:10A93000742074797065206E6F7420737570706FF9
:10A9400072746564004F7065726174696F6E206E19
:10A950006F7420737570706F727465640050726FDD
:10A96000746F636F6C2066616D696C79206E6F74B3
:10A9700020737570706F72746564004164647265F1
:10A9800073732066616D696C79206E6F74207375C6
:10A9900070706F727465642062792070726F746F6A
:10A9A000636F6C004164647265737320616C7265DF
:10A9B00061647920696E207573650043616E6E6F06
:10A9C000742061737369676E207265717565737445
:10A9D00065642061646472657373004E6574776F9B
:10A9E000726B20697320646F776E004E6574776FA9
:10A9F000726B20697320756E726561636861626C49
:10AA000065004E6574776F726B2064726F7070654D
:10AA10006420636F6E6E656374696F6E206F6E2065
:10AA2000726573657400536F667477617265206335
:10AA3000617573656420636F6E6E656374696F6EB4
:10AA40002061626F727400436F6E6E656374696F2C
:10AA50006E2072657365742062792070656572007E
:10AA60004E6F206275666665722073706163652043
:10AA7000617661696C61626C65005472616E7370BD
:10AA80006F727420656E64706F696E7420697320D4
:10AA9000616C726561647920636F6E6E6563746565
:10AAA00064005472616E73706F727420656E6470AE
:10AAB0006F696E74206973206E6F7420636F6E6EA1
:10AAC00065637465640043616E6E6F742073656EB8
:10AAD00064206166746572207472616E73706F7247
:10AAE0007420656E64706F696E7420736875746429
:10AAF0006F776E00546F6F206D616E79207265669E
:10AB00006572656E6365733A2063616E6E6F742063
:10AB100073706C69636500436F6E6E656374696F13
:10AB20006E2074696D6564206F757400436F6E6E7E
:10AB3000656374696F6E207265667573656400483D
:10AB40006F737420697320646F776E004E6F20728C
:10AB50006F75746520746F20686F7374004F706533
:10AB6000726174696F6E20616C72656164792069CD
:10AB70006E2070726F6772657373004F70657261DB
:10AB800074696F6E206E6F7720696E2070726F67C8
:10AB900072657373005374616C65204E4653206672
:10ABA000696C652068616E646C65005374727563CE
:10ABB00074757265206E6565647320636C65616E83
:10ABC000696E67004E6F7420612058454E495820C9
:10ABD0006E616D656420747970652066696C6500CE
:10ABE0004E6F2058454E49582073656D6170686FEF
:10ABF00072657320617661696C61626C650049738E
:10AC00002061206E616D65642074797065206669CD
:10AC10006C650052656D6F746520492F4F20657219
:10AC2000726F72004469736B2071756F7461206577
:10AC300078636565646564004E6F206D6564697551
:10AC40006D20666F756E640057726F6E67206D655C
:0CAC50006469756D207479706500000067
:10AC5C000A0D204E6176694374726C205625642E61
:10AC6C0025642563000000004C4F472F25303469C4
:10AC7C0025303269253032692F47505325303569DC
:10AC8C002E4B4D4C000000006E6F20464320636F2E
:10AC9C006D6D756E69636174696F6E2000000000E4
:10ACAC006E6F204D4B334D616720636F6D6D756E0C
:10ACBC0069636174696F6E20000000004643206E6A
:10ACCC006F7420636F6D70617469626C6520000035
:10ACDC004D4B334D6167206E6F7420636F6D7061E7
:10ACEC007469626C652000006E6F204750532063BE
:10ACFC006F6D6D756E69636174696F6E2000000015
:10AD0C0062616420636F6D706173732076616C7522
:10AD1C00652000005243205369676E616C206C6F94
:10AD2C00737420004E6F204572726F7220202020A9
:10AD3C002020202020202020202020000D0A2D2D36
:10AD4C002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D27
:10AD5C002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D17
:10AD6C002D2D2D2D2D2D2D2D2D2D2D000A0D20565B
:10AD7C00657273696F6E20696E666F726D6174694E
:10AD8C006F6E3A000A0D20466C696768742D437427
:10AD9C00726C206E6F7420636F6D70617469626C7D
:10ADAC00650000000A0D204D4B334D6167206E6F1E
:10ADBC007420636F6D70617469626C6500000000D3
:10ADCC000D0A2D2D2D2D2D2D2D2D2D2D2D2D2D2DEA
:10ADDC002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D97
:10ADEC002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D0DA7
:10ADFC000A0D0A000A0D436F6D6D756E69636174FF
:10AE0C00696F6E2D4572726F723A204D4B334D61E6
:10AE1C00670A0D000D0A4F70656E696E67206B6DC9
:10AE2C006C2D66696C653A20000000000D0A4572B5
:10AE3C00726F72206F70656E696E67206B6D6C2D12
:10AE4C0066696C653A2000000D0A4572726F7220BB
:10AE5C004C6F6767696E672047505320646174615B
:10AE6C000D0A00000D0A436C6F73696E67206B6DE1
:10AE7C006C2D66696C650D0A000000000D0A4162BC
:10AE8C006F72742048616E646C6572000D0A556EA9
:10AE9C00646566696E65642048616E646C657200F9
:10AEAC000D0A50726566657463682048616E646C47
:10AEBC00657200005B25695D000000002B2B2020D3
:10AECC004E6176692D4374726C20202B2B00000090
:10AEDC00205625642E2564256320000020457272BF
:10AEEC003A2564002573000028632920427573738A
:10AEFC002C204275736B6572000000004E6F20476A
:10AF0C0050532064617461004C6F6E3A20202020F5
:10AF1C0020202020202020202020202000000000A5
:10AF2C004C61743A2020202020202020202020203A
:10AF3C002020202000000000416C743A20202020AA
:10AF4C002020202020202020202020200000000075
:10AF5C00536174733A25303264204669783A4E6FE7
:10AF6C006E650000536174733A2530326420466973
:10AF7C00783A324420200000536174733A25303201
:10AF8C0064204669783A334420200000536174737E
:10AF9C003A25303264204669783A3F3F2020000041
:10AFAC004C6F6E3A252B336C642E2530376C642035
:10AFBC00646567004C61743A252B336C642E253024
:10AFCC00376C642064656700416C743A25346C649A
:10AFDC002E2530336C64206D0000000053706565C5
:10AFEC0064204E3A202020202020202020202020C9
:10AFFC0000000000537065656420453A2020202035
:10B00C0020202020202020200000000053706565A7
:10B01C006420543A20202020202020202020202092
:10B02C00000000005370656564204E3A20252B34D7
:10B03C006C6420636D2F7300537065656420453A12
:10B04C0020252B346C6420636D2F73005370656561
:10B05C006420543A20252B346C6420636D2F7300CC
:10B06C00475053205554432054696D65000000002F
:10B07C0020202020202020202020202020202020C4
:10B08C00202020200000000020204E6F2074696DCD
:10B09C0065206461746121202020202000000000C4
:10B0AC00446174653A20253032692F253032692F7E
:10B0BC00253034690000000054696D653A20253054
:10B0CC0032693A253032693A253032692E253033CF
:10B0DC00690000004E6176694D6F64653A20253336
:10B0EC00690000004720203A253369205020203A7F
:10B0FC0025336920000000004920203A25336920BF
:10B10C004420203A25336920000000004143433A93
:10B11C00253369205341543A25336920000000003F
:10B12C00486F6D6520506F736974696F6E00000015
:10B13C002020202020202020202020202020202003
:10B14C002020202020000000202020204973206E89
:10B15C006F74207365742E202020202020000000A6
:10B16C004C6F6E3A2025336C642E2530376C64207E
:10B17C00646567004C61743A2025336C642E25306D
:10B18C00376C64206465670052432D537469636B9C
:10B19C00730000004E693A2534692020526F3A251D
:10B1AC003469200047733A253469202059613A25C7
:10B1BC003469200052432D506F74697300000000F5
:10B1CC00506F313A2533692020506F323A2533695C
:10B1DC0020000000506F333A2533692020506F3423
:10B1EC003A25336920000000496E744E69636B3A4E
:10B1FC002020253569000000496E74526F6C6C3A42
:10B20C0020202535690000004163634E69636B3A69
:10B21C002020253569000000416363526F6C6C3A45
:10B22C0020202535690000004779726F4E69636BE9
:10B23C003A202025346900004779726F526F6C6C8C
:10B24C003A202025346900004779726F5961773AAA
:10B25C00202020253469000052432D4C6576656C06
:10B26C003A202020202533690000000055626174CB
:10B27C003A202020202020202025336900000000C7
:10B28C00436F6D7048656164696E673A2025336958
:10B29C00000000004779726F48656164696E673A17
:10B2AC0020253369000000005550313A25336920C0
:10B2BC00205550323A253369200000005550333A5E
:10B2CC0025336920205550343A253369200000007D
:10B2DC005550353A25336920205550363A25336977
:10B2EC00200000005550373A25336920205550383E
:10B2FC003A253369200000004D4B334D4147205611
:10B30C0025692E25692563004D6167583A2025343F
:10B31C00692000004D6167593A20253469200000EE
:10B32C004D61675A3A2025346920000054696D65D7
:10B33C007220696E69742E2E2E0000006F6B0A0D40
:10B34C00000000000D0A2053504920696E69742ECC
:10B35C002E2E00006F6B00000A0D204E6F207665BC
:10B36C007273696F6E20696E666F726D6174696F4E
:10B37C006E2066726F6D20466C69676874437472D8
:10B38C006C2E00000A0D20466C6967687443747259
:10B39C006C205625642E25642563000020436F6DB8
:10B3AC0070617469626C653A202564000D0A20494D
:10B3BC00324320696E69742E2E2E00000D0A20492E
:10B3CC003243206465696E69742E2E2E00000000D5
:10B3DC000A0D4E6F2076657273696F6E20696E660A
:10B3EC006F726D6174696F6E2066726F6D204D4B5C
:10B3FC00334D61672E0000000A0D204D4B334D611B
:10B40C0067205625642E2564256300000D0A2055FF
:10B41C00534220696E69742E2E2E00000D0A2046B0
:10B42C004154313620696E69742E2E2E00000000B6
:10B43C0053442D4361726420636F756C64206E6F8E
:10B44C007420626520696E697469616C697A6564DF
:10B45C002E0000004572726F722072656164696E15
:10B46C006720746865204D42522E00004572726F41
:10B47C00722072656164696E67207468652056423B
:10B48C00522E00005642523A20536563746F72205C
:10B49C0073697A65206E6F7420737570706F727437
:10B4AC0065642E005642523A20426164206E756DDE
:10B4BC00626572206F6620736563746F72732E0001
:10B4CC005642523A20506172746974696F6E2069E9
:10B4DC007374206E6F742046415431362074797029
:10B4EC00652E00004572726F722025303258207222
:10B4FC00656164696E6720646174612066726F6D4A
:10B50C002073642063617264202852313D253032EF
:10B51C0058292E0D0A0000000D0A204D616E75662B
:10B52C00616374757265722049443A2025690D0A6D
:10B53C0000000000204170706C69636174696F6E6B
:10B54C002049443A2025730D0A0000002050726FE8
:10B55C0064756374204E616D653A2025730D0A0085
:10B56C002050726F64756374205265762E3A2025D4
:10B57C00692E25690D0A00002053657269616C20E3
:10B58C004E6F2E3A2000000025303258000000008B
:10B59C00204D616E756661632E20446174653A209E
:10B5AC0025692F25690D0A0D0A0000000D0A20538C
:10B5BC00534320696E69742E2E2E00000D0A205301
:10B5CC00444320696E69742E2E2E00004261642063
:10B5DC00636D64382052313D253032582E00000006
:10B5EC0042616420636D6438205237206368656360
:10B5FC006B207061747465726E2E0D0A0000000071
:10B60C004361726420697320696E636F6D7061743D
:10B61C0069626C6520746F20332E33562E0D0A0030
:10B62C0042616420636D64353820523120253032FC
:10B63C00782E00004E6F7420616E2053442D4341D0
:10B64C0052442E004361726420697320696E636FEB
:10B65C006D70617469626C6520746F20332E335683
:10B66C002E000000496E6974206572726F722E0094
:10B67C004572726F722073657474696E6720626CA8
:10B68C006F636B206C656E67746820746F20353146
:10B69C00322E00004572726F722072656164696EA1
:10B6AC0067204349442E0D0A000000004572726F5A
:10B6BC00722072656164696E67204353442E0000EA
:10B6CC006F6B0D0A00000000202053442D434152A3
:10B6DC00442056312E7800007265736574207469AD
:10B6EC006D656F75740000004261642041636D6488
:10B6FC0034312052313D253032582E00496E697458
:10B70C002074696D656F75742E0000002020534401
:10B71C002D434152442056322E30206F72206C61E2
:10B72C00746572000D0A202043617061636974793D
:10B73C00203D202569204D42000000004E6F204323
:10B74C0061726420696E20536C6F742E00000000CF
:10B75C000D0A20534443206465696E69742E2E2EA5
:10B76C00000000004572726F72202530325820772D
:10B77C00726974696E67206461746120746F2073E0
:10B78C006420636172642028523D25303258292E82
:10B79C000D0A00002573203D2025640A0D000000D1
:10B7AC000A0D52656164696E672073657474696E05
:10B7BC00672066696C652E2E2E0A0D0073657474F5
:10B7CC00696E67312E747874000000004552524F38
:10B7DC00523A2046696C65206E6F7420666F756EE8
:10B7EC006420210A0D0000003D000000555342204A
:10B7FC0028256C64293A2025730A0D000D0A205562
:10B80C004152543020696E69742E2E2E00000000B7
:10B81C000D0A554152543120696E69742E2E2E6FCB
:10B82C006B0000000D0A20554152543220696E699C
:10B83C00742E2E2E000000000D0A20554152543259
:10B84C00206465696E69742E2E2E00000D0A256C1D
:10B85C00642E2530376C642C0000000020256C64AD
:10B86C002E2530376C642C0020256C642E2530334B
:10B87C006C64000064656661756C742E6B6D6C0095
:10B88C004D494B524F4B4F50544552000D0A2047D7
:10B89C00505320696E69742E2E2E0000286E696C30
:10B8AC0029000000286E756C6C2900000000000057
:10B8BC0025302A6400000000252E2A7300000000A9
:10B8CC00696E6600494E46006E616E004E414E0038
:10B8DC00252A7300252E2A64000000002563252BE1
:04B8EC002E32640094
:10B8F00048656C6C6F20576F726C6400000000002C
:10B900000000000000000000000000000000000037
:10B910000000000000000000000000000000000027
:10B920000000000000000000000000000000000017
:10B930000000000000000000000000000000000007
:10B940000C0000002000000050000000400000003B
:10B950006764656766000000050000005061726161
:10B960006D657465723120202020202031323334FF
:10B970003536373839303132333435363738393077
:10B980003132333435363738393031320100DEC8A0
:10B99000E6506172616D657465723220202020204E
:10B9A000203132333435363738393031323334356B
:10B9B000363738393031323334353637383930313B
:10B9C0003201000000DC506172616D657465723295
:10B9D0003220202020203132333435363738393088
:10B9E0003132333435363738393031323334353615
:10B9F00037383930313201000000DC00BC72000001
:10BA0000181101001811010018110100181101008E
:10BA1000181101001811010018110100181101007E
:10BA2000181101001811010018110100181101006E
:10BA3000181101001811010018110100181101005E
:10BA400040720000181101001811010018110100C6
:10BA5000181101001811010018110100181101003E
:10BA6000181101001811010018110100181101002E
:10BA70001811010000E100000000080004010000AE
:10BA80006C7400003C75000068760000847600004D
:10BA90008876000038770000F8770000787700009B
:10BAA0009C770000C077000000000000400000000C
:10BAB00018110100181101001811010018110100DE
:10BAC00018110100181101001811010018110100CE
:10BAD0001811010018940100120000002A940100BE
:10BAE000430000006D940100040000007194010007
:10BAF00026000000979401003C000000D394010050
:10BB0000160000000000000000000000010000001E
:10BB100000E100E1FF0000000050005C0164000053
:10BB2000E8030000E8030000FFFFFFFF0DC0A0E1F5
:10BB300000D82DE904B04CE21523A0E30010A0E3E7
:10BB4000041082E50630A0E3003082E50C1082E5A7
:10BB50000830A0E3183082E50FE0A0E101F0A0E199
:04BB600000A81BE935
:10BB640098050004A8B80100B0B80100CC02000494
:10BB740080180004E0B80100E8B80100B8B801007A
:0CBB84004018000400A10100DC020004D5
:0CBB9000000000000000000000000000A9
:10BB9C00BCB80100C4B8010000B40100CCB801006D
:10BBAC00D0B80100D4B80100D8B80100DCB801004D
:10BBBC00A0050004E0020004280300047003000444
:04BBCC00E00200048F
:10BBD0002001000000000000000000000000000044
:10BBE00028030004BC050004BC060004BC050004D6
:10BBF000BC050004BC050004BC050004EC02000404
:10BC0000BC900100C490010000000000CC90010035
:10BC10000000000000000000100100000000000013
:10BC2000000000000100000070030004BC060004D6
:10BC3000BC070004BC060004BC060004BC060004EB
:10BC4000BC06000434030004BC900100C490010051
:10BC500000000000CC900100000000000000000087
:10BC600010020000000000000000000002000000C0
:10BC700000000000000000000000000000000000C4
:10BC80000000000000000000000000007C03000431
:10BC9000BC900100C490010000000000CC900100A5
:08BCA00000000000000000009C
:00000001FF
/trunk/fat16.c
54,39 → 54,40
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include <stdio.h>
#include "91x_lib.h"
#include "timer.h"
#include "fat16.h"
#include "sdc.h"
#include "uart1.h"
 
#include "main.h"
 
//________________________________________________________________________________________________________________________________________
// Module name: fat16.c
// Compiler used: avr-gcc 3.4.5
// Last Modifikation: 21.04.2008
// Version: 1.28
// Authors: Stephan Busker
// Description: Source files for FAT16 implementation with read and write-access using AVR-Mikrocontrollers
// Copyright (C) 2007 Stephan Busker
// Last Modifikation: 16.06.2008
// Version: 2.00
// Authors: Stephan Busker & Gregor Stobrawa
// Description: Source files for FAT16 implementation with read and write-access
// Copyright (C) 2008 Stephan Busker & Gregor Stobrawa
//........................................................................................................................................
// Functions: extern u8 InitFat16(void);
// u8 fopen_(s8 *fname,s8 mode, File *file);
// void fclose_(File *file);
// u32 fread_(void *buffer, u32 size, u32 count, File *file);
// u32 fwrite_(void *buffer, u32 size, u32 count, File *file);
// s16 fseek_(File *file, s32 offset, s16 origin);
// s8 fgets_(s8 *string, s16 count, File *file);
// u8 fputchar_(File *file,s8 c);
// u8 fputs_(File *file,s8 *string);
// s8 * fgets(s8 *, s16, File);
// u8 fexist_(u8*);
// u8 mkdir__(s8 *name);
// u8 chdir__(s8 *name);
// u8 findfirst_(s8 *fname, Find *item, u8 attribute);
// u8 findnext_(Find *item);
// u8 fdelete_(s8 *fname)
// u8 rmdir_(s8 *dname)
// u16 feof_(File);
// Functions: extern s16 Fat16_Init(void);
// extern s16 Fat16_Deinit(void);
// extern File_t * fopen_(const u8 *filename, const s8 mode);
// extern s16 fclose_(File_t *File);
// extern s16 fflush_(File_t *File);
// extern s16 fseek_(File_t *File, s32 offset, s16 origin);
// extern s16 fgetc_(File_t *File);
// extern s16 fputc_(u8 c, File_t *File);
// extern u32 fread_(void *buffer, u32 size, u32 count, File_t *File);
// extern u32 fwrite_(void *buffer, u32 size, u32 count, File_t *File);
// extern s16 fputs_(const u8 *string, File_t *File);
// extern u8 * fgets_(u8 *string, s16 length, File_t *File);
//........................................................................................................................................
// ext. functions: extern u8 SDC_GetSector (u32,u8 *);
// extern u8 SDC_PutSector (u32,u8 *);
// ext. functions: extern SD_Result_t SDC_Init(void;)
// extern SD_Result_t SDC_Deinit(void);
// extern SD_Result_t SDC_GetSector (u32,u8 *);
// extern SD_Result_t SDC_PutSector (u32,u8 *);
//........................................................................................................................................
//
// URL: www.Mikro-Control.de
93,1444 → 94,1717
// mailto: stephan.busker@mikro-control.de
//________________________________________________________________________________________________________________________________________
 
/*
FAT16 Drive Layout:
Description Offset
Volume Boot Sector Start of Partition
Fat Tables Start + # of Reserved Sectors
Root Directory Entry Start + # of Reserved + (# of Sectors Per FAT * 2)
Data Area (Starts with Cluster #2) Start + # of Reserved + (# of Sectors Per FAT * 2) + ((Maximum Root Directory Entries * 32) / Bytes per Sector)
*/
 
 
//________________________________________________________________________________________________________________________________________
//
// Global variables needed for read- or write-acces to the FAT16- filesystem.
//
//________________________________________________________________________________________________________________________________________
/*
________________________________________________________________________________________________________________________________________
Structure of an partition entry
________________________________________________________________________________________________________________________________________
 
u8 SectorsPerCluster = 0; // how many sectors does a cluster contain?
u8 FatCopies = 0; // Numbers of copies of the FAT
u16 PossibleRootEntries = 0; // Possible number of entries in the root directory.
u16 SectorsPerFat = 0; // how many sectors does a fat16 contain?
u32 ReservedSectors = 0; // Sectors reserved by the filesystem.
u32 FirstPartitionSector = 0; // Distance in sectors between the first partition and the master bootrecord.
u32 FileAllocationTable = 0; // pointer to the first FAT
u32 RootDirectory = 0; // Pointer to the rootdirectory of the first partition.
u32 FirstDataCluster = 0; // Pointer to the first cluster containing data (cluster0).
u32 CWD = 0; // Pointer startcluster to the current working directory
Partition Entry is 16 bytes long
*/
typedef struct
{
u8 PartitionState; // Current State of Partition (00h=Inactive, 80h=Active)
u8 BeginningHead; // Beginning of Partition - Head
u16 BeginningCylSec; // Beginning of Partition - Cylinder/Sector (See Below)
u8 Type; // Type of Partition (See List Below)
u8 EndHead; // End of Partition - Head
u16 EndCylSec; // End of Partition - Cylinder/Sector
u32 NoSectorsBeforePartition; // Number of Sectors between the MBR and the First Sector in the Partition
u32 NoSectorsPartition ; // Number of Sectors in the Partition
} __attribute__((packed)) PartitionEntry_t;
 
/*
Coding of Cylinder/Sector words
 
struct DirEntry *DirectoryEntry; // Pointer to an entry of the directory.
struct FatEntry *Fat; // Pointer to an entry of the fat (next clusterposition).
Cylinder is 10 bits: [7:0] at [15:8] and [9:8] at [7:6]
Sector is 5 bits: [5:0] at [5:0]
*/
 
File FilePointer[__MAX_FILES_USED]; // Allocate Memmoryspace for each filepointer used.
// Partition Types:
#define PART_TYPE_UNKNOWN 0x00
#define PART_TYPE_FAT12 0x01
#define PART_TYPE_XENIX 0x02
#define PART_TYPE_FAT16_ST_32_MB 0x04
#define PART_TYPE_EXTDOS 0x05
#define PART_TYPE_FAT16_LT_32_MB 0x06
#define PART_TYPE_NTFS 0x07
#define PART_TYPE_FAT32 0x0B
#define PART_TYPE_FAT32LBA 0x0C
#define PART_TYPE_FAT16LBA 0x0E
#define PART_TYPE_EXTDOSLBA 0x0F
#define PART_TYPE_EISA 0x12
#define PART_TYPE_ONTRACK 0x33
#define PART_TYPE_NOVELL 0x40
#define PART_TYPE_DYNAMIC 0x42
#define PART_TYPE_PCIX 0x4B
#define PART_TYPE_LINUX_SWAP 0x82
#define PART_TYPE_LINUX_NATIVE 0x83
#define PART_TYPE_LINUX_LVM 0x8E
#define PART_TYPE_PHOENIXSAVE 0xA0
#define PART_TYPE_FREEBSD 0xA5
#define PART_TYPE_OPENBSD 0xA6
#define PART_TYPE_NETNBSD 0xA9
#define PART_TYPE_CPM 0xDB
#define PART_TYPE_DBFS 0xE0
#define PART_TYPE_BBT 0xFF
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: InitFat16(void);
//
// Description: This function reads the Masterbootrecord and finds the position of the Volumebootrecord, the FAT and the Rootdirectory
// and stores the information in global variables.
//
// Returnvalue: The function returns "0" if the filesystem could not be initialized because no partition was found on the volume.
//________________________________________________________________________________________________________________________________________
/*
________________________________________________________________________________________________________________________________________
Structure of the MasterBootRecord
________________________________________________________________________________________________________________________________________
 
u8 InitFat16(void)
{
u8 retvalue = 0;
u8 cnt = 0;
struct VBR_Entry *VBR; // Pointer to the VolumeBootRecord.
struct MBR_Entry *MBR; // Pointer to the masterbootrecord.
File *file;
Master Boot Record is 512 bytes long
The Master Boot Record is the same for pretty much all Operating Systems.
It is located on the first Sector of the Hard Drive, at Cylinder 0, Head 0, Sector 1
*/
typedef struct
{
u8 ExecutableCode[446]; // 446 bytes for machine start code
PartitionEntry_t PartitionEntry1; // 16 bytes for partition entry 1
PartitionEntry_t PartitionEntry2; // 16 bytes for partition entry 2
PartitionEntry_t PartitionEntry3; // 16 bytes for partition entry 3
PartitionEntry_t PartitionEntry4; // 16 bytes for partition entry 4
u16 ExecutableMarker; // BIOS-Signature (0x55 0xAA)
} __attribute__((packed)) MBR_Entry_t;
 
for(cnt=0;cnt<__MAX_FILES_USED;cnt++)
{
FilePointer[cnt].state = _UNUSED; // declare the filepointers as unused.
}
file = &FilePointer[0];
 
SerialPutString("\n\rFAT16 init...");
while((SDC_Init() != SD_SUCCESS) && (cnt++<100));
/*
________________________________________________________________________________________________________________________________________
Structure of the VolumeBootRecord
________________________________________________________________________________________________________________________________________
 
if(cnt <100) // sdcard initialised succesfully
{
SDC_GetSector((u32)_MBR_SECTOR,file->buffer); // Read the MasterBootRecord from mmc.
MBR = (struct MBR_Entry *) file->buffer;
FirstPartitionSector = MBR->PartitionEntry1.NoSectorsBeforePartition;
if((MBR->PartitionEntry1.Type == _FAT16_32_MB_BIOS_Extension) ||
(MBR->PartitionEntry1.Type == _FAT16_ST_32_MB) ||
(MBR->PartitionEntry1.Type == _FAT16_LT_32_MB))
{
SDC_GetSector(FirstPartitionSector,file->buffer); // Read the volume bootrecord from mmc.
VBR = (struct VBR_Entry *) file->buffer; // Enter the VBR using the structure VBR_Entry.
SectorsPerCluster = VBR->SectorsPerCluster; // Number of sectors per cluster. Depends on the memorysize of the sd-card.
FatCopies = VBR->NoFATCopies; // Number of fatcopies.
PossibleRootEntries = VBR->MaxRootEntries; // How many Entries are possible in the rootdirectory (FAT16 allows max. 512 entries).
SectorsPerFat = VBR->SectorsPerFAT; // The number of sectors per FAT.
ReservedSectors = VBR->ReservedSectors; // calculate the sectorpositon of the FAT, the Rootdirectory and the first Datacluster.
The Volume Boot Record is 512 bytes long
This information is located in the first sector of every partition.
*/
typedef struct
{
u8 JumpCode[3]; // Jump Code + NOP
s8 OEMName[8]; // OEM Name
u16 BytesPerSector; // Bytes Per Sector
u8 SectorsPerCluster; // Sectors Per Cluster
u16 ReservedSectors; // Reserved Sectors
u8 NoFATCopies; // Number of Copies of FAT
u16 MaxRootEntries; // Maximum Root Directory Entries
u16 NoSectorsInPartSml32MB; // Number of Sectors in Partition Smaller than 32 MB
u8 MediaDescriptor; // Media Descriptor (0xF8 for Hard Disks)
u16 SectorsPerFAT; // Sectors Per FAT
u16 SectorsPerTrack; // Sectors Per Track
u16 NoHeads; // Number of Heads
u32 NoHiddenSectors; // Number of Hidden Sectors in Partition
u32 NoSectors; // Number of Sectors in Partition
u16 DriveNo; // Logical Drive Number of Partition
u8 ExtendedSig; // Extended Signature (0x29)
u32 SerialNo; // Serial Number of the Partition
s8 VolumeName[11]; // Volume Name of the Partititon
s8 FATName[8]; // FAT Name (FAT16)
u8 ExecutableCode[446]; // 446 bytes for machine start code
u16 ExecutableMarker; // Executable Marker (0x55 0xAA)
} __attribute__((packed)) VBR_Entry_t;
 
FileAllocationTable = (u32)(FirstPartitionSector + (u32)ReservedSectors); // Calculate the position of the FileAllocationTable.
RootDirectory = (u32)((u32)FileAllocationTable + (u32)((u32)SectorsPerFat*(u32)FatCopies)); // Calculate the position of the Rootdirectory.
FirstDataCluster = (u32)((u32)RootDirectory + ((u32)(PossibleRootEntries>>4))); // Calculate the position of the first datacluster.
CWD = RootDirectory; // The actual directory is the rootdirectory.
retvalue = 1;
SerialPutString("\n\rfilesystem ok");
str_Volume.state = INITIALIZED;
}
else
{
str_Volume.state = NOT_INITIALIZED;
SerialPutString("\n\rfilesystem nok");
}
}
return(retvalue);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: File * fopen_(u8*, u8 *);
//
// Description: This function looks for the file to be opened in the directory specified by the variable "CWD" of the drive.
// If the file was found this function returns a filepoiner to the opened file otherwise NULL//
//
// Return: Pointer to the opened file or NULL
//
//________________________________________________________________________________________________________________________________________
 
File * fopen_(s8 *fname, s8 mode)
/*
________________________________________________________________________________________________________________________________________
 
Structure of an directory entry
________________________________________________________________________________________________________________________________________
 
Directory entry is 32 bytes.
*/
typedef struct
{
File *file;
file = ReserveFilePointer(); // reserve a filepointer.
if(file != NULL) // A free filepointer was found.
{
file->mode = mode; // mode of fileoperation (read,write)
s8 Name[8]; // 8 bytes name, padded with spaces.
u8 Extension[3]; // 3 bytes extension, padded with spaces.
u8 Attribute; // attribute of the directory entry (unused,archive,read-only,system,directory,volume)
u8 Reserved[10]; // reserved bytes within the directory entry.
u32 DateTime; // date and time of last write access to the file or directory.
u16 StartCluster; // first cluster of the file or directory.
u32 Size; // size of the file or directory in bytes.
} __attribute__((packed)) DirEntry_t;
 
if(SeekFileInDirectory(fname, file)) // if file was found
{
SerialPutString("ok");
if(mode == 'a') // open existing file for writing (append data at the end of the file)
{
fseek_(file, 0, SEEK_END); // fseek points to the end of the file
}
}
else
{
if((mode == 'a') || (mode == 'w')) // specified file doesn't exist so create new file for writing data.
{
if(CreateFileInDirectory(fname,file)) // Could an entry for the new file in the rootdirectory be created?
{
return(file);
}
else
{
FreeFilePointer(file); // free the filepointer.
file = NULL;
}
}
else // file with mode 'r' not found
{
FreeFilePointer(file); // free the filepointer.
file = NULL; // file not found
}
}
}
return(file);
}
#define SLOT_EMPTY 0x00 // slot has never been used
#define SLOT_E5 0x05 // the real value is 0xe5
#define SLOT_DELETED 0xE5 // file in this slot deleted
 
#define ATTR_NONE 0x00 // normal file
#define ATTR_READONLY 0x01 // file is readonly
#define ATTR_HIDDEN 0x02 // file is hidden
#define ATTR_SYSTEM 0x04 // file is a system file
#define ATTR_VOLUMELABEL 0x08 // entry is a volume label
#define ATTR_LONG_FILENAME 0x0F // this is a long filename entry
#define ATTR_SUBDIRECTORY 0x10 // entry is a directory name
#define ATTR_ARCHIVE 0x20 // file is new or modified
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: fflush_(File *file);
//
// Description: This function writes the data already in the buffer but not yet written to the file.
//
//________________________________________________________________________________________________________________________________________
/*
________________________________________________________________________________________________________________________________________
Structure of an entry within the fileallocationtable.
________________________________________________________________________________________________________________________________________
*/
typedef struct
{
u16 NextCluster; // the next cluster of the file.
} __attribute__((packed)) Fat16Entry_t;
 
s16 fflush_(File *file)
// secial fat entries
#define FAT16_CLUSTER_FREE 0x0000
#define FAT16_CLUSTER_RESERVED 0x0001
#define FAT16_CLUSTER_USED_MIN 0x0002
#define FAT16_CLUSTER_USED_MAX 0xFFEF
#define FAT16_CLUSTER_ROOTDIR_MIN 0xFFF0
#define FAT16_CLUSTER_ROOTDIR_MAX 0xFFF6
#define FAT16_CLUSTER_BAD 0xFFF7
#define FAT16_CLUSTER_LAST_MIN 0xFFF8
#define FAT16_CLUSTER_LAST_MAX 0xFFFF
 
/*****************************************************************************************************************************************/
/* */
/* Global variables needed for read- or write-acces to the FAT16- filesystem. */
/* */
/*****************************************************************************************************************************************/
 
#define MBR_SECTOR 0x00 // the masterboot record is located in sector 0.
#define DIRENTRY_SIZE 32 //bytes
#define DIRENTRIES_PER_SECTOR BYTES_PER_SECTOR/DIRENTRY_SIZE
#define FAT16_BYTES 2
#define FAT16_ENTRIES_PER_SECTOR BYTES_PER_SECTOR/FAT16_BYTES
 
#define FSTATE_UNUSED 0
#define FSTATE_USED 1
 
typedef struct
{
u16 time=0;
u16 date=0;
u8 IsValid; // 0 means invalid, else valid
u8 SectorsPerCluster; // how many sectors does a cluster contain?
u8 FatCopies; // Numbers of copies of the FAT
u16 MaxRootEntries; // Possible number of entries in the root directory.
u16 SectorsPerFat; // how many sectors does a fat16 contain?
u32 FirstFatSector; // sector of the start of the fat
u32 FirstRootDirSector; // sector of the rootdirectory
u32 FirstDataSector; // sector of the first cluster containing data (cluster2).
u32 LastDataSector; // the last data sector of the partition
} Partition_t;
 
if(file && ((file->mode =='a') || (file->mode =='w')))
{
if(file->byte_index > 0) // has data been added to the file?
{
SDC_PutSector((u32)(file->cluster_pointer + file->sector_index),file->buffer);// save the data still in the buffer
}
SDC_GetSector((u32)file->directory_sector,file->buffer); // read the directoryentry for this file.
DirectoryEntry = (struct DirEntry *)file->buffer;
DirectoryEntry[file->directory_index].size = (u32) file->filesize;
DirectoryEntry[file->directory_index].time = (u16) time;
DirectoryEntry[file->directory_index].date = (u16) date;
SDC_PutSector((u32)file->directory_sector,file->buffer);
}
return(0);
}
Partition_t Partition; // Structure holds partition information
 
//________________________________________________________________________________________________________________________________________
// Funtion: fclose_(File *file);
//
// Description: This function closes the open file by writing the remaining data from the buffer to the device and entering the filesize
// in the directory entry.
//________________________________________________________________________________________________________________________________________
File_t FilePointer[FILE_MAX_OPEN]; // Allocate Memmoryspace for each filepointer used.
 
void fclose_(File *file)
 
/****************************************************************************************************************************************/
/* Function: FileDateTime(DateTime_t *); */
/* */
/* Description: This function calculates the DOS date time from a pointer to a time structure. */
/* */
/* Returnvalue: Returns the DOS date time. */
/****************************************************************************************************************************************/
 
u32 FileDateTime(DateTime_t * pTimeStruct)
{
u32 datetime = 0;
if((pTimeStruct == 0) || !(pTimeStruct->Valid)) return datetime;
 
if(file != NULL)
{
fflush_(file); // save buffered data to the disk
}
FreeFilePointer(file); // and free the filepointer.
datetime |= (0x0000007FL & (u32)(pTimeStruct->Year - 1980))<<25; // set year
datetime |= (0x0000000FL & (u32)(pTimeStruct->Month))<<21; // set month
datetime |= (0x0000001FL & (u32)(pTimeStruct->Day))<<16;
datetime |= (0x0000001FL & (u32)(pTimeStruct->Hour))<<11;
datetime |= (0x0000003FL & (u32)(pTimeStruct->Min))<<5;
datetime |= (0x0000001FL & (u32)(pTimeStruct->Sec/2));
return datetime;
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u32 fread_(void *buffer, s32 size, s32 count, File *file);
//
// Description: This function reads count objects of the specified size from the actual position of the file to the specified buffer.
//
// Returnvalue: The function returns the number of objects (not bytes) read from the file.
//
//________________________________________________________________________________________________________________________________________
 
u32 fread_(void *buffer, u32 size, u32 count, File *file)
/****************************************************************************************************************************************/
/* Function: LockFilePointer(); */
/* */
/* Description: This function trys to lock a free file pointer. */
/* */
/* Returnvalue: Returns the Filepointer on success or 0. */
/****************************************************************************************************************************************/
File_t * LockFilePointer(void)
{
u32 object_cnt = 0; // count the number of objects read from the file.
u32 object_size = 0; // count the number of bytes read from the actual object.
u8 *buff_pnt = 0; // a pointer to the actual bufferposition.
u8 success = 1; // no error occured during read operation to the file.
buff_pnt = (u8 *) buffer; // cast the void pointer to an u8 *
while((object_cnt < count) && success)
u8 i;
File_t * File = 0;
for(i = 0; i < FILE_MAX_OPEN; i++)
{
object_size = size;
while((size > 0) && success)
if(FilePointer[i].State == FSTATE_UNUSED) // found an unused one
{
*buff_pnt = (u8) fgetchar_(file); // read a byte from the buffer to the opened file.
buff_pnt++;
size--;
File = &FilePointer[i]; // set pointer to that entry
FilePointer[i].State = FSTATE_USED; // mark it as used
break;
}
if(success) object_cnt++;
}
return(object_cnt); // return the number of objects succesfully read from the file
}
return(File);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u32 fwrite_(void *buffer, s32 size, s32 count, File *file);
//
// Description: This function writes count objects of the specified size from the buffer to the actual positon within the file.
//
// Returnvalue: The function returns the number of objects (not bytes) written to the file.
//
//________________________________________________________________________________________________________________________________________
 
u32 fwrite_(void *buffer, u32 size, u32 count, File *file)
/****************************************************************************************************************************************/
/* Function: UnlockFilePointer(file_t *); */
/* */
/* Description: This function trys to unlock a file pointer. */
/* */
/* Returnvalue: Returns 1 if file pointer was freed else 0. */
/****************************************************************************************************************************************/
u8 UnlockFilePointer(File_t * file)
{
u32 object_cnt = 0; // count the number of objects written to the file.
u32 object_size = 0; // count the number of bytes written from the actual object.
u8 *buff_pnt = 0; // a pointer to the actual bufferposition.
u8 success = 1; // no error occured during write operation to the file.
buff_pnt = (u8 *) buffer; // cast the void pointer to an u8 *
while((object_cnt < count) && success)
u8 cnt;
if(file == NULL) return(0);
for(cnt = 0; cnt < FILE_MAX_OPEN; cnt++)
{
object_size = size;
while((size > 0) && success)
if(&FilePointer[cnt] == file) // filepointer to be freed found?
{
success = fputchar_(file, *buff_pnt); // write a byte from the buffer to the opened file.
buff_pnt++;
size--;
file->State = FSTATE_UNUSED;
file->FirstSectorOfFirstCluster = 0; // Sectorpointer to the first sector of the first datacluster of the file.
file->FirstSectorOfCurrCluster = 0;
file->SectorOfCurrCluster = 0; // Pointer to the cluster which is edited at the moment.
file->SectorOfCurrCluster = 0; // The sector which is edited at the moment (cluster_pointer + sector_index).
file->ByteOfCurrSector = 0; // The bytelocation within the current sector (cluster_pointer + sector_index + byte_index).
file->Mode = 0; // mode of fileoperation (read,write)
file->Size = 0; // the size of the opend file in bytes.
file->Position = 0; // pointer to a character within the file 0 < fileposition < filesize
file->SectorInCache = 0; // the last sector read, wich is still in the sectorbuffer.
file->DirectorySector = 0; // the sectorposition where the directoryentry has been made.
file->DirectoryIndex = 0; // the index to the directoryentry within the specified sector.
file->Attribute = 0; // the attribute of the file opened.
file = NULL;
return(1);
}
if(success) object_cnt++;
}
return(object_cnt); // return the number of objects succesfully written to the file
} // (!!!!! objects and not bytes !!!!)
}
return(0);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: s16 fseek_(File *, s32, s16)
//
// Description: This function sets the pointer of the stream relative to the position
// specified by origin (SEEK_SET, SEEK_CUR, SEEK_END).
//
//________________________________________________________________________________________________________________________________________
/****************************************************************************************************************************************/
/* Function: SeperateDirName(s8*, s8*); */
/* */
/* Description: This function seperates the first dirname from filepath and brings them */
/* into the needed format ('test.txt' -> 'TEST TXT') */
/* The subpath is the pointer to the remaining substring if the filepath */
/* */
/* Returnvalue: Return NULL on error or pointer to subpath */
/****************************************************************************************************************************************/
s8* SeperateDirName(const s8 *filepath, s8 *dirname)
{
s8* subpath = NULL;
u8 readpointer = 0;
u8 writepointer = 0;
 
s16 fseek_(File *file, s32 offset, s16 origin)
{
s32 fposition = 0;
s16 retvalue = 1;
u32 temp = 0;
//......................................................
if(origin == SEEK_SET) // Fileposition relative to the beginning of the file.
// search subpath from beginning of filepath
subpath = NULL;
readpointer = 0;
if(filepath[0] == '/') readpointer = 1; // ignore first '/'
while(subpath == NULL) // search the filepath until a subpath was found.
{
fposition = 0;
}
//......................................................
else if(origin == SEEK_END) // Fileposition relative to the end of the file.
{
fposition = (s32) file->filesize;
}
//......................................................
else if(origin == SEEK_CUR) // Fileposition relative to the current position of the file.
{
fposition = file->fileposition;
}
if(((filepath[readpointer] == 0) || (filepath[readpointer] == '/'))) // if '/' found or end of filepath reached
{
subpath = (s8*)&filepath[readpointer]; // store the position of the first "/" found after the beginning of the filenpath
}
readpointer++;
}
 
fposition += offset;
 
if((fposition >= 0) && (fposition <= (s32)file->filesize)) // is the pointer still within the file?
// clear dirname with spaces
dirname[11] = 0; // terminate dirname
for(writepointer = 0; writepointer < 11; writepointer++) dirname[writepointer] = ' ';
writepointer = 0;
// start seperating the dirname from the filepath.
readpointer = 0;
if(filepath[0] == '/') readpointer = 1; // ignore first '/'
while( &filepath[readpointer] < subpath)
{
retvalue = 0;
file->sector_index = 0;
file->byte_index = 0;
file->fileposition = 0;
file->cluster_pointer = file->start_cluster;
while(file->fileposition < fposition)
if(writepointer >= 11) return(NULL); // dirname to long
if(filepath[readpointer] == '.') // seperating dirname and extension.
{
file->fileposition++;
if(file->byte_index < 511)
if(writepointer <= 8)
{
file->byte_index++;
readpointer++; // next character in filename
writepointer = 8; // jump to start of extension
}
else return(NULL); // dirbasename to long
}
else
{
if((0x60 < filepath[readpointer]) && (filepath[readpointer] < 0x7B))
{
dirname[writepointer] = (filepath[readpointer] - 0x20); // all characters must be upper case.
}
else
{
file->byte_index=0; // reading at the beginning of new sector.
file->sector_index++; // continue reading in next sector
if(file->sector_index >= SectorsPerCluster) // When end of cluster is reached, the next datacluster has to be searched in the FAT.
{
if(file->fileposition < fposition)
{
file->sector_index = 0; // start reading new cluster at first sector of the cluster.
GetNextCluster(file); // Sets the clusterpointer of the file to the next datacluster.
}
}
dirname[writepointer] = filepath[readpointer];
}
readpointer++;
writepointer++;
}
if(file->byte_index)
{
temp = (u32)((u32)file->cluster_pointer + (u32)file->sector_index);
SDC_GetSector((u32)temp,file->buffer); // FileBuffer will be written at once at the end of the cluster and has to be updated.
}
}
return(retvalue);
}
return(subpath);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: fgetchar_(File *file);
//
// Description: This function reads and returns one character from the specified file.
//
// Returnvalue: The function returns the character read from the specified memorylocation as u8 casted to s16 or EOF.
//________________________________________________________________________________________________________________________________________
 
s16 fgetchar_(File *file)
{
s16 c = EOF;
u32 temp1;
if(((file->fileposition)+1) < file->filesize) // wen the end of the file is not reached, get the next character.
/**************************************************************************************************************************************+*/
/* Function: Fat16ClusterToSector( u16 cluster); */
/* */
/* Description: This function converts a cluster number given by the fat to the corresponding */
/* sector that points to the start of the data area that is represented by the cluster number. */
/* */
/* Returnvalue: The sector number with the data area of the given cluster */
/****************************************************************************************************************************************/
u32 Fat16ClusterToSector(u16 cluster)
{
if(!Partition.IsValid) return 0;
if (cluster < 2) cluster = 2; // the 0. and 1. cluster in the fat are used for the media descriptor
return ( (cluster - 2) * Partition.SectorsPerCluster) + Partition.FirstDataSector; // the first data sector is represented by the 2nd cluster
}
 
/****************************************************************************************************************************************/
/* Function: SectorToFat16Cluster( u32 sector); */
/* */
/* Description: This function converts a given sector number given to the corresponding */
/* cluster number in the fat that represents this data area. */
/* */
/* Returnvalue: The cluster number representing the data area of the sector. */
/****************************************************************************************************************************************/
u16 SectorToFat16Cluster(u32 sector)
{
if(!Partition.IsValid) return 0;
return ((u16)((sector - Partition.FirstDataSector) / Partition.SectorsPerCluster) + 2);
}
 
 
/****************************************************************************************************************************************/
/* Function: Fat16_Deinit(void); */
/* */
/* Description: This function uninitializes the fat 16 api */
/* */
/* Returnvalue: The function returns "0" on success */
/****************************************************************************************************************************************/
u8 Fat16_Deinit(void)
{
s16 returnvalue = 0;
u8 cnt;
// declare the filepointers as unused.
for(cnt = 0; cnt < FILE_MAX_OPEN; cnt++)
{
temp1 = (u32)file->cluster_pointer; // calculate the adress of the next character to be read.
temp1 += (u32)file->sector_index;
if(file->sector_in_buffer != temp1) // Has the content of the buffer been modified and has to be updated?
if(FilePointer[cnt].State == FSTATE_USED)
{
SDC_GetSector((u32)temp1,file->buffer); // Read the calculated cluster.
file->sector_in_buffer = (u32)temp1;
}
c = (s16) file->buffer[file->byte_index];
file->fileposition++;
if(file->byte_index < 511) // continue reading from this sector until the end of the sector is reached.
{
file->byte_index++;
returnvalue += fclose_(&FilePointer[cnt]); // try to close open file pointers
}
else // has the end of an sector been reached->
{
file->byte_index=0; // continue reading at the beginning -
file->sector_index++; // of new sector.
if(file->sector_index >= SectorsPerCluster) // When the end of an cluster is reached, the next datacluster has to be searched in the FAT.
{
file->sector_index = 0; // start reading new cluster at first sector of the cluster.
GetNextCluster(file); // Sets the clusterpointer of the file to the next datacluster.
}
}
}
return(c);
SDC_Deinit(); // uninitialize interface to sd-card
Partition.IsValid = 0; // mark data in partition structure as invalid
return(returnvalue);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: fputchar_(File *file, s8 *);
//
// Description: This function writes a byte to the specified file and takes care of writing the necessary FAT- Entries.
//
// Returnvalue: The function returns a value of 0 if the data could not be written.
//________________________________________________________________________________________________________________________________________
/****************************************************************************************************************************************/
/* Function: Fat16_Init(void); */
/* */
/* Description: This function reads the Masterbootrecord and finds the position of the Volumebootrecord, the FAT and the Rootdir */
/* and stores the information in global variables. */
/* */
/* Returnvalue: The function returns "0" if the filesystem is initialized. */
/****************************************************************************************************************************************/
u8 Fat16_Init(void)
{
u8 cnt = 0;
u32 partitionfirstsector;
VBR_Entry_t *VBR;
MBR_Entry_t *MBR;
File_t *file;
u8 result = 0;
 
u8 fputchar_(File *file,s8 c)
{
u32 ul_temp = 0;
u8 retvalue = 1;
if(file->sector_index >= SectorsPerCluster) // if end of the cluster is reached, find next free cluster
SerialPutString("\r\n FAT16 init...");
Partition.IsValid = 0;
 
// declare the filepointers as unused.
for(cnt = 0; cnt < FILE_MAX_OPEN; cnt++)
{
file->sector_index = 0;
if(!AppendCluster(file)) retvalue = 0; // append a new and free cluster at the end of the file.
FilePointer[cnt].State = FSTATE_UNUSED;
}
// set current file pinter to first position in list
file = &FilePointer[0];
// try to initialise the sd-card.
if(SD_SUCCESS != SDC_Init())
{
SerialPutString("SD-Card could not be initialized.");
result = 1;
goto end;
}
 
file->buffer[file->byte_index] = c; // write databyte into the buffer. The byte will be written to the device at once
if(file->filesize == file->fileposition) file->filesize++; // a character has been written to the file so the size is inkremented but only when the character has been added at the end of the file.
file->fileposition++; // the actual positon within the file.
// if the buffer contains the complete sectordata.
if(file->byte_index < 511) // if the end of this sector is not reached yet
// SD-Card is initialized successfully
if(SD_SUCCESS != SDC_GetSector((u32)MBR_SECTOR,file->Cache)) // Read the MasterBootRecord
{
file->byte_index++; // the next byte will be written to the next byteposition in this sector.
SerialPutString("Error reading the MBR.");
result = 2;
goto end;
}
else // otherwise the data in the sectorbuffer will be written to the device and the next sector will be selected.
MBR = (MBR_Entry_t *)file->Cache; // Enter the MBR using the structure MBR_Entry_t.
if((MBR->PartitionEntry1.Type == PART_TYPE_FAT16_ST_32_MB) ||
(MBR->PartitionEntry1.Type == PART_TYPE_FAT16_LT_32_MB) ||
(MBR->PartitionEntry1.Type == PART_TYPE_FAT16LBA))
{
ul_temp = (u32)file->cluster_pointer;
ul_temp += (u32)file->sector_index;
SDC_PutSector((u32)ul_temp,file->buffer);
file->byte_index=0; // and the next byte will be written at the beginning of this new sector.
file->sector_index++;
if(file->sector_index >= SectorsPerCluster) // if end of the cluster is reached, find next free cluster
// get sector offset 1st partition
partitionfirstsector = MBR->PartitionEntry1.NoSectorsBeforePartition;
// Start of Partition is the Volume Boot Sector
if(SD_SUCCESS != SDC_GetSector(partitionfirstsector,file->Cache)) // Read the volume boot record
{
file->sector_index = 0;
if(!AppendCluster(file)) retvalue = 0; // append a new and free cluster at the end of the file.
}
SerialPutString("Error reading the VBR.");
result = 3;
goto end;
}
}
return(retvalue);
else // maybe the medium has no partition assuming sector 0 is the vbr
{
partitionfirstsector = 0;
}
VBR = (VBR_Entry_t *) file->Cache; // Enter the VBR using the structure VBR_Entry_t.
if(VBR->BytesPerSector != BYTES_PER_SECTOR)
{
SerialPutString("VBR: Sector size not supported.");
result = 4;
goto end;
}
Partition.SectorsPerCluster = VBR->SectorsPerCluster; // Number of sectors per cluster. Depends on the memorysize of the sd-card.
Partition.FatCopies = VBR->NoFATCopies; // Number of fatcopies.
Partition.MaxRootEntries = VBR->MaxRootEntries; // How many Entries are possible in the rootdirectory (FAT16 allows max. 512 entries).
Partition.SectorsPerFat = VBR->SectorsPerFAT; // The number of sectors per FAT.
 
/* Calculate the sectorpositon of the FAT, the Rootdirectory and the first Datacluster. */
// Calculate the position of the FileAllocationTable:
// Start + # of Reserved Sectors
Partition.FirstFatSector = (u32)(partitionfirstsector + (u32)(VBR->ReservedSectors));
// Calculate the position of the Rootdirectory:
// Start + # of Reserved Sectors + (# of Sectors Per FAT * # of FAT Copies)
Partition.FirstRootDirSector = Partition.FirstFatSector + (u32)((u32)Partition.SectorsPerFat*(u32)Partition.FatCopies);
// Calculate the position of the first datacluster:
// Start + # of Reserved + (# of Sectors Per FAT * # of FAT Copies) + ((Maximum Root Directory Entries * 32) / Bytes per Sector)
Partition.FirstDataSector = Partition.FirstRootDirSector + (u32)(Partition.MaxRootEntries>>4); // assuming 512 Byte Per Sector
// Calculate the last data sector
if(VBR->NoSectors == 0)
{
SerialPutString("VBR: Bad number of sectors.");
result = 5;
goto end;
}
Partition.LastDataSector = Partition.FirstDataSector + VBR->NoSectors - 1;
// check for FAT16 in VBR of first partition
if(!((VBR->FATName[0]=='F') && (VBR->FATName[1]=='A') && (VBR->FATName[2]=='T') && (VBR->FATName[3]=='1')&&(VBR->FATName[4]=='6')))
{
SerialPutString("VBR: Partition ist not FAT16 type.");
result = 6;
goto end;
}
Partition.IsValid = 1; // mark data in partition structure as valid
result = 0;
end:
if(result != 0) Fat16_Deinit();
else SerialPutString("ok");
return(result);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: fputs_(File *file, s8 *string);
//
// Description: This function writes a zero terminated string to the specified file.
//
//________________________________________________________________________________________________________________________________________
 
u8 fputs_(File *file,s8 * string)
 
/****************************************************************************************************************************************/
/* Function: ClearCurrCluster(File_t*); */
/* */
/* Description: This function fills the current cluster with 0. */
/* */
/* Returnvalue: The function returns 1 on success else 0. */
/****************************************************************************************************************************************/
u8 ClearCurrCluster(File_t * file)
{
u8 i=0;
u8 retvalue = 1;
u32 i;
while(string[i] != 0)
if((!Partition.IsValid) || (file == NULL)) return(0);
 
for(i = 0; i < BYTES_PER_SECTOR; i++) file->Cache[i] = 0; // clear file cache
for(i = 0; i < Partition.SectorsPerCluster; i++)
{
fputchar_(file,string[i]);
i++;
file->SectorInCache = file->FirstSectorOfCurrCluster + i;
if(SD_SUCCESS != SDC_PutSector(file->SectorInCache, file->Cache))
{
Fat16_Deinit();
retvalue = 0;
}
}
return(0);
return(retvalue);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: s8 * fgets_(s8 *string, s16 count, File *file)
//
// Description: This function reads a string from the file to the specifies string until EOF or end of line was detected..
//
// Returnvalue: A pointer to the string or NULL if EOF was read from the file with no other characters before.
//________________________________________________________________________________________________________________________________________
 
s8 * fgets_(s8 *string, s16 count, File *file)
/*****************************************************************************************************************************************/
/* Function: GetNextCluster(File_t* ); */
/* */
/* Description: This function finds the next datacluster of the file specified with File *File. */
/* */
/* Returnvalue: The function returns the next cluster or 0 if the last cluster has already reached. */
/*****************************************************************************************************************************************/
u16 GetNextCluster(File_t * file)
{
s16 buff_pnt = 0;
s16 buff_tmp = 0;
s8 *retvalue = 0;
u16 cluster = 0;
u32 fat_byte_offset, sector, byte;
Fat16Entry_t * fat;
retvalue = string;
 
while(count > 1) // read the count-1 characters from the file to the string.
if((!Partition.IsValid) || (file == NULL)) return(cluster);
// if sector is within the data area
if((Partition.FirstDataSector <= file->FirstSectorOfCurrCluster)&& (file->FirstSectorOfCurrCluster <= Partition.LastDataSector))
{
buff_tmp = fgetchar_(file); // read a character from the opened file.
if(buff_tmp == EOF) // is the end of the file reached, terminate the string with zero.
// determine current file cluster
cluster = SectorToFat16Cluster(file->FirstSectorOfCurrCluster);
// calculate byte offset in the fat for corresponding entry
fat_byte_offset = ((u32)cluster)<<1; // two FAT bytes (16 bits) for every cluster
// calculate the sector that contains the current cluster within the fat
sector = Partition.FirstFatSector + ( fat_byte_offset / BYTES_PER_SECTOR);
// calculate byte offset of the current cluster within that fat sector
byte = fat_byte_offset % BYTES_PER_SECTOR;
// read this sector to the file cache
if(file->SectorInCache != sector)
{
if(buff_pnt != 0) // are there characters within the string?
file->SectorInCache = sector; // update sector stored in buffer
if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache)) // read sector from sd-card
{
break;
}
else
{
retvalue = NULL; // first character read was EOF -> return(NULL);
break;
}
}
else if(buff_tmp == 0x0A) // lf detected.
{
string[buff_pnt] = (s8) buff_tmp; // add lf to the string.
buff_pnt++;
break;
Fat16_Deinit();
return (cluster);
}
}
// read the next cluster from cache
fat = (Fat16Entry_t *)(&(file->Cache[byte]));
cluster = fat->NextCluster;
// if last cluster fat entry
if(FAT16_CLUSTER_LAST_MIN <= cluster)
{
cluster = 0;
}
else
{
string[buff_pnt] = (s8) buff_tmp;
count--;
buff_pnt++;
file->FirstSectorOfCurrCluster = Fat16ClusterToSector(cluster);
file->SectorOfCurrCluster = 0;
file->ByteOfCurrSector = 0;
}
}
string[buff_pnt] = 0; // terminate string with zero
return(string);
}
return(cluster);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 fexist_(u8*);
//
// Description: This function searches the specified file and returns 0 if the file was not found.
//
//
// Return: 0 = file does not exist
// 1 = file exists
//________________________________________________________________________________________________________________________________________
 
u8 fexist_(s8 *fname)
/****************************************************************************************************************************************/
/* Function: FindNextFreeCluster(File_t *); */
/* */
/* Description: This function looks in the fat to find the next free cluster */
/* */
/* Returnvalue: The function returns the cluster number of the next free cluster found within the fat. */
/****************************************************************************************************************************************/
u16 FindNextFreeCluster(File_t *file)
{
File *file;
u32 fat_sector; // current sector within the fat relative to the first sector of the fat.
u32 curr_sector; // current sector
u16 fat_entry; // index to an fatentry within the actual sector (256 fatentries are possible within one sector).
u16 free_cluster = 0; // next free cluster number.
Fat16Entry_t * fat;
if((!Partition.IsValid) || (file == NULL)) return(0);
 
file = fopen_(fname,'r'); // try to open the specified file.
if(file != NULL)
// start searching for an empty cluster at the beginning of the fat.
fat_sector = 0;
do
{
FreeFilePointer(file); // Free the filepoint // free the filepointer
return(1); // file was found so return(1);
}
else
{
return(0); // file not found return(0);
}
curr_sector = Partition.FirstFatSector + fat_sector; // calculate sector to read
file->SectorInCache = curr_sector; // upate the sector number of file cache.
if( SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache)) // read sector of fat from sd-card.
{
Fat16_Deinit();
return(free_cluster);
}
 
fat = (Fat16Entry_t *)file->Cache; // set fat pointer to file cache
 
for(fat_entry = 0; fat_entry < FAT16_ENTRIES_PER_SECTOR; fat_entry++) // look for an free cluster at all entries in this sector of the fat.
{
if(fat[fat_entry].NextCluster == FAT16_CLUSTER_FREE) // empty cluster found!!
{
fat[fat_entry].NextCluster = FAT16_CLUSTER_LAST_MAX; // mark this fat-entry as used
if(SD_SUCCESS != SDC_PutSector(file->SectorInCache, file->Cache)) // and save the sector at the sd-card.
{
Fat16_Deinit();
return(free_cluster);
}
free_cluster = (u16)(fat_sector * FAT16_ENTRIES_PER_SECTOR + (u32)fat_entry);
fat_entry = FAT16_ENTRIES_PER_SECTOR; // terminate the search for a free cluster in this sector.
}
}
fat_sector++; // continue the search in next fat sector
// repeat until the end of the fat is reached and no free cluster has been found so far
}while((fat_sector < Partition.SectorsPerFat) && (!free_cluster));
return(free_cluster);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: GetNextCluster(File *file);
//
// Description: This function finds the next datacluster of the file specified with File *file.
//
// Returnvalue: The function returns "0" if the last cluster has already been reached.
//________________________________________________________________________________________________________________________________________
 
u16 GetNextCluster(File *file)
/****************************************************************************************************************************************************/
/* Function: s16 fseek_(File_t *, s32 *, u8) */
/* */
/* Description: This function sets the pointer of the stream relative to the position */
/* specified by origin (SEEK_SET, SEEK_CUR, SEEK_END) */
/* Returnvalue: Is 1 if seek was successful */
/****************************************************************************************************************************************************/
s16 fseek_(File_t *file, s32 offset, s16 origin)
{
u32 fat_pointer = 0;
u32 fat_sector_offset = 0;
u32 ul_tmp = 0;
u8 retvalue = 0; // no new cluster found yet.
s32 fposition = 0;
s16 retvalue = 1;
if((file->cluster_pointer >= RootDirectory) && (file->cluster_pointer < (RootDirectory + 31)))
{ // Is the next cluster searched within the rootdirectory and available?
file->cluster_pointer++; // the rootdirectory is a linear adress space of 32 clusters.
retvalue = 1; // and the next cluster has been found.
if((!Partition.IsValid) || (file == NULL)) return(0);
switch(origin)
{
case SEEK_SET: // Fileposition relative to the beginning of the file.
fposition = 0;
break;
case SEEK_END: // Fileposition relative to the end of the file.
fposition = (s32)file->Size;
break;
case SEEK_CUR: // Fileposition relative to the current position of the file.
default:
fposition = file->Position;
break;
}
else if(file->cluster_pointer > (RootDirectory + 31)) // The specified cluster is within the FAT.
 
fposition += offset;
 
if((fposition >= 0) && (fposition <= (s32)file->Size)) // is the pointer still within the file?
{
fat_sector_offset = ((file->cluster_pointer) - (FirstDataCluster)); // Calculate index of actual cluster within the FAT.
fat_sector_offset /= SectorsPerCluster; // calculate the index of the actual sector within the FAT.
fat_sector_offset += 2; // In Fat16 clusterpositions have an offset of two.
fat_pointer = (fat_sector_offset%0x100); // Calculate the sector within the cluster.
fat_sector_offset = (fat_sector_offset>>8); // and the position within the sector.
// reset file position to start of the file
file->FirstSectorOfCurrCluster = file->FirstSectorOfFirstCluster;
file->SectorOfCurrCluster = 0;
file->ByteOfCurrSector = 0;
file->Position = 0;
 
SDC_GetSector((u32)(FileAllocationTable + fat_sector_offset),file->buffer);
file->sector_in_buffer = (FileAllocationTable + fat_sector_offset); // Mark that new sector has been read.
ul_tmp = (u32)file->buffer[((fat_pointer << 1)+1)]; // Read next sector information from calculated clusterposition.
ul_tmp = (ul_tmp << 8);
ul_tmp |= (u32)file->buffer[(fat_pointer << 1)];
ul_tmp -=2; // next datacluster is clusterposition in fat - 2.
ul_tmp *= SectorsPerCluster; // calculate sectorposition of new cluster
ul_tmp += FirstDataCluster; // in relation to first datacluster of the disk.
if(ul_tmp < 0xfff7) // has a new cluster been read or was the end of the fat reached?
while(file->Position < fposition) // repeat until the current position is less than target
{
file->cluster_pointer = (u32) ul_tmp; // continue reading the file at the beginning of new datacluster.
retvalue = 1; // a new cluster was found.
file->Position++; // increment file position
file->ByteOfCurrSector++; // next byte in current sector
if(file->ByteOfCurrSector >= BYTES_PER_SECTOR)
{
file->ByteOfCurrSector = 0; // reading at the beginning of new sector.
file->SectorOfCurrCluster++; // continue reading in next sector
if(file->SectorOfCurrCluster >= Partition.SectorsPerCluster) // if end of cluster is reached, the next datacluster has to be searched in the FAT.
{
if(GetNextCluster(file)) // Sets the clusterpointer of the file to the next datacluster.
{
file->SectorOfCurrCluster = 0;
}
else // the last cluster was allready reached
{
file->SectorOfCurrCluster--; // jump back to the ast sector in the last cluster
file->ByteOfCurrSector = BYTES_PER_SECTOR; // set ByteOfCurrSector one byte over sector end
}
}
}
}
}
if(file->Position == fposition) retvalue = 0;
return(retvalue);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u16 FindNextFreeCluster(void)
//
// Description: This function looks in the FAT to find the next free datacluster
//
// Returnvalue: The function returns the adress of the next free cluster found within the fAT.
//________________________________________________________________________________________________________________________________________
 
u16 FindNextFreeCluster(File *file)
/****************************************************************************************************************************************/
/* Function: u16 DeleteClusterChain(File *file); */
/* */
/* Description: This function trances along a cluster chain in the fat and frees all clusters visited. */
/* */
/****************************************************************************************************************************************/
u8 DeleteClusterChain(u16 StartCluster)
{
u32 fat_pointer = 0; // Pointer to the first sector of the FAT.
u32 ul_tmp = 0; // temporary variable used to calculate a sectornumber.
u16 fat_sector_offset = 0; // index to a sector within the FAT.
u16 fat_entry = 0; // index to an fatentry within the actual sector (256 fatentries are possible within one sector).
u16 free_cluster = 0; // a pointer to the first sector of the next free cluster.
fat_pointer = (u32) FileAllocationTable; // start searching for empty cluster at the beginning of the fat.
// if the end of the fat is not reached yet and no free cluster has been found
while((fat_sector_offset < SectorsPerFat) && (!free_cluster))
u16 cluster;
u32 fat_byte_offset, sector, byte;
Fat16Entry_t * fat;
u8 buffer[BYTES_PER_SECTOR];
u32 sector_in_buffer = 0;
u8 repeat = 0;
 
if(!Partition.IsValid) return 0;
 
cluster = StartCluster; // init chain trace
// calculate byte offset in the fat for corresponding entry
fat_byte_offset = ((u32)cluster)<<1; // two FAT bytes (16 bits) for every cluster
// calculate the sector that contains the current cluster within the fat
sector = Partition.FirstFatSector + ( fat_byte_offset / BYTES_PER_SECTOR);
// calculate byte offset of the current cluster within that fat sector
byte = fat_byte_offset % BYTES_PER_SECTOR;
do
{
ul_tmp = (u32) ((u32)fat_pointer + (u32)fat_sector_offset);
SDC_GetSector((u32)ul_tmp,file->buffer); // read next sector of FAT.
file->sector_in_buffer = ul_tmp; // remember the number of the sector in FileBuffer.
Fat = (struct FatEntry *)file->buffer;
for(fat_entry=0;fat_entry<256;fat_entry++) // look for an free cluster at all entries in this sector of the fat.
if(sector != sector_in_buffer)
{
if(Fat[fat_entry].next_cluster == 0x0000) // empty cluster found!!
{
Fat[fat_entry].next_cluster = 0xffff; // mark this fat-entry as used and save it to the device.
SDC_PutSector((u32)file->sector_in_buffer,file->buffer);
free_cluster = fat_entry; // the relative position of the free cluster found in this sector of the FAT.
free_cluster += (fat_sector_offset << 8); // calculate the absolute position of the free cluster in the FAT;
fat_entry = 256; // terminate the search for a free cluster in this sector.
}
// read this sector to buffer
sector_in_buffer = sector;
if(SD_SUCCESS != SDC_GetSector(sector_in_buffer, buffer)) return 0; // read sector from sd-card
}
// read the next cluster from cache
fat = (Fat16Entry_t *)(&(buffer[byte]));
cluster = fat->NextCluster;
if((FAT16_CLUSTER_USED_MIN <= cluster) && (cluster <= FAT16_CLUSTER_USED_MAX) ) repeat = 1;
else repeat = 0;
 
fat->NextCluster = FAT16_CLUSTER_FREE; // mark current cluster as free
// calculate byte offset in the fat for corresponding entry
fat_byte_offset = ((u32)cluster)<<1; // two FAT bytes (16 bits) for every cluster
// calculate the sector that contains the current cluster within the fat
sector = Partition.FirstFatSector + ( fat_byte_offset / BYTES_PER_SECTOR);
// calculate byte offset of the current cluster within that fat sector
byte = fat_byte_offset % BYTES_PER_SECTOR;
// if new sector is not the sector in buffer or the last cluster in the chain was traced
if((sector != sector_in_buffer) || !repeat)
{ // write sector in buffer
if(SD_SUCCESS != SDC_PutSector(sector_in_buffer,buffer)) return 0;
}
fat_sector_offset++;
}
return(free_cluster);
}
while(repeat);
 
return 1;
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u16 AppendCluster(File *file);
//
// Description: This function finds the next free datacluster on the disk and appends it to the specified file.
//
// Returnvalue: This funktion returns 1 if a cluster was appended to the specified file.
//________________________________________________________________________________________________________________________________________
 
u8 AppendCluster(File *file)
/****************************************************************************************************************************************/
/* Function: u16 AppendCluster(File *file); */
/* */
/* Description: This function looks in the fat to find the next free cluster and appends it to the file. */
/* */
/* Returnvalue: The function returns the appened cluster number or 0 of no cluster was appended. */
/****************************************************************************************************************************************/
u16 AppendCluster(File_t *file)
{
u16 free_cluster = 0;
u32 fat_pointer = 0;
u8 retvalue = 0;
u16 last_cluster, new_cluster = 0;
u32 fat_byte_offset, sector, byte;
Fat16Entry_t * fat;
free_cluster = FindNextFreeCluster(file); // the next free cluster found on the disk.
if(free_cluster) retvalue = 1; // A free cluster was found and can be added to the end of the file.
fat_pointer = FileAllocationTable; // Set Pointer to the beginnig of the FAT.
fat_pointer += (u32)((u32)GetFatClusterOffset(file) >> 8); // find the sector in the FAT with 256 entries per sector.
SDC_GetSector(fat_pointer,file->buffer);
Fat = (struct FatEntry *)file->buffer;
Fat[GetFatSectorIndex(file)].next_cluster = free_cluster; // append the free cluster to the end of the file in the FAT.
SDC_PutSector((u32)fat_pointer,file->buffer); // save the modified sector to the FAT.
if((!Partition.IsValid) || (file == NULL)) return(new_cluster);
 
fat_pointer = (u32)free_cluster;
fat_pointer -= 2;
fat_pointer *= SectorsPerCluster;
fat_pointer += FirstDataCluster;
new_cluster = FindNextFreeCluster(file); // the next free cluster found on the disk.
if(new_cluster)
{ // A free cluster was found and can be added to the end of the file.
fseek_(file, 0, SEEK_END); // jump to the end of the file
last_cluster = SectorToFat16Cluster(file->FirstSectorOfCurrCluster); // determine current file cluster
fat_byte_offset = ((u32)last_cluster)<<1;
sector = Partition.FirstFatSector + ( fat_byte_offset / BYTES_PER_SECTOR);
byte = fat_byte_offset % BYTES_PER_SECTOR;
 
file->cluster_pointer = fat_pointer; // continue wrtiting to the file in the new and free datacluster.
return(retvalue); // return 1 when a new cluster was appended to the file
if(file->SectorInCache != sector)
{
file->SectorInCache = sector; // update sector stored in buffer
if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache)) // read sector from sd-card
{
Fat16_Deinit();
return(0);
}
}
fat = (Fat16Entry_t *)(&(file->Cache[byte]));
fat->NextCluster = new_cluster; // append the free cluster to the end of the file in the FAT.
if(SD_SUCCESS != SDC_PutSector(file->SectorInCache, file->Cache)) // save the modified sector to the FAT.
{
Fat16_Deinit();
return(0);
}
file->FirstSectorOfCurrCluster = Fat16ClusterToSector(new_cluster);
file->SectorOfCurrCluster = 0;
file->ByteOfCurrSector = 0;
}
return(new_cluster);
}
 
/****************************************************************************************************************************************************/
/* Function: DirectoryEntryExist(s8 *, u8, u8, File_t *) */
/* */
/* Description: This function searches all possible dir entries until the file or directory is found or the end of the directory is reached */
/* */
/* Returnvalue: This function returns 1 if the directory entry specified was found. */
/****************************************************************************************************************************************************/
u8 DirectoryEntryExist(s8 *dirname, u8 attribfilter, u8 attribmask, File_t *file)
{
u32 dir_sector, max_dir_sector, curr_sector;
u16 dir_entry = 0;
 
//________________________________________________________________________________________________________________________________________
// Funtion: void DeleteClusterChain(u16 startcluster);
//
// Description: This function frees all the clusters used for file from the fat.
//
// Returnvalue: none
//________________________________________________________________________________________________________________________________________
u16 end_of_directory_not_reached = 0;
u8 i = 0;
u8 direntry_exist = 0;
DirEntry_t * dir;
 
void DeleteClusterChain(u16 startcluster)
{
u16 fat_index = 0;
u16 fat_sector_offset = 0;
u32 sector_in_buffer = 0;
u32 ul_temp = 0;
u8 buffer[512];
// if incomming pointers are useless return immediatly
if((!Partition.IsValid) || (file == NULL) || (dirname == NULL)) return(direntry_exist);
 
// dir entries can be searched only in filesclusters that have
// a corresponding dir entry with adir-flag set in its attribute
// or direct within the root directory area
fat_index = (startcluster % 0x100); // Calculate the sector within the cluster.
fat_sector_offset = (startcluster >> 8); // and the position within the sector.
ul_temp = (u32)(FileAllocationTable + fat_sector_offset);
do
file->FirstSectorOfFirstCluster = 0;
// no current directory exist therefore assume searching in the root
if(file->DirectorySector == 0)
{
if(sector_in_buffer != ul_temp)
max_dir_sector = (Partition.MaxRootEntries * DIRENTRY_SIZE)/BYTES_PER_SECTOR;
file->FirstSectorOfFirstCluster = Partition.FirstRootDirSector;
}
// within the root directory area we can read sectors sequentially until the end of this area
else if((Partition.FirstRootDirSector <= file->DirectorySector) && (file->DirectorySector < Partition.FirstDataSector))
{
max_dir_sector = (Partition.MaxRootEntries * DIRENTRY_SIZE)/BYTES_PER_SECTOR;
}
// within the data clusters we can read sectors sequentially only within the cluster
else if((Partition.FirstDataSector <= file->DirectorySector) && (file->DirectorySector <= Partition.LastDataSector))
{
max_dir_sector = Partition.SectorsPerCluster; // limit max secters before next cluster
}
else return (direntry_exist); // bad sector range for directory sector of the file
// if search area is not defined yet
if(file->FirstSectorOfFirstCluster == 0)
{
// check if the directory entry of current file is existent and has the dir-flag set
file->SectorInCache = file->DirectorySector; // update the sector number of file cache.
if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read in the sector.
{
sector_in_buffer = ul_temp;
SDC_GetSector(ul_temp,buffer);
Fat16_Deinit();
return(direntry_exist);
}
Fat = (struct FatEntry *)buffer;
startcluster = Fat[fat_index].next_cluster;
Fat[fat_index].next_cluster = 0x0000; // free the cluster within the fat.
 
fat_index = (startcluster % 0x100); // Calculate the sector within the cluster.
fat_sector_offset = (startcluster >> 8); // and the position within the sector.
ul_temp = (u32)(FileAllocationTable + fat_sector_offset);
if((sector_in_buffer != ul_temp) || (startcluster == 0xffff))
dir = (DirEntry_t *)file->Cache; // set pointer to directory
switch((u8)dir[file->DirectoryIndex].Name[0]) // check if current directory exist
{
SDC_PutSector(sector_in_buffer,buffer);
case SLOT_EMPTY:
case SLOT_DELETED:
// the directrory pointer of this file points to a deleted or not existen directory
// therefore no file or subdirectory can be created
return (direntry_exist);
break;
default: // and is a real directory
if((dir[file->DirectoryIndex].Attribute & ATTR_SUBDIRECTORY) != ATTR_SUBDIRECTORY)
{ // current file is not a directory therefore no file or subdirectory can be created here
return (direntry_exist);
}
break;
}
file->FirstSectorOfFirstCluster = Fat16ClusterToSector(dir[file->DirectoryIndex].StartCluster);
}
while(startcluster != 0xffff); // last cluster has been deleted.
}
 
// update current file data area position to start of first cluster
file->FirstSectorOfCurrCluster = file->FirstSectorOfFirstCluster;
file->SectorOfCurrCluster = 0;
file->ByteOfCurrSector = 0;
 
//________________________________________________________________________________________________________________________________________
// Funtion: u16 GetFatClusterIndex(File *file);
//
// Description: This function returns the clusterindex of the cluster specified by file->cluster_pointer of the specified file.
//
//________________________________________________________________________________________________________________________________________
do // loop over all data clusters of the current directory entry
{
dir_sector = 0; // reset sector counter within a new cluster
do // loop over all sectors of a cluster or all sectors of the root directory
{
curr_sector = file->FirstSectorOfCurrCluster + dir_sector; // calculate sector number
file->SectorInCache = curr_sector; // upate the sector number of file cache.
if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read the sector
{
Fat16_Deinit();
return(direntry_exist);
}
dir = (DirEntry_t *)file->Cache; // set pointer to directory
// search all directory entries within that sector
for(dir_entry = 0; dir_entry < DIRENTRIES_PER_SECTOR; dir_entry++)
{ // check for existing dir entry
switch((u8)dir[dir_entry].Name[0])
{
case SLOT_EMPTY:
case SLOT_DELETED:
// ignore empty or deleted dir entries
break;
default:
// if existing check attributes before names are compared will safe performance
if ((dir[dir_entry].Attribute & attribmask) != attribfilter) break; // attribute must match
// then compare the name to the giveb dirname (first 11 characters include 8 chars of basename and 3 chars extension.)
i = 0;
while((i < 11) && (dir[dir_entry].Name[i] == dirname[i])) i++;
if (i < 10) break; // names does not match
// if dirname and attribute have matched
file->Attribute = dir[dir_entry].Attribute; // store attribute of found dir entry
file->FirstSectorOfFirstCluster = Fat16ClusterToSector(dir[dir_entry].StartCluster); // set sector of first data cluster
file->FirstSectorOfCurrCluster = file->FirstSectorOfFirstCluster;
file->SectorOfCurrCluster = 0;
file->ByteOfCurrSector = 0;
file->DirectorySector = curr_sector; // current sector
file->DirectoryIndex = dir_entry; // current direntry in current sector
file->Size = dir[dir_entry].Size;
direntry_exist = 1; // mark as found
dir_entry = DIRENTRIES_PER_SECTOR; // stop for-loop
} // end of first byte of name check
}
dir_sector++; // search next sector
// stop if we reached the end of the cluster or the end of the root dir
}while((dir_sector < max_dir_sector) && (!direntry_exist));
 
u16 GetFatClusterOffset(File *file)
{
u32 fat_sector_offset = 0;
 
fat_sector_offset = ((file->cluster_pointer) - (FirstDataCluster)); // Calculate index of actual cluster in FAT.
fat_sector_offset /= SectorsPerCluster;
fat_sector_offset += 2; // In Fat16 clusterpositions have an offset of two.
return((u16)fat_sector_offset);
// if we are seaching in the data area and the file not found in this cluster so take next cluster.
if(!direntry_exist && ( Partition.FirstDataSector <= file->FirstSectorOfCurrCluster))
{
end_of_directory_not_reached = GetNextCluster(file); // updates File->FirstSectorOfCurrCluster
}
}while((end_of_directory_not_reached) && (!direntry_exist)); // repeat until a next cluster exist an no
return(direntry_exist);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u16 GetFatSectorIndex(File *file);
//
// Description: This function returns the sectorindex of the cluster specified by file->cluster_pointer of the specified file.
//
//________________________________________________________________________________________________________________________________________
 
u16 GetFatSectorIndex(File *file)
/****************************************************************************************************************************************/
/* Function: CreateDirectoryEntry(s8 *, u16, File_t *) */
/* */
/* Description: This function looks for the next free position in the directory and creates an entry. */
/* The type of an directory entry is specified by the file attribute. */
/* */
/* Returnvalue: Return 0 on error */
/****************************************************************************************************************************************/
u8 CreateDirectoryEntry(s8 *dirname, u8 attrib, File_t *file)
{
u16 fat_pointer = 0;
u32 dir_sector, max_dir_sector, curr_sector;
u16 dir_entry = 0;
u16 subdircluster, dircluster = 0;
u16 end_of_directory_not_reached = 0;
u8 i = 0;
u8 retvalue = 0;
DirEntry_t *dir;
 
if((!Partition.IsValid) || (file == NULL) || (dirname == NULL)) return (retvalue);
// It is not checked here that the dir entry that should be created is already existent!
fat_pointer = GetFatClusterOffset(file);
fat_pointer = fat_pointer % 0x100; // Calculate the clusterposition in the fat
// Dir entries can be created only in file-clusters that have
// the dir-flag set in its attribute or within the root directory
return(fat_pointer);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u16 CreateFileInDirectory(u8 *, File *)
//
// Description: This function looks for the next free position in the directory and creates an entry. The type of an directoryentry is
// specified by the attribute.
// bit0: unused
// bit1: archive
// bit2: read_only
// bit3: system
// bit4: directory
// bit5: volume
//________________________________________________________________________________________________________________________________________
 
u8 CreateFileInDirectory(s8 *fname, File *file)
{
u16 rootentry = 0; // index to an entry in the rootdirectory.
u16 cnt_enries_searched = 0; // count the number of rootentries which have been searched already.
u8 i = 0;
u16 sector_offset = 0; // index to the sector of the Rootentry which is searched momentarily
u8 retvalue = 0;
u32 cluster_temp = 0;
u16 cluster = 0;
s8 name[11] = " ";
 
SeperateFileName(fname,name);
 
cluster_temp = (u32)FindNextFreeCluster(file); // the next free cluster on the disk.
if(cluster_temp) // if a free cluster is available:
file->FirstSectorOfFirstCluster = 0;
// no current directory exist therefore assume creating in the root
if(file->DirectorySector == 0)
{
cluster = (u16)cluster_temp; // remember the index of the free datacluster found for the directory entry.
cluster_temp -=2; // Clusterposition is ((position in FAT)-2). first two entries in FAT are reserved.
cluster_temp *= SectorsPerCluster; // Calculate relative sectorindex of first datacluster.
file->start_cluster = (FirstDataCluster + cluster_temp); // Calculate absolute sectorposition of first datacluster.
file->cluster_pointer = file->start_cluster; // start reading the file with the first sector of the first datacluster.
// directory starts at sector specified by dir_sector. This can be the rootdirectory or any other directory.
do
{ // search the next 16 rootentries in this sector of the roordirectory.
rootentry=0;
SDC_GetSector((u32)(CWD + sector_offset),file->buffer); // Read the Rootdirectory.
DirectoryEntry = (struct DirEntry *)file->buffer;
while((rootentry<16) && (!retvalue))
max_dir_sector = (Partition.MaxRootEntries * DIRENTRY_SIZE)/BYTES_PER_SECTOR;
dircluster = 0;
file->FirstSectorOfFirstCluster = Partition.FirstRootDirSector;
}
// within the root directory area we can read sectors sequentially until the end of this area
else if((Partition.FirstRootDirSector <= file->DirectorySector) && (file->DirectorySector < Partition.FirstDataSector))
{
max_dir_sector = (Partition.MaxRootEntries * DIRENTRY_SIZE)/BYTES_PER_SECTOR;
}
// within the data clusters we can read sectors sequentially only within the cluster
else if((Partition.FirstDataSector <= file->DirectorySector) && (file->DirectorySector <= Partition.LastDataSector))
{
max_dir_sector = Partition.SectorsPerCluster;
}
else return (retvalue); // bad sector range for directory sector of the file
// if search area is not defined yet
if(file->FirstSectorOfFirstCluster == 0)
{
// check if the directory entry of current file is existent and has the dir-flag set
file->SectorInCache = file->DirectorySector; // update the sector number of file cache.
if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read in the sector.
{
Fat16_Deinit();
return(retvalue);
}
dir = (DirEntry_t *)file->Cache; // set pointer to directory
switch((u8)dir[file->DirectoryIndex].Name[0]) // check if current directory exist
{
case SLOT_EMPTY:
case SLOT_DELETED:
return (retvalue);
break;
default: // and is a real directory
if((dir[file->DirectoryIndex].Attribute & ATTR_SUBDIRECTORY) != ATTR_SUBDIRECTORY)
{ // current file is not a directory therefore no file or subdirectory can be created here
return (retvalue);
}
break;
}
dircluster = dir[file->DirectoryIndex].StartCluster;
file->FirstSectorOfFirstCluster = Fat16ClusterToSector(dircluster);
}
subdircluster = FindNextFreeCluster(file); // get the next free cluster on the disk and mark it as used.
if(subdircluster)
{
file->FirstSectorOfCurrCluster = file->FirstSectorOfFirstCluster;
file->SectorOfCurrCluster = 0;
do // loop over all clusters of current directory
{
dir_sector = 0; // reset sector counter within a new cluster
do // loop over all sectors of a cluster or all sectors of the root directory
{
if((DirectoryEntry[rootentry].attribute == 0) || (DirectoryEntry[rootentry].attribute == 0xE5)) // empty directory entry found
curr_sector = file->FirstSectorOfCurrCluster + dir_sector; // calculate sector number
file->SectorInCache = curr_sector; // upate the sector number of file cache.
if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read in the sector.
{
for(i=0;i<11;i++) DirectoryEntry[rootentry].name[i] = name[i];// Kopie the filename and the file extension to the directoryentry.
DirectoryEntry[rootentry].attribute = _FILE; // Set the fileattribute to archive to reserve the directoryentry.
DirectoryEntry[rootentry].startcluster = cluster; // copy the location of the first datacluster to the directoryentry.
DirectoryEntry[rootentry].size = 0; // the new createted file has no content yet.
file->directory_sector = (u32) (CWD + sector_offset);
file->directory_index = (u8) rootentry;
retvalue = 1;
SDC_PutSector((u32)(CWD + sector_offset),file->buffer);
Fat16_Deinit();
return(retvalue);
}
dir = (DirEntry_t *)file->Cache; // set pointer to directory
// search all directory entries of a sector
for(dir_entry = 0; dir_entry < DIRENTRIES_PER_SECTOR; dir_entry++)
{ // check if current direntry is available
if(((u8)dir[dir_entry].Name[0] == SLOT_EMPTY) || ((u8)dir[dir_entry].Name[0] == SLOT_DELETED))
{ // a free direntry was found
for(i = 0; i < 11; i++) dir[dir_entry].Name[i] = dirname[i]; // Set dir name
dir[dir_entry].Attribute = attrib; // Set the attribute of the new directoryentry.
dir[dir_entry].StartCluster = subdircluster; // copy the location of the first datacluster to the directoryentry.
dir[dir_entry].DateTime = FileDateTime(&SystemTime); // set date/time
dir[dir_entry].Size = 0; // the new createted file has no content yet.
if(SD_SUCCESS != SDC_PutSector(file->SectorInCache, file->Cache)) // write back to card
{
Fat16_Deinit();
return(retvalue);
}
file->FirstSectorOfFirstCluster = Fat16ClusterToSector(subdircluster); // Calculate absolute sectorposition of first datacluster.
file->FirstSectorOfCurrCluster = file->FirstSectorOfFirstCluster; // Start reading the file with the first sector of the first datacluster.
file->SectorOfCurrCluster = 0; // reset sector of cureen cluster
file->ByteOfCurrSector = 0; // reset the byte location within the current sector
file->Attribute = attrib; // set file attribute to dir attribute
file->Size = 0; // new file has no size
file->DirectorySector = curr_sector;
file->DirectoryIndex = dir_entry;
if((attrib & ATTR_SUBDIRECTORY) == ATTR_SUBDIRECTORY) // if a new directory was created then initilize the data area
{
ClearCurrCluster(file); // fill cluster with zeros
file->SectorInCache = file->FirstSectorOfFirstCluster;
if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read in the sector.
{
Fat16_Deinit();
return(retvalue);
}
dir = (DirEntry_t *)file->Cache;
// create direntry "." to current dir
dir[0].Name[0] = 0x2E;
for(i = 1; i < 11; i++) dir[0].Name[i] = ' ';
dir[0].Attribute = ATTR_SUBDIRECTORY;
dir[0].StartCluster = subdircluster;
dir[0].DateTime = 0;
dir[0].Size = 0;
// create direntry ".." to the upper dir
dir[1].Name[0] = 0x2E;
dir[1].Name[1] = 0x2E;
for(i = 2; i < 11; i++) dir[1].Name[i] = ' ';
dir[1].Attribute = ATTR_SUBDIRECTORY;
dir[1].StartCluster = dircluster;
dir[1].DateTime = 0;
dir[1].Size = 0;
if(SD_SUCCESS != SDC_PutSector(file->SectorInCache, file->Cache))// read in the sector.
{
Fat16_Deinit();
return(retvalue);
}
}
retvalue = 1;
dir_entry = DIRENTRIES_PER_SECTOR; // stop for-loop
}
}
rootentry++;
cnt_enries_searched++;
}
if(!retvalue) // file not found in this sector so take next sector.
dir_sector++; // search next sector
// stop if we reached the end of the cluster or the end of the root dir
}while((dir_sector < max_dir_sector) && (!retvalue));
// if we are seaching in the data area and the file not found in this cluster so take next cluster.
if(!retvalue && ( Partition.FirstDataSector <= file->FirstSectorOfCurrCluster))
{
rootentry = 0;
sector_offset++;
end_of_directory_not_reached = GetNextCluster(file); // updates File->FirstSectorOfCurrCluster
}
}
while((cnt_enries_searched< PossibleRootEntries) && (!retvalue));
 
}while((end_of_directory_not_reached) && (!retvalue));
// Perhaps we are at the end of the last cluster of a directory file an have no free direntry found.
// Then we would need to add a cluster to that file and create the new direntry there.
// This code is not implemented yet, because its occurs only if more that 32*32=1024 direntries are
// within a subdirectory of root.
}
return(retvalue); // return 1 if file has been created otherwise return 0.
return(retvalue); // return 1 if file has been created otherwise return 0.
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u16 SeekFileInDirectory(s8 *fname, File *)
//
// Description: this function searches all possible entries withint the actual directory for the specified object.
//
// Returnvalue: This function returns 1 if the directoryentry specified was found.
//________________________________________________________________________________________________________________________________________
 
u8 SeekFileInDirectory(s8 *fname, File *file)
/********************************************************************************************************************************************/
/* Function: FileExist(const s8* filename, u8 attribfilter, u8 attribmask, File_t *file); */
/* */
/* Description: This function looks for the specified file including its subdirectories beginning */
/* in the rootdirectory of the drive. If the file is found the Filepointer properties are */
/* updated. */
/* */
/* Returnvalue: 1 if file is found else 0. */
/********************************************************************************************************************************************/
u8 FileExist(const s8* filename, const u8 attribfilter, const u8 attribmask, File_t *file)
{
u16 rootentry=0;
u16 end_of_directory_not_reached = 0; // the directory has been read completely without a result.
u8 i=0;
u8 retvalue = 0;
u32 cluster_temp = 0;
s8 name[11] = " ";
SeperateFileName(fname,name);
file->cluster_pointer = CWD; // start looking for the file in the actual directory.
s8* path = 0;
s8* subpath = 0;
u8 af, am, file_exist = 0;
s8 dirname[12]; // 8+3 + temination character
 
// directory starts at sector specified by dir_sector. This can be the rootdirectory or any other directory.
do
{ // search the next 16 rootentries in this sector of the roordirectory.
rootentry=0;
SDC_GetSector((u32) file->cluster_pointer,file->buffer); // Read the Rootdirectory.
DirectoryEntry = (struct DirEntry *)file->buffer;
// if incomming pointers are useless return immediatly
if ((filename == NULL) || (file == NULL) || (!Partition.IsValid)) return 0;
 
while((!retvalue)&&(rootentry<16))
{
i=0;
if(DirectoryEntry[rootentry].name[0] != 0xe5) // ignore deleted items.
// trace along the filepath
path = (s8*)filename; // start a the beginning of the filename string
file->DirectorySector = 0; // start at RootDirectory with file search
file->DirectoryIndex = 0;
// as long as the file was not found and the remaining path is not empty
while((*path != 0) && !file_exist)
{ // separate dirname and subpath from filepath string
subpath = SeperateDirName(path, dirname);
if(subpath != NULL)
{
if(*subpath == 0)
{ // empty subpath indicates last element of dir chain
af = attribfilter;
am = attribmask;
}
else // it must be a subdirectory and no volume label
{
while((i<=10)&&(DirectoryEntry[rootentry].name[i] == name[i]))
af = ATTR_SUBDIRECTORY;
am = ATTR_SUBDIRECTORY|ATTR_VOLUMELABEL;
}
if(!DirectoryEntryExist(dirname, af, am, file))
{
return (file_exist); // subdirectory does not exist
}
else
{
if (*subpath == 0)
{
i++;
file_exist = 1; // last element of path chain was found with the given attribute filter
}
}
 
if((i==11) && (DirectoryEntry[rootentry].attribute & _FILE)) // entry found!! -> reading startcluster of entry from offset 26.
{
cluster_temp = (u32)DirectoryEntry[rootentry].startcluster;
cluster_temp -=2; // Clusterposition is ((position in FAT)-2). first two entries in FAT are reserved.
cluster_temp *= (u32)SectorsPerCluster; // Calculate positon of first cluster.
file->start_cluster = (FirstDataCluster + cluster_temp);
file->directory_sector = (u32) file->cluster_pointer;
file->cluster_pointer = file->start_cluster; // start reading the file with the first cluster.
file->filesize = (u32) DirectoryEntry[rootentry].size;
file->directory_index = (u8) rootentry;
retvalue = 1;
}
rootentry++;
}
if(!retvalue) // file not found in this sector so take next sector.
else // error seperating the subpath
{
end_of_directory_not_reached = GetNextCluster(file);
return file_exist; // bad subdir format
}
path = subpath;
subpath = 0;
}
while((end_of_directory_not_reached) && (!retvalue));
return(retvalue);
return (file_exist);
}
 
 
/********************************************************************************************************************************************/
/* Function: FileCreate(const s8* filename, u8 attrib, File_t *file); */
/* */
/* Description: This function looks for the specified file including its subdirectories beginning */
/* in the rootdirectory of the partition. If the file is found the Filepointer properties are */
/* updated. If file or its subdirectories are not found they will be created */
/* */
/* Returnvalue: 1 if file was created else 0. */
/********************************************************************************************************************************************/
u8 FileCreate(const s8* filename, const u8 attrib, File_t *file)
{
s8 *path = 0;
s8 *subpath = 0;
u8 af, am, file_created = 0;
s8 dirname[12];
 
//________________________________________________________________________________________________________________________________________
// Funtion: void SeperateFileName(u8*);
//
// Description: This function seperates the filename and the fileattribute and brings them into the needed format ('test.txt' -> 'TEST TXT');
//
//________________________________________________________________________________________________________________________________________
// if incomming pointers are useless return immediatly
if ((filename == NULL) || (file == NULL) || (!Partition.IsValid)) return 0;
 
void SeperateFileName(s8 *fname, s8 *name)
{
u8 readpointer = 0;
u8 writepointer = 0;
u8 attribute = 1;
u8 i = 0;
while((writepointer<=10) && (fname[readpointer]!=0)) // the rootdirectoryentry is 8bytes for filename and 3bytes for fileattribute.
{ // the filename in the rootdirectory is in the format "TEST TXT" without the dot.
if(fname[readpointer]=='.') // seperating filename and attribute.
// trace along the filepath
path = (s8*)filename; // start a the beginning of the filename string
file->DirectorySector = 0; // start at RootDirectory with file search
file->DirectoryIndex = 0;
// as long as the file was not created and the remaining file path is not empty
while((*path != 0) && !file_created)
{ // separate dirname and subpath from filepath string
subpath = SeperateDirName(path, dirname);
if(subpath != NULL)
{
if(attribute) // is the filename "." or ".." ?
{
name[writepointer] = fname[readpointer];
readpointer++;
writepointer++;
if(*subpath == 0)
{ // empty subpath indicates last element of dir chain
af = ATTR_NONE;
am = ATTR_SUBDIRECTORY|ATTR_VOLUMELABEL; // any file that is no subdir or volume label
}
else
else // it must be a subdirectory and no volume label
{
if(fname[(readpointer-1)] != '*')
{
for(i=writepointer;i<8;i++)
{
name[i] = ' ';
}
}
readpointer++;
writepointer = 8;
af = ATTR_SUBDIRECTORY;
am = ATTR_SUBDIRECTORY|ATTR_VOLUMELABEL;
}
}
else if(fname[readpointer] == '*') // wildcard found within the filename + extension.
{
if(writepointer < 8) // in extension.
{
readpointer++;
writepointer = 8;
if(!DirectoryEntryExist(dirname, af, am, file)) // if subdir or file is not existent
{ // try to create subdir or file
if(*subpath == 0) af = attrib; // if last element in dir chain take the given attribute
if(!CreateDirectoryEntry(dirname, af, file))
{ // could not be created
return(file_created);
}
else if (*subpath == 0) file_created = 1; // last element of path chain was created
}
else // in filename.
{
writepointer = 11; // jump to the end of the string to terminate this function.
}
attribute = 0;
}
else
else // error seperating the subpath
{
if((fname[readpointer]>96) && (fname[readpointer]<123))
{
name[writepointer]=(fname[readpointer] - 32); // all characters must be upper case.
}
else
{
name[writepointer]=fname[readpointer];
}
readpointer++;
writepointer++;
attribute = 0;
return file_created; // bad subdir format
}
}
path = subpath;
subpath = 0;
}
return (file_created);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: File * ReserveFilePointer_(void);
//
// Description: This function looks for a free filepointer and reserves it.
//
//
// Return: NULL = faild to reserve a filepointer
// otherwise filepointer
//________________________________________________________________________________________________________________________________________
 
File * ReserveFilePointer(void)
{
File *file;
file = NULL;
u8 temp;
/********************************************************************************************************************************************/
/* Function: File_t * fopen_(s8* filename, s8 mode); */
/* */
/* Description: This function looks for the specified file in the rootdirectory of the drive. If the file is found the number of the */
/* corrosponding filepointer is returned. Only modes 'r' (reading) and 'a' append are implemented yet. */
/* */
/* Returnvalue: The filepointer to the file or 0 if faild. */
/********************************************************************************************************************************************/
File_t * fopen_(const s8 *filename, const s8 mode)
{
File_t *file = 0;
for(temp = 0;temp<__MAX_FILES_USED;temp++)
{
if(FilePointer[temp].state == _UNUSED) // free filepointer found?
if((!Partition.IsValid) || (filename == 0)) return(file);
 
// Look for an unused filepointer in the file pointer list?
file = LockFilePointer();
// if no unused file pointer was found return 0
if(file == NULL) return(file);
 
// now we have found a free filepointer and claimed it
// so let initiate its property values
file->FirstSectorOfFirstCluster = 0; // Sectorpointer to the first sector of the first datacluster of the file.
file->FirstSectorOfCurrCluster = 0; // Pointer to the cluster which is edited at the moment.
file->SectorOfCurrCluster = 0; // The sector which is edited at the moment (cluster_pointer + sector_index).
file->ByteOfCurrSector = 0; // The bytelocation within the current sector (cluster_pointer + sector_index + byte_index).
file->Mode = mode; // mode of fileoperation (read,write)
file->Size = 0; // the size of the opened file in bytes.
file->Position = 0; // pointer to a byte within the file 0 < fileposition < filesize
file->SectorInCache = 0; // the last sector read, wich is still in the sectorbuffer.
file->DirectorySector = 0; // the sectorposition where the directoryentry has been made.
file->DirectoryIndex = 0; // the index to the directoryentry within the specified sector.
file->Attribute = 0; // the attribute of the file opened.
 
// check if a real file (no directory) to the given filename exist
if(FileExist(filename, ATTR_NONE, ATTR_SUBDIRECTORY|ATTR_VOLUMELABEL, file))
{ // file exist
switch(mode) // check mode
{
file = &FilePointer[temp];
FilePointer[temp].state = _USED; // mark as used.
FilePointer[temp].mode = 0; // type of access (read/write) not defined yet.
FilePointer[temp].start_cluster = 0; // Sectorpointer to the first sector of the first datacluster of the file.
FilePointer[temp].cluster_pointer = 0; // Pointer to the cluster which is edited at the moment.
FilePointer[temp].sector_index = 0; // The sector which is edited at the moment (cluster_pointer + sector_index).
FilePointer[temp].byte_index = 0; // The bytelocation within the current sector (cluster_pointer + sector_index + byte_index).
FilePointer[temp].filesize = 0; // the size of the opend file in bytes.
FilePointer[temp].fileposition = 0; // pointer to a character within the file 0 < fileposition < filesize
FilePointer[temp].sector_in_buffer = 0; // the last sector read, wich is still in the sectorbuffer.
FilePointer[temp].directory_sector = 0; // the sectorposition where the directoryentry has been made.
FilePointer[temp].directory_index = 0; // the index to the directoryentry within the specified sector.
FilePointer[temp].attribute = 0; // the attribute of the file opened.
case 'a': // if mode is: append to file
if((file->Attribute & ATTR_READONLY) == ATTR_READONLY)
{ // file is marked as readonly --> do not open this file
fclose_(file);
file = NULL;
}
else
{ // file is not marked as read only --> goto end of file
fseek_(file, 0, SEEK_END); // point to the end of the file
}
break;
case 'w': // if mode is: write to file
if((file->Attribute & ATTR_READONLY) == ATTR_READONLY)
{ // file is marked as readonly --> do not open this file
fclose_(file);
file = NULL;
}
else
{ // file is not marked as read only --> goto start of file
// free all clusters of that file
DeleteClusterChain(SectorToFat16Cluster(file->FirstSectorOfFirstCluster));
// mar an empy cluster as the last one and store the corresponding sector
file->FirstSectorOfFirstCluster = Fat16ClusterToSector(FindNextFreeCluster(file));
file->FirstSectorOfCurrCluster = file->FirstSectorOfFirstCluster;
file->SectorOfCurrCluster = 0;
file->ByteOfCurrSector = 0;
file->Size = 0;
file->Position = 0;
fseek_(file, 0, SEEK_SET);
}
break;
case 'r': // if mode is: read from file
// goto end of file
fseek_(file, 0, SEEK_SET);
break;
default: // other modes are not supported
fclose_(file);
file = NULL;
break;
}
return(file);
}
else // file does not exist
{
switch(mode) // check mode
{
case 'a':
case 'w': // if mode is write or append
// try to create the file
if(!FileCreate(filename, ATTR_ARCHIVE, file))
{ // if it could not be created
fclose_(file);
file = NULL;
}
break;
case 'r': // else opened for 'r'
default: // of unsupported mode
fclose_(file);
file = NULL;
break;
}
return(file);
}
// we should never come to this point
fclose_(file);
file = NULL;
return(file);
}
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: void FreeFilePointer_(File *);
//
// Description: This function free's the filepointer by marking it as unused.
//
//
// Return: none
//
//________________________________________________________________________________________________________________________________________
 
void FreeFilePointer(File *file)
/****************************************************************************************************************************************************/
/* Function: fflush_(File *); */
/* */
/* Description: This function writes the data already in the buffer but not yet written to the file. */
/* */
/* Returnvalue: 0 on success EOF on error */
/****************************************************************************************************************************************************/
s16 fflush_(File_t *file)
{
u8 cnt = 0;
DirEntry_t *dir;
for(cnt=0;cnt<__MAX_FILES_USED;cnt++) // Is the filepointeradress vaild?
if((file == NULL) || (!Partition.IsValid)) return (EOF);
switch(file->Mode)
{
if(&FilePointer[cnt] == file) // filepointer found therefore it must be valid
{
FilePointer[cnt].state = _UNUSED; // and can be marked as unused.
}
case 'a':
case 'w':
if(file->ByteOfCurrSector > 0) // has data been added to the file?
{
if(SD_SUCCESS != SDC_PutSector(file->SectorInCache, file->Cache))// save the data still in the buffer
{
Fat16_Deinit();
return(EOF);
}
}
file->SectorInCache = file->DirectorySector;
if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache)) // read the directory entry for this file.
{
Fat16_Deinit();
return(EOF);
}
dir = (DirEntry_t *)file->Cache;
dir[file->DirectoryIndex].Size = file->Size; // update file size
dir[file->DirectoryIndex].DateTime = FileDateTime(&SystemTime); // update date time
if(SD_SUCCESS != SDC_PutSector(file->SectorInCache, file->Cache)) // write back to sd-card
{
Fat16_Deinit();
return(EOF);
}
break;
case 'r':
default:
return(EOF);
break;
 
}
return(0);
}
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: void DelteDirectoryEntry(Find *)
//
// Description: This function deletes the directoryentry of the specified item.
//
//
// returnvalue: 1 if the directory could be created.
//________________________________________________________________________________________________________________________________________
 
void DeleteDirectoryEntry(Find *item)
/****************************************************************************************************************************************/
/* Function: fclose_(File *file); */
/* */
/* Description: This function closes the open file by writing the remaining data */
/* from the buffer to the device and entering the filesize in the directory entry. */
/* */
/* Returnvalue: 0 on success EOF on error */
/****************************************************************************************************************************************/
s16 fclose_(File_t *file)
{
u8 buffer[512];
SDC_GetSector((u32) item->cluster_pointer,buffer); // Read the Rootdirectory.
DirectoryEntry = (struct DirEntry *)buffer;
s16 returnvalue = EOF;
 
DirectoryEntry[(item->directory_index)-1].attribute = 0; // free the directoryentry.
DirectoryEntry[(item->directory_index)-1].name[0] = 0xE5; // free the directoryentry.
SDC_PutSector((u32) item->cluster_pointer,buffer); // Read the Rootdirectory.
if(file == NULL) return(returnvalue);
returnvalue = fflush_(file);
UnlockFilePointer(file);
return(returnvalue);
}
 
 
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 CreateSubDirectory(u8 *)
//
// Description: This function creates an directory within the directory specified by CWD
//
//
// returnvalue: 1 if the directory could be created.
//________________________________________________________________________________________________________________________________________
 
u8 CreateSubDirectory(s8 *fname)
{
u16 index = 0; // index to an entry in the rootdirectory.
u16 cnt_entries_searched = 0; // count the number of rootentries which have been searched already.
u16 i = 0;
u16 sector_offset = 0; // index to the sector of the entry which is searched momentarily
u8 retvalue = 0;
u32 cluster_temp = 0;
u16 cluster = 0;
File file;
s8 name[11] = {" "};
 
SeperateFileName(fname,name);
cluster_temp = (u32)FindNextFreeCluster(&file); // the next free cluster on the disk.
/********************************************************************************************************************************************/
/* Function: fgetc_(File *file); */
/* */
/* Description: This function reads and returns one character from the specified file. Is the end of the actual sector reached the */
/* next sector of the cluster is read. If the last sector of the cluster read the next cluster will be searched in FAT. */
/* */
/* Returnvalue: The function returns the character read from the specified memorylocation as u8 casted to s16 or EOF. */
/********************************************************************************************************************************************/
s16 fgetc_(File_t *file)
{
s16 c = EOF;
u32 curr_sector;
if(cluster_temp) // if a free cluster is available:
if( (!Partition.IsValid) || (file == NULL)) return(c);
// if the end of the file is not reached, get the next character.
if((0 < file->Size) && ((file->Position+1) < file->Size) )
{
cluster = (u16)cluster_temp; // remember the index of the free datacluster found for the directory entry.
cluster_temp -=2; // Clusterposition is ((position in FAT)-2). first two entries in FAT are reserved.
cluster_temp *= SectorsPerCluster; // Calculate relative sectorindex of first datacluster.
file.start_cluster = (FirstDataCluster + cluster_temp); // Calculate absolute sectorposition of first datacluster.
file.cluster_pointer = file.start_cluster; // start reading the file with the first sector of the first datacluster.
curr_sector = file->FirstSectorOfCurrCluster; // calculate the sector of the next character to be read.
curr_sector += file->SectorOfCurrCluster;
// -Initialise new cluster to zero--------------------------------------------------------
for(i=0;i<512;i++)
if(file->SectorInCache != curr_sector)
{
file.buffer[i] = 0; // initialise buffer to zero
}
for(sector_offset=0;sector_offset<SectorsPerCluster;sector_offset++) // initialise all sectors of new cluster with buffer.
file->SectorInCache = curr_sector;
if(SD_SUCCESS != SDC_GetSector(file->SectorInCache,file->Cache))
{
Fat16_Deinit();
return(c);
}
}
c = (s16) file->Cache[file->ByteOfCurrSector];
file->Position++; // increment file position
file->ByteOfCurrSector++; // goto next byte in sector
if(file->ByteOfCurrSector >= BYTES_PER_SECTOR) // if end of sector
{
SDC_PutSector((u32)(file.start_cluster + sector_offset),file.buffer); // save the initialised sector to the card.
}
// -Create directoryentry "." -------------------------------------------------------------
DirectoryEntry = (struct DirEntry *)file.buffer;
DirectoryEntry[0].name[0] = '.';
DirectoryEntry[0].attribute = _DIRECTORY;
DirectoryEntry[0].startcluster = cluster;
// -Create directoryentry "." -------------------------------------------------------------
DirectoryEntry[1].name[0] = '.';
DirectoryEntry[1].name[1] = '.';
DirectoryEntry[1].attribute = _DIRECTORY;
if(CWD == RootDirectory)
{
DirectoryEntry[1].startcluster = 0;
}
else
{
cluster_temp = (CWD - FirstDataCluster);
cluster_temp /= SectorsPerCluster;
cluster_temp -= 2;
DirectoryEntry[1].startcluster = (u16) cluster_temp;
}
SDC_PutSector((u32) file.start_cluster,file.buffer); // save the initialised sector to the card.
// -create directoryentry within the cwd --------------------------------------------------
sector_offset = 0;
cnt_entries_searched = 0;
do
{ // search the next 16 rootentries in this sector of the roordirectory.
index=0;
SDC_GetSector((u32)(CWD + sector_offset),file.buffer); // Read the actual directory.
DirectoryEntry = (struct DirEntry *)file.buffer;
while((index<16) && (!retvalue))
file->ByteOfCurrSector = 0; // reset byte location
file->SectorOfCurrCluster++; // next sector
if(file->SectorOfCurrCluster >= Partition.SectorsPerCluster) // if end of cluster is reached, the next datacluster has to be searched in the FAT.
{
if((DirectoryEntry[index].attribute == 0) || (DirectoryEntry[index].attribute == 0xE5)) // empty directory entry found
if(GetNextCluster(file)) // Sets the clusterpointer of the file to the next datacluster.
{
for(i=0;i<11;i++) DirectoryEntry[index].name[i] = name[i]; // Kopie the filename and the file extension to the directoryentry.
DirectoryEntry[index].attribute = _DIRECTORY; // Set the fileattribute to archive to reserve the directoryentry.
DirectoryEntry[index].startcluster = cluster; // copy the location of the first datacluster to the directoryentry.
DirectoryEntry[index].size = 0; // the new createted file has no content yet.
file.directory_sector = (u32) (CWD + sector_offset);
file.directory_index = (u8) index;
retvalue = 1;
SDC_PutSector((u32)(CWD + sector_offset),file.buffer);
}
index++;
cnt_entries_searched++;
file->SectorOfCurrCluster = 0; // start reading new cluster at first sector of the cluster.
}
else // the last cluster was allready reached
{
file->SectorOfCurrCluster--; // jump back to the last sector in the last cluster
file->ByteOfCurrSector = BYTES_PER_SECTOR; // set ByteOfCurrSector one byte over sector end
}
}
if(!retvalue) // file not found in this sector so take next sector.
{
index = 0;
sector_offset++;
}
}
while((cnt_entries_searched< PossibleRootEntries) && (!retvalue));
 
}
return(retvalue); // return 1 if file has been created otherwise return 0.
return(c);
}
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: u16 SeekSubDirectory(s8 *fname)
//
// Description: looks for the specified directory within the CWD.
//
// Returnvalue: If the specified directory was found the startcluster is returned. otherwise 0.
//________________________________________________________________________________________________________________________________________
 
u16 SeekSubDirectory(s8 *fname)
{
u16 index = 0;
u16 end_of_directory_not_reached = 0; // the directory has been read completely without a result.
u8 i = 0;
u16 cluster_temp = 0;
s8 name[11] = " ";
File file;
 
SeperateFileName(fname,name);
/********************************************************************************************************************************************/
/* Function: fputc_( const s8 c, File *file); */
/* */
/* Description: This function writes a byte to the specified file and takes care of writing the necessary FAT- Entries. */
/* next sector of the cluster is read. If the last sector of the cluster read the next cluster will be searched in FAT. */
/* */
/* Returnvalue: The function returns the character written to the stream or EOF on error. */
/********************************************************************************************************************************************/
s16 fputc_(const s8 c, File_t *file)
{
u32 curr_sector = 0;
file.cluster_pointer = CWD; // start looking for the file in the actual directory.
file.start_cluster = CWD; // start looking for the file in the actual directory.
if((!Partition.IsValid) || (file == NULL)) return(EOF);
 
// directory starts at sector specified by dir_sector. This can be the rootdirectory or any other directory.
do
{ // search the next 16 rootentries in this sector of the roordirectory.
index=0;
SDC_GetSector((u32) file.cluster_pointer,file.buffer); // Read the Rootdirectory.
DirectoryEntry = (struct DirEntry *)file.buffer;
// If file position equals to file size, then the end of file has reached.
// In this chase it has to be checked that the ByteOfCurrSector is BYTES_PER_SECTOR
// and a new cluster should be appended.
if((file->Position >= file->Size) && (file->ByteOfCurrSector >= BYTES_PER_SECTOR))
{
if(!AppendCluster(file)) return(EOF);
}
 
while((!cluster_temp)&&(index<16))
curr_sector = file->FirstSectorOfCurrCluster;
curr_sector += file->SectorOfCurrCluster;
if(file->SectorInCache != curr_sector)
{
file->SectorInCache = curr_sector;
if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))
{
i=0;
if(DirectoryEntry[index].name[0] != 0xe5) // ignore deleted items.
{
while((i<=10)&&(DirectoryEntry[index].name[i] == name[i]))
Fat16_Deinit();
return(EOF);
}
}
 
file->Cache[file->ByteOfCurrSector] = (u8)c; // write databyte into the buffer. The byte will be written to the device at once
if(file->Size == file->Position) file->Size++; // a character has been written to the file so the size is incremented only when the character has been added at the end of the file.
file->Position++; // the actual positon within the file.
file->ByteOfCurrSector++; // goto next byte in sector
if(file->ByteOfCurrSector >= BYTES_PER_SECTOR) // if the end of this sector is reached yet
{ // save the sector to the sd-card
if(SD_SUCCESS != SDC_PutSector(file->SectorInCache, file->Cache))
{
Fat16_Deinit();
return(EOF);
}
file->ByteOfCurrSector = 0; // reset byte location
file->SectorOfCurrCluster++; // next sector
if(file->SectorOfCurrCluster >= Partition.SectorsPerCluster)// if end of cluster is reached, the next datacluster has to be searched in the FAT.
{
if(!GetNextCluster(file)) // Sets the clusterpointer of the file to the next datacluster.
{ // if current cluster was the last cluster of the file
if(!AppendCluster(file)) // append a new and free cluster at the end of the file.
{
i++;
file->SectorOfCurrCluster--; // jump back to last sector of last cluster
file->ByteOfCurrSector = BYTES_PER_SECTOR; // set byte location to 1 byte over sector len
return(EOF);
}
}
 
if((i==11) && (DirectoryEntry[index].attribute & _DIRECTORY)) // entry found!! -> reading startcluster of entry from offset 26.
else // next cluster
{
cluster_temp = (u16)DirectoryEntry[index].startcluster;
}
index++;
file->SectorOfCurrCluster = 0; // start reading new cluster at first sector of the cluster.
}
}
if(!cluster_temp) // file not found in this sector so take next sector.
{
end_of_directory_not_reached = GetNextCluster(&file);
}
}
while((end_of_directory_not_reached) && (!cluster_temp));
return(cluster_temp);
return(0);
}
 
 
/****************************************************************************************************************************************/
/* Function: fread_(void *buffer, s32 size, s32 count, File *File); */
/* */
/* Description: This function reads count objects of the specified size */
/* from the actual position of the file to the specified buffer. */
/* */
/* Returnvalue: The function returns the number of objects (not bytes) read from the file. */
/****************************************************************************************************************************************/
u32 fread_(void *buffer, u32 size, u32 count, File_t *file)
{
u32 object_cnt = 0; // count the number of objects read from the file.
u32 object_size = 0; // count the number of bytes read from the actual object.
u8 *pbuff = 0; // a pointer to the actual bufferposition.
u8 success = 1; // no error occured during read operation to the file.
s16 c;
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 mkdir_(u8 *)
//
// Description: This function checks if the directory to be created already exists. If not the directory will be created.
//
//
// returnvalue: 1 if the directory could be created.
//________________________________________________________________________________________________________________________________________
if((!Partition.IsValid) || (file == NULL) || (buffer == NULL)) return(0);
 
u8 mkdir_(s8 *fname)
{
u8 retvalue = 0;
pbuff = (u8 *) buffer; // cast the void pointer to an u8 *
retvalue = SeekSubDirectory(fname); // check wether the specified directory already exists.
if(!retvalue)
while((object_cnt < count) && success)
{
CreateSubDirectory(fname); // if directory doesn't exist, create it.
retvalue = 1;
}
else
{
retvalue = 0;
}
return(retvalue);
object_size = size;
while((size > 0) && success)
{
c = fgetc_(file);
if(c != EOF)
{
*pbuff = (u8)c; // read a byte from the buffer to the opened file.
pbuff++;
size--;
}
else // error or end of file reached
{
success = 0;
}
}
if(success) object_cnt++;
}
return(object_cnt); // return the number of objects succesfully read from the file
}
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 chdir_(u8 *)
//
// Description: This function changes the CWD to the directory specified.
//
//
// returnvalue: 1 if the directory could be changed.
//________________________________________________________________________________________________________________________________________
 
u8 chdir_(s8 *fname)
/****************************************************************************************************************************************/
/* Function: fwrite_(void *buffer, s32 size, s32 count, File *file); */
/* */
/* Description: This function writes count objects of the specified size */
/* from the buffer pointer to the actual position in the file. */
/* */
/* Returnvalue: The function returns the number of objects (not bytes) read from the file. */
/****************************************************************************************************************************************/
u32 fwrite_(void *buffer, u32 size, u32 count, File_t *file)
{
u8 retvalue = 0;
s8 name[11] = {" "};
u32 ultemp = 0;
u32 object_cnt = 0; // count the number of objects written to the file.
u32 object_size = 0; // count the number of bytes written from the actual object.
u8 *pbuff = 0; // a pointer to the actual bufferposition.
u8 success = 1; // no error occured during write operation to the file.
s16 c;
 
SeperateFileName(fname,name);
if((!Partition.IsValid) || (file == NULL) || (buffer == NULL)) return(0);
 
pbuff = (u8 *) buffer; // cast the void pointer to an u8 *
ultemp = (u32)SeekSubDirectory(name);
if(ultemp >= 2)
while((object_cnt < count) && success)
{
ultemp -=2; // Clusterposition is ((position in FAT)-2). first two entries in FAT are reserved.
ultemp *= SectorsPerCluster; // Calculate relative sectorindex of first datacluster.
ultemp += FirstDataCluster;
CWD = ultemp;
retvalue = 1;
}
else
{
CWD = RootDirectory;
retvalue = 1;
}
 
return(retvalue);
}
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 FindItem(s8 *fname, Find *)
//
// Description: finds an item (file or directory) within common working directory (cwd). Wildcards '*' or '?' will be considered.
//
// Returnvalue: If an item was found this function returns '1' else '0'.
//________________________________________________________________________________________________________________________________________
 
u8 FindItem(Find *item)
{
u16 index = 0;
u16 end_of_directory_not_reached = 0; // the directory has been read completely without a result.
u8 i = 0;
u8 readpointer = 0;
u8 writepointer = 0;
u8 retvalue = 0;
File file;
 
file.cluster_pointer = item->cluster_pointer;
file.start_cluster = item->cluster_pointer;
index = item->directory_index;
// directory starts at sector specified by dir_sector. This can be the rootdirectory or any other directory.
do
{ // search the next 16 rootentries in this sector of the roordirectory.
SDC_GetSector((u32) file.cluster_pointer,file.buffer); // Read the Rootdirectory.
DirectoryEntry = (struct DirEntry *)file.buffer;
 
while((!retvalue)&&(index<16))
object_size = size;
while((size > 0) && success)
{
i=0;
if(DirectoryEntry[index].name[0] != 0xe5) // ignore deleted items.
c = fputc_(*pbuff, file); // write a byte from the buffer to the opened file.
if(c != EOF)
{
while((i<=10)&&((DirectoryEntry[index].name[i] == item->searchstring[i]) || (item->searchstring[i]=='*') || item->searchstring[i]=='?'))
{
i++;
}
pbuff++;
size--;
}
 
if((i==11) && (DirectoryEntry[index].attribute & item->attribute))
else
{
for(readpointer=0;readpointer<=10;readpointer++)
{
if(DirectoryEntry[index].name[readpointer] != ' ')
{
item->name[writepointer] = DirectoryEntry[index].name[readpointer]; // copy the name of the item found to the find_structure.
writepointer++;
}
else if((readpointer==7) && (DirectoryEntry[index].attribute == _FILE)) // if the item found is a file
{
if(DirectoryEntry[index].name[readpointer] != ' ')
{
item->name[writepointer] = DirectoryEntry[index].name[readpointer]; // copy the name of the item found to the find_structure.
writepointer++;
}
item->name[writepointer] = '.'; // then seperate the name and the extension by a '.' at index 8.
writepointer++;
}
}
item->startcluster = (u16)DirectoryEntry[index].startcluster;
item->directory_index = ++index;
item->cluster_pointer = file.cluster_pointer;
retvalue = 1;
success = 0;
}
index++;
}
if(!retvalue) // file not found in this sector so take next sector.
{
end_of_directory_not_reached = GetNextCluster(&file);
}
index = 0;
}
while((end_of_directory_not_reached) && (!retvalue));
if(success) object_cnt++;
}
return(retvalue);
}
return(object_cnt); // return the number of objects succesfully written to the file
}
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 findfirst(s8 *fname, Find *)
//
// Description: finds the first item (file or directory) within common working directory (cwd). Wildcards '*' or '?' will be considered.
//
// Returnvalue: If an item was found this function returns '1' else '0'.
//________________________________________________________________________________________________________________________________________
 
u8 findfirst_(s8 *fname, Find *item, u8 attribute)
/****************************************************************************************************************************************/
/* Function: fputs_(const s8 *string, File_t *File); */
/* */
/* Description: This function writes a string to the specified file. */
/* */
/* Returnvalue: The function returns a no negative value or EOF on error. */
/****************************************************************************************************************************************/
s16 fputs_(const s8 *string, File_t *file)
{
u8 retvalue = 0;
u8 i = 0;
 
for(i=0;i<=11;i++)
{
item->searchstring[i] = '*'; // initialise the searchstring with wildcards.
item->name[i] = 0;
}
 
SeperateFileName(fname,item->searchstring);
u8 i=0;
s16 c = 0;
item->cluster_pointer = CWD; // findfirst_ starts at the beginning of the cwd.
item->directory_index = 0;
item->attribute = attribute;
retvalue = FindItem(item);
if((!Partition.IsValid) || (file == NULL) || (string == NULL)) return(0);
 
return(retvalue);
}
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 findnext(Find *)
//
// Description: finds the first item (file or directory) within common working directory (cwd). Wildcards '*' or '?' will be considered.
//
// Returnvalue: If an item was found this function returns '1' else '0'.
//________________________________________________________________________________________________________________________________________
 
u8 findnext_(Find *item)
{
u8 retvalue = 0;
u8 i = 0;
 
for(i=0;i<=11;i++) // copy the name of the searched item to the findstructure.
while((string[i] != 0)&& (c != EOF))
{
item->name[i] = 0;
c = fputc_(string[i], file);
i++;
}
 
retvalue = FindItem(item); // search the item.
 
return(retvalue);
return(c);
}
 
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 fdelete(s8 *fname)
//
// Description: Deletes the file specified by fname.
//
// Returnvalue:
//________________________________________________________________________________________________________________________________________
 
u8 fdelete_(s8 *fname)
/****************************************************************************************************************************************/
/* Function: fgets_(s8 *, s16 , File_t *); */
/* */
/* Description: This function reads a string from the file to the specifies string. */
/* */
/* Returnvalue: A pointer to the string read from the file or 0 on error. */
/****************************************************************************************************************************************/
u8 * fgets_(s8 *string, s16 length, File_t *file)
{
u8 retvalue = 0;
Find item;
u8 *pbuff;
s16 c = 0;
retvalue = findfirst_(fname,&item, _FILE); // look for the item to be deleted.
 
if(retvalue); // item found?
if((!Partition.IsValid) || (file == NULL) || (string == NULL) || (length = 0)) return (0);
pbuff = string;
while(length > 1) // read the count-1 characters from the file to the string.
{
DeleteClusterChain(item.startcluster); // delete all fatentries of the item.
DeleteDirectoryEntry(&item); // free the directoryentry.
do
c = fgetc_(file); // read a character from the opened file.
switch(c)
{
retvalue = findnext_(&item);
if(retvalue)
{
DeleteClusterChain(item.startcluster); // delete all fatentries of the item.
DeleteDirectoryEntry(&item); // free the directoryentry.
}
case 0x0A:
c = 0; // set string terminator
length = 1; // stop loop
break;
case EOF:
c = 0; // set string terminator
length = 1; // stop loop
break;
}
while(retvalue);
*pbuff = (u8)c; // copy byte to string
length--;
pbuff++;
}
 
return(retvalue);
return(string);
}
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 rmdir(s8 *fname)
//
// Description: Deletes the directory specified by dname.
//
// Returnvalue:
//________________________________________________________________________________________________________________________________________
 
u8 rmdir_(s8 *dname)
/****************************************************************************************************************************************/
/* Function: fexist_(const u8*); */
/* */
/* Description: This function checks if a file already exist. */
/* */
/* Returnvalue: 1 if the file exist else 0. */
/****************************************************************************************************************************************/
u8 fexist_(const s8* filename)
{
u8 retvalue = 0;
Find item;
retvalue = findfirst_(dname,&item, _DIRECTORY); // look for the item to be deleted.
 
if(retvalue); // item found?
{
DeleteClusterChain(item.startcluster); // delete all fatentries of the item.
DeleteDirectoryEntry(&item); // free the directoryentry.
do
{
retvalue = findnext_(&item);
if(retvalue)
{
DeleteClusterChain(item.startcluster); // delete all fatentries of the item.
DeleteDirectoryEntry(&item); // free the directoryentry.
}
}
while(retvalue);
}
 
return(retvalue);
u8 exist = 0;
File_t *file = 0;
file = LockFilePointer();
exist = FileExist(filename, ATTR_NONE, ATTR_SUBDIRECTORY|ATTR_VOLUMELABEL, file);
UnlockFilePointer(file);
return(exist);
}
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: u16 feof_(File *file)
//
// Description: This function checks wether the end of the file has been reached.
//
// Returnvalue: 0 if the end of the file was not reached otherwise 1.
//________________________________________________________________________________________________________________________________________
 
u16 feof_(File *file)
/****************************************************************************************************************************************/
/* Function: feof_(File_t *File); */
/* */
/* Description: This function checks wether the end of the file has been reached. */
/* */
/* Returnvalue: 0 if the end of the file was not reached otherwise 1. */
/****************************************************************************************************************************************/
u8 feof_(File_t *file)
{
if(((file->fileposition)+1) < (file->filesize))
if(((file->Position)+1) < (file->Size))
{
return(0);
}
1539,3 → 1813,5
return(1);
}
}
 
 
/trunk/fat16.h
1,263 → 1,69
#ifndef __fat16_h
#define __fat16_h
#ifndef _FAT16_H
#define _FAT16_H
 
 
 
//________________________________________________________________________________________________________________________________________
//
// Userspecific definitions
// Definitions
//
//________________________________________________________________________________________________________________________________________
 
#define __MAX_FILES_USED 1 // The number of files that can be opened simultaneously.
 
 
//________________________________________________________________________________________________________________________________________
//
// Structure of a filepointer
//
//________________________________________________________________________________________________________________________________________
 
#define _UNUSED 1 // Bits used in the attribute of an directory entry.
#define _USED 2
#define _ARCHIVE 2
#define _READ_ONLY 4
#define _SYSTEM 8
#define _DIRECTORY 16
#define _FILE 32
 
 
typedef struct afile
//#define __USE_TIME_DATE_ATTRIBUTE
#define FILE_MAX_OPEN 3 // The number of files that can accessed simultaneously.
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
#define EOF (-1)
#define BYTES_PER_SECTOR 512
/*
________________________________________________________________________________________________________________________________________
Structure of a filepointer
________________________________________________________________________________________________________________________________________
*/
typedef struct
{
u32 start_cluster; // Sectorpointer to the first sector of the first datacluster of the file.
u32 cluster_pointer; // Pointer to the cluster which is edited at the moment.
u8 sector_index; // The sector which is edited at the moment (cluster_pointer + sector_index).
u16 byte_index; // The bytelocation within the current sector (cluster_pointer + sector_index + byte_index).
u8 mode; // mode of fileoperation (read,write)
u32 filesize; // the size of the opend file in bytes.
u32 fileposition; // pointer to a character within the file 0 < fileposition < filesize
u32 sector_in_buffer; // the last sector read, wich is still in the sectorbuffer.
u32 directory_root_sector; // pointer to the root of the
u32 directory_sector; // the sectorposition where the directoryentry has been made.
u8 directory_index; // the index to the directoryentry within the specified sector.
u8 attribute; // the attribute of the file opened.
u8 buffer[512]; // Buffer for read and write operation from or to the mmc.
u8 state; // state of the filepointer (used/unused/...)
} File;
u32 FirstSectorOfFirstCluster; // First sector of the first cluster of the file.
u32 FirstSectorOfCurrCluster; // First sector of the cluster which is edited at the moment.
u8 SectorOfCurrCluster; // The sector within the current cluster.
u16 ByteOfCurrSector; // The byte location within the current sector.
u8 Mode; // Mode of fileoperation (read,write)
u32 Size; // The size of the opend file in bytes.
u32 Position; // Pointer to a character within the file 0 < fileposition < filesize
u32 DirectorySector; // the sectorposition where the directoryentry has been made.
u16 DirectoryIndex; // The index to the directoryentry within the specified sector.
u8 Attribute; // The attribute of the file opened.
u8 Cache[BYTES_PER_SECTOR]; // Cache for read and write operation from or to the sd-card.
u32 SectorInCache; // The last sector read, which is still in the sector cache.
u8 State; // State of the filepointer (used/unused/...)
} File_t;
 
 
typedef enum
{
NOT_INITIALIZED,
INITIALIZED
}Fat16_VolumeState_t;
 
//________________________________________________________________________________________________________________________________________
//
// Structure of an item to find within the cwd
//
//________________________________________________________________________________________________________________________________________
 
struct volume
{
Fat16_VolumeState_t state; // state of the volume
} str_Volume;
 
//________________________________________________________________________________________________________________________________________
//
// Structure of an item to find within the cwd
//
//________________________________________________________________________________________________________________________________________
 
typedef struct find
{
s8 name[12]; // filename + extension or directoryname of the item found within the cwd.
s8 searchstring[13];
u32 cluster_pointer; // Sectorpointer to the sector of the item searched within the cwd.
u16 startcluster; // pointer to the first datacluster of the item found in the cwd.
u32 filesize; // the size of the opend file in bytes.
u32 directory_sector; // the sector within the actual cluster where the directoryentry was found.
u8 directory_index; // the index to the directoryentry within the specified sector.
u8 attribute; // the attribute of the file opened.
} Find;
 
//________________________________________________________________________________________________________________________________________
//
// Directoryentries
//
//________________________________________________________________________________________________________________________________________
 
 
 
struct DirEntry
{
u8 name[8]; // 8 bytes name.
u8 extension[3]; // 3 bytes extension.
u8 attribute; // attribute of the directory entry (unused,archive,read-only,system,directory,volume)
u8 reserved[10]; // reserved bytes within the directory entry.
u16 time; // time and
u16 date; // date of last write acces to the file or directory.
u16 startcluster; // first cluster of the file or directory.
u32 size; // size of the file or directory in bytes.
} __attribute__((packed));
 
//________________________________________________________________________________________________________________________________________
//
// Structure of an entry within the fileallocationtable.
//
//________________________________________________________________________________________________________________________________________
 
struct FatEntry
{
u16 next_cluster; // the next cluster of the file.
} __attribute__((packed));
 
 
 
 
 
//________________________________________________________________________________________________________________________________________
//
// Partitions
//
//________________________________________________________________________________________________________________________________________
 
#define _EMPTY 0x00
#define _FAT12 0x01
#define _FAT16_ST_32_MB 0x04
#define _EXTENDED 0x05
#define _FAT16_LT_32_MB 0x06
#define _HPFS 0x07
#define _FAT32 0x0B
#define _FAT32_BIOS_Extension 0x0C
#define _FAT16_32_MB_BIOS_Extension 0x0E
#define _EXTENDED_BIOS_Extension 0x0F
#define _EISA 0x12
#define _DYNAMIC 0x42
#define _Linux_Swap 0x82
#define _Linux_Native 0x83
#define _Linux_LVM 0x8E
#define _FreeBSD 0xA5
#define _OpenBSD 0xA6
#define _NetBSD 0xA9
 
 
struct PartitionEntry
{
u8 PartitionState;
u8 BeginningHead;
u16 BeginningCylinder;
u8 Type;
u8 EndHead;
u16 EndCylinder;
u32 NoSectorsBeforePartition;
u32 NoSectorsPartition ;
} __attribute__((packed));
 
 
//________________________________________________________________________________________________________________________________________
//
// Structure of the VolumeBootRecord
//
//________________________________________________________________________________________________________________________________________
 
struct VBR_Entry
{
u8 dummy[11];
u16 bps;
u8 SectorsPerCluster;
u16 ReservedSectors;
u8 NoFATCopies;
u16 MaxRootEntries;
u16 dummy2;
u8 dummy3;
u16 SectorsPerFAT;
} __attribute__((packed));
 
 
 
//________________________________________________________________________________________________________________________________________
//
// Structure of the MasterBootRecord
//
//________________________________________________________________________________________________________________________________________
 
#define _MBR_SECTOR 0 // The MasterBootRecord is located in sector 0
 
struct MBR_Entry
{
u8 ExecutableCode[446];
struct PartitionEntry PartitionEntry1;
struct PartitionEntry PartitionEntry2;
struct PartitionEntry PartitionEntry3;
struct PartitionEntry PartitionEntry4;
u16 ExecutableMarker;
} __attribute__((packed));
 
 
 
 
//________________________________________________________________________________________________________________________________________
//
// API to the FAT16 filesystem
//
//________________________________________________________________________________________________________________________________________
 
extern u8 InitFat16(void);
extern File * fopen_(s8 *fname,s8 mode);
extern s16 fflush_(File *file);
extern void fclose_(File *file);
extern u32 fread_(void *buffer, u32 size, u32 count, File *file);
extern u32 fwrite_(void *buffer, u32 size, u32 count, File *file);
extern s16 fseek_(File *file, s32 offset, s16 origin);
extern s16 fgetchar_(File *file);
extern u8 fputchar_(File *file,s8 c);
extern u8 fputs_(File *file,s8 *string);
extern s8 * fgets_(s8 *s, s16 count, File *file);
extern s16 frename_(s8 *oldname, s8 *newname);
extern u8 fexist_(s8 *fname);
extern u8 mkdir_(s8 *fname);
extern u8 chdir_(s8 *fname);
extern u8 findfirst_(s8 *fname, Find *item, u8 attribute);
extern u8 findnext_(Find *item);
extern u16 feof_(File *);
u8 Fat16_Init(void);
u8 Fat16_Deinit(void);
File_t *fopen_(const s8 *filename, const s8 mode);
s16 fclose_(File_t *file);
u8 fexist_(const s8 *filename);
s16 fflush_(File_t *file);
s16 fseek_(File_t *file, s32 offset, s16 origin);
s16 fgetc_(File_t *file);
s16 fputc_(s8 c, File_t *file);
u32 fread_(void *buffer, u32 size, u32 count, File_t *file);
u32 fwrite_(void *buffer, u32 size, u32 count, File_t *file);
s16 fputs_(const s8 *string, File_t *file);
u8 * fgets_(s8 *string, s16 length, File_t *file);
u8 feof_(File_t *file);
 
 
 
//________________________________________________________________________________________________________________________________________
//
// Functions needed internaly for the fat16 implementation
//
//________________________________________________________________________________________________________________________________________
#endif //_FAT16_H
 
extern u8 SeekFileInDirectory(s8*fname, File *file);
extern u8 CreateFileInDirectory(s8*fname, File *file);
extern u16 FindNextFreeCluster(File *file);
extern void SeperateFileName(s8*fname, s8*name);
extern u8 ScanSubDirectories(s8*fname, File *file);
extern u16 GetNextCluster(File *file);
extern u8 AppendCluster(File *file);
extern u16 GetFatClusterOffset(File *file);
extern u16 GetFatSectorIndex(File *file);
extern File * ReserveFilePointer(void);
extern u16 SeekSubDirectory(s8 *fname);
extern u8 CreateSubDirectory_(s8 *fname);
extern u8 FindItem(Find *);
extern void FreeFilePointer(File *file);
 
//________________________________________________________________________________________________________________________________________
//
// Vaiables needed internaly for the fat16 implementation
//
//________________________________________________________________________________________________________________________________________
 
extern u8 SectorsPerCluster;
extern u32 CWD;
 
 
 
#endif
 
 
 
 
/trunk/fifo.c
0,0 → 1,45
#include "fifo.h"
 
u8 fifo_init (fifo_t *f, u8 *buffer, const u8 size)
{
if(f == NULL) return(0);
f->buffer = buffer;
f->count = 0;
f->pread = buffer;
f->pwrite = buffer;
f->size = size;
return(1);
}
 
u8 fifo_put (fifo_t *f, const u8 data)
{
if (f->count >= f->size) return(0); // return 0 in case of FIFO overflow.
 
u8 * pwrite = f->pwrite;
 
*(pwrite++) = data; // copy data byte to buffer
if(pwrite >= f->buffer + f->size) pwrite = f->buffer; // start at the begining after reaching the end
f->pwrite = pwrite;
f->count++;
return 1;
}
 
u8 fifo_get (fifo_t *f, u8 *pdata)
{
if((f == NULL) || (pdata == NULL)) return(0);
if(!f->count) return(0);
 
u8 *pread = f->pread;
*pdata = *(pread++);
if(pread >= f->buffer + f->size) pread = f->buffer; // start at the begining after reaching the end
f->pread = pread;
f->count--;
return(1);
}
 
u8 fifo_get_wait (fifo_t *f, u8 *pdata)
{
while (!f->count);
 
return fifo_get(f, pdata);
}
/trunk/fifo.h
0,0 → 1,45
#ifndef _FIFO_H_
#define _FIFO_H_
 
#include <stdio.h>
#include "91x_lib.h"
 
// the fifo object
typedef struct
{
u8 *buffer; // pointrer to start of the ringbuffer
u8 count; // number of characters in FIFO
u8 size; // buffer size
u8 *pread; // read pointer
u8 *pwrite; // write pointer
} fifo_t;
 
/*
The initialization of the FIFO sets the read/write pointers etc..
The FIFO uses the buffer 'buf' which byte length must 'size'.
Returns 1 on success ans 0 in case of an error.
*/
u8 fifo_init (fifo_t* f, u8* buf, const u8 size);
 
/*
Puts a byte into the FIFO. Returns 1 on success and 0 in case of FIFO overflow.
*/
u8 fifo_put (fifo_t* f, const u8 data);
 
/*
Get the next byte from the FIFO as int. Returns 0 if the FIFO is empty.
*/
u8 fifo_get (fifo_t* f, u8* pdata);
 
/*
Get the next byte out of the FIFO. If the FIFO is empty the function blocks
until the next byte is put into the FIFO.
*/
u8 fifo_get_wait (fifo_t* f, u8* pdata);
 
 
 
 
 
 
#endif /* _FIFO_H_ */
/trunk/i2c.c
54,176 → 54,440
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include <stdlib.h>
#include <string.h>
#include "91x_lib.h"
#include "i2c.h"
#include "uart1.h"
#include "timer.h"
#include "main.h"
#include "led.h"
#include "spi_slave.h"
 
u8 I2C_RxBufferSize, I2C_TxBufferSize;
u8 *I2C_TxBuffer, *I2C_RxBuffer;
u8 Tx_Idx=0, Rx_Idx=0, I2C_Direction;
u8 I2C_Command;
 
struct str_I2C_Heading I2C_Heading;
struct str_I2C_WriteNickRoll I2C_WriteNickRoll;
struct str_I2C_Mag I2C_Mag;
struct str_I2C_EEPROM I2C_ReadEEPROM, I2C_WriteEEPROM;
struct str_I2C_Version I2C_Version;
struct str_I2C_WriteCal I2C_WriteCal;
u8 CompassUpdateActiv = 0;
u8 CompassCalState = 0;
volatile I2C_State_t I2C_State = I2C_OFF;
 
// rxbuffer
volatile u8 I2C_RxBufferSize;
volatile u8 *I2C_RxBuffer;
volatile u8 Rx_Idx = 0;
// txbuffer
volatile u8 I2C_TxBufferSize;
volatile u8 *I2C_TxBuffer;
volatile u8 Tx_Idx = 0;
 
volatile u8 I2C_Direction;
volatile u8 I2C_Command;
 
volatile I2C_Heading_t I2C_Heading;
volatile I2C_WriteAttitude_t I2C_WriteAttitude;
volatile I2C_Mag_t I2C_Mag;
volatile I2C_Version_t MK3MAG_Version;
volatile I2C_Cal_t I2C_WriteCal;
volatile I2C_Cal_t I2C_ReadCal;
 
volatile u8 I2C_ReadRequest = 0;
volatile u32 I2C1_Timeout = 0;
volatile u32 CheckI2COkay = 0;
volatile u8 I2C_PrimRxBuffer[10]; // must be larger than any of the secondary rx buffers
 
 
//--------------------------------------------------------------
void I2C1_Init(void)
{
I2C_InitTypeDef I2C_Struct;
GPIO_InitTypeDef GPIO_Struct;
I2C_InitTypeDef I2C_Struct;
GPIO_InitTypeDef GPIO_InitStructure;
 
SerialPutString("I2C init...");
SCU_APBPeriphClockConfig(__I2C1,ENABLE);
I2C_DeInit(I2C1);
SerialPutString("\r\n I2C init...");
// enable Port 2 peripherie
SCU_APBPeriphClockConfig(__GPIO2, ENABLE);
// disable a reset state
SCU_APBPeriphReset(__GPIO2, DISABLE);
 
GPIO_Struct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_Struct.GPIO_Type = GPIO_Type_OpenCollector;
GPIO_Struct.GPIO_IPConnected = GPIO_IPConnected_Enable;
GPIO_Struct.GPIO_Alternate=GPIO_OutputAlt2;
GPIO_Init(GPIO2, &GPIO_Struct);
// free a busy bus
 
I2C_Struct.I2C_GeneralCall = I2C_GeneralCall_Disable;
I2C_Struct.I2C_Ack = I2C_Ack_Enable;
I2C_Struct.I2C_CLKSpeed = 20000;
I2C_Struct.I2C_OwnAddress = I2C_SLAVE_ADDRESS;
I2C_Init(I2C1, &I2C_Struct);
// At switch on I2C devices can get in a state where they
// are still waiting for a command due to all the bus lines bouncing
// around at startup have started clocking data into the device(s).
// Enable the ports as open collector port outputs
// and clock out at least 9 SCL pulses, then generate a stop
// condition and then leave the clock line high.
 
I2C_Cmd(I2C1, ENABLE);
I2C_ITConfig(I2C1, ENABLE);
// configure P2.2->I2C1_CLKOUT and P2.3->I2C1_DOUT to normal port operation
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Type = GPIO_Type_OpenCollector;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable;
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt1;
GPIO_Init(GPIO2, &GPIO_InitStructure);
 
VIC_Config(I2C1_ITLine,VIC_IRQ , 8);
VIC_ITCmd(I2C1_ITLine, ENABLE);
u8 i;
u32 delay;
// set SCL high and then SDA to low (start condition)
GPIO_WriteBit(GPIO2, GPIO_Pin_2, Bit_SET);
delay = SetDelay(1);
while (!CheckDelay(delay));
GPIO_WriteBit(GPIO2, GPIO_Pin_3, Bit_RESET);
// toggle SCL at least 10 times from high to low to high
for(i = 0; i < 10; i++)
{
delay = SetDelay(1);
while (!CheckDelay(delay));
 
I2C_Heading.Heading = 0;
SerialPutString("ok\n\r");
GPIO_WriteBit(GPIO2, GPIO_Pin_2, Bit_RESET);
delay = SetDelay(1);
while (!CheckDelay(delay));
GPIO_WriteBit(GPIO2, GPIO_Pin_2, Bit_SET);
}
delay = SetDelay(1);
while (!CheckDelay(delay));
// create stop condition setting SDA HIGH when SCL is HIGH
GPIO_WriteBit(GPIO2, GPIO_Pin_3, Bit_SET);
 
 
// reconfigure P2.2->I2C1_CLKOUT and P2.3->I2C1_DOUT
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Type = GPIO_Type_OpenCollector;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2; //I2C1_CLKOUT, I2C1_DOUT
GPIO_Init(GPIO2, &GPIO_InitStructure);
 
// enable I2C peripherie
SCU_APBPeriphClockConfig(__I2C1,ENABLE);
// reset I2C peripherie
SCU_APBPeriphReset(__I2C1,ENABLE);
SCU_APBPeriphReset(__I2C1,DISABLE);
 
I2C_DeInit(I2C1);
I2C_StructInit(&I2C_Struct);
I2C_Struct.I2C_GeneralCall = I2C_GeneralCall_Disable;
I2C_Struct.I2C_Ack = I2C_Ack_Enable;
I2C_Struct.I2C_CLKSpeed = 20000;
I2C_Struct.I2C_OwnAddress = 0x00;
I2C_Init(I2C1, &I2C_Struct);
 
I2C_TxBuffer = NULL;
Tx_Idx = 0;
I2C_TxBufferSize = 0;
 
I2C_RxBuffer = NULL;
Rx_Idx = 0;
I2C_RxBufferSize = 0;
 
I2C_Cmd(I2C1, ENABLE);
I2C_ITConfig(I2C1, ENABLE);
 
VIC_Config(I2C1_ITLine, VIC_IRQ , 0);
VIC_ITCmd(I2C1_ITLine, ENABLE);
 
I2C1_Timeout = SetDelay(1000);
I2C_Heading.Heading = -1;
I2C_GenerateSTOP(I2C1, ENABLE);
I2C_State = I2C_IDLE;
 
SerialPutString("ok");
}
 
 
//--------------------------------------------------------------
void I2C1_IRQHandler(void)
void I2C1_Deinit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
 
switch (I2C_GetLastEvent(I2C1))
{
case I2C_EVENT_MASTER_MODE_SELECT: // EV5
Tx_Idx = 0;
Rx_Idx = 0;
I2C_Send7bitAddress(I2C1, I2C_SLAVE_ADDRESS, I2C_Direction);
// DebugOut.Analog[16]++;
break;
SerialPutString("\r\n I2C deinit...");
I2C_GenerateStart(I2C1, DISABLE);
I2C_GenerateSTOP(I2C1, ENABLE);
VIC_ITCmd(I2C1_ITLine, DISABLE);
I2C_ITConfig(I2C1, DISABLE);
I2C_Cmd(I2C1, DISABLE);
I2C_DeInit(I2C1);
SCU_APBPeriphClockConfig(__I2C1, DISABLE);
// set ports to input
SCU_APBPeriphClockConfig(__GPIO2, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
GPIO_Init(GPIO2, &GPIO_InitStructure);
 
case I2C_EVENT_MASTER_MODE_SELECTED: // EV6
// Clear EV6 by set again the PE bit
I2C1->CR |= 0x20;
if (I2C_Direction == I2C_MODE_TRANSMITTER)
{
I2C_SendData(I2C1, I2C_Command);//EV8 just after EV6
}
break;
I2C_TxBuffer = NULL;
Tx_Idx = 0;
I2C_TxBufferSize = 0;
 
case I2C_EVENT_MASTER_BYTE_TRANSMITTED: // EV8
// DebugOut.Analog[17]++;
if ( Tx_Idx >= I2C_TxBufferSize )
{
I2C_GenerateSTOP (I2C1, ENABLE);
Tx_Idx = 0;
if (I2C_RxBufferSize > 0) // wird Antwort erwartet ?
{
I2C_ReadRequest = 1;
TimerI2CReadDelay = SetDelay(10);
}
}
else
{
I2C_SendData(I2C1, I2C_TxBuffer[Tx_Idx]);
Tx_Idx++;
}
break;
I2C_RxBuffer = NULL;
Rx_Idx = 0;
I2C_RxBufferSize = 0;
 
case I2C_EVENT_MASTER_BYTE_RECEIVED: // EV7
DebugOut.Analog[16]++;
//if (Rx_Idx == 1) DebugOut.Analog[19] = I2C_RxBuffer[0];
if (Rx_Idx < I2C_RxBufferSize)
{ I2C_RxBuffer[Rx_Idx] = I2C_ReceiveData(I2C1);
I2C_State = I2C_OFF;
 
} else I2C_ReceiveData(I2C1);
I2C1_Timeout = 0;
I2C_Heading.Heading = -1;
 
Rx_Idx++;
if ( Rx_Idx == I2C_RxBufferSize+1 )
{
I2C_AcknowledgeConfig (I2C1, DISABLE);
}
if ( Rx_Idx == I2C_RxBufferSize+2 )
{
I2C_GenerateSTOP(I2C1, ENABLE);
if (I2C_Command == I2C_CMD_READ_HEADING) CompassUpdateActiv = 0;
}
break;
SerialPutString("ok");
}
 
default:
break;
}
 
//--------------------------------------------------------------
void I2C1_IRQHandler(void)
{
u16 status;
static u8 crc;
// detemine I2C State
status = I2C_GetLastEvent(I2C1);
 
if(status & (I2C_FLAG_AF|I2C_FLAG_BERR)) // if an acknowledge failure or bus error occured
{ // Set and subsequently clear the STOP bit while BTF is set.
while(I2C_GetFlagStatus (I2C1, I2C_FLAG_BTF) != RESET)
{
I2C_GenerateSTOP (I2C1, ENABLE); // free the bus
I2C_GenerateSTOP (I2C1, DISABLE); // free the bus
}
I2C_State = I2C_IDLE;
LED_GRN_OFF;
}
else
{ // depending on current i2c state
switch (status)
{
// the start condition was initiated on the bus
case I2C_EVENT_MASTER_MODE_SELECT:
LED_GRN_ON;
// update current bus state variable
switch(I2C_Direction)
{
case I2C_MODE_TRANSMITTER:
I2C_State = I2C_TX_PROGRESS;
break;
case I2C_MODE_RECEIVER:
if ((I2C_RxBuffer == NULL) || (I2C_RxBufferSize == 0))
{
I2C_GenerateSTOP (I2C1, ENABLE);
I2C_State = I2C_IDLE;
return;
}
else
{
I2C_State = I2C_RX_PROGRESS;
}
break;
default: // invalid direction
I2C_GenerateSTOP (I2C1, ENABLE);
I2C_State = I2C_IDLE;
LED_GRN_OFF;
return;
}
// enable acknowledge
I2C_AcknowledgeConfig (I2C1, ENABLE);
// send address/direction byte on the bus
I2C_Send7bitAddress(I2C1, I2C_SLAVE_ADDRESS, I2C_Direction);
break;
// the address byte was send
case I2C_EVENT_MASTER_MODE_SELECTED:
// Clear EV6 by set again the PE bit
I2C_Cmd(I2C1, ENABLE);
// reset checksum
crc = 0;
switch(I2C_State)
{
case I2C_TX_PROGRESS:
// send command 1st data byte (allways the command id)
I2C_SendData(I2C1, I2C_Command);
crc += I2C_Command;
Tx_Idx = 0;
// reset timeout
I2C1_Timeout = SetDelay(500); // after 500 ms of inactivity the I2C1 bus will be reset
break;
case I2C_RX_PROGRESS:
Rx_Idx = 0;
break;
default: // unknown I2C state
// should never happen
I2C_GenerateSTOP (I2C1, ENABLE);
I2C_State = I2C_IDLE;
break;
}
break;
// the master has transmitted a byte and slave has been acknowledged
case I2C_EVENT_MASTER_BYTE_TRANSMITTED:
// some bytes have to be transmitted
if(Tx_Idx < I2C_TxBufferSize)
{
if(I2C_TxBuffer != NULL)
{
I2C_SendData(I2C1, I2C_TxBuffer[Tx_Idx]);
crc += I2C_TxBuffer[Tx_Idx];
}
else
{
I2C_SendData(I2C1, 0x00);
}
}
else // the last tx buffer byte was send
{
// send crc byte at the end
I2C_SendData(I2C1, crc);
// generate stop or repeated start condition
if ((I2C_RxBuffer != NULL) && (I2C_RxBufferSize > 0)) // is any answer byte expected?
{
I2C_Direction = I2C_MODE_RECEIVER; // switch to master receiver after repeated start condition
I2C_GenerateStart(I2C1, ENABLE); // initiate repeated start condition on the bus
}
else
{ // stop communication
I2C_GenerateSTOP(I2C1, ENABLE); // generate stop condition to free the bus
I2C_State = I2C_IDLE; // ready for new actions
LED_GRN_OFF;
DebugOut.Analog[15]++;
}
}
Tx_Idx++;
break;
// the master has received a byte from the slave
case I2C_EVENT_MASTER_BYTE_RECEIVED:
// some bytes have to be received
if (Rx_Idx < I2C_RxBufferSize)
{ // copy received byte from the data register to the rx-buffer
I2C_PrimRxBuffer[Rx_Idx] = I2C_ReceiveData(I2C1);
// update checksum
crc += I2C_PrimRxBuffer[Rx_Idx];
}
// if the last byte (crc) was received
else if ( Rx_Idx == I2C_RxBufferSize)
{
// generate a STOP condition on the bus before reading data register
I2C_GenerateSTOP(I2C1, ENABLE);
// compare last byte with checksum
if(crc == I2C_ReceiveData(I2C1))
{ // copy primary rx buffer content to rx buffer if exist
if(I2C_RxBuffer != NULL)
{
memcpy((u8 *)I2C_RxBuffer, (u8 *)I2C_PrimRxBuffer, I2C_RxBufferSize);
}
DebugOut.Analog[15]++;
CheckI2COkay++;
}
else // checksum error detected
{
DebugOut.Analog[14]++;
}
I2C_State = I2C_IDLE;
LED_GRN_OFF;
}
Rx_Idx++;
// if the 2nd last byte was received disable acknowledge for the last one
if ( Rx_Idx == I2C_RxBufferSize )
{
I2C_AcknowledgeConfig (I2C1, DISABLE);
}
break;
default:
break;
}
}
}
//----------------------------------------------------------------
void SendI2C_Command(u8 command)
void I2C1_SendCommand(u8 command)
{
I2C_Command = command;
//I2C_GenerateSTOP(I2C1, ENABLE);
// If I2C transmission is in progress
while (I2C_State != I2C_IDLE) return; // return imediatly if a transfer is still in progress
// disable I2C IRQ to avoid read/write access to the tx/rx buffer pointers during
// update of that buffer pointers and length
I2C_ITConfig(I2C1, DISABLE);
// update current command id
I2C_Command = command;
// set pointers to data area with respect to the command id
switch (command)
{
case I2C_CMD_VERSION:
I2C_RxBuffer = (u8 *)&MK3MAG_Version;
I2C_RxBufferSize = sizeof(MK3MAG_Version);
I2C_TxBuffer = NULL;
I2C_TxBufferSize = 0;
break;
case I2C_CMD_WRITE_CAL:
I2C_RxBuffer = (u8 *)&I2C_ReadCal;
I2C_RxBufferSize = sizeof(I2C_ReadCal);
I2C_TxBuffer = (u8 *)&I2C_WriteCal;
I2C_TxBufferSize = sizeof(I2C_WriteCal);
break;
case I2C_CMD_READ_MAG:
I2C_RxBuffer = (u8 *)&I2C_Mag;
I2C_RxBufferSize = sizeof(I2C_Mag);
I2C_TxBuffer = NULL;
I2C_TxBufferSize = 0;
break;
case I2C_CMD_READ_HEADING:
DebugOut.Analog[26] = I2C_Heading.Heading;
I2C_RxBuffer = (u8 *)&I2C_Heading;
I2C_RxBufferSize = sizeof(I2C_Heading);
// updat atitude from spi rx buffer
I2C_WriteAttitude.Roll = FromFlightCtrl.IntegralRoll;
I2C_WriteAttitude.Nick = FromFlightCtrl.IntegralNick;
I2C_TxBuffer = (u8 *)&I2C_WriteAttitude;
I2C_TxBufferSize = sizeof(I2C_WriteAttitude);
break;
default: // unknown command id
I2C_RxBuffer = NULL;
I2C_RxBufferSize = 0;
I2C_TxBuffer = NULL;
I2C_TxBufferSize = 0;
break;
}
// enable I2C IRQ again
I2C_ITConfig(I2C1, ENABLE);
// set direction to master transmitter
I2C_Direction = I2C_MODE_TRANSMITTER;
// test on busy flag and clear it
I2C_CheckEvent( I2C1, I2C_FLAG_BUSY );
// initiale start condition on the bus
I2C_GenerateStart(I2C1, ENABLE);
// to be continued in the I2C1_IRQHandler() above
 
switch (command)
{
case I2C_CMD_VERSION:
I2C_RxBuffer = (u8 *)&I2C_Version;
I2C_RxBufferSize = sizeof(I2C_Version);
I2C_TxBufferSize = 0;
break;
case I2C_CMD_WRITE_EEPROM:
I2C_RxBufferSize = 0;
I2C_TxBuffer = (u8 *)&I2C_WriteEEPROM;
I2C_TxBufferSize = sizeof(I2C_WriteEEPROM);
break;
case I2C_CMD_WRITE_CAL:
I2C_RxBufferSize = 0;
I2C_WriteCal.CalByte = CompassCalState;
I2C_TxBuffer = (u8 *)&I2C_WriteCal;
I2C_TxBufferSize = sizeof(I2C_WriteCal);
break;
case I2C_CMD_READ_EEPROM:
I2C_RxBuffer = (u8 *)&I2C_ReadEEPROM.Inhalt;
I2C_RxBufferSize = 2;
I2C_TxBuffer = (u8 *)&I2C_ReadEEPROM;
I2C_TxBufferSize = 1;
break;
case I2C_CMD_READ_MAG:
I2C_RxBuffer = (u8 *)&I2C_Mag;
I2C_RxBufferSize = sizeof(I2C_Mag);
I2C_TxBufferSize = 0;
break;
case I2C_CMD_READ_HEADING:
CompassUpdateActiv = 1;
I2C_RxBuffer = (u8 *)&I2C_Heading;
I2C_RxBufferSize = sizeof(I2C_Heading);
I2C_TxBuffer = (u8 *)&I2C_WriteNickRoll;
I2C_TxBufferSize = sizeof(I2C_WriteNickRoll);
break;
}
 
}
/*
if (I2C_RxBufferSize > 0)
{
I2C_RxBufferSize++;
if (I2C_RxBufferSize < 3) I2C_RxBufferSize = 3;
}*/
//----------------------------------------------------------------
void I2C1_GetMK3MagVersion(void)
{
u8 msg[20];
u8 repeat = 10;
 
I2C_AcknowledgeConfig (I2C1, ENABLE);
I2C_Direction = I2C_MODE_TRANSMITTER;
MK3MAG_Version.Major = 0xFF;
MK3MAG_Version.Minor = 0xFF;
MK3MAG_Version.Patch = 0xFF;
MK3MAG_Version.Compatible = 0xFF;
 
I2C_GenerateStart(I2C1, ENABLE);
while ((MK3MAG_Version.Major == 0xFF) && (repeat != 0))
{
I2C1_SendCommand(I2C_CMD_VERSION);
I2C1_Timeout = SetDelay(500);
while (!CheckDelay(I2C1_Timeout)) if (MK3MAG_Version.Major != 0xFF) break;
repeat--;
}
if (MK3MAG_Version.Major != 0xFF)
{
sprintf(msg, "\n\r MK3Mag V%d.%d%c", MK3MAG_Version.Major, MK3MAG_Version.Minor, 'a' + MK3MAG_Version.Patch);
SerialPutString(msg);
sprintf(msg, " Compatible: %d", MK3MAG_Version.Compatible);
SerialPutString(msg);
}
else SerialPutString("\n\rNo version information from MK3Mag.");
 
}
/trunk/i2c.h
1,68 → 1,76
#ifndef __I2C
#define __I2C
#ifndef __I2C_H
#define __I2C_H
 
 
#define I2C_SLAVE_ADDRESS 0x50
#define I2C_SLAVE_ADDRESS 0x50
 
#define I2C_CMD_VERSION 0x01
struct str_I2C_Version
{
u8 Hauptversion;
u8 Nebenversion;
u8 Comp;
} __attribute__((packed));
#define I2C_CMD_VERSION 0x01
#define I2C_CMD_READ_MAG 0x02
#define I2C_CMD_READ_HEADING 0x03
#define I2C_CMD_WRITE_CAL 0x04
 
#define I2C_CMD_WRITE_EEPROM 0x0A
#define I2C_CMD_READ_EEPROM 0x0B
struct str_I2C_EEPROM
 
typedef struct
{
u8 Adresse;
u16 Inhalt;
} __attribute__((packed));
u8 Major;
u8 Minor;
u8 Patch;
u8 Compatible;
} __attribute__((packed)) I2C_Version_t;
 
#define I2C_CMD_READ_MAG 0x02
struct str_I2C_Mag
typedef struct
{
u16 MagX;
u16 MagY;
u16 MagZ;
} __attribute__((packed));
s16 MagX;
s16 MagY;
s16 MagZ;
} __attribute__((packed)) I2C_Mag_t;
 
#define I2C_CMD_READ_HEADING 0x03
struct str_I2C_WriteNickRoll
 
typedef struct
{
s16 Nick;
s16 Roll;
} __attribute__((packed));
} __attribute__((packed)) I2C_WriteAttitude_t;
 
#define I2C_CMD_WRITE_CAL 0x04
struct str_I2C_WriteCal
 
typedef struct
{
u8 CalByte;
u8 Dummy1;
u8 Dummy2;
} __attribute__((packed));
} __attribute__((packed)) I2C_Cal_t;
 
struct str_I2C_Heading
typedef struct
{
u16 Heading;
} __attribute__((packed));
s16 Heading;
} __attribute__((packed)) I2C_Heading_t;
 
typedef enum
{
I2C_UNDEF,
I2C_IDLE,
I2C_TX_PROGRESS,
I2C_RX_PENDING,
I2C_RX_PROGRESS,
I2C_OFF
} I2C_State_t;
 
extern u8 Tx_Idx, Rx_Idx, I2C_Direction;
extern volatile I2C_State_t I2C_State;
extern volatile u8 I2C_Direction;
extern volatile u32 I2C1_Timeout;
 
extern struct str_I2C_Heading I2C_Heading;
extern struct str_I2C_WriteNickRoll I2C_WriteNickRoll;
extern struct str_I2C_Mag I2C_Mag;
extern struct str_I2C_EEPROM I2C_ReadEEPROM, I2C_WriteEEPROM;
extern struct str_I2C_Version I2C_Version;
extern struct str_I2C_WriteCal I2C_WriteCal;
extern void I2C1_Init(void);
extern void SendI2C_Command(u8 command);
extern u8 CompassUpdateActiv;
extern volatile u8 I2C_ReadRequest;
extern u8 CompassCalState;
extern volatile I2C_Heading_t I2C_Heading;
extern volatile I2C_WriteAttitude_t I2C_WriteAttitude;
extern volatile I2C_Mag_t I2C_Mag;
extern volatile I2C_Version_t MK3MAG_Version;
extern volatile I2C_Cal_t I2C_WriteCal;
extern volatile I2C_Cal_t I2C_ReadCal;
extern volatile u32 CheckI2COkay;
 
void I2C1_Init(void);
void I2C1_Deinit(void);
void I2C1_SendCommand(u8 command);
void I2C1_GetMK3MagVersion(void);
 
#endif
#endif // I2C_H
 
/trunk/interrupt.c
54,8 → 54,11
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include "91x_lib.h"
#include "usb_lib.h"
#include "fat16.h"
#include "main.h"
 
#include "uart1.h"
#define global extern /* to declare external variables and functions */
 
extern void USB_Istr(void);
68,32 → 71,68
 
void Dummy_Handler(void)
{
VIC0->VAR = 0xFF;
VIC1->VAR = 0XFF;
VIC0->VAR = 0xFF;
VIC1->VAR = 0xFF;
}
 
void InitInterrupt(void)
/* avoid the surprising reset-like behaviour by spurious interrupts */
void Interrupt_Init(void)
{
VIC0->DVAR = (u32)Dummy_Handler;
VIC1->DVAR = (u32)Dummy_Handler;
}
 
/*******************************************************************************
* Function Name : SWI_Handler
* Description : This function handles SW exception.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SWI_Handler (void)
{
}
 
/*******************************************************************************
* Function Name : Abort_Handler
* Description : This function handles data abort exception.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Abort_Handler (void)
{
SerialPutString("\r\nAbort Handler");
while(1)
{
// infinite loop
}
}
 
/*******************************************************************************
* Function Name : Undefined_Handler
* Description : This function handles undefined instruction exception.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Undefined_Handler (void)
{
SerialPutString("\r\nUndefined Handler");
while(1)
{
// infinite loop
}
}
 
/*******************************************************************************
* Function Name : FIQ_Handler
* Description : This function handles FIQ exception.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void FIQ_Handler (void)
{
}
}
/*******************************************************************************
* Function Name : Prefetch_Handler
* Description : This function handles preftetch abort exception.
100,6 → 139,11
*******************************************************************************/
void Prefetch_Handler(void)
{
SerialPutString("\r\nPrefetch Handler");
while(1)
{
// infinite loop
}
}
/*******************************************************************************
* Function Name : WDG_IRQHandler
107,6 → 151,12
*******************************************************************************/
void WDG_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : SW_IRQHandler
114,6 → 164,12
*******************************************************************************/
void SW_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : ARMRX_IRQHandler
121,6 → 177,12
*******************************************************************************/
void ARMRX_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : ARMTX_IRQHandler
128,6 → 190,12
*******************************************************************************/
void ARMTX_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : TIM0_IRQHandler
135,14 → 203,24
*******************************************************************************/
void TIM0_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : TIM1_IRQHandler
* Description : This function handles the TIM1 interrupt request
*******************************************************************************/
//void TIM1_IRQHandler(void)
//{
//}
/*
void TIM1_IRQHandler(void)
{
// write any value to VIC0 VAR //
VIC0->VAR = 0xFF;
}
*/
/*******************************************************************************
* Function Name : TIM2_IRQHandler
* Description : This function handles the TIM2 interrupt request
149,6 → 227,12
*******************************************************************************/
void TIM2_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : TIM3_IRQHandler
156,6 → 240,12
*******************************************************************************/
void TIM3_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : USBHP_IRQHandler
163,7 → 253,9
*******************************************************************************/
void USBHP_IRQHandler(void)
{
CTR_HP();
CTR_HP();
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : USBLP_IRQHandler
171,7 → 263,8
*******************************************************************************/
void USBLP_IRQHandler(void)
{
USB_Istr();
USB_Istr(); /*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : SCU_IRQHandler
179,6 → 272,12
*******************************************************************************/
void SCU_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : ENET_IRQHandler
186,6 → 285,12
*******************************************************************************/
void ENET_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : DMA_IRQHandler
193,6 → 298,12
*******************************************************************************/
void DMA_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : CAN_IRQHandler
200,6 → 311,12
*******************************************************************************/
void CAN_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : MC_IRQHandler
207,6 → 324,12
*******************************************************************************/
void MC_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : ADC_IRQHandler
214,6 → 337,12
*******************************************************************************/
void ADC_IRQHandler(void)
{
/*write your handler here*/
/* ... */
/*write any value to VIC0 VAR*/
VIC0->VAR = 0xFF;
}
/*******************************************************************************
* Function Name : UART0_IRQHandler
226,22 → 355,16
* Function Name : UART1_IRQHandler
* Description : This function handles the UART1 interrupt request
*******************************************************************************/
//void UART1_IRQHandler(void) __attribute__ ((interrupt ("IRQ")));
/*void UART1_IRQHandler(void)
{
UART1->DR = UART1->DR;
 
UART_ClearITPendingBit(UART1, UART_IT_Receive);
}
*/
{
} */
/*******************************************************************************
* Function Name : UART2_IRQHandler
* Description : This function handles the UART2 interrupt request
*******************************************************************************/
void UART2_IRQHandler(void)
/*void UART2_IRQHandler(void)
{
}
} */
/*******************************************************************************
* Function Name : I2C0_IRQHandler
* Description : This function handles the I2C0 interrupt request
302,13 → 425,13
* Function Name : EXTIT1_IRQHandler
* Description : This function handles the EXTIT1 interrupt request
*******************************************************************************/
void EXTIT1_IRQHandler(void)
void EXTIT1_IRQHandler(void)
{
VIC_ITCmd(EXTIT1_ITLine, DISABLE);
if(WIU_GetITStatus(WIU_Line11) != RESET)
{
BeepTime = 100;
InitFat16(); // initialize sd-card file system.
Fat16_Init(); // initialize sd-card file system.
 
WIU_ClearFlag(WIU_Line1);
WIU_ClearITPendingBit(WIU_Line11);
/trunk/kml.c
7,14 → 7,14
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
25,21 → 25,21
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
52,22 → 52,21
// + 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.
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
#include <stdlib.h>
#include <stdio.h>
#include "main.h"
#include "91x_lib.h"
#include "kml.h"
#include "kml_header.h"
#include "fat16.h"
 
 
//________________________________________________________________________________________________________________________________________
// Module name: kml.c
// Module name: kml.c
// Compiler used: avr-gcc 3.4.5
// Last Modifikation: 17.03.2008
// Last Modifikation: 20.07.2008
// Version: 1.02
// Authors: Stephan Busker
// Authors: Stephan Busker
// Description: Source files to write gps-coordinates to a file in the kml (keyhole markup language) fileformat
// Copyright (C) 2007 Stephan Busker
//........................................................................................................................................
76,13 → 75,13
// extern u8 KML_DocumentOpen(s8 *, KML_Document_t *); // opens a new kml document. A filename can be specified.
// extern u8 KML_DocumentClose(KML_Document_t *doc); // closes an open document
// extern u8 KML_PlaceMarkOpen(s8 *name, KML_Document_t *); // opens a new placemark within the specified document
// extern u8 KML_PlaceMarkClose( KML_Document_t *); // Closes the placemark
// extern u8 KML_PlaceMarkClose( KML_Document_t *); // Closes the placemark
// extern u8 KML_LineStringBegin(KML_Document_t *); // begins a new line within the actual placemark
// extern u8 KML_LineStringEnd(KML_Document_t *doc); // ends the actual linestring
// extern u8 KML_LineStringAddPoint(struct str_gps_nav_data, KML_Document_t *); // adds a new point (gps-coordinates) to the actual linestring
//........................................................................................................................................
// ext. functions:
//
// ext. functions:
//
//........................................................................................................................................
//
// URL: www.Mikro-Control.de
92,11 → 91,11
 
 
//________________________________________________________________________________________________________________________________________
// Funtion: KML_DocumentInit(KML_Document_t *)
//
// Function: KML_DocumentInit(KML_Document_t *)
//
// Description: This function initializes the kml-document for further use.
//
//
//
// Returnvalue: '1' if document was initialized
//________________________________________________________________________________________________________________________________________
 
104,7 → 103,7
{
doc->name[0] = 0; // name of the document
doc->state = DOC_CLOSED; // state of the kml-document
doc->file = NULL;
doc->file = NULL;
doc->place.name[0]=0;
doc->place.description[0]=0;
return(1);
111,12 → 110,12
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: KML_Document_Open(void);
//
// Function: KML_Document_Open(void);
//
// Description: This function opens a new KML- document with the specified name and creates the document header within the file.
//
//
// Returnvalue: '1' if the KML- file could be created.
//
// Returnvalue: '1' if the KML- file could be created.
//________________________________________________________________________________________________________________________________________
 
u8 KML_DocumentOpen(s8 *name, KML_Document_t *doc)
123,15 → 122,17
{
 
u8 retvalue = 0;
KML_DocumentInit(doc); // intialize the document with resetvalues
doc->file = fopen_(name,'a'); // open a new file with the specified filename on the memorycard.
 
if(doc == NULL) return(0);
 
KML_DocumentInit(doc); // intialize the document with resetvalues
doc->file = fopen_(name,'a'); // open a new file with the specified filename on the memorycard.
 
if(doc->file != NULL) // could the file be opened?
{
retvalue = 1; // the document could be created on the drive.
doc->state = DOC_OPENED; // change document state to opened. At next a placemark has to be opened.
fwrite_(KML_DOCUMENT_HEADER, sizeof(KML_DOCUMENT_HEADER)-1,1,doc->file); // write the KML- footer to the document.
fwrite_((void*)KML_DOCUMENT_HEADER, sizeof(KML_DOCUMENT_HEADER)-1,1,doc->file);// write the KML- footer to the document.
}
 
return(retvalue);
138,56 → 139,61
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: DocumentClose(KML_Document_t *doc);
//
// Description: This function closes the document specified by doc.
//
// Function: DocumentClose(KML_Document_t *doc);
//
// Returnvalue: none
// Description: This function closes the document specified by doc.
//
//
// Returnvalue: '1' if the KML- file could be closed.
//________________________________________________________________________________________________________________________________________
 
u8 KML_DocumentClose(KML_Document_t *doc)
{
 
u8 retvalue = 0;
u8 retvalue = 1;
 
if(doc == NULL) return(0);
 
while(doc->state != DOC_CLOSED) // close linestring, placemark and document before closing the file on the memorycard
{
{
switch(doc->state)
{
case DOC_LINESTRING_OPENED:
KML_LineStringEnd(doc); // write terminating tag to end linestring.
doc->state = DOC_PLACEMARK_OPENED;
break;
break;
 
case DOC_PLACEMARK_OPENED: // write terminating tag to close placemark.
KML_PlaceMarkClose(doc);
doc->state = DOC_OPENED;
break;
case DOC_OPENED: // close the file on the memorycard
break;
 
case DOC_OPENED: // close the file on the memorycard
if(doc->file != NULL)
{
fwrite_(KML_DOCUMENT_FOOTER, sizeof(KML_DOCUMENT_FOOTER)-1,1,doc->file); // write the KML- footer to the document.
fclose_(doc->file);
fwrite_((void*)KML_DOCUMENT_FOOTER, sizeof(KML_DOCUMENT_FOOTER)-1,1,doc->file); // write the KML- footer to the document.
fclose_(doc->file);
retvalue = 1;
}
doc->state = DOC_CLOSED;
break;
doc->state = DOC_CLOSED;
break;
 
default:
doc->state = DOC_CLOSED;
break;
 
}
};
 
}
return(retvalue);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 PlaceMarkOpen(s8 *name, File *file);
//
// Function: u8 PlaceMarkOpen(s8 *name, File *file);
//
// Description: This function adds a placemark to the document.
//
//
// Returnvalue: none
//
// Returnvalue: '1' if the PlaceMark could be opened
//________________________________________________________________________________________________________________________________________
 
u8 KML_PlaceMarkOpen(s8 *name, KML_Document_t *doc)
199,19 → 205,19
{
doc->state = DOC_PLACEMARK_OPENED;
retvalue = 1;
fwrite_(KML_PLACEMARK_HEADER, sizeof(KML_PLACEMARK_HEADER)-1,1,doc->file);
fwrite_((void*)KML_PLACEMARK_HEADER, sizeof(KML_PLACEMARK_HEADER)-1,1,doc->file);
}
 
return(retvalue);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 PlaceMarkClose(KML_PlaceMark_t *place, File *file);
//
// Function: u8 PlaceMarkClose(KML_PlaceMark_t *place, File *file);
//
// Description: This function ends the placemark opened before.
//
//
// Returnvalue: none
//
// Returnvalue: 1' if the PlaceMark could be closed
//________________________________________________________________________________________________________________________________________
 
u8 KML_PlaceMarkClose(KML_Document_t *doc)
223,22 → 229,22
{
if(doc->file != NULL)
{
doc->state =DOC_OPENED;
fwrite_(KML_PLACEMARK_FOOTER, sizeof(KML_PLACEMARK_FOOTER)-1,1,doc->file);
doc->state = DOC_OPENED;
fwrite_((void*)KML_PLACEMARK_FOOTER, sizeof(KML_PLACEMARK_FOOTER)-1,1,doc->file);
retvalue = 1;
}
}
 
return(retvalue);
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 LineStringBegin(KML_Document_t *doc);
//
// Function: u8 LineStringBegin(KML_Document_t *doc);
//
// Description: This function ends the placemark opened before.
//
//
// Returnvalue: none
//
// Returnvalue: '1' if the LineString could be started
//________________________________________________________________________________________________________________________________________
 
u8 KML_LineStringBegin(KML_Document_t *doc)
245,11 → 251,11
{
 
u8 retvalue = 0;
 
if(doc->file != NULL)
{
doc->state = DOC_LINESTRING_OPENED;
fwrite_(KML_LINESTRING_HEADER, sizeof(KML_LINESTRING_HEADER)-1,1,doc->file);
fwrite_((void*)KML_LINESTRING_HEADER, sizeof(KML_LINESTRING_HEADER)-1,1,doc->file);
retvalue = 1;
}
 
257,12 → 263,12
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 LineStringEnd(KML_Document_t *doc)
//
// Function: u8 LineStringEnd(KML_Document_t *doc)
//
// Description: This function ends the placemark opened before.
//
//
// Returnvalue: none
//
// Returnvalue: '1' if the LineString could be terminated
//________________________________________________________________________________________________________________________________________
 
u8 KML_LineStringEnd(KML_Document_t *doc)
269,12 → 275,12
{
 
u8 retvalue = 0;
 
if(doc->state == DOC_LINESTRING_OPENED);
if(doc->file != NULL)
{
doc->state = DOC_PLACEMARK_OPENED;
fwrite_(KML_LINESTRING_FOOTER, sizeof(KML_LINESTRING_FOOTER)-1,1,doc->file);
fwrite_((void*)KML_LINESTRING_FOOTER, sizeof(KML_LINESTRING_FOOTER)-1,1,doc->file);
retvalue = 1;
}
 
282,27 → 288,47
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 LineStringAddPoint(struct str_GPSPosition, KML_Document_t *doc)
//
// Function: u8 LineStringAddPoint(gps_data_t, KML_Document_t *doc)
//
// Description: This function adds a point to the specified document.
//
//
// Returnvalue: none
//
// Returnvalue: '1' if a ppoint was added could be started
//________________________________________________________________________________________________________________________________________
 
u8 KML_LineStringAddPoint(struct str_gps_nav_data gps_data ,KML_Document_t *doc)
u8 KML_LineStringAddPoint(GPS_Pos_t * pGPS_Position ,KML_Document_t *doc)
{
 
u8 retvalue = 0;
s8 string[50];
if(doc->state == DOC_LINESTRING_OPENED)
s32 rel_altitude = 0;
 
if(doc == NULL || pGPS_Position == NULL) return(0);
 
if((pGPS_Position->Status != INVALID) && (GPS_HomePosition.Status != INVALID))
{
if(doc->file != NULL)
if(doc->state == DOC_LINESTRING_OPENED)
{
sprintf(string,"\r\n%d.%d,%d.%d,%d.0",(gps_data.Longitude/10000000),(gps_data.Longitude%10000000),(gps_data.Latitude/10000000),(gps_data.Latitude%10000000),0);
fputs_(doc->file,string);
retvalue = 1;
if(doc->file != NULL)
{
s32 i1, i2;
i1 = pGPS_Position->Longitude/10000000L;
i2 = abs(pGPS_Position->Longitude%10000000L);
sprintf(string,"\r\n%ld.%07ld,",i1, i2);
fputs_(string, doc->file);
i1 = pGPS_Position->Latitude/10000000L;
i2 = abs(pGPS_Position->Latitude%10000000L);
sprintf(string," %ld.%07ld,",i1, i2);
fputs_(string, doc->file);
// calculate relative altitude with respect to the altitude of the home position
rel_altitude = pGPS_Position->Altitude - GPS_HomePosition.Altitude;
if(rel_altitude < 0) rel_altitude = 0; // avoid negative altitudes in log
i1 = rel_altitude/1000L;
i2 = abs(rel_altitude%1000L);
sprintf(string," %ld.%03ld",i1, i2);
fputs_(string, doc->file);
retvalue = 1;
}
}
}
 
310,48 → 336,58
}
 
//________________________________________________________________________________________________________________________________________
// Funtion: u8 KML_LoggGPSCoordinates(struct str_gps_nav_data, KML_Document_t *)
//
// Function: u8 KML_LoggGPSCoordinates(gps_data_t *, KML_Document_t *)
//
// Description: This function opens adds gpscoordinates to an KML-Document. The document will be opened, if not already done
//
//
// Returnvalue: none
//
// Returnvalue: '1' if an gps coordinate was logged
//________________________________________________________________________________________________________________________________________
 
u8 KML_LoggGPSCoordinates(struct str_gps_nav_data gps_data, KML_Document_t *doc)
u8 KML_LoggGPSCoordinates(GPS_Pos_t* pGPS_Position, KML_Document_t *doc)
{
u8 retval = 0;
while(doc->state != DOC_LINESTRING_OPENED) // automatic create document with default filename on the card.
{
{
switch(doc->state)
{
case DOC_CLOSED: // document hasn't been opened yet therefore it will be initialized automatically
KML_DocumentInit(doc); // initialize the document to default values
if(KML_DocumentOpen("default.kml",doc)) // open the kml-document with a standardname.
retval = KML_DocumentOpen("default.kml",doc); // open the kml-document with a standardname.
if(retval)
{
doc->state = DOC_OPENED;
}
}
break;
 
case DOC_OPENED: // if a document has been opened before but no placemark exists:
if(KML_PlaceMarkOpen("MIKROKOPTER",doc))
{
doc->state = DOC_PLACEMARK_OPENED; // add a placemark to the document.
retval = KML_PlaceMarkOpen("MIKROKOPTER",doc);
if(retval)
{
doc->state = DOC_PLACEMARK_OPENED; // add a placemark to the document.
}
break;
 
case DOC_PLACEMARK_OPENED: // add linestring to the placemark
if(KML_LineStringBegin(doc))
retval = KML_LineStringBegin(doc);
if(retval)
{
doc->state = DOC_LINESTRING_OPENED;
}
break;
 
default:
retval = 1;
break;
 
}
};
if(retval != 1) return(retval); // stop on error
}
 
if(doc->state == DOC_LINESTRING_OPENED) // if the document was opened add coordinates to the document.
{
KML_LineStringAddPoint(gps_data , doc);
retval = KML_LineStringAddPoint(pGPS_Position, doc);
}
return(retval);
}
 
/trunk/kml.h
2,17 → 2,17
#define _KML_H
 
#include "fat16.h"
#include "gps.h"
 
 
// possible state of an kml-document
typedef enum
typedef enum
{
DOC_CLOSED,
DOC_OPENED,
DOC_PLACEMARK_OPENED,
DOC_LINESTRING_OPENED,
DOC_END
DOC_END
}KML_DocState_t;
 
 
30,20 → 30,21
{
u8 name[40]; // name of the document
KML_DocState_t state; // state of the kml-document
File *file; // filepointer to the file where the data should be saved.
File_t *file; // filepointer to the file where the data should be saved.
KML_PlaceMark_t place;
 
} KML_Document_t;
 
 
#endif
 
extern u8 KML_LoggGPSCoordinates(struct str_gps_nav_data , KML_Document_t *);
extern u8 KML_DocumentInit(KML_Document_t *); // Init the new kml-document
extern u8 KML_DocumentOpen(s8 *, KML_Document_t *); // opens a new kml-document. a new file is created on the sd-memorycard
extern u8 KML_DocumentClose(KML_Document_t *doc); // closes the specified document saving remaining data to the file.
extern u8 KML_PlaceMarkOpen(s8 *name, KML_Document_t *doc); // opens a new placemark within the open kml-document
extern u8 KML_PlaceMarkClose(KML_Document_t *doc); // closes the actual placemark
extern u8 KML_LineStringBegin(KML_Document_t *doc); // begins a new linestring within the actual placemark
extern u8 KML_LineStringEnd(KML_Document_t *doc); // close the actual linestring within the actual placemark
extern u8 KML_LineStringAddPoint(struct str_gps_nav_data, KML_Document_t *); // adds a point from the gps (longitude, altitude, height) to the linestring
 
u8 KML_LoggGPSCoordinates(GPS_Pos_t* pGPS_Position , KML_Document_t *); // intializes the kml-document with standard filename and adds points to the file
u8 KML_DocumentInit(KML_Document_t *); // Init the new kml-document
u8 KML_DocumentOpen(s8 *, KML_Document_t *); // opens a new kml-document. a new file is created on the sd-memorycard
u8 KML_DocumentClose(KML_Document_t *doc); // closes the specified document saving remaining data to the file.
u8 KML_PlaceMarkOpen(s8 *name, KML_Document_t *doc); // opens a new placemark within the open kml-document
u8 KML_PlaceMarkClose(KML_Document_t *doc); // closes the actual placemark
u8 KML_LineStringBegin(KML_Document_t *doc); // begins a new linestring within the actual placemark
u8 KML_LineStringEnd(KML_Document_t *doc); // close the actual linestring within the actual placemark
u8 KML_LineStringAddPoint(GPS_Pos_t* pGPS_Position, KML_Document_t *); // adds a point from the gps (longitude, altitude, height) to the linestring
 
#endif //_KML_H
/trunk/kml_header.h
10,35 → 10,14
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
"<kml xmlns=\"http://earth.google.com/kml/2.2\">\r\n"
"<Document>\r\n"
" <name>Mikrokopter GPS logging</name>\r\n"
" <StyleMap id=\"msn_ylw-pushpin\">\r\n"
" <Pair>\r\n"
" <key>normal</key>\r\n"
" <styleUrl>#sn_ylw-pushpin</styleUrl>\r\n"
" </Pair>\r\n"
" <Pair>\r\n"
" <key>highlight</key>\r\n"
" <styleUrl>#sh_ylw-pushpin</styleUrl>\r\n"
" </Pair>\r\n"
" </StyleMap>\r\n"
" <Style id=\"sn_ylw-pushpin\">\r\n"
" <IconStyle>\r\n"
" <scale>1.1</scale>\r\n"
" <Icon>\r\n"
" <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>\r\n"
" </Icon>\r\n"
" <hotSpot x=\"20\" y=\"2\" xunits=\"pixels\" yunits=\"pixels\"/>\r\n"
" </IconStyle>\r\n"
" </Style>\r\n"
" <Style id=\"sh_ylw-pushpin\">\r\n"
" <IconStyle>\r\n"
" <scale>1.3</scale>\r\n"
" <Icon>\r\n"
" <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>\r\n"
" </Icon>\r\n"
" <hotSpot x=\"20\" y=\"2\" xunits=\"pixels\" yunits=\"pixels\"/>\r\n"
" </IconStyle>\r\n"
" </Style>\r\n"
"<name>Mikrokopter GPS logging</name>\r\n"
"\r\n"
"<Style id=\"MK_gps-style\">\r\n"
"<LineStyle>\r\n"
"<color>ff0000ff</color>\r\n"
"<width>2</width>\r\n"
"</LineStyle>\r\n"
"</Style>\r\n"
};
 
 
53,7 → 32,7
 
const s8 KML_DOCUMENT_FOOTER[] =
{
" </Document>\r\n"
"</Document>\r\n"
"</kml>\r\n"
};
 
66,9 → 45,11
//________________________________________________________________________________________________________________________________________
 
const s8 KML_PLACEMARK_HEADER[] =
{" <Placemark>\r\n"
" <name>flight</name>\r\n"
" <styleUrl>#msn_ylw-pushpin</styleUrl>\r\n"};
{
"<Placemark>\r\n"
"<name>Flight</name>\r\n"
"<styleUrl>#MK_gps-style</styleUrl>\r\n"
};
 
//________________________________________________________________________________________________________________________________________
//
76,8 → 57,10
//
//________________________________________________________________________________________________________________________________________
 
const s8 KML_PLACEMARK_FOOTER[] = {
" </Placemark>\r\n"};
const s8 KML_PLACEMARK_FOOTER[] =
{
"</Placemark>\r\n"
};
 
 
//________________________________________________________________________________________________________________________________________
86,12 → 69,12
//
//________________________________________________________________________________________________________________________________________
 
const s8 KML_LINESTRING_HEADER[] = {
" <LineString>\r\n"
" <extrude>1</extrude>\r\n"
" <tessellate>1</tessellate>\r\n"
" <altitudeMode>relativeToGround</altitudeMode>\r\n"
" <coordinates>\r\n"
const s8 KML_LINESTRING_HEADER[] =
{
"<LineString>\r\n"
"<tessellate>1</tessellate>\r\n"
"<altitudeMode>relativeToGround</altitudeMode>\r\n" // also possible "absolute"
"<coordinates>\r\n"
};
 
//________________________________________________________________________________________________________________________________________
100,8 → 83,9
//
//________________________________________________________________________________________________________________________________________
 
const s8 KML_LINESTRING_FOOTER[] = {
"\r\n </coordinates>"
"\r\n </LineString>\r\n"
const s8 KML_LINESTRING_FOOTER[] =
{
"\r\n</coordinates>"
"\r\n</LineString>\r\n"
};
 
/trunk/led.c
0,0 → 1,23
#include "91x_lib.h"
#include "led.h"
 
void Led_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
 
SCU_APBPeriphClockConfig(__GPIO5, ENABLE); // Enable the GPIO5 Clock
/*Configure LED_GRN at pin GPIO5.6 and LED_ROT at pin GPIO5.7*/
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt1 ;
GPIO_Init(GPIO5, &GPIO_InitStructure);
LED_GRN_OFF;
LED_RED_OFF;
}
 
 
 
/trunk/led.h
0,0 → 1,16
#ifndef _LED_H
#define _LED_H
 
#define LED_GRN_ON GPIO_WriteBit(GPIO5, GPIO_Pin_6, Bit_SET)
#define LED_GRN_OFF GPIO_WriteBit(GPIO5, GPIO_Pin_6, Bit_RESET)
#define LED_GRN_TOGGLE if (GPIO_ReadBit(GPIO5, GPIO_Pin_6)) LED_GRN_OFF; else LED_GRN_ON;
 
#define LED_RED_ON GPIO_WriteBit(GPIO5, GPIO_Pin_7, Bit_SET)
#define LED_RED_OFF GPIO_WriteBit(GPIO5, GPIO_Pin_7, Bit_RESET)
#define LED_RED_TOGGLE if (GPIO_ReadBit(GPIO5, GPIO_Pin_7)) LED_RED_OFF; else LED_RED_ON;
 
void Led_Init(void);
 
#endif //_LED_H
 
 
/trunk/main.c
7,14 → 7,14
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
25,22 → 25,22
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Teile, die nicht eindeutig mit unserer Lizenzvereinbarung gekennzeichnet sind, unterliegen u.U. eigenen Vereinbarungen:
// + z.B. Die Funktion printf_P() unterliegt ihrer eigenen Lizenz
// + z.B. Die Funktion printf_P() unterliegt ihrer eigenen Lizenz
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
53,278 → 53,379
// + 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.
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//#define MCLK96MHZ
const unsigned long _Main_Crystal = 25000;
 
#include <stdio.h>
#include "91x_lib.h"
#include "led.h"
#include "uart0.h"
#include "uart1.h"
#include "uart2.h"
#include "GPS.h"
#include "i2c.h"
#include "timer.h"
#include "spi_slave.h"
#include "fat16.h"
#include "usb.h"
#include "sdc.h"
#include "kml.h"
#include "main.h"
#include "kml.h"
 
 
typedef enum
{
LOGFILE_IDLE,
LOGFILE_CLOSED,
LOGFILE_OPENED,
LOGFILE_ERROR,
} logfilestate_t;
 
u32 TimerCompassUpdate;
u32 TimerI2CReadDelay;
u32 TimerDebugDataDelay;
u32 KmlAddPointDelay;
u32 TimerKmlAddPointDelay;
u32 TimerCheckError;
u32 ErrorCode = 0;
u16 BeepTime;
 
u8 BeepTime;
void Init_Undef(void);
u8 Parameter_UserParam1;
u8 Parameter_UserParam2;
u8 Parameter_UserParam3;
u8 Parameter_UserParam4;
u8 Parameter_UserParam5;
u8 Parameter_UserParam6;
u8 Parameter_UserParam7;
u8 Parameter_UserParam8;
//++++++++++++++++++++++++++++++++++++++++++++++++++
s32 FC_StickNick;
s32 FC_StickRoll;
s32 FC_StickGier;
s32 FC_StickGas;
s32 FC_Poti1;
s32 FC_Poti2;
s32 FC_Poti3;
s32 FC_Poti4;
//++++++++++++++++++++++++++++++++++++++++++++++++++
s32 SenderOkay = 0;
s32 UBat = 0;
s32 UndervoltageLevel = 0;
s32 ActiveSetting = 1;
//++++++++++++++++++++++++++++++++++++++++++++++++++
s32 Parameter_NaviGpsModeControl = 128;
s32 Parameter_NaviGpsGain = 0;
s32 Parameter_NaviGpsP = 90;
s32 Parameter_NaviGpsI = 0;
s32 Parameter_NaviGpsD = 90;
s32 Parameter_NaviGpsACC = 0;
s32 Parameter_NaviGpsMinSat = 3;
s32 Parameter_NaviStickThreshold = 8;
s32 Parameter_RadiusAlert = 15;
//++++++++++++++++++++++++++++++++++++++++++++++++++
#define FLAG_MOTOR_RUN 1
#define FLAG_FLY 2
#define FLAG_CALIBRATE 4
#define FLAG_START 8
u32 MikroKopterFlags;
u32 ClearFlags = 1;
//++++++++++++++++++++++++++++++++++++++++++++++++++
u8 text[20];
u8 ClearMKFlags = 0;
u8 StopNavigation = 0;
Param_t Parameter;
FC_t FC;
 
s8 ErrorMSG[25];
 
//----------------------------------------------------------------------------------------------------
void Leds_Init(void)
void SCU_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* configure PLL and set it as master clock source */
SCU_MCLKSourceConfig(SCU_MCLK_OSC); // set master clock source to external oscillator clock (25MHz) before diabling the PLL
SCU_PLLCmd(DISABLE); // now disable the PLL
#ifdef MCLK96MHZ
SCU_BRCLKDivisorConfig(SCU_BRCLK_Div2); // set BRCLK to MCLK/2 = 48MHz
SCU_PCLKDivisorConfig(SCU_PCLK_Div4); // set PCLK (APB bus clock) divisor to 4 (half Reference Clock)
SCU_RCLKDivisorConfig(SCU_RCLK_Div2); // set RCLK (Reference Clock) divisor to 1 (full PPL clock)
SCU_HCLKDivisorConfig(SCU_HCLK_Div2); // set HCLK (AHB bus clock) divisor to 1 (full Reference Clock)
SCU_PLLFactorsConfig(192,25,2); // PLL = 96 MHz, Feedback Divider N=192, Pre-Divider M=25, Post-Divider P=2
#else
SCU_BRCLKDivisorConfig(SCU_BRCLK_Div1); // set BRCLK to MCLK = 48MHz
SCU_PCLKDivisorConfig(SCU_PCLK_Div2); // set PCLK (APB bus clock) divisor to 2 (half Reference Clock)
SCU_RCLKDivisorConfig(SCU_RCLK_Div1); // set RCLK (Reference Clock) divisor to 1 (full PPL clock)
SCU_HCLKDivisorConfig(SCU_HCLK_Div1); // set HCLK (AHB bus clock) divisor to 1 (full Reference Clock)
SCU_PLLFactorsConfig(192,25,3); // PLL = 48 MHz, Feedback Divider N=192, Pre-Divider M=25, Post-Divider P=3
#endif
SCU_PLLCmd(ENABLE); // Enable PLL (is disabled by SCU_PLLFactorsConfig)
SCU_MCLKSourceConfig(SCU_MCLK_PLL); // set master clock source to PLL
}
 
SCU_APBPeriphClockConfig(__GPIO6, ENABLE);
SCU_APBPeriphClockConfig(__GPIO5, ENABLE);
//GPIO_DeInit(GPIO5);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt1 ;
GPIO_Init(GPIO5, &GPIO_InitStructure);
 
//SD_SWITCH
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
GPIO_Init(GPIO5, &GPIO_InitStructure);
 
}
//
void OutputStartupData(void)
//----------------------------------------------------------------------------------------------------
void GetNaviCtrlVersion(void)
{
char tex[20];
SerialPutString("\n\r--------------\n\r");
sprintf(text,"NaviCtrl V%d.%d\n\r", VersionInfo.Hauptversion, VersionInfo.Nebenversion); SerialPutString(text);
u8 msg[25];
 
sprintf(msg,"\n\r NaviCtrl V%d.%d%c", VERSION_MAJOR, VERSION_MINOR, 'a'+ VERSION_PATCH);
SerialPutString(msg);
}
 
 
//----------------------------------------------------------------------------------------------------
int main(void)
s8* GenerateGPSLogFileName(void)
{
static u8 oldCompassCalState = 0;
static u16 filenum = 0; // file name counter
static s8 filename[30];
static DateTime_t LastTime = {0,0,0,0,0,0,0,0};
 
if(SystemTime.Valid)
{
// if the day has been changed
if((LastTime.Year != SystemTime.Year) || (LastTime.Month != SystemTime.Month) || (LastTime.Day != SystemTime.Day))
{
LastTime.Year = SystemTime.Year;
LastTime.Month = SystemTime.Month;
LastTime.Day = SystemTime.Day;
LastTime.Valid = 1;
filenum = 0; // reset file counter
}
sprintf(filename, "LOG/%04i%02i%02i/GPS%05i.KML", SystemTime.Year, SystemTime.Month, SystemTime.Day, filenum);
filenum++;
return filename;
}
else return NULL;
}
 
static u8 kml_state = 0;
u8 kml_cnt = 0;
KML_Document_t mydocument;
File *file1;
 
u8 str[80];
KML_DocumentInit(&mydocument); // Initialise the new kml-document for further use.
//----------------------------------------------------------------------------------------------------
void CheckErrors(void)
{
if(!CheckSPIOkay)
{
LED_RED_ON;
sprintf(ErrorMSG,"no FC communication ");
ErrorCode = 3;
StopNavigation = 1;
}
else if(!CheckI2COkay)
{
LED_RED_ON;
sprintf(ErrorMSG,"no MK3Mag communication ");
ErrorCode = 4;
StopNavigation = 1;
}
else if(FC_Version.Compatible != FC_SPI_COMPATIBLE)
{
LED_RED_ON;
sprintf(ErrorMSG,"FC not compatible ");
ErrorCode = 1;
StopNavigation = 1;
}
else if(MK3MAG_Version.Compatible != MK3MAG_I2C_COMPATIBLE)
{
sprintf(ErrorMSG,"MK3Mag not compatible ");
LED_RED_ON;
ErrorCode = 2;
StopNavigation = 1;
}
else if(!CheckGPSOkay)
{
LED_RED_ON;
sprintf(ErrorMSG,"no GPS communication ");
ErrorCode = 5;
StopNavigation = 1;
}
else if(I2C_Heading.Heading < 0)
{
LED_RED_ON;
sprintf(ErrorMSG,"bad compass value ");
ErrorCode = 6;
StopNavigation = 1;
}
else if(FC.RC_Quality < 100)
{
LED_RED_ON;
sprintf(ErrorMSG,"RC Signal lost ");
ErrorCode = 7;
}
else // no error occured
{
sprintf(ErrorMSG,"No Error ");
ErrorCode = 0;
StopNavigation = 0;
LED_RED_OFF;
}
CheckSPIOkay = 0;
CheckGPSOkay = 0;
CheckI2COkay = 0;
}
 
 
// SCU_MCLKSourceConfig(SCU_MCLK_OSC);
// SCU_PCLKDivisorConfig(SCU_PCLK_Div2);
// SCU_MCLKSourceConfig(SCU_MCLK_PLL);
 
SCU_MCLKSourceConfig(SCU_MCLK_OSC);
SCU_PLLCmd(DISABLE); // PLL aus
SCU_RCLKDivisorConfig(SCU_RCLK_Div1);
SCU_HCLKDivisorConfig(SCU_HCLK_Div1);
SCU_PCLKDivisorConfig(SCU_PCLK_Div2);
// SCU_FMICLKDivisorConfig(SCU_FMICLK_Div1);
// FMI_Config(FMI_READ_WAIT_STATE_3,FMI_WRITE_WAIT_STATE_0, FMI_PWD_ENABLE, FMI_LVD_ENABLE,FMI_FREQ_HIGH);
SCU_PLLFactorsConfig(192,25,3); // PLL = 48 MHz
//----------------------------------------------------------------------------------------------------
int main(void)
{
logfilestate_t logfilestate = LOGFILE_IDLE;
KML_Document_t gpslogfile;
s8* gpslogfilename = NULL;
 
SCU_PLLCmd(ENABLE); // PLL Enabled
/* Configure the system clocks */
SCU_Config();
 
SCU_MCLKSourceConfig(SCU_MCLK_PLL); // MCLK = PLL
KML_DocumentInit(&gpslogfile); // Initialize the new kml-document for further use.
 
VersionInfo.Hauptversion = VERSION_HAUPTVERSION;
VersionInfo.Nebenversion = VERSION_NEBENVERSION;
VersionInfo.PCKompatibel = VERSION_KOMPATIBEL;
SCU_AHBPeriphClockConfig(__VIC,ENABLE);
SCU_AHBPeriphReset(__VIC,DISABLE);
VIC_DeInit();
InitInterrupt();
Leds_Init();
Debug_UART1_Init();
OutputStartupData();
/* init VIC (Vectored Interrupt Controller) */
SCU_AHBPeriphClockConfig(__VIC,ENABLE); // enable AHB bus clock for VIC
SCU_AHBPeriphReset(__VIC, DISABLE); // disable reset state for VIC
VIC_DeInit(); // deinitializes the VIC module registers to their default reset values.
// initialize the interrupt handler
Interrupt_Init();
// initialize timer 1
TIMER1_Init();
// initialize the LEDs (needs Timer 1)
Led_Init();
// initialize the debug UART1
UART1_Init();
SerialPutString("\r\n---------------------------------------------");
 
GPS_UART0_Init();
USB_ConfigInit();
SPI0_Init();
// initialize UART2 to FLIGHTCTRL
UART2_Init();
// initialize UART0 (to MKGPS or MK3MAG)
UART0_Init();
// initialize usb
USB_ConfigInit();
// initialize SPI0 to FC
SPI0_Init();
// initialize i2c bus to MK3MAG (needs Timer 1)
I2C1_Init();
// initialize the gps position controller (needs Timer 1)
GPS_Init();
// initialize fat16 partition on sd card (needs Timer 1)
Fat16_Init();
 
TIMER1_Init();
I2C1_Init();
I2C_Version.Hauptversion = 0xff;
 
SendI2C_Command(I2C_CMD_VERSION);
TimerCompassUpdate = SetDelay(5);
TimerKmlAddPointDelay = SetDelay(250);
TimerCheckError = SetDelay(3000);
 
TimerCompassUpdate = SetDelay(50);
while (!CheckDelay(TimerCompassUpdate));
TimerCompassUpdate = SetDelay(5);
TimerI2CReadDelay = SetDelay(5);
SerialPutString("\r\n---------------------------------------------");
SerialPutString("\n\r Version information:");
GetNaviCtrlVersion();
SPI0_GetFlightCtrlVersion();
if(FC_Version.Compatible != FC_SPI_COMPATIBLE)
{
//sprintf(ErrorMSG,"\r\n %d <-> %d", FlightCtrlVersion.NaviCompatible, FC_SPI_COMPATIBLE);
//SerialPutString(ErrorMSG);
SerialPutString("\n\r Flight-Ctrl not compatible");
LED_RED_ON;
}
I2C1_GetMK3MagVersion();
if(MK3MAG_Version.Compatible != MK3MAG_I2C_COMPATIBLE)
{
SerialPutString("\n\r MK3Mag not compatible");
LED_RED_ON;
}
 
KmlAddPointDelay = SetDelay(250);
/*
ReadSetting(1);
*/
SerialPutString("\r\n---------------------------------------------\r\n\r\n");
 
for (;;)
{
if(rxd_buffer_locked) // new incomming command
{
UART1_ProcessRxData(); // process request
}
UART1_TransmitTxData(); // send answer
 
SerialPutString("\r\n---------------------------------------------");
SPI0_UpdateBuffer();
UART1_Transmit(); // empty txd buffer
 
// ------------------------- I2C Timing --------------------------------
if(I2C_State != I2C_OFF)
{
if (CheckDelay(TimerCompassUpdate))
{
// check for hanging I2C bus
if(CheckDelay(I2C1_Timeout))
{ // reset I2C
SerialPutString("\n\rCommunication-Error: MK3Mag\n\r");
I2C1_Deinit();
I2C1_Init();
}
else
{ // check for incomming compass calibration request
// update CalByte from spi input queue
fifo_get(&CompassCalcStateFiFo, (u8 *)&(I2C_WriteCal.CalByte));
// send new calstate
if(I2C_ReadCal.CalByte != I2C_WriteCal.CalByte)
{
I2C1_SendCommand(I2C_CMD_WRITE_CAL);
}
else // request current heading
{
I2C1_SendCommand(I2C_CMD_READ_HEADING);
}
TimerCompassUpdate = SetDelay(25); // every 25 ms
}
 
// ReadSetting(1);
SerialPutString("\r\n---------------------------------------------\r\n\r\n");
InitFat16();
}
}
 
for (;;)
{
if(NeuerDatensatzEmpfangen)
{
BearbeiteRxDaten();
DatenUebertragung();
// if (GPIO_ReadBit(GPIO5, GPIO_Pin_3)) SerialPutString("keine SD\n\r"); else SerialPutString("SD eingesteckt!\n\r");
}
UpdateSPI_Buffer();
SPI_CheckSlaveSelect();
UART1_Transmit();
// ----------- I2C Timing -------------------------
if (CheckDelay(TimerCompassUpdate))
{
if(oldCompassCalState != CompassCalState)
{
oldCompassCalState = CompassCalState;
TimerCompassUpdate = SetDelay(25);
SendI2C_Command(I2C_CMD_WRITE_CAL);
}
else
{
GPIO_ToggleBit(GPIO5, GPIO_Pin_6);
GPIO_ToggleBit(GPIO5, GPIO_Pin_7);
TimerCompassUpdate = SetDelay(25);
SendI2C_Command(I2C_CMD_READ_HEADING);
}
}
 
if (CheckDelay(TimerI2CReadDelay))
{
if (I2C_ReadRequest)
// ---------------- Error Check Timing ----------------------------
if(CheckDelay(TimerCheckError))
{
I2C_ReadRequest= 0;
I2C_Direction = I2C_MODE_RECEIVER;
I2C_GenerateStart(I2C1, ENABLE);
if(!CheckSPIOkay) GPS_Navigation(); // process the GPS data even if the FC is not connected
CheckErrors();
TimerCheckError = SetDelay(1000);
Request_SendFollowMe = TRUE;
}
TimerI2CReadDelay = SetDelay(1000);
}
// ---------------- KML Timing ------------------------------------
if(CheckDelay(TimerKmlAddPointDelay))
{
TimerKmlAddPointDelay = SetDelay(500); // every 500 ms
 
if (CheckDelay(TimerDebugDataDelay))
{ SendGPSPosAnforderung = 1;
DatenUebertragung();
if(FC.MKFlags & MKFLAG_FLY) // model is flying
{
switch(logfilestate)
{
case LOGFILE_IDLE:
case LOGFILE_CLOSED:
// find unused logfile name
do
{ // try to generate a new logfile name
gpslogfilename = GenerateGPSLogFileName();
}while((gpslogfilename != NULL) && fexist_(gpslogfilename));
// if logfilename exist
if(gpslogfilename != NULL)
{
// try to create the log file
if(KML_DocumentOpen(gpslogfilename, &gpslogfile))
{
logfilestate = LOGFILE_OPENED; // goto next step
SerialPutString("\r\nOpening kml-file: ");
SerialPutString(gpslogfilename);
SerialPutString("\r\n");
}
else
{
logfilestate = LOGFILE_ERROR;
SerialPutString("\r\nError opening kml-file: ");
SerialPutString(gpslogfilename);
SerialPutString("\r\n");
TimerKmlAddPointDelay = SetDelay(10); // try again in open logfile in 10 mili sec
}
}
// else retry in next loop
break;
 
TimerDebugDataDelay = SetDelay(500);
}
 
case LOGFILE_OPENED:
// append new gps log data
if((GPSData.Status != INVALID) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.SatFix == SATFIX_3D))
{
if(!KML_LoggGPSCoordinates(&(GPSData.Position), &gpslogfile))
{ // error logging data
SerialPutString("\r\nError Logging GPS data\r\n");
KML_DocumentClose(&gpslogfile);
logfilestate = LOGFILE_ERROR;
}
}
break;
 
// ----------- KML Timing -------------------------
if(CheckDelay(KmlAddPointDelay) && 0)
{
KmlAddPointDelay = SetDelay(500);
switch(kml_state)
{
case 0:
if((GPS_Data.Flags & GPS_FIX) && (GPS_Data.Used_Sat >= GPS_SAT_MIN))
{
if(str_Volume.state == INITIALIZED) // has the volume and filesystem been initialized?
{
if(KML_DocumentOpen("flight01.kml",&mydocument)) // create a new kml-document on the memorycard.
case LOGFILE_ERROR:
// try to reinitialize the fat16 filesystem
if(0 == Fat16_Init())
{
SerialPutString("\r\nopening kml-file\r\nadding data");
kml_state = 1;
logfilestate = LOGFILE_IDLE;
TimerKmlAddPointDelay = SetDelay(10); // try again in open logfile in 10 mili sec
}
else
{
logfilestate = LOGFILE_ERROR;
TimerKmlAddPointDelay = SetDelay(5000); // try again in 5 sec
}
break;
 
default:
break;
}
} // EOF model is flying
else // model is not flying
{ // close log file if opened
if(logfilestate == LOGFILE_OPENED)
{
if(KML_DocumentClose(&gpslogfile))
{
SerialPutString("\r\nClosing kml-file\r\n");
logfilestate = LOGFILE_CLOSED;
}
else
{
InitFat16();
if(str_Volume.state != INITIALIZED) KmlAddPointDelay = SetDelay(5000); // try again in 5 sek
logfilestate = LOGFILE_ERROR;
}
}
break; // document.state will be changed to DOC_OPENED automatic.
case 1: // linestring opened, so datapoint (gps_coordinates) can be added to the document.
if(kml_cnt++ < 20) // add 10 datapoints to the document.
{
KML_LoggGPSCoordinates(GPS_Data,&mydocument);
}
else // after the datapoints have been written to the document close the document.
{
KML_DocumentClose(&mydocument);
SerialPutString("\r\nfile closed");
kml_state = 2;
}
break;
 
default: // all data has been written to card. open new document to add new data.
}
}
} //EOF model is not flying
}
}
}
 
 
 
/trunk/main.h
1,77 → 1,76
#ifndef _MAIN_H
#define _MAIN_H
 
#include "91x_conf.h"
#include "91x_lib.h"
#include "91x_wiu.h"
#include "uart.h"
#include "ramfunc.h"
#include "menu.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "printf_P.h"
#include "timer.h"
#include "spi_slave.h"
#include "i2c.h"
#include "GPS.h"
#include "GPSUart.h"
#include "sdc.h"
#include "ssc.h"
#include "fat16.h"
#include "usb.h"
#include "string.h"
#include "settings.h"
 
//#include "hw_config.h"
#define VERSION_MAJOR 0
#define VERSION_MINOR 12
#define VERSION_PATCH 8
 
#define VERSION_HAUPTVERSION 0
#define VERSION_NEBENVERSION 4
#define VERSION_KOMPATIBEL 7
#define VERSION_SERIAL_MAJOR 10
#define VERSION_SERIAL_MINOR 0
#define FC_SPI_COMPATIBLE 3
#define MK3MAG_I2C_COMPATIBLE 2
 
#define GPIO_ToggleBit(GPIO, Pin) if (GPIO_ReadBit(GPIO, Pin)) GPIO_WriteBit(GPIO, Pin, Bit_RESET); else GPIO_WriteBit(GPIO, Pin, Bit_SET);
extern u32 TimerCompassUpdate;
extern u16 BeepTime;
extern u8 ClearMKFlags;
void Interrupt_Init(void);
 
typedef struct
{
u8 ActiveSetting;
u8 User1;
u8 User2;
u8 User3;
u8 User4;
u8 User5;
u8 User6;
u8 User7;
u8 User8;
u8 NaviGpsModeControl;
u8 NaviGpsGain;
u8 NaviGpsP;
u8 NaviGpsI;
u8 NaviGpsD;
u8 NaviGpsACC;
u8 NaviGpsMinSat;
u8 NaviStickThreshold;
u8 NaviOperatingRadius;
u8 NaviWindCorrection;
u8 NaviSpeedCompensation;
u8 LowVoltageWarning;
u8 NaviAngleLimitation;
} __attribute__((packed)) Param_t;
 
extern u32 TimerCompassUpdate;
extern u32 TimerI2CReadDelay;
extern u8 BeepTime;
void InitInterrupt(void);
typedef struct
{
s8 StickNick;
s8 StickRoll;
s8 StickYaw;
s8 StickGas;
u8 Poti1;
u8 Poti2;
u8 Poti3;
u8 Poti4;
u8 RC_Quality;
u8 UBat;
// MK_Flags
#define MKFLAG_MOTOR_RUN 0x01
#define MKFLAG_FLY 0x02
#define MKFLAG_CALIBRATE 0x04
#define MKFLAG_START 0x08
#define MKFLAG_EMERGENCY_LANDING 0x10
#define MKFLAG_RESERVE1 0x20
#define MKFLAG_RESERVE2 0x40
#define MKFLAG_RESERVE3 0x80
u8 MKFlags;
} __attribute__((packed)) FC_t;
 
extern u8 text[20];
extern u8 Parameter_UserParam1;
extern u8 Parameter_UserParam2;
extern u8 Parameter_UserParam3;
extern u8 Parameter_UserParam4;
extern u8 Parameter_UserParam5;
extern u8 Parameter_UserParam6;
extern u8 Parameter_UserParam7;
extern u8 Parameter_UserParam8;
extern s32 FC_StickNick;
extern s32 FC_StickRoll;
extern s32 FC_StickGier;
extern s32 FC_StickGas;
extern s32 FC_Poti1;
extern s32 FC_Poti2;
extern s32 FC_Poti3;
extern s32 FC_Poti4;
extern s32 SenderOkay;
extern s32 UBat;
extern s32 UndervoltageLevel;
extern s32 ActiveSetting;
//++++++++++++++++++++++++++++++++++++++++++++++++++
extern s32 Parameter_NaviGpsModeControl;
extern s32 Parameter_NaviGpsGain;
extern s32 Parameter_NaviGpsP;
extern s32 Parameter_NaviGpsI;
extern s32 Parameter_NaviGpsD;
extern s32 Parameter_NaviGpsACC;
extern s32 Parameter_NaviGpsMinSat;
extern s32 Parameter_NaviStickThreshold;
extern s32 Parameter_RadiusAlert;
//++++++++++++++++++++++++++++++++++++++++++++++++++
#define FLAG_MOTOR_RUN 1
#define FLAG_FLY 2
#define FLAG_CALIBRATE 4
#define FLAG_START 8
extern u32 MikroKopterFlags;
extern u32 ClearFlags;
//++++++++++++++++++++++++++++++++++++++++++++++++++
 
extern Param_t Parameter;
extern FC_t FC;
extern s8 ErrorMSG[25];
extern u32 ErrorCode;
extern u8 StopNavigation;
#endif // _MAIN_H
/trunk/menu.c
7,14 → 7,14
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
25,21 → 25,21
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
52,17 → 52,27
// + 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.
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include <stdlib.h>
#include "91x_lib.h"
#include "printf_P.h"
#include "main.h"
#include "ubx.h"
#include "GPS.h"
#include "timer.h"
#include "i2c.h"
#include "spi_slave.h"
#include "menu.h"
#include "uart1.h"
 
u16 TestInt = 0;
#define ARRAYGROESSE 10
u8 Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10};
s8 DisplayBuff[80] = "Hallo Welt";
s8 DisplayBuff[DISPLAYBUFFSIZE] = "Hello World";
u8 DispPtr = 0;
u8 RemoteTasten = 0;
 
u8 MenuItem = 0;
u8 MaxMenuItem = 12;
u8 RemoteKeys = 0;
 
#define KEY1 0x01
#define KEY2 0x02
#define KEY3 0x04
69,45 → 79,203
#define KEY4 0x08
#define KEY5 0x10
 
void LcdClear(void)
/************************************/
/* Clear LCD Buffer */
/************************************/
void LCD_Clear(void)
{
u8 i;
for(i=0;i<80;i++) DisplayBuff[i] = ' ';
u8 i;
for( i = 0; i < DISPLAYBUFFSIZE; i++) DisplayBuff[i] = ' ';
}
 
void Menu(void)
{
static u8 MaxMenue = 1,MenuePunkt=0;
u8 text[20];
if(RemoteTasten & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue; LcdClear(); }
if(RemoteTasten & KEY2) { MenuePunkt++; LcdClear(); }
if((RemoteTasten & KEY1) && (RemoteTasten & KEY2)) MenuePunkt = 0;
LCD_printfxy(17,0,"[%i]",MenuePunkt);
switch(MenuePunkt)
{
case 0:
LCD_printfxy(0,0,"++ Navi-Ctrl ++");
LCD_printfxy(0,1,"SW:%d.%d",VERSION_HAUPTVERSION, VERSION_NEBENVERSION);
// LCD_printfxy(0,2,"Setting: %d ",GetActiveParamSetNumber());
LCD_printfxy(0,3,"(c) I.B. H.B. ");
// if(RemoteTasten & KEY3) TestInt--;
// if(RemoteTasten & KEY4) TestInt++;
break;
case 1:
LCD_printfxy(0,0,"++ GPS-Logging ++");
sprintf(text, "latitude: %u",GPS_Data.Latitude);
LCD_printfxy(0,1,text);
sprintf(text, "longitude:%u",GPS_Data.Longitude);
LCD_printfxy(0,2,text);
sprintf(text, "used sat: %d",GPS_Data.Used_Sat);
LCD_printfxy(0,3,text);
break;
 
default: MaxMenue = MenuePunkt - 1;
MenuePunkt = 0;
break;
/************************************/
/* Update Menu on LCD */
/************************************/
// Display with 20 characters in 4 lines
void LCD_PrintMenu(void)
{
s32 i1,i2;
if(RemoteKeys & KEY1) { if(MenuItem) MenuItem--; else MenuItem = MaxMenuItem;}
if(RemoteKeys & KEY2) { if(MenuItem == MaxMenuItem) MenuItem = 0; else MenuItem++;}
if((RemoteKeys & KEY1) && (RemoteKeys & KEY2)) MenuItem = 0;
 
LCD_Clear();
if(MenuItem > MaxMenuItem) MenuItem = MaxMenuItem;
// print menu item number in the upper right corner
if(MenuItem < 10)
{
LCD_printfxy(17,0,"[%i]",MenuItem);
}
else
{
LCD_printfxy(16,0,"[%i]",MenuItem);
}
 
switch(MenuItem)
{
// Version Info
case 0:
LCD_printfxy(0,0,"++ Navi-Ctrl ++");
LCD_printfxy(0,1," V%d.%d%c ", VERSION_MAJOR, VERSION_MINOR, 'a'+ VERSION_PATCH);
if(ErrorCode) LCD_printfxy(11,1," Err:%d",ErrorCode) else LCD_printfxy(11,1," ");
LCD_printfxy(0,2,"%s",ErrorMSG);
LCD_printfxy(0,3,"(c) Buss, Busker");
break;
case 1:
if (GPSData.Status == INVALID)
{
LCD_printfxy(0,0,"No GPS data");
LCD_printfxy(0,1,"Lon: ");
LCD_printfxy(0,2,"Lat: ");
LCD_printfxy(0,3,"Alt: ");
}
else // newdata or processed
{
switch (GPSData.SatFix)
{
case SATFIX_NONE:
LCD_printfxy(0,0,"Sats:%02d Fix:None", GPSData.NumOfSats);
break;
case SATFIX_2D:
LCD_printfxy(0,0,"Sats:%02d Fix:2D ", GPSData.NumOfSats);
break;
case SATFIX_3D:
LCD_printfxy(0,0,"Sats:%02d Fix:3D ", GPSData.NumOfSats);
break;
default:
LCD_printfxy(0,0,"Sats:%02d Fix:?? ", GPSData.NumOfSats);
break;
}
i1 = GPSData.Position.Longitude/10000000L;
i2 = abs(GPSData.Position.Longitude%10000000L);
LCD_printfxy(0,1,"Lon:%+3ld.%07ld deg",i1, i2);
i1 = GPSData.Position.Latitude/10000000L;
i2 = abs(GPSData.Position.Latitude%10000000L);
LCD_printfxy(0,2,"Lat:%+3ld.%07ld deg",i1, i2);
i1 = GPSData.Position.Altitude/1000L;
i2 = abs(GPSData.Position.Altitude%1000L);
LCD_printfxy(0,3,"Alt:%4ld.%03ld m",i1, i2);
}
break;
case 2:
if (GPSData.Status == INVALID)
{
LCD_printfxy(0,0,"No GPS data");
LCD_printfxy(0,1,"Speed N: ");
LCD_printfxy(0,2,"Speed E: ");
LCD_printfxy(0,3,"Speed T: ");
}
else // newdata or processed
{
switch (GPSData.SatFix)
{
case SATFIX_NONE:
LCD_printfxy(0,0,"Sats:%02d Fix:None", GPSData.NumOfSats);
break;
case SATFIX_2D:
LCD_printfxy(0,0,"Sats:%02d Fix:2D ", GPSData.NumOfSats);
break;
case SATFIX_3D:
LCD_printfxy(0,0,"Sats:%02d Fix:3D ", GPSData.NumOfSats);
break;
default:
LCD_printfxy(0,0,"Sats:%02d Fix:?? ", GPSData.NumOfSats);
break;
}
LCD_printfxy(0,1,"Speed N: %+4ld cm/s",GPSData.Speed_North);
LCD_printfxy(0,2,"Speed E: %+4ld cm/s",GPSData.Speed_East);
LCD_printfxy(0,3,"Speed T: %+4ld cm/s",GPSData.Speed_Top);
}
break;
case 3:
LCD_printfxy(0,0,"GPS UTC Time");
if (!SystemTime.Valid)
{
LCD_printfxy(0,0,"GPS UTC Time");
LCD_printfxy(0,1," ");
LCD_printfxy(0,2," No time data! ");
LCD_printfxy(0,3," ");
}
else // newdata or processed
{
LCD_printfxy(0,1," ");
LCD_printfxy(0,2,"Date: %02i/%02i/%04i",SystemTime.Month, SystemTime.Day, SystemTime.Year);
LCD_printfxy(0,3,"Time: %02i:%02i:%02i.%03i", SystemTime.Hour, SystemTime.Min, SystemTime.Sec, SystemTime.mSec);
 
}
break;
case 4: // Navi Params from FC
LCD_printfxy(0,0,"NaviMode: %3i" , Parameter.NaviGpsModeControl);
LCD_printfxy(0,1,"G :%3i P :%3i ",Parameter.NaviGpsGain, Parameter.NaviGpsP);
LCD_printfxy(0,2,"I :%3i D :%3i ",Parameter.NaviGpsI, Parameter.NaviGpsD);
LCD_printfxy(0,3,"ACC:%3i SAT:%3i ",Parameter.NaviGpsACC, Parameter.NaviGpsMinSat);
break;
case 5:
LCD_printfxy(0,0,"Home Position");
if(GPS_HomePosition.Status == INVALID)
{
LCD_printfxy(0,1," ");
LCD_printfxy(0,2," Is not set. ");
LCD_printfxy(0,3," ");
}
else
{
i1 = GPS_HomePosition.Longitude/10000000L;
i2 = abs(GPS_HomePosition.Longitude%10000000L);
LCD_printfxy(0,1,"Lon: %3ld.%07ld deg",i1, i2);
i1 = GPS_HomePosition.Latitude/10000000L;
i2 = abs(GPS_HomePosition.Latitude%10000000L);
LCD_printfxy(0,2,"Lat: %3ld.%07ld deg",i1, i2);
i1 = GPS_HomePosition.Altitude/1000L;
i2 = abs(GPS_HomePosition.Altitude%1000L);
LCD_printfxy(0,3,"Alt:%4ld.%03ld m",i1, i2);
}
break;
case 6: // RC stick controls from FC
LCD_printfxy(0,0,"RC-Sticks" );
LCD_printfxy(0,1,"Ni:%4i Ro:%4i ",FC.StickNick, FC.StickRoll);
LCD_printfxy(0,2,"Gs:%4i Ya:%4i ",FC.StickGas, FC.StickYaw);
break;
case 7: // RC poti controls from FC
LCD_printfxy(0,0,"RC-Potis" );
LCD_printfxy(0,1,"Po1:%3i Po2:%3i ",FC.Poti1, FC.Poti2);
LCD_printfxy(0,2,"Po3:%3i Po4:%3i ",FC.Poti3, FC.Poti4);
break;
case 8: // attitude from FC
LCD_printfxy(0,0,"IntNick: %5i", FromFlightCtrl.IntegralNick);
LCD_printfxy(0,1,"IntRoll: %5i", FromFlightCtrl.IntegralRoll);
LCD_printfxy(0,2,"AccNick: %5i", FromFlightCtrl.AccNick);
LCD_printfxy(0,3,"AccRoll: %5i", FromFlightCtrl.AccRoll);
break;
case 9: // gyros from FC
LCD_printfxy(0,0,"GyroNick: %4i", FromFlightCtrl.GyroNick);
LCD_printfxy(0,1,"GyroRoll: %4i", FromFlightCtrl.GyroRoll);
LCD_printfxy(0,2,"GyroYaw: %4i", FromFlightCtrl.GyroYaw);
break;
case 10: // Remote Control Level from FC
LCD_printfxy(0,0,"RC-Level: %3i", FC.RC_Quality);
LCD_printfxy(0,1,"Ubat: %3i", FC.UBat);
LCD_printfxy(0,2,"CompHeading: %3i", I2C_Heading.Heading);
LCD_printfxy(0,3,"GyroHeading: %3i", FromFlightCtrl.GyroHeading);
break;
case 11: // User Parameter
LCD_printfxy(0,0,"UP1:%3i UP2:%3i ",Parameter.User1,Parameter.User2);
LCD_printfxy(0,1,"UP3:%3i UP4:%3i ",Parameter.User3,Parameter.User4);
LCD_printfxy(0,2,"UP5:%3i UP6:%3i ",Parameter.User5,Parameter.User6);
LCD_printfxy(0,3,"UP7:%3i UP8:%3i ",Parameter.User7,Parameter.User8);
break;
case 12: // MK3MAG
I2C1_SendCommand(I2C_CMD_READ_MAG);
LCD_printfxy(0,0,"MK3MAG V%i.%i%c",MK3MAG_Version.Major, MK3MAG_Version.Minor, 'a'+ MK3MAG_Version.Patch);
LCD_printfxy(0,1,"MagX: %4i ",I2C_Mag.MagX);
LCD_printfxy(0,2,"MagY: %4i ",I2C_Mag.MagY);
LCD_printfxy(0,3,"MagZ: %4i ",I2C_Mag.MagZ);
break;
default:
MaxMenuItem = MenuItem - 1;
MenuItem = 0;
break;
}
RemoteTasten = 0;
RemoteKeys = 0;
}
/trunk/menu.h
1,6 → 1,17
extern void Menu(void);
extern s8 DisplayBuff[80];
extern void LcdClear(void);
#ifndef _MENU_H
#define _MENU_H
 
 
#define DISPLAYBUFFSIZE 80
 
void Menu(void);
void LCD_PrintMenu(void);
void LCD_Clear(void);
 
extern s8 DisplayBuff[DISPLAYBUFFSIZE];
extern u8 DispPtr;
extern u8 RemoteTasten;
extern u8 MenuItem;
extern u8 MaxMenuItem;
extern u8 RemoteKeys;
 
#endif // _MENU_H
/trunk/printf_P.c
88,10 → 88,10
#else
#include <varargs.h>
#endif
#include "91x_lib.h"
#include "menu.h"
 
#include "main.h"
 
 
//#define LIGHTPRINTF
char Putchar(char zeichen)
{
/trunk/printf_P.h
3,7 → 3,7
 
 
 
extern void _printf_P (char const *fmt0, ...);
void _printf_P (char const *fmt0, ...);
 
 
#define printf_P(format, args...) _printf_P(format , ## args)
/trunk/ramfunc.c
55,9 → 55,9
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//----------------------------------------------------------------------------------------------------
#include "91x_lib.h"
#include "ramfunc.h"
 
#include "main.h"
 
__ramfunc void Execute_Bootloader(void)
{
pFunction Jump_To_Bootloader;
/trunk/ramfunc.h
1,5 → 1,5
#ifndef _RAMFUNC_H
#define _RAMFUNC_H
#define _RAMFUNC_H
 
typedef void (*pFunction)(void);
#define __ramfunc __attribute__ ((long_call, section (".ramfunc")))
/trunk/sdc.c
57,7 → 57,7
#include <stdio.h>
#include <string.h>
#include "91x_lib.h"
#include "uart.h"
#include "uart1.h"
#include "sdc.h"
#include "ssc.h"
#include "timer.h"
181,17 → 181,18
return(crc);
}
 
u8 SDC_WaitForBusy()
u8 SDC_WaitForBusy(u32 timeout)
{
u8 rsp = 0;
u16 timeout=0;
u32 timestamp = 0;
 
SSC_ClearRxFifo();
SSC_Enable(); // enable chipselect.
timestamp = SetDelay(timeout);
do
{
rsp = SSC_GetChar();
if(timeout++>500) break;
if(CheckDelay(timestamp)) break;
}while(rsp != 0xFF); // wait while card is busy (data out low)
return(rsp);
}
209,17 → 210,16
u8 SDC_SendCMDR1(u8 CmdNo, u32 arg)
{
u8 r1;
u16 Timeout = 0;
u16 timeout = 0;
u16 a;
u8 cmd[6];
 
SSC_ClearRxFifo(); // clear the rx fifo
SSC_Enable(); // enable chipselect.
SDC_WaitForBusy();
SDC_WaitForBusy(500); // wait 500ms until card is busy
SSC_ClearRxFifo(); // clear the rx fifo
SSC_GetChar(); // dummy to sync
 
/* Send cmd10 (SEND_CID) */;
cmd[0] = 0x40|CmdNo; // set command index
cmd[1] = (arg & 0xFF000000)>>24;
cmd[2] = (arg & 0x00FF0000)>>16;
231,10 → 231,11
SSC_PutChar(cmd[a]);
}
SSC_ClearRxFifo(); // clear the rx fifo to discard the bytes received during the transmission of the 6 command bytes
 
do
{
r1 = SSC_GetChar(); // get byte from sd-card
if (Timeout++ > 500) return(r1);
if (timeout++ >500) break;
}while(r1 == 0xFF); // wait for the response byte from sd-card.
return(r1);
}
242,7 → 243,7
 
//________________________________________________________________________________________________________________________________________
// Function: SDC_SendACMDR1(u8 CmdNo, u32 arg);
//
//
// Description: This function send a application command frame to the SD-Card in spi-mode.
//
//
270,8 → 271,7
SD_Result_t SDC_GetData(u8 CmdNo, u32 addr, u8 *Buffer, u32 len)
{
u8 rsp;
u16 timeout;
u16 a, Crc16;
u16 a, crc16;
SD_Result_t result = SD_ERROR_UNKNOWN;
 
// send the command
290,7 → 290,6
result = SD_ERROR_READ_DATA;
goto end;
}
// if(timeout++>500) break;
}while(rsp != DATA_START_TOKEN);
// data start token received
for (a = 0; a < len; a++) // read the block from the SSC
298,13 → 297,12
Buffer[a] = SSC_GetChar();
}
// Read two bytes CRC16-Data checksum
Crc16 = SSC_GetChar(); // highbyte fisrt
Crc16 = (Crc16<<8)|SSC_GetChar(); // lowbyte last
// if(Crc16 != CRC16(Buffer, len)) result = SD_ERROR_CRC_DATA;
/* else */result = SD_SUCCESS;
crc16 = SSC_GetChar(); // highbyte fisrt
crc16 = (crc16<<8)|SSC_GetChar(); // lowbyte last
/* if(crc16 != CRC16(Buffer, len)) result = SD_ERROR_CRC_DATA;
else */result = SD_SUCCESS;
end:
//SSC_Disable(); // disable sdcard.
if(result != SD_SUCCESS)
{
sprintf(text,"Error %02X reading data from sd card (R1=%02X).\r\n", result, rsp);
329,19 → 327,19
u8 pn[6];
u16 temp1, temp2;
 
sprintf(text, "\r\nManufacturer ID: %i\r\n", pCID[0]);
sprintf(text, "\r\n Manufacturer ID: %i\r\n", pCID[0]);
SerialPutString(text);
memcpy(pn, &pCID[1], 2);
pn[2] = '\0'; // terminate string
sprintf(text, "Application ID: %s\r\n",pn);
sprintf(text, " Application ID: %s\r\n",pn);
SerialPutString(text);
memcpy(pn, &pCID[3], 5);
pn[5] = '\0'; // terminate string
sprintf(text, "Product Name: %s\r\n",pn);
sprintf(text, " Product Name: %s\r\n",pn);
SerialPutString(text);
sprintf(text, "Product Rev.: %i.%i\r\n",pCID[8]>>4, pCID[8]&0xF);
sprintf(text, " Product Rev.: %i.%i\r\n",pCID[8]>>4, pCID[8]&0xF);
SerialPutString(text);
SerialPutString("Serial No.: ");
SerialPutString(" Serial No.: ");
for(temp1 = 0; temp1<4; temp1++)
{
sprintf(text,"%02X", pCID[9+temp1]);
350,7 → 348,7
SerialPutString("\r\n");
temp1 = pCID[14] & 0x0F; // month
temp2 = ((pCID[14]>>4)|(pCID[13]<<4)) + 2000; // year
sprintf(text, "Manufac. Date: %i/%i\r\n\r\n",temp1, temp2);
sprintf(text, " Manufac. Date: %i/%i\r\n\r\n",temp1, temp2);
SerialPutString(text);
}
 
394,7 → 392,7
 
SD_Result_t SDC_Init(void)
{
u32 Timeout = 0;
u32 timeout = 0;
u8 text[50];
u8 rsp[6]; // SD-SPI response buffer
SD_Result_t result = SD_ERROR_UNKNOWN;
401,11 → 399,11
if(SD_SWITCH) // init only if the SD-Switch is indicating a card in the slot
{
SerialPutString("\r\n SSC init...");
SerialPutString("\r\n SSC init...");
SSC_Init();
SerialPutString("ok");
SerialPutString("\r\n SDC init...");
 
SerialPutString("\r\n SDC init...");
SDCardInfo.Valid = 0;
/* The host shall supply power to the card so that the voltage is reached to Vdd_min within 250ms and
start to supply at least 74 SD clocks to the SD card with keeping cmd line to high. In case of SPI
413,7 → 411,7
SSC_Disable(); // set SD_CS high
SSC_ClearRxFifo(); // clear the rx fifo
for (Timeout = 0; Timeout < 15; Timeout++) // 15*8 = 120 cycles
for (timeout = 0; timeout < 15; timeout++) // 15*8 = 120 cycles
{
SSC_PutChar(0xFF);
}
421,7 → 419,7
// switch to idle state
while(SDC_SendCMDR1(CMD_GO_IDLE_STATE, 0UL) != R1_IDLE_STATE)
{
if (Timeout++ > 20)
if (timeout++ > 20)
{
SerialPutString("reset timeout");
result = SD_ERROR_RESET;
431,7 → 429,7
// enable crc feature
/* if(SDC_SendCMDR1(CMD_CRC_ON_OFF, 1UL) != R1_IDLE_STATE)
{
sprintf(text,"Bad cmd59 R1=%02X.\r\n", rsp[0]);
sprintf(text,"Bad cmd59 R1=%02X.", rsp[0]);
SerialPutString(text);
result = SD_ERROR_BAD_RESPONSE;
goto end;
442,7 → 440,7
// answer to cmd58 is an R7 response (R1+ 4Byte IFCond)
if(rsp[0] & R1_BAD_RESPONSE)
{
sprintf(text,"Bad cmd8 R1=%02X.\r\n", rsp[0]);
sprintf(text,"Bad cmd8 R1=%02X.", rsp[0]);
SerialPutString(text);
result = SD_ERROR_BAD_RESPONSE;
goto end;
457,9 → 455,9
// Ver2.00 or later SD Memory Card
// reading the remaining bytes of the R7 response
SDCardInfo.Version = VER_20;
for(Timeout = 1; Timeout < 5; Timeout++)
for(timeout = 1; timeout < 5; timeout++)
{
rsp[Timeout] = SSC_GetChar();
rsp[timeout] = SSC_GetChar();
}
//check pattern
if(rsp[4]!= 0xAA)
481,7 → 479,7
// answer to cmd58 is an R3 response (R1 + 4Byte OCR)
if(rsp[0] & R1_BAD_RESPONSE)
{
sprintf(text,"Bad cmd58 R1 %02x.\r\n", rsp[0]);
sprintf(text,"Bad cmd58 R1 %02x.", rsp[0]);
SerialPutString(text);
result = SD_ERROR_BAD_RESPONSE;
goto end;
488,39 → 486,39
}
if(rsp[0] & R1_ILLEGAL_CMD)
{
SerialPutString("Not an SD-CARD.\r\n");
SerialPutString("Not an SD-CARD.");
result = SD_ERROR_NO_SDCARD;
goto end;
}
// read 4 bytes of OCR register
for(Timeout = 1; Timeout < 5; Timeout++)
for(timeout = 1; timeout < 5; timeout++)
{
rsp[Timeout] = SSC_GetChar();
rsp[timeout] = SSC_GetChar();
}
// NavicCtrl uses 3.3 V, therefore check for bit 20 & 21
if((rsp[2] & 0x30) != 0x30)
{
// supply voltage is not supported by sd-card
SerialPutString("Card is incompatible to 3.3V.\r\n");
SerialPutString("Card is incompatible to 3.3V.");
result = SD_ERROR_BAD_VOLTAGE_RANGE;
goto end;
}
// Initialize the sd-card sending continously ACMD_SEND_OP_COND (only supported by SD cards)
Timeout = SetDelay(2000); // set timeout to 2000 ms (large cards tend to longer)
timeout = SetDelay(2000); // set timeout to 2000 ms (large cards tend to longer)
do
{
rsp[0] = SDC_SendACMDR1(ACMD_SEND_OP_COND, 0UL);
if(rsp[0] & R1_BAD_RESPONSE)
{
sprintf(text,"Bad Acmd41 R1=%02X.\r\n", rsp[0]);
sprintf(text,"Bad Acmd41 R1=%02X.", rsp[0]);
SerialPutString(text);
result = SD_ERROR_BAD_RESPONSE;
goto end;
}
if(CheckDelay(Timeout))
if(CheckDelay(timeout))
{
SerialPutString("Init timeout.\r\n");
SerialPutString("Init timeout.");
result = SD_ERROR_INITIALIZE;
goto end;
}
528,7 → 526,7
if(rsp[0] != R1_NO_ERR)
{
SerialPutString("Init error.\r\n");
SerialPutString("Init error.");
result = SD_ERROR_INITIALIZE;
goto end;
}
535,13 → 533,12
/* set block size to 512 bytes */
if(SDC_SendCMDR1(CMD_SET_BLOCKLEN, 512UL) != R1_NO_ERR)
{
SerialPutString("Error setting block length to 512.\r\n");
SerialPutString("Error setting block length to 512.");
result = SD_ERROR_SET_BLOCKLEN;
goto end;
}
 
 
//SSC_Disable(); // set SD_CS high
//SSC_Disable(); // set SD_CS high
// here is the right place to inrease the SPI boud rate to maximum
//SSC_Enable(); // set SD_CS high
 
557,7 → 554,7
result = SDC_GetCSD((u8 *)&SDCardInfo.CSD);
if(result != SD_SUCCESS)
{
SerialPutString("Error reading CSD.\r\n");
SerialPutString("Error reading CSD.");
goto end;
}
601,8 → 598,9
c_size |= ((u32)SDCardInfo.CSD[8])<<8; //CSD[08] -> [63:56]
c_size |= (u32)SDCardInfo.CSD[9]; //CSD[09] -> [55:48];
SDCardInfo.Capacity = (c_size + 1)* 512L * 1024L;
break;
default: //unknown CSD Version
break;
default: //unknown CSD Version
SDCardInfo.Capacity = 0;
break;
}
621,9 → 619,8
sprintf(text, "\r\n Capacity = %i MB", mb_size);
SerialPutString(text);
// SDC_PrintCID((u8 *)&SDCardInfo.CID);
SDC_PrintCID((u8 *)&SDCardInfo.CID);
SDCardInfo.Valid = 1;
// jump point for error condition before
end:
SSC_Disable();
630,13 → 627,11
}
else
{
//SerialPutString("\r\nNo Card in Slot.");
SSC_Deinit();
SDCardInfo.Valid = 0;
result = SD_ERROR_NOCARD;
SerialPutString("No Card in Slot.");
}
// if(result != SD_SUCCESS) SerialPutString("nok ");
 
return(result);
}
 
652,7 → 647,7
 
SD_Result_t SDC_Deinit(void)
{
SerialPutString("SDC deinit...");
SerialPutString("\r\n SDC deinit...");
SSC_Deinit();
 
SDCardInfo.Valid = 0;
659,7 → 654,7
SDCardInfo.Capacity = 0;
SDCardInfo.Version = VER_UNKNOWN;
 
SerialPutString("ok\r\n");
SerialPutString("ok");
return(SD_SUCCESS);
}
 
676,9 → 671,8
SD_Result_t SDC_PutSector(u32 addr, const u8 *Buffer)
{
u8 rsp;
u16 a, crc16;
u16 timeout = 0;
u16 a, Crc16;
//u32 Timeout = 0;
SD_Result_t result = SD_ERROR_UNKNOWN;
 
addr = addr << 9; // convert sectoradress to byteadress
693,7 → 687,7
{
SSC_GetChar();
}
Crc16 = CRC16(Buffer, 512); // calc checksum for data block
crc16 = CRC16(Buffer, 512); // calc checksum for data block
SSC_PutChar(DATA_START_TOKEN); // send data start of header to the SSC
for (a=0;a<512;a++) // transmit one sector (normaly 512bytes) of data to the sdcard.
701,13 → 695,17
SSC_PutChar(Buffer[a]);
}
// write two bytes of crc16 to the sdcard
SSC_PutChar((u8)(Crc16>>8)); // write high byte first
SSC_PutChar((u8)(0x00FF&Crc16)); // lowbyte last
SSC_PutChar((u8)(crc16>>8)); // write high byte first
SSC_PutChar((u8)(0x00FF&crc16)); // lowbyte last
SSC_ClearRxFifo();
do // wait for data response token
{
rsp = SSC_GetChar();
if(timeout++>500) break;
if(timeout++ > 500)
{
result = SD_ERROR_TIMEOUT;
goto end;
}
}while((rsp & 0x11) != 0x01 );
// analyse data response token
switch(rsp & DATA_RESPONSE_MASK)
729,19 → 727,21
break;
 
}
// wait until the sdcard is busy.
rsp = SDC_WaitForBusy();
// wait 2 seconds until the sdcard is busy.
rsp = SDC_WaitForBusy(2000);
if(rsp != 0xFF)
{
result = SD_ERROR_TIMEOUT;
goto end;
result = SD_ERROR_TIMEOUT;
goto end;
}
 
// check card status
rsp = SDC_SendCMDR1(CMD_SEND_STATUS, 0);
// first byte of R2 response is like R1 response
if(rsp != R1_NO_ERR)
{
result = SD_ERROR_BAD_RESPONSE;
SSC_GetChar();
SSC_GetChar(); // read out 2nd byte
goto end;
}
// 2nd byte of r2 response
753,7 → 753,6
goto end;
}
end:
//SSC_Disable(); // disable sdcard.
if(result != SD_SUCCESS)
{
sprintf(text,"Error %02X writing data to sd card (R=%02X).\r\n", result, rsp);
760,7 → 759,7
SerialPutString(text);
}
return(result);
}
}
 
 
//________________________________________________________________________________________________________________________________________
/trunk/sdc.h
1,7 → 1,6
#ifndef _SDC_H
#define _SDC_H
 
#include "91x_lib.h"
 
//________________________________________________________________________________________________________________________________________
//
26,10 → 25,10
SD_ERROR_UNKNOWN
} SD_Result_t;
 
extern SD_Result_t SDC_Init(void);
extern SD_Result_t SDC_GetSector (u32 ,u8 *);
extern SD_Result_t SDC_PutSector (u32, const u8 *);
extern SD_Result_t SDC_Deinit(void);
SD_Result_t SDC_Init(void);
SD_Result_t SDC_GetSector (u32 ,u8 *);
SD_Result_t SDC_PutSector (u32, const u8 *);
SD_Result_t SDC_Deinit(void);
 
#endif // _SDC_H
 
/trunk/settings.c
54,7 → 54,13
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include "main.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "91x_lib.h"
#include "fat16.h"
#include "settings.h"
#include "uart1.h"
 
struct str_setting_parameter CFG_Parameter[] =
{
105,12 → 111,12
}
 
//----------------------------------------------------------------------------------
void ReadSetting(unsigned char number)
void ReadSetting(u8 number)
{
File *fp;
char text[32];
File_t *fp;
u8 text[32];
u8 tmp;
char *token;
u8 *token;
InitDefaultParameters();
 
/trunk/spi_slave.c
7,14 → 7,14
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
25,21 → 25,21
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
52,313 → 52,399
// + 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.
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
#include <string.h>
#include "91x_lib.h"
#include "led.h"
#include "GPS.h"
#include "uart1.h"
#include "spi_slave.h"
#include "i2c.h"
#include "timer.h"
#include "main.h"
#include "fifo.h"
 
struct str_FromFlightCtrl FromFlightCtrl;
struct str_ToFlightCtrl ToFlightCtrl;
 
struct str_ToFlightCtrl SPI_TxBuffer;
#define SPI_RXSYNCBYTE1 0xAA
#define SPI_RXSYNCBYTE2 0x83
#define SPI_TXSYNCBYTE1 0x81
#define SPI_TXSYNCBYTE2 0x55
 
volatile unsigned char SPI_Buffer[sizeof(FromFlightCtrl)];
volatile unsigned char SPI_BufferIndex = 0;
volatile unsigned char SPI_TXBufferIndex = 0;
typedef enum
{
SPI_SYNC1,
SPI_SYNC2,
SPI_DATA
} SPI_State_t;
 
s16 CompassValue;
//communication packets
volatile FromFlightCtrl_t FromFlightCtrl;
volatile ToFlightCtrl_t ToFlightCtrl;
 
volatile struct str_MicroMag MicroMag;
// tx packet buffer
#define SPI_TXBUFFER_LEN (2 + sizeof(ToFlightCtrl)) // 2 bytes at start are for synchronization
volatile u8 SPI_TxBuffer[SPI_TXBUFFER_LEN];
volatile u8 SPI_TxBufferIndex = 0;
u8 *Ptr_TxChksum = NULL ; // pointer to checksum in TxBuffer
 
// rx packet buffer
#define SPI_RXBUFFER_LEN sizeof(FromFlightCtrl)
volatile u8 SPI_RxBuffer[SPI_RXBUFFER_LEN];
volatile u8 SPI_RxBufferIndex = 0;
volatile u8 SPI_RxBuffer_Request = 0;
#define SPI_COMMAND_INDEX 0
unsigned char *Ptr_buffer_Tx = (unsigned char *) &SPI_TxBuffer;
//unsigned char *Ptr_buffer_Tx = (unsigned char *) &ToFlightCtrl;
unsigned char *Ptr_buffer_Rx = (unsigned char *) &FromFlightCtrl;
volatile unsigned char SPI_state = 0, SPI_TXUpdatebufferRequest = 0, SPI_RXUpdatebufferRequest = 0;
 
unsigned char SPI_CommandSequence[] = { SPI_CMD_OSD_DATA, SPI_CMD_GPS_POS, SPI_CMD_GPS_TARGET};
unsigned char SPI_CommandCounter = 0;
s32 FC_Kalman_K = 32;
s32 Kalman_MaxDrift = 5 * 16;
s32 Kalman_MaxFusion = 64;
u32 CheckSPIOkay = 0;
 
//--------------------------------------------------------------
void SSP0_IRQHandler(void)
{
static u8 chksum = 0;
u8 data;
GPIO_ToggleBit(GPIO5, GPIO_Pin_7);
SSP_ClearITPendingBit(SSP0, SSP_IT_RxTimeOut);
while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
{
if (SPI_TXBufferIndex < sizeof(ToFlightCtrl)) // still data to send ?
{ SSP0->DR = Ptr_buffer_Tx[SPI_TXBufferIndex];
SPI_TxBuffer.Chksum += Ptr_buffer_Tx[SPI_TXBufferIndex];
SPI_TXBufferIndex++;
}
else
{
SPI_TXBufferIndex = 0;
SPI_TXUpdatebufferRequest = 1;
ToFlightCtrl.Chksum = 0;
ToFlightCtrl.BeepTime = BeepTime;
BeepTime = 0;
memcpy((unsigned char *) &SPI_TxBuffer, (unsigned char *) &ToFlightCtrl, sizeof(ToFlightCtrl));
}
}
while (SSP_GetFlagStatus(SSP0, SSP_FLAG_RxFifoNotEmpty)==SET)
{
u8 SPI_CommandSequence[] = { SPI_KALMAN, SPI_CMD_OSD_DATA, SPI_CMD_GPS_POS, SPI_KALMAN, SPI_CMD_GPS_TARGET};
u8 SPI_CommandCounter = 0;
 
data = SSP0->DR;
SPI_Version_t FC_Version;
 
while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
{
if (SPI_TXBufferIndex < sizeof(ToFlightCtrl)) // still data to send ?
{ SSP0->DR = Ptr_buffer_Tx[SPI_TXBufferIndex];
SPI_TxBuffer.Chksum += Ptr_buffer_Tx[SPI_TXBufferIndex];
SPI_TXBufferIndex++;
}
else
{
SPI_TXBufferIndex = 0;
ToFlightCtrl.Chksum = 0;
SPI_TXUpdatebufferRequest = 1;
ToFlightCtrl.BeepTime = BeepTime;
BeepTime = 0;
memcpy((unsigned char *) &SPI_TxBuffer, (unsigned char *) &ToFlightCtrl, sizeof(ToFlightCtrl));
}
u8 CompassCalStateQueue[10];
fifo_t CompassCalcStateFiFo;
 
}
switch (SPI_state )
{
case 0:
SPI_BufferIndex = 0;
chksum = data;
if (data == 0xAA && !SPI_RXUpdatebufferRequest) { SPI_state = 1; } // 1. Syncbyte ok
break;
u8 CompassCalState = 0;
 
case 1:
if (data == 0x83) { chksum += data; SPI_state = 2; } // 2. Syncbyte ok
else SPI_state = 0;
break;
case 2:
SPI_Buffer[SPI_BufferIndex++]= data; // get data
if (SPI_BufferIndex >= sizeof(SPI_Buffer)) // end of packet
{
if (data == chksum)
{
u8 i;
SPI_RXUpdatebufferRequest = 1;
for (i=0;i<sizeof(SPI_Buffer);i++) { Ptr_buffer_Rx[i] = SPI_Buffer[i]; }
//--------------------------------------------------------------
void SSP0_IRQHandler(void)
{
static u8 rxchksum = 0;
u8 rxdata;
static SPI_State_t SPI_State = SPI_SYNC1;
 
DebugOut.Analog[13]++;
}
else { DebugOut.Analog[12]++; }
SPI_state = 0;
}
else chksum += data;
break;
 
default: SPI_state = 0; break;
}
}
// clear pending bit
SSP_ClearITPendingBit(SSP0, SSP_IT_RxTimeOut);
// Fill TxFIFO while its not full or end of packet is reached
while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
{
if (SPI_TxBufferIndex < SPI_TXBUFFER_LEN) // still data to send ?
{
SSP0->DR = SPI_TxBuffer[SPI_TxBufferIndex]; // send a byte
*Ptr_TxChksum += SPI_TxBuffer[SPI_TxBufferIndex]; // update checksum
SPI_TxBufferIndex++; // pointer to next byte
}
else // TxBuffer end is reached then reset and copy data to tx buffer
{
SPI_TxBufferIndex = 0; // reset buffer index
ToFlightCtrl.Chksum = 0; // initialize checksum
ToFlightCtrl.BeepTime = BeepTime; // set beeptime
BeepTime = 0; // reset local beeptime
// copy contents of ToFlightCtrl->SPI_TxBuffer
memcpy( (u8 *) &(SPI_TxBuffer[2]), (u8 *) &ToFlightCtrl, sizeof(ToFlightCtrl));
}
}
// while RxFIFO not empty
while (SSP_GetFlagStatus(SSP0, SSP_FLAG_RxFifoNotEmpty)==SET)
{
rxdata = SSP0->DR; // catch the received byte
// Fill TxFIFO while its not full or end of packet is reached
while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
{
if (SPI_TxBufferIndex < SPI_TXBUFFER_LEN) // still data to send ?
{
SSP0->DR = SPI_TxBuffer[SPI_TxBufferIndex]; // send a byte
*Ptr_TxChksum += SPI_TxBuffer[SPI_TxBufferIndex]; // update checksum
SPI_TxBufferIndex++; // pointer to next byte
}
else // end of packet is reached reset and copy data to tx buffer
{
SPI_TxBufferIndex = 0; // reset buffer index
ToFlightCtrl.Chksum = 0; // initialize checksum
ToFlightCtrl.BeepTime = BeepTime; // set beeptime
BeepTime = 0; // reset local beeptime
// copy contents of ToFlightCtrl->SPI_TxBuffer
memcpy((u8 *) &(SPI_TxBuffer[2]), (u8 *) &ToFlightCtrl, sizeof(ToFlightCtrl));
}
}
switch (SPI_State)
{
case SPI_SYNC1:
SPI_RxBufferIndex = 0; // reset buffer index
rxchksum = rxdata; // init checksum
if (rxdata == SPI_RXSYNCBYTE1)
{ // 1st syncbyte ok
SPI_State = SPI_SYNC2; // step to sync2
}
break;
case SPI_SYNC2:
if (rxdata == SPI_RXSYNCBYTE2)
{ // 2nd Syncbyte ok
rxchksum += rxdata;
SPI_State = SPI_DATA;
} // 2nd Syncbyte does not match
else
{
SPI_State = SPI_SYNC1; //jump back to sync1
}
break;
case SPI_DATA:
SPI_RxBuffer[SPI_RxBufferIndex++]= rxdata; // copy databyte to rx buffer
if (SPI_RxBufferIndex >= SPI_RXBUFFER_LEN) // end of packet is reached
{
if (rxdata == rxchksum) // verify checksum byte
{
// copy SPI_RxBuffer -> FromFlightCtrl
if(!SPI_RxBuffer_Request) // block writing to FromFlightCtrl on reading access
{
memcpy((u8 *) &FromFlightCtrl, (u8 *) SPI_RxBuffer, sizeof(FromFlightCtrl));
SPI_RxBuffer_Request = 1;
}
CheckSPIOkay++;
DebugOut.Analog[13]++;
}
else // bad checksum byte
{
DebugOut.Analog[12]++; // increase SPI chksum error counter
}
SPI_State = SPI_SYNC1; // reset state
}
else // end of packet not reached
{
rxchksum += rxdata; // update checksum
}
break;
default:
SPI_State = SPI_SYNC1;
break;
}
}
}
 
//--------------------------------------------------------------
void SPI0_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SSP_InitTypeDef SSP_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
SSP_InitTypeDef SSP_InitStructure;
 
SerialPutString("SPI init...");
SCU_APBPeriphClockConfig(__GPIO2 ,ENABLE);
SCU_APBPeriphClockConfig(__SSP0 ,ENABLE);
GPIO_DeInit(GPIO2);
//SSP0_CLK, SSP0_MOSI, SSP0_SS pins
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1 ;
GPIO_Init (GPIO2, &GPIO_InitStructure);
SerialPutString("\r\n SPI init...");
 
// SSP0_MISO pin GPIO2.6
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2 ;
GPIO_Init (GPIO2, &GPIO_InitStructure);
SSP_DeInit(SSP0);
SSP_StructInit(&SSP_InitStructure);
SSP_InitStructure.SSP_FrameFormat = SSP_FrameFormat_Motorola;
SSP_InitStructure.SSP_Mode = SSP_Mode_Slave;
SSP_InitStructure.SSP_SlaveOutput = SSP_SlaveOutput_Enable;
SSP_InitStructure.SSP_CPHA = SSP_CPHA_1Edge;
SSP_InitStructure.SSP_CPOL = SSP_CPOL_Low;
SSP_InitStructure.SSP_ClockRate = 0;
SSP_Init(SSP0, &SSP_InitStructure);
SSP_ITConfig(SSP0, SSP_IT_RxFifo | SSP_IT_TxFifo | SSP_IT_RxTimeOut, ENABLE);
SSP_Cmd(SSP0, ENABLE);
SCU_APBPeriphClockConfig(__GPIO2 ,ENABLE);
SCU_APBPeriphClockConfig(__SSP0 ,ENABLE);
 
ToFlightCtrl.Sync1 = 0x81;
ToFlightCtrl.Sync2 = 0x55;
VIC_Config(SSP0_ITLine, VIC_IRQ, 1);
VIC_ITCmd(SSP0_ITLine, ENABLE);
GPIO_DeInit(GPIO2);
//SSP0_CLK, SSP0_MOSI, SSP0_NSS pins
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; //SSP0_SCLK, SSP0_MOSI, SSP0_NSS
GPIO_Init (GPIO2, &GPIO_InitStructure);
 
SerialPutString("ok\n\r");
}
// SSP0_MISO pin GPIO2.6
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2; //SSP0_MISO
GPIO_Init (GPIO2, &GPIO_InitStructure);
 
//------------------------------------------------------
void SPI_CheckSlaveSelect(void)
{
SSP_DeInit(SSP0);
SSP_StructInit(&SSP_InitStructure);
SSP_InitStructure.SSP_FrameFormat = SSP_FrameFormat_Motorola;
SSP_InitStructure.SSP_Mode = SSP_Mode_Slave;
SSP_InitStructure.SSP_SlaveOutput = SSP_SlaveOutput_Enable;
SSP_InitStructure.SSP_CPHA = SSP_CPHA_1Edge;
SSP_InitStructure.SSP_CPOL = SSP_CPOL_Low;
SSP_InitStructure.SSP_ClockRate = 0;
 
//if (SS_PIN) { SPI_BufferIndex = 0; }
DebugOut.Analog[0] = FromFlightCtrl.IntegralNick;
DebugOut.Analog[1] = FromFlightCtrl.IntegralRoll;
DebugOut.Analog[2] = (30*FromFlightCtrl.AccNick)/108;
DebugOut.Analog[3] = (30*FromFlightCtrl.AccRoll)/108;
SSP_Init(SSP0, &SSP_InitStructure);
 
/* DebugOut.Analog[2] = FromFlightCtrl.StickNick;
DebugOut.Analog[3] = FromFlightCtrl.Command;
DebugOut.Analog[4] = FromFlightCtrl.StickRoll;
DebugOut.Analog[5] = FromFlightCtrl.StickGier;
*/
DebugOut.Analog[25] = FromFlightCtrl.GyroCompass;
SSP_ITConfig(SSP0, SSP_IT_RxFifo | SSP_IT_TxFifo | SSP_IT_RxTimeOut, ENABLE);
 
fifo_init(&CompassCalcStateFiFo, CompassCalStateQueue, sizeof(CompassCalStateQueue));
 
SSP_Cmd(SSP0, ENABLE);
// initialize the syncbytes in the tx buffer
SPI_TxBuffer[0] = SPI_TXSYNCBYTE1;
SPI_TxBuffer[1] = SPI_TXSYNCBYTE2;
// set the pointer to the checksum byte in the tx buffer
Ptr_TxChksum = (u8 *) &(((ToFlightCtrl_t *) &(SPI_TxBuffer[2]))->Chksum);
 
VIC_Config(SSP0_ITLine, VIC_IRQ, 1);
VIC_ITCmd(SSP0_ITLine, ENABLE);
 
SerialPutString("ok");
}
 
//------------------------------------------------------
void UpdateSPI_Buffer(void)
void SPI0_UpdateBuffer(void)
{
if(CompassUpdateActiv) return; // testweise deaktiviert
if(SPI_RXUpdatebufferRequest)
{
VIC_ITCmd(SSP0_ITLine, DISABLE);
if (SPI_RxBuffer_Request)
{
// avoid sending data via SPI during the update of the ToFlightCtrl structure
VIC_ITCmd(SSP0_ITLine, DISABLE); // disable SPI interrupt
 
ToFlightCtrl.CompassValue = I2C_Heading.Heading;
ToFlightCtrl.GPS_Nick = GPS_Nick;
ToFlightCtrl.GPS_Roll = GPS_Roll;
DebugOut.Analog[26] = I2C_Heading.Heading;
ToFlightCtrl.CompassHeading = I2C_Heading.Heading;
ToFlightCtrl.GPS_Nick = GPS_Stick.Nick;
ToFlightCtrl.GPS_Roll = GPS_Stick.Roll;
ToFlightCtrl.GPS_Yaw = GPS_Stick.Yaw;
// cycle spi commands
ToFlightCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++];
if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0;
 
ToFlightCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++];
if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0;
switch (ToFlightCtrl.Command)
{
case SPI_CMD_OSD_DATA:
ToFlightCtrl.Param.Byte[0] = OsdBar;
ToFlightCtrl.Param.Int[1] = OsdDistance;
break;
switch (ToFlightCtrl.Command)
{
case SPI_KALMAN:
ToFlightCtrl.Param.Byte[0] = (char) FC_Kalman_K;
ToFlightCtrl.Param.Byte[1] = (char) Kalman_MaxFusion;
ToFlightCtrl.Param.Byte[2] = (char) Kalman_MaxDrift;
break;
 
case SPI_CMD_GPS_POS:
ToFlightCtrl.Param.Long[0] = GPS_Data.Longitude;
ToFlightCtrl.Param.Long[1] = GPS_Data.Latitude;
break;
case SPI_CMD_GPS_POS:
ToFlightCtrl.Param.Long[0] = GPSData.Position.Longitude;
ToFlightCtrl.Param.Long[1] = GPSData.Position.Latitude;
break;
 
case SPI_CMD_GPS_TARGET:
ToFlightCtrl.Param.Long[0] = GPS_Data.TargetLongitude;
ToFlightCtrl.Param.Long[1] = GPS_Data.TargetLatitude;
break;
case SPI_CMD_GPS_TARGET:
if(GPS_pTargetPosition != NULL)
{
if(GPS_pTargetPosition->Status != INVALID)
{
ToFlightCtrl.Param.Long[0] = GPS_pTargetPosition->Longitude;
ToFlightCtrl.Param.Long[1] = GPS_pTargetPosition->Latitude;
}
else
{
ToFlightCtrl.Param.Long[0] = 0;
ToFlightCtrl.Param.Long[1] = 0;
}
}
else
{
ToFlightCtrl.Param.Long[0] = 0;
ToFlightCtrl.Param.Long[1] = 0;
}
break;
 
default:
break;
}
VIC_ITCmd(SSP0_ITLine, ENABLE);
default:
break;
}
VIC_ITCmd(SSP0_ITLine, ENABLE); // enable SPI interrupt
 
if (I2C_Heading.Heading <= 359)
{
}
else
{
if (I2C_Version.Hauptversion != 0xff) TimerCompassUpdate = SetDelay(1);
return;
}
 
SPI_TXUpdatebufferRequest = 0;
switch(FromFlightCtrl.Command)
{
case SPI_CMD_USER:
Parameter.User1 = FromFlightCtrl.Param.Byte[0];
Parameter.User2 = FromFlightCtrl.Param.Byte[1];
Parameter.User3 = FromFlightCtrl.Param.Byte[2];
Parameter.User4 = FromFlightCtrl.Param.Byte[3];
Parameter.User5 = FromFlightCtrl.Param.Byte[4];
Parameter.User6 = FromFlightCtrl.Param.Byte[5];
Parameter.User7 = FromFlightCtrl.Param.Byte[6];
Parameter.User8 = FromFlightCtrl.Param.Byte[7];
if(ClearMKFlags)
{
FC.MKFlags = 0;
ClearMKFlags = 0;
}
FC.MKFlags |= FromFlightCtrl.Param.Byte[8];
FC.UBat = FromFlightCtrl.Param.Byte[9];
Parameter.LowVoltageWarning = FromFlightCtrl.Param.Byte[10];
Parameter.ActiveSetting = FromFlightCtrl.Param.Byte[11];
break;
 
//----------------
#define CHK_POTI_MM(b,a,min,max) { if(a > 250) { if(a == 251) b = FC.Poti1; else if(a == 252) b = FC.Poti2; else if(a == 253) b = FC.Poti3; else if(a == 254) b = FC.Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;}
case SPI_CMD_PARAMETER1:
CHK_POTI_MM(Parameter.NaviGpsModeControl,FromFlightCtrl.Param.Byte[0],0,255);
CHK_POTI_MM(Parameter.NaviGpsGain,FromFlightCtrl.Param.Byte[1],0,255);
CHK_POTI_MM(Parameter.NaviGpsP,FromFlightCtrl.Param.Byte[2],0,255);
CHK_POTI_MM(Parameter.NaviGpsI,FromFlightCtrl.Param.Byte[3],0,255);
CHK_POTI_MM(Parameter.NaviGpsD,FromFlightCtrl.Param.Byte[4],0,255);
CHK_POTI_MM(Parameter.NaviGpsACC,FromFlightCtrl.Param.Byte[5],0,255);
Parameter.NaviGpsMinSat = FromFlightCtrl.Param.Byte[6];
Parameter.NaviStickThreshold = FromFlightCtrl.Param.Byte[7];
CHK_POTI_MM(Parameter.NaviOperatingRadius,FromFlightCtrl.Param.Byte[8],10,255);
CHK_POTI_MM(Parameter.NaviWindCorrection,FromFlightCtrl.Param.Byte[9],0,255);
CHK_POTI_MM(Parameter.NaviSpeedCompensation,FromFlightCtrl.Param.Byte[10],0,255);
CHK_POTI_MM(Parameter.NaviAngleLimitation,FromFlightCtrl.Param.Byte[11],0,255);
// DebugOut.Analog[4] = Parameter.NaviRadiusAlert;
// DebugOut.Analog[5] = Parameter.NaviWindCorrection;
// DebugOut.Analog[6] = Parameter.NaviSpeedCompensation;
break;
 
// DebugOut.Analog[11] = FromFlightCtrl.Command;
switch(FromFlightCtrl.Command)
{
case SPI_CMD_USER:
DebugOut.Analog[7]++;
Parameter_UserParam1 = FromFlightCtrl.Param.Byte[0];
Parameter_UserParam2 = FromFlightCtrl.Param.Byte[1];
Parameter_UserParam3 = FromFlightCtrl.Param.Byte[2];
Parameter_UserParam4 = FromFlightCtrl.Param.Byte[3];
Parameter_UserParam5 = FromFlightCtrl.Param.Byte[4];
Parameter_UserParam6 = FromFlightCtrl.Param.Byte[5];
Parameter_UserParam7 = FromFlightCtrl.Param.Byte[6];
Parameter_UserParam8 = FromFlightCtrl.Param.Byte[7];
if(ClearFlags) {MikroKopterFlags = 0; ClearFlags = 0;};
MikroKopterFlags |= (s32) FromFlightCtrl.Param.Byte[8];
UBat = FromFlightCtrl.Param.Byte[9];
UndervoltageLevel = FromFlightCtrl.Param.Byte[10];
ActiveSetting = FromFlightCtrl.Param.Byte[11];
//DebugOut.Analog[7] = MikroKopterFlags;
if(MikroKopterFlags & 0x004) DebugOut.Analog[8]++;
break;
case SPI_CMD_STICK:
FC.StickGas = FromFlightCtrl.Param.sByte[0];
FC.StickYaw = FromFlightCtrl.Param.sByte[1];
FC.StickRoll = FromFlightCtrl.Param.sByte[2];
FC.StickNick = FromFlightCtrl.Param.sByte[3];
FC.Poti1 = FromFlightCtrl.Param.Byte[4];
FC.Poti2 = FromFlightCtrl.Param.Byte[5];
FC.Poti3 = FromFlightCtrl.Param.Byte[6];
FC.Poti4 = FromFlightCtrl.Param.Byte[7];
FC.RC_Quality = FromFlightCtrl.Param.Byte[8];
break;
 
case SPI_CMD_PARAMETER1:
Parameter_NaviGpsModeControl = FromFlightCtrl.Param.Byte[0];
Parameter_NaviGpsGain = FromFlightCtrl.Param.Byte[1];
Parameter_NaviGpsP = FromFlightCtrl.Param.Byte[2];
Parameter_NaviGpsI = FromFlightCtrl.Param.Byte[3];
Parameter_NaviGpsD = FromFlightCtrl.Param.Byte[4];
Parameter_NaviGpsACC = FromFlightCtrl.Param.Byte[5];
Parameter_NaviGpsMinSat = FromFlightCtrl.Param.Byte[6];
Parameter_NaviStickThreshold = FromFlightCtrl.Param.Byte[7];
Parameter_RadiusAlert = FromFlightCtrl.Param.Byte[8];
break;
case SPI_CMD_STICK:
FC_StickGas = (s32) FromFlightCtrl.Param.sByte[0];
FC_StickGier = (s32) FromFlightCtrl.Param.sByte[1];
FC_StickNick = (s32) FromFlightCtrl.Param.sByte[2];
FC_StickRoll = (s32) FromFlightCtrl.Param.sByte[3];
FC_Poti1 = (s32) FromFlightCtrl.Param.Byte[4];
FC_Poti2 = (s32) FromFlightCtrl.Param.Byte[5];
FC_Poti3 = (s32) FromFlightCtrl.Param.Byte[6];
FC_Poti4 = (s32) FromFlightCtrl.Param.Byte[7];
SenderOkay = (s32) FromFlightCtrl.Param.Byte[8];
break;
case SPI_CMD_MISC:
if(CompassCalState != FromFlightCtrl.Param.Byte[0])
{ // put only new CompassCalState into queue to send via I2C
CompassCalState = FromFlightCtrl.Param.Byte[0];
fifo_put(&CompassCalcStateFiFo, CompassCalState);
}
NaviData.Altimeter = (s16) FromFlightCtrl.Param.Int[1];
break;
 
case SPI_CMD_CAL_COMPASS:
DebugOut.Analog[9]++;
CompassCalState = FromFlightCtrl.Param.Byte[0];
break;
case SPI_CMD_VERSION:
FC_Version.Major = FromFlightCtrl.Param.Byte[0];
FC_Version.Minor = FromFlightCtrl.Param.Byte[1];
FC_Version.Patch = FromFlightCtrl.Param.Byte[2];
FC_Version.Compatible = FromFlightCtrl.Param.Byte[3];
break;
 
default:
break;
}
default:
break;
}
 
// every time we got new data from the FC via SPI call the navigation routine
GPS_Navigation();
ClearMKFlags = 1;
 
//------------
I2C_WriteNickRoll.Roll = FromFlightCtrl.IntegralRoll;
I2C_WriteNickRoll.Nick = FromFlightCtrl.IntegralNick;
SPI_RxBuffer_Request = 0;
 
Navigation();
DebugOut.Analog[0] = FromFlightCtrl.IntegralNick;
DebugOut.Analog[1] = FromFlightCtrl.IntegralRoll;
DebugOut.Analog[2] = (30*FromFlightCtrl.AccNick)/108;
DebugOut.Analog[3] = (30*FromFlightCtrl.AccRoll)/108;
DebugOut.Analog[25] = FromFlightCtrl.GyroHeading;
 
SPI_RXUpdatebufferRequest = 0;
}
} // EOF if(SPI_RxBuffer_Request)
}
 
//------------------------------------------------------
void SPI0_GetFlightCtrlVersion(void)
{
u16 timeout;
u8 msg[20];
 
FC_Version.Major = 0xFF;
FC_Version.Minor = 0xFF;
FC_Version.Patch = 0xFF;
FC_Version.Compatible = 0xFF;
 
// polling FC version info for 2 second
timeout = SetDelay(2000);
do
{
SPI0_UpdateBuffer();
if (FC_Version.Major != 0xFF) break;
}while (!CheckDelay(timeout));
// if we got it
if (FC_Version.Major != 0xFF)
{
sprintf(msg, "\n\r FlightCtrl V%d.%d%c", FC_Version.Major, FC_Version.Minor, 'a'+FC_Version.Patch);
SerialPutString(msg);
sprintf(msg, " Compatible: %d", FC_Version.Compatible);
SerialPutString(msg);
}
else SerialPutString("\n\r No version information from FlightCtrl.");
}
 
 
/trunk/spi_slave.h
1,17 → 1,23
#ifndef _SPI_H
#define _SPI_H
#ifndef _SPI_SLAVE_H
#define _SPI_SLAVE_H
 
#define SPI_PROTOCOL_COMP 1
#include "fifo.h"
 
 
#define SS_PIN GPIO_ReadBit(GPIO2, GPIO_Pin_7)
 
// IMPORTANT: no syncbytes in structure !
#define SPI_CMD_USER 10
#define SPI_CMD_STICK 11
#define SPI_CMD_CAL_COMPASS 12
#define SPI_CMD_PARAMETER1 13
#define SPI_PROTOCOL_COMP 2
 
struct str_FromFlightCtrl
#define SPI_CMD_USER 10
#define SPI_CMD_STICK 11
#define SPI_CMD_MISC 12
#define SPI_CMD_PARAMETER1 13
#define SPI_CMD_VERSION 14
 
extern s32 FC_Kalman_K;
extern s32 Kalman_MaxDrift;
extern s32 Kalman_MaxFusion;
typedef struct
{
u8 Command;
s16 IntegralNick;
18,66 → 24,65
s16 IntegralRoll;
s16 AccNick;
s16 AccRoll;
s16 GyroCompass;
s16 GyroHeading;
s16 GyroNick;
s16 GyroRoll;
s16 GyroGier;
union
{ u8 Byte[12];
s8 sByte[12];
s16 Int[6];
s16 GyroYaw;
union
{
s8 sByte[12];
u8 Byte[12];
s16 Int[6];
s32 Long[3];
float Float[3];
int Long[3];
} Param;
u8 Chksum;
} __attribute__((packed));
} __attribute__((packed)) FromFlightCtrl_t;
 
#define SPI_CMD_OSD_DATA 100
#define SPI_CMD_GPS_POS 101
#define SPI_CMD_GPS_TARGET 102
#define SPI_KALMAN 103
 
struct str_ToFlightCtrl
{
unsigned char Sync1, Sync2;
unsigned char Command;
s16 GPS_Nick;
s16 GPS_Roll;
s16 GPS_Gier;
s16 CompassValue;
s16 Status;
unsigned char BeepTime;
union
{ u8 Byte[12];
s16 Int[6];
float Float[3];
int Long[3];
} Param;
unsigned char Chksum;
} __attribute__((packed));
typedef struct
{
u8 Command;
s16 GPS_Nick;
s16 GPS_Roll;
s16 GPS_Yaw;
s16 CompassHeading;
s16 Status;
u16 BeepTime;
union
{
s8 sByte[12];
u8 Byte[12];
s16 Int[6];
s32 Long[3];
float Float[3];
}Param;
u8 Chksum;
} __attribute__((packed)) ToFlightCtrl_t;
 
#define X_AXIS 1
#define Y_AXIS 2
#define Z_AXIS 3
 
 
 
struct str_MicroMag
typedef struct
{
unsigned char ReadAxis, WaitingforMeasurement;
s16 Axis[3];
s16 Heading;
} __attribute__((packed));
u8 Major;
u8 Minor;
u8 Patch;
u8 Compatible;
} __attribute__((packed)) SPI_Version_t;
 
extern volatile FromFlightCtrl_t FromFlightCtrl;
extern volatile ToFlightCtrl_t ToFlightCtrl;
extern SPI_Version_t FC_Version;
extern fifo_t CompassCalcStateFiFo;
extern u32 CheckSPIOkay;
 
extern struct str_FromFlightCtrl FromFlightCtrl;
extern struct str_ToFlightCtrl ToFlightCtrl;
void SPI0_Init(void);
void SPI0_GetFlightCtrlVersion(void);
void SPI0_UpdateBuffer(void);
 
extern volatile struct str_MicroMag MicroMag;
 
extern s16 GPS_Nick, GPS_Roll, CompassValue;
 
extern void SPI0_Init(void);
extern void SPI_CheckSlaveSelect(void);
extern void UpdateSPI_Buffer(void);
#endif
#endif //_SPI_SLAVE_H
/trunk/ssc.c
126,6 → 126,7
// enable APB clock for SPI1
SCU_APBPeriphClockConfig(__SSP1 ,ENABLE);
// configure P5.4 -> SD-CS as an output pin
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
133,6 → 134,7
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt1;
GPIO_Init (GPIO5, &GPIO_InitStructure);
// configure P3.4 -> SCK1 and P3.6 -> MOSI1 as an output pin
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
140,6 → 142,7
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2;
GPIO_Init (GPIO3, &GPIO_InitStructure);
// configure P3.5 <- MISO1 as an input pin
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
156,7 → 159,7
// Set Baud Rate (Prescaler)
// bit rate is BRCLK/SSP_ClockPrescaler/(1+SSP_ClockRate))
// With MSCLK = 48MHz/2 = BRCLK we get for the SPICLK = 24Mhz / 8 / (1+5) = 500 kHz
SSP_InitStructure.SSP_ClockRate = 14; //5
SSP_InitStructure.SSP_ClockRate = 5; //5
SSP_InitStructure.SSP_ClockPrescaler = 8;
SSP_Init(SSP1, &SSP_InitStructure);
SSC_Disable();
/trunk/ssc.h
2,7 → 2,6
#define _SSC_H
 
 
#include "91x_lib.h"
//________________________________________________________________________________________________________________________________________
//
// Functions needed for accessing the sdcard low level via SPI.
11,13 → 10,13
 
#define SD_SWITCH !(GPIO_ReadBit(GPIO5, GPIO_Pin_3))
 
extern void SSC_Init(void);
extern void SSC_Deinit(void);
extern u8 SSC_GetChar (void);
extern void SSC_PutChar (u8);
extern void SSC_Enable(void);
extern void SSC_Disable(void);
extern void SSC_ClearRxFifo(void);
void SSC_Init(void);
void SSC_Deinit(void);
u8 SSC_GetChar (void);
void SSC_PutChar (u8);
void SSC_Enable(void);
void SSC_Disable(void);
void SSC_ClearRxFifo(void);
 
 
#endif //_SSC_H
/trunk/timer.c
7,14 → 7,14
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
25,21 → 25,21
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
52,21 → 52,26
// + 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.
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include "main.h"
#include "91x_lib.h"
#include "timer.h"
#include "uart1.h"
 
u32 CountMilliseconds;
DateTime_t SystemTime;
 
 
//----------------------------------------------------------------------------------------------------
void TIM1_IRQHandler(void)
{
TIM1->OC1R += 200; // Timerfreq is 200kHz, generate an interrupt every 1ms
CountMilliseconds++;
//if (GPIO_ReadBit(GPIO6, GPIO_Pin_3)) GPIO_WriteBit(GPIO6, GPIO_Pin_3, Bit_RESET); else GPIO_WriteBit(GPIO6, GPIO_Pin_3, Bit_SET);
TIM_ClearFlag(TIM1, TIM_FLAG_OC1);
{
TIM_ClearFlag(TIM1, TIM_FLAG_OC1); // clear irq pending bit
TIM1->OC1R += 200; // Timerfreq is 200kHz, generate an interrupt every 1ms
CountMilliseconds++;
//if (GPIO_ReadBit(GPIO6, GPIO_Pin_3)) GPIO_WriteBit(GPIO6, GPIO_Pin_3, Bit_RESET); else GPIO_WriteBit(GPIO6, GPIO_Pin_3, Bit_SET);
// write any value to VIC0 Vector address register
VIC0->VAR = 0xFF;
}
 
//----------------------------------------------------------------------------------------------------
74,51 → 79,59
//----------------------------------------------------------------------------------------------------
void TIMER1_Init(void)
{
TIM_InitTypeDef TIM_InitStructure;
SerialPutString("Timer init...");
#define TIM1_FREQ 200000
// TimerOCR set in IntHandler
TIM_InitTypeDef TIM_InitStructure;
 
SCU_APBPeriphClockConfig(__TIM01, ENABLE);
TIM_StructInit(&TIM_InitStructure);
TIM_InitStructure.TIM_Mode = TIM_OCM_CHANNEL_1;
TIM_InitStructure.TIM_OC1_Modes = TIM_TIMING;
TIM_InitStructure.TIM_Clock_Source = TIM_CLK_APB;
TIM_InitStructure.TIM_Prescaler = (SCU_GetPCLKFreqValue() * 1000) / TIM1_FREQ; // klappt nur bis 48 MHz !
TIM_Init (TIM1, &TIM_InitStructure);
SerialPutString("Timer init...");
 
TIM_ITConfig(TIM1, TIM_IT_OC1, ENABLE);
TIM_CounterCmd(TIM1, TIM_START);
#define TIM1_FREQ 200000 // 200kHz
// TimerOCR set in IntHandler
 
VIC_Config(TIM1_ITLine, VIC_IRQ, 5);
VIC_ITCmd(TIM1_ITLine, ENABLE);
SCU_APBPeriphClockConfig(__TIM01, ENABLE);
 
// DebugOut.Analog[27] = SCU_GetPCLKFreqValue()/1000;
TIM_StructInit(&TIM_InitStructure);
TIM_InitStructure.TIM_Mode = TIM_OCM_CHANNEL_1;
TIM_InitStructure.TIM_OC1_Modes = TIM_TIMING;
TIM_InitStructure.TIM_Clock_Source = TIM_CLK_APB;
TIM_InitStructure.TIM_Prescaler = (SCU_GetPCLKFreqValue() * 1000) / TIM1_FREQ; // is only valid up to 48 MHz !
TIM_Init (TIM1, &TIM_InitStructure);
 
CountMilliseconds = 0;
SerialPutString("ok\n\r");
TIM_ITConfig(TIM1, TIM_IT_OC1, ENABLE);
TIM_CounterCmd(TIM1, TIM_START);
 
VIC_Config(TIM1_ITLine, VIC_IRQ, 5);
VIC_ITCmd(TIM1_ITLine, ENABLE);
SystemTime.Year = 0;
SystemTime.Month = 0;
SystemTime.Day = 0;
SystemTime.Hour = 0;
SystemTime.Min = 0;
SystemTime.Sec = 0;
SystemTime.mSec = 0;
SystemTime.Valid = 0;
 
CountMilliseconds = 0;
 
SerialPutString("ok\n\r");
 
}
 
// -----------------------------------------------------------------------
u32 SetDelay (u32 t)
{
return(CountMilliseconds + t -1);
return(CountMilliseconds + t -1);
}
 
// -----------------------------------------------------------------------
u8 CheckDelay(u32 t)
{
return(((t - CountMilliseconds)& 0x80000000) >> 27);
return(((t - CountMilliseconds)& 0x80000000) >> 27);
}
 
// -----------------------------------------------------------------------
void Delay_ms(u32 w)
{
u32 akt;
akt = SetDelay(w);
while (!CheckDelay(akt));
static u32 akt;
akt = SetDelay(w);
while (!CheckDelay(akt));
}
/trunk/timer.h
1,6 → 1,20
#ifndef _TIMER_H
#define _TIMER_H
#define _TIMER_H
 
 
typedef struct{
u16 Year;
u8 Month;
u8 Day;
u8 Hour;
u8 Min;
u8 Sec;
u16 mSec;
u8 Valid;
} DateTime_t;
 
extern DateTime_t SystemTime;
 
extern u32 CountMilliseconds;
 
void TIMER1_Init(void);
7,4 → 21,7
u32 SetDelay (u32 t);
u8 CheckDelay(u32 t);
void Delay_ms(u32 w);
 
 
 
#endif
/trunk/uart0.c
0,0 → 1,304
/*#######################################################################################*/
/* !!! THIS IS NOT FREE SOFTWARE !!! */
/*#######################################################################################*/
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) 2008 Ingo Busker, Holger Buss
// + Nur für den privaten Gebrauch
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
// + eindeutig als Ursprung verlinkt werden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include "91x_lib.h"
#include "uart1.h"
#include "ubx.h"
#include <stdio.h>
 
//------------------------------------------------------------------------------------
// global variables
 
 
// UART0 MUXER
typedef enum
{
UART0_UNDEF,
UART0_MK3MAG,
UART0_MKGPS
} UART0_MuxerState_t;
 
UART0_MuxerState_t UART0_Muxer = UART0_UNDEF;
u16 Uart0Baudrate = BAUD_RATE;
u16 Uart0MK3MagBaudrate = BAUD_RATE;
 
//------------------------------------------------------------------------------------
// functions
 
/********************************************************/
/* Connect RXD & TXD to GPS */
/********************************************************/
void UART0_Connect_to_MKGPS(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
 
UART0_Muxer = UART0_UNDEF;
 
SCU_APBPeriphClockConfig(__GPIO6, ENABLE); // Enable the GPIO6 Clock
// unmap UART0 from Compass
// set port pin 5.1 (serial data from compass) to input and disconnect from IP
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
GPIO_Init(GPIO5, &GPIO_InitStructure);
// set port pin 5.0 (serial data to compass) to input
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
GPIO_Init(GPIO5, &GPIO_InitStructure);
// map UART0 to GPS
// set port pin 6.6 (serial data from gps) to input and connect to IP
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; //UART0_RxD
GPIO_Init(GPIO6, &GPIO_InitStructure);
// set port pin 6.7 (serial data to gps) to output
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt3; //UART0_TX
GPIO_Init(GPIO6, &GPIO_InitStructure);
UART0_Muxer = UART0_MKGPS;
}
 
/********************************************************/
/* Connect RXD & TXD to MK3MAG */
/********************************************************/
void UART0_Connect_to_MK3MAG(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
 
UART0_Muxer = UART0_UNDEF;
 
SCU_APBPeriphClockConfig(__GPIO5, ENABLE);
// unmap UART0 from GPS
// set port pin 6.6 (serial data from gps) to input and disconnect from IP
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
GPIO_Init(GPIO6, &GPIO_InitStructure);
// set port pin 6.7 (serial data to gps) to input
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
GPIO_Init(GPIO6, &GPIO_InitStructure);
 
// map UART0 to Compass
// set port pin 5.1 (serial data from compass) to input and connect to IP
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; //UART0_RxD
GPIO_Init(GPIO5, &GPIO_InitStructure);
// set port pin 5.0 (serial data to compass) to output
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt3; //UART0_TX
GPIO_Init(GPIO5, &GPIO_InitStructure);
 
UART0_Muxer = UART0_MK3MAG;
}
 
/********************************************************/
/* Initialize UART0 */
/********************************************************/
void UART0_Init(void)
{
UART_InitTypeDef UART_InitStructure;
SerialPutString("\r\n UART0 init...");
 
SCU_APBPeriphClockConfig(__UART0, ENABLE); // Enable the UART0 Clock
 
Uart0Baudrate = BAUD_RATE + ((BAUD_RATE * 2)/100); // MK3Mag baudrate is a litlle bit higher...
 
/* UART0 configured as follow:
- Word Length = 8 Bits
- One Stop Bit
- No parity
- BaudRate = 57600 baud
- Hardware flow control Disabled
- Receive and transmit enabled
- Receive and transmit FIFOs are Disabled
*/
UART_StructInit(&UART_InitStructure);
UART_InitStructure.UART_WordLength = UART_WordLength_8D;
UART_InitStructure.UART_StopBits = UART_StopBits_1;
UART_InitStructure.UART_Parity = UART_Parity_No ;
UART_InitStructure.UART_BaudRate = Uart0Baudrate;
UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
UART_InitStructure.UART_Mode = UART_Mode_Tx_Rx;
UART_InitStructure.UART_FIFO = UART_FIFO_Enable;
UART_InitStructure.UART_TxFIFOLevel = UART_FIFOLevel_1_2;
UART_InitStructure.UART_RxFIFOLevel = UART_FIFOLevel_1_2;
 
UART_DeInit(UART0); // reset uart 0 to default
UART_Init(UART0, &UART_InitStructure); // initialize uart 0
 
// enable uart 0 interrupts selective
UART_ITConfig(UART0, UART_IT_Receive | UART_IT_ReceiveTimeOut /*| UART_IT_FrameError*/, ENABLE);
UART_Cmd(UART0, ENABLE); // enable uart 0
// configure the uart 0 interupt line as an IRQ with priority 10 (0 is highest)
VIC_Config(UART0_ITLine, VIC_IRQ, 10);
// enable the uart 0 IRQ
VIC_ITCmd(UART0_ITLine, ENABLE);
UART0_Connect_to_MKGPS();
SerialPutString("ok");
}
 
/********************************************************/
/* UART0 Interrupt Handler */
/********************************************************/
void UART0_IRQHandler(void)
{
u8 c;
/*
static u8 frame_error_cnt = 0;
// use frame error to adjust baudrate for MK3MAG
if((UART_GetITStatus(UART0, UART_IT_FrameError) == SET))
{
u8 msg[20];
frame_error_cnt++;
if (frame_error_cnt == 200)
{
frame_error_cnt = 0;
VIC_ITCmd(UART0_ITLine, DISABLE);
Uart0MK3MagBaudrate +=100;
if (Uart0MK3MagBaudrate > (BAUD_RATE+1000)) Uart0MK3MagBaudrate = BAUD_RATE;
Uart0Baudrate = Uart0MK3MagBaudrate;
SerialPutString(" adjusting UART0 baudrate to");
sprintf(msg, " %d baud...", Uart0MK3MagBaudrate); SerialPutString(msg);
while(UART_GetFlagStatus(UART0, UART_FLAG_RxFIFOEmpty) != SET)
{
c = UART_ReceiveData(UART0);
}
UART_ClearITPendingBit(UART0, UART_IT_FrameError); // clear frame error interrupt flag
UART0_Init();
return;
}
}*/
// if receive irq or receive timeout irq has occured
if((UART_GetITStatus(UART0, UART_IT_Receive) != RESET) || (UART_GetITStatus(UART0, UART_IT_ReceiveTimeOut) != RESET) )
{
UART_ClearITPendingBit(UART0, UART_IT_Receive); // clear receive interrupt flag
UART_ClearITPendingBit(UART0, UART_IT_ReceiveTimeOut); // clear receive timeout interrupt flag
 
// if debug UART is UART0
if (DebugUART == UART0)
{ // forward received data to the UART1 tx buffer
while(UART_GetFlagStatus(UART0, UART_FLAG_RxFIFOEmpty) != SET)
{
// wait for space in the tx buffer of the UART1
while(UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) == SET) {};
// move the byte from the rx buffer of UART0 to the tx buffer of UART1
UART_SendData(UART1, UART_ReceiveData(UART0));
}
}
else // UART0 is not the DebugUART (normal operation)
{
// repeat until no byte is in the RxFIFO
while (UART_GetFlagStatus(UART0, UART_FLAG_RxFIFOEmpty) != SET)
{
c = UART_ReceiveData(UART0); // get byte from rx fifo
switch(UART0_Muxer)
{
case UART0_MKGPS:
UBX_Parser(c); // if connected to GPS forward byte to ubx parser
break;
case UART0_MK3MAG:
// ignore any byte send from MK3MAG
break;
case UART0_UNDEF:
default:
// ignore the byte from unknown source
break;
} // eof switch(UART0_Muxer)
} // eof while
} // eof UART0 is not the DebugUART
} // eof receive irq or receive timeout irq
}
/trunk/uart0.h
0,0 → 1,9
#ifndef __UART0_H
#define __UART0_H
 
void UART0_Init (void);
void UART0_Connect_to_MKGPS(void);
void UART0_Connect_to_MK3MAG(void);
 
#endif //__UART0_H
 
/trunk/uart1.c
0,0 → 1,755
/*#######################################################################################*/
/* !!! THIS IS NOT FREE SOFTWARE !!! */
/*#######################################################################################*/
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) 2008 Ingo Busker, Holger Buss
// + Nur für den privaten Gebrauch
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
// + eindeutig als Ursprung verlinkt werden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
 
#include "91x_lib.h"
#include "ramfunc.h"
#include "menu.h"
#include "printf_P.h"
#include "GPS.h"
#include "i2c.h"
#include "uart0.h"
#include "uart1.h"
#include "uart2.h"
#include "timer.h"
#include "usb.h"
#include "main.h"
#include "waypoints.h"
#include "GPS.h"
 
// slave addresses
#define FC_ADDRESS 1
#define NC_ADDRESS 2
#define MK3MAG_ADDRESS 3
 
#define FALSE 0
#define TRUE 1
 
u8 Request_SendFollowMe = FALSE;
u8 Request_VerInfo = FALSE;
u8 Request_ExternalControl = FALSE;
u8 Request_Display = FALSE;
u8 Request_Display1 = FALSE;
u8 Request_DebugData = FALSE;
u8 Request_DebugLabel = 255;
u8 Request_ChannelOnly = FALSE;
u8 Request_NaviData = FALSE;
u8 Request_ErrorMessage = FALSE;
u8 Request_NewWaypoint = FALSE;
 
u8 DisplayLine = 0;
 
UART_TypeDef *DebugUART = UART1;
 
volatile u8 txd_buffer[TXD_BUFFER_LEN];
volatile u8 rxd_buffer_locked = FALSE;
volatile u8 rxd_buffer[RXD_BUFFER_LEN];
volatile u8 txd_complete = TRUE;
volatile u8 ReceivedBytes = 0;
volatile u8 CntCrcError = 0;
volatile u8 *pRxData = NULL;
volatile u8 RxDataLen = 0;
 
u8 text[100];
 
u8 PcAccess = 100;
u8 MotorTest[4] = {0,0,0,0};
u8 ConfirmFrame = 0;
 
DebugOut_t DebugOut;
ExternControl_t ExternControl;
UART_VersionInfo_t UART_VersionInfo;
NaviData_t NaviData;
Waypoint_t FollowMe;
 
u32 DebugData_Timer;
u32 DebugData_Interval = 1000; // in 1ms
u32 NaviData_Timer;
u32 NaviData_Interval = 1000; // in 1ms
 
 
 
static u16 ptr_txd_buffer = 0;
 
const u8 ANALOG_LABEL[32][16] =
{
//1234567890123456
"AngleNick ", //0
"AngleRoll ",
"AccNick ",
"AccRoll ",
" ",
" ", //5
" ",
" ",
" ",
" ",
" ", //10
"GPS Data ",
"SPI Error ",
"SPI Okay ",
"I2C Error ",
"I2C Okay ", //15
" ",// "FC_Kalman_K ",
"ACC_Speed_N ",
"ACC_Speed_E ",
" ",// "GPS ACC ",
" ",// "MAXDrift ", //20
"N_Speed ",
"E_Speed ",
" ",// "KalmDist_N ",
" ",// "KalmDist_E ",
"GyroHeading ",//25
"CompassHeading ",
"Distance N ",
"Distance E ",
"GPS_Nick ",
"GPS_Roll ", //30
"Used_Sats "
};
 
 
/********************************************************/
/* Initialization the UART1 */
/********************************************************/
void UART1_Init (void)
{
GPIO_InitTypeDef GPIO_InitStructure;
UART_InitTypeDef UART_InitStructure;
 
SCU_APBPeriphClockConfig(__UART1, ENABLE); // Enable the UART1 Clock
SCU_APBPeriphClockConfig(__GPIO3, ENABLE); // Enable the GPIO3 Clock
 
/*Configure UART1_Rx pin GPIO3.2*/
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; // UART1_RxD
GPIO_Init(GPIO3, &GPIO_InitStructure);
 
/*Configure UART1_Tx pin GPIO3.3*/
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2; // UART1_TX
GPIO_Init(GPIO3, &GPIO_InitStructure);
 
/* UART1 configured as follow:
- Word Length = 8 Bits
- One Stop Bit
- No parity
- BaudRate = 57600 baud
- Hardware flow control Disabled
- Receive and transmit enabled
- Receive and transmit FIFOs are Disabled
*/
UART_StructInit(&UART_InitStructure);
UART_InitStructure.UART_WordLength = UART_WordLength_8D;
UART_InitStructure.UART_StopBits = UART_StopBits_1;
UART_InitStructure.UART_Parity = UART_Parity_No ;
UART_InitStructure.UART_BaudRate = BAUD_RATE;
UART_InitStructure. UART_HardwareFlowControl = UART_HardwareFlowControl_None;
UART_InitStructure.UART_Mode = UART_Mode_Tx_Rx;
UART_InitStructure.UART_FIFO = UART_FIFO_Enable;
UART_InitStructure.UART_TxFIFOLevel = UART_FIFOLevel_1_2;
UART_InitStructure.UART_RxFIFOLevel = UART_FIFOLevel_1_2;
 
UART_DeInit(UART1); // reset uart 1 to default
UART_Init(UART1, &UART_InitStructure); // initialize uart 1
// enable uart 1 interrupts selective
UART_ITConfig(UART1, UART_IT_Receive | UART_IT_ReceiveTimeOut, ENABLE);
UART_Cmd(UART1, ENABLE); // enable uart 1
// configure the uart 1 interupt line as an IRQ with priority 4 (0 is highest)
VIC_Config(UART1_ITLine, VIC_IRQ, 4);
// enable the uart 1 IRQ
VIC_ITCmd(UART1_ITLine, ENABLE);
// initialize the debug timer
DebugData_Timer = SetDelay(DebugData_Interval);
NaviData_Timer = SetDelay(NaviData_Interval+500);
// unlock rxd_buffer
rxd_buffer_locked = FALSE;
pRxData = NULL;
RxDataLen = 0;
// no bytes to send
txd_complete = TRUE;
// Fill Version Info Structure
UART_VersionInfo.SWMajor = VERSION_MAJOR;
UART_VersionInfo.SWMinor = VERSION_MINOR;
UART_VersionInfo.SWPatch = VERSION_PATCH;
UART_VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR;
UART_VersionInfo.ProtoMinor = VERSION_SERIAL_MINOR;
 
SerialPutString("\r\nUART1 init...ok");
}
 
 
/****************************************************************/
/* USART1 receiver ISR */
/****************************************************************/
void UART1_IRQHandler(void)
{
static u16 crc;
static u8 ptr_rxd_buffer = 0;
static u8 crc1, crc2;
static u8 abortState = 0;
u8 c;
 
if((UART_GetITStatus(UART1, UART_IT_Receive) != RESET) || (UART_GetITStatus(UART1, UART_IT_ReceiveTimeOut) != RESET) )
{
// clear the pending bits
UART_ClearITPendingBit(UART1, UART_IT_Receive);
UART_ClearITPendingBit(UART1, UART_IT_ReceiveTimeOut);
// if debug UART is not UART1
if (DebugUART != UART1)
{ // forward received data to the debug UART tx buffer
while(UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET)
{
// wait for space in the tx buffer of the DebugUART
while(UART_GetFlagStatus(DebugUART, UART_FLAG_TxFIFOFull) == SET) {};
// move the byte from the rx buffer of UART1 to the tx buffer of DebugUART
c = UART_ReceiveData(UART1);
 
// check for abort condition (ESC ESC 0x55 0xAA 0x00)
switch (abortState)
{
case 0: if (c == 27) abortState++;
break;
case 1: if (c == 27) abortState++; else abortState = 0;
break;
case 2: if (c == 0x55) abortState++; else abortState = 0;
break;
case 3: if (c == 0xAA) abortState++; else abortState = 0;
break;
case 4: if (c == 0x00)
{
DebugUART = UART1;
UART0_Connect_to_MKGPS();
}
abortState = 0;
break;
}
 
if (DebugUART != UART1) UART_SendData(DebugUART, c);
}
}
else // DebugUART == UART1 (normal operation)
{
while ((UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET) && (!rxd_buffer_locked))
{ // some byes in the fifo and rxd buffer not locked
// get byte from fifo
c = UART_ReceiveData(UART1);
if((ptr_rxd_buffer == 0) && (c == '#')) // if rxd buffer is empty and syncronisation character is received
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy 1st byte to buffer
crc = c; // init crc
}
#if 0
else if (ptr_rxd_buffer == 1) // handle address
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
crc += c; // update crc
}
#endif
else if (ptr_rxd_buffer < RXD_BUFFER_LEN) // rxd buffer not full
{
if (c != '\r') // no termination character received
{
rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
crc += c; // update crc
}
else // termination character received
{
// the last 2 bytes are no subject for checksum calculation
// they are the checksum itself
crc -= rxd_buffer[ptr_rxd_buffer-2];
crc -= rxd_buffer[ptr_rxd_buffer-1];
// calculate checksum from transmitted data
crc %= 4096;
crc1 = '=' + crc / 64;
crc2 = '=' + crc % 64;
// compare checksum to transmitted checksum bytes
if((crc1 == rxd_buffer[ptr_rxd_buffer-2]) && (crc2 == rxd_buffer[ptr_rxd_buffer-1]))
{ // checksum valid
rxd_buffer_locked = TRUE; // lock the rxd buffer
ReceivedBytes = ptr_rxd_buffer + 1; // store number of received bytes
rxd_buffer[ptr_rxd_buffer] = '\r'; // set termination character
// if 2nd byte is an 'R' start bootloader
if(rxd_buffer[2] == 'R')
{
PowerOff();
VIC_DeInit();
Execute_Bootloader(); // Reset-Commando - Bootloader starten
}
} // eof checksum valid
else
{ // checksum invalid
rxd_buffer_locked = FALSE; // unlock rxd buffer
} // eof checksum invalid
ptr_rxd_buffer = 0; // reset rxd buffer pointer
} // eof termination character received
} // rxd buffer not full
else // rxd buffer overrun
{
ptr_rxd_buffer = 0; // reset rxd buffer pointer
rxd_buffer_locked = FALSE; // unlock rxd buffer
} // eof rxd buffer overrrun
} // some byes in the fifo and rxd buffer not locked
} // eof DebugUart = UART1
}
}
 
/**************************************************************/
/* Transmit tx buffer via debug uart */
/**************************************************************/
void UART1_Transmit(void)
{
u8 tmp_tx;
// if something has to be send and the txd fifo is not full
if((!txd_complete) && (UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) == RESET))
{
tmp_tx = txd_buffer[ptr_txd_buffer]; // read byte from txd buffer
// if terminating character or end of txd buffer reached
if((tmp_tx == '\r') || (ptr_txd_buffer == TXD_BUFFER_LEN))
{
ptr_txd_buffer = 0; // reset txd buffer pointer
txd_complete = TRUE;// set complete flag
}
UART_SendData(UART1, tmp_tx); // put character to txd fifo
// set pointer to next byte
ptr_txd_buffer++;
}
}
 
/**************************************************************/
/* Add CRC and initiate transmission via debug uart */
/**************************************************************/
void AddCRC(u16 datalen)
{
u16 tmpCRC = 0, i;
for(i = 0; i < datalen; i++)
{
tmpCRC += txd_buffer[i];
}
tmpCRC %= 4096;
txd_buffer[i++] = '=' + tmpCRC / 64;
txd_buffer[i++] = '=' + tmpCRC % 64;
txd_buffer[i++] = '\r';
 
ptr_txd_buffer = 0;
txd_complete = FALSE;
UART_SendData(UART1,txd_buffer[ptr_txd_buffer++]); // send first byte, to be continued in the txd irq
}
 
 
 
/**************************************************************/
/* Code output data */
/**************************************************************/
void SendOutData(u8 cmd, u8 Address, u8 numofbuffers , ...) //u8 *data, u8 len, ....
{
va_list ap;
 
u16 pt = 0;
u8 a,b,c;
u8 ptr = 0;
 
u8* pdata = NULL;
int len = 0;
 
txd_buffer[pt++] = '#'; // Start character
txd_buffer[pt++] = 'a' + Address; // Address (a=0; b=1,...)
txd_buffer[pt++] = cmd; // Command
 
va_start(ap, numofbuffers);
if(numofbuffers)
{
pdata = va_arg(ap, u8*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
while(len)
{
if(len)
{
a = pdata[ptr++];
len--;
if((!len) && numofbuffers) // try to jump to next buffer
{
pdata = va_arg(ap, u8*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
}
else a = 0;
if(len)
{
b = pdata[ptr++];
len--;
if((!len) && numofbuffers) // try to jump to next buffer
{
pdata = va_arg(ap, u8*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
}
else b = 0;
if(len)
{
c = pdata[ptr++];
len--;
if((!len) && numofbuffers) // try to jump to next buffer
{
pdata = va_arg(ap, u8*);
len = va_arg(ap, int);
ptr = 0;
numofbuffers--;
}
}
else c = 0;
txd_buffer[pt++] = '=' + (a >> 2);
txd_buffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
txd_buffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
txd_buffer[pt++] = '=' + ( c & 0x3f);
}
va_end(ap);
AddCRC(pt); // add checksum after data block and initates the transmission
}
 
 
/**************************************************************/
/* Decode data */
/**************************************************************/
void Decode64(void)
{
u8 a,b,c,d;
u8 x,y,z;
u8 ptrIn = 3; // start with first data byte in rx buffer
u8 ptrOut = 3;
u8 len = ReceivedBytes - 6; // must be a multiple of 4 (3 bytes at begin and 3 bytes at end are no payload )
while(len)
{
a = rxd_buffer[ptrIn++] - '=';
b = rxd_buffer[ptrIn++] - '=';
c = rxd_buffer[ptrIn++] - '=';
d = rxd_buffer[ptrIn++] - '=';
//if(ptrIn > ReceivedBytes - 3) break;
 
x = (a << 2) | (b >> 4);
y = ((b & 0x0f) << 4) | (c >> 2);
z = ((c & 0x03) << 6) | d;
 
if(len--) rxd_buffer[ptrOut++] = x; else break;
if(len--) rxd_buffer[ptrOut++] = y; else break;
if(len--) rxd_buffer[ptrOut++] = z; else break;
}
pRxData = &rxd_buffer[3];
RxDataLen = ptrOut - 3;
}
 
/**************************************************************/
/* Process incomming data from debug uart */
/**************************************************************/
void UART1_ProcessRxData(void)
{
// if data in the rxd buffer are not locked immediately return
if((!rxd_buffer_locked) || (DebugUART != UART1) ) return;
Waypoint_t * pWaypoint = NULL;
 
 
 
PcAccess = 255;
Decode64(); // decode data block in rxd buffer
switch(rxd_buffer[1] - 'a') // check for Slave Address
{
case NC_ADDRESS: // own Slave Address
 
switch(rxd_buffer[2])
{
case 'e': // request for the text of the error status
Request_ErrorMessage = TRUE;
break;
 
case 'o': // request for navigation information
NaviData_Interval = (u32) pRxData[0] * 10;
if(NaviData_Interval > 0) Request_NaviData = TRUE;
break;
 
case 's':// new target position
pWaypoint = (Waypoint_t*)&pRxData[0];
BeepTime = 300;
if(pWaypoint->Position.Status == NEWDATA)
{
WPList_Clear(); // empty WPList
WPList_Append(pWaypoint);
GPS_pWaypoint = WPList_Begin();
}
break;
 
case 'u': // redirect debug uart
switch(pRxData[0])
{
case UART_FLIGHTCTRL:
UART2_Init(); // initialize UART2 to FC pins
DebugUART = UART2;
break;
case UART_MK3MAG:
if(FC.MKFlags & MKFLAG_MOTOR_RUN) break; // not if the motors are running
UART0_Connect_to_MK3MAG(); // mux UART0 to MK3MAG pins
GPSData.Status = INVALID;
DebugUART = UART0;
break;
case UART_MKGPS:
if(FC.MKFlags & MKFLAG_MOTOR_RUN) break; // not if the motors are running
UART0_Connect_to_MKGPS(); // connect UART0 to MKGPS pins
GPSData.Status = INVALID;
DebugUART = UART0;
break;
}
break;
 
case 'w':// new PCPosition for GPSTargetList
pWaypoint = (Waypoint_t*)&pRxData[0];
if(pWaypoint->Position.Status == INVALID)
{ // clear WP List
WPList_Clear();
GPS_pWaypoint = WPList_Begin();
//SerialPutString("\r\nClear WP List\r\n");
}
else if (pWaypoint->Position.Status == NEWDATA)
{ // app current WP to the list
WPList_Append(pWaypoint);
BeepTime = 500;
//SerialPutString("\r\nAdd WP to List\r\n");
}
Request_NewWaypoint = TRUE;
break;
 
default:
// unsupported command recieved
break;
} // case NC_ADDRESS
 
 
default: // and any other Slave Address
 
switch(rxd_buffer[2]) // check CmdID
{
case 'a':// request for the labels of the analog debug outputs
Request_DebugLabel = pRxData[0];
if(Request_DebugLabel > 31) Request_DebugLabel = 31;
break;
 
case 'b': // submit extern control
memcpy(&ExternControl, (u8*)&pRxData[0], sizeof(ExternControl));
ConfirmFrame = ExternControl.Frame;
break;
 
case 'd': // request for debug data;
DebugData_Interval = (u32) pRxData[0] * 10;
if(DebugData_Interval > 0) Request_DebugData = TRUE;
break;
 
case 'g':// request for external control data
Request_ExternalControl = TRUE;
break;
 
case 'h':// reqest for display line
RemoteKeys |= pRxData[0];
if(RemoteKeys != 0) DisplayLine = 0;
Request_Display = TRUE;
break;
 
case 'l':// reqest for display columns
MenuItem = pRxData[0];
Request_Display1 = TRUE;
break;
case 'v': // request for version info
Request_VerInfo = TRUE;
break;
default:
// unsupported command recieved
break;
}
break; // default:
}
// unlock the rxd buffer after processing
pRxData = NULL;
RxDataLen = 0;
rxd_buffer_locked = FALSE;
}
 
 
/*****************************************************/
/* Send a character */
/*****************************************************/
s16 uart_putchar (char c)
{
if (c == '\n') uart_putchar('\r');
// wait until txd fifo is not full
while (UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) != RESET);
// transmit byte
UART_SendData(UART1, c);
return (0);
}
 
/*****************************************************/
/* Send a string to the debug uart */
/*****************************************************/
void SerialPutString(u8 *s)
{
if(s == NULL) return;
while (*s != '\0' && DebugUART == UART1)
{
uart_putchar(*s);
s ++;
}
}
 
 
 
/**************************************************************/
/* Send the answers to incomming commands at the debug uart */
/**************************************************************/
void UART1_TransmitTxData(void)
{
if(!txd_complete || (DebugUART != UART1) ) return;
 
if(Request_DebugLabel != 0xFF)
{
SendOutData('A', NC_ADDRESS, 2, &Request_DebugLabel, sizeof(Request_DebugLabel), (u8 *) ANALOG_LABEL[Request_DebugLabel], 16);
Request_DebugLabel = 0xFF;
}
if(ConfirmFrame && txd_complete)
{
SendOutData('B', NC_ADDRESS, 1, &ConfirmFrame, sizeof(ConfirmFrame));
ConfirmFrame = 0;
}
if( ((DebugData_Interval>0 && CheckDelay(DebugData_Timer)) || Request_DebugData) && txd_complete)
{
SendOutData('D', NC_ADDRESS, 1,(u8 *)&DebugOut, sizeof(DebugOut));
DebugData_Timer = SetDelay(DebugData_Interval);
Request_DebugData = FALSE;
}
if(Request_ExternalControl && txd_complete)
{
SendOutData('G', NC_ADDRESS, 1, (u8 *)&ExternControl, sizeof(ExternControl));
Request_ExternalControl = FALSE;
}
if(Request_Display && txd_complete)
{
LCD_PrintMenu();
SendOutData('H', NC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), (u8*)&DisplayBuff[DisplayLine * 20], 20);
DisplayLine++;
if(DisplayLine >= 4) DisplayLine = 0;
Request_Display = FALSE;
}
if(Request_Display1 && txd_complete)
{
LCD_PrintMenu();
SendOutData('L', NC_ADDRESS, 3, (u8*)&MenuItem, sizeof(MenuItem), (u8*)&MaxMenuItem, sizeof(MaxMenuItem),(u8*)DisplayBuff, sizeof(DisplayBuff));
Request_Display1 = FALSE;
}
if(Request_VerInfo && txd_complete)
{
SendOutData('V', NC_ADDRESS,1, (u8 *)&UART_VersionInfo, sizeof(UART_VersionInfo));
Request_VerInfo = FALSE;
}
if(( (NaviData_Interval && CheckDelay(NaviData_Timer) ) || Request_NaviData) && txd_complete)
{
NaviData.Errorcode = ErrorCode;
SendOutData('O', NC_ADDRESS,1, (u8 *)&NaviData, sizeof(NaviData));
NaviData_Timer = SetDelay(NaviData_Interval);
Request_NaviData = FALSE;
}
if(Request_ErrorMessage && txd_complete)
{
SendOutData('E', NC_ADDRESS, 1, (u8 *)&ErrorMSG, sizeof(ErrorMSG));
Request_ErrorMessage = FALSE;
}
if(Request_SendFollowMe && txd_complete && (GPSData.NumOfSats >= 4)) // sending for "Follow me"
{
GPS_CopyPosition(&(GPSData.Position),&(FollowMe.Position));
FollowMe.Position.Status = NEWDATA;
FollowMe.Heading = -1;
FollowMe.ToleranceRadius = 1;
FollowMe.HoldTime = 60;
FollowMe.Event_Flag = 0;
FollowMe.reserve[0] = 0; // reserve
FollowMe.reserve[1] = 0; // reserve
FollowMe.reserve[2] = 0; // reserve
FollowMe.reserve[3] = 0; // reserve
SendOutData('s', NC_ADDRESS, 1, (u8 *)&FollowMe, sizeof(FollowMe));
Request_SendFollowMe = FALSE;
}
 
if(Request_NewWaypoint && txd_complete)
{
u8 WPNumber = WPList_GetCount();
SendOutData('W', NC_ADDRESS, 1, &WPNumber, sizeof(WPNumber));
Request_NewWaypoint = FALSE;
}
 
}
 
/trunk/uart1.h
0,0 → 1,111
#ifndef _UART1_H
#define _UART1_H
 
#define UART_FLIGHTCTRL 0
#define UART_MK3MAG 1
#define UART_MKGPS 2
 
#define TXD_BUFFER_LEN 150
#define RXD_BUFFER_LEN 150
#define BAUD_RATE 57600 //Baud Rate for the serial interfaces
 
#include "ubx.h"
 
typedef struct
{
u8 Digital[2];
u16 Analog[32]; // Debugwerte
} __attribute__((packed)) DebugOut_t;
 
extern DebugOut_t DebugOut;
 
typedef struct
{
u8 Digital[2];
u8 RemoteButtons;
s8 Nick;
s8 Roll;
s8 Yaw;
u8 Gas;
s8 Height;
u8 free;
u8 Frame;
u8 Config;
} __attribute__((packed)) ExternControl_t;
 
extern ExternControl_t ExternControl;
 
typedef struct
{
s16 Nick;
s16 Roll;
s16 Compass; // angle between north and head of the MK
} __attribute__((packed)) Attitude_t;
 
typedef struct
{
s16 Distance; // distance to target in cm
s16 Bearing; // course to target in deg
} __attribute__((packed)) GPS_PosDev_t;
 
typedef struct
{
GPS_Pos_t CurrentPosition; // see ubx.h for details
GPS_Pos_t TargetPosition;
GPS_PosDev_t TargetPositionDeviation;
GPS_Pos_t HomePosition;
GPS_PosDev_t HomePositionDeviation;
u8 WaypointIndex; // index of current waypoints running from 0 to WaypointNumber-1
u8 WaypointNumber; // number of stored waypoints
u8 SatsInUse; // no of satellites used for position solution
s16 Altimeter; // hight according to air pressure
s16 Variometer; // climb(+) and sink(-) rate
u16 FlyingTime; // in seconds
u8 UBat; // Battery Voltage in 0.1 Volts
u16 GroundSpeed; // speed over ground in cm/s (2D)
s16 Heading; // current flight direction in deg as angle to north
s16 CompassHeading; // current compass value
s8 AngleNick; // current Nick angle in 1°
s8 AngleRoll; // current Rick angle in 1°
u8 RC_Quality; // RC_Quality
u8 MKFlags; // Flags from FC
u8 NCFlags; // Flags from NC
u8 Errorcode; // 0 --> okay
u8 Reserve[8]; // for future use
} __attribute__((packed)) NaviData_t;
 
extern NaviData_t NaviData;
extern u8 Request_NaviData;
 
#define NC_FLAG_FREE 1
#define NC_FLAG_PH 2
#define NC_FLAG_CH 4
#define NC_FLAG_RANGE_LIMIT 8
 
typedef struct
{
u8 SWMajor;
u8 SWMinor;
u8 ProtoMajor;
u8 ProtoMinor;
u8 SWPatch;
u8 Reserved[5];
} __attribute__((packed)) UART_VersionInfo_t;
 
extern volatile u8 rxd_buffer[RXD_BUFFER_LEN];
extern volatile u8 ReceivedBytes;
extern volatile u8 rxd_buffer_locked;
extern UART_TypeDef *DebugUART;
 
 
void UART1_Init(void);
void UART1_Transmit(void);
void UART1_TransmitTxData(void);
void UART1_ProcessRxData(void);
 
s16 uart_putchar (char c);
void SerialPutString(u8 *s);
extern u8 text[100];
extern u32 Request_NaviData_Intervall; // in 1ms
extern u8 Request_SendFollowMe;
#endif //_UART1_H
/trunk/uart2.c
0,0 → 1,192
/*#######################################################################################*/
/* !!! THIS IS NOT FREE SOFTWARE !!! */
/*#######################################################################################*/
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) 2008 Ingo Busker, Holger Buss
// + Nur für den privaten Gebrauch
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
// + eindeutig als Ursprung verlinkt werden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//#include <stdio.h>
#include "91x_lib.h"
#include "uart1.h"
 
/********************************************************/
/* Initialize UART2 */
/********************************************************/
void UART2_Init(void)
{
UART_InitTypeDef UART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
 
SerialPutString("\r\n UART2 init...");
 
SCU_APBPeriphClockConfig(__UART2, ENABLE); // Enable the UART2 Clock
 
SCU_APBPeriphClockConfig(__GPIO5, ENABLE); // Enable the GPIO5 Clock
/*Configure UART2_Rx pin GPIO5.2*/
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; // UART2_RxD
GPIO_Init(GPIO5, &GPIO_InitStructure);
 
SCU_APBPeriphClockConfig(__GPIO3, ENABLE); // Enable the GPIO3 Clock
/*Configure UART2_Tx pin GPIO3.0*/
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2; // UART2_TX
GPIO_Init(GPIO3, &GPIO_InitStructure);
 
 
/* UART2 configured as follow:
- Word Length = 8 Bits
- One Stop Bit
- No parity
- BaudRate = 57600 baud
- Hardware flow control Disabled
- Receive and transmit enabled
- Receive and transmit FIFOs are Disabled
*/
UART_StructInit(&UART_InitStructure);
UART_InitStructure.UART_WordLength = UART_WordLength_8D;
UART_InitStructure.UART_StopBits = UART_StopBits_1;
UART_InitStructure.UART_Parity = UART_Parity_No ;
UART_InitStructure.UART_BaudRate = BAUD_RATE;
UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
UART_InitStructure.UART_Mode = UART_Mode_Tx_Rx;
UART_InitStructure.UART_FIFO = UART_FIFO_Enable;
UART_InitStructure.UART_TxFIFOLevel = UART_FIFOLevel_1_2;
UART_InitStructure.UART_RxFIFOLevel = UART_FIFOLevel_1_2;
 
UART_DeInit(UART2); // reset uart 2 to default
UART_Init(UART2, &UART_InitStructure); // initialize uart 2
 
// enable uart 2 interrupts selective
UART_ITConfig(UART2, UART_IT_Receive | UART_IT_ReceiveTimeOut, ENABLE);
UART_Cmd(UART2, ENABLE); // enable uart 2
// configure the uart 2 interupt line as an IRQ with priority 9 (0 is highest)
VIC_Config(UART2_ITLine, VIC_IRQ, 9);
// enable the uart 2 IRQ
VIC_ITCmd(UART2_ITLine, ENABLE);
 
SerialPutString("ok");
}
 
 
void UART2_Deinit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
 
SerialPutString("\r\n UART2 deinit...");
VIC_ITCmd(UART2_ITLine, DISABLE); // disable the uart 2 IRQ
UART_Cmd(UART2, DISABLE); // disable uart 2
UART_DeInit(UART2); // reset uart 0 to default
 
SCU_APBPeriphClockConfig(__UART2, DISABLE); // disable the UART2 Clock
 
SCU_APBPeriphClockConfig(__GPIO5, ENABLE);
// unmap UART2 from FC
// set port pin 5.2 (serial data from FC) to input and disconnect from IP
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
GPIO_Init(GPIO5, &GPIO_InitStructure);
 
SCU_APBPeriphClockConfig(__GPIO3, ENABLE);
// set port pin 3.0 (serial data to FC) to input and disconnect from IP
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
GPIO_Init(GPIO3, &GPIO_InitStructure);
 
SerialPutString("ok");
}
 
/********************************************************/
/* UART2 Interrupt Handler */
/********************************************************/
void UART2_IRQHandler(void)
{
// if receive irq or receive timeout irq has occured
if((UART_GetITStatus(UART2, UART_IT_Receive) != RESET) || (UART_GetITStatus(UART2, UART_IT_ReceiveTimeOut) != RESET) )
{
UART_ClearITPendingBit(UART2, UART_IT_Receive); // clear receive interrupt flag
UART_ClearITPendingBit(UART2, UART_IT_ReceiveTimeOut); // clear receive timeout interrupt flag
 
// if debug UART is UART2
if (DebugUART == UART2)
{ // forward received data to the UART1 tx buffer
while(UART_GetFlagStatus(UART2, UART_FLAG_RxFIFOEmpty) != SET)
{
// wait for space in the tx buffer of the UART1
while(UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) == SET) {};
// move the byte from the rx buffer of UART2 to the tx buffer of UART1
UART_SendData(UART1, UART_ReceiveData(UART2));
}
}
else
{
// ignore serial data from the FC
while(UART_GetFlagStatus(UART2, UART_FLAG_RxFIFOEmpty) != SET)
UART_ReceiveData(UART2);
}
} // eof receive irq or receive timeout irq
}
/trunk/uart2.h
0,0 → 1,7
#ifndef __UART2_H
#define __UART2_H
 
void UART2_Init (void);
void UART2_Deinit (void);
 
#endif //__UART2_H
/trunk/ubx.c
0,0 → 1,464
/*#######################################################################################*/
/* !!! THIS IS NOT FREE SOFTWARE !!! */
/*#######################################################################################*/
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) 2008 Ingo Busker, Holger Buss
// + Nur für den privaten Gebrauch
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
// + eindeutig als Ursprung verlinkt werden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include "91x_lib.h"
#include "uart1.h"
#include "ubx.h"
#include "led.h"
#include "timer.h"
 
// ------------------------------------------------------------------------------------------------
// defines
 
#define DAYS_FROM_JAN01YEAR0001_TO_JAN6_1980 722819 // the year 0 does not exist!
#define DAYS_PER_YEAR 365
#define DAYS_PER_LEAPYEAR 366
#define DAYS_PER_4YEARS 1461 //((3 * DAYS_PER_YEAR) + DAYS_PER_LEAPYEAR) // years dividable by 4 are leap years
#define DAYS_PER_100YEARS 36524 //((25 * DAYS_PER_4YEARS) - 1) // years dividable by 100 are no leap years
#define DAYS_PER_400YEARS 146097 //((4 * DAYS_PER_100YEARS) + 1L) // but years dividable by 400 are leap years
#define SECONDS_PER_MINUTE 60
#define MINUTES_PER_HOUR 60
#define HOURS_PER_DAY 24
#define DAYS_PER_WEEK 7
#define SECONDS_PER_HOUR 3600 //(SECONDS_PER_MINUTE * MINUTES_PER_HOUR)
#define SECONDS_PER_DAY 86400 //(SECONDS_PER_HOUR * HOURS_PER_DAY)
#define SECONDS_PER_WEEK 604800 //(SECONDS_PER_DAY * DAYS_PER_WEEK)
 
// days per month in normal and leap years
const u32 Leap[ 13 ] = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 };
const u32 Normal[ 13 ] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };
 
#define LEAP_SECONDS_FROM_1980 13
 
// message sync bytes
#define UBX_SYNC1_CHAR 0xB5
#define UBX_SYNC2_CHAR 0x62
// protocoll identifier
#define UBX_CLASS_NAV 0x01
// message id
#define UBX_ID_POSLLH 0x02
#define UBX_ID_SOL 0x06
#define UBX_ID_VELNED 0x12
 
// ------------------------------------------------------------------------------------------------
// typedefs
 
 
// ubx parser state
typedef enum
{
UBXSTATE_IDLE,
UBXSTATE_SYNC1,
UBXSTATE_SYNC2,
UBXSTATE_CLASS,
UBXSTATE_LEN1,
UBXSTATE_LEN2,
UBXSTATE_DATA,
UBXSTATE_CKA,
UBXSTATE_CKB
} ubxState_t;
 
typedef struct
{
u32 itow; // ms GPS Millisecond Time of Week
s32 frac; // ns remainder of rounded ms above
s16 week; // GPS week
u8 GPSfix; // GPSfix Type, range 0..6
u8 Flags; // Navigation Status Flags
s32 ECEF_X; // cm ECEF X coordinate
s32 ECEF_Y; // cm ECEF Y coordinate
s32 ECEF_Z; // cm ECEF Z coordinate
u32 PAcc; // cm 3D Position Accuracy Estimate
s32 ECEFVX; // cm/s ECEF X velocity
s32 ECEFVY; // cm/s ECEF Y velocity
s32 ECEFVZ; // cm/s ECEF Z velocity
u32 SAcc; // cm/s Speed Accuracy Estimate
u16 PDOP; // 0.01 Position DOP
u8 res1; // reserved
u8 numSV; // Number of SVs used in navigation solution
u32 res2; // reserved
Status_t Status; // invalid/newdata/processed
} __attribute__((packed)) ubx_nav_sol_t;
 
 
typedef struct
{
u32 itow; // ms GPS Millisecond Time of Week
s32 VEL_N; // cm/s NED north velocity
s32 VEL_E; // cm/s NED east velocity
s32 VEL_D; // cm/s NED down velocity
u32 Speed; // cm/s Speed (3-D)
u32 GSpeed; // cm/s Ground Speed (2-D)
s32 Heading; // 1e-05 deg Heading 2-D
u32 SAcc; // cm/s Speed Accuracy Estimate
u32 CAcc; // deg Course / Heading Accuracy Estimate
Status_t Status; // invalid/newdata/processed
} __attribute__((packed)) ubx_nav_velned_t;
 
typedef struct
{
u32 itow; // ms GPS Millisecond Time of Week
s32 LON; // 1e-07 deg Longitude
s32 LAT; // 1e-07 deg Latitude
s32 HEIGHT; // mm Height above Ellipsoid
s32 HMSL; // mm Height above mean sea level
u32 Hacc; // mm Horizontal Accuracy Estimate
u32 Vacc; // mm Vertical Accuracy Estimate
Status_t Status; // invalid/newdata/processed
} __attribute__((packed)) ubx_nav_posllh_t;
 
 
 
//------------------------------------------------------------------------------------
// global variables
 
// local buffers for the incomming ubx messages
volatile ubx_nav_sol_t UbxSol = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, INVALID};
volatile ubx_nav_posllh_t UbxPosLlh = {0,0,0,0,0,0,0, INVALID};
volatile ubx_nav_velned_t UbxVelNed = {0,0,0,0,0,0,0,0,0, INVALID};
 
u32 CheckGPSOkay = 0;
 
// shared buffer
gps_data_t GPSData = {{0,0,0,INVALID},0,0,0,0,0,0,0, INVALID};
DateTime_t GPSDateTime = {0,0,0,0,0,0,0, INVALID};
 
 
//------------------------------------------------------------------------------------
// functions
 
u8 IsLeapYear(u16 year)
{
if((year%400 == 0) || ( (year%4 == 0) && (year%100 != 0) ) ) return 1;
else return 0;
}
/********************************************************/
/* Calculates the UTC Time from the GPS week and tow */
/********************************************************/
void SetGPSTime(DateTime_t * pTimeStruct)
{
u32 Days, Seconds, Week;
u16 YearPart;
u32 * MonthDayTab = 0;
u8 i;
 
 
 
// if GPS data show valid time data
if((UbxSol.Status != INVALID) && (UbxSol.Flags & FLAG_WKNSET) && (UbxSol.Flags & FLAG_TOWSET) )
{
Seconds = UbxSol.itow / 1000L;
Week = (u32)UbxSol.week;
// correct leap seconds since 1980
if(Seconds < LEAP_SECONDS_FROM_1980)
{
Week--;
Seconds = SECONDS_PER_WEEK - LEAP_SECONDS_FROM_1980 + Seconds;
}
else Seconds -= LEAP_SECONDS_FROM_1980;
 
Days = DAYS_FROM_JAN01YEAR0001_TO_JAN6_1980;
Days += (Week * DAYS_PER_WEEK);
Days += Seconds / SECONDS_PER_DAY; // seperate days from GPS seconds of week
 
pTimeStruct->Year = 1;
YearPart = (u16)(Days / DAYS_PER_400YEARS);
pTimeStruct->Year += YearPart * 400;
Days = Days % DAYS_PER_400YEARS;
YearPart = (u16)(Days / DAYS_PER_100YEARS);
pTimeStruct->Year += YearPart * 100;
Days = Days % DAYS_PER_100YEARS;
YearPart = (u16)(Days / DAYS_PER_4YEARS);
pTimeStruct->Year += YearPart * 4;
Days = Days % DAYS_PER_4YEARS;
if(Days < (3* DAYS_PER_YEAR)) YearPart = (u16)(Days / DAYS_PER_YEAR);
else YearPart = 3;
pTimeStruct->Year += YearPart;
// calculate remaining days of year
Days -= (u32)(YearPart * DAYS_PER_YEAR);
Days += 1;
// check if current year is a leap year
if(IsLeapYear(pTimeStruct->Year)) MonthDayTab = (u32*)Leap;
else MonthDayTab = (u32*)Normal;
// seperate month and day from days of year
for ( i = 0; i < 12; i++ )
{
if ( (MonthDayTab[i]< Days) && (Days <= MonthDayTab[i+1]) )
{
pTimeStruct->Month = i+1;
pTimeStruct->Day = Days - MonthDayTab[i];
i = 12;
}
}
Seconds = Seconds % SECONDS_PER_DAY; // remaining seconds of current day
pTimeStruct->Hour = (u8)(Seconds / SECONDS_PER_HOUR);
Seconds = Seconds % SECONDS_PER_HOUR; // remaining seconds of current hour
pTimeStruct->Min = (u8)(Seconds / SECONDS_PER_MINUTE);
Seconds = Seconds % SECONDS_PER_MINUTE; // remaining seconds of current minute
pTimeStruct->Sec = (u8)(Seconds);
pTimeStruct->mSec = (u16)(UbxSol.itow % 1000L);
pTimeStruct->Valid = 1;
}
else
{
pTimeStruct->Valid = 0;
}
}
 
 
 
/********************************************************/
/* Initialize UBX Parser */
/********************************************************/
void UBX_Init(void)
{
// mark msg buffers invalid
UbxSol.Status = INVALID;
UbxPosLlh.Status = INVALID;
UbxVelNed.Status = INVALID;
GPSData.Status = INVALID;
}
 
/********************************************************/
/* Upate GPS data stcructure */
/********************************************************/
void Update_GPSData (void)
{
static u32 Ubx_Timeout = 0;
static u8 Msg_Count = 0;
 
// the timeout is used to detect the delay between two message sets
// and is used for synchronisation so that always a set is collected
// that belongs together
// _______NAVSOL|POSLLH|VELNED|___________________NAVSOL|POSLLH|VELNED|_____________
// | 8ms | 8ms | 184 ms | | |
// msg_count: 0 1 2 0 1 2
 
if(CheckDelay(Ubx_Timeout)) Msg_Count = 0;
else Msg_Count++;
Ubx_Timeout = SetDelay(100); // reset ubx msg timeout
 
// if a new set of ubx messages was collected
if((Msg_Count >= 2))
{ // if set is complete
if((UbxSol.Status == NEWDATA) && (UbxPosLlh.Status == NEWDATA) && (UbxVelNed.Status == NEWDATA))
{
CheckGPSOkay++;
DebugOut.Analog[11]++;
// update GPS data only if the status is INVALID or PROCESSED and the last ubx message was received within less than 100 ms
if(GPSData.Status != NEWDATA) // if last data were processed
{ // wait for new data at all neccesary ubx messages
GPSData.Status = INVALID;
// NAV SOL
GPSData.Flags = UbxSol.Flags;
GPSData.NumOfSats = UbxSol.numSV;
GPSData.SatFix = UbxSol.GPSfix;
GPSData.Position_Accuracy = UbxSol.PAcc;
GPSData.Speed_Accuracy = UbxSol.SAcc;
SetGPSTime(&SystemTime); // update system time
// NAV POSLLH
GPSData.Position.Status = INVALID;
GPSData.Position.Longitude = UbxPosLlh.LON;
GPSData.Position.Latitude = UbxPosLlh.LAT;
GPSData.Position.Altitude = UbxPosLlh.HMSL;
GPSData.Position.Status = NEWDATA;
// NAV VELNED
GPSData.Speed_East = UbxVelNed.VEL_E;
GPSData.Speed_North = UbxVelNed.VEL_N;
GPSData.Speed_Top = -UbxVelNed.VEL_D;
GPSData.Speed_Ground = UbxVelNed.GSpeed;
GPSData.Heading = UbxVelNed.Heading;
 
GPSData.Status = NEWDATA; // new data available
} // EOF if(GPSData.Status != NEWDATA)
} // EOF all ubx messages received
// set state to collect new data
UbxSol.Status = PROCESSED; // ready for new data
UbxPosLlh.Status = PROCESSED; // ready for new data
UbxVelNed.Status = PROCESSED; // ready for new data
}
}
 
 
/********************************************************/
/* UBX Parser */
/********************************************************/
void UBX_Parser(u8 c)
{
static ubxState_t ubxState = UBXSTATE_IDLE;
static u16 msglen;
static u8 cka, ckb;
static u8 *ubxP, *ubxEp, *ubxSp; // pointers to data currently transfered
 
 
//state machine
switch (ubxState) // ubx message parser
{
case UBXSTATE_IDLE: // check 1st sync byte
if (c == UBX_SYNC1_CHAR) ubxState = UBXSTATE_SYNC1;
else ubxState = UBXSTATE_IDLE; // out of synchronization
break;
 
case UBXSTATE_SYNC1: // check 2nd sync byte
if (c == UBX_SYNC2_CHAR) ubxState = UBXSTATE_SYNC2;
else ubxState = UBXSTATE_IDLE; // out of synchronization
break;
 
case UBXSTATE_SYNC2: // check msg class to be NAV
if (c == UBX_CLASS_NAV) ubxState = UBXSTATE_CLASS;
else ubxState = UBXSTATE_IDLE; // unsupported message class
break;
 
case UBXSTATE_CLASS: // check message identifier
switch(c)
{
case UBX_ID_POSLLH: // geodetic position
ubxP = (u8 *)&UbxPosLlh; // data start pointer
ubxEp = (u8 *)(&UbxPosLlh + 1); // data end pointer
ubxSp = (u8 *)&UbxPosLlh.Status; // status pointer
break;
 
case UBX_ID_SOL: // navigation solution
ubxP = (u8 *)&UbxSol; // data start pointer
ubxEp = (u8 *)(&UbxSol + 1); // data end pointer
ubxSp = (u8 *)&UbxSol.Status; // status pointer
break;
 
case UBX_ID_VELNED: // velocity vector in tangent plane
ubxP = (u8 *)&UbxVelNed; // data start pointer
ubxEp = (u8 *)(&UbxVelNed + 1); // data end pointer
ubxSp = (u8 *)&UbxVelNed.Status; // status pointer
break;
 
default: // unsupported identifier
ubxState = UBXSTATE_IDLE;
break;
}
if (ubxState != UBXSTATE_IDLE)
{
ubxState = UBXSTATE_LEN1;
cka = UBX_CLASS_NAV + c;
ckb = UBX_CLASS_NAV + cka;
}
break;
 
case UBXSTATE_LEN1: // 1st message length byte
msglen = (u16)c; // lowbyte first
cka += c;
ckb += cka;
ubxState = UBXSTATE_LEN2;
break;
 
case UBXSTATE_LEN2: // 2nd message length byte
msglen += ((u16)c)<<8; // high byte last
cka += c;
ckb += cka;
// if the old data are not processed so far then break parsing now
// to avoid writing new data in ISR during reading by another function
if ( *ubxSp == NEWDATA )
{
ubxState = UBXSTATE_IDLE;
Update_GPSData(); //update GPS info respectively
}
else // data invalid or allready processd
{
*ubxSp = INVALID; // mark invalid during buffer filling
ubxState = UBXSTATE_DATA;
}
break;
 
case UBXSTATE_DATA: // collecting data
if (ubxP < ubxEp)
{
*ubxP++ = c; // copy curent data byte if any space is left
cka += c;
ckb += cka;
if (--msglen == 0) ubxState = UBXSTATE_CKA; // switch to next state if all data was read
}
else // rx buffer overrun
{
ubxState = UBXSTATE_IDLE;
}
break;
 
case UBXSTATE_CKA:
if (c == cka) ubxState = UBXSTATE_CKB;
else
{
*ubxSp = INVALID;
ubxState = UBXSTATE_IDLE;
}
break;
 
case UBXSTATE_CKB:
if (c == ckb)
{
*ubxSp = NEWDATA; // new data are valid
Update_GPSData(); //update GPS info respectively
}
else
{ // if checksum not match then set data invalid
*ubxSp = INVALID;
}
ubxState = UBXSTATE_IDLE; // ready to parse new data
break;
 
default: // unknown ubx state
ubxState = UBXSTATE_IDLE;
break;
 
}
}
/trunk/ubx.h
0,0 → 1,58
#ifndef __UBX_H
#define __UBX_H
 
// Satfix types for GPSData.SatFix
#define SATFIX_NONE 0x00
#define SATFIX_DEADRECKOING 0x01
#define SATFIX_2D 0x02
#define SATFIX_3D 0x03
#define SATFIX_GPS_DEADRECKOING 0x04
#define SATFIX_TIMEONLY 0x05
// Flags for interpretation of the GPSData.Flags
#define FLAG_GPSFIXOK 0x01 // (i.e. within DOP & ACC Masks)
#define FLAG_DIFFSOLN 0x02 // (is DGPS used)
#define FLAG_WKNSET 0x04 // (is Week Number valid)
#define FLAG_TOWSET 0x08 // (is Time of Week valid)
 
typedef enum
{
INVALID = 0,
NEWDATA = 1,
PROCESSED = 2
} Status_t;
 
typedef struct
{
s32 Longitude; // in 1E-7 deg
s32 Latitude; // in 1E-7 deg
s32 Altitude; // in mm
Status_t Status;// validity of data
} __attribute__((packed)) GPS_Pos_t;
 
 
typedef struct
{
GPS_Pos_t Position; // Lat/Lon/Alt
u8 Flags; // Status Flags
u8 NumOfSats; // number of satelites
u8 SatFix; // type of satfix
u32 Position_Accuracy; // in cm 3d position accuracy
s32 Speed_North; // in cm/s
s32 Speed_East; // in cm/s
s32 Speed_Top; // in cm/s
u32 Speed_Ground; // 2D ground speed in cm/s
s32 Heading; // 1e-05 deg Heading 2-D (curent flight direction)
u32 Speed_Accuracy; // in cm/s 3d velocity accuracy
Status_t Status; // status of data
} __attribute__((packed)) gps_data_t;
 
// The data are valid if the GPSData.Status is NEWDATA or PROCESSED.
// To achieve new data after reading the GPSData.Status should be set to PROCESSED.
extern gps_data_t GPSData;
extern u32 CheckGPSOkay;
 
void UBX_Init(void);
void UBX_Parser(u8 c);
 
 
#endif // __UBX_H
/trunk/usb.c
54,99 → 54,104
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// + POSSIBILITY OF SUCH DAMAGE.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include "main.h"
 
#include "91x_lib.h"
#include "uart1.h"
#include "usb.h"
//-----------------------------------------------------------------
void USB_ConfigInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
SerialPutString("USB init...");
//USB clock = MCLK= 48MHz
SCU_USBCLKConfig(SCU_USBCLK_MCLK);
//Enable USB clock
SCU_AHBPeriphClockConfig(__USB,ENABLE);
SCU_AHBPeriphReset(__USB,DISABLE);
SCU_AHBPeriphClockConfig(__USB48M,ENABLE);
SerialPutString("\r\n USB init...");
#ifdef MCLK96MHZ
//USB clock = MCLK/2 = 48MHz
SCU_USBCLKConfig(SCU_USBCLK_MCLK2);
#else
//USB clock = MCLK = 48MHz
SCU_USBCLKConfig(SCU_USBCLK_MCLK);
#endif
//Enable USB clock
SCU_AHBPeriphClockConfig(__USB,ENABLE);
SCU_AHBPeriphReset(__USB,DISABLE);
SCU_AHBPeriphClockConfig(__USB48M,ENABLE);
 
//Configure GPIO0 (D+ Pull-Up on P0.1)
SCU_APBPeriphClockConfig(__GPIO0 ,ENABLE);
SCU_APBPeriphReset(__GPIO0,DISABLE);
//Configure GPIO0 (D+ Pull-Up on P0.1)
SCU_APBPeriphClockConfig(__GPIO0 ,ENABLE);
SCU_APBPeriphReset(__GPIO0,DISABLE);
 
// GPIO_DeInit(GPIO0);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
GPIO_InitStructure.GPIO_IPConnected=GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate=GPIO_OutputAlt1;
GPIO_Init (GPIO0, &GPIO_InitStructure);
// GPIO_DeInit(P0.1);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
GPIO_InitStructure.GPIO_IPConnected=GPIO_IPConnected_Enable;
GPIO_InitStructure.GPIO_Alternate=GPIO_OutputAlt1;
GPIO_Init (GPIO0, &GPIO_InitStructure);
 
PowerOff();
Virtual_Com_Port_Reset();
PowerOff();
Virtual_Com_Port_Reset();
VIC_Config(USBLP_ITLine, VIC_IRQ, 2);
VIC_ITCmd(USBLP_ITLine, ENABLE);
VIC_Config(USBLP_ITLine, VIC_IRQ, 2);
VIC_ITCmd(USBLP_ITLine, ENABLE);
USB_Init();
USB_Init();
SerialPutString("ok\n\r");
SerialPutString("ok");
}
 
//-----------------------------------------------------------------
void USB_Cable_Config (FunctionalState NewState)
{
if (NewState == ENABLE)
GPIO_WriteBit(GPIO0, GPIO_Pin_1, Bit_RESET);
else
GPIO_WriteBit(GPIO0, GPIO_Pin_1, Bit_SET);
if (NewState == ENABLE)
GPIO_WriteBit(GPIO0, GPIO_Pin_1, Bit_RESET);
else
GPIO_WriteBit(GPIO0, GPIO_Pin_1, Bit_SET);
}
 
//-----------------------------------------------------------------
void USB_Send_String(u8 *StrPtr)
{
u8 i = 0;
u16 timeout = 0;
 
while (StrPtr[i++] !=0){}
while (_GetEPTxStatus(ENDP1) != EP_TX_NAK){ if (timeout++ > 60000) return;}
UserToPMABufferCopy(StrPtr, ENDP1_TXADDR, ++i);
SetEPTxCount(ENDP1,i);
SetEPTxValid(ENDP1);
u8 i = 0;
u16 timeout = 0;
while (StrPtr[i++] !=0){} // get string len
while (_GetEPTxStatus(ENDP1) != EP_TX_NAK){ if (timeout++ > 60000) return;}
UserToPMABufferCopy(StrPtr, ENDP1_TXADDR, ++i); // copy string to usb buffer
SetEPTxCount(ENDP1,i);
SetEPTxValid(ENDP1);
}
 
//-----------------------------------------------------------------
void USB_Send_Char(u8 ch)
{
u16 timeout = 0;
while (_GetEPTxStatus(ENDP1) != EP_TX_NAK){ if (timeout++ > 60000) return;}
UserToPMABufferCopy(&ch, ENDP1_TXADDR, 2);
SetEPTxCount(ENDP1,2);
SetEPTxValid(ENDP1);
}
u16 timeout = 0;
while (_GetEPTxStatus(ENDP1) != EP_TX_NAK){ if (timeout++ > 60000) return;}
UserToPMABufferCopy(&ch, ENDP1_TXADDR, 2);
SetEPTxCount(ENDP1,2);
SetEPTxValid(ENDP1);
}
//-----------------------------------------------------------------
void USB_Send_Data(u8 *data, u16 count)
{
u16 timeout = 0;
u8 i;
 
count++;
for (i=0;i< (count/64)+1;i++)
{
while (_GetEPTxStatus(ENDP1) != EP_TX_NAK);
if (i < (count/64))
{ UserToPMABufferCopy(&data[i*64], ENDP1_TXADDR, 64);
SetEPTxCount(ENDP1,64);
u8 i;
count++;
for (i=0;i< (count/64)+1;i++)
{
while (_GetEPTxStatus(ENDP1) != EP_TX_NAK);
if (i < (count/64))
{
UserToPMABufferCopy(&data[i*64], ENDP1_TXADDR, 64);
SetEPTxCount(ENDP1,64);
}
else
{
UserToPMABufferCopy(&data[i*64], ENDP1_TXADDR, count % 64);
SetEPTxCount(ENDP1, count % 64);
}
SetEPTxValid(ENDP1);
}
else
{ UserToPMABufferCopy(&data[i*64], ENDP1_TXADDR, count % 64);
SetEPTxCount(ENDP1, count % 64);
}
SetEPTxValid(ENDP1);
}
}
 
/trunk/usb.h
1,5 → 1,5
#ifndef _USB_H
#define _USB_H
#define _USB_H
 
#include "usb_lib.h"
#include "usb_conf.h"
10,10 → 10,10
extern u32 USB_BufferRxCount;
extern u8 USB_BufferRx[];
 
extern void USB_ConfigInit(void);
extern void USB_Cable_Config (FunctionalState NewState);
extern void USB_Send_String(u8 *StrPtr);
extern void USB_Send_Char(u8 ch);
extern void USB_Send_Data(u8 *data, u16 count);
void USB_ConfigInit(void);
void USB_Cable_Config (FunctionalState NewState);
void USB_Send_String(u8 *StrPtr);
void USB_Send_Char(u8 ch);
void USB_Send_Data(u8 *data, u16 count);
 
#endif
/trunk/usb_desc.c
15,12 → 15,13
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usb_lib.h"
#include "usb_desc.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Extern variables ----------------------------------------------------------*/
/* Extern variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/* USB Standard Device Descriptor */
/trunk/usb_endp.c
15,7 → 15,12
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include <stdio.h>
#include "91x_lib.h"
#include "uart1.h"
#include "usb_lib.h"
#include "usb_desc.h"
 
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
35,14 → 40,15
*******************************************************************************/
void EP3_OUT_Callback(void)
{
//USB_BufferRxCount= GetEPRxCount(ENDP3);
AnzahlEmpfangsBytes = GetEPRxCount(ENDP3);
//PMAToUserBufferCopy(USB_BufferRx, ENDP3_RXADDR, AnzahlEmpfangsBytes );
PMAToUserBufferCopy((u8*) RxdBuffer, ENDP3_RXADDR, AnzahlEmpfangsBytes);
NeuerDatensatzEmpfangen = 1;
//USB_BufferRx[AnzahlEmpfangsBytes] = 0;
USB_BufferRxCount= GetEPRxCount(ENDP3);
//ReceivedBytes = GetEPRxCount(ENDP3);
PMAToUserBufferCopy(USB_BufferRx, ENDP3_RXADDR, USB_BufferRxCount );
//PMAToUserBufferCopy((u8*) rxd_buffer, ENDP3_RXADDR, ReceivedBytes);
//rxd_buffer_locked = 1;
USB_BufferRx[USB_BufferRxCount] = 0; // terminate buffer contents
SetEPRxValid(ENDP3);
sprintf(text,"USB (%d): %s\n\r", AnzahlEmpfangsBytes,RxdBuffer ); SerialPutString(text);
sprintf(text,"USB (%ld): %s\n\r", USB_BufferRxCount, USB_BufferRx);
SerialPutString(text);
// USB_Send_Data(RxdBuffer, AnzahlEmpfangsBytes);
// USB_Send_String("Rx.\0");
/trunk/usb_istr.c
15,7 → 15,8
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usb_lib.h"
#include "usb_pwr.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/trunk/usb_prop.c
16,7 → 16,10
*******************************************************************************/
 
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usb_lib.h"
#include "usb_desc.h"
#include "usb_pwr.h"
#include "usb_prop.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/trunk/usb_pwr.c
15,7 → 15,9
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usb_lib.h"
#include "hw_config.h"
#include "usb_pwr.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/trunk/waypoints.c
0,0 → 1,130
/*#######################################################################################*/
/* !!! THIS IS NOT FREE SOFTWARE !!! */
/*#######################################################################################*/
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Copyright (c) 2008 Ingo Busker, Holger Buss
// + Nur für den privaten Gebrauch
// + FOR NON COMMERCIAL USE ONLY
// + www.MikroKopter.com
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
// + bzgl. der Nutzungsbedingungen aufzunehmen.
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
// + Verkauf von Luftbildaufnahmen, usw.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
// + eindeutig als Ursprung verlinkt werden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
// + Benutzung auf eigene Gefahr
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
// + mit unserer Zustimmung zulässig
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
// + this list of conditions and the following disclaimer.
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
// + from this software without specific prior written permission.
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
// + for non-commercial use (directly or indirectly)
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
// + with our written permission
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
// + clearly linked as origin
// + * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
//
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#include <string.h>
#include "91x_lib.h"
#include "waypoints.h"
#include "uart1.h"
 
// the waypoints list
#define WPLISTLEN 20
Waypoint_t WPList[WPLISTLEN];
u8 WPIndex = 0;
u8 WPNumber = 0;
 
 
u8 WPList_Init(void)
{
return WPList_Clear();
}
 
u8 WPList_Clear(void)
{
u8 i;
WPIndex = 0;
WPNumber = 0;
NaviData.WaypointNumber = WPNumber;
NaviData.WaypointIndex = WPIndex;
 
 
for(i = 0; i < WPLISTLEN; i++)
{
WPList[i].Position.Status = INVALID;
}
return TRUE;
}
 
u8 WPList_GetCount(void)
{
return WPNumber;
}
 
u8 WPList_Append(Waypoint_t* pwp)
{
if(WPNumber < WPLISTLEN) // id there is still some space in the list
{
memcpy(&WPList[WPNumber], pwp, sizeof(Waypoint_t)); // copy wp data to list entry
WPList[WPNumber].Position.Status = NEWDATA; // mark as new data
WPNumber++; // increment list length
NaviData.WaypointNumber = WPNumber;
return TRUE;
}
else return FALSE;
}
 
// rewind to the begin of the list, and returns the first waypoint
Waypoint_t* WPList_Begin(void)
{
WPIndex = 0; // reset list index
NaviData.WaypointIndex = WPIndex;
if(WPNumber > 0) return(&(WPList[WPIndex])); // if list is not empty return pointer to first waypoint in the list
else return NULL; // else return NULL
 
}
 
// returns a pointer to the next waypoint or NULL if the end of the list has been reached
Waypoint_t* WPList_Next(void)
{
if((WPIndex + 1) < WPNumber) // if the next WPIndex exist
{
WPIndex++; // goto next
NaviData.WaypointIndex = WPIndex;
return(&(WPList[WPIndex])); // return pointer to this waypoint
}
else return NULL;
}
/trunk/waypoints.h
0,0 → 1,23
#ifndef _WAYPOINTS_H
#define _WAYPOINTS_H
 
#include "ubx.h"
 
typedef struct
{
GPS_Pos_t Position; // the gps position of the waypoint, see ubx.h for details
s16 Heading; // orientation, future implementation
u8 ToleranceRadius; // in meters, if the MK is within that range around the target, then the next target is triggered
u8 HoldTime; // in seconds, if the was once in the tolerance area around a WP, this time defies the delay before the next WP is triggered
u8 Event_Flag; // future emplementation
u8 reserve[12]; // reserve
} __attribute__((packed)) Waypoint_t;
 
u8 WPList_Init(void);
u8 WPList_Clear(void);
u8 WPList_GetCount(void);
u8 WPList_Append(Waypoint_t* pwp);
Waypoint_t* WPList_Begin(void);
Waypoint_t* WPList_Next(void);
 
#endif // _WAYPOINTS_H