From: tmk Date: Tue, 30 Aug 2016 02:22:14 +0000 (+0900) Subject: Merge branch 'unimap' X-Git-Url: https://git.gir.st/tmk_keyboard.git/commitdiff_plain/39d4f923cded1dd8f46a03ed757390a77f45e2c4?hp=9839bb83d98b2b5cdbad0c4ccf3b32669204062e Merge branch 'unimap' --- diff --git a/README.md b/README.md index 49992fcc..68e92b46 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,10 @@ The latest source code is available here: Updates ------- +#### 2016/06/26 +Keymap framework was updated. `fn_actions[]` should be defined as `action_t` instead of `uint16_t`. And default code for keymap handling is now included in core you just need define `uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]` and `action_t fn_actions[]`. + + #### 2016/06/22 Some projects were moved from `converter` and `keyboard` to `orphan` directory. Those might be removed in some future but you will be able to access them with `orphans` tag. See diff --git a/converter/adb_usb/Makefile b/converter/adb_usb/Makefile index 76e10950..14fc181b 100644 --- a/converter/adb_usb/Makefile +++ b/converter/adb_usb/Makefile @@ -1,64 +1,17 @@ -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device. -# Please customize your programmer settings(PROGRAM_CMD) -# -# make teensy = Download the hex file to the device, using teensy_loader_cli. -# (must have teensy_loader_cli installed). -# -# make dfu = Download the hex file to the device, using dfu-programmer (must -# have dfu-programmer installed). -# -# make flip = Download the hex file to the device, using Atmel FLIP (must -# have Atmel FLIP installed). -# -# make dfu-ee = Download the eeprom file to the device, using dfu-programmer -# (must have dfu-programmer installed). -# -# make flip-ee = Download the eeprom file to the device, using Atmel FLIP -# (must have Atmel FLIP installed). -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - # Target file name (without extension). -TARGET = adb_usb_lufa +TARGET ?= adb_usb # Directory common source filess exist -TMK_DIR = ../../tmk_core +TMK_DIR ?= ../../tmk_core # Directory keyboard dependent files exist -TARGET_DIR = . +TARGET_DIR ?= . # project specific files -SRC = keymap_common.c \ - matrix.c \ +SRC ?= matrix.c \ led.c \ adb.c -ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) -else - SRC := keymap_plain.c $(SRC) -endif - CONFIG_H = config.h @@ -66,7 +19,7 @@ CONFIG_H = config.h # atmega32u4 Teensy2.0 # atemga32u4 TMK Converter rev.1 # atemga32u2 TMK Converter rev.2 -MCU = atmega32u2 +MCU ?= atmega32u2 # Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the @@ -79,14 +32,14 @@ MCU = atmega32u2 # does not *change* the processor frequency - it should merely be updated to # reflect the processor speed set externally so that the code can use accurate # software delays. -F_CPU = 16000000 +F_CPU ?= 16000000 # # LUFA specific # # Target architecture (see library "Board Types" documentation). -ARCH = AVR8 +ARCH ?= AVR8 # Input clock frequency. # This will define a symbol, F_USB, in all source code files equal to the @@ -99,7 +52,7 @@ ARCH = AVR8 # # If no clock division is performed on the input clock inside the AVR (via the # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) +F_USB ?= $(F_CPU) # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT @@ -125,6 +78,9 @@ COMMAND_ENABLE = yes # Commands for debug and configuration #SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend #NKRO_ENABLE = yes # USB Nkey Rollover ADB_MOUSE_ENABLE = yes +#UNIMAP_ENABLE = yes +#ACTIONMAP_ENABLE = yes # Use 16bit actionmap instead of 8bit keymap +#KEYMAP_SECTION_ENABLE = yes # fixed address keymap for keymap editor # ADB Mice need acceleration for todays much bigger screens. OPT_DEFS += -DADB_MOUSE_MAXACC=8 @@ -133,6 +89,26 @@ OPT_DEFS += -DADB_MOUSE_MAXACC=8 # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax + +# +# Keymap file +# +ifdef UNIMAP_ENABLE + KEYMAP_FILE = unimap +else + ifdef ACTIONMAP_ENABLE + KEYMAP_FILE = actionmap + else + KEYMAP_FILE = keymap + endif +endif +ifdef KEYMAP + SRC := $(KEYMAP_FILE)_$(KEYMAP).c $(SRC) +else + SRC := $(KEYMAP_FILE)_plain.c $(SRC) +endif + + # Search Path VPATH += $(TARGET_DIR) VPATH += $(TMK_DIR) diff --git a/converter/adb_usb/Makefile.rev1 b/converter/adb_usb/Makefile.rev1 index 1cd539b6..caddb607 100644 --- a/converter/adb_usb/Makefile.rev1 +++ b/converter/adb_usb/Makefile.rev1 @@ -1,143 +1,3 @@ -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device. -# Please customize your programmer settings(PROGRAM_CMD) -# -# make teensy = Download the hex file to the device, using teensy_loader_cli. -# (must have teensy_loader_cli installed). -# -# make dfu = Download the hex file to the device, using dfu-programmer (must -# have dfu-programmer installed). -# -# make flip = Download the hex file to the device, using Atmel FLIP (must -# have Atmel FLIP installed). -# -# make dfu-ee = Download the eeprom file to the device, using dfu-programmer -# (must have dfu-programmer installed). -# -# make flip-ee = Download the eeprom file to the device, using Atmel FLIP -# (must have Atmel FLIP installed). -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -# Target file name (without extension). -TARGET = adb_usb_lufa - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# project specific files -SRC = keymap_common.c \ - matrix.c \ - led.c \ - adb.c - -ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) -else - SRC := keymap_ansi.c $(SRC) -endif - -CONFIG_H = config.h - - -# MCU name -# atmega32u4 Teensy2.0 -# atemga32u4 TMK Converter rev.1 -# atemga32u2 TMK Converter rev.2 +TARGET = adb_usb_rev1 MCU = atmega32u4 - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Interrupt driven control endpoint task(+60) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 for TMK Converter rev.1/rev.2 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 - - -# Build Options -# comment out to disable the options. -# -#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover -ADB_MOUSE_ENABLE = yes - -# ADB Mice need acceleration for todays much bigger screens. -OPT_DEFS += -DADB_MOUSE_MAXACC=8 - - -# Optimize size but this may cause error "relocation truncated to fit" -#EXTRALDFLAGS = -Wl,--relax - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - -include $(TMK_DIR)/protocol/lufa.mk -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk +include Makefile diff --git a/converter/adb_usb/Makefile.teensy b/converter/adb_usb/Makefile.teensy index d97f0eb3..604e3642 100644 --- a/converter/adb_usb/Makefile.teensy +++ b/converter/adb_usb/Makefile.teensy @@ -1,143 +1,3 @@ -#---------------------------------------------------------------------------- -# On command line: -# -# make all = Make software. -# -# make clean = Clean out built project files. -# -# make coff = Convert ELF to AVR COFF. -# -# make extcoff = Convert ELF to AVR Extended COFF. -# -# make program = Download the hex file to the device. -# Please customize your programmer settings(PROGRAM_CMD) -# -# make teensy = Download the hex file to the device, using teensy_loader_cli. -# (must have teensy_loader_cli installed). -# -# make dfu = Download the hex file to the device, using dfu-programmer (must -# have dfu-programmer installed). -# -# make flip = Download the hex file to the device, using Atmel FLIP (must -# have Atmel FLIP installed). -# -# make dfu-ee = Download the eeprom file to the device, using dfu-programmer -# (must have dfu-programmer installed). -# -# make flip-ee = Download the eeprom file to the device, using Atmel FLIP -# (must have Atmel FLIP installed). -# -# make debug = Start either simulavr or avarice as specified for debugging, -# with avr-gdb or avr-insight as the front end for debugging. -# -# make filename.s = Just compile filename.c into the assembler code only. -# -# make filename.i = Create a preprocessed source file for use in submitting -# bug reports to the GCC project. -# -# To rebuild project do "make clean" then "make all". -#---------------------------------------------------------------------------- - -# Target file name (without extension). -TARGET = adb_usb_lufa - -# Directory common source filess exist -TMK_DIR = ../../tmk_core - -# Directory keyboard dependent files exist -TARGET_DIR = . - -# project specific files -SRC = keymap_common.c \ - matrix.c \ - led.c \ - adb.c - -ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) -else - SRC := keymap_ansi.c $(SRC) -endif - -CONFIG_H = config.h - - -# MCU name -# atmega32u4 Teensy2.0 -# atemga32u4 TMK Converter rev.1 -# atemga32u2 TMK Converter rev.2 +TARGET = adb_usb_teensy MCU = atmega32u4 - -# Processor frequency. -# This will define a symbol, F_CPU, in all source code files equal to the -# processor frequency in Hz. You can then use this symbol in your source code to -# calculate timings. Do NOT tack on a 'UL' at the end, this will be done -# automatically to create a 32-bit value in your source code. -# -# This will be an integer division of F_USB below, as it is sourced by -# F_USB after it has run through any CPU prescalers. Note that this value -# does not *change* the processor frequency - it should merely be updated to -# reflect the processor speed set externally so that the code can use accurate -# software delays. -F_CPU = 16000000 - - -# -# LUFA specific -# -# Target architecture (see library "Board Types" documentation). -ARCH = AVR8 - -# Input clock frequency. -# This will define a symbol, F_USB, in all source code files equal to the -# input clock frequency (before any prescaling is performed) in Hz. This value may -# differ from F_CPU if prescaling is used on the latter, and is required as the -# raw input clock is fed directly to the PLL sections of the AVR for high speed -# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' -# at the end, this will be done automatically to create a 32-bit value in your -# source code. -# -# If no clock division is performed on the input clock inside the AVR (via the -# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. -F_USB = $(F_CPU) - -# Interrupt driven control endpoint task(+60) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - - -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 for TMK Converter rev.1/rev.2 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=512 - - -# Build Options -# comment out to disable the options. -# -#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend -#NKRO_ENABLE = yes # USB Nkey Rollover -ADB_MOUSE_ENABLE = yes - -# ADB Mice need acceleration for todays much bigger screens. -OPT_DEFS += -DADB_MOUSE_MAXACC=8 - - -# Optimize size but this may cause error "relocation truncated to fit" -#EXTRALDFLAGS = -Wl,--relax - -# Search Path -VPATH += $(TARGET_DIR) -VPATH += $(TMK_DIR) - -include $(TMK_DIR)/protocol/lufa.mk -include $(TMK_DIR)/protocol.mk -include $(TMK_DIR)/common.mk -include $(TMK_DIR)/rules.mk +include Makefile diff --git a/converter/adb_usb/Makefile.unimap b/converter/adb_usb/Makefile.unimap new file mode 100644 index 00000000..70ecf3d0 --- /dev/null +++ b/converter/adb_usb/Makefile.unimap @@ -0,0 +1,4 @@ +TARGET = adb_usb_unimap +UNIMAP_ENABLE = yes +KEYMAP_SECTION_ENABLE = yes +include Makefile diff --git a/converter/adb_usb/README.md b/converter/adb_usb/README.md index 034540c9..2240d023 100644 --- a/converter/adb_usb/README.md +++ b/converter/adb_usb/README.md @@ -1,10 +1,10 @@ ADB to USB keyboard converter ============================= -This firmware converts Apple ADB keyboard protocol to USB. You can use TMK Converter, PJRC Teensy2.0 and other USB AVR MCU(ATMega32U4, AT90USB64/128 or etc) for this. But binary size is probably more than 10KB and it won't fit into 8K flash. +This firmware converts Apple ADB keyboard protocol to USB, you can use it to plug old ADB keyboard into modern computer. It works on TMK ADB-USB Converter, PJRC Teensy2.0 and other USB AVR MCU(ATMega32U4, AT90USB64/128 or etc) and needs more than 10KB flash at least. -Discuss: http://geekhack.org/showwiki.php?title=Island:14290 +Discuss here: http://geekhack.org/showwiki.php?title=Island:14290 -TMK Converter: https://geekhack.org/index.php?topic=72052.0 +You can buy a TMK converter here: https://geekhack.org/index.php?topic=72052.0 diff --git a/converter/adb_usb/binary/adb_usb_rev1_unimap.hex b/converter/adb_usb/binary/adb_usb_rev1_unimap.hex new file mode 100644 index 00000000..d99fd95c --- /dev/null +++ b/converter/adb_usb/binary/adb_usb_rev1_unimap.hex @@ -0,0 +1,1287 @@ +:100000000C945B050C94A2050C94A2050C94A2051B +:100010000C94A2050C94A2050C94A2050C94A205C4 +:100020000C94A2050C94A2050C94AB0F0C947D10BB +:100030000C942B1E0C94A2050C94A2050C94A20502 +:100040000C94A2050C94A2050C94A2050C94A20594 +:100050000C94A2050C949F1E0C94A2050C94A2056E +:100060000C94A2050C94A2050C94A2050C94A20574 +:100070000C94A2050C94A2050C94A2050C94A20564 +:100080000C94A2050C94A2050C94A2050C94A20554 +:100090000C94A2050C94A2050C94A2050C94A20544 +:1000A0000C94A2050C94A2050C94A205EA100C1164 +:1000B000FA110C11FA1151117411FA11C911DC1154 +:1000C0001A151A1547154715A215DE15D617D61796 +:1000D000F615D617F116F116AC17D617D617C217A4 +:1000E000041607090B0A1D1B06196405141A0815C6 +:1000F0001C171E1F202123222E26242D25273012D7 +:10010000182F0C13280F0D340E33313638111037D9 +:100110002B2C352A5829787B79397A504F515272D5 +:100120006C63685680668053020103555880576D92 +:100130006E5462595A5B5C5D5E5F6F606174756698 +:100140003E3F403C4142774476466B47804365459D +:100150008048494A4B4C3D4D3B4E3A7D7E7C7F73F7 +:100160000A0025303862003A2000253032580072EB +:100170002F632030313233343536370A0061646200 +:100180005F686F73745F6B62645F726563763A2059 +:100190004552524F52282564290A000A002530345E +:1001A00058006164625F686F73745F6B62645F7252 +:1001B0006563763A20004552524F523A206D65648D +:1001C0006961206B6579300A004552524F523A20DE +:1001D0006D65646961206B6579310A005D0A0025EF +:1001E000640020002564007C002530325800200087 +:1001F00025303258006164625F6D6F7573652072DF +:1002000061773A205B000A00253031366200616474 +:10021000625F686F73745F6D6F7573655F7265633E +:10022000763A2000646562756720656E61626C6570 +:10023000642E0A005363616E3A20616464723A2549 +:10024000642C20726567333A253034580A004166C1 +:1002500074657220696E69743A0A00466F756E643F +:100260003A206D65646961206B6579730A00536398 +:10027000616E3A20616464723A25642C207265676D +:10028000333A253034580A004265666F726520693A +:100290006E69743A0A005B735D004B6579626F6149 +:1002A00072642073746172742E0A00555342206385 +:1002B0006F6E666967757265642E0A005B575D0034 +:1002C0005B535D005B525D005B445D005B435D0022 +:1002D0002E0341004400420020006B0065007900BD +:1002E00062006F00610072006400200063006F0014 +:1002F0006E007600650072007400650072000000F8 +:100300000E0374002E006D002E006B002E00000006 +:100310000403090409027400040100A03209040066 +:100320000001030101000921110100012240000721 +:1003300005810308000A0904010001030102000904 +:100340002111010001224D000705820308000A095E +:1003500004020001030000000921110100012236FE +:10036000000705830308000A0904030002030000D4 +:100370000009211101000122220007058403200049 +:10038000010705040320000112011001000000080C +:10039000EDFEDB0A0101010200010631FF0974A133 +:1003A000010975150026FF00952075088102097660 +:1003B000150026FF00952075089102C005010980EF +:1003C000A101850216010026B7001A01002AB70014 +:1003D000751095018100C0050C0901A10185031666 +:1003E0000100269C021A01002A9C027510950181C9 +:1003F00000C005010902A1010901A10005091901B7 +:1004000029051500250195057501810295017503E2 +:1004100081010501093009311581257F9502750893 +:10042000810609381581257F950175088106050C1F +:100430000A38021581257F950175088106C0C0051F +:10044000010906A101050719E029E7150025019515 +:1004500008750181029501750881010508190129B6 +:10046000059505750191029501750391010507191F +:100470000029FF150026FF00950675088100C00AB7 +:10048000002530325820006B6579626F6172645FBD +:100490007265706F72743A20004C45443A202530E2 +:1004A00032580A00290A002575002F002575005DC5 +:1004B0002800256400200025640020002564002019 +:1004C000002564007C0025303258006D6F7573651F +:1004D0006B6579205B62746E7C7820792076206869 +:1004E0005D287265702F61636C293A205B006D6B2B +:1004F0005F776865656C5F74696D655F746F5F6D6C +:100500006178203D2025640A006D6B5F7768656522 +:100510006C5F6D61785F7370656564203D20256454 +:100520000A006D6B5F74696D655F746F5F6D6178F4 +:10053000203D2025640A006D6B5F6D61785F7370EC +:10054000656564203D2025640A006D6B5F696E74EB +:10055000657276616C203D2025640A006D6B5F64D6 +:10056000656C6179203D2025640A006D6B5F7768BA +:1005700065656C5F74696D655F746F5F6D61782030 +:100580003D2025640A006D6B5F776865656C5F6D63 +:1005900061785F7370656564203D2025640A006D95 +:1005A0006B5F74696D655F746F5F6D6178203D206E +:1005B00025640A006D6B5F6D61785F7370656564BB +:1005C000203D2025640A006D6B5F696E746572764C +:1005D000616C203D2025640A006D6B5F64656C6171 +:1005E00079203D2025640A000A00257500363A204E +:1005F000776865656C5F74696D655F746F5F6D6169 +:10060000783A20000A00257500353A20776865653C +:100610006C5F6D61785F73706565643A20000A00F5 +:10062000257500343A2074696D655F746F5F6D6184 +:10063000783A20000A00257500333A206D61785F12 +:1006400073706565643A20000A00257500323A200F +:10065000696E74657276616C286D73293A20000AA0 +:1006600000257500313A2064656C6179282A3130A3 +:100670006D73293A20000A092D2056616C75657347 +:10068000202D0A004D3E004D25643E20003F0073A2 +:1006900065742064656661756C740A00433E2000D1 +:1006A00077686572652064656C74613A2063757261 +:1006B000736F723D25642C20776865656C3D2564F9 +:1006C0000A53656520687474703A2F2F656E2E7713 +:1006D000696B6970656469612E6F72672F77696BEA +:1006E000692F4D6F7573655F6B6579730A000A0931 +:1006F0002D204D6F7573656B6579202D0A45534329 +:100700002F713A09717569740A313A0964656C612F +:1007100079282A31306D73290A323A09696E746575 +:100720007276616C286D73290A333A096D61785FBE +:1007300073706565640A343A0974696D655F746F36 +:100740005F6D61780A353A09776865656C5F6D6140 +:10075000785F73706565640A363A09776865656C19 +:100760005F74696D655F746F5F6D61780A0A703AD6 +:10077000097072696E742076616C7565730A643AEB +:10078000097365742064656661756C74730A7570AD +:100790003A092B310A646F776E3A092D310A706776 +:1007A00075703A092B31300A7067646F776E3A09B9 +:1007B0002D31300A0A7370656564203D2064656CD4 +:1007C0007461202A206D61785F7370656564202AEA +:1007D0002028726570656174202F2074696D655FD3 +:1007E000746F5F6D6178290A003F004D3E20004321 +:1007F0003E20004C25640A000A092D20436F6E73C9 +:100800006F6C65202D0A4553432F713A0971756944 +:10081000740A6D3A096D6F7573656B65790A000A24 +:10082000092D204D61676963202D0A643A096465CA +:100830006275670A783A096465627567206D61744C +:100840007269780A6B3A096465627567206B65792D +:10085000626F6172640A6D3A096465627567206D42 +:100860006F7573650A763A0976657273696F6E0AF9 +:10087000733A097374617475730A633A09636F6E2E +:10088000736F6C65206D6F64650A302D343A096CA6 +:1008900061796572302D34284631302D4634290A6D +:1008A000506175733A09626F6F746C6F6164657241 +:1008B0000A003F0074696D65725F7265616433326E +:1008C00028293A202530346C580A006B6579626F0C +:1008D0006172645F69646C653A2025580A006B6533 +:1008E00079626F6172645F70726F746F636F6C3A7C +:1008F0002025580A00686F73745F6B6579626F61B9 +:1009000072645F6C65647328293A2025580A000ACE +:10091000092D20537461747573202D0A00474343D9 +:100920003A20342E392E32204156522D4C49424322 +:100930003A20312E382E3073766E204156525F4168 +:100940005243483A20617672350A004F5054494F5D +:100950004E533A204C554641204D4F5553454B453B +:10096000592045585452414B455920434F4E534FFF +:100970004C4520434F4D4D414E44204B45594D4130 +:10098000505F53454354494F4E20343039360A00A6 +:100990004255494C443A20633634616436322D6402 +:1009A00069727479202831313A31353A3130204139 +:1009B00075672033302032303136290A00564944D9 +:1009C0003A2030784645454428742E6D2E6B2E29EA +:1009D000205049443A203078304144422841444232 +:1009E000206B6579626F61726420636F6E766572E9 +:1009F00074657229205645523A20307830313031B2 +:100A00000A00444553433A20636F6E766572742042 +:100A1000414442206B6579626F61726420746F207B +:100A20005553420A000A092D2056657273696F6E8C +:100A3000202D0A000A6D6F7573653A206F66660A8D +:100A4000000A6D6F7573653A206F6E0A000A6B6558 +:100A500079626F6172643A206F66660A000A6B659C +:100A600079626F6172643A206F6E0A000A6D617478 +:100A70007269783A206F66660A000A6D617472695D +:100A8000783A206F6E0A000A64656275673A206FD3 +:100A90006E0A000A64656275673A206F66660A002E +:100AA0000A0A626F6F746C6F616465722E2E2E205D +:100AB00000433E20000011241FBECFEFDAE0DEBF6E +:100AC000CDBF04B603FE27C08091DC019091DD010B +:100AD000A091DE01B091DF018730904BA740B04B71 +:100AE000D1F41092DC011092DD011092DE0110921F +:100AF000DF0114BE84B7877F84BF0FB6F894A89532 +:100B000080916000886180936000109260000FBE49 +:100B1000E0E0F8E3099511E0A0E0B1E0E4E1FEE4F3 +:100B200002C005900D92A433B107D9F721E0A4E3E8 +:100B3000B1E001C01D92AC3DB207E1F70E94DA0CB2 +:100B40000C9408270C940000FF93EF93E09134017C +:100B5000F0913501309709F00995EF91FF910895D3 +:100B6000FC018591803011F0EFDFFBCF0895FF2766 +:100B7000E0E230E247FF0CC0419597FF09C0EDE28B +:100B80006095709580959095611D711D811D911DD9 +:100B900027FF02C0219530E350E2AA27660F771F96 +:100BA000881F991FAA1FA41710F0A41B63955A95BC +:100BB000A9F7AA3008F0A95FA05DAF93F39561157E +:100BC00071058105910541F7ED3211F4EF93F3952D +:100BD000F21718F43F93F395FBCF8F91B5DFFA9599 +:100BE000E1F70895E991F9918591803021F08532FE +:100BF00019F0AADFF9CF089520E0E8945591553215 +:100C0000C1F3503311F4689455915A3348F450535A +:100C100090F3220F022E220F220F200D250FF4CF6A +:100C20000EF4219589919991533619F3533729F18F +:100C3000533559F1BC0188279927E8945C3621F493 +:100C40008991999168945591543639F446EF7EF024 +:100C500077FF0DC08FEF9FEF0AC055374AE039F09C +:100C6000583540E121F0523642E009F00895FF93F3 +:100C7000EF937DDFEF91FF91B7CFFF93EF93FC01EF +:100C800081918030B9F360DFFBCFFF93EF9368DF92 +:100C9000F1CFDF93CF93CDB7DEB72596A3DFCF910A +:100CA000DF910895282F2770E82FE695E695E695C1 +:100CB000EF70F0E0E95CFE4F87FF0AC081E090E052 +:100CC00001C0880F2A95EAF780959081892308C092 +:100CD00081E090E001C0880F2A95EAF79081892B86 +:100CE000808381E080934C0108950F931F93CF93ED +:100CF000DF93569A5E9A0E94BE092FEF87EA91E62B +:100D0000215080409040E1F700C0000088E892E068 +:100D10009F938F930E9449060F900F90C1E0D0E0FF +:100D20000EE612E063E08C2F0E94C209009771F07A +:100D30009F938F93DF93CF931F930F930E94490646 +:100D40000F900F900F900F900F900F909FEF29EF43 +:100D500080E0915020408040E1F700C000002196E3 +:100D6000C031D105F9F663E082E00E94C209813109 +:100D7000910511F170F487309105F1F020F404979A +:100D80000297F0F419C089309105B1F00D97C1F4C4 +:100D900013C08D31910581F030F48431910561F0FB +:100DA000499771F409C0843C910531F0873C910565 +:100DB00019F0813C910521F481E080934D0102C03E +:100DC00010924D0163E087E00E94C20991E08230F9 +:100DD00009F090E090934E01992341F08BE592E069 +:100DE0009F938F930E9449060F900F9023E042E05B +:100DF00063E082E00E94420A8EE492E09F938F9328 +:100E00000E9449060F900F90C1E0D0E004E312E089 +:100E100063E08C2F0E94C209009771F09F938F931B +:100E2000DF93CF931F930F930E9449060F900F906B +:100E30000F900F900F900F908FEF99EF20E081505F +:100E400090402040E1F700C000002196C031D1055C +:100E5000F9F6E7E3F1E080E18E0F11928E13FDCFFA +:100E60008091BE0181608093BE0184E292E00E9485 +:100E7000B005569A5E98DF91CF911F910F9108951A +:100E8000CF93DF938FE79BEB0197F1F700C0000052 +:100E90000E943E0AEC01009711F481E0C3C097FD67 +:100EA00005C080914701816080934701D7FF05C04D +:100EB000809147018E7F809347012D2F33272F7319 +:100EC0003327BE016F737727C6FF02C060547109D4 +:100ED000D6FF02C02054310940913601042E000C87 +:100EE000550B649FC001659F900D749F900D112458 +:100EF00081386FEF960714F481E89FEF9195819503 +:100F0000910981386FEF960714F481E89FEF81957E +:100F100080934801249FC001259F900D349F900D20 +:100F2000112481382FEF920714F481E89FEF9195F7 +:100F30008195910981386FEF960714F481E89FEF4E +:100F40008195809349018091BE0183FF60C08EE04E +:100F500092E00E94B005DF93CF9388E092E09F93E8 +:100F60008F930E94490686E092E00E94B00585EFCB +:100F700091E00E94B00580913601282F082E000CC8 +:100F8000330B3F938F9380EF91E09F938F930E9459 +:100F900049068EEE91E00E94B005809147011F92B4 +:100FA0008F9389EE91E09F938F930E94490687EE7D +:100FB00091E00E94B00580914801282F082E000C76 +:100FC000330B3F938F9384EE91E09F938F930E9416 +:100FD000490682EE91E00E94B00580914901282FD8 +:100FE000082E000C330B3F938F938FED91E09F936E +:100FF0008F930E9449068CED91E00E94B0058DB759 +:101000009EB744960FB6F8949EBF0FBE8DBF87E47F +:1010100091E00E946C128091360191E088300CF0D2 +:1010200090E0890F80933601DF91CF9108951F934F +:10103000CF93DF9310924C01C0910001D091010138 +:101040008FEF9FEF9093010180930001CF3F8FEFCF +:10105000D80709F06AC08FE79BEB0197F1F700C052 +:10106000000082E00E943B0AEC01892B09F05DC080 +:1010700080914E01882309F458C087E00E943B0A02 +:10108000009709F452C09C012F7733272230310595 +:10109000A1F048F42115310569F02130310599F4AA +:1010A00080788A641AC02330310551F02F3731051A +:1010B000A1F009C08078826410C0807889640DC076 +:1010C000807888640AC089EC91E09F938F930E9496 +:1010D00049060F900F9081E18FC0292F33272F777A +:1010E00033272130310579F050F02230310579F085 +:1010F0002330310581F4EC01D078D86416C0EC01BE +:10110000D078D26412C0EC01D078DA640EC0EC0161 +:10111000D078D9640AC086EB91E09F938F930E94A8 +:1011200049060F900F9080E167C08091BE0181FF5A +:1011300018C0209709F45DC082EA91E00E94B005D2 +:10114000DF93CF938DE991E09F938F930E9449069F +:101150008BE991E00E94B0050F900F900F900F90D7 +:1011600003C0209709F445C0CF379FE7D90711F492 +:101170008FE705C0CF3F8FEFD80721F48FEF0E9494 +:10118000520639C02D2F3327822F1C2F2F3F3105B8 +:1011900081F4DF93CF938DE791E09F938F930E942B +:1011A00049060E9475060F900F900F900F908C2F9C +:1011B00023C090914D01992381F0A9014F775527C4 +:1011C0004233510521F42078822F8A6006C04A30CC +:1011D000510519F42078822F82630E9452061F3F26 +:1011E00051F0DC2FCC27CF6FD0930101C0930001C9 +:1011F00002C080E001C081E0DF91CF911F9108958E +:10120000E82FF0E0E95CFE4F2081822F90E021E0A2 +:1012100030E002C0220F331F6A95E2F728233923FA +:1012200081E0232B09F480E00895E82FF0E0E95CE9 +:10123000FE4F80810895CF92DF92EF92FF920F933D +:101240001F93CF93DF938091BE0181FF35C08FE65E +:1012500091E00E94B00587E3E82E81E0F82EC0E01F +:10126000D0E09AE6C92E91E0D92E02E611E0DF9394 +:10127000CF93DF92CF920E94490687E691E00E94C9 +:10128000B005F70181917F010E94C01D1F928F93CD +:101290001F930F930E94490680E691E00E94B005DB +:1012A00021968DB79EB708960FB6F8949EBF0FBED5 +:1012B0008DBFC031D105D9F6DF91CF911F910F912C +:1012C000FF90EF90DF90CF900895682F609582E0B7 +:1012D0000C947C0A509A83E091E00197F1F700C0EA +:1012E000000050989AEB9A95F1F700C00895509A33 +:1012F0008AEB8A95F1F700C0509883E091E001975E +:10130000F1F700C000000895EF92FF920F931F9332 +:10131000CF93DF93C0E0D0E090E8E92EF12C082FC6 +:1013200010E0C7010C2E02C0959587950A94E2F74C +:1013300080239123892B19F00E94770902C00E9413 +:101340006A092196C830D10561F7DF91CF911F91CD +:101350000F91FF90EF900895489B06C023E02A95D7 +:10136000F1F700000197C1F70895489906C023E0FE +:101370002A95F1F700000197C1F708955898509801 +:1013800008950895CF92DF92EF92FF920F931F93EB +:10139000CF93DF931F92CDB7DEB7182FF894509AF2 +:1013A00083EF9BE00197F1F700C0000069830E9482 +:1013B000770969816C6020E1129FC0011124862B9E +:1013C0000E9484090E946A0984EF91E00E94B50995 +:1013D000892B21F4789482EE9FEF43C084EF91E053 +:1013E0000E94AC09009711F478943BC011E1C12C24 +:1013F000D12C02E882E890E00E94B5097C018823A4 +:1014000051F199270E94AC09882329F1CC0CDD1CED +:10141000902F9E19E81A9E1518F46894C0F806C01B +:10142000113121F478948CEE9FEF1BC0115011F70D +:101430008FE591E00E94B509892B21F478948BEE19 +:101440009FEF0FC08BE590E00E94AC09892BB1F7AC +:101450007894C60106C07894812F90E0919581958B +:1014600091090F90DF91CF911F910F91FF90EF9015 +:10147000DF90CF90089560E00C94C20960E083E0B3 +:101480000C94C2091F93CF93DF9300D01F92CDB766 +:10149000DEB7182FF894509A83EF9BE00197F1F78D +:1014A00000C000002B834A8369830E947709698109 +:1014B000686030E1139FC0011124862B0E948409CB +:1014C0000E946A098FE193E00197F1F700C00000E4 +:1014D0000E9477094A81842F0E9484092B81822FE0 +:1014E0000E9484090E946A0978940F900F900F90CF +:1014F000DF91CF911F910895262F277040E062E081 +:101500000C94420A80915A0108959FB7F894109262 +:1015100051019FBF9091D301943009F057C0909131 +:10152000E9009F703091EC00232F217030FD20E8FE +:10153000922B24E02093E9002091EB0020FF43C090 +:101540002091EE0027FF3FC020914F01222321F080 +:101550002091E80025FF37C010924F0126E030911E +:10156000E80035FD15C03091D301343061F530917C +:10157000EB0035FD28C0215021F481E080934F011C +:1015800022C0EFE9FFE03197F1F700C00000E7CF9C +:101590008093F1008091E80085FD0AC08091E80009 +:1015A00080FFFCCF8091E8008E778093E80006C032 +:1015B0008FB7F89421E0209351018FBF9F709093D3 +:1015C000E90080E008959F709093E9008FEF0895FF +:1015D000CF93DF9300D01F92CDB7DEB79C018091EF +:1015E000D301843019F593E099833B832A83909348 +:1015F000E9008FEF9091E800815095FD06C095EDD0 +:101600009A95F1F700008111F5CF8091E80085FFF0 +:101610000DC040E050E063E070E0CE0101960E9412 +:101620009B0D8091E8008E778093E8000F900F90DB +:101630000F90DF91CF910895CF93DF9300D01F9249 +:10164000CDB7DEB72091D301243021F522E02983E4 +:101650009B838A8383E08093E9008FEF9091E80079 +:10166000815095FD06C095ED9A95F1F70000811126 +:10167000F5CF8091E80085FF0DC040E050E063E0C9 +:1016800070E0CE0101960E949B0D8091E8008E775C +:101690008093E8000F900F900F90DF91CF91089505 +:1016A0002091D3012430F1F422E02093E9002FEFC0 +:1016B0003091E800215035FD06C035ED3A95F1F73F +:1016C00000002111F5CF2091E80025FF0BC040E07C +:1016D00050E065E070E00E949B0D8091E8008E77FD +:1016E0008093E8000895CF93DF932091D3012430B5 +:1016F00039F521E02093E9002FEF3091E8002150E7 +:1017000035FD06C035ED3A95F1F700002111F5CF12 +:101710002091E80025FF14C0EC0140E050E068E0B3 +:1017200070E00E949B0D8091E8008E778093E80026 +:1017300088E0FE01A2E5B1E001900D928A95E1F703 +:10174000DF91CF9108958CEC92E00E94B0058091DA +:10175000D201811109C00E94300F0E948D0F80912B +:10176000E20084608093E200089588EC92E00E9499 +:10177000B0051092D201089584EC92E00C94B0056B +:10178000209150012F5F822F62E30E94CE26992381 +:1017900019F0209350010895109250018091510149 +:1017A000882371F18091D301843041F58091E90063 +:1017B0008F702091EC00922F917020FD90E8892B82 +:1017C00094E09093E9009091EB0090FF14C0909109 +:1017D000EE0097FF10C09091E80095FF03C01092B3 +:1017E000F100F9CF9091E80090FF05C09091E800DA +:1017F0009E779093E8008F708093E90010925101DA +:10180000089542E061EC81E00E94AA0E42E061ECA2 +:1018100082E00E94AA0E42E061EC83E00E94AA0EE0 +:1018200042E261EC84E00C94AA0E8091D5018330F1 +:1018300009F453C030F4813071F0823009F48CC067 +:1018400008958A3009F478C08B3009F45EC089307D +:1018500009F09AC020C08091D401813A09F094C067 +:101860008091E800877F8093E8008091D801909173 +:10187000D901892B21F468E082E591E003C060E0A2 +:1018800080E090E070E00E94E60D8091E8008B77A8 +:101890008093E80008958091D401813209F074C0EA +:1018A0008091D8019091D901892B09F06DC0809168 +:1018B000E800877F8093E8008091E80082FD05C002 +:1018C0008091D3018111F8CF5FC08091F1008093A6 +:1018D0005A018091E8008B7753C08091D401813AFE +:1018E00009F052C08091D8019091D901892B09F05B +:1018F0004BC08091E800877F8093E8008091E800EA +:1019000080FFFCCF80910C0136C08091D4018132E0 +:10191000D9F58091D8019091D901892BA9F58091B1 +:10192000E800877F8093E8000E94DF0E8091D60157 +:1019300080930C010C94F7178091D401813221F52A +:101940008091E800877F8093E8000E94DF0E8091FD +:10195000D70180935B0108958091D401813AA1F46D +:101960008091E800877F8093E8008091E80080FF05 +:10197000FCCF80915B018093F1008091E8008E772D +:101980008093E8000C94DF0E08950895089508955B +:1019900080EC92E00E94B0050C94C70C0E94EA1DF6 +:1019A0008091D101882329F00E94151E81110C9489 +:1019B000850D089584B7877F84BF0FB6F894A895E6 +:1019C00080916000886180936000109260000FBE7B +:1019D00090E080E80FB6F8948093610090936100E6 +:1019E0000FBE0E94C50C0E94A4120E94300F0E94DC +:1019F0008D0F8091E20084608093E20085E89AE098 +:101A00000E94BB1D78948091D3018430E1F78BEA6A +:101A100092E00E94B0050E94A61282E091E00E942E +:101A200012128AE992E00E94B0050E94C60C8091D1 +:101A3000D301853039F486E992E00E94B0050E9416 +:101A4000CE0CF5CF0E94AC12F2CF0C94291E8CEB79 +:101A500092E00E94B0050C94250D292F33272330E6 +:101A60003105C9F064F42130310581F022303105AF +:101A700009F043C084E790E024E133E042C0213222 +:101A80003105F1F02232310541F137C082E190E0B9 +:101A900028E833E036C099278130910541F0823043 +:101AA000910541F0892B49F5E0E1F3E005C0E0E064 +:101AB000F3E002C0E0EDF2E0849190E09F0121C0EC +:101AC0006430D8F4E62FF0E0EE0FFF1FEF5DFE4F1D +:101AD0002081318189E090E014C0643070F470E0BE +:101AE000FB01EE0FFF1FE75EFE4F20813181FB01FE +:101AF000EB5EFE4F808190E004C080E090E020E04B +:101B000030E0FA0131832083089580E189BD82E1CC +:101B100089BD09B400FEFDCF8091D8008F7D8093F0 +:101B2000D8008091E00082608093E0008091E00026 +:101B300081FDFCCF0895CF92DF92EF92FF920F9339 +:101B40001F93CF93DF93EC018B016A010E94FE0E7D +:101B5000811133C0C114D10439F0F6018081918123 +:101B6000081B190BC80FD91FE12CF12C0115110509 +:101B700019F18091E80085FD16C08091E8008E770C +:101B80008093E800C114D10449F0F601808191816D +:101B9000E80EF91EF182E08285E00FC00E94FE0E81 +:101BA000882321F30AC089918093F1000150110923 +:101BB000FFEFEF1AFF0ADACF80E0DF91CF911F919C +:101BC0000F91FF90EF90DF90CF9008952091DA0170 +:101BD0003091DB012617370748F06115710539F49C +:101BE0002091E8002E772093E80001C0B90140E081 +:101BF00061157105A9F12091D301222309F443C095 +:101C0000253009F442C02091E80023FD40C0209116 +:101C1000E80022FD32C02091E80020FFE9CF40918A +:101C2000F3002091F20030E0342BFC01CF0161156C +:101C3000710559F02830310540F481918093F1000D +:101C4000615071092F5F3F4FF1CF41E028303105DE +:101C500009F040E02091E8002E772093E800C8CFFB +:101C60004111C9CF0AC08091D301882361F085302A +:101C700061F08091E80083FD0AC08091E80082FF56 +:101C8000F2CF80E0089582E0089583E0089581E036 +:101C900008952091DA013091DB012617370748F0CB +:101CA0006115710539F42091E8002E772093E80042 +:101CB00001C0B901FC0120E06115710591F180912D +:101CC000D301882309F440C0853009F43FC08091D6 +:101CD000E80083FD3DC08091E80082FD2FC0809127 +:101CE000E80080FFE9CF2091F3008091F20090E0BE +:101CF000922B6115710559F08830910540F42491BB +:101D00002093F1003196615071090196F2CF21E0E4 +:101D1000089709F020E08091E8008E778093E80032 +:101D2000CBCF2111CCCF0AC08091D301882361F0A1 +:101D3000853061F08091E80083FD0AC08091E80061 +:101D400082FFF2CF80E0089582E0089583E0089555 +:101D500081E00895982F973058F59093E9009817EF +:101D600039F07091EC002091ED005091F00003C02B +:101D7000242F762F50E021FF19C03091EB003E7FD9 +:101D80003093EB003091ED003D7F3093ED003091CA +:101D9000EB0031603093EB007093EC002093ED008A +:101DA0005093F0002091EE0027FF07C09F5FD3CF34 +:101DB0008F708093E90081E0089580E0089580911C +:101DC000D40187FF11C08091E80082FD05C0809199 +:101DD000D3018111F8CF11C08091E8008B770BC03F +:101DE0008091D301882349F08091E80080FFF8CFEB +:101DF0008091E8008E778093E80008952091E400B8 +:101E00003091E50095E64091EC00842F817040FF11 +:101E100022C08091E80080FD1CC08091D3018823FE +:101E200091F0853091F08091EB0085FD10C04091DC +:101E3000E4005091E5004217530729F39A019150AD +:101E400011F784E0089582E0089583E0089581E029 +:101E5000089580E008954091E80042FFDECF0895A4 +:101E60000E949E0F0E94A60FE0EEF0E0808181604C +:101E70008083E8EDF0E080818F77808319BCA7ED47 +:101E8000B0E08C918E7F8C9380818F7E80831092C6 +:101E9000D20108950F931F93CF93DF930E949E0F5B +:101EA0000E94A60FC8EDD0E088818F778883888153 +:101EB0008068888388818F7D888319BC1092D301C4 +:101EC0001092CF011092D1011092D00100EE10E0DB +:101ED000F80180818B7F808388818160888342E0E4 +:101EE00060E080E00E94AA0EE1EEF0E080818E7F4B +:101EF0008083E2EEF0E08081816080838081886071 +:101F00008083F80180818E7F8083888180618883CF +:101F1000DF91CF911F910F910895E8EDF0E080815E +:101F20008F7E8083E7EDF0E080818160808384E0B4 +:101F300082BF81E08093D2010C944A0FE8EDF0E07B +:101F400080818E7F80831092E20008951092DA00E3 +:101F50001092E10008951F920F920FB60F92112474 +:101F60002F933F934F935F936F937F938F939F93A1 +:101F7000AF93BF93EF93FF938091E10082FF0BC07B +:101F80008091E20082FF07C08091E1008B7F809307 +:101F9000E1000E94C00B8091DA0080FF1FC0809199 +:101FA000D80080FF1BC08091DA008E7F8093DA001A +:101FB0008091D90080FF0DC080E189BD82E189BD9B +:101FC00009B400FEFDCF81E08093D3010E94A30BF2 +:101FD00005C019BC1092D3010E94B50B8091E1009D +:101FE00080FF19C08091E20080FF15C08091E2005F +:101FF0008E7F8093E2008091E20080618093E20016 +:102000008091D80080628093D80019BC85E08093CD +:10201000D3010E94C80C8091E10084FF30C0809100 +:10202000E20084FF2CC080E189BD82E189BD09B452 +:1020300000FEFDCF8091D8008F7D8093D8008091E5 +:10204000E1008F7E8093E1008091E2008F7E80939B +:10205000E2008091E20081608093E2008091CF01F4 +:10206000882311F084E007C08091E30087FD02C05F +:1020700081E001C083E08093D3010E94270D80910D +:10208000E10083FF29C08091E20083FF25C0809199 +:10209000E100877F8093E10082E08093D30110927A +:1020A000CF018091E1008E7F8093E1008091E2007A +:1020B0008E7F8093E2008091E20080618093E20055 +:1020C00042E060E080E00E94AA0E8091F00088600B +:1020D0008093F0000E94BC0BFF91EF91BF91AF91F4 +:1020E0009F918F917F916F915F914F913F912F9130 +:1020F0000F900FBE0F901F9018951F920F920FB662 +:102100000F9211242F933F934F935F936F937F937D +:102110008F939F93AF93BF93CF93DF93EF93FF93EF +:10212000C091E900CF708091EC00D82FD17080FD74 +:10213000D0E81092E9008091F000877F8093F00052 +:1021400078940E94C1101092E9008091F00088609C +:102150008093F000CD2BCF70C093E900FF91EF91F9 +:10216000DF91CF91BF91AF919F918F917F916F91AF +:102170005F914F913F912F910F900FBE0F901F9045 +:1021800018951F93CF93DF93CDB7DEB7AA970FB6FD +:10219000F894DEBF0FBECDBFE4EDF1E088E08E0F16 +:1021A0009091F10091938E13FBCF0E94150C8091BA +:1021B000E80083FF1FC18091D4019091D501492F80 +:1021C00050E04A30510508F015C1FA01EA5AFF4FB4 +:1021D0000C94EE26803881F0823809F00BC1809192 +:1021E000D8018F708093E9008091EB0085FB8827F0 +:1021F00080F91092E90006C08091D0019091D10140 +:10220000911182609091E800977F9093E80080930D +:10221000F1001092F100C8C0282F2D7F09F0EAC00C +:10222000882319F0823061F0E5C08091D6018130B9 +:1022300009F0E0C0933009F080E08093D1012BC019 +:102240008091D601811127C08091D8018F7009F447 +:10225000D1C08093E9002091EB0020FF1CC0933097 +:1022600021F48091EB00806214C09091EB009061AA +:102270009093EB0021E030E0A90102C0440F551F0C +:102280008A95E2F74093EA001092EA008091EB0011 +:1022900088608093EB001092E9008091E800877FCE +:1022A00086C08111A7C01091D6011F778091E300ED +:1022B0008078812B8093E3008091E800877F809372 +:1022C000E8000E94DF0E8091E80080FFFCCF809143 +:1022D000E30080688093E300111102C082E001C036 +:1022E00083E08093D30186C08058823008F082C09A +:1022F0008091D6019091D7018C3D53E0950779F5F7 +:1023000083E08A838AE289834FB7F894DE011396CB +:1023100020E03EE051E2E32FF0E050935700E491DB +:1023200020FF03C0E295EF703F5FEF708E2F90E0CB +:10233000EA3010F0C79601C0C0968D939D932F5F31 +:10234000243149F74FBF8091E800877F8093E800F0 +:102350006AE270E0CE0101960E94E60D14C0AE0163 +:102360004F5F5F4F6091D8010E942D0DBC01892BFA +:1023700009F440C09091E800977F9093E80089812C +:102380009A810E94490E8091E8008B778093E80043 +:1023900031C0803879F58091E800877F8093E8002C +:1023A0008091CF018093F1008091E8008E77809337 +:1023B000E8000E94DF0E1EC081111CC09091D60162 +:1023C0009230C0F48091E800877F8093E80090937A +:1023D000CF010E94DF0E8091CF01811106C0809154 +:1023E000E30087FD02C081E001C084E08093D30157 +:1023F0000E94010C8091E80083FF0AC08091E800F0 +:10240000877F8093E8008091EB0080628093EB00EF +:10241000AA960FB6F894DEBF0FBECDBFDF91CF9165 +:102420001F91089590936101809360010895E09158 +:102430006001F0916101309721F00190F081E02D71 +:10244000099480E00895EF92FF920F931F93CF932A +:10245000DF93E0916001F09161013097B1F18C015F +:102460000280F381E02D09958091BE0182FF2DC08D +:1024700080FF04C087E894E00E94B005E80118E0FE +:1024800081E8E82E84E0F82E8091BE0180FF0BC029 +:1024900088811F928F93FF92EF920E9449060F90BE +:1024A0000F900F900F90115021961111EDCF809148 +:1024B000BE0180FF0AC08FE794E0DF91CF911F91AA +:1024C0000F91FF90EF900C94B005DF91CF911F9189 +:1024D0000F91FF90EF900895E0916001F0916101FC +:1024E000309721F00480F581E02D09940895209122 +:1024F0005E0130915F018217930771F090935F0145 +:1025000080935E01E0916001F0916101309721F0CC +:102510000680F781E02D0994089520915C013091A7 +:102520005D018217930771F090935D0180935C01C8 +:10253000E0916001F0916101309721F00084F18514 +:10254000E02D0994089508950C94A3120E94541E3E +:102550000E9475060C94C109CF92DF92EF92FF9210 +:102560000F931F93CF93DF9300D000D000D0CDB74F +:10257000DEB70E94170883E6C82E81E0D82E00E05F +:1025800010E0E02E802F0E941509F60141916F01A5 +:10259000F42EF826B1F40F5F1F4F0031110589F7B3 +:1025A0008FEF89838A831B820E945D1E8160782F52 +:1025B0009D838C8349815A816B818D810E946D132B +:1025C00047C09091BE0191FF04C08E830E941B09F9 +:1025D0008E8120E030E04F2D50E0922FBA01022E84 +:1025E00002C0759567950A94E2F760FF2BC02983B6 +:1025F000EA8221E030E0690102C0CC0CDD1C9A9532 +:10260000E2F790E08C219D21892B09F420E02B83B7 +:102610000E945D1E8160782F9D838C8349815A8141 +:102620006B818D810E946D1349815A816B817C8100 +:102630008D810E94D71DF801ED59FE4F8081C8267B +:10264000C08206C02F5F3F4F2830310531F6A3CF3F +:102650000E94D61D0E9420210E9440071091620115 +:102660000E941712181741F10E94171280936201FD +:102670009091BE0192FF0EC090FF0CC01F928F93ED +:1026800089E994E09F938F930E9449060F900F90E1 +:102690000F900F908091620126960FB6F894DEBFDE +:1026A0000FBECDBFDF91CF911F910F91FF90EF90A3 +:1026B000DF90CF900C94E81D26960FB6F894DEBFFD +:1026C0000FBECDBFDF91CF911F910F91FF90EF9083 +:1026D000DF90CF9008950C946509CF93DF93CDB729 +:1026E000DEB72B970FB6F894DEBF0FBECDBF942F89 +:1026F0004F83252F588769877A878B874A855B8523 +:10270000452B21F02F3F09F59F3FF9F4DE0111968B +:1027100086E0FD0111928A95E9F785E0FE01379682 +:1027200001900D928A95E1F749815A816B817C81F4 +:102730008D819E810E94911A2B960FB6F894DEBF70 +:102740000FBECDBFDF91CF9108954F815885698528 +:102750007A858B850E94D71DD9CFCF93882309F422 +:10276000CDC0C82F823859F40E94171281FDC6C00F +:1027700089E30E941C1D0E94951D89E30CC08338CB +:1027800079F40E94171280FDB9C083E50E941C1DD8 +:102790000E94951D83E50E94391DCF910C94951DD3 +:1027A000843859F40E94171282FDA8C087E40E9461 +:1027B0001C1D0E94951D87E4EECF8CEF8C0F813A93 +:1027C00048F48C2F0E944A24811198C08C2F0E94BB +:1027D0001C1DE3CF80E28C0F883048F4C77081E085 +:1027E00001C0880FCA95EAF70E945B1DD6CF8BE522 +:1027F0008C0F833078F4C53A29F0C63A31F083E87B +:1028000090E005C081E890E002C082E890E0CF91BE +:102810000C94771288E58C0F853108F06FC0C83AA8 +:1028200061F1C93A69F1CA3A71F1CB3A79F1CC3A1E +:1028300081F1CD3A89F1CE3A91F1CF3A99F1C13B8C +:10284000A1F1C03BA9F1C23BB1F1C33BB9F1C43B1B +:10285000C1F1C53BC9F1C63BD1F1C73BD9F1C83B7A +:10286000E1F1C93BE9F1CA3BF1F1CB3BF9F1CC3BDA +:1028700009F43FC080E090E03EC082EE90E03BC0B3 +:1028800089EE90E038C08AEE90E035C085EB90E0AC +:1028900032C086EB90E02FC083EB90E02CC084EB3D +:1028A00090E029C087EB90E026C08CEC90E023C03C +:1028B0008DEC90E020C083E891E01DC08AE891E0B3 +:1028C0001AC082E991E017C084E991E014C081E266 +:1028D00092E011C083E292E00EC084E292E00BC06D +:1028E00085E292E008C086E292E005C087E292E0CD +:1028F00002C08AE292E0CF910C948D12CF9108959C +:10290000882309F44BC0823859F40E94171281FFC2 +:1029100045C089E30E941C1D0E94951D89E30CC0DF +:10292000833871F40E94171280FF38C083E50E943B +:102930001C1D0E94951D83E50E94391D0C94951D58 +:10294000843859F40E94171282FF28C087E40E943D +:102950001C1D0E94951D87E4EFCF9CEF980F913AC4 +:1029600058F390E2980F983050F4877091E001C0CE +:10297000990F8A95EAF7892F0E94611DDFCF9BE5A9 +:10298000980F933020F480E090E00C947712885AEE +:10299000853120F480E090E00C948D120895882316 +:1029A00021F00E945B1D0C94951D0895882321F051 +:1029B0000E94611D0C94951D0895CF92DF92EF92B5 +:1029C000FF920F931F93CF93DF9300D000D000D0DE +:1029D000CDB7DEB725E0FC01DE01119601900D9226 +:1029E0002A95E1F7FC0140813181F2802581229511 +:1029F0002F7063817481672B09F4D8C23F3F19F4AB +:102A00004F3F09F4D3C26C0149833A8389819A818B +:102A10002E830E94DB1C182F092F0E94DA1C0E94B3 +:102A2000EA1BE02FE295EF70F0E0E05AFF4F2E81B5 +:102A30000C94EE26802F807F902F9F70092F882383 +:102A400011F00295007FFF2049F0002309F45FC2D6 +:102A5000802F0E946E1D0E94951D59C2812F0E94D9 +:102A60008014002309F4A2C2802F0E94741D2696B0 +:102A70000FB6F894DEBF0FBECDBFDF91CF911F918F +:102A80000F91FF90EF90DF90CF900C94951D802FC9 +:102A9000807F902F9F70092F803211F00295007F68 +:102AA000112319F0113001F129C0FF20A9F0802F66 +:102AB000222349F1213039F526960FB6F894DEBF6E +:102AC0000FBECDBFDF91CF911F910F91FF90EF907F +:102AD000DF90CF900C947E1D222319F0213009F451 +:102AE00065C20E94811D2CC0FF20E9F0263008F04D +:102AF0005DC20E94581D802329F022C0FF20F1F002 +:102B0000211115C0802F26960FB6F894DEBF0FBE98 +:102B1000CDBFDF91CF911F910F91FF90EF90DF908C +:102B2000CF900C94CF14253008F040C209C0F601B4 +:102B3000858180FFECC18F708583E4CF2111FBC1BB +:102B4000802F69C1202F26952695237030E021150E +:102B5000310521F021303105C9F028C2FF2021F0D4 +:102B6000812F902F937002C080E090E026960FB6E0 +:102B7000F894DEBF0FBECDBFDF91CF911F910F91B3 +:102B8000FF90EF90DF90CF900C947712FF2021F010 +:102B9000812F902F937002C080E090E026960FB6B0 +:102BA000F894DEBF0FBECDBFDF91CF911F910F9183 +:102BB000FF90EF90DF90CF900C948D12812FFF202B +:102BC00019F00E94A61F02C00E940E2026960FB682 +:102BD000F894DEBF0FBECDBFDF91CF911F910F9153 +:102BE000FF90EF90DF90CF900C949320802F837014 +:102BF00009F078C0F110DAC1812F8295869587702F +:102C0000880F880F912F9F70C92ED12CE12CF12CA9 +:102C1000082E04C0CC0CDD1CEE1CFF1C0A94D2F75D +:102C200014FF12C04FE050E060E070E004C0440FB9 +:102C3000551F661F771F8A95D2F7CB01BA016095A1 +:102C400070958095909503C060E070E0CB01202FD7 +:102C5000269526952370422F50E042305105D1F041 +:102C60004330510559F16C297D298E299F29413026 +:102C7000510541F126960FB6F894DEBF0FBECDBFC9 +:102C8000DF91CF911F910F91FF90EF90DF90CF9048 +:102C90000C94FF1B6C297D298E299F2926960FB63F +:102CA000F894DEBF0FBECDBFDF91CF911F910F9182 +:102CB000FF90EF90DF90CF900C94111C0E94FF1BAF +:102CC000C701B60126960FB6F894DEBF0FBECDBF82 +:102CD000DF91CF911F910F91FF90EF90DF90CF90F8 +:102CE0000C94ED1BFF2019F0802F817001C0869598 +:102CF000882309F45BC1812F829586958770880FA0 +:102D0000880F912F9F70C92ED12CE12CF12C082E09 +:102D100004C0CC0CDD1CEE1CFF1C0A94D2F714FF7F +:102D200012C04FE050E060E070E004C0440F551F57 +:102D3000661F771F8A95D2F7CB01BA01609570950F +:102D40008095909503C060E070E0CB01202F269520 +:102D500026952370422F50E042305105D1F0433088 +:102D6000510559F16C297D298E299F294130510542 +:102D700041F126960FB6F894DEBF0FBECDBFDF91AE +:102D8000CF911F910F91FF90EF90DF90CF900C9417 +:102D9000B61C6C297D298E299F2926960FB6F8949A +:102DA000DEBF0FBECDBFDF91CF911F910F91FF907E +:102DB000EF90DF90CF900C94C81C0E94B61CC70106 +:102DC000B60126960FB6F894DEBF0FBECDBFDF91D9 +:102DD000CF911F910F91FF90EF90DF90CF900C94C7 +:102DE000A41C103F41F118F4103E48F48BC0123F70 +:102DF00009F450C0D8F1133F09F460C083C01F70BC +:102E0000802F8F71FF2021F00E943D1C812F7BCEEF +:102E10000E945E1C812F26960FB6F894DEBF0FBE6F +:102E2000CDBFDF91CF911F910F91FF90EF90DF9079 +:102E3000CF900C94D614FF20A9F0253008F0B6C02E +:102E4000802F8F7126960FB6F894DEBF0FBECDBFD0 +:102E5000DF91CF911F910F91FF90EF90DF90CF9076 +:102E60000C94831C263008F0A1C0EACFFF20A1F00B +:102E7000802F8F7126960FB6F894DEBF0FBECDBFA0 +:102E8000DF91CF911F910F91FF90EF90DF90CF9046 +:102E90000C943D1CFF2061F3802F8F7126960FB696 +:102EA000F894DEBF0FBECDBFDF91CF911F910F9180 +:102EB000FF90EF90DF90CF900C945E1CFF2091F07C +:102EC000802F8F7126960FB6F894DEBF0FBECDBF50 +:102ED000DF91CF911F910F91FF90EF90DF90CF90F6 +:102EE0000C94281C26960FB6F894DEBF0FBECDBFFB +:102EF000DF91CF911F910F91FF90EF90DF90CF90D6 +:102F00000C94231CFF20A1F0222309F4B1CF812FC0 +:102F100026960FB6F894DEBF0FBECDBFDF91CF91DE +:102F20001F910F91FF90EF90DF90CF900C94AD1315 +:102F3000222309F4B1CF812F26960FB6F894DEBF75 +:102F40000FBECDBFDF91CF911F910F91FF90EF90FA +:102F5000DF90CF900C948014402F4F70612FC601EA +:102F60000E94201F26960FB6F894DEBF0FBECDBF7D +:102F7000DF91CF911F910F91FF90EF90DF90CF9055 +:102F80000C94351B402F4F70612FC60126960FB64B +:102F9000F894DEBF0FBECDBFDF91CF911F910F918F +:102FA000FF90EF90DF90CF900C94231F26960FB6E2 +:102FB000F894DEBF0FBECDBFDF91CF911F910F916F +:102FC000FF90EF90DF90CF9008950E947B1D0E94AC +:102FD0004A1D0E94951D0E94C5210E94932080E0F9 +:102FE00090E00E94771280E090E00C948D120E9495 +:102FF0006B1D0C94E5170E94DB1C292F22952F7066 +:1030000030E02C3031054CF42A3031056CF422507C +:1030100031092230310588F407C02C30310549F0E0 +:103020002F30310531F009C0803E48F0803F29F44F +:1030300006C093FB882780F9089580E0089581E019 +:103040000895CF93DF9300D000D01F92CDB7DEB7A5 +:103050000F900F900F900F900F90DF91CF910895E8 +:10306000CF93DF9300D000D000D0CDB7DEB7269647 +:103070000FB6F894DEBF0FBECDBFDF91CF9108959C +:103080001F93CF93DF93C091730116E08091740179 +:10309000C81799F0D0E01C9FF0011D9FF00D11247E +:1030A000EB58FE4F4081518162817381848195810B +:1030B0000E9430182196C770E9CFDF91CF911F9100 +:1030C00008954091A5015091A6016091A7017091CA +:1030D000A8018091A9019091AA010C9430188091C7 +:1030E000AA0182958F7009F054C08091A7018823AE +:1030F00009F44FC080917301A09174016091A50102 +:103100007091A6014091A8015091A901B6E08A17DB +:1031100009F43FC090E041155105C1F17F3F11F422 +:103120006F3FA1F1B89FF001B99FF00D1124EB584A +:10313000FE4F218172132AC02081621327C0228191 +:10314000211124C0238134812417350710F4215024 +:103150003109241B350B283C3105C0F42091AA010C +:103160002F7020612093AA0126E0289FF001299F5B +:10317000F00D1124E658FE4F80818F7080618083AE +:1031800085EA91E00E94DD140C9440180196877046 +:10319000BECF0895CF92DF92EF92FF920F931F93CD +:1031A000CF93DF93CDB7DEB762970FB6F894DEBF4B +:1031B0000FBECDBF8C0185E0F801DE011D960190A8 +:1031C0000D928A95E1F7D8014C9111965C91119777 +:1031D00012966C9112971396CD90DC9014973091C3 +:1031E000A5017091A6018091A8019091A901009775 +:1031F00009F46BC17F3F19F43F3F09F466C1E090C9 +:10320000A701EE2009F4C0C02091AA01C816D90672 +:1032100028F0F601E81BF90BCF0104C080959095CA +:103220008C0D9D1DFF24F394883C910578F0F12CC2 +:10323000207F09F0C6C07C2DD98AC88A89890E945E +:10324000211885EA91E00E94DD14B1C0822F807FB1 +:1032500009F046C0751314C0341312C0611110C0B8 +:103260002F7020612093AA010E94611885EA91E0E5 +:103270000E94DD148091AA01D80115968C932EC06E +:10328000CD2819F15F3F11F44F3FF9F0F62E61118F +:103290001CC0809173012091740136E0821709F4FB +:1032A0005AC090E0389FF001399FF00D1124EB587F +:1032B000FE4F7181571306C07081471303C072819E +:1032C000711103C001968770E9CFF62E662309F4C9 +:1032D00018C18091AA0181608093AA01F12C11C1CB +:1032E000751308C0341306C0611104C08091AA018F +:1032F000D801C3C04D875E878D859E856A8B0E94ED +:10330000FB176A898823E1F16623D1F12091AA0194 +:10331000822F82958F7090E0029774F08091A501C2 +:103320009091A60198878F831986DB86CA862C87A1 +:10333000CE0107960E94DD1486E0F801A5EAB1E00F +:1033400001900D928A95E1F70E946F180E94611812 +:10335000FF24F394D6C04D875E878D859E850E949D +:10336000DB1C292F22952F7030E0223031050CF024 +:10337000BCC09F7009F0B6C0805E883008F4C1C040 +:10338000C8010E94DD14E4CFC816D90608F453C062 +:10339000F601E81BF90BCF01883C910508F450C0F9 +:1033A000F12C7C2DD98AC88A89890E942118E5EAE6 +:1033B000F1E086E0DF011D928A95E9F70E9461182D +:1033C000A0C0751314C0341312C0611110C08091D5 +:1033D000AA01F8018583C8010E94DD1486E0E5EAB0 +:1033E000F1E0DF011D928A95E9F7FE2C8AC04D8736 +:1033F0005E878D859E856A8B0E94FB176A8988236C +:1034000009F4BECF662309F4BBCF2091AA01822F15 +:1034100082958F7090E002970CF48ECF8091A50179 +:103420009091A6019A8389831B82DD82CC822E83B0 +:10343000CE0101967FCF809590958C0D9D1DACCFD0 +:10344000F62E662309F49CCF75132EC034132CC0BE +:103450002091AA0120FD1FC0822F82958F70D9F084 +:10346000D80115962C9315978F3049F08F5F982FC0 +:103470009295907F822F8F70892B15968C93C8011F +:103480000E94DD1486E0F801A5EAB1E001900D92FA +:103490008A95E1F793CF86E0F801A5EAB1E00190C3 +:1034A0000D928A95E1F72DC04D875E878D859E85AB +:1034B0000E94FB17811140CF8091AA018160809307 +:1034C000AA01C8010E94DD141CC0662309F458CF6C +:1034D0004D875E878D859E850E94FB17882309F4A2 +:1034E0004FCF2ACF811148CF0CC0243031050CF0CA +:1034F00047CF9F7009F440CFF8019581907F09F084 +:103500003BCF8F2D62960FB6F894DEBF0FBECDBFB6 +:10351000DF91CF911F910F91FF90EF90DF90CF90AF +:1035200008951F93CF93DF93CDB7DEB72C970FB6D7 +:10353000F894DEBF0FBECDBF4F83588769877A8767 +:103540008B879C87CE0107960E94CA18882369F052 +:103550008F8198852A853B85232BF1F19F3F09F0C8 +:1035600063C08F3F09F060C037C086E0FE01379628 +:10357000DE01119601900D928A95E1F76F817885B1 +:10358000EA85FB85309741F17F3F11F46F3F21F1D0 +:103590002091740130E0C90101968770992740910C +:1035A000730150E08417950709F447C069837A8353 +:1035B000FD83EC8396E0929FD001939FB00D112480 +:1035C000AB58BE4FFE01319601900D929A95E1F7EE +:1035D000809374010E94401816E0809173019091CD +:1035E00074018917C1F1189FC00111248B589E4F97 +:1035F0000E94CA18882379F1E09173011E9FF0019F +:103600001124EB58FE4F4081518162817381848186 +:1036100095810E9430188091730190E00196877027 +:10362000992780937301D9CF4F81588569857A8511 +:103630008B859C850E943018CFCF0E94F71710927F +:10364000740110927301E5EAF1E086E0DF011D925A +:103650008A95E9F7C1CF2C960FB6F894DEBF0FBE5E +:10366000CDBFDF91CF911F910895DF92EF92FF922E +:103670000F931F93CF93DF93FC01892B09F48AC02A +:10368000E12CF12CDD24D394EF0121968491853730 +:1036900009F461C058F4843708F04EC0843008F053 +:1036A0006AC08130D1F0823071F174C0883709F47A +:1036B0005DC050F4863709F455C0873709F06AC0F9 +:1036C0008E2D0E94681D54C09CE7980F903708F01B +:1036D00061C08F770E94801450C08F010E5F1F4F12 +:1036E000FE01849190E2980F983050F48770FD2D80 +:1036F00001C0FF0F8A95EAF78F2F0E946E1D14C03C +:103700000E94AD1313C08F010E5F1F4FFE01C491C5 +:1037100080E28C0F883060F4C7708D2D01C0880F57 +:10372000CA95EAF70E94741D0E94951DE80125C004 +:103730008C2F0E948014FACF9F012E5F3F4FFE0115 +:10374000C491CC2369F08FE99FE00197F1F700C0A5 +:103750000000C150F6CF9F012E5F3F4FFE01F49055 +:10376000E9010BC00E94581DE82E07C00E946B1D86 +:103770000E94951D02C00E94AD138F2D882341F039 +:10378000EFE9FFE03197F1F700C000008150F6CF7C +:10379000FE017ACFDF91CF911F910F91FF90EF90B3 +:1037A000DF9008956093AF017093B0018093B101F1 +:1037B0009093B2010E94E61D0C94E5176093AB0153 +:1037C0007093AC018093AD019093AE010E94E71D10 +:1037D0000C94E51708950C94D21B0F931F9300913E +:1037E000AF011091B0012091B1013091B201602B75 +:1037F000712B822B932B1F910F910C94D21B0F9343 +:103800001F930091AF011091B0012091B10130914F +:10381000B20160237123822393231F910F910C9493 +:10382000D21B0F931F930091AF011091B001209113 +:10383000B1013091B20160277127822793271F9130 +:103840000F910C94D21B60E070E0CB010C94DE1B56 +:103850000F931F9341E050E060E070E08A019B010C +:1038600004C0000F111F221F331F8A95D2F7C90110 +:10387000B8011F910F910C94DE1B0F931F9341E031 +:1038800050E060E070E004C0440F551F661F771FD2 +:103890008A95D2F78091AB019091AC01A091AD01D6 +:1038A000B091AE018A019B01082B192B2A2B3B2BCF +:1038B000C901B8011F910F910C94DE1B0F931F9348 +:1038C00041E050E060E070E004C0440F551F661F07 +:1038D000771F8A95D2F740955095609570958091A5 +:1038E000AB019091AC01A091AD01B091AE018A0104 +:1038F0009B01082319232A233B23C901B8011F91E7 +:103900000F910C94DE1B0F931F9341E050E060E099 +:1039100070E004C0440F551F661F771F8A95D2F7C9 +:103920008091AB019091AC01A091AD01B091AE013D +:103930008A019B01082719272A273B27C901B801BB +:103940001F910F910C94DE1B0F931F930091AB01FD +:103950001091AC012091AD013091AE01602B712B23 +:10396000822B932B1F910F910C94DE1B0F931F93AF +:103970000091AB011091AC012091AD013091AE01ED +:1039800060237123822393231F910F910C94DE1BDC +:103990000F931F930091AB011091AC012091AD01E9 +:1039A0003091AE0160277127822793271F910F91D5 +:1039B0000C94DE1B0895CF92DF92EF92FF920F934B +:1039C0001F93CF93DF938C01C090AF01D090B001D3 +:1039D000E090B101F090B2014091AB015091AC0187 +:1039E0006091AD017091AE01C42AD52AE62AF72A6A +:1039F000CFE1D0E0D701C6010C2E04C0B695A79543 +:103A0000979587950A94D2F780FF07C0B8018C2F4D +:103A10000E94F51E8130910531F4219758F7B801C5 +:103A200080E00E94F51EDF91CF911F910F91FF90D2 +:103A3000EF90DF90CF90089520910D0130910E010D +:103A4000F90132969FEF40E05191581789F09F3F5E +:103A500019F4511101C0942F4F5F4630A9F79F3FD1 +:103A600039F0F901E90FF11D97FDFA958283089568 +:103A7000089520910D0130910E01F9013296285FD1 +:103A80003F4F9081981301C010823196E217F307DF +:103A9000C1F7089581E090E0E0910D01F0910E01F1 +:103AA000E80FF91F1082019688309105A9F7089553 +:103AB0008091BD0108959091BD01892B8093BD0136 +:103AC000089580959091BD0189238093BD0108954B +:103AD0008093BD0108951092BD0108959091BC019D +:103AE000892B8093BC01089580959091BC01892316 +:103AF0008093BC0108951092BC0108958093B30196 +:103B000008951092B301089580910D0190910E01D6 +:103B1000FC0131969C01285F3F4F80E0919191110B +:103B20008F5FE217F307D1F70895E0910D01F0914F +:103B30000E018091BD018083E0910D01F0910E0195 +:103B400090818091BC01892B80838091B30188236F +:103B500061F0E0910D01F0910E019081892B80833D +:103B60000E94841D81111092B30180910D019091EA +:103B70000E010C9423129093350180933401089523 +:103B80008295982F9C7C392F36953695282F237354 +:103B900044E0249FC0011124932F982B292F2A7AC7 +:103BA0002695892F8575880F822B08950895CF93C8 +:103BB000DF9300D000D01F92CDB7DEB70F900F90EB +:103BC0000F900F900F90DF91CF9108950895089571 +:103BD0000C946B138091D301843021F11092BF01BA +:103BE00020E488E190E00FB6F894A89580936000F7 +:103BF0000FBE2093600083B7817F846083BF83B74B +:103C0000816083BF7894889583B78E7F83BF0FB61A +:103C1000F894A8958091600088618093600010926C +:103C200060000FBE089508950895CF930E94131E5B +:103C30000E9417080E94141EC0E08C2F0E941509D4 +:103C4000811104C0CF5FC031C1F701C081E0CF91C5 +:103C500008950C94F7171F920F920FB60F9211242C +:103C60008F939F93AF93BF938091BF01811113C036 +:103C70008091C0019091C101A091C201B091C30196 +:103C80004196A11DB11D8093C0019093C101A093E5 +:103C9000C201B093C301BF91AF919F918F910F90DB +:103CA0000FBE0F901F90189582E084BD93E095BDE4 +:103CB0009AEF97BD80936E0008952FB7F894809186 +:103CC000C0019091C101A091C201B091C3012FBF69 +:103CD00008952FB7F8946091C0017091C10180914F +:103CE000C2019091C3012FBF0895CF92DF92EF924E +:103CF000FF920F931F932FB7F8944091C0015091FA +:103D0000C1016091C2017091C3012FBF6A017B01A3 +:103D1000EE24FF248C0120E030E0C016D106E2063C +:103D2000F30610F4415051099A01281B390BC901BF +:103D30001F910F91FF90EF90DF90CF9008951F9209 +:103D40000F920FB60F9211248F939F93AF93BF934F +:103D50008091C0019091C101A091C201B091C301B5 +:103D60000196A11DB11D8093C0019093C101A09344 +:103D7000C201B093C301BF91AF919F918F910F90FA +:103D80000FBE0F901F9018950E94300FF8942FEFE0 +:103D900087EA91E6215080409040E1F700C00000A2 +:103DA00087E090EBDC018093DC019093DD01A09330 +:103DB000DE01B093DF019CE088E10FB6F894A8958E +:103DC000809360000FBE90936000FFCF28E0929F29 +:103DD000F0011124E80FF11DE052FF4F8491982F5C +:103DE00090778F7092959F700895CF93C82FCB01D5 +:103DF0000E94E61E292F30E0E82FF0E0A90164E0E0 +:103E0000440F551F6A95E1F74E2B5F2B4038510543 +:103E100019F480E090E012C088E0C89F200D311DA9 +:103E2000112484E0220F331F8A95E1F7E20FF31F7C +:103E3000EE0FFF1FE050F84985919491CF910895BE +:103E400080E090E0089508958091C60180FF0BC046 +:103E50006091120185E0689FB00111247595679506 +:103E6000759567952BC081FF09C06091120185E0AF +:103E7000689FB00111247595679520C082FF07C027 +:103E80006091120185E0689FB001112417C09091E4 +:103E9000C7019923D1F060911101961788F72091FD +:103EA000120185E0289F90011124929FA001939F09 +:103EB000500D112470E0CA010E94DA2660387105A5 +:103EC00040F46115710539F002C065E070E0862F9D +:103ED00008958FE7089581E008958091C60180FFDD +:103EE00008C06091100170E07595679575956795AC +:103EF00021C081FF06C06091100170E07595679543 +:103F000019C082FF04C06091100170E010C0909150 +:103F1000C7019923C1F060910F019617A0F7809116 +:103F20001001899FC001112470E00E94DA266038D8 +:103F3000710528F46115710521F0862F08958FE72A +:103F4000089581E0089561E070E0F4CF803F21F4AE +:103F50000E94241F819504C0813F29F40E94241FE0 +:103F60008093CA010895823F21F40E94241F819505 +:103F700004C0833F29F40E94241F8093C90108953F +:103F8000893F19F40E946D1F05C08A3F31F40E94D9 +:103F90006D1F81958093CB0108958B3F21F40E9482 +:103FA0006D1F819504C08C3F29F40E946D1F809382 +:103FB000CC010895843F21F48091C801816017C02D +:103FC000853F21F48091C801826011C0863F21F4B1 +:103FD0008091C80184600BC0873F21F48091C801A3 +:103FE000886005C0883F31F48091C801806180936A +:103FF000C80108958D3F21F48091C60181600BC0F6 +:104000008E3F21F48091C601826005C08F3F29F464 +:104010008091C60184608093C6010895803F39F481 +:104020008091CA0187FF6CC01092CA0169C0813FAC +:1040300029F48091CA011816BCF362C09091C9019D +:10404000823F29F497FF5CC01092C90159C0833F99 +:1040500019F41916CCF354C0893F41F48091CB0177 +:1040600018160CF04DC01092CB014AC08A3F29F4BB +:104070008091CB0187FF44C0F6CF8B3F39F480910C +:10408000CC0187FF3DC01092CC013AC08C3F29F48F +:104090008091CC011816BCF333C0843F21F4809189 +:1040A000C8018E7F17C0853F21F48091C8018D7FA4 +:1040B00011C0863F21F48091C8018B7F0BC0873FE0 +:1040C00021F48091C801877F05C0883F31F4809139 +:1040D000C8018F7E8093C80113C08D3F21F4809169 +:1040E000C6018E7F0BC08E3F21F48091C6018D7F6B +:1040F00005C08F3F29F48091C6018B7F8093C60154 +:104100008091C90181110EC08091CA0181110AC03C +:104110008091CB01811106C08091CC01811102C038 +:104120001092C70108958091BE0183FF7EC08BEC81 +:1041300094E00E94B0058091C8011F928F9386EC95 +:1041400094E09F938F930E94490684EC94E00E9430 +:10415000B0058091C901282F082E000C330B3F9326 +:104160008F9381EC94E09F938F930E9449068FEB8D +:1041700094E00E94B0058091CA01282F082E000CFF +:10418000330B3F938F938CEB94E09F938F930E941C +:1041900049068AEB94E00E94B0058091CB01282F5C +:1041A000082E000C330B3F938F9387EB94E09F9383 +:1041B0008F930E94490685EB94E00E94B0058091A0 +:1041C000CC01282F082E000C330B3F938F9382EBEA +:1041D00094E09F938F930E9449068FEA94E00E9497 +:1041E000B0058091C7011F928F938CEA94E09F9352 +:1041F0008F930E9449068AEA94E00E94B00580915C +:10420000C6011F928F9387EA94E09F938F930E9439 +:10421000490684EA94E00E94B0058DB79EB74C969B +:104220000FB6F8949EBF0FBE8DBF88EC91E00E9440 +:104230006C120E945D1E9093C5018093C401089585 +:104240001F93CF93DF938091C4019091C5010E9489 +:10425000751EAC019091C701992321F020911301A3 +:1042600030E006C0209114018AE0289F90011124BB +:104270004217530708F485C08091C901C091CA0153 +:10428000D091CB011091CC01811107C0C11175C033 +:10429000D11173C0111171C074C09F3F19F09F5F9D +:1042A0009093C701181624F40E94241F8093C9011B +:1042B0008091C90187FF05C00E94241F81958093CA +:1042C000C9011C1624F40E94241F8093CA01809106 +:1042D000CA0187FF05C00E94241F81958093CA01EF +:1042E0006091C901662331F1C091CA01CC2311F15B +:1042F000062E000C770B880B990B0E94D52523E323 +:1043000033E343E35FE30E9439260E949D256093D7 +:10431000C9016C2FCC0F770B880B990B0E94D52508 +:1043200023E333E343E35FE30E9439260E949D25A4 +:104330006093CA011D1624F40E946D1F8093CB0167 +:104340008091CB0187FF05C00E946D1F81958093EE +:10435000CB01111624F40E946D1F8093CC01809133 +:10436000CC0187FF05C00E946D1F81958093CC0111 +:10437000DF91CF911F910C9493209F3F09F08FCF35 +:1043800097CFDF91CF911F910895E8ECF1E085E0A0 +:10439000DF011D928A95E9F71092C7011092C601BC +:1043A00008958EEE96E00E94B0051F9281E08F93F3 +:1043B0001F9285E08F9380EA96E09F938F930E94EF +:1043C00049060F900F900F900F900F900F90089547 +:1043D0008330E9F128F4813061F0823009F10895E9 +:1043E000853009F462C008F449C0863009F474C00D +:1043F000089580911401262F30E0280F311D2F3FA2 +:10440000310524F4680F6093140103C08FEF80938B +:104410001401809114011F928F9389ED95E072C071 +:1044200080911301262F30E0280F311D2F3F3105D9 +:1044300024F4680F6093130103C08FEF809313017E +:10444000809113011F928F9387EC95E05BC0809160 +:104450001201262F30E0280F311D2F3F310524F4A3 +:10446000680F6093120103C08FEF80931201809157 +:1044700012011F928F9384EB95E044C0809111014B +:10448000262F30E0280F311D2F3F310524F4680F0F +:104490006093110103C08FEF80931101809111018E +:1044A0001F928F938FE995E02DC080911001262FE8 +:1044B00030E0280F311D2F3F310524F4680F609341 +:1044C000100103C08FEF80931001809110011F92A3 +:1044D0008F9386E895E016C080910F01262F30E07B +:1044E000280F311D2F3F310524F4680F60930F0111 +:1044F00003C08FEF80930F0180910F011F928F9364 +:104500008BE695E09F938F930E9449060F900F9042 +:104510000F900F900895833081F128F4813059F085 +:104520008230D1F00895853009F449C0B8F1863061 +:1045300009F456C0089580911401681720F4861B71 +:104540008093140102C010921401809114011F92F3 +:104550008F938CE595E054C080911301681720F487 +:10456000861B8093130102C01092130180911301E6 +:104570001F928F938AE495E043C0809112016817DF +:1045800020F4861B8093120102C0109212018091C8 +:1045900012011F928F9387E395E032C08091110141 +:1045A000681720F4861B8093110102C0109211013C +:1045B000809111011F928F9382E295E021C080913A +:1045C0001001681720F4861B8093100102C010921E +:1045D0001001809110011F928F9389E095E010C027 +:1045E00080910F01681720F4861B80930F0102C091 +:1045F00010920F0180910F011F928F938EEE94E025 +:104600009F938F930E9449060F900F900F900F90E9 +:104610000895CF93C82F1F928F9383EF97E09F93B6 +:104620008F930E94490681E090E0A0E0B0E0BC01D9 +:10463000CD0104C0660F771F881F991FCA95D2F756 +:104640000E94EB1B0F900F900F900F90CF910C9446 +:10465000F717CF93873288F58E3108F00BC18E3073 +:1046600009F487C0D8F4873009F460C08B3009F4AE +:104670004FC0863009F002C18091BE01817F8E7FDC +:104680008093BE0188EF97E00E94B00581EB9AE02D +:104690000E94B00581E08093CE0146C0863109F4C6 +:1046A000B0C020F4803109F47AC0E8C0893109F43F +:1046B00091C08B3109F449C0E1C0883349F150F40D +:1046C000893209F4D5C0853309F4D2C0873209F0A4 +:1046D000D5C0CEC0833409F4CBC028F48A3308F4A3 +:1046E000CDC08953C8C0883409F0C8C00E94F717EC +:1046F00080EA9AE00E94B0052FEF83ED90E321500D +:1047000080409040E1F700C000000E94C41E0CC031 +:104710008FE198E041C087E89AE00E94B00580915F +:10472000BE0181608093BE01C1E0ADC08091BE0139 +:10473000C82FC17080FFEFCF83E99AE00E94B005D7 +:104740008091BE01817F8E7F3FC09091BE0191FB21 +:10475000CC27C0F981E0C827892FC0FB81F980935D +:10476000BE01CC2319F08AE79AE029C08CE69AE0D2 +:1047700013C09091BE0192FBCC27C0F981E0C827FD +:10478000892FC0FB82F98093BE01CC2319F08DE5FF +:104790009AE015C08DE49AE00E94B005C5CF9091D3 +:1047A000BE0193FBCC27C0F981E0C827892FC0FB4D +:1047B00083F98093BE01CC2351F081E49AE00E94FA +:1047C000B0058091BE0181608093BE015CC084E32E +:1047D0009AE0E2CF85E29AE00E94B00582E09AE09A +:1047E0000E94B0058DEB99E00E94B00580E999E048 +:1047F0000E94B0058BE499E00E94B0058DE199E03C +:10480000CBCF8FE099E00E94B0050E9417121F9253 +:104810008F9385EF98E09F938F930E944906809134 +:104820000C011F928F938EED98E09F938F930E94BF +:10483000490680915B011F928F938BEC98E09F93C8 +:104840008F930E9449060E94691E9F938F937F93C6 +:104850006F9384EB98E09F938F930E9449068DB7E6 +:104860009EB742960FB6F8949EBF0FBE8DBF5CCF29 +:1048700080E001C08D510E94092356CF82EB98E061 +:104880000E94B005C0E08C2FCF91089580E008957C +:1048900080E00895CF93C82F8091CE01813069F0D8 +:1048A00020F0823009F449C040C167E08FE00E94E7 +:1048B0000009882309F43FC106C067E08FE00E9429 +:1048C0000009882361F08C2F0E944624811104C0C6 +:1048D0008C2F0E9429232FC081E090E02CC08C2FC8 +:1048E0000E944824811126C0C431E1F070F4CB301D +:1048F00081F0C031D1F40E94D1218BEE97E00E946B +:10490000B00582E08093CE0115C0C93259F0C8339A +:1049100061F488EF97E00E94B0058FEE97E00E9467 +:10492000B00508C01092CE0104C189EE97E00E9444 +:10493000B005FFC081E08170FEC0C43228F5CE31E1 +:1049400008F0C1C0CB30A1F1D0F4C73009F0D3C01A +:104950008EE18093140182E3809313018AE08093B7 +:10496000120184E18093110188E08093100188E2B4 +:1049700080930F018FE896E00E94B005BFC0C3315D +:1049800049F1C431C1F0B7C0CB3409F4A9C028F44F +:10499000C93289F0C83361F0AEC0C13509F49EC098 +:1049A000C23509F499C0CE3409F0A5C06AE09EC0B2 +:1049B0000E94D121A3C08091CD01882319F01092CB +:1049C000CD019CC08CE996E00E94B00581E0809307 +:1049D000CE01B1C086E796E00E94B00584E696E07D +:1049E0000E94B005809114011F928F9381E696E09A +:1049F0009F938F930E9449068FE596E00E94B00531 +:104A00008DE496E00E94B005809113011F928F9370 +:104A10008AE496E09F938F930E94490688E496E08B +:104A20000E94B00589E396E00E94B00580911201D2 +:104A30001F928F9386E396E09F938F930E9449067F +:104A400084E396E00E94B00583E296E00E94B00500 +:104A5000809111011F928F9380E296E09F938F9334 +:104A60000E9449068EE196E00E94B00589E096E03A +:104A70000E94B005809110011F928F9386E096E00E +:104A80009F938F930E94490684E096E00E94B005B0 +:104A90008DEE95E00E94B00580910F011F928F93DB +:104AA0008AEE95E09F938F930E94490688EE95E0E9 +:104AB0000E94B0058DB79EB748960FB6F8949EBF7A +:104AC0000FBE8DBF1BC0CE51EC2FF0E0E75DFE4F57 +:104AD00080818093CD0112C061E003C061E006C017 +:104AE0006AE08091CD010E94E82108C08091CD014B +:104AF0000E948B2203C08DE896E013C08091CD0107 +:104B0000882369F01F928F9387E896E09F938F9395 +:104B10000E9449060F900F900F900F9004C084E8F8 +:104B200096E00E94B00581E006C01092CE0180E0C0 +:104B300002C080E000CFCF9108950E94A425689420 +:104B4000B1110C94332608950E94182688F09F57BF +:104B500098F0B92F9927B751B0F0E1F0660F771FA1 +:104B6000881F991F1AF0BA95C9F714C0B13091F097 +:104B70000E943226B1E008950C943226672F782FD8 +:104B80008827B85F39F0B93FCCF38695779567955C +:104B9000B395D9F73EF490958095709561957F4FC8 +:104BA0008F4F9F4F0895E89409C097FB3EF490956E +:104BB0008095709561957F4F8F4F9F4F9923A9F0F6 +:104BC000F92F96E9BB279395F69587957795679585 +:104BD000B795F111F8CFFAF4BB0F11F460FF1BC0C9 +:104BE0006F5F7F4F8F4F9F4F16C0882311F096E95C +:104BF00011C0772321F09EE8872F762F05C066230A +:104C000071F096E8862F70E060E02AF09A95660FC2 +:104C1000771F881FDAF7880F9695879597F908957B +:104C200057FD9058440F551F59F05F3F71F047955D +:104C3000880F97FB991F61F09F3F79F08795089542 +:104C4000121613061406551FF2CF4695F1DF08C061 +:104C5000161617061806991FF1CF8695710561057E +:104C600008940895E894BB2766277727CB0197F926 +:104C700008950E944C260C94BD260E94AF2638F061 +:104C80000E94B62620F0952311F00C94A6260C94D1 +:104C9000AC2611240C9433260E94102670F3959FA5 +:104CA000C1F3950F50E0551F629FF001729FBB2723 +:104CB000F00DB11D639FAA27F00DB11DAA1F649FBF +:104CC0006627B00DA11D661F829F2227B00DA11D72 +:104CD000621F739FB00DA11D621F839FA00D611DF8 +:104CE000221F749F3327A00D611D231F849F600D19 +:104CF000211D822F762F6A2F11249F5750409AF042 +:104D0000F1F088234AF0EE0FFF1FBB1F661F771FCD +:104D1000881F91505040A9F79E3F510580F00C9498 +:104D2000A6260C9433265F3FE4F3983ED4F3869591 +:104D300077956795B795F795E7959F5FC1F7FE2B38 +:104D4000880F911D9695879597F9089597F99F6714 +:104D500080E870E060E008959FEF80EC0895002403 +:104D60000A941616170618060906089500240A94D0 +:104D700012161306140605060895092E0394000C56 +:104D800011F4882352F0BB0F40F4BF2B11F460FFE5 +:104D900004C06F5F7F4F8F4F9F4F0895991B79E03D +:104DA00004C0991F961708F0961B881F7A95C9F7BB +:104DB0008095089597FB072E16F4009407D077FD91 +:104DC00009D00E94F42607FC05D03EF49095819509 +:104DD0009F4F0895709561957F4F0895EE0FFF1FC7 +:104DE0000590F491E02D0994AA1BBB1B51E107C06B +:104DF000AA1FBB1FA617B70710F0A61BB70B881F6B +:104E0000991F5A95A9F780959095BC01CD010895F9 +:044E1000F894FFCF44 +:104E1400FFFF820A730B500B1C0BE80A01B4012834 +:104E240008140A321E404D36223F04F203BC039A92 +:104E34000326033F03580371030102030405060715 +:044E44000809000059 +:106800000000EA44E944E2440400050006000700F1 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280029002A002B002C002D002E002F00DC +:10686000300031A132003300340035A1360037004A +:10687000380082003A003B003C003D003E003F00F3 +:1068800040004100420043004400450046004700EC +:10689000480049004A004B004C004D004E004F009C +:1068A000500051005200530067005400550056003C +:1068B000580059005A005B005C005D005E005F00FC +:1068C0006000610062006300640000005700000087 +:1068D0006800000000000000000000000000000050 +:1068E0000000000000007300000000000000000035 +:1068F000E000E100E200E300E400E500E600E7007C +:106900000100010001000100EA4401000100E2442D +:106910000100010001000100460001004A004B0097 +:10692000010001004700480001000100E9440100A6 +:106930000100010001000100010001003A003B00DC +:106940003C003D003E003F0040004100420043004B +:10695000010001004C00010001004400450052000C +:1069600049000100010050004F0001004D004E00A1 +:1069700051000100010001000100010001000100BF +:1069800001000100010001000100010001000100FF +:1069900001000100010001000100010001004D00A3 +:1069A0004A004E004B0001000100010001000100FF +:1069B00001000100010001000100010001000100CF +:1069C00001000100010001000100010001000100BF +:1069D00001000100010001000100010001000100AF +:1069E000010001000100010001000100010001009F +:1069F000010001000100010001000100010001008F +:00000001FF diff --git a/converter/adb_usb/binary/adb_usb_rev2_unimap.hex b/converter/adb_usb/binary/adb_usb_rev2_unimap.hex new file mode 100644 index 00000000..6b4c88fc --- /dev/null +++ b/converter/adb_usb/binary/adb_usb_rev2_unimap.hex @@ -0,0 +1,1277 @@ +:100000000C9438050C947F050C947F050C947F05A7 +:100010000C947F050C947F050C947F050C947F0550 +:100020000C947F050C947F050C947F050C944A0F6B +:100030000C94F90F0C94B61D0C947F050C947F055D +:100040000C947F050C947F050C947F050C942A1E5C +:100050000C947F050C947F050C947F050C947F0510 +:100060000C947F050C947F050C947F050C947F0500 +:100070000C947F0566108810761188107611CD10CB +:10008000F01076114511581196149614C314C31428 +:100090001E155A1552175217721552176D166D16F6 +:1000A0002817521752173E17041607090B0A1D1B73 +:1000B00006196405141A08151C171E1F2021232277 +:1000C0002E26242D25273012182F0C13280F0D341F +:1000D0000E333136381110372B2C352A5829787BBE +:1000E00079397A504F5152726C63685680668053EA +:1000F000020103555880576D6E5462595A5B5C5D1E +:100100005E5F6F60617475663E3F403C414277447C +:1001100076466B47804365458048494A4B4C3D4D88 +:100120003B4E3A7D7E7C7F730A0025303862003A70 +:1001300020002530325800722F63203031323334A2 +:100140003536370A006164625F686F73745F6B6293 +:10015000645F726563763A204552524F5228256497 +:10016000290A000A0025303458006164625F686F14 +:1001700073745F6B62645F726563763A2000455208 +:10018000524F523A206D65646961206B6579300A7F +:10019000004552524F523A206D65646961206B658B +:1001A00079310A005D0A0025640020002564007C86 +:1001B000002530325800200025303258006164623A +:1001C0005F6D6F757365207261773A205B000A007E +:1001D0002530313662006164625F686F73745F6DF1 +:1001E0006F7573655F726563763A2000646562754A +:1001F0006720656E61626C65642E0A005363616EF0 +:100200003A20616464723A25642C20726567333A3F +:10021000253034580A00416674657220696E69742D +:100220003A0A00466F756E643A206D656469612014 +:100230006B6579730A005363616E3A20616464727E +:100240003A25642C20726567333A253034580A0009 +:100250004265666F726520696E69743A0A005B7365 +:100260005D004B6579626F617264207374617274B2 +:100270002E0A0055534220636F6E6669677572657A +:10028000642E0A005B575D005B535D005B525D00AE +:100290002E0341004400420020006B0065007900FD +:1002A00062006F00610072006400200063006F0054 +:1002B0006E00760065007200740065007200000038 +:1002C0000E0374002E006D002E006B002E00000047 +:1002D0000403090409027400040100A032090400A7 +:1002E0000001030101000921110100012240000762 +:1002F00005810308000A0904010001030102000945 +:100300002111010001224D000705820308000A099E +:10031000040200010300000009211101000122363E +:10032000000705830308000A090403000203000014 +:100330000009211101000122220007058403200089 +:10034000010705040320000112011001000000084C +:10035000EDFEDB0A0101010200010631FF0974A173 +:10036000010975150026FF009520750881020976A0 +:10037000150026FF00952075089102C0050109802F +:10038000A101850216010026B7001A01002AB70054 +:10039000751095018100C0050C0901A101850316A6 +:1003A0000100269C021A01002A9C02751095018109 +:1003B00000C005010902A1010901A10005091901F7 +:1003C0002905150025019505750181029501750323 +:1003D00081010501093009311581257F95027508D4 +:1003E000810609381581257F950175088106050C60 +:1003F0000A38021581257F950175088106C0C00560 +:10040000010906A101050719E029E7150025019555 +:1004100008750181029501750881010508190129F6 +:10042000059505750191029501750391010507195F +:100430000029FF150026FF00950675088100C00AF7 +:10044000002530325820006B6579626F6172645FFD +:100450007265706F72743A20004C45443A20253022 +:1004600032580A00290A002575002F002575005D05 +:100470002800256400200025640020002564002059 +:10048000002564007C0025303258006D6F7573655F +:100490006B6579205B62746E7C78207920762068A9 +:1004A0005D287265702F61636C293A205B006D6B6B +:1004B0005F776865656C5F74696D655F746F5F6DAC +:1004C0006178203D2025640A006D6B5F7768656563 +:1004D0006C5F6D61785F7370656564203D20256495 +:1004E0000A006D6B5F74696D655F746F5F6D617835 +:1004F000203D2025640A006D6B5F6D61785F73702D +:10050000656564203D2025640A006D6B5F696E742B +:10051000657276616C203D2025640A006D6B5F6416 +:10052000656C6179203D2025640A006D6B5F7768FA +:1005300065656C5F74696D655F746F5F6D61782070 +:100540003D2025640A006D6B5F776865656C5F6DA3 +:1005500061785F7370656564203D2025640A006DD5 +:100560006B5F74696D655F746F5F6D6178203D20AE +:1005700025640A006D6B5F6D61785F7370656564FB +:10058000203D2025640A006D6B5F696E746572768C +:10059000616C203D2025640A006D6B5F64656C61B1 +:1005A00079203D2025640A000A00257500363A208E +:1005B000776865656C5F74696D655F746F5F6D61A9 +:1005C000783A20000A00257500353A20776865657D +:1005D0006C5F6D61785F73706565643A20000A0036 +:1005E000257500343A2074696D655F746F5F6D61C5 +:1005F000783A20000A00257500333A206D61785F53 +:1006000073706565643A20000A00257500323A204F +:10061000696E74657276616C286D73293A20000AE0 +:1006200000257500313A2064656C6179282A3130E3 +:100630006D73293A20000A092D2056616C75657387 +:10064000202D0A004D3E004D25643E20003F0073E2 +:1006500065742064656661756C740A00433E200011 +:1006600077686572652064656C74613A20637572A1 +:10067000736F723D25642C20776865656C3D256439 +:100680000A53656520687474703A2F2F656E2E7753 +:10069000696B6970656469612E6F72672F77696B2A +:1006A000692F4D6F7573655F6B6579730A000A0971 +:1006B0002D204D6F7573656B6579202D0A45534369 +:1006C0002F713A09717569740A313A0964656C6170 +:1006D00079282A31306D73290A323A09696E7465B6 +:1006E0007276616C286D73290A333A096D61785FFF +:1006F00073706565640A343A0974696D655F746F77 +:100700005F6D61780A353A09776865656C5F6D6180 +:10071000785F73706565640A363A09776865656C59 +:100720005F74696D655F746F5F6D61780A0A703A16 +:10073000097072696E742076616C7565730A643A2B +:10074000097365742064656661756C74730A7570ED +:100750003A092B310A646F776E3A092D310A7067B6 +:1007600075703A092B31300A7067646F776E3A09F9 +:100770002D31300A0A7370656564203D2064656C14 +:100780007461202A206D61785F7370656564202A2A +:100790002028726570656174202F2074696D655F13 +:1007A000746F5F6D6178290A003F004D3E20004361 +:1007B0003E20004C25640A000A092D20436F6E7309 +:1007C0006F6C65202D0A4553432F713A0971756985 +:1007D000740A6D3A096D6F7573656B65790A000A65 +:1007E000092D204D61676963202D0A643A0964650B +:1007F0006275670A783A096465627567206D61748D +:100800007269780A6B3A096465627567206B65796D +:10081000626F6172640A6D3A096465627567206D82 +:100820006F7573650A763A0976657273696F6E0A39 +:10083000733A097374617475730A633A09636F6E6E +:10084000736F6C65206D6F64650A302D343A096CE6 +:1008500061796572302D34284631302D4634290AAD +:10086000506175733A09626F6F746C6F6164657281 +:100870000A003F0074696D65725F726561643332AE +:1008800028293A202530346C580A006B6579626F4C +:100890006172645F69646C653A2025580A006B6573 +:1008A00079626F6172645F70726F746F636F6C3ABC +:1008B0002025580A00686F73745F6B6579626F61F9 +:1008C00072645F6C65647328293A2025580A000A0F +:1008D000092D20537461747573202D0A004743431A +:1008E0003A20342E392E32204156522D4C49424363 +:1008F0003A20312E382E3073766E204156525F41A9 +:100900005243483A2061767233350A004F505449B9 +:100910004F4E533A204C554641204D4F5553454B71 +:1009200045592045585452414B455920434F4E5349 +:100930004F4C4520434F4D4D414E44204B45594D62 +:1009400041505F53454354494F4E20343039360AA5 +:10095000004255494C443A206336346164363220B3 +:100960002831313A31343A333620417567203330FB +:100970002032303136290A005649443A2030784630 +:1009800045454428742E6D2E6B2E29205049443A3B +:100990002030783041444228414442206B657962DE +:1009A0006F61726420636F6E766572746572292060 +:1009B0005645523A203078303130310A00444553A0 +:1009C000433A20636F6E7665727420414442206B17 +:1009D0006579626F61726420746F205553420A001A +:1009E0000A092D2056657273696F6E202D0A000A60 +:1009F0006D6F7573653A206F66660A000A6D6F75D4 +:100A000073653A206F6E0A000A6B6579626F6172D6 +:100A1000643A206F66660A000A6B6579626F6172DC +:100A2000643A206F6E0A000A6D61747269783A2028 +:100A30006F66660A000A6D61747269783A206F6E9B +:100A40000A000A64656275673A206F6E0A000A64DC +:100A5000656275673A206F66660A000A0A626F6F00 +:100A6000746C6F616465722E2E2E2000433E200050 +:100A700011241FBECFEFD4E0DEBFCDBF04B603FE0E +:100A800027C08091DC019091DD01A091DE01B09141 +:100A9000DF018730904BA740B04BD1F41092DC01BE +:100AA0001092DD011092DE011092DF0114BE84B7B6 +:100AB000877F84BF0FB6F894A89580916000886105 +:100AC00080936000109260000FBEE0E0F8E30995AB +:100AD00011E0A0E0B1E0E6E7FDE402C005900D9270 +:100AE000A433B107D9F721E0A4E3B1E001C01D921E +:100AF000AC3DB207E1F70E94970C0C94B9260C9418 +:100B00000000FF93EF93E0913401F09135013097AD +:100B100009F00995EF91FF910895FC0185918030CE +:100B200011F0EFDFFBCF0895FF27E0E230E247FF4F +:100B30000CC0419597FF09C0EDE2609570958095D6 +:100B40009095611D711D811D911D27FF02C021958A +:100B500030E350E2AA27660F771F881F991FAA1F4C +:100B6000A41710F0A41B63955A95A9F7AA3008F0B2 +:100B7000A95FA05DAF93F39561157105810591059E +:100B800041F7ED3211F4EF93F395F21718F43F9318 +:100B9000F395FBCF8F91B5DFFA95E1F70895E991D1 +:100BA000F9918591803021F0853219F0AADFF9CFD3 +:100BB000089520E0E89455915532C1F3503311F473 +:100BC000689455915A3348F4505390F3220F022EF3 +:100BD000220F220F200D250FF4CF0EF421958991BD +:100BE0009991533619F3533729F1533559F1BC0113 +:100BF00088279927E8945C3621F489919991689423 +:100C00005591543639F446EF7EF077FF0DC08FEFE3 +:100C10009FEF0AC055374AE039F0583540E121F0DE +:100C2000523642E009F00895FF93EF937DDFEF9194 +:100C3000FF91B7CFFF93EF93FC0181918030B9F31F +:100C400060DFFBCFFF93EF9368DFF1CFDF93CF93AC +:100C5000CDB7DEB72596A3DFCF91DF910895282F7A +:100C60002770E82FE695E695E695EF70F0E0E95CF1 +:100C7000FE4F87FF0AC081E090E001C0880F2A95EF +:100C8000EAF780959081892308C081E090E001C057 +:100C9000880F2A95EAF79081892B808381E08093E1 +:100CA0004C0108950F931F93CF93DF93569A5E9A4A +:100CB0000E9495092FEF87EA91E6215080409040ED +:100CC000E1F700C0000080E592E09F938F930E94BF +:100CD00026060F900F90C1E0D0E006E312E063E03B +:100CE0008C2F0E949909009771F09F938F93DF9347 +:100CF000CF931F930F930E9426060F900F900F9093 +:100D00000F900F900F909FEF29EF80E091502040BF +:100D10008040E1F700C000002196C031D105F9F60E +:100D200063E082E00E9499098131910511F170F42C +:100D300087309105F1F020F404970297F0F419C080 +:100D400089309105B1F00D97C1F413C08D31910533 +:100D500081F030F48431910561F0499771F409C054 +:100D6000843C910531F0873C910519F0813C910557 +:100D700021F481E080934D0102C010924D0163E0A7 +:100D800087E00E94990991E0823009F090E0909309 +:100D90004E01992341F083E292E09F938F930E944A +:100DA00026060F900F9023E042E063E082E00E946D +:100DB000190A86E192E09F938F930E9426060F9076 +:100DC0000F90C1E0D0E00CEF11E063E08C2F0E94A7 +:100DD0009909009771F09F938F93DF93CF931F939F +:100DE0000F930E9426060F900F900F900F900F9078 +:100DF0000F908FEF99EF20E0815090402040E1F775 +:100E000000C000002196C031D105F9F6E7E3F1E01A +:100E100080E18E0F11928E13FDCF8091BE01816013 +:100E20008093BE018CEE91E00E948D05569A5E98EB +:100E3000DF91CF911F910F910895CF93DF938FE7AB +:100E40009BEB0197F1F700C000000E94150AEC012E +:100E5000009711F481E0BDC097FD05C08091470166 +:100E6000816080934701D7FF05C0809147018E7F45 +:100E700080934701ED2FFF27EF73FF27CE018F737C +:100E80009927C6FF02C080549109D6FF02C0E054E2 +:100E9000F109A09136010A2E000CBB0BBD010E9486 +:100EA0006E2681382FEF920714F481E89FEF2227F6 +:100EB0003327281B390B21388FEF380714F421E82A +:100EC0003FEF219520934801CF01BD010E946E267E +:100ED00081382FEF920714F481E89FEF9195819567 +:100EE000910981382FEF920714F481E89FEF8195E3 +:100EF000809349018091BE0183FF60C086ED91E03F +:100F00000E948D05DF93CF9380ED91E09F938F93A7 +:100F10000E9426068EEC91E00E948D058DEB91E0FB +:100F20000E948D0580913601282F082E000C330B6E +:100F30003F938F9388EB91E09F938F930E942606B7 +:100F400086EB91E00E948D05809147011F928F935F +:100F500081EB91E09F938F930E9426068FEA91E0A8 +:100F60000E948D0580914801282F082E000C330B1C +:100F70003F938F938CEA91E09F938F930E94260674 +:100F80008AEA91E00E948D0580914901282F082E60 +:100F9000000C330B3F938F9387EA91E09F938F93DD +:100FA0000E94260684EA91E00E948D058DB79EB7C7 +:100FB00044960FB6F8949EBF0FBE8DBF87E491E0B4 +:100FC0000E94E8118091360191E088300CF090E0A9 +:100FD000890F80933601DF91CF9108951F93CF93AE +:100FE000DF9310924C01C0910001D09101018FEF6D +:100FF0009FEF9093010180930001CF3F8FEFD807BF +:1010000009F06AC08FE79BEB0197F1F700C0000081 +:1010100082E00E94120AEC01892B09F05DC08091E8 +:101020004E01882309F458C087E00E94120A0097F5 +:1010300009F452C09C012F77332722303105A1F0EB +:1010400048F42115310569F02130310599F4807893 +:101050008A641AC02330310551F02F373105A1F0D1 +:1010600009C08078826410C0807889640DC080785F +:1010700088640AC081E991E09F938F930E942606BD +:101080000F900F9081E18FC0292F33272F773327BF +:101090002130310579F050F02230310579F02330DC +:1010A000310581F4EC01D078D86416C0EC01D07819 +:1010B000D26412C0EC01D078DA640EC0EC01D078B2 +:1010C000D9640AC08EE791E09F938F930E94260611 +:1010D0000F900F9080E167C08091BE0181FF18C022 +:1010E000209709F45DC08AE691E00E948D05DF93A8 +:1010F000CF9385E691E09F938F930E94260683E627 +:1011000091E00E948D050F900F900F900F9003C0FB +:10111000209709F445C0CF379FE7D90711F48FE72F +:1011200005C0CF3F8FEFD80721F48FEF0E942F0625 +:1011300039C02D2F3327822F1C2F2F3F310581F4EB +:10114000DF93CF9385E491E09F938F930E942606CF +:101150000E9452060F900F900F900F908C2F23C07B +:1011600090914D01992381F0A9014F775527423382 +:10117000510521F42078822F8A6006C04A3051053B +:1011800019F42078822F82630E942F061F3F51F0AE +:10119000DC2FCC27CF6FD0930101C093000102C098 +:1011A00080E001C081E0DF91CF911F910895E82F89 +:1011B000F0E0E95CFE4F2081822F90E021E030E0FA +:1011C00002C0220F331F6A95E2F72823392381E0FA +:1011D000232B09F480E00895E82FF0E0E95CFE4F4E +:1011E00080810895CF92DF92EF92FF920F931F9329 +:1011F000CF93DF938091BE0181FF35C087E391E0FB +:101200000E948D0587E3E82E81E0F82EC0E0D0E053 +:1012100092E3C92E91E0D92E0AE211E0DF93CF9339 +:10122000DF92CF920E9426068FE291E00E948D0508 +:10123000F70181917F010E944F1D1F928F931F9391 +:101240000F930E94260688E291E00E948D05219668 +:101250008DB79EB708960FB6F8949EBF0FBE8DBF90 +:10126000C031D105D9F6DF91CF911F910F91FF9039 +:10127000EF90DF90CF900895682F609582E00C94F6 +:10128000520A509A83E091E00197F1F700C0000004 +:1012900050989AEB9A95F1F700C00895509A8AEB0E +:1012A0008A95F1F700C0509883E091E00197F1F73B +:1012B00000C000000895EF92FF920F931F93CF9309 +:1012C000DF93C0E0D0E090E8E92EF12C082F10E089 +:1012D000C7010C2E02C0959587950A94E2F78023EA +:1012E0009123892B19F00E944E0902C00E944109E6 +:1012F0002196C830D10561F7DF91CF911F910F91F1 +:10130000FF90EF900895489B06C023E02A95F1F7DF +:1013100000000197C1F70895489906C023E02A9577 +:10132000F1F700000197C1F7089558985098089573 +:101330000895CF92DF92EF92FF920F931F93CF9376 +:10134000DF9300D0CDB7DEB7F894509AE3EFFBE01F +:101350003197F1F700C000006A8389830E944E092B +:101360006A816C6089818295807F862B0E945B09EF +:101370000E94410984EF91E00E948C09892B21F49D +:10138000789482EE9FEF43C084EF91E00E9483093E +:10139000009711F478943BC011E1C12CD12C02E8E4 +:1013A00082E890E00E948C097C01882351F1992702 +:1013B0000E948309882329F1CC0CDD1C902F9E19F3 +:1013C000E81A9E1518F46894C0F806C0113121F48B +:1013D00078948CEE9FEF1BC0115011F78FE591E0D0 +:1013E0000E948C09892B21F478948BEE9FEF0FC01B +:1013F0008BE590E00E948309892BB1F77894C601B0 +:1014000006C07894812F90E09195819591090F9075 +:101410000F90DF91CF911F910F91FF90EF90DF9090 +:10142000CF90089560E00C94990960E083E00C94FB +:1014300099091F93CF93DF9300D01F92CDB7DEB7EA +:10144000182FF894509A83EF9BE00197F1F700C0B2 +:1014500000002B834A8369830E944E096981862F8D +:1014600088601295107F812B0E945B090E944109C0 +:101470008FE193E00197F1F700C000000E944E0950 +:101480004A81842F0E945B092B81822F0E945B0975 +:101490000E94410978940F900F900F90DF91CF91A7 +:1014A0001F910895262F277040E062E00C94190ADE +:1014B00080915A0108959FB7F894109251019FBFEF +:1014C0009091D301943009F057C09091E9009F703A +:1014D0003091EC00232F217030FD20E8922B24E086 +:1014E0002093E9002091EB0020FF43C02091EE0003 +:1014F00027FF3FC020914F01222321F02091E800D7 +:1015000025FF37C010924F0126E03091E80035FDED +:1015100015C03091D301343061F53091EB0035FDC9 +:1015200028C0215021F481E080934F0122C0EFE9CF +:10153000FFE03197F1F700C00000E7CF8093F100A2 +:101540008091E80085FD0AC08091E80080FFFCCF13 +:101550008091E8008E778093E80006C08FB7F894FA +:1015600021E0209351018FBF9F709093E90080E0AC +:1015700008959F709093E9008FEF0895CF93DF93C4 +:1015800000D01F92CDB7DEB79C018091D30184308B +:1015900019F593E099833B832A839093E9008FEFB9 +:1015A0009091E800815095FD06C095ED9A95F1F770 +:1015B00000008111F5CF8091E80085FF0DC040E06B +:1015C00050E063E070E0CE0101960E94580D8091DA +:1015D000E8008E778093E8000F900F900F90DF91D6 +:1015E000CF910895CF93DF9300D01F92CDB7DEB790 +:1015F0002091D301243021F522E029839B838A8323 +:1016000083E08093E9008FEF9091E800815095FD91 +:1016100006C095ED9A95F1F700008111F5CF809104 +:10162000E80085FF0DC040E050E063E070E0CE01CF +:1016300001960E94580D8091E8008E778093E80013 +:101640000F900F900F90DF91CF9108952091D301CB +:101650002430F1F422E02093E9002FEF3091E800EC +:10166000215035FD06C035ED3A95F1F70000211106 +:10167000F5CF2091E80025FF0BC040E050E065E089 +:1016800070E00E94580D8091E8008E778093E8000A +:101690000895CF93DF932091D301243039F521E0D1 +:1016A0002093E9002FEF3091E800215035FD06C06E +:1016B00035ED3A95F1F700002111F5CF2091E800C2 +:1016C00025FF14C0EC0140E050E068E070E00E94AB +:1016D000580D8091E8008E778093E80088E0FE0145 +:1016E000A2E5B1E001900D928A95E1F7DF91CF91EB +:1016F00008958CE892E00C948D05209150012F5FA5 +:10170000822F62E30E947F26992319F020935001D3 +:1017100008951092500180915101882371F18091B8 +:10172000D301843041F58091E9008F702091EC0065 +:10173000922F917020FD90E8892B94E09093E9001E +:101740009091EB0090FF14C09091EE0097FF10C0B5 +:101750009091E80095FF03C01092F100F9CF9091AD +:10176000E80090FF05C09091E8009E779093E80014 +:101770008F708093E90010925101089542E061EC6E +:1017800081E00E94610E42E061EC82E00E94610E05 +:1017900042E061EC83E00E94610E42E261EC84E091 +:1017A0000C94610E8091D501833009F453C030F45C +:1017B000813071F0823009F48CC008958A3009F4C8 +:1017C00078C08B3009F45EC0893009F09AC020C01F +:1017D0008091D401813A09F094C08091E800877F1C +:1017E0008093E8008091D8019091D901892B21F450 +:1017F00068E082E591E003C060E080E090E070E0A6 +:101800000E94A30D8091E8008B778093E8000895F3 +:101810008091D401813209F074C08091D8019091F7 +:10182000D901892B09F06DC08091E800877F8093F2 +:10183000E8008091E80082FD05C08091D30181110C +:10184000F8CF5FC08091F10080935A018091E80049 +:101850008B7753C08091D401813A09F052C08091B6 +:10186000D8019091D901892B09F04BC08091E800F3 +:10187000877F8093E8008091E80080FFFCCF809113 +:101880000C0136C08091D4018132D9F58091D80104 +:101890009091D901892BA9F58091E800877F8093E9 +:1018A000E8000E94960E8091D60180930C010C9462 +:1018B00073178091D401813221F58091E800877FF0 +:1018C0008093E8000E94960E8091D70180935B017F +:1018D00008958091D401813AA1F48091E800877F36 +:1018E0008093E8008091E80080FFFCCF80915B014D +:1018F0008093F1008091E8008E778093E8000C944B +:10190000960E089508950895089588E892E00E943B +:101910008D050C94840C0E94751D8091D101882343 +:1019200029F00E94A01D81110C94420D089584B7E6 +:10193000877F84BF0FB6F894A89580916000886176 +:1019400080936000109260000FBE90E080E80FB6B8 +:10195000F89480936100909361000FBE0E94820C06 +:101960000E9420120E94E70E0E943A0F8091E2002E +:1019700084608093E2008BE59AE00E944A1D78948F +:101980008091D3018430E1F783E792E00E948D05D6 +:101990000E94221282E091E00E948E1182E692E083 +:1019A0000E948D050E94830C8091D301853039F40B +:1019B0008EE592E00E948D050E948B0CF5CF0E946F +:1019C0002812F2CF0C94B41D84E892E00E948D0599 +:1019D0000C94E20C292F332723303105C9F064F42D +:1019E0002130310581F02230310509F043C084E710 +:1019F00090E024ED32E042C021323105F1F0223294 +:101A0000310541F137C082E190E028E433E036C08F +:101A100099278130910541F08230910541F0892B61 +:101A200049F5E0EDF2E005C0E0ECF2E002C0E0E9EB +:101A3000F2E0849190E09F0121C06430D8F4E62F59 +:101A4000F0E0EE0FFF1FEF5DFE4F2081318189E056 +:101A500090E014C0643070F470E0FB01EE0FFF1FE3 +:101A6000E75EFE4F20813181FB01EB5EFE4F8081FE +:101A700090E004C080E090E020E030E0FA013183A3 +:101A80002083089584E089BD86E089BD09B400FE05 +:101A9000FDCF8091D8008F7D8093D8008091E000A9 +:101AA00082608093E0008091E00081FDFCCF08958A +:101AB000CF92DF92EF92FF920F931F93CF93DF931A +:101AC000EC018B016A010E94B50E811133C0C11473 +:101AD000D10439F0F60180819181081B190BC80FE0 +:101AE000D91FE12CF12C0115110519F18091E800A5 +:101AF00085FD16C08091E8008E778093E800C114C0 +:101B0000D10449F0F60180819181E80EF91EF1823D +:101B1000E08285E00FC00E94B50E882321F30AC041 +:101B200089918093F10001501109FFEFEF1AFF0A2C +:101B3000DACF80E0DF91CF911F910F91FF90EF906E +:101B4000DF90CF9008952091DA013091DB012617C4 +:101B5000370748F06115710539F42091E8002E77B8 +:101B60002093E80001C0B90140E06115710591F1D1 +:101B70002091D301222309F440C0253009F43FC04D +:101B80002091E80023FD3DC02091E80022FD2FC0F8 +:101B90002091E80020FFE9CF2091F20030E0FC0125 +:101BA000CF016115710559F02830310540F481915C +:101BB0008093F100615071092F5F3F4FF1CF41E0F9 +:101BC0002830310509F040E02091E8002E7720937D +:101BD000E800CBCF4111CCCF0AC08091D30188233C +:101BE00061F0853061F08091E80083FD0AC080914A +:101BF000E80082FFF2CF80E0089582E0089583E05C +:101C0000089581E008952091DA013091DB012617D3 +:101C1000370748F06115710539F42091E8002E77F7 +:101C20002093E80001C0B901FC0120E061157105B5 +:101C300079F18091D301882309F43DC0853009F4FE +:101C40003CC08091E80083FD3AC08091E80082FDAD +:101C50002CC08091E80080FFE9CF8091F20090E0F5 +:101C60006115710559F08830910540F42491209355 +:101C7000F1003196615071090196F2CF21E0089789 +:101C800009F020E08091E8008E778093E800CECFC5 +:101C90002111CFCF0AC08091D301882361F0853014 +:101CA00061F08091E80083FD0AC08091E80082FF26 +:101CB000F2CF80E0089582E0089583E0089581E006 +:101CC0000895982F953058F59093E900981739F0BA +:101CD0007091EC002091ED005091F00003C0242F92 +:101CE000762F50E021FF19C03091EB003E7F3093FA +:101CF000EB003091ED003D7F3093ED003091EB0033 +:101D000031603093EB007093EC002093ED00509322 +:101D1000F0002091EE0027FF07C09F5FD3CF8F70A8 +:101D20008093E90081E0089580E008958091D401D6 +:101D300087FF11C08091E80082FD05C08091D3012A +:101D40008111F8CF11C08091E8008B770BC0809192 +:101D5000D301882349F08091E80080FFF8CF80917B +:101D6000E8008E778093E80008952091E400309198 +:101D7000E50095E64091EC00842F817040FF22C081 +:101D80008091E80080FD1CC08091D301882391F0F0 +:101D9000853091F08091EB0085FD10C04091E4000A +:101DA0005091E5004217530729F39A01915011F71A +:101DB00084E0089582E0089583E0089581E0089525 +:101DC00080E008954091E80042FFDECF08950E9430 +:101DD000440F0E94470FE0EEF0E080818160808335 +:101DE000E8EDF0E080818F77808319BCE3E6F0E0D6 +:101DF0008081816080831092D20108950E94440FF7 +:101E00000E94470F8091D8008F778093D8008091EF +:101E1000D80080688093D8008091D8008F7D80930F +:101E2000D80084E089BD86E089BD09B400FEFDCFFD +:101E30001092D3011092CF011092D1011092D001D3 +:101E400042E060E080E00E94610E8091E1008E7FC0 +:101E50008093E1008091E20081608093E2008091B4 +:101E6000E20088608093E2008091E0008E7F8093A2 +:101E7000E0000895E3E6F0E080818E7F808381E0DA +:101E80008093D2010C94FE0E1092E20008951092FD +:101E9000E10008951F920F920FB60F9211242F9315 +:101EA0003F934F935F936F937F938F939F93AF93E2 +:101EB000BF93EF93FF938091E10082FF0BC080916D +:101EC000E20082FF07C08091E1008B7F8093E100F8 +:101ED0000E947D0B8091E10080FF19C08091E2009B +:101EE00080FF15C08091E2008E7F8093E200809198 +:101EF000E20080618093E2008091D800806280934C +:101F0000D80019BC85E08093D3010E94850C809194 +:101F1000E10084FF30C08091E20084FF2CC084E0A7 +:101F200089BD86E089BD09B400FEFDCF8091D8004F +:101F30008F7D8093D8008091E1008F7E8093E100B7 +:101F40008091E2008F7E8093E2008091E2008160C8 +:101F50008093E2008091CF01882311F084E007C0D4 +:101F60008091E30087FD02C081E001C083E080939F +:101F7000D3010E94E40C8091E10083FF29C080918D +:101F8000E20083FF25C08091E100877F8093E1001C +:101F900082E08093D3011092CF018091E1008E7F87 +:101FA0008093E1008091E2008E7F8093E200809137 +:101FB000E20080618093E20042E060E080E00E9405 +:101FC000610E8091F00088608093F0000E94790B90 +:101FD000FF91EF91BF91AF919F918F917F916F9101 +:101FE0005F914F913F912F910F900FBE0F901F90D7 +:101FF00018951F920F920FB60F9211242F933F93B3 +:102000004F935F936F937F938F939F93AF93BF9300 +:10201000CF93DF93EF93FF93C091E900CF7080914E +:10202000EC00D82FD17080FDD0E81092E9008091AB +:10203000F000877F8093F00078940E943D1010920A +:10204000E9008091F00088608093F000CD2BCF7084 +:10205000C093E900FF91EF91DF91CF91BF91AF91D4 +:102060009F918F917F916F915F914F913F912F91B0 +:102070000F900FBE0F901F9018951F93CF93DF9373 +:10208000CDB7DEB7AA970FB6F894DEBF0FBECDBFAF +:10209000E4EDF1E088E08E0F9091F10091938E13C2 +:1020A000FBCF0E94D20B8091E80083FF1FC180917B +:1020B000D4019091D501492F50E04A30510508F0E4 +:1020C00015C1FA01E65CFF4F0C949F26803881F021 +:1020D000823809F00BC18091D8018F708093E9009C +:1020E0008091EB0085FB882780F91092E90006C0FB +:1020F0008091D0019091D101911182609091E8007E +:10210000977F9093E8008093F1001092F100C8C08F +:10211000282F2D7F09F0EAC0882319F0823061F062 +:10212000E5C08091D601813009F0E0C0933009F01C +:1021300080E08093D1012BC08091D601811127C00E +:102140008091D8018F7009F4D1C08093E90020916B +:10215000EB0020FF1CC0933021F48091EB008062E3 +:1021600014C09091EB0090619093EB0021E030E07F +:10217000A90102C0440F551F8A95E2F74093EA0077 +:102180001092EA008091EB0088608093EB0010923F +:10219000E9008091E800877F86C08111A7C0109177 +:1021A000D6011F778091E3008078812B8093E30034 +:1021B0008091E800877F8093E8000E94960E8091CE +:1021C000E80080FFFCCF8091E30080688093E3000B +:1021D000111102C082E001C083E08093D30186C068 +:1021E0008058823008F082C08091D6019091D7014A +:1021F0008C3D53E0950779F583E08A838AE28983F1 +:102200004FB7F894DE01139620E03EE051E2E32F51 +:10221000F0E050935700E49120FF03C0E295EF7087 +:102220003F5FEF708E2F90E0EA3010F0C79601C04C +:10223000C0968D939D932F5F243149F74FBF8091B6 +:10224000E800877F8093E8006AE270E0CE010196A3 +:102250000E94A30D14C0AE014F5F5F4F6091D80183 +:102260000E94EA0CBC01892B09F440C09091E8005F +:10227000977F9093E80089819A810E94030E809154 +:10228000E8008B778093E80031C0803879F5809141 +:10229000E800877F8093E8008091CF018093F10070 +:1022A0008091E8008E778093E8000E94960E1EC011 +:1022B00081111CC09091D6019230C0F48091E80049 +:1022C000877F8093E8009093CF010E94960E8091C3 +:1022D000CF01811106C08091E30087FD02C081E03B +:1022E00001C084E08093D3010E94BE0B8091E8007E +:1022F00083FF0AC08091E800877F8093E800809187 +:10230000EB0080628093EB00AA960FB6F894DEBFD4 +:102310000FBECDBFDF91CF911F91089590936101C2 +:10232000809360010895E0916001F0916101309720 +:1023300021F00190F081E02D099480E00895EF9262 +:10234000FF920F931F93CF93DF93E0916001F09181 +:1023500061013097B1F18C010280F381E02D099584 +:102360008091BE0182FF2DC080FF04C087E494E00D +:102370000E948D05E80118E081E4E82E84E0F82E43 +:102380008091BE0180FF0BC088811F928F93FF92C6 +:10239000EF920E9426060F900F900F900F90115011 +:1023A00021961111EDCF8091BE0180FF0AC08FE30D +:1023B00094E0DF91CF911F910F91FF90EF900C94DB +:1023C0008D05DF91CF911F910F91FF90EF900895B0 +:1023D000E0916001F0916101309721F00480F58176 +:1023E000E02D0994089520915E0130915F018217DC +:1023F000930771F090935F0180935E01E09160011B +:10240000F0916101309721F00680F781E02D099469 +:10241000089520915C0130915D018217930771F05E +:1024200090935D0180935C01E0916001F091610106 +:10243000309721F00084F185E02D099408950895E6 +:102440000C941F120E94DF1D0E9452060C949809E2 +:10245000CF92DF92EF92FF920F931F93CF93DF9370 +:1024600000D000D000D0CDB7DEB70E94EE0783E6E3 +:10247000C82E81E0D82E00E010E0E02E802F0E94D0 +:10248000EC08F60141916F01F42EF826B1F40F5FCC +:102490001F4F0031110589F78FEF89838A831B82D3 +:1024A0000E94E81D8160782F9D838C8349815A8129 +:1024B0006B818D810E94E91247C09091BE0191FF0E +:1024C00004C08E830E94F2088E8120E030E04F2D00 +:1024D00050E0922FBA01022E02C0759567950A94BA +:1024E000E2F760FF2BC02983EA8221E030E0690136 +:1024F00002C0CC0CDD1C9A95E2F790E08C219D2166 +:10250000892B09F420E02B830E94E81D8160782F3D +:102510009D838C8349815A816B818D810E94E91250 +:1025200049815A816B817C818D810E94621DF801F5 +:10253000ED59FE4F8081C826C08206C02F5F3F4FF5 +:102540002830310531F6A3CF0E94611D0E94B620CC +:102550000E941D07109162010E949311181741F10A +:102560000E949311809362019091BE0192FF0EC070 +:1025700090FF0CC01F928F9389E594E09F938F93F7 +:102580000E9426060F900F900F900F90809162018D +:1025900026960FB6F894DEBF0FBECDBFDF91CF9168 +:1025A0001F910F91FF90EF90DF90CF900C94731DCF +:1025B00026960FB6F894DEBF0FBECDBFDF91CF9148 +:1025C0001F910F91FF90EF90DF90CF9008950C94A2 +:1025D0003C09CF93DF93CDB7DEB72B970FB6F894B6 +:1025E000DEBF0FBECDBF942F4F83252F588769873D +:1025F0007A878B874A855B85452B21F02F3F09F52C +:102600009F3FF9F4DE01119686E0FD0111928A9553 +:10261000E9F785E0FE01379601900D928A95E1F782 +:1026200049815A816B817C818D819E810E941C1A17 +:102630002B960FB6F894DEBF0FBECDBFDF91CF91C2 +:1026400008954F81588569857A858B850E94621D22 +:10265000D9CFCF93882309F4CDC0C82F823859F43D +:102660000E94931181FDC6C089E30E94AB1C0E94A9 +:10267000241D89E30CC0833879F40E94931180FDF6 +:10268000B9C083E50E94AB1C0E94241D83E50E9413 +:10269000C81CCF910C94241D843859F40E949311C6 +:1026A00082FDA8C087E40E94AB1C0E94241D87E421 +:1026B000EECF8CEF8C0F813A48F48C2F0E94E223EE +:1026C000811198C08C2F0E94AB1CE3CF80E28C0F4D +:1026D000883048F4C77081E001C0880FCA95EAF7D6 +:1026E0000E94EA1CD6CF8BE58C0F833078F4C53A74 +:1026F00029F0C63A31F083E890E005C081E890E027 +:1027000002C082E890E0CF910C94F31188E58C0F21 +:10271000853108F06FC0C83A61F1C93A69F1CA3A27 +:1027200071F1CB3A79F1CC3A81F1CD3A89F1CE3AD7 +:1027300091F1CF3A99F1C13BA1F1C03BA9F1C23B64 +:10274000B1F1C33BB9F1C43BC1F1C53BC9F1C63BD3 +:10275000D1F1C73BD9F1C83BE1F1C93BE9F1CA3B33 +:10276000F1F1CB3BF9F1CC3B09F43FC080E090E0C4 +:102770003EC082EE90E03BC089EE90E038C08AEE29 +:1027800090E035C085EB90E032C086EB90E02FC042 +:1027900083EB90E02CC084EB90E029C087EB90E0C5 +:1027A00026C08CEC90E023C08DEC90E020C083E844 +:1027B00091E01DC08AE891E01AC082E991E017C05B +:1027C00084E991E014C081E292E011C083E292E0DA +:1027D0000EC084E292E00BC085E292E008C086E27F +:1027E00092E005C087E292E002C08AE292E0CF91D7 +:1027F0000C940912CF910895882309F44BC08238B4 +:1028000059F40E94931181FF45C089E30E94AB1CDB +:102810000E94241D89E30CC0833871F40E94931137 +:1028200080FF38C083E50E94AB1C0E94241D83E515 +:102830000E94C81C0C94241D843859F40E949311E2 +:1028400082FF28C087E40E94AB1C0E94241D87E4FD +:10285000EFCF9CEF980F913A58F390E2980F983091 +:1028600050F4877091E001C0990F8A95EAF7892F9B +:102870000E94F01CDFCF9BE5980F933020F480E09E +:1028800090E00C94F311885A853120F480E090E0B8 +:102890000C9409120895882321F00E94EA1C0C94DC +:1028A000241D0895882321F00E94F01C0C94241DFF +:1028B0000895CF92DF92EF92FF920F931F93CF93E1 +:1028C000DF9300D000D000D0CDB7DEB725E0FC010B +:1028D000DE01119601900D922A95E1F7FC014081ED +:1028E0003181F280258122952F7063817481672B5D +:1028F00009F4D8C23F3F19F44F3F09F4D3C26C0129 +:1029000049833A8389819A812E830E946A1C182FF9 +:10291000092F0E94691C0E94791BE02FE295EF703D +:10292000F0E0EC5BFF4F2E810C949F26802F807F80 +:10293000902F9F70092F882311F00295007FFF20B0 +:1029400049F0002309F45FC2802F0E94FD1C0E9401 +:10295000241D59C2812F0E94FC13002309F4A2C236 +:10296000802F0E94031D26960FB6F894DEBF0FBE7F +:10297000CDBFDF91CF911F910F91FF90EF90DF902E +:10298000CF900C94241D802F807F902F9F70092F53 +:10299000803211F00295007F112319F0113001F1FE +:1029A00029C0FF20A9F0802F222349F1213039F5D9 +:1029B00026960FB6F894DEBF0FBECDBFDF91CF9144 +:1029C0001F910F91FF90EF90DF90CF900C940D1D11 +:1029D000222319F0213009F465C20E94101D2CC079 +:1029E000FF20E9F0263008F05DC20E94E71C80233A +:1029F00029F022C0FF20F1F0211115C0802F26966A +:102A00000FB6F894DEBF0FBECDBFDF91CF911F91FF +:102A10000F91FF90EF90DF90CF900C944B142530E6 +:102A200008F040C209C0F601858180FFECC18F70BB +:102A30008583E4CF2111FBC1802F69C1202F26950A +:102A40002695237030E02115310521F02130310524 +:102A5000C9F028C2FF2021F0812F902F937002C06F +:102A600080E090E026960FB6F894DEBF0FBECDBF93 +:102A7000DF91CF911F910F91FF90EF90DF90CF905A +:102A80000C94F311FF2021F0812F902F937002C03E +:102A900080E090E026960FB6F894DEBF0FBECDBF63 +:102AA000DF91CF911F910F91FF90EF90DF90CF902A +:102AB0000C940912812FFF2019F00E943C1F02C0C4 +:102AC0000E94A41F26960FB6F894DEBF0FBECDBF9E +:102AD000DF91CF911F910F91FF90EF90DF90CF90FA +:102AE0000C942920802F837009F078C0F110DAC18E +:102AF000812F829586958770880F880F912F9F7000 +:102B0000C92ED12CE12CF12C082E04C0CC0CDD1CDC +:102B1000EE1CFF1C0A94D2F714FF12C04FE050E0E5 +:102B200060E070E004C0440F551F661F771F8A9550 +:102B3000D2F7CB01BA01609570958095909503C04E +:102B400060E070E0CB01202F269526952370422F60 +:102B500050E042305105D1F04330510559F16C2914 +:102B60007D298E299F294130510541F126960FB6C6 +:102B7000F894DEBF0FBECDBFDF91CF911F910F91B3 +:102B8000FF90EF90DF90CF900C948E1B6C297D29E5 +:102B90008E299F2926960FB6F894DEBF0FBECDBFB3 +:102BA000DF91CF911F910F91FF90EF90DF90CF9029 +:102BB0000C94A01B0E948E1BC701B60126960FB66F +:102BC000F894DEBF0FBECDBFDF91CF911F910F9163 +:102BD000FF90EF90DF90CF900C947C1BFF2019F0BA +:102BE000802F817001C08695882309F45BC1812FF5 +:102BF000829586958770880F880F912F9F70C92EB8 +:102C0000D12CE12CF12C082E04C0CC0CDD1CEE1CC8 +:102C1000FF1C0A94D2F714FF12C04FE050E060E0AE +:102C200070E004C0440F551F661F771F8A95D2F7C6 +:102C3000CB01BA01609570958095909503C060E0D6 +:102C400070E0CB01202F269526952370422F50E06F +:102C500042305105D1F04330510559F16C297D299D +:102C60008E299F294130510541F126960FB6F894DF +:102C7000DEBF0FBECDBFDF91CF911F910F91FF90AF +:102C8000EF90DF90CF900C94451C6C297D298E2904 +:102C90009F2926960FB6F894DEBF0FBECDBFDF91F9 +:102CA000CF911F910F91FF90EF90DF90CF900C94F8 +:102CB000571C0E94451CC701B60126960FB6F89412 +:102CC000DEBF0FBECDBFDF91CF911F910F91FF905F +:102CD000EF90DF90CF900C94331C103F41F118F42B +:102CE000103E48F48BC0123F09F450C0D8F1133F96 +:102CF00009F460C083C01F70802F8F71FF2021F006 +:102D00000E94CC1B812F7BCE0E94ED1B812F26962B +:102D10000FB6F894DEBF0FBECDBFDF91CF911F91EC +:102D20000F91FF90EF90DF90CF900C945214FF2002 +:102D3000A9F0253008F0B6C0802F8F7126960FB607 +:102D4000F894DEBF0FBECDBFDF91CF911F910F91E1 +:102D5000FF90EF90DF90CF900C94121C263008F07B +:102D6000A1C0EACFFF20A1F0802F8F7126960FB669 +:102D7000F894DEBF0FBECDBFDF91CF911F910F91B1 +:102D8000FF90EF90DF90CF900C94CC1BFF2061F36D +:102D9000802F8F7126960FB6F894DEBF0FBECDBF81 +:102DA000DF91CF911F910F91FF90EF90DF90CF9027 +:102DB0000C94ED1BFF2091F0802F8F7126960FB69B +:102DC000F894DEBF0FBECDBFDF91CF911F910F9161 +:102DD000FF90EF90DF90CF900C94B71B26960FB624 +:102DE000F894DEBF0FBECDBFDF91CF911F910F9141 +:102DF000FF90EF90DF90CF900C94B21BFF20A1F0DA +:102E0000222309F4B1CF812F26960FB6F894DEBFA6 +:102E10000FBECDBFDF91CF911F910F91FF90EF902B +:102E2000DF90CF900C942913222309F4B1CF812F86 +:102E300026960FB6F894DEBF0FBECDBFDF91CF91BF +:102E40001F910F91FF90EF90DF90CF900C94FC13A7 +:102E5000402F4F70612FC6010E94B21E26960FB6FA +:102E6000F894DEBF0FBECDBFDF91CF911F910F91C0 +:102E7000FF90EF90DF90CF900C94C41A402F4F70CA +:102E8000612FC60126960FB6F894DEBF0FBECDBFE8 +:102E9000DF91CF911F910F91FF90EF90DF90CF9036 +:102EA0000C94B51E26960FB6F894DEBF0FBECDBFAC +:102EB000DF91CF911F910F91FF90EF90DF90CF9016 +:102EC00008950E940A1D0E94D91C0E94241D0E9480 +:102ED0005D210E94292080E090E00E94F31180E0B3 +:102EE00090E00C9409120E94FA1C0C9461170E9445 +:102EF0006A1C292F22952F7030E02C3031054CF4BC +:102F00002A3031056CF4225031092230310588F421 +:102F100007C02C30310549F02F30310531F009C0A0 +:102F2000803E48F0803F29F406C093FB882780F953 +:102F3000089580E0089581E00895CF93DF9300D055 +:102F400000D01F92CDB7DEB70F900F900F900F906B +:102F50000F90DF91CF910895CF93DF9300D000D0F1 +:102F600000D0CDB7DEB726960FB6F894DEBF0FBE01 +:102F7000CDBFDF91CF910895CF93DF93C0917301BF +:102F800080917401C817A1F0D0E0CE0166E070E036 +:102F90000E946E26FC01EB58FE4F408151816281F8 +:102FA0007381848195810E94AC172196C770E8CF08 +:102FB000DF91CF9108954091A5015091A6016091B4 +:102FC000A7017091A8018091A9019091AA010C9488 +:102FD000AC17CF93DF938091AA0182958F7009F08F +:102FE0005CC08091A701882309F457C02091730128 +:102FF000D09174014091A501C091A601E091A80172 +:10300000F091A9012D1709F448C030E0309709F478 +:1030100040C0CF3F11F44F3FE1F1C90166E070E0DD +:103020000E946E26DC01AB58BE4F11968C91119711 +:10303000C8132FC08C9148132CC012968C911297F4 +:10304000811127C013968D919C9114978E179F071D +:1030500008F401978E1B9F0B883C9105D0F480915A +:10306000AA018F7080618093AA01C90166E070E0B7 +:103070000E946E26FC01E658FE4F90819F70906181 +:10308000908385EA91E00E945914DF91CF910C94CE +:10309000BC172F5F3F4F2770B5CFDF91CF910895B9 +:1030A000BF92CF92DF92EF92FF920F931F93CF9335 +:1030B000DF93CDB7DEB761970FB6F894DEBF0FBED2 +:1030C000CDBF8C0185E0F801DE011D9601900D92C7 +:1030D0008A95E1F7D8014C9111962C91119712968F +:1030E000EC9012971396CD90DC9014975091A50117 +:1030F0006091A6018091A8019091A901009709F41F +:103100006EC16F3F19F45F3F09F469C1B090A70128 +:10311000BB2009F4C3C03091AA01C816D90628F013 +:10312000F601E81BF90BCF0104C0809590958C0D3A +:103130009D1DFF24F394883C910588F0F12C307F8D +:1031400009F0CBC07C2DD98AC88A522F6E2D89896F +:103150000E949D1785EA91E00E945914B4C0832F04 +:10316000807F09F049C0621314C0541312C0E110EB +:1031700010C03F7030613093AA010E94DB1785EACE +:1031800091E00E9459148091AA01D80115968C9360 +:1031900031C0CD2831F12F3F11F44F3F11F1FE2CFA +:1031A000E1101FC0E091730130917401E31709F43D +:1031B0005CC0F0E0CF0166E070E00E946E26DC01AA +:1031C000AB58BE4F11968C911197281307C08C9164 +:1031D000481304C012968C91811103C03196E77098 +:1031E000E5CFFE2CEE2009F416C18091AA01816082 +:1031F0008093AA01F12C0FC1621308C0541306C0BA +:10320000E11004C08091AA01D801C1C04D872E876A +:103210008D859E850E9477178823E1F1EE20D1F1FC +:103220002091AA01822F82958F7090E0029774F00E +:103230008091A5019091A60198878F831986DB86DE +:10324000CA862C87CE0107960E94591486E0F801A1 +:10325000A5EAB1E001900D928A95E1F70E94E91785 +:103260000E94DB17FF24F394D6C04D872E878D85EF +:103270009E850E946A1C292F22952F7030E02230F3 +:1032800031050CF0BCC09F7009F0B6C0805E88307C +:1032900008F4C1C0C8010E945914E4CFC816D90669 +:1032A00008F453C0F601E81BF90BCF01883C9105E7 +:1032B00008F450C0F12C7C2DD98AC88A522F6E2D6B +:1032C00089890E949D17E5EAF1E086E0DF011D9201 +:1032D0008A95E9F70E94DB179EC0621314C054134D +:1032E00012C0E11010C08091AA01F8018583C801C5 +:1032F0000E94591486E0E5EAF1E0DF011D928A950B +:10330000E9F7FB2C88C04D872E878D859E850E940E +:103310007717882309F4BECFEE2009F4BBCF2091A4 +:10332000AA01822F82958F7090E002970CF48ECFC5 +:103330008091A5019091A6019A8389831B82DD82E9 +:10334000CC822E83CE0101967FCF809590958C0DF7 +:103350009D1DACCFFE2CEE2009F49CCF62132EC035 +:1033600054132CC02091AA0120FD1FC0822F8295EA +:103370008F70D9F0D80115962C9315978F3049F09E +:103380008F5F982F9295907F822F8F70892B159643 +:103390008C93C8010E94591486E0F801A5EAB1E0B7 +:1033A00001900D928A95E1F795CF86E0F801A5EAA4 +:1033B000B1E001900D928A95E1F72DC04D872E87DF +:1033C0008D859E850E947717811140CF8091AA013B +:1033D00081608093AA01C8010E9459141CC0EE208C +:1033E00009F458CF4D872E878D859E850E947717CB +:1033F000882309F44FCF2ACF811148CF0CC0243045 +:1034000031050CF047CF9F7009F440CFF80195814A +:10341000907F09F03BCF8F2D61960FB6F894DEBFF9 +:103420000FBECDBFDF91CF911F910F91FF90EF9015 +:10343000DF90CF90BF900895CF93DF93CDB7DEB7E5 +:103440002C970FB6F894DEBF0FBECDBF4F835887C1 +:1034500069877A878B879C87CE0107960E945018D0 +:10346000882371F08F8198852A853B85232B09F469 +:103470003FC09F3F09F068C08F3F09F065C038C06A +:1034800086E0FE013796DE01119601900D928A9535 +:10349000E1F76F817885EA85FB85309749F17F3FB9 +:1034A00011F46F3F29F18091740190E09C012F5F2E +:1034B0003F4F277033274091730150E024173507A1 +:1034C00009F44BC069837A83FD83EC8366E070E086 +:1034D0000E946E26DC01AB58BE4F96E0FE0131968D +:1034E00001900D929A95E1F7209374010E94BC1708 +:1034F00080917301909174018917E9F190E066E081 +:1035000070E00E946E268B589E4F0E9450188823B0 +:1035100091F18091730190E066E070E00E946E2668 +:10352000FC01EB58FE4F408151816281738184819F +:1035300095810E94AC178091730190E0019687708D +:10354000992780937301D4CF4F81588569857A85F7 +:103550008B859C850E94AC17CBCF0E94731710926D +:10356000740110927301E5EAF1E086E0DF011D923B +:103570008A95E9F7BDCF2C960FB6F894DEBF0FBE43 +:10358000CDBFDF91CF910895DF92EF92FF920F931D +:103590001F93CF93DF93FC01892B09F48AC0E12CA0 +:1035A000F12CDD24D394EF0121968491853709F421 +:1035B00061C058F4843708F04EC0843008F06AC007 +:1035C0008130D1F0823071F174C0883709F45DC068 +:1035D00050F4863709F455C0873709F06AC08E2D3C +:1035E0000E94F71C54C09CE7980F903708F061C008 +:1035F0008F770E94FC1350C08F010E5F1F4FFE019A +:10360000849190E2980F983050F48770FD2D01C09E +:10361000FF0F8A95EAF78F2F0E94FD1C14C00E94AD +:10362000291313C08F010E5F1F4FFE01C49180E26A +:103630008C0F883060F4C7708D2D01C0880FCA953B +:10364000EAF70E94031D0E94241DE80125C08C2F6B +:103650000E94FC13FACF9F012E5F3F4FFE01C491E1 +:10366000CC2369F08FE99FE00197F1F700C00000DB +:10367000C150F6CF9F012E5F3F4FFE01F490E9014C +:103680000BC00E94E71CE82E07C00E94FA1C0E9493 +:10369000241D02C00E9429138F2D882341F0EFE9D9 +:1036A000FFE03197F1F700C000008150F6CFFE0136 +:1036B0007ACFDF91CF911F910F91FF90EF90DF9024 +:1036C00008956093AF017093B0018093B10190931E +:1036D000B2010E94711D0C9461176093AB0170934D +:1036E000AC018093AD019093AE010E94721D0C94C9 +:1036F000611708950C94611B0F931F930091AF0104 +:103700001091B0012091B1013091B201602B712B69 +:10371000822B932B1F910F910C94611B0F931F937E +:103720000091AF011091B0012091B1013091B2012F +:1037300060237123822393231F910F910C94611BAB +:103740000F931F930091AF011091B0012091B1012F +:103750003091B20160277127822793271F910F9123 +:103760000C94611B60E070E0CB010C946D1B0F9317 +:103770001F9341E050E060E070E08A019B0104C0CB +:10378000000F111F221F331F8A95D2F7C901B801FC +:103790001F910F910C946D1B0F931F9341E050E00C +:1037A00060E070E004C0440F551F661F771F8A95C4 +:1037B000D2F78091AB019091AC01A091AD01B09195 +:1037C000AE018A019B01082B192B2A2B3B2BC90127 +:1037D000B8011F910F910C946D1B0F931F9341E043 +:1037E00050E060E070E004C0440F551F661F771F73 +:1037F0008A95D2F740955095609570958091AB0170 +:103800009091AC01A091AD01B091AE018A019B01F4 +:10381000082319232A233B23C901B8011F910F91C3 +:103820000C946D1B0F931F9341E050E060E070E03B +:1038300004C0440F551F661F771F8A95D2F78091E9 +:10384000AB019091AC01A091AD01B091AE018A01A4 +:103850009B01082719272A273B27C901B8011F9177 +:103860000F910C946D1B0F931F930091AB0110915E +:10387000AC012091AD013091AE01602B712B822BF8 +:10388000932B1F910F910C946D1B0F931F9300911D +:10389000AB011091AC012091AD013091AE016023DC +:1038A0007123822393231F910F910C946D1B0F930F +:1038B0001F930091AB011091AC012091AD013091AB +:1038C000AE0160277127822793271F910F910C94D7 +:1038D0006D1B0895CF92DF92EF92FF920F931F938B +:1038E000CF93DF938C01C090AF01D090B001E090F6 +:1038F000B101F090B2014091AB015091AC016091E7 +:10390000AD017091AE01C42AD52AE62AF72ACFE18B +:10391000D0E0D701C6010C2E04C0B695A7959795A7 +:1039200087950A94D2F780FF07C0B8018C2F0E94B8 +:10393000831E8130910531F4219758F7B80180E05A +:103940000E94831EDF91CF911F910F91FF90EF9006 +:10395000DF90CF90089520910D0130910E01F90173 +:1039600032969FEF40E05191581789F09F3F19F42C +:10397000511101C0942F4F5F4630A9F79F3F39F096 +:10398000F901E90FF11D97FDFA95828308950895D5 +:1039900020910D0130910E01F9013296285F3F4FC1 +:1039A0009081981301C010823196E217F307C1F796 +:1039B000089581E090E0E0910D01F0910E01E80F93 +:1039C000F91F1082019688309105A9F7089580911A +:1039D000BD0108959091BD01892B8093BD0108958B +:1039E00080959091BD0189238093BD0108958093B6 +:1039F000BD0108951092BD0108959091BC01892BDD +:103A00008093BC01089580959091BC018923809397 +:103A1000BC0108951092BC0108958093B3010895EC +:103A20001092B301089580910D0190910E01FC0157 +:103A300031969C01285F3F4F80E0919191118F5FFB +:103A4000E217F307D1F70895E0910D01F0910E010F +:103A50008091BD018083E0910D01F0910E01908174 +:103A60008091BC01892B80838091B301882361F010 +:103A7000E0910D01F0910E019081892B80830E94CD +:103A8000131D81111092B30180910D0190910E01CF +:103A90000C949F1190933501809334010895829581 +:103AA000982F9C7C292F26952695982F9373990FF4 +:103AB000990F922B892F8A7A86959575990F892B64 +:103AC00008950895CF93DF9300D000D01F92CDB713 +:103AD000DEB70F900F900F900F900F90DF91CF9166 +:103AE0000895089508950C94E7128091D3018430CD +:103AF00021F11092BF0120E488E190E00FB6F89424 +:103B0000A895809360000FBE2093600083B7817FEB +:103B1000846083BF83B7816083BF7894889583B7BF +:103B20008E7F83BF0FB6F894A8958091600088615E +:103B300080936000109260000FBE0895089508956C +:103B4000CF930E949E1D0E94EE070E949F1DC0E021 +:103B50008C2F0E94EC08811104C0CF5FC031C1F7E7 +:103B600001C081E0CF9108950C9473171F920F92BA +:103B70000FB60F9211248F939F93AF93BF938091B1 +:103B8000BF01811113C08091C0019091C101A0912A +:103B9000C201B091C3014196A11DB11D8093C00126 +:103BA0009093C101A093C201B093C301BF91AF91A3 +:103BB0009F918F910F900FBE0F901F90189582E0EC +:103BC00084BD93E095BD9AEF97BD80936E000895F4 +:103BD0002FB7F8948091C0019091C101A091C201CA +:103BE000B091C3012FBF08952FB7F8946091C00121 +:103BF0007091C1018091C2019091C3012FBF0895BE +:103C0000CF92DF92EF92FF920F931F932FB7F8940A +:103C10004091C0015091C1016091C2017091C301F6 +:103C20002FBF6A017B01EE24FF248C0120E030E0ED +:103C3000C016D106E206F30610F4415051099A016C +:103C4000281B390BC9011F910F91FF90EF90DF9056 +:103C5000CF9008951F920F920FB60F9211248F9359 +:103C60009F93AF93BF938091C0019091C101A091A8 +:103C7000C201B091C3010196A11DB11D8093C00185 +:103C80009093C101A093C201B093C301BF91AF91C2 +:103C90009F918F910F900FBE0F901F9018950E94CB +:103CA000E70EF8942FEF87EA91E62150804090408C +:103CB000E1F700C0000087E090EBDC018093DC01BD +:103CC0009093DD01A093DE01B093DF019CE088E1D9 +:103CD0000FB6F894A895809360000FBE9093600093 +:103CE000FFCFE92FF0E093E0EE0FFF1F9A95E1F789 +:103CF000E80FF11DE855FF4F8491982F90778F7052 +:103D000092959F700895CF93C82FCB010E94711E8A +:103D1000292F30E0E82FF0E0C90144E0880F991F17 +:103D20004A95E1F78E2B9F2B8038910519F480E09E +:103D300090E016C04C2F50E083E0440F551F8A9549 +:103D4000E1F7240F351F94E0220F331F9A95E1F716 +:103D5000E20FF31FEE0FFF1FE050F8498591949199 +:103D6000CF91089580E090E0089508958091C60174 +:103D700080FF0CC08091120190E065E070E00E942D +:103D80006E2695958795959587952EC081FF0AC0DB +:103D90008091120190E065E070E00E946E2695959A +:103DA000879522C082FF08C08091120190E065E0F3 +:103DB00070E00E946E2618C02091C7012223D1F026 +:103DC00030911101231780F78091120190E065E096 +:103DD00070E00E946E26622F70E00E946E26632FB4 +:103DE00070E00E948B26CB018038910530F400975B +:103DF00031F0089585E090E008958FE7089581E01F +:103E000008958091C60180FF08C06091100170E0A4 +:103E1000759567957595679523C081FF06C060917C +:103E2000100170E0759567951BC082FF04C060911A +:103E3000100170E012C06091C7016623D1F020919B +:103E40000F016217A0F78091100170E090E00E94CE +:103E50006E26622F70E00E948B266038710528F470 +:103E60006115710521F0862F08958FE7089581E08F +:103E7000089561E070E0F4CF803F21F40E94B61E07 +:103E8000819504C0813F29F40E94B61E8093CA0127 +:103E90000895823F21F40E94B61E819504C0833F9D +:103EA00029F40E94B61E8093C9010895893F19F430 +:103EB0000E94011F05C08A3F31F40E94011F8195B5 +:103EC0008093CB0108958B3F21F40E94011F8195BF +:103ED00004C08C3F29F40E94011F8093CC010895F7 +:103EE000843F21F48091C801816017C0853F21F48F +:103EF0008091C801826011C0863F21F48091C80181 +:103F000084600BC0873F21F48091C801886005C0A0 +:103F1000883F31F48091C80180618093C801089581 +:103F20008D3F21F48091C60181600BC08E3F21F44A +:103F30008091C601826005C08F3F29F48091C6013F +:103F400084608093C6010895803F39F48091CA014E +:103F500087FF6CC01092CA0169C0813F29F480912B +:103F6000CA011816BCF362C09091C901823F29F4BE +:103F700097FF5CC01092C90159C0833F19F419160C +:103F8000CCF354C0893F41F48091CB0118160CF05A +:103F90004DC01092CB014AC08A3F29F48091CB01D9 +:103FA00087FF44C0F6CF8B3F39F48091CC0187FF67 +:103FB0003DC01092CC013AC08C3F29F48091CC01D5 +:103FC0001816BCF333C0843F21F48091C8018E7F62 +:103FD00017C0853F21F48091C8018D7F11C0863FB5 +:103FE00021F48091C8018B7F0BC0873F21F4809121 +:103FF000C801877F05C0883F31F48091C8018F7E5A +:104000008093C80113C08D3F21F48091C6018E7F3B +:104010000BC08E3F21F48091C6018D7F05C08F3F7C +:1040200029F48091C6018B7F8093C6018091C901DC +:1040300081110EC08091CA0181110AC08091CB010B +:10404000811106C08091CC01811102C01092C7017C +:1040500008958091BE0183FF7EC08BE894E00E94AA +:104060008D058091C8011F928F9386E894E09F93FD +:104070008F930E94260684E894E00E948D0580912B +:10408000C901282F082E000C330B3F938F9381E832 +:1040900094E09F938F930E9426068FE794E00E94FE +:1040A0008D058091CA01282F082E000C330B3F93F9 +:1040B0008F938CE794E09F938F930E9426068AE764 +:1040C00094E00E948D058091CB01282F082E000CD2 +:1040D000330B3F938F9387E794E09F938F930E94D6 +:1040E000260685E794E00E948D058091CC01282F5B +:1040F000082E000C330B3F938F9382E794E09F933D +:104100008F930E9426068FE694E00E948D05809191 +:10411000C7011F928F938CE694E09F938F930E9428 +:1041200026068AE694E00E948D058091C6011F92C2 +:104130008F9387E694E09F938F930E94260684E6F0 +:1041400094E00E948D058DB79EB74C960FB6F894FB +:104150009EBF0FBE8DBF88EC91E00E94E8110E94C7 +:10416000E81D9093C5018093C40108951F93CF93D8 +:10417000DF938091C4019091C5010E94001EFC0153 +:104180002091C701222329F090911301892F90E0FB +:1041900007C08091140190E06AE070E00E946E26F2 +:1041A000E817F90708F485C08091C901C091CA01D8 +:1041B000D091CB011091CC01811107C0C11175C004 +:1041C000D11173C0111171C074C02F3F19F02F5F4E +:1041D0002093C701181624F40E94B61E8093C901CB +:1041E0008091C90187FF05C00E94B61E819580930A +:1041F000C9011C1624F40E94B61E8093CA01809146 +:10420000CA0187FF05C00E94B61E81958093CA012E +:104210006091C901662331F1C091CA01CC2311F12B +:10422000062E000C770B880B990B0E946D2523E35B +:1042300033E343E35FE30E94D1250E943525609379 +:10424000C9016C2FCC0F770B880B990B0E946D2541 +:1042500023E333E343E35FE30E94D1250E94352546 +:104260006093CA011D1624F40E94011F8093CB01A4 +:104270008091CB0187FF05C00E94011F819580932B +:10428000CB01111624F40E94011F8093CC01809170 +:10429000CC0187FF05C00E94011F81958093CC014E +:1042A000DF91CF911F910C9429202F3F09F08FCFE0 +:1042B00097CFDF91CF911F910895E8ECF1E085E071 +:1042C000DF011D928A95E9F71092C7011092C6018D +:1042D00008958EEA96E00E948D051F9281E08F93EB +:1042E0001F9285E08F9380E696E09F938F930E94C4 +:1042F00026060F900F900F900F900F900F9008953B +:104300008330E9F128F4813061F0823009F10895B9 +:10431000853009F462C008F449C0863009F474C0DD +:10432000089580911401262F30E0280F311D2F3F72 +:10433000310524F4680F6093140103C08FEF80935C +:104340001401809114011F928F9389E995E072C046 +:1043500080911301262F30E0280F311D2F3F3105AA +:1043600024F4680F6093130103C08FEF809313014F +:10437000809113011F928F9387E895E05BC0809135 +:104380001201262F30E0280F311D2F3F310524F474 +:10439000680F6093120103C08FEF80931201809128 +:1043A00012011F928F9384E795E044C08091110120 +:1043B000262F30E0280F311D2F3F310524F4680FE0 +:1043C0006093110103C08FEF80931101809111015F +:1043D0001F928F938FE595E02DC080911001262FBD +:1043E00030E0280F311D2F3F310524F4680F609312 +:1043F000100103C08FEF80931001809110011F9274 +:104400008F9386E495E016C080910F01262F30E04F +:10441000280F311D2F3F310524F4680F60930F01E1 +:1044200003C08FEF80930F0180910F011F928F9334 +:104430008BE295E09F938F930E9426060F900F903A +:104440000F900F900895833081F128F4813059F056 +:104450008230D1F00895853009F449C0B8F1863032 +:1044600009F456C0089580911401681720F4861B42 +:104470008093140102C010921401809114011F92C4 +:104480008F938CE195E054C080911301681720F45C +:10449000861B8093130102C01092130180911301B7 +:1044A0001F928F938AE095E043C0809112016817B4 +:1044B00020F4861B8093120102C010921201809199 +:1044C00012011F928F9387EF94E032C08091110107 +:1044D000681720F4861B8093110102C0109211010D +:1044E000809111011F928F9382EE94E021C0809100 +:1044F0001001681720F4861B8093100102C01092EF +:104500001001809110011F928F9389EC94E010C0EC +:1045100080910F01681720F4861B80930F0102C061 +:1045200010920F0180910F011F928F938EEA94E0F9 +:104530009F938F930E9426060F900F900F900F90DD +:104540000895CF93C82F1F928F9383EB97E09F938B +:104550008F930E94260681E090E0A0E0B0E0BC01CD +:10456000CD0104C0660F771F881F991FCA95D2F727 +:104570000E947A1B0F900F900F900F90CF910C9488 +:104580007317CF93873288F58E3108F00BC18E30C8 +:1045900009F487C0D8F4873009F460C08B3009F47F +:1045A0004FC0863009F002C18091BE01817F8E7FAD +:1045B0008093BE0188EB97E00E948D058CE69AE01F +:1045C0000E948D0581E08093CE0146C0863109F4BA +:1045D000B0C020F4803109F47AC0E8C0893109F410 +:1045E00091C08B3109F449C0E1C0883349F150F4DE +:1045F000893209F4D5C0853309F4D2C0873209F075 +:10460000D5C0CEC0833409F4CBC028F48A3308F473 +:10461000CDC08953C8C0883409F0C8C00E94731740 +:104620008BE59AE00E948D052FEF83ED90E32150FA +:1046300080409040E1F700C000000E944F1E0CC077 +:104640008FED97E041C082E49AE00E948D05809151 +:10465000BE0181608093BE01C1E0ADC08091BE010A +:10466000C82FC17080FFEFCF8EE49AE00E948D05C5 +:104670008091BE01817F8E7F3FC09091BE0191FBF2 +:10468000CC27C0F981E0C827892FC0FB81F980932E +:10469000BE01CC2319F085E39AE029C087E29AE0B5 +:1046A00013C09091BE0192FBCC27C0F981E0C827CE +:1046B000892FC0FB82F98093BE01CC2319F088E1D9 +:1046C0009AE015C088E09AE00E948D05C5CF9091D0 +:1046D000BE0193FBCC27C0F981E0C827892FC0FB1E +:1046E00083F98093BE01CC2351F08CEF99E00E94B6 +:1046F0008D058091BE0181608093BE015CC08FEE0C +:1047000099E0E2CF80EE99E00E948D058DEB99E073 +:104710000E948D0588E799E00E948D0581E599E06A +:104720000E948D058CE099E00E948D058DED98E04A +:10473000CBCF8FEC98E00E948D050E9493111F92C1 +:104740008F9385EB98E09F938F930E94260680912C +:104750000C011F928F938EE998E09F938F930E9494 +:10476000260680915B011F928F938BE898E09F93C0 +:104770008F930E9426060E94F41D9F938F937F9330 +:104780006F9384E798E09F938F930E9426068DB7DE +:104790009EB742960FB6F8949EBF0FBE8DBF5CCFFA +:1047A00080E001C08D510E94A12256CF82E798E09F +:1047B0000E948D05C0E08C2FCF91089580E0089570 +:1047C00080E00895CF93C82F8091CE01813069F0A9 +:1047D00020F0823009F449C040C167E08FE00E94B8 +:1047E000D708882309F43FC106C067E08FE00E9424 +:1047F000D708882361F08C2F0E94DE23811104C02A +:104800008C2F0E94C1222FC081E090E02CC08C2F01 +:104810000E94E023811126C0C431E1F070F4CB3056 +:1048200081F0C031D1F40E9469218BEA97E00E94A7 +:104830008D0582E08093CE0115C0C93259F0C8338E +:1048400061F488EB97E00E948D058FEA97E00E9463 +:104850008D0508C01092CE0104C189EA97E00E943C +:104860008D05FFC081E08170FEC0C43228F5CE31D5 +:1048700008F0C1C0CB30A1F1D0F4C73009F0D3C0EB +:104880008EE18093140182E3809313018AE0809388 +:10489000120184E18093110188E08093100188E285 +:1048A00080930F018FE496E00E948D05BFC0C33155 +:1048B00049F1C431C1F0B7C0CB3409F4A9C028F420 +:1048C000C93289F0C83361F0AEC0C13509F49EC069 +:1048D000C23509F499C0CE3409F0A5C06AE09EC083 +:1048E0000E946921A3C08091CD01882319F0109204 +:1048F000CD019CC08CE596E00E948D0581E08093FF +:10490000CE01B1C086E396E00E948D0584E296E078 +:104910000E948D05809114011F928F9381E296E091 +:104920009F938F930E9426068FE196E00E948D054B +:104930008DE096E00E948D05809113011F928F9368 +:104940008AE096E09F938F930E94260688E096E087 +:104950000E948D0589EF95E00E948D0580911201DE +:104960001F928F9386EF95E09F938F930E94260668 +:1049700084EF95E00E948D0583EE95E00E948D0501 +:10498000809111011F928F9380EE95E09F938F93FA +:104990000E9426068EED95E00E948D0589EC95E03B +:1049A0000E948D05809110011F928F9386EC95E0F7 +:1049B0009F938F930E94260684EC95E00E948D05BC +:1049C0008DEA95E00E948D0580910F011F928F93D3 +:1049D0008AEA95E09F938F930E94260688EA95E0E5 +:1049E0000E948D058DB79EB748960FB6F8949EBF6E +:1049F0000FBE8DBF1BC0CE51EC2FF0E0E75DFE4F28 +:104A000080818093CD0112C061E003C061E006C0E7 +:104A10006AE08091CD010E94802108C08091CD0183 +:104A20000E94232203C08DE496E013C08091CD0143 +:104A3000882369F01F928F9387E496E09F938F936A +:104A40000E9426060F900F900F900F9004C084E4F0 +:104A500096E00E948D0581E006C01092CE0180E0B4 +:104A600002C080E000CFCF9108950E943C25689459 +:104A7000B1110C94CB2508950E94B02588F09F5762 +:104A800098F0B92F9927B751B0F0E1F0660F771F72 +:104A9000881F991F1AF0BA95C9F714C0B13091F068 +:104AA0000E94CA25B1E008950C94CA25672F782F7B +:104AB0008827B85F39F0B93FCCF38695779567952D +:104AC000B395D9F73EF490958095709561957F4F99 +:104AD0008F4F9F4F0895E89409C097FB3EF490953F +:104AE0008095709561957F4F8F4F9F4F9923A9F0C7 +:104AF000F92F96E9BB279395F69587957795679556 +:104B0000B795F111F8CFFAF4BB0F11F460FF1BC099 +:104B10006F5F7F4F8F4F9F4F16C0882311F096E92C +:104B200011C0772321F09EE8872F762F05C06623DA +:104B300071F096E8862F70E060E02AF09A95660F93 +:104B4000771F881FDAF7880F9695879597F908954C +:104B500057FD9058440F551F59F05F3F71F047952E +:104B6000880F97FB991F61F09F3F79F08795089513 +:104B7000121613061406551FF2CF4695F1DF08C032 +:104B8000161617061806991FF1CF8695710561054F +:104B900008940895E894BB2766277727CB0197F9F7 +:104BA00008950E94E3250C945D260E944F2638F05C +:104BB0000E94562620F0952311F00C9446260C9462 +:104BC0004C260C94CB250E94A82578F39923C9F391 +:104BD0005523B9F3950F50E0551FAA27EE27FF275D +:104BE000BB2700240894679520F4E20FF31FB41F3D +:104BF0000A1E220F331F441FAA1F6695A9F7779537 +:104C000030F4F30FB41F0A1E121E08F46395330F1D +:104C1000441FAA1F221F769599F7879520F4B40F99 +:104C20000A1E121E631F440FAA1F221F331F8695E0 +:104C3000A9F7862F712D602D11249F5750409AF0AF +:104C4000F1F088234AF0EE0FFF1FBB1F661F771F8E +:104C5000881F91505040A9F79E3F510580F00C9459 +:104C600046260C94CB255F3FE4F3983ED4F386951B +:104C700077956795B795F795E7959F5FC1F7FE2BF9 +:104C8000880F911D9695879597F9089597F99F67D5 +:104C900080E870E060E008959FEF80EC08950024C4 +:104CA0000A941616170618060906089500240A9491 +:104CB00012161306140605060895092E0394000C17 +:104CC00011F4882352F0BB0F40F4BF2B11F460FFA6 +:104CD00004C06F5F7F4F8F4F9F4F0895002455276B +:104CE00004C0080E591F880F991F009729F0769568 +:104CF0006795B8F37105B9F7802D952F0895991B25 +:104D000079E004C0991F961708F0961B881F7A95C2 +:104D1000C9F78095089597FB072E16F4009407D0E5 +:104D200077FD09D00E94A52607FC05D03EF490959A +:104D300081959F4F0895709561957F4F0895EE0F6F +:104D4000FF1F0590F491E02D0994AA1BBB1B51E1B4 +:104D500007C0AA1FBB1FA617B70710F0A61BB70BEB +:104D6000881F991F5A95A9F780959095BC01CD0190 +:064D70000895F894FFCF46 +:104D7600FFFF580A490B260BF20ABE0A01B40128A6 +:104D860008140A321E404D3622FF03B2037C035A32 +:104D960003E602FF021803310301020304050607B6 +:044DA60008090000F8 +:106800000000EA44E944E2440400050006000700F1 +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280029002A002B002C002D002E002F00DC +:10686000300031A132003300340035A1360037004A +:10687000380082003A003B003C003D003E003F00F3 +:1068800040004100420043004400450046004700EC +:10689000480049004A004B004C004D004E004F009C +:1068A000500051005200530067005400550056003C +:1068B000580059005A005B005C005D005E005F00FC +:1068C0006000610062006300640000005700000087 +:1068D0006800000000000000000000000000000050 +:1068E0000000000000007300000000000000000035 +:1068F000E000E100E200E300E400E500E600E7007C +:106900000100010001000100EA4401000100E2442D +:106910000100010001000100460001004A004B0097 +:10692000010001004700480001000100E9440100A6 +:106930000100010001000100010001003A003B00DC +:106940003C003D003E003F0040004100420043004B +:10695000010001004C00010001004400450052000C +:1069600049000100010050004F0001004D004E00A1 +:1069700051000100010001000100010001000100BF +:1069800001000100010001000100010001000100FF +:1069900001000100010001000100010001004D00A3 +:1069A0004A004E004B0001000100010001000100FF +:1069B00001000100010001000100010001000100CF +:1069C00001000100010001000100010001000100BF +:1069D00001000100010001000100010001000100AF +:1069E000010001000100010001000100010001009F +:1069F000010001000100010001000100010001008F +:00000001FF diff --git a/converter/adb_usb/config.h b/converter/adb_usb/config.h index 5ce5c221..3500188d 100644 --- a/converter/adb_usb/config.h +++ b/converter/adb_usb/config.h @@ -40,10 +40,6 @@ along with this program. If not, see . #define LOCKING_RESYNC_ENABLE -/* legacy keymap support */ -#define USE_LEGACY_KEYMAP - - /* ADB port setting */ #define ADB_PORT PORTD #define ADB_PIN PIND diff --git a/converter/adb_usb/keymap_ansi.c b/converter/adb_usb/keymap_ansi.c index aa993192..8d69ec5b 100644 --- a/converter/adb_usb/keymap_ansi.c +++ b/converter/adb_usb/keymap_ansi.c @@ -12,5 +12,5 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/adb_usb/keymap_common.c b/converter/adb_usb/keymap_common.c deleted file mode 100644 index 55a13793..00000000 --- a/converter/adb_usb/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/adb_usb/keymap_common.h b/converter/adb_usb/keymap_common.h index cb643c8f..49581d79 100644 --- a/converter/adb_usb/keymap_common.h +++ b/converter/adb_usb/keymap_common.h @@ -19,7 +19,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "action.h" #include "action_macro.h" @@ -29,10 +28,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* Common layout: ANSI+ISO * ,---. .---------------. ,---------------. ,---------------. ,-----------. ,---------------. * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut|Pwr| diff --git a/converter/adb_usb/keymap_hasu.c b/converter/adb_usb/keymap_hasu.c index a0b3f1fc..14701160 100644 --- a/converter/adb_usb/keymap_hasu.c +++ b/converter/adb_usb/keymap_hasu.c @@ -53,6 +53,6 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(1, KC_BSLS), }; diff --git a/converter/adb_usb/keymap_iso.c b/converter/adb_usb/keymap_iso.c index 1ccb17e2..ffb7f431 100644 --- a/converter/adb_usb/keymap_iso.c +++ b/converter/adb_usb/keymap_iso.c @@ -12,5 +12,5 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/adb_usb/keymap_plain.c b/converter/adb_usb/keymap_plain.c index 2f11f86a..b7a80f57 100644 --- a/converter/adb_usb/keymap_plain.c +++ b/converter/adb_usb/keymap_plain.c @@ -36,7 +36,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(1, KC_GRV), [1] = ACTION_LAYER_TAP_KEY(1, KC_BSLS), }; diff --git a/converter/adb_usb/unimap_common.h b/converter/adb_usb/unimap_common.h new file mode 100644 index 00000000..96f8a872 --- /dev/null +++ b/converter/adb_usb/unimap_common.h @@ -0,0 +1,213 @@ +/* +Copyright 2016 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#ifndef UNIMAP_COMMON_H +#define UNIMAP_COMMON_H + +#include +#include +#include "unimap.h" + + +/* Apple Extended Keyboard Common layout: ANSI+ISO + * ,---. .---------------. ,---------------. ,---------------. ,-----------. ,---------------. + * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut|F24| + * `---' `---------------' `---------------' `---------------' `-----------' `---------------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| =| /| *| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| -| + * |-----------------------------------------------------------| `-----------' |---------------| + * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| +| + * |-----------------------------------------------------------| ,---. |---------------| + * |Shif|\ | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | + * |-----------------------------------------------------------| ,-----------. |-----------|Ent| + * |Ctrl |Alt |Gui | Space |Gui |Alt |Ctrl | |Lef|Dow|Rig| | 0| .| | + * `-----------------------------------------------------------' `-----------' `---------------' + * Command = Gui + * Option = Alt + * Power key = F24 + * Mic = F13(Adjustable keyboard) + */ +// http://lxr.free-electrons.com/source/drivers/macintosh/adbhid.c +// http://opensource.apple.com//source/IOHIDFamily/IOHIDFamily-701.20.10/IOHIDFamily/Cosmo_USB2ADB.c +// http://m0115.web.fc2.com/m0115.jpg +const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = { + // Position(unimap) ADB scan code(matrix) + // --------------------------------------------- + { + UNIMAP_A, // 0x00 + UNIMAP_S, // 0x01 + UNIMAP_D, // 0x02 + UNIMAP_F, // 0x03 + UNIMAP_H, // 0x04 + UNIMAP_G, // 0x05 + UNIMAP_Z, // 0x06 + UNIMAP_X, // 0x07 + }, + { + UNIMAP_C, // 0x08 + UNIMAP_V, // 0x09 + UNIMAP_NONUS_BSLASH, // 0x0A + UNIMAP_B, // 0x0B + UNIMAP_Q, // 0x0C + UNIMAP_W, // 0x0D + UNIMAP_E, // 0x0E + UNIMAP_R, // 0x0F + }, + { + UNIMAP_Y, // 0x10 + UNIMAP_T, // 0x11 + UNIMAP_1, // 0x12 + UNIMAP_2, // 0x13 + UNIMAP_3, // 0x14 + UNIMAP_4, // 0x15 + UNIMAP_6, // 0x16 + UNIMAP_5, // 0x17 + }, + { + UNIMAP_EQUAL, // 0x18 + UNIMAP_9, // 0x19 + UNIMAP_7, // 0x1A + UNIMAP_MINUS, // 0x1B + UNIMAP_8, // 0x1C + UNIMAP_0, // 0x1D + UNIMAP_RBRACKET, // 0x1E + UNIMAP_O, // 0x1F + }, + { + UNIMAP_U, // 0x20 + UNIMAP_LBRACKET, // 0x21 + UNIMAP_I, // 0x22 + UNIMAP_P, // 0x23 + UNIMAP_ENTER, // 0x24 + UNIMAP_L, // 0x25 + UNIMAP_J, // 0x26 + UNIMAP_QUOTE, // 0x27 + }, + { + UNIMAP_K, // 0x28 + UNIMAP_SCOLON, // 0x29 + UNIMAP_BSLASH, // 0x2A + UNIMAP_COMMA, // 0x2B + UNIMAP_SLASH, // 0x2C + UNIMAP_N, // 0x2D + UNIMAP_M, // 0x2E + UNIMAP_DOT, // 0x2F + }, + { + UNIMAP_TAB, // 0x30 + UNIMAP_SPACE, // 0x31 + UNIMAP_GRAVE, // 0x32 + UNIMAP_BSPACE, // 0x33 + UNIMAP_KP_ENTER, // 0x34 + UNIMAP_ESCAPE, // 0x35 + UNIMAP_LCTRL, // 0x36 + UNIMAP_LGUI, // 0x37 + }, + { + UNIMAP_LSHIFT, // 0x38 + UNIMAP_CAPSLOCK, // 0x39 + UNIMAP_LALT, // 0x3A + UNIMAP_LEFT, // 0x3B + UNIMAP_RIGHT, // 0x3C + UNIMAP_DOWN, // 0x3D + UNIMAP_UP, // 0x3E + UNIMAP_F23, // 0x3F FN? + }, + { + UNIMAP_F17, // 0x40 + UNIMAP_KP_DOT, // 0x41 + UNIMAP_F13, // 0x42 Mic(Adjustable keyboard) + UNIMAP_KP_MINUS, // 0x43 ADB keypad asterisk(top right) + UNIMAP_NO, // 0x44 + UNIMAP_KP_COMMA, // 0x45 ADB keypad plus + UNIMAP_NO, // 0x46 + UNIMAP_NUMLOCK, // 0x47 + }, + { + UNIMAP_VOLUME_UP, // 0x48 Vol Up(Adjustable keyboard) + UNIMAP_VOLUME_DOWN, // 0x49 Vol Down(Adjustable keyboard) + UNIMAP_VOLUME_MUTE, // 0x4A Vol Mute(Adjustable keyboard) + UNIMAP_KP_ASTERISK, // 0x4B ADB keypad slash(between equal and asterisk) + UNIMAP_KP_ENTER, // 0x4C + UNIMAP_NO, // 0x4D + UNIMAP_KP_PLUS, // 0x4E ADB keypad minus + UNIMAP_F18, // 0x4F + }, + { + UNIMAP_F19, // 0x50 + UNIMAP_KP_SLASH, // 0x51 ADB keypad equal(next to clear/numlock) + UNIMAP_KP_0, // 0x52 + UNIMAP_KP_1, // 0x53 + UNIMAP_KP_2, // 0x54 + UNIMAP_KP_3, // 0x55 + UNIMAP_KP_4, // 0x56 + UNIMAP_KP_5, // 0x57 + }, + { + UNIMAP_KP_6, // 0x58 + UNIMAP_KP_7, // 0x59 + UNIMAP_F20, // 0x5A + UNIMAP_KP_8, // 0x5B + UNIMAP_KP_9, // 0x5C + UNIMAP_JYEN, // 0x5D + UNIMAP_RO, // 0x5E + UNIMAP_KP_COMMA, // 0x5F + }, + { + UNIMAP_F5, // 0x60 + UNIMAP_F6, // 0x61 + UNIMAP_F7, // 0x62 + UNIMAP_F3, // 0x63 + UNIMAP_F8, // 0x64 + UNIMAP_F9, // 0x65 + UNIMAP_MHEN, // 0x66 + UNIMAP_F11, // 0x67 + }, + { + UNIMAP_HENK, // 0x68 + UNIMAP_PSCREEN, // 0x69 + UNIMAP_F16, // 0x6A + UNIMAP_SCROLLLOCK, // 0x6B + UNIMAP_NO, // 0x6C + UNIMAP_F10, // 0x6D + UNIMAP_APPLICATION, // 0x6E compose + UNIMAP_F12, // 0x6F + }, + { + UNIMAP_NO, // 0x70 + UNIMAP_PAUSE, // 0x71 + UNIMAP_INSERT, // 0x72 + UNIMAP_HOME, // 0x73 + UNIMAP_PGUP, // 0x74 + UNIMAP_DELETE, // 0x75 + UNIMAP_F4, // 0x76 + UNIMAP_END, // 0x77 + }, + { + UNIMAP_F2, // 0x78 + UNIMAP_PGDOWN, // 0x79 + UNIMAP_F1, // 0x7A + UNIMAP_RSHIFT, // 0x7B + UNIMAP_RALT, // 0x7C + UNIMAP_RCTRL, // 0x7D + UNIMAP_RGUI, // 0x7E + UNIMAP_F24, // 0x7F power key + } +}; + +#endif diff --git a/converter/adb_usb/unimap_plain.c b/converter/adb_usb/unimap_plain.c new file mode 100644 index 00000000..f9cba541 --- /dev/null +++ b/converter/adb_usb/unimap_plain.c @@ -0,0 +1,46 @@ +/* +Copyright 2016 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#include "unimap_common.h" + + +#define AC_FN0 ACTION_LAYER_TAP_KEY(1, KC_GRV) +#define AC_FN1 ACTION_LAYER_TAP_KEY(1, KC_BSLS) + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + UNIMAP( + F13, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, F24, + ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE, + FN0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, NO, BSPC, INS, HOME,PGUP, NLCK,PEQL,PSLS,PAST, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, FN1, DEL, END, PGDN, P7, P8, P9, PMNS, + LCAP,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PPLS, + LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, NO, RSFT, UP, P1, P2, P3, NO, + LCTL,LGUI,LALT,NO, SPC, NO, NO, RALT,RGUI,NO, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT + ), + UNIMAP( + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, + TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, + TRNS,F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,LEFT,RGHT, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,DOWN, TRNS,TRNS, PGUP, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, HOME,PGDN,END, TRNS, TRNS,TRNS + ), +}; diff --git a/converter/ibm4704_usb/Makefile b/converter/ibm4704_usb/Makefile index 79f17ec0..c73bcfd5 100644 --- a/converter/ibm4704_usb/Makefile +++ b/converter/ibm4704_usb/Makefile @@ -8,8 +8,7 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # project specific files -SRC = keymap_common.c \ - matrix.c \ +SRC = matrix.c \ led.c \ protocol/ibm4704.c diff --git a/converter/ibm4704_usb/keymap_50key.c b/converter/ibm4704_usb/keymap_50key.c index 97294fb4..c589ce05 100644 --- a/converter/ibm4704_usb/keymap_50key.c +++ b/converter/ibm4704_usb/keymap_50key.c @@ -11,7 +11,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/ibm4704_usb/keymap_alps102key.c b/converter/ibm4704_usb/keymap_alps102key.c index f3dda718..aac8a423 100644 --- a/converter/ibm4704_usb/keymap_alps102key.c +++ b/converter/ibm4704_usb/keymap_alps102key.c @@ -45,6 +45,6 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/converter/ibm4704_usb/keymap_common.c b/converter/ibm4704_usb/keymap_common.c deleted file mode 100644 index 55a13793..00000000 --- a/converter/ibm4704_usb/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/ibm4704_usb/keymap_common.h b/converter/ibm4704_usb/keymap_common.h index 9cb23b0b..ea0ec942 100644 --- a/converter/ibm4704_usb/keymap_common.h +++ b/converter/ibm4704_usb/keymap_common.h @@ -19,7 +19,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "action.h" #include "action_macro.h" @@ -29,11 +28,6 @@ along with this program. If not, see . #include "keymap.h" -// 32*8(256) byte array which converts PS/2 code into USB code -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* 107-key */ #define KEYMAP( \ K46,K64, K00,K18,K19,K1A,K10,K11,K12,K08,K09,K0A,K0F,K1F,K0D,K0C,K0E, K6A,K6B,K6C, K47,K48,K49,K4A, \ diff --git a/converter/ibm4704_usb/keymap_hasu.c b/converter/ibm4704_usb/keymap_hasu.c index 14c17117..e235ce80 100644 --- a/converter/ibm4704_usb/keymap_hasu.c +++ b/converter/ibm4704_usb/keymap_hasu.c @@ -60,7 +60,7 @@ enum macro_id { ALT_TAB, }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_LAYER_TAP_KEY(2, KC_SCLN), [2] = ACTION_LAYER_TAP_KEY(3, KC_SLASH), diff --git a/converter/ibm4704_usb/keymap_plain.c b/converter/ibm4704_usb/keymap_plain.c index 4aed684e..9e78b021 100644 --- a/converter/ibm4704_usb/keymap_plain.c +++ b/converter/ibm4704_usb/keymap_plain.c @@ -45,6 +45,6 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/converter/m0110_usb/Makefile b/converter/m0110_usb/Makefile index e8364563..5007824d 100644 --- a/converter/m0110_usb/Makefile +++ b/converter/m0110_usb/Makefile @@ -10,7 +10,6 @@ TARGET_DIR = . # keyboard dependent files SRC = matrix.c \ led.c \ - keymap_common.c \ m0110.c # To use own keymap file run make like: make keymap=hasu diff --git a/converter/m0110_usb/Makefile.teensy b/converter/m0110_usb/Makefile.teensy index 394b6605..d08c3f44 100644 --- a/converter/m0110_usb/Makefile.teensy +++ b/converter/m0110_usb/Makefile.teensy @@ -10,7 +10,6 @@ TARGET_DIR = . # keyboard dependent files SRC = matrix.c \ led.c \ - keymap_common.c \ m0110.c # To use own keymap file run make like: make keymap=hasu diff --git a/converter/m0110_usb/Makefile.tmk_rev1 b/converter/m0110_usb/Makefile.tmk_rev1 index f36fcc4b..cf10c788 100644 --- a/converter/m0110_usb/Makefile.tmk_rev1 +++ b/converter/m0110_usb/Makefile.tmk_rev1 @@ -10,7 +10,6 @@ TARGET_DIR = . # keyboard dependent files SRC = matrix.c \ led.c \ - keymap_common.c \ m0110.c # To use own keymap file run make like: make keymap=hasu diff --git a/converter/m0110_usb/Makefile.tmk_rev2 b/converter/m0110_usb/Makefile.tmk_rev2 index e8364563..5007824d 100644 --- a/converter/m0110_usb/Makefile.tmk_rev2 +++ b/converter/m0110_usb/Makefile.tmk_rev2 @@ -10,7 +10,6 @@ TARGET_DIR = . # keyboard dependent files SRC = matrix.c \ led.c \ - keymap_common.c \ m0110.c # To use own keymap file run make like: make keymap=hasu diff --git a/converter/m0110_usb/keymap_common.c b/converter/m0110_usb/keymap_common.c deleted file mode 100644 index 4ac2d717..00000000 --- a/converter/m0110_usb/keymap_common.c +++ /dev/null @@ -1,37 +0,0 @@ -/* -Copyright 2011,2012,2014 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include -#include -#include "action.h" -#include "keycode.h" -#include "keymap.h" -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn index to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - action_t action; - action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); - return action; -} diff --git a/converter/m0110_usb/keymap_common.h b/converter/m0110_usb/keymap_common.h index 925556d9..4f7e88fb 100644 --- a/converter/m0110_usb/keymap_common.h +++ b/converter/m0110_usb/keymap_common.h @@ -15,15 +15,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include -#include #include "keycode.h" #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* Common layout for M0110 and M0110A * This keymap works with both keyboards. As you can see, the M0110A is * a superset of M0110 keyboard, only one exception is 'Enter'(34) of M0110 diff --git a/converter/m0110_usb/keymap_default.c b/converter/m0110_usb/keymap_default.c index 0f9b8d27..bfe8727d 100644 --- a/converter/m0110_usb/keymap_default.c +++ b/converter/m0110_usb/keymap_default.c @@ -98,9 +98,9 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * Fn action definition */ #ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { #else -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { #endif [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_LAYER_MOMENTARY(2), diff --git a/converter/m0110_usb/keymap_hasu.c b/converter/m0110_usb/keymap_hasu.c index 11f1a4f3..3a6a308d 100644 --- a/converter/m0110_usb/keymap_hasu.c +++ b/converter/m0110_usb/keymap_hasu.c @@ -79,7 +79,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * Fn action definition */ -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), [2] = ACTION_LAYER_TAP_KEY(3, KC_SPACE), diff --git a/converter/m0110_usb/keymap_intl.c b/converter/m0110_usb/keymap_intl.c index 6cc251a2..547bebca 100644 --- a/converter/m0110_usb/keymap_intl.c +++ b/converter/m0110_usb/keymap_intl.c @@ -68,6 +68,6 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { /* * Fn action definition */ -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/converter/m0110_usb/keymap_spacefn.c b/converter/m0110_usb/keymap_spacefn.c index 5017861a..d941ea8f 100644 --- a/converter/m0110_usb/keymap_spacefn.c +++ b/converter/m0110_usb/keymap_spacefn.c @@ -65,7 +65,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * Fn action definition */ -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde }; diff --git a/converter/news_usb/keymap.c b/converter/news_usb/keymap.c index 058f2914..5e6c2b5d 100644 --- a/converter/news_usb/keymap.c +++ b/converter/news_usb/keymap.c @@ -17,7 +17,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "util.h" #include "keymap.h" @@ -56,7 +55,7 @@ along with this program. If not, see . // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. -static const uint8_t PROGMEM fn_layer[] = { +const uint8_t PROGMEM fn_layer[] = { 0, // Fn0 0, // Fn1 0, // Fn2 @@ -69,7 +68,7 @@ static const uint8_t PROGMEM fn_layer[] = { // Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. // See layer.c for details. -static const uint8_t PROGMEM fn_keycode[] = { +const uint8_t PROGMEM fn_keycode[] = { KC_NO, // Fn0 KC_NO, // Fn1 KC_NO, // Fn2 @@ -81,7 +80,7 @@ static const uint8_t PROGMEM fn_keycode[] = { }; -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* 0: default * ,---. ,------------------------, ,------------------------. ,---------. * |Pow| | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10| | F11| F12| ,-----------. @@ -107,19 +106,3 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LALT,CAPS,LALT, SPC, ERAS, RALT,RGUI,RCTL, PGDN, TAB, LEFT,DOWN,RGHT ), }; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/next_usb/keymap.c b/converter/next_usb/keymap.c index 0041df54..90700da5 100644 --- a/converter/next_usb/keymap.c +++ b/converter/next_usb/keymap.c @@ -50,7 +50,6 @@ POSSIBILITY OF SUCH DAMAGE. #include #include -#include #include "keycode.h" #include "print.h" #include "debug.h" @@ -59,7 +58,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "keycode.h" // 32*8(256) byte array which converts PS/2 code into USB code -static const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { ACTION_LAYER_MOMENTARY(1), // FN0 - left command key ACTION_LAYER_MOMENTARY(1), // FN1 - right command key ACTION_KEY(KC_BSLS), // FN2 - number pad slash & backslash @@ -116,7 +115,7 @@ static const uint16_t PROGMEM fn_actions[] = { } -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0: default * ,-----------------------------------------------------------. ,-----------. ,---------------. @@ -163,15 +162,3 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ) }; - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/pc98_usb/keymap.c b/converter/pc98_usb/keymap.c index 8922ea7b..e56a72f1 100644 --- a/converter/pc98_usb/keymap.c +++ b/converter/pc98_usb/keymap.c @@ -17,7 +17,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "action.h" #include "action_macro.h" @@ -72,7 +71,7 @@ along with this program. If not, see . -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* ,---------------------------------------------------------------. | 60| 61| 62| 63| 64| 65| 66| 67| 68| 69| 6A| 6B| 36| 37| 3F| 3E| @@ -114,7 +113,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LGUI, LALT, LCTL, LSFT, SPC, SPC, RALT ), }; -static const uint8_t PROGMEM overlays[][MATRIX_ROWS][MATRIX_COLS] = {}; /* * Macro definition @@ -163,7 +161,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) /* * Fn actions */ -static const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { ACTION_LAYER_TAP_TOGGLE(0), // FN0 ACTION_LAYER_TAP_KEY(1, KC_SLASH), // FN1 ACTION_LAYER_TAP_KEY(2, KC_SCLN), // FN2 @@ -172,37 +170,3 @@ static const uint16_t PROGMEM fn_actions[] = { ACTION_MACRO(RBRACKET), // FN5 ACTION_MACRO(DUMMY), // FN6 }; - - - - - - -/* - * No need to edit. - */ -#define KEYMAPS_SIZE (sizeof(keymaps) / sizeof(keymaps[0])) -#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0])) - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - if (layer < KEYMAPS_SIZE) { - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); - } else { - // fall back to layer 0 - return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]); - } -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - action_t action; - if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) { - action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); - } else { - action.code = ACTION_NO; - } - return action; -} diff --git a/converter/ps2_usb/Makefile b/converter/ps2_usb/Makefile index 51b22256..dd034264 100644 --- a/converter/ps2_usb/Makefile +++ b/converter/ps2_usb/Makefile @@ -11,8 +11,7 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # project specific files -SRC = keymap_common.c \ - matrix.c \ +SRC = matrix.c \ led.c ifdef KEYMAP diff --git a/converter/ps2_usb/Makefile.mbed b/converter/ps2_usb/Makefile.mbed index bbd9bd45..9ca9f5fa 100644 --- a/converter/ps2_usb/Makefile.mbed +++ b/converter/ps2_usb/Makefile.mbed @@ -10,7 +10,6 @@ OBJDIR = ./build OBJECTS = \ $(OBJDIR)/protocol/ps2_busywait.o \ $(OBJDIR)/protocol/ps2_io_mbed.o \ - $(OBJDIR)/./keymap_common.o \ $(OBJDIR)/./matrix.o \ $(OBJDIR)/./led.o \ $(OBJDIR)/./main.o diff --git a/converter/ps2_usb/Makefile.pjrc b/converter/ps2_usb/Makefile.pjrc index 64319aca..88ee387d 100644 --- a/converter/ps2_usb/Makefile.pjrc +++ b/converter/ps2_usb/Makefile.pjrc @@ -8,8 +8,7 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # keyboard dependent files -SRC = keymap_common.c \ - matrix.c \ +SRC = matrix.c \ led.c ifdef KEYMAP diff --git a/converter/ps2_usb/Makefile.tmk_rev1 b/converter/ps2_usb/Makefile.tmk_rev1 index 6aaef499..644845f9 100644 --- a/converter/ps2_usb/Makefile.tmk_rev1 +++ b/converter/ps2_usb/Makefile.tmk_rev1 @@ -12,8 +12,7 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # project specific files -SRC = keymap_common.c \ - matrix.c \ +SRC = matrix.c \ led.c ifdef KEYMAP diff --git a/converter/ps2_usb/Makefile.tmk_rev2 b/converter/ps2_usb/Makefile.tmk_rev2 index 5049a227..83243280 100644 --- a/converter/ps2_usb/Makefile.tmk_rev2 +++ b/converter/ps2_usb/Makefile.tmk_rev2 @@ -12,8 +12,7 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # project specific files -SRC = keymap_common.c \ - matrix.c \ +SRC = matrix.c \ led.c ifdef KEYMAP diff --git a/converter/ps2_usb/Makefile.vusb b/converter/ps2_usb/Makefile.vusb index 1f2c209a..79c11639 100644 --- a/converter/ps2_usb/Makefile.vusb +++ b/converter/ps2_usb/Makefile.vusb @@ -8,8 +8,7 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # keyboard dependent files -SRC = keymap_common.c \ - matrix.c \ +SRC = matrix.c \ led.c ifdef KEYMAP diff --git a/converter/ps2_usb/keymap_common.c b/converter/ps2_usb/keymap_common.c deleted file mode 100644 index e344fb41..00000000 --- a/converter/ps2_usb/keymap_common.c +++ /dev/null @@ -1,31 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" -#include "progmem.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/ps2_usb/keymap_common.h b/converter/ps2_usb/keymap_common.h index d783e01d..6e612e60 100644 --- a/converter/ps2_usb/keymap_common.h +++ b/converter/ps2_usb/keymap_common.h @@ -28,11 +28,6 @@ along with this program. If not, see . #include "keymap.h" -// 32*8(256) byte array which converts PS/2 code into USB code -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* All keys */ #define KEYMAP_ALL( \ K76,K05,K06,K04,K0C,K03,K0B,K83,K0A,K01,K09,K78,K07, KFC,K7E,KFE, \ diff --git a/converter/ps2_usb/keymap_jis.c b/converter/ps2_usb/keymap_jis.c index 02585150..b430b907 100644 --- a/converter/ps2_usb/keymap_jis.c +++ b/converter/ps2_usb/keymap_jis.c @@ -30,5 +30,5 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/ps2_usb/keymap_plain.c b/converter/ps2_usb/keymap_plain.c index 51b2fddb..ecb13d7d 100644 --- a/converter/ps2_usb/keymap_plain.c +++ b/converter/ps2_usb/keymap_plain.c @@ -28,5 +28,5 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/ps2_usb/keymap_spacefn.c b/converter/ps2_usb/keymap_spacefn.c index bffd2bc6..8f087a85 100644 --- a/converter/ps2_usb/keymap_spacefn.c +++ b/converter/ps2_usb/keymap_spacefn.c @@ -54,7 +54,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde }; diff --git a/converter/sun_usb/keymap.c b/converter/sun_usb/keymap.c index 3d724a52..f94fe5c7 100644 --- a/converter/sun_usb/keymap.c +++ b/converter/sun_usb/keymap.c @@ -17,7 +17,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "util.h" #include "keymap.h" @@ -87,7 +86,7 @@ along with this program. If not, see . // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. -static const uint8_t PROGMEM fn_layer[] = { +const uint8_t PROGMEM fn_layer[] = { 2, // Fn0 3, // Fn1 4, // Fn2 @@ -100,7 +99,7 @@ static const uint8_t PROGMEM fn_layer[] = { // Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. // See layer.c for details. -static const uint8_t PROGMEM fn_keycode[] = { +const uint8_t PROGMEM fn_keycode[] = { KC_NO, // Fn0 KC_SCLN, // Fn1 KC_SLSH, // Fn2 @@ -112,7 +111,7 @@ static const uint8_t PROGMEM fn_keycode[] = { }; -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* KEYMAP( HELP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10,F11,F12, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,PWR, @@ -174,19 +173,3 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { CAPS,LALT,LGUI, BTN1, RGUI,RALT,NO, LEFT,DOWN,RGHT ), }; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/sun_usb/keymap_sun3.c b/converter/sun_usb/keymap_sun3.c index 273cd944..217aa79a 100644 --- a/converter/sun_usb/keymap_sun3.c +++ b/converter/sun_usb/keymap_sun3.c @@ -17,7 +17,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "util.h" #include "keymap.h" @@ -155,19 +154,3 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), */ }; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/terminal_usb/keymap.c b/converter/terminal_usb/keymap.c index 8ca66b5e..5a3ee6ff 100644 --- a/converter/terminal_usb/keymap.c +++ b/converter/terminal_usb/keymap.c @@ -17,7 +17,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "print.h" #include "debug.h" @@ -102,7 +101,7 @@ along with this program. If not, see . } // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. -static const uint8_t PROGMEM fn_layer[] = { +const uint8_t PROGMEM fn_layer[] = { 0, // Fn0 0, // Fn1 0, // Fn2 @@ -115,7 +114,7 @@ static const uint8_t PROGMEM fn_layer[] = { // Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer. // See layer.c for details. -static const uint8_t PROGMEM fn_keycode[] = { +const uint8_t PROGMEM fn_keycode[] = { KC_NO, // Fn0 KC_NO, // Fn1 KC_NO, // Fn2 @@ -127,7 +126,7 @@ static const uint8_t PROGMEM fn_keycode[] = { }; -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* 0: default * ,---. ,---------------. ,---------------. ,---------------. ,-----------. * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| @@ -198,19 +197,3 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), */ }; - - -uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) -{ - return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); -} - -uint8_t keymap_fn_layer(uint8_t index) -{ - return pgm_read_byte(&fn_layer[index]); -} - -uint8_t keymap_fn_keycode(uint8_t index) -{ - return pgm_read_byte(&fn_keycode[index]); -} diff --git a/converter/usb_usb/Makefile b/converter/usb_usb/Makefile index 5abb49d7..a4ac27b2 100644 --- a/converter/usb_usb/Makefile +++ b/converter/usb_usb/Makefile @@ -108,9 +108,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 #OPT_DEFS += -DNO_ACTION_LAYER #OPT_DEFS += -DNO_ACTION_MACRO -SRC = \ - keymap_common.c \ - usb_usb.cpp \ +SRC = usb_usb.cpp \ main.cpp ifdef KEYMAP diff --git a/converter/usb_usb/keymap.c b/converter/usb_usb/keymap.c index f1211147..5c9a1d1c 100644 --- a/converter/usb_usb/keymap.c +++ b/converter/usb_usb/keymap.c @@ -119,4 +119,4 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { #endif }; -const uint16_t fn_actions[] PROGMEM = {}; +const action_t fn_actions[] PROGMEM = {}; diff --git a/converter/usb_usb/keymap_common.c b/converter/usb_usb/keymap_common.c deleted file mode 100644 index 8ab5ba92..00000000 --- a/converter/usb_usb/keymap_common.c +++ /dev/null @@ -1,31 +0,0 @@ -/* -Copyright 2014 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" -#include "progmem.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/usb_usb/keymap_common.h b/converter/usb_usb/keymap_common.h index ee1c7c4d..3284264f 100644 --- a/converter/usb_usb/keymap_common.h +++ b/converter/usb_usb/keymap_common.h @@ -28,10 +28,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* ,---------------. ,---------------. ,---------------. * |F13|F14|F15|F16| |F17|F18|F19|F20| |F21|F22|F23|F24| * ,---. |---------------| |---------------| |---------------| ,-----------. ,---------------. ,-------. diff --git a/converter/usb_usb/keymap_editor.c b/converter/usb_usb/keymap_editor.c index bd63ea23..553457c9 100644 --- a/converter/usb_usb/keymap_editor.c +++ b/converter/usb_usb/keymap_editor.c @@ -52,7 +52,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] __attribute__ ((section (".key ), }; -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_LAYER_MOMENTARY(2), [2] = ACTION_LAYER_MOMENTARY(3), diff --git a/converter/usb_usb/keymap_hasu.c b/converter/usb_usb/keymap_hasu.c index de19e230..600681eb 100644 --- a/converter/usb_usb/keymap_hasu.c +++ b/converter/usb_usb/keymap_hasu.c @@ -142,9 +142,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) * Fn action definition */ #ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { #else -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { #endif [0] = ACTION_DEFAULT_LAYER_SET(0), // Default layer(not used) [1] = ACTION_LAYER_TAP_TOGGLE(1), // HHKB layer(toggle with 5 taps) diff --git a/converter/usb_usb/keymap_iso.c b/converter/usb_usb/keymap_iso.c index f22a8405..3df93f6d 100644 --- a/converter/usb_usb/keymap_iso.c +++ b/converter/usb_usb/keymap_iso.c @@ -32,5 +32,5 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { /* * Fn action definition */ -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { }; diff --git a/converter/usb_usb/keymap_jis.c b/converter/usb_usb/keymap_jis.c index d164dcec..24fdeec8 100644 --- a/converter/usb_usb/keymap_jis.c +++ b/converter/usb_usb/keymap_jis.c @@ -32,5 +32,5 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { /* * Fn action definition */ -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { }; diff --git a/converter/usb_usb/keymap_spacefn.c b/converter/usb_usb/keymap_spacefn.c index 69f8693e..96c17e15 100644 --- a/converter/usb_usb/keymap_spacefn.c +++ b/converter/usb_usb/keymap_spacefn.c @@ -58,7 +58,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde }; diff --git a/converter/x68k_usb/keymap.c b/converter/x68k_usb/keymap.c index 836752bf..4d6a1261 100644 --- a/converter/x68k_usb/keymap.c +++ b/converter/x68k_usb/keymap.c @@ -17,7 +17,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "action.h" #include "util.h" @@ -72,7 +71,7 @@ along with this program. If not, see . } -static const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { [0] = ACTION_FUNCTION(0), // toggle all LEDs }; @@ -92,7 +91,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) } -static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* X68000 Keyboard Scan codes ,---. ,---. ,-------------------, ,-------------------. ,-----------. ,---------------. | 61| | 62| | 63| 64| 65| 66| 67| | 68| 69| 6A| 6B| 6C| | 5A| 5B| 5C| | 5D| 52| 53| 54| @@ -128,16 +127,3 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LGUI,LALT,MHEN, SPC, HENK,KANA,APP, ZKHK, F14, F15, P0, PCMM,PDOT ), }; - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/xt_usb/Makefile b/converter/xt_usb/Makefile index cd8230cb..6fc29cbf 100644 --- a/converter/xt_usb/Makefile +++ b/converter/xt_usb/Makefile @@ -11,8 +11,7 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # project specific files -SRC = keymap_common.c \ - matrix.c \ +SRC = matrix.c \ led.c ifdef KEYMAP diff --git a/converter/xt_usb/keymap_common.c b/converter/xt_usb/keymap_common.c deleted file mode 100644 index e344fb41..00000000 --- a/converter/xt_usb/keymap_common.c +++ /dev/null @@ -1,31 +0,0 @@ -/* -Copyright 2011,2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" -#include "progmem.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/converter/xt_usb/keymap_common.h b/converter/xt_usb/keymap_common.h index b9de6a86..9953c938 100644 --- a/converter/xt_usb/keymap_common.h +++ b/converter/xt_usb/keymap_common.h @@ -28,10 +28,6 @@ along with this program. If not, see . #include "keymap.h" -// 32*8(256) byte array which converts PS/2 code into USB code -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - /* All keys */ #define KEYMAP_ALL( \ K00, K02,K03,K04,K05,K06,K07,K08,K09,K0A,K0B,K0C,K0D, K0E,K0F,K0G, \ diff --git a/converter/xt_usb/keymap_jis.c b/converter/xt_usb/keymap_jis.c index 02585150..b430b907 100644 --- a/converter/xt_usb/keymap_jis.c +++ b/converter/xt_usb/keymap_jis.c @@ -30,5 +30,5 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/xt_usb/keymap_plain.c b/converter/xt_usb/keymap_plain.c index 51b2fddb..ecb13d7d 100644 --- a/converter/xt_usb/keymap_plain.c +++ b/converter/xt_usb/keymap_plain.c @@ -28,5 +28,5 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { }; diff --git a/converter/xt_usb/keymap_spacefn.c b/converter/xt_usb/keymap_spacefn.c index bffd2bc6..8f087a85 100644 --- a/converter/xt_usb/keymap_spacefn.c +++ b/converter/xt_usb/keymap_spacefn.c @@ -54,7 +54,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde }; diff --git a/keyboard/alps64/Makefile b/keyboard/alps64/Makefile index c82c126b..97d23ae0 100644 --- a/keyboard/alps64/Makefile +++ b/keyboard/alps64/Makefile @@ -120,7 +120,6 @@ ifdef ACTIONMAP_ENABLE KEYMAP_FILE = actionmap else KEYMAP_FILE = keymap - SRC := keymap_common.c $(SRC) endif ifdef KEYMAP SRC := $(KEYMAP_FILE)_$(KEYMAP).c $(SRC) diff --git a/keyboard/alps64/actionmap_hasu.c b/keyboard/alps64/actionmap_hasu.c index e5aee15d..5eb43421 100644 --- a/keyboard/alps64/actionmap_hasu.c +++ b/keyboard/alps64/actionmap_hasu.c @@ -1,4 +1,3 @@ -#include #include "actionmap.h" #include "action_code.h" #include "actionmap_common.h" @@ -37,7 +36,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } -const uint16_t PROGMEM actionmaps[][MATRIX_ROWS][MATRIX_COLS] = { +const action_t PROGMEM actionmaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Default Layer * ,-----------------------------------------------------------. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \ | diff --git a/keyboard/alps64/actionmap_plain.c b/keyboard/alps64/actionmap_plain.c index 4a78b7a1..58ffbaaa 100644 --- a/keyboard/alps64/actionmap_plain.c +++ b/keyboard/alps64/actionmap_plain.c @@ -1,4 +1,3 @@ -#include #include "actionmap.h" #include "action_code.h" #include "actionmap_common.h" @@ -10,7 +9,7 @@ #define AC_LM1 ACTION_LAYER_MOMENTARY(1) // HHKB layer -const uint16_t PROGMEM actionmaps[][MATRIX_ROWS][MATRIX_COLS] = { +const action_t PROGMEM actionmaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Default Layer * ,-----------------------------------------------------------. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|BSpc | diff --git a/keyboard/alps64/keymap_common.c b/keyboard/alps64/keymap_common.c deleted file mode 100644 index fdb1769e..00000000 --- a/keyboard/alps64/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/keyboard/alps64/keymap_common.h b/keyboard/alps64/keymap_common.h index 957db579..17418783 100644 --- a/keyboard/alps64/keymap_common.h +++ b/keyboard/alps64/keymap_common.h @@ -19,7 +19,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "action.h" #include "action_macro.h" @@ -30,10 +29,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* Alps64 keymap definition macro */ #define KEYMAP( \ K36, K37, K46, K47, K56, K57, K66, K67, K76, K77, K06, K07, K17, K26, K27, \ diff --git a/keyboard/alps64/keymap_editor.c b/keyboard/alps64/keymap_editor.c index 68c629f0..7abf6feb 100644 --- a/keyboard/alps64/keymap_editor.c +++ b/keyboard/alps64/keymap_editor.c @@ -27,9 +27,9 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { }; #ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { #else -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { #endif [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_LAYER_MOMENTARY(2), diff --git a/keyboard/alps64/keymap_hasu.c b/keyboard/alps64/keymap_hasu.c index d297d72f..17e3ac6a 100644 --- a/keyboard/alps64/keymap_hasu.c +++ b/keyboard/alps64/keymap_hasu.c @@ -121,7 +121,7 @@ enum macro_id { /* * Fn action definition */ -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), // HHKB layer [1] = ACTION_LAYER_TAP_KEY(1, KC_ENTER), // HHKB layer [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* diff --git a/keyboard/alps64/keymap_plain.c b/keyboard/alps64/keymap_plain.c index 11a43d59..034b8076 100644 --- a/keyboard/alps64/keymap_plain.c +++ b/keyboard/alps64/keymap_plain.c @@ -28,6 +28,6 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), }; -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/keyboard/gh60/Makefile b/keyboard/gh60/Makefile index 083b87c3..b72019b1 100644 --- a/keyboard/gh60/Makefile +++ b/keyboard/gh60/Makefile @@ -48,8 +48,7 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # project specific files -SRC = keymap_common.c \ - matrix.c \ +SRC = matrix.c \ led.c ifdef KEYMAP diff --git a/keyboard/gh60/keymap_common.c b/keyboard/gh60/keymap_common.c deleted file mode 100644 index fdb1769e..00000000 --- a/keyboard/gh60/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/keyboard/gh60/keymap_common.h b/keyboard/gh60/keymap_common.h index 896badd7..7dbdf4b9 100644 --- a/keyboard/gh60/keymap_common.h +++ b/keyboard/gh60/keymap_common.h @@ -19,7 +19,6 @@ along with this program. If not, see . #include #include -#include #include "keycode.h" #include "action.h" #include "action_macro.h" @@ -30,10 +29,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - /* GH60 keymap definition macro * K2C, K31 and K3C are extra keys for ISO */ diff --git a/keyboard/gh60/keymap_hasu.c b/keyboard/gh60/keymap_hasu.c index e6af2858..cdeefb26 100644 --- a/keyboard/gh60/keymap_hasu.c +++ b/keyboard/gh60/keymap_hasu.c @@ -131,7 +131,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * Fn action definition */ -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(4), [1] = ACTION_LAYER_TAP_KEY(5, KC_SLASH), [2] = ACTION_LAYER_TAP_KEY(6, KC_SCLN), diff --git a/keyboard/gh60/keymap_hhkb.c b/keyboard/gh60/keymap_hhkb.c index ce1b816e..4253c385 100644 --- a/keyboard/gh60/keymap_hhkb.c +++ b/keyboard/gh60/keymap_hhkb.c @@ -47,6 +47,6 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * Fn action definition */ -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/keyboard/gh60/keymap_plain.c b/keyboard/gh60/keymap_plain.c index 3138c180..1cd52139 100644 --- a/keyboard/gh60/keymap_plain.c +++ b/keyboard/gh60/keymap_plain.c @@ -8,4 +8,4 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LSFT,NO, Z, X, C, V, B, N, M, COMM,DOT, SLSH,NO, RSFT, \ LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL), }; -const uint16_t PROGMEM fn_actions[] = {}; +const action_t PROGMEM fn_actions[] = {}; diff --git a/keyboard/gh60/keymap_poker.c b/keyboard/gh60/keymap_poker.c index 7a612ee4..5e94184f 100644 --- a/keyboard/gh60/keymap_poker.c +++ b/keyboard/gh60/keymap_poker.c @@ -90,7 +90,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS,FN6, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { /* Poker Layout */ [0] = ACTION_LAYER_MOMENTARY(6), // to Fn overlay [1] = ACTION_LAYER_TOGGLE(4), // toggle arrow overlay diff --git a/keyboard/gh60/keymap_poker_bit.c b/keyboard/gh60/keymap_poker_bit.c index b8870fdd..f6045644 100644 --- a/keyboard/gh60/keymap_poker_bit.c +++ b/keyboard/gh60/keymap_poker_bit.c @@ -40,7 +40,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, UP, \ TRNS,TRNS,TRNS, TRNS, TRNS,LEFT,DOWN,RGHT), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { /* Poker Layout */ [0] = ACTION_LAYER_BIT_XOR(1, 0b0101, ON_BOTH), // Poker Fn(with fix for Esc) [1] = ACTION_LAYER_TOGGLE(5), // Poker Arrow toggle diff --git a/keyboard/gh60/keymap_poker_set.c b/keyboard/gh60/keymap_poker_set.c index aaa31fc5..ec17605d 100644 --- a/keyboard/gh60/keymap_poker_set.c +++ b/keyboard/gh60/keymap_poker_set.c @@ -65,7 +65,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * Fn action definition */ -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { /* Poker Layout */ [0] = ACTION_LAYER_SET(4, ON_PRESS), // FN0 move to Fn'd when press [1] = ACTION_LAYER_SET(5, ON_PRESS), // FN1 move to Fn'd arrow when press diff --git a/keyboard/gh60/keymap_spacefn.c b/keyboard/gh60/keymap_spacefn.c index 8077dcee..8724b56d 100644 --- a/keyboard/gh60/keymap_spacefn.c +++ b/keyboard/gh60/keymap_spacefn.c @@ -49,7 +49,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * Fn action definition */ -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde }; diff --git a/keyboard/hhkb/Makefile b/keyboard/hhkb/Makefile index 5a179bd2..1146d5ec 100644 --- a/keyboard/hhkb/Makefile +++ b/keyboard/hhkb/Makefile @@ -49,8 +49,7 @@ TARGET_DIR = . # List C source files here. (C dependencies are automatically generated.) -SRC += keymap_common.c \ - matrix.c \ +SRC += matrix.c \ led.c CONFIG_H = config.h @@ -119,6 +118,9 @@ COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # USB Nkey Rollover #KEYMAP_SECTION_ENABLE = yes # fixed address keymap for keymap editor #HHKB_JP = yes # HHKB JP support +#UNIMAP_ENABLE = yes +#ACTIONMAP_ENABLE = yes # Use 16bit actionmap instead of 8bit keymap +#KEYMAP_SECTION_ENABLE = yes # fixed address keymap for keymap editor #OPT_DEFS += -DNO_ACTION_TAPPING #OPT_DEFS += -DNO_ACTION_LAYER @@ -128,13 +130,22 @@ NKRO_ENABLE = yes # USB Nkey Rollover # # Keymap file # +ifdef UNIMAP_ENABLE + KEYMAP_FILE = unimap +else + ifdef ACTIONMAP_ENABLE + KEYMAP_FILE = actionmap + else + KEYMAP_FILE = keymap + endif +endif ifdef KEYMAP - SRC := keymap_$(KEYMAP).c $(SRC) + SRC := $(KEYMAP_FILE)_$(KEYMAP).c $(SRC) else ifdef HHKB_JP - SRC := keymap_jp.c $(SRC) + SRC := $(KEYMAP_FILE)_jp.c $(SRC) else - SRC := keymap_hhkb.c $(SRC) + SRC := $(KEYMAP_FILE)_hhkb.c $(SRC) endif endif diff --git a/keyboard/hhkb/Makefile.pjrc b/keyboard/hhkb/Makefile.pjrc index 7d0f8c3a..e2d3a570 100644 --- a/keyboard/hhkb/Makefile.pjrc +++ b/keyboard/hhkb/Makefile.pjrc @@ -13,8 +13,7 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # keyboard dependent files -SRC = keymap_common.c \ - matrix.c \ +SRC = matrix.c \ led.c ifdef KEYMAP diff --git a/keyboard/hhkb/Makefile.rn42 b/keyboard/hhkb/Makefile.rn42 index 8cb44352..aae99ee9 100644 --- a/keyboard/hhkb/Makefile.rn42 +++ b/keyboard/hhkb/Makefile.rn42 @@ -49,8 +49,7 @@ TARGET_DIR = . # List C source files here. (C dependencies are automatically generated.) -SRC += keymap_common.c \ - matrix.c \ +SRC += matrix.c \ led.c CONFIG_H = config_rn42.h diff --git a/keyboard/hhkb/Makefile.unimap.jp b/keyboard/hhkb/Makefile.unimap.jp new file mode 100644 index 00000000..3c41b25c --- /dev/null +++ b/keyboard/hhkb/Makefile.unimap.jp @@ -0,0 +1,4 @@ +HHKB_JP = yes +UNIMAP_ENABLE = yes +KEYMAP_SECTION_ENABLE = yes +include Makefile diff --git a/keyboard/hhkb/hhkb_jp_unimap.hex b/keyboard/hhkb/hhkb_jp_unimap.hex new file mode 100644 index 00000000..d0799699 --- /dev/null +++ b/keyboard/hhkb/hhkb_jp_unimap.hex @@ -0,0 +1,1336 @@ +:100000000C94E4050C942B060C942B060C942B06F4 +:100010000C942B060C942B060C942B060C942B069C +:100020000C942B060C942B060C94740D0C942B063C +:100030000C94211C0C942B060C942B060C942B0670 +:100040000C942B060C942B060C942B060C942B066C +:100050000C942B060C94C11C0C942B060C942B06B0 +:100060000C942B060C942B060C942B060C942B064C +:100070000C942B060C942B060C942B060C942B063C +:100080000C942B060C942B060C942B060C942B062C +:100090000C942B060C942B060C942B060C942B061C +:1000A0000C942B060C942B060C942B066A0E8C0ECB +:1000B0007A0F8C0E7A0FD10EF40E7A0F490F5C0F67 +:1000C0006312631290129012EB1227131F151F1563 +:1000D0003F131F153A143A14F5141F151F150B156D +:1000E0008080352B787939808080210877060780D9 +:1000F0008080201A7A1B168080801E802980808054 +:100100008080808080808080808022158019098096 +:1001100080801F147B1D0480808023172C050A809B +:100120008080260C00360E808080251876100D8089 +:100130008080241C80110B80808027127E370F80E6 +:1001400080802A804F7D2880808074305152328098 +:1001500080802D137C38338080802E2F5075348022 +:10016000253032583A20253038620A000A722F634F +:100170002030313233343536370A005B735D004B43 +:100180006579626F6172642073746172742E0A0003 +:1001900055534220636F6E666967757265642E0AF7 +:1001A000005B575D005B535D005B525D005B445D2F +:1001B000005B435D001203480048004B00420020F2 +:1001C000006D006F00640000000E0374002E006DCF +:1001D000002E006B002E0000000403090409028DAC +:1001E00000050100A032090400000103010100091B +:1001F00021110100012240000705810308000A09BE +:100200000401000103010200092111010001224D36 +:10021000000705820308000A090402000103000028 +:10022000000921110100012236000705830308009F +:100230000A09040300020300000009211101000162 +:100240002222000705840320000107050403200083 +:10025000010904040001030000000921110100014B +:10026000223900070585031000011201100100006A +:100270000008EDFEFECA04010102000105010906A5 +:10028000A101050719E029E7150025019508750169 +:10029000810205081901290595057501910295014D +:1002A0007503910105071900297715002501957837 +:1002B00075018102C00631FF0974A101097515009D +:1002C00026FF009520750881020976150026FF009B +:1002D000952075089102C005010980A101850216CB +:1002E000010026B7001A01002AB700751095018198 +:1002F00000C0050C0901A1018503160100269C021E +:100300001A01002A9C02751095018100C00501099F +:1003100002A1010901A100050919012905150025FE +:10032000019505750181029501750381010501099A +:100330003009311581257F95027508810609381528 +:1003400081257F950175088106050C0A3802158103 +:10035000257F950175088106C0C005010906A10128 +:10036000050719E029E715002501950875018102A7 +:100370009501750881010508190129059505750183 +:1003800091029501750391010507190029FF1500D8 +:1003900026FF00950675088100C00A0025303258F6 +:1003A00020006B6579626F6172645F7265706F7255 +:1003B000743A20004C45443A20253032580A0064F3 +:1003C000656C5F6B65795F6269743A2063616E2763 +:1003D000742064656C3A20253032580A00616464E8 +:1003E0005F6B65795F6269743A2063616E27742080 +:1003F0006164643A20253032580A004F6E65736894 +:100400006F743A2074696D656F75740A00646F6E5D +:10041000652E0A00626F6F746D6167696320736394 +:10042000616E3A202E2E2E2000290A002575002FFD +:10043000002575005D28002564002000256400204B +:100440000025640020002564007C0025303258001F +:100450006D6F7573656B6579205B62746E7C782057 +:1004600079207620685D287265702F61636C293A67 +:10047000205B006D6B5F776865656C5F74696D65A7 +:100480005F746F5F6D6178203D2025640A006D6B9D +:100490005F776865656C5F6D61785F7370656564D3 +:1004A000203D2025640A006D6B5F74696D655F7483 +:1004B0006F5F6D6178203D2025640A006D6B5F6D74 +:1004C00061785F7370656564203D2025640A006D66 +:1004D0006B5F696E74657276616C203D2025640ADD +:1004E000006D6B5F64656C6179203D2025640A00B6 +:1004F0006D6B5F776865656C5F74696D655F746F60 +:100500005F6D6178203D2025640A006D6B5F776820 +:1005100065656C5F6D61785F7370656564203D2013 +:1005200025640A006D6B5F74696D655F746F5F6D44 +:100530006178203D2025640A006D6B5F6D61785FF6 +:100540007370656564203D2025640A006D6B5F69EA +:100550006E74657276616C203D2025640A006D6BB7 +:100560005F64656C6179203D2025640A000A0025DE +:100570007500363A20776865656C5F74696D655FF4 +:10058000746F5F6D61783A20000A00257500353A76 +:1005900020776865656C5F6D61785F737065656411 +:1005A0003A20000A00257500343A2074696D655FB1 +:1005B000746F5F6D61783A20000A00257500333A48 +:1005C000206D61785F73706565643A20000A0025CC +:1005D0007500323A20696E74657276616C286D73AD +:1005E000293A20000A00257500313A2064656C61C3 +:1005F00079282A31306D73293A20000A092D2056B6 +:10060000616C756573202D0A004D3E004D25643EDA +:1006100020003F007365742064656661756C740A20 +:1006200000433E200077686572652064656C7461E4 +:100630003A20637572736F723D25642C207768656C +:10064000656C3D25640A53656520687474703A2FA3 +:100650002F656E2E77696B6970656469612E6F72A4 +:10066000672F77696B692F4D6F7573655F6B657960 +:10067000730A000A092D204D6F7573656B6579202B +:100680002D0A4553432F713A09717569740A313A3D +:100690000964656C6179282A31306D73290A323A10 +:1006A00009696E74657276616C286D73290A333A34 +:1006B000096D61785F73706565640A343A0974691D +:1006C0006D655F746F5F6D61780A353A09776865AB +:1006D000656C5F6D61785F73706565640A363A09B1 +:1006E000776865656C5F74696D655F746F5F6D6178 +:1006F000780A0A703A097072696E742076616C75B6 +:1007000065730A643A097365742064656661756C83 +:1007100074730A75703A092B310A646F776E3A095F +:100720002D310A706775703A092B31300A70676491 +:100730006F776E3A092D31300A0A7370656564204F +:100740003D2064656C7461202A206D61785F737050 +:10075000656564202A2028726570656174202F20E9 +:1007600074696D655F746F5F6D6178290A003F0081 +:100770004D3E2000433E20004C25640A000A092D0E +:1007800020436F6E736F6C65202D0A4553432F71A4 +:100790003A09717569740A6D3A096D6F7573656B05 +:1007A00065790A000A092D204D61676963202D0AC9 +:1007B000643A0964656275670A783A096465627526 +:1007C00067206D61747269780A6B3A0964656275B5 +:1007D00067206B6579626F6172640A6D3A096465BE +:1007E000627567206D6F7573650A763A0976657272 +:1007F00073696F6E0A733A097374617475730A636F +:100800003A09636F6E736F6C65206D6F64650A30B3 +:100810002D343A096C61796572302D3428463130B7 +:100820002D4634290A506175733A09626F6F746CF2 +:100830006F616465720A653A09656570726F6D0A69 +:100840006E3A094E4B524F0A000A002575002E6E73 +:100850006B726F3A20000A002575002E7377617065 +:100860005F6261636B736C6173685F6261636B731A +:10087000706163653A20000A002575002E73776168 +:10088000705F67726176655F6573633A20000A0086 +:100890002575002E6E6F5F6775693A20000A002586 +:1008A00075002E737761705F72616C745F7267752B +:1008B000693A20000A002575002E737761705F6C1D +:1008C000616C745F6C6775693A20000A00257500D9 +:1008D0002E636170736C6F636B5F746F5F636F6EB9 +:1008E00074726F6C3A20000A002575002E737761D0 +:1008F000705F636F6E74726F6C5F636170736C6F47 +:10090000636B3A20000A0025303258006B65796D20 +:1009100061705F636F6E6669672E7261773A20005F +:100920000A002575002E6D6F7573653A20000A0068 +:100930002575002E6B6579626F6172643A20000A3A +:10094000002575002E6D61747269783A20000A00E6 +:100950002575002E656E61626C653A20000A0025DF +:100960003032580064656275675F636F6E666967F1 +:100970002E7261773A20000A002575006465666171 +:10098000756C745F6C617965723A20003F004E4B64 +:10099000524F3A206F66660A004E4B524F3A206F14 +:1009A0006E0A0074696D65725F7265616433322826 +:1009B000293A202530346C580A006B6579626F61E2 +:1009C00072645F6E6B726F3A2025580A006B65790E +:1009D000626F6172645F69646C653A2025580A0031 +:1009E0006B6579626F6172645F70726F746F636F51 +:1009F0006C3A2025580A00686F73745F6B657962E2 +:100A00006F6172645F6C65647328293A2025580A07 +:100A1000000A092D20537461747573202D0A004754 +:100A200043433A20342E392E32204156522D4C4920 +:100A300042433A20312E382E3073766E2041565282 +:100A40005F415243483A20617672350A004F505454 +:100A5000494F4E533A204C55464120424F4F544D3A +:100A600041474943204D4F5553454B455920455823 +:100A70005452414B455920434F4E534F4C45204310 +:100A80004F4D4D414E44204E4B524F204B45594DFA +:100A900041505F53454354494F4E20343039360A54 +:100AA000004255494C443A20363233653034652093 +:100AB0002831333A35353A313420417567203236A2 +:100AC0002032303136290A005649443A20307846DF +:100AD00045454428742E6D2E6B2E29205049443AEA +:100AE000203078434146452848484B42206D6F648A +:100AF00029205645523A203078303130340A0044AB +:100B00004553433A20742E6D2E6B2E206B6579620F +:100B10006F617264206669726D7761726520666FBD +:100B2000722048484B42206D6F640A000A092D204C +:100B300056657273696F6E202D0A000A6D6F7573AA +:100B4000653A206F66660A000A6D6F7573653A2014 +:100B50006F6E0A000A6B6579626F6172643A206F8A +:100B600066660A000A6B6579626F6172643A206F8B +:100B70006E0A000A6D61747269783A206F66660ABF +:100B8000000A6D61747269783A206F6E0A000A6417 +:100B9000656275673A206F6E0A000A646562756760 +:100BA0003A206F66660A000A0A626F6F746C6F61A2 +:100BB0006465722E2E2E2000433E20006565636F13 +:100BC0006E6669673A0A000011241FBECFEFDAE0B3 +:100BD000DEBFCDBF04B603FE27C080910202909114 +:100BE0000302A0910402B09105028730904BA74008 +:100BF000B04BD1F410920202109203021092040240 +:100C00001092050214BE84B7877F84BF0FB6F89494 +:100C1000A8958091600088618093600010926000C8 +:100C20000FBEE0E0F8E3099511E0A0E0B1E0EAE2F0 +:100C3000F1E502C005900D92A833B107D9F722E083 +:100C4000A8E3B1E001C01D92A230B207E1F70E9413 +:100C50009C0A0C9493280C940000FF93EF93E0916E +:100C60003801F0913901309709F00995EF91FF9122 +:100C70000895FC018591803011F0EFDFFBCF0895DE +:100C8000FF27E0E230E247FF0CC0419597FF09C023 +:100C9000EDE26095709580959095611D711D811DA7 +:100CA000911D27FF02C0219530E350E2AA27660F6D +:100CB000771F881F991FAA1FA41710F0A41B639504 +:100CC0005A95A9F7AA3008F0A95FA05DAF93F395F4 +:100CD000611571058105910541F7ED3211F4EF932E +:100CE000F395F21718F43F93F395FBCF8F91B5DF8F +:100CF000FA95E1F70895E991F9918591803021F015 +:100D0000853219F0AADFF9CF089520E0E8945591D3 +:100D10005532C1F3503311F4689455915A3348F465 +:100D2000505390F3220F022E220F220F200D250F79 +:100D3000F4CF0EF4219589919991533619F35337D5 +:100D400029F1533559F1BC0188279927E8945C367D +:100D500021F48991999168945591543639F446EF6C +:100D60007EF077FF0DC08FEF9FEF0AC055374AE046 +:100D700039F0583540E121F0523642E009F008954B +:100D8000FF93EF937DDFEF91FF91B7CFFF93EF9349 +:100D9000FC0181918030B9F360DFFBCFFF93EF93CB +:100DA00068DFF1CFDF93CF93CDB7DEB72596A3DF12 +:100DB000CF91DF9108958FEF84B980E485B957987A +:100DC0005F9A87B1806C87B988B1806C88B92E9A98 +:100DD0002F98EAE4F1E080E18E0F11928E13FDCF9F +:100DE000EAE3F1E080E18E0F11928E13FDCF8AE4E9 +:100DF00091E090935D0180935C018AE391E0909390 +:100E00005B0180935A010895EF92FF920F931F9315 +:100E1000CF93DF9380915A0190915B0120915C0107 +:100E200030915D0130935B0120935A0190935D01F5 +:100E300080935C01C0E0D0E001E010E080E090E051 +:100E4000FC2FF770EC2FE87025B1207C2F2BAC0124 +:100E500033E0440F551F3A95E1F7242B25B928B10B +:100E60002F73EE2311F0206401C0206828B92AE115 +:100E70002A95F1F700C0A0915A01B0915B01AC0F27 +:100E8000BD1F2C9130E0082E02C0359527950A949D +:100E9000E2F720FD2F9AA5E3AA95F1F70000F6B43A +:100EA0002E98BAE1BA95F1F700C040915C015091DB +:100EB0005D01BA016C0F7D1F4F9B0BC09801082E7E +:100EC00001C0220F0A94EAF72095DB013C9123230D +:100ED00009C0DB01EC909801082E01C0220F0A9492 +:100EE000EAF72E292C9326B56F2D70E02F1518F0F8 +:100EF00026B530E004C026B530E021503F4F261B18 +:100F0000370B2630310558F0A0915A01B0915B01A2 +:100F1000AC0FBD1F2C91DA01AC0FBD1F2C93BAE1B1 +:100F2000BA95F1F700C02F982E9A20EA2A95F1F78A +:100F300001968830910509F087CFA0915C01B091AE +:100F40005D01AC0FBD1FE0915A01F0915B01EC0F08 +:100F5000FD1F9C918081981751F00E945F1C609347 +:100F60005E0170935F01809360019093610121960F +:100F7000C031D10509F062CF8091F801853021F0B0 +:100F80008091F801811111C060915E0170915F0143 +:100F900080916001909161010E94951C61317742BE +:100FA0008105910510F00E94E21B81E0DF91CF9155 +:100FB0001F910F91FF90EF90089520915C01309167 +:100FC0005D01F901E80FF11D808108950F931F93D2 +:100FD000CF93DF938CE691E00E943906C0E0D0E029 +:100FE00000E611E0E0915C01F0915D01EC0FFD1F66 +:100FF00080810E94B71B1F928F93DF93CF931F9323 +:101000000F930E94D20621960F900F900F900F9091 +:101010000F900F90C031D10529F7DF91CF911F912B +:101020000F91089508950895569A81FF02C05E9A1F +:1010300008955E9808958091750108959FB7F8947A +:10104000109264019FBF9091F801943009F057C04D +:101050009091E9009F703091EC00232F217030FDBA +:1010600020E8922B24E02093E9002091EB0020FF60 +:1010700043C02091EE0027FF3FC020916201222350 +:1010800021F02091E80025FF37C01092620126E090 +:101090003091E80035FD15C03091F801343061F52C +:1010A0003091EB0035FD28C0215021F481E0809380 +:1010B000620122C0EFE9FFE03197F1F700C00000C4 +:1010C000E7CF8093F1008091E80085FD0AC0809110 +:1010D000E80080FFFCCF8091E8008E778093E800E5 +:1010E00006C08FB7F89421E0209364018FBF9F70F2 +:1010F0009093E90080E008959F709093E9008FEF4E +:101100000895CF93DF9300D01F92CDB7DEB79C0137 +:101110008091F801843019F593E099833B832A8309 +:101120009093E9008FEF9091E800815095FD06C003 +:1011300095ED9A95F1F700008111F5CF8091E800C7 +:1011400085FF0DC040E050E063E070E0CE01019605 +:101150000E94620B8091E8008E778093E8000F90E8 +:101160000F900F90DF91CF910895CF93DF9300D030 +:101170001F92CDB7DEB72091F801243021F522E08F +:1011800029839B838A8383E08093E9008FEF90918A +:10119000E800815095FD06C095ED9A95F1F70000A5 +:1011A0008111F5CF8091E80085FF0DC040E050E04F +:1011B00063E070E0CE0101960E94620B8091E8002E +:1011C0008E778093E8000F900F900F90DF91CF9172 +:1011D00008952091F8012430F1F422E02093E900F1 +:1011E0002FEF3091E800215035FD06C035ED3A95DE +:1011F000F1F700002111F5CF2091E80025FF0BC089 +:1012000040E050E065E070E00E94620B8091E800F1 +:101210008E778093E8000895CF93DF932091F801B3 +:10122000243009F048C0EC0180910A018823E1F0E4 +:1012300080910B018823C1F085E08093E9008FEF56 +:101240009091E800815095FD06C095E19A95F1F7DF +:1012500000008111F5CF8091E80085FF2CC040E0AF +:1012600050E060E170E017C081E08093E9008FEF0B +:101270009091E800815095FD06C095ED9A95F1F7A3 +:1012800000008111F5CF8091E80085FF14C040E097 +:1012900050E068E070E0CE010E94620B8091E800AF +:1012A0008E778093E80080E1FE01A5E6B1E0019031 +:1012B0000D928A95E1F7DF91CF91089581EB91E04E +:1012C0000E9439068091F701811109C00E94F90C32 +:1012D0000E94560D8091E20084608093E2000895A0 +:1012E0008DEA91E00E9439061092F701089589EA8B +:1012F00091E00C943906209163012F5F822F62E305 +:101300000E942828992319F02093630108951092D0 +:10131000630180916401882371F18091F801843028 +:1013200041F58091E9008F702091EC00922F91702F +:1013300020FD90E8892B94E09093E9009091EB00D8 +:1013400090FF14C09091EE0097FF10C09091E800BC +:1013500095FF03C01092F100F9CF9091E80090FF43 +:1013600005C09091E8009E779093E8008F7080937D +:10137000E90010926401089542E061EC81E00E946E +:10138000730C42E061EC82E00E94730C42E061EC7D +:1013900083E00E94730C42E261EC84E00E94730CD3 +:1013A00042E161EC85E00C94730C8091FA0183308A +:1013B00009F455C030F4813071F0823009F48EC0E8 +:1013C00008958A3009F47AC08B3009F460C08930FE +:1013D00009F09CC020C08091F901813A09F096C0C3 +:1013E0008091E800877F8093E8008091FD019091D3 +:1013F000FE01892B21F460E185E691E003C060E005 +:1014000080E090E070E00E94AF0B8091E8008B7765 +:101410008093E80008958091F901813209F076C047 +:101420008091FD019091FE01009719F0049709F059 +:101430006DC08091E800877F8093E8008091E8008C +:1014400082FD05C08091F8018111F8CF5FC08091C5 +:10145000F100809375018091E8008B7753C08091F3 +:10146000F901813A09F052C08091FD019091FE018D +:10147000892B09F04BC08091E800877F8093E800BA +:101480008091E80080FFFCCF80910A0136C08091F6 +:10149000F9018132D9F58091FD019091FE01892BEE +:1014A000A9F58091E800877F8093E8000E94A80C4E +:1014B0008091FB0180930A010C9440158091F90101 +:1014C000813221F58091E800877F8093E8000E94B7 +:1014D000A80C8091FC018093760108958091F90118 +:1014E000813AA1F48091E800877F8093E8008091A1 +:1014F000E80080FFFCCF809176018093F10080911D +:10150000E8008E778093E8000C94A80C0895089565 +:101510000895089585EA91E00E9439060C94890A9D +:101520000E94E21B8091F601882329F00E940B1C87 +:1015300081110C944C0B089584B7877F84BF0FB63C +:10154000F894A89580916000886180936000109263 +:1015500060000FBE90E080E80FB6F89480936100C1 +:10156000909361000FBE0E94870A0E943F100E9464 +:10157000F90C0E94560D8091E20084608093E20095 +:101580008EE198E00E94B21B78948091F80184303B +:1015900019F00E94920FF9CF80E991E00E9439067C +:1015A0000E94411080E091E00E94AD0F8FE791E032 +:1015B0000E9439060E94880A8091F801853039F42A +:1015C0008BE791E00E9439060E94900AF5CF0E94B5 +:1015D00047100E94920FF0CF0C941F1C81EA91E0FB +:1015E0000E9439060C94EC0A292F33272330310549 +:1015F000C9F064F42130310581F02230310509F061 +:1016000043C08DE890E02DED31E042C0213231053C +:10161000F1F02232310541F137C082E190E02AE653 +:1016200032E036C099278130910541F08230910532 +:1016300041F0892B49F5E9EDF1E005C0E9ECF1E075 +:1016400002C0E5EBF1E0849190E09F0121C065309C +:10165000D8F4E62FF0E0EE0FFF1FED5DFE4F208186 +:10166000318189E090E014C0653070F470E0FB01D6 +:10167000EE0FFF1FE75EFE4F20813181FB01EC5E24 +:10168000FE4F808190E004C080E090E020E030E0F8 +:10169000FA0131832083089580E189BD82E189BD0B +:1016A00009B400FEFDCF8091D8008F7D8093D800D3 +:1016B0008091E00082608093E0008091E00081FDF5 +:1016C000FCCF0895CF92DF92EF92FF920F931F937A +:1016D000CF93DF93EC018B017A010E94C70C81113B +:1016E00035C0E114F10439F0F70180819181081BC4 +:1016F000190BC80FD91FC12CD12C0115110529F1C7 +:101700008091E80085FD18C08091E8008E77809375 +:10171000E8000E94920FE114F10449F0F701808182 +:101720009181C80ED91ED182C08285E00FC00E946F +:10173000C70C882311F30AC089918093F1000150EE +:101740001109FFEFCF1ADF0AD8CF80E0DF91CF91E8 +:101750001F910F91FF90EF90DF90CF90089520910F +:10176000FF01309100022617370748F06115710517 +:1017700039F42091E8002E772093E80001C0B901E8 +:1017800040E061157105A9F12091F801222309F4C7 +:1017900043C0253009F442C02091E80023FD40C039 +:1017A0002091E80022FD32C02091E80020FFE9CF1F +:1017B0004091F3002091F20030E0342BFC01CF0186 +:1017C0006115710559F02830310540F481918093FD +:1017D000F100615071092F5F3F4FF1CF41E0283098 +:1017E000310509F040E02091E8002E772093E800D1 +:1017F000C8CF4111C9CF0AC08091F801882361F098 +:10180000853061F08091E80083FD0AC08091E80096 +:1018100082FFF2CF80E0089582E0089583E008958A +:1018200081E008952091FF013091000226173707CB +:1018300048F06115710539F42091E8002E77209366 +:10184000E80001C0B901FC0120E06115710591F1CA +:101850008091F801882309F440C0853009F43FC025 +:101860008091E80083FD3DC08091E80082FD2FC09B +:101870008091E80080FFE9CF2091F3008091F20091 +:1018800090E0922B6115710559F08830910540F474 +:1018900024912093F1003196615071090196F2CFA5 +:1018A00021E0089709F020E08091E8008E7780938E +:1018B000E800CBCF2111CCCF0AC08091F80188235A +:1018C00061F0853061F08091E80083FD0AC080916D +:1018D000E80082FFF2CF80E0089582E0089583E07F +:1018E000089581E00895982F973058F59093E90076 +:1018F000981739F07091EC002091ED005091F000B4 +:1019000003C0242F762F50E021FF19C03091EB0047 +:101910003E7F3093EB003091ED003D7F3093ED0042 +:101920003091EB0031603093EB007093EC0020932A +:10193000ED005093F0002091EE0027FF07C09F5F5D +:10194000D3CF8F708093E90081E0089580E00895FF +:101950008091F90187FF11C08091E80082FD05C0E8 +:101960008091F8018111F8CF11C08091E8008B7748 +:101970000BC08091F801882349F08091E80080FF36 +:10198000F8CF8091E8008E778093E8000895209149 +:10199000E4003091E50095E64091EC00842F8170E1 +:1019A00040FF22C08091E80080FD1CC08091F801BA +:1019B000882391F0853091F08091EB0085FD10C077 +:1019C0004091E4005091E5004217530729F39A0132 +:1019D000915011F784E0089582E0089583E008951E +:1019E00081E0089580E008954091E80042FFDECF55 +:1019F00008950E94670D0E946F0DE0EEF0E0808177 +:101A000081608083E8EDF0E080818F77808319BC6E +:101A1000A7EDB0E08C918E7F8C9380818F7E808348 +:101A20001092F70108950F931F93CF93DF930E94B5 +:101A3000670D0E946F0DC8EDD0E088818F77888395 +:101A400088818068888388818F7D888319BC109203 +:101A5000F8011092F4011092F6011092F50100EED7 +:101A600010E0F80180818B7F80838881816088838A +:101A700042E060E080E00E94730CE1EEF0E08081E3 +:101A80008E7F8083E2EEF0E08081816080838081C0 +:101A900088608083F80180818E7F80838881806167 +:101AA0008883DF91CF911F910F910895E8EDF0E0C9 +:101AB00080818F7E8083E7EDF0E08081816080838C +:101AC00084E082BF81E08093F7010C94130DE8ED70 +:101AD000F0E080818E7F80831092E2000895109262 +:101AE000DA001092E10008951F920F920FB60F9244 +:101AF00011242F933F934F935F936F937F938F9313 +:101B00009F93AF93BF93EF93FF938091E10082FF88 +:101B10000BC08091E20082FF07C08091E1008B7FC3 +:101B20008093E1000E947B098091DA0080FF1FC052 +:101B30008091D80080FF1BC08091DA008E7F809357 +:101B4000DA008091D90080FF0DC080E189BD82E17B +:101B500089BD09B400FEFDCF81E08093F8010E94A9 +:101B60005E0905C019BC1092F8010E9470098091AD +:101B7000E10080FF19C08091E20080FF15C08091D4 +:101B8000E2008E7F8093E2008091E200806180938A +:101B9000E2008091D80080628093D80019BC85E073 +:101BA0008093F8010E948A0A8091E10084FF30C08E +:101BB0008091E20084FF2CC080E189BD82E189BD73 +:101BC00009B400FEFDCF8091D8008F7D8093D800AE +:101BD0008091E1008F7E8093E1008091E2008F7E12 +:101BE0008093E2008091E20081608093E200809126 +:101BF000F401882311F084E007C08091E30087FDA1 +:101C000002C081E001C083E08093F8010E94EE0AE7 +:101C10008091E10083FF24C08091E20083FF20C017 +:101C20008091E100877F8093E10082E08093F8015A +:101C30001092F4018091E1008E7F8093E100809109 +:101C4000E2008E7F8093E2008091E20080618093C9 +:101C5000E20042E060E080E00E94730C0E9477099D +:101C6000FF91EF91BF91AF919F918F917F916F9174 +:101C70005F914F913F912F910F900FBE0F901F904A +:101C800018951F93CF93DF93CDB7DEB7AA970FB602 +:101C9000F894DEBF0FBECDBFE9EFF1E088E08E0F14 +:101CA0009091F10091938E13FBCF0E94D509809102 +:101CB000E80083FF1FC18091F9019091FA01492F3B +:101CC00050E04A30510508F015C1FA01EA5AFF4FB9 +:101CD0000C944828803881F0823809F00BC180913B +:101CE000FD018F708093E9008091EB0085FB8827D0 +:101CF00080F91092E90006C08091F5019091F601FB +:101D0000911182609091E800977F9093E800809312 +:101D1000F1001092F100C8C0282F2D7F09F0EAC011 +:101D2000882319F0823061F0E5C08091FB01813099 +:101D300009F0E0C0933009F080E08093F6012BC0F9 +:101D40008091FB01811127C08091FD018F7009F402 +:101D5000D1C08093E9002091EB0020FF1CC093309C +:101D600021F48091EB00806214C09091EB009061AF +:101D70009093EB0021E030E0A90102C0440F551F11 +:101D80008A95E2F74093EA001092EA008091EB0016 +:101D900088608093EB001092E9008091E800877FD3 +:101DA00086C08111A7C01091FB011F778091E300CD +:101DB0008078812B8093E3008091E800877F809377 +:101DC000E8000E94A80C8091E80080FFFCCF809181 +:101DD000E30080688093E300111102C082E001C03B +:101DE00083E08093F80186C08058823008F082C07A +:101DF0008091FB019091FC018C3D53E0950779F5B2 +:101E000083E08A838AE289834FB7F894DE011396D0 +:101E100020E03EE051E2E32FF0E050935700E491E0 +:101E200020FF03C0E295EF703F5FEF708E2F90E0D0 +:101E3000EA3010F0C79601C0C0968D939D932F5F36 +:101E4000243149F74FBF8091E800877F8093E800F5 +:101E50006AE270E0CE0101960E94AF0B14C0AE01A1 +:101E60004F5F5F4F6091FD010E94F40ABC01892B16 +:101E700009F440C09091E800977F9093E800898131 +:101E80009A810E94120C8091E8008B778093E80081 +:101E900031C0803879F58091E800877F8093E80031 +:101EA0008091F4018093F1008091E8008E77809317 +:101EB000E8000E94A80C1EC081111CC09091FB017B +:101EC0009230C0F48091E800877F8093E80090937F +:101ED000F4010E94A80C8091F401811106C0809148 +:101EE000E30087FD02C081E001C084E08093F80137 +:101EF0000E94BC098091E80083FF0AC08091E8003D +:101F0000877F8093E8008091EB0080628093EB00F4 +:101F1000AA960FB6F894DEBF0FBECDBFDF91CF916A +:101F20001F910895CF938091F8018823A1F0C0916B +:101F3000E900CF709091EC00892F817090FD80E8CE +:101F4000C82B1092E9008091E80083FD0E94410EA9 +:101F5000CF70C093E900CF91089590937C01809356 +:101F60007B010895E0917B01F0917C01309721F095 +:101F70000190F081E02D099480E00895EF92FF92A6 +:101F80000F931F93CF93DF93E0917B01F0917C013E +:101F90003097B1F18C010280F381E02D0995809199 +:101FA000E30182FF2DC080FF04C082EA93E00E941B +:101FB0003906E80110E18CE9E82E83E0F82E8091E3 +:101FC000E30180FF0BC088811F928F93FF92EF92F5 +:101FD0000E94D2060F900F900F900F9011502196F3 +:101FE0001111EDCF8091E30180FF0AC08AE993E0EF +:101FF000DF91CF911F910F91FF90EF900C943906D4 +:10200000DF91CF911F910F91FF90EF900895E09194 +:102010007B01F0917C01309721F00480F581E02D67 +:10202000099408952091790130917A0182179307DC +:1020300071F090937A0180937901E0917B01F091A6 +:102040007C01309721F00680F781E02D09940895F6 +:1020500020917701309178018217930771F0909366 +:10206000780180937701E0917B01F0917C013097BA +:1020700021F00084F185E02D0994089508950C94D1 +:102080003E100E944A1C0E94DB060C94981DCF92C1 +:10209000DF92EF92FF920F931F93CF93DF9300D0C5 +:1020A00000D000D0CDB7DEB70E9404078EE7C82E5F +:1020B00081E0D82E00E010E0E02E802F0E94DD07A6 +:1020C000F60141916F01F42EF826B1F40F5F1F4F16 +:1020D0000031110589F78FEF89838A831B820E9463 +:1020E000531C8160782F9D838C8349815A816B8139 +:1020F0008D810E94061147C09091E30191FF04C0B9 +:102100008E830E94E6078E8120E030E04F2D50E064 +:10211000922FBA01022E02C0759567950A94E2F7D4 +:1021200060FF2BC02983EA8221E030E0690102C010 +:10213000CC0CDD1C9A95E2F790E08C219D21892B37 +:1021400009F420E02B830E94531C8160782F9D832B +:102150008C8349815A816B818D810E94061149814E +:102160005A816B817C818D810E94CE1BF801E258DF +:10217000FE4F8081C826C08206C02F5F3F4F2830A7 +:10218000310531F6A3CF0E94CD1B0E942221109170 +:102190007D010E94B20F181741F10E94B20F809387 +:1021A0007D019091E30192FF0EC090FF0CC01F9241 +:1021B0008F9384EB93E09F938F930E94D2060F90AE +:1021C0000F900F900F9080917D0126960FB6F89496 +:1021D000DEBF0FBECDBFDF91CF911F910F91FF905A +:1021E000EF90DF90CF900C94DF1B26960FB6F894FB +:1021F000DEBF0FBECDBFDF91CF911F910F91FF903A +:10220000EF90DF90CF9008950C941408CF93DF9354 +:10221000CDB7DEB72B970FB6F894DEBF0FBECDBF9C +:10222000942F4F83252F588769877A878B874A8514 +:102230005B85452B21F02F3F09F59F3FF9F4DE0127 +:10224000119686E0FD0111928A95E9F785E0FE017D +:10225000379601900D928A95E1F749815A816B81F9 +:102260007C818D819E810E94E3172B960FB6F89496 +:10227000DEBF0FBECDBFDF91CF9108954F8158854E +:1022800069857A858B850E94CE1BD9CFCF93882311 +:1022900009F4A4C0C82F8CEF8C0F813A48F48C2F1E +:1022A0000E94A22581119AC08C2F0E946E1A0CC028 +:1022B00080E28C0F883058F4C77081E001C0880F2D +:1022C000CA95EAF70E94191BCF910C945D1B8BE510 +:1022D0008C0F833078F4C53A29F0C63A31F083E8A0 +:1022E00090E005C081E890E002C082E890E0CF91E4 +:1022F0000C94121088E58C0F853108F06FC0C83A35 +:1023000061F1C93A69F1CA3A71F1CB3A79F1CC3A43 +:1023100081F1CD3A89F1CE3A91F1CF3A99F1C13BB1 +:10232000A1F1C03BA9F1C23BB1F1C33BB9F1C43B40 +:10233000C1F1C53BC9F1C63BD1F1C73BD9F1C83B9F +:10234000E1F1C93BE9F1CA3BF1F1CB3BF9F1CC3BFF +:1023500009F43FC080E090E03EC082EE90E03BC0D8 +:1023600089EE90E038C08AEE90E035C085EB90E0D1 +:1023700032C086EB90E02FC083EB90E02CC084EB62 +:1023800090E029C087EB90E026C08CEC90E023C061 +:102390008DEC90E020C083E891E01DC08AE891E0D8 +:1023A0001AC082E991E017C084E991E014C081E28B +:1023B00092E011C083E292E00EC084E292E00BC092 +:1023C00085E292E008C086E292E005C087E292E0F2 +:1023D00002C08AE292E0CF910C942810CF91089528 +:1023E000882329F19CEF980F913A18F40E94C11AA2 +:1023F0000DC090E2980F983058F4877091E001C0BA +:10240000990F8A95EAF7892F0E941F1B0C945D1B78 +:102410009BE5980F933020F480E090E00C9412102C +:10242000885A853120F480E090E00C9428100895BB +:10243000882321F00E94191B0C945D1B08958823AA +:1024400021F00E941F1B0C945D1B0895CF92DF9218 +:10245000EF92FF920F931F93CF93DF9300D000D0A2 +:1024600000D0CDB7DEB725E0FC01DE01119601906A +:102470000D922A95E1F7FC0140813181F28025819E +:1024800022952F7063817481672B09F4D8C23F3F76 +:1024900019F44F3F09F4D3C26C0149833A8389810F +:1024A0009A812E830E942D1A182F092F0E942C1A10 +:1024B0000E943C19E02FE295EF70F0E0E05AFF4FE8 +:1024C0002E810C944828802F807F902F9F70092F99 +:1024D000882311F00295007FFF2049F0002309F4C2 +:1024E0005FC2802F0E942C1B0E945D1B59C2812F4E +:1024F0000E94F011002309F4A2C2802F0E94321B17 +:1025000026960FB6F894DEBF0FBECDBFDF91CF91F8 +:102510001F910F91FF90EF90DF90CF900C945D1B77 +:10252000802F807F902F9F70092F803211F00295AD +:10253000007F112319F0113001F129C0FF20A9F00B +:10254000802F222349F1213039F526960FB6F894D1 +:10255000DEBF0FBECDBFDF91CF911F910F91FF90D6 +:10256000EF90DF90CF900C943C1B222319F0213088 +:1025700009F465C20E94451B2CC0FF20E9F02630FB +:1025800008F05DC20E94161B802329F022C0FF20A4 +:10259000F1F0211115C0802F26960FB6F894DEBFFA +:1025A0000FBECDBFDF91CF911F910F91FF90EF90A4 +:1025B000DF90CF900C941812253008F040C209C06B +:1025C000F601858180FFECC18F708583E4CF2111F6 +:1025D000FBC1802F69C1202F26952695237030E0FE +:1025E0002115310521F021303105C9F028C2FF2025 +:1025F00021F0812F902F937002C080E090E026960A +:102600000FB6F894DEBF0FBECDBFDF91CF911F9103 +:102610000F91FF90EF90DF90CF900C941210FF205D +:1026200021F0812F902F937002C080E090E02696D9 +:102630000FB6F894DEBF0FBECDBFDF91CF911F91D3 +:102640000F91FF90EF90DF90CF900C942810812F86 +:10265000FF2019F00E94A81F02C00E941020269699 +:102660000FB6F894DEBF0FBECDBFDF91CF911F91A3 +:102670000F91FF90EF90DF90CF900C949520802FDA +:10268000837009F078C0F110DAC1812F82958695A8 +:102690008770880F880F912F9F70C92ED12CE12C45 +:1026A000F12C082E04C0CC0CDD1CEE1CFF1C0A947F +:1026B000D2F714FF12C04FE050E060E070E004C0B9 +:1026C000440F551F661F771F8A95D2F7CB01BA01B9 +:1026D000609570958095909503C060E070E0CB01A7 +:1026E000202F269526952370422F50E04230510529 +:1026F000D1F04330510559F16C297D298E299F294C +:102700004130510541F126960FB6F894DEBF0FBE59 +:10271000CDBFDF91CF911F910F91FF90EF90DF9090 +:10272000CF900C9451196C297D298E299F292696CA +:102730000FB6F894DEBF0FBECDBFDF91CF911F91D2 +:102740000F91FF90EF90DF90CF900C9463190E944F +:102750005119C701B60126960FB6F894DEBF0FBE19 +:10276000CDBFDF91CF911F910F91FF90EF90DF9040 +:10277000CF900C943F19FF2019F0802F817001C079 +:102780008695882309F45BC1812F82958695877091 +:10279000880F880F912F9F70C92ED12CE12CF12C1E +:1027A000082E04C0CC0CDD1CEE1CFF1C0A94D2F7D2 +:1027B00014FF12C04FE050E060E070E004C0440F2E +:1027C000551F661F771F8A95D2F7CB01BA01609516 +:1027D00070958095909503C060E070E0CB01202F4C +:1027E000269526952370422F50E042305105D1F0B6 +:1027F0004330510559F16C297D298E299F2941309B +:10280000510541F126960FB6F894DEBF0FBECDBF3D +:10281000DF91CF911F910F91FF90EF90DF90CF90BC +:102820000C94081A6C297D298E299F2926960FB6AB +:10283000F894DEBF0FBECDBFDF91CF911F910F91F6 +:10284000FF90EF90DF90CF900C941A1A0E94081A14 +:10285000C701B60126960FB6F894DEBF0FBECDBFF6 +:10286000DF91CF911F910F91FF90EF90DF90CF906C +:102870000C94F619103F41F118F4103E48F48BC047 +:10288000123F09F450C0D8F1133F09F460C083C06F +:102890001F70802F8F71FF2021F00E948F19812FD0 +:1028A0007BCE0E94B019812F26960FB6F894DEBF1A +:1028B0000FBECDBFDF91CF911F910F91FF90EF9091 +:1028C000DF90CF900C941F12FF20A9F0253008F064 +:1028D000B6C0802F8F7126960FB6F894DEBF0FBE5C +:1028E000CDBFDF91CF911F910F91FF90EF90DF90BF +:1028F000CF900C94D519263008F0A1C0EACFFF2064 +:10290000A1F0802F8F7126960FB6F894DEBF0FBE10 +:10291000CDBFDF91CF911F910F91FF90EF90DF908E +:10292000CF900C948F19FF2061F3802F8F71269622 +:102930000FB6F894DEBF0FBECDBFDF91CF911F91D0 +:102940000F91FF90EF90DF90CF900C94B019FF2083 +:1029500091F0802F8F7126960FB6F894DEBF0FBED0 +:10296000CDBFDF91CF911F910F91FF90EF90DF903E +:10297000CF900C947A1926960FB6F894DEBF0FBE4E +:10298000CDBFDF91CF911F910F91FF90EF90DF901E +:10299000CF900C947519FF20A1F0222309F4B1CF38 +:1029A000812F26960FB6F894DEBF0FBECDBFDF9104 +:1029B000CF911F910F91FF90EF90DF90CF900C94EB +:1029C0004611222309F4B1CF812F26960FB6F89431 +:1029D000DEBF0FBECDBFDF91CF911F910F91FF9052 +:1029E000EF90DF90CF900C94F011402F4F70612F3B +:1029F000C6010E94421D26960FB6F894DEBF0FBE98 +:102A0000CDBFDF91CF911F910F91FF90EF90DF909D +:102A1000CF900C948718402F4F70612FC6012696D7 +:102A20000FB6F894DEBF0FBECDBFDF91CF911F91DF +:102A30000F91FF90EF90DF90CF900C94451D26965C +:102A40000FB6F894DEBF0FBECDBFDF91CF911F91BF +:102A50000F91FF90EF90DF90CF9008950E94391B67 +:102A60000E94081B0E945D1B0E94C7210E949520A6 +:102A700080E090E00E94121080E090E00C9428101A +:102A80000E94291B0C942E150E942D1A292F229585 +:102A90002F7030E02C3031054CF42A3031056CF4C5 +:102AA000225031092230310588F407C02C3031051D +:102AB00049F02F30310531F009C0803E48F0803FA9 +:102AC00029F406C093FB882780F9089580E00895D3 +:102AD00081E00895CF93DF9300D000D01F92CDB74F +:102AE000DEB70F900F900F900F900F90DF91CF9166 +:102AF0000895CF93DF9300D000D000D0CDB7DEB7DC +:102B000026960FB6F894DEBF0FBECDBFDF91CF91F2 +:102B100008951F93CF93DF93C0918E0116E08091AB +:102B20008F01C81799F0D0E01C9FF0011D9FF00D98 +:102B30001124E057FE4F408151816281738184816D +:102B400095810E9479152196C770E9CFDF91CF91C9 +:102B50001F9108954091C0015091C1016091C2013F +:102B60007091C3018091C4019091C5010C947915B5 +:102B70008091C50182958F7009F054C08091C20187 +:102B8000882309F44FC080918E01A0918F0160913C +:102B9000C0017091C1014091C3015091C401B6E0E0 +:102BA0008A1709F43FC090E041155105C1F17F3FFC +:102BB00011F46F3FA1F1B89FF001B99FF00D1124FE +:102BC000E057FE4F218172132AC02081621327C073 +:102BD0002281211124C0238134812417350710F468 +:102BE00021503109241B350B2C323140C0F4209187 +:102BF000C5012F7020612093C50126E0289FF001B8 +:102C0000299FF00D1124EB56FE4F80818F7080615B +:102C1000808380EC91E00E9426120C948915019625 +:102C20008770BECF0895CF92DF92EF92FF920F93FD +:102C30001F93CF93DF93CDB7DEB762970FB6F894AB +:102C4000DEBF0FBECDBF8C0185E0F801DE011D9611 +:102C500001900D928A95E1F7D8014C9111965C9103 +:102C6000119712966C9112971396CD90DC90149751 +:102C70003091C0017091C1018091C3019091C40154 +:102C8000009709F473C17F3F19F43F3F09F46EC107 +:102C9000E090C201EE2009F4C5C02091C501C8161C +:102CA000D90650F0F601E81BF90BCF01FF24F3948D +:102CB0008C329140C8F009C0809590958C0D9D1D77 +:102CC000FF24F3948C32914078F0F12C207F09F0AE +:102CD000C6C07C2DD98AC88A89890E946A1580EC71 +:102CE00091E00E942612B1C0822F807F09F045C07A +:102CF000751313C0341311C061110FC02F70206100 +:102D00002093C5010E94AA1580EC91E00E94261232 +:102D10008091C501F80185832EC0CD2819F15F3F50 +:102D200011F44F3FF9F0F62E61111CC080918E0115 +:102D300020918F0136E0821709F45BC090E0389F44 +:102D4000F001399FF00D1124E057FE4F71815713A8 +:102D500006C07081471303C07281711103C00196D0 +:102D60008770E9CFF62E662309F41DC18091C50155 +:102D700081608093C501F12C16C1751309C034130D +:102D800007C0611105C08091C501F8018583C8C0E5 +:102D90004D875E878D859E856A8B0E9444156A8962 +:102DA0008823E1F16623D1F12091C501822F82951C +:102DB0008F7090E0029774F08091C0019091C101F2 +:102DC00098878F831986DB86CA862C87CE01079663 +:102DD0000E94261286E0F801A0ECB1E001900D926D +:102DE0008A95E1F70E94B8150E94AA15FF24F39472 +:102DF000DAC04D875E878D859E850E942D1A292F0A +:102E000022952F7030E0223031050CF0BFC09F704A +:102E100009F0B9C0805E883008F4C5C0C8010E94BE +:102E20002612E4CFC816D90608F453C0F601E81BF1 +:102E3000F90BCF018C32914008F453C0F12C7C2D5A +:102E4000D98AC88A89890E946A15E0ECF1E086E097 +:102E5000DF011D928A95E9F70E94AA15A4C0751397 +:102E600014C0341312C0611110C08091C501F80163 +:102E70008583C8010E94261286E0E0ECF1E0DF01C4 +:102E80001D928A95E9F7FE2C8EC04D875E878D8551 +:102E90009E856A8B0E9444156A89882309F4BECFF7 +:102EA000662309F4BBCF2091C501822F82958F70D4 +:102EB00090E002970CF48ECF8091C0019091C101F7 +:102EC0009A8389831B82DD82CC822E83CE01019678 +:102ED0007FCF809590958C0D9D1D8C32914008F090 +:102EE000ADCFF62E662309F499CF75132EC0341397 +:102EF0002CC02091C50120FD1FC0822F82958F70AC +:102F0000D9F0D80115962C9315978F3049F08F5F23 +:102F1000982F9295907F822F8F70892B15968C9386 +:102F2000C8010E94261286E0F801A0ECB1E00190F1 +:102F30000D928A95E1F790CF86E0F801A0ECB1E020 +:102F400001900D928A95E1F72EC04D875E878D85A1 +:102F50009E850E94441581113DCF8091C5018160FD +:102F60008093C501C8010E9426121DC0662309F482 +:102F700055CF4D875E878D859E850E944415882399 +:102F800009F44CCF27CF811145CF0DC02430310536 +:102F90000CF044CF9F7009F43DCFD80115969C9159 +:102FA000907F09F037CF8F2D62960FB6F894DEBF71 +:102FB0000FBECDBFDF91CF911F910F91FF90EF908A +:102FC000DF90CF9008951F93CF93DF93CDB7DEB7F7 +:102FD0002C970FB6F894DEBF0FBECDBF4F83588736 +:102FE00069877A878B879C87CE0107960E94131684 +:102FF000882369F08F8198852A853B85232BF1F101 +:103000009F3F09F063C08F3F09F060C037C086E082 +:10301000FE013796DE01119601900D928A95E1F737 +:103020006F817885EA85FB85309741F17F3F11F408 +:103030006F3F21F120918F0130E0C9010196877027 +:10304000992740918E0150E08417950709F447C0F5 +:1030500069837A83FD83EC8396E0929FD001939FEE +:10306000B00D1124A057BE4FFE01319601900D9274 +:103070009A95E1F780938F010E94891516E080915F +:103080008E0190918F018917C1F1189FC001112401 +:1030900080579E4F0E941316882379F1E0918E018C +:1030A0001E9FF0011124E057FE4F40815181628143 +:1030B0007381848195810E94791580918E0190E0C1 +:1030C00001968770992780938E01D9CF4F815885BB +:1030D00069857A858B859C850E947915CFCF0E9462 +:1030E000401510928F0110928E01E0ECF1E086E025 +:1030F000DF011D928A95E9F7C1CF2C960FB6F8949F +:10310000DEBF0FBECDBFDF91CF911F910895DF923B +:10311000EF92FF920F931F93CF93DF93FC01892BC4 +:1031200009F48AC0E12CF12CDD24D394EF0121961F +:103130008491853709F461C058F4843708F04EC093 +:10314000843008F06AC08130D1F0823071F174C0EF +:10315000883709F45DC050F4863709F455C08737C5 +:1031600009F06AC08E2D0E94261B54C09CE7980F60 +:10317000903708F061C08F770E94F01150C08F0126 +:103180000E5F1F4FFE01849190E2980F983050F42B +:103190008770FD2D01C0FF0F8A95EAF78F2F0E94DF +:1031A0002C1B14C00E94461113C08F010E5F1F4FCD +:1031B000FE01C49180E28C0F883060F4C7708D2DC1 +:1031C00001C0880FCA95EAF70E94321B0E945D1B5E +:1031D000E80125C08C2F0E94F011FACF9F012E5FCD +:1031E0003F4FFE01C491CC2369F08FE99FE0019726 +:1031F000F1F700C00000C150F6CF9F012E5F3F4F96 +:10320000FE01F490E9010BC00E94161BE82E07C0D6 +:103210000E94291B0E945D1B02C00E9446118F2D37 +:10322000882341F0EFE9FFE03197F1F700C000009B +:103230008150F6CFFE017ACFDF91CF911F910F9190 +:10324000FF90EF90DF9008956093CA017093CB01D7 +:103250008093CC019093CD010E94DD1B0C942E1520 +:103260006093C6017093C7018093C8019093C90110 +:103270000E94DE1B0C942E1508950C9424190F93B4 +:103280001F930091CA011091CB012091CC01309184 +:10329000CD01602B712B822B932B1F910F910C94DE +:1032A00024190F931F930091CA011091CB01209113 +:1032B000CC013091CD0160237123822393231F9190 +:1032C0000F910C9424190F931F930091CA01109130 +:1032D000CB012091CC013091CD016027712782274D +:1032E00093271F910F910C94241960E070E0CB019B +:1032F0000C9430190F931F9341E050E060E070E0B0 +:103300008A019B0104C0000F111F221F331F8A95E1 +:10331000D2F7C901B8011F910F910C9430190F9386 +:103320001F9341E050E060E070E004C0440F551F7F +:10333000661F771F8A95D2F78091C6019091C701C9 +:10334000A091C801B091C9018A019B01082B192BDA +:103350002A2B3B2BC901B8011F910F910C943019F6 +:103360000F931F9341E050E060E070E004C0440F11 +:10337000551F661F771F8A95D2F740955095609527 +:1033800070958091C6019091C701A091C801B0913C +:10339000C9018A019B01082319232A233B23C90160 +:1033A000B8011F910F910C9430190F931F9341E0B6 +:1033B00050E060E070E004C0440F551F661F771FA7 +:1033C0008A95D2F78091C6019091C701A091C8015A +:1033D000B091C9018A019B01082719272A273B2799 +:1033E000C901B8011F910F910C9430190F931F93CD +:1033F0000091C6011091C7012091C8013091C90107 +:10340000602B712B822B932B1F910F910C943019F1 +:103410000F931F930091C6011091C7012091C8011D +:103420003091C90160237123822393231F910F914F +:103430000C9430190F931F930091C6011091C7018E +:103440002091C8013091C9016027712782279327F5 +:103450001F910F910C9430190895CF92DF92EF9243 +:10346000FF920F931F93CF93DF938C01C090CA01FB +:10347000D090CB01E090CC01F090CD014091C601FD +:103480005091C7016091C8017091C901C42AD52A21 +:10349000E62AF72ACFE1D0E0D701C6010C2E04C0FE +:1034A000B695A795979587950A94D2F780FF07C0A0 +:1034B000B8018C2F0E94171D8130910531F421979E +:1034C00058F7B80180E00E94171DDF91CF911F913E +:1034D0000F91FF90EF90DF90CF90089590910A01A7 +:1034E000992321F090910B01911109C020910C01B9 +:1034F00030910D01F90132969FEF40E030C0982FD6 +:103500009695969596959F30A0F4E0910C01F091D8 +:103510000D01E90FF11D877021E030E0A90102C023 +:10352000440F551F8A95E2F7CA019181892B818347 +:1035300008959091E30190FF23C01F928F938DED2A +:1035400093E09F938F930E94D2060F900F900F905D +:103550000F9008959F3F39F04F5F4E3041F05191E9 +:103560005813F8CF0DC05111F7CF942FF5CF9F3FCF +:1035700039F0F901E90FF11D97FDFA95828308955D +:10358000089590910A01992321F090910B019111D6 +:1035900009C020910C0130910D01F9013296205F94 +:1035A0003F4F30C0982F9695969596959F30A8F4EA +:1035B000E0910C01F0910D01E90FF11D877021E000 +:1035C00030E0A90102C0440F551F8A95E2F7CA01F5 +:1035D000809591818923818308959091E30190FFE3 +:1035E00016C01F928F938FEB93E09F938F930E944F +:1035F000D2060F900F900F900F9008953196E2171A +:10360000F30729F090819813F9CF1082F7CF08952E +:1036100081E090E0E0910C01F0910D01E80FF91FBD +:103620001082019680319105A9F708958091E201F9 +:1036300008959091E201892B8093E201089580958D +:103640009091E20189238093E20108958093E20141 +:1036500008951092E20108959091E101892B8093E1 +:10366000E101089580959091E10189238093E10122 +:1036700008951092E10108958093D0010E94531C97 +:103680009093CF018093CE0108951092D0011092B3 +:10369000CF011092CE01089580910C0190910D01FF +:1036A000FC0131969C01205F3F4F80E09191911188 +:1036B0008F5FE217F307D1F70895E0910C01F091C5 +:1036C0000D018091E2018083E0910C01F0910D01E8 +:1036D00090818091E101892B80838091D0018823A2 +:1036E000D9F10E94531C2091CE013091CF01821755 +:1036F000930748F00E94531C2091CE013091CF01D6 +:10370000821B930B0AC00E94531C2091CE01309162 +:10371000CF0120953095820F931F8C32914070F02D +:103720008091E30180FF08C08BEF93E09F938F931C +:103730000E94D2060F900F900E94451BE0910C0151 +:10374000F0910D0190818091D001892B80830E949E +:103750004C1B81110E94451B80910C0190910D0121 +:103760000C94BE0F9093390180933801089582958F +:10377000982F9C7C392F36953695282F237344E05B +:10378000249FC0011124932F982B292F2A7A269544 +:10379000892F8575880F822B08950895CF93DF9325 +:1037A00000D000D01F92CDB7DEB70F900F900F90D2 +:1037B0000F900F90DF91CF910895089508950C9484 +:1037C000041108958091F801843021F11092E401F0 +:1037D00020E488E190E00FB6F894A895809360000B +:1037E0000FBE2093600083B7817F846083BF83B75F +:1037F000816083BF7894889583B78E7F83BF0FB62F +:10380000F894A89580916000886180936000109280 +:1038100060000FBE0895CF930E9412080E94040713 +:103820000E941308C0E08C2F0E94DD07811104C0A4 +:10383000CF5FC031C1F701C081E0CF9108950C94F2 +:1038400040151F920F920FB60F9211248F939F93E2 +:10385000AF93BF938091E401811113C08091E50182 +:103860009091E601A091E701B091E8014196A11D78 +:10387000B11D8093E5019093E601A093E701B09319 +:10388000E801BF91AF919F918F910F900FBE0F9064 +:103890001F90189582E084BD93E095BD9AEF97BD87 +:1038A00080936E0008952FB7F8948091E501909170 +:1038B000E601A091E701B091E8012FBF08952FB76D +:1038C000F8946091E5017091E6018091E701909193 +:1038D000E8012FBF0895CF92DF92EF92FF920F93EE +:1038E0001F932FB7F8944091E5015091E601609144 +:1038F000E7017091E8012FBF6A017B01EE24FF24EC +:103900008C0120E030E0C016D106E206F30610F488 +:10391000415051099A01281B390BC9011F910F9180 +:10392000FF90EF90DF90CF900895CF92DF92EF92CB +:10393000FF920F931F932FB7F894C090E501D0909A +:10394000E601E090E701F090E8012FBF97018601C2 +:10395000061B170B280B390BC616D706E806F90607 +:1039600018F0C901B80106C0C901B8016150710958 +:10397000810991091F910F91FF90EF90DF90CF90F7 +:1039800008951F920F920FB60F9211248F939F9359 +:10399000AF93BF938091E5019091E601A091E7017B +:1039A000B091E8010196A11DB11D8093E5019093AE +:1039B000E601A093E701B093E801BF91AF919F9119 +:1039C0008F910F900FBE0F901F9018950E94F90CC9 +:1039D000F8942FEF87EA91E6215080409040E1F77C +:1039E00000C0000087E090EBDC018093020290931E +:1039F0000302A0930402B09305029CE088E10FB695 +:103A0000F894A895809360000FBE90936000FFCF5C +:103A100028E0929FF0011124E80FF11DE052FF4FC2 +:103A20008491982F90778F7092959F700895CF937F +:103A3000C82FCB010E94081D292F30E0E82FF0E0AD +:103A4000A90164E0440F551F6A95E1F74E2B5F2BE7 +:103A50004038510519F480E090E012C088E0C89F1A +:103A6000200D311D112484E0220F331F8A95E1F7C8 +:103A7000E20FF31FEE0FFF1FE050F849859194917C +:103A8000CF91089580E090E008950895CF92DF925D +:103A9000EF92FF920F931F93CF936C01C0E08C2F96 +:103AA0000E94DD0700E010E0E82EF12CC701002E97 +:103AB00002C0959587950A94E2F780FF16C0602FA3 +:103AC0007C2F80E00E94171D9C018C159D0559F0EC +:103AD000832F807E932F907C11F0803A31F430E078 +:103AE0002C153D0511F481E009C00F5F1F4F083010 +:103AF0001105E1F6CF5FC03191F680E0CF911F91C3 +:103B00000F91FF90EF90DF90CF900895CF93DF93C8 +:103B1000EC018CE290E00E94461D882329F0CE0142 +:103B2000DF91CF910C94461D80E0DF91CF910895F5 +:103B3000CF930E94001F811102C00E94E61E84E103 +:103B400094E00E943906C5E6C15049F00E9404077E +:103B50008FE39CE90197F1F700C00000F5CF8DE0FD +:103B600094E00E94390689E290E00E94861D81114E +:103B70002BC18AE290E00E94861D81110E94E61E00 +:103B800085E090E00E94861D81110E94E61C0E9443 +:103B9000E11B0E940B1F8093E30187E090E00E94ED +:103BA000861D8823C1F18BE190E00E94861D882349 +:103BB00051F08091E30181FB222720F991E09227C7 +:103BC00090FB81F90FC08EE090E00E94861D882353 +:103BD00061F08091E30182FB222720F991E0922796 +:103BE00090FB82F98093E30116C080E190E00E948F +:103BF000861D9091E301882341F093FB222720F951 +:103C000081E0822780FB93F904C0892F809580FB97 +:103C100090F99093E3018091E3010E940F1F0E94AD +:103C20001D1F8093010280EE90E00E94861D882374 +:103C300041F080910102982F909590FB80F980933C +:103C4000010289E390E00E94861D882359F080914B +:103C5000010281FB222720F991E0922790FB81F954 +:103C60008093010282EE90E00E94861D882359F025 +:103C70008091010282FB222720F991E0922790FB9C +:103C800082F98093010286EE90E00E94861D8823CF +:103C900059F08091010283FB222720F991E09227BD +:103CA00090FB83F98093010283EE90E00E94861DD1 +:103CB000882359F08091010284FB222720F991E0AA +:103CC000922790FB84F98093010285E390E00E94A3 +:103CD000861D882359F08091010285FB222720F957 +:103CE00091E0922790FB85F98093010281E390E0B7 +:103CF0000E94861D882359F08091010286FB2227AD +:103D000020F991E0922790FB86F98093010281E1EE +:103D100090E00E94861D882359F08091010287FB64 +:103D2000222720F991E0922790FB87F980930102E6 +:103D3000809101020E94211F8091010287FB882748 +:103D400080F980930B0187E290E00E94861DC82FC6 +:103D50008EE190E00E94861D8111C2608FE190E0AB +:103D60000E94861D8111C46080E290E00E94861D41 +:103D70008111C86081E290E00E94861D8111C061BE +:103D800082E290E00E94861D8111C06283E290E091 +:103D90000E94861D8111C06484E290E00E94861D0D +:103DA000882311F0C06802C0CC2329F08C2F0E9418 +:103DB000181F6C2F03C00E94141F682F70E080E052 +:103DC00090E0CF910C943D19CF9108956DEE7EEF68 +:103DD00080E090E00E947E2860E082E090E00E9417 +:103DE000702860E083E090E00E94702860E084E04A +:103DF00090E00E94702860E085E090E00C947028CC +:103E000080E090E00E946A2821E08D3E9E4F09F0FC +:103E100020E0822F089582E090E00C946228682FC1 +:103E200082E090E00C94702883E090E00C9462288B +:103E3000682F83E090E00C94702884E090E00C946C +:103E40006228682F84E090E00C9470288091EB0148 +:103E500080FF0BC06091110185E0689FB0011124C3 +:103E600075956795759567952BC081FF09C0609121 +:103E7000110185E0689FB00111247595679520C0F8 +:103E800082FF07C06091110185E0689FB001112495 +:103E900017C09091EC019923D1F060911001961711 +:103EA00088F72091110185E0289F90011124929FAD +:103EB000A001939F500D112470E0CA010E94342884 +:103EC0006038710540F46115710539F002C065E094 +:103ED00070E0862F08958FE7089581E0089580911E +:103EE000EB0180FF08C060910F0170E07595679548 +:103EF0007595679521C081FF06C060910F0170E044 +:103F00007595679519C082FF04C060910F0170E03C +:103F100010C09091EC019923C1F060910E019617A9 +:103F2000A0F780910F01899FC001112470E00E94C9 +:103F300034286038710528F46115710521F0862F49 +:103F400008958FE7089581E0089561E070E0F4CF6F +:103F5000803F21F40E94261F819504C0813F29F4EF +:103F60000E94261F8093EF010895823F21F40E9452 +:103F7000261F819504C0833F29F40E94261F809349 +:103F8000EE010895893F19F40E946F1F05C08A3F12 +:103F900031F40E946F1F81958093F00108958B3F4B +:103FA00021F40E946F1F819504C08C3F29F40E9468 +:103FB0006F1F8093F1010895843F21F48091ED01FA +:103FC000816017C0853F21F48091ED01826011C0AE +:103FD000863F21F48091ED0184600BC0873F21F47E +:103FE0008091ED01886005C0883F31F48091ED013A +:103FF00080618093ED0108958D3F21F48091EB0164 +:1040000081600BC08E3F21F48091EB01826005C07E +:104010008F3F29F48091EB0184608093EB01089538 +:10402000803F39F48091EF0187FF6CC01092EF015F +:1040300069C0813F29F48091EF011816BCF362C07A +:104040009091EE01823F29F497FF5CC01092EE013F +:1040500059C0833F19F41916CCF354C0893F41F479 +:104060008091F00118160CF04DC01092F0014AC07A +:104070008A3F29F48091F00187FF44C0F6CF8B3F3F +:1040800039F48091F10187FF3DC01092F1013AC0EF +:104090008C3F29F48091F1011816BCF333C0843FA2 +:1040A00021F48091ED018E7F17C0853F21F480912E +:1040B000ED018D7F11C0863F21F48091ED018B7F52 +:1040C0000BC0873F21F48091ED01877F05C0883FB9 +:1040D00031F48091ED018F7E8093ED0113C08D3F0F +:1040E00021F48091EB018E7F0BC08E3F21F48091F3 +:1040F000EB018D7F05C08F3F29F48091EB018B7F11 +:104100008093EB018091EE0181110EC08091EF014F +:1041100081110AC08091F001811106C08091F101E6 +:10412000811102C01092EC0108958091E30183FF98 +:104130007EC080E594E00E9439068091ED011F92D7 +:104140008F938BE494E09F938F930E94D20689E42F +:1041500094E00E9439068091EE01282F082E000C71 +:10416000330B3F938F9386E494E09F938F930E9449 +:10417000D20684E494E00E9439068091EF01282F52 +:10418000082E000C330B3F938F9381E494E09F93B0 +:104190008F930E94D2068FE394E00E9439068091AB +:1041A000F001282F082E000C330B3F938F938CE3E4 +:1041B00094E09F938F930E94D2068AE394E00E943A +:1041C00039068091F101282F082E000C330B3F9304 +:1041D0008F9387E394E09F938F930E94D20684E3AA +:1041E00094E00E9439068091EC011F928F9381E345 +:1041F00094E09F938F930E94D2068FE294E00E94F6 +:1042000039068091EB011F928F938CE294E09F938B +:104210008F930E94D20689E294E00E9439068DB7FE +:104220009EB74C960FB6F8949EBF0FBE8DBF8DEE15 +:1042300091E00E9407100E94531C9093EA01809322 +:10424000E90108951F93CF93DF938091E901909145 +:10425000EA010E946B1CAC019091EC01992321F0C2 +:104260002091120130E006C0209113018AE0289FBE +:10427000900111244217530708F485C08091EE0184 +:10428000C091EF01D091F0011091F101811107C0AF +:10429000C11175C0D11173C0111171C074C09F3F9D +:1042A00019F09F5F9093EC01181624F40E94261FCA +:1042B0008093EE018091EE0187FF05C00E94261FCA +:1042C00081958093EE011C1624F40E94261F809392 +:1042D000EF018091EF0187FF05C00E94261F8195A5 +:1042E0008093EF016091EE01662331F1C091EF01FF +:1042F000CC2311F1062E000C770B880B990B0E9432 +:104300002F2723E333E343E35FE30E9493270E94D5 +:10431000F7266093EE016C2FCC0F770B880B990B6F +:104320000E942F2723E333E343E35FE30E949327B5 +:104330000E94F7266093EF011D1624F40E946F1F60 +:104340008093F0018091F00187FF05C00E946F1FEC +:1043500081958093F001111624F40E946F1F8093C1 +:10436000F1018091F10187FF05C00E946F1F8195C7 +:104370008093F101DF91CF911F910C9495209F3F85 +:1043800009F08FCF97CFDF91CF911F910895EDEE78 +:10439000F1E085E0DF011D928A95E9F71092EC01CA +:1043A0001092EB01089583E796E00E9439061F9270 +:1043B00081E08F931F9285E08F9385E296E09F9333 +:1043C0008F930E94D2060F900F900F900F900F9036 +:1043D0000F9008958330E9F128F4813061F0823044 +:1043E00009F10895853009F462C008F449C08630A7 +:1043F00009F474C0089580911301262F30E0280F2E +:10440000311D2F3F310524F4680F6093130103C061 +:104410008FEF80931301809113011F928F938EE58C +:1044200095E072C080911201262F30E0280F311DD7 +:104430002F3F310524F4680F6093120103C08FEF02 +:1044400080931201809112011F928F938CE495E06A +:104450005BC080911101262F30E0280F311D2F3FC6 +:10446000310524F4680F6093110103C08FEF80932E +:104470001101809111011F928F9389E395E044C04F +:1044800080911001262F30E0280F311D2F3F31057C +:1044900024F4680F6093100103C08FEF8093100124 +:1044A000809110011F928F9384E295E02DC080913E +:1044B0000F01262F30E0280F311D2F3F310524F446 +:1044C000680F60930F0103C08FEF80930F018091FD +:1044D0000F011F928F938BE095E016C080910E0123 +:1044E000262F30E0280F311D2F3F310524F4680FAF +:1044F00060930E0103C08FEF80930E0180910E0137 +:104500001F928F9380EF94E09F938F930E94D20627 +:104510000F900F900F900F900895833081F128F441 +:10452000813059F08230D1F00895853009F449C0C6 +:10453000B8F1863009F456C00895809113016817C8 +:1045400020F4861B8093130102C010921301809106 +:1045500013011F928F9381EE94E054C08091120159 +:10456000681720F4861B8093120102C0109212017A +:10457000809112011F928F938FEC94E043C0809141 +:104580001101681720F4861B8093110102C010925C +:104590001101809111011F928F938CEB94E032C036 +:1045A00080911001681720F4861B8093100102C0CF +:1045B00010921001809110011F928F9387EA94E06E +:1045C00021C080910F01681720F4861B80930F0192 +:1045D00002C010920F0180910F011F928F938EE8FD +:1045E00094E010C080910E01681720F4861B809320 +:1045F0000E0102C010920E0180910E011F928F9346 +:1046000083E794E09F938F930E94D2060F900F90C0 +:104610000F900F900895CF93C82F1F928F9388E724 +:1046200097E09F938F930E94D20681E090E0A0E0F4 +:10463000B0E0BC01CD0104C0660F771F881F991F31 +:10464000CA95D2F70E943D190F900F900F900F90CE +:10465000CF910C944015CF938B3109F4CBC108F066 +:1046600049C08E3009F4DAC100F5873009F4A9C1D8 +:10467000A8F4863009F05AC28091E301817F8E7FD1 +:104680008093E3018DE797E00E94390688EB9BE079 +:104690000E94390681E08093F30191C1883009F4CA +:1046A0005BC08B3009F487C141C2813109F426C255 +:1046B00020F4803109F4C6C139C2863109F4DDC164 +:1046C000893109F033C28CE29BE00E9439068FEFFA +:1046D0009AE00E94390688EC9AE00E94390681EA45 +:1046E0009AE00E9439068DE49AE00E9439068FE133 +:1046F0009AE063C1853309F413C268F4873209F480 +:104700000FC228F48E3108F411C28D510CC28932C7 +:1047100009F406C20BC2833438F48A3308F002C2AB +:10472000883309F448C102C2833409F4F9C18834DA +:1047300009F0FCC10E94401587EA9BE00E943906FF +:104740009FEF23ED80E3915020408040E1F700C0CF +:1047500000000E94E61C33C18CEB9BE00E943906EE +:104760008CE799E00E9439060E94141F1F928F93D4 +:1047700089E799E09F938F930E94D20687E799E09B +:104780000E9439060E940B1FC82F84E699E00E9400 +:1047900039061F92CF938FE599E09F938F930E94E4 +:1047A000D2068DE599E00E94390683E599E00E94E2 +:1047B00039068C2F81701F928F9380E599E09F932B +:1047C0008F930E94D2068EE499E00E94390684E419 +:1047D00099E00E943906C1FB882780F91F928F93C8 +:1047E00081E499E09F938F930E94D2068FE399E032 +:1047F0000E94390683E399E00E943906C2FB8827AC +:1048000080F91F928F9380E399E09F938F930E948A +:10481000D2068EE299E00E94390685E299E00E9474 +:104820003906C3FBCC27C0F91F92CF9382E299E0EF +:104830009F938F930E94D20680E299E00E943906EE +:104840000E941D1FC82F8CE099E00E9439061F921C +:10485000CF9387E099E09F938F930E94D20685E0E3 +:1048600099E00E9439068CEE98E00E9439068C2F60 +:1048700081701F928F9389EE98E09F938F930E948F +:10488000D2068DB79EB780960FB6F8949EBF0FBE26 +:104890008DBF87EE98E00E94390680ED98E00E9477 +:1048A0003906C1FB882780F91F928F938DEC98E021 +:1048B0009F938F930E94D2068BEC98E00E9439065A +:1048C00089EB98E00E943906C2FB882780F91F9285 +:1048D0008F9386EB98E09F938F930E94D20684EB90 +:1048E00098E00E94390682EA98E00E943906C3FBEC +:1048F000882780F91F928F938FE998E09F938F9379 +:104900000E94D2068DE998E00E94390683E998E07A +:104910000E943906C4FB882780F91F928F9380E993 +:1049200098E09F938F930E94D2068EE898E00E94B1 +:1049300039068CE798E00E943906C5FB882780F984 +:104940001F928F9389E798E09F938F930E94D206DE +:1049500087E798E00E9439068BE598E00E943906C7 +:10496000C6FB882780F91F928F9388E598E09F9374 +:104970008F930E94D20686E598E00E9439068EE465 +:1049800098E00E943906C7FBCC27C0F91F92CF934D +:104990008BE498E09F938F930E94D20689E498E07D +:1049A0000E9439068DB79EB74C960FB6F8949EBFFD +:1049B0000FBE8DBF04C084EA97E00E943906C1E0B3 +:1049C000BAC08091E301C82FC17080FF09C08AE995 +:1049D0009BE00E9439068091E301817F8E7F47C072 +:1049E0008EE89BE00E9439068091E301816080930C +:1049F000E301E5CF9091E30191FBCC27C0F981E081 +:104A0000C827892FC0FB81F98093E301CC2319F0DB +:104A100081E89BE027C083E79BE0CFCF9091E30143 +:104A200092FBCC27C0F981E0C827892FC0FB82F90F +:104A30008093E301CC2319F084E69BE013C084E566 +:104A40009BE0BBCF9091E30193FBCC27C0F981E0C1 +:104A5000C827892FC0FB83F98093E301CC2351F051 +:104A600088E49BE00E9439068091E3018160809395 +:104A7000E30161C08BE39BE0A0CF81E19AE00E945B +:104A800039060E94B20F1F928F9387EF99E09F9390 +:104A90008F930E94D20680910A011F928F9380EE1D +:104AA00099E09F938F930E94D206809176011F9286 +:104AB0008F938DEC99E09F938F930E94D206809103 +:104AC0000B011F928F938AEB99E09F938F930E9423 +:104AD000D2060E945F1C9F938F937F936F9383EA0C +:104AE00099E09F938F930E94D2068DB79EB746960A +:104AF0000FB6F8949EBF0FBE8DBF61CF0E944015C8 +:104B0000C0910B0181E0C827C0930B01CC2329F091 +:104B100089E999E00E9439060EC08EE899E04DCFF0 +:104B200080E001C089530E940B2349CF8CE899E0B3 +:104B30000E943906C0E08C2FCF91089580E008953F +:104B400080E00895CF93C82F8091F301813071F0F8 +:104B500020F0823009F44BC042C1E0910C01F09189 +:104B60000D018081823209F03CC107C0E0910C0147 +:104B7000F0910D018081823261F48C2F0E949E257C +:104B8000811104C08C2F0E942B232FC081E090E064 +:104B90002CC08C2F0E94A025811126C0C431E1F0C9 +:104BA00070F4CB3081F0C031D1F40E94D32180E782 +:104BB00097E00E94390682E08093F30115C0C93264 +:104BC00059F0C83361F48DE797E00E94390684E715 +:104BD00097E00E94390608C01092F30104C18EE6E6 +:104BE00097E00E943906FFC081E08170FEC0C432A8 +:104BF00028F5CE3108F0C1C0CB30A1F1D0F4C730D8 +:104C000009F0D3C08EE18093130182E380931201F7 +:104C10008AE08093110184E18093100188E0809301 +:104C20000F0188E280930E0184E196E00E9439062C +:104C3000BFC0C33149F1C431C1F0B7C0CB3409F4AE +:104C4000A9C028F4C93289F0C83361F0AEC0C135BB +:104C500009F49EC0C23509F499C0CE3409F0A5C04C +:104C60006AE09EC00E94D321A3C08091F2018823F4 +:104C700019F01092F2019CC081E296E00E94390680 +:104C800081E08093F301B1C08BEF95E00E9439067B +:104C900089EE95E00E943906809113011F928F934F +:104CA00086EE95E09F938F930E94D20684EE95E066 +:104CB0000E94390682ED95E00E943906809112012A +:104CC0001F928F938FEC95E09F938F930E94D20653 +:104CD0008DEC95E00E9439068EEB95E00E94390636 +:104CE000809111011F928F938BEB95E09F938F938F +:104CF0000E94D20689EB95E00E94390688EA95E089 +:104D00000E943906809110011F928F9385EA95E0E9 +:104D10009F938F930E94D20683EA95E00E94390602 +:104D20008EE895E00E94390680910F011F928F93C3 +:104D30008BE895E09F938F930E94D20689E895E0D7 +:104D40000E94390682E795E00E94390680910E01A3 +:104D50001F928F938FE695E09F938F930E94D206C8 +:104D60008DE695E00E9439068DB79EB748960FB63E +:104D7000F8949EBF0FBE8DBF1BC0CE51EC2FF0E04C +:104D8000E35DFE4F80818093F20112C061E003C0B9 +:104D900061E006C06AE08091F2010E94EA2108C049 +:104DA0008091F2010E948D2203C082E196E013C03F +:104DB0008091F201882369F01F928F938CE096E036 +:104DC0009F938F930E94D2060F900F900F900F9099 +:104DD00004C089E096E00E94390681E006C0109286 +:104DE000F30180E002C080E000CFCF9108950E94DF +:104DF000FE266894B1110C948D2708950E947227A5 +:104E000088F09F5798F0B92F9927B751B0F0E1F08B +:104E1000660F771F881F991F1AF0BA95C9F714C03B +:104E2000B13091F00E948C27B1E008950C948C274A +:104E3000672F782F8827B85F39F0B93FCCF3869574 +:104E400077956795B395D9F73EF4909580957095D1 +:104E500061957F4F8F4F9F4F0895E89409C097FB4E +:104E60003EF490958095709561957F4F8F4F9F4F41 +:104E70009923A9F0F92F96E9BB279395F695879585 +:104E800077956795B795F111F8CFFAF4BB0F11F448 +:104E900060FF1BC06F5F7F4F8F4F9F4F16C08823EF +:104EA00011F096E911C0772321F09EE8872F762F25 +:104EB00005C0662371F096E8862F70E060E02AF066 +:104EC0009A95660F771F881FDAF7880F9695879552 +:104ED00097F9089557FD9058440F551F59F05F3FBB +:104EE00071F04795880F97FB991F61F09F3F79F00C +:104EF00087950895121613061406551FF2CF46958E +:104F0000F1DF08C0161617061806991FF1CF86950F +:104F10007105610508940895E894BB2766277727F3 +:104F2000CB0197F908950E94A6270C9417280E9498 +:104F3000092838F00E94102820F0952311F00C94D5 +:104F400000280C94062811240C948D270E946A27AF +:104F500070F3959FC1F3950F50E0551F629FF001CC +:104F6000729FBB27F00DB11D639FAA27F00DB11DE5 +:104F7000AA1F649F6627B00DA11D661F829F22276E +:104F8000B00DA11D621F739FB00DA11D621F839FF5 +:104F9000A00D611D221F749F3327A00D611D231FCB +:104FA000849F600D211D822F762F6A2F11249F5719 +:104FB00050409AF0F1F088234AF0EE0FFF1FBB1F1C +:104FC000661F771F881F91505040A9F79E3F5105DB +:104FD00080F00C9400280C948D275F3FE4F3983EFA +:104FE000D4F3869577956795B795F795E7959F5F85 +:104FF000C1F7FE2B880F911D9695879597F9089517 +:1050000097F99F6780E870E060E008959FEF80EC7B +:10501000089500240A94161617061806090608951E +:1050200000240A9412161306140605060895092E84 +:105030000394000C11F4882352F0BB0F40F4BF2BF3 +:1050400011F460FF04C06F5F7F4F8F4F9F4F089533 +:10505000991B79E004C0991F961708F0961B881FCA +:105060007A95C9F78095089597FB072E16F400945A +:1050700007D077FD09D00E944E2807FC05D03EF4EA +:10508000909581959F4F0895709561957F4F0895F4 +:10509000EE0FFF1F0590F491E02D0994AA1BBB1B96 +:1050A00051E107C0AA1FBB1FA617B70710F0A61B28 +:1050B000B70B881F991F5A95A9F780959095BC0149 +:1050C000CD010895F999FECF92BD81BDF89A992737 +:1050D00080B50895A8E1B0E042E050E00C94852846 +:1050E000262FF999FECF1FBA92BD81BD20BD0FB604 +:1050F000F894FA9AF99A0FBE019608950E947028C2 +:10510000272F0C947128DC01CB01FC01F999FECF0B +:1051100006C0F2BDE1BDF89A319600B40D9241503F +:0A5120005040B8F70895F894FFCF4F +:10512A001B080C09E908B50881080101D101280802 +:10513A00140A321E404D3622395A030D03D702B5DE +:10514A00027C02EF01080221023A025A020102031A +:08515A00040506070809000026 +:1068000088000000000000000400050006000700EA +:10681000080009000A000B000C000D000E000F001C +:1068200010001100120013001400150016001700CC +:10683000180019001A001B001C001D001E001F007C +:10684000200021002200230024002500260027002C +:10685000280035002A002B002C002D002E002F00D0 +:106860003000310032003300340029003600370098 +:106870003800E00000000000000000000000000000 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000004F00A9 +:1068A00050005100520000000000000000000000F5 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E0000000000000000000890087008A008B0083 +:1068F000F1A1E100E200E300F1A1E500E600000003 +:106900000100010001000100EA4401000100E2442D +:106910000100010001005500460054004A004B00F0 +:10692000560057004700480001000100E9440100FB +:106930000100010001000100010001003A003B00DC +:106940003C003D003E003F0040004100420043004B +:10695000580001004C00390001004400450052007D +:1069600001000100010050004F0081404D004E0029 +:1069700051000100010001000100010001000100BF +:1069800001000100010001000100010001000100FF +:1069900001000100010001000100010001004D00A3 +:1069A0004A004E004B0001000100010001000100FF +:1069B00001000100010001000100010001000100CF +:1069C00001000100010001000100010001000100BF +:1069D00001000100010001000100010001000100AF +:1069E0000100010001000100490001000100010057 +:1069F000010001000100010001000100010001008F +:00000001FF diff --git a/keyboard/hhkb/keymap_common.c b/keyboard/hhkb/keymap_common.c deleted file mode 100644 index e938fb62..00000000 --- a/keyboard/hhkb/keymap_common.c +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright 2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include -#include "action.h" -#include -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/keyboard/hhkb/keymap_common.h b/keyboard/hhkb/keymap_common.h index 3622665f..97e2e098 100644 --- a/keyboard/hhkb/keymap_common.h +++ b/keyboard/hhkb/keymap_common.h @@ -32,10 +32,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - #define KEYMAP( \ K31, K30, K00, K10, K11, K20, K21, K40, K41, K60, K61, K70, K71, K50, K51, \ K32, K01, K02, K13, K12, K23, K22, K42, K43, K62, K63, K73, K72, K52, \ diff --git a/keyboard/hhkb/keymap_hasu.c b/keyboard/hhkb/keymap_hasu.c index a5602ded..b63265c9 100644 --- a/keyboard/hhkb/keymap_hasu.c +++ b/keyboard/hhkb/keymap_hasu.c @@ -192,9 +192,9 @@ enum macro_id { * Fn action definition */ #ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { #else -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { #endif [0] = ACTION_DEFAULT_LAYER_SET(0), // Default layer(not used) [1] = ACTION_LAYER_TAP_TOGGLE(1), // HHKB layer(toggle with 5 taps) diff --git a/keyboard/hhkb/keymap_hhkb.c b/keyboard/hhkb/keymap_hhkb.c index 7807f436..ae96e834 100644 --- a/keyboard/hhkb/keymap_hhkb.c +++ b/keyboard/hhkb/keymap_hhkb.c @@ -54,7 +54,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * Fn action definition */ #ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_LAYER_MOMENTARY(2), [2] = ACTION_LAYER_MOMENTARY(3), @@ -89,7 +89,7 @@ const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { [31] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_BSLASH), }; #else -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { [0] = ACTION_LAYER_MOMENTARY(1), }; #endif diff --git a/keyboard/hhkb/keymap_jp.c b/keyboard/hhkb/keymap_jp.c index 48d0ee70..152674d0 100644 --- a/keyboard/hhkb/keymap_jp.c +++ b/keyboard/hhkb/keymap_jp.c @@ -42,9 +42,9 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * Fn action definition */ #ifdef KEYMAP_SECTION_ENABLE -const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { +const action_t fn_actions[] __attribute__ ((section (".keymap.fn_actions"))) = { #else -const uint16_t fn_actions[] PROGMEM = { +const action_t fn_actions[] PROGMEM = { #endif [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/keyboard/hhkb/keymap_spacefn.c b/keyboard/hhkb/keymap_spacefn.c index deff920a..b5a8c8b4 100644 --- a/keyboard/hhkb/keymap_spacefn.c +++ b/keyboard/hhkb/keymap_spacefn.c @@ -108,7 +108,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) /* * Fn action definition */ -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_LAYER_TAP_KEY(2, KC_SPACE), [2] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde diff --git a/keyboard/hhkb/unimap_common.h b/keyboard/hhkb/unimap_common.h new file mode 100644 index 00000000..905c116f --- /dev/null +++ b/keyboard/hhkb/unimap_common.h @@ -0,0 +1,222 @@ +/* +Copyright 2016 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#ifndef UNIMAP_COMMON_H +#define UNIMAP_COMMON_H + +#include +#include +#include "unimap.h" + + +/* HHKB JP + * ,-----------------------------------------------------------. + * |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |JPY|BS | + * |-----------------------------------------------------------| + * |Tab |Q |W |E |R |T |Y |U |I |O |P |[ |] |Enter| + * |------------------------------------------------------` | + * |Caps |A |S |D |F |G |H |J |K |L |; |' |# | | + * |-----------------------------------------------------------| + * |Shift |Z |X |C |V |B |N |M |, |. |/ |Ro |Up |Shi| + * |-----------------------------------------------------------| + * |Ctl||Esc|Gui|Alt|Mhn| |Hen|Kan|Alt|Ctl||Lef|Dow|Rig| + * `-----------------------------------------------------------' + * Esc = Grave(`) + * Control = Caps Lock + * Left Fn = Left Control + * Right Fn = Right Control + */ +// row:16 x col:8 +const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = { + // 0 + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_GRAVE, + UNIMAP_TAB, + UNIMAP_LCTRL, + UNIMAP_LSHIFT, + UNIMAP_CAPSLOCK, + UNIMAP_NO, + }, + // 1 + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_4, + UNIMAP_E, + UNIMAP_MHEN, + UNIMAP_C, + UNIMAP_D, + UNIMAP_NO, + }, + // 2 + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_3, + UNIMAP_W, + UNIMAP_LALT, + UNIMAP_X, + UNIMAP_S, + UNIMAP_NO, + }, + // 3 + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_1, + UNIMAP_NO, + UNIMAP_ESCAPE, + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_NO, + }, + // 4 + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_NO, + }, + // 5 + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_5, + UNIMAP_R, + UNIMAP_NO, + UNIMAP_V, + UNIMAP_F, + UNIMAP_NO, + }, + // 6 + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_2, + UNIMAP_Q, + UNIMAP_LGUI, + UNIMAP_Z, + UNIMAP_A, + UNIMAP_NO, + }, + // 7 + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_6, + UNIMAP_T, + UNIMAP_SPACE, + UNIMAP_B, + UNIMAP_G, + UNIMAP_NO, + }, + // 8 + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_9, + UNIMAP_I, + UNIMAP_KANA, + UNIMAP_COMMA, + UNIMAP_K, + UNIMAP_NO, + }, + // 9 + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_8, + UNIMAP_U, + UNIMAP_HENK, + UNIMAP_M, + UNIMAP_J, + UNIMAP_NO, + }, + // A + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_7, + UNIMAP_Y, + UNIMAP_NO, + UNIMAP_N, + UNIMAP_H, + UNIMAP_NO, + }, + // B + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_0, + UNIMAP_O, + UNIMAP_RALT, + UNIMAP_DOT, + UNIMAP_L, + UNIMAP_NO, + }, + // C + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_BSPACE, + UNIMAP_NO, + UNIMAP_RIGHT, + UNIMAP_RSHIFT, + UNIMAP_ENTER, + UNIMAP_NO, + }, + // D + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_JYEN, + UNIMAP_RBRACKET, + UNIMAP_DOWN, + UNIMAP_UP, + UNIMAP_NONUS_HASH, + UNIMAP_NO, + }, + // E + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_MINUS, + UNIMAP_P, + UNIMAP_RCTRL, + UNIMAP_SLASH, + UNIMAP_SCOLON, + UNIMAP_NO, + }, + // F + { + UNIMAP_NO, + UNIMAP_NO, + UNIMAP_EQUAL, + UNIMAP_LBRACKET, + UNIMAP_LEFT, + UNIMAP_RO, + UNIMAP_QUOTE, + UNIMAP_NO, + }, +}; + +#endif diff --git a/keyboard/hhkb/unimap_jp.c b/keyboard/hhkb/unimap_jp.c new file mode 100644 index 00000000..70e6b0cd --- /dev/null +++ b/keyboard/hhkb/unimap_jp.c @@ -0,0 +1,45 @@ +/* +Copyright 2016 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +#include "unimap_common.h" + + +#define AC_FN0 ACTION_LAYER_MOMENTARY(1) + +#ifdef KEYMAP_SECTION_ENABLE +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] __attribute__ ((section (".keymap.keymaps"))) = { +#else +const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = { +#endif + UNIMAP( + NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, + ZKHK, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, + ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, NO, NO, NO, NO, NO, NO, NO, + TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, NO, NO, NO, NO, NO, NO, NO, + LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, NO, NO, NO, NO, + LSFT,NO, Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, NO, NO, NO, NO, + FN0, LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,NO, NO, FN0, LEFT,DOWN,RGHT, NO, NO, NO + ), + UNIMAP( + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, + TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, + PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, + TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT, TRNS,PENT, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN, TRNS,TRNS, PGUP, TRNS,TRNS,TRNS,TRNS, + TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, HOME,PGDN,END, TRNS, TRNS,TRNS + ), +}; diff --git a/keyboard/infinity/Makefile b/keyboard/infinity/Makefile index 052134c3..5b3c1fe6 100644 --- a/keyboard/infinity/Makefile +++ b/keyboard/infinity/Makefile @@ -9,7 +9,6 @@ OBJDIR = ./build OBJECTS = \ $(OBJDIR)/matrix.o \ - $(OBJDIR)/keymap_common.o \ $(OBJDIR)/led.o \ $(OBJDIR)/main.o diff --git a/keyboard/infinity/keymap.c b/keyboard/infinity/keymap.c index 4726cee6..c2845b18 100644 --- a/keyboard/infinity/keymap.c +++ b/keyboard/infinity/keymap.c @@ -42,7 +42,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/keyboard/infinity/keymap_common.c b/keyboard/infinity/keymap_common.c deleted file mode 100644 index fdb1769e..00000000 --- a/keyboard/infinity/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) }; -} diff --git a/keyboard/infinity/keymap_common.h b/keyboard/infinity/keymap_common.h index b0f765bf..412417a2 100644 --- a/keyboard/infinity/keymap_common.h +++ b/keyboard/infinity/keymap_common.h @@ -29,10 +29,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - #ifdef INFINITY_PROTOTYPE /* Infinity prototype */ diff --git a/keyboard/infinity_chibios/Makefile b/keyboard/infinity_chibios/Makefile index 9999451c..3873239a 100644 --- a/keyboard/infinity_chibios/Makefile +++ b/keyboard/infinity_chibios/Makefile @@ -9,7 +9,6 @@ TARGET_DIR = . # project specific files SRC = matrix.c \ - keymap_common.c \ led.c ifdef KEYMAP diff --git a/keyboard/infinity_chibios/keymap_common.c b/keyboard/infinity_chibios/keymap_common.c deleted file mode 100644 index 69b170ce..00000000 --- a/keyboard/infinity_chibios/keymap_common.c +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright 2012,2013 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -#include "keymap_common.h" - - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - return keymaps[(layer)][(key.row)][(key.col)]; -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - return (action_t){ .code = fn_actions[FN_INDEX(keycode)] }; -} diff --git a/keyboard/infinity_chibios/keymap_common.h b/keyboard/infinity_chibios/keymap_common.h index 260822fc..d958f30f 100644 --- a/keyboard/infinity_chibios/keymap_common.h +++ b/keyboard/infinity_chibios/keymap_common.h @@ -30,10 +30,6 @@ along with this program. If not, see . #include "keymap.h" -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; - - #ifdef INFINITY_PROTOTYPE /* Infinity prototype */ diff --git a/keyboard/infinity_chibios/keymap_hasu.c b/keyboard/infinity_chibios/keymap_hasu.c index 2d0635f0..538de746 100644 --- a/keyboard/infinity_chibios/keymap_hasu.c +++ b/keyboard/infinity_chibios/keymap_hasu.c @@ -119,7 +119,7 @@ enum macro_id { /* * Fn action definition */ -const uint16_t fn_actions[] = { +const action_t fn_actions[] = { [0] = ACTION_DEFAULT_LAYER_SET(0), // Default layer(not used) [1] = ACTION_LAYER_TAP_TOGGLE(1), // HHKB layer(toggle with 5 taps) [2] = ACTION_LAYER_TAP_KEY(2, KC_SLASH), // Cursor layer with Slash* diff --git a/keyboard/infinity_chibios/keymap_plain.c b/keyboard/infinity_chibios/keymap_plain.c index 2673d6aa..0015a0b2 100644 --- a/keyboard/infinity_chibios/keymap_plain.c +++ b/keyboard/infinity_chibios/keymap_plain.c @@ -42,7 +42,7 @@ const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS), }; -const uint16_t fn_actions[] = { +const action_t fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), }; diff --git a/keyboard/onekey/keymap.c b/keyboard/onekey/keymap.c index dce4e919..2a435634 100644 --- a/keyboard/onekey/keymap.c +++ b/keyboard/onekey/keymap.c @@ -16,7 +16,6 @@ along with this program. If not, see . */ #include #include -#include #include "keycode.h" #include "action.h" #include "action_macro.h" @@ -34,33 +33,5 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* * Fn action definition */ -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { }; - - - -#define KEYMAPS_SIZE (sizeof(keymaps) / sizeof(keymaps[0])) -#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0])) - -/* translates key to keycode */ -uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) -{ - if (layer < KEYMAPS_SIZE) { - return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); - } else { - // fall back to layer 0 - return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]); - } -} - -/* translates Fn keycode to action */ -action_t keymap_fn_to_action(uint8_t keycode) -{ - action_t action; - if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) { - action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]); - } else { - action.code = ACTION_NO; - } - return action; -} diff --git a/keyboard/stm32_f072_onekey/keymap_plain.c b/keyboard/stm32_f072_onekey/keymap_plain.c index 8de1c027..88c56baa 100644 --- a/keyboard/stm32_f072_onekey/keymap_plain.c +++ b/keyboard/stm32_f072_onekey/keymap_plain.c @@ -18,6 +18,7 @@ along with this program. If not, see . #include "keycode.h" #include "action.h" #include "action_macro.h" +#include "action_code.h" #include "report.h" #include "host.h" #include "print.h" @@ -28,7 +29,7 @@ static const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {{KC_CAPS}}, // test with KC_CAPS, KC_A, KC_BTLD }; -static const uint16_t fn_actions[] = { +static const action_t fn_actions[] = { }; /* translates key to keycode */ @@ -40,5 +41,5 @@ uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) /* translates Fn keycode to action */ action_t keymap_fn_to_action(uint8_t keycode) { - return (action_t){ .code = fn_actions[FN_INDEX(keycode)] }; + return (action_t)fn_actions[FN_INDEX(keycode)]; } diff --git a/keyboard/stm32_f103_onekey/keymap_plain.c b/keyboard/stm32_f103_onekey/keymap_plain.c index 8de1c027..5aee2b7f 100644 --- a/keyboard/stm32_f103_onekey/keymap_plain.c +++ b/keyboard/stm32_f103_onekey/keymap_plain.c @@ -28,7 +28,7 @@ static const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {{KC_CAPS}}, // test with KC_CAPS, KC_A, KC_BTLD }; -static const uint16_t fn_actions[] = { +static const action_t fn_actions[] = { }; /* translates key to keycode */ @@ -40,5 +40,5 @@ uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) /* translates Fn keycode to action */ action_t keymap_fn_to_action(uint8_t keycode) { - return (action_t){ .code = fn_actions[FN_INDEX(keycode)] }; + return fn_actions[FN_INDEX(keycode)]; } diff --git a/keyboard/teensy_lc_onekey/keymap_plain.c b/keyboard/teensy_lc_onekey/keymap_plain.c index 922fa537..16b05a75 100644 --- a/keyboard/teensy_lc_onekey/keymap_plain.c +++ b/keyboard/teensy_lc_onekey/keymap_plain.c @@ -28,7 +28,7 @@ static const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { {{KC_A}}, }; // to test: KC_CAPS, KT_BTLD, KC_A -static const uint16_t fn_actions[] = { +static const action_t fn_actions[] = { }; /* translates key to keycode */ @@ -40,5 +40,5 @@ uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) /* translates Fn keycode to action */ action_t keymap_fn_to_action(uint8_t keycode) { - return (action_t){ .code = fn_actions[FN_INDEX(keycode)] }; + return fn_actions[FN_INDEX(keycode)]; } diff --git a/orphan/ghost_squid/keymap_ansi.h b/orphan/ghost_squid/keymap_ansi.h index ed1088ba..e659d060 100644 --- a/orphan/ghost_squid/keymap_ansi.h +++ b/orphan/ghost_squid/keymap_ansi.h @@ -18,6 +18,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_COLS][MATRIX_ROWS] = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1) }; diff --git a/orphan/hid_liber/keymap_alaricljs.h b/orphan/hid_liber/keymap_alaricljs.h index 8903fc68..3d10913f 100644 --- a/orphan/hid_liber/keymap_alaricljs.h +++ b/orphan/hid_liber/keymap_alaricljs.h @@ -56,6 +56,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [1] = ACTION_LAYER_MOMENTARY(1), // activate layer 1 when FN1 pressed }; diff --git a/orphan/hid_liber/keymap_ansi.h b/orphan/hid_liber/keymap_ansi.h index 8ce85a49..1e67ed21 100644 --- a/orphan/hid_liber/keymap_ansi.h +++ b/orphan/hid_liber/keymap_ansi.h @@ -29,4 +29,4 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -static const uint16_t PROGMEM fn_actions[] = {}; +static const action_t PROGMEM fn_actions[] = {}; diff --git a/orphan/hid_liber/keymap_custom.h b/orphan/hid_liber/keymap_custom.h index 03e1a1bf..db1d5c7b 100644 --- a/orphan/hid_liber/keymap_custom.h +++ b/orphan/hid_liber/keymap_custom.h @@ -59,6 +59,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [1] = ACTION_LAYER_MOMENTARY(1), // activate layer 1 when FN1 pressed }; diff --git a/orphan/hid_liber/keymap_iso.h b/orphan/hid_liber/keymap_iso.h index c1845367..a3df0038 100644 --- a/orphan/hid_liber/keymap_iso.h +++ b/orphan/hid_liber/keymap_iso.h @@ -29,4 +29,4 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -static const uint16_t PROGMEM fn_actions[] = {}; +static const action_t PROGMEM fn_actions[] = {}; diff --git a/orphan/kitten_paw/keymap_ansi.h b/orphan/kitten_paw/keymap_ansi.h index ed1088ba..e659d060 100644 --- a/orphan/kitten_paw/keymap_ansi.h +++ b/orphan/kitten_paw/keymap_ansi.h @@ -18,6 +18,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_COLS][MATRIX_ROWS] = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1) }; diff --git a/orphan/kmac/keymap_winkey.h b/orphan/kmac/keymap_winkey.h index 3379789e..7ae1e881 100644 --- a/orphan/kmac/keymap_winkey.h +++ b/orphan/kmac/keymap_winkey.h @@ -17,7 +17,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS, TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, CAPS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_BACKLIGHT_STEP() }; diff --git a/orphan/kmac/keymap_winkeyless.h b/orphan/kmac/keymap_winkeyless.h index 939ee379..b6244c42 100644 --- a/orphan/kmac/keymap_winkeyless.h +++ b/orphan/kmac/keymap_winkeyless.h @@ -17,7 +17,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS, TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, CAPS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_BACKLIGHT_STEP() }; diff --git a/orphan/lightpad/keymap_lightpad.h b/orphan/lightpad/keymap_lightpad.h index 9333964e..febdc6c7 100644 --- a/orphan/lightpad/keymap_lightpad.h +++ b/orphan/lightpad/keymap_lightpad.h @@ -17,7 +17,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { FN7, NO, MSTP) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_FN1), [2] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_FN2), diff --git a/orphan/lightsaber/keymap_winkey.h b/orphan/lightsaber/keymap_winkey.h index 3e836708..99ceaa6f 100644 --- a/orphan/lightsaber/keymap_winkey.h +++ b/orphan/lightsaber/keymap_winkey.h @@ -17,7 +17,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS, TRNS, TRNS, TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_BACKLIGHT_TOGGLE(), [2] = ACTION_BACKLIGHT_LEVEL(BACKLIGHT_ALPHA), diff --git a/orphan/nerd/keymap_60_ansi150.c b/orphan/nerd/keymap_60_ansi150.c index f85836ab..e974625b 100644 --- a/orphan/nerd/keymap_60_ansi150.c +++ b/orphan/nerd/keymap_60_ansi150.c @@ -22,7 +22,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LEFT,DOWN,RGHT, TRNS, TRNS,TRNS,TRNS) }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(2), [1] = ACTION_LAYER_TAP_KEY(2, KC_SPACE), [2] = ACTION_LAYER_TOGGLE(1), diff --git a/orphan/nerd/keymap_80_ansi150.c b/orphan/nerd/keymap_80_ansi150.c index 72a7d83c..79eb52b1 100644 --- a/orphan/nerd/keymap_80_ansi150.c +++ b/orphan/nerd/keymap_80_ansi150.c @@ -25,7 +25,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS), }; -const uint16_t PROGMEM fn_actions[] = { +const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(2), [1] = ACTION_LAYER_TAP_KEY(2, KC_SPACE), [2] = ACTION_LAYER_TOGGLE(1), diff --git a/orphan/nerd/keymap_common.h b/orphan/nerd/keymap_common.h index e1166359..d342e4ba 100644 --- a/orphan/nerd/keymap_common.h +++ b/orphan/nerd/keymap_common.h @@ -30,7 +30,7 @@ along with this program. If not, see . #include "keymap.h" extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; +extern const action_t fn_actions[]; #define KEYMAP( \ K08, K09, K18, K19, K28, K29, K38, K39, K48, K49, K58, K59, K68, K69, K88, K89, \ diff --git a/orphan/phantom/keymap_7bit.h b/orphan/phantom/keymap_7bit.h index e6c4eabb..8ab81a14 100644 --- a/orphan/phantom/keymap_7bit.h +++ b/orphan/phantom/keymap_7bit.h @@ -35,7 +35,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, \ TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1), [1] = ACTION_MODS_KEY(MOD_LSFT, KC_9), [2] = ACTION_MODS_KEY(MOD_LSFT, KC_0) diff --git a/orphan/phantom/keymap_ansi.h b/orphan/phantom/keymap_ansi.h index 96a4c9df..a39b0125 100644 --- a/orphan/phantom/keymap_ansi.h +++ b/orphan/phantom/keymap_ansi.h @@ -17,6 +17,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS, TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, CAPS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1) }; diff --git a/orphan/phantom/keymap_ansi_150.h b/orphan/phantom/keymap_ansi_150.h index 7fdb9eb1..7f18f95d 100644 --- a/orphan/phantom/keymap_ansi_150.h +++ b/orphan/phantom/keymap_ansi_150.h @@ -17,6 +17,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS, TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, CAPS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1) }; diff --git a/orphan/phantom/keymap_iso.h b/orphan/phantom/keymap_iso.h index 970f622e..80e50731 100644 --- a/orphan/phantom/keymap_iso.h +++ b/orphan/phantom/keymap_iso.h @@ -17,6 +17,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, CAPS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1) }; diff --git a/orphan/phantom/keymap_iso_150.h b/orphan/phantom/keymap_iso_150.h index ab9acda1..cf9ea787 100644 --- a/orphan/phantom/keymap_iso_150.h +++ b/orphan/phantom/keymap_iso_150.h @@ -17,6 +17,6 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TRNS,TRNS,TRNS,TRNS,CALC,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, CAPS, TRNS, \ TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS) }; -static const uint16_t PROGMEM fn_actions[] = { +static const action_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_MOMENTARY(1) }; diff --git a/orphan/serialmouse_usb/keymap_common.h b/orphan/serialmouse_usb/keymap_common.h index 216a8dc0..59619097 100644 --- a/orphan/serialmouse_usb/keymap_common.h +++ b/orphan/serialmouse_usb/keymap_common.h @@ -31,7 +31,7 @@ along with this program. If not, see . // 32*8(256) byte array which converts PS/2 code into USB code extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -extern const uint16_t fn_actions[]; +extern const action_t fn_actions[]; /* All keys */ diff --git a/orphan/terminal_bluefruit/keymap.c b/orphan/terminal_bluefruit/keymap.c index 8acd8cfb..cb5e0cca 100644 --- a/orphan/terminal_bluefruit/keymap.c +++ b/orphan/terminal_bluefruit/keymap.c @@ -177,7 +177,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -static const uint16_t fn_actions[] PROGMEM = { +static const action_t fn_actions[] PROGMEM = { [0] = ACTION_DEFAULT_LAYER_SET(0), [1] = ACTION_LAYER_MOMENTARY(1), [2] = ACTION_LAYER_MOMENTARY(2), //ACTION_LAYER_ON(2, ON_RELEASE), diff --git a/tmk_core/README.md b/tmk_core/README.md index f460d0ed..c9c2eda4 100644 --- a/tmk_core/README.md +++ b/tmk_core/README.md @@ -7,6 +7,9 @@ Source code is available here: Updates ------- +#### 2016/06/26 +Keymap framework was updated. `fn_actions[]` should be defined as `action_t` instead of `uint16_t`. And default code for keymap handling is now included in core you just need define `uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]` and `action_t fn_actions[]`. + #### 2016/02/10 flabbergast's Chibios protocol was merged from . See [protocol/chibios/README.md](protocol/chibios/README.md). Chibios protocol supports Cortex-M such as STM32 and Kinetis. diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 9cfe6d5a..4fc5398c 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -17,11 +17,16 @@ SRC += $(COMMON_DIR)/host.c \ # Option modules -ifdef ACTIONMAP_ENABLE - SRC += $(COMMON_DIR)/actionmap.c - OPT_DEFS += -DACTIONMAP_ENABLE +ifdef UNIMAP_ENABLE + SRC += $(COMMON_DIR)/unimap.c + OPT_DEFS += -DUNIMAP_ENABLE else - SRC += $(COMMON_DIR)/keymap.c + ifdef ACTIONMAP_ENABLE + SRC += $(COMMON_DIR)/actionmap.c + OPT_DEFS += -DACTIONMAP_ENABLE + else + SRC += $(COMMON_DIR)/keymap.c + endif endif ifdef BOOTMAGIC_ENABLE diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h index b39c6441..8dad38b9 100644 --- a/tmk_core/common/action_code.h +++ b/tmk_core/common/action_code.h @@ -181,9 +181,9 @@ typedef union { /* action utility */ -#define ACTION_NO 0 -#define ACTION_TRANSPARENT 1 -#define ACTION(kind, param) ((kind)<<12 | (param)) +#define ACTION_NO { .code = 0 } +#define ACTION_TRANSPARENT { .code = 1 } +#define ACTION(kind, param) { .code = ((kind)<<12 | (param)) } /* diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index 95909cc2..6b5a7fd2 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -117,7 +117,7 @@ void layer_debug(void) action_t layer_switch_get_action(keypos_t key) { - action_t action = { .code = ACTION_TRANSPARENT }; + action_t action = ACTION_TRANSPARENT; #ifndef NO_ACTION_LAYER uint32_t layers = layer_state | default_layer_state; @@ -125,7 +125,7 @@ action_t layer_switch_get_action(keypos_t key) for (int8_t i = 31; i >= 0; i--) { if (layers & (1UL<. #include "action_code.h" #include "actionmap.h" + +/* Keymapping with 16bit action codes */ +extern const action_t actionmaps[][MATRIX_ROWS][MATRIX_COLS]; + + /* Converts key to action */ __attribute__ ((weak)) action_t action_for_key(uint8_t layer, keypos_t key) diff --git a/tmk_core/common/actionmap.h b/tmk_core/common/actionmap.h index cbbcfe93..5e00bb2e 100644 --- a/tmk_core/common/actionmap.h +++ b/tmk_core/common/actionmap.h @@ -24,10 +24,6 @@ along with this program. If not, see . #include "action.h" -/* Keymapping with 16bit action codes */ -extern const uint16_t actionmaps[][MATRIX_ROWS][MATRIX_COLS]; - - /* Modified key */ #define AC_c(kc) ACTION_MODS_KEY(MOD_LCTL, KC_##kc) #define AC_s(kc) ACTION_MODS_KEY(MOD_LSFT, KC_##kc) diff --git a/tmk_core/common/keymap.c b/tmk_core/common/keymap.c index 25161748..01c6e642 100644 --- a/tmk_core/common/keymap.c +++ b/tmk_core/common/keymap.c @@ -1,5 +1,5 @@ /* -Copyright 2013 Jun Wako +Copyright 2013,2016 Jun Wako This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,9 @@ along with this program. If not, see . #include "wait.h" #include "debug.h" #include "bootloader.h" +#if defined(__AVR__) +#include +#endif #ifdef BOOTMAGIC_ENABLE extern keymap_config_t keymap_config; @@ -32,6 +35,7 @@ static action_t keycode_to_action(uint8_t keycode); /* converts key to action */ +__attribute__ ((weak)) action_t action_for_key(uint8_t layer, keypos_t key) { uint8_t keycode = keymap_key_to_keycode(layer, key); @@ -53,7 +57,7 @@ action_t action_for_key(uint8_t layer, keypos_t key) case KC_LALT: if (keymap_config.swap_lalt_lgui) { if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); + return keycode_to_action(KC_NO); } return keycode_to_action(KC_LGUI); } @@ -63,13 +67,13 @@ action_t action_for_key(uint8_t layer, keypos_t key) return keycode_to_action(KC_LALT); } if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); + return keycode_to_action(KC_NO); } return keycode_to_action(KC_LGUI); case KC_RALT: if (keymap_config.swap_ralt_rgui) { if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); + return keycode_to_action(KC_NO); } return keycode_to_action(KC_RGUI); } @@ -79,7 +83,7 @@ action_t action_for_key(uint8_t layer, keypos_t key) return keycode_to_action(KC_RALT); } if (keymap_config.no_gui) { - return keycode_to_action(ACTION_NO); + return keycode_to_action(KC_NO); } return keycode_to_action(KC_RGUI); case KC_GRAVE: @@ -133,23 +137,22 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) /* translates keycode to action */ static action_t keycode_to_action(uint8_t keycode) { - action_t action = {}; switch (keycode) { case KC_A ... KC_EXSEL: case KC_LCTRL ... KC_RGUI: - action.code = ACTION_KEY(keycode); + return (action_t)ACTION_KEY(keycode); break; case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: - action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); + return (action_t)ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); break; case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: - action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); + return (action_t)ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); break; case KC_MS_UP ... KC_MS_ACCEL2: - action.code = ACTION_MOUSEKEY(keycode); + return (action_t)ACTION_MOUSEKEY(keycode); break; case KC_TRNS: - action.code = ACTION_TRANSPARENT; + return (action_t)ACTION_TRANSPARENT; break; case KC_BOOTLOADER: clear_keyboard(); @@ -157,10 +160,10 @@ static action_t keycode_to_action(uint8_t keycode) bootloader_jump(); // not return break; default: - action.code = ACTION_NO; + return (action_t)ACTION_NO; break; } - return action; + return (action_t)ACTION_NO; } @@ -170,6 +173,28 @@ static action_t keycode_to_action(uint8_t keycode) * Legacy keymap support * Consider using new keymap API instead. */ +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const uint8_t fn_layer[]; +extern const uint8_t fn_keycode[]; + +__attribute__ ((weak)) +uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) +{ + return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); +} + +__attribute__ ((weak)) +uint8_t keymap_fn_layer(uint8_t index) +{ + return pgm_read_byte(&fn_layer[index]); +} + +__attribute__ ((weak)) +uint8_t keymap_fn_keycode(uint8_t index) +{ + return pgm_read_byte(&fn_keycode[index]); +} + __attribute__ ((weak)) uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { @@ -181,21 +206,47 @@ uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) __attribute__ ((weak)) action_t keymap_fn_to_action(uint8_t keycode) { - action_t action = { .code = ACTION_NO }; switch (keycode) { case KC_FN0 ... KC_FN31: { uint8_t layer = keymap_fn_layer(FN_INDEX(keycode)); uint8_t key = keymap_fn_keycode(FN_INDEX(keycode)); if (key) { - action.code = ACTION_LAYER_TAP_KEY(layer, key); + return (action_t)ACTION_LAYER_TAP_KEY(layer, key); } else { - action.code = ACTION_LAYER_MOMENTARY(layer); + return (action_t)ACTION_LAYER_MOMENTARY(layer); } } - return action; + return (action_t)ACTION_NO; default: - return action; + return (action_t)ACTION_NO; } } + +#else + +/* user keymaps should be defined somewhere */ +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const action_t fn_actions[]; + +__attribute__ ((weak)) +uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key) +{ +#if defined(__AVR__) + return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]); +#else + return keymaps[(layer)][(key.row)][(key.col)]; +#endif +} + +__attribute__ ((weak)) +action_t keymap_fn_to_action(uint8_t keycode) +{ +#if defined(__AVR__) + return (action_t)pgm_read_word(&fn_actions[FN_INDEX(keycode)]); +#else + return fn_actions[FN_INDEX(keycode)]; +#endif +} + #endif diff --git a/tmk_core/common/unimap.c b/tmk_core/common/unimap.c new file mode 100644 index 00000000..c3d6c264 --- /dev/null +++ b/tmk_core/common/unimap.c @@ -0,0 +1,57 @@ +#include "keyboard.h" +#include "action.h" +#include "unimap.h" +#include "print.h" +#if defined(__AVR__) +# include +#endif + + +/* Keymapping with 16bit action codes */ +extern const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS]; + +// table translates matrix to universal keymap +extern const uint8_t unimap_trans[MATRIX_ROWS][MATRIX_COLS]; + + + +// translates raw matrix to universal map +keypos_t unimap_translate(keypos_t key) +{ + uint8_t unimap_pos = +#if defined(__AVR__) + pgm_read_byte(&unimap_trans[key.row][key.col]); +#else + unimap_trans[key.row][key.col]; +#endif + return (keypos_t) { + .row = ((unimap_pos & 0x70) >> 4), + .col = (unimap_pos & 0x0F) + }; +} + +/* Converts key to action */ +__attribute__ ((weak)) +action_t action_for_key(uint8_t layer, keypos_t key) +{ + keypos_t uni = unimap_translate(key); + if ((uni.row << 4 | uni.col) == UNIMAP_NO) return (action_t)ACTION_NO; +#if defined(__AVR__) + return (action_t)pgm_read_word(&actionmaps[(layer)][(uni.row)][(uni.col)]); +#else + return actionmaps[(layer)][(uni.row)][(uni.col)]; +#endif +} + +/* Macro */ +__attribute__ ((weak)) +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + return MACRO_NONE; +} + +/* Function */ +__attribute__ ((weak)) +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +{ +} diff --git a/tmk_core/common/unimap.h b/tmk_core/common/unimap.h new file mode 100644 index 00000000..43be70bd --- /dev/null +++ b/tmk_core/common/unimap.h @@ -0,0 +1,211 @@ +/* +Copyright 2016 Jun Wako +*/ +#ifndef _UNIMAP_H_ +#define _UNIMAP_H_ + +#include +#include +#include "action.h" +#include "action_code.h" +#include "actionmap.h" + + +// Universal map table: 8x16=128key +#define UNIMAP_ROWS 8 +#define UNIMAP_COLS 16 + +/* Universal 128-key keyboard layout(8x16) + ,-----------------------------------------------. + |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| +,---. |-----------------------------------------------| ,-----------. ,-----------. +|Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| +`---' `-----------------------------------------------' `-----------' `-----------' +,-----------------------------------------------------------. ,-----------. ,---------------. +| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| +|-----------------------------------------------------------| |-----------| |---------------| +|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| +|-----------------------------------------------------------| `-----------' |---------------| +|CapsL | A| S| D| F| G| H| J| K| L| ;| '| #|Retn| | 4| 5| 6|KP,| +|-----------------------------------------------------------| ,---. |---------------| +|Shft| <| Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|KP=| +|-----------------------------------------------------------| ,-----------. |---------------| +|Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| +`-----------------------------------------------------------' `-----------' `---------------' +App: Windows Menu key +Gui: Windows key, Mac ⌘ key or Meta key +VDn Vup Mut: Volume control +< #: ISO keys(in UK legend) +KP=: Keypad = for Mac +KP,: Brazilian Keypad Comma +JPY: Japanese Yen(¥) +RO: Japanese ろ(Ro) or Brazilian /(Slash) +MHEN: Japanese 無変換(Non Conversion) or Korean Hanja +HENK: Japanese 変換(Conversion) or Korean Hangul/English +KANA: Japanese かな(Hiragana/Katakana) +https://en.wikipedia.org/wiki/Keyboard_layout#Japanese +https://en.wikipedia.org/wiki/Keyboard_layout#Hangul_.28for_Korean.29 +*/ +#define UNIMAP( \ + K68,K69,K6A,K6B,K6C,K6D,K6E,K6F,K70,K71,K72,K73, \ + K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, K01,K02,K03, \ + K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K74,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ + K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K31, K4C,K4D,K4E, K5F,K60,K61,K57, \ + K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K32,K28, K5C,K5D,K5E,K66, \ + K79,K64,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K75,K7D, K52, K59,K5A,K5B,K67, \ + K78,K7B,K7A,K77, K2C, K76,K00,K7E,K7F,K65,K7C, K50,K51,K4F, K62, K63,K58 \ +) { \ + { AC_##K00, AC_##K01, AC_##K02, AC_##K03, AC_##K04, AC_##K05, AC_##K06, AC_##K07, /* 00-07 */ \ + AC_##K08, AC_##K09, AC_##K0A, AC_##K0B, AC_##K0C, AC_##K0D, AC_##K0E, AC_##K0F }, /* 08-0F */ \ + { AC_##K10, AC_##K11, AC_##K12, AC_##K13, AC_##K14, AC_##K15, AC_##K16, AC_##K17, /* 10-17 */ \ + AC_##K18, AC_##K19, AC_##K1A, AC_##K1B, AC_##K1C, AC_##K1D, AC_##K1E, AC_##K1F }, /* 18-1F */ \ + { AC_##K20, AC_##K21, AC_##K22, AC_##K23, AC_##K24, AC_##K25, AC_##K26, AC_##K27, /* 20-27 */ \ + AC_##K28, AC_##K29, AC_##K2A, AC_##K2B, AC_##K2C, AC_##K2D, AC_##K2E, AC_##K2F }, /* 28-2F */ \ + { AC_##K30, AC_##K31, AC_##K32, AC_##K33, AC_##K34, AC_##K35, AC_##K36, AC_##K37, /* 30-37 */ \ + AC_##K38, AC_##K39, AC_##K3A, AC_##K3B, AC_##K3C, AC_##K3D, AC_##K3E, AC_##K3F }, /* 38-3F */ \ + { AC_##K40, AC_##K41, AC_##K42, AC_##K43, AC_##K44, AC_##K45, AC_##K46, AC_##K47, /* 40-47 */ \ + AC_##K48, AC_##K49, AC_##K4A, AC_##K4B, AC_##K4C, AC_##K4D, AC_##K4E, AC_##K4F }, /* 48-4F */ \ + { AC_##K50, AC_##K51, AC_##K52, AC_##K53, AC_##K54, AC_##K55, AC_##K56, AC_##K57, /* 50-57 */ \ + AC_##K58, AC_##K59, AC_##K5A, AC_##K5B, AC_##K5C, AC_##K5D, AC_##K5E, AC_##K5F }, /* 58-5F */ \ + { AC_##K60, AC_##K61, AC_##K62, AC_##K63, AC_##K64, AC_##K65, AC_##K66, AC_##K67, /* 60-67 */ \ + AC_##K68, AC_##K69, AC_##K6A, AC_##K6B, AC_##K6C, AC_##K6D, AC_##K6E, AC_##K6F }, /* 68-6F */ \ + { AC_##K70, AC_##K71, AC_##K72, AC_##K73, AC_##K74, AC_##K75, AC_##K76, AC_##K77, /* 70-77 */ \ + AC_##K78, AC_##K79, AC_##K7A, AC_##K7B, AC_##K7C, AC_##K7D, AC_##K7E, AC_##K7F } /* 78-7F */ \ +} + +// Universal map position codes +enum unimap_position_codes { +// logical name position(row << 4 | col) +// ------------------------------------------------ + UNIMAP_KANA, // 0x00 + UNIMAP_VOLUME_DOWN, // 0x01 + UNIMAP_VOLUME_UP, // 0x02 + UNIMAP_VOLUME_MUTE, // 0x03 + UNIMAP_A, // 0x04 + UNIMAP_B, // 0x05 + UNIMAP_C, // 0x06 + UNIMAP_D, // 0x07 + UNIMAP_E, // 0x08 + UNIMAP_F, // 0x09 + UNIMAP_G, // 0x0A + UNIMAP_H, // 0x0B + UNIMAP_I, // 0x0C + UNIMAP_J, // 0x0D + UNIMAP_K, // 0x0E + UNIMAP_L, // 0x0F + UNIMAP_M, // 0x10 + UNIMAP_N, // 0x11 + UNIMAP_O, // 0x12 + UNIMAP_P, // 0x13 + UNIMAP_Q, // 0x14 + UNIMAP_R, // 0x15 + UNIMAP_S, // 0x16 + UNIMAP_T, // 0x17 + UNIMAP_U, // 0x18 + UNIMAP_V, // 0x19 + UNIMAP_W, // 0x1A + UNIMAP_X, // 0x1B + UNIMAP_Y, // 0x1C + UNIMAP_Z, // 0x1D + UNIMAP_1, // 0x1E + UNIMAP_2, // 0x1F + UNIMAP_3, // 0x20 + UNIMAP_4, // 0x21 + UNIMAP_5, // 0x22 + UNIMAP_6, // 0x23 + UNIMAP_7, // 0x24 + UNIMAP_8, // 0x25 + UNIMAP_9, // 0x26 + UNIMAP_0, // 0x27 + UNIMAP_ENTER, // 0x28 + UNIMAP_ESCAPE, // 0x29 + UNIMAP_BSPACE, // 0x2A + UNIMAP_TAB, // 0x2B + UNIMAP_SPACE, // 0x2C + UNIMAP_MINUS, // 0x2D + UNIMAP_EQUAL, // 0x2E + UNIMAP_LBRACKET, // 0x2F + UNIMAP_RBRACKET, // 0x30 + UNIMAP_BSLASH, // 0x31 + UNIMAP_NONUS_HASH, // 0x32 ISO UK hasu + UNIMAP_SCOLON, // 0x33 + UNIMAP_QUOTE, // 0x34 + UNIMAP_GRAVE, // 0x35 + UNIMAP_COMMA, // 0x36 + UNIMAP_DOT, // 0x37 + UNIMAP_SLASH, // 0x38 + UNIMAP_CAPSLOCK, // 0x39 + UNIMAP_F1, // 0x3A + UNIMAP_F2, // 0x3B + UNIMAP_F3, // 0x3C + UNIMAP_F4, // 0x3D + UNIMAP_F5, // 0x3E + UNIMAP_F6, // 0x3F + UNIMAP_F7, // 0x40 + UNIMAP_F8, // 0x41 + UNIMAP_F9, // 0x42 + UNIMAP_F10, // 0x43 + UNIMAP_F11, // 0x44 + UNIMAP_F12, // 0x45 + UNIMAP_PSCREEN, // 0x46 + UNIMAP_SCROLLLOCK, // 0x47 + UNIMAP_PAUSE, // 0x48 + UNIMAP_INSERT, // 0x49 + UNIMAP_HOME, // 0x4A + UNIMAP_PGUP, // 0x4B + UNIMAP_DELETE, // 0x4C + UNIMAP_END, // 0x4D + UNIMAP_PGDOWN, // 0x4E + UNIMAP_RIGHT, // 0x4F + UNIMAP_LEFT, // 0x50 + UNIMAP_DOWN, // 0x51 + UNIMAP_UP, // 0x52 + UNIMAP_NUMLOCK, // 0x53 + UNIMAP_KP_SLASH, // 0x54 + UNIMAP_KP_ASTERISK, // 0x55 + UNIMAP_KP_MINUS, // 0x56 + UNIMAP_KP_PLUS, // 0x57 + UNIMAP_KP_ENTER, // 0x58 + UNIMAP_KP_1, // 0x59 + UNIMAP_KP_2, // 0x5A + UNIMAP_KP_3, // 0x5B + UNIMAP_KP_4, // 0x5C + UNIMAP_KP_5, // 0x5D + UNIMAP_KP_6, // 0x5E + UNIMAP_KP_7, // 0x5F + UNIMAP_KP_8, // 0x60 + UNIMAP_KP_9, // 0x61 + UNIMAP_KP_0, // 0x62 + UNIMAP_KP_DOT, // 0x63 + UNIMAP_NONUS_BSLASH, // 0x64 ISO UK backslash + UNIMAP_APPLICATION, // 0x65 + UNIMAP_KP_COMMA, // 0x66 + UNIMAP_KP_EQUAL, // 0x67 + UNIMAP_F13, // 0x68 + UNIMAP_F14, // 0x69 + UNIMAP_F15, // 0x6A + UNIMAP_F16, // 0x6B + UNIMAP_F17, // 0x6C + UNIMAP_F18, // 0x6D + UNIMAP_F19, // 0x6E + UNIMAP_F20, // 0x6F + UNIMAP_F21, // 0x70 + UNIMAP_F22, // 0x71 + UNIMAP_F23, // 0x72 + UNIMAP_F24, // 0x73 + UNIMAP_JYEN, // 0x74 + UNIMAP_RO, // 0x75 + UNIMAP_HENK, // 0x76 + UNIMAP_MHEN, // 0x77 + UNIMAP_LCTRL, // 0x78 + UNIMAP_LSHIFT, // 0x79 + UNIMAP_LALT, // 0x7A + UNIMAP_LGUI, // 0x7B + UNIMAP_RCTRL, // 0x7C + UNIMAP_RSHIFT, // 0x7D + UNIMAP_RALT, // 0x7E + UNIMAP_RGUI, // 0x7F + UNIMAP_NO, // 0x80 +}; + +#endif diff --git a/tmk_core/doc/keymap.md b/tmk_core/doc/keymap.md index 3a196a2d..df5d6de1 100644 --- a/tmk_core/doc/keymap.md +++ b/tmk_core/doc/keymap.md @@ -95,7 +95,7 @@ Note that ***higher layers have priority in the layer stack***. The firmware sta ### 0.3 Keymap Example -The keymap is defined in the **`keymaps[]`** array, a 2-dimensional array of rows and columns corresponding to positions in the keyboard matrix. But most often the layers are defined using C macros to allow for easier reading and editing of the keymap files. To use complex actions you need to define `Fn` keycodes in the **`fn_actions[]`** array. +The keymap is defined in the **`uint8_t keymaps[]`** array, a 2-dimensional array of rows and columns corresponding to positions in the keyboard matrix. But most often the layers are defined using C macros to allow for easier reading and editing of the keymap files. To use complex actions you need to define `Fn` action in the **`action_t fn_actions[]`** array. This is a keymap example for the [HHKB](http://en.wikipedia.org/wiki/Happy_Hacking_Keyboard) keyboard. This example has three layers: the QWERTY base layer, and two overlay layers for cursor and mousekey control, respectively. @@ -109,7 +109,7 @@ In this example, You can find other keymap definitions in file `keymap.c` located on project directories. - static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* 0: Qwerty * ,-----------------------------------------------------------. * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| @@ -167,7 +167,7 @@ You can find other keymap definitions in file `keymap.c` located on project dire LGUI,LALT, BTN1, RALT,TRNS), }; - static const uint16_t PROGMEM fn_actions[] = { + const action_t PROGMEM fn_actions[] = { ACTION_LAYER_MOMENTARY(1), // FN0 ACTION_LAYER_TAP_KEY(2, KC_SCLN), // FN1 ACTION_LAYER_TOGGLE(2), // FN2 @@ -214,7 +214,7 @@ There are 8 modifiers which has discrimination between left and right. - `KC_WSCH`, `KC_WHOM`, `KC_WBAK`, `KC_WFWD`, `KC_WSTP`, `KC_WREF`, `KC_WFAV` for web browser operation ### 1.5 Fn key -`KC_FNnn` are keycodes for `Fn` key which not given any actions at the beginning unlike most of keycodes has its own inborn action. To use these keycodes in `KEYMAP()` you need to assign action you want at first. Action of `Fn` key is defined in `fn_actions[]` and its index of the array is identical with number part of `KC_FNnn`. Thus `KC_FN0` keycode indicates the action defined in first element of the array. ***32 `Fn` keys can be defined at most.*** +`KC_FNnn` are keycodes for `Fn` key which not given any actions at the beginning unlike most of keycodes has its own inborn action. To use these keycodes in `KEYMAP()` you need to assign action you want at first. Action of `Fn` key is defined in `action_t fn_actions[]` and its index of the array is identical with number part of `KC_FNnn`. Thus `KC_FN0` keycode indicates the action defined in first element of the array. ***32 `Fn` keys can be defined at most.*** ### 1.6 Keycode Table See keycode table in [`doc/keycode.txt`](./keycode.txt) for description of keycodes. @@ -443,7 +443,7 @@ To define tappable `Function` action in keymap use this. #### 2.4.3 Implement user function `Function` actions can be defined freely with C by user in callback function: - void keymap_call_function(keyrecord_t *event, uint8_t id, uint8_t opt) + void action_function(keyrecord_t *record, uint8_t id, uint8_t opt); This C function is called every time key is operated, argument `id` selects action to be performed and `opt` can be used for option. Function `id` can be 0-255 and `opt` can be 0-15. @@ -598,13 +598,13 @@ Legacy Keymap uses two arrays `fn_layer[]` and `fn_keycode[]` to define Fn key. In following setting example, `Fn0`, `Fn1` and `Fn2` switch layer to 1, 2 and 2 respectively. `Fn2` registers `Space` key when tapping while `Fn0` and `Fn1` doesn't send any key. - static const uint8_t PROGMEM fn_layer[] = { + const uint8_t PROGMEM fn_layer[] = { 1, // Fn0 2, // Fn1 2, // Fn2 }; - static const uint8_t PROGMEM fn_keycode[] = { + const uint8_t PROGMEM fn_keycode[] = { KC_NO, // Fn0 KC_NO, // Fn1 KC_SPC, // Fn2 diff --git a/tmk_core/doc/unimap.txt b/tmk_core/doc/unimap.txt new file mode 100644 index 00000000..0db038e6 --- /dev/null +++ b/tmk_core/doc/unimap.txt @@ -0,0 +1,51 @@ +Unimap +====== +universal keymapping framework +using logical 128-key keyboard layout independent from physical keyboad matrix + +unimap is actually an actionmap whose size is row:8xcol:16. + +/* Keymapping with 16bit action codes */ +extern const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS]; + +/* Universal 128-key keyboard layout(8x16) + ,-----------------------------------------------. + |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| +,---. |-----------------------------------------------| ,-----------. ,-----------. +|Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| +`---' `-----------------------------------------------' `-----------' `-----------' +,-----------------------------------------------------------. ,-----------. ,---------------. +| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| +|-----------------------------------------------------------| |-----------| |---------------| +|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| +|-----------------------------------------------------------| `-----------' |---------------| +|CapsL | A| S| D| F| G| H| J| K| L| ;| '| #|Retn| | 4| 5| 6|KP,| +|-----------------------------------------------------------| ,---. |---------------| +|Shft| <| Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|KP=| +|-----------------------------------------------------------| ,-----------. |---------------| +|Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| +`-----------------------------------------------------------' `-----------' `---------------' +App: Windows Menu key +Gui: Windows key, Mac ⌘ key or Meta key +VDn Vup Mut: Volume control +< #: ISO keys(in UK legend) +KP=: Keypad = for Mac +KP,: Brazilian Keypad Comma +JPY: Japanese Yen(¥) +RO: Japanese ろ(Ro) or Brazilian /(Slash) +MHEN: Japanese 無変換(Non Conversion) or Korean Hanja +HENK: Japanese 変換(Conversion) or Korean Hangul/English +KANA: Japanese かな(Hiragana/Katakana) +https://en.wikipedia.org/wiki/Keyboard_layout#Japanese +https://en.wikipedia.org/wiki/Keyboard_layout#Hangul_.28for_Korean.29 +*/ + + +when refering to keymapping physical matrix position needed to be translated into logical one on unimap +the translation is defined in unimap array + +row and col of unimap positon is encoded as follows +position = (row << 4) | col + +// table translates matrix to universal keymap +extern const uint8_t unimap_trans[MATRIX_ROWS][MATRIX_COLS];