avr/nano: add third srf05
authorErik Andresen <erik@vontaene.de>
Wed, 31 May 2017 18:27:22 +0000 (20:27 +0200)
committerErik Andresen <erik@vontaene.de>
Wed, 31 May 2017 18:27:22 +0000 (20:27 +0200)
avr/nano/main.c
avr/nano/main.hex

index 51cd145..5ba3082 100644 (file)
  * 0x02 Distance left LSB
  * 0x03 Distance right MSB
  * 0x04 Distance right LSB
- * 0x05 Distance forward MSB
- * 0x06 Distance forward LSB
+ * 0x05 Distance forward1 MSB
+ * 0x06 Distance forward1 LSB
  * 0x07 Distance backward MSB
  * 0x08 Distance backward LSB
- * 0x15 Distance forward MSB (read only)
- * 0x16 Distance forward LSB (read only)
- * 0x17 Distance backward MSB (read only)
- * 0x18 Distance backward LSB (read only)
  * 0x09 Voltage MSB
  * 0x0A Voltage LSB
+ * 0x0B Distance forward2 MSB
+ * 0x0C Distance forward2 LSB
+ *
+ * 0x15 Distance forward1 MSB (read only)
+ * 0x16 Distance forward1 LSB (read only)
+ * 0x17 Distance backward MSB (read only)
+ * 0x18 Distance backward LSB (read only)
+ * 0x19 Distance forward2 MSB (read only)
+ * 0x1A Distance forward2 LSB (read only)
  *
  * 0xff Bootloader
  */
@@ -37,11 +42,14 @@ static volatile uint8_t ireg=0;
 static volatile uint8_t bootloader=0;
 static volatile uint16_t dist_left=0;
 static volatile uint16_t dist_right=0;
-static volatile uint16_t dist_forward=0;
+static volatile uint16_t dist_forward1=0;
+static volatile uint16_t dist_forward2=0;
 static volatile uint16_t dist_backward=0;
-static volatile uint8_t start_dist_fwd=0;
+static volatile uint8_t start_dist_fwd1=0;
+static volatile uint8_t start_dist_fwd2=0;
 static volatile uint8_t start_dist_bwd=0;
 static volatile uint16_t voltage=0;
+static volatile uint8_t pind_pre=0;
 
 ISR(TWI_vect)
 {
@@ -58,8 +66,9 @@ ISR(TWI_vect)
                                case 0x00: // register select
                                        ireg = TWDR;
 
-                                       if (ireg == 0x05) start_dist_fwd=1;
+                                       if (ireg == 0x05) start_dist_fwd1=1;
                                        if (ireg == 0x07) start_dist_bwd=1;
+                                       if (ireg == 0x09) start_dist_fwd2=1;
 
                                        ireg--; // because we do ireg++ below
                                        TWI_ACK;
@@ -92,12 +101,12 @@ ISR(TWI_vect)
                                        TWDR = tmp16;
                                        TWI_ACK;
                                        break;
-                               case 0x05: // Distance forward MSB
-                                       tmp16 = dist_forward;
+                               case 0x05: // Distance forward1 MSB
+                                       tmp16 = dist_forward1;
                                        TWDR = tmp16>>8;
                                        TWI_ACK;
                                        break;
-                               case 0x06: // Distance forward LSB
+                               case 0x06: // Distance forward1 LSB
                                        TWDR = tmp16;
                                        TWI_ACK;
                                        break;
@@ -110,12 +119,30 @@ ISR(TWI_vect)
                                        TWDR = tmp16;
                                        TWI_ACK;
                                        break;
-                               case 0x15: // Distance forward MSB
-                                       tmp16 = dist_forward;
+                               case 0x09: // Voltage MSB
+                                       tmp16 = voltage;
+                                       TWDR = tmp16>>8;
+                                       TWI_ACK;
+                                       break;
+                               case 0x0A: // Voltage LSB
+                                       TWDR = tmp16;
+                                       TWI_ACK;
+                                       break;
+                               case 0x0B: // Distance forward2 MSB
+                                       tmp16 = dist_forward2;
                                        TWDR = tmp16>>8;
                                        TWI_ACK;
                                        break;
-                               case 0x16: // Distance forward LSB
+                               case 0x0C: // Distance forward2 LSB
+                                       TWDR = tmp16;
+                                       TWI_ACK;
+                                       break;
+                               case 0x15: // Distance forward1 MSB
+                                       tmp16 = dist_forward1;
+                                       TWDR = tmp16>>8;
+                                       TWI_ACK;
+                                       break;
+                               case 0x16: // Distance forward1 LSB
                                        TWDR = tmp16;
                                        TWI_ACK;
                                        break;
@@ -128,12 +155,12 @@ ISR(TWI_vect)
                                        TWDR = tmp16;
                                        TWI_ACK;
                                        break;
-                               case 0x09: // Voltage MSB
-                                       tmp16 = voltage;
+                               case 0x19: // Distance forward2 MSB
+                                       tmp16 = dist_forward2;
                                        TWDR = tmp16>>8;
                                        TWI_ACK;
                                        break;
-                               case 0x0A: // Voltage LSB
+                               case 0x1A: // Distance forward2 LSB
                                        TWDR = tmp16;
                                        TWI_ACK;
                                        break;
@@ -208,9 +235,9 @@ ISR(INT0_vect) {
                t_start = t_now;
        } else {
                t_diff = t_now - t_start;
-               dist_forward = t_diff*2.7586 + 0.5; // t [µs] / 580 = mm
+               dist_forward1 = t_diff*2.7586 + 0.5; // t [µs] / 580 = mm
                // disable this interrupt
-               EIMSK |= (1 << INT0);
+               EIMSK &= ~(1 << INT0);
        }
 }
 
@@ -227,11 +254,34 @@ ISR(INT1_vect) {
                t_diff = t_now - t_start;
                dist_backward = t_diff*2.7586 + 0.5; // t [µs] / 580 = mm
                // disable this interrupt
-               EIMSK |= (1 << INT1);
+               EIMSK &= ~(1 << INT1);
        }
 }
 
 
+ISR(PCINT2_vect) {
+       uint8_t pind_cur = PIND;
+
+       if ((pind_cur ^ pind_pre) & (1<<4)) { // PCINT20
+               static uint16_t t_start=0;
+               uint16_t t_now = TCNT1;
+               uint16_t t_diff;
+
+               if (bit_is_set(pind_cur, 4)) { // high level
+                       // start timer
+                       t_start = t_now;
+               } else {
+                       t_diff = t_now - t_start;
+                       dist_forward2 = t_diff*2.7586 + 0.5; // t [µs] / 580 = mm
+                       // disable this interrupt
+                       PCMSK2 &= ~(1 << PCINT20);
+               }
+       }
+
+       pind_pre = pind_cur;
+}
+
+
 int main(void) {
        bootloader = 0x00;
        setup_uart(9600);
@@ -247,6 +297,7 @@ int main(void) {
 
        // External Interrupts
        EICRA = (1 << ISC10) | (1 << ISC00);
+       PCICR = (1 << PCIE2);
 
        printf("\r\nStart\r\n");
 
@@ -274,9 +325,9 @@ int main(void) {
                                break;
                }
 
-               if (start_dist_fwd) {
-                       start_dist_fwd = 0;
-                       dist_forward = 0;
+               if (start_dist_fwd1) {
+                       start_dist_fwd1 = 0;
+                       dist_forward1 = 0;
 
                        DDRD |= (1 << 2);
                        PORTD |= (1 << 2);
@@ -284,6 +335,7 @@ int main(void) {
                        PORTD &= ~(1 << 2);
                        DDRD &= ~(1 << 2);
                        // wait for interrupt
+                       EIFR &= (1 << INTF0); // clear old interrupt before enabling
                        EIMSK |= (1 << INT0);
                }
                if (start_dist_bwd) {
@@ -296,8 +348,23 @@ int main(void) {
                        PORTD &= ~(1 << 3);
                        DDRD &= ~(1 << 3);
                        // wait for interrupt
+                       EIFR &= (1 << INTF1); // clear old interrupt before enabling
                        EIMSK |= (1 << INT1);
                }
+               if (start_dist_fwd2) {
+                       start_dist_fwd2 = 0;
+                       dist_forward2 = 0;
+
+                       // PD4 = PCINT20
+                       DDRD |= (1 << 4);
+                       PORTD |= (1 << 4);
+                       _delay_us(10);
+                       PORTD &= ~(1 << 4);
+                       DDRD &= ~(1 << 4);
+                       // wait for interrupt
+                       pind_pre = PIND;
+                       PCMSK2 |= (1 << PCINT20);
+               }
 
                sleep_mode();
        }
index eb18ba2..364e7b3 100644 (file)
-:100000000C9458000C943F010C948A010C947500D8\r
-:100010000C9475000C9475000C9475000C9475008C\r
-:100020000C9475000C9475000C9475000C9475007C\r
-:100030000C9475000C9475000C9475000C9475006C\r
-:100040000C9475000C9475000C94D5010C947500FB\r
-:100050000C9475000C9475000C9475000C9475004C\r
-:100060000C9477000C947500C600E500CB00E50009\r
-:10007000D600E500DB00E500E000E500EB00EB006A\r
-:10008000EB00EB00EB00EB00EB00EB00EB00EB0018\r
-:10009000D600E500DB00E5004546476566670020C1\r
-:1000A0002B2D2E3031323334353637383968000055\r
-:1000B00011241FBECFEFD8E0DEBFCDBF11E0A0E01E\r
-:1000C000B1E0E4EEF1E102C005900D92A031B1077C\r
-:1000D000D9F721E0A0E1B1E001C01D92A939B20732\r
-:1000E000E1F70E94DE020C94F0080C9400001F92CD\r
-:1000F0000F920FB60F9211248F939F93AF93BF93DC\r
-:10010000EF93FF938091B900887F803879F048F4AD\r
-:10011000803609F06BC085EC8093BC0010922301FF\r
-:100120006DC0883A39F1883B29F160C08091230184\r
-:10013000882341F08F3F09F050C08091BB0080932D\r
-:1001400022014BC08091BB00809323018091230149\r
-:10015000853019F481E08093190180912301873063\r
-:1001600019F481E0809318018091230181508093DC\r
-:1001700023012FC08091230190E0FC013197E831E9\r
-:10018000F10548F5EC5CFF4F0C946B068091200163\r
-:100190009091210104C080911E0190911F018093D4\r
-:1001A0001401909315019093BB0013C080911C0122\r
-:1001B00090911D01F4CF80911A0190911B01EFCF16\r
-:1001C0008091160190911701EACF809114018093DC\r
-:1001D000BB0085EC03C01092BB0085E88093BC0097\r
-:1001E000809123018F5F8093230108C08091BC0020\r
-:1001F0008B7E8093BC0085EC8093BC00FF91EF91D7\r
-:10020000BF91AF919F918F910F900FBE0F901F9054\r
-:10021000189593E890937A0080937C0080917C00FD\r
-:10022000806480937C0080917A00806480937A005F\r
-:1002300080917A0086FDFCCF8091780090917900C2\r
-:1002400045E080E090E020917A00206420937A00DD\r
-:1002500020917A0026FDFCCF209178003091790022\r
-:10026000820F931F415079F720917A002F772093C6\r
-:100270007A0065E070E00E943806CB0108951F9275\r
-:100280000F920FB60F9211242F933F934F935F93CA\r
-:100290006F937F938F939F93AF93BF93EF93FF934E\r
-:1002A00080918400909185004A9B05C09093130132\r
-:1002B000809312011EC02091120130911301BC01E4\r
-:1002C000621B730B80E090E00E94470527EE3CE83C\r
-:1002D00040E350E40E94D50520E030E040E05FE3D9\r
-:1002E0000E94B7040E941B0570931D0160931C01BE\r
-:1002F000E89AFF91EF91BF91AF919F918F917F917C\r
-:100300006F915F914F913F912F910F900FBE0F9082\r
-:100310001F9018951F920F920FB60F9211242F93D2\r
-:100320003F934F935F936F937F938F939F93AF937D\r
-:10033000BF93EF93FF9380918400909185004B9B36\r
-:1003400005C090931101809310011EC020911001EF\r
-:1003500030911101BC01621B730B80E090E00E94A0\r
-:10036000470527EE3CE840E350E40E94D50520E035\r
-:1003700030E040E05FE30E94B7040E941B057093E9\r
-:100380001B0160931A01E99AFF91EF91BF91AF9120\r
-:100390009F918F917F916F915F914F913F912F919D\r
-:1003A0000F900FBE0F901F9018951F920F920FB6CF\r
-:1003B0000F9211248F939F93EF93FF938091C0002E\r
-:1003C00087FF17C0E0912601F09127018091C600B8\r
-:1003D000808381E0EB38F80730F43196F093270101\r
-:1003E000E093260106C088E291E090932701809374\r
-:1003F0002601FF91EF919F918F910F900FBE0F906B\r
-:100400001F9018959C01E1ECF0E080818861808369\r
-:10041000808180688083E2ECF0E080818660808368\r
-:1004200040E050E084E0220F331F441F551F8A959F\r
-:10043000D1F760E074E284EF90E00E944C06DA01AC\r
-:10044000C9010197A109B109892F9A2FAB2FBB27A9\r
-:10045000A7FDBA958093C50021502093C40088E27F\r
-:1004600091E090932501809324019093270180933C\r
-:10047000260108952091C00025FFFCCFFC0180815A\r
-:100480008093C6000895CF93DF931F92CDB7DEB758\r
-:100490008983CE0101960E943A0280E090E00F909D\r
-:1004A000DF91CF910895CF93DF93EC01CE01219698\r
-:1004B000FC012081222319F00E943A02F7CFDF913C\r
-:1004C000CF9108958091C00087FFFCCF8091C60036\r
-:1004D00090E008950C9462026AE672E083E492E090\r
-:1004E0000C949E06CF93DF93FC01E253FF4FA08153\r
-:1004F000B181EC01C453DF4F28813981A217B307C2\r
-:10050000B9F02091C00025FF13C02C912093C600A4\r
-:1005100020813181AC0145535F4F2417350718F412\r
-:100520002F5F3F4F03C09C0128593F4F31832083E9\r
-:10053000E0912401F09125012091260130912701BD\r
-:100540002E173F07C1F1DC01AC59BF4FCD91DC91B3\r
-:100550001197208128836D917C9111979C012B52DA\r
-:100560003F4FE9013881EB012881321307C09C011C\r
-:100570002C523F4FE90148814F5F48839C012D5920\r
-:100580003F4F6217730728F4EB012196CD93DC935C\r
-:1005900002C08D939C93D1E0EB38FD0730F4319687\r
-:1005A000F0932501E093240106C088E291E0909346\r
-:1005B000250180932401DF91CF91089510922201AB\r
-:1005C00080E895E20E9402020E946C0282E580931C\r
-:1005D000BA008091BC008B7E8093BC0085EC809338\r
-:1005E000BC001092800084E08093810085E08093BD\r
-:1005F000690086E091E00E941B0783B7817F83BF7B\r
-:100600007894C0E0D8E180912301833081F050F4E8\r
-:10061000813089F580E00E94090190932101809347\r
-:10062000200129C0893059F08F3FF1F024C081E0CA\r
-:100630000E94090190931F0180931E011CC082E05B\r
-:100640000E940901BC0180E090E00E94470528E477\r
-:1006500031EE4AEB5FE30E94D5050E941B057093C3\r
-:1006600017016093160107C080912201853A19F4A1\r
-:10067000F894FE01099580911901882379F0109270\r
-:10068000190110921D0110921C01529A5A9AF5E319\r
-:10069000FA95F1F700005A985298E89A809118015B\r
-:1006A000882379F01092180110921B0110921A0100\r
-:1006B000539A5B9A85E38A95F1F700005B9853980B\r
-:1006C000E99A83B7816083BF889583B78E7F83BFA4\r
-:1006D0009ACF6F927F929F92AF92BF92CF92DF920A\r
-:1006E000EF92FF920F931F93CF93DF93CDB7DEB7B7\r
-:1006F0002C970FB6F894DEBF0FBECDBF8C017B01E7\r
-:100700003A01FC0117821682838181FF19C1CE0153\r
-:1007100001965C01F801D380F701D3FC2591D3FE4B\r
-:1007200021917F01222309F407C1253249F4D3FC2A\r
-:100730002591D3FE21917F01253211F0912C1BC010\r
-:10074000B801822F90E00E94E90663013601E2CFF2\r
-:10075000222309F4F1C0622F70E08FE990E02C872A\r
-:100760000E9493062C85892B49F0F701D3FC259133\r
-:10077000D3FE21917F0197FEEBCF0CC0233221F4F1\r
-:10078000F92DF0619F2EF1CF2C3639F4292D2068F8\r
-:10079000922EEBCF222309F4CFC0622F70E088E9BC\r
-:1007A00090E02C870E9493062C85892B41F06301F1\r
-:1007B000F4E0CF0ED11CB8018FE390E012C02336D5\r
-:1007C00041F0233789F0233521F5F92DF1609F2E73\r
-:1007D0000BC0630122E0C20ED11CB801F30180817D\r
-:1007E00091810E94E906B2CF630122E0C20ED11CC2\r
-:1007F000F30160807180F30190FC859190FE8191FE\r
-:100800003F01882309F4A2CFB80190E00E94E906D5\r
-:10081000F2CF243611F0293639F5630197FE09C06D\r
-:10082000F4E0CF0ED11CF30160817181828193814C\r
-:100830000AC0F2E0CF0ED11CF301608171818827DC\r
-:1008400077FD8095982FF92DFF7E9F2E97FF09C089\r
-:1008500090958095709561957F4F8F4F9F4FF06475\r
-:100860009F2E2AE030E038C02037A1F040F4283530\r
-:10087000D1F02F3609F060C028E030E019C02537EC\r
-:1008800019F0283751F058C0292D2F7E922E2AE0DA\r
-:1008900030E00EC0892D8061982E992D9462992E9A\r
-:1008A00020E130E005C0E92DE4609E2E20E132E039\r
-:1008B000630197FE09C0F4E0CF0ED11CF301608103\r
-:1008C00071818281938108C0F2E0CF0ED11CF301C7\r
-:1008D0006081718180E090E0A5010E944807782E38\r
-:1008E0007A1896FE05C0B8018DE290E00E94E906F4\r
-:1008F00094FE16C0FE01E70DF11D8081803381F06A\r
-:10090000B80180E390E00E94E90692FE09C0292D1B\r
-:100910002072822F90E0B801885A9F4F0E94E9060A\r
-:100920007A94F501E70DF11D8081B80190E00E94F5\r
-:10093000E9067110F5CF0ACFF8018681978102C0D0\r
-:100940008FEF9FEF2C960FB6F894DEBF0FBECDBF92\r
-:10095000DF91CF911F910F91FF90EF90DF90CF909B\r
-:10096000BF90AF909F907F906F9008955058BB2795\r
-:10097000AA270ED0E0C0D1D030F0D6D020F031F48C\r
-:100980009F3F11F41EF4C6C00EF4E095E7FBBCC017\r
-:10099000E92FE2D080F3BA1762077307840795073F\r
-:1009A00018F071F49EF5FAC00EF4E0950B2EBA2FF4\r
-:1009B000A02D0B01B90190010C01CA01A001112465\r
-:1009C000FF27591B99F0593F50F4503E68F11A1611\r
-:1009D000F040A22F232F342F4427585FF3CF4695A2\r
-:1009E00037952795A795F0405395C9F77EF41F16C4\r
-:1009F000BA0B620B730B840BBAF09150A1F0FF0F8E\r
-:100A0000BB1F661F771F881FC2F70EC0BA0F621F79\r
-:100A1000731F841F48F4879577956795B795F79569\r
-:100A20009E3F08F0B3CF9395880F08F09927EE0FFB\r
-:100A300097958795089598D088F09F5790F0B92F93\r
-:100A40009927B751A0F0D1F0660F771F881F991F23\r
-:100A50001AF0BA95C9F712C0B13081F09FD0B1E059\r
-:100A600008959CC0672F782F8827B85F39F0B93F69\r
-:100A7000CCF3869577956795B395D9F73EF4909525\r
-:100A80008095709561957F4F8F4F9F4F0895E894A3\r
-:100A900009C097FB3EF490958095709561957F4FC6\r
-:100AA0008F4F9F4F9923A9F0F92F96E9BB27939574\r
-:100AB000F695879577956795B795F111F8CFFAF484\r
-:100AC000BB0F11F460FF1BC06F5F7F4F8F4F9F4FB5\r
-:100AD00016C0882311F096E911C0772321F09EE813\r
-:100AE000872F762F05C0662371F096E8862F70E079\r
-:100AF00060E02AF09A95660F771F881FDAF7880F53\r
-:100B00009695879597F9089597F99F6780E870E023\r
-:100B100060E008959FEF80EC089500240A94161673\r
-:100B2000170618060906089500240A9412161306DB\r
-:100B3000140605060895092E0394000C11F4882369\r
-:100B400052F0BB0F40F4BF2B11F460FF04C06F5F85\r
-:100B50007F4F8F4F9F4F089557FD9058440F551F5B\r
-:100B600059F05F3F71F04795880F97FB991F61F02F\r
-:100B70009F3F79F087950895121613061406551FA6\r
-:100B8000F2CF4695F1DF08C0161617061806991F12\r
-:100B9000F1CF86957105610508940895E894BB2707\r
-:100BA00066277727CB0197F908950BD0C4CFB5DF1F\r
-:100BB00028F0BADF18F0952309F0A6CFABCF1124A7\r
-:100BC000EECFCADFA0F3959FD1F3950F50E0551FEC\r
-:100BD000629FF001729FBB27F00DB11D639FAA2792\r
-:100BE000F00DB11DAA1F649F6627B00DA11D661FE1\r
-:100BF000829F2227B00DA11D621F739FB00DA11D02\r
-:100C0000621F839FA00D611D221F749F3327A00DBB\r
-:100C1000611D231F849F600D211D822F762F6A2F57\r
-:100C200011249F5750408AF0E1F088234AF0EE0FDC\r
-:100C3000FF1FBB1F661F771F881F91505040A9F7E9\r
-:100C40009E3F510570F060CFAACF5F3FECF3983E16\r
-:100C5000DCF3869577956795B795F795E7959F5F50\r
-:100C6000C1F7FE2B880F911D9695879597F90895EA\r
-:100C7000AA1BBB1B51E107C0AA1FBB1FA617B707C2\r
-:100C800010F0A61BB70B881F991F5A95A9F78095DE\r
-:100C90009095BC01CD010895052E97FB1EF400949C\r
-:100CA0000E94630657FD07D00E94710607FC03D01F\r
-:100CB0004EF40C94630650954095309521953F4F26\r
-:100CC0004F4F5F4F089590958095709561957F4F38\r
-:100CD0008F4F9F4F0895EE0FFF1F0590F491E02D69\r
-:100CE0000994A1E21A2EAA1BBB1BFD010DC0AA1F6D\r
-:100CF000BB1FEE1FFF1FA217B307E407F50720F085\r
-:100D0000A21BB30BE40BF50B661F771F881F991FFF\r
-:100D10001A9469F760957095809590959B01AC0148\r
-:100D2000BD01CF010895FC010590061621F00020B9\r
-:100D3000D9F7C00108953197CF0108950F931F93FC\r
-:100D4000CF93DF93EC018B01009731F461157105AE\r
-:100D500019F480E090E038C06EE070E081E090E04F\r
-:100D60000E94A607FC010097A1F380E88383011588\r
-:100D7000110571F01387028781E8838380918F01C9\r
-:100D800090919001892B21F4F0939001E0938F01D1\r
-:100D90002097C9F0D187C087838182608383809147\r
-:100DA000910190919201892B71F4F0939201E0935B\r
-:100DB00091018091930190919401892B21F4F093FA\r
-:100DC0009401E0939301CF01DF91CF911F910F9197\r
-:100DD00008950F931F93CF93DF93182F092FEB01E3\r
-:100DE0008B8181FD03C08FEF9FEF20C082FF10C079\r
-:100DF0004E815F812C813D81421753077CF4E8814D\r
-:100E0000F9819F012F5F3F4F39832883108306C0EC\r
-:100E1000E885F985812F0995892B29F72E813F8156\r
-:100E20002F5F3F4F3F832E83812F902FDF91CF91F4\r
-:100E30001F910F9108950F931F93CF93DF93E0912C\r
-:100E40009101F0919201238121FF1BC0EC0100E090\r
-:100E500010E089916091910170919201DB011896E7\r
-:100E6000ED91FC911997882331F00995892B89F32D\r
-:100E70000FEF1FEFEECF8AE00995892B11F4C8011F\r
-:100E800002C08FEF9FEFDF91CF911F910F910895D7\r
-:100E9000FA01AA27283051F1203181F1E8946F93AB\r
-:100EA0006E7F6E5F7F4F8F4F9F4FAF4FB1E03ED051\r
-:100EB000B4E03CD0670F781F891F9A1FA11D680FEF\r
-:100EC000791F8A1F911DA11D6A0F711D811D911D22\r
-:100ED000A11D20D009F468943F912AE0269F112497\r
-:100EE0003019305D3193DEF6CF010895462F4770FB\r
-:100EF000405D4193B3E00FD0C9F7F6CF462F4F7056\r
-:100F0000405D4A3318F0495D31FD4052419302D0B3\r
-:100F1000A9F7EACFB4E0A695979587957795679559\r
-:100F2000BA95C9F700976105710508959B01AC0159\r
-:100F30000A2E06945795479537952795BA95C9F780\r
-:100F4000620F731F841F951FA01D08950F931F9399\r
-:100F5000CF93DF93869F8001879F100D969F100D82\r
-:100F60001124C8010E94C207EC01009729F0A801D2\r
-:100F700060E070E00E94E908CE01DF91CF911F91FF\r
-:100F80000F910895CF93DF938230910510F482E0A2\r
-:100F900090E0E0919701F091980120E030E0A0E02E\r
-:100FA000B0E0309739F14081518148175907B8F0C6\r
-:100FB0004817590771F482819381109729F013968D\r
-:100FC0009C938E9312972CC09093980180939701D5\r
-:100FD00027C02115310531F04217530718F0A90138\r
-:100FE000DB0101C0EF019A01BD01DF010280F38145\r
-:100FF000E02DD7CF21153105F9F0281B390B24300E\r
-:10100000310580F48A819B816115710521F0FB0116\r
-:101010009383828304C09093980180939701FE018B\r
-:10102000329644C0FE01E20FF31F81939193225048\r
-:101030003109398328833AC0209195013091960176\r
-:10104000232B41F42091020130910301309396014A\r
-:101050002093950120910001309101012115310566\r
-:1010600041F42DB73EB74091040150910501241B76\r
-:10107000350BE0919501F0919601E217F307A0F48A\r
-:101080002E1B3F0B2817390778F0AC014E5F5F4FDE\r
-:101090002417350748F04E0F5F1F50939601409379\r
-:1010A00095018193919302C0E0E0F0E0CF01DF91E0\r
-:1010B000CF910895CF93DF93009709F487C0FC0187\r
-:1010C000329713821282C0919701D0919801209794\r
-:1010D00081F420813181280F391F809195019091F1\r
-:1010E00096018217930779F5F0939601E0939501A5\r
-:1010F0006DC0DE0120E030E0AE17BF0750F412965D\r
-:101100004D915C9113979D014115510509F1DA014B\r
-:10111000F3CFB383A28340815181840F951F8A1737\r
-:101120009B0771F48D919C911197840F951F0296E6\r
-:101130009183808312968D919C91139793838283E0\r
-:101140002115310529F4F0939801E09397013EC0F1\r
-:10115000D9011396FC93EE9312974D915D91A40FD4\r
-:10116000B51FEA17FB0779F480819181840F951FE1\r
-:101170000296D90111969C938E9382819381139646\r
-:101180009C938E931297E0E0F0E08A819B81009718\r
-:1011900019F0FE01EC01F9CFCE01029628813981C8\r
-:1011A000820F931F209195013091960128173907DE\r
-:1011B00069F4309729F4109298011092970102C0B7\r
-:1011C00013821282D0939601C0939501DF91CF9143\r
-:1011D0000895DC0101C06D9341505040E0F708953F\r
-:0411E000F894FFCFB1\r
-:1011E4000000990120000D0A53746172740D00000F\r
+:100000000C945A000C944E010C9498010C947700B7\r
+:100010000C9477000C94E2010C9477000C94770018\r
+:100020000C9477000C9477000C9477000C94770074\r
+:100030000C9477000C9477000C9477000C94770064\r
+:100040000C9477000C9477000C9443020C94770086\r
+:100050000C9477000C9477000C9477000C94770044\r
+:100060000C9479000C947700D000F400D500F400D3\r
+:10007000E500F400EA00F400E000F400EF00F40012\r
+:10008000FA00FA00FA00FA00FA00FA00FA00FA00A0\r
+:10009000E500F400EA00F400EF00F400454647658F\r
+:1000A000666700202B2D2E30313233343536373809\r
+:1000B0003968000011241FBECFEFD8E0DEBFCDBFEE\r
+:1000C00011E0A0E0B1E0EEE6F3E102C005900D9290\r
+:1000D000A031B107D9F721E0A0E1B1E001C01D9244\r
+:1000E000AF39B207E1F70E944D030C94B5090C94A7\r
+:1000F00000001F920F920FB60F9211248F939F93BF\r
+:10010000AF93BF93EF93FF938091B900887F8038BE\r
+:1001100079F048F4803609F078C085EC8093BC0013\r
+:10012000109229017AC0883A71F1883B61F16DC063\r
+:1001300080912901882341F08F3F09F05DC08091B3\r
+:10014000BB008093280158C08091BB008093290197\r
+:1001500080912901853019F481E080931D018091FF\r
+:100160002901873019F481E080931B0180912901D6\r
+:10017000893019F481E080931C018091290181501C\r
+:100180008093290135C0E09129018E2F90E0FC0178\r
+:100190003197EA31F10570F5EC5CFF4F0C94EA06FB\r
+:1001A000809126019091270104C0809124019091B3\r
+:1001B000250180931601909317019093BB0018C0FE\r
+:1001C0008091190190911A01F4CF809122019091B0\r
+:1001D0002301EFCF80911E0190911F01EACF809102\r
+:1001E000200190912101E5CF809116018093BB0001\r
+:1001F00085EC03C01092BB0085E88093BC00809121\r
+:1002000029018F5F8093290108C08091BC008B7EFB\r
+:100210008093BC0085EC8093BC00FF91EF91BF916F\r
+:10022000AF919F918F910F900FBE0F901F901895D7\r
+:1002300093E890937A0080937C0080917C008064A6\r
+:1002400080937C0080917A00806480937A00809112\r
+:100250007A0086FDFCCF809178009091790025E0AE\r
+:1002600080E090E030917A00306430937A003091F1\r
+:100270007A0036FDFCCF4091780050917900840FD0\r
+:10028000951F215079F720917A002F7720937A00DB\r
+:1002900065E070E00E94B706CB0108951F920F92AF\r
+:1002A0000FB60F9211242F933F934F935F936F9349\r
+:1002B0007F938F939F93AF93BF93EF93FF9360913F\r
+:1002C0008400709185004A9B05C07093150160936E\r
+:1002D00014011DC08091140190911501681B790BC8\r
+:1002E00080E090E00E94BC0527EE3CE840E350E44B\r
+:1002F0000E944A0620E030E040E05FE30E942105D2\r
+:100300000E948D057093230160932201E898FF916C\r
+:10031000EF91BF91AF919F918F917F916F915F917D\r
+:100320004F913F912F910F900FBE0F901F901895F6\r
+:100330001F920F920FB60F9211242F933F934F935A\r
+:100340005F936F937F938F939F93AF93BF93EF933D\r
+:10035000FF9360918400709185004B9B05C0709362\r
+:100360001301609312011DC080911201909113013D\r
+:10037000681B790B80E090E00E94BC0527EE3CE80A\r
+:1003800040E350E40E944A0620E030E040E05FE3B2\r
+:100390000E9421050E948D0570931F0160931E012C\r
+:1003A000E998FF91EF91BF91AF919F918F917F91CC\r
+:1003B0006F915F914F913F912F910F900FBE0F90D2\r
+:1003C0001F9018951F920F920FB60F9211242F9322\r
+:1003D0003F934F935F936F937F938F939F93AF93CD\r
+:1003E000BF93EF93FF93CF93DF931F92CDB7DEB709\r
+:1003F00089B1898390911801892784FF2DC060916C\r
+:10040000840070918500898184FF05C0709311017B\r
+:100410006093100121C08091100190911101681B1F\r
+:10042000790B80E090E00E94BC0527EE3CE840E3B9\r
+:1004300050E40E944A0620E030E040E05FE30E9482\r
+:1004400021050E948D057093210160932001809108\r
+:100450006D008F7E80936D008981809318010F90CD\r
+:10046000DF91CF91FF91EF91BF91AF919F918F91CC\r
+:100470007F916F915F914F913F912F910F900FBEA0\r
+:100480000F901F9018951F920F920FB60F92112484\r
+:100490008F939F93EF93FF938091C00087FF17C0C6\r
+:1004A000E0912C01F0912D018091C600808381E0C4\r
+:1004B000E139F80730F43196F0932D01E0932C01E7\r
+:1004C00006C08EE291E090932D0180932C01FF9164\r
+:1004D000EF919F918F910F900FBE0F901F901895E5\r
+:1004E0009C01E1ECF0E080818861808380818068FC\r
+:1004F0008083E2ECF0E0808186608083C901A0E027\r
+:10050000B0E09C01AD0184E0220F331F441F551F52\r
+:100510008A95D1F760E074E284EF90E00E94CB0608\r
+:10052000DA01C9010197A109B109892F9A2FAB2FCF\r
+:10053000BB27A7FDBA958093C50021502093C40026\r
+:100540008EE291E090932B0180932A0190932D01EC\r
+:1005500080932C0108952091C00025FFFCCFFC0161\r
+:1005600080818093C6000895CF93DF931F92CDB70B\r
+:10057000DEB78983CE0101960E94AB0280E090E055\r
+:100580000F90DF91CF910895CF93DF93EC01CE01CF\r
+:100590002196FC012081222319F00E94AB02F7CFA3\r
+:1005A000DF91CF9108958091C00087FFFCCF8091AB\r
+:1005B000C60090E008950C94D3026BED72E084EBDA\r
+:1005C00092E00C945407CF93DF93FC01E253FF4F6A\r
+:1005D000A081B181EC01C453DF4F28813981A2177A\r
+:1005E000B307B9F02091C00025FF13C02C912093D0\r
+:1005F000C60020813181AC0145535F4F2417350778\r
+:1006000018F42F5F3F4F03C09C0128593F4F31839F\r
+:100610002083E0912A01F0912B0120912C0130914F\r
+:100620002D012E173F07B1F1EC01CC59DF4FA88106\r
+:10063000B98120812C93688179819C012B523F4F95\r
+:10064000D9013C91DB012C91321307C0AC014C5213\r
+:100650005F4FDA012C912F5F2C939C012D593F4F56\r
+:100660006217730728F4DB011196B983A88302C0CF\r
+:1006700099838883B1E0E139FB0730F43196F09338\r
+:100680002B01E0932A0106C08EE291E090932B01AA\r
+:1006900080932A01DF91CF9108951092280180E87C\r
+:1006A00095E20E9470020E94DD0282E58093BA000A\r
+:1006B0008091BC008B7E8093BC0085EC8093BC0055\r
+:1006C0001092800084E08093810095E0909369000F\r
+:1006D0008093680086E091E00E94D70783B7817F0E\r
+:1006E00083BF7894C0E0D8E180912901833081F004\r
+:1006F00050F4813089F580E00E9418019093270121\r
+:100700008093260129C0893059F08F3FF1F024C031\r
+:1007100081E00E94180190932501809324011CC060\r
+:1007200082E00E941801BC0180E090E00E94BC05BC\r
+:1007300028E431EE4AEB5FE30E944A060E948D05F1\r
+:1007400070931A016093190107C080912801853ABE\r
+:1007500019F4F894FE01099580911D01882391F008\r
+:1007600010921D011092230110922201529A5A9A5E\r
+:10077000F5E3FA95F1F700005A9852988CB381701E\r
+:100780008CBBE89A80911B01882391F010921B0189\r
+:1007900010921F0110921E01539A5B9A85E38A956D\r
+:1007A000F1F700005B9853988CB382708CBBE99A88\r
+:1007B00080911C018823B1F010921C01109221013C\r
+:1007C00010922001549A5C9AE5E3EA95F1F7000053\r
+:1007D0005C98549889B18093180180916D00806174\r
+:1007E00080936D0083B7816083BF889583B78E7FC8\r
+:1007F00083BF7ACFACE0B0E0E0E0F4E00C94F40624\r
+:100800006C015B017A01FC0117821682838181FFF2\r
+:100810000EC1CE0101964C01F6010381F50103FDE5\r
+:10082000159103FF11915F01112309F4FCC01532EA\r
+:1008300049F403FD159103FF11915F01153211F089\r
+:1008400020E01BC0B601812F90E00E949F07370176\r
+:100850007301E2CF112309F4E6C0612F70E083EA4F\r
+:1008600090E02C870E9449072C85892B49F0F501DF\r
+:1008700003FD159103FF11915F0127FFEBCF09C025\r
+:10088000133229F01C3609F0D5C02068F0CF20E1E2\r
+:10089000EECF022F112309F4C6C0612F70E08CE95E\r
+:1008A00090E02C870E9449072C85892B41F0370165\r
+:1008B000F4E06F0E711CB6018FE390E011C01336A7\r
+:1008C00039F0133781F0133519F5022F01600BC091\r
+:1008D000370182E0680E711CB601F70180819181B9\r
+:1008E0000E949F07B5CF3701F2E06F0E711CF70130\r
+:1008F000E080F180F70100FD859100FF81917F018B\r
+:10090000882309F4A5CFB60190E00E949F07F2CF9B\r
+:10091000143611F0193629F5370127FF09C0F4E024\r
+:100920006F0E711CF70160817181828193810AC011\r
+:10093000F2E06F0E711CF70160817181072E000CCF\r
+:10094000880B990B022F0F7E97FF08C0909580951A\r
+:10095000709561957F4F8F4F9F4F00642AE030E084\r
+:1009600033C0103799F040F41835B1F01F3609F054\r
+:100970005AC028E030E014C0153719F0183741F09C\r
+:1009800052C0022F0F7E2AE030E00AC0022F006121\r
+:10099000046220E130E004C0022F046020E132E074\r
+:1009A000370107FF09C0F4E06F0E711CF701608189\r
+:1009B00071818281938108C0F2E06F0E711CF70192\r
+:1009C0006081718180E090E0A4010E940708182FE7\r
+:1009D000181906FF05C0B6018DE290E00E949F073E\r
+:1009E00004FF15C0FE01E10FF11D8081803379F015\r
+:1009F000B60180E390E00E949F0702FF08C00072EA\r
+:100A0000802F90E0B601885A9F4F0E949F07115097\r
+:100A1000F401E10FF11D8081B60190E00E949F0773\r
+:100A20001111F5CF15CFF6018681978105C08FEFA3\r
+:100A30009FEF02C0022F31CF2C96EEE00C941007EE\r
+:100A40005058BB27AA270E9438050C9410060E9414\r
+:100A5000020638F00E94090620F039F49F3F19F48D\r
+:100A600026F40C94FF050EF4E095E7FB0C94F905D1\r
+:100A7000E92F0E94210658F3BA176207730784070B\r
+:100A8000950720F079F4A6F50C9443060EF4E09552\r
+:100A90000B2EBA2FA02D0B01B90190010C01CA0138\r
+:100AA000A0011124FF27591B99F0593F50F4503EE3\r
+:100AB00068F11A16F040A22F232F342F4427585FD5\r
+:100AC000F3CF469537952795A795F0405395C9F7ED\r
+:100AD0007EF41F16BA0B620B730B840BBAF09150A5\r
+:100AE000A1F0FF0FBB1F661F771F881FC2F70EC044\r
+:100AF000BA0F621F731F841F48F487957795679517\r
+:100B0000B795F7959E3F08F0B0CF9395880F08F002\r
+:100B10009927EE0F9795879508950E94290688F0EA\r
+:100B20009F5798F0B92F9927B751B0F0E1F0660FB1\r
+:100B3000771F881F991F1AF0BA95C9F714C0B130F2\r
+:100B400091F00E944306B1E008950C944306672F8C\r
+:100B5000782F8827B85F39F0B93FCCF38695779521\r
+:100B60006795B395D9F73EF490958095709561950A\r
+:100B70007F4F8F4F9F4F0895E89409C097FB3EF435\r
+:100B800090958095709561957F4F8F4F9F4F9923DA\r
+:100B9000A9F0F92F96E9BB279395F6958795779558\r
+:100BA0006795B795F111F8CFFAF4BB0F11F460FF18\r
+:100BB0001BC06F5F7F4F8F4F9F4F16C0882311F070\r
+:100BC00096E911C0772321F09EE8872F762F05C084\r
+:100BD000662371F096E8862F70E060E02AF09A951F\r
+:100BE000660F771F881FDAF7880F9695879597F914\r
+:100BF000089597F99F6780E870E060E008959FEF9F\r
+:100C000080EC089500240A941616170618060906A3\r
+:100C1000089500240A941216130614060506089572\r
+:100C2000092E0394000C11F4882352F0BB0F40F4FA\r
+:100C3000BF2B11F460FF04C06F5F7F4F8F4F9F4F3A\r
+:100C4000089557FD9058440F551F59F05F3F71F0BC\r
+:100C50004795880F97FB991F61F09F3F79F0879523\r
+:100C60000895121613061406551FF2CF4695F1DFAC\r
+:100C700008C0161617061806991FF1CF869571053C\r
+:100C8000610508940895E894BB2766277727CB0170\r
+:100C900097F908950E945D060C9410060E940206C2\r
+:100CA00038F00E94090620F0952311F00C94F90504\r
+:100CB0000C94FF0511240C9444060E94210670F345\r
+:100CC000959FC1F3950F50E0551F629FF001729FF1\r
+:100CD000BB27F00DB11D639FAA27F00DB11DAA1F00\r
+:100CE000649F6627B00DA11D661F829F2227B00D4D\r
+:100CF000A11D621F739FB00DA11D621F839FA00DD8\r
+:100D0000611D221F749F3327A00D611D231F849F27\r
+:100D1000600D211D822F762F6A2F11249F5750407E\r
+:100D20009AF0F1F088234AF0EE0FFF1FBB1F661FF9\r
+:100D3000771F881F91505040A9F79E3F510580F0C2\r
+:100D40000C94F9050C9444065F3FE4F3983ED4F309\r
+:100D5000869577956795B795F795E7959F5FC1F766\r
+:100D6000FE2B880F911D9695879597F90895AA1BDC\r
+:100D7000BB1B51E107C0AA1FBB1FA617B70710F086\r
+:100D8000A61BB70B881F991F5A95A9F780959095B8\r
+:100D9000BC01CD010895052E97FB1EF400940E941E\r
+:100DA000E20657FD07D00E94270707FC03D04EF448\r
+:100DB0000C94E20650954095309521953F4F4F4F4A\r
+:100DC0005F4F089590958095709561957F4F8F4FF7\r
+:100DD0009F4F0895EE0FFF1F0590F491E02D0994A9\r
+:100DE0002F923F924F925F926F927F928F929F923B\r
+:100DF000AF92BF92CF92DF92EF92FF920F931F9329\r
+:100E0000CF93DF93CDB7DEB7CA1BDB0B0FB6F894D9\r
+:100E1000DEBF0FBECDBF09942A88398848885F8419\r
+:100E20006E847D848C849B84AA84B984C884DF808A\r
+:100E3000EE80FD800C811B81AA81B981CE0FD11D6E\r
+:100E40000FB6F894DEBF0FBECDBFED010895A1E24D\r
+:100E50001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F34\r
+:100E6000FF1FA217B307E407F50720F0A21BB30B7F\r
+:100E7000E40BF50B661F771F881F991F1A9469F7FB\r
+:100E800060957095809590959B01AC01BD01CF0157\r
+:100E90000895FC010590061621F00020D9F7C00145\r
+:100EA00008953197CF0108950F931F93CF93DF9348\r
+:100EB000009731F46115710519F480E090E03AC0B3\r
+:100EC0008B01EC016EE070E081E090E00E9465082B\r
+:100ED000FC01892B91F380E883830115110571F0E2\r
+:100EE0001387028781E88383809195019091960111\r
+:100EF000892B21F4F0939601E09395012097C9F096\r
+:100F0000D187C0878381826083838091970190918C\r
+:100F10009801892B71F4F0939801E09397018091E7\r
+:100F2000990190919A01892B21F4F0939A01E09311\r
+:100F30009901CF01DF91CF911F910F9108950F93E8\r
+:100F40001F93CF93DF93FB01238121FD03C08FEF1C\r
+:100F50009FEF28C022FF16C046815781248135812A\r
+:100F60004217530744F4A081B1819D012F5F3F4F89\r
+:100F7000318320838C93268137812F5F3F4F3783C6\r
+:100F8000268310C0EB01092F182F0084F185E02D76\r
+:100F90000995892BE1F68E819F8101969F838E832F\r
+:100FA000812F902FDF91CF911F910F9108950F9373\r
+:100FB0001F93CF93DF93E0919701F09198012381E4\r
+:100FC00021FF1BC08C01D0E0C0E0F80181918F01AE\r
+:100FD0006091970170919801DB011896ED91FC9159\r
+:100FE0001997882331F00995892B79F3DFEFCFEF3B\r
+:100FF000ECCF8AE00995892B19F08FEF9FEF02C0A3\r
+:101000008D2F9C2FDF91CF911F910F910895FA01A1\r
+:10101000AA27283051F1203181F1E8946F936E7F37\r
+:101020006E5F7F4F8F4F9F4FAF4FB1E03ED0B4E028\r
+:101030003CD0670F781F891F9A1FA11D680F791F69\r
+:101040008A1F911DA11D6A0F711D811D911DA11D7A\r
+:1010500020D009F468943F912AE0269F112430198A\r
+:10106000305D3193DEF6CF010895462F4770405D25\r
+:101070004193B3E00FD0C9F7F6CF462F4F70405DD4\r
+:101080004A3318F0495D31FD4052419302D0A9F72F\r
+:10109000EACFB4E0A6959795879577956795BA9529\r
+:1010A000C9F700976105710508959B01AC010A2EEF\r
+:1010B00006945795479537952795BA95C9F7620FC6\r
+:1010C000731F841F951FA01D08950F931F93CF9327\r
+:1010D000DF93869F8001879F100D969F100D11242E\r
+:1010E000C8010E948108EC01009729F0A80160E086\r
+:1010F00070E00E94AE09CE01DF91CF911F910F9158\r
+:101100000895CF93DF938230910510F482E090E050\r
+:10111000E0919D01F0919E0120E030E0C0E0D0E040\r
+:10112000309711F14081518148175907C0F0481795\r
+:10113000590761F482819381209719F09B838A83F8\r
+:101140002BC090939E0180939D0126C021153105EF\r
+:1011500019F04217530718F49A01BE01DF01EF019D\r
+:101160000280F381E02DDCCF2115310509F1281B28\r
+:10117000390B2430310590F412968D919C91139780\r
+:101180006115710521F0FB019383828304C0909364\r
+:101190009E0180939D01FD01329644C0FD01E20F46\r
+:1011A000F31F81939193225031092D933C933AC0C0\r
+:1011B00020919B0130919C01232B41F4209102014D\r
+:1011C0003091030130939C0120939B0120910001F9\r
+:1011D000309101012115310541F42DB73EB7409101\r
+:1011E000040150910501241B350BE0919B01F09106\r
+:1011F0009C01E217F307A0F42E1B3F0B28173907B9\r
+:1012000078F0AC014E5F5F4F2417350748F04E0F62\r
+:101210005F1F50939C0140939B018193919302C067\r
+:10122000E0E0F0E0CF01DF91CF9108950F931F939D\r
+:10123000CF93DF93009709F48CC0FC01329713829F\r
+:10124000128200919D0110919E010115110581F4FA\r
+:1012500020813181820F931F20919B0130919C014D\r
+:101260002817390779F5F0939C01E0939B0171C031\r
+:10127000D80140E050E0AE17BF0750F412962D9110\r
+:101280003C911397AD012115310509F1D901F3CF37\r
+:101290009D01DA013383228360817181860F971F5C\r
+:1012A0008217930769F4EC0128813981260F371FD3\r
+:1012B0002E5F3F4F318320838A819B81938382837A\r
+:1012C000452B29F4F0939E01E0939D0142C01396B3\r
+:1012D000FC93EE931297ED01499159919E01240FD1\r
+:1012E000351FE217F30771F480819181840F951FF8\r
+:1012F000029611969C938E938281938113969C9370\r
+:101300008E931297E0E0F0E0D80112968D919C91B7\r
+:101310001397009719F0F8018C01F6CF8D919C91ED\r
+:1013200098012E5F3F4F820F931F20919B013091B8\r
+:101330009C012817390769F4309729F410929E010F\r
+:1013400010929D0102C01382128210939C0100939F\r
+:101350009B01DF91CF911F910F910895DC0101C096\r
+:0E1360006D9341505040E0F70895F894FFCF90\r
+:10136E0000009F0120000D0A53746172740D00007D\r
 :00000001FF\r