diff options
28 files changed, 5250 insertions, 950 deletions
diff --git a/keyboard/atomic/keymaps/pvc/config.h b/keyboard/atomic/keymaps/pvc/config.h index cc92634646..034bc5dc5c 100644 --- a/keyboard/atomic/keymaps/pvc/config.h +++ b/keyboard/atomic/keymaps/pvc/config.h @@ -158,4 +158,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION + +//#define VIBRATO_ENABLE +//#define VIBRATO_STRENGTH_ENABLE + + #endif diff --git a/keyboard/atomic/keymaps/pvc/keymap.c b/keyboard/atomic/keymaps/pvc/keymap.c index e17c41e23d..3d604a868e 100644 --- a/keyboard/atomic/keymaps/pvc/keymap.c +++ b/keyboard/atomic/keymaps/pvc/keymap.c @@ -11,8 +11,8 @@ #define LAYER_QWERTY 0 #define LAYER_COLEMAK 1 #define LAYER_DVORAK 2 -#define LAYER_LOWER 3 -#define LAYER_RAISE 4 +#define LAYER_RAISE 3 +#define LAYER_LOWER 4 #define LAYER_FUNCTION 5 #define LAYER_MOUSE 6 #define LAYER_MUSIC 7 @@ -21,8 +21,8 @@ #define MACRO_QWERTY 0 #define MACRO_COLEMAK 1 #define MACRO_DVORAK 2 -#define MACRO_LOWER 3 -#define MACRO_RAISE 4 +#define MACRO_RAISE 3 +#define MACRO_LOWER 4 #define MACRO_FUNCTION 5 #define MACRO_MOUSE 6 #define MACRO_TIMBRE_1 7 @@ -42,8 +42,8 @@ #define M_QWRTY M(MACRO_QWERTY) #define M_COLMK M(MACRO_COLEMAK) #define M_DVORK M(MACRO_DVORAK) -#define M_LOWER M(MACRO_LOWER) #define M_RAISE M(MACRO_RAISE) +#define M_LOWER M(MACRO_LOWER) #define M_FUNCT M(MACRO_FUNCTION) #define M_MOUSE M(MACRO_MOUSE) #define TIMBR_1 M(MACRO_TIMBRE_1) @@ -148,23 +148,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_RALT, KC_RGUI, KC_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT }, }, + [LAYER_RAISE] = { /* RAISED */ + { KC_TILD, KC_PSCR, KC_PAUS, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ________________ }, + { _______, KC_F1, KC_F2, KC_F3, KC_F4, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS }, + { _______, KC_F5, KC_F6, KC_F7, KC_F8, _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME }, + { _______, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, ________________, _______, KC_END }, + { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______ }, + }, [LAYER_LOWER] = { /* LOWERED */ { KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ________________ }, - { _______, _______, _______, _______, SC_CCLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME }, - { _______, SC_REDO, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, _______, KC_END }, + { _______, KC_F13, KC_F14, KC_F15, KC_F16, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS }, + { _______, KC_F17, KC_F18, KC_F19, KC_F20, _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME }, + { _______, KC_F21, KC_F22, KC_F23, KC_F24, _______, _______, _______, _______, _______, _______, ________________, _______, KC_END }, { _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______, _______, _______, _______ }, }, - [LAYER_RAISE] = { /* RAISED */ - { KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ________________ }, - { _______, _______, _______, _______, SC_ACLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS }, - { _______, SC_SELA, SC_SAVE, _______, _______, _______, _______, _______, _______, _______, _______, _______, ________________, KC_HOME }, - { _______, SC_UNDO, SC_CUT, SC_COPY, SC_PSTE, _______, _______, _______, _______, _______, _______, ________________, _______, KC_END }, - { _______, _______, _______, _______, _______, ________________, _______, _______, _______, _______, _______, _______, _______, _______ }, - }, - [LAYER_FUNCTION] = { /* FUNCTION */ { KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ________________ }, { KC_SLCK, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, _______, KC_PAUS }, @@ -281,28 +280,28 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } break; - case MACRO_LOWER: + case MACRO_RAISE: if (record->event.pressed) { - layer_on(LAYER_LOWER); + layer_on(LAYER_RAISE); update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST); } else { - layer_off(LAYER_LOWER); + layer_off(LAYER_RAISE); update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST); } break; - case MACRO_RAISE: + case MACRO_LOWER: if (record->event.pressed) { - layer_on(LAYER_RAISE); + layer_on(LAYER_LOWER); update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST); } else { - layer_off(LAYER_RAISE); + layer_off(LAYER_LOWER); update_tri_layer(LAYER_LOWER, LAYER_RAISE, LAYER_ADJUST); } break; @@ -468,36 +467,40 @@ void led_set_user(uint8_t usb_led) _delay_ms(10); // gets rid of tick - if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK))) - { - // If CAPS LK LED is turning on... - PLAY_NOTE_ARRAY(tone_caps_on, false, LEGATO); - } - else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK))) - { - // If CAPS LK LED is turning off... - PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO); - } - else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK))) - { - // If NUM LK LED is turning on... - PLAY_NOTE_ARRAY(tone_numlk_on, false, LEGATO); - } - else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK))) - { - // If NUM LED is turning off... - PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO); - } - else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK))) - { - // If SCROLL LK LED is turning on... - PLAY_NOTE_ARRAY(tone_scroll_on, false, LEGATO); - } - else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK))) - { - // If SCROLL LED is turning off... - PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO); - } + if (!is_playing_notes()) + { + if ((usb_led & (1<<USB_LED_CAPS_LOCK)) && !(old_usb_led & (1<<USB_LED_CAPS_LOCK))) + { + // If CAPS LK LED is turning on... + PLAY_NOTE_ARRAY(tone_caps_on, false, LEGATO); + } + else if (!(usb_led & (1<<USB_LED_CAPS_LOCK)) && (old_usb_led & (1<<USB_LED_CAPS_LOCK))) + { + // If CAPS LK LED is turning off... + PLAY_NOTE_ARRAY(tone_caps_off, false, LEGATO); + } + else if ((usb_led & (1<<USB_LED_NUM_LOCK)) && !(old_usb_led & (1<<USB_LED_NUM_LOCK))) + { + // If NUM LK LED is turning on... + PLAY_NOTE_ARRAY(tone_numlk_on, false, LEGATO); + } + else if (!(usb_led & (1<<USB_LED_NUM_LOCK)) && (old_usb_led & (1<<USB_LED_NUM_LOCK))) + { + // If NUM LED is turning off... + PLAY_NOTE_ARRAY(tone_numlk_off, false, LEGATO); + } + else if ((usb_led & (1<<USB_LED_SCROLL_LOCK)) && !(old_usb_led & (1<<USB_LED_SCROLL_LOCK))) + { + // If SCROLL LK LED is turning on... + PLAY_NOTE_ARRAY(tone_scroll_on, false, LEGATO); + } + else if (!(usb_led & (1<<USB_LED_SCROLL_LOCK)) && (old_usb_led & (1<<USB_LED_SCROLL_LOCK))) + { + // If SCROLL LED is turning off... + PLAY_NOTE_ARRAY(tone_scroll_off, false, LEGATO); + } + } + old_usb_led = usb_led; } diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/keymap.c b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/keymap.c new file mode 100644 index 0000000000..e23c5a1d6a --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/keymap.c @@ -0,0 +1,45 @@ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" + +#define BASE 0 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [BASE] = KEYMAP( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F5, + KC_TAB, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_BSLS, + CTL_T(KC_ESC), KC_A, KC_S, KC_E, KC_T, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, + KC_F1, KC_F2, KC_F3, KC_F4, KC_LGUI, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLD, KC_MUTE, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLU, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_BSPC, CTL_T(KC_ESC), KC_LALT, + // + /*-*/ KC_F6, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, + /*-*/ KC_NO, KC_J, KC_U, KC_R, KC_L, KC_SCLN, KC_MINS, + /*-*/ /*-*/ KC_Y, KC_N, KC_I, KC_O, KC_H, KC_ENT, + /*-*/ KC_RBRC, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + /*-*/ /*-*/ /*-*/ KC_RGUI, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, + KC_MPLY, KC_MNXT, + KC_MPRV, + KC_RALT, KC_QUOT, KC_SPC + ) +}; + +const uint16_t PROGMEM fn_actions[] = { +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { +}; diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/readme.md b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/readme.md new file mode 100644 index 0000000000..80475ab21e --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/readme.md @@ -0,0 +1,28 @@ +# Roman's Layout + +There is only one layer based on [Norman layout](https://normanlayout.info/). + +Looking for multiple-layer layouts? + +- [Symbols, arrows, plover, HJKL arrows](../romanzolotarev-norman-plover-osx-hjkl/) +- [Same with IJKL arrows](../romanzolotarev-norman-plover-osx/) + +[![keyboard-layout](romanzolotarev-norman-osx.png)](http://www.keyboard-layout-editor.com/#/gists/9e89d54f1ea6eeeb7dab1b2d19d28195) + +## Functional Keys + +- Tap `F1` to mute microphone via [Shush](http://mizage.com/shush/). +- Tap `F2` to copy screenshot to the clipboard. +- Hold `SHIFT` and tap `F2` to save screenshot as a file. +- Tap `F3`, `F4`, `F5`, `F6` to resize a window via [Divvy](http://mizage.com/divvy/). + +## CTRL/ESC + +CTRL and ESC are frequently used in Vim. + +- Tap `CTRL/ESC` to send `ESC`. +- Hold `CTRL/ESC` to use as `CTRL`. + +## Activate N-rollover + +- Hold left `SHIFT` and right `SHIRT` and then tap `N`. diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.hex b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.hex new file mode 100644 index 0000000000..1be94c43d1 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.hex @@ -0,0 +1,1092 @@ +:100000000C94BB010C94FF010C94FF010C94FF01B4
+:100010000C94FF010C94FF010C94FF010C94FF0160
+:100020000C94FF010C94FF010C94E20A0C94B40BA5
+:100030000C94FF010C94FF010C94FF010C94FF0140
+:100040000C94FF010C9432200C94FF010C94FF01DE
+:100050000C94FF010C94BD190C94FF010C94FF014A
+:100060000C94FF010C94FF010C94FF010C94FF0110
+:100070000C94FF010C94FF010C94FF010C94FF0100
+:100080000C94FF010C94FF010C94FF010C94FF01F0
+:100090000C94FF010C94FF010C94FF010C94FF01E0
+:1000A0000C94FF010C94FF010C94FF01210C430CF4
+:1000B000310D430C310D880CAB0C310D000D130DBF
+:1000C000FF0FFF0F3C103C107F10BD10D612D61250
+:1000D000D610D612D711D711AA12D612D612C11223
+:1000E00035002B002971E1003A0000001E001400C9
+:1000F00004001D003B00E2001F001A0016001B0058
+:100100003C00297120000700080006003D002A007D
+:100110002100090017001900E300A90022000E00C9
+:100120000A0005000000AA003E00310000002F0078
+:100130000000A8003F000000000030000000AE00FA
+:1001400023000D001C0013000000AB002400180069
+:1001500011001000E700AC00250015000C0036006F
+:1001600050002C0026000F00120037005100340010
+:10017000270033000B0038005200E6002E002D004F
+:100180002800E5004F0000001603450072006700DC
+:100190006F0044006F007800200045005A00000006
+:1001A00016034500720067006F0044006F0078007E
+:1001B000200045005A0000000403090409026D00F4
+:1001C000040100A0FA090400000103010100092153
+:1001D00011010001223F000705810308000A0904FC
+:1001E00001000103010200092111010001224D005B
+:1001F0000705820308000A09040200010300000049
+:100200000921110100012236000705830308000AB5
+:10021000090403000103000000092111010001226B
+:1002200039000705840310000112011001000000CD
+:1002300008EDFE071301000102000105010906A1F6
+:1002400001050719E029E7150025019508750181C9
+:100250000205081901290595057501910295017599
+:100260000391010507190029771500250195787577
+:10027000018102C005010980A10185021601002645
+:10028000B7001A01002AB700751095018100C0055A
+:100290000C0901A1018503160100269C021A010028
+:1002A0002A9C02751095018100C005010902A10177
+:1002B0000901A10005091901290515002501950568
+:1002C000750181029501750381010501093009312C
+:1002D0001581257F95027508810609381581257FCE
+:1002E000950175088106050C0A38021581257F9550
+:1002F0000175088106C0C005010906A1010507199D
+:10030000E029E71500250195087501810295017521
+:1003100008810105081901290595057501910295C6
+:1003200001750391010507190029FF150025FF95A7
+:100330000675088100C000000000000000000000F9
+:1003400000010204060A0F17202C3A4A5D71879DAE
+:10035000B3C7DAE9F5FCFFFCF5E9DAC7B39D8771AD
+:100360005D4A3A2C20170F0A060402010000000023
+:1003700000000000000011241FBECFEFDAE0DEBF56
+:10038000CDBF04B603FE24C08091EF019091F0012F
+:10039000A091F101B091F2018730904BA740B04B92
+:1003A000B9F41092EF011092F0011092F101109245
+:1003B000F20114BE84B7877F84BF88E10FB6F8943A
+:1003C00080936000109260000FBEE0E0FFE30995AB
+:1003D00011E0A0E0B1E0E8EEF3E402C005900D9278
+:1003E000A433B107D9F711E0A4E3B1E001C01D9235
+:1003F000AF3EB107E1F70E9426080C94F2210C945D
+:100400000000089556985E9825982D9826982E9865
+:1004100027982F98089508950C940B0256985E988B
+:1004200025982D9826982E9827982F988FEF90E052
+:10043000909389008093880090938B0080938A002A
+:1004400090938D0080938C00259A2D9A2FEF80E752
+:1004500092E0215080409040E1F700C00000269AD1
+:100460002E9A2FEF80E792E0215080409040E1F7F4
+:1004700000C00000279A2F9A2FEF80E792E02150CA
+:1004800080409040E1F700C0000025982D982FEFA4
+:1004900080E792E0215080409040E1F700C00000EA
+:1004A00026982E982FEF80E792E0215080409040D0
+:1004B000E1F700C0000027982F9856985E9825987D
+:1004C0002D9826982E9827982F98089589EA80933A
+:1004D000800089E08093810024982C983F988AB10D
+:1004E0008F748AB96E98479A8BB1806B8BB9769A64
+:1004F0000E940E020C94020280E28093000180911F
+:10050000340181110EC00E94CB0281E0809334013E
+:100510002FEF83ED90E3215080409040E1F700C041
+:10052000000080E40E94D1028093000181112EC05E
+:100530000E94FB0280930001811128C00E94FB02EF
+:1005400080930001811122C08FE30E94FB028093FF
+:10055000000181111BC00E94F30280E40E94D102BD
+:1005600080930001811112C08CE00E94FB028093F5
+:10057000000181110BC00E94FB02809300018111D8
+:1005800005C08FE30E94FB02809300010E94F302EA
+:100590008091000108951092B9008AE08093B8001C
+:1005A000089594EA9093BC009091BC0097FFFCCF13
+:1005B0009091B900987F983021F0903111F081E04E
+:1005C00008958093BB0084E88093BC008091BC00B8
+:1005D00087FFFCCF8091B900887F883111F080348B
+:1005E00071F780E0089584E98093BC008091BC009D
+:1005F00084FDFCCF08958093BB0084E88093BC0009
+:100600008091BC0087FFFCCF9091B900987F81E07A
+:10061000983209F480E0089584E88093BC008091CA
+:10062000BC0087FFFCCF8091BB0008958091000142
+:10063000811115C080E40E94D102809300018111D4
+:100640000CC082E10E94FB0280930001811105C071
+:100650008FEF0E94FB02809300010E94F30284B19D
+:10066000807F84B985B1807F85B98AB1837F8AB95B
+:100670008BB1837F8BB93E98469808950E947C0287
+:10068000809300010E94160380B38C7080BB81B3FD
+:10069000836F81BBA6E3B1E0E4E4F1E08EE08E0F6E
+:1006A00011921D928E13FCCF0C946602BF92CF92D2
+:1006B000DF92EF92FF920F931F93CF93DF9380917E
+:1006C0000001882379F0809135018F5F8093350197
+:1006D000811108C00E947C0280930001811102C038
+:1006E0000E940E0206E311E0C0E0D0E0DD24D394C6
+:1006F00082E0C82EEE24E394F12CC730D10500F53A
+:1007000080910001811164C080E40E94D102809335
+:100710000001811112C082E10E94FB02809300015E
+:1007200081110BC0C7010C2E01C0880F0A94EAF793
+:1007300080950E94FB02809300010E94F30248C052
+:10074000CA30A1F028F4C83059F0C93061F005C0B2
+:10075000CC3089F070F0CD3089F0209A289810C004
+:10076000219A29980DC0229A2A980AC0239A2B9878
+:1007700007C0529A01C0539A5B9802C03E9A4698AD
+:1007800090EA9A95F1F79FB1799902C082E001C091
+:1007900080E091709D25982B7C9902C084E001C077
+:1007A00080E0892B7D9902C038E001C030E0832BC6
+:1007B0007E9902C020E101C020E0822B9FB190957C
+:1007C000991F9927991F9295990F907E892B0FC099
+:1007D00080910001811149C080E40E94D102809380
+:1007E0000001882379F1B12C0E94F3028B2DF801CE
+:1007F0009081981719F08083C09201010E9416031E
+:1008000021960F5F1F4FCE30D10509F076CF809132
+:100810000101882361F1815080930101882339F01F
+:100820008FE99FE00197F1F700C0000020C0A4E429
+:10083000B1E0E6E3F1E0CF01825F91919D938E13E9
+:10084000FCCF15C083E10E94FB028093000181115F
+:10085000CACF81E40E94D102809300018111C3CFED
+:100860000E940C03B82EB094BFCF80E0C0CF0E948E
+:100870000C0281E0DF91CF911F910F91FF90EF90DB
+:10088000DF90CF90BF900895E82FF0E0EC5BFE4F33
+:100890008081089508958B3B910578F4883A9105FD
+:1008A00040F5853A9105D0F48430910508F0B1C047
+:1008B0008130910509F4ADC06BC0803E910508F40C
+:1008C00067C0883E910508F4A4C09C01205F3109EF
+:1008D0002031310508F05CC090650895853A910596
+:1008E00009F459C0863A910509F058C082E890E4AD
+:1008F0000895883A910509F454C0893A910509F49C
+:1009000053C08A3A910509F452C08B3A910509F413
+:1009100051C08C3A910509F450C08D3A910509F403
+:100920004FC0803B910509F44EC08E3A910509F401
+:100930004DC08F3A910509F44CC0813B910509F4F3
+:100940004BC0823B910509F44AC0833B910509F4F1
+:1009500049C0843B910509F448C0853B910509F4E1
+:1009600047C0863B910509F446C0873B910509F4D1
+:1009700045C0883B910509F444C0893B910509F4C1
+:1009800043C08A3B910509F442C080E094E4089595
+:1009900080E090E0089581E890E4089583E890E491
+:1009A000089582EE94E4089589EE94E408958AEE21
+:1009B00094E4089585EB94E4089586EB94E4089517
+:1009C00087EB94E408958CEC94E408958DEC94E422
+:1009D000089583E895E408958AE895E4089582E906
+:1009E00095E4089584E995E4089581E296E40895F4
+:1009F00083E296E4089584E296E4089585E296E41D
+:100A0000089586E296E4089587E296E408958AE2DE
+:100A100096E40895089596E0799FF001112494E5F5
+:100A2000899FE00DF11D1124E60FF11DEE0FFF1F50
+:100A3000E052FF4F859194910895880F991FFC0112
+:100A4000E05AF040859194910895880F991FFC0118
+:100A5000E052FF4F85919491089526E0729FF00136
+:100A6000112444E5849FE00DF11D1124E60FF11DD2
+:100A7000EE0FFF1FE052FF4F859194919C013A9534
+:100A800021154FE1340708F41CC13F5121153041B5
+:100A900020F49F700E94250508959C013053211574
+:100AA000304118F49927906C0895811520E592073C
+:100AB00071F40E94FA124FEF84E39CE041508040B1
+:100AC0009040E1F700C000000E94E219FAC08130B6
+:100AD00020E5920731F48091CD0181608093CD01B2
+:100AE000F0C09C0130552115304108F051C0292F2C
+:100AF00033272F70332721303105D9F4AC014370EF
+:100B0000552702C0220F331F4A95E2F73C68AC011B
+:100B100064E0440F551F6A95E1F744275370242B76
+:100B2000352B73E0880F991F7A95E1F78076992726
+:100B30001DC02230310529F4982F8827816F906AD3
+:100B4000089523303105A9F4AC014370552721E005
+:100B500030E002C0220F331F4A95E2F73C6843E0C1
+:100B6000880F991F4A95E1F7807E9770822B932B0F
+:100B7000089524303105E1F4AC014370552721E09C
+:100B800030E002C0220F331F4A95E2F73A68E7CF00
+:100B90009C0130572115304118F49F7090620895E0
+:100BA0009C0130582115304118F49F70906A0895C7
+:100BB000803E9105E0F4803C910558F58133910524
+:100BC00009F46FC048F48932910509F463C08A3290
+:100BD000910509F46DC072C089339105E9F082383E
+:100BE0009105D1F08533910509F44DC067C0833E6E
+:100BF000910581F138F4803E9105B9F0823E91056E
+:100C0000D9F05CC0863E910561F1873E9105A1F166
+:100C100055C00E941D0508952091E00120FD02C0ED
+:100C200021FF4CC080EE90E049C08091E00180FF40
+:100C3000F9CF89E390E042C08091E00182FF0EC0CD
+:100C40008091E00184FF03C080E090E037C083EE34
+:100C500090E034C08091E00182FFF2CF82EE90E01C
+:100C60002DC08091E00183FF0BC08091E00184FDE5
+:100C7000EBCF87EE90E022C08091E00183FFF5CFBB
+:100C800086EE90E01BC08091E00185FF07C089E2FD
+:100C900090E014C08091E00185FFF9CF85E390E0FA
+:100CA0000DC08091E00186FF07C08AE290E006C097
+:100CB0008091E00186FFF9CF81E390E00E944B0430
+:100CC0000895089508950C94620680916201089534
+:100CD000CF93DF9300D01F92CDB7DEB79C018091F8
+:100CE000E601843019F593E099833B832A8390933E
+:100CF000E9008FEF9091E800815095FD06C095EDD9
+:100D00009A95F1F700008111F5CF8091E80085FFF9
+:100D10000DC040E050E063E070E0CE0101960E941B
+:100D2000D2088091E8008E778093E8000F900F90B2
+:100D30000F90DF91CF910895CF93DF9300D01F9252
+:100D4000CDB7DEB72091E601243021F522E02983DA
+:100D50009B838A8383E08093E9008FEF9091E80082
+:100D6000815095FD06C095ED9A95F1F7000081112F
+:100D7000F5CF8091E80085FF0DC040E050E063E0D2
+:100D800070E0CE0101960E94D2088091E8008E7733
+:100D90008093E8000F900F900F90DF91CF9108950E
+:100DA0002091E6012430F1F422E02093E9002FEFB6
+:100DB0003091E800215035FD06C035ED3A95F1F748
+:100DC00000002111F5CF2091E80025FF0BC040E085
+:100DD00050E065E070E00E94D2088091E8008E77D4
+:100DE0008093E8000895CF93DF93EC019091E601A2
+:100DF000943009F046C080910C018823D9F080918D
+:100E00000D018823B9F09093E9008FEF9091E800ED
+:100E1000815095FD06C095E19A95F1F7000081118A
+:100E2000F5CF8091E80085FF2CC040E050E060E104
+:100E300070E017C081E08093E9008FEF9091E800A7
+:100E4000815095FD06C095ED9A95F1F7000081114E
+:100E5000F5CF8091E80085FF14C040E050E068E0E5
+:100E600070E0CE010E94D2088091E8008E778093D6
+:100E7000E80080E1FE01A2E5B1E001900D928A95C3
+:100E8000E1F7DF91CF9108958091E501811109C0CB
+:100E90000E94670A0E94C40A8091E20084608093E5
+:100EA000E20008951092E501089508950C941F2022
+:100EB0000E9478190E9425200E946A0D0C946306F6
+:100EC00042E061EC81E00E94E10942E061EC82E0F5
+:100ED0000E94E10942E061EC83E00E94E10942E105
+:100EE00061EC84E00C94E1098091E801833009F41D
+:100EF00055C030F4813071F0823009F48EC008950D
+:100F00008A3009F47AC08B3009F460C0893009F066
+:100F10009CC020C08091E701813A09F096C0809181
+:100F2000E800877F8093E8008091EB019091EC01CD
+:100F3000892B21F460E182E591E003C060E080E06C
+:100F400090E070E00E941D098091E8008B7780930B
+:100F5000E80008958091E701813209F076C0809120
+:100F6000EB019091EC01009719F0039709F06DC027
+:100F70008091E800877F8093E8008091E80082FDFF
+:100F800005C08091E6018111F8CF5FC08091F1002A
+:100F9000809362018091E8008B7753C08091E701D4
+:100FA000813A09F052C08091EB019091EC01892BBC
+:100FB00009F04BC08091E800877F8093E800809122
+:100FC000E80080FFFCCF80910C0136C08091E701E2
+:100FD0008132D9F58091EB019091EC01892BA9F533
+:100FE0008091E800877F8093E8000E94160A809134
+:100FF000E90180930C010C94FA128091E70181328F
+:1010000021F58091E800877F8093E8000E94160A0E
+:101010008091EA018093630108958091E701813A0C
+:10102000A1F48091E800877F8093E8008091E80038
+:1010300080FFFCCF809163018093F1008091E800F4
+:101040008E778093E8000C94160A089584B7877F02
+:1010500084BF88E10FB6F89480936000109260001E
+:101060000FBE90E080E80FB6F894809361009093F3
+:1010700061000FBE0E94B90D0E94670A0E94C40A57
+:101080008091E20084608093E20078940E944A0D8F
+:101090000E94BB0D82E091E00E94650D0E940D2030
+:1010A0008091E601853069F40E9439198091E4014C
+:1010B0008823B1F30E946419882391F30E94BC082D
+:1010C000EFCF0E94C10DECCF292F332723303105FC
+:1010D000C9F064F42130310581F02230310509F086
+:1010E00043C08DE690E02CEB31E042C02132310567
+:1010F000F1F02232310541F137C082E190E029E27E
+:1011000032E036C099278130910541F08230910557
+:1011100041F0892B49F5E8EBF1E005C0E0EAF1E0A8
+:1011200002C0E8E8F1E0849190E09F0121C06430C2
+:10113000D8F4E62FF0E0EE0FFF1FEE5DFE4F2081AA
+:10114000318189E090E014C0643070F470E0FB01FC
+:10115000EE0FFF1FE65EFE4F20813181FB01EA5E4C
+:10116000FE4F808190E004C080E090E020E030E01D
+:10117000FA0131832083089580E189BD82E189BD30
+:1011800009B400FEFDCF8091D8008F7D8093D800F8
+:101190008091E00082608093E0008091E00081FD1A
+:1011A000FCCF0895CF92DF92EF92FF920F931F939F
+:1011B000CF93DF93EC018B016A010E94350A811104
+:1011C00033C0C114D10439F0F60180819181081B2C
+:1011D000190BC80FD91FE12CF12C0115110519F1BC
+:1011E0008091E80085FD16C08091E8008E7780939D
+:1011F000E800C114D10449F0F60180819181E80E24
+:10120000F91EF182E08285E00FC00E94350A882332
+:1012100021F30AC089918093F10001501109FFEF79
+:10122000EF1AFF0ADACF80E0DF91CF911F910F9183
+:10123000FF90EF90DF90CF9008952091ED013091D5
+:10124000EE012617370748F06115710539F4209132
+:10125000E8002E772093E80001C0B90140E0611555
+:101260007105A9F12091E601222309F443C025303C
+:1012700009F442C02091E80023FD40C02091E8001D
+:1012800022FD32C02091E80020FFE9CF4091F30019
+:101290002091F20030E0342BFC01CF016115710583
+:1012A00059F02830310540F481918093F10061506C
+:1012B00071092F5F3F4FF1CF41E02830310509F030
+:1012C00040E02091E8002E772093E800C8CF41113C
+:1012D000C9CF0AC08091E601882361F0853061F0B2
+:1012E0008091E80083FD0AC08091E80082FFF2CF80
+:1012F00080E0089582E0089583E0089581E00895F4
+:101300002091ED013091EE012617370748F0611565
+:10131000710539F42091E8002E772093E80001C090
+:10132000B901FC0120E06115710591F18091E601A0
+:10133000882309F440C0853009F43FC08091E8005B
+:1013400083FD3DC08091E80082FD2FC08091E800C0
+:1013500080FFE9CF2091F3008091F20090E0922B82
+:101360006115710559F08830910540F4249120935E
+:10137000F1003196615071090196F2CF21E0089792
+:1013800009F020E08091E8008E778093E800CBCFD1
+:101390002111CCCF0AC08091E601882361F085300D
+:1013A00061F08091E80083FD0AC08091E80082FF2F
+:1013B000F2CF80E0089582E0089583E0089581E00F
+:1013C0000895982F973058F59093E900981739F0C1
+:1013D0007091EC002091ED005091F00003C0242F9B
+:1013E000762F50E021FF19C03091EB003E7F309303
+:1013F000EB003091ED003D7F3093ED003091EB003C
+:1014000031603093EB007093EC002093ED0050932B
+:10141000F0002091EE0027FF07C09F5FD3CF8F70B1
+:101420008093E90081E0089580E008958091E701CC
+:1014300087FF11C08091E80082FD05C08091E60120
+:101440008111F8CF11C08091E8008B770BC080919B
+:10145000E601882349F08091E80080FFF8CF809171
+:10146000E8008E778093E80008952091E4003091A1
+:10147000E50095E64091EC00842F817040FF22C08A
+:101480008091E80080FD1CC08091E601882391F0E6
+:10149000853091F08091EB0085FD10C04091E40013
+:1014A0005091E5004217530729F39A01915011F723
+:1014B00084E0089582E0089583E0089581E008952E
+:1014C00080E008954091E80042FFDECF08950E9439
+:1014D000D50A0E94DD0AE0EEF0E080818160808321
+:1014E000E8EDF0E080818F77808319BCA7EDB0E054
+:1014F0008C918E7F8C9380818F7E80831092E5010A
+:1015000008950F931F93CF93DF930E94D50A0E94F3
+:10151000DD0AC8EDD0E088818F7788838881806874
+:10152000888388818F7D888319BC1092E601109290
+:10153000E2011092E4011092E30100EE10E0F801E4
+:1015400080818B7F808388818160888342E060E036
+:1015500080E00E94E109E1EEF0E080818E7F8083EF
+:10156000E2EEF0E08081816080838081886080830A
+:10157000F80180818E7F8083888180618883DF91FC
+:10158000CF911F910F910895E8EDF0E080818F7E5B
+:101590008083E7EDF0E080818160808384E082BF1A
+:1015A00081E08093E5010C94810AE8EDF0E0808110
+:1015B0008E7F80831092E20008951092DA001092DC
+:1015C000E10008951F920F920FB60F9211242F93EE
+:1015D0003F934F935F936F937F938F939F93AF93BB
+:1015E000BF93EF93FF938091E10082FF0BC0809146
+:1015F000E20082FF07C08091E1008B7F8093E100D1
+:101600000E94490D8091DA0080FF1FC08091D800B0
+:1016100080FF1BC08091DA008E7F8093DA0080917A
+:10162000D90080FF0DC080E189BD82E189BD09B488
+:1016300000FEFDCF81E08093E6010E94440705C0D3
+:1016400019BC1092E6010E9452078091E10080FFD0
+:1016500019C08091E20080FF15C08091E2008E7F6A
+:101660008093E2008091E20080618093E2008091AB
+:10167000D80080628093D80019BC85E08093E60191
+:101680000E9456078091E10084FF30C08091E20003
+:1016900084FF2CC080E189BD82E189BD09B400FED0
+:1016A000FDCF8091D8008F7D8093D8008091E1009C
+:1016B0008F7E8093E1008091E2008F7E8093E20034
+:1016C0008091E20081608093E2008091E2018823B2
+:1016D00011F084E007C08091E30087FD02C081E043
+:1016E00001C083E08093E6010E9458078091E100E9
+:1016F00083FF29C08091E20083FF25C08091E10033
+:10170000877F8093E10082E08093E6011092E201FE
+:101710008091E1008E7F8093E1008091E2008E7FD6
+:101720008093E2008091E20080618093E20042E0D9
+:1017300060E080E00E94E1098091F0008860809381
+:10174000F0000E945507FF91EF91BF91AF919F91DB
+:101750008F917F916F915F914F913F912F910F905A
+:101760000FBE0F901F9018951F920F920FB60F92F9
+:1017700011242F933F934F935F936F937F938F9396
+:101780009F93AF93BF93CF93DF93EF93FF93C0915A
+:10179000E900CF708091EC00D82FD17080FDD0E8A7
+:1017A0001092E9008091F000877F8093F000789498
+:1017B0000E94F80B1092E9008091F00088608093FD
+:1017C000F000CD2BCF70C093E900FF91EF91DF9136
+:1017D000CF91BF91AF919F918F917F916F915F91C9
+:1017E0004F913F912F910F900FBE0F901F90189522
+:1017F0001F93CF93DF93CDB7DEB7AA970FB6F894B8
+:10180000DEBF0FBECDBFE7EEF1E088E08E0F909116
+:10181000F10091938E13FBCF0E9474078091E80032
+:1018200083FF1FC18091E7019091E801492F50E0AB
+:101830004A30510508F015C1FA01EA5AFF4F0C94DD
+:10184000A721803881F0823809F00BC18091EB012B
+:101850008F708093E9008091EB0085FB882780F9E9
+:101860001092E90006C08091E3019091E40191118A
+:1018700082609091E800977F9093E8008093F10058
+:101880001092F100C8C0282F2D7F09F0EAC08823EC
+:1018900019F0823061F0E5C08091E901813009F0F2
+:1018A000E0C0933009F080E08093E4012BC0809188
+:1018B000E901811127C08091EB018F7009F4D1C03B
+:1018C0008093E9002091EB0020FF1CC0933021F4AD
+:1018D0008091EB00806214C09091EB009061909336
+:1018E000EB0021E030E0A90102C0440F551F8A95AA
+:1018F000E2F74093EA001092EA008091EB008860E2
+:101900008093EB001092E9008091E800877F86C009
+:101910008111A7C01091E9011F778091E3008078C1
+:10192000812B8093E3008091E800877F8093E8001B
+:101930000E94160A8091E80080FFFCCF8091E300AE
+:1019400080688093E300111102C082E001C083E04F
+:101950008093E60186C08058823008F082C0809172
+:10196000E9019091EA018C3D53E0950779F583E018
+:101970008A838AE289834FB7F894DE01139620E0C8
+:101980003EE051E2E32FF0E050935700E49120FF56
+:1019900003C0E295EF703F5FEF708E2F90E0EA306A
+:1019A00010F0C79601C0C0968D939D932F5F243190
+:1019B00049F74FBF8091E800877F8093E8006AE293
+:1019C00070E0CE0101960E941D0914C0AE014F5F68
+:1019D0005F4F6091EB010E946408BC01892B09F400
+:1019E00040C09091E800977F9093E80089819A81A8
+:1019F0000E9480098091E8008B778093E80031C0D5
+:101A0000803879F58091E800877F8093E8008091A5
+:101A1000E2018093F1008091E8008E778093E800E6
+:101A20000E94160A1EC081111CC09091E9019230DB
+:101A3000C0F48091E800877F8093E8009093E201F2
+:101A40000E94160A8091E201811106C08091E30094
+:101A500087FD02C081E001C084E08093E6010E941E
+:101A600060078091E80083FF0AC08091E800877FCB
+:101A70008093E8008091EB0080628093EB00AA964F
+:101A80000FB6F894DEBF0FBECDBFDF91CF911F918F
+:101A900008950895CF938091E6018823A1F0C09125
+:101AA000E900CF709091EC00892F817090FD80E863
+:101AB000C82B1092E9008091E80083FD0E94F80B8A
+:101AC000CF70C093E900CF910895909369018093FE
+:101AD00068010895E0916801F0916901309721F063
+:101AE0000190F081E02D099480E00895E091680173
+:101AF000F0916901309721F00280F381E02D099483
+:101B00000895E0916801F0916901309721F0048017
+:101B1000F581E02D099408952091660130916701C7
+:101B20008217930771F09093670180936601E091AB
+:101B30006801F0916901309721F00680F781E02D6E
+:101B400009940895209164013091650182179307EB
+:101B500071F09093650180936401E0916801F091C8
+:101B60006901309721F00084F185E02D09940895F2
+:101B700008950C94B80D0E947E190E943E030C94A7
+:101B8000441ACF92DF92EF92FF920F931F93CF935D
+:101B9000DF93CDB7DEB72B970FB6F894DEBF0FBE3D
+:101BA000CDBF0E9456038BE6C82E81E0D82E00E000
+:101BB00010E0E02E802F0E944404F60141916F0155
+:101BC000F42EF826B1F40F5F1F4F0E30110589F780
+:101BD0008FEF89838A831B820E9487198160782F07
+:101BE0009D838C8349815A816B818D810E94640E13
+:101BF00040C09091CD0191FF04C08B870E944A04A0
+:101C00008B8520E030E04F2D50E0922FBA01022E5C
+:101C100002C0759567950A94E2F760FF24C02E8391
+:101C2000EF8221E030E0690102C0CC0CDD1C9A9506
+:101C3000E2F790E08C219D21892B09F420E0288790
+:101C40000E9487198160782F9A8789874E815F81EA
+:101C500068858A850E94640EF801E559FE4F8081EF
+:101C6000C826C08206C02F5F3F4F2630310569F677
+:101C7000AACF0E942B1D10916A010E946A0D1817AD
+:101C8000A1F00E946A0D80936A012B960FB6F8941A
+:101C9000DEBF0FBECDBFDF91CF911F910F91FF909F
+:101CA000EF90DF90CF900C9463062B960FB6F894CC
+:101CB000DEBF0FBECDBFDF91CF911F910F91FF907F
+:101CC000EF90DF90CF900895CF93DF93CDB7DEB73D
+:101CD0002B970FB6F894DEBF0FBECDBF4F8358874A
+:101CE00069877A878B87DE01119686E0FD01119264
+:101CF0008A95E9F785E0FE01379601900D928A9565
+:101D0000E1F749815A816B817C818D819E810E949E
+:101D100094152B960FB6F894DEBF0FBECDBFDF91A2
+:101D2000CF9108950895CF93882309F4C2C0C82F96
+:101D3000823859F40E946A0D81FDBBC089E30E947C
+:101D40003D180E940A1989E30CC0833879F40E9477
+:101D50006A0D80FDAEC083E50E943D180E940A19FD
+:101D600083E50E947F18CF910C940A19843859F4A6
+:101D70000E946A0D82FD9DC087E40E943D180E946A
+:101D80000A1987E4EECF8CEF8C0F813A48F48C2F40
+:101D90000E94721F81118DC08C2F0E943D18E3CFCD
+:101DA00080E28C0F883048F4C77081E001C0880F52
+:101DB000CA95EAF70E94C318D6CF8BE58C0F833003
+:101DC00078F4C53A29F0C63A31F083E890E005C0CE
+:101DD00081E890E002C082E890E0CF910C948C0DF5
+:101DE00088E58C0F833108F064C0C83A39F1C93AEC
+:101DF00041F1CA3A49F1CB3A51F1CC3A59F1CD3AD5
+:101E000061F1C03B69F1CE3A71F1CF3A79F1C13B52
+:101E100081F1C23B89F1C33B91F1C43B99F1C53BD0
+:101E2000A1F1C63BA9F1C73BB1F1C83BB9F1C93B30
+:101E3000C1F1CA3BC9F180E090E038C082EE90E089
+:101E400035C089EE90E032C08AEE90E02FC085EB7D
+:101E500090E02CC086EB90E029C087EB90E026C094
+:101E60008CEC90E023C08DEC90E020C083E891E002
+:101E70001DC08AE891E01AC082E991E017C084E9A8
+:101E800091E014C081E292E011C083E292E00EC0C2
+:101E900084E292E00BC085E292E008C086E292E024
+:101EA00005C087E292E002C08AE292E0CF910C94F2
+:101EB000A20DCF910895882309F44BC0823859F4BC
+:101EC0000E946A0D81FF45C089E30E943D180E946F
+:101ED0000A1989E30CC0833871F40E946A0D80FFEF
+:101EE00038C083E50E943D180E940A1983E50E94CC
+:101EF0007F180C940A19843859F40E946A0D82FFE5
+:101F000028C087E40E943D180E940A1987E4EFCF99
+:101F10009CEF980F913A58F390E2980F983050F454
+:101F2000877091E001C0990F8A95EAF7892F0E9486
+:101F3000C918DFCF9BE5980F933020F480E090E044
+:101F40000C948C0D885A833120F480E090E00C943E
+:101F5000A20D0895882321F00E94C3180C940A1939
+:101F60000895882321F00E94C9180C940A19089535
+:101F7000BF92CF92DF92EF92FF920F931F93CF9376
+:101F8000DF9300D000D000D0CDB7DEB725E0FC0154
+:101F9000DE01119601900D922A95E1F7FC01D080A7
+:101FA00011810281258122952F7043815481452B17
+:101FB00009F4FCC21F3F21F4FFEFDF1609F4F6C25B
+:101FC0007C012E830E94920ED9821A8369817A81C4
+:101FD000802F0E943918182FB92E0E94EE170E94E8
+:101FE000B5162E81002319F00E94E0182E81EB2DEA
+:101FF000E295EF70F0E0E05AFF4F0C94A7218B2D93
+:10200000807F9B2D9F70F92E882319F0F29480EF2A
+:10201000F822002389F0FF2009F475C280E2810FC5
+:10202000883020F48F2D0E94C31803C08F2D0E948A
+:10203000D3180E940A1967C2812F0E945B0FFF20EC
+:1020400009F4B4C2105E8F2D183018F40E94C9181C
+:1020500002C00E94D91826960FB6F894DEBF0FBEB4
+:10206000CDBFDF91CF911F910F91FF90EF90DF9047
+:10207000CF90BF900C940A193B2D307F8B2D8F7021
+:10208000303211F08295807F112319F0113021F147
+:102090002CC00023B9F0222309F4A0C1213009F09B
+:1020A0009DC126960FB6F894DEBF0FBECDBFDF915F
+:1020B000CF911F910F91FF90EF90DF90CF90BF9045
+:1020C0000C94F318222319F0213009F46FC28E8387
+:1020D0000E94F6188E8196C1002321F0223008F06C
+:1020E00065C27CC1211162C28DC1002321F022236F
+:1020F00009F474C108C2222309F484C119C22B2D2A
+:1021000026952695237030E02115310521F02130E8
+:102110003105D1F04BC2002321F0812F9B2D93700C
+:1021200002C080E090E026960FB6F894DEBF0FBEA6
+:10213000CDBFDF91CF911F910F91FF90EF90DF9076
+:10214000CF90BF900C948C0D002321F0812F9B2DFC
+:10215000937002C080E090E026960FB6F894DEBF40
+:102160000FBECDBFDF91CF911F910F91FF90EF90E8
+:10217000DF90CF90BF900C94A20D812F002319F017
+:102180000E94331C02C00E949B1C26960FB6F89436
+:10219000DEBF0FBECDBFDF91CF911F910F91FF909A
+:1021A000EF90DF90CF90BF900C94201D8B2D83700B
+:1021B00009F07BC00111FAC1812F82958695877045
+:1021C000880F880F912F9F70C92ED12CE12CF12CF4
+:1021D000082E04C0CC0CDD1CEE1CFF1C0A94D2F7A8
+:1021E00014FF12C04FE050E060E070E004C0440F04
+:1021F000551F661F771F8A95D2F7CB01BA016095EC
+:1022000070958095909503C060E070E0CB012B2D18
+:10221000269526952370422F50E042305105D9F083
+:102220004330510569F16C297D298E299F29413060
+:10223000510551F126960FB6F894DEBF0FBECDBF03
+:10224000DF91CF911F910F91FF90EF90DF90CF9092
+:10225000BF900C94DC166C297D298E299F29269627
+:102260000FB6F894DEBF0FBECDBFDF91CF911F91A7
+:102270000F91FF90EF90DF90CF90BF900C94F816E5
+:102280000E94DC16C701B60126960FB6F894DEBF91
+:102290000FBECDBFDF91CF911F910F91FF90EF90B7
+:1022A000DF90CF90BF900C94C016002319F08B2DB7
+:1022B000817001C08695882309F478C1812F8295A9
+:1022C00086958770880F880F912F9F70C92ED12C0B
+:1022D000E12CF12C082E04C0CC0CDD1CEE1CFF1CE4
+:1022E0000A94D2F714FF12C04FE050E060E070E0B3
+:1022F00004C0440F551F661F771F8A95D2F7CB0184
+:10230000BA01609570958095909503C060E070E08B
+:10231000CB012B2D269526952370422F50E042307D
+:102320005105D9F04330510569F16C297D298E2979
+:102330009F294130510551F126960FB6F894DEBF22
+:102340000FBECDBFDF91CF911F910F91FF90EF9006
+:10235000DF90CF90BF900C94B6176C297D298E2901
+:102360009F2926960FB6F894DEBF0FBECDBFDF9132
+:10237000CF911F910F91FF90EF90DF90CF90BF9082
+:102380000C94D2170E94B617C701B60126960FB655
+:10239000F894DEBF0FBECDBFDF91CF911F910F919B
+:1023A000FF90EF90DF90CF90BF900C949A17103F62
+:1023B000D1F118F4103E50F4A1C0123F09F463C0EB
+:1023C00008F44CC0133F09F473C098C01F708B2DE4
+:1023D0008F710023A1F00E943317812F26960FB62C
+:1023E000F894DEBF0FBECDBFDF91CF911F910F914B
+:1023F000FF90EF90DF90CF90BF900C94AA0F0E94B7
+:102400005417812F26960FB6F894DEBF0FBECDBFAE
+:10241000DF91CF911F910F91FF90EF90DF90CF90C0
+:10242000BF900C94B10F0023A9F02111BFC08B2DD8
+:102430008F7126960FB6F894DEBF0FBECDBFDF9129
+:10244000CF911F910F91FF90EF90DF90CF90BF90B1
+:102450000C947917223008F0A9C0E9CF0023A9F025
+:102460008B2D8F7126960FB6F894DEBF0FBECDBFB1
+:10247000DF91CF911F910F91FF90EF90DF90CF9060
+:10248000BF900C943317002359F38B2D8F71269630
+:102490000FB6F894DEBF0FBECDBFDF91CF911F9175
+:1024A0000F91FF90EF90DF90CF90BF900C94541756
+:1024B000002399F08B2D8F7126960FB6F894DEBF0E
+:1024C0000FBECDBFDF91CF911F910F91FF90EF9085
+:1024D000DF90CF90BF900C941E1726960FB6F894FD
+:1024E000DEBF0FBECDBFDF91CF911F910F91FF9047
+:1024F000EF90DF90CF90BF900C9414170023A9F0B9
+:10250000222309F4ADCF812F26960FB6F894DEBFB3
+:102510000FBECDBFDF91CF911F910F91FF90EF9034
+:10252000DF90CF90BF900C94930E222309F4ADCF8F
+:10253000812F26960FB6F894DEBF0FBECDBFDF9178
+:10254000CF911F910F91FF90EF90DF90CF90BF90B0
+:102550000C945B0F4B2D4F70612FC7010E9401023D
+:1025600026960FB6F894DEBF0FBECDBFDF91CF9198
+:102570001F910F91FF90EF90DF90CF90BF900C9440
+:1025800038164B2D4F70612FC70126960FB6F89461
+:10259000DEBF0FBECDBFDF91CF911F910F91FF9096
+:1025A000EF90DF90CF90BF900C940A0526960FB65F
+:1025B000F894DEBF0FBECDBFDF91CF911F910F9179
+:1025C000FF90EF90DF90CF90BF9008950E94E018A9
+:1025D0000E94F0180E94B5180E940A190E94D11D8D
+:1025E0000E94201D80E090E00E948C0D80E090E031
+:1025F0000C94A20D0E94D0180C94E6120E942E1882
+:10260000292F22952F7030E02C3031054CF42A30E0
+:1026100031056CF4225031092230310588F407C0AD
+:102620002C30310549F02F30310531F009C0803EA2
+:1026300048F0803F29F406C093FB882780F908956D
+:1026400080E0089581E00895CF93DF9300D000D01B
+:102650001F92CDB7DEB70F900F900F900F900F9095
+:10266000DF91CF910895CF93DF9300D000D000D0B9
+:10267000CDB7DEB726960FB6F894DEBF0FBECDBF3E
+:10268000DF91CF9108951F93CF93DF93C09179018C
+:1026900016E080917A01C81799F0D0E01C9FF001F4
+:1026A0001D9FF00D1124E558FE4F4081518162813C
+:1026B0007381848195810E9433132196C770E9CF7D
+:1026C000DF91CF911F9108954091AB015091AC01E2
+:1026D0006091AD017091AE018091AF019091B00118
+:1026E0000C9433138091B00182958F7009F054C01F
+:1026F0008091AD01882309F44FC080917901A091A8
+:102700007A016091AB017091AC014091AE015091A2
+:10271000AF01B6E08A1709F43FC090E041155105BA
+:10272000C1F17F3F11F46F3FA1F1B89FF001B99F54
+:10273000F00D1124E558FE4F218172132AC020812B
+:10274000621327C02281211124C0238134812417E0
+:10275000350710F421503109241B350B283C310575
+:10276000C0F42091B0012F7020612093B00126E0C9
+:10277000289FF001299FF00D1124E058FE4F808121
+:102780008F70806180838BEA91E00E94B80F0C9477
+:10279000431301968770BECF0895CF92DF92EF92D8
+:1027A000FF920F931F93CF93DF93CDB7DEB762975E
+:1027B0000FB6F894DEBF0FBECDBF8C0185E0F801E7
+:1027C000DE011D9601900D928A95E1F7D8014C919A
+:1027D00011965C91119712966C9112971396CD9069
+:1027E000DC9014973091AB017091AC018091AE01F7
+:1027F0009091AF01009709F46BC17F3F19F43F3FFF
+:1028000009F466C1E090AD01EE2009F4C0C020914A
+:10281000B001C816D90628F0F601E81BF90BCF0164
+:1028200004C0809590958C0D9D1DFF24F394883CE9
+:10283000910578F0F12C207F09F0C6C07C2DD98A53
+:10284000C88A89890E9424138BEA91E00E94B80FFC
+:10285000B1C0822F807F09F046C0751314C03413B5
+:1028600012C0611110C02F7020612093B0010E942E
+:1028700064138BEA91E00E94B80F8091B001D801F7
+:1028800015968C932EC0CD2819F15F3F11F44F3F60
+:10289000F9F0F62E61111CC08091790120917A0126
+:1028A00036E0821709F45AC090E0389FF001399F52
+:1028B000F00D1124E558FE4F7181571306C0708149
+:1028C000471303C07281711103C001968770E9CF6D
+:1028D000F62E662309F418C18091B00181608093BF
+:1028E000B001F12C11C1751308C0341306C0611179
+:1028F00004C08091B001D801C3C04D875E878D852B
+:102900009E856A8B0E94FE126A898823E1F1662304
+:10291000D1F12091B001822F82958F7090E00297C3
+:1029200074F08091AB019091AC0198878F831986E8
+:10293000DB86CA862C87CE0107960E94B80F86E0F8
+:10294000F801ABEAB1E001900D928A95E1F70E949F
+:1029500072130E946413FF24F394D6C04D875E87E0
+:102960008D859E850E942E18292F22952F7030E08C
+:10297000223031050CF0BCC09F7009F0B6C0805EFB
+:10298000883008F4C1C0C8010E94B80FE4CFC8164F
+:10299000D90608F453C0F601E81BF90BCF01883CB7
+:1029A000910508F450C0F12C7C2DD98AC88A8989F8
+:1029B0000E942413EBEAF1E086E0DF011D928A9584
+:1029C000E9F70E946413A0C0751314C0341312C039
+:1029D000611110C08091B001F8018583C8010E9487
+:1029E000B80F86E0EBEAF1E0DF011D928A95E9F786
+:1029F000FE2C8AC04D875E878D859E856A8B0E94DE
+:102A0000FE126A89882309F4BECF662309F4BBCF7E
+:102A10002091B001822F82958F7090E002970CF484
+:102A20008ECF8091AB019091AC019A8389831B82F8
+:102A3000DD82CC822E83CE0101967FCF809590954A
+:102A40008C0D9D1DACCFF62E662309F49CCF75131B
+:102A50002EC034132CC02091B00120FD1FC0822F46
+:102A600082958F70D9F0D80115962C9315978F30D9
+:102A700049F08F5F982F9295907F822F8F70892BCE
+:102A800015968C93C8010E94B80F86E0F801ABEA56
+:102A9000B1E001900D928A95E1F793CF86E0F801BD
+:102AA000ABEAB1E001900D928A95E1F72DC04D8718
+:102AB0005E878D859E850E94FE12811140CF809198
+:102AC000B00181608093B001C8010E94B80F1CC0A2
+:102AD000662309F458CF4D875E878D859E850E94B9
+:102AE000FE12882309F44FCF2ACF811148CF0CC0A2
+:102AF000243031050CF047CF9F7009F440CFF80126
+:102B00009581907F09F03BCF8F2D62960FB6F89498
+:102B1000DEBF0FBECDBFDF91CF911F910F91FF9010
+:102B2000EF90DF90CF9008951F93CF93DF93CDB7B1
+:102B3000DEB72C970FB6F894DEBF0FBECDBF4F8324
+:102B4000588769877A878B879C87CE0107960E9472
+:102B5000CD13882369F08F8198852A853B85232BA7
+:102B6000F1F19F3F09F063C08F3F09F060C037C0AB
+:102B700086E0FE013796DE01119601900D928A954E
+:102B8000E1F76F817885EA85FB85309741F17F3FDA
+:102B900011F46F3F21F120917A0130E0C9010196D3
+:102BA000877099274091790150E08417950709F4BF
+:102BB00047C069837A83FD83EC8396E0929FD001BE
+:102BC000939FB00D1124A558BE4FFE013196019080
+:102BD0000D929A95E1F780937A010E94431316E0D3
+:102BE0008091790190917A018917C1F1189FC001F4
+:102BF000112485589E4F0E94CD13882379F1E091CE
+:102C000079011E9FF0011124E558FE4F408151814A
+:102C100062817381848195810E943313809179014F
+:102C200090E001968770992780937901D9CF4F81E1
+:102C3000588569857A858B859C850E943313CFCF13
+:102C40000E94FA1210927A0110927901EBEAF1E0F7
+:102C500086E0DF011D928A95E9F7C1CF2C960FB669
+:102C6000F894DEBF0FBECDBFDF91CF911F910895C5
+:102C7000EF92FF920F931F93CF93DF938C01892BD9
+:102C800009F46CC0F12CEE24E394E8012196F801DC
+:102C90008491843740F4843008F051C0813081F051
+:102CA000823019F15BC0853709F444C0A8F19CE774
+:102CB000980F903708F052C08F770E945B0F41C089
+:102CC0000E5F1F4FFE01C49180E28C0F883048F4E4
+:102CD000C7708E2D01C0880FCA95EAF70E94E318CD
+:102CE00014C08C2F0E94930E2DC00E5F1F4FFE014B
+:102CF000C49180E28C0F883058F4C7708E2D01C0CB
+:102D0000880FCA95EAF70E94E9180E940A191AC0AA
+:102D10008C2F0E945B0F16C00E5F1F4FFE01C491E7
+:102D2000CC2381F08FE99FE00197F1F700C000000C
+:102D3000C150F6CF0E5F1F4FFE01F49003C00E94FA
+:102D4000930E8E018F2D882309F49FCFEFE9FFE0CA
+:102D50003197F1F700C000008150F5CFDF91CF919E
+:102D60001F910F91FF90EF90089508956093B50122
+:102D70007093B6018093B7019093B8010C94E6125A
+:102D80000F931F930091B5011091B6012091B701E7
+:102D90003091B801DC01CB01802B912BA22BB32BFE
+:102DA0008093B5019093B601A093B701B093B80199
+:102DB0001F910F910C94E6120F931F930091B50190
+:102DC0001091B6012091B7013091B801DC01CB011F
+:102DD00080239123A223B3238093B5019093B6015E
+:102DE000A093B701B093B8011F910F910C94E61214
+:102DF0000F931F930091B5011091B6012091B70177
+:102E00003091B801DC01CB0180279127A227B3279D
+:102E10008093B5019093B601A093B701B093B80128
+:102E20001F910F910C94E6121092B1011092B20111
+:102E30001092B3011092B4010C94E61241E050E0FC
+:102E400060E070E004C0440F551F661F771F8A952D
+:102E5000D2F74093B1015093B2016093B3017093E4
+:102E6000B4010C94E61241E050E060E070E004C070
+:102E7000440F551F661F771F8A95D2F78091B101C5
+:102E80009091B201A091B301B091B401482B592B9C
+:102E90006A2B7B2B4093B1015093B2016093B30135
+:102EA0007093B4010C94E61241E050E060E070E0F1
+:102EB00004C0440F551F661F771F8A95D2F74095AF
+:102EC0005095609570958091B1019091B201A0915B
+:102ED000B301B091B401482359236A237B23409363
+:102EE000B1015093B2016093B3017093B4010C949B
+:102EF000E61241E050E060E070E004C0440F551F6E
+:102F0000661F771F8A95D2F78091B1019091B20127
+:102F1000A091B301B091B401482759276A277B27B4
+:102F20004093B1015093B2016093B3017093B40127
+:102F30000C94E6120F931F930091B1011091B2010E
+:102F40002091B3013091B401DC01CB01802B912B96
+:102F5000A22BB32B8093B1019093B201A093B30144
+:102F6000B093B4011F910F910C94E6120F931F932D
+:102F70000091B1011091B2012091B3013091B401DF
+:102F8000DC01CB0180239123A223B3238093B101E1
+:102F90009093B201A093B301B093B4011F910F912C
+:102FA0000C94E6120F931F930091B1011091B2019E
+:102FB0002091B3013091B401DC01CB01802791272E
+:102FC000A227B3278093B1019093B201A093B301DC
+:102FD000B093B4011F910F910C94E6120895CF9213
+:102FE000DF92EF92FF920F931F93CF93DF938C01A9
+:102FF000C090B501D090B601E090B701F090B80153
+:103000008091B1019091B201A091B301B091B4014E
+:10301000C82AD92AEA2AFB2ACFE1D0E0D701C60183
+:103020000C2E04C0B695A795979587950A94D2F76C
+:1030300080FF06C0B8018C2F0E942D05019721F456
+:10304000219760F780E001C08C2FDF91CF911F9115
+:103050000F91FF90EF90DF90CF900895CF93DF9383
+:10306000EC010E94EF17BE010E942D05DF91CF9168
+:103070000895CB010E942E18089590910C01992378
+:1030800021F090910D01911109C020910E01309114
+:103090000F01F90132969FEF40E01FC0982F9695DF
+:1030A000969596959F3050F5E0910E01F0910F01A5
+:1030B000E90FF11D877021E030E0A90102C0440F43
+:1030C000551F8A95E2F7CA019181892B8183089562
+:1030D0009F3F39F04F5F4E3041F051915813F8CF78
+:1030E0000DC05111F7CF942FF5CF9F3F39F0F90163
+:1030F000E90FF11D97FDFA95828308950895909147
+:103100000C01992321F090910D01911109C020919A
+:103110000E0130910F01F9013296205F3F4F1FC021
+:10312000982F9695969596959F30F0F4E0910E0124
+:10313000F0910F01E90FF11D877021E030E0A90146
+:1031400002C0440F551F8A95E2F7CA01809591810C
+:103150008923818308953196E217F30729F090813E
+:103160009813F9CF1082F7CF089581E090E0E091B5
+:103170000E01F0910F01E80FF91F108201968031C6
+:103180009105A9F708959091CC01892B8093CC01EA
+:10319000089580959091CC0189238093CC01089566
+:1031A0001092CC0108959091CB01892B8093CB0193
+:1031B000089580959091CB0189238093CB01089548
+:1031C0001092CB0108959091CA01892B8093CA0176
+:1031D000089580959091CA0189238093CA0108952A
+:1031E0001092CA0108958093B90108951092B9010F
+:1031F000089580910E0190910F01FC0131969C0180
+:10320000205F3F4F80E0919191118F5FE217F307AC
+:10321000D1F70895E0910E01F0910F018091CC015A
+:103220008083E0910E01F0910F0190818091CB019C
+:10323000892B8083E0910E01F0910F0190818091A4
+:10324000CA01892B80838091B901882361F0E091C4
+:103250000E01F0910F019081892B80830E94F91853
+:1032600081111092B90180910E0190910F010C947F
+:10327000760D8091E601843021F11092CE0120E498
+:1032800088E190E00FB6F894A895809360000FBE97
+:103290002093600080E00E94630683B7817F846092
+:1032A00083BF83B7816083BF7894889583B78E7F0F
+:1032B00083BF88E10FB6F89480936000109260009D
+:1032C0000FBE089508950895CF930E9462190E9439
+:1032D00056030E946319C0E08C2F0E9444048111A0
+:1032E00004C0CF5FCE30C1F701C081E0CF91089517
+:1032F0000E94FA120E946A0D0C94630682E084BD5B
+:1033000093E095BD9AEF97BD80936E0008952FB717
+:10331000F8948091CF019091D001A091D101B0910A
+:10332000D2012FBF0895CF92DF92EF92FF920F93B9
+:103330001F932FB7F8944091CF015091D001609125
+:10334000D1017091D2012FBF6A017B01EE24FF24CD
+:103350008C0120E030E0C016D106E206F30610F43E
+:10336000415051099A01281B390BC9011F910F9136
+:10337000FF90EF90DF90CF9008951F920F920FB6BD
+:103380000F9211248F939F93AF93BF938091CF019E
+:103390009091D001A091D101B091D2010196A11DCF
+:1033A000B11D8093CF019093D001A093D101B09330
+:1033B000D201BF91AF919F918F910F900FBE0F904F
+:1033C0001F9018950E94670AF8942FEF87EA91E6FC
+:1033D000215080409040E1F700C0000087E090EB72
+:1033E000DC018093EF019093F001A093F101B09381
+:1033F000F2019CE088E10FB6F894A89580936000F4
+:103400000FBE90936000FFCFEF92FF920F931F9338
+:10341000CF93DF93D82FC0E08C2F0E94440400E0AC
+:1034200010E0E82EF12CC701002E02C0959587957B
+:103430000A94E2F780FD06C00F5F1F4F06301105AA
+:1034400091F709C0602F7C2F80E00E940B05D813F4
+:10345000F3CF81E004C0CF5FCE30F1F680E0DF91A2
+:10346000CF911F910F91FF90EF900895CF93C82FA8
+:103470008CE20E94041A882321F08C2FCF910C94A7
+:10348000041A80E0CF910895CF930E948B1B811185
+:1034900002C00E94711BC5E6C15049F00E9456034C
+:1034A0008FE39CE90197F1F700C00000F5CF89E2B6
+:1034B0000E94361A811113C18AE20E94361A8111C4
+:1034C0000E94711B85E00E94361A81110E94E21948
+:1034D0000E94961B8093CD0187E00E94361A8823B4
+:1034E000A9F18BE10E94361A882351F08091CD0119
+:1034F00081FB222720F991E0922790FB81F90EC0F1
+:103500008EE00E94361A882361F08091CD0182FB03
+:10351000222720F991E0922790FB82F98093CD0138
+:1035200015C080E10E94361A9091CD01882341F0A8
+:1035300093FB222720F981E0822780FB93F904C0C6
+:10354000892F809580FB90F99093CD018091CD01DA
+:103550000E949A1B0E94A81B8093E00180EE0E94AB
+:10356000361A882341F08091E001982F909590FBC6
+:1035700080F98093E00189E30E94361A882359F08C
+:103580008091E00181FB222720F991E0922790FBB6
+:1035900081F98093E00182EE0E94361A882359F067
+:1035A0008091E00182FB222720F991E0922790FB95
+:1035B00082F98093E00186EE0E94361A882359F042
+:1035C0008091E00183FB222720F991E0922790FB74
+:1035D00083F98093E00183EE0E94361A882359F024
+:1035E0008091E00184FB222720F991E0922790FB53
+:1035F00084F98093E00185E30E94361A882359F00C
+:103600008091E00185FB222720F991E0922790FB31
+:1036100085F98093E00181E30E94361A882359F0EE
+:103620008091E00186FB222720F991E0922790FB10
+:1036300086F98093E00181E10E94361A882359F0CF
+:103640008091E00187FB222720F991E0922790FBEF
+:1036500087F98093E0018091E0010E94AC1B80918A
+:10366000E00187FB882780F980930D0187E20E94A3
+:10367000361AC82F8EE10E94361A8111C2608FE17E
+:103680000E94361A8111C46080E20E94361A8111AC
+:10369000C86081E20E94361A8111C06182E20E94F4
+:1036A000361A8111C06283E20E94361A8111C06409
+:1036B00084E20E94361A882311F0C06802C0CC232D
+:1036C00029F08C2F0E94A31B6C2F03C00E949F1B0C
+:1036D000682F70E080E090E0CF910C94B616CF9107
+:1036E00008956DEE7EEF80E090E00E94DD2160E0C5
+:1036F00082E090E00E94CF2160E083E090E00E94B1
+:10370000CF2160E084E090E00E94CF2160E085E07E
+:1037100090E00C94CF2180E090E00E94C92121E04C
+:103720008D3E9E4F09F020E0822F089582E090E0C8
+:103730000C94C121682F82E090E00C94CF2183E0AB
+:1037400090E00C94C121682F83E090E00C94CF218D
+:1037500084E090E00C94C121682F84E090E00C9408
+:10376000CF218091D50180FF0BC06091130185E0CE
+:10377000689FB001112475956795759567952BC065
+:1037800081FF09C06091130185E0689FB001112499
+:103790007595679520C082FF07C06091130185E091
+:1037A000689FB001112417C09091D6019923D1F0E0
+:1037B00060911201961788F72091130185E0289FE8
+:1037C00090011124929FA001939F500D112470E04D
+:1037D000CA010E9493216038710540F4611571059A
+:1037E00039F002C065E070E0862F08958FE70895F4
+:1037F00081E008958091D50180FF08C0609111019A
+:1038000070E0759567957595679521C081FF06C035
+:103810006091110170E07595679519C082FF04C031
+:103820006091110170E010C09091D6019923C1F010
+:10383000609110019617A0F780911101899FC00136
+:10384000112470E00E9493216038710528F46115FD
+:10385000710521F0862F08958FE7089581E008957E
+:1038600061E070E0F4CF803F21F40E94B11B8195AC
+:1038700004C0813F29F40E94B11B8093D9010895AF
+:10388000823F21F40E94B11B819504C0833F29F43B
+:103890000E94B11B8093D8010895893F19F40E94BA
+:1038A000FA1B05C08A3F31F40E94FA1B8195809370
+:1038B000DA0108958B3F21F40E94FA1B819504C020
+:1038C0008C3F29F40E94FA1B8093DB010895843F0A
+:1038D00021F48091D701816017C0853F21F4809148
+:1038E000D701826011C0863F21F48091D7018460A6
+:1038F0000BC0873F21F48091D701886005C0883FC5
+:1039000031F48091D70180618093D70108958D3F74
+:1039100021F48091D50181600BC08E3F21F480910C
+:10392000D501826005C08F3F29F48091D501846064
+:103930008093D5010895803F39F48091D90187FFA4
+:103940006CC01092D90169C0813F29F48091D901DE
+:103950001816BCF362C09091D801823F29F497FFFA
+:103960005CC01092D80159C0833F19F41916CCF3EA
+:1039700054C0893F41F48091DA0118160CF04DC013
+:103980001092DA014AC08A3F29F48091DA0187FF58
+:1039900044C0F6CF8B3F39F48091DB0187FF3DC0F7
+:1039A0001092DB013AC08C3F29F48091DB0118169C
+:1039B000BCF333C0843F21F48091D7018E7F17C0C0
+:1039C000853F21F48091D7018D7F11C0863F21F47E
+:1039D0008091D7018B7F0BC0873F21F48091D70165
+:1039E000877F05C0883F31F48091D7018F7E809317
+:1039F000D70113C08D3F21F48091D5018E7F0BC07C
+:103A00008E3F21F48091D5018D7F05C08F3F29F431
+:103A10008091D5018B7F8093D5018091D801811150
+:103A20000EC08091D90181110AC08091DA01811103
+:103A300006C08091DB01811102C01092D601089569
+:103A400087ED91E00E94810D0E9487199093D40127
+:103A50008093D30108951F93CF93DF938091D30177
+:103A60009091D4010E949319AC019091D6019923B1
+:103A700021F02091140130E006C0209115018AE068
+:103A8000289F900111244217530708F486C08091A3
+:103A9000D801C091D901D091DA011091DB018111D7
+:103AA00007C0C11176C0D11174C0111172C075C0A8
+:103AB0009F3F19F09F5F9093D601181624F40E943F
+:103AC000B11B8093D8018091D80187FF05C00E9467
+:103AD000B11B81958093D8011C1624F40E94B11B60
+:103AE0008093D9018091D90187FF05C00E94B11B45
+:103AF00081958093D9016091D801662339F1C091F5
+:103B0000D901CC2319F1772767FD7095872F972F5F
+:103B10000E94A42023E333E343E35FE30E940821F0
+:103B20000E9471206093D8016C2F772767FD7095F4
+:103B3000872F972F0E94A42023E333E343E35FE31F
+:103B40000E9408210E9471206093D9011D1624F45F
+:103B50000E94FA1B8093DA018091DA0187FF05C089
+:103B60000E94FA1B81958093DA01111624F40E94B9
+:103B7000FA1B8093DB018091DB0187FF05C00E9467
+:103B8000FA1B81958093DB01DF91CF911F910C94FB
+:103B9000201D9F3F09F08ECF96CFDF91CF911F91CF
+:103BA0000895E7EDF1E085E0DF011D928A95E9F7E0
+:103BB0001092D6011092D5010895833081F128F436
+:103BC000813059F08230D1F00895853009F449C030
+:103BD000B8F1863009F456C0089580911501262F5A
+:103BE00030E0280F311D2F3F310524F4680F60931A
+:103BF000150108958FEF80931501089580911401A8
+:103C0000262F30E0280F311D2F3F310524F4680F97
+:103C10006093140108958FEF8093140108958091AB
+:103C20001301262F30E0280F311D2F3F310524F4DA
+:103C3000680F6093130108958FEF80931301089527
+:103C400080911201262F30E0280F311D2F3F3105C2
+:103C500024F4680F6093120108958FEF809312018E
+:103C6000089580911101262F30E0280F311D2F3F3C
+:103C7000310524F4680F6093110108958FEF80934C
+:103C80001101089580911001262F30E0280F311D79
+:103C90002F3F310524F4680F6093100108958FEFD2
+:103CA000809310010895833011F128F4813049F098
+:103CB000823091F00895853081F120F18630C1F194
+:103CC000089580911501681720F4861B80931501D3
+:103CD000089510921501089580911401681720F439
+:103CE000861B809314010895109214010895809109
+:103CF0001301681720F4861B809313010895109216
+:103D00001301089580911201681720F4861B809397
+:103D100012010895109212010895809111016817FF
+:103D200020F4861B809311010895109211010895CB
+:103D300080911001681720F4861B8093100108956C
+:103D40001092100108950F931F938D3109F46AC0EA
+:103D500008F03FC08E3009F484C0C0F4873009F405
+:103D60006DC068F4863009F0B5C08091CD01817FC7
+:103D70008E7F8093CD0181E08093DD01ACC08830DF
+:103D800009F457C08B3009F46AC0A4C0863109F425
+:103D900066C078F4803109F477C0813109F09AC0A7
+:103DA0000E94FA1290910D0181E0892780930D0104
+:103DB00056C0893109F453C08B3109F08BC0809112
+:103DC000CD0181FB222720F991E0922790FB81F918
+:103DD00051C0853309F475C048F4873209F471C0C5
+:103DE00008F45EC0893209F46CC074C0833430F4C6
+:103DF0008A3308F053C0883391F16CC0833409F4DE
+:103E000060C0883409F066C00E94FA120FEF13ED0B
+:103E100020E3015010402040E1F700C000000E9464
+:103E2000E2191DC00E942B200E946A0D0E946306A9
+:103E300016C00E94961B0E94A81B11C09091CD0134
+:103E4000892F8095817080FB90F929F096609860A9
+:103E50009093CD0140C0997F977F9093CD0181E0F1
+:103E60003AC08091CD0182FB222720F991E0922770
+:103E700090FB82F98093CD01992389F38091CD0144
+:103E800081608093CD01EBCF8091CD0183FB222710
+:103E900020F991E0922790FB83F9ECCF895301C080
+:103EA0008D5141E050E060E070E08A019B0104C068
+:103EB000000F111F221F331F8A95D2F7C901B801C5
+:103EC00004C061E070E080E090E00E94B6160E94BD
+:103ED000FA12C5CF80E01F910F91089580E00895F8
+:103EE00080E00895CF93C82F8091DD01813079F073
+:103EF00018F08230E9F187C0E0910E01F0910F01D6
+:103F00008081813169F0823209F07FC009C0E0917F
+:103F10000E01F0910F018081813111F0823261F444
+:103F20008C2F0E946E1F811104C08C2F0E94A31E33
+:103F30001DC081E090E01AC08C2F0E94701F81117B
+:103F400014C0C43179F048F4CB3079F0C03109F0B5
+:103F500060C082E08093DD0108C0C93219F0C83327
+:103F600021F057C01092DD0154C081E0817053C030
+:103F7000C93289F118F5C43171F1A8F4C73009F0DC
+:103F800046C08AE08093150194E19093140193E078
+:103F9000909313018093120188E08093110188E2CD
+:103FA0008093100134C0CE51C63088F5EC2FF0E07C
+:103FB000E65DFE4F80818093DC0129C0CE34E9F0BC
+:103FC00020F4CB3421F56AE013C0C13579F0C23555
+:103FD000F1F461E00DC08091DC01882319F01092AA
+:103FE000DC0115C081E08093DD0115C061E006C0F1
+:103FF0008091DC010E94DD1D0AC06AE08091DC0135
+:104000000E94531E04C01092DD0180E004C081E0D4
+:1040100002C080E0ABCFCF910895E1E8F0E080816D
+:10402000886080838081816080838FB7F89493E07B
+:104030009093890090ED909388008FBF0895EFE6EC
+:10404000F0E08081826080830895EFE6F0E0808177
+:104050008D7F80830895EFE6F0E0908182E08927EC
+:10406000808308951F920F920FB60F9211242F9301
+:104070003F934F935F936F937F938F939F93AF93F0
+:10408000BF93EF93FF938091DE019091DF01019642
+:104090009093DF018093DE01811103C082E00E94D2
+:1040A0006306E091DF01E695E695F0E0EA5CFC4FFF
+:1040B000E4918091DE018E1303C080E00E946306CC
+:1040C000FF91EF91BF91AF919F918F917F916F91F0
+:1040D0005F914F913F912F910F900FBE0F901F90C6
+:1040E000189504D06894B1118DC0089570D088F0EF
+:1040F0009F5790F0B92F9927B751A0F0D1F0660FD4
+:10410000771F881F991F1AF0BA95C9F712C0B130EE
+:1041100081F077D0B1E0089574C0672F782F882799
+:10412000B85F39F0B93FCCF3869577956795B3952D
+:10413000D9F73EF490958095709561957F4F8F4F9C
+:104140009F4F0895E89409C097FB3EF490958095A1
+:10415000709561957F4F8F4F9F4F9923A9F0F92F4D
+:1041600096E9BB279395F695879577956795B795CB
+:10417000F111F8CFFAF4BB0F11F460FF1BC06F5FB1
+:104180007F4F8F4F9F4F16C0882311F096E911C0C3
+:10419000772321F09EE8872F762F05C0662371F0E4
+:1041A00096E8862F70E060E02AF09A95660F771FF8
+:1041B000881FDAF7880F9695879597F9089557FD28
+:1041C0009058440F551F59F05F3F71F04795880F85
+:1041D00097FB991F61F09F3F79F08795089512161C
+:1041E00013061406551FF2CF4695F1DF08C01616C8
+:1041F00017061806991FF1CF869571056105089479
+:104200000895E894BB2766277727CB0197F908958F
+:104210000BD078C069D028F06ED018F0952309F043
+:104220005AC05FC01124EECFCADFA0F3959FD1F32F
+:10423000950F50E0551F629FF001729FBB27F00D54
+:10424000B11D639FAA27F00DB11DAA1F649F6627A9
+:10425000B00DA11D661F829F2227B00DA11D621FF8
+:10426000739FB00DA11D621F839FA00D611D221FB2
+:10427000749F3327A00D611D231F849F600D211D96
+:10428000822F762F6A2F11249F5750408AF0E1F039
+:1042900088234AF0EE0FFF1FBB1F661F771F881F82
+:1042A00091505040A9F79E3F510570F014C0AACF1D
+:1042B0005F3FECF3983EDCF3869577956795B7956D
+:1042C000F795E7959F5FC1F7FE2B880F911D969597
+:1042D000879597F9089597F99F6780E870E060E007
+:1042E00008959FEF80EC089500240A94161617068F
+:1042F00018060906089500240A94121613061406D7
+:1043000005060895092E0394000C11F4882352F039
+:10431000BB0F40F4BF2B11F460FF04C06F5F7F4FF1
+:104320008F4F9F4F089597FB072E16F4009407D0E8
+:1043300077FD09D00E94AD2107FC05D03EF4909591
+:1043400081959F4F0895709561957F4F0895EE0F69
+:10435000FF1F0590F491E02D0994AA1BBB1B51E1AE
+:1043600007C0AA1FBB1FA617B70710F0A61BB70BE5
+:10437000881F991F5A95A9F780959095BC01CD018A
+:104380000895F999FECF92BD81BDF89A992780B51D
+:104390000895A8E1B0E042E050E00C94E421262F1B
+:1043A000F999FECF1FBA92BD81BD20BD0FB6F8941A
+:1043B000FA9AF99A0FBE019608950E94CF21272FED
+:1043C0000C94D021DC01CB01FC01F999FECF06C091
+:1043D000F2BDE1BDF89A319600B40D9241505040C3
+:0843E000B8F70895F894FFCF2F
+:1043E80020026506F306D0069C0668060101BA019C
+:1043F80028080A03140A3F4D3639F702AA02740244
+:104408003B02CE01E701000219020102030405067E
+:044418000708090088
+:00000001FF
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.png b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.png Binary files differnew file mode 100644 index 0000000000..4b9433be28 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-osx/romanzolotarev-norman-osx.png diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/keymap.c b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/keymap.c new file mode 100644 index 0000000000..dd946c1823 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/keymap.c @@ -0,0 +1,73 @@ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" + +#define BASE 0 +#define QWRT 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [BASE] = KEYMAP( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F5, + KC_TAB, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_BSLS, + KC_LCTL, KC_A, KC_S, KC_E, KC_T, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, + KC_F1, KC_F2, KC_F3, KC_F4, KC_LGUI, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLD, KC_MUTE, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLU, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_BSPC, CTL_T(KC_ESC), KC_LALT, + // + /*-*/ KC_F6, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, + /*-*/ TG(QWRT), KC_J, KC_U, KC_R, KC_L, KC_SCLN, KC_MINS, + /*-*/ /*-*/ KC_Y, KC_N, KC_I, KC_O, KC_H, KC_ENT, + /*-*/ KC_RBRC, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + /*-*/ /*-*/ /*-*/ KC_RGUI, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, + KC_MPLY, KC_MNXT, + KC_MPRV, + KC_RALT, KC_QUOT, KC_SPC + ), + [QWRT] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_E, KC_R, KC_T, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_D, KC_F, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TRNS, + /*-*/ /*-*/ KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_TRNS, + /*-*/ KC_TRNS, KC_N, 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 + ), +}; + +const uint16_t PROGMEM fn_actions[] = { +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { +}; + +// 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) { + uint8_t layer = biton32(layer_state); + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + case QWRT: + ergodox_right_led_1_on(); + break; + default: + break; + } +}; diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/readme.md b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/readme.md new file mode 100644 index 0000000000..0e78c130b3 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/readme.md @@ -0,0 +1,34 @@ +# Roman's Layout + +There are two layers: + +- **BASE** is [Norman layout](https://normanlayout.info/). +- **QWRT** is QWERTY. + +[![keyboard-layout](romanzolotarev-norman-qwerty-osx.png)](http://www.keyboard-layout-editor.com/#/gists/3b236f450da474dc506a5a80390c3cc7) + +## Switching + +- Tap `QWRT` to toggle **QWRT**. + +## LEDs + +- Red: QWRT is on. + +## Functional Keys + +- Tap `F1` to mute microphone via [Shush](http://mizage.com/shush/). +- Tap `F2` to copy screenshot to the clipboard. +- Hold `SHIFT` and tap `F2` to save screenshot as a file. +- Tap `F3`, `F4`, `F5`, `F6` to resize a window via [Divvy](http://mizage.com/divvy/). + +## CTRL/ESC + +Both CTRL and ESC are frequently used in Vim. + +- Tap `CTRL/ESC` to send `ESC`. +- Hold `CTRL/ESC` to use as `CTRL`. + +## Activate N-rollover + +- Hold left `SHIFT` and right `SHIRT` and then tap `N`. diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.hex b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.hex new file mode 100644 index 0000000000..80ae0751b1 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.hex @@ -0,0 +1,1139 @@ +:100000000C940F020C9453020C9453020C94530260
+:100010000C9453020C9453020C9453020C9453020C
+:100020000C9453020C9453020C94070C0C94D90CAE
+:100030000C9453020C9453020C9453020C945302EC
+:100040000C9453020C94A3210C9453020C9453026D
+:100050000C9453020C94321B0C9453020C945302D4
+:100060000C9453020C9453020C9453020C945302BC
+:100070000C9453020C9453020C9453020C945302AC
+:100080000C9453020C9453020C9453020C9453029C
+:100090000C9453020C9453020C9453020C9453028C
+:1000A0000C9453020C9453020C945302460D680DA9
+:1000B000560E680D560EAD0DD00D560E250E380E8F
+:1000C0002411241161116111A411E211FB13FB131E
+:1000D000FB11FB13FC12FC12CF13FB13FB13E613F3
+:1000E00035002B00E000E1003A0000001E00140083
+:1000F00004001D003B00E2001F001A0016001B0058
+:100100003C00297120000700080006003D002A007D
+:100110002100090017001900E300A90022000E00C9
+:100120000A0005000000AA003E00310000002F0078
+:100130000000A8003F000154000030000000AE00A5
+:1001400023000D001C0013000000AB002400180069
+:1001500011001000E700AC00250015000C0036006F
+:1001600050002C0026000F00120037005100340010
+:10017000270033000B0038005200E6002E002D004F
+:100180002800E5004F00000001000100010001000F
+:100190000100000001000100010001000100010058
+:1001A0000100010001000100010001000100080040
+:1001B0000700010001000100010015000900010015
+:1001C0000100010001001700010001000000010012
+:1001D0000100010000000100000001000100010019
+:1001E000000001000000010001001C000B001100D4
+:1001F00000000100010018000D00010001000100D5
+:1002000001000C000E0001000100010001001200BD
+:100210000F00010001000100010013003300010084
+:1002200001000100010001000100010001000000C7
+:1002300016034500720067006F0044006F007800ED
+:10024000200045005A0000001603450072006700B8
+:100250006F0044006F007800200045005A00000045
+:100260000403090409026D00040100A0FA09040056
+:10027000000103010100092111010001223F0007D3
+:1002800005810308000A09040100010301020009B5
+:100290002111010001224D000705820308000A090F
+:1002A00004020001030000000921110100012236AF
+:1002B000000705830308000A090403000103000086
+:1002C00000092111010001223900070584031000F3
+:1002D000011201100100000008EDFE0713010001EA
+:1002E00002000105010906A101050719E029E7152A
+:1002F0000025019508750181020508190129059558
+:1003000005750191029501750391010507190029F1
+:100310007715002501957875018102C005010980D6
+:10032000A101850216010026B7001A01002AB700B4
+:10033000751095018100C0050C0901A10185031606
+:100340000100269C021A01002A9C02751095018169
+:1003500000C005010902A1010901A1000509190157
+:100360002905150025019505750181029501750383
+:1003700081010501093009311581257F9502750834
+:10038000810609381581257F950175088106050CC0
+:100390000A38021581257F950175088106C0C005C0
+:1003A000010906A101050719E029E71500250195B6
+:1003B0000875018102950175088101050819012957
+:1003C00005950575019102950175039101050719C0
+:1003D0000029FF150025FF950675088100C0000063
+:1003E000000000000000000000010204060A0F17D0
+:1003F000202C3A4A5D71879DB3C7DAE9F5FCFFFC12
+:10040000F5E9DAC7B39D87715D4A3A2C20170F0AC8
+:10041000060402010000000000000000000011249A
+:100420001FBECFEFDAE0DEBFCDBF04B603FE24C0AF
+:100430008091EE019091EF01A091F001B091F10156
+:100440008730904BA740B04BB9F41092EE01109258
+:10045000EF011092F0011092F10114BE84B7877F72
+:1004600084BF88E10FB6F89480936000109260001A
+:100470000FBEE0E0FFE3099511E0A0E0B1E0E4ED9C
+:10048000F6E402C005900D92A433B107D9F711E04C
+:10049000A4E3B1E001C01D92AE3EB107E1F70E94B6
+:1004A0004B090C9468230C94000008950895609102
+:1004B000B1017091B2018091B3019091B4010E9499
+:1004C0005E1A56985E9825982D9826982E9827980B
+:1004D0002F98813011F4259A2D9A08950C94570283
+:1004E00056985E9825982D9826982E9827982F989C
+:1004F0008FEF90E0909389008093880090938B0019
+:1005000080938A0090938D0080938C00259A2D9A79
+:100510002FEF80E792E0215080409040E1F700C04B
+:100520000000269A2E9A2FEF80E792E0215080401B
+:100530009040E1F700C00000279A2F9A2FEF80E744
+:1005400092E0215080409040E1F700C000002598E3
+:100550002D982FEF80E792E0215080409040E1F706
+:1005600000C0000026982E982FEF80E792E02150DF
+:1005700080409040E1F700C0000027982F985698DF
+:100580005E9825982D9826982E9827982F9808954C
+:1005900089EA8093800089E08093810024982C98D8
+:1005A0003F988AB18F748AB96E98479A8BB1806BE5
+:1005B0008BB9769A0E9470020C94560280E2809366
+:1005C00000018091340181110EC00E942D0381E051
+:1005D000809334012FEF83ED90E3215080409040D1
+:1005E000E1F700C0000080E40E9433038093000123
+:1005F00081112EC00E945D0380930001811128C0EB
+:100600000E945D0380930001811122C08FE30E944C
+:100610005D038093000181111BC00E94550380E49B
+:100620000E94330380930001811112C08CE00E946C
+:100630005D038093000181110BC00E945D038093D4
+:100640000001811105C08FE30E945D0380930001CA
+:100650000E9455038091000108951092B9008AE02C
+:100660008093B800089594EA9093BC009091BC00E8
+:1006700097FFFCCF9091B900987F983021F090318E
+:1006800011F081E008958093BB0084E88093BC0062
+:100690008091BC0087FFFCCF8091B900887F8831B2
+:1006A00011F0803471F780E0089584E98093BC00F4
+:1006B0008091BC0084FDFCCF08958093BB0084E84A
+:1006C0008093BC008091BC0087FFFCCF9091B90063
+:1006D000987F81E0983209F480E0089584E880935F
+:1006E000BC008091BC0087FFFCCF8091BB000895C7
+:1006F00080910001811115C080E40E943303809332
+:10070000000181110CC082E10E945D038093000111
+:10071000811105C08FEF0E945D03809300010E944C
+:10072000550384B1807F84B985B1807F85B98AB152
+:10073000837F8AB98BB1837F8BB93E9846980895A1
+:100740000E94DE02809300010E94780380B38C70C7
+:1007500080BB81B3836F81BBA6E3B1E0E4E4F1E049
+:100760008EE08E0F11921D928E13FCCF0C94C80256
+:10077000BF92CF92DF92EF92FF920F931F93CF938E
+:10078000DF9380910001882379F0809135018F5F9C
+:1007900080933501811108C00E94DE028093000120
+:1007A000811102C00E94700206E311E0C0E0D0E0B7
+:1007B000DD24D39482E0C82EEE24E394F12CC730DC
+:1007C000D10500F580910001811164C080E40E9490
+:1007D000330380930001811112C082E10E945D0306
+:1007E0008093000181110BC0C7010C2E01C0880F3E
+:1007F0000A94EAF780950E945D03809300010E94AD
+:10080000550348C0CA30A1F028F4C83059F0C930A7
+:1008100061F005C0CC3089F070F0CD3089F0209ABD
+:10082000289810C0219A29980DC0229A2A980AC0A7
+:10083000239A2B9807C0529A01C0539A5B9802C022
+:100840003E9A469890EA9A95F1F79FB1799902C03D
+:1008500082E001C080E091709D25982B7C9902C0B8
+:1008600084E001C080E0892B7D9902C038E001C09E
+:1008700030E0832B7E9902C020E101C020E0822B72
+:100880009FB19095991F9927991F9295990F907EE6
+:10089000892B0FC080910001811149C080E40E9422
+:1008A000330380930001882379F1B12C0E94550312
+:1008B0008B2DF8019081981719F08083C092010167
+:1008C0000E94780321960F5F1F4FCE30D10509F0AB
+:1008D00076CF80910101882361F1815080930101DD
+:1008E000882339F08FE99FE00197F1F700C00000FD
+:1008F00020C0A4E4B1E0E6E3F1E0CF01825F919192
+:100900009D938E13FCCF15C083E10E945D038093FD
+:1009100000018111CACF81E40E943303809300015A
+:100920008111C3CF0E946E03B82EB094BFCF80E078
+:10093000C0CF0E946E0281E0DF91CF911F910F9195
+:10094000FF90EF90DF90CF90BF900895E82FF0E0F8
+:10095000EC5BFE4F808108950895089596E0799F9D
+:10096000F001112494E5899FE00DF11D1124E60F9B
+:10097000F11DEE0FFF1FE052FF4F859194910895F6
+:10098000880F991FFC01E05AF040859194910895D9
+:10099000880F991FFC01E052FF4F859194910895B3
+:1009A0000F931F93CF93DF93EC018115904350F584
+:1009B000C11580E2D80708F0B3C0CB3BD10590F455
+:1009C000C83AD10508F05AC0C53AD10508F04BC065
+:1009D000C430D10508F0BBC1219709F0B5C101E0D1
+:1009E00010E0F5C1CF3FD10511F008F0B0C1C03F14
+:1009F000D10508F092C0CE01805E9109089708F4F5
+:100A0000A6C1A2C1C11591E5D907A8F4C23020E55D
+:100A1000D20708F09EC0C11580E5D80709F485C04B
+:100A200008F091C0C11520E4D20708F08DC1DD2780
+:100A30008E01106CCCC1C11580E8D80758F4C115DF
+:100A400090E7D90708F07CC1C11520E6D20708F469
+:100A500022C17AC1C11580E9D80708F075C1DF70DD
+:100A60008E01106AB4C1C53AD10509F472C1C63A03
+:100A7000D10509F071C102E810E4A9C1C83AD10555
+:100A800009F46DC1C93AD10509F46CC1CA3AD1055E
+:100A900009F46BC1CB3AD10509F46AC1CC3AD1054E
+:100AA00009F469C1CD3AD10509F468C1C03BD1054B
+:100AB00009F467C1CE3AD10509F466C1CF3AD10530
+:100AC00009F465C1C13BD10509F464C1C23BD1053C
+:100AD00009F463C1C33BD10509F462C1C43BD1052C
+:100AE00009F461C1C53BD10509F460C1C63BD1051C
+:100AF00009F45FC1C73BD10509F45EC1C83BD1050C
+:100B000009F45DC1C93BD10509F45CC1CA3BD105FB
+:100B100009F45BC100E014E45AC18E01106557C1AD
+:100B2000CE019F700E94C80453C10E941F149FEF02
+:100B300024E38CE0915020408040E1F700C00000A9
+:100B40000E94571B44C18091CD0181608093CD01EB
+:100B50003EC10E94001D811102C00E94E61C0E943D
+:100B60001D1D90E09093EE018093ED01C23090E561
+:100B7000D90721F48091ED01816086C0C43020E561
+:100B8000D20721F48091ED0182607EC0C63080E5FD
+:100B9000D80721F48091ED01846076C0C83090E5DB
+:100BA000D90719F48091ED0127C0CA3020E5D2079A
+:100BB00021F48091ED01806167C0CC3080E5D807D9
+:100BC00021F48091ED0180625FC0CE3090E5D907BD
+:100BD00021F48091ED01806457C0C03120E5D20737
+:100BE00021F48091ED0180684FC0C23180E5D807C3
+:100BF00029F48091ED018460886046C0C33090E59F
+:100C0000D90721F48091ED018E7F3EC0C53020E5EB
+:100C1000D20721F48091ED018D7F36C0C73080E589
+:100C2000D80721F48091ED018B7F2EC0C93090E56B
+:100C3000D90719F48091ED0126C0CB3020E5D20709
+:100C400021F48091ED018F7E1FC0CD3080E5D80763
+:100C500021F48091ED018F7D17C0CF3090E5D90749
+:100C600021F48091ED018F7B0FC0C13120E5D207C7
+:100C700021F48091ED018F7707C0C331D04531F465
+:100C80008091ED018B7F877F8093ED018091ED0155
+:100C90000E94211D9CC08D2F99278F70992781302C
+:100CA0009105D9F49E012370332702C0880F991F44
+:100CB0002A95E2F79C688E0144E0000F111F4A95C7
+:100CC000E1F700271370802B912B53E0CC0FDD1F31
+:100CD0005A95E1F7C076DD272FC08230910531F4B7
+:100CE000DC2FCC278E01016F106A71C08330910513
+:100CF00069F4CE018370992701E010E002C0000F73
+:100D0000111F8A95E2F7C8019C680FC0049709F08B
+:100D10005EC0CE018370992701E010E002C0000F91
+:100D2000111F8A95E2F7C8019A6823E0CC0FDD1FF6
+:100D30002A95E1F7C07ED7708C010C2B1D2B47C084
+:100D4000DF708E01106243C000E010E040C08E01F1
+:100D50003EC001E810E43BC003E810E438C002EEF6
+:100D600014E435C009EE14E432C00AEE14E42FC0D6
+:100D700005EB14E42CC006EB14E429C007EB14E4E3
+:100D800026C00CEC14E423C00DEC14E420C003E8EE
+:100D900015E41DC00AE815E41AC002E915E417C0FD
+:100DA00004E915E414C001E216E411C003E216E4FC
+:100DB0000EC004E216E40BC005E216E408C006E229
+:100DC00016E405C007E216E402C00AE216E4C80110
+:100DD000DF91CF911F910F91089596E0799FF001D7
+:100DE000112494E5899FE00DF11D1124E60FF11DFA
+:100DF000EE0FFF1FE052FF4F85919491803E9105C9
+:100E0000E0F4803C910558F58133910509F46FC0F9
+:100E100048F48932910509F463C08A32910509F4D6
+:100E20006DC072C089339105E9F082389105D1F027
+:100E30008533910509F44DC067C0833E910581F16A
+:100E400038F4803E9105B9F0823E9105D9F05CC03E
+:100E5000863E910561F1873E9105A1F155C00E9442
+:100E6000C00408952091ED0120FD02C021FF4CC077
+:100E700080EE90E049C08091ED0180FFF9CF89E3D9
+:100E800090E042C08091ED0182FF0EC08091ED01A3
+:100E900084FF03C080E090E037C083EE90E034C070
+:100EA0008091ED0182FFF2CF82EE90E02DC0809123
+:100EB000ED0183FF0BC08091ED0184FDEBCF87EE48
+:100EC00090E022C08091ED0183FFF5CF86EE90E0A7
+:100ED0001BC08091ED0185FF07C089E290E014C03E
+:100EE0008091ED0185FFF9CF85E390E00DC0809101
+:100EF000ED0186FF07C08AE290E006C08091ED0117
+:100F000086FFF9CF81E390E00E94D0040895089510
+:100F10000C948707809162010895CF93DF9300D0EE
+:100F20001F92CDB7DEB79C018091E401843019F5A2
+:100F300093E099833B832A839093E9008FEF90910C
+:100F4000E800815095FD06C095ED9A95F1F70000F7
+:100F50008111F5CF8091E80085FF0DC040E050E0A1
+:100F600063E070E0CE0101960E94F7098091E800ED
+:100F70008E778093E8000F900F900F90DF91CF91C4
+:100F80000895CF93DF9300D01F92CDB7DEB72091A5
+:100F9000E401243021F522E029839B838A8383E0C6
+:100FA0008093E9008FEF9091E800815095FD06C095
+:100FB00095ED9A95F1F700008111F5CF8091E80049
+:100FC00085FF0DC040E050E063E070E0CE01019687
+:100FD0000E94F7098091E8008E778093E8000F90D7
+:100FE0000F900F90DF91CF9108952091E40124306C
+:100FF000F1F422E02093E9002FEF3091E800215036
+:1010000035FD06C035ED3A95F1F700002111F5CF19
+:101010002091E80025FF0BC040E050E065E070E063
+:101020000E94F7098091E8008E778093E800089588
+:10103000CF93DF93EC019091E401943009F046C026
+:1010400080910C018823D9F080910D018823B9F09B
+:101050009093E9008FEF9091E800815095FD06C0D4
+:1010600095E19A95F1F700008111F5CF8091E800A4
+:1010700085FF2CC040E050E060E170E017C081E0E7
+:101080008093E9008FEF9091E800815095FD06C0B4
+:1010900095ED9A95F1F700008111F5CF8091E80068
+:1010A00085FF14C040E050E068E070E0CE010E948F
+:1010B000F7098091E8008E778093E80080E1FE01D7
+:1010C000A2E5B1E001900D928A95E1F7DF91CF9111
+:1010D00008958091E301811109C00E948C0B0E9448
+:1010E000E90B8091E20084608093E2000895109201
+:1010F000E301089508950C9490210E94ED1A0E9436
+:1011000096210E948F0E0C94880742E061EC81E0EA
+:101110000E94060B42E061EC82E00E94060B42E076
+:1011200061EC83E00E94060B42E161EC84E00C94E8
+:10113000060B8091E601833009F455C030F481300C
+:1011400071F0823009F48EC008958A3009F47AC0B3
+:101150008B3009F460C0893009F09CC020C08091B8
+:10116000E501813A09F096C08091E800877F80937D
+:10117000E8008091E9019091EA01892B21F460E176
+:1011800082E591E003C060E080E090E070E00E94C2
+:10119000420A8091E8008B778093E800089580915F
+:1011A000E501813209F076C08091E9019091EA0170
+:1011B000009719F0039709F06DC08091E800877FD0
+:1011C0008093E8008091E80082FD05C08091E401F1
+:1011D0008111F8CF5FC08091F1008093620180910E
+:1011E000E8008B7753C08091E501813A09F052C045
+:1011F0008091E9019091EA01892B09F04BC080911F
+:10120000E800877F8093E8008091E80080FFFCCFB2
+:1012100080910C0136C08091E5018132D9F5809131
+:10122000E9019091EA01892BA9F58091E800877F77
+:101230008093E8000E943B0B8091E70180930C01B2
+:101240000C941F148091E501813221F58091E80012
+:10125000877F8093E8000E943B0B8091E801809398
+:10126000630108958091E501813AA1F48091E8003D
+:10127000877F8093E8008091E80080FFFCCF809119
+:1012800063018093F1008091E8008E778093E800FD
+:101290000C943B0B089584B7877F84BF88E10FB619
+:1012A000F89480936000109260000FBE90E080E898
+:1012B0000FB6F89480936100909361000FBE0E9476
+:1012C000DE0E0E948C0B0E94E90B8091E20084608C
+:1012D0008093E20078940E946F0E0E94E00E82E0FC
+:1012E00091E00E948A0E0E947E218091E401853067
+:1012F00069F40E94AE1A8091E2018823B1F30E9442
+:10130000D91A882391F30E94E109EFCF0E94E60EDB
+:10131000ECCF292F332723303105C9F064F4213075
+:10132000310581F02230310509F043C08DE690E0AF
+:1013300024E632E042C021323105F1F0223231059B
+:1013400041F137C082E190E021ED32E036C09927CB
+:101350008130910541F08230910541F0892B49F5AA
+:10136000E0E6F2E005C0E8E4F2E002C0E0E3F2E02B
+:10137000849190E09F0121C06430D8F4E62FF0E022
+:10138000EE0FFF1FEE5DFE4F2081318189E090E07E
+:1013900014C0643070F470E0FB01EE0FFF1FE65ED6
+:1013A000FE4F20813181FB01EA5EFE4F808190E09B
+:1013B00004C080E090E020E030E0FA013183208337
+:1013C000089580E189BD82E189BD09B400FEFDCFA9
+:1013D0008091D8008F7D8093D8008091E00082605A
+:1013E0008093E0008091E00081FDFCCF0895CF92D2
+:1013F000DF92EF92FF920F931F93CF93DF93EC0155
+:101400008B016A010E945A0B811133C0C114D104AF
+:1014100039F0F60180819181081B190BC80FD91F83
+:10142000E12CF12C0115110519F18091E80085FDE1
+:1014300016C08091E8008E778093E800C114D10433
+:1014400049F0F60180819181E80EF91EF182E08277
+:1014500085E00FC00E945A0B882321F30AC08991AE
+:101460008093F10001501109FFEFEF1AFF0ADACF64
+:1014700080E0DF91CF911F910F91FF90EF90DF906F
+:10148000CF9008952091EB013091EC01261737079A
+:1014900048F06115710539F42091E8002E7720930A
+:1014A000E80001C0B90140E061157105A9F1209182
+:1014B000E401222309F443C0253009F442C02091FD
+:1014C000E80023FD40C02091E80022FD32C02091B9
+:1014D000E80020FFE9CF4091F3002091F20030E0D6
+:1014E000342BFC01CF016115710559F0283031050D
+:1014F00040F481918093F100615071092F5F3F4F5B
+:10150000F1CF41E02830310509F040E02091E800BA
+:101510002E772093E800C8CF4111C9CF0AC080912F
+:10152000E401882361F0853061F08091E80083FD5B
+:101530000AC08091E80082FFF2CF80E0089582E047
+:10154000089583E0089581E008952091EB013091A2
+:10155000EC012617370748F06115710539F4209121
+:10156000E8002E772093E80001C0B901FC0120E0DB
+:101570006115710591F18091E401882309F440C05F
+:10158000853009F43FC08091E80083FD3DC0809123
+:10159000E80082FD2FC08091E80080FFE9CF209114
+:1015A000F3008091F20090E0922B6115710559F0E3
+:1015B0008830910540F424912093F10031966150D8
+:1015C00071090196F2CF21E0089709F020E080919F
+:1015D000E8008E778093E800CBCF2111CCCF0AC0F2
+:1015E0008091E401882361F0853061F08091E8000A
+:1015F00083FD0AC08091E80082FFF2CF80E0089569
+:1016000082E0089583E0089581E00895982F97304F
+:1016100058F59093E900981739F07091EC002091FB
+:10162000ED005091F00003C0242F762F50E021FFF1
+:1016300019C03091EB003E7F3093EB003091ED000C
+:101640003D7F3093ED003091EB0031603093EB0043
+:101650007093EC002093ED005093F0002091EE0089
+:1016600027FF07C09F5FD3CF8F708093E90081E091
+:10167000089580E008958091E50187FF11C0809171
+:10168000E80082FD05C08091E4018111F8CF11C00E
+:101690008091E8008B770BC08091E401882349F0AA
+:1016A0008091E80080FFF8CF8091E8008E778093EA
+:1016B000E80008952091E4003091E50095E640911E
+:1016C000EC00842F817040FF22C08091E80080FDF3
+:1016D0001CC08091E401882391F0853091F08091C5
+:1016E000EB0085FD10C04091E4005091E5004217E9
+:1016F000530729F39A01915011F784E0089582E08D
+:10170000089583E0089581E0089580E00895409170
+:10171000E80042FFDECF08950E94FA0B0E94020CFF
+:10172000E0EEF0E0808181608083E8EDF0E0808190
+:101730008F77808319BCA7EDB0E08C918E7F8C935E
+:1017400080818F7E80831092E30108950F931F9311
+:10175000CF93DF930E94FA0B0E94020CC8EDD0E0F9
+:1017600088818F77888388818068888388818F7D4E
+:10177000888319BC1092E4011092E0011092E201FA
+:101780001092E10100EE10E0F80180818B7F8083F0
+:1017900088818160888342E060E080E00E94060BDF
+:1017A000E1EEF0E080818E7F8083E2EEF0E08081E8
+:1017B00081608083808188608083F80180818E7F52
+:1017C0008083888180618883DF91CF911F910F9101
+:1017D0000895E8EDF0E080818F7E8083E7EDF0E012
+:1017E00080818160808384E082BF81E08093E30117
+:1017F0000C94A60BE8EDF0E080818E7F8083109240
+:10180000E20008951092DA001092E10008951F920C
+:101810000F920FB60F9211242F933F934F935F9324
+:101820006F937F938F939F93AF93BF93EF93FF93A8
+:101830008091E10082FF0BC08091E20082FF07C02F
+:101840008091E1008B7F8093E1000E946E0E809179
+:10185000DA0080FF1FC08091D80080FF1BC08091FC
+:10186000DA008E7F8093DA008091D90080FF0DC06E
+:1018700080E189BD82E189BD09B400FEFDCF81E030
+:101880008093E4010E94690805C019BC1092E4012C
+:101890000E9477088091E10080FF19C08091E200EA
+:1018A00080FF15C08091E2008E7F8093E2008091DE
+:1018B000E20080618093E2008091D8008062809392
+:1018C000D80019BC85E08093E4010E947B088091D8
+:1018D000E10084FF30C08091E20084FF2CC080E1F1
+:1018E00089BD82E189BD09B400FEFDCF8091D80099
+:1018F0008F7D8093D8008091E1008F7E8093E100FE
+:101900008091E2008F7E8093E2008091E20081600E
+:101910008093E2008091E001882311F084E007C009
+:101920008091E30087FD02C081E001C083E08093E5
+:10193000E4010E947D088091E10083FF29C080912D
+:10194000E20083FF25C08091E100877F8093E10062
+:1019500082E08093E4011092E0018091E1008E7FAB
+:101960008093E1008091E2008E7F8093E20080917D
+:10197000E20080618093E20042E060E080E00E944B
+:10198000060B8091F00088608093F0000E947A0836
+:10199000FF91EF91BF91AF919F918F917F916F9147
+:1019A0005F914F913F912F910F900FBE0F901F901D
+:1019B00018951F920F920FB60F9211242F933F93F9
+:1019C0004F935F936F937F938F939F93AF93BF9347
+:1019D000CF93DF93EF93FF93C091E900CF70809195
+:1019E000EC00D82FD17080FDD0E81092E9008091F2
+:1019F000F000877F8093F00078940E941D0D109274
+:101A0000E9008091F00088608093F000CD2BCF70CA
+:101A1000C093E900FF91EF91DF91CF91BF91AF911A
+:101A20009F918F917F916F915F914F913F912F91F6
+:101A30000F900FBE0F901F9018951F93CF93DF93B9
+:101A4000CDB7DEB7AA970FB6F894DEBF0FBECDBFF5
+:101A5000E5EEF1E088E08E0F9091F10091938E1306
+:101A6000FBCF0E9499088091E80083FF1FC18091FD
+:101A7000E5019091E601492F50E04A30510508F008
+:101A800015C1FA01EA5AFF4F0C941823803881F0EF
+:101A9000823809F00BC18091E9018F708093E900D1
+:101AA0008091EB0085FB882780F91092E90006C041
+:101AB0008091E1019091E201911182609091E800A2
+:101AC000977F9093E8008093F1001092F100C8C0D6
+:101AD000282F2D7F09F0EAC0882319F0823061F0A9
+:101AE000E5C08091E701813009F0E0C0933009F052
+:101AF00080E08093E2012BC08091E701811127C033
+:101B00008091E9018F7009F4D1C08093E9002091A0
+:101B1000EB0020FF1CC0933021F48091EB00806229
+:101B200014C09091EB0090619093EB0021E030E0C5
+:101B3000A90102C0440F551F8A95E2F74093EA00BD
+:101B40001092EA008091EB0088608093EB00109285
+:101B5000E9008091E800877F86C08111A7C01091BD
+:101B6000E7011F778091E3008078812B8093E30069
+:101B70008091E800877F8093E8000E943B0B809172
+:101B8000E80080FFFCCF8091E30080688093E30051
+:101B9000111102C082E001C083E08093E40186C09D
+:101BA0008058823008F082C08091E7019091E8016E
+:101BB0008C3D53E0950779F583E08A838AE2898337
+:101BC0004FB7F894DE01139620E03EE051E2E32F98
+:101BD000F0E050935700E49120FF03C0E295EF70CE
+:101BE0003F5FEF708E2F90E0EA3010F0C79601C093
+:101BF000C0968D939D932F5F243149F74FBF8091FD
+:101C0000E800877F8093E8006AE270E0CE010196E9
+:101C10000E94420A14C0AE014F5F5F4F6091E9011C
+:101C20000E948909BC01892B09F440C09091E80009
+:101C3000977F9093E80089819A810E94A50A8091FC
+:101C4000E8008B778093E80031C0803879F5809187
+:101C5000E800877F8093E8008091E0018093F100A5
+:101C60008091E8008E778093E8000E943B0B1EC0B5
+:101C700081111CC09091E7019230C0F48091E8007E
+:101C8000877F8093E8009093E0010E943B0B809156
+:101C9000E001811106C08091E30087FD02C081E070
+:101CA00001C084E08093E4010E9485088091E800EF
+:101CB00083FF0AC08091E800877F8093E8008091CD
+:101CC000EB0080628093EB00AA960FB6F894DEBF1B
+:101CD0000FBECDBFDF91CF911F9108950895CF938F
+:101CE0008091E4018823A1F0C091E900CF70909128
+:101CF000EC00892F817090FD80E8C82B1092E900DC
+:101D00008091E80083FD0E941D0DCF70C093E90013
+:101D1000CF91089590936901809368010895E091AF
+:101D20006801F0916901309721F00190F081E02D78
+:101D3000099480E00895E0916801F091690130977D
+:101D400021F00280F381E02D09940895E09168016B
+:101D5000F0916901309721F00480F581E02D09941C
+:101D6000089520916601309167018217930771F001
+:101D70009093670180936601E0916801F091690199
+:101D8000309721F00680F781E02D09940895209185
+:101D90006401309165018217930771F0909365019A
+:101DA00080936401E0916801F0916901309721F01E
+:101DB0000084F185E02D0994089508950C94DD0EBA
+:101DC0000E94F31A0E94A0030C94B91BCF92DF92D9
+:101DD000EF92FF920F931F93CF93DF93CDB7DEB7B0
+:101DE0002B970FB6F894DEBF0FBECDBF0E94B8038D
+:101DF0008BE6C82E81E0D82E00E010E0E02E802F88
+:101E00000E94A604F60141916F01F42EF826B1F468
+:101E10000F5F1F4F0E30110589F78FEF89838A837B
+:101E20001B820E94FC1A8160782F9D838C834981DC
+:101E30005A816B818D810E94890F40C09091CD01A4
+:101E400091FF04C08B870E94AC048B8520E030E0BA
+:101E50004F2D50E0922FBA01022E02C07595679562
+:101E60000A94E2F760FF24C02E83EF8221E030E085
+:101E7000690102C0CC0CDD1C9A95E2F790E08C2140
+:101E80009D21892B09F420E028870E94FC1A81609B
+:101E9000782F9A8789874E815F8168858A850E941D
+:101EA000890FF801E559FE4F8081C826C08206C01F
+:101EB0002F5F3F4F2630310569F6AACF0E94A01E42
+:101EC00010916A010E948F0E1817A1F00E948F0EC8
+:101ED00080936A012B960FB6F894DEBF0FBECDBF7C
+:101EE000DF91CF911F910F91FF90EF90DF90CF90F6
+:101EF0000C9488072B960FB6F894DEBF0FBECDBFAB
+:101F0000DF91CF911F910F91FF90EF90DF90CF90D5
+:101F10000895CF93DF93CDB7DEB72B970FB6F89424
+:101F2000DEBF0FBECDBF4F83588769877A878B8707
+:101F3000DE01119686E0FD0111928A95E9F785E0B0
+:101F4000FE01379601900D928A95E1F749815A81F9
+:101F50006B817C818D819E810E94B9162B960FB674
+:101F6000F894DEBF0FBECDBFDF91CF9108950895E5
+:101F7000CF93882309F4C2C0C82F823859F40E9435
+:101F80008F0E81FDBBC089E30E9462190E942F1A47
+:101F900089E30CC0833879F40E948F0E80FDAEC0B7
+:101FA00083E50E9462190E942F1A83E50E94A419FA
+:101FB000CF910C942F1A843859F40E948F0E82FD11
+:101FC0009DC087E40E9462190E942F1A87E4EECF19
+:101FD0008CEF8C0F813A48F48C2F0E94E320811102
+:101FE0008DC08C2F0E946219E3CF80E28C0F883065
+:101FF00048F4C77081E001C0880FCA95EAF70E94D3
+:10200000E819D6CF8BE58C0F833078F4C53A29F0E8
+:10201000C63A31F083E890E005C081E890E002C064
+:1020200082E890E0CF910C94B10E88E58C0F83315B
+:1020300008F064C0C83A39F1C93A41F1CA3A49F1E5
+:10204000CB3A51F1CC3A59F1CD3A61F1C03B69F14B
+:10205000CE3A71F1CF3A79F1C13B81F1C23B89F1BE
+:10206000C33B91F1C43B99F1C53BA1F1C63BA9F13A
+:10207000C73BB1F1C83BB9F1C93BC1F1CA3BC9F19A
+:1020800080E090E038C082EE90E035C089EE90E0CC
+:1020900032C08AEE90E02FC085EB90E02CC086EB3A
+:1020A00090E029C087EB90E026C08CEC90E023C044
+:1020B0008DEC90E020C083E891E01DC08AE891E0BB
+:1020C0001AC082E991E017C084E991E014C081E26E
+:1020D00092E011C083E292E00EC084E292E00BC075
+:1020E00085E292E008C086E292E005C087E292E0D5
+:1020F00002C08AE292E0CF910C94C70ECF9108956E
+:10210000882309F44BC0823859F40E948F0E81FF56
+:1021100045C089E30E9462190E942F1A89E30CC00E
+:10212000833871F40E948F0E80FF38C083E50E94CF
+:1021300062190E942F1A83E50E94A4190C942F1A89
+:10214000843859F40E948F0E82FF28C087E40E94D1
+:1021500062190E942F1A87E4EFCF9CEF980F913AF3
+:1021600058F390E2980F983050F4877091E001C0D6
+:10217000990F8A95EAF7892F0E94EE19DFCF9BE528
+:10218000980F933020F480E090E00C94B10E885AC0
+:10219000833120F480E090E00C94C70E08958823EA
+:1021A00021F00E94E8190C942F1A0895882321F039
+:1021B0000E94EE190C942F1A0895BF92CF92DF92CD
+:1021C000EF92FF920F931F93CF93DF9300D000D035
+:1021D00000D0CDB7DEB725E0FC01DE0111960190FD
+:1021E0000D922A95E1F7FC01D080118102812581B1
+:1021F00022952F7043815481452B09F4FCC21F3F67
+:1022000021F4FFEFDF1609F4F6C27C012E830E9451
+:10221000B70FD9821A8369817A81802F0E945E1953
+:10222000182FB92E0E9413190E94DA172E8100234D
+:1022300019F00E94051A2E81EB2DE295EF70F0E067
+:10224000E05AFF4F0C9418238B2D807F9B2D9F709D
+:10225000F92E882319F0F29480EFF822002389F0F8
+:10226000FF2009F475C280E2810F883020F48F2DA1
+:102270000E94E81903C08F2D0E94F8190E942F1A9E
+:1022800067C2812F0E948010FF2009F4B4C2105E43
+:102290008F2D183018F40E94EE1902C00E94FE190A
+:1022A00026960FB6F894DEBF0FBECDBFDF91CF915B
+:1022B0001F910F91FF90EF90DF90CF90BF900C9403
+:1022C0002F1A3B2D307F8B2D8F70303211F082957D
+:1022D000807F112319F0113021F12CC00023B9F0B7
+:1022E000222309F4A0C1213009F09DC126960FB622
+:1022F000F894DEBF0FBECDBFDF91CF911F910F913C
+:10230000FF90EF90DF90CF90BF900C94181A22238B
+:1023100019F0213009F46FC28E830E941B1A8E813E
+:1023200096C1002321F0223008F065C27CC1211142
+:1023300062C28DC1002321F0222309F474C108C2B6
+:10234000222309F484C119C22B2D269526952370CA
+:1023500030E02115310521F021303105D1F04BC29B
+:10236000002321F0812F9B2D937002C080E090E02C
+:1023700026960FB6F894DEBF0FBECDBFDF91CF918A
+:102380001F910F91FF90EF90DF90CF90BF900C9432
+:10239000B10E002321F0812F9B2D937002C080E0AD
+:1023A00090E026960FB6F894DEBF0FBECDBFDF914A
+:1023B000CF911F910F91FF90EF90DF90CF90BF9042
+:1023C0000C94C70E812F002319F00E94A81D02C093
+:1023D0000E94101E26960FB6F894DEBF0FBECDBF2A
+:1023E000DF91CF911F910F91FF90EF90DF90CF90F1
+:1023F000BF900C94951E8B2D837009F07BC001114A
+:10240000FAC1812F829586958770880F880F912F4A
+:102410009F70C92ED12CE12CF12C082E04C0CC0CBD
+:10242000DD1CEE1CFF1C0A94D2F714FF12C04FE013
+:1024300050E060E070E004C0440F551F661F771F36
+:102440008A95D2F7CB01BA016095709580959095E9
+:1024500003C060E070E0CB012B2D269526952370FC
+:10246000422F50E042305105D9F04330510569F117
+:102470006C297D298E299F294130510551F12696DD
+:102480000FB6F894DEBF0FBECDBFDF91CF911F9185
+:102490000F91FF90EF90DF90CF90BF900C940118B8
+:1024A0006C297D298E299F2926960FB6F894DEBFC8
+:1024B0000FBECDBFDF91CF911F910F91FF90EF9095
+:1024C000DF90CF90BF900C941D180E940118C70197
+:1024D000B60126960FB6F894DEBF0FBECDBFDF91D2
+:1024E000CF911F910F91FF90EF90DF90CF90BF9011
+:1024F0000C94E517002319F08B2D817001C086958F
+:10250000882309F478C1812F829586958770880F7A
+:10251000880F912F9F70C92ED12CE12CF12C082E01
+:1025200004C0CC0CDD1CEE1CFF1C0A94D2F714FF77
+:1025300012C04FE050E060E070E004C0440F551F4F
+:10254000661F771F8A95D2F7CB01BA016095709507
+:102550008095909503C060E070E0CB012B2D26950F
+:1025600026952370422F50E042305105D9F0433078
+:10257000510569F16C297D298E299F29413051052A
+:1025800051F126960FB6F894DEBF0FBECDBFDF9196
+:10259000CF911F910F91FF90EF90DF90CF90BF9060
+:1025A0000C94DB186C297D298E299F2926960FB65D
+:1025B000F894DEBF0FBECDBFDF91CF911F910F9179
+:1025C000FF90EF90DF90CF90BF900C94F7180E948F
+:1025D000DB18C701B60126960FB6F894DEBF0FBE12
+:1025E000CDBFDF91CF911F910F91FF90EF90DF90C2
+:1025F000CF90BF900C94BF18103FD1F118F4103E4B
+:1026000050F4A1C0123F09F463C008F44CC0133F5A
+:1026100009F473C098C01F708B2D8F710023A1F037
+:102620000E945818812F26960FB6F894DEBF0FBE71
+:10263000CDBFDF91CF911F910F91FF90EF90DF9071
+:10264000CF90BF900C94CF100E947918812F2696BE
+:102650000FB6F894DEBF0FBECDBFDF91CF911F91B3
+:102660000F91FF90EF90DF90CF90BF900C94D61019
+:102670000023A9F02111BFC08B2D8F7126960FB6B4
+:10268000F894DEBF0FBECDBFDF91CF911F910F91A8
+:10269000FF90EF90DF90CF90BF900C949E18223067
+:1026A00008F0A9C0E9CF0023A9F08B2D8F712696E1
+:1026B0000FB6F894DEBF0FBECDBFDF91CF911F9153
+:1026C0000F91FF90EF90DF90CF90BF900C9458182F
+:1026D000002359F38B2D8F7126960FB6F894DEBF29
+:1026E0000FBECDBFDF91CF911F910F91FF90EF9063
+:1026F000DF90CF90BF900C947918002399F08B2D28
+:102700008F7126960FB6F894DEBF0FBECDBFDF9156
+:10271000CF911F910F91FF90EF90DF90CF90BF90DE
+:102720000C94431826960FB6F894DEBF0FBECDBFAB
+:10273000DF91CF911F910F91FF90EF90DF90CF909D
+:10274000BF900C9439180023A9F0222309F4ADCFCF
+:10275000812F26960FB6F894DEBF0FBECDBFDF9156
+:10276000CF911F910F91FF90EF90DF90CF90BF908E
+:102770000C94B80F222309F4ADCF812F26960FB603
+:10278000F894DEBF0FBECDBFDF91CF911F910F91A7
+:10279000FF90EF90DF90CF90BF900C9480104B2D66
+:1027A0004F70612FC7010E94550226960FB6F8940C
+:1027B000DEBF0FBECDBFDF91CF911F910F91FF9074
+:1027C000EF90DF90CF90BF900C945D174B2D4F7022
+:1027D000612FC70126960FB6F894DEBF0FBECDBF9E
+:1027E000DF91CF911F910F91FF90EF90DF90CF90ED
+:1027F000BF900C94AD0426960FB6F894DEBF0FBEC2
+:10280000CDBFDF91CF911F910F91FF90EF90DF909F
+:10281000CF90BF9008950E94051A0E94151A0E9439
+:10282000DA190E942F1A0E94461F0E94951E80E00E
+:1028300090E00E94B10E80E090E00C94C70E0E94E0
+:10284000F5190C940B140E945319292F22952F70FF
+:1028500030E02C3031054CF42A3031056CF4225034
+:1028600031092230310588F407C02C30310549F098
+:102870002F30310531F009C0803E48F0803F29F407
+:1028800006C093FB882780F9089580E0089581E0D1
+:102890000895CF93DF9300D000D01F92CDB7DEB75D
+:1028A0000F900F900F900F900F90DF91CF910895A0
+:1028B000CF93DF9300D000D000D0CDB7DEB72696FF
+:1028C0000FB6F894DEBF0FBECDBFDF91CF91089554
+:1028D0001F93CF93DF93C091790116E080917A0125
+:1028E000C81799F0D0E01C9FF0011D9FF00D112436
+:1028F000E558FE4F408151816281738184819581C9
+:102900000E9458142196C770E9CFDF91CF911F9193
+:1029100008954091AB015091AC016091AD0170916F
+:10292000AE018091AF019091B0010C945814809148
+:10293000B00182958F7009F054C08091AD01882359
+:1029400009F44FC080917901A0917A016091AB01A7
+:102950007091AC014091AE015091AF01B6E08A1781
+:1029600009F43FC090E041155105C1F17F3F11F4DA
+:102970006F3FA1F1B89FF001B99FF00D1124E55808
+:10298000FE4F218172132AC02081621327C0228149
+:10299000211124C0238134812417350710F42150DC
+:1029A0003109241B350B283C3105C0F42091B001BE
+:1029B0002F7020612093B00126E0289FF001299F0D
+:1029C000F00D1124E058FE4F80818F70806180836C
+:1029D0008BEA91E00E94DD100C94681401968770D8
+:1029E000BECF0895CF92DF92EF92FF920F931F9385
+:1029F000CF93DF93CDB7DEB762970FB6F894DEBF03
+:102A00000FBECDBF8C0185E0F801DE011D9601905F
+:102A10000D928A95E1F7D8014C9111965C9111972E
+:102A200012966C9112971396CD90DC90149730917A
+:102A3000AB017091AC018091AE019091AF01009714
+:102A400009F46BC17F3F19F43F3F09F466C1E09080
+:102A5000AD01EE2009F4C0C02091B001C816D9061E
+:102A600028F0F601E81BF90BCF0104C08095909582
+:102A70008C0D9D1DFF24F394883C910578F0F12C7A
+:102A8000207F09F0C6C07C2DD98AC88A89890E9416
+:102A900049148BEA91E00E94DD10B1C0822F807F43
+:102AA00009F046C0751314C0341312C0611110C070
+:102AB0002F7020612093B0010E9489148BEA91E06D
+:102AC0000E94DD108091B001D80115968C932EC024
+:102AD000CD2819F15F3F11F44F3FF9F0F62E611147
+:102AE0001CC08091790120917A0136E0821709F4A7
+:102AF0005AC090E0389FF001399FF00D1124E5583D
+:102B0000FE4F7181571306C07081471303C0728155
+:102B1000711103C001968770E9CFF62E662309F480
+:102B200018C18091B00181608093B001F12C11C176
+:102B3000751308C0341306C0611104C08091B00140
+:102B4000D801C3C04D875E878D859E856A8B0E94A4
+:102B500023146A898823E1F16623D1F12091B00121
+:102B6000822F82958F7090E0029774F08091AB0174
+:102B70009091AC0198878F831986DB86CA862C8753
+:102B8000CE0107960E94DD1086E0F801ABEAB1E0C5
+:102B900001900D928A95E1F70E9497140E94891482
+:102BA000FF24F394D6C04D875E878D859E850E9455
+:102BB0005319292F22952F7030E0223031050CF067
+:102BC000BCC09F7009F0B6C0805E883008F4C1C0F8
+:102BD000C8010E94DD10E4CFC816D90608F453C01E
+:102BE000F601E81BF90BCF01883C910508F450C0B1
+:102BF000F12C7C2DD98AC88A89890E944914EBEA74
+:102C0000F1E086E0DF011D928A95E9F70E948914C0
+:102C1000A0C0751314C0341312C0611110C080918C
+:102C2000B001F8018583C8010E94DD1086E0EBEA5F
+:102C3000F1E0DF011D928A95E9F7FE2C8AC04D87ED
+:102C40005E878D859E856A8B0E9423146A898823FE
+:102C500009F4BECF662309F4BBCF2091B001822FC7
+:102C600082958F7090E002970CF48ECF8091AB012B
+:102C70009091AC019A8389831B82DD82CC822E8362
+:102C8000CE0101967FCF809590958C0D9D1DACCF88
+:102C9000F62E662309F49CCF75132EC034132CC076
+:102CA0002091B00120FD1FC0822F82958F70D9F036
+:102CB000D80115962C9315978F3049F08F5F982F78
+:102CC0009295907F822F8F70892B15968C93C801D7
+:102CD0000E94DD1086E0F801ABEAB1E001900D92B0
+:102CE0008A95E1F793CF86E0F801ABEAB1E0019075
+:102CF0000D928A95E1F72DC04D875E878D859E8563
+:102D00000E942314811140CF8091B0018160809393
+:102D1000B001C8010E94DD101CC0662309F458CF21
+:102D20004D875E878D859E850E942314882309F434
+:102D30004FCF2ACF811148CF0CC0243031050CF081
+:102D400047CF9F7009F440CFF8019581907F09F03B
+:102D50003BCF8F2D62960FB6F894DEBF0FBECDBF6E
+:102D6000DF91CF911F910F91FF90EF90DF90CF9067
+:102D700008951F93CF93DF93CDB7DEB72C970FB68F
+:102D8000F894DEBF0FBECDBF4F83588769877A871F
+:102D90008B879C87CE0107960E94F214882369F0E6
+:102DA0008F8198852A853B85232BF1F19F3F09F080
+:102DB00063C08F3F09F060C037C086E0FE013796E0
+:102DC000DE01119601900D928A95E1F76F81788569
+:102DD000EA85FB85309741F17F3F11F46F3F21F188
+:102DE00020917A0130E0C9010196877099274091BE
+:102DF000790150E08417950709F447C069837A8305
+:102E0000FD83EC8396E0929FD001939FB00D112437
+:102E1000A558BE4FFE01319601900D929A95E1F7AB
+:102E200080937A010E94681416E080917901909154
+:102E30007A018917C1F1189FC001112485589E4F4E
+:102E40000E94F214882379F1E09179011E9FF0012C
+:102E50001124E558FE4F4081518162817381848144
+:102E600095810E9458148091790190E001968770B5
+:102E7000992780937901D9CF4F81588569857A85C3
+:102E80008B859C850E945814CFCF0E941F141092EE
+:102E90007A0110927901EBEAF1E086E0DF011D9200
+:102EA0008A95E9F7C1CF2C960FB6F894DEBF0FBE16
+:102EB000CDBFDF91CF911F910895EF92FF920F93B5
+:102EC0001F93CF93DF938C01892B09F46CC0F12CF5
+:102ED000EE24E394E8012196F8018491843740F4CC
+:102EE000843008F051C0813081F0823019F15BC02C
+:102EF000853709F444C0A8F19CE7980F903708F093
+:102F000052C08F770E94801041C00E5F1F4FFE019C
+:102F1000C49180E28C0F883048F4C7708E2D01C0B8
+:102F2000880FCA95EAF70E94081A14C08C2F0E94D5
+:102F3000B80F2DC00E5F1F4FFE01C49180E28C0FB1
+:102F4000883058F4C7708E2D01C0880FCA95EAF7F3
+:102F50000E940E1A0E942F1A1AC08C2F0E948010F5
+:102F600016C00E5F1F4FFE01C491CC2381F08FE984
+:102F70009FE00197F1F700C00000C150F6CF0E5F4F
+:102F80001F4FFE01F49003C00E94B80F8E018F2DD9
+:102F9000882309F49FCFEFE9FFE03197F1F700C0F4
+:102FA00000008150F5CFDF91CF911F910F91FF90DD
+:102FB000EF90089508956093B5017093B6018093E2
+:102FC000B7019093B8010C940B140F931F930091C9
+:102FD000B5011091B6012091B7013091B801DC0123
+:102FE000CB01802B912BA22BB32B8093B501909317
+:102FF000B601A093B701B093B8011F910F910C9443
+:103000000B140F931F930091B5011091B6012091FD
+:10301000B7013091B801DC01CB0180239123A223B9
+:10302000B3238093B5019093B601A093B701B093F9
+:10303000B8011F910F910C940B140F931F930091E3
+:10304000B5011091B6012091B7013091B801DC01B2
+:10305000CB0180279127A227B3278093B5019093B6
+:10306000B601A093B701B093B8011F910F910C94D2
+:103070000B141092B1011092B2011092B301109290
+:10308000B4010C940B1441E050E060E070E004C027
+:10309000440F551F661F771F8A95D2F74093B101E1
+:1030A0005093B2016093B3017093B4010C940B146C
+:1030B00041E050E060E070E004C0440F551F661F1F
+:1030C000771F8A95D2F78091B1019091B201A091BA
+:1030D000B301B091B401482B592B6A2B7B2B409341
+:1030E000B1015093B2016093B3017093B4010C9499
+:1030F0000B1441E050E060E070E004C0440F551F45
+:10310000661F771F8A95D2F7409550956095709508
+:103110008091B1019091B201A091B301B091B4013D
+:10312000482359236A237B234093B1015093B20172
+:103130006093B3017093B4010C940B1441E050E020
+:1031400060E070E004C0440F551F661F771F8A952A
+:10315000D2F78091B1019091B201A091B301B091E9
+:10316000B401482759276A277B274093B101509320
+:10317000B2016093B3017093B4010C940B140F93DC
+:103180001F930091B1011091B2012091B3013091D0
+:10319000B401DC01CB01802B912BA22BB32B8093AC
+:1031A000B1019093B201A093B301B093B4011F9108
+:1031B0000F910C940B140F931F930091B101109178
+:1031C000B2012091B3013091B401DC01CB01802325
+:1031D0009123A223B3238093B1019093B201A093D2
+:1031E000B301B093B4011F910F910C940B140F9382
+:1031F0001F930091B1011091B2012091B301309160
+:10320000B401DC01CB0180279127A227B32780934B
+:10321000B1019093B201A093B301B093B4011F9197
+:103220000F910C940B140895CF92DF92EF92FF92BE
+:103230000F931F93CF93DF938C01C090B501D09073
+:10324000B601E090B701F090B8018091B101909182
+:10325000B201A091B301B091B401C82AD92AEA2AD7
+:10326000FB2ACFE1D0E0D701C6010C2E04C0B695F1
+:10327000A795979587950A94D2F780FF06C0B80165
+:103280008C2F0E94ED06019721F4219760F780E0D2
+:1032900001C08C2FDF91CF911F910F91FF90EF9084
+:1032A000DF90CF900895CF93DF93EC010E94141923
+:1032B000BE010E94ED06DF91CF910895CB010E94DF
+:1032C0005319089590910C01992321F090910D01CB
+:1032D000911109C020910E0130910F01F901329630
+:1032E0009FEF40E01FC0982F9695969596959F303A
+:1032F00050F5E0910E01F0910F01E90FF11D87707B
+:1033000021E030E0A90102C0440F551F8A95E2F781
+:10331000CA019181892B818308959F3F39F04F5FC6
+:103320004E3041F051915813F8CF0DC05111F7CFE5
+:10333000942FF5CF9F3F39F0F901E90FF11D97FD6B
+:10334000FA9582830895089590910C01992321F0B4
+:1033500090910D01911109C020910E0130910F0142
+:10336000F9013296205F3F4F1FC0982F9695969592
+:1033700096959F30F0F4E0910E01F0910F01E90F66
+:10338000F11D877021E030E0A90102C0440F551FF4
+:103390008A95E2F7CA0180959181892381830895F6
+:1033A0003196E217F30729F090819813F9CF108234
+:1033B000F7CF089581E090E0E0910E01F0910F01C8
+:1033C000E80FF91F1082019680319105A9F7089541
+:1033D0009091CC01892B8093CC0108958095909198
+:1033E000CC0189238093CC0108951092CC010895DB
+:1033F0009091CB01892B8093CB010895809590917A
+:10340000CB0189238093CB0108951092CB010895BD
+:103410009091CA01892B8093CA010895809590915B
+:10342000CA0189238093CA0108951092CA010895A0
+:103430008093B90108951092B901089580910E0109
+:1034400090910F01FC0131969C01205F3F4F80E07D
+:10345000919191118F5FE217F307D1F70895E091F1
+:103460000E01F0910F018091CC018083E0910E015B
+:10347000F0910F0190818091CB01892B8083E091A5
+:103480000E01F0910F0190818091CA01892B8083F8
+:103490008091B901882361F0E0910E01F0910F0154
+:1034A0009081892B80830E941E1A81111092B9018C
+:1034B00080910E0190910F010C949B0ECF92DF92A0
+:1034C000EF92FF926C01EE24FF24C114D104E104B9
+:1034D000F10421F0C701B60120E101C020E0C72EB0
+:1034E000D82EE92EFF24C114D104E104F10419F00F
+:1034F000285FC701B6016B017C0154E0F694E794A4
+:10350000D794C7945A95D1F7C114D104E104F104BA
+:1035100019F02C5FC701B6016B017C0142E0F69403
+:10352000E794D794C7944A95D1F7C114D104E10424
+:10353000F10419F02E5FC701B601DC01CB01B6958D
+:10354000A79597958795892B8A2B8B2B09F02F5F51
+:10355000822FFF90EF90DF90CF9008958091E4014B
+:10356000843021F11092CE0120E488E190E00FB682
+:10357000F894A895809360000FBE2093600080E0CF
+:103580000E94880783B7817F846083BF83B781608F
+:1035900083BF7894889583B78E7F83BF88E10FB609
+:1035A000F89480936000109260000FBE0895089513
+:1035B0000895CF930E94D71A0E94B8030E94D81A88
+:1035C000C0E08C2F0E94A604811104C0CF5FCE30D2
+:1035D000C1F701C081E0CF9108950E941F140E949D
+:1035E0008F0E0C94880782E084BD93E095BD9AEF1E
+:1035F00097BD80936E0008952FB7F8948091CF0106
+:103600009091D001A091D101B091D2012FBF089526
+:10361000CF92DF92EF92FF920F931F932FB7F89400
+:103620004091CF015091D0016091D1017091D201B0
+:103630002FBF6A017B01EE24FF248C0120E030E0E3
+:10364000C016D106E206F30610F4415051099A0162
+:10365000281B390BC9011F910F91FF90EF90DF904C
+:10366000CF9008951F920F920FB60F9211248F934F
+:103670009F93AF93BF938091CF019091D001A09180
+:10368000D101B091D2010196A11DB11D8093CF014E
+:103690009093D001A093D101B093D201BF91AF918B
+:1036A0009F918F910F900FBE0F901F9018950E94C1
+:1036B0008C0BF8942FEF87EA91E6215080409040E0
+:1036C000E1F700C0000087E090EBDC018093EE01A1
+:1036D0009093EF01A093F001B093F1019CE088E199
+:1036E0000FB6F894A895809360000FBE9093600089
+:1036F000FFCFEF92FF920F931F93CF93DF93D82FBB
+:10370000C0E08C2F0E94A60400E010E0E82EF12C0F
+:10371000C701002E02C0959587950A94E2F780FDB7
+:1037200006C00F5F1F4F0630110591F709C0602FCB
+:103730007C2F80E00E94AE04D813F3CF81E004C058
+:10374000CF5FCE30F1F680E0DF91CF911F910F91E6
+:10375000FF90EF900895CF93C82F8CE20E94791BC1
+:10376000882321F08C2FCF910C94791B80E0CF918E
+:103770000895CF930E94001D811102C00E94E61C93
+:10378000C5E6C15049F00E94B8038FE39CE9019758
+:10379000F1F700C00000F5CF89E20E94AB1B811158
+:1037A00013C18AE20E94AB1B81110E94E61C85E0D6
+:1037B0000E94AB1B81110E94571B0E940B1D80931E
+:1037C000CD0187E00E94AB1B8823A9F18BE10E9409
+:1037D000AB1B882351F08091CD0181FB222720F97A
+:1037E00091E0922790FB81F90EC08EE00E94AB1B06
+:1037F000882361F08091CD0182FB222720F991E09E
+:10380000922790FB82F98093CD0115C080E10E9440
+:10381000AB1B9091CD01882341F093FB222720F927
+:1038200081E0822780FB93F904C0892F809580FB7B
+:1038300090F99093CD018091CD010E940F1D0E94BF
+:103840001D1D8093ED0180EE0E94AB1B882341F08B
+:103850008091ED01982F909590FB80F98093ED0178
+:1038600089E30E94AB1B882359F08091ED0181FB15
+:10387000222720F991E0922790FB81F98093ED01B6
+:1038800082EE0E94AB1B882359F08091ED0182FBF0
+:10389000222720F991E0922790FB82F98093ED0195
+:1038A00086EE0E94AB1B882359F08091ED0183FBCB
+:1038B000222720F991E0922790FB83F98093ED0174
+:1038C00083EE0E94AB1B882359F08091ED0184FBAD
+:1038D000222720F991E0922790FB84F98093ED0153
+:1038E00085E30E94AB1B882359F08091ED0185FB95
+:1038F000222720F991E0922790FB85F98093ED0132
+:1039000081E30E94AB1B882359F08091ED0186FB77
+:10391000222720F991E0922790FB86F98093ED0110
+:1039200081E10E94AB1B882359F08091ED0187FB58
+:10393000222720F991E0922790FB87F98093ED01EF
+:103940008091ED010E94211D8091ED0187FB882768
+:1039500080F980930D0187E20E94AB1BC82F8EE196
+:103960000E94AB1B8111C2608FE10E94AB1B8111D1
+:10397000C46080E20E94AB1B8111C86081E20E949A
+:10398000AB1B8111C06182E20E94AB1B8111C0623E
+:1039900083E20E94AB1B8111C06484E20E94AB1BD6
+:1039A000882311F0C06802C0CC2329F08C2F0E941C
+:1039B000181D6C2F03C00E94141D682F70E080E05A
+:1039C00090E0CF910C94DB17CF9108956DEE7EEFD0
+:1039D00080E090E00E94522360E082E090E00E944C
+:1039E000402360E083E090E00E94402360E084E0B8
+:1039F00090E00E94402360E085E090E00C9440233A
+:103A000080E090E00E943A2321E08D3E9E4F09F035
+:103A100020E0822F089582E090E00C943223682FFA
+:103A200082E090E00C94402383E090E00C943223F9
+:103A3000682F83E090E00C94402384E090E00C94A5
+:103A40003223682F84E090E00C9440238091D501CC
+:103A500080FF0BC06091130185E0689FB0011124C5
+:103A600075956795759567952BC081FF09C0609125
+:103A7000130185E0689FB00111247595679520C0FA
+:103A800082FF07C06091130185E0689FB001112497
+:103A900017C09091D6019923D1F060911201961729
+:103AA00088F72091130185E0289F90011124929FAF
+:103AB000A001939F500D112470E0CA010E940423BD
+:103AC0006038710540F46115710539F002C065E098
+:103AD00070E0862F08958FE7089581E00895809122
+:103AE000D50180FF08C06091110170E07595679560
+:103AF0007595679521C081FF06C06091110170E046
+:103B00007595679519C082FF04C06091110170E03E
+:103B100010C09091D6019923C1F0609110019617C1
+:103B2000A0F780911101899FC001112470E00E94CB
+:103B300004236038710528F46115710521F0862F82
+:103B400008958FE7089581E0089561E070E0F4CF73
+:103B5000803F21F40E94261D819504C0813F29F4F5
+:103B60000E94261D8093D9010895823F21F40E946E
+:103B7000261D819504C0833F29F40E94261D809351
+:103B8000D8010895893F19F40E946F1D05C08A3F2E
+:103B900031F40E946F1D81958093DA0108958B3F67
+:103BA00021F40E946F1D819504C08C3F29F40E946E
+:103BB0006F1D8093DB010895843F21F48091D7012C
+:103BC000816017C0853F21F48091D701826011C0C8
+:103BD000863F21F48091D70184600BC0873F21F498
+:103BE0008091D701886005C0883F31F48091D7016A
+:103BF00080618093D70108958D3F21F48091D50194
+:103C000081600BC08E3F21F48091D501826005C098
+:103C10008F3F29F48091D50184608093D501089568
+:103C2000803F39F48091D90187FF6CC01092D9018F
+:103C300069C0813F29F48091D9011816BCF362C094
+:103C40009091D801823F29F497FF5CC01092D8016F
+:103C500059C0833F19F41916CCF354C0893F41F47D
+:103C60008091DA0118160CF04DC01092DA014AC0AA
+:103C70008A3F29F48091DA0187FF44C0F6CF8B3F59
+:103C800039F48091DB0187FF3DC01092DB013AC01F
+:103C90008C3F29F48091DB011816BCF333C0843FBC
+:103CA00021F48091D7018E7F17C0853F21F4809148
+:103CB000D7018D7F11C0863F21F48091D7018B7F82
+:103CC0000BC0873F21F48091D701877F05C0883FD3
+:103CD00031F48091D7018F7E8093D70113C08D3F3F
+:103CE00021F48091D5018E7F0BC08E3F21F480910D
+:103CF000D5018D7F05C08F3F29F48091D5018B7F41
+:103D00008093D5018091D80181110EC08091D90195
+:103D100081110AC08091DA01811106C08091DB0116
+:103D2000811102C01092D601089587ED91E00E94A2
+:103D3000A60E0E94FC1A9093D4018093D30108959B
+:103D40001F93CF93DF938091D3019091D4010E9470
+:103D5000081BAC019091D601992321F02091140108
+:103D600030E006C0209115018AE0289F90011124BF
+:103D70004217530708F486C08091D801C091D90139
+:103D8000D091DA011091DB01811107C0C11176C019
+:103D9000D11174C0111172C075C09F3F19F09F5F9F
+:103DA0009093D601181624F40E94261D8093D80102
+:103DB0008091D80187FF05C00E94261D81958093C0
+:103DC000D8011C1624F40E94261D8093D9018091ED
+:103DD000D90187FF05C00E94261D81958093D901D6
+:103DE0006091D801662339F1C091D901CC2319F132
+:103DF000772767FD7095872F972F0E94152223E361
+:103E000033E343E35FE30E9479220E94E22160935F
+:103E1000D8016C2F772767FD7095872F972F0E9409
+:103E2000152223E333E343E35FE30E9479220E94F8
+:103E3000E2216093D9011D1624F40E946F1D809326
+:103E4000DA018091DA0187FF05C00E946F1D81951C
+:103E50008093DA01111624F40E946F1D8093DB0118
+:103E60008091DB0187FF05C00E946F1D81958093C3
+:103E7000DB01DF91CF911F910C94951E9F3F09F0BC
+:103E80008ECF96CFDF91CF911F910895E7EDF1E0AE
+:103E900085E0DF011D928A95E9F71092D601109214
+:103EA000D5010895833081F128F4813059F08230B2
+:103EB000D1F00895853009F449C0B8F1863009F48D
+:103EC00056C0089580911501262F30E0280F311D2E
+:103ED0002F3F310524F4680F6093150108958FEF8B
+:103EE00080931501089580911401262F30E0280F4A
+:103EF000311D2F3F310524F4680F6093140108959C
+:103F00008FEF80931401089580911301262F30E0E4
+:103F1000280F311D2F3F310524F4680F60931301E2
+:103F200008958FEF80931301089580911201262F39
+:103F300030E0280F311D2F3F310524F4680F6093C6
+:103F4000120108958FEF809312010895809111015D
+:103F5000262F30E0280F311D2F3F310524F4680F44
+:103F60006093110108958FEF80931101089580915E
+:103F70001001262F30E0280F311D2F3F310524F48A
+:103F8000680F6093100108958FEF809310010895DA
+:103F9000833011F128F4813049F0823091F0089596
+:103FA000853081F120F18630C1F1089580911501AD
+:103FB000681720F4861B809315010895109215014F
+:103FC000089580911401681720F4861B80931401D2
+:103FD000089510921401089580911301681720F438
+:103FE000861B809313010895109213010895809108
+:103FF0001201681720F4861B809312010895109215
+:104000001201089580911101681720F4861B809396
+:1040100011010895109211010895809110016817FF
+:1040200020F4861B809310010895109210010895CA
+:104030000F931F938D3109F46BC008F03FC08E3091
+:1040400009F47FC0C0F4873009F469C068F4863091
+:1040500009F0B1C08091CD01817F8E7F8093CD0129
+:1040600081E08093DD01A8C0883009F4A2C08B30C4
+:1040700009F49FC0A0C0863109F49BC078F4803158
+:1040800009F472C0813109F096C00E941F1490910A
+:104090000D0181E0892780930D018BC0893109F4DE
+:1040A00088C08B3109F087C08091CD0181FB222728
+:1040B00020F991E0922790FB81F94CC0853309F4F7
+:1040C00070C048F4873209F46CC008F459C08932D2
+:1040D00009F467C070C0833438F48A3308F04EC0E6
+:1040E000883309F466C067C0833409F45AC0883441
+:1040F00009F061C00E941F140FEF13ED20E301507F
+:1041000010402040E1F700C000000E94571B51C042
+:104110000E949C210E948F0E0E9488074AC09091A5
+:10412000CD01892F8095817080FB90F929F09660F0
+:1041300098609093CD0140C0997F977F9093CD0177
+:1041400038C08091CD0182FB222720F991E092278F
+:1041500090FB82F98093CD01992359F18091CD0193
+:1041600081608093CD0125C08091CD0183FB222702
+:1041700020F991E0922790FB83F9ECCF895301C09D
+:104180008D5141E050E060E070E08A019B0104C085
+:10419000000F111F221F331F8A95D2F7C901B801E2
+:1041A00004C061E070E080E090E00E94DB170E94B4
+:1041B0001F1481E001C080E01F910F91089580E0FD
+:1041C000089580E00895CF93C82F8091DD0181305C
+:1041D00079F018F08230E9F187C0E0910E01F0919A
+:1041E0000F018081813169F0823209F07FC009C0FE
+:1041F000E0910E01F0910F018081813111F0823246
+:1042000061F48C2F0E94DF20811104C08C2F0E944A
+:1042100018201DC081E090E01AC08C2F0E94E12080
+:10422000811114C0C43179F048F4CB3079F0C03139
+:1042300009F060C082E08093DD0108C0C93219F046
+:10424000C83321F057C01092DD0154C081E0817065
+:1042500053C0C93289F118F5C43171F1A8F4C730DF
+:1042600009F046C08AE08093150194E1909314010F
+:1042700093E0909313018093120188E080931101E1
+:1042800088E28093100134C0CE51C63088F5EC2FFF
+:10429000F0E0E65DFE4F80818093DC0129C0CE34E2
+:1042A000E9F020F4CB3421F56AE013C0C13579F090
+:1042B000C235F1F461E00DC08091DC01882319F072
+:1042C0001092DC0115C081E08093DD0115C061E032
+:1042D00006C08091DC010E94521F0AC06AE08091F2
+:1042E000DC010E94C81F04C01092DD0180E004C000
+:1042F00081E002C080E0ABCFCF910895E1E8F0E02B
+:104300008081886080838081816080838FB7F8940A
+:1043100093E09093890090ED909388008FBF08956B
+:10432000EFE6F0E08081826080830895EFE6F0E0C0
+:1043300080818D7F80830895EFE6F0E0908182E0B8
+:104340008927808308951F920F920FB60F92112430
+:104350002F933F934F935F936F937F938F939F938D
+:10436000AF93BF93EF93FF938091DE019091DF01B4
+:1043700001969093DF018093DE01811103C082E0FA
+:104380000E948807E091DF01E695E695F0E0E252B1
+:10439000FC4FE4918091DE018E1303C080E00E9407
+:1043A0008807FF91EF91BF91AF919F918F917F917E
+:1043B0006F915F914F913F912F910F900FBE0F9092
+:1043C0001F90189504D06894B1118DC0089570D0D5
+:1043D00088F09F5790F0B92F9927B751A0F0D1F0EE
+:1043E000660F771F881F991F1AF0BA95C9F712C078
+:1043F000B13081F077D0B1E0089574C0672F782F85
+:104400008827B85F39F0B93FCCF3869577956795E3
+:10441000B395D9F73EF490958095709561957F4F4F
+:104420008F4F9F4F0895E89409C097FB3EF49095F5
+:104430008095709561957F4F8F4F9F4F9923A9F07D
+:10444000F92F96E9BB279395F6958795779567950C
+:10445000B795F111F8CFFAF4BB0F11F460FF1BC050
+:104460006F5F7F4F8F4F9F4F16C0882311F096E9E3
+:1044700011C0772321F09EE8872F762F05C0662391
+:1044800071F096E8862F70E060E02AF09A95660F4A
+:10449000771F881FDAF7880F9695879597F9089503
+:1044A00057FD9058440F551F59F05F3F71F04795E5
+:1044B000880F97FB991F61F09F3F79F087950895CA
+:1044C000121613061406551FF2CF4695F1DF08C0E9
+:1044D000161617061806991FF1CF86957105610506
+:1044E00008940895E894BB2766277727CB0197F9AE
+:1044F00008950BD078C069D028F06ED018F09523BD
+:1045000009F05AC05FC01124EECFCADFA0F3959F17
+:10451000D1F3950F50E0551F629FF001729FBB27AA
+:10452000F00DB11D639FAA27F00DB11DAA1F649F56
+:104530006627B00DA11D661F829F2227B00DA11D09
+:10454000621F739FB00DA11D621F839FA00D611D8F
+:10455000221F749F3327A00D611D231F849F600DB0
+:10456000211D822F762F6A2F11249F5750408AF0E9
+:10457000E1F088234AF0EE0FFF1FBB1F661F771F75
+:10458000881F91505040A9F79E3F510570F014C00C
+:10459000AACF5F3FECF3983EDCF38695779567955D
+:1045A000B795F795E7959F5FC1F7FE2B880F911D93
+:1045B0009695879597F9089597F99F6780E870E039
+:1045C00060E008959FEF80EC089500240A94161689
+:1045D000170618060906089500240A9412161306F1
+:1045E000140605060895092E0394000C11F488237F
+:1045F00052F0BB0F40F4BF2B11F460FF04C06F5F9B
+:104600007F4F8F4F9F4F089597FB072E16F400940E
+:1046100007D077FD09D00E941E2307FC05D03EF489
+:10462000909581959F4F0895709561957F4F08955E
+:10463000EE0FFF1F0590F491E02D0994AA1BBB1B00
+:1046400051E107C0AA1FBB1FA617B70710F0A61B92
+:10465000B70B881F991F5A95A9F780959095BC01B3
+:10466000CD010895F999FECF92BD81BDF89A9927A1
+:1046700080B50895A8E1B0E042E050E00C945A23E0
+:10468000262FF999FECF92BD81BDF89A019700B40B
+:10469000021639F01FBA20BD0FB6F894FA9AF99AAB
+:1046A0000FBE08950196272F0E9441230C944023AA
+:1046B000DC01CB01FC01F999FECF06C0F2BDE1BDE2
+:1046C000F89A319600B40D9241505040B8F70895D1
+:0446D000F894FFCF8C
+:1046D40020028A071808F507C1078D070101BA01EE
+:1046E40028080A03140A3F4D36399F0352031C035A
+:1046F400E30276028F02A802C10201020304050646
+:044704000708090099
+:00000001FF
diff --git a/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.png b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.png Binary files differnew file mode 100644 index 0000000000..34762ecb75 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/romanzolotarev-norman-qwerty-osx/romanzolotarev-norman-qwerty-osx.png diff --git a/keyboard/ergodox_ez/keymaps/sneako/README.md b/keyboard/ergodox_ez/keymaps/sneako/README.md new file mode 100644 index 0000000000..8dd110ee68 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/sneako/README.md @@ -0,0 +1,6 @@ +# ergodox_keymap + +Based on the default Ergodox EZ firmware + +Replaced the left side Bksp with a Crtl/Esc, this really helps in vim. +Removed the Ctrls from the Z and / keys. diff --git a/keyboard/ergodox_ez/keymaps/sneako/keymap.c b/keyboard/ergodox_ez/keymaps/sneako/keymap.c new file mode 100644 index 0000000000..0c68631029 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/sneako/keymap.c @@ -0,0 +1,187 @@ +// Based on `default_osx` +// Replace left Bksp with Ctrl/Esc +// Remove the Ctrl from Z and / +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * |Ctrl/Esc| A | S | D | F | G |------| |------| H | J | K | L |; / L2| LGui | + * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | App | LGui | | Alt |Ctrl/Esc| + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +// 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_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, + KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(1), + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, + ALT_T(KC_APP), KC_LGUI, + KC_HOME, + KC_SPC,KC_BSPC,KC_END, + // right hand + KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + TG(1), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT), + MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, + KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, + KC_LALT, CTL_T(KC_ESC), + KC_PGUP, + KC_PGDN,KC_TAB, KC_ENT + ), +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, + KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, + KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,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_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + 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_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + 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) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboard/ergodox_ez/keymaps/sneako/sneako.hex b/keyboard/ergodox_ez/keymaps/sneako/sneako.hex new file mode 100644 index 0000000000..1db1728652 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/sneako/sneako.hex @@ -0,0 +1,1152 @@ +:100000000C9465020C94A9020C94A9020C94A90208
+:100010000C94A9020C94A9020C94A9020C94A902B4
+:100020000C94A9020C94A9020C94720C0C94440D2B
+:100030000C94A9020C94A9020C94A9020C94A90294
+:100040000C94A9020C940E220C94A9020C94A902FF
+:100050000C94A9020C949D1B0C94A9020C94A90267
+:100060000C94A9020C94A9020C94A9020C94A90264
+:100070000C94A9020C94A9020C94A9020C94A90254
+:100080000C94A9020C94A9020C94A9020C94A90244
+:100090000C94A9020C94A9020C94A9020C94A90234
+:1000A0000C94A9020C94A9020C94A902B10DD30DD1
+:1000B000C10ED30DC10E180E3B0EC10E900EA30E35
+:1000C0008F118F11CC11CC110F124D1266146614C2
+:1000D00066126614671367133A1466146614511493
+:1000E0000000F0A12E004C002971E10035810000D4
+:1000F0001E00140004001D0034004D001F001A00F3
+:1001000016001B00E1042A0020000800070006007A
+:1001100050002C0021001500090019004F004A0072
+:10012000220017000A000500000065745000015409
+:100130000000007F0000E3004F0001540000007742
+:100140000000E20023001C000B00110000002971D8
+:10015000240018000D00100052004B0025000C0078
+:100160000E00360051002800260012000F00370054
+:100170002F002B00270013003382380030004E0080
+:100180002D0031003478E500C100000001000100BD
+:1001900001000100010000003A001E0220022202BC
+:1001A000010001003B001F022102230201000100A7
+:1001B0003C002F0226022F00010001003D0030020A
+:1001C00027023000010001003E00310235003502F7
+:1001D000000001000100010000000100000001001A
+:1001E0000100010000000100000001003F0052007A
+:1001F00051002402000001004000240021001E00E4
+:10020000010001004100250022001F00370001000D
+:1002100042002600230020002700010043002502A1
+:100220002E0231002E0001004400450001000100B3
+:1002300001000000010001000100010001000000B8
+:1002400001000100010001000100010001000100A6
+:10025000F2000100010001000100F000F1000100C6
+:10026000F400010001000100F3000100F5000100AD
+:100270000100010001000100000001000100010077
+:100280000000010000000100010001000000010069
+:100290000000010001000100010001000000010058
+:1002A0000100010001000100A9000100010001009E
+:1002B0000100AC00AA00B600010001000100AB0083
+:1002C000A80001000100010001000100010001007F
+:1002D00001000100AE00010001000000160345000E
+:1002E000720067006F0044006F0078002000450036
+:1002F0005A00000016034500720067006F004400BA
+:100300006F007800200045005A0000000403090433
+:1003100009026D00040100A0FA09040000010301B4
+:100320000100092111010001223F00070581030896
+:10033000000A090401000103010200092111010062
+:1003400001224D000705820308000A09040200018A
+:100350000300000009211101000122360007058376
+:100360000308000A09040300010300000009211129
+:100370000100012239000705840310000112011059
+:100380000100000008EDFE07130100010200010555
+:10039000010906A101050719E029E71500250195C6
+:1003A0000875018102050819012905950575019156
+:1003B000029501750391010507190029771500259C
+:1003C00001957875018102C005010980A1018502AE
+:1003D00016010026B7001A01002AB7007510950112
+:1003E0008100C0050C0901A1018503160100269CAE
+:1003F000021A01002A9C02751095018100C00501B6
+:100400000902A1010901A100050919012905150029
+:10041000250195057501810295017503810105018D
+:10042000093009311581257F950275088106093843
+:100430001581257F950175088106050C0A3802157E
+:1004400081257F950175088106C0C005010906A1B7
+:1004500001050719E029E7150025019508750181B7
+:100460000295017508810105081901290595057591
+:100470000191029501750391010507190029FF15E6
+:100480000025FF950675088100C0000000000000EF
+:100490000000000000010204060A0F17202C3A4A4F
+:1004A0005D71879DB3C7DAE9F5FCFFFCF5E9DAC7B2
+:1004B000B39D87715D4A3A2C20170F0A060402018A
+:1004C0000000000000000000000011241FBECFEF5C
+:1004D000DAE0DEBFCDBF04B603FE24C08091EE019A
+:1004E0009091EF01A091F001B091F1018730904B14
+:1004F000A740B04BB9F41092EE011092EF011092A8
+:10050000F0011092F10114BE84B7877F84BF88E1A7
+:100510000FB6F89480936000109260000FBEE0E088
+:10052000FFE3099511E0A0E0B1E0EAEAF7E402C0D8
+:1005300005900D92A433B107D9F711E0A4E3B1E01F
+:1005400001C01D92AE3EB107E1F70E94B6090C94BE
+:10055000D3230C94000061110BC0FC01828188231D
+:1005600021F085EE0E94231003C085EE0E94EB105F
+:1005700080E090E0089508956091B1017091B2011A
+:100580008091B3019091B4010E94C91A56985E9867
+:1005900025982D9826982E9827982F98813019F015
+:1005A000823021F00895259A2D9A0895269A2E9A40
+:1005B00008950C94BC0256985E9825982D9826981C
+:1005C0002E9827982F988FEF90E090938900809332
+:1005D000880090938B0080938A0090938D00809385
+:1005E0008C00259A2D9A2FEF80E792E021508040D1
+:1005F0009040E1F700C00000269A2E9A2FEF80E786
+:1006000092E0215080409040E1F700C00000279A1E
+:100610002F9A2FEF80E792E0215080409040E1F741
+:1006200000C0000025982D982FEF80E792E0215020
+:1006300080409040E1F700C0000026982E982FEFF0
+:1006400080E792E0215080409040E1F700C0000038
+:1006500027982F9856985E9825982D9826982E982A
+:1006600027982F98089589EA8093800089E08093E5
+:10067000810024982C983F988AB18F748AB96E981B
+:10068000479A8BB1806B8BB9769A0E94DB020C94EF
+:10069000BB0280E2809300018091340181110EC081
+:1006A0000E94980381E0809334012FEF83ED90E363
+:1006B000215080409040E1F700C0000080E40E949B
+:1006C0009E038093000181112EC00E94C803809375
+:1006D0000001811128C00E94C8038093000181118C
+:1006E00022C08FE30E94C8038093000181111BC0C8
+:1006F0000E94C00380E40E949E0380930001811148
+:1007000012C08CE00E94C8038093000181110BC0CD
+:100710000E94C80380930001811105C08FE30E94ED
+:10072000C803809300010E94C003809100010895D6
+:100730001092B9008AE08093B800089594EA9093EB
+:10074000BC009091BC0097FFFCCF9091B900987FBE
+:10075000983021F0903111F081E008958093BB0032
+:1007600084E88093BC008091BC0087FFFCCF80911F
+:10077000B900887F883111F0803471F780E00895E6
+:1007800084E98093BC008091BC0084FDFCCF089577
+:100790008093BB0084E88093BC008091BC0087FFFD
+:1007A000FCCF9091B900987F81E0983209F480E005
+:1007B000089584E88093BC008091BC0087FFFCCF43
+:1007C0008091BB00089580910001811115C080E4E3
+:1007D0000E949E038093000181110CC082E10E945F
+:1007E000C80380930001811105C08FEF0E94C803E8
+:1007F000809300010E94C00384B1807F84B985B1D9
+:10080000807F85B98AB1837F8AB98BB1837F8BB9A9
+:100810003E98469808950E944903809300010E94E3
+:10082000E30380B38C7080BB81B3836F81BBA6E38D
+:10083000B1E0E4E4F1E08EE08E0F11921D928E1390
+:10084000FCCF0C943303BF92CF92DF92EF92FF92D2
+:100850000F931F93CF93DF9380910001882379F04A
+:10086000809135018F5F80933501811108C00E940E
+:10087000490380930001811102C00E94DB0206E35C
+:1008800011E0C0E0D0E0DD24D39482E0C82EEE2455
+:10089000E394F12CC730D10500F58091000181115E
+:1008A00064C080E40E949E0380930001811112C005
+:1008B00082E10E94C8038093000181110BC0C7012F
+:1008C0000C2E01C0880F0A94EAF780950E94C80395
+:1008D000809300010E94C00348C0CA30A1F028F4F0
+:1008E000C83059F0C93061F005C0CC3089F070F0E3
+:1008F000CD3089F0209A289810C0219A29980DC0EF
+:10090000229A2A980AC0239A2B9807C0529A01C0AB
+:10091000539A5B9802C03E9A469890EA9A95F1F7EE
+:100920009FB1799902C082E001C080E091709D255D
+:10093000982B7C9902C084E001C080E0892B7D99CE
+:1009400002C038E001C030E0832B7E9902C020E174
+:1009500001C020E0822B9FB19095991F9927991F84
+:100960009295990F907E892B0FC080910001811183
+:1009700049C080E40E949E0380930001882379F19E
+:10098000B12C0E94C0038B2DF8019081981719F0AB
+:100990008083C09201010E94E30321960F5F1F4FE5
+:1009A000CE30D10509F076CF80910101882361F125
+:1009B000815080930101882339F08FE99FE00197EE
+:1009C000F1F700C0000020C0A4E4B1E0E6E3F1E0EC
+:1009D000CF01825F91919D938E13FCCF15C083E16F
+:1009E0000E94C803809300018111CACF81E40E9454
+:1009F0009E03809300018111C3CF0E94D903B82EBA
+:100A0000B094BFCF80E0C0CF0E94D90281E0DF91D7
+:100A1000CF911F910F91FF90EF90DF90CF90BF90FB
+:100A20000895E82FF0E0EC5BFE4F80810895089573
+:100A3000089596E0799FF001112494E5899FE00DD7
+:100A4000F11D1124E60FF11DEE0FFF1FEC51FF4FBA
+:100A5000859194910895880F991FFC01E05AF04008
+:100A6000859194910895880F991FFC01E052FF4FE2
+:100A70008591949108950F931F93CF93DF93EC0189
+:100A80008115904350F5C11580E2D80708F0B3C036
+:100A9000CB3BD10590F4C83AD10508F05AC0C53A0D
+:100AA000D10508F04BC0C430D10508F0BBC1219777
+:100AB00009F0B5C101E010E0F5C1CF3FD10511F05B
+:100AC00008F0B0C1C03FD10508F092C0CE01805EF1
+:100AD0009109089708F4A6C1A2C1C11591E5D907EB
+:100AE000A8F4C23020E5D20708F09EC0C11580E509
+:100AF000D80709F485C008F091C0C11520E4D207D9
+:100B000008F08DC1DD278E01106CCCC1C11580E8C5
+:100B1000D80758F4C11590E7D90708F07CC1C11572
+:100B200020E6D20708F422C17AC1C11580E9D807AE
+:100B300008F075C1DF708E01106AB4C1C53AD105E5
+:100B400009F472C1C63AD10509F071C102E810E496
+:100B5000A9C1C83AD10509F46DC1C93AD10509F452
+:100B60006CC1CA3AD10509F46BC1CB3AD10509F47D
+:100B70006AC1CC3AD10509F469C1CD3AD10509F46D
+:100B800068C1C03BD10509F467C1CE3AD10509F46B
+:100B900066C1CF3AD10509F465C1C13BD10509F45D
+:100BA00064C1C23BD10509F463C1C33BD10509F45B
+:100BB00062C1C43BD10509F461C1C53BD10509F44B
+:100BC00060C1C63BD10509F45FC1C73BD10509F43B
+:100BD0005EC1C83BD10509F45DC1C93BD10509F42B
+:100BE0005CC1CA3BD10509F45BC100E014E45AC101
+:100BF0008E01106557C1CE019F700E94330553C10D
+:100C00000E948A149FEF24E38CE0915020408040A2
+:100C1000E1F700C000000E94C21B44C18091CD01D9
+:100C200081608093CD013EC10E946B1D811102C085
+:100C30000E94511D0E94881D90E09093EE018093C8
+:100C4000ED01C23090E5D90721F48091ED0181607A
+:100C500086C0C43020E5D20721F48091ED01826086
+:100C60007EC0C63080E5D80721F48091ED01846014
+:100C700076C0C83090E5D90719F48091ED0127C0FE
+:100C8000CA3020E5D20721F48091ED01806167C070
+:100C9000CC3080E5D80721F48091ED0180625FC0FF
+:100CA000CE3090E5D90721F48091ED01806457C0E2
+:100CB000C03120E5D20721F48091ED0180684FC05A
+:100CC000C23180E5D80729F48091ED018460886005
+:100CD00046C0C33090E5D90721F48091ED018E7FA5
+:100CE0003EC0C53020E5D20721F48091ED018D7F13
+:100CF00036C0C73080E5D80721F48091ED018B7FA5
+:100D00002EC0C93090E5D90719F48091ED0126C0B5
+:100D1000CB3020E5D20721F48091ED018F7E1FC0FA
+:100D2000CD3080E5D80721F48091ED018F7D17C08B
+:100D3000CF3090E5D90721F48091ED018F7B0FC072
+:100D4000C13120E5D20721F48091ED018F7707C0F2
+:100D5000C331D04531F48091ED018B7F877F809343
+:100D6000ED018091ED010E948C1D9CC08D2F992773
+:100D70008F70992781309105D9F49E012370332714
+:100D800002C0880F991F2A95E2F79C688E0144E003
+:100D9000000F111F4A95E1F700271370802B912B4C
+:100DA00053E0CC0FDD1F5A95E1F7C076DD272FC049
+:100DB0008230910531F4DC2FCC278E01016F106A4F
+:100DC00071C08330910569F4CE018370992701E0E9
+:100DD00010E002C0000F111F8A95E2F7C8019C685D
+:100DE0000FC0049709F05EC0CE018370992701E01F
+:100DF00010E002C0000F111F8A95E2F7C8019A683F
+:100E000023E0CC0FDD1F2A95E1F7C07ED7708C015F
+:100E10000C2B1D2B47C0DF708E01106243C000E019
+:100E200010E040C08E013EC001E810E43BC003E882
+:100E300010E438C002EE14E435C009EE14E432C008
+:100E40000AEE14E42FC005EB14E42CC006EB14E406
+:100E500029C007EB14E426C00CEC14E423C00DEC0D
+:100E600014E420C003E815E41DC00AE815E41AC024
+:100E700002E915E417C004E915E414C001E216E420
+:100E800011C003E216E40EC004E216E40BC005E252
+:100E900016E408C006E216E405C007E216E402C044
+:100EA0000AE216E4C801DF91CF911F910F910895D6
+:100EB00096E0799FF001112494E5899FE00DF11DE2
+:100EC0001124E60FF11DEE0FFF1FEC51FF4F85912E
+:100ED0009491803E9105E0F4803C910558F5813372
+:100EE000910509F46FC048F48932910509F463C093
+:100EF0008A32910509F46DC072C089339105E9F019
+:100F000082389105D1F08533910509F44DC067C051
+:100F1000833E910581F138F4803E9105B9F0823E1F
+:100F20009105D9F05CC0863E910561F1873E91053F
+:100F3000A1F155C00E942B0508952091ED0120FDDF
+:100F400002C021FF4CC080EE90E049C08091ED01CD
+:100F500080FFF9CF89E390E042C08091ED0182FFEC
+:100F60000EC08091ED0184FF03C080E090E037C0A7
+:100F700083EE90E034C08091ED0182FFF2CF82EEEB
+:100F800090E02DC08091ED0183FF0BC08091ED01B9
+:100F900084FDEBCF87EE90E022C08091ED0183FFCE
+:100FA000F5CF86EE90E01BC08091ED0185FF07C074
+:100FB00089E290E014C08091ED0185FFF9CF85E3CF
+:100FC00090E00DC08091ED0186FF07C08AE290E0BD
+:100FD00006C08091ED0186FFF9CF81E390E00E9489
+:100FE0003B05089508950C94F207809162010895DD
+:100FF000CF93DF9300D01F92CDB7DEB79C018091D5
+:10100000E401843019F593E099833B832A8390931C
+:10101000E9008FEF9091E800815095FD06C095EDB5
+:101020009A95F1F700008111F5CF8091E80085FFD6
+:101030000DC040E050E063E070E0CE0101960E94F8
+:10104000620A8091E8008E778093E8000F900F90FD
+:101050000F90DF91CF910895CF93DF9300D01F922F
+:10106000CDB7DEB72091E401243021F522E02983B9
+:101070009B838A8383E08093E9008FEF9091E8005F
+:10108000815095FD06C095ED9A95F1F7000081110C
+:10109000F5CF8091E80085FF0DC040E050E063E0AF
+:1010A00070E0CE0101960E94620A8091E8008E777E
+:1010B0008093E8000F900F900F90DF91CF910895EB
+:1010C0002091E4012430F1F422E02093E9002FEF95
+:1010D0003091E800215035FD06C035ED3A95F1F725
+:1010E00000002111F5CF2091E80025FF0BC040E062
+:1010F00050E065E070E00E94620A8091E8008E771F
+:101100008093E8000895CF93DF93EC019091E40180
+:10111000943009F046C080910C018823D9F0809169
+:101120000D018823B9F09093E9008FEF9091E800CA
+:10113000815095FD06C095E19A95F1F70000811167
+:10114000F5CF8091E80085FF2CC040E050E060E1E1
+:1011500070E017C081E08093E9008FEF9091E80084
+:10116000815095FD06C095ED9A95F1F7000081112B
+:10117000F5CF8091E80085FF14C040E050E068E0C2
+:1011800070E0CE010E94620A8091E8008E77809321
+:10119000E80080E1FE01A2E5B1E001900D928A95A0
+:1011A000E1F7DF91CF9108958091E301811109C0AA
+:1011B0000E94F70B0E94540C8091E200846080939F
+:1011C000E20008951092E301089508950C94FB2124
+:1011D0000E94581B0E9401220E94FA0E0C94F307F1
+:1011E00042E061EC81E00E94710B42E061EC82E040
+:1011F0000E94710B42E061EC83E00E94710B42E1BE
+:1012000061EC84E00C94710B8091E601833009F469
+:1012100055C030F4813071F0823009F48EC00895E9
+:101220008A3009F47AC08B3009F460C0893009F043
+:101230009CC020C08091E501813A09F096C0809160
+:10124000E800877F8093E8008091E9019091EA01AE
+:10125000892B21F460E182E591E003C060E080E049
+:1012600090E070E00E94AD0A8091E8008B77809357
+:10127000E80008958091E501813209F076C08091FF
+:10128000E9019091EA01009719F0039709F06DC008
+:101290008091E800877F8093E8008091E80082FDDC
+:1012A00005C08091E4018111F8CF5FC08091F10009
+:1012B000809362018091E8008B7753C08091E501B3
+:1012C000813A09F052C08091E9019091EA01892B9D
+:1012D00009F04BC08091E800877F8093E8008091FF
+:1012E000E80080FFFCCF80910C0136C08091E501C1
+:1012F0008132D9F58091E9019091EA01892BA9F514
+:101300008091E800877F8093E8000E94A60B80917F
+:10131000E70180930C010C948A148091E5018132DD
+:1013200021F58091E800877F8093E8000E94A60B5A
+:101330008091E8018093630108958091E501813AED
+:10134000A1F48091E800877F8093E8008091E80015
+:1013500080FFFCCF809163018093F1008091E800D1
+:101360008E778093E8000C94A60B089584B7877F4E
+:1013700084BF88E10FB6F8948093600010926000FB
+:101380000FBE90E080E80FB6F894809361009093D0
+:1013900061000FBE0E94490F0E94F70B0E94540C7F
+:1013A0008091E20084608093E20078940E94DA0EDB
+:1013B0000E944B0F82E091E00E94F50E0E94E9210D
+:1013C0008091E401853069F40E94191B8091E2014B
+:1013D0008823B1F30E94441B882391F30E944C0A96
+:1013E000EFCF0E94510FECCF292F33272330310547
+:1013F000C9F064F42130310581F02230310509F063
+:1014000043C08DE690E020E133E042C02132310557
+:10141000F1F02232310541F137C082E190E02DE751
+:1014200033E036C099278130910541F08230910533
+:1014300041F0892B49F5ECE0F3E005C0E4EFF2E080
+:1014400002C0ECEDF2E0849190E09F0121C0643095
+:10145000D8F4E62FF0E0EE0FFF1FEE5DFE4F208187
+:10146000318189E090E014C0643070F470E0FB01D9
+:10147000EE0FFF1FE65EFE4F20813181FB01EA5E29
+:10148000FE4F808190E004C080E090E020E030E0FA
+:10149000FA0131832083089580E189BD82E189BD0D
+:1014A00009B400FEFDCF8091D8008F7D8093D800D5
+:1014B0008091E00082608093E0008091E00081FDF7
+:1014C000FCCF0895CF92DF92EF92FF920F931F937C
+:1014D000CF93DF93EC018B016A010E94C50B811150
+:1014E00033C0C114D10439F0F60180819181081B09
+:1014F000190BC80FD91FE12CF12C0115110519F199
+:101500008091E80085FD16C08091E8008E77809379
+:10151000E800C114D10449F0F60180819181E80E00
+:10152000F91EF182E08285E00FC00E94C50B88237E
+:1015300021F30AC089918093F10001501109FFEF56
+:10154000EF1AFF0ADACF80E0DF91CF911F910F9160
+:10155000FF90EF90DF90CF9008952091EB013091B4
+:10156000EC012617370748F06115710539F4209111
+:10157000E8002E772093E80001C0B90140E0611532
+:101580007105A9F12091E401222309F443C025301B
+:1015900009F442C02091E80023FD40C02091E800FA
+:1015A00022FD32C02091E80020FFE9CF4091F300F6
+:1015B0002091F20030E0342BFC01CF016115710560
+:1015C00059F02830310540F481918093F100615049
+:1015D00071092F5F3F4FF1CF41E02830310509F00D
+:1015E00040E02091E8002E772093E800C8CF411119
+:1015F000C9CF0AC08091E401882361F0853061F091
+:101600008091E80083FD0AC08091E80082FFF2CF5C
+:1016100080E0089582E0089583E0089581E00895D0
+:101620002091EB013091EC012617370748F0611546
+:10163000710539F42091E8002E772093E80001C06D
+:10164000B901FC0120E06115710591F18091E4017F
+:10165000882309F440C0853009F43FC08091E80038
+:1016600083FD3DC08091E80082FD2FC08091E8009D
+:1016700080FFE9CF2091F3008091F20090E0922B5F
+:101680006115710559F08830910540F4249120933B
+:10169000F1003196615071090196F2CF21E008976F
+:1016A00009F020E08091E8008E778093E800CBCFAE
+:1016B0002111CCCF0AC08091E401882361F08530EC
+:1016C00061F08091E80083FD0AC08091E80082FF0C
+:1016D000F2CF80E0089582E0089583E0089581E0EC
+:1016E0000895982F973058F59093E900981739F09E
+:1016F0007091EC002091ED005091F00003C0242F78
+:10170000762F50E021FF19C03091EB003E7F3093DF
+:10171000EB003091ED003D7F3093ED003091EB0018
+:1017200031603093EB007093EC002093ED00509308
+:10173000F0002091EE0027FF07C09F5FD3CF8F708E
+:101740008093E90081E0089580E008958091E501AB
+:1017500087FF11C08091E80082FD05C08091E401FF
+:101760008111F8CF11C08091E8008B770BC0809178
+:10177000E401882349F08091E80080FFF8CF809150
+:10178000E8008E778093E80008952091E40030917E
+:10179000E50095E64091EC00842F817040FF22C067
+:1017A0008091E80080FD1CC08091E401882391F0C5
+:1017B000853091F08091EB0085FD10C04091E400F0
+:1017C0005091E5004217530729F39A01915011F700
+:1017D00084E0089582E0089583E0089581E008950B
+:1017E00080E008954091E80042FFDECF08950E9416
+:1017F000650C0E946D0CE0EEF0E0808181608083DA
+:10180000E8EDF0E080818F77808319BCA7EDB0E030
+:101810008C918E7F8C9380818F7E80831092E301E8
+:1018200008950F931F93CF93DF930E94650C0E943E
+:101830006D0CC8EDD0E088818F77888388818068BF
+:10184000888388818F7D888319BC1092E40110926F
+:10185000E0011092E2011092E10100EE10E0F801C7
+:1018600080818B7F808388818160888342E060E013
+:1018700080E00E94710BE1EEF0E080818E7F80833A
+:10188000E2EEF0E0808181608083808188608083E7
+:10189000F80180818E7F8083888180618883DF91D9
+:1018A000CF911F910F910895E8EDF0E080818F7E38
+:1018B0008083E7EDF0E080818160808384E082BFF7
+:1018C00081E08093E3010C94110CE8EDF0E080815D
+:1018D0008E7F80831092E20008951092DA001092B9
+:1018E000E10008951F920F920FB60F9211242F93CB
+:1018F0003F934F935F936F937F938F939F93AF9398
+:10190000BF93EF93FF938091E10082FF0BC0809122
+:10191000E20082FF07C08091E1008B7F8093E100AD
+:101920000E94D90E8091DA0080FF1FC08091D800FC
+:1019300080FF1BC08091DA008E7F8093DA00809157
+:10194000D90080FF0DC080E189BD82E189BD09B465
+:1019500000FEFDCF81E08093E4010E94D40805C021
+:1019600019BC1092E4010E94E2088091E10080FF1E
+:1019700019C08091E20080FF15C08091E2008E7F47
+:101980008093E2008091E20080618093E200809188
+:10199000D80080628093D80019BC85E08093E40170
+:1019A0000E94E6088091E10084FF30C08091E2004F
+:1019B00084FF2CC080E189BD82E189BD09B400FEAD
+:1019C000FDCF8091D8008F7D8093D8008091E10079
+:1019D0008F7E8093E1008091E2008F7E8093E20011
+:1019E0008091E20081608093E2008091E001882391
+:1019F00011F084E007C08091E30087FD02C081E020
+:101A000001C083E08093E4010E94E8088091E10036
+:101A100083FF29C08091E20083FF25C08091E1000F
+:101A2000877F8093E10082E08093E4011092E001DF
+:101A30008091E1008E7F8093E1008091E2008E7FB3
+:101A40008093E2008091E20080618093E20042E0B6
+:101A500060E080E00E94710B8091F00088608093CC
+:101A6000F0000E94E508FF91EF91BF91AF919F9127
+:101A70008F917F916F915F914F913F912F910F9037
+:101A80000FBE0F901F9018951F920F920FB60F92D6
+:101A900011242F933F934F935F936F937F938F9373
+:101AA0009F93AF93BF93CF93DF93EF93FF93C09137
+:101AB000E900CF708091EC00D82FD17080FDD0E884
+:101AC0001092E9008091F000877F8093F000789475
+:101AD0000E94880D1092E9008091F0008860809348
+:101AE000F000CD2BCF70C093E900FF91EF91DF9113
+:101AF000CF91BF91AF919F918F917F916F915F91A6
+:101B00004F913F912F910F900FBE0F901F901895FE
+:101B10001F93CF93DF93CDB7DEB7AA970FB6F89494
+:101B2000DEBF0FBECDBFE5EEF1E088E08E0F9091F5
+:101B3000F10091938E13FBCF0E9404098091E8007D
+:101B400083FF1FC18091E5019091E601492F50E08C
+:101B50004A30510508F015C1FA01EA5AFF4F0C94BA
+:101B60008323803881F0823809F00BC18091E9012C
+:101B70008F708093E9008091EB0085FB882780F9C6
+:101B80001092E90006C08091E1019091E20191116B
+:101B900082609091E800977F9093E8008093F10035
+:101BA0001092F100C8C0282F2D7F09F0EAC08823C9
+:101BB00019F0823061F0E5C08091E701813009F0D1
+:101BC000E0C0933009F080E08093E2012BC0809167
+:101BD000E701811127C08091E9018F7009F4D1C01C
+:101BE0008093E9002091EB0020FF1CC0933021F48A
+:101BF0008091EB00806214C09091EB009061909313
+:101C0000EB0021E030E0A90102C0440F551F8A9586
+:101C1000E2F74093EA001092EA008091EB008860BE
+:101C20008093EB001092E9008091E800877F86C0E6
+:101C30008111A7C01091E7011F778091E3008078A0
+:101C4000812B8093E3008091E800877F8093E800F8
+:101C50000E94A60B8091E80080FFFCCF8091E300FA
+:101C600080688093E300111102C082E001C083E02C
+:101C70008093E40186C08058823008F082C0809151
+:101C8000E7019091E8018C3D53E0950779F583E0F9
+:101C90008A838AE289834FB7F894DE01139620E0A5
+:101CA0003EE051E2E32FF0E050935700E49120FF33
+:101CB00003C0E295EF703F5FEF708E2F90E0EA3047
+:101CC00010F0C79601C0C0968D939D932F5F24316D
+:101CD00049F74FBF8091E800877F8093E8006AE270
+:101CE00070E0CE0101960E94AD0A14C0AE014F5FB4
+:101CF0005F4F6091E9010E94F409BC01892B09F44E
+:101D000040C09091E800977F9093E80089819A8184
+:101D10000E94100B8091E8008B778093E80031C01F
+:101D2000803879F58091E800877F8093E800809182
+:101D3000E0018093F1008091E8008E778093E800C5
+:101D40000E94A60B1EC081111CC09091E701923029
+:101D5000C0F48091E800877F8093E8009093E001D1
+:101D60000E94A60B8091E001811106C08091E300E2
+:101D700087FD02C081E001C084E08093E4010E94FD
+:101D8000F0088091E80083FF0AC08091E800877F17
+:101D90008093E8008091EB0080628093EB00AA962C
+:101DA0000FB6F894DEBF0FBECDBFDF91CF911F916C
+:101DB00008950895CF938091E4018823A1F0C09104
+:101DC000E900CF709091EC00892F817090FD80E840
+:101DD000C82B1092E9008091E80083FD0E94880DD5
+:101DE000CF70C093E900CF910895909369018093DB
+:101DF00068010895E0916801F0916901309721F040
+:101E00000190F081E02D099480E00895E09168014F
+:101E1000F0916901309721F00280F381E02D09945F
+:101E20000895E0916801F0916901309721F00480F4
+:101E3000F581E02D099408952091660130916701A4
+:101E40008217930771F09093670180936601E09188
+:101E50006801F0916901309721F00680F781E02D4B
+:101E600009940895209164013091650182179307C8
+:101E700071F09093650180936401E0916801F091A5
+:101E80006901309721F00084F185E02D09940895CF
+:101E900008950C94480F0E945E1B0E940B040C9442
+:101EA000241CCF92DF92EF92FF920F931F93CF9358
+:101EB000DF93CDB7DEB72B970FB6F894DEBF0FBE1A
+:101EC000CDBF0E9423048BE6C82E81E0D82E00E00F
+:101ED00010E0E02E802F0E941105F60141916F0164
+:101EE000F42EF826B1F40F5F1F4F0E30110589F75D
+:101EF0008FEF89838A831B820E94671B8160782F02
+:101F00009D838C8349815A816B818D810E94F40F5E
+:101F100040C09091CD0191FF04C08B870E941705AE
+:101F20008B8520E030E04F2D50E0922FBA01022E39
+:101F300002C0759567950A94E2F760FF24C02E836E
+:101F4000EF8221E030E0690102C0CC0CDD1C9A95E3
+:101F5000E2F790E08C219D21892B09F420E028876D
+:101F60000E94671B8160782F9A8789874E815F81E5
+:101F700068858A850E94F40FF801E559FE4F80813B
+:101F8000C826C08206C02F5F3F4F2630310569F654
+:101F9000AACF0E940B1F10916A010E94FA0E181717
+:101FA000A1F00E94FA0E80936A012B960FB6F89466
+:101FB000DEBF0FBECDBFDF91CF911F910F91FF907C
+:101FC000EF90DF90CF900C94F3072B960FB6F89418
+:101FD000DEBF0FBECDBFDF91CF911F910F91FF905C
+:101FE000EF90DF90CF900895CF93DF93CDB7DEB71A
+:101FF0002B970FB6F894DEBF0FBECDBF4F83588727
+:1020000069877A878B87DE01119686E0FD01119240
+:102010008A95E9F785E0FE01379601900D928A9541
+:10202000E1F749815A816B817C818D819E810E947B
+:1020300024172B960FB6F894DEBF0FBECDBFDF91ED
+:10204000CF9108950895CF93882309F4C2C0C82F73
+:10205000823859F40E94FA0E81FDBBC089E30E94C8
+:10206000CD190E949A1A89E30CC0833879F40E9432
+:10207000FA0E80FDAEC083E50E94CD190E949A1A27
+:1020800083E50E940F1ACF910C949A1A843859F460
+:102090000E94FA0E82FD9DC087E40E94CD190E9425
+:1020A0009A1A87E4EECF8CEF8C0F813A48F48C2F8C
+:1020B0000E944E2181118DC08C2F0E94CD19E3CF3B
+:1020C00080E28C0F883048F4C77081E001C0880F2F
+:1020D000CA95EAF70E94531AD6CF8BE58C0F83304E
+:1020E00078F4C53A29F0C63A31F083E890E005C0AB
+:1020F00081E890E002C082E890E0CF910C941C0F40
+:1021000088E58C0F833108F064C0C83A39F1C93AC8
+:1021100041F1CA3A49F1CB3A51F1CC3A59F1CD3AB1
+:1021200061F1C03B69F1CE3A71F1CF3A79F1C13B2F
+:1021300081F1C23B89F1C33B91F1C43B99F1C53BAD
+:10214000A1F1C63BA9F1C73BB1F1C83BB9F1C93B0D
+:10215000C1F1CA3BC9F180E090E038C082EE90E066
+:1021600035C089EE90E032C08AEE90E02FC085EB5A
+:1021700090E02CC086EB90E029C087EB90E026C071
+:102180008CEC90E023C08DEC90E020C083E891E0DF
+:102190001DC08AE891E01AC082E991E017C084E985
+:1021A00091E014C081E292E011C083E292E00EC09F
+:1021B00084E292E00BC085E292E008C086E292E001
+:1021C00005C087E292E002C08AE292E0CF910C94CF
+:1021D000320FCF910895882309F44BC0823859F407
+:1021E0000E94FA0E81FF45C089E30E94CD190E942A
+:1021F0009A1A89E30CC0833871F40E94FA0E80FFAA
+:1022000038C083E50E94CD190E949A1A83E50E9486
+:102210000F1A0C949A1A843859F40E94FA0E82FF0D
+:1022200028C087E40E94CD190E949A1A87E4EFCF54
+:102230009CEF980F913A58F390E2980F983050F431
+:10224000877091E001C0990F8A95EAF7892F0E9463
+:10225000591ADFCF9BE5980F933020F480E090E08F
+:102260000C941C0F885A833120F480E090E00C9489
+:10227000320F0895882321F00E94531A0C949A1A61
+:102280000895882321F00E94591A0C949A1A0895EF
+:10229000BF92CF92DF92EF92FF920F931F93CF9353
+:1022A000DF9300D000D000D0CDB7DEB725E0FC0131
+:1022B000DE01119601900D922A95E1F7FC01D08084
+:1022C00011810281258122952F7043815481452BF4
+:1022D00009F4FCC21F3F21F4FFEFDF1609F4F6C238
+:1022E0007C012E830E942210D9821A8369817A810F
+:1022F000802F0E94C919182FB92E0E947E190E94A2
+:1023000045182E81002319F00E94701A2E81EB2DA2
+:10231000E295EF70F0E0E05AFF4F0C9483238B2D91
+:10232000807F9B2D9F70F92E882319F0F29480EF07
+:10233000F822002389F0FF2009F475C280E2810FA2
+:10234000883020F48F2D0E94531A03C08F2D0E94D5
+:10235000631A0E949A1A67C2812F0E94EB10FF2015
+:1023600009F4B4C2105E8F2D183018F40E94591A67
+:1023700002C00E94691A26960FB6F894DEBF0FBEFF
+:10238000CDBFDF91CF911F910F91FF90EF90DF9024
+:10239000CF90BF900C949A1A3B2D307F8B2D8F706D
+:1023A000303211F08295807F112319F0113021F124
+:1023B0002CC00023B9F0222309F4A0C1213009F078
+:1023C0009DC126960FB6F894DEBF0FBECDBFDF913C
+:1023D000CF911F910F91FF90EF90DF90CF90BF9022
+:1023E0000C94831A222319F0213009F46FC28E83D2
+:1023F0000E94861A8E8196C1002321F0223008F0B7
+:1024000065C27CC1211162C28DC1002321F022234B
+:1024100009F474C108C2222309F484C119C22B2D06
+:1024200026952695237030E02115310521F02130C5
+:102430003105D1F04BC2002321F0812F9B2D9370E9
+:1024400002C080E090E026960FB6F894DEBF0FBE83
+:10245000CDBFDF91CF911F910F91FF90EF90DF9053
+:10246000CF90BF900C941C0F002321F0812F9B2D47
+:10247000937002C080E090E026960FB6F894DEBF1D
+:102480000FBECDBFDF91CF911F910F91FF90EF90C5
+:10249000DF90CF90BF900C94320F812F002319F062
+:1024A0000E94131E02C00E947B1E26960FB6F8944F
+:1024B000DEBF0FBECDBFDF91CF911F910F91FF9077
+:1024C000EF90DF90CF90BF900C94001F8B2D837006
+:1024D00009F07BC00111FAC1812F82958695877022
+:1024E000880F880F912F9F70C92ED12CE12CF12CD1
+:1024F000082E04C0CC0CDD1CEE1CFF1C0A94D2F785
+:1025000014FF12C04FE050E060E070E004C0440FE0
+:10251000551F661F771F8A95D2F7CB01BA016095C8
+:1025200070958095909503C060E070E0CB012B2DF5
+:10253000269526952370422F50E042305105D9F060
+:102540004330510569F16C297D298E299F2941303D
+:10255000510551F126960FB6F894DEBF0FBECDBFE0
+:10256000DF91CF911F910F91FF90EF90DF90CF906F
+:10257000BF900C946C186C297D298E299F29269672
+:102580000FB6F894DEBF0FBECDBFDF91CF911F9184
+:102590000F91FF90EF90DF90CF90BF900C94881830
+:1025A0000E946C18C701B60126960FB6F894DEBFDC
+:1025B0000FBECDBFDF91CF911F910F91FF90EF9094
+:1025C000DF90CF90BF900C945018002319F08B2D02
+:1025D000817001C08695882309F478C1812F829586
+:1025E00086958770880F880F912F9F70C92ED12CE8
+:1025F000E12CF12C082E04C0CC0CDD1CEE1CFF1CC1
+:102600000A94D2F714FF12C04FE050E060E070E08F
+:1026100004C0440F551F661F771F8A95D2F7CB0160
+:10262000BA01609570958095909503C060E070E068
+:10263000CB012B2D269526952370422F50E042305A
+:102640005105D9F04330510569F16C297D298E2956
+:102650009F294130510551F126960FB6F894DEBFFF
+:102660000FBECDBFDF91CF911F910F91FF90EF90E3
+:10267000DF90CF90BF900C9446196C297D298E294C
+:102680009F2926960FB6F894DEBF0FBECDBFDF910F
+:10269000CF911F910F91FF90EF90DF90CF90BF905F
+:1026A0000C9462190E944619C701B60126960FB60E
+:1026B000F894DEBF0FBECDBFDF91CF911F910F9178
+:1026C000FF90EF90DF90CF90BF900C942A19103FAD
+:1026D000D1F118F4103E50F4A1C0123F09F463C0C8
+:1026E00008F44CC0133F09F473C098C01F708B2DC1
+:1026F0008F710023A1F00E94C318812F26960FB678
+:10270000F894DEBF0FBECDBFDF91CF911F910F9127
+:10271000FF90EF90DF90CF90BF900C943A110E9401
+:10272000E418812F26960FB6F894DEBF0FBECDBFFA
+:10273000DF91CF911F910F91FF90EF90DF90CF909D
+:10274000BF900C9441110023A9F02111BFC08B2D23
+:102750008F7126960FB6F894DEBF0FBECDBFDF9106
+:10276000CF911F910F91FF90EF90DF90CF90BF908E
+:102770000C940919223008F0A9C0E9CF0023A9F070
+:102780008B2D8F7126960FB6F894DEBF0FBECDBF8E
+:10279000DF91CF911F910F91FF90EF90DF90CF903D
+:1027A000BF900C94C318002359F38B2D8F7126967C
+:1027B0000FB6F894DEBF0FBECDBFDF91CF911F9152
+:1027C0000F91FF90EF90DF90CF90BF900C94E418A2
+:1027D000002399F08B2D8F7126960FB6F894DEBFEB
+:1027E0000FBECDBFDF91CF911F910F91FF90EF9062
+:1027F000DF90CF90BF900C94AE1826960FB6F89449
+:10280000DEBF0FBECDBFDF91CF911F910F91FF9023
+:10281000EF90DF90CF90BF900C94A4180023A9F004
+:10282000222309F4ADCF812F26960FB6F894DEBF90
+:102830000FBECDBFDF91CF911F910F91FF90EF9011
+:10284000DF90CF90BF900C942310222309F4ADCFDA
+:10285000812F26960FB6F894DEBF0FBECDBFDF9155
+:10286000CF911F910F91FF90EF90DF90CF90BF908D
+:102870000C94EB104B2D4F70612FC7010E94AB02DF
+:1028800026960FB6F894DEBF0FBECDBFDF91CF9175
+:102890001F910F91FF90EF90DF90CF90BF900C941D
+:1028A000C8174B2D4F70612FC70126960FB6F894AD
+:1028B000DEBF0FBECDBFDF91CF911F910F91FF9073
+:1028C000EF90DF90CF90BF900C94180526960FB62E
+:1028D000F894DEBF0FBECDBFDF91CF911F910F9156
+:1028E000FF90EF90DF90CF90BF9008950E94701AF4
+:1028F0000E94801A0E94451A0E949A1A0E94B11FD3
+:102900000E94001F80E090E00E941C0F80E090E099
+:102910000C94320F0E94601A0C9476140E94BE1917
+:10292000292F22952F7030E02C3031054CF42A30BD
+:1029300031056CF4225031092230310588F407C08A
+:102940002C30310549F02F30310531F009C0803E7F
+:1029500048F0803F29F406C093FB882780F908954A
+:1029600080E0089581E00895CF93DF9300D000D0F8
+:102970001F92CDB7DEB70F900F900F900F900F9072
+:10298000DF91CF910895CF93DF9300D000D000D096
+:10299000CDB7DEB726960FB6F894DEBF0FBECDBF1B
+:1029A000DF91CF9108951F93CF93DF93C091790169
+:1029B00016E080917A01C81799F0D0E01C9FF001D1
+:1029C0001D9FF00D1124E558FE4F40815181628119
+:1029D0007381848195810E94C3142196C770E9CFC9
+:1029E000DF91CF911F9108954091AB015091AC01BF
+:1029F0006091AD017091AE018091AF019091B001F5
+:102A00000C94C3148091B00182958F7009F054C06A
+:102A10008091AD01882309F44FC080917901A09184
+:102A20007A016091AB017091AC014091AE0150917F
+:102A3000AF01B6E08A1709F43FC090E04115510597
+:102A4000C1F17F3F11F46F3FA1F1B89FF001B99F31
+:102A5000F00D1124E558FE4F218172132AC0208108
+:102A6000621327C02281211124C0238134812417BD
+:102A7000350710F421503109241B350B283C310552
+:102A8000C0F42091B0012F7020612093B00126E0A6
+:102A9000289FF001299FF00D1124E058FE4F8081FE
+:102AA0008F70806180838BEA91E00E9448110C94C2
+:102AB000D31401968770BECF0895CF92DF92EF9224
+:102AC000FF920F931F93CF93DF93CDB7DEB762973B
+:102AD0000FB6F894DEBF0FBECDBF8C0185E0F801C4
+:102AE000DE011D9601900D928A95E1F7D8014C9177
+:102AF00011965C91119712966C9112971396CD9046
+:102B0000DC9014973091AB017091AC018091AE01D3
+:102B10009091AF01009709F46BC17F3F19F43F3FDB
+:102B200009F466C1E090AD01EE2009F4C0C0209127
+:102B3000B001C816D90628F0F601E81BF90BCF0141
+:102B400004C0809590958C0D9D1DFF24F394883CC6
+:102B5000910578F0F12C207F09F0C6C07C2DD98A30
+:102B6000C88A89890E94B4148BEA91E00E944811B6
+:102B7000B1C0822F807F09F046C0751314C0341392
+:102B800012C0611110C02F7020612093B0010E940B
+:102B9000F4148BEA91E00E9448118091B001D801B1
+:102BA00015968C932EC0CD2819F15F3F11F44F3F3D
+:102BB000F9F0F62E61111CC08091790120917A0103
+:102BC00036E0821709F45AC090E0389FF001399F2F
+:102BD000F00D1124E558FE4F7181571306C0708126
+:102BE000471303C07281711103C001968770E9CF4A
+:102BF000F62E662309F418C18091B001816080939C
+:102C0000B001F12C11C1751308C0341306C0611155
+:102C100004C08091B001D801C3C04D875E878D8507
+:102C20009E856A8B0E948E146A898823E1F166234F
+:102C3000D1F12091B001822F82958F7090E00297A0
+:102C400074F08091AB019091AC0198878F831986C5
+:102C5000DB86CA862C87CE0107960E94481186E043
+:102C6000F801ABEAB1E001900D928A95E1F70E947C
+:102C700002150E94F414FF24F394D6C04D875E879A
+:102C80008D859E850E94BE19292F22952F7030E0D8
+:102C9000223031050CF0BCC09F7009F0B6C0805ED8
+:102CA000883008F4C1C0C8010E944811E4CFC8169A
+:102CB000D90608F453C0F601E81BF90BCF01883C94
+:102CC000910508F450C0F12C7C2DD98AC88A8989D5
+:102CD0000E94B414EBEAF1E086E0DF011D928A95D0
+:102CE000E9F70E94F414A0C0751314C0341312C085
+:102CF000611110C08091B001F8018583C8010E9464
+:102D0000481186E0EBEAF1E0DF011D928A95E9F7D0
+:102D1000FE2C8AC04D875E878D859E856A8B0E94BA
+:102D20008E146A89882309F4BECF662309F4BBCFC9
+:102D30002091B001822F82958F7090E002970CF461
+:102D40008ECF8091AB019091AC019A8389831B82D5
+:102D5000DD82CC822E83CE0101967FCF8095909527
+:102D60008C0D9D1DACCFF62E662309F49CCF7513F8
+:102D70002EC034132CC02091B00120FD1FC0822F23
+:102D800082958F70D9F0D80115962C9315978F30B6
+:102D900049F08F5F982F9295907F822F8F70892BAB
+:102DA00015968C93C8010E94481186E0F801ABEAA1
+:102DB000B1E001900D928A95E1F793CF86E0F8019A
+:102DC000ABEAB1E001900D928A95E1F72DC04D87F5
+:102DD0005E878D859E850E948E14811140CF8091E3
+:102DE000B00181608093B001C8010E9448111CC0ED
+:102DF000662309F458CF4D875E878D859E850E9496
+:102E00008E14882309F44FCF2ACF811148CF0CC0EC
+:102E1000243031050CF047CF9F7009F440CFF80102
+:102E20009581907F09F03BCF8F2D62960FB6F89475
+:102E3000DEBF0FBECDBFDF91CF911F910F91FF90ED
+:102E4000EF90DF90CF9008951F93CF93DF93CDB78E
+:102E5000DEB72C970FB6F894DEBF0FBECDBF4F8301
+:102E6000588769877A878B879C87CE0107960E944F
+:102E70005D15882369F08F8198852A853B85232BF2
+:102E8000F1F19F3F09F063C08F3F09F060C037C088
+:102E900086E0FE013796DE01119601900D928A952B
+:102EA000E1F76F817885EA85FB85309741F17F3FB7
+:102EB00011F46F3F21F120917A0130E0C9010196B0
+:102EC000877099274091790150E08417950709F49C
+:102ED00047C069837A83FD83EC8396E0929FD0019B
+:102EE000939FB00D1124A558BE4FFE01319601905D
+:102EF0000D929A95E1F780937A010E94D31416E01F
+:102F00008091790190917A018917C1F1189FC001D0
+:102F1000112485589E4F0E945D15882379F1E09118
+:102F200079011E9FF0011124E558FE4F4081518127
+:102F300062817381848195810E94C314809179019B
+:102F400090E001968770992780937901D9CF4F81BE
+:102F5000588569857A858B859C850E94C314CFCF5F
+:102F60000E948A1410927A0110927901EBEAF1E042
+:102F700086E0DF011D928A95E9F7C1CF2C960FB646
+:102F8000F894DEBF0FBECDBFDF91CF911F910895A2
+:102F9000EF92FF920F931F93CF93DF938C01892BB6
+:102FA00009F46CC0F12CEE24E394E8012196F801B9
+:102FB0008491843740F4843008F051C0813081F02E
+:102FC000823019F15BC0853709F444C0A8F19CE751
+:102FD000980F903708F052C08F770E94EB1041C0D5
+:102FE0000E5F1F4FFE01C49180E28C0F883048F4C1
+:102FF000C7708E2D01C0880FCA95EAF70E94731A18
+:1030000014C08C2F0E9423102DC00E5F1F4FFE0195
+:10301000C49180E28C0F883058F4C7708E2D01C0A7
+:10302000880FCA95EAF70E94791A0E949A1A1AC064
+:103030008C2F0E94EB1016C00E5F1F4FFE01C49133
+:10304000CC2381F08FE99FE00197F1F700C00000E9
+:10305000C150F6CF0E5F1F4FFE01F49003C00E94D7
+:1030600023108E018F2D882309F49FCFEFE9FFE015
+:103070003197F1F700C000008150F5CFDF91CF917B
+:103080001F910F91FF90EF90089508956093B501FF
+:103090007093B6018093B7019093B8010C947614A5
+:1030A0000F931F930091B5011091B6012091B701C4
+:1030B0003091B801DC01CB01802B912BA22BB32BDB
+:1030C0008093B5019093B601A093B701B093B80176
+:1030D0001F910F910C9476140F931F930091B501DB
+:1030E0001091B6012091B7013091B801DC01CB01FC
+:1030F00080239123A223B3238093B5019093B6013B
+:10310000A093B701B093B8011F910F910C9476145E
+:103110000F931F930091B5011091B6012091B70153
+:103120003091B801DC01CB0180279127A227B3277A
+:103130008093B5019093B601A093B701B093B80105
+:103140001F910F910C9476141092B1011092B2015C
+:103150001092B3011092B4010C94761441E050E047
+:1031600060E070E004C0440F551F661F771F8A950A
+:10317000D2F74093B1015093B2016093B3017093C1
+:10318000B4010C94761441E050E060E070E004C0BB
+:10319000440F551F661F771F8A95D2F78091B101A2
+:1031A0009091B201A091B301B091B401482B592B79
+:1031B0006A2B7B2B4093B1015093B2016093B30112
+:1031C0007093B4010C94761441E050E060E070E03C
+:1031D00004C0440F551F661F771F8A95D2F740958C
+:1031E0005095609570958091B1019091B201A09138
+:1031F000B301B091B401482359236A237B23409340
+:10320000B1015093B2016093B3017093B4010C9477
+:10321000761441E050E060E070E004C0440F551FB8
+:10322000661F771F8A95D2F78091B1019091B20104
+:10323000A091B301B091B401482759276A277B2791
+:103240004093B1015093B2016093B3017093B40104
+:103250000C9476140F931F930091B1011091B20159
+:103260002091B3013091B401DC01CB01802B912B73
+:10327000A22BB32B8093B1019093B201A093B30121
+:10328000B093B4011F910F910C9476140F931F9378
+:103290000091B1011091B2012091B3013091B401BC
+:1032A000DC01CB0180239123A223B3238093B101BE
+:1032B0009093B201A093B301B093B4011F910F9109
+:1032C0000C9476140F931F930091B1011091B201E9
+:1032D0002091B3013091B401DC01CB01802791270B
+:1032E000A227B3278093B1019093B201A093B301B9
+:1032F000B093B4011F910F910C9476140895CF925E
+:10330000DF92EF92FF920F931F93CF93DF938C0185
+:10331000C090B501D090B601E090B701F090B8012F
+:103320008091B1019091B201A091B301B091B4012B
+:10333000C82AD92AEA2AFB2ACFE1D0E0D701C60160
+:103340000C2E04C0B695A795979587950A94D2F749
+:1033500080FF06C0B8018C2F0E945807019721F406
+:10336000219760F780E001C08C2FDF91CF911F91F2
+:103370000F91FF90EF90DF90CF900895CF93DF9360
+:10338000EC010E947F19BE010E945807DF91CF9186
+:103390000895CB010E94BE19089590910C019923C4
+:1033A00021F090910D01911109C020910E013091F1
+:1033B0000F01F90132969FEF40E01FC0982F9695BC
+:1033C000969596959F3050F5E0910E01F0910F0182
+:1033D000E90FF11D877021E030E0A90102C0440F20
+:1033E000551F8A95E2F7CA019181892B818308953F
+:1033F0009F3F39F04F5F4E3041F051915813F8CF55
+:103400000DC05111F7CF942FF5CF9F3F39F0F9013F
+:10341000E90FF11D97FDFA95828308950895909123
+:103420000C01992321F090910D01911109C0209177
+:103430000E0130910F01F9013296205F3F4F1FC0FE
+:10344000982F9695969596959F30F0F4E0910E0101
+:10345000F0910F01E90FF11D877021E030E0A90123
+:1034600002C0440F551F8A95E2F7CA0180959181E9
+:103470008923818308953196E217F30729F090811B
+:103480009813F9CF1082F7CF089581E090E0E09192
+:103490000E01F0910F01E80FF91F108201968031A3
+:1034A0009105A9F708959091CC01892B8093CC01C7
+:1034B000089580959091CC0189238093CC01089543
+:1034C0001092CC0108959091CB01892B8093CB0170
+:1034D000089580959091CB0189238093CB01089525
+:1034E0001092CB0108959091CA01892B8093CA0153
+:1034F000089580959091CA0189238093CA01089507
+:103500001092CA0108958093B90108951092B901EB
+:10351000089580910E0190910F01FC0131969C015C
+:10352000205F3F4F80E0919191118F5FE217F30789
+:10353000D1F70895E0910E01F0910F018091CC0137
+:103540008083E0910E01F0910F0190818091CB0179
+:10355000892B8083E0910E01F0910F019081809181
+:10356000CA01892B80838091B901882361F0E091A1
+:103570000E01F0910F019081892B80830E94891A9E
+:1035800081111092B90180910E0190910F010C945C
+:10359000060FCF92DF92EF92FF926C01EE24FF2490
+:1035A000C114D104E104F10421F0C701B60120E106
+:1035B00001C020E0C72ED82EE92EFF24C114D1046B
+:1035C000E104F10419F0285FC701B6016B017C0129
+:1035D00054E0F694E794D794C7945A95D1F7C11460
+:1035E000D104E104F10419F02C5FC701B6016B01AD
+:1035F0007C0142E0F694E794D794C7944A95D1F7BA
+:10360000C114D104E104F10419F02E5FC701B60121
+:10361000DC01CB01B695A79597958795892B8A2BC9
+:103620008B2B09F02F5F822FFF90EF90DF90CF90D0
+:1036300008958091E401843021F11092CE0120E4BC
+:1036400088E190E00FB6F894A895809360000FBED3
+:103650002093600080E00E94F30783B7817F84603D
+:1036600083BF83B7816083BF7894889583B78E7F4B
+:1036700083BF88E10FB6F8948093600010926000D9
+:103680000FBE089508950895CF930E94421B0E9493
+:1036900023040E94431BC0E08C2F0E94110581115E
+:1036A00004C0CF5FCE30C1F701C081E0CF91089553
+:1036B0000E948A140E94FA0E0C94F30782E084BDE3
+:1036C00093E095BD9AEF97BD80936E0008952FB754
+:1036D000F8948091CF019091D001A091D101B09147
+:1036E000D2012FBF0895CF92DF92EF92FF920F93F6
+:1036F0001F932FB7F8944091CF015091D001609162
+:10370000D1017091D2012FBF6A017B01EE24FF2409
+:103710008C0120E030E0C016D106E206F30610F47A
+:10372000415051099A01281B390BC9011F910F9172
+:10373000FF90EF90DF90CF9008951F920F920FB6F9
+:103740000F9211248F939F93AF93BF938091CF01DA
+:103750009091D001A091D101B091D2010196A11D0B
+:10376000B11D8093CF019093D001A093D101B0936C
+:10377000D201BF91AF919F918F910F900FBE0F908B
+:103780001F9018950E94F70BF8942FEF87EA91E6A7
+:10379000215080409040E1F700C0000087E090EBAE
+:1037A000DC018093EE019093EF01A093F001B093C0
+:1037B000F1019CE088E10FB6F894A8958093600031
+:1037C0000FBE90936000FFCFEF92FF920F931F9375
+:1037D000CF93DF93D82FC0E08C2F0E94110500E01B
+:1037E00010E0E82EF12CC701002E02C095958795B8
+:1037F0000A94E2F780FD06C00F5F1F4F06301105E7
+:1038000091F709C0602F7C2F80E00E941905D81322
+:10381000F3CF81E004C0CF5FCE30F1F680E0DF91DE
+:10382000CF911F910F91FF90EF900895CF93C82FE4
+:103830008CE20E94E41B882321F08C2FCF910C9402
+:10384000E41B80E0CF910895CF930E946B1D8111FE
+:1038500002C00E94511DC5E6C15049F00E942304D8
+:103860008FE39CE90197F1F700C00000F5CF89E2F2
+:103870000E94161C811113C18AE20E94161C81113C
+:103880000E94511D85E00E94161C81110E94C21BDE
+:103890000E94761D8093CD0187E00E94161C88232C
+:1038A000A9F18BE10E94161C882351F08091CD0173
+:1038B00081FB222720F991E0922790FB81F90EC02D
+:1038C0008EE00E94161C882361F08091CD0182FB5E
+:1038D000222720F991E0922790FB82F98093CD0175
+:1038E00015C080E10E94161C9091CD01882341F003
+:1038F00093FB222720F981E0822780FB93F904C003
+:10390000892F809580FB90F99093CD018091CD0116
+:103910000E947A1D0E94881D8093ED0180EE0E9416
+:10392000161C882341F08091ED01982F909590FB13
+:1039300080F98093ED0189E30E94161C882359F0D9
+:103940008091ED0181FB222720F991E0922790FBE5
+:1039500081F98093ED0182EE0E94161C882359F0B4
+:103960008091ED0182FB222720F991E0922790FBC4
+:1039700082F98093ED0186EE0E94161C882359F08F
+:103980008091ED0183FB222720F991E0922790FBA3
+:1039900083F98093ED0183EE0E94161C882359F071
+:1039A0008091ED0184FB222720F991E0922790FB82
+:1039B00084F98093ED0185E30E94161C882359F059
+:1039C0008091ED0185FB222720F991E0922790FB61
+:1039D00085F98093ED0181E30E94161C882359F03C
+:1039E0008091ED0186FB222720F991E0922790FB40
+:1039F00086F98093ED0181E10E94161C882359F01D
+:103A00008091ED0187FB222720F991E0922790FB1E
+:103A100087F98093ED018091ED010E948C1D8091CA
+:103A2000ED0187FB882780F980930D0187E20E94D2
+:103A3000161CC82F8EE10E94161C8111C2608FE1F6
+:103A40000E94161C8111C46080E20E94161C811124
+:103A5000C86081E20E94161C8111C06182E20E944E
+:103A6000161C8111C06283E20E94161C8111C06481
+:103A700084E20E94161C882311F0C06802C0CC2387
+:103A800029F08C2F0E94831D6C2F03C00E947F1D84
+:103A9000682F70E080E090E0CF910C944618CF91B1
+:103AA00008956DEE7EEF80E090E00E94BD2360E01F
+:103AB00082E090E00E94AB2360E083E090E00E940F
+:103AC000AB2360E084E090E00E94AB2360E085E0FF
+:103AD00090E00C94AB2380E090E00E94A52321E0CD
+:103AE0008D3E9E4F09F020E0822F089582E090E005
+:103AF0000C949D23682F82E090E00C94AB2383E02C
+:103B000090E00C949D23682F83E090E00C94AB230D
+:103B100084E090E00C949D23682F84E090E00C9466
+:103B2000AB238091D50180FF0BC06091130185E02C
+:103B3000689FB001112475956795759567952BC0A1
+:103B400081FF09C06091130185E0689FB0011124D5
+:103B50007595679520C082FF07C06091130185E0CD
+:103B6000689FB001112417C09091D6019923D1F01C
+:103B700060911201961788F72091130185E0289F24
+:103B800090011124929FA001939F500D112470E089
+:103B9000CA010E946F236038710540F461157105F8
+:103BA00039F002C065E070E0862F08958FE7089530
+:103BB00081E008958091D50180FF08C060911101D6
+:103BC00070E0759567957595679521C081FF06C072
+:103BD0006091110170E07595679519C082FF04C06E
+:103BE0006091110170E010C09091D6019923C1F04D
+:103BF000609110019617A0F780911101899FC00173
+:103C0000112470E00E946F236038710528F461155B
+:103C1000710521F0862F08958FE7089581E00895BA
+:103C200061E070E0F4CF803F21F40E94911D819506
+:103C300004C0813F29F40E94911D8093D901089509
+:103C4000823F21F40E94911D819504C0833F29F495
+:103C50000E94911D8093D8010895893F19F40E9414
+:103C6000DA1D05C08A3F31F40E94DA1D81958093E8
+:103C7000DA0108958B3F21F40E94DA1D819504C07A
+:103C80008C3F29F40E94DA1D8093DB010895843F64
+:103C900021F48091D701816017C0853F21F4809184
+:103CA000D701826011C0863F21F48091D7018460E2
+:103CB0000BC0873F21F48091D701886005C0883F01
+:103CC00031F48091D70180618093D70108958D3FB1
+:103CD00021F48091D50181600BC08E3F21F4809149
+:103CE000D501826005C08F3F29F48091D5018460A1
+:103CF0008093D5010895803F39F48091D90187FFE1
+:103D00006CC01092D90169C0813F29F48091D9011A
+:103D10001816BCF362C09091D801823F29F497FF36
+:103D20005CC01092D80159C0833F19F41916CCF326
+:103D300054C0893F41F48091DA0118160CF04DC04F
+:103D40001092DA014AC08A3F29F48091DA0187FF94
+:103D500044C0F6CF8B3F39F48091DB0187FF3DC033
+:103D60001092DB013AC08C3F29F48091DB011816D8
+:103D7000BCF333C0843F21F48091D7018E7F17C0FC
+:103D8000853F21F48091D7018D7F11C0863F21F4BA
+:103D90008091D7018B7F0BC0873F21F48091D701A1
+:103DA000877F05C0883F31F48091D7018F7E809353
+:103DB000D70113C08D3F21F48091D5018E7F0BC0B8
+:103DC0008E3F21F48091D5018D7F05C08F3F29F46E
+:103DD0008091D5018B7F8093D5018091D80181118D
+:103DE0000EC08091D90181110AC08091DA01811140
+:103DF00006C08091DB01811102C01092D6010895A6
+:103E000087ED91E00E94110F0E94671B9093D401EF
+:103E10008093D30108951F93CF93DF938091D301B3
+:103E20009091D4010E94731BAC019091D60199230B
+:103E300021F02091140130E006C0209115018AE0A4
+:103E4000289F900111244217530708F486C08091DF
+:103E5000D801C091D901D091DA011091DB01811113
+:103E600007C0C11176C0D11174C0111172C075C0E4
+:103E70009F3F19F09F5F9093D601181624F40E947B
+:103E8000911D8093D8018091D80187FF05C00E94C1
+:103E9000911D81958093D8011C1624F40E94911DD8
+:103EA0008093D9018091D90187FF05C00E94911D9F
+:103EB00081958093D9016091D801662339F1C09131
+:103EC000D901CC2319F1772767FD7095872F972F9C
+:103ED0000E94802223E333E343E35FE30E94E42272
+:103EE0000E944D226093D8016C2F772767FD709553
+:103EF000872F972F0E94802223E333E343E35FE37E
+:103F00000E94E4220E944D226093D9011D1624F4E0
+:103F10000E94DA1D8093DA018091DA0187FF05C0E3
+:103F20000E94DA1D81958093DA01111624F40E9413
+:103F3000DA1D8093DB018091DB0187FF05C00E94C1
+:103F4000DA1D81958093DB01DF91CF911F910C9455
+:103F5000001F9F3F09F08ECF96CFDF91CF911F9129
+:103F60000895E7EDF1E085E0DF011D928A95E9F71C
+:103F70001092D6011092D5010895833081F128F472
+:103F8000813059F08230D1F00895853009F449C06C
+:103F9000B8F1863009F456C0089580911501262F96
+:103FA00030E0280F311D2F3F310524F4680F609356
+:103FB000150108958FEF80931501089580911401E4
+:103FC000262F30E0280F311D2F3F310524F4680FD4
+:103FD0006093140108958FEF8093140108958091E8
+:103FE0001301262F30E0280F311D2F3F310524F417
+:103FF000680F6093130108958FEF80931301089564
+:1040000080911201262F30E0280F311D2F3F3105FE
+:1040100024F4680F6093120108958FEF80931201CA
+:10402000089580911101262F30E0280F311D2F3F78
+:10403000310524F4680F6093110108958FEF809388
+:104040001101089580911001262F30E0280F311DB5
+:104050002F3F310524F4680F6093100108958FEF0E
+:10406000809310010895833011F128F4813049F0D4
+:10407000823091F00895853081F120F18630C1F1D0
+:10408000089580911501681720F4861B809315010F
+:10409000089510921501089580911401681720F475
+:1040A000861B809314010895109214010895809145
+:1040B0001301681720F4861B809313010895109252
+:1040C0001301089580911201681720F4861B8093D4
+:1040D000120108951092120108958091110168173C
+:1040E00020F4861B80931101089510921101089508
+:1040F00080911001681720F4861B809310010895A9
+:104100001092100108950F931F938D3109F46BC025
+:1041100008F03FC08E3009F47FC0C0F4873009F446
+:1041200069C068F4863009F0B1C08091CD01817F0B
+:104130008E7F8093CD0181E08093DD01A8C088301F
+:1041400009F4A2C08B3009F49FC0A0C0863109F4E5
+:104150009BC078F4803109F472C0813109F096C0B7
+:104160000E948A1490910D0181E0892780930D01AE
+:104170008BC0893109F488C08B3109F087C08091E8
+:10418000CD0181FB222720F991E0922790FB81F954
+:104190004CC0853309F470C048F4873209F46CC010
+:1041A00008F459C0893209F467C070C0833438F408
+:1041B0008A3308F04EC0883309F466C067C0833480
+:1041C00009F45AC0883409F061C00E948A140FEFC4
+:1041D00013ED20E3015010402040E1F700C0000043
+:1041E0000E94C21B51C00E9407220E94FA0E0E9428
+:1041F000F3074AC09091CD01892F8095817080FB93
+:1042000090F929F0966098609093CD0140C0997F15
+:10421000977F9093CD0138C08091CD0182FB2227FA
+:1042200020F991E0922790FB82F98093CD019923A8
+:1042300059F18091CD0181608093CD0125C080919D
+:10424000CD0183FB222720F991E0922790FB83F98F
+:10425000ECCF895301C08D5141E050E060E070E047
+:104260008A019B0104C0000F111F221F331F8A9572
+:10427000D2F7C901B80104C061E070E080E090E0CD
+:104280000E9446180E948A1481E001C080E01F91BC
+:104290000F91089580E0089580E00895CF93C82F8E
+:1042A0008091DD01813079F018F08230E9F187C02A
+:1042B000E0910E01F0910F018081813169F082322D
+:1042C00009F07FC009C0E0910E01F0910F018081DB
+:1042D000813111F0823261F48C2F0E944A218111C8
+:1042E00004C08C2F0E9483201DC081E090E01AC082
+:1042F0008C2F0E944C21811114C0C43179F048F4F4
+:10430000CB3079F0C03109F060C082E08093DD01EC
+:1043100008C0C93219F0C83321F057C01092DD012E
+:1043200054C081E0817053C0C93289F118F5C4319D
+:1043300071F1A8F4C73009F046C08AE080931501F6
+:1043400094E19093140193E09093130180931201F0
+:1043500088E08093110188E28093100134C0CE512F
+:10436000C63088F5EC2FF0E0E65DFE4F808180934B
+:10437000DC0129C0CE34E9F020F4CB3421F56AE029
+:1043800013C0C13579F0C235F1F461E00DC0809100
+:10439000DC01882319F01092DC0115C081E08093C4
+:1043A000DD0115C061E006C08091DC010E94BD1FE7
+:1043B0000AC06AE08091DC010E94332004C01092A0
+:1043C000DD0180E004C081E002C080E0ABCFCF918E
+:1043D0000895E1E8F0E080818860808380818160D9
+:1043E00080838FB7F89493E09093890090ED909339
+:1043F00088008FBF0895EFE6F0E0808182608083BF
+:104400000895EFE6F0E080818D7F80830895EFE6E8
+:10441000F0E0908182E08927808308951F920F92B7
+:104420000FB60F9211242F933F934F935F936F9387
+:104430007F938F939F93AF93BF93EF93FF9380915D
+:10444000DE019091DF0101969093DF018093DE0100
+:10445000811103C082E00E94F307E091DF01E6953D
+:10446000E695F0E0E657FB4FE4918091DE018E1374
+:1044700003C080E00E94F307FF91EF91BF91AF91DD
+:104480009F918F917F916F915F914F913F912F916C
+:104490000F900FBE0F901F90189504D06894B11123
+:1044A0008DC0089570D088F09F5790F0B92F99274C
+:1044B000B751A0F0D1F0660F771F881F991F1AF02F
+:1044C000BA95C9F712C0B13081F077D0B1E0089544
+:1044D00074C0672F782F8827B85F39F0B93FCCF3C5
+:1044E000869577956795B395D9F73EF49095809525
+:1044F000709561957F4F8F4F9F4F0895E89409C045
+:1045000097FB3EF490958095709561957F4F8F4F06
+:104510009F4F9923A9F0F92F96E9BB279395F6951C
+:10452000879577956795B795F111F8CFFAF4BB0F9A
+:1045300011F460FF1BC06F5F7F4F8F4F9F4F16C0FE
+:10454000882311F096E911C0772321F09EE8872F88
+:10455000762F05C0662371F096E8862F70E060E044
+:104560002AF09A95660F771F881FDAF7880F9695BD
+:10457000879597F9089557FD9058440F551F59F0A6
+:104580005F3F71F04795880F97FB991F61F09F3F40
+:1045900079F087950895121613061406551FF2CF69
+:1045A0004695F1DF08C0161617061806991FF1CFB9
+:1045B00086957105610508940895E894BB276627E0
+:1045C0007727CB0197F908950BD078C069D028F0F0
+:1045D0006ED018F0952309F05AC05FC01124EECFB9
+:1045E000CADFA0F3959FD1F3950F50E0551F629F4E
+:1045F000F001729FBB27F00DB11D639FAA27F00D3C
+:10460000B11DAA1F649F6627B00DA11D661F829F62
+:104610002227B00DA11D621F739FB00DA11D621F47
+:10462000839FA00D611D221F749F3327A00D611D64
+:10463000231F849F600D211D822F762F6A2F112446
+:104640009F5750408AF0E1F088234AF0EE0FFF1F99
+:10465000BB1F661F771F881F91505040A9F79E3FD0
+:10466000510570F014C0AACF5F3FECF3983EDCF325
+:10467000869577956795B795F795E7959F5FC1F70D
+:10468000FE2B880F911D9695879597F9089597F9B8
+:104690009F6780E870E060E008959FEF80EC0895E8
+:1046A00000240A9416161706180609060895002411
+:1046B0000A9412161306140605060895092E03948B
+:1046C000000C11F4882352F0BB0F40F4BF2B11F4FF
+:1046D00060FF04C06F5F7F4F8F4F9F4F089597FB20
+:1046E000072E16F4009407D077FD09D00E94892385
+:1046F00007FC05D03EF4909581959F4F08957095E5
+:1047000061957F4F0895EE0FFF1F0590F491E02D06
+:104710000994AA1BBB1B51E107C0AA1FBB1FA61708
+:10472000B70710F0A61BB70B881F991F5A95A9F75A
+:1047300080959095BC01CD010895F999FECF92BD69
+:1047400081BDF89A992780B50895A8E1B0E042E0CC
+:1047500050E00C94C523262FF999FECF92BD81BD60
+:10476000F89A019700B4021639F01FBA20BD0FB6AF
+:10477000F894FA9AF99A0FBE08950196272F0E948D
+:10478000AC230C94AB23DC01CB01FC01F999FECFE7
+:1047900006C0F2BDE1BDF89A319600B40D924150C9
+:0A47A0005040B8F70895F894FFCFD9
+:1047AA002002F507830860082C08F8070101BA01FE
+:1047BA0028080A03140A3F4D36394B04FE03C8037E
+:1047CA008F0322033B0354036D030102030405060E
+:0447DA0007080900C3
+:00000001FF
diff --git a/keyboard/ergodox_ez/keymaps/twey/keymap.c b/keyboard/ergodox_ez/keymaps/twey/keymap.c index 75d264bdbe..dec9f92f14 100644 --- a/keyboard/ergodox_ez/keymaps/twey/keymap.c +++ b/keyboard/ergodox_ez/keymaps/twey/keymap.c @@ -5,8 +5,8 @@ #define BASE 0 // default layer #define SYMB 1 // symbols -#define MDIA 2 // media keys -#define STEN 3 // steno +#define STEN 2 // steno +#define MDIA 3 // media keys const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -17,19 +17,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+-------+-------------| |-------+------+------+------+------+------+--------| * | Del | ' | , | . | P | Y | Esc | | Caps | F | G | C | R | L | / | * |--------+------+------+------+-------+------| | | |------+------+------+------+------+--------| - * | BkSp | A | O | E | U | I |------| |-------| D | H | T | N |S / L2|- / Cmd | + * | BkSp | A | O | E | U | I |------| |-------| D | H | T | N | S | - | * |--------+------+------+------+-------+------| Tab | | Enter |------+------+------+------+------+--------| * | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | RShift | * `--------+------+------+------+-------+-------------' `--------------+------+------+------+------+--------' - * |Grv/L1| '" |AltShf| Left | Right | | Up | Down | [ | ] | ~L1 | + * | L1 | NONE | Grv | Left | Right | | Up | Down | [ | ] | L1 | * `-----------------------------------' `----------------------------------' - * ,-------------. ,---------------. - * | PgUp | PgDn | | Home | End | - * ,------|------|------| |-------+-------+------. - * | | | NONE | | NONE | | | - * | Alt | NONE |------| |-------| Space | Ctrl | - * | | | Supr | | AltGr | | | - * `--------------------' `----------------------' + * ,--------------. ,---------------. + * | PgUp | PgDn | | Home | End | + * ,------|-------|------| |-------+-------+------. + * | | | NONE | | AltGr | | | + * | Alt | Enter |------| |-------| Space | Ctrl | + * | | | Supr | | ~MDIA | | | + * `---------------------' `----------------------' */ // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* @@ -39,19 +39,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_DELT, KC_QUOT, KC_COMM,KC_DOT, KC_P, KC_Y, KC_ESC, KC_BSPC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_TAB, - LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, + MO(SYMB), KC_NO, KC_GRV, KC_LEFT,KC_RGHT, KC_PGUP,KC_PGDN, KC_NO, KC_LALT,KC_ENT ,KC_LGUI, // right hand - KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, - KC_CAPS, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, - KC_D, KC_H, KC_T, KC_N, LT(MDIA, KC_S), GUI_T(KC_MINS), - KC_ENT, KC_B, KC_M, KC_W, KC_V, KC_Z , KC_RSFT, - KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, + KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, + KC_CAPS, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, + KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, + KC_ENT, KC_B, KC_M, KC_W, KC_V, KC_Z , KC_RSFT, + KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, MO(SYMB), KC_HOME,KC_END, - KC_NO, - KC_RALT,KC_SPC,KC_RCTL + KC_RALT, + KC_FN1,KC_SPC,KC_RCTL ), /* Keymap 1: Symbol Layer * @@ -95,7 +95,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), -/* Keymap 2: Media and mouse keys + +[STEN] = KEYMAP( // layout: layer 2: Steno for Plover + // left hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, + KC_NO, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_STAR, + KC_NO, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR, + KC_NO, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR, + KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, + KC_NO, KC_NO, + KC_NO, + PV_A, PV_O, KC_NO, + // right hand + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + PV_STAR, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, + PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD, + PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ, + KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, + KC_NO, + KC_FN1, PV_E, PV_U +), + +/* Keymap 3: Media and mouse keys * * ,--------------------------------------------------. ,--------------------------------------------------. * | | | | | | | | | | | | | | | | @@ -136,31 +158,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_WBAK ), - -[STEN] = KEYMAP( // layout: layer 4: Steno for Plover - // left hand - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, - KC_NO, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_STAR, - KC_NO, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR, - KC_NO, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR, - KC_NO, KC_NO, KC_NO, KC_TRNS, KC_TRNS, - KC_NO, KC_NO, - KC_NO, - PV_A, PV_O, KC_NO, - // right hand - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - PV_STAR, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, - PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD, - PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ, - KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, - KC_NO, - KC_NO, PV_E, PV_U -), }; const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) + [1] = ACTION_LAYER_TAP_TOGGLE(MDIA) // FN1 - Momentary Layer 3 (Media) }; void toggle_steno(int pressed) @@ -200,26 +201,17 @@ void matrix_init_user(void) { // Runs constantly in the background, in a loop. void matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); + uint32_t layer0 = layer_state & (1UL << 0), + layer1 = layer_state & (1UL << 1), + layer2 = layer_state & (1UL << 2), + layer3 = layer_state & (1UL << 3); ergodox_board_led_off(); ergodox_right_led_1_off(); ergodox_right_led_2_off(); ergodox_right_led_3_off(); - switch (layer) { - // TODO: Make this relevant to the ErgoDox EZ. - case 1: - ergodox_right_led_1_on(); - break; - case 2: - ergodox_right_led_2_on(); - break; - case 3: - ergodox_right_led_3_on(); - break; - default: - // none - break; - } + if (layer1) ergodox_right_led_1_on(); + if (layer2) ergodox_right_led_2_on(); + if (layer3) ergodox_right_led_3_on(); }; diff --git a/keyboard/planck/keymaps/pvc/config.h b/keyboard/planck/keymaps/pvc/config.h index 7d64f09773..d435cc795c 100644 --- a/keyboard/planck/keymaps/pvc/config.h +++ b/keyboard/planck/keymaps/pvc/config.h @@ -73,7 +73,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* disable debug print */ -//#define NO_DEBUG +#define NO_DEBUG /* disable print */ //#define NO_PRINT diff --git a/keyboard/planck/keymaps/pvc/keymap.c b/keyboard/planck/keymaps/pvc/keymap.c index 27850b2154..830b00a4c4 100644 --- a/keyboard/planck/keymaps/pvc/keymap.c +++ b/keyboard/planck/keymaps/pvc/keymap.c @@ -96,7 +96,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_QWERTY] = { /* QWERTY */ { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC }, - { KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, + { KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_UP, KC_DOWN, KC_LEFT, KC_RGHT }, }, @@ -115,7 +115,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_COLEMAK] = { /* COLEMAK */ { KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_ESC }, - { KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT }, + { KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT }, { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, { KC_LCTL, KC_LGUI, M_FUNCT, KC_LALT, M_RAISE, KC_SPC, KC_SPC, M_LOWER, KC_UP, KC_DOWN, KC_LEFT, KC_RGHT }, }, diff --git a/keyboard/planck/keymaps/pvc/makefile.mk b/keyboard/planck/keymaps/pvc/makefile.mk index 4b9e34c53f..b3f1b9e51c 100644 --- a/keyboard/planck/keymaps/pvc/makefile.mk +++ b/keyboard/planck/keymaps/pvc/makefile.mk @@ -4,6 +4,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode @@ -13,4 +14,4 @@ RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -CONFIG_H = keymaps/$(KEYMAP)/config.h +CONFIG_H = keymaps/$(KEYMAP)/config.h
\ No newline at end of file diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index e85370d958..3a7f0f5567 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -1,6 +1,6 @@ #include <stdio.h> #include <string.h> -#include <math.h> +//#include <math.h> #include <avr/pgmspace.h> #include <avr/interrupt.h> #include <avr/io.h> @@ -10,30 +10,28 @@ #include "eeconfig.h" -#ifdef VIBRATO_ENABLE - #include "vibrato_lut.h" -#endif +#define CPU_PRESCALER 8 -#define PI 3.14159265 +// ----------------------------------------------------------------------------- +// Timer Abstractions +// ----------------------------------------------------------------------------- -#define CPU_PRESCALER 8 +// TIMSK3 - Timer/Counter #3 Interrupt Mask Register +// Turn on/off 3A interputs, stopping/enabling the ISR calls +#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A) +#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A) -#ifdef PWM_AUDIO - #include "wave.h" - #define SAMPLE_DIVIDER 39 - #define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048) - // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap +// TCCR3A: Timer/Counter #3 Control Register +// Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 +#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1); +#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0)); - float places[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint16_t place_int = 0; - bool repeat = true; -#endif +// Fast PWM Mode Controls +#define TIMER_3_PERIOD ICR3 +#define TIMER_3_DUTY_CYCLE OCR3A + +// ----------------------------------------------------------------------------- -void delay_us(int count) { - while(count--) { - _delay_us(1); - } -} int voices = 0; int voice_place = 0; @@ -45,26 +43,23 @@ float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; bool sliding = false; -int max = 0xFF; -float sum = 0; float place = 0; uint8_t * sample; uint16_t sample_length = 0; -// float freq = 0; - -bool notes = false; -bool note = false; -float note_frequency = 0; -float note_length = 0; -float note_tempo = TEMPO_DEFAULT; -float note_timbre = TIMBRE_DEFAULT; + +bool playing_notes = false; +bool playing_note = false; +float note_frequency = 0; +float note_length = 0; +uint8_t note_tempo = TEMPO_DEFAULT; +float note_timbre = TIMBRE_DEFAULT; uint16_t note_position = 0; float (* notes_pointer)[][2]; uint16_t notes_count; -bool notes_repeat; -float notes_rest; -bool note_resting = false; +bool notes_repeat; +float notes_rest; +bool note_resting = false; uint8_t current_note = 0; uint8_t rest_counter = 0; @@ -77,175 +72,65 @@ float vibrato_rate = 0.125; float polyphony_rate = 0; -bool inited = false; +static bool audio_initialized = false; audio_config_t audio_config; uint16_t envelope_index = 0; -void audio_toggle(void) { - audio_config.enable ^= 1; - eeconfig_update_audio(audio_config.raw); -} - -void audio_on(void) { - audio_config.enable = 1; - eeconfig_update_audio(audio_config.raw); -} - -void audio_off(void) { - audio_config.enable = 0; - eeconfig_update_audio(audio_config.raw); -} - -#ifdef VIBRATO_ENABLE -// Vibrato rate functions - -void set_vibrato_rate(float rate) { - vibrato_rate = rate; -} - -void increase_vibrato_rate(float change) { - vibrato_rate *= change; -} - -void decrease_vibrato_rate(float change) { - vibrato_rate /= change; -} - -#ifdef VIBRATO_STRENGTH_ENABLE - -void set_vibrato_strength(float strength) { - vibrato_strength = strength; -} - -void increase_vibrato_strength(float change) { - vibrato_strength *= change; -} - -void decrease_vibrato_strength(float change) { - vibrato_strength /= change; -} - -#endif - -#endif - -// Polyphony functions - -void set_polyphony_rate(float rate) { - polyphony_rate = rate; -} - -void enable_polyphony() { - polyphony_rate = 5; -} - -void disable_polyphony() { - polyphony_rate = 0; -} - -void increase_polyphony_rate(float change) { - polyphony_rate *= change; -} - -void decrease_polyphony_rate(float change) { - polyphony_rate /= change; -} - -// Timbre function - -void set_timbre(float timbre) { - note_timbre = timbre; -} - -// Tempo functions - -void set_tempo(float tempo) { - note_tempo = tempo; -} - -void decrease_tempo(uint8_t tempo_change) { - note_tempo += (float) tempo_change; -} - -void increase_tempo(uint8_t tempo_change) { - if (note_tempo - (float) tempo_change < 10) { - note_tempo = 10; - } else { - note_tempo -= (float) tempo_change; - } -} - -void audio_init() { +void audio_init() +{ - /* check signature */ - if (!eeconfig_is_enabled()) { + // Check EEPROM + if (!eeconfig_is_enabled()) + { eeconfig_init(); } audio_config.raw = eeconfig_read_audio(); - #ifdef PWM_AUDIO - PLLFRQ = _BV(PDIV2); - PLLCSR = _BV(PLLE); - while(!(PLLCSR & _BV(PLOCK))); - PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ + // Set port PC6 (OC3A and /OC4A) as output + DDRC |= _BV(PORTC6); - /* Init a fast PWM on Timer4 */ - TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ - TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ - OCR4A = 0; + DISABLE_AUDIO_COUNTER_3_ISR; - /* Enable the OC4A output */ - DDRC |= _BV(PORTC6); + // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers + // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 + // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A) + // Clock Select (CS3n) = 0b010 = Clock / 8 + TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); + TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); - TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs - - TCCR3A = 0x0; // Options not needed - TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC - OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback - #else - DDRC |= _BV(PORTC6); - - TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs - - TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); - TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); - #endif - - inited = true; + audio_initialized = true; } -void stop_all_notes() { - if (!inited) { +void stop_all_notes() +{ + if (!audio_initialized) { audio_init(); } voices = 0; - #ifdef PWM_AUDIO - TIMSK3 &= ~_BV(OCIE3A); - #else - TIMSK3 &= ~_BV(OCIE3A); - TCCR3A &= ~_BV(COM3A1); - #endif - notes = false; - note = false; + + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; + + playing_notes = false; + playing_note = false; frequency = 0; volume = 0; - for (int i = 0; i < 8; i++) { + for (uint8_t i = 0; i < 8; i++) + { frequencies[i] = 0; volumes[i] = 0; } } -void stop_note(float freq) { - if (note) { - if (!inited) { +void stop_note(float freq) +{ + if (playing_note) { + if (!audio_initialized) { audio_init(); } - #ifdef PWM_AUDIO - freq = freq / SAMPLE_RATE; - #endif for (int i = 7; i >= 0; i--) { if (frequencies[i] == freq) { frequencies[i] = 0; @@ -266,15 +151,11 @@ void stop_note(float freq) { voice_place = 0; } if (voices == 0) { - #ifdef PWM_AUDIO - TIMSK3 &= ~_BV(OCIE3A); - #else - TIMSK3 &= ~_BV(OCIE3A); - TCCR3A &= ~_BV(COM3A1); - #endif + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; frequency = 0; volume = 0; - note = false; + playing_note = false; } } } @@ -289,9 +170,9 @@ float mod(float a, int b) float vibrato(float average_freq) { #ifdef VIBRATO_STRENGTH_ENABLE - float vibrated_freq = average_freq * pow(VIBRATO_LUT[(int)vibrato_counter], vibrato_strength); + float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength); #else - float vibrated_freq = average_freq * VIBRATO_LUT[(int)vibrato_counter]; + float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter]; #endif vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH); return vibrated_freq; @@ -299,295 +180,295 @@ float vibrato(float average_freq) { #endif -ISR(TIMER3_COMPA_vect) { - if (note) { - #ifdef PWM_AUDIO - if (voices == 1) { - // SINE - OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2; - - // SQUARE - // if (((int)place) >= 1024){ - // OCR4A = 0xFF >> 2; - // } else { - // OCR4A = 0x00; - // } - - // SAWTOOTH - // OCR4A = (int)place / 4; - - // TRIANGLE - // if (((int)place) >= 1024) { - // OCR4A = (int)place / 2; - // } else { - // OCR4A = 2048 - (int)place / 2; - // } - - place += frequency; - - if (place >= SINE_LENGTH) - place -= SINE_LENGTH; - - } else { - int sum = 0; - for (int i = 0; i < voices; i++) { - // SINE - sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2; - - // SQUARE - // if (((int)places[i]) >= 1024){ - // sum += 0xFF >> 2; - // } else { - // sum += 0x00; - // } - - places[i] += frequencies[i]; - - if (places[i] >= SINE_LENGTH) - places[i] -= SINE_LENGTH; - } - OCR4A = sum; - } - #else - if (voices > 0) { - float freq; - if (polyphony_rate > 0) { - if (voices > 1) { - voice_place %= voices; - if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { - voice_place = (voice_place + 1) % voices; - place = 0.0; - } - } - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequencies[voice_place]); - } else { - #else - { - #endif - freq = frequencies[voice_place]; - } - } else { - if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, 440/frequency/12/2); - } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, -440/frequency/12/2); - } else { - frequency = frequencies[voices - 1]; - } - - - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequency); - } else { - #else - { - #endif - freq = frequency; - } - } +ISR(TIMER3_COMPA_vect) +{ + float freq; + + if (playing_note) { + if (voices > 0) { + if (polyphony_rate > 0) { + if (voices > 1) { + voice_place %= voices; + if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { + voice_place = (voice_place + 1) % voices; + place = 0.0; + } + } + + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequencies[voice_place]); + } else { + freq = frequencies[voice_place]; + } + #else + freq = frequencies[voice_place]; + #endif + } else { + if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { + frequency = frequency * pow(2, 440/frequency/12/2); + } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { + frequency = frequency * pow(2, -440/frequency/12/2); + } else { + frequency = frequencies[voices - 1]; + } + + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequency); + } else { + freq = frequency; + } + #else + freq = frequency; + #endif + } + + if (envelope_index < 65535) { + envelope_index++; + } + + freq = voice_envelope(freq); + + if (freq < 30.517578125) { + freq = 30.52; + } + + TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); + TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); + } + } + + if (playing_notes) { + if (note_frequency > 0) { + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(note_frequency); + } else { + freq = note_frequency; + } + #else + freq = note_frequency; + #endif + + if (envelope_index < 65535) { + envelope_index++; + } + freq = voice_envelope(freq); + + TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); + TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); + } else { + TIMER_3_PERIOD = 0; + TIMER_3_DUTY_CYCLE = 0; + } + + note_position++; + bool end_of_note = false; + if (TIMER_3_PERIOD > 0) { + end_of_note = (note_position >= (note_length / TIMER_3_PERIOD * 0xFFFF)); + } else { + end_of_note = (note_position >= (note_length * 0x7FF)); + } + + if (end_of_note) { + current_note++; + if (current_note >= notes_count) { + if (notes_repeat) { + current_note = 0; + } else { + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; + playing_notes = false; + return; + } + } + if (!note_resting && (notes_rest > 0)) { + note_resting = true; + note_frequency = 0; + note_length = notes_rest; + current_note--; + } else { + note_resting = false; + envelope_index = 0; + note_frequency = (*notes_pointer)[current_note][0]; + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); + } + + note_position = 0; + } + } + + if (!audio_config.enable) { + playing_notes = false; + playing_note = false; + } +} - if (envelope_index < 65535) { - envelope_index++; - } - freq = voice_envelope(freq); +void play_note(float freq, int vol) { - if (freq < 30.517578125) - freq = 30.52; - ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period - OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period - } - #endif + if (!audio_initialized) { + audio_init(); } - // SAMPLE - // OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]); - - // place_int++; - - // if (place_int >= sample_length) - // if (repeat) - // place_int -= sample_length; - // else - // TIMSK3 &= ~_BV(OCIE3A); - - - if (notes) { - #ifdef PWM_AUDIO - OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0; - - place += note_frequency; - if (place >= SINE_LENGTH) - place -= SINE_LENGTH; - #else - if (note_frequency > 0) { - float freq; - - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(note_frequency); - } else { - #else - { - #endif - freq = note_frequency; - } + if (audio_config.enable && voices < 8) { + DISABLE_AUDIO_COUNTER_3_ISR; - if (envelope_index < 65535) { - envelope_index++; - } - freq = voice_envelope(freq); + // Cancel notes if notes are playing + if (playing_notes) + stop_all_notes(); - ICR3 = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period - OCR3A = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period - } else { - ICR3 = 0; - OCR3A = 0; - } - #endif - - - note_position++; - bool end_of_note = false; - if (ICR3 > 0) - end_of_note = (note_position >= (note_length / ICR3 * 0xFFFF)); - else - end_of_note = (note_position >= (note_length * 0x7FF)); - if (end_of_note) { - current_note++; - if (current_note >= notes_count) { - if (notes_repeat) { - current_note = 0; - } else { - #ifdef PWM_AUDIO - TIMSK3 &= ~_BV(OCIE3A); - #else - TIMSK3 &= ~_BV(OCIE3A); - TCCR3A &= ~_BV(COM3A1); - #endif - notes = false; - return; - } - } - if (!note_resting && (notes_rest > 0)) { - note_resting = true; - note_frequency = 0; - note_length = notes_rest; - current_note--; - } else { - note_resting = false; - #ifdef PWM_AUDIO - note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; - note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100); - #else - envelope_index = 0; - note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100); - #endif - } - note_position = 0; - } + playing_note = true; - } + envelope_index = 0; + + if (freq > 0) { + frequencies[voices] = freq; + volumes[voices] = vol; + voices++; + } + + ENABLE_AUDIO_COUNTER_3_ISR; + ENABLE_AUDIO_COUNTER_3_OUTPUT; + } - if (!audio_config.enable) { - notes = false; - note = false; - } } -void play_note(float freq, int vol) { +void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) +{ - if (!inited) { + if (!audio_initialized) { audio_init(); } -if (audio_config.enable && voices < 8) { - TIMSK3 &= ~_BV(OCIE3A); - // Cancel notes if notes are playing - if (notes) - stop_all_notes(); - note = true; - envelope_index = 0; - #ifdef PWM_AUDIO - freq = freq / SAMPLE_RATE; - #endif - if (freq > 0) { - frequencies[voices] = freq; - volumes[voices] = vol; - voices++; - } + if (audio_config.enable) { + + DISABLE_AUDIO_COUNTER_3_ISR; + + // Cancel note if a note is playing + if (playing_note) + stop_all_notes(); + + playing_notes = true; + + notes_pointer = np; + notes_count = n_count; + notes_repeat = n_repeat; + notes_rest = n_rest; + + place = 0; + current_note = 0; + + note_frequency = (*notes_pointer)[current_note][0]; + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); + note_position = 0; + + + ENABLE_AUDIO_COUNTER_3_ISR; + ENABLE_AUDIO_COUNTER_3_OUTPUT; + } - #ifdef PWM_AUDIO - TIMSK3 |= _BV(OCIE3A); - #else - TIMSK3 |= _BV(OCIE3A); - TCCR3A |= _BV(COM3A1); - #endif } +bool is_playing_notes(void) { + return playing_notes; } -void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) { +void audio_toggle(void) { + audio_config.enable ^= 1; + eeconfig_update_audio(audio_config.raw); +} - if (!inited) { - audio_init(); - } +void audio_on(void) { + audio_config.enable = 1; + eeconfig_update_audio(audio_config.raw); +} -if (audio_config.enable) { - TIMSK3 &= ~_BV(OCIE3A); - // Cancel note if a note is playing - if (note) - stop_all_notes(); - notes = true; - - notes_pointer = np; - notes_count = n_count; - notes_repeat = n_repeat; - notes_rest = n_rest; - - place = 0; - current_note = 0; - #ifdef PWM_AUDIO - note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; - note_length = (*notes_pointer)[current_note][1] * (note_tempo / 100); - #else - note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (note_tempo / 100); - #endif - note_position = 0; +void audio_off(void) { + audio_config.enable = 0; + eeconfig_update_audio(audio_config.raw); +} +#ifdef VIBRATO_ENABLE - #ifdef PWM_AUDIO - TIMSK3 |= _BV(OCIE3A); - #else - TIMSK3 |= _BV(OCIE3A); - TCCR3A |= _BV(COM3A1); - #endif +// Vibrato rate functions + +void set_vibrato_rate(float rate) { + vibrato_rate = rate; } +void increase_vibrato_rate(float change) { + vibrato_rate *= change; } -#ifdef PWM_AUDIO -void play_sample(uint8_t * s, uint16_t l, bool r) { - if (!inited) { - audio_init(); - } +void decrease_vibrato_rate(float change) { + vibrato_rate /= change; +} - if (audio_config.enable) { - TIMSK3 &= ~_BV(OCIE3A); - stop_all_notes(); - place_int = 0; - sample = s; - sample_length = l; - repeat = r; +#ifdef VIBRATO_STRENGTH_ENABLE + +void set_vibrato_strength(float strength) { + vibrato_strength = strength; +} + +void increase_vibrato_strength(float change) { + vibrato_strength *= change; +} + +void decrease_vibrato_strength(float change) { + vibrato_strength /= change; +} + +#endif /* VIBRATO_STRENGTH_ENABLE */ + +#endif /* VIBRATO_ENABLE */ - TIMSK3 |= _BV(OCIE3A); +// Polyphony functions + +void set_polyphony_rate(float rate) { + polyphony_rate = rate; +} + +void enable_polyphony() { + polyphony_rate = 5; +} + +void disable_polyphony() { + polyphony_rate = 0; +} + +void increase_polyphony_rate(float change) { + polyphony_rate *= change; +} + +void decrease_polyphony_rate(float change) { + polyphony_rate /= change; +} + +// Timbre function + +void set_timbre(float timbre) { + note_timbre = timbre; +} + +// Tempo functions + +void set_tempo(uint8_t tempo) { + note_tempo = tempo; +} + +void decrease_tempo(uint8_t tempo_change) { + note_tempo += tempo_change; +} + +void increase_tempo(uint8_t tempo_change) { + if (note_tempo - tempo_change < 10) { + note_tempo = 10; + } else { + note_tempo -= tempo_change; } } -#endif + //------------------------------------------------------------------------------ // Override these functions in your keymap file to play different tunes on @@ -597,11 +478,8 @@ void play_startup_tone() { } - - __attribute__ ((weak)) void play_goodbye_tone() { - } //------------------------------------------------------------------------------ diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h index 89769507e1..3d706587ab 100644 --- a/quantum/audio/audio.h +++ b/quantum/audio/audio.h @@ -56,7 +56,7 @@ void increase_polyphony_rate(float change); void decrease_polyphony_rate(float change); void set_timbre(float timbre); -void set_tempo(float tempo); +void set_tempo(uint8_t tempo); void increase_tempo(uint8_t tempo_change); void decrease_tempo(uint8_t tempo_change); @@ -83,7 +83,11 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) #define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0])))) #define PLAY_NOTE_ARRAY(note_array, note_repeat, note_rest_style) play_notes(¬e_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat), (note_rest_style)); + +bool is_playing_notes(void); void play_goodbye_tone(void); void play_startup_tone(void); + + #endif
\ No newline at end of file diff --git a/quantum/audio/audio_pwm.c b/quantum/audio/audio_pwm.c new file mode 100644 index 0000000000..328a253a7e --- /dev/null +++ b/quantum/audio/audio_pwm.c @@ -0,0 +1,643 @@ +#include <stdio.h> +#include <string.h> +//#include <math.h> +#include <avr/pgmspace.h> +#include <avr/interrupt.h> +#include <avr/io.h> +#include "print.h" +#include "audio.h" +#include "keymap_common.h" + +#include "eeconfig.h" + +#define PI 3.14159265 + +#define CPU_PRESCALER 8 + + +// Timer Abstractions + +// TIMSK3 - Timer/Counter #3 Interrupt Mask Register +// Turn on/off 3A interputs, stopping/enabling the ISR calls +#define ENABLE_AUDIO_COUNTER_3_ISR TIMSK3 |= _BV(OCIE3A) +#define DISABLE_AUDIO_COUNTER_3_ISR TIMSK3 &= ~_BV(OCIE3A) + + +// TCCR3A: Timer/Counter #3 Control Register +// Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 +#define ENABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A |= _BV(COM3A1); +#define DISABLE_AUDIO_COUNTER_3_OUTPUT TCCR3A &= ~(_BV(COM3A1) | _BV(COM3A0)); + + +#define NOTE_PERIOD ICR3 +#define NOTE_DUTY_CYCLE OCR3A + + +#ifdef PWM_AUDIO + #include "wave.h" + #define SAMPLE_DIVIDER 39 + #define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048) + // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap + + float places[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + uint16_t place_int = 0; + bool repeat = true; +#endif + +void delay_us(int count) { + while(count--) { + _delay_us(1); + } +} + +int voices = 0; +int voice_place = 0; +float frequency = 0; +int volume = 0; +long position = 0; + +float frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +bool sliding = false; + +float place = 0; + +uint8_t * sample; +uint16_t sample_length = 0; +// float freq = 0; + +bool playing_notes = false; +bool playing_note = false; +float note_frequency = 0; +float note_length = 0; +uint8_t note_tempo = TEMPO_DEFAULT; +float note_timbre = TIMBRE_DEFAULT; +uint16_t note_position = 0; +float (* notes_pointer)[][2]; +uint16_t notes_count; +bool notes_repeat; +float notes_rest; +bool note_resting = false; + +uint8_t current_note = 0; +uint8_t rest_counter = 0; + +#ifdef VIBRATO_ENABLE +float vibrato_counter = 0; +float vibrato_strength = .5; +float vibrato_rate = 0.125; +#endif + +float polyphony_rate = 0; + +static bool audio_initialized = false; + +audio_config_t audio_config; + +uint16_t envelope_index = 0; + +void audio_init() { + + // Check EEPROM + if (!eeconfig_is_enabled()) + { + eeconfig_init(); + } + audio_config.raw = eeconfig_read_audio(); + + #ifdef PWM_AUDIO + + PLLFRQ = _BV(PDIV2); + PLLCSR = _BV(PLLE); + while(!(PLLCSR & _BV(PLOCK))); + PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ + + /* Init a fast PWM on Timer4 */ + TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ + TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ + OCR4A = 0; + + /* Enable the OC4A output */ + DDRC |= _BV(PORTC6); + + DISABLE_AUDIO_COUNTER_3_ISR; // Turn off 3A interputs + + TCCR3A = 0x0; // Options not needed + TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC + OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback + + #else + + // Set port PC6 (OC3A and /OC4A) as output + DDRC |= _BV(PORTC6); + + DISABLE_AUDIO_COUNTER_3_ISR; + + // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers + // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 + // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A) + // Clock Select (CS3n) = 0b010 = Clock / 8 + TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); + TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); + + #endif + + audio_initialized = true; +} + +void stop_all_notes() { + if (!audio_initialized) { + audio_init(); + } + voices = 0; + #ifdef PWM_AUDIO + DISABLE_AUDIO_COUNTER_3_ISR; + #else + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; + #endif + + playing_notes = false; + playing_note = false; + frequency = 0; + volume = 0; + + for (uint8_t i = 0; i < 8; i++) + { + frequencies[i] = 0; + volumes[i] = 0; + } +} + +void stop_note(float freq) +{ + if (playing_note) { + if (!audio_initialized) { + audio_init(); + } + #ifdef PWM_AUDIO + freq = freq / SAMPLE_RATE; + #endif + for (int i = 7; i >= 0; i--) { + if (frequencies[i] == freq) { + frequencies[i] = 0; + volumes[i] = 0; + for (int j = i; (j < 7); j++) { + frequencies[j] = frequencies[j+1]; + frequencies[j+1] = 0; + volumes[j] = volumes[j+1]; + volumes[j+1] = 0; + } + break; + } + } + voices--; + if (voices < 0) + voices = 0; + if (voice_place >= voices) { + voice_place = 0; + } + if (voices == 0) { + #ifdef PWM_AUDIO + DISABLE_AUDIO_COUNTER_3_ISR; + #else + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; + #endif + frequency = 0; + volume = 0; + playing_note = false; + } + } +} + +#ifdef VIBRATO_ENABLE + +float mod(float a, int b) +{ + float r = fmod(a, b); + return r < 0 ? r + b : r; +} + +float vibrato(float average_freq) { + #ifdef VIBRATO_STRENGTH_ENABLE + float vibrated_freq = average_freq * pow(vibrato_lut[(int)vibrato_counter], vibrato_strength); + #else + float vibrated_freq = average_freq * vibrato_lut[(int)vibrato_counter]; + #endif + vibrato_counter = mod((vibrato_counter + vibrato_rate * (1.0 + 440.0/average_freq)), VIBRATO_LUT_LENGTH); + return vibrated_freq; +} + +#endif + +ISR(TIMER3_COMPA_vect) +{ + if (playing_note) { + #ifdef PWM_AUDIO + if (voices == 1) { + // SINE + OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2; + + // SQUARE + // if (((int)place) >= 1024){ + // OCR4A = 0xFF >> 2; + // } else { + // OCR4A = 0x00; + // } + + // SAWTOOTH + // OCR4A = (int)place / 4; + + // TRIANGLE + // if (((int)place) >= 1024) { + // OCR4A = (int)place / 2; + // } else { + // OCR4A = 2048 - (int)place / 2; + // } + + place += frequency; + + if (place >= SINE_LENGTH) + place -= SINE_LENGTH; + + } else { + int sum = 0; + for (int i = 0; i < voices; i++) { + // SINE + sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2; + + // SQUARE + // if (((int)places[i]) >= 1024){ + // sum += 0xFF >> 2; + // } else { + // sum += 0x00; + // } + + places[i] += frequencies[i]; + + if (places[i] >= SINE_LENGTH) + places[i] -= SINE_LENGTH; + } + OCR4A = sum; + } + #else + if (voices > 0) { + float freq; + if (polyphony_rate > 0) { + if (voices > 1) { + voice_place %= voices; + if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { + voice_place = (voice_place + 1) % voices; + place = 0.0; + } + } + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequencies[voice_place]); + } else { + #else + { + #endif + freq = frequencies[voice_place]; + } + } else { + if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { + frequency = frequency * pow(2, 440/frequency/12/2); + } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { + frequency = frequency * pow(2, -440/frequency/12/2); + } else { + frequency = frequencies[voices - 1]; + } + + + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequency); + } else { + #else + { + #endif + freq = frequency; + } + } + + if (envelope_index < 65535) { + envelope_index++; + } + freq = voice_envelope(freq); + + if (freq < 30.517578125) + freq = 30.52; + NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period + NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period + } + #endif + } + + // SAMPLE + // OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]); + + // place_int++; + + // if (place_int >= sample_length) + // if (repeat) + // place_int -= sample_length; + // else + // DISABLE_AUDIO_COUNTER_3_ISR; + + + if (playing_notes) { + #ifdef PWM_AUDIO + OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0; + + place += note_frequency; + if (place >= SINE_LENGTH) + place -= SINE_LENGTH; + #else + if (note_frequency > 0) { + float freq; + + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(note_frequency); + } else { + #else + { + #endif + freq = note_frequency; + } + + if (envelope_index < 65535) { + envelope_index++; + } + freq = voice_envelope(freq); + + NOTE_PERIOD = (int)(((double)F_CPU) / (freq * CPU_PRESCALER)); // Set max to the period + NOTE_DUTY_CYCLE = (int)((((double)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); // Set compare to half the period + } else { + NOTE_PERIOD = 0; + NOTE_DUTY_CYCLE = 0; + } + #endif + + + note_position++; + bool end_of_note = false; + if (NOTE_PERIOD > 0) + end_of_note = (note_position >= (note_length / NOTE_PERIOD * 0xFFFF)); + else + end_of_note = (note_position >= (note_length * 0x7FF)); + if (end_of_note) { + current_note++; + if (current_note >= notes_count) { + if (notes_repeat) { + current_note = 0; + } else { + #ifdef PWM_AUDIO + DISABLE_AUDIO_COUNTER_3_ISR; + #else + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; + #endif + playing_notes = false; + return; + } + } + if (!note_resting && (notes_rest > 0)) { + note_resting = true; + note_frequency = 0; + note_length = notes_rest; + current_note--; + } else { + note_resting = false; + #ifdef PWM_AUDIO + note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; + note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100); + #else + envelope_index = 0; + note_frequency = (*notes_pointer)[current_note][0]; + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); + #endif + } + note_position = 0; + } + + } + + if (!audio_config.enable) { + playing_notes = false; + playing_note = false; + } +} + +void play_note(float freq, int vol) { + + if (!audio_initialized) { + audio_init(); + } + + if (audio_config.enable && voices < 8) { + DISABLE_AUDIO_COUNTER_3_ISR; + + // Cancel notes if notes are playing + if (playing_notes) + stop_all_notes(); + + playing_note = true; + + envelope_index = 0; + + #ifdef PWM_AUDIO + freq = freq / SAMPLE_RATE; + #endif + if (freq > 0) { + frequencies[voices] = freq; + volumes[voices] = vol; + voices++; + } + + #ifdef PWM_AUDIO + ENABLE_AUDIO_COUNTER_3_ISR; + #else + ENABLE_AUDIO_COUNTER_3_ISR; + ENABLE_AUDIO_COUNTER_3_OUTPUT; + #endif + } + +} + +void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) +{ + + if (!audio_initialized) { + audio_init(); + } + + if (audio_config.enable) { + + DISABLE_AUDIO_COUNTER_3_ISR; + + // Cancel note if a note is playing + if (playing_note) + stop_all_notes(); + + playing_notes = true; + + notes_pointer = np; + notes_count = n_count; + notes_repeat = n_repeat; + notes_rest = n_rest; + + place = 0; + current_note = 0; + + #ifdef PWM_AUDIO + note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; + note_length = (*notes_pointer)[current_note][1] * (((float)note_tempo) / 100); + #else + note_frequency = (*notes_pointer)[current_note][0]; + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); + #endif + note_position = 0; + + + #ifdef PWM_AUDIO + ENABLE_AUDIO_COUNTER_3_ISR; + #else + ENABLE_AUDIO_COUNTER_3_ISR; + ENABLE_AUDIO_COUNTER_3_OUTPUT; + #endif + } + +} + +#ifdef PWM_AUDIO +void play_sample(uint8_t * s, uint16_t l, bool r) { + if (!audio_initialized) { + audio_init(); + } + + if (audio_config.enable) { + DISABLE_AUDIO_COUNTER_3_ISR; + stop_all_notes(); + place_int = 0; + sample = s; + sample_length = l; + repeat = r; + + ENABLE_AUDIO_COUNTER_3_ISR; + } +} +#endif + + +void audio_toggle(void) { + audio_config.enable ^= 1; + eeconfig_update_audio(audio_config.raw); +} + +void audio_on(void) { + audio_config.enable = 1; + eeconfig_update_audio(audio_config.raw); +} + +void audio_off(void) { + audio_config.enable = 0; + eeconfig_update_audio(audio_config.raw); +} + +#ifdef VIBRATO_ENABLE + +// Vibrato rate functions + +void set_vibrato_rate(float rate) { + vibrato_rate = rate; +} + +void increase_vibrato_rate(float change) { + vibrato_rate *= change; +} + +void decrease_vibrato_rate(float change) { + vibrato_rate /= change; +} + +#ifdef VIBRATO_STRENGTH_ENABLE + +void set_vibrato_strength(float strength) { + vibrato_strength = strength; +} + +void increase_vibrato_strength(float change) { + vibrato_strength *= change; +} + +void decrease_vibrato_strength(float change) { + vibrato_strength /= change; +} + +#endif /* VIBRATO_STRENGTH_ENABLE */ + +#endif /* VIBRATO_ENABLE */ + +// Polyphony functions + +void set_polyphony_rate(float rate) { + polyphony_rate = rate; +} + +void enable_polyphony() { + polyphony_rate = 5; +} + +void disable_polyphony() { + polyphony_rate = 0; +} + +void increase_polyphony_rate(float change) { + polyphony_rate *= change; +} + +void decrease_polyphony_rate(float change) { + polyphony_rate /= change; +} + +// Timbre function + +void set_timbre(float timbre) { + note_timbre = timbre; +} + +// Tempo functions + +void set_tempo(uint8_t tempo) { + note_tempo = tempo; +} + +void decrease_tempo(uint8_t tempo_change) { + note_tempo += tempo_change; +} + +void increase_tempo(uint8_t tempo_change) { + if (note_tempo - tempo_change < 10) { + note_tempo = 10; + } else { + note_tempo -= tempo_change; + } +} + + +//------------------------------------------------------------------------------ +// Override these functions in your keymap file to play different tunes on +// startup and bootloader jump +__attribute__ ((weak)) +void play_startup_tone() +{ +} + +__attribute__ ((weak)) +void play_goodbye_tone() +{ +} +//------------------------------------------------------------------------------ diff --git a/quantum/audio/frequency_lut.h b/quantum/audio/frequency_lut.h deleted file mode 100644 index e62da5be4e..0000000000 --- a/quantum/audio/frequency_lut.h +++ /dev/null @@ -1,357 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <avr/pgmspace.h> - -#define FREQUENCY_LUT_LENGTH 349 - -const uint16_t FREQUENCY_LUT[FREQUENCY_LUT_LENGTH] = { -0x8E0B, -0x8C02, -0x8A00, -0x8805, -0x8612, -0x8426, -0x8241, -0x8063, -0x7E8C, -0x7CBB, -0x7AF2, -0x792E, -0x7772, -0x75BB, -0x740B, -0x7261, -0x70BD, -0x6F20, -0x6D88, -0x6BF6, -0x6A69, -0x68E3, -0x6762, -0x65E6, -0x6470, -0x6300, -0x6194, -0x602E, -0x5ECD, -0x5D71, -0x5C1A, -0x5AC8, -0x597B, -0x5833, -0x56EF, -0x55B0, -0x5475, -0x533F, -0x520E, -0x50E1, -0x4FB8, -0x4E93, -0x4D73, -0x4C57, -0x4B3E, -0x4A2A, -0x491A, -0x480E, -0x4705, -0x4601, -0x4500, -0x4402, -0x4309, -0x4213, -0x4120, -0x4031, -0x3F46, -0x3E5D, -0x3D79, -0x3C97, -0x3BB9, -0x3ADD, -0x3A05, -0x3930, -0x385E, -0x3790, -0x36C4, -0x35FB, -0x3534, -0x3471, -0x33B1, -0x32F3, -0x3238, -0x3180, -0x30CA, -0x3017, -0x2F66, -0x2EB8, -0x2E0D, -0x2D64, -0x2CBD, -0x2C19, -0x2B77, -0x2AD8, -0x2A3A, -0x299F, -0x2907, -0x2870, -0x27DC, -0x2749, -0x26B9, -0x262B, -0x259F, -0x2515, -0x248D, -0x2407, -0x2382, -0x2300, -0x2280, -0x2201, -0x2184, -0x2109, -0x2090, -0x2018, -0x1FA3, -0x1F2E, -0x1EBC, -0x1E4B, -0x1DDC, -0x1D6E, -0x1D02, -0x1C98, -0x1C2F, -0x1BC8, -0x1B62, -0x1AFD, -0x1A9A, -0x1A38, -0x19D8, -0x1979, -0x191C, -0x18C0, -0x1865, -0x180B, -0x17B3, -0x175C, -0x1706, -0x16B2, -0x165E, -0x160C, -0x15BB, -0x156C, -0x151D, -0x14CF, -0x1483, -0x1438, -0x13EE, -0x13A4, -0x135C, -0x1315, -0x12CF, -0x128A, -0x1246, -0x1203, -0x11C1, -0x1180, -0x1140, -0x1100, -0x10C2, -0x1084, -0x1048, -0x100C, -0xFD1, -0xF97, -0xF5E, -0xF25, -0xEEE, -0xEB7, -0xE81, -0xE4C, -0xE17, -0xDE4, -0xDB1, -0xD7E, -0xD4D, -0xD1C, -0xCEC, -0xCBC, -0xC8E, -0xC60, -0xC32, -0xC05, -0xBD9, -0xBAE, -0xB83, -0xB59, -0xB2F, -0xB06, -0xADD, -0xAB6, -0xA8E, -0xA67, -0xA41, -0xA1C, -0x9F7, -0x9D2, -0x9AE, -0x98A, -0x967, -0x945, -0x923, -0x901, -0x8E0, -0x8C0, -0x8A0, -0x880, -0x861, -0x842, -0x824, -0x806, -0x7E8, -0x7CB, -0x7AF, -0x792, -0x777, -0x75B, -0x740, -0x726, -0x70B, -0x6F2, -0x6D8, -0x6BF, -0x6A6, -0x68E, -0x676, -0x65E, -0x647, -0x630, -0x619, -0x602, -0x5EC, -0x5D7, -0x5C1, -0x5AC, -0x597, -0x583, -0x56E, -0x55B, -0x547, -0x533, -0x520, -0x50E, -0x4FB, -0x4E9, -0x4D7, -0x4C5, -0x4B3, -0x4A2, -0x491, -0x480, -0x470, -0x460, -0x450, -0x440, -0x430, -0x421, -0x412, -0x403, -0x3F4, -0x3E5, -0x3D7, -0x3C9, -0x3BB, -0x3AD, -0x3A0, -0x393, -0x385, -0x379, -0x36C, -0x35F, -0x353, -0x347, -0x33B, -0x32F, -0x323, -0x318, -0x30C, -0x301, -0x2F6, -0x2EB, -0x2E0, -0x2D6, -0x2CB, -0x2C1, -0x2B7, -0x2AD, -0x2A3, -0x299, -0x290, -0x287, -0x27D, -0x274, -0x26B, -0x262, -0x259, -0x251, -0x248, -0x240, -0x238, -0x230, -0x228, -0x220, -0x218, -0x210, -0x209, -0x201, -0x1FA, -0x1F2, -0x1EB, -0x1E4, -0x1DD, -0x1D6, -0x1D0, -0x1C9, -0x1C2, -0x1BC, -0x1B6, -0x1AF, -0x1A9, -0x1A3, -0x19D, -0x197, -0x191, -0x18C, -0x186, -0x180, -0x17B, -0x175, -0x170, -0x16B, -0x165, -0x160, -0x15B, -0x156, -0x151, -0x14C, -0x148, -0x143, -0x13E, -0x13A, -0x135, -0x131, -0x12C, -0x128, -0x124, -0x120, -0x11C, -0x118, -0x114, -0x110, -0x10C, -0x108, -0x104, -0x100, -0xFD, -0xF9, -0xF5, -0xF2, -0xEE -};
\ No newline at end of file diff --git a/quantum/audio/luts.c b/quantum/audio/luts.c new file mode 100644 index 0000000000..9f3de9a05c --- /dev/null +++ b/quantum/audio/luts.c @@ -0,0 +1,382 @@ +#include <avr/io.h> +#include <avr/interrupt.h> +#include <avr/pgmspace.h> +#include "luts.h" + +const float vibrato_lut[VIBRATO_LUT_LENGTH] = +{ + 1.0022336811487, + 1.0042529943610, + 1.0058584256028, + 1.0068905285205, + 1.0072464122237, + 1.0068905285205, + 1.0058584256028, + 1.0042529943610, + 1.0022336811487, + 1.0000000000000, + 0.9977712970630, + 0.9957650169978, + 0.9941756956510, + 0.9931566259436, + 0.9928057204913, + 0.9931566259436, + 0.9941756956510, + 0.9957650169978, + 0.9977712970630, + 1.0000000000000, +}; + +const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH] = +{ + 0x8E0B, + 0x8C02, + 0x8A00, + 0x8805, + 0x8612, + 0x8426, + 0x8241, + 0x8063, + 0x7E8C, + 0x7CBB, + 0x7AF2, + 0x792E, + 0x7772, + 0x75BB, + 0x740B, + 0x7261, + 0x70BD, + 0x6F20, + 0x6D88, + 0x6BF6, + 0x6A69, + 0x68E3, + 0x6762, + 0x65E6, + 0x6470, + 0x6300, + 0x6194, + 0x602E, + 0x5ECD, + 0x5D71, + 0x5C1A, + 0x5AC8, + 0x597B, + 0x5833, + 0x56EF, + 0x55B0, + 0x5475, + 0x533F, + 0x520E, + 0x50E1, + 0x4FB8, + 0x4E93, + 0x4D73, + 0x4C57, + 0x4B3E, + 0x4A2A, + 0x491A, + 0x480E, + 0x4705, + 0x4601, + 0x4500, + 0x4402, + 0x4309, + 0x4213, + 0x4120, + 0x4031, + 0x3F46, + 0x3E5D, + 0x3D79, + 0x3C97, + 0x3BB9, + 0x3ADD, + 0x3A05, + 0x3930, + 0x385E, + 0x3790, + 0x36C4, + 0x35FB, + 0x3534, + 0x3471, + 0x33B1, + 0x32F3, + 0x3238, + 0x3180, + 0x30CA, + 0x3017, + 0x2F66, + 0x2EB8, + 0x2E0D, + 0x2D64, + 0x2CBD, + 0x2C19, + 0x2B77, + 0x2AD8, + 0x2A3A, + 0x299F, + 0x2907, + 0x2870, + 0x27DC, + 0x2749, + 0x26B9, + 0x262B, + 0x259F, + 0x2515, + 0x248D, + 0x2407, + 0x2382, + 0x2300, + 0x2280, + 0x2201, + 0x2184, + 0x2109, + 0x2090, + 0x2018, + 0x1FA3, + 0x1F2E, + 0x1EBC, + 0x1E4B, + 0x1DDC, + 0x1D6E, + 0x1D02, + 0x1C98, + 0x1C2F, + 0x1BC8, + 0x1B62, + 0x1AFD, + 0x1A9A, + 0x1A38, + 0x19D8, + 0x1979, + 0x191C, + 0x18C0, + 0x1865, + 0x180B, + 0x17B3, + 0x175C, + 0x1706, + 0x16B2, + 0x165E, + 0x160C, + 0x15BB, + 0x156C, + 0x151D, + 0x14CF, + 0x1483, + 0x1438, + 0x13EE, + 0x13A4, + 0x135C, + 0x1315, + 0x12CF, + 0x128A, + 0x1246, + 0x1203, + 0x11C1, + 0x1180, + 0x1140, + 0x1100, + 0x10C2, + 0x1084, + 0x1048, + 0x100C, + 0xFD1, + 0xF97, + 0xF5E, + 0xF25, + 0xEEE, + 0xEB7, + 0xE81, + 0xE4C, + 0xE17, + 0xDE4, + 0xDB1, + 0xD7E, + 0xD4D, + 0xD1C, + 0xCEC, + 0xCBC, + 0xC8E, + 0xC60, + 0xC32, + 0xC05, + 0xBD9, + 0xBAE, + 0xB83, + 0xB59, + 0xB2F, + 0xB06, + 0xADD, + 0xAB6, + 0xA8E, + 0xA67, + 0xA41, + 0xA1C, + 0x9F7, + 0x9D2, + 0x9AE, + 0x98A, + 0x967, + 0x945, + 0x923, + 0x901, + 0x8E0, + 0x8C0, + 0x8A0, + 0x880, + 0x861, + 0x842, + 0x824, + 0x806, + 0x7E8, + 0x7CB, + 0x7AF, + 0x792, + 0x777, + 0x75B, + 0x740, + 0x726, + 0x70B, + 0x6F2, + 0x6D8, + 0x6BF, + 0x6A6, + 0x68E, + 0x676, + 0x65E, + 0x647, + 0x630, + 0x619, + 0x602, + 0x5EC, + 0x5D7, + 0x5C1, + 0x5AC, + 0x597, + 0x583, + 0x56E, + 0x55B, + 0x547, + 0x533, + 0x520, + 0x50E, + 0x4FB, + 0x4E9, + 0x4D7, + 0x4C5, + 0x4B3, + 0x4A2, + 0x491, + 0x480, + 0x470, + 0x460, + 0x450, + 0x440, + 0x430, + 0x421, + 0x412, + 0x403, + 0x3F4, + 0x3E5, + 0x3D7, + 0x3C9, + 0x3BB, + 0x3AD, + 0x3A0, + 0x393, + 0x385, + 0x379, + 0x36C, + 0x35F, + 0x353, + 0x347, + 0x33B, + 0x32F, + 0x323, + 0x318, + 0x30C, + 0x301, + 0x2F6, + 0x2EB, + 0x2E0, + 0x2D6, + 0x2CB, + 0x2C1, + 0x2B7, + 0x2AD, + 0x2A3, + 0x299, + 0x290, + 0x287, + 0x27D, + 0x274, + 0x26B, + 0x262, + 0x259, + 0x251, + 0x248, + 0x240, + 0x238, + 0x230, + 0x228, + 0x220, + 0x218, + 0x210, + 0x209, + 0x201, + 0x1FA, + 0x1F2, + 0x1EB, + 0x1E4, + 0x1DD, + 0x1D6, + 0x1D0, + 0x1C9, + 0x1C2, + 0x1BC, + 0x1B6, + 0x1AF, + 0x1A9, + 0x1A3, + 0x19D, + 0x197, + 0x191, + 0x18C, + 0x186, + 0x180, + 0x17B, + 0x175, + 0x170, + 0x16B, + 0x165, + 0x160, + 0x15B, + 0x156, + 0x151, + 0x14C, + 0x148, + 0x143, + 0x13E, + 0x13A, + 0x135, + 0x131, + 0x12C, + 0x128, + 0x124, + 0x120, + 0x11C, + 0x118, + 0x114, + 0x110, + 0x10C, + 0x108, + 0x104, + 0x100, + 0xFD, + 0xF9, + 0xF5, + 0xF2, + 0xEE, +}; + diff --git a/quantum/audio/luts.h b/quantum/audio/luts.h new file mode 100644 index 0000000000..7df3078a7f --- /dev/null +++ b/quantum/audio/luts.h @@ -0,0 +1,15 @@ +#include <avr/io.h> +#include <avr/interrupt.h> +#include <avr/pgmspace.h> + +#ifndef LUTS_H +#define LUTS_H + +#define VIBRATO_LUT_LENGTH 20 + +#define FREQUENCY_LUT_LENGTH 349 + +extern const float vibrato_lut[VIBRATO_LUT_LENGTH]; +extern const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH]; + +#endif /* LUTS_H */
\ No newline at end of file diff --git a/quantum/audio/vibrato_lut.h b/quantum/audio/vibrato_lut.h deleted file mode 100644 index a2b1f3e5ce..0000000000 --- a/quantum/audio/vibrato_lut.h +++ /dev/null @@ -1,28 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <avr/pgmspace.h> - -#define VIBRATO_LUT_LENGTH 20 - -const float VIBRATO_LUT[VIBRATO_LUT_LENGTH] = { \ -1.00223368114872, -1.00425299436105, -1.00585842560279, -1.00689052852052, -1.0072464122237, -1.00689052852052, -1.00585842560279, -1.00425299436105, -1.00223368114872, -1, -0.99777129706302, -0.99576501699778, -0.994175695650927, -0.993156625943589, -0.992805720491269, -0.993156625943589, -0.994175695650927, -0.99576501699778, -0.99777129706302, -1 -};
\ No newline at end of file diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index d2316ba1b3..6d4172a06c 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -1,6 +1,6 @@ #include "voices.h" +#include "audio.h" #include "stdlib.h" -#include "vibrato_lut.h" // these are imported from audio.c extern uint16_t envelope_index; @@ -109,7 +109,7 @@ float voice_envelope(float frequency) { case 0 ... VOICE_VIBRATO_DELAY: break; default: - frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)]; + frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)]; break; } break; @@ -160,4 +160,6 @@ float voice_envelope(float frequency) { } return frequency; -}
\ No newline at end of file +} + + diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h index 74c873f42f..b2495b23b5 100644 --- a/quantum/audio/voices.h +++ b/quantum/audio/voices.h @@ -2,8 +2,7 @@ #include <stdbool.h> #include <avr/io.h> #include <util/delay.h> -#include "musical_notes.h" -#include "song_list.h" +#include "luts.h" #ifndef VOICES_H #define VOICES_H diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 4b4bd62109..5e78d1157d 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -24,10 +24,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "action_macro.h" #include "debug.h" #include "backlight.h" -#include "keymap_midi.h" #include "bootloader.h" #include "eeconfig.h" +#ifdef MIDI_ENABLE + #include "keymap_midi.h" +#endif + + extern keymap_config_t keymap_config; #include <stdio.h> diff --git a/quantum/quantum.mk b/quantum/quantum.mk index 83c4f1d1db..4a076eca4d 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -29,6 +29,7 @@ endif ifeq ($(strip $(AUDIO_ENABLE)), yes) SRC += $(QUANTUM_DIR)/audio/audio.c $(QUANTUM_DIR)/audio/voices.c + SRC += $(QUANTUM_DIR)/audio/audio.c $(QUANTUM_DIR)/audio/luts.c endif ifeq ($(strip $(UNICODE_ENABLE)), yes) |