diff options
Diffstat (limited to 'keyboard/ergodox_ez/keymaps')
-rw-r--r-- | keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py | 273 | ||||
-rw-r--r-- | keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex | 2862 | ||||
-rw-r--r-- | keyboard/ergodox_ez/keymaps/german-manuneo/keymap.c | 1004 | ||||
-rw-r--r-- | keyboard/ergodox_ez/keymaps/german-manuneo/keymap.md | 52 |
4 files changed, 1651 insertions, 2540 deletions
diff --git a/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py b/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py index af68672226..3d26672762 100644 --- a/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py +++ b/keyboard/ergodox_ez/keymaps/german-manuneo/compile_keymap.py @@ -20,6 +20,7 @@ import sys import json import unicodedata import collections +import itertools as it PY2 = sys.version_info.major == 2 @@ -27,11 +28,6 @@ if PY2: chr = unichr -BASEPATH = os.path.abspath(os.path.join( - os.path.dirname(__file__), "..", ".." -)) - - KEYBOARD_LAYOUTS = { # These map positions in the parsed layout to # positions in the KEYMAP MATRIX @@ -73,34 +69,33 @@ BLANK_LAYOUTS = [ # Wide Layout """ -.--------------------------------------------. .--------------------------------------------. -| | | | | | | | ! | | | | | | | -!------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+------! -| | | | | | | | ! | | | | | | | -!------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+------! -| | | | | | |-------! !-------! | | | | | | -!------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+------! -| | | | | | | | ! | | | | | | | -'------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+------' - | | | | | | ! | | | | | - '-----------------------------' '-----------------------------' - .---------------. .---------------. - | | | ! | | - .-------+-------+-------! !-------+-------+-------. - ! ! | | ! | ! ! - ! ! !-------! !-------! ! ! - | | | | ! | | | - '-----------------------' '-----------------------' +.---------------------------------------------. .---------------------------------------------. +| | | | | | | | ! | | | | | | | +!-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------! +| | | | | | | | ! | | | | | | | +!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! +| | | | | | |-------! !-------! | | | | | | +!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------! +| | | | | | | | ! | | | | | | | +'-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------' + | | | | | | ! | | | | | + '------------------------------' '------------------------------' + .---------------. .---------------. + | | | ! | | + .-------+-------+-------! !-------+-------+-------. + ! ! | | ! | ! ! + ! ! !-------! !-------! ! ! + | | | | ! | | | + '-----------------------' '-----------------------' """, ] DEFAULT_CONFIG = { - "includes_basedir": "quantum/", "keymaps_includes": [ "keymap_common.h", ], - 'filler': "-+.':x", + 'filler': "-+.'!:x", 'separator': "|", 'default_key_prefix': ["KC_"], } @@ -114,31 +109,34 @@ SECTIONS = [ # Markdown Parsing +ONELINE_COMMENT_RE = re.compile(r""" + ^ # comment must be at the start of the line + \s* # arbitrary whitespace + // # start of the comment + (.*) # the comment + $ # until the end of line +""", re.MULTILINE | re.VERBOSE +) + +INLINE_COMMENT_RE = re.compile(r""" + ([\,\"\[\]\{\}\d]) # anythig that might end a expression + \s+ # comment must be preceded by whitespace + // # start of the comment + \s # and succeded by whitespace + (?:[^\"\]\}\{\[]*) # the comment (except things which might be json) + $ # until the end of line +""", re.MULTILINE | re.VERBOSE) + +TRAILING_COMMA_RE = re.compile(r""" + , # the comma + (?:\s*) # arbitrary whitespace + $ # only works if the trailing comma is followed by newline + (\s*) # arbitrary whitespace + ([\]\}]) # end of an array or object +""", re.MULTILINE | re.VERBOSE) + + def loads(raw_data): - ONELINE_COMMENT_RE = re.compile(r""" - ^ # comment must be at the start of the line - \s* # arbitrary whitespace - // # start of the comment - (.*) # the comment - $ # until the end of line - """, re.MULTILINE | re.VERBOSE) - - INLINE_COMMENT_RE = re.compile(r""" - ([\,\"\[\]\{\}\d]) # anythig that might end a expression - \s+ # comment must be preceded by whitespace - // # start of the comment - \s # and succeded by whitespace - (?:[^\"\]\}\{\[]*) # the comment (except things which might be json) - $ # until the end of line - """, re.MULTILINE | re.VERBOSE) - - TRAILING_COMMA_RE = re.compile(r""" - , # the comma - (?:\s*) # arbitrary whitespace - $ # only works if the trailing comma is followed by newline - (\s*) # arbitrary whitespace - ([\]\}]) # end of an array or object - """, re.MULTILINE | re.VERBOSE) if isinstance(raw_data, bytes): raw_data = raw_data.decode('utf-8') @@ -164,6 +162,8 @@ def parse_config(path): name = line[2:] elif line.startswith("## "): name = line[3:] + else: + name = "" name = name.strip().replace(" ", "_").lower() if name in SECTIONS: @@ -209,6 +209,7 @@ def parse_config(path): pass end_section() + assert 'layout' in config return config # header file parsing @@ -218,16 +219,15 @@ IF0_RE = re.compile(r""" #if 0 $.*? #endif - """, re.MULTILINE | re.DOTALL | re.VERBOSE -) +""", re.MULTILINE | re.DOTALL | re.VERBOSE) COMMENT_RE = re.compile(r""" /\* .*? \*/" - """, re.MULTILINE | re.DOTALL | re.VERBOSE -) +""", re.MULTILINE | re.DOTALL | re.VERBOSE) + def read_header_file(path): with io.open(path, encoding="utf-8") as fh: @@ -237,7 +237,7 @@ def read_header_file(path): return data -def regex_partial(re_str_fmt, flags=re.MULTILINE | re.DOTALL | re.VERBOSE): +def regex_partial(re_str_fmt, flags): def partial(*args, **kwargs): re_str = re_str_fmt.format(*args, **kwargs) return re.compile(re_str, flags) @@ -251,8 +251,7 @@ KEYDEF_REP = regex_partial(r""" (?:{}) # the prefixes (?:\w+) # the key name ) # capture group end - """ -) +""", re.MULTILINE | re.DOTALL | re.VERBOSE) ENUM_RE = re.compile(r""" @@ -264,8 +263,7 @@ ENUM_RE = re.compile(r""" \} ; ) # capture group end - """, re.MULTILINE | re.DOTALL | re.VERBOSE -) +""", re.MULTILINE | re.DOTALL | re.VERBOSE) ENUM_KEY_REP = regex_partial(r""" @@ -273,8 +271,8 @@ ENUM_KEY_REP = regex_partial(r""" {} # the prefixes \w+ # the key name ) # capture group end - """ -) +""", re.MULTILINE | re.DOTALL | re.VERBOSE) + def parse_keydefs(config, data): prefix_options = "|".join(config['key_prefixes']) @@ -289,26 +287,31 @@ def parse_keydefs(config, data): yield key_match.groups()[0] -def parse_valid_keys(config): - valid_keycodes = set() - paths = [ - os.path.join(BASEPATH, "tmk_core", "common", "keycode.h") - ] + [ - os.path.join( - BASEPATH, config['includes_dir'], include_path - ) for include_path in config['keymaps_includes'] - ] +def parse_valid_keys(config, out_path): + basepath = os.path.abspath(os.path.join(os.path.dirname(out_path))) + dirpaths = [] + subpaths = [] + while len(subpaths) < 6: + path = os.path.join(basepath, *subpaths) + dirpaths.append(path) + dirpaths.append(os.path.join(path, "tmk_core", "common")) + dirpaths.append(os.path.join(path, "quantum")) + subpaths.append('..') + + includes = set(config['keymaps_includes']) + includes.add("keycode.h") - for path in paths: - path = path.replace("/", os.sep) - # the config always uses forward slashe - if os.path.exists(path): - header_data = read_header_file(path) + valid_keycodes = set() + for dirpath, include in it.product(dirpaths, includes): + include_path = os.path.join(dirpath, include) + if os.path.exists(include_path): + header_data = read_header_file(include_path) valid_keycodes.update( parse_keydefs(config, header_data) ) return valid_keycodes + # Keymap Parsing def iter_raw_codes(layer_lines, filler, separator): @@ -325,6 +328,7 @@ def iter_raw_codes(layer_lines, filler, separator): def iter_indexed_codes(raw_codes, key_indexes): key_rows = {} key_indexes_flat = [] + for row_index, key_indexes in enumerate(key_indexes): for key_index in key_indexes: key_rows[key_index] = row_index @@ -384,8 +388,8 @@ def parse_code(raw_code, key_prefixes, valid_keycodes): return raw_code, None, None if MACRO_RE.match(raw_code): - code = macro_id = raw_code[2:-1] - return code, macro_id, None + macro_id = raw_code[2:-1] + return raw_code, macro_id, None if UNICODE_RE.match(raw_code): hex_code = raw_code[1:] @@ -404,10 +408,17 @@ def parse_keymap(config, key_indexes, layer_lines, valid_keycodes): layer_lines, config['filler'], config['separator'] )) indexed_codes = iter_indexed_codes(raw_codes, key_indexes) + key_prefixes = config['key_prefixes'] for raw_code, key_index, row_index in indexed_codes: code, macro_id, uc_hex = parse_code( - raw_code, config['key_prefixes'], valid_keycodes + raw_code, key_prefixes, valid_keycodes + ) + # TODO: line numbers for invalid codes + err_msg = "Could not parse key '{}' on row {}".format( + raw_code, row_index ) + assert code is not None, err_msg + # print(repr(raw_code), repr(code), macro_id, uc_hex) if macro_id: config['macro_ids'].add(macro_id) if uc_hex: @@ -482,9 +493,64 @@ void matrix_scan_user(void) { MACROCODE = """ #define UC_MODE_WIN 0 #define UC_MODE_LINUX 1 +#define UC_MODE_OSX 2 +// TODO: allow default mode to be configured static uint16_t unicode_mode = UC_MODE_WIN; +uint16_t hextokeycode(uint8_t hex) {{ + if (hex == 0x0) {{ + return KC_P0; + }} + if (hex < 0xA) {{ + return KC_P1 + (hex - 0x1); + }} + return KC_A + (hex - 0xA); +}} + +void unicode_action_function(uint16_t hi, uint16_t lo) {{ + switch (unicode_mode) {{ + case UC_MODE_WIN: + register_code(KC_LALT); + + register_code(KC_PPLS); + unregister_code(KC_PPLS); + + register_code(hextokeycode((hi & 0xF0) >> 4)); + unregister_code(hextokeycode((hi & 0xF0) >> 4)); + register_code(hextokeycode((hi & 0x0F))); + unregister_code(hextokeycode((hi & 0x0F))); + register_code(hextokeycode((lo & 0xF0) >> 4)); + unregister_code(hextokeycode((lo & 0xF0) >> 4)); + register_code(hextokeycode((lo & 0x0F))); + unregister_code(hextokeycode((lo & 0x0F))); + + unregister_code(KC_LALT); + break; + case UC_MODE_LINUX: + register_code(KC_LCTL); + register_code(KC_LSFT); + + register_code(KC_U); + unregister_code(KC_U); + + register_code(hextokeycode((hi & 0xF0) >> 4)); + unregister_code(hextokeycode((hi & 0xF0) >> 4)); + register_code(hextokeycode((hi & 0x0F))); + unregister_code(hextokeycode((hi & 0x0F))); + register_code(hextokeycode((lo & 0xF0) >> 4)); + unregister_code(hextokeycode((lo & 0xF0) >> 4)); + register_code(hextokeycode((lo & 0x0F))); + unregister_code(hextokeycode((lo & 0x0F))); + + unregister_code(KC_LCTL); + unregister_code(KC_LSFT); + break; + case UC_MODE_OSX: + break; + }} +}} + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {{ if (!record->event.pressed) {{ return MACRO_NONE; @@ -494,57 +560,35 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {{ case UM: unicode_mode = (unicode_mode + 1) % 2; break; - {macro_cases} +{macro_cases} +{unicode_macro_cases} default: break; }} - if (unicode_mode == UC_MODE_WIN) {{ - switch(id) {{ - {win_macro_cases} - default: - break; - }} - }} else if (unicode_mode == UC_MODE_LINUX) {{ - switch(id) {{ - {linux_macro_cases} - default: - break; - }} - }} return MACRO_NONE; }}; """ -WIN_UNICODE_MACRO_TEMPLATE = """ -case {0}: - return MACRODOWN( - D(LALT), T(KP_PLUS), {1}, U(LALT), END - ); -""" -LINUX_UNICODE_MACRO_TEMPLATE = """ -case {0}: - return MACRODOWN( - D(LCTRL), D(LSHIFT), T(U), U(LCTRL), U(LSHIFT), {1}, T(KP_ENTER), END - ); -""" +UNICODE_MACRO_TEMPLATE = """ +case {macro_id}: + unicode_action_function(0x{hi:02x}, 0x{lo:02x}); + break; +""".strip() -def macro_cases(config, mode): - if mode == 'win': - template = WIN_UNICODE_MACRO_TEMPLATE - elif mode == 'linux': - template = LINUX_UNICODE_MACRO_TEMPLATE - else: - raise ValueError("Invalid mode: ", mode) - template = template.strip() +def unicode_macro_cases(config): for macro_id, uc_hex in config['unicode_macros'].items(): + hi = int(uc_hex, 16) >> 8 + lo = int(uc_hex, 16) & 0xFF unimacro_keys = ", ".join( "T({})".format( "KP_" + digit if digit.isdigit() else digit ) for digit in uc_hex ) - yield template.format(macro_id, unimacro_keys) + yield UNICODE_MACRO_TEMPLATE.format( + macro_id=macro_id, hi=hi, lo=lo + ) def iter_keymap_lines(keymap): @@ -599,8 +643,7 @@ def iter_keymap_parts(config, keymaps): # macros yield MACROCODE.format( macro_cases="", - win_macro_cases="\n".join(macro_cases(config, mode='win')), - linux_macro_cases="\n".join(macro_cases(config, mode='linux')), + unicode_macro_cases="\n".join(unicode_macro_cases(config)), ) # TODO: dynamically create blinking lights @@ -624,7 +667,7 @@ def main(argv=sys.argv[1:]): out_path = os.path.join(dirname, "keymap.c") config = parse_config(in_path) - valid_keys = parse_valid_keys(config) + valid_keys = parse_valid_keys(config, out_path) keymaps = parse_keymaps(config, valid_keys) with io.open(out_path, mode="w", encoding="utf-8") as fh: diff --git a/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex b/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex index cb8b7fa8d4..ee1d30967d 100644 --- a/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex +++ b/keyboard/ergodox_ez/keymaps/german-manuneo/german-manuneo.hex @@ -1,1624 +1,1240 @@ -:100000000C94BD0F0C9401100C9401100C94011071
-:100010000C9401100C9401100C9401100C9401101C
-:100020000C9401100C9401100C94791B0C944B1C33
-:100030000C9401100C9401100C9401100C940110FC
-:100040000C9401100C94D6300C9401100C940110F7
-:100050000C9401100C94782A0C9401100C9401104B
-:100060000C9401100C9401100C9401100C940110CC
-:100070000C9401100C9401100C9401100C940110BC
-:100080000C9401100C9401100C9401100C940110AC
-:100090000C9401100C9401100C9401100C9401109C
-:1000A0000C9401100C9401100C940110AB107810FA
-:1000B0006310BD10E4101711F910FF1014113E1158
-:1000C0003511021138114E10F3102911321175102B
-:1000D0006C10BA10B11099106F103010C6101A11B0
-:1000E00023112F119F10CF10AE1048102011ED10CA
-:1000F0009010A5109C108410261193103910F01048
-:100100008A10C9106C12B410661054107E107B1047
-:10011000D210A2100E113F108D10B7102D10C0106C
-:100120000B111111DB105D10F6104B1072105710EF
-:10013000CC10FC103B113310A810C3100511D510C2
-:100140005A102C11EA10451096106010E110691039
-:1001500008114210D810E7103610511041111D112E
-:1001600081103C10DE108710D311A0118B11E51106
-:100170000C123F12211227123C1266125D122A1233
-:10018000601276111B1251125A129D119411E21134
-:10019000D911C11197115811EE1142124B12571279
-:1001A000C711F711D611701148121512B811CD11DF
-:1001B000C411AC114E12BB1161111812B211F11120
-:1001C0006F12DC118E117C11A611A311FA11CA1144
-:1001D00036126711B511DF115511E81133123912BA
-:1001E000031285111E1273119A117F11F41124123A
-:1001F00063125B11D011EB112D12FD1182115412FB
-:1002000012126D11BE1188110912911130126A116A
-:1002100000120F125E11791169124512A9116411B1
-:100220000612AF11B01CD21CBD1DD21CBD1D141D69
-:10023000371DBD1D8C1D9F1D8C208C20BA20BA201F
-:10024000FC203821382338235021382347224722E5
-:10025000122338233823262301E001E10118021874
-:1002600002E002E10162026201620262010502052E
-:1002700001070207015802580001E001E1011802DC
-:100280001802E002E101620262015B025B016102AD
-:1002900061015C025C015802580001E001E10118B3
-:1002A000021802E002E1015A025A01620262016090
-:1002B0000260015E025E015802580001E001E101A6
-:1002C00018021802E002E101620262015B025B01B6
-:1002D000610261015B025B015802580001E001E12B
-:1002E0000118021802E002E101620262015B025B96
-:1002F00001610261015D025D015802580001E001E7
-:10030000E10118021802E002E101620262015B02EF
-:100310005B0161026101060206015802580001E01A
-:1003200001E10118021802E002E101620262015BD0
-:10033000025B01040204015D025D015802580001E4
-:10034000E001E10118021802E002E1015A025A013B
-:10035000620262015F025F0109020901580258004E
-:1003600001E001E10118021802E002E1016202620B
-:10037000015B025B0161026101050205015802583F
-:100380000001E001E10118021802E002E10162024D
-:1003900062015B025B010502050161026101580215
-:1003A000580001E001E10118021802E002E10162D7
-:1003B0000262015B025B016102610160026001583F
-:1003C00002580001E001E10118021802E002E10117
-:1003D000620262015B025B01060206015F025F01CD
-:1003E0005802580001E001E10118021802E002E1A0
-:1003F0000162026201620262010502050106020653
-:10040000015802580001E001E10118021802E0025F
-:10041000E101620262015B025B01040204015C0211
-:100420005C015802580001E001E10118021802E0E5
-:1004300002E1015A025A015A025A01620262016241
-:100440000262015802580001E001E101180218029D
-:10045000E002E101620262015B025B01040204014D
-:100460005F025F015802580001E001E10118021823
-:1004700002E002E1015A025A015A025A015E025E8A
-:1004800001620262015802580001E001E101180214
-:100490001802E002E101620262015B025B010602F6
-:1004A00006015D025D015802580001E001E10118FA
-:1004B000021802E002E1015A025A015A025A01628C
-:1004C000026201610261015802580001E001E1018C
-:1004D00018021802E002E1015A025A0162026201A6
-:1004E0005F025F01620262015802580001E001E10F
-:1004F0000118021802E002E1015A025A0162026286
-:10050000015F025F01600260015802580001E001D2
-:10051000E10118021802E002E101620262015B02DD
-:100520005B01610261015F025F015802580001E056
-:1005300001E10118021802E002E101620262015BBE
-:10054000025B01610261015A025A0158025800011E
-:10055000E001E10118021802E002E1015A025A0129
-:1005600062026201600260015F025F01580258008E
-:1005700001E001E10118021802E002E101620262F9
-:10058000015B025B01610261015902590158025885
-:100590000001E001E10118021802E002E1015A0243
-:1005A0005A01620262016002600160026001580249
-:1005B000580001E001E10118021802E002E10162C5
-:1005C0000262015B025B01610261010402040158E5
-:1005D00002580001E001E10118021802E002E10105
-:1005E000620262015B025B0105020501060206016F
-:1005F0005802580001E001E10118021802E002E18E
-:1006000001620262015B025B01050205015C025CA2
-:10061000015802580001E001E10118021802E0024D
-:10062000E1015A025A01620262015F025F01610246
-:1006300061015802580001E001E10118021802E0CE
-:1006400002E1015A025A015902590161026101593C
-:100650000259015802580001E001E1011802180294
-:10066000E002E1015A025A015A025A016202620191
-:100670005D025D015802580001E001E10118021815
-:1006800002E002E10162026201620262010502050A
-:10069000015B025B015802580001E001E101180210
-:1006A0001802E002E10162026201620262010502D7
-:1006B0000501080208015802580001E001E1011893
-:1006C000021802E002E101620262016202620105B7
-:1006D000020501590259015802580001E001E101E7
-:1006E00018021802E002E1015A025A015A025A01A4
-:1006F000620262015B025B015802580001E001E105
-:100700000118021802E002E1015A025A0162026273
-:10071000015F025F015D025D015802580001E001C6
-:10072000E10118021802E002E101620262015B02CB
-:100730005B01060206015C025C015802580001E000
-:1007400001E10118021802E002E101620262015BAC
-:10075000025B01610261015E025E01580258000104
-:10076000E001E10118021802E002E1015A025A0117
-:100770006202620160026001590259015802580088
-:1007800001E001E10118021802E002E101620262E7
-:10079000015B025B01060206016102610158025819
-:1007A0000001E001E10118021802E002E101620229
-:1007B00062015B025B01040204015B025B015802FF
-:1007C000580001E001E10118021802E002E1015ABB
-:1007D000025A016202620160026001620262015813
-:1007E00002580001E001E10118021802E002E101F3
-:1007F0006202620162026201070207015F025F0199
-:100800005802580001E001E10118021802E002E17B
-:10081000015A025A015A025A0162026201600260E0
-:10082000015802580001E001E10118021802E0023B
-:10083000E101620262015B025B0161026101090286
-:1008400009015802580001E001E10118021802E014
-:1008500002E1015A025A015A025A01590259010889
-:100860000208015802580001E001E10118021802D3
-:10087000E002E101620262015B025B010602060125
-:100880005E025E015802580001E001E10118021801
-:1008900002E002E101620262015B025B0104020408
-:1008A000015E025E015802580001E001E1011802F8
-:1008B0001802E002E101620262015B025B010502D3
-:1008C0000501590259015802580001E001E10118DF
-:1008D000021802E002E1015A025A015A025A015C6E
-:1008E000025C015B025B015802580001E001E1017A
-:1008F00018021802E002E1015A025A016202620182
-:10090000600260015A025A015802580001E001E1F8
-:100910000118021802E002E101620262015B025B5F
-:1009200001050205015F025F015802580001E00164
-:10093000E10118021802E002E101620262015B02B9
-:100940005B0105020501600260015802580001E0E8
-:1009500001E10118021802E002E101620262015B9A
-:10096000025B01610261010802080158025800019E
-:10097000E001E10118021802E002E10162026201F5
-:100980005B025B01060206015A025A015802580036
-:1009900001E001E10118021802E002E101620262D5
-:1009A000015B025B01040204016202620158025809
-:1009B0000001E001E10118021802E002E1015A021F
-:1009C0005A01620262015F025F015F025F01580229
-:1009D000580001E001E10118021802E002E10162A1
-:1009E0000262015B025B0105020501040204015879
-:1009F00002580001E001E10118021802E002E101E1
-:100A0000620262015B025B01050205015D025D019C
-:100A10005802580001E001E10118021802E002E169
-:100A200001620262015B025B01050205015E025E7A
-:100A3000015802580001E001E10118021802E00229
-:100A4000E101620262015B025B010502050107022E
-:100A500007015802580001E001E10118021802E004
-:100A600002E1015A025A01590259015D025D015C1D
-:100A7000025C015802580001E001E101180218026D
-:100A8000E002E101620262015B025B010502050115
-:100A90005B025B015802580001E001E101180218F5
-:100AA00002E002E1015A025A01590259015D025D58
-:100AB00001610261015802580001E001E1011802E0
-:100AC0001802E002E101620262015B025B010602C0
-:100AD0000601590259015802580001E001E10118CC
-:100AE000021802E002E101620262015B025B0106A0
-:100AF0000206015B025B015802580001E001E101BE
-:100B000018021802E002E10162026201620262015F
-:100B1000090209015F025F015802580001E001E18A
-:100B20000118021802E002E101620262015B025B4D
-:100B30000161026101070207015802580001E0014A
-:100B4000E10118021802E002E1015A025A016202B0
-:100B50006201600260015C025C015802580001E021
-:100B600001E10118021802E002E101620262015B88
-:100B7000025B010402040160026001580258000196
-:100B8000E001E10118021802E002E10162026201E3
-:100B90005B025B010402040161026101580258001A
-:100BA00001E001E10118021802E002E101620262C3
-:100BB0000162026201050205015A025A01580258F7
-:100BC0000001E001E10118021802E002E101620205
-:100BD00062015B025B0106020601620262015802C9
-:100BE000580001E001E10118021802E002E1015A97
-:100BF000025A0159025901610261015B025B01580D
-:100C000002580001E001E10118021802E002E101CE
-:100C10005A025A01620262015F025F015E025E01D6
-:100C20005802580001E001E10118021802E002E157
-:100C3000015A025A0159025901610261015A025ACC
-:100C4000015802580001E001E10118021802E00217
-:100C5000E1015A025A01620262015F025F015C0215
-:100C60005C015802580001E001E10118021802E09D
-:100C700002E1015A025A01620262016002600161EE
-:100C80000261015802580001E001E1011802180256
-:100C9000E002E101620262015B025B010602060101
-:100CA000600260015802580001E001E101180218D9
-:100CB00002E002E1015A025A01590259015D025D46
-:100CC000015D025D015802580001E001E1011802D6
-:100CD0001802E002E101620262015B025B01610253
-:100CE0006101610261015802580001E001E101184F
-:100CF000021802E002E1015A025A01620262016036
-:100D00000260015D025D015802580001E001E1014D
-:100D100018021802E002E101620262015B025B015B
-:100D2000050205015A025A015802580001E001E18A
-:100D30000118021802E002E101620262016202622D
-:100D40000105020501610261015802580001E0013C
-:100D5000E10118021802E002E1015A025A015A02A6
-:100D60005A01620262015C025C015802580001E013
-:100D700001E10118021802E002E101620262015B76
-:100D8000025B010502050108020801580258000132
-:100D9000E001E10118021802E002E1015A025A01E1
-:100DA000590259015D025D015B025B015802580066
-:100DB00001E001E10118021802E002E101620262B1
-:100DC000015B025B0105020501050205015802589D
-:100DD0000001E001E10118021802E002E1015A02FB
-:100DE0005A01590259015D025D01050205015802CF
-:100DF000580001E001E10118021802E002E1015A85
-:100E0000025A0162026201600260015B025B0158EA
-:100E100002580001E001E10118021802E002E101BC
-:100E2000620262015B025B01040204015902590182
-:100E30005802580001E001E10118021802E002E145
-:100E4000015A025A015902590161026101620262AA
-:100E5000015802580001E001E10118021802E00205
-:100E6000E101620262015B025B0105020501090208
-:100E700009015802580001E201570257016202625B
-:100E800001620262010502050107020702E2000198
-:100E9000E20157025701620262015B025B016102DB
-:100EA00061015C025C02E20001E201570257015A53
-:100EB000025A0162026201600260015E025E02E2A9
-:100EC0000001E20157025701620262015B025B010D
-:100ED000610261015B025B02E20001E2015702571D
-:100EE00001620262015B025B01610261015D025D00
-:100EF00002E20001E20157025701620262015B0255
-:100F00005B016102610106020602E20001E2015793
-:100F1000025701620262015B025B01040204015D8F
-:100F2000025D02E20001E201570257015A025A0132
-:100F3000620262015F025F0109020902E20001E24E
-:100F40000157025701620262015B025B01610261AB
-:100F50000105020502E20001E201570257016202A7
-:100F600062015B025B010502050161026102E200B0
-:100F700001E20157025701620262015B025B0161FB
-:100F800002610160026002E20001E20157025701C2
-:100F9000620262015B025B01060206015F025F0200
-:100FA000E20001E20157025701620262016202623D
-:100FB000010502050106020602E20001E2015702F4
-:100FC0005701620262015B025B01040204015C02E0
-:100FD0005C02E20001E201570257015A025A015A2B
-:100FE000025A016202620162026202E20001E2014F
-:100FF00057025701620262015B025B0104020401B5
-:101000005F025F02E20001E201570257015A025AF1
-:10101000015A025A015E025E0162026202E20001AE
-:10102000E20157025701620262015B025B010602A4
-:1010300006015D025D02E20001E201570257015A1A
-:10104000025A015A025A016202620161026102E21D
-:101050000001E201570257015A025A01620262017D
-:101060005F025F0162026202E20001E20157025781
-:10107000015A025A01620262015F025F016002606E
-:1010800002E20001E20157025701620262015B02C3
-:101090005B01610261015F025F02E20001E2015750
-:1010A000025701620262015B025B01610261015A47
-:1010B000025A02E20001E201570257015A025A01A4
-:1010C00062026201600260015F025F02E20001E20F
-:1010D0000157025701620262015B025B016102611A
-:1010E0000159025902E20001E201570257015A0276
-:1010F0005A01620262016002600160026002E20065
-:1011000001E20157025701620262015B025B016169
-:1011100002610104020402E20001E20157025701E8
-:10112000620262015B025B01050205010602060222
-:10113000E20001E20157025701620262015B025BB9
-:1011400001050205015C025C02E20001E2015702B6
-:1011500057015A025A01620262015F025F01610295
-:101160006102E20001E201570257015A025A015995
-:101170000259016102610159025902E20001E201D2
-:10118000570257015A025A015A025A016202620179
-:101190005D025D02E20001E2015702570162026254
-:1011A0000162026201050205015B025B02E20001CD
-:1011B000E201570257016202620162026201050206
-:1011C000050108020802E20001E20157025701622C
-:1011D000026201620262010502050159025902E23E
-:1011E0000001E201570257015A025A015A025A01FC
-:1011F000620262015B025B02E20001E201570257F8
-:10120000015A025A01620262015F025F015D025DE2
-:1012100002E20001E20157025701620262015B0231
-:101220005B01060206015C025C02E20001E201577A
-:10123000025701620262015B025B01610261015EB1
-:10124000025E02E20001E201570257015A025A010E
-:10125000620262016002600159025902E20001E289
-:101260000157025701620262015B025B010602063E
-:101270000161026102E20001E201570257016202CC
-:1012800062015B025B01040204015B025B02E2009B
-:1012900001E201570257015A025A016202620160DB
-:1012A00002600162026202E20001E201570257019C
-:1012B0006202620162026201070207015F025F02CD
-:1012C000E20001E201570257015A025A015A025A3A
-:1012D000016202620160026002E20001E201570263
-:1012E0005701620262015B025B0161026101090256
-:1012F0000902E20001E201570257015A025A015A5B
-:10130000025A015902590108020802E20001E201F1
-:1013100057025701620262015B025B01060206018D
-:101320005E025E02E20001E20157025701620262C0
-:10133000015B025B01040204015E025E02E2000145
-:10134000E20157025701620262015B025B01050282
-:10135000050159025902E20001E201570257015A00
-:10136000025A015A025A015C025C015B025B02E212
-:101370000001E201570257015A025A01620262015A
-:10138000600260015A025A02E20001E2015702576C
-:1013900001620262015B025B01050205015F025FFF
-:1013A00002E20001E20157025701620262015B02A0
-:1013B0005B010502050160026002E20001E20157E3
-:1013C000025701620262015B025B01610261010876
-:1013D000020802E20001E2015702570162026201C3
-:1013E0005B025B01060206015A025A02E20001E2B8
-:1013F0000157025701620262015B025B01040204B1
-:101400000162026202E20001E201570257015A0240
-:101410005A01620262015F025F015F025F02E20045
-:1014200001E20157025701620262015B025B0105A2
-:1014300002050104020402E20001E2015702570121
-:10144000620262015B025B01050205015D025D0251
-:10145000E20001E20157025701620262015B025B96
-:1014600001050205015E025E02E20001E20157028F
-:101470005701620262015B025B010502050107027E
-:101480000702E20001E201570257015A025A0159CC
-:101490000259015D025D015C025C02E20001E201B1
-:1014A00057025701620262015B025B0105020501FE
-:1014B0005B025B02E20001E201570257015A025A45
-:1014C00001590259015D025D0161026102E2000100
-:1014D000E20157025701620262015B025B010602F0
-:1014E000060159025902E20001E201570257016266
-:1014F0000262015B025B01060206015B025B02E223
-:101500000001E201570257016202620162026201B8
-:10151000090209015F025F02E20001E2015702577E
-:1015200001620262015B025B016102610107020765
-:1015300002E20001E201570257015A025A01620217
-:101540006201600260015C025C02E20001E201579C
-:10155000025701620262015B025B01040204016046
-:10156000026002E20001E2015702570162026201D9
-:101570005B025B010402040161026102E20001E21C
-:10158000015702570162026201620262010502050F
-:10159000015A025A02E20001E201570257016202B7
-:1015A00062015B025B010602060162026202E20066
-:1015B00001E201570257015A025A015902590161C9
-:1015C0000261015B025B02E20001E2015702570186
-:1015D0005A025A01620262015F025F015E025E020C
-:1015E000E20001E201570257015A025A0159025919
-:1015F00001610261015A025A02E20001E20157024E
-:1016000057015A025A01620262015F025F015C02E5
-:101610005C02E20001E201570257015A025A0162DC
-:101620000262016002600161026102E20001E20106
-:1016300057025701620262015B025B01060206016A
-:1016400060026002E20001E201570257015A025AA9
-:1016500001590259015D025D015D025D02E2000176
-:10166000E20157025701620262015B025B01610203
-:10167000610161026102E20001E201570257015A71
-:10168000025A0162026201600260015D025D02E2D3
-:101690000001E20157025701620262015B025B0135
-:1016A000050205015A025A02E20001E201570257FF
-:1016B00001620262016202620105020501610261CA
-:1016C00002E20001E201570257015A025A015A028E
-:1016D0005A01620262015C025C02E20001E201570F
-:1016E000025701620262015B025B0105020501080B
-:1016F000020802E20001E201570257015A025A01B0
-:10170000590259015D025D015B025B02E20001E2E8
-:101710000157025701620262015B025B010502058B
-:101720000105020502E20001E201570257015A02D7
-:101730005A01590259015D025D0105020502E200EC
-:1017400001E201570257015A025A01620262016026
-:101750000260015B025B02E20001E20157025701F5
-:10176000620262015B025B01040204015902590238
-:10177000E20001E201570257015A025A0159025987
-:10178000016102610162026202E20001E2015702AC
-:101790005701620262015B025B0105020501090259
-:1017A0000902E200055204520152035201000000F6
-:1017B0001E001B0018002F00010029001F0013004D
-:1017C0000C003300E300E1002000090004003400B5
-:1017D000E2002A0021001A0008000600E00065006F
-:1017E00022000A0012001900000049002E004A00E1
-:1017F00000004D00000002542E02025400002B0095
-:1018000000005E0023000B001600050000004C00E5
-:1018100024000D0011001000E2004B0025000E0016
-:101820001500360001002C0026000F0017003700BD
-:1018300050002800270014000700520051004E00FD
-:1018400035001C002D001D004F00000001000100AC
-:1018500001000100010000001E02300238020100F8
-:10186000010001001F026414380030000100010073
-:101870002002240223022702010001000100241497
-:1018800025140100010001000100271426140100A5
-:101890000000010001000100000001000000010043
-:1018A0000100010000000100000001000100310002
-:1018B00021022D1400000100010064002502220213
-:1018C000010001000100640226023602010001004D
-:1018D00001000100301437023830010035021F02C8
-:1018E0003102553002300100010001002D020100DB
-:1018F0003D30000001000100010001000100000076
-:101900003A00010001000100010001003B0001005C
-:1019100001000100010001003C0001000100010084
-:10192000010001003D000100010001000100010073
-:101930003E00010001000100000001004400010020
-:1019400000000100000001004500010000005300FC
-:10195000000001003F000100010001000000010043
-:1019600040005F005C00590062000100410060001F
-:101970005D005A0085000100420061005E005B00CE
-:101980006300010043005500560057005800010055
-:101990006700540056005700580000000100010085
-:1019A00001000100010000004D30393001005B30C2
-:1019B00001000100513058303C303B300100010043
-:1019C0005030013014145D30010001004A305930AC
-:1019D00008145C30010001004930573004300030F9
-:1019E00000000100053001000000010000000100BE
-:1019F0000100010000000100000001004F305A30DA
-:101A000037301E02000001004E3001004B30010053
-:101A100001000100483056305430533001000100BD
-:101A20004C30010003303A30010001005230010017
-:101A3000010001000100010001000100010001009E
-:101A40000100000001000100010001000100000090
-:101A500042302030343001000100010046302E3089
-:101A6000263033300100010045302D301E3001009A
-:101A70000100010040302B30223001000100010044
-:101A80003F3025302C300100000001000100010032
-:101A90000000010000000100010001000000010041
-:101AA000000001004430233031301F3000000100BD
-:101AB000433035302A302930010001003E302730D4
-:101AC0003030010001000100413028303230010087
-:101AD0000100010047300100213001000100010038
-:101AE0000100363024302F300100000001000100D9
-:101AF0000100010001000000010008301B3001005E
-:101B000001000100010015300D301A300100010004
-:101B10000100143006300100010001000100123004
-:101B20000A3001000100010001000C3013300100F7
-:101B300000000100010001000000010000000100A0
-:101B400001000100000001000000010001000B3055
-:101B5000183007300000010001001C301130103037
-:101B60000100010001000E301730010001000100EA
-:101B700001000F30193001000100010001000100D7
-:101B8000093001000100010001001D300100163084
-:101B9000010000000100010001000100010000003F
-:101BA000010001000100010001000100010001002D
-:101BB000010001000100010001000100010001001D
-:101BC000010001000100010001000100010001000D
-:101BD00001000100010001000000010001000100FE
-:101BE00000000100000001000100010000000100F0
-:101BF00000000100010001000100010000000100DF
-:101C000001000100010001000100010001000100CC
-:101C100001000100010001000100010001000100BC
-:101C200001000100010001000100010001000100AC
-:101C3000010001000100010001000000010001009D
-:101C4000010001000100000001000100010001008D
-:101C5000010001000100010001000100010001007C
-:101C6000010001000100010001000100010001006C
-:101C7000010001000100010001000100010001005C
-:101C8000000001000100010000000100000001004F
-:101C9000010001000000010000000100010001003E
-:101CA000010001000000010001000100010001002D
-:101CB000010001000100010001000100010001001C
-:101CC000010001000100010001000100010001000C
-:101CD00001000100010001000100010001000100FC
-:101CE00001000000010001000100010001000000EE
-:101CF00001000100010001000100010001000100DC
|