Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/famicom-dumper.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2020-12-01 19:05:47 +0300
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2020-12-01 19:05:47 +0300
commit4e4ca3f1f4d976f90084e128209000bd87d036a0 (patch)
tree469bb34faf05c10850d73174224dcb8835add48f
parentfcda3ff0a69471e8e811f006dbe42f24fedbc41d (diff)
COOLBOY refactoring
-rw-r--r--dumper.c260
-rw-r--r--famicom-dumper.hex549
2 files changed, 244 insertions, 565 deletions
diff --git a/dumper.c b/dumper.c
index 90326cd..386494c 100644
--- a/dumper.c
+++ b/dumper.c
@@ -76,7 +76,7 @@ static void set_address(uint16_t address)
PORTF |= 1<<4;
}
-static void set_romsel(uint16_t address)
+static inline void set_romsel(uint16_t address)
{
if (address & 0x8000)
{
@@ -86,6 +86,30 @@ static void set_romsel(uint16_t address)
}
}
+static inline void set_coolboy_rd(uint16_t address)
+{
+ if (address & 0x8000)
+ {
+ COOLBOY_PORT |= 1<<COOLBOY_WR_PIN;
+ COOLBOY_PORT &= ~(1<<COOLBOY_RD_PIN);
+ } else {
+ COOLBOY_PORT |= 1<<COOLBOY_WR_PIN;
+ COOLBOY_PORT |= 1<<COOLBOY_RD_PIN;
+ }
+}
+
+static inline void set_coolboy_wr(uint16_t address)
+{
+ if (address & 0x8000)
+ {
+ COOLBOY_PORT &= ~(1<<COOLBOY_WR_PIN);
+ COOLBOY_PORT |= 1<<COOLBOY_RD_PIN;
+ } else {
+ COOLBOY_PORT |= 1<<COOLBOY_WR_PIN;
+ COOLBOY_PORT |= 1<<COOLBOY_RD_PIN;
+ }
+}
+
static unsigned char read_prg_byte(uint16_t address)
{
PHI2_LOW;
@@ -95,9 +119,11 @@ static unsigned char read_prg_byte(uint16_t address)
set_address(address);
PHI2_HI;
set_romsel(address); // set /ROMSEL low if need
+ set_coolboy_rd(address); // COOLBOY's /oe low if need
_delay_us(1);
uint8_t result = PIND;
ROMSEL_HI;
+ set_coolboy_rd(0);
return result;
}
@@ -115,24 +141,6 @@ static unsigned char read_chr_byte(uint16_t address)
return result;
}
-static unsigned char read_coolboy_byte(uint16_t address)
-{
- PHI2_LOW;
- ROMSEL_HI;
- MODE_READ;
- PRG_READ;
- set_address(address);
- PHI2_HI;
- ROMSEL_LOW;
- COOLBOY_PORT |= 1<<COOLBOY_WR_PIN;
- COOLBOY_PORT &= ~(1<<COOLBOY_RD_PIN);
- _delay_us(1);
- uint8_t result = PIND;
- ROMSEL_HI;
- COOLBOY_PORT |= 1<<COOLBOY_RD_PIN;
- return result;
-}
-
static void read_prg_send(uint16_t address, uint16_t len)
{
LED_GREEN_ON;
@@ -203,30 +211,6 @@ static void read_chr_crc_send(uint16_t address, uint16_t len)
LED_GREEN_OFF;
}
-static void read_coolboy_send(uint16_t address, uint16_t len)
-{
- LED_GREEN_ON;
- COOLBOY_PORT |= 1<<COOLBOY_RD_PIN;
- COOLBOY_PORT |= 1<<COOLBOY_WR_PIN;
- COOLBOY_DDR |= 1<<COOLBOY_RD_PIN;
- COOLBOY_DDR |= 1<<COOLBOY_WR_PIN;
- comm_start(COMMAND_PRG_READ_RESULT, len);
- while (len > 0)
- {
- comm_send_byte(read_coolboy_byte(address));
- len--;
- address++;
- }
- set_address(0);
- ROMSEL_HI;
- COOLBOY_PORT |= 1<<COOLBOY_RD_PIN;
- COOLBOY_PORT |= 1<<COOLBOY_WR_PIN;
-
- COOLBOY_DDR &= ~((1<<COOLBOY_RD_PIN) | (1<<COOLBOY_RD_PIN));
- COOLBOY_PORT &= ~((1<<COOLBOY_RD_PIN) | (1<<COOLBOY_RD_PIN));
- LED_GREEN_OFF;
-}
-
static void write_prg_byte(uint16_t address, uint8_t data)
{
PHI2_LOW;
@@ -239,12 +223,14 @@ static void write_prg_byte(uint16_t address, uint8_t data)
PHI2_HI;
set_romsel(address); // ROMSEL is low if need, PHI2 high
+ set_coolboy_wr(address); // COOLBOY's /we is low if need
_delay_us(1); // WRITING
// PHI2 low, ROMSEL high
PHI2_LOW;
ROMSEL_HI;
+ set_coolboy_wr(0);
// Back to read mode
_delay_us(1);
@@ -300,79 +286,11 @@ static void write_chr(uint16_t address, uint16_t len, uint8_t* data)
LED_RED_OFF;
}
-static void write_prg_flash_command(uint16_t address, uint8_t data)
+static inline void write_prg_flash_command(uint16_t address, uint8_t data)
{
write_prg_byte(address | 0x8000, data);
}
-static void write_coolboy_flash_command(uint16_t address, uint8_t data)
-{
- COOLBOY_DDR |= 1<<COOLBOY_RD_PIN;
- COOLBOY_DDR |= 1<<COOLBOY_WR_PIN;
- COOLBOY_PORT |= 1<<COOLBOY_RD_PIN;
- COOLBOY_PORT |= 1<<COOLBOY_WR_PIN;
- ROMSEL_HI;
- PRG_READ;
- set_address(address);
- MODE_WRITE;
- PORTD = data;
- PHI2_HI;
- ROMSEL_LOW;
- _delay_us(1);
- COOLBOY_PORT &= ~(1<<COOLBOY_WR_PIN);
- _delay_us(1);
- COOLBOY_PORT |= 1<<COOLBOY_WR_PIN;
- set_address(0);
- ROMSEL_HI;
- MODE_READ;
-}
-
-static void erase_coolboy_sector()
-{
- LED_RED_ON;
- write_coolboy_flash_command(0x0000, 0xF0);
- write_coolboy_flash_command(0x0AAA, 0xAA);
- write_coolboy_flash_command(0x0555, 0x55);
- write_coolboy_flash_command(0x0AAA, 0x80);
- write_coolboy_flash_command(0x0AAA, 0xAA);
- write_coolboy_flash_command(0x0555, 0x55);
- write_coolboy_flash_command(0x0000, 0x30);
-
- uint8_t res;
- int16_t last_res = -1;
- TCNT1 = 0;
- // waiting for result
- while (1)
- {
- if (TCNT1 >= 23437) // 3 seconds
- {
- // timeout
- comm_start(COMMAND_FLASH_ERASE_TIMEOUT, 0);
- break;
- }
- res = read_coolboy_byte(0x8000);
- if ((last_res == -1) || ((res ^ (last_res & 0xFF)) & ((1 << 6) | (1 << 2))))
- {
- // in progress
- last_res = res;
- continue;
- }
- // done
- if (res == 0xFF)
- {
- // ok
- comm_start(COMMAND_PRG_WRITE_DONE, 0);
- break;
- } else {
- // error
- comm_start(COMMAND_FLASH_ERASE_ERROR, 1);
- comm_send_byte(res);
- break;
- }
- }
- LED_RED_OFF;
-}
-
static void erase_flash_sector()
{
LED_RED_ON;
@@ -419,97 +337,6 @@ static void erase_flash_sector()
LED_RED_OFF;
}
-static void write_coolboy(uint16_t address, uint16_t len, uint8_t* data)
-{
- LED_RED_ON;
- while (len > 0)
- {
- uint8_t count = 0;
- uint8_t* d = data;
- uint16_t a = address;
- uint16_t last_address;
- uint8_t last_data;
- uint16_t address_base = a & 0xFFC0;
- while ((len > 0) && ((a & 0xFFC0) == address_base))
- {
- if (*d != 0xFF)
- count++;
- a++;
- len--;
- d++;
- }
-
- if (count)
- {
- write_coolboy_flash_command(0x0000, 0xF0);
- write_coolboy_flash_command(0x0AAA, 0xAA);
- write_coolboy_flash_command(0x0555, 0x55);
- write_coolboy_flash_command(0x0000, 0x25);
- write_coolboy_flash_command(0x0000, count-1);
-
- while (count > 0)
- {
- if (*data != 0xFF)
- {
- write_coolboy_flash_command(address, *data);
- last_address = address;
- last_data = *data;
- count--;
- }
- address++;
- data++;
- }
-
- write_coolboy_flash_command(0x0000, 0x29);
-
- TCNT1 = 0;
- // waiting for result
- while (1)
- {
- if (TCNT1 >= 7812) // 1 second
- {
- // timeout
- comm_start(COMMAND_FLASH_WRITE_TIMEOUT, 0);
- LED_RED_OFF;
- return;
- }
- uint8_t read_1 = read_coolboy_byte(last_address | 0x8000);
- uint8_t read_2 = read_coolboy_byte(last_address | 0x8000);
- uint8_t read_3 = read_coolboy_byte(last_address | 0x8000);
- if (((read_1 ^ read_2) & (1 << 6)) && ((read_2 ^ read_3) & (1 << 6)))
- {
- if (read_1 & (1 << 1))
- {
- comm_start(COMMAND_FLASH_WRITE_ERROR, 3);
- comm_send_byte(read_1);
- comm_send_byte(read_2);
- comm_send_byte(read_3);
- LED_RED_OFF;
- return;
- } else if (read_1 & (1 << 5)) {
- comm_start(COMMAND_FLASH_WRITE_TIMEOUT, 3);
- comm_send_byte(read_1);
- comm_send_byte(read_2);
- comm_send_byte(read_3);
- LED_RED_OFF;
- return;
- }
- } else {
- read_1 = read_coolboy_byte(last_address | 0x8000);
- read_2 = read_coolboy_byte(last_address | 0x8000);
- if (read_1 == read_2 && read_2 == last_data)
- break; // ok
- }
- }
- }
-
- address = a;
- data = d;
- }
- comm_start(COMMAND_PRG_WRITE_DONE, 0);
- LED_RED_OFF;
-}
-
static void write_flash(uint16_t address, uint16_t len, uint8_t* data)
{
LED_RED_ON;
@@ -837,6 +664,8 @@ static void init_ports()
set_address(0);
DDRA = 0xFF; // Address low
DDRC = 0xFF; // Address high
+ COOLBOY_DDR |= (1<<COOLBOY_RD_PIN) | (1<<COOLBOY_WR_PIN);
+ COOLBOY_PORT |= (1<<COOLBOY_RD_PIN) | (1<<COOLBOY_WR_PIN);
}
static void reset_phi2()
@@ -856,8 +685,6 @@ int main (void)
sei();
USART_init();
init_ports();
- COOLBOY_DDR &= ~((1<<COOLBOY_RD_PIN) | (1<<COOLBOY_RD_PIN));
- COOLBOY_PORT &= ~((1<<COOLBOY_RD_PIN) | (1<<COOLBOY_RD_PIN));
LED_RED_OFF;
LED_GREEN_OFF;
@@ -919,6 +746,7 @@ int main (void)
comm_send_byte(((RECV_BUFFER_SIZE - 4) >> 8) & 0xFF);
break;
+ case COMMAND_COOLBOY_READ_REQUEST:
case COMMAND_PRG_READ_REQUEST:
address = recv_buffer[0] | ((uint16_t)recv_buffer[1]<<8);
length = recv_buffer[2] | ((uint16_t)recv_buffer[3]<<8);
@@ -938,32 +766,18 @@ int main (void)
comm_start(COMMAND_PRG_WRITE_DONE, 0);
break;
- case COMMAND_COOLBOY_READ_REQUEST:
- address = recv_buffer[0] | ((uint16_t)recv_buffer[1]<<8);
- length = recv_buffer[2] | ((uint16_t)recv_buffer[3]<<8);
- read_coolboy_send(address, length);
- break;
-
case COMMAND_RESET:
reset_phi2();
comm_start(COMMAND_RESET_ACK, 0);
break;
- case COMMAND_COOLBOY_ERASE_SECTOR_REQUEST:
- erase_coolboy_sector();
- break;
-
- case COMMAND_COOLBOY_WRITE_REQUEST:
- address = recv_buffer[0] | ((uint16_t)recv_buffer[1]<<8);
- length = recv_buffer[2] | ((uint16_t)recv_buffer[3]<<8);
- write_coolboy(address, length, (uint8_t*)&recv_buffer[4]);
- break;
-
case COMMAND_FLASH_ERASE_SECTOR_REQUEST:
+ case COMMAND_COOLBOY_ERASE_SECTOR_REQUEST:
erase_flash_sector();
break;
case COMMAND_FLASH_WRITE_REQUEST:
+ case COMMAND_COOLBOY_WRITE_REQUEST:
address = recv_buffer[0] | ((uint16_t)recv_buffer[1]<<8);
length = recv_buffer[2] | ((uint16_t)recv_buffer[3]<<8);
write_flash(address, length, (uint8_t*)&recv_buffer[4]);
@@ -992,10 +806,6 @@ int main (void)
comm_start(COMMAND_CHR_WRITE_DONE, 0);
break;
- case COMMAND_FDS_READ_REQUEST:
- read_fds_send(recv_buffer[0], recv_buffer[1]);
- break;
-
case COMMAND_MIRRORING_REQUEST:
get_mirroring();
break;
diff --git a/famicom-dumper.hex b/famicom-dumper.hex
index b06123a..2967035 100644
--- a/famicom-dumper.hex
+++ b/famicom-dumper.hex
@@ -2,7 +2,7 @@
:100010000C94D8010C94D8010C94D8010C94D801FC
:100020000C94D8010C94D8010C94D8010C94D801EC
:100030000C94D8010C94D8010C94D8010C94D801DC
-:100040000C94D8010C94D8010C94060B0C94D80194
+:100040000C94D8010C94D8010C94DF020C94D801C4
:100050000C94D8010C94D8010C94D8010C94D801BC
:100060000C94D8010C94D8010C94D8010C94D801AC
:100070000C94D8010C94D8010C94D8010C94D8019C
@@ -56,349 +56,218 @@
:10037000818540450187C047804641860182C04251
:10038000804341830041C1818180404011241FBED0
:10039000CFEFD0E1DEBFCDBF19E0A0E0B1E001C0FA
-:1003A0001D92AD30B107E1F70E9434030C948F0C1D
+:1003A0001D92AD30B107E1F70E9408030C947E085E
:1003B0000C9400008BBB95BB95FD06C0809162003C
:1003C0008061809362000895809162008F7E8093A7
:1003D000620008950F931F938C01809162008E7FBD
:1003E00080936200809162008260809362008FEF50
:1003F00082BB11BA80916200806880936200C8015C
:100400000E94DA018091620081608093620017FD92
-:1004100011C08091620082608093620082E08A95C0
-:10042000F1F780B3909162009260909362001F9107
-:100430000F910895809162008D7F80936200EECFCE
-:100440000F931F9302E610E0F80120812E7F208396
-:100450002081226020832FEF22BB11BA0E94DA0193
-:10046000F80180818F7D808382E08A95F1F780B3E7
-:100470009081906290839081916090831F910F9101
-:1004800008950F931F9302E610E0F80120812E7F5C
-:1004900020832081226020832FEF22BB11BA20818C
-:1004A000206820830E94DA01F801808181608083C6
-:1004B00080818D7F8083C39AC49882E08A95F1F70A
-:1004C00080B3908192609083C49A1F910F91089598
-:1004D0000F931F938C01809162008E7F8093620046
-:1004E000809162008260809362008FEF81BB809177
-:1004F00062008F778093620062BBC8010E94DA01BC
-:1005000082E08A95F1F780916200816080936200B9
-:1005100017FD29C08091620082608093620092E0A2
-:10052000892F8A95F1F7809162008E7F8093620017
-:10053000809162008260809362009A95F1F78091C9
-:1005400062008068809362008FEF82BB11BA80E006
-:1005500090E00E94DA0180916200816080936200E5
-:100560001F910F910895809162008D7F80936200AA
-:10057000D6CF90680E9468020895EF92FF920F9381
-:100580001F93E62EBC9ABB9AC49AC39A02E610E067
-:10059000F8012081226020832081206820830E942E
-:1005A000DA01FF24FA94F1BAE2BAF801808181609D
-:1005B000808380818D7F808382E0982F9A95F1F7E8
-:1005C000C3988A95F1F7C39A80E090E00E94DA011F
-:1005D000F801808182608083F2BA11BA1F910F9175
-:1005E000FF90EF9008951F9382E164E070E00E9415
-:1005F000A90BC69A80E090E00E94DA0112E0812FF8
-:100600008A95F1F781B18695869581700E94910B4C
-:1006100080E094E00E94DA01812F8A95F1F781B1A0
-:100620008695869581700E94910B80E098E00E94EB
-:10063000DA01812F8A95F1F781B1869586958170CF
-:100640000E94910B80E09CE00E94DA011A95F1F77C
-:1006500081B18695869581700E94910B80E090E033
-:100660000E94DA011F9108952F923F924F925F925C
-:100670006F927F928F929F92AF92BF92CF92DF92B2
-:10068000EF92FF920F931F93DF93CF93CDB7DEB717
-:10069000A9970FB6F894DEBF0FBECDBF78940E9425
-:1006A0002F0B87B3806C87BB87EB809361001FEFB4
-:1006B0001093620012981A9A12BB11BA80E090E06F
-:1006C0000E94DA011ABB14BBBC98C498C798C6989C
-:1006D0000E947A0B80E060E070E00E94A90B48EC79
-:1006E000642E712C8FB589628FBD21E02EBD21E073
-:1006F00030E040E050E0E0E060E070E080910B012D
-:10070000882309F042C08FB589628FBD81E08EBD1C
-:10071000203197E2390790E0490790E0590708F443
-:1007200070C0EE2309F072C06F5F7F4F6E367105A7
-:100730000CF0E1E06436710534F06456704079BD28
-:1007400068BD6C597F4FEE2309F46AC08EE690E0D5
-:10075000861B970B853191050CF062C08B3091059B
-:100760002CF024E130E0281B390BC901880F991FB8
-:10077000909379008093780020E030E040E050E0F2
-:1007800080910B01882309F4BECF10920B011092C7
-:10079000790010927800809178009091790099BD4D
-:1007A00088BD88B599B58FBD35E03EBD80910C01FF
-:1007B000823209F42CC68332C0F5893009F437C17E
-:1007C0008A3008F09FC0863009F498C1873009F458
-:1007D00062C1853009F086CF80E065E070E00E945C
-:1007E000A90B82E00E94910B8CEF0E94910B87E095
-:1007F0000E94910B8CEF0E94910B87E00E94910B5D
-:1008000071CF2F5F3F4F4F4F5F4F78CF6150704098
-:1008100009F090CF20E030E040E050E0E0E06ECF23
-:1008200020E030E040E050E069CF863209F4F5C3C3
-:10083000873208F055C0843209F418C5853208F4AF
-:10084000C5C4C79A80E090E060EF0E94B9028AEACE
-:100850009AE06AEA0E94B90285E595E065E50E94A2
-:10086000B9028AEA9AE060E80E94B9028AEA9AE04C
-:100870006AEA0E94B90285E595E065E50E94B90241
-:1008800080E090E060E30E94B9021DBC1CBC8CB506
-:100890009DB58D589B45E8F4EE24EA94FE2C02C0E9
-:1008A000E12EFF2480E090E80E94EA01182F3FEF3C
-:1008B000E3163FEFF30641F090E0EFEFEE22FF2466
-:1008C0008E159F0509F40BC68CB59DB58D589B45BB
-:1008D00038F38CE260E070E00E94A90BC79802CF69
-:1008E000883209F458C3883208F4FAC28D3209F408
-:1008F0000BC18E3F09F0F6CEF89414BEE0E0F8EF9D
-:100900000995F0CE8D30C1F18E3008F0BFC58B3027
-:1009100009F0E8CEE0900D01F0900E0190910F01EA
-:10092000809110018D8F1C8E092F10E02C8D3D8D34
-:10093000022B132BC69A8CE0B8010E94A90B01155B
-:100940001105A1F0FF8E1E8EFF248E8D9F8DE82A4B
-:10095000F92AC7010E9420020E94910B0150104009
-:100960000894E11CF11C0115110599F780E090E055
-:100970000E94DA01C698B6CE30910D0120910E0189
-:1009800090910F01809110018DA31CA2E92EFF24EC
-:100990008CA19DA1E82AF92AC79AE114F10409F46F
-:1009A0003FC02FA31EA2032F10E0EEA1FFA10E2B2C
-:1009B0001F2BCC24DD24F601E35FFE4F9481809150
-:1009C00062008E7F809362008091620082608093DB
-:1009D0006200FFEFF1BB92BBC601800F911F0E9426
-:1009E000DA01809162008B7F8093620082E08A95B9
-:1009F000F1F7809162008460809362002FEF22BB48
-:100A000011BA80E090E00E94DA018091620081607A
-:100A1000809362000894C11CD11CEC14FD0459F6AB
-:100A2000C7988EE060E070E00E94A90B5BCE309129
-:100A30000D0120910E0190910F01809110018D8781
-:100A40001C86E92EFF24EC85FD85EE2AFF2AC79A35
-:100A5000E114F104C9F02F871E86032F10E02E85C4
-:100A60003F85022B132BCC24DD24F601E35FFE4FE0
-:100A7000C601800F911F64810E9468020894C11C06
-:100A8000D11CEC14FD0489F7C7988AE060E070E09F
-:100A90000E94A90B27CEE0900D01F0900E019091DD
-:100AA0000F01809110018D831C82092F10E08C8131
-:100AB0009D81082B192BC69A88E0B8010E94A90BCA
-:100AC0000115110509F452CFFF821E82FF24EE8129
-:100AD000FF81EE2AFF2AC7010E94EA010E94910BC2
-:100AE000015010400894E11CF11C0115110599F703
-:100AF00080E090E00E94DA01C698F4CD81E060E0E9
-:100B000070E00E94A90BEECDC0900D0130900E0157
-:100B100082E290E460E00E94680283E290E460E098
-:100B20000E94680283E290E461E00E94680285E22C
-:100B300090E46EE20E94680282E390E40E94EA017F
-:100B400080FDFACF85E290E46EE20E94680220E424
-:100B50003FE1C3010197F1F721503040D1F785E221
-:100B600090E46FE20E94680285E290E46DE20E94E8
-:100B7000680224EC39E0C3010197F1F721503040BD
-:100B8000D1F785E290E46EE20E94680285E290E48B
-:100B90006FE20E94680285E290E46DE20E946802C2
-:100BA00082E390E40E94EA0181FDFACF28EB3BE06A
-:100BB000C3010197F1F721503040D1F7C69ACC20FC
-:100BC00029F48EE26AE370E00E94A90B85E290E4CA
-:100BD0006DE60E94680285E290E46DEE0E94680274
-:100BE00000E0EE24FF240699FECF81E390E40E940A
-:100BF000EA01182F80E390E40E94EA01829586952D
-:100C000086958170082BCC2009F4DEC0069BFECFB0
-:100C10000894E11CF11C38E3E316F10421F785E2A6
-:100C200090E46DEE0E9468020699FECF81E390E4A5
-:100C30000E94EA0184E290E46FEF0E946802069B42
-:100C4000FECF80E390E40E94EA01182F12951695DA
-:100C500016951170102BCC2051F482958F7091E075
-:100C6000892781700E94910B812F0E94910B112383
-:100C700009F08CC08C2C99245401A30CB11CE2E027
-:100C8000AE16B1040CF040C45401DD24D3943324D7
-:100C900081E090E08A159B050CF078C085E290E435
-:100CA0006DE20E94680282E390E40E94EA0181FD05
-:100CB000FACF80E197E20197F1F7DC1428F08EE299
-:100CC00062E170E00E94A90B85E290E46DE60E946B
-:100CD000680285E290E46DEE0E94680200E019A6C9
-:100CE00018A6EE24FF240699FECF81E390E40E942B
-:100CF000EA01182F80E390E40E94EA01829586952C
-:100D000086958170082BDC1418F0812F0E94910BBE
-:100D1000E8A5F9A53D9709F44DC028A539A52E30C1
-:100D2000310509F44CC0069BFECF88A599A5019614
-:100D300099A788A74097B9F685E290E46DEE0E94E6
-:100D400068020699FECF81E390E40E94EA0184E202
-:100D500090E46FEF0E946802069BFECF80E390E470
-:100D60000E94EA01182F1295169516951170102BF6
-:100D7000DC1450F082958F7091E0892781700E9479
-:100D8000910B812F0E94910B112311F185E290E4C8
-:100D900066E20E94680224EF31E0C3010197F1F797
-:100DA00021503040D1F78FE260E070E00E94A90B43
-:100DB000C69898CC812F90E0E82AF92AB4CF512E1A
-:100DC0004424E428F528AFCF812F0E94910B1ECF39
-:100DD000D3948D2D90E08A159B055CF0332420E0A0
-:100DE00030E05901A80CB91C8A159B050CF456CFAC
-:100DF000CDCF85E290E46DE20E94680282E390E448
-:100E00000E94EA0181FDFACF80E197E20197F1F7B4
-:100E1000DC1430F0B7016D5F7F4F8EE20E94A90BAA
-:100E200085E290E46DE60E94680285E290E46DEE52
-:100E30000E9468020894E11CF11CE114F104F9F02D
-:100E4000AA24BB240699FECF81E390E40E94EA0124
-:100E5000082F80E390E40E94EA01829586958695AA
-:100E60008170182BDC1418F0802F0E94910B069BC8
-:100E7000FECF0894A11CB11CAE14BF0418F385E288
-:100E800090E46DEE0E9468020699FECF81E390E443
-:100E90000E94EA0184E290E46FEF0E946802069BE0
-:100EA000FECF80E390E40E94EA01082F02950695A8
-:100EB00006950170012BDC1450F082958F70E1E0F3
-:100EC0008E2781700E94910B802F0E94910B00232E
-:100ED00009F05CCFD394232D30E08D2D90E081CFAD
-:100EE00090910D0180910E0189871886E92EFF24CB
-:100EF00028853985E22AF32A90910F01809110010B
-:100F00008B871A86092F10E08A859B85082B192B61
-:100F1000C69A9FEF92BB11BA80916200806880935D
-:100F2000620080916200816080936200F7FCE6C2FB
-:100F3000809162008260809362000115110509F4BE
-:100F40005FC380E090E0EBBAF5BA22E02A95F1F7B2
-:100F500060B30E947E0C015010400894E11CF11C0B
-:100F60000115110581F7182F092F80916200826009
-:100F70008093620080E090E00E94DA0188E062E005
-:100F800070E00E94A90B812F0E94910B802F0E947C
-:100F9000910BC698A7CB30910D0120910E01909135
-:100FA0000F018091100189A318A2E92EFF24E8A166
-:100FB000F9A1EE2AFF2AC69AE114F10409F423C329
-:100FC0002BA31AA2C32EDD242AA13BA1C22AD32A15
-:100FD00000E010E0C6010E942002682FC8010E94B4
-:100FE0007E0C8C010894E108F1080894C11CD11C06
-:100FF000E114F10479F7F82E80E090E00E94DA0124
-:101000008CE062E070E00E94A90B8F2D0E94910B92
-:10101000812F0E94910BC69865CB30910D012091D4
-:101020000E0190910F0180911001898F188E092F68
-:1010300010E0888D998D082B192BC79A0115110581
-:1010400009F4DEC12B8F1A8EE32FF0E02A8D3B8D41
-:10105000E22BF32BF9A7E8A791E1892E91E0992ED5
-:1010600019822224332428A539A5207CA8A4B9A458
-:101070006401FF2405C0C501807C2817390781F46D
-:10108000F60180818F3F09F0F3940894A11CB11CF4
-:10109000015010400894C11CD11C0115110559F7CD
-:1010A000FF2041F40115110509F4AAC1B9A6A8A6AB
-:1010B0004601D9CF80E090E060EF0E94B9028AEA51
-:1010C0009AE06AEA0E94B90285E595E065E50E942A
-:1010D000B90280E090E065E20E94B9026F2D615094
-:1010E00080E090E00E94B90209C028A539A52F5FD1
-:1010F0003F4F39A728A70894811C911CF4016081F7
-:101100006F3F51F088A599A50E94B902F401F081C2
-:10111000F983FA9428A439A4FF2039F780E090E0FD
-:1011200069E20E94B9021DBC1CBCC101906899A76C
-:1011300088A78CB59DB584589E4108F040C088A50D
-:1011400099A50E94EA01E82E88A599A50E94EA01C6
-:10115000F82E88A599A50E94EA01982E8F2D8E253C
-:1011600086FF18C0892D8F2586FF14C0E1FCC4C1FD
-:10117000E5FEDFCF8AE263E070E00E94A90B8E2DCE
-:101180000E94910B8F2D0E94910B892D0E94910B33
-:10119000C798A8CA88A599A50E94EA01F82E88A533
-:1011A00099A50E94EA01F81621F6F981FF1509F4C4
-:1011B00079CF8CB59DB584589E4108F4C0CF8AE2A2
-:1011C00060E070E00E94A90BC7988CCAC79A80E0C3
-:1011D00090E060EF0E94BD028AEA9AE06AEA0E940B
-:1011E000BD0285E595E065E50E94BD028AEA9AE0C8
-:1011F00060E80E94BD028AEA9AE06AEA0E94BD02A3
-:1012000085E595E065E50E94BD0280E090E060E341
-:101210000E94BD021DBC1CBC8CB59DB58D589B4564
-:1012200008F057CBEE24EA94FE2C02C0E12EFF24F6
-:1012300080E090E80E944102182F2FEFE2162FEF76
-:10124000F20649F090E0E826F92634E4E322FF2490
-:10125000EF2809F444C18CB59DB58D589B4530F3FA
-:101260008CE260E070E00E94A90B38CB30910D0158
-:1012700020910E0190910F01809110018D8B1C8A9D
-:10128000092F10E08C899D89082B192BC79A01150D
-:10129000110509F4B5C02F8B1E8AE32FF0E02E89CB
-:1012A0003F89E22BF32BF9A7E8A721E1822E21E069
-:1012B000922E33241B821A8228A539A5207CA8A44B
-:1012C000B9A46401FF2405C0C501807C2817390733
-:1012D00081F4F60180818F3F09F0F3940894A11CFA
-:1012E000B11C015010400894C11CD11C01151105FE
-:1012F00059F7FF2041F40115110509F481C0B9A681
-:10130000A8A64601D9CF80E090E060EF0E94BD0220
-:101310008AEA9AE06AEA0E94BD0285E595E065E501
-:101320000E94BD0280E090E065E20E94BD026F2D48
-:10133000615080E090E00E94BD0208C088A599A598
-:10134000019699A788A70894811C911CF4016081DB
-:101350006F3F59F088A599A50E94BD02F401308025
-:10136000FA9428A539A53B832A83FF2039F780E02A
-:1013700090E069E20E94BD021DBC1CBCEA81FB81B9
-:10138000F068F9A7E8A78CB59DB584589E4100F593
-:1013900088A599A50E944102E82E88A599A50E94DA
-:1013A0004102F82E88A599A50E944102982E8F2D02
-:1013B0008E2586FF14C0892D8F2586FF10C0E1FC85
-:1013C0009BC0E5FCD7CE8CB59DB584589E4100F3FB
-:1013D0008AE260E070E00E94A90BC79883C988A5E3
-:1013E00099A50E944102F82E88A599A50E94410264
-:1013F000F81649F63F1439F60115110509F07FCFAB
-:101400008AE060E070E00E94A90BC7986BC9E09089
-:101410000D01F0900E0190910F0180911001898BC8
-:10142000188A092F10E088899989082B192BC69AE8
-:10143000C49AC39ABC9ABB9A88E0B8010E94A90BCF
-:1014400001151105A1F0FB8A1A8AFF24EA89FB899C
-:10145000EE2AFF2AC7010E9441020E94910B01500F
-:1014600010400894E11CF11C0115110599F780E06A
-:1014700090E00E94DA0180916200826080936200B5
-:10148000C49AC39ABC98C498C6982CC9813121F1DA
-:10149000833109F027C9C79AC69A809162008E7F6E
-:1014A000809362008091620082608093620028EEE7
-:1014B00033E0C3010197F1F721503040D1F780911B
-:1014C0006200816080936200C798C69884E160E002
-:1014D00070E00E94A90B06C90E94F30203C91F3FD6
-:1014E00009F483C08BE261E070E00E94A90B812FB8
-:1014F0000E94910BC798F6C889E23DCE80916200A8
-:101500008D7F8093620019CD85E290E46DE20E94A8
-:10151000680282E390E40E94EA0181FDFACF80E153
-:1015200097E20197F1F7F1E0FC1528F08EE264E014
-:1015300070E00E94A90B85E290E46DE60E946802CB
-:1015400085E290E46DEE0E94680200E0EE24FF2444
-:101550000699FECF81E390E40E94EA01182F80E310
-:1015600090E40E94EA018295869586958170082B09
-:1015700021E02C1508F040C0069BFECF0894E11C2A
-:10158000F11C32E0E316F10419F785E290E46DEE08
-:101590000E9468020699FECF81E390E40E94EA016E
-:1015A00084E290E46FEF0E946802069BFECF80E326
-:1015B00090E40E94EA01182F129516951695117065
-:1015C000102B91E09C1548F082958F7089278170CF
-:1015D0000E94910B812F0E94910B112309F0D6CB11
-:1015E00082E0D82E82E090E055CB8AE060E070E0A7
-:1015F0000E94A90BC79876C8812F0E94910BBCCF7F
-:1016000010E000E0B2CCFF2410E0F6CC1F920F9265
-:101610000FB60F9211242F933F934F935F936F93C5
-:101620007F938F939F93AF93BF93EF93FF935F9BB2
-:1016300005C08CB10E94CE0B5F99FBCFFF91EF915B
-:10164000BF91AF919F918F917F916F915F914F91DA
-:101650003F912F910F900FBE0F901F90189581E032
-:1016600089B91092900088E98AB9E5E9F0E08081B3
-:101670008660808308955D9BFECF8CB90895982F76
-:1016800092959F709A3070F4905D8F708A3040F41C
-:10169000805D5D9BFECF9CB95D9BFECF8CB90895AC
-:1016A000895CF7CF995CF1CFFC018081882339F008
-:1016B0005D9BFECF8CB9319680818823C9F7089550
-:1016C0009C01411551056105710599F080E090E09C
-:1016D000A0E0B0E0F901E80FF91FE0815D9BFECFCB
-:1016E000ECB90196A11DB11D84179507A607B70790
-:1016F00088F30895109206011092050110920B01D3
-:101700001092080108951F93182F80910001612FF6
-:101710000E94760C80930001812F0E943B0B1F9149
-:1017200008950E94830B809103019091040101961A
-:1017300090930401809303012091010130910201F3
-:101740008217930709F00895809100010E943B0BD6
-:101750000895FF920F931F93F82E8B0110920001B2
-:1017600086E40E94830B8F2D0E94830B802F0E94A2
-:10177000830B812F0E94830B1093020100930101C0
-:101780001092040110920301012B21F480910001B9
-:101790000E943B0B1F910F91FF9008951F93182FEC
-:1017A00080910801882321F0163411F01F910895CB
-:1017B000109208018091050190910601892B21F476
-:1017C0001092070110920B0180910701612F0E9476
-:1017D000760C282F80930701409105015091060156
-:1017E0004130510509F43FC041305105B0F4163481
-:1017F00061F081E08093080182E060E070E00E9487
-:10180000A90B40910501509106014F5F5F4F509326
-:101810000601409305011F9108954230510561F181
-:1018200043305105B1F1FA01349788E0E030F80710
-:1018300008F046C08091090190910A01E817F90764
-:10184000D8F18091090190910A01E817F907E9F6AA
-:10185000222309F042C081E080930B01109206011F
-:1018600010920501A3CF10930C014F5F5F4F50936F
-:10187000060140930501CFCF812F90E090930A019C
-:10188000809309014F5F5F4F50930601409305011C
-:10189000C2CF2091090130910A01912F80E0822B63
-:1018A000932B90930A01809309014F5F5F4F5093F0
-:1018B000060140930501AFCFE35FFE4F1083A5CF34
-:1018C000109206011092050181E08093080184E0E6
-:1018D00060E070E00E94A90B69CF81E0809308016D
-:1018E00083E060E070E00E94A90BB8CF6827ECE8C5
-:1018F000F0E0E60FF11DE4918E2F0895E62FF0E061
-:10190000E827F927F070EE0FFF1FE457FE4F2591EF
-:101910003491892F992728273927C9010895F894E8
-:02192000FFCFF7
+:1004100015C080916200826080936200C39AC49A82
+:1004200082E08A95F1F780B3909162009260909398
+:100430006200C39AC49A1F910F910895809162003F
+:100440008D7F80936200C39AC498EACF0F931F9365
+:1004500002E610E0F80120812E7F208320812260B7
+:1004600020832FEF22BB11BA0E94DA01F8018081AC
+:100470008F7D808382E08A95F1F780B390819062CE
+:1004800090839081916090831F910F9108950F93B5
+:100490001F938C01809162008E7F80936200809117
+:1004A00062008260809362008FEF81BB8091620066
+:1004B0008F778093620062BBC8010E94DA0182E0FC
+:1004C0008A95F1F78091620081608093620017FD48
+:1004D0002DC080916200826080936200C39AC49AAA
+:1004E00092E0892F8A95F1F7809162008E7F809348
+:1004F000620080916200826080936200C39AC49A15
+:100500009A95F1F7809162008068809362008FEF86
+:1005100082BB11BA80E090E00E94DA018091620013
+:100520008160809362001F910F9108958091620015
+:100530008D7F80936200C398C49AD2CF1F9382E1CB
+:1005400064E070E00E949807C69A80E090E00E9404
+:10055000DA0112E0812F8A95F1F781B186958695AF
+:1005600081700E94800780E094E00E94DA01812F70
+:100570008A95F1F781B18695869581700E948007F2
+:1005800080E098E00E94DA01812F8A95F1F781B12D
+:100590008695869581700E94800780E09CE00E948D
+:1005A000DA011A95F1F781B18695869581700E94DE
+:1005B000800780E090E00E94DA011F9108951F9269
+:1005C0000F920FB60F9211242F933F934F935F9387
+:1005D0006F937F938F939F93AF93BF93EF93FF930B
+:1005E0005F9B05C08CB10E94BD075F99FBCFFF9157
+:1005F000EF91BF91AF919F918F917F916F915F919B
+:100600004F913F912F910F900FBE0F901F90189513
+:100610002F923F924F925F926F927F928F929F9212
+:10062000AF92BF92CF92DF92EF92FF920F931F9300
+:10063000DF93CF93CDB7DEB76E970FB6F894DEBFDA
+:100640000FBECDBF78940E941E0787B3806C87BB16
+:1006500087EB809361001FEF1093620012981A9A43
+:1006600012BB11BA80E090E00E94DA011ABB14BB01
+:1006700087B3886187BB88B3886188BBC798C698F1
+:100680000E94690780E060E070E00E9498072224E1
+:10069000239438EC432E512C8FB589628FBD2EBC2C
+:1006A00021E030E040E050E0E0E060E070E0809188
+:1006B0000B01882309F041C08FB589628FBD2EBC24
+:1006C000203187E2380780E0480780E0580708F4C7
+:1006D0006FC0EE2309F076C06F5F7F4F6E367105F5
+:1006E0000CF0E1E06436710534F06456704079BD79
+:1006F00068BD6C597F4FEE2309F45FC08EE690E031
+:10070000861B970B853191050CF057C08B309105F6
+:100710002CF024E130E0281B390BC901880F991F08
+:10072000909379008093780020E030E040E050E042
+:1007300080910B01882309F4BFCF10920B01109216
+:10074000790010927800809178009091790099BD9D
+:1007500088BD88B599B58FBD35E03EBD80910C014F
+:10076000833109F456C18431B8F5893009F41DC1CB
+:100770008A3008F083C0863009F46CC18730D1F12B
+:10078000853009F089CF80E065E070E00E9498072D
+:1007900082E00E9480078CEF0E94800787E00E9421
+:1007A00080078CEF0E94800787E00E94800774CF4B
+:1007B0002F5F3F4F4F4F5F4F7ACF20E030E040E058
+:1007C00050E075CF6150704009F08CCF20E030E0F0
+:1007D00040E050E0E0E06BCF853209F4B5C28632EC
+:1007E000D8F5833209F4B0C2843208F0D6C182321F
+:1007F00009F052CFE0900D01F0900E0190910F01A1
+:10080000809110018A831982092F10E089819A81D1
+:10081000082B192BC69A88E0B8010E949807011589
+:100820001105A1F0FC821B82FF24EB81FC81EE2AE2
+:10083000FF2AC7010E94EA010E9480070150104070
+:100840000894E11CF11C0115110599F780E090E076
+:100850000E94DA01C69820CF873209F443C187325B
+:1008600008F49BC1883209F4FBC08E3F09F014CF15
+:10087000F89414BEE0E0F8EF09950ECF8D30D1F179
+:100880008131A9F18B3009F007CFE0900D01F09094
+:100890000E0190910F01809110018A8B198A092F06
+:1008A00010E029893A89022B132BC69A8CE0B801F3
+:1008B0000E9498070115110549F2FC8A1B8AFF2442
+:1008C0008B899C89E82AF92AC7010E9426020E9486
+:1008D0008007015010400894E11CF11C011511051E
+:1008E00099F780E090E00E94DA01C698D5CE0E9488
+:1008F0009E02D2CE30910D0120910E0190910F01F8
+:10090000809110018A8F198EE92EFF24898D9A8D8E
+:10091000E82AF92AC79AE114F10409F43FC02C8FA0
+:100920001B8E032F10E0EB8DFC8D0E2B1F2BCC2488
+:10093000DD24F601E35FFE4F9481809162008E7F9B
+:100940008093620080916200826080936200FFEF7A
+:10095000F1BB92BBC601800F911F0E94DA0180910A
+:1009600062008B7F8093620082E08A95F1F780912C
+:1009700062008460809362002FEF22BB11BA80E096
+:1009800090E00E94DA0180916200816080936200B1
+:100990000894C11CD11CEC14FD0459F6C7988EE0D4
+:1009A00060E070E00E94980777CE30910D012091B1
+:1009B0000E0190910F01809110018A871986E92E0E
+:1009C000FF24E985FA85EE2AFF2AC79AE114F1048B
+:1009D000C9F02C871B86032F10E02B853C85022B4A
+:1009E000132BCC24DD24F601E35FFE4FC601800FFC
+:1009F000911F64810E9447020894C11CD11CCE142F
+:100A0000DF0489F7C7988AE060E070E00E949807E9
+:100A100043CEC79AC69A809162008E7F809362000F
+:100A20008091620082608093620028EE33E0C20110
+:100A30000197F1F721503040D1F780916200816039
+:100A400080936200C798C69884E160E070E00E94DD
+:100A5000980722CE81E060E070E00E9498071CCEEB
+:100A600030910D0120910E0190910F0180911001A4
+:100A70008E8B1D8AE92EFF24ED89FE89EE2AFF2A3E
+:100A8000C69AE114F10409F4CFC1288F1F8AC32E3E
+:100A9000DD242F89388DC22AD32A00E010E0C60158
+:100AA0000E942602682FC8010E946D088C010894DC
+:100AB000E108F1080894C11CD11CE114F10479F794
+:100AC000F82E80E090E00E94DA018CE062E070E0B5
+:100AD0000E9498078F2D0E948007812F0E94800717
+:100AE000C698DACD90910D0180910E018E831D8202
+:100AF000E92EFF242D813E81E22AF32A90910F01F5
+:100B00008091100188871F82092F10E08F819885BE
+:100B1000082B192BC69A9FEF92BB11BA80916200E5
+:100B2000806880936200809162008160809362009F
+:100B3000F7FC65C1809162008260809362000115BC
+:100B4000110509F465C180E090E0EBBAF5BA22E046
+:100B50002A95F1F760B30E946D0801501040089487
+:100B6000E11CF11C0115110581F7182F092F809147
+:100B7000620082608093620080E090E00E94DA016F
+:100B800088E062E070E00E949807812F0E94800751
+:100B9000802F0E948007C6987FCD30910D01209153
+:100BA0000E0190910F01809110018E871D86092FF3
+:100BB00010E08D859E85082B192BC79A011511050C
+:100BC00009F435C1288B1F86E32FF0E02F85388983
+:100BD000E22BF32BFE8FED8F81E1882E81E0982EA2
+:100BE0003324662477242D8D3E8D207CAD8CBE8CE5
+:100BF0006401FF2405C0C501807C2817390781F4F2
+:100C0000F60180818F3F09F0F3940894A11CB11C78
+:100C1000015010400894C11CD11C0115110559F751
+:100C2000FF2041F40115110509F401C1BE8EAD8EFE
+:100C30004601D9CF80E090E860EF0E9447028AEA3F
+:100C40009AE86AEA0E94470285E595E865E50E9410
+:100C5000470280E090E865E20E9447026F2D6150F4
+:100C600080E090E80E94470209C02D8D3E8D2F5FE5
+:100C70003F4F3E8F2D8F0894811C911CF4016081A1
+:100C80006F3F51F08D8D9E8D90680E944702F40158
+:100C90003080FA946D8C7E8CFF2039F780E090E8EC
+:100CA00069E20E9447021DBC1CBCC30190689E8F74
+:100CB0008D8F8CB59DB584589E4108F03EC08D8DBA
+:100CC0009E8D0E94EA01E82E8D8D9E8D0E94EA0184
+:100CD000F82E8D8D9E8D0E94EA01982E8F2D8E25E7
+:100CE00086FF18C0892D8F2586FF14C0E1FC93C0B4
+:100CF000E5FEDFCF8AE263E070E00E9498078E2D68
+:100D00000E9480078F2D0E948007892D0E948007F6
+:100D1000C798C2CC8D8D9E8D0E94EA01F82E8D8DD4
+:100D20009E8D0E94EA01F81621F63F1409F47ACF4D
+:100D30008CB59DB584589E4110F28AE260E070E067
+:100D40000E949807C798A8CCC79A80E090E860EF07
+:100D50000E9447028AEA9AE86AEA0E94470285E509
+:100D600095E865E50E9447028AEA9AE860E80E94F1
+:100D700047028AEA9AE86AEA0E94470285E595E80E
+:100D800065E50E94470280E090E860E30E94470228
+:100D90001DBC1CBC8CB59DB58D589B45E8F4EE245C
+:100DA000EA94FE2C02C0E12EFF2480E090E80E942D
+:100DB000EA01182F8FEFE8168FEFF80641F0812F28
+:100DC00090E0EFEFEE22FF248E159F0561F08CB5C9
+:100DD0009DB58D589B4538F38CE260E070E00E9431
+:100DE0009807C79859CC1F3FC1F08BE261E070E0D3
+:100DF0000E949807812F0E948007C7984DCC809150
+:100E000062008D7F809362000115110509F09BCE71
+:100E100010E000E0ACCE89E26ECF8AE060E070E0E6
+:100E20000E949807C79838CCFF2410E04ACE8AE089
+:100E300060E070E00E949807C7982ECC81E089B9E5
+:100E40001092900088E98AB9E5E9F0E08081866037
+:100E5000808308955D9BFECF8CB90895982F92955D
+:100E60009F709A3070F4905D8F708A3040F4805D8E
+:100E70005D9BFECF9CB95D9BFECF8CB90895895CCC
+:100E8000F7CF995CF1CFFC018081882339F05D9B1D
+:100E9000FECF8CB9319680818823C9F708959C01D3
+:100EA000411551056105710599F080E090E0A0E0E1
+:100EB000B0E0F901E80FF91FE0815D9BFECFECB9CE
+:100EC0000196A11DB11D84179507A607B70788F3E2
+:100ED0000895109206011092050110920B011092D4
+:100EE000080108951F93182F80910001612F0E941F
+:100EF000650880930001812F0E942A071F910895A1
+:100F00000E947207809103019091040101969093D1
+:100F100004018093030120910101309102018217A5
+:100F2000930709F00895809100010E942A0708950F
+:100F3000FF920F931F93F82E8B011092000186E40D
+:100F40000E9472078F2D0E947207802F0E947207E5
+:100F5000812F0E94720710930201009301011092E9
+:100F6000040110920301012B21F4809100010E94E1
+:100F70002A071F910F91FF9008951F93182F8091BA
+:100F80000801882321F0163411F01F910895109262
+:100F900008018091050190910601892B21F410929E
+:100FA000070110920B0180910701612F0E946508D3
+:100FB000282F80930701409105015091060141308F
+:100FC000510509F43FC041305105B0F4163461F0C9
+:100FD00081E08093080182E060E070E00E94980761
+:100FE00040910501509106014F5F5F4F50930601FC
+:100FF000409305011F9108954230510561F143303E
+:101000005105B1F1FA01349788E0E030F80708F0B3
+:1010100046C08091090190910A01E817F907D8F1BB
+:101020008091090190910A01E817F907E9F6222356
+:1010300009F042C081E080930B01109206011092EA
+:101040000501A3CF10930C014F5F5F4F5093060132
+:1010500040930501CFCF812F90E090930A018093B8
+:1010600009014F5F5F4F5093060140930501C2CFC6
+:101070002091090130910A01912F80E0822B932B5E
+:1010800090930A01809309014F5F5F4F50930601CF
+:1010900040930501AFCFE35FFE4F1083A5CF1092C1
+:1010A00006011092050181E08093080184E060E070
+:1010B00070E00E94980769CF81E08093080183E087
+:1010C00060E070E00E949807B8CF6827ECE8F0E095
+:1010D000E60FF11DE4918E2F0895E62FF0E0E8274A
+:1010E000F927F070EE0FFF1FE457FE4F2591349162
+:1010F000892F992728273927C9010895F894FFCF08
:00000001FF