summaryrefslogtreecommitdiffstats
path: root/keyboards/atomic
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2016-06-23 22:18:20 -0400
committerGitHub <noreply@github.com>2016-06-23 22:18:20 -0400
commit13bb6b4b7fdd2b3e419d0f89c93fb980b00eeb9b (patch)
tree2777e5c95bad3f5a9773fc58524a6ad99df63738 /keyboards/atomic
parentba116ceb496011bb35ce074a3ba8c2448f059260 (diff)
Backlight abstraction and other changes (#439)
* redoes matrix pins, abstracts backlight code for B5,6,7 * slimming down keyboard stuff, backlight breathing implemented * don't call backlight init when no pin * cleans up user/kb/quantum calls, keyboard files * fix pvc atomic * replaces CHANNEL with correct var in breathing * removes .hexs, updates readmes, updates template * cleans-up clueboards, readmes to lowercase * updates readme
Diffstat (limited to 'keyboards/atomic')
-rw-r--r--keyboards/atomic/atomic.c312
-rw-r--r--keyboards/atomic/atomic.h22
-rw-r--r--keyboards/atomic/config.h2
-rw-r--r--keyboards/atomic/keymaps/default/compiled.hex1118
-rw-r--r--keyboards/atomic/keymaps/pvc/compiled.hex1700
-rw-r--r--keyboards/atomic/keymaps/pvc/config.h3
-rw-r--r--keyboards/atomic/readme.md (renamed from keyboards/atomic/README.md)4
7 files changed, 8 insertions, 3153 deletions
diff --git a/keyboards/atomic/atomic.c b/keyboards/atomic/atomic.c
index fa218a48f3..6f393315ee 100644
--- a/keyboards/atomic/atomic.c
+++ b/keyboards/atomic/atomic.c
@@ -1,26 +1,5 @@
#include "atomic.h"
-__attribute__ ((weak))
-void matrix_init_user(void) {
- // leave this function blank - it can be defined in a keymap file
-};
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
- // leave this function blank - it can be defined in a keymap file
-}
-
-__attribute__ ((weak))
-bool process_action_user(keyrecord_t *record) {
- // leave this function blank - it can be defined in a keymap file
- return true;
-}
-
-__attribute__ ((weak))
-void led_set_user(uint8_t usb_led) {
- // leave this function blank - it can be defined in a keymap file
-}
-
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
@@ -28,298 +7,9 @@ void matrix_init_kb(void) {
MCUCR |= (1<<JTD);
MCUCR |= (1<<JTD);
-#ifdef BACKLIGHT_ENABLE
- backlight_init_ports();
-#endif
-
// Turn status LED on
DDRE |= (1<<6);
PORTE |= (1<<6);
matrix_init_user();
-}
-
-void matrix_scan_kb(void) {
- // put your looping keyboard code here
- // runs every cycle (a lot)
-
- matrix_scan_user();
-}
-
-bool process_action_kb(keyrecord_t *record) {
- // put your per-action keyboard code here
- // runs for every action, just before processing by the firmware
-
- return process_action_user(record);
-}
-
-void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
-
- led_set_user(usb_led);
-}
-
-#ifdef BACKLIGHT_ENABLE
-#define CHANNEL OCR1C
-#define BREATHING_NO_HALT 0
-#define BREATHING_HALT_OFF 1
-#define BREATHING_HALT_ON 2
-
-static uint8_t breath_intensity;
-static uint8_t breath_speed;
-static uint16_t breathing_index;
-static uint8_t breathing_halt;
-
-void backlight_init_ports()
-{
-
- // Setup PB7 as output and output low.
- DDRB |= (1<<7);
- PORTB &= ~(1<<7);
-
- // Use full 16-bit resolution.
- ICR1 = 0xFFFF;
-
- // I could write a wall of text here to explain... but TL;DW
- // Go read the ATmega32u4 datasheet.
- // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
-
- // Pin PB7 = OCR1C (Timer 1, Channel C)
- // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
- // (i.e. start high, go low when counter matches.)
- // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
- // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
-
- TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
- TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
-
- backlight_init();
- breathing_defaults();
-}
-
-void backlight_set(uint8_t level)
-{
- // Prevent backlight blink on lowest level
- PORTB &= ~(_BV(PORTB7));
-
- if ( level == 0 )
- {
- // Turn off PWM control on PB7, revert to output low.
- TCCR1A &= ~(_BV(COM1C1));
-
- // Set the brightness to 0
- CHANNEL = 0x0;
- }
- else if ( level >= BACKLIGHT_LEVELS )
- {
- // Turn on PWM control of PB7
- TCCR1A |= _BV(COM1C1);
-
- // Set the brightness to max
- CHANNEL = 0xFFFF;
- }
- else
- {
- // Turn on PWM control of PB7
- TCCR1A |= _BV(COM1C1);
-
- // Set the brightness
- CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
- }
- breathing_intensity_default();
-}
-
-
-void breathing_enable(void)
-{
- if (get_backlight_level() == 0)
- {
- breathing_index = 0;
- }
- else
- {
- // Set breathing_index to be at the midpoint (brightest point)
- breathing_index = 0x20 << breath_speed;
- }
-
- breathing_halt = BREATHING_NO_HALT;
-
- // Enable breathing interrupt
- TIMSK1 |= _BV(OCIE1A);
-}
-
-void breathing_pulse(void)
-{
- if (get_backlight_level() == 0)
- {
- breathing_index = 0;
- }
- else
- {
- // Set breathing_index to be at the midpoint + 1 (brightest point)
- breathing_index = 0x21 << breath_speed;
- }
-
- breathing_halt = BREATHING_HALT_ON;
-
- // Enable breathing interrupt
- TIMSK1 |= _BV(OCIE1A);
-}
-
-void breathing_disable(void)
-{
- // Disable breathing interrupt
- TIMSK1 &= ~_BV(OCIE1A);
- backlight_set(get_backlight_level());
-}
-
-void breathing_self_disable(void)
-{
- if (get_backlight_level() == 0)
- {
- breathing_halt = BREATHING_HALT_OFF;
- }
- else
- {
- breathing_halt = BREATHING_HALT_ON;
- }
-
- //backlight_set(get_backlight_level());
-}
-
-void breathing_toggle(void)
-{
- if (!is_breathing())
- {
- if (get_backlight_level() == 0)
- {
- breathing_index = 0;
- }
- else
- {
- // Set breathing_index to be at the midpoint + 1 (brightest point)
- breathing_index = 0x21 << breath_speed;
- }
-
- breathing_halt = BREATHING_NO_HALT;
- }
-
- // Toggle breathing interrupt
- TIMSK1 ^= _BV(OCIE1A);
-
- // Restore backlight level
- if (!is_breathing())
- {
- backlight_set(get_backlight_level());
- }
-}
-
-bool is_breathing(void)
-{
- return (TIMSK1 && _BV(OCIE1A));
-}
-
-void breathing_intensity_default(void)
-{
- //breath_intensity = (uint8_t)((uint16_t)100 * (uint16_t)get_backlight_level() / (uint16_t)BACKLIGHT_LEVELS);
- breath_intensity = ((BACKLIGHT_LEVELS - get_backlight_level()) * ((BACKLIGHT_LEVELS + 1) / 2));
-}
-
-void breathing_intensity_set(uint8_t value)
-{
- breath_intensity = value;
-}
-
-void breathing_speed_default(void)
-{
- breath_speed = 4;
-}
-
-void breathing_speed_set(uint8_t value)
-{
- bool is_breathing_now = is_breathing();
- uint8_t old_breath_speed = breath_speed;
-
- if (is_breathing_now)
- {
- // Disable breathing interrupt
- TIMSK1 &= ~_BV(OCIE1A);
- }
-
- breath_speed = value;
-
- if (is_breathing_now)
- {
- // Adjust index to account for new speed
- breathing_index = (( (uint8_t)( (breathing_index) >> old_breath_speed ) ) & 0x3F) << breath_speed;
-
- // Enable breathing interrupt
- TIMSK1 |= _BV(OCIE1A);
- }
-
-}
-
-void breathing_speed_inc(uint8_t value)
-{
- if ((uint16_t)(breath_speed - value) > 10 )
- {
- breathing_speed_set(0);
- }
- else
- {
- breathing_speed_set(breath_speed - value);
- }
-}
-
-void breathing_speed_dec(uint8_t value)
-{
- if ((uint16_t)(breath_speed + value) > 10 )
- {
- breathing_speed_set(10);
- }
- else
- {
- breathing_speed_set(breath_speed + value);
- }
-}
-
-void breathing_defaults(void)
-{
- breathing_intensity_default();
- breathing_speed_default();
- breathing_halt = BREATHING_NO_HALT;
-}
-
-/* Breathing Sleep LED brighness(PWM On period) table
- * (64[steps] * 4[duration]) / 64[PWM periods/s] = 4 second breath cycle
- *
- * http://www.wolframalpha.com/input/?i=%28sin%28+x%2F64*pi%29**8+*+255%2C+x%3D0+to+63
- * (0..63).each {|x| p ((sin(x/64.0*PI)**8)*255).to_i }
- */
-static const uint8_t breathing_table[64] PROGMEM = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 6, 10,
- 15, 23, 32, 44, 58, 74, 93, 113, 135, 157, 179, 199, 218, 233, 245, 252,
-255, 252, 245, 233, 218, 199, 179, 157, 135, 113, 93, 74, 58, 44, 32, 23,
- 15, 10, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-ISR(TIMER1_COMPA_vect)
-{
- // CHANNEL = (pgm_read_byte(&breathing_table[ ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F ] )) * breath_intensity;
-
-
- uint8_t local_index = ( (uint8_t)( (breathing_index++) >> breath_speed ) ) & 0x3F;
-
- if (((breathing_halt == BREATHING_HALT_ON) && (local_index == 0x20)) || ((breathing_halt == BREATHING_HALT_OFF) && (local_index == 0x3F)))
- {
- // Disable breathing interrupt
- TIMSK1 &= ~_BV(OCIE1A);
- }
-
- CHANNEL = (uint16_t)(((uint16_t)pgm_read_byte(&breathing_table[local_index]) * 257)) >> breath_intensity;
-
-}
-
-
-
-#endif \ No newline at end of file
+} \ No newline at end of file
diff --git a/keyboards/atomic/atomic.h b/keyboards/atomic/atomic.h
index 901761f514..88e11fadff 100644
--- a/keyboards/atomic/atomic.h
+++ b/keyboards/atomic/atomic.h
@@ -24,26 +24,4 @@
{ K40, K41, KC_NO, K43, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D, K4E } \
}
-void matrix_init_user(void);
-void matrix_scan_user(void);
-bool process_action_user(keyrecord_t *record);
-void led_set_user(uint8_t usb_led);
-void backlight_init_ports(void);
-
-void breathing_enable(void);
-void breathing_pulse(void);
-void breathing_disable(void);
-void breathing_self_disable(void);
-void breathing_toggle(void);
-bool is_breathing(void);
-
-
-void breathing_defaults(void);
-void breathing_intensity_default(void);
-void breathing_speed_default(void);
-void breathing_speed_set(uint8_t value);
-void breathing_speed_inc(uint8_t value);
-void breathing_speed_dec(uint8_t value);
-
-
#endif \ No newline at end of file
diff --git a/keyboards/atomic/config.h b/keyboards/atomic/config.h
index bf9550e948..9c40f54e78 100644
--- a/keyboards/atomic/config.h
+++ b/keyboards/atomic/config.h
@@ -46,6 +46,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7, D3, D2, D1 }
#define UNUSED_PINS
+#define BACKLIGHT_PIN B7
+
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/atomic/keymaps/default/compiled.hex b/keyboards/atomic/keymaps/default/compiled.hex
deleted file mode 100644
index b9bb143ea8..0000000000
--- a/keyboards/atomic/keymaps/default/compiled.hex
+++ /dev/null
@@ -1,1118 +0,0 @@
-:100000000C942A030C946E030C946E030C946E03F0
-:100010000C946E030C946E030C946E030C946E039C
-:100020000C946E030C946E030C946A0D0C943C0EAD
-:100030000C94531B0C946E030C946E030C946E037F
-:100040000C946E030C94D6030C946E030C946E0304
-:100050000C946E030C94BB1B0C946E030C946E03F7
-:100060000C946E030C946E030C946E030C946E034C
-:100070000C946E030C946E030C946E030C946E033C
-:100080000C946E030C946E030C946E030C946E032C
-:100090000C946E030C946E030C946E030C946E031C
-:1000A0000C946E030C946E030C946E03A90ECB0E8D
-:1000B000B90FCB0EB90F100F330FB90F880F9B0F6D
-:1000C00085128512B412B412F31213136914691451
-:1000D0001E136914CE13CE1335143E146914631421
-:1000E000DB13DB13DB13DB13DB13DB13DB13DB13A0
-:1000F000DB13DB13DB13DB13DB13DB13DB13DB1390
-:10010000EB13F91300140714111400000000000091
-:100110000000000000010204060A0F17202C3A4AD2
-:100120005D71879DB3C7DAE9F5FCFFFCF5E9DAC735
-:10013000B39D87715D4A3A2C20170F0A060402010D
-:100140000000000000000000000035001E001F003D
-:100150002000210022002300240025002600270083
-:100160002D002E002A002A002B0014001A0008007F
-:10017000150017001C0018000C00120013002F00BF
-:10018000300031004C00290004001600070009006F
-:100190000A000B000D000E000F0033003400280091
-:1001A00028004B00E1001D001B000600190005009F
-:1001B00011001000360037003800E500E50052005D
-:1001C0004E000030E000E200E30004512C002C005F
-:1001D0000351E700E600E4000551500051004F00D4
-:1001E00035001E001F0020002100220023002400F3
-:1001F0002500260027002D002E002A002A002B00B3
-:1002000014001A00090013000A000D000F00180066
-:100210001C0033002F00300031004C002900040086
-:1002200015001600170007000B00110008000C0055
-:1002300012003400280028004B00E1001D001B00C4
-:100240000600190005000E001000360037003800C7
-:10025000E500E50052004E000030E000E200E3005F
-:1002600004512C002C000351E700E600E400055186
-:10027000500051004F0035001E001F0020002100DB
-:100280002200230024002500260027002D002E0038
-:100290002A002A002B0034003600370013001C000F
-:1002A00009000A00060015000F002F003000310081
-:1002B0004C00290004001200080018000C00070080
-:1002C0000B001700110016003800280028004B0012
-:1002D000E100330014000D000E001B0005001000AB
-:1002E0001A0019001D00E500E50052004E00003024
-:1002F000E000E200E30004512C002C000351E70071
-:10030000E600E4000551500051004F0001003A00A2
-:100310003B003C003D003E003F00400041004200E9
-:100320004300440045000100010001001E021F02BD
-:100330002002210222022302240225022602270291
-:10034000010001000100490001003A003B003C00AF
-:100350003D003E003F002D022E022F0230023102EE
-:100360000100010001000100400041004200430083
-:1003700044004500010001000100010001000100EE
-:100380000100010001000100010001000100010065
-:100390000100010001000100010001000100010055
-:1003A000010001003A003B003C003D003E003F00E0
-:1003B00040004100420043004400450001000100AC
-:1003C00001001E001F002000210022002300240045
-:1003D000250026002700010001000100490001005E
-:1003E0003A003B003C003D003E003F002D002E0047
-:1003F0002F00300031000100010001000100400029
-:10040000410042004300440045000100010001009A
-:1004100001000100010001000100010001000100D4
-:1004200001000100010001000100010001000100C4
-:10043000010001000100010053003A003B003C00B4
-:100440003D003E003F0040004100420043004400A8
-:100450004500010001004700680069006A006B0068
-:100460006C006D006E006F00700071007200730010
-:10047000480046003900F800F700F600F500FD00DE
-:10048000FF00AB00AA00A900AE00010001000100BE
-:10049000F900010001000052015202520100010066
-:1004A000010001000100010001000100F000FA005C
-:1004B00001000100010001000100F400F40001004E
-:1004C0000100010001000100F200F100F300280327
-:1004D0005400680065002000410074006F006D004A
-:1004E0006900630020004B006500790062006F0026
-:1004F00061007200640000002C034F007200740061
-:1005000068006F006C0069006E0065006100720099
-:1005100020004B006500790062006F0061007200EE
-:10052000640073000000040309040902540003017D
-:1005300000A0FA09040000010301010009211101D2
-:1005400000012240000705810308000A0904010098
-:100550000103010200092111010001224D000705DC
-:10056000820308000A0904020001030000000921B7
-:10057000110100012236000705830308000A120159
-:10058000100100000008EDFE6060010001020001A2
-:1005900005010980A101850216010026B7001A0194
-:1005A000002AB700751095018100C0050C0901A152
-:1005B000018503160100269C021A01002A9C02757F
-:1005C0001095018100C005010902A1010901A100E6
-:1005D00005091901290515002501950575018102F7
-:1005E0009501750381010501093009311581257FC8
-:1005F00095027508810609381581257F95017508D2
-:100600008106050C0A38021581257F950175088140
-:1006100006C0C005010906A101050719E029E71573
-:100620000025019508750181029501750881010574
-:100630000819012905950575019102950175039128
-:10064000010507190029FF150026FF00950675080A
-:100650008100C00011241FBECFEFDAE0DEBFCDBFA6
-:1006600004B603FE24C08091F0019091F101A091A5
-:10067000F201B091F3018730904BA740B04BB9F431
-:100680001092F0011092F1011092F2011092F30118
-:1006900014BE84B7877F84BF88E10FB6F894809337
-:1006A0006000109260000FBEE0E0F8E3099511E0F1
-:1006B000A0E0B1E0EEE7F5E402C005900D92A234AF
-:1006C000B107D9F711E0A2E4B1E001C01D92A03F4B
-:1006D000B107E1F70E94B40A0C94BD220C9400000B
-:1006E0000895089581E0089508950C9471030C9481
-:1006F00072030C9474030E94332123E030E0281B22
-:100700003109220F209346010895282F2F988091B8
-:100710008000211108C0877F8093800010928D0097
-:1007200010928C001BC0886080938000233018F0EA
-:100730008FEF9FEF0FC083E090E0821B9109880F3D
-:10074000991F2FEF3FEFA90102C0569547958A9553
-:10075000E2F7CA0190938D0080938C000C947B0388
-:100760000E947B0384E0809345011092420108952A
-:10077000279A2F988FEF9FEF9093870080938600A2
-:100780008AE08093800089E1809381000E949C2010
-:100790000C94B00385B7806885BF85B7806885BF36
-:1007A0000E94B8036E9A769A0C9470031F920F926F
-:1007B0000FB60F9211242F933F938F939F93EF9334
-:1007C000FF93E0914301F0914401CF010196909392
-:1007D0004401809343010090450102C0F695E795DE
-:1007E0000A94E2F7EF7380914201823019F4E0320B
-:1007F00051F404C0813039F4EF3329F480916F0053
-:100800008D7F80936F00F0E0E65FFE4FE49121E082
-:1008100031E0E29FC001E39F900D1124009046015A
-:1008200002C0969587950A94E2F790938D00809385
-:100830008C00FF91EF919F918F913F912F910F909D
-:100840000FBE0F901F90189561110DC0FC018281A1
-:10085000882331F085EE0E9429110E94F32003C005
-:1008600085EE0E94F11180E090E0089581E0089506
-:100870000C94360408950F931F93CF93DF938C014C
-:10088000FC01C081D181CE010E94CD19BE010E9420
-:100890006C07EC01B8010E943804882309F470C188
-:1008A000F8018281882309F45BC080915201811193
-:1008B0001FC0C431F0E7DF0709F00AC10E943A0403
-:1008C00081E0809352010E94851B90935101809397
-:1008D00050011092490110924B0110924A0110925E
-:1008E0004D0110924C0110924F0110924E0148C1DF
-:1008F00080915001909151010E94911B883C91057B
-:1009000070F480914901E82FF0E0EE0FFF1FE65BE5
-:10091000FE4FD183C0838F5F8093490131C1C431C1
-:1009200020E7D20708F024C1C23080E7D80710F5CD
-:10093000C11590E7D90709F0DAC0F8018281882350
-:1009400009F4BFC00E94D414FFEF24E38CE0F150FF
-:1009500020408040E1F700C000000E94E01B10C171
-:10096000C431F0E7DF0708F0CFC0C23020E7D2077C
-:1009700008F49BC0F8018281882309F4A2C00E9478
-:100980003A1C811102C00E941B1C0E944D1C90E069
-:100990009093E1018093E001C230F0E7DF0721F49A
-:1009A0008091E00181607AC0C33020E7D20721F452
-:1009B0008091E001826072C0C43080E7D80721F4E2
-:1009C0008091E00184606AC0C53090E7D90719F4CE
-:1009D0008091E00127C0C630E0E7DE0721F4809176
-:1009E000E00180615BC0C730F0E7DF0721F4809150
-:1009F000E001806253C0C83020E7D20721F4809123
-:100A0000E00180644BC0C93080E7D80721F48091B1
-:100A1000E001806843C0CA3090E7D90729F480918B
-:100A2000E001846088603AC0CB30E0E7DE0721F463
-:100A30008091E0018E7F32C0CC30F0E7DF0721F4F7
-:100A40008091E0018D7F2AC0CD3020E7D20721F4CC
-:100A50008091E0018B7F22C0CE3080E7D80719F467
-:100A60008091E0011AC08091E001CF3090E7D90772
-:100A700011F48F7E13C0C031E0E7DE0711F48F7DE3
-:100A80000DC0C131F0E7DF0711F48F7B07C0C23121
-:100A9000D04711F48F7702C08B7F877F8093E0016E
-:100AA0008091E0010E94511C6BC0C11580E7D807FE
-:100AB00041F0C130D047F1F081E08093470180934D
-:100AC0004801C801DF91CF911F910F910C947703DA
-:100AD000C43120E7D20708F04BC0C23080E7D80706
-:100AE00008F048CFC11590E7D90709F42BCFC130E2
-:100AF000D04711F7F8018281882319F38091CF0143
-:100B000081608093CF013CC0C333E0E7DE07A1F4EE
-:100B1000F8018281882321F01092470182E017C0FA
-:100B200080914701811106C086E20E94291186E268
-:100B30000E94F11182E019C0C433D04709F0BCCF44
-:100B4000F8018281882331F01092480180E20E94EE
-:100B5000401216C080914801811106C087E20E94B0
-:100B6000291187E20E94F11180E20E94471208C019
-:100B7000C333F0E7DF0761F2C433D04709F39CCFFA
-:100B800080E0DF91CF911F910F9108950C94CA03DB
-:100B90000C9475032FE0729FF00111243BE4839FB6
-:100BA000E00DF11D1124E60FF11DEE0FFF1FE65BB6
-:100BB000FE4F859194910E947E07811540E5940730
-:100BC00008F047C0811520E4920708F013C1883E61
-:100BD000910520F5803E910508F07CC1883A910589
-:100BE00078F4853A910508F0A5C08130910509F4A3
-:100BF00071C108F42EC18430910508F06BC129C180
-:100C00008B3B910508F4A1C0803C910508F421C1FB
-:100C1000FC01EE0FFF1FE653F040E6C0811530E205
-:100C2000930758F4811541E0940708F053C1803FC1
-:100C3000910508F40EC190650895811520E392078F
-:100C400008F0D5C0FC01FF70EE0FFF1FE65BFE4F02
-:100C5000CBC0811535E5930708F043C0811544E505
-:100C6000940708F0DEC0811522E5920708F581158A
-:100C700031E5930708F0C1C0482F437021E030E010
-:100C800002C0220F331F4A95E2F73C68AC0164E0D2
-:100C9000569547956A95E1F74370342B8F7086958A
-:100CA000869540E2849FC0011124822B932B0895E6
-:100CB000282F26952695AC0143705527811593451D
-:100CC00008F0A0C080E2289F9001112481E090E00C
-:100CD00002C0880F991F4A95E2F7822B932B9C68DC
-:100CE00008958F3240E7940790F48F3120E7920700
-:100CF00008F0A2C0811536E5930708F497C09C015F
-:100D000030562115304108F0A4C09F7093C0803345
-:100D100020E7920709F497C008F492C0813340E7B6
-:100D2000940709F493C08233904709F092C080E0A1
-:100D300093ED0895853A910509F48EC0863A9105A0
-:100D400009F08DC082E890E40895883A910509F48D
-:100D500089C0893A910509F488C08A3A910509F455
-:100D600087C08B3A910509F486C08C3A910509F445
-:100D700085C08D3A910509F484C0803B910509F442
-:100D800083C08E3A910509F482C08F3A910509F427
-:100D900081C0813B910509F480C0823B910509F433
-:100DA0007FC0833B910509F47EC0843B910509F423
-:100DB0007DC0853B910509F47CC0863B910509F413
-:100DC0007BC0873B910509F47AC0883B910509F403
-:100DD00079C0893B910509F478C08A3B910509F4F3
-:100DE00077C080E094E408958591949108959927BF
-:100DF000906C08959F70906A0895982F8827816F4E
-:100E0000906A089590E2299F9001112481E090E07A
-:100E100002C0880F991F4A95E2F7822B932B9A689C
-:100E20000895982F8827846F906A08958F71992765
-:100E3000982F8827906208958F519047946D089558
-:100E400080E091ED089580E090ED089580E092EDCE
-:100E5000089580E090E0089581E890E4089583E8A3
-:100E600090E4089582EE94E4089589EE94E4089560
-:100E70008AEE94E4089585EB94E4089586EB94E477
-:100E8000089587EB94E408958CEC94E408958DEC38
-:100E900094E4089583E895E408958AE895E4089534
-:100EA00082E995E4089584E995E4089581E296E461
-:100EB000089583E296E4089584E296E4089585E235
-:100EC00096E4089586E296E4089587E296E408950C
-:100ED0008AE296E4089508959FE0799FF001112435
-:100EE0009BE4899FE00DF11D1124E60FF11DEE0F2B
-:100EF000FF1FE65BFE4F859194910895823891051E
-:100F000049F1B0F48133910509F458C048F48932AD
-:100F1000910509F44EC08A32910509F454C0089530
-:100F20008533910509F440C08933910599F00895FE
-:100F3000833E910529F138F4803E910591F0823E7F
-:100F40009105A1F00895863E9105F9F0873E91053F
-:100F500031F108952091E00120FD3AC021FD38C013
-:100F600008958091E00180FD35C032C08091E0019C
-:100F700082FF32C08091E00184FD30C083EE39C031
-:100F80008091E00182FD28C0F5CF8091E00183FFD0
-:100F900027C08091E00184FD21C087EE2AC08091A6
-:100FA000E00183FD1DC0F5CF8091E00185FD1AC0F1
-:100FB0001BC08091E00185FD17C014C08091E00145
-:100FC00086FD14C015C08091E00186FD11C00EC0E1
-:100FD00080EE0FC089E30DC082EE0BC080E009C037
-:100FE00086EE07C089E205C085E303C08AE201C03E
-:100FF00081E390E008950C947903E82FF0E0ED5D33
-:10100000FE4F8081E82FEF70F0E082958F7021E035
-:1010100030E0A90102C0440F551F8A95E2F740A3B2
-:1010200008950F931F93CF93DF93C4E0D0E001E0C6
-:1010300010E0FE01ED5DFE4F8081E82FEF70F0E0E3
-:1010400021A182958F70A80102C0440F551F8A9577
-:10105000E2F7CA01822B81A38C2F0E94FD07219702
-:1010600040F78EE090E061E070E0FC01EC5EFE4F46
-:101070002081E22FEF70F0E042A122952F70DB017A
-:1010800002C0AA0FBB1F2A95E2F79D01242B22A3C1
-:10109000019758F7DF91CF911F910F9108950F930A
-:1010A0001F93CF93DF9385B7806885BF85B780682E
-:1010B00085BFC4E0D0E001E010E0FE01ED5DFE4F31
-:1010C0008081E82FEF70F0E021A182958F70A80158
-:1010D00002C0440F551F8A95E2F7CA01822B81A3F3
-:1010E0008C2F0E94FD07219740F78EE090E061E091
-:1010F00070E0FC01EC5EFE4F2081E22FEF70F0E02B
-:1011000042A122952F70DB0102C0AA0FBB1F2A95B6
-:10111000E2F79D01242B22A3019758F7DF91CF918D
-:101120001F910F910C94C605EF92FF920F931F939E
-:10113000CF93DF930DE511E0C4E0EE24E394F12CAE
-:10114000D5E08C2F0E94FD078EE090E040E050E05B
-:10115000FC01EC5EFE4F6081E62FEF70F0E020A115
-:1011600030E062956F7002C0359527956A95E2F779
-:1011700020FD09C09701082E02C0220F331F0A94D8
-:10118000E2F7422B532B019718F7F80192918291C5
-:101190008F018417950721F051834083D09300017C
-:1011A0008C2F0E94FD07C15060F68091000187FDE1
-:1011B0001FC08150809300018F3F39F08FE99FE07D
-:1011C0000197F1F700C0000013C080E090E0FC013F
-:1011D000E35AFE4FDC01AD5ABE4F18962D913C915B
-:1011E0001997318720870297863FEFEF9E0779F79F
-:1011F0000E94C80581E0DF91CF911F910F91FF9070
-:10120000EF900895E82FF0E0EE0FFF1FE35AFE4F36
-:1012100080819181089508950F931F93CF9307E6DE
-:1012200011E0C0E0F801929182918F010E94FE1AB4
-:10123000C80FF1E00D351F07A9F78C2FCF911F9133
-:101240000F91089580916F010895CF93DF9300D09F
-:101250001F92CDB7DEB79C018091E601843019F56D
-:1012600093E099833B832A839093E9008FEF9091D9
-:10127000E800815095FD06C095ED9A95F1F70000C4
-:101280008111F5CF8091E80085FF0DC040E050E06E
-:1012900063E070E0CE0101960E945A0B8091E80055
-:1012A0008E778093E8000F900F900F90DF91CF9191
-:1012B0000895CF93DF9300D01F92CDB7DEB7209172
-:1012C000E601243021F522E029839B838A8383E091
-:1012D0008093E9008FEF9091E800815095FD06C062
-:1012E00095ED9A95F1F700008111F5CF8091E80016
-:1012F00085FF0DC040E050E063E070E0CE01019654
-:101300000E945A0B8091E8008E778093E8000F903E
-:101310000F900F90DF91CF9108952091E601243036
-:10132000F1F422E02093E9002FEF3091E800215002
-:1013300035FD06C035ED3A95F1F700002111F5CFE6
-:101340002091E80025FF0BC040E050E065E070E030
-:101350000E945A0B8091E8008E778093E8000895F0
-:10136000CF93DF932091E601243039F521E02093DB
-:10137000E9002FEF3091E800215035FD06C035ED32
-:101380003A95F1F700002111F5CF2091E80025FFF3
-:1013900014C0EC0140E050E068E070E00E945A0B9D
-:1013A0008091E8008E778093E80088E0FE01A7E650
-:1013B000B1E001900D928A95E1F7DF91CF91089508
-:1013C0008091E501811109C00E94EF0C0E944C0D33
-:1013D0008091E20084608093E20008951092E5011C
-:1013E0000895089508950C94481B42E061EC81E053
-:1013F0000E94690C42E061EC82E00E94690C42E0CC
-:1014000061EC83E00C94690C8091E801833009F46D
-:1014100053C030F4813071F0823009F48CC00895EB
-:101420008A3009F478C08B3009F45EC0893009F045
-:101430009AC020C08091E701813A09F094C0809160
-:10144000E800877F8093E8008091EB019091EC01A8
-:10145000892B21F468E087E691E003C060E080E03A
-:1014600090E070E00E94A50B8091E8008B7780935C
-:10147000E80008958091E701813209F074C08091FD
-:10148000EB019091EC01892B09F06DC08091E8008F
-:10149000877F8093E8008091E80082FD05C08091FD
-:1014A000E6018111F8CF5FC08091F10080936F0158
-:1014B0008091E8008B7753C08091E701813A09F071
-:1014C00052C08091EB019091EC01892B09F04BC047
-:1014D0008091E800877F8093E8008091E80080FF9A
-:1014E000FCCF80910B0136C08091E7018132D9F5A4
-:1014F0008091EB019091EC01892BA9F58091E80096
-:10150000877F8093E8000E949E0C8091E901809380
-:101510000B010C94D4148091E701813221F5809164
-:10152000E800877F8093E8000E949E0C8091EA018A
-:101530008093700108958091E701813AA1F4809130
-:10154000E800877F8093E8008091E80080FFFCCF6F
-:10155000809170018093F1008091E8008E778093F4
-:10156000E8000C949E0C089584B7877F84BF88E1BF
-:101570000FB6F89480936000109260000FBE80E870
-:1015800080936100109261000E9441100E94EF0C54
-:101590000E944C0D8091E20084608093E200789478
-:1015A0000E94D20F0E94431081E091E00E94ED0F53
-:1015B0008091E601853069F40E940A1B8091E40164
-:1015C0008823B1F30E94371B882391F30E94440BB8
-:1015D000EFCF0E944B10ECCF292F3327233031055A
-:1015E000C9F064F42130310581F02230310509F071
-:1015F00043C084E590E02AE235E042C02132310563
-:10160000F1F02232310541F137C082E190E02EE75E
-:1016100035E036C099278130910541F0823091053F
-:1016200041F0892B49F5E6E2F5E005C0E8EFF4E08A
-:1016300002C0EEECF4E0849190E09F0121C06330A1
-:10164000D8F4E62FF0E0EE0FFF1FEF5CFE4F208195
-:10165000318189E090E014C0633070F470E0FB01E8
-:10166000EE0FFF1FE55DFE4F20813181FB01E85D3C
-:10167000FE4F808190E004C080E090E020E030E008
-:10168000FA0131832083089580E189BD82E189BD1B
-:1016900009B400FEFDCF8091D8008F7D8093D800E3
-:1016A0008091E00082608093E0008091E00081FD05
-:1016B000FCCF0895CF92DF92EF92FF920F931F938A
-:1016C000CF93DF93EC018B016A010E94BD0C811165
-:1016D00033C0C114D10439F0F60180819181081B17
-:1016E000190BC80FD91FE12CF12C0115110519F1A7
-:1016F0008091E80085FD16C08091E8008E77809388
-:10170000E800C114D10449F0F60180819181E80E0E
-:10171000F91EF182E08285E00FC00E94BD0C882393
-:1017200021F30AC089918093F10001501109FFEF64
-:10173000EF1AFF0ADACF80E0DF91CF911F910F916E
-:10174000FF90EF90DF90CF9008952091ED013091C0
-:10175000EE012617370748F06115710539F420911D
-:10176000E8002E772093E80001C0B90140E0611540
-:101770007105A9F12091E601222309F443C0253027
-:1017800009F442C02091E80023FD40C02091E80008
-:1017900022FD32C02091E80020FFE9CF4091F30004
-:1017A0002091F20030E0342BFC01CF01611571056E
-:1017B00059F02830310540F481918093F100615057
-:1017C00071092F5F3F4FF1CF41E02830310509F01B
-:1017D00040E02091E8002E772093E800C8CF411127
-:1017E000C9CF0AC08091E601882361F0853061F09D
-:1017F0008091E80083FD0AC08091E80082FFF2CF6B
-:1018000080E0089582E0089583E0089581E00895DE
-:101810002091ED013091EE012617370748F0611550
-:10182000710539F42091E8002E772093E80001C07B
-:10183000B901FC0120E06115710591F18091E6018B
-:10184000882309F440C0853009F43FC08091E80046
-:1018500083FD3DC08091E80082FD2FC08091E800AB
-:1018600080FFE9CF2091F3008091F20090E0922B6D
-:101870006115710559F08830910540F42491209349
-:10188000F1003196615071090196F2CF21E008977D
-:1018900009F020E08091E8008E778093E800CBCFBC
-:1018A0002111CCCF0AC08091E601882361F08530F8
-:1018B00061F08091E80083FD0AC08091E80082FF1A
-:1018C000F2CF80E0089582E0089583E0089581E0FA
-:1018D0000895982F973058F59093E900981739F0AC
-:1018E0007091EC002091ED005091F00003C0242F86
-:1018F000762F50E021FF19C03091EB003E7F3093EE
-:10190000EB003091ED003D7F3093ED003091EB0026
-:1019100031603093EB007093EC002093ED00509316
-:10192000F0002091EE0027FF07C09F5FD3CF8F709C
-:101930008093E90081E0089580E008958091E701B7
-:1019400087FF11C08091E80082FD05C08091E6010B
-:101950008111F8CF11C08091E8008B770BC0809186
-:10196000E601882349F08091E80080FFF8CF80915C
-:10197000E8008E778093E80008952091E40030918C
-:10198000E50095E64091EC00842F817040FF22C075
-:101990008091E80080FD1CC08091E601882391F0D1
-:1019A000853091F08091EB0085FD10C04091E400FE
-:1019B0005091E5004217530729F39A01915011F70E
-:1019C00084E0089582E0089583E0089581E0089519
-:1019D00080E008954091E80042FFDECF08950E9424
-:1019E0005D0D0E94650DE0EEF0E0808181608083F6
-:1019F000E8EDF0E080818F77808319BCA7EDB0E03F
-:101A00008C918E7F8C9380818F7E80831092E501F4
-:101A100008950F931F93CF93DF930E945D0D0E9453
-:101A2000650DC8EDD0E088818F77888388818068D4
-:101A3000888388818F7D888319BC1092E60110927B
-:101A4000E2011092E4011092E30100EE10E0F801CF
-:101A500080818B7F808388818160888342E060E021
-:101A600080E00E94690CE1EEF0E080818E7F80834F
-:101A7000E2EEF0E0808181608083808188608083F5
-:101A8000F80180818E7F8083888180618883DF91E7
-:101A9000CF911F910F910895E8EDF0E080818F7E46
-:101AA0008083E7EDF0E080818160808384E082BF05
-:101AB00081E08093E5010C94090DE8EDF0E0808170
-:101AC0008E7F80831092E20008951092DA001092C7
-:101AD000E10008951F920F920FB60F9211242F93D9
-:101AE0003F934F935F936F937F938F939F93AF93A6
-:101AF000BF93EF93FF938091E10082FF0BC0809131
-:101B0000E20082FF07C08091E1008B7F8093E100BB
-:101B10000E94D10F8091DA0080FF1FC08091D80011
-:101B200080FF1BC08091DA008E7F8093DA00809165
-:101B3000D90080FF0DC080E189BD82E189BD09B473
-:101B400000FEFDCF81E08093E6010E94E00905C020
-:101B500019BC1092E6010E94EE098091E10080FF1D
-:101B600019C08091E20080FF15C08091E2008E7F55
-:101B70008093E2008091E20080618093E200809196
-:101B8000D80080628093D80019BC85E08093E6017C
-:101B90000E94F2098091E10084FF30C08091E20050
-:101BA00084FF2CC080E189BD82E189BD09B400FEBB
-:101BB000FDCF8091D8008F7D8093D8008091E10087
-:101BC0008F7E8093E1008091E2008F7E8093E2001F
-:101BD0008091E20081608093E2008091E20188239D
-:101BE00011F084E007C08091E30087FD02C081E02E
-:101BF00001C083E08093E6010E94F3098091E10037
-:101C000083FF29C08091E20083FF25C08091E1001D
-:101C1000877F8093E10082E08093E6011092E201E9
-:101C20008091E1008E7F8093E1008091E2008E7FC1
-:101C30008093E2008091E20080618093E20042E0C4
-:101C400060E080E00E94690C8091F00088608093E1
-:101C5000F0000E94F109FF91EF91BF91AF919F9128
-:101C60008F917F916F915F914F913F912F910F9045
-:101C70000FBE0F901F9018951F920F920FB60F92E4
-:101C800011242F933F934F935F936F937F938F9381
-:101C90009F93AF93BF93CF93DF93EF93FF93C09145
-:101CA000E900CF708091EC00D82FD17080FDD0E892
-:101CB0001092E9008091F000877F8093F000789483
-:101CC0000E94800E1092E9008091F000886080935D
-:101CD000F000CD2BCF70C093E900FF91EF91DF9121
-:101CE000CF91BF91AF919F918F917F916F915F91B4
-:101CF0004F913F912F910F900FBE0F901F9018950D
-:101D00001F93CF93DF93CDB7DEB7AA970FB6F894A2
-:101D1000DEBF0FBECDBFE7EEF1E088E08E0F909101
-:101D2000F10091938E13FBCF0E94040A8091E8008A
-:101D300083FF1FC18091E7019091E801492F50E096
-:101D40004A30510508F015C1FA01EA5AFF4F0C94C8
-:101D50006D22803881F0823809F00BC18091EB014F
-:101D60008F708093E9008091EB0085FB882780F9D4
-:101D70001092E90006C08091E3019091E401911175
-:101D800082609091E800977F9093E8008093F10043
-:101D90001092F100C8C0282F2D7F09F0EAC08823D7
-:101DA00019F0823061F0E5C08091E901813009F0DD
-:101DB000E0C0933009F080E08093E4012BC0809173
-:101DC000E901811127C08091EB018F7009F4D1C026
-:101DD0008093E9002091EB0020FF1CC0933021F498
-:101DE0008091EB00806214C09091EB009061909321
-:101DF000EB0021E030E0A90102C0440F551F8A9595
-:101E0000E2F74093EA001092EA008091EB008860CC
-:101E10008093EB001092E9008091E800877F86C0F4
-:101E20008111A7C01091E9011F778091E3008078AC
-:101E3000812B8093E3008091E800877F8093E80006
-:101E40000E949E0C8091E80080FFFCCF8091E3000F
-:101E500080688093E300111102C082E001C083E03A
-:101E60008093E60186C08058823008F082C080915D
-:101E7000E9019091EA018C3D53E0950779F583E003
-:101E80008A838AE289834FB7F894DE01139620E0B3
-:101E90003EE051E2E32FF0E050935700E49120FF41
-:101EA00003C0E295EF703F5FEF708E2F90E0EA3055
-:101EB00010F0C79601C0C0968D939D932F5F24317B
-:101EC00049F74FBF8091E800877F8093E8006AE27E
-:101ED00070E0CE0101960E94A50B14C0AE014F5FC9
-:101EE0005F4F6091EB010E94EC0ABC01009709F47E
-:101EF00040C09091E800977F9093E80089819A8193
-:101F00000E94080C8091E8008B778093E80031C034
-:101F1000803879F58091E800877F8093E800809190
-:101F2000E2018093F1008091E8008E778093E800D1
-:101F30000E949E0C1EC081111CC09091E90192303C
-:101F4000C0F48091E800877F8093E8009093E201DD
-:101F50000E949E0C8091E201811106C08091E300F5
-:101F600087FD02C081E001C084E08093E6010E9409
-:101F7000F5098091E80083FF0AC08091E800877F1F
-:101F80008093E8008091EB0080628093EB00AA963A
-:101F90000FB6F894DEBF0FBECDBFDF91CF911F917A
-:101FA00008950895CF938091E6018823A1F0C09110
-:101FB000E900CF709091EC00892F817090FD80E84E
-:101FC000C82B1092E9008091E80083FD0E94800EEA
-:101FD000CF70C093E900CF910895909376018093DC
-:101FE00075010895E0917501F0917601309721F027
-:101FF0000190F081E02D099480E00895E091750151
-:10200000F0917601309721F00280F381E02D099460
-:102010000895E0917501F0917601309721F00480E8
-:10202000F581E02D09940895209173013091740198
-:102030008217930771F09093740180937301E0917C
-:102040007501F0917601309721F00680F781E02D3F
-:1020500009940895209171013091720182179307BC
-:1020600071F09093720180937101E0917501F0918C
-:102070007601309721F00084F185E02D09940895D0
-:1020800008950C9440100E947C1B0E944F080E94EF
-:10209000021C0C949C205F926F927F928F929F9271
-:1020A000AF92BF92CF92DF92EF92FF920F931F9366
-:1020B000CF93DF9300D000D01F92CDB7DEB70E9440
-:1020C000940892E8C92E91E0D92E04E010E0AA24E9
-:1020D000A394B12C502E802F0E9402094C01F601CE
-:1020E000729062906F016826792661147104A1F4E0
-:1020F0000150110978F78FEF89838A831B820E9430
-:10210000851B8160782F9D838C8349815A816B81E7
-:102110008D810E94FB1038C08091CF0181FD0E940B
-:102120000B092EE030E07501022E02C0EE0CFF1C00
-:102130000A94E2F7C70186219721892B09F12983A7
-:102140005A828E209F2091E0892809F490E09B8399
-:102150000E94851B8160782F9D838C8349815A81E1
-:102160006B818D810E94FB10000F111FF801E85850
-:10217000FE4F80819181E826F926F182E08204C039
-:102180002150310980F6B4CF0E94D91D10917701FA
-:102190000E94F20F1817D1F00E94F20F809377017E
-:1021A0000F900F900F900F900F90DF91CF911F9194
-:1021B0000F91FF90EF90DF90CF90BF90AF909F90E6
-:1021C0008F907F906F905F900C94FB070F900F9013
-:1021D0000F900F900F90DF91CF911F910F91FF9073
-:1021E000EF90DF90CF90BF90AF909F908F907F90B7
-:1021F0006F905F900895CF93DF93CDB7DEB72B97A5
-:102200000FB6F894DEBF0FBECDBF4F8358876987E6
-:102210007A878B87DE01119686E0FD0111928A95FF
-:10222000E9F785E0FE01379601900D928A95E1F776
-:1022300049815A816B817C818D819E810E947217B8
-:102240002B960FB6F894DEBF0FBECDBFDF91CF9