aboutsummaryrefslogtreecommitdiff
path: root/bootloaders/stk500v2
diff options
context:
space:
mode:
authorCristian Maglie <c.maglie@bug.st>2012-12-22 19:31:03 +0100
committerCristian Maglie <c.maglie@bug.st>2012-12-22 19:31:03 +0100
commit911e9ac4e3874fce63a1685bf7262a022a1f60e4 (patch)
treecdb499f295c6d06dcf73c0592d4e8ccece5c59a5 /bootloaders/stk500v2
parenta75fae6ee9545740e8e6d3bdf13296da27af8468 (diff)
Fixed compile problems with avr gcc 4.6.2 (crosspack CrossPack-AVR-20121207.dmg)
Diffstat (limited to 'bootloaders/stk500v2')
-rwxr-xr-xbootloaders/stk500v2/Makefile2
-rwxr-xr-xbootloaders/stk500v2/stk500boot.c118
-rw-r--r--bootloaders/stk500v2/stk500boot_v2_mega2560.hex408
3 files changed, 466 insertions, 62 deletions
diff --git a/bootloaders/stk500v2/Makefile b/bootloaders/stk500v2/Makefile
index 54c5f85..6b66a26 100755
--- a/bootloaders/stk500v2/Makefile
+++ b/bootloaders/stk500v2/Makefile
@@ -124,7 +124,7 @@ CINCS =
CFLAGS = -g$(DEBUG)
CFLAGS += $(CDEFS) $(CINCS)
CFLAGS += -O$(OPT)
-CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -mno-tablejump
+CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -fno-jump-tables
CFLAGS += -Wall -Wstrict-prototypes
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
diff --git a/bootloaders/stk500v2/stk500boot.c b/bootloaders/stk500v2/stk500boot.c
index 89eead1..3e8becc 100755
--- a/bootloaders/stk500v2/stk500boot.c
+++ b/bootloaders/stk500v2/stk500boot.c
@@ -1240,82 +1240,78 @@ unsigned long gEepromIndex;
void PrintDecInt(int theNumber, int digitCnt);
#ifdef _AVR_CPU_NAME_
- prog_char gTextMsg_CPU_Name[] PROGMEM = _AVR_CPU_NAME_;
+ const char gTextMsg_CPU_Name[] PROGMEM = _AVR_CPU_NAME_;
#else
- prog_char gTextMsg_CPU_Name[] PROGMEM = "UNKNOWN";
+ const char gTextMsg_CPU_Name[] PROGMEM = "UNKNOWN";
#endif
- prog_char gTextMsg_Explorer[] PROGMEM = "Arduino explorer stk500V2 by MLS";
- prog_char gTextMsg_Prompt[] PROGMEM = "Bootloader>";
- prog_char gTextMsg_HUH[] PROGMEM = "Huh?";
- prog_char gTextMsg_COMPILED_ON[] PROGMEM = "Compiled on = ";
- prog_char gTextMsg_CPU_Type[] PROGMEM = "CPU Type = ";
- prog_char gTextMsg_AVR_ARCH[] PROGMEM = "__AVR_ARCH__= ";
- prog_char gTextMsg_AVR_LIBC[] PROGMEM = "AVR LibC Ver= ";
- prog_char gTextMsg_GCC_VERSION[] PROGMEM = "GCC Version = ";
- prog_char gTextMsg_CPU_SIGNATURE[] PROGMEM = "CPU ID = ";
- prog_char gTextMsg_FUSE_BYTE_LOW[] PROGMEM = "Low fuse = ";
- prog_char gTextMsg_FUSE_BYTE_HIGH[] PROGMEM = "High fuse = ";
- prog_char gTextMsg_FUSE_BYTE_EXT[] PROGMEM = "Ext fuse = ";
- prog_char gTextMsg_FUSE_BYTE_LOCK[] PROGMEM = "Lock fuse = ";
- prog_char gTextMsg_GCC_DATE_STR[] PROGMEM = __DATE__;
- prog_char gTextMsg_AVR_LIBC_VER_STR[] PROGMEM = __AVR_LIBC_VERSION_STRING__;
- prog_char gTextMsg_GCC_VERSION_STR[] PROGMEM = __VERSION__;
- prog_char gTextMsg_VECTOR_HEADER[] PROGMEM = "V# ADDR op code instruction addr Interrupt";
- prog_char gTextMsg_noVector[] PROGMEM = "no vector";
- prog_char gTextMsg_rjmp[] PROGMEM = "rjmp ";
- prog_char gTextMsg_jmp[] PROGMEM = "jmp ";
- prog_char gTextMsg_WHAT_PORT[] PROGMEM = "What port:";
- prog_char gTextMsg_PortNotSupported[] PROGMEM = "Port not supported";
- prog_char gTextMsg_MustBeLetter[] PROGMEM = "Must be a letter";
- prog_char gTextMsg_SPACE[] PROGMEM = " ";
- prog_char gTextMsg_WriteToEEprom[] PROGMEM = "Writting EE";
- prog_char gTextMsg_ReadingEEprom[] PROGMEM = "Reading EE";
- prog_char gTextMsg_EEPROMerrorCnt[] PROGMEM = "EE err cnt=";
- prog_char gTextMsg_PORT[] PROGMEM = "PORT";
+ const char gTextMsg_Explorer[] PROGMEM = "Arduino explorer stk500V2 by MLS";
+ const char gTextMsg_Prompt[] PROGMEM = "Bootloader>";
+ const char gTextMsg_HUH[] PROGMEM = "Huh?";
+ const char gTextMsg_COMPILED_ON[] PROGMEM = "Compiled on = ";
+ const char gTextMsg_CPU_Type[] PROGMEM = "CPU Type = ";
+ const char gTextMsg_AVR_ARCH[] PROGMEM = "__AVR_ARCH__= ";
+ const char gTextMsg_AVR_LIBC[] PROGMEM = "AVR LibC Ver= ";
+ const char gTextMsg_GCC_VERSION[] PROGMEM = "GCC Version = ";
+ const char gTextMsg_CPU_SIGNATURE[] PROGMEM = "CPU ID = ";
+ const char gTextMsg_FUSE_BYTE_LOW[] PROGMEM = "Low fuse = ";
+ const char gTextMsg_FUSE_BYTE_HIGH[] PROGMEM = "High fuse = ";
+ const char gTextMsg_FUSE_BYTE_EXT[] PROGMEM = "Ext fuse = ";
+ const char gTextMsg_FUSE_BYTE_LOCK[] PROGMEM = "Lock fuse = ";
+ const char gTextMsg_GCC_DATE_STR[] PROGMEM = __DATE__;
+ const char gTextMsg_AVR_LIBC_VER_STR[] PROGMEM = __AVR_LIBC_VERSION_STRING__;
+ const char gTextMsg_GCC_VERSION_STR[] PROGMEM = __VERSION__;
+ const char gTextMsg_VECTOR_HEADER[] PROGMEM = "V# ADDR op code instruction addr Interrupt";
+ const char gTextMsg_noVector[] PROGMEM = "no vector";
+ const char gTextMsg_rjmp[] PROGMEM = "rjmp ";
+ const char gTextMsg_jmp[] PROGMEM = "jmp ";
+ const char gTextMsg_WHAT_PORT[] PROGMEM = "What port:";
+ const char gTextMsg_PortNotSupported[] PROGMEM = "Port not supported";
+ const char gTextMsg_MustBeLetter[] PROGMEM = "Must be a letter";
+ const char gTextMsg_SPACE[] PROGMEM = " ";
+ const char gTextMsg_WriteToEEprom[] PROGMEM = "Writting EE";
+ const char gTextMsg_ReadingEEprom[] PROGMEM = "Reading EE";
+ const char gTextMsg_EEPROMerrorCnt[] PROGMEM = "EE err cnt=";
+ const char gTextMsg_PORT[] PROGMEM = "PORT";
//************************************************************************
//* Help messages
- prog_char gTextMsg_HELP_MSG_0[] PROGMEM = "0=Zero addr";
- prog_char gTextMsg_HELP_MSG_QM[] PROGMEM = "?=CPU stats";
- prog_char gTextMsg_HELP_MSG_AT[] PROGMEM = "@=EEPROM test";
- prog_char gTextMsg_HELP_MSG_B[] PROGMEM = "B=Blink LED";
- prog_char gTextMsg_HELP_MSG_E[] PROGMEM = "E=Dump EEPROM";
- prog_char gTextMsg_HELP_MSG_F[] PROGMEM = "F=Dump FLASH";
- prog_char gTextMsg_HELP_MSG_H[] PROGMEM = "H=Help";
- prog_char gTextMsg_HELP_MSG_L[] PROGMEM = "L=List I/O Ports";
-// prog_char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit & jump to user pgm";
- prog_char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit";
- prog_char gTextMsg_HELP_MSG_R[] PROGMEM = "R=Dump RAM";
- prog_char gTextMsg_HELP_MSG_V[] PROGMEM = "V=show interrupt Vectors";
- prog_char gTextMsg_HELP_MSG_Y[] PROGMEM = "Y=Port blink";
-
- prog_char gTextMsg_END[] PROGMEM = "*";
+ const char gTextMsg_HELP_MSG_0[] PROGMEM = "0=Zero addr";
+ const char gTextMsg_HELP_MSG_QM[] PROGMEM = "?=CPU stats";
+ const char gTextMsg_HELP_MSG_AT[] PROGMEM = "@=EEPROM test";
+ const char gTextMsg_HELP_MSG_B[] PROGMEM = "B=Blink LED";
+ const char gTextMsg_HELP_MSG_E[] PROGMEM = "E=Dump EEPROM";
+ const char gTextMsg_HELP_MSG_F[] PROGMEM = "F=Dump FLASH";
+ const char gTextMsg_HELP_MSG_H[] PROGMEM = "H=Help";
+ const char gTextMsg_HELP_MSG_L[] PROGMEM = "L=List I/O Ports";
+// const char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit & jump to user pgm";
+ const char gTextMsg_HELP_MSG_Q[] PROGMEM = "Q=Quit";
+ const char gTextMsg_HELP_MSG_R[] PROGMEM = "R=Dump RAM";
+ const char gTextMsg_HELP_MSG_V[] PROGMEM = "V=show interrupt Vectors";
+ const char gTextMsg_HELP_MSG_Y[] PROGMEM = "Y=Port blink";
+
+ const char gTextMsg_END[] PROGMEM = "*";
//************************************************************************
-void PrintFromPROGMEM(void *dataPtr, unsigned char offset)
+void PrintFromPROGMEM(const void *dataPtr, unsigned char offset)
{
-uint8_t ii;
char theChar;
- ii = offset;
- theChar = 1;
+ dataPtr += offset;
- while (theChar != 0)
- {
+ do {
#if (FLASHEND > 0x10000)
- theChar = pgm_read_byte_far((uint32_t)dataPtr + ii);
+ theChar = pgm_read_byte_far((uint16_t)dataPtr++);
#else
- theChar = pgm_read_byte_near((uint32_t)dataPtr + ii);
+ theChar = pgm_read_byte_near((uint16_t)dataPtr++);
#endif
if (theChar != 0)
{
sendchar(theChar);
}
- ii++;
- }
+ } while (theChar != 0);
}
//************************************************************************
@@ -1327,7 +1323,7 @@ void PrintNewLine(void)
//************************************************************************
-void PrintFromPROGMEMln(void *dataPtr, unsigned char offset)
+void PrintFromPROGMEMln(const void *dataPtr, unsigned char offset)
{
PrintFromPROGMEM(dataPtr, offset);
@@ -1523,7 +1519,7 @@ unsigned char *ramPtr;
break;
case kDUMP_EEPROM:
- theValue = eeprom_read_byte((void *)myAddressPointer);
+ theValue = eeprom_read_byte((uint8_t *)(uint16_t)myAddressPointer);
break;
case kDUMP_RAM:
@@ -1567,9 +1563,9 @@ int errorCount;
PrintNewLine();
ii = 0;
#if (FLASHEND > 0x10000)
- while (((theChar = pgm_read_byte_far(gTextMsg_Explorer + ii)) != '*') && (ii < 512))
+ while (((theChar = pgm_read_byte_far(((uint16_t)gTextMsg_Explorer) + ii)) != '*') && (ii < 512))
#else
- while (((theChar = pgm_read_byte_near(gTextMsg_Explorer + ii)) != '*') && (ii < 512))
+ while (((theChar = pgm_read_byte_near(((uint16_t)gTextMsg_Explorer) + ii)) != '*') && (ii < 512))
#endif
{
eeprom_write_byte((uint8_t *)ii, theChar);
@@ -1592,9 +1588,9 @@ int errorCount;
errorCount = 0;
ii = 0;
#if (FLASHEND > 0x10000)
- while (((theChar = pgm_read_byte_far(gTextMsg_Explorer + ii)) != '*') && (ii < 512))
+ while (((theChar = pgm_read_byte_far((uint16_t)gTextMsg_Explorer + ii)) != '*') && (ii < 512))
#else
- while (((theChar = pgm_read_byte_near(gTextMsg_Explorer + ii)) != '*') && (ii < 512))
+ while (((theChar = pgm_read_byte_near((uint16_t)gTextMsg_Explorer + ii)) != '*') && (ii < 512))
#endif
{
theEEPROMchar = eeprom_read_byte((uint8_t *)ii);
diff --git a/bootloaders/stk500v2/stk500boot_v2_mega2560.hex b/bootloaders/stk500v2/stk500boot_v2_mega2560.hex
new file mode 100644
index 0000000..a600ec2
--- /dev/null
+++ b/bootloaders/stk500v2/stk500boot_v2_mega2560.hex
@@ -0,0 +1,408 @@
+:020000023000CC
+:10E000000D9489F10D94B3F10D94B3F10D94B3F126
+:10E010000D94B3F10D94B3F10D94B3F10D94B3F1EC
+:10E020000D94B3F10D94B3F10D94B3F10D94B3F1DC
+:10E030000D94B3F10D94B3F10D94B3F10D94B3F1CC
+:10E040000D94B3F10D94B3F10D94B3F10D94B3F1BC
+:10E050000D94B3F10D94B3F10D94B3F10D94B3F1AC
+:10E060000D94B3F10D94B3F10D94B3F10D94B3F19C
+:10E070000D94B3F10D94B3F10D94B3F10D94B3F18C
+:10E080000D94B3F10D94B3F10D94B3F10D94B3F17C
+:10E090000D94B3F10D94B3F10D94B3F10D94B3F16C
+:10E0A0000D94B3F10D94B3F10D94B3F10D94B3F15C
+:10E0B0000D94B3F10D94B3F10D94B3F10D94B3F14C
+:10E0C0000D94B3F10D94B3F10D94B3F10D94B3F13C
+:10E0D0000D94B3F10D94B3F10D94B3F10D94B3F12C
+:10E0E0000D94B3F12A00593D506F727420626C692F
+:10E0F0006E6B00563D73686F7720696E746572723F
+:10E1000075707420566563746F727300523D447568
+:10E110006D702052414D00513D51756974004C3D68
+:10E120004C69737420492F4F20506F7274730048EC
+:10E130003D48656C7000463D44756D7020464C410D
+:10E14000534800453D44756D7020454550524F4D34
+:10E1500000423D426C696E6B204C454400403D4599
+:10E160004550524F4D2074657374003F3D435055E8
+:10E1700020737461747300303D5A65726F2061645E
+:10E18000647200504F5254004545206572722063FE
+:10E190006E743D0052656164696E672045450057A5
+:10E1A00072697474696E672045450020004D75736F
+:10E1B000742062652061206C657474657200506F14
+:10E1C0007274206E6F7420737570706F72746564F2
+:10E1D000005768617420706F72743A006A6D702025
+:10E1E00000726A6D702020006E6F20766563746F18
+:10E1F00072005623202020414444522020206F707A
+:10E2000020636F64652020202020696E737472750E
+:10E210006374696F6E2061646472202020496E749B
+:10E2200065727275707400342E362E3200312E38BD
+:10E230002E30004465632032322032303132004CBF
+:10E240006F636B20667573652020203D2000457844
+:10E25000742066757365202020203D200048696782
+:10E260006820667573652020203D20004C6F772064
+:10E2700066757365202020203D20004350552049BD
+:10E28000442020202020203D200047434320566585
+:10E290007273696F6E203D2000415652204C6962B6
+:10E2A00043205665723D20005F5F4156525F4152E8
+:10E2B00043485F5F3D2000435055205479706520EE
+:10E2C0002020203D2000436F6D70696C6564206FD5
+:10E2D0006E203D20004875683F00426F6F746C6F80
+:10E2E000616465723E0041726475696E6F20657885
+:10E2F000706C6F7265722073746B353030563220DB
+:10E300006279204D4C530041546D6567613235365A
+:10E31000300011241FBECFEFD1E2DEBFCDBF01E040
+:10E320000CBF12E0A0E0B2E0E2E3F9EF03E00BBFC4
+:10E3300002C007900D92A430B107D9F71BBE12E0BE
+:10E34000A4E0B2E001C01D92A231B107E1F70F9441
+:10E35000F7F20D9497FC01E20EBF0FEF0DBF1124F1
+:10E360001FBE0D94F7F20D9400F08093C6008091CB
+:10E37000C00086FFFCCF8091C00080648093C00005
+:10E38000089520E030E008C0EFECF7E03197F1F7B6
+:10E3900000C000002F5F3F4F28173907A9F70895E5
+:10E3A000CF93DF93EC01C60FD11DCE01A0E0B0E00A
+:10E3B0002196ABBFFC018791882319F00F94B5F12A
+:10E3C000F4CFDF91CF9108958DE00F94B5F18AE0FD
+:10E3D0000F94B5F108950F94D0F10F94E4F10895DE
+:10E3E000CF93DF93EC018991882319F00F94B5F155
+:10E3F000FACFDF91CF910895CF93C82F982F9295A0
+:10E400009F70892F805D8A3308F0895F0F94B5F182
+:10E41000CF708C2F805D8A3308F0895F0F94B5F13F
+:10E42000CF9108950F931F93CF93DF93EC018B014E
+:10E43000853691051CF4633071054CF0CE0164E61D
+:10E4400070E00F9438FC862F805D0F94B5F1CB30CF
+:10E45000D1051CF4023011056CF0CE0164E670E0C9
+:10E460000F9438FC6AE070E00F9438FC862F805DD2
+:10E470000F94B5F1CE016AE070E00F9438FC805D36
+:10E480000F94B5F1DF91CF911F910F910895809175
+:10E49000C00087FFFCCF8091C6000895CF93C82F9E
+:10E4A00083E891EE60E00F94D0F18C2F0F94B5F1DA
+:10E4B0000F94E4F1CF9108953F924F925F926F9243
+:10E4C0007F928F929F92AF92BF92CF92DF92EF9204
+:10E4D000FF920F931F93CF93DF93CDB7DEB7629771
+:10E4E0000FB6F894DEBF0FBECDBF582E6A017B0178
+:10E4F00010E144248EE2382E81E0C81680E0D80670
+:10E5000081E0E80680E0F80618F08E2D0F94FCF10B
+:10E510008D2D0F94FCF18C2D0F94FCF180E20F9463
+:10E52000B5F18DE20F94B5F180E20F94B5F1198247
+:10E530003E010894611C711C4601570100E191E005
+:10E54000591651F0591620F0A2E05A1661F409C08C
+:10E55000ABBEF401479007C0C4010F9481FC482E64
+:10E5600002C0F4014080842D0F94FCF180E20F94EE
+:10E57000B5F1842D80528F3518F4F301408202C02A
+:10E58000D3013C920894811C911CA11CB11C015028
+:10E590000894611C711C002391F680E190E0A0E0DA
+:10E5A000B0E0C80ED91EEA1EFB1E198ACE010196E4
+:10E5B0000F94F0F10F94E4F1115009F09DCF6296A1
+:10E5C0000FB6F894DEBF0FBECDBFDF91CF911F9184
+:10E5D0000F91FF90EF90DF90CF90BF90AF909F9002
+:10E5E0008F907F906F905F904F903F900895CF9362
+:10E5F000DF93CDB7DEB7C054D1400FB6F894DEBF7D
+:10E600000FBECDBF01E20EBF0FEF0DBF94B7F89460
+:10E61000A89514BE8091600088618093600010927C
+:10E620006000789493FF05C0E0910402F091050228
+:10E630001995279A2F9A8091C00082608093C0001C
+:10E6400080E18093C40088E18093C1000000CC2465
+:10E65000DD247601A7EC8A2EABE19A2EA12CB12CF9
+:10E6600000E010E025C005E00A95F1F700000894ED
+:10E67000C11CD11CE11CF11C01E010E021E2C2161A
+:10E680002EE4D20620E0E20620E0F20610F400E0DC
+:10E6900010E0C701B601A50194010F944BFCDC0109
+:10E6A000CB010097A105B10519F485B1805885B952
+:10E6B0008091C00087FD03C001151105A1F2C801BA
+:10E6C00001968130910511F00D9419FC0D94D4FB45
+:10E6D00080E090E081309105C9F41FC00196A11D32
+:10E6E000B11D813032E193073AE7A30730E0B30769
+:10E6F00080F0C15CDE4F88819981CF53D140AFEF6C
+:10E700008F3F9A0719F0EE27FF27099480E090E0E9
+:10E71000DC013091C00037FFE1CF3091C600089492
+:10E72000E11CF11C313209F042C5BAE0EB16F104EC
+:10E7300008F03DC56F5F7F4F6330710509F039C543
+:10E740000FC081E20F94B5F101501040D1F70F9442
+:10E75000E4F10894E108F108E114F10481F412C035
+:10E76000C95DDE4FF982E882C752D140C55DDE4FF8
+:10E7700019830883CB52D140F5E0EF2EF12C09E14B
+:10E7800010E0DFCF10920E0210920F0210921002D2
+:10E790001092110210920A0210920B0210920C02B7
+:10E7A00010920D02109206021092070210920802B7
+:10E7B0001092090286EE92EE60E00F94EBF18AED82
+:10E7C00092EE60E00F94D0F10F9447F2182F80364C
+:10E7D00008F01F75103230F0812F0F94B5F180E2F0
+:10E7E0000F94B5F1183409F4B5C11934B8F41234E2
+:10E7F00009F446C1133458F4103319F1103308F4F6
+:10E80000D3C41F33A1F1103409F0CEC4B9C01534FC
+:10E8100009F44DC1163409F0C7C477C1123509F4A3
+:10E8200009C2133538F41C3409F4D3C1113509F089
+:10E83000BBC4F6C1163509F422C2193509F0B4C4B7
+:10E84000A8C387E791EE62E00F94EBF110920A0201
+:10E8500010920B0210920C0210920D0210920E02F6
+:10E8600010920F02109210021092110200C18BE65A
+:10E8700091EE62E00F94EBF186EE92EE60E00F9481
+:10E88000EBF186EC92EE60E00F94D0F183E392EE30
+:10E8900060E00F94EBF187EB92EE60E00F94D0F123
+:10E8A00087E093EE60E00F94EBF188EA92EE60E08F
+:10E8B0000F94D0F186E090E061E070E00F9412F2E6
+:10E8C0000F94E4F18AE892EE60E00F94D0F187E2D1
+:10E8D00092EE60E00F94EBF189E992EE60E00F9424
+:10E8E000D0F18DE292EE60E00F94EBF18BE792EEC7
+:10E8F00060E00F94D0F18EE10F94FCF188E90F9461
+:10E90000FCF181E00F94FCF10F94E4F18CE692EEBF
+:10E9100060E00F94D0F119E0E0E0F0E010935700D0
+:10E9200084910F94FCF10F94E4F18DE592EE60E098
+:10E930000F94D0F1E3E0F0E01093570084910F942E
+:10E94000FCF10F94E4F18EE492EE60E00F94D0F1CC
+:10E95000E2E0F0E01093570084910F94FCF10F94E3
+:10E96000E4F18FE392EE60E00F94D0F1E1E0F0E0AB
+:10E970001093570084910F94FCF10F94E4F11FCF92
+:10E980008DE591EE62E00F94EBF18FE991EE60E09E
+:10E990000F94EBF10F94E4F1EE24FF2412C0C701B1
+:10E9A000612F0F9489FC112331F48BEA91EE60E022
+:10E9B0000F94D0F103C0812F0F94B5F10894E11C9E
+:10E9C000F11CC7018A519D41A0E0B0E0ABBFFC0142
+:10E9D00017911A3229F0E0E0EE16E2E0FE06F9F6B1
+:10E9E0000F94E4F10F94E4F184E991EE60E00F9468
+:10E9F000EBF10F94E4F1CC24DD24EE24FF2416C0C7
+:10EA0000C7010F9481FC182F882331F48BEA91EE13
+:10EA100060E00F94D0F102C00F94B5F1101719F017
+:10EA20000894C11CD11C0894E11CF11C87010A51F7
+:10EA30001D4120E030E02BBFF80107910A3229F098
+:10EA4000F0E0EF16F2E0FF06D9F60F94E4F10F9430
+:10EA5000E4F188E891EE60E00F94D0F1C60161E046
+:10EA600070E00F9412F20F94E4F10F94E4F110921D
+:10EA700006021092070210920802109209029FCE1D
+:10EA800081E591EE62E00F94EBF1279A2F9A0AC08C
+:10EA90002F9884E690E00F94C1F12F9A84E690E0DD
+:10EAA0000F94C1F18091C00087FFF2CF77C383E458
+:10EAB00091EE62E00F94EBF1409106025091070253
+:10EAC000609108027091090281E00F945CF28091DC
+:10EAD000060290910702A0910802B09109028050AD
+:10EAE0009F4FAF4FBF4F8093060290930702A093B2
+:10EAF0000802B0930902803000E1900700E0A0070F
+:10EB000000E0B00708F45BCEB2CF86E391EE62E09E
+:10EB10000F94EBF140910A0250910B0260910C02AC
+:10EB200070910D0280E00F945CF280910A02909146
+:10EB30000B02A0910C02B0910D0280509F4FAF4F7D
+:10EB4000BF4F80930A0290930B02A0930C02B093E4
+:10EB50000D0235CE8FE291EE62E00F94EBF187E784
+:10EB600091EE60E00F94EBF18BE691EE60E00F9494
+:10EB7000EBF18DE591EE60E00F94EBF181E591EE24
+:10EB800060E00F94EBF183E491EE60E00F94EBF121
+:10EB900086E391EE60E00F94EBF18FE291EE60E09E
+:10EBA0000F94EBF18EE191EE60E00F94EBF187E1D1
+:10EBB00091EE60E00F94EBF18CE091EE60E00F9449
+:10EBC000EBF183EF90EE60E00F94EBF186EE90EEC8
+:10EBD000F3CD8EE191EE62E00F94EBF181E40F94BE
+:10EBE0004EF282E40F944EF283E40F944EF284E4EA
+:10EBF0000F944EF285E40F944EF286E40F944EF299
+:10EC000087E40F944EF288E40F944EF28AE40F9456
+:10EC10004EF28BE40F944EF28CE40F944EF2CFCD73
+:10EC200087E191EE62E00F94EBF122243324442437
+:10EC3000439413C38CE091EE62E00F94EBF14091AA
+:10EC40000E0250910F02609110027091110282E049
+:10EC50000F945CF280910E0290910F02A09110022D
+:10EC6000B091110280509F4FAF4FBF4F80930E0263
+:10EC700090930F02A0931002B0931102A0CD83EFE6
+:10EC800090EE62E00F94EBF187E093EE60E00F947A
+:10EC9000EBF182EF91EE60E00F94EBF1C75DDE4F98
+:10ECA00019821882C952D140442455243201A3014B
+:10ECB00092015695479537952795CF5CDE4F28836F
+:10ECC00039834A835B83C153D140C75DDE4F48819E
+:10ECD0005981C952D1404F5F5F4FC75DDE4F5983A5
+:10ECE0004883C952D140CA0162E070E00F9412F229
+:10ECF00080E20F94B5F18DE20F94B5F180E20F94AC
+:10ED0000B5F180E00F94FCF1CF5CDE4F8881C153F8
+:10ED1000D1400F94FCF180E20F94B5F18DE30F9494
+:10ED2000B5F180E20F94B5F16BBEF2018790682DCA
+:10ED300070E080E090E0C35DDE4F688379838A8372
+:10ED40009B83CD52D140D301C2010196A11DB11DBB
+:10ED5000ABBFFC018791082F10E020E030E0CB5CD6
+:10ED6000DE4F088319832A833B83C553D140930127
+:10ED700082010D5F1F4F2F4F3F4FB301A2014E5F26
+:10ED80005F4F6F4F7F4F6BBFFA01379044E050E009
+:10ED900060E070E0440E551E661E771E2BBFF80122
+:10EDA0001791CB5CDE4F288139814A815B81C55345
+:10EDB000D140CC24D22EE32EF42EC35DDE4F488109
+:10EDC00059816A817B81CD52D140C40ED51EE61E89
+:10EDD000F71E0F94FCF180E20F94B5F1882D0F948B
+:10EDE000FCF180E20F94B5F1812F0F94FCF180E2E9
+:10EDF0000F94B5F1832D0F94FCF180E20F94B5F1DF
+:10EE00005FEFC5165FEFD50650E0E50650E0F5066A
+:10EE100031F488EE91EE60E00F94D0F1ADC0D701EF
+:10EE2000C6018070907CA070B070803060EC960756
+:10EE300060E0A60760E0B60701F57FEF872E7FE36D
+:10EE4000972EA12CB12C8C209D20AE20BF20CF5C12
+:10EE5000DE4FC880D980EA80FB80C153D140C80C06
+:10EE6000D91CEA1CFB1CCC0CDD1CEE1CFF1C81EE2B
+:10EE700091EE60E00F94D0F16AC0D701C6018E70A8
+:10EE80009E7FA070B0708C3074E9970770E0A70780
+:10EE900070E0B70709F070C0812F90E0A0E0B0E00B
+:10EEA0008824982EA92EBA2E830C911CA11CB11C6B
+:10EEB000C35DDE4F88819981AA81BB81CD52D1404B
+:10EEC00081709070A070B070DC0199278827880E3F
+:10EED000991EAA1EBB1EC35DDE4F88819981AA813F
+:10EEE000BB81CD52D140807F9070A070B07041E165
+:10EEF000880F991FAA1FBB1F4A95D1F7880E991E2C
+:10EF0000AA1EBB1ECB5CDE4F88819981AA81BB8182
+:10EF1000C553D14081709070A070B07055E1880FDA
+:10EF2000991FAA1FBB1F5A95D1F7880E991EAA1EBA
+:10EF3000BB1E75016401CC0CDD1CEE1CFF1C8CEDAE
+:10EF400091EE60E00F94D0F18A2D0F94FCF1892DA1
+:10EF50000F94FCF1882D0F94FCF180E20F94B5F131
+:10EF60008EE30F94B5F18E2D0F94FCF18D2D0F943F
+:10EF7000FCF18C2D0F94FCF10F94E4F1C75DDE4F92
+:10EF800008811981C952D1400933110509F08FCE8A
+:10EF900016CC86EE90EE62E00F94EBF181ED91EEEF
+:10EFA00060E00F94D0F10F9447F2182F1F75812F56
+:10EFB0000F94B5F10F94E4F1812F81548A3108F058
+:10EFC000F0C0163409F477C0173490F4133409F400
+:10EFD00042C0143430F41134F1F0123409F0DBC0C3
+:10EFE0002AC0143409F447C0153409F0D4C053C002
+:10EFF0001A3409F494C01B3438F4173409F46BC084
+:10F00000183409F0C8C077C01B3409F49CC01C3404
+:10F0100009F0C1C0ACC08FEF81B907C082B1809543
+:10F0200082B988EC90E00F94C1F18091C00087FF15
+:10F03000F5CF12B8B3C08FEF84B907C085B1809502
+:10F0400085B988EC90E00F94C1F18091C00087FFF2
+:10F05000F5CF15B8A3C08FEF87B907C088B18095E9
+:10F0600088B988EC90E00F94C1F18091C00087FFCF
+:10F07000F5CF18B893C08FEF8AB907C08BB18095D0
+:10F080008BB988EC90E00F94C1F18091C00087FFAC
+:10F09000F5CF1BB883C08FEF8DB907C08EB18095B7
+:10F0A0008EB988EC90E00F94C1F18091C00087FF89
+:10F0B000F5CF1EB873C08FEF80BB07C081B38095BA
+:10F0C00081BB88EC90E00F94C1F18091C00087FF74
+:10F0D000F5CF11BA63C08FEF83BB07C084B38095AF
+:10F0E00084BB88EC90E00F94C1F18091C00087FF51
+:10F0F000F5CF14BA53C08FEF8093010109C08091FE
+:10F10000020180958093020188EC90E00F94C1F198
+:10F110008091C00087FFF3CF109202013FC08FEFB4
+:10F120008093040109C080910501809580930501B9
+:10F1300088EC90E00F94C1F18091C00087FFF3CF7D
+:10F14000109205012BC08FEF8093070109C08091B9
+:10F15000080180958093080188EC90E00F94C1F13C
+:10F160008091C00087FFF3CF1092080117C08FEF86
+:10F1700080930A0109C080910B01809580930B0157
+:10F1800088EC90E00F94C1F18091C00087FFF3CF2D
+:10F1900010920B0103C08EEB91EE0ECB0F9447F251
+:10F1A0000ECB8DEA91EE08CB85ED92EE05CB60E0BB
+:10F1B00070E02330F9F0243028F4213071F022304F
+:10F1C000A0F407C0253029F12530D8F02630A1F56C
+:10F1D0002FC03B3109F07CCA40C3C326CA5DDE4F55
+:10F1E0003883C652D14022E073CA532F40E0C32671
+:10F1F00023E06ECA832F90E0482B592BC32624E0CE
+:10F2000067CA3E3009F02EC3C32600E010E025E0B7
+:10F210005FCAE1E0F0E0EC0FFD1FE00FF11F30836B
+:10F220000F5F1F4FC3260417150709F051CA1DC3EE
+:10F230003C1509F017C303C0273009F049CA1B0168
+:10F24000C95DDE4FF982E882C752D140C55DDE4F0D
+:10F2500019830883CB52D14044249981933109F416
+:10F260000AC19431C8F4963009F4D0C0973050F4F4
+:10F27000923009F4FEC0933009F46AC0913009F06D
+:10F2800048C24FC0913109F470C0923108F0B0C04B
+:10F29000903109F03EC2EDC0983109F483C0993134
+:10F2A00050F4953109F4E7C0953108F4B4C19631B2
+:10F2B00009F02FC2B0C19A3109F467C09A3108F43D
+:10F2C00085C09B3109F454C09D3109F022C28D8163
+:10F2D000803339F49F819923A9F09130A9F4E8E9AA
+:10F2E00016C0982F907591F0803519F4E0E0F0E0A9
+:10F2F00004C0883559F4E3E0F0E099E090935700BA
+:10F30000E49105C0EEE103C0E1E001C0E0E01A8253
+:10F310001B828C831D82EE831F8207E0E02EF12C7E
+:10F32000FDC11A8288E08B8381E48C8386E58D831E
+:10F3300082E58E8389E48F8383E5888780E58987EA
+:10F340008FE58A8782E38B871BE0E12EF12CE6C1F3
+:10F35000EA81E059E33028F4F0E0E050FE4F80818C
+:10F3600001C080E01A828B833FC04424439481C053
+:10F370008D81882321F0813021F488E903C08EE15A
+:10F3800001C081E01A828B8308C01A82E1E0F0E0BC
+:10F3900089E080935700E491EB831C82B4E0EB2E6C
+:10F3A000F12CBCC18B81803549F48C81883019F4F3
+:10F3B000E2E0F0E005C0E0E0F0E002C0E3E0F0E011
+:10F3C00089E080935700E4911A82E6CF8D81836CA7
+:10F3D00099E0E1E0F0E0082E90935700E89507B639
+:10F3E00000FCFDCF1A821B82A3E0EA2EF12C96C10D
+:10F3F00080EC8A83F2E0EF2EF12CCE5DDE4F188296
+:10F4000019821A821B82C252D14088C18A8190E03F
+:10F41000A0E0B0E0582F4427332722278B8190E0CB
+:10F42000A0E0B0E0DC0199278827282B392B4A2B54
+:10F430005B2B8D8190E0A0E0B0E0282B392B4A2B8C
+:10F440005B2B8C8190E0A0E0B0E0BA2FA92F982F21
+:10F450008827282B392B4A2B5B2B220F331F441F65
+:10F46000551FC25EDE4F288339834A835B83CE51AA
+:10F47000D1401A8250C13A81C65CDE4F3883CA53EC
+:10F48000D140C75CDE4F1882C953D1402B8130E098
+:10F49000C75CDE4F08811981C953D140202B312B25
+:10F4A000933109F079C0CE5DDE4F488159816A8180
+:10F4B0007B81C252D140403080EC580783E068071E
+:10F4C00080E07807F0F483E0FA0160935B008093BA
+:10F4D0005700E89507B600FCFDCFCE5DDE4F4881B2
+:10F4E00059816A817B81C252D14040505F4F6F4F3A
+:10F4F0007F4FCE5DDE4F488359836A837B83C25240
+:10F50000D1408B85DE011D96C25EDE4F4881598158
+:10F510006A817B81CE51D14011E0FD01319790810C
+:10F52000C45CDE4F9883CC53D140C55CDE4F18825B
+:10F53000CB53D14090E0C55CDE4FE881F981CB53DD
+:10F54000D1408E2B9F2B0C01FA0160935B0010932E
+:10F550005700E89511244E5F5F4F6F4F7F4F225049
+:10F56000304019F08C911296D8CF85E0C25EDE4F04
+:10F57000088119812A813B81CE51D140F801209325
+:10F580005B0080935700E89507B600FCFDCF81E152
+:10F5900080935700E89535C0F901C25EDE4F48817F
+:10F5A00059816A817B81CE51D1408E01055F1F4F09
+:10F5B00041BDBB27A72F962F852F82BD4F5F5F4F81
+:10F5C0006F4F7F4FD8018D918D0180BDFA9AF99AC6
+:10F5D000F999FECF319761F7C9010197AC0160E05D
+:10F5E00070E04F5F5F4F6F4F7F4FC25EDE4F08810D
+:10F5F00019812A813B81CE51D140400F511F621F9A
+:10F60000731F1A82C25EDE4F488359836A837B83ED
+:10F61000CE51D14080C01A81C25CDE4F1883CE53D8
+:10F62000D140C35CDE4F1882CD53D1402B8130E0F6
+:10F63000C35CDE4F08811981CD53D140202B312B83
+:10F64000B3E0EB2EF12CE20EF31E1A82943119F581
+:10F65000DE011396C25EDE4F488159816A817B814B
+:10F66000CE51D1406BBFFA01879196918C93119640
+:10F670009C93119712964E5F5F4F6F4F7F4F2250B2
+:10F68000304081F7C25EDE4F488359836A837B83B3
+:10F69000CE51D1403CC0F901C25EDE4F4881598154
+:10F6A0006A817B81CE51D1408E010D5F1F4F41BDDC
+:10F6B000BB27A72F962F852F82BD4F5F5F4F6F4FC0
+:10F6C0007F4FF89A80B5D8018D938D01319779F7E6
+:10F6D000C9010197A0E0B0E00196A11DB11DC25E75
+:10F6E000DE4F488159816A817B81CE51D140480FDC
+:10F6F000591F6A1F7B1FC25EDE4F488359836A838E
+:10F700007B83CE51D140DE011396A20FB31F1C9212
+:10F7100005C080EC8A8332E0E32EF12C8BE10F945C
+:10F72000B5F1CA5DDE4F8881C652D1400F94B5F164
+:10F730008F2D0F94B5F18E2D0F94B5F18EE00F94AF
+:10F74000B5F125E1C22ECA5DDE4F2881C652D140F7
+:10F75000C226CE24CF244E010894811C911C0AC0DD
+:10F76000D4011D914D01812F0F94B5F1C12608944C
+:10F77000E108F108E114F10499F78C2D0F94B5F12B
+:10F78000CA5DDE4F0881C652D1400F5FCA5DDE4FB1
+:10F790000883C652D14085B1805885B9442009F00C
+:10F7A00048C080E090E033C0C95DDE4F1982188206
+:10F7B000C752D140EE24FF242224CC24C55DDE4F65
+:10F7C00019821882CB52D140CE5DDE4F1882198249
+:10F7D0001A821B82C252D140C25EDE4F1882198249
+:10F7E0001A821B82CE51D14020E030E0A9014BBFEC
+:10F7F000F90147915691C15CDE4F59834883CF533D
+:10F80000D140CA5DDE4F2882C652D140170140E088
+:10F8100050E020E0B101C95DDE4FE880F980C752B9
+:10F82000D140C55DDE4F08811981CB52D1400D9486
+:10F830006AF327982F9884E690E00F94C1F10000B6
+:10F840008091C0008D7F8093C00081E1809357003C
+:10F85000E895EE27FF270994FFCF9BE1C92E21E011
+:10F860000D9468F320E00D9468F326E00D9468F39E
+:10F8700097FB092E07260AD077FD04D02ED006D09C
+:10F8800000201AF4709561957F4F0895F6F79095D2
+:10F8900081959F4F0895A1E21A2EAA1BBB1BFD0163
+:10F8A0000DC0AA1FBB1FEE1FFF1FA217B307E4075F
+:10F8B000F50720F0A21BB30BE40BF50B661F771FB7
+:10F8C000881F991F1A9469F7609570958095909597
+:10F8D0009B01AC01BD01CF010895AA1BBB1B51E1E7
+:10F8E00007C0AA1FBB1FA617B70710F0A61BB70BB0
+:10F8F000881F991F5A95A9F780959095BC01CD0155
+:10F900000895F999FECF92BD81BDF89A992780B5E7
+:10F910000895262FF999FECF1FBA92BD81BD20BD53
+:10F920000FB6F894FA9AF99A0FBE01960895F894D2
+:02F93000FFCF07
+:04F932000F020A00B6
+:040000033000E000E9
+:00000001FF