Pierre Bourdin 9 mēneši atpakaļ
vecāks
revīzija
398317425a
4 mainītis faili ar 662 papildinājumiem un 45 dzēšanām
  1. BIN
      610-ReprogrammationM10.145.pdf
  2. 25 0
      README.md
  3. 108 45
      m10_freq.py
  4. 529 0
      test.hex

BIN
610-ReprogrammationM10.145.pdf


+ 25 - 0
README.md

@@ -0,0 +1,25 @@
+# m10_freq.py
+This is for M10
+
+## Change the frequency for example 427,850Mhz :
+```
+$ ./m10_freq.py writebin --input m10_trimble_404MHz.hex --out test.hex --frequency 427850
+```
+
+Check the patch :
+
+```
+$ diff m10_trimble_404MHz.hex test.hex 
+2c2
+< :1010100001A00C00FFFFFFFFFFFFFFFFFFFFFFFF2F
+---
+> :10101000CD5E0D00FFFFFFFFFFFFFFFFFFFFFFFFA4
+```
+
+## Read the actual frequency :
+```
+$ ./m10_freq.py readbin --input m10_trimble_404MHz_Id1.hex
+
+Reading the frequency value for M10...
+Frequency read : 404.0
+```

+ 108 - 45
m10_freq.py

@@ -1,39 +1,49 @@
 #!/bin/python3
 
 import argparse
+import sys
+import os
 
 # Create a parser
 parser = argparse.ArgumentParser(description='Patch a M10 firmware for specific frequenc.\nThis is for M10 based on MSP430F233.')
+parser.add_argument('--verbose', action='store_true', help='Print the details', default=False)
+
+# Lecture du binaire
+subparsers = parser.add_subparsers()
+p_readbin = subparsers.add_parser("readbin", help='Read the binary file')
+p_readbin.add_argument('--input', type=str, help='Input file')
+p_readbin.set_defaults(func="readbin")
+
+# Ecriture du binaire
+p_writebin = subparsers.add_parser("writebin", help='Write the binary file')
+p_writebin.set_defaults(func="writebin")
+p_writebin.add_argument('--input', type=str, help='Input file')
+p_writebin.add_argument('--output', type=str, help='Output file')
+p_writebin.add_argument('--frequency', type=int, help='Frequency in Hz')
 
-#
-# Add arguments
-parser.add_argument('--input', type=str, help='Input file', required=True)
-parser.add_argument('--read', type=bool, help='Read the frequency value', required=False)
-parser.add_argument('--output', type=str, help='Output file', required=False)
-parser.add_argument('--frequency', type=int, help='Frequency in Hz', required=False)
-parser.add_argument('--verbose', action='store_true', help='Print the details')
 args = parser.parse_args()
+if not hasattr(args, 'func'):
+  print('error: arguments are required\n'
+        'use --help for more information',
+        file=sys.stderr)
+  sys.exit(os.EX_USAGE)
 
-if args.verbose:
-  print(args.input)
-  print(args.output)
-  print(args.frequency)
+if args.func == "writebin" and args.verbose:
+  print("Writing the binary file")
+  print("File : " + args.input)
+  print("Output : " + args.output)
+  print("Frequency : " + str(args.frequency))
 
 def hex_to_freq(hex_value):
-  print("hex value : " + hex_value)
-  value = int(hex_value, 16)
-  print("int value : " + str(value))
-  value = str(bin(value))[2:]
-  print("binary value : " + value)
-  value = value[:-2]
-  print("binary value : " + value)
-  value = int(value, 2)
-  print("int value : " + str(value))
-  value = value / 512
-  print("freq value : " + str(value))
-  return value
+  inverted_hex_value = hex(int(hex_value[4:6] + hex_value[2:4] + hex_value[0:2], 16))
+  shifted_bin_value = bin(int(inverted_hex_value, 16) >> 2)
+  if args.verbose:
+    print("Binary value : \t\t" + bin(int(inverted_hex_value, 16)))
+    print("Binary value shifted : \t" + str(shifted_bin_value))
+  return int(shifted_bin_value, 2) / 512
 
 # function to convert frequence to hex
+# Coded on 20 bits in binary format.
 def freq_to_hex(freq_base):
   freq=freq_base/1000
   if args.verbose:
@@ -58,6 +68,46 @@ def freq_to_hex(freq_base):
     print("hex value inverted : 0x" + value3 + value2 + value1)
   return value3 + value2 + value1
 
+def write_output_line(line):
+  # write the output line
+  with open(args.output, 'a') as f_out:
+    f_out.write(line)
+    f_out.close()
+
+def fix_checksum(line):
+  print("Fixing the checksum")
+  # calculate the checksum
+  checksum = 0
+
+  print("Checksum : \n" + line)
+  byte1 = hex(int(line[1:3], 16))
+  byte2 = hex(int(line[3:5], 16))
+  byte3 = hex(int(line[5:7], 16))
+  byte4 = hex(int(line[7:9], 16))
+  byte5 = hex(int(line[9:11], 16))
+  byte6 = hex(int(line[11:13], 16))
+  byte7 = hex(int(line[13:15], 16))
+  byte8 = hex(int(line[15:17], 16))
+  byte9 = hex(int(line[17:19], 16))
+  byte10 = hex(int(line[19:21], 16))
+  byte11 = hex(int(line[21:23], 16))
+  byte12 = hex(int(line[23:25], 16))
+  byte13 = hex(int(line[25:27], 16))
+  byte14 = hex(int(line[27:29], 16))
+  byte15 = hex(int(line[29:31], 16))
+  byte16 = hex(int(line[31:33], 16))
+  byte17 = hex(int(line[33:35], 16))
+  byte18 = hex(int(line[35:37], 16))
+  byte19 = hex(int(line[37:39], 16))
+  byte20 = hex(int(line[39:41], 16))
+
+  # checksum intel hex format
+  checksum = 0x100 - (int(byte1, 16) + int(byte2, 16) + int(byte3, 16) + int(byte4, 16) + int(byte5, 16) + int(byte6, 16) + int(byte7, 16) + int(byte8, 16) + int(byte9, 16) + int(byte10, 16) + int(byte11, 16) + int(byte12, 16) + int(byte13, 16) + int(byte14, 16) + int(byte15, 16) + int(byte16, 16) + int(byte17, 16) + int(byte18, 16) + int(byte19, 16) + int(byte20, 16)) % 0x100
+  print("Checksum : " + str(hex(checksum)))
+
+  return checksum
+
+
 # check if the input file exists
 try:
   with open(args.input, 'rb') as f:
@@ -67,7 +117,7 @@ except FileNotFoundError:
   print(f'Error: {args.input} does not exist')
   exit(1)
 
-if args.read:
+if args.func == "readbin":
   print("")
   print("Reading the frequency value for M10...")
   # print each line of the input file
@@ -75,27 +125,40 @@ if args.read:
     for line in f:
       if ":10101000" in line.decode('utf-8'):
         if args.verbose:
-          print("Found the frequency line")
-          print(line.decode('utf-8')[10:15])
-        print("Frequency value : " + str(hex_to_freq(line.decode('utf-8')[10:15])))
+          print("Found the frequency sequence in Hex Intel format : " + line.decode('utf-8')[9:15])
+        print("Frequency read : " + str(hex_to_freq(line.decode('utf-8')[9:15])))
         exit(0)
 
+if args.func == "writebin":
+  if os.path.exists(args.output):
+    os.remove(args.output)
+
+  with open(args.output, 'wb') as f_new:
+    f_new.close()
+
+
+  print("Calculating the frequency "+ str(args.frequency) +"Hz value for M10...")
+
+  # print each line of the input file
+  with open(args.input, 'rb') as f_in:
+    for line in f_in:
+      if ":10101000" in line.decode('utf-8'):
+        if args.verbose:
+          print("Found the frequency line like this : " + str(line))
+          print("Frequency sequence in Hex Intel format : " + line.decode('utf-8')[9:15])
+        print("Actual frequency value : " + str(hex_to_freq(line.decode('utf-8')[9:15])) + "Hz")
+        new_freq = freq_to_hex(args.frequency)
+        print("New frequency value : " + str(args.frequency) + "Hz")
+
+        # replace the frequency value
+        new_line = line.decode('utf-8').replace(line.decode('utf-8')[9:15], new_freq).upper()
+        print("New line : " + new_line)
+        #replace two last bytes with the checksum
+        new_line = new_line[0:41] + str(hex(fix_checksum(new_line)))[2:].upper() + "\n"
+        print("New line with checksum : " + new_line)
+        write_output_line(new_line)
+        
+      else:
+        write_output_line(line.decode('utf-8'))
+    f_in.close()
 
-print("")
-print("Calculating the frequency "+ str(args.frequency) +"Hz value for M10...")
-
-# print each line of the input file
-with open(args.input, 'rb') as f:
-  for line in f:
-    if ":10101000" in line.decode('utf-8'):
-      if args.verbose:
-        print("Found the frequency line")
-        print(line.decode('utf-8')[10:15])
-        print("Replacing the frequency value")
-      line = line.decode('utf-8')[:10] + freq_to_hex(args.frequency) + line.decode('utf-8')[12:40]
-      # Missing the checksum calculation
-      print(line)
-      # checksum intel hex format
-      the_bytes = line[1:].encode('utf-8')
-      print(the_bytes)
-      a = b'%02X' % (sum(the_bytes) & 0xFF)

+ 529 - 0
test.hex

@@ -0,0 +1,529 @@
+:10100000F209F009D60AD50ACD08D20800FF9421CA
+:10101000CD5E0D00FFFFFFFFFFFFFFFFFFFFFFFFA4
+:1010200035200000008E2001BB00000003003DB20F
+:10103000CA5800000000000000000000000000008E
+:1010400000000000000000000000000000000000A0
+:101050000000000000FFFFFFFFFFFFFFFFFFFFFFC5
+:10106000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
+:10107000FFFFFF0021AC099BFF0000000000000003
+:1010800060200217180800070000E803E80300FFCB
+:10109000E407FFFFFFFFFFFFFFFFFFFFFFFFFFFF73
+:1010A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
+:1010B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
+:1010C0003C7BFE16FFFFFFFFFFFFFFFFFFFFFFFF61
+:1010D000FFFFFFFFFFFFFFFFFFFF08100080000082
+:1010E000DF7F930BAF0D4180F2063708FE08FFFF4C
+:1010F000FFFFFFFFFFFF01088F8F968E868DCA8648
+:10E00000314000063C4066033D400501B0120EFD64
+:10E01000B012FAF0B01248FD32C23140FE0532D2E1
+:10E02000F240F30001033E4080100F43FF4E020315
+:10E030001F533F900A00FA23F2400B0000033540C3
+:10E040000003B012A6E8F240E1005004F2400300E1
+:10E050005104B0129AE6B012EAEBF24005005E04F9
+:10E06000B012A2F8F2B003005D04212CF2401E00B1
+:10E070005404B2B010006201DC29C2935404F923A5
+:10E08000D2835E04ED23F240F1000103D243020388
+:10E09000E243000335400003B012A6E8F240060058
+:10E0A0005404C2935404FD2382432001FD3FC24324
+:10E0B0005F04C243600482436C03B012E6E1F29055
+:10E0C0000A005F043B34F290050060043734B2B0BC
+:10E0D00010006201AE29B2B0100064016E28B29047
+:10E0E00046006C035334D2B30100E92FB0126CF731
+:10E0F000B0125CE8D2535F043E400604D2425A0498
+:10E100000003F2800C000003B01208E2B012E6E156
+:10E11000B01218E282436C03A2B222040524D24357
+:10E120006704C2436104CB3FF290030061040334EF
+:10E13000D2536104C43FE2436704C13FC243600459
+:10E14000C2435F0482436C03F2402700010338405E
+:10E150000103D2435904B01206E7B012F8E1F240CD
+:10E160001E005404C2935404AA27D2B30100FA2F0C
+:10E17000B01232F93E400604F04031008421B01262
+:10E1800008E2B012E6E1B01218E2993FF2409F00B7
+:10E190000103F24023000203D2424C0400038243F5
+:10E1A0006C03D2536004B0122CE2D2424C04000340
+:10E1B00035400003B012A6E8823FB012A8F67F3FB8
+:10E1C0003FF03F003F50A00F12C30F10F040070078
+:10E1D000C021C04FBB213F4010002B433C408F0368
+:10E1E000B01266E7BA3DF2408F005B04F2402000B7
+:10E1F0005C04B012E2E63041F24047005B04C243E7
+:10E200005C04B012E2E630410F43FF4E01031F539E
+:10E210005F920003FA233041B0122CE2D2424C0448
+:10E22000000335400003B012A6E83041B0120CE400
+:10E23000B012AEEBA2C36001D24276033F03D242DA
+:10E2400077034003F2D080004003F2D02000400367
+:10E25000D24255043E030E435E425504A2D36001F0
+:10E260000E5E0E5ED24E001041031E53D24E0010C1
+:10E2700042031E53D24E001043031E53D24E0010D1
+:10E280004403B0122CEAB01272EAB01280EAC24E15
+:10E2900048038E10C24E4903B012DEE9B01272EA92
+:10E2A000B01280EA0E110E11C24E45038E10C24EFE
+:10E2B0004603B01292E9B01272EAB01280EA0E116F
+:10E2C0000E110E110E11C24E4703B012F8E9B01232
+:10E2D00072EAB01280EAC24E4C038E10C24E4D0359
+:10E2E000B0127AE9B01272EAB01280EAC24E550357
+:10E2F0008E10C24E5603B01262E9B01272EAB0122A
+:10E3000080EAC24E57038E10C24E5803B012ACE9D9
+:10E31000B01272EAB01280EAC24E4E038E10C24EA4
+:10E320004F03B012C6E9B01272EAB01280EAC24ED0
+:10E3300059038E10C24E5A03A2C36001C243570450
+:10E34000D2435804A2D36001B2900F006C031B2C7F
+:10E35000B2B010008401F82FB2900E007203263480
+:10E36000B2900D0072030520B29021DF70031E34BD
+:10E37000003CD24270033503D24271033603D242CD
+:10E3800072033703213CB2B0100084011928B2C0D7
+:10E390001000840182936E030920B2437003B240DF
+:10E3A000FF007203B2C010008401E33FB24021DFDE
+:10E3B0007003B2400D007203B2C010008401D93F57
+:10E3C000B2C010008401D53FD240AA2C3203D24003
+:10E3D000A52C3303D240A02C3403D2409C2C38030C
+:10E3E000D240972C3903D2408F2C3A03D040922C44
+:10E3F000701FD0408D2C6B1FD040882C611FD040E7
+:10E40000842C5D1FD0407D2C561F3041A2D360016B
+:10E41000034303430343034303430343A2C3600192
+:10E42000A2B3A001F32FF2D080005804A2D3600160
+:10E430003041D2424E044D04B01232FDF2D0800081
+:10E440005804D2C30100F2C020003300F240E100C2
+:10E450005004C2435104B0129AE6B2B010006201F7
+:10E46000FC2FF29003008B03E427F29062008B03F1
+:10E470000D24F29061008B032F24F29060008B0337
+:10E480005924F29057008B036824D83F0B430C4368
+:10E490000F435B428E034B93D1273B902100CE2F3D
+:10E4A0005F428D033F908000C92F0C4F0C5B3C9066
+:10E4B0008100C42F3C408F03F2900A008C03082493
+:10E4C000F2900B008C03BA23B01272E7053CB63F02
+:10E4D000B01266E7013CB23F0B430C430F435B4273
+:10E4E0008E034B93AB273B908100A82F5F428D0397
+:10E4F0003F908000A32F0C4F0C5B3C9081009E2F1F
+:10E50000F2900A008C030724F2900B008C039623F0
+:10E510003D400010023C3D4080100D5FB0123EFDBA
+:10E52000F24005004D04B01244FBB0124EE6B012AA
+:10E53000CAFC843FD2435804B0122CE2B0123EFD14
+:10E54000E2434D04B01244FB3D4032037B403100B6
+:10E55000B0124EE6B012CAFC713FD2D30100F2D025
+:10E5600020003300D24358043B41B012B4F93B4081
+:10E5700010000E6EB0128CE51B83FB233B40100095
+:10E580000C6CB0128CE51B83FB23273C0428F2D0D3
+:10E5900010002900033CF2C010002900034303438C
+:10E5A0000343034303430343F2D020002900034302
+:10E5B000034303430343034303430343034303432B
+:10E5C000034303430343F2C02000290003430343F2
+:10E5D00003430343034303433041034303430343E0
+:10E5E000034303430343F2D229000343034303439A
+:10E5F00003430343034303430343034303430343EB
+:10E600000343F2C229000343034303430343034389
+:10E6100003433041F2C020002900F2C229003E40ED
+:10E6200044031C40EA29B0126EE51E40E6291C4056
+:10E63000E029B0126EE50E433C40E25FB0126EE599
+:10E640003E4074003C40AF18B0126EE530410C43C0
+:10E65000F04D141DF09010000E1D0520B01272E652
+:10E66000F0401000021DB01272E61C530B9CF02308
+:10E670003041D2435304B2400900680312127001C2
+:10E68000B150A0010000B2417201B240B00062017D
+:10E69000B2B010006201FC233041C2434E04D2C329
+:10E6A0004F04E2C34F0482436A03C2435304B2409F
+:10E6B00009006803B240149162013041D2C30100E5
+:10E6C000F240D0006200C2436300F24006006400E2
+:10E6D000F2D030001B00C2436000F24080006100B5
+:10E6E0003041D2C30100C2435D04C2436500804390
+:10E6F000881CD2D301003041E2B30300FD2BD2408D
+:10E700007A1C67003041F0401000701CB012F8E62F
+:10E71000F890100000000520F04010005E1CB012C0
+:10E72000F8E6F048561CB012F8E6D0832D1DF02311
+:10E73000F0401000461CB012F8E6F04003003C1C0C
+:10E74000B012F8E630413F4010002B433C408F03AD
+:10E75000B01266E730413F400E001B433C408F0340
+:10E76000B01266E730413F90400009343D408010D0
+:10E770000F3C3F90400008343D400010093C3F8072
+:10E7800040003D404010043C3F8040003D40401070
+:10E7900032C20D12B012B2E72D41B012F0E7FF4CB9
+:10E7A000C6031F531B83FB233D41B012C4E732D283
+:10E7B00030410E43AE4DC6032D532E533E904000C4
+:10E7C000F9233041B04000A56419B04040A55A1962
+:10E7D0000E439D4EC60300002D532E533E90400025
+:10E7E000F823B04000A54219B04010A540193041AF
+:10E7F000B24000A52C0192B32C01FD2FB24002A51E
+:10E800002801CD43000092B32C01FD2FB24010A58A
+:10E810002C01304105120B430E435E4200035E8320
+:10E820000D437D453F421DB3013C4D6D0C6C0B12F9
+:10E830000B100CEB0B100B100CEB0B100B100CEB6C
+:10E840002B410B6B0B6B0B6B0CEB3B410C100B6BF5
+:10E850001F83EB231E83E42335413041D242290438
+:10E860002804D2422B042904D2422D042A04D24285
+:10E870002F042B04D24231042C04D24233042D0441
+:10E88000D24235042E04D24237042F04D242390436
+:10E890003004D2423B043104D2423D043204F240FF
+:10E8A0009F0006043041F2C080006203D25362032D
+:10E8B000F290650062030228D2436203B2D0800066
+:10E8C00062030F3CD2924C0400030B24F2904700E9
+:10E8D00001030720D25300035F420003DF426203BB
+:10E8E0000103D2D31F00F2D080002900B012CAEB7E
+:10E8F000E2435404C2935404FD23E2530003B012D4
+:10E9000014E80F435F420003CF4B00031F838B10BB
+:10E91000CF4B0003D24200034D045B40E419F240A8
+:10E9200080006304B0401000541A0D451D53B0120E
+:10E930003EFDF040E200301AB01272E6F0405500A1
+:10E94000261AB01272E6D0424D041C1AB01272E6BA
+:10E95000B0124EE6B012CAFCB0902200201AFC237E
+:10E960003041A2C3A0018243A4014D43B240F00F45
+:10E97000A001B240F202A201663CA2C3A001824300
+:10E98000A4015D43B240F00FA001B240F202A20127
+:10E990005A3CA2C3A0018243A4017D401200B240B0
+:10E9A000F00FA001B240F202A2014D3CA2C3A001AF
+:10E9B0008243A4017D400300B240F00FA001B240A9
+:10E9C000F202A201403CA2C3A0018243A4016D4215
+:10E9D000B240F00FA001B240F202A201343CA2C347
+:10E9E000A0018243A4017D401500B240F00FA001B8
+:10E9F000B240F202A201273CA2C3A0018243A401BB
+:10EA00007D401600B240F00FA001B240F202A20118
+:10EA10001A3CA2C3A0018243A4017D400700B2407A
+:10EA2000F00FA001B240F202A2010D3CA2C3A0016E
+:10EA30008243A4017D401A00B240B00FA001B24051
+:10EA4000F202A201003CC24D8000C24D8100C24DC5
+:10EA50008200C24D8300C24D84007DD08000C24D33
+:10EA60008500034303430343A2D3A00192D3A00133
+:10EA70003041B2B02000A401FC2BA2C3A001304160
+:10EA80003F4040010E4F0D4F2F532C4F2C9E01380D
+:10EA90000E4F2C9D01340D4F3F904A01F5230E9DE2
+:10EAA00001202E538E4300008D4300003F40400163
+:10EAB0002E4F2F532E5F3F904A01FB230E110E1154
+:10EAC0003041331291830000FD2321533041B24085
+:10EAD000805A2001E2D32200E2D32600F0C01800C1
+:10EAE0004115F0D0E0003B15E2D22600E2D22E0024
+:10EAF000F240BA002A00E2C32900D2D31A00E2D3BE
+:10EB00001A00E2D21A00D2C31900E2C31900E2C20D
+:10EB10001900F24009001E00D2D31F00E2D31F00EB
+:10EB2000F2D025003200E2C23100D2C33100F2D06F
+:10EB300020003300F2D040003200F2D0400031001B
+:10EB4000F2D080003200F2C080003100F243370082
+:10EB50003041F2C080005700F2D080005300F2D064
+:10EB600020005300E2C302003F40FF471F83FE2303
+:10EB7000E2B30200F723B012C2EAD2D33100F2406E
+:10EB800088005800E2D231003041A2426201B24016
+:10EB900024006201B24062026001304182436C0392
+:10EBA000B24046028001B2D020008001304132C222
+:10EBB00082436C03824370038243720382436E0379
+:10EBC000B2401041840132D2304182436C031212B0
+:10EBD0009001B15040030000B2419201B0402200C8
+:10EBE0009C17B240900082013041C2436404B0429D
+:10EBF0008E17B240308164013041F2456304A05366
+:10EC00007C17B0F00F0076170B20C293000306208C
+:10EC1000F2420003B04024006417023CD283000398
+:10EC2000D25263046304182CB25040039201304165
+:10EC3000B25040039201D28300030D20B040220065
+:10EC40003C17B2C010008201F2C080002900D2C37C
+:10EC50001F00D2C31D003041B250A001920190D3D9
+:10EC60001C173041B250A001920190C310173041DF
+:10EC7000B0F01F0008170224A0530217D2526304F9
+:10EC80006304EA2FB250400392013041B250A00118
+:10EC90009201A053E816304110521E013041083C49
+:10ECA0003041304130413041304192536C0330416A
+:10ECB000A2B384010B28B2C010008401A2C3840156
+:10ECC00082437203B2400F007003304182936E039F
+:10ECD000092092429401700392426C037203925392
+:10ECE0006E0330419290A4236E032338B2C010000B
+:10ECF0008401A2C3840112126C039182720300008A
+:10ED0000B241720392B3800182637203082012122F
+:10ED10009401918270030000B241700330419283EC
+:10ED20007203B2E370039252940170038263720320
+:10ED300030418293940192536E0330410A120B12B8
+:10ED40000D120C120F120E1210522E01CF3D043C68
+:10ED5000CD3DCC3DCB3D403C32C0D00092528003F3
+:10ED60007401B2B000106401162882937E0304205F
+:10ED7000B2C010006401BA3DB2D080006401D2B3C9
+:10ED800064040328B2C08000640112C352106404FA
+:10ED9000B2537E03AB3DB2B0000164010A28B2C099
+:10EDA000000164011E42800312C30E10825E7401D2
+:10EDB0009D3D12C352106404B2B0000464010328E4
+:10EDC000F2D080006404B2537E0382937E038E21CE
+:10EDD000B2C0100064018A3DF2905C006804032C0C
+:10EDE000D2536804023CC24368045E4267044E8307
+:10EDF00038245E8307245E8366245E8319245E8341
+:10EE00003024763C5E4268045E8307247E801E00C8
+:10EE100008247E803C0009246B3CF2D08000310045
+:10EE2000673CF2C080003100633CC2436804603C30
+:10EE30005E4268045E830A245E830C245E8306249B
+:10EE40005E8308247E801B000924523CF2D080009F
+:10EE500031004E3CF2C0800031004A3CC24368049D
+:10EE6000473CB290C111800316205E4268045E8365
+:10EE700005246E8207246E8209243A3CF2D0800079
+:10EE80003100363CF2C080003100323CC24368049D
+:10EE9000D25369042D3C5E4268045E8307247E8061
+:10EEA0001E0008247E801E000924223CF2D080002F
+:10EEB00031001E3CF2C0800031001A3CC24368049D
+:10EEC000D2536904153C5E4268045E8307247E8049
+:10EED000050008247E80190009240A3CF2D0800035
+:10EEE0003100063CF2C080003100023CC24368049D
+:10EEF000C29367043524D2B32800182CF290050081
+:10EF000069040728F2D080003100F2400500670450
+:10EF1000273CE2426704B290C11180032120F290A5
+:10EF20000A0068041D28C24368041A3CF2900500D8
+:10EF300069040528D2C31900E2C32900113CC29319
+:10EF400069040E24C2436904C2436804B290C1112B
+:10EF500080030420F24003006704023CD2436704AC
+:10EF6000C29354040224F2535404C293660403244B
+:10EF7000F2536604023CC2436504C2935804B63897
+:10EF8000C29356040520D2435604B0126AFAAE3C2E
+:10EF9000C29358048320B2B02000A401A728A2C3C2
+:10EFA000A0014D433C40FF0F4F437F9006000C2CC7
+:10EFB0004E4F0E5E1C9E400105284B4F0B5B1C4BB9
+:10EFC00040014D4F5F53F13F4B4D0B5B8B43400175
+:10EFD0004D430C434F437F9006000C2C4B4F0B5B73
+:10EFE0001C9B4001052C4B4F0B5B1C4B40014D4FB4
+:10EFF0005F53F13F4B4D0B5B8B43400182437603E4
+:10F000004F437F900600072C4B4F0B5B925B4001F8
+:10F0100076035F53F63F12C3121076031211760384
+:10F02000D242560457045E4256045E8305245E8332
+:10F0300007245E830A240D3C0C433A40B80B093C7C
+:10F040003C4078053A401C0C043C3C4020033A40CC
+:10F05000FF0F829C7603082CE29356041028F2538B
+:10F060005604B0126AFA0B3C1A927603082CF290FE
+:10F0700003005604042CD2535604B0126AFAD24349
+:10F0800058045E4257047E53C24E5504F29003006A
+:10F0900056042C20F2D080005804283CF253580427
+:10F0A000C29358042320A2C3A0018243A401B2400A
+:10F0B000F00FA001B240F202A201F240070080006E
+:10F0C000F24007008100F24007008200F240070092
+:10F0D0008300F24007008400F2408700850003436C
+:10F0E00003430343A2D3A00192D3A0013E413F4179
+:10F0F0003C413D413B413A410013C2430003C243FE
+:10F100000103C2433203C2433303C2433403C24345
+:10F110003503C2433603C2433703C2433803C243F5
+:10F120003903C2433A03D2420C103B03C2433C03AF
+:10F13000C2433D03C2433E03C2433F03C2434003B5
+:10F14000C2434103C2434203C2434303C243440395
+:10F15000C2434503C2434603C2434703C243480375
+:10F16000C2434903C2434A03C2434B03C2434C0355
+:10F17000C2434D03C2434E03C2434F03C243500335
+:10F18000C2435103C2435203C2435303C243540315
+:10F19000C2435503C2435603C2435703C2435803F5
+:10F1A000C2435903C2435A03F2435B03D2428E1057
+:10F1B0005C03C2435D03C2435E03C2435F03C243B9
+:10F1C0006003C2436103C2436203C2436303F2406C
+:10F1D00062004C04C243C60382436C0382436E0345
+:10F1E000824370038243720382437403C24359040F
+:10F1F000C2435E04C2435F04C2436004C24361046D
+:10F20000C24363048243840382438603C2436A0485
+:10F2100032C20343F24080005804C2434E04C2434A
+:10F220004F04B012CEEAB2400C8E8003B01252EB03
+:10F23000B0128AEBB0129CEBB012F8FCB012EAEB01
+:10F2400032D2C2436704D2436904C29373101A20B6
+:10F25000E2B21C00172CD2D319003E40204E0F43BF
+:10F260000D4E0DDF0D9303243E533F63F93FE2D370
+:10F270001900E2D21900F2D080003100D2436704B5
+:10F28000B012B4F9D2D31900E2C31900E2C21900D6
+:10F29000D2B32800FD2BF290050069040E28F2D0AD
+:10F2A00080003100E2D31900E2D21900C2436904A0
+:10F2B000D2436704B012B4F9023CD2C319000C4324
+:10F2C00030410F12B250A0017201C29353042324A3
+:10F2D000929368030620B2C080006201B2536803B3
+:10F2E000BD3C829368030720B2C010006201B2C027
+:10F2F00080006201B33C92B366030428B2C0800070
+:10F300006201033CB2D08000620112C31210660396
+:10F31000B2536803A33CB290090068030920B2C04D
+:10F3200000016201B250D0007201B2536803963CF2
+:10F33000829368031424B2B0000462010428B2D09E
+:10F3400080006603033CB2C08000660392936803AA
+:10F35000032412C312106603B25368037F3CB2D079
+:10F3600014816201B2400900680382936A031F207E
+:10F370001F4266033F8003000C243F800D000F20D6
+:10F38000C29352040324C2435204683CD243520441
+:10F39000653CC29352046224C24352045F3CD24291
+:10F3A00066038A0392436A03C2435204573CB290F5
+:10F3B00063006A03512C1F4266033F80030013243D
+:10F3C0003F800D003F20C29352040A24C2435204DE
+:10F3D0001F426A03DF4266038A0392536A033E3C7C
+:10F3E000D24352043B3CC29352042424C2435204ED
+:10F3F000D2426A034E04C29350041924D2928A0363
+:10F4000050041520C29351040420B2C010006201C0
+:10F41000253CC29351040824D2928B03510404204A
+:10F42000B2C0100062011A3C82436A03173C824357
+:10F430006A03143C1F426A03DF4266038A03925345
+:10F440006A030C3CC24352041F426A03DF42660354
+:10F450008A0392536A03023C82436A033F410013CA
+:10F460000D120C120F120E12E2B265000428F2F017
+:10F4700083006500B03C829378031F205E426600E3
+:10F480007E8003000C247E800D000F20C293620456
+:10F490000324C24362049F3CD24362049C3CC29357
+:10F4A00062049924C2436204963CD2426600060478
+:10F4B00092437803C24362048E3CB29063007803A7
+:10F4C000822C5E4266007E80030013247E800D0045
+:10F4D0007220C29362040A24C24362041F4278036A
+:10F4E000DF426600060492537803753CD2436204FF
+:10F4F000723CC29362045724C2436204D24278032E
+:10F500005A04F2908F00060402205E43013C4E43F1
+:10F51000F2902100070402205F43013C4F434EBF9D
+:10F520002524D2420E048803D2420D0489031F42CF
+:10F5300088033F80FEFF05241F830620C2435B0330
+:10F54000123CF2435B030F3CB29000648803032833
+:10F55000F2435B03083C1C4288033E406400B01247
+:10F5600098FCC24C5B0382437803353CC2935B0436
+:10F570001724D29206045B041320C2935C04032078
+:10F58000D2C30100283CC2935C040724D292070432
+:10F590005C040320D2C301001E3C824378031B3C61
+:10F5A00082437803183C1F427803DF42660006045A
+:10F5B00092537803103C1F427803DF426600060432
+:10F5C00092537803083CC293660003248243780375
+:10F5D000023C824378033E413F413C413D410013A0
+:10F5E000E2C31900E2C21900F2F003002200F2C0E7
+:10F5F00020002900F2C22900F2C010002900F2C048
+:10F6000080002900F2C010001B00F2C01000190099
+:10F61000F2C020003300F2C020003100F2C04000F0
+:10F620003100E2D32900D2C31900B012EAEBF24054
+:10F6300003006704C2436804D242FE105600D2425F
+:10F64000FF105700C2435800F24020005300B24060
+:10F65000C1118003F2C080003100B2B0100064011B
+:10F66000FC2FB012A8F64C93F827B012CEEAD24382
+:10F670005604B0126AFAF2D010001B00D2D319005F
+:10F680003E40204E0F430D4E0DDF0D9303243E539D
+:10F690003F63F93FE2D21900E2D31900E2C3290027
+:10F6A000B01276FC3040B4F90A124A43C2936404A3
+:10F6B0005824C24365045E4264047E8041000724EE
+:10F6C0007E800C0007247E8005000624083CB012D2
+:10F6D000E0F5473C5A43453CB012B4F9423CF29045
+:10F6E000800064043128F290BD0064042D2CF29057
+:10F6F000030067042320B012CEEAD2435604B012AE
+:10F700006AFAF2D010001B00F2D020003300D2D3EE
+:10F710001900E2C329003E40A0861F430D4E0DDFB5
+:10F720000D9303243E533F63F93FE2D31900E2D225
+:10F730001900B01252EBB2400C8E80035C4264049C
+:10F74000B0121EFC5A430D3CF290200064040928BC
+:10F75000F2903F006404052C5C426404B012B0FCDB
+:10F760005A43B012EAEB4C4A3A4130410A120B12AA
+:10F770002182D1421E040000D1421D040100D14269
+:10F780001C040200D1421B0403002C411D41020055
+:10F790003E40E8030F43B01204FB0A4C0B4DC293EA
+:10F7A0008E102A24021232C20343D2428E1030013C
+:10F7B000B240E80338011E423A0132413E50CEFFCA
+:10F7C0000F4E3FE30F5F0F7F0F9B033813200E9AFE
+:10F7D000112C829B860304380D20829A84030A2C04
+:10F7E000F2900A006A040320D2C31900053CD253E8
+:10F7F0006A04023CC2436A04824A8403824B860341
+:10F8000021523B413A4130410D120C120F120E129F
+:10F8100092B37C030328B01264EC3E3C1F427C038D
+:10F820003F902500392C0F5F104F2CF876F898F890
+:10F830007CF898F87CF898F87CF898F87CF898F8B8
+:10F840007CF898F87CF898F87CF898F882F898F8A2
+:10F8500088F898F882F898F882F898F882F898F87A
+:10F8600088F898F882F898F882F898F882F898F86A
+:10F870008EF898F894F8B012FAEB0E3CB012FEEB4A
+:10F880000B3CB01270EC083CB0128CEC053CB01292
+:10F8900028EC023CB01230EC3E413F413C413D413E
+:10F8A0000013F2F0FC005D04B012BCE67D400500E0
+:10F8B0003C402010B01216FAF24055005B04C243DF
+:10F8C0005C04B012E2E6F2403C005404C2935404DB
+:10F8D0000A24D2B3010007287D4005003C402010D7
+:10F8E000B01216FAF33FC293540422247D4005005F
+:10F8F0003C402010B0124CFC4C931A247D40030075
+:10F900003C402510B01216FA7D4003003C405310D5
+:10F91000B01216FA7D4029003C402810B01216FAA9
+:10F920006D433C405110B01216FAF2D003005D0452
+:10F9300030410A122182F240490006044A437A907B
+:10F940000C00352C4F4A0E4F0F5F0F5F0F5E4E4A73
+:10F950000E5EDE4F080408044F4A0E4F0F5F0F5F24
+:10F960000F5ED14F0C0400004F4A0E4F0F5F0F5F28
+:10F970000F5ED14F0B0401004F4A0E4F0F5F0F5F18
+:10F980000F5ED14F0A0402004F4A0E4F0F5F0F5F08
+:10F990000F5ED14F090403002C411D410200B0123B
+:10F9A000ECFB4F4A0F5FCF4C09045A53C83F21521A
+:10F9B0003A4130419242901082031F4282030F5F0E
+:10F9C0003F5060F0824F82031C4282034C5C3CF04B
+:10F9D000FF008C103C5005003E400A00B01298FC1D
+:10F9E000824C8203925282038203925282038203E8
+:10F9F00092D38203B25000808203B01214E6D2B3D5
+:10FA00002000FD2BD2428E105C03D2420C103B032F
+:10FA100032D2304018E00A120B1208120B4C4A4D39
+:10FA2000B24010007A03B012F8E608434A4A089A36
+:10FA300010340F4B0F586F4F4F4F824F7A03B290D5
+:10FA400010007A030220B012F8E6B012F8E618535C
+:10FA5000ED3FB24010007A03B012F8E6B240030066
+:10FA60007A03B012F8E630402AFD5E4256045E8307
+:10FA700005245E830C245E8313241A3C5E4222001C
+:10FA80007EF003007ED08000C24E2200113C5E4218
+:10FA900022007EF003007ED05000C24E2200083CBF
+:10FAA0005E4222007EF003007ED02800C24E22007B
+:10FAB000F24005005804304106120712064D7DD071
+:10FAC000800006660767861076F376807F0014282C
+:10FAD000768018000A28369212340C5C0D6D56831D
+:10FAE000FC2F071037413641304176E3FA270D11DC
+:10FAF0000C105683FC23F53F0C430D43F23F3C436F
+:10FB00003D43EF3F091209430F9305343EE33FE3C2
+:10FB10001E530F6319D30D9305343CE33DE31C538F
+:10FB20000D6339E3B01280FB19B304243CE33DE3D9
+:10FB30001C530D6329B304243EE33FE31E530F63BC
+:10FB4000394130410A12F240E2008A030A43C2936B
+:10FB50004D041424FA9010008A030520B2401000CE
+:10FB60006603B01272E65F4A8A034F4F824F660304
+:10FB7000B01272E6F2534D041A53E93F3A41304154
+:10FB800009120A120B120A430B43394020000C5C85
+:10FB90000D6D0A6A0B6B0A8E0B7F04281CD3395338
+:10FBA000F623043C0A5E0B6F3953F1230E4A0F4BC8
+:10FBB0003B413A41394130418C118E1109120943C0
+:10FBC0000E9303343EE31E5319D30C9303343CE3EA
+:10FBD0001C5339E3B01298FC19B302243CE31C53C4
+:10FBE00029B302243EE31E5339413041B012B8FA22
+:10FBF0000F283D90008006200C9309243D40008092
+:10FC00000C433041FB2F3CE33DE31C530D6330417B
+:10FC10003DB00080FC273D40FF7F3C4330410A124D
+:10FC200021834A4C4C4A3C50200F2E43B012BCFB5F
+:10FC3000814C0000D24101009003E2418F03B012D9
+:10FC400046E7B012B4F921533A4130410A120B127F
+:10FC50000B4C5C435E437E9005000A2C4A4E4E4E90
+:10FC60000F4B0F5EEA9F060401244C435E53F33FA3
+:10FC70003B413A413041D2436704D2D31900E2C339
+:10FC80002900E2D31900E2D21900B2400C8E8003A1
+:10FC9000304052EB7CF37EF30F4E0D4C0E431C4371
+:10FCA0000D5D0E6E0E9F01280E8F0C6CF92B3041EE
+:10FCB0000A124A4C4E4A7E50E000C24E8F03B012E8
+:10FCC00056E7B012B4F93A413041B2401000660331
+:10FCD000B01272E6B24003006603B01272E6304022
+:10FCE0009AE60D120C120F120E12B01298EC3E4151
+:10FCF0003F413C413D410013C243550482437603DA
+:10FD0000C2435604C2435704D243580430410F4CF7
+:10FD10000F5D033CCC4300001C530C9FFB23304180
+:10FD20003541344137413641394138413B413A410F
+:10FD30003041B0123EFDB01244FB3040CAFCB2402C
+:10FD400010006603304072E630404CFD304050FDFC
+:10FD5000FF3FFFFFFFFFFFFFFFFFFFFFFFFFFFFF73
+:10FD6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3
+:10FD7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93
+:10FD8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83
+:10FD9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73
+:10FDA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63
+:10FDB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53
+:10FDC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43
+:10FDD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33
+:10FDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23
+:10FDF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13
+:10FE0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02
+:10FE1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2
+:10FE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2
+:10FE3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2
+:10FE4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2
+:10FE5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2
+:10FE6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2
+:10FE7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92
+:10FE8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82
+:10FE9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72
+:10FEA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62
+:10FEB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
+:10FEC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42
+:10FED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32
+:10FEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22
+:10FEF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12
+:10FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01
+:10FF1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1
+:10FF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1
+:10FF3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1
+:10FF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1
+:10FF5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1
+:10FF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1
+:10FF7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91
+:10FF8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81
+:10FF9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71
+:10FFA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61
+:10FFB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51
+:10FFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41
+:0EFFD000FFFFFFFFFFFFFFFFFFFFFFFFFFFF31
+:10FFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFF60F4CB
+:10FFF0003CEDC2F2FFFFFFFFE2FC08F8FFFF00E06C
+:00000001FF