summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErez Zukerman <bulk@ezuk.org>2016-01-23 14:17:44 -0500
committerErez Zukerman <bulk@ezuk.org>2016-01-23 14:17:44 -0500
commit85f72d322589e7c0ffceac5bb46f4b6cb537a8f1 (patch)
tree03a5935d6e840115900085c4b8cb0c01b78fa607
parent306f183b1c8ef6e33a7dafb0d8a89e5a7aebac69 (diff)
parent3e31fa4c50562b0d441262963ac6489351e7035d (diff)
Merge pull request #97 from DidierLoiseau/typematrix
TypeMatrix 2030 Layout for ErgoDox EZ
-rw-r--r--keyboard/ergodox_ez/keymaps/tm2030/README.md136
-rw-r--r--keyboard/ergodox_ez/keymaps/tm2030/keymap.c258
-rw-r--r--keyboard/ergodox_ez/keymaps/tm2030/keymap.hex1544
3 files changed, 1938 insertions, 0 deletions
diff --git a/keyboard/ergodox_ez/keymaps/tm2030/README.md b/keyboard/ergodox_ez/keymaps/tm2030/README.md
new file mode 100644
index 0000000000..096939dc28
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/tm2030/README.md
@@ -0,0 +1,136 @@
+# TypeMatrix™ 2030 inspired layout
+
+This is a [TypeMatrix™ 2030](http://typematrix.com/2030/features.php) inspired layout for the ErgoDox EZ. The _TypeMatrix_ is a nice small ergonomic keyboard with a matrix layout, and it provides several nice features like `enter`, `backspace` and `delete` at the center, bigger `shift` keys and international `cut`, `copy` and `paste` keys.
+
+The idea in this ErgoDox layout is to make it is as close as possible to the TM2030, such that it would be easy to switch between the TM and the ErgoDox. No _fancy_ features have been implemented, as this is intended to be a base for further customization if desired. Some keys have been duplicated in order to accomodate for most people.
+
+Most of the TM2030 features are supported except
+* automatic window switching (alt-tab key, at the left of the space key)
+* show desktop key (at the right of the space key)
+* 102/106 modes
+
+Dvorak mode is even supported by pressing [`Magic`](/TMK_README.md#magic-commands)+`1` (`Magic` is by default `LShift`+`RShift`)
+
+Some keys had to be moved around to fit into the ErgoDox, especially the `F1`-`F12` keys and the arrow keys.
+
+## Base Layer
+This is the default layer, close to the TM with the following differences:
+
+ - Top row (with the `F`-keys) and rightmost column (with application shortcuts) are removed, the corresponding keys are displaced elsewhere.
+ - Bottom-left keys are reorganized on a single row as: `Ctrl`, `fn`, `Gui`, `Play`, `App`/`Alt`.
+ - `shuffle` and `desktop` are not supported.
+ - `right-shift` is moved on `'`, `\` and on the right thumb (the latter is actually the only _true_ `right-shift`, and must be used in the `Magic` key combination).
+ - `right-ctrl` is moved on `End`.
+ - `]` is moved in place of the dash (`-`).
+ - Dash (`-`) and `=` are moved on bottom right row.
+ - Arrows and `PgUp`/`PgDn` are moved on the thumbs.
+
+```
+,--------------------------------------------------. ,--------------------------------------------------.
+| ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | ] |
+|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+| Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ |
+|--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------|
+| LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | '/Shift|
+|--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------|
+| LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift|
+`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ |LCtrl | fn | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl|
+ `-----------------------------------' `-----------------------------------'
+ ,--------------. ,-------------.
+ |Esc/Alt| num | | Left |Right |
+ ,------+-------+------| |------+------+------.
+ | | | PgUp | | Up | | |
+ |Space |LShift |------| |------|RShift|Space |
+ | | | PgDn | | Down | | |
+ `---------------------' `--------------------'
+```
+
+### Layer Switching
+- Use `num` to toggle the Numeric Layer.
+- Hold `fn` to temporarily activate the Numeric & Fn Layers.
+
+As on the original TM 2030, when `num` layer is activated, holding `fn` disables it but enables the other `fn` keys.
+
+## Dvorak Layer
+Same as Layer 0 but with _Dvorak_ layout, to use with QWERTY OS layout.
+
+Enable Dvorak layout with [`Magic`](/TMK_README.md#magic-commands+`1` (`LShift`+`RShift`+`1`), disable with `Magic`-`0`.
+
+The middle (green) led indicates when the Dvorak layer is activated.
+
+ ,--------------------------------------------------. ,--------------------------------------------------.
+ | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | = |
+ |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ | Tab | ' | , | . | P | Y |Backsp| |Backsp| F | G | C | R | L | / |
+ |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------|
+ | LShift | A | O | E | U | I |------| |------| D | H | T | N | S | -/Shift|
+ |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------|
+ | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | \/Shift|
+ `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ |LCtrl | fn | LGui | Play |App/Alt| | RAlt | [ | Home | ] |End/Ctl|
+ `-----------------------------------' `-----------------------------------'
+ ,--------------. ,-------------.
+ |Esc/Alt| num | | Left |Right |
+ ,------+-------+------| |------+------+------.
+ | | | PgUp | | Up | | |
+ |Space |LShift |------| |------|RShift|Space |
+ | | | PgDn | | Down | | |
+ `---------------------' `--------------------'
+
+## Numeric Layer
+Numeric layer close to the TM when toggling `num`, with the following differences:
+
+- Numpad is displaced by 1 to the top left.
+- Arrows are displaced by 1 to the left.
+- Provides access to `F1`-`F12`, `caps-lock` and `num-lock`.
+
+The numeric layer is indicated with the left (red) led. Caps-lock is indicated with the right (blue) led.
+
+ ,--------------------------------------------------. ,--------------------------------------------------.
+ | | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - |
+ |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ | | F6 | F7 | F8 | F9 | F10 | | | | | Home | 7 | 8 | 9 | + |
+ |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ | | F11 | F12 | | | |------| |------| Up | End | 4 | 5 | 6 | + |
+ |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ | | | | | | | | | Left | Down | Right| 1 | 2 | 3 |KpEnter |
+ `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | | | | | | | | 0 | 00 | . |Etr/Ctl|
+ `----------------------------------' `-----------------------------------'
+ ,-------------. ,-------------.
+ | | | |n.lock|c.lock|
+ ,------|------|------| |------+------+------.
+ | | | | | | | |
+ | | |------| |------| | |
+ | | | | | | | |
+ `--------------------' `--------------------'
+
+## Fn Layer
+Activated simultaneously with the Numeric layer when holding the `fn` key. As on the TM, it provides access to the following features:
+- `cut`, `copy` and `paste`
+- `volume up`, `volume down` and `mute` — as opposed to the TM, these are only on left hand
+- `previous track` and `next track`
+- `calculator`, `mail` and `browser home`
+- `insert`, `power`, `sleep`, `wake`, `print screen`, `scroll-lock` and `pause`
+
+Note: the `eject` key does not work due to jackhumbert/qmk_firmware#82
+
+ ,--------------------------------------------------. ,--------------------------------------------------.
+ | | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk|
+ |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ | | | | | | |VolUp | | | | | | | | Pause |
+ |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ | | | | Calc | Mail |Browsr|------| |------| | | | | | |
+ |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ | | | cut | copy |paste | Mute |VolDn | | | | | | | | |
+ `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | | | | | | | | | | | |
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | | | | | |
+ ,------|------|------| |------+------+------.
+ | | | | | Next | | |
+ | Mute | |------| |------| | |
+ | | | | | Prev | | |
+ `--------------------' `--------------------'
diff --git a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c
new file mode 100644
index 0000000000..cbdf0ae00e
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c
@@ -0,0 +1,258 @@
+/* TypeMatrix-2030-like keymap */
+#include "ergodox_ez.h"
+#include "debug.h"
+#include "action_layer.h"
+#include "led.h"
+
+#define BASE 0 // default layer
+#define DVRK 1 // Dvorak layer
+#define NUMR 8 // numeric layer
+#define FNLR 9 // fn layer
+
+#define MDBL0 1
+#define MFNLR 2
+#define MCUT 3
+#define MCOPY 4
+#define MPSTE 5
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Basic layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | ] |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ |
+ * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------|
+ * | LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | '/Shift|
+ * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------|
+ * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift|
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * |LCtrl | fn | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl|
+ * `-----------------------------------' `-----------------------------------'
+ * ,--------------. ,-------------.
+ * |Esc/Alt| num | | Left |Right |
+ * ,------+-------+------| |------+------+------.
+ * | | | PgUp | | Up | | |
+ * |Space |LShift |------| |------|RShift|Space |
+ * | | | PgDn | | Down | | |
+ * `---------------------' `--------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[BASE] = KEYMAP( // layer 0 : default
+ // left hand
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC,
+ KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT,
+ KC_LCTL, M(MFNLR), KC_LGUI,KC_MPLY,ALT_T(KC_APP),
+
+ ALT_T(KC_ESC), TG(NUMR),
+ KC_PGUP,
+ KC_SPC, KC_LSFT, KC_PGDN,
+
+ // right hand
+ KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC,
+ KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
+ KC_H, KC_J, KC_K, KC_L, KC_SCLN, SFT_T(KC_QUOT),
+ KC_ENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_BSLS),
+ KC_RALT, KC_MINS, KC_HOME, KC_EQL, CTL_T(KC_END),
+
+ KC_LEFT, KC_RGHT,
+ KC_UP,
+ KC_DOWN, KC_RSFT, KC_SPC
+ ),
+/* Dvorak layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | = |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | ' | , | . | P | Y |Backsp| |Backsp| F | G | C | R | L | / |
+ * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------|
+ * | LShift | A | O | E | U | I |------| |------| D | H | T | N | S | -/Shift|
+ * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------|
+ * | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | \/Shift|
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * |LCtrl | fn | LGui | Play |App/Alt| | RAlt | [ | Home | ] |End/Ctl|
+ * `-----------------------------------' `-----------------------------------'
+ * ,--------------. ,-------------.
+ * |Esc/Alt| num | | Left |Right |
+ * ,------+-------+------| |------+------+------.
+ * | | | PgUp | | Up | | |
+ * |Space |LShift |------| |------|RShift|Space |
+ * | | | PgDn | | Down | | |
+ * `---------------------' `--------------------'
+ */
+// If it accepts an argument (i.e, is a function), it doesn't need KC_.
+// Otherwise, it needs KC_*
+[DVRK] = KEYMAP( // layer 0 : default
+ // left hand
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT,
+ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_BSPC,
+ KC_LSFT, KC_A, KC_O, KC_E, KC_U, KC_I,
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_ENT,
+ KC_LCTL, M(MFNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP),
+
+ ALT_T(KC_ESC), TG(NUMR),
+ KC_PGUP,
+ KC_SPC, KC_LSFT, KC_PGDN,
+
+ // right hand
+ KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL,
+ KC_BSPC, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
+ KC_D, KC_H, KC_T, KC_N, KC_S, SFT_T(KC_MINS),
+ KC_ENT, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_T(KC_BSLS),
+ KC_RALT, KC_LBRC, KC_HOME, KC_RBRC, CTL_T(KC_END),
+
+ KC_LEFT, KC_RGHT,
+ KC_UP,
+ KC_DOWN, KC_RSFT, KC_SPC
+ ),
+/* Numeric Layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | F6 | F7 | F8 | F9 | F10 | | | | | Home | 7 | 8 | 9 | + |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | F11 | F12 | | | |------| |------| Up | End | 4 | 5 | 6 | + |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | | | | | | | | Left | Down | Right| 1 | 2 | 3 |KpEnter |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | 0 | 00 | . |Etr/Ctl|
+ * `----------------------------------' `-----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | |n.lock|c.lock|
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ */
+// SYMBOLS
+[NUMR] = KEYMAP(
+ // left hand
+ KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
+ KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS,
+ KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+
+ KC_TRNS,KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS,KC_TRNS,
+ // right hand
+ KC_INS, KC_F6, KC_F7, KC_TAB, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TRNS, KC_TRNS, KC_HOME, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_UP, KC_END, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LEFT, KC_DOWN, KC_RGHT, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_TRNS, KC_P0, M(MDBL0),KC_PDOT, CTL_T(KC_PENT),
+
+ KC_NLCK, KC_CAPS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/* fn layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk|
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | | | | | |VolUp | | | | | | | | Pause |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | | | Calc | Mail |Browsr|------| |------| | | | | | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | | cut | copy |paste | Mute |VolDn | | | | | | | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | Next | | |
+ * | Mute | |------| |------| | |
+ * | | | | | Prev | | |
+ * `--------------------' `--------------------'
+ */
+// MEDIA AND MOUSE
+[FNLR] = KEYMAP(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM,
+ KC_TRNS, KC_TRNS, M(MCUT), M(MCOPY), M(MPSTE), KC_MUTE, KC_VOLD,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_MUTE, KC_TRNS, KC_TRNS,
+ // right hand
+ KC_INS, KC_EJCT, KC_PWR, KC_SLEP, KC_WAKE, KC_PSCR, KC_SLCK,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+
+ KC_TRNS, KC_TRNS,
+ KC_MPRV,
+ KC_MNXT, KC_TRNS, KC_TRNS
+),
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case MDBL0:
+ if (record->event.pressed) {
+ return MACRO( I(25), T(P0), T(P0), END );
+ }
+ break;
+ case MFNLR:
+ layer_state ^= (1 << NUMR) | (1 << FNLR);
+ break;
+ case MCUT:
+ if (record->event.pressed) {
+ return MACRO(D(LSFT), T(DELT), U(LSFT), END);
+ }
+ break;
+ case MCOPY:
+ if (record->event.pressed) {
+ return MACRO(D(LCTL), T(INS), U(LCTL), END);
+ }
+ break;
+ case MPSTE:
+ if (record->event.pressed) {
+ return MACRO(D(LSFT), T(INS), U(LSFT), END);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void * matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void * matrix_scan_user(void) {
+
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ // led 1: numeric layer
+ if (layer_state & (1 << NUMR)) {
+ ergodox_right_led_1_on();
+ }
+ // led 2: Dvorak layer
+ if (default_layer_state == 1 << DVRK) {
+ ergodox_right_led_2_on();
+ }
+ // led 3: caps lock
+ if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {
+ ergodox_right_led_3_on();
+ }
+};
diff --git a/keyboard/ergodox_ez/keymaps/tm2030/keymap.hex b/keyboard/ergodox_ez/keymaps/tm2030/keymap.hex
new file mode 100644
index 0000000000..7e1118e3b2
--- /dev/null
+++ b/keyboard/ergodox_ez/keymaps/tm2030/keymap.hex
@@ -0,0 +1,1544 @@
+:100000000C9462090C94A6090C94A6090C94A609F8
+:100010000C94A6090C94A6090C94A6090C94A609A4
+:100020000C94A6090C94A6090C94F4140C94C6150F
+:100030000C94A6090C94A6090C94A6090C94A60984
+:100040000C94A6090C94472E0C94A6090C94A609AE
+:100050000C94A6090C944E240C94A6090C94A609A1
+:100060000C94A6090C94A6090C94A6090C94A60954
+:100070000C94A6090C94A6090C94A6090C94A60944
+:100080000C94A6090C94A6090C94A6090C94A60934
+:100090000C94A6090C94A6090C94A6090C94A60924
+:1000A0000C94A6090C94A6090C94A6092B164D16BF
+:1000B00038174D1638178F16B216381707171A1734
+:1000C000681A681A961A961AD81A141B141D141D49
+:1000D0002C1B141D231C231CEE1C141D141D021D9F
+:1000E00001E10149024902E10001E001490249023E
+:1000F000E00001E1014C024C02E1007519016202CD
+:1001000062016202620035002B00E100E100E000C4
+:1001100000001E00140004001D0002304E001F00ED
+:100120001A0016001B00E300E10020000800070091
+:100130000600AE002C0021001500090019006574AE
+:100140004B00220017000A000500000029744C0033
+:100150002A0000002800000008544C002A0000007B
+:1001600028000000500023001C000B0011000000BC
+:100170004F00240018000D001000E600520025007A
+:100180000C000E0036002D002C00260012000F007F
+:1001900037004A00E50027001300330038002E0026
+:1001A000510030002F00347231724D710000350063
+:1001B0002B00E100E100E00000001E00340004001C
+:1001C000330002304E001F00360012001400E3001E
+:1001D000E1002000370008000D00AE002C002100D7
+:1001E000130018000E0065744B0022001C000C0068
+:1001F0001B00000029744C002A00000028000000A9
+:1002000008544C002A000000280000005000230081
+:1002100009000700050000004F0024000A000B0041
+:100220001000E60052002500060017001A002F00FB
+:100230002C0026001500110019004A00E5002700D7
+:100240000F0016001D00300051002E0038002D72E6
+:1002500031724D710000000000000000000000003D
+:10026000000000000000000000000000000000008E
+:10027000000000000000000000000000000000007E
+:10028000000000000000000000000000000000006E
+:10029000000000000000000000000000000000005E
+:1002A000000000000000000000000000000000004E
+:1002B000000000000000000000000000000000003E
+:1002C000000000000000000000000000000000002E
+:1002D000000000000000000000000000000000001E
+:1002E000000000000000000000000000000000000E
+:1002F00000000000000000000000000000000000FE
+:1003000000000000000000000000000000000000ED
+:1003100000000000000000000000000000000000DD
+:1003200000000000000000000000000000000000CD
+:1003300000000000000000000000000000000000BD
+:1003400000000000000000000000000000000000AD
+:10035000000000000000000000000000000000009D
+:10036000000000000000000000000000000000008D
+:10037000000000000000000000000000000000007D
+:10038000000000000000000000000000000000006D
+:10039000000000000000000000000000000000005D
+:1003A000000000000000000000000000000000004D
+:1003B000000000000000000000000000000000003D
+:1003C000000000000000000000000000000000002D
+:1003D000000000000000000000000000000000001D
+:1003E000000000000000000000000000000000000D
+:1003F00000000000000000000000000000000000FD
+:1004000000000000000000000000000000000000EC
+:1004100000000000000000000000000000000000DC
+:1004200000000000000000000000000000000000CC
+:1004300000000000000000000000000000000000BC
+:1004400000000000000000000000000000000000AC
+:10045000000000000000000000000000000000009C
+:10046000000000000000000000000000000000008C
+:10047000000000000000000000000000000000007C
+:10048000000000000000000000000000000000006C
+:10049000000000000000000000000000000000005C
+:1004A000000000000000000000000000000000004C
+:1004B000000000000000000000000000000000003C
+:1004C000000000000000000000000000000000002C
+:1004D000000000000000000000000000000000001C
+:1004E000000000000000000000000000000000000C
+:1004F00000000000000000000000000000000000FC
+:1005000000000000000000000000000000000000EB
+:1005100000000000000000000000000000000000DB
+:1005200000000000000000000000000000000000CB
+:1005300000000000000000000000000000000000BB
+:1005400000000000000000000000000000000000AB
+:10055000000000000000000000000000000000009B
+:10056000000000000000000000000000000000008B
+:10057000000000000000000000000000000000007B
+:10058000000000000000000000000000000000006B
+:10059000000000000000000000000000000000005B
+:1005A000000000000000000000000000000000004B
+:1005B000000000000000000000000000000000003B
+:1005C000000000000000000000000000000000002B
+:1005D000000000000000000000000000000000001B
+:1005E000000000000000000000000000000000000B
+:1005F00000000000000000000000000000000000FB
+:1006000000000000000000000000000000000000EA
+:1006100000000000000000000000000000000000DA
+:1006200000000000000000000000000000000000CA
+:1006300000000000000000000000000000000000BA
+:1006400000000000000001000100010001000100A5
+:1006500000003A003F0044000100010001003B009F
+:10066000400045000100010001003C004100010084
+:100670000100010001003D004200010001000100F5
+:1006800001003E00430001000100000001000100E4
+:10069000010000000100000001004900010000000D
+:1006A0005000000053003F000100520051000000C4
+:1006B000390040004A004D004F00010001002B00AE
+:1006C0005F005C00590062000100540060005D00A2
+:1006D0005A0001300100550061005E005B006300BC
+:1006E00001005600570057005800587100000100E3
+:1006F00001000100010001000000010001000100F3
+:1007000001000100010001000100010003300100AF
+:10071000010001000100B20004300100A800010046
+:100720000100B10005300100010001000100B50029
+:10073000A800000001004900A9000000AA00000074
+:100740000100490001000000010000000100B000AC
+:1007500001000100010000000100A50001000100EE
+:1007600001000100AC00A600010001000100010031
+:100770000100A70001000100010001000100460086
+:100780000100010001000100AB004700480001002A
+:100790000100010000000A002530313662003A20D5
+:1007A0000025303258000A722F6320303132333442
+:1007B00035363738394142434445460A000A002558
+:1007C00030325800626F756E6365213A20006C65A7
+:1007D000667420736964652061747461636865641C
+:1007E0000A006C6566742073696465206E6F7420FE
+:1007F000726573706F6E64696E670A0074727969EE
+:100800006E6720746F207265736574206D6370323B
+:10081000333031380A000A44454255473A20656E64
+:1008200061626C65642E0A005B735D004B657962E2
+:100830006F6172642073746172742E0A005B575D7D
+:10084000005B535D005B525D005B445D005B435D9C
+:100850000016034500720067006F0044006F0078C7
+:1008600000200045005A0000001603450072006792
+:10087000006F0044006F007800200045005A00001F
+:10088000000403090409028D00050100A0FA09040F
+:1008900000000103010100092111010001223F00B4
+:1008A0000705810308000A09040100010301020091
+:1008B000092111010001224D000705820308000AE9
+:1008C00009040200010300000009211101000122B6
+:1008D00036000705830308000A0904030002030029
+:1008E00000000921110100012220000705840320D6
+:1008F00000010705040320000109040400010300AE
+:1009000000000921110100012239000705850310AB
+:1009100000011201100100000008EDFE07130100A4
+:100920000102000105010906A101050719E029E7F7
+:100930001500250195087501810205081901290591
+:10094000950575019102950175039101050719003F
+:10095000297715002501957875018102C00631FFC0
+:100960000974A1010975150025FF952075088102FC
+:100970000976150025FF952075089102C00501092B
+:1009800080A101850216010026B7001A01002AB7CE
+:1009900000751095018100C0050C0901A1018503B6
+:1009A000160100269C021A01002A9C02751095016E
+:1009B0008100C005010902A1010901A10005091971
+:1009C000012905150025019505750181029501751F
+:1009D0000381010501093009311581257F950275D3
+:1009E00008810609381581257F950175088106055E
+:1009F0000C0A38021581257F950175088106C0C053
+:100A000005010906A101050719E029E715002501DF
+:100A10009508750181029501750881010508190184
+:100A20002905950575019102950175039101050749
+:100A3000190029FF150025FF950675088100C00AD9
+:100A4000002530325820006B6579626F6172645FF7
+:100A50007265706F72743A20000A002530325800B7
+:100A60006B6579626F6172645F7365745F6C6564F6
+:100A70003A200064656C5F6B65795F6269743A2047
+:100A800063616E27742064656C3A20253032580A01
+:100A9000006164645F6B65795F6269743A206361C9
+:100AA0006E2774206164643A20253032580A00644D
+:100AB0006F6E652E0A00626F6F676D6167696320F4
+:100AC0007363616E3A202E2E2E2000290A002575B0
+:100AD000002F002575005D28002564002000256496
+:100AE00000200025640020002564007C00253032B1
+:100AF00058006D6F7573656B6579205B62746E7CF1
+:100B0000782079207620685D287265702F61636C8B
+:100B1000293A205B006D6B5F776865656C5F74696F
+:100B20006D655F746F5F6D6178203D2025640A00FC
+:100B30006D6B5F776865656C5F6D61785F7370651D
+:100B40006564203D2025640A006D6B5F74696D65E6
+:100B50005F746F5F6D6178203D2025640A006D6BC6
+:100B60005F6D61785F7370656564203D2025640A60
+:100B7000006D6B5F696E74657276616C203D202537
+:100B8000640A006D6B5F64656C6179203D202564AB
+:100B90000A006D6B5F776865656C5F74696D655F92
+:100BA000746F5F6D6178203D2025640A006D6B5F76
+:100BB000776865656C5F6D61785F737065656420EB
+:100BC0003D2025640A006D6B5F74696D655F746F0D
+:100BD0005F6D6178203D2025640A006D6B5F6D615B
+:100BE000785F7370656564203D2025640A006D6B35
+:100BF0005F696E74657276616C203D2025640A0021
+:100C00006D6B5F64656C6179203D2025640A000A84
+:100C100000257500363A20776865656C5F74696DEC
+:100C2000655F746F5F6D61783A20000A002575007A
+:100C3000353A20776865656C5F6D61785F737065C4
+:100C400065643A20000A00257500343A2074696D05
+:100C5000655F746F5F6D61783A20000A002575004A
+:100C6000333A206D61785F73706565643A20000ADD
+:100C700000257500323A20696E74657276616C28C1
+:100C80006D73293A20000A00257500313A20646509
+:100C90006C6179282A31306D73293A20000A092DB8
+:100CA0002056616C756573202D0A004D3E004D2560
+:100CB000643E20003F007365742064656661756C56
+:100CC000740A00433E200077686572652064656C95
+:100CD00074613A20637572736F723D25642C2077BE
+:100CE0006865656C3D25640A536565206874747099
+:100CF0003A2F2F656E2E77696B6970656469612E76
+:100D00006F72672F77696B692F4D6F7573655F6BB6
+:100D10006579730A000A092D204D6F7573656B653F
+:100D200079202D0A4553432F713A09717569740A68
+:100D3000313A0964656C6179282A31306D73290A6A
+:100D4000323A09696E74657276616C286D73290A8E
+:100D5000333A096D61785F73706565640A343A09E6
+:100D600074696D655F746F5F6D61780A353A0977F4
+:100D70006865656C5F6D61785F73706565640A3680
+:100D80003A09776865656C5F74696D655F746F5F5C
+:100D90006D61780A0A703A097072696E7420766122
+:100DA0006C7565730A643A097365742064656661DD
+:100DB000756C74730A75703A092B310A646F776E1B
+:100DC0003A092D310A706775703A092B31300A7073
+:100DD00067646F776E3A092D31300A0A7370656562
+:100DE00064203D2064656C7461202A206D61785F09
+:100DF0007370656564202A202872657065617420AF
+:100E00002F2074696D655F746F5F6D6178290A00CA
+:100E10003F004D3E2000433E20004C25640A000A5E
+:100E2000092D20436F6E736F6C65202D0A45534367
+:100E30002F713A09717569740A6D3A096D6F75738E
+:100E4000656B65790A000A092D204D616769632089
+:100E50002D0A643A0964656275670A783A0964651F
+:100E6000627567206D61747269780A6B3A0964650E
+:100E7000627567206B6579626F6172640A6D3A0909
+:100E80006465627567206D6F7573650A763A0976D9
+:100E9000657273696F6E0A733A097374617475735E
+:100EA0000A633A09636F6E736F6C65206D6F6465DA
+:100EB0000A302D343A096C61796572302D34284638
+:100EC00031302D4634290A506175733A09626F6FCB
+:100ED000746C6F616465720A653A09656570726F5A
+:100EE0006D0A6E3A094E4B524F0A7A3A09736C6595
+:100EF0006570204C454420746573740A000A00250F
+:100F000075002E6E6B726F3A20000A002575002E58
+:100F1000737761705F6261636B736C6173685F624A
+:100F200061636B73706163653A20000A0025750088
+:100F30002E737761705F67726176655F6573633A80
+:100F400020000A002575002E6E6F5F6775693A20D4
+:100F5000000A002575002E737761705F72616C74F2
+:100F60005F726775693A20000A002575002E737755
+:100F700061705F6C616C745F6C6775693A20000A20
+:100F8000002575002E636170736C6F636B5F746F07
+:100F90005F636F6E74726F6C3A20000A00257500F3
+:100FA0002E737761705F636F6E74726F6C5F6361D5
+:100FB00070736C6F636B3A20000A00253032580062
+:100FC0006B65796D61705F636F6E6669672E7261C4
+:100FD000773A20000A002575002E6D6F7573653A0B
+:100FE00020000A002575002E6B6579626F617264BE
+:100FF0003A20000A002575002E6D61747269783AF6
+:1010000020000A002575002E656E61626C653A202D
+:10101000000A00253032580064656275675F636FAF
+:101020006E6669672E7261773A20000A00257500A6
+:1010300064656661756C745F6C617965723A2000F5
+:101040003F004E4B524F3A206F66660A004E4B529D
+:101050004F3A206F6E0A0074696D65725F636F7539
+:101060006E743A202530346C580A006B6579626FD3
+:101070006172645F6E6B726F3A2025580A006B656F
+:1010800079626F6172645F69646C653A2025580A01
+:10109000006B6579626F6172645F70726F746F6309
+:1010A0006F6C3A2025580A00686F73745F6B65791E
+:1010B000626F6172645F6C65647328293A202558F9
+:1010C0000A000A092D20537461747573202D0A00DB
+:1010D0004743433A20342E382E31204156522D4C6E
+:1010E0004942433A20312E382E3073766E204156D5
+:1010F000525F415243483A20617672350A004F50A0
+:1011000054494F4E533A204C55464120424F4F547C
+:101110004D41474943204D4F5553454B4559204577
+:10112000585452414B455920434F4E534F4C452044
+:10113000434F4D4D414E44204E4B524F203531329E
+:101140000A004255494C443A2065356638343035FA
+:101150002D6469727479202831373A34363A33393C
+:10116000204A616E2032332032303136290A00564F
+:1011700049443A20307846454544284572676F44D3
+:101180006F7820455A29205049443A20307831332D
+:101190003037284572676F446F7820455A292056AA
+:1011A00045523A203078303030310A0044455343BC
+:1011B0003A20742E6D2E6B2E206B6579626F6172F2
+:1011C00064206669726D7761726520666F72204572
+:1011D00072676F646F780A000A092D205665727372
+:1011E000696F6E202D0A000A6D6F7573653A206F66
+:1011F00066660A000A6D6F7573653A206F6E0A00A5
+:101200000A6B6579626F6172643A206F66660A00E4
+:101210000A6B6579626F6172643A206F6E0A000A28
+:101220006D61747269783A206F66660A000A6D61B2
+:10123000747269783A206F6E0A000A646562756795
+:101240003A206F6E0A000A64656275673A206F661D
+:10125000660A000A0A626F6F746C6F616465722EB1
+:101260002E2E2000433E20006565636F6E66696721
+:101270003A0A00536C656570204C454420746573D0
+:10128000740A0000000000000000000000000102DD
+:1012900004060A0F17202C3A4A5D71879DB3C7DAFE
+:1012A000E9F5FCFFFCF5E9DAC7B39D87715D4A3AC1
+:1012B0002C20170F0A0604020100000000000000A5
+:1012C0000000000011241FBECFEFDAE0DEBFCDBF6B
+:1012D00004B603FE24C08091F9019091FA01A09117
+:1012E000FB01B091FC018730904BA740B04BB9F4A3
+:1012F0001092F9011092FA011092FB011092FC0178
+:1013000014BE84B7877F84BF88E10FB6F8948093BA
+:101310006000109260000FBEE0E0FFE3099511E06D
+:10132000A0E0B1E0EAE2F0E602C005900D92AA3337
+:10133000B107D9F721E0AAE3B1E001C01D92A93FAE
+:10134000B207E1F70E942E120C9413300C940000A7
+:10135000FF93EF93E0913A01F0913B01309709F050
+:101360000995EF91FF910895FC018591803011F06E
+:10137000EFDFFBCF0895FF27E0E230E247FF0CC02C
+:10138000419597FF09C0EDE2609570958095909525
+:10139000611D711D811D911D27FF02C0219530E344
+:1013A00050E2AA27660F771F881F991FAA1FA4174C
+:1013B00010F0A41B63955A95A9F7AA3008F0A95F0D
+:1013C000A05DAF93F395611571058105910541F716
+:1013D000ED3211F4EF93F395F21718F43F93F39570
+:1013E000FBCF8F91B5DFFA95E1F70895E991F99177
+:1013F0008591803021F0853219F0AADFF9CF089568
+:1014000020E0E89455915532C1F3503311F46894BB
+:1014100055915A3348F4505390F3220F022E220F65
+:10142000220F200D250FF4CF0EF42195899199916B
+:10143000533619F3533729F1533559F1BC01882735
+:101440009927E8945C3621F4899199916894559193
+:10145000543639F446EF7EF077FF0DC08FEF9FEFE3
+:101460000AC055374AE039F0583540E121F052368C
+:1014700042E009F00895FF93EF937DDFEF91FF9134
+:10148000B7CFFF93EF93FC0181918030B9F360DF18
+:10149000FBCFFF93EF9368DFF1CFDF93CF93CDB70F
+:1014A000DEB72596A3DFCF91DF910895FC0163306D
+:1014B00019F1B8F46130D1F0623081F58091BC014E
+:1014C0009091BD01A091BE01B091BF0123E0922790
+:1014D0008093BC019093BD01A093BE01B093BF0166
+:1014E0001DC0643079F0653099F018C0828188237E
+:1014F000A9F08BEF90E008958281882379F082EF44
+:1015000090E008958281882349F089EE90E0089563
+:101510008281882319F080EE90E0089580E090E0C9
+:101520000895089556985E9825982D9826982E9897
+:1015300027982F988091BC019091BD01A091BE0188
+:10154000B091BF0190FF02C0259A2D9A8091C001F1
+:101550009091C101A091C201B091C30