Repository: HaoboGu/rmk (language: rust)

Issue:
Architecture upgrade, make input device - input processor - reporter decoupled with each other



Discussion / hints:

Fix patch:
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 12dfd8f5..f15c8445 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,32 +1,63 @@
 {
     "cortex-debug.variableUseNaturalFormat": false,
     "rust-analyzer.check.allTargets": false,
-    "rust-analyzer.check.overrideCommand": [
-        "cargo",
-        "check",
-        "--quiet",
-        "--message-format=json",
-        // Set the target if needed
-        // "--target",
-        // "riscv32imc-esp-espidf",
+    "rust-analyzer.check.noDefaultFeatures": true,
+    "rust-analyzer.cargo.noDefaultFeatures": true,
+    "rust-analyzer.showUnlinkedFileNotification": false,
+    // Uncomment the target of your chip.
+    //"rust-analyzer.cargo.target": "thumbv6m-none-eabi",
+    //"rust-analyzer.cargo.target": "thumbv7m-none-eabi",
+    "rust-analyzer.cargo.target": "thumbv7em-none-eabi",
+    //"rust-analyzer.cargo.target": "thumbv7em-none-eabihf",
+    //"rust-analyzer.cargo.target": "thumbv8m.main-none-eabihf",
+    //"rust-analyzer.cargo.target": "riscv32imafc-unknown-none-elf",
+    //"rust-analyzer.cargo.target": "riscv32imc-esp-espidf",
+    //"rust-analyzer.cargo.target": "riscv32imac-esp-espidf",
+    //"rust-analyzer.cargo.target": "xtensa-esp32s3-espidf",
+    //"rust-analyzer.cargo.target": "riscv32imafc-unknown-none-elf",
+    "rust-analyzer.cargo.features": [
+        // Comment out these features when working on the examples. Most example crates do not have any cargo features.
+        // "stm32f446re",
+        // "time-driver-any",
+        // "unstable-pac",
+        // "exti",
+        // "rt",
     ],
     "rust-analyzer.linkedProjects": [
         "rmk-macro/Cargo.toml",
         "rmk/Cargo.toml",
-        // Enable ONE of the following for accurate analyzation of RA
+        // To work on the examples, comment the line above and all of the cargo.features lines,
+        // then uncomment ONE line below to select the chip you want to work on.
+        // This makes rust-analyzer work on the example crate and all its dependencies.
+        // "examples/use_rust/ch32v307/Cargo.toml",
         // "examples/use_rust/esp32c3_ble/Cargo.toml",
         // "examples/use_rust/esp32c6_ble/Cargo.toml",
-        "examples/use_rust/stm32h7/Cargo.toml",
-        // "examples/use_rust/stm32f4/Cargo.toml",
-        // "examples/use_config/stm32f4/Cargo.toml",
-        // "examples/use_rust/stm32f1/Cargo.toml",
-        // "examples/use_rust/ch32v307/Cargo.toml",
-        "examples/use_rust/nrf52840_ble/Cargo.toml",
-        "examples/use_rust/nrf52840_ble_split/Cargo.toml",
-        // "examples/use_rust/nrf52832_ble/Cargo.toml",
+        // "examples/use_rust/esp32s3_ble/Cargo.toml",
+        // "examples/use_rust/hpm5300/Cargo.toml",
+        // "examples/use_rust/nef52832_ble/Cargo.toml",
+        // "examples/use_rust/nrf52840_ble/Cargo.toml",
+        // "examples/use_rust/nrf52840_ble_split/Cargo.toml",
+        // "examples/use_rust/py32f07x/Cargo.toml",
         // "examples/use_rust/rp2040/Cargo.toml"
+        // "examples/use_rust/rp2040_direct_pin/Cargo.toml"
         // "examples/use_rust/rp2040_split/Cargo.toml"
+        // "examples/use_rust/rp2350/Cargo.toml"
+        // "examples/use_rust/stm32f1/Cargo.toml",
+        // "examples/use_rust/stm32f4/Cargo.toml",
+        // "examples/use_rust/stm32h7/Cargo.toml",
+        // "examples/use_config/esp32c3_ble/Cargo.toml",
+        // "examples/use_config/esp32c6_ble/Cargo.toml",
+        // "examples/use_config/esp32s3_ble/Cargo.toml",
+        // "examples/use_config/nef52832_ble/Cargo.toml",
+        // "examples/use_config/nrf52840_ble/Cargo.toml",
+        // "examples/use_config/nrf52840_ble_split/Cargo.toml",
+        // "examples/use_config/nrf52840_ble_split_direct_pin/Cargo.toml",
+        // "examples/use_config/nrf52840_usb/Cargo.toml",
+        // "examples/use_config/rp2040/Cargo.toml"
+        // "examples/use_config/rp2040_direct_pin/Cargo.toml"
         // "examples/use_config/rp2040_split/Cargo.toml"
+        // "examples/use_config/stm32f1/Cargo.toml",
+        // "examples/use_config/stm32f4/Cargo.toml",
+        // "examples/use_config/stm32h7/Cargo.toml",
     ],
-    "rust-analyzer.showUnlinkedFileNotification": false,
 }
\ No newline at end of file
diff --git a/docs/po/zh_CN.po b/docs/po/zh_CN.po
index 04391f10..4ad6db16 100644
--- a/docs/po/zh_CN.po
+++ b/docs/po/zh_CN.po
@@ -1936,7 +1936,7 @@ msgstr ""
 
 #: src\split_keyboard.md:56
 msgid ""
-"In peripheral central, you should also run the peripheral monitor for each "
+"In peripheral central, you should also run the peripheral manager for each "
 "peripheral. This task monitors the peripheral key changes and forwards them "
 "to central core keyboard task"
 msgstr ""
@@ -2532,7 +2532,7 @@ msgstr ""
 #: src\how_to_contribute.md:41
 msgid ""
 "`KEY_EVENT_CHANNEL`: a multi-sender, single-receiver channel. The sender can "
-"be a matrix task which scans the key matrix or a split peripheral monitor "
+"be a matrix task which scans the key matrix or a split peripheral manager "
 "which receives key event from split peripheral. The receiver, i.e. keyboard "
 "task, receives the key event and processes the key"
 msgstr ""
diff --git a/docs/src/design_doc/input_device.md b/docs/src/design_doc/input_device.md
index 77388217..8deeb257 100644
--- a/docs/src/design_doc/input_device.md
+++ b/docs/src/design_doc/input_device.md
@@ -2,21 +2,19 @@
 
 The definition of input devices varies, but for RMK, we focus on two categories: keys and sensors.
 
--	Keys are straightforward—they are essentially switches with two states.
--	Sensors, on the other hand, are more complex. Devices such as joysticks, mice, trackpads, and trackballs are all sensors. They produce different data and speak different protocols.
+- Keys are straightforward—they are essentially switches with two states (pressed/released).
+- Sensors are more complex devices that can produce various types of data, such as joysticks, mice, trackpads, and trackballs.
 
-RMK’s input device framework is designed to provide a simple yet extensible way to handle both keys and sensors. Below is an overview of the framework:
+RMK's input device framework is designed to provide a simple yet extensible way to handle both keys and sensors. Below is an overview of the framework:
 
-![input_device_framework](../images/input_device_framework.svg)
-
-At first glance, the framework looks simple. However, as we delve into the implementation, intricacies emerge. In this documentation, we will focus on the left half of the diagram: `InputDevices` and `InputProcessors`. Key areas of complexity include:
-
-This design document outlines the current implementation, which aims to make RMK’s input device system clear, easy to use, and extensible.
+![input_device_framework](../images/input_device_framework.excalidraw.svg)
 
 ## Input device trait
 
 The input devices can be key matrix or sensors, which read the physical devices, send raw events to the input processors. All input devices in RMK should implement the `InputDevice` trait:
 
+All input devices in RMK should implement the `InputDevice` trait:
+
 ```rust
 pub trait InputDevice {
     /// Event type that input device will send
@@ -25,11 +23,12 @@ pub trait InputDevice {
     /// Starts the input device task.
     ///
     /// This asynchronous method should contain the main logic for the input device.
-    /// It will be executed concurrently with other input devices using the `run_devices` macro.
+    /// It will be executed concurrently with other input devices using the run_devices macro.
     fn run(&mut self) -> impl Future<Output = ()>;
 
-    /// Get the event sender for the input device. All events should be send by this channel.
-    fn event_sender(&self) -> Sender<CriticalSectionRawMutex, Self::EventType, EVENT_CHANNEL_SIZE>;
+    /// Get the event sender for the input device. All events should be sent through this channel.
+    fn event_sender(&self) -> Sender<RawMutex, Self::EventType, EVENT_CHANNEL_SIZE>;
+}
 }
 ```
 
@@ -42,17 +41,11 @@ run_devices!(d1, d2).await;
 
 > Why `run_devices!`?
 >
-> Currently, embassy-rs does not support generic tasks. So the only option is to join all tasks(aka `run` function in `InputDevice`) together. That's what `run_devices!` does.
-
-
-Another thing that need to be mentioned is that every input device defines its own `EventType`. RMK provides a default Event enum, which is compatible with built-in InputProcessors. This design balances convenience and flexibility:
-
-- For common devices, developers can use the built-in `Event` and `InputProcessor` implementations to when implementing new `InputDevice`
-- For advanced use cases, developers can define custom events and processors to fully control the input logic.
+> Currently, embassy-rs does not support generic tasks. The only option is to join all tasks (the `run` functions in `InputDevice`) together. That's what `run_devices!` does.
 
-## Event
+## Event Types
 
-The event is the output of input devices. It's defined as a non-exhaustive enum:
+Each input device defines its own `EventType`. RMK provides a default `Event` enum that is compatible with built-in `InputProcessor`s:
 
 ```rust
 #[non_exhaustive]
@@ -75,42 +68,32 @@ pub enum Event {
 }
 ```
 
-The `Event` aims to include raw outputs of all commonly used input devices, such as mice, trackpads, joysticks, etc. It also provides a stream-like axis event representation `AxisEventStream`, which can be used for a multiple-axis device where the number of axes is not known. Note that when using this, the `Eos` should be sent the indicate the end of the event sequence, otherwise the `InputProcessor` would wait for the next event forever.
+The `Event` enum aims to cover raw outputs from common input devices. It also provides a stream-like axis event representation via `AxisEventStream` for devices with a variable number of axes. When using `AxisEventStream`, the `Eos` event must be sent to indicate the end of the sequence.
 
-## Input processor trait
+## Input Processor Trait
 
-The input processors receive the event from input devices, process them and convert results to HID reports for USB/BLE transmission. All input processors should implement the `InputProcessor` trait:
+Input processors receive events from input devices, process them, and convert the results into HID reports for USB/BLE transmission. All input processors must implement the `InputProcessor` trait:
 
 ```rust
 pub trait InputProcessor {
-    /// The event type that the input processor receives.
+    /// The event type that the input processor receives
     type EventType;
-
-    /// The report type that the input processor sends.
+    
+    /// The report type that the input processor sends
     type ReportType;
 
-    /// Process the incoming events, convert them to HID report [`KeyboardReportMessage`],
-    /// then send the report to the USB/BLE.
-    ///
-    /// Note there might be mulitple HID reports are generated for one event,
-    /// so the "sending report" operation should be done in the `process` method.
-    /// The input processor implementor should be aware of this.  
+    /// Process incoming events and convert them to HID reports
     fn process(&mut self, event: Self::EventType) -> impl Future<Output = ()>;
 
-    /// Get the input event channel receiver for the input processor.
-    ///
-    /// The input processor receives events from this channel, processes the event,
-    /// then sends to the report channel.
-    fn event_receiver(
-        &self,
-    ) -> Receiver<CriticalSectionRawMutex, Self::EventType, EVENT_CHANNEL_SIZE>;
+    /// Get the input event channel receiver
+    fn event_receiver(&self) -> Receiver<RawMutex, Self::EventType, EVENT_CHANNEL_SIZE>;
 
     /// Get the output report sender for the input processor.
     ///
     /// The input processor sends keyboard reports to this channel.
     fn report_sender(
         &self,
-    ) -> Sender<CriticalSectionRawMutex, Self::ReportType, REPORT_CHANNEL_SIZE>;
+    ) -> Sender<RawMutex, Self::ReportType, REPORT_CHANNEL_SIZE>;
 
     /// Default implementation of the input processor. It wait for a new event from the event channel,
     /// then process the event.
@@ -127,4 +110,9 @@ pub trait InputProcessor {
 }
 ```
 
-The `process` method is responsible for processing input events and sending HID report to the report channel, which is available by `get_report_channel`.
+
+The `process` method is responsible for processing input events and sending HID reports through the report channel. All processors share a common keymap state through `&'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>`.
+
+This design balances convenience and flexibility:
+- For common devices, developers can use the built-in `Event` and `InputProcessor` implementations
+- For advanced use cases, developers can define custom events and processors to fully control the input logic
diff --git a/docs/src/device.md b/docs/src/device.md
index 7c0a7d96..47697c34 100644
--- a/docs/src/device.md
+++ b/docs/src/device.md
@@ -22,3 +22,63 @@ Except keyboard and rotary encoder, the others protocol/implementation depend on
 
 The encoder list is represented separately in vial, different from normal matrix. But layers still have effect on encoder. The behavior of rotary encoder could be changed by vial.
 
+# Input Devices
+
+RMK supports various input devices beyond just key matrices. The input system consists of two main components:
+
+## Input Devices
+
+Input devices are physical components that generate input events. These can include:
+- Rotary encoders
+- Touchpads
+- Direct input pins
+- Key matrices
+
+Each input device implements the `InputDevice` trait, which requires:
+- An associated `EventType` that defines what kind of events this device generates
+- A `run()` method containing the device's main logic
+- An `event_sender()` method to get the channel for sending events
+
+Example implementation:
+
+```rust
+struct MyEncoder;
+impl InputDevice for MyEncoder {
+    type EventType = EncoderEvent;
+    async fn run(&mut self) {
+        // Read encoder and send events
+        let event = EncoderEvent::Clockwise;
+        self.event_sender().send(event).await;
+    }
+}
+```
+
+## Input Processors 
+
+Input processors handle events from input devices and convert them into HID reports. A processor:
+
+- Receives events from one or more input devices
+- Processes those events into HID reports
+- Sends the reports to USB/BLE
+
+The `InputProcessor` trait defines this behavior with:
+
+- Associated types for the events it handles and reports it generates
+- A `process()` method to convert events to reports
+- Channel getters for receiving events and sending reports
+
+<!-- 
+## Running Multiple Devices
+
+RMK provides macros to run multiple input devices and processors concurrently:
+```rust
+// Run multiple input devices
+let encoder = MyEncoder::new();
+let touchpad = MyTouchpad::new();
+
+// Run multiple processors
+let encoder_proc = EncoderProcessor::new();
+let touchpad_proc = TouchpadProcessor::new();
+
+join(run_processors!(encoder_proc, touchpad_proc), run_devices!(encoder, touchpad)).await;
+``` -->
diff --git a/docs/src/faq.md b/docs/src/faq.md
index 95a52304..74c4b768 100644
--- a/docs/src/faq.md
+++ b/docs/src/faq.md
@@ -164,3 +164,6 @@ If you're comfortable with nightly Rust, you can enable `nightly` feature of emb
 
 By default RMK uses last 2 sectors as the storage. If your bootloader is placed there too, RMK will erase it. To avoid it, you can change `start_addr` in `[storage]` section of your `keyboard.toml`, or change `storage_config` in your [`RmkConfig`](https://docs.rs/rmk/latest/rmk/config/struct.RmkConfig.html) if you're using Rust API.
 
+### What font is used for the RMK logo?
+
+It's [Honk](https://fonts.google.com/specimen/Honk?categoryFilters=Technology:%2FTechnology%2FColor&preview.text=RMK).
\ No newline at end of file
diff --git a/docs/src/how_to_contribute.md b/docs/src/how_to_contribute.md
index a43a6d32..79790c79 100644
--- a/docs/src/how_to_contribute.md
+++ b/docs/src/how_to_contribute.md
@@ -33,7 +33,7 @@ So, if you want to contribute new features of RMK, just look into `rmk` core cra
 Generally, there are 4-5 running tasks in the meanwhile, according to the user's config. Communication between tasks is done by channels.There are several built-in channels: 
 
 - `FLASH_CHANNEL`: a multi-sender, single-receiver channel. There are many tasks send the `FlashOperationMessage`, such as BLE task(which saves bond info), vial task(which saves key), etc.
-- `KEY_EVENT_CHANNEL`: a multi-sender, single-receiver channel. The sender can be a matrix task which scans the key matrix or a split peripheral monitor which receives key event from split peripheral. The receiver, i.e. keyboard task, receives the key event and processes the key
+- `KEY_EVENT_CHANNEL`: a multi-sender, single-receiver channel. The sender can be a matrix task which scans the key matrix or a split peripheral manager which receives key event from split peripheral. The receiver, i.e. keyboard task, receives the key event and processes the key
 - `KEYBOARD_REPORT_CHANNEL`: a single-sender, single-receiver channel, keyboard task sends keyboard report to channel after the key event is processed, and USB/BLE task receives the keyboard report and sends the key to the host.
 
 ### Matrix scanning & key processing
diff --git a/docs/src/images/input_device_framework.drawio b/docs/src/images/input_device_framework.drawio
deleted file mode 100644
index b476cebc..00000000
--- a/docs/src/images/input_device_framework.drawio
+++ /dev/null
@@ -1,88 +0,0 @@
-<mxfile host="65bd71144e">
-    <diagram id="KHJxcRW501o7JvBhlY4s" name="第 1 页">
-        <mxGraphModel dx="1137" dy="862" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
-            <root>
-                <mxCell id="0"/>
-                <mxCell id="1" parent="0"/>
-                <mxCell id="6" value="" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
-                    <mxGeometry x="80" y="220" width="180" height="450" as="geometry"/>
-                </mxCell>
-                <mxCell id="2" value="key matrix" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#f8cecc;strokeColor=#b85450;shadow=0;" parent="1" vertex="1">
-                    <mxGeometry x="110" y="260" width="120" height="60" as="geometry"/>
-                </mxCell>
-                <mxCell id="3" value="encoders" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#f8cecc;strokeColor=#b85450;shadow=0;" parent="1" vertex="1">
-                    <mxGeometry x="110" y="360" width="120" height="60" as="geometry"/>
-                </mxCell>
-                <mxCell id="4" value="mice" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#f8cecc;strokeColor=#b85450;shadow=0;" parent="1" vertex="1">
-                    <mxGeometry x="110" y="460" width="120" height="60" as="geometry"/>
-                </mxCell>
-                <mxCell id="5" value="trackpads" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#f8cecc;strokeColor=#b85450;shadow=0;" parent="1" vertex="1">
-                    <mxGeometry x="110" y="560" width="120" height="60" as="geometry"/>
-                </mxCell>
-                <mxCell id="7" value="Input devices" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;shadow=0;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;" parent="1" vertex="1">
-                    <mxGeometry x="105" y="180" width="130" height="30" as="geometry"/>
-                </mxCell>
-                <mxCell id="9" value="" style="shape=flexArrow;endArrow=classic;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="6" target="10" edge="1">
-                    <mxGeometry width="50" height="50" relative="1" as="geometry">
-                        <mxPoint x="580" y="510" as="sourcePoint"/>
-                        <mxPoint x="440" y="445" as="targetPoint"/>
-                    </mxGeometry>
-                </mxCell>
-                <mxCell id="10" value="" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
-                    <mxGeometry x="440" y="220" width="180" height="450" as="geometry"/>
-                </mxCell>
-                <mxCell id="11" value="key processor" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#f8cecc;strokeColor=#b85450;shadow=0;" parent="1" vertex="1">
-                    <mxGeometry x="470" y="260" width="120" height="60" as="geometry"/>
-                </mxCell>
-                <mxCell id="12" value="encoder processor" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#f8cecc;strokeColor=#b85450;shadow=0;" parent="1" vertex="1">
-                    <mxGeometry x="470" y="360" width="120" height="60" as="geometry"/>
-                </mxCell>
-                <mxCell id="13" value="mice processor" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#f8cecc;strokeColor=#b85450;shadow=0;" parent="1" vertex="1">
-                    <mxGeometry x="470" y="460" width="120" height="60" as="geometry"/>
-                </mxCell>
-                <mxCell id="14" value="axis processor" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#f8cecc;strokeColor=#b85450;shadow=0;" parent="1" vertex="1">
-                    <mxGeometry x="470" y="560" width="120" height="60" as="geometry"/>
-                </mxCell>
-                <mxCell id="15" value="Input processor" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;shadow=0;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;" parent="1" vertex="1">
-                    <mxGeometry x="465" y="180" width="130" height="30" as="geometry"/>
-                </mxCell>
-                <mxCell id="16" value="Event" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;shadow=0;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;" parent="1" vertex="1">
-                    <mxGeometry x="320" y="410" width="60" height="30" as="geometry"/>
-                </mxCell>
-                <mxCell id="17" value="" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
-                    <mxGeometry x="770" y="345" width="180" height="200" as="geometry"/>
-                </mxCell>
-                <mxCell id="20" value="USB" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#f8cecc;strokeColor=#b85450;shadow=0;" parent="1" vertex="1">
-                    <mxGeometry x="800" y="370" width="120" height="60" as="geometry"/>
-                </mxCell>
-                <mxCell id="21" value="BLE" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;fillColor=#f8cecc;strokeColor=#b85450;shadow=0;" parent="1" vertex="1">
-                    <mxGeometry x="800" y="460" width="120" height="60" as="geometry"/>
-                </mxCell>
-                <mxCell id="22" value="Reporter" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;shadow=0;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;" parent="1" vertex="1">
-                    <mxGeometry x="795" y="300" width="130" height="30" as="geometry"/>
-                </mxCell>
-                <mxCell id="23" value="" style="shape=flexArrow;endArrow=classic;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" edge="1">
-                    <mxGeometry width="50" height="50" relative="1" as="geometry">
-                        <mxPoint x="620" y="444.5" as="sourcePoint"/>
-                        <mxPoint x="770" y="445" as="targetPoint"/>
-                    </mxGeometry>
-                </mxCell>
-                <mxCell id="25" value="" style="shape=flexArrow;endArrow=classic;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;" parent="1" target="28" edge="1">
-                    <mxGeometry width="50" height="50" relative="1" as="geometry">
-                        <mxPoint x="960" y="445" as="sourcePoint"/>
-                        <mxPoint x="1060" y="445" as="targetPoint"/>
-                    </mxGeometry>
-                </mxCell>
-                <mxCell id="27" value="host" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;shadow=0;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;" parent="1" vertex="1">
-                    <mxGeometry x="1065" y="370" width="130" height="30" as="geometry"/>
-                </mxCell>
-                <mxCell id="28" value="" style="fontColor=#0066CC;verticalAlign=top;verticalLabelPosition=bottom;labelPosition=center;align=center;html=1;outlineConnect=0;fillColor=#CCCCCC;strokeColor=#6881B3;gradientColor=none;gradientDirection=north;strokeWidth=2;shape=mxgraph.networks.laptop;rounded=1;shadow=0;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;" parent="1" vertex="1">
-                    <mxGeometry x="1080" y="417.5" width="100" height="55" as="geometry"/>
-                </mxCell>
-                <mxCell id="29" value="Report" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;shadow=0;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=16;" parent="1" vertex="1">
-                    <mxGeometry x="660" y="410" width="60" height="30" as="geometry"/>
-                </mxCell>
-            </root>
-        </mxGraphModel>
-    </diagram>
-</mxfile>
\ No newline at end of file
diff --git a/docs/src/images/input_device_framework.excalidraw.svg b/docs/src/images/input_device_framework.excalidraw.svg
new file mode 100644
index 00000000..6d5dbc46
--- /dev/null
+++ b/docs/src/images/input_device_framework.excalidraw.svg
@@ -0,0 +1,21 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1256.3877344474415 642.3644322258489" width="1256.3877344474415" height="642.3644322258489">
+  <!-- svg-source:excalidraw -->
+  <!-- payload-type:application/vnd.excalidraw+json --><!-- payload-version:2 --><!-- payload-start -->eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1daXPiyLL9Pr/C0ffroKl9uVx1MDAxMS9eXHUwMDE4vGPjXHUwMDA144V5N1x1MDAxY1x1MDAwMlx1MDAwNMgswiBs7Fx1MDAxYvPfX1x1MDAxNu42XHUwMDAyJFx1MDAxMNjCcnd7etpugVFVKU+ek1lVWf/9Y2vrm//cc779e+ubM6rabbfWt5++/WmuPzr9get14SUy/vfAXHUwMDFi9qvjdzZ9vzf4919/dex+y/F7bbvqWI/uYGi3XHUwMDA3/rDmelbV6/zl+k5n8L/m74Ldcf6n53Vqft+a3CTj1Fxc3+u/3stpO1x1MDAxZKfrXHUwMDBm4NP/hn9vbf13/HegdXa/7702bHx50jghyOzVgtdcdTAwMWQ3VFGtXGJRVL69wVx1MDAxZOzArXynXHUwMDA2r9ahuc7kXHUwMDE1c+lb8abdrzYzZ8Nyp4X9h93b81x1MDAxN+xN7lp32+2i/9xcdTAwMWW3aOBBRyavXHL8vtdyrt2a3/wxZIHrUb/V94aNZtdcdTAwMTmYnuO3q17Prrr+s7mG0NtVu9tcdTAwMTh/xuTKXGL+RbW0KKKMIEw4lpS/vWp+n1JtccJcYsZcXDEmKJ5pV85rwzOAdv1cdTAwMGI75r9Jyyp2tdWA5nVrb+/x+3Z30LP78KQm73v63mO4tSW5popcdTAwMGIkJUd6cqum4zaavlx1MDAxOVx1MDAxNYsxpFx0dIpiXHUwMDBlX3jyZFx1MDAwNs74oXDCJSaIsLdcdTAwMTdMXHUwMDFieoe1sWn8Z/Ik+mBUh+Y3usN2Ozic3dr34fxhQlx1MDAxMyNcIt+v/DPppHn/7qzxXHUwMDA1XHJwylxifWc06XnAbMp3pdNi4+po+HBbXHUwMDFmlW61s7fL5Le39/3z/adJ84e9mv1qhTBsWjEuOFeBTrfdbmu2b22v2lxuMdyBb/f9rNutud3GdK+/g2o8St/2iXdY9i5FZdQ8cS73sieFi4xcdTAwMTfoy7e6V1x1MDAxZJohQFx1MDAxNsJCYiRcdTAwMTThmsOzmNiMeVx1MDAxYXbPWJUlXHRFmGGKqcDwxeZG1unWljdq0KGFpyNcdTAwMTeXOqX63U51d9SuvXSiXHUwMDFhhYlQXG5jMC7CpEBsrlVcbqxcdTAwMGIskGnJJaJazDeqbVx1MDAwZvyc1+m4Plxm/pnndv3ZQVx1MDAxZY/mtvE1TceeMy/oVPC1WafUM584bUZ/XHUwMDA3jFx1MDAwNVx1MDAwNS1cdTAwMDe9/fyfP0PfXHUwMDFkjSfzlZmH0uRcdTAwMDP/XGJ+/977OYc6ZctcdTAwMDF/SmmUO8UwqJRhXHUwMDFlcFwiy/xpODBS7U9cdTAwMTnnXHUwMDE2w0xq8JpcboyITMZj7FCJsJRmXHUwMDAyhoFQcFZEJOZRubLg+cuJQ5/40Ymn+O43MVLAc0KqSWvXdpxTL8x5yEScWN3r+kX3Zeyk0dTVPbvjtsdcdTAwMDP/dnlsuTB4u49Tw2Yub7fdhjHib1V4yelP2bfvgvR4e0PHrdXagYdThXvZbtfpXHUwMDFmxlx1MDAxMVx1MDAwMl7fbbhdu31cdTAwMTneXHUwMDE06Llz8ONhYYtcdTAwMDRMYOCYXHUwMDE3x/1cXFxiz0i9Q4icvfpcdTAwMDOgXHUwMDFjRFx1MDAwMFdglbHxebf7oOTt0Vx1MDAxOXDC4dn+YPdo53TvOd34lFxuWYRcbi0oQUpcdTAwMTA1sbdXvSMtXHUwMDA1YMDwXHUwMDA28JqMJlx1MDAwN0+stKWRxNBcdTAwMTBoXHUwMDBlXHUwMDA1YppcdTAwMDcqslxmLLlcdTAwMDZ3IaWARzcneISWUlNw5F9K8NReKoV++1x1MDAwMVx1MDAxZOy8ZDry6kpcdTAwMTbunXy6XHUwMDA0T2xtkVx1MDAwMXGBjLjQICu4XHUwMDAy0UPVJKZ4U1x1MDAxN3g9iZPZLXVuVb54XFxjT7d2Rt5l7tqPkc2QXHUwMDFhWqI5XHUwMDAy+Vx1MDAwNVx1MDAxY1x1MDAxNKJxtEWEQEQrxID/+VfXOJFcdTAwMTBcdTAwMWH/+lx1MDAxY3g+SOJcdTAwMTBcdTAwMTXlQSVcdTAwMTeCKsUmZLPMg4YjIdVcdTAwMWVcdTAwMTTCYlx1MDAxOHWqNEFcdTAwMTJxXHUwMDEwzHNcdTAwMDKHgJRcdTAwMDB5T5hWKuBgP9qDSmRRTOLpXHUwMDFiSjBnXHUwMDFhf4Sf/Cr65sLpef2kXHUwMDA0zlx1MDAxMuafXHUwMDE1OLNt+Vx1MDAwMIXTd6r+q4GGQFRcdTAwMDR09WxcdTAwMTjCuMZKaVx1MDAxYz+ts9hcdKdcdTAwMTKkWmpcYkNcdTAwMTDmgkxndCA4tzhcdTAwMDHdI5SgXHUwMDFjXHUwMDAyleRcdTAwMDSO1lx1MDAxMOdcdTAwMGLTXHUwMDAyNP6amOhcdTAwMWJSKUNcdTAwMTZcdTAwMTDSdDO/Y1x1MDAxNvyL4lghnYS0oetKmzjCd8pOX1x0MFFtsz5OqIjkMozhXHUwMDAxMCx5/HBcdTAwMDBlhlx1MDAxN/nOXs63h8OqKrZcdTAwMGLPe91SunHCtbKAtVx0eFx1MDAwNLDUoN43v59cdTAwMTHcwlRKXHRRvVSYKZ5cdTAwMWNaXHUwMDA0tlx1MDAxNMNEcoWBVFHgwbyhRVx0i0tcdTAwMGXRXHSn2LyPzEFcdTAwMDYzoz9oXCLRwNqQWVx1MDAxNlxyXGaOjoZNNmheiZJ33kHHuYOjRiaAmD/DP/b1l3ONXHUwMDA2ucqVsyxfujrKXHUwMDFjieH5/rVKJ1x1MDAxMiP1JIsmKyqR0Fx1MDAxOOn4ijJ8NFNcckLBXHUwMDE4cFx1MDAxMlx1MDAxMlxiYm7KqJ7GIKWW4ohAaK6xpmD26Vx1MDAxMJRKUtC+9Fx1MDAwM9jpq1xiypbz3IEoMlx1MDAxOUG5hDtmXHUwMDA15Wxbklx1MDAxNpRcdTAwMTA8RGHUXHUwMDA0/dykc2NDdPFkSiohXG7IXHUwMDAzXHUwMDE0UlxibZmmwDzTWW0jKscpNSBQTiRcdTAwMGKQV9pUJYZfRlojPfG5QeBOWO+g391to/OLnZvBnSzdO3s2q1x1MDAxY/1gj89Vn4uzy1NG/dmct1x1MDAxMFRYRlx1MDAxMlx1MDAxZkFcdTAwMTIjI2XiR2mF6+vTXHUwMDA3cj9UXHUwMDA3rcbooJd3bD1qpVx1MDAxYlVcdTAwMDRDMMbBVFx1MDAwNVx1MDAwNtFHMCFTsIJcdTAwMDBcYjQhk1oorVx1MDAxNE5yslxiJCW0RFx1MDAwMWhcdTAwMDRcdTAwMTVCXHUwMDAxXHUwMDE5h8FqXHUwMDBlTFx1MDAwNGlikuVyXHSYhvWrTvFqdDNo6uebk1x1MDAxN5Xld5eHwTRmKtG2TLju79pu/Tq7k7+/u7zK5Vx1MDAwYqdcdTAwMTSLx1x1MDAxNFxuTFx1MDAxY01eXHUwMDE42lx1MDAwMLJcbq8wKVx1MDAxYt7rdOOMSYuB21x1MDAwNy1NTXZ+JidCsLBIXHUwMDEwZ8klRbSZlZ+HXHUwMDE21tZcXDCHXHUwMDE1XHUwMDE14Fx1MDAxNVQgXHUwMDAw/3Rwfa5UxWLq6mKputWx/b47SkiuLiGbXHUwMDEwuTrXnjiSXHUwMDE183ewK1+Q22FKQbCl47Or6+9cdTAwMGazmX1vvz1cdTAwMWG0XHUwMDA3NVStl553Uo76JewqmCVcdTAwMTln4Fx1MDAxMbhcdTAwMTZcdOZB16NWriHkXHUwMDE1VIdcdTAwMDeYPzu14vvbblx1MDAwYjVcdTAwMGZcdTAwMGbszN1B1s3zZ+dcdTAwMDalkVppJMgowFx1MDAwYlFE4+dPwzudboxcdGxxXHUwMDAyXHUwMDAxV1x1MDAwNLNKYuFccmBMcEuEJW5CeZWaZX46YqnTb1pdQKtOt+rVgrT5oZy6hGJmOXWuMUlcdTAwMTMqXHTMXHUwMDFlz4WrWEuOXHUwMDE4j59cdTAwMDRS/n22wNnzkX1UqNmnd+12dYenXHUwMDFj7ItcdJVcdTAwMTJkXHSQ2Vx1MDAxMlx1MDAwMcnx6dVKqeBUk5hSTP2i0apTv3HPXHUwMDFhtYuj65f66Cx72Lt4Ru1cdTAwMTRSKkGROzKwXHUwMDA0QaQwwfGj1fBep1x1MDAxYmZcXFiK8qholVx1MDAxMmWhIMxcdTAwMTJcXGFcdTAwMTObUlx1MDAxNfg+jORvTl2ZU31vWG327FpCpLqEZmZJdb41ibOqQrNXJ8kps2eAaFx1MDAxNVx1MDAxZu76unHe6uyjl+pTaXDh7NZcXFohKYf7mFW1QvCD1pJMT39SKSwqMISCiFEsZYI7sNZMXHUwMDAxm6VETKQpS7VBUj2qe8Wd7dHxXHUwMDE5kmf7lb1CuX+7l/DWrfVIdUEyXGKknJZCr7DQJ7zX6UaZRJZcdTAwMDbTRsSEfpjqmX05ilpyIzBjQO5xedXsZCRcZkg+RYr1q/Bqx1x1MDAxYlx1MDAwZZyESHVcdMvMkupMU5JmVFx1MDAxYVx1MDAxOOU5rFOltMnWxMa6LPiivVu+2lx1MDAwNtup+pfDM5UvXHUwMDBmUo71xXEqo2b3o6TwPyOEqFx1MDAwNKd71uRU83Yp0C9cdTAwMWGo7j9mX3hcdDsnx/Xzy9v+Tfd+fzhKIadSXHUwMDE0mVx1MDAwZqJMSSrkKrOqoZ1ON8zMVjpcdTAwMTmZ+2VUWypcYrPk4lSIiEPX7YVxKjdb+7TAKcLWV6FUy7JcdTAwMTJcItQlJDNLqFNcckmaToWKls5KU400kvHnUVx1MDAxN+8rTCXOudRcdTAwMTbHiCGTcprbMmvW/mEhzJ5cdTAwMWHFzVx1MDAwZcj0rv0jVEvMZMQmsFx0sp+P2UWdlkp3ddJyWl3svryw/c9mzXcv/ftz0ee+Y0PLws/9QsvzXHUwMDE3a2pcdTAwMWNZ14KCvpNC8fiS2ttRLVe19uTNcYtdKq922JcpX/8rXHUwMDEwtVxipqBLKUWUyvmFiphyTbGmgC+NU5el4ohrxoD2l0CfP9GdZz+3XXSdfKMmKneSv1SCrJ9K37BMUXees3J44Fx1MDAxZFx1MDAxNI7vXHUwMDFhXHUwMDE3dVx1MDAwN1+iTCWNO2EoilxcXHUwMDEwLKRkXHUwMDFhXHUwMDAyuvhcdTAwMTOs4Z1ON8pAsFwiXHUwMDBlZsowXHUwMDAzp6JmUIa5xYMom23YXHUwMDA3oozg+FkqjKWkJMa86lx1MDAwNsH1VSS1WVx1MDAxONjre1VotZfUuooldFx1MDAxM7ZWMaRJic9cdTAwMDPpyMI0prrGeC9AfIo9P9zO+jhTYY+u02vddFxuo5NaP+XgX0yxglpKUKRN6lpcdTAwMTGsXHUwMDEz3IpcdTAwMWGHYidtf9tYY0peMcJT5Fx1MDAwNTZIsaJ+fjtcdTAwMTQ8d1PlpOfvXHUwMDE32+1K6S6FXHUwMDE0S3T0ZlOBTflcdTAwMTJC4sMsvNfphlx1MDAxOaGWXHUwMDA0Q43gWGFK5Fx1MDAwNGCWXHUwMDFjyjCx4lx1MDAxMiwhQmpOflx1MDAxZYLlK5j5+1xi9vsqwTGjJcSvS7gmYt3iTItcdTAwMTKfXHUwMDE04tH0ylx1MDAxNMVcdTAwMWOvslLZf+DbT4Untu/rkn3UL+6wSlenXHUwMDFj91x1MDAwYulcdTAwMTU0taXhXCLiypSBYIGVTCmJYCU3pVJpilxcwFx1MDAwNtlVbr/c3L7s3J6/1E/8vWJr1L/KtlZn11XczlrsSkXkYiYqqeSUifhTQuGdTjnItFx1MDAwNVRcdTAwMTVcdTAwMTHAUlwiLVx1MDAxYVx1MDAwNFlyXHUwMDE4M1nguDNCXHUwMDA0XHUwMDEzZKBFlm21+U2vc/Q6XtqQeFx1MDAwNLuEbkLXW3xGXGbLcORGW8YoVlx1MDAxYan4+Std7Yjd4qWjs6z/Mlx1MDAxNM/XOSd/mnb4XHUwMDFijtWUI6pcdTAwMDTWarqaXHUwMDEy+D+LSaXhdZMw0jh129mZXCLKTNz/mlniYlx1MDAxOVc7N8+Edi/O91RcdPW2e1x1MDAwNzqFJMtw5IQsQXpcXO9cXMSXsuG9TjfMMLNATlxiU16fcapnYKaIpYIwS27dXHUwMDA1yGkrLstKXHTeUbKIcn6/SXZcdTAwMDHJ2iN3kDjHLqGbWY6NalPiXHUwMDE0XHUwMDFirbDNXHUwMDExJuDs9VxulZjKR1x1MDAwZs1Ro1xcae6MZP9cdTAwMTJccmTNO0j5rvbFcSyoXGZLUsWklqZgIUrbRKypkk05UynyXHUwMDAyXHUwMDFiZNjm0fZcdTAwMTXVOfRUblfqzcbewf5RZY1d7ckzLF1QkVBhiGJXmYhccu91ukEmiDnFg1JcdTAwMWRcdTAwMTbHwvBsXGJklFvTK5lcdTAwMTaVJMSIgPRBZNlOnF+GYeOXNkxuZeNcdTAwMTKGeffKxvdcdTAwMTQ1XFww4yrB6ISmMn62qlHebu32Om5l362r6l252lx1MDAxZHYr6UY5vFx1MDAwM1lYj4+gwlxcXHUwMDA1z1x1MDAxM1x1MDAxYn+ARlx1MDAxNoRcdTAwMTPUlNQ1h1xi0HflhP9VrztVrcOIVFx1MDAwMciZKZxcYjSqRSD6nFxiaqosrYE5iTSnXHUwMDA3XHUwMDA1Pc6P0JVcIrOFMKJcdTAwMWXpXHUwMDA021fbTbNcdTAwMTSP9OVhPnfYulx1MDAxZPBS+XlzvLkxaltcXFx1MDAxYYlF7znVZoTxKkt662V5z6p29enxtpq/XHUwMDFmnZ9cdTAwMGZGOOV52jnLn1x0IVx1MDAxObdcdTAwMTBDxJTj5UCB71polLDhI0kgslx1MDAxNHTZ1vNPNvxwwfhqQL3bh7PTnVx1MDAwM/u+2uryvlvaK1x1MDAxNW/LXHUwMDFmukg2ccW4oI480lx1MDAxMv6scuxb5viOy64un1T2RrXrXGZtbXdcdTAwMGIpj8owosiSgCPFKFx1MDAxZtfumlx1MDAwNlx1MDAxNFJcdTAwMTZAjlBcdTAwMDZGzFx1MDAwNWPJUMkq1Vx1MDAwNVx0XHUwMDE2KE6u8+Nw81XSLdnj3a2nvuuvX+jI93pRgnCq1bPqL+zOXHUwMDFmkFCJLl5cdTAwMTZNg4gpY8YkPmqv+95F76HnKdFFXHUwMDE3V/lcdTAwMDa9y/X3U49aYmGpqJKEU+CZmVx1MDAxZGxcdTAwMDIwjYBcYrFCSjDyrjjvQ0DLgOdMxndcdTAwMTlo84NWpXt2U9hul8mgrq63Je6f/dSgLVx1MDAxNbOfXHUwMDA02rA7J75YVkbyrTaHwCG0QomkwpnM7OLWJT8ke/Xuw8vBxdXdWsCdxUeSwDW1xoC+NCVcdTAwMDCJmTPIXGJcdTAwMTKAW0ypNGexKSVcdTAwMTPSr1iANoXQXHUwMDEwmW1lXHUwMDFj65BcdTAwMTNcdTAwMWNJXGKKxbiu5/KlPC+DsvMgj4YsT55cdTAwMWZcdTAwMWNJ+pnRw/lnK9ZlKU61dz26cy67g8pp4b51VVx1MDAxOJyXascpXHUwMDE0rNFcdTAwMDBcIkJcIkVXOXIlvM8pXHUwMDA3kDnaiDCslWRcdTAwMWHDt2lcdTAwMDRhvFx0XHUwMDA0rbJvXHUwMDFia4pcdTAwMDQlSi7LcHxcdTAwMWNsvlxu97Wc53VJb1mZ68XUXHUwMDEwsnVkgytaSeSWTKBcdTAwMDcqXHUwMDE4JSvsyVx1MDAxY9Sb+PSw+NxcdTAwMWKeNNF27rxd8LfXKse5YVx1MDAxMlQmikNSQNA5Q4JUW1xcXHTOkFBcXMBcdTAwMGbvWm334SRoXHUwMDE2Q1x1MDAxOSekl+VtviRcdTAwMGLmTu4vyE2ve3fWvSvs7aLd7M7TXHUwMDFhJUySZ0FcdTAwMWVcdTAwMDUhRc3xrcFV48tcdTAwMTBcdTAwMTTe55QjXGJcIjww3fF0XHUwMDA3UjNcdTAwMWNoTiVLXHUwMDFlQFTG3lx1MDAwNqIk5mbK/zdcdTAwMDH+MO/vvPPo2u2EXHUwMDE4cFx0L8wy4HRLXHUwMDEyp8BcdTAwMDVpV4VcdTAwMTlebVx1MDAwNu+6WXi8v9rO7bRvMsNrvZMttCq5tFx1MDAwM3gmXHUwMDBlnHzMa/l5ZE7MZJxpOn7Du1acvotcdTAwMDPnN0xcdTAwMTJsJi6oXnrCw5dkwJOc2L1mjb1tb1AsjLSbu2u6XHUwMDE3aWTAaFx1MDAwNFx0XHUwMDA17lbTXHUwMDE1XHUwMDBlSVx073TKXHUwMDExxLllQsDXQHBmN6Tkm8DPKiUxmdZSMyp+R4GzJJhkwcsl1PDZXHUwMDA1L2l0JKhcdTAwMThcdTAwMTAhkSuUXHUwMDBlOLi2L/lJuXffyPeeOsXu7o5TpWlcdTAwMDfxQlx1MDAxYVx1MDAwNFx1MDAxNW8hkFx1MDAwM1xumWRcdTAwMGVD76rQlUAkyFxyXFzQ0lx1MDAxOXzRut3bJbicvW9ccnn7XHUwMDFlfii6V2nnwSc7/5K7OTktuUNsk+6e2POeXHUwMDBlU8iDOFx1MDAxYUOaMiq1WiEhXHUwMDFh3umUQ2gqITqzcVGQXHJcdTAwMDBopWwopVx1MDAxY09tU05cdTAwMWEzX4VcdTAwMDaTS4YuIYbPTYYumM9cdTAwMTgvPNFcdTAwMTLF17Hb9lNxu5/pPN1wgFVBu8d5cpl2/C5KhlKlLbMjSlFcdTAwMDHMRJV4156oj6dAzLQkpoE/I1x1MDAwNVx1MDAxZbTvatuif3TV8GxKzjpe7Tybxn2FXHUwMDBilsOYY1i1UiuUTVx1MDAwZu90yiG0IFx1MDAxYlxuonJcdTAwMTNcYlohXHUwMDFiilx1MDAwMemYK7ZsLcyvR4FcdKZDlzDD56ZDWfSMICVcdTAwMTj+rHJw2GmmNTiqOt5j5/Tyocxzxebwbq3t96lcdFx1MDAwM5lhSKWIWeFOXHUwMDAwOu+qIPfByVDQs2ZNOlObQ/NcdTAwMDZcdTAwMTmwUi618lx1MDAxN6fPXr56dKGuWbudXHUwMDFmrXFQ/Fx1MDAwNlx1MDAxODD65Fx1MDAxMCrAaFx1MDAxMCXxd9aH9zrlXGJakFxyZURYJHH8rJJcZlVcdTAwMTCRUrpB1fhVXHUwMDE4MMlcXOhcdTAwMTJiSD5cdTAwMTf6ulx1MDAwNyQsXGKkkeVnzIlcdTAwMTdcdTAwMTTkW3z+W1xcuT2Vy7mF1JYmZkNcdTAwMTMyXHUwMDE1qOjMfD6xXHUwMDE4lVx1MDAxNFx0XHImyYAhk8EvsVxiXHUwMDEzmnLNuIZcdTAwMTFcdTAwMGZcdTAwMTDaXHUwMDA0yoxa3Kx/0UhcdTAwMTDJWLAlP6q9mUNTwFxyhU9zvJPnSFI8V1x1MDAxZT1dXHUwMDFmd05ZXHUwMDEx5Y7FYVx1MDAxZO9mKq1usjxcdTAwMTd4hnbfz7rdmtttTPfaee3XK3pRZniR7+zlfHs4rKpiu/C81y1cdTAwMDX6XHUwMDAynqU6NEOQQVx1MDAxNjJFwUwpM6xN81x1MDAwMlVlzPOwe6bZc0PpdGvLW7H4XHUwMDE0kJlWMLBcdTAwMTFT1MZskdNcYoU0wsJcZnFNXHUwMDE0M0eRaJBSc61q21x1MDAwMz/ndTquXHUwMDBmw33muV1/dljH47dtXFxL07HnXGZcbnpcdTAwMTV8bdZcdTAwMDf1zCdOXHUwMDFizt9cdTAwMDHzQEFbQW8//+fP0HdnXCIhZL7mwTP5vD+C31eujFx1MDAxYj1cdTAwMTNcZuGwJIqy+N4zXHUwMDFjXHTp9p5cdTAwMThZhFx1MDAxMlxyul1gicl0XHUwMDA2bbxLRVxixJGQgkmUUFx1MDAwMi2q7jxV1nzBXHUwMDAzpTSGXHUwMDAwI2Iu+KdcdTAwMTQ2g6bdd7Yqz1t2u731f93XXHUwMDAyPF5/kJDWWVwiXHUwMDAyZrXOVOtC2lx1MDAxNkf8ULZcdTAwMTZ6ZXTkXCK01pxgXHUwMDE1P/99wDrbp5mrbHnk0tsn7NjV6knKS++NzzxknDAtXHUwMDE5VXhm/ymn1FwiRFxiLoWAkCEh8HJimanCeNVKXHUwMDAwuFqhqEMjvlx1MDAxMHjjV1x1MDAxOXG7vaG/VXNcdTAwMWVdXHUwMDAwxrqIXXebWsTNP6DGSGQ2IbrktFx1MDAwMlx1MDAwMc6YZvHz6VeN/mmV0ytfKj9LL6t9jq7WmpLa4LlpiluCUKGw5vPnpm1cdTAwMDaSKjSfXHUwMDFlXHUwMDAyR6ZMmVx1MDAxM4rCc1x0PzFcdTAwMWPfath9XHUwMDEyXCLD7p8gKEkgqTV7xFx1MDAxMuhcXCCPXHUwMDE1jlx1MDAwMc+5lYfB7ahcXFwiz7XTh2F+p9Nea9/bRnd8w3hSJThcdTAwMDR2XHUwMDE01Ox0yZ/NgFx1MDAxMqhcdTAwMWGHqtxcdTAwMTBcXEL0Z5J8v1x1MDAxMi5cdTAwMGZcdTAwMGV3Pmkrd9idP1x1MDAwMIuRXHQ7XHUwMDE2iUWsMcaKr1I1ZXFcdTAwMTWZdKJcdTAwMTGP12WotyOEZ9YtQtRcdTAwMDf0SUBUaqWwJFx0XHUwMDE2jFx1MDAxNuPsYFje3SRgtFxi4vVtXHUwMDFmNzab7cVcdTAwMDco2LVydItcdTAwMTArXHRccsx1fnxcdTAwMWFtcc2rrUBcdTAwMDJcdTAwMGLGT4NcdTAwMDLSJoOFMFx1MDAwZiyn3/qRv1x1MDAwMpfMmTT+XHUwMDE4olx1MDAxN0ylnOt7rKTaebbOKztcdTAwMWVRjetm56FDa+XmTj0qqaZcdTAwMTRTyiQ0NIxW4Fx1MDAxOb41XG5cdTAwMTOLKHhcdTAwMDGsXHUwMDE4xlx1MDAxNFx1MDAwYsnnWvWVkmqzXHUwMDA2Pr72ZtqT3/4j+H3lKlCR21x0MZJaM8xQ/EWki1x1MDAxZmc6/Vx1MDAxOVx1MDAxNcxcdTAwMTJcdTAwMTjkg4TOXHUwMDEyPjNcdTAwMDNBXHS2qOZMUYh/XGJSybkzwcOPv1x1MDAwMHlcdTAwMTO46atcdTAwMWJcdTAwMDN/MT5cXDNxhfFmZFx1MDAxYi+BtrY3XGbqXHUwMDE3NXV1gX5pelx1MDAwMz9CubSdup+Abpm+YyzF8upjzeCNXHUwMDA37pvd61x1MDAxNX1cdTAwMTi2N/9cblbg1r73fXLzb4+u85Rcclx1MDAxM7uqruu2eSxjp2Hg6YyZ7Z8//vl/s2v27iJ9<!-- payload-end -->
+  <defs>
+    <style class="style-fonts">
+      @font-face {
+        font-family: "Virgil";
+        src: url("https://file%2B.vscode-resource.vscode-cdn.net/Users/haobogu/.vscode/extensions/pomdtr.excalidraw-editor-3.7.4/public//dist/excalidraw-assets/Virgil.woff2");
+      }
+      @font-face {
+        font-family: "Cascadia";
+        src: url("https://file%2B.vscode-resource.vscode-cdn.net/Users/haobogu/.vscode/extensions/pomdtr.excalidraw-editor-3.7.4/public//dist/excalidraw-assets/Cascadia.woff2");
+      }
+      @font-face {
+        font-family: "Assistant";
+        src: url("https://file%2B.vscode-resource.vscode-cdn.net/Users/haobogu/.vscode/extensions/pomdtr.excalidraw-editor-3.7.4/public//dist/excalidraw-assets/Assistant-Regular.woff2");
+      }
+    </style>
+    
+  </defs>
+  <rect x="0" y="0" width="1256.3877344474415" height="642.3644322258489" fill="#f8f9fa"></rect><g mask="url(#mask-SXlrch-PuZmk1tqEYQz1o)" stroke-linecap="round"><g transform="translate(213.4495766313612 414.66198614227795) rotate(0 86.87969280387546 -1.2204605015777759)"><path d="M0.09 0.12 C28.79 -0.35, 144.39 -1.99, 173.25 -2.38 M-1.33 -0.86 C27.09 -1.16, 143.1 -0.82, 172.03 -0.81" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(213.4495766313612 414.66198614227795) rotate(0 86.87969280387546 -1.2204605015777759)"><path d="M143.83 9.41 C154.83 4.61, 165.57 0.73, 172.03 -0.81 M143.83 9.41 C153.5 5.81, 162.58 2.45, 172.03 -0.81" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(213.4495766313612 414.66198614227795) rotate(0 86.87969280387546 -1.2204605015777759)"><path d="M143.86 -11.11 C154.92 -8.02, 165.66 -4.02, 172.03 -0.81 M143.86 -11.11 C153.34 -8.13, 162.41 -4.92, 172.03 -0.81" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask id="mask-SXlrch-PuZmk1tqEYQz1o"><rect x="0" y="0" fill="#fff" width="487.2089622391121" height="517.1029071454335"></rect><rect x="271.0323944352367" y="401.44152564070026" fill="#000" width="58.59375" height="24" opacity="1"></rect></mask><g transform="translate(271.0323944352366 401.44152564070015) rotate(0 28.37847619139123 12.092343261837954)"><text x="29.296875" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Event</text></g><g mask="url(#mask-_Eq87YJPhMeIPGsEJDOFy)" stroke-linecap="round"><g transform="translate(596.3831197148161 412.9485915255692) rotate(0 94.95358161846553 0.4418798078881139)"><path d="M0.41 -0.89 C31.83 -0.69, 158.25 1.41, 189.64 1.8 M-0.84 1.25 C30.3 1.08, 156.58 0.47, 188.56 0.17" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(596.3831197148161 412.9485915255692) rotate(0 94.95358161846553 0.4418798078881139)"><path d="M160.44 10.62 C169.96 5.97, 184.05 0.39, 188.56 0.17 M160.44 10.62 C170.5 7.18, 179.56 2.44, 188.56 0.17" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(596.3831197148161 412.9485915255692) rotate(0 94.95358161846553 0.4418798078881139)"><path d="M160.3 -9.9 C169.98 -6.48, 184.12 -3.99, 188.56 0.17 M160.3 -9.9 C170.49 -6.18, 179.61 -3.77, 188.56 0.17" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask id="mask-_Eq87YJPhMeIPGsEJDOFy"><rect x="0" y="0" fill="#fff" width="886.2902829517471" height="513.8323511413455"></rect><rect x="656.1804513332816" y="401.3904713334573" fill="#000" width="70.3125" height="24" opacity="1"></rect></mask><g transform="translate(656.1804513332817 401.3904713334573) rotate(0 34.605935254963185 12.014055974409018)"><text x="35.15625" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Report</text></g><g stroke-linecap="round" transform="translate(795.5563127561877 242.66062142132955) rotate(0 99.86328125 170.330078125)"><path d="M32 0 C82.78 1.68, 133.25 -1.43, 167.73 0 M32 0 C72.35 -1.29, 110.63 -0.29, 167.73 0 M167.73 0 C190.44 -0.58, 197.97 8.91, 199.73 32 M167.73 0 C190.89 -0.76, 200.58 12.57, 199.73 32 M199.73 32 C199.88 95.54, 201.55 158, 199.73 308.66 M199.73 32 C201.21 123.78, 201.47 215, 199.73 308.66 M199.73 308.66 C198.72 328.88, 187.16 342.04, 167.73 340.66 M199.73 308.66 C199.15 330.06, 188.78 342.95, 167.73 340.66 M167.73 340.66 C122.4 337.52, 77.07 339.18, 32 340.66 M167.73 340.66 C122.27 340.9, 76.75 340.58, 32 340.66 M32 340.66 C12.1 341.11, 0.39 328.11, 0 308.66 M32 340.66 C8.51 340.26, 1.17 328.53, 0 308.66 M0 308.66 C2.31 248.58, 1.18 187.7, 0 32 M0 308.66 C0.83 219.33, 0.75 129.39, 0 32 M0 32 C-1.87 10.33, 11.53 -0.16, 32 0 M0 32 C1.96 8.59, 12.32 -0.66, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g stroke-linecap="round" transform="translate(414.90237537183134 10) rotate(0 80.92063790779537 43.28754076587906)"><path d="M21.64 0 C51.61 -1.04, 78.61 1.08, 140.2 0 M21.64 0 C57.65 -0.45, 92.07 0.39, 140.2 0 M140.2 0 C153.75 0.75, 162.12 7.83, 161.84 21.64 M140.2 0 C152.71 0.64, 159.64 8.07, 161.84 21.64 M161.84 21.64 C163.1 38.93, 160.01 53.25, 161.84 64.93 M161.84 21.64 C160.6 34.62, 160.75 49.39, 161.84 64.93 M161.84 64.93 C162.71 78.5, 154.34 86.84, 140.2 86.58 M161.84 64.93 C162 77.98, 156.89 87.72, 140.2 86.58 M140.2 86.58 C93.62 87.65, 48.85 84.79, 21.64 86.58 M140.2 86.58 C95.64 86.38, 51.2 86.09, 21.64 86.58 M21.64 86.58 C5.63 86.66, -0.79 81.03, 0 64.93 M21.64 86.58 C6.86 86.13, 1.31 78, 0 64.93 M0 64.93 C-1.66 53.32, -0.73 44.9, 0 21.64 M0 64.93 C0.96 54.46, 0.37 43.42, 0 21.64 M0 21.64 C-0.91 7.33, 9.02 -0.01, 21.64 0 M0 21.64 C0.64 8.34, 5.51 1.34, 21.64 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(460.6667632796267 41.287540765879044) rotate(0 35.15625 12)"><text x="35.15625" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">keymap</text></g><g stroke-linecap="round" transform="translate(10 242.83409892308953) rotate(0 99.86328125 170.330078125)"><path d="M32 0 C63.22 0.12, 93.96 2.97, 167.73 0 M32 0 C71.95 0, 114.49 0.71, 167.73 0 M167.73 0 C190.56 1.42, 199.88 12.05, 199.73 32 M167.73 0 C191.13 0.16, 199.07 9.44, 199.73 32 M199.73 32 C198.32 114.31, 198.16 197.12, 199.73 308.66 M199.73 32 C202.38 102.61, 201.47 173.79, 199.73 308.66 M199.73 308.66 C201.02 328.2, 188.64 338.75, 167.73 340.66 M199.73 308.66 C197.95 330.28, 187.77 340.28, 167.73 340.66 M167.73 340.66 C124.12 342.77, 83.42 342.49, 32 340.66 M167.73 340.66 C123.61 340.61, 77.28 341.83, 32 340.66 M32 340.66 C9.77 340.27, 0.18 330.25, 0 308.66 M32 340.66 C9.27 339.02, 1.54 332.09, 0 308.66 M0 308.66 C-0.94 207.21, -0.04 107.23, 0 32 M0 308.66 C-1.1 246.49, -1.25 184.61, 0 32 M0 32 C0.4 9.8, 9.24 -1.97, 32 0 M0 32 C-1.13 12.29, 9.69 -0.79, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g stroke-linecap="round" transform="translate(33.70276262170893 283.9825714566321) rotate(0 76.77930081834103 17)"><path d="M8.5 0 C40.92 1.05, 73.01 -1.27, 145.06 0 M8.5 0 C58.98 -0.25, 111.66 0.61, 145.06 0 M145.06 0 C152.61 1.71, 155.27 2.42, 153.56 8.5 M145.06 0 C150.86 -0.02, 153.36 4.83, 153.56 8.5 M153.56 8.5 C153.63 14.09, 154.95 19.01, 153.56 25.5 M153.56 8.5 C153.63 13.21, 153.31 18.94, 153.56 25.5 M153.56 25.5 C153.5 33.02, 152 32, 145.06 34 M153.56 25.5 C152.75 31.98, 148.57 34.92, 145.06 34 M145.06 34 C92.63 34.09, 44.87 37.12, 8.5 34 M145.06 34 C106.97 33.65, 67.98 34.8, 8.5 34 M8.5 34 C3.15 35.13, -0.96 30.76, 0 25.5 M8.5 34 C3.53 35.21, 1.27 29.81, 0 25.5 M0 25.5 C-0.68 19.09, -1.03 12.71, 0 8.5 M0 25.5 C0.15 21.32, 0.19 17.19, 0 8.5 M0 8.5 C-0.96 4.28, 1.3 -1.03, 8.5 0 M0 8.5 C1.31 4.21, 2.41 0.35, 8.5 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(63.607063440049956 291.38257145663215) rotate(0 46.875 9.599999999999994)"><text x="46.875" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">key matrix</text></g><g stroke-linecap="round" transform="translate(33.70276262170893 339.88320841748487) rotate(0 76.77930081834103 17)"><path d="M8.5 0 C47.04 -0.3, 86.56 0.09, 145.06 0 M8.5 0 C51 1.89, 93.17 1.93, 145.06 0 M145.06 0 C152.59 0.31, 153.02 2.92, 153.56 8.5 M145.06 0 C148.92 1.66, 154.82 4.9, 153.56 8.5 M153.56 8.5 C152.22 11.86, 155.15 15.97, 153.56 25.5 M153.56 8.5 C154 12.49, 153.54 17.17, 153.56 25.5 M153.56 25.5 C154.28 30.18, 148.93 33.54, 145.06 34 M153.56 25.5 C151.46 29.05, 151.05 35.2, 145.06 34 M145.06 34 C94.05 34.68, 38.3 34.3, 8.5 34 M145.06 34 C109.74 33.54, 73.94 33.43, 8.5 34 M8.5 34 C3.52 34.32, 0.21 32.61, 0 25.5 M8.5 34 C3.05 32.1, -2.24 31.76, 0 25.5 M0 25.5 C-1.15 20.34, 0.83 15.41, 0 8.5 M0 25.5 C-0.16 18.83, 0.21 12.97, 0 8.5 M0 8.5 C0.96 4.57, 3.04 -0.88, 8.5 0 M0 8.5 C1.79 4.34, 1.27 1.95, 8.5 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(77.66956344004996 347.28320841748484) rotate(0 32.8125 9.599999999999994)"><text x="32.8125" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">encoder</text></g><g stroke-linecap="round" transform="translate(33.70276262170893 395.7838453783376) rotate(0 76.77930081834103 17)"><path d="M8.5 0 C49.43 -2.36, 84.91 -2.04, 145.06 0 M8.5 0 C42.19 -0.04, 75.2 -1.35, 145.06 0 M145.06 0 C150 1.58, 152.07 2.11, 153.56 8.5 M145.06 0 C151.67 -0.56, 155.4 2.92, 153.56 8.5 M153.56 8.5 C152.79 13.42, 152.43 17.27, 153.56 25.5 M153.56 8.5 C153.72 12.23, 152.88 16.36, 153.56 25.5 M153.56 25.5 C152.69 32.86, 150.31 32.94, 145.06 34 M153.56 25.5 C153.31 31.26, 149.3 34.77, 145.06 34 M145.06 34 C89.99 33.46, 38.91 36.62, 8.5 34 M145.06 34 C105.3 34.18, 63.69 35.19, 8.5 34 M8.5 34 C4.78 34.45, -0.64 31.24, 0 25.5 M8.5 34 C5.11 34.7, -1.1 33.25, 0 25.5 M0 25.5 C-1.68 22.24, 1.21 15.29, 0 8.5 M0 25.5 C-0.54 21.26, -0.17 15.91, 0 8.5 M0 8.5 C-0.63 3.86, 4 -1.69, 8.5 0 M0 8.5 C0.7 0.53, 4.79 0.6, 8.5 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(72.98206344004996 403.1838453783376) rotate(0 37.5 9.599999999999994)"><text x="37.5" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">touchpad</text></g><g stroke-linecap="round" transform="translate(33.70595868616061 451.49911060099197) rotate(0 76.77930081834103 17)"><path d="M8.5 0 C38.01 0.97, 67.56 -0.22, 145.06 0 M8.5 0 C43.78 0.17, 79.57 0.12, 145.06 0 M145.06 0 C152.18 1.3, 154.55 2.08, 153.56 8.5 M145.06 0 C148.61 -0.9, 153.48 4.1, 153.56 8.5 M153.56 8.5 C155.01 15.71, 154.37 20.02, 153.56 25.5 M153.56 8.5 C153.03 12.52, 153.32 17.65, 153.56 25.5 M153.56 25.5 C153.19 32.84, 150.73 32.45, 145.06 34 M153.56 25.5 C151.74 30.59, 152.59 31.72, 145.06 34 M145.06 34 C107.71 33.88, 73.46 32.23, 8.5 34 M145.06 34 C91.47 34.56, 36.79 33.48, 8.5 34 M8.5 34 C3.8 33.65, 0.68 30.26, 0 25.5 M8.5 34 C3.42 32.19, 1.64 31.98, 0 25.5 M0 25.5 C0.96 20.43, 0.78 14.5, 0 8.5 M0 25.5 C-0.64 20.92, 0.68 15.78, 0 8.5 M0 8.5 C-0.81 3.82, 2.04 -1.18, 8.5 0 M0 8.5 C-0.09 4.77, 3.9 1.26, 8.5 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(87.04775950450164 458.89911060099195) rotate(0 23.4375 9.599999999999994)"><text x="23.4375" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">mouse</text></g><g stroke-linecap="round" transform="translate(33.70276262170893 507.5851193000431) rotate(0 76.77930081834103 17)"><path d="M8.5 0 C37.91 1.95, 65.7 1.82, 145.06 0 M8.5 0 C49.64 -0.27, 91.48 0.43, 145.06 0 M145.06 0 C151.95 -1.13, 154.35 3.24, 153.56 8.5 M145.06 0 C151.51 -0.28, 153.28 0.83, 153.56 8.5 M153.56 8.5 C155.2 13.63, 154.66 22.66, 153.56 25.5 M153.56 8.5 C153.45 12.04, 154.08 16.31, 153.56 25.5 M153.56 25.5 C155.1 31.78, 150.05 33.55, 145.06 34 M153.56 25.5 C155.78 29.82, 152.84 33.5, 145.06 34 M145.06 34 C105.4 32.23, 63.82 32.77, 8.5 34 M145.06 34 C98.3 32.61, 52.08 32.61, 8.5 34 M8.5 34 C2.41 34.54, -0.74 29.91, 0 25.5 M8.5 34 C1.74 35.73, -0.45 31.32, 0 25.5 M0 25.5 C1.19 20.18, 1.02 16.1, 0 8.5 M0 25.5 C0.95 19.15, -0.35 12.53, 0 8.5 M0 8.5 C0.28 4.33, 2.06 -0.68, 8.5 0 M0 8.5 C-1.69 3.28, 2.4 -1.52, 8.5 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(96.41956344004996 514.9851193000432) rotate(0 14.0625 9.599999999999994)"><text x="14.0625" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">...</text></g><g stroke-linecap="round" transform="translate(395.6565572148161 242.30469344358073) rotate(0 99.86328125 170.330078125)"><path d="M32 0 C67.27 1.24, 103.49 1.9, 167.73 0 M32 0 C74.4 2.11, 117.76 1.52, 167.73 0 M167.73 0 C188.05 -0.56, 199.17 10.33, 199.73 32 M167.73 0 C190.47 0.06, 199.34 8.48, 199.73 32 M199.73 32 C198.57 108.81, 198.42 184.65, 199.73 308.66 M199.73 32 C199.09 141.03, 198.91 250.25, 199.73 308.66 M199.73 308.66 C197.99 331.22, 190.97 341.82, 167.73 340.66 M199.73 308.66 C201.88 330.2, 188.31 339.84, 167.73 340.66 M167.73 340.66 C123.26 340.93, 78.81 338.18, 32 340.66 M167.73 340.66 C125.39 341.93, 85.45 341.43, 32 340.66 M32 340.66 C10.91 339.12, -0.08 328.44, 0 308.66 M32 340.66 C11.17 339.91, -0.65 330.17, 0 308.66 M0 308.66 C1.15 208.64, 1.47 106.36, 0 32 M0 308.66 C1.49 213.41, 0.6 118.77, 0 32 M0 32 C1.93 12.51, 9.08 -1.57, 32 0 M0 32 C-0.02 12.41, 12.16 0.55, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g stroke-linecap="round" transform="translate(419.35931983652495 283.27370649254397) rotate(0 76.77930081834103 17)"><path d="M8.5 0 C51.75 1.08, 92.6 0.39, 145.06 0 M8.5 0 C38.5 -0.95, 67.08 -1.61, 145.06 0 M145.06 0 C150.16 -0.33, 154.79 2.89, 153.56 8.5 M145.06 0 C150.34 -2.19, 152.95 0.65, 153.56 8.5 M153.56 8.5 C154.45 16.53, 155.27 21.23, 153.56 25.5 M153.56 8.5 C153.48 12.51, 152.84 17.43, 153.56 25.5 M153.56 25.5 C155.47 32.33, 152.6 34.18, 145.06 34 M153.56 25.5 C152.8 30.35, 151.43 35.88, 145.06 34 M145.06 34 C117.75 33.85, 88.81 34.22, 8.5 34 M145.06 34 C96.71 34.6, 47.01 33.87, 8.5 34 M8.5 34 C2.76 32.45, 0.44 30.52, 0 25.5 M8.5 34 C2.18 34.17, 1.53 30.31, 0 25.5 M0 25.5 C0.71 20.63, 0.68 13.93, 0 8.5 M0 25.5 C-0.44 20.11, 0.69 16.19, 0 8.5 M0 8.5 C-1.59 1.26, 2.82 1.52, 8.5 0 M0 8.5 C1.49 3.38, 2.23 -0.66, 8.5 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(435.2011206548659 290.67370649254394) rotate(0 60.9375 9.599999999999994)"><text x="60.9375" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">key processor</text></g><g stroke-linecap="round" transform="translate(419.35931983652495 339.0008659516368) rotate(0 76.77930081834103 15)"><path d="M7.5 0 C61.19 -1.4, 120.17 0, 146.06 0 M7.5 0 C54.07 0.22, 101.81 0.41, 146.06 0 M146.06 0 C150.73 -1.91, 153.03 0.6, 153.56 7.5 M146.06 0 C153.16 1.3, 155.22 3.58, 153.56 7.5 M153.56 7.5 C152.91 13.38, 153.35 18.76, 153.56 22.5 M153.56 7.5 C154.15 12.09, 154.13 15.87, 153.56 22.5 M153.56 22.5 C152.9 26.79, 151.67 31.63, 146.06 30 M153.56 22.5 C151.41 27.99, 152.83 31, 146.06 30 M146.06 30 C114.04 27.77, 80.57 30.9, 7.5 30 M146.06 30 C104.97 28.16, 64.17 28.61, 7.5 30 M7.5 30 C1.93 30.15, 1.33 26.76, 0 22.5 M7.5 30 C2.95 30.54, 2.06 28.51, 0 22.5 M0 22.5 C-0.11 18.68, -0.96 11.97, 0 7.5 M0 22.5 C-0.74 18.02, -0.15 15.28, 0 7.5 M0 7.5 C1.3 2.98, 1.98 -0.58, 7.5 0 M0 7.5 C-0.96 3.85, 2.05 1.35, 7.5 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(439.8886206548659 344.4008659516368) rotate(0 56.25 9.599999999999994)"><text x="56.25" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">encoder proc</text></g><g stroke-linecap="round" transform="translate(419.35931983652495 395.0749804142496) rotate(0 76.77930081834103 17)"><path d="M8.5 0 C46.84 -1.63, 83.1 -1.18, 145.06 0 M8.5 0 C47.02 -0.99, 85.62 -0.99, 145.06 0 M145.06 0 C152.55 1.13, 155 3.77, 153.56 8.5 M145.06 0 C152.59 2.18, 152.78 1.62, 153.56 8.5 M153.56 8.5 C153.13 12.31, 154.56 20.7, 153.56 25.5 M153.56 8.5 C153.44 14.28, 153.98 21.37, 153.56 25.5 M153.56 25.5 C151.69 31.59, 152.27 34.87, 145.06 34 M153.56 25.5 C152.17 31.3, 149.77 35.37, 145.06 34 M145.06 34 C115.33 35.25, 84.21 34.93, 8.5 34 M145.06 34 C114.41 33.63, 85 33.19, 8.5 34 M8.5 34 C3.23 34.47, 1.8 32.04, 0 25.5 M8.5 34 C3.6 34.98, -0.95 31.09, 0 25.5 M0 25.5 C-0.59 20.7, 1.67 11.26, 0 8.5 M0 25.5 C0.55 21.94, -0.22 17.72, 0 8.5 M0 8.5 C-0.83 4.01, 2.45 1.17, 8.5 0 M0 8.5 C-0.34 2.16, 4.05 -1.83, 8.5 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(425.8261206548659 402.47498041424956) rotate(0 70.3125 9.599999999999994)"><text x="70.3125" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">mouse processor</text></g><g stroke-linecap="round" transform="translate(419.3655068923863 450.616768135144) rotate(0 76.77930081834103 17)"><path d="M8.5 0 C42.23 1.61, 76.68 0.05, 145.06 0 M8.5 0 C37.37 1.86, 65.14 1.77, 145.06 0 M145.06 0 C152.34 1.9, 152.88 1.78, 153.56 8.5 M145.06 0 C150.98 -0.54, 153.29 2.3, 153.56 8.5 M153.56 8.5 C154.65 13.72, 153.81 15.2, 153.56 25.5 M153.56 8.5 C152.81 13.17, 154.27 17.86, 153.56 25.5 M153.56 25.5 C152.35 31.28, 149.89 35.19, 145.06 34 M153.56 25.5 C151.65 32.23, 152.42 33.91, 145.06 34 M145.06 34 C100.86 34.39, 59.12 33.38, 8.5 34 M145.06 34 C103.26 33.73, 61.97 33.93, 8.5 34 M8.5 34 C3.5 34.85, -0.82 31.1, 0 25.5 M8.5 34 C4.65 32.62, -0.82 30.24, 0 25.5 M0 25.5 C-1.49 18.75, 1.13 13.12, 0 8.5 M0 25.5 C-0.31 20.5, -0.12 14.99, 0 8.5 M0 8.5 C-0.29 2.25, 3.9 -1.59, 8.5 0 M0 8.5 C1.23 1.8, 2.8 -1.36, 8.5 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(430.51980771072726 458.016768135144) rotate(0 65.625 9.599999999999994)"><text x="65.625" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">axis processor</text></g><g stroke-linecap="round" transform="translate(419.35931983652495 506.87625433595497) rotate(0 76.77930081834103 17)"><path d="M8.5 0 C55.95 -0.3, 105.31 2.05, 145.06 0 M8.5 0 C58.01 0.31, 105.55 -1.17, 145.06 0 M145.06 0 C150.94 -0.47, 153.33 2.37, 153.56 8.5 M145.06 0 C148.73 1.41, 155.76 4.17, 153.56 8.5 M153.56 8.5 C152.97 15.71, 154.96 20.29, 153.56 25.5 M153.56 8.5 C153.18 14.01, 153.34 19.93, 153.56 25.5 M153.56 25.5 C151.9 32.1, 152.2 33.93, 145.06 34 M153.56 25.5 C153.84 29.4, 150.64 32.21, 145.06 34 M145.06 34 C101.24 34.94, 56.38 34.01, 8.5 34 M145.06 34 C101.25 35.03, 56.36 34.57, 8.5 34 M8.5 34 C4.41 32.8, -0.71 30.36, 0 25.5 M8.5 34 C5.05 36.12, -1.83 29.36, 0 25.5 M0 25.5 C0.27 19.97, -0.62 14.62, 0 8.5 M0 25.5 C-0.09 19.15, 0.48 12.63, 0 8.5 M0 8.5 C1.07 1.94, 2.8 -1.18, 8.5 0 M0 8.5 C2.17 1.9, 5.06 0.12, 8.5 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(478.5604956548659 511.87625433595497) rotate(0 17.578125 12)"><text x="17.578125" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">...</text></g><g stroke-linecap="round" transform="translate(816.3422676220395 266.09413844397216) rotate(0 79.07732638414831 69.49867639473005)"><path d="M32 0 C56.42 4.8, 87.97 0.58, 126.15 0 C148.64 -0.61, 160.39 8.7, 158.15 32 C155.51 46.1, 153.82 66.38, 158.15 107 C155.66 131.23, 146.84 139.58, 126.15 139 C102.09 136.19, 83.1 138.35, 32 139 C7.41 138.41, 2.89 129.44, 0 107 C2.97 83.56, 2.8 65.42, 0 32 C2.01 7.7, 10.07 -2.73, 32 0" stroke="none" stroke-width="0" fill="#ffec99"></path><path d="M32 0 C61.21 -1.13, 88.62 -0.42, 126.15 0 M32 0 C51.74 -0.34, 73.3 -0.38, 126.15 0 M126.15 0 C146.16 1.34, 159.96 11.85, 158.15 32 M126.15 0 C145.28 1.79, 159.95 11.56, 158.15 32 M158.15 32 C156.05 52.19, 155.82 71.91, 158.15 107 M158.15 32 C158.07 53.13, 157.86 74.59, 158.15 107 M158.15 107 C158.56 128.34, 149.14 137.78, 126.15 139 M158.15 107 C157.47 127.44, 148.97 139.2, 126.15 139 M126.15 139 C92.79 140.15, 59.03 138.28, 32 139 M126.15 139 C98.83 137.49, 73.71 138.82, 32 139 M32 139 C10.98 137.85, 0.24 129.94, 0 107 M32 139 C10.24 140.86, 0.17 129.21, 0 107 M0 107 C0.54 79.51, 0.35 54.18, 0 32 M0 107 C0.37 77.45, 0.13 47.38, 0 32 M0 32 C-0.6 12.1, 11.02 -1.19, 32 0 M0 32 C-2.11 12.5, 9.45 -0.77, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g stroke-linecap="round" transform="translate(816.3422676220393 420.17805190372906) rotate(0 79.07732638414836 69.49867639473007)"><path d="M32 0 C72.31 0.92, 104.3 2.41, 126.15 0 C144.24 1.85, 154.74 9.46, 158.15 32 C158.93 52.18, 158.58 78.86, 158.15 107 C157.67 125.18, 147.47 138.32, 126.15 139 C104.36 134.99, 75.93 134.85, 32 139 C12.97 141, 3.37 125.08, 0 107 C-3.37 85.2, 0.26 61.72, 0 32 C-2.4 13.7, 7.75 0.55, 32 0" stroke="none" stroke-width="0" fill="#ffec99"></path><path d="M32 0 C49.98 1.29, 71.23 0.71, 126.15 0 M32 0 C63.15 0.19, 94.82 0.67, 126.15 0 M126.15 0 C148.4 -0.29, 159.2 10.92, 158.15 32 M126.15 0 C147.88 -1.03, 158.47 9.15, 158.15 32 M158.15 32 C159.12 52.38, 158.26 70.5, 158.15 107 M158.15 32 C156.94 52.08, 156.58 72.03, 158.15 107 M158.15 107 C159.02 127.77, 148.48 140.67, 126.15 139 M158.15 107 C157.09 126.43, 148.5 139, 126.15 139 M126.15 139 C103.8 138.8, 83.67 139.36, 32 139 M126.15 139 C92.68 138.53, 60.73 138.37, 32 139 M32 139 C10.19 139.92, -1.66 128.01, 0 107 M32 139 C10.94 139.15, -0.13 129.87, 0 107 M0 107 C-0.04 91.57, -1.35 75.5, 0 32 M0 107 C0.74 89.82, 0.78 71.4, 0 32 M0 32 C0.91 9.27, 10.64 0.99, 32 0 M0 32 C2.07 8.66, 11.24 0.48, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(846.89784085778 383.1380095043793) rotate(0 46.875 9.599999999999994)"><text x="46.875" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">BLE writer</text></g><g transform="translate(848.3245437601852 535.838176366457) rotate(0 46.875 9.599999999999994)"><text x="46.875" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">USB writer</text></g><g stroke-linecap="round" transform="translate(836.8335497695817 281.8391124422036) rotate(0 58.49930548572598 14.599999999999994)"><path d="M7.3 0 C39.63 0.76, 67.79 0.92, 109.7 0 C112.22 2.43, 117.84 3.09, 117 7.3 C116.37 12.67, 118.02 14.3, 117 21.9 C120.36 28.81, 113.7 26.56, 109.7 29.2 C74.82 32.28, 35.79 30.98, 7.3 29.2 C4.14 27.23, 2.47 23.87, 0 21.9 C-1.31 15.58, 1.56 10.06, 0 7.3 C-2.19 -0.47, 0.73 -1.22, 7.3 0" stroke="none" stroke-width="0" fill="#ffec99"></path><path d="M7.3 0 C45.4 -2.41, 84.16 0.44, 109.7 0 M7.3 0 C31.9 0.9, 54.38 0.72, 109.7 0 M109.7 0 C115.23 0.45, 117.1 3.32, 117 7.3 M109.7 0 C113.78 1.66, 116.9 3.16, 117 7.3 M117 7.3 C116.26 10.61, 117.86 14.33, 117 21.9 M117 7.3 C117.38 12.58, 116.94 18.59, 117 21.9 M117 21.9 C115.18 28.35, 112.6 28.27, 109.7 29.2 M117 21.9 C117.65 24.58, 113.88 29.86, 109.7 29.2 M109.7 29.2 C80.99 26.99, 51.56 28.55, 7.3 29.2 M109.7 29.2 C74.17 27.94, 38.19 27.52, 7.3 29.2 M7.3 29.2 C1.16 31.16, -0.04 28.26, 0 21.9 M7.3 29.2 C2.11 30.98, -2.1 28.89, 0 21.9 M0 21.9 C-0.53 18.07, 0.79 13.37, 0 7.3 M0 21.9 C0.14 18.96, 0.76 15.96, 0 7.3 M0 7.3 C-1.5 2.41, 1.6 -0.33, 7.3 0 M0 7.3 C1.48 3.81, 2.65 -1.62, 7.3 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(881.2703552553075 286.8391124422036) rotate(0 14.0625 9.599999999999994)"><text x="14.0625" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">key</text></g><g stroke-linecap="round" transform="translate(837.0070272713417 314.72431524350145) rotate(0 58.49930548572604 14.600000000000009)"><path d="M7.3 0 C37.44 3.9, 63.29 -2.32, 109.7 0 C114.88 -2.7, 114.86 3.43, 117 7.3 C116.02 12.76, 119.73 17.14, 117 21.9 C115.77 25.17, 114.56 26.84, 109.7 29.2 C71.1 31.12, 32.48 26.57, 7.3 29.2 C3.17 25.9, -0.23 29.55, 0 21.9 C-1.51 16.13, -1.11 12, 0 7.3 C0.46 2.35, 1.04 3.36, 7.3 0" stroke="none" stroke-width="0" fill="#ffec99"></path><path d="M7.3 0 C40.48 0.11, 78.22 -1.63, 109.7 0 M7.3 0 C34.01 0.8, 60.81 -0.06, 109.7 0 M109.7 0 C115.24 -1.46, 118.38 3.67, 117 7.3 M109.7 0 C112.83 0.94, 118.52 1.41, 117 7.3 M117 7.3 C116.33 12.44, 117.37 17.63, 117 21.9 M117 7.3 C117.27 12.73, 116.73 18.91, 117 21.9 M117 21.9 C116.46 28.22, 114.94 31.07, 109.7 29.2 M117 21.9 C116.04 25.65, 113.58 29.39, 109.7 29.2 M109.7 29.2 C75.26 31.07, 38.46 30.19, 7.3 29.2 M109.7 29.2 C75.61 29.29, 40.51 30.39, 7.3 29.2 M7.3 29.2 C4.39 28.29, -1.76 25.8, 0 21.9 M7.3 29.2 C3.34 28.22, 1.73 25, 0 21.9 M0 21.9 C-1.41 17.28, -0.26 14.19, 0 7.3 M0 21.9 C-0.21 16.52, -0.45 11.84, 0 7.3 M0 7.3 C-1.58 3.2, 2.74 1.17, 7.3 0 M0 7.3 C2.26 4.16, 2.9 1.24, 7.3 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(876.7563327570676 319.72431524350145) rotate(0 18.75 9.600000000000009)"><text x="18.75" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">vial</text></g><g stroke-linecap="round" transform="translate(836.8335497695819 345.7132294910782) rotate(0 58.49930548572604 15)"><path d="M7.5 0 C50.57 0.12, 88.99 1.48, 109.5 0 C110.95 0.71, 115.14 0.84, 117 7.5 C114.6 11.56, 118.48 18.1, 117 22.5 C119.07 25.77, 113.84 26.64, 109.5 30 C87.86 27.58, 62.49 31.44, 7.5 30 C0.87 30.1, 1.56 28.91, 0 22.5 C1.45 17.54, 1.24 17.71, 0 7.5 C1.75 -0.18, 0.69 -2.98, 7.5 0" stroke="none" stroke-width="0" fill="#ffec99"></path><path d="M7.5 0 C45.27 -0.94, 83.04 0.54, 109.5 0 M7.5 0 C46.64 0.17, 85.01 1.19, 109.5 0 M109.5 0 C114.84 1.59, 116.42 1.59, 117 7.5 M109.5 0 C115.23 2.21, 117.5 1.72, 117 7.5 M117 7.5 C117.9 10.5, 116.83 14.46, 117 22.5 M117 7.5 C117.01 12.2, 116.81 18.86, 117 22.5 M117 22.5 C118.7 27.03, 112.94 28.8, 109.5 30 M117 22.5 C116.87 26.47, 115.67 30.3, 109.5 30 M109.5 30 C80.33 31.88, 49.42 31.22, 7.5 30 M109.5 30 C76.1 29.39, 44.08 29.81, 7.5 30 M7.5 30 C2.54 32, 0 27.21, 0 22.5 M7.5 30 C1.53 31.45, 1.68 29.34, 0 22.5 M0 22.5 C-0.23 17.7, 1.41 13.86, 0 7.5 M0 22.5 C0.51 18.06, 0.43 13.44, 0 7.5 M0 7.5 C-1.54 2.53, 0.9 -0.04, 7.5 0 M0 7.5 C0.9 4.61, 1.28 -1.95, 7.5 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(871.8953552553078 350.7132294910782) rotate(0 23.4375 9.599999999999994)"><text x="23.4375" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">mouse</text></g><g stroke-linecap="round" transform="translate(836.8335497695819 432.15195540165564) rotate(0 58.49930548572604 14.599999999999994)"><path d="M7.3 0 C37.27 3.31, 73.03 1.56, 109.7 0 C113.39 0.06, 119.45 2.07, 117 7.3 C116.57 9.14, 118.3 15.89, 117 21.9 C117.79 26.77, 115.68 28.93, 109.7 29.2 C86.52 27.72, 60.04 30.06, 7.3 29.2 C5.49 27.34, 1.11 25.85, 0 21.9 C2.23 17.46, 2.28 11.13, 0 7.3 C-0.27 3.14, 2.26 -3.11, 7.3 0" stroke="none" stroke-width="0" fill="#ffec99"></path><path d="M7.3 0 C42.96 0.94, 78.52 -0.09, 109.7 0 M7.3 0 C41.02 1.57, 73.4 0.31, 109.7 0 M109.7 0 C112.69 0.29, 116.68 0.9, 117 7.3 M109.7 0 C112.78 0.5, 116.19 0.14, 117 7.3 M117 7.3 C116.96 9.4, 117.41 13.48, 117 21.9 M117 7.3 C116.59 11.04, 116.77 15.18, 117 21.9 M117 21.9 C118.6 26.33, 116.28 30.95, 109.7 29.2 M117 21.9 C115.7 27.26, 115.22 27.09, 109.7 29.2 M109.7 29.2 C71.09 28.3, 30.88 29.94, 7.3 29.2 M109.7 29.2 C79.87 28.1, 48.55 28.81, 7.3 29.2 M7.3 29.2 C1.81 28.62, 1.5 26.99, 0 21.9 M7.3 29.2 C0.47 30.2, -1.79 28.1, 0 21.9 M0 21.9 C-0.05 19.11, 1.09 14.3, 0 7.3 M0 21.9 C0.1 18.97, -0.06 15.38, 0 7.3 M0 7.3 C-1.02 4.08, 3.69 1.12, 7.3 0 M0 7.3 C-0.23 1.62, 3.67 1.85, 7.3 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(881.2703552553078 437.15195540165564) rotate(0 14.0625 9.599999999999994)"><text x="14.0625" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">key</text></g><g stroke-linecap="round" transform="translate(837.0070272713417 465.0371582029535) rotate(0 58.49930548572604 14.599999999999994)"><path d="M7.3 0 C41.75 0.07, 81 -0.35, 109.7 0 C111.9 -1.69, 117.82 2.02, 117 7.3 C117.72 10.87, 117.95 14.24, 117 21.9 C114.85 27.52, 117.54 30.62, 109.7 29.2 C90.56 27.01, 66.42 27.94, 7.3 29.2 C5.99 27.6, -2.35 29.66, 0 21.9 C-0.41 17.26, -0.34 9.33, 0 7.3 C-0.81 5.1, 1.9 -3.14, 7.3 0" stroke="none" stroke-width="0" fill="#ffec99"></path><path d="M7.3 0 C39.21 -0.97, 68.31 1.54, 109.7 0 M7.3 0 C43.51 0.8, 81.43 -0.11, 109.7 0 M109.7 0 C113.01 0.43, 116.29 0.44, 117 7.3 M109.7 0 C113.11 -0.5, 117.02 2.42, 117 7.3 M117 7.3 C116.38 10.55, 118.13 12.5, 117 21.9 M117 7.3 C117.53 11.55, 117.58 16.76, 117 21.9 M117 21.9 C115.87 27.19, 115.13 27.37, 109.7 29.2 M117 21.9 C118.89 28.43, 116.12 29.81, 109.7 29.2 M109.7 29.2 C87.08 30.33, 63.92 30.31, 7.3 29.2 M109.7 29.2 C86.3 28.87, 64.29 29.27, 7.3 29.2 M7.3 29.2 C0.73 30.07, -1.56 27.93, 0 21.9 M7.3 29.2 C2.07 26.99, -0.2 26.46, 0 21.9 M0 21.9 C-0.85 17.33, 1.24 10.86, 0 7.3 M0 21.9 C-0.39 16.73, 0.45 10.77, 0 7.3 M0 7.3 C-0.2 1.73, 3.51 1.61, 7.3 0 M0 7.3 C0.29 0.14, 0.45 -1.3, 7.3 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(876.7563327570676 470.0371582029535) rotate(0 18.75 9.599999999999994)"><text x="18.75" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">vial</text></g><g stroke-linecap="round" transform="translate(836.8335497695819 496.02607245053036) rotate(0 58.49930548572604 15)"><path d="M7.5 0 C35.61 -1.5, 69.88 -0.23, 109.5 0 C112.5 1.95, 119.74 3.29, 117 7.5 C115.47 12.56, 119.31 17.56, 117 22.5 C114 27.04, 113.84 33.06, 109.5 30 C87.71 27.93, 56.46 32.43, 7.5 30 C4.4 32.96, 1.2 27.23, 0 22.5 C-0.59 19.7, -0.39 10.56, 0 7.5 C-0.91 2.22, 4.9 0.75, 7.5 0" stroke="none" stroke-width="0" fill="#ffec99"></path><path d="M7.5 0 C32.08 -1.04, 52.88 -2.43, 109.5 0 M7.5 0 C38.79 1, 71.29 -0.21, 109.5 0 M109.5 0 C113.23 -0.44, 117.01 2.49, 117 7.5 M109.5 0 C112.37 0.69, 115.84 1.46, 117 7.5 M117 7.5 C117.14 11.71, 118.01 18.16, 117 22.5 M117 7.5 C116.7 11.83, 117.34 15.15, 117 22.5 M117 22.5 C118.64 28.94, 115.85 30.53, 109.5 30 M117 22.5 C115.16 26.87, 114.55 29.92, 109.5 30 M109.5 30 C71.76 29.73, 36.93 29.93, 7.5 30 M109.5 30 C80.99 30.55, 53.4 30.7, 7.5 30 M7.5 30 C2.18 28.08, -0.17 27.24, 0 22.5 M7.5 30 C4.64 31.5, 1.1 26.31, 0 22.5 M0 22.5 C1.29 16.92, 1.35 10.33, 0 7.5 M0 22.5 C-0.17 16.5, 0.31 11.64, 0 7.5 M0 7.5 C0.25 0.51, 0.78 -1.13, 7.5 0 M0 7.5 C1.1 3.6, 2.49 -0.75, 7.5 0" stroke="#1e1e1e" stroke-width="1" fill="none"></path></g><g transform="translate(871.8953552553078 501.42607245053034) rotate(0 23.4375 9.599999999999994)"><text x="23.4375" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">mouse</text></g><g mask="url(#mask-Cgg2VCZB4KUVJ-J6uQGW8)" stroke-linecap="round"><g transform="translate(496.0673146026015 97.57508153175812) rotate(0 -1.1234679729699906 71.79450953137233)"><path d="M0.89 -0.13 C0.65 23.73, -0.53 119.69, -1.19 143.47 M-0.11 -1.25 C-0.44 22.79, -1.5 120.85, -1.59 144.94" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(496.0673146026015 97.57508153175812) rotate(0 -1.1234679729699906 71.79450953137233)"><path d="M-11.63 116.67 C-8.57 127.41, -5.33 133.32, -1.59 144.94 M-11.63 116.67 C-9.06 122.32, -6.39 129.07, -1.59 144.94" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(496.0673146026015 97.57508153175812) rotate(0 -1.1234679729699906 71.79450953137233)"><path d="M8.89 116.83 C5.38 127.67, 2.04 133.53, -1.59 144.94 M8.89 116.83 C7.12 122.55, 5.43 129.27, -1.59 144.94" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask id="mask-Cgg2VCZB4KUVJ-J6uQGW8"><rect x="0" y="0" fill="#fff" width="598.3142505485415" height="341.16410059450277"></rect><rect x="434.0063466296315" y="150.16959106313044" fill="#000" width="121.875" height="38.4" opacity="1"></rect></mask><g transform="translate(434.0063466296316 150.16959106313044) rotate(0 61.710416418649345 19.25033152386547)"><text x="60.9375" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">share by all </text><text x="60.9375" y="19.2" font-family="Cascadia, Segoe UI Emoji" font-size="16px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">procesors</text></g><g transform="translate(33.69140625 608.3644322258489) rotate(0 76.171875 12)"><text x="76.171875" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">input devices</text></g><g transform="translate(401.7698384648161 608.3644322258489) rotate(0 93.75 12)"><text x="93.75" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">input processors</text></g><g transform="translate(847.3848091492384 608.3644322258489) rotate(0 58.59375 12)"><text x="58.59375" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">HID writer</text></g><g stroke-linecap="round"><g transform="translate(1006.0445634400498 413.5060089566321) rotate(0 81.21875 0.521484375)"><path d="M1.02 1.12 C27.88 1.34, 134.5 1.59, 161.34 1.5 M0.1 0.66 C27.29 0.51, 136.64 -0.54, 163.48 -0.38" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1006.0445634400498 413.5060089566321) rotate(0 81.21875 0.521484375)"><path d="M135.32 9.96 C146.1 4.62, 153.93 2.62, 163.48 -0.38 M135.32 9.96 C143.03 6.97, 150.9 4.07, 163.48 -0.38" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1006.0445634400498 413.5060089566321) rotate(0 81.21875 0.521484375)"><path d="M135.26 -10.56 C146.08 -9.39, 153.93 -4.89, 163.48 -0.38 M135.26 -10.56 C143.01 -8.21, 150.89 -5.77, 163.48 -0.38" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g transform="translate(1180.7627344474415 396.53325845202346) rotate(0 32.8125 16.80000000000001)"><text x="0" y="0" font-family="Cascadia, Segoe UI Emoji" font-size="28px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">host</text></g></svg>
\ No newline at end of file
diff --git a/docs/src/images/input_device_framework.svg b/docs/src/images/input_device_framework.svg
deleted file mode 100644
index 0d7613a3..00000000
--- a/docs/src/images/input_device_framework.svg
+++ /dev/null
@@ -1,1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1116px" height="491px" viewBox="-0.5 -0.5 1116 491" content="&lt;mxfile&gt;&lt;diagram id=&quot;KHJxcRW501o7JvBhlY4s&quot; name=&quot;第 1 页&quot;&gt;7Zpbc6M2FMc/jV893E0e13aSdmY7s9NM2+2jAsegWiBGyDbup69khLkIj7MJwesOeQk6uoDO7490jszMXiXFM0NZ/BsNgcwsIyxm9npmWaZpL8Q/aTmWFt+zSkPEcKga1YYX/C8oo6GsOxxC3mrIKSUcZ21jQNMUAt6yIcbood1sQ0n7rhmKQDO8BIjo1r9wyGM1C2tR238BHMXVnU3voaxJUNVYzSSPUUgPDZP9OLNXjFJeXiXFCoh0XuWXst/ThdrzgzFI+Vs6eGWHPSI7NTf1XPxYTZbRXRqCbG/O7OUhxhxeMhTI2oPAK2wxT4iqzrfAg1gVYhTEOwbPstHaEYZ/cBSdhhXzXAY7tocnzDlOI9VhQ1P+hBJMpC7+BBaiFCmzEoHpyTImZEUJZacHtEME/iaQN+eMbqFR4wU+vG5Eje4W5ak9MA5Fw6Tc9Aw0Ac6Ooomq9RUxJdkzwUMtALNqEzfgO64yIiW66Dx0zUVcKDT9mCwN0xaOpZ4YLu4P2cYPIOhF9uq70mOipnozjGH4mWYHoNcD0OoB6A3Az9b4QRqIZZHlE7t3sLPHZOdo7BIscEzcfpybMyY3V+PGGQq2GQqnl+498Nwx4S00eL+m2Y7LmBH24vXTEYpZ8Q6nlqtSmkLHr8qECI5SUQyEr0DYl9JHWER7X1RFgsNQ3qZXGLV0NAijCGUI0obbIn2OY5qk7R7S9gCkH65HoMKpmbzcECi+yPBdTBvSUF2uA4LyHAc3eEmhwPy76iKv/5bg564qrQulg1PhWBVS4aDvzUKjlyzW3U6lqt9FzjndsUB5SoXzHLEIqlaKEYStnEYXQwO228O6sjEgiON9OxPqE4C6wzeKU15rze3E0a7Z0VA5HdWrmbl0BnKczt7iuO2BSidoA530eJ72myRaPeKUJV1dSrpUxk2TTFMDVeZJGaNiz8jFjO+O2w12fmdxw1TJ1HNdlStNHD/IcdS0ydRz3jJvmiB+COKoOZSpJ7+owPkE8YMQR82lTD0TrpKpyxSndOr9sL0bplOmfqL/uAcVAk+ABwFsW50l2dQBe5/FVz8Zub8VeJxcZNENf6oM8VouYhlD/GSjJ41/vCzvj9UNdkvf6IBbjLhbWnoOufz6OHF7B7dRQ9VqHWxw+x0yyuQWNe19g+19i4d2cGMbIwY3Pb+jamz/V4fFF4H9JKe5XjcScpx55xj2ree53d36E89ze34avB8ZXZRE89Df8n8qmTx4V9i+VSSmcW2kAVWiR9oxzadEasDNRODs7CZ9kd6n7Sb+9WVATroROhmG561WPaQ4zRrWr+gVyDeaY46prH2lnNNENCCdijN5TQoNOdEdJzgVeqo+ZjT0aG91+uvNqHzfXNqiJmIoxFBPR4mwMq8xE6OXj5WKsCk+D1Z94miVMjsti0kRyU875ynwA2XbfE5QVvqgHRjfqSz9boK/mPfkjkbfiukOIEz9N/EylJ3WnuEge92d5PMOcUSx/qK33Inq76Ltx/8A&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="0" y="40" width="180" height="450" rx="27" ry="27" fill="none" stroke="none" pointer-events="all"/><path d="M 6.64 46.87 C 6.64 46.87 6.64 46.87 6.64 46.87 M 6.64 46.87 C 6.64 46.87 6.64 46.87 6.64 46.87 M 3.1 57.04 C 4.68 48.76 16.06 48.22 16.22 41.95 M 3.1 57.04 C 5.84 50.95 10.28 49.23 16.22 41.95 M 2.18 64.2 C 5 52.86 11.62 52.24 21.87 41.55 M 2.18 64.2 C 9.1 59.67 12.56 52.26 21.87 41.55 M 2.58 69.84 C 12.57 59.47 23.93 52.29 28.17 40.41 M 2.58 69.84 C 11.24 61.49 18.69 54.22 28.17 40.41 M 2.97 75.48 C 10.89 67.83 22.05 54.43 33.15 40.77 M 2.97 75.48 C 11.77 66.97 18.65 58.18 33.15 40.77 M 2.71 81.88 C 13.63 68.78 21.18 60.76 38.14 41.13 M 2.71 81.88 C 14.87 69.94 25.28 56.02 38.14 41.13 M 3.11 87.52 C 11.98 78.2 18.17 70.28 43.78 40.73 M 3.11 87.52 C 17.19 66.44 34.47 49.79 43.78 40.73 M 2.85 93.92 C 15.72 80.46 28.93 61.12 48.77 41.09 M 2.85 93.92 C 19.56 75.22 35.1 56.62 48.77 41.09 M 2.58 100.32 C 22.56 78.76 40.39 55.92 54.41 40.7 M 2.58 100.32 C 20.52 78.98 37.68 56.93 54.41 40.7 M 2.98 105.96 C 20.27 90.31 39.36 64.02 59.4 41.06 M 2.98 105.96 C 21.22 81.77 41.2 60.88 59.4 41.06 M 2.72 112.36 C 23.74 90.63 42.23 68.89 65.04 40.66 M 2.72 112.36 C 26.5 85.38 48.57 60.61 65.04 40.66 M 3.11 118 C 22.05 98.66 42.21 80.72 70.03 41.02 M 3.11 118 C 14.9 99.78 31.04 85.08 70.03 41.02 M 2.85 124.4 C 20.01 101.71 48.94 71.99 75.67 40.63 M 2.85 124.4 C 24.54 98.78 46.97 74.1 75.67 40.63 M 2.59 130.8 C 20.3 105.72 43.15 86.09 80.66 40.99 M 2.59 130.8 C 21.66 110.24 40.5 89.4 80.66 40.99 M 2.98 136.44 C 18.02 113.62 35.13 97.4 86.3 40.59 M 2.98 136.44 C 24.54 107.65 47.29 85.33 86.3 40.59 M 2.72 142.84 C 26.39 117.2 50.87 85.45 91.29 40.95 M 2.72 142.84 C 33.17 108.78 61.5 71.43 91.29 40.95 M 3.12 148.48 C 30.4 118.45 63.36 81.55 96.28 41.31 M 3.12 148.48 C 23.82 124.91 41.57 102.7 96.28 41.31 M 2.85 154.88 C 36.87 121.54 64.76 86.61 101.92 40.92 M 2.85 154.88 C 38.3 107.67 78.01 66.81 101.92 40.92 M 2.59 161.28 C 28.97 126.06 66.49 90.62 106.91 41.28 M 2.59 161.28 C 38.64 125.33 72.36 84.85 106.91 41.28 M 2.99 166.92 C 26.97 132.85 49.04 105.49 112.55 40.88 M 2.99 166.92 C 24.24 136.66 49.52 109.29 112.55 40.88 M 2.73 173.32 C 25.72 146.03 48.66 123.62 117.54 41.24 M 2.73 173.32 C 47.93 121.42 93.65 69.5 117.54 41.24 M 3.12 178.96 C 35.73 137.87 77.69 95.87 123.18 40.85 M 3.12 178.96 C 40.02 137.23 71.21 96.14 123.18 40.85 M 2.86 185.36 C 42.62 143.03 78.54 99.13 128.17 41.21 M 2.86 185.36 C 39.44 146.62 75.07 108.16 128.17 41.21 M 2.6 191.76 C 42.36 148.65 78.93 105.4 133.81 40.82 M 2.6 191.76 C 26.9 157.81 53.81 130.32 133.81 40.82 M 2.99 197.4 C 34.74 162.57 62.16 132.03 138.8 41.18 M 2.99 197.4 C 31.39 161.13 63.83 124.94 138.8 41.18 M 2.73 203.8 C 51.43 150.65 100.88 95.43 144.44 40.78 M 2.73 203.8 C 59.4 141.38 114.41 77.31 144.44 40.78 M 3.13 209.44 C 58.28 141.99 118.61 76.83 149.43 41.14 M 3.13 209.44 C 60.82 145.27 116.93 82.3 149.43 41.14 M 2.86 215.84 C 51.34 161.16 105.98 101.27 154.41 41.5 M 2.86 215.84 C 60.72 145.38 122.28 77.63 154.41 41.5 M 2.6 222.24 C 43.23 182.92 79.79 137.53 160.06 41.11 M 2.6 222.24 C 44.64 176.26 84.3 132.23 160.06 41.11 M 3 227.88 C 42.63 187.88 74.08 143.46 164.39 42.22 M 3 227.88 C 39.56 187.3 78.05 144.59 164.39 42.22 M 2.74 234.28 C 35.38 194.34 67.34 155.99 168.06 44.09 M 2.74 234.28 C 42.78 187.64 82.41 141.04 168.06 44.09 M 3.13 239.92 C 36.71 195.74 78.77 151.51 171.74 45.96 M 3.13 239.92 C 37.23 198.92 72.08 157.95 171.74 45.96 M 2.87 246.32 C 47.96 191.83 92.7 140.43 174.1 49.34 M 2.87 246.32 C 55.1 186.26 108.66 122.4 174.1 49.34 M 2.61 252.72 C 69.36 170.67 137.59 92.53 177.12 51.96 M 2.61 252.72 C 55.83 191.55 109.32 130.88 177.12 51.96 M 3 258.36 C 50.76 203.19 99.33 147.3 178.83 56.1 M 3 258.36 C 66.46 188.24 130.18 117.52 178.83 56.1 M 2.74 264.76 C 70.72 186.93 139.25 102.25 179.88 60.99 M 2.74 264.76 C 37.33 224.34 74.9 182 179.88 60.99 M 3.14 270.4 C 69.26 189.24 142.06 114.37 180.27 66.63 M 3.14 270.4 C 34.89 233.6 72.39 191.72 180.27 66.63 M 2.87 276.8 C 66.56 195.8 139.7 114.4 183.29 69.25 M 2.87 276.8 C 42.07 230.98 84.93 181.57 183.29 69.25 M 2.61 283.2 C 36.78 238.33 79.57 193.91 183.03 75.65 M 2.61 283.2 C 67.43 204.29 134.64 124.46 183.03 75.65 M 3.01 288.84 C 55.45 223.14 114.94 158.4 182.77 82.05 M 3.01 288.84 C 48.18 236.64 93.54 186.76 182.77 82.05 M 2.75 295.24 C 58.21 228.06 111.95 164.38 183.16 87.69 M 2.75 295.24 C 39 253.61 74.39 212.37 183.16 87.69 M 3.14 300.88 C 41.89 254.31 77.98 214.05 182.9 94.09 M 3.14 300.88 C 63.64 230.38 122.49 161.87 182.9 94.09 M 2.88 307.28 C 53.53 247.14 102.24 192.52 183.3 99.73 M 2.88 307.28 C 48.75 254.23 97.15 197.2 183.3 99.73 M 2.62 313.68 C 54.79 252.56 109.84 190.53 183.03 106.13 M 2.62 313.68 C 63.91 245.37 122.21 177.06 183.03 106.13 M 3.01 319.32 C 50.69 262.95 97.71 208.28 182.77 112.53 M 3.01 319.32 C 62.54 246.31 127.66 173.48 182.77 112.53 M 2.75 325.72 C 62.91 255.19 119.58 184.27 183.17 118.17 M 2.75 325.72 C 47.73 269.36 96.04 214.95 183.17 118.17 M 3.15 331.36 C 41.63 281.24 86.38 232.23 182.91 124.57 M 3.15 331.36 C 61.98 267.54 116.56 202.11 182.91 124.57 M 2.88 337.76 C 41.84 292.4 75.12 252.01 183.3 130.21 M 2.88 337.76 C 69.35 263.41 134.54 186.81 183.3 130.21 M 2.62 344.15 C 60.32 274.75 121.91 205.9 183.04 136.61 M 2.62 344.15 C 76.1 260.87 146.77 175.87 183.04 136.61 M 3.02 349.8 C 66.9 282.64 124.86 213.78 182.78 143.01 M 3.02 349.8 C 45.44 301.06 85.62 255.48 182.78 143.01 M 2.76 356.2 C 57.62 292.23 114.77 229.08 183.17 148.65 M 2.76 356.2 C 61.4 287.79 120.29 219.19 183.17 148.65 M 3.15 361.84 C 54.05 299.34 111.19 237.83 182.91 155.05 M 3.15 361.84 C 41.95 316.95 79.97 272.86 182.91 155.05 M 2.89 368.24 C 55.35 311.58 100.81 254.56 183.3 160.69 M 2.89 368.24 C 40.72 320.78 82.1 274.19 183.3 160.69 M 2.63 374.63 C 37.3 330.11 81.27 287.96 183.04 167.09 M 2.63 374.63 C 57.09 313.21 114.67 246.59 183.04 167.09 M 3.02 380.28 C 75.42 299.74 140.18 223.61 182.78 173.49 M 3.02 380.28 C 48.86 327.94 95.18 273.48 182.78 173.49 M 2.76 386.68 C 66.02 309.43 130.49 236.86 183.18 179.13 M 2.76 386.68 C 46.59 332.43 90.49 282.82 183.18 179.13 M 3.16 392.32 C 62.84 323.68 126.66 260.77 182.92 185.53 M 3.16 392.32 C 41.42 345.99 84.88 300.38 182.92 185.53 M 2.89 398.72 C 59.22 333.46 113.73 266.73 183.31 191.17 M 2.89 398.72 C 68.72 327.46 135.39 249.89 183.31 191.17 M 2.63 405.11 C 45.31 356.93 89.39 301.47 183.05 197.57 M 2.63 405.11 C 69.61 327.02 137.86 246.91 183.05 197.57 M 3.03 410.76 C 47.57 358.79 90.11 311.61 182.79 203.97 M 3.03 410.76 C 65.45 340.94 128.65 268.81 182.79 203.97 M 2.77 417.15 C 47.15 370.96 85.36 324.01 183.18 209.61 M 2.77 417.15 C 63.97 347.44 124.86 278.65 183.18 209.61 M 3.16 422.8 C 77.44 343.06 149.89 257.61 182.92 216.01 M 3.16 422.8 C 63.66 356.58 123.33 288.6 182.92 216.01 M 2.9 429.2 C 65.42 362.31 126.14 286.6 183.31 221.65 M 2.9 429.2 C 44.18 374.67 90.96 322.84 183.31 221.65 M 2.64 435.59 C 46.84 382.24 87.76 329.26 183.05 228.05 M 2.64 435.59 C 64.77 365.36 128.97 291.67 183.05 228.05 M 3.03 441.24 C 57.49 376.62 111.4 312.2 182.79 234.45 M 3.03 441.24 C 44.47 395.51 83.88 350.92 182.79 234.45 M 2.77 447.63 C 63.61 382.42 121.42 312.36 183.19 240.09 M 2.77 447.63 C 57.04 384.99 112.19 321.55 183.19 240.09 M 3.16 453.28 C 40.72 409.14 79.79 363.79 182.92 246.49 M 3.16 453.28 C 43.61 410.73 82.11 368.24 182.92 246.49 M 0.28 462.69 C 65.72 380.88 134.45 303.6 182.66 252.88 M 0.28 462.69 C 37.42 422.2 74.06 381.24 182.66 252.88 M 0.67 468.34 C 53.96 406.71 109.17 346.67 183.06 258.53 M 0.67 468.34 C 38.92 420.08 80.56 372.47 183.06 258.53 M 1.72 473.23 C 44.71 424.67 82.16 376.88 182.8 264.93 M 1.72 473.23 C 52.07 414.13 106.01 353.83 182.8 264.93 M 4.09 476.6 C 48.24 430.16 91.05 375.71 183.19 270.57 M 4.09 476.6 C 57.69 414.19 111.17 352.48 183.19 270.57 M 6.45 479.98 C 61.57 420.74 109.63 360.08 182.93 276.97 M 6.45 479.98 C 69.89 409.33 132.72 332.86 182.93 276.97 M 8.81 483.36 C 61.2 427.67 109.03 369.53 182.67 283.36 M 8.81 483.36 C 57.22 429.45 106.53 374.67 182.67 283.36 M 11.18 486.74 C 63.92 422.31 119.66 363.51 183.06 289.01 M 11.18 486.74 C 49.57 442.47 91.14 399.12 183.06 289.01 M 15.51 487.86 C 68.83 431.77 118.37 370.46 182.8 295.4 M 15.51 487.86 C 63.33 431.51 109.57 378.98 182.8 295.4 M 19.18 489.73 C 79.33 420.14 136.31 351.36 183.2 301.05 M 19.18 489.73 C 61.07 443.74 99.33 398.18 183.2 301.05 M 22.86 491.59 C 75.89 434.62 127.5 377.46 182.93 307.45 M 22.86 491.59 C 89.64 420.66 152.41 348.89 182.93 307.45 M 28.5 491.2 C 66.5 442.25 108.47 396.36 182.67 313.84 M 28.5 491.2 C 86.77 423.06 141.27 359.32 182.67 313.84 M 33.49 491.56 C 87.77 427.4 142.07 365.12 183.07 319.49 M 33.49 491.56 C 64.91 455.45 97.17 417.35 183.07 319.49 M 38.47 491.92 C 96.31 429.56 150.21 365.17 182.81 325.88 M 38.47 491.92 C 90.65 435.46 138.7 377.78 182.81 325.88 M 44.12 491.53 C 78.09 452.41 118.04 408.8 183.2 331.53 M 44.12 491.53 C 90.41 439.46 138.52 385.64 183.2 331.53 M 49.1 491.89 C 81.51 454.14 110.85 423.17 182.94 337.93 M 49.1 491.89 C 91.28 442.51 130.73 395.37 182.94 337.93 M 54.75 491.49 C 89.59 459.32 114.58 418.87 182.68 344.32 M 54.75 491.49 C 105 435.49 148.86 385.4 182.68 344.32 M 59.73 491.85 C 95.85 456.74 130.25 418.72 183.07 349.97 M 59.73 491.85 C 104.49 445.56 144 398.65 183.07 349.97 M 65.38 491.46 C 98.96 450.59 135.07 416.59 182.81 356.36 M 65.38 491.46 C 109.78 444.18 153.9 392.25 182.81 356.36 M 70.36 491.82 C 100.15 464.18 124.74 432.09 183.21 362.01 M 70.36 491.82 C 111.89 449.78 149.84 406.34 183.21 362.01 M 76.01 491.42 C 100.38 465.29 127.82 431.77 182.94 368.4 M 76.01 491.42 C 103.67 460.94 128.88 431.89 182.94 368.4 M 80.99 491.78 C 121.24 454.19 156.04 409.37 182.68 374.8 M 80.99 491.78 C 120.18 450.6 154.32 406.78 182.68 374.8 M 86.64 491.39 C 107.02 466.88 130.15 438.3 183.08 380.45 M 86.64 491.39 C 119 458.23 147.76 423.49 183.08 380.45 M 91.62 491.75 C 107.62 467.91 129.1 438.03 182.82 386.84 M 91.62 491.75 C 120.5 460.16 148.61 431.05 182.82 386.84 M 96.61 492.11 C 127.09 456.03 151.95 424.78 183.21 392.49 M 96.61 492.11 C 126.84 461.14 155.41 427.2 183.21 392.49 M 102.25 491.71 C 127.47 458.41 152.62 429.64 182.95 398.88 M 102.25 491.71 C 131.47 458.13 159.65 428.77 182.95 398.88 M 107.24 492.07 C 126.04 475.27 137.71 455.45 182.69 405.28 M 107.24 492.07 C 124.53 466.59 146.13 444.56 182.69 405.28 M 112.88 491.68 C 137.53 461.92 161.74 435.34 183.08 410.93 M 112.88 491.68 C 137.96 462.68 163.19 434.66 183.08 410.93 M 117.87 492.04 C 139.6 467.74 161.5 443.86 182.82 417.32 M 117.87 492.04 C 143.73 463.55 170.55 435.94 182.82 417.32 M 123.51 491.64 C 139.87 476.2 157.46 451.87 183.22 422.97 M 123.51 491.64 C 141.84 469.27 159.5 451.07 183.22 422.97 M 128.5 492 C 136.82 477.66 148.62 464.33 182.95 429.36 M 128.5 492 C 144.85 472.76 160.26 452.04 182.95 429.36 M 134.14 491.61 C 149.18 480.11 160.62 463.24 182.69 435.76 M 134.14 491.61 C 155.57 469.14 172.56 449.11 182.69 435.76 M 139.13 491.97 C 151.22 476.93 159.51 471.66 183.09 441.4 M 139.13 491.97 C 156.18 474.83 169.4 457.87 183.09 441.4 M 144.77 491.58 C 160.05 475.4 177.12 457.73 182.83 447.8 M 144.77 491.58 C 157.84 474.25 171.5 457.7 182.83 447.8 M 149.76 491.94 C 161.15 480.3 166.22 469.47 183.22 453.45 M 149.76 491.94 C 156.68 484.66 161.99 474.6 183.22 453.45 M 155.4 491.54 C 165.89 485.34 167.35 475.05 180.33 462.86 M 155.4 491.54 C 158.74 484.31 165.98 477.88 180.33 462.86 M 161.05 491.15 C 164.15 487.73 175.99 478.23 178.1 471.52 M 161.05 491.15 C 166.18 487.62 170.8 481.97 178.1 471.52" fill="none" stroke="#dae8fc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 27 40 M 27 40 C 76.44 35.19 120.34 36.07 153 40 M 27 40 C 54.56 41.53 81.48 42.05 153 40 M 153 40 C 174.95 37.76 178.57 45.11 180 67 M 153 40 C 168.84 36.92 177.4 47.68 180 67 M 180 67 C 177.9 207.37 179.71 345.4 180 463 M 180 67 C 176.14 223.95 176.98 381.09 180 463 M 180 463 C 178.51 480.59 169.28 488.83 153 490 M 180 463 C 177.71 480.65 170.41 485.45 153 490 M 153 490 C 114.64 492.2 71.28 491.08 27 490 M 153 490 C 122.03 492.02 94.82 489.94 27 490 M 27 490 C 8.48 486.73 -1.71 477.99 0 463 M 27 490 C 12.99 487.62 3.54 476.63 0 463 M 0 463 C 0.92 380.34 1.19 294.57 0 67 M 0 463 C -2.35 379.15 -2.06 294.74 0 67 M 0 67 C 4 51.96 5.37 42.29 27 40 M 0 67 C 0.89 53.37 8.06 41.45 27 40" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="30" y="80" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 32.18 82.33 C 32.18 82.33 32.18 82.33 32.18 82.33 M 32.18 82.33 C 32.18 82.33 32.18 82.33 32.18 82.33 M 31.27 89.48 C 33.09 89.71 34.68 87.46 39.14 80.42 M 31.27 89.48 C 35.12 86.06 36.66 82.78 39.14 80.42 M 31.01 95.88 C 36 94.69 40.23 85.04 44.78 80.03 M 31.01 95.88 C 34.5 91.77 40.63 86.56 44.78 80.03 M 30.74 102.27 C 34.65 94.25 48.12 82.49 49.77 80.39 M 30.74 102.27 C 36.2 97.12 40.38 89.36 49.77 80.39 M 31.14 107.92 C 42.19 101.05 47.46 88.79 55.41 79.99 M 31.14 107.92 C 35.52 103.13 44.52 96.55 55.41 79.99 M 30.88 114.31 C 45.73 99.19 52.65 86.41 60.4 80.35 M 30.88 114.31 C 38.13 107.3 44.97 94.65 60.4 80.35 M 31.27 119.96 C 42.89 104.53 55.83 96.79 65.39 80.71 M 31.27 119.96 C 38.03 110.55 48.91 100.44 65.39 80.71 M 31.01 126.35 C 40.87 113.78 51.99 102.41 71.03 80.32 M 31.01 126.35 C 43.11 113.81 55.63 100.24 71.03 80.32 M 31.41 132 C 45.57 109.65 68.16 92.53 76.02 80.68 M 31.41 132 C 44.58 114.77 59.55 99.6 76.02 80.68 M 32.46 136.89 C 54.31 114.93 65.86 96.42 81.66 80.28 M 32.46 136.89 C 45.56 125.24 56.62 109.59 81.66 80.28 M 35.47 139.51 C 53.33 120.17 73.27 94.79 86.65 80.64 M 35.47 139.51 C 56.3 118.45 73.47 97.88 86.65 80.64 M 40.46 139.87 C 56.23 126.44 63.77 111.04 92.29 80.25 M 40.46 139.87 C 49.97 125.99 63.34 112.29 92.29 80.25 M 46.1 139.48 C 63.55 123.41 78.05 104.6 97.28 80.61 M 46.1 139.48 C 58.01 127.48 68.6 113.68 97.28 80.61 M 51.09 139.84 C 72.03 118.62 86.03 97.51 102.92 80.21 M 51.09 139.84 C 67.43 121.77 83.53 100.78 102.92 80.21 M 56.73 139.44 C 75.18 117.17 90.42 101.8 107.91 80.57 M 56.73 139.44 C 66.68 124.98 80.54 112.86 107.91 80.57 M 61.72 139.8 C 76.48 124.09 89.84 108.88 112.89 80.93 M 61.72 139.8 C 77.41 123.94 95.27 105.45 112.89 80.93 M 66.71 140.16 C 86.84 115.23 108.35 91.76 118.54 80.54 M 66.71 140.16 C 83.77 122.45 98.88 103.69 118.54 80.54 M 72.35 139.77 C 86.11 118.98 105.01 104.71 123.52 80.9 M 72.35 139.77 C 86.02 128.13 95.99 114.5 123.52 80.9 M 77.34 140.13 C 94.62 116.59 119.61 98.82 129.17 80.51 M 77.34 140.13 C 91.24 126.6 103.74 112.64 129.17 80.51 M 82.98 139.73 C 103 120.18 118.48 93.7 134.15 80.87 M 82.98 139.73 C 98.09 121 112.65 107.46 134.15 80.87 M 87.97 140.09 C 105.27 124.08 118.13 105.62 139.8 80.47 M 87.97 140.09 C 96.79 125.41 109.97 115.51 139.8 80.47 M 93.61 139.7 C 111.64 119.91 121.76 101.73 144.78 80.83 M 93.61 139.7 C 106.16 125.8 122.02 109.23 144.78 80.83 M 98.6 140.06 C 108.04 129.48 123.03 113.53 148.46 82.7 M 98.6 140.06 C 111.1 123.76 125.29 108.08 148.46 82.7 M 104.24 139.66 C 118.67 126.61 124.57 116.68 150.17 86.83 M 104.24 139.66 C 113.78 127.72 124.35 115.79 150.17 86.83 M 109.23 140.02 C 123.5 122.5 138.12 102.79 151.87 90.97 M 109.23 140.02 C 124.32 119.74 143.26 101.48 151.87 90.97 M 114.22 140.38 C 120.82 124.32 133.54 111.14 152.27 96.61 M 114.22 140.38 C 129.05 122.14 142.68 106.96 152.27 96.61 M 119.86 139.99 C 133.07 124.89 144.19 114.05 152.01 103.01 M 119.86 139.99 C 126.66 130.18 139 117.75 152.01 103.01 M 124.85 140.35 C 131.15 126.79 145.91 115.43 151.74 109.41 M 124.85 140.35 C 136.18 127.01 144.62 115.7 151.74 109.41 M 130.49 139.95 C 141.66 127.7 148.91 117.43 151.48 115.8 M 130.49 139.95 C 134.5 133.66 140.73 125.83 151.48 115.8 M 135.48 140.31 C 143.18 133.36 144.61 131.19 151.88 121.45 M 135.48 140.31 C 138.68 135.36 144.44 127.34 151.88 121.45 M 141.12 139.92 C 146.87 134.96 150.91 131.79 151.62 127.84 M 141.12 139.92 C 143.75 138.35 145.87 133.53 151.62 127.84" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 39 80 M 39 80 C 71.17 74.43 103.22 77.75 141 80 M 39 80 C 78.59 80.43 121.33 82.7 141 80 M 141 80 C 146.49 80.44 149.54 79.23 150 89 M 141 80 C 147.45 76.01 145.55 83.48 150 89 M 150 89 C 146.65 96.42 152.97 108.81 150 131 M 150 89 C 151.8 100.29 151.07 114.64 150 131 M 150 131 C 148.27 136.71 150.36 139.09 141 140 M 150 131 C 152.61 138.83 150.08 140.6 141 140 M 141 140 C 103.49 141.88 71.69 143.14 39 140 M 141 140 C 100.53 137.84 62.01 141.33 39 140 M 39 140 C 36.43 140.32 32.67 134.8 30 131 M 39 140 C 30.46 144.52 31.32 138.28 30 131 M 30 131 C 32.27 116.34 26.79 109.42 30 89 M 30 131 C 30.3 114.34 31.69 99.95 30 89 M 30 89 C 29.36 79.33 30.05 80.56 39 80 M 30 89 C 25.48 80.12 33.71 77.14 39 80" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 110px; margin-left: 31px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">key matrix</div></div></div></foreignObject><text x="90" y="115" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">key matrix</text></switch></g><rect x="30" y="180" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 32.49 181.97 C 32.49 181.97 32.49 181.97 32.49 181.97 M 32.49 181.97 C 32.49 181.97 32.49 181.97 32.49 181.97 M 30.92 189.88 C 32.46 187.5 33 182.99 39.45 180.07 M 30.92 189.88 C 33.85 186.37 36.47 182.77 39.45 180.07 M 30.66 196.27 C 33.94 189.91 33.59 191.87 44.44 180.43 M 30.66 196.27 C 37.42 191.74 42.17 183.66 44.44 180.43 M 31.05 201.92 C 39.15 195.09 44.56 188.25 50.08 180.03 M 31.05 201.92 C 37.33 197.6 40.92 190.59 50.08 180.03 M 30.79 208.32 C 33.65 200.52 45.54 195.26 55.07 180.39 M 30.79 208.32 C 39.35 199.71 46.9 188.18 55.07 180.39 M 31.19 213.96 C 36.63 206.93 42.3 195.25 60.71 180 M 31.19 213.96 C 40.06 207.98 43.85 197.25 60.71 180 M 30.92 220.36 C 45.18 202.97 55.75 189.35 65.7 180.36 M 30.92 220.36 C 41.13 210.6 45.4 203.39 65.7 180.36 M 30.66 226.75 C 41.29 216.05 56.5 203.19 70.68 180.72 M 30.66 226.75 C 40.41 216.58 51.16 202.65 70.68 180.72 M 31.06 232.4 C 44.4 221.49 46.57 209.26 76.33 180.32 M 31.06 232.4 C 42.02 220.37 52.58 209.18 76.33 180.32 M 32.76 236.53 C 46.28 222.3 62.53 205.51 81.31 180.68 M 32.76 236.53 C 49.05 222.69 59.53 204.66 81.31 180.68 M 35.13 239.91 C 55.29 217.25 66.2 203.55 86.96 180.29 M 35.13 239.91 C 53.69 220.27 71.3 197.55 86.96 180.29 M 40.77 239.52 C 62.62 216.09 75.86 194.54 91.94 180.65 M 40.77 239.52 C 50.55 226.18 64.71 213.27 91.94 180.65 M 45.76 239.88 C 67.78 218.76 85.11 197.81 97.59 180.25 M 45.76 239.88 C 61.65 223.2 74.36 205.34 97.59 180.25 M 51.4 239.48 C 65.26 228.35 74.59 215.54 102.57 180.61 M 51.4 239.48 C 69.27 220.82 86.83 196.97 102.57 180.61 M 56.39 239.84 C 74.43 220.85 93.05 204.22 107.56 180.97 M 56.39 239.84 C 70.02 222.46 85.5 204.33 107.56 180.97 M 62.03 239.45 C 82.49 221.95 101.2 195.65 113.2 180.58 M 62.03 239.45 C 70.97 229.64 83.17 214.96 113.2 180.58 M 67.02 239.81 C 79.13 222.08 95.47 202.19 118.19 180.94 M 67.02 239.81 C 82.54 222.41 97.92 206.53 118.19 180.94 M 72 240.17 C 84.64 218.24 104.46 204.64 123.83 180.54 M 72 240.17 C 91.73 223.45 106.29 202.14 123.83 180.54 M 77.65 239.77 C 101.75 216.22 118.25 193.91 128.82 180.9 M 77.65 239.77 C 90.98 225.45 99.77 214.92 128.82 180.9 M 82.63 240.13 C 101.19 225.26 116.6 205.13 134.46 180.51 M 82.63 240.13 C 98.54 221.19 116.42 203.62 134.46 180.51 M 88.28 239.74 C 102.7 220.54 120.64 207.05 139.45 180.87 M 88.28 239.74 C 101.86 221.75 115.84 208.63 139.45 180.87 M 93.27 240.1 C 106.02 225.6 120.64 210.05 145.09 180.48 M 93.27 240.1 C 111.02 216.46 132.1 197.31 145.09 180.48 M 98.91 239.7 C 115.63 226.16 122.44 211.16 148.11 183.1 M 98.91 239.7 C 110.12 227.12 117.84 216.76 148.11 183.1 M 103.9 240.06 C 117.58 230.38 128.78 211.45 149.82 187.23 M 103.9 240.06 C 119.38 221.2 136.34 204.04 149.82 187.23 M 108.88 240.42 C 125.91 223.6 143.16 202.17 152.18 190.61 M 108.88 240.42 C 124.22 224.78 134.3 213.39 152.18 190.61 M 114.53 240.03 C 123.6 227.67 132.54 216.65 151.92 197.01 M 114.53 240.03 C 122.14 230.56 133.37 221.24 151.92 197.01 M 119.51 240.39 C 127.63 226.11 136.51 218.28 151.66 203.41 M 119.51 240.39 C 130.73 225.58 142.67 212.31 151.66 203.41 M 125.16 239.99 C 127.65 237.34 132.48 223.97 152.05 209.05 M 125.16 239.99 C 130.15 232.91 136.67 226.27 152.05 209.05 M 130.14 240.35 C 137.16 236.42 143.64 226.83 151.79 215.45 M 130.14 240.35 C 138.75 234.04 144.9 225.78 151.79 215.45 M 135.79 239.96 C 140.4 233.27 141.51 227.09 151.53 221.85 M 135.79 239.96 C 140.21 231.89 148.37 226.08 151.53 221.85 M 140.77 240.32 C 141.96 239.97 144.5 236.15 151.27 228.24 M 140.77 240.32 C 144.38 237.03 145.84 235.6 151.27 228.24" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 39 180 M 39 180 C 66.13 180.41 103.15 174.78 141 180 M 39 180 C 68.38 178.48 99.45 181.28 141 180 M 141 180 C 150.39 179.11 147.21 180.22 150 189 M 141 180 C 149.22 178.4 147.37 181.27 150 189 M 150 189 C 146.69 206.01 150.72 214.87 150 231 M 150 189 C 148.29 203.31 150.96 218.92 150 231 M 150 231 C 148.89 236.16 147.59 238.63 141 240 M 150 231 C 154.18 233.8 144.49 243.62 141 240 M 141 240 C 117.13 238.68 96.23 240.05 39 240 M 141 240 C 104.83 238.82 69.78 240.33 39 240 M 39 240 C 29.31 238.1 26.83 238.58 30 231 M 39 240 C 28.44 237.7 27.19 237.44 30 231 M 30 231 C 32.38 217.39 33.05 201.29 30 189 M 30 231 C 31.26 220.25 31.53 205.74 30 189 M 30 189 C 29.11 185.16 35.7 180.61 39 180 M 30 189 C 29.91 179.68 29 181.37 39 180" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 210px; margin-left: 31px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">encoders</div></div></div></foreignObject><text x="90" y="215" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">encoders</text></switch></g><rect x="30" y="280" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 32.15 282.37 C 32.15 282.37 32.15 282.37 32.15 282.37 M 32.15 282.37 C 32.15 282.37 32.15 282.37 32.15 282.37 M 31.23 289.52 C 32.61 284.59 36.82 283.31 39.1 280.46 M 31.23 289.52 C 35.18 286.15 36.08 282.79 39.1 280.46 M 30.97 295.92 C 32.53 292.37 35.61 289.94 44.74 280.07 M 30.97 295.92 C 36.37 290.97 39.72 284.01 44.74 280.07 M 30.71 302.32 C 35.01 296.68 40.35 286.75 49.73 280.43 M 30.71 302.32 C 36.74 294.46 43.54 283.81 49.73 280.43 M 31.1 307.96 C 39.73 301.66 47.1 289.8 55.37 280.04 M 31.1 307.96 C 34.98 302.08 44.23 295.2 55.37 280.04 M 30.84 314.36 C 42.12 300.63 52.46 291.27 60.36 280.4 M 30.84 314.36 C 43.25 302.62 53.88 287.03 60.36 280.4 M 31.23 320 C 40.76 307.69 49.64 296.64 65.35 280.76 M 31.23 320 C 39 310.24 44.37 302.29 65.35 280.76 M 30.97 326.4 C 42.36 309.56 53.66 295.21 70.99 280.36 M 30.97 326.4 C 38.36 314.59 47.35 304.31 70.99 280.36 M 31.37 332.04 C 46.59 320.84 52.98 303.56 75.98 280.72 M 31.37 332.04 C 48.72 315.3 63.52 298.14 75.98 280.72 M 33.07 336.18 C 46.49 319.45 51.69 312.11 81.62 280.33 M 33.07 336.18 C 46.46 319.96 64.52 303.36 81.62 280.33 M 35.44 339.55 C 51.84 322.09 69.28 304.56 86.61 280.69 M 35.44 339.55 C 53.63 317.85 71.22 297.51 86.61 280.69 M 40.42 339.91 C 60.86 315.78 77.94 299.4 92.25 280.29 M 40.42 339.91 C 50.77 328.73 62.02 316.27 92.25 280.29 M 46.07 339.52 C 53.96 325.65 63.42 314.89 97.24 280.65 M 46.07 339.52 C 61.57 316.53 80.04 299.03 97.24 280.65 M 51.05 339.88 C 68.5 324.53 83.8 307.76 102.88 280.26 M 51.05 339.88 C 70.89 316.11 90.36 296.89 102.88 280.26 M 56.7 339.49 C 76.7 313.73 90.68 295.85 107.87 280.62 M 56.7 339.49 C 76.37 319.19 93.48 299.05 107.87 280.62 M 61.68 339.85 C 71.97 322.29 85.78 312.68 112.86 280.98 M 61.68 339.85 C 76.47 322.28 93.24 303.63 112.86 280.98 M 66.67 340.21 C 79.16 323.27 90.76 314.47 118.5 280.58 M 66.67 340.21 C 81.04 324.62 93.06 307.2 118.5 280.58 M 72.31 339.81 C 83.44 325.22 103.77 304.75 123.49 280.94 M 72.31 339.81 C 81.05 328.21 93.53 315.48 123.49 280.94 M 77.3 340.17 C 90.39 325.88 104.56 310.34 129.13 280.55 M 77.3 340.17 C 96.73 318.86 116.48 295.51 129.13 280.55 M 82.94 339.78 C 89.27 332.08 104.22 318.76 134.12 280.91 M 82.94 339.78 C 101.6 319.05 118.36 297.93 134.12 280.91 M 87.93 340.14 C 99.84 325.34 115.23 308.38 139.76 280.51 M 87.93 340.14 C 104.25 324.5 119.38 303.77 139.76 280.51 M 93.57 339.74 C 106.34 330.92 117.12 318.38 144.75 280.87 M 93.57 339.74 C 108.19 324.75 123.79 307.34 144.75 280.87 M 98.56 340.1 C 117.21 321.2 132.2 298.72 148.42 282.74 M 98.56 340.1 C 117.01 319.45 136.5 298.61 148.42 282.74 M 104.2 339.71 C 119.27 325.4 127.76 313.47 150.13 286.88 M 104.2 339.71 C 114.34 330.34 124.5 318.51 150.13 286.88 M 109.19 340.07 C 122.49 324.5 141.89 301.91 151.83 291.01 M 109.19 340.07 C 118.39 327.79 127.22 319.72 151.83 291.01 M 114.18 340.43 C 124.35 331.38 129.84 322.14 152.23 296.65 M 114.18 340.43 C 122.48 326.63 135.23 314.06 152.23 296.65 M 119.82 340.03 C 124.32 326.58 138.97 321.76 151.97 303.05 M 119.82 340.03 C 129.02 331.62 134.15 320.91 151.97 303.05 M 124.81 340.39 C 128.87 333.38 137.15 327.81 151.71 309.45 M 124.81 340.39 C 134.08 333.38 140.05 321.22 151.71 309.45 M 130.45 340 C 136.2 331.95 145.77 326.58 151.45 315.85 M 130.45 340 C 139.23 330.13 144.92 321.92 151.45 315.85 M 135.44 340.36 C 144.63 332.84 145.81 330.22 151.84 321.49 M 135.44 340.36 C 139.05 336.38 142.84 331.96 151.84 321.49 M 141.08 339.96 C 146.2 335.4 149.36 328.52 151.58 327.89 M 141.08 339.96 C 142.46 338.16 146.46 333.71 151.58 327.89" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 39 280 M 39 280 C 69.08 278.39 95.09 279.81 141 280 M 39 280 C 58.17 276.53 81.57 279.85 141 280 M 141 280 C 146.28 277.79 152.89 281.21 150 289 M 141 280 C 150.98 280.8 149.19 279.06 150 289 M 150 289 C 146.73 299.2 148.46 304.14 150 331 M 150 289 C 150.46 297.94 148.53 306.4 150 331 M 150 331 C 149.51 335.62 144.81 338.17 141 340 M 150 331 C 146.54 337.97 148.11 337.44 141 340 M 141 340 C 110.37 343.48 71.97 336.96 39 340 M 141 340 C 109.14 339.8 77.55 343.34 39 340 M 39 340 C 30.19 343.88 28.98 334.35 30 331 M 39 340 C 35.62 340.09 32.26 336.61 30 331 M 30 331 C 30.8 318.84 29.64 309.96 30 289 M 30 331 C 28.21 322.16 31.36 311.54 30 289 M 30 289 C 28.85 282.99 33.34 280.67 39 280 M 30 289 C 34.34 279.25 33.5 276.39 39 280" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 310px; margin-left: 31px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">mice</div></div></div></foreignObject><text x="90" y="315" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">mice</text></switch></g><rect x="30" y="380" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 32.46 382.01 C 32.46 382.01 32.46 382.01 32.46 382.01 M 32.46 382.01 C 32.46 382.01 32.46 382.01 32.46 382.01 M 30.88 389.92 C 32.34 387.16 35.72 383.69 39.41 380.11 M 30.88 389.92 C 33.91 386.11 35.84 382.43 39.41 380.11 M 31.28 395.56 C 33.65 391.95 42.66 382.23 44.4 380.47 M 31.28 395.56 C 33.04 393.53 36.09 387.05 44.4 380.47 M 31.02 401.96 C 38.64 397.52 35.91 392.51 50.04 380.07 M 31.02 401.96 C 36.99 394.94 43.2 389.04 50.04 380.07 M 30.75 408.36 C 39.18 401.13 37.18 396.26 55.03 380.44 M 30.75 408.36 C 38.82 398.66 46.61 390.83 55.03 380.44 M 31.15 414 C 34.37 408.37 43.47 400.11 60.67 380.04 M 31.15 414 C 39.83 403.3 51.4 389.63 60.67 380.04 M 30.89 420.4 C 43.01 406.15 57.49 397.28 65.66 380.4 M 30.89 420.4 C 38.08 410.3 44.83 405.26 65.66 380.4 M 31.28 426.04 C 41.41 412.89 56.6 397.26 70.64 380.76 M 31.28 426.04 C 48.07 407.7 63.04 392.14 70.64 380.76 M 31.02 432.44 C 46.41 414.34 57.37 399.6 76.29 380.37 M 31.02 432.44 C 40.1 418.69 50.51 409.49 76.29 380.37 M 32.73 436.57 C 47.76 416.13 67.6 399.06 81.28 380.73 M 32.73 436.57 C 47.21 417.98 64.86 398.82 81.28 380.73 M 35.09 439.95 C 48.15 417.13 72.57 403.28 86.92 380.33 M 35.09 439.95 C 55.03 419.66 73.06 397.17 86.92 380.33 M 40.73 439.56 C 56.93 423.25 69.4 404.57 91.91 380.69 M 40.73 439.56 C 48.99 426.85 61.04 415.17 91.91 380.69 M 45.72 439.92 C 60.48 429.08 72.69 408.26 97.55 380.3 M 45.72 439.92 C 57.3 428.07 71.62 414.33 97.55 380.3 M 51.36 439.52 C 69.63 422.45 90.52 394.17 102.54 380.66 M 51.36 439.52 C 62.44 426.97 73.1 416.72 102.54 380.66 M 56.35 439.88 C 76.2 417.12 93.81 397.69 108.18 380.26 M 56.35 439.88 C 69.62 428.28 78.25 413.75 108.18 380.26 M 61.99 439.49 C 80.34 418.1 99.5 397.41 113.17 380.62 M 61.99 439.49 C 74.04 427.98 85.14 413.14 113.17 380.62 M 66.98 439.85 C 81.77 418.23 106.53 393.14 118.15 380.98 M 66.98 439.85 C 79.84 428.54 92.17 413.97 118.15 380.98 M 71.97 440.21 C 92.34 424.48 105.58 404.68 123.8 380.59 M 71.97 440.21 C 86.74 423.52 103.79 403.14 123.8 380.59 M 77.61 439.82 C 89.62 425.41 103.38 413.22 128.78 380.95 M 77.61 439.82 C 96.39 417.81 116.33 398 128.78 380.95 M 82.6 440.18 C 97.7 417.37 114.83 398.62 134.43 380.55 M 82.6 440.18 C 102.1 419.19 122.21 393.99 134.43 380.55 M 88.24 439.78 C 97.31 429.76 109.83 409.73 139.41 380.91 M 88.24 439.78 C 106.9 420.9 122.77 397.01 139.41 380.91 M 93.23 440.14 C 111 416.76 128.57 395.01 145.06 380.52 M 93.23 440.14 C 113.06 419.4 129.89 395.4 145.06 380.52 M 98.87 439.75 C 109.13 429.31 122.01 411.21 148.07 383.14 M 98.87 439.75 C 115.96 420.9 128.9 401.46 148.07 383.14 M 103.86 440.11 C 120.29 423.01 134.08 410.07 149.78 387.28 M 103.86 440.11 C 117.83 423.83 130.37 406.75 149.78 387.28 M 109.5 439.71 C 125.34 417.13 139.12 401.09 152.14 390.66 M 109.5 439.71 C 123.26 422.48 135.57 407.7 152.14 390.66 M 114.49 440.07 C 132.91 424.55 142.15 408.81 151.88 397.05 M 114.49 440.07 C 127.12 424.85 137.02 409.47 151.88 397.05 M 119.47 440.43 C 126.88 429.08 131.29 427.28 151.62 403.45 M 119.47 440.43 C 127.6 427.01 140.34 419.47 151.62 403.45 M 125.12 440.04 C 129.51 429.74 141.23 423.98 152.02 409.09 M 125.12 440.04 C 133.43 429.1 142.86 419.41 152.02 409.09 M 130.1 440.4 C 135.99 427.74 149.06 418.12 151.75 415.49 M 130.1 440.4 C 135.22 436.28 140.57 432.54 151.75 415.49 M 135.75 440 C 141.05 432.18 149.85 425.61 151.49 421.89 M 135.75 440 C 140.58 432.24 146.81 425.99 151.49 421.89 M 140.73 440.36 C 141.83 433.16 150.4 431.97 151.89 427.53 M 140.73 440.36 C 142.73 436.62 146.28 435.5 151.89 427.53" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 39 380 M 39 380 C 64.04 380.45 87.02 380.92 141 380 M 39 380 C 72.37 382.66 100.49 382.5 141 380 M 141 380 C 150.18 376.46 150.56 382.2 150 389 M 141 380 C 143.55 383.19 151.01 386.06 150 389 M 150 389 C 153.09 400.8 152.53 410.2 150 431 M 150 389 C 148.63 400.96 150.1 410.68 150 431 M 150 431 C 150.13 435.07 150.04 437.72 141 440 M 150 431 C 148.11 432.94 142.52 440.46 141 440 M 141 440 C 116.01 440.27 96.5 441.87 39 440 M 141 440 C 113.45 440.71 85.32 438.26 39 440 M 39 440 C 31.07 441.67 31.14 438.13 30 431 M 39 440 C 33.6 442.47 28.13 435.77 30 431 M 30 431 C 30.91 419.88 27.9 409.84 30 389 M 30 431 C 29.17 415.67 31.2 400.53 30 389 M 30 389 C 28.6 380.82 30.98 380.73 39 380 M 30 389 C 29.57 378.82 28.79 380.62 39 380" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 410px; margin-left: 31px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">trackpads</div></div></div></foreignObject><text x="90" y="415" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">trackpads</text></switch></g><rect x="25" y="0" width="130" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 15px; margin-left: 26px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Input devices</div></div></div></foreignObject><text x="90" y="20" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">Input devices</text></switch></g><path d="M 180.5 270 L 180.5 260 L 340.5 260 L 340.5 249.5 L 359.5 265 L 340.5 280.5 L 340.5 270 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 180.5 270 M 180.5 270 C 181.95 266.82 182.37 266.35 180.5 260 M 180.5 270 C 180.59 266.44 181.24 264.28 180.5 260 M 180.5 260 C 229.6 263.46 275.76 260.76 340.5 260 M 180.5 260 C 214.61 260.05 252.48 257.52 340.5 260 M 340.5 260 C 340.93 259.33 338.84 257 340.5 249.5 M 340.5 260 C 340.98 257.18 341.06 255.17 340.5 249.5 M 340.5 249.5 C 347.65 255.32 352.25 259.43 359.5 265 M 340.5 249.5 C 348.18 253.93 351.83 259.11 359.5 265 M 359.5 265 C 354.66 266.92 348.15 270.88 340.5 280.5 M 359.5 265 C 351.85 272.15 345.72 274.16 340.5 280.5 M 340.5 280.5 C 340.92 278.64 338.38 272.77 340.5 270 M 340.5 280.5 C 340.87 279.17 341.45 275.49 340.5 270 M 340.5 270 C 304.03 271.66 266.19 265.33 180.5 270 M 340.5 270 C 280.98 268.62 223.85 266.65 180.5 270" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="360" y="40" width="180" height="450" rx="27" ry="27" fill="none" stroke="none" pointer-events="all"/><path d="M 366.52 47.01 C 366.52 47.01 366.52 47.01 366.52 47.01 M 366.52 47.01 C 366.52 47.01 366.52 47.01 366.52 47.01 M 363.64 56.43 C 366.5 51.04 368.7 49.5 376.1 42.09 M 363.64 56.43 C 367.01 50.86 371.03 47.57 376.1 42.09 M 362.07 64.33 C 370.62 58.35 374.18 54.11 381.75 41.69 M 362.07 64.33 C 368.3 60.46 371.57 54.36 381.75 41.69 M 363.12 69.22 C 366.41 61.6 375.27 51.64 388.05 40.54 M 363.12 69.22 C 369.81 62.26 377.85 54.78 388.05 40.54 M 362.85 75.62 C 369.26 69.76 378.48 53.43 393.03 40.9 M 362.85 75.62 C 369.54 65.19 379.95 56.91 393.03 40.9 M 362.59 82.02 C 373.37 75.47 374.28 66.24 398.68 40.51 M 362.59 82.02 C 369.61 74 376.64 64.32 398.68 40.51 M 362.99 87.66 C 374.32 78.91 379.97 70.16 403.66 40.87 M 362.99 87.66 C 377.88 72.37 390.26 55.82 403.66 40.87 M 362.73 94.06 C 374.53 81.01 390.23 67.67 409.31 40.47 M 362.73 94.06 C 377.61 77.43 393.77 59.32 409.31 40.47 M 363.12 99.7 C 383.38 77.89 401.56 61.78 414.29 40.83 M 363.12 99.7 C 377 82.24 393.42 68.72 414.29 40.83 M 362.86 106.1 C 379.13 86.47 403.08 61.21 419.28 41.19 M 362.86 106.1 C 379.63 87.7 394.15 69.69 419.28 41.19 M 362.6 112.5 C 373.74 96.8 387.23 78.52 424.92 40.8 M 362.6 112.5 C 375.72 95.35 391.47 82.68 424.92 40.8 M 362.99 118.14 C 386.96 91.52 413.56 62.83 429.91 41.16 M 362.99 118.14 C 389.46 89.34 415.31 62.36 429.91 41.16 M 362.73 124.54 C 390.7 95.83 409.96 64.83 435.55 40.76 M 362.73 124.54 C 391.18 93.54 420.08 62.75 435.55 40.76 M 363.13 130.18 C 389.78 97.09 418.6 67.62 440.54 41.12 M 363.13 130.18 C 387.39 100.84 411.95 71.42 440.54 41.12 M 362.86 136.58 C 384.53 109.09 405.02 90.67 446.18 40.73 M 362.86 136.58 C 387 107.58 412.92 82.06 446.18 40.73 M 362.6 142.98 C 391.77 111.99 410.76 80.74 451.17 41.09 M 362.6 142.98 C 392.03 106.43 423.57 70.76 451.17 41.09 M 363 148.62 C 389 115.86 418.48 86.88 456.81 40.7 M 363 148.62 C 388.26 115.61 417.19 81.28 456.81 40.7 M 362.74 155.02 C 401.61 107.03 440.8 68.33 461.8 41.06 M 362.74 155.02 C 391.15 122.97 415.55 93.14 461.8 41.06 M 363.13 160.66 C 394.45 123.47 419.16 92.49 467.44 40.66 M 363.13 160.66 C 392.36 126.79 422.78 94.68 467.44 40.66 M 362.87 167.06 C 387.71 133.3 419.82 103.96 472.43 41.02 M 362.87 167.06 C 404.14 120.17 447.36 72.48 472.43 41.02 M 362.61 173.46 C 394.45 137.2 432.25 96.2 477.42 41.38 M 362.61 173.46 C 384.93 146.1 407.52 118.99 477.42 41.38 M 363 179.1 C 382.82 150.34 410.16 121.28 483.06 40.99 M 363 179.1 C 390.04 144.74 418.09 113.99 483.06 40.99 M 362.74 185.5 C 396.5 146.36 432.96 105 488.05 41.35 M 362.74 185.5 C 401.82 140.01 434.98 101.87 488.05 41.35 M 363.14 191.14 C 410.7 131.33 457.93 75.9 493.69 40.95 M 363.14 191.14 C 392.35 157.04 420.08 123.58 493.69 40.95 M 362.87 197.54 C 414.59 145.41 458.14 88.08 498.68 41.31 M 362.87 197.54 C 392.81 158.33 424.58 124.28 498.68 41.31 M 362.61 203.93 C 414.2 148.76 465.22 88.77 504.32 40.92 M 362.61 203.93 C 414.66 141.58 472.8 78.79 504.32 40.92 M 363.01 209.58 C 414.07 152.45 472.88 88.35 509.31 41.28 M 363.01 209.58 C 408.42 156.74 453.16 107.03 509.31 41.28 M 362.75 215.98 C 395.96 179.84 427.98 143.11 514.95 40.88 M 362.75 215.98 C 394.44 181.19 427.44 145.76 514.95 40.88 M 363.14 221.62 C 423.77 152.07 480.61 79.54 519.94 41.24 M 363.14 221.62 C 410.18 163.95 461.17 107.11 519.94 41.24 M 362.88 228.02 C 400.39 187.26 441.87 143.76 524.27 42.36 M 362.88 228.02 C 406.68 180.47 450.67 131.93 524.27 42.36 M 362.62 234.41 C 416.85 171.15 469.1 110.12 528.6 43.47 M 362.62 234.41 C 403.64 189.63 446.38 143.05 528.6 43.47 M 363.01 240.06 C 422.44 170.38 484 102.19 531.62 46.1 M 363.01 240.06 C 413 181.08 466.16 122.45 531.62 46.1 M 362.75 246.46 C 428.88 171.84 488.04 103.83 534.64 48.72 M 362.75 246.46 C 397.91 203.88 435.52 164.58 534.64 48.72 M 363.15 252.1 C 422.53 184.91 488.11 112.53 537 52.1 M 363.15 252.1 C 401.7 214.06 436.16 170.93 537 52.1 M 362.88 258.5 C 417.91 198.79 473.15 132.43 539.36 55.48 M 362.88 258.5 C 412.55 205.6 457.97 152.45 539.36 55.48 M 362.62 264.89 C 413.19 200.99 473.68 136.98 539.76 61.12 M 362.62 264.89 C 404.63 221.2 443.32 174.84 539.76 61.12 M 363.02 270.54 C 401.96 220.72 447.87 176.4 540.81 66.01 M 363.02 270.54 C 406.17 217.35 449.32 166.59 540.81 66.01 M 362.76 276.93 C 413.63 219.69 465.35 156.1 543.17 69.39 M 362.76 276.93 C 423.25 206.11 489.03 131.35 543.17 69.39 M 363.15 282.58 C 410.85 223.62 459.34 169.68 542.91 75.79 M 363.15 282.58 C 421.35 217.89 476.12 153.99 542.91 75.79 M 362.89 288.98 C 407.2 235.68 455.28 182.27 543.3 81.43 M 362.89 288.98 C 424.51 216 486.35 145.57 543.3 81.43 M 362.63 295.37 C 426.64 219.24 497.25 142.26 543.04 87.83 M 362.63 295.37 C 434.62 215.96 505.61 138 543.04 87.83 M 363.02 301.02 C 436.72 219.26 504.24 137.61 542.78 94.23 M 363.02 301.02 C 410.93 244.13 457.9 191.18 542.78 94.23 M 362.76 307.41 C 424.96 230.84 486.91 160.15 543.18 99.87 M 362.76 307.41 C 424.21 235.98 482.58 167.71 543.18 99.87 M 363.15 313.06 C 426.78 242.25 492.63 166.28 542.91 106.27 M 363.15 313.06 C 427.37 236.19 495.37 160.42 542.91 106.27 M 362.89 319.46 C 418.95 255.72 473.55 192.83 543.31 111.91 M 362.89 319.46 C 426.04 247.39 491.37 170.56 543.31 111.91 M 362.63 325.85 C 400.78 279.1 442.98 234.86 543.05 118.31 M 362.63 325.85 C 408.98 271.74 457.17 214.37 543.05 118.31 M 363.03 331.5 C 424.4 262.63 488.89 189.93 542.79 124.71 M 363.03 331.5 C 409.98 281.61 453.25 229.79 542.79 124.71 M 362.76 337.89 C 428.88 257.52 494.13 186.86 543.18 130.35 M 362.76 337.89 C 411.05 282.01 462.65 223.41 543.18 130.35 M 363.16 343.54 C 400.77 298.48 439.69 251.01 542.92 136.75 M 363.16 343.54 C 416.41 276.52 475.18 214.28 542.92 136.75 M 362.9 349.93 C 425.62 278.04 488.5 205.94 543.31 142.39 M 362.9 349.93 C 421.43 285.5 477.08 222.17 543.31 142.39 M 362.64 356.33 C 423.86 281.37 490.4 206.6 543.05 148.79 M 362.64 356.33 C 401.58 312.07 440.81 266.89 543.05 148.79 M 363.03 361.98 C 399.69 314.11 443.45 268.1 542.79 155.19 M 363.03 361.98 C 402.66 320.71 437.26 276.06 542.79 155.19 M 362.77 368.37 C 412.54 314.56 458.55 263.31 543.19 160.83 M 362.77 368.37 C 432.36 289.17 503.99 205.83 543.19 160.83 M 363.16 374.02 C 418 308.73 473.81 247.93 542.92 167.23 M 363.16 374.02 C 428.61 302.32 490.86 230.81 542.92 167.23 M 362.9 380.41 C 435.16 301.78 506.87 216.42 542.66 173.62 M 362.9 380.41 C 432.47 298.18 500.77 217.75 542.66 173.62 M 362.64 386.81 C 415.56 320.69 469.46 262.52 543.06 179.27 M 362.64 386.81 C 412.23 327.01 465.14 265.61 543.06 179.27 M 363.04 392.46 C 427.99 319.02 495.27 242.26 542.8 185.66 M 363.04 392.46 C 422.42 321.29 482.4 250.82 542.8 185.66 M 362.77 398.85 C 405.89 349.86 449.44 300.21 543.19 191.31 M 362.77 398.85 C 414.7 337.02 470.12 272.21 543.19 191.31 M 363.17 404.5 C 431.31 326.48 504.13 242.63 542.93 197.71 M 363.17 404.5 C 414.92 343.33 470.05 282.7 542.93 197.71 M 362.91 410.89 C 426.78 333.79 490.21 259.46 542.67 204.1 M 362.91 410.89 C 407.62 359.56 454.93 304.55 542.67 204.1 M 362.65 417.29 C 421.84 351.01 475.28 282.79 543.06 209.75 M 362.65 417.29 C 419.26 352.93 472.96 292.26 543.06 209.75 M 363.04 422.93 C 424.47 351.52 484.15 281.39 542.8 216.14 M 363.04 422.93 C 425.82 354.42 489.11 282.41 542.8 216.14 M 362.78 429.33 C 416.64 365.81 472.41 304.69 543.2 221.79 M 362.78 429.33 C 417.04 364.18 469.29 304.15 543.2 221.79 M 363.17 434.98 C 425.7 361.78 490.8 294.23 542.93 228.18 M 363.17 434.98 C 415.32 372.66 465.7 313.72 542.93 228.18 M 362.91 441.37 C 410.12 383.1 460.49 332.27 542.67 234.58 M 362.91 441.37 C 401.08 398.99 439.83 354.55 542.67 234.58 M 362.65 447.77 C 423.18 376.48 490.47 303.8 543.07 240.23 M 362.65 447.77 C 436.19 367.36 506.61 284.87 543.07 240.23 M 363.05 453.41 C 413.39 398.28 461.46 343.24 542.81 246.62 M 363.05 453.41 C 420.67 383.37 478.93 320.18 542.81 246.62 M 360.16 462.83 C 401.32 417.37 440.42 369.45 543.2 252.27 M 360.16 462.83 C 413.91 398.85 469.87 333.26 543.2 252.27 M 360.55 468.47 C 425.29 397.2 494.4 319.89 542.94 258.66 M 360.55 468.47 C 405.02 421.67 444.08 371.91 542.94 258.66 M 361.61 473.36 C 405.84 428.09 445.2 386.69 542.68 265.06 M 361.61 473.36 C 399.76 430.95 439.1 385.41 542.68 265.06 M 363.97 476.74 C 414.16 419.9 462.63 369.12 543.07 270.71 M 363.97 476.74 C 419.88 410.34 477.13 345.18 543.07 270.71 M 366.33 480.12 C 420.78 415.43 479.62 354.64 542.81 277.1 M 366.33 480.12 C 412.23 428.76 456.09 379.13 542.81 277.1 M 368.69 483.5 C 431.72 410.62 492.65 337.63 543.21 282.75 M 368.69 483.5 C 418.7 424.77 468.96 366.89 543.21 282.75 M 371.06 486.88 C 426.38 429.51 476.07 370.16 542.94 289.14 M 371.06 486.88 C 426.7 420.65 482.53 353.09 542.94 289.14 M 375.39 487.99 C 418.31 439.18 458.23 390.69 542.68 295.54 M 375.39 487.99 C 415.9 445.62 452.55 403.42 542.68 295.54 M 379.06 489.86 C 416.12 450 449.64 408.93 543.08 301.18 M 379.06 489.86 C 422.46 435.74 469.83 384.4 543.08 301.18 M 382.74 491.73 C 414.98 449.81 449.47 410.16 542.82 307.58 M 382.74 491.73 C 437.35 432.24 490 369.14 542.82 307.58 M 388.38 491.34 C 449.6 423.18 502.6 361.2 543.21 313.23 M 388.38 491.34 C 430.92 438.8 475.99 386.86 543.21 313.23 M 393.37 491.7 C 453.24 429.22 507.57 364.06 542.95 319.62 M 393.37 491.7 C 450.7 420.4 507.94 353.49 542.95 319.62 M 399.01 491.3 C 435.75 442.96 478.89 396.96 542.69 326.02 M 399.01 491.3 C 443.57 439.28 491.64 385.4 542.69 326.02 M 404 491.66 C 447.5 441.63 489.47 397.52 543.08 331.66 M 404 491.66 C 448.12 438.8 492.65 389.31 543.08 331.66 M 409.64 491.27 C 460.2 436.82 504.94 379.67 542.82 338.06 M 409.64 491.27 C 443.58 450.71 475.41 409.82 542.82 338.06 M 414.63 491.63 C 438.79 458.76 466.12 425.87 543.22 343.71 M 414.63 491.63 C 460.92 437.52 506.62 382.22 543.22 343.71 M 419.61 491.99 C 448.57 459.65 479.28 419.25 542.95 350.1 M 419.61 491.99 C 459.51 445.58 502.62 398.98 542.95 350.1 M 425.26 491.59 C 461.17 441.66 504.3 394.5 542.69 356.5 M 425.26 491.59 C 470.69 444.14 512.51 393.84 542.69 356.5 M 430.24 491.95 C 461.69 456.75 488.16 424.1 543.09 362.14 M 430.24 491.95 C 466.14 445.81 508.25 400.4 543.09 362.14 M 435.89 491.56 C 463.26 462.48 494.57 427.08 542.83 368.54 M 435.89 491.56 C 467.87 459.42 499.04 423.07 542.83 368.54 M 440.87 491.92 C 470.96 452.81 502.8 419.77 543.22 374.18 M 440.87 491.92 C 464.91 462.14 493.26 433.45 543.22 374.18 M 446.52 491.52 C 480.97 449.07 516.57 417.29 542.96 380.58 M 446.52 491.52 C 471.24 464.59 494.22 439.83 542.96 380.58 M 451.5 491.88 C 488.69 448.6 518.25 408.66 542.7 386.98 M 451.5 491.88 C 479.93 455.79 511.63 424.85 542.7 386.98 M 457.15 491.49 C 490.99 459.7 520.1 421.31 543.09 392.62 M 457.15 491.49 C 481.27 462.64 506.77 434.16 543.09 392.62 M 462.13 491.85 C 493.43 458.68 516.53 427.86 542.83 399.02 M 462.13 491.85 C 481.22 473.98 498.82 453.53 542.83 399.02 M 467.78 491.46 C 481.06 472.65 501.33 450.26 543.22 404.66 M 467.78 491.46 C 492.11 466.34 509.35 442.87 543.22 404.66 M 472.76 491.82 C 490.44 469.3 513.92 443.13 542.96 411.06 M 472.76 491.82 C 493.67 468.13 516.37 441.28 542.96 411.06 M 477.75 492.18 C 492.25 474.51 504.46 459.66 542.7 417.46 M 477.75 492.18 C 500.58 467.75 523.67 443.12 542.7 417.46 M 483.4 491.78 C 510.81 464.83 527.67 435.28 543.1 423.1 M 483.4 491.78 C 506.02 467.26 530.52 438.94 543.1 423.1 M 488.38 492.14 C 504.08 473.5 519.71 447.99 542.83 429.5 M 488.38 492.14 C 497.41 480.42 509.81 465.82 542.83 429.5 M 494.03 491.75 C 515.06 470.03 529.21 444.28 543.23 435.14 M 494.03 491.75 C 507.6 473.11 522.26 457.14 543.23 435.14 M 499.01 492.11 C 517.8 474.75 529.68 456.78 542.97 441.54 M 499.01 492.11 C 517.44 474.4 532.76 454.9 542.97 441.54 M 504.66 491.71 C 517.91 474.24 530.22 461.91 542.71 447.94 M 504.66 491.71 C 514.35 480.82 525.07 467.37 542.71 447.94 M 509.64 492.07 C 514.36 482.93 521.91 476.46 543.1 453.58 M 509.64 492.07 C 517.12 483.15 524.32 476.66 543.1 453.58 M 515.29 491.68 C 526.74 481.71 534.25 471.8 540.22 463 M 515.29 491.68 C 525.35 482.88 533.86 470.86 540.22 463 M 520.93 491.28 C 526.5 483.92 526.26 486.01 537.99 471.66 M 520.93 491.28 C 527.05 486.65 531.49 479.58 537.99 471.66" fill="none" stroke="#dae8fc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 387 40 M 387 40 C 411.98 41.75 442.26 38.66 513 40 M 387 40 C 421.28 39.46 453.43 38.5 513 40 M 513 40 C 531.29 37.45 536.7 45.52 540 67 M 513 40 C 529.97 37.48 543.01 53.17 540 67 M 540 67 C 537.64 171.26 537.68 273.67 540 463 M 540 67 C 542.46 188.75 543.94 308.26 540 463 M 540 463 C 538.41 479.1 531.98 488.33 513 490 M 540 463 C 543.16 482.59 531.24 487.93 513 490 M 513 490 C 479.84 485.54 450.93 485.23 387 490 M 513 490 C 465.01 489.88 415.87 490.39 387 490 M 387 490 C 366.53 489.94 363.16 483.36 360 463 M 387 490 C 364.77 488.96 363.3 478.34 360 463 M 360 463 C 355.99 375.37 356.19 286.51 360 67 M 360 463 C 360.17 307.44 361.1 150.89 360 67 M 360 67 C 363.44 45.48 368.41 41.76 387 40 M 360 67 C 362.72 53.26 368.48 38.27 387 40" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="390" y="80" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 392.07 82.46 C 392.07 82.46 392.07 82.46 392.07 82.46 M 392.07 82.46 C 392.07 82.46 392.07 82.46 392.07 82.46 M 391.15 89.61 C 392.92 88.59 393.22 85.7 399.02 80.56 M 391.15 89.61 C 394.52 85.96 395.55 83.84 399.02 80.56 M 390.89 96.01 C 395.94 94.81 401.13 88.24 404.66 80.16 M 390.89 96.01 C 394.4 93.25 399 85.76 404.66 80.16 M 391.28 101.66 C 399.85 92.8 402.67 85.44 409.65 80.52 M 391.28 101.66 C 399.88 93.98 405.42 84.84 409.65 80.52 M 391.02 108.05 C 401.66 97.5 404.79 92.39 415.29 80.13 M 391.02 108.05 C 400.39 96.67 407.78 89.27 415.29 80.13 M 390.76 114.45 C 398.01 102.77 410.13 97.52 420.28 80.49 M 390.76 114.45 C 400.03 103.5 412.59 90.47 420.28 80.49 M 391.15 120.09 C 403.68 109.61 413.47 96.71 425.92 80.09 M 391.15 120.09 C 401.84 106.87 413.61 95.54 425.92 80.09 M 390.89 126.49 C 401.8 118.94 411.92 106.03 430.91 80.45 M 390.89 126.49 C 401.28 114.58 413.57 98.52 430.91 80.45 M 391.29 132.13 C 409.23 114.14 421.61 95.3 435.9 80.81 M 391.29 132.13 C 407.73 111.9 426.71 90.34 435.9 80.81 M 392.99 136.27 C 406.4 119.27 416.56 106.6 441.54 80.42 M 392.99 136.27 C 408.58 118.12 424.36 100.21 441.54 80.42 M 395.36 139.65 C 408.56 123.76 418.39 112.18 446.53 80.78 M 395.36 139.65 C 405.98 126.95 419.42 111.29 446.53 80.78 M 400.34 140.01 C 414.94 118.78 431.89 101.58 452.17 80.39 M 400.34 140.01 C 419.02 116.03 436.23 96.09 452.17 80.39 M 405.99 139.61 C 425.44 117.3 447.68 93.19 457.16 80.75 M 405.99 139.61 C 419.57 122.94 432.03 109.43 457.16 80.75 M 410.97 139.97 C 422.36 127.49 429.76 116.38 462.8 80.35 M 410.97 139.97 C 428.88 119.42 446.49 96.81 462.8 80.35 M 416.62 139.58 C 429.87 124.95 445.56 106.67 467.79 80.71 M 416.62 139.58 C 434.8 118.41 452.83 97.84 467.79 80.71 M 421.6 139.94 C 440.22 117.48 461.83 95.49 473.43 80.32 M 421.6 139.94 C 435.19 124.5 448.5 111.1 473.43 80.32 M 427.25 139.54 C 433.7 128.17 445.77 108.84 478.42 80.68 M 427.25 139.54 C 438.82 123.43 455.23 106.71 478.42 80.68 M 432.23 139.9 C 450.99 120.47 472.68 95.62 483.41 81.04 M 432.23 139.9 C 453.23 117.6 468.98 99.31 483.41 81.04 M 437.22 140.26 C 452.88 120.49 470.25 102.05 489.05 80.64 M 437.22 140.26 C 450.66 124.78 463.36 112.24 489.05 80.64 M 442.86 139.87 C 462.44 118.81 481.86 101.15 494.04 81 M 442.86 139.87 C 451.96 126.52 462.17 115.98 494.04 81 M 447.85 140.23 C 458.07 120.03 473.72 106.13 499.68 80.61 M 447.85 140.23 C 462.81 123.54 473.21 112.15 499.68 80.61 M 453.49 139.83 C 473.49 121.85 485.54 99.79 504.67 80.97 M 453.49 139.83 C 472 118.71 488.36 96.85 504.67 80.97 M 458.48 140.2 C 472.97 121.87 496.75 105.03 508.34 82.84 M 458.48 140.2 C 469.83 124.5 482.74 112.72 508.34 82.84 M 464.12 139.8 C 482.61 122.52 503.41 102.59 510.05 86.97 M 464.12 139.8 C 477.33 123.03 493.09 109.45 510.05 86.97 M 469.11 140.16 C 480.86 119.63 501.21 106.59 511.75 91.1 M 469.11 140.16 C 483.47 121.87 497.16 106.22 511.75 91.1 M 474.75 139.77 C 489.86 121.74 498.91 107.66 512.15 96.75 M 474.75 139.77 C 483.93 129.6 491.4 119.59 512.15 96.75 M 479.74 140.13 C 493.05 131.37 500.28 118.4 511.89 103.15 M 479.74 140.13 C 491.93 126.34 501.97 111.53 511.89 103.15 M 484.73 140.49 C 489.42 130.81 496.88 126.13 511.63 109.54 M 484.73 140.49 C 490.62 133.09 500.86 122.77 511.63 109.54 M 490.37 140.09 C 495.6 131.39 498.33 127.48 512.02 115.19 M 490.37 140.09 C 496.8 131.59 504.95 119.88 512.02 115.19 M 495.36 140.45 C 502.21 137.01 502.62 128.1 511.76 121.58 M 495.36 140.45 C 501.3 134.94 505.72 128.74 511.76 121.58 M 501 140.06 C 502.38 137.99 508.48 135.06 511.5 127.98 M 501 140.06 C 502.67 136.15 506.35 133.9 511.5 127.98" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 399 80 M 399 80 C 434.8 75.99 463.01 81.85 501 80 M 399 80 C 421.71 82.16 439.89 82.02 501 80 M 501 80 C 505.41 77.78 509.83 79.82 510 89 M 501 80 C 506.77 82.17 506.01 85.79 510 89 M 510 89 C 507.92 107.22 510.51 123.47 510 131 M 510 89 C 508.2 105.41 510.9 116.79 510 131 M 510 131 C 507.63 134.13 505.19 143.45 501 140 M 510 131 C 508.8 140.01 511.05 139.42 501 140 M 501 140 C 464.48 144.88 427.73 145.88 399 140 M 501 140 C 461.5 142.57 423.31 139.24 399 140 M 399 140 C 395.09 142.01 391.55 136.77 390 131 M 399 140 C 397.38 139.05 393.46 133.98 390 131 M 390 131 C 392.84 115.38 389.84 99.74 390 89 M 390 131 C 388.58 116.93 391.46 100.67 390 89 M 390 89 C 389.68 82.09 395.25 82.29 399 80 M 390 89 C 394.12 87.04 394.68 76.67 399 80" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 110px; margin-left: 391px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">key processor</div></div></div></foreignObject><text x="450" y="115" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">key processor</text></switch></g><rect x="390" y="180" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 392.37 182.11 C 392.37 182.11 392.37 182.11 392.37 182.11 M 392.37 182.11 C 392.37 182.11 392.37 182.11 392.37 182.11 M 390.8 190.01 C 392.28 185.94 396.63 185.93 399.33 180.2 M 390.8 190.01 C 393.21 188.51 395.27 183.57 399.33 180.2 M 391.2 195.66 C 394.38 189.44 394.85 186.65 404.32 180.56 M 391.2 195.66 C 393.78 192.71 400.79 186.57 404.32 180.56 M 390.93 202.05 C 395.95 194.1 406.96 191.36 409.96 180.17 M 390.93 202.05 C 395.74 194.93 404.95 186.23 409.96 180.17 M 390.67 208.45 C 393.12 204.97 402.87 198.85 414.95 180.53 M 390.67 208.45 C 395.37 198.83 404.45 192.07 414.95 180.53 M 391.07 214.1 C 404.16 203.72 412.95 184.78 420.59 180.13 M 391.07 214.1 C 401.97 204.18 411.47 193.08 420.59 180.13 M 390.81 220.49 C 405.75 208.28 412.97 189.75 425.58 180.49 M 390.81 220.49 C 400.79 208.49 409.79 196.24 425.58 180.49 M 391.2 226.14 C 401.03 212.46 407.24 206.05 431.22 180.1 M 391.2 226.14 C 399.24 216.59 409.76 204.18 431.22 180.1 M 391.6 231.78 C 402.63 215.6 410.45 209.81 436.21 180.46 M 391.6 231.78 C 405.67 216.92 416.1 199.5 436.21 180.46 M 392.65 236.67 C 405.96 227.12 413.06 215.89 441.19 180.82 M 392.65 236.67 C 411.57 216.15 426.93 199.67 441.19 180.82 M 395.01 240.05 C 404.81 228.96 413.53 213.14 446.84 180.42 M 395.01 240.05 C 407.28 224.86 417.09 211.14 446.84 180.42 M 400.65 239.65 C 413.41 226.21 425.78 206.68 451.82 180.78 M 400.65 239.65 C 419.52 220.32 437.43 197.26 451.82 180.78 M 405.64 240.01 C 419.35 224.51 434.11 210.13 457.47 180.39 M 405.64 240.01 C 423.22 222.63 437.83 201.04 457.47 180.39 M 411.28 239.62 C 425.91 225.35 438.95 202.67 462.45 180.75 M 411.28 239.62 C 420.45 228.22 429.24 214.58 462.45 180.75 M 416.27 239.98 C 431.69 220.41 450.94 208.65 468.1 180.36 M 416.27 239.98 C 428.04 227.5 437.6 212.53 468.1 180.36 M 421.91 239.58 C 435.73 219.42 452.18 206.42 473.08 180.72 M 421.91 239.58 C 441.19 216.57 458.91 195.39 473.08 180.72 M 426.9 239.94 C 444.03 217.5 461.65 197.42 478.73 180.32 M 426.9 239.94 C 441.3 223.71 454.35 209.45 478.73 180.32 M 432.54 239.55 C 449.98 221.25 472.39 197.31 483.71 180.68 M 432.54 239.55 C 442.78 224.17 456.67 210.22 483.71 180.68 M 437.53 239.91 C 452.06 218.03 476.96 195.01 488.7 181.04 M 437.53 239.91 C 450.41 227.62 459.41 214.51 488.7 181.04 M 442.52 240.27 C 458.24 223.91 469.57 204.62 494.34 180.65 M 442.52 240.27 C 452.35 224.71 465.82 210.2 494.34 180.65 M 448.16 239.87 C 465.89 224.49 478.63 207.54 499.33 181.01 M 448.16 239.87 C 461.48 223.9 476.67 205.32 499.33 181.01 M 453.15 240.23 C 467.88 219.5 484.45 208.03 504.97 180.61 M 453.15 240.23 C 466.55 225.22 477.83 208.63 504.97 180.61 M 458.79 239.84 C 470.76 227.83 476.57 215.19 508.65 182.48 M 458.79 239.84 C 481.24 216.23 497.8 194.14 508.65 182.48 M 463.78 240.2 C 474.45 228.86 483.37 218.49 509.7 187.37 M 463.78 240.2 C 471.64 231.09 480.59 218.83 509.7 187.37 M 469.42 239.81 C 485.67 220.25 500.41 205.77 512.06 190.75 M 469.42 239.81 C 479.81 226.37 492.45 213.82 512.06 190.75 M 474.41 240.17 C 482.45 225.61 495.9 213.48 511.8 197.15 M 474.41 240.17 C 484.09 225.88 496.89 216.83 511.8 197.15 M 480.05 239.77 C 488.26 231.84 501.25 213.88 512.2 202.79 M 480.05 239.77 C 490.22 232.37 497.44 220.13 512.2 202.79 M 485.04 240.13 C 491.3 227.17 502.21 222.29 511.93 209.19 M 485.04 240.13 C 493.96 228.81 503.66 220.96 511.93 209.19 M 490.02 240.49 C 494.19 235.43 500.22 227.51 511.67 215.59 M 490.02 240.49 C 492.54 233.14 500.12 230.19 511.67 215.59 M 495.67 240.1 C 498.68 236.3 506.75 231.4 511.41 221.98 M 495.67 240.1 C 499.65 235.13 503.3 230.79 511.41 221.98 M 501.31 239.7 C 506.62 233.42 506.93 233.84 511.81 227.63 M 501.31 239.7 C 503.96 237.28 506.98 232.02 511.81 227.63" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 399 180 M 399 180 C 429.75 181.97 462.94 178.88 501 180 M 399 180 C 431.9 180.21 462.81 180.6 501 180 M 501 180 C 509.3 176.45 507.51 180.81 510 189 M 501 180 C 508.54 184.56 507.83 183.58 510 189 M 510 189 C 506.28 200.41 506.58 212.74 510 231 M 510 189 C 510.37 196.04 508.47 204.27 510 231 M 510 231 C 508.25 233.59 510.42 243 501 240 M 510 231 C 510.36 234.98 505.47 242.44 501 240 M 501 240 C 478.13 237.6 452.27 238.71 399 240 M 501 240 C 465.8 243.55 431.08 242.24 399 240 M 399 240 C 395.98 239.79 393.7 240.55 390 231 M 399 240 C 395.36 241.43 389.33 233.15 390 231 M 390 231 C 391.26 216.83 386.42 208.41 390 189 M 390 231 C 389.53 218.84 391.3 206.46 390 189 M 390 189 C 389.42 179.92 392.89 182.34 399 180 M 390 189 C 389.35 186.61 389.97 180.89 399 180" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 210px; margin-left: 391px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">encoder processor</div></div></div></foreignObject><text x="450" y="215" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">encoder process...</text></switch></g><rect x="390" y="280" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 392.03 282.51 C 392.03 282.51 392.03 282.51 392.03 282.51 M 392.03 282.51 C 392.03 282.51 392.03 282.51 392.03 282.51 M 391.11 289.66 C 392.44 288.28 395.36 281.55 398.98 280.6 M 391.11 289.66 C 392.18 288.44 394.97 286.25 398.98 280.6 M 390.85 296.06 C 395.23 289.33 402.02 286.81 404.63 280.21 M 390.85 296.06 C 396.9 289 398.72 283.76 404.63 280.21 M 391.24 301.7 C 400.27 295.15 403.03 289.53 409.61 280.57 M 391.24 301.7 C 396.67 295.63 401.09 287.9 409.61 280.57 M 390.98 308.1 C 399.2 298.11 404.43 293.39 415.26 280.17 M 390.98 308.1 C 399.86 299.62 407.48 287.91 415.26 280.17 M 390.72 314.49 C 395.76 304.22 411.3 294.38 420.24 280.53 M 390.72 314.49 C 399.25 305.61 409.69 296.44 420.24 280.53 M 391.12 320.14 C 401.51 314.19 407.21 298.03 425.89 280.14 M 391.12 320.14 C 400.4 307.96 410.63 298.8 425.89 280.14 M 390.85 326.54 C 401.45 314.73 411.74 306.83 430.87 280.5 M 390.85 326.54 C 400.54 315.36 409.28 306.6 430.87 280.5 M 391.25 332.18 C 402.43 317.12 414.8 305.9 436.52 280.1 M 391.25 332.18 C 399.08 320.34 409.11 310.89 436.52 280.1 M 392.95 336.31 C 407.88 315.05 429.63 302.09 441.5 280.46 M 392.95 336.31 C 412.98 313.42 427.92 294.37 441.5 280.46 M 395.32 339.69 C 417.3 311.86 434.87 288.35 446.49 280.82 M 395.32 339.69 C 407.31 326.35 421.17 310.92 446.49 280.82 M 400.3 340.05 C 409.2 328.05 425.33 313.8 452.13 280.43 M 400.3 340.05 C 419.82 318.78 438.9 300.07 452.13 280.43 M 405.95 339.66 C 415.84 327.54 433.04 303.47 457.12 280.79 M 405.95 339.66 C 425.48 315.98 445.83 294.79 457.12 280.79 M 410.93 340.02 C 429.2 321.47 448.26 294.78 462.76 280.39 M 410.93 340.02 C 421.97 323.6 432.58 310.7 462.76 280.39 M 416.58 339.62 C 431.39 321.5 445.82 300.72 467.75 280.75 M 416.58 339.62 C 430.26 324.39 445.3 307.58 467.75 280.75 M 421.56 339.98 C 433.34 327.62 445.04 315.14 473.39 280.36 M 421.56 339.98 C 436.65 322.82 448.87 309.25 473.39 280.36 M 427.21 339.59 C 446.7 324.32 459.18 307.79 478.38 280.72 M 427.21 339.59 C 440.12 325.56 449.48 310.15 478.38 280.72 M 432.19 339.95 C 448.56 320.48 471.92 297.16 484.02 280.33 M 432.19 339.95 C 448.48 319.48 466.96 301.85 484.02 280.33 M 437.84 339.55 C 461.79 317.38 478.45 297.54 489.01 280.69 M 437.84 339.55 C 456.56 316.56 476.25 294.93 489.01 280.69 M 442.83 339.91 C 466.94 316.89 480.06 292.62 494 281.05 M 442.83 339.91 C 455.47 324.57 471.88 306.45 494 281.05 M 447.81 340.27 C 463.03 329.3 473.21 308.9 499.64 280.65 M 447.81 340.27 C 463.89 322.63 480.24 300.41 499.64 280.65 M 453.46 339.88 C 462.71 324.66 475.58 308.06 505.28 280.26 M 453.46 339.88 C 474.27 317.39 490.61 298.41 505.28 280.26 M 458.44 340.24 C 472.16 325.06 485.98 305.16 508.3 282.88 M 458.44 340.24 C 475.74 318.19 493.96 301.25 508.3 282.88 M 464.09 339.84 C 474.02 323.88 480.24 312.51 510.01 287.01 M 464.09 339.84 C 475.78 325.66 491.12 308.16 510.01 287.01 M 469.07 340.2 C 479.33 331.44 487.93 317.33 511.72 291.15 M 469.07 340.2 C 486.06 321.82 498.18 306.55 511.72 291.15 M 474.72 339.81 C 483.69 328.73 493.56 318.53 512.11 296.79 M 474.72 339.81 C 484.91 325.4 499.05 309.31 512.11 296.79 M 479.7 340.17 C 492.3 333.06 495.05 318.11 511.85 303.19 M 479.7 340.17 C 488.8 327.77 499.63 314.7 511.85 303.19 M 485.35 339.78 C 492.93 330.72 507.07 317.91 511.59 309.59 M 485.35 339.78 C 494.3 328.81 503.21 315.73 511.59 309.59 M 490.33 340.14 C 501.43 331.58 502.76 319.64 511.98 315.23 M 490.33 340.14 C 497.27 332.96 500.61 325.78 511.98 315.23 M 495.32 340.5 C 502.9 336.49 503.07 327.13 511.72 321.63 M 495.32 340.5 C 500.91 335.31 503.36 328.71 511.72 321.63 M 500.96 340.1 C 502.19 338.43 507.41 331.8 511.46 328.03 M 500.96 340.1 C 504.59 335.96 506.95 334.08 511.46 328.03" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 399 280 M 399 280 C 424.71 284.03 454.88 279.99 501 280 M 399 280 C 421.7 278.26 440.92 279.17 501 280 M 501 280 C 505.2 283.12 513.18 281.8 510 289 M 501 280 C 510.3 277.76 509.65 281.37 510 289 M 510 289 C 506.32 302.01 512.32 318.8 510 331 M 510 289 C 508.54 299.06 510.04 308.55 510 331 M 510 331 C 508.87 333.04 507.65 342.54 501 340 M 510 331 C 511.93 339.15 509.08 336.25 501 340 M 501 340 C 463.37 342.4 428.01 335.63 399 340 M 501 340 C 470.11 340.45 438.85 337.16 399 340 M 399 340 C 396.86 337.57 387.86 336.32 390 331 M 399 340 C 393.34 343.82 394.41 341.51 390 331 M 390 331 C 391.37 317.88 392.69 308.29 390 289 M 390 331 C 390.49 320.75 391.13 312.26 390 289 M 390 289 C 389.17 285.76 390.53 282.4 399 280 M 390 289 C 393.78 286.17 394.47 275.92 399 280" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 310px; margin-left: 391px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">mice processor</div></div></div></foreignObject><text x="450" y="315" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">mice processor</text></switch></g><rect x="390" y="380" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 392.34 382.15 C 392.34 382.15 392.34 382.15 392.34 382.15 M 392.34 382.15 C 392.34 382.15 392.34 382.15 392.34 382.15 M 390.76 390.06 C 391.77 385.94 398.96 381.77 399.29 380.25 M 390.76 390.06 C 393.27 388.59 394.65 386.17 399.29 380.25 M 391.16 395.7 C 393.58 392.06 403.57 385.41 404.28 380.61 M 391.16 395.7 C 395.61 388.5 399.78 384.67 404.28 380.61 M 390.9 402.1 C 395.44 396.54 398.32 395.62 409.92 380.21 M 390.9 402.1 C 396.47 396.65 400.5 389.43 409.92 380.21 M 390.63 408.5 C 395.5 400 412.22 388.69 414.91 380.57 M 390.63 408.5 C 394.84 401.78 404.15 394.71 414.91 380.57 M 391.03 414.14 C 401.91 405.16 414.12 389.63 420.55 380.18 M 391.03 414.14 C 399.82 406.29 407.21 395.04 420.55 380.18 M 390.77 420.54 C 403.58 403.47 414.7 397.68 425.54 380.54 M 390.77 420.54 C 401.74 408.19 409.22 398.11 425.54 380.54 M 391.16 426.18 C 402.52 417.84 408.91 400.45 431.18 380.14 M 391.16 426.18 C 408.34 408.17 423.32 389.84 431.18 380.14 M 391.56 431.82 C 404.57 416.53 421.12 392.31 436.17 380.5 M 391.56 431.82 C 405.81 415.24 420.07 399.82 436.17 380.5 M 392.61 436.71 C 407.63 420.74 418.49 409.03 441.81 380.11 M 392.61 436.71 C 413.99 415.14 432.78 389.22 441.81 380.11 M 395.63 439.34 C 414.06 416.44 438.38 396.86 446.8 380.47 M 395.63 439.34 C 405.12 423.67 419.2 410.36 446.8 380.47 M 400.61 439.7 C 415.6 415.64 437.43 395.21 451.79 380.83 M 400.61 439.7 C 420.31 420.99 436.11 399.16 451.79 380.83 M 405.6 440.06 C 422.42 422.9 442.43 404.73 457.43 380.43 M 405.6 440.06 C 418.87 425.42 431.1 407.96 457.43 380.43 M 411.24 439.66 C 420.05 423.22 434.41 412.85 462.42 380.79 M 411.24 439.66 C 423.86 422.6 435.98 406.79 462.42 380.79 M 416.23 440.02 C 430.86 416.92 448.89 394.62 468.06 380.4 M 416.23 440.02 C 433.83 417.61 450.72 398.53 468.06 380.4 M 421.87 439.63 C 441.57 423.58 450.49 400.18 473.05 380.76 M 421.87 439.63 C 440.26 414.9 460.87 393.58 473.05 380.76 M 426.86 439.99 C 438.73 423.47 446.44 410.06 478.69 380.36 M 426.86 439.99 C 438.57 427.81 448.54 414.89 478.69 380.36 M 432.5 439.59 C 447.31 419.49 471.15 397.34 483.68 380.73 M 432.5 439.59 C 444.17 426.29 456.56 413.25 483.68 380.73 M 437.49 439.95 C 450.28 427.22 464.45 414.32 488.66 381.09 M 437.49 439.95 C 455.82 419.98 471.97 397.59 488.66 381.09 M 443.13 439.56 C 455.22 423.49 476.08 405.79 494.31 380.69 M 443.13 439.56 C 456.37 424.24 471.89 406.33 494.31 380.69 M 448.12 439.92 C 460.51 425.71 467.82 418.22 499.29 381.05 M 448.12 439.92 C 468.88 419.05 485.96 393.7 499.29 381.05 M 453.11 440.28 C 472.86 418.66 492.39 392.99 504.94 380.66 M 453.11 440.28 C 466.97 424.17 482 406.72 504.94 380.66 M 458.75 439.88 C 482.22 419.55 496.04 400.38 508.61 382.53 M 458.75 439.88 C 474.89 421.39 486.77 405.61 508.61 382.53 M 463.74 440.24 C 475.05 429.49 486.56 417.11 509.66 387.41 M 463.74 440.24 C 481.38 419.15 499.11 400.41 509.66 387.41 M 469.38 439.85 C 476.14 432.07 487.12 416.51 512.03 390.79 M 469.38 439.85 C 482.41 424.61 493.47 412.44 512.03 390.79 M 474.37 440.21 C 484.28 431.1 490.56 422.85 511.76 397.19 M 474.37 440.21 C 490.79 425.67 506.26 406.55 511.76 397.19 M 480.01 439.81 C 487.51 433.52 496.03 421.59 512.16 402.83 M 480.01 439.81 C 493.52 426.41 503.96 412.5 512.16 402.83 M 485 440.17 C 493.16 427.58 502.97 414.3 511.9 409.23 M 485 440.17 C 491.86 431.18 495.09 426.48 511.9 409.23 M 489.99 440.53 C 496.68 432.59 496.98 429.62 511.64 415.63 M 489.99 440.53 C 497.34 434.4 504.45 426.98 511.64 415.63 M 495.63 440.14 C 496.17 439.46 500.8 429.79 511.37 422.03 M 495.63 440.14 C 503.17 431.85 508.03 427.45 511.37 422.03 M 501.27 439.75 C 506.43 433.86 505.86 430.57 511.77 427.67 M 501.27 439.75 C 505.39 437.09 507.09 432.2 511.77 427.67" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 399 380 M 399 380 C 427.66 382.01 446.81 385.02 501 380 M 399 380 C 431.89 380.4 463.84 381.82 501 380 M 501 380 C 509.09 381.8 510.85 382.79 510 389 M 501 380 C 502.87 380.15 511.47 379.16 510 389 M 510 389 C 506.36 403.2 510.07 408.06 510 431 M 510 389 C 509.03 402.08 509.93 412.84 510 431 M 510 431 C 509.49 440.49 504.87 442.09 501 440 M 510 431 C 513.49 434.11 503.5 439.27 501 440 M 501 440 C 477.01 439.19 452.54 440.54 399 440 M 501 440 C 474.41 441.44 446.62 440.16 399 440 M 399 440 C 389.74 443.35 390.01 440.1 390 431 M 399 440 C 391.32 437 390.28 440.68 390 431 M 390 431 C 389.79 418.93 389.27 400.16 390 389 M 390 431 C 391.44 418.25 390.97 401.25 390 389 M 390 389 C 388.91 383.59 396.17 382.46 399 380 M 390 389 C 389.01 385.74 389.76 380.14 399 380" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 410px; margin-left: 391px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">axis processor</div></div></div></foreignObject><text x="450" y="415" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">axis processor</text></switch></g><rect x="385" y="0" width="130" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 15px; margin-left: 386px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Input processor</div></div></div></foreignObject><text x="450" y="20" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">Input processor</text></switch></g><rect x="240" y="230" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 245px; margin-left: 241px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Event</div></div></div></foreignObject><text x="270" y="250" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">Event</text></switch></g><rect x="690" y="165" width="180" height="200" rx="27" ry="27" fill="none" stroke="none" pointer-events="all"/><path d="M 697.08 171.38 C 697.08 171.38 697.08 171.38 697.08 171.38 M 697.08 171.38 C 697.08 171.38 697.08 171.38 697.08 171.38 M 690.91 184.57 C 697.53 176.01 701.02 178.43 706 167.21 M 690.91 184.57 C 696.27 178.37 702.08 174.67 706 167.21 M 693.27 187.94 C 699.93 183.24 705.5 177.9 711.64 166.81 M 693.27 187.94 C 697.72 180.76 704.62 173.59 711.64 166.81 M 693.01 194.34 C 698.39 186.3 706.31 178.1 717.94 165.66 M 693.01 194.34 C 701.88 184.94 709.76 177.49 717.94 165.66 M 693.41 199.99 C 697.8 189.87 708.31 184.73 722.93 166.02 M 693.41 199.99 C 703.16 187.13 713.16 176.63 722.93 166.02 M 693.14 206.38 C 701.71 197.29 709.42 184.75 728.57 165.63 M 693.14 206.38 C 706.83 193.75 717.01 179.13 728.57 165.63 M 692.88 212.78 C 709.62 196.36 724.03 179.44 733.56 165.99 M 692.88 212.78 C 701.67 202.27 714.32 191.75 733.56 165.99 M 693.28 218.42 C 704.6 205.96 716.69 190.42 739.2 165.59 M 693.28 218.42 C 705.14 199.76 720.59 186.33 739.2 165.59 M 693.02 224.82 C 711.25 203.68 725.95 187.77 744.19 165.95 M 693.02 224.82 C 704.51 210.14 715.69 194.99 744.19 165.95 M 692.75 231.22 C 711.42 216.17 724.86 195.25 749.83 165.56 M 692.75 231.22 C 708.12 213.29 726.01 196.47 749.83 165.56 M 693.15 236.86 C 718.33 214.25 734.87 185.88 754.82 165.92 M 693.15 236.86 C 710.51 219.25 723.9 201.2 754.82 165.92 M 692.89 243.26 C 709.81 223.08 722.41 206.46 760.46 165.53 M 692.89 243.26 C 717.01 219.71 736.89 193.67 760.46 165.53 M 693.28 248.9 C 712.85 231.05 735.57 205.12 765.45 165.89 M 693.28 248.9 C 711.69 228.27 733.15 204.54 765.45 165.89 M 693.02 255.3 C 717.04 235.33 737.38 209.63 770.44 166.25 M 693.02 255.3 C 719.96 224.89 746.82 188.6 770.44 166.25 M 692.76 261.7 C 712.42 242.29 729.15 220.15 776.08 165.85 M 692.76 261.7 C 717.04 230.06 746.95 196.78 776.08 165.85 M 693.15 267.34 C 714.9 248.3 735.63 221.69 781.07 166.21 M 693.15 267.34 C 721.58 237.89 746.79 203.16 781.07 166.21 M 692.89 273.74 C 716.84 249.79 736.79 224.41 786.71 165.82 M 692.89 273.74 C 728.57 240.01 760.6 202.7 786.71 165.82 M 692.63 280.14 C 727.92 238.2 762.13 200.09 791.7 166.18 M 692.63 280.14 C 723.7 245.87 748.38 214.89 791.7 166.18 M 693.03 285.78 C 728.1 247.22 758.88 207.87 797.34 165.78 M 693.03 285.78 C 719.99 256.37 746.77 228.46 797.34 165.78 M 692.76 292.18 C 717.78 265.63 737.37 232.6 802.33 166.14 M 692.76 292.18 C 732.12 245.83 775.71 194.35 802.33 166.14 M 693.16 297.82 C 731.8 250.08 771.11 203.81 807.97 165.75 M 693.16 297.82 C 729.91 258.07 763 216.04 807.97 165.75 M 692.9 304.22 C 720.58 276.44 752.69 241.3 812.96 166.11 M 692.9 304.22 C 716.59 277.96 740.19 248.94 812.96 166.11 M 692.64 310.62 C 742.98 252.35 792.75 196.43 818.6 165.71 M 692.64 310.62 C 740.86 253.97 787.64 202.04 818.6 165.71 M 693.03 316.26 C 731.25 273.25 767.89 228.82 823.59 166.07 M 693.03 316.26 C 729.48 275.26 761.95 236.69 823.59 166.07 M 692.77 322.66 C 726.52 281.48 769.13 240.45 828.57 166.43 M 692.77 322.66 C 719.97 291.24 747.87 260.03 828.57 166.43 M 692.51 329.06 C 738.83 276.21 780.99 229.12 834.22 166.04 M 692.51 329.06 C 743.32 272.72 790.49 220.36 834.22 166.04 M 690.28 337.72 C 741.02 282.87 795.86 220.12 839.2 166.4 M 690.28 337.72 C 724.91 305.29 754.26 267.65 839.2 166.4 M 691.33 342.61 C 738.4 286.4 784.87 233.04 844.85 166 M 691.33 342.61 C 750.32 272.78 809.3 203.07 844.85 166 M 692.38 347.49 C 728.95 303.88 757.62 267.15 849.83 166.36 M 692.38 347.49 C 733.78 297.2 776.11 251.71 849.83 166.36 M 693.43 352.38 C 749.89 287.3 802.32 225.77 854.16 167.48 M 693.43 352.38 C 726.76 311.26 765.66 269.9 854.16 167.48 M 695.79 355.76 C 745.45 301.18 795.07 240.36 858.49 168.59 M 695.79 355.76 C 741.9 300.71 787.89 250.1 858.49 168.59 M 698.81 358.39 C 755.34 293.52 815.96 224.87 861.51 171.22 M 698.81 358.39 C 733.12 315.37 768.42 275.65 861.51 171.22 M 701.83 361.01 C 745.55 314.83 781.73 266.62 864.53 173.84 M 701.83 361.01 C 744.34 312.18 788.77 259.88 864.53 173.84 M 704.85 363.63 C 761.69 298.97 815.75 233.48 867.55 176.47 M 704.85 363.63 C 737.76 322.49 773.35 282.14 867.55 176.47 M 707.87 366.26 C 751.99 319.26 791.59 267.39 868.6 181.36 M 707.87 366.26 C 752.34 316.23 793.89 268.98 868.6 181.36 M 712.85 366.62 C 769 295.11 831.85 226.79 869.65 186.24 M 712.85 366.62 C 776.41 295.62 837.69 224.5 869.65 186.24 M 718.5 366.22 C 753.69 325.02 790.63 289.76 870.7 191.13 M 718.5 366.22 C 774.75 297.43 833.07 229.57 870.7 191.13 M 723.48 366.58 C 780.2 300.77 829.59 241.74 873.07 194.51 M 723.48 366.58 C 751.74 330.78 783.76 293.25 873.07 194.51 M 729.13 366.19 C 755.17 331.94 784.7 301.19 872.8 200.91 M 729.13 366.19 C 758.94 331.99 787.46 298.88 872.8 200.91 M 734.11 366.55 C 777.14 315.43 827.88 263.33 873.2 206.55 M 734.11 366.55 C 775.26 320.96 814.51 273.76 873.2 206.55 M 739.76 366.16 C 777.96 319.3 816.72 281.48 872.94 212.95 M 739.76 366.16 C 788.22 312.5 832.83 257.11 872.94 212.95 M 744.74 366.52 C 779.65 330.79 819.65 286.61 872.68 219.35 M 744.74 366.52 C 781.77 325.74 818.72 280.13 872.68 219.35 M 750.39 366.12 C 792.6 314.83 833.72 267.32 873.07 224.99 M 750.39 366.12 C 793.49 323.42 834.39 274.15 873.07 224.99 M 755.37 366.48 C 797.62 317.73 839.68 263.94 872.81 231.39 M 755.37 366.48 C 784.76 327.84 814.91 291.47 872.81 231.39 M 761.02 366.09 C 800.53 319.19 834.86 281.31 873.2 237.03 M 761.02 366.09 C 794.84 327.54 828.85 291.21 873.2 237.03 M 766 366.45 C 805.08 325.57 839.42 285.98 872.94 243.43 M 766 366.45 C 801.5 328.69 836.62 288.7 872.94 243.43 M 771.65 366.05 C 802.42 322.57 840.07 281.71 872.68 249.83 M 771.65 366.05 C 796.89 336.77 820.14 310.39 872.68 249.83 M 776.64 366.41 C 806.81 336.33 830.96 297.58 873.08 255.47 M 776.64 366.41 C 804.78 336.24 832.89 303.66 873.08 255.47 M 782.28 366.02 C 812.81 327.87 845.03 295.33 872.81 261.87 M 782.28 366.02 C 808.38 337.51 834.56 308.73 872.81 261.87 M 787.27 366.38 C 810.03 340.73 834.37 312.61 873.21 267.51 M 787.27 366.38 C 815.95 331.73 840.6 301.9 873.21 267.51 M 792.91 365.98 C 816.13 341.23 831.24 320.54 872.95 273.91 M 792.91 365.98 C 817.76 333.79 845.12 304.95 872.95 273.91 M 797.9 366.34 C 825.32 340.76 850.4 306.97 872.69 280.31 M 797.9 366.34 C 820.69 342.91 840.68 315.29 872.69 280.31 M 803.54 365.95 C 823.79 345.43 838.71 321.62 873.08 285.95 M 803.54 365.95 C 817.16 350.99 829.15 334.83 873.08 285.95 M 808.53 366.31 C 821.27 344.15 843.98 331.19 872.82 292.35 M 808.53 366.31 C 831.64 339.07 850.52 316.38 872.82 292.35 M 814.17 365.91 C 832.92 343.02 857.08 313.99 873.21 297.99 M 814.17 365.91 C 833.64 344.28 853.33 318.98 873.21 297.99 M 819.16 366.27 C 841.39 345.79 859.31 324.13 872.95 304.39 M 819.16 366.27 C 840.09 345.31 857.58 320.98 872.95 304.39 M 824.14 366.63 C 841.89 349.24 858.45 329.32 872.69 310.79 M 824.14 366.63 C 836.73 351.67 852.37 336.55 872.69 310.79 M 829.79 366.24 C 842.63 349.77 866.71 324.06 873.09 316.43 M 829.79 366.24 C 844.65 348.84 858.6 336.07 873.09 316.43 M 834.77 366.6 C 846.37 357.18 851.88 351.36 872.82 322.83 M 834.77 366.6 C 847.54 348.53 865.46 331.62 872.82 322.83 M 840.42 366.21 C 851.22 358.99 855.77 351.06 873.22 328.47 M 840.42 366.21 C 854.23 354.42 862.39 339.4 873.22 328.47 M 845.4 366.57 C 849.6 362.88 855.37 356.34 870.33 337.89 M 845.4 366.57 C 854.38 355.67 863.1 346.87 870.33 337.89 M 851.7 365.42 C 859.56 362.08 862.29 352.76 869.42 345.04 M 851.7 365.42 C 856.69 361.56 861.78 356.41 869.42 345.04" fill="none" stroke="#dae8fc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 717 165 M 717 165 C 763.22 165.47 805.45 166.44 843 165 M 717 165 C 743.11 164.64 766.81 164.43 843 165 M 843 165 C 858.3 168.44 869.84 177.16 870 192 M 843 165 C 858.26 168.46 870.66 174.8 870 192 M 870 192 C 868.35 247.79 870.92 305.15 870 338 M 870 192 C 872.1 237.94 870.35 287.39 870 338 M 870 338 C 871.28 355.04 858.49 365.41 843 365 M 870 338 C 868.62 354.49 864.8 368.59 843 365 M 843 365 C 814 369.38 779.09 369.3 717 365 M 843 365 C 795.49 364.28 744.37 364.67 717 365 M 717 365 C 695.96 361.89 690.99 359.57 690 338 M 717 365 C 695.38 362.25 688.46 358.23 690 338 M 690 338 C 694.01 292.11 691.45 242.75 690 192 M 690 338 C 689.3 308.6 688.19 281.38 690 192 M 690 192 C 693.57 174.44 699.34 168.49 717 165 M 690 192 C 689.07 171.02 696.84 166.06 717 165" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="720" y="190" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 722.41 192.07 C 722.41 192.07 722.41 192.07 722.41 192.07 M 722.41 192.07 C 722.41 192.07 722.41 192.07 722.41 192.07 M 720.83 199.98 C 724.29 194.48 727.44 196.01 729.36 190.17 M 720.83 199.98 C 723.24 196.79 726.03 193.18 729.36 190.17 M 721.23 205.62 C 721.88 199.4 726.13 194.29 734.35 190.53 M 721.23 205.62 C 723.78 203.04 729.98 196.58 734.35 190.53 M 720.97 212.02 C 726.34 205.24 725.83 205.99 739.99 190.13 M 720.97 212.02 C 727.09 204.06 733.84 198.26 739.99 190.13 M 720.7 218.42 C 726.6 208.57 727.93 208.62 744.98 190.49 M 720.7 218.42 C 729.51 207.58 736.5 199.65 744.98 190.49 M 721.1 224.06 C 732.13 215.3 735.41 207.64 750.62 190.1 M 721.1 224.06 C 728.57 216.06 738.93 206.86 750.62 190.1 M 720.84 230.46 C 732.42 220.86 740.63 207.08 755.61 190.46 M 720.84 230.46 C 728.55 222.88 736.4 212.04 755.61 190.46 M 721.23 236.1 C 733.01 225.44 737.76 215.73 761.25 190.06 M 721.23 236.1 C 736.13 218.04 751.28 201.33 761.25 190.06 M 720.97 242.5 C 741.63 219.17 757.66 197.69 766.24 190.42 M 720.97 242.5 C 732.15 226.44 746.98 211.26 766.24 190.42 M 722.68 246.63 C 739.6 222.64 756.72 202.38 771.23 190.78 M 722.68 246.63 C 736.03 231.68 748.49 217.42 771.23 190.78 M 725.04 250.01 C 737.67 237.87 752.48 220 776.87 190.39 M 725.04 250.01 C 742.77 227.39 762.8 206.95 776.87 190.39 M 730.68 249.62 C 746.52 229.41 767.41 205.16 781.86 190.75 M 730.68 249.62 C 749.04 229.95 768.49 208.87 781.86 190.75 M 735.67 249.98 C 755.06 236.33 767.73 214.42 787.5 190.35 M 735.67 249.98 C 756.68 225.66 777.27 202.24 787.5 190.35 M 741.31 249.58 C 754.59 235.68 766.72 226.21 792.49 190.71 M 741.31 249.58 C 761.94 228.92 782.03 204.85 792.49 190.71 M 746.3 249.94 C 767.01 230.33 789.4 201.46 798.13 190.32 M 746.3 249.94 C 755.04 238.95 767.57 223.7 798.13 190.32 M 751.94 249.55 C 768.76 229.21 786.71 215.33 803.12 190.68 M 751.94 249.55 C 771.12 228.39 789.54 208.75 803.12 190.68 M 756.93 249.91 C 775.43 233.04 792.75 206.73 808.1 191.04 M 756.93 249.91 C 775.94 227.86 795.48 203.67 808.1 191.04 M 762.57 249.51 C 784.04 225.41 805.44 199.77 813.75 190.65 M 762.57 249.51 C 779.58 226.72 797.37 206.54 813.75 190.65 M 767.56 249.87 C 785.4 231.74 799.82 207.68 818.73 191.01 M 767.56 249.87 C 782.58 234.99 800.02 217.2 818.73 191.01 M 772.55 250.23 C 787.2 231.63 803.92 218.07 824.38 190.61 M 772.55 250.23 C 788.68 231.99 807.19 210.58 824.38 190.61 M 778.19 249.84 C 802.2 228.12 817.14 205.3 829.36 190.97 M 778.19 249.84 C 795.29 232.3 812.56 210.22 829.36 190.97 M 783.18 250.2 C 801.16 232.22 817.22 208.37 835.01 190.58 M 783.18 250.2 C 793.05 237.66 805.18 222.58 835.01 190.58 M 788.82 249.8 C 808.87 230.77 827.02 210.1 838.68 192.45 M 788.82 249.8 C 801.06 234.53 813.69 221.17 838.68 192.45 M 793.81 250.16 C 804.87 232.2 821.01 213.84 839.73 197.33 M 793.81 250.16 C 806.39 236.01 817.12 221.2 839.73 197.33 M 799.45 249.77 C 811.14 238.37 821.49 227.51 842.09 200.71 M 799.45 249.77 C 810.15 236.03 823.17 221.64 842.09 200.71 M 804.44 250.13 C 815.84 237.62 834.12 214.18 841.83 207.11 M 804.44 250.13 C 815.95 235.47 827.07 222.65 841.83 207.11 M 809.42 250.49 C 820.24 235.81 832.47 228.26 841.57 213.51 M 809.42 250.49 C 820 236.1 831.61 221.65 841.57 213.51 M 815.07 250.09 C 826.41 242.98 833.09 229.44 841.97 219.15 M 815.07 250.09 C 822.12 241.26 829.04 230.85 841.97 219.15 M 820.05 250.45 C 830.28 240.89 828.97 233.39 841.7 225.55 M 820.05 250.45 C 826.42 243.33 832.77 236.56 841.7 225.55 M 825.7 250.06 C 833.93 241.81 834.69 240.95 841.44 231.95 M 825.7 250.06 C 832.45 244.92 837.06 237.68 841.44 231.95 M 831.34 249.67 C 833.74 247.01 837.38 242.14 841.84 237.59 M 831.34 249.67 C 832.51 248.7 836.72 244.88 841.84 237.59" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 729 190 M 729 190 C 767.06 189.5 802.22 190.95 831 190 M 729 190 C 759.49 190.5 793.42 190.02 831 190 M 831 190 C 840.26 187.94 842.03 195.54 840 199 M 831 190 C 834.55 190.35 844.58 193.92 840 199 M 840 199 C 841.63 211.41 839.45 212.13 840 241 M 840 199 C 837.91 210.91 838.57 220.85 840 241 M 840 241 C 840.25 243.73 839.99 247.78 831 250 M 840 241 C 839.76 246.26 839.12 247.94 831 250 M 831 250 C 805.3 246.5 769.04 250.93 729 250 M 831 250 C 790.26 253.42 753.63 250.65 729 250 M 729 250 C 719.55 249.46 722.24 248.03 720 241 M 729 250 C 722.01 246.98 719.18 246.5 720 241 M 720 241 C 716.83 228.44 722.48 221.1 720 199 M 720 241 C 717.93 227.77 719.25 219.7 720 199 M 720 199 C 720.03 191.03 726.53 193.98 729 190 M 720 199 C 719.04 193.25 721.53 193.79 729 190" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 220px; margin-left: 721px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">USB</div></div></div></foreignObject><text x="780" y="225" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">USB</text></switch></g><rect x="720" y="280" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 722.36 282.13 C 722.36 282.13 722.36 282.13 722.36 282.13 M 722.36 282.13 C 722.36 282.13 722.36 282.13 722.36 282.13 M 720.78 290.04 C 723.81 287.11 725.78 281.36 729.31 280.22 M 720.78 290.04 C 724.93 286.69 726.08 283.05 729.31 280.22 M 721.18 295.68 C 728.13 292.25 727.84 290.72 734.3 280.58 M 721.18 295.68 C 726.97 288.71 731.75 287.4 734.3 280.58 M 720.92 302.08 C 725.42 292.12 736.65 285.4 739.94 280.19 M 720.92 302.08 C 726.98 294.95 733.15 289.89 739.94 280.19 M 720.65 308.47 C 724.32 300.12 737.13 293.57 744.93 280.55 M 720.65 308.47 C 724.79 303.4 733.47 296.11 744.93 280.55 M 721.05 314.12 C 728.57 298.66 744.51 285.31 750.57 280.15 M 721.05 314.12 C 730.15 307.15 733.46 299.88 750.57 280.15 M 720.79 320.51 C 734.79 309.19 748.42 289.77 755.56 280.52 M 720.79 320.51 C 727.79 312.77 736.88 305.01 755.56 280.52 M 721.18 326.16 C 725.73 317.37 734.56 306.16 761.2 280.12 M 721.18 326.16 C 733.73 310.47 747.11 297.41 761.2 280.12 M 721.58 331.8 C 735.08 320.37 746.28 304.25 766.19 280.48 M 721.58 331.8 C 739.13 311.06 758.15 289.97 766.19 280.48 M 722.63 336.69 C 739.45 320.15 753.52 301.33 771.18 280.84 M 722.63 336.69 C 739.31 319.37 751.35 302.53 771.18 280.84 M 725.65 339.31 C 742.56 324.29 747.97 310.53 776.82 280.45 M 725.65 339.31 C 743 318.64 763.02 296.58 776.82 280.45 M 730.63 339.67 C 752.82 321.07 769.33 302.26 781.81 280.81 M 730.63 339.67 C 747.05 318.32 763.44 297.85 781.81 280.81 M 735.62 340.03 C 751.37 321.56 774.67 297.76 787.45 280.41 M 735.62 340.03 C 750.1 323.13 762.31 307.73 787.45 280.41 M 741.26 339.64 C 757.93 321.74 767.84 300.53 792.44 280.77 M 741.26 339.64 C 753.38 325.92 764.9 314.54 792.44 280.77 M 746.25 340 C 756.2 325.5 771.61 315.3 798.08 280.38 M 746.25 340 C 758.71 322.04 772.9 308.74 798.08 280.38 M 751.89 339.6 C 764.18 327.21 777.24 314.01 803.07 280.74 M 751.89 339.6 C 764.33 324.5 777.08 308.68 803.07 280.74 M 756.88 339.96 C 767.78 321.8 788.37 306.57 808.71 280.34 M 756.88 339.96 C 774.79 319.67 795.03 297.86 808.71 280.34 M 762.52 339.57 C 782.68 314.57 804.79 297.82 813.7 280.7 M 762.52 339.57 C 775.12 323.7 787.06 311.87 813.7 280.7 M 767.51 339.93 C 786.77 319.46 808.94 298.58 818.68 281.06 M 767.51 339.93 C 782.14 324.07 796.04 309.52 818.68 281.06 M 772.5 340.29 C 783.05 326.65 791.45 319.73 824.33 280.67 M 772.5 340.29 C 789.24 318.06 806.87 296.83 824.33 280.67 M 778.14 339.9 C 799.47 322.76 811.7 296.68 829.31 281.03 M 778.14 339.9 C 797.78 318.89 816 297.43 829.31 281.03 M 783.13 340.26 C 795.63 319.8 815.98 306.81 834.96 280.63 M 783.13 340.26 C 800.41 318.17 817.6 300.7 834.96 280.63 M 788.77 339.86 C 800.6 329.13 816.78 312.67 838.63 282.5 M 788.77 339.86 C 799.85 328.14 810.14 315.94 838.63 282.5 M 793.76 340.22 C 806.2 319.47 827.64 308.11 839.68 287.39 M 793.76 340.22 C 812.29 320.99 825.41 304.94 839.68 287.39 M 799.4 339.83 C 813.62 329.41 826.36 309.11 842.04 290.77 M 799.4 339.83 C 816.7 321.13 833.2 300.03 842.04 290.77 M 804.39 340.19 C 816.72 321.65 831.42 308.16 841.78 297.17 M 804.39 340.19 C 816.41 325.4 832.87 309.55 841.78 297.17 M 810.03 339.79 C 815.76 325.93 825.74 313.4 842.18 302.81 M 810.03 339.79 C 818.59 331.8 823.37 323.91 842.18 302.81 M 815.02 340.15 C 827.93 328.68 830.06 314.95 841.92 309.21 M 815.02 340.15 C 826.35 331.38 832.73 319.46 841.92 309.21 M 820 340.51 C 830.16 334.58 832.15 323.07 841.65 315.61 M 820 340.51 C 826.79 333.56 832.9 326.56 841.65 315.61 M 825.65 340.12 C 830.22 331.93 838.83 326.87 841.39 322 M 825.65 340.12 C 830.67 334.63 834.73 332.98 841.39 322 M 831.29 339.72 C 836 334.85 838.16 335.74 841.79 327.65 M 831.29 339.72 C 832.96 337.04 836.5 333.41 841.79 327.65" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 729 280 M 729 280 C 762.01 285.48 794.15 277.99 831 280 M 729 280 C 749.28 282.63 771.54 282.67 831 280 M 831 280 C 836.15 276.61 839.71 286.53 840 289 M 831 280 C 836.32 282.74 837.2 281.71 840 289 M 840 289 C 841.67 303 837.19 316.19 840 331 M 840 289 C 840.08 303.94 840.14 315.13 840 331 M 840 331 C 840.87 333.18 837.22 337.33 831 340 M 840 331 C 841.33 340.43 833.54 340.96 831 340 M 831 340 C 790.54 341.3 752.78 337.84 729 340 M 831 340 C 794.56 340.33 761.4 339.57 729 340 M 729 340 C 720.43 337.24 716.39 333.81 720 331 M 729 340 C 719.99 339.36 724.25 335.67 720 331 M 720 331 C 716.94 319.49 720.74 302.97 720 289 M 720 331 C 718.88 315.28 719.09 298.7 720 289 M 720 289 C 719.78 286.86 724.17 276.03 729 280 M 720 289 C 723.47 282.81 726.03 278.81 729 280" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 310px; margin-left: 721px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">BLE</div></div></div></foreignObject><text x="780" y="315" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">BLE</text></switch></g><rect x="715" y="120" width="130" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 135px; margin-left: 716px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Reporter</div></div></div></foreignObject><text x="780" y="140" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">Reporter</text></switch></g><path d="M 540.48 269.5 L 540.52 259.5 L 670.52 259.94 L 670.55 249.44 L 689.5 265 L 670.45 280.43 L 670.48 269.93 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 540.48 269.5 M 540.48 269.5 C 538.66 266.86 539.15 263.31 540.52 259.5 M 540.48 269.5 C 539.94 267.05 540.5 263.59 540.52 259.5 M 540.52 259.5 C 566.86 258.66 596.4 257.73 670.52 259.94 M 540.52 259.5 C 574.6 258.48 611.04 260.95 670.52 259.94 M 670.52 259.94 C 671.03 254.43 668.96 250.58 670.55 249.44 M 670.52 259.94 C 669.64 257.09 669.95 256.57 670.55 249.44 M 670.55 249.44 C 675.02 250.93 678.1 255.1 689.5 265 M 670.55 249.44 C 676.96 254.51 685.72 261.46 689.5 265 M 689.5 265 C 687.63 268.48 683.24 273.66 670.45 280.43 M 689.5 265 C 683.2 269.46 681.67 272.33 670.45 280.43 M 670.45 280.43 C 672.12 275.93 668.56 273.23 670.48 269.93 M 670.45 280.43 C 670.01 277.02 670.12 272.27 670.48 269.93 M 670.48 269.93 C 632.59 266.27 592.41 271.54 540.48 269.5 M 670.48 269.93 C 620.66 272.19 566.43 270.14 540.48 269.5" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 880.5 270 L 880.5 260 L 980.5 260 L 980.5 249.5 L 999.5 265 L 980.5 280.5 L 980.5 270 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 880.5 270 M 880.5 270 C 880.71 269.29 878.84 266.14 880.5 260 M 880.5 270 C 880.29 266.54 879.99 262.08 880.5 260 M 880.5 260 C 906.02 262.53 939.67 264.17 980.5 260 M 880.5 260 C 902.41 259.82 925.35 261.3 980.5 260 M 980.5 260 C 979.76 257.67 981.83 253.57 980.5 249.5 M 980.5 260 C 980 256.58 980.35 252.86 980.5 249.5 M 980.5 249.5 C 988.83 252.03 995.6 256.68 999.5 265 M 980.5 249.5 C 987.55 252.6 991.16 257.38 999.5 265 M 999.5 265 C 997.47 267.1 989.25 270.63 980.5 280.5 M 999.5 265 C 996.67 268.39 991.46 270.91 980.5 280.5 M 980.5 280.5 C 981.33 276.67 979.99 275.56 980.5 270 M 980.5 280.5 C 980.24 277.85 980.36 274.59 980.5 270 M 980.5 270 C 956.96 265.73 929.01 265.71 880.5 270 M 980.5 270 C 942.22 267.45 904.79 266.99 880.5 270" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="985" y="190" width="130" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 205px; margin-left: 986px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">host</div></div></div></foreignObject><text x="1050" y="210" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">host</text></switch></g><path d="M 1013.95 275.07 L 1085.81 275.07 L 1100 292.5 L 1000 292.5 Z M 1016.5 237.5 L 1083 237.5 L 1084.98 274.64 L 1014.53 274.64 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 1017 279.4 L 1083.99 279.4 M 1012.56 284.17 L 1088.42 284.17 M 1031.77 288.45 L 1066.26 288.45" fill="none" stroke="none" pointer-events="all"/><path d="M 1019.75 240.83 L 1079.85 240.83 L 1081.53 271.31 L 1017.98 271.31 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 1014.19 274.79 C 1014.19 274.79 1014.19 274.79 1014.19 274.79 M 1014.19 274.79 C 1014.19 274.79 1014.19 274.79 1014.19 274.79 M 1002.12 294.77 C 1012.1 286.22 1017.32 280.25 1019.18 275.15 M 1002.12 294.77 C 1007.03 288.41 1015.08 281.75 1019.18 275.15 M 1007.77 294.38 C 1014.3 291.1 1017.58 286.67 1024.82 274.76 M 1007.77 294.38 C 1009.96 290.25 1016.42 286.11 1024.82 274.76 M 1012.75 294.74 C 1019.84 285.91 1021.53 281.62 1029.81 275.12 M 1012.75 294.74 C 1019.99 286.25 1024.94 282.44 1029.81 275.12 M 1018.4 294.34 C 1018.77 291.22 1023.64 281.28 1035.45 274.72 M 1018.4 294.34 C 1022.83 289.85 1028.34 279.51 1035.45 274.72 M 1023.38 294.7 C 1032.14 283.36 1034.35 279.91 1040.44 275.08 M 1023.38 294.7 C 1029.28 288.06 1038.16 278.25 1040.44 275.08 M 1029.03 294.31 C 1034.33 289.48 1036.21 284.3 1045.43 275.44 M 1029.03 294.31 C 1034.74 289.86 1041.1 282.98 1045.43 275.44 M 1034.01 294.67 C 1034.14 291.33 1042.88 283.09 1051.07 275.05 M 1034.01 294.67 C 1041 286.6 1042.95 281.93 1051.07 275.05 M 1039.66 294.27 C 1044.53 290.67 1045.94 281.99 1056.06 275.41 M 1039.66 294.27 C 1047.03 286.66 1050.64 279.65 1056.06 275.41 M 1044.64 294.63 C 1048.46 289.99 1053.04 283.53 1061.7 275.01 M 1044.64 294.63 C 1048.95 288.16 1055.52 282.69 1061.7 275.01 M 1050.29 294.24 C 1058.05 287.89 1067.25 281.59 1066.69 275.37 M 1050.29 294.24 C 1056.39 284.91 1064.24 281.37 1066.69 275.37 M 1055.27 294.6 C 1056.72 290.86 1060.9 283.39 1072.33 274.98 M 1055.27 294.6 C 1060.53 288.81 1065.46 284.2 1072.33 274.98 M 1060.92 294.21 C 1066.76 293.57 1071.01 282.3 1077.32 275.34 M 1060.92 294.21 C 1067.06 288.3 1071.31 280.56 1077.32 275.34 M 1065.9 294.57 C 1071.97 292.85 1076.49 289.07 1082.96 274.94 M 1065.9 294.57 C 1071.25 289.99 1075.94 286.25 1082.96 274.94 M 1071.55 294.17 C 1078.57 290.48 1080.18 278.91 1087.29 276.06 M 1071.55 294.17 C 1074.66 288.45 1080.45 281.62 1087.29 276.06 M 1076.53 294.53 C 1080.08 286.03 1085.96 286.54 1089.65 279.44 M 1076.53 294.53 C 1079.36 292.8 1082.57 286.2 1089.65 279.44 M 1081.52 294.89 C 1086.17 289.14 1087.64 287.38 1092.02 282.82 M 1081.52 294.89 C 1085.03 289.68 1090.31 285.26 1092.02 282.82 M 1087.16 294.5 C 1091.62 290.61 1095.14 288.69 1095.04 285.44 M 1087.16 294.5 C 1089.18 291.81 1090.32 288.74 1095.04 285.44 M 1092.15 294.86 C 1092.76 292.82 1095.8 290.61 1097.4 288.82 M 1092.15 294.86 C 1094.13 292.82 1094.97 292.43 1097.4 288.82 M 1097.79 294.46 C 1099 293.89 1099.15 292.8 1099.76 292.2 M 1097.79 294.46 C 1098.26 293.91 1099.25 292.81 1099.76 292.2" fill="none" stroke="#cccccc" stroke-width="0.95" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 1016.73 237.24 C 1016.73 237.24 1016.73 237.24 1016.73 237.24 M 1016.73 237.24 C 1016.73 237.24 1016.73 237.24 1016.73 237.24 M 1016.46 243.64 C 1017.23 240.99 1021.32 240.22 1021.71 237.6 M 1016.46 243.64 C 1018.32 242.39 1019.67 240.4 1021.71 237.6 M 1015.55 250.79 C 1016.66 248.77 1022.78 244.36 1027.36 237.21 M 1015.55 250.79 C 1018.26 247.56 1021.17 241.44 1027.36 237.21 M 1015.28 257.19 C 1016.19 251.3 1025.95 244.2 1032.34 237.57 M 1015.28 257.19 C 1021.33 250.6 1028.15 242.74 1032.34 237.57 M 1015.02 263.59 C 1018.33 258.04 1027.27 250.03 1037.99 237.17 M 1015.02 263.59 C 1021.4 254.51 1033.08 245.73 1037.99 237.17 M 1014.76 269.98 C 1024.14 259.04 1034.69 253.42 1042.97 237.53 M 1014.76 269.98 C 1024.6 261.17 1032.57 248.59 1042.97 237.53 M 1015.16 275.63 C 1021.93 260.97 1031.05 253.72 1048.62 237.14 M 1015.16 275.63 C 1025.76 262.91 1039.4 251.47 1048.62 237.14 M 1020.8 275.23 C 1031.64 264.37 1032.57 259.99 1053.6 237.5 M 1020.8 275.23 C 1033.53 264.04 1043.23 251.7 1053.6 237.5 M 1025.79 275.59 C 1033.93 261.86 1054.69 243.21 1058.59 237.86 M 1025.79 275.59 C 1034 265.23 1044.79 255.13 1058.59 237.86 M 1031.43 275.2 C 1041.8 265.66 1048.1 256.64 1064.23 237.46 M 1031.43 275.2 C 1044.41 260.76 1059.23 244.37 1064.23 237.46 M 1036.42 275.56 C 1041.01 262.81 1051.36 259.7 1069.22 237.82 M 1036.42 275.56 C 1042.9 267.24 1054.44 254.72 1069.22 237.82 M 1042.06 275.16 C 1052.5 260.77 1067.73 249.47 1074.86 237.43 M 1042.06 275.16 C 1053.32 263.45 1063.72 250.2 1074.86 237.43 M 1047.05 275.52 C 1060.7 264.18 1071.02 249.06 1079.85 237.79 M 1047.05 275.52 C 1057.26 262.49 1070.91 251.55 1079.85 237.79 M 1052.69 275.13 C 1064.19 261.69 1074.83 248.29 1084.18 238.9 M 1052.69 275.13 C 1059.64 266.89 1070.62 254.75 1084.18 238.9 M 1057.68 275.49 C 1068.66 263.43 1076.67 252.05 1084.58 244.55 M 1057.68 275.49 C 1063.33 266.61 1072.74 260.28 1084.58 244.55 M 1063.32 275.1 C 1066.34 271.62 1073.57 262.65 1084.97 250.19 M 1063.32 275.1 C 1068.5 270.4 1073.5 262.35 1084.97 250.19 M 1068.31 275.46 C 1072.46 272.8 1082.38 262.47 1085.36 255.83 M 1068.31 275.46 C 1072.01 268.25 1078.13 262.62 1085.36 255.83 M 1073.95 275.06 C 1077.7 270.47 1079.86 270.27 1085.76 261.48 M 1073.95 275.06 C 1078.22 271.84 1081.1 266.26 1085.76 261.48 M 1078.94 275.42 C 1078.54 274.7 1083.77 273.85 1086.15 267.12 M 1078.94 275.42 C 1082.69 272.51 1085.18 270.41 1086.15 267.12 M 1084.58 275.03 C 1084.74 274.61 1084.97 274.14 1085.89 273.52 M 1084.58 275.03 C 1085.2 274.61 1085.76 273.73 1085.89 273.52" fill="none" stroke="#cccccc" stroke-width="0.95" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 1013.95 275.07 M 1013.95 275.07 C 1043.35 275.27 1067.15 272.48 1085.81 275.07 M 1013.95 275.07 C 1041.5 274.73 1072.19 275.31 1085.81 275.07 M 1085.81 275.07 C 1087.1 279.32 1092.76 291.19 1100 292.5 M 1085.81 275.07 C 1091.29 279.37 1096.51 287.51 1100 292.5 M 1100 292.5 C 1066.17 295.98 1036.34 290 1000 292.5 M 1100 292.5 C 1063.27 293.79 1026.16 293.22 1000 292.5 M 1000 292.5 C 1000.52 287.92 1012.03 281.98 1013.95 275.07 M 1000 292.5 C 1004.81 287.69 1006.59 281.42 1013.95 275.07 M 1016.5 237.5 M 1016.5 237.5 C 1041.25 236.76 1061.43 237.78 1083 237.5 M 1016.5 237.5 C 1040.29 236.86 1064.94 238.84 1083 237.5 M 1083 237.5 C 1086.6 249.16 1086.78 259.18 1084.98 274.64 M 1083 237.5 C 1084.56 252.65 1086.35 264.56 1084.98 274.64 M 1084.98 274.64 C 1066.86 274.5 1049.56 275.69 1014.53 274.64 M 1084.98 274.64 C 1072.12 274.93 1057.29 271.91 1014.53 274.64 M 1014.53 274.64 C 1011.93 265.89 1012.25 251.85 1016.5 237.5 M 1014.53 274.64 C 1016.04 264.48 1015.69 256.17 1016.5 237.5" fill="none" stroke="#6881b3" stroke-width="1.9" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 1017 279.4 M 1017 279.4 C 1032.36 275.69 1043.73 282.83 1083.99 279.4 M 1017 279.4 C 1030.07 278.38 1044.87 280.6 1083.99 279.4 M 1012.56 284.17 M 1012.56 284.17 C 1045.03 283.13 1073.03 284.77 1088.42 284.17 M 1012.56 284.17 C 1038.03 283.74 1066.54 283.91 1088.42 284.17 M 1031.77 288.45 M 1031.77 288.45 C 1041.87 289.15 1048.69 288.72 1066.26 288.45 M 1031.77 288.45 C 1037.74 288.42 1047.94 288.49 1066.26 288.45" fill="none" stroke="#6881b3" stroke-width="1.9" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 1016.21 239.06 L 1080.73 242.02 L 1078.11 269.69 L 1021.7 267.64 L 1017.08 238.52" fill="#ffffff" stroke="none" pointer-events="all"/><rect x="580" y="230" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 245px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Report</div></div></div></foreignObject><text x="610" y="250" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="16px" text-anchor="middle">Report</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file
diff --git a/docs/src/images/split_keyboard.drawio b/docs/src/images/split_keyboard.drawio
index c582ae90..dbd61f2f 100644
--- a/docs/src/images/split_keyboard.drawio
+++ b/docs/src/images/split_keyboard.drawio
@@ -96,7 +96,7 @@
                         <mxPoint as="offset"/>
                     </mxGeometry>
                 </mxCell>
-                <mxCell id="131" value="PeripheralMatrixMonitor" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=14;" parent="1" vertex="1">
+                <mxCell id="131" value="PeripheralManager" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Verdana;fontSize=14;" parent="1" vertex="1">
                     <mxGeometry x="-969.02" y="830" width="292.15" height="30" as="geometry"/>
                 </mxCell>
                 <mxCell id="139" value="" style="rounded=1;whiteSpace=wrap;html=1;sketch=1;hachureGap=4;jiggle=2;curveFitting=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
diff --git a/docs/src/images/split_keyboard.svg b/docs/src/images/split_keyboard.svg
index e7d05f1b..50a885e7 100644
--- a/docs/src/images/split_keyboard.svg
+++ b/docs/src/images/split_keyboard.svg
@@ -1,3 +1,3 @@
 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1141px" height="1071px" viewBox="-0.5 -0.5 1141 1071" content="&lt;mxfile&gt;&lt;diagram id=&quot;o6yyYHxXsEDgrrS67M8B&quot; name=&quot;第 1 页&quot;&gt;7Vxbc5s4FP41ntl9sAdx5zFOmvahnelsZrbbRxlkQ4uRV5Zz2V+/EkiAjFw7trCdhjw4cAS6ne9cJTFybpfPHwlcpV9wgvKRbSXPI+duZNu2F1rsH6e8VBTf9SvCgmRJRQIN4SH7DwmieG+xyRK0Vh6kGOc0W6nEGBcFiqlCg4TgJ/WxOc7VVldwgTqEhxjmXeq3LKFpRQ3toKF/QtkilS0DP6pKllA+LEayTmGCn1ok58PIuSUY0+pq+XyLcj55cl6q9+53lNYdI6igB73gO9UrjzDfiNGJntEXOVyCN0WC+Btg5Eyf0oyihxWMeekTYzCjpXSZi+L1T0TjVNykME43BH3kD925jPAjWyzKatlIp/GGPKL7jNKsWIgX5rig93CZ5RwZfyOSwAIKsoAB8Pl9lue3OMek7KCTQBTOY944JfgnapX4cYhmc1YCSSwqiNhdd5rEzD0iQtFziySm7SPCS0TJC3tElI6BEwkmChR7nrh/ajABgCuIaQsQniRCAcRFXX3DK3Yh2LWDdda7Yx2wTfHO8lXe2V3WuYGGc65tgnN2dL2cuyExbyuma9afO7hhQ0dE8hFvSNmDlFKmam3PuWE/bNj8hz+wniwwZm3BVbaexHhZFsTr8tH7edUEu1Qa8ezpdjO74TIPYxRr4TILPZcJoCl8OCo+gK8BCNAApH7wJICAYADI2wKIHx0KkMCIBgkHgBwHkDhBs3CmA4jjO5GTGAOIpQIkAF2AOJ4OIGZMjDcA5G0BBISHAgRYE+lBnIKR6AAjgxIW+IjbAhfoZCC0EHXNmNjJ4bXsC59A4YBTSBZIPBaJSJZP3C9xQFAOafaoRpSnxQPgrOxDzxn9h11bk8ATt99bRXcc6Ja8eZE3BRtV9Zbtyfvv7cLmvfJOvvhbggVIFXB+tES64NHPqRgez4pA0XX/3w1PR0xlTFcT2NWC//8CKcme+XhjWMhaRtVsy2cG43NNxicMPcX2hEwcw6j58zuWqPZK2pbISKxTp8LOrbaO0lrHKy19SuSXGQ1Ff/ga/QGii1mbGnU7FUjDUKkweMF4XY6cCZbFxvxcqZEthfKASAbzQzUJH/xnOEO5ymiYZ4uCXcdsVkvR4/KRxTC/EQXLLEl4HVOCWJ/grKyPs22FMybqvHJvOvLuNBzbwVgNIyW6O8JZZ6dFw6N2AlgrtNaEmXigyO1YeGwHs1fU/pWPsKnaVip1tqQaz+drhrhtcNQ9PMze+ObsTQWPh1WeUVnHjMjCO8LmgQxWyIwH8wqbEm3ZFBB5dZjSNiSu15MhAecNXy5mSN4KdhTrFeq83+Bi1gsYdH+nnz9cp6myO9D5hPJHxGvW801KkBFjZbmqPhh7RmyVWulWGsSMqdLlVo/FRo522KmvzIitUkSYIUNksFiXsFghUDNwjm4B17UnYV8Wyxos1lVhp22x6tyMkt0LL2axZHc0Wmm94mmXXfGWmKIy4mqHKvtUFetRVbFURI0G0zQ1wyRBZBxXCYubsqPkj/G4Tf+zrMZ6Va/MjrFRup0wQR3roHTPpXR3hgl96l23I0urGhkd5rOR0S0OK8k5oabbmTxBOtyv00GqAZ1lFlXaTJTtmmKwp7poTteo+ppcomtmUQsAXV5qWNV6jeELdLHa5TKNoCutcQpZONIV1atOBYJdsnRUdGXLPUJyB5uR6EomFGXMJuNkowFWjbB+I6xb7pHC/DbPUEGH8Orilt4Lzm3mddss+4LZkHe+EpgFGoejV5gBgzAbljauEWLbSxt6iPWFL7u7dFYC5C8EEw4H1gYPq0vaN5LxaXifIQwwFcJEgTtxVO/K37tDwo7sCdBgYHs59TgMdD2mAQP9YsCPJjI/W++S6Yp9r1x3ujm/ksNf33uyok9Jjy4r6cE72Q71VtwEJTXiyNOm7dSIJ7TEBVIjQXcZ+yfiTaHHKuaFSy6cxWy90rmIV50uCczunLJ8RcxFTcemS8zmQ5xuzrJR8dXu2i+4yCgerHoPVl3jzPdr1YfTn0fujkYg8VDQwTgrifzAgabCvebQttxlolvD0G2INnN2yzeSUNi//xbYO/bfqjbk4J1Nw5LKLr/B1ewluKTf4O7eTPDqlFV16MOKqzToqPzIRXkcZEhTnTlNBcDWkcJIc2q9v4Mc3jWdJzzCjVAkVgqnKrHOxSRW9seExK4IjhEHq1Uq+kFOz71iEapLt2cWU4Nbn9eoSEq4rzDRLFgM2Do7tvzAn1wUXv7p58JAuMMvXcKsqLTWDEPCkUdTgmByKM6GYPmVX7ja9icCr4sk3ScKjMTJvmbfj3Qy3yVjjW3RY4xVFzS9KJwEVpPzDjts7nPLnq/7VokhlbGultJb4cmgMvpUGfbWd5ECnfHpT2XoTpnuD0GY85LiBS5g/hnjlZi1H4jSFzE/cEPxu/dC9kY9LRbLb9mcuh0RgC081WuwspIqahPvNVDRVGV5e6qqYr1OVTeEwJfWY2KR48Scv793D+TxSo+vEwzqrY/lgy276Wq++mZKu7Hb5juwFcKar+k6H/4H&lt;/diagram&gt;&lt;/mxfile&gt;"><defs><style type="text/css">@font-face { font-family: "Architects Daughter"; src: url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAAMAIAAAwBAT1MvMoWwV7IAAGWAAAAAYGNtYXDPBugkAABl4AAAARxnYXNwAAAAEAAAkvgAAAAIZ2x5Zv2v7C0AAADMAABb/GhlYWQC0dksAABfqAAAADZoaGVhCEMEFgAAZVwAAAAkaG10eN2yH1kAAF/gAAAFfGxvY2GKxKMcAABc6AAAAsBtYXhwAa4AzAAAXMgAAAAgbmFtZUarZSoAAGcEAAAlEHBvc3QANIw5AACMFAAABuNwcmVwaAaMhQAAZvwAAAAHAAIAFv/5AHwDhQAKABMAADcyFhUGBwYiJicmEwYQByM0NxI1PyoTCyUGDhUFC1sGD0MIDkMQCSgIAQgKGQNhGv2rLWebAS1pAAIANgHqANcC+wALABcAABM3JzQ3FxUXDgEjIic3JzQ3FxUXDgEjIpIBASQREAMZBSRcAQEkEBEEGAUkAlIcKVMREMciAw1XHSpTERDHIgQNAAACADgAxgKdApgAQwBQAAATNDMyFjM1Ii4BJyY0Nz4BNzYzNTQ2MzIWHQE3NTMXMxQjIiYjFTI2MxUUBw4BBw4BBwYjNSYiDgEeAQYHIyInJicuASQmIgYHBh0BMjc2NTRWKhIlAw4+IQcODgchEjEJGggIGWQyIbBJHUMHPHE8oRooBgIDBw84FikjCQwHDh8IBwIFOBYiARMMEh0OIz0SJgFTHQlZCgUCCBEIAQYDBnQOBQUObQqFhTYLZhAUHwwCAwIgLg8dYwIKGB4bFAIBYhUIApcDAwIFB2oHDzMiAAMACf/8AisDcAAtADUARAAAJRcVFAcGIycWIycmJyYnNjc2NzUjIicmNSY0Njc2NzUzFzMVDwEzFhQOBDcmIyIGBxc2JTc6ATYzJzQmIgYHBhUUAVcSJxUgDgdOHAQCBQMJVhIGGJs2EQIoJEJNMSHItgHjARUoNDEofQokGTkNBof+wSsOGBEEEQ8YLhUvx6ULDwgExhQBAg4YBhIHAgGFLg8XCiY5FyoM6McqGb8JKDYpGxUToRAOBlcnbQEBlQEDFBAlKCoABQAfAAMB2wJbAA0AGwApADYASAAAJCY0NzYzMhcWFxQGIyI3JiMiBxwBFxYXFjc8AQAmNDc2MzIXFhcUBiMiNyYjIgccARceATc2NAMiPQE0Ez4BMzYyFA4DBwYBQRIMFCgaFy8EKigfQhYbHwYMEhIkCP5/EgwUKBoXLwQqKB9CFhsfBgwSIwsQVQ+pZU8EBQcfMTtDIElIHjUUIQwZLjIhZBcdBBMTDwIEIQURAUMeNRQhDBkuMiFkFx4DExMPBAgMIf4IGwkhAQqfZwMVRltobTFvAAMABf/+AqoDFwA2AEMAUAAAJRQjIicuASMGBwYjJyoBJyYnJjQ3EyYnJjU2NzYzMhcWFRQHFhceATM+Ajc2NzIWDgEHBgcWBRQzMj4BNzY3JwYHBhM2NzY1NzQmIgYHBhQCbiwdLhEjFR8lgGEgAQkRLBYHArYsCxAIPC8vJBMNbgNbLD4IOSoUDB4qChgCEBU2Z4f94hEDL0chOU+mGCBVfS4aFAERKyYMFkwcGwoREBREAgQLFAcNBAEiTB8xQmZDMyMWKHXTKEwlJCAqGg8nJxMFHhpCS0MUEgELCxMvphgwfAE4Gl1HSBoSCiUbMZAAAQAbAbYAgAJrAAkAABMyFRQHBg8BNzZoGCIKCTA4DAJrIylDFA4EsAUAAQAPAA4BGgNgABgAADcUIi4CJyY0PgI3NjMyFhcOAhQeAsc9LCIXBw8QHisaOzwLEQVePR0gJSAiFCtDUSdKR19wcy9qBA2FgnV3XVhYAAABABoAAAFKAy8AGwAAEyc0NjMyFxYXFhQOAgcGIyImNT4DNC4CHAIYFFNBThsHDRkjFzI4BA0RNDAiJUBVAvsQFw1dc7kxN0NLTB9FDAQqSUlPgXhiVgAAAQAnAHECDgK7ADcAADc2NzQnJicmNTQ3HgEXFjMyPwE2MxQOARUyPgEzFA4CBwYVFBcWFAYHLgMnDgMjIiY1NlJHBiQPEDUDJS4TJxYKClIIMBUKH1ovGh4uNBc1DBgdFhQQChAUEh8jKBoEDQm+gTQWFwkJHykKDAEaDRwC2BUlazofFwsgIxUNChc0HiNCLw4JCikvKQoPLSoeDAQSAAEACgAiAgIB9QAqAAATNDMyHgQVMxQHBgcGBwYUFhcWFAcGIyInLgEnJiciBw4BNTQ3PgE10iMRCgYGBQXcXhoYQQsCBAUKARQYEwMCBAQKDhslSz1kPCgB4hMNHiYqJgcnBgEBAQMOGyofPysMEBAVNx5LIwsWARobBQQMCgAAAf/q/6sAdABnABIAADc+ATIXFhccAQ4EBwYjIicwBhASCA4GCBEUFAkHGBUGBlYNBAIEDQIHEx8hHhAHGAIAAAEAHgDYASsBJgAOAAA3IjU0PgI3MhcWFRQGB1AyFzlXMBQOFAkS2BoNCggQBQcKDgUQBgABABf//wBsAEMADQAAFyY1NDc2MhcyFhQGBwYuFxkKCwMVDwwJDwECEhYTBwERHA4DBQAAAQAVAAABuwKxAA4AADMiPQE2ATY3FhQOAgcGJxIPAXwTAwUYP1kwbyAKLAI6HQQDFkaEnUusAAACACb//gJnAmcAEgAlAAA3LgE0PgI3NjMyFxYVFAcGIyInFDMyNjU0NTQmIyoBIyIHBgcGdCQqGCU1IktfgEQ/X12aWVfAiotyYwsRBzU0MSMgLBdFUG5eWCJJXlV+lVNQuYeOgwQEc3pIQmdeAAEAHAAIAG4CNgAPAAA3ND4ENyY2MhYXAw4BHAMDBAMCAQIUGRMEEAI0EBNRZnBmUBQWDAQO/f4SDwABABAACgI7AkkALgAAJTIUDgUHBiMiJjc2NzY1NCcmJyIOAiM2NzY3NjIXHgEXFAcGBxYyPgICGiEsNzANLT4kcUMiFwdLUXkFCy4sODEzJQEaNF8iKAonOAWEJCMLL1JcWqcyFwoBAw0RCh4VE0Jom1cRDx8JJCwkIR9AHAsBBDAyjawvKAEXIR4AAAEACv/+AfECLwAqAAABFAcGBxYXFhQOAQcGBwYiLgE1PgE3NjQmIyIHJyQ1NCciDgEjNDc2NzYyAeJgGBF7GAUPMCJHTxshFBZLciEnJh5MgyMBLzk7l1IrFyovmrkB+zxREw8COA0cL0AePhgIAQwOE0YmLz4WPi2MPRoIKBIvCAoMJwAAAgBJ//ECqAI/ABoAJAAABSInNyMnIyImNTY3NjMyFRQHNxQGDwEGBwYVAw4DBzoBNjcBjRUDBEl4SA0aNTKfO0IB3Q0FuQ4DBU4WPzwwBgcwWjYPDMYBCBFERdnoHiIDGhgBDycxUDYB6B45OTofCwYAAQAbAAACxQJ5AD0AABM3Nj8BPgEyHgEGFTI+AjMyFhcOBQcVNjc2MhYXFhcUBgcGIyImNTQ2MxUyPgE0JicmIgYHBisBIhsHBwkMBBEeDgEGRouKikYKEQUEFC9QfrV7IClMUDUiSQlFNGKCHBggFHZoPSQaKGY0GUMjECIBIUU6UmQNBA8WHA0eJB4FDgwQEBEbJhyAAwcNAg0cVz9XGjEMFBQkEiE7WCgKEBAKGQACABb//AJsApkAKAA0AAATPAE+Ajc2MzIWFBUGBwYVFB4BMz4DNzY3MhcWFQYHBiMiJyYnJiU0IgYHBgcWMj4CFhovPyVQUA4SeFFRJyEUECkzPCFKSyIUEw9jUWlBN3AtFQIUQE0lMEISK0paQAEaBS1WU0odPQoVBBZmZXsoVikNKjExFCwCHh0jeUM4FixqMg8iMCAoRwMKKEEAAAEACgAAAmICNgAiAAAhJzQ1NDc+ATciBwYiJy4BNTQ2NxYyPgIzMhYUFQYHBhQXATYDPxsyCTY1wlskCwcHCxNGeImIRBAQrigIBjoGBVyBNWAnAwsCBQoJCQoFAQ4VEhAPA8G2J0YgAAADABb//wJ+AlgAIAAwAEQAAAAWBgceAhUUDgIiJicmNTQ+AjQmJyY0PgI3NjMyARQXFjI2NzY1JiMiBwYHBgEmIyIHBgcUFjMWMj4CNzY3NCYCJyUCMTogC0dsgV5XJlkgJSALBxIgNUQjRD5V/n1EL4RkJlUYf1hXUyYUAY8rQIs/FgQmHgUVMEBBGzwKEAJEJ1g3FyYpHkRlQiANEShQGTEsJx0TCRc4OCsfChL+SEMbEhwcPWdRJyY1HAFXE0UYIh4fAQkSGQ4gGxEcAAIAHgAAAg8CaQAiADAAADMuATU+AjcmIgYHBiIuAScmNTQ3Njc2MhcWFxYUDgIHBgMWMzI3NjQmJyYnIgcG9w0TYFMsBAoiPSNQLi09Gg5lUlEUIxB1IQwEIjkjTMUuRGNlBAQMHDiTNBMCGhI5V1Y3AQkGDQMYGxMPSkg7EAQFJGUlND5pYCVSAX4UKREaIRMrBFUgAAIAHwBlAJwBcQAJABYAADc0NjIWFAYqASYnJjU0NjceARUUBwYiTRsiEhMQDR8gDh4JHxEaBBV+DxwWGRUKzwQLDxQBBBcHFQYCAAAC/+r/WgBgAWcABwARAAA3MhQGBwYHEicmPgEyFhcWIyJEHAcMHEdTHQYCFhkUAQETH3VASSRRHQEbwQQbEhINHgABAFQAOwGvAdMAGgAANz4BNzY3MhcWFA8BHgEXFhcOAQcGIy4CJyZUIFYsbC8NBgME6w84IlE9AQYECQIecEQdROUZRCJVGhYJEgazCBkRKCgBDggVEycbDiIAAAIAQACLAcsBbAARAB8AADciNTQ2MzY3NjcyFRQHIgYHBicHIic3Njc+ATIWFRQHXhgNBE1BfUciATlXKGk3Eh4CFANPpEEMDxGLIwMNDQcPDiQHBxAJGYMBEiQDCREMCQoZCwABADIAMAGqAb0AFAAANyYnNDU0Nz4BNyU3HgMXDgN2LQVHaUAG/vgyMVNNTCkaT1dVMBETBAMfKj0xF2MxIxwRFx8fP0JEAAACAAr//AHyArwACQAoAAAFIjQzNjIWFAYiAyI1NDc2NzY1NCciDgEjIiYnNjMyFxYVFAcGBxcVBgEWJCQHERISEQWdBIYpgmkrgkQiCxsEfnNTN21wPGJzGAJGAhUgFQEVMggKShpSNS8ZFwseDykUJklDUiwsIRcDAAIAG//7BBICqgBGAFUAAAEGIyInJjQ3Njc2MzI2Mh4CFxYzMjUmJyYnIg4CFRYXFhc+ATc2NzYyFhcGBwYHBiInIicmJyY1ND4CMzIXHgEUBwYiJyYjIgcGBwYUFxYyNjc2AlBrTSQUFw4eYTBCBAwZGRAHBw8iUQlaUWBUmnVGIHNBb1SZRZVoBw8bAgKUdqpYXQyKZ1YmE1GHr1+IYTJAHi6SQAQeIiRDEwYEBhYiIE4BVlsVFzkdQyIQAQ0aIA4hOlA5NAc9bZZZXy0ZDQcTFS1tAwsQUT4yGA0EJR4/IS1hrYJLOh9hdBwscBQRICULEQgIBA4kAAACABr/8QJ+AroALgA4AAABMzIWFRYnLgEGFx4BFxYXDgEiJwMFBwYHBicmNTQ+Bjc2Mx4DFx4BJw4CBzI3NjcmAiUcER8HNg8ZEAEKFw4kIBEtAwGN/u8KHSQGEyAqKy8qIg4FBQooKy8hIBsJJOwIOCIMRGMZFy8BbgYTKAEBAgEFHUgkWScVHAEBKUMqcy0KCAwIAnBzfnJbKR8LFxhNWFolDgLYPYBHHigLCckAAAMAHv/5AsQCqAAhACsAOwAAEzYyFhcWFxYVFAcGBxYXFhUUBwYHBiMiJyYnJjQ3IiY1NBM+AjU0JyYiBxMjIg8BMjc2NzY0LgInJkFKhGc0bhoHTTNf6VMuTFOBd2ZOOAIDCAcLEn2hzls8QdeOdRlSCgpagVQnFB0tNxooApgQCg4fNQsPLDMiIw03HSc2Oj4pJhdARJfPcAURGP2qCTtFICoZGh0BPBHJKx0jEiYZEAkCAwAAAQAW//8CwAKZACYAAAEmIyIHBgcGFBcUFxYzNjc2NzIWFQYHBiMiIyInJjU0PgIzMhcWAgpBT0tFVyEMAkM/YoZ7IiYOHWNEfmYHBm9PVDtnjVFFFRoCK0A5SHIpNg9jNTELXBoYCBNWJkRFSW1SlnNEExcAAAIAJgAGAn8CgAAUACIAABM2MzIXFhUWFRQHBgcGIyInETMyFgUmJyYjBwYHETI3Njc2aUp631IgAXVrnWhEHBQOFxwB1AlaQ2USX0VGabZEGAJmGm4qQQkJZGdhOygIAnAP0FkrIAECHP4jM1p3KgABAB4AAAJKAn4AIgAAATIXFQ4BBwYHBhYXFhUyPgEzFQUXMj4BMxQHBicGBAcTFjMBYWQhG141lDYRAgEERK9gM/6BBmPPazwMGBOw/uswBBpGAnsNMQQBAQMMUDoQJzUYCzcwpBMJFBIgDRMWBAJ+CAABACb/+AK7AnoAOQAANyY1NDY3NC4BNDYyHgIXFjM+ATc2MhceARUUJwQVFB4BMzI+AjMyFAcGMwYHDgEHBg8BBiMnIiNeOCYTJBAVKAwEAQMFGkOGQoRrHwEGIf31EgkGOXV1djkBAQMDK3ExZitjEAsLDiUFBaYIEg0iEjyVUkQSCxASCBMBFQsWAxMcCREFEztBXRgUFxQPCRgYDwcMBw4XxAsDAAABABb/wAKuAowAOwAABTUGBwYjIicmNTY3Njc2MzIzNzIHDgMUFjMyNzY3Nj0BIgYHLgEnJjc+AjcWNhcWDwEGFRcUFQYiAfBfJVZBTjg5BR08i0VaAgIbLgRQjGc7UD82YD0eDx7bEQUOAQIuC/JCFgoeDSACUxMCHjgxt0EVLzk7TFBSrlEpASQEQm+UmkQvHiYSFJQuAwMHBw8fBiMKAwIFAQEiIj2plRQRDwABABX/+gJKAtsALAAAEwYUFwcDJjU0PgU1Njc2FwMyNxE2MzIXFB4CFxYXFhcGIyYnJiIHBpsDE08kIyEQAwYFBRYKGQkG9zIGMgsHAwMEAgMCByotNi4DQjAePgEaIn1ZKAEQBRMOJhkfUFpQEBYFDRf+xSABPBEBE01ibTFmMHhKEnK5AgMEAAABABr//wBpAkYADQAANxQjIicmNDY3NjU2MhVpGBIZDAQCBh0mEBERG8yFOHoHEREAAAEACQAEAgYCdgAeAAABJzQ2OwEUHgEUBgcGBwYnJicmJzQ3NjMWFxYzMjc2Aa0DBQxDBgICCRU7LWJjS1gNDxsWAR5GmxoZMQFHvS1FEFxdQmk/kSIZDQ4sM0UXESA5JVQDGgABACsAAAJhAtAANQAANzQ+BTc2NzYzMDMUBgc+AzMyFRQOBBUeAxcWFRQHBisBIi4CJxUGBwYiKwUFAwMDBAQJDwguDhEBQXlpVhUjQGBxYEASU2dvLmgRBwcKMFRfeFUCEBc0DwQQQl1vdG8uZBMXJvQXIU1BKxsVMzc4NS4RCyUvNRs7Jw0FAi5ARRfIBAUHAAEANwAOArQCrgANAAATJxcDBRYUBwYjIiclNlACUAkCDxAPHSUJCv3nGQG1+QP9tg8FGA0aAgVdAAABABwAAgMsAqoAPQAANxcUDgEiJyI1NBI+Azc2MxYXHgEXEzYzMh4DFx4BFAYiLgYnNC4BBgcGBwYnJicDBgMGBwZ7BAEXIQkhLAwJBAgIDytITDYkEcgVCyAiFxENBg4PEiAgBwcKCgoIAgIOHRo4ag4XGxO4GBQDAQWnSQYgGQEdGAFTYkMgIAoTJKh4QAwBXA86U2RtNH1AGxkZJTxLU0w7DxQiCBspV84ZDg8+AYcw/vIhFxkAAQAZ//gCYALMACQAAAEQBycmJy4BJwYRFAcGIiY0PgE3NjQnPgEeARcWFxM+ATMyFQcCYBlJN4IzZSoUBBMtEgUHAwgCFhgeLyuTjhMLFhIjAQFh/tA0Bl+sRIZCWf71ZkYSCRUtajua30gUEhM/PtG3AfIUD0AlAAACABYADgKOAl8ADgAcAAA3JjQ2NzYzMhcWFRQGIyIDFDMyNzY1NCcmIyIHBi4YLylXg4lZZJmi4QrudUlJV0pxWkVEqDaScSlVP0iGpp4BLexGRXBpNzBBQQACACb//gJ9AmYAFgAsAAAXJzU+Azc2MzIWFxYUDgIHBiMHFBMUMzI+Azc2NSYnJiIOAgcGBwZTLQUGECQkQa5LaBk5OVtyOWZeBAMrBh5LVFUiTQ9oHzFDWDwDAQQMAgLpS3RUOREgHQ0cZFE7JgwU4AwBXTIBBQ8YEipBQRIGBRosHQwQMwAAAgAbABYCtQJ6ACAAQwAANzQ+AjM2MzIXFhUUBwYUHgIUBw4BLgEnJicGBwYnJgUyNzY3JyY9ATQ2Mh4CFzY3NjUmJyYnJiIjIgcGBwYVFBYbLFZ+UgwMgkpDRAEdKx4BCyYNFgobFCZPyH5RATI8GTYVtwEcKTEuLRgzAQEFDBhhL1QIPjQpHRl29ECRcEQBTkd0cmEFFRYSFBEFCAkDDwkVAyQaP2pFRQULI6YBAgUSCSArLg5OXBwjJB09Ewo6L1NDOWhZAAACAC7/9AKrAocALwBBAAATNjMyHgEVFAcOAQcGBxQeAhcWFx4BFA4BKwEiLgEnJicVFCsBIicmNTc0JzYXFgUnIgcGFBcWFxYyPgI3NjU0djeQWno9gBOhHD0UCB48NZ6nCBoQFgwUFH9dMHFCIgsVCg4DDRgjCAFXQeIiCgIFEgMPKUVOJHECUjUkKBg3Ngk3ChcNBQcRHx1WYgYVGQoFVkAeSRblFBUgVsmUcCksChMBNA4rECkSAQgVHhAzIBIAAAEAD///AnACYAAzAAA+AjcWMzI3Njc2NCclJicmNTQ3Njc2Nx4BFxYHFAcOAgcUHgEXFhcWFRQHBgcGIyIuAQ8fEQMFdl18WB4KA/5hEhEfYmy1KRQGGQ0fBYKoUyUBLkAzfLQKPkZ8Zz0zXC5qHQsDWzooKg0RBV0EDRYSRTg9HwcBAgMDBxMiFBkiJBkFDBEOIjQWEzUxNyYfJCIAAQAAAAACfgJEABwAAAEnIgcGBwYUFwcTJyImNDYzFhcWMzc2NxYXFhUGAepZIy4CBhUCXh/VCAkSDElKiWA+SUgQBAFCAesCByc+3IMbBwHuDBoWGgMHDAICDgMvCgYTAAABABT//gIWAmMAMgAAJRQjIiYnNwYHBiMiJyY1NDc2NzYzMDM2MzIVFAcGFRQXFhcyMzI3Njc2NzYzMhcWFQMUAg4fDxkDClwqQkUNDpIoDQQDCgwFBCANKCIWLwYGozMeBQMCCxMTFwMKEBIJA4BPFCEBEKtOuzowAQEwITGhPkElGAWdXII8Ox4ROjj+gikAAAEAC//8AnICoAAYAAAlJgInJjU0Nx4BFxYXNj8BNjc2MzIVAQYiAQUbkhg1MyM9HkctEDhSQhMjGBj+5BE1EEgBHS9tEw0UQYE5izUQeK2MKyoq/ZELAAABAA4AAAOzAvYAOAAAJTYTMhceAQ4CBwYHBicuAScuAicmJwYHDgEHJwMmNDY3NjIeBhcWFxI2NzYzMhcWFxYC+zJCPwMBAQgPFg4iJCQUCQ4JDUYrFC4fJFwQGgk++gIHCREiDwkGESEmJhEkCXQ2BwsGK2YcGDumogGuJwwKO2qMTLN7GREJHxQRklYlUw44+yxLFwMCQgUKCgQGDRQYJkpSUSJLCQEeawwRwDMvcgAAAQAbAAECTwJ3ACEAACUOAyImND8BLgQnNDc2HwETFwMeAxUGBwYiJwEqGi0vND0YAb40Ry4ZCwIbFxHA7zrwIldMMwMSBBQU4RVIRDIRGwjhQFo6IQ8EFAgHCegBGi/+4y5BOTonFwgCDwAAAQAc/+4CEgKZAB0AAAUiJyY3Nj8BNjcBJjQ3NjIWFxYXPgMWFw4BBwYBFhASIwcMExsODv71BwgNJScdOYI7NB8ZEgQfOR5PEgoVEBU/Wis0ARAJDgQGDBgwm6xjHQIEDEKnWewAAQAc//0DAgJXAB4AACUGIyA1NDcBJiIGBwYHIiYnNiUyFhUGBwYHFjI+ATcDAvfP/uAKAbAoM0AykzgPBwLfAR4OGhylwh83lJikShATJQgIAeICAQQMAxIhGAoIEU6wzikLCQ4FAAABAB//rAGWA0IAGgAAEz4BNzYzFBYHDgEHBgcGFB4CFSUUHgEUBwUfIU8pZy8FCxJEJFgZAQwUEgD/BQQF/rADCwUSCRcNHAYFDQkUEiBckrCwXSMFFhkUATUAAAEAAP/+Ae4CWAAQAAAFAgMmNTQXNDYzHgMXFAYBuvKsHAodDzpmZ29CIgIBEAEOLQIBDxMIOZSakTYUGAAAAQAA/58BywMzACkAAAEQEw4DBwYjIjU2MxcyNzY0JicmJyYiBgcGIyInJjQ3ND4BPwEWFwYBoygJOk1YJ00cAzIuFG0pGAcHDRYLJj0jYTADCBQJ/EcaHh4FBAKS/sr+XwEFBwYDBjcDATAbh6dVrZoBDAkZBQ4gCwIkCQQCARJCAAEAEgH+ASwCrwAXAAASJjQ2NzY3FhcWFxYUBwYnLgInBgcGBykXFRMqPjMRHCQGBAsZJQ0YHz0WBwYB/gomJBQsHSEOGTgMFQYQDxsMGh4qJAwOAAEAIAAAApgAdQAMAAAzJzU2NzY3MhYVFAcEIQFZwttbDhkR/qsSFCQLDBQIDxUXCQAAAQAvAe4AlwJoAAoAABM0MzIfAQcmJy4BLw8JDUMRQgwEBQJMHA5BKy0UCBAAAAIAEgAGAfUBxgAeADAAACUGBwYiLgEnJjUmND4BNzY3NjIXMhceAhcjLgEnJic0IyYjIgcGBwYVFBc2NzY3NgGkS30dLx8mECUEFDUmT1wbLRI6FA0FBQo7BAQCBQs5BwdJUSYbKERaUiMXIKZ2HAYBCAkVJhItSlYkTBYGA08ys2EoGyoSKro6AUYgKDktOwsCUCMpNwAAAgAeAAcCKwLnABwALgAAEyc0NjIWBxM2NzYzMhcWFA4CBwYHJgYjIicmNRcUMj4BNzY3JiMiBwYHBhUcASEDFiAaAwc/a1lDOyAYJTxOKExKBhwUNikKVik8VStkMw1BO0ppLRMCRIEQEhEP/lBUOTAmHmNJQzoXLB0CAg1fwtwLECcfR2A5LD9dJSYKDAAAAQAWAAACbQG/AC8AACQ2MhUUDgMHBiImJyY1PAE+ATc2NzYyHgEXFhUUBwYHLgEjBgcGFRQXFBcWMjYB2E5HBTFHVChTRlEjUR48KFRcICscHgsaIgkHBRAbdlVgATEldVZ6HBYFFR0aFggREBIqUgYkQ0McPBIHAQMGDSYYFwYFFyAZMjk/BwhAGxQbAAIACf//AfQDIwAhADUAAAAOARQXFAYjIj0BBiMiJicmND4BNzYzMhc0Njc+Ajc2MwEUMzI3Mjc2NzU0IyYiDgEHBgcGAfQLCQ4RFC+OYidRJAUTOypcay4qBQMGBAcHDyX+XjkJCyk8chk5BxcwPB09FwkCw7evxW4XFE4haiY6GDJHTB0+DhJaMoIvIQwZ/XpPAhgtIYUjAQoaEyk3FQACABQABgIJAdMAIQAvAAA3MjcyFhUOAScmJyY0PgIzMhceARUUBwYHBiMnIgcGBxYAJiIGBwYVFjMyNzY1NOdYsQsOKOJibxgCIVBsPTpIIigBAjkZIZBIJhYJGQEDMCBIHEVQKG8nGEZQDwpETBkdYBNAaV42KBMwGQcHPRAHBh8RIlsBRQ4VDSAjBxMKDxIAAAEADgAGAmADPgAmAAABMhQXBRcnNCcHIicmNTcmND4BMh4CFRQHJicmIyIHBhQWFzI3NgJZBQL+qRJRFIINCRCYFCRFTlFKNAUoOUQ8ORMJCBQ+TZQBTjYKKt4EWnQyDxoVNqzXeCkiNEEfGAo4LDRRKpl/QAsXAAIAF/5RAfsBrwAmADkAAAEnIgcjIicmNTc2NTwBNRM0JwYjIiciNT4CNzYzMhcWFA4CBwYDJiIOAQcGFRQXFjI+Ajc2NTQBPA4eIiY8IhLmagUBopYNDUMCMk8yTUhUNhAGFSIXJgkMK0Q+G0IJBxUoRUoeRv5UAQQXDBgLA28EEyABQhELlwE7Lm9nKT9Z7siAaj4OFgMSBCQ5I1YzEAgEBx0uHEA9JQAAAQAX//0B8QKcACYAACUGIjU0JyYnJiIOAQcjNjQmJyY0NzYzMhYXBxQXNjMyFxYXHgEXFgHxCUsFCR1IWzsfB00CBAMFCAoTFxoBBQlaYB8jSxcLBgEGDhEbdixhBw43f3M5YodQXH81EyENpV0uPAUnLBc0IXIAAgAYAAYAiwKBAAgAEwAAExYXBiMiJicRJzQzMhcWFAcGIiZ1DQkGKgsXAx4pGxEDCAggIAHWu/YfCQgBv4gjDAsVCgoPAAL/jv6RAK0CwwAiAC0AABcUIyIuAScmJzQ3NjUeATMyNzY1NCcmNDcmNzYzBhQeARcWAxYVFAcqASc0NzatWAkbNRtBEgUJIUwrHREQDhQCAxkTFwkBCwcRPxASAQ0PDwbIpwEHCRYqAwsUAxksKiQkYZvpfygYDAk+SE2USqEDKAsYGAUNIA4FAAEAHv/7AmQC2wAtAAA3FxQHBiInEzQmNTQ7ATIXFhcWFz4CNzYzMhcGBw4BBx4BFxYXFAcGByMmJyZ+BSYIFg8BEyIIBwIPBQsJEXZIIEsTEAkyby1ZJUN4OIFdBQkcCD1lx7ZXUBEDBQF2UaNRIAE+WMNDCVQzFjETP00fPSESJxAmBRsIDgIRFSkAAQAW//8AgAKqABAAABIuASc+ATMyExYVFCMnNC4BKwQBEAkRECMTCkAIBgMBulUpUAwW/tmrqy4BNKJ4AAABABr//QMWAcsAOwAANwYiJic0PgE0JzQzMh4BFzY3NjIeARU2NzYzMgcTFAcGNSY1NzQnDgIHBhUGIyImNzY1NCYnIgcOARRuKRsKBgUEBisKCwUCGk0pSDcnGltTQl8CFR04AQUWQkc2FS8GIRYcAxMTDpAyFgUQEQYLIWRydDAgSCgJLxsNES0lMSclSP6MBQIEDhQUoXFCBSExKVyYFQ8GajsvVTdzM1k/AAABACL/+gHjAfMAKAAAJTQnNiMiBgcGBxEjJjU0Njc2MzIVFAYVNjMyFxYVBxQXBiMuAScuATUBoQ0IICJsIlEJQw0LAxoQGQWiWWUOBgECCgYDFBAKAtt3OA8iEScl/vAinYyECRE7FysId6M5ZU8sKQYBBAEoUyMAAAIANP//AjABwQASACMAADc0NzY3OgEXFhcWFAcUBwYjIiY3FBcWMjY3NjU0JyYjDgEHBjRmUXIGLCVSHgwBX1iEX2FFIRl2WiNLICM5J08jTL52SDkMDRxHHCcIfUhCWE8+FhASFjBlPCYpBxAXMQACAD7+ggIhAcAAHAAsAAATNjMyFxYVFAYHBgcUHgIXHgEVFAYjIiMDNh4BBSYiBwYHBhUUHQE2NzY1NHuIY34qEz80ea0BAQEBAwMgGgUFEAkeEgEoIUslVCgSzlYyAZEvQh8kMmorYxgLMTxEH00WBxkZAyQNAg41EQcQNxomBAStLlIvMjUAAgAk/p0B9AGQABgAJwAAAQcjAwYHBiMiLgI1ND4COwEyFhcUEhcDNCMiBwYVFBc6ATY3NjUB5RsXDydPSDkuPR0BOGh9Ow4dMBACC2QUZVFWNg8xRhxC/p4BAbUlGRcaHyIKOm5YLioarv6urgKALztBYTACDRElSwABABv/9QIiAeIAKQAAASYjIgcGBwYVHAEWFQ4BIiYnLgMnJic0MzIeAhc2MzIXNjIXFhUUAgYqQj41ZCUQFBUaEg0IAQYJCwULBiMVGA4FAoTEFhgGEgkLAW0eFypCHiIGN10wAQgQFwY4UF8uZC8YIy0sCXYBAQwOFDIAAQAW/+MB3wHKACgAAAEyFRQHBgciLgEnNjc2NCIHJicmND4BNzYzMhcyFhUmIyIHBgcUMzc2AXFuPVuaBxEJAnNKMnZyNCYhJDwoYmkfHRgIO0pcPD4CKUleAQI4KjhTMhwPAiY2JC4cAiMfPzUuEy8GKjAbJSQ6HAgUAAEAEP/xAZMCqAAdAAA/ATQnIyczETY3NjIWFxYVFBc2MzAzMjcHJxMGIyKyAgebApYDCQ4TDggQAyAgNBMQA5IFEg0yYKAmG0UBAgkJDgQMQoUhIAQCSAT+pwgAAQAN//8B6QG5AC4AADc0LgE0NzYzHgEUBwYVFBcWMzI3Njc2NC4BJzYyHgMUFwYjIicGBwYHBiIuARYFBAYNKRwTCSEDEF4xLFQeCQUHAQ0ZGxMGAQQMCygTDR9CWhEqPziFEDlERh1BCBgjGldGFxpDER8qLkU2QScGGkhhaGEjC1ALECQMAhA6AAABACL//gIEAeYAGwAAEyY0PgEWFxM+Azc2MzIWFBUOAgcGIiYnJiQCChMXB6gIIy0xFTAJFRM4Xx8MFSg0IToBgwUNFhABDv7IDEFSWSVVHxADes49Eh8/NWAAAAEALv/rAxABxwA1AAABDgEHBiMiJyYnJjU0NhcWFxYfARYXNj8BNjc2FxYXMj4BNzYzMhYUFQ4DBwYHBicuAScmAZcWHQ4WHA8TLlRSFg4iDgcKGSopFhQfKCAZfTUNCRkTDiErDgsMGh0dDiEWESYRJhUzARRJfCk7DjGopCkSCQQKFQoZPmlXIjZWcQIQwVIQeFMkVBMMAyJXW1kkTgYILxY8IFAAAAEAEv/9Ad8B4AAvAAA3PgE3Jy4CLwE3HgEXFhc2NzY3MhYVBgcOAQcWFxYXFAcGBy4DJwYHBgcGJyYaMWQLVBAeGAcHOi0rDRYqDiQ8JBccGjESHgk9VRMICxENEykuMRsXKUsZEyMJHjF+FVwRIhoJCD43OREcKRQ0WSsgDjg+FikYK2cXDAcOGAYJLzg4EhoxWhIEFgUAAQAW/lgCIAHXACAAABMGIyImNz4BNyYnJjU0PwEWFxYXPgI3Njc2MzIXFhQH7hUdDg0GFlMOI0uaASZPfyATFRgPDSI8CQoZCwQC/ocvGRFd7ikjadgVAQEmSa8sHio9JR9TgAQNBQ0GAAEAE//8AfQBsQAuAAAXIjU0PgE3NjcqAQYHBiI1NDYyPgI3NjcWFRQHDgEHFjM3MhYXFhUUByYiBgcGimRYQh5HLQkkRSZnQCcRCRYpI0WTMEY+jRwnHaQmPgcQBBk2WD5VBCwcWjkbQTcFBAsOERwCAwUDBwwGHSVHPn4eAwcHAwkZCgwDBgUGAAEANP92AbMD8gAzAAAADgEUFxQOAhUGFBcWFxYyMwYUHgMyFwcmJy4BJy4BJyYnPgM3JicmNDY3NjMVJgEHFwwKHyYfAgsaMhUJAQYJIS8vKQoEqCsWCgUGJhU5CQUgJSQKAgQGCxMqaikDoDRdknEVGxcYEwUREicgDTtNWUwjDQNIC30/mC4MHBEuKiUpGxkXJjA8YFkmVDYDAAEANP+6AG8D1AAHAAAXIyIHAzMRFGcaEgQDO0QCBBr76gIAAAEAGP8mAakDjgA1AAAXJzYyNjc2NTQnOgE3Njc2NCc0LgI2NC4EJzUyFxYXFhQHHgMXBgcOAQcOAwcGHAQKKzAZRQYBChU1GwkCIScgAQ0fKiomC24/MBEJAQooKiADAj8YLAYFBg4bGznaSAMNEjGgLjsNHyoPEAUTGBYbNlp0WzIbCAQ2Uj50NWcZFyEfIhcyMRMZBy1bVUocPQAAAQAaAeYBsAKOAB4AABMiByImJz4BNzYyHgIyPgI3Mh4BFAYHBiMiJy4BlCA2BhsDDzwhCBQdJCYrGRUZFwYXARASM0AuGxQcAjdRCA0wSg0DFSYiDhomGA8PFiUTMh4SF///ABf/TwB9Ad8QRwAEAAIB2T9Y0eQAAgAV/7oCbQI6AC0AOQAABSMiBycGIiYnJjUmNTQ3Njc1Mwc2MzIVFAcGByYnJgcRPgE3NjIVFAYHBgcVFCcyNwMGBwYUFxQXFgFaGxMCARwyUSNRAVFRcTsBIxRZIgkHCRYNMh88HURPOydMXWQZEgGQKAsBMSVEAkoEEBIqUgYHSkxNIop9BD8YFwYFLQcEDP7aCRkMGhYZIQ4aEFACggMBIThGEx0HQBsUAAH/6gAAAhgCVwA9AAA3IjU0PgI3PgM3NjMyHgEUIicmJyYiDgEPARcyFxYGDwI+AjIXFhceAQcOASYnJiIOAQcGIyIjNjcdMxgcLhEDBxMiHk87SF8tIyMZKzg8MzIOD1MpDAQMEm8bKDwzLxoqVgYGAwgrHxM3SRwXCytJCgsPBfYZDgoEBQM/XD8mChouPCYjGg4SDy8sfAEXCRQGAcAHCwYEBxsCDQcQBgcFDgUIBRBDtwAAAv////sCWAJEADQARQAAJQYjIicOAQcGIiYnJic3JjQ3JzcWFzY3OgEXPgI3MhYVBg8BBgcWFRQHFAcWFxQHBgcuASUUFxYyNjc2NTQnJiMOAQcGAcNVgC0iCC0KDwoVDR8HVyhAUEg0HkVaBy0jCikVBx0hBxAZCAUtASkvKA0WDxcx/o0hGnVaI0sgIzknTyJNbz0JCCQJCwQFCg9LLLpAT0M4IiUJDQ0wGQcjDwwZJQwHMjsHB00/LDAJDhoHCS99PhURExYwZTsmKQYQFzMAAf/2/+4B9QLGAEgAADc2NzUHIgYnJic3Nj8BASY0Njc2Mx4DFxYXNjc+ARYXDgEHBg8BPgE3Nh4BBg8CNjcyFhQHBg8BBgcGJyYnNjcGIyI1NDZ5XS9vBQ8IEwIUAooB/vUFCAwZDRAZGR4XIWVSMBAZGAUQKBU1GgIXKBIQEQMJCWUDOj4XDAJSSQgDCxoWDAIIAks7GA26DgUrDgEBAw4kAg8tAREHCg0GDwwRFB0ZI3jwKQ0CHQwiTCprSBkDBQMFChMWBg4tBw0YEggCEaIHCBMNBhYPfA8jBA0AAgAcAAgAbgI2AAYADwAANxMzAwYHBgM2NyY2MhYXBxwIQggCGhoDAwQCFBkTBAgQARL/ABIIBwE5dWUWDAQO6gAAAgAKABgB7gK/ADYARQAAATIVFAcGBx4BFRQGBwYHIicmJzY3NjQiByYnJjU0Ny4BNTQ3Njc2MhcyFhUmIyIHBgcUFjM3Nhc0IyIGBwYHFDMyNzY3NgF9cUEjMD8xQDBviAkTBAKCXUh3bDQmIWIhJUJkkQ4tHRgIO0qMOhEBGRBJWUQvJlsjTwkoCwxdRUoB9zcsOh8dBicXHUEbPgskBwIWLSMnEwIjHyNDOg80GjMzTAwBBiowG04XHxEKCBRaHCAVMDYaAR4tLwAAAgBCAlUBKQKYAAoAFAAAEyI1NDcyFhQGBwYzIjU0NzIVFAcGWhgyFQ8MCQxzGDMkKgsCVSIMFRIcDQMFIg0UIh8BAQADACb//gJnAmcAEgAlAFAAADcuATQ+Ajc2MzIXFhUUBwYjIicUMzI2NTQ1NCYjKgEjIgcGBwY3NDU0PgIzMh4BFAYHLgEjBgcGFRQeARcWMj4CMhYUDgMHBiImJyZ0JCoYJTUiS1+ARD9fXZpZV8CKi3JjCxEHNTQxIyBDKERJHgcaHRUIAgoQQTM3AQ8NFEQxLi0eCwMcKTAXMCcuFC8sF0VQbl5YIkleVX6VU1C5h46DBARzekhCZ14PBgYqWUkmARE2GAkUHBMuMjcGJiUKEhcdFwcPFBkWEwcPDg8l//8ACgB/AOABcxBGAEQDfBwsIrAAAgBUADsCmQHqABoANAAANz4BNzY3MhcWFA8BHgEXFhcOAQcGIy4CJyY3PgE3NjcWFxYPAR4BFxYXDgEHBiMuAicmVCBWLGwvDQYDBOsPOCJRPQEGBAkCHnBEHUTYIFUtaTENBwYH6w83IlwzAQYECQMecEMeROUZRCJVGhYJEgazCBkRKCgBDggVEycbDiI7GUUjUR0CFRMOswgZES4hAg4IFBMnGg8iAAABAEkAeAJLAWAAEwAAAQYdARQHBiInJjU3BTcWMj8BNjICSwUJDhYJEQP+RwMQPTx/UncBVTcXISNKAQIFKmgHQQEFCwYAAwAm//4CZwJnABIASwBbAAA3LgE0PgI3NjMyFxYVFAcGIyInFDMyNwYrASImJyYnFRQGIyImNTc0JzYXNjMyFxYVFAcGBxQWFx4CFzY1NDU0JiMqASMiBwYHBiUiBwYUFxYXFjI2Nz4BNCd0JCoYJTUiS1+ARD9fXZpZV8CeRgYHCgk3JF4vFAMRBwIGDRcdSi0lO2BrDQsZWX0KAiZyYwsRBzU0MSMgARVuEwUBAwkCCiMaPTIYLBdFUG5eWCJJXlV+lVNQuYdfASIWPBBuCAEpIHEvNBkjGgoOGR4fIwcDBgwsQwcEQGAEBHN6SEJnXsIYBxQIEwkBCAkUHhEEAAEAHgIWASsCYwANAAATIjU0PgI3MhcWFAYHUDIXOVcwKgsBCRICFhkOCggPBRcECQ8GAAACABkBDgDFAbUADQAbAAASJjQ3NjMyFxYXFAYjIjcmIyIHHAEXHgEyNzY0KxIMFSc0Hw4DKSoeQhcaHwYMEhQRCg8BLB42FCEqEhczIWQYHgMTFA8CCAohAAABABL/+wIFAfUAMgAAFyI1ND4CNy4BJyYnIgcGByImNTc1NDMyHgQVNxQOAgcGFBYXFhc2NzIXFhQGB3ozFx5KLAIEBAkNGyVLHAwNwCMRCgYGBQW7BCJNSQMDBQwBUUYpCwMJEgUaDQoFDAgVNBo7JwsWAR0PKKYTDR4mKiYHFRcWDAoNDhcfGUQfDgoXBAkQBgD//wAJAK8BZQHeEEcAFQAAAKon+iGj//8ACwCqATAB7hBHABYABgCsJkMkxQABABkB8gCPAnAACgAAEzYzMhYOAQcGBydeDhAKCgIICRE0HwJdExMSEAsTKxwAAQAh/5IBygG+ADkAADc0MzIXBgcGFBYXFhcWMjY3NjU0JjQ3NjcWFxYUBwYHBiInJjU0BwYjIicmJwYVFxQHBiInNjQmJyYhKw8WAQQHAQgZQS9YMAcIDwEDGxcNCAEBGgMOEAMCLD88OTMQAQQYBhQMAQICBuLcFCYfPzgnJygbFCUcLhwwaxsIFgYXWjtnG5MHAQkCEyUCIxoXGwsKWD8NBAQFFy4ujAABABL//wFtAeIAHAAAASciAhUHIgYnJjc2NzY3JicmNDc2MhcDJyI1EzQBOQsGBAEGFAkWAgIBAgFdNU5GMY5WDygCBgGoAv6XHyABAwcdGi9gCxIgMW4fFhv+OAMgAWYgAAEADwDIAGYBGQAMAAA3PgEyHgEXFAYiJicmDwUYDhIYAhQaEAgR8BgRAxcQGA8FBQwAAQAr/xcA9QAcACUAADc0MzIWBxQWMzYyFxYVFAcGIyInIjQ+AScWMj4BNzYnJiIHIjUmLwwMEgQCEhYzGygvKTUbHwMBAQILIDQwDBo4DCogIgEIFBsDGyoCChAlKCAdCgoODQIBCRMLGAgCA2wJ//8AGgCSAFsBtRBHABQABQCOMbQhTf//ABcAkwEAAYIQRwBSAAAAlB0uIegAAgAyADACjgHZABQAJwAANyYnNDU0Nz4BNyU3HgMXDgMXJjc+ATc2NyU3HgMXDgN2LQVHaUAG/vgyMVNNTCkaT1dVxFhBIV8ZOwj+9zIxU05LKhpPV1UwERMEAx8qPTEXYzEjHBEXHx8/QkQHIjMaNhEmHWMxIxwRFx8fP0JEAP//AA3/+AIYAqkQZwAUACsAlS1bHhIQJgAS+PgQRgAXehcm3yRF//8AFwAAAh8CsRBnABQABQCNMRYePxAmABICABBHABUAtwAJKFUl4v//AAn/7ALLAp0QZwAWAAIAkC0NJ28QJwASALX/7BBHABcBCwAYKigpHP///+IADQF9AtoQRwAiAYUC1co7vv3//wAV/+wCeQNjEiYAJPv7EAcAQwDOAPv//wAa//ECfgNvEiYAJAAAEAcAdAC1AP///wAa//ECfgNVEiYAJAAAEAcBOgCMAKb//wAa//ECfgN1EiYAJAAAEAcBQABqAOf//wAa//ECfgMvEiYAJAAAEAcAaQCMAJf//wAa//ECfgNDEiYAJAAAEAcBPgCsAPgAAgAeAAADdAKoADwARwAAASciBwYWFxYVMjc2MxUFFzI3NjMWFAcGBw4BBzUmLwEHDgEHBgcGLgE0PgI3Njc2NzYzMhceATMyFxUGBTc0JwYHMjc2NyYC24tFLhMEAQNIPXhA/ssFc0eBVgQHEyFv3GEgAhmwBA0JFhsGJA8UJC0XNhsVGB0XLhcgaDiRKhb+ZAQIfRgsHDUfAwIvAwpYMhAyKggQNiakBgsCDgkZBwwOCAMFAvIaDzUdRyIIDQoaTWdzNn8qLhccKggCEDIDzH84MLdlBgwBDv//ABb/HgLAApkSJgAmAAAQBwB4AN0AB///AB4AAAJKAxwSJgAoAAAQBwBDAIwAtP//AB4AAAJKAycSJgAoAAAQBwB0ALsAt///AB4AAAJKA1USJgAoAAAQBwE6AH0Apv//AB4AAAJKAuQSJgAoAAAQBgBpZEz//wAI//8AcAL5EiYALAAAEAcAQ//ZAJH//wAM//8AggLaEiYALAAAEAYAdPNq////x///AOEDExImACwAABAGATq1ZP///9H//wC4ArcSJgAsAAAQBgBpjx8AAgAKAAcCogKAAB4AMwAANyI1ND4CNxEzMhYXNjMyFxYVFhQOAwcGIyInNRMRNjcyFxYGDwEVMjc2NzY1JicmIjwyFxMNCA0YGwJKeuBTHwEhQ1xmNHpXGxNUISMqCwQMEl9GabZEGAtZQ9DCGQ4KAwECAYUPCRpuKkEILE5QRzwWNQe0AWL+4gYDFwkTBguEM1p3KipaKiAA//8AGf/4AmADihImADEAABAHAUAAYAD8//8AFgAOAo4DBhImADIAABAHAEMA6wCe//8AFgAOAo4DBRImADIAABAHAHQBCQCV//8AFgAOAo4DGRImADIAABAHAToAugBq//8AFgAOAo4DHxImADIAABAHAUAAkgCR//8AFgAOAo4CyRImADIAABAHAGkAogAxAAEATABJAZoBqQApAAA3BgciJic+ATcuAjU3HgEXFhc+ATc2NzIWFQ4CBxYXFhcUBgcuAScm+WAXFRgDK0EIIzEmKiEfChEdChgOHxsRExMwFQYuOg4GGQQOHhEr0XMTEgUrUw8mOCkBLigqDRcbDSUULiEXCyk9HRIhSREJChkCByIUNgD//wAW/98CjgKQEiYAMgAAEAYAElrf//8AFP/+AhYC0xImADgAABAHAEMAtABr//8AFP/+AhYC/hImADgAABAHAHQA3wCO//8AFP/+AhYDLhImADgAABAHAToAkAB///8AFP/+AhYCzxImADgAABAGAGl0N///ABz/7gISAxISJgA8AAAQBwB0AOMAogACACEAAQH4As8AHQAuAAA3FCMnJicDJjQ2MhYHFzY3NjMyFxYUDgEHBgcGIic3FDMyNjc2NyYjIgcGBwYcAWodEQoFCwEXHxoDBT9eQjU+HxQmPylUWBwnDQgdIlolWDIOQy8xYScPGRgEBQsCkAQUEhEP+VMxIzEgY01GHTsUBgJQDycbP18/HTlYIy8OAAABAEn/bwKkAqMAMgAAEyIHEyM2NC4BPQE0Nz4BMh4CFRQGBxYXFhUUBwYHBgcnPgI1NCcmIyIHJzY1NCcmI99SCg9ECwcJIBJXSl9yO3d351UuSlN/Pj8Hc5E9MER2O0oE8VU5QQJnEf0ZRsO9xikzHBUMDwcmOB0sWSkNNh0oNjc+KhUKThA4OholFyEJaTJDLxYPAP//ABIABgH1AmgSJgBEAAAQBwBDAKMAAP//ABIABgH1AnASJgBEAAAQBwB0ALAAAP//ABIABgH1Aq8SJgBEAAAQBgE6YAD//wASAAYB9QKOEiYARAAAEAYBQB0A//8AEgAGAfUCmBImAEQAABAGAGlOAP//ABIABgH1AiISJgBEAAAQBwE+AJr/1///ABL/9gOrAcYQJgBEAAAQBwBIAaL/8P//ABb/FwJtAb8SJgBGAAAQBgB4fwD//wAUAAYCCQJoEiYASAAAEAcAQwCzAAD//wAUAAYCCQJwEiYASAAAEAcAdADAAAD//wAUAAYCCQKvEiYASAAAEAYBOnEA//8AFAAGAgkCmBImAEgAABAGAGlfAAACABwABgCLApwACQAUAAA3DgIiJicRMxYDNDMyHwEHJicuAYsDGhAOFwM/DWYPCQ1DEUILBQUlEA4BCQgBv7sBZRwOQSstFAgQAAIAIQAGAJcCkgAIABMAABMWFwYjIiYnETc2MzIWDgEHBgcndQ0JBioLFwMwDhAKCgIICRE0HwHWu/YfCQgBv6kTExIQCxMrHAAAAv+8AAYA1gKvAAgAIAAAExYXBiMiJicRLgE0Njc2NxYXFhcWFAcGJy4CJwYHBgd1DQkGKgsXA2MXFRMqPjMRHCQGBAsZJQ0YHz0WBwYB1rv2HwkIAb8oCiYkFCwdIQ4ZOAwVBhAPGwwaHiokDA4AAAP/2gAGAMECmAAIABMAHQAAExYXBiMiJicRJyI1NDcyFhQGBwYzIjU0NzIVFAcGdQ0JBioLFwNEGDIVDwwJDHMYMyQqCwHWu/YfCQgBv38iDBUSHA0DBSINFCIfAQEAAAIAMwAGAikCbgAmADIAAAEWFRQHBgcGIi4BJyYnJjQ3PgEyHgEXJicHJzcmJzQ2NxYXFhc3FwEUFxYzNjc2NCcmIgHjOkcgMRAkPFUnVBACDidUMjhvPQgwTylEK00dDT4TJyZJKv5pRThfOhoRBGaoAdJzcXdBHQ4FDCYcOzsJHRMoGgIZDElFLUIiRB0SFQMgDRkmNDH+41QqIQQpGjMRKAD//wAi//oB4wLIEiYAUQAAEAYBQCI6//8ANP//AjACaBImAFIAABAHAEMAvgAA//8ANP//AjACcBImAFIAABAHAHQAywAA//8ANP//AjACrxImAFIAABAGATp8AP//ADT//wIwAo4SJgBSAAAQBgFAOAD//wA0//8CMAKYEiYAUgAAEAYAaWoA//8AOgBvAUcBexAmAB1eChAGAVscAP//ADT/2gIwAgYSJgBSAAAQRgASXNo4IjOV//8ADf//AekCaBImAFgAABAHAEMAogAA//8ADf//AekCcBImAFgAABAHAHQArwAA//8ADf//AekCrxImAFgAABAGATpgAP//AA3//wHpApgSJgBYAAAQBgBpTgD//wAW/lgCIAJwEiYAXAAAEAcAdADEAAAAAgAY/3EB/gJPABsAKwAANwcUFxYVFAYiJwM2MhcWFzYzMhcWFRQGBwYHFgEmIgcGBwYVFBUXNjc2NTRyAQQBHx4HGhcXBw4EhGB+KhM8M3WpAQESIkslVCgSBcxXMB0vHR8IBhoZAQLUCQ8agig8GyEtWyZVERIBVw0HEDcaJgQEeS5FJycr//8AFv5YAiACmBImAFwAABAGAGljAP//ABr/8QJ+Ax0SJgAkAAAQBwBvAIgAuv//ABIABgH1AmMSJgBEAAAQBgBvVQD//wAh//EChQNPEiYAJAcAEAcBPACKARH//wASAAYB9QI+EiYARAAAEAcBPACAAAD//wAa/0oCmAK6EiYAJAAAEAcBPwG+AAP//wAS/1ECGAHGEiYARAAAEAcBPwE+AAr//wAW//8CwAM1EiYAJgAAEAcAdADtAMX//wAWAAACbQJwEiYARgAAEAcAdADvAAD//wAW//8CwAOJEiYAJgAAEAcBOgCrANr//wAWAAACbQKvEiYARgAAEAcBOgCgAAD//wAW//8CwAMaEiYAJgAAEAcBPQEIAPL//wAWAAACbQIoEiYARgAAEAcBPQD2AAD//wAW//8CwANBEiYAJgAAEAcBOwCzAQP//wAWAAACbQJTEiYARgAAEAcBOwCRABX//wAmAAYCfwMpEiYAJwAAEAcBOwCSAOv//wAeAAACSgLjEiYAKAAAEAcAbwBuAID//wAUAAYCCQJjEiYASAAAEAYAb2YA//8AHgAAAkoDBhImACgAABAHATwArgDI//8AFAAGAgkCWhImAEgAABAHATwAjgAc//8AHgAAAkoC9BImACgAABAHAT0AwgDM//8AFAAGAgkCThImAEgAABAHAT0AxwAm//8AHv9wAkoCfhImACgAABAHAT8BYAAp//8AFP9KAgkB0xImAEgAABAHAT8AngAD//8AHgAAAkoDIRImACgAABAHATsAkADj//8AFAAGAgkCcRImAEgAABAGATtvM///ABb/wAKuA3QSJgAqAAAQBwE6AMkAxf//ABf+UQH7Aq8SJgBKAAAQBgE6ZAD//wAW/8ACrgMQEiYAKgAAEAcBPADYANL//wAX/lEB+wI+EiYASgAAEAcBPACEAAD//wAW/8ACrgMFEiYAKgAAEAcBPQDnAN3//wAX/lEB+wIoEiYASgAAEAcBPQC6AAD//wAW/wUCrgKMEiYAKgAAEAcBXgCeAAD//wAX/lEB+wJrEiYASgAAEAcBTACmAAD//wAV//oCSgPNEiYAKwAAEAcBOgBvAR7//wAX//0B8QMdEiYASwAAEAYBOnlu//8AFf/6AkoC2xImACsAABBGAG/sr38fR0H////x//0B8QKcEiYASwAAEAYAb9Od////k///AR8DChImACwAABAHAUD/eQB8AAL/hAAGARACsAAIACcAABMWFwYjIiYnESciByImJz4BNzYyHgIyPgI3Mh4BFAYHBiMiJy4BdQ0JBioLFwM4IDYGGwMPPCEIFB0kJisZFRkXBg0BDxEsPi4cFBwB1rv2HwkIAb+DUQgNMEoNAxUmIg4aJhgVDxYkEi8fEhcAAAL/vAAGAMkCYwAIABYAABMWFwYjIiYnESciNTQ+AjcyFxYUBgd1DQkGKgsXA0gyFzlXMCoLAQkSAda79h8JCAG/QBkOCggPBRcECQ8G////3///AKAC0hImACwAABAHATz/wACU////1f9NAIkCRhImACwAABAGAT+vBv////T/VQCoAoESJgBMAAAQBgE/zg7//wAa//8AeQLEEiYALAAAEAcBPQAAAJwAAQA2AAYAiwHWAAgAABMWFwYjIiYnEXUNCQYqCxcDAda79h8JCAG///8ACQAEAgYDjBImAC0AABAHAToAfADdAAL/hP6RANkCrwAiADoAABcUIyIuAScmJzQ2NR4BMzI3NjU0JicmNDcmNzYzBhQeARcWAiY0Njc2NxYXFhcWFAcGJy4CJwYHBgejWAkbNRtBEg4hTCscEg8NBg4CAxkTFwkBCwcRzRcVEyo+MxEcJAYFChklDRgfPRUIBsinAQcJFioFHwEZLCokJFWhUKV5KBgMCT5ITZRKoQJjCiYkFCwdIQ4ZOAwVBhAPGwwaHiokDA4A//8AK/8FAmEC0BImAC4AABAGAV5yAP//AB7/BQJkAtsSJgBOAAAQBgFedgD//wA3AA4CtANYEiYALwAAEAcAdAEHAOj//wAQ//8AhgM8EiYATwAAEAcAdP/3AMz//wA3/wUCtAKuEiYALwAAEAcBXgCeAAD//wAI/wUAkwKqEiYATwAAEAYBXo0A//8ANwAOArQCrhImAC8AABAHAU0BAAAA//8ANwAOArQCrhImAC8AABAHAHcBKAAA//8AFv//AQcCqhAmAE8AABAHAHcAoQAA//8ACQAOArQCrhImAC8AABAGAUrrHP///8H//wDOAqoSJgBPAAAQBgFKowD//wAZ//gCYANlEiYAMQAAEAcAdADwAPX//wAi//oB4wJwEiYAUQAAEAcAdACrAAD//wAZ/wUCYALMEiYAMQAAEAYBXn0A//8AIv8FAeMB8xImAFEAABAGAV47AP//ABn/+AJgA3ESJgAxAAAQBwE7AKkBM///ACL/+gHjAoASJgBRAAAQBgE7aEL//wAi//oB4wMNEiYAUQAAEAcBXv+wA0v//wAWAA4CjgLZEiYAMgAAEAcAbwCoAHb//wA0//8CMAJjEiYAUgAAEAYAb3EA//8AFgAOAo4C9RImADIAABAHATwAzAC3//8ANP//AjACPhImAFIAABAHATwAnAAA//8AFgAOAo4DFRImADIAABAHAUEAvgCD//8ANP//AjACkhImAFIAABAHAUEAkQAAAAIAFv/yBDQCewAwAEAAAAEyFxUGBwYHBhYXFhUyPgEzFQUXMjc2MxQOAScGBTUGBwYiJicmNTQ+AjMyFzcWMwQGFBYXFjI3Nj8BJicmIgYDV1UkHGS5PxECAQQ9tmAy/oIFdV+vVxoTCn7+iS1NHWdyKlgxVXFBdEkBG1L+FicdHTzmMA4HARtXH1RUAm4NMgQBAg5OPBAnNBcLNjCkCRIUIgoHDh9YORMIJydTlEV6WzZtYwilW2lgIkheHB7EdSMMLAADABj/6gOWAd4AMQBEAEsAADc0NzY3MjMyFhc2NzY6ARcWFxYUBw4CBwYHBhQXFjMyNzY3MhYVBgcGIyImJwYjIiYkPgE3NTQnJiMOAQcGBxQXFjI2ASYjIgcGFRhmUXIGBzJCDjxtISYVIEwlDwIhVVkqXR4NAhlnOTtITQoPJGJMTEdgGDylX2EBaB0DAhwPHidPI0wXIRlzRQG6FzUmHDmpdkg5DC4pYh4JCBEtEx4JGBEHAwcuEysNWxQaIw8LPiUdLyRwWBA2NgxBPxwPBxAWMoU+FREJAUgkCxYj//8ALv/0AqsDLhImADUAABAHAHQA0AC+//8AG//1AiICcBImAFUAABAHAHQAxgAA//8ALv8FAqsChxImADUAABAHAV4AqQAA//8AG/8FAiIB4hImAFUAABAGAV5WAP//AC7/9AKrAykSJgA1AAAQBwE7AI0A6///ABv/9QIiAnkSJgBVAAAQBwE7AIIAO///AA///wJwAtsSJgA2AAAQBwB0APUAa///ABb/4wHfAnASJgBWAAAQBwB0AK0AAP//AA///wJwAz0SJgA2AAAQBwE6AJoAjv//ABb/4wHfAq8SJgBWAAAQBgE6XQD//wAP/xcCcAJgEiYANgAAEAcAeADGAAD//wAW/xoB3wHKEiYAVgAAEAcAeAC2AAP//wAP//8CcALZEiYANgAAEAcBOwCWAJv//wAW/+MB3wJTEiYAVgAAEAYBO2YV//8AAP8eAn4CRBImADcAABAGAV4aGf//ABD/BQGTAqgSJgBXAAAQBgFeCgD//wAAAAACfgLnEiYANwAAEAcBOwCKAKn//wAAAAACfgJEEiYANwAAEAcAbwBp/zb////1//EBkwKoEiYAVwAAEEcAb//I/ehhO03a//8AFP/+AhYDIxImADgAABAHAUAAQgCV//8ADf//AekCjhImAFgAABAGAUAcAP//ABT//gIWArkSJgA4AAAQBgBvd1b//wAN//8B6QJjEiYAWAAAEAYAb1UA//8AFP/+AhYCvhImADgAABAHATwAlwCA//8ADf//AekCPhImAFgAABAHATwAgAAA//8AFP/+AhYC/hImADgAABAHAT4ApgCz//8ADf//AekCSxImAFgAABAHAT4AjgAA//8AFP/+AhYDERImADgAABAHAUEAqQB///8ADf//AekCkhImAFgAABAGAUF1AP//ABT/YAIkAmMSJgA4AAAQBwE/AUoAGf//AA3/YwINAbkSJgBYAAAQBwE/ATMAHP//AA4AAAOzA3ASJgA6AAAQBwE6AT4Awf//AC7/6wMQAq8SJgBaAAAQBwE6APoAAP//ABz/7gISA1USJgA8AAAQBwE6AG4Apv//ABb+WAIgAq8SJgBcAAAQBgE6dQD//wAc/+4CEgK+EiYAPAAAEAYAaVgm//8AHP/9AwIDCxImAD0AABAHAHQBIgCb//8AE//8AfQCcBImAF0AABAHAHQAqQAA//8AHP/9AwIC2xImAD0AABAHAT0A9QCz//8AE//8AfQCKBImAF0AABAHAT0AsAAA//8AHP/9AwIDFBImAD0AABAHATsAuQDW//8AE//8AfQCPhImAF0AABAGATtiAAABAA7+XgJgAz4AKwAAATIUFwUTBz8BNCYnJicHIicmNTcmND4BMh4CFRQHJicmIyIHBhQWFzI3NgJZBQL+qRXcApAOAwcGgg0JEJgUJEVOUUo0BSg5RDw5EwkIFD5NlAFONgoq/Y8VVQNZ9jd4JDIPGhU2rNd4KSI0QR8YCjgsNFEqmX9ACxf//wAd//oDcwLXEiYAhv/6EEcAdAE/AOk2HjKf//8AEv/2A6sCcBAmAEQAABAnAEgBov/wEAcAdAGEAAD//wAWAAACjgMLEiYAMgAAECYAEl0AEAcAdADuAJv//wA0/9ICMAJwEiYAUgAAEGYAEl7SNrIzXBAHAHQAywAA//8AD/8FAnACYBImADYAABAHAV4AqQAA//8AFv8FAd8ByhImAFYAABAGAV49AAABABIB/gEsAq8AFwAAEiY0Njc2NxYXFhcWFAcGJy4CJwYHBgcpFxUTKj4zERwkBgQLGSUNGB89FgcGAf4KJiQULB0hDhk4DBUGEA8bDBoeKiQMDgABAB8BxwEOAj4AFgAAEiY0NjMeARc+Azc2FxYUBwYHBgcmMRIUDwshJRsUCw0TFQgEBR0SFykzAgYYGgYTHhQUEQgHCwoKBQ0JJQwQFRMAAAEAHwHaAOACPgASAAASNDYzHgEyPgE3NjIWFAcOASMiHxQPBCATGCUICg8JBhw2DywCDSsGIBQDGRAFCg0JKxYAAAEAIgHXAHkCKAAMAAATPgEyHgEXFAYiJicmIgUYDhIYAhQaEAcSAf8YEQMXEBgPBQYMAAACAB8BpQDLAksADQAbAAASJjQ3NjMyFxYXFAYjIjcmIyIHHAEXFjMyNzwBMRIMFCgaFy8EKigfQhYbHwYMFREjBwHDHjUUIQwZLjIhZBceAxMTER4FEAAAAQAm/0cA2gAiABUAABcGIyInJjU0NjcXIiMiBwYVFBcWMjfPGRAuGzchJEcCAyAUHhUbNRqtDBgtPB4xCxkNFB8gEhcLAAEAGgHmAaYCjgAeAAATIgciJic+ATc2Mh4CMj4CNzIeARQGBwYjIicuAZQgNgYbAw88IQgUHSQmKxkVGRcGDQEPESw+LhwUHAI3UQgNMEoNAxUmIg4aJhgVDxYkEi8fEhcAAgAsAf4A8gKSAAoAEwAAEzYzMhYXFAcGByc3FAcGByc3NjJhDBEIDAIKECklxgoNLSQ0DCMCeRkOCRIRGzUWUhERFjoWWhn//wAOAAADswNIEiYAOgAAEAcAQwGVAOD//wAu/+sDEAJoEiYAWgAAEAcAQwE9AAD//wAOAAADswNXEiYAOgAAEAcAdAGQAOf//wAu/+sDEAJwEiYAWgAAEAcAdAFKAAD//wAOAAADswNjEiYAOgAAEAcAaQElAMv//wAu/+sDEAKYEiYAWgAAEAcAaQDoAAD//wAc/+4CEgMwEiYAPAAAEAcAQwDFAMj//wAW/lgCIAJoEiYAXAAAEAcAQwC3AAAAAQAeANgBKwEmAA4AADciNTQ+AjcyFxYVFAYHUDIXOVcwFA4UCRLYGg0KCBAFBwoOBRAGAAEAHgDYAYIBJQAQAAA3IjU0PgQ3MhcWFRQGB1AyFyJITUkXFA4UCRLYGg0KBQcHBgMHCg4FEAYAAQAbAbYAgAJrAAkAABMyFRQHBg8BNzZoGCIKCTA4DAJrIylDFA4EsAUAAQAbAbYAgAJrAAkAABMyFRQHBg8BNzZoGCIKCTA4DAJrIylDFA4EsAUAAQAjAAoAiAC/AAkAADcyFRQHBg8BNzZwGCIKCTA4DL8jKUMUDgSwBQAAAgA2AeoA1wL7AAsAFwAAEzcnNDcXFRcOASMiJzcnNDcXFRcOASMikgEBJBEQAxkFJFwBASQQEQQYBSQCUhwpUxEQxyIDDVcdKlMREMciBA0AAAIANgHqANcC+wALABcAABM3JzQ3FxUXDgEjIic3JzQ3FxUXDgEjIpIBASQREAMZBSRcAQEkEBEEGAUkAlIcKVMREMciAw1XHSpTERDHIgQNAAACAFUAHwD+AS0ACwAXAAA/ASc0NxcVFw4BIyInNyc0NxcVFw4BIyK5AQEkERADGQUkZAEBJBEQAxkFJH8cKFIUEcciBAxkHCpRExHHIQUMAAEAF//9AYIDWAAcAAAzFCsBIgcDByInJjU0Nz4BNwMzEzY3MhcWFAYPAeUZJAwCBDsqEwcvFScUClAJCEs5DgMNGHgCAQIHBg4FCxQGAgUCARn+8gEHGAQKEQcKAAABABf//QGEA1gALQAAMxQrASIHAwcuATY3Njc1ByInJjU0Nz4BNwMzEzY3MhcWBg8BFT4BNzYWFRQPAeUZJAwCA0ggFQMVBGA7KhMHLxUnFApQCQhLOQ4GEBh4IUEaEBMSjQIBAZkJBA0TEQQJNQYOBQsUBgIFAgEZ/vIBBxgKFQcKMgQHBQULChcNEwAAAQAhAMIApQFBAAwAABM+ATMyFhcUBiImJyYhCCULISgDHigZCxoBASUbKBolGAgIFQADABb//wGNAEIACgAVAB4AADc0NjcyFhQGBwYiNzQ2NzIWFAYHBiIzIjU0PwEyFRQWJA4VDwwJDzKQJA4VDwwJDzKoGBkaJCIIEQcRHA4DBSMIEQcRHA4DBSMIDAwhIgABAFQAOwGvAdMAGgAANz4BNzY3MhcWFA8BHgEXFhcOAQcGIy4CJyZUIFYsbC8NBgME6w84IlE9AQYECQIecEQdROUZRCJVGhYJEgazCBkRKCgBDggVEycbDiIAAAEAMgAwAaoBvQAUAAA3Jic0NTQ3PgE3JTceAxcOA3YtBUdpQAb++DIxU01MKRpPV1UwERMEAx8qPTEXYzEjHBEXHx8/QkQAAAEAFQAAAcUCtQASAAAzIj0BNBM2NzYzNjIUDgMHBicSx3NOFAUGCSU6Rk8mTyAKJAE1sWQZBBhRanh9OXcAAQAd//4DCQKZAE8AADciNTQ2MzY3NTQ3ByIGJyYnNz4BNzY3NjMyFxYVJiIOAQc+ATc2HgEGDwEGFBcVPgE3NjcyFRQHIgcGBx4BMzY3NjcyFhUOASMiLgEnJicGOxgNBCkSBCUFDwgTAhQCLCElY2aBRRYZRYVuTw8mTSAQEQMJCbACAhYqFzI7IgJQWBgYF3VMiiVCRw4dULRlDztUJEoaHq8jAw0HAw4eHgQBAQMOJAIFBIBSVRMXRCc4Yz0FCQUFChMWBhgOHA0UAwQDBwwiCAgWBgVBPgwJEC0HE0c0ARkYMVEDAAEAAP+8BMoCZQBUAAABJyIHBgcGFBcHEyciJjQ2MxYXFjI3PgEyHgQXEzYzMhcWFx4BFAYiLgQvASYnNC4BBgcGBwYnJicDBiMGBwYHBhUXFA4BIi4BPgUB+F8pMAIGFQJeH9UICRIMPDzBfS4GHkY4LiYiHhDIGBM7HQkMFQ0SICAHBwkLBQkEAgIOHBo1bQ4YHBKvDAUQEgQCBAQCFyEaEgUKCwwMCgHrAgcnPtyDGwcB7gwaFhoDBQ4EGxgxTV5ZSRIBXBa4O2q/OhsaGSU8TFMlRB4OFSEIGyhR1RkOED4BcwM61zAfGBdHCCIZARIrUFxjXE8AAQAeANgBKwEmAA4AADciNTQ+AjcyFxYVFAYHUDIXOVcwFA4UCRLYGg0KCBAFBwoOBRAG//8ADv/pApUDPhAmAEkAABAHAEwCCv/j//8ADgAGAp4DPhAmAEkAABAHAE8CHgAOAAEAe/8FAQb/wgAPAAAXPgEyFxYVFAcOAQcGIyInwgYPEgcWNwoJBxcXBgZPDQQCBhEQVRAPBxkCAAABAAABXwBcAAUAbAAFAAIAAAABAAEAAABAAAAAAwABAAAAAAAAAAAAAAAkAE0AvQEhAYwCBQIaAkICbgK+Av4DHgM4A1IDbgOlA8IECARLBIQE3AUrBWAFxwYSBjgGWQaHBrkG3QcaB5cH7whKCIUIvQj2CUoJoQnmCf8KMQp6CpcK8wswC10LoQwFDGYMtQzmDS8NWw20DeoOHQ5RDn8Ong7fDwkPIg85D4UPzRAUEGQQrRDpET4RehGdEeISKBJHEp4S2xMTE1cTlBPSFBAUPhSEFLIVBhVSFYcVzBYaFiwWexasFrcXDRdoF9EYQBhhGMcY6RlZGWMZuBnbGlsadRqiGuwa9xsCGxkbbhufG7gb8Bv7HAYcRhxZHG0cghyNHJkcpRyxHL0cyRzVHUIdTh1aHWYdch19HYkdlB2fHaod9x4DHg8eGx4nHjMePx6CHo0emR6lHrEevB7IHxAfWx9nH3Mffh+JH5QfoB+sH7cfwx/PH9of5SAKIC8gZyCXIOkg9CEAIQwhFyEiIS0hOCFFIVEhXSFoIXMhfyHDIc4h2iHlIfEh/SIJIhUiISItIjkiRSJRIl0iaSJ1IoEijSKYIqQisCK8Isgi1CLgIuwi9yMDIw4jGiMmIzIjPiNKI1YjYiNtI3ojhSORI9Aj9yQDJA4kGSQlJDkkRSSfJKoktSTBJM0k2STkJPAk/CUIJRMlHiUqJTYlQSVMJVglYyVvJXslhiWSJZ4lqiW2JhgmiCaUJqAmrCa3JsMmzybbJucm8yb+JwonFiciJy0nOCdDJ08nWydpJ3UngCeLJ5YnoieuJ7onxifSJ90n6Sf1KAEoDSgZKCQoLyg7KEcoUyhfKGsodii6KMgo2CjnKPgpBCkPKTkpYSmCKZwpyCnrKhwqQCpMKlgqZCpwKnwqiCqUKqAquirWKusrACsVKz4rZyuPK74sBSweLE4sfCygLL8tMy2vLckt1S3hLf4AAQAAAAEAxeCvFTNfDzz1AAsEAAAAAADKM4upAAAAANUxCX7/hP5RBMoD8gAAAAgAAgAAAAAAAAK0AAAAAAAAArQAAAGaAAAAigAWAPIANgKNADgCOgAJAhMAHwKuAAUApgAbATEADwFoABoCCAAnAhkACgC2/+oBPgAeAJAAFwHSABUChgAmAIMAHAJKABACCQAKArkASQLVABsCggAWAnYACgKYABYCRwAeAKsAHwB//+oB5wBUAfgAQAHjADICBgAKBCwAGwKQABoC2AAeAtUAFgKYACYCXgAeAsUAJgLFABYCbAAVAJsAGgIeAAkCbAArAsUANwNPABwCggAZAq4AFgKNACYC2gAbAtoALgKSAA8CfgAAAj8AFAKCAAsDwwAOAmYAGwIjABwDIwAcAbMAHwICAAACKgAAAToAEgK/ACAAsAAvAgkAEgI/AB4CiAAWAg0ACQIqABQCYAAOAhAAFwH7ABcAmwAYALb/jgJ1AB4AoQAWAx0AGgIAACICQAA0AjoAPgIOACQCNQAbAgIAFgGeABACCAANAhMAIgM8AC4B4gASAjIAFgH7ABMBaQA0AJUANAHqABgBxwAaAIoAFwKIABUCKP/qAkD//wIj//YAgwAcAgIACgF8AEIChgAmAP8ACgLOAFQCZgBJAoYAJgE+AB4A4QAZAhkAEgGAAAkBUAALALAAGQH2ACEBhAASAJAADwERACsAcwAaARYAFwKeADICewANApgAFwNzAAkB8P/jApAAFQKQABoCkAAaApAAGgKQABoCkAAaA4IAHgLVABYCXgAeAl4AHgJeAB4CXgAeAJsACACbAAwAm//HAJv/0QK6AAoCggAZAq4AFgKuABYCrgAWAq4AFgKuABYB4gBMAq4AFgI/ABQCPwAUAj8AFAI/ABQCIwAcAgYAIQLYAEkCCQASAgkAEgIJABICCQASAgkAEgIJABIDsgASAogAFgIqABQCKgAUAioAFAIqABQAmwAcAJsAIQCb/7wAm//aAlIAMwIAACICQAA0AkAANAJAADQCQAA0AkAANAFgADoCQAA0AggADQIIAA0CCAANAggADQIyABYCEwAYAjIAFgKQABoCCQASApAAIQIJABICkAAaAgkAEgLVABYCiAAWAtUAFgKIABYC1QAWAogAFgLVABYCiAAWApgAJgJeAB4CKgAUAl4AHgIqABQCXgAeAioAFAJeAB4CKgAUAl4AHgIqABQCxQAWAhAAFwLFABYCEAAXAsUAFgIQABcCxQAWAhAAFwJsABUB+wAXAmwAFQH7//EAm/+TAJv/hACb/7wAm//fAJv/1QCb//QAmwAaAJsANgIeAAkArP+EAmwAKwJ1AB4CxQA3AKEAEALFADcAoQAIAsUANwLFADcBMQAWAsUACQCh/8ECggAZAgAAIgKCABkCAAAiAoIAGQIAACICAAAiAq4AFgJAADQCrgAWAkAANAKuABYCQAA0BDwAFgOnABgC2gAuAjUAGwLaAC4CNQAbAtoALgI1ABsCkgAPAgIAFgKSAA8CAgAWApIADwICABYCkgAPAgIAFgJ+AAABngAQAn4AAAJ+AAABnv/2Aj8AFAIIAA0CPwAUAggADQI/ABQCCAANAj8AFAIIAA0CPwAUAggADQI/ABQCCAANA8MADgM8AC4CIwAcAjIAFgIjABwDIwAcAfsAEwMjABwB+wATAyMAHAH7ABMCYAAOA4IAHQOyABICrgAWAkAANAKSAA8CAgAWAToAEgE6AB8A/AAfAJAAIgDhAB8A/AAmAccAGgEXACwDwwAOAzwALgPDAA4DPAAuA8MADgM8AC4CIwAcAjIAFgE+AB4BpQAeAKYAGwCmABsApgAjAPIANgDyADYBHwBVAZoAFwGaABcAxQAhAbEAFgHnAFQB4wAyAdIAFQMuAB0E1wAAAT4AHgK9AA4CzgAOAZoAewABAAAD8v5jAAAE1/+E/3wEygABAAAAAAAAAAAAAAAAAAABXwADAhgBkAAFAAACzQKaAAAAjwLNApoAAAHoADMBAAAAAAAAAAAAAAAAAKAAAC9AAABKAAAAAAAAAABweXJzAEAAIPsCA/L+YwAAA/IBnQAAABEAAAAAAbcCowAAACAAAQAAAAIAAAADAAAAFAADAAEAAAAUAAQBCAAAAD4AIAAEAB4AfgCgAKwBDgEpASwBMQE3AT0BSQFkAX4BkgH/AhkCxwLdHoUe8yAUIBogHiAiICYgOiBEIKwhIiIS+wL//wAAACAAoAChAK4BEgErAS4BNAE5AT8BTAFmAZIB/AIYAsYC2B6AHvIgEyAYIBwgICAmIDkgRCCsISIiEvsB////4/9j/8H/wP+9/7z/u/+5/7j/t/+1/7T/of84/yD+dP5k4sLiVuE34TThM+Ey4S/hHeEU4K3gON9JBlsAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuAH/hbAEjQAAAAAMAJYAAwABBAkAAAB0AAAAAwABBAkAAQAmAHQAAwABBAkAAgAOAJoAAwABBAkAAwBKAKgAAwABBAkABAA2APIAAwABBAkABQAkASgAAwABBAkABgA0AUwAAwABBAkACAAgAYAAAwABBAkACQAgAYAAAwABBAkADAA0AaAAAwABBAkADSJwAdQAAwABBAkADgA2JEQAQwBvAHAAeQByAGkAZwBoAHQAIAAoAGMAKQAgADIAMAAxADAALAAgAEsAaQBtAGIAZQByAGwAeQAgAEcAZQBzAHcAZQBpAG4AIAAoAGsAaQBtAGIAZQByAGwAeQBnAGUAcwB3AGUAaQBuAC4AYwBvAG0AKQBBAHIAYwBoAGkAdABlAGMAdABzACAARABhAHUAZwBoAHQAZQByAFIAZQBnAHUAbABhAHIAMQAuADAAMAAzADsAVQBLAFcATgA7AEEAcgBjAGgAaQB0AGUAYwB0AHMARABhAHUAZwBoAHQAZQByAC0AUgBlAGcAdQBsAGEAcgBBAHIAYwBoAGkAdABlAGMAdABzACAARABhAHUAZwBoAHQAZQByACAAUgBlAGcAdQBsAGEAcgBWAGUAcgBzAGkAbwBuACAAMQAuADAAMAAzACAAMgAwADEAMABBAHIAYwBoAGkAdABlAGMAdABzAEQAYQB1AGcAaAB0AGUAcgAtAFIAZQBnAHUAbABhAHIASwBpAG0AYgBlAHIAbAB5ACAARwBlAHMAdwBlAGkAbgBoAHQAdABwADoALwAvAGsAaQBtAGIAZQByAGwAeQBnAGUAcwB3AGUAaQBuAC4AYwBvAG0AQwBvAHAAeQByAGkAZwBoAHQAIAAoAGMAKQAgADIAMAAxADAALAAgAEsAaQBtAGIAZQByAGwAeQAgAEcAZQBzAHcAZQBpAG4AIAAoAGsAaQBtAGIAZQByAGwAeQBnAGUAcwB3AGUAaQBuAC4AYwBvAG0AKQANAAoADQAKAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAGMAZQBuAHMAZQBkACAAdQBuAGQAZQByACAAdABoAGUAIABTAEkATAAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAsACAAVgBlAHIAcwBpAG8AbgAgADEALgAxAC4AIAAgAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAADQAKAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMADQAKAHAAcgBlAHMAZQBuAHQAZQBkACAAdABvACAAdABoAGUAIAB1AHMAZQByAHMALgANAAoADQAKADQAKQAgAFQAaABlACAAbgBhAG0AZQAoAHMAKQAgAG8AZgAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAG8AcgAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABzAGgAYQBsAGwAIABuAG8AdAAgAGIAZQAgAHUAcwBlAGQAIAB0AG8AIABwAHIAbwBtAG8AdABlACwAIABlAG4AZABvAHIAcwBlACAAbwByACAAYQBkAHYAZQByAHQAaQBzAGUAIABhAG4AeQAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4ALAAgAGUAeABjAGUAcAB0ACAAdABvACAAYQBjAGsAbgBvAHcAbABlAGQAZwBlACAAdABoAGUAIABjAG8AbgB0AHIAaQBiAHUAdABpAG8AbgAoAHMAKQAgAG8AZgAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAGEAbgBkACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AcgAgAHcAaQB0AGgAIAB0AGgAZQBpAHIAIABlAHgAcABsAGkAYwBpAHQAIAB3AHIAaQB0AHQAZQBuAA0ACgBwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUADQAKAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgAgAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV8AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAKMAhACFAL0AlgDoAIYAjgCLAJ0AqQCkAIoA2gCDAJMA8gDzAI0AlwCIAMMA3gDxAJ4AqgD1APQA9gCiAK0AyQDHAK4AYgBjAJAAZADLAGUAyADKAM8AzADNAM4A6QBmANMA0ADRAK8AZwDwAJEA1gDUANUAaADrAO0AiQBqAGkAawBtAGwAbgCgAG8AcQBwAHIAcwB1AHQAdgB3AOoAeAB6AHkAewB9AHwAuAChAH8AfgCAAIEA7ADuALoBAgEDAQQBBQEGAQcA/QD+AQgBCQEKAQsA/wEAAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgA+AD5ARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgD6ANcBJwEoASkBKgErASwBLQEuAS8BMAExAOIA4wEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+ALAAsQE/AUABQQFCAUMBRAFFAUYBRwFIAPsA/ADkAOUBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0AuwFeAV8BYAFhAOYA5wCmAWIBYwFkAWUBZgFnANgA4QDbANwA3QDgANkA3wFoAWkBagFrAWwBbQFuAW8AsgCzALYAtwDEALQAtQDFAIIAwgCHAKsAvgC/ALwBcACMAO8AwADBAXEHQW1hY3JvbgdhbWFjcm9uBkFicmV2ZQZhYnJldmUHQW9nb25lawdhb2dvbmVrC0NjaXJjdW1mbGV4C2NjaXJjdW1mbGV4CkNkb3RhY2NlbnQKY2RvdGFjY2VudAZEY2Fyb24HRW1hY3JvbgdlbWFjcm9uBkVicmV2ZQZlYnJldmUKRWRvdGFjY2VudAplZG90YWNjZW50B0VvZ29uZWsHZW9nb25lawZFY2Fyb24GZWNhcm9uC0djaXJjdW1mbGV4C2djaXJjdW1mbGV4Ckdkb3RhY2NlbnQKZ2RvdGFjY2VudAxHY29tbWFhY2NlbnQMZ2NvbW1hYWNjZW50C0hjaXJjdW1mbGV4C2hjaXJjdW1mbGV4BEhiYXIEaGJhcgZJdGlsZGUGaXRpbGRlB2ltYWNyb24GSWJyZXZlB0lvZ29uZWsHaW9nb25lawtKY2lyY3VtZmxleAtqY2lyY3VtZmxleAxLY29tbWFhY2NlbnQMa2NvbW1hYWNjZW50BkxhY3V0ZQZsYWN1dGUMTGNvbW1hYWNjZW50DGxjb21tYWFjY2VudAZMY2Fyb24ETGRvdARsZG90Bk5hY3V0ZQZuYWN1dGUMTmNvbW1hYWNjZW50DG5jb21tYWFjY2VudAZOY2Fyb24GbmNhcm9uC25hcG9zdHJvcGhlB09tYWNyb24Hb21hY3JvbgZPYnJldmUGb2JyZXZlDU9odW5nYXJ1bWxhdXQNb2h1bmdhcnVtbGF1dAZSYWN1dGUGcmFjdXRlDFJjb21tYWFjY2VudAxyY29tbWFhY2NlbnQGUmNhcm9uBnJjYXJvbgZTYWN1dGUGc2FjdXRlC1NjaXJjdW1mbGV4C3NjaXJjdW1mbGV4DFRjb21tYWFjY2VudAx0Y29tbWFhY2NlbnQGVGNhcm9uBFRiYXIEdGJhcgZVdGlsZGUGdXRpbGRlB1VtYWNyb24HdW1hY3JvbgZVYnJldmUGdWJyZXZlBVVyaW5nBXVyaW5nDVVodW5nYXJ1bWxhdXQNdWh1bmdhcnVtbGF1dAdVb2dvbmVrB3VvZ29uZWsLV2NpcmN1bWZsZXgLd2NpcmN1bWZsZXgLWWNpcmN1bWZsZXgLeWNpcmN1bWZsZXgGWmFjdXRlBnphY3V0ZQpaZG90YWNjZW50Cnpkb3RhY2NlbnQHQUVhY3V0ZQdhZWFjdXRlC09zbGFzaGFjdXRlC29zbGFzaGFjdXRlDFNjb21tYWFjY2VudAxzY29tbWFhY2NlbnQGV2dyYXZlBndncmF2ZQZXYWN1dGUGd2FjdXRlCVdkaWVyZXNpcwl3ZGllcmVzaXMGWWdyYXZlBnlncmF2ZQRFdXJvC2NvbW1hYWNjZW50AAABAAH//wAP") format("truetype"); }
-</style></defs><g><rect x="0" y="530" width="1140" height="540" rx="48.6" ry="48.6" fill="none" stroke="none" pointer-events="all"/><path d="M 15.28 539.41 C 15.28 539.41 15.28 539.41 15.28 539.41 M 15.28 539.41 C 15.28 539.41 15.28 539.41 15.28 539.41 M 7.15 554.87 C 14.9 553.25 15.12 543.11 24.86 534.49 M 7.15 554.87 C 10.67 551.11 16.06 545.62 24.86 534.49 M 4.92 563.53 C 12.5 554.59 18.45 546.1 29.85 534.85 M 4.92 563.53 C 13.01 557.16 17.14 550.29 29.85 534.85 M 1.38 573.7 C 13.79 562.36 24.48 542.64 35.49 534.45 M 1.38 573.7 C 12.64 558.6 26.08 544.71 35.49 534.45 M 1.11 580.1 C 16.65 565.87 29.65 543.97 41.79 533.31 M 1.11 580.1 C 8.11 572.08 18.11 562.81 41.79 533.31 M 1.51 585.74 C 16.07 571.79 24.19 556.29 49.4 530.65 M 1.51 585.74 C 14.99 569.89 24.79 555.93 49.4 530.65 M 1.25 592.14 C 15.81 573.27 31.7 559.54 54.39 531.01 M 1.25 592.14 C 17.53 573.79 32.36 555.25 54.39 531.01 M 1.64 597.78 C 19.89 568.18 46.35 543.86 60.03 530.61 M 1.64 597.78 C 20.91 573.8 39 553.4 60.03 530.61 M 1.38 604.18 C 23.15 578.49 47.47 552.39 65.02 530.97 M 1.38 604.18 C 18.44 584.1 39.28 564.38 65.02 530.97 M 1.12 610.58 C 18.77 586.96 40.58 565.14 70.66 530.58 M 1.12 610.58 C 27.51 581.45 47.5 555.56 70.66 530.58 M 1.51 616.22 C 24.54 588.28 56.9 554 75.65 530.94 M 1.51 616.22 C 18.71 599.74 32.68 579.94 75.65 530.94 M 1.25 622.62 C 28.43 597.82 54.07 565.18 81.29 530.54 M 1.25 622.62 C 32.25 586.31 62.67 550.92 81.29 530.54 M 1.65 628.26 C 36.33 593.97 65.44 551.47 86.28 530.9 M 1.65 628.26 C 22.38 604.17 44.25 583.34 86.28 530.9 M 1.39 634.66 C 34.44 595.02 63.65 557.21 91.92 530.51 M 1.39 634.66 C 37.06 591.62 71.98 553.92 91.92 530.51 M 1.12 641.06 C 24.42 609.86 53.81 580.19 96.91 530.87 M 1.12 641.06 C 24.88 610.23 50.55 582.23 96.91 530.87 M 1.52 646.7 C 29.74 612.22 53.73 587.64 102.55 530.47 M 1.52 646.7 C 39.71 600.56 80.29 554.87 102.55 530.47 M 1.26 653.1 C 29.94 616.86 59.98 590.13 107.54 530.83 M 1.26 653.1 C 35.97 615.83 66.91 576.42 107.54 530.83 M 1.65 658.74 C 38.78 611.5 81.86 556.77 113.18 530.44 M 1.65 658.74 C 27.89 628.81 51.91 599.19 113.18 530.44 M 1.39 665.14 C 25.23 634.09 51.6 608.91 118.17 530.8 M 1.39 665.14 C 39.73 624.51 72.4 582.41 118.17 530.8 M 1.13 671.54 C 32.56 629.38 66.59 594.64 123.81 530.41 M 1.13 671.54 C 35.38 625.45 74.15 582.59 123.81 530.41 M 1.52 677.18 C 29.02 647.78 57.83 620.41 128.8 530.77 M 1.52 677.18 C 38.54 632.22 76.4 588.08 128.8 530.77 M 1.26 683.58 C 42.06 640.77 78.45 600.51 134.44 530.37 M 1.26 683.58 C 28.79 653.96 56.83 620.57 134.44 530.37 M 1.66 689.22 C 39.64 644.35 75.1 605.13 139.43 530.73 M 1.66 689.22 C 38.47 649.13 74.07 606.17 139.43 530.73 M 1.4 695.62 C 56.57 634.24 116.06 563.02 145.07 530.34 M 1.4 695.62 C 41.82 649.12 81.57 603.63 145.07 530.34 M 1.13 702.02 C 47.24 646.31 93.27 597.33 150.06 530.7 M 1.13 702.02 C 44.13 652.91 86.38 606.57 150.06 530.7 M 1.53 707.66 C 46.06 655.85 90.31 603 155.7 530.3 M 1.53 707.66 C 33.68 671.72 66.62 631.99 155.7 530.3 M 1.27 714.06 C 66.94 642.38 129.47 569.68 160.69 530.66 M 1.27 714.06 C 64.54 643.12 126.12 572.99 160.69 530.66 M 1.66 719.7 C 53.52 668.23 97.93 616.21 165.68 531.02 M 1.66 719.7 C 55.88 657.24 112.21 594.86 165.68 531.02 M 1.4 726.1 C 32.61 684.53 69.27 644.51 171.32 530.63 M 1.4 726.1 C 48.13 671.04 99.23 615.68 171.32 530.63 M 1.14 732.49 C 59.24 663.24 116.59 599.11 176.31 530.99 M 1.14 732.49 C 48.32 677.88 96.06 624.73 176.31 530.99 M 1.53 738.14 C 39.1 695.43 75.03 647.6 181.95 530.59 M 1.53 738.14 C 49.06 681.88 98.9 623.97 181.95 530.59 M 1.27 744.54 C 54.27 685.11 105.58 626.67 186.94 530.95 M 1.27 744.54 C 50.59 692.19 98.28 636.55 186.94 530.95 M 1.67 750.18 C 63.8 674.6 124.26 606 192.58 530.56 M 1.67 750.18 C 57.77 688.59 113.7 625.79 192.58 530.56 M 1.41 756.58 C 74.57 673.55 153.88 585.82 197.57 530.92 M 1.41 756.58 C 57.32 692.56 114.24 630.91 197.57 530.92 M 1.14 762.97 C 48.08 710.02 91.35 660.55 203.21 530.52 M 1.14 762.97 C 47.21 703.89 98.15 647.68 203.21 530.52 M 1.54 768.62 C 41.32 716.48 88.96 666.16 208.2 530.88 M 1.54 768.62 C 68.9 687.49 139.52 608.63 208.2 530.88 M 1.28 775.02 C 44.61 721.82 96.59 667.47 213.84 530.49 M 1.28 775.02 C 75.54 689.95 146.59 609.48 213.84 530.49 M 1.67 780.66 C 72.81 702.16 140.23 623.49 218.83 530.85 M 1.67 780.66 C 75.54 697.99 145.88 617.44 218.83 530.85 M 1.41 787.06 C 43.65 737.3 89.31 682.97 224.47 530.45 M 1.41 787.06 C 77.3 703.23 148.76 619.47 224.47 530.45 M 1.15 793.45 C 82.21 700.01 166.96 603.17 229.46 530.82 M 1.15 793.45 C 90.52 691.87 180.86 588.76 229.46 530.82 M 1.54 799.1 C 75.1 717.11 144.82 635.24 235.1 530.42 M 1.54 799.1 C 56.23 734.97 113.98 667.61 235.1 530.42 M 1.28 805.49 C 57.58 738.74 119.11 672.06 240.09 530.78 M 1.28 805.49 C 92.12 697.77 182.42 593.38 240.09 530.78 M 1.68 811.14 C 53.25 751.56 101.55 691.62 245.73 530.39 M 1.68 811.14 C 71.7 727.5 142.97 644.58 245.73 530.39 M 1.42 817.54 C 83.92 722.61 164.47 629.31 250.72 530.75 M 1.42 817.54 C 91.39 713.45 184.4 608.32 250.72 530.75 M 1.15 823.93 C 68.31 742.2 136.39 665.37 256.36 530.35 M 1.15 823.93 C 88.4 723.9 175.01 625.1 256.36 530.35 M 1.55 829.58 C 102.8 710.64 206.72 594.95 261.35 530.71 M 1.55 829.58 C 90.3 722.42 179.46 618.92 261.35 530.71 M 1.29 835.97 C 100.92 722.91 201.54 608.58 266.99 530.32 M 1.29 835.97 C 62.49 769.75 120.18 702.12 266.99 530.32 M 1.03 842.37 C 91.65 737.21 179.69 633.76 271.98 530.68 M 1.03 842.37 C 91.22 739.47 183.3 632.82 271.98 530.68 M 1.42 848.02 C 74.87 762.15 152.3 674.09 276.96 531.04 M 1.42 848.02 C 71.52 765.94 143.32 681.35 276.96 531.04 M 1.16 854.41 C 66.58 779.87 134.24 704.06 282.61 530.64 M 1.16 854.41 C 76.5 768.29 151.28 682.82 282.61 530.64 M 1.55 860.06 C 79.56 768.18 161.98 678.7 287.59 531 M 1.55 860.06 C 94.41 751.27 190.06 640.75 287.59 531 M 1.29 866.45 C 87.06 770.69 172.69 670.21 293.24 530.61 M 1.29 866.45 C 89.02 766.13 173.44 667.93 293.24 530.61 M 1.03 872.85 C 107.19 747.7 215.36 622.34 298.22 530.97 M 1.03 872.85 C 121.9 735.5 238.83 599.75 298.22 530.97 M 1.42 878.49 C 97.66 763.02 195.09 651.28 303.87 530.57 M 1.42 878.49 C 90.55 780.58 176.44 681.74 303.87 530.57 M 1.16 884.89 C 70.4 804.4 142.85 724.26 308.85 530.93 M 1.16 884.89 C 113.08 753.51 226.84 624.26 308.85 530.93 M 1.56 890.54 C 69.92 809.65 142.9 730.91 314.5 530.54 M 1.56 890.54 C 108.84 763.55 217.15 636.67 314.5 530.54 M 1.3 896.93 C 83.19 806.43 161.35 714.86 319.49 530.9 M 1.3 896.93 C 77.93 805.59 154.99 716.66 319.49 530.9 M 1.03 903.33 C 101.5 789.84 199.99 677.94 325.13 530.5 M 1.03 903.33 C 98.36 793.52 193.28 683.45 325.13 530.5 M 1.43 908.97 C 116.28 772.99 230.76 641.9 330.12 530.86 M 1.43 908.97 C 127.41 763.95 254.15 617.01 330.12 530.86 M 1.17 915.37 C 131.16 765.4 258.62 617.16 335.76 530.47 M 1.17 915.37 C 124.01 775.84 243.7 636.6 335.76 530.47 M 1.56 921.02 C 112.56 798.94 218.96 676.44 340.75 530.83 M 1.56 921.02 C 81.66 830.99 159.38 741.5 340.75 530.83 M 1.3 927.41 C 101.36 813.39 200.67 702.23 346.39 530.44 M 1.3 927.41 C 103.25 806.23 205.54 688.84 346.39 530.44 M 1.04 933.81 C 101.56 820.79 201.48 706.37 351.38 530.8 M 1.04 933.81 C 134.97 781.08 267.76 631.03 351.38 530.8 M 1.43 939.45 C 117 807.64 232.13 673.9 357.02 530.4 M 1.43 939.45 C 102.01 819.07 203.78 701.57 357.02 530.4 M 1.17 945.85 C 84.84 844.84 174.62 744.47 362.01 530.76 M 1.17 945.85 C 112.52 820.03 220.51 694.18 362.01 530.76 M 1.57 951.49 C 92.81 850.08 179.75 749.69 367.65 530.37 M 1.57 951.49 C 87.43 856.91 170 761.23 367.65 530.37 M 1.31 957.89 C 123.74 818.63 244.9 676.01 372.64 530.73 M 1.31 957.89 C 93.75 849.83 185.86 744.03 372.64 530.73 M 1.04 964.29 C 101.84 847.17 200.26 733.86 378.28 530.33 M 1.04 964.29 C 85.56 860.82 172.29 760.11 378.28 530.33 M 1.44 969.93 C 133.75 811.14 271.82 653.46 383.27 530.69 M 1.44 969.93 C 133.73 822.67 262.21 674.4 383.27 530.69 M 1.18 976.33 C 93.36 869.54 185.17 764.3 388.25 531.05 M 1.18 976.33 C 133.64 823.43 265.4 672.21 388.25 531.05 M 1.57 981.97 C 109.67 859.49 216.84 738.08 393.9 530.66 M 1.57 981.97 C 96.03 871.18 193.19 758.71 393.9 530.66 M 1.31 988.37 C 122.65 849.1 243.42 714.62 398.88 531.02 M 1.31 988.37 C 83.89 893.01 167.82 797.53 398.88 531.02 M 1.05 994.77 C 114.29 869.72 228.68 738.44 404.53 530.62 M 1.05 994.77 C 136.29 838.24 273.45 681.35 404.53 530.62 M 1.44 1000.41 C 80.5 902.76 165.91 807.64 409.51 530.98 M 1.44 1000.41 C 86.9 895.15 177.32 792.09 409.51 530.98 M 1.18 1006.81 C 143.51 843.48 288.82 676.26 415.16 530.59 M 1.18 1006.81 C 137.66 847.49 274.79 688.5 415.16 530.59 M 1.58 1012.45 C 170.92 818.31 337.35 626.49 420.14 530.95 M 1.58 1012.45 C 158.27 836.29 312.66 659.93 420.14 530.95 M 1.32 1018.85 C 128.99 878.45 250.99 732.64 425.79 530.55 M 1.32 1018.85 C 102.84 906.5 200.61 793.77 425.79 530.55 M 1.05 1025.25 C 147.56 856.89 299.47 684.74 430.77 530.91 M 1.05 1025.25 C 163.09 843.18 322.64 659.64 430.77 530.91 M 2.76 1029.38 C 131.8 886.66 256.41 739 436.42 530.52 M 2.76 1029.38 C 172.4 832.51 344.81 634.15 436.42 530.52 M 3.81 1034.27 C 97.74 926.8 193.36 818.51 441.4 530.88 M 3.81 1034.27 C 168.22 846.84 331.04 658.3 441.4 530.88 M 5.52 1038.4 C 171.59 846.16 333.86 659.58 447.05 530.49 M 5.52 1038.4 C 122.34 906.43 239.42 770.61 447.05 530.49 M 6.57 1043.29 C 161.38 856.38 321.87 672.5 452.03 530.85 M 6.57 1043.29 C 109.43 925.58 212.71 807.29 452.03 530.85 M 7.62 1048.18 C 150.42 887.65 291.16 724.69 457.68 530.45 M 7.62 1048.18 C 122 922.91 233.37 796.16 457.68 530.45 M 8.67 1053.07 C 129.12 917.14 245.49 780.73 462.66 530.81 M 8.67 1053.07 C 107.08 939.27 209.31 823.08 462.66 530.81 M 11.69 1055.69 C 171.18 871.8 329.42 688.12 468.31 530.42 M 11.69 1055.69 C 113.03 939.92 213.02 825.48 468.31 530.42 M 14.05 1059.07 C 191.56 853.09 372.42 647.8 473.29 530.78 M 14.05 1059.07 C 171.55 871.73 333.09 685.42 473.29 530.78 M 17.07 1061.7 C 143.36 912.59 273.04 766.84 478.94 530.38 M 17.07 1061.7 C 123.29 940.06 227.52 819.47 478.94 530.38 M 20.09 1064.32 C 175.99 886.92 331.3 708.21 483.92 530.74 M 20.09 1064.32 C 126.35 935.42 235.74 809.19 483.92 530.74 M 23.76 1066.19 C 179.39 887.5 336.92 703.49 489.57 530.35 M 23.76 1066.19 C 208.61 857.77 390.97 650.42 489.57 530.35 M 28.75 1066.55 C 159.21 921.7 286.14 775.33 494.55 530.71 M 28.75 1066.55 C 129.21 947.45 231.34 831.41 494.55 530.71 M 33.08 1067.67 C 190.77 884.23 347.81 700.96 500.2 530.31 M 33.08 1067.67 C 220.27 852.92 406.1 640.29 500.2 530.31 M 37.41 1068.78 C 184.52 905.67 329.33 739.23 505.18 530.67 M 37.41 1068.78 C 157.39 933.93 278.15 794.61 505.18 530.67 M 42.4 1069.14 C 197.04 886.8 351.95 706.8 510.17 531.03 M 42.4 1069.14 C 136.86 961.76 233.95 850.35 510.17 531.03 M 46.73 1070.26 C 198.14 894.4 350.28 720.16 515.81 530.64 M 46.73 1070.26 C 158.22 941.2 269.31 812.15 515.81 530.64 M 50.41 1072.13 C 211.56 894.76 367.99 715.03 520.8 531 M 50.41 1072.13 C 209.75 881.87 371.77 694.64 520.8 531 M 56.05 1071.73 C 204.81 896.83 357.92 720.25 526.44 530.6 M 56.05 1071.73 C 179.37 936.2 300.36 797.26 526.44 530.6 M 61.04 1072.09 C 245.86 856.17 435.29 642.07 531.43 530.96 M 61.04 1072.09 C 166.71 955.09 270.4 837.36 531.43 530.96 M 66.68 1071.7 C 219.81 895.99 372.52 724.25 537.07 530.57 M 66.68 1071.7 C 229.84 890.15 389.31 707.1 537.07 530.57 M 71.67 1072.06 C 237.43 881.95 405.42 691.62 542.06 530.93 M 71.67 1072.06 C 254.05 859.81 438.17 649.39 542.06 530.93 M 77.31 1071.66 C 173.99 959.18 272.41 842.95 547.7 530.53 M 77.31 1071.66 C 230.36 895.28 385.56 717.64 547.7 530.53 M 82.3 1072.02 C 211.65 924.61 339.12 779.33 552.69 530.89 M 82.3 1072.02 C 224.13 909.19 365.94 746.33 552.69 530.89 M 87.94 1071.63 C 244.17 901.18 393.38 726.47 558.33 530.5 M 87.94 1071.63 C 269.28 866.87 450.5 659.35 558.33 530.5 M 92.93 1071.99 C 268.01 864.37 449.61 656.08 563.32 530.86 M 92.93 1071.99 C 264.96 872.35 435.45 674.23 563.32 530.86 M 98.57 1071.59 C 222.66 933.01 342.9 791.87 568.96 530.47 M 98.57 1071.59 C 234.16 911.08 371.29 753.79 568.96 530.47 M 103.56 1071.95 C 278.24 873.01 449.07 672.97 573.95 530.83 M 103.56 1071.95 C 223.65 934.81 346.29 793.23 573.95 530.83 M 109.2 1071.56 C 235.48 930.61 358.53 791.48 579.59 530.43 M 109.2 1071.56 C 273.25 881.73 439.37 691.48 579.59 530.43 M 114.19 1071.92 C 243.53 929.94 367.56 784.82 584.58 530.79 M 114.19 1071.92 C 222.36 946.95 333.77 817.71 584.58 530.79 M 119.83 1071.52 C 229.64 938.99 346.34 807.34 590.22 530.4 M 119.83 1071.52 C 260.4 916.72 396.29 758.66 590.22 530.4 M 124.82 1071.88 C 298.58 868.89 478.03 666.94 595.21 530.76 M 124.82 1071.88 C 223.45 959.12 325.13 841.63 595.21 530.76 M 130.46 1071.49 C 297.65 885.64 459.79 700.38 600.85 530.36 M 130.46 1071.49 C 293.96 883.34 459.65 692.24 600.85 530.36 M 135.45 1071.85 C 294.16 887.41 452.4 702.07 605.84 530.72 M 135.45 1071.85 C 271.4 918.03 408.63 759.52 605.84 530.72 M 141.09 1071.45 C 235.27 959.19 331.36 848.71 611.48 530.33 M 141.09 1071.45 C 326.62 856.43 513.57 641.7 611.48 530.33 M 146.08 1071.81 C 272.12 930.27 395.51 787.71 616.47 530.69 M 146.08 1071.81 C 252.47 953.7 358.03 833.66 616.47 530.69 M 151.06 1072.17 C 273.96 929.39 397.41 786.52 621.46 531.05 M 151.06 1072.17 C 252.61 953.83 353.06 837.48 621.46 531.05 M 156.71 1071.78 C 249.84 963.14 343.23 854.78 627.1 530.65 M 156.71 1071.78 C 317.72 886.8 478.98 701.54 627.1 530.65 M 161.69 1072.14 C 291.91 929.92 416.3 785.77 632.09 531.01 M 161.69 1072.14 C 258.27 961.84 354.19 850.39 632.09 531.01 M 167.34 1071.75 C 297.33 928.14 421.79 785.07 637.73 530.62 M 167.34 1071.75 C 285.98 936.15 405.22 798.07 637.73 530.62 M 172.32 1072.11 C 346.54 870.93 521.62 670.32 642.72 530.98 M 172.32 1072.11 C 315.05 909.46 454.53 748.31 642.72 530.98 M 177.97 1071.71 C 330.45 897.64 483.88 720.97 648.36 530.58 M 177.97 1071.71 C 331.75 890.65 487.34 712.6 648.36 530.58 M 182.95 1072.07 C 289.88 949.87 394.96 829.75 653.35 530.94 M 182.95 1072.07 C 293.13 944.11 404.64 816 653.35 530.94 M 188.6 1071.68 C 330.49 909.77 472.53 748.2 658.99 530.55 M 188.6 1071.68 C 289.57 954.52 388.34 839.45 658.99 530.55 M 193.58 1072.04 C 331.52 913.35 472.39 755.35 663.98 530.91 M 193.58 1072.04 C 323.4 922.77 456.15 768.99 663.98 530.91 M 199.23 1071.64 C 323.71 922.84 450.91 776.99 669.62 530.52 M 199.23 1071.64 C 350.33 903.16 498.29 731.69 669.62 530.52 M 204.21 1072 C 369 885.98 534.09 696.7 674.61 530.88 M 204.21 1072 C 360.31 896.51 515.64 717.17 674.61 530.88 M 209.86 1071.61 C 378.04 880.27 545.59 686.69 680.25 530.48 M 209.86 1071.61 C 364.94 895.58 518.05 720.44 680.25 530.48 M 214.84 1071.97 C 384.82 882.38 550.23 689.76 685.24 530.84 M 214.84 1071.97 C 390.74 863.84 569.54 657.2 685.24 530.84 M 220.49 1071.57 C 336 933.86 457.04 793.98 690.88 530.45 M 220.49 1071.57 C 360.52 914.93 496.1 756.98 690.88 530.45 M 225.47 1071.93 C 407.5 862.26 588.7 656.62 695.87 530.81 M 225.47 1071.93 C 346.81 930.15 470.15 787.79 695.87 530.81 M 231.12 1071.54 C 376.84 912.98 516.85 749.24 701.51 530.41 M 231.12 1071.54 C 389.31 888.67 549.09 706.47 701.51 530.41 M 236.1 1071.9 C 391.5 897.09 544.2 721.53 706.5 530.77 M 236.1 1071.9 C 388.32 898.51 537.83 726.63 706.5 530.77 M 241.75 1071.5 C 421.07 862.89 603.58 654.12 712.14 530.38 M 241.75 1071.5 C 412.59 876.91 585.47 679.39 712.14 530.38 M 246.73 1071.86 C 411.83 881.26 580.95 686.87 717.13 530.74 M 246.73 1071.86 C 395.85 898.49 546.25 724.76 717.13 530.74 M 252.38 1071.47 C 375.59 925.39 503.41 779.85 722.77 530.34 M 252.38 1071.47 C 411.31 892.71 568.45 713.51 722.77 530.34 M 257.37 1071.83 C 386.26 923.88 512.77 781.16 727.76 530.7 M 257.37 1071.83 C 426.92 879.04 595.45 686.89 727.76 530.7 M 263.01 1071.44 C 378.16 938.49 493.55 804.11 733.4 530.31 M 263.01 1071.44 C 438.27 868.52 616.81 663.87 733.4 530.31 M 268 1071.8 C 435.35 875.48 602.44 682.93 738.39 530.67 M 268 1071.8 C 426.8 893.23 584.36 712.29 738.39 530.67 M 272.98 1072.16 C 401.16 921.11 528.93 773.12 743.38 531.03 M 272.98 1072.16 C 416.6 901.04 561.73 734.13 743.38 531.03 M 278.63 1071.76 C 431.54 895.59 580.62 725 749.02 530.63 M 278.63 1071.76 C 411.74 918.54 543.03 768.71 749.02 530.63 M 283.61 1072.12 C 417.24 920.34 545.91 770.64 754.01 530.99 M 283.61 1072.12 C 427.04 913.64 566.65 752.23 754.01 530.99 M 289.26 1071.73 C 456.43 878.8 626.93 683.76 759.65 530.6 M 289.26 1071.73 C 404.26 944.99 516.14 815.46 759.65 530.6 M 294.24 1072.09 C 395.51 959.99 495.77 844.31 764.64 530.96 M 294.24 1072.09 C 480.39 861.91 664.44 651.33 764.64 530.96 M 299.89 1071.69 C 434.42 916.11 567.42 762.72 770.28 530.57 M 299.89 1071.69 C 480.46 861.72 662.19 651.88 770.28 530.57 M 304.87 1072.05 C 405.81 958.61 502.52 844.04 775.27 530.93 M 304.87 1072.05 C 403.71 960.93 500.89 848.2 775.27 530.93 M 310.52 1071.66 C 404.03 960.08 500.79 850.09 780.91 530.53 M 310.52 1071.66 C 453.98 900.52 598.47 733.21 780.91 530.53 M 315.5 1072.02 C 430.98 936.6 546.8 801 785.9 530.89 M 315.5 1072.02 C 428.69 943.12 536.25 818.36 785.9 530.89 M 321.15 1071.62 C 432.45 942.09 546.24 807.95 791.54 530.5 M 321.15 1071.62 C 471.08 898.19 618.99 727.97 791.54 530.5 M 326.13 1071.98 C 445.78 937.49 566.27 798.01 796.53 530.86 M 326.13 1071.98 C 477.13 894.32 628.25 721.53 796.53 530.86 M 331.78 1071.59 C 437.08 953.04 539.82 834.5 802.17 530.46 M 331.78 1071.59 C 487.5 888.36 645.78 704.92 802.17 530.46 M 336.76 1071.95 C 438.41 955.49 536.95 839.8 807.16 530.82 M 336.76 1071.95 C 437.45 963.6 532.63 853.63 807.16 530.82 M 342.41 1071.55 C 510.12 878.38 678.78 685.12 812.8 530.43 M 342.41 1071.55 C 449.27 949.61 555.71 828.52 812.8 530.43 M 347.39 1071.91 C 475.73 926.48 604.67 777.04 817.79 530.79 M 347.39 1071.91 C 528.46 870.13 706.29 663.42 817.79 530.79 M 353.04 1071.52 C 544.13 853.99 730.13 640.82 823.43 530.39 M 353.04 1071.52 C 469.29 938.36 585.83 805.22 823.43 530.39 M 358.02 1071.88 C 468.16 948.2 579.6 822.71 828.42 530.75 M 358.02 1071.88 C 458.14 955.23 557.91 839.15 828.42 530.75 M 363.67 1071.49 C 486.47 925.1 611.13 782.02 834.06 530.36 M 363.67 1071.49 C 544.84 858.3 729.58 646.08 834.06 530.36 M 368.65 1071.85 C 482.47 944.27 591.11 818.19 839.05 530.72 M 368.65 1071.85 C 487 941.2 601.18 809.93 839.05 530.72 M 374.3 1071.45 C 472.03 957.68 569.16 842.6 844.69 530.32 M 374.3 1071.45 C 507.02 919.04 639.24 769.95 844.69 530.32 M 379.28 1071.81 C 509.34 913.41 642.49 759.33 849.68 530.68 M 379.28 1071.81 C 508.64 923.23 641.65 770.65 849.68 530.68 M 384.27 1072.17 C 508.11 926.01 634.48 780.84 854.66 531.04 M 384.27 1072.17 C 492.29 947.84 602.09 823.14 854.66 531.04 M 389.91 1071.78 C 558.26 885.98 720.99 695.78 860.31 530.65 M 389.91 1071.78 C 538.23 910.64 680.55 745.72 860.31 530.65 M 394.9 1072.14 C 488.78 964.63 584.43 856.67 865.29 531.01 M 394.9 1072.14 C 488.65 958.94 585.12 848.81 865.29 531.01 M 400.54 1071.74 C 516.14 941.62 631.65 809.08 870.94 530.61 M 400.54 1071.74 C 572.76 875.29 744.04 680.48 870.94 530.61 M 405.53 1072.1 C 570.54 877.48 736.02 685.83 875.92 530.97 M 405.53 1072.1 C 531.86 925.48 656.9 780.3 875.92 530.97 M 411.17 1071.71 C 570.94 892.71 724.75 714.18 881.57 530.58 M 411.17 1071.71 C 537.2 920.1 665.75 772.01 881.57 530.58 M 416.16 1072.07 C 603.08 856.5 787.56 642.68 886.55 530.94 M 416.16 1072.07 C 565.75 900.86 714.72 729.67 886.55 530.94 M 421.8 1071.67 C 540.45 936.36 654.56 805.24 892.2 530.55 M 421.8 1071.67 C 575.22 893.6 730.92 716.11 892.2 530.55 M 426.79 1072.03 C 604.14 863.54 785.4 656.54 897.18 530.91 M 426.79 1072.03 C 594.16 874.13 763.31 679.09 897.18 530.91 M 432.43 1071.64 C 599.75 883.42 764.45 688.99 902.83 530.51 M 432.43 1071.64 C 617.91 864.23 802.4 652.58 902.83 530.51 M 437.42 1072 C 575.81 917 708.2 762.42 907.81 530.87 M 437.42 1072 C 547.24 945.49 659.14 817.14 907.81 530.87 M 443.06 1071.6 C 582.89 911.23 724.61 745.97 913.46 530.48 M 443.06 1071.6 C 627.85 862.52 808.1 652.88 913.46 530.48 M 448.05 1071.96 C 581.39 920.93 710.5 767.85 918.44 530.84 M 448.05 1071.96 C 582.8 908.53 721.94 748.61 918.44 530.84 M 453.69 1071.57 C 578.51 926.64 707.09 780.46 924.09 530.44 M 453.69 1071.57 C 559.56 950.91 662.21 832.86 924.09 530.44 M 458.68 1071.93 C 571.24 942.11 687.78 813.27 929.08 530.8 M 458.68 1071.93 C 608.66 901.09 755.53 732.68 929.08 530.8 M 464.32 1071.53 C 611.01 906.14 756.97 739.41 934.72 530.41 M 464.32 1071.53 C 583.37 933.2 703.65 793.18 934.72 530.41 M 469.31 1071.89 C 593.42 933.89 712.75 793.34 939.71 530.77 M 469.31 1071.89 C 647.3 871.76 824.68 667.09 939.71 530.77 M 474.95 1071.5 C 573.44 957.6 671.77 844.3 945.35 530.37 M 474.95 1071.5 C 589.54 936.45 705 804.58 945.35 530.37 M 479.94 1071.86 C 626.5 902.06 774.95 733.12 950.34 530.73 M 479.94 1071.86 C 581.01 960.02 677.36 847.14 950.34 530.73 M 485.58 1071.47 C 591.89 952.1 698.37 831.38 955.98 530.34 M 485.58 1071.47 C 669.12 860.77 854.89 647.87 955.98 530.34 M 490.57 1071.83 C 581.41 959.77 678.01 852.34 960.97 530.7 M 490.57 1071.83 C 603.56 941.59 715.47 814.22 960.97 530.7 M 495.56 1072.19 C 672.58 872.07 844.58 675.11 966.61 530.3 M 495.56 1072.19 C 630.33 916.66 763.52 760.82 966.61 530.3 M 501.2 1071.79 C 609.66 953.19 712.36 834.63 971.6 530.66 M 501.2 1071.79 C 653.27 902.01 805.14 727.99 971.6 530.66 M 506.19 1072.15 C 643.85 915.39 782.57 757.39 976.58 531.02 M 506.19 1072.15 C 677.02 872.51 852.15 671.8 976.58 531.02 M 511.83 1071.76 C 638.52 928.07 763.83 781.15 982.23 530.63 M 511.83 1071.76 C 619.33 943.3 727.95 816.94 982.23 530.63 M 516.82 1072.12 C 625.98 954.21 728.39 833.33 987.21 530.99 M 516.82 1072.12 C 644.43 924.88 775.07 775.01 987.21 530.99 M 522.46 1071.72 C 688.76 881.73 856.98 688.72 992.86 530.6 M 522.46 1071.72 C 700.62 868.32 873.69 669.51 992.86 530.6 M 527.45 1072.08 C 633.63 946.82 741.56 824.76 997.84 530.96 M 527.45 1072.08 C 662.59 914.27 799.5 755.94 997.84 530.96 M 533.09 1071.69 C 666.01 910.35 805.41 753.18 1003.49 530.56 M 533.09 1071.69 C 645.56 935.67 760.34 802.31 1003.49 530.56 M 538.08 1072.05 C 697.32 891.53 853.23 712.14 1008.47 530.92 M 538.08 1072.05 C 670.22 919.73 801.45 767.33 1008.47 530.92 M 543.72 1071.65 C 733.88 857.09 917.21 644.99 1014.12 530.53 M 543.72 1071.65 C 639.37 966.5 733.7 858.21 1014.12 530.53 M 548.71 1072.01 C 651.45 952.65 754.31 836.03 1019.1 530.89 M 548.71 1072.01 C 728.48 864.42 906.92 659.34 1019.1 530.89 M 554.35 1071.62 C 732.14 864.26 908.69 659.92 1024.75 530.49 M 554.35 1071.62 C 685.55 920.05 820.36 764.33 1024.75 530.49 M 559.34 1071.98 C 705.03 903 854.99 728.26 1029.73 530.85 M 559.34 1071.98 C 700.01 917.81 836.85 760.56 1029.73 530.85 M 564.98 1071.58 C 693.62 919.72 825.29 768.83 1035.38 530.46 M 564.98 1071.58 C 743.12 865.64 923.03 657.86 1035.38 530.46 M 569.97 1071.94 C 720.57 895.77 873.96 717.99 1040.36 530.82 M 569.97 1071.94 C 754.17 864.66 937.81 653.38 1040.36 530.82 M 575.61 1071.55 C 718.74 900.22 869.13 731.09 1046.01 530.42 M 575.61 1071.55 C 711.69 919.14 846.39 765.3 1046.01 530.42 M 580.6 1071.91 C 720.16 914.38 855.5 757.47 1050.99 530.78 M 580.6 1071.91 C 686.14 954.12 789.13 836.3 1050.99 530.78 M 586.24 1071.52 C 695.44 943.62 802.47 820.03 1056.64 530.39 M 586.24 1071.52 C 681.47 954.4 780.57 840.08 1056.64 530.39 M 591.23 1071.88 C 736.14 908.01 875.9 745.49 1061.62 530.75 M 591.23 1071.88 C 775.75 859.96 960.25 648.09 1061.62 530.75 M 596.87 1071.48 C 766.47 876.4 935.62 680.75 1067.27 530.35 M 596.87 1071.48 C 735.22 908.48 876.03 747.97 1067.27 530.35 M 601.86 1071.84 C 704.14 956.07 804.93 841.42 1072.25 530.71 M 601.86 1071.84 C 745.29 906.68 885.03 746.46 1072.25 530.71 M 607.5 1071.45 C 774.44 884.79 938.08 695.2 1077.9 530.32 M 607.5 1071.45 C 747.85 903.42 890.72 738.35 1077.9 530.32 M 612.49 1071.81 C 775.54 887.24 937.98 702.31 1082.88 530.68 M 612.49 1071.81 C 795.28 861.17 979.41 650.34 1082.88 530.68 M 617.48 1072.17 C 728.42 943.97 844.96 812.84 1087.87 531.04 M 617.48 1072.17 C 761.82 908.77 906.06 742.4 1087.87 531.04 M 623.12 1071.77 C 790.62 883.6 954.79 691.99 1092.86 531.4 M 623.12 1071.77 C 764.67 914.58 904.52 753.3 1092.86 531.4 M 628.11 1072.13 C 814.66 855.68 1000.97 639.85 1097.19 532.51 M 628.11 1072.13 C 730.28 958.15 828.12 846.1 1097.19 532.51 M 633.75 1071.74 C 802.42 877.37 970.75 685.39 1102.18 532.87 M 633.75 1071.74 C 777.86 905.99 924.4 736.73 1102.18 532.87 M 638.74 1072.1 C 814.77 873.11 988.35 673.34 1106.51 533.99 M 638.74 1072.1 C 740.15 950.24 845.15 831.03 1106.51 533.99 M 644.38 1071.7 C 748.44 947.36 854.17 827.18 1111.49 534.35 M 644.38 1071.7 C 783.11 904.34 925.51 740.47 1111.49 534.35 M 649.37 1072.06 C 754.77 950.67 860.66 826.7 1115.82 535.46 M 649.37 1072.06 C 833.5 860.71 1017.18 650.29 1115.82 535.46 M 655.01 1071.67 C 790.67 916.47 928.12 760.02 1119.5 537.33 M 655.01 1071.67 C 751.41 963.68 847.18 852.78 1119.5 537.33 M 660 1072.03 C 769.55 948.8 880.34 821.1 1123.17 539.2 M 660 1072.03 C 791.07 924.59 917.83 778.32 1123.17 539.2 M 665.64 1071.63 C 774.55 944.7 884.81 819.99 1126.85 541.07 M 665.64 1071.63 C 821.67 895.38 974.2 719.01 1126.85 541.07 M 670.63 1071.99 C 841.6 882.51 1008.58 689.16 1129.21 544.45 M 670.63 1071.99 C 789.64 940.83 904 808.53 1129.21 544.45 M 676.27 1071.6 C 767.54 967.41 862.1 859.88 1132.23 547.08 M 676.27 1071.6 C 789.01 936.73 904.46 802.8 1132.23 547.08 M 681.26 1071.96 C 860.78 867.84 1040.25 664.38 1134.59 550.46 M 681.26 1071.96 C 783.95 958.68 883.94 843.36 1134.59 550.46 M 686.9 1071.56 C 805.61 934.49 927.21 795.9 1136.3 554.59 M 686.9 1071.56 C 830.13 905.72 973.75 740.34 1136.3 554.59 M 691.89 1071.93 C 864.94 872.62 1041.57 668.43 1137.35 559.48 M 691.89 1071.93 C 825.42 916.39 961.01 759.14 1137.35 559.48 M 697.53 1071.53 C 871.18 873.78 1044.6 675.25 1138.4 564.37 M 697.53 1071.53 C 851.41 892.42 1004.28 716.52 1138.4 564.37 M 702.52 1071.89 C 815.75 934.89 932.19 798.84 1140.11 568.5 M 702.52 1071.89 C 852.16 900.97 1002.15 727.76 1140.11 568.5 M 708.16 1071.5 C 820.81 938.77 935.47 803.68 1141.16 573.39 M 708.16 1071.5 C 853.22 910.57 996.23 747.11 1141.16 573.39 M 713.15 1071.86 C 883.04 877.55 1051.44 683.98 1140.9 579.79 M 713.15 1071.86 C 882.53 872.77 1053.16 677.82 1140.9 579.79 M 718.79 1071.46 C 828.19 951.62 936.31 827.34 1140.64 586.18 M 718.79 1071.46 C 854.66 919.39 989.06 765.29 1140.64 586.18 M 723.78 1071.82 C 880.17 890.45 1034.95 708.92 1141.03 591.83 M 723.78 1071.82 C 827.18 954.76 929.85 834.2 1141.03 591.83 M 728.76 1072.18 C 837.43 950.41 945.49 823.65 1140.77 598.22 M 728.76 1072.18 C 870.87 904.71 1015.04 739.12 1140.77 598.22 M 734.41 1071.79 C 862.38 924.32 987.53 778.18 1141.16 603.87 M 734.41 1071.79 C 856.64 932.19 977.65 790.95 1141.16 603.87 M 739.39 1072.15 C 842.63 949.99 947.1 833.16 1140.9 610.26 M 739.39 1072.15 C 868.04 922.83 994.4 776.88 1140.9 610.26 M 745.04 1071.75 C 863.19 932.69 982.28 793.41 1140.64 616.66 M 745.04 1071.75 C 849.08 946.61 957.09 824.53 1140.64 616.66 M 750.02 1072.11 C 885.51 911.8 1025.05 752.62 1141.04 622.31 M 750.02 1072.11 C 864.06 940.93 979.16 808.53 1141.04 622.31 M 755.67 1071.72 C 894.65 907.45 1032.68 748.57 1140.77 628.7 M 755.67 1071.72 C 872.37 937.12 989.88 801.6 1140.77 628.7 M 760.65 1072.08 C 888.08 923.91 1015.76 779.26 1141.17 634.35 M 760.65 1072.08 C 842.04 974.33 924.83 878.55 1141.17 634.35 M 766.3 1071.68 C 880.81 944.74 992.44 815.14 1140.91 640.74 M 766.3 1071.68 C 869.32 954.81 968.11 841.33 1140.91 640.74 M 771.28 1072.04 C 888.22 935.73 1007.98 798.09 1140.65 647.14 M 771.28 1072.04 C 848.44 986.31 922.54 900.51 1140.65 647.14 M 776.93 1071.65 C 865.4 971.13 953.07 868.61 1141.04 652.79 M 776.93 1071.65 C 860.05 972.21 944.58 873.61 1141.04 652.79 M 781.91 1072.01 C 890.2 943.32 999.08 816.75 1140.78 659.18 M 781.91 1072.01 C 864.08 978.06 944.03 885.63 1140.78 659.18 M 787.56 1071.61 C 899.38 944.93 1006.01 820.88 1141.17 664.83 M 787.56 1071.61 C 862.25 983.63 938.37 897.3 1141.17 664.83 M 792.54 1071.97 C 869.49 985.1 944.26 897.72 1140.91 671.22 M 792.54 1071.97 C 875.32 974.09 958.75 879.44 1140.91 671.22 M 798.19 1071.58 C 910.74 942.47 1021.77 812.6 1140.65 677.62 M 798.19 1071.58 C 875.9 982.45 954.75 891.06 1140.65 677.62 M 803.17 1071.94 C 889.26 969.59 974.46 872.24 1141.04 683.26 M 803.17 1071.94 C 888.45 969.45 976 869.35 1141.04 683.26 M 808.82 1071.55 C 920.69 948.54 1029.62 822.37 1140.78 689.66 M 808.82 1071.55 C 885.78 986.72 960.36 901.72 1140.78 689.66 M 813.8 1071.91 C 934.41 931.93 1053.13 794.23 1141.18 695.31 M 813.8 1071.91 C 908.24 966.83 1001.33 859.01 1141.18 695.31 M 819.45 1071.51 C 901.59 980.5 982.86 883.66 1140.92 701.7 M 819.45 1071.51 C 933.48 935.98 1051.82 800.67 1140.92 701.7 M 824.43 1071.87 C 935.09 942.69 1047.28 814.23 1140.66 708.1 M 824.43 1071.87 C 943.88 935.82 1064.46 799.25 1140.66 708.1 M 830.08 1071.48 C 905.85 982.39 980.35 894.2 1141.05 713.74 M 830.08 1071.48 C 931.08 953.02 1034.21 834.42 1141.05 713.74 M 835.06 1071.84 C 948.77 942.08 1065.15 811.43 1140.79 720.14 M 835.06 1071.84 C 943.29 941.62 1055.26 814.37 1140.79 720.14 M 840.71 1071.44 C 947.88 947.35 1054.94 824.57 1141.18 725.79 M 840.71 1071.44 C 913.13 989.08 983.31 908.79 1141.18 725.79 M 845.69 1071.8 C 913.49 991.43 984.47 909.08 1140.92 732.18 M 845.69 1071.8 C 952.41 950.23 1054.75 831.22 1140.92 732.18 M 850.68 1072.16 C 913.55 993.83 978.84 919.51 1140.66 738.58 M 850.68 1072.16 C 932.63 978.04 1017.54 879.95 1140.66 738.58 M 856.32 1071.77 C 946.62 971.55 1038.91 867.25 1141.05 744.22 M 856.32 1071.77 C 918.4 1001.12 978.78 933.48 1141.05 744.22 M 861.31 1072.13 C 921.41 1001.46 982.12 931.48 1140.79 750.62 M 861.31 1072.13 C 960.47 957.9 1059.73 844.8 1140.79 750.62 M 866.96 1071.73 C 924.67 998.75 984.81 927.95 1141.19 756.26 M 866.96 1071.73 C 943.15 986.19 1020.92 896.37 1141.19 756.26 M 871.94 1072.09 C 951.88 980.44 1030.93 887.72 1140.93 762.66 M 871.94 1072.09 C 975.83 953.15 1080.47 835.6 1140.93 762.66 M 877.59 1071.7 C 965.56 966.52 1058.7 863.9 1141.32 768.31 M 877.59 1071.7 C 954.92 984.06 1031.05 897.08 1141.32 768.31 M 882.57 1072.06 C 964.39 979.84 1046.29 882.07 1141.06 774.7 M 882.57 1072.06 C 981.48 960.55 1076.68 850.26 1141.06 774.7 M 888.22 1071.66 C 962.91 982.51 1041.5 898.52 1140.8 781.1 M 888.22 1071.66 C 991.88 955.4 1091.84 839.78 1140.8 781.1 M 893.2 1072.02 C 981.58 968.2 1072.16 864.61 1141.19 786.74 M 893.2 1072.02 C 950.17 1011.03 1003.36 946.86 1141.19 786.74 M 898.85 1071.63 C 963.28 989.18 1033.77 913 1140.93 793.14 M 898.85 1071.63 C 988.99 968.55 1081.26 863.45 1140.93 793.14 M 903.83 1071.99 C 954.65 1017.21 1002.11 964.43 1141.33 798.79 M 903.83 1071.99 C 965.65 999.39 1024.12 930.25 1141.33 798.79 M 909.48 1071.6 C 988.03 983.95 1063.05 897.88 1141.06 805.18 M 909.48 1071.6 C 969.27 1007.78 1029.06 941.44 1141.06 805.18 M 914.46 1071.96 C 963.67 1012.14 1008.41 956.01 1140.8 811.58 M 914.46 1071.96 C 984.5 987.54 1058.07 903.29 1140.8 811.58 M 920.11 1071.56 C 974.82 1011.89 1026.51 951.9 1141.2 817.22 M 920.11 1071.56 C 969.06 1019.17 1012.59 965.89 1141.2 817.22 M 925.09 1071.92 C 987.38 1000.52 1048.76 929.03 1140.94 823.62 M 925.09 1071.92 C 991.97 996.08 1057.56 923.49 1140.94 823.62 M 930.74 1071.53 C 984.46 1012.7 1037.44 949.61 1141.33 829.26 M 930.74 1071.53 C 997.06 996.77 1062.65 922.59 1141.33 829.26 M 935.72 1071.89 C 999.47 995.97 1058.59 924.2 1141.07 835.66 M 935.72 1071.89 C 1009.62 984.83 1084.97 897.38 1141.07 835.66 M 941.37 1071.49 C 1014.43 982.63 1089.58 892.45 1140.81 842.06 M 941.37 1071.49 C 979.97 1022.23 1021.44 975.47 1140.81 842.06 M 946.35 1071.85 C 998.57 1012.27 1055.3 948.74 1141.2 847.7 M 946.35 1071.85 C 1009.67 996.23 1075.3 924.22 1141.2 847.7 M 952 1071.46 C 1009.9 1006.88 1063.91 947.18 1140.94 854.1 M 952 1071.46 C 1022.05 989.55 1094.97 906.2 1140.94 854.1 M 956.98 1071.82 C 1023.8 992.48 1093.1 914.46 1141.34 859.74 M 956.98 1071.82 C 1014.78 1007.95 1073.14 940.67 1141.34 859.74 M 961.97 1072.18 C 1024.45 995.63 1091.26 917.77 1141.07 866.14 M 961.97 1072.18 C 1019.86 1003.64 1079.9 934.47 1141.07 866.14 M 967.61 1071.78 C 1020.72 1008 1077.33 948.54 1140.81 872.54 M 967.61 1071.78 C 1017.27 1013.74 1062.36 958.58 1140.81 872.54 M 972.6 1072.14 C 1025.63 1011.23 1077.61 950.62 1141.21 878.18 M 972.6 1072.14 C 1039.3 994.27 1104.77 917 1141.21 878.18 M 978.24 1071.75 C 1017.58 1034.76 1056.34 991.81 1140.95 884.58 M 978.24 1071.75 C 1025.71 1017.75 1073.04 964.72 1140.95 884.58 M 983.23 1072.11 C 1034.9 1014.33 1090.04 949.71 1141.34 890.22 M 983.23 1072.11 C 1026.64 1021.9 1072.4 970.88 1141.34 890.22 M 988.87 1071.71 C 1033.27 1018.67 1077.53 970.59 1141.08 896.62 M 988.87 1071.71 C 1023.76 1034.97 1057.87 994.34 1141.08 896.62 M 993.86 1072.07 C 1038.75 1017.08 1085.21 968.18 1140.82 903.02 M 993.86 1072.07 C 1054.33 1007.36 1113.33 939.01 1140.82 903.02 M 999.5 1071.68 C 1044.47 1018.66 1093 960.98 1141.21 908.66 M 999.5 1071.68 C 1042.33 1020.79 1087.2 967.77 1141.21 908.66 M 1004.49 1072.04 C 1046.63 1027.34 1080.9 985.29 1140.95 915.06 M 1004.49 1072.04 C 1042.74 1028.03 1080.72 985.5 1140.95 915.06 M 1010.13 1071.64 C 1048.52 1028.1 1088.93 984.39 1141.35 920.7 M 1010.13 1071.64 C 1059.43 1016.1 1107.37 961.18 1141.35 920.7 M 1015.12 1072.01 C 1047.85 1032.64 1093.35 982.18 1141.08 927.1 M 1015.12 1072.01 C 1061.51 1020.1 1105.51 968.4 1141.08 927.1 M 1020.76 1071.61 C 1057.91 1029.73 1091.54 993.95 1140.82 933.5 M 1020.76 1071.61 C 1062.27 1021.53 1103.02 974.29 1140.82 933.5 M 1025.75 1071.97 C 1056.82 1035.69 1084.41 1004.29 1141.22 939.14 M 1025.75 1071.97 C 1053.24 1039.67 1079.47 1009.27 1141.22 939.14 M 1031.39 1071.58 C 1070.34 1028.49 1103.26 990.65 1140.96 945.54 M 1031.39 1071.58 C 1054.5 1043.84 1077.98 1016.7 1140.96 945.54 M 1036.38 1071.94 C 1058.13 1046.22 1079.91 1019.38 1141.35 951.18 M 1036.38 1071.94 C 1081.22 1025.02 1120.19 975.16 1141.35 951.18 M 1042.02 1071.54 C 1071.65 1037.84 1099.39 1010.79 1141.09 957.58 M 1042.02 1071.54 C 1066.47 1041.03 1095.89 1011.6 1141.09 957.58 M 1047.01 1071.9 C 1067.36 1042.93 1094.57 1015.9 1140.83 963.98 M 1047.01 1071.9 C 1067.28 1044.15 1091.71 1020.37 1140.83 963.98 M 1052.65 1071.51 C 1076.27 1045.67 1099.83 1019.92 1141.22 969.62 M 1052.65 1071.51 C 1072.86 1047.7 1090.38 1026.6 1141.22 969.62 M 1057.64 1071.87 C 1075.28 1045.98 1094.43 1025.66 1140.96 976.02 M 1057.64 1071.87 C 1084.77 1044.36 1112.47 1014.5 1140.96 976.02 M 1063.28 1071.47 C 1080.18 1052.33 1098.88 1030.39 1141.35 981.66 M 1063.28 1071.47 C 1084.56 1044.09 1109.06 1021.28 1141.35 981.66 M 1068.27 1071.83 C 1088.06 1045.79 1105.74 1027.72 1141.09 988.06 M 1068.27 1071.83 C 1090.85 1048.14 1111.09 1024.41 1141.09 988.06 M 1073.91 1071.44 C 1090.31 1048.62 1108.98 1028.46 1140.83 994.46 M 1073.91 1071.44 C 1094.13 1047.43 1118.58 1020.13 1140.83 994.46 M 1078.9 1071.8 C 1096.4 1054.64 1109.82 1038.17 1141.23 1000.1 M 1078.9 1071.8 C 1096.42 1050.95 1113.98 1031.38 1141.23 1000.1 M 1083.89 1072.16 C 1102.82 1048.39 1128.64 1026.73 1140.96 1006.5 M 1083.89 1072.16 C 1104.55 1050.74 1123.02 1026.36 1140.96 1006.5 M 1089.53 1071.76 C 1099.94 1058.92 1114.51 1043.89 1141.36 1012.14 M 1089.53 1071.76 C 1101.52 1058.71 1115.48 1043.09 1141.36 1012.14 M 1094.52 1072.12 C 1109.59 1053.61 1125.01 1039.61 1141.1 1018.54 M 1094.52 1072.12 C 1106.36 1054.67 1119.82 1040.89 1141.1 1018.54 M 1100.82 1070.97 C 1118.43 1054.71 1129.13 1036.18 1142.15 1023.43 M 1100.82 1070.97 C 1114.98 1054.44 1130.33 1034.59 1142.15 1023.43 M 1107.12 1069.83 C 1117.81 1057.14 1127.19 1046.04 1140.58 1031.33 M 1107.12 1069.83 C 1115.72 1061.01 1125.82 1047.31 1140.58 1031.33 M 1113.42 1068.68 C 1123.87 1056.5 1132.94 1050.14 1139.66 1038.49 M 1113.42 1068.68 C 1123.35 1054.34 1132.86 1043.61 1139.66 1038.49" fill="none" stroke="#dae8fc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 48.6 530 M 48.6 530 C 393.45 523.13 736.51 523.3 1091.4 530 M 48.6 530 C 338.26 536.92 628.61 537.03 1091.4 530 M 1091.4 530 C 1126.92 533.55 1141.92 545.87 1140 578.6 M 1091.4 530 C 1127.89 528.79 1144.11 549.57 1140 578.6 M 1140 578.6 C 1141.88 751.75 1140.56 928.64 1140 1021.4 M 1140 578.6 C 1140.39 689.41 1140.07 801.42 1140 1021.4 M 1140 1021.4 C 1140.11 1052.34 1122.38 1068.41 1091.4 1070 M 1140 1021.4 C 1141.63 1052.11 1124.28 1066.24 1091.4 1070 M 1091.4 1070 C 739.04 1063.47 385.89 1062.98 48.6 1070 M 1091.4 1070 C 800.66 1062.75 511.14 1063.07 48.6 1070 M 48.6 1070 C 18.56 1068.22 -1.32 1055.09 0 1021.4 M 48.6 1070 C 12.55 1067.64 3.98 1051.17 0 1021.4 M 0 1021.4 C 3.13 850.73 2.55 684.49 0 578.6 M 0 1021.4 C 3.05 879.79 2.76 738.95 0 578.6 M 0 578.6 C -1.51 546.29 14.53 528.38 48.6 530 M 0 578.6 C 2.56 547.35 14.31 530.6 48.6 530" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="330" y="0" width="470" height="420" rx="50.4" ry="50.4" fill="none" stroke="none" pointer-events="all"/><path d="M 342.38 12.85 C 342.38 12.85 342.38 12.85 342.38 12.85 M 342.38 12.85 C 342.38 12.85 342.38 12.85 342.38 12.85 M 336.87 25.28 C 340.66 22.21 349.65 11.06 353.93 5.66 M 336.87 25.28 C 339.59 19.96 343.06 16.1 353.93 5.66 M 334.64 33.95 C 344.39 22.1 349.91 16.97 360.23 4.51 M 334.64 33.95 C 341.43 27.27 348.75 18.35 360.23 4.51 M 330.45 44.87 C 341.79 32.49 356.71 10.33 365.87 4.12 M 330.45 44.87 C 343.81 31.98 356.36 16.07 365.87 4.12 M 330.84 50.52 C 349.29 29.37 363.7 13.19 372.17 2.97 M 330.84 50.52 C 345.53 33.44 359.75 17.26 372.17 2.97 M 330.58 56.91 C 344.62 38.9 357.98 26.05 378.47 1.82 M 330.58 56.91 C 350.13 34.92 368.28 15.87 378.47 1.82 M 330.32 63.31 C 347.29 46.73 362.31 23.73 383.46 2.18 M 330.32 63.31 C 346.13 46.27 359.37 31.22 383.46 2.18 M 330.71 68.95 C 340.71 53.61 355.6 41.16 388.45 2.54 M 330.71 68.95 C 348.68 48.84 367.82 25.76 388.45 2.54 M 330.45 75.35 C 354.8 49.99 374.25 24.98 394.09 2.15 M 330.45 75.35 C 345.55 59.34 357.02 42.15 394.09 2.15 M 330.85 81 C 347.31 61.52 361.53 43.55 399.08 2.51 M 330.85 81 C 346.66 60.94 360.95 42.55 399.08 2.51 M 330.58 87.39 C 349.3 69.95 364.91 52.48 404.72 2.11 M 330.58 87.39 C 346.81 69.48 362.38 52.84 404.72 2.11 M 330.32 93.79 C 353.83 62.87 382.59 38.2 409.71 2.47 M 330.32 93.79 C 357.24 68.6 382.11 40.96 409.71 2.47 M 330.72 99.43 C 361.09 68.57 386.27 41.17 415.35 2.08 M 330.72 99.43 C 358.96 69.72 384 40.58 415.35 2.08 M 330.46 105.83 C 359.62 68.87 383.07 39.7 420.34 2.44 M 330.46 105.83 C 363.87 67.33 393.7 28 420.34 2.44 M 330.85 111.47 C 361.89 85.34 389.39 53.74 425.32 2.8 M 330.85 111.47 C 363.8 74.08 395.85 37.66 425.32 2.8 M 330.59 117.87 C 349.85 92.01 379.38 60.41 430.97 2.4 M 330.59 117.87 C 366.44 80.14 399.46 36.39 430.97 2.4 M 330.33 124.27 C 368.09 79.7 404.92 38.54 435.95 2.76 M 330.33 124.27 C 360.72 92.73 387.44 62.17 435.95 2.76 M 330.72 129.91 C 361.35 90.96 396.02 58.45 441.6 2.37 M 330.72 129.91 C 358.35 99.95 384.69 64.5 441.6 2.37 M 330.46 136.31 C 361.3 104.8 397.28 68.52 446.58 2.73 M 330.46 136.31 C 376.75 86.18 418.67 37.83 446.58 2.73 M 330.86 141.95 C 358.89 105.01 389.88 74.94 452.23 2.33 M 330.86 141.95 C 376.05 90.36 423.98 37.34 452.23 2.33 M 330.59 148.35 C 378.87 93.2 421.88 43 457.21 2.69 M 330.59 148.35 C 363.1 110.67 391.19 78.12 457.21 2.69 M 330.33 154.75 C 375.09 106.77 421.02 57.21 462.86 2.3 M 330.33 154.75 C 368.67 110.22 406.99 69.6 462.86 2.3 M 330.73 160.39 C 367.23 117.53 402.8 70.88 467.84 2.66 M 330.73 160.39 C 363.76 120.88 396.01 81.27 467.84 2.66 M 330.47 166.79 C 374.24 114.58 419.9 61.52 473.49 2.26 M 330.47 166.79 C 362.18 134.01 391.84 100.79 473.49 2.26 M 330.86 172.43 C 359.98 136.39 399.49 92.97 478.47 2.62 M 330.86 172.43 C 366.7 134.11 404.63 91.51 478.47 2.62 M 330.6 178.83 C 362.72 139.59 395.98 101.35 484.12 2.23 M 330.6 178.83 C 369.26 129.39 411.28 83.58 484.12 2.23 M 330.34 185.23 C 389.44 119.13 446.39 57.78 489.1 2.59 M 330.34 185.23 C 367.22 139.67 407.47 92.62 489.1 2.59 M 330.73 190.87 C 392.96 120.41 449.91 50.64 494.75 2.19 M 330.73 190.87 C 377.9 137.99 425.27 84.97 494.75 2.19 M 330.47 197.27 C 389.17 131.06 444.87 62.05 499.73 2.56 M 330.47 197.27 C 393.56 126.29 458.28 49.36 499.73 2.56 M 330.86 202.91 C 401.99 125.79 471.66 46.21 505.38 2.16 M 330.86 202.91 C 389.73 139.44 446.32 73.16 505.38 2.16 M 330.6 209.31 C 365.81 157.69 411.12 112.89 510.36 2.52 M 330.6 209.31 C 384.17 146.3 442.44 78.74 510.36 2.52 M 330.34 215.71 C 376.21 161.26 423.19 112.08 516.01 2.13 M 330.34 215.71 C 400.88 136.28 470.13 58.14 516.01 2.13 M 330.74 221.35 C 372.08 177.39 409 127.04 520.99 2.49 M 330.74 221.35 C 374.17 172.03 413.26 125.33 520.99 2.49 M 330.48 227.75 C 382.52 158.24 440.12 93.36 526.64 2.09 M 330.48 227.75 C 376.98 175.23 426.48 119.13 526.64 2.09 M 330.87 233.39 C 372.46 184.71 412.81 139.52 531.62 2.45 M 330.87 233.39 C 377.12 176.01 425.83 122.46 531.62 2.45 M 330.61 239.79 C 388.52 173.78 442.28 107.36 536.61 2.81 M 330.61 239.79 C 393.73 168.09 453.87 98.82 536.61 2.81 M 330.35 246.19 C 393.64 171.87 455.14 102.2 542.25 2.42 M 330.35 246.19 C 411.02 152.1 492.98 56.67 542.25 2.42 M 330.74 251.83 C 376.21 196.67 418.91 146.53 547.24 2.78 M 330.74 251.83 C 390.77 176.72 456.68 104 547.24 2.78 M 330.48 258.23 C 390.52 189.17 452.31 121.06 552.88 2.38 M 330.48 258.23 C 398.47 184.55 461.98 109.49 552.88 2.38 M 330.87 263.87 C 416.33 165.73 503.56 68.87 557.87 2.74 M 330.87 263.87 C 415.23 174.77 494.31 82.24 557.87 2.74 M 330.61 270.27 C 407.75 185.58 484.53 97.09 563.51 2.35 M 330.61 270.27 C 384.18 210.07 434.75 151.85 563.51 2.35 M 330.35 276.67 C 418.66 167.93 511.49 63.67 568.5 2.71 M 330.35 276.67 C 377.14 217.38 424.53 163.94 568.5 2.71 M 330.75 282.31 C 418.36 184.44 505.95 80.87 574.14 2.31 M 330.75 282.31 C 386.96 215.74 447.48 148.64 574.14 2.31 M 330.48 288.71 C 416.69 188.5 504.54 88.76 579.13 2.67 M 330.48 288.71 C 410.43 200.88 486.99 110.89 579.13 2.67 M 330.88 294.35 C 390.89 226.19 450.83 155.76 584.77 2.28 M 330.88 294.35 C 404.79 204.26 482.19 115.91 584.77 2.28 M 330.62 300.75 C 386.2 234.27 443.83 166.45 589.76 2.64 M 330.62 300.75 C 426.64 189.29 526.51 74.77 589.76 2.64 M 330.36 307.15 C 422.22 205.48 504.93 107.47 595.4 2.24 M 330.36 307.15 C 417.14 212.89 501.81 115.74 595.4 2.24 M 330.75 312.79 C 413.07 211.7 502.54 111.86 600.39 2.6 M 330.75 312.79 C 392.93 242.27 455.5 170.45 600.39 2.6 M 330.49 319.19 C 389.29 255.36 447.09 187.68 606.03 2.21 M 330.49 319.19 C 411.91 224.47 494.83 130.75 606.03 2.21 M 330.88 324.83 C 438.44 194.58 554.08 65.68 611.02 2.57 M 330.88 324.83 C 416.27 220.25 506.36 117.53 611.02 2.57 M 330.62 331.23 C 433.09 215.05 532.73 101.12 616.66 2.18 M 330.62 331.23 C 396.62 261.64 459.45 187.81 616.66 2.18 M 330.36 337.63 C 433.69 218.23 536.41 96.81 621.65 2.54 M 330.36 337.63 C 395.09 259.28 461.93 182.91 621.65 2.54 M 330.76 343.27 C 391.96 271.58 454.71 198.42 627.29 2.14 M 330.76 343.27 C 434.56 223.93 539.53 103.16 627.29 2.14 M 330.49 349.67 C 435.66 229.51 538.8 109.13 632.28 2.5 M 330.49 349.67 C 444.1 221.42 557.21 90.96 632.28 2.5 M 330.89 355.31 C 433.36 233.31 533.8 113.89 637.92 2.11 M 330.89 355.31 C 434.97 238.96 538.63 121.68 637.92 2.11 M 330.63 361.71 C 409.69 274.55 487.02 187.93 642.91 2.47 M 330.63 361.71 C 426.08 252.47 520.91 143.95 642.91 2.47 M 330.37 368.11 C 425.16 258.96 515.3 155.23 647.9 2.83 M 330.37 368.11 C 419.66 263.44 510.18 158.43 647.9 2.83 M 330.76 373.75 C 398.51 298.99 464.04 221.27 653.54 2.43 M 330.76 373.75 C 455.37 227.49 579.58 82.68 653.54 2.43 M 332.47 377.88 C 436.9 262.4 540.25 142.28 658.53 2.79 M 332.47 377.88 C 433.53 259.85 535.14 144.19 658.53 2.79 M 333.52 382.77 C 429.04 272.24 528 159.62 664.17 2.4 M 333.52 382.77 C 441.03 257.37 550.56 131.07 664.17 2.4 M 334.57 387.66 C 415.26 291.15 500.13 194.86 669.16 2.76 M 334.57 387.66 C 465.82 239.26 595.79 89.44 669.16 2.76 M 335.62 392.55 C 420.28 294.58 506.76 197.07 674.8 2.36 M 335.62 392.55 C 428.31 287.65 519.49 183.09 674.8 2.36 M 336.67 397.44 C 413.72 304.8 492.67 214.48 679.79 2.72 M 336.67 397.44 C 436.53 286.14 532.94 173.58 679.79 2.72 M 339.03 400.82 C 455.19 266.17 575.15 130.94 685.43 2.33 M 339.03 400.82 C 430.12 296.63 520.99 192.53 685.43 2.33 M 341.4 404.19 C 480.41 244.35 619.28 84.45 690.42 2.69 M 341.4 404.19 C 423.19 310.38 504.41 216.17 690.42 2.69 M 343.1 408.33 C 441.93 293.16 543.5 179.16 696.06 2.29 M 343.1 408.33 C 414.61 324.83 488.49 241.97 696.06 2.29 M 346.78 410.2 C 477.19 257.64 611.03 102.12 701.05 2.65 M 346.78 410.2 C 438.6 304.08 531.05 200.21 701.05 2.65 M 350.45 412.07 C 470.9 274.78 592.57 133.16 706.69 2.26 M 350.45 412.07 C 465.75 278.67 578.97 148.59 706.69 2.26 M 353.47 414.69 C 495.26 254.03 631.28 95.72 711.68 2.62 M 353.47 414.69 C 444.25 308.73 536.48 202.63 711.68 2.62 M 357.15 416.56 C 435.49 324.84 516.97 233.13 717.32 2.23 M 357.15 416.56 C 449.19 310.51 541.43 203.29 717.32 2.23 M 360.82 418.43 C 489.83 270.96 615.23 126.43 722.31 2.59 M 360.82 418.43 C 470.93 292.36 583.18 162.16 722.31 2.59 M 365.15 419.55 C 504.32 255.57 642.57 96.24 727.95 2.19 M 365.15 419.55 C 514.03 251.38 658.56 84.9 727.95 2.19 M 370.14 419.91 C 505.57 265.72 641.8 110.63 732.94 2.55 M 370.14 419.91 C 504.53 261.07 643.2 102.88 732.94 2.55 M 374.47 421.02 C 490.53 284.13 610.1 148.26 738.58 2.16 M 374.47 421.02 C 504.48 269.46 635.87 118.52 738.58 2.16 M 380.77 419.87 C 479.73 308.75 580.22 193.3 743.57 2.52 M 380.77 419.87 C 526.86 254.57 672.02 86.45 743.57 2.52 M 385.76 420.23 C 488.07 300.21 592.06 183.2 750.52 0.61 M 385.76 420.23 C 489.3 302.21 591.25 185.09 750.52 0.61 M 391.4 419.84 C 481.19 311.09 575.82 203.56 754.86 1.73 M 391.4 419.84 C 536.9 257.93 679.5 92.65 754.86 1.73 M 396.39 420.2 C 524.42 273.31 651.93 125.92 759.84 2.09 M 396.39 420.2 C 515.02 282.79 634.13 145.88 759.84 2.09 M 402.03 419.8 C 478.63 333.15 556.5 244.42 764.83 2.45 M 402.03 419.8 C 528.38 268.82 656.29 121.17 764.83 2.45 M 407.02 420.16 C 539.89 266.47 671.69 115.75 769.16 3.56 M 407.02 420.16 C 483.92 335.63 559.02 249.61 769.16 3.56 M 412.66 419.77 C 504.26 318.32 592.19 215.69 773.49 4.68 M 412.66 419.77 C 541.09 267.4 673.17 115.58 773.49 4.68 M 417.65 420.13 C 492.76 336.19 565.2 249.91 777.17 6.55 M 417.65 420.13 C 503.77 318.45 593.33 216.72 777.17 6.55 M 422.63 420.49 C 545.03 279.48 666.7 139.81 780.19 9.17 M 422.63 420.49 C 526.59 305.26 626.39 189.21 780.19 9.17 M 428.28 420.09 C 532.95 298.6 638.57 177.49 783.86 11.04 M 428.28 420.09 C 539.18 296.17 648.54 171.64 783.86 11.04 M 433.26 420.45 C 539 305 640.3 190.64 787.54 12.91 M 433.26 420.45 C 519.86 321.34 604.43 223.44 787.54 12.91 M 438.91 420.06 C 544.44 299.53 654.57 173.13 789.9 16.29 M 438.91 420.06 C 532.5 306.93 630.53 195.13 789.9 16.29 M 443.89 420.42 C 568.93 276.74 694.14 129.72 792.26 19.67 M 443.89 420.42 C 567.1 278.93 693.1 134.69 792.26 19.67 M 449.54 420.02 C 537.07 316.03 624.23 214.38 793.97 23.8 M 449.54 420.02 C 578.55 270.51 708.06 120.21 793.97 23.8 M 454.52 420.38 C 540.77 327.21 625 231.03 796.33 27.18 M 454.52 420.38 C 533.03 327.93 613.05 235.15 796.33 27.18 M 460.17 419.99 C 533.26 339.89 604.3 261.04 798.69 30.56 M 460.17 419.99 C 549.11 322.28 635.84 222.54 798.69 30.56 M 465.15 420.35 C 566.36 302.68 670.75 182.12 799.74 35.45 M 465.15 420.35 C 547.59 328.12 629.06 235.15 799.74 35.45 M 470.8 419.95 C 589.21 278.55 708.67 142.51 800.79 40.34 M 470.8 419.95 C 565.16 310.26 661.87 200.78 800.79 40.34 M 475.78 420.31 C 575.96 300.47 679.59 183.52 801.19 45.98 M 475.78 420.31 C 556.24 330.73 636.65 240.54 801.19 45.98 M 481.43 419.92 C 600.72 281.36 723.11 141.6 801.58 51.62 M 481.43 419.92 C 578.63 311.58 672.36 204.75 801.58 51.62 M 486.41 420.28 C 592.51 300.4 694.78 181.11 801.32 58.02 M 486.41 420.28 C 571.92 325 655.47 227.37 801.32 58.02 M 492.06 419.89 C 573.45 331.47 647.99 241.96 801.72 63.66 M 492.06 419.89 C 615.5 275.45 739.3 132.72 801.72 63.66 M 497.04 420.25 C 560.62 350.13 624.63 274.52 801.46 70.06 M 497.04 420.25 C 563.96 340.23 634.76 259.39 801.46 70.06 M 502.69 419.85 C 566.21 344.84 632.13 267.91 801.19 76.46 M 502.69 419.85 C 617.69 289.89 732.13 160.19 801.19 76.46 M 507.67 420.21 C 594.69 315.52 685.58 215.09 801.59 82.1 M 507.67 420.21 C 573.27 344.55 640.74 266.6 801.59 82.1 M 513.32 419.82 C 594.13 326.8 673.21 235.58 801.33 88.5 M 513.32 419.82 C 605.57 311.3 699.7 203.08 801.33 88.5 M 518.3 420.18 C 620.05 296.98 726.58 175.27 801.72 94.14 M 518.3 420.18 C 584.04 342.47 651.44 264.92 801.72 94.14 M 523.95 419.78 C 590.88 342.84 659.9 261.83 801.46 100.54 M 523.95 419.78 C 628.14 300.49 731.91 182.01 801.46 100.54 M 528.93 420.14 C 594.09 342.42 662.26 262.59 801.2 106.94 M 528.93 420.14 C 585.24 349.32 644.95 280.91 801.2 106.94 M 533.92 420.5 C 619.67 320.64 703.22 222.21 801.59 112.58 M 533.92 420.5 C 630.26 308.65 729.14 195.18 801.59 112.58 M 539.56 420.11 C 633.88 313.32 731.07 202.85 801.33 118.98 M 539.56 420.11 C 643.88 299.44 746.09 179.8 801.33 118.98 M 544.55 420.47 C 626.74 326.99 712.61 236.14 801.73 124.62 M 544.55 420.47 C 601.73 354.96 655.16 294.62 801.73 124.62 M 550.19 420.07 C 620.26 341.2 685.14 265.37 801.46 131.02 M 550.19 420.07 C 646.41 307.94 743.21 197.61 801.46 131.02 M 555.18 420.43 C 603.03 358.83 655.37 301.19 801.2 137.42 M 555.18 420.43 C 630.49 331.36 705.29 246.91 801.2 137.42 M 560.82 420.04 C 630.67 341.17 700.08 262.54 801.6 143.06 M 560.82 420.04 C 626.93 343.27 692.14 265.52 801.6 143.06 M 565.81 420.4 C 618.52 366.45 665.39 312.83 801.34 149.46 M 565.81 420.4 C 641.29 337.27 711.89 255.48 801.34 149.46 M 571.45 420 C 625.75 356.18 682.14 292.63 801.73 155.1 M 571.45 420 C 651.32 324.99 734.26 230.31 801.73 155.1 M 576.44 420.36 C 640.5 356.43 699.57 284.1 801.47 161.5 M 576.44 420.36 C 663.01 320.06 749.58 223.63 801.47 161.5 M 582.08 419.97 C 656.29 328.62 737.36 239.38 801.21 167.9 M 582.08 419.97 C 660.15 329.37 738.93 236.32 801.21 167.9 M 587.07 420.33 C 676.01 322.28 756.87 226.42 801.6 173.54 M 587.07 420.33 C 657.35 337.04 730.79 254.82 801.6 173.54 M 592.71 419.94 C 668.61 343.34 738.58 264.31 801.34 179.94 M 592.71 419.94 C 645.07 363.13 695.33 305.53 801.34 179.94 M 597.7 420.3 C 669.16 337.84 738.57 252.77 801.74 185.58 M 597.7 420.3 C 662.09 345.59 729.33 271.43 801.74 185.58 M 603.34 419.9 C 665.28 351.65 722.24 285.26 801.47 191.98 M 603.34 419.9 C 680.53 331.52 758.66 241.96 801.47 191.98 M 608.33 420.26 C 667.27 347.98 730.88 278.75 801.21 198.38 M 608.33 420.26 C 661.22 356.28 714.56 294.61 801.21 198.38 M 613.97 419.87 C 662.12 365.5 704.56 312.4 801.61 204.02 M 613.97 419.87 C 652.47 374.09 694.65 324.16 801.61 204.02 M 618.96 420.23 C 666.88 369.84 709.77 313.03 801.35 210.42 M 618.96 420.23 C 675.28 350.81 731.69 284.96 801.35 210.42 M 624.6 419.83 C 693.6 339.08 768.45 257.39 801.08 216.82 M 624.6 419.83 C 696.12 339.44 763.57 259.73 801.08 216.82 M 629.59 420.19 C 683.32 356.5 739.62 289.63 801.48 222.46 M 629.59 420.19 C 694.84 349.13 755.95 277.85 801.48 222.46 M 635.23 419.8 C 675.32 374.4 710.88 328.19 801.22 228.86 M 635.23 419.8 C 695.22 353.8 755.07 285.07 801.22 228.86 M 640.22 420.16 C 684.87 364.93 727.78 314.26 801.61 234.5 M 640.22 420.16 C 680.66 370.85 723.96 321.23 801.61 234.5 M 645.86 419.76 C 681.95 375.92 721.25 332.17 801.35 240.9 M 645.86 419.76 C 683.44 373.61 720.56 332.38 801.35 240.9 M 650.85 420.12 C 693.87 373.02 734.27 320.91 801.09 247.29 M 650.85 420.12 C 694.58 366.37 736.5 316.82 801.09 247.29 M 655.84 420.48 C 686.2 383.23 714.8 351.31 801.48 252.94 M 655.84 420.48 C 709.25 359.55 762.35 298.47 801.48 252.94 M 661.48 420.09 C 699.3 379.45 731.76 338.6 801.22 259.34 M 661.48 420.09 C 701.55 374.89 739.24 328.13 801.22 259.34 M 666.47 420.45 C 717.15 367.99 759.48 312.65 801.62 264.98 M 666.47 420.45 C 711.49 373.09 751.75 325.75 801.62 264.98 M 672.11 420.05 C 723.29 358.38 776.59 303.86 801.36 271.38 M 672.11 420.05 C 709.22 379.79 743.62 341.65 801.36 271.38 M 677.1 420.41 C 711.17 379.3 749.39 334.13 801.09 277.77 M 677.1 420.41 C 711.36 382.96 741.45 348.23 801.09 277.77 M 682.74 420.02 C 724.94 367.81 773.97 317.11 801.49 283.42 M 682.74 420.02 C 709.2 392.76 733.74 362.94 801.49 283.42 M 687.73 420.38 C 724.36 372.18 766.63 332.15 801.23 289.82 M 687.73 420.38 C 715.91 391.21 746 356.55 801.23 289.82 M 693.37 419.99 C 731.35 375.56 773.12 326.89 801.62 295.46 M 693.37 419.99 C 730.08 376 766.98 334.27 801.62 295.46 M 698.36 420.35 C 726.85 391.51 751.88 358.93 801.36 301.86 M 698.36 420.35 C 728.8 381.94 761.92 346.43 801.36 301.86 M 704 419.95 C 734.1 385.96 758.71 352.51 801.1 308.25 M 704 419.95 C 739.32 380.89 776.19 339.18 801.1 308.25 M 708.99 420.31 C 725.28 398.19 747.22 375.47 801.49 313.9 M 708.99 420.31 C 743.94 381.36 779 342.54 801.49 313.9 M 714.63 419.92 C 739.34 391.94 765.94 361.87 801.23 320.29 M 714.63 419.92 C 737.41 394.17 758.32 368.64 801.23 320.29 M 719.62 420.28 C 740.7 397.62 763.73 371.12 801.63 325.94 M 719.62 420.28 C 742.74 392.2 767.7 364.64 801.63 325.94 M 725.26 419.88 C 743.17 403.57 763.67 384.42 801.37 332.34 M 725.26 419.88 C 747.89 396.75 770.33 370.96 801.37 332.34 M 730.25 420.24 C 746.44 399.53 765.45 381.37 801.1 338.73 M 730.25 420.24 C 751.53 399 766.86 379.1 801.1 338.73 M 735.89 419.85 C 754.99 395.6 772.78 380.36 801.5 344.38 M 735.89 419.85 C 747.95 402.28 760.4 389.02 801.5 344.38 M 740.88 420.21 C 762.54 399.47 781.7 381.34 801.24 350.77 M 740.88 420.21 C 752.35 406.85 766.06 388.84 801.24 350.77 M 746.52 419.81 C 766.07 394.79 786.15 374.78 801.63 356.42 M 746.52 419.81 C 760.5 405.39 774.35 388.62 801.63 356.42 M 750.85 420.93 C 762.08 406.26 778.01 396.27 801.37 362.81 M 750.85 420.93 C 773.82 398.09 792.33 376.78 801.37 362.81 M 757.15 419.78 C 770.89 405.94 776.53 393.12 801.11 369.21 M 757.15 419.78 C 770.36 404.63 783.66 387.85 801.11 369.21 M 762.8 419.38 C 769.88 410.36 778.92 397.34 800.19 376.37 M 762.8 419.38 C 772.89 409.17 776.88 402.6 800.19 376.37 M 769.1 418.23 C 778.23 406.73 780.56 398.99 798.62 384.27 M 769.1 418.23 C 780.71 407.48 789.72 392.86 798.62 384.27 M 774.08 418.59 C 783.41 413.15 792.33 398.26 797.04 392.18 M 774.08 418.59 C 782.37 409.17 788.88 402.99 797.04 392.18" fill="none" stroke="#dae8fc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 380.4 0 M 380.4 0 C 484.48 0.22 590.66 1.36 749.6 0 M 380.4 0 C 487.63 -4.73 594.27 -4.77 749.6 0 M 749.6 0 C 783.78 2.89 800.73 17.95 800 50.4 M 749.6 0 C 781.31 -3.23 802.59 13.31 800 50.4 M 800 50.4 C 806.27 114.04 805.45 183.56 800 369.6 M 800 50.4 C 798.01 120.11 798.88 186.59 800 369.6 M 800 369.6 C 801.66 401.82 785.88 418.08 749.6 420 M 800 369.6 C 803.37 401.94 780.97 417.25 749.6 420 M 749.6 420 C 613.86 413.18 472.31 414.17 380.4 420 M 749.6 420 C 607.64 419.42 464.32 418.63 380.4 420 M 380.4 420 C 346.16 422.87 333 400.67 330 369.6 M 380.4 420 C 344.58 415.84 330.53 402.41 330 369.6 M 330 369.6 C 328.44 296.52 324.84 218.04 330 50.4 M 330 369.6 C 331.5 268.28 330.36 164.87 330 50.4 M 330 50.4 C 332.87 13.54 348.32 -0.26 380.4 0 M 330 50.4 C 331.59 17.03 351.38 1.92 380.4 0" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="360" y="140" width="410" height="160" rx="24" ry="24" fill="none" stroke="none" pointer-events="all"/><path d="M 366 146 C 366 146 366 146 366 146 M 366 146 C 366 146 366 146 366 146 M 363.11 155.42 C 369.6 153.78 373.51 147.95 374.26 142.59 M 363.11 155.42 C 365.27 150.46 370.56 148.34 374.26 142.59 M 360.23 164.84 C 365.82 156.7 374.44 149.52 380.56 141.44 M 360.23 164.84 C 366.03 159.31 370.8 153.08 380.56 141.44 M 360.62 170.48 C 366.27 160.31 376.45 149.67 385.55 141.8 M 360.62 170.48 C 364.78 165 373.81 154.55 385.55 141.8 M 360.36 176.88 C 375.5 160.76 384.45 149.94 391.19 141.41 M 360.36 176.88 C 367.88 167.85 378.32 157.96 391.19 141.41 M 360.75 182.52 C 372 167.44 384.05 152.31 396.18 141.77 M 360.75 182.52 C 373.08 168.24 380.99 156.65 396.18 141.77 M 360.49 188.92 C 370.5 176.58 385.1 159.18 401.82 141.37 M 360.49 188.92 C 369.65 177.88 376.57 168.32 401.82 141.37 M 360.89 194.56 C 375.22 173.91 394.34 156.72 406.81 141.73 M 360.89 194.56 C 368.29 183.72 378.44 173.71 406.81 141.73 M 360.63 200.96 C 378.75 181.26 402.48 150.42 412.45 141.34 M 360.63 200.96 C 376.06 185.55 389.11 165.61 412.45 141.34 M 360.36 207.36 C 379.4 187.31 392.7 169.42 417.44 141.7 M 360.36 207.36 C 379.66 182.66 398.36 160.87 417.44 141.7 M 360.76 213 C 374.14 194.32 386.82 183.03 422.43 142.06 M 360.76 213 C 378.63 190.77 396.72 167.73 422.43 142.06 M 360.5 219.4 C 381.38 195.42 398.04 167.99 428.07 141.66 M 360.5 219.4 C 375.66 204.26 392.1 184.37 428.07 141.66 M 360.89 225.04 C 382.53 203.56 401.71 183.58 433.06 142.02 M 360.89 225.04 C 386.53 193.97 415.66 164.48 433.06 142.02 M 360.63 231.44 C 381.54 199.7 410.28 175.55 438.7 141.63 M 360.63 231.44 C 379.83 210.33 400.27 187.2 438.7 141.63 M 361.03 237.08 C 389.6 208.16 409.34 181.13 443.69 141.99 M 361.03 237.08 C 391.35 205.03 419.3 167.38 443.69 141.99 M 360.76 243.48 C 392.08 211.42 419.79 173.05 449.33 141.59 M 360.76 243.48 C 379.05 222.98 400.74 199.69 449.33 141.59 M 360.5 249.88 C 385.82 225.4 403.28 194.94 454.32 141.95 M 360.5 249.88 C 384.13 221.75 410.3 192.49 454.32 141.95 M 360.9 255.52 C 388.38 221.23 416.62 190.4 459.96 141.56 M 360.9 255.52 C 396.94 214.69 433.81 172.83 459.96 141.56 M 360.64 261.92 C 398.98 211.19 444.53 164.58 464.95 141.92 M 360.64 261.92 C 381.68 235.86 405.4 208.02 464.95 141.92 M 361.03 267.56 C 401.42 215.81 449.2 165.8 470.59 141.52 M 361.03 267.56 C 395.02 231.24 422.35 198.45 470.59 141.52 M 360.77 273.96 C 407.53 227.17 447.81 177.13 475.58 141.88 M 360.77 273.96 C 397.39 229.92 432.54 189.9 475.58 141.88 M 361.16 279.6 C 399.64 239.27 439.77 191.21 480.57 142.24 M 361.16 279.6 C 395.59 233.4 432.96 193.55 480.57 142.24 M 362.87 283.74 C 400.85 234.69 442.25 189.09 486.21 141.85 M 362.87 283.74 C 397.69 243.12 435.49 197.33 486.21 141.85 M 364.58 287.87 C 401.46 241.4 442.84 189.51 491.2 142.21 M 364.58 287.87 C 396.1 252.21 427.26 218.45 491.2 142.21 M 366.28 292 C 415.3 237.36 462.62 183.86 496.84 141.82 M 366.28 292 C 418.9 233.4 470.48 175.12 496.84 141.82 M 367.99 296.14 C 394.23 261.47 420.39 232.34 501.83 142.18 M 367.99 296.14 C 395.7 267.25 423.21 233.65 501.83 142.18 M 371.66 298.01 C 412.98 254.55 448.31 204.73 507.47 141.78 M 371.66 298.01 C 399.32 266.99 425.08 236.93 507.47 141.78 M 375.34 299.88 C 428.2 236.8 483.43 176.99 512.46 142.14 M 375.34 299.88 C 422.14 245.65 472.38 188.26 512.46 142.14 M 380.33 300.24 C 425.83 245.74 474.03 197 518.1 141.75 M 380.33 300.24 C 437.78 237.82 489.18 178.51 518.1 141.75 M 385.97 299.84 C 425.1 250.98 466.19 203.56 523.09 142.11 M 385.97 299.84 C 441.4 240.26 493.72 179.05 523.09 142.11 M 390.96 300.2 C 442.44 245.17 489.57 190.19 528.07 142.47 M 390.96 300.2 C 423.7 259.86 461.48 219.78 528.07 142.47 M 396.6 299.81 C 436.89 252.14 477.38 206.72 533.72 142.07 M 396.6 299.81 C 427.04 266.32 459.56 232.48 533.72 142.07 M 401.59 300.17 C 432.21 264.92 468.92 226.48 538.7 142.43 M 401.59 300.17 C 447.92 242.04 496.92 189.36 538.7 142.43 M 407.23 299.77 C 438.75 267.18 466.04 233.3 544.35 142.04 M 407.23 299.77 C 456.88 248.95 500.7 194.95 544.35 142.04 M 412.22 300.13 C 460.46 242.66 507.05 189.13 549.33 142.4 M 412.22 300.13 C 445.96 264.47 478.24 226.5 549.33 142.4 M 417.2 300.49 C 469.14 242.55 513.29 190.91 554.98 142 M 417.2 300.49 C 446.34 267.6 477.4 230.55 554.98 142 M 422.85 300.1 C 455.26 262.48 487.87 226.64 559.96 142.36 M 422.85 300.1 C 465.61 251.38 507.6 205.38 559.96 142.36 M 427.83 300.46 C 474.74 248.43 519.37 187.54 565.61 141.97 M 427.83 300.46 C 476.02 248.34 517.4 200.16 565.61 141.97 M 433.48 300.06 C 483.54 245.68 529.48 189.75 570.59 142.33 M 433.48 300.06 C 462.6 262.18 496.28 224.08 570.59 142.33 M 438.46 300.42 C 484.39 251.68 521.84 203.85 576.24 141.93 M 438.46 300.42 C 477.61 252.01 518.88 202.9 576.24 141.93 M 444.11 300.03 C 487.4 248.31 537.01 190.16 581.22 142.29 M 444.11 300.03 C 481.34 256.52 516.64 214.16 581.22 142.29 M 449.09 300.39 C 503.32 239.49 555.51 176.86 586.21 142.65 M 449.09 300.39 C 506.82 237.62 558.83 177.25 586.21 142.65 M 454.74 299.99 C 498.52 252.82 538.6 201.16 591.85 142.26 M 454.74 299.99 C 503.14 247.12 548.13 192.97 591.85 142.26 M 459.72 300.35 C 504.4 253.56 547.84 203.7 596.84 142.62 M 459.72 300.35 C 485.41 266.99 516.72 232.61 596.84 142.62 M 464.71 300.71 C 516.33 241.41 565.99 188.39 602.48 142.23 M 464.71 300.71 C 518.86 241.63 570.13 182.72 602.48 142.23 M 470.35 300.32 C 500.97 272.22 528.09 233.65 607.47 142.59 M 470.35 300.32 C 521.97 241.85 568.01 186.34 607.47 142.59 M 475.34 300.68 C 523.96 251.86 564.76 200.04 613.11 142.19 M 475.34 300.68 C 503.03 269.27 531.82 236.39 613.11 142.19 M 480.98 300.28 C 530.63 248.61 577.95 188.11 618.1 142.55 M 480.98 300.28 C 514.18 263.1 548.81 225.09 618.1 142.55 M 485.97 300.65 C 536.42 243.12 582.43 183.77 623.74 142.16 M 485.97 300.65 C 516.53 266.27 545.75 231.83 623.74 142.16 M 491.61 300.25 C 526.84 249.15 572.34 205.85 628.73 142.52 M 491.61 300.25 C 523.27 262.42 554.38 230.18 628.73 142.52 M 496.6 300.61 C 542.69 250.09 591.92 189.96 633.72 142.88 M 496.6 300.61 C 536.67 253.57 575.86 207.33 633.72 142.88 M 502.24 300.22 C 535.34 256.49 580.41 209.37 639.36 142.48 M 502.24 300.22 C 540.02 256.65 579.95 212.23 639.36 142.48 M 507.23 300.58 C 557.9 238.7 613.75 174.65 644.35 142.84 M 507.23 300.58 C 545.68 256.99 585.22 208.55 644.35 142.84 M 512.87 300.18 C 567.35 238.33 623.5 172.3 649.99 142.45 M 512.87 300.18 C 561.86 246.3 610.67 194.21 649.99 142.45 M 517.86 300.54 C 545.05 268.91 574.68 235.98 654.98 142.81 M 517.86 300.54 C 572.48 239.62 625.02 178.19 654.98 142.81 M 522.85 300.9 C 565.73 254.27 607.56 209.64 660.62 142.41 M 522.85 300.9 C 577.3 242.5 627.03 183.41 660.62 142.41 M 528.49 300.51 C 573.53 239.96 625.14 184.85 665.61 142.77 M 528.49 300.51 C 571.81 253.3 614.74 203.17 665.61 142.77 M 533.48 300.87 C 569.6 264.07 602.32 220.57 671.25 142.38 M 533.48 300.87 C 573.55 260.33 611.92 213.61 671.25 142.38 M 539.12 300.47 C 579.91 255.92 610.97 217.55 676.24 142.74 M 539.12 300.47 C 581.5 252.89 622.7 208.25 676.24 142.74 M 544.11 300.83 C 577.63 253.2 617.7 211.2 681.23 143.1 M 544.11 300.83 C 592.01 242.98 644.38 185.02 681.23 143.1 M 549.75 300.44 C 606.04 238.51 656.05 176.11 686.87 142.7 M 549.75 300.44 C 596.59 247.99 644.19 193.42 686.87 142.7 M 554.74 300.8 C 592.83 262.79 626.68 224.23 691.86 143.06 M 554.74 300.8 C 599.3 246.89 643.9 195.4 691.86 143.06 M 560.38 300.4 C 611.72 237.09 671.1 175.92 697.5 142.67 M 560.38 300.4 C 609.38 243.62 662.34 183.62 697.5 142.67 M 565.37 300.76 C 610.37 249.29 656.34 191.26 702.49 143.03 M 565.37 300.76 C 600.75 257.06 637.71 217.88 702.49 143.03 M 570.36 301.12 C 602.44 264.44 626.24 235.76 708.13 142.63 M 570.36 301.12 C 606.97 265.05 641.76 223.39 708.13 142.63 M 576 300.73 C 625.45 238.56 679.13 175.39 713.12 142.99 M 576 300.73 C 604.47 265.84 632.16 233.11 713.12 142.99 M 580.99 301.09 C 614.14 260.2 639.97 229.87 718.76 142.6 M 580.99 301.09 C 630.11 247.15 676.71 191.56 718.76 142.6 M 586.63 300.69 C 637.99 243.06 686 188.43 723.75 142.96 M 586.63 300.69 C 616.17 260.2 649.42 222.21 723.75 142.96 M 591.62 301.05 C 626.23 266.79 650.19 229.46 729.39 142.57 M 591.62 301.05 C 622.23 264.27 655.34 228.47 729.39 142.57 M 597.26 300.66 C 640.77 257.49 674.96 209.41 734.38 142.93 M 597.26 300.66 C 651.21 239.55 701.02 182.61 734.38 142.93 M 602.25 301.02 C 639.75 260.21 678.82 213.44 739.36 143.29 M 602.25 301.02 C 646.6 243.04 695.74 187.74 739.36 143.29 M 607.89 300.63 C 648.05 252.01 686.34 204.52 745.01 142.89 M 607.89 300.63 C 643.89 261.01 677.24 220.73 745.01 142.89 M 612.88 300.99 C 643.41 263.63 673.32 231.86 749.99 143.25 M 612.88 300.99 C 658.38 253.54 702.6 202.56 749.99 143.25 M 617.86 301.35 C 642.77 263.62 674.75 233.16 756.95 141.35 M 617.86 301.35 C 655.34 257.05 692.19 216.66 756.95 141.35 M 623.51 300.95 C 650.61 270.3 682.12 236.88 759.97 143.97 M 623.51 300.95 C 656.72 259.77 693.38 221.45 759.97 143.97 M 628.49 301.31 C 672.66 248.78 718.87 197.19 763.64 145.84 M 628.49 301.31 C 657.36 265.98 689.92 231.45 763.64 145.84 M 634.14 300.92 C 682.77 243.13 739.57 179.83 766.66 148.47 M 634.14 300.92 C 667.09 262.64 705.09 219.15 766.66 148.47 M 639.12 301.28 C 671.59 268.92 705.71 231.78 768.37 152.6 M 639.12 301.28 C 678.19 259.19 718.65 210.91 768.37 152.6 M 644.77 300.88 C 694.64 248.79 739.11 192.77 770.07 156.73 M 644.77 300.88 C 686.34 255.08 725.63 206.21 770.07 156.73 M 649.75 301.24 C 679.95 273.47 707.43 237.11 771.78 160.87 M 649.75 301.24 C 680.42 260.98 717.8 219.7 771.78 160.87 M 655.4 300.85 C 683.4 267.68 705.66 239.76 772.18 166.51 M 655.4 300.85 C 683.85 269.43 708.35 241.44 772.18 166.51 M 660.38 301.21 C 689.53 267.98 715.46 233.03 771.91 172.91 M 660.38 301.21 C 689.68 264.82 725.06 226.82 771.91 172.91 M 666.03 300.81 C 706.23 252.19 740.51 208.95 771.65 179.31 M 666.03 300.81 C 688.71 276.68 710 249.04 771.65 179.31 M 671.01 301.17 C 696.3 274.09 715.83 249.43 772.05 184.95 M 671.01 301.17 C 699.63 265.1 729.28 233.8 772.05 184.95 M 676 301.53 C 708.25 262.26 750.26 227.96 771.79 191.35 M 676 301.53 C 709.8 262.41 740.25 227.19 771.79 191.35 M 681.64 301.14 C 701.09 277.29 718.95 256.69 771.52 197.74 M 681.64 301.14 C 712.27 260.64 747.18 221.12 771.52 197.74 M 686.63 301.5 C 718 270.17 748.76 237.2 771.92 203.39 M 686.63 301.5 C 712.99 269.86 738.6 239.39 771.92 203.39 M 692.27 301.1 C 717.42 270.37 748.2 233.65 771.66 209.78 M 692.27 301.1 C 716.47 271.7 740.83 245.14 771.66 209.78 M 697.26 301.46 C 721.29 276.58 742.51 245.51 771.4 216.18 M 697.26 301.46 C 718.73 278.8 738.69 256 771.4 216.18 M 702.9 301.07 C 723.08 278.5 741.25 261.73 771.79 221.83 M 702.9 301.07 C 723.73 273.24 749.35 247.32 771.79 221.83 M 707.89 301.43 C 731.3 277.52 750.72 254.62 771.53 228.22 M 707.89 301.43 C 722.67 286.95 736.6 271.92 771.53 228.22 M 713.53 301.04 C 728.74 283.85 746.6 262.81 771.27 234.62 M 713.53 301.04 C 734.97 275.74 755.61 251.34 771.27 234.62 M 718.52 301.4 C 730.66 290.63 741.61 278.49 771.66 240.26 M 718.52 301.4 C 736.56 282.61 756.66 263.04 771.66 240.26 M 723.51 301.76 C 740.55 282.25 761.06 262.16 771.4 246.66 M 723.51 301.76 C 735.72 289.99 747.78 272.08 771.4 246.66 M 729.15 301.36 C 742.73 285.3 753.41 273.48 771.14 253.06 M 729.15 301.36 C 739.74 287.08 752 273.55 771.14 253.06 M 734.14 301.72 C 742.81 287.11 755.91 277.56 771.53 258.7 M 734.14 301.72 C 745.93 290.93 756.91 277.01 771.53 258.7 M 739.78 301.33 C 753.47 284.71 763.66 270.01 771.27 265.1 M 739.78 301.33 C 750.16 290.19 762.39 275.16 771.27 265.1 M 746.08 300.18 C 756.29 291.01 763.42 275.67 771.01 271.5 M 746.08 300.18 C 752.84 291.75 756.61 284.12 771.01 271.5 M 753.04 298.27 C 760.7 295.98 760.11 290.24 770.75 277.9 M 753.04 298.27 C 758.86 290.74 760.38 288.39 770.75 277.9 M 759.34 297.12 C 764.03 296.19 764.37 292.69 768.52 286.56 M 759.34 297.12 C 761.39 295.78 764.45 293.17 768.52 286.56" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 384 140 M 384 140 C 457.85 138.51 532.79 135.56 746 140 M 384 140 C 518.37 144.42 650.38 144.42 746 140 M 746 140 C 759.22 142.51 767.24 146.78 770 164 M 746 140 C 760.79 142.74 767.12 151.49 770 164 M 770 164 C 772.18 203.96 768.74 241.38 770 276 M 770 164 C 771.69 204.88 770.21 247.49 770 276 M 770 276 C 773.28 288.24 760.08 299.23 746 300 M 770 276 C 767.99 293.05 758.29 304.44 746 300 M 746 300 C 654.18 299.38 561.83 301.21 384 300 M 746 300 C 657.72 302.42 571.61 302.6 384 300 M 384 300 C 371.85 302.68 362.42 294.66 360 276 M 384 300 C 372.02 303.24 359.7 290.51 360 276 M 360 276 C 358.82 248.61 357.27 228.62 360 164 M 360 276 C 359.55 237.13 356.91 197.62 360 164 M 360 164 C 358.51 148.09 364.83 141.54 384 140 M 360 164 C 356.37 148.16 364.32 140.64 384 140" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="360" y="670" width="410" height="170" rx="25.5" ry="25.5" fill="none" stroke="none" pointer-events="all"/><path d="M 366.39 676.35 C 366.39 676.35 366.39 676.35 366.39 676.35 M 366.39 676.35 C 366.39 676.35 366.39 676.35 366.39 676.35 M 363.51 685.77 C 371.32 683.9 371.62 677.19 375.32 672.18 M 363.51 685.77 C 368.56 680.08 371.46 676.23 375.32 672.18 M 359.97 695.94 C 366.74 691.27 374.5 679.27 380.96 671.79 M 359.97 695.94 C 365.4 687.22 371.84 681.03 380.96 671.79 M 360.36 701.58 C 367.24 693.15 373.75 683.94 386.6 671.4 M 360.36 701.58 C 368.23 692.7 374.61 684.37 386.6 671.4 M 360.1 707.98 C 370.02 703.2 377.87 691.52 392.25 671 M 360.1 707.98 C 368.32 699.62 376.16 691.74 392.25 671 M 360.49 713.62 C 375.49 700.96 380.46 690.34 397.23 671.36 M 360.49 713.62 C 373.78 699.74 383.54 688.89 397.23 671.36 M 360.23 720.02 C 371.07 704.99 386.2 697.04 402.88 670.97 M 360.23 720.02 C 373.1 702.47 389.38 685.82 402.88 670.97 M 359.97 726.42 C 380.02 710.36 393.2 685.35 407.86 671.33 M 359.97 726.42 C 370.54 712.19 383.77 699.18 407.86 671.33 M 360.37 732.06 C 370.95 716.44 385.24 704.71 413.51 670.93 M 360.37 732.06 C 372.86 714.45 390.17 699.89 413.51 670.93 M 360.1 738.46 C 382.65 709.42 407.46 685.29 418.49 671.29 M 360.1 738.46 C 378.75 717.66 398.16 695.77 418.49 671.29 M 360.5 744.1 C 372.1 732.39 392 715.08 424.14 670.9 M 360.5 744.1 C 381.79 717.25 408.45 691.08 424.14 670.9 M 360.24 750.5 C 382.71 720.99 409.73 690.98 429.12 671.26 M 360.24 750.5 C 380.25 728.86 396.26 707.54 429.12 671.26 M 360.63 756.15 C 378.22 738.09 399.18 713.54 434.77 670.86 M 360.63 756.15 C 376.51 739.3 391.15 718.69 434.77 670.86 M 360.37 762.54 C 381.85 739.21 406.39 713.27 439.75 671.22 M 360.37 762.54 C 383.79 733.07 413.78 701.68 439.75 671.22 M 360.11 768.94 C 386.77 739.48 417.65 705.03 445.4 670.83 M 360.11 768.94 C 385.61 739.88 413.72 707.48 445.4 670.83 M 360.5 774.58 C 384.39 746.47 408.39 715.26 450.38 671.19 M 360.5 774.58 C 398.67 735.71 431.14 695.29 450.38 671.19 M 360.24 780.98 C 392.94 744.92 424.18 706.64 456.03 670.79 M 360.24 780.98 C 383.89 750.85 408.76 725.96 456.03 670.79 M 360.64 786.62 C 386.72 750.74 413.29 725.81 461.01 671.15 M 360.64 786.62 C 389.97 752.34 419.08 718.16 461.01 671.15 M 360.38 793.02 C 386.19 761.92 420.86 726.98 466 671.51 M 360.38 793.02 C 387.97 761.05 415.79 730.18 466 671.51 M 360.77 798.67 C 401 755.03 436.86 716.11 471.64 671.12 M 360.77 798.67 C 393.43 766.13 421.07 732.19 471.64 671.12 M 360.51 805.06 C 400.08 761.35 439.81 715.64 476.63 671.48 M 360.51 805.06 C 396.9 762.26 433.18 718.61 476.63 671.48 M 360.25 811.46 C 400.03 768.21 434.41 736.13 482.27 671.09 M 360.25 811.46 C 398.99 771 432.39 726.91 482.27 671.09 M 360.64 817.1 C 394.02 780.16 424.43 735.68 487.26 671.45 M 360.64 817.1 C 393.41 779.83 419.67 749.22 487.26 671.45 M 361.69 821.99 C 408.79 766.38 449.96 720.46 492.9 671.05 M 361.69 821.99 C 387.19 786.33 416.07 756.46 492.9 671.05 M 363.4 826.13 C 392.03 795.23 421.43 759.94 497.89 671.41 M 363.4 826.13 C 405.8 776.41 448.27 727.65 497.89 671.41 M 365.76 829.51 C 400.43 783.52 442.55 741.75 503.53 671.02 M 365.76 829.51 C 419.25 768.68 472.5 704.69 503.53 671.02 M 366.81 834.39 C 418.56 770.11 474.66 707.66 508.52 671.38 M 366.81 834.39 C 394.55 802.44 423.24 769.99 508.52 671.38 M 370.49 836.26 C 402.48 802.58 431.7 764.34 514.16 670.98 M 370.49 836.26 C 423.19 777.4 476.33 713.66 514.16 670.98 M 374.16 838.13 C 422.8 784.44 460.88 733.1 519.15 671.34 M 374.16 838.13 C 422.04 782.32 471.94 727.04 519.15 671.34 M 377.18 840.76 C 418.65 793.01 464.5 744.13 524.79 670.95 M 377.18 840.76 C 426.37 783.76 478.46 725.51 524.79 670.95 M 381.51 841.87 C 424.88 790.83 474.1 739.29 529.78 671.31 M 381.51 841.87 C 425.06 788.78 467.95 738.2 529.78 671.31 M 387.16 841.48 C 437.41 783.49 485.77 719.15 535.43 670.91 M 387.16 841.48 C 415.34 807.53 444.59 773.38 535.43 670.91 M 392.8 841.08 C 427.56 799.95 454.38 766.52 540.41 671.27 M 392.8 841.08 C 442.34 784.59 490.84 728.32 540.41 671.27 M 397.79 841.44 C 432.05 802.87 458.15 771.16 546.06 670.88 M 397.79 841.44 C 440.51 791.75 485.15 741.21 546.06 670.88 M 402.77 841.8 C 452.9 780.11 504.26 720.8 551.04 671.24 M 402.77 841.8 C 459.27 773.68 515.33 704.12 551.04 671.24 M 408.42 841.41 C 452.64 787.63 501.2 735.1 556.69 670.84 M 408.42 841.41 C 453.63 790.85 500.91 735.43 556.69 670.84 M 413.4 841.77 C 444.37 797.95 485.49 757.88 561.67 671.2 M 413.4 841.77 C 454.63 791.29 498.57 745.01 561.67 671.2 M 419.05 841.37 C 474.23 777.03 527.49 715.38 567.32 670.81 M 419.05 841.37 C 468.4 782.3 519.92 721.88 567.32 670.81 M 424.03 841.73 C 473.06 788.12 519.78 729.2 572.3 671.17 M 424.03 841.73 C 469.9 785.48 517.69 733.87 572.3 671.17 M 429.68 841.34 C 476.68 779.48 530.38 719.59 577.95 670.77 M 429.68 841.34 C 468.67 794.94 506.72 749.44 577.95 670.77 M 434.66 841.7 C 479.64 789.18 520.26 739.53 582.93 671.13 M 434.66 841.7 C 472.9 796.92 514.9 746.38 582.93 671.13 M 440.31 841.3 C 488.59 784.26 538.62 725.35 587.92 671.49 M 440.31 841.3 C 487.96 783.03 533.99 728.83 587.92 671.49 M 445.29 841.66 C 489.85 794.12 530.17 744.64 593.56 671.1 M 445.29 841.66 C 477.94 799.19 515.94 758.05 593.56 671.1 M 450.94 841.27 C 482.04 803.42 507.55 768.73 598.55 671.46 M 450.94 841.27 C 509.11 778.89 564.45 713.82 598.55 671.46 M 455.92 841.63 C 507.02 786.16 553.84 730.62 604.19 671.07 M 455.92 841.63 C 515.21 777.15 569.76 715.6 604.19 671.07 M 461.57 841.24 C 514.75 778.07 564.43 723 609.18 671.43 M 461.57 841.24 C 497.87 798.48 532.36 760.48 609.18 671.43 M 466.55 841.6 C 510.04 784.75 554.65 732.39 614.82 671.03 M 466.55 841.6 C 511.52 788.48 557.53 735.04 614.82 671.03 M 472.2 841.2 C 501.69 806.66 531.01 770.14 619.81 671.39 M 472.2 841.2 C 515.74 790.08 562.75 735.46 619.81 671.39 M 477.18 841.56 C 534.24 780.83 588.41 714.51 625.45 671 M 477.18 841.56 C 528.73 775.83 584.92 716.07 625.45 671 M 482.83 841.17 C 526.88 788.31 566.72 739.5 630.44 671.36 M 482.83 841.17 C 542.34 775 602.78 705.29 630.44 671.36 M 487.81 841.53 C 536.48 782.85 586.28 726.37 636.08 670.96 M 487.81 841.53 C 544.92 780.26 599.07 719.05 636.08 670.96 M 493.46 841.13 C 547.16 776.54 604.68 711.86 641.07 671.32 M 493.46 841.13 C 536.2 791.98 574.43 744.56 641.07 671.32 M 498.44 841.49 C 540.72 791.11 582.48 746.74 646.71 670.93 M 498.44 841.49 C 531.04 806.42 564.5 772.39 646.71 670.93 M 504.09 841.1 C 542.9 792.08 588.19 738.02 651.7 671.29 M 504.09 841.1 C 554.85 789.86 600.45 733.58 651.7 671.29 M 509.07 841.46 C 566.48 777.53 619.96 718.24 657.34 670.89 M 509.07 841.46 C 547.88 796.88 585.13 751.19 657.34 670.89 M 514.06 841.82 C 567.26 779.32 618.5 726.62 662.33 671.25 M 514.06 841.82 C 552.53 798.14 590.69 756.56 662.33 671.25 M 519.7 841.42 C 579.17 777.46 634.56 707.43 667.97 670.86 M 519.7 841.42 C 551.49 807.9 579.73 774.93 667.97 670.86 M 524.69 841.78 C 571.6 782.8 619.88 730.14 672.96 671.22 M 524.69 841.78 C 558.89 802.46 591.77 763.41 672.96 671.22 M 530.33 841.39 C 563.15 799.41 601.05 759.91 678.6 670.82 M 530.33 841.39 C 582.75 777.47 637.92 712.62 678.6 670.82 M 535.32 841.75 C 569.25 803.89 607.17 766.75 683.59 671.18 M 535.32 841.75 C 585.96 783.39 636.18 726.64 683.59 671.18 M 540.96 841.35 C 583.01 801.23 619.51 753.56 689.23 670.79 M 540.96 841.35 C 572.09 808.32 601.46 773.06 689.23 670.79 M 545.95 841.71 C 580.09 802.2 608.92 767.69 694.22 671.15 M 545.95 841.71 C 587.71 792.87 634.8 742.42 694.22 671.15 M 551.59 841.32 C 588.2 797.66 619.46 758.98 699.21 671.51 M 551.59 841.32 C 579.26 808.38 610.57 770.02 699.21 671.51 M 556.58 841.68 C 611.83 774.36 674.14 703.68 704.85 671.12 M 556.58 841.68 C 615.17 775.72 673.63 708.65 704.85 671.12 M 562.22 841.29 C 607.38 786.35 652.93 739.34 709.84 671.48 M 562.22 841.29 C 593.89 807.28 624.58 772.55 709.84 671.48 M 567.21 841.65 C 609.41 798.51 643.62 752.23 715.48 671.08 M 567.21 841.65 C 608.23 794.54 651.7 744.35 715.48 671.08 M 572.85 841.25 C 624.12 782.87 675.61 729.93 720.47 671.44 M 572.85 841.25 C 613.61 796.99 654.2 752.07 720.47 671.44 M 577.84 841.61 C 617.82 802.24 652.74 765.38 726.11 671.05 M 577.84 841.61 C 618.55 796.31 654.45 754.9 726.11 671.05 M 583.48 841.22 C 644.75 774.26 699.83 715.97 731.1 671.41 M 583.48 841.22 C 637.51 778.88 692.94 717.47 731.1 671.41 M 588.47 841.58 C 641.05 782.88 693.83 714.96 736.74 671.01 M 588.47 841.58 C 629.85 792.94 675.96 742.31 736.74 671.01 M 594.11 841.18 C 640.62 793.8 679.67 741.36 741.73 671.37 M 594.11 841.18 C 646.15 782.68 697.02 723.88 741.73 671.37 M 599.1 841.54 C 634.11 808.89 662.76 769.62 746.71 671.73 M 599.1 841.54 C 636.35 796.88 673.27 754.63 746.71 671.73 M 604.74 841.15 C 638 804.19 673.38 765.6 751.05 672.85 M 604.74 841.15 C 660.43 776.84 716.48 715.78 751.05 672.85 M 609.73 841.51 C 660.01 784.63 710.21 724.48 756.69 672.45 M 609.73 841.51 C 662.77 784.76 709.98 726.27 756.69 672.45 M 615.37 841.11 C 670.65 776.82 725.65 721.49 760.36 674.32 M 615.37 841.11 C 649.77 800.82 685.72 758.94 760.36 674.32 M 620.36 841.47 C 650.63 803.34 685.01 764.19 764.04 676.19 M 620.36 841.47 C 668.8 786.93 717.19 732.58 764.04 676.19 M 625.35 841.83 C 681.74 775.44 734.91 715.41 765.75 680.32 M 625.35 841.83 C 664.7 793.26 708.28 747.59 765.75 680.32 M 630.99 841.44 C 682.51 785.26 738.68 721.14 767.45 684.46 M 630.99 841.44 C 662.58 812.13 691.26 778.52 767.45 684.46 M 635.98 841.8 C 666.39 807.13 704.83 765.13 769.16 688.59 M 635.98 841.8 C 675.68 796.32 714.64 748.61 769.16 688.59 M 641.62 841.4 C 671.2 805.17 707.68 765.09 772.18 691.22 M 641.62 841.4 C 687.53 791.07 729.08 741.82 772.18 691.22 M 646.61 841.76 C 687.6 793.06 730.66 749.32 771.92 697.61 M 646.61 841.76 C 689.49 794.86 728.21 747.3 771.92 697.61 M 652.25 841.37 C 680.92 817.81 701.7 786.11 771.65 704.01 M 652.25 841.37 C 682.38 803.71 712.14 771.04 771.65 704.01 M 657.24 841.73 C 689.61 806.19 719.25 773.83 772.05 709.66 M 657.24 841.73 C 698.06 793.08 739.79 748.98 772.05 709.66 M 662.88 841.33 C 689.76 810.99 714.86 777.63 771.79 716.05 M 662.88 841.33 C 693.8 804.15 726.57 767.7 771.79 716.05 M 667.87 841.69 C 698.19 810.93 720.62 781.26 771.53 722.45 M 667.87 841.69 C 691.17 816.67 714.43 791.52 771.53 722.45 M 673.51 841.3 C 705.59 802.63 737.96 772.95 771.26 728.85 M 673.51 841.3 C 709.41 802.89 744.77 760.89 771.26 728.85 M 678.5 841.66 C 700.92 817.19 723.69 785.3 771.66 734.49 M 678.5 841.66 C 702.08 813.68 722.25 786.16 771.66 734.49 M 684.14 841.27 C 713.57 810.28 735.36 776.71 771.4 740.89 M 684.14 841.27 C 713.59 806.21 745.16 769.81 771.4 740.89 M 689.13 841.63 C 713.57 808.33 746.34 779.53 771.14 747.29 M 689.13 841.63 C 710.96 816.33 732.92 792.3 771.14 747.29 M 694.77 841.23 C 717.52 814.81 742.27 790.29 771.53 752.93 M 694.77 841.23 C 723.82 809.13 751.14 779.83 771.53 752.93 M 699.76 841.59 C 731.91 810.52 754.86 777.69 771.27 759.33 M 699.76 841.59 C 725.45 809.86 750.61 778.97 771.27 759.33 M 705.4 841.2 C 724.06 815.13 747.37 787.16 771.01 765.73 M 705.4 841.2 C 721.56 822.39 734.39 806.35 771.01 765.73 M 710.39 841.56 C 729.54 823.32 747.72 801.45 771.4 771.37 M 710.39 841.56 C 730.33 815.84 750.68 793.03 771.4 771.37 M 716.03 841.16 C 740.5 812.87 757.21 790.81 771.14 777.77 M 716.03 841.16 C 729.63 824.69 741.53 811.03 771.14 777.77 M 721.02 841.52 C 732.74 830.3 740.16 815.48 770.88 784.16 M 721.02 841.52 C 733.67 827.22 741.33 815.7 770.88 784.16 M 726.66 841.13 C 736.22 826.06 749.26 809.97 771.27 789.81 M 726.66 841.13 C 737.04 831.9 745.58 821 771.27 789.81 M 731.65 841.49 C 744.23 825.32 760.02 809.09 771.01 796.21 M 731.65 841.49 C 739.46 832.08 749.64 824.19 771.01 796.21 M 737.29 841.09 C 747.9 828.63 753.34 819.77 770.75 802.6 M 737.29 841.09 C 747.65 828.21 760.49 814.57 770.75 802.6 M 742.28 841.45 C 749 830.62 760.16 820.3 771.15 808.25 M 742.28 841.45 C 749.76 832.19 760.46 819.25 771.15 808.25 M 747.27 841.81 C 757.35 836.33 764.88 828.32 770.88 814.64 M 747.27 841.81 C 752.96 833.98 759.03 826.47 770.88 814.64 M 753.57 840.66 C 758.44 832.66 761.14 829.71 770.62 821.04 M 753.57 840.66 C 758.28 835.54 760.83 830.41 770.62 821.04" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 385.5 670 M 385.5 670 C 481.74 671.97 574.93 676.84 744.5 670 M 385.5 670 C 520.97 672.47 652.77 672.53 744.5 670 M 744.5 670 C 763.23 673.33 769.6 679.76 770 695.5 M 744.5 670 C 762.9 669.44 766.04 675.36 770 695.5 M 770 695.5 C 766.14 720.69 769.72 750.99 770 814.5 M 770 695.5 C 768.27 738.77 768.22 777.83 770 814.5 M 770 814.5 C 773.15 831.45 765.06 840.87 744.5 840 M 770 814.5 C 771.08 827.82 756.96 844.55 744.5 840 M 744.5 840 C 625.99 843.58 506.32 846.35 385.5 840 M 744.5 840 C 615.27 844.43 484.9 843.99 385.5 840 M 385.5 840 C 368.86 842.46 362.13 834.87 360 814.5 M 385.5 840 C 369.27 842.26 355.77 830.13 360 814.5 M 360 814.5 C 361.54 779.25 363.82 748.49 360 695.5 M 360 814.5 C 362.58 774.8 360.54 732.15 360 695.5 M 360 695.5 C 359.11 677.73 367.41 666.1 385.5 670 M 360 695.5 C 357.87 679.81 370.17 668.22 385.5 670" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="390" y="690" width="350" height="120" rx="18" ry="18" fill="none" stroke="none" pointer-events="all"/><path d="M 394.67 694.31 C 394.67 694.31 394.67 694.31 394.67 694.31 M 394.67 694.31 C 394.67 694.31 394.67 694.31 394.67 694.31 M 391.13 704.48 C 390.87 699.47 396.32 696.36 402.28 691.65 M 391.13 704.48 C 394.91 699.71 398.96 694.25 402.28 691.65 M 392.18 709.37 C 398.47 707.47 402.73 697.76 408.58 690.5 M 392.18 709.37 C 393.59 705.45 398.69 703.31 408.58 690.5 M 391.92 715.76 C 397.03 710.53 401.94 709.13 413.57 690.86 M 391.92 715.76 C 399.52 706.29 404.41 699.93 413.57 690.86 M 391.65 722.16 C 399.48 714.17 403.51 703.61 419.21 690.46 M 391.65 722.16 C 403.17 708.18 415.29 698.37 419.21 690.46 M 392.05 727.8 C 397.7 720.97 403.8 713.01 424.2 690.82 M 392.05 727.8 C 403.3 713.63 417.31 701.23 424.2 690.82 M 391.79 734.2 C 405.81 716.13 421.47 696.9 429.84 690.43 M 391.79 734.2 C 400.9 724.19 409.9 712.32 429.84 690.43 M 392.18 739.85 C 404.58 726.61 418.57 704.12 434.83 690.79 M 392.18 739.85 C 401.42 727.32 412.74 714.36 434.83 690.79 M 391.92 746.24 C 406.42 726.88 424.27 710.99 440.47 690.39 M 391.92 746.24 C 411.37 724.21 432.33 700.87 440.47 690.39 M 392.32 751.89 C 410.54 733.26 434.06 706.9 445.46 690.75 M 392.32 751.89 C 409.09 731.38 426.7 709.9 445.46 690.75 M 392.05 758.28 C 408.32 743.18 421.68 728.62 451.1 690.36 M 392.05 758.28 C 409.05 735.37 426.11 715.16 451.1 690.36 M 391.79 764.68 C 416.51 739.3 437.09 706.96 456.09 690.72 M 391.79 764.68 C 405.72 745.48 420.57 729.72 456.09 690.72 M 392.19 770.32 C 408.28 752.62 423.36 736.25 461.73 690.33 M 392.19 770.32 C 412.04 745.94 432.93 722.93 461.73 690.33 M 391.93 776.72 C 409.92 760.73 430.12 735.48 466.72 690.69 M 391.93 776.72 C 407.79 758.12 424.99 739.88 466.72 690.69 M 392.32 782.37 C 408.44 762.88 431.2 738.95 471.7 691.05 M 392.32 782.37 C 416.31 756.65 439.71 728.37 471.7 691.05 M 392.06 788.76 C 410.06 762.76 435.77 740.83 477.35 690.65 M 392.06 788.76 C 420.43 758.79 446.12 728.99 477.35 690.65 M 390.49 796.67 C 418.05 763.09 442.77 734.65 482.33 691.01 M 390.49 796.67 C 415.96 766.67 442.07 734.26 482.33 691.01 M 392.19 800.8 C 420.32 768.4 447.19 737.42 487.98 690.62 M 392.19 800.8 C 416.65 770.49 444.07 741.91 487.98 690.62 M 394.55 804.18 C 430.26 761.23 464.17 723.92 492.96 690.98 M 394.55 804.18 C 420.32 775.84 443.76 748.55 492.96 690.98 M 396.92 807.56 C 423.44 773.49 452.59 746.63 498.61 690.58 M 396.92 807.56 C 418.61 778.85 447.1 750.14 498.61 690.58 M 400.59 809.43 C 442.62 765.47 482.46 714.33 503.59 690.94 M 400.59 809.43 C 429.73 776.46 458.12 746.51 503.59 690.94 M 406.24 809.04 C 446.91 766.18 488.06 718.34 509.24 690.55 M 406.24 809.04 C 451.07 761.77 489.31 712.87 509.24 690.55 M 411.22 809.4 C 436.17 778.8 459.1 752.51 514.22 690.91 M 411.22 809.4 C 448.61 768.38 484.96 725.79 514.22 690.91 M 416.21 809.76 C 442.62 770.64 478.37 737.33 519.87 690.51 M 416.21 809.76 C 449.29 766.33 487.86 722.54 519.87 690.51 M 421.85 809.36 C 459.13 766.51 493.13 727.04 524.85 690.87 M 421.85 809.36 C 450.92 779.59 477.65 744 524.85 690.87 M 426.84 809.72 C 456.24 779.46 481.84 753.27 529.84 691.23 M 426.84 809.72 C 461.6 767.73 498.61 724.46 529.84 691.23 M 432.48 809.33 C 465.72 769.77 503.18 733.11 535.48 690.84 M 432.48 809.33 C 463.07 772.62 497.88 733.38 535.48 690.84 M 437.47 809.69 C 470.33 767.05 505.75 726.74 540.47 691.2 M 437.47 809.69 C 471.09 773.75 501.65 740.59 540.47 691.2 M 443.11 809.29 C 474.99 778.74 503.56 745.68 546.11 690.8 M 443.11 809.29 C 478.2 767.43 516.12 728.71 546.11 690.8 M 448.1 809.65 C 469.83 778.17 497.13 750.96 551.1 691.16 M 448.1 809.65 C 477.63 774.88 511.04 738.93 551.1 691.16 M 453.74 809.26 C 475.42 783.86 499.59 750.14 556.74 690.77 M 453.74 809.26 C 483 782 508.22 748.92 556.74 690.77 M 458.73 809.62 C 495.79 772.26 528.99 736.81 561.73 691.13 M 458.73 809.62 C 493.5 771.03 526.4 734.23 561.73 691.13 M 464.37 809.22 C 503.17 768.3 533.88 726.76 567.37 690.74 M 464.37 809.22 C 486.17 784.15 503.89 760.81 567.37 690.74 M 469.36 809.58 C 496.22 782.52 514.82 754 572.36 691.1 M 469.36 809.58 C 505.15 772.06 539.09 729.13 572.36 691.1 M 474.35 809.95 C 501.2 779.67 528.24 745.79 577.35 691.46 M 474.35 809.95 C 510.81 764.86 551.07 720.45 577.35 691.46 M 479.99 809.55 C 517.98 769.88 560.69 719.21 582.99 691.06 M 479.99 809.55 C 518.33 765.56 557.32 721.92 582.99 691.06 M 484.98 809.91 C 522.42 764.85 557.87 723.81 587.98 691.42 M 484.98 809.91 C 524.09 765.58 563.23 723.25 587.98 691.42 M 490.62 809.52 C 516.83 775.78 546.44 746.4 593.62 691.03 M 490.62 809.52 C 519.34 776.89 550.76 742.3 593.62 691.03 M 495.61 809.88 C 528.36 768.36 566.39 724.27 598.61 691.39 M 495.61 809.88 C 522.72 776.57 552.41 744.09 598.61 691.39 M 501.25 809.48 C 531.22 774.05 564.95 737.44 604.25 690.99 M 501.25 809.48 C 537.52 765.89 574.87 720.96 604.25 690.99 M 506.24 809.84 C 546.37 767.17 586.01 721.83 609.24 691.35 M 506.24 809.84 C 542.08 773.74 573.14 733.59 609.24 691.35 M 511.88 809.45 C 535.33 775.47 562.31 748.22 614.88 690.96 M 511.88 809.45 C 546.25 765.43 584.9 722.66 614.88 690.96 M 516.87 809.81 C 542.97 777.95 568.57 748.41 619.87 691.32 M 516.87 809.81 C 544.57 773.69 573.03 740.24 619.87 691.32 M 522.51 809.41 C 559.35 766.48 589.74 729.22 625.51 690.92 M 522.51 809.41 C 564.51 763.09 604.43 717.39 625.51 690.92 M 527.5 809.77 C 562.44 766.9 595.06 732.47 630.5 691.28 M 527.5 809.77 C 552.65 779.96 576.21 749.84 630.5 691.28 M 532.48 810.13 C 573.13 767.61 608.25 726.37 635.49 691.64 M 532.48 810.13 C 559.25 776.08 589.36 738.09 635.49 691.64 M 538.13 809.74 C 563.04 783.39 583.65 758.64 641.13 691.25 M 538.13 809.74 C 565.76 777.5 595.02 747.37 641.13 691.25 M 543.11 810.1 C 568.08 787.98 584.27 764.54 646.12 691.61 M 543.11 810.1 C 571.93 778.4 600.84 745.02 646.12 691.61 M 548.76 809.7 C 586.87 762.4 624.39 720.48 651.76 691.21 M 548.76 809.7 C 577.81 773.01 611.46 737.35 651.76 691.21 M 553.74 810.06 C 580.18 781.94 609.95 748.68 656.75 691.57 M 553.74 810.06 C 595.6 767.61 636.53 719.64 656.75 691.57 M 559.39 809.67 C 599.8 762.33 638.26 723.92 662.39 691.18 M 559.39 809.67 C 584.8 779.29 612.93 748.18 662.39 691.18 M 564.37 810.03 C 586.51 780.71 612.04 753.73 667.38 691.54 M 564.37 810.03 C 603.57 765.76 638.74 725.22 667.38 691.54 M 570.02 809.63 C 599.06 774.59 632.46 738.63 673.02 691.15 M 570.02 809.63 C 592.32 782.75 612.24 759.92 673.02 691.15 M 575 809.99 C 616.93 766.73 651.18 716.76 678.01 691.51 M 575 809.99 C 605.99 773.84 637.3 738.49 678.01 691.51 M 580.65 809.6 C 600.81 782.84 622.69 760.72 683.65 691.11 M 580.65 809.6 C 605.76 776.31 637.81 741.24 683.65 691.11 M 585.63 809.96 C 613.02 779.71 633.22 757.17 688.64 691.47 M 585.63 809.96 C 622.87 766.44 661.46 719.69 688.64 691.47 M 590.62 810.32 C 631.29 764.57 668.96 718.55 693.62 691.83 M 590.62 810.32 C 614.02 786.68 635.66 763.78 693.62 691.83 M 596.26 809.93 C 620.09 783.28 650.08 749.83 699.27 691.44 M 596.26 809.93 C 635.59 763.62 678.22 719.91 699.27 691.44 M 601.25 810.29 C 637.76 766.04 667.53 730.21 704.25 691.8 M 601.25 810.29 C 626.03 784.86 648.82 758.13 704.25 691.8 M 606.9 809.89 C 630.12 778.24 657.86 747.84 709.9 691.4 M 606.9 809.89 C 650.53 763.38 689.67 718.35 709.9 691.4 M 611.88 810.25 C 647.57 769.65 682.7 725.27 714.88 691.76 M 611.88 810.25 C 641.51 773.56 673.82 736.07 714.88 691.76 M 617.53 809.86 C 643.57 772.77 673.61 738.28 720.53 691.37 M 617.53 809.86 C 638.56 781.82 663.35 753.97 720.53 691.37 M 622.51 810.22 C 656.94 764.68 696.1 721.73 725.51 691.73 M 622.51 810.22 C 660.06 764.85 702.25 716.52 725.51 691.73 M 628.16 809.82 C 669.12 761.27 709.69 716.77 730.5 692.09 M 628.16 809.82 C 651.66 785.34 678.52 754.71 730.5 692.09 M 633.14 810.18 C 667.63 773.68 699.85 733.75 734.18 693.96 M 633.14 810.18 C 662.42 776.95 689.58 742.97 734.18 693.96 M 638.13 810.54 C 666.16 781.03 687.83 751.53 737.19 696.58 M 638.13 810.54 C 669.51 775.32 701.79 737.59 737.19 696.58 M 643.77 810.15 C 680.65 764.41 719.25 723.47 739.56 699.96 M 643.77 810.15 C 679.28 767.39 717.63 725.58 739.56 699.96 M 648.76 810.51 C 684.05 768.45 719.9 730.88 740.61 704.85 M 648.76 810.51 C 674.23 779.44 700.27 750.24 740.61 704.85 M 654.4 810.11 C 687.69 774.05 712.54 737.87 741 710.49 M 654.4 810.11 C 674.02 789.28 694.03 765.74 741 710.49 M 659.39 810.47 C 679.34 780.93 703.46 758.49 740.74 716.89 M 659.39 810.47 C 682.44 783.12 709.18 753.97 740.74 716.89 M 665.03 810.08 C 693.46 779.62 719.81 744.81 740.48 723.29 M 665.03 810.08 C 681.28 791.04 701.56 770.76 740.48 723.29 M 670.02 810.44 C 683.98 791.22 700.06 770.49 740.22 729.68 M 670.02 810.44 C 684.77 794.65 702.71 776.82 740.22 729.68 M 675.66 810.04 C 695.93 785.5 713.93 772.83 740.61 735.33 M 675.66 810.04 C 701.94 782.26 726.37 751.36 740.61 735.33 M 680.65 810.4 C 695.42 793.23 711.7 777.58 740.35 741.73 M 680.65 810.4 C 698.64 788.43 720.05 766.03 740.35 741.73 M 686.29 810.01 C 702.64 792.81 718.78 777.41 740.09 748.12 M 686.29 810.01 C 699.58 796.51 713.63 781.73 740.09 748.12 M 691.28 810.37 C 698.46 801.79 711.58 788.15 740.48 753.77 M 691.28 810.37 C 706.07 791.5 726.96 769.4 740.48 753.77 M 696.27 810.73 C 706.82 803.79 714.66 788.18 740.22 760.16 M 696.27 810.73 C 706.81 799.44 713.6 790.79 740.22 760.16 M 701.91 810.34 C 713.02 794.1 728.18 782.38 739.96 766.56 M 701.91 810.34 C 711.91 803.32 719.33 792.73 739.96 766.56 M 706.9 810.7 C 717.9 797.56 729.73 785.03 740.36 772.21 M 706.9 810.7 C 714.36 798.32 725.2 787.86 740.36 772.21 M 712.54 810.3 C 722.88 800.25 735.58 782.95 740.09 778.6 M 712.54 810.3 C 721.66 802.43 730.66 789.68 740.09 778.6 M 717.53 810.66 C 727.24 806.14 730.53 791.83 739.83 785 M 717.53 810.66 C 721.04 806.69 728.31 800.41 739.83 785 M 722.51 811.02 C 729.63 804.48 738.04 791.82 740.23 790.64 M 722.51 811.02 C 726.52 807.07 728.58 801.61 740.23 790.64 M 729.47 809.12 C 729.1 804.04 733.39 804.02 739.97 797.04 M 729.47 809.12 C 730.72 806.96 735.57 805.41 739.97 797.04" fill="none" stroke="#cdeb8b" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 408 690 M 408 690 C 514.52 689.23 615.38 693.95 722 690 M 408 690 C 534.85 688.72 660.3 687.87 722 690 M 722 690 C 731.04 688.67 740.08 692.71 740 708 M 722 690 C 736.88 694.59 740.63 696.25 740 708 M 740 708 C 744.6 743.16 740.54 771.14 740 792 M 740 708 C 739.27 725.42 740.73 744.04 740 792 M 740 792 C 743.02 802.54 736.18 810.61 722 810 M 740 792 C 740.59 805.07 736.53 811.34 722 810 M 722 810 C 607.31 811.89 492.5 813.89 408 810 M 722 810 C 634.49 807.87 547.72 806.67 408 810 M 408 810 C 394.1 807.12 388.55 806.14 390 792 M 408 810 C 397.09 805.5 392.47 801.47 390 792 M 390 792 C 391.84 769.1 391.58 739.23 390 708 M 390 792 C 389.98 773.65 389.69 750.75 390 708 M 390 708 C 388.64 697.56 395.54 687.36 408 690 M 390 708 C 390.45 698.46 395.41 689.09 408 690" fill="none" stroke="#36393d" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="390" y="160" width="350" height="110.29" rx="16.54" ry="16.54" fill="none" stroke="none" pointer-events="all"/><path d="M 394.28 163.97 C 394.28 163.97 394.28 163.97 394.28 163.97 M 394.28 163.97 C 394.28 163.97 394.28 163.97 394.28 163.97 M 390.74 174.14 C 393.38 170.5 398.91 166.18 401.89 161.31 M 390.74 174.14 C 393.8 172.08 395.26 169.35 401.89 161.31 M 392.45 178.27 C 392.59 171.05 399.32 170.28 407.54 160.91 M 392.45 178.27 C 395.28 172.03 399.14 167.54 407.54 160.91 M 392.19 184.67 C 401.5 175.91 406.57 167.81 412.52 161.27 M 392.19 184.67 C 398.81 177.61 401.18 173.96 412.52 161.27 M 392.58 190.31 C 397.64 180.93 403.47 177.26 418.17 160.88 M 392.58 190.31 C 399.48 181.26 407.91 173.74 418.17 160.88 M 392.32 196.71 C 400.07 180.56 411.87 168.22 423.15 161.24 M 392.32 196.71 C 400.14 185.7 408.82 178.99 423.15 161.24 M 392.06 203.11 C 403.54 184.31 417.3 166.61 428.8 160.84 M 392.06 203.11 C 402.33 193.92 411.37 181.08 428.8 160.84 M 392.45 208.75 C 403.97 188.79 421.27 179.26 433.78 161.2 M 392.45 208.75 C 408.6 193.32 421.05 177.65 433.78 161.2 M 392.19 215.15 C 413.41 193.58 426.77 175.47 439.43 160.81 M 392.19 215.15 C 403.97 202.58 415.87 188.34 439.43 160.81 M 392.59 220.79 C 408.9 199.42 431.44 172.41 444.41 161.17 M 392.59 220.79 C 403.1 208.26 417.28 191.26 444.41 161.17 M 392.32 227.19 C 405.5 207.54 422.39 189.45 450.06 160.77 M 392.32 227.19 C 410.18 207.81 426.13 189.8 450.06 160.77 M 392.72 232.83 C 407.44 212.33 429.47 193.14 455.04 161.13 M 392.72 232.83 C 407.63 215.27 423.43 197.94 455.04 161.13 M 392.46 239.23 C 412.23 215.34 430.65 191.77 460.69 160.74 M 392.46 239.23 C 412.14 217.58 432.79 195.08 460.69 160.74 M 392.2 245.63 C 408.69 226.4 421.01 209.46 465.67 161.1 M 392.2 245.63 C 415.08 222.05 439.48 195.05 465.67 161.1 M 392.59 251.27 C 420.97 213.57 454.98 178.02 470.66 161.46 M 392.59 251.27 C 416.9 222.72 441.66 196.7 470.66 161.46 M 391.67 258.42 C 419.07 226.19 443.97 194.79 476.3 161.07 M 391.67 258.42 C 427.24 221.02 457.85 181.08 476.3 161.07 M 393.38 262.56 C 417.43 234.89 445.72 201.43 481.29 161.43 M 393.38 262.56 C 424.47 226.97 454.6 188.97 481.29 161.43 M 395.09 266.69 C 422.59 234.42 446.91 201.21 486.93 161.03 M 395.09 266.69 C 411.11 242.89 432.09 220.93 486.93 161.03 M 398.11 269.31 C 423.42 243.11 444.1 211.16 491.92 161.39 M 398.11 269.31 C 432.18 231.44 461.12 191.11 491.92 161.39 M 401.78 271.18 C 433.22 238.86 470.3 194.46 497.56 161 M 401.78 271.18 C 433.18 232.4 469.95 195.44 497.56 161 M 406.77 271.54 C 431.77 242.18 460.9 214.53 502.55 161.36 M 406.77 271.54 C 441.51 233.66 474.65 196.53 502.55 161.36 M 412.41 271.15 C 449.67 236.93 479.01 197.67 508.19 160.96 M 412.41 271.15 C 438.59 240 463.53 208.13 508.19 160.96 M 417.4 271.51 C 438.61 243.12 460.69 222.4 513.18 161.32 M 417.4 271.51 C 449.06 239 477.08 206.59 513.18 161.32 M 423.04 271.11 C 442.67 241.94 465.53 217.4 518.82 160.93 M 423.04 271.11 C 453.32 240.12 479.38 209.01 518.82 160.93 M 428.03 271.47 C 455.34 239.42 485.04 202.17 523.81 161.29 M 428.03 271.47 C 459.42 233.38 494.36 192.51 523.81 161.29 M 433.67 271.08 C 465.44 234.31 506.5 188.9 528.8 161.65 M 433.67 271.08 C 452.04 245.05 473.69 223.95 528.8 161.65 M 438.66 271.44 C 459.56 248.33 480.5 220.15 534.44 161.25 M 438.66 271.44 C 468.03 237.68 498.92 201.6 534.44 161.25 M 443.64 271.8 C 465.48 247.34 487.46 220.4 539.43 161.61 M 443.64 271.8 C 474.58 236.39 508.55 197.13 539.43 161.61 M 449.29 271.41 C 479.65 239.84 509.82 206.81 545.07 161.22 M 449.29 271.41 C 487.87 231.97 524.11 187.5 545.07 161.22 M 454.27 271.77 C 487.36 237.35 514.18 198.61 550.06 161.58 M 454.27 271.77 C 479.61 241.84 506.85 214.66 550.06 161.58 M 459.92 271.37 C 492.76 236.86 515.75 204.13 555.7 161.18 M 459.92 271.37 C 482.31 242.92 506.83 216.78 555.7 161.18 M 464.9 271.73 C 487.45 248.6 507.73 232.28 560.69 161.54 M 464.9 271.73 C 488.02 249.87 505.53 226.39 560.69 161.54 M 470.55 271.34 C 492.89 247.27 517.06 218.56 566.33 161.15 M 470.55 271.34 C 504.2 231.66 539.16 193.55 566.33 161.15 M 475.53 271.7 C 501.52 237.39 536.87 204.3 571.32 161.51 M 475.53 271.7 C 505.18 233.24 538.16 199.37 571.32 161.51 M 481.18 271.3 C 501.53 245.93 524.66 216.01 576.96 161.11 M 481.18 271.3 C 504.86 250.16 522.46 223.19 576.96 161.11 M 486.16 271.66 C 510.92 242.57 526.53 223.33 581.95 161.47 M 486.16 271.66 C 505.96 248.65 528.19 224.43 581.95 161.47 M 491.81 271.27 C 522.81 242.4 547.92 206.87 586.94 161.84 M 491.81 271.27 C 528.39 227.93 563.5 189.93 586.94 161.84 M 496.79 271.63 C 536 230.51 565.14 195.39 592.58 161.44 M 496.79 271.63 C 531.76 231.15 569.66 189.3 592.58 161.44 M 501.78 271.99 C 532.17 241.9 558.7 208.79 597.57 161.8 M 501.78 271.99 C 518.96 245.94 541.75 224.8 597.57 161.8 M 507.42 271.59 C 533.07 247.34 555.68 217.42 603.21 161.41 M 507.42 271.59 C 539.18 232.13 577.82 189.99 603.21 161.41 M 512.41 271.95 C 538.64 238.73 567.52 203.37 608.2 161.77 M 512.41 271.95 C 541.8 236.03 572.33 202.38 608.2 161.77 M 518.05 271.56 C 555.85 230.51 591.07 187.54 613.84 161.37 M 518.05 271.56 C 542.24 245.08 567.15 215.22 613.84 161.37 M 523.04 271.92 C 553.21 244.18 578.09 208.83 618.83 161.73 M 523.04 271.92 C 550.83 237.48 582.8 205.99 618.83 161.73 M 528.68 271.52 C 545.24 248.73 569.98 222.34 624.47 161.34 M 528.68 271.52 C 563.48 231.58 597.58 193.51 624.47 161.34 M 533.67 271.88 C 552.98 245.27 579.11 222.83 629.46 161.7 M 533.67 271.88 C 560.75 244.46 584.69 217.27 629.46 161.7 M 539.32 271.49 C 562.71 242.21 588.19 219.73 635.1 161.3 M 539.32 271.49 C 564.35 239.73 594.77 206.76 635.1 161.3 M 544.3 271.85 C 584.11 228.7 617.09 187.22 640.09 161.66 M 544.3 271.85 C 563.7 246.81 589.57 221.75 640.09 161.66 M 549.95 271.46 C 579.23 234.51 607.84 204.08 645.73 161.27 M 549.95 271.46 C 582.71 233.64 616.14 196.48 645.73 161.27 M 554.93 271.82 C 570.16 249.44 590.42 227.71 650.72 161.63 M 554.93 271.82 C 590.71 230.29 624.95 188.14 650.72 161.63 M 559.92 272.18 C 587.14 239.62 617.23 202.24 655.7 161.99 M 559.92 272.18 C 584.24 238.82 612.81 206.41 655.7 161.99 M 565.56 271.78 C 588.4 249.63 608.56 221.58 661.35 161.59 M 565.56 271.78 C 584.34 250.44 607.05 225.24 661.35 161.59 M 570.55 272.14 C 602.46 236.31 629.78 208.79 666.33 161.95 M 570.55 272.14 C 605.85 231.9 639.36 193.06 666.33 161.95 M 576.19 271.75 C 601.5 244.5 624.84 218.81 671.98 161.56 M 576.19 271.75 C 608.62 232.38 638.4 196.47 671.98 161.56 M 581.18 272.11 C 608.03 239.46 638.56 202.46 676.96 161.92 M 581.18 272.11 C 611.73 237.07 643.55 201.34 676.96 161.92 M 586.82 271.71 C 612.82 247.97 629.99 220.55 682.61 161.52 M 586.82 271.71 C 622.86 230.88 655.64 193.34 682.61 161.52 M 591.81 272.07 C 616.79 246.13 637.88 223.2 687.59 161.88 M 591.81 272.07 C 627.22 235.17 658.46 194.45 687.59 161.88 M 597.45 271.68 C 628.53 242.89 652.72 208.38 693.24 161.49 M 597.45 271.68 C 624.7 240.61 653.11 210.41 693.24 161.49 M 602.44 272.04 C 626.75 235.5 658.21 205.02 698.22 161.85 M 602.44 272.04 C 634.02 237.63 662.67 200.96 698.22 161.85 M 608.08 271.64 C 635.96 239.19 661.24 211.52 703.87 161.46 M 608.08 271.64 C 626.85 248.21 646.88 226.41 703.87 161.46 M 613.07 272 C 643.43 235.22 681.55 199.51 708.85 161.82 M 613.07 272 C 633.27 242.17 655.99 217.47 708.85 161.82 M 618.06 272.36 C 642.26 252.35 662.75 228.23 713.84 162.18 M 618.06 272.36 C 635.04 252.17 655.06 227.18 713.84 162.18 M 623.7 271.97 C 662.26 233.27 695.74 184.53 719.48 161.78 M 623.7 271.97 C 655.53 234.52 690.27 197.26 719.48 161.78 M 628.69 272.33 C 654.75 246.56 677.31 213.97 724.47 162.14 M 628.69 272.33 C 648.02 251.08 672.28 224.92 724.47 162.14 M 634.33 271.93 C 664.72 232.3 694.04 199.48 730.77 160.99 M 634.33 271.93 C 667.9 232.52 698.48 197.31 730.77 160.99 M 639.32 272.29 C 660.79 245.35 685.67 215.29 734.45 162.86 M 639.32 272.29 C 673.98 227.5 710.55 185.27 734.45 162.86 M 644.96 271.9 C 672.41 238.78 703.1 201.59 737.46 165.49 M 644.96 271.9 C 666.44 248.16 691.4 219.38 737.46 165.49 M 649.95 272.26 C 673.87 239.97 698.17 208.4 739.17 169.62 M 649.95 272.26 C 674.75 242.08 703.69 207.48 739.17 169.62 M 655.59 271.87 C 676.46 252.38 690.06 230.98 740.88 173.75 M 655.59 271.87 C 685.83 237.09 716.33 199.61 740.88 173.75 M 660.58 272.23 C 690.12 242.17 717.34 213.68 740.62 180.15 M 660.58 272.23 C 689.99 234.9 721.62 200.59 740.62 180.15 M 666.22 271.83 C 682.46 254.78 708.77 233.01 741.01 185.79 M 666.22 271.83 C 682.71 251.59 701.4 228.88 741.01 185.79 M 671.21 272.19 C 687.82 248 715.06 224.5 740.75 192.19 M 671.21 272.19 C 691.21 250.33 709.91 231.7 740.75 192.19 M 676.19 272.55 C 690.49 252.6 707.6 242.44 740.49 198.59 M 676.19 272.55 C 695.29 249.79 717.9 223.74 740.49 198.59 M 681.84 272.16 C 701.23 255.81 712.74 233.8 740.88 204.23 M 681.84 272.16 C 693.07 256.44 707.73 241.95 740.88 204.23 M 686.82 272.52 C 707.08 246.41 723.63 226.08 740.62 210.63 M 686.82 272.52 C 707.47 250.88 727.22 225.62 740.62 210.63 M 692.47 272.12 C 702.34 257.68 716.65 237.57 740.36 217.03 M 692.47 272.12 C 709.08 250.3 727.23 233.93 740.36 217.03 M 697.45 272.48 C 710.64 259.37 720.06 247.86 740.75 222.67 M 697.45 272.48 C 711.81 254.6 726.82 237.98 740.75 222.67 M 703.1 272.09 C 712.79 262.1 723.36 244.31 740.49 229.07 M 703.1 272.09 C 710.13 262.43 716.74 253.13 740.49 229.07 M 708.08 272.45 C 718.3 258.39 724.62 251.68 740.23 235.47 M 708.08 272.45 C 720.82 260.85 729.99 247.88 740.23 235.47 M 713.73 272.05 C 725.3 260.13 733.8 250.82 740.63 241.11 M 713.73 272.05 C 721.43 260.94 731.26 250.85 740.63 241.11 M 718.71 272.41 C 721.08 265.78 729.29 258.61 740.36 247.51 M 718.71 272.41 C 727.57 262.46 733.78 257.19 740.36 247.51 M 725.01 271.26 C 727.53 265.56 731.69 258.81 740.1 253.91 M 725.01 271.26 C 728.27 265.31 735.15 258.71 740.1 253.91 M 731.31 270.11 C 732.66 266.72 736.15 263.32 739.19 261.06 M 731.31 270.11 C 733.92 266.12 737.04 263.67 739.19 261.06" fill="none" stroke="#cdeb8b" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 406.54 160 M 406.54 160 C 501.85 153.85 596.66 154.62 723.46 160 M 406.54 160 C 471.4 159.66 538.04 157.98 723.46 160 M 723.46 160 C 732.96 159.88 739.56 166.94 740 176.54 M 723.46 160 C 736.13 158.69 740.57 166.76 740 176.54 M 740 176.54 C 741.81 188.29 741.09 205.37 740 253.75 M 740 176.54 C 740.31 194.15 740.94 213.91 740 253.75 M 740 253.75 C 736.93 266.31 736.66 269.84 723.46 270.29 M 740 253.75 C 743.42 262.71 731.32 270.65 723.46 270.29 M 723.46 270.29 C 613.61 270.2 500.75 272.44 406.54 270.29 M 723.46 270.29 C 595.51 270.99 471.24 272.05 406.54 270.29 M 406.54 270.29 C 398.01 273.94 391.47 267.09 390 253.75 M 406.54 270.29 C 397.96 268.94 391.44 263.12 390 253.75 M 390 253.75 C 389.09 225.13 389.76 195.64 390 176.54 M 390 253.75 C 390.62 223.44 391.4 195.78 390 176.54 M 390 176.54 C 392.8 163.1 396.89 156.73 406.54 160 M 390 176.54 C 392.55 168.13 398.22 163.23 406.54 160" fill="none" stroke="#36393d" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 542.17 120.29 L 504.18 170.22" fill="none" stroke="none" pointer-events="stroke"/><path d="M 501 174.4 L 502.46 166.71 L 504.18 170.22 L 508.03 170.95 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 542.17 120.29 M 542.17 120.29 C 537.92 127.88 522.56 143.72 504.18 170.22 M 542.17 120.29 C 528.88 136.43 516.75 154.83 504.18 170.22" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 502.53 166.63 C 502.53 166.63 502.53 166.63 502.53 166.63 M 502.53 166.63 C 502.53 166.63 502.53 166.63 502.53 166.63 M 500.95 174.54 C 502.68 173.49 502.52 172.45 504.23 170.77 M 500.95 174.54 C 502.04 173.98 502.15 172.59 504.23 170.77" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 501 174.4 M 501 174.4 C 503 172.6 502.65 170.02 502.46 166.71 M 501 174.4 C 500.97 172.71 501.71 170.57 502.46 166.71 M 502.46 166.71 C 503.62 167.21 504.39 169.86 504.18 170.22 M 502.46 166.71 C 502.55 167.51 503.59 168.98 504.18 170.22 M 504.18 170.22 C 505.42 169.99 506.83 169.91 508.03 170.95 M 504.18 170.22 C 505.95 170.35 506.93 170.45 508.03 170.95 M 508.03 170.95 C 505.2 172.72 502.56 172.74 501 174.4 M 508.03 170.95 C 505.95 172.3 502.22 173.58 501 174.4" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 595 120.29 L 613.47 169.33" fill="none" stroke="none" pointer-events="stroke"/><path d="M 615.32 174.24 L 609.58 168.93 L 613.47 169.33 L 616.13 166.46 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 595 120.29 M 595 120.29 C 602.53 139.58 612.71 155.77 613.47 169.33 M 595 120.29 C 603.85 137.82 609.41 153.13 613.47 169.33" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 609.91 168.55 C 609.91 168.55 609.91 168.55 609.91 168.55 M 609.91 168.55 C 609.91 168.55 609.91 168.55 609.91 168.55 M 612.27 171.93 C 613.38 171.39 614.55 170.25 616.86 166.65 M 612.27 171.93 C 612.89 170.56 614.18 169.59 616.86 166.65" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 615.32 174.24 M 615.32 174.24 C 612.11 172.07 612.57 169.05 609.58 168.93 M 615.32 174.24 C 612.6 172.27 610.63 169.95 609.58 168.93 M 609.58 168.93 C 609.99 169.56 612.56 168.58 613.47 169.33 M 609.58 168.93 C 610.9 169.24 611.74 169.21 613.47 169.33 M 613.47 169.33 C 614.85 168.13 614.58 168 616.13 166.46 M 613.47 169.33 C 614.51 168.35 615.38 167.46 616.13 166.46 M 616.13 166.46 C 617.03 167.88 615.13 170.27 615.32 174.24 M 616.13 166.46 C 615.52 168.2 615.14 170.56 615.32 174.24" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="505" y="60.29" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 507.47 62.28 C 507.47 62.28 507.47 62.28 507.47 62.28 M 507.47 62.28 C 507.47 62.28 507.47 62.28 507.47 62.28 M 505.9 70.19 C 506.15 68.23 510.45 63.46 514.43 60.38 M 505.9 70.19 C 508.51 66.05 510.18 65.21 514.43 60.38 M 505.64 76.59 C 509.73 72.81 511.3 72.06 519.42 60.74 M 505.64 76.59 C 511.04 71.28 511.78 67.08 519.42 60.74 M 506.03 82.23 C 511.42 70.51 523.24 63.48 525.06 60.34 M 506.03 82.23 C 512.53 75.41 515.31 69.04 525.06 60.34 M 505.77 88.63 C 513.26 81.67 512.85 75.9 530.05 60.71 M 505.77 88.63 C 514.11 79.64 524.36 68.97 530.05 60.71 M 506.17 94.27 C 520.27 81.26 530.53 68.2 535.69 60.31 M 506.17 94.27 C 514.82 84.49 524.8 75.37 535.69 60.31 M 505.9 100.67 C 517.36 87.61 531.92 75.34 540.68 60.67 M 505.9 100.67 C 517.53 85.56 530.19 72.96 540.68 60.67 M 505.64 107.07 C 518.87 92.5 534.94 71.87 545.66 61.03 M 505.64 107.07 C 516.92 92.53 530.38 80.9 545.66 61.03 M 506.04 112.71 C 520.13 100.68 527.59 83.92 551.31 60.64 M 506.04 112.71 C 518.66 95.4 533.06 81.61 551.31 60.64 M 507.74 116.84 C 519.07 95.6 536.62 79.85 556.29 61 M 507.74 116.84 C 516.91 104.55 529.93 90.12 556.29 61 M 510.11 120.22 C 531.09 96.61 551.33 75.16 561.94 60.6 M 510.11 120.22 C 526.68 103.72 542.12 83.8 561.94 60.6 M 515.75 119.83 C 532.76 98.68 544.51 81.66 566.92 60.96 M 515.75 119.83 C 536.98 95.73 557.49 75.1 566.92 60.96 M 520.74 120.19 C 534.97 109.37 547.41 90.01 572.57 60.57 M 520.74 120.19 C 536.86 99.68 555.74 76.44 572.57 60.57 M 526.38 119.79 C 544.28 96.26 561.68 79.04 577.55 60.93 M 526.38 119.79 C 544.68 99.82 559.98 80.24 577.55 60.93 M 531.37 120.15 C 548.11 95.13 566.2 72.53 583.2 60.53 M 531.37 120.15 C 545.48 104.65 555.21 88.1 583.2 60.53 M 537.01 119.76 C 553.92 102.95 570.88 84.22 588.18 60.89 M 537.01 119.76 C 554.3 101.93 571.14 83.68 588.18 60.89 M 542 120.12 C 554.5 103.68 573.25 81.14 593.17 61.25 M 542 120.12 C 554.7 108.05 566.21 93.4 593.17 61.25 M 546.98 120.48 C 562.35 104.02 578.77 85.31 598.81 60.86 M 546.98 120.48 C 560.09 106.48 576.9 89.46 598.81 60.86 M 552.63 120.09 C 562.2 107.99 580.21 93.96 603.8 61.22 M 552.63 120.09 C 570.32 96.55 590.61 77.16 603.8 61.22 M 557.61 120.45 C 574.79 101.22 584.29 85.28 609.44 60.82 M 557.61 120.45 C 573.12 100.55 589.74 85.51 609.44 60.82 M 563.26 120.05 C 570.11 104.97 587.6 92.82 614.43 61.18 M 563.26 120.05 C 576.95 109.69 585.74 96.46 614.43 61.18 M 568.24 120.41 C 582.13 105.56 600.33 83.81 620.07 60.79 M 568.24 120.41 C 581.39 104.49 594.54 86.76 620.07 60.79 M 573.89 120.02 C 588.88 105.87 605.63 91.35 623.09 63.41 M 573.89 120.02 C 586.23 102.5 601.23 86.95 623.09 63.41 M 578.87 120.38 C 584.93 105.3 598.6 101.39 624.8 67.55 M 578.87 120.38 C 590.53 107.94 602.41 95.88 624.8 67.55 M 584.52 119.98 C 600.52 101.46 614.28 86.06 627.16 70.93 M 584.52 119.98 C 593.93 106 607.48 90.68 627.16 70.93 M 589.5 120.34 C 600.28 106.68 615.35 93.13 626.9 77.32 M 589.5 120.34 C 602.23 104.93 614.81 93.25 626.9 77.32 M 594.49 120.7 C 601.74 107.91 608.96 105.1 626.64 83.72 M 594.49 120.7 C 604.74 108.89 616.06 94.71 626.64 83.72 M 600.13 120.31 C 607.21 115.6 613.43 102.78 627.03 89.36 M 600.13 120.31 C 608.75 110.17 618.84 98.59 627.03 89.36 M 605.12 120.67 C 609.99 112.92 615.69 105.08 626.77 95.76 M 605.12 120.67 C 610.56 115.09 618.25 107.59 626.77 95.76 M 610.76 120.27 C 611.81 117.12 623.02 107.23 626.51 102.16 M 610.76 120.27 C 613.32 115.48 619.23 112.97 626.51 102.16 M 615.75 120.63 C 621.68 117.99 625.5 111.9 626.9 107.8 M 615.75 120.63 C 621.13 115.11 623.59 113.26 626.9 107.8" fill="none" stroke="#cdeb8b" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 514 60.29 M 514 60.29 C 549.41 59.54 579 60.73 616 60.29 M 514 60.29 C 545.23 62.22 581.12 60.55 616 60.29 M 616 60.29 C 618.15 62.1 627.17 59.72 625 69.29 M 616 60.29 C 621.69 62.64 624.99 65.86 625 69.29 M 625 69.29 C 622.63 82.11 628.12 92.03 625 111.29 M 625 69.29 C 625.58 79.94 625.91 88.36 625 111.29 M 625 111.29 C 625.79 113.72 622.86 121.81 616 120.29 M 625 111.29 C 628.8 113.57 619.19 119.64 616 120.29 M 616 120.29 C 591.24 118.35 568.17 123.93 514 120.29 M 616 120.29 C 589.22 123.13 565.73 120.41 514 120.29 M 514 120.29 C 506.55 119.73 501.65 116.89 505 111.29 M 514 120.29 C 504.41 117.39 506.53 116.86 505 111.29 M 505 111.29 C 505.51 97.83 505.17 88 505 69.29 M 505 111.29 C 506.01 95.8 505.22 80.76 505 69.29 M 505 69.29 C 504.98 64.18 504.91 60.64 514 60.29 M 505 69.29 C 503.58 60.25 511.07 64.16 514 60.29" fill="none" stroke="#36393d" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 506px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">Matrix scan</font></div></div></div></foreignObject><text x="565" y="95" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">Matrix scan</text></switch></g><path d="M 477.5 235.29 L 477.5 703.63" fill="none" stroke="none" pointer-events="stroke"/><path d="M 477.5 708.88 L 474 701.88 L 477.5 703.63 L 481 701.88 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 477.5 235.29 M 477.5 235.29 C 473.24 402.1 475.08 566.98 477.5 703.63 M 477.5 235.29 C 473.37 389.75 473.15 544.31 477.5 703.63" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 473.78 702.13 C 473.78 702.13 473.78 702.13 473.78 702.13 M 473.78 702.13 C 473.78 702.13 473.78 702.13 473.78 702.13 M 476.15 705.51 C 476.61 705.55 476.57 705.04 477.46 704 M 476.15 705.51 C 476.61 704.93 477.24 704.64 477.46 704" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 477.5 708.88 M 477.5 708.88 C 477.85 708.01 476.99 704.98 474 701.88 M 477.5 708.88 C 475.9 707.47 475.48 705.34 474 701.88 M 474 701.88 C 474.97 702.41 475.94 702.72 477.5 703.63 M 474 701.88 C 474.83 702.26 475.78 702.76 477.5 703.63 M 477.5 703.63 C 477.86 703.77 480.21 702.17 481 701.88 M 477.5 703.63 C 478.59 702.56 480.02 701.87 481 701.88 M 481 701.88 C 478.68 704.17 479.62 706.18 477.5 708.88 M 481 701.88 C 480.03 703.22 480.08 704.7 477.5 708.88" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 479px; margin-left: 478px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 20px;">Serial</font></div></div></div></foreignObject><text x="478" y="482" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="12px" text-anchor="middle">Serial</text></switch></g><rect x="405" y="175.29" width="145" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 410.5 175.77 L 548.1 173.67 L 546.8 178.43 L 553.88 183.76 L 550.8 226.67 L 550.7 229.08 L 540.64 235.42 L 411.71 231.18 L 405.48 235.89 L 402.37 225.82 L 406.59 181.63 L 406.91 179.5 L 412.33 177.51" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 414 175.29 M 414 175.29 C 444.25 177.2 475.48 173.46 541 175.29 M 414 175.29 C 447.46 176.43 485.02 177.89 541 175.29 M 541 175.29 C 546.19 179.22 553.73 182.06 550 184.29 M 541 175.29 C 542.44 172.82 545.95 175.75 550 184.29 M 550 184.29 C 546.76 199.15 548.32 209.17 550 226.29 M 550 184.29 C 550.32 198.89 550.61 218.84 550 226.29 M 550 226.29 C 547.03 231.21 543.63 232.93 541 235.29 M 550 226.29 C 550.16 232.26 550.74 238.23 541 235.29 M 541 235.29 C 513.18 230.3 478.83 230.17 414 235.29 M 541 235.29 C 489.2 235.74 441.65 235.11 414 235.29 M 414 235.29 C 410.73 234.64 401.56 231.09 405 226.29 M 414 235.29 C 412.45 237.47 402.07 232.95 405 226.29 M 405 226.29 C 407.24 210.81 401.67 203.5 405 184.29 M 405 226.29 C 404.86 211.69 404.08 196.02 405 184.29 M 405 184.29 C 404.27 174.36 410.64 178.6 414 175.29 M 405 184.29 C 407.02 175.61 403.68 176 414 175.29" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 143px; height: 1px; padding-top: 205px; margin-left: 406px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">SerialSplit<br />Driver</font></div></div></div></foreignObject><text x="478" y="210" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">SerialSplit...</text></switch></g><path d="M 651.42 390 L 651.42 552.63" fill="none" stroke="none" pointer-events="stroke"/><path d="M 651.42 557.88 L 647.92 550.88 L 651.42 552.63 L 654.92 550.88 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 651.42 390 M 651.42 390 C 651.71 446.94 652.05 507.96 651.42 552.63 M 651.42 390 C 646.96 428.19 647.1 468.34 651.42 552.63" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 647.66 551.18 C 647.66 551.18 647.66 551.18 647.66 551.18 M 647.66 551.18 C 647.66 551.18 647.66 551.18 647.66 551.18 M 650.02 554.56 C 650.51 553.72 650.91 553.47 651.34 553.05 M 650.02 554.56 C 650.48 554.24 650.61 553.74 651.34 553.05" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 651.42 557.88 M 651.42 557.88 C 649.68 555.63 650.49 552.21 647.92 550.88 M 651.42 557.88 C 649.7 556.34 649.49 554.33 647.92 550.88 M 647.92 550.88 C 648.12 551.55 649.05 551.55 651.42 552.63 M 647.92 550.88 C 648.64 551.46 650.06 552.21 651.42 552.63 M 651.42 552.63 C 652.66 552.56 653.55 551.26 654.92 550.88 M 651.42 552.63 C 652.57 551.69 653.73 551.72 654.92 550.88 M 654.92 550.88 C 652.77 553.08 651.81 554.6 651.42 557.88 M 654.92 550.88 C 654.19 552.65 653.13 554.42 651.42 557.88" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 481px; margin-left: 652px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font face="Verdana">BLE</font></div></div></div></foreignObject><text x="652" y="487" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="20px" text-anchor="middle">BLE</text></switch></g><rect x="580" y="330" width="142.85" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 585.5 331.84 L 714.57 331.81 L 723.51 331.86 L 723.39 336.23 L 724.73 386.2 L 717.12 385.5 L 711.66 393.59 L 581.52 388.01 L 583.99 389.11 L 578.06 382.48 L 576.95 342.36 L 583.31 330.52 L 589.16 330.37" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 589 330 M 589 330 C 620.99 327.28 661.2 334.63 713.85 330 M 589 330 C 615.16 329.86 644.02 331.08 713.85 330 M 713.85 330 C 721.17 326.15 721.83 331.59 722.85 339 M 713.85 330 C 716.73 329.93 718.7 335.3 722.85 339 M 722.85 339 C 720.06 350.01 719.7 360.47 722.85 381 M 722.85 339 C 724.67 355.01 724.4 366.56 722.85 381 M 722.85 381 C 726.25 385.86 715.99 387.98 713.85 390 M 722.85 381 C 721.8 384.45 723.01 389.63 713.85 390 M 713.85 390 C 688.19 386.95 662.14 389.28 589 390 M 713.85 390 C 672.82 392.07 631.2 392.83 589 390 M 589 390 C 583.57 390.14 580.09 385.7 580 381 M 589 390 C 580.09 389.52 581.87 386.79 580 381 M 580 381 C 580.17 366.42 577.43 355.97 580 339 M 580 381 C 578.89 364.53 580.56 349.22 580 339 M 580 339 C 582.24 336.42 582.58 328.8 589 330 M 580 339 C 576.08 335.32 583.64 331.97 589 330" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 141px; height: 1px; padding-top: 360px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">BleSplit<br />PeripheralServer</font></div></div></div></foreignObject><text x="651" y="365" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">BleSplit...</text></switch></g><path d="M 651.42 235.29 L 651.42 323.63" fill="none" stroke="none" pointer-events="stroke"/><path d="M 651.42 328.88 L 647.92 321.88 L 651.42 323.63 L 654.92 321.88 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 651.42 235.29 M 651.42 235.29 C 647.69 266.26 649.01 296.7 651.42 323.63 M 651.42 235.29 C 653.28 255.39 651.74 271.15 651.42 323.63" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 647.77 322.05 C 647.77 322.05 647.77 322.05 647.77 322.05 M 647.77 322.05 C 647.77 322.05 647.77 322.05 647.77 322.05 M 650.14 325.43 C 650.39 324.87 650.54 324.22 651.45 323.92 M 650.14 325.43 C 650.52 325.01 650.64 324.73 651.45 323.92" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 651.42 328.88 M 651.42 328.88 C 651.79 327.32 648.48 325.14 647.92 321.88 M 651.42 328.88 C 651.14 327.54 649.82 326.39 647.92 321.88 M 647.92 321.88 C 648.96 322.94 649.86 322.99 651.42 323.63 M 647.92 321.88 C 648.46 322.42 649.09 322.58 651.42 323.63 M 651.42 323.63 C 652.31 323.26 652.82 322.38 654.92 321.88 M 651.42 323.63 C 651.95 323.04 652.78 323.08 654.92 321.88 M 654.92 321.88 C 652.7 325.41 653.64 327.08 651.42 328.88 M 654.92 321.88 C 654.64 323.15 652.92 325.33 651.42 328.88" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="580" y="175.29" width="142.85" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 591.1 178.53 L 719.81 178.19 L 724.57 177.91 L 725.32 182.97 L 725.05 229.19 L 719.36 234.24 L 712.91 236.98 L 582.03 233.79 L 578.69 233.27 L 578.16 228.72 L 581.48 183.53 L 580.68 180.04 L 588.75 175.69" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 589 175.29 M 589 175.29 C 619.03 176.4 642.67 170.22 713.85 175.29 M 589 175.29 C 628.53 172.57 669.69 174.37 713.85 175.29 M 713.85 175.29 C 717.64 178.27 725.47 180.46 722.85 184.29 M 713.85 175.29 C 723.2 174.11 726.26 174.82 722.85 184.29 M 722.85 184.29 C 725.56 199.61 726.04 211.78 722.85 226.29 M 722.85 184.29 C 721.77 199.68 723.88 215.85 722.85 226.29 M 722.85 226.29 C 723.2 230.14 718.57 236.35 713.85 235.29 M 722.85 226.29 C 720.06 233.25 716.13 233.24 713.85 235.29 M 713.85 235.29 C 685.9 237.05 660.03 239.84 589 235.29 M 713.85 235.29 C 677.55 237.09 638.21 237.28 589 235.29 M 589 235.29 C 582.44 235.95 580.45 233.76 580 226.29 M 589 235.29 C 583.16 234.82 584.5 231.76 580 226.29 M 580 226.29 C 581.95 212.1 583.4 197.68 580 184.29 M 580 226.29 C 579.69 211.55 578.61 199.05 580 184.29 M 580 184.29 C 582.35 176.65 585.14 171.55 589 175.29 M 580 184.29 C 577.69 173.76 586.33 179.55 589 175.29" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 141px; height: 1px; padding-top: 205px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-family: Verdana;">BleSplit</span><br style="border-color: var(--border-color); font-family: Verdana;" /><span style="font-family: Verdana;">PeripheralDriver</span></div></div></div></foreignObject><text x="651" y="210" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">BleSplit...</text></switch></g><rect x="535" y="10" width="60" height="40.29" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 30px; margin-left: 536px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 24px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">peripheral</div></div></div></foreignObject><text x="565" y="37" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="24px" text-anchor="middle">perip...</text></switch></g><path d="M 651.42 619 L 651.42 703.63" fill="none" stroke="none" pointer-events="stroke"/><path d="M 651.42 708.88 L 647.92 701.88 L 651.42 703.63 L 654.92 701.88 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 651.42 619 M 651.42 619 C 653.05 650.51 655.75 675.61 651.42 703.63 M 651.42 619 C 649.68 648.65 650.66 682.25 651.42 703.63" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 647.64 702.21 C 647.64 702.21 647.64 702.21 647.64 702.21 M 647.64 702.21 C 647.64 702.21 647.64 702.21 647.64 702.21 M 650 705.58 C 650.49 705.2 651.07 704.47 651.31 704.08 M 650 705.58 C 650.25 705.29 650.63 704.8 651.31 704.08" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 651.42 708.88 M 651.42 708.88 C 650.01 705.47 649.13 703.73 647.92 701.88 M 651.42 708.88 C 650.62 707.5 649.75 705.08 647.92 701.88 M 647.92 701.88 C 648.93 702.68 649.86 702.07 651.42 703.63 M 647.92 701.88 C 649.31 702.58 650.06 703.48 651.42 703.63 M 651.42 703.63 C 652.39 702.63 653.39 701.99 654.92 701.88 M 651.42 703.63 C 651.88 703.05 652.66 702.89 654.92 701.88 M 654.92 701.88 C 654.07 703.15 651.88 706.56 651.42 708.88 M 654.92 701.88 C 653.16 703.88 652.76 707.2 651.42 708.88" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 652px; margin-left: 652px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">channel</div></div></div></foreignObject><text x="652" y="655" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="12px" text-anchor="middle">channel</text></switch></g><rect x="580" y="559" width="142.85" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 591.1 559 L 721.49 561.91 L 718.07 561.14 L 721.61 570.84 L 720.83 613.79 L 720.85 615.93 L 710.52 620.78 L 583.86 620.9 L 579 619.76 L 576.58 607.27 L 577.23 568.32 L 585.58 562.82 L 591.14 560.91" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 589 559 M 589 559 C 627.04 558.87 664.04 555.49 713.85 559 M 589 559 C 615.56 561.93 640.8 558.87 713.85 559 M 713.85 559 C 717.07 558.75 724.86 562.04 722.85 568 M 713.85 559 C 719.05 561.62 725.92 561.68 722.85 568 M 722.85 568 C 722.5 586.07 724.26 595.97 722.85 610 M 722.85 568 C 722 584.69 724.1 599.89 722.85 610 M 722.85 610 C 725.48 617.63 716.86 617.23 713.85 619 M 722.85 610 C 720.42 617.33 718.71 619.15 713.85 619 M 713.85 619 C 683.11 618.41 655.94 617.79 589 619 M 713.85 619 C 685.3 616.51 654.75 617.57 589 619 M 589 619 C 586.89 622.45 580.79 617.13 580 610 M 589 619 C 580.39 623.02 578.34 612.42 580 610 M 580 610 C 584.4 595.16 583.72 581.98 580 568 M 580 610 C 579.77 594.93 581.26 575.9 580 568 M 580 568 C 576.72 558.11 582.43 559.48 589 559 M 580 568 C 584.5 561.16 585.27 563.09 589 559" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 141px; height: 1px; padding-top: 589px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">BleSplit<br />CentralClient</font></div></div></div></foreignObject><text x="651" y="594" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">BleSplit...</text></switch></g><rect x="580" y="710" width="142.85" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 591.1 711.36 L 715.11 708.33 L 721.92 710.86 L 726.26 719.6 L 721.91 761.62 L 722.42 768.63 L 716.7 767.23 L 586.68 766.02 L 582.51 769.27 L 577.27 760.22 L 580.59 717.34 L 578.98 710.13 L 592.97 710.06" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 589 710 M 589 710 C 629.33 713.23 675.86 712.93 713.85 710 M 589 710 C 629.83 711.69 671.93 708.39 713.85 710 M 713.85 710 C 719.2 709.96 720.12 715.86 722.85 719 M 713.85 710 C 720.49 705.83 725.82 717.52 722.85 719 M 722.85 719 C 722.95 733.23 722.79 751.56 722.85 761 M 722.85 719 C 721.83 733.1 723.35 747.9 722.85 761 M 722.85 761 C 723.85 768.57 716.38 768.57 713.85 770 M 722.85 761 C 719.2 765.8 718.13 766.83 713.85 770 M 713.85 770 C 667.77 771.3 615.4 773.15 589 770 M 713.85 770 C 666.25 769.14 619.8 771.59 589 770 M 589 770 C 584.73 766.24 576.32 768.04 580 761 M 589 770 C 582.23 771.36 583.15 762.56 580 761 M 580 761 C 582.33 747.06 576.47 738.75 580 719 M 580 761 C 581.12 752.47 581.06 742.19 580 719 M 580 719 C 579.69 716.46 579.36 713.97 589 710 M 580 719 C 578.56 717.15 581.02 706.16 589 710" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 141px; height: 1px; padding-top: 740px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">BleSplit<br />CentralDriver</font></div></div></div></foreignObject><text x="651" y="745" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">BleSplit...</text></switch></g><rect x="405" y="710" width="145" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 416.11 708.45 L 547.39 709.48 L 548.83 711.04 L 549.53 720.87 L 549.79 764.41 L 545.9 771.11 L 543.54 768.77 L 407.24 770.83 L 410 770.17 L 408.99 762.48 L 401.62 718.69 L 409.69 712.88 L 410.25 713.34" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 414 710 M 414 710 C 456.58 711.35 493.55 710.88 541 710 M 414 710 C 445.89 706.4 479.13 707.33 541 710 M 541 710 C 547.28 709.35 553.72 715.53 550 719 M 541 710 C 551.59 710.86 551.44 714.39 550 719 M 550 719 C 554.53 730.26 548.62 743.95 550 761 M 550 719 C 549.88 736.42 552.44 750.73 550 761 M 550 761 C 549.7 763.63 543.96 769.76 541 770 M 550 761 C 550.54 763.49 550.16 766.05 541 770 M 541 770 C 510.14 768.73 476.16 772.63 414 770 M 541 770 C 507.77 769.42 478.57 769.43 414 770 M 414 770 C 404.29 770.58 403.97 766.55 405 761 M 414 770 C 408.13 771.52 404.49 767.48 405 761 M 405 761 C 402.66 750.04 404.51 746.17 405 719 M 405 761 C 404.47 746.98 404.38 735.67 405 719 M 405 719 C 402.63 714.48 404.92 712.07 414 710 M 405 719 C 403.47 716.37 409.21 712 414 710" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 143px; height: 1px; padding-top: 740px; margin-left: 406px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">SerialSplit<br />Driver</font></div></div></div></foreignObject><text x="478" y="745" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">SerialSplit...</text></switch></g><rect x="415.7" y="240.29" width="292.15" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 290px; height: 1px; padding-top: 255px; margin-left: 417px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 14px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">SplitReader + SplitWriter</div></div></div></foreignObject><text x="562" y="259" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="14px" text-anchor="middle">SplitReader + SplitWriter</text></switch></g><rect x="420.98" y="780" width="292.15" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 290px; height: 1px; padding-top: 795px; margin-left: 422px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 14px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">SplitReader + SplitWriter</div></div></div></foreignObject><text x="567" y="799" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="14px" text-anchor="middle">SplitReader + SplitWriter</text></switch></g><rect x="415.7" y="270.29" width="292.15" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 290px; height: 1px; padding-top: 285px; margin-left: 417px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 14px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">SplitPeripheral</div></div></div></foreignObject><text x="562" y="289" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="14px" text-anchor="middle">SplitPeripheral</text></switch></g><path d="M 567.06 840 L 563.26 933.64" fill="none" stroke="none" pointer-events="stroke"/><path d="M 563.05 938.88 L 559.83 931.75 L 563.26 933.64 L 566.83 932.03 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 567.06 840 M 567.06 840 C 567.57 875.36 565.43 905.46 563.26 933.64 M 567.06 840 C 564.42 868.45 563.26 892.52 563.26 933.64" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 559.73 931.87 C 559.73 931.87 559.73 931.87 559.73 931.87 M 559.73 931.87 C 559.73 931.87 559.73 931.87 559.73 931.87 M 561.44 936 C 561.69 935.03 562.74 934.55 563.4 933.74 M 561.44 936 C 562.21 935.25 562.82 934.31 563.4 933.74" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 563.05 938.88 M 563.05 938.88 C 561.46 937.14 562.49 934.1 559.83 931.75 M 563.05 938.88 C 562.24 937.68 561.04 935.59 559.83 931.75 M 559.83 931.75 C 560.38 932.58 562.22 933.03 563.26 933.64 M 559.83 931.75 C 560.9 932.17 562.83 933.4 563.26 933.64 M 563.26 933.64 C 564.27 933.38 566.08 932.55 566.83 932.03 M 563.26 933.64 C 564.51 933.27 566.2 932.53 566.83 932.03 M 566.83 932.03 C 565.51 935.09 564.19 934.27 563.05 938.88 M 566.83 932.03 C 566.51 933.06 564.97 935.89 563.05 938.88" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 886px; margin-left: 567px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">key event </div></div></div></foreignObject><text x="567" y="889" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="12px" text-anchor="middle">key event </text></switch></g><rect x="420.98" y="810" width="292.15" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 290px; height: 1px; padding-top: 825px; margin-left: 422px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 14px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">PeripheralMatrixMonitor</div></div></div></foreignObject><text x="567" y="829" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="14px" text-anchor="middle">PeripheralMatrixMonitor</text></switch></g><rect x="250" y="910" width="620" height="120" rx="18" ry="18" fill="none" stroke="none" pointer-events="all"/><path d="M 254.59 914.39 C 254.59 914.39 254.59 914.39 254.59 914.39 M 254.59 914.39 C 254.59 914.39 254.59 914.39 254.59 914.39 M 251.05 924.56 C 249.96 923.11 253.79 916.43 262.2 911.73 M 251.05 924.56 C 253.85 920.86 259.2 916.97 262.2 911.73 M 252.1 929.45 C 258.63 928.59 260.92 919.42 268.5 910.59 M 252.1 929.45 C 258.97 924.29 263.36 916.89 268.5 910.59 M 251.84 935.85 C 260.15 926.02 269.43 917.55 274.15 910.19 M 251.84 935.85 C 260.69 927.19 265.53 917.17 274.15 910.19 M 252.23 941.49 C 258.8 929.29 267.92 918.78 279.13 910.55 M 252.23 941.49 C 262.36 930.28 273.99 920.02 279.13 910.55 M 251.97 947.89 C 264.38 931.04 279.61 916.54 284.78 910.16 M 251.97 947.89 C 265.48 931.49 277.45 915.55 284.78 910.16 M 251.71 954.29 C 260.77 942 278.54 926.87 289.76 910.52 M 251.71 954.29 C 262.1 941.23 276.94 923.66 289.76 910.52 M 252.11 959.93 C 266.8 949.11 275.49 934.96 294.75 910.88 M 252.11 959.93 C 261.17 947.62 271.82 937.29 294.75 910.88 M 251.84 966.33 C 261.53 947.25 274.25 937.21 300.39 910.48 M 251.84 966.33 C 267.55 949.55 279.69 931.16 300.39 910.48 M 252.24 971.97 C 273.63 953.42 289.88 930.48 305.38 910.84 M 252.24 971.97 C 268.93 949.84 286.42 930.82 305.38 910.84 M 251.98 978.37 C 268.73 958.76 284.56 945.78 311.02 910.45 M 251.98 978.37 C 265.07 963.81 282.17 947.67 311.02 910.45 M 252.37 984.01 C 272.7 961 296.31 932.66 316.01 910.81 M 252.37 984.01 C 264.33 965.98 279.08 950.58 316.01 910.81 M 252.11 990.41 C 271.1 974.6 281.4 957.15 321.65 910.41 M 252.11 990.41 C 280.85 957.37 308.96 926.85 321.65 910.41 M 251.85 996.81 C 279.18 966.46 311.33 931.17 326.64 910.77 M 251.85 996.81 C 273.13 970.09 294.04 950.03 326.64 910.77 M 252.24 1002.45 C 271.55 979.47 288.16 963.8 332.28 910.38 M 252.24 1002.45 C 273 977.75 293.73 951.26 332.28 910.38 M 251.98 1008.85 C 286.46 971.71 316.26 937.91 337.27 910.74 M 251.98 1008.85 C 268.5 985.76 289.25 960.47 337.27 910.74 M 250.41 1016.76 C 274.26 984.03 301.92 955.72 342.91 910.34 M 250.41 1016.76 C 279.18 981.79 311.72 944.53 342.91 910.34 M 252.12 1020.89 C 279.2 986.63 307.64 956.14 347.9 910.7 M 252.12 1020.89 C 277.39 993.06 304.5 964.49 347.9 910.7 M 254.48 1024.27 C 274.58 997.78 298.08 970.4 353.54 910.31 M 254.48 1024.27 C 276.46 997.19 301.56 971.13 353.54 910.31 M 256.84 1027.65 C 276.07 999.7 301.52 973.45 358.53 910.67 M 256.84 1027.65 C 278.79 999.91 302.54 973.67 358.53 910.67 M 260.52 1029.52 C 285.98 999.69 310 969.43 364.17 910.27 M 260.52 1029.52 C 282.81 1005.38 307.55 976.25 364.17 910.27 M 264.85 1030.63 C 296.66 993.05 321.63 962.64 369.16 910.64 M 264.85 1030.63 C 296.58 997.63 325.23 960.56 369.16 910.64 M 269.83 1030.99 C 292.83 1002.55 315.16 978.53 374.8 910.24 M 269.83 1030.99 C 297.69 998.61 329.52 964.86 374.8 910.24 M 275.48 1030.6 C 303.9 1000.41 327.69 968.84 379.79 910.6 M 275.48 1030.6 C 305.1 996.11 334.78 963.16 379.79 910.6 M 280.46 1030.96 C 313.3 995.95 338.44 967.95 385.43 910.21 M 280.46 1030.96 C 306.68 1000.83 328.59 973.85 385.43 910.21 M 286.11 1030.56 C 312.4 1005.32 330.67 983.26 390.42 910.57 M 286.11 1030.56 C 320.99 990.96 355.6 948.85 390.42 910.57 M 291.09 1030.92 C 316.19 1002.53 350.37 965.69 395.41 910.93 M 291.09 1030.92 C 315.73 1000.16 344.11 968.49 395.41 910.93 M 296.74 1030.53 C 327.08 995.87 350.04 966.47 401.05 910.53 M 296.74 1030.53 C 318.12 1003.9 341.82 975.66 401.05 910.53 M 301.72 1030.89 C 329.89 1004.46 354.73 975.02 406.04 910.89 M 301.72 1030.89 C 334.19 990.21 370.4 951.32 406.04 910.89 M 307.37 1030.5 C 328.08 1004.31 357.69 975.35 411.68 910.5 M 307.37 1030.5 C 337.84 999.84 363.52 964.71 411.68 910.5 M 312.35 1030.86 C 351.99 982.46 393.17 942.53 416.67 910.86 M 312.35 1030.86 C 337.05 1005.42 362.45 978.11 416.67 910.86 M 318 1030.46 C 344.7 998.21 379.19 958.17 422.31 910.46 M 318 1030.46 C 343.02 999.76 368.56 973.04 422.31 910.46 M 322.98 1030.82 C 354.65 1001.88 379.93 971.39 427.3 910.82 M 322.98 1030.82 C 352.92 999.69 380.02 967.76 427.3 910.82 M 328.63 1030.43 C 357.43 1000.04 379.57 970.31 432.94 910.43 M 328.63 1030.43 C 366.42 985.03 407.19 942 432.94 910.43 M 333.62 1030.79 C 369.7 985.85 409.64 942.63 437.93 910.79 M 333.62 1030.79 C 371.59 987.06 410.7 943.21 437.93 910.79 M 339.26 1030.39 C 365.48 1000.31 395.15 967.21 443.57 910.39 M 339.26 1030.39 C 359.87 1004.05 384.12 975.81 443.57 910.39 M 344.25 1030.75 C 371.22 994.82 399.3 962.78 448.56 910.75 M 344.25 1030.75 C 373.73 1001.2 400.43 966.9 448.56 910.75 M 349.89 1030.36 C 388.2 988.78 416.37 947.79 454.2 910.36 M 349.89 1030.36 C 374.01 1005.82 397.06 979.16 454.2 910.36 M 354.88 1030.72 C 394.58 987.02 431.91 948.21 459.19 910.72 M 354.88 1030.72 C 377.46 999.6 403.6 972.93 459.19 910.72 M 360.52 1030.32 C 385.01 998.35 414.88 974.17 464.83 910.32 M 360.52 1030.32 C 390.6 998.69 419.12 963.97 464.83 910.32 M 365.51 1030.68 C 398.25 997.51 422.54 964.28 469.82 910.68 M 365.51 1030.68 C 406.98 988.22 444.17 943.79 469.82 910.68 M 370.49 1031.04 C 408.86 990.41 441.48 952.84 475.46 910.29 M 370.49 1031.04 C 410.38 987.72 453.39 938.48 475.46 910.29 M 376.14 1030.65 C 397.05 1007.07 421.62 982.23 480.45 910.65 M 376.14 1030.65 C 406.06 991.96 440.29 956.78 480.45 910.65 M 381.12 1031.01 C 407.55 995.84 440.54 960.73 486.09 910.26 M 381.12 1031.01 C 403.94 1004.19 425.05 973.99 486.09 910.26 M 386.77 1030.61 C 425.19 990.25 459.35 951.12 491.08 910.62 M 386.77 1030.61 C 420.75 992.4 455.4 953.73 491.08 910.62 M 391.75 1030.97 C 427.87 986.91 473.45 947.57 496.07 910.98 M 391.75 1030.97 C 428.51 989.1 465.12 946.33 496.07 910.98 M 397.4 1030.58 C 430.5 990.41 470.27 945.01 501.71 910.58 M 397.4 1030.58 C 420.72 1002.4 443.15 975.64 501.71 910.58 M 402.38 1030.94 C 439.85 981.84 481.31 936.96 506.7 910.94 M 402.38 1030.94 C 429.53 1002.09 450.27 978.01 506.7 910.94 M 408.03 1030.55 C 444.28 984.84 482.54 939.97 512.34 910.55 M 408.03 1030.55 C 431.43 999.3 455.13 971.86 512.34 910.55 M 413.01 1030.91 C 438.07 1011.58 456.06 985.91 517.33 910.91 M 413.01 1030.91 C 451.81 983.15 491.36 940.13 517.33 910.91 M 418.66 1030.51 C 440.37 1008.21 462.38 977.6 522.97 910.51 M 418.66 1030.51 C 454.02 987.92 494.06 943.11 522.97 910.51 M 423.64 1030.87 C 452.04 993.51 482.25 961.79 527.96 910.87 M 423.64 1030.87 C 446.43 1004.47 471.29 979.71 527.96 910.87 M 429.29 1030.48 C 458.54 992.2 496.96 956.65 533.6 910.48 M 429.29 1030.48 C 472.46 984.85 513.04 937.74 533.6 910.48 M 434.27 1030.84 C 463.94 1001.12 487.61 964.21 538.59 910.84 M 434.27 1030.84 C 459.35 997.29 486.95 966.7 538.59 910.84 M 439.92 1030.44 C 468.07 998.61 487.93 970.05 544.23 910.44 M 439.92 1030.44 C 467.28 994.68 498.95 959.98 544.23 910.44 M 444.9 1030.8 C 482.78 991.07 516.11 956.05 549.22 910.8 M 444.9 1030.8 C 472.41 997.59 502.45 963.64 549.22 910.8 M 450.55 1030.41 C 493.08 982.05 531.62 939.75 554.86 910.41 M 450.55 1030.41 C 469.99 1006.15 490.89 982.07 554.86 910.41 M 455.53 1030.77 C 478.32 1007.28 496.77 983.61 559.85 910.77 M 455.53 1030.77 C 494.04 988.54 532.18 944.17 559.85 910.77 M 461.18 1030.37 C 483.97 1007.06 503.62 977.69 565.49 910.37 M 461.18 1030.37 C 491.82 999.61 520.02 963.76 565.49 910.37 M 466.16 1030.73 C 498.36 997.32 526.03 968.93 570.48 910.73 M 466.16 1030.73 C 494.32 1001.56 521.21 974.01 570.48 910.73 M 471.15 1031.09 C 491.92 1003.8 517.2 981.42 576.12 910.34 M 471.15 1031.09 C 496.66 1003.82 516.99 976.91 576.12 910.34 M 476.79 1030.7 C 517.86 984.23 551.8 945.67 581.11 910.7 M 476.79 1030.7 C 515.6 987.94 552.34 942.69 581.11 910.7 M 481.78 1031.06 C 507.28 1002.16 538.14 964.81 586.75 910.31 M 481.78 1031.06 C 518.7 989.63 557.34 947.74 586.75 910.31 M 487.42 1030.66 C 525.6 986.52 562.64 939.07 591.74 910.67 M 487.42 1030.66 C 513.72 994.54 544.26 963.11 591.74 910.67 M 492.41 1031.02 C 523.57 987.87 564.95 945.48 596.72 911.03 M 492.41 1031.02 C 531.24 986.21 569.44 944.73 596.72 911.03 M 498.05 1030.63 C 525.76 993.82 557.33 965.63 602.37 910.63 M 498.05 1030.63 C 536.05 988.6 573.53 948.48 602.37 910.63 M 503.04 1030.99 C 530.78 1002.37 556.53 972.35 607.35 910.99 M 503.04 1030.99 C 535.3 992.85 568.3 957.42 607.35 910.99 M 508.68 1030.6 C 542.76 991.56 578.62 953.76 613 910.6 M 508.68 1030.6 C 537.08 992.74 567.13 959.24 613 910.6 M 513.67 1030.96 C 552.29 993.47 583.66 953.5 617.98 910.96 M 513.67 1030.96 C 544.39 997.35 572.99 960.65 617.98 910.96 M 519.31 1030.56 C 560.3 984.31 605.67 935.14 623.63 910.56 M 519.31 1030.56 C 545.97 997.83 575.23 963.95 623.63 910.56 M 524.3 1030.92 C 544.43 1001.98 572.08 969.91 628.61 910.92 M 524.3 1030.92 C 558.37 995.57 589.56 956.92 628.61 910.92 M 529.94 1030.53 C 559.82 1000.27 589.33 969.21 634.26 910.53 M 529.94 1030.53 C 568.74 986.24 610.83 938.59 634.26 910.53 M 534.93 1030.89 C 566.26 990.45 605.27 952.42 639.24 910.89 M 534.93 1030.89 C 558.36 1007.02 580.79 980.24 639.24 910.89 M 540.57 1030.49 C 576.73 983.12 615.9 939 644.89 910.49 M 540.57 1030.49 C 576.23 988.46 612.81 947.06 644.89 910.49 M 545.56 1030.85 C 590.52 982.63 623.02 941.2 649.87 910.85 M 545.56 1030.85 C 566.89 1002.81 589 980.13 649.87 910.85 M 551.2 1030.46 C 589.59 983.97 634.18 935.14 655.52 910.46 M 551.2 1030.46 C 591.54 986.99 632.84 941.22 655.52 910.46 M 556.19 1030.82 C 580.47 1003.65 604.14 977.95 660.5 910.82 M 556.19 1030.82 C 586.96 994.55 620.47 958.45 660.5 910.82 M 561.83 1030.42 C 590.83 988.93 622.57 955.31 666.15 910.42 M 561.83 1030.42 C 582.53 1007.9 607.55 980.32 666.15 910.42 M 566.82 1030.78 C 592.57 1004.2 611.56 974.01 671.13 910.78 M 566.82 1030.78 C 596.39 997.16 623.81 964.26 671.13 910.78 M 571.81 1031.14 C 610.28 992.91 644.79 953.92 676.78 910.39 M 571.81 1031.14 C 598.48 1001.7 624.56 971.77 676.78 910.39 M 577.45 1030.75 C 608.08 992.69 647.75 946.61 681.76 910.75 M 577.45 1030.75 C 605.65 997.84 634.38 962.77 681.76 910.75 M 582.44 1031.11 C 622.41 983.7 669.72 939.09 687.41 910.35 M 582.44 1031.11 C 621.39 985.37 656.01 945.79 687.41 910.35 M 588.08 1030.71 C 613.17 1006.4 635.63 973.93 692.39 910.72 M 588.08 1030.71 C 616.05 995.28 645.87 962.57 692.39 910.72 M 593.07 1031.07 C 616.91 1007.37 639.69 981.02 697.38 911.08 M 593.07 1031.07 C 625.79 993.65 656.54 954.18 697.38 911.08 M 598.71 1030.68 C 618.38 1004.32 641.48 984.04 703.02 910.68 M 598.71 1030.68 C 639.07 984.47 683.39 936.4 703.02 910.68 M 603.7 1031.04 C 627.61 1007.25 655.33 978.47 708.01 911.04 M 603.7 1031.04 C 639.9 987.69 679.75 942.19 708.01 911.04 M 609.34 1030.64 C 639.13 1003.19 660.04 970.82 713.65 910.65 M 609.34 1030.64 C 645.77 987.87 682.29 948.37 713.65 910.65 M 614.33 1031 C 649.93 987.39 686.24 944.06 718.64 911.01 M 614.33 1031 C 639.9 1001.1 666.65 968.27 718.64 911.01 M 619.97 1030.61 C 641.35 1004.42 664.08 977 724.28 910.61 M 619.97 1030.61 C 646.25 999.9 675.01 966.4 724.28 910.61 M 624.96 1030.97 C 654.87 994.68 691.89 953.03 729.27 910.97 M 624.96 1030.97 C 667.35 983.61 709.25 934.6 729.27 910.97 M 630.6 1030.58 C 653.66 999.67 683.22 971.66 734.91 910.58 M 630.6 1030.58 C 654.3 1003.14 678.09 978.48 734.91 910.58 M 635.59 1030.94 C 676.95 987.99 707.81 948.74 739.9 910.94 M 635.59 1030.94 C 665.22 992.35 695.48 958.63 739.9 910.94 M 641.23 1030.54 C 666.39 997.64 696.33 965.05 745.54 910.54 M 641.23 1030.54 C 666.65 995.79 695.37 968.06 745.54 910.54 M 646.22 1030.9 C 682.77 989.16 718.76 949.63 750.53 910.9 M 646.22 1030.9 C 680.88 988.65 715.88 945.89 750.53 910.9 M 651.86 1030.51 C 689.28 984.41 730.96 936.92 756.18 910.51 M 651.86 1030.51 C 678.84 996.05 708.99 962.47 756.18 910.51 M 656.85 1030.87 C 681.53 1003.63 706.91 969.9 761.16 910.87 M 656.85 1030.87 C 679.98 1005.57 706.66 977.54 761.16 910.87 M 662.49 1030.47 C 682.52 1003.79 707.83 972.87 766.81 910.47 M 662.49 1030.47 C 692.59 993.88 720.54 960.7 766.81 910.47 M 667.48 1030.83 C 696.26 996.17 724.01 963.16 771.79 910.83 M 667.48 1030.83 C 695.71 995.89 724.94 962.28 771.79 910.83 M 672.47 1031.19 C 707.05 992.96 732.43 963.81 777.44 910.44 M 672.47 1031.19 C 706.5 991.76 741.03 953.85 777.44 910.44 M 678.11 1030.8 C 710.9 991 743.79 954.62 782.42 910.8 M 678.11 1030.8 C 713.19 988.62 751.98 944.96 782.42 910.8 M 683.1 1031.16 C 716.38 993.98 748.1 962.25 788.07 910.4 M 683.1 1031.16 C 704.87 1006.33 725.98 979.95 788.07 910.4 M 688.74 1030.76 C 723.15 991.82 756.64 945.09 793.05 910.76 M 688.74 1030.76 C 729.69 984.48 768.02 942.01 793.05 910.76 M 693.73 1031.12 C 720.24 1002.97 744.04 974.52 798.04 911.12 M 693.73 1031.12 C 729.03 991.84 763.65 953.58 798.04 911.12 M 699.37 1030.73 C 731.73 985.95 772.77 947.14 803.68 910.73 M 699.37 1030.73 C 737.04 987.92 774.61 945.44 803.68 910.73 M 704.36 1031.09 C 723.26 1005.2 750.03 979.74 808.67 911.09 M 704.36 1031.09 C 728.41 1001.58 755.25 972.33 808.67 911.09 M 710 1030.69 C 733.09 1008.02 750.12 984.75 814.31 910.7 M 710 1030.69 C 731.1 1007.43 751.32 983.2 814.31 910.7 M 714.99 1031.05 C 748.85 991.43 790.45 947.3 819.3 911.06 M 714.99 1031.05 C 751.27 989.05 788.33 946.25 819.3 911.06 M 720.63 1030.66 C 748.77 999.78 780.32 961.15 824.94 910.66 M 720.63 1030.66 C 746.44 999.41 776.93 963.02 824.94 910.66 M 725.62 1031.02 C 751.84 994.26 787.97 960.36 829.93 911.02 M 725.62 1031.02 C 763.9 987.57 802.4 944.92 829.93 911.02 M 731.26 1030.63 C 770.77 982.97 809.65 935.7 835.57 910.63 M 731.26 1030.63 C 758.3 999.97 782.23 972.2 835.57 910.63 M 736.25 1030.99 C 759.42 1003.15 784.67 979.06 840.56 910.99 M 736.25 1030.99 C 756.4 1002.25 781.98 973.58 840.56 910.99 M 741.89 1030.59 C 787.24 982.43 823.46 934.98 846.2 910.59 M 741.89 1030.59 C 769.36 997.09 802.02 961.8 846.2 910.59 M 746.88 1030.95 C 786.14 981.14 826.35 937.23 851.19 910.95 M 746.88 1030.95 C 773.07 998.19 799.9 969.36 851.19 910.95 M 752.52 1030.56 C 779.36 998.31 802.91 973 856.83 910.56 M 752.52 1030.56 C 792.82 983.02 835.52 939.02 856.83 910.56 M 757.51 1030.92 C 788.51 989.46 822.23 955.49 860.51 912.43 M 757.51 1030.92 C 794.95 988.78 827.93 950.07 860.51 912.43 M 763.15 1030.52 C 804.94 988.01 841.22 946.53 864.18 914.3 M 763.15 1030.52 C 792.95 994.47 821.14 960.52 864.18 914.3 M 768.14 1030.88 C 797.31 998.28 831.86 959.27 867.86 916.17 M 768.14 1030.88 C 788.41 1006.07 807.56 983.01 867.86 916.17 M 773.12 1031.24 C 797.11 1009.25 816.51 981.22 869.56 920.3 M 773.12 1031.24 C 809.52 988.25 850.9 942.08 869.56 920.3 M 778.77 1030.85 C 807.82 1007.17 829.94 975.61 870.61 925.19 M 778.77 1030.85 C 804.62 1001.2 830.44 973.28 870.61 925.19 M 783.75 1031.21 C 812.46 996.16 839.3 962.42 871.01 930.83 M 783.75 1031.21 C 818.11 994.34 852.09 952.42 871.01 930.83 M 789.4 1030.81 C 810.71 1012.06 824.91 986.75 870.75 937.23 M 789.4 1030.81 C 809.13 1011.38 824.46 990.28 870.75 937.23 M 794.38 1031.17 C 819.86 1002.69 847.23 969.91 871.14 942.87 M 794.38 1031.17 C 813.37 1011.96 831.82 987.52 871.14 942.87 M 800.03 1030.78 C 811.18 1015.88 831.34 999.02 870.88 949.27 M 800.03 1030.78 C 819.54 1008.62 842.15 985.35 870.88 949.27 M 805.01 1031.14 C 829.37 1010.42 844.73 986.59 870.62 955.67 M 805.01 1031.14 C 817.09 1013.71 830.26 999.85 870.62 955.67 M 810.66 1030.74 C 835.22 1006.76 857.21 974.05 871.01 961.31 M 810.66 1030.74 C 825.19 1009.55 842.21 993.4 871.01 961.31 M 815.64 1031.1 C 833.64 1011.67 855.78 985.05 870.75 967.71 M 815.64 1031.1 C 827.62 1014.86 837.69 1003.2 870.75 967.71 M 821.29 1030.71 C 836.92 1007.51 851.36 989.24 871.15 973.35 M 821.29 1030.71 C 832.28 1018.29 838.85 1007.69 871.15 973.35 M 826.27 1031.07 C 840.57 1015.97 854.15 999.71 870.89 979.75 M 826.27 1031.07 C 839.44 1013.5 852.49 1001.42 870.89 979.75 M 831.92 1030.68 C 841.5 1016.12 854.76 1004.85 870.62 986.15 M 831.92 1030.68 C 843.38 1020.48 851.49 1005.14 870.62 986.15 M 836.9 1031.04 C 847.35 1022.82 856.46 1014.82 871.02 991.79 M 836.9 1031.04 C 847.72 1017.45 862.91 1003.53 871.02 991.79 M 842.55 1030.64 C 849.27 1020.17 854.55 1011.38 870.76 998.19 M 842.55 1030.64 C 847.84 1023.23 856.81 1016.54 870.76 998.19 M 847.53 1031 C 851.16 1024.12 857.94 1012.57 871.15 1003.83 M 847.53 1031 C 850.85 1026.11 855.6 1018.85 871.15 1003.83 M 853.18 1030.61 C 860.86 1025.9 869.18 1017.33 870.89 1010.23 M 853.18 1030.61 C 856.86 1024.94 863.28 1019.66 870.89 1010.23 M 860.13 1028.7 C 864.33 1023.52 865.31 1017.09 870.63 1016.63 M 860.13 1028.7 C 863.12 1026.72 867.65 1023.08 870.63 1016.63" fill="none" stroke="#e1d5e7" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 268 910 M 268 910 C 438.09 909.96 605.33 912.67 852 910 M 268 910 C 441.14 905.32 615.05 906.17 852 910 M 852 910 C 863.57 909.15 873.62 917.21 870 928 M 852 910 C 865.2 908.4 865.77 911.93 870 928 M 870 928 C 873.03 950.91 869.44 974.03 870 1012 M 870 928 C 869.55 950.07 869.4 968.73 870 1012 M 870 1012 C 867.2 1025.15 867.71 1026.5 852 1030 M 870 1012 C 867.28 1022.29 863.18 1030.43 852 1030 M 852 1030 C 683.2 1032.81 513.6 1033.67 268 1030 M 852 1030 C 699.96 1034.03 548.69 1034.2 268 1030 M 268 1030 C 253.05 1031.35 251.11 1023.19 250 1012 M 268 1030 C 256.27 1030.04 253.79 1024.48 250 1012 M 250 1012 C 250.84 997.96 246.31 979.96 250 928 M 250 1012 C 250.04 985.68 249.05 957.23 250 928 M 250 928 C 246.95 917.51 252.52 907.05 268 910 M 250 928 C 250.76 916.83 260.08 914.16 268 910" fill="none" stroke="#9673a6" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 410 970 L 496.63 970" fill="none" stroke="none" pointer-events="stroke"/><path d="M 501.88 970 L 494.88 973.5 L 496.63 970 L 494.88 966.5 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 410 970 M 410 970 C 437.29 971.58 470.89 967.8 496.63 970 M 410 970 C 438.38 970.97 463.5 970.31 496.63 970" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 494.67 966.74 C 494.67 966.74 494.67 966.74 494.67 966.74 M 494.67 966.74 C 494.67 966.74 494.67 966.74 494.67 966.74 M 497.03 970.12 C 497.28 969.46 497.42 969.37 498.35 968.61 M 497.03 970.12 C 497.27 969.92 497.66 969.54 498.35 968.61" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 501.88 970 M 501.88 970 C 500.13 970.33 497.17 972.42 494.88 973.5 M 501.88 970 C 500.03 970.59 496.91 971.52 494.88 973.5 M 494.88 973.5 C 495.3 972.63 496.96 971.22 496.63 970 M 494.88 973.5 C 495.02 972.97 495.42 971.63 496.63 970 M 496.63 970 C 495.54 969.37 495.13 968.67 494.88 966.5 M 496.63 970 C 496.21 968.87 495.25 967.32 494.88 966.5 M 494.88 966.5 C 498.87 969.09 498.53 969.72 501.88 970 M 494.88 966.5 C 496.28 966.65 498.68 967.39 501.88 970" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 970px; margin-left: 457px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 12px;" face="Verdana">key event</font></div></div></div></foreignObject><text x="457" y="975" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">key event</text></switch></g><rect x="290" y="940" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 301.12 939.59 L 403.48 939.5 L 410.76 943.32 L 412.94 952.77 L 407.12 997.09 L 407.81 1000.85 L 398.83 999.82 L 298.29 1001.74 L 290.66 1001.57 L 291.01 994.47 L 291.61 945.63 L 289.5 939.74 L 299.89 937.5" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 299 940 M 299 940 C 335.65 938.15 374.73 939.28 401 940 M 299 940 C 320.88 941.84 340.76 940.54 401 940 M 401 940 C 408.5 940.53 406.43 943.89 410 949 M 401 940 C 407.75 940.56 407.29 945.39 410 949 M 410 949 C 411.08 960.47 412.54 970.06 410 991 M 410 949 C 409.77 965.29 408.07 979.09 410 991 M 410 991 C 413.13 999.06 407.44 997.82 401 1000 M 410 991 C 405.58 997.92 404.36 1004.03 401 1000 M 401 1000 C 375.52 996.74 348.82 999.78 299 1000 M 401 1000 C 379 998.07 361.46 1000.53 299 1000 M 299 1000 C 294.67 1002.02 293.06 1000.53 290 991 M 299 1000 C 296.75 1000.18 289.09 997.77 290 991 M 290 991 C 289.25 979.92 289.54 966.49 290 949 M 290 991 C 291.11 979.08 289.89 971.27 290 949 M 290 949 C 292.13 941.43 289.38 936.67 299 940 M 290 949 C 287.34 944.56 290.68 940.01 299 940" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 970px; margin-left: 291px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">scan central matrix</font></div></div></div></foreignObject><text x="350" y="975" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">scan central ma...</text></switch></g><path d="M 623 970 L 706.76 970" fill="none" stroke="none" pointer-events="stroke"/><path d="M 712.01 970 L 705.01 973.5 L 706.76 970 L 705.01 966.5 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 623 970 M 623 970 C 652.68 967.38 682.95 974.45 706.76 970 M 623 970 C 649.59 972.68 679.86 971.63 706.76 970" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 704.9 966.63 C 704.9 966.63 704.9 966.63 704.9 966.63 M 704.9 966.63 C 704.9 966.63 704.9 966.63 704.9 966.63 M 707.26 970.01 C 707.6 969.34 708.12 969.19 708.57 968.5 M 707.26 970.01 C 707.8 969.71 707.89 969.15 708.57 968.5" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 712.01 970 M 712.01 970 C 709.82 972.69 705.39 973.88 705.01 973.5 M 712.01 970 C 708.98 971.77 707.25 971.86 705.01 973.5 M 705.01 973.5 C 705.7 971.47 706.7 970.33 706.76 970 M 705.01 973.5 C 705.73 972.44 706.33 971.58 706.76 970 M 706.76 970 C 706.8 969.01 705.11 967.11 705.01 966.5 M 706.76 970 C 706.22 968.75 705.27 967.39 705.01 966.5 M 705.01 966.5 C 706.86 968.99 710.11 967.71 712.01 970 M 705.01 966.5 C 706.28 966.79 707.71 967.93 712.01 970" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="503" y="940" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 514.13 938.04 L 615.23 944.08 L 619.38 942.22 L 626.71 951.8 L 621.93 996.71 L 618.7 997.04 L 617.7 996.81 L 509.67 1000.66 L 501.67 1000.98 L 503.42 990.68 L 504 945.01 L 501.6 938.79 L 515 938.93" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 512 940 M 512 940 C 552.19 935.21 590.24 939.26 614 940 M 512 940 C 537.34 940.03 563.37 938.71 614 940 M 614 940 C 616.56 940.13 621.14 946.38 623 949 M 614 940 C 616.94 938.8 618.66 947.1 623 949 M 623 949 C 620.97 962.07 622.74 983.84 623 991 M 623 949 C 623.49 966.02 622.25 978.93 623 991 M 623 991 C 623.19 994.05 620.38 999.34 614 1000 M 623 991 C 621.55 993.08 621.66 999.94 614 1000 M 614 1000 C 581.76 996.17 549.62 995.73 512 1000 M 614 1000 C 591.95 999.6 572.38 1001.01 512 1000 M 512 1000 C 508.07 999.15 504.24 998.95 503 991 M 512 1000 C 503.28 997.68 503.25 992.63 503 991 M 503 991 C 501.83 975.4 504.65 954.88 503 949 M 503 991 C 501.49 975.72 502.69 959.24 503 949 M 503 949 C 506.04 946.8 507.88 938.27 512 940 M 503 949 C 503.51 939.58 502.62 937.92 512 940" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 970px; margin-left: 504px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">process key</font></div></div></div></foreignObject><text x="563" y="975" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">process key</text></switch></g><rect x="713.13" y="940" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 724.26 938.72 L 830.17 941.8 L 827.44 945.58 L 835.17 946.68 L 832.6 991.12 L 833.62 997.89 L 822.92 1002.54 L 721.2 997.72 L 717.56 1000.23 L 709.89 987.66 L 715.81 952.02 L 712.43 940.94 L 722.05 938" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 722.13 940 M 722.13 940 C 742.78 936.71 760.91 942.3 824.13 940 M 722.13 940 C 757.05 943.67 789.94 942.24 824.13 940 M 824.13 940 C 827.75 936.24 836.9 943.79 833.13 949 M 824.13 940 C 827.79 935.4 828.74 944.92 833.13 949 M 833.13 949 C 831.32 959.95 832.14 969.74 833.13 991 M 833.13 949 C 832.7 962.72 833.17 979.44 833.13 991 M 833.13 991 C 832.5 998.02 830.27 1003.51 824.13 1000 M 833.13 991 C 835.68 1001.02 826.9 1002.88 824.13 1000 M 824.13 1000 C 786.18 1001.01 739.41 997.8 722.13 1000 M 824.13 1000 C 787.81 1000.27 749.55 1002.37 722.13 1000 M 722.13 1000 C 713.12 999.55 712.13 998.9 713.13 991 M 722.13 1000 C 714.33 1000.95 711.19 1001.4 713.13 991 M 713.13 991 C 712.61 980.05 712.83 962.17 713.13 949 M 713.13 991 C 712.3 976.99 712.72 964.89 713.13 949 M 713.13 949 C 709.66 946.48 716.48 940.01 722.13 940 M 713.13 949 C 710.67 946.67 715.23 943.15 722.13 940" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 970px; margin-left: 714px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">send report<br /></font></div></div></div></foreignObject><text x="773" y="975" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">send report
+</style></defs><g><rect x="0" y="530" width="1140" height="540" rx="48.6" ry="48.6" fill="none" stroke="none" pointer-events="all"/><path d="M 15.28 539.41 C 15.28 539.41 15.28 539.41 15.28 539.41 M 15.28 539.41 C 15.28 539.41 15.28 539.41 15.28 539.41 M 7.15 554.87 C 14.9 553.25 15.12 543.11 24.86 534.49 M 7.15 554.87 C 10.67 551.11 16.06 545.62 24.86 534.49 M 4.92 563.53 C 12.5 554.59 18.45 546.1 29.85 534.85 M 4.92 563.53 C 13.01 557.16 17.14 550.29 29.85 534.85 M 1.38 573.7 C 13.79 562.36 24.48 542.64 35.49 534.45 M 1.38 573.7 C 12.64 558.6 26.08 544.71 35.49 534.45 M 1.11 580.1 C 16.65 565.87 29.65 543.97 41.79 533.31 M 1.11 580.1 C 8.11 572.08 18.11 562.81 41.79 533.31 M 1.51 585.74 C 16.07 571.79 24.19 556.29 49.4 530.65 M 1.51 585.74 C 14.99 569.89 24.79 555.93 49.4 530.65 M 1.25 592.14 C 15.81 573.27 31.7 559.54 54.39 531.01 M 1.25 592.14 C 17.53 573.79 32.36 555.25 54.39 531.01 M 1.64 597.78 C 19.89 568.18 46.35 543.86 60.03 530.61 M 1.64 597.78 C 20.91 573.8 39 553.4 60.03 530.61 M 1.38 604.18 C 23.15 578.49 47.47 552.39 65.02 530.97 M 1.38 604.18 C 18.44 584.1 39.28 564.38 65.02 530.97 M 1.12 610.58 C 18.77 586.96 40.58 565.14 70.66 530.58 M 1.12 610.58 C 27.51 581.45 47.5 555.56 70.66 530.58 M 1.51 616.22 C 24.54 588.28 56.9 554 75.65 530.94 M 1.51 616.22 C 18.71 599.74 32.68 579.94 75.65 530.94 M 1.25 622.62 C 28.43 597.82 54.07 565.18 81.29 530.54 M 1.25 622.62 C 32.25 586.31 62.67 550.92 81.29 530.54 M 1.65 628.26 C 36.33 593.97 65.44 551.47 86.28 530.9 M 1.65 628.26 C 22.38 604.17 44.25 583.34 86.28 530.9 M 1.39 634.66 C 34.44 595.02 63.65 557.21 91.92 530.51 M 1.39 634.66 C 37.06 591.62 71.98 553.92 91.92 530.51 M 1.12 641.06 C 24.42 609.86 53.81 580.19 96.91 530.87 M 1.12 641.06 C 24.88 610.23 50.55 582.23 96.91 530.87 M 1.52 646.7 C 29.74 612.22 53.73 587.64 102.55 530.47 M 1.52 646.7 C 39.71 600.56 80.29 554.87 102.55 530.47 M 1.26 653.1 C 29.94 616.86 59.98 590.13 107.54 530.83 M 1.26 653.1 C 35.97 615.83 66.91 576.42 107.54 530.83 M 1.65 658.74 C 38.78 611.5 81.86 556.77 113.18 530.44 M 1.65 658.74 C 27.89 628.81 51.91 599.19 113.18 530.44 M 1.39 665.14 C 25.23 634.09 51.6 608.91 118.17 530.8 M 1.39 665.14 C 39.73 624.51 72.4 582.41 118.17 530.8 M 1.13 671.54 C 32.56 629.38 66.59 594.64 123.81 530.41 M 1.13 671.54 C 35.38 625.45 74.15 582.59 123.81 530.41 M 1.52 677.18 C 29.02 647.78 57.83 620.41 128.8 530.77 M 1.52 677.18 C 38.54 632.22 76.4 588.08 128.8 530.77 M 1.26 683.58 C 42.06 640.77 78.45 600.51 134.44 530.37 M 1.26 683.58 C 28.79 653.96 56.83 620.57 134.44 530.37 M 1.66 689.22 C 39.64 644.35 75.1 605.13 139.43 530.73 M 1.66 689.22 C 38.47 649.13 74.07 606.17 139.43 530.73 M 1.4 695.62 C 56.57 634.24 116.06 563.02 145.07 530.34 M 1.4 695.62 C 41.82 649.12 81.57 603.63 145.07 530.34 M 1.13 702.02 C 47.24 646.31 93.27 597.33 150.06 530.7 M 1.13 702.02 C 44.13 652.91 86.38 606.57 150.06 530.7 M 1.53 707.66 C 46.06 655.85 90.31 603 155.7 530.3 M 1.53 707.66 C 33.68 671.72 66.62 631.99 155.7 530.3 M 1.27 714.06 C 66.94 642.38 129.47 569.68 160.69 530.66 M 1.27 714.06 C 64.54 643.12 126.12 572.99 160.69 530.66 M 1.66 719.7 C 53.52 668.23 97.93 616.21 165.68 531.02 M 1.66 719.7 C 55.88 657.24 112.21 594.86 165.68 531.02 M 1.4 726.1 C 32.61 684.53 69.27 644.51 171.32 530.63 M 1.4 726.1 C 48.13 671.04 99.23 615.68 171.32 530.63 M 1.14 732.49 C 59.24 663.24 116.59 599.11 176.31 530.99 M 1.14 732.49 C 48.32 677.88 96.06 624.73 176.31 530.99 M 1.53 738.14 C 39.1 695.43 75.03 647.6 181.95 530.59 M 1.53 738.14 C 49.06 681.88 98.9 623.97 181.95 530.59 M 1.27 744.54 C 54.27 685.11 105.58 626.67 186.94 530.95 M 1.27 744.54 C 50.59 692.19 98.28 636.55 186.94 530.95 M 1.67 750.18 C 63.8 674.6 124.26 606 192.58 530.56 M 1.67 750.18 C 57.77 688.59 113.7 625.79 192.58 530.56 M 1.41 756.58 C 74.57 673.55 153.88 585.82 197.57 530.92 M 1.41 756.58 C 57.32 692.56 114.24 630.91 197.57 530.92 M 1.14 762.97 C 48.08 710.02 91.35 660.55 203.21 530.52 M 1.14 762.97 C 47.21 703.89 98.15 647.68 203.21 530.52 M 1.54 768.62 C 41.32 716.48 88.96 666.16 208.2 530.88 M 1.54 768.62 C 68.9 687.49 139.52 608.63 208.2 530.88 M 1.28 775.02 C 44.61 721.82 96.59 667.47 213.84 530.49 M 1.28 775.02 C 75.54 689.95 146.59 609.48 213.84 530.49 M 1.67 780.66 C 72.81 702.16 140.23 623.49 218.83 530.85 M 1.67 780.66 C 75.54 697.99 145.88 617.44 218.83 530.85 M 1.41 787.06 C 43.65 737.3 89.31 682.97 224.47 530.45 M 1.41 787.06 C 77.3 703.23 148.76 619.47 224.47 530.45 M 1.15 793.45 C 82.21 700.01 166.96 603.17 229.46 530.82 M 1.15 793.45 C 90.52 691.87 180.86 588.76 229.46 530.82 M 1.54 799.1 C 75.1 717.11 144.82 635.24 235.1 530.42 M 1.54 799.1 C 56.23 734.97 113.98 667.61 235.1 530.42 M 1.28 805.49 C 57.58 738.74 119.11 672.06 240.09 530.78 M 1.28 805.49 C 92.12 697.77 182.42 593.38 240.09 530.78 M 1.68 811.14 C 53.25 751.56 101.55 691.62 245.73 530.39 M 1.68 811.14 C 71.7 727.5 142.97 644.58 245.73 530.39 M 1.42 817.54 C 83.92 722.61 164.47 629.31 250.72 530.75 M 1.42 817.54 C 91.39 713.45 184.4 608.32 250.72 530.75 M 1.15 823.93 C 68.31 742.2 136.39 665.37 256.36 530.35 M 1.15 823.93 C 88.4 723.9 175.01 625.1 256.36 530.35 M 1.55 829.58 C 102.8 710.64 206.72 594.95 261.35 530.71 M 1.55 829.58 C 90.3 722.42 179.46 618.92 261.35 530.71 M 1.29 835.97 C 100.92 722.91 201.54 608.58 266.99 530.32 M 1.29 835.97 C 62.49 769.75 120.18 702.12 266.99 530.32 M 1.03 842.37 C 91.65 737.21 179.69 633.76 271.98 530.68 M 1.03 842.37 C 91.22 739.47 183.3 632.82 271.98 530.68 M 1.42 848.02 C 74.87 762.15 152.3 674.09 276.96 531.04 M 1.42 848.02 C 71.52 765.94 143.32 681.35 276.96 531.04 M 1.16 854.41 C 66.58 779.87 134.24 704.06 282.61 530.64 M 1.16 854.41 C 76.5 768.29 151.28 682.82 282.61 530.64 M 1.55 860.06 C 79.56 768.18 161.98 678.7 287.59 531 M 1.55 860.06 C 94.41 751.27 190.06 640.75 287.59 531 M 1.29 866.45 C 87.06 770.69 172.69 670.21 293.24 530.61 M 1.29 866.45 C 89.02 766.13 173.44 667.93 293.24 530.61 M 1.03 872.85 C 107.19 747.7 215.36 622.34 298.22 530.97 M 1.03 872.85 C 121.9 735.5 238.83 599.75 298.22 530.97 M 1.42 878.49 C 97.66 763.02 195.09 651.28 303.87 530.57 M 1.42 878.49 C 90.55 780.58 176.44 681.74 303.87 530.57 M 1.16 884.89 C 70.4 804.4 142.85 724.26 308.85 530.93 M 1.16 884.89 C 113.08 753.51 226.84 624.26 308.85 530.93 M 1.56 890.54 C 69.92 809.65 142.9 730.91 314.5 530.54 M 1.56 890.54 C 108.84 763.55 217.15 636.67 314.5 530.54 M 1.3 896.93 C 83.19 806.43 161.35 714.86 319.49 530.9 M 1.3 896.93 C 77.93 805.59 154.99 716.66 319.49 530.9 M 1.03 903.33 C 101.5 789.84 199.99 677.94 325.13 530.5 M 1.03 903.33 C 98.36 793.52 193.28 683.45 325.13 530.5 M 1.43 908.97 C 116.28 772.99 230.76 641.9 330.12 530.86 M 1.43 908.97 C 127.41 763.95 254.15 617.01 330.12 530.86 M 1.17 915.37 C 131.16 765.4 258.62 617.16 335.76 530.47 M 1.17 915.37 C 124.01 775.84 243.7 636.6 335.76 530.47 M 1.56 921.02 C 112.56 798.94 218.96 676.44 340.75 530.83 M 1.56 921.02 C 81.66 830.99 159.38 741.5 340.75 530.83 M 1.3 927.41 C 101.36 813.39 200.67 702.23 346.39 530.44 M 1.3 927.41 C 103.25 806.23 205.54 688.84 346.39 530.44 M 1.04 933.81 C 101.56 820.79 201.48 706.37 351.38 530.8 M 1.04 933.81 C 134.97 781.08 267.76 631.03 351.38 530.8 M 1.43 939.45 C 117 807.64 232.13 673.9 357.02 530.4 M 1.43 939.45 C 102.01 819.07 203.78 701.57 357.02 530.4 M 1.17 945.85 C 84.84 844.84 174.62 744.47 362.01 530.76 M 1.17 945.85 C 112.52 820.03 220.51 694.18 362.01 530.76 M 1.57 951.49 C 92.81 850.08 179.75 749.69 367.65 530.37 M 1.57 951.49 C 87.43 856.91 170 761.23 367.65 530.37 M 1.31 957.89 C 123.74 818.63 244.9 676.01 372.64 530.73 M 1.31 957.89 C 93.75 849.83 185.86 744.03 372.64 530.73 M 1.04 964.29 C 101.84 847.17 200.26 733.86 378.28 530.33 M 1.04 964.29 C 85.56 860.82 172.29 760.11 378.28 530.33 M 1.44 969.93 C 133.75 811.14 271.82 653.46 383.27 530.69 M 1.44 969.93 C 133.73 822.67 262.21 674.4 383.27 530.69 M 1.18 976.33 C 93.36 869.54 185.17 764.3 388.25 531.05 M 1.18 976.33 C 133.64 823.43 265.4 672.21 388.25 531.05 M 1.57 981.97 C 109.67 859.49 216.84 738.08 393.9 530.66 M 1.57 981.97 C 96.03 871.18 193.19 758.71 393.9 530.66 M 1.31 988.37 C 122.65 849.1 243.42 714.62 398.88 531.02 M 1.31 988.37 C 83.89 893.01 167.82 797.53 398.88 531.02 M 1.05 994.77 C 114.29 869.72 228.68 738.44 404.53 530.62 M 1.05 994.77 C 136.29 838.24 273.45 681.35 404.53 530.62 M 1.44 1000.41 C 80.5 902.76 165.91 807.64 409.51 530.98 M 1.44 1000.41 C 86.9 895.15 177.32 792.09 409.51 530.98 M 1.18 1006.81 C 143.51 843.48 288.82 676.26 415.16 530.59 M 1.18 1006.81 C 137.66 847.49 274.79 688.5 415.16 530.59 M 1.58 1012.45 C 170.92 818.31 337.35 626.49 420.14 530.95 M 1.58 1012.45 C 158.27 836.29 312.66 659.93 420.14 530.95 M 1.32 1018.85 C 128.99 878.45 250.99 732.64 425.79 530.55 M 1.32 1018.85 C 102.84 906.5 200.61 793.77 425.79 530.55 M 1.05 1025.25 C 147.56 856.89 299.47 684.74 430.77 530.91 M 1.05 1025.25 C 163.09 843.18 322.64 659.64 430.77 530.91 M 2.76 1029.38 C 131.8 886.66 256.41 739 436.42 530.52 M 2.76 1029.38 C 172.4 832.51 344.81 634.15 436.42 530.52 M 3.81 1034.27 C 97.74 926.8 193.36 818.51 441.4 530.88 M 3.81 1034.27 C 168.22 846.84 331.04 658.3 441.4 530.88 M 5.52 1038.4 C 171.59 846.16 333.86 659.58 447.05 530.49 M 5.52 1038.4 C 122.34 906.43 239.42 770.61 447.05 530.49 M 6.57 1043.29 C 161.38 856.38 321.87 672.5 452.03 530.85 M 6.57 1043.29 C 109.43 925.58 212.71 807.29 452.03 530.85 M 7.62 1048.18 C 150.42 887.65 291.16 724.69 457.68 530.45 M 7.62 1048.18 C 122 922.91 233.37 796.16 457.68 530.45 M 8.67 1053.07 C 129.12 917.14 245.49 780.73 462.66 530.81 M 8.67 1053.07 C 107.08 939.27 209.31 823.08 462.66 530.81 M 11.69 1055.69 C 171.18 871.8 329.42 688.12 468.31 530.42 M 11.69 1055.69 C 113.03 939.92 213.02 825.48 468.31 530.42 M 14.05 1059.07 C 191.56 853.09 372.42 647.8 473.29 530.78 M 14.05 1059.07 C 171.55 871.73 333.09 685.42 473.29 530.78 M 17.07 1061.7 C 143.36 912.59 273.04 766.84 478.94 530.38 M 17.07 1061.7 C 123.29 940.06 227.52 819.47 478.94 530.38 M 20.09 1064.32 C 175.99 886.92 331.3 708.21 483.92 530.74 M 20.09 1064.32 C 126.35 935.42 235.74 809.19 483.92 530.74 M 23.76 1066.19 C 179.39 887.5 336.92 703.49 489.57 530.35 M 23.76 1066.19 C 208.61 857.77 390.97 650.42 489.57 530.35 M 28.75 1066.55 C 159.21 921.7 286.14 775.33 494.55 530.71 M 28.75 1066.55 C 129.21 947.45 231.34 831.41 494.55 530.71 M 33.08 1067.67 C 190.77 884.23 347.81 700.96 500.2 530.31 M 33.08 1067.67 C 220.27 852.92 406.1 640.29 500.2 530.31 M 37.41 1068.78 C 184.52 905.67 329.33 739.23 505.18 530.67 M 37.41 1068.78 C 157.39 933.93 278.15 794.61 505.18 530.67 M 42.4 1069.14 C 197.04 886.8 351.95 706.8 510.17 531.03 M 42.4 1069.14 C 136.86 961.76 233.95 850.35 510.17 531.03 M 46.73 1070.26 C 198.14 894.4 350.28 720.16 515.81 530.64 M 46.73 1070.26 C 158.22 941.2 269.31 812.15 515.81 530.64 M 50.41 1072.13 C 211.56 894.76 367.99 715.03 520.8 531 M 50.41 1072.13 C 209.75 881.87 371.77 694.64 520.8 531 M 56.05 1071.73 C 204.81 896.83 357.92 720.25 526.44 530.6 M 56.05 1071.73 C 179.37 936.2 300.36 797.26 526.44 530.6 M 61.04 1072.09 C 245.86 856.17 435.29 642.07 531.43 530.96 M 61.04 1072.09 C 166.71 955.09 270.4 837.36 531.43 530.96 M 66.68 1071.7 C 219.81 895.99 372.52 724.25 537.07 530.57 M 66.68 1071.7 C 229.84 890.15 389.31 707.1 537.07 530.57 M 71.67 1072.06 C 237.43 881.95 405.42 691.62 542.06 530.93 M 71.67 1072.06 C 254.05 859.81 438.17 649.39 542.06 530.93 M 77.31 1071.66 C 173.99 959.18 272.41 842.95 547.7 530.53 M 77.31 1071.66 C 230.36 895.28 385.56 717.64 547.7 530.53 M 82.3 1072.02 C 211.65 924.61 339.12 779.33 552.69 530.89 M 82.3 1072.02 C 224.13 909.19 365.94 746.33 552.69 530.89 M 87.94 1071.63 C 244.17 901.18 393.38 726.47 558.33 530.5 M 87.94 1071.63 C 269.28 866.87 450.5 659.35 558.33 530.5 M 92.93 1071.99 C 268.01 864.37 449.61 656.08 563.32 530.86 M 92.93 1071.99 C 264.96 872.35 435.45 674.23 563.32 530.86 M 98.57 1071.59 C 222.66 933.01 342.9 791.87 568.96 530.47 M 98.57 1071.59 C 234.16 911.08 371.29 753.79 568.96 530.47 M 103.56 1071.95 C 278.24 873.01 449.07 672.97 573.95 530.83 M 103.56 1071.95 C 223.65 934.81 346.29 793.23 573.95 530.83 M 109.2 1071.56 C 235.48 930.61 358.53 791.48 579.59 530.43 M 109.2 1071.56 C 273.25 881.73 439.37 691.48 579.59 530.43 M 114.19 1071.92 C 243.53 929.94 367.56 784.82 584.58 530.79 M 114.19 1071.92 C 222.36 946.95 333.77 817.71 584.58 530.79 M 119.83 1071.52 C 229.64 938.99 346.34 807.34 590.22 530.4 M 119.83 1071.52 C 260.4 916.72 396.29 758.66 590.22 530.4 M 124.82 1071.88 C 298.58 868.89 478.03 666.94 595.21 530.76 M 124.82 1071.88 C 223.45 959.12 325.13 841.63 595.21 530.76 M 130.46 1071.49 C 297.65 885.64 459.79 700.38 600.85 530.36 M 130.46 1071.49 C 293.96 883.34 459.65 692.24 600.85 530.36 M 135.45 1071.85 C 294.16 887.41 452.4 702.07 605.84 530.72 M 135.45 1071.85 C 271.4 918.03 408.63 759.52 605.84 530.72 M 141.09 1071.45 C 235.27 959.19 331.36 848.71 611.48 530.33 M 141.09 1071.45 C 326.62 856.43 513.57 641.7 611.48 530.33 M 146.08 1071.81 C 272.12 930.27 395.51 787.71 616.47 530.69 M 146.08 1071.81 C 252.47 953.7 358.03 833.66 616.47 530.69 M 151.06 1072.17 C 273.96 929.39 397.41 786.52 621.46 531.05 M 151.06 1072.17 C 252.61 953.83 353.06 837.48 621.46 531.05 M 156.71 1071.78 C 249.84 963.14 343.23 854.78 627.1 530.65 M 156.71 1071.78 C 317.72 886.8 478.98 701.54 627.1 530.65 M 161.69 1072.14 C 291.91 929.92 416.3 785.77 632.09 531.01 M 161.69 1072.14 C 258.27 961.84 354.19 850.39 632.09 531.01 M 167.34 1071.75 C 297.33 928.14 421.79 785.07 637.73 530.62 M 167.34 1071.75 C 285.98 936.15 405.22 798.07 637.73 530.62 M 172.32 1072.11 C 346.54 870.93 521.62 670.32 642.72 530.98 M 172.32 1072.11 C 315.05 909.46 454.53 748.31 642.72 530.98 M 177.97 1071.71 C 330.45 897.64 483.88 720.97 648.36 530.58 M 177.97 1071.71 C 331.75 890.65 487.34 712.6 648.36 530.58 M 182.95 1072.07 C 289.88 949.87 394.96 829.75 653.35 530.94 M 182.95 1072.07 C 293.13 944.11 404.64 816 653.35 530.94 M 188.6 1071.68 C 330.49 909.77 472.53 748.2 658.99 530.55 M 188.6 1071.68 C 289.57 954.52 388.34 839.45 658.99 530.55 M 193.58 1072.04 C 331.52 913.35 472.39 755.35 663.98 530.91 M 193.58 1072.04 C 323.4 922.77 456.15 768.99 663.98 530.91 M 199.23 1071.64 C 323.71 922.84 450.91 776.99 669.62 530.52 M 199.23 1071.64 C 350.33 903.16 498.29 731.69 669.62 530.52 M 204.21 1072 C 369 885.98 534.09 696.7 674.61 530.88 M 204.21 1072 C 360.31 896.51 515.64 717.17 674.61 530.88 M 209.86 1071.61 C 378.04 880.27 545.59 686.69 680.25 530.48 M 209.86 1071.61 C 364.94 895.58 518.05 720.44 680.25 530.48 M 214.84 1071.97 C 384.82 882.38 550.23 689.76 685.24 530.84 M 214.84 1071.97 C 390.74 863.84 569.54 657.2 685.24 530.84 M 220.49 1071.57 C 336 933.86 457.04 793.98 690.88 530.45 M 220.49 1071.57 C 360.52 914.93 496.1 756.98 690.88 530.45 M 225.47 1071.93 C 407.5 862.26 588.7 656.62 695.87 530.81 M 225.47 1071.93 C 346.81 930.15 470.15 787.79 695.87 530.81 M 231.12 1071.54 C 376.84 912.98 516.85 749.24 701.51 530.41 M 231.12 1071.54 C 389.31 888.67 549.09 706.47 701.51 530.41 M 236.1 1071.9 C 391.5 897.09 544.2 721.53 706.5 530.77 M 236.1 1071.9 C 388.32 898.51 537.83 726.63 706.5 530.77 M 241.75 1071.5 C 421.07 862.89 603.58 654.12 712.14 530.38 M 241.75 1071.5 C 412.59 876.91 585.47 679.39 712.14 530.38 M 246.73 1071.86 C 411.83 881.26 580.95 686.87 717.13 530.74 M 246.73 1071.86 C 395.85 898.49 546.25 724.76 717.13 530.74 M 252.38 1071.47 C 375.59 925.39 503.41 779.85 722.77 530.34 M 252.38 1071.47 C 411.31 892.71 568.45 713.51 722.77 530.34 M 257.37 1071.83 C 386.26 923.88 512.77 781.16 727.76 530.7 M 257.37 1071.83 C 426.92 879.04 595.45 686.89 727.76 530.7 M 263.01 1071.44 C 378.16 938.49 493.55 804.11 733.4 530.31 M 263.01 1071.44 C 438.27 868.52 616.81 663.87 733.4 530.31 M 268 1071.8 C 435.35 875.48 602.44 682.93 738.39 530.67 M 268 1071.8 C 426.8 893.23 584.36 712.29 738.39 530.67 M 272.98 1072.16 C 401.16 921.11 528.93 773.12 743.38 531.03 M 272.98 1072.16 C 416.6 901.04 561.73 734.13 743.38 531.03 M 278.63 1071.76 C 431.54 895.59 580.62 725 749.02 530.63 M 278.63 1071.76 C 411.74 918.54 543.03 768.71 749.02 530.63 M 283.61 1072.12 C 417.24 920.34 545.91 770.64 754.01 530.99 M 283.61 1072.12 C 427.04 913.64 566.65 752.23 754.01 530.99 M 289.26 1071.73 C 456.43 878.8 626.93 683.76 759.65 530.6 M 289.26 1071.73 C 404.26 944.99 516.14 815.46 759.65 530.6 M 294.24 1072.09 C 395.51 959.99 495.77 844.31 764.64 530.96 M 294.24 1072.09 C 480.39 861.91 664.44 651.33 764.64 530.96 M 299.89 1071.69 C 434.42 916.11 567.42 762.72 770.28 530.57 M 299.89 1071.69 C 480.46 861.72 662.19 651.88 770.28 530.57 M 304.87 1072.05 C 405.81 958.61 502.52 844.04 775.27 530.93 M 304.87 1072.05 C 403.71 960.93 500.89 848.2 775.27 530.93 M 310.52 1071.66 C 404.03 960.08 500.79 850.09 780.91 530.53 M 310.52 1071.66 C 453.98 900.52 598.47 733.21 780.91 530.53 M 315.5 1072.02 C 430.98 936.6 546.8 801 785.9 530.89 M 315.5 1072.02 C 428.69 943.12 536.25 818.36 785.9 530.89 M 321.15 1071.62 C 432.45 942.09 546.24 807.95 791.54 530.5 M 321.15 1071.62 C 471.08 898.19 618.99 727.97 791.54 530.5 M 326.13 1071.98 C 445.78 937.49 566.27 798.01 796.53 530.86 M 326.13 1071.98 C 477.13 894.32 628.25 721.53 796.53 530.86 M 331.78 1071.59 C 437.08 953.04 539.82 834.5 802.17 530.46 M 331.78 1071.59 C 487.5 888.36 645.78 704.92 802.17 530.46 M 336.76 1071.95 C 438.41 955.49 536.95 839.8 807.16 530.82 M 336.76 1071.95 C 437.45 963.6 532.63 853.63 807.16 530.82 M 342.41 1071.55 C 510.12 878.38 678.78 685.12 812.8 530.43 M 342.41 1071.55 C 449.27 949.61 555.71 828.52 812.8 530.43 M 347.39 1071.91 C 475.73 926.48 604.67 777.04 817.79 530.79 M 347.39 1071.91 C 528.46 870.13 706.29 663.42 817.79 530.79 M 353.04 1071.52 C 544.13 853.99 730.13 640.82 823.43 530.39 M 353.04 1071.52 C 469.29 938.36 585.83 805.22 823.43 530.39 M 358.02 1071.88 C 468.16 948.2 579.6 822.71 828.42 530.75 M 358.02 1071.88 C 458.14 955.23 557.91 839.15 828.42 530.75 M 363.67 1071.49 C 486.47 925.1 611.13 782.02 834.06 530.36 M 363.67 1071.49 C 544.84 858.3 729.58 646.08 834.06 530.36 M 368.65 1071.85 C 482.47 944.27 591.11 818.19 839.05 530.72 M 368.65 1071.85 C 487 941.2 601.18 809.93 839.05 530.72 M 374.3 1071.45 C 472.03 957.68 569.16 842.6 844.69 530.32 M 374.3 1071.45 C 507.02 919.04 639.24 769.95 844.69 530.32 M 379.28 1071.81 C 509.34 913.41 642.49 759.33 849.68 530.68 M 379.28 1071.81 C 508.64 923.23 641.65 770.65 849.68 530.68 M 384.27 1072.17 C 508.11 926.01 634.48 780.84 854.66 531.04 M 384.27 1072.17 C 492.29 947.84 602.09 823.14 854.66 531.04 M 389.91 1071.78 C 558.26 885.98 720.99 695.78 860.31 530.65 M 389.91 1071.78 C 538.23 910.64 680.55 745.72 860.31 530.65 M 394.9 1072.14 C 488.78 964.63 584.43 856.67 865.29 531.01 M 394.9 1072.14 C 488.65 958.94 585.12 848.81 865.29 531.01 M 400.54 1071.74 C 516.14 941.62 631.65 809.08 870.94 530.61 M 400.54 1071.74 C 572.76 875.29 744.04 680.48 870.94 530.61 M 405.53 1072.1 C 570.54 877.48 736.02 685.83 875.92 530.97 M 405.53 1072.1 C 531.86 925.48 656.9 780.3 875.92 530.97 M 411.17 1071.71 C 570.94 892.71 724.75 714.18 881.57 530.58 M 411.17 1071.71 C 537.2 920.1 665.75 772.01 881.57 530.58 M 416.16 1072.07 C 603.08 856.5 787.56 642.68 886.55 530.94 M 416.16 1072.07 C 565.75 900.86 714.72 729.67 886.55 530.94 M 421.8 1071.67 C 540.45 936.36 654.56 805.24 892.2 530.55 M 421.8 1071.67 C 575.22 893.6 730.92 716.11 892.2 530.55 M 426.79 1072.03 C 604.14 863.54 785.4 656.54 897.18 530.91 M 426.79 1072.03 C 594.16 874.13 763.31 679.09 897.18 530.91 M 432.43 1071.64 C 599.75 883.42 764.45 688.99 902.83 530.51 M 432.43 1071.64 C 617.91 864.23 802.4 652.58 902.83 530.51 M 437.42 1072 C 575.81 917 708.2 762.42 907.81 530.87 M 437.42 1072 C 547.24 945.49 659.14 817.14 907.81 530.87 M 443.06 1071.6 C 582.89 911.23 724.61 745.97 913.46 530.48 M 443.06 1071.6 C 627.85 862.52 808.1 652.88 913.46 530.48 M 448.05 1071.96 C 581.39 920.93 710.5 767.85 918.44 530.84 M 448.05 1071.96 C 582.8 908.53 721.94 748.61 918.44 530.84 M 453.69 1071.57 C 578.51 926.64 707.09 780.46 924.09 530.44 M 453.69 1071.57 C 559.56 950.91 662.21 832.86 924.09 530.44 M 458.68 1071.93 C 571.24 942.11 687.78 813.27 929.08 530.8 M 458.68 1071.93 C 608.66 901.09 755.53 732.68 929.08 530.8 M 464.32 1071.53 C 611.01 906.14 756.97 739.41 934.72 530.41 M 464.32 1071.53 C 583.37 933.2 703.65 793.18 934.72 530.41 M 469.31 1071.89 C 593.42 933.89 712.75 793.34 939.71 530.77 M 469.31 1071.89 C 647.3 871.76 824.68 667.09 939.71 530.77 M 474.95 1071.5 C 573.44 957.6 671.77 844.3 945.35 530.37 M 474.95 1071.5 C 589.54 936.45 705 804.58 945.35 530.37 M 479.94 1071.86 C 626.5 902.06 774.95 733.12 950.34 530.73 M 479.94 1071.86 C 581.01 960.02 677.36 847.14 950.34 530.73 M 485.58 1071.47 C 591.89 952.1 698.37 831.38 955.98 530.34 M 485.58 1071.47 C 669.12 860.77 854.89 647.87 955.98 530.34 M 490.57 1071.83 C 581.41 959.77 678.01 852.34 960.97 530.7 M 490.57 1071.83 C 603.56 941.59 715.47 814.22 960.97 530.7 M 495.56 1072.19 C 672.58 872.07 844.58 675.11 966.61 530.3 M 495.56 1072.19 C 630.33 916.66 763.52 760.82 966.61 530.3 M 501.2 1071.79 C 609.66 953.19 712.36 834.63 971.6 530.66 M 501.2 1071.79 C 653.27 902.01 805.14 727.99 971.6 530.66 M 506.19 1072.15 C 643.85 915.39 782.57 757.39 976.58 531.02 M 506.19 1072.15 C 677.02 872.51 852.15 671.8 976.58 531.02 M 511.83 1071.76 C 638.52 928.07 763.83 781.15 982.23 530.63 M 511.83 1071.76 C 619.33 943.3 727.95 816.94 982.23 530.63 M 516.82 1072.12 C 625.98 954.21 728.39 833.33 987.21 530.99 M 516.82 1072.12 C 644.43 924.88 775.07 775.01 987.21 530.99 M 522.46 1071.72 C 688.76 881.73 856.98 688.72 992.86 530.6 M 522.46 1071.72 C 700.62 868.32 873.69 669.51 992.86 530.6 M 527.45 1072.08 C 633.63 946.82 741.56 824.76 997.84 530.96 M 527.45 1072.08 C 662.59 914.27 799.5 755.94 997.84 530.96 M 533.09 1071.69 C 666.01 910.35 805.41 753.18 1003.49 530.56 M 533.09 1071.69 C 645.56 935.67 760.34 802.31 1003.49 530.56 M 538.08 1072.05 C 697.32 891.53 853.23 712.14 1008.47 530.92 M 538.08 1072.05 C 670.22 919.73 801.45 767.33 1008.47 530.92 M 543.72 1071.65 C 733.88 857.09 917.21 644.99 1014.12 530.53 M 543.72 1071.65 C 639.37 966.5 733.7 858.21 1014.12 530.53 M 548.71 1072.01 C 651.45 952.65 754.31 836.03 1019.1 530.89 M 548.71 1072.01 C 728.48 864.42 906.92 659.34 1019.1 530.89 M 554.35 1071.62 C 732.14 864.26 908.69 659.92 1024.75 530.49 M 554.35 1071.62 C 685.55 920.05 820.36 764.33 1024.75 530.49 M 559.34 1071.98 C 705.03 903 854.99 728.26 1029.73 530.85 M 559.34 1071.98 C 700.01 917.81 836.85 760.56 1029.73 530.85 M 564.98 1071.58 C 693.62 919.72 825.29 768.83 1035.38 530.46 M 564.98 1071.58 C 743.12 865.64 923.03 657.86 1035.38 530.46 M 569.97 1071.94 C 720.57 895.77 873.96 717.99 1040.36 530.82 M 569.97 1071.94 C 754.17 864.66 937.81 653.38 1040.36 530.82 M 575.61 1071.55 C 718.74 900.22 869.13 731.09 1046.01 530.42 M 575.61 1071.55 C 711.69 919.14 846.39 765.3 1046.01 530.42 M 580.6 1071.91 C 720.16 914.38 855.5 757.47 1050.99 530.78 M 580.6 1071.91 C 686.14 954.12 789.13 836.3 1050.99 530.78 M 586.24 1071.52 C 695.44 943.62 802.47 820.03 1056.64 530.39 M 586.24 1071.52 C 681.47 954.4 780.57 840.08 1056.64 530.39 M 591.23 1071.88 C 736.14 908.01 875.9 745.49 1061.62 530.75 M 591.23 1071.88 C 775.75 859.96 960.25 648.09 1061.62 530.75 M 596.87 1071.48 C 766.47 876.4 935.62 680.75 1067.27 530.35 M 596.87 1071.48 C 735.22 908.48 876.03 747.97 1067.27 530.35 M 601.86 1071.84 C 704.14 956.07 804.93 841.42 1072.25 530.71 M 601.86 1071.84 C 745.29 906.68 885.03 746.46 1072.25 530.71 M 607.5 1071.45 C 774.44 884.79 938.08 695.2 1077.9 530.32 M 607.5 1071.45 C 747.85 903.42 890.72 738.35 1077.9 530.32 M 612.49 1071.81 C 775.54 887.24 937.98 702.31 1082.88 530.68 M 612.49 1071.81 C 795.28 861.17 979.41 650.34 1082.88 530.68 M 617.48 1072.17 C 728.42 943.97 844.96 812.84 1087.87 531.04 M 617.48 1072.17 C 761.82 908.77 906.06 742.4 1087.87 531.04 M 623.12 1071.77 C 790.62 883.6 954.79 691.99 1092.86 531.4 M 623.12 1071.77 C 764.67 914.58 904.52 753.3 1092.86 531.4 M 628.11 1072.13 C 814.66 855.68 1000.97 639.85 1097.19 532.51 M 628.11 1072.13 C 730.28 958.15 828.12 846.1 1097.19 532.51 M 633.75 1071.74 C 802.42 877.37 970.75 685.39 1102.18 532.87 M 633.75 1071.74 C 777.86 905.99 924.4 736.73 1102.18 532.87 M 638.74 1072.1 C 814.77 873.11 988.35 673.34 1106.51 533.99 M 638.74 1072.1 C 740.15 950.24 845.15 831.03 1106.51 533.99 M 644.38 1071.7 C 748.44 947.36 854.17 827.18 1111.49 534.35 M 644.38 1071.7 C 783.11 904.34 925.51 740.47 1111.49 534.35 M 649.37 1072.06 C 754.77 950.67 860.66 826.7 1115.82 535.46 M 649.37 1072.06 C 833.5 860.71 1017.18 650.29 1115.82 535.46 M 655.01 1071.67 C 790.67 916.47 928.12 760.02 1119.5 537.33 M 655.01 1071.67 C 751.41 963.68 847.18 852.78 1119.5 537.33 M 660 1072.03 C 769.55 948.8 880.34 821.1 1123.17 539.2 M 660 1072.03 C 791.07 924.59 917.83 778.32 1123.17 539.2 M 665.64 1071.63 C 774.55 944.7 884.81 819.99 1126.85 541.07 M 665.64 1071.63 C 821.67 895.38 974.2 719.01 1126.85 541.07 M 670.63 1071.99 C 841.6 882.51 1008.58 689.16 1129.21 544.45 M 670.63 1071.99 C 789.64 940.83 904 808.53 1129.21 544.45 M 676.27 1071.6 C 767.54 967.41 862.1 859.88 1132.23 547.08 M 676.27 1071.6 C 789.01 936.73 904.46 802.8 1132.23 547.08 M 681.26 1071.96 C 860.78 867.84 1040.25 664.38 1134.59 550.46 M 681.26 1071.96 C 783.95 958.68 883.94 843.36 1134.59 550.46 M 686.9 1071.56 C 805.61 934.49 927.21 795.9 1136.3 554.59 M 686.9 1071.56 C 830.13 905.72 973.75 740.34 1136.3 554.59 M 691.89 1071.93 C 864.94 872.62 1041.57 668.43 1137.35 559.48 M 691.89 1071.93 C 825.42 916.39 961.01 759.14 1137.35 559.48 M 697.53 1071.53 C 871.18 873.78 1044.6 675.25 1138.4 564.37 M 697.53 1071.53 C 851.41 892.42 1004.28 716.52 1138.4 564.37 M 702.52 1071.89 C 815.75 934.89 932.19 798.84 1140.11 568.5 M 702.52 1071.89 C 852.16 900.97 1002.15 727.76 1140.11 568.5 M 708.16 1071.5 C 820.81 938.77 935.47 803.68 1141.16 573.39 M 708.16 1071.5 C 853.22 910.57 996.23 747.11 1141.16 573.39 M 713.15 1071.86 C 883.04 877.55 1051.44 683.98 1140.9 579.79 M 713.15 1071.86 C 882.53 872.77 1053.16 677.82 1140.9 579.79 M 718.79 1071.46 C 828.19 951.62 936.31 827.34 1140.64 586.18 M 718.79 1071.46 C 854.66 919.39 989.06 765.29 1140.64 586.18 M 723.78 1071.82 C 880.17 890.45 1034.95 708.92 1141.03 591.83 M 723.78 1071.82 C 827.18 954.76 929.85 834.2 1141.03 591.83 M 728.76 1072.18 C 837.43 950.41 945.49 823.65 1140.77 598.22 M 728.76 1072.18 C 870.87 904.71 1015.04 739.12 1140.77 598.22 M 734.41 1071.79 C 862.38 924.32 987.53 778.18 1141.16 603.87 M 734.41 1071.79 C 856.64 932.19 977.65 790.95 1141.16 603.87 M 739.39 1072.15 C 842.63 949.99 947.1 833.16 1140.9 610.26 M 739.39 1072.15 C 868.04 922.83 994.4 776.88 1140.9 610.26 M 745.04 1071.75 C 863.19 932.69 982.28 793.41 1140.64 616.66 M 745.04 1071.75 C 849.08 946.61 957.09 824.53 1140.64 616.66 M 750.02 1072.11 C 885.51 911.8 1025.05 752.62 1141.04 622.31 M 750.02 1072.11 C 864.06 940.93 979.16 808.53 1141.04 622.31 M 755.67 1071.72 C 894.65 907.45 1032.68 748.57 1140.77 628.7 M 755.67 1071.72 C 872.37 937.12 989.88 801.6 1140.77 628.7 M 760.65 1072.08 C 888.08 923.91 1015.76 779.26 1141.17 634.35 M 760.65 1072.08 C 842.04 974.33 924.83 878.55 1141.17 634.35 M 766.3 1071.68 C 880.81 944.74 992.44 815.14 1140.91 640.74 M 766.3 1071.68 C 869.32 954.81 968.11 841.33 1140.91 640.74 M 771.28 1072.04 C 888.22 935.73 1007.98 798.09 1140.65 647.14 M 771.28 1072.04 C 848.44 986.31 922.54 900.51 1140.65 647.14 M 776.93 1071.65 C 865.4 971.13 953.07 868.61 1141.04 652.79 M 776.93 1071.65 C 860.05 972.21 944.58 873.61 1141.04 652.79 M 781.91 1072.01 C 890.2 943.32 999.08 816.75 1140.78 659.18 M 781.91 1072.01 C 864.08 978.06 944.03 885.63 1140.78 659.18 M 787.56 1071.61 C 899.38 944.93 1006.01 820.88 1141.17 664.83 M 787.56 1071.61 C 862.25 983.63 938.37 897.3 1141.17 664.83 M 792.54 1071.97 C 869.49 985.1 944.26 897.72 1140.91 671.22 M 792.54 1071.97 C 875.32 974.09 958.75 879.44 1140.91 671.22 M 798.19 1071.58 C 910.74 942.47 1021.77 812.6 1140.65 677.62 M 798.19 1071.58 C 875.9 982.45 954.75 891.06 1140.65 677.62 M 803.17 1071.94 C 889.26 969.59 974.46 872.24 1141.04 683.26 M 803.17 1071.94 C 888.45 969.45 976 869.35 1141.04 683.26 M 808.82 1071.55 C 920.69 948.54 1029.62 822.37 1140.78 689.66 M 808.82 1071.55 C 885.78 986.72 960.36 901.72 1140.78 689.66 M 813.8 1071.91 C 934.41 931.93 1053.13 794.23 1141.18 695.31 M 813.8 1071.91 C 908.24 966.83 1001.33 859.01 1141.18 695.31 M 819.45 1071.51 C 901.59 980.5 982.86 883.66 1140.92 701.7 M 819.45 1071.51 C 933.48 935.98 1051.82 800.67 1140.92 701.7 M 824.43 1071.87 C 935.09 942.69 1047.28 814.23 1140.66 708.1 M 824.43 1071.87 C 943.88 935.82 1064.46 799.25 1140.66 708.1 M 830.08 1071.48 C 905.85 982.39 980.35 894.2 1141.05 713.74 M 830.08 1071.48 C 931.08 953.02 1034.21 834.42 1141.05 713.74 M 835.06 1071.84 C 948.77 942.08 1065.15 811.43 1140.79 720.14 M 835.06 1071.84 C 943.29 941.62 1055.26 814.37 1140.79 720.14 M 840.71 1071.44 C 947.88 947.35 1054.94 824.57 1141.18 725.79 M 840.71 1071.44 C 913.13 989.08 983.31 908.79 1141.18 725.79 M 845.69 1071.8 C 913.49 991.43 984.47 909.08 1140.92 732.18 M 845.69 1071.8 C 952.41 950.23 1054.75 831.22 1140.92 732.18 M 850.68 1072.16 C 913.55 993.83 978.84 919.51 1140.66 738.58 M 850.68 1072.16 C 932.63 978.04 1017.54 879.95 1140.66 738.58 M 856.32 1071.77 C 946.62 971.55 1038.91 867.25 1141.05 744.22 M 856.32 1071.77 C 918.4 1001.12 978.78 933.48 1141.05 744.22 M 861.31 1072.13 C 921.41 1001.46 982.12 931.48 1140.79 750.62 M 861.31 1072.13 C 960.47 957.9 1059.73 844.8 1140.79 750.62 M 866.96 1071.73 C 924.67 998.75 984.81 927.95 1141.19 756.26 M 866.96 1071.73 C 943.15 986.19 1020.92 896.37 1141.19 756.26 M 871.94 1072.09 C 951.88 980.44 1030.93 887.72 1140.93 762.66 M 871.94 1072.09 C 975.83 953.15 1080.47 835.6 1140.93 762.66 M 877.59 1071.7 C 965.56 966.52 1058.7 863.9 1141.32 768.31 M 877.59 1071.7 C 954.92 984.06 1031.05 897.08 1141.32 768.31 M 882.57 1072.06 C 964.39 979.84 1046.29 882.07 1141.06 774.7 M 882.57 1072.06 C 981.48 960.55 1076.68 850.26 1141.06 774.7 M 888.22 1071.66 C 962.91 982.51 1041.5 898.52 1140.8 781.1 M 888.22 1071.66 C 991.88 955.4 1091.84 839.78 1140.8 781.1 M 893.2 1072.02 C 981.58 968.2 1072.16 864.61 1141.19 786.74 M 893.2 1072.02 C 950.17 1011.03 1003.36 946.86 1141.19 786.74 M 898.85 1071.63 C 963.28 989.18 1033.77 913 1140.93 793.14 M 898.85 1071.63 C 988.99 968.55 1081.26 863.45 1140.93 793.14 M 903.83 1071.99 C 954.65 1017.21 1002.11 964.43 1141.33 798.79 M 903.83 1071.99 C 965.65 999.39 1024.12 930.25 1141.33 798.79 M 909.48 1071.6 C 988.03 983.95 1063.05 897.88 1141.06 805.18 M 909.48 1071.6 C 969.27 1007.78 1029.06 941.44 1141.06 805.18 M 914.46 1071.96 C 963.67 1012.14 1008.41 956.01 1140.8 811.58 M 914.46 1071.96 C 984.5 987.54 1058.07 903.29 1140.8 811.58 M 920.11 1071.56 C 974.82 1011.89 1026.51 951.9 1141.2 817.22 M 920.11 1071.56 C 969.06 1019.17 1012.59 965.89 1141.2 817.22 M 925.09 1071.92 C 987.38 1000.52 1048.76 929.03 1140.94 823.62 M 925.09 1071.92 C 991.97 996.08 1057.56 923.49 1140.94 823.62 M 930.74 1071.53 C 984.46 1012.7 1037.44 949.61 1141.33 829.26 M 930.74 1071.53 C 997.06 996.77 1062.65 922.59 1141.33 829.26 M 935.72 1071.89 C 999.47 995.97 1058.59 924.2 1141.07 835.66 M 935.72 1071.89 C 1009.62 984.83 1084.97 897.38 1141.07 835.66 M 941.37 1071.49 C 1014.43 982.63 1089.58 892.45 1140.81 842.06 M 941.37 1071.49 C 979.97 1022.23 1021.44 975.47 1140.81 842.06 M 946.35 1071.85 C 998.57 1012.27 1055.3 948.74 1141.2 847.7 M 946.35 1071.85 C 1009.67 996.23 1075.3 924.22 1141.2 847.7 M 952 1071.46 C 1009.9 1006.88 1063.91 947.18 1140.94 854.1 M 952 1071.46 C 1022.05 989.55 1094.97 906.2 1140.94 854.1 M 956.98 1071.82 C 1023.8 992.48 1093.1 914.46 1141.34 859.74 M 956.98 1071.82 C 1014.78 1007.95 1073.14 940.67 1141.34 859.74 M 961.97 1072.18 C 1024.45 995.63 1091.26 917.77 1141.07 866.14 M 961.97 1072.18 C 1019.86 1003.64 1079.9 934.47 1141.07 866.14 M 967.61 1071.78 C 1020.72 1008 1077.33 948.54 1140.81 872.54 M 967.61 1071.78 C 1017.27 1013.74 1062.36 958.58 1140.81 872.54 M 972.6 1072.14 C 1025.63 1011.23 1077.61 950.62 1141.21 878.18 M 972.6 1072.14 C 1039.3 994.27 1104.77 917 1141.21 878.18 M 978.24 1071.75 C 1017.58 1034.76 1056.34 991.81 1140.95 884.58 M 978.24 1071.75 C 1025.71 1017.75 1073.04 964.72 1140.95 884.58 M 983.23 1072.11 C 1034.9 1014.33 1090.04 949.71 1141.34 890.22 M 983.23 1072.11 C 1026.64 1021.9 1072.4 970.88 1141.34 890.22 M 988.87 1071.71 C 1033.27 1018.67 1077.53 970.59 1141.08 896.62 M 988.87 1071.71 C 1023.76 1034.97 1057.87 994.34 1141.08 896.62 M 993.86 1072.07 C 1038.75 1017.08 1085.21 968.18 1140.82 903.02 M 993.86 1072.07 C 1054.33 1007.36 1113.33 939.01 1140.82 903.02 M 999.5 1071.68 C 1044.47 1018.66 1093 960.98 1141.21 908.66 M 999.5 1071.68 C 1042.33 1020.79 1087.2 967.77 1141.21 908.66 M 1004.49 1072.04 C 1046.63 1027.34 1080.9 985.29 1140.95 915.06 M 1004.49 1072.04 C 1042.74 1028.03 1080.72 985.5 1140.95 915.06 M 1010.13 1071.64 C 1048.52 1028.1 1088.93 984.39 1141.35 920.7 M 1010.13 1071.64 C 1059.43 1016.1 1107.37 961.18 1141.35 920.7 M 1015.12 1072.01 C 1047.85 1032.64 1093.35 982.18 1141.08 927.1 M 1015.12 1072.01 C 1061.51 1020.1 1105.51 968.4 1141.08 927.1 M 1020.76 1071.61 C 1057.91 1029.73 1091.54 993.95 1140.82 933.5 M 1020.76 1071.61 C 1062.27 1021.53 1103.02 974.29 1140.82 933.5 M 1025.75 1071.97 C 1056.82 1035.69 1084.41 1004.29 1141.22 939.14 M 1025.75 1071.97 C 1053.24 1039.67 1079.47 1009.27 1141.22 939.14 M 1031.39 1071.58 C 1070.34 1028.49 1103.26 990.65 1140.96 945.54 M 1031.39 1071.58 C 1054.5 1043.84 1077.98 1016.7 1140.96 945.54 M 1036.38 1071.94 C 1058.13 1046.22 1079.91 1019.38 1141.35 951.18 M 1036.38 1071.94 C 1081.22 1025.02 1120.19 975.16 1141.35 951.18 M 1042.02 1071.54 C 1071.65 1037.84 1099.39 1010.79 1141.09 957.58 M 1042.02 1071.54 C 1066.47 1041.03 1095.89 1011.6 1141.09 957.58 M 1047.01 1071.9 C 1067.36 1042.93 1094.57 1015.9 1140.83 963.98 M 1047.01 1071.9 C 1067.28 1044.15 1091.71 1020.37 1140.83 963.98 M 1052.65 1071.51 C 1076.27 1045.67 1099.83 1019.92 1141.22 969.62 M 1052.65 1071.51 C 1072.86 1047.7 1090.38 1026.6 1141.22 969.62 M 1057.64 1071.87 C 1075.28 1045.98 1094.43 1025.66 1140.96 976.02 M 1057.64 1071.87 C 1084.77 1044.36 1112.47 1014.5 1140.96 976.02 M 1063.28 1071.47 C 1080.18 1052.33 1098.88 1030.39 1141.35 981.66 M 1063.28 1071.47 C 1084.56 1044.09 1109.06 1021.28 1141.35 981.66 M 1068.27 1071.83 C 1088.06 1045.79 1105.74 1027.72 1141.09 988.06 M 1068.27 1071.83 C 1090.85 1048.14 1111.09 1024.41 1141.09 988.06 M 1073.91 1071.44 C 1090.31 1048.62 1108.98 1028.46 1140.83 994.46 M 1073.91 1071.44 C 1094.13 1047.43 1118.58 1020.13 1140.83 994.46 M 1078.9 1071.8 C 1096.4 1054.64 1109.82 1038.17 1141.23 1000.1 M 1078.9 1071.8 C 1096.42 1050.95 1113.98 1031.38 1141.23 1000.1 M 1083.89 1072.16 C 1102.82 1048.39 1128.64 1026.73 1140.96 1006.5 M 1083.89 1072.16 C 1104.55 1050.74 1123.02 1026.36 1140.96 1006.5 M 1089.53 1071.76 C 1099.94 1058.92 1114.51 1043.89 1141.36 1012.14 M 1089.53 1071.76 C 1101.52 1058.71 1115.48 1043.09 1141.36 1012.14 M 1094.52 1072.12 C 1109.59 1053.61 1125.01 1039.61 1141.1 1018.54 M 1094.52 1072.12 C 1106.36 1054.67 1119.82 1040.89 1141.1 1018.54 M 1100.82 1070.97 C 1118.43 1054.71 1129.13 1036.18 1142.15 1023.43 M 1100.82 1070.97 C 1114.98 1054.44 1130.33 1034.59 1142.15 1023.43 M 1107.12 1069.83 C 1117.81 1057.14 1127.19 1046.04 1140.58 1031.33 M 1107.12 1069.83 C 1115.72 1061.01 1125.82 1047.31 1140.58 1031.33 M 1113.42 1068.68 C 1123.87 1056.5 1132.94 1050.14 1139.66 1038.49 M 1113.42 1068.68 C 1123.35 1054.34 1132.86 1043.61 1139.66 1038.49" fill="none" stroke="#dae8fc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 48.6 530 M 48.6 530 C 393.45 523.13 736.51 523.3 1091.4 530 M 48.6 530 C 338.26 536.92 628.61 537.03 1091.4 530 M 1091.4 530 C 1126.92 533.55 1141.92 545.87 1140 578.6 M 1091.4 530 C 1127.89 528.79 1144.11 549.57 1140 578.6 M 1140 578.6 C 1141.88 751.75 1140.56 928.64 1140 1021.4 M 1140 578.6 C 1140.39 689.41 1140.07 801.42 1140 1021.4 M 1140 1021.4 C 1140.11 1052.34 1122.38 1068.41 1091.4 1070 M 1140 1021.4 C 1141.63 1052.11 1124.28 1066.24 1091.4 1070 M 1091.4 1070 C 739.04 1063.47 385.89 1062.98 48.6 1070 M 1091.4 1070 C 800.66 1062.75 511.14 1063.07 48.6 1070 M 48.6 1070 C 18.56 1068.22 -1.32 1055.09 0 1021.4 M 48.6 1070 C 12.55 1067.64 3.98 1051.17 0 1021.4 M 0 1021.4 C 3.13 850.73 2.55 684.49 0 578.6 M 0 1021.4 C 3.05 879.79 2.76 738.95 0 578.6 M 0 578.6 C -1.51 546.29 14.53 528.38 48.6 530 M 0 578.6 C 2.56 547.35 14.31 530.6 48.6 530" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="330" y="0" width="470" height="420" rx="50.4" ry="50.4" fill="none" stroke="none" pointer-events="all"/><path d="M 342.38 12.85 C 342.38 12.85 342.38 12.85 342.38 12.85 M 342.38 12.85 C 342.38 12.85 342.38 12.85 342.38 12.85 M 336.87 25.28 C 340.66 22.21 349.65 11.06 353.93 5.66 M 336.87 25.28 C 339.59 19.96 343.06 16.1 353.93 5.66 M 334.64 33.95 C 344.39 22.1 349.91 16.97 360.23 4.51 M 334.64 33.95 C 341.43 27.27 348.75 18.35 360.23 4.51 M 330.45 44.87 C 341.79 32.49 356.71 10.33 365.87 4.12 M 330.45 44.87 C 343.81 31.98 356.36 16.07 365.87 4.12 M 330.84 50.52 C 349.29 29.37 363.7 13.19 372.17 2.97 M 330.84 50.52 C 345.53 33.44 359.75 17.26 372.17 2.97 M 330.58 56.91 C 344.62 38.9 357.98 26.05 378.47 1.82 M 330.58 56.91 C 350.13 34.92 368.28 15.87 378.47 1.82 M 330.32 63.31 C 347.29 46.73 362.31 23.73 383.46 2.18 M 330.32 63.31 C 346.13 46.27 359.37 31.22 383.46 2.18 M 330.71 68.95 C 340.71 53.61 355.6 41.16 388.45 2.54 M 330.71 68.95 C 348.68 48.84 367.82 25.76 388.45 2.54 M 330.45 75.35 C 354.8 49.99 374.25 24.98 394.09 2.15 M 330.45 75.35 C 345.55 59.34 357.02 42.15 394.09 2.15 M 330.85 81 C 347.31 61.52 361.53 43.55 399.08 2.51 M 330.85 81 C 346.66 60.94 360.95 42.55 399.08 2.51 M 330.58 87.39 C 349.3 69.95 364.91 52.48 404.72 2.11 M 330.58 87.39 C 346.81 69.48 362.38 52.84 404.72 2.11 M 330.32 93.79 C 353.83 62.87 382.59 38.2 409.71 2.47 M 330.32 93.79 C 357.24 68.6 382.11 40.96 409.71 2.47 M 330.72 99.43 C 361.09 68.57 386.27 41.17 415.35 2.08 M 330.72 99.43 C 358.96 69.72 384 40.58 415.35 2.08 M 330.46 105.83 C 359.62 68.87 383.07 39.7 420.34 2.44 M 330.46 105.83 C 363.87 67.33 393.7 28 420.34 2.44 M 330.85 111.47 C 361.89 85.34 389.39 53.74 425.32 2.8 M 330.85 111.47 C 363.8 74.08 395.85 37.66 425.32 2.8 M 330.59 117.87 C 349.85 92.01 379.38 60.41 430.97 2.4 M 330.59 117.87 C 366.44 80.14 399.46 36.39 430.97 2.4 M 330.33 124.27 C 368.09 79.7 404.92 38.54 435.95 2.76 M 330.33 124.27 C 360.72 92.73 387.44 62.17 435.95 2.76 M 330.72 129.91 C 361.35 90.96 396.02 58.45 441.6 2.37 M 330.72 129.91 C 358.35 99.95 384.69 64.5 441.6 2.37 M 330.46 136.31 C 361.3 104.8 397.28 68.52 446.58 2.73 M 330.46 136.31 C 376.75 86.18 418.67 37.83 446.58 2.73 M 330.86 141.95 C 358.89 105.01 389.88 74.94 452.23 2.33 M 330.86 141.95 C 376.05 90.36 423.98 37.34 452.23 2.33 M 330.59 148.35 C 378.87 93.2 421.88 43 457.21 2.69 M 330.59 148.35 C 363.1 110.67 391.19 78.12 457.21 2.69 M 330.33 154.75 C 375.09 106.77 421.02 57.21 462.86 2.3 M 330.33 154.75 C 368.67 110.22 406.99 69.6 462.86 2.3 M 330.73 160.39 C 367.23 117.53 402.8 70.88 467.84 2.66 M 330.73 160.39 C 363.76 120.88 396.01 81.27 467.84 2.66 M 330.47 166.79 C 374.24 114.58 419.9 61.52 473.49 2.26 M 330.47 166.79 C 362.18 134.01 391.84 100.79 473.49 2.26 M 330.86 172.43 C 359.98 136.39 399.49 92.97 478.47 2.62 M 330.86 172.43 C 366.7 134.11 404.63 91.51 478.47 2.62 M 330.6 178.83 C 362.72 139.59 395.98 101.35 484.12 2.23 M 330.6 178.83 C 369.26 129.39 411.28 83.58 484.12 2.23 M 330.34 185.23 C 389.44 119.13 446.39 57.78 489.1 2.59 M 330.34 185.23 C 367.22 139.67 407.47 92.62 489.1 2.59 M 330.73 190.87 C 392.96 120.41 449.91 50.64 494.75 2.19 M 330.73 190.87 C 377.9 137.99 425.27 84.97 494.75 2.19 M 330.47 197.27 C 389.17 131.06 444.87 62.05 499.73 2.56 M 330.47 197.27 C 393.56 126.29 458.28 49.36 499.73 2.56 M 330.86 202.91 C 401.99 125.79 471.66 46.21 505.38 2.16 M 330.86 202.91 C 389.73 139.44 446.32 73.16 505.38 2.16 M 330.6 209.31 C 365.81 157.69 411.12 112.89 510.36 2.52 M 330.6 209.31 C 384.17 146.3 442.44 78.74 510.36 2.52 M 330.34 215.71 C 376.21 161.26 423.19 112.08 516.01 2.13 M 330.34 215.71 C 400.88 136.28 470.13 58.14 516.01 2.13 M 330.74 221.35 C 372.08 177.39 409 127.04 520.99 2.49 M 330.74 221.35 C 374.17 172.03 413.26 125.33 520.99 2.49 M 330.48 227.75 C 382.52 158.24 440.12 93.36 526.64 2.09 M 330.48 227.75 C 376.98 175.23 426.48 119.13 526.64 2.09 M 330.87 233.39 C 372.46 184.71 412.81 139.52 531.62 2.45 M 330.87 233.39 C 377.12 176.01 425.83 122.46 531.62 2.45 M 330.61 239.79 C 388.52 173.78 442.28 107.36 536.61 2.81 M 330.61 239.79 C 393.73 168.09 453.87 98.82 536.61 2.81 M 330.35 246.19 C 393.64 171.87 455.14 102.2 542.25 2.42 M 330.35 246.19 C 411.02 152.1 492.98 56.67 542.25 2.42 M 330.74 251.83 C 376.21 196.67 418.91 146.53 547.24 2.78 M 330.74 251.83 C 390.77 176.72 456.68 104 547.24 2.78 M 330.48 258.23 C 390.52 189.17 452.31 121.06 552.88 2.38 M 330.48 258.23 C 398.47 184.55 461.98 109.49 552.88 2.38 M 330.87 263.87 C 416.33 165.73 503.56 68.87 557.87 2.74 M 330.87 263.87 C 415.23 174.77 494.31 82.24 557.87 2.74 M 330.61 270.27 C 407.75 185.58 484.53 97.09 563.51 2.35 M 330.61 270.27 C 384.18 210.07 434.75 151.85 563.51 2.35 M 330.35 276.67 C 418.66 167.93 511.49 63.67 568.5 2.71 M 330.35 276.67 C 377.14 217.38 424.53 163.94 568.5 2.71 M 330.75 282.31 C 418.36 184.44 505.95 80.87 574.14 2.31 M 330.75 282.31 C 386.96 215.74 447.48 148.64 574.14 2.31 M 330.48 288.71 C 416.69 188.5 504.54 88.76 579.13 2.67 M 330.48 288.71 C 410.43 200.88 486.99 110.89 579.13 2.67 M 330.88 294.35 C 390.89 226.19 450.83 155.76 584.77 2.28 M 330.88 294.35 C 404.79 204.26 482.19 115.91 584.77 2.28 M 330.62 300.75 C 386.2 234.27 443.83 166.45 589.76 2.64 M 330.62 300.75 C 426.64 189.29 526.51 74.77 589.76 2.64 M 330.36 307.15 C 422.22 205.48 504.93 107.47 595.4 2.24 M 330.36 307.15 C 417.14 212.89 501.81 115.74 595.4 2.24 M 330.75 312.79 C 413.07 211.7 502.54 111.86 600.39 2.6 M 330.75 312.79 C 392.93 242.27 455.5 170.45 600.39 2.6 M 330.49 319.19 C 389.29 255.36 447.09 187.68 606.03 2.21 M 330.49 319.19 C 411.91 224.47 494.83 130.75 606.03 2.21 M 330.88 324.83 C 438.44 194.58 554.08 65.68 611.02 2.57 M 330.88 324.83 C 416.27 220.25 506.36 117.53 611.02 2.57 M 330.62 331.23 C 433.09 215.05 532.73 101.12 616.66 2.18 M 330.62 331.23 C 396.62 261.64 459.45 187.81 616.66 2.18 M 330.36 337.63 C 433.69 218.23 536.41 96.81 621.65 2.54 M 330.36 337.63 C 395.09 259.28 461.93 182.91 621.65 2.54 M 330.76 343.27 C 391.96 271.58 454.71 198.42 627.29 2.14 M 330.76 343.27 C 434.56 223.93 539.53 103.16 627.29 2.14 M 330.49 349.67 C 435.66 229.51 538.8 109.13 632.28 2.5 M 330.49 349.67 C 444.1 221.42 557.21 90.96 632.28 2.5 M 330.89 355.31 C 433.36 233.31 533.8 113.89 637.92 2.11 M 330.89 355.31 C 434.97 238.96 538.63 121.68 637.92 2.11 M 330.63 361.71 C 409.69 274.55 487.02 187.93 642.91 2.47 M 330.63 361.71 C 426.08 252.47 520.91 143.95 642.91 2.47 M 330.37 368.11 C 425.16 258.96 515.3 155.23 647.9 2.83 M 330.37 368.11 C 419.66 263.44 510.18 158.43 647.9 2.83 M 330.76 373.75 C 398.51 298.99 464.04 221.27 653.54 2.43 M 330.76 373.75 C 455.37 227.49 579.58 82.68 653.54 2.43 M 332.47 377.88 C 436.9 262.4 540.25 142.28 658.53 2.79 M 332.47 377.88 C 433.53 259.85 535.14 144.19 658.53 2.79 M 333.52 382.77 C 429.04 272.24 528 159.62 664.17 2.4 M 333.52 382.77 C 441.03 257.37 550.56 131.07 664.17 2.4 M 334.57 387.66 C 415.26 291.15 500.13 194.86 669.16 2.76 M 334.57 387.66 C 465.82 239.26 595.79 89.44 669.16 2.76 M 335.62 392.55 C 420.28 294.58 506.76 197.07 674.8 2.36 M 335.62 392.55 C 428.31 287.65 519.49 183.09 674.8 2.36 M 336.67 397.44 C 413.72 304.8 492.67 214.48 679.79 2.72 M 336.67 397.44 C 436.53 286.14 532.94 173.58 679.79 2.72 M 339.03 400.82 C 455.19 266.17 575.15 130.94 685.43 2.33 M 339.03 400.82 C 430.12 296.63 520.99 192.53 685.43 2.33 M 341.4 404.19 C 480.41 244.35 619.28 84.45 690.42 2.69 M 341.4 404.19 C 423.19 310.38 504.41 216.17 690.42 2.69 M 343.1 408.33 C 441.93 293.16 543.5 179.16 696.06 2.29 M 343.1 408.33 C 414.61 324.83 488.49 241.97 696.06 2.29 M 346.78 410.2 C 477.19 257.64 611.03 102.12 701.05 2.65 M 346.78 410.2 C 438.6 304.08 531.05 200.21 701.05 2.65 M 350.45 412.07 C 470.9 274.78 592.57 133.16 706.69 2.26 M 350.45 412.07 C 465.75 278.67 578.97 148.59 706.69 2.26 M 353.47 414.69 C 495.26 254.03 631.28 95.72 711.68 2.62 M 353.47 414.69 C 444.25 308.73 536.48 202.63 711.68 2.62 M 357.15 416.56 C 435.49 324.84 516.97 233.13 717.32 2.23 M 357.15 416.56 C 449.19 310.51 541.43 203.29 717.32 2.23 M 360.82 418.43 C 489.83 270.96 615.23 126.43 722.31 2.59 M 360.82 418.43 C 470.93 292.36 583.18 162.16 722.31 2.59 M 365.15 419.55 C 504.32 255.57 642.57 96.24 727.95 2.19 M 365.15 419.55 C 514.03 251.38 658.56 84.9 727.95 2.19 M 370.14 419.91 C 505.57 265.72 641.8 110.63 732.94 2.55 M 370.14 419.91 C 504.53 261.07 643.2 102.88 732.94 2.55 M 374.47 421.02 C 490.53 284.13 610.1 148.26 738.58 2.16 M 374.47 421.02 C 504.48 269.46 635.87 118.52 738.58 2.16 M 380.77 419.87 C 479.73 308.75 580.22 193.3 743.57 2.52 M 380.77 419.87 C 526.86 254.57 672.02 86.45 743.57 2.52 M 385.76 420.23 C 488.07 300.21 592.06 183.2 750.52 0.61 M 385.76 420.23 C 489.3 302.21 591.25 185.09 750.52 0.61 M 391.4 419.84 C 481.19 311.09 575.82 203.56 754.86 1.73 M 391.4 419.84 C 536.9 257.93 679.5 92.65 754.86 1.73 M 396.39 420.2 C 524.42 273.31 651.93 125.92 759.84 2.09 M 396.39 420.2 C 515.02 282.79 634.13 145.88 759.84 2.09 M 402.03 419.8 C 478.63 333.15 556.5 244.42 764.83 2.45 M 402.03 419.8 C 528.38 268.82 656.29 121.17 764.83 2.45 M 407.02 420.16 C 539.89 266.47 671.69 115.75 769.16 3.56 M 407.02 420.16 C 483.92 335.63 559.02 249.61 769.16 3.56 M 412.66 419.77 C 504.26 318.32 592.19 215.69 773.49 4.68 M 412.66 419.77 C 541.09 267.4 673.17 115.58 773.49 4.68 M 417.65 420.13 C 492.76 336.19 565.2 249.91 777.17 6.55 M 417.65 420.13 C 503.77 318.45 593.33 216.72 777.17 6.55 M 422.63 420.49 C 545.03 279.48 666.7 139.81 780.19 9.17 M 422.63 420.49 C 526.59 305.26 626.39 189.21 780.19 9.17 M 428.28 420.09 C 532.95 298.6 638.57 177.49 783.86 11.04 M 428.28 420.09 C 539.18 296.17 648.54 171.64 783.86 11.04 M 433.26 420.45 C 539 305 640.3 190.64 787.54 12.91 M 433.26 420.45 C 519.86 321.34 604.43 223.44 787.54 12.91 M 438.91 420.06 C 544.44 299.53 654.57 173.13 789.9 16.29 M 438.91 420.06 C 532.5 306.93 630.53 195.13 789.9 16.29 M 443.89 420.42 C 568.93 276.74 694.14 129.72 792.26 19.67 M 443.89 420.42 C 567.1 278.93 693.1 134.69 792.26 19.67 M 449.54 420.02 C 537.07 316.03 624.23 214.38 793.97 23.8 M 449.54 420.02 C 578.55 270.51 708.06 120.21 793.97 23.8 M 454.52 420.38 C 540.77 327.21 625 231.03 796.33 27.18 M 454.52 420.38 C 533.03 327.93 613.05 235.15 796.33 27.18 M 460.17 419.99 C 533.26 339.89 604.3 261.04 798.69 30.56 M 460.17 419.99 C 549.11 322.28 635.84 222.54 798.69 30.56 M 465.15 420.35 C 566.36 302.68 670.75 182.12 799.74 35.45 M 465.15 420.35 C 547.59 328.12 629.06 235.15 799.74 35.45 M 470.8 419.95 C 589.21 278.55 708.67 142.51 800.79 40.34 M 470.8 419.95 C 565.16 310.26 661.87 200.78 800.79 40.34 M 475.78 420.31 C 575.96 300.47 679.59 183.52 801.19 45.98 M 475.78 420.31 C 556.24 330.73 636.65 240.54 801.19 45.98 M 481.43 419.92 C 600.72 281.36 723.11 141.6 801.58 51.62 M 481.43 419.92 C 578.63 311.58 672.36 204.75 801.58 51.62 M 486.41 420.28 C 592.51 300.4 694.78 181.11 801.32 58.02 M 486.41 420.28 C 571.92 325 655.47 227.37 801.32 58.02 M 492.06 419.89 C 573.45 331.47 647.99 241.96 801.72 63.66 M 492.06 419.89 C 615.5 275.45 739.3 132.72 801.72 63.66 M 497.04 420.25 C 560.62 350.13 624.63 274.52 801.46 70.06 M 497.04 420.25 C 563.96 340.23 634.76 259.39 801.46 70.06 M 502.69 419.85 C 566.21 344.84 632.13 267.91 801.19 76.46 M 502.69 419.85 C 617.69 289.89 732.13 160.19 801.19 76.46 M 507.67 420.21 C 594.69 315.52 685.58 215.09 801.59 82.1 M 507.67 420.21 C 573.27 344.55 640.74 266.6 801.59 82.1 M 513.32 419.82 C 594.13 326.8 673.21 235.58 801.33 88.5 M 513.32 419.82 C 605.57 311.3 699.7 203.08 801.33 88.5 M 518.3 420.18 C 620.05 296.98 726.58 175.27 801.72 94.14 M 518.3 420.18 C 584.04 342.47 651.44 264.92 801.72 94.14 M 523.95 419.78 C 590.88 342.84 659.9 261.83 801.46 100.54 M 523.95 419.78 C 628.14 300.49 731.91 182.01 801.46 100.54 M 528.93 420.14 C 594.09 342.42 662.26 262.59 801.2 106.94 M 528.93 420.14 C 585.24 349.32 644.95 280.91 801.2 106.94 M 533.92 420.5 C 619.67 320.64 703.22 222.21 801.59 112.58 M 533.92 420.5 C 630.26 308.65 729.14 195.18 801.59 112.58 M 539.56 420.11 C 633.88 313.32 731.07 202.85 801.33 118.98 M 539.56 420.11 C 643.88 299.44 746.09 179.8 801.33 118.98 M 544.55 420.47 C 626.74 326.99 712.61 236.14 801.73 124.62 M 544.55 420.47 C 601.73 354.96 655.16 294.62 801.73 124.62 M 550.19 420.07 C 620.26 341.2 685.14 265.37 801.46 131.02 M 550.19 420.07 C 646.41 307.94 743.21 197.61 801.46 131.02 M 555.18 420.43 C 603.03 358.83 655.37 301.19 801.2 137.42 M 555.18 420.43 C 630.49 331.36 705.29 246.91 801.2 137.42 M 560.82 420.04 C 630.67 341.17 700.08 262.54 801.6 143.06 M 560.82 420.04 C 626.93 343.27 692.14 265.52 801.6 143.06 M 565.81 420.4 C 618.52 366.45 665.39 312.83 801.34 149.46 M 565.81 420.4 C 641.29 337.27 711.89 255.48 801.34 149.46 M 571.45 420 C 625.75 356.18 682.14 292.63 801.73 155.1 M 571.45 420 C 651.32 324.99 734.26 230.31 801.73 155.1 M 576.44 420.36 C 640.5 356.43 699.57 284.1 801.47 161.5 M 576.44 420.36 C 663.01 320.06 749.58 223.63 801.47 161.5 M 582.08 419.97 C 656.29 328.62 737.36 239.38 801.21 167.9 M 582.08 419.97 C 660.15 329.37 738.93 236.32 801.21 167.9 M 587.07 420.33 C 676.01 322.28 756.87 226.42 801.6 173.54 M 587.07 420.33 C 657.35 337.04 730.79 254.82 801.6 173.54 M 592.71 419.94 C 668.61 343.34 738.58 264.31 801.34 179.94 M 592.71 419.94 C 645.07 363.13 695.33 305.53 801.34 179.94 M 597.7 420.3 C 669.16 337.84 738.57 252.77 801.74 185.58 M 597.7 420.3 C 662.09 345.59 729.33 271.43 801.74 185.58 M 603.34 419.9 C 665.28 351.65 722.24 285.26 801.47 191.98 M 603.34 419.9 C 680.53 331.52 758.66 241.96 801.47 191.98 M 608.33 420.26 C 667.27 347.98 730.88 278.75 801.21 198.38 M 608.33 420.26 C 661.22 356.28 714.56 294.61 801.21 198.38 M 613.97 419.87 C 662.12 365.5 704.56 312.4 801.61 204.02 M 613.97 419.87 C 652.47 374.09 694.65 324.16 801.61 204.02 M 618.96 420.23 C 666.88 369.84 709.77 313.03 801.35 210.42 M 618.96 420.23 C 675.28 350.81 731.69 284.96 801.35 210.42 M 624.6 419.83 C 693.6 339.08 768.45 257.39 801.08 216.82 M 624.6 419.83 C 696.12 339.44 763.57 259.73 801.08 216.82 M 629.59 420.19 C 683.32 356.5 739.62 289.63 801.48 222.46 M 629.59 420.19 C 694.84 349.13 755.95 277.85 801.48 222.46 M 635.23 419.8 C 675.32 374.4 710.88 328.19 801.22 228.86 M 635.23 419.8 C 695.22 353.8 755.07 285.07 801.22 228.86 M 640.22 420.16 C 684.87 364.93 727.78 314.26 801.61 234.5 M 640.22 420.16 C 680.66 370.85 723.96 321.23 801.61 234.5 M 645.86 419.76 C 681.95 375.92 721.25 332.17 801.35 240.9 M 645.86 419.76 C 683.44 373.61 720.56 332.38 801.35 240.9 M 650.85 420.12 C 693.87 373.02 734.27 320.91 801.09 247.29 M 650.85 420.12 C 694.58 366.37 736.5 316.82 801.09 247.29 M 655.84 420.48 C 686.2 383.23 714.8 351.31 801.48 252.94 M 655.84 420.48 C 709.25 359.55 762.35 298.47 801.48 252.94 M 661.48 420.09 C 699.3 379.45 731.76 338.6 801.22 259.34 M 661.48 420.09 C 701.55 374.89 739.24 328.13 801.22 259.34 M 666.47 420.45 C 717.15 367.99 759.48 312.65 801.62 264.98 M 666.47 420.45 C 711.49 373.09 751.75 325.75 801.62 264.98 M 672.11 420.05 C 723.29 358.38 776.59 303.86 801.36 271.38 M 672.11 420.05 C 709.22 379.79 743.62 341.65 801.36 271.38 M 677.1 420.41 C 711.17 379.3 749.39 334.13 801.09 277.77 M 677.1 420.41 C 711.36 382.96 741.45 348.23 801.09 277.77 M 682.74 420.02 C 724.94 367.81 773.97 317.11 801.49 283.42 M 682.74 420.02 C 709.2 392.76 733.74 362.94 801.49 283.42 M 687.73 420.38 C 724.36 372.18 766.63 332.15 801.23 289.82 M 687.73 420.38 C 715.91 391.21 746 356.55 801.23 289.82 M 693.37 419.99 C 731.35 375.56 773.12 326.89 801.62 295.46 M 693.37 419.99 C 730.08 376 766.98 334.27 801.62 295.46 M 698.36 420.35 C 726.85 391.51 751.88 358.93 801.36 301.86 M 698.36 420.35 C 728.8 381.94 761.92 346.43 801.36 301.86 M 704 419.95 C 734.1 385.96 758.71 352.51 801.1 308.25 M 704 419.95 C 739.32 380.89 776.19 339.18 801.1 308.25 M 708.99 420.31 C 725.28 398.19 747.22 375.47 801.49 313.9 M 708.99 420.31 C 743.94 381.36 779 342.54 801.49 313.9 M 714.63 419.92 C 739.34 391.94 765.94 361.87 801.23 320.29 M 714.63 419.92 C 737.41 394.17 758.32 368.64 801.23 320.29 M 719.62 420.28 C 740.7 397.62 763.73 371.12 801.63 325.94 M 719.62 420.28 C 742.74 392.2 767.7 364.64 801.63 325.94 M 725.26 419.88 C 743.17 403.57 763.67 384.42 801.37 332.34 M 725.26 419.88 C 747.89 396.75 770.33 370.96 801.37 332.34 M 730.25 420.24 C 746.44 399.53 765.45 381.37 801.1 338.73 M 730.25 420.24 C 751.53 399 766.86 379.1 801.1 338.73 M 735.89 419.85 C 754.99 395.6 772.78 380.36 801.5 344.38 M 735.89 419.85 C 747.95 402.28 760.4 389.02 801.5 344.38 M 740.88 420.21 C 762.54 399.47 781.7 381.34 801.24 350.77 M 740.88 420.21 C 752.35 406.85 766.06 388.84 801.24 350.77 M 746.52 419.81 C 766.07 394.79 786.15 374.78 801.63 356.42 M 746.52 419.81 C 760.5 405.39 774.35 388.62 801.63 356.42 M 750.85 420.93 C 762.08 406.26 778.01 396.27 801.37 362.81 M 750.85 420.93 C 773.82 398.09 792.33 376.78 801.37 362.81 M 757.15 419.78 C 770.89 405.94 776.53 393.12 801.11 369.21 M 757.15 419.78 C 770.36 404.63 783.66 387.85 801.11 369.21 M 762.8 419.38 C 769.88 410.36 778.92 397.34 800.19 376.37 M 762.8 419.38 C 772.89 409.17 776.88 402.6 800.19 376.37 M 769.1 418.23 C 778.23 406.73 780.56 398.99 798.62 384.27 M 769.1 418.23 C 780.71 407.48 789.72 392.86 798.62 384.27 M 774.08 418.59 C 783.41 413.15 792.33 398.26 797.04 392.18 M 774.08 418.59 C 782.37 409.17 788.88 402.99 797.04 392.18" fill="none" stroke="#dae8fc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 380.4 0 M 380.4 0 C 484.48 0.22 590.66 1.36 749.6 0 M 380.4 0 C 487.63 -4.73 594.27 -4.77 749.6 0 M 749.6 0 C 783.78 2.89 800.73 17.95 800 50.4 M 749.6 0 C 781.31 -3.23 802.59 13.31 800 50.4 M 800 50.4 C 806.27 114.04 805.45 183.56 800 369.6 M 800 50.4 C 798.01 120.11 798.88 186.59 800 369.6 M 800 369.6 C 801.66 401.82 785.88 418.08 749.6 420 M 800 369.6 C 803.37 401.94 780.97 417.25 749.6 420 M 749.6 420 C 613.86 413.18 472.31 414.17 380.4 420 M 749.6 420 C 607.64 419.42 464.32 418.63 380.4 420 M 380.4 420 C 346.16 422.87 333 400.67 330 369.6 M 380.4 420 C 344.58 415.84 330.53 402.41 330 369.6 M 330 369.6 C 328.44 296.52 324.84 218.04 330 50.4 M 330 369.6 C 331.5 268.28 330.36 164.87 330 50.4 M 330 50.4 C 332.87 13.54 348.32 -0.26 380.4 0 M 330 50.4 C 331.59 17.03 351.38 1.92 380.4 0" fill="none" stroke="#6c8ebf" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="360" y="140" width="410" height="160" rx="24" ry="24" fill="none" stroke="none" pointer-events="all"/><path d="M 366 146 C 366 146 366 146 366 146 M 366 146 C 366 146 366 146 366 146 M 363.11 155.42 C 369.6 153.78 373.51 147.95 374.26 142.59 M 363.11 155.42 C 365.27 150.46 370.56 148.34 374.26 142.59 M 360.23 164.84 C 365.82 156.7 374.44 149.52 380.56 141.44 M 360.23 164.84 C 366.03 159.31 370.8 153.08 380.56 141.44 M 360.62 170.48 C 366.27 160.31 376.45 149.67 385.55 141.8 M 360.62 170.48 C 364.78 165 373.81 154.55 385.55 141.8 M 360.36 176.88 C 375.5 160.76 384.45 149.94 391.19 141.41 M 360.36 176.88 C 367.88 167.85 378.32 157.96 391.19 141.41 M 360.75 182.52 C 372 167.44 384.05 152.31 396.18 141.77 M 360.75 182.52 C 373.08 168.24 380.99 156.65 396.18 141.77 M 360.49 188.92 C 370.5 176.58 385.1 159.18 401.82 141.37 M 360.49 188.92 C 369.65 177.88 376.57 168.32 401.82 141.37 M 360.89 194.56 C 375.22 173.91 394.34 156.72 406.81 141.73 M 360.89 194.56 C 368.29 183.72 378.44 173.71 406.81 141.73 M 360.63 200.96 C 378.75 181.26 402.48 150.42 412.45 141.34 M 360.63 200.96 C 376.06 185.55 389.11 165.61 412.45 141.34 M 360.36 207.36 C 379.4 187.31 392.7 169.42 417.44 141.7 M 360.36 207.36 C 379.66 182.66 398.36 160.87 417.44 141.7 M 360.76 213 C 374.14 194.32 386.82 183.03 422.43 142.06 M 360.76 213 C 378.63 190.77 396.72 167.73 422.43 142.06 M 360.5 219.4 C 381.38 195.42 398.04 167.99 428.07 141.66 M 360.5 219.4 C 375.66 204.26 392.1 184.37 428.07 141.66 M 360.89 225.04 C 382.53 203.56 401.71 183.58 433.06 142.02 M 360.89 225.04 C 386.53 193.97 415.66 164.48 433.06 142.02 M 360.63 231.44 C 381.54 199.7 410.28 175.55 438.7 141.63 M 360.63 231.44 C 379.83 210.33 400.27 187.2 438.7 141.63 M 361.03 237.08 C 389.6 208.16 409.34 181.13 443.69 141.99 M 361.03 237.08 C 391.35 205.03 419.3 167.38 443.69 141.99 M 360.76 243.48 C 392.08 211.42 419.79 173.05 449.33 141.59 M 360.76 243.48 C 379.05 222.98 400.74 199.69 449.33 141.59 M 360.5 249.88 C 385.82 225.4 403.28 194.94 454.32 141.95 M 360.5 249.88 C 384.13 221.75 410.3 192.49 454.32 141.95 M 360.9 255.52 C 388.38 221.23 416.62 190.4 459.96 141.56 M 360.9 255.52 C 396.94 214.69 433.81 172.83 459.96 141.56 M 360.64 261.92 C 398.98 211.19 444.53 164.58 464.95 141.92 M 360.64 261.92 C 381.68 235.86 405.4 208.02 464.95 141.92 M 361.03 267.56 C 401.42 215.81 449.2 165.8 470.59 141.52 M 361.03 267.56 C 395.02 231.24 422.35 198.45 470.59 141.52 M 360.77 273.96 C 407.53 227.17 447.81 177.13 475.58 141.88 M 360.77 273.96 C 397.39 229.92 432.54 189.9 475.58 141.88 M 361.16 279.6 C 399.64 239.27 439.77 191.21 480.57 142.24 M 361.16 279.6 C 395.59 233.4 432.96 193.55 480.57 142.24 M 362.87 283.74 C 400.85 234.69 442.25 189.09 486.21 141.85 M 362.87 283.74 C 397.69 243.12 435.49 197.33 486.21 141.85 M 364.58 287.87 C 401.46 241.4 442.84 189.51 491.2 142.21 M 364.58 287.87 C 396.1 252.21 427.26 218.45 491.2 142.21 M 366.28 292 C 415.3 237.36 462.62 183.86 496.84 141.82 M 366.28 292 C 418.9 233.4 470.48 175.12 496.84 141.82 M 367.99 296.14 C 394.23 261.47 420.39 232.34 501.83 142.18 M 367.99 296.14 C 395.7 267.25 423.21 233.65 501.83 142.18 M 371.66 298.01 C 412.98 254.55 448.31 204.73 507.47 141.78 M 371.66 298.01 C 399.32 266.99 425.08 236.93 507.47 141.78 M 375.34 299.88 C 428.2 236.8 483.43 176.99 512.46 142.14 M 375.34 299.88 C 422.14 245.65 472.38 188.26 512.46 142.14 M 380.33 300.24 C 425.83 245.74 474.03 197 518.1 141.75 M 380.33 300.24 C 437.78 237.82 489.18 178.51 518.1 141.75 M 385.97 299.84 C 425.1 250.98 466.19 203.56 523.09 142.11 M 385.97 299.84 C 441.4 240.26 493.72 179.05 523.09 142.11 M 390.96 300.2 C 442.44 245.17 489.57 190.19 528.07 142.47 M 390.96 300.2 C 423.7 259.86 461.48 219.78 528.07 142.47 M 396.6 299.81 C 436.89 252.14 477.38 206.72 533.72 142.07 M 396.6 299.81 C 427.04 266.32 459.56 232.48 533.72 142.07 M 401.59 300.17 C 432.21 264.92 468.92 226.48 538.7 142.43 M 401.59 300.17 C 447.92 242.04 496.92 189.36 538.7 142.43 M 407.23 299.77 C 438.75 267.18 466.04 233.3 544.35 142.04 M 407.23 299.77 C 456.88 248.95 500.7 194.95 544.35 142.04 M 412.22 300.13 C 460.46 242.66 507.05 189.13 549.33 142.4 M 412.22 300.13 C 445.96 264.47 478.24 226.5 549.33 142.4 M 417.2 300.49 C 469.14 242.55 513.29 190.91 554.98 142 M 417.2 300.49 C 446.34 267.6 477.4 230.55 554.98 142 M 422.85 300.1 C 455.26 262.48 487.87 226.64 559.96 142.36 M 422.85 300.1 C 465.61 251.38 507.6 205.38 559.96 142.36 M 427.83 300.46 C 474.74 248.43 519.37 187.54 565.61 141.97 M 427.83 300.46 C 476.02 248.34 517.4 200.16 565.61 141.97 M 433.48 300.06 C 483.54 245.68 529.48 189.75 570.59 142.33 M 433.48 300.06 C 462.6 262.18 496.28 224.08 570.59 142.33 M 438.46 300.42 C 484.39 251.68 521.84 203.85 576.24 141.93 M 438.46 300.42 C 477.61 252.01 518.88 202.9 576.24 141.93 M 444.11 300.03 C 487.4 248.31 537.01 190.16 581.22 142.29 M 444.11 300.03 C 481.34 256.52 516.64 214.16 581.22 142.29 M 449.09 300.39 C 503.32 239.49 555.51 176.86 586.21 142.65 M 449.09 300.39 C 506.82 237.62 558.83 177.25 586.21 142.65 M 454.74 299.99 C 498.52 252.82 538.6 201.16 591.85 142.26 M 454.74 299.99 C 503.14 247.12 548.13 192.97 591.85 142.26 M 459.72 300.35 C 504.4 253.56 547.84 203.7 596.84 142.62 M 459.72 300.35 C 485.41 266.99 516.72 232.61 596.84 142.62 M 464.71 300.71 C 516.33 241.41 565.99 188.39 602.48 142.23 M 464.71 300.71 C 518.86 241.63 570.13 182.72 602.48 142.23 M 470.35 300.32 C 500.97 272.22 528.09 233.65 607.47 142.59 M 470.35 300.32 C 521.97 241.85 568.01 186.34 607.47 142.59 M 475.34 300.68 C 523.96 251.86 564.76 200.04 613.11 142.19 M 475.34 300.68 C 503.03 269.27 531.82 236.39 613.11 142.19 M 480.98 300.28 C 530.63 248.61 577.95 188.11 618.1 142.55 M 480.98 300.28 C 514.18 263.1 548.81 225.09 618.1 142.55 M 485.97 300.65 C 536.42 243.12 582.43 183.77 623.74 142.16 M 485.97 300.65 C 516.53 266.27 545.75 231.83 623.74 142.16 M 491.61 300.25 C 526.84 249.15 572.34 205.85 628.73 142.52 M 491.61 300.25 C 523.27 262.42 554.38 230.18 628.73 142.52 M 496.6 300.61 C 542.69 250.09 591.92 189.96 633.72 142.88 M 496.6 300.61 C 536.67 253.57 575.86 207.33 633.72 142.88 M 502.24 300.22 C 535.34 256.49 580.41 209.37 639.36 142.48 M 502.24 300.22 C 540.02 256.65 579.95 212.23 639.36 142.48 M 507.23 300.58 C 557.9 238.7 613.75 174.65 644.35 142.84 M 507.23 300.58 C 545.68 256.99 585.22 208.55 644.35 142.84 M 512.87 300.18 C 567.35 238.33 623.5 172.3 649.99 142.45 M 512.87 300.18 C 561.86 246.3 610.67 194.21 649.99 142.45 M 517.86 300.54 C 545.05 268.91 574.68 235.98 654.98 142.81 M 517.86 300.54 C 572.48 239.62 625.02 178.19 654.98 142.81 M 522.85 300.9 C 565.73 254.27 607.56 209.64 660.62 142.41 M 522.85 300.9 C 577.3 242.5 627.03 183.41 660.62 142.41 M 528.49 300.51 C 573.53 239.96 625.14 184.85 665.61 142.77 M 528.49 300.51 C 571.81 253.3 614.74 203.17 665.61 142.77 M 533.48 300.87 C 569.6 264.07 602.32 220.57 671.25 142.38 M 533.48 300.87 C 573.55 260.33 611.92 213.61 671.25 142.38 M 539.12 300.47 C 579.91 255.92 610.97 217.55 676.24 142.74 M 539.12 300.47 C 581.5 252.89 622.7 208.25 676.24 142.74 M 544.11 300.83 C 577.63 253.2 617.7 211.2 681.23 143.1 M 544.11 300.83 C 592.01 242.98 644.38 185.02 681.23 143.1 M 549.75 300.44 C 606.04 238.51 656.05 176.11 686.87 142.7 M 549.75 300.44 C 596.59 247.99 644.19 193.42 686.87 142.7 M 554.74 300.8 C 592.83 262.79 626.68 224.23 691.86 143.06 M 554.74 300.8 C 599.3 246.89 643.9 195.4 691.86 143.06 M 560.38 300.4 C 611.72 237.09 671.1 175.92 697.5 142.67 M 560.38 300.4 C 609.38 243.62 662.34 183.62 697.5 142.67 M 565.37 300.76 C 610.37 249.29 656.34 191.26 702.49 143.03 M 565.37 300.76 C 600.75 257.06 637.71 217.88 702.49 143.03 M 570.36 301.12 C 602.44 264.44 626.24 235.76 708.13 142.63 M 570.36 301.12 C 606.97 265.05 641.76 223.39 708.13 142.63 M 576 300.73 C 625.45 238.56 679.13 175.39 713.12 142.99 M 576 300.73 C 604.47 265.84 632.16 233.11 713.12 142.99 M 580.99 301.09 C 614.14 260.2 639.97 229.87 718.76 142.6 M 580.99 301.09 C 630.11 247.15 676.71 191.56 718.76 142.6 M 586.63 300.69 C 637.99 243.06 686 188.43 723.75 142.96 M 586.63 300.69 C 616.17 260.2 649.42 222.21 723.75 142.96 M 591.62 301.05 C 626.23 266.79 650.19 229.46 729.39 142.57 M 591.62 301.05 C 622.23 264.27 655.34 228.47 729.39 142.57 M 597.26 300.66 C 640.77 257.49 674.96 209.41 734.38 142.93 M 597.26 300.66 C 651.21 239.55 701.02 182.61 734.38 142.93 M 602.25 301.02 C 639.75 260.21 678.82 213.44 739.36 143.29 M 602.25 301.02 C 646.6 243.04 695.74 187.74 739.36 143.29 M 607.89 300.63 C 648.05 252.01 686.34 204.52 745.01 142.89 M 607.89 300.63 C 643.89 261.01 677.24 220.73 745.01 142.89 M 612.88 300.99 C 643.41 263.63 673.32 231.86 749.99 143.25 M 612.88 300.99 C 658.38 253.54 702.6 202.56 749.99 143.25 M 617.86 301.35 C 642.77 263.62 674.75 233.16 756.95 141.35 M 617.86 301.35 C 655.34 257.05 692.19 216.66 756.95 141.35 M 623.51 300.95 C 650.61 270.3 682.12 236.88 759.97 143.97 M 623.51 300.95 C 656.72 259.77 693.38 221.45 759.97 143.97 M 628.49 301.31 C 672.66 248.78 718.87 197.19 763.64 145.84 M 628.49 301.31 C 657.36 265.98 689.92 231.45 763.64 145.84 M 634.14 300.92 C 682.77 243.13 739.57 179.83 766.66 148.47 M 634.14 300.92 C 667.09 262.64 705.09 219.15 766.66 148.47 M 639.12 301.28 C 671.59 268.92 705.71 231.78 768.37 152.6 M 639.12 301.28 C 678.19 259.19 718.65 210.91 768.37 152.6 M 644.77 300.88 C 694.64 248.79 739.11 192.77 770.07 156.73 M 644.77 300.88 C 686.34 255.08 725.63 206.21 770.07 156.73 M 649.75 301.24 C 679.95 273.47 707.43 237.11 771.78 160.87 M 649.75 301.24 C 680.42 260.98 717.8 219.7 771.78 160.87 M 655.4 300.85 C 683.4 267.68 705.66 239.76 772.18 166.51 M 655.4 300.85 C 683.85 269.43 708.35 241.44 772.18 166.51 M 660.38 301.21 C 689.53 267.98 715.46 233.03 771.91 172.91 M 660.38 301.21 C 689.68 264.82 725.06 226.82 771.91 172.91 M 666.03 300.81 C 706.23 252.19 740.51 208.95 771.65 179.31 M 666.03 300.81 C 688.71 276.68 710 249.04 771.65 179.31 M 671.01 301.17 C 696.3 274.09 715.83 249.43 772.05 184.95 M 671.01 301.17 C 699.63 265.1 729.28 233.8 772.05 184.95 M 676 301.53 C 708.25 262.26 750.26 227.96 771.79 191.35 M 676 301.53 C 709.8 262.41 740.25 227.19 771.79 191.35 M 681.64 301.14 C 701.09 277.29 718.95 256.69 771.52 197.74 M 681.64 301.14 C 712.27 260.64 747.18 221.12 771.52 197.74 M 686.63 301.5 C 718 270.17 748.76 237.2 771.92 203.39 M 686.63 301.5 C 712.99 269.86 738.6 239.39 771.92 203.39 M 692.27 301.1 C 717.42 270.37 748.2 233.65 771.66 209.78 M 692.27 301.1 C 716.47 271.7 740.83 245.14 771.66 209.78 M 697.26 301.46 C 721.29 276.58 742.51 245.51 771.4 216.18 M 697.26 301.46 C 718.73 278.8 738.69 256 771.4 216.18 M 702.9 301.07 C 723.08 278.5 741.25 261.73 771.79 221.83 M 702.9 301.07 C 723.73 273.24 749.35 247.32 771.79 221.83 M 707.89 301.43 C 731.3 277.52 750.72 254.62 771.53 228.22 M 707.89 301.43 C 722.67 286.95 736.6 271.92 771.53 228.22 M 713.53 301.04 C 728.74 283.85 746.6 262.81 771.27 234.62 M 713.53 301.04 C 734.97 275.74 755.61 251.34 771.27 234.62 M 718.52 301.4 C 730.66 290.63 741.61 278.49 771.66 240.26 M 718.52 301.4 C 736.56 282.61 756.66 263.04 771.66 240.26 M 723.51 301.76 C 740.55 282.25 761.06 262.16 771.4 246.66 M 723.51 301.76 C 735.72 289.99 747.78 272.08 771.4 246.66 M 729.15 301.36 C 742.73 285.3 753.41 273.48 771.14 253.06 M 729.15 301.36 C 739.74 287.08 752 273.55 771.14 253.06 M 734.14 301.72 C 742.81 287.11 755.91 277.56 771.53 258.7 M 734.14 301.72 C 745.93 290.93 756.91 277.01 771.53 258.7 M 739.78 301.33 C 753.47 284.71 763.66 270.01 771.27 265.1 M 739.78 301.33 C 750.16 290.19 762.39 275.16 771.27 265.1 M 746.08 300.18 C 756.29 291.01 763.42 275.67 771.01 271.5 M 746.08 300.18 C 752.84 291.75 756.61 284.12 771.01 271.5 M 753.04 298.27 C 760.7 295.98 760.11 290.24 770.75 277.9 M 753.04 298.27 C 758.86 290.74 760.38 288.39 770.75 277.9 M 759.34 297.12 C 764.03 296.19 764.37 292.69 768.52 286.56 M 759.34 297.12 C 761.39 295.78 764.45 293.17 768.52 286.56" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 384 140 M 384 140 C 457.85 138.51 532.79 135.56 746 140 M 384 140 C 518.37 144.42 650.38 144.42 746 140 M 746 140 C 759.22 142.51 767.24 146.78 770 164 M 746 140 C 760.79 142.74 767.12 151.49 770 164 M 770 164 C 772.18 203.96 768.74 241.38 770 276 M 770 164 C 771.69 204.88 770.21 247.49 770 276 M 770 276 C 773.28 288.24 760.08 299.23 746 300 M 770 276 C 767.99 293.05 758.29 304.44 746 300 M 746 300 C 654.18 299.38 561.83 301.21 384 300 M 746 300 C 657.72 302.42 571.61 302.6 384 300 M 384 300 C 371.85 302.68 362.42 294.66 360 276 M 384 300 C 372.02 303.24 359.7 290.51 360 276 M 360 276 C 358.82 248.61 357.27 228.62 360 164 M 360 276 C 359.55 237.13 356.91 197.62 360 164 M 360 164 C 358.51 148.09 364.83 141.54 384 140 M 360 164 C 356.37 148.16 364.32 140.64 384 140" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="360" y="670" width="410" height="170" rx="25.5" ry="25.5" fill="none" stroke="none" pointer-events="all"/><path d="M 366.39 676.35 C 366.39 676.35 366.39 676.35 366.39 676.35 M 366.39 676.35 C 366.39 676.35 366.39 676.35 366.39 676.35 M 363.51 685.77 C 371.32 683.9 371.62 677.19 375.32 672.18 M 363.51 685.77 C 368.56 680.08 371.46 676.23 375.32 672.18 M 359.97 695.94 C 366.74 691.27 374.5 679.27 380.96 671.79 M 359.97 695.94 C 365.4 687.22 371.84 681.03 380.96 671.79 M 360.36 701.58 C 367.24 693.15 373.75 683.94 386.6 671.4 M 360.36 701.58 C 368.23 692.7 374.61 684.37 386.6 671.4 M 360.1 707.98 C 370.02 703.2 377.87 691.52 392.25 671 M 360.1 707.98 C 368.32 699.62 376.16 691.74 392.25 671 M 360.49 713.62 C 375.49 700.96 380.46 690.34 397.23 671.36 M 360.49 713.62 C 373.78 699.74 383.54 688.89 397.23 671.36 M 360.23 720.02 C 371.07 704.99 386.2 697.04 402.88 670.97 M 360.23 720.02 C 373.1 702.47 389.38 685.82 402.88 670.97 M 359.97 726.42 C 380.02 710.36 393.2 685.35 407.86 671.33 M 359.97 726.42 C 370.54 712.19 383.77 699.18 407.86 671.33 M 360.37 732.06 C 370.95 716.44 385.24 704.71 413.51 670.93 M 360.37 732.06 C 372.86 714.45 390.17 699.89 413.51 670.93 M 360.1 738.46 C 382.65 709.42 407.46 685.29 418.49 671.29 M 360.1 738.46 C 378.75 717.66 398.16 695.77 418.49 671.29 M 360.5 744.1 C 372.1 732.39 392 715.08 424.14 670.9 M 360.5 744.1 C 381.79 717.25 408.45 691.08 424.14 670.9 M 360.24 750.5 C 382.71 720.99 409.73 690.98 429.12 671.26 M 360.24 750.5 C 380.25 728.86 396.26 707.54 429.12 671.26 M 360.63 756.15 C 378.22 738.09 399.18 713.54 434.77 670.86 M 360.63 756.15 C 376.51 739.3 391.15 718.69 434.77 670.86 M 360.37 762.54 C 381.85 739.21 406.39 713.27 439.75 671.22 M 360.37 762.54 C 383.79 733.07 413.78 701.68 439.75 671.22 M 360.11 768.94 C 386.77 739.48 417.65 705.03 445.4 670.83 M 360.11 768.94 C 385.61 739.88 413.72 707.48 445.4 670.83 M 360.5 774.58 C 384.39 746.47 408.39 715.26 450.38 671.19 M 360.5 774.58 C 398.67 735.71 431.14 695.29 450.38 671.19 M 360.24 780.98 C 392.94 744.92 424.18 706.64 456.03 670.79 M 360.24 780.98 C 383.89 750.85 408.76 725.96 456.03 670.79 M 360.64 786.62 C 386.72 750.74 413.29 725.81 461.01 671.15 M 360.64 786.62 C 389.97 752.34 419.08 718.16 461.01 671.15 M 360.38 793.02 C 386.19 761.92 420.86 726.98 466 671.51 M 360.38 793.02 C 387.97 761.05 415.79 730.18 466 671.51 M 360.77 798.67 C 401 755.03 436.86 716.11 471.64 671.12 M 360.77 798.67 C 393.43 766.13 421.07 732.19 471.64 671.12 M 360.51 805.06 C 400.08 761.35 439.81 715.64 476.63 671.48 M 360.51 805.06 C 396.9 762.26 433.18 718.61 476.63 671.48 M 360.25 811.46 C 400.03 768.21 434.41 736.13 482.27 671.09 M 360.25 811.46 C 398.99 771 432.39 726.91 482.27 671.09 M 360.64 817.1 C 394.02 780.16 424.43 735.68 487.26 671.45 M 360.64 817.1 C 393.41 779.83 419.67 749.22 487.26 671.45 M 361.69 821.99 C 408.79 766.38 449.96 720.46 492.9 671.05 M 361.69 821.99 C 387.19 786.33 416.07 756.46 492.9 671.05 M 363.4 826.13 C 392.03 795.23 421.43 759.94 497.89 671.41 M 363.4 826.13 C 405.8 776.41 448.27 727.65 497.89 671.41 M 365.76 829.51 C 400.43 783.52 442.55 741.75 503.53 671.02 M 365.76 829.51 C 419.25 768.68 472.5 704.69 503.53 671.02 M 366.81 834.39 C 418.56 770.11 474.66 707.66 508.52 671.38 M 366.81 834.39 C 394.55 802.44 423.24 769.99 508.52 671.38 M 370.49 836.26 C 402.48 802.58 431.7 764.34 514.16 670.98 M 370.49 836.26 C 423.19 777.4 476.33 713.66 514.16 670.98 M 374.16 838.13 C 422.8 784.44 460.88 733.1 519.15 671.34 M 374.16 838.13 C 422.04 782.32 471.94 727.04 519.15 671.34 M 377.18 840.76 C 418.65 793.01 464.5 744.13 524.79 670.95 M 377.18 840.76 C 426.37 783.76 478.46 725.51 524.79 670.95 M 381.51 841.87 C 424.88 790.83 474.1 739.29 529.78 671.31 M 381.51 841.87 C 425.06 788.78 467.95 738.2 529.78 671.31 M 387.16 841.48 C 437.41 783.49 485.77 719.15 535.43 670.91 M 387.16 841.48 C 415.34 807.53 444.59 773.38 535.43 670.91 M 392.8 841.08 C 427.56 799.95 454.38 766.52 540.41 671.27 M 392.8 841.08 C 442.34 784.59 490.84 728.32 540.41 671.27 M 397.79 841.44 C 432.05 802.87 458.15 771.16 546.06 670.88 M 397.79 841.44 C 440.51 791.75 485.15 741.21 546.06 670.88 M 402.77 841.8 C 452.9 780.11 504.26 720.8 551.04 671.24 M 402.77 841.8 C 459.27 773.68 515.33 704.12 551.04 671.24 M 408.42 841.41 C 452.64 787.63 501.2 735.1 556.69 670.84 M 408.42 841.41 C 453.63 790.85 500.91 735.43 556.69 670.84 M 413.4 841.77 C 444.37 797.95 485.49 757.88 561.67 671.2 M 413.4 841.77 C 454.63 791.29 498.57 745.01 561.67 671.2 M 419.05 841.37 C 474.23 777.03 527.49 715.38 567.32 670.81 M 419.05 841.37 C 468.4 782.3 519.92 721.88 567.32 670.81 M 424.03 841.73 C 473.06 788.12 519.78 729.2 572.3 671.17 M 424.03 841.73 C 469.9 785.48 517.69 733.87 572.3 671.17 M 429.68 841.34 C 476.68 779.48 530.38 719.59 577.95 670.77 M 429.68 841.34 C 468.67 794.94 506.72 749.44 577.95 670.77 M 434.66 841.7 C 479.64 789.18 520.26 739.53 582.93 671.13 M 434.66 841.7 C 472.9 796.92 514.9 746.38 582.93 671.13 M 440.31 841.3 C 488.59 784.26 538.62 725.35 587.92 671.49 M 440.31 841.3 C 487.96 783.03 533.99 728.83 587.92 671.49 M 445.29 841.66 C 489.85 794.12 530.17 744.64 593.56 671.1 M 445.29 841.66 C 477.94 799.19 515.94 758.05 593.56 671.1 M 450.94 841.27 C 482.04 803.42 507.55 768.73 598.55 671.46 M 450.94 841.27 C 509.11 778.89 564.45 713.82 598.55 671.46 M 455.92 841.63 C 507.02 786.16 553.84 730.62 604.19 671.07 M 455.92 841.63 C 515.21 777.15 569.76 715.6 604.19 671.07 M 461.57 841.24 C 514.75 778.07 564.43 723 609.18 671.43 M 461.57 841.24 C 497.87 798.48 532.36 760.48 609.18 671.43 M 466.55 841.6 C 510.04 784.75 554.65 732.39 614.82 671.03 M 466.55 841.6 C 511.52 788.48 557.53 735.04 614.82 671.03 M 472.2 841.2 C 501.69 806.66 531.01 770.14 619.81 671.39 M 472.2 841.2 C 515.74 790.08 562.75 735.46 619.81 671.39 M 477.18 841.56 C 534.24 780.83 588.41 714.51 625.45 671 M 477.18 841.56 C 528.73 775.83 584.92 716.07 625.45 671 M 482.83 841.17 C 526.88 788.31 566.72 739.5 630.44 671.36 M 482.83 841.17 C 542.34 775 602.78 705.29 630.44 671.36 M 487.81 841.53 C 536.48 782.85 586.28 726.37 636.08 670.96 M 487.81 841.53 C 544.92 780.26 599.07 719.05 636.08 670.96 M 493.46 841.13 C 547.16 776.54 604.68 711.86 641.07 671.32 M 493.46 841.13 C 536.2 791.98 574.43 744.56 641.07 671.32 M 498.44 841.49 C 540.72 791.11 582.48 746.74 646.71 670.93 M 498.44 841.49 C 531.04 806.42 564.5 772.39 646.71 670.93 M 504.09 841.1 C 542.9 792.08 588.19 738.02 651.7 671.29 M 504.09 841.1 C 554.85 789.86 600.45 733.58 651.7 671.29 M 509.07 841.46 C 566.48 777.53 619.96 718.24 657.34 670.89 M 509.07 841.46 C 547.88 796.88 585.13 751.19 657.34 670.89 M 514.06 841.82 C 567.26 779.32 618.5 726.62 662.33 671.25 M 514.06 841.82 C 552.53 798.14 590.69 756.56 662.33 671.25 M 519.7 841.42 C 579.17 777.46 634.56 707.43 667.97 670.86 M 519.7 841.42 C 551.49 807.9 579.73 774.93 667.97 670.86 M 524.69 841.78 C 571.6 782.8 619.88 730.14 672.96 671.22 M 524.69 841.78 C 558.89 802.46 591.77 763.41 672.96 671.22 M 530.33 841.39 C 563.15 799.41 601.05 759.91 678.6 670.82 M 530.33 841.39 C 582.75 777.47 637.92 712.62 678.6 670.82 M 535.32 841.75 C 569.25 803.89 607.17 766.75 683.59 671.18 M 535.32 841.75 C 585.96 783.39 636.18 726.64 683.59 671.18 M 540.96 841.35 C 583.01 801.23 619.51 753.56 689.23 670.79 M 540.96 841.35 C 572.09 808.32 601.46 773.06 689.23 670.79 M 545.95 841.71 C 580.09 802.2 608.92 767.69 694.22 671.15 M 545.95 841.71 C 587.71 792.87 634.8 742.42 694.22 671.15 M 551.59 841.32 C 588.2 797.66 619.46 758.98 699.21 671.51 M 551.59 841.32 C 579.26 808.38 610.57 770.02 699.21 671.51 M 556.58 841.68 C 611.83 774.36 674.14 703.68 704.85 671.12 M 556.58 841.68 C 615.17 775.72 673.63 708.65 704.85 671.12 M 562.22 841.29 C 607.38 786.35 652.93 739.34 709.84 671.48 M 562.22 841.29 C 593.89 807.28 624.58 772.55 709.84 671.48 M 567.21 841.65 C 609.41 798.51 643.62 752.23 715.48 671.08 M 567.21 841.65 C 608.23 794.54 651.7 744.35 715.48 671.08 M 572.85 841.25 C 624.12 782.87 675.61 729.93 720.47 671.44 M 572.85 841.25 C 613.61 796.99 654.2 752.07 720.47 671.44 M 577.84 841.61 C 617.82 802.24 652.74 765.38 726.11 671.05 M 577.84 841.61 C 618.55 796.31 654.45 754.9 726.11 671.05 M 583.48 841.22 C 644.75 774.26 699.83 715.97 731.1 671.41 M 583.48 841.22 C 637.51 778.88 692.94 717.47 731.1 671.41 M 588.47 841.58 C 641.05 782.88 693.83 714.96 736.74 671.01 M 588.47 841.58 C 629.85 792.94 675.96 742.31 736.74 671.01 M 594.11 841.18 C 640.62 793.8 679.67 741.36 741.73 671.37 M 594.11 841.18 C 646.15 782.68 697.02 723.88 741.73 671.37 M 599.1 841.54 C 634.11 808.89 662.76 769.62 746.71 671.73 M 599.1 841.54 C 636.35 796.88 673.27 754.63 746.71 671.73 M 604.74 841.15 C 638 804.19 673.38 765.6 751.05 672.85 M 604.74 841.15 C 660.43 776.84 716.48 715.78 751.05 672.85 M 609.73 841.51 C 660.01 784.63 710.21 724.48 756.69 672.45 M 609.73 841.51 C 662.77 784.76 709.98 726.27 756.69 672.45 M 615.37 841.11 C 670.65 776.82 725.65 721.49 760.36 674.32 M 615.37 841.11 C 649.77 800.82 685.72 758.94 760.36 674.32 M 620.36 841.47 C 650.63 803.34 685.01 764.19 764.04 676.19 M 620.36 841.47 C 668.8 786.93 717.19 732.58 764.04 676.19 M 625.35 841.83 C 681.74 775.44 734.91 715.41 765.75 680.32 M 625.35 841.83 C 664.7 793.26 708.28 747.59 765.75 680.32 M 630.99 841.44 C 682.51 785.26 738.68 721.14 767.45 684.46 M 630.99 841.44 C 662.58 812.13 691.26 778.52 767.45 684.46 M 635.98 841.8 C 666.39 807.13 704.83 765.13 769.16 688.59 M 635.98 841.8 C 675.68 796.32 714.64 748.61 769.16 688.59 M 641.62 841.4 C 671.2 805.17 707.68 765.09 772.18 691.22 M 641.62 841.4 C 687.53 791.07 729.08 741.82 772.18 691.22 M 646.61 841.76 C 687.6 793.06 730.66 749.32 771.92 697.61 M 646.61 841.76 C 689.49 794.86 728.21 747.3 771.92 697.61 M 652.25 841.37 C 680.92 817.81 701.7 786.11 771.65 704.01 M 652.25 841.37 C 682.38 803.71 712.14 771.04 771.65 704.01 M 657.24 841.73 C 689.61 806.19 719.25 773.83 772.05 709.66 M 657.24 841.73 C 698.06 793.08 739.79 748.98 772.05 709.66 M 662.88 841.33 C 689.76 810.99 714.86 777.63 771.79 716.05 M 662.88 841.33 C 693.8 804.15 726.57 767.7 771.79 716.05 M 667.87 841.69 C 698.19 810.93 720.62 781.26 771.53 722.45 M 667.87 841.69 C 691.17 816.67 714.43 791.52 771.53 722.45 M 673.51 841.3 C 705.59 802.63 737.96 772.95 771.26 728.85 M 673.51 841.3 C 709.41 802.89 744.77 760.89 771.26 728.85 M 678.5 841.66 C 700.92 817.19 723.69 785.3 771.66 734.49 M 678.5 841.66 C 702.08 813.68 722.25 786.16 771.66 734.49 M 684.14 841.27 C 713.57 810.28 735.36 776.71 771.4 740.89 M 684.14 841.27 C 713.59 806.21 745.16 769.81 771.4 740.89 M 689.13 841.63 C 713.57 808.33 746.34 779.53 771.14 747.29 M 689.13 841.63 C 710.96 816.33 732.92 792.3 771.14 747.29 M 694.77 841.23 C 717.52 814.81 742.27 790.29 771.53 752.93 M 694.77 841.23 C 723.82 809.13 751.14 779.83 771.53 752.93 M 699.76 841.59 C 731.91 810.52 754.86 777.69 771.27 759.33 M 699.76 841.59 C 725.45 809.86 750.61 778.97 771.27 759.33 M 705.4 841.2 C 724.06 815.13 747.37 787.16 771.01 765.73 M 705.4 841.2 C 721.56 822.39 734.39 806.35 771.01 765.73 M 710.39 841.56 C 729.54 823.32 747.72 801.45 771.4 771.37 M 710.39 841.56 C 730.33 815.84 750.68 793.03 771.4 771.37 M 716.03 841.16 C 740.5 812.87 757.21 790.81 771.14 777.77 M 716.03 841.16 C 729.63 824.69 741.53 811.03 771.14 777.77 M 721.02 841.52 C 732.74 830.3 740.16 815.48 770.88 784.16 M 721.02 841.52 C 733.67 827.22 741.33 815.7 770.88 784.16 M 726.66 841.13 C 736.22 826.06 749.26 809.97 771.27 789.81 M 726.66 841.13 C 737.04 831.9 745.58 821 771.27 789.81 M 731.65 841.49 C 744.23 825.32 760.02 809.09 771.01 796.21 M 731.65 841.49 C 739.46 832.08 749.64 824.19 771.01 796.21 M 737.29 841.09 C 747.9 828.63 753.34 819.77 770.75 802.6 M 737.29 841.09 C 747.65 828.21 760.49 814.57 770.75 802.6 M 742.28 841.45 C 749 830.62 760.16 820.3 771.15 808.25 M 742.28 841.45 C 749.76 832.19 760.46 819.25 771.15 808.25 M 747.27 841.81 C 757.35 836.33 764.88 828.32 770.88 814.64 M 747.27 841.81 C 752.96 833.98 759.03 826.47 770.88 814.64 M 753.57 840.66 C 758.44 832.66 761.14 829.71 770.62 821.04 M 753.57 840.66 C 758.28 835.54 760.83 830.41 770.62 821.04" fill="none" stroke="#f8cecc" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 385.5 670 M 385.5 670 C 481.74 671.97 574.93 676.84 744.5 670 M 385.5 670 C 520.97 672.47 652.77 672.53 744.5 670 M 744.5 670 C 763.23 673.33 769.6 679.76 770 695.5 M 744.5 670 C 762.9 669.44 766.04 675.36 770 695.5 M 770 695.5 C 766.14 720.69 769.72 750.99 770 814.5 M 770 695.5 C 768.27 738.77 768.22 777.83 770 814.5 M 770 814.5 C 773.15 831.45 765.06 840.87 744.5 840 M 770 814.5 C 771.08 827.82 756.96 844.55 744.5 840 M 744.5 840 C 625.99 843.58 506.32 846.35 385.5 840 M 744.5 840 C 615.27 844.43 484.9 843.99 385.5 840 M 385.5 840 C 368.86 842.46 362.13 834.87 360 814.5 M 385.5 840 C 369.27 842.26 355.77 830.13 360 814.5 M 360 814.5 C 361.54 779.25 363.82 748.49 360 695.5 M 360 814.5 C 362.58 774.8 360.54 732.15 360 695.5 M 360 695.5 C 359.11 677.73 367.41 666.1 385.5 670 M 360 695.5 C 357.87 679.81 370.17 668.22 385.5 670" fill="none" stroke="#b85450" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="390" y="690" width="350" height="120" rx="18" ry="18" fill="none" stroke="none" pointer-events="all"/><path d="M 394.67 694.31 C 394.67 694.31 394.67 694.31 394.67 694.31 M 394.67 694.31 C 394.67 694.31 394.67 694.31 394.67 694.31 M 391.13 704.48 C 390.87 699.47 396.32 696.36 402.28 691.65 M 391.13 704.48 C 394.91 699.71 398.96 694.25 402.28 691.65 M 392.18 709.37 C 398.47 707.47 402.73 697.76 408.58 690.5 M 392.18 709.37 C 393.59 705.45 398.69 703.31 408.58 690.5 M 391.92 715.76 C 397.03 710.53 401.94 709.13 413.57 690.86 M 391.92 715.76 C 399.52 706.29 404.41 699.93 413.57 690.86 M 391.65 722.16 C 399.48 714.17 403.51 703.61 419.21 690.46 M 391.65 722.16 C 403.17 708.18 415.29 698.37 419.21 690.46 M 392.05 727.8 C 397.7 720.97 403.8 713.01 424.2 690.82 M 392.05 727.8 C 403.3 713.63 417.31 701.23 424.2 690.82 M 391.79 734.2 C 405.81 716.13 421.47 696.9 429.84 690.43 M 391.79 734.2 C 400.9 724.19 409.9 712.32 429.84 690.43 M 392.18 739.85 C 404.58 726.61 418.57 704.12 434.83 690.79 M 392.18 739.85 C 401.42 727.32 412.74 714.36 434.83 690.79 M 391.92 746.24 C 406.42 726.88 424.27 710.99 440.47 690.39 M 391.92 746.24 C 411.37 724.21 432.33 700.87 440.47 690.39 M 392.32 751.89 C 410.54 733.26 434.06 706.9 445.46 690.75 M 392.32 751.89 C 409.09 731.38 426.7 709.9 445.46 690.75 M 392.05 758.28 C 408.32 743.18 421.68 728.62 451.1 690.36 M 392.05 758.28 C 409.05 735.37 426.11 715.16 451.1 690.36 M 391.79 764.68 C 416.51 739.3 437.09 706.96 456.09 690.72 M 391.79 764.68 C 405.72 745.48 420.57 729.72 456.09 690.72 M 392.19 770.32 C 408.28 752.62 423.36 736.25 461.73 690.33 M 392.19 770.32 C 412.04 745.94 432.93 722.93 461.73 690.33 M 391.93 776.72 C 409.92 760.73 430.12 735.48 466.72 690.69 M 391.93 776.72 C 407.79 758.12 424.99 739.88 466.72 690.69 M 392.32 782.37 C 408.44 762.88 431.2 738.95 471.7 691.05 M 392.32 782.37 C 416.31 756.65 439.71 728.37 471.7 691.05 M 392.06 788.76 C 410.06 762.76 435.77 740.83 477.35 690.65 M 392.06 788.76 C 420.43 758.79 446.12 728.99 477.35 690.65 M 390.49 796.67 C 418.05 763.09 442.77 734.65 482.33 691.01 M 390.49 796.67 C 415.96 766.67 442.07 734.26 482.33 691.01 M 392.19 800.8 C 420.32 768.4 447.19 737.42 487.98 690.62 M 392.19 800.8 C 416.65 770.49 444.07 741.91 487.98 690.62 M 394.55 804.18 C 430.26 761.23 464.17 723.92 492.96 690.98 M 394.55 804.18 C 420.32 775.84 443.76 748.55 492.96 690.98 M 396.92 807.56 C 423.44 773.49 452.59 746.63 498.61 690.58 M 396.92 807.56 C 418.61 778.85 447.1 750.14 498.61 690.58 M 400.59 809.43 C 442.62 765.47 482.46 714.33 503.59 690.94 M 400.59 809.43 C 429.73 776.46 458.12 746.51 503.59 690.94 M 406.24 809.04 C 446.91 766.18 488.06 718.34 509.24 690.55 M 406.24 809.04 C 451.07 761.77 489.31 712.87 509.24 690.55 M 411.22 809.4 C 436.17 778.8 459.1 752.51 514.22 690.91 M 411.22 809.4 C 448.61 768.38 484.96 725.79 514.22 690.91 M 416.21 809.76 C 442.62 770.64 478.37 737.33 519.87 690.51 M 416.21 809.76 C 449.29 766.33 487.86 722.54 519.87 690.51 M 421.85 809.36 C 459.13 766.51 493.13 727.04 524.85 690.87 M 421.85 809.36 C 450.92 779.59 477.65 744 524.85 690.87 M 426.84 809.72 C 456.24 779.46 481.84 753.27 529.84 691.23 M 426.84 809.72 C 461.6 767.73 498.61 724.46 529.84 691.23 M 432.48 809.33 C 465.72 769.77 503.18 733.11 535.48 690.84 M 432.48 809.33 C 463.07 772.62 497.88 733.38 535.48 690.84 M 437.47 809.69 C 470.33 767.05 505.75 726.74 540.47 691.2 M 437.47 809.69 C 471.09 773.75 501.65 740.59 540.47 691.2 M 443.11 809.29 C 474.99 778.74 503.56 745.68 546.11 690.8 M 443.11 809.29 C 478.2 767.43 516.12 728.71 546.11 690.8 M 448.1 809.65 C 469.83 778.17 497.13 750.96 551.1 691.16 M 448.1 809.65 C 477.63 774.88 511.04 738.93 551.1 691.16 M 453.74 809.26 C 475.42 783.86 499.59 750.14 556.74 690.77 M 453.74 809.26 C 483 782 508.22 748.92 556.74 690.77 M 458.73 809.62 C 495.79 772.26 528.99 736.81 561.73 691.13 M 458.73 809.62 C 493.5 771.03 526.4 734.23 561.73 691.13 M 464.37 809.22 C 503.17 768.3 533.88 726.76 567.37 690.74 M 464.37 809.22 C 486.17 784.15 503.89 760.81 567.37 690.74 M 469.36 809.58 C 496.22 782.52 514.82 754 572.36 691.1 M 469.36 809.58 C 505.15 772.06 539.09 729.13 572.36 691.1 M 474.35 809.95 C 501.2 779.67 528.24 745.79 577.35 691.46 M 474.35 809.95 C 510.81 764.86 551.07 720.45 577.35 691.46 M 479.99 809.55 C 517.98 769.88 560.69 719.21 582.99 691.06 M 479.99 809.55 C 518.33 765.56 557.32 721.92 582.99 691.06 M 484.98 809.91 C 522.42 764.85 557.87 723.81 587.98 691.42 M 484.98 809.91 C 524.09 765.58 563.23 723.25 587.98 691.42 M 490.62 809.52 C 516.83 775.78 546.44 746.4 593.62 691.03 M 490.62 809.52 C 519.34 776.89 550.76 742.3 593.62 691.03 M 495.61 809.88 C 528.36 768.36 566.39 724.27 598.61 691.39 M 495.61 809.88 C 522.72 776.57 552.41 744.09 598.61 691.39 M 501.25 809.48 C 531.22 774.05 564.95 737.44 604.25 690.99 M 501.25 809.48 C 537.52 765.89 574.87 720.96 604.25 690.99 M 506.24 809.84 C 546.37 767.17 586.01 721.83 609.24 691.35 M 506.24 809.84 C 542.08 773.74 573.14 733.59 609.24 691.35 M 511.88 809.45 C 535.33 775.47 562.31 748.22 614.88 690.96 M 511.88 809.45 C 546.25 765.43 584.9 722.66 614.88 690.96 M 516.87 809.81 C 542.97 777.95 568.57 748.41 619.87 691.32 M 516.87 809.81 C 544.57 773.69 573.03 740.24 619.87 691.32 M 522.51 809.41 C 559.35 766.48 589.74 729.22 625.51 690.92 M 522.51 809.41 C 564.51 763.09 604.43 717.39 625.51 690.92 M 527.5 809.77 C 562.44 766.9 595.06 732.47 630.5 691.28 M 527.5 809.77 C 552.65 779.96 576.21 749.84 630.5 691.28 M 532.48 810.13 C 573.13 767.61 608.25 726.37 635.49 691.64 M 532.48 810.13 C 559.25 776.08 589.36 738.09 635.49 691.64 M 538.13 809.74 C 563.04 783.39 583.65 758.64 641.13 691.25 M 538.13 809.74 C 565.76 777.5 595.02 747.37 641.13 691.25 M 543.11 810.1 C 568.08 787.98 584.27 764.54 646.12 691.61 M 543.11 810.1 C 571.93 778.4 600.84 745.02 646.12 691.61 M 548.76 809.7 C 586.87 762.4 624.39 720.48 651.76 691.21 M 548.76 809.7 C 577.81 773.01 611.46 737.35 651.76 691.21 M 553.74 810.06 C 580.18 781.94 609.95 748.68 656.75 691.57 M 553.74 810.06 C 595.6 767.61 636.53 719.64 656.75 691.57 M 559.39 809.67 C 599.8 762.33 638.26 723.92 662.39 691.18 M 559.39 809.67 C 584.8 779.29 612.93 748.18 662.39 691.18 M 564.37 810.03 C 586.51 780.71 612.04 753.73 667.38 691.54 M 564.37 810.03 C 603.57 765.76 638.74 725.22 667.38 691.54 M 570.02 809.63 C 599.06 774.59 632.46 738.63 673.02 691.15 M 570.02 809.63 C 592.32 782.75 612.24 759.92 673.02 691.15 M 575 809.99 C 616.93 766.73 651.18 716.76 678.01 691.51 M 575 809.99 C 605.99 773.84 637.3 738.49 678.01 691.51 M 580.65 809.6 C 600.81 782.84 622.69 760.72 683.65 691.11 M 580.65 809.6 C 605.76 776.31 637.81 741.24 683.65 691.11 M 585.63 809.96 C 613.02 779.71 633.22 757.17 688.64 691.47 M 585.63 809.96 C 622.87 766.44 661.46 719.69 688.64 691.47 M 590.62 810.32 C 631.29 764.57 668.96 718.55 693.62 691.83 M 590.62 810.32 C 614.02 786.68 635.66 763.78 693.62 691.83 M 596.26 809.93 C 620.09 783.28 650.08 749.83 699.27 691.44 M 596.26 809.93 C 635.59 763.62 678.22 719.91 699.27 691.44 M 601.25 810.29 C 637.76 766.04 667.53 730.21 704.25 691.8 M 601.25 810.29 C 626.03 784.86 648.82 758.13 704.25 691.8 M 606.9 809.89 C 630.12 778.24 657.86 747.84 709.9 691.4 M 606.9 809.89 C 650.53 763.38 689.67 718.35 709.9 691.4 M 611.88 810.25 C 647.57 769.65 682.7 725.27 714.88 691.76 M 611.88 810.25 C 641.51 773.56 673.82 736.07 714.88 691.76 M 617.53 809.86 C 643.57 772.77 673.61 738.28 720.53 691.37 M 617.53 809.86 C 638.56 781.82 663.35 753.97 720.53 691.37 M 622.51 810.22 C 656.94 764.68 696.1 721.73 725.51 691.73 M 622.51 810.22 C 660.06 764.85 702.25 716.52 725.51 691.73 M 628.16 809.82 C 669.12 761.27 709.69 716.77 730.5 692.09 M 628.16 809.82 C 651.66 785.34 678.52 754.71 730.5 692.09 M 633.14 810.18 C 667.63 773.68 699.85 733.75 734.18 693.96 M 633.14 810.18 C 662.42 776.95 689.58 742.97 734.18 693.96 M 638.13 810.54 C 666.16 781.03 687.83 751.53 737.19 696.58 M 638.13 810.54 C 669.51 775.32 701.79 737.59 737.19 696.58 M 643.77 810.15 C 680.65 764.41 719.25 723.47 739.56 699.96 M 643.77 810.15 C 679.28 767.39 717.63 725.58 739.56 699.96 M 648.76 810.51 C 684.05 768.45 719.9 730.88 740.61 704.85 M 648.76 810.51 C 674.23 779.44 700.27 750.24 740.61 704.85 M 654.4 810.11 C 687.69 774.05 712.54 737.87 741 710.49 M 654.4 810.11 C 674.02 789.28 694.03 765.74 741 710.49 M 659.39 810.47 C 679.34 780.93 703.46 758.49 740.74 716.89 M 659.39 810.47 C 682.44 783.12 709.18 753.97 740.74 716.89 M 665.03 810.08 C 693.46 779.62 719.81 744.81 740.48 723.29 M 665.03 810.08 C 681.28 791.04 701.56 770.76 740.48 723.29 M 670.02 810.44 C 683.98 791.22 700.06 770.49 740.22 729.68 M 670.02 810.44 C 684.77 794.65 702.71 776.82 740.22 729.68 M 675.66 810.04 C 695.93 785.5 713.93 772.83 740.61 735.33 M 675.66 810.04 C 701.94 782.26 726.37 751.36 740.61 735.33 M 680.65 810.4 C 695.42 793.23 711.7 777.58 740.35 741.73 M 680.65 810.4 C 698.64 788.43 720.05 766.03 740.35 741.73 M 686.29 810.01 C 702.64 792.81 718.78 777.41 740.09 748.12 M 686.29 810.01 C 699.58 796.51 713.63 781.73 740.09 748.12 M 691.28 810.37 C 698.46 801.79 711.58 788.15 740.48 753.77 M 691.28 810.37 C 706.07 791.5 726.96 769.4 740.48 753.77 M 696.27 810.73 C 706.82 803.79 714.66 788.18 740.22 760.16 M 696.27 810.73 C 706.81 799.44 713.6 790.79 740.22 760.16 M 701.91 810.34 C 713.02 794.1 728.18 782.38 739.96 766.56 M 701.91 810.34 C 711.91 803.32 719.33 792.73 739.96 766.56 M 706.9 810.7 C 717.9 797.56 729.73 785.03 740.36 772.21 M 706.9 810.7 C 714.36 798.32 725.2 787.86 740.36 772.21 M 712.54 810.3 C 722.88 800.25 735.58 782.95 740.09 778.6 M 712.54 810.3 C 721.66 802.43 730.66 789.68 740.09 778.6 M 717.53 810.66 C 727.24 806.14 730.53 791.83 739.83 785 M 717.53 810.66 C 721.04 806.69 728.31 800.41 739.83 785 M 722.51 811.02 C 729.63 804.48 738.04 791.82 740.23 790.64 M 722.51 811.02 C 726.52 807.07 728.58 801.61 740.23 790.64 M 729.47 809.12 C 729.1 804.04 733.39 804.02 739.97 797.04 M 729.47 809.12 C 730.72 806.96 735.57 805.41 739.97 797.04" fill="none" stroke="#cdeb8b" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 408 690 M 408 690 C 514.52 689.23 615.38 693.95 722 690 M 408 690 C 534.85 688.72 660.3 687.87 722 690 M 722 690 C 731.04 688.67 740.08 692.71 740 708 M 722 690 C 736.88 694.59 740.63 696.25 740 708 M 740 708 C 744.6 743.16 740.54 771.14 740 792 M 740 708 C 739.27 725.42 740.73 744.04 740 792 M 740 792 C 743.02 802.54 736.18 810.61 722 810 M 740 792 C 740.59 805.07 736.53 811.34 722 810 M 722 810 C 607.31 811.89 492.5 813.89 408 810 M 722 810 C 634.49 807.87 547.72 806.67 408 810 M 408 810 C 394.1 807.12 388.55 806.14 390 792 M 408 810 C 397.09 805.5 392.47 801.47 390 792 M 390 792 C 391.84 769.1 391.58 739.23 390 708 M 390 792 C 389.98 773.65 389.69 750.75 390 708 M 390 708 C 388.64 697.56 395.54 687.36 408 690 M 390 708 C 390.45 698.46 395.41 689.09 408 690" fill="none" stroke="#36393d" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="390" y="160" width="350" height="110.29" rx="16.54" ry="16.54" fill="none" stroke="none" pointer-events="all"/><path d="M 394.28 163.97 C 394.28 163.97 394.28 163.97 394.28 163.97 M 394.28 163.97 C 394.28 163.97 394.28 163.97 394.28 163.97 M 390.74 174.14 C 393.38 170.5 398.91 166.18 401.89 161.31 M 390.74 174.14 C 393.8 172.08 395.26 169.35 401.89 161.31 M 392.45 178.27 C 392.59 171.05 399.32 170.28 407.54 160.91 M 392.45 178.27 C 395.28 172.03 399.14 167.54 407.54 160.91 M 392.19 184.67 C 401.5 175.91 406.57 167.81 412.52 161.27 M 392.19 184.67 C 398.81 177.61 401.18 173.96 412.52 161.27 M 392.58 190.31 C 397.64 180.93 403.47 177.26 418.17 160.88 M 392.58 190.31 C 399.48 181.26 407.91 173.74 418.17 160.88 M 392.32 196.71 C 400.07 180.56 411.87 168.22 423.15 161.24 M 392.32 196.71 C 400.14 185.7 408.82 178.99 423.15 161.24 M 392.06 203.11 C 403.54 184.31 417.3 166.61 428.8 160.84 M 392.06 203.11 C 402.33 193.92 411.37 181.08 428.8 160.84 M 392.45 208.75 C 403.97 188.79 421.27 179.26 433.78 161.2 M 392.45 208.75 C 408.6 193.32 421.05 177.65 433.78 161.2 M 392.19 215.15 C 413.41 193.58 426.77 175.47 439.43 160.81 M 392.19 215.15 C 403.97 202.58 415.87 188.34 439.43 160.81 M 392.59 220.79 C 408.9 199.42 431.44 172.41 444.41 161.17 M 392.59 220.79 C 403.1 208.26 417.28 191.26 444.41 161.17 M 392.32 227.19 C 405.5 207.54 422.39 189.45 450.06 160.77 M 392.32 227.19 C 410.18 207.81 426.13 189.8 450.06 160.77 M 392.72 232.83 C 407.44 212.33 429.47 193.14 455.04 161.13 M 392.72 232.83 C 407.63 215.27 423.43 197.94 455.04 161.13 M 392.46 239.23 C 412.23 215.34 430.65 191.77 460.69 160.74 M 392.46 239.23 C 412.14 217.58 432.79 195.08 460.69 160.74 M 392.2 245.63 C 408.69 226.4 421.01 209.46 465.67 161.1 M 392.2 245.63 C 415.08 222.05 439.48 195.05 465.67 161.1 M 392.59 251.27 C 420.97 213.57 454.98 178.02 470.66 161.46 M 392.59 251.27 C 416.9 222.72 441.66 196.7 470.66 161.46 M 391.67 258.42 C 419.07 226.19 443.97 194.79 476.3 161.07 M 391.67 258.42 C 427.24 221.02 457.85 181.08 476.3 161.07 M 393.38 262.56 C 417.43 234.89 445.72 201.43 481.29 161.43 M 393.38 262.56 C 424.47 226.97 454.6 188.97 481.29 161.43 M 395.09 266.69 C 422.59 234.42 446.91 201.21 486.93 161.03 M 395.09 266.69 C 411.11 242.89 432.09 220.93 486.93 161.03 M 398.11 269.31 C 423.42 243.11 444.1 211.16 491.92 161.39 M 398.11 269.31 C 432.18 231.44 461.12 191.11 491.92 161.39 M 401.78 271.18 C 433.22 238.86 470.3 194.46 497.56 161 M 401.78 271.18 C 433.18 232.4 469.95 195.44 497.56 161 M 406.77 271.54 C 431.77 242.18 460.9 214.53 502.55 161.36 M 406.77 271.54 C 441.51 233.66 474.65 196.53 502.55 161.36 M 412.41 271.15 C 449.67 236.93 479.01 197.67 508.19 160.96 M 412.41 271.15 C 438.59 240 463.53 208.13 508.19 160.96 M 417.4 271.51 C 438.61 243.12 460.69 222.4 513.18 161.32 M 417.4 271.51 C 449.06 239 477.08 206.59 513.18 161.32 M 423.04 271.11 C 442.67 241.94 465.53 217.4 518.82 160.93 M 423.04 271.11 C 453.32 240.12 479.38 209.01 518.82 160.93 M 428.03 271.47 C 455.34 239.42 485.04 202.17 523.81 161.29 M 428.03 271.47 C 459.42 233.38 494.36 192.51 523.81 161.29 M 433.67 271.08 C 465.44 234.31 506.5 188.9 528.8 161.65 M 433.67 271.08 C 452.04 245.05 473.69 223.95 528.8 161.65 M 438.66 271.44 C 459.56 248.33 480.5 220.15 534.44 161.25 M 438.66 271.44 C 468.03 237.68 498.92 201.6 534.44 161.25 M 443.64 271.8 C 465.48 247.34 487.46 220.4 539.43 161.61 M 443.64 271.8 C 474.58 236.39 508.55 197.13 539.43 161.61 M 449.29 271.41 C 479.65 239.84 509.82 206.81 545.07 161.22 M 449.29 271.41 C 487.87 231.97 524.11 187.5 545.07 161.22 M 454.27 271.77 C 487.36 237.35 514.18 198.61 550.06 161.58 M 454.27 271.77 C 479.61 241.84 506.85 214.66 550.06 161.58 M 459.92 271.37 C 492.76 236.86 515.75 204.13 555.7 161.18 M 459.92 271.37 C 482.31 242.92 506.83 216.78 555.7 161.18 M 464.9 271.73 C 487.45 248.6 507.73 232.28 560.69 161.54 M 464.9 271.73 C 488.02 249.87 505.53 226.39 560.69 161.54 M 470.55 271.34 C 492.89 247.27 517.06 218.56 566.33 161.15 M 470.55 271.34 C 504.2 231.66 539.16 193.55 566.33 161.15 M 475.53 271.7 C 501.52 237.39 536.87 204.3 571.32 161.51 M 475.53 271.7 C 505.18 233.24 538.16 199.37 571.32 161.51 M 481.18 271.3 C 501.53 245.93 524.66 216.01 576.96 161.11 M 481.18 271.3 C 504.86 250.16 522.46 223.19 576.96 161.11 M 486.16 271.66 C 510.92 242.57 526.53 223.33 581.95 161.47 M 486.16 271.66 C 505.96 248.65 528.19 224.43 581.95 161.47 M 491.81 271.27 C 522.81 242.4 547.92 206.87 586.94 161.84 M 491.81 271.27 C 528.39 227.93 563.5 189.93 586.94 161.84 M 496.79 271.63 C 536 230.51 565.14 195.39 592.58 161.44 M 496.79 271.63 C 531.76 231.15 569.66 189.3 592.58 161.44 M 501.78 271.99 C 532.17 241.9 558.7 208.79 597.57 161.8 M 501.78 271.99 C 518.96 245.94 541.75 224.8 597.57 161.8 M 507.42 271.59 C 533.07 247.34 555.68 217.42 603.21 161.41 M 507.42 271.59 C 539.18 232.13 577.82 189.99 603.21 161.41 M 512.41 271.95 C 538.64 238.73 567.52 203.37 608.2 161.77 M 512.41 271.95 C 541.8 236.03 572.33 202.38 608.2 161.77 M 518.05 271.56 C 555.85 230.51 591.07 187.54 613.84 161.37 M 518.05 271.56 C 542.24 245.08 567.15 215.22 613.84 161.37 M 523.04 271.92 C 553.21 244.18 578.09 208.83 618.83 161.73 M 523.04 271.92 C 550.83 237.48 582.8 205.99 618.83 161.73 M 528.68 271.52 C 545.24 248.73 569.98 222.34 624.47 161.34 M 528.68 271.52 C 563.48 231.58 597.58 193.51 624.47 161.34 M 533.67 271.88 C 552.98 245.27 579.11 222.83 629.46 161.7 M 533.67 271.88 C 560.75 244.46 584.69 217.27 629.46 161.7 M 539.32 271.49 C 562.71 242.21 588.19 219.73 635.1 161.3 M 539.32 271.49 C 564.35 239.73 594.77 206.76 635.1 161.3 M 544.3 271.85 C 584.11 228.7 617.09 187.22 640.09 161.66 M 544.3 271.85 C 563.7 246.81 589.57 221.75 640.09 161.66 M 549.95 271.46 C 579.23 234.51 607.84 204.08 645.73 161.27 M 549.95 271.46 C 582.71 233.64 616.14 196.48 645.73 161.27 M 554.93 271.82 C 570.16 249.44 590.42 227.71 650.72 161.63 M 554.93 271.82 C 590.71 230.29 624.95 188.14 650.72 161.63 M 559.92 272.18 C 587.14 239.62 617.23 202.24 655.7 161.99 M 559.92 272.18 C 584.24 238.82 612.81 206.41 655.7 161.99 M 565.56 271.78 C 588.4 249.63 608.56 221.58 661.35 161.59 M 565.56 271.78 C 584.34 250.44 607.05 225.24 661.35 161.59 M 570.55 272.14 C 602.46 236.31 629.78 208.79 666.33 161.95 M 570.55 272.14 C 605.85 231.9 639.36 193.06 666.33 161.95 M 576.19 271.75 C 601.5 244.5 624.84 218.81 671.98 161.56 M 576.19 271.75 C 608.62 232.38 638.4 196.47 671.98 161.56 M 581.18 272.11 C 608.03 239.46 638.56 202.46 676.96 161.92 M 581.18 272.11 C 611.73 237.07 643.55 201.34 676.96 161.92 M 586.82 271.71 C 612.82 247.97 629.99 220.55 682.61 161.52 M 586.82 271.71 C 622.86 230.88 655.64 193.34 682.61 161.52 M 591.81 272.07 C 616.79 246.13 637.88 223.2 687.59 161.88 M 591.81 272.07 C 627.22 235.17 658.46 194.45 687.59 161.88 M 597.45 271.68 C 628.53 242.89 652.72 208.38 693.24 161.49 M 597.45 271.68 C 624.7 240.61 653.11 210.41 693.24 161.49 M 602.44 272.04 C 626.75 235.5 658.21 205.02 698.22 161.85 M 602.44 272.04 C 634.02 237.63 662.67 200.96 698.22 161.85 M 608.08 271.64 C 635.96 239.19 661.24 211.52 703.87 161.46 M 608.08 271.64 C 626.85 248.21 646.88 226.41 703.87 161.46 M 613.07 272 C 643.43 235.22 681.55 199.51 708.85 161.82 M 613.07 272 C 633.27 242.17 655.99 217.47 708.85 161.82 M 618.06 272.36 C 642.26 252.35 662.75 228.23 713.84 162.18 M 618.06 272.36 C 635.04 252.17 655.06 227.18 713.84 162.18 M 623.7 271.97 C 662.26 233.27 695.74 184.53 719.48 161.78 M 623.7 271.97 C 655.53 234.52 690.27 197.26 719.48 161.78 M 628.69 272.33 C 654.75 246.56 677.31 213.97 724.47 162.14 M 628.69 272.33 C 648.02 251.08 672.28 224.92 724.47 162.14 M 634.33 271.93 C 664.72 232.3 694.04 199.48 730.77 160.99 M 634.33 271.93 C 667.9 232.52 698.48 197.31 730.77 160.99 M 639.32 272.29 C 660.79 245.35 685.67 215.29 734.45 162.86 M 639.32 272.29 C 673.98 227.5 710.55 185.27 734.45 162.86 M 644.96 271.9 C 672.41 238.78 703.1 201.59 737.46 165.49 M 644.96 271.9 C 666.44 248.16 691.4 219.38 737.46 165.49 M 649.95 272.26 C 673.87 239.97 698.17 208.4 739.17 169.62 M 649.95 272.26 C 674.75 242.08 703.69 207.48 739.17 169.62 M 655.59 271.87 C 676.46 252.38 690.06 230.98 740.88 173.75 M 655.59 271.87 C 685.83 237.09 716.33 199.61 740.88 173.75 M 660.58 272.23 C 690.12 242.17 717.34 213.68 740.62 180.15 M 660.58 272.23 C 689.99 234.9 721.62 200.59 740.62 180.15 M 666.22 271.83 C 682.46 254.78 708.77 233.01 741.01 185.79 M 666.22 271.83 C 682.71 251.59 701.4 228.88 741.01 185.79 M 671.21 272.19 C 687.82 248 715.06 224.5 740.75 192.19 M 671.21 272.19 C 691.21 250.33 709.91 231.7 740.75 192.19 M 676.19 272.55 C 690.49 252.6 707.6 242.44 740.49 198.59 M 676.19 272.55 C 695.29 249.79 717.9 223.74 740.49 198.59 M 681.84 272.16 C 701.23 255.81 712.74 233.8 740.88 204.23 M 681.84 272.16 C 693.07 256.44 707.73 241.95 740.88 204.23 M 686.82 272.52 C 707.08 246.41 723.63 226.08 740.62 210.63 M 686.82 272.52 C 707.47 250.88 727.22 225.62 740.62 210.63 M 692.47 272.12 C 702.34 257.68 716.65 237.57 740.36 217.03 M 692.47 272.12 C 709.08 250.3 727.23 233.93 740.36 217.03 M 697.45 272.48 C 710.64 259.37 720.06 247.86 740.75 222.67 M 697.45 272.48 C 711.81 254.6 726.82 237.98 740.75 222.67 M 703.1 272.09 C 712.79 262.1 723.36 244.31 740.49 229.07 M 703.1 272.09 C 710.13 262.43 716.74 253.13 740.49 229.07 M 708.08 272.45 C 718.3 258.39 724.62 251.68 740.23 235.47 M 708.08 272.45 C 720.82 260.85 729.99 247.88 740.23 235.47 M 713.73 272.05 C 725.3 260.13 733.8 250.82 740.63 241.11 M 713.73 272.05 C 721.43 260.94 731.26 250.85 740.63 241.11 M 718.71 272.41 C 721.08 265.78 729.29 258.61 740.36 247.51 M 718.71 272.41 C 727.57 262.46 733.78 257.19 740.36 247.51 M 725.01 271.26 C 727.53 265.56 731.69 258.81 740.1 253.91 M 725.01 271.26 C 728.27 265.31 735.15 258.71 740.1 253.91 M 731.31 270.11 C 732.66 266.72 736.15 263.32 739.19 261.06 M 731.31 270.11 C 733.92 266.12 737.04 263.67 739.19 261.06" fill="none" stroke="#cdeb8b" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 406.54 160 M 406.54 160 C 501.85 153.85 596.66 154.62 723.46 160 M 406.54 160 C 471.4 159.66 538.04 157.98 723.46 160 M 723.46 160 C 732.96 159.88 739.56 166.94 740 176.54 M 723.46 160 C 736.13 158.69 740.57 166.76 740 176.54 M 740 176.54 C 741.81 188.29 741.09 205.37 740 253.75 M 740 176.54 C 740.31 194.15 740.94 213.91 740 253.75 M 740 253.75 C 736.93 266.31 736.66 269.84 723.46 270.29 M 740 253.75 C 743.42 262.71 731.32 270.65 723.46 270.29 M 723.46 270.29 C 613.61 270.2 500.75 272.44 406.54 270.29 M 723.46 270.29 C 595.51 270.99 471.24 272.05 406.54 270.29 M 406.54 270.29 C 398.01 273.94 391.47 267.09 390 253.75 M 406.54 270.29 C 397.96 268.94 391.44 263.12 390 253.75 M 390 253.75 C 389.09 225.13 389.76 195.64 390 176.54 M 390 253.75 C 390.62 223.44 391.4 195.78 390 176.54 M 390 176.54 C 392.8 163.1 396.89 156.73 406.54 160 M 390 176.54 C 392.55 168.13 398.22 163.23 406.54 160" fill="none" stroke="#36393d" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 542.17 120.29 L 504.18 170.22" fill="none" stroke="none" pointer-events="stroke"/><path d="M 501 174.4 L 502.46 166.71 L 504.18 170.22 L 508.03 170.95 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 542.17 120.29 M 542.17 120.29 C 537.92 127.88 522.56 143.72 504.18 170.22 M 542.17 120.29 C 528.88 136.43 516.75 154.83 504.18 170.22" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 502.53 166.63 C 502.53 166.63 502.53 166.63 502.53 166.63 M 502.53 166.63 C 502.53 166.63 502.53 166.63 502.53 166.63 M 500.95 174.54 C 502.68 173.49 502.52 172.45 504.23 170.77 M 500.95 174.54 C 502.04 173.98 502.15 172.59 504.23 170.77" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 501 174.4 M 501 174.4 C 503 172.6 502.65 170.02 502.46 166.71 M 501 174.4 C 500.97 172.71 501.71 170.57 502.46 166.71 M 502.46 166.71 C 503.62 167.21 504.39 169.86 504.18 170.22 M 502.46 166.71 C 502.55 167.51 503.59 168.98 504.18 170.22 M 504.18 170.22 C 505.42 169.99 506.83 169.91 508.03 170.95 M 504.18 170.22 C 505.95 170.35 506.93 170.45 508.03 170.95 M 508.03 170.95 C 505.2 172.72 502.56 172.74 501 174.4 M 508.03 170.95 C 505.95 172.3 502.22 173.58 501 174.4" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 595 120.29 L 613.47 169.33" fill="none" stroke="none" pointer-events="stroke"/><path d="M 615.32 174.24 L 609.58 168.93 L 613.47 169.33 L 616.13 166.46 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 595 120.29 M 595 120.29 C 602.53 139.58 612.71 155.77 613.47 169.33 M 595 120.29 C 603.85 137.82 609.41 153.13 613.47 169.33" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 609.91 168.55 C 609.91 168.55 609.91 168.55 609.91 168.55 M 609.91 168.55 C 609.91 168.55 609.91 168.55 609.91 168.55 M 612.27 171.93 C 613.38 171.39 614.55 170.25 616.86 166.65 M 612.27 171.93 C 612.89 170.56 614.18 169.59 616.86 166.65" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 615.32 174.24 M 615.32 174.24 C 612.11 172.07 612.57 169.05 609.58 168.93 M 615.32 174.24 C 612.6 172.27 610.63 169.95 609.58 168.93 M 609.58 168.93 C 609.99 169.56 612.56 168.58 613.47 169.33 M 609.58 168.93 C 610.9 169.24 611.74 169.21 613.47 169.33 M 613.47 169.33 C 614.85 168.13 614.58 168 616.13 166.46 M 613.47 169.33 C 614.51 168.35 615.38 167.46 616.13 166.46 M 616.13 166.46 C 617.03 167.88 615.13 170.27 615.32 174.24 M 616.13 166.46 C 615.52 168.2 615.14 170.56 615.32 174.24" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="505" y="60.29" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 507.47 62.28 C 507.47 62.28 507.47 62.28 507.47 62.28 M 507.47 62.28 C 507.47 62.28 507.47 62.28 507.47 62.28 M 505.9 70.19 C 506.15 68.23 510.45 63.46 514.43 60.38 M 505.9 70.19 C 508.51 66.05 510.18 65.21 514.43 60.38 M 505.64 76.59 C 509.73 72.81 511.3 72.06 519.42 60.74 M 505.64 76.59 C 511.04 71.28 511.78 67.08 519.42 60.74 M 506.03 82.23 C 511.42 70.51 523.24 63.48 525.06 60.34 M 506.03 82.23 C 512.53 75.41 515.31 69.04 525.06 60.34 M 505.77 88.63 C 513.26 81.67 512.85 75.9 530.05 60.71 M 505.77 88.63 C 514.11 79.64 524.36 68.97 530.05 60.71 M 506.17 94.27 C 520.27 81.26 530.53 68.2 535.69 60.31 M 506.17 94.27 C 514.82 84.49 524.8 75.37 535.69 60.31 M 505.9 100.67 C 517.36 87.61 531.92 75.34 540.68 60.67 M 505.9 100.67 C 517.53 85.56 530.19 72.96 540.68 60.67 M 505.64 107.07 C 518.87 92.5 534.94 71.87 545.66 61.03 M 505.64 107.07 C 516.92 92.53 530.38 80.9 545.66 61.03 M 506.04 112.71 C 520.13 100.68 527.59 83.92 551.31 60.64 M 506.04 112.71 C 518.66 95.4 533.06 81.61 551.31 60.64 M 507.74 116.84 C 519.07 95.6 536.62 79.85 556.29 61 M 507.74 116.84 C 516.91 104.55 529.93 90.12 556.29 61 M 510.11 120.22 C 531.09 96.61 551.33 75.16 561.94 60.6 M 510.11 120.22 C 526.68 103.72 542.12 83.8 561.94 60.6 M 515.75 119.83 C 532.76 98.68 544.51 81.66 566.92 60.96 M 515.75 119.83 C 536.98 95.73 557.49 75.1 566.92 60.96 M 520.74 120.19 C 534.97 109.37 547.41 90.01 572.57 60.57 M 520.74 120.19 C 536.86 99.68 555.74 76.44 572.57 60.57 M 526.38 119.79 C 544.28 96.26 561.68 79.04 577.55 60.93 M 526.38 119.79 C 544.68 99.82 559.98 80.24 577.55 60.93 M 531.37 120.15 C 548.11 95.13 566.2 72.53 583.2 60.53 M 531.37 120.15 C 545.48 104.65 555.21 88.1 583.2 60.53 M 537.01 119.76 C 553.92 102.95 570.88 84.22 588.18 60.89 M 537.01 119.76 C 554.3 101.93 571.14 83.68 588.18 60.89 M 542 120.12 C 554.5 103.68 573.25 81.14 593.17 61.25 M 542 120.12 C 554.7 108.05 566.21 93.4 593.17 61.25 M 546.98 120.48 C 562.35 104.02 578.77 85.31 598.81 60.86 M 546.98 120.48 C 560.09 106.48 576.9 89.46 598.81 60.86 M 552.63 120.09 C 562.2 107.99 580.21 93.96 603.8 61.22 M 552.63 120.09 C 570.32 96.55 590.61 77.16 603.8 61.22 M 557.61 120.45 C 574.79 101.22 584.29 85.28 609.44 60.82 M 557.61 120.45 C 573.12 100.55 589.74 85.51 609.44 60.82 M 563.26 120.05 C 570.11 104.97 587.6 92.82 614.43 61.18 M 563.26 120.05 C 576.95 109.69 585.74 96.46 614.43 61.18 M 568.24 120.41 C 582.13 105.56 600.33 83.81 620.07 60.79 M 568.24 120.41 C 581.39 104.49 594.54 86.76 620.07 60.79 M 573.89 120.02 C 588.88 105.87 605.63 91.35 623.09 63.41 M 573.89 120.02 C 586.23 102.5 601.23 86.95 623.09 63.41 M 578.87 120.38 C 584.93 105.3 598.6 101.39 624.8 67.55 M 578.87 120.38 C 590.53 107.94 602.41 95.88 624.8 67.55 M 584.52 119.98 C 600.52 101.46 614.28 86.06 627.16 70.93 M 584.52 119.98 C 593.93 106 607.48 90.68 627.16 70.93 M 589.5 120.34 C 600.28 106.68 615.35 93.13 626.9 77.32 M 589.5 120.34 C 602.23 104.93 614.81 93.25 626.9 77.32 M 594.49 120.7 C 601.74 107.91 608.96 105.1 626.64 83.72 M 594.49 120.7 C 604.74 108.89 616.06 94.71 626.64 83.72 M 600.13 120.31 C 607.21 115.6 613.43 102.78 627.03 89.36 M 600.13 120.31 C 608.75 110.17 618.84 98.59 627.03 89.36 M 605.12 120.67 C 609.99 112.92 615.69 105.08 626.77 95.76 M 605.12 120.67 C 610.56 115.09 618.25 107.59 626.77 95.76 M 610.76 120.27 C 611.81 117.12 623.02 107.23 626.51 102.16 M 610.76 120.27 C 613.32 115.48 619.23 112.97 626.51 102.16 M 615.75 120.63 C 621.68 117.99 625.5 111.9 626.9 107.8 M 615.75 120.63 C 621.13 115.11 623.59 113.26 626.9 107.8" fill="none" stroke="#cdeb8b" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 514 60.29 M 514 60.29 C 549.41 59.54 579 60.73 616 60.29 M 514 60.29 C 545.23 62.22 581.12 60.55 616 60.29 M 616 60.29 C 618.15 62.1 627.17 59.72 625 69.29 M 616 60.29 C 621.69 62.64 624.99 65.86 625 69.29 M 625 69.29 C 622.63 82.11 628.12 92.03 625 111.29 M 625 69.29 C 625.58 79.94 625.91 88.36 625 111.29 M 625 111.29 C 625.79 113.72 622.86 121.81 616 120.29 M 625 111.29 C 628.8 113.57 619.19 119.64 616 120.29 M 616 120.29 C 591.24 118.35 568.17 123.93 514 120.29 M 616 120.29 C 589.22 123.13 565.73 120.41 514 120.29 M 514 120.29 C 506.55 119.73 501.65 116.89 505 111.29 M 514 120.29 C 504.41 117.39 506.53 116.86 505 111.29 M 505 111.29 C 505.51 97.83 505.17 88 505 69.29 M 505 111.29 C 506.01 95.8 505.22 80.76 505 69.29 M 505 69.29 C 504.98 64.18 504.91 60.64 514 60.29 M 505 69.29 C 503.58 60.25 511.07 64.16 514 60.29" fill="none" stroke="#36393d" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 506px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">Matrix scan</font></div></div></div></foreignObject><text x="565" y="95" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">Matrix scan</text></switch></g><path d="M 477.5 235.29 L 477.5 703.63" fill="none" stroke="none" pointer-events="stroke"/><path d="M 477.5 708.88 L 474 701.88 L 477.5 703.63 L 481 701.88 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 477.5 235.29 M 477.5 235.29 C 473.24 402.1 475.08 566.98 477.5 703.63 M 477.5 235.29 C 473.37 389.75 473.15 544.31 477.5 703.63" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 473.78 702.13 C 473.78 702.13 473.78 702.13 473.78 702.13 M 473.78 702.13 C 473.78 702.13 473.78 702.13 473.78 702.13 M 476.15 705.51 C 476.61 705.55 476.57 705.04 477.46 704 M 476.15 705.51 C 476.61 704.93 477.24 704.64 477.46 704" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 477.5 708.88 M 477.5 708.88 C 477.85 708.01 476.99 704.98 474 701.88 M 477.5 708.88 C 475.9 707.47 475.48 705.34 474 701.88 M 474 701.88 C 474.97 702.41 475.94 702.72 477.5 703.63 M 474 701.88 C 474.83 702.26 475.78 702.76 477.5 703.63 M 477.5 703.63 C 477.86 703.77 480.21 702.17 481 701.88 M 477.5 703.63 C 478.59 702.56 480.02 701.87 481 701.88 M 481 701.88 C 478.68 704.17 479.62 706.18 477.5 708.88 M 481 701.88 C 480.03 703.22 480.08 704.7 477.5 708.88" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 479px; margin-left: 478px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 20px;">Serial</font></div></div></div></foreignObject><text x="478" y="482" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="12px" text-anchor="middle">Serial</text></switch></g><rect x="405" y="175.29" width="145" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 410.5 175.77 L 548.1 173.67 L 546.8 178.43 L 553.88 183.76 L 550.8 226.67 L 550.7 229.08 L 540.64 235.42 L 411.71 231.18 L 405.48 235.89 L 402.37 225.82 L 406.59 181.63 L 406.91 179.5 L 412.33 177.51" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 414 175.29 M 414 175.29 C 444.25 177.2 475.48 173.46 541 175.29 M 414 175.29 C 447.46 176.43 485.02 177.89 541 175.29 M 541 175.29 C 546.19 179.22 553.73 182.06 550 184.29 M 541 175.29 C 542.44 172.82 545.95 175.75 550 184.29 M 550 184.29 C 546.76 199.15 548.32 209.17 550 226.29 M 550 184.29 C 550.32 198.89 550.61 218.84 550 226.29 M 550 226.29 C 547.03 231.21 543.63 232.93 541 235.29 M 550 226.29 C 550.16 232.26 550.74 238.23 541 235.29 M 541 235.29 C 513.18 230.3 478.83 230.17 414 235.29 M 541 235.29 C 489.2 235.74 441.65 235.11 414 235.29 M 414 235.29 C 410.73 234.64 401.56 231.09 405 226.29 M 414 235.29 C 412.45 237.47 402.07 232.95 405 226.29 M 405 226.29 C 407.24 210.81 401.67 203.5 405 184.29 M 405 226.29 C 404.86 211.69 404.08 196.02 405 184.29 M 405 184.29 C 404.27 174.36 410.64 178.6 414 175.29 M 405 184.29 C 407.02 175.61 403.68 176 414 175.29" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 143px; height: 1px; padding-top: 205px; margin-left: 406px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">SerialSplit<br />Driver</font></div></div></div></foreignObject><text x="478" y="210" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">SerialSplit...</text></switch></g><path d="M 651.42 390 L 651.42 552.63" fill="none" stroke="none" pointer-events="stroke"/><path d="M 651.42 557.88 L 647.92 550.88 L 651.42 552.63 L 654.92 550.88 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 651.42 390 M 651.42 390 C 651.71 446.94 652.05 507.96 651.42 552.63 M 651.42 390 C 646.96 428.19 647.1 468.34 651.42 552.63" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 647.66 551.18 C 647.66 551.18 647.66 551.18 647.66 551.18 M 647.66 551.18 C 647.66 551.18 647.66 551.18 647.66 551.18 M 650.02 554.56 C 650.51 553.72 650.91 553.47 651.34 553.05 M 650.02 554.56 C 650.48 554.24 650.61 553.74 651.34 553.05" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 651.42 557.88 M 651.42 557.88 C 649.68 555.63 650.49 552.21 647.92 550.88 M 651.42 557.88 C 649.7 556.34 649.49 554.33 647.92 550.88 M 647.92 550.88 C 648.12 551.55 649.05 551.55 651.42 552.63 M 647.92 550.88 C 648.64 551.46 650.06 552.21 651.42 552.63 M 651.42 552.63 C 652.66 552.56 653.55 551.26 654.92 550.88 M 651.42 552.63 C 652.57 551.69 653.73 551.72 654.92 550.88 M 654.92 550.88 C 652.77 553.08 651.81 554.6 651.42 557.88 M 654.92 550.88 C 654.19 552.65 653.13 554.42 651.42 557.88" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 481px; margin-left: 652px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 20px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font face="Verdana">BLE</font></div></div></div></foreignObject><text x="652" y="487" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="20px" text-anchor="middle">BLE</text></switch></g><rect x="580" y="330" width="142.85" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 585.5 331.84 L 714.57 331.81 L 723.51 331.86 L 723.39 336.23 L 724.73 386.2 L 717.12 385.5 L 711.66 393.59 L 581.52 388.01 L 583.99 389.11 L 578.06 382.48 L 576.95 342.36 L 583.31 330.52 L 589.16 330.37" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 589 330 M 589 330 C 620.99 327.28 661.2 334.63 713.85 330 M 589 330 C 615.16 329.86 644.02 331.08 713.85 330 M 713.85 330 C 721.17 326.15 721.83 331.59 722.85 339 M 713.85 330 C 716.73 329.93 718.7 335.3 722.85 339 M 722.85 339 C 720.06 350.01 719.7 360.47 722.85 381 M 722.85 339 C 724.67 355.01 724.4 366.56 722.85 381 M 722.85 381 C 726.25 385.86 715.99 387.98 713.85 390 M 722.85 381 C 721.8 384.45 723.01 389.63 713.85 390 M 713.85 390 C 688.19 386.95 662.14 389.28 589 390 M 713.85 390 C 672.82 392.07 631.2 392.83 589 390 M 589 390 C 583.57 390.14 580.09 385.7 580 381 M 589 390 C 580.09 389.52 581.87 386.79 580 381 M 580 381 C 580.17 366.42 577.43 355.97 580 339 M 580 381 C 578.89 364.53 580.56 349.22 580 339 M 580 339 C 582.24 336.42 582.58 328.8 589 330 M 580 339 C 576.08 335.32 583.64 331.97 589 330" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 141px; height: 1px; padding-top: 360px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">BleSplit<br />PeripheralServer</font></div></div></div></foreignObject><text x="651" y="365" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">BleSplit...</text></switch></g><path d="M 651.42 235.29 L 651.42 323.63" fill="none" stroke="none" pointer-events="stroke"/><path d="M 651.42 328.88 L 647.92 321.88 L 651.42 323.63 L 654.92 321.88 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 651.42 235.29 M 651.42 235.29 C 647.69 266.26 649.01 296.7 651.42 323.63 M 651.42 235.29 C 653.28 255.39 651.74 271.15 651.42 323.63" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 647.77 322.05 C 647.77 322.05 647.77 322.05 647.77 322.05 M 647.77 322.05 C 647.77 322.05 647.77 322.05 647.77 322.05 M 650.14 325.43 C 650.39 324.87 650.54 324.22 651.45 323.92 M 650.14 325.43 C 650.52 325.01 650.64 324.73 651.45 323.92" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 651.42 328.88 M 651.42 328.88 C 651.79 327.32 648.48 325.14 647.92 321.88 M 651.42 328.88 C 651.14 327.54 649.82 326.39 647.92 321.88 M 647.92 321.88 C 648.96 322.94 649.86 322.99 651.42 323.63 M 647.92 321.88 C 648.46 322.42 649.09 322.58 651.42 323.63 M 651.42 323.63 C 652.31 323.26 652.82 322.38 654.92 321.88 M 651.42 323.63 C 651.95 323.04 652.78 323.08 654.92 321.88 M 654.92 321.88 C 652.7 325.41 653.64 327.08 651.42 328.88 M 654.92 321.88 C 654.64 323.15 652.92 325.33 651.42 328.88" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="580" y="175.29" width="142.85" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 591.1 178.53 L 719.81 178.19 L 724.57 177.91 L 725.32 182.97 L 725.05 229.19 L 719.36 234.24 L 712.91 236.98 L 582.03 233.79 L 578.69 233.27 L 578.16 228.72 L 581.48 183.53 L 580.68 180.04 L 588.75 175.69" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 589 175.29 M 589 175.29 C 619.03 176.4 642.67 170.22 713.85 175.29 M 589 175.29 C 628.53 172.57 669.69 174.37 713.85 175.29 M 713.85 175.29 C 717.64 178.27 725.47 180.46 722.85 184.29 M 713.85 175.29 C 723.2 174.11 726.26 174.82 722.85 184.29 M 722.85 184.29 C 725.56 199.61 726.04 211.78 722.85 226.29 M 722.85 184.29 C 721.77 199.68 723.88 215.85 722.85 226.29 M 722.85 226.29 C 723.2 230.14 718.57 236.35 713.85 235.29 M 722.85 226.29 C 720.06 233.25 716.13 233.24 713.85 235.29 M 713.85 235.29 C 685.9 237.05 660.03 239.84 589 235.29 M 713.85 235.29 C 677.55 237.09 638.21 237.28 589 235.29 M 589 235.29 C 582.44 235.95 580.45 233.76 580 226.29 M 589 235.29 C 583.16 234.82 584.5 231.76 580 226.29 M 580 226.29 C 581.95 212.1 583.4 197.68 580 184.29 M 580 226.29 C 579.69 211.55 578.61 199.05 580 184.29 M 580 184.29 C 582.35 176.65 585.14 171.55 589 175.29 M 580 184.29 C 577.69 173.76 586.33 179.55 589 175.29" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 141px; height: 1px; padding-top: 205px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-family: Verdana;">BleSplit</span><br style="border-color: var(--border-color); font-family: Verdana;" /><span style="font-family: Verdana;">PeripheralDriver</span></div></div></div></foreignObject><text x="651" y="210" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">BleSplit...</text></switch></g><rect x="535" y="10" width="60" height="40.29" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 30px; margin-left: 536px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 24px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">peripheral</div></div></div></foreignObject><text x="565" y="37" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="24px" text-anchor="middle">perip...</text></switch></g><path d="M 651.42 619 L 651.42 703.63" fill="none" stroke="none" pointer-events="stroke"/><path d="M 651.42 708.88 L 647.92 701.88 L 651.42 703.63 L 654.92 701.88 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 651.42 619 M 651.42 619 C 653.05 650.51 655.75 675.61 651.42 703.63 M 651.42 619 C 649.68 648.65 650.66 682.25 651.42 703.63" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 647.64 702.21 C 647.64 702.21 647.64 702.21 647.64 702.21 M 647.64 702.21 C 647.64 702.21 647.64 702.21 647.64 702.21 M 650 705.58 C 650.49 705.2 651.07 704.47 651.31 704.08 M 650 705.58 C 650.25 705.29 650.63 704.8 651.31 704.08" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 651.42 708.88 M 651.42 708.88 C 650.01 705.47 649.13 703.73 647.92 701.88 M 651.42 708.88 C 650.62 707.5 649.75 705.08 647.92 701.88 M 647.92 701.88 C 648.93 702.68 649.86 702.07 651.42 703.63 M 647.92 701.88 C 649.31 702.58 650.06 703.48 651.42 703.63 M 651.42 703.63 C 652.39 702.63 653.39 701.99 654.92 701.88 M 651.42 703.63 C 651.88 703.05 652.66 702.89 654.92 701.88 M 654.92 701.88 C 654.07 703.15 651.88 706.56 651.42 708.88 M 654.92 701.88 C 653.16 703.88 652.76 707.2 651.42 708.88" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 652px; margin-left: 652px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">channel</div></div></div></foreignObject><text x="652" y="655" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="12px" text-anchor="middle">channel</text></switch></g><rect x="580" y="559" width="142.85" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 591.1 559 L 721.49 561.91 L 718.07 561.14 L 721.61 570.84 L 720.83 613.79 L 720.85 615.93 L 710.52 620.78 L 583.86 620.9 L 579 619.76 L 576.58 607.27 L 577.23 568.32 L 585.58 562.82 L 591.14 560.91" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 589 559 M 589 559 C 627.04 558.87 664.04 555.49 713.85 559 M 589 559 C 615.56 561.93 640.8 558.87 713.85 559 M 713.85 559 C 717.07 558.75 724.86 562.04 722.85 568 M 713.85 559 C 719.05 561.62 725.92 561.68 722.85 568 M 722.85 568 C 722.5 586.07 724.26 595.97 722.85 610 M 722.85 568 C 722 584.69 724.1 599.89 722.85 610 M 722.85 610 C 725.48 617.63 716.86 617.23 713.85 619 M 722.85 610 C 720.42 617.33 718.71 619.15 713.85 619 M 713.85 619 C 683.11 618.41 655.94 617.79 589 619 M 713.85 619 C 685.3 616.51 654.75 617.57 589 619 M 589 619 C 586.89 622.45 580.79 617.13 580 610 M 589 619 C 580.39 623.02 578.34 612.42 580 610 M 580 610 C 584.4 595.16 583.72 581.98 580 568 M 580 610 C 579.77 594.93 581.26 575.9 580 568 M 580 568 C 576.72 558.11 582.43 559.48 589 559 M 580 568 C 584.5 561.16 585.27 563.09 589 559" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 141px; height: 1px; padding-top: 589px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">BleSplit<br />CentralClient</font></div></div></div></foreignObject><text x="651" y="594" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">BleSplit...</text></switch></g><rect x="580" y="710" width="142.85" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 591.1 711.36 L 715.11 708.33 L 721.92 710.86 L 726.26 719.6 L 721.91 761.62 L 722.42 768.63 L 716.7 767.23 L 586.68 766.02 L 582.51 769.27 L 577.27 760.22 L 580.59 717.34 L 578.98 710.13 L 592.97 710.06" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 589 710 M 589 710 C 629.33 713.23 675.86 712.93 713.85 710 M 589 710 C 629.83 711.69 671.93 708.39 713.85 710 M 713.85 710 C 719.2 709.96 720.12 715.86 722.85 719 M 713.85 710 C 720.49 705.83 725.82 717.52 722.85 719 M 722.85 719 C 722.95 733.23 722.79 751.56 722.85 761 M 722.85 719 C 721.83 733.1 723.35 747.9 722.85 761 M 722.85 761 C 723.85 768.57 716.38 768.57 713.85 770 M 722.85 761 C 719.2 765.8 718.13 766.83 713.85 770 M 713.85 770 C 667.77 771.3 615.4 773.15 589 770 M 713.85 770 C 666.25 769.14 619.8 771.59 589 770 M 589 770 C 584.73 766.24 576.32 768.04 580 761 M 589 770 C 582.23 771.36 583.15 762.56 580 761 M 580 761 C 582.33 747.06 576.47 738.75 580 719 M 580 761 C 581.12 752.47 581.06 742.19 580 719 M 580 719 C 579.69 716.46 579.36 713.97 589 710 M 580 719 C 578.56 717.15 581.02 706.16 589 710" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 141px; height: 1px; padding-top: 740px; margin-left: 581px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">BleSplit<br />CentralDriver</font></div></div></div></foreignObject><text x="651" y="745" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">BleSplit...</text></switch></g><rect x="405" y="710" width="145" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 416.11 708.45 L 547.39 709.48 L 548.83 711.04 L 549.53 720.87 L 549.79 764.41 L 545.9 771.11 L 543.54 768.77 L 407.24 770.83 L 410 770.17 L 408.99 762.48 L 401.62 718.69 L 409.69 712.88 L 410.25 713.34" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 414 710 M 414 710 C 456.58 711.35 493.55 710.88 541 710 M 414 710 C 445.89 706.4 479.13 707.33 541 710 M 541 710 C 547.28 709.35 553.72 715.53 550 719 M 541 710 C 551.59 710.86 551.44 714.39 550 719 M 550 719 C 554.53 730.26 548.62 743.95 550 761 M 550 719 C 549.88 736.42 552.44 750.73 550 761 M 550 761 C 549.7 763.63 543.96 769.76 541 770 M 550 761 C 550.54 763.49 550.16 766.05 541 770 M 541 770 C 510.14 768.73 476.16 772.63 414 770 M 541 770 C 507.77 769.42 478.57 769.43 414 770 M 414 770 C 404.29 770.58 403.97 766.55 405 761 M 414 770 C 408.13 771.52 404.49 767.48 405 761 M 405 761 C 402.66 750.04 404.51 746.17 405 719 M 405 761 C 404.47 746.98 404.38 735.67 405 719 M 405 719 C 402.63 714.48 404.92 712.07 414 710 M 405 719 C 403.47 716.37 409.21 712 414 710" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 143px; height: 1px; padding-top: 740px; margin-left: 406px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">SerialSplit<br />Driver</font></div></div></div></foreignObject><text x="478" y="745" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">SerialSplit...</text></switch></g><rect x="415.7" y="240.29" width="292.15" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 290px; height: 1px; padding-top: 255px; margin-left: 417px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 14px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">SplitReader + SplitWriter</div></div></div></foreignObject><text x="562" y="259" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="14px" text-anchor="middle">SplitReader + SplitWriter</text></switch></g><rect x="420.98" y="780" width="292.15" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 290px; height: 1px; padding-top: 795px; margin-left: 422px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 14px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">SplitReader + SplitWriter</div></div></div></foreignObject><text x="567" y="799" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="14px" text-anchor="middle">SplitReader + SplitWriter</text></switch></g><rect x="415.7" y="270.29" width="292.15" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 290px; height: 1px; padding-top: 285px; margin-left: 417px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 14px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">SplitPeripheral</div></div></div></foreignObject><text x="562" y="289" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="14px" text-anchor="middle">SplitPeripheral</text></switch></g><path d="M 567.06 840 L 563.26 933.64" fill="none" stroke="none" pointer-events="stroke"/><path d="M 563.05 938.88 L 559.83 931.75 L 563.26 933.64 L 566.83 932.03 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 567.06 840 M 567.06 840 C 567.57 875.36 565.43 905.46 563.26 933.64 M 567.06 840 C 564.42 868.45 563.26 892.52 563.26 933.64" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 559.73 931.87 C 559.73 931.87 559.73 931.87 559.73 931.87 M 559.73 931.87 C 559.73 931.87 559.73 931.87 559.73 931.87 M 561.44 936 C 561.69 935.03 562.74 934.55 563.4 933.74 M 561.44 936 C 562.21 935.25 562.82 934.31 563.4 933.74" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 563.05 938.88 M 563.05 938.88 C 561.46 937.14 562.49 934.1 559.83 931.75 M 563.05 938.88 C 562.24 937.68 561.04 935.59 559.83 931.75 M 559.83 931.75 C 560.38 932.58 562.22 933.03 563.26 933.64 M 559.83 931.75 C 560.9 932.17 562.83 933.4 563.26 933.64 M 563.26 933.64 C 564.27 933.38 566.08 932.55 566.83 932.03 M 563.26 933.64 C 564.51 933.27 566.2 932.53 566.83 932.03 M 566.83 932.03 C 565.51 935.09 564.19 934.27 563.05 938.88 M 566.83 932.03 C 566.51 933.06 564.97 935.89 563.05 938.88" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 886px; margin-left: 567px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">key event </div></div></div></foreignObject><text x="567" y="889" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="12px" text-anchor="middle">key event </text></switch></g><rect x="420.98" y="810" width="292.15" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 290px; height: 1px; padding-top: 825px; margin-left: 422px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 14px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">PeripheralManager</div></div></div></foreignObject><text x="567" y="829" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="14px" text-anchor="middle">PeripheralManager</text></switch></g><rect x="250" y="910" width="620" height="120" rx="18" ry="18" fill="none" stroke="none" pointer-events="all"/><path d="M 254.59 914.39 C 254.59 914.39 254.59 914.39 254.59 914.39 M 254.59 914.39 C 254.59 914.39 254.59 914.39 254.59 914.39 M 251.05 924.56 C 249.96 923.11 253.79 916.43 262.2 911.73 M 251.05 924.56 C 253.85 920.86 259.2 916.97 262.2 911.73 M 252.1 929.45 C 258.63 928.59 260.92 919.42 268.5 910.59 M 252.1 929.45 C 258.97 924.29 263.36 916.89 268.5 910.59 M 251.84 935.85 C 260.15 926.02 269.43 917.55 274.15 910.19 M 251.84 935.85 C 260.69 927.19 265.53 917.17 274.15 910.19 M 252.23 941.49 C 258.8 929.29 267.92 918.78 279.13 910.55 M 252.23 941.49 C 262.36 930.28 273.99 920.02 279.13 910.55 M 251.97 947.89 C 264.38 931.04 279.61 916.54 284.78 910.16 M 251.97 947.89 C 265.48 931.49 277.45 915.55 284.78 910.16 M 251.71 954.29 C 260.77 942 278.54 926.87 289.76 910.52 M 251.71 954.29 C 262.1 941.23 276.94 923.66 289.76 910.52 M 252.11 959.93 C 266.8 949.11 275.49 934.96 294.75 910.88 M 252.11 959.93 C 261.17 947.62 271.82 937.29 294.75 910.88 M 251.84 966.33 C 261.53 947.25 274.25 937.21 300.39 910.48 M 251.84 966.33 C 267.55 949.55 279.69 931.16 300.39 910.48 M 252.24 971.97 C 273.63 953.42 289.88 930.48 305.38 910.84 M 252.24 971.97 C 268.93 949.84 286.42 930.82 305.38 910.84 M 251.98 978.37 C 268.73 958.76 284.56 945.78 311.02 910.45 M 251.98 978.37 C 265.07 963.81 282.17 947.67 311.02 910.45 M 252.37 984.01 C 272.7 961 296.31 932.66 316.01 910.81 M 252.37 984.01 C 264.33 965.98 279.08 950.58 316.01 910.81 M 252.11 990.41 C 271.1 974.6 281.4 957.15 321.65 910.41 M 252.11 990.41 C 280.85 957.37 308.96 926.85 321.65 910.41 M 251.85 996.81 C 279.18 966.46 311.33 931.17 326.64 910.77 M 251.85 996.81 C 273.13 970.09 294.04 950.03 326.64 910.77 M 252.24 1002.45 C 271.55 979.47 288.16 963.8 332.28 910.38 M 252.24 1002.45 C 273 977.75 293.73 951.26 332.28 910.38 M 251.98 1008.85 C 286.46 971.71 316.26 937.91 337.27 910.74 M 251.98 1008.85 C 268.5 985.76 289.25 960.47 337.27 910.74 M 250.41 1016.76 C 274.26 984.03 301.92 955.72 342.91 910.34 M 250.41 1016.76 C 279.18 981.79 311.72 944.53 342.91 910.34 M 252.12 1020.89 C 279.2 986.63 307.64 956.14 347.9 910.7 M 252.12 1020.89 C 277.39 993.06 304.5 964.49 347.9 910.7 M 254.48 1024.27 C 274.58 997.78 298.08 970.4 353.54 910.31 M 254.48 1024.27 C 276.46 997.19 301.56 971.13 353.54 910.31 M 256.84 1027.65 C 276.07 999.7 301.52 973.45 358.53 910.67 M 256.84 1027.65 C 278.79 999.91 302.54 973.67 358.53 910.67 M 260.52 1029.52 C 285.98 999.69 310 969.43 364.17 910.27 M 260.52 1029.52 C 282.81 1005.38 307.55 976.25 364.17 910.27 M 264.85 1030.63 C 296.66 993.05 321.63 962.64 369.16 910.64 M 264.85 1030.63 C 296.58 997.63 325.23 960.56 369.16 910.64 M 269.83 1030.99 C 292.83 1002.55 315.16 978.53 374.8 910.24 M 269.83 1030.99 C 297.69 998.61 329.52 964.86 374.8 910.24 M 275.48 1030.6 C 303.9 1000.41 327.69 968.84 379.79 910.6 M 275.48 1030.6 C 305.1 996.11 334.78 963.16 379.79 910.6 M 280.46 1030.96 C 313.3 995.95 338.44 967.95 385.43 910.21 M 280.46 1030.96 C 306.68 1000.83 328.59 973.85 385.43 910.21 M 286.11 1030.56 C 312.4 1005.32 330.67 983.26 390.42 910.57 M 286.11 1030.56 C 320.99 990.96 355.6 948.85 390.42 910.57 M 291.09 1030.92 C 316.19 1002.53 350.37 965.69 395.41 910.93 M 291.09 1030.92 C 315.73 1000.16 344.11 968.49 395.41 910.93 M 296.74 1030.53 C 327.08 995.87 350.04 966.47 401.05 910.53 M 296.74 1030.53 C 318.12 1003.9 341.82 975.66 401.05 910.53 M 301.72 1030.89 C 329.89 1004.46 354.73 975.02 406.04 910.89 M 301.72 1030.89 C 334.19 990.21 370.4 951.32 406.04 910.89 M 307.37 1030.5 C 328.08 1004.31 357.69 975.35 411.68 910.5 M 307.37 1030.5 C 337.84 999.84 363.52 964.71 411.68 910.5 M 312.35 1030.86 C 351.99 982.46 393.17 942.53 416.67 910.86 M 312.35 1030.86 C 337.05 1005.42 362.45 978.11 416.67 910.86 M 318 1030.46 C 344.7 998.21 379.19 958.17 422.31 910.46 M 318 1030.46 C 343.02 999.76 368.56 973.04 422.31 910.46 M 322.98 1030.82 C 354.65 1001.88 379.93 971.39 427.3 910.82 M 322.98 1030.82 C 352.92 999.69 380.02 967.76 427.3 910.82 M 328.63 1030.43 C 357.43 1000.04 379.57 970.31 432.94 910.43 M 328.63 1030.43 C 366.42 985.03 407.19 942 432.94 910.43 M 333.62 1030.79 C 369.7 985.85 409.64 942.63 437.93 910.79 M 333.62 1030.79 C 371.59 987.06 410.7 943.21 437.93 910.79 M 339.26 1030.39 C 365.48 1000.31 395.15 967.21 443.57 910.39 M 339.26 1030.39 C 359.87 1004.05 384.12 975.81 443.57 910.39 M 344.25 1030.75 C 371.22 994.82 399.3 962.78 448.56 910.75 M 344.25 1030.75 C 373.73 1001.2 400.43 966.9 448.56 910.75 M 349.89 1030.36 C 388.2 988.78 416.37 947.79 454.2 910.36 M 349.89 1030.36 C 374.01 1005.82 397.06 979.16 454.2 910.36 M 354.88 1030.72 C 394.58 987.02 431.91 948.21 459.19 910.72 M 354.88 1030.72 C 377.46 999.6 403.6 972.93 459.19 910.72 M 360.52 1030.32 C 385.01 998.35 414.88 974.17 464.83 910.32 M 360.52 1030.32 C 390.6 998.69 419.12 963.97 464.83 910.32 M 365.51 1030.68 C 398.25 997.51 422.54 964.28 469.82 910.68 M 365.51 1030.68 C 406.98 988.22 444.17 943.79 469.82 910.68 M 370.49 1031.04 C 408.86 990.41 441.48 952.84 475.46 910.29 M 370.49 1031.04 C 410.38 987.72 453.39 938.48 475.46 910.29 M 376.14 1030.65 C 397.05 1007.07 421.62 982.23 480.45 910.65 M 376.14 1030.65 C 406.06 991.96 440.29 956.78 480.45 910.65 M 381.12 1031.01 C 407.55 995.84 440.54 960.73 486.09 910.26 M 381.12 1031.01 C 403.94 1004.19 425.05 973.99 486.09 910.26 M 386.77 1030.61 C 425.19 990.25 459.35 951.12 491.08 910.62 M 386.77 1030.61 C 420.75 992.4 455.4 953.73 491.08 910.62 M 391.75 1030.97 C 427.87 986.91 473.45 947.57 496.07 910.98 M 391.75 1030.97 C 428.51 989.1 465.12 946.33 496.07 910.98 M 397.4 1030.58 C 430.5 990.41 470.27 945.01 501.71 910.58 M 397.4 1030.58 C 420.72 1002.4 443.15 975.64 501.71 910.58 M 402.38 1030.94 C 439.85 981.84 481.31 936.96 506.7 910.94 M 402.38 1030.94 C 429.53 1002.09 450.27 978.01 506.7 910.94 M 408.03 1030.55 C 444.28 984.84 482.54 939.97 512.34 910.55 M 408.03 1030.55 C 431.43 999.3 455.13 971.86 512.34 910.55 M 413.01 1030.91 C 438.07 1011.58 456.06 985.91 517.33 910.91 M 413.01 1030.91 C 451.81 983.15 491.36 940.13 517.33 910.91 M 418.66 1030.51 C 440.37 1008.21 462.38 977.6 522.97 910.51 M 418.66 1030.51 C 454.02 987.92 494.06 943.11 522.97 910.51 M 423.64 1030.87 C 452.04 993.51 482.25 961.79 527.96 910.87 M 423.64 1030.87 C 446.43 1004.47 471.29 979.71 527.96 910.87 M 429.29 1030.48 C 458.54 992.2 496.96 956.65 533.6 910.48 M 429.29 1030.48 C 472.46 984.85 513.04 937.74 533.6 910.48 M 434.27 1030.84 C 463.94 1001.12 487.61 964.21 538.59 910.84 M 434.27 1030.84 C 459.35 997.29 486.95 966.7 538.59 910.84 M 439.92 1030.44 C 468.07 998.61 487.93 970.05 544.23 910.44 M 439.92 1030.44 C 467.28 994.68 498.95 959.98 544.23 910.44 M 444.9 1030.8 C 482.78 991.07 516.11 956.05 549.22 910.8 M 444.9 1030.8 C 472.41 997.59 502.45 963.64 549.22 910.8 M 450.55 1030.41 C 493.08 982.05 531.62 939.75 554.86 910.41 M 450.55 1030.41 C 469.99 1006.15 490.89 982.07 554.86 910.41 M 455.53 1030.77 C 478.32 1007.28 496.77 983.61 559.85 910.77 M 455.53 1030.77 C 494.04 988.54 532.18 944.17 559.85 910.77 M 461.18 1030.37 C 483.97 1007.06 503.62 977.69 565.49 910.37 M 461.18 1030.37 C 491.82 999.61 520.02 963.76 565.49 910.37 M 466.16 1030.73 C 498.36 997.32 526.03 968.93 570.48 910.73 M 466.16 1030.73 C 494.32 1001.56 521.21 974.01 570.48 910.73 M 471.15 1031.09 C 491.92 1003.8 517.2 981.42 576.12 910.34 M 471.15 1031.09 C 496.66 1003.82 516.99 976.91 576.12 910.34 M 476.79 1030.7 C 517.86 984.23 551.8 945.67 581.11 910.7 M 476.79 1030.7 C 515.6 987.94 552.34 942.69 581.11 910.7 M 481.78 1031.06 C 507.28 1002.16 538.14 964.81 586.75 910.31 M 481.78 1031.06 C 518.7 989.63 557.34 947.74 586.75 910.31 M 487.42 1030.66 C 525.6 986.52 562.64 939.07 591.74 910.67 M 487.42 1030.66 C 513.72 994.54 544.26 963.11 591.74 910.67 M 492.41 1031.02 C 523.57 987.87 564.95 945.48 596.72 911.03 M 492.41 1031.02 C 531.24 986.21 569.44 944.73 596.72 911.03 M 498.05 1030.63 C 525.76 993.82 557.33 965.63 602.37 910.63 M 498.05 1030.63 C 536.05 988.6 573.53 948.48 602.37 910.63 M 503.04 1030.99 C 530.78 1002.37 556.53 972.35 607.35 910.99 M 503.04 1030.99 C 535.3 992.85 568.3 957.42 607.35 910.99 M 508.68 1030.6 C 542.76 991.56 578.62 953.76 613 910.6 M 508.68 1030.6 C 537.08 992.74 567.13 959.24 613 910.6 M 513.67 1030.96 C 552.29 993.47 583.66 953.5 617.98 910.96 M 513.67 1030.96 C 544.39 997.35 572.99 960.65 617.98 910.96 M 519.31 1030.56 C 560.3 984.31 605.67 935.14 623.63 910.56 M 519.31 1030.56 C 545.97 997.83 575.23 963.95 623.63 910.56 M 524.3 1030.92 C 544.43 1001.98 572.08 969.91 628.61 910.92 M 524.3 1030.92 C 558.37 995.57 589.56 956.92 628.61 910.92 M 529.94 1030.53 C 559.82 1000.27 589.33 969.21 634.26 910.53 M 529.94 1030.53 C 568.74 986.24 610.83 938.59 634.26 910.53 M 534.93 1030.89 C 566.26 990.45 605.27 952.42 639.24 910.89 M 534.93 1030.89 C 558.36 1007.02 580.79 980.24 639.24 910.89 M 540.57 1030.49 C 576.73 983.12 615.9 939 644.89 910.49 M 540.57 1030.49 C 576.23 988.46 612.81 947.06 644.89 910.49 M 545.56 1030.85 C 590.52 982.63 623.02 941.2 649.87 910.85 M 545.56 1030.85 C 566.89 1002.81 589 980.13 649.87 910.85 M 551.2 1030.46 C 589.59 983.97 634.18 935.14 655.52 910.46 M 551.2 1030.46 C 591.54 986.99 632.84 941.22 655.52 910.46 M 556.19 1030.82 C 580.47 1003.65 604.14 977.95 660.5 910.82 M 556.19 1030.82 C 586.96 994.55 620.47 958.45 660.5 910.82 M 561.83 1030.42 C 590.83 988.93 622.57 955.31 666.15 910.42 M 561.83 1030.42 C 582.53 1007.9 607.55 980.32 666.15 910.42 M 566.82 1030.78 C 592.57 1004.2 611.56 974.01 671.13 910.78 M 566.82 1030.78 C 596.39 997.16 623.81 964.26 671.13 910.78 M 571.81 1031.14 C 610.28 992.91 644.79 953.92 676.78 910.39 M 571.81 1031.14 C 598.48 1001.7 624.56 971.77 676.78 910.39 M 577.45 1030.75 C 608.08 992.69 647.75 946.61 681.76 910.75 M 577.45 1030.75 C 605.65 997.84 634.38 962.77 681.76 910.75 M 582.44 1031.11 C 622.41 983.7 669.72 939.09 687.41 910.35 M 582.44 1031.11 C 621.39 985.37 656.01 945.79 687.41 910.35 M 588.08 1030.71 C 613.17 1006.4 635.63 973.93 692.39 910.72 M 588.08 1030.71 C 616.05 995.28 645.87 962.57 692.39 910.72 M 593.07 1031.07 C 616.91 1007.37 639.69 981.02 697.38 911.08 M 593.07 1031.07 C 625.79 993.65 656.54 954.18 697.38 911.08 M 598.71 1030.68 C 618.38 1004.32 641.48 984.04 703.02 910.68 M 598.71 1030.68 C 639.07 984.47 683.39 936.4 703.02 910.68 M 603.7 1031.04 C 627.61 1007.25 655.33 978.47 708.01 911.04 M 603.7 1031.04 C 639.9 987.69 679.75 942.19 708.01 911.04 M 609.34 1030.64 C 639.13 1003.19 660.04 970.82 713.65 910.65 M 609.34 1030.64 C 645.77 987.87 682.29 948.37 713.65 910.65 M 614.33 1031 C 649.93 987.39 686.24 944.06 718.64 911.01 M 614.33 1031 C 639.9 1001.1 666.65 968.27 718.64 911.01 M 619.97 1030.61 C 641.35 1004.42 664.08 977 724.28 910.61 M 619.97 1030.61 C 646.25 999.9 675.01 966.4 724.28 910.61 M 624.96 1030.97 C 654.87 994.68 691.89 953.03 729.27 910.97 M 624.96 1030.97 C 667.35 983.61 709.25 934.6 729.27 910.97 M 630.6 1030.58 C 653.66 999.67 683.22 971.66 734.91 910.58 M 630.6 1030.58 C 654.3 1003.14 678.09 978.48 734.91 910.58 M 635.59 1030.94 C 676.95 987.99 707.81 948.74 739.9 910.94 M 635.59 1030.94 C 665.22 992.35 695.48 958.63 739.9 910.94 M 641.23 1030.54 C 666.39 997.64 696.33 965.05 745.54 910.54 M 641.23 1030.54 C 666.65 995.79 695.37 968.06 745.54 910.54 M 646.22 1030.9 C 682.77 989.16 718.76 949.63 750.53 910.9 M 646.22 1030.9 C 680.88 988.65 715.88 945.89 750.53 910.9 M 651.86 1030.51 C 689.28 984.41 730.96 936.92 756.18 910.51 M 651.86 1030.51 C 678.84 996.05 708.99 962.47 756.18 910.51 M 656.85 1030.87 C 681.53 1003.63 706.91 969.9 761.16 910.87 M 656.85 1030.87 C 679.98 1005.57 706.66 977.54 761.16 910.87 M 662.49 1030.47 C 682.52 1003.79 707.83 972.87 766.81 910.47 M 662.49 1030.47 C 692.59 993.88 720.54 960.7 766.81 910.47 M 667.48 1030.83 C 696.26 996.17 724.01 963.16 771.79 910.83 M 667.48 1030.83 C 695.71 995.89 724.94 962.28 771.79 910.83 M 672.47 1031.19 C 707.05 992.96 732.43 963.81 777.44 910.44 M 672.47 1031.19 C 706.5 991.76 741.03 953.85 777.44 910.44 M 678.11 1030.8 C 710.9 991 743.79 954.62 782.42 910.8 M 678.11 1030.8 C 713.19 988.62 751.98 944.96 782.42 910.8 M 683.1 1031.16 C 716.38 993.98 748.1 962.25 788.07 910.4 M 683.1 1031.16 C 704.87 1006.33 725.98 979.95 788.07 910.4 M 688.74 1030.76 C 723.15 991.82 756.64 945.09 793.05 910.76 M 688.74 1030.76 C 729.69 984.48 768.02 942.01 793.05 910.76 M 693.73 1031.12 C 720.24 1002.97 744.04 974.52 798.04 911.12 M 693.73 1031.12 C 729.03 991.84 763.65 953.58 798.04 911.12 M 699.37 1030.73 C 731.73 985.95 772.77 947.14 803.68 910.73 M 699.37 1030.73 C 737.04 987.92 774.61 945.44 803.68 910.73 M 704.36 1031.09 C 723.26 1005.2 750.03 979.74 808.67 911.09 M 704.36 1031.09 C 728.41 1001.58 755.25 972.33 808.67 911.09 M 710 1030.69 C 733.09 1008.02 750.12 984.75 814.31 910.7 M 710 1030.69 C 731.1 1007.43 751.32 983.2 814.31 910.7 M 714.99 1031.05 C 748.85 991.43 790.45 947.3 819.3 911.06 M 714.99 1031.05 C 751.27 989.05 788.33 946.25 819.3 911.06 M 720.63 1030.66 C 748.77 999.78 780.32 961.15 824.94 910.66 M 720.63 1030.66 C 746.44 999.41 776.93 963.02 824.94 910.66 M 725.62 1031.02 C 751.84 994.26 787.97 960.36 829.93 911.02 M 725.62 1031.02 C 763.9 987.57 802.4 944.92 829.93 911.02 M 731.26 1030.63 C 770.77 982.97 809.65 935.7 835.57 910.63 M 731.26 1030.63 C 758.3 999.97 782.23 972.2 835.57 910.63 M 736.25 1030.99 C 759.42 1003.15 784.67 979.06 840.56 910.99 M 736.25 1030.99 C 756.4 1002.25 781.98 973.58 840.56 910.99 M 741.89 1030.59 C 787.24 982.43 823.46 934.98 846.2 910.59 M 741.89 1030.59 C 769.36 997.09 802.02 961.8 846.2 910.59 M 746.88 1030.95 C 786.14 981.14 826.35 937.23 851.19 910.95 M 746.88 1030.95 C 773.07 998.19 799.9 969.36 851.19 910.95 M 752.52 1030.56 C 779.36 998.31 802.91 973 856.83 910.56 M 752.52 1030.56 C 792.82 983.02 835.52 939.02 856.83 910.56 M 757.51 1030.92 C 788.51 989.46 822.23 955.49 860.51 912.43 M 757.51 1030.92 C 794.95 988.78 827.93 950.07 860.51 912.43 M 763.15 1030.52 C 804.94 988.01 841.22 946.53 864.18 914.3 M 763.15 1030.52 C 792.95 994.47 821.14 960.52 864.18 914.3 M 768.14 1030.88 C 797.31 998.28 831.86 959.27 867.86 916.17 M 768.14 1030.88 C 788.41 1006.07 807.56 983.01 867.86 916.17 M 773.12 1031.24 C 797.11 1009.25 816.51 981.22 869.56 920.3 M 773.12 1031.24 C 809.52 988.25 850.9 942.08 869.56 920.3 M 778.77 1030.85 C 807.82 1007.17 829.94 975.61 870.61 925.19 M 778.77 1030.85 C 804.62 1001.2 830.44 973.28 870.61 925.19 M 783.75 1031.21 C 812.46 996.16 839.3 962.42 871.01 930.83 M 783.75 1031.21 C 818.11 994.34 852.09 952.42 871.01 930.83 M 789.4 1030.81 C 810.71 1012.06 824.91 986.75 870.75 937.23 M 789.4 1030.81 C 809.13 1011.38 824.46 990.28 870.75 937.23 M 794.38 1031.17 C 819.86 1002.69 847.23 969.91 871.14 942.87 M 794.38 1031.17 C 813.37 1011.96 831.82 987.52 871.14 942.87 M 800.03 1030.78 C 811.18 1015.88 831.34 999.02 870.88 949.27 M 800.03 1030.78 C 819.54 1008.62 842.15 985.35 870.88 949.27 M 805.01 1031.14 C 829.37 1010.42 844.73 986.59 870.62 955.67 M 805.01 1031.14 C 817.09 1013.71 830.26 999.85 870.62 955.67 M 810.66 1030.74 C 835.22 1006.76 857.21 974.05 871.01 961.31 M 810.66 1030.74 C 825.19 1009.55 842.21 993.4 871.01 961.31 M 815.64 1031.1 C 833.64 1011.67 855.78 985.05 870.75 967.71 M 815.64 1031.1 C 827.62 1014.86 837.69 1003.2 870.75 967.71 M 821.29 1030.71 C 836.92 1007.51 851.36 989.24 871.15 973.35 M 821.29 1030.71 C 832.28 1018.29 838.85 1007.69 871.15 973.35 M 826.27 1031.07 C 840.57 1015.97 854.15 999.71 870.89 979.75 M 826.27 1031.07 C 839.44 1013.5 852.49 1001.42 870.89 979.75 M 831.92 1030.68 C 841.5 1016.12 854.76 1004.85 870.62 986.15 M 831.92 1030.68 C 843.38 1020.48 851.49 1005.14 870.62 986.15 M 836.9 1031.04 C 847.35 1022.82 856.46 1014.82 871.02 991.79 M 836.9 1031.04 C 847.72 1017.45 862.91 1003.53 871.02 991.79 M 842.55 1030.64 C 849.27 1020.17 854.55 1011.38 870.76 998.19 M 842.55 1030.64 C 847.84 1023.23 856.81 1016.54 870.76 998.19 M 847.53 1031 C 851.16 1024.12 857.94 1012.57 871.15 1003.83 M 847.53 1031 C 850.85 1026.11 855.6 1018.85 871.15 1003.83 M 853.18 1030.61 C 860.86 1025.9 869.18 1017.33 870.89 1010.23 M 853.18 1030.61 C 856.86 1024.94 863.28 1019.66 870.89 1010.23 M 860.13 1028.7 C 864.33 1023.52 865.31 1017.09 870.63 1016.63 M 860.13 1028.7 C 863.12 1026.72 867.65 1023.08 870.63 1016.63" fill="none" stroke="#e1d5e7" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 268 910 M 268 910 C 438.09 909.96 605.33 912.67 852 910 M 268 910 C 441.14 905.32 615.05 906.17 852 910 M 852 910 C 863.57 909.15 873.62 917.21 870 928 M 852 910 C 865.2 908.4 865.77 911.93 870 928 M 870 928 C 873.03 950.91 869.44 974.03 870 1012 M 870 928 C 869.55 950.07 869.4 968.73 870 1012 M 870 1012 C 867.2 1025.15 867.71 1026.5 852 1030 M 870 1012 C 867.28 1022.29 863.18 1030.43 852 1030 M 852 1030 C 683.2 1032.81 513.6 1033.67 268 1030 M 852 1030 C 699.96 1034.03 548.69 1034.2 268 1030 M 268 1030 C 253.05 1031.35 251.11 1023.19 250 1012 M 268 1030 C 256.27 1030.04 253.79 1024.48 250 1012 M 250 1012 C 250.84 997.96 246.31 979.96 250 928 M 250 1012 C 250.04 985.68 249.05 957.23 250 928 M 250 928 C 246.95 917.51 252.52 907.05 268 910 M 250 928 C 250.76 916.83 260.08 914.16 268 910" fill="none" stroke="#9673a6" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 410 970 L 496.63 970" fill="none" stroke="none" pointer-events="stroke"/><path d="M 501.88 970 L 494.88 973.5 L 496.63 970 L 494.88 966.5 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 410 970 M 410 970 C 437.29 971.58 470.89 967.8 496.63 970 M 410 970 C 438.38 970.97 463.5 970.31 496.63 970" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 494.67 966.74 C 494.67 966.74 494.67 966.74 494.67 966.74 M 494.67 966.74 C 494.67 966.74 494.67 966.74 494.67 966.74 M 497.03 970.12 C 497.28 969.46 497.42 969.37 498.35 968.61 M 497.03 970.12 C 497.27 969.92 497.66 969.54 498.35 968.61" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 501.88 970 M 501.88 970 C 500.13 970.33 497.17 972.42 494.88 973.5 M 501.88 970 C 500.03 970.59 496.91 971.52 494.88 973.5 M 494.88 973.5 C 495.3 972.63 496.96 971.22 496.63 970 M 494.88 973.5 C 495.02 972.97 495.42 971.63 496.63 970 M 496.63 970 C 495.54 969.37 495.13 968.67 494.88 966.5 M 496.63 970 C 496.21 968.87 495.25 967.32 494.88 966.5 M 494.88 966.5 C 498.87 969.09 498.53 969.72 501.88 970 M 494.88 966.5 C 496.28 966.65 498.68 967.39 501.88 970" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 970px; margin-left: 457px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 12px;" face="Verdana">key event</font></div></div></div></foreignObject><text x="457" y="975" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">key event</text></switch></g><rect x="290" y="940" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 301.12 939.59 L 403.48 939.5 L 410.76 943.32 L 412.94 952.77 L 407.12 997.09 L 407.81 1000.85 L 398.83 999.82 L 298.29 1001.74 L 290.66 1001.57 L 291.01 994.47 L 291.61 945.63 L 289.5 939.74 L 299.89 937.5" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 299 940 M 299 940 C 335.65 938.15 374.73 939.28 401 940 M 299 940 C 320.88 941.84 340.76 940.54 401 940 M 401 940 C 408.5 940.53 406.43 943.89 410 949 M 401 940 C 407.75 940.56 407.29 945.39 410 949 M 410 949 C 411.08 960.47 412.54 970.06 410 991 M 410 949 C 409.77 965.29 408.07 979.09 410 991 M 410 991 C 413.13 999.06 407.44 997.82 401 1000 M 410 991 C 405.58 997.92 404.36 1004.03 401 1000 M 401 1000 C 375.52 996.74 348.82 999.78 299 1000 M 401 1000 C 379 998.07 361.46 1000.53 299 1000 M 299 1000 C 294.67 1002.02 293.06 1000.53 290 991 M 299 1000 C 296.75 1000.18 289.09 997.77 290 991 M 290 991 C 289.25 979.92 289.54 966.49 290 949 M 290 991 C 291.11 979.08 289.89 971.27 290 949 M 290 949 C 292.13 941.43 289.38 936.67 299 940 M 290 949 C 287.34 944.56 290.68 940.01 299 940" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 970px; margin-left: 291px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">scan central matrix</font></div></div></div></foreignObject><text x="350" y="975" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">scan central ma...</text></switch></g><path d="M 623 970 L 706.76 970" fill="none" stroke="none" pointer-events="stroke"/><path d="M 712.01 970 L 705.01 973.5 L 706.76 970 L 705.01 966.5 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 623 970 M 623 970 C 652.68 967.38 682.95 974.45 706.76 970 M 623 970 C 649.59 972.68 679.86 971.63 706.76 970" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 704.9 966.63 C 704.9 966.63 704.9 966.63 704.9 966.63 M 704.9 966.63 C 704.9 966.63 704.9 966.63 704.9 966.63 M 707.26 970.01 C 707.6 969.34 708.12 969.19 708.57 968.5 M 707.26 970.01 C 707.8 969.71 707.89 969.15 708.57 968.5" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 712.01 970 M 712.01 970 C 709.82 972.69 705.39 973.88 705.01 973.5 M 712.01 970 C 708.98 971.77 707.25 971.86 705.01 973.5 M 705.01 973.5 C 705.7 971.47 706.7 970.33 706.76 970 M 705.01 973.5 C 705.73 972.44 706.33 971.58 706.76 970 M 706.76 970 C 706.8 969.01 705.11 967.11 705.01 966.5 M 706.76 970 C 706.22 968.75 705.27 967.39 705.01 966.5 M 705.01 966.5 C 706.86 968.99 710.11 967.71 712.01 970 M 705.01 966.5 C 706.28 966.79 707.71 967.93 712.01 970" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="503" y="940" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 514.13 938.04 L 615.23 944.08 L 619.38 942.22 L 626.71 951.8 L 621.93 996.71 L 618.7 997.04 L 617.7 996.81 L 509.67 1000.66 L 501.67 1000.98 L 503.42 990.68 L 504 945.01 L 501.6 938.79 L 515 938.93" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 512 940 M 512 940 C 552.19 935.21 590.24 939.26 614 940 M 512 940 C 537.34 940.03 563.37 938.71 614 940 M 614 940 C 616.56 940.13 621.14 946.38 623 949 M 614 940 C 616.94 938.8 618.66 947.1 623 949 M 623 949 C 620.97 962.07 622.74 983.84 623 991 M 623 949 C 623.49 966.02 622.25 978.93 623 991 M 623 991 C 623.19 994.05 620.38 999.34 614 1000 M 623 991 C 621.55 993.08 621.66 999.94 614 1000 M 614 1000 C 581.76 996.17 549.62 995.73 512 1000 M 614 1000 C 591.95 999.6 572.38 1001.01 512 1000 M 512 1000 C 508.07 999.15 504.24 998.95 503 991 M 512 1000 C 503.28 997.68 503.25 992.63 503 991 M 503 991 C 501.83 975.4 504.65 954.88 503 949 M 503 991 C 501.49 975.72 502.69 959.24 503 949 M 503 949 C 506.04 946.8 507.88 938.27 512 940 M 503 949 C 503.51 939.58 502.62 937.92 512 940" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 970px; margin-left: 504px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">process key</font></div></div></div></foreignObject><text x="563" y="975" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">process key</text></switch></g><rect x="713.13" y="940" width="120" height="60" rx="9" ry="9" fill="none" stroke="none" pointer-events="all"/><path d="M 724.26 938.72 L 830.17 941.8 L 827.44 945.58 L 835.17 946.68 L 832.6 991.12 L 833.62 997.89 L 822.92 1002.54 L 721.2 997.72 L 717.56 1000.23 L 709.89 987.66 L 715.81 952.02 L 712.43 940.94 L 722.05 938" fill="rgb(255, 255, 255)" stroke="none" pointer-events="all"/><path d="M 722.13 940 M 722.13 940 C 742.78 936.71 760.91 942.3 824.13 940 M 722.13 940 C 757.05 943.67 789.94 942.24 824.13 940 M 824.13 940 C 827.75 936.24 836.9 943.79 833.13 949 M 824.13 940 C 827.79 935.4 828.74 944.92 833.13 949 M 833.13 949 C 831.32 959.95 832.14 969.74 833.13 991 M 833.13 949 C 832.7 962.72 833.17 979.44 833.13 991 M 833.13 991 C 832.5 998.02 830.27 1003.51 824.13 1000 M 833.13 991 C 835.68 1001.02 826.9 1002.88 824.13 1000 M 824.13 1000 C 786.18 1001.01 739.41 997.8 722.13 1000 M 824.13 1000 C 787.81 1000.27 749.55 1002.37 722.13 1000 M 722.13 1000 C 713.12 999.55 712.13 998.9 713.13 991 M 722.13 1000 C 714.33 1000.95 711.19 1001.4 713.13 991 M 713.13 991 C 712.61 980.05 712.83 962.17 713.13 949 M 713.13 991 C 712.3 976.99 712.72 964.89 713.13 949 M 713.13 949 C 709.66 946.48 716.48 940.01 722.13 940 M 713.13 949 C 710.67 946.67 715.23 943.15 722.13 940" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 970px; margin-left: 714px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 16px; font-family: &quot;Architects Daughter&quot;; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font face="Verdana">send report<br /></font></div></div></div></foreignObject><text x="773" y="975" fill="rgb(0, 0, 0)" font-family="Architects Daughter" font-size="16px" text-anchor="middle">send report
 </text></switch></g><rect x="90" y="955" width="150" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 970px; margin-left: 91px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 14px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 18px;">main keyboard thread</font></div></div></div></foreignObject><text x="165" y="974" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="14px" text-anchor="middle">main keyboard thread</text></switch></g><rect x="85" y="578.71" width="60" height="40.29" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 599px; margin-left: 86px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 24px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">central</div></div></div></foreignObject><text x="115" y="606" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="24px" text-anchor="middle">centr...</text></switch></g><rect x="160" y="740" width="150" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 755px; margin-left: 161px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 14px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 18px;">split central thread</font></div></div></div></foreignObject><text x="235" y="759" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="14px" text-anchor="middle">split central thread</text></switch></g><path d="M 260 780 L 333.63 780" fill="none" stroke="none" pointer-events="stroke"/><path d="M 338.88 780 L 331.88 783.5 L 333.63 780 L 331.88 776.5 Z" fill="none" stroke="none" pointer-events="all"/><path d="M 260 780 M 260 780 C 289.55 778.96 309.62 781.99 333.63 780 M 260 780 C 280.05 779.24 302.56 779.28 333.63 780" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 332.03 776.33 C 332.03 776.33 332.03 776.33 332.03 776.33 M 332.03 776.33 C 332.03 776.33 332.03 776.33 332.03 776.33 M 333.73 780.46 C 334.61 779.72 334.84 779.37 335.7 778.2 M 333.73 780.46 C 334.35 779.59 334.87 779.05 335.7 778.2" fill="none" stroke="rgb(0, 0, 0)" stroke-width="0.5" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><path d="M 338.88 780 M 338.88 780 C 336.04 780.44 335.29 781.84 331.88 783.5 M 338.88 780 C 336.71 782.02 333.77 782.7 331.88 783.5 M 331.88 783.5 C 332.43 782.68 333.44 780.79 333.63 780 M 331.88 783.5 C 332.37 781.79 333.61 780.91 333.63 780 M 333.63 780 C 333.31 778.19 331.65 777.95 331.88 776.5 M 333.63 780 C 333.14 778.79 332.26 778.06 331.88 776.5 M 331.88 776.5 C 335.08 777 334.97 777.55 338.88 780 M 331.88 776.5 C 334.39 777.17 336.76 779.04 338.88 780" fill="none" stroke="rgb(0, 0, 0)" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" pointer-events="all"/><rect x="485" y="470" width="150" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 485px; margin-left: 486px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 14px; font-family: Verdana; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 18px;">or</font></div></div></div></foreignObject><text x="560" y="489" fill="rgb(0, 0, 0)" font-family="Verdana" font-size="14px" text-anchor="middle">or</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file
diff --git a/docs/src/split_keyboard.md b/docs/src/split_keyboard.md
index 76b714d4..c499cf36 100644
--- a/docs/src/split_keyboard.md
+++ b/docs/src/split_keyboard.md
@@ -187,10 +187,10 @@ run_rmk_split_central::<
         )
 ```
 
-In peripheral central, you should also run the peripheral monitor for each peripheral. This task monitors the peripheral key changes and forwards them to central core keyboard task
+In peripheral central, you should also run the peripheral manager for each peripheral. This task monitors the peripheral key changes and forwards them to central core keyboard task
 
 ```rust
-run_peripheral_monitor<
+run_peripheral_manager<
     2, // PERIPHERAL_ROW
     1, // PERIPHERAL_COL
     2, // PERIPHERAL_ROW_OFFSET
diff --git a/docs/src/storage.md b/docs/src/storage.md
index b3704f88..19a8e41a 100644
--- a/docs/src/storage.md
+++ b/docs/src/storage.md
@@ -37,7 +37,7 @@ let storage_config = StorageConfig {
     num_sectors: 2,
     ..Default::default()
 };
-let keyboard_config = RmkConfig {
+let rmk_config = RmkConfig {
     usb_config: keyboard_usb_config,
     vial_config,
     storage_config,
diff --git a/examples/use_config/esp32c3_ble/Cargo.lock b/examples/use_config/esp32c3_ble/Cargo.lock
index 03600711..7a945a6e 100644
--- a/examples/use_config/esp32c3_ble/Cargo.lock
+++ b/examples/use_config/esp32c3_ble/Cargo.lock
@@ -284,7 +284,9 @@ checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
 dependencies = [
  "android-tzdata",
  "iana-time-zone",
+ "js-sys",
  "num-traits",
+ "wasm-bindgen",
  "windows-targets",
 ]
 
@@ -392,6 +394,15 @@ dependencies = [
  "syn 2.0.96",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -963,6 +974,7 @@ dependencies = [
  "embassy-time-driver",
  "embassy-time-queue-utils",
  "embedded-hal-async",
+ "embedded-storage",
  "embedded-svc",
  "embuild",
  "enumset",
@@ -1546,6 +1558,12 @@ version = "1.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.15"
@@ -1717,7 +1735,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1738,6 +1758,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
diff --git a/examples/use_config/esp32c6_ble/Cargo.lock b/examples/use_config/esp32c6_ble/Cargo.lock
index f824a60b..8b19f8d0 100644
--- a/examples/use_config/esp32c6_ble/Cargo.lock
+++ b/examples/use_config/esp32c6_ble/Cargo.lock
@@ -284,7 +284,9 @@ checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
 dependencies = [
  "android-tzdata",
  "iana-time-zone",
+ "js-sys",
  "num-traits",
+ "wasm-bindgen",
  "windows-targets",
 ]
 
@@ -392,6 +394,15 @@ dependencies = [
  "syn 2.0.96",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -963,6 +974,7 @@ dependencies = [
  "embassy-time-driver",
  "embassy-time-queue-utils",
  "embedded-hal-async",
+ "embedded-storage",
  "embedded-svc",
  "embuild",
  "enumset",
@@ -1546,6 +1558,12 @@ version = "1.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.15"
@@ -1717,7 +1735,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1738,6 +1758,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
diff --git a/examples/use_config/esp32s3_ble/Cargo.lock b/examples/use_config/esp32s3_ble/Cargo.lock
index 14ca075b..c4424858 100644
--- a/examples/use_config/esp32s3_ble/Cargo.lock
+++ b/examples/use_config/esp32s3_ble/Cargo.lock
@@ -284,7 +284,9 @@ checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
 dependencies = [
  "android-tzdata",
  "iana-time-zone",
+ "js-sys",
  "num-traits",
+ "wasm-bindgen",
  "windows-targets",
 ]
 
@@ -392,6 +394,15 @@ dependencies = [
  "syn 2.0.96",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -963,6 +974,7 @@ dependencies = [
  "embassy-time-driver",
  "embassy-time-queue-utils",
  "embedded-hal-async",
+ "embedded-storage",
  "embedded-svc",
  "embuild",
  "enumset",
@@ -1546,6 +1558,12 @@ version = "1.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.15"
@@ -1717,7 +1735,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1738,6 +1758,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
diff --git a/examples/use_config/nrf52832_ble/Cargo.lock b/examples/use_config/nrf52832_ble/Cargo.lock
index fbca8855..59f963b1 100644
--- a/examples/use_config/nrf52832_ble/Cargo.lock
+++ b/examples/use_config/nrf52832_ble/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "atomic-polyfill"
 version = "1.0.3"
@@ -98,6 +113,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -135,6 +156,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -161,6 +196,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -193,6 +234,15 @@ dependencies = [
  "syn 2.0.95",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -736,6 +786,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -752,6 +825,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -921,6 +1004,12 @@ dependencies = [
  "defmt",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.16"
@@ -1060,7 +1149,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1080,6 +1171,7 @@ dependencies = [
  "nrf-softdevice",
  "num_enum",
  "once_cell",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1141,6 +1233,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1429,6 +1527,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.22"
diff --git a/examples/use_config/nrf52840_ble/Cargo.lock b/examples/use_config/nrf52840_ble/Cargo.lock
index a843f244..82641a5b 100644
--- a/examples/use_config/nrf52840_ble/Cargo.lock
+++ b/examples/use_config/nrf52840_ble/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "atomic-polyfill"
 version = "1.0.3"
@@ -98,6 +113,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -135,6 +156,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -161,6 +196,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -193,6 +234,15 @@ dependencies = [
  "syn 2.0.95",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -736,6 +786,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -752,6 +825,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -921,6 +1004,12 @@ dependencies = [
  "defmt",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.16"
@@ -1060,7 +1149,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1080,6 +1171,7 @@ dependencies = [
  "nrf-softdevice",
  "num_enum",
  "once_cell",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1141,6 +1233,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1429,6 +1527,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.22"
diff --git a/examples/use_config/nrf52840_ble_split/Cargo.lock b/examples/use_config/nrf52840_ble_split/Cargo.lock
index 736dcd13..433d99d7 100644
--- a/examples/use_config/nrf52840_ble_split/Cargo.lock
+++ b/examples/use_config/nrf52840_ble_split/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "atomic-polyfill"
 version = "1.0.3"
@@ -98,6 +113,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -135,6 +156,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -161,6 +196,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -193,6 +234,15 @@ dependencies = [
  "syn 2.0.95",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -736,6 +786,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -752,6 +825,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -921,6 +1004,12 @@ dependencies = [
  "defmt",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.16"
@@ -1060,7 +1149,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1080,6 +1171,7 @@ dependencies = [
  "nrf-softdevice",
  "num_enum",
  "once_cell",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1142,6 +1234,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1430,6 +1528,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.22"
diff --git a/examples/use_config/nrf52840_usb/Cargo.lock b/examples/use_config/nrf52840_usb/Cargo.lock
index c2d88cb0..79c5faeb 100644
--- a/examples/use_config/nrf52840_usb/Cargo.lock
+++ b/examples/use_config/nrf52840_usb/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "atomic-polyfill"
 version = "1.0.3"
@@ -98,6 +113,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -135,6 +156,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -161,6 +196,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -194,6 +235,15 @@ dependencies = [
  "syn 2.0.95",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -737,6 +787,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -753,6 +826,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -912,6 +995,12 @@ dependencies = [
  "defmt",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.16"
@@ -1051,7 +1140,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1070,6 +1161,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1131,6 +1223,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1419,6 +1517,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.22"
diff --git a/examples/use_config/rp2040/Cargo.lock b/examples/use_config/rp2040/Cargo.lock
index 3774c159..d0a676d1 100644
--- a/examples/use_config/rp2040/Cargo.lock
+++ b/examples/use_config/rp2040/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "arrayvec"
 version = "0.7.6"
@@ -128,6 +143,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -165,6 +186,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -201,6 +236,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -242,6 +283,15 @@ dependencies = [
  "debug-helper",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -904,6 +954,29 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -940,6 +1013,16 @@ dependencies = [
  "either",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -1461,7 +1544,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1480,6 +1565,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum 0.7.3",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1970,6 +2056,64 @@ version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
 [[package]]
 name = "winapi"
 version = "0.3.9"
@@ -2001,6 +2145,15 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
 [[package]]
 name = "windows-sys"
 version = "0.52.0"
diff --git a/examples/use_config/rp2040_direct_pin/Cargo.lock b/examples/use_config/rp2040_direct_pin/Cargo.lock
index 3774c159..d0a676d1 100644
--- a/examples/use_config/rp2040_direct_pin/Cargo.lock
+++ b/examples/use_config/rp2040_direct_pin/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "arrayvec"
 version = "0.7.6"
@@ -128,6 +143,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -165,6 +186,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -201,6 +236,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -242,6 +283,15 @@ dependencies = [
  "debug-helper",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -904,6 +954,29 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -940,6 +1013,16 @@ dependencies = [
  "either",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -1461,7 +1544,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1480,6 +1565,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum 0.7.3",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1970,6 +2056,64 @@ version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
 [[package]]
 name = "winapi"
 version = "0.3.9"
@@ -2001,6 +2145,15 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
 [[package]]
 name = "windows-sys"
 version = "0.52.0"
diff --git a/examples/use_config/rp2040_split/Cargo.lock b/examples/use_config/rp2040_split/Cargo.lock
index 32918a0c..2748b47d 100644
--- a/examples/use_config/rp2040_split/Cargo.lock
+++ b/examples/use_config/rp2040_split/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "arrayvec"
 version = "0.7.6"
@@ -128,6 +143,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -165,6 +186,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -201,6 +236,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -242,6 +283,15 @@ dependencies = [
  "debug-helper",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -904,6 +954,29 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -940,6 +1013,16 @@ dependencies = [
  "either",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -1461,7 +1544,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1480,6 +1565,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum 0.7.3",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1972,6 +2058,64 @@ version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
 [[package]]
 name = "winapi"
 version = "0.3.9"
@@ -2003,6 +2147,15 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
 [[package]]
 name = "windows-sys"
 version = "0.52.0"
diff --git a/examples/use_config/stm32f1/Cargo.lock b/examples/use_config/stm32f1/Cargo.lock
index 1ff2b4bb..66a67f69 100644
--- a/examples/use_config/stm32f1/Cargo.lock
+++ b/examples/use_config/stm32f1/Cargo.lock
@@ -42,6 +42,21 @@ dependencies = [
  "as-slice",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "as-slice"
 version = "0.2.1"
@@ -131,6 +146,12 @@ dependencies = [
  "aligned",
 ]
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -168,6 +189,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -194,6 +229,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -227,6 +268,15 @@ dependencies = [
  "syn 2.0.90",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -840,6 +890,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -856,6 +929,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -1014,6 +1097,12 @@ dependencies = [
  "cortex-m",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.15"
@@ -1153,7 +1242,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1172,6 +1263,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1232,6 +1324,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1551,6 +1649,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.20"
diff --git a/examples/use_config/stm32f4/Cargo.lock b/examples/use_config/stm32f4/Cargo.lock
index 6f364750..83f8933a 100644
--- a/examples/use_config/stm32f4/Cargo.lock
+++ b/examples/use_config/stm32f4/Cargo.lock
@@ -42,6 +42,21 @@ dependencies = [
  "as-slice",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "as-slice"
 version = "0.2.1"
@@ -131,6 +146,12 @@ dependencies = [
  "aligned",
 ]
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -168,6 +189,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -194,6 +229,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -227,6 +268,15 @@ dependencies = [
  "syn 2.0.90",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -850,6 +900,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -866,6 +939,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -1025,6 +1108,12 @@ dependencies = [
  "defmt",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.15"
@@ -1164,7 +1253,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1183,6 +1274,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1245,6 +1337,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1564,6 +1662,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.20"
diff --git a/examples/use_config/stm32h7/Cargo.lock b/examples/use_config/stm32h7/Cargo.lock
index 6bdb7463..0a7020b7 100644
--- a/examples/use_config/stm32h7/Cargo.lock
+++ b/examples/use_config/stm32h7/Cargo.lock
@@ -42,6 +42,21 @@ dependencies = [
  "as-slice",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "as-slice"
 version = "0.2.1"
@@ -131,6 +146,12 @@ dependencies = [
  "aligned",
 ]
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -168,6 +189,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -194,6 +229,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -227,6 +268,15 @@ dependencies = [
  "syn 2.0.90",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -850,6 +900,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -866,6 +939,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -1025,6 +1108,12 @@ dependencies = [
  "defmt",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.15"
@@ -1164,7 +1253,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1183,6 +1274,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1245,6 +1337,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1564,6 +1662,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.20"
diff --git a/examples/use_rust/ch32v307/src/main.rs b/examples/use_rust/ch32v307/src/main.rs
index d9915e58..ec8f0f92 100644
--- a/examples/use_rust/ch32v307/src/main.rs
+++ b/examples/use_rust/ch32v307/src/main.rs
@@ -18,7 +18,7 @@ use defmt::{info, println, Display2Format};
 use embassy_executor::Spawner;
 use embassy_time::Timer;
 use logger::set_logger;
-use rmk::config::{KeyboardUsbConfig, RmkConfig, VialConfig};
+use rmk::config::{KeyboardConfig, KeyboardUsbConfig, RmkConfig, VialConfig};
 use rmk::{k, run_rmk};
 use static_cell::StaticCell;
 use vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID};
@@ -85,16 +85,22 @@ async fn main(spawner: Spawner) -> ! {
     };
     let vial_config = VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF);
 
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         usb_config: keyboard_usb_config,
         vial_config,
         ..Default::default()
     };
+
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     run_rmk(
         i,
         o,
         driver,
-        // rmk::EmptyFlashWrapper::new(),
+        // rmk::DummyFlash::new(),
         &mut default_keymap,
         keyboard_config,
         spawner,
diff --git a/examples/use_rust/esp32c3_ble/Cargo.lock b/examples/use_rust/esp32c3_ble/Cargo.lock
index 03600711..7a945a6e 100644
--- a/examples/use_rust/esp32c3_ble/Cargo.lock
+++ b/examples/use_rust/esp32c3_ble/Cargo.lock
@@ -284,7 +284,9 @@ checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
 dependencies = [
  "android-tzdata",
  "iana-time-zone",
+ "js-sys",
  "num-traits",
+ "wasm-bindgen",
  "windows-targets",
 ]
 
@@ -392,6 +394,15 @@ dependencies = [
  "syn 2.0.96",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -963,6 +974,7 @@ dependencies = [
  "embassy-time-driver",
  "embassy-time-queue-utils",
  "embedded-hal-async",
+ "embedded-storage",
  "embedded-svc",
  "embuild",
  "enumset",
@@ -1546,6 +1558,12 @@ version = "1.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.15"
@@ -1717,7 +1735,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1738,6 +1758,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
diff --git a/examples/use_rust/esp32c3_ble/src/main.rs b/examples/use_rust/esp32c3_ble/src/main.rs
index 2b34e36d..109731b9 100644
--- a/examples/use_rust/esp32c3_ble/src/main.rs
+++ b/examples/use_rust/esp32c3_ble/src/main.rs
@@ -10,7 +10,7 @@ use defmt::*;
 use esp_idf_svc::hal::{gpio::*, peripherals::Peripherals, task::block_on};
 use esp_println as _;
 use rmk::{
-    config::{RmkConfig, VialConfig},
+    config::{KeyboardConfig, RmkConfig, VialConfig},
     run_rmk,
 };
 
@@ -30,11 +30,17 @@ fn main() {
 
     // Keyboard config
     let vial_config = VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF);
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         vial_config,
         ..Default::default()
     };
 
+    // Keyboard config
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     // Start serving
     block_on(run_rmk(
         input_pins,
diff --git a/examples/use_rust/esp32c6_ble/Cargo.lock b/examples/use_rust/esp32c6_ble/Cargo.lock
index f824a60b..8b19f8d0 100644
--- a/examples/use_rust/esp32c6_ble/Cargo.lock
+++ b/examples/use_rust/esp32c6_ble/Cargo.lock
@@ -284,7 +284,9 @@ checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
 dependencies = [
  "android-tzdata",
  "iana-time-zone",
+ "js-sys",
  "num-traits",
+ "wasm-bindgen",
  "windows-targets",
 ]
 
@@ -392,6 +394,15 @@ dependencies = [
  "syn 2.0.96",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -963,6 +974,7 @@ dependencies = [
  "embassy-time-driver",
  "embassy-time-queue-utils",
  "embedded-hal-async",
+ "embedded-storage",
  "embedded-svc",
  "embuild",
  "enumset",
@@ -1546,6 +1558,12 @@ version = "1.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.15"
@@ -1717,7 +1735,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1738,6 +1758,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
diff --git a/examples/use_rust/esp32c6_ble/src/main.rs b/examples/use_rust/esp32c6_ble/src/main.rs
index 2b34e36d..109731b9 100644
--- a/examples/use_rust/esp32c6_ble/src/main.rs
+++ b/examples/use_rust/esp32c6_ble/src/main.rs
@@ -10,7 +10,7 @@ use defmt::*;
 use esp_idf_svc::hal::{gpio::*, peripherals::Peripherals, task::block_on};
 use esp_println as _;
 use rmk::{
-    config::{RmkConfig, VialConfig},
+    config::{KeyboardConfig, RmkConfig, VialConfig},
     run_rmk,
 };
 
@@ -30,11 +30,17 @@ fn main() {
 
     // Keyboard config
     let vial_config = VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF);
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         vial_config,
         ..Default::default()
     };
 
+    // Keyboard config
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     // Start serving
     block_on(run_rmk(
         input_pins,
diff --git a/examples/use_rust/esp32s3_ble/Cargo.lock b/examples/use_rust/esp32s3_ble/Cargo.lock
index 14ca075b..c4424858 100644
--- a/examples/use_rust/esp32s3_ble/Cargo.lock
+++ b/examples/use_rust/esp32s3_ble/Cargo.lock
@@ -284,7 +284,9 @@ checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
 dependencies = [
  "android-tzdata",
  "iana-time-zone",
+ "js-sys",
  "num-traits",
+ "wasm-bindgen",
  "windows-targets",
 ]
 
@@ -392,6 +394,15 @@ dependencies = [
  "syn 2.0.96",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -963,6 +974,7 @@ dependencies = [
  "embassy-time-driver",
  "embassy-time-queue-utils",
  "embedded-hal-async",
+ "embedded-storage",
  "embedded-svc",
  "embuild",
  "enumset",
@@ -1546,6 +1558,12 @@ version = "1.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.15"
@@ -1717,7 +1735,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1738,6 +1758,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
diff --git a/examples/use_rust/esp32s3_ble/src/main.rs b/examples/use_rust/esp32s3_ble/src/main.rs
index 3ebedf66..a3f850ba 100644
--- a/examples/use_rust/esp32s3_ble/src/main.rs
+++ b/examples/use_rust/esp32s3_ble/src/main.rs
@@ -10,7 +10,7 @@ use defmt::*;
 use esp_idf_svc::hal::{gpio::*, peripherals::Peripherals, task::block_on};
 use esp_println as _;
 use rmk::{
-    config::{RmkConfig, VialConfig},
+    config::{KeyboardConfig, RmkConfig, VialConfig},
     run_rmk,
 };
 
@@ -30,11 +30,17 @@ fn main() {
 
     // Keyboard config
     let vial_config = VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF);
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         vial_config,
         ..Default::default()
     };
 
+    // Keyboard config
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     // Start serving
     block_on(run_rmk(
         input_pins,
diff --git a/examples/use_rust/hpm5300/src/main.rs b/examples/use_rust/hpm5300/src/main.rs
index abccf535..7e7e2266 100644
--- a/examples/use_rust/hpm5300/src/main.rs
+++ b/examples/use_rust/hpm5300/src/main.rs
@@ -17,7 +17,7 @@ use hpm_hal::flash::Flash;
 use hpm_hal::{bind_interrupts, peripherals};
 use riscv_rt as _;
 use rmk::{
-    config::{KeyboardUsbConfig, RmkConfig, VialConfig},
+    config::{KeyboardConfig, KeyboardUsbConfig, RmkConfig, VialConfig},
     run_rmk,
 };
 use vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID};
@@ -50,12 +50,17 @@ async fn main(spawner: Spawner) {
 
     let vial_config = VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF);
 
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         usb_config: keyboard_usb_config,
         vial_config,
         ..Default::default()
     };
 
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     // Start serving
     run_rmk(
         input_pins,
diff --git a/examples/use_rust/nrf52832_ble/Cargo.lock b/examples/use_rust/nrf52832_ble/Cargo.lock
index fbca8855..59f963b1 100644
--- a/examples/use_rust/nrf52832_ble/Cargo.lock
+++ b/examples/use_rust/nrf52832_ble/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "atomic-polyfill"
 version = "1.0.3"
@@ -98,6 +113,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -135,6 +156,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -161,6 +196,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -193,6 +234,15 @@ dependencies = [
  "syn 2.0.95",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -736,6 +786,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -752,6 +825,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -921,6 +1004,12 @@ dependencies = [
  "defmt",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.16"
@@ -1060,7 +1149,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1080,6 +1171,7 @@ dependencies = [
  "nrf-softdevice",
  "num_enum",
  "once_cell",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1141,6 +1233,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1429,6 +1527,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.22"
diff --git a/examples/use_rust/nrf52832_ble/src/main.rs b/examples/use_rust/nrf52832_ble/src/main.rs
index c0ad7c2a..9974164e 100644
--- a/examples/use_rust/nrf52832_ble/src/main.rs
+++ b/examples/use_rust/nrf52832_ble/src/main.rs
@@ -16,7 +16,7 @@ use embassy_nrf::{
 };
 use panic_probe as _;
 use rmk::{
-    config::{KeyboardUsbConfig, RmkConfig, StorageConfig, VialConfig},
+    config::{KeyboardConfig, KeyboardUsbConfig, RmkConfig, StorageConfig, VialConfig},
     run_rmk,
 };
 
@@ -49,13 +49,18 @@ async fn main(spawner: Spawner) {
         num_sectors: 2,
         ..Default::default()
     };
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         usb_config: keyboard_usb_config,
         vial_config,
         storage_config,
         ..Default::default()
     };
 
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     run_rmk(
         input_pins,
         output_pins,
diff --git a/examples/use_rust/nrf52840/Cargo.lock b/examples/use_rust/nrf52840/Cargo.lock
index c2d88cb0..79c5faeb 100644
--- a/examples/use_rust/nrf52840/Cargo.lock
+++ b/examples/use_rust/nrf52840/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "atomic-polyfill"
 version = "1.0.3"
@@ -98,6 +113,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -135,6 +156,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -161,6 +196,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -194,6 +235,15 @@ dependencies = [
  "syn 2.0.95",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -737,6 +787,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -753,6 +826,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -912,6 +995,12 @@ dependencies = [
  "defmt",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.16"
@@ -1051,7 +1140,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1070,6 +1161,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1131,6 +1223,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1419,6 +1517,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.22"
diff --git a/examples/use_rust/nrf52840/src/main.rs b/examples/use_rust/nrf52840/src/main.rs
index f4d61717..7fa2c11c 100644
--- a/examples/use_rust/nrf52840/src/main.rs
+++ b/examples/use_rust/nrf52840/src/main.rs
@@ -19,7 +19,7 @@ use embassy_nrf::{
 };
 use panic_probe as _;
 use rmk::{
-    config::{RmkConfig, VialConfig},
+    config::{KeyboardConfig, RmkConfig, VialConfig},
     run_rmk,
 };
 use vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID};
@@ -52,12 +52,18 @@ async fn main(spawner: Spawner) {
     // Use internal flash to emulate eeprom
     let f = Nvmc::new(p.NVMC);
 
-    // Keyboard config
-    let keyboard_config = RmkConfig {
+    // RMK config
+    let rmk_config = RmkConfig {
         vial_config: VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF),
         ..Default::default()
     };
 
+    // Keyboard config
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     run_rmk(
         input_pins,
         output_pins,
diff --git a/examples/use_rust/nrf52840_ble/Cargo.lock b/examples/use_rust/nrf52840_ble/Cargo.lock
index 736dcd13..433d99d7 100644
--- a/examples/use_rust/nrf52840_ble/Cargo.lock
+++ b/examples/use_rust/nrf52840_ble/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "atomic-polyfill"
 version = "1.0.3"
@@ -98,6 +113,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -135,6 +156,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -161,6 +196,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -193,6 +234,15 @@ dependencies = [
  "syn 2.0.95",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -736,6 +786,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -752,6 +825,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -921,6 +1004,12 @@ dependencies = [
  "defmt",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.16"
@@ -1060,7 +1149,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1080,6 +1171,7 @@ dependencies = [
  "nrf-softdevice",
  "num_enum",
  "once_cell",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1142,6 +1234,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1430,6 +1528,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.22"
diff --git a/examples/use_rust/nrf52840_ble/src/main.rs b/examples/use_rust/nrf52840_ble/src/main.rs
index 23bc392c..db856665 100644
--- a/examples/use_rust/nrf52840_ble/src/main.rs
+++ b/examples/use_rust/nrf52840_ble/src/main.rs
@@ -20,10 +20,13 @@ use embassy_nrf::{
 use panic_probe as _;
 use rmk::{
     ble::SOFTWARE_VBUS,
-    config::{BleBatteryConfig, KeyboardUsbConfig, RmkConfig, StorageConfig, VialConfig},
+    channel::EVENT_CHANNEL,
+    config::{
+        BleBatteryConfig, KeyboardConfig, KeyboardUsbConfig, RmkConfig, StorageConfig, VialConfig,
+    },
     event::Event,
     input_device::{rotary_encoder::RotaryEncoder, InputDevice},
-    run_devices, run_rmk, CriticalSectionRawMutex, Sender, EVENT_CHANNEL, EVENT_CHANNEL_SIZE,
+    run_devices, run_rmk,
 };
 
 use vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID};
@@ -99,13 +102,18 @@ async fn main(spawner: Spawner) {
         num_sectors: 6,
         ..Default::default()
     };
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         usb_config: keyboard_usb_config,
         vial_config,
         ble_battery_config,
         storage_config,
         ..Default::default()
     };
+    // Keyboard config
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
 
     let mut my_device = MyDevice {};
     let pin_a = Input::new(AnyPin::from(p.P0_06), embassy_nrf::gpio::Pull::Up);
@@ -130,14 +138,13 @@ struct MyDevice {}
 impl InputDevice for MyDevice {
     async fn run(&mut self) {
         loop {
-            info!("Hi my device");
             embassy_time::Timer::after_secs(1).await;
         }
     }
 
     type EventType = Event;
 
-    fn event_sender(&self) -> Sender<CriticalSectionRawMutex, Self::EventType, EVENT_CHANNEL_SIZE> {
-        EVENT_CHANNEL.sender()
+    async fn send_event(&mut self, event: Self::EventType) {
+        EVENT_CHANNEL.sender().send(event).await
     }
 }
diff --git a/examples/use_rust/nrf52840_ble_split/Cargo.lock b/examples/use_rust/nrf52840_ble_split/Cargo.lock
index 736dcd13..433d99d7 100644
--- a/examples/use_rust/nrf52840_ble_split/Cargo.lock
+++ b/examples/use_rust/nrf52840_ble_split/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "atomic-polyfill"
 version = "1.0.3"
@@ -98,6 +113,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -135,6 +156,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -161,6 +196,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -193,6 +234,15 @@ dependencies = [
  "syn 2.0.95",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -736,6 +786,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -752,6 +825,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -921,6 +1004,12 @@ dependencies = [
  "defmt",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.16"
@@ -1060,7 +1149,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1080,6 +1171,7 @@ dependencies = [
  "nrf-softdevice",
  "num_enum",
  "once_cell",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1142,6 +1234,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1430,6 +1528,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.22"
diff --git a/examples/use_rust/nrf52840_ble_split/src/central.rs b/examples/use_rust/nrf52840_ble_split/src/central.rs
index 93c55142..521f4739 100644
--- a/examples/use_rust/nrf52840_ble_split/src/central.rs
+++ b/examples/use_rust/nrf52840_ble_split/src/central.rs
@@ -22,8 +22,10 @@ use embassy_nrf::{
 use panic_probe as _;
 use rmk::{
     ble::SOFTWARE_VBUS,
-    config::{BleBatteryConfig, KeyboardUsbConfig, RmkConfig, StorageConfig, VialConfig},
-    split::central::{run_peripheral_monitor, run_rmk_split_central},
+    config::{
+        BleBatteryConfig, KeyboardConfig, KeyboardUsbConfig, RmkConfig, StorageConfig, VialConfig,
+    },
+    split::central::{run_peripheral_manager, run_rmk_split_central},
 };
 
 use vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID};
@@ -99,7 +101,7 @@ async fn main(spawner: Spawner) {
         num_sectors: 6,
         ..Default::default()
     };
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         usb_config: keyboard_usb_config,
         vial_config,
         ble_battery_config,
@@ -107,6 +109,11 @@ async fn main(spawner: Spawner) {
         ..Default::default()
     };
 
+    let config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     let (input_pins, output_pins) =
         config_matrix_pins_nrf!(peripherals: p, input: [P0_12, P0_13], output:  [P0_14, P0_15]);
 
@@ -130,11 +137,11 @@ async fn main(spawner: Spawner) {
             output_pins,
             driver,
             &mut keymap::get_default_keymap(),
-            keyboard_config,
+            config,
             central_addr,
             spawner,
         ),
-        run_peripheral_monitor::<2, 1, 2, 2>(0, peripheral_addr),
+        run_peripheral_manager::<2, 1, 2, 2>(0, peripheral_addr),
     )
     .await;
 }
diff --git a/examples/use_rust/py32f07x/src/main.rs b/examples/use_rust/py32f07x/src/main.rs
index be0bad0a..ec31d436 100644
--- a/examples/use_rust/py32f07x/src/main.rs
+++ b/examples/use_rust/py32f07x/src/main.rs
@@ -20,7 +20,7 @@ use py32_hal::{
 // use py32_hal::flash::Blocking;
 use panic_probe as _;
 use rmk::{
-    config::{KeyboardUsbConfig, RmkConfig, VialConfig},
+    config::{KeyboardConfig, KeyboardUsbConfig, RmkConfig, VialConfig},
     run_rmk,
 };
 use vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID};
@@ -58,12 +58,18 @@ async fn main(spawner: Spawner) {
 
     let vial_config = VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF);
 
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         usb_config: keyboard_usb_config,
         vial_config,
         ..Default::default()
     };
 
+    // Keyboard config
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     // Start serving
     // Use `run_rmk` for blocking flash
     run_rmk(
diff --git a/examples/use_rust/rp2040/Cargo.lock b/examples/use_rust/rp2040/Cargo.lock
index 3774c159..d0a676d1 100644
--- a/examples/use_rust/rp2040/Cargo.lock
+++ b/examples/use_rust/rp2040/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "arrayvec"
 version = "0.7.6"
@@ -128,6 +143,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -165,6 +186,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -201,6 +236,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -242,6 +283,15 @@ dependencies = [
  "debug-helper",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -904,6 +954,29 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -940,6 +1013,16 @@ dependencies = [
  "either",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -1461,7 +1544,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1480,6 +1565,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum 0.7.3",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1970,6 +2056,64 @@ version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
 [[package]]
 name = "winapi"
 version = "0.3.9"
@@ -2001,6 +2145,15 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
 [[package]]
 name = "windows-sys"
 version = "0.52.0"
diff --git a/examples/use_rust/rp2040/src/main.rs b/examples/use_rust/rp2040/src/main.rs
index 1ff20ac4..24dfe773 100644
--- a/examples/use_rust/rp2040/src/main.rs
+++ b/examples/use_rust/rp2040/src/main.rs
@@ -20,7 +20,7 @@ use embassy_rp::{
 // use embassy_rp::flash::Blocking;
 use panic_probe as _;
 use rmk::{
-    config::{KeyboardUsbConfig, RmkConfig, VialConfig},
+    config::{KeyboardConfig, KeyboardUsbConfig, RmkConfig, VialConfig},
     run_rmk_with_async_flash,
 };
 use vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID};
@@ -58,12 +58,17 @@ async fn main(spawner: Spawner) {
 
     let vial_config = VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF);
 
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         usb_config: keyboard_usb_config,
         vial_config,
         ..Default::default()
     };
 
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     // Start serving
     // Use `run_rmk` for blocking flash
     run_rmk_with_async_flash(
diff --git a/examples/use_rust/rp2040_direct_pin/Cargo.lock b/examples/use_rust/rp2040_direct_pin/Cargo.lock
index 3774c159..d0a676d1 100644
--- a/examples/use_rust/rp2040_direct_pin/Cargo.lock
+++ b/examples/use_rust/rp2040_direct_pin/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "arrayvec"
 version = "0.7.6"
@@ -128,6 +143,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -165,6 +186,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -201,6 +236,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -242,6 +283,15 @@ dependencies = [
  "debug-helper",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -904,6 +954,29 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -940,6 +1013,16 @@ dependencies = [
  "either",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -1461,7 +1544,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1480,6 +1565,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum 0.7.3",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1970,6 +2056,64 @@ version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
 [[package]]
 name = "winapi"
 version = "0.3.9"
@@ -2001,6 +2145,15 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
 [[package]]
 name = "windows-sys"
 version = "0.52.0"
diff --git a/examples/use_rust/rp2040_direct_pin/src/main.rs b/examples/use_rust/rp2040_direct_pin/src/main.rs
index 735cdf95..e336603e 100644
--- a/examples/use_rust/rp2040_direct_pin/src/main.rs
+++ b/examples/use_rust/rp2040_direct_pin/src/main.rs
@@ -21,7 +21,7 @@ use embassy_rp::{
 use keymap::{COL, NUM_LAYER, ROW, SIZE};
 use panic_probe as _;
 use rmk::{
-    config::{KeyboardUsbConfig, RmkConfig, VialConfig},
+    config::{KeyboardConfig, KeyboardUsbConfig, RmkConfig, VialConfig},
     direct_pin::run_rmk_direct_pin_with_async_flash,
 };
 use vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID};
@@ -68,12 +68,17 @@ async fn main(spawner: Spawner) {
 
     let vial_config = VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF);
 
-    let keyboard_config: RmkConfig<'_, Output> = RmkConfig {
+    let rmk_config = RmkConfig {
         usb_config: keyboard_usb_config,
         vial_config,
         ..Default::default()
     };
 
+    let keyboard_config: KeyboardConfig<'_, Output> = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     // Start serving
     // Use `run_rmk_direct_pin` for blocking flash
     run_rmk_direct_pin_with_async_flash::<_, _, _, _, ROW, COL, SIZE, NUM_LAYER>(
diff --git a/examples/use_rust/rp2040_split/Cargo.lock b/examples/use_rust/rp2040_split/Cargo.lock
index 32918a0c..2748b47d 100644
--- a/examples/use_rust/rp2040_split/Cargo.lock
+++ b/examples/use_rust/rp2040_split/Cargo.lock
@@ -33,6 +33,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "arrayvec"
 version = "0.7.6"
@@ -128,6 +143,12 @@ version = "2.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -165,6 +186,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -201,6 +236,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -242,6 +283,15 @@ dependencies = [
  "debug-helper",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -904,6 +954,29 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc"
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -940,6 +1013,16 @@ dependencies = [
  "either",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -1461,7 +1544,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1480,6 +1565,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum 0.7.3",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1972,6 +2058,64 @@ version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.95",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
 [[package]]
 name = "winapi"
 version = "0.3.9"
@@ -2003,6 +2147,15 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
 [[package]]
 name = "windows-sys"
 version = "0.52.0"
diff --git a/examples/use_rust/rp2040_split/src/central.rs b/examples/use_rust/rp2040_split/src/central.rs
index f2871f91..22e3d977 100644
--- a/examples/use_rust/rp2040_split/src/central.rs
+++ b/examples/use_rust/rp2040_split/src/central.rs
@@ -23,9 +23,9 @@ use embassy_rp::{
 // use embassy_rp::flash::Blocking;
 use panic_probe as _;
 use rmk::{
-    config::{KeyboardUsbConfig, RmkConfig, VialConfig},
+    config::{KeyboardConfig, KeyboardUsbConfig, RmkConfig, VialConfig},
     split::{
-        central::{run_peripheral_monitor, run_rmk_split_central},
+        central::{run_peripheral_manager, run_rmk_split_central},
         SPLIT_MESSAGE_MAX_SIZE,
     },
 };
@@ -67,12 +67,17 @@ async fn main(spawner: Spawner) {
 
     let vial_config = VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF);
 
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         usb_config: keyboard_usb_config,
         vial_config,
         ..Default::default()
     };
 
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     static TX_BUF: StaticCell<[u8; SPLIT_MESSAGE_MAX_SIZE]> = StaticCell::new();
     let tx_buf = &mut TX_BUF.init([0; SPLIT_MESSAGE_MAX_SIZE])[..];
     static RX_BUF: StaticCell<[u8; SPLIT_MESSAGE_MAX_SIZE]> = StaticCell::new();
@@ -110,7 +115,7 @@ async fn main(spawner: Spawner) {
             keyboard_config,
             spawner,
         ),
-        run_peripheral_monitor::<2, 1, 2, 2, _>(0, uart_receiver),
+        run_peripheral_manager::<2, 1, 2, 2, _>(0, uart_receiver),
     )
     .await;
 }
diff --git a/examples/use_rust/rp2040_split/src/peripheral.rs b/examples/use_rust/rp2040_split/src/peripheral.rs
index 3fac3554..bc04adea 100644
--- a/examples/use_rust/rp2040_split/src/peripheral.rs
+++ b/examples/use_rust/rp2040_split/src/peripheral.rs
@@ -24,7 +24,7 @@ bind_interrupts!(struct Irqs {
 });
 
 #[embassy_executor::main]
-async fn main(_spawner: Spawner) {
+async fn main(spawner: Spawner) {
     info!("RMK start!");
     // Initialize peripherals
     let p = embassy_rp::init(Default::default());
@@ -52,6 +52,7 @@ async fn main(_spawner: Spawner) {
         input_pins,
         output_pins,
         uart_instance,
+        spawner,
     )
     .await;
 }
diff --git a/examples/use_rust/rp2350/.cargo/config.toml b/examples/use_rust/rp2350/.cargo/config.toml
index af0f6eeb..39458814 100644
--- a/examples/use_rust/rp2350/.cargo/config.toml
+++ b/examples/use_rust/rp2350/.cargo/config.toml
@@ -1,7 +1,9 @@
 [target.'cfg(all(target_arch = "arm", target_os = "none"))']
-runner = "probe-rs run --chip RP2350"
-#runner = "elf2uf2-rs -d"
-# runner = "picotool load -u -v -x -t elf"
+# runner = "probe-rs run --chip RP2350"
+# Need `cargo install elf2uf2-rs`
+# runner = "elf2uf2-rs -d"
+# Need `brew install picotool`
+runner = "picotool load -u -v -x -t elf"
 
 
 [build]
diff --git a/examples/use_rust/rp2350/Cargo.lock b/examples/use_rust/rp2350/Cargo.lock
index 4ddf96dc..b427bc63 100644
--- a/examples/use_rust/rp2350/Cargo.lock
+++ b/examples/use_rust/rp2350/Cargo.lock
@@ -497,9 +497,9 @@ dependencies = [
 
 [[package]]
 name = "embassy-nrf"
-version = "0.3.0"
+version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5a32ea116dc9f2e0ce5a5ec10d11e6da91114eff533e5afe144986ac823f735"
+checksum = "6d7494efe1e0183568327c7e681d4b77ed5241921dcb5976426d9a65b65a0c81"
 dependencies = [
  "bitflags 2.6.0",
  "cfg-if",
@@ -559,6 +559,7 @@ dependencies = [
  "pio",
  "pio-proc",
  "rand_core",
+ "rp-binary-info",
  "rp-pac",
  "rp2040-boot2",
  "sha2-const-stable",
@@ -618,9 +619,9 @@ dependencies = [
 
 [[package]]
 name = "embassy-usb"
-version = "0.3.0"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d0b882133fa684b9d4652351cd7aac5afe8a2c2bf4a7da59f442ff61087cda2"
+checksum = "6e651b9b7b47b514e6e6d1940a6e2e300891a2c33641917130643602a0cb6386"
 dependencies = [
  "defmt",
  "embassy-futures",
@@ -1457,7 +1458,7 @@ dependencies = [
 
 [[package]]
 name = "rmk"
-version = "0.5.1"
+version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
@@ -1480,6 +1481,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum 0.7.3",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1491,7 +1493,7 @@ dependencies = [
 
 [[package]]
 name = "rmk-macro"
-version = "0.4.1"
+version = "0.4.2"
 dependencies = [
  "cargo_toml",
  "darling 0.20.10",
@@ -1523,6 +1525,12 @@ dependencies = [
  "xz2",
 ]
 
+[[package]]
+name = "rp-binary-info"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "534e2a451671116f5b9391cb15fae43b9abdc56817bcaca9a95ed32c3e4c6b38"
+
 [[package]]
 name = "rp-pac"
 version = "7.0.0"
diff --git a/examples/use_rust/rp2350/Cargo.toml b/examples/use_rust/rp2350/Cargo.toml
index a993f230..7e21377b 100644
--- a/examples/use_rust/rp2350/Cargo.toml
+++ b/examples/use_rust/rp2350/Cargo.toml
@@ -15,6 +15,7 @@ embassy-time = { version = "0.4", features = ["defmt"] }
 embassy-rp = { version = "0.3", features = [
     "rp235xa",
     "defmt",
+    "binary-info",
     "time-driver",
     "critical-section-impl",
 ] }
diff --git a/examples/use_rust/rp2350/src/main.rs b/examples/use_rust/rp2350/src/main.rs
index 1ff20ac4..9aa72e00 100644
--- a/examples/use_rust/rp2350/src/main.rs
+++ b/examples/use_rust/rp2350/src/main.rs
@@ -10,17 +10,18 @@ mod vial;
 use defmt::*;
 use defmt_rtt as _;
 use embassy_executor::Spawner;
+// use embassy_rp::flash::Blocking;
 use embassy_rp::{
     bind_interrupts,
+    block::ImageDef,
     flash::{Async, Flash},
     gpio::{AnyPin, Input, Output},
     peripherals::USB,
     usb::{Driver, InterruptHandler},
 };
-// use embassy_rp::flash::Blocking;
 use panic_probe as _;
 use rmk::{
-    config::{KeyboardUsbConfig, RmkConfig, VialConfig},
+    config::{KeyboardConfig, KeyboardUsbConfig, RmkConfig, VialConfig},
     run_rmk_with_async_flash,
 };
 use vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID};
@@ -29,6 +30,23 @@ bind_interrupts!(struct Irqs {
     USBCTRL_IRQ => InterruptHandler<USB>;
 });
 
+#[link_section = ".start_block"]
+#[used]
+pub static IMAGE_DEF: ImageDef = ImageDef::secure_exe();
+
+// Program metadata for `picotool info`.
+// This isn't needed, but it's recomended to have these minimal entries.
+#[link_section = ".bi_entries"]
+#[used]
+pub static PICOTOOL_ENTRIES: [embassy_rp::binary_info::EntryAddr; 4] = [
+    embassy_rp::binary_info::rp_program_name!(c"RMK Example"),
+    embassy_rp::binary_info::rp_program_description!(
+        c"This example tests the RMK for RP Pico board"
+    ),
+    embassy_rp::binary_info::rp_cargo_version!(),
+    embassy_rp::binary_info::rp_program_build_attribute!(),
+];
+
 const FLASH_SIZE: usize = 2 * 1024 * 1024;
 
 #[embassy_executor::main]
@@ -58,14 +76,20 @@ async fn main(spawner: Spawner) {
 
     let vial_config = VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF);
 
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         usb_config: keyboard_usb_config,
         vial_config,
         ..Default::default()
     };
 
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     // Start serving
     // Use `run_rmk` for blocking flash
+    // rmk::run_rmk(
     run_rmk_with_async_flash(
         input_pins,
         output_pins,
diff --git a/examples/use_rust/stm32f1/Cargo.lock b/examples/use_rust/stm32f1/Cargo.lock
index a696719f..cbbcda67 100644
--- a/examples/use_rust/stm32f1/Cargo.lock
+++ b/examples/use_rust/stm32f1/Cargo.lock
@@ -42,6 +42,21 @@ dependencies = [
  "as-slice",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "as-slice"
 version = "0.2.1"
@@ -131,6 +146,12 @@ dependencies = [
  "aligned",
 ]
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -168,6 +189,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -194,6 +229,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -227,6 +268,15 @@ dependencies = [
  "syn 2.0.90",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -840,6 +890,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -856,6 +929,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -1011,6 +1094,12 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a513e167849a384b7f9b746e517604398518590a9142f4846a32e3c2a4de7b11"
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.15"
@@ -1150,7 +1239,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1169,6 +1260,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1229,6 +1321,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1548,6 +1646,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.20"
diff --git a/examples/use_rust/stm32f1/src/main.rs b/examples/use_rust/stm32f1/src/main.rs
index 4a4885e8..efa0ce38 100644
--- a/examples/use_rust/stm32f1/src/main.rs
+++ b/examples/use_rust/stm32f1/src/main.rs
@@ -18,7 +18,7 @@ use embassy_stm32::{
 };
 use panic_halt as _;
 use rmk::{
-    config::{RmkConfig, VialConfig},
+    config::{KeyboardConfig, RmkConfig, VialConfig},
     run_rmk,
 };
 use vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID};
@@ -56,11 +56,17 @@ async fn main(spawner: Spawner) {
     let f = Flash::new_blocking(p.FLASH);
 
     // Keyboard config
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         vial_config: VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF),
         ..Default::default()
     };
 
+    // Keyboard config
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     // Start serving
     run_rmk(
         input_pins,
diff --git a/examples/use_rust/stm32f4/Cargo.lock b/examples/use_rust/stm32f4/Cargo.lock
index 6f364750..83f8933a 100644
--- a/examples/use_rust/stm32f4/Cargo.lock
+++ b/examples/use_rust/stm32f4/Cargo.lock
@@ -42,6 +42,21 @@ dependencies = [
  "as-slice",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "as-slice"
 version = "0.2.1"
@@ -131,6 +146,12 @@ dependencies = [
  "aligned",
 ]
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -168,6 +189,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -194,6 +229,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -227,6 +268,15 @@ dependencies = [
  "syn 2.0.90",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -850,6 +900,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -866,6 +939,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -1025,6 +1108,12 @@ dependencies = [
  "defmt",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.15"
@@ -1164,7 +1253,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1183,6 +1274,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1245,6 +1337,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1564,6 +1662,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.20"
diff --git a/examples/use_rust/stm32f4/src/main.rs b/examples/use_rust/stm32f4/src/main.rs
index 0c2d4489..dc200260 100644
--- a/examples/use_rust/stm32f4/src/main.rs
+++ b/examples/use_rust/stm32f4/src/main.rs
@@ -19,7 +19,7 @@ use embassy_stm32::{
 };
 use panic_probe as _;
 use rmk::{
-    config::{RmkConfig, VialConfig},
+    config::{KeyboardConfig, RmkConfig, VialConfig},
     run_rmk,
 };
 use static_cell::StaticCell;
@@ -58,11 +58,17 @@ async fn main(spawner: Spawner) {
     let f = Flash::new_blocking(p.FLASH);
 
     // Keyboard config
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         vial_config: VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF),
         ..Default::default()
     };
 
+    // Keyboard config
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     // Start serving
     run_rmk(
         input_pins,
diff --git a/examples/use_rust/stm32h7/Cargo.lock b/examples/use_rust/stm32h7/Cargo.lock
index 8e2d1ef9..d973a121 100644
--- a/examples/use_rust/stm32h7/Cargo.lock
+++ b/examples/use_rust/stm32h7/Cargo.lock
@@ -42,6 +42,21 @@ dependencies = [
  "as-slice",
 ]
 
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
 [[package]]
 name = "as-slice"
 version = "0.2.1"
@@ -131,6 +146,12 @@ dependencies = [
  "aligned",
 ]
 
+[[package]]
+name = "bumpalo"
+version = "3.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
 [[package]]
 name = "bytemuck"
 version = "1.21.0"
@@ -168,6 +189,20 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
+[[package]]
+name = "chrono"
+version = "0.4.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
 [[package]]
 name = "cobs"
 version = "0.2.3"
@@ -194,6 +229,12 @@ dependencies = [
  "syn 1.0.109",
 ]
 
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
 [[package]]
 name = "cortex-m"
 version = "0.7.7"
@@ -227,6 +268,15 @@ dependencies = [
  "syn 2.0.90",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
+dependencies = [
+ "cfg-if",
+]
+
 [[package]]
 name = "critical-section"
 version = "1.2.0"
@@ -850,6 +900,29 @@ dependencies = [
  "stable_deref_trait",
 ]
 
+[[package]]
+name = "iana-time-zone"
+version = "0.1.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
 [[package]]
 name = "ident_case"
 version = "1.0.1"
@@ -866,6 +939,16 @@ dependencies = [
  "hashbrown 0.15.2",
 ]
 
+[[package]]
+name = "js-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "json"
 version = "0.12.4"
@@ -1025,6 +1108,12 @@ dependencies = [
  "defmt",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
 [[package]]
 name = "pin-project-lite"
 version = "0.2.15"
@@ -1164,7 +1253,9 @@ version = "0.5.2"
 dependencies = [
  "bitfield-struct",
  "byteorder",
+ "chrono",
  "cortex-m",
+ "crc32fast",
  "defmt",
  "document-features",
  "embassy-embedded-hal",
@@ -1183,6 +1274,7 @@ dependencies = [
  "heapless 0.8.0",
  "nrf-softdevice",
  "num_enum",
+ "paste",
  "postcard",
  "rmk-macro",
  "sequential-storage",
@@ -1245,6 +1337,12 @@ dependencies = [
  "semver 1.0.24",
 ]
 
+[[package]]
+name = "rustversion"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
+
 [[package]]
 name = "scopeguard"
 version = "1.2.0"
@@ -1564,6 +1662,137 @@ dependencies = [
  "vcell",
 ]
 
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
+dependencies = [
+ "bumpalo",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
 [[package]]
 name = "winnow"
 version = "0.6.20"
diff --git a/examples/use_rust/stm32h7/src/main.rs b/examples/use_rust/stm32h7/src/main.rs
index f8b0902b..5090d9fe 100644
--- a/examples/use_rust/stm32h7/src/main.rs
+++ b/examples/use_rust/stm32h7/src/main.rs
@@ -22,7 +22,7 @@ use embassy_stm32::{
 };
 use panic_probe as _;
 use rmk::{
-    config::{RmkConfig, VialConfig},
+    config::{KeyboardConfig, RmkConfig, VialConfig},
     run_rmk,
 };
 use static_cell::StaticCell;
@@ -99,11 +99,17 @@ async fn main(spawner: Spawner) {
 
     let vial_config = VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF);
 
-    let keyboard_config = RmkConfig {
+    let rmk_config = RmkConfig {
         vial_config,
         ..Default::default()
     };
 
+    // Keyboard config
+    let keyboard_config = KeyboardConfig {
+        rmk_config,
+        ..Default::default()
+    };
+
     // Start serving
     run_rmk(
         input_pins,
diff --git a/rmk-macro/src/behavior.rs b/rmk-macro/src/behavior.rs
index 03069aa7..b3178dcb 100644
--- a/rmk-macro/src/behavior.rs
+++ b/rmk-macro/src/behavior.rs
@@ -3,8 +3,8 @@
 
 use crate::config::{CombosConfig, OneShotConfig, TapHoldConfig, TriLayerConfig};
 use crate::keyboard_config::KeyboardConfig;
-use quote::quote;
 use crate::layout::parse_key;
+use quote::quote;
 
 fn expand_tri_layer(tri_layer: &Option<TriLayerConfig>) -> proc_macro2::TokenStream {
     match tri_layer {
diff --git a/rmk-macro/src/default_config/esp32.rs b/rmk-macro/src/default_config/esp32.rs
index 1a2a48be..4b35154b 100644
--- a/rmk-macro/src/default_config/esp32.rs
+++ b/rmk-macro/src/default_config/esp32.rs
@@ -15,7 +15,7 @@ pub(crate) fn default_esp32(chip: ChipModel) -> KeyboardConfig {
         }),
         storage: StorageConfig {
             start_addr: Some(0),
-            num_sectors: Some(32),
+            num_sectors: Some(16),
             enabled: true,
             ..Default::default()
         },
diff --git a/rmk-macro/src/keyboard.rs b/rmk-macro/src/keyboard.rs
index 61130b44..bd5ba4d9 100644
--- a/rmk-macro/src/keyboard.rs
+++ b/rmk-macro/src/keyboard.rs
@@ -99,7 +99,6 @@ pub(crate) fn gen_imports(config: &KeyboardConfig) -> TokenStream2 {
         }
     };
 
-    // TODO: remove static var?
     quote! {
         #imports
 
@@ -167,16 +166,25 @@ fn expand_main(
             #ble_config
 
             // Set all keyboard config
-            let keyboard_config = ::rmk::config::RmkConfig {
+            let rmk_config = ::rmk::config::RmkConfig {
                 usb_config: KEYBOARD_USB_CONFIG,
                 vial_config: VIAL_CONFIG,
-                light_config,
                 storage_config,
                 behavior_config,
                 #set_ble_config
                 ..Default::default()
             };
 
+            let controller_config = ::rmk::config::ControllerConfig {
+                light_config,
+            };
+
+            let keyboard_config = ::rmk::config::KeyboardConfig {
+                rmk_config,
+                controller_config,
+                ..Default::default()
+            };
+
             // Start serving
             #run_rmk
         }
diff --git a/rmk-macro/src/layout.rs b/rmk-macro/src/layout.rs
index b6930766..be042d05 100644
--- a/rmk-macro/src/layout.rs
+++ b/rmk-macro/src/layout.rs
@@ -13,7 +13,7 @@ pub(crate) fn expand_layout_init(keyboard_config: &KeyboardConfig) -> TokenStrea
         layers.push(expand_layer(layer));
     }
     return quote! {
-        pub fn get_default_keymap() -> [[[::rmk::action::KeyAction; COL]; ROW]; NUM_LAYER] {
+        pub const fn get_default_keymap() -> [[[::rmk::action::KeyAction; COL]; ROW]; NUM_LAYER] {
             [#(#layers), *]
         }
     };
diff --git a/rmk-macro/src/split/central.rs b/rmk-macro/src/split/central.rs
index ef8c5afe..460de044 100644
--- a/rmk-macro/src/split/central.rs
+++ b/rmk-macro/src/split/central.rs
@@ -173,16 +173,25 @@ fn expand_split_central(
             #ble_config
 
             // Set all keyboard config
-            let keyboard_config = ::rmk::config::RmkConfig {
+            let rmk_config = ::rmk::config::RmkConfig {
                 usb_config: KEYBOARD_USB_CONFIG,
                 vial_config: VIAL_CONFIG,
-                light_config,
                 storage_config,
                 behavior_config,
                 #set_ble_config
                 ..Default::default()
             };
 
+            let controller_config = ::rmk::config::ControllerConfig {
+                light_config,
+            };
+
+            let keyboard_config = ::rmk::config::KeyboardConfig {
+                rmk_config,
+                controller_config,
+                ..Default::default()
+            };
+
             #split_communication_config
 
             // Start serving
@@ -258,7 +267,7 @@ fn expand_split_central_entry(
                     let uart_instance = format_ident!("{}", central_serials.get(idx).expect("No or not enough serial defined for peripheral in central").instance.to_lowercase());
 
                     tasks.push(quote! {
-                        ::rmk::split::central::run_peripheral_monitor::<#row, #col, #row_offset, #col_offset, _>(
+                        ::rmk::split::central::run_peripheral_manager::<#row, #col, #row_offset, #col_offset, _>(
                             #idx,
                             #uart_instance,
                         )
@@ -312,7 +321,7 @@ fn expand_split_central_entry(
                 let col_offset = p.col_offset ;
                 let peripheral_ble_addr = p.ble_addr.expect("No ble_addr defined for peripheral");
                 tasks.push(quote! {
-                    ::rmk::split::central::run_peripheral_monitor::<#row, #col, #row_offset, #col_offset>(
+                    ::rmk::split::central::run_peripheral_manager::<#row, #col, #row_offset, #col_offset>(
                         #idx,
                         [#(#peripheral_ble_addr), *],
                     )
@@ -374,7 +383,7 @@ fn expand_split_central_entry(
                     let uart_instance = format_ident!("{}", central_serials.get(idx).expect("No or not enough serial defined for peripheral in central").instance.to_lowercase());
 
                     tasks.push(quote! {
-                        ::rmk::split::central::run_peripheral_monitor::<#row, #col, #row_offset, #col_offset, _>(
+                        ::rmk::split::central::run_peripheral_manager::<#row, #col, #row_offset, #col_offset, _>(
                             #idx,
                             #uart_instance,
                         )
diff --git a/rmk-macro/src/split/peripheral.rs b/rmk-macro/src/split/peripheral.rs
index 90b351b4..79386cf8 100644
--- a/rmk-macro/src/split/peripheral.rs
+++ b/rmk-macro/src/split/peripheral.rs
@@ -231,7 +231,7 @@ fn expand_split_peripheral_entry(
                         _,
                         #row,
                         #col,
-                    >(input_pins, output_pins, #uart_instance).await;
+                    >(input_pins, output_pins, #uart_instance, spawner).await;
                 },
                 MatrixType::direct_pin => quote! {
                     ::rmk::split::peripheral::run_rmk_split_peripheral_direct_pin::<
@@ -240,7 +240,7 @@ fn expand_split_peripheral_entry(
                         _,
                         #row,
                         #col,
-                    >(direct_pins, #uart_instance).await;
+                    >(direct_pins, #uart_instance, spawner).await;
                 },
             };
             quote! {
diff --git a/rmk/Cargo.toml b/rmk/Cargo.toml
index 7a403109..5b118304 100644
--- a/rmk/Cargo.toml
+++ b/rmk/Cargo.toml
@@ -43,6 +43,10 @@ sequential-storage = { version = "4.0.0" }
 serde = { version = "1", default-features = false, features = ["derive"] }
 postcard = { version = "1", features = ["experimental-derive"] }
 
+# Used in macro
+paste = "1"
+
+
 # Optional dependencies
 # nRF dependencies
 once_cell = { version = "1.19", features = [
@@ -63,7 +67,10 @@ embassy-nrf = { version = "0.3.1", features = [
 
 # Espressif dependencies
 esp32-nimble = { version = "0.10", optional = true }
-esp-idf-svc = { version = "0.51", default-features = false, optional = true }
+esp-idf-svc = { version = "0.51", default-features = false, features = [
+    "embedded-storage",
+    "experimental",
+], optional = true }
 
 # RP2040 dependencies
 embassy-rp = { version = "0.3", optional = true }
diff --git a/rmk/build.rs b/rmk/build.rs
index 5d3f95ed..0a2b93d4 100644
--- a/rmk/build.rs
+++ b/rmk/build.rs
@@ -1,9 +1,16 @@
+#[path = "./build_common.rs"]
+mod common;
+
 use std::env;
 use std::fs;
 use std::path::Path;
 use std::process::Command;
 
 fn main() {
+    // Set the compilation config
+    let mut cfgs = common::CfgSet::new();
+    common::set_target_cfgs(&mut cfgs);
+
     // Ensure build.rs is re-run if files change
     // println!("cargo:rerun-if-changed=NEVER_EXISTS");
     println!("cargo:rerun-if-changed=.git/HEAD");
@@ -39,5 +46,4 @@ fn main() {
     let out_dir = env::var("OUT_DIR").unwrap();
     let dest_path = Path::new(&out_dir).join("constants.rs");
     fs::write(&dest_path, contents).expect("Failed to write build identifier");
-
-}
\ No newline at end of file
+}
diff --git a/rmk/build_common.rs b/rmk/build_common.rs
new file mode 100644
index 00000000..4f24e6d3
--- /dev/null
+++ b/rmk/build_common.rs
@@ -0,0 +1,94 @@
+// NOTE: this file is copy-pasted between several Embassy crates, because there is no
+// straightforward way to share this code:
+// - it cannot be placed into the root of the repo and linked from each build.rs using `#[path =
+// "../build_common.rs"]`, because `cargo publish` requires that all files published with a crate
+// reside in the crate's directory,
+// - it cannot be symlinked from `embassy-xxx/build_common.rs` to `../build_common.rs`, because
+// symlinks don't work on Windows.
+
+use std::collections::HashSet;
+use std::env;
+
+/// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring
+/// them (`cargo:rust-check-cfg=cfg(X)`).
+#[derive(Debug)]
+pub struct CfgSet {
+    enabled: HashSet<String>,
+    declared: HashSet<String>,
+}
+
+impl CfgSet {
+    pub fn new() -> Self {
+        Self {
+            enabled: HashSet::new(),
+            declared: HashSet::new(),
+        }
+    }
+
+    /// Enable a config, which can then be used in `#[cfg(...)]` for conditional compilation.
+    ///
+    /// All configs that can potentially be enabled should be unconditionally declared using
+    /// [`Self::declare()`].
+    pub fn enable(&mut self, cfg: impl AsRef<str>) {
+        if self.enabled.insert(cfg.as_ref().to_owned()) {
+            println!("cargo:rustc-cfg={}", cfg.as_ref());
+        }
+    }
+
+    pub fn enable_all(&mut self, cfgs: &[impl AsRef<str>]) {
+        for cfg in cfgs.iter() {
+            self.enable(cfg.as_ref());
+        }
+    }
+
+    /// Declare a valid config for conditional compilation, without enabling it.
+    ///
+    /// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid.
+    pub fn declare(&mut self, cfg: impl AsRef<str>) {
+        if self.declared.insert(cfg.as_ref().to_owned()) {
+            println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref());
+        }
+    }
+
+    pub fn declare_all(&mut self, cfgs: &[impl AsRef<str>]) {
+        for cfg in cfgs.iter() {
+            self.declare(cfg.as_ref());
+        }
+    }
+
+    pub fn set(&mut self, cfg: impl Into<String>, enable: bool) {
+        let cfg = cfg.into();
+        if enable {
+            self.enable(cfg.clone());
+        }
+        self.declare(cfg);
+    }
+}
+
+/// Sets configs that describe the target platform.
+pub fn set_target_cfgs(cfgs: &mut CfgSet) {
+    let target = env::var("TARGET").unwrap();
+
+    if target.starts_with("thumbv6m-") {
+        cfgs.enable_all(&["cortex_m", "armv6m"]);
+    } else if target.starts_with("thumbv7m-") {
+        cfgs.enable_all(&["cortex_m", "armv7m"]);
+    } else if target.starts_with("thumbv7em-") {
+        cfgs.enable_all(&["cortex_m", "armv7m", "armv7em"]);
+    } else if target.starts_with("thumbv8m.base") {
+        cfgs.enable_all(&["cortex_m", "armv8m", "armv8m_base"]);
+    } else if target.starts_with("thumbv8m.main") {
+        cfgs.enable_all(&["cortex_m", "armv8m", "armv8m_main"]);
+    }
+    cfgs.declare_all(&[
+        "cortex_m",
+        "armv6m",
+        "armv7m",
+        "armv7em",
+        "armv8m",
+        "armv8m_base",
+        "armv8m_main",
+    ]);
+
+    cfgs.set("has_fpu", target.ends_with("-eabihf"));
+}
diff --git a/rmk/src/ble/esp/mod.rs b/rmk/src/ble/esp/mod.rs
index cb718229..0e38416b 100644
--- a/rmk/src/ble/esp/mod.rs
+++ b/rmk/src/ble/esp/mod.rs
@@ -1,26 +1,16 @@
 pub(crate) mod server;
 
-use self::server::{BleServer, VialReaderWriter};
-use crate::config::StorageConfig;
-use crate::keyboard::KEYBOARD_REPORT_CHANNEL;
+use self::server::BleServer;
+use crate::channel::VIAL_READ_CHANNEL;
+use crate::config::RmkConfig;
+use crate::light::LightController;
 use crate::matrix::MatrixTrait;
-use crate::storage::nor_flash::esp_partition::{Partition, PartitionType};
 use crate::storage::Storage;
-use crate::via::process::VialService;
-use crate::via::vial_task;
-use crate::CONNECTION_STATE;
-use crate::KEYBOARD_STATE;
-use crate::{
-    action::KeyAction, ble::ble_communication_task, config::RmkConfig, keyboard::Keyboard,
-    keymap::KeyMap,
-};
+use crate::{keyboard::Keyboard, keymap::KeyMap};
+use crate::{run_keyboard, CONNECTION_STATE};
 use core::cell::RefCell;
-use embassy_futures::select::{select, select4};
-use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, channel::Channel};
 use embedded_hal::digital::OutputPin;
-use embedded_storage_async::nor_flash::ReadNorFlash;
-use esp_idf_svc::hal::task::block_on;
-use futures::pin_mut;
+use embedded_storage_async::nor_flash::NorFlash as AsyncNorFlash;
 
 /// Initialize and run the BLE keyboard service, with given keyboard usb config.
 /// Can only be used on nrf52 series microcontrollers with `nrf-softdevice` crate.
@@ -34,54 +24,28 @@ use futures::pin_mut;
 /// * `output_pins` - output gpio pins
 /// * `keyboard_config` - other configurations of the keyboard, check [RmkConfig] struct for details
 /// * `spawner` - embassy task spawner, used to spawn nrf_softdevice background task
-pub async fn initialize_esp_ble_keyboard_with_config_and_run<
+// TODO: add usb service for other chips of esp32 which have USB device
+pub(crate) async fn run_esp_ble_keyboard<
+    'a,
     M: MatrixTrait,
+    F: AsyncNorFlash,
     Out: OutputPin,
     const ROW: usize,
     const COL: usize,
     const NUM_LAYER: usize,
 >(
-    mut matrix: M,
-    default_keymap: &mut [[[KeyAction; COL]; ROW]; NUM_LAYER],
-
-    keyboard_config: RmkConfig<'static, Out>,
+    keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
+    keyboard: &mut Keyboard<'a, ROW, COL, NUM_LAYER>,
+    matrix: &mut M,
+    storage: &mut Storage<F, ROW, COL, NUM_LAYER>,
+    light_controller: &mut LightController<Out>,
+    rmk_config: RmkConfig<'static>,
 ) -> ! {
-    let f = Partition::new(PartitionType::Custom, Some(c"rmk"));
-    let num_sectors = (f.capacity() / Partition::SECTOR_SIZE) as u8;
-    let mut storage = Storage::new(
-        f,
-        &default_keymap,
-        StorageConfig {
-            start_addr: 0,
-            num_sectors,
-            ..Default::default()
-        },
-    )
-    .await;
-
-    let keymap = RefCell::new(
-        KeyMap::new_from_storage(
-            default_keymap,
-            Some(&mut storage),
-            keyboard_config.behavior_config,
-        )
-        .await,
-    );
-
-    let keyboard_report_sender = KEYBOARD_REPORT_CHANNEL.sender();
-    let keyboard_report_receiver = KEYBOARD_REPORT_CHANNEL.receiver();
-
-    let mut keyboard = Keyboard::new(&keymap, &keyboard_report_sender);
     // esp32c3 doesn't have USB device, so there is no usb here
-    // TODO: add usb service for other chips of esp32 which have USB device
-
-    static via_output: Channel<CriticalSectionRawMutex, [u8; 32], 2> = Channel::new();
-    let mut vial_service = VialService::new(&keymap, keyboard_config.vial_config);
     loop {
-        KEYBOARD_STATE.store(false, core::sync::atomic::Ordering::Release);
         CONNECTION_STATE.store(false, core::sync::atomic::Ordering::Release);
         info!("Advertising..");
-        let mut ble_server = BleServer::new(keyboard_config.usb_config);
+        let mut ble_server = BleServer::new(rmk_config.usb_config);
         ble_server.output_keyboard.lock().on_write(|args| {
             let data: &[u8] = args.recv_data();
             debug!("output_keyboard {}, {}", data.len(), data[0]);
@@ -94,46 +58,23 @@ pub async fn initialize_esp_ble_keyboard_with_config_and_run<
         CONNECTION_STATE.store(true, core::sync::atomic::Ordering::Release);
 
         // Create BLE HID writers
-        let mut keyboard_writer = ble_server.input_keyboard;
-        let mut media_writer = ble_server.input_media_keys;
-        let mut system_writer = ble_server.input_system_keys;
-        let mut mouse_writer = ble_server.input_mouse_keys;
+        let keyboard_writer = ble_server.get_keyboard_writer();
+        let vial_reader_writer = ble_server.get_vial_reader_writer();
+        let led_reader = ble_server.get_led_reader();
 
         let disconnect = BleServer::wait_for_disconnection(ble_server.server);
 
-        let keyboard_fut = keyboard.run();
-        let ble_fut = ble_communication_task(
-            &keyboard_report_receiver,
-            &mut keyboard_writer,
-            &mut media_writer,
-            &mut system_writer,
-            &mut mouse_writer,
-        );
-
-        ble_server.output_vial.lock().on_write(|args| {
-            let data: &[u8] = args.recv_data();
-            debug!("BLE received {} {=[u8]:#X}", data.len(), data);
-            block_on(via_output.send(unsafe { *(data.as_ptr() as *const [u8; 32]) }));
-        });
-        let mut via_rw = VialReaderWriter {
-            receiver: via_output.receiver(),
-            hid_writer: ble_server.input_vial,
-        };
-        let via_fut = vial_task(&mut via_rw, &mut vial_service);
-        let matrix_fut = matrix.run();
-        let storage_fut = storage.run();
-        pin_mut!(storage_fut);
-        pin_mut!(via_fut);
-        pin_mut!(keyboard_fut);
-        pin_mut!(disconnect);
-        pin_mut!(ble_fut);
-        pin_mut!(matrix_fut);
-
-        select4(
-            select(storage_fut, keyboard_fut),
-            select(disconnect, matrix_fut),
-            ble_fut,
-            via_fut,
+        run_keyboard(
+            keymap,
+            keyboard,
+            matrix,
+            storage,
+            disconnect,
+            light_controller,
+            led_reader,
+            vial_reader_writer,
+            keyboard_writer,
+            rmk_config.vial_config,
         )
         .await;
 
diff --git a/rmk/src/ble/esp/server.rs b/rmk/src/ble/esp/server.rs
index 3299131f..87f957a9 100644
--- a/rmk/src/ble/esp/server.rs
+++ b/rmk/src/ble/esp/server.rs
@@ -1,73 +1,145 @@
 extern crate alloc;
 use alloc::sync::Arc;
 use embassy_futures::block_on;
-use embassy_sync::{blocking_mutex::raw::RawMutex, channel::Receiver};
 use embassy_time::Timer;
 use esp32_nimble::{
     enums::{AuthReq, SecurityIOCap},
     utilities::{mutex::Mutex, BleUuid},
     BLEAdvertisementData, BLECharacteristic, BLEDevice, BLEHIDDevice, BLEServer, NimbleProperties,
 };
-use usbd_hid::descriptor::{AsInputReport, SerializedDescriptor as _};
+use ssmarshal::serialize;
+use usbd_hid::descriptor::SerializedDescriptor as _;
 
 use crate::{
     ble::{
-        as_bytes,
         descriptor::{BleCompositeReportType, BleKeyboardReport},
         device_info::VidSource,
+        led::BleLedReader,
     },
+    channel::{KEYBOARD_REPORT_CHANNEL, LED_SIGNAL},
     config::KeyboardUsbConfig,
-    hid::{ConnectionType, ConnectionTypeWrapper, HidError, HidReaderWrapper, HidWriterWrapper},
+    hid::{HidError, HidReaderTrait, HidWriterTrait, Report, RunnableHidWriter},
+    light::LedIndicator,
     usb::descriptor::ViaReport,
+    CONNECTION_STATE,
 };
 
-type BleHidWriter = Arc<Mutex<BLECharacteristic>>;
-type BleHidReader = Arc<Mutex<BLECharacteristic>>;
+use super::VIAL_READ_CHANNEL;
 
-impl ConnectionTypeWrapper for BleHidWriter {
-    fn get_conn_type(&self) -> ConnectionType {
-        ConnectionType::Ble
+pub(crate) struct BleKeyboardWriter {
+    pub(crate) keyboard_handle: Arc<Mutex<BLECharacteristic>>,
+    pub(crate) media_handle: Arc<Mutex<BLECharacteristic>>,
+    pub(crate) system_control_handle: Arc<Mutex<BLECharacteristic>>,
+    pub(crate) mouse_handle: Arc<Mutex<BLECharacteristic>>,
+}
+
+impl RunnableHidWriter for BleKeyboardWriter {
+    async fn get_report(&mut self) -> Self::ReportType {
+        KEYBOARD_REPORT_CHANNEL.receive().await
     }
 }
 
-impl HidWriterWrapper for BleHidWriter {
-    async fn write_serialize<IR: AsInputReport>(&mut self, r: &IR) -> Result<(), HidError> {
-        use ssmarshal::serialize;
-        let mut buf: [u8; 32] = [0; 32];
-        match serialize(&mut buf, r) {
-            Ok(n) => self.write(&buf[0..n]).await,
-            Err(_) => Err(HidError::ReportSerializeError),
+impl HidWriterTrait for BleKeyboardWriter {
+    type ReportType = Report;
+
+    async fn write_report(&mut self, report: Self::ReportType) -> Result<usize, HidError> {
+        match report {
+            Report::KeyboardReport(keyboard_report) => {
+                debug!("Writing keyboard report {}", keyboard_report);
+                let mut buf = [0u8; 8];
+                let n = serialize(&mut buf, &keyboard_report)
+                    .map_err(|_| HidError::ReportSerializeError)?;
+                self.write(&self.keyboard_handle, &buf).await?;
+                Ok(n)
+            }
+            Report::MouseReport(mouse_report) => {
+                let mut buf = [0u8; 5];
+                let n = serialize(&mut buf, &mouse_report)
+                    .map_err(|_| HidError::ReportSerializeError)?;
+                self.write(&self.mouse_handle, &buf).await?;
+                Ok(n)
+            }
+            Report::MediaKeyboardReport(media_keyboard_report) => {
+                let mut buf = [0u8; 2];
+                let n = serialize(&mut buf, &media_keyboard_report)
+                    .map_err(|_| HidError::ReportSerializeError)?;
+                self.write(&self.media_handle, &buf).await?;
+                Ok(n)
+            }
+            Report::SystemControlReport(system_control_report) => {
+                let mut buf = [0u8; 2];
+                let n = serialize(&mut buf, &system_control_report)
+                    .map_err(|_| HidError::ReportSerializeError)?;
+                self.write(&self.system_control_handle, &buf).await?;
+                Ok(n)
+            }
         }
     }
+}
 
-    async fn write(&mut self, report: &[u8]) -> Result<(), HidError> {
+impl BleKeyboardWriter {
+    async fn write(
+        &self,
+        handle: &Arc<Mutex<BLECharacteristic>>,
+        report: &[u8],
+    ) -> Result<(), HidError> {
         debug!("BLE notify {} {=[u8]:#X}", report.len(), report);
-        self.lock().set_value(report).notify();
+        handle.lock().set_value(report).notify();
         Timer::after_millis(7).await;
         Ok(())
     }
 }
 
-impl HidReaderWrapper for BleHidReader {
-    async fn read(&mut self, _buf: &mut [u8]) -> Result<usize, HidError> {
-        self.lock().on_read(|characteristic, _conn| {
-            let v = characteristic.value_mut();
-            info!("on_read!, {} {=[u8]:#X}", v.len(), v.as_slice());
-        });
-        Ok(1)
+pub(crate) struct BleVialReaderWriter {
+    // Read vial data from host via vial_output_handle
+    pub(crate) vial_output_handle: Arc<Mutex<BLECharacteristic>>,
+    // Writer vial data to host via vial_input_handle
+    pub(crate) vial_input_handle: Arc<Mutex<BLECharacteristic>>,
+}
+
+impl HidReaderTrait for BleVialReaderWriter {
+    type ReportType = ViaReport;
+
+    async fn read_report(&mut self) -> Result<Self::ReportType, HidError> {
+        let v = VIAL_READ_CHANNEL.receive().await;
+
+        // The output_data field is the input from host
+        Ok(ViaReport {
+            input_data: [0u8; 32],
+            output_data: v,
+        })
+    }
+}
+
+impl HidWriterTrait for BleVialReaderWriter {
+    type ReportType = ViaReport;
+
+    async fn write_report(&mut self, report: Self::ReportType) -> Result<usize, HidError> {
+        let mut buf = [0u8; 32];
+        let n = serialize(&mut buf, &report).map_err(|_| HidError::ReportSerializeError)?;
+        self.write(&buf).await?;
+        Ok(n)
+    }
+}
+
+impl BleVialReaderWriter {
+    async fn write(&self, report: &[u8]) -> Result<(), HidError> {
+        self.vial_input_handle.lock().set_value(&report).notify();
+        Timer::after_millis(7).await;
+        Ok(())
     }
 }
 
 // BLE HID keyboard server
 pub(crate) struct BleServer {
     pub(crate) server: &'static mut BLEServer,
-    pub(crate) input_keyboard: BleHidWriter,
-    pub(crate) output_keyboard: BleHidReader,
-    pub(crate) input_media_keys: BleHidWriter,
-    pub(crate) input_system_keys: BleHidWriter,
-    pub(crate) input_mouse_keys: BleHidWriter,
-    pub(crate) input_vial: BleHidWriter,
-    pub(crate) output_vial: BleHidReader,
+    pub(crate) input_keyboard: Arc<Mutex<BLECharacteristic>>,
+    pub(crate) output_keyboard: Arc<Mutex<BLECharacteristic>>,
+    pub(crate) input_media_keys: Arc<Mutex<BLECharacteristic>>,
+    pub(crate) input_system_keys: Arc<Mutex<BLECharacteristic>>,
+    pub(crate) input_mouse_keys: Arc<Mutex<BLECharacteristic>>,
+    pub(crate) input_vial: Arc<Mutex<BLECharacteristic>>,
+    pub(crate) output_vial: Arc<Mutex<BLECharacteristic>>,
 }
 
 impl BleServer {
@@ -160,6 +232,42 @@ impl BleServer {
         }
     }
 
+    pub(crate) fn get_led_reader(&self) -> BleLedReader {
+        // Set vial output characteristic read callback
+        self.output_keyboard.lock().on_write(|args| {
+            let data: &[u8] = args.recv_data();
+            debug!("BLE received LED, len: {} {=[u8]:#X}", data.len(), data);
+            if data.len() > 0 {
+                // Send the first byte to the LED_SIGNAL
+                LED_SIGNAL.signal(LedIndicator::from_bits(data[0]));
+            }
+        });
+        BleLedReader {}
+    }
+
+    pub(crate) fn get_keyboard_writer(&self) -> BleKeyboardWriter {
+        BleKeyboardWriter {
+            keyboard_handle: self.input_keyboard.clone(),
+            media_handle: self.input_media_keys.clone(),
+            system_control_handle: self.input_system_keys.clone(),
+            mouse_handle: self.input_mouse_keys.clone(),
+        }
+    }
+
+    pub(crate) fn get_vial_reader_writer(&self) -> BleVialReaderWriter {
+        // Set vial output characteristic read callback
+        self.output_vial.lock().on_write(|args| {
+            let data: &[u8] = args.recv_data();
+            debug!("BLE received vial, len: {} {=[u8]:#X}", data.len(), data);
+            block_on(VIAL_READ_CHANNEL.send(unsafe { *(data.as_ptr() as *const [u8; 32]) }));
+        });
+
+        BleVialReaderWriter {
+            vial_output_handle: self.output_vial.clone(),
+            vial_input_handle: self.input_vial.clone(),
+        }
+    }
+
     pub(crate) async fn wait_for_connection(&mut self) {
         loop {
             // Check connection status every 100 ms
@@ -171,6 +279,7 @@ impl BleServer {
     }
 
     pub(crate) async fn wait_for_disconnection(server: &'static mut BLEServer) {
+        CONNECTION_STATE.store(true, core::sync::atomic::Ordering::Release);
         loop {
             // Check connection status every 500 ms
             Timer::after_millis(500).await;
@@ -180,45 +289,3 @@ impl BleServer {
         }
     }
 }
-
-impl ConnectionTypeWrapper for BleServer {
-    fn get_conn_type(&self) -> crate::hid::ConnectionType {
-        ConnectionType::Ble
-    }
-}
-
-pub(crate) struct VialReaderWriter<'ch, M: RawMutex, T: Sized, const N: usize, W: HidWriterWrapper>
-{
-    pub(crate) receiver: Receiver<'ch, M, T, N>,
-    pub(crate) hid_writer: W,
-}
-
-impl<'ch, M: RawMutex, T: Sized, const N: usize, W: HidWriterWrapper> ConnectionTypeWrapper
-    for VialReaderWriter<'ch, M, T, N, W>
-{
-    fn get_conn_type(&self) -> ConnectionType {
-        ConnectionType::Ble
-    }
-}
-
-impl<'ch, M: RawMutex, T: Sized, const N: usize, W: HidWriterWrapper> HidReaderWrapper
-    for VialReaderWriter<'ch, M, T, N, W>
-{
-    async fn read(&mut self, buf: &mut [u8]) -> Result<usize, HidError> {
-        let v = self.receiver.receive().await;
-        buf.copy_from_slice(as_bytes(&v));
-        Ok(as_bytes(&v).len())
-    }
-}
-
-impl<'ch, M: RawMutex, T: Sized, const N: usize, W: HidWriterWrapper> HidWriterWrapper
-    for VialReaderWriter<'ch, M, T, N, W>
-{
-    async fn write_serialize<IR: AsInputReport>(&mut self, r: &IR) -> Result<(), HidError> {
-        self.hid_writer.write_serialize(r).await
-    }
-
-    async fn write(&mut self, report: &[u8]) -> Result<(), HidError> {
-        self.hid_writer.write(report).await
-    }
-}
diff --git a/rmk/src/ble/led.rs b/rmk/src/ble/led.rs
new file mode 100644
index 00000000..f22bb843
--- /dev/null
+++ b/rmk/src/ble/led.rs
@@ -0,0 +1,16 @@
+use crate::{
+    channel::LED_SIGNAL,
+    hid::{HidError, HidReaderTrait},
+    light::LedIndicator,
+};
+
+pub(crate) struct BleLedReader {}
+
+impl HidReaderTrait for BleLedReader {
+    type ReportType = LedIndicator;
+
+    // The LED state is read from a blocking callback, so `Signal` is used to wait for the state.
+    async fn read_report(&mut self) -> Result<Self::ReportType, HidError> {
+        Ok(LED_SIGNAL.wait().await)
+    }
+}
diff --git a/rmk/src/ble/mod.rs b/rmk/src/ble/mod.rs
index 6b5ffb74..2bebdfcd 100644
--- a/rmk/src/ble/mod.rs
+++ b/rmk/src/ble/mod.rs
@@ -1,86 +1,11 @@
 pub(crate) mod descriptor;
 pub(crate) mod device_info;
+pub(crate) mod led;
 
 #[cfg(feature = "_esp_ble")]
 pub mod esp;
 #[cfg(feature = "_nrf_ble")]
 pub mod nrf;
 
-use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, channel::Receiver};
-use embassy_time::Timer;
 #[cfg(any(feature = "nrf52840_ble", feature = "nrf52833_ble"))]
 pub use nrf::SOFTWARE_VBUS;
-
-use crate::{
-    hid::HidWriterWrapper,
-    keyboard::{write_other_report_to_host, KeyboardReportMessage, REPORT_CHANNEL_SIZE},
-    usb::descriptor::CompositeReportType,
-    CONNECTION_STATE,
-};
-
-/// BLE communication task, send reports to host via BLE.
-/// TODO: Merge `ble_communication_task` and `communication_task` into one task.
-pub(crate) async fn ble_communication_task<
-    'a,
-    W: HidWriterWrapper,
-    W2: HidWriterWrapper,
-    W3: HidWriterWrapper,
-    W4: HidWriterWrapper,
->(
-    keyboard_report_receiver: &Receiver<
-        'a,
-        CriticalSectionRawMutex,
-        KeyboardReportMessage,
-        REPORT_CHANNEL_SIZE,
-    >,
-    ble_keyboard_writer: &mut W,
-    ble_media_writer: &mut W2,
-    ble_system_control_writer: &mut W3,
-    ble_mouse_writer: &mut W4,
-) {
-    // Wait 1 seconds, ensure that gatt server has been started
-    Timer::after_secs(1).await;
-    loop {
-        let report = keyboard_report_receiver.receive().await;
-        // Only send the report after the connection is established.
-        if CONNECTION_STATE.load(core::sync::atomic::Ordering::Acquire) {
-            match report {
-                KeyboardReportMessage::KeyboardReport(report) => {
-                    debug!(
-                        "Send keyboard report via BLE: {:?}, modifier: {:b}",
-                        report.keycodes, report.modifier
-                    );
-                    match ble_keyboard_writer.write_serialize(&report).await {
-                        Ok(()) => {}
-                        Err(e) => error!("Send keyboard report error: {:?}", e),
-                    };
-                }
-                KeyboardReportMessage::CompositeReport(report, report_type) => {
-                    match report_type {
-                        CompositeReportType::Media => {
-                            write_other_report_to_host(report, report_type, ble_media_writer).await
-                        }
-                        CompositeReportType::Mouse => {
-                            write_other_report_to_host(report, report_type, ble_mouse_writer).await
-                        }
-                        CompositeReportType::System => {
-                            write_other_report_to_host(
-                                report,
-                                report_type,
-                                ble_system_control_writer,
-                            )
-                            .await
-                        }
-                        CompositeReportType::None => (),
-                    };
-                }
-            }
-        }
-    }
-}
-
-pub(crate) fn as_bytes<T: Sized>(p: &T) -> &[u8] {
-    unsafe {
-        ::core::slice::from_raw_parts((p as *const T) as *const u8, ::core::mem::size_of::<T>())
-    }
-}
diff --git a/rmk/src/ble/nrf/battery_service.rs b/rmk/src/ble/nrf/battery_service.rs
index dfc62e41..50d85862 100644
--- a/rmk/src/ble/nrf/battery_service.rs
+++ b/rmk/src/ble/nrf/battery_service.rs
@@ -2,8 +2,6 @@ use crate::config::BleBatteryConfig;
 use embassy_time::Timer;
 use nrf_softdevice::ble::Connection;
 
-use super::server::BleServer;
-
 #[nrf_softdevice::gatt_service(uuid = "180f")]
 #[derive(Debug, Clone, Copy)]
 pub(crate) struct BatteryService {
@@ -55,9 +53,7 @@ impl<'a> BatteryService {
                     Ok(_) => info!("Battery value: {}", val),
                     Err(e) => match self.battery_level_set(&val) {
                         Ok(_) => info!("Battery value set: {}", val),
-                        Err(e2) => {
-                            error!("Battery value notify error: {:?}, set error: {:?}", e, e2)
-                        }
+                        Err(e2) => error!("Battery value notify error: {}, set error: {}", e, e2),
                     },
                 }
                 if val < 10 {
@@ -65,7 +61,7 @@ impl<'a> BatteryService {
                     if let Some(ref mut charge_led) = battery_config.charge_led_pin {
                         charge_led.toggle();
                     }
-                    Timer::after_secs(2).await;
+                    Timer::after_secs(200).await;
                     continue;
                 } else {
                     // Turn off the led
@@ -90,7 +86,6 @@ impl<'a> BatteryService {
         }
     }
 
-    // TODO: Make battery calculation user customizable
     fn get_battery_percent(&self, val: i16, battery_config: &BleBatteryConfig<'a>) -> u8 {
         info!("Detected adc value: {:?}", val);
         // Avoid overflow
@@ -127,15 +122,3 @@ impl<'a> BatteryService {
         }
     }
 }
-
-impl BleServer {
-    pub(crate) fn set_battery_value(&self, conn: &Connection, val: &u8) {
-        match self.bas.battery_level_notify(conn, val) {
-            Ok(_) => info!("Battery value: {}", val),
-            Err(e) => match self.bas.battery_level_set(val) {
-                Ok(_) => info!("Battery value set: {}", val),
-                Err(e2) => error!("Battery value notify error: {:?}, set error: {:?}", e, e2),
-            },
-        }
-    }
-}
diff --git a/rmk/src/ble/nrf/bonder.rs b/rmk/src/ble/nrf/bonder.rs
index 31748042..b0ded8ad 100644
--- a/rmk/src/ble/nrf/bonder.rs
+++ b/rmk/src/ble/nrf/bonder.rs
@@ -1,9 +1,6 @@
 use super::BONDED_DEVICE_NUM;
-use crate::{
-    ble::nrf::ACTIVE_PROFILE,
-    storage::{FlashOperationMessage, FLASH_CHANNEL},
-    CONNECTION_STATE,
-};
+use crate::channel::FLASH_CHANNEL;
+use crate::{ble::nrf::ACTIVE_PROFILE, storage::FlashOperationMessage, CONNECTION_STATE};
 use core::{cell::RefCell, sync::atomic::Ordering};
 use heapless::FnvIndexMap;
 use nrf_softdevice::ble::{
diff --git a/rmk/src/ble/nrf/hid_service.rs b/rmk/src/ble/nrf/hid_service.rs
index 0cd21e72..99f3eea3 100644
--- a/rmk/src/ble/nrf/hid_service.rs
+++ b/rmk/src/ble/nrf/hid_service.rs
@@ -1,7 +1,9 @@
 use super::spec::{BleCharacteristics, BleDescriptor, BLE_HID_SERVICE_UUID};
 use crate::{
     ble::descriptor::{BleCompositeReportType, BleKeyboardReport},
-    light::{LedIndicator, LED_CHANNEL},
+    channel::{KEYBOARD_REPORT_CHANNEL, LED_SIGNAL},
+    hid::{HidError, HidWriterTrait, Report, RunnableHidWriter},
+    light::LedIndicator,
 };
 use nrf_softdevice::{
     ble::{
@@ -15,10 +17,12 @@ use nrf_softdevice::{
     },
     Softdevice,
 };
+use ssmarshal::serialize;
 use usbd_hid::descriptor::SerializedDescriptor as _;
 
 #[allow(dead_code)]
-#[derive(Debug)]
+#[derive(Debug, Clone, Copy)]
+#[cfg_attr(feature = "defmt", derive(defmt::Format))]
 pub(crate) struct HidService {
     hid_info: u16,
     report_map: u16,
@@ -184,13 +188,7 @@ impl gatt_server::Service for HidService {
             // Fires if a keyboard output is changed - e.g. the caps lock LED
             let led_indicator = LedIndicator::from_bits(data[0]);
             info!("HID output keyboard: {:?}", led_indicator);
-            // Retry 3 times in case the channel is full(which is really rare)
-            for _i in 0..3 {
-                match LED_CHANNEL.try_send(led_indicator) {
-                    Ok(_) => break,
-                    Err(e) => warn!("LED channel full, retrying: {:?}", e),
-                }
-            }
+            LED_SIGNAL.signal(led_indicator);
             Some(HidServiceEvent::OutputKeyboard)
         } else {
             None
@@ -208,3 +206,82 @@ pub(crate) enum HidServiceEvent {
     InputSystemKeyCccdWrite,
     OutputKeyboard,
 }
+
+pub(crate) struct BleKeyboardWriter<'a> {
+    conn: &'a Connection,
+    keyboard_handle: u16,
+    media_handle: u16,
+    system_control_handle: u16,
+    mouse_handle: u16,
+}
+
+impl<'a> BleKeyboardWriter<'a> {
+    pub(crate) fn new(
+        conn: &'a Connection,
+        keyboard_handle: u16,
+        media_handle: u16,
+        system_control_handle: u16,
+        mouse_handle: u16,
+    ) -> Self {
+        Self {
+            conn,
+            keyboard_handle,
+            media_handle,
+            system_control_handle,
+            mouse_handle,
+        }
+    }
+    async fn write(&mut self, handle: u16, report: &[u8]) -> Result<(), HidError> {
+        gatt_server::notify_value(self.conn, handle, report).map_err(|e| {
+            error!("Send ble report error: {}", e);
+            match e {
+                gatt_server::NotifyValueError::Disconnected => HidError::BleDisconnected,
+                gatt_server::NotifyValueError::Raw(_) => HidError::BleRawError,
+            }
+        })
+    }
+}
+
+impl RunnableHidWriter for BleKeyboardWriter<'_> {
+    async fn get_report(&mut self) -> Self::ReportType {
+        KEYBOARD_REPORT_CHANNEL.receive().await
+    }
+}
+
+impl HidWriterTrait for BleKeyboardWriter<'_> {
+    type ReportType = Report;
+
+    async fn write_report(&mut self, report: Self::ReportType) -> Result<usize, HidError> {
+        match report {
+            Report::KeyboardReport(keyboard_report) => {
+                debug!("Writing keyboard report {}", keyboard_report);
+                let mut buf = [0u8; 8];
+                let n = serialize(&mut buf, &keyboard_report)
+                    .map_err(|_| HidError::ReportSerializeError)?;
+                self.write(self.keyboard_handle, &buf).await?;
+                Ok(n)
+            }
+            Report::MouseReport(mouse_report) => {
+                let mut buf = [0u8; 5];
+                let n = serialize(&mut buf, &mouse_report)
+                    .map_err(|_| HidError::ReportSerializeError)?;
+                self.write(self.mouse_handle, &buf).await?;
+                Ok(n)
+            }
+            Report::MediaKeyboardReport(media_keyboard_report) => {
+                let mut buf = [0u8; 2];
+                let n = serialize(&mut buf, &media_keyboard_report)
+                    .map_err(|_| HidError::ReportSerializeError)?;
+                self.write(self.media_handle, &buf).await?;
+                Ok(n)
+            }
+            Report::SystemControlReport(system_control_report) => {
+                let mut buf = [0u8; 2];
+                let n = serialize(&mut buf, &system_control_report)
+                    .map_err(|_| HidError::ReportSerializeError)?;
+                self.write(self.system_control_handle, &buf).await?;
+                Ok(n)
+            }
+        }
+    }
+}
diff --git a/rmk/src/ble/nrf/mod.rs b/rmk/src/ble/nrf/mod.rs
index d8ae42db..96a82af1 100644
--- a/rmk/src/ble/nrf/mod.rs
+++ b/rmk/src/ble/nrf/mod.rs
@@ -9,32 +9,30 @@ pub(crate) mod spec;
 mod vial_service;
 
 use self::server::BleServer;
-use crate::config::BleBatteryConfig;
-use crate::keyboard::{KEYBOARD_REPORT_CHANNEL, REPORT_CHANNEL_SIZE};
+use crate::ble::led::BleLedReader;
+use crate::ble::nrf::hid_service::BleKeyboardWriter;
+use crate::config::{BleBatteryConfig, RmkConfig, VialConfig};
+use crate::hid::{DummyWriter, RunnableHidWriter};
+use crate::input_device::InputProcessor as _;
+use crate::light::LightController;
 use crate::matrix::MatrixTrait;
 use crate::storage::StorageKeys;
 use crate::{
-    ble::{
-        ble_communication_task,
-        nrf::{
-            advertise::{create_advertisement_data, SCAN_DATA},
-            bonder::BondInfo,
-            server::BleHidWriter,
-        },
+    ble::nrf::{
+        advertise::{create_advertisement_data, SCAN_DATA},
+        bonder::BondInfo,
     },
-    keyboard::{Keyboard, KeyboardReportMessage},
-    light::led_service_task,
+    keyboard::Keyboard,
     storage::{get_bond_info_key, Storage, StorageData},
-    vial_task, KeyAction, KeyMap, LightService, RmkConfig, VialService, CONNECTION_TYPE,
+    KeyMap, CONNECTION_TYPE,
 };
-use crate::{CONNECTION_STATE, KEYBOARD_STATE};
+use crate::{run_keyboard, CONNECTION_STATE};
 use bonder::MultiBonder;
 use core::sync::atomic::{AtomicU8, Ordering};
 use core::{cell::RefCell, mem};
 use embassy_executor::Spawner;
 use embassy_futures::join::join;
-use embassy_futures::select::{select, select4, Either4};
-use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, channel::Receiver};
+use embassy_futures::select::{select4, Either4};
 use embassy_time::Timer;
 use embedded_hal::digital::OutputPin;
 use embedded_storage_async::nor_flash::NorFlash as AsyncNorFlash;
@@ -49,14 +47,19 @@ use nrf_softdevice::{
 use profile::update_profile;
 use sequential_storage::{cache::NoCache, map::fetch_item};
 use static_cell::StaticCell;
-use vial_service::VialReaderWriter;
+use vial_service::BleVialReaderWriter;
 #[cfg(not(feature = "_no_usb"))]
 use {
-    crate::{
-        run_usb_keyboard,
-        usb::{wait_for_usb_enabled, wait_for_usb_suspend, UsbState, USB_STATE},
-        KeyboardUsbDevice,
+    crate::light::UsbLedReader,
+    crate::register_usb_writer,
+    crate::usb::{
+        descriptor::{CompositeReport, KeyboardReport, ViaReport},
+        new_usb_builder, wait_for_usb_enabled, wait_for_usb_suspend, UsbKeyboardWriter, UsbState,
+        USB_STATE,
     },
+    crate::via::UsbVialReaderWriter,
+    crate::{add_usb_reader_writer, run_usb_device},
+    embassy_futures::select::select,
     embassy_futures::select::{select3, Either3},
     embassy_nrf::usb::vbus_detect::SoftwareVbusDetect,
     embassy_usb::driver::Driver,
@@ -201,132 +204,94 @@ pub(crate) fn nrf_ble_config(keyboard_name: &str) -> Config {
     }
 }
 
-/// Initialize and run the BLE keyboard service, with given keyboard usb config.
-/// Can only be used on nrf52 series microcontrollers with `nrf-softdevice` crate.
-/// This function never returns.
-///
-/// # Arguments
-///
-/// * `keymap` - default keymap definition
-/// * `driver` - embassy usb driver instance
-/// * `input_pins` - input gpio pins
-/// * `output_pins` - output gpio pins
-/// * `keyboard_config` - other configurations of the keyboard, check [RmkConfig] struct for details
-/// * `spawner` - embassy task spawner, used to spawn nrf_softdevice background task
-/// * `saadc` - nRF's [saadc](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.nrf52832.ps.v1.1%2Fsaadc.html) instance for battery level detection, if you don't need it, pass `None`
-pub async fn initialize_nrf_ble_keyboard_and_run<
-    M: MatrixTrait,
-    Out: OutputPin,
-    #[cfg(not(feature = "_no_usb"))] D: Driver<'static>,
-    const ROW: usize,
-    const COL: usize,
-    const NUM_LAYER: usize,
->(
-    mut matrix: M,
-    #[cfg(not(feature = "_no_usb"))] usb_driver: D,
-    default_keymap: &mut [[[KeyAction; COL]; ROW]; NUM_LAYER],
-
-    mut keyboard_config: RmkConfig<'static, Out>,
-    ble_addr: Option<[u8; 6]>,
+pub(crate) fn initialize_nrf_sd_and_flash(
+    keyboard_name: &str,
     spawner: Spawner,
-) -> ! {
-    // Set ble config and start nrf-softdevice background task first
-    let keyboard_name = keyboard_config.usb_config.product_name;
+    ble_addr: Option<[u8; 6]>,
+) -> (&mut Softdevice, Flash) {
+    // Set ble config and enable nrf-softdevice first
     let ble_config = nrf_ble_config(keyboard_name);
 
     let sd = Softdevice::enable(&ble_config);
+
     if let Some(addr) = ble_addr {
-        // This is used mainly for split central
+        // This is used mainly for split
         use nrf_softdevice::ble::{set_address, Address, AddressType};
         set_address(sd, &Address::new(AddressType::RandomStatic, addr));
     };
-    {
-        // Use the immutable ref of `Softdevice` to run the softdevice_task
-        // The mumtable ref is used for configuring Flash and BleServer
-        let sdv = unsafe { nrf_softdevice::Softdevice::steal() };
-        spawner
-            .spawn(softdevice_task(sdv))
-            .expect("Failed to start softdevice task")
-    };
-
-    // Flash and keymap configuration
-    let flash = Flash::take(sd);
-    let mut storage = Storage::new(flash, default_keymap, keyboard_config.storage_config).await;
-    let keymap = RefCell::new(
-        KeyMap::new_from_storage(
-            default_keymap,
-            Some(&mut storage),
-            keyboard_config.behavior_config,
-        )
-        .await,
-    );
-
-    let mut buf: [u8; 128] = [0; 128];
 
-    // Load current active profile
-    if let Ok(Some(StorageData::ActiveBleProfile(profile))) =
-        read_storage!(storage, &(StorageKeys::ActiveBleProfile as u32), buf)
-    {
-        debug!("Loaded active profile: {}", profile);
-        ACTIVE_PROFILE.store(profile, Ordering::SeqCst);
-    } else {
-        // If no saved active profile, use 0 as default
-        debug!("Loaded default active profile",);
-        ACTIVE_PROFILE.store(0, Ordering::SeqCst);
-    };
+    // Use the immutable ref of `Softdevice` to run the softdevice_task
+    // It can also be used for create flash instance
+    let sdv = unsafe { nrf_softdevice::Softdevice::steal() };
+    spawner
+        .spawn(softdevice_task(sdv))
+        .expect("Failed to start softdevice task");
+    (sd, Flash::take(sdv))
+}
 
-    // Load current connection type
-    if let Ok(Some(StorageData::ConnectionType(conn_type))) =
-        read_storage!(storage, &(StorageKeys::ConnectionType as u32), buf)
-    {
-        CONNECTION_TYPE.store(conn_type, Ordering::Relaxed);
-    } else {
-        // If no saved connection type, use 0 as default
-        CONNECTION_TYPE.store(0, Ordering::Relaxed);
+pub(crate) async fn run_nrf_ble_keyboard<
+    'a,
+    M: MatrixTrait,
+    F: AsyncNorFlash,
+    #[cfg(not(feature = "_no_usb"))] D: Driver<'static>,
+    Out: OutputPin,
+    const ROW: usize,
+    const COL: usize,
+    const NUM_LAYER: usize,
+>(
+    keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
+    keyboard: &mut Keyboard<'a, ROW, COL, NUM_LAYER>,
+    matrix: &mut M,
+    storage: &mut Storage<F, ROW, COL, NUM_LAYER>,
+    #[cfg(not(feature = "_no_usb"))] usb_driver: D,
+    light_controller: &mut LightController<Out>,
+    mut rmk_config: RmkConfig<'static>,
+    sd: &mut Softdevice,
+) -> ! {
+    // Initialize usb device, ble service, etc
+    #[cfg(not(feature = "_no_usb"))]
+    // Initialize usb device and usb hid reader/writer
+    let (
+        mut usb_device,
+        mut keyboard_reader,
+        mut keyboard_writer,
+        mut other_writer,
+        mut vial_reader_writer,
+    ) = {
+        let mut usb_builder: embassy_usb::Builder<'_, D> =
+            new_usb_builder(usb_driver, rmk_config.usb_config);
+        let keyboard_reader_writer = add_usb_reader_writer!(&mut usb_builder, KeyboardReport, 1, 8);
+        let other_writer = register_usb_writer!(&mut usb_builder, CompositeReport, 9);
+        let vial_reader_writer = add_usb_reader_writer!(&mut usb_builder, ViaReport, 32, 32);
+        let (keyboard_reader, keyboard_writer) = keyboard_reader_writer.split();
+        let usb_device = usb_builder.build();
+        (
+            usb_device,
+            keyboard_reader,
+            keyboard_writer,
+            other_writer,
+            vial_reader_writer,
+        )
     };
 
-    #[cfg(feature = "_no_usb")]
-    CONNECTION_TYPE.store(0, Ordering::Relaxed);
-
-    // Get all saved bond info, config BLE bonder
-    let mut bond_info: FnvIndexMap<u8, BondInfo, BONDED_DEVICE_NUM> = FnvIndexMap::new();
-    for key in 0..BONDED_DEVICE_NUM {
-        if let Ok(Some(StorageData::BondInfo(info))) =
-            read_storage!(storage, &get_bond_info_key(key as u8), buf)
-        {
-            bond_info.insert(key as u8, info).ok();
-        }
-    }
-
+    // Initialize ble service
+    load_keyboard_states(storage).await;
+    let bond_info = load_bond_info(storage).await;
     info!("Loaded {} saved bond info", bond_info.len());
-    // static BONDER: StaticCell<Bonder> = StaticCell::new();
-    // let bonder = BONDER.init(Bonder::new(RefCell::new(bond_info)));
     static BONDER: StaticCell<MultiBonder> = StaticCell::new();
     let bonder = BONDER.init(MultiBonder::new(RefCell::new(bond_info)));
-
-    let ble_server =
-        BleServer::new(sd, keyboard_config.usb_config, bonder).expect("Failed to start ble server");
-
-    let keyboard_report_sender = KEYBOARD_REPORT_CHANNEL.sender();
-    let keyboard_report_receiver = KEYBOARD_REPORT_CHANNEL.receiver();
-
-    // Keyboard services
-    let mut keyboard = Keyboard::new(&keymap, &keyboard_report_sender);
-    #[cfg(not(feature = "_no_usb"))]
-    let mut usb_device = KeyboardUsbDevice::new(usb_driver, keyboard_config.usb_config);
-    let mut vial_service = VialService::new(&keymap, keyboard_config.vial_config);
-    let mut light_service = LightService::from_config(keyboard_config.light_config);
+    let ble_server: BleServer =
+        BleServer::new(sd, rmk_config.usb_config, bonder).expect("Failed to start ble server");
 
     // Main loop
     loop {
-        KEYBOARD_STATE.store(false, core::sync::atomic::Ordering::Release);
         // Init BLE advertising data
         let mut config = peripheral::Config::default();
         // Interval: 500ms
         config.interval = 800;
         config.tx_power = TxPower::Plus4dBm;
         let adv = ConnectableAdvertisement::ScannableUndirected {
-            adv_data: &create_advertisement_data(keyboard_name),
+            adv_data: &create_advertisement_data(rmk_config.usb_config.product_name),
             scan_data: &SCAN_DATA,
         };
         // If there is a USB device, things become a little bit complex because we need to enable switching between USB and BLE.
@@ -340,14 +305,18 @@ pub async fn initialize_nrf_ble_keyboard_and_run<
             );
             // Check whether the USB is connected
             if USB_STATE.load(Ordering::SeqCst) != UsbState::Disabled as u8 {
-                let usb_fut = run_usb_keyboard(
-                    &mut usb_device,
-                    &mut keyboard,
-                    &mut matrix,
-                    &mut storage,
-                    &mut light_service,
-                    &mut vial_service,
-                    &keyboard_report_receiver,
+                let usb_fut = run_keyboard(
+                    keymap,
+                    keyboard,
+                    matrix,
+                    #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))]
+                    storage,
+                    run_usb_device(&mut usb_device),
+                    light_controller,
+                    UsbLedReader::new(&mut keyboard_reader),
+                    UsbVialReaderWriter::new(&mut vial_reader_writer),
+                    UsbKeyboardWriter::new(&mut keyboard_writer, &mut other_writer),
+                    rmk_config.vial_config,
                 );
                 if CONNECTION_TYPE.load(Ordering::Relaxed) == 0 {
                     info!("Running USB keyboard");
@@ -364,47 +333,20 @@ pub async fn initialize_nrf_ble_keyboard_and_run<
                     info!("Running USB keyboard, while advertising");
                     let adv_fut = peripheral::advertise_pairable(sd, adv, &config, bonder);
                     match select3(adv_fut, usb_fut, update_profile(bonder)).await {
-                        Either3::First(Ok(mut conn)) => {
-                            info!("Connected to BLE");
-                            // Check whether the peer address is matched with current profile
-                            if !bonder.check_connection(&conn) {
-                                error!(
-                                    "Bonded peer address doesn't match active profile, disconnect"
-                                );
-                                continue;
-                            }
-
-                            bonder.load_sys_attrs(&conn);
-
-                            if let Err(e) = conn.phy_update(PhySet::M2, PhySet::M2) {
-                                error!("Failed to update PHY");
-                                if let PhyUpdateError::Raw(re) = e {
-                                    error!("Raw error code: {:?}", re);
-                                }
-                            }
-                            // Run the ble keyboard, wait for disconnection or USB connect
-                            match select3(
-                                run_ble_keyboard(
-                                    &conn,
-                                    &ble_server,
-                                    &mut keyboard,
-                                    &mut matrix,
-                                    &mut storage,
-                                    &mut light_service,
-                                    &mut vial_service,
-                                    &mut keyboard_config.ble_battery_config,
-                                    &keyboard_report_receiver,
-                                ),
-                                wait_for_usb_enabled(),
-                                update_profile(bonder),
+                        Either3::First(Ok(conn)) => {
+                            run_ble_keyboard(
+                                keymap,
+                                keyboard,
+                                matrix,
+                                storage,
+                                light_controller,
+                                rmk_config.vial_config,
+                                &mut rmk_config.ble_battery_config,
+                                &ble_server,
+                                bonder,
+                                conn,
                             )
                             .await
-                            {
-                                Either3::First(_) => info!("BLE disconnected"),
-                                Either3::Second(_) => info!("Detected USB configured, quit BLE"),
-                                Either3::Third(_) => info!("Switch profile"),
-                            }
-                            bonder.save_sys_attrs(&conn);
                         }
                         _ => {
                             // Wait 10ms
@@ -415,55 +357,26 @@ pub async fn initialize_nrf_ble_keyboard_and_run<
                 }
             } else {
                 // USB isn't connected, wait for any of BLE/USB connection
-                let dummy_task = run_dummy_keyboard(
-                    &mut keyboard,
-                    &mut matrix,
-                    &mut storage,
-                    &keyboard_report_receiver,
-                );
+                let dummy_task = run_dummy_keyboard(keyboard, matrix, storage);
                 let adv_fut = peripheral::advertise_pairable(sd, adv, &config, bonder);
 
                 info!("BLE advertising");
                 // Wait for BLE or USB connection
                 match select3(adv_fut, wait_for_status_change(bonder), dummy_task).await {
-                    Either3::First(Ok(mut conn)) => {
-                        info!("Connected to BLE");
-                        // Check whether the peer address is matched with current profile
-                        if !bonder.check_connection(&conn) {
-                            error!("Bonded peer address doesn't match active profile, disconnect");
-                            continue;
-                        }
-
-                        bonder.load_sys_attrs(&conn);
-                        if let Err(e) = conn.phy_update(PhySet::M2, PhySet::M2) {
-                            error!("Failed to update PHY");
-                            if let PhyUpdateError::Raw(re) = e {
-                                error!("Raw error code: {:?}", re);
-                            }
-                        }
-                        // Run the ble keyboard, wait for disconnection
-                        match select3(
-                            run_ble_keyboard(
-                                &conn,
-                                &ble_server,
-                                &mut keyboard,
-                                &mut matrix,
-                                &mut storage,
-                                &mut light_service,
-                                &mut vial_service,
-                                &mut keyboard_config.ble_battery_config,
-                                &keyboard_report_receiver,
-                            ),
-                            wait_for_usb_enabled(),
-                            update_profile(bonder),
+                    Either3::First(Ok(conn)) => {
+                        run_ble_keyboard(
+                            keymap,
+                            keyboard,
+                            matrix,
+                            storage,
+                            light_controller,
+                            rmk_config.vial_config,
+                            &mut rmk_config.ble_battery_config,
+                            &ble_server,
+                            bonder,
+                            conn,
                         )
                         .await
-                        {
-                            Either3::First(_) => info!("BLE disconnected"),
-                            Either3::Second(_) => info!("Detected USB configured, quit BLE"),
-                            Either3::Third(_) => info!("Switch profile"),
-                        }
-                        bonder.save_sys_attrs(&conn);
                     }
                     _ => {
                         // Wait 10ms for usb resuming/switching profile/advertising error
@@ -475,30 +388,20 @@ pub async fn initialize_nrf_ble_keyboard_and_run<
 
         #[cfg(feature = "_no_usb")]
         match peripheral::advertise_pairable(sd, adv, &config, bonder).await {
-            Ok(mut conn) => {
-                bonder.load_sys_attrs(&conn);
-                if let Err(e) = conn.phy_update(PhySet::M2, PhySet::M2) {
-                    error!("Failed to update PHY");
-                    if let PhyUpdateError::Raw(re) = e {
-                        error!("Raw error code: {:?}", re);
-                    }
-                }
-                select(
-                    run_ble_keyboard(
-                        &conn,
-                        &ble_server,
-                        &mut keyboard,
-                        &mut matrix,
-                        &mut storage,
-                        &mut light_service,
-                        &mut vial_service,
-                        &mut keyboard_config.ble_battery_config,
-                        &keyboard_report_receiver,
-                    ),
-                    update_profile(bonder),
+            Ok(conn) => {
+                run_ble_keyboard(
+                    keymap,
+                    keyboard,
+                    matrix,
+                    storage,
+                    light_controller,
+                    rmk_config.vial_config,
+                    &mut rmk_config.ble_battery_config,
+                    &ble_server,
+                    bonder,
+                    conn,
                 )
                 .await;
-                bonder.save_sys_attrs(&conn);
             }
             Err(e) => error!("Advertise error: {}", e),
         }
@@ -508,6 +411,128 @@ pub async fn initialize_nrf_ble_keyboard_and_run<
     }
 }
 
+pub(crate) async fn load_keyboard_states<
+    F: AsyncNorFlash,
+    const ROW: usize,
+    const COL: usize,
+    const NUM_LAYER: usize,
+>(
+    storage: &mut Storage<F, ROW, COL, NUM_LAYER>,
+) {
+    let mut buf: [u8; 128] = [0; 128];
+
+    // Load current active profile
+    if let Ok(Some(StorageData::ActiveBleProfile(profile))) =
+        read_storage!(storage, &(StorageKeys::ActiveBleProfile as u32), buf)
+    {
+        debug!("Loaded active profile: {}", profile);
+        ACTIVE_PROFILE.store(profile, Ordering::SeqCst);
+    } else {
+        // If no saved active profile, use 0 as default
+        debug!("Loaded default active profile",);
+        ACTIVE_PROFILE.store(0, Ordering::SeqCst);
+    };
+
+    // Load current connection type
+    if let Ok(Some(StorageData::ConnectionType(conn_type))) =
+        read_storage!(storage, &(StorageKeys::ConnectionType as u32), buf)
+    {
+        CONNECTION_TYPE.store(conn_type, Ordering::Relaxed);
+    } else {
+        // If no saved connection type, use 0 as default
+        CONNECTION_TYPE.store(0, Ordering::Relaxed);
+    };
+
+    #[cfg(feature = "_no_usb")]
+    CONNECTION_TYPE.store(0, Ordering::Relaxed);
+}
+
+pub(crate) async fn load_bond_info<
+    F: AsyncNorFlash,
+    const ROW: usize,
+    const COL: usize,
+    const NUM_LAYER: usize,
+>(
+    storage: &mut Storage<F, ROW, COL, NUM_LAYER>,
+) -> FnvIndexMap<u8, BondInfo, BONDED_DEVICE_NUM> {
+    let mut buf: [u8; 128] = [0; 128];
+    // Get all saved bond info, config BLE bonder
+    let mut bond_info: FnvIndexMap<u8, BondInfo, BONDED_DEVICE_NUM> = FnvIndexMap::new();
+    for key in 0..BONDED_DEVICE_NUM {
+        if let Ok(Some(StorageData::BondInfo(info))) =
+            read_storage!(storage, &get_bond_info_key(key as u8), buf)
+        {
+            bond_info.insert(key as u8, info).ok();
+        }
+    }
+    bond_info
+}
+
+async fn run_ble_keyboard<
+    'a,
+    M: MatrixTrait,
+    F: AsyncNorFlash,
+    Out: OutputPin,
+    const ROW: usize,
+    const COL: usize,
+    const NUM_LAYER: usize,
+>(
+    keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
+    keyboard: &mut Keyboard<'a, ROW, COL, NUM_LAYER>,
+    matrix: &mut M,
+    storage: &mut Storage<F, ROW, COL, NUM_LAYER>,
+    light_controller: &mut LightController<Out>,
+    vial_config: VialConfig<'static>,
+    ble_battery_config: &mut BleBatteryConfig<'static>,
+    ble_server: &BleServer,
+    bonder: &'static MultiBonder,
+    mut conn: Connection,
+) {
+    info!("Connected to BLE");
+    if !bonder.check_connection(&conn) {
+        error!("Bonded peer address doesn't match active profile, disconnect");
+        return;
+    }
+    bonder.load_sys_attrs(&conn);
+    if let Err(e) = conn.phy_update(PhySet::M2, PhySet::M2) {
+        error!("Failed to update PHY");
+        if let PhyUpdateError::Raw(re) = e {
+            error!("Raw error code: {:?}", re);
+        }
+    }
+    match select4(
+        run_keyboard(
+            keymap,
+            keyboard,
+            matrix,
+            storage,
+            run_ble_server(&conn, ble_server),
+            light_controller,
+            BleLedReader {},
+            BleVialReaderWriter::new(ble_server.vial, &conn),
+            BleKeyboardWriter::new(
+                &conn,
+                ble_server.hid.input_keyboard,
+                ble_server.hid.input_media_keys,
+                ble_server.hid.input_system_keys,
+                ble_server.hid.input_mouse_keys,
+            ),
+            vial_config,
+        ),
+        ble_server.bas.clone().run(ble_battery_config, &conn),
+        wait_for_usb_enabled(),
+        update_profile(bonder),
+    )
+    .await
+    {
+        Either4::First(_) => info!("BLE disconnected"),
+        Either4::Second(_) => info!("Bas service error"),
+        Either4::Third(_) => info!("Detected USB configured, quit BLE"),
+        Either4::Fourth(_) => info!("Switch profile"),
+    }
+    bonder.save_sys_attrs(&conn);
+}
+
 pub(crate) async fn set_conn_params(conn: &Connection) {
     // Wait for 5 seconds before setting connection parameters to avoid connection drop
     embassy_time::Timer::after_secs(5).await;
@@ -545,8 +570,6 @@ pub(crate) async fn set_conn_params(conn: &Connection) {
 
 // Dummy keyboard service is used to monitoring keys when there's no actual connection.
 // It's useful for functions like switching active profiles when there's no connection.
-// TODO: make matrix + keyboard + storage task running in the background ALWAYS,
-// add a dummy receiver preventing everything blocks
 pub(crate) async fn run_dummy_keyboard<
     'a,
     'b,
@@ -559,28 +582,22 @@ pub(crate) async fn run_dummy_keyboard<
     keyboard: &mut Keyboard<'a, ROW, COL, NUM_LAYER>,
     matrix: &mut M,
     storage: &mut Storage<F, ROW, COL, NUM_LAYER>,
-    keyboard_report_receiver: &Receiver<
-        'a,
-        CriticalSectionRawMutex,
-        KeyboardReportMessage,
-        REPORT_CHANNEL_SIZE,
-    >,
 ) {
     CONNECTION_STATE.store(false, Ordering::Release);
     // Don't need to wait for connection, just do scanning to detect if there's a profile update
     let matrix_fut = matrix.scan();
     let keyboard_fut = keyboard.run();
     let storage_fut = storage.run();
-    let dummy_communication = async {
-        loop {
-            keyboard_report_receiver.receive().await;
-            warn!("Dummy service receives")
-        }
-    };
-    // Even for dummy service, we need to set the connection state to true.
-    // So that we can receive the matrix scan result from split, which might be used for profile switching
-    CONNECTION_STATE.store(true, Ordering::Release);
-    match select4(matrix_fut, keyboard_fut, storage_fut, dummy_communication).await {
+    let mut dummy_writer = DummyWriter {};
+
+    match select4(
+        matrix_fut,
+        keyboard_fut,
+        storage_fut,
+        dummy_writer.run_writer(),
+    )
+    .await
+    {
         Either4::First(_) => (),
         Either4::Second(_) => (),
         Either4::Third(_) => (),
@@ -600,73 +617,18 @@ pub(crate) async fn wait_for_status_change(bonder: &MultiBonder) {
     }
 }
 
-// Run ble keyboard task for once
-pub(crate) async fn run_ble_keyboard<
-    'a,
-    'b,
-    M: MatrixTrait,
-    F: AsyncNorFlash,
-    Out: OutputPin,
-    const ROW: usize,
-    const COL: usize,
-    const NUM_LAYER: usize,
->(
-    conn: &Connection,
-    ble_server: &BleServer,
-    keyboard: &mut Keyboard<'a, ROW, COL, NUM_LAYER>,
-    matrix: &mut M,
-    storage: &mut Storage<F, ROW, COL, NUM_LAYER>,
-    light_service: &mut LightService<Out>,
-    vial_service: &mut VialService<'a, ROW, COL, NUM_LAYER>,
-    battery_config: &mut BleBatteryConfig<'b>,
-    keyboard_report_receiver: &Receiver<
-        'a,
-        CriticalSectionRawMutex,
-        KeyboardReportMessage,
-        REPORT_CHANNEL_SIZE,
-    >,
-) {
-    CONNECTION_STATE.store(false, Ordering::Release);
-    info!("Starting GATT server 20 ms later");
-    Timer::after_millis(20).await;
-    let mut ble_keyboard_writer = BleHidWriter::<'_, 8>::new(&conn, ble_server.hid.input_keyboard);
-    let mut ble_media_writer = BleHidWriter::<'_, 2>::new(&conn, ble_server.hid.input_media_keys);
-    let mut ble_system_control_writer =
-        BleHidWriter::<'_, 1>::new(&conn, ble_server.hid.input_system_keys);
-    let mut ble_mouse_writer = BleHidWriter::<'_, 5>::new(&conn, ble_server.hid.input_mouse_keys);
-    let mut bas = ble_server.bas;
-    let mut vial_rw = VialReaderWriter::new(ble_server.vial, &conn);
-    let vial_task = vial_task(&mut vial_rw, vial_service);
-
-    // Tasks
-    let battery_fut = bas.run(battery_config, &conn);
-    let led_fut = led_service_task(light_service);
-    let matrix_fut = matrix.run();
-    // Run the GATT server on the connection. This returns when the connection gets disconnected.
-    let ble_fut = gatt_server::run(&conn, ble_server, |_| {});
-    let keyboard_fut = keyboard.run();
-    let ble_communication_task = ble_communication_task(
-        keyboard_report_receiver,
-        &mut ble_keyboard_writer,
-        &mut ble_media_writer,
-        &mut ble_system_control_writer,
-        &mut ble_mouse_writer,
-    );
-    let storage_fut = storage.run();
-    let set_conn_param = set_conn_params(&conn);
-
-    // Exit if anyone of those futures exits
-    match select4(
-        select(matrix_fut, join(ble_fut, set_conn_param)),
-        select(ble_communication_task, keyboard_fut),
-        select(battery_fut, led_fut),
-        select(vial_task, storage_fut),
+async fn run_ble_server(conn: &Connection, ble_server: &BleServer) {
+    let err = join(
+        set_conn_params(&conn),
+        gatt_server::run(conn, ble_server, |_| {}),
     )
-    .await
-    {
-        Either4::First(e) => error!("ble_fut exited with error: {:?}", e),
-        Either4::Second(_) => error!("Keyboard task or ble task exited"),
-        Either4::Third(_) => error!("Battery task or led task exited"),
-        Either4::Fourth(_) => error!("Storage task exited"),
+    .await;
+    error!("BLE server exited with error: {:?}", err.1);
+}
+
+#[cfg(feature = "_no_usb")]
+async fn wait_for_usb_enabled() {
+    loop {
+        core::future::pending::<()>().await;
     }
 }
diff --git a/rmk/src/ble/nrf/profile.rs b/rmk/src/ble/nrf/profile.rs
index 413383f1..dbfd1d85 100644
--- a/rmk/src/ble/nrf/profile.rs
+++ b/rmk/src/ble/nrf/profile.rs
@@ -4,19 +4,16 @@
 use core::sync::atomic::Ordering;
 
 use embassy_futures::yield_now;
-use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, channel::Channel};
 
 use crate::{
     ble::nrf::{ACTIVE_PROFILE, BONDED_DEVICE_NUM},
-    storage::{FlashOperationMessage, FLASH_CHANNEL},
+    channel::{BLE_PROFILE_CHANNEL, FLASH_CHANNEL},
+    storage::FlashOperationMessage,
     CONNECTION_TYPE,
 };
 
 use super::bonder::MultiBonder;
 
-pub(crate) static BLE_PROFILE_CHANNEL: Channel<CriticalSectionRawMutex, BleProfileAction, 1> =
-    Channel::new();
-
 /// BLE profile switch action
 pub(crate) enum BleProfileAction {
     SwitchProfile(u8),
@@ -82,6 +79,7 @@ pub(crate) async fn update_profile(bonder: &MultiBonder) {
         break;
     }
     yield_now().await;
-    // TODO: How to ensure that the flash operations have been completed?
+    // Wait for the flash operation to complete
+    // A signal could be used here, but for simplicity, just waiting for 1s
     embassy_time::Timer::after_secs(1).await
 }
diff --git a/rmk/src/ble/nrf/server.rs b/rmk/src/ble/nrf/server.rs
index c5e74266..bf942801 100644
--- a/rmk/src/ble/nrf/server.rs
+++ b/rmk/src/ble/nrf/server.rs
@@ -4,11 +4,8 @@ use super::{
     hid_service::{HidService, HidServiceEvent},
     vial_service::{BleVialService, VialServiceEvent},
 };
+use crate::ble::device_info::{DeviceInformation, PnPID, VidSource};
 use crate::config::KeyboardUsbConfig;
-use crate::{
-    ble::device_info::{DeviceInformation, PnPID, VidSource},
-    hid::{ConnectionType, ConnectionTypeWrapper, HidError, HidReaderWrapper, HidWriterWrapper},
-};
 use nrf_softdevice::{
     ble::{
         gatt_server::{self, RegisterError, Service, WriteOp},
@@ -17,7 +14,6 @@ use nrf_softdevice::{
     },
     Softdevice,
 };
-use usbd_hid::descriptor::AsInputReport;
 
 /// Wrapper struct for writing via BLE
 pub(crate) struct BleHidWriter<'a, const N: usize> {
@@ -25,74 +21,6 @@ pub(crate) struct BleHidWriter<'a, const N: usize> {
     handle: u16,
 }
 
-impl<'a, const N: usize> ConnectionTypeWrapper for BleHidWriter<'a, N> {
-    fn get_conn_type(&self) -> crate::hid::ConnectionType {
-        ConnectionType::Ble
-    }
-}
-
-impl<'a, const N: usize> HidWriterWrapper for BleHidWriter<'a, N> {
-    async fn write_serialize<IR: AsInputReport>(&mut self, r: &IR) -> Result<(), HidError> {
-        use ssmarshal::serialize;
-        let mut buf: [u8; N] = [0; N];
-        match serialize(&mut buf, &r) {
-            Ok(_) => self.write(&buf).await,
-            Err(_) => Err(HidError::ReportSerializeError),
-        }
-    }
-
-    async fn write(&mut self, report: &[u8]) -> Result<(), HidError> {
-        gatt_server::notify_value(self.conn, self.handle, report).map_err(|e| {
-            error!("Send ble report error: {:?}", e);
-            match e {
-                gatt_server::NotifyValueError::Disconnected => HidError::BleDisconnected,
-                gatt_server::NotifyValueError::Raw(_) => HidError::BleRawError,
-            }
-        })
-    }
-}
-
-impl<'a, const N: usize> BleHidWriter<'a, N> {
-    pub(crate) fn new(conn: &'a Connection, handle: u16) -> Self {
-        Self { conn, handle }
-    }
-}
-
-/// Wrapper struct for writing via BLE
-pub(crate) struct BleHidReader<'a, const N: usize> {
-    sd: &'a Softdevice,
-    conn: &'a Connection,
-    handle: u16,
-}
-
-impl<'a, const N: usize> ConnectionTypeWrapper for BleHidReader<'a, N> {
-    fn get_conn_type(&self) -> crate::hid::ConnectionType {
-        ConnectionType::Ble
-    }
-}
-
-impl<'a, const N: usize> HidReaderWrapper for BleHidReader<'a, N> {
-    async fn read(&mut self, buf: &mut [u8]) -> Result<usize, HidError> {
-        let mut buffer = [0u8; 16];
-        gatt_server::get_value(self.sd, self.handle, &mut buffer)
-            .map_err(|e| {
-                error!("Read value from ble error: {:?}", e);
-                HidError::BleRawError
-            })
-            .map(|s| {
-                info!("READ FROM BLE HID {:?}", buffer);
-                buf[0] = buffer[0];
-                s
-            })
-    }
-}
-
-impl<'a, const N: usize> BleHidReader<'a, N> {
-    pub(crate) fn new(sd: &'a Softdevice, conn: &'a Connection, handle: u16) -> Self {
-        Self { sd, conn, handle }
-    }
-}
-
 // BleServer saves all services, which have connection handles in it
 pub(crate) struct BleServer {
     _dis: DeviceInformationService,
diff --git a/rmk/src/ble/nrf/vial_service.rs b/rmk/src/ble/nrf/vial_service.rs
index af06f623..8a904fcf 100644
--- a/rmk/src/ble/nrf/vial_service.rs
+++ b/rmk/src/ble/nrf/vial_service.rs
@@ -1,5 +1,4 @@
 use embassy_futures::block_on;
-use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, channel::Channel};
 use nrf_softdevice::{
     ble::{
         gatt_server::{
@@ -15,16 +14,14 @@ use nrf_softdevice::{
 use usbd_hid::descriptor::SerializedDescriptor;
 
 use crate::{
-    ble::as_bytes,
-    hid::{ConnectionType, ConnectionTypeWrapper, HidError, HidReaderWrapper, HidWriterWrapper},
+    channel::VIAL_READ_CHANNEL,
+    hid::{HidError, HidReaderTrait, HidWriterTrait},
     usb::descriptor::ViaReport,
 };
 
 use super::spec::{BleCharacteristics, BleDescriptor, BLE_HID_SERVICE_UUID};
 
-static vial_output_channel: Channel<CriticalSectionRawMutex, [u8; 32], 4> = Channel::new();
-
-#[derive(Clone, Copy)]
+#[derive(Debug, Clone, Copy)]
 pub(crate) struct BleVialService {
     pub(crate) input_vial: u16,
     input_vial_cccd: u16,
@@ -116,10 +113,18 @@ impl BleVialService {
         })
     }
 
-    pub(crate) fn send_ble_vial_report(&self, conn: &Connection, data: &[u8]) {
-        gatt_server::notify_value(conn, self.input_vial, data)
-            .map_err(|e| error!("send vial report error: {:?}", e))
-            .ok();
+    pub(crate) fn send_ble_vial_report(
+        &self,
+        conn: &Connection,
+        data: &[u8],
+    ) -> Result<(), HidError> {
+        gatt_server::notify_value(conn, self.input_vial, data).map_err(|e| {
+            error!("Send ble report error: {:?}", e);
+            match e {
+                gatt_server::NotifyValueError::Disconnected => HidError::BleDisconnected,
+                gatt_server::NotifyValueError::Raw(_) => HidError::BleRawError,
+            }
+        })
     }
 }
 
@@ -134,7 +139,7 @@ impl gatt_server::Service for BleVialService {
             let data = unsafe { *(data.as_ptr() as *const [u8; 32]) };
             // Retry at most 3 times
             for _ in 0..3 {
-                if let Ok(_) = vial_output_channel.try_send(data) {
+                if let Ok(_) = VIAL_READ_CHANNEL.try_send(data) {
                     break;
                 }
                 // Wait for 20ms before sending the next report
@@ -148,47 +153,38 @@ impl gatt_server::Service for BleVialService {
     }
 }
 
-pub(crate) struct VialReaderWriter<'a> {
+pub(crate) struct BleVialReaderWriter<'a> {
     pub(crate) service: BleVialService,
     pub(crate) conn: &'a Connection,
 }
 
-impl<'a> VialReaderWriter<'a> {
+impl<'a> BleVialReaderWriter<'a> {
     pub(crate) fn new(service: BleVialService, conn: &'a Connection) -> Self {
         Self { service, conn }
     }
 }
 
-impl<'a> ConnectionTypeWrapper for VialReaderWriter<'a> {
-    fn get_conn_type(&self) -> crate::hid::ConnectionType {
-        ConnectionType::Ble
-    }
-}
-
-impl<'a> HidReaderWrapper for VialReaderWriter<'a> {
-    async fn read(&mut self, buf: &mut [u8]) -> Result<usize, crate::hid::HidError> {
-        let v = vial_output_channel.receive().await;
-        buf.copy_from_slice(as_bytes(&v));
-        Ok(as_bytes(&v).len())
-    }
-}
+impl HidWriterTrait for BleVialReaderWriter<'_> {
+    type ReportType = ViaReport;
 
-impl<'a> HidWriterWrapper for VialReaderWriter<'a> {
-    async fn write_serialize<IR: usbd_hid::descriptor::AsInputReport>(
-        &mut self,
-        r: &IR,
-    ) -> Result<(), crate::hid::HidError> {
+    async fn write_report(&mut self, report: Self::ReportType) -> Result<usize, HidError> {
         use ssmarshal::serialize;
         let mut buf: [u8; 32] = [0; 32];
-        match serialize(&mut buf, r) {
-            Ok(n) => self.write(&buf[0..n]).await,
-            Err(_) => Err(HidError::ReportSerializeError),
-        }
+        let n = serialize(&mut buf, &report).map_err(|_| HidError::ReportSerializeError)?;
+        self.service.send_ble_vial_report(self.conn, &mut buf)?;
+        Ok(n)
     }
+}
+
+impl HidReaderTrait for BleVialReaderWriter<'_> {
+    type ReportType = ViaReport;
 
-    async fn write(&mut self, report: &[u8]) -> Result<(), crate::hid::HidError> {
-        self.service.send_ble_vial_report(self.conn, report);
-        Ok(())
+    async fn read_report(&mut self) -> Result<Self::ReportType, HidError> {
+        let v = VIAL_READ_CHANNEL.receive().await;
+        Ok(ViaReport {
+            input_data: [0u8; 32],
+            output_data: v,
+        })
     }
 }
 
diff --git a/rmk/src/channel.rs b/rmk/src/channel.rs
new file mode 100644
index 00000000..7bffe72b
--- /dev/null
+++ b/rmk/src/channel.rs
@@ -0,0 +1,29 @@
+use crate::RawMutex;
+use embassy_sync::channel::Channel;
+
+#[cfg(feature = "_nrf_ble")]
+use crate::ble::nrf::profile::BleProfileAction;
+use crate::event::{Event, KeyEvent};
+use crate::hid::Report;
+use crate::storage::FlashOperationMessage;
+#[cfg(feature = "_ble")]
+use {crate::light::LedIndicator, embassy_sync::signal::Signal};
+pub const EVENT_CHANNEL_SIZE: usize = 16;
+pub const REPORT_CHANNEL_SIZE: usize = 16;
+
+/// Signal for control led indicator, it's used only in BLE keyboards, since BLE receiving is not async
+#[cfg(feature = "_ble")]
+pub static LED_SIGNAL: Signal<RawMutex, LedIndicator> = Signal::new();
+/// Channel for key events only
+pub static KEY_EVENT_CHANNEL: Channel<RawMutex, KeyEvent, EVENT_CHANNEL_SIZE> = Channel::new();
+/// Channel for all events
+pub static EVENT_CHANNEL: Channel<RawMutex, Event, EVENT_CHANNEL_SIZE> = Channel::new();
+/// Channel for keyboard report from input processors to hid writer/reader
+pub(crate) static KEYBOARD_REPORT_CHANNEL: Channel<RawMutex, Report, REPORT_CHANNEL_SIZE> =
+    Channel::new();
+/// Channel for reading vial reports from the host
+pub(crate) static VIAL_READ_CHANNEL: Channel<RawMutex, [u8; 32], 4> = Channel::new();
+// Sync messages from server to flash
+pub(crate) static FLASH_CHANNEL: Channel<RawMutex, FlashOperationMessage, 4> = Channel::new();
+#[cfg(feature = "_nrf_ble")]
+pub(crate) static BLE_PROFILE_CHANNEL: Channel<RawMutex, BleProfileAction, 1> = Channel::new();
diff --git a/rmk/src/combo.rs b/rmk/src/combo.rs
index 5e1d7920..537149c8 100644
--- a/rmk/src/combo.rs
+++ b/rmk/src/combo.rs
@@ -7,7 +7,7 @@ pub(crate) const COMBO_MAX_NUM: usize = 8;
 // Max size of combos
 pub(crate) const COMBO_MAX_LENGTH: usize = 4;
 
-#[derive(Clone)]
+#[derive(Clone, Debug)]
 pub struct Combo {
     pub(crate) actions: Vec<KeyAction, COMBO_MAX_LENGTH>,
     pub(crate) output: KeyAction,
diff --git a/rmk/src/config/esp_config.rs b/rmk/src/config/esp_config.rs
index 48ecabdf..876a84e3 100644
--- a/rmk/src/config/esp_config.rs
+++ b/rmk/src/config/esp_config.rs
@@ -1,2 +1,2 @@
-#[derive(Default)]
+#[derive(Clone, Copy, Debug, Default)]
 pub struct BleBatteryConfig {}
diff --git a/rmk/src/config/mod.rs b/rmk/src/config/mod.rs
index 95ade7ba..900a2a18 100644
--- a/rmk/src/config/mod.rs
+++ b/rmk/src/config/mod.rs
@@ -9,17 +9,105 @@ pub use esp_config::BleBatteryConfig;
 #[cfg(feature = "_nrf_ble")]
 pub use nrf_config::BleBatteryConfig;
 
+use embassy_sync::channel::Channel;
 use embassy_time::Duration;
 use embedded_hal::digital::OutputPin;
 
-use crate::combo::{Combo, COMBO_MAX_NUM};
+use crate::{
+    combo::{Combo, COMBO_MAX_NUM},
+    event::{Event, KeyEvent},
+    hid::Report,
+    light::LedIndicator,
+    storage::FlashOperationMessage,
+    RawMutex,
+};
+
+/// The config struct for RMK keyboard.
+///
+/// There are 3 types of configs:
+/// 1. `ChannelConfig`: Configurations for channels used in RMK.
+/// 2. `ControllerConfig`: Config for controllers, the controllers are used for controlling other devices on the board.
+/// 3. `RmkConfig`: Tunable configurations for RMK keyboard.
+
+pub struct KeyboardConfig<'a, O: OutputPin> {
+    pub channel_config: ChannelConfig,
+    pub controller_config: ControllerConfig<O>,
+    pub rmk_config: RmkConfig<'a>,
+}
+
+impl<'a, O: OutputPin> Default for KeyboardConfig<'a, O> {
+    fn default() -> Self {
+        Self {
+            channel_config: ChannelConfig::default(),
+            controller_config: ControllerConfig::default(),
+            rmk_config: RmkConfig::default(),
+        }
+    }
+}
+
+/// Configurations for channels used in RMK
+pub struct ChannelConfig<
+    const KEY_EVENT_CHANNEL_SIZE: usize = 16,
+    const EVENT_CHANNEL_SIZE: usize = 16,
+    const REPORT_CHANNEL_SIZE: usize = 16,
+> {
+    pub key_event_channel: Channel<RawMutex, KeyEvent, KEY_EVENT_CHANNEL_SIZE>,
+    pub event_channel: Channel<RawMutex, Event, EVENT_CHANNEL_SIZE>,
+    pub keyboard_report_channel: Channel<RawMutex, Report, REPORT_CHANNEL_SIZE>,
+    pub(crate) flash_channel: Channel<RawMutex, FlashOperationMessage, 4>,
+    pub(crate) led_channel: Channel<RawMutex, LedIndicator, 4>,
+    pub(crate) vial_read_channel: Channel<RawMutex, [u8; 32], 4>,
+}
+
+impl<
+        const KEY_EVENT_CHANNEL_SIZE: usize,
+        const EVENT_CHANNEL_SIZE: usize,
+        const REPORT_CHANNEL_SIZE: usize,
+    > Default for ChannelConfig<KEY_EVENT_CHANNEL_SIZE, EVENT_CHANNEL_SIZE, REPORT_CHANNEL_SIZE>
+{
+    fn default() -> Self {
+        Self {
+            key_event_channel: Channel::new(),
+            event_channel: Channel::new(),
+            keyboard_report_channel: Channel::new(),
+            flash_channel: Channel::new(),
+            led_channel: Channel::new(),
+            vial_read_channel: Channel::new(),
+        }
+    }
+}
+
+impl<
+        const KEY_EVENT_CHANNEL_SIZE: usize,
+        const EVENT_CHANNEL_SIZE: usize,
+        const REPORT_CHANNEL_SIZE: usize,
+    > ChannelConfig<KEY_EVENT_CHANNEL_SIZE, EVENT_CHANNEL_SIZE, REPORT_CHANNEL_SIZE>
+{
+    pub fn new() -> Self {
+        Self::default()
+    }
+}
+
+/// Config for controllers.
+///
+/// Controllers are used for controlling other devices on the board, such as lights, RGB, etc.
+pub struct ControllerConfig<O: OutputPin> {
+    pub light_config: LightConfig<O>,
+}
+
+impl<O: OutputPin> Default for ControllerConfig<O> {
+    fn default() -> Self {
+        Self {
+            light_config: LightConfig::default(),
+        }
+    }
+}
 
 /// Internal configurations for RMK keyboard.
-pub struct RmkConfig<'a, O: OutputPin> {
+pub struct RmkConfig<'a> {
     pub mouse_config: MouseConfig,
     pub usb_config: KeyboardUsbConfig<'a>,
     pub vial_config: VialConfig<'a>,
-    pub light_config: LightConfig<O>,
     pub storage_config: StorageConfig,
     pub behavior_config: BehaviorConfig,
     #[cfg(feature = "_nrf_ble")]
@@ -28,13 +116,12 @@ pub struct RmkConfig<'a, O: OutputPin> {
     pub ble_battery_config: BleBatteryConfig,
 }
 
-impl<'a, O: OutputPin> Default for RmkConfig<'a, O> {
+impl<'a> Default for RmkConfig<'a> {
     fn default() -> Self {
         Self {
             mouse_config: MouseConfig::default(),
             usb_config: KeyboardUsbConfig::default(),
             vial_config: VialConfig::default(),
-            light_config: LightConfig::default(),
             storage_config: StorageConfig::default(),
             behavior_config: BehaviorConfig::default(),
             #[cfg(any(feature = "_nrf_ble", feature = "_esp_ble"))]
@@ -44,7 +131,7 @@ impl<'a, O: OutputPin> Default for RmkConfig<'a, O> {
 }
 
 /// Config for configurable action behavior
-#[derive(Default)]
+#[derive(Clone, Debug, Default)]
 pub struct BehaviorConfig {
     pub tri_layer: Option<[u8; 3]>,
     pub tap_hold: TapHoldConfig,
@@ -53,6 +140,7 @@ pub struct BehaviorConfig {
 }
 
 /// Configurations for tap hold behavior
+#[derive(Clone, Copy, Debug)]
 pub struct TapHoldConfig {
     pub enable_hrm: bool,
     pub prior_idle_time: Duration,
@@ -72,6 +160,7 @@ impl Default for TapHoldConfig {
 }
 
 /// Config for one shot behavior
+#[derive(Clone, Copy, Debug)]
 pub struct OneShotConfig {
     pub timeout: Duration,
 }
@@ -85,6 +174,7 @@ impl Default for OneShotConfig {
 }
 
 /// Config for combo behavior
+#[derive(Clone, Debug)]
 pub struct CombosConfig {
     pub combos: Vec<Combo, COMBO_MAX_NUM>,
     pub timeout: Duration,
@@ -121,14 +211,12 @@ impl Default for StorageConfig {
 }
 
 /// Config for lights
-#[derive(Clone, Copy, Debug)]
 pub struct LightConfig<O: OutputPin> {
     pub capslock: Option<LightPinConfig<O>>,
     pub scrolllock: Option<LightPinConfig<O>>,
     pub numslock: Option<LightPinConfig<O>>,
 }
 
-#[derive(Clone, Copy, Default, Debug)]
 pub struct LightPinConfig<O: OutputPin> {
     pub pin: O,
     pub low_active: bool,
diff --git a/rmk/src/direct_pin.rs b/rmk/src/direct_pin.rs
index ec8ea5b7..7e711f4e 100644
--- a/rmk/src/direct_pin.rs
+++ b/rmk/src/direct_pin.rs
@@ -1,4 +1,9 @@
+use core::cell::RefCell;
+
 use crate::action::KeyAction;
+#[cfg(feature = "_nrf_ble")]
+use crate::ble::nrf::initialize_nrf_sd_and_flash;
+use crate::channel::KEY_EVENT_CHANNEL;
 #[cfg(not(feature = "rapid_debouncer"))]
 use crate::debounce::default_bouncer::DefaultDebouncer;
 #[cfg(feature = "rapid_debouncer")]
@@ -6,21 +11,15 @@ use crate::debounce::fast_debouncer::RapidDebouncer;
 use crate::debounce::DebounceState;
 use crate::debounce::DebouncerTrait;
 use crate::event::KeyEvent;
-use crate::keyboard::KEY_EVENT_CHANNEL;
+use crate::input_device::InputDevice;
+use crate::keyboard::Keyboard;
+use crate::keymap::KeyMap;
+use crate::light::LightController;
 use crate::matrix::KeyState;
+use crate::run_rmk_internal;
+use crate::storage::Storage;
+use crate::KeyboardConfig;
 use crate::MatrixTrait;
-use crate::RmkConfig;
-
-#[cfg(feature = "_esp_ble")]
-use crate::ble::esp::initialize_esp_ble_keyboard_with_config_and_run;
-#[cfg(feature = "_nrf_ble")]
-use crate::ble::nrf::initialize_nrf_ble_keyboard_and_run;
-#[cfg(all(
-    not(feature = "_no_usb"),
-    not(any(feature = "_nrf_ble", feature = "_esp_ble"))
-))]
-use crate::initialize_usb_keyboard_and_run;
-
 #[cfg(not(feature = "_esp_ble"))]
 use embassy_executor::Spawner;
 use embassy_time::Instant;
@@ -33,6 +32,8 @@ use embedded_hal::digital::{InputPin, OutputPin};
 use embedded_storage::nor_flash::NorFlash;
 #[cfg(not(feature = "_no_external_storage"))]
 use embedded_storage_async::nor_flash::NorFlash as AsyncNorFlash;
+#[cfg(feature = "_esp_ble")]
+use esp_idf_svc::partition::EspPartition;
 #[cfg(feature = "async_matrix")]
 use {embassy_futures::select::select_slice, embedded_hal_async::digital::Wait, heapless::Vec};
 
@@ -65,7 +66,7 @@ pub async fn run_rmk_direct_pin<
     #[cfg(not(feature = "_no_usb"))] usb_driver: D,
     #[cfg(not(feature = "_no_external_storage"))] flash: F,
     default_keymap: &mut [[[KeyAction; COL]; ROW]; NUM_LAYER],
-    keyboard_config: RmkConfig<'static, Out>,
+    keyboard_config: KeyboardConfig<'static, Out>,
     low_active: bool,
     #[cfg(not(feature = "_esp_ble"))] spawner: Spawner,
 ) -> ! {
@@ -158,11 +159,38 @@ pub async fn run_rmk_direct_pin_with_async_flash<
     #[cfg(not(feature = "_no_usb"))] usb_driver: D,
     #[cfg(not(feature = "_no_external_storage"))] flash: F,
     default_keymap: &mut [[[KeyAction; COL]; ROW]; NUM_LAYER],
-
-    keyboard_config: RmkConfig<'static, Out>,
+    keyboard_config: KeyboardConfig<'static, Out>,
     low_active: bool,
     #[cfg(not(feature = "_esp_ble"))] spawner: Spawner,
 ) -> ! {
+    let rmk_config = keyboard_config.rmk_config;
+    #[cfg(feature = "_nrf_ble")]
+    let (sd, flash) =
+        initialize_nrf_sd_and_flash(rmk_config.usb_config.product_name, spawner, None);
+
+    #[cfg(feature = "_esp_ble")]
+    let flash = {
+        let f = unsafe {
+            EspPartition::new("rmk")
+                .expect("Create storage partition error")
+                .expect("Empty partition")
+        };
+        let async_flash = embassy_embedded_hal::adapter::BlockingAsync::new(f);
+        async_flash
+    };
+
+    let mut storage = Storage::new(flash, default_keymap, rmk_config.storage_config).await;
+    let keymap = RefCell::new(
+        KeyMap::new_from_storage(
+            default_keymap,
+            Some(&mut storage),
+            rmk_config.behavior_config.clone(),
+        )
+        .await,
+    );
+    let keyboard = Keyboard::new(&keymap, rmk_config.behavior_config.clone());
+    let light_controller = LightController::new(keyboard_config.controller_config.light_config);
+
     // Create the debouncer
     #[cfg(feature = "rapid_debouncer")]
     let debouncer = RapidDebouncer::<COL, ROW>::new();
@@ -172,38 +200,19 @@ pub async fn run_rmk_direct_pin_with_async_flash<
     // Keyboard matrix
     let matrix = DirectPinMatrix::<_, _, ROW, COL, SIZE>::new(direct_pins, debouncer, low_active);
 
-    // Dispatch according to chip and communication type
-    #[cfg(feature = "_nrf_ble")]
-    initialize_nrf_ble_keyboard_and_run(
-        matrix,
+    run_rmk_internal(
+        matrix,   // matrix input device
+        keyboard, // key processor
+        &keymap,
         #[cfg(not(feature = "_no_usb"))]
         usb_driver,
-        default_keymap,
-        keyboard_config,
-        None,
-        spawner,
+        storage,
+        light_controller,
+        rmk_config,
+        #[cfg(feature = "_nrf_ble")]
+        sd,
     )
-    .await;
-
-    #[cfg(feature = "_esp_ble")]
-    initialize_esp_ble_keyboard_with_config_and_run(matrix, default_keymap, keyboard_config).await;
-
-    #[cfg(all(
-        not(feature = "_no_usb"),
-        not(any(feature = "_nrf_ble", feature = "_esp_ble"))
-    ))]
-    initialize_usb_keyboard_and_run(
-        matrix,
-        usb_driver,
-        #[cfg(not(feature = "_no_external_storage"))]
-        flash,
-        default_keymap,
-        keyboard_config,
-    )
-    .await;
-    // The fut should never return.
-    // If there's no fut, the feature flags must not be correct.
-    panic!("The run_rmk should never return");
+    .await
 }
 
 /// DirectPinMartex only has input pins.
@@ -252,6 +261,31 @@ impl<
     }
 }
 
+impl<
+        #[cfg(not(feature = "async_matrix"))] In: InputPin,
+        #[cfg(feature = "async_matrix")] In: Wait + InputPin,
+        D: DebouncerTrait,
+        const ROW: usize,
+        const COL: usize,
+        const SIZE: usize,
+    > InputDevice for DirectPinMatrix<In, D, ROW, COL, SIZE>
+{
+    type EventType = KeyEvent;
+
+    // Run the matrix
+    async fn run(&mut self) {
+        // We don't check disconnected state because disconnection means the task will be dropped
+        loop {
+            self.wait_for_connected().await;
+            self.scan().await;
+        }
+    }
+
+    async fn send_event(&mut self, event: Self::EventType) -> () {
+        KEY_EVENT_CHANNEL.send(event).await
+    }
+}
+
 impl<
         #[cfg(not(feature = "async_matrix"))] In: InputPin,
         #[cfg(feature = "async_matrix")] In: Wait + InputPin,
diff --git a/rmk/src/hid.rs b/rmk/src/hid.rs
index b60a8e89..feaa5978 100644
--- a/rmk/src/hid.rs
+++ b/rmk/src/hid.rs
@@ -1,14 +1,31 @@
-//! A thin hid wrapper layer which supports writing/reading HID reports via USB and BLE
+/// Traits and types for HID message reporting and listening.
+use core::future::Future;
 
-use embassy_usb::{
-    class::hid::{HidReader, HidReaderWriter, HidWriter, ReadError},
-    driver::Driver,
-};
-use usbd_hid::descriptor::AsInputReport;
+use crate::{channel::KEYBOARD_REPORT_CHANNEL, usb::descriptor::KeyboardReport, CONNECTION_STATE};
+use embassy_usb::{class::hid::ReadError, driver::EndpointError};
+use serde::Serialize;
+use usbd_hid::descriptor::{AsInputReport, MediaKeyboardReport, MouseReport, SystemControlReport};
+
+#[derive(Serialize, Debug)]
+pub enum Report {
+    /// Normal keyboard hid report
+    KeyboardReport(KeyboardReport),
+    /// Mouse hid report
+    MouseReport(MouseReport),
+    /// Media keyboard report
+    MediaKeyboardReport(MediaKeyboardReport),
+    /// System control report
+    SystemControlReport(SystemControlReport),
+}
+
+impl AsInputReport for Report {}
 
 #[derive(PartialEq, Debug)]
 #[cfg_attr(feature = "defmt", derive(defmt::Format))]
 pub(crate) enum HidError {
+    UsbReadError(ReadError),
+    UsbEndpointError(EndpointError),
+    // FIXME: remove unused errors
     UsbDisabled,
     UsbPartialRead,
     BufferOverflow,
@@ -17,147 +34,71 @@ pub(crate) enum HidError {
     BleRawError,
 }
 
-/// Type of connection
-pub(crate) enum ConnectionType {
-    Usb,
-    Ble,
-}
-
-/// Trait for getting connection type
-pub(crate) trait ConnectionTypeWrapper {
-    fn get_conn_type(&self) -> ConnectionType;
-}
-
-/// Wrapper trait for hid reading
-pub(crate) trait HidReaderWrapper: ConnectionTypeWrapper {
-    async fn read(&mut self, buf: &mut [u8]) -> Result<usize, HidError>;
-}
-
-/// Wrapper trait for hid writing
-pub(crate) trait HidWriterWrapper: ConnectionTypeWrapper {
-    async fn write_serialize<IR: AsInputReport>(&mut self, r: &IR) -> Result<(), HidError>;
-    async fn write(&mut self, report: &[u8]) -> Result<(), HidError>;
-}
-
-pub(crate) trait HidReaderWriterWrapper: HidReaderWrapper + HidWriterWrapper {}
-impl<T: HidReaderWrapper + HidWriterWrapper> HidReaderWriterWrapper for T {}
-
-/// Wrapper struct for writing via USB
-pub(crate) struct UsbHidWriter<'d, D: Driver<'d>, const N: usize> {
-    usb_writer: HidWriter<'d, D, N>,
-}
-
-impl<'d, D: Driver<'d>, const N: usize> ConnectionTypeWrapper for UsbHidWriter<'d, D, N> {
-    fn get_conn_type(&self) -> ConnectionType {
-        ConnectionType::Usb
-    }
-}
-
-impl<'d, D: Driver<'d>, const N: usize> HidWriterWrapper for UsbHidWriter<'d, D, N> {
-    async fn write_serialize<IR: AsInputReport>(&mut self, r: &IR) -> Result<(), HidError> {
-        self.usb_writer
-            .write_serialize(r)
-            .await
-            .map_err(|e| match e {
-                embassy_usb::driver::EndpointError::BufferOverflow => HidError::BufferOverflow,
-                embassy_usb::driver::EndpointError::Disabled => HidError::UsbDisabled,
-            })
-    }
-
-    async fn write(&mut self, report: &[u8]) -> Result<(), HidError> {
-        self.usb_writer.write(report).await.map_err(|e| match e {
-            embassy_usb::driver::EndpointError::BufferOverflow => HidError::BufferOverflow,
-            embassy_usb::driver::EndpointError::Disabled => HidError::UsbDisabled,
-        })
-    }
-}
-
-impl<'d, D: Driver<'d>, const N: usize> UsbHidWriter<'d, D, N> {
-    pub(crate) fn new(usb_writer: HidWriter<'d, D, N>) -> Self {
-        Self { usb_writer }
-    }
-}
-
-/// Wrapper struct for reading via USB
-pub(crate) struct UsbHidReader<'d, D: Driver<'d>, const N: usize> {
-    usb_reader: HidReader<'d, D, N>,
-}
-
-impl<'d, D: Driver<'d>, const N: usize> ConnectionTypeWrapper for UsbHidReader<'d, D, N> {
-    fn get_conn_type(&self) -> ConnectionType {
-        ConnectionType::Usb
+/// HidReporter trait is used for reporting HID messages to the host, via USB, BLE, etc.
+pub trait HidWriterTrait {
+    /// The report type that the reporter receives from input processors.
+    type ReportType: AsInputReport;
+
+    /// Write report to the host, return the number of bytes written if success.
+    fn write_report(
+        &mut self,
+        report: Self::ReportType,
+    ) -> impl Future<Output = Result<usize, HidError>>;
+}
+
+/// Runnable writer
+pub trait RunnableHidWriter: HidWriterTrait {
+    /// Get the report to be sent to the host
+    fn get_report(&mut self) -> impl Future<Output = Self::ReportType>;
+
+    /// Run the writer task.
+    fn run_writer(&mut self) -> impl Future<Output = ()> {
+        async {
+            loop {
+                // Get report to send
+                let report = self.get_report().await;
+                // Only send the report after the connection is established.
+                if CONNECTION_STATE.load(core::sync::atomic::Ordering::Acquire) {
+                    match self.write_report(report).await {
+                        Ok(_) => continue,
+                        Err(e) => error!("Failed to send report: {:?}", e),
+                    };
+                }
+            }
+        }
     }
 }
 
-impl<'d, D: Driver<'d>, const N: usize> HidReaderWrapper for UsbHidReader<'d, D, N> {
-    async fn read(&mut self, buf: &mut [u8]) -> Result<usize, HidError> {
-        self.usb_reader.read(buf).await.map_err(|e| match e {
-            ReadError::BufferOverflow => HidError::BufferOverflow,
-            ReadError::Disabled => HidError::UsbDisabled,
-            ReadError::Sync(_) => HidError::UsbPartialRead,
-        })
-    }
-}
+/// HidListener trait is used for listening to HID messages from the host, via USB, BLE, etc.
+///
+/// HidListener only receives `[u8; READ_N]`, the raw HID report from the host.
+/// Then processes the received message, forward to other tasks
+pub trait HidReaderTrait {
+    /// Report type
+    type ReportType;
 
-impl<'d, D: Driver<'d>, const N: usize> UsbHidReader<'d, D, N> {
-    pub(crate) fn new(usb_reader: HidReader<'d, D, N>) -> Self {
-        Self { usb_reader }
-    }
+    /// Read HID report from the host
+    fn read_report(&mut self) -> impl Future<Output = Result<Self::ReportType, HidError>>;
 }
 
-/// Wrapper struct for reading and writing via USB
-pub(crate) struct UsbHidReaderWriter<'d, D: Driver<'d>, const READ_N: usize, const WRITE_N: usize> {
-    usb_reader_writer: HidReaderWriter<'d, D, READ_N, WRITE_N>,
-}
+pub struct DummyWriter {}
 
-impl<'d, D: Driver<'d>, const READ_N: usize, const WRITE_N: usize>
-    UsbHidReaderWriter<'d, D, READ_N, WRITE_N>
-{
-    pub(crate) fn new(usb_reader_writer: HidReaderWriter<'d, D, READ_N, WRITE_N>) -> Self {
-        Self { usb_reader_writer }
-    }
-}
-
-impl<'d, D: Driver<'d>, const READ_N: usize, const WRITE_N: usize> ConnectionTypeWrapper
-    for UsbHidReaderWriter<'d, D, READ_N, WRITE_N>
-{
-    fn get_conn_type(&self) -> ConnectionType {
-        ConnectionType::Usb
-    }
-}
+impl HidWriterTrait for DummyWriter {
+    type ReportType = Report;
 
-impl<'d, D: Driver<'d>, const READ_N: usize, const WRITE_N: usize> HidReaderWrapper
-    for UsbHidReaderWriter<'d, D, READ_N, WRITE_N>
-{
-    async fn read(&mut self, buf: &mut [u8]) -> Result<usize, HidError> {
-        self.usb_reader_writer.read(buf).await.map_err(|e| match e {
-            ReadError::BufferOverflow => HidError::BufferOverflow,
-            ReadError::Disabled => HidError::UsbDisabled,
-            ReadError::Sync(_) => HidError::UsbPartialRead,
-        })
+    async fn write_report(&mut self, _report: Self::ReportType) -> Result<usize, HidError> {
+        Ok(0)
     }
 }
 
-impl<'d, D: Driver<'d>, const READ_N: usize, const WRITE_N: usize> HidWriterWrapper
-    for UsbHidReaderWriter<'d, D, READ_N, WRITE_N>
-{
-    async fn write_serialize<IR: AsInputReport>(&mut self, r: &IR) -> Result<(), HidError> {
-        self.usb_reader_writer
-            .write_serialize(r)
-            .await
-            .map_err(|e| match e {
-                embassy_usb::driver::EndpointError::BufferOverflow => HidError::BufferOverflow,
-                embassy_usb::driver::EndpointError::Disabled => HidError::UsbDisabled,
-            })
+impl RunnableHidWriter for DummyWriter {
+    async fn run_writer(&mut self) -> () {
+        loop {
+            let _ = KEYBOARD_REPORT_CHANNEL.receive().await;
+        }
     }
 
-    async fn write(&mut self, report: &[u8]) -> Result<(), HidError> {
-        self.usb_reader_writer
-            .write(report)
-            .await
-            .map_err(|e| match e {
-                embassy_usb::driver::EndpointError::BufferOverflow => HidError::BufferOverflow,
-                embassy_usb::driver::EndpointError::Disabled => HidError::UsbDisabled,
-            })
+    async fn get_report(&mut self) -> Self::ReportType {
+        panic!("`get_report` in Dummy writer should not be used");
     }
 }
diff --git a/rmk/src/input_device/mod.rs b/rmk/src/input_device/mod.rs
index 1e7c6415..0eb1d41f 100644
--- a/rmk/src/input_device/mod.rs
+++ b/rmk/src/input_device/mod.rs
@@ -6,13 +6,7 @@
 //! Note: The `InputDevice` trait must be used in conjunction with the `run_devices` macro to ensure correct execution of all input devices.
 
 use core::future::Future;
-
-use embassy_sync::{
-    blocking_mutex::raw::CriticalSectionRawMutex,
-    channel::{Receiver, Sender},
-};
-
-use crate::keyboard::{EVENT_CHANNEL_SIZE, REPORT_CHANNEL_SIZE};
+use usbd_hid::descriptor::AsInputReport;
 
 pub mod rotary_encoder;
 
@@ -49,22 +43,14 @@ pub trait InputDevice {
     /// Event type that input device will send
     type EventType;
 
-    /// The number of required channel size
-    // FIXME: it's not possible in stable to define an associated const and use it as the channel size in stable Rust.
-    // It requires #[feature(generic_const_exprs)]:
-    //
-    // `fn event_sender(..) -> &Channel<CriticalSectionRawMutex, Self::EventType, { Self::EVENT_CHANNEL_SIZE } >;`
-    // So this size is commented out
-    // const EVENT_CHANNEL_SIZE: usize = 32;
-
     /// Starts the input device task.
     ///
     /// This asynchronous method should contain the main logic for the input device.
     /// It will be executed concurrently with other input devices using the `run_devices` macro.
     fn run(&mut self) -> impl Future<Output = ()>;
 
-    /// Get the event sender for the input device. All events should be send by this channel.
-    fn event_sender(&self) -> Sender<CriticalSectionRawMutex, Self::EventType, EVENT_CHANNEL_SIZE>;
+    /// Send the event from current input device to the input processor.
+    fn send_event(&mut self, event: Self::EventType) -> impl Future<Output = ()>;
 }
 
 /// The trait for input processors.
@@ -78,7 +64,7 @@ pub trait InputProcessor {
     type EventType;
 
     /// The report type that the input processor sends.
-    type ReportType;
+    type ReportType: AsInputReport;
 
     /// Process the incoming events, convert them to HID report [`KeyboardReportMessage`],
     /// then send the report to the USB/BLE.
@@ -88,20 +74,13 @@ pub trait InputProcessor {
     /// The input processor implementor should be aware of this.  
     fn process(&mut self, event: Self::EventType) -> impl Future<Output = ()>;
 
-    /// Get the input event channel  receiver for the input processor.
+    /// Get the input event.
     ///
-    /// The input processor receives events from this channel, processes the event,
-    /// then sends to the report channel.
-    fn event_receiver(
-        &self,
-    ) -> Receiver<CriticalSectionRawMutex, Self::EventType, EVENT_CHANNEL_SIZE>;
+    /// The read input event is processed by the input processor, converted to HID report, and sent to the HID writer.
+    fn read_event(&self) -> impl Future<Output = Self::EventType>;
 
-    /// Get the output report sender for the input processor.
-    ///
-    /// The input processor sends keyboard reports to this channel.
-    fn report_sender(
-        &self,
-    ) -> Sender<CriticalSectionRawMutex, Self::ReportType, REPORT_CHANNEL_SIZE>;
+    /// Send the processed report.
+    fn send_report(&self, report: Self::ReportType) -> impl Future<Output = ()>;
 
     /// Default implementation of the input processor. It wait for a new event from the event channel,
     /// then process the event.
@@ -110,7 +89,7 @@ pub trait InputProcessor {
     fn run(&mut self) -> impl Future<Output = ()> {
         async {
             loop {
-                let event = self.event_receiver().receive().await;
+                let event = self.read_event().await;
                 self.process(event).await;
             }
         }
diff --git a/rmk/src/input_device/rotary_encoder.rs b/rmk/src/input_device/rotary_encoder.rs
index f6219f32..33e767d3 100644
--- a/rmk/src/input_device/rotary_encoder.rs
+++ b/rmk/src/input_device/rotary_encoder.rs
@@ -1,18 +1,16 @@
 //! The rotary encoder implementation is adapted from: https://github.com/leshow/rotary-encoder-hal/blob/master/src/lib.rs
 
-use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
-use embassy_sync::channel::{Receiver, Sender};
 use embedded_hal::digital::InputPin;
 #[cfg(feature = "async_matrix")]
 use embedded_hal_async::digital::Wait;
 use postcard::experimental::max_size::MaxSize;
 use serde::{Deserialize, Serialize};
 
+use crate::channel::{EVENT_CHANNEL, KEYBOARD_REPORT_CHANNEL};
 use crate::event::{Event, RotaryEncoderEvent};
-use crate::keyboard::{KeyboardReportMessage, EVENT_CHANNEL, KEYBOARD_REPORT_CHANNEL};
-use crate::REPORT_CHANNEL_SIZE;
+use crate::hid::Report;
 
-use super::{InputDevice, InputProcessor, EVENT_CHANNEL_SIZE};
+use super::{InputDevice, InputProcessor};
 
 /// Holds current/old state and both [`InputPin`](https://docs.rs/embedded-hal/latest/embedded_hal/digital/trait.InputPin.html)
 #[derive(Clone, Debug)]
@@ -163,17 +161,16 @@ impl<
 
             let direction = self.update();
 
-            self.event_sender()
-                .send(Event::RotaryEncoder(RotaryEncoderEvent {
-                    id: self.id,
-                    direction,
-                }))
-                .await;
+            self.send_event(Event::RotaryEncoder(RotaryEncoderEvent {
+                id: self.id,
+                direction,
+            }))
+            .await;
         }
     }
 
-    fn event_sender(&self) -> Sender<CriticalSectionRawMutex, Self::EventType, EVENT_CHANNEL_SIZE> {
-        EVENT_CHANNEL.sender()
+    async fn send_event(&mut self, event: Self::EventType) {
+        EVENT_CHANNEL.sender().send(event).await
     }
 }
 
@@ -182,7 +179,7 @@ pub struct RotaryEncoderProcessor {}
 impl InputProcessor for RotaryEncoderProcessor {
     type EventType = Event;
 
-    type ReportType = KeyboardReportMessage;
+    type ReportType = Report;
 
     async fn process(&mut self, event: Self::EventType) {
         match event {
@@ -199,15 +196,11 @@ impl InputProcessor for RotaryEncoderProcessor {
         }
     }
 
-    fn event_receiver(
-        &self,
-    ) -> Receiver<CriticalSectionRawMutex, Self::EventType, EVENT_CHANNEL_SIZE> {
-        EVENT_CHANNEL.receiver()
+    async fn read_event(&self) -> Self::EventType {
+        EVENT_CHANNEL.receiver().receive().await
     }
 
-    fn report_sender(
-        &self,
-    ) -> Sender<CriticalSectionRawMutex, Self::ReportType, REPORT_CHANNEL_SIZE> {
-        KEYBOARD_REPORT_CHANNEL.sender()
+    async fn send_report(&self, report: Self::ReportType) {
+        KEYBOARD_REPORT_CHANNEL.sender().send(report).await
     }
 }
diff --git a/rmk/src/keyboard.rs b/rmk/src/keyboard.rs
index 4abd201a..ffdfa7aa 100644
--- a/rmk/src/keyboard.rs
+++ b/rmk/src/keyboard.rs
@@ -1,38 +1,22 @@
+use crate::channel::{KEYBOARD_REPORT_CHANNEL, KEY_EVENT_CHANNEL};
 use crate::combo::{Combo, COMBO_MAX_LENGTH};
-use crate::event::{Event, KeyEvent};
-use crate::CONNECTION_STATE;
+use crate::config::BehaviorConfig;
+use crate::event::KeyEvent;
+use crate::hid::Report;
+use crate::input_device::InputProcessor;
+use crate::usb::descriptor::KeyboardReport;
 use crate::{
     action::{Action, KeyAction},
-    hid::{ConnectionType, HidWriterWrapper},
     keyboard_macro::{MacroOperation, NUM_MACRO},
     keycode::{KeyCode, ModifierCombination},
     keymap::KeyMap,
-    usb::descriptor::{CompositeReport, CompositeReportType, ViaReport},
-    KEYBOARD_STATE,
+    usb::descriptor::ViaReport,
 };
 use core::cell::RefCell;
 use embassy_futures::{select::select, yield_now};
-use embassy_sync::{
-    blocking_mutex::raw::CriticalSectionRawMutex,
-    channel::{Channel, Receiver, Sender},
-};
 use embassy_time::{Instant, Timer};
 use heapless::{Deque, FnvIndexMap, Vec};
-use usbd_hid::descriptor::KeyboardReport;
-
-pub const EVENT_CHANNEL_SIZE: usize = 32;
-pub static KEY_EVENT_CHANNEL: Channel<CriticalSectionRawMutex, KeyEvent, EVENT_CHANNEL_SIZE> =
-    Channel::new();
-
-pub static EVENT_CHANNEL: Channel<CriticalSectionRawMutex, Event, EVENT_CHANNEL_SIZE> =
-    Channel::new();
-
-pub const REPORT_CHANNEL_SIZE: usize = 32;
-pub(crate) static KEYBOARD_REPORT_CHANNEL: Channel<
-    CriticalSectionRawMutex,
-    KeyboardReportMessage,
-    REPORT_CHANNEL_SIZE,
-> = Channel::new();
+use usbd_hid::descriptor::{MediaKeyboardReport, MouseReport, SystemControlReport};
 
 /// State machine for one shot keys
 #[derive(Default)]
@@ -58,61 +42,63 @@ impl<T> OneShotState<T> {
     }
 }
 
-/// Matrix scanning task sends this [KeyboardReportMessage] to communication task.
-pub enum KeyboardReportMessage {
-    /// Normal keyboard hid report
-    KeyboardReport(KeyboardReport),
-    /// Other types of keyboard reports: mouse + media(consumer) + system control
-    CompositeReport(CompositeReport, CompositeReportType),
-}
+impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize> InputProcessor
+    for Keyboard<'a, ROW, COL, NUM_LAYER>
+{
+    type EventType = KeyEvent;
 
-/// This task processes all keyboard reports and send them to the host
-pub(crate) async fn communication_task<'a, W: HidWriterWrapper, W2: HidWriterWrapper>(
-    receiver: &Receiver<'a, CriticalSectionRawMutex, KeyboardReportMessage, REPORT_CHANNEL_SIZE>,
-    keybooard_hid_writer: &mut W,
-    other_hid_writer: &mut W2,
-) {
-    // This delay is necessary otherwise this task will stuck at the first send when the USB is suspended
-    Timer::after_secs(2).await;
-    loop {
-        let report = receiver.receive().await;
-        // Only send the report after the connection is established.
-        if CONNECTION_STATE.load(core::sync::atomic::Ordering::Acquire) {
-            match report {
-                KeyboardReportMessage::KeyboardReport(report) => {
-                    match keybooard_hid_writer.write_serialize(&report).await {
-                        Ok(()) => {}
-                        Err(e) => error!("Send keyboard report error: {:?}", e),
-                    };
-                }
-                KeyboardReportMessage::CompositeReport(report, report_type) => {
-                    write_other_report_to_host(report, report_type, other_hid_writer).await;
-                }
+    type ReportType = Report;
+
+    /// Process key changes at (row, col)
+    async fn process(&mut self, key_event: Self::EventType) {
+        // Matrix should process key pressed event first, record the timestamp of key changes
+        if key_event.pressed {
+            self.timer[key_event.col as usize][key_event.row as usize] = Some(Instant::now());
+        }
+
+        // Process key
+        let key_action = self
+            .keymap
+            .borrow_mut()
+            .get_action_with_layer_cache(key_event);
+
+        if self.combo_on {
+            if let Some(key_action) = self.process_combo(key_action, key_event).await {
+                self.process_key_action(key_action, key_event).await;
             }
+        } else {
+            self.process_key_action(key_action, key_event).await;
         }
     }
-}
 
-pub(crate) async fn write_other_report_to_host<W: HidWriterWrapper>(
-    report: CompositeReport,
-    report_type: CompositeReportType,
-    other_hid_writer: &mut W,
-) {
-    let mut buf: [u8; 9] = [0; 9];
-    // Prepend report id
-    buf[0] = report_type as u8;
-    match report.serialize(&mut buf[1..], report_type) {
-        Ok(s) => {
-            #[cfg(feature = "defmt")]
-            debug!("Sending other report: {=[u8]:#X}", buf[0..s + 1]);
-            if let Err(e) = match other_hid_writer.get_conn_type() {
-                ConnectionType::Usb => other_hid_writer.write(&buf[0..s + 1]).await,
-                ConnectionType::Ble => other_hid_writer.write(&buf[1..s + 1]).await,
-            } {
-                error!("Send other report error: {:?}", e);
+    /// Main keyboard task, it receives input devices result, processes keys.
+    /// The report is sent to communication task via `KEYBOARD_REPORT_CHANNEL`, and finally sent to the host
+    async fn run(&mut self) -> () {
+        loop {
+            let key_event = self.read_event().await;
+
+            // Process the key change
+            self.process(key_event).await;
+
+            // After processing the key change, check if there are unprocessed events
+            // This will happen if there's recursion in key processing
+            loop {
+                if self.unprocessed_events.is_empty() {
+                    break;
+                }
+                // Process unprocessed events
+                let e = self.unprocessed_events.remove(0);
+                self.process(e).await;
             }
         }
-        Err(_) => error!("Serialize other report error"),
+    }
+
+    async fn read_event(&self) -> Self::EventType {
+        KEY_EVENT_CHANNEL.receiver().receive().await
+    }
+
+    async fn send_report(&self, report: Self::ReportType) {
+        KEYBOARD_REPORT_CHANNEL.sender().send(report).await
     }
 }
 
@@ -120,10 +106,6 @@ pub(crate) struct Keyboard<'a, const ROW: usize, const COL: usize, const NUM_LAY
     /// Keymap
     pub(crate) keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
 
-    /// Report Sender
-    pub(crate) sender:
-        &'a Sender<'a, CriticalSectionRawMutex, KeyboardReportMessage, REPORT_CHANNEL_SIZE>,
-
     /// Unprocessed events
     unprocessed_events: Vec<KeyEvent, 16>,
 
@@ -136,20 +118,29 @@ pub(crate) struct Keyboard<'a, const ROW: usize, const COL: usize, const NUM_LAY
     /// Record whether the keyboard is in hold-after-tap state
     hold_after_tap: [Option<KeyEvent>; 6],
 
+    /// Options for configurable action behavior
+    behavior: BehaviorConfig,
+
     /// One shot modifier state
     osm_state: OneShotState<ModifierCombination>,
 
     /// One shot layer state
     osl_state: OneShotState<u8>,
 
+    /// Registered key position
+    registered_keys: [Option<(u8, u8)>; 6],
+
     /// Keyboard internal hid report buf
     report: KeyboardReport,
 
-    /// Registered key position
-    registered_keys: [Option<(u8, u8)>; 6],
+    /// Internal mouse report buf
+    mouse_report: MouseReport,
 
-    /// Internal composite report: mouse + media(consumer) + system control
-    other_report: CompositeReport,
+    /// Internal media report buf
+    media_report: MediaKeyboardReport,
+
+    /// Internal system control report buf
+    system_control_report: SystemControlReport,
 
     /// Via report
     via_report: ViaReport,
@@ -176,11 +167,10 @@ impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
 {
     pub(crate) fn new(
         keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
-        sender: &'a Sender<'a, CriticalSectionRawMutex, KeyboardReportMessage, REPORT_CHANNEL_SIZE>,
+        behavior: BehaviorConfig,
     ) -> Self {
         Keyboard {
             keymap,
-            sender,
             timer: [[None; ROW]; COL],
             last_release: (
                 KeyEvent {
@@ -192,17 +182,21 @@ impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
                 None,
             ),
             hold_after_tap: Default::default(),
+            behavior,
             osm_state: OneShotState::default(),
             osl_state: OneShotState::default(),
             unprocessed_events: Vec::new(),
-            report: KeyboardReport {
-                modifier: 0,
-                reserved: 0,
-                leds: 0,
-                keycodes: [0; 6],
+            registered_keys: [None; 6],
+            report: KeyboardReport::default(),
+            mouse_report: MouseReport {
+                buttons: 0,
+                x: 0,
+                y: 0,
+                wheel: 0,
+                pan: 0,
             },
-            registered_keys: Default::default(),
-            other_report: CompositeReport::default(),
+            media_report: MediaKeyboardReport { usage_id: 0 },
+            system_control_report: SystemControlReport { usage_id: 0 },
             via_report: ViaReport {
                 input_data: [0; 32],
                 output_data: [0; 32],
@@ -216,92 +210,61 @@ impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
     }
 
     pub(crate) async fn send_keyboard_report(&mut self) {
-        self.sender
-            .send(KeyboardReportMessage::KeyboardReport(self.report))
-            .await;
+        self.send_report(Report::KeyboardReport(self.report)).await;
         // Yield once after sending the report to channel
         yield_now().await;
     }
 
     /// Send system control report if needed
     pub(crate) async fn send_system_control_report(&mut self) {
-        self.sender
-            .send(KeyboardReportMessage::CompositeReport(
-                self.other_report,
-                CompositeReportType::System,
-            ))
+        self.send_report(Report::SystemControlReport(self.system_control_report))
             .await;
-        self.other_report.system_usage_id = 0;
+        self.system_control_report.usage_id = 0;
         yield_now().await;
     }
 
     /// Send media report if needed
     pub(crate) async fn send_media_report(&mut self) {
-        self.sender
-            .send(KeyboardReportMessage::CompositeReport(
-                self.other_report,
-                CompositeReportType::Media,
-            ))
+        self.send_report(Report::MediaKeyboardReport(self.media_report))
             .await;
-        self.other_report.media_usage_id = 0;
+        self.media_report.usage_id = 0;
         yield_now().await;
     }
 
     /// Send mouse report if needed
     pub(crate) async fn send_mouse_report(&mut self) {
         // Prevent mouse report flooding, set maximum mouse report rate to 50 HZ
-        self.sender
-            .send(KeyboardReportMessage::CompositeReport(
-                self.other_report,
-                CompositeReportType::Mouse,
-            ))
+        self.send_report(Report::MouseReport(self.mouse_report))
             .await;
         yield_now().await;
     }
 
-    /// Main keyboard task, it receives input devices result, processes keys.
-    /// The report is sent to communication task via `KEYBOARD_REPORT_CHANNEL`, and finally sent to the host
-    /// TODO: make keyboard an `InputProcessor`
-    pub(crate) async fn run(&mut self) {
-        KEYBOARD_STATE.store(true, core::sync::atomic::Ordering::Release);
-        loop {
-            let key_event = KEY_EVENT_CHANNEL.receive().await;
-
-            // Process the key change
-            self.process_key_change(key_event).await;
-
-            // After processing the key change, check if there are unprocessed events
-            // This will happen if there's recursion in key processing
-            loop {
-                if self.unprocessed_events.is_empty() {
-                    break;
+    async fn update_osm(&mut self, key_event: KeyEvent) {
+        match self.osm_state {
+            OneShotState::Initial(m) => self.osm_state = OneShotState::Held(m),
+            OneShotState::Single(modifier) => {
+                if !key_event.pressed {
+                    let (keycodes, n) = modifier.to_modifier_keycodes();
+                    for kc in keycodes.iter().take(n) {
+                        self.process_action_keycode(*kc, key_event).await;
+                    }
+                    self.osm_state = OneShotState::None;
                 }
-                // Process unprocessed events
-                let e = self.unprocessed_events.remove(0);
-                self.process_key_change(e).await;
             }
+            _ => (),
         }
     }
 
-    /// Process key changes at (row, col)
-    async fn process_key_change(&mut self, key_event: KeyEvent) {
-        // Matrix should process key pressed event first, record the timestamp of key changes
-        if key_event.pressed {
-            self.timer[key_event.col as usize][key_event.row as usize] = Some(Instant::now());
-        }
-
-        // Process key
-        let key_action = self
-            .keymap
-            .borrow_mut()
-            .get_action_with_layer_cache(key_event);
-
-        if self.combo_on {
-            if let Some(key_action) = self.process_combo(key_action, key_event).await {
-                self.process_key_action(key_action, key_event).await;
+    fn update_osl(&mut self, key_event: KeyEvent) {
+        match self.osl_state {
+            OneShotState::Initial(l) => self.osl_state = OneShotState::Held(l),
+            OneShotState::Single(layer_num) => {
+                if key_event.pressed {
+                    self.keymap.borrow_mut().deactivate_layer(layer_num);
+                    self.osl_state = OneShotState::None;
+                }
             }
-        } else {
-            self.process_key_action(key_action, key_event).await;
+            _ => (),
         }
     }
 
@@ -415,35 +378,6 @@ impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
             .for_each(Combo::reset);
     }
 
-    async fn update_osm(&mut self, key_event: KeyEvent) {
-        match self.osm_state {
-            OneShotState::Initial(m) => self.osm_state = OneShotState::Held(m),
-            OneShotState::Single(modifier) => {
-                if !key_event.pressed {
-                    let (keycodes, n) = modifier.to_modifier_keycodes();
-                    for kc in keycodes.iter().take(n) {
-                        self.process_action_keycode(*kc, key_event).await;
-                    }
-                    self.osm_state = OneShotState::None;
-                }
-            }
-            _ => (),
-        }
-    }
-
-    fn update_osl(&mut self, key_event: KeyEvent) {
-        match self.osl_state {
-            OneShotState::Initial(l) => self.osl_state = OneShotState::Held(l),
-            OneShotState::Single(layer_num) => {
-                if key_event.pressed {
-                    self.keymap.borrow_mut().deactivate_layer(layer_num);
-                    self.osl_state = OneShotState::None;
-                }
-            }
-            _ => (),
-        }
-    }
-
     async fn process_key_action_normal(&mut self, action: Action, key_event: KeyEvent) {
         match action {
             Action::Key(key) => {
@@ -834,7 +768,7 @@ impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
             self.process_action_mouse(key, key_event).await;
         } else if key.is_user() {
             #[cfg(feature = "_nrf_ble")]
-            use crate::ble::nrf::profile::{BleProfileAction, BLE_PROFILE_CHANNEL};
+            use {crate::ble::nrf::profile::BleProfileAction, crate::channel::BLE_PROFILE_CHANNEL};
             #[cfg(feature = "_nrf_ble")]
             if !key_event.pressed {
                 // Get user key id
@@ -909,7 +843,7 @@ impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
     /// Process consumer control action. Consumer control keys are keys in hid consumer page, such as media keys.
     async fn process_action_consumer_control(&mut self, key: KeyCode, key_event: KeyEvent) {
         if key.is_consumer() {
-            self.other_report.media_usage_id = if key_event.pressed {
+            self.media_report.usage_id = if key_event.pressed {
                 key.as_consumer_control_usage_id() as u16
             } else {
                 0
@@ -924,11 +858,11 @@ impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
         if key.is_system() {
             if key_event.pressed {
                 if let Some(system_key) = key.as_system_control_usage_id() {
-                    self.other_report.system_usage_id = system_key as u8;
+                    self.system_control_report.usage_id = system_key as u8;
                     self.send_system_control_report().await;
                 }
             } else {
-                self.other_report.system_usage_id = 0;
+                self.system_control_report.usage_id = 0;
                 self.send_system_control_report().await;
             }
         }
@@ -952,36 +886,36 @@ impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
                     // TODO: Add accerated mode when pressing the mouse key
                     // https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md#accelerated-mode
                     KeyCode::MouseUp => {
-                        self.other_report.y = -self.mouse_key_move_delta;
+                        self.mouse_report.y = -self.mouse_key_move_delta;
                     }
                     KeyCode::MouseDown => {
-                        self.other_report.y = self.mouse_key_move_delta;
+                        self.mouse_report.y = self.mouse_key_move_delta;
                     }
                     KeyCode::MouseLeft => {
-                        self.other_report.x = -self.mouse_key_move_delta;
+                        self.mouse_report.x = -self.mouse_key_move_delta;
                     }
                     KeyCode::MouseRight => {
-                        self.other_report.x = self.mouse_key_move_delta;
+                        self.mouse_report.x = self.mouse_key_move_delta;
                     }
                     KeyCode::MouseWheelUp => {
-                        self.other_report.wheel = self.mouse_wheel_move_delta;
+                        self.mouse_report.wheel = self.mouse_wheel_move_delta;
                     }
                     KeyCode::MouseWheelDown => {
-                        self.other_report.wheel = -self.mouse_wheel_move_delta;
+                        self.mouse_report.wheel = -self.mouse_wheel_move_delta;
                     }
-                    KeyCode::MouseBtn1 => self.other_report.buttons |= 0b1,
-                    KeyCode::MouseBtn2 => self.other_report.buttons |= 0b10,
-                    KeyCode::MouseBtn3 => self.other_report.buttons |= 0b100,
-                    KeyCode::MouseBtn4 => self.other_report.buttons |= 0b1000,
-                    KeyCode::MouseBtn5 => self.other_report.buttons |= 0b10000,
-                    KeyCode::MouseBtn6 => self.other_report.buttons |= 0b100000,
-                    KeyCode::MouseBtn7 => self.other_report.buttons |= 0b1000000,
-                    KeyCode::MouseBtn8 => self.other_report.buttons |= 0b10000000,
+                    KeyCode::MouseBtn1 => self.mouse_report.buttons |= 0b1,
+                    KeyCode::MouseBtn2 => self.mouse_report.buttons |= 0b10,
+                    KeyCode::MouseBtn3 => self.mouse_report.buttons |= 0b100,
+                    KeyCode::MouseBtn4 => self.mouse_report.buttons |= 0b1000,
+                    KeyCode::MouseBtn5 => self.mouse_report.buttons |= 0b10000,
+                    KeyCode::MouseBtn6 => self.mouse_report.buttons |= 0b100000,
+                    KeyCode::MouseBtn7 => self.mouse_report.buttons |= 0b1000000,
+                    KeyCode::MouseBtn8 => self.mouse_report.buttons |= 0b10000000,
                     KeyCode::MouseWheelLeft => {
-                        self.other_report.pan = -self.mouse_wheel_move_delta;
+                        self.mouse_report.pan = -self.mouse_wheel_move_delta;
                     }
                     KeyCode::MouseWheelRight => {
-                        self.other_report.pan = self.mouse_wheel_move_delta;
+                        self.mouse_report.pan = self.mouse_wheel_move_delta;
                     }
                     KeyCode::MouseAccel0 => {}
                     KeyCode::MouseAccel1 => {}
@@ -991,25 +925,25 @@ impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
             } else {
                 match key {
                     KeyCode::MouseUp | KeyCode::MouseDown => {
-                        self.other_report.y = 0;
+                        self.mouse_report.y = 0;
                     }
                     KeyCode::MouseLeft | KeyCode::MouseRight => {
-                        self.other_report.x = 0;
+                        self.mouse_report.x = 0;
                     }
                     KeyCode::MouseWheelUp | KeyCode::MouseWheelDown => {
-                        self.other_report.wheel = 0;
+                        self.mouse_report.wheel = 0;
                     }
                     KeyCode::MouseWheelLeft | KeyCode::MouseWheelRight => {
-                        self.other_report.pan = 0;
+                        self.mouse_report.pan = 0;
                     }
-                    KeyCode::MouseBtn1 => self.other_report.buttons &= 0b0,
-                    KeyCode::MouseBtn2 => self.other_report.buttons &= 0b01,
-                    KeyCode::MouseBtn3 => self.other_report.buttons &= 0b011,
-                    KeyCode::MouseBtn4 => self.other_report.buttons &= 0b0111,
-                    KeyCode::MouseBtn5 => self.other_report.buttons &= 0b01111,
-                    KeyCode::MouseBtn6 => self.other_report.buttons &= 0b011111,
-                    KeyCode::MouseBtn7 => self.other_report.buttons &= 0b0111111,
-                    KeyCode::MouseBtn8 => self.other_report.buttons &= 0b01111111,
+                    KeyCode::MouseBtn1 => self.mouse_report.buttons &= 0b0,
+                    KeyCode::MouseBtn2 => self.mouse_report.buttons &= 0b01,
+                    KeyCode::MouseBtn3 => self.mouse_report.buttons &= 0b011,
+                    KeyCode::MouseBtn4 => self.mouse_report.buttons &= 0b0111,
+                    KeyCode::MouseBtn5 => self.mouse_report.buttons &= 0b01111,
+                    KeyCode::MouseBtn6 => self.mouse_report.buttons &= 0b011111,
+                    KeyCode::MouseBtn7 => self.mouse_report.buttons &= 0b0111111,
+                    KeyCode::MouseBtn8 => self.mouse_report.buttons &= 0b01111111,
                     _ => {}
                 }
             }
diff --git a/rmk/src/lib.rs b/rmk/src/lib.rs
index 6989d4ef..f418c9d2 100644
--- a/rmk/src/lib.rs
+++ b/rmk/src/lib.rs
@@ -17,59 +17,74 @@ include!(concat!(env!("OUT_DIR"), "/constants.rs"));
 // This mod MUST go first, so that the others see its macros.
 pub(crate) mod fmt;
 
-#[cfg(feature = "_esp_ble")]
-use crate::ble::esp::initialize_esp_ble_keyboard_with_config_and_run;
-#[cfg(feature = "_nrf_ble")]
-use crate::ble::nrf::initialize_nrf_ble_keyboard_and_run;
-use crate::config::RmkConfig;
+use crate::config::KeyboardConfig;
 #[cfg(not(feature = "rapid_debouncer"))]
 use crate::debounce::default_bouncer::DefaultDebouncer;
 #[cfg(feature = "rapid_debouncer")]
 use crate::debounce::fast_debouncer::RapidDebouncer;
-use crate::{
-    light::{led_hid_task, LightService},
-    via::vial_task,
-};
+use crate::input_device::InputProcessor;
+use crate::light::LightController;
 use action::KeyAction;
+use config::{RmkConfig, VialConfig};
 use core::{
     cell::RefCell,
+    future::Future,
     sync::atomic::{AtomicBool, AtomicU8},
 };
 use debounce::DebouncerTrait;
 #[cfg(not(feature = "_esp_ble"))]
 use embassy_executor::Spawner;
 use embassy_futures::select::{select, select4, Either4};
-pub use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, channel::*};
+#[cfg(not(any(cortex_m)))]
+pub use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex as RawMutex, channel::*};
+// #[cfg(all(target_arch = "arm", target_os = "none"))]
+#[cfg(any(cortex_m))]
+pub use embassy_sync::{blocking_mutex::raw::ThreadModeRawMutex as RawMutex, channel::*};
 use embassy_time::Timer;
 use embassy_usb::driver::Driver;
+use embassy_usb::UsbDevice;
 pub use embedded_hal;
 use embedded_hal::digital::{InputPin, OutputPin};
 #[cfg(feature = "async_matrix")]
 use embedded_hal_async::digital::Wait;
 #[cfg(not(feature = "_no_external_storage"))]
 use embedded_storage::nor_flash::NorFlash;
-pub use flash::EmptyFlashWrapper;
-use futures::pin_mut;
+use embedded_storage_async::nor_flash::NorFlash as AsyncNorFlash;
 pub use heapless;
-use keyboard::{communication_task, Keyboard, KeyboardReportMessage, KEYBOARD_REPORT_CHANNEL};
-pub use keyboard::{EVENT_CHANNEL, EVENT_CHANNEL_SIZE, REPORT_CHANNEL_SIZE};
+use hid::{HidReaderTrait, HidWriterTrait, RunnableHidWriter};
+use keyboard::Keyboard;
 use keymap::KeyMap;
+use light::{LedIndicator, LightService};
 use matrix::{Matrix, MatrixTrait};
 pub use rmk_macro as macros;
-use usb::KeyboardUsbDevice;
-use via::process::VialService;
-#[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))]
-use {embedded_storage_async::nor_flash::NorFlash as AsyncNorFlash, storage::Storage};
+pub use storage::dummy_flash::DummyFlash;
+use storage::Storage;
+use usb::descriptor::ViaReport;
+use via::VialService;
+#[cfg(feature = "_esp_ble")]
+use {crate::ble::esp::run_esp_ble_keyboard, esp_idf_svc::partition::EspPartition};
+#[cfg(feature = "_nrf_ble")]
+use {
+    crate::ble::nrf::{initialize_nrf_sd_and_flash, run_nrf_ble_keyboard},
+    nrf_softdevice::Softdevice,
+};
+#[cfg(all(not(feature = "_nrf_ble"), not(feature = "_no_usb")))]
+use {
+    crate::light::UsbLedReader,
+    crate::usb::descriptor::{CompositeReport, KeyboardReport},
+    crate::usb::{new_usb_builder, UsbKeyboardWriter},
+    crate::via::UsbVialReaderWriter,
+};
 
 pub mod action;
 #[cfg(feature = "_ble")]
 pub mod ble;
+pub mod channel;
 pub mod combo;
 pub mod config;
 pub mod debounce;
 pub mod direct_pin;
 pub mod event;
-mod flash;
 mod hid;
 pub mod input_device;
 pub mod keyboard;
@@ -82,11 +97,10 @@ pub mod matrix;
 #[cfg(feature = "split")]
 pub mod split;
 mod storage;
+#[macro_use]
 mod usb;
 mod via;
 
-/// Keyboard state, true for started, false for stopped
-pub(crate) static KEYBOARD_STATE: AtomicBool = AtomicBool::new(false);
 /// Current connection type:
 /// - 0: USB
 /// - 1: BLE
@@ -105,7 +119,7 @@ pub(crate) static CONNECTION_STATE: AtomicBool = AtomicBool::new(false);
 /// * `usb_driver` - (optional) embassy usb driver instance. Some microcontrollers would enable the `_no_usb` feature implicitly, which eliminates this argument
 /// * `flash` - (optional) flash storage, which is used for storing keymap and keyboard configs. Some microcontrollers would enable the `_no_external_storage` feature implicitly, which eliminates this argument
 /// * `default_keymap` - default keymap definition
-/// * `keyboard_config` - other configurations of the keyboard, check [RmkConfig] struct for details
+/// * `keyboard_config` - other configurations of the keyboard, check [KeyboardConfig] struct for details
 /// * `spawner`: (optional) embassy spawner used to spawn async tasks. This argument is enabled for non-esp microcontrollers
 pub async fn run_rmk<
     #[cfg(feature = "async_matrix")] In: Wait + InputPin,
@@ -124,21 +138,19 @@ pub async fn run_rmk<
     #[cfg(not(feature = "_no_usb"))] usb_driver: D,
     #[cfg(not(feature = "_no_external_storage"))] flash: F,
     default_keymap: &mut [[[KeyAction; COL]; ROW]; NUM_LAYER],
-
-    keyboard_config: RmkConfig<'static, Out>,
+    keyboard_config: KeyboardConfig<'static, Out>,
     #[cfg(not(feature = "_esp_ble"))] spawner: Spawner,
 ) -> ! {
     // Wrap `embedded-storage` to `embedded-storage-async`
     #[cfg(not(feature = "_no_external_storage"))]
-    let async_flash = embassy_embedded_hal::adapter::BlockingAsync::new(flash);
-
+    let flash = embassy_embedded_hal::adapter::BlockingAsync::new(flash);
     run_rmk_with_async_flash(
         input_pins,
         output_pins,
         #[cfg(not(feature = "_no_usb"))]
         usb_driver,
         #[cfg(not(feature = "_no_external_storage"))]
-        async_flash,
+        flash,
         default_keymap,
         keyboard_config,
         #[cfg(not(feature = "_esp_ble"))]
@@ -156,10 +168,9 @@ pub async fn run_rmk<
 /// * `usb_driver` - (optional) embassy usb driver instance. Some microcontrollers would enable the `_no_usb` feature implicitly, which eliminates this argument
 /// * `flash` - (optional) async flash storage, which is used for storing keymap and keyboard configs. Some microcontrollers would enable the `_no_external_storage` feature implicitly, which eliminates this argument
 /// * `default_keymap` - default keymap definition
-/// * `keyboard_config` - other configurations of the keyboard, check [RmkConfig] struct for details
+/// * `keyboard_config` - other configurations of the keyboard, check [KeyboardConfig] struct for details
 /// * `spawner`: (optional) embassy spawner used to spawn async tasks. This argument is enabled for non-esp microcontrollers
 #[allow(unused_variables)]
-#[allow(unreachable_code)]
 pub async fn run_rmk_with_async_flash<
     #[cfg(feature = "async_matrix")] In: Wait + InputPin,
     #[cfg(not(feature = "async_matrix"))] In: InputPin,
@@ -177,10 +188,37 @@ pub async fn run_rmk_with_async_flash<
     #[cfg(not(feature = "_no_usb"))] usb_driver: D,
     #[cfg(not(feature = "_no_external_storage"))] flash: F,
     default_keymap: &mut [[[KeyAction; COL]; ROW]; NUM_LAYER],
-
-    keyboard_config: RmkConfig<'static, Out>,
+    keyboard_config: KeyboardConfig<'static, Out>,
     #[cfg(not(feature = "_esp_ble"))] spawner: Spawner,
 ) -> ! {
+    let rmk_config = keyboard_config.rmk_config;
+    #[cfg(feature = "_nrf_ble")]
+    let (sd, flash) =
+        initialize_nrf_sd_and_flash(rmk_config.usb_config.product_name, spawner, None);
+
+    #[cfg(feature = "_esp_ble")]
+    let flash = {
+        let f = unsafe {
+            EspPartition::new("rmk")
+                .expect("Create storage partition error")
+                .expect("Empty partition")
+        };
+        let async_flash = embassy_embedded_hal::adapter::BlockingAsync::new(f);
+        async_flash
+    };
+
+    let mut storage = Storage::new(flash, default_keymap, rmk_config.storage_config).await;
+    let keymap = RefCell::new(
+        KeyMap::new_from_storage(
+            default_keymap,
+            Some(&mut storage),
+            rmk_config.behavior_config.clone(),
+        )
+        .await,
+    );
+    let keyboard = Keyboard::new(&keymap, rmk_config.behavior_config.clone());
+    let light_controller = LightController::new(keyboard_config.controller_config.light_config);
+
     // Create the debouncer, use COL2ROW by default
     #[cfg(all(feature = "col2row", feature = "rapid_debouncer"))]
     let debouncer = RapidDebouncer::<ROW, COL>::new();
@@ -189,7 +227,7 @@ pub async fn run_rmk_with_async_flash<
     #[cfg(all(not(feature = "col2row"), feature = "rapid_debouncer"))]
     let debouncer = RapidDebouncer::<COL, ROW>::new();
     #[cfg(all(not(feature = "col2row"), not(feature = "rapid_debouncer")))]
-    let debouncer = DefaultDebouncer::<COL, ROW>::new();
+    let debouncer: DefaultDebouncer<COL, ROW> = DefaultDebouncer::<COL, ROW>::new();
 
     // Keyboard matrix, use COL2ROW by default
     #[cfg(feature = "col2row")]
@@ -197,222 +235,166 @@ pub async fn run_rmk_with_async_flash<
     #[cfg(not(feature = "col2row"))]
     let matrix = Matrix::<_, _, _, COL, ROW>::new(input_pins, output_pins, debouncer);
 
-    run_rmk_with_async_flash_and_matrix(
-        matrix,
+    run_rmk_internal(
+        matrix,   // matrix input device
+        keyboard, // key processor
+        &keymap,
         #[cfg(not(feature = "_no_usb"))]
         usb_driver,
-        #[cfg(not(feature = "_no_external_storage"))]
-        flash,
-        default_keymap,
-        keyboard_config,
-        #[cfg(not(feature = "_esp_ble"))]
-        spawner,
+        storage,
+        light_controller,
+        rmk_config,
+        #[cfg(feature = "_nrf_ble")]
+        sd,
     )
-    .await;
+    .await
 }
 
-/// Run RMK keyboard service. This function should never return.
-///
-/// # Arguments
-///
-/// * `matrix` - the matrix scanning implementation to use.
-/// * `usb_driver` - (optional) embassy usb driver instance. Some microcontrollers would enable the `_no_usb` feature implicitly, which eliminates this argument
-/// * `flash` - (optional) async flash storage, which is used for storing keymap and keyboard configs. Some microcontrollers would enable the `_no_external_storage` feature implicitly, which eliminates this argument
-/// * `default_keymap` - default keymap definition
-/// * `keyboard_config` - other configurations of the keyboard, check [RmkConfig] struct for details
-/// * `spawner`: (optional) embassy spawner used to spawn async tasks. This argument is enabled for non-esp microcontrollers
-#[allow(unused_variables)]
 #[allow(unreachable_code)]
-pub async fn run_rmk_with_async_flash_and_matrix<
-    Out: OutputPin,
+pub(crate) async fn run_rmk_internal<
+    'a,
     M: MatrixTrait,
+    F: AsyncNorFlash,
     #[cfg(not(feature = "_no_usb"))] D: Driver<'static>,
-    #[cfg(not(feature = "_no_external_storage"))] F: AsyncNorFlash,
+    Out: OutputPin,
     const ROW: usize,
     const COL: usize,
     const NUM_LAYER: usize,
 >(
-    matrix: M,
+    mut matrix: M,
+    mut keyboard: Keyboard<'a, ROW, COL, NUM_LAYER>,
+    keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
     #[cfg(not(feature = "_no_usb"))] usb_driver: D,
-    #[cfg(not(feature = "_no_external_storage"))] flash: F,
-    default_keymap: &mut [[[KeyAction; COL]; ROW]; NUM_LAYER],
-
-    keyboard_config: RmkConfig<'static, Out>,
-    #[cfg(not(feature = "_esp_ble"))] spawner: Spawner,
+    mut storage: Storage<F, ROW, COL, NUM_LAYER>,
+    mut light_controller: LightController<Out>,
+    rmk_config: RmkConfig<'static>,
+    #[cfg(feature = "_nrf_ble")] sd: &mut Softdevice,
 ) -> ! {
-    // Dispatch according to chip and communication type
+    // Dispatch the keyboard runner
     #[cfg(feature = "_nrf_ble")]
-    initialize_nrf_ble_keyboard_and_run(
-        matrix,
+    run_nrf_ble_keyboard(
+        keymap,
+        &mut keyboard,
+        &mut matrix,
+        &mut storage,
         #[cfg(not(feature = "_no_usb"))]
         usb_driver,
-        default_keymap,
-        keyboard_config,
-        None,
-        spawner,
+        &mut light_controller,
+        rmk_config,
+        sd,
     )
     .await;
 
     #[cfg(feature = "_esp_ble")]
-    initialize_esp_ble_keyboard_with_config_and_run(matrix, default_keymap, keyboard_config).await;
-
-    #[cfg(all(
-        not(feature = "_no_usb"),
-        not(any(feature = "_nrf_ble", feature = "_esp_ble"))
-    ))]
-    initialize_usb_keyboard_and_run(
-        matrix,
+    run_esp_ble_keyboard(
+        keymap,
+        &mut keyboard,
+        &mut matrix,
+        &mut storage,
+        #[cfg(not(feature = "_no_usb"))]
         usb_driver,
-        #[cfg(not(feature = "_no_external_storage"))]
-        flash,
-        default_keymap,
-        keyboard_config,
+        &mut light_controller,
+        rmk_config,
     )
     .await;
 
-    // The fut should never return.
-    // If there's no fut, the feature flags must not be correct.
-    panic!("The run_rmk should never return");
-}
-
-pub async fn initialize_usb_keyboard_and_run<
-    Out: OutputPin,
-    D: Driver<'static>,
-    M: MatrixTrait,
-    #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))] F: AsyncNorFlash,
-    const ROW: usize,
-    const COL: usize,
-    const NUM_LAYER: usize,
->(
-    mut matrix: M,
-    usb_driver: D,
-    #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))] flash: F,
-    default_keymap: &mut [[[KeyAction; COL]; ROW]; NUM_LAYER],
-
-    keyboard_config: RmkConfig<'static, Out>,
-) -> ! {
-    // Initialize storage and keymap
-    // For USB keyboard, the "external" storage means the storage initialized by the user.
-    #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))]
-    let (mut storage, keymap) = {
-        let mut s = Storage::new(flash, default_keymap, keyboard_config.storage_config).await;
-        let keymap = RefCell::new(
-            KeyMap::new_from_storage(
-                default_keymap,
-                Some(&mut s),
-                keyboard_config.behavior_config,
+    // USB keyboard
+    #[cfg(all(
+        not(feature = "_nrf_ble"),
+        not(feature = "_no_usb"),
+        not(feature = "_esp_ble")
+    ))]
+    {
+        let mut usb_builder: embassy_usb::Builder<'_, D> =
+            new_usb_builder(usb_driver, rmk_config.usb_config);
+        let keyboard_reader_writer = add_usb_reader_writer!(&mut usb_builder, KeyboardReport, 1, 8);
+        let mut other_writer = register_usb_writer!(&mut usb_builder, CompositeReport, 9);
+        let mut vial_reader_writer = add_usb_reader_writer!(&mut usb_builder, ViaReport, 32, 32);
+        let (mut keyboard_reader, mut keyboard_writer) = keyboard_reader_writer.split();
+        let mut usb_device = usb_builder.build();
+        // Run all tasks, if one of them fails, wait 1 second and then restart
+        loop {
+            run_keyboard(
+                keymap,
+                &mut keyboard,
+                &mut matrix,
+                &mut storage,
+                run_usb_device(&mut usb_device),
+                &mut light_controller,
+                UsbLedReader::new(&mut keyboard_reader),
+                UsbVialReaderWriter::new(&mut vial_reader_writer),
+                UsbKeyboardWriter::new(&mut keyboard_writer, &mut other_writer),
+                rmk_config.vial_config,
             )
-            .await,
-        );
-        (s, keymap)
-    };
-    #[cfg(all(not(feature = "_nrf_ble"), feature = "_no_external_storage"))]
-    let keymap = RefCell::new(
-        KeyMap::<ROW, COL, NUM_LAYER>::new(default_keymap, keyboard_config.behavior_config).await,
-    );
-
-    let keyboard_report_sender = KEYBOARD_REPORT_CHANNEL.sender();
-    let keyboard_report_receiver = KEYBOARD_REPORT_CHANNEL.receiver();
-
-    // Create keyboard services and devices
-    let (mut keyboard, mut usb_device, mut vial_service, mut light_service) = (
-        Keyboard::new(&keymap, &keyboard_report_sender),
-        KeyboardUsbDevice::new(usb_driver, keyboard_config.usb_config),
-        VialService::new(&keymap, keyboard_config.vial_config),
-        LightService::from_config(keyboard_config.light_config),
-    );
+            .await;
+        }
+    }
 
-    KEYBOARD_STATE.store(false, core::sync::atomic::Ordering::Release);
-    // Run all tasks, if one of them fails, wait 1 second and then restart
-    run_usb_keyboard(
-        &mut usb_device,
-        &mut keyboard,
-        &mut matrix,
-        #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))]
-        &mut storage,
-        &mut light_service,
-        &mut vial_service,
-        &keyboard_report_receiver,
-    )
-    .await
+    unreachable!("Should never reach here, wrong feature gate combination?");
 }
 
-// Run usb keyboard task for once
-pub(crate) async fn run_usb_keyboard<
+// Run keyboard task for once
+pub(crate) async fn run_keyboard<
     'a,
-    'b,
-    D: Driver<'a>,
     M: MatrixTrait,
-    #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))] F: AsyncNorFlash,
+    Rw: HidReaderTrait<ReportType = ViaReport> + HidWriterTrait<ReportType = ViaReport>,
+    R: HidReaderTrait<ReportType = LedIndicator>,
+    W: RunnableHidWriter,
+    Fu: Future<Output = ()>,
+    F: AsyncNorFlash,
     Out: OutputPin,
     const ROW: usize,
     const COL: usize,
     const NUM_LAYER: usize,
 >(
-    usb_device: &mut KeyboardUsbDevice<'a, D>,
-    keyboard: &mut Keyboard<'b, ROW, COL, NUM_LAYER>,
+    keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
+    keyboard: &mut Keyboard<'a, ROW, COL, NUM_LAYER>,
     matrix: &mut M,
-    #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))] storage: &mut Storage<
-        F,
-        ROW,
-        COL,
-        NUM_LAYER,
-    >,
-    light_service: &mut LightService<Out>,
-    vial_service: &mut VialService<'b, ROW, COL, NUM_LAYER>,
-    keyboard_report_receiver: &Receiver<
-        'b,
-        CriticalSectionRawMutex,
-        KeyboardReportMessage,
-        REPORT_CHANNEL_SIZE,
-    >,
-) -> ! {
-    loop {
-        CONNECTION_STATE.store(false, core::sync::atomic::Ordering::Release);
-        let usb_fut = usb_device.device.run();
-        let keyboard_fut = keyboard.run();
-        let matrix_fut = matrix.run();
-        let communication_fut = communication_task(
-            keyboard_report_receiver,
-            &mut usb_device.keyboard_hid_writer,
-            &mut usb_device.other_hid_writer,
-        );
-        let led_fut = led_hid_task(&mut usb_device.keyboard_hid_reader, light_service);
-        let via_fut = vial_task(&mut usb_device.via_hid, vial_service);
+    storage: &mut Storage<F, ROW, COL, NUM_LAYER>,
+    communication_task: Fu,
+    light_controller: &mut LightController<Out>,
+    led_reader: R,
+    vial_reader_writer: Rw,
+    mut keyboard_writer: W,
+    vial_config: VialConfig<'static>,
+) {
+    // The state will be changed to true after the keyboard starts running
+    CONNECTION_STATE.store(false, core::sync::atomic::Ordering::Release);
+    let keyboard_fut = keyboard.run();
+    let matrix_fut = matrix.run();
+    let writer_fut = keyboard_writer.run_writer();
+    let mut light_service = LightService::new(light_controller, led_reader);
+    let mut vial_service = VialService::new(&keymap, vial_config, vial_reader_writer);
 
-        pin_mut!(usb_fut);
-        pin_mut!(keyboard_fut);
-        pin_mut!(matrix_fut);
-        pin_mut!(led_fut);
-        pin_mut!(via_fut);
-        pin_mut!(communication_fut);
+    let led_fut = light_service.run();
+    let via_fut = vial_service.run();
 
-        #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))]
-        let storage_fut = storage.run();
-        #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))]
-        pin_mut!(storage_fut);
+    #[cfg(any(feature = "_ble", not(feature = "_no_external_storage")))]
+    let storage_fut = storage.run();
 
-        match select4(
-            select(usb_fut, keyboard_fut),
-            #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))]
-            select(storage_fut, via_fut),
-            #[cfg(all(not(feature = "_nrf_ble"), feature = "_no_external_storage"))]
-            #[cfg(feature = "_no_external_storage")]
-            via_fut,
-            led_fut,
-            select(matrix_fut, communication_fut),
-        )
-        .await
-        {
-            Either4::First(_) => error!("Usb or keyboard task has died"),
-            Either4::Second(_) => error!("Storage or vial task has died"),
-            Either4::Third(_) => error!("Led task has died"),
-            Either4::Fourth(_) => error!("Communication task has died"),
-        }
-
-        warn!("Detected failure, restarting keyboard sevice after 1 second");
-        Timer::after_secs(1).await;
+    match select4(
+        select(communication_task, keyboard_fut),
+        #[cfg(any(feature = "_ble", not(feature = "_no_external_storage")))]
+        select(storage_fut, via_fut),
+        #[cfg(all(not(feature = "_ble"), feature = "_no_external_storage"))]
+        via_fut,
+        led_fut,
+        select(matrix_fut, writer_fut),
+    )
+    .await
+    {
+        Either4::First(_) => error!("Communication or keyboard task has died"),
+        Either4::Second(_) => error!("Storage or vial task has died"),
+        Either4::Third(_) => error!("Led task has died"),
+        Either4::Fourth(_) => error!("Matrix or writer task has died"),
     }
+
+    warn!("Detected failure, restarting keyboard sevice after 1 second");
+    Timer::after_secs(1).await;
+}
+
+pub(crate) async fn run_usb_device<'d, D: Driver<'d>>(usb_device: &mut UsbDevice<'d, D>) {
+    usb_device.run().await;
 }
 
 pub(crate) fn reboot_keyboard() {
@@ -428,3 +410,9 @@ pub(crate) fn reboot_keyboard() {
     #[cfg(feature = "_esp_ble")]
     esp_idf_svc::hal::reset::restart();
 }
+
+/// Runnable trait defines `run` function for running the task
+pub trait Runnable {
+    /// Run function
+    fn run(&mut self) -> impl Future<Output = ()>;
+}
diff --git a/rmk/src/light.rs b/rmk/src/light.rs
index 132b9ca7..c296662d 100644
--- a/rmk/src/light.rs
+++ b/rmk/src/light.rs
@@ -1,70 +1,16 @@
-use crate::config::{LightConfig, LightPinConfig};
-use crate::hid::HidReaderWrapper;
+use crate::{
+    config::{LightConfig, LightPinConfig},
+    hid::{HidError, HidReaderTrait},
+};
 use bitfield_struct::bitfield;
-use embassy_futures::select::select;
-use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, channel::Channel};
+use embassy_usb::{class::hid::HidReader, driver::Driver};
 use embedded_hal::digital::{Error, OutputPin, PinState};
-
-pub(crate) static LED_CHANNEL: Channel<CriticalSectionRawMutex, LedIndicator, 8> = Channel::new();
-
-/// LED control task
-pub(crate) async fn led_service_task<P: OutputPin>(light_service: &mut LightService<P>) {
-    loop {
-        let led_indicator = LED_CHANNEL.receive().await;
-        if light_service.enabled {
-            if let Err(e) = light_service.set_leds(led_indicator) {
-                error!("Set led error {:?}", e.kind());
-                // If there's an error, wait for a while
-                embassy_time::Timer::after_millis(500).await;
-            }
-        } else {
-            warn!("Led service is not enabled but led_service_task is started, this should not happen!");
-        }
-    }
-}
-
-/// Check led indicator and send the led status to LED channel
-///
-/// If there's an error, print a message and ignore error types
-pub(crate) async fn hid_read_led<R: HidReaderWrapper>(keyboard_hid_reader: &mut R) -> ! {
-    loop {
-        let mut led_indicator_data = [0; 1];
-        match keyboard_hid_reader.read(&mut led_indicator_data).await {
-            Ok(_) => {
-                // Read led indicator data and send to LED channel
-                let indicator = LedIndicator::from_bits(led_indicator_data[0]);
-                debug!("Read keyboard state: {:?}", indicator);
-                LED_CHANNEL.send(indicator).await;
-            }
-            Err(e) => {
-                error!("Read keyboard state error: {:?}", e);
-                embassy_time::Timer::after_secs(1).await;
-            }
-        }
-    }
-}
-
-pub(crate) async fn led_hid_task<R: HidReaderWrapper, Out: OutputPin>(
-    keyboard_hid_reader: &mut R,
-    light_service: &mut LightService<Out>,
-) {
-    if !light_service.enabled {
-        loop {
-            embassy_time::Timer::after_secs(u32::MAX as u64).await;
-        }
-    } else {
-        select(
-            hid_read_led(keyboard_hid_reader),
-            led_service_task(light_service),
-        )
-        .await;
-    }
-}
+use serde::{Deserialize, Serialize};
 
 #[bitfield(u8)]
-#[derive(Eq, PartialEq)]
+#[derive(Eq, PartialEq, Serialize, Deserialize)]
 #[cfg_attr(feature = "defmt", derive(defmt::Format))]
-pub(crate) struct LedIndicator {
+pub struct LedIndicator {
     #[bits(1)]
     numslock: bool,
     #[bits(1)]
@@ -81,10 +27,57 @@ pub(crate) struct LedIndicator {
     _reserved: u8,
 }
 
+pub(crate) struct LightService<'d, P: OutputPin, R: HidReaderTrait<ReportType = LedIndicator>> {
+    pub(crate) enabled: bool,
+    light_controller: &'d mut LightController<P>,
+    reader: R,
+}
+
+impl<'d, P: OutputPin, R: HidReaderTrait<ReportType = LedIndicator>> LightService<'d, P, R> {
+    pub(crate) fn new(light_controller: &'d mut LightController<P>, reader: R) -> Self {
+        Self {
+            enabled: false,
+            light_controller,
+            reader,
+        }
+    }
+
+    pub(crate) async fn run(&mut self) {
+        loop {
+            if self.enabled {
+                match self.reader.read_report().await {
+                    Ok(indicator) => {
+                        // Read led indicator data and send to LED channel
+                        debug!("Read keyboard state: {:?}", indicator);
+                        if let Err(e) = self.light_controller.set_leds(indicator) {
+                            error!("Send led error {:?}", e.kind());
+                            // If there's an error, wait for a while
+                            embassy_time::Timer::after_millis(500).await;
+                        }
+                    }
+                    Err(e) => {
+                        error!("Read led error {:?}", e);
+                        embassy_time::Timer::after_secs(1).await;
+                    }
+                }
+            } else {
+                // Check service state after 1s
+                embassy_time::Timer::after_secs(1).await;
+            }
+        }
+    }
+}
+
+pub(crate) struct LightController<P: OutputPin> {
+    capslock: Option<SingleLed<P>>,
+    scrolllock: Option<SingleLed<P>>,
+    numslock: Option<SingleLed<P>>,
+}
+
 /// A single LED
 ///
 /// In general, a single LED can be used for capslock/numslock, or in a LED matrix.
-struct SingleLED<P: OutputPin> {
+struct SingleLed<P: OutputPin> {
     /// On/Off state
     state: bool,
 
@@ -101,7 +94,7 @@ struct SingleLED<P: OutputPin> {
     period: u8,
 }
 
-impl<P: OutputPin> SingleLED<P> {
+impl<P: OutputPin> SingleLed<P> {
     fn new(p: LightPinConfig<P>) -> Self {
         let on_state = if p.low_active {
             PinState::Low
@@ -137,12 +130,28 @@ impl<P: OutputPin> SingleLED<P> {
     }
 }
 
-pub(crate) struct LightService<P: OutputPin> {
-    pub(crate) enabled: bool,
-    led_indicator_data: [u8; 1],
-    capslock: Option<SingleLED<P>>,
-    scrolllock: Option<SingleLED<P>>,
-    numslock: Option<SingleLED<P>>,
+pub(crate) struct UsbLedReader<'a, 'd, D: Driver<'d>> {
+    hid_reader: &'a mut HidReader<'d, D, 1>,
+}
+
+impl<'a, 'd, D: Driver<'d>> UsbLedReader<'a, 'd, D> {
+    pub(crate) fn new(hid_reader: &'a mut HidReader<'d, D, 1>) -> Self {
+        Self { hid_reader }
+    }
+}
+
+impl<'a, 'd, D: Driver<'d>> HidReaderTrait for UsbLedReader<'a, 'd, D> {
+    type ReportType = LedIndicator;
+
+    async fn read_report(&mut self) -> Result<Self::ReportType, HidError> {
+        let mut buf = [0u8; 1];
+        self.hid_reader
+            .read(&mut buf)
+            .await
+            .map_err(|e| HidError::UsbReadError(e))?;
+
+        Ok(LedIndicator::from_bits(buf[0]))
+    }
 }
 
 // Implement on/off function for LightService
@@ -161,44 +170,15 @@ macro_rules! impl_led_on_off {
     };
 }
 
-impl<P: OutputPin> LightService<P> {
-    pub(crate) fn new(
-        capslock_pin: Option<LightPinConfig<P>>,
-        scrolllock_pin: Option<LightPinConfig<P>>,
-        numslock_pin: Option<LightPinConfig<P>>,
-    ) -> Self {
-        let mut enabled = true;
-        if capslock_pin.is_none() && scrolllock_pin.is_none() && numslock_pin.is_none() {
-            enabled = false;
-        }
+impl<P: OutputPin> LightController<P> {
+    pub(crate) fn new(light_config: LightConfig<P>) -> Self {
         Self {
-            enabled,
-            led_indicator_data: [0; 1],
-            capslock: capslock_pin.map(|p| SingleLED::new(p)),
-            scrolllock: scrolllock_pin.map(|p| SingleLED::new(p)),
-            numslock: numslock_pin.map(|p| SingleLED::new(p)),
+            capslock: light_config.capslock.map(|p| SingleLed::new(p)),
+            scrolllock: light_config.scrolllock.map(|p| SingleLed::new(p)),
+            numslock: light_config.numslock.map(|p| SingleLed::new(p)),
         }
     }
 
-    pub(crate) fn from_config(light_config: LightConfig<P>) -> Self {
-        let mut enabled = true;
-        if light_config.capslock.is_none()
-            && light_config.numslock.is_none()
-            && light_config.scrolllock.is_none()
-        {
-            enabled = false;
-        }
-        Self {
-            enabled,
-            led_indicator_data: [0; 1],
-            capslock: light_config.capslock.map(|p| SingleLED::new(p)),
-            scrolllock: light_config.scrolllock.map(|p| SingleLED::new(p)),
-            numslock: light_config.numslock.map(|p| SingleLED::new(p)),
-        }
-    }
-}
-
-impl<P: OutputPin> LightService<P> {
     impl_led_on_off!(capslock, set_capslock);
     impl_led_on_off!(scrolllock, set_scrolllock);
     impl_led_on_off!(numslock, set_numslock);
diff --git a/rmk/src/matrix.rs b/rmk/src/matrix.rs
index abf6800f..e8bf4d2b 100644
--- a/rmk/src/matrix.rs
+++ b/rmk/src/matrix.rs
@@ -1,7 +1,8 @@
 use crate::{
+    channel::KEY_EVENT_CHANNEL,
     debounce::{DebounceState, DebouncerTrait},
     event::KeyEvent,
-    keyboard::KEY_EVENT_CHANNEL,
+    input_device::InputDevice,
     CONNECTION_STATE,
 };
 use core::future::Future;
@@ -14,7 +15,7 @@ use {embassy_futures::select::select_slice, embedded_hal_async::digital::Wait, h
 ///
 /// The keyboard matrix is a 2D matrix of keys, the matrix does the scanning and saves the result to each key's `KeyState`.
 /// The `KeyState` at position (row, col) can be read by `get_key_state` and updated by `update_key_state`.
-pub trait MatrixTrait {
+pub trait MatrixTrait: InputDevice {
     // Matrix size
     const ROW: usize;
     const COL: usize;
@@ -29,17 +30,6 @@ pub trait MatrixTrait {
         }
     }
 
-    // Run the matrix
-    fn run(&mut self) -> impl Future<Output = ()> {
-        async {
-            // We don't check disconnected state because disconnection means the task will be dropped
-            loop {
-                self.wait_for_connected().await;
-                self.scan().await;
-            }
-        }
-    }
-
     // Do matrix scanning, save the result in matrix's key_state field.
     fn scan(&mut self) -> impl Future<Output = ()>;
 
@@ -143,6 +133,31 @@ impl<
     }
 }
 
+impl<
+        #[cfg(not(feature = "async_matrix"))] In: InputPin,
+        #[cfg(feature = "async_matrix")] In: Wait + InputPin,
+        Out: OutputPin,
+        D: DebouncerTrait,
+        const INPUT_PIN_NUM: usize,
+        const OUTPUT_PIN_NUM: usize,
+    > InputDevice for Matrix<In, Out, D, INPUT_PIN_NUM, OUTPUT_PIN_NUM>
+{
+    type EventType = KeyEvent;
+
+    // Run the matrix
+    async fn run(&mut self) {
+        // We don't check disconnected state because disconnection means the task will be dropped
+        loop {
+            self.wait_for_connected().await;
+            self.scan().await;
+        }
+    }
+
+    async fn send_event(&mut self, event: Self::EventType) -> () {
+        KEY_EVENT_CHANNEL.send(event).await
+    }
+}
+
 impl<
         #[cfg(not(feature = "async_matrix"))] In: InputPin,
         #[cfg(feature = "async_matrix")] In: Wait + InputPin,
@@ -199,11 +214,14 @@ impl<
             self.wait_for_key().await;
 
             // Scan matrix and send report
-            for (out_idx, out_pin) in self.output_pins.iter_mut().enumerate() {
+            for out_idx in 0..self.output_pins.len() {
                 // Pull up output pin, wait 1us ensuring the change comes into effect
-                out_pin.set_high().ok();
+                if let Some(out_pin) = self.output_pins.get_mut(out_idx) {
+                    out_pin.set_high().ok();
+                }
                 Timer::after_micros(1).await;
-                for (in_idx, in_pin) in self.input_pins.iter_mut().enumerate() {
+                for in_idx in 0..self.input_pins.len() {
+                    let in_pin = self.input_pins.get_mut(in_idx).unwrap();
                     // Check input pins and debounce
                     let debounce_state = self.debouncer.detect_change_with_debounce(
                         in_idx,
@@ -222,13 +240,12 @@ impl<
                             let (row, col, key_state) =
                                 (out_idx, in_idx, self.key_states[out_idx][in_idx]);
 
-                            KEY_EVENT_CHANNEL
-                                .send(KeyEvent {
-                                    row: row as u8,
-                                    col: col as u8,
-                                    pressed: key_state.pressed,
-                                })
-                                .await;
+                            self.send_event(KeyEvent {
+                                row: row as u8,
+                                col: col as u8,
+                                pressed: key_state.pressed,
+                            })
+                            .await;
                         }
                         _ => (),
                     }
@@ -239,7 +256,11 @@ impl<
                         self.scan_start = Some(Instant::now());
                     }
                 }
-                out_pin.set_low().ok();
+
+                // Pull it back to low
+                if let Some(out_pin) = self.output_pins.get_mut(out_idx) {
+                    out_pin.set_low().ok();
+                }
             }
 
             embassy_time::Timer::after_micros(100).await;
diff --git a/rmk/src/split/central.rs b/rmk/src/split/central.rs
index c3f3b6ae..c55ab276 100644
--- a/rmk/src/split/central.rs
+++ b/rmk/src/split/central.rs
@@ -1,34 +1,34 @@
 use core::cell::RefCell;
 
-use embassy_executor::Spawner;
-use embassy_time::{Instant, Timer};
-use embassy_usb::driver::Driver;
-use embedded_hal::digital::{InputPin, OutputPin};
-#[cfg(feature = "async_matrix")]
-use embedded_hal_async::digital::Wait;
-
 use crate::action::KeyAction;
 #[cfg(feature = "_nrf_ble")]
-use crate::ble::nrf::initialize_nrf_ble_keyboard_and_run;
-use crate::config::RmkConfig;
+use crate::ble::nrf::initialize_nrf_sd_and_flash;
+use crate::channel::KEY_EVENT_CHANNEL;
+use crate::config::KeyboardConfig;
 #[cfg(not(feature = "rapid_debouncer"))]
 use crate::debounce::default_bouncer::DefaultDebouncer;
 #[cfg(feature = "rapid_debouncer")]
 use crate::debounce::fast_debouncer::RapidDebouncer;
 use crate::debounce::{DebounceState, DebouncerTrait};
 use crate::event::KeyEvent;
-use crate::keyboard::{Keyboard, KEYBOARD_REPORT_CHANNEL, KEY_EVENT_CHANNEL};
+use crate::input_device::InputDevice;
+use crate::keyboard::Keyboard;
 use crate::keymap::KeyMap;
-use crate::light::LightService;
+use crate::light::LightController;
 use crate::matrix::{KeyState, MatrixTrait};
-use crate::run_usb_keyboard;
-use crate::usb::KeyboardUsbDevice;
-use crate::via::process::VialService;
+use crate::run_rmk_internal;
+use crate::storage::Storage;
+use embassy_executor::Spawner;
+use embassy_time::{Instant, Timer};
+use embassy_usb::driver::Driver;
+use embedded_hal::digital::{InputPin, OutputPin};
+#[cfg(feature = "async_matrix")]
+use embedded_hal_async::digital::Wait;
+#[cfg(not(feature = "_no_external_storage"))]
+use embedded_storage_async::nor_flash::NorFlash;
 
 #[cfg(not(feature = "_nrf_ble"))]
 use embedded_io_async::{Read, Write};
-#[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))]
-use {crate::storage::Storage, embedded_storage_async::nor_flash::NorFlash};
 
 /// Run RMK split central keyboard service. This function should never return.
 ///
@@ -65,11 +65,34 @@ pub async fn run_rmk_split_central<
     #[cfg(not(feature = "_no_usb"))] usb_driver: D,
     #[cfg(not(feature = "_no_external_storage"))] flash: F,
     default_keymap: &mut [[[KeyAction; TOTAL_COL]; TOTAL_ROW]; NUM_LAYER],
-
-    keyboard_config: RmkConfig<'static, Out>,
+    keyboard_config: KeyboardConfig<'static, Out>,
     #[cfg(feature = "_nrf_ble")] central_addr: [u8; 6],
     #[cfg(not(feature = "_esp_ble"))] spawner: Spawner,
 ) -> ! {
+    let rmk_config = keyboard_config.rmk_config;
+
+    #[cfg(feature = "_nrf_ble")]
+    let (sd, flash) = initialize_nrf_sd_and_flash(
+        rmk_config.usb_config.product_name,
+        spawner,
+        Some(central_addr),
+    );
+
+    #[cfg(feature = "_esp_ble")]
+    let flash = DummyFlash::new();
+
+    let mut storage = Storage::new(flash, default_keymap, rmk_config.storage_config).await;
+    let keymap = RefCell::new(
+        KeyMap::new_from_storage(
+            default_keymap,
+            Some(&mut storage),
+            rmk_config.behavior_config.clone(),
+        )
+        .await,
+    );
+    let keyboard = Keyboard::new(&keymap, rmk_config.behavior_config.clone());
+    let light_controller = LightController::new(keyboard_config.controller_config.light_config);
+
     // Create the debouncer, use COL2ROW by default
     #[cfg(all(feature = "col2row", feature = "rapid_debouncer"))]
     let debouncer: RapidDebouncer<CENTRAL_ROW, CENTRAL_COL> = RapidDebouncer::new();
@@ -102,20 +125,19 @@ pub async fn run_rmk_split_central<
         CENTRAL_ROW,
     >::new(input_pins, output_pins, debouncer);
 
-    run_rmk_split_central_with_matrix(
-        matrix,
+    run_rmk_internal(
+        matrix,   // matrix input device
+        keyboard, // key processor
+        &keymap,
         #[cfg(not(feature = "_no_usb"))]
         usb_driver,
-        #[cfg(not(feature = "_no_external_storage"))]
-        flash,
-        default_keymap,
-        keyboard_config,
+        storage,
+        light_controller,
+        rmk_config,
         #[cfg(feature = "_nrf_ble")]
-        central_addr,
-        #[cfg(not(feature = "_esp_ble"))]
-        spawner,
+        sd,
     )
-    .await;
+    .await
 }
 
 /// Run RMK split central keyboard service. This function should never return.
@@ -151,13 +173,35 @@ pub async fn run_rmk_split_central_direct_pin<
     #[cfg(not(feature = "_no_usb"))] usb_driver: D,
     #[cfg(not(feature = "_no_external_storage"))] flash: F,
     default_keymap: &mut [[[KeyAction; TOTAL_COL]; TOTAL_ROW]; NUM_LAYER],
-
-    keyboard_config: RmkConfig<'static, Out>,
+    keyboard_config: KeyboardConfig<'static, Out>,
     low_active: bool,
     #[cfg(feature = "_nrf_ble")] central_addr: [u8; 6],
     #[cfg(not(feature = "_esp_ble"))] spawner: Spawner,
 ) -> ! {
-    info!("Debouncer");
+    let rmk_config = keyboard_config.rmk_config;
+
+    #[cfg(feature = "_nrf_ble")]
+    let (sd, flash) = initialize_nrf_sd_and_flash(
+        rmk_config.usb_config.product_name,
+        spawner,
+        Some(central_addr),
+    );
+
+    #[cfg(feature = "_esp_ble")]
+    let flash = DummyFlash::new();
+
+    let mut storage = Storage::new(flash, default_keymap, rmk_config.storage_config).await;
+    let keymap = RefCell::new(
+        KeyMap::new_from_storage(
+            default_keymap,
+            Some(&mut storage),
+            rmk_config.behavior_config.clone(),
+        )
+        .await,
+    );
+    let keyboard = Keyboard::new(&keymap, rmk_config.behavior_config.clone());
+    let light_controller = LightController::new(keyboard_config.controller_config.light_config);
+
     // Create the debouncer, use COL2ROW by default
     #[cfg(feature = "rapid_debouncer")]
     let debouncer: RapidDebouncer<CENTRAL_COL, CENTRAL_ROW> = RapidDebouncer::new();
@@ -175,84 +219,28 @@ pub async fn run_rmk_split_central_direct_pin<
         SIZE,
     >::new(direct_pins, debouncer, low_active);
 
-    run_rmk_split_central_with_matrix(
-        matrix,
+    run_rmk_internal(
+        matrix,   // matrix input device
+        keyboard, // key processor
+        &keymap,
         #[cfg(not(feature = "_no_usb"))]
         usb_driver,
-        #[cfg(not(feature = "_no_external_storage"))]
-        flash,
-        default_keymap,
-        keyboard_config,
+        storage,
+        light_controller,
+        rmk_config,
         #[cfg(feature = "_nrf_ble")]
-        central_addr,
-        #[cfg(not(feature = "_esp_ble"))]
-        spawner,
+        sd,
     )
-    .await;
-}
-
-/// Run RMK split central keyboard service. This function should never return.
-///
-/// # Arguments
-///
-/// * `matrix` - the matrix scanning implementation to use.
-/// * `usb_driver` - (optional) embassy usb driver instance. Some microcontrollers would enable the `_no_usb` feature implicitly, which eliminates this argument
-/// * `flash` - (optional) flash storage, which is used for storing keymap and keyboard configs. Some microcontrollers would enable the `_no_external_storage` feature implicitly, which eliminates this argument
-/// * `default_keymap` - default keymap definition
-/// * `keyboard_config` - other configurations of the keyboard, check [RmkConfig] struct for details
-/// * `central_addr` - (optional) central's BLE static address. This argument is enabled only for nRF BLE split central now
-/// * `spawner`: (optional) embassy spawner used to spawn async tasks. This argument is enabled for non-esp microcontrollers
-#[allow(unused_variables)]
-#[allow(unreachable_code)]
-pub async fn run_rmk_split_central_with_matrix<
-    Out: OutputPin,
-    M: MatrixTrait,
-    #[cfg(not(feature = "_no_usb"))] D: Driver<'static>,
-    #[cfg(not(feature = "_no_external_storage"))] F: NorFlash,
-    const TOTAL_ROW: usize,
-    const TOTAL_COL: usize,
-    const NUM_LAYER: usize,
->(
-    matrix: M,
-    #[cfg(not(feature = "_no_usb"))] usb_driver: D,
-    #[cfg(not(feature = "_no_external_storage"))] flash: F,
-    default_keymap: &mut [[[KeyAction; TOTAL_COL]; TOTAL_ROW]; NUM_LAYER],
-
-    keyboard_config: RmkConfig<'static, Out>,
-    #[cfg(feature = "_nrf_ble")] central_addr: [u8; 6],
-    #[cfg(not(feature = "_esp_ble"))] spawner: Spawner,
-) -> ! {
-    #[cfg(feature = "_nrf_ble")]
-    let fut = initialize_nrf_ble_keyboard_and_run::<_, _, D, TOTAL_ROW, TOTAL_COL, NUM_LAYER>(
-        matrix,
-        usb_driver,
-        default_keymap,
-        keyboard_config,
-        Some(central_addr),
-        spawner,
-    )
-    .await;
-
-    #[cfg(not(any(feature = "_nrf_ble", feature = "_esp_ble")))]
-    let fut = initialize_usb_split_central_and_run::<_, _, D, F, TOTAL_ROW, TOTAL_COL, NUM_LAYER>(
-        matrix,
-        usb_driver,
-        flash,
-        default_keymap,
-        keyboard_config,
-    )
-    .await;
-
-    fut
+    .await
 }
 
-/// Run central's peripheral monitor task.
+/// Run central's peripheral manager task.
 ///
 /// # Arguments
 /// * `id` - peripheral id
 /// * `addr` - (optional) peripheral's BLE static address. This argument is enabled only for nRF BLE split now
 /// * `receiver` - (optional) serial port. This argument is enabled only for serial split now
-pub async fn run_peripheral_monitor<
+pub async fn run_peripheral_manager<
     const ROW: usize,
     const COL: usize,
     const ROW_OFFSET: usize,
@@ -265,82 +253,15 @@ pub async fn run_peripheral_monitor<
 ) {
     #[cfg(feature = "_nrf_ble")]
     {
-        use crate::split::nrf::central::run_ble_peripheral_monitor;
-        run_ble_peripheral_monitor::<ROW, COL, ROW_OFFSET, COL_OFFSET>(id, addr).await;
+        use crate::split::nrf::central::run_ble_peripheral_manager;
+        run_ble_peripheral_manager::<ROW, COL, ROW_OFFSET, COL_OFFSET>(id, addr).await;
     };
 
     #[cfg(not(feature = "_nrf_ble"))]
     {
-        use crate::split::serial::run_serial_peripheral_monitor;
-        run_serial_peripheral_monitor::<ROW, COL, ROW_OFFSET, COL_OFFSET, S>(id, receiver).await;
-    };
-}
-
-/// Split central is connected to host via usb
-pub async fn initialize_usb_split_central_and_run<
-    M: MatrixTrait,
-    Out: OutputPin,
-    D: Driver<'static>,
-    #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))] F: NorFlash,
-    const TOTAL_ROW: usize,
-    const TOTAL_COL: usize,
-    const NUM_LAYER: usize,
->(
-    mut matrix: M,
-    #[cfg(not(feature = "_no_usb"))] usb_driver: D,
-    #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))] flash: F,
-    default_keymap: &mut [[[KeyAction; TOTAL_COL]; TOTAL_ROW]; NUM_LAYER],
-
-    keyboard_config: RmkConfig<'static, Out>,
-) -> ! {
-    // Initialize storage and keymap
-    // For USB keyboard, the "external" storage means the storage initialized by the user.
-    #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))]
-    let (mut storage, keymap) = {
-        let mut s = Storage::new(flash, default_keymap, keyboard_config.storage_config).await;
-        let keymap = RefCell::new(
-            KeyMap::<TOTAL_ROW, TOTAL_COL, NUM_LAYER>::new_from_storage(
-                default_keymap,
-                Some(&mut s),
-                keyboard_config.behavior_config,
-            )
-            .await,
-        );
-        (s, keymap)
+        use crate::split::serial::run_serial_peripheral_manager;
+        run_serial_peripheral_manager::<ROW, COL, ROW_OFFSET, COL_OFFSET, S>(id, receiver).await;
     };
-
-    #[cfg(all(not(feature = "_nrf_ble"), feature = "_no_external_storage"))]
-    let keymap = RefCell::new(
-        KeyMap::<TOTAL_ROW, TOTAL_COL, NUM_LAYER>::new(
-            default_keymap,
-            keyboard_config.behavior_config,
-        )
-        .await,
-    );
-
-    let keyboard_report_sender = KEYBOARD_REPORT_CHANNEL.sender();
-    let keyboard_report_receiver = KEYBOARD_REPORT_CHANNEL.receiver();
-
-    // Create keyboard services and devices
-    let (mut keyboard, mut usb_device, mut vial_service, mut light_service) = (
-        Keyboard::new(&keymap, &keyboard_report_sender),
-        KeyboardUsbDevice::new(usb_driver, keyboard_config.usb_config),
-        VialService::new(&keymap, keyboard_config.vial_config),
-        LightService::from_config(keyboard_config.light_config),
-    );
-
-    // Run usb keyboard
-    run_usb_keyboard(
-        &mut usb_device,
-        &mut keyboard,
-        &mut matrix,
-        #[cfg(any(feature = "_nrf_ble", not(feature = "_no_external_storage")))]
-        &mut storage,
-        &mut light_service,
-        &mut vial_service,
-        &keyboard_report_receiver,
-    )
-    .await
 }
 
 /// Matrix is the physical pcb layout of the keyboard matrix.
@@ -366,6 +287,34 @@ pub(crate) struct CentralMatrix<
     scan_start: Option<Instant>,
 }
 
+impl<
+        #[cfg(feature = "async_matrix")] In: Wait + InputPin,
+        #[cfg(not(feature = "async_matrix"))] In: InputPin,
+        Out: OutputPin,
+        D: DebouncerTrait,
+        const ROW_OFFSET: usize,
+        const COL_OFFSET: usize,
+        const INPUT_PIN_NUM: usize,
+        const OUTPUT_PIN_NUM: usize,
+    > InputDevice
+    for CentralMatrix<In, Out, D, ROW_OFFSET, COL_OFFSET, INPUT_PIN_NUM, OUTPUT_PIN_NUM>
+{
+    type EventType = KeyEvent;
+
+    // Run the matrix
+    async fn run(&mut self) {
+        // We don't check disconnected state because disconnection means the task will be dropped
+        loop {
+            self.wait_for_connected().await;
+            self.scan().await;
+        }
+    }
+
+    async fn send_event(&mut self, event: Self::EventType) -> () {
+        KEY_EVENT_CHANNEL.send(event).await
+    }
+}
+
 impl<
         #[cfg(feature = "async_matrix")] In: Wait + InputPin,
         #[cfg(not(feature = "async_matrix"))] In: InputPin,
@@ -567,6 +516,33 @@ impl<
     }
 }
 
+impl<
+        #[cfg(not(feature = "async_matrix"))] In: InputPin,
+        #[cfg(feature = "async_matrix")] In: Wait + InputPin,
+        D: DebouncerTrait,
+        const ROW_OFFSET: usize,
+        const COL_OFFSET: usize,
+        const ROW: usize,
+        const COL: usize,
+        const SIZE: usize,
+    > InputDevice for CentralDirectPinMatrix<In, D, ROW_OFFSET, COL_OFFSET, ROW, COL, SIZE>
+{
+    type EventType = KeyEvent;
+
+    // Run the matrix
+    async fn run(&mut self) {
+        // We don't check disconnected state because disconnection means the task will be dropped
+        loop {
+            self.wait_for_connected().await;
+            self.scan().await;
+        }
+    }
+
+    async fn send_event(&mut self, event: Self::EventType) -> () {
+        KEY_EVENT_CHANNEL.send(event).await
+    }
+}
+
 impl<
         #[cfg(not(feature = "async_matrix"))] In: InputPin,
         #[cfg(feature = "async_matrix")] In: Wait + InputPin,
diff --git a/rmk/src/split/driver.rs b/rmk/src/split/driver.rs
index 721a0da0..d57f3352 100644
--- a/rmk/src/split/driver.rs
+++ b/rmk/src/split/driver.rs
@@ -1,10 +1,9 @@
-use core::sync::atomic::Ordering;
-
-///! The abstracted driver layer of the split keyboard.
-///!
+//! The abstracted driver layer of the split keyboard.
+//!
 use super::SplitMessage;
 use crate::CONNECTION_STATE;
-use crate::{event::KeyEvent, keyboard::KEY_EVENT_CHANNEL};
+use crate::{channel::KEY_EVENT_CHANNEL, event::KeyEvent};
+use core::sync::atomic::Ordering;
 use embassy_futures::select::select;
 
 #[derive(Debug, Clone, Copy)]
@@ -27,15 +26,14 @@ pub(crate) trait SplitWriter {
     async fn write(&mut self, message: &SplitMessage) -> Result<usize, SplitDriverError>;
 }
 
-/// PeripheralMatrixMonitor runs in central.
+/// PeripheralManager runs in central.
 /// It reads split message from peripheral and updates key matrix cache of the peripheral.
 ///
 /// When the central scans the matrix, the scanning thread sends sync signal and gets key state cache back.
 ///
 /// The `ROW` and `COL` are the number of rows and columns of the corresponding peripheral's keyboard matrix.
 /// The `ROW_OFFSET` and `COL_OFFSET` are the offset of the peripheral's matrix in the keyboard's matrix.
-/// TODO: Rename `PeripheralMatrixMonitor`
-pub(crate) struct PeripheralMatrixMonitor<
+pub(crate) struct PeripheralManager<
     const ROW: usize,
     const COL: usize,
     const ROW_OFFSET: usize,
@@ -54,18 +52,19 @@ impl<
         const ROW_OFFSET: usize,
         const COL_OFFSET: usize,
         R: SplitReader + SplitWriter,
-    > PeripheralMatrixMonitor<ROW, COL, ROW_OFFSET, COL_OFFSET, R>
+    > PeripheralManager<ROW, COL, ROW_OFFSET, COL_OFFSET, R>
 {
     pub(crate) fn new(receiver: R, id: usize) -> Self {
         Self { receiver, id }
     }
 
-    /// Run the monitor.
+    /// Run the manager.
     ///
-    /// The monitor receives from the peripheral and forward the message to `KEY_EVENT_CHANNEL`.
+    /// The manager receives from the peripheral and forward the message to `KEY_EVENT_CHANNEL`.
+    /// It also sync the `ConnectionState` to the peripheral periodically.
     pub(crate) async fn run(mut self) -> ! {
         let mut conn_state = CONNECTION_STATE.load(Ordering::Acquire);
-        // Send once on start
+        // Send connection state once on start
         if let Err(e) = self
             .receiver
             .write(&SplitMessage::ConnectionState(conn_state))
@@ -74,6 +73,7 @@ impl<
             error!("SplitDriver write error: {:?}", e);
         }
         loop {
+            // Read the message from peripheral, or sync the connection state every 500ms.
             match select(self.receiver.read(), embassy_time::Timer::after_millis(500)).await {
                 embassy_futures::select::Either::First(read_result) => match read_result {
                     Ok(received_message) => {
@@ -102,7 +102,7 @@ impl<
                     Err(e) => error!("Peripheral message read error: {:?}", e),
                 },
                 embassy_futures::select::Either::Second(_) => {
-                    // Sync ConnectionState every 500ms
+                    // Sync ConnectionState
                     conn_state = CONNECTION_STATE.load(Ordering::Acquire);
                     if let Err(e) = self
                         .receiver
diff --git a/rmk/src/split/nrf/central.rs b/rmk/src/split/nrf/central.rs
index e578c469..1b920a3e 100644
--- a/rmk/src/split/nrf/central.rs
+++ b/rmk/src/split/nrf/central.rs
@@ -1,18 +1,15 @@
 use core::sync::atomic::{AtomicBool, Ordering};
 
 use embassy_futures::{join::join, select::select};
-use embassy_sync::{
-    blocking_mutex::raw::CriticalSectionRawMutex,
-    channel::{Channel, Receiver, Sender},
-};
+use embassy_sync::channel::{Channel, Receiver, Sender};
 use nrf_softdevice::ble::{central, gatt_client, Address, AddressType};
 
 use crate::{
     split::{
-        driver::{PeripheralMatrixMonitor, SplitDriverError, SplitReader, SplitWriter},
+        driver::{PeripheralManager, SplitDriverError, SplitReader, SplitWriter},
         SplitMessage, SPLIT_MESSAGE_MAX_SIZE,
     },
-    CONNECTION_STATE,
+    RawMutex, CONNECTION_STATE,
 };
 
 /// Gatt client used in split central to receive split message from peripherals
@@ -25,7 +22,7 @@ pub(crate) struct BleSplitCentralClient {
     pub(crate) message_to_peripheral: [u8; SPLIT_MESSAGE_MAX_SIZE],
 }
 
-pub(crate) async fn run_ble_peripheral_monitor<
+pub(crate) async fn run_ble_peripheral_manager<
     const ROW: usize,
     const COL: usize,
     const ROW_OFFSET: usize,
@@ -35,9 +32,9 @@ pub(crate) async fn run_ble_peripheral_monitor<
     addr: [u8; 6],
 ) {
     // Channel is used to receive messages from peripheral
-    let receive_channel: Channel<CriticalSectionRawMutex, SplitMessage, 8> = Channel::new();
+    let receive_channel: Channel<RawMutex, SplitMessage, 8> = Channel::new();
     // Channel is used to notify messages to peripheral
-    let notify_channel: Channel<CriticalSectionRawMutex, SplitMessage, 8> = Channel::new();
+    let notify_channel: Channel<RawMutex, SplitMessage, 8> = Channel::new();
 
     let receive_sender = receive_channel.sender();
     let receive_receiver = receive_channel.receiver();
@@ -52,9 +49,9 @@ pub(crate) async fn run_ble_peripheral_monitor<
     };
 
     let peripheral =
-        PeripheralMatrixMonitor::<ROW, COL, ROW_OFFSET, COL_OFFSET, _>::new(split_ble_driver, id);
+        PeripheralManager::<ROW, COL, ROW_OFFSET, COL_OFFSET, _>::new(split_ble_driver, id);
 
-    info!("Running peripheral monitor {}", id);
+    info!("Running peripheral manager {}", id);
     join(peripheral.run(), run_ble_client).await;
 }
 
@@ -66,8 +63,8 @@ static CONNECTING_CLIENT: AtomicBool = AtomicBool::new(false);
 /// All received messages are sent to the sender, those message are received in `SplitBleCentralDriver`.
 /// Split driver will take `SplitBleCentralDriver` as the reader, process the message in matrix scanning.
 pub(crate) async fn run_ble_client(
-    receive_sender: Sender<'_, CriticalSectionRawMutex, SplitMessage, 8>,
-    notify_receiver: Receiver<'_, CriticalSectionRawMutex, SplitMessage, 8>,
+    receive_sender: Sender<'_, RawMutex, SplitMessage, 8>,
+    notify_receiver: Receiver<'_, RawMutex, SplitMessage, 8>,
     addr: [u8; 6],
 ) -> ! {
     // Wait 1s, ensure that the softdevice is ready
@@ -172,9 +169,9 @@ pub(crate) async fn run_ble_client(
 /// so we need this wrapper to forward split message to channel.
 pub(crate) struct BleSplitCentralDriver<'a> {
     // Receiver that receives message from peripheral
-    pub(crate) receiver: Receiver<'a, CriticalSectionRawMutex, SplitMessage, 8>,
+    pub(crate) receiver: Receiver<'a, RawMutex, SplitMessage, 8>,
     // Sender that send message to peripherals
-    pub(crate) sender: Sender<'a, CriticalSectionRawMutex, SplitMessage, 8>,
+    pub(crate) sender: Sender<'a, RawMutex, SplitMessage, 8>,
     // Cached connection state
     connection_state: bool,
 }
diff --git a/rmk/src/split/nrf/peripheral.rs b/rmk/src/split/nrf/peripheral.rs
index 2a32f4d9..48981166 100644
--- a/rmk/src/split/nrf/peripheral.rs
+++ b/rmk/src/split/nrf/peripheral.rs
@@ -1,18 +1,16 @@
-use crate::ble::nrf::softdevice_task;
+use crate::ble::nrf::initialize_nrf_sd_and_flash;
 use crate::split::driver::{SplitDriverError, SplitReader, SplitWriter};
 use crate::split::peripheral::SplitPeripheral;
 use crate::split::{SplitMessage, SPLIT_MESSAGE_MAX_SIZE};
 use crate::MatrixTrait;
-use core::mem;
 use embassy_executor::Spawner;
 use embassy_futures::block_on;
-use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
+use embassy_sync::blocking_mutex::raw::ThreadModeRawMutex;
 use embassy_sync::channel::{Channel, Receiver};
 use nrf_softdevice::ble::gatt_server::set_sys_attrs;
 use nrf_softdevice::ble::peripheral::{advertise_connectable, ConnectableAdvertisement};
 use nrf_softdevice::ble::{gatt_server, Connection, PhySet, PhyUpdateError};
-use nrf_softdevice::ble::{set_address, Address, AddressType};
-use nrf_softdevice::{raw, Config, Softdevice};
+use nrf_softdevice::ble::{Address, AddressType};
 
 /// Gatt service used in split peripheral to send split message to central
 #[nrf_softdevice::gatt_service(uuid = "4dd5fbaa-18e5-4b07-bf0a-353698659946")]
@@ -34,14 +32,14 @@ pub(crate) struct BleSplitPeripheralServer {
 pub(crate) struct BleSplitPeripheralDriver<'a> {
     server: &'a BleSplitPeripheralServer,
     conn: &'a Connection,
-    receiver: Receiver<'a, CriticalSectionRawMutex, SplitMessage, 4>,
+    receiver: Receiver<'a, ThreadModeRawMutex, SplitMessage, 4>,
 }
 
 impl<'a> BleSplitPeripheralDriver<'a> {
     pub(crate) fn new(
         server: &'a BleSplitPeripheralServer,
         conn: &'a Connection,
-        receiver: Receiver<'a, CriticalSectionRawMutex, SplitMessage, 4>,
+        receiver: Receiver<'a, ThreadModeRawMutex, SplitMessage, 4>,
     ) -> Self {
         Self {
             server,
@@ -105,59 +103,7 @@ pub async fn initialize_nrf_ble_split_peripheral_and_run<
         CONNECTION_STATE,
     };
 
-    let ble_config = Config {
-        clock: Some(raw::nrf_clock_lf_cfg_t {
-            source: raw::NRF_CLOCK_LF_SRC_RC as u8,
-            rc_ctiv: 16,
-            rc_temp_ctiv: 2,
-            accuracy: raw::NRF_CLOCK_LF_ACCURACY_500_PPM as u8,
-            // External osc
-            // source: raw::NRF_CLOCK_LF_SRC_XTAL as u8,
-            // rc_ctiv: 0,
-            // rc_temp_ctiv: 0,
-            // accuracy: raw::NRF_CLOCK_LF_ACCURACY_20_PPM as u8,
-        }),
-        conn_gap: Some(raw::ble_gap_conn_cfg_t {
-            conn_count: 6,
-            event_length: 24,
-        }),
-        conn_gatt: Some(raw::ble_gatt_conn_cfg_t { att_mtu: 256 }),
-        gatts_attr_tab_size: Some(raw::ble_gatts_cfg_attr_tab_size_t {
-            attr_tab_size: raw::BLE_GATTS_ATTR_TAB_SIZE_DEFAULT,
-        }),
-        gap_role_count: Some(raw::ble_gap_cfg_role_count_t {
-            adv_set_count: 1,
-            periph_role_count: 4,
-            central_role_count: 4,
-            central_sec_count: 4,
-            _bitfield_1: raw::ble_gap_cfg_role_count_t::new_bitfield_1(0),
-        }),
-        gap_device_name: Some(raw::ble_gap_cfg_device_name_t {
-            p_value: "rmk_peripheral_board".as_ptr() as _,
-            current_len: "rmk_peripheral_board".len() as u16,
-            max_len: "rmk_peripheral_board".len() as u16,
-            write_perm: unsafe { mem::zeroed() },
-            _bitfield_1: raw::ble_gap_cfg_device_name_t::new_bitfield_1(
-                raw::BLE_GATTS_VLOC_STACK as u8,
-            ),
-        }),
-        ..Default::default()
-    };
-
-    let sd = Softdevice::enable(&ble_config);
-    set_address(
-        sd,
-        &Address::new(AddressType::RandomStatic, peripheral_addr),
-    );
-
-    {
-        // Use the immutable ref of `Softdevice` to run the softdevice_task
-        // The mumtable ref is used for configuring Flash and BleServer
-        let sdv = unsafe { nrf_softdevice::Softdevice::steal() };
-        spawner
-            .spawn(softdevice_task(sdv))
-            .expect("Failed to start softdevice task");
-    };
+    let (sd, _) = initialize_nrf_sd_and_flash("rmk_split_peri", spawner, Some(peripheral_addr));
 
     let server =
         BleSplitPeripheralServer::new(sd).expect("Failed to start BLE split peripheral server");
@@ -177,7 +123,7 @@ pub async fn initialize_nrf_ble_split_peripheral_and_run<
         };
 
         // Channel used for receiving messages from central
-        let receive_channel: Channel<CriticalSectionRawMutex, SplitMessage, 4> = Channel::new();
+        let receive_channel: Channel<ThreadModeRawMutex, SplitMessage, 4> = Channel::new();
         let receiver = receive_channel.receiver();
         let sender = receive_channel.sender();
 
diff --git a/rmk/src/split/peripheral.rs b/rmk/src/split/peripheral.rs
index 391c22ac..ed5817e4 100644
--- a/rmk/src/split/peripheral.rs
+++ b/rmk/src/split/peripheral.rs
@@ -1,15 +1,15 @@
 use super::driver::{SplitReader, SplitWriter};
 use super::SplitMessage;
+use crate::channel::KEY_EVENT_CHANNEL;
 #[cfg(not(feature = "rapid_debouncer"))]
 use crate::debounce::default_bouncer::DefaultDebouncer;
 #[cfg(feature = "rapid_debouncer")]
 use crate::debounce::fast_debouncer::RapidDebouncer;
 use crate::debounce::DebouncerTrait;
 use crate::direct_pin::DirectPinMatrix;
-use crate::keyboard::KEY_EVENT_CHANNEL;
 use crate::matrix::{Matrix, MatrixTrait};
 use crate::CONNECTION_STATE;
-#[cfg(feature = "_nrf_ble")]
+#[cfg(not(feature = "_esp_ble"))]
 use embassy_executor::Spawner;
 use embassy_futures::select::select;
 use embedded_hal::digital::{InputPin, OutputPin};
@@ -28,6 +28,7 @@ use embedded_io_async::{Read, Write};
 /// * `peripheral_addr` - (optional) peripheral's BLE static address. This argument is enabled only for nRF BLE split now
 /// * `serial` - (optional) serial port used to send peripheral split message. This argument is enabled only for serial split now
 /// * `spawner`: (optional) embassy spawner used to spawn async tasks. This argument is enabled for non-esp microcontrollers
+#[allow(unused_variables)]
 pub async fn run_rmk_split_peripheral<
     #[cfg(feature = "async_matrix")] In: Wait + InputPin,
     #[cfg(not(feature = "async_matrix"))] In: InputPin,
@@ -43,7 +44,7 @@ pub async fn run_rmk_split_peripheral<
     #[cfg(feature = "_nrf_ble")] central_addr: [u8; 6],
     #[cfg(feature = "_nrf_ble")] peripheral_addr: [u8; 6],
     #[cfg(not(feature = "_nrf_ble"))] serial: S,
-    #[cfg(feature = "_nrf_ble")] spawner: Spawner,
+    #[cfg(not(feature = "_esp_ble"))] spawner: Spawner,
 ) {
     // Create the debouncer, use COL2ROW by default
     #[cfg(all(feature = "col2row", feature = "rapid_debouncer"))]
@@ -62,21 +63,16 @@ pub async fn run_rmk_split_peripheral<
     let matrix = Matrix::<_, _, _, COL, ROW>::new(input_pins, output_pins, debouncer);
 
     #[cfg(feature = "_nrf_ble")]
-    run_rmk_split_peripheral_with_matrix::<
-        _,
-        ROW,
-        COL,
-    >(matrix, central_addr, peripheral_addr, spawner)
+    run_rmk_split_peripheral_with_matrix::<_, ROW, COL>(
+        matrix,
+        central_addr,
+        peripheral_addr,
+        spawner,
+    )
     .await;
 
     #[cfg(not(feature = "_nrf_ble"))]
-    run_rmk_split_peripheral_with_matrix::<
-        _,
-        S,
-        ROW,
-        COL,
-    >(matrix, serial)
-    .await;
+    run_rmk_split_peripheral_with_matrix::<_, S, ROW, COL>(matrix, serial).await;
 }
 
 /// Run the split peripheral service with direct pin matrix.
@@ -89,6 +85,7 @@ pub async fn run_rmk_split_peripheral<
 /// * `low_active`: pin active level
 /// * `serial` - (optional) serial port used to send peripheral split message. This argument is enabled only for serial split now
 /// * `spawner`: (optional) embassy spawner used to spawn async tasks. This argument is enabled for non-esp microcontrollers
+#[allow(unused_variables)]
 pub async fn run_rmk_split_peripheral_direct_pin<
     #[cfg(feature = "async_matrix")] In: Wait + InputPin,
     #[cfg(not(feature = "async_matrix"))] In: InputPin,
@@ -103,7 +100,7 @@ pub async fn run_rmk_split_peripheral_direct_pin<
     #[cfg(feature = "_nrf_ble")] peripheral_addr: [u8; 6],
     low_active: bool,
     #[cfg(not(feature = "_nrf_ble"))] serial: S,
-    #[cfg(feature = "_nrf_ble")] spawner: Spawner,
+    #[cfg(not(feature = "_esp_ble"))] spawner: Spawner,
 ) {
     // Create the debouncer, use COL2ROW by default
     #[cfg(feature = "rapid_debouncer")]
@@ -115,21 +112,16 @@ pub async fn run_rmk_split_peripheral_direct_pin<
     let matrix = DirectPinMatrix::<_, _, ROW, COL, SIZE>::new(direct_pins, debouncer, low_active);
 
     #[cfg(feature = "_nrf_ble")]
-    run_rmk_split_peripheral_with_matrix::<
-        _,
-        ROW,
-        COL,
-    >(matrix, central_addr, peripheral_addr, spawner)
+    run_rmk_split_peripheral_with_matrix::<_, ROW, COL>(
+        matrix,
+        central_addr,
+        peripheral_addr,
+        spawner,
+    )
     .await;
 
     #[cfg(not(feature = "_nrf_ble"))]
-    run_rmk_split_peripheral_with_matrix::<
-        _,
-        S,
-        ROW,
-        COL,
-    >(matrix, serial)
-    .await;
+    run_rmk_split_peripheral_with_matrix::<_, S, ROW, COL>(matrix, serial).await;
 }
 
 /// Run the split peripheral service.
diff --git a/rmk/src/split/serial/mod.rs b/rmk/src/split/serial/mod.rs
index 968822ca..9044e89a 100644
--- a/rmk/src/split/serial/mod.rs
+++ b/rmk/src/split/serial/mod.rs
@@ -3,7 +3,7 @@ use embedded_io_async::{Read, Write};
 use crate::{
     matrix::MatrixTrait,
     split::{
-        driver::{PeripheralMatrixMonitor, SplitReader, SplitWriter},
+        driver::{PeripheralManager, SplitReader, SplitWriter},
         peripheral::SplitPeripheral,
         SplitMessage, SPLIT_MESSAGE_MAX_SIZE,
     },
@@ -19,7 +19,7 @@ use super::driver::SplitDriverError;
 /// - `const ROW_OFFSET`: row offset of the peripheral's matrix in the whole matrix
 /// - `const COL_OFFSET`: column offset of the peripheral's matrix in the whole matrix
 /// - `S`: a serial port that implements `Read` and `Write` trait in embedded-io-async
-pub(crate) async fn run_serial_peripheral_monitor<
+pub(crate) async fn run_serial_peripheral_manager<
     const ROW: usize,
     const COL: usize,
     const ROW_OFFSET: usize,
@@ -30,11 +30,9 @@ pub(crate) async fn run_serial_peripheral_monitor<
     receiver: S,
 ) {
     let split_serial_driver: SerialSplitDriver<S> = SerialSplitDriver::new(receiver);
-    let peripheral = PeripheralMatrixMonitor::<ROW, COL, ROW_OFFSET, COL_OFFSET, _>::new(
-        split_serial_driver,
-        id,
-    );
-    info!("Running peripheral monitor {}", id);
+    let peripheral =
+        PeripheralManager::<ROW, COL, ROW_OFFSET, COL_OFFSET, _>::new(split_serial_driver, id);
+    info!("Running peripheral manager {}", id);
     peripheral.run().await;
 }
 
diff --git a/rmk/src/flash.rs b/rmk/src/storage/dummy_flash.rs
similarity index 77%
rename from rmk/src/flash.rs
rename to rmk/src/storage/dummy_flash.rs
index 4ef3e890..9fbc3033 100644
--- a/rmk/src/flash.rs
+++ b/rmk/src/storage/dummy_flash.rs
@@ -9,21 +9,21 @@ impl embedded_storage_async::nor_flash::NorFlashError for EmptyFlashErrorWrapper
 }
 
 /// An empty implementation of `NorFlash`
-pub struct EmptyFlashWrapper {}
+pub struct DummyFlash {}
 
-impl Default for EmptyFlashWrapper {
+impl Default for DummyFlash {
     fn default() -> Self {
         Self::new()
     }
 }
 
-impl EmptyFlashWrapper {
+impl DummyFlash {
     pub fn new() -> Self {
         Self {}
     }
 }
 
-impl embedded_storage::nor_flash::NorFlash for EmptyFlashWrapper {
+impl embedded_storage::nor_flash::NorFlash for DummyFlash {
     const WRITE_SIZE: usize = 0;
     const ERASE_SIZE: usize = 0;
 
@@ -36,7 +36,7 @@ impl embedded_storage::nor_flash::NorFlash for EmptyFlashWrapper {
     }
 }
 
-impl embedded_storage::nor_flash::ReadNorFlash for EmptyFlashWrapper {
+impl embedded_storage::nor_flash::ReadNorFlash for DummyFlash {
     const READ_SIZE: usize = 0;
 
     fn read(&mut self, _offset: u32, _bytes: &mut [u8]) -> Result<(), Self::Error> {
@@ -48,11 +48,11 @@ impl embedded_storage::nor_flash::ReadNorFlash for EmptyFlashWrapper {
     }
 }
 
-impl embedded_storage_async::nor_flash::ErrorType for EmptyFlashWrapper {
+impl embedded_storage_async::nor_flash::ErrorType for DummyFlash {
     type Error = EmptyFlashErrorWrapper;
 }
 
-impl embedded_storage_async::nor_flash::NorFlash for EmptyFlashWrapper {
+impl embedded_storage_async::nor_flash::NorFlash for DummyFlash {
     const WRITE_SIZE: usize = 0;
     const ERASE_SIZE: usize = 0;
 
@@ -65,7 +65,7 @@ impl embedded_storage_async::nor_flash::NorFlash for EmptyFlashWrapper {
     }
 }
 
-impl embedded_storage_async::nor_flash::ReadNorFlash for EmptyFlashWrapper {
+impl embedded_storage_async::nor_flash::ReadNorFlash for DummyFlash {
     const READ_SIZE: usize = 1;
     async fn read(&mut self, _offset: u32, _bytes: &mut [u8]) -> Result<(), Self::Error> {
         Ok(())
diff --git a/rmk/src/storage/mod.rs b/rmk/src/storage/mod.rs
index 9b71ba21..7aa53ca4 100644
--- a/rmk/src/storage/mod.rs
+++ b/rmk/src/storage/mod.rs
@@ -1,7 +1,8 @@
+pub mod dummy_flash;
 mod eeconfig;
-pub mod nor_flash;
 
 use crate::{
+    channel::FLASH_CHANNEL,
     combo::{Combo, COMBO_MAX_LENGTH},
     config::StorageConfig,
     BUILD_HASH,
@@ -9,8 +10,6 @@ use crate::{
 use byteorder::{BigEndian, ByteOrder};
 use core::fmt::Debug;
 use core::ops::Range;
-use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
-use embassy_sync::channel::Channel;
 use embedded_storage_async::nor_flash::NorFlash as AsyncNorFlash;
 use heapless::Vec;
 use sequential_storage::{
@@ -29,10 +28,6 @@ use crate::{
 
 use self::eeconfig::EeKeymapConfig;
 
-// Sync messages from server to flash
-pub(crate) static FLASH_CHANNEL: Channel<CriticalSectionRawMutex, FlashOperationMessage, 4> =
-    Channel::new();
-
 // Message send from bonder to flash task, which will do saving or clearing operation
 #[derive(Clone, Copy, Debug)]
 #[cfg_attr(feature = "defmt", derive(defmt::Format))]
diff --git a/rmk/src/storage/nor_flash/esp_partition.rs b/rmk/src/storage/nor_flash/esp_partition.rs
deleted file mode 100644
index b74efa9c..00000000
--- a/rmk/src/storage/nor_flash/esp_partition.rs
+++ /dev/null
@@ -1,125 +0,0 @@
-use core::{
-    ffi::{c_void, CStr},
-    num::NonZeroI32,
-    ops::Deref,
-};
-
-use embassy_time::Timer;
-use embedded_storage_async::nor_flash::{
-    ErrorType, MultiwriteNorFlash, NorFlash, NorFlashError, NorFlashErrorKind, ReadNorFlash,
-};
-use esp_idf_svc::sys::*;
-
-#[derive(Copy, Clone)]
-#[repr(u32)]
-pub enum PartitionType {
-    App = 0,
-    Data = esp_partition_type_t_ESP_PARTITION_TYPE_DATA << 8,
-    Custom = 0x4000,
-    Any = esp_partition_type_t_ESP_PARTITION_TYPE_ANY << 8,
-}
-pub struct Partition(*const esp_partition_t);
-
-impl Deref for Partition {
-    type Target = esp_partition_t;
-    fn deref<'a>(&'a self) -> &'a Self::Target {
-        unsafe { self.0.as_ref().unwrap() }
-    }
-}
-
-impl Partition {
-    pub const WORD_SIZE: usize = 4;
-    pub const SECTOR_SIZE: usize = 4096;
-
-    pub fn new(type_: PartitionType, label: Option<&CStr>) -> Self {
-        let partition = Self(unsafe {
-            esp_partition_find_first(
-                type_ as u32 >> 8,
-                type_ as u32 & 0xff,
-                match label {
-                    Some(ref v) => v.as_ptr(),
-                    None => core::ptr::null(),
-                },
-            )
-        });
-        info!(
-            "Partition found at: {:#x}, {:#x}",
-            partition.address, partition.size
-        );
-        partition
-    }
-    fn result(r: esp_err_t) -> Result<(), Error> {
-        match NonZeroI32::new(r) {
-            None => Ok(()),
-            Some(err) => Err(Error(EspError::from_non_zero(err))),
-        }
-    }
-}
-
-#[derive(Debug)]
-pub struct Error(EspError);
-
-impl NorFlashError for Error {
-    fn kind(&self) -> NorFlashErrorKind {
-        match self.0.code() {
-            //  => NorFlashErrorKind::NotAligned,
-            ESP_ERR_INVALID_SIZE => NorFlashErrorKind::OutOfBounds,
-            _ => NorFlashErrorKind::Other,
-        }
-    }
-}
-
-impl ErrorType for Partition {
-    type Error = Error;
-}
-
-impl ReadNorFlash for Partition {
-    const READ_SIZE: usize = Self::WORD_SIZE as _;
-
-    async fn read(&mut self, offset: u32, bytes: &mut [u8]) -> Result<(), Self::Error> {
-        Self::result(unsafe {
-            esp_partition_read_raw(
-                self.0,
-                offset as usize,
-                bytes.as_mut_ptr() as *mut c_void,
-                bytes.len(),
-            )
-        })
-    }
-
-    fn capacity(&self) -> usize {
-        self.size as usize
-    }
-}
-
-impl NorFlash for Partition {
-    const WRITE_SIZE: usize = Self::WORD_SIZE as _;
-    const ERASE_SIZE: usize = Self::SECTOR_SIZE as _;
-
-    async fn write(&mut self, offset: u32, bytes: &[u8]) -> Result<(), Self::Error> {
-        warn!(
-            "esp partition write at {:#x} size {:#x}",
-            offset,
-            bytes.len()
-        );
-        Timer::after_millis(7).await;
-        Self::result(unsafe {
-            esp_partition_write_raw(
-                self.0,
-                offset as usize,
-                bytes.as_ptr() as *mut c_void,
-                bytes.len(),
-            )
-        })
-    }
-
-    async fn erase(&mut self, from: u32, to: u32) -> Result<(), Self::Error> {
-        warn!("esp partition erase from {:#x} size {:#x}", from, to - from);
-        Timer::after_millis(7).await;
-        Self::result(unsafe {
-            esp_partition_erase_range(self.0, from as usize, (to - from) as usize)
-        })
-    }
-}
-
-impl MultiwriteNorFlash for Partition {}
diff --git a/rmk/src/storage/nor_flash/mod.rs b/rmk/src/storage/nor_flash/mod.rs
deleted file mode 100644
index f020c04d..00000000
--- a/rmk/src/storage/nor_flash/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-#[cfg(feature = "_esp_ble")]
-pub mod esp_partition;
diff --git a/rmk/src/usb/descriptor.rs b/rmk/src/usb/descriptor.rs
index 79592bc5..01575db7 100644
--- a/rmk/src/usb/descriptor.rs
+++ b/rmk/src/usb/descriptor.rs
@@ -1,7 +1,5 @@
-use ssmarshal::serialize;
-use usbd_hid::descriptor::{
-    generator_prelude::*, MediaKeyboardReport, MouseReport, SystemControlReport,
-};
+use serde::Serialize;
+use usbd_hid::descriptor::generator_prelude::*;
 
 /// KeyboardReport describes a report and its companion descriptor that can be
 /// used to send keyboard button presses to a host and receive the status of the
@@ -23,6 +21,8 @@ use usbd_hid::descriptor::{
     }
 )]
 #[allow(dead_code)]
+#[derive(Default)]
+#[cfg_attr(feature = "defmt", derive(defmt::Format))]
 pub struct KeyboardReport {
     pub modifier: u8,
     pub reserved: u8,
@@ -40,7 +40,8 @@ pub struct KeyboardReport {
         };
     }
 )]
-pub(crate) struct ViaReport {
+#[derive(Default)]
+pub struct ViaReport {
     pub(crate) input_data: [u8; 32],
     pub(crate) output_data: [u8; 32],
 }
@@ -49,9 +50,10 @@ pub(crate) struct ViaReport {
 /// Should be same with `#[gen_hid_descriptor]`
 /// DO NOT EDIT
 #[repr(u8)]
-#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
+#[derive(Debug, Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, Serialize)]
 
 pub enum CompositeReportType {
+    #[default]
     None = 0x00,
     Mouse = 0x01,
     Media = 0x02,
@@ -112,7 +114,7 @@ impl CompositeReportType {
         };
     }
 )]
-#[derive(Default)]
+#[derive(Default, Serialize)]
 pub struct CompositeReport {
     pub(crate) buttons: u8,
     pub(crate) x: i8,
@@ -122,46 +124,3 @@ pub struct CompositeReport {
     pub(crate) media_usage_id: u16,
     pub(crate) system_usage_id: u8,
 }
-
-impl CompositeReport {
-    pub(crate) fn reset_mouse(&mut self) {
-        self.x = 0;
-        self.y = 0;
-        self.buttons = 0;
-        self.wheel = 0;
-        self.pan = 0;
-    }
-
-    pub(crate) fn serialize(
-        &self,
-        data: &mut [u8],
-        report_type: CompositeReportType,
-    ) -> Result<usize, ssmarshal::Error> {
-        // Use usbd-hid's report to do serialization, but not so efficient.
-        match report_type {
-            CompositeReportType::None => Ok(0),
-            CompositeReportType::Mouse => {
-                let mouse_report = MouseReport {
-                    buttons: self.buttons,
-                    x: self.x,
-                    y: self.y,
-                    wheel: self.wheel,
-                    pan: self.pan,
-                };
-                Ok(serialize(data, &mouse_report)?)
-            }
-            CompositeReportType::Media => {
-                let consumer_report = MediaKeyboardReport {
-                    usage_id: self.media_usage_id,
-                };
-                Ok(serialize(data, &consumer_report)?)
-            }
-            CompositeReportType::System => {
-                let system_report = SystemControlReport {
-                    usage_id: self.system_usage_id,
-                };
-                Ok(serialize(data, &system_report)?)
-            }
-        }
-    }
-}
diff --git a/rmk/src/usb/mod.rs b/rmk/src/usb/mod.rs
index 0525cab8..c93b07a2 100644
--- a/rmk/src/usb/mod.rs
+++ b/rmk/src/usb/mod.rs
@@ -3,18 +3,20 @@ pub(crate) mod descriptor;
 use core::sync::atomic::{AtomicU8, Ordering};
 use embassy_time::Timer;
 use embassy_usb::{
-    class::hid::{Config, HidReaderWriter, HidWriter, ReportId, RequestHandler, State},
+    class::hid::{Config, HidWriter, ReportId, RequestHandler, State},
     control::OutResponse,
     driver::Driver,
-    Builder, Handler, UsbDevice,
+    Builder, Handler,
 };
+use ssmarshal::serialize;
 use static_cell::StaticCell;
 use usbd_hid::descriptor::SerializedDescriptor;
 
 use crate::{
+    channel::KEYBOARD_REPORT_CHANNEL,
     config::KeyboardUsbConfig,
-    hid::{UsbHidReader, UsbHidReaderWriter, UsbHidWriter},
-    usb::descriptor::{CompositeReport, ViaReport},
+    hid::{HidError, HidWriterTrait, Report, RunnableHidWriter},
+    usb::descriptor::CompositeReportType,
     CONNECTION_STATE,
 };
 
@@ -67,112 +69,187 @@ pub(crate) async fn wait_for_usb_enabled() {
     }
 }
 
-// In this case, report id should be used.
-// The keyboard usb device should have 3 hid instances:
-// 1. Boot keyboard: 1 endpoint in
-// 2. Other: Mouse + System control + Consumer control: 1 endpoint in
-// 3. Via: used to communicate with via: 2 endpoints(in/out)
-pub(crate) struct KeyboardUsbDevice<'d, D: Driver<'d>> {
-    pub(crate) device: UsbDevice<'d, D>,
-    pub(crate) keyboard_hid_writer: UsbHidWriter<'d, D, 8>,
-    pub(crate) keyboard_hid_reader: UsbHidReader<'d, D, 1>,
-    pub(crate) other_hid_writer: UsbHidWriter<'d, D, 9>,
-    pub(crate) via_hid: UsbHidReaderWriter<'d, D, 32, 32>,
+pub struct UsbKeyboardWriter<'a, 'd, D: Driver<'d>> {
+    pub(crate) keyboard_writer: &'a mut HidWriter<'d, D, 8>,
+    pub(crate) other_writer: &'a mut HidWriter<'d, D, 9>,
 }
+impl<'a, 'd, D: Driver<'d>> UsbKeyboardWriter<'a, 'd, D> {
+    pub(crate) fn new(
+        keyboard_writer: &'a mut HidWriter<'d, D, 8>,
+        other_writer: &'a mut HidWriter<'d, D, 9>,
+    ) -> Self {
+        Self {
+            keyboard_writer,
+            other_writer,
+        }
+    }
+}
+
+impl<'a, 'd, D: Driver<'d>> RunnableHidWriter for UsbKeyboardWriter<'a, 'd, D> {
+    async fn get_report(&mut self) -> Self::ReportType {
+        KEYBOARD_REPORT_CHANNEL.receive().await
+    }
+}
+
+impl<'a, 'd, D: Driver<'d>> HidWriterTrait for UsbKeyboardWriter<'a, 'd, D> {
+    type ReportType = Report;
+
+    async fn write_report(&mut self, report: Self::ReportType) -> Result<usize, HidError> {
+        // Write report to USB
+        match report {
+            Report::KeyboardReport(keyboard_report) => {
+                self.keyboard_writer
+                    .write_serialize(&keyboard_report)
+                    .await
+                    .map_err(|e| HidError::UsbEndpointError(e))?;
+                Ok(8)
+            }
+            Report::MouseReport(mouse_report) => {
+                let mut buf: [u8; 9] = [0; 9];
+                buf[0] = CompositeReportType::Mouse as u8;
+                let n = serialize(&mut buf[1..], &mouse_report)
+                    .map_err(|_| HidError::ReportSerializeError)?;
+                self.other_writer
+                    .write(&mut buf[0..n + 1])
+                    .await
+                    .map_err(|e| HidError::UsbEndpointError(e))?;
+                Ok(n)
+            }
+            Report::MediaKeyboardReport(media_keyboard_report) => {
+                let mut buf: [u8; 9] = [0; 9];
+                buf[0] = CompositeReportType::Media as u8;
+                let n = serialize(&mut buf[1..], &media_keyboard_report)
+                    .map_err(|_| HidError::ReportSerializeError)?;
+                self.other_writer
+                    .write(&mut buf[0..n + 1])
+                    .await
+                    .map_err(|e| HidError::UsbEndpointError(e))?;
+                Ok(n)
+            }
+            Report::SystemControlReport(system_control_report) => {
+                let mut buf: [u8; 9] = [0; 9];
+                buf[0] = CompositeReportType::System as u8;
+                let n = serialize(&mut buf[1..], &system_control_report)
+                    .map_err(|_| HidError::ReportSerializeError)?;
+                self.other_writer
+                    .write(&mut buf[0..n + 1])
+                    .await
+                    .map_err(|e| HidError::UsbEndpointError(e))?;
+                Ok(n)
+            }
+        }
+    }
+}
+
+pub(crate) fn new_usb_builder<'d, D: Driver<'d>>(
+    driver: D,
+    keyboard_config: KeyboardUsbConfig<'d>,
+) -> Builder<'d, D> {
+    // Create embassy-usb Config
+    let mut usb_config = embassy_usb::Config::new(keyboard_config.vid, keyboard_config.pid);
+    usb_config.manufacturer = Some(keyboard_config.manufacturer);
+    usb_config.product = Some(keyboard_config.product_name);
+    usb_config.serial_number = Some(keyboard_config.serial_number);
+    usb_config.max_power = 450;
+    usb_config.supports_remote_wakeup = true;
+
+    // Required for windows compatibility.
+    usb_config.max_packet_size_0 = 64;
+    usb_config.device_class = 0xEF;
+    usb_config.device_sub_class = 0x02;
+    usb_config.device_protocol = 0x01;
+    usb_config.composite_with_iads = true;
+
+    // Create embassy-usb DeviceBuilder using the driver and config.
+    static CONFIG_DESC: StaticCell<[u8; 256]> = StaticCell::new();
+    static BOS_DESC: StaticCell<[u8; 256]> = StaticCell::new();
+    static MSOS_DESC: StaticCell<[u8; 128]> = StaticCell::new();
+    static CONTROL_BUF: StaticCell<[u8; 128]> = StaticCell::new();
+
+    // UsbDevice builder
+    let mut builder = Builder::new(
+        driver,
+        usb_config,
+        &mut CONFIG_DESC.init([0; 256])[..],
+        &mut BOS_DESC.init([0; 256])[..],
+        &mut MSOS_DESC.init([0; 128])[..],
+        &mut CONTROL_BUF.init([0; 128])[..],
+    );
+
+    static device_handler: StaticCell<UsbDeviceHandler> = StaticCell::new();
+    builder.handler(device_handler.init(UsbDeviceHandler::new()));
 
-impl<D: Driver<'static>> KeyboardUsbDevice<'static, D> {
-    pub(crate) fn new(driver: D, keyboard_config: KeyboardUsbConfig<'static>) -> Self {
-        // Create embassy-usb Config
-        let mut usb_config = embassy_usb::Config::new(keyboard_config.vid, keyboard_config.pid);
-        usb_config.manufacturer = Some(keyboard_config.manufacturer);
-        usb_config.product = Some(keyboard_config.product_name);
-        usb_config.serial_number = Some(keyboard_config.serial_number);
-        usb_config.max_power = 450;
-        usb_config.supports_remote_wakeup = true;
-
-        // Required for windows compatibility.
-        usb_config.max_packet_size_0 = 64;
-        usb_config.device_class = 0xEF;
-        usb_config.device_sub_class = 0x02;
-        usb_config.device_protocol = 0x01;
-        usb_config.composite_with_iads = true;
-
-        // Create embassy-usb DeviceBuilder using the driver and config.
-        static CONFIG_DESC: StaticCell<[u8; 256]> = StaticCell::new();
-        static BOS_DESC: StaticCell<[u8; 256]> = StaticCell::new();
-        static MSOS_DESC: StaticCell<[u8; 128]> = StaticCell::new();
-        static CONTROL_BUF: StaticCell<[u8; 128]> = StaticCell::new();
-
-        // UsbDevice builder
-        let mut builder = Builder::new(
-            driver,
-            usb_config,
-            &mut CONFIG_DESC.init([0; 256])[..],
-            &mut BOS_DESC.init([0; 256])[..],
-            &mut MSOS_DESC.init([0; 128])[..],
-            &mut CONTROL_BUF.init([0; 128])[..],
-        );
-
-        static device_handler: StaticCell<UsbDeviceHandler> = StaticCell::new();
-        builder.handler(device_handler.init(UsbDeviceHandler::new()));
-
-        // Create classes on the builder.
-        static request_handler: UsbRequestHandler = UsbRequestHandler {};
-
-        // Initialize two hid interfaces: keyboard & via
-        static keyboard_request_handler: StaticCell<UsbRequestHandler> = StaticCell::new();
-        let keyboard_hid_config = Config {
-            report_descriptor: crate::usb::descriptor::KeyboardReport::desc(),
-            request_handler: Some(keyboard_request_handler.init(UsbRequestHandler {})),
+    builder
+}
+
+pub(crate) fn register_usb_writer<D: Driver<'static>, SD: SerializedDescriptor, const N: usize>(
+    usb_builder: &mut Builder<'static, D>,
+) -> HidWriter<'static, D, N> {
+    // Initialize hid interfaces
+    static request_handler: StaticCell<UsbRequestHandler> = StaticCell::new();
+    let hid_config = Config {
+        report_descriptor: SD::desc(),
+        request_handler: Some(request_handler.init(UsbRequestHandler {})),
+        poll_ms: 1,
+        max_packet_size: 64,
+    };
+    static STATE: StaticCell<State> = StaticCell::new();
+    HidWriter::new(usb_builder, STATE.init(State::new()), hid_config)
+}
+
+#[macro_export]
+macro_rules! register_usb_writer {
+    ($usb_builder:expr, $descriptor:ty, $n:expr) => {{
+        // Initialize hid writer
+        // Current implementation requires the static STATE, so we need to use the paste crate to generate the static variable name.
+        use usbd_hid::descriptor::SerializedDescriptor;
+        paste::paste! {
+            static [<$descriptor:snake:upper _STATE>]: ::static_cell::StaticCell<::embassy_usb::class::hid::State> = ::static_cell::StaticCell::new();
+            static [<$descriptor:snake:upper _HANDLER>]: ::static_cell::StaticCell<$crate::usb::UsbRequestHandler> = ::static_cell::StaticCell::new();
+        }
+
+        let state = paste::paste! { [<$descriptor:snake:upper _STATE>].init(::embassy_usb::class::hid::State::new()) };
+        let request_handler = paste::paste! { [<$descriptor:snake:upper _HANDLER>].init($crate::usb::UsbRequestHandler {}) };
+
+        let hid_config = ::embassy_usb::class::hid::Config {
+            report_descriptor: <$descriptor>::desc(),
+            request_handler: Some(request_handler),
             poll_ms: 1,
             max_packet_size: 64,
         };
-        static KEYBOARD_HID_STATE: StaticCell<State> = StaticCell::new();
-        let keyboard_hid: HidReaderWriter<'_, D, 1, 8> = HidReaderWriter::new(
-            &mut builder,
-            KEYBOARD_HID_STATE.init(State::new()),
-            keyboard_hid_config,
-        );
-
-        static other_request_handler: StaticCell<UsbRequestHandler> = StaticCell::new();
-        let other_hid_config = Config {
-            report_descriptor: CompositeReport::desc(),
-            request_handler: Some(other_request_handler.init(UsbRequestHandler {})),
+
+        let rw: ::embassy_usb::class::hid::HidWriter<_, $n> = ::embassy_usb::class::hid::HidWriter::new($usb_builder, state, hid_config);
+        rw
+    }};
+}
+
+#[macro_export]
+macro_rules! add_usb_reader_writer {
+    ($usb_builder:expr, $descriptor:ty, $read_n:expr, $write_n:expr) => {{
+        // Initialize hid reader writer
+        // Current implementation requires the static STATE, so we need to use the paste crate to generate the static variable name.
+        use usbd_hid::descriptor::SerializedDescriptor;
+        paste::paste! {
+            static [<$descriptor:snake:upper _STATE>]: ::static_cell::StaticCell<::embassy_usb::class::hid::State> = ::static_cell::StaticCell::new();
+            static [<$descriptor:snake:upper _HANDLER>]: ::static_cell::StaticCell<$crate::usb::UsbRequestHandler> = ::static_cell::StaticCell::new();
+        }
+
+        let state = paste::paste! { [<$descriptor:snake:upper _STATE>].init(::embassy_usb::class::hid::State::new()) };
+        let request_handler = paste::paste! { [<$descriptor:snake:upper _HANDLER>].init($crate::usb::UsbRequestHandler {}) };
+
+        let hid_config = ::embassy_usb::class::hid::Config {
+            report_descriptor: <$descriptor>::desc(),
+            request_handler: Some(request_handler),
             poll_ms: 1,
             max_packet_size: 64,
         };
-        static OTHER_HID_STATE: StaticCell<State> = StaticCell::new();
-        let other_hid: HidWriter<'_, D, 9> = HidWriter::new(
-            &mut builder,
-            OTHER_HID_STATE.init(State::new()),
-            other_hid_config,
-        );
-
-        static via_request_handler: StaticCell<UsbRequestHandler> = StaticCell::new();
-        let via_config = Config {
-            report_descriptor: ViaReport::desc(),
-            request_handler: Some(via_request_handler.init(UsbRequestHandler {})),
-            poll_ms: 10,
-            max_packet_size: 32,
-        };
-        static VIA_STATE: StaticCell<State> = StaticCell::new();
-        let via_hid: HidReaderWriter<'_, D, 32, 32> =
-            HidReaderWriter::new(&mut builder, VIA_STATE.init(State::new()), via_config);
 
-        // Build usb device
-        let usb = builder.build();
-        let (reader, writer) = keyboard_hid.split();
-        Self {
-            device: usb,
-            keyboard_hid_reader: UsbHidReader::new(reader),
-            keyboard_hid_writer: UsbHidWriter::new(writer),
-            other_hid_writer: UsbHidWriter::new(other_hid),
-            via_hid: UsbHidReaderWriter::new(via_hid),
-        }
-    }
+        let rw: ::embassy_usb::class::hid::HidReaderWriter<_, $read_n, $write_n> = ::embassy_usb::class::hid::HidReaderWriter::new($usb_builder, state, hid_config);
+        rw
+    }};
 }
 
-struct UsbRequestHandler {}
+pub(crate) struct UsbRequestHandler {}
 
 impl RequestHandler for UsbRequestHandler {
     fn set_report(&mut self, id: ReportId, data: &[u8]) -> OutResponse {
@@ -181,7 +258,7 @@ impl RequestHandler for UsbRequestHandler {
     }
 }
 
-struct UsbDeviceHandler {}
+pub(crate) struct UsbDeviceHandler {}
 
 impl UsbDeviceHandler {
     fn new() -> Self {
diff --git a/rmk/src/via/mod.rs b/rmk/src/via/mod.rs
index 600ef61a..f819a29a 100644
--- a/rmk/src/via/mod.rs
+++ b/rmk/src/via/mod.rs
@@ -1,26 +1,401 @@
-use self::process::VialService;
-use crate::hid::HidReaderWriterWrapper;
+use crate::{
+    channel::FLASH_CHANNEL,
+    config::VialConfig,
+    hid::{HidError, HidReaderTrait, HidWriterTrait},
+    keyboard_macro::{MACRO_SPACE_SIZE, NUM_MACRO},
+    keymap::KeyMap,
+    storage::FlashOperationMessage,
+    usb::descriptor::ViaReport,
+    via::keycode_convert::{from_via_keycode, to_via_keycode},
+};
+use byteorder::{BigEndian, ByteOrder, LittleEndian};
+use core::cell::RefCell;
+use embassy_time::Instant;
 use embassy_time::Timer;
+use embassy_usb::{class::hid::HidReaderWriter, driver::Driver};
+use num_enum::{FromPrimitive as _, TryFromPrimitive as _};
+use protocol::{ViaCommand, ViaKeyboardInfo, VIA_FIRMWARE_VERSION, VIA_PROTOCOL_VERSION};
+use vial::process_vial;
 
 pub(crate) mod keycode_convert;
-pub(crate) mod process;
 mod protocol;
 mod vial;
 
-pub(crate) async fn vial_task<
+pub(crate) struct VialService<
     'a,
-    Hid: HidReaderWriterWrapper,
+    RW: HidWriterTrait<ReportType = ViaReport> + HidReaderTrait<ReportType = ViaReport>,
     const ROW: usize,
     const COL: usize,
     const NUM_LAYER: usize,
->(
-    via_hid: &mut Hid,
-    vial_service: &mut VialService<'a, ROW, COL, NUM_LAYER>,
-) {
-    loop {
-        match vial_service.process_via_report(via_hid).await {
-            Ok(_) => Timer::after_millis(1).await,
-            Err(_) => Timer::after_millis(500).await,
+> {
+    // VialService holds a reference of keymap, for updating
+    keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
+
+    // Vial config
+    vial_config: VialConfig<'static>,
+
+    // Usb vial hid reader writer
+    pub(crate) reader_writer: RW,
+}
+
+impl<
+        'a,
+        RW: HidWriterTrait<ReportType = ViaReport> + HidReaderTrait<ReportType = ViaReport>,
+        const ROW: usize,
+        const COL: usize,
+        const NUM_LAYER: usize,
+    > VialService<'a, RW, ROW, COL, NUM_LAYER>
+{
+    // VialService::new() should be called only once.
+    // Otherwise the `vial_buf.init()` will panic.
+    pub(crate) fn new(
+        keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
+        vial_config: VialConfig<'static>,
+        reader_writer: RW,
+    ) -> Self {
+        Self {
+            keymap,
+            vial_config,
+            reader_writer,
+        }
+    }
+
+    pub(crate) async fn run(&mut self) {
+        loop {
+            match self.process().await {
+                Ok(_) => continue,
+                Err(e) => {
+                    error!("Process vial error: {}", e);
+                    Timer::after_millis(500).await
+                }
+            }
+        }
+    }
+
+    pub(crate) async fn process(&mut self) -> Result<(), HidError> {
+        let mut via_report = self.reader_writer.read_report().await?;
+
+        self.process_via_packet(&mut via_report, self.keymap).await;
+
+        // Send via report back after processing
+        self.reader_writer.write_report(via_report).await?;
+
+        Ok(())
+    }
+
+    async fn process_via_packet(
+        &self,
+        report: &mut ViaReport,
+        keymap: &RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
+    ) {
+        let command_id = report.output_data[0];
+
+        // `report.input_data` is initialized using `report.output_data`
+        report.input_data = report.output_data;
+        let via_command = ViaCommand::from_primitive(command_id);
+        // debug!("Received via command: {}, report: {:02X?}", via_command, report.output_data);
+        match via_command {
+            ViaCommand::GetProtocolVersion => {
+                BigEndian::write_u16(&mut report.input_data[1..3], VIA_PROTOCOL_VERSION);
+            }
+            ViaCommand::GetKeyboardValue => {
+                // Check the second u8
+                match ViaKeyboardInfo::try_from_primitive(report.output_data[1]) {
+                    Ok(v) => match v {
+                        ViaKeyboardInfo::Uptime => {
+                            let value = Instant::now().as_millis() as u32;
+                            BigEndian::write_u32(&mut report.input_data[2..6], value);
+                        }
+                        ViaKeyboardInfo::LayoutOptions => {
+                            // TODO: retrieve layout option from storage
+                            let layout_option: u32 = 0;
+                            BigEndian::write_u32(&mut report.input_data[2..6], layout_option);
+                        }
+                        ViaKeyboardInfo::SwitchMatrixState => {
+                            warn!("GetKeyboardValue - SwitchMatrixState")
+                        }
+                        ViaKeyboardInfo::FirmwareVersion => {
+                            BigEndian::write_u32(
+                                &mut report.input_data[2..6],
+                                VIA_FIRMWARE_VERSION,
+                            );
+                        }
+                        _ => (),
+                    },
+                    Err(e) => error!("Invalid subcommand: {} of GetKeyboardValue", e.number),
+                }
+            }
+            ViaCommand::SetKeyboardValue => {
+                // Check the second u8
+                match ViaKeyboardInfo::try_from_primitive(report.output_data[1]) {
+                    Ok(v) => match v {
+                        ViaKeyboardInfo::LayoutOptions => {
+                            let layout_option = BigEndian::read_u32(&report.output_data[2..6]);
+                            FLASH_CHANNEL
+                                .send(FlashOperationMessage::LayoutOptions(layout_option))
+                                .await;
+                        }
+                        ViaKeyboardInfo::DeviceIndication => {
+                            let _device_indication = report.output_data[2];
+                            warn!("SetKeyboardValue - DeviceIndication")
+                        }
+                        _ => (),
+                    },
+                    Err(e) => error!("Invalid subcommand: {} of GetKeyboardValue", e.number),
+                }
+            }
+            ViaCommand::DynamicKeymapGetKeyCode => {
+                let layer = report.output_data[1] as usize;
+                let row = report.output_data[2] as usize;
+                let col = report.output_data[3] as usize;
+                let action = keymap.borrow_mut().get_action_at(row, col, layer);
+                let keycode = to_via_keycode(action);
+                info!(
+                    "Getting keycode: {:02X} at ({},{}), layer {}",
+                    keycode, row, col, layer
+                );
+                BigEndian::write_u16(&mut report.input_data[4..6], keycode);
+            }
+            ViaCommand::DynamicKeymapSetKeyCode => {
+                let layer = report.output_data[1];
+                let row = report.output_data[2];
+                let col = report.output_data[3];
+                let keycode = BigEndian::read_u16(&report.output_data[4..6]);
+                let action = from_via_keycode(keycode);
+                info!(
+                    "Setting keycode: 0x{:02X} at ({},{}), layer {} as {}",
+                    keycode, row, col, layer, action
+                );
+                keymap.borrow_mut().set_action_at(
+                    row as usize,
+                    col as usize,
+                    layer as usize,
+                    action,
+                );
+                FLASH_CHANNEL
+                    .send(FlashOperationMessage::KeymapKey {
+                        layer,
+                        col,
+                        row,
+                        action,
+                    })
+                    .await;
+            }
+            ViaCommand::DynamicKeymapReset => {
+                warn!("Dynamic keymap reset -- not supported")
+            }
+            ViaCommand::CustomSetValue => {
+                // backlight/rgblight/rgb matrix/led matrix/audio settings here
+                warn!("Custom set value -- not supported")
+            }
+            ViaCommand::CustomGetValue => {
+                // backlight/rgblight/rgb matrix/led matrix/audio settings here
+                warn!("Custom get value -- not supported")
+            }
+            ViaCommand::CustomSave => {
+                // backlight/rgblight/rgb matrix/led matrix/audio settings here
+                warn!("Custom get value -- not supported")
+            }
+            ViaCommand::EepromReset => {
+                warn!("Reseting storage..");
+                FLASH_CHANNEL.send(FlashOperationMessage::Reset).await
+                // TODO: Reboot after a eeprom reset?
+            }
+            ViaCommand::BootloaderJump => {
+                warn!("Bootloader jump -- not supported")
+            }
+            ViaCommand::DynamicKeymapMacroGetCount => {
+                report.input_data[1] = 8;
+                warn!("Macro get count -- to be implemented")
+            }
+            ViaCommand::DynamicKeymapMacroGetBufferSize => {
+                report.input_data[1] = (MACRO_SPACE_SIZE as u16 >> 8) as u8;
+                report.input_data[2] = (MACRO_SPACE_SIZE & 0xFF) as u8;
+                warn!("Macro get buffer size -- to be implemented")
+            }
+            ViaCommand::DynamicKeymapMacroGetBuffer => {
+                let offset = BigEndian::read_u16(&report.output_data[1..3]) as usize;
+                let size = report.output_data[3] as usize;
+                if size <= 28 {
+                    report.input_data[4..4 + size]
+                        .copy_from_slice(&self.keymap.borrow().macro_cache[offset..offset + size]);
+                    debug!(
+                        "Get macro buffer: offset: {}, data: {:02X}",
+                        offset, report.input_data
+                    );
+                } else {
+                    report.input_data[0] = 0xFF;
+                }
+            }
+            ViaCommand::DynamicKeymapMacroSetBuffer => {
+                // Every write writes all buffer space of the macro(if it's not empty)
+                // The sequence must have NUM_MACRO 0s, where each 0 indicates the end of a macro
+                let offset = BigEndian::read_u16(&report.output_data[1..3]);
+                // Current sequence size, <= 28
+                let size = report.output_data[3];
+                // End of current sequence in the macro cache
+                let end = offset + size as u16;
+
+                // The first sequence, reset the macro cache
+                if offset == 0 {
+                    self.keymap.borrow_mut().macro_cache = [0; MACRO_SPACE_SIZE];
+                }
+
+                // Update macro cache
+                info!("Setting macro buffer, offset: {}, size: {}", offset, size);
+                info!("Data: {=[u8]:x}", report.output_data[4..]);
+                self.keymap.borrow_mut().macro_cache[offset as usize..end as usize]
+                    .copy_from_slice(&report.output_data[4..4 + size as usize]);
+
+                // Count zeros, if there're NUM_MACRO 0s in total, current sequnce is the last.
+                // Then flush macros to storage
+                let num_zero = count_zeros(&self.keymap.borrow_mut().macro_cache[0..end as usize]);
+                if size < 28 || num_zero >= NUM_MACRO {
+                    let buf = self.keymap.borrow_mut().macro_cache;
+                    FLASH_CHANNEL
+                        .send(FlashOperationMessage::WriteMacro(buf))
+                        .await;
+                    info!("Flush macros to storage")
+                }
+            }
+            ViaCommand::DynamicKeymapMacroReset => {
+                warn!("Macro reset -- to be implemented")
+            }
+            ViaCommand::DynamicKeymapGetLayerCount => {
+                report.input_data[1] = NUM_LAYER as u8;
+            }
+            ViaCommand::DynamicKeymapGetBuffer => {
+                let offset = BigEndian::read_u16(&report.output_data[1..3]);
+                // size <= 28
+                let size = report.output_data[3];
+                debug!("Getting keymap buffer, offset: {}, size: {}", offset, size);
+                let mut idx = 4;
+                keymap
+                    .borrow()
+                    .layers
+                    .iter()
+                    .flatten()
+                    .flatten()
+                    .skip((offset / 2) as usize)
+                    .take((size / 2) as usize)
+                    .for_each(|a| {
+                        let kc = to_via_keycode(*a);
+                        BigEndian::write_u16(&mut report.input_data[idx..idx + 2], kc);
+                        idx += 2;
+                    });
+            }
+            ViaCommand::DynamicKeymapSetBuffer => {
+                debug!("Dynamic keymap set buffer");
+                let offset = BigEndian::read_u16(&report.output_data[1..3]);
+                // size <= 28
+                let size = report.output_data[3];
+                let mut idx = 4;
+                let (row_num, col_num, _layer_num) = keymap.borrow().get_keymap_config();
+                keymap
+                    .borrow_mut()
+                    .layers
+                    .iter_mut()
+                    .flatten()
+                    .flatten()
+                    .skip(offset as usize)
+                    .take(size as usize)
+                    .enumerate()
+                    .for_each(|(i, a)| {
+                        let via_keycode = LittleEndian::read_u16(&report.output_data[idx..idx + 2]);
+                        let action: crate::action::KeyAction = from_via_keycode(via_keycode);
+                        *a = action;
+                        idx += 2;
+                        let current_offset = offset as usize + i;
+                        let (row, col, layer) =
+                            get_position_from_offset(current_offset, row_num, col_num);
+                        info!(
+                            "Setting keymap buffer of offset: {}, row,col,layer: {},{},{}",
+                            offset, row, col, layer
+                        );
+                        if let Err(_e) = FLASH_CHANNEL.try_send(FlashOperationMessage::KeymapKey {
+                            layer: layer as u8,
+                            col: col as u8,
+                            row: row as u8,
+                            action,
+                        }) {
+                            error!("Send keymap setting command error")
+                        }
+                    });
+            }
+            ViaCommand::DynamicKeymapGetEncoder => {
+                warn!("Keymap get encoder -- not supported");
+            }
+            ViaCommand::DynamicKeymapSetEncoder => {
+                warn!("Keymap set encoder -- not supported");
+            }
+            ViaCommand::Vial => {
+                process_vial(
+                    report,
+                    self.vial_config.vial_keyboard_id,
+                    self.vial_config.vial_keyboard_def,
+                    keymap,
+                )
+                .await
+            }
+            ViaCommand::Unhandled => {
+                info!("Unknown cmd: {}", report.output_data);
+                report.input_data[0] = ViaCommand::Unhandled as u8
+            }
         }
     }
 }
+
+fn get_position_from_offset(
+    offset: usize,
+    max_row: usize,
+    max_col: usize,
+) -> (usize, usize, usize) {
+    let layer = offset / (max_col * max_row);
+    let current_layer_offset = offset % (max_col * max_row);
+    let row = current_layer_offset / max_col;
+    let col = current_layer_offset % max_col;
+    (row, col, layer)
+}
+
+fn count_zeros(data: &[u8]) -> usize {
+    data.iter().filter(|&&x| x == 0).count()
+}
+
+pub struct UsbVialReaderWriter<'a, 'd, D: Driver<'d>> {
+    pub(crate) vial_reader_writer: &'a mut HidReaderWriter<'d, D, 32, 32>,
+}
+
+impl<'a, 'd, D: Driver<'d>> UsbVialReaderWriter<'a, 'd, D> {
+    pub(crate) fn new(vial_reader_writer: &'a mut HidReaderWriter<'d, D, 32, 32>) -> Self {
+        Self { vial_reader_writer }
+    }
+}
+
+impl<'a, 'd, D: Driver<'d>> HidWriterTrait for UsbVialReaderWriter<'a, 'd, D> {
+    type ReportType = ViaReport;
+
+    async fn write_report(&mut self, report: Self::ReportType) -> Result<usize, HidError> {
+        self.vial_reader_writer
+            .write_serialize(&report)
+            .await
+            .map_err(|e| HidError::UsbEndpointError(e))?;
+        Ok(32)
+    }
+}
+
+impl<'a, 'd, D: Driver<'d>> HidReaderTrait for UsbVialReaderWriter<'a, 'd, D> {
+    type ReportType = ViaReport;
+
+    async fn read_report(&mut self) -> Result<ViaReport, HidError> {
+        let mut read_report = ViaReport {
+            input_data: [0; 32],
+            output_data: [0; 32],
+        };
+        self.vial_reader_writer
+            .read(&mut read_report.output_data)
+            .await
+            .map_err(|e| HidError::UsbReadError(e))?;
+
+        Ok(read_report)
+    }
+}
diff --git a/rmk/src/via/process.rs b/rmk/src/via/process.rs
deleted file mode 100644
index 02b82c6e..00000000
--- a/rmk/src/via/process.rs
+++ /dev/null
@@ -1,347 +0,0 @@
-use super::{protocol::*, vial::process_vial};
-use crate::{
-    config::VialConfig,
-    hid::{HidError, HidReaderWriterWrapper},
-    keyboard_macro::{MACRO_SPACE_SIZE, NUM_MACRO},
-    keymap::KeyMap,
-    storage::{FlashOperationMessage, FLASH_CHANNEL},
-    usb::descriptor::ViaReport,
-    via::keycode_convert::{from_via_keycode, to_via_keycode},
-};
-use byteorder::{BigEndian, ByteOrder, LittleEndian};
-use core::cell::RefCell;
-use embassy_time::Instant;
-use num_enum::{FromPrimitive, TryFromPrimitive};
-
-pub(crate) struct VialService<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize> {
-    // VialService holds a reference of keymap, for updating
-    keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
-
-    // Vial config
-    vial_config: VialConfig<'a>,
-}
-
-impl<'a, const ROW: usize, const COL: usize, const NUM_LAYER: usize>
-    VialService<'a, ROW, COL, NUM_LAYER>
-{
-    pub(crate) fn new(
-        keymap: &'a RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
-        vial_config: VialConfig<'a>,
-    ) -> Self {
-        Self {
-            keymap,
-            vial_config,
-        }
-    }
-
-    pub(crate) async fn process_via_report<Hid: HidReaderWriterWrapper>(
-        &mut self,
-        hid_interface: &mut Hid,
-    ) -> Result<(), ()> {
-        let mut via_report = ViaReport {
-            input_data: [0; 32],
-            output_data: [0; 32],
-        };
-        match hid_interface.read(&mut via_report.output_data).await {
-            Ok(_) => {
-                self.process_via_packet(&mut via_report, self.keymap).await;
-
-                // Send via report back after processing
-                match hid_interface.write_serialize(&via_report).await {
-                    Ok(_) => Ok(()),
-                    Err(e) => {
-                        error!("Send via report error: {:?}", e);
-                        // Printed error message, ignore the error type
-                        Err(())
-                    }
-                }
-            }
-            Err(e) => {
-                if e != HidError::UsbDisabled && e != HidError::BleDisconnected {
-                    // Don't print message if the USB endpoint is disabled(aka not connected)
-                    error!("Read via report error: {:?}", e);
-                }
-                // Printed error message, ignore the error type
-                Err(())
-            }
-        }
-    }
-
-    async fn process_via_packet(
-        &self,
-        report: &mut ViaReport,
-        keymap: &RefCell<KeyMap<'a, ROW, COL, NUM_LAYER>>,
-    ) {
-        let command_id = report.output_data[0];
-
-        // `report.input_data` is initialized using `report.output_data`
-        report.input_data = report.output_data;
-        let via_command = ViaCommand::from_primitive(command_id);
-        // debug!("Received via command: {}, report: {:02X?}", via_command, report.output_data);
-        match via_command {
-            ViaCommand::GetProtocolVersion => {
-                BigEndian::write_u16(&mut report.input_data[1..3], VIA_PROTOCOL_VERSION);
-            }
-            ViaCommand::GetKeyboardValue => {
-                // Check the second u8
-                match ViaKeyboardInfo::try_from_primitive(report.output_data[1]) {
-                    Ok(v) => match v {
-                        ViaKeyboardInfo::Uptime => {
-                            let value = Instant::now().as_millis() as u32;
-                            BigEndian::write_u32(&mut report.input_data[2..6], value);
-                        }
-                        ViaKeyboardInfo::LayoutOptions => {
-                            // TODO: retrieve layout option from storage
-                            let layout_option: u32 = 0;
-                            BigEndian::write_u32(&mut report.input_data[2..6], layout_option);
-                        }
-                        ViaKeyboardInfo::SwitchMatrixState => {
-                            warn!("GetKeyboardValue - SwitchMatrixState")
-                        }
-                        ViaKeyboardInfo::FirmwareVersion => {
-                            BigEndian::write_u32(
-                                &mut report.input_data[2..6],
-                                VIA_FIRMWARE_VERSION,
-                            );
-                        }
-                        _ => (),
-                    },
-                    Err(e) => error!("Invalid subcommand: {} of GetKeyboardValue", e.number),
-                }
-            }
-            ViaCommand::SetKeyboardValue => {
-                // Check the second u8
-                match ViaKeyboardInfo::try_from_primitive(report.output_data[1]) {
-                    Ok(v) => match v {
-                        ViaKeyboardInfo::LayoutOptions => {
-                            let layout_option = BigEndian::read_u32(&report.output_data[2..6]);
-                            FLASH_CHANNEL
-                                .send(FlashOperationMessage::LayoutOptions(layout_option))
-                                .await;
-                        }
-                        ViaKeyboardInfo::DeviceIndication => {
-                            let _device_indication = report.output_data[2];
-                            warn!("SetKeyboardValue - DeviceIndication")
-                        }
-                        _ => (),
-                    },
-                    Err(e) => error!("Invalid subcommand: {} of GetKeyboardValue", e.number),
-                }
-            }
-            ViaCommand::DynamicKeymapGetKeyCode => {
-                let layer = report.output_data[1] as usize;
-                let row = report.output_data[2] as usize;
-                let col = report.output_data[3] as usize;
-                let action = keymap.borrow_mut().get_action_at(row, col, layer);
-                let keycode = to_via_keycode(action);
-                info!(
-                    "Getting keycode: {:02X} at ({},{}), layer {}",
-                    keycode, row, col, layer
-                );
-                BigEndian::write_u16(&mut report.input_data[4..6], keycode);
-            }
-            ViaCommand::DynamicKeymapSetKeyCode => {
-                let layer = report.output_data[1];
-                let row = report.output_data[2];
-                let col = report.output_data[3];
-                let keycode = BigEndian::read_u16(&report.output_data[4..6]);
-                let action = from_via_keycode(keycode);
-                info!(
-                    "Setting keycode: 0x{:X} at ({},{}), layer {} as {:?}",
-                    keycode, row, col, layer, action
-                );
-                keymap.borrow_mut().set_action_at(
-                    row as usize,
-                    col as usize,
-                    layer as usize,
-                    action,
-                );
-                FLASH_CHANNEL
-                    .send(FlashOperationMessage::KeymapKey {
-                        layer,
-                        col,
-                        row,
-                        action,
-                    })
-                    .await;
-            }
-            ViaCommand::DynamicKeymapReset => {
-                warn!("Dynamic keymap reset -- not supported")
-            }
-            ViaCommand::CustomSetValue => {
-                // backlight/rgblight/rgb matrix/led matrix/audio settings here
-                warn!("Custom set value -- not supported")
-            }
-            ViaCommand::CustomGetValue => {
-                // backlight/rgblight/rgb matrix/led matrix/audio settings here
-                warn!("Custom get value -- not supported")
-            }
-            ViaCommand::CustomSave => {
-                // backlight/rgblight/rgb matrix/led matrix/audio settings here
-                warn!("Custom get value -- not supported")
-            }
-            ViaCommand::EepromReset => {
-                warn!("Reseting storage..");
-                FLASH_CHANNEL.send(FlashOperationMessage::Reset).await
-                // TODO: Reboot after a eeprom reset?
-            }
-            ViaCommand::BootloaderJump => {
-                warn!("Bootloader jump -- not supported")
-            }
-            ViaCommand::DynamicKeymapMacroGetCount => {
-                report.input_data[1] = 8;
-                warn!("Macro get count -- to be implemented")
-            }
-            ViaCommand::DynamicKeymapMacroGetBufferSize => {
-                report.input_data[1] = (MACRO_SPACE_SIZE as u16 >> 8) as u8;
-                report.input_data[2] = (MACRO_SPACE_SIZE & 0xFF) as u8;
-                warn!("Macro get buffer size -- to be implemented")
-            }
-            ViaCommand::DynamicKeymapMacroGetBuffer => {
-                let offset = BigEndian::read_u16(&report.output_data[1..3]) as usize;
-                let size = report.output_data[3] as usize;
-                if size <= 28 {
-                    report.input_data[4..4 + size]
-                        .copy_from_slice(&self.keymap.borrow().macro_cache[offset..offset + size]);
-                    debug!(
-                        "Get macro buffer: offset: {}, data: {:?}",
-                        offset, report.input_data
-                    );
-                } else {
-                    report.input_data[0] = 0xFF;
-                }
-            }
-            ViaCommand::DynamicKeymapMacroSetBuffer => {
-                // Every write writes all buffer space of the macro(if it's not empty)
-                // The sequence must have NUM_MACRO 0s, where each 0 indicates the end of a macro
-                let offset = BigEndian::read_u16(&report.output_data[1..3]);
-                // Current sequence size, <= 28
-                let size = report.output_data[3];
-                // End of current sequence in the macro cache
-                let end = offset + size as u16;
-
-                // The first sequence, reset the macro cache
-                if offset == 0 {
-                    self.keymap.borrow_mut().macro_cache = [0; MACRO_SPACE_SIZE];
-                }
-
-                // Update macro cache
-                info!("Setting macro buffer, offset: {}, size: {}", offset, size);
-                #[cfg(feature = "defmt")]
-                info!("Data: {=[u8]:x}", report.output_data[4..]);
-                self.keymap.borrow_mut().macro_cache[offset as usize..end as usize]
-                    .copy_from_slice(&report.output_data[4..4 + size as usize]);
-
-                // Count zeros, if there're NUM_MACRO 0s in total, current sequnce is the last.
-                // Then flush macros to storage
-                let num_zero = count_zeros(&self.keymap.borrow_mut().macro_cache[0..end as usize]);
-                if size < 28 || num_zero >= NUM_MACRO {
-                    let buf = self.keymap.borrow_mut().macro_cache;
-                    FLASH_CHANNEL
-                        .send(FlashOperationMessage::WriteMacro(buf))
-                        .await;
-                    info!("Flush macros to storage")
-                }
-            }
-            ViaCommand::DynamicKeymapMacroReset => {
-                warn!("Macro reset -- to be implemented")
-            }
-            ViaCommand::DynamicKeymapGetLayerCount => {
-                report.input_data[1] = NUM_LAYER as u8;
-            }
-            ViaCommand::DynamicKeymapGetBuffer => {
-                let offset = BigEndian::read_u16(&report.output_data[1..3]);
-                // size <= 28
-                let size = report.output_data[3];
-                debug!("Getting keymap buffer, offset: {}, size: {}", offset, size);
-                let mut idx = 4;
-                keymap
-                    .borrow()
-                    .layers
-                    .iter()
-                    .flatten()
-                    .flatten()
-                    .skip((offset / 2) as usize)
-                    .take((size / 2) as usize)
-                    .for_each(|a| {
-                        let kc = to_via_keycode(*a);
-                        BigEndian::write_u16(&mut report.input_data[idx..idx + 2], kc);
-                        idx += 2;
-                    });
-            }
-            ViaCommand::DynamicKeymapSetBuffer => {
-                debug!("Dynamic keymap set buffer");
-                let offset = BigEndian::read_u16(&report.output_data[1..3]);
-                // size <= 28
-                let size = report.output_data[3];
-                let mut idx = 4;
-                let (row_num, col_num, _layer_num) = keymap.borrow().get_keymap_config();
-                keymap
-                    .borrow_mut()
-                    .layers
-                    .iter_mut()
-                    .flatten()
-                    .flatten()
-                    .skip(offset as usize)
-                    .take(size as usize)
-                    .enumerate()
-                    .for_each(|(i, a)| {
-                        let via_keycode = LittleEndian::read_u16(&report.output_data[idx..idx + 2]);
-                        let action: crate::action::KeyAction = from_via_keycode(via_keycode);
-                        *a = action;
-                        idx += 2;
-                        let current_offset = offset as usize + i;
-                        let (row, col, layer) =
-                            get_position_from_offset(current_offset, row_num, col_num);
-                        info!(
-                            "Setting keymap buffer of offset: {}, row,col,layer: {},{},{}",
-                            offset, row, col, layer
-                        );
-                        if let Err(_e) = FLASH_CHANNEL.try_send(FlashOperationMessage::KeymapKey {
-                            layer: layer as u8,
-                            col: col as u8,
-                            row: row as u8,
-                            action,
-                        }) {
-                            error!("Send keymap setting command error")
-                        }
-                    });
-            }
-            ViaCommand::DynamicKeymapGetEncoder => {
-                warn!("Keymap get encoder -- not supported");
-            }
-            ViaCommand::DynamicKeymapSetEncoder => {
-                warn!("Keymap set encoder -- not supported");
-            }
-            ViaCommand::Vial => {
-                process_vial(
-                    report,
-                    self.vial_config.vial_keyboard_id,
-                    self.vial_config.vial_keyboard_def,
-                    keymap,
-                )
-                .await
-            }
-            ViaCommand::Unhandled => {
-                info!("Unknown cmd: {}", report.output_data);
-                report.input_data[0] = ViaCommand::Unhandled as u8
-            }
-        }
-    }
-}
-
-fn get_position_from_offset(
-    offset: usize,
-    max_row: usize,
-    max_col: usize,
-) -> (usize, usize, usize) {
-    let layer = offset / (max_col * max_row);
-    let current_layer_offset = offset % (max_col * max_row);
-    let row = current_layer_offset / max_col;
-    let col = current_layer_offset % max_col;
-    (row, col, layer)
-}
-
-fn count_zeros(data: &[u8]) -> usize {
-    data.iter().filter(|&&x| x == 0).count()
-}
diff --git a/rmk/src/via/vial.rs b/rmk/src/via/vial.rs
index 7e49b2aa..a39b9fe9 100644
--- a/rmk/src/via/vial.rs
+++ b/rmk/src/via/vial.rs
@@ -5,9 +5,10 @@ use num_enum::FromPrimitive;
 
 use crate::{
     action::KeyAction,
+    channel::FLASH_CHANNEL,
     combo::{Combo, COMBO_MAX_NUM},
     keymap::KeyMap,
-    storage::{ComboData, FlashOperationMessage, FLASH_CHANNEL},
+    storage::{ComboData, FlashOperationMessage},
     usb::descriptor::ViaReport,
     via::keycode_convert::{from_via_keycode, to_via_keycode},
 };


Test patch: