diff --git a/.gitmodules b/.gitmodules
index 6dced863b..0e7eb87be 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -10,3 +10,6 @@
[submodule "lib/agent"]
path = lib/agent
url = https://github.com/UltimateHackingKeyboard/agent.git
+[submodule "lib/SDK_2.8.0_MKL17Z32xxx4"]
+ path = lib/SDK_2.8.0_MKL17Z32xxx4
+ url = https://github.com/UltimateHackingKeyboard/SDK_2.8.0_MKL17Z32xxx4.git
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4b317d1e7..66f8290ca 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
+## [8.10.2] - 2020-09-21
+
+Device Protocol: 4.7.0 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
+
+- Migrate key cluster module MCU from MKL03Z32VFK4 to MKL17Z32VFM4.
+- Fix trackball module right button port.
+- Handle touchpad module single tap, two finger tap, and scroll events.
+
## [8.10.1] - 2020-06-21
Device Protocol: 4.7.0 | Module Protocol: 4.1.0 | User Config: 4.2.0 | Hardware Config: 1.0.0
diff --git a/keycluster/Makefile b/keycluster/Makefile
index c00f51e72..6d0662cb4 100644
--- a/keycluster/Makefile
+++ b/keycluster/Makefile
@@ -15,10 +15,10 @@
PROJECT_NAME = uhk_keycluster
# Defines the part type that this project uses.
-PART = MKL03Z32VFK4
+PART = MKL17Z32VFM4
# Defines the linker script to use for the application.
-LDSCRIPT = ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/gcc/MKL03Z32xxx4_flash.ld
+LDSCRIPT = ../lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/gcc/MKL17Z32xxx4_flash.ld
# Size of the heap and stack.
HEAP_SIZE = 0
@@ -36,22 +36,22 @@ JLINK_SCRIPT = ../scripts/flash-keycluster.jlink
# Source files.
SOURCE = $(wildcard src/*.c) \
- ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/system_MKL03Z4.c \
- ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/gcc/startup_MKL03Z4.S \
- ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_clock.c \
- ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_gpio.c \
- ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_i2c.c \
- ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_lptmr.c \
- ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_spi.c \
- ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_tpm.c \
+ ../lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/system_MKL17Z644.c \
+ ../lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/gcc/startup_MKL17Z644.S \
+ ../lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_clock.c \
+ ../lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_gpio.c \
+ ../lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_i2c.c \
+ ../lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_lptmr.c \
+ ../lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_spi.c \
+ ../lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_tpm.c \
$(wildcard ../shared/*.c) \
$(wildcard ../shared/module/*.c)
# Header files.
IPATH = src \
- ../lib/KSDK_2.0_MKL03Z8xxx4/CMSIS/Include \
- ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4 \
- ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers \
+ ../lib/SDK_2.8.0_MKL17Z32xxx4/CMSIS/Include \
+ ../lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644 \
+ ../lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers \
../shared
# Include main Makefile.
diff --git a/keycluster/build/.cproject b/keycluster/build/.cproject
index 848ac01d9..8b4795b1b 100644
--- a/keycluster/build/.cproject
+++ b/keycluster/build/.cproject
@@ -75,19 +75,19 @@
@@ -233,19 +233,19 @@
diff --git a/keycluster/build/.project b/keycluster/build/.project
index dcfc10fbb..c3fe68a7f 100644
--- a/keycluster/build/.project
+++ b/keycluster/build/.project
@@ -64,92 +64,92 @@
drivers/fsl_clock.c
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_clock.c
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_clock.c
drivers/fsl_clock.h
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_clock.h
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_clock.h
drivers/fsl_gpio.c
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_gpio.c
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_gpio.c
drivers/fsl_gpio.h
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_gpio.h
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_gpio.h
drivers/fsl_i2c.c
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_i2c.c
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_i2c.c
drivers/fsl_i2c.h
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_i2c.h
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_i2c.h
drivers/fsl_lptmr.c
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_lptmr.c
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_lptmr.c
drivers/fsl_lptmr.h
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_lptmr.h
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_lptmr.h
drivers/fsl_port.h
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_port.h
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_port.h
drivers/fsl_smc.c
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_smc.c
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_smc.c
drivers/fsl_smc.h
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_smc.h
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_smc.h
drivers/fsl_spi.c
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_spi.c
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_spi.c
drivers/fsl_spi.h
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_spi.h
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_spi.h
drivers/fsl_tpm.c
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_tpm.c
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_tpm.c
drivers/fsl_tpm.h
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_tpm.h
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/drivers/fsl_tpm.h
- startup/startup_MKL03Z4.S
+ startup/startup_MKL17Z644.S
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/gcc/startup_MKL03Z4.S
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/gcc/startup_MKL17Z644.S
- startup/system_MKL03Z4.c
+ startup/system_MKL17Z644.c
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/system_MKL03Z4.c
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/system_MKL17Z644.c
- startup/system_MKL03Z4.h
+ startup/system_MKL17Z644.h
1
- PARENT-2-PROJECT_LOC/lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/system_MKL03Z4.h
+ PARENT-2-PROJECT_LOC/lib/SDK_2.8.0_MKL17Z32xxx4/devices/MKL17Z644/system_MKL17Z644.h
diff --git a/keycluster/build/uhk-keycluster_debug_jlink.launch b/keycluster/build/uhk-keycluster_debug_jlink.launch
index 2c8182b88..df84ba17f 100644
--- a/keycluster/build/uhk-keycluster_debug_jlink.launch
+++ b/keycluster/build/uhk-keycluster_debug_jlink.launch
@@ -25,7 +25,7 @@
-
+
diff --git a/keycluster/build/uhk-keycluster_release_jlink.launch b/keycluster/build/uhk-keycluster_release_jlink.launch
index 86eaf8d5a..fc6b55036 100644
--- a/keycluster/build/uhk-keycluster_release_jlink.launch
+++ b/keycluster/build/uhk-keycluster_release_jlink.launch
@@ -25,7 +25,7 @@
-
+
diff --git a/keycluster/src/module.c b/keycluster/src/module.c
index 659a18843..eb3766f5d 100644
--- a/keycluster/src/module.c
+++ b/keycluster/src/module.c
@@ -2,41 +2,41 @@
#include "fsl_port.h"
#include "module.h"
-#define BLACKBERRY_TRACKBALL_LEFT_PORT PORTB
-#define BLACKBERRY_TRACKBALL_LEFT_GPIO GPIOB
-#define BLACKBERRY_TRACKBALL_LEFT_IRQ PORTB_IRQn
-#define BLACKBERRY_TRACKBALL_LEFT_CLOCK kCLOCK_PortB
-#define BLACKBERRY_TRACKBALL_LEFT_PIN 13
-
-#define BLACKBERRY_TRACKBALL_RIGHT_PORT PORTB
-#define BLACKBERRY_TRACKBALL_RIGHT_GPIO GPIOB
-#define BLACKBERRY_TRACKBALL_RIGHT_IRQ PORTB_IRQn
-#define BLACKBERRY_TRACKBALL_RIGHT_CLOCK kCLOCK_PortB
-#define BLACKBERRY_TRACKBALL_RIGHT_PIN 6
-
-#define BLACKBERRY_TRACKBALL_UP_PORT PORTA
-#define BLACKBERRY_TRACKBALL_UP_GPIO GPIOA
-#define BLACKBERRY_TRACKBALL_UP_IRQ PORTA_IRQn
-#define BLACKBERRY_TRACKBALL_UP_CLOCK kCLOCK_PortA
-#define BLACKBERRY_TRACKBALL_UP_PIN 3
-
-#define BLACKBERRY_TRACKBALL_DOWN_PORT PORTA
-#define BLACKBERRY_TRACKBALL_DOWN_GPIO GPIOA
-#define BLACKBERRY_TRACKBALL_DOWN_IRQ PORTA_IRQn
-#define BLACKBERRY_TRACKBALL_DOWN_CLOCK kCLOCK_PortA
-#define BLACKBERRY_TRACKBALL_DOWN_PIN 4
+#define BLACKBERRY_TRACKBALL_LEFT_PORT PORTE
+#define BLACKBERRY_TRACKBALL_LEFT_GPIO GPIOE
+#define BLACKBERRY_TRACKBALL_LEFT_IRQ PORTE_IRQn
+#define BLACKBERRY_TRACKBALL_LEFT_CLOCK kCLOCK_PortE
+#define BLACKBERRY_TRACKBALL_LEFT_PIN 0
+
+#define BLACKBERRY_TRACKBALL_RIGHT_PORT PORTE
+#define BLACKBERRY_TRACKBALL_RIGHT_GPIO GPIOE
+#define BLACKBERRY_TRACKBALL_RIGHT_IRQ PORTE_IRQn
+#define BLACKBERRY_TRACKBALL_RIGHT_CLOCK kCLOCK_PortE
+#define BLACKBERRY_TRACKBALL_RIGHT_PIN 17
+
+#define BLACKBERRY_TRACKBALL_UP_PORT PORTE
+#define BLACKBERRY_TRACKBALL_UP_GPIO GPIOE
+#define BLACKBERRY_TRACKBALL_UP_IRQ PORTE_IRQn
+#define BLACKBERRY_TRACKBALL_UP_CLOCK kCLOCK_PortE
+#define BLACKBERRY_TRACKBALL_UP_PIN 1
+
+#define BLACKBERRY_TRACKBALL_DOWN_PORT PORTE
+#define BLACKBERRY_TRACKBALL_DOWN_GPIO GPIOE
+#define BLACKBERRY_TRACKBALL_DOWN_IRQ PORTE_IRQn
+#define BLACKBERRY_TRACKBALL_DOWN_CLOCK kCLOCK_PortE
+#define BLACKBERRY_TRACKBALL_DOWN_PIN 16
pointer_delta_t PointerDelta;
key_vector_t keyVector = {
.itemNum = KEYBOARD_VECTOR_ITEMS_NUM,
.items = (key_vector_pin_t[]) {
- {PORTB, GPIOB, kCLOCK_PortB, 10}, // top key
- {PORTA, GPIOA, kCLOCK_PortA, 6}, // left key
- {PORTB, GPIOB, kCLOCK_PortB, 2}, // right key
- {PORTA, GPIOA, kCLOCK_PortA, 5}, // left microswitch
- {PORTB, GPIOB, kCLOCK_PortB, 7}, // trackball microswitch
- {PORTA, GPIOA, kCLOCK_PortA, 8}, // right microswitch
+ {PORTC, GPIOC, kCLOCK_PortC, 5}, // top key
+ {PORTC, GPIOC, kCLOCK_PortC, 6}, // left key
+ {PORTD, GPIOD, kCLOCK_PortD, 7}, // right key
+ {PORTC, GPIOC, kCLOCK_PortC, 7}, // left microswitch
+ {PORTA, GPIOA, kCLOCK_PortA, 19}, // trackball microswitch
+ {PORTD, GPIOD, kCLOCK_PortD, 6}, // right microswitch
},
};
@@ -59,6 +59,46 @@ void BlackberryTrackball_Init(void)
&(port_pin_config_t){.pullSelect=kPORT_PullUp, .mux=kPORT_MuxAsGpio});
}
+#define TPM_SOURCE_CLOCK (CLOCK_GetFreq(kCLOCK_McgIrc48MClk) / 4)
+
+tpm_channel_t tpmChannels[] = {
+ {.clock=kCLOCK_PortC, .port=PORTC, .pin=2U, .mux=kPORT_MuxAlt4, .tpmBase=TPM0, .chnlNumber=1U, .dutyCyclePercent=100},
+ {.clock=kCLOCK_PortC, .port=PORTC, .pin=3U, .mux=kPORT_MuxAlt4, .tpmBase=TPM0, .chnlNumber=2U, .dutyCyclePercent=100},
+ {.clock=kCLOCK_PortC, .port=PORTC, .pin=1U, .mux=kPORT_MuxAlt4, .tpmBase=TPM0, .chnlNumber=0U, .dutyCyclePercent=100},
+ {.clock=kCLOCK_PortD, .port=PORTD, .pin=4U, .mux=kPORT_MuxAlt4, .tpmBase=TPM0, .chnlNumber=4U, .dutyCyclePercent=100},
+ {.clock=kCLOCK_PortC, .port=PORTC, .pin=4U, .mux=kPORT_MuxAlt4, .tpmBase=TPM0, .chnlNumber=3U, .dutyCyclePercent=100},
+ {.clock=kCLOCK_PortD, .port=PORTD, .pin=5U, .mux=kPORT_MuxAlt4, .tpmBase=TPM0, .chnlNumber=5U, .dutyCyclePercent=100},
+ {.clock=kCLOCK_PortB, .port=PORTB, .pin=0U, .mux=kPORT_MuxAlt3, .tpmBase=TPM1, .chnlNumber=0U, .dutyCyclePercent=100},
+ {.clock=kCLOCK_PortB, .port=PORTB, .pin=1U, .mux=kPORT_MuxAlt3, .tpmBase=TPM1, .chnlNumber=1U, .dutyCyclePercent=100},
+ {.clock=kCLOCK_PortA, .port=PORTA, .pin=1U, .mux=kPORT_MuxAlt3, .tpmBase=TPM2, .chnlNumber=0U, .dutyCyclePercent=100},
+};
+
+void Tpm_Init(void)
+{
+ CLOCK_SetTpmClock(1U);
+
+ tpm_config_t tpmInfo;
+ TPM_GetDefaultConfig(&tpmInfo);
+ tpmInfo.prescale = kTPM_Prescale_Divide_4;
+
+ tpm_chnl_pwm_signal_param_t tpmParam;
+ tpmParam.level = kTPM_LowTrue;
+
+ uint8_t count = sizeof(tpmChannels) / sizeof(tpmChannels[0]);
+
+ for (uint8_t i=0; iwasMoveAction = isMoveAction;
}
+uint8_t touchpadScrollDivisor = 8;
+static void processTouchpadActions() {
+ ActiveUsbMouseReport->x += TouchpadEvents.x;
+ ActiveUsbMouseReport->y += TouchpadEvents.y;
+ TouchpadEvents.x = 0;
+ TouchpadEvents.y = 0;
+
+ uint8_t wheelXInteger = TouchpadEvents.wheelX / touchpadScrollDivisor;
+ if (wheelXInteger) {
+ ActiveUsbMouseReport->wheelX += wheelXInteger;
+ TouchpadEvents.wheelX = TouchpadEvents.wheelX % touchpadScrollDivisor;
+ }
+
+ uint8_t wheelYInteger = TouchpadEvents.wheelY / touchpadScrollDivisor;
+ if (wheelYInteger) {
+ ActiveUsbMouseReport->wheelY -= wheelYInteger;
+ TouchpadEvents.wheelY = TouchpadEvents.wheelY % touchpadScrollDivisor;
+ }
+
+
+ if (TouchpadEvents.singleTap) {
+ ActiveUsbMouseReport->buttons |= MouseButton_Left;
+ TouchpadEvents.singleTap = false;
+ }
+
+ if (TouchpadEvents.twoFingerTap) {
+ ActiveUsbMouseReport->buttons |= MouseButton_Right;
+ TouchpadEvents.twoFingerTap = false;
+ }
+
+ if (TouchpadEvents.tapAndHold) {
+ ActiveUsbMouseReport->buttons |= MouseButton_Left;
+ }
+}
+
void MouseController_ProcessMouseActions()
{
mouseElapsedTime = Timer_GetElapsedTimeAndSetCurrent(&mouseUsbReportUpdateTime);
@@ -223,10 +259,9 @@ void MouseController_ProcessMouseActions()
MouseScrollState.xOut = 0;
MouseScrollState.yOut = 0;
- ActiveUsbMouseReport->x += TouchpadUsbMouseReport.x;
- ActiveUsbMouseReport->y += TouchpadUsbMouseReport.y;
- TouchpadUsbMouseReport.x = 0;
- TouchpadUsbMouseReport.y = 0;
+ if (Slaves[SlaveId_RightTouchpad].isConnected) {
+ processTouchpadActions();
+ }
for (uint8_t moduleId=0; moduleIdisConnected = true;
- }
if (currentStatus != kStatus_Uhk_IdleCycle) {
previousSlaveId = currentSlaveId++;
diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c
index 9c393bb63..09e6fad21 100644
--- a/right/src/usb_report_updater.c
+++ b/right/src/usb_report_updater.c
@@ -121,6 +121,7 @@ static bool isStickyShortcut(key_action_t * action)
const uint8_t ctrl = HID_KEYBOARD_MODIFIER_LEFTCTRL | HID_KEYBOARD_MODIFIER_RIGHTCTRL;
switch(action->keystroke.scancode) {
+ case HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE:
case HID_KEYBOARD_SC_TAB:
case HID_KEYBOARD_SC_LEFT_ARROW:
case HID_KEYBOARD_SC_RIGHT_ARROW:
diff --git a/scripts/make-release.js b/scripts/make-release.js
index 6769e5c0d..4316cf516 100755
--- a/scripts/make-release.js
+++ b/scripts/make-release.js
@@ -29,8 +29,7 @@ for (sourcePath of sourcePaths) {
exec(`cd ${buildDir}/..; make clean; make -j8`);
}
-exec(`git pull origin master; git checkout master`, { cwd: agentDir });
-exec(`npm ci`, { cwd: agentDir });
+exec(`git pull origin master; git checkout master; npm ci; npm run build`, { cwd: agentDir });
for (const device of package.devices) {
const deviceDir = `${releaseDir}/devices/${device.name}`;
diff --git a/scripts/package.json b/scripts/package.json
index d4bf5126c..9e308faa3 100644
--- a/scripts/package.json
+++ b/scripts/package.json
@@ -16,7 +16,7 @@
"commander": "^2.11.0",
"shelljs": "^0.7.8"
},
- "firmwareVersion": "8.10.1",
+ "firmwareVersion": "8.10.2",
"deviceProtocolVersion": "4.7.0",
"moduleProtocolVersion": "4.1.0",
"userConfigVersion": "4.2.0",
diff --git a/shared/module/i2c.h b/shared/module/i2c.h
index 4d34f7cbf..e721926d8 100644
--- a/shared/module/i2c.h
+++ b/shared/module/i2c.h
@@ -6,6 +6,18 @@
#define I2C_BUS_BASEADDR I2C0
#define I2C_BUS_CLK_SRC I2C0_CLK_SRC
#define I2C_BUS_BAUD_RATE 100000 // 100 kHz works even with a 20 meter long bridge cable.
+
+#ifdef CPU_MKL17Z32VFM4
+ #define I2C_BUS_MUX kPORT_MuxAlt4
+
+ #define I2C_BUS_SDA_PORT PORTE
+ #define I2C_BUS_SDA_CLOCK kCLOCK_PortE
+ #define I2C_BUS_SDA_PIN 18
+
+ #define I2C_BUS_SCL_PORT PORTE
+ #define I2C_BUS_SCL_CLOCK kCLOCK_PortE
+ #define I2C_BUS_SCL_PIN 19
+#else
#define I2C_BUS_MUX kPORT_MuxAlt2
#define I2C_BUS_SDA_PORT PORTB
@@ -15,5 +27,6 @@
#define I2C_BUS_SCL_PORT PORTB
#define I2C_BUS_SCL_CLOCK kCLOCK_PortB
#define I2C_BUS_SCL_PIN 3
+#endif
#endif
diff --git a/shared/module/init_peripherals.c b/shared/module/init_peripherals.c
index 77c08a4f7..e05418546 100644
--- a/shared/module/init_peripherals.c
+++ b/shared/module/init_peripherals.c
@@ -65,7 +65,11 @@ void initI2c(void)
I2C_SlaveGetDefaultConfig(&slaveConfig);
slaveConfig.slaveAddress = I2C_ADDRESS_MODULE_FIRMWARE;
+#ifdef CPU_MKL17Z32VFM4
+ I2C_SlaveInit(I2C_BUS_BASEADDR, &slaveConfig, I2C_BUS_BAUD_RATE);
+#else
I2C_SlaveInit(I2C_BUS_BASEADDR, &slaveConfig);
+#endif
I2C_SlaveTransferCreateHandle(I2C_BUS_BASEADDR, &slaveHandle, i2cSlaveCallback, &userData);
I2C_SlaveTransferNonBlocking(I2C_BUS_BASEADDR, &slaveHandle, kI2C_SlaveAddressMatchEvent);
}
diff --git a/shared/module/led_pwm.c b/shared/module/led_pwm.c
index b1d5bcb16..7e201036d 100644
--- a/shared/module/led_pwm.c
+++ b/shared/module/led_pwm.c
@@ -25,6 +25,8 @@ void LedPwm_Init(void)
void LedPwm_SetBrightness(uint8_t brightnessPercent)
{
+#ifndef CPU_MKL17Z32VFM4
TPM_UpdatePwmDutycycle(LED_PWM_TPM_BASEADDR, LED_PWM_TPM_CHANNEL,
kTPM_EdgeAlignedPwm, 100 - brightnessPercent);
+#endif
}
diff --git a/shared/versions.h b/shared/versions.h
index 2399593ab..42157974a 100644
--- a/shared/versions.h
+++ b/shared/versions.h
@@ -20,7 +20,7 @@
#define FIRMWARE_MAJOR_VERSION 8
#define FIRMWARE_MINOR_VERSION 10
- #define FIRMWARE_PATCH_VERSION 1
+ #define FIRMWARE_PATCH_VERSION 2
#define DEVICE_PROTOCOL_MAJOR_VERSION 4
#define DEVICE_PROTOCOL_MINOR_VERSION 7
diff --git a/touchpad/IQS572_B000_58_15_2_2_UHK_SV0.0_BL.hex b/touchpad/IQS572_B000_58_15_2_2_UHK_SV0.0_BL.hex
new file mode 100644
index 000000000..0f979518d
--- /dev/null
+++ b/touchpad/IQS572_B000_58_15_2_2_UHK_SV0.0_BL.hex
@@ -0,0 +1,489 @@
+:20848000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC
+:2084A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC
+:2084C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC
+:2084E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C
+:20850000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000186A00000FFFF010249
+:0A8520000408000F4240000186A18C
+:20857300AE0FFF9490CE852AAE852CF62720A5602717BFEBEE03BFEEBEEBEE0190F6F75CF3
+:20859300905C90B3EE26F5BEEB1C000520DDAE00352002F75CA300F126F9AE01012002F7F5
+:2085B3005CA30B0426F9CDB9B020FE891305230572F00520051E0572F0015B02818952058E
+:2085D3009EAD7DEE491F047B07AD75EE491F017B06AD6D1601EF497B07AD651604EF497B20
+:2085F30006AD5DEE4B1F047B07AD55EE4B1F017B06AD4D1601EF4B7B07AD451604EF4B7B10
+:2086130006AD3DE6576B03897B09AD34E65785E7577B07AD2B7B03E7575F7B069758EE3EAD
+:208633001F045F7B0797587B06905F90979058EE3E90EF3E5F7B0797581604EF3E5B0781D2
+:2086530097A60F4281520CAEFFFF1F02C60441B14825690F0B205B0F0C203FCD87BC9093F9
+:2086730090EE4D905C272DEE4F897B0DCD87BCEE4D897B10CD87BCEE4B897B12CD87BCEED2
+:2086930049CD89665B061F047B0C2704130224081F0220027B0B6B060C0C7B0CC10A9A7B92
+:2086B3000B25B8110627097B06977B0B95CD85D00C0B7B0BC10A9A259E5B0C810F0C2077C4
+:2086D3000F0B206A7B0CCD87BC909390EE49905C274D7B0BCD87BCEE4F897B0DCD87BCEE20
+:2086F3004D897B10CD87BCEE4B897B12CD87BCEE49CD89665B061F047B0B260F1F0296CDE1
+:2087130087B61B0C24015C027F20211302241D1F0296CD87B61B0C24015C027B0B200C9696
+:20873300CD87B61B0C24015C02A6FFF70C0B7B0BC10A9A258F0C0C7B0CC10A9A25820F0B5B
+:2087530020570F0C204A96AD5A1B0C24015C02F6110B263A7B0B977B0C95CD85D096AD4370
+:208773001B0C24015C02F66B0196AD371B0C24015C0289961C00089F5E1B0D24015C02F6D5
+:2087930085F796AD1E1B0B24015C027B01F70C0C7B0CC10A9A25AF0C0B7B0BC10A9A25A22C
+:2087B300CC86CC1C00069F5E8197A60F428188521672050A6203CC88CDBE35CDBD51961C62
+:2087D300000DCDBCCA7B17CD88D3EE53CDBD58961C000DCDBB94BEE989BE37CDBD51961CBC
+:2087F300000BCDBCCA7B19CD88D3EE51CDBD58961C000BCDBB94BEE989BE35CDBD51961CA2
+:208813000009CDBCCA7B1BCD88D3EE4BCDBD58961C0009CDBB94BEE989BE37CDBD51961C87
+:208833000007CDBCCA7B1DCD88D3EE49CDBD58961C0007CDBB94BEE9CD89665B06C30A6923
+:208853002303CE0A691F155FC60A6897BFEB1E15B3EB24045F971F157B15977B16C00A6885
+:2088730024015ACDBD46961C000DCDBCCA4F974AC00A6724015ACDBA54961C000DCDBADFA4
+:20889300961C0011CDBCCAC60A6997C60A6AC00A6824015ACDBD46961C000DCDBCCA961C60
+:2088B3000011CDBB82961C000DCDBB94961C0011CDBCCA7B14CB0A672003C60A635B178185
+:2088D30097A60F4290CE0A9E818952101E17F6B7EA3FE93FE83FE7961C0005CDBCCA1E1507
+:2088F30090AE0100FECDBD58961C0005CDBA81961C000DCDBCCA1E11FECDBD58961C0009AB
+:20891300CDBCCA7B19B7EA3FE93FE83FE7961C0005CDBCCA961C0009CDBB82961C0005CDF4
+:20893300BADF965CCDBCCAA601974F101924015ACDBA54961C000DCDBADF965CCDBA819681
+:208953001C000DCDBCCA1E15160DFF1E177B0FF75B12818952081E0F891E0BCD85BE5B0260
+:208973001F031E11891E0FCD85BE5B021F071E03130723041F05200A1E071F051E031F070A
+:208993001E055413071E05242454541F011E055472FB0113071E07250254545454541F01F1
+:2089B3001E07545472FB0572FB015B0A81545413071E07240B545454541F011E075420E210
+:2089D3005454545472FB0520E172110440521A721500F10F1ACC8D4ECD8D60DE04461F093C
+:2089F3007B1ACD8D60DE04481F0B7B1ACD8D5B909390EE4D905C2703CC8A93909390EE49A0
+:208A1300905C277CBE37CDBD51961C0005CDBCCA7B1ACD8D5B90CE0A9EEE49CDBD5896CD0E
+:208A33008D651F037B1ACD8D601603CD8D86961C0005CDBCCA7B1ACD8D5B90CE0AA0EE4B32
+:208A5300CDBD5896CD8D651F037B1ACD8D601603DF04487B1ACD8D5BCD8D6E7B1ACD8D60B6
+:208A73007B1A905F9097905890EE3EDF044ACD8D60897B1CCD8D5BE65785D7044CCC8CFE99
+:208A9300909390EE49905C2603CC8CE07B1ACD8D60DE044ACDBD51A610CDBAD0961C001265
+:208AB300CDBCCA7B1A5F9758EE3ECDBD51A610CDBAD0961C000ECDBCCA961C000ECDBB827C
+:208AD300A604CDBCBB961C0005CDBCCA961C0012CDBB82A604CDBCBB965CCDBCCA961C00D8
+:208AF30012CDBB82965CCDBB6A961C0005CDBA81961C0012CDBCCA7B1ACD8D601612DF0433
+:208B13004AD6044CCD8D7D961C0012CDBCCA7B1ACD8D5BE657CD8D7D961C000ECDBCCA96DD
+:208B33001C000ECDBB82A603CDBAD0961C0005CDBCCA961C0012CDBB82A603CDBAD0961C64
+:208B53000005CDBA81961C0012CDBCCA7B1ACD8D607B14D7044C7B1A72010A6269CD87C1E7
+:208B73006B0D7B1ACD8D5BEE511F187B1ACD8D5BEE531F167B0D887B1BCD8D5B01AB555F2F
+:208B930097897B1DCD8D5B01AB515F97897B1FCD8D5B01AB495F97CD88DC5B057B0D887B83
+:208BB3001BCD8D5B01AB565F97897B1DCD8D5B01AB535F97897B1FCD8D5B01AB4B5F97CD7D
+:208BD30088DC5B052013CD8D5BCD8D6EEE4D1F187B1ACD8D5BEE4F1F167B1ACD8D5BEE5157
+:208BF30072030A621D72FB18541F077B1ACD8D601607DF04467B1ACD8D5BEE5372FB16546E
+:208C130020131F077B1ACD8D601607DF04467B1ACD8D5BEE531F077B1ACD8D601607DF0453
+:208C330048BE37CDBD51961C0005CDBCCA7B1ACD8D6090CE0A9EDE0446CDBD5896CD8D654B
+:208C53001F037B1ACD8D601603CD8D86961C0005CDBCCA7B1ACD8D6090CE0AA0DE0448CD3F
+:208C7300BD5896CD8D651F037B1ACD8D601603DF0448DE044672F0091F167B1ACD8D60DECD
+:208C9300044872F00B1F181E16011A19011A18015D2704721400F1C604414A2612CE044295
+:208CB30072FB16CF0442CE044472FB18CF04447B1A5F97589093EE9E72FB1690EF9E5F972F
+:208CD300589093EE9472FB1890EF94201E7B1AAD7C905ADF0446DF0448905FDF044A724FD5
+:208CF300044C5F7B1A9758EF94EF9E7B1A5F97586D9E2A05EE9E502002EE9E1F185F9758F2
+:208D13006D942A085F9758EE945020055F9758EE941F165FC60AA297BFEB1E18B3EB220AB1
+:208D33005F97BFEB1E16B3EB230F7B1A5F9758905FEF9EEF94721004400C1A7B1AC10A9AB4
+:208D53002403CC89EB5B1A8197A60F428197A60742811C0005CDBB94BEE981909390EE493E
+:208D7300EF51909390EE4BEF53815F9758585858CCBD51DF0446BE35CCBD51897B05270E8D
+:208D93009EC701039FC70102725F0101201DC60101A1322504A6018581725C0101C60103D3
+:208DB30011012607C60102110227EA4F20E98952079E4D2B4F9F4D2B4BC60A6D5F975A7B6B
+:208DD30009905F4D2A029053CD90162F37CD901E7B08905F4D2A029053CD90162F26AE0094
+:208DF300017B092704584A26FC7B08905F4D2A029053909790580190D4048A0190D404892A
+:208E1300015D26044F5B09815F1F067B0927772A0153CD90251F035F7B084D2A0153CD90B1
+:208E33000E72FB03DE05F172FB061F067B0827247B095F4D2A0153CD90251F035F7B084DE6
+:208E53002A0153CD900E1D001472FB03DE05F172FB061F06CD901E7B08905F4D2A029053C0
+:208E7300CD901627217B095F4D2A0153CD90251F035F7B084D2A0153CD900E72FB03DE0666
+:208E93000572FB061F06C60A6D5F975A7B09905F4D2A029053CD901627765F4D2A015397F5
+:208EB300581F035F7B084D2A0153CD900E72FB03DE05F372FB061F067B0827237B095F4D32
+:208ED3002A015397581F035F7B084D2A0153CD900E1D001472FB03DE05F372FB061F06CDFC
+:208EF300901E7B08905F4D2A029053CD901627207B095F4D2A015397581F035F7B084D2A11
+:208F13000153CD900E72FB03DE060772FB061F067B0827237B095F4D2A015397581F035FA1
+:208F33007B084D2A0153CD900E1D001472FB03DE05F172FB061F06CD901E7B08905F4D2AF4
+:208F5300029053CD901627207B095F4D2A015397581F035F7B084D2A0153CD900E72FB0318
+:208F7300DE060572FB061F06C60A9B6B05720500E6020F057B095F4D2A01539790AE000587
+:208F9300CDBA331F035F7B084D2A01539790AE0032CDBA3372FB03DE01411F011E065757F2
+:208FB300575757577B05905F9097CDBA3372FB011F065F7B094D2A015397581F035F7B08BE
+:208FD3004D2A0153AD3572FB03DE05F113062E03CC8E177B095F4D2A0153971F035F7B0889
+:208FF3004D2A01539790AE000ACDBA3372FB0C72FB03C60441F7A601CC8E189790AE00140D
+:20901300CCBA33909790BFEEB3EE81C60A6E5F975A8197581D0002818952045F1F037B067F
+:2090330097581F017B05CD917872FB01DE05F113032C03CC916972050A996B72010A9923AD
+:20905300C60A6ECD919C100524015A02897B085F97581F057B07CD917872FB059085CD9174
+:209073007D20177B065F97581F037B05CD917872FB037B05DE05F1CD91887B09CD91927252
+:20909300030A990CC60A6DCD919C1006246C20697B065F97581F037B05CD917872FB037B73
+:2090B30006DE05F1207D72010A9923C60A6DCD919C100624015A02897B085F97581F057B26
+:2090D30007CD917872FB059085CD917D20177B065F97581F037B05CD917872FB037B06DEF1
+:2090F30005F1CD91887B09CD919272030A9921C60A6ECD919C100524015A02897B085F9704
+:20911300581F057B07AD5E72FB059085AD5C20157B065F97581F037B05AD4A72FB037B0516
+:20913300DE05F1AD507B0997A604421C0104CDBAB97B065F97581F037B05AD2972FB037BB1
+:2091530009DE05F1905F90979058BFEB93EE3E72BB00EB90EF3E7B0A27087B0997A60F421D
+:209173006C575B068197A6144281DE05F1CDBA339093CCBA6E905F9097CDBA33CCBA609731
+:20919300A604421C0118CCBAB95F975A018152070F0720605F9758EE3ECDBD51961C000391
+:2091B300CDBCCA7B0797A604421C0118CDBB8248CDBAD096AD481F017B0797A60F42160194
+:2091D300EF495F7B079758EE3ECDBD51961C0003CDBCCA7B0797A604421C0104CDBB8248ED
+:2091F300CDBAD096AD181F017B0797A60F421601EF4B0C077B07C1044125995B07811C00D1
+:2092130003CDBB94BEE98189720200F1209E4D2B1C9F4D2B189EC10A6E24129FC10A6D247D
+:209233000C4B003B04417B0395CD902B85721300F1858189B63C97B63A95CD8DC14A852601
+:2092530011B639A10326043F3920023C39721200F181B63926063503003920023A39B63C15
+:2092730097B63A95CC921A895203A6016B013F399E6B039F6B024B017B04977B0395CD8DF7
+:209293008E84CC934BB63926197B024A977B0395CD921A0C037B02B73D7B03B73B7B024A30
+:2092B300201AA103261C7B02977B0395CD921A0C027B02B73D7B034AB73B7B02B73C7B03B4
+:2092D300203CA102261A7B02977B034A95CD921A0A037B024AB73D7B034AB73B7B0220191A
+:2092F3007B024A977B034A95CD921A0A027B024AB73D7B03B73B7B024AB73C7B034AB73A7D
+:209313001E0889B63D97B63B95CD8DC14A8526101E0889B63C97B63A95CD8DC14D85271872
+:209333004B007B04977B0395CD8D8E5B014A26035B05811E08CD92467B012703CC92982087
+:20935300EF884F6B0197A6074290AEFFFFDF0446DF0448905FDF044A724F044C7B0197A6CC
+:209373000F42905AEF49EF4BEF4DEF4FEF53EF510C017B01A10525CD84815204B6BE5F974B
+:2093930090AE03E8CDBD58965CCDBCCABEC1CDBD51965CCDBA81AE012CCDBCCAC60A9D5F1C
+:2093B30097A620CDBA01AE012CCDBA81AE0130CDBCCA721000F15B0481880F01201697A642
+:2093D3000F42E657C10A9C230972120440CD938D84810C017B01C1044125E38481529E967D
+:2093F3001C000690AE8480A696CDBDA30F9E203F97A60F42909390EE49EF4D909390EE4BE1
+:20941300EF4FCD95C67B9E97A604424FD7011BD7011AD70119D70118D70107D70106D7018D
+:2094330005D701045F7B9E9758905FEF3E0C9E7B9EC10A9A25BA5504410048725F04417244
+:209453001504400F9DCC95A65F9758D6048ADA04892603CC95A40F05A6FF6B9C0F9ECC95D8
+:209473009A961C00061F037B9DCD95D172FB03011B9E24015C02F64C271EA6016B05961C1D
+:2094930000061F037B9DCD95D172FB03011B9E24015C02F66B9C20677B054A26727B9E5F3B
+:2094B300975A1F03961C00061F017B9DCD95D172FB0172FB03F6119C262DAE00017B9E27A0
+:2094D30004584A26FC7B9DCD95B32712961C0006897BA0977B9F95CD8DC14D8526090F0579
+:2094F300A6FF6B9CCC9598961C00061F037B9DCD95D172FB03011B9E24015C027B9CF74B89
+:20951300017B9D887BA0977B9F95CD902B2075AE00017B9E2704584A26FC7B9DCD95B3270E
+:2095330064961C0006897BA0977B9F95CD8DC14D852752C60441C10A9A2622725F04410FCF
+:209553009E200897A60F42AD6A0C9E7B9EC10A9A25F172020440047214044020406B9CA6BC
+:20957300016B054B017B9D887BA0977B9F95CD902B85961C0006897BA0977B9F95CD927A92
+:20959300725C0441850C9E7B9EC10A6D2403CC94740C9D7B9DC10A6E2403CC945B5B9E81D4
+:2095B300905F909790580190D4048A0190D40489015D8190AEFFFFEF49EF4B6F578197A6A4
+:2095D3000A42815208CD9354B6BE5F9790AE03E8CDBD58965CCDBCCABEC1CDBD51965CCDCA
+:2095F300BA81961C0005CDBCCAAE0130AD2C962406AD1B23162004AD152208961C0005AD26
+:20961300192408721100F1721304405B08811C0005CDBB82AE0130CCBA99CDBB82AE012CC3
+:20963300CCBA998972050A990AC60A6E6B01C60A6D2008C60A6D6B01C60A6E6B025F7B010D
+:20965300975A4F02BF375F7B02975A4F02BF35CD93F072070A9903CD93CC720000F10BCDD7
+:2096730091A1CD8658CD89DC2003CD95D68581887203044005AE9C55BF014F6B01AD40CD4D
+:20969300BDB2BEA8A399172703CD96F9720404400ABEA8A380012503FDBFA87B01AD20CD19
+:2096B300BD940C017B01A10225D3720404400592CD01BF01C6043DC40AE7C7043D848197E3
+:2096D300A6164201AB035F9790AE00A8A6168189BEBAA67DCDBCE272BB00B813012404A65B
+:2096F3000120014F858189B6C3974F021F015FC652E69772FB015872B000B6BFBA5FC604A2
+:209713003C971F01BEB872FB01BFB8858189B6C3974F021F015FC652E69772FB0158BFB6A9
+:209733005FBFB88581520ABEAC8992CEAACD85BE5B021F05BEAE89BEAAEE02CD85BE5B0296
+:209753001F07CDBD51965CCDBCCA1E05A640CDBA01965CCDBB94BEE91F09A300FF24047BFD
+:209773000A2002A6FFB7B51E05CDBD51965CCDBCCA1E07A640CDBA01965CCDBB94BEE91FEF
+:2097930009A300FF24047B0A2002A6FFB7B45B0A81BEAAEE028992CEAA89BEAE89BEACCDA6
+:2097B30089665B06BFBCCC97385205C60AF76B03CE0AF31F01CE0AF51F04BEA8A397BC2647
+:2097D3000ACE0AEF1F01CE0AF11F04C60441A102250AC60AFA6B03CE0AF81F0490BEAA9009
+:2097F300FE905C26035F2014CD97A41E01CD96E24D260CBE01A39B8E2605BEA85B0581BE0A
+:20981300BC130425F5B6B41103223890BEAA90FE90B3ACBEA82416A398982705A397BC2640
+:2098330022CD97205FCF0444AE000420CFA3989B2705A397BC260CCD97205FCF0444AE0086
+:209853000820B9B6B5110322B190BEAA90EE0290B3AE2318BEA8A3989E2705A397BC269AFD
+:20987300CD97205FCF0442AE00102090BEA8A398A12705A397BC2682CD97205FCF0442AEBD
+:209893000020CC980FCC97BCCC97BCCC97BCCC97BC5FCF0444CF044290BEAA90FE905C2683
+:2098B30019CE0AE9CD96E24D2710BEB092CFAABEAA90BEB2EF02AE00018192CEAABFB0BEB9
+:2098D300AAEE02BFB2BEAE89BEAC89BEB289BEB0CD89665B06C30AEB2304AE97BC81CE0AC5
+:2098F300E972BB0AEDCD96E24D2604AE000281AE98A48190BEAA90FE905C2604AE99178175
+:20991300AE99068190BEAA90FE905C271A92CEAABFB0BFACBEAAEE02BFB2BFAE3FB43FB5B2
+:20993300CD9720AE98A481AE991781CC9B1ECC9B1ECC9B1E92CE05BF07BE05EE02BF09927F
+:20995300CE1BBF1DBE1BEE02BF1F817212043EAE97BCBF03BF19CC9947520490BE0592CEF1
+:209973001B90FE90BFEB72BB00EB72B0000B72B00021A602CDBCE21F01BE1B90BE05EE021A
+:2099930090EE0290BFEB72BB00EB72B0000D72B00023A602CDBCE21F0392CE05BF0BBE0547
+:2099B300EE02BF0D92CE1BBF21BE1BEE02BF23BE19A380002437BE03A380002430A300039F
+:2099D300252BB604B41AA50C270DCD995E1E01CF0442AE99442013B604B41AA530270ECDA2
+:2099F300995E1E03CF0444AE99415B0481BE01A399442626BE03A300042711A30008270CB4
+:209A1300BE19A300042705A300082603CD995E1E01CF04427212043EBE01A3994126CBBE0C
+:209A330003A300102711A30020270CBE19A300102705A300202603CD995E1E03CF0444721F
+:209A530012043EBE0120A35206BE1F89BE1D89BE0989BE07CD89665B061F01BE1BEE028957
+:209A730092CE1B89BE05EE028992CE05CD89665B061F03BE01A3993E2605CE0AFD2003CEC5
+:209A93000AFB1F055FCF04441E0372F0011605CDBA15CF0442270C7214043ECD9947AE99D5
+:209AB3003E2002BE015B0681BE03A380002429A30002240A5A2618BE19A399172611AE9750
+:209AD300BCBF03BE01A39B5B2605AE9B1EBF01BE032605AE9906BF03BE19A380002429A366
+:209AF3000002240A5A2618BE03A399172611AE97BCBF19BE01A39B5B2605AE9B1EBF01BEFF
+:209B1300192605AE9906BF19BE0181725F043E5FCF0442CF044490BE0590FE905C2709905E
+:209B3300BE1B90FE905C2603CC9C0A72050AE805CD9A5ABF0172030AE80B725D043E260587
+:209B5300CD996CBF01CC9ABB725F043EBE03B3192626A30001261472010AE8047210043E48
+:209B7300AE9917BF03BF19AE9C0A81A397BC2608AE9B1EBF01CC9B1ECC9ABB725F043DBE44
+:209B930019A39917270FAE98A4BF03BF19AE9B5BBF01CC9B5BBE03A38000244955000404B8
+:209BB3003D1D0004271D1D0004271D1D0008271D1D0010271D90BE0590FE905C2619AE995E
+:209BD300172017AE98982018AE989B2013AE989E200EAE98A12009AE9906BF03AE9C0A81F4
+:209BF300BF03CD9947BE0181BE03A399172704AE9B8E81AE9BFB81725F043EC6043DA40287
+:209C1300C7043D90BE0590FE905C2609AE9917BF03725F043D90BE1B90FE905C2605AE99A6
+:209C330017BF19C604412604AE9BFB81720204400D7204044008A1022604AE9B5B81AE9C65
+:209C53000A81720200E603CC9C0AAE9C5581AE0101CDB6F03507528D35805280357D528E20
+:209C7300725F528F72105287721052807211528535015284AE010072115280CCB6F0AE02E4
+:209C930001CDB6F035FF52E8350852E7AE0200721052E3CCB6F0721C50C3721050C37210C8
+:209CB30050F07210525852087210525A725F525B725F525C7210525072035255FBC65260ED
+:209CD3005F971F057B066B050F065FC6526197011A06011A05011F05721352567203525533
+:209CF300FBC652605F971F077B086B070F085FC6526197011A08011A07011F0772135256AE
+:209D130072115250725F5258725F525A721150C3721150F0721D50C372F0051F07CDBD51B0
+:209D3300965CCDBCCAAE6938BFE9AE0018BFE7965CCDBB94BEE9BFC45B08815206AE003A0C
+:209D5300CF0430AE000FCF0432350204343502043535A5043635FF043B3580043FCD935419
+:209D7300AE09051F03AEBE001F055F1F011E05F61E03F75C1F031E055C1F051E015C1F01F6
+:209D9300A301FB25E85B06814BC04BC7AE5000CDB799854B00AE5000CDB7E7844BC04BFFD8
+:209DB300AE500FCDB799854B00AE500FCDB7E7844BC04BFFAE5005CDB799854B00AE500552
+:209DD300CDB7E7844FCDB74E725F50C3CDA1BCCD9CA9CD9D4ECDAD7DCD9C61CD9C91720B50
+:209DF30009BE1835CC50E0355550E0350550E135A750E2725F50E035AA50E0CC9FC2AE0220
+:209E130001CDB6F0725F52E63FC3721052E08152130F09AE0200721152E0CDB6F05F1F0E9A
+:209E330020091E0E1C10001F0E3AC3B6C326F3C652E65F975858585872FB0E1F0E720A0852
+:209E5300610AB6CF2757B634A1022651AE03E81F0C5F1F0A5C1F101E0ECDBD51961C000AE3
+:209E7300CDBA992503CC9F65BEC4CDBD51961C0005CDBCCA1E0ECDBD51965CCDBCCA961C52
+:209E9300000ACDBB82965CCDBB6A961C0005CDBADFAE8516CDBB94BEE91F12205F72030069
+:209EB300E51CB634A1022516CE09AA90AE03E8CDBD58961C000ACDBCCACE09AA2097B6D26B
+:209ED3002713B634A103250DAE9C401F0C5F1F0AAE00282080B6345F975890AE03E8DE097A
+:209EF300AACDBD58961C000ACDBCCA5F9758DE09AACC9E680C09041206131E12A300412487
+:209F1300F3AE0601CDB6F01E12A3000225097B13A002C750F12004725F50F17B094CC750BB
+:209F3300F2721850F0720252170DAE0701CDB90C8EAE0700CDB90C721950F0725F50F2AEBF
+:209F53000600CDB6F072170440BEC172FB10BFC120227216044090AE03E81E0E651F10BE77
+:209F7300C172FB10BFC190AE03E81E0E659372BB00BFBFBF1E10A30100250635FF043C20C8
+:209F9300117B11C7043C200A1D03E8BFBFBEC15CBFC1BEBFA303E924EF200A1D03E8BFC12E
+:209FB300CDB4723CBEBEC1A303E924EF5B13819B720109BE2172135002720309BE067213FD
+:209FD3005003200472125003350C50A0350250A372125004200C721250027212500372138F
+:209FF30050049A8189BEC6A306D0240A1C04301F01F6B7C82025A3F000250DA3F00C240871
+:20A013001DA6DAF6B7C82013A3F102260ABE2FF6B7C85CBF2F200435EE00C8BEC6A3EEEE64
+:20A033002708A3F10227035CBFC685813556505235AE505235AE50533556505381C65054E6
+:20A05300A4F5C750548135CC50E0355550E0725F50E1725F50E220FE89BEC6A3030324037D
+:20A07300CCA11CA306D024F81D03031C07331F01B6C8F7BEC65CBFC61E01A30A8F250BA30E
+:20A093000A942206721600F1201DA30A882705A30A8D261972090A880BB634A1032505CDBA
+:20A0B300B38D2051CDB3B2721000E48581A309C6250BA30A5D2206721800E420EEA30A62DF
+:20A0D3002606721600E420E3A3086F2505A3099B23D5A30A6D2505A30A8723CBA3086525B4
+:20A0F30005A3086F230FA3099C270AA30A89250FA30A8C220A721600E4721400E420ACA36F
+:20A1130009BE26A7CD9FC220A2A3F1002705A3F10126101DF1001C002FB6C8F7BEC65CBFB0
+:20A13300C68581A3F10226F9BE2FA30C00250AA35000250FA35800240AB6C8F7BE2F5CBFF3
+:20A153002F20DEA3BE0025F4A3C00024EFCDA03FB6C892C72FCDA05020E289C609BA5F9756
+:20A1730090AE007DCDBA331F01AE7D0072F0011F017B01C7528B7B02C7528C85817211526C
+:20A1930080CDA16D7210528081AE0101CDB6F0CDA16D72115285721900F172105280817261
+:20A1B300115280AE0100CCB6F05203C6BFFF2602A6746B03AE0301CDB6F04B004B044B00F5
+:20A1D3007B065F975889AE86A089AE000189CDB7EF5B0C81AE0601CDB6F0350250F135014E
+:20A1F30050F2721850F08E721950F035F050F2AE0600CCB6F07201086215200AAE0701CDBB
+:20A21300B90C8ECDA22372000862F1721000E481721200F2721100F2CE0AA5BFC6725F5282
+:20A2330018CDA19CAE0701CDB90C721C5000202A35AA50E0720B00F115720100F2107202FE
+:20A2530052190BBEC6A3EEEE2604721300F2720900F107721300F2CDA1E7720200F2D1AEAD
+:20A273000700CDB90C72145211721D5000720800F10ACDA1B25FCF0442CF04447219043F7C
+:20A29300721D043F721B00F17207086108721000E4721708617209086108721400E4721938
+:20A2B3000861720F086108721F043F721F0861720700F117721700F1B634A1032509720930
+:20A2D3000A8804A60120014FCDAD337203086203CDA059721F00F181880F01555217042CE0
+:20A2F300555218042E555219042F721B00F1C6042EA50926057201528514720152850772F7
+:20A31300115285CDA478C65218A4F6C75218720B042E04721B52187203042C0B721000F290
+:20A333003501042D5FBFC9C6042CA484A1842705720F042C15725F042DCD9FF7B6C8CDB91E
+:20A3530026BEC95CBFC9A6016B01C6042CA444A1442705720D042C3AC6042D4A2623BEC95D
+:20A37300260ACDB922974F02BFC6201DCDB9225F9701BAC701BAC601BFC6725F042D5F20A0
+:20A393000BCDB922B7C8CDA06BBEC95CBFC9A6016B017205042E0DBEC95ABFC97215521812
+:20A3B300721A00F17209042C1472145211BEC6A3EEEE26097202042C04721300F27B012771
+:20A3D30003CDA19084817203500106721A04402004721B0440720A086109B6CF26057205BE
+:20A3F30000F2024F817203521703A60181720109BF70720F09BF05720C00F261720D09BF6C
+:20A4130005720A00F257720B09BF05720800F24D720909BF11720700E607720F00E63E20DD
+:20A4330005720E00E637720709BF0A720C043F2D7208043F28720509BF0C720400F11EC6B3
+:20A453000441B1482617720309BF08C6043ECA043D260A720909BE08720F00F103A60181FF
+:20A473004F81A60181721800F1CCA1B289AE0001B6DD2704584A26FCB6DC905F90979058ED
+:20A493000190D4048A0190D40489015D2704A60120014F5F97D609C66B01B6DC97A60A4202
+:20A4B30001BBDD24015C02D609C81B016B02BEE0CDBA01A607CDBCBB90CE0B02BEE990EF95
+:20A4D3000385815FCF5316CF53088188B6315F97D60A796B01A109240FAE00014D27045898
+:20A4F3004A26FCCF53162010A0095F97A6805D2704445A26FCC75309848120018F7201001D
+:20A51300E5FA81CE071DCF085F3FD45FCF0487721700E6721500E481CDA4D63C31B631C11D
+:20A533000A6E2503A60181CDA4DE4F81890F0220505F97D60A6F5F9789B63197A60A4201E2
+:20A553001B0424015C02D6086F85D75350B63197A60A42011B0224015C02D60905CB099B96
+:20A573006B01A1202F06A61F6B0120054D2A020F017B025F97D60A6F5F977B01D753400CDD
+:20A59300027B02C10A6D25A98581880F01AE00017B012704584A26FC01C40A8A01C40A89BA
+:20A5B300015D27167B015F97D60865D753505F7B0197C6099CD75340200E7B015F97724F16
+:20A5D30053505F97724F53400C017B01A10A25BD84818852040F01201E97A60A421C086F18
+:20A5F3001F030F0220087B05F75C1F030C027B02C10A6D25F10C017B01C10A6E25DB5B05FD
+:20A6130081885F97D609C45F97B3DE2C68AE0001B6DD2704584A26FCCDA6E22717CE0B02CB
+:20A633004FF70D012607721000E6CCA6D4721600E6CCA6D4CE0B02F6A40FF74EC80AA9A53B
+:20A65300F0262ACDA6F7270590584A26FB9001DA046A9001DA0469CDA703A4F0F70D0126D7
+:20A6730006721000E62050721600E62054F64CF8A40FF8204BAE0001B6DD2704584A26FC86
+:20A69300AD4D2606CE0B024F2036CE0B02F6A4F0F74EC80AA9A50F2624AD49270590584A8A
+:20A6B30026FB90539001D4046A9001D40469AD40A40FF70D01260A721C00F22004F6AB10B4
+:20A6D300F7A50F2604A5F02704721200E58481B6DC905F909790580190D4046A0190D40498
+:20A6F30069015D81B6DC5F975890AE0001B6DD819001DF0469CE0B02F681880F0190CE0B9C
+:20A713000290EE0390B3DE2C56AE0001B6DD2704584A26FCCDA8132706721200E62050CE72
+:20A733000B02E601A4F3E7014EC80AAAA5302626CDA828270590584A26FB9001DA048A9003
+:20A7530001DA04899001DF0489CDA834A6016B01721200E6205BE6014CE801A403204EAE01
+:20A773000001B6DD2704584A26FCCDA8132609CE0B02E601A4F02037CDA8344444C80AAA32
+:20A79300A5032621CDA828270590584A26FB90539001D4048A9001D404899001DF0489A630
+:20A7B300016B01200CE601AB04E801A40FE801E701CE0B02E601A5032704721200E5AE003E
+:20A7D30001B6DD2704584A26FCAD352726BEDEB3CB232072050A990BB6DC97A610429FBAB8
+:20A7F300DD2009B6DD97A610429FBADCC7043BBEDEBFCB7B012707CDA47F721A00F28481A0
+:20A81300B6DC905F909790580190D4048A0190D40489015D81B6DC5F975890AE0001B6DD1F
+:20A8330081CE0B02E601A4FCE701818952049F5F97581F017B0597A6144272FB01DE04C5A5
+:20A853001F032709BEDA72FB03BFDA3CD95B068152030F020F010F03CE09C272BB00DE2DA2
+:20A8730003CCA9095FBFDA3FD9C60A6D975AB6DD905F909790BFEEB3EE2604A6016B01C67C
+:20A893000A6E5F975AB6DC905F909790BFEEB3EE2604A6016B03B6DD27164ACDA9E3270678
+:20A8B300B6DD4ACDA9C77B032606B6DD4ACDA9CF7B012618B6DD4CCDA9E32706B6DD4CCDD4
+:20A8D300A9C77B032606B6DD4CCDA9CFB6DC2705B6DDCDA9C77B032605B6DDCDA9CFB6D989
+:20A8F3002711BEDA62BFDA72B009C2B3E22307A60120014C6B027B02275AAE0001B6DD27E6
+:20A9130004584A26FCCDA9B22706721400E62053CE0B02E601A43FE7014848C80AAAA5C02A
+:20A933002626CDA9D7270590584A26FB9001DA04A89001DA04A79001DF04A7CDA9ED7218B7
+:20A9530000F2721400E62054E601AB10E801A43FE8012046AE0001B6DD2704584A26FCAD77
+:20A973003E2609CE0B02E601A40F202EAD6C4EC80AAAA50C2620AD4C270590584A26FB90B2
+:20A99300539001D404A89001D404A79001DF04A7721800F22006E601AB40E7015B0381B624
+:20A9B300DC905F909790580190D404A80190D404A7015D8197B6DC4A95CCA83E97B6DC4C7B
+:20A9D30095CCA83EB6DC5F975890AE0001B6DD8197B6DC95CDA83EB6DC81CE0B02E601A400
+:20A9F300CFE701815211B634A1032605C60A652003C60A666B0D45D4EA3FE93FE83FE796DC
+:20AA13001C0005CDBCCACE085F90AE0100CDBD58961C0005CDBA81961C000ECDBCCACE07B2
+:20AA33001DCDBD58961C0009CDBCCA961C0009CDBB827B0DCDBCBB961C0005CDBCCA961CA9
+:20AA5300000ECDBB827B0DCDBCBB965CCDBCCA961C000ECDBB82965CCDBB6A961C0005CD88
+:20AA7300BA81961C000ECDBCCA1E0FCF085F7B11B7D45B1181720B53040735C05304A60140
+:20AA9300814F8152055F1F03AE03FFA60AC00A6D2704574A26FCB631905F9097905801907F
+:20AAB300D40AAC0190D40AAB011F010F05AE00017B052704584A26FC011402011401015D01
+:20AAD300271CAE00017B05905F909790D60A6F2704584A26FC011A04011A03011F030C059C
+:20AAF3007B05A10A25C71E0301CA530901CA530801CF53081E032604A60120014F5B058150
+:20AB1300890F01CDA52B6B022605CDAA966B017B0127047B0227EC7B022605CDA53F7B02CE
+:20AB3300858152050F05CCABD2AE00014D2704584A26FCB631905F909790580190D40AAC5D
+:20AB53000190D40AAB015D2763B6CF27307B055F97581F03CDABF472FB037B05CDABFB90B5
+:20AB7300BFEE909390DE04C572B900EE90547B055F97581F01AD6A72FB01DF07337B055F53
+:20AB930097581F03AD5B72FB037B05AD5BDF04C5720100E4287B055F97581F03AD4372FB1D
+:20ABB30003909390DE04C5DF073320117B055F97581F03AD2C72FB03905FDF04C50C057B7F
+:20ABD30005C10A6D2403CCAB3C720100E410B6315F9758905FDF0469DF0489DF04A75B051E
+:20ABF30081B63197A6144281905F909790D60A6F905F9097905890DE532081BED7CF071DE9
+:20AC13005FBFD5721700E4815210BED726075FCF071DCCACA8BED54F01CDBD51961C000535
+:20AC3300CDBCCACE071D90AE0100CDBD58961C0005CDBA81961C000DCDBCCABED7CDBD5853
+:20AC5300961C0009CDBCCA550A6400EA3FE93FE83FE7961C0005CDBCCA961C0009CDBB82E2
+:20AC7300961C0005CDBADF965CCDBCCAA601974FC00A6424015ACDBA54961C000DCDBADF25
+:20AC9300965CCDBA81961C000DCDBCCA1E0DCF071D1E0FBFD55B10813503530AC60A8D4395
+:20ACB300C7530BAE03FFCF530CCF530E815FCF530AC60A8D97CF530ECF530C81C60A5E5FE2
+:20ACD3009750B3DE2D4F3FD0AE0001B6DD2704584A26FCB6DC905F909790580190D40ACA64
+:20ACF3000190D40AC9015D2635720C00E627720400E622720A00E61DCE0B02E6024CE802CF
+:20AD1300A40FE802E702A40FA10E2512E602A4F0E702A60181CE0B02E602A4F0E7024F8164
+:20AD3300721F530088C65301A4DCC75301C60A8FA423CA5301C7530172050A8F05AE03FFBB
+:20AD530020015FCF53125F7B0197D60A90C753065F7B0197D60A92C753025F7B0197D60AD8
+:20AD730094C7530784721E530081AE0701CDB6F0CDB3B2358053003520530435845301AE59
+:20AD930003FFCF531C8188720400E5077207043F028481720500E507720B043F0284817B8D
+:20ADB300012704721A0861848152070F07720200E600901B00E6720000E600901900E672A7
+:20ADD3000400E600901D00E6B6E6A4F8B7E635FF043B5FBFCB721900F2721B00F2721D0027
+:20ADF300F2721300E5C6099D97C6099ECB09A124015C021F0301C6099D97C6099EC009A17F
+:20AE130024015A021F053FDCCCAF898FB13124FBAE0001B6DC2704584A26FC01B4CE01B463
+:20AE3300CD015D2703CCAF87B6DC97A632421C013ECF0B023FDDCCAF7D5F97581F01CDAF30
+:20AE5300CA72FB01DE04C5BFE22603CCAF13B6DD5F97581F01CDAFCA72FB01DE0733BFE03C
+:20AE7300BEE272B000E0BFDE5FB6DD97581F01CDAFCA72FB0190BEDEDF05F1CE0B02E60207
+:20AE9300A40FE702CDACCF4D27087217043FA6016B07B6CF2605720100E41BBEE013032262
+:20AEB3000413052411720700F2087216043F3FD12004A6016B07720800E409B6CF2605721A
+:20AED3000100E403CDA47FB6CF2703CCAF72CDA614B634A10324F4CDA70DAE0001B6DD27D4
+:20AEF30004584A26FCB6DC905F909790580190D40ACA0190D40AC9015D2764CDA863205F36
+:20AF13005CB6DD2704584A26FCB6DC905F909790580190D40AAC0190D40AAB015D2720CE08
+:20AF33000B02E602AB10E7024EA40FA10E25307217043FA6016B07E602A40FE7022020B601
+:20AF5300DD5F97581F01AD6F72FB01905FDF07335FB6DD97581F01AD5E72FB01DF05F1CEE4
+:20AF73000B021C0005CF0B023CDDB6DDC10A6D2403CCAE4C3CDCB6DCC10A6E2403CCAE1F40
+:20AF9300721700F2721100E4720509BE057B07CDAD99720500E605720900F20B3FD3720D79
+:20AFB30000E604721800F2720800F20090190440721900E45B0781B6DC97A614428152066F
+:20AFD3000F015F1F043FDD350F00DC721700E6B6D227023AD2721300E50F06AE00017B06B5
+:20AFF3002704584A26FC01C40A8A01C40A89015D27081E0472BB099F1F040C067B06A10AB9
+:20B0130025D97B04977B05CB09A224015C021F02017B04977B05C009A224015A021F047257
+:20B033000B00E503CCB0C1AE0134CF0B0272070A620BB6D2A10E2705720700E415CDAC0EC2
+:20B05300CE071DBFE2B6D2A10A270C720500E40A2005CDAC1B20E9CDA516720B0A8809CE4F
+:20B07300085FB3E223102008720F0A8809CE085F72B000E22006BEE272B0085FBFDEA6017E
+:20B09300CDA614720200E508720600E603CDA9F7CE085F1302220813042504BEE2260F72EC
+:20B0B3000700F206721A043F2004A6016B01721700F2720709BE057B01CDAD99720700E6CA
+:20B0D30007720B043F023FD15B06815206C601004C720500E503CCB1F8260BA680C7010044
+:20B0F300CDA5E5CCB249C601002621CDB2CE721000E47218043F725D0B0027097216043FBC
+:20B11300B7D1CCB2497217043FCCB249725F0B000F05CCB1E80F06CCB1DCCE099D1F035F82
+:20B1330097581F017B0597A6144272FB01DE04C5130322187B065F97581F017B0597A614B5
+:20B153004272FB01D604C6DA04C526157B05CDB2C81B0624015C02C6010043D4086FD7080F
+:20B173006F7B05CDB2C81B0624015C02C6010044DA086FD7086FC601004A264BAE00017B8C
+:20B19300062704584A26FC7B05905F909790580190D40AAC0190D40AAB015D272A7B05CDF8
+:20B1B300B2C81B0624015C02D6086FC109A323137B05CDB2C81B0624015C02D6086FC109EC
+:20B1D300A4250435010B000C067B06C10A6D2403CCB12D0C057B05C10A6E2403CCB12872AA
+:20B1F30054010020512629358001000F06AE00017B062704584A26FCCDB2DB27097B065FD3
+:20B2130097A680D708650C067B06A10A25DF2026C601002624CDB2CE721600E4721400E45E
+:20B23300721C043F725D0B002708721A043FB7D12004721B043F5B0681725F0B004F6B0658
+:20B253005F9758909390DE532090C3099F220AD65321DA5320260E7B065F97C6010043D442
+:20B273000865D708657B065F97C6010044DA0865D70865C601004A262BAE00017B06270440
+:20B29300584A26FCAD42271C7B065F97D60865C109A3230C7B065F97D60865C109A42504FE
+:20B2B30035010B000C067B06A10A259472540100CDAC0E208197A60A42018135FF010072A2
+:20B2D3001B0861721600F28101C40A8A01C40A89015D8189720B08610D720400E508CE0996
+:20B2F3009D1C00322003CE09A5CF531A720400E51D3F31C60A6E4A2706721B530020047262
+:20B313001A5300CDA4DECDAA96CDA53F2061720E0A88500F0172010A8B06350153162004DC
+:20B33300725F5316550A8C5317A6096B02AE00014D2704584A26FC01C40A8C01C40A8B01AE
+:20B353005D27137B02A0095F97A6805D2704445A26FC1A016B010C027B02A11125CF7B0185
+:20B37300C75309C65309CA0A8AC75309CDA59D720600E600901F00E68581721400E5720F00
+:20B393000A8805CDACC02003CDACAB720D0A880672165301200472175301A601CCAD3372CA
+:20B3B3001500E5CDACAB721753014FCCAD338835205304720400E55BCDAA884A2613AE006A
+:20B3D30001B6312704584A26FC01BACE01BACD2012AE0001B6312704584A26FC5301B4CEE5
+:20B3F30001B4CD01BFCDCDAB35CDAB1344901100E5720000E567C60A6E5F975AB631905F07
+:20B41300909790BFEEB3EE2604721A5300721C5300204ACDAA8844901B00E55FBFD74F6B3E
+:20B43300015F9758909390DE5320DF071FAE00014D2704584A26FC01C40A8A01C40A890104
+:20B453005D270E7B015F9758DE532072BB00D7BFD70C017B01A10A25C8721000E584817293
+:20B473000E09BE21B634A103251BC609B827164A2604725C09B83CD0B6D0C109B825063FB0
+:20B49300D0350100CFBE322710CDBD51AE851ACDBA992705BE325ABF32720500E614C609AE
+:20B4B300B9270F3CD3B6D3C109B923063FD3721000E4720400E50A7207043F05720409BE6B
+:20B4D3000F720500E51D720B043F18720709BE133CD1B6D1C109A7250AB6CF2606721A082D
+:20B4F30061B7D18188B6345F97D609B46B01B634A10427057B014C2607AEFFFFBF32848116
+:20B51300B634A10326177B0197A61442BF3272090A8806350F00D220E53FD220E17B015F32
+:20B533009720D988B6346B01720F09BE03CCB619B6CF273E4A2623B634C70B013CCFA102BC
+:20B553002704350200347206043F03CCB620720509BEF8721A0861CCB620720B08610284A9
+:20B57300813CCFC60B01A10325ED550B010034CCB620B6342619720200E607720400E60285
+:20B5930020767201044006CDB4F7CCB620206FA1012628720200E602205E720004400C729E
+:20B5B3000800F207B648C104412702201CBE32265C35020034721000E42052A102262172FD
+:20B5D3000200E605720500E6043F342040BE32263C3C3472090A8804721400E43FD0202D9E
+:20B5F30072090A8809720700E604B6D2270A72080A880B720100E60635020034200FBE3206
+:20B61300260B3C342007C60861A407B734B6341101272CB6CF2603CDB4F772090A88207B6D
+:20B6330001A103250BB634A1032405CDB3B2200F7B01A1032409B634A1032503CDB38DB644
+:20B65300CFA10326023FCFC6043FA4F8C7043FC6043FBA34C7043F8481720A08610FCDAD0B
+:20B67300BCB634A103240CCD9636CC9682CDA50DCDB0DE81CDA50DCDA4D6720A086103CCEB
+:20B69300AFD1CCB0DEB634A1032428720A08614C72090A880C35030034CDB38D721A08612B
+:20B6B30081721500F2720F09BE07C60861A407B7342026A1032625720A086120721500F2B6
+:20B6D300720F09BE0DC60861A407B734A1032409200435020034CDB3B2CDB4F78189889E03
+:20B6F300A4F06B0126267B03270F7B02AD452704485A26FCCA50C3200E7B02AD36270448FB
+:20B713005A26FC43C450C3C750C320247B03270F7B02AD1F2704485A26FCCA50C4200E7BEF
+:20B7330002AD102704485A26FC43C450C4C750C45B0381A40F5F97A6015D8188C650C0A443
+:20B75300FCC750C07B01C750C084815209C650C0A4035F97D6851E6B09B7EA3FE93FE83FC1
+:20B77300E7965CCDBCCAAE2400BFE9AE00F4BFE7965CCDBB94961C0005CDBCCA961C0005F9
+:20B79300CDBB825B0981897B062A18A5102705F61A0520061E017B0543F4F71E01E6021A51
+:20B7B3000520071E017B0543E402E7027B06A5402706E6031A0520057B0543E403E7037BCA
+:20B7D30006A5202706E6041A0520057B0543E404E7048581891E017B05F78581520A0F07FD
+:20B7F300CDB75EAE8522CDBB94B6EA6B08C65212A4C0C75212C652121A08C75212721152CB
+:20B8130010C6521CA430C7521C725F521B961C000DCDBB82AE8526CDBA992560A6806B072B
+:20B83300960D13261D1C000DCDBB82A603CDBD07965CCDBCCA7B08CDB8F796CDB9051F0902
+:20B8530020211C000DCDBB82A619CDBD07965CCDBCCA7B08CDB8F796CDB9051F097B07AA58
+:20B87300406B071E0926035C1F097B0897A60342A60ACDBCE25C1F057B062028961C000D07
+:20B89300CDBB8238EA39E939E89639E75CCDBCCA7B08AD5096AD5BA300042403AE00041F04
+:20B8B300097B084CC7521D7B0AC7521B7B09A40F1A07C7521C7210521072155211C652112A
+:20B8D3001A14C752117B12C752137B11A403974F024F0148599F6B047B15AA401A04C75279
+:20B8F300145B0A81B7EA3FE93FE83FE7AE8522CCBADF5CCDBB94BEE981899F4D27069ECAC1
+:20B91300521A20067B0143C4521AC7521A8581C6521681C752168120FE20FE20FE8A84A4EF
+:20B93300BF88863B00EDBEEB893B00F0BEEE89CDB3C185BFEE3200F085BFEB3200ED8055B5
+:20B9530050F050F08020FE20FE20FE350250A372110862721E00F18020FE20FE20FE20FEEA
+:20B9730020FE20FE20FE20FE8A84A4BF88863B00EDBEEB893B00F0BEEE8972115285CDA438
+:20B993007885BFEE3200F085BFEB3200ED8020FE3CC335FE52E48020FE20FE20FECD9D9B95
+:20B9B300CDA223720D09BEF8721A0861CD9E11721100E5CDB2E6721C5300720400E505CD58
+:20B9D300B66C2003CDB687CDA3D94D2706CDA223CDA208720400F205CDB5362003CDB698D6
+:20B9F300720400F203CD9E2235AA50E020BEBFE742BFE997B6E73FE84272BB00E8BFE83F27
+:20BA1300E781884F5D2A024C50905D2A04AB029050654D2709442405905044250150848119
+:20BA330088BFEC909F5E42BFEB909EBEEC4272BB00EBBFEB909FBEEC3FED4272BB00EC8487
+:20BA530081B7EA9F5FB7E92A015ABFE781BFE92A06AEFFFFBFE7815FBFE78190BFE92A08CC
+:20BA730090AEFFFF90BFE781905F90BFE781B6EAEB03B7EAB6E9E902B7E9B6E8E901B7E89A
+:20BA9300B6E7F9B7E781B6E7F1261AB6E8E101260CB6E9E1022606B6EAE10327089C24033A
+:20BAB300A6FF81A60181E603BBEAE703E602B9E9E702E601B9E8E701F6B9E7F7814D270B3D
+:20BAD30038EA39E939E839E74A26F581E60388E60288FE891E03B6E742BFEBBEE77B034271
+:20BAF30072BB00EBBFEBBEE87B024272BB00EBBFEBBEE97B014272BB00EB9FB7E7BEE77B70
+:20BB1300043FE84272BB00E7BFE7BEE87B034272BB00E7BFE7BEE97B024272BB00E7BFE7AB
+:20BB3300BEE87B043FE94272BB00E8BFE824023CE7BEE97B034272BB00E8BFE824023CE7F2
+:20BB5300BEE97B043FEA4272BB00E9BFE92405BEE75CBFE75B0481B6EAE003B7EAB6E9E22E
+:20BB730002B7E9B6E8E201B7E8B6E7F2B7E78188F6B7E7E601B7E8E602B7E9E603B7EA840A
+:20BB9300815204E60388E60288E60188F69688CDBBBF5B08813FEB4D2A07CDBC93721000E6
+:20BBB300EBB6E72A07CDBCA6721200EB9089F62667E601266390BEE7271BE602272EB1E7C3
+:20BBD30022592606E603B1E8225190AE00204FE706E707205789EE0290BEE95165BFE98524
+:20BBF300EF06905FEF0490BFE7908581E704E705E706E603906290BFE79095B6E99097E6E9
+:20BC13000390629001B7E9B6EA9097E6039062E707909FB7EA90858190BEE7EF0690BEE994
+:20BC330090BFE790AE00104FB7E9B7EAE70538EA39E939E839E769076906690549F1253789
+:20BC5300261CE704E605E10125102614E606E1022508260CE607E003240AE6042019E7042E
+:20BC7300E607E003E707E606E202E706E605E201E705E604F23CEA905A26B39085E7048136
+:20BC93007363016302600326096C0226056C0126017C8133E733E833E930EA260A3CE926B3
+:20BCB300063CE826023CE7814D270B34E736E836E936EA4A26F58188B6E7F7B6E8E701B646
+:20BCD300E9E702B6EAE7038481358000EB20023FEB5D2A0950721000EB721200EB4D2A05CC
+:20BCF30040901200EB6237EB2A065F972405508127015081899089909797B6E7429FB7E74B
+:20BD130093B6E83FE84272BB00E7BFE793B6E93FE94272BB00E8BFE824023CE7B6EA933FA9
+:20BD3300EA4272BB00E9BFE92405BEE75CBFE790858581B7EA41B7E9413FE83FE781BFE9E2
+:20BD53003FE83FE78188BFEB90BFEE909F42BFE9B6EB97B6EE42BFE74D271097B6EC270BC7
+:20BD73004272BB00E8BFE824023CE7B6EB271097B6EF270B4272BB00E8BFE824023CE78458
+:20BD93008189B7EB90F6F75C905C3AEB26F6858189B7EB90F6F75C905C3AEB26F685819011
+:20BDB30089B7EBF690F75C905C3AEB26F69085817171717171717171717171717171717199
+:20BDD300717171717171717171717171717171717171717171717171717171717171717130
+:0DBDF3007171717171717171717171717186
+:20BE0000000000000000000000000000000000000000000000000000000000000000000022
+:20BE2000000000000000000000000000000000000000000000000000000000000000000002
+:20BE40000000000000000000000000000000000000000000000000000000000000000000E2
+:20BE60000000000000000000000000000000000000000000000000000000000000000000C2
+:20BE800000000000000000000000000000000000000000000000011301F401F44B3200FF28
+:20BEA00009C4050000000D00320032005000A0053C141E080A640000006C06000000641779
+:20BEC00008191400000000000000000000000000000000000000000000000000000000002D
+:20BEE000000000000000000000000000000000000000000000000000000000000000000042
+:20BF0000000000000000000000000000000000000000000000000000000000000000000021
+:20BF2000000000000000000000000000000000000000000000000000000000000000000001
+:20BF4000000000000000000000000000000000000000000000000000001E0000000B803206
+:20BF600008060728012C0000060905040302010006070809000102030405060708090A0BD9
+:20BF80000C0D0E30003F01550000007272839555430000000C0206190F0672041A1400003B
+:20BFA000000D0003440003FF03FF03FF03FF03FF03FF03FF03FF03FF03FF03FF03FF03FF13
+:20BFC00003FF03FF000000000000000000000000000000000000000000000000000000005D
+:1BBFE00000003F0700960019012C0096012C000007D0170032250032001900D1
+:02BFFB00000044
+:02BFFD0002023E
+:01BFFF00152C
+:20853C009BFB991704460000000000000000000000000000000000009917044D000000008E
+:14855C000000000000000000000000000000492600000A0290
+:028570000804FD
+:01857200FF09
+:2083C000048480BDC30036F0000000000000000000000000000000000000000000000000EF
+:20840000820085738200B92C8200B92A8200B92E8200B9308200B92A8200B9528200B92AEB
+:208420008200B9588200B95A8200B95C8200B95E8200B96B8200B96D8200B96F8200B97140
+:208440008200B9738200B9758200B92A8200B92A8200B92A8200B9778200B9798200B97B73
+:208460008200B9A18200B92A8200B92A8200B9A38200B9AA8200B9AC8200B9AE8200A2EBB4
+:12852A00853C62000185706200F185726401008573007F
+:00FFFF0101
diff --git a/touchpad/README.md b/touchpad/README.md
new file mode 100644
index 000000000..10e9f432d
--- /dev/null
+++ b/touchpad/README.md
@@ -0,0 +1,10 @@
+# Touchpad module firmware
+
+This directory contains the firmware of the touchpad module.
+
+Unlike other modules, the touchpad modules doesn't contain a microcontroller,
+but an Azoteq IQS572 touchpad controller IC. The IC runs a special firmware
+generated by the [Azoteq IQS5XX B000 PC Software](https://www.azoteq.com/design/software-and-tools/)
+which runs on Windows.
+
+The firmware can be programmed with the Azoteq CT210A USB Dongle Programmer.
diff --git a/trackball/src/module.c b/trackball/src/module.c
index 67644cd25..a7127fc9f 100644
--- a/trackball/src/module.c
+++ b/trackball/src/module.c
@@ -42,7 +42,7 @@ key_vector_t keyVector = {
.itemNum = KEYBOARD_VECTOR_ITEMS_NUM,
.items = (key_vector_pin_t[]) {
{PORTA, GPIOA, kCLOCK_PortA, 3}, // left button
- {PORTA, GPIOA, kCLOCK_PortA, 5}, // right button
+ {PORTA, GPIOA, kCLOCK_PortA, 12}, // right button
},
};