From 72af00ecc112cce4bfb8fd0f533feb4fb6aef83e Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 24 Jul 2024 01:48:03 +0300 Subject: [PATCH 01/52] add qr codes [ci skip] --- CHANGELOG.md | 30 +++++++++++++++--------------- ReadMe.md | 30 +++++++++++++++--------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bd2bf2516..777f87c7a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,21 +71,21 @@ [-> Download qFlipper (official link)](https://flipperzero.one/update) ## Please support development of the project -|Service|Remark|Link/Wallet| -|-|-|-| -|**Patreon**||https://patreon.com/mmxdev| -|**Boosty**|patreon alternative|https://boosty.to/mmxdev| -|cloudtips|only RU payments accepted|https://pay.cloudtips.ru/p/7b3e9d65| -|YooMoney|only RU payments accepted|https://yoomoney.ru/fundraise/XA49mgQLPA0.221209| -|USDT|(TRC20)|`TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs`| -|ETH|(BSC/ERC20-Tokens)|`darkflippers.eth` (or `0xFebF1bBc8229418FF2408C07AF6Afa49152fEc6a`)| -|BTC||`bc1q0np836jk9jwr4dd7p6qv66d04vamtqkxrecck9`| -|SOL|(Solana/Tokens)|`DSgwouAEgu8iP5yr7EHHDqMNYWZxAqXWsTEeqCAXGLj8`| -|DOGE||`D6R6gYgBn5LwTNmPyvAQR6bZ9EtGgFCpvv`| -|LTC||`ltc1q3ex4ejkl0xpx3znwrmth4lyuadr5qgv8tmq8z9`| -|BCH||`qquxfyzntuqufy2dx0hrfr4sndp0tucvky4sw8qyu3`| -|XMR|(Monero)| `41xUz92suUu1u5Mu4qkrcs52gtfpu9rnZRdBpCJ244KRHf6xXSvVFevdf2cnjS7RAeYr5hn9MsEfxKoFDRSctFjG5fv1Mhn`| -|TON||`UQCOqcnYkvzOZUV_9bPE_8oTbOrOF03MnF-VcJyjisTZmsxa`| +|Service|Remark|QR Code|Link/Wallet| +|-|-|-|-| +|**Patreon**||
QR image
|https://patreon.com/mmxdev| +|**Boosty**|patreon alternative|
QR image
|https://boosty.to/mmxdev| +|cloudtips|only RU payments accepted|
QR image
|https://pay.cloudtips.ru/p/7b3e9d65| +|YooMoney|only RU payments accepted|
QR image
|https://yoomoney.ru/fundraise/XA49mgQLPA0.221209| +|USDT|(TRC20)|
QR image
|`TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs`| +|ETH|(BSC/ERC20-Tokens)|
QR image
|`darkflippers.eth` (or `0xFebF1bBc8229418FF2408C07AF6Afa49152fEc6a`)| +|BTC||
QR image
|`bc1q0np836jk9jwr4dd7p6qv66d04vamtqkxrecck9`| +|SOL|(Solana/Tokens)|
QR image
|`DSgwouAEgu8iP5yr7EHHDqMNYWZxAqXWsTEeqCAXGLj8`| +|DOGE||
QR image
|`D6R6gYgBn5LwTNmPyvAQR6bZ9EtGgFCpvv`| +|LTC||
QR image
|`ltc1q3ex4ejkl0xpx3znwrmth4lyuadr5qgv8tmq8z9`| +|BCH||
QR image
|`qquxfyzntuqufy2dx0hrfr4sndp0tucvky4sw8qyu3`| +|XMR|(Monero)|
QR image
|`41xUz92suUu1u5Mu4qkrcs52gtfpu9rnZRdBpCJ244KRHf6xXSvVFevdf2cnjS7RAeYr5hn9MsEfxKoFDRSctFjG5fv1Mhn`| +|TON||
QR image
|`UQCOqcnYkvzOZUV_9bPE_8oTbOrOF03MnF-VcJyjisTZmsxa`| #### Thanks to our sponsors who supported project in the past and special thanks to sponsors who supports us on regular basis: @mishamyte, ClaraCrazy, Pathfinder [Count Zero cDc], callmezimbra, Quen0n, MERRON, grvpvl (lvpvrg), art_col, ThurstonWaffles, Moneron, UterGrooll, LUCFER, Northpirate, zloepuzo, T.Rat, Alexey B., ionelife, ... diff --git a/ReadMe.md b/ReadMe.md index 7eb98aeed3..b2911d14d8 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -139,21 +139,21 @@ Our team is small and the guys are working on this project as much as they can s The amount of work done on this project is huge and we need your support, no matter how large or small. Even if you just say, "Thank you Unleashed firmware developers!" somewhere. Doing so will help us continue our work and will help drive us to make the firmware better every time. Also, regarding our releases, every build has and always will be free and open-source. There will be no paywall releases or closed-source apps within the firmware. As long as I am working on this project it will never happen. You can support us by using links or addresses below: -|Service|Remark|Link/Wallet| -|-|-|-| -|**Patreon**||https://patreon.com/mmxdev| -|**Boosty**|patreon alternative|https://boosty.to/mmxdev| -|cloudtips|only RU payments accepted|https://pay.cloudtips.ru/p/7b3e9d65| -|YooMoney|only RU payments accepted|https://yoomoney.ru/fundraise/XA49mgQLPA0.221209| -|USDT|(TRC20)|`TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs`| -|ETH|(BSC/ERC20-Tokens)|`darkflippers.eth` (or `0xFebF1bBc8229418FF2408C07AF6Afa49152fEc6a`)| -|BTC||`bc1q0np836jk9jwr4dd7p6qv66d04vamtqkxrecck9`| -|SOL|(Solana/Tokens)|`DSgwouAEgu8iP5yr7EHHDqMNYWZxAqXWsTEeqCAXGLj8`| -|DOGE||`D6R6gYgBn5LwTNmPyvAQR6bZ9EtGgFCpvv`| -|LTC||`ltc1q3ex4ejkl0xpx3znwrmth4lyuadr5qgv8tmq8z9`| -|BCH||`qquxfyzntuqufy2dx0hrfr4sndp0tucvky4sw8qyu3`| -|XMR|(Monero)| `41xUz92suUu1u5Mu4qkrcs52gtfpu9rnZRdBpCJ244KRHf6xXSvVFevdf2cnjS7RAeYr5hn9MsEfxKoFDRSctFjG5fv1Mhn`| -|TON||`UQCOqcnYkvzOZUV_9bPE_8oTbOrOF03MnF-VcJyjisTZmsxa`| +|Service|Remark|QR Code|Link/Wallet| +|-|-|-|-| +|**Patreon**||
QR image
|https://patreon.com/mmxdev| +|**Boosty**|patreon alternative|
QR image
|https://boosty.to/mmxdev| +|cloudtips|only RU payments accepted|
QR image
|https://pay.cloudtips.ru/p/7b3e9d65| +|YooMoney|only RU payments accepted|
QR image
|https://yoomoney.ru/fundraise/XA49mgQLPA0.221209| +|USDT|(TRC20)|
QR image
|`TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs`| +|ETH|(BSC/ERC20-Tokens)|
QR image
|`darkflippers.eth` (or `0xFebF1bBc8229418FF2408C07AF6Afa49152fEc6a`)| +|BTC||
QR image
|`bc1q0np836jk9jwr4dd7p6qv66d04vamtqkxrecck9`| +|SOL|(Solana/Tokens)|
QR image
|`DSgwouAEgu8iP5yr7EHHDqMNYWZxAqXWsTEeqCAXGLj8`| +|DOGE||
QR image
|`D6R6gYgBn5LwTNmPyvAQR6bZ9EtGgFCpvv`| +|LTC||
QR image
|`ltc1q3ex4ejkl0xpx3znwrmth4lyuadr5qgv8tmq8z9`| +|BCH||
QR image
|`qquxfyzntuqufy2dx0hrfr4sndp0tucvky4sw8qyu3`| +|XMR|(Monero)|
QR image
|`41xUz92suUu1u5Mu4qkrcs52gtfpu9rnZRdBpCJ244KRHf6xXSvVFevdf2cnjS7RAeYr5hn9MsEfxKoFDRSctFjG5fv1Mhn`| +|TON||
QR image
|`UQCOqcnYkvzOZUV_9bPE_8oTbOrOF03MnF-VcJyjisTZmsxa`| ## Community apps included From 23903e7e8da6ed9acf74ba5a89fd38868a7d5e96 Mon Sep 17 00:00:00 2001 From: DerSkythe Date: Wed, 24 Jul 2024 17:56:25 +0400 Subject: [PATCH 02/52] feat: Refactor frequency analyzer code for better readability Refactor to improve structure and readability of the frequency analyzer code. This includes added comments, updating variable names, and reorganizing the frequency list for clarity. The changes also address initialization issues and clean up repetitive code blocks. --- .../subghz/views/subghz_frequency_analyzer.c | 214 ++++++++++-------- 1 file changed, 117 insertions(+), 97 deletions(-) diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.c b/applications/main/subghz/views/subghz_frequency_analyzer.c index 1bb2f044fe..fde3a1f613 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.c +++ b/applications/main/subghz/views/subghz_frequency_analyzer.c @@ -1,7 +1,6 @@ #include "subghz_frequency_analyzer.h" #include -#include #include #include #include @@ -12,20 +11,79 @@ #define TAG "frequency_analyzer" -#define RSSI_MIN -97 -#define RSSI_MAX -60 -#define RSSI_SCALE 2.3 +#define RSSI_MIN (-97.0f) +#define RSSI_MAX (-60.0f) +#define RSSI_SCALE 2.3f #define TRIGGER_STEP 1 #define MAX_HISTORY 4 +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) +#endif static const uint32_t subghz_frequency_list[] = { - 300000000, 302757000, 303875000, 303900000, 304250000, 307000000, 307500000, 307800000, - 309000000, 310000000, 312000000, 312100000, 313000000, 313850000, 314000000, 314350000, - 314980000, 315000000, 318000000, 330000000, 345000000, 348000000, 350000000, 387000000, - 390000000, 418000000, 430000000, 431000000, 431500000, 433075000, 433220000, 433420000, - 433657070, 433889000, 433920000, 434075000, 434176948, 434390000, 434420000, 434775000, - 438900000, 440175000, 464000000, 779000000, 868350000, 868400000, 868800000, 868950000, - 906400000, 915000000, 925000000, 928000000}; + /* 300 - 348 */ + 300000000, + 302757000, + 303875000, + 303900000, + 304250000, + 307000000, + 307500000, + 307800000, + 309000000, + 310000000, + 312000000, + 312100000, + 312200000, + 313000000, + 313850000, + 314000000, + 314350000, + 314980000, + 315000000, + 318000000, + 330000000, + 345000000, + 348000000, + 350000000, + + /* 387 - 464 */ + 387000000, + 390000000, + 418000000, + 430000000, + 430500000, + 431000000, + 431500000, + 433075000, /* LPD433 first */ + 433220000, + 433420000, + 433657070, + 433889000, + 433920000, /* LPD433 mid */ + 434075000, + 434176948, + 434190000, + 434390000, + 434420000, + 434620000, + 434775000, /* LPD433 last channels */ + 438900000, + 440175000, + 464000000, + 467750000, + + /* 779 - 928 */ + 779000000, + 868350000, + 868400000, + 868800000, + 868950000, + 906400000, + 915000000, + 925000000, + 928000000, +}; typedef enum { SubGhzFrequencyAnalyzerStatusIDLE, @@ -80,7 +138,7 @@ void subghz_frequency_analyzer_draw_rssi( uint8_t x, uint8_t y) { // Current RSSI - if(rssi) { + if(!float_is_equal(rssi, 0.f)) { if(rssi > RSSI_MAX) { rssi = RSSI_MAX; } @@ -95,7 +153,7 @@ void subghz_frequency_analyzer_draw_rssi( } // Last RSSI - if(rssi_last) { + if(!float_is_equal(rssi_last, 0.f)) { if(rssi_last > RSSI_MAX) { rssi_last = RSSI_MAX; } @@ -108,7 +166,7 @@ void subghz_frequency_analyzer_draw_rssi( // Trigger cursor trigger = (trigger - RSSI_MIN) / RSSI_SCALE; - uint8_t tr_x = x + 2 * trigger; + uint8_t tr_x = (uint8_t)((float)x + (2 * trigger)); canvas_draw_dot(canvas, tr_x, y + 4); canvas_draw_line(canvas, tr_x - 1, y + 5, tr_x + 1, y + 5); @@ -118,7 +176,7 @@ void subghz_frequency_analyzer_draw_rssi( static void subghz_frequency_analyzer_history_frequency_draw( Canvas* canvas, SubGhzFrequencyAnalyzerModel* model) { - char buffer[64]; + char buffer[64] = {0}; const uint8_t x1 = 2; const uint8_t x2 = 66; const uint8_t y = 37; @@ -161,7 +219,7 @@ static void subghz_frequency_analyzer_history_frequency_draw( } void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel* model) { - char buffer[64]; + char buffer[64] = {0}; // Title canvas_set_color(canvas, ColorBlack); @@ -190,9 +248,7 @@ void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel canvas_draw_box(canvas, 4, 10, 121, 19); canvas_set_color(canvas, ColorWhite); } else { - // TODO: Disable this - //canvas_draw_box(canvas, 4, 11, 121, 19); - //canvas_set_color(canvas, ColorWhite); + canvas_set_color(canvas, ColorBlack); } canvas_draw_str(canvas, 8, 26, buffer); @@ -224,11 +280,14 @@ void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel uint32_t subghz_frequency_find_correct(uint32_t input) { uint32_t prev_freq = 0; - uint32_t current = 0; uint32_t result = 0; + uint32_t current; - for(size_t i = 0; i < sizeof(subghz_frequency_list); i++) { + for(size_t i = 0; i < ARRAY_SIZE(subghz_frequency_list) - 1; i++) { current = subghz_frequency_list[i]; + if(current == 0) { + continue; + } if(current == input) { result = current; break; @@ -249,47 +308,40 @@ uint32_t subghz_frequency_find_correct(uint32_t input) { bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { furi_assert(context); - SubGhzFrequencyAnalyzer* instance = context; + SubGhzFrequencyAnalyzer* instance = (SubGhzFrequencyAnalyzer*)context; bool need_redraw = false; - if(event->key == InputKeyBack) { - return false; + return need_redraw; } - if(((event->type == InputTypePress) || (event->type == InputTypeRepeat)) && - ((event->key == InputKeyLeft) || (event->key == InputKeyRight))) { + bool is_press_or_repeat = (event->type == InputTypePress) || (event->type == InputTypeRepeat); + if(is_press_or_repeat && (event->key == InputKeyLeft || event->key == InputKeyRight)) { // Trigger setup float trigger_level = subghz_frequency_analyzer_worker_get_trigger_level(instance->worker); - switch(event->key) { - case InputKeyLeft: + if(event->key == InputKeyLeft) { trigger_level -= TRIGGER_STEP; if(trigger_level < RSSI_MIN) { trigger_level = RSSI_MIN; } - break; - default: - case InputKeyRight: + } else { trigger_level += TRIGGER_STEP; if(trigger_level > RSSI_MAX) { trigger_level = RSSI_MAX; } - break; } subghz_frequency_analyzer_worker_set_trigger_level(instance->worker, trigger_level); FURI_LOG_D(TAG, "trigger = %.1f", (double)trigger_level); need_redraw = true; } else if(event->type == InputTypePress && event->key == InputKeyUp) { - if(instance->feedback_level == 0) { - instance->feedback_level = 2; + if(instance->feedback_level == SubGHzFrequencyAnalyzerFeedbackLevelAll) { + instance->feedback_level = SubGHzFrequencyAnalyzerFeedbackLevelMute; } else { instance->feedback_level--; } need_redraw = true; - } else if( - ((event->type == InputTypePress) || (event->type == InputTypeRepeat)) && - event->key == InputKeyDown) { + } else if(is_press_or_repeat && event->key == InputKeyDown) { instance->show_frame = instance->max_index > 0; if(instance->show_frame) { instance->selected_index = (instance->selected_index + 1) % instance->max_index; @@ -298,63 +350,32 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { } else if(event->key == InputKeyOk) { need_redraw = true; bool updated = false; - uint32_t frequency_to_save = 0; + uint32_t frequency_to_save; with_view_model( instance->view, SubGhzFrequencyAnalyzerModel * model, { frequency_to_save = model->frequency_to_save; + uint32_t prev_freq_to_save = model->frequency_to_save; + uint32_t frequency_candidate = 0; + if(model->show_frame && !model->signal) { - uint32_t prev_freq_to_save = model->frequency_to_save; - uint32_t frequency_candidate = model->history_frequency[model->selected_index]; - if(frequency_candidate == 0 || - // !furi_hal_subghz_is_frequency_valid(frequency_candidate) || - !subghz_txrx_radio_device_is_frequency_valid( - instance->txrx, frequency_candidate) || - prev_freq_to_save == frequency_candidate) { - frequency_candidate = 0; - } else { - frequency_candidate = subghz_frequency_find_correct(frequency_candidate); - } - if(frequency_candidate > 0 && - frequency_candidate != model->frequency_to_save) { - model->frequency_to_save = frequency_candidate; - updated = true; - } - } else if(model->show_frame && model->signal) { - uint32_t prev_freq_to_save = model->frequency_to_save; - uint32_t frequency_candidate = subghz_frequency_find_correct(model->frequency); - if(frequency_candidate == 0 || - // !furi_hal_subghz_is_frequency_valid(frequency_candidate) || - !subghz_txrx_radio_device_is_frequency_valid( - instance->txrx, frequency_candidate) || - prev_freq_to_save == frequency_candidate) { - frequency_candidate = 0; - } else { - frequency_candidate = subghz_frequency_find_correct(frequency_candidate); - } - if(frequency_candidate > 0 && - frequency_candidate != model->frequency_to_save) { - model->frequency_to_save = frequency_candidate; - updated = true; - } - } else if(!model->show_frame && model->signal) { - uint32_t prev_freq_to_save = model->frequency_to_save; - uint32_t frequency_candidate = subghz_frequency_find_correct(model->frequency); - if(frequency_candidate == 0 || - // !furi_hal_subghz_is_frequency_valid(frequency_candidate) || - !subghz_txrx_radio_device_is_frequency_valid( - instance->txrx, frequency_candidate) || - prev_freq_to_save == frequency_candidate) { - frequency_candidate = 0; - } else { - frequency_candidate = subghz_frequency_find_correct(frequency_candidate); - } - if(frequency_candidate > 0 && - frequency_candidate != model->frequency_to_save) { - model->frequency_to_save = frequency_candidate; - updated = true; - } + frequency_candidate = model->history_frequency[model->selected_index]; + } else if( + (model->show_frame && model->signal) || + (!model->show_frame && model->signal)) { + frequency_candidate = subghz_frequency_find_correct(model->frequency); + } + + frequency_candidate = frequency_candidate == 0 || + !subghz_txrx_radio_device_is_frequency_valid( + instance->txrx, frequency_candidate) || + prev_freq_to_save == frequency_candidate ? + 0 : + subghz_frequency_find_correct(frequency_candidate); + if(frequency_candidate > 0 && frequency_candidate != model->frequency_to_save) { + model->frequency_to_save = frequency_candidate; + updated = true; } }, true); @@ -363,7 +384,7 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { instance->callback(SubGhzCustomEventViewFreqAnalOkShort, instance->context); } - // First device receive short, then when user release button we get long + // First the device receives short, then when user release button we get long if(event->type == InputTypeLong && frequency_to_save > 0) { // Stop worker if(subghz_frequency_analyzer_worker_is_running(instance->worker)) { @@ -375,7 +396,6 @@ bool subghz_frequency_analyzer_input(InputEvent* event, void* context) { } if(need_redraw) { - SubGhzFrequencyAnalyzer* instance = context; with_view_model( instance->view, SubGhzFrequencyAnalyzerModel * model, @@ -412,7 +432,7 @@ void subghz_frequency_analyzer_pair_callback( uint32_t frequency, float rssi, bool signal) { - SubGhzFrequencyAnalyzer* instance = context; + SubGhzFrequencyAnalyzer* instance = (SubGhzFrequencyAnalyzer*)context; if(float_is_equal(rssi, 0.f) && instance->locked) { if(instance->callback) { instance->callback(SubGhzCustomEventSceneAnalyzerUnlock, instance->context); @@ -477,7 +497,7 @@ void subghz_frequency_analyzer_pair_callback( }, false); instance->max_index = max_index; - } else if((rssi != 0.f) && (!instance->locked)) { + } else if(!float_is_equal(rssi, 0.f) && !instance->locked) { // There is some signal FURI_LOG_I(TAG, "rssi = %.2f, frequency = %ld Hz", (double)rssi, frequency); frequency = round_int(frequency, 3); // Round 299999990Hz to 300000000Hz @@ -490,11 +510,11 @@ void subghz_frequency_analyzer_pair_callback( } // Update values - if(rssi >= instance->rssi_last && (frequency != 0)) { + if(rssi >= instance->rssi_last && frequency != 0) { instance->rssi_last = rssi; } - instance->locked = (rssi != 0.f); + instance->locked = !float_is_equal(rssi, 0.f); with_view_model( instance->view, SubGhzFrequencyAnalyzerModel * model, @@ -514,7 +534,7 @@ void subghz_frequency_analyzer_pair_callback( void subghz_frequency_analyzer_enter(void* context) { furi_assert(context); - SubGhzFrequencyAnalyzer* instance = context; + SubGhzFrequencyAnalyzer* instance = (SubGhzFrequencyAnalyzer*)context; //Start worker instance->worker = subghz_frequency_analyzer_worker_alloc(instance->context); @@ -560,7 +580,7 @@ void subghz_frequency_analyzer_enter(void* context) { void subghz_frequency_analyzer_exit(void* context) { furi_assert(context); - SubGhzFrequencyAnalyzer* instance = context; + SubGhzFrequencyAnalyzer* instance = (SubGhzFrequencyAnalyzer*)context; // Stop worker if(subghz_frequency_analyzer_worker_is_running(instance->worker)) { @@ -574,7 +594,7 @@ void subghz_frequency_analyzer_exit(void* context) { SubGhzFrequencyAnalyzer* subghz_frequency_analyzer_alloc(SubGhzTxRx* txrx) { SubGhzFrequencyAnalyzer* instance = malloc(sizeof(SubGhzFrequencyAnalyzer)); - instance->feedback_level = 2; + instance->feedback_level = SubGHzFrequencyAnalyzerFeedbackLevelMute; // View allocation and configuration instance->view = view_alloc(); From 4ed19b518bd5d70fb1c2aeeaae9e0b080a3a148e Mon Sep 17 00:00:00 2001 From: DerSkythe Date: Wed, 24 Jul 2024 18:39:47 +0400 Subject: [PATCH 03/52] fix: remove not printable symbols and update FAQ and BadUSB documentation links for clarity This commit improves the documentation by converting raw URLs into descriptive text links in the FAQ and BadUSB documentation. This enhances readability and navigation for users looking for specific information. Additionally, minor formatting adjustments were made for better consistency and clarity. --- documentation/AppManifests.md | 31 ++- documentation/BarcodeGenerator.md | 15 +- documentation/FAQ.md | 236 +++++++++-------- documentation/FuriHalBus.md | 135 +++++----- documentation/HowToBuild.md | 19 +- .../Firmware update on Developer Board.md | 51 ++-- .../Get started with the Dev Board.md | 94 +++---- .../Reading logs via the Dev Board.md | 76 +++--- documentation/fbt.md | 2 +- .../file_formats/BadUsbScriptFormat.md | 241 ++++++++++-------- 10 files changed, 465 insertions(+), 435 deletions(-) diff --git a/documentation/AppManifests.md b/documentation/AppManifests.md index 98a38ffd85..493c9253bb 100644 --- a/documentation/AppManifests.md +++ b/documentation/AppManifests.md @@ -16,18 +16,18 @@ Only two parameters are mandatory: **appid** and **apptype**. Others are optiona - **apptype**: member of FlipperAppType.\* enumeration. Valid values are: -| Enum member | Firmware component type | -| ----------- | ------------------------------------------------------------------------------------------- | -| SERVICE | System service, created at early startup | -| SYSTEM | Application is not being shown in any menus. It can be started by other apps or from CLI | -| APP | Regular application for the main menu | -| PLUGIN | Application to be built as a part of the firmware and to be placed in the Plugins menu | -| DEBUG | Application only visible in Debug menu with debug mode enabled | -| ARCHIVE | One and only Archive app | -| SETTINGS | Application to be placed in the system settings menu | -| STARTUP | Callback function to run at system startup. Does not define a separate app | -| EXTERNAL | Application to be built as `.fap` plugin | -| METAPACKAGE | Does not define any code to be run, used for declaring dependencies and application bundles | +| Enum member | Firmware component type | +|:----------------|--------------------------------------------------------------------------------------------------| +| SERVICE | System service, created at early startup | +| SYSTEM | Application is not being shown in any menus. It can be started by other apps or from CLI | +| APP | Regular application for the main menu | +| PLUGIN | Application to be built as a part of the firmware and to be placed in the Plugins menu | +| DEBUG | Application only visible in Debug menu with debug mode enabled | +| ARCHIVE | One and only Archive app | +| SETTINGS | Application to be placed in the system settings menu | +| STARTUP | Callback function to run at system startup. Does not define a separate app | +| EXTERNAL | Application to be built as `.fap` plugin | +| METAPACKAGE | Does not define any code to be run, used for declaring dependencies and application bundles | - **name**: name displayed in menus. - **entry_point**: C function to be used as the application's entry point. Note that C++ function names are mangled, so you need to wrap them in `extern "C"` to use them as entry points. @@ -43,7 +43,7 @@ Only two parameters are mandatory: **appid** and **apptype**. Others are optiona - **targets**: list of strings and target names with which this application is compatible. If not specified, the application is built for all targets. The default value is `["all"]`. - **resources**: name of a folder within the application's source folder to be used for packacking SD card resources for this application. They will only be used if application is included in build configuration. The default value is `""`, meaning no resources are packaged. -#### Parameters for external applications +### Parameters for external applications The following parameters are used only for [FAPs](./AppsOnSDCard.md): @@ -59,7 +59,10 @@ The following parameters are used only for [FAPs](./AppsOnSDCard.md): - **fap_extbuild**: provides support for parts of application sources to be built by external tools. Contains a list of `ExtFile(path="file name", command="shell command")` definitions. `fbt` will run the specified command for each file in the list. - **fal_embedded**: boolean, default `False`. Applies only to PLUGIN type. If `True`, the plugin will be embedded into host application's .fap file as a resource and extracted to `apps_assets/APPID` folder on its start. This allows plugins to be distributed as a part of the host application. -Note that commands are executed at the firmware root folder, and all intermediate files must be placed in an application's temporary build folder. For that, you can use pattern expansion by `fbt`: `${FAP_WORK_DIR}` will be replaced with the path to the application's temporary build folder, and `${FAP_SRC_DIR}` will be replaced with the path to the application's source folder. You can also use other variables defined internally by `fbt`. +> [!NOTE] +> These commands are executed at the firmware root folder, and all intermediate files must be placed in an application's temporary build folder. +> For that, you can use pattern expansion by `fbt`: `${FAP_WORK_DIR}` will be replaced with the path to the application's temporary build folder, +> and `${FAP_SRC_DIR}` will be replaced with the path to the application's source folder. You can also use other variables defined internally by `fbt`. Example for building an app from Rust sources: diff --git a/documentation/BarcodeGenerator.md b/documentation/BarcodeGenerator.md index f2b5b2213b..0f429fda16 100644 --- a/documentation/BarcodeGenerator.md +++ b/documentation/BarcodeGenerator.md @@ -1,15 +1,16 @@ # This is a UPC-A Barcode Generator for the Flipper Zero hardware. -## Author: [McAzzaMan](https://github.com/McAzzaMan/flipperzero-firmware/tree/UPC-A_Barcode_Generator/applications/barcode_generator) +> Author: [McAzzaMan](https://github.com/McAzzaMan/flipperzero-firmware/tree/UPC-A_Barcode_Generator/applications/barcode_generator) - + It will eventually be expanded into other barcode types. It currently only generates UPC-A type barcodes. - + - -Controls-
-Hitting the centre button on the Flipper toggles edit mode. -When in edit mode, left and right will change the digit to be changed, and up and down will adjust the digit value. +## Controls - +Hitting the `centre` button on the Flipper toggles edit mode. +When in edit mode, `Left` and `Right` will change the digit to be changed, and up and down will adjust the digit value. + + diff --git a/documentation/FAQ.md b/documentation/FAQ.md index 8f912c517f..96b11aca53 100644 --- a/documentation/FAQ.md +++ b/documentation/FAQ.md @@ -1,41 +1,47 @@ # FAQ ## I bought Flipper Zero and I don't know what I can do with it, pls help -- Start with reading official main page: https://flipperzero.one/ -- Then check out official docs where you can find answers to most questions: https://docs.flipper.net/ + +- Start with reading [official main page](https://flipperzero.one/) +- Then check out official docs where you can find answers to [most questions](https://docs.flipper.net/) ## How do I install Unleashed firmware? -https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/HowToInstall.md -### What version I should install? What do letters `e`, `r`, `c`... mean? -Follow this link for details:
-https://github.com/DarkFlippers/unleashed-firmware/blob/dev/CHANGELOG.md#recommended-update-option---web-updater +See [this](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/HowToInstall.md) + +## What version I should install? What do letters `e`, `r`, `c`... mean? + +Follow this link for [details](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/CHANGELOG.md#recommended-update-option---web-updater). + +## INSTALLED UNLEASHED AND NOW BACKLIGHT DOESNT WORK? -**INSTALLED UNLEASHED AND NOW BACKLIGHT DOESNT WORK?**
-You’ve installed a version made for custom RGB modded flippers. The version ending in `“r”` is specifically for “RGB” modded flippers.
-Please do not use that version if your flipper isn’t modded! +You’ve installed a version made for custom RGB modded flippers. The version ending in `“r”` is specifically for “RGB” modded flippers.
+ +Please, do not use that version if your flipper isn’t modded! ## What apps (plugins) are included with Unleashed FW? -See default pack and extra pack (for `e` build) list here:
-https://github.com/xMasterX/all-the-plugins/tree/dev + +See default pack and extra pack (for `e` build) list [here](https://github.com/xMasterX/all-the-plugins/tree/dev). + ## Where I can find differences between original (official) firmware and Unleashed firmware? -Right here:
-https://github.com/DarkFlippers/unleashed-firmware#whats-changed + +[Right here](https://github.com/DarkFlippers/unleashed-firmware#whats-changed) ## How to use SubGHz Remote app? + 1. Open app, press Back button, select New map file 2. Configure signal files and their names for every button (also you can add only one signal and make other buttons empty - just don't select any files for them in config) 3. Save new map file 4. Open map file and select your previously created file 5. Use buttons to send subghz signal files that you selected in map config at step 2 - ## How to build (compile) firmware? -Follow this link:
-https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/HowToBuild.md#how-to-build-by-yourself + +Follow this [link](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/HowToBuild.md#how-to-build-by-yourself). ## I installed Unleashed firmware and now my mobile app doesn't connect to flipper ( OR I changed flipper device name and my mobile app now doesn't connect to flipper ) + 1. Click Forget flipper in mobile app 2. Open your phone settings - bluetooth, find flipper - if it present here - open its options and click forget device 3. On flipper itself open Settings -> Bluetooth -> Forget all devices -> and confirm @@ -43,173 +49,185 @@ https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/HowToB 5. Done ## My desktop (pin, favourites, etc..) (or other) settings was reset to default after update, what to do? + Just configure that settings again, all is fine, and make sure you seen changelogs for the releases that came out after your previous version, when settings struct is changed, settings file are reset after update, this happens only when struct changes is required, so don't assume that settings will be reset in every release, this will happen only in specific ones -## Why is flipper not connecting to chrome? -The most common cause of the flipper not connecting to google chrome is having qFlipper open while trying to connect your flipper. Or having second flipper lab page open at same time.
+## Why is flipper not connecting to Chrome? + +The most common cause of the flipper not connecting to google chrome is having qFlipper open while trying to connect your flipper.
+ +Or having second flipper lab page open at same time.
You must close qFlipper (or other flipper lab web pages) before attempting to connect your flipper to chrome. ## Flipper doesn't work! How to restore firmware??? -Follow this guide:
-https://docs.flipper.net/basics/firmware-update/firmware-recovery +Follow this [guide](https://docs.flipper.net/basics/firmware-update/firmware-recovery) ## Useful links and files -Flipper Awesome - place where you can find almost all links that you might need:
-https://github.com/djsime1/awesome-flipperzero - -Dict files for iButton Fuzzer and RFID Fuzzer:
-https://t.me/flipperzero_unofficial_ru/37058
-https://t.me/flipperzero_unofficial_ru/37072 -UL Releases in Telegram:
-https://t.me/unleashed_fw
-UL Dev Builds in Telegram:
-https://t.me/kotnehleb
- -Our Discord:
-https://discord.unleashedflip.com +Flipper Awesome - place where you can find almost all links that you might need:
+* [Awesome-FlipperZero](https://github.com/djsime1/awesome-flipperzero) +* Dict files for iButton Fuzzer and RFID Fuzzer:
+https://t.me/flipperzero_unofficial_ru/37058
+https://t.me/flipperzero_unofficial_ru/37072 +* UL Releases in [Telegram](https://t.me/unleashed_fw) +* UL Dev Builds in [Telegram](https://t.me/kotnehleb) +* Our [Discord](https://discord.unleashedflip.com) ## How to change flipper name? + All is simple: -1. Open Settings -> Desktop -> Change Flipper Name +1. Open `Settings -> Desktop -> Change Flipper Name` 2. Enter new name and click Save 3. Exit from settings - Flipper will automatically reboot 4. Done, you have custom name which will stay until you reset it to default or replace with new one -How to reset name to default: -1. Open Settings -> Desktop -> Change Flipper Name +## How to reset name to default? + +1. Open `Settings -> Desktop -> Change Flipper Name` 2. Do not enter anything, just click Save 3. Exit from settings - Flipper will automatically reboot 4. Done, name is reset to original one. -## How do I copy files from Github to my Flipper Zero? -Follow this detailed guide:
-https://github.com/wrenchathome/flipperfiles/blob/main/_Guides/How2Flipper.pdf +## How do I copy files from GitHub to my Flipper Zero? +Follow this detailed [guide](https://github.com/wrenchathome/flipperfiles/blob/main/_Guides/How2Flipper.pdf). ## Where can I find “This file” or “That file” for my flipper? -These 2 repos will cover most(99.9%) of your needs:
-https://github.com/UberGuidoZ/Flipper/tree/main -
-https://github.com/UberGuidoZ/Flipper-IRDB/tree/main +These 2 repos will cover most (99.9%) of your needs:
+* https://github.com/UberGuidoZ/Flipper/tree/main +* https://github.com/UberGuidoZ/Flipper-IRDB/tree/main ## How can I support Unleashed firmware project? -https://github.com/DarkFlippers/unleashed-firmware#please-support-development-of-the-project + +Please follow this [link](https://github.com/DarkFlippers/unleashed-firmware#please-support-development-of-the-project). ## What are the dev builds? Where I can get latest build for dev branch? -This is an automatic assembly of the latest commits from the repository that have not yet been released, the previous build is deleted when a new one is uploaded and old remains only as file in the telegram channel
-Be aware that this is not release ready builds! They may have bugs and issues, if you are using dev build and found issue, report it! In github issues -
-Dev builds is available in Discord, ⁠in channel - `unleashed-development`
-Builds also can be found here - https://t.me/kotnehleb
-And here - https://dev.unleashedflip.com/
+This is an automatic assembly of the latest commits from the repository that have not yet been released, the previous build is deleted when a new one is uploaded and old remains only as file in the telegram channel

+Be aware that this is not release ready builds! They may have bugs and issues, if you are using dev build and found issue, report it! In GitHub issues +
+ +Dev builds is available in Discord, Win channel - `unleashed-development`
+Builds also can be found [here](https://t.me/kotnehleb).
+And [here](https://dev.unleashedflip.com/)
## What is the update server? -We have our own update server https://up.unleashedflip.com/directory.json
-It is identical to the official one, it is impossible to change it in applications without rebuilding the application, it is hardcoded there
-If you want to use it, you need to patch or build your own build of the application you are interested in
-Also you can use it with uFBT to build apps for UL SDK, uFBT will accept that link as one of args
+We have our own update server https://up.unleashedflip.com/directory.json

+It is identical to the official one, it is impossible to change it in applications without rebuilding the application, it is hardcoded there

+If you want to use it, you need to patch or build your own build of the application you are interested in
+ +Also you can use it with uFBT to build apps for UL SDK, uFBT will accept that link as one of args
The server will remain active and will be automatically updated ## External Radio: How to connect CC1101 module -https://github.com/quen0n/flipperzero-ext-cc1101 + +[Guide](https://github.com/quen0n/flipperzero-ext-cc1101) ## How to add extra Sub-GHz frequencies -https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzSettings.md + +[Guide](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzSettings.md) ## How to use Flipper as new remote (Nice FlorS, BFT Mitto, Somfy Telis, Aprimatic, AN-Motors, etc..) -https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md + +[Guide](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md) ## How Can I Unlock/Remove SubGHz restriction? + If you are using Unleashed firmware - **all region locks are removed by default**! -Also there is a way to go outside of frequencies stated in CC1101 datasheet, but transmission on those frequencies may cause chip damage, make sure you know what you are doing! Do not edit this settings to bypass region lock since there is no region locks in unleashed, all chip supported frequencies will work without any extra steps.
-But, if you know that you need to bypass subghz chip safety restriction you can unlock the safety restriction which will allow you to go outside the chips supported frequency.
-This covers how to do it and information regarding the risks of damage to the flipper by doing so
-https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/DangerousSettings.md +Also, there is a way to go outside of frequencies stated in CC1101 datasheet, but transmission on those frequencies may cause chip damage, make sure you know what you are doing! Do not edit this settings to bypass region lock since there is no region locks in unleashed, all chip supported frequencies will work without any extra steps.

+But, if you know that you need to bypass subghz chip safety restriction you can unlock the safety restriction which will allow you to go outside the chips supported frequency.

+This covers how to do it and information regarding the risks of damage to the flipper by doing so. Please read [this](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/DangerousSettings.md) before. ## Can I clone a car key fob for my own car to use flipper as a key? + No, and trying to do so with Read RAW will lead to key desync or unpair with blacklist which means re-pair is very hard and requires service tools ## Will Unleashed FW support car keyfobs decoding, cloning, emulating? + No, never ## Where can I find jamming files? + Nowhere, this is illegal in almost every country in the world -## I saw something on tiktok and want to ask how to do it, I just wanna be like real hacker -And you might be banned for that in our communities, since 99% of that content is fake, or showing illegal actions, and we don't like tiktok related questions +## I saw something on TikTok and want to ask how to do it, I just wanna be like real hacker + +And you might be banned for that in our communities, since 99% of that content is fake, or showing illegal actions, and we don't like TikTok related questions. + +## I was banned in Unleashed Discord/Telegram/etc.. How to remove ban? I created GitHub issue and it was removed too! -## I was banned in Unleashed Discord/Telegram/etc.. How to remove ban? I created github issue and it was removed too! Not possible, rules is rules, read them before sending messages in our communities ## How to clean .DS_Store and other dot files left from macOS + `sudo dot_clean -mn /Volumes/Flipper\ SD` -> `Flipper\ SD` may be named differently for you, replace with your microSD card name -## How to sort files on flipper microSD on macOS/Linux -`will make sorting faster, and will work for OFW` -1. `brew install fatsort` -> Install fatsort using brew.sh (only on macOS) +## How to sort files on flipper microSD on macOS/Linux? + +Will make sorting faster, and will work for OFW +1. `brew install fatsort` -> Install fatsort using `brew.sh` (only on macOS) 2. `diskutil list` -> Find your disk name for flipper microSD 3. `diskutil unmount /Volumes/Flipper\ SD` 4. `sudo fatsort -n /dev/disk4s1` -> Replace `disk4s1` with your microSD id found on step 2 - ## Your Flipper feels slow and unresponsive? -1. Make sure you using good microSD card from known brand, flipper works with microSD via SPI that means not any microSD will work good even if it works ok with other devices + +1. Make sure you using good microSD card from known brand, flipper works with microSD via SPI that means not any microSD will work good even if it works ok with other devices. 2. Go into **Settings -> System** and make sure that you have -`Log Level = None` -`Debug = OFF` -`Heap Trace = None` -If some of that settings is set to something different - change it to `None` / `OFF` -3. Make sure your battery is charged, that can affect performance too + ```text + Log Level = None + Debug = OFF + Heap Trace = None + ``` +3. If some of that settings is set to something different - change it to `None` / `OFF` +4. Make sure your battery is charged, that can affect performance too + +## Flipper crashed, stuck, frozen? -## Flipper crashed, stuck, frozen ? Reboot it by holding Left + Back buttons ![how to reboot flipper gif, shows how to hold left and back button](https://media.tenor.com/eUbBDDEzmwMAAAAC/flipper-zero-flipper-zero-reboot.gif) - ## How to reset forgotten Flipper pin code? **Disconnect USB Cable if it was connected** 1. Turn off the device - hold back button -> Turn Off **If you can't turn it off, try next step but hold buttons for 30-40 seconds)** -2. Hold Up + Back for ~5 sec -> You will see reset screen -> Hold Right to reset (and down arrow to exit if you don't want to reset pin code) +2. Hold `Up` + `Back` for `~5 sec` -> You will see reset screen -> Hold `Right` to reset (and `Down` arrow to exit if you don't want to reset pin code) 3. Done, internal memory (dolphin level, settings, pin code, is erased to default settings) ## What are the differences between x, y and z firmware? -If you just got your flipper and not sure what will work better for you, start with original official firmware, if you think you need more features or want to remove subghz region locks then
-Try installing Unleashed firmware, which is fork of official firmware with many new features and preinstalled plugins (check out `e` build)
-In other case If you want to experiment more with UI and other things look for existing forks of Unleashed firmware
-Or create your own fork with your own customisations
-Also before reporting any found issue make sure you are in correct repo, if you are using not Unleashed but different fork or original firmware, do not report issue in Unleashed firmware repo or UL communities (telegram, discord, etc..) +If you just got your flipper and not sure what will work better for you, start with original official firmware, if you think you need more features or want to remove subghz region locks then:
+* Try installing **Unleashed firmware**, which is fork of official firmware with many new features and preinstalled plugins (check out `e` build).
+* In other case, If you want to experiment more with UI and other things look for existing forks of Unleashed firmware.
+* Or, create your own fork with your own customisations
+* Also, before reporting any found issue make sure you are in correct repo, if you are using not **Unleashed**, but different fork or original firmware, do not report issue in **Unleashed firmware** repo or UL communities (Telegram, Discord, etc..) ## Is there a correct way to capturing Infrared signals? There is indeed especially with AC units, a new documentation has been released with some notes and steps on capturing infrared signals correctly along with some example data so you are able to understand the difference visually between the two. -https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/InfraredCaptures.md +[More info](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/InfraredCaptures.md) +## NFC / RFID FAQ -# NFC/RFID FAQ -From our good friend `@Equip` and `@np0`
-**------------------------------------------------------** +From our good friend `@Equip` and `@np0`
### MIFARE Ultralight -- Scan the card, hold the Flipper Zero up to the reader to get the password to unlock the rest of the sectors, then scan the card again. +Scan the card, hold the Flipper Zero up to the reader to get the password to unlock the rest of the sectors, then scan the card again. -### MIFARE DESFire/MIFARE Ultralight C +### MIFARE DESFire / MIFARE Ultralight C -- The Flipper Zero has no available attacks for this card currently. +The Flipper Zero has no available attacks for this card currently. ### Bank cards @@ -224,17 +242,17 @@ From our good friend `@Equip` and `@np0`
### HID/iClass -- Picopass iClass can be read using the Picopass reader plugin +- `Picopass` iClass can be read using the `Picopass` reader plugin - 26bit Picopass can be downgraded to H10301 RFID credentials (note, it is not guaranteed to work if the reader is not configured to read low frequency) - Readers will need to be configured and have an LF RFID antenna in order to be read. Certain iClass readers are HF only, and do not have the ability to have LF configured -- **Emulation for Picopass** was added on July 26th, and the updated version can be found in latest releases of Unleashed firmware with apps preinstalled, or in official Apps Hub via Flipper Mobile app +- **Emulation for Picopass** was added on July 26th, and the updated version can be found in latest releases of **Unleashed** firmware with apps preinstalled, or in official Apps Hub via Flipper Mobile app - Write support for personalization mode cards is doable with app -- The Seader app and a SAM expansion board < https://www.redteamtools.com/nard-sam-expansion-board-for-flipper-zero-with-hid-seos-iclass-sam/ > will allow reading more secure HID cards, which may be helpful in downgrade attacks +- The Seader app and a [SAM expansion board](https://www.redteamtools.com/nard-sam-expansion-board-for-flipper-zero-with-hid-seos-iclass-sam/) will allow reading more secure HID cards, which may be helpful in downgrade attacks ### LF-RFID -If you're wanting to make clones of low frequency RFID chips you need to write to T5577's. "Blanks" do not exist. All of the chips the Flipper Zero can interact with are read-only and cannot be overwritten or purchased blank. -T5577s are multiemulator chips that the Flipper Zero can program to be other tags +If you're wanting to make clones of low frequency RFID chips you need to write to T5577's. `Blanks` do not exist. All of the chips the Flipper Zero can interact with are read-only and cannot be overwritten or purchased blank. +T5577s are multi-emulator chips that the Flipper Zero can program to be other tags ### Unknown Card/Fob @@ -244,11 +262,11 @@ If you have exhausted all options of scanning via NFC/RFID/PICOPASS then take a - The reader you use with the credential - If your credential is a card, hold it up to a very bright light source e.g. a lightbulb and take a photo of the exposed antenna. This is useful for identification, post it for us to identify! -**------------------------------------------------------** - ## How do I access the CLI/Logs? + +To access the Serial CLI, click one of the following based on your platform. +
- To access the Serial CLI, click one of the following based on your platform.
Desktop web browser* *Chromium browsers only, such as: Google Chrome, Microsoft Edge, Opera/Opera GX, Brave, and Vivaldi. @@ -262,6 +280,8 @@ If you have exhausted all options of scanning via NFC/RFID/PICOPASS then take a
  • Done!
  • +
    +
    Windows
      @@ -280,6 +300,8 @@ If you have exhausted all options of scanning via NFC/RFID/PICOPASS then take a
    • If you get an "Access Denied" error, make sure qFlipper isn't running!
    +
    +
    MacOS/Linux Note: I'm a filthy Windows user without any way to verify this procedure. Let me know if it's wrong! @@ -295,6 +317,8 @@ If you have exhausted all options of scanning via NFC/RFID/PICOPASS then take a
  • Done!
  • +
    +
    Android
      @@ -308,16 +332,20 @@ If you have exhausted all options of scanning via NFC/RFID/PICOPASS then take a
    • Note: To exit log mode, you'll have to disconnect and reconnect using the icon.
    +
    +
    iPhone - Unfortunately, iOS is incapable of accessing a serial terminal over USB; try one of the other methods. -
    - On the Flipper, open the settings, go to System, and set Log Level to Debug. (You can keep Debug set to off unless someone asks you to turn it on) - Once you have the CLI open, type log and press enter to start watching logs. Press Ctrl-C or Cmd-C to exit log mode. + Unfortunately, iOS is incapable of accessing a serial terminal over USB; try one of the other methods
    +
      +
    • On the Flipper, open the settings, go to System, and set Log Level to Debug. (You can keep Debug set to off unless someone asks you to turn it on)
    • +
    • Once you have the CLI open, type log and press enter to start watching logs. Press Ctrl-C or Cmd-C to exit log mode.
    • +
    +
    -
    -
    +
    +
    -**CLI FAQ Source + Check out this FAQ for more info:** +**CLI FAQ Source + Check out this FAQ for more info:**

    https://github.com/djsime1/awesome-flipperzero/blob/main/FAQ.md diff --git a/documentation/FuriHalBus.md b/documentation/FuriHalBus.md index 12c5a70ece..248699d778 100644 --- a/documentation/FuriHalBus.md +++ b/documentation/FuriHalBus.md @@ -3,15 +3,19 @@ ## Basic info On system startup, most of the peripheral devices are under reset and not clocked by default. This is done to reduce power consumption and to guarantee that the device will always be in the same state before use. + Some crucial peripherals are enabled right away by the system, others must be explicitly enabled by the user code. -**NOTE:** Here and afterwards the word *"system"* refers to any code belonging to the operating system, hardware drivers or built-in applications. +> [!NOTE] Here and afterwards the word `system` refers to any code belonging to the operating system, +> hardware drivers or built-in applications. -To **ENABLE** a peripheral, call `furi_hal_bus_enable()`. At the time of the call, the peripheral in question MUST be disabled, otherwise a crash will occur to indicate improper use. This means that any given peripheral cannot be enabled twice or more without disabling it first. +To **ENABLE** a peripheral, call `furi_hal_bus_enable()`. At the time of the call, the peripheral in question **MUST** be disabled; +otherwise a crash will occur to indicate improper use. This means that any given peripheral cannot be enabled twice or more without disabling it first. -To **DISABLE** a peripheral, call `furi_hal_bus_disable()`. Likewise, the peripheral in question MUST be enabled, otherwise a crash will occur. +To **DISABLE** a peripheral, call `furi_hal_bus_disable()`. Likewise, the peripheral in question **MUST** be enabled, otherwise a crash will occur. -To **RESET** a peripheral, call `furi_hal_bus_reset()`. The peripheral in question MUST be enabled, otherwise a crash will occur. This method is used whenever it is necessary to reset all the peripheral's registers to their initial states without disabling it. +To **RESET** a peripheral, call `furi_hal_bus_reset()`. The peripheral in question MUST be enabled, otherwise a crash will occur. +This method is used whenever it is necessary to reset all the peripheral's registers to their initial states without disabling it. ## Peripherals @@ -22,26 +26,28 @@ Built-in peripherals are divided into three categories: ### Always-on peripherals -Below is the list of peripherals that are enabled by the system. The user code must NEVER attempt to disable them. If a corresponding API is provided, the user code must employ it in order to access the peripheral. +Below is the list of peripherals that are enabled by the system. The user code must **NEVER** attempt to disable them. + +If a corresponding API is provided, the user code must employ it in order to access the peripheral. *Table 1* - Peripherals enabled by the system -| Peripheral | Enabled at | -| :-----------: | :-----------------------: | -| DMA1 | `furi_hal_dma.c` | -| DMA2 | -- | -| DMAMUX | -- | -| GPIOA | `furi_hal_resources.c` | -| GPIOB | -- | -| GPIOC | -- | -| GPIOD | -- | -| GPIOE | -- | -| GPIOH | -- | -| PKA | `furi_hal_bt.c` | -| AES2 | -- | -| HSEM | -- | -| IPCC | -- | -| FLASH | enabled by hardware | +| Peripheral | Enabled at | +|:-------------:|:---------------------------:| +| DMA1 | `furi_hal_dma.c` | +| DMA2 | -- | +| DMAMUX | -- | +| GPIOA | `furi_hal_resources.c` | +| GPIOB | -- | +| GPIOC | -- | +| GPIOD | -- | +| GPIOE | -- | +| GPIOH | -- | +| PKA | `furi_hal_bt.c` | +| AES2 | -- | +| HSEM | -- | +| IPCC | -- | +| FLASH | enabled by hardware | ### On-demand system peripherals @@ -51,63 +57,64 @@ When not using the API, these peripherals MUST be enabled by the user code and t *Table 2* - Peripherals enabled and disabled by the system -| Peripheral | API header file | -| :-----------: | :-------------------: | -| RNG | `furi_hal_random.h` | -| SPI1 | `furi_hal_spi.h` | -| SPI2 | -- | -| I2C1 | `furi_hal_i2c.h` | -| I2C3 | -- | -| USART1 | `furi_hal_serial.h` | -| LPUART1 | -- | -| USB | `furi_hal_usb.h` | +| Peripheral | API header file | +|:--------------:|:------------------------:| +| RNG | `furi_hal_random.h` | +| SPI1 | `furi_hal_spi.h` | +| SPI2 | -- | +| I2C1 | `furi_hal_i2c.h` | +| I2C3 | -- | +| USART1 | `furi_hal_serial.h` | +| LPUART1 | -- | +| USB | `furi_hal_usb.h` | ### On-demand shared peripherals -Below is the list of peripherals that are not enabled by default and MUST be enabled by the user code each time it accesses them. +Below is the list of peripherals that are not enabled by default and **MUST** be enabled by the user code each time it accesses them. Note that some of these peripherals may also be used by the system to implement its certain features. + The system will take over any given peripheral only when the respective feature is in use. *Table 3* - Peripherals enabled and disabled by user -| Peripheral | System | Purpose | -| :-----------: | :-------: | ------------------------------------- | -| CRC | | | -| TSC | | | -| ADC | | | -| QUADSPI | | | -| TIM1 | yes | subghz, lfrfid, nfc, infrared, etc... | -| TIM2 | yes | subghz, infrared, etc... | -| TIM16 | yes | speaker | -| TIM17 | yes | cc1101_ext | -| LPTIM1 | yes | tickless idle timer | -| LPTIM2 | yes | pwm | -| SAI1 | | | -| LCD | | | - +| Peripheral | System | Purpose | +|:----------:|:------:|:----------------------------------------| +| CRC | | | +| TSC | | | +| ADC | | | +| QUADSPI | | | +| TIM1 | yes | subghz, lfrfid, nfc, infrared, etc... | +| TIM2 | yes | subghz, infrared, etc... | +| TIM16 | yes | speaker | +| TIM17 | yes | cc1101_ext | +| LPTIM1 | yes | tickless idle timer | +| LPTIM2 | yes | pwm | +| SAI1 | | | +| LCD | | | ## DMA -The DMA1,2 peripherals are a special case in that they have multiple independent channels. Some of the channels may be in use by the system. +The `DMA1`, `DMA2` peripherals are a special case in that they have multiple independent channels. +Some channels may be in use by the system. Below is the list of DMA channels and their usage by the system. *Table 4* - DMA channels -| DMA | Channel | System | Purpose | -| :---: | :-------: | :-------: | ------------------------- | -| DMA1 | 1 | yes | digital signal | -| -- | 2 | yes | -- | -| -- | 3 | | | -| -- | 4 | yes | pulse reader | -| -- | 5 | | | -| -- | 6 | yes | USART_Rx | -| -- | 7 | yes | LPUART_Rx | -| DMA2 | 1 | yes | infrared, lfrfid, subghz, | -| -- | 2 | yes | -- | -| -- | 3 | yes | cc1101_ext | -| -- | 4 | yes | cc1101_ext | -| -- | 5 | yes | cc1101_ext | -| -- | 6 | yes | SPI | -| -- | 7 | yes | SPI | +| DMA | Channel | System | Purpose | +|:------:|:-------:|:------:|:-----------------------------| +| DMA1 | 1 | yes | digital signal | +| -- | 2 | yes | -- | +| -- | 3 | | | +| -- | 4 | yes | pulse reader | +| -- | 5 | | | +| -- | 6 | yes | USART_Rx | +| -- | 7 | yes | LPUART_Rx | +| DMA2 | 1 | yes | infrared, lfrfid, subghz, | +| -- | 2 | yes | -- | +| -- | 3 | yes | cc1101_ext | +| -- | 4 | yes | cc1101_ext | +| -- | 5 | yes | cc1101_ext | +| -- | 6 | yes | SPI | +| -- | 7 | yes | SPI | diff --git a/documentation/HowToBuild.md b/documentation/HowToBuild.md index ddf759f1b8..eec2e632a9 100644 --- a/documentation/HowToBuild.md +++ b/documentation/HowToBuild.md @@ -1,4 +1,3 @@ - # How to Build by yourself: ## Install required software @@ -15,9 +14,10 @@ You should clone with ```shell $ git clone --recursive https://github.com/DarkFlippers/unleashed-firmware.git ``` + ## VSCode integration -`fbt` includes basic development environment configuration for VS Code. Run `./fbt vscode_dist` to deploy it. That will copy the initial environment configuration to the `.vscode` folder. After that, you can use that configuration by starting VS Code and choosing the firmware root folder in the "File > Open Folder" menu. +`fbt` includes basic development environment configuration for VSCode. Run `./fbt vscode_dist` to deploy it. That will copy the initial environment configuration to the `.vscode` folder. After that, you can use that configuration by starting VSCode and choosing the firmware root folder in the `File > Open Folder` menu. # Build on Linux/macOS @@ -31,7 +31,6 @@ Check out `documentation/fbt.md` for details on building and flashing firmware. ### Compile everything for development - ```sh ./fbt updater_package ``` @@ -44,8 +43,7 @@ Check out `documentation/fbt.md` for details on building and flashing firmware. Check `dist/` for build outputs. -Use **`flipper-z-{target}-update-{suffix}.tgz`** to flash your device. - +Use `flipper-z-{target}-update-{suffix}.tgz` to flash your device. # Build on Windows @@ -53,23 +51,20 @@ Check out `documentation/fbt.md` for details on building and flashing firmware. ### Compile everything for development - -```sh +```powershell ./fbt.cmd updater_package ``` ### Compile everything for release + get updater package to update from microSD card -```sh +```powershell ./fbt.cmd COMPACT=1 DEBUG=0 updater_package ``` -**You may need to change** `/` **to** `\` **in front of fbt command (Only for Windows)!** +**You may need to change `/` to `\` in front of fbt command (Only for Windows)!** Check `dist/` for build outputs. -Use **`flipper-z-{target}-update-{suffix}.tgz`** to flash your device. - - +Use `flipper-z-{target}-update-{suffix}.tgz` to flash your device. If compilation fails, make sure all submodules are all initialized. Either clone with `--recursive` or use `git submodule update --init --recursive`. diff --git a/documentation/devboard/Firmware update on Developer Board.md b/documentation/devboard/Firmware update on Developer Board.md index f6a81d97b6..1cd205023d 100644 --- a/documentation/devboard/Firmware update on Developer Board.md +++ b/documentation/devboard/Firmware update on Developer Board.md @@ -1,10 +1,13 @@ # Firmware update on Developer Board {#dev_board_fw_update} -It's important to regularly update your Developer Board to ensure that you have access to the latest features and bug fixes. This tutorial will guide you through the necessary steps to update the firmware of your Developer Board. +> [!IMPORTANT] +> +> It's important to regularly update your Developer Board to ensure that you have access to the latest features and bug fixes. +> This tutorial will guide you through the necessary steps to update the firmware of your Developer Board. -This tutorial assumes that you're familiar with the basics of the command line. If you’re not, please refer to the [Windows](https://www.digitalcitizen.life/command-prompt-how-use-basic-commands/) or [MacOS/Linux](https://ubuntu.com/tutorials/command-line-for-beginners#1-overview) command line tutorials. +This tutorial assumes that you're familiar with the basics of the command line. -*** +If you’re not, please refer to the [Windows](https://www.digitalcitizen.life/command-prompt-how-use-basic-commands/) or [MacOS / Linux](https://ubuntu.com/tutorials/command-line-for-beginners#1-overview) command line tutorials. ## Installing the micro Flipper Build Tool @@ -14,20 +17,18 @@ Install uFBT on your computer by running the following command in the Terminal: **For Linux & macOS:** -```text +```bash python3 -m pip install --upgrade ufbt ``` **For Windows:** -```text -py -m pip install --upgrade ufbt +```powershell +python -m pip install --upgrade ufbt ``` If you want to learn more about uFBT, visit [the project's page](https://pypi.org/project/ufbt/). -*** - ## Connecting the Developer Board to your computer 1. List all of the serial devices on your computer. @@ -38,49 +39,38 @@ If you want to learn more about uFBT, visit [the project's page](https://pypi.or **macOS** - On macOS, you can run the following command in the Terminal: - - ```text + On macOS, you can run the following command in the Terminal: + ```bash ls /dev/cu.* ``` **Linux** - On Linux, you can run the following command in the Terminal: - + On Linux, you can run the following command in the Terminal: ```text ls /dev/tty* ``` - View the devices in the list. - 2. Connect the Developer Board to your computer using a USB-C cable. ![The Developer Board in Wired mode](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/Aq7gfMI-m_5H6sGGjwb4I_monosnap-miro-2023-07-19-19-47-39.jpg) - 3. Switch your Developer Board to Bootloader mode: - 3.1. Press and hold the **BOOT** button. - 3.2. Press the **RESET** button while holding the **BOOT** button. - - 3.3. Release the **BOOT** button.\ + 3.3. Release the **BOOT** button. ![You can easily switch the Dev Board to Bootloader mode](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/KynP9iT6sJ3mXLaLyI82__image.png) - 4. Repeat Step 1 and view the name of your Developer Board that appeared in the list. For example, on macOS: - ```text + ```shell /dev/cu.usbmodem01 ``` -*** - ## Flashing the firmware To flash the firmware onto your Developer Board, run the following command in the terminal: -```text +```shell python3 -m ufbt devboard_flash ``` @@ -90,33 +80,26 @@ You should see the following message: `WiFi board flashed successfully`. If you get an error message during the flashing process, such as this: -```text +```shell A fatal error occurred: Serial data stream stopped: Possible serial noise or corruption. ``` Or this: -```text +```shell FileNotFoundError: [Errno 2] No such file or directory: '/dev/cu.usbmodem01' ``` Try doing the following: - * Disconnect the Developer Board from your computer, then reconnect it. - * Use a different USB port on your computer. - * Use a different USB-C cable. -*** - ## Finishing the installation After flashing the firmware: - 1. Reboot the Developer Board by pressing the **RESET** button. ![Reset the Developer Board](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/rcQeKARgrVwa51tLoo-qY_monosnap-miro-2023-07-20-18-29-33.jpg) - 2. Disconnect and reconnect the USB-C cable. The Developer Board should appear as a serial device on your computer. Now, you can use it with the Black Magic Debug client of your choice. diff --git a/documentation/devboard/Get started with the Dev Board.md b/documentation/devboard/Get started with the Dev Board.md index 04fa9d3589..8747d126ee 100644 --- a/documentation/devboard/Get started with the Dev Board.md +++ b/documentation/devboard/Get started with the Dev Board.md @@ -2,35 +2,33 @@ The Wi-Fi Developer Board serves as a tool to debug the Flipper Zero firmware. To debug the firmware, the initial step involves compiling the firmware from its source code. This process enables the debugging functionality within the firmware and generates all the necessary files required for debugging purposes. -> **NOTE:** Building and debugging the Flipper Zero firmware is fully supported on MacOS and Linux. Support for Windows is in beta test. - -*** +> [!IMPORTANT] +> Building and debugging the Flipper Zero firmware is fully supported on MacOS and Linux. +> Support for Windows is in beta test. ## Updating the firmware of your Developer Board Update the firmware of your Developer Board before using it. For more information, visit [Firmware update on Developer Board](https://docs.flipperzero.one/development/hardware/wifi-debugger-module/update). -*** - ## Installing Git You'll need Git installed on your computer to clone the firmware repository. If you don't have Git, install it by doing the following: -* **MacOS** +### MacOS - On MacOS, install the **Xcode Command Line Tools** package, which includes Git as one of the pre-installed command-line utilities, by running in the Terminal the following command: +On MacOS, install the **Xcode Command Line Tools** package, which includes Git as one of the pre-installed command-line utilities, by running in the Terminal the following command: - ```text - xcode-select --install - ``` +```bash +xcode-select --install +``` -* **Linux** +### Linux - On Linux, you can install Git using your package manager. For example, on Ubuntu, run in the Terminal the following command: +On Linux, you can install Git using your package manager. For example, on Ubuntu, run in the Terminal the following command: - ```text - sudo apt install git - ``` +```bash +sudo apt install git +``` For other distributions, refer to your package manager documentation. @@ -40,14 +38,14 @@ For other distributions, refer to your package manager documentation. First, clone the firmware repository: -```text +```bash git clone --recursive https://github.com/flipperdevices/flipperzero-firmware.git cd flipperzero-firmware ``` Then, run the **Flipper Build Tool** (FBT) to build the firmware: -```text +```bash ./fbt ``` @@ -57,9 +55,10 @@ Then, run the **Flipper Build Tool** (FBT) to build the firmware: The Developer Board can work in the **Wired** mode and two **Wireless** modes: **Wi-Fi access point (AP)** mode and **Wi-Fi client (STA)** mode. The Wired mode is the simplest to set up, but requires a USB Type-C cable. The Wireless modes are more complex to set up, but they allow you to debug your Flipper Zero wirelessly. - > **NOTE:** Use the following credentials when connecting to the Developer Board in **Wi-Fi access point** mode:\n - Name: **blackmagic**\n - Password: **iamwitcher** +> [!TIP] +> Use the following credentials when connecting to the Developer Board in **Wi-Fi access point** mode: +> Name: **blackmagic** +> Password: **iamwitcher** ## Wired @@ -71,27 +70,32 @@ To connect the Developer Board in **Wired** mode, do the following: 2. On your computer, open the **Terminal** and run the following: - * **MacOS** - - ```text - ls /dev/cu.* - ``` - - * **Linux** - - ```text - ls /dev/tty* - ``` - - Note the list of devices. + ### MacOS + + ```shell + ls /dev/cu.* + ``` + + ### Linux + + ```bash + ls /dev/tty* + ``` + + Note the list of devices. 3. Connect the Developer Board to your computer via a USB-C cable. 4. Rerun the command. Two new devices have to appear: this is the Developer Board. - > **NOTE:** If the Developer Board doesn't appear in the list of devices, try using a different cable, USB port, or computer. - > - > **NOTE:** Flipper Zero logs can only be viewed when the Developer Board is connected via USB. The option to view logs over Wi-Fi will be added in future updates. For more information, visit [Reading logs via the Dev Board](https://docs.flipperzero.one/development/hardware/wifi-debugger-module/reading-logs). +> [!NOTE] +> If the Developer Board doesn't appear in the list of devices, try using a different cable, USB port, or computer. + +
    + +> [!IMPORTANT] Flipper Zero logs can only be viewed when the Developer Board is connected via USB. +> The option to view logs over Wi-Fi will be added in future updates. +> For more information, visit [Reading logs via the Dev Board](https://docs.flipperzero.one/development/hardware/wifi-debugger-module/reading-logs). ## Wireless @@ -111,9 +115,8 @@ To connect the Developer Board in **Wi-Fi access point** mode, do the following: 3. Connect to the network: - * Name: **blackmagic** - - * Password: **iamwitcher** + * Name: `blackmagic` + * Password: `iamwitcher` 4. To configure the Developer Board, open a browser and go to `http://192.168.4.1`. @@ -135,9 +138,9 @@ To connect the Developer Board in **Wi-Fi client** mode, you need to configure i ![In the Wi-Fi tab, you can set the Developer Board mode](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/klbLVj8lz2bEvm7j4wRaj_monosnap-miro-2023-06-23-13-06-32.jpg) -After rebooting, the Developer Board connects to your Wi-Fi network. You can connect to the device using the mDNS name **blackmagic.local** or the IP address it got from your router (you'll have to figure this out yourself, every router is different). +After rebooting, the Developer Board connects to your Wi-Fi network. You can connect to the device using the mDNS name `blackmagic.local` or the IP address it got from your router (you'll have to figure this out yourself, every router is different). -After connecting to your debugger via , you can find its IP address in the **SYS** tab. You can also change the debugger's mode to **AP** or **STA** there. +After connecting to your debugger via [http://blackmagic.local](http://blackmagic.local), you can find its IP address in the **SYS** tab. You can also change the debugger's mode to **AP** or **STA** there. ![In the SYS tab, you can view the IP address of your Developer Board](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/5XbUptlfqzlV0p6hRUqiG_monosnap-miro-2023-06-22-18-11-30.jpg) @@ -145,9 +148,9 @@ After connecting to your debugger via , you can find it ## Debugging the firmware -Open the **Terminal** in the **flipperzero-firmware** directory that you cloned earlier and run the following command: +Open the **Terminal** in the `flipperzero-firmware` directory that you cloned earlier and run the following command: -```text +```bash ./fbt flash ``` @@ -155,11 +158,10 @@ This will upload the firmware you've just built to your Flipper Zero via the Dev To debug in **VSCode**, do the following: -1. In VSCode, open the **flipperzero-firmware** directory. +1. In VSCode, open the `flipperzero-firmware` directory. 2. You should see a notification about recommended extensions. Install them. - - If there were no notifications, open the **Extensions** tab, enter `@recommended` in the search bar, and install the workspace recommendations. + > [!TIP] If there were no notifications, open the `Extensions` tab, enter `@recommended` in the search bar, and install the workspace recommendations. 3. In the **Terminal**, run the `./fbt vscode_dist` command. This will generate the VSCode configuration files needed for debugging. diff --git a/documentation/devboard/Reading logs via the Dev Board.md b/documentation/devboard/Reading logs via the Dev Board.md index e9fc0e2ca8..5cf35d99ee 100644 --- a/documentation/devboard/Reading logs via the Dev Board.md +++ b/documentation/devboard/Reading logs via the Dev Board.md @@ -2,13 +2,15 @@ The Developer Board allows you to read Flipper Zero logs via UART. Unlike reading logs via the command-line interface (CLI), the Developer Board enables you to collect logs from the device directly to a serial console independently from the operating system of Flipper Zero. It allows you to see the device's logs when it's loading, updating, or crashing. It's useful for debugging and troubleshooting during software development. -> **NOTE:** Flipper Zero logs can only be viewed when the developer board is connected via USB. The option to view logs over Wi-Fi will be added in future updates. +> [!NOTE] +> +> Flipper Zero logs can only be viewed when the developer board is connected via USB. The option to view logs over Wi-Fi will be added in future updates. *** ## Setting the log level -Depending on your needs, you can set the log level by going to **Main Menu -> Settings -> Log Level**. To learn more about logging levels, visit [Settings](https://docs.flipperzero.one/basics/settings#d5TAt). +Depending on your needs, you can set the log level by going to `Main Menu -> Settings -> Log Level`. To learn more about logging levels, visit [Settings](https://docs.flipperzero.one/basics/settings#d5TAt). ![You can manually set the preferred log level](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/INzQMw8QUsG9PXi30WFS0_monosnap-miro-2023-07-11-13-29-47.jpg) @@ -20,80 +22,74 @@ Depending on your operating system, you need to install an additional applicatio ### MacOS -On MacOS, you need to install the **minicom** communication program by doing the following: +On MacOS, you need to install the `minicom` communication program by doing the following: 1. [Install Homebrew](https://brew.sh/) by running the following command in the Terminal: - - ```text - /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - ``` - -2. After installation of Homebrew, run the following command to install minicom: - - ```text + ```bash + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + ``` +2. After installation of Homebrew, run the following command to install `minicom`: + ```bash brew install minicom ``` -After installation of minicom on your macOS computer, you can connect to the Developer Board to read Flipper Zero logs by doing the following: +After installation of `minicom` on your macOS computer, you can connect to the Developer Board to read Flipper Zero logs by doing the following: 1. Cold-plug the Developer Board into your Flipper Zero by turning off the Flipper Zero, connecting the developer board, and then turning it back on. - 2. On your computer, open the Terminal and run the following command: - ```text + ```bash ls /dev/cu.* ``` - Note the list of devices. + > [!NOTE] The list of devices. 3. Connect the developer board to your computer using a USB Type-C cable. ![Connect the developer board with a USB-C cable](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/iPpsMt2-is4aIjiVeFu5t_hjxs2i1oovrnps74v5jgsimage.png) 4. Rerun the command. Two new devices have to appear: this is the Developer Board. - ```text + ```bash /dev/cu.usbmodemblackmagic1 ``` - ```text + ```bash /dev/cu.usbmodemblackmagic3 ``` - - Your Developer Board might have different names. + > [!NOTE] Your Developer Board might have different names. 5. Run the following command: - ```text - minicom -D /dev/ -b 230400 - ``` - + ```bash + minicom -D /dev/ -b 230400 + ``` Where `` is the name of your device with a bigger number. Example: - ```text + ```bash minicom -D /dev/cu.usbmodemblackmagic3 -b 230400 ``` 6. View logs of your Flipper Zero in the Terminal. -7. To quit, close the minicom window or quit via the minicom menu. +7. To quit, close the `minicom` window or quit via the `minicom` menu. ### Linux -On Linux, you need to install the **minicom** communication program. For example, on Ubuntu, run in the Terminal the following command: +On Linux, you need to install the `minicom` communication program. For example, on Ubuntu, run in the Terminal the following command: -```text +```bash sudo apt install minicom - ``` +``` -After installation of minicom on your Linux computer, you can connect to the Developer Board to read Flipper Zero logs by doing the following: +After installation of `minicom` on your Linux computer, you can connect to the Developer Board to read Flipper Zero logs by doing the following: 1. Cold-plug the Developer Board into your Flipper Zero by turning off the Flipper Zero, connecting the developer board, and then turning it back on. 2. On your computer, open the Terminal and run the following command: - ```text + ```bash ls /dev/tty* ``` @@ -104,19 +100,19 @@ After installation of minicom on your Linux computer, you can connect to the Dev 4. Rerun the command. Two new devices have to appear: this is the Developer Board. - ```text + ```bash /dev/ttyACM0 ``` - ```text + ```bash /dev/ttyACM1 ``` - Your Developer Board might have different names. + > [!NOTE] Your Developer Board might have different names. 5. Run the following command: - ```text + ```bash minicom -D /dev/ -b 230400 ``` @@ -124,13 +120,13 @@ After installation of minicom on your Linux computer, you can connect to the Dev Example: - ```text + ```bash minicom -D /dev/cu.usbmodemblackmagic3 -b 230400 ``` 6. View logs of your Flipper Zero in the Terminal. - **NOTE:** If no logs are shown in the Terminal, try running the command from Step 5 with another device name. + > [!NOTE] If no logs are shown in the Terminal, try running the command from Step 5 with another device name. 7. To quit, close the minicom window or quit via the minicom menu. @@ -145,14 +141,14 @@ On Windows, do the following: 3. Connect the developer board to your computer using a USB Type-C cable. ![Connect the developer board with a USB-C cable](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/iPpsMt2-is4aIjiVeFu5t_hjxs2i1oovrnps74v5jgsimage.png) -4. Find the serial port that the developer board is connected to by going to **Device Manager -> Ports (COM & LPT)** and looking for a new port that appears when you connect the Wi-Fi developer board. +4. Find the serial port that the developer board is connected to by going to `Device Manager -> Ports (COM & LPT)` and looking for a new port that appears when you connect the Wi-Fi developer board. ![Find the serial port in your Device Manager](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/KKLQJK1lvqmI5iab3d__C_image.png) -5. Run the PuTTY application and select **Serial** as the connection type. +5. Run the `PuTTY` application and select `Serial` as the connection type. -6. Enter the port number you found in the previous step into the **Serial line** field. +6. Enter the port number you found in the previous step into the `Serial line` field. -7. Set the **Speed** parameter to **230400** and click **Open**. +7. Set the `Speed` parameter to `230400` and click `Open`. ![Set speed to 230400](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/ROBSJyfQ_CXiy4GUZcPbs_monosnap-miro-2023-07-12-13-56-47.jpg) 8. View logs of your Flipper Zero in the PuTTY terminal window. diff --git a/documentation/fbt.md b/documentation/fbt.md index 8e083349f7..2538f23dc8 100644 --- a/documentation/fbt.md +++ b/documentation/fbt.md @@ -44,7 +44,7 @@ To run cleanup (think of `make clean`) for specified targets, add the `-c` optio ## VSCode integration -`fbt` includes basic development environment configuration for VS Code. Run `./fbt vscode_dist` to deploy it. That will copy the initial environment configuration to the `.vscode` folder. After that, you can use that configuration by starting VS Code and choosing the firmware root folder in the "File > Open Folder" menu. +`fbt` includes basic development environment configuration for VSCode. Run `./fbt vscode_dist` to deploy it. That will copy the initial environment configuration to the `.vscode` folder. After that, you can use that configuration by starting VSCode and choosing the firmware root folder in the "File > Open Folder" menu. To use language servers other than the default VS Code C/C++ language server, use `./fbt vscode_dist LANG_SERVER=` instead. Currently `fbt` supports the default language server (`cpptools`) and `clangd`. diff --git a/documentation/file_formats/BadUsbScriptFormat.md b/documentation/file_formats/BadUsbScriptFormat.md index 1bac3c4aa4..8b0a449020 100644 --- a/documentation/file_formats/BadUsbScriptFormat.md +++ b/documentation/file_formats/BadUsbScriptFormat.md @@ -2,7 +2,10 @@ ## Command syntax -BadUsb app uses extended Duckyscript syntax. It is compatible with classic USB Rubber Ducky 1.0 scripts but provides some additional commands and features, such as custom USB ID, ALT+Numpad input method, SYSRQ command, and more functional keys. +BadUsb app uses extended DuckyScript syntax. + +It is compatible with classic USB Rubber Ducky 1.0 scripts but provides some additional commands and features, +such as custom USB ID, `ALT` + `Numpad` input method, `SYSRQ` command, and more functional keys. ## Script file format @@ -12,168 +15,180 @@ BadUsb app can execute only text scripts from `.txt` files, no compilation is re ### Comment line -Just a single comment line. The interpreter will ignore all text after the REM command. -| Command | Parameters | Notes | -| ------- | ------------ | ----- | -| REM | Comment text | | +Just a single comment line. The interpreter will ignore all text after the `REM` command. + +| Command | Parameters | Notes | +|:---------|:--------------|:--------| +| REM | Comment text | | ### Delay Pause script execution by a defined time. -| Command | Parameters | Notes | -| ------------- | ----------------- | ----------------------------------- | -| DELAY | Delay value in ms | Single delay | -| DEFAULT_DELAY | Delay value in ms | Add delay before every next command | -| DEFAULTDELAY | Delay value in ms | Same as DEFAULT_DELAY | + +| Command | Parameters | Notes | +|:--------------|:--------------------------|:--------------------------------------| +| DELAY | Delay value in ms | Single delay | +| DEFAULT_DELAY | Delay value in ms | Add delay before every next command | +| DEFAULTDELAY | Delay value in ms | Same as DEFAULT_DELAY | ### Special keys -| Command | Notes | -| ------------------ | ---------------- | -| DOWNARROW / DOWN | | -| LEFTARROW / LEFT | | -| RIGHTARROW / RIGHT | | -| UPARROW / UP | | -| ENTER | | -| DELETE | | -| BACKSPACE | | -| END | | -| HOME | | -| ESCAPE / ESC | | -| INSERT | | -| PAGEUP | | -| PAGEDOWN | | -| CAPSLOCK | | -| NUMLOCK | | -| SCROLLLOCK | | -| PRINTSCREEN | | -| BREAK | Pause/Break key | -| PAUSE | Pause/Break key | -| SPACE | | -| TAB | | -| MENU | Context menu key | -| APP | Same as MENU | -| Fx | F1-F12 keys | +| Command | Notes | +|:--------------------|:------------------| +| DOWNARROW / DOWN | | +| LEFTARROW / LEFT | | +| RIGHTARROW / RIGHT | | +| UPARROW / UP | | +| ENTER | | +| DELETE | | +| BACKSPACE | | +| END | | +| HOME | | +| ESCAPE / ESC | | +| INSERT | | +| PAGEUP | | +| PAGEDOWN | | +| CAPSLOCK | | +| NUMLOCK | | +| SCROLLLOCK | | +| PRINTSCREEN | | +| BREAK | Pause/Break key | +| PAUSE | Pause/Break key | +| SPACE | | +| TAB | | +| MENU | Context menu key | +| APP | Same as MENU | +| Fx | F1-F12 keys | ### Modifier keys Can be combined with a special key command or a single character. -| Command | Notes | -| -------------- | ---------- | -| CONTROL / CTRL | | -| SHIFT | | -| ALT | | -| WINDOWS / GUI | | -| CTRL-ALT | CTRL+ALT | -| CTRL-SHIFT | CTRL+SHIFT | -| ALT-SHIFT | ALT+SHIFT | -| ALT-GUI | ALT+WIN | -| GUI-SHIFT | WIN+SHIFT | -| GUI-CTRL | WIN+CTRL | + +| Command | Notes | +|:----------------|:-------------| +| CONTROL / CTRL | | +| SHIFT | | +| ALT | | +| WINDOWS / GUI | | +| CTRL-ALT | CTRL+ALT | +| CTRL-SHIFT | CTRL+SHIFT | +| ALT-SHIFT | ALT+SHIFT | +| ALT-GUI | ALT+WIN | +| GUI-SHIFT | WIN+SHIFT | +| GUI-CTRL | WIN+CTRL | ## Key hold and release Up to 5 keys can be hold simultaneously. -| Command | Parameters | Notes | -| ------- | ------------------------------- | ---------------------------------------- | -| HOLD | Special key or single character | Press and hold key until RELEASE command | -| RELEASE | Special key or single character | Release key | + +| Command | Parameters | Notes | +|:---------|:---------------------------------|:------------------------------------------| +| HOLD | Special key or single character | Press and hold key until RELEASE command | +| RELEASE | Special key or single character | Release key | ## String -| Command | Parameters | Notes | -| ------- | ----------- | ----------------- | -| STRING | Text string | Print text string | -| STRINGLN | Text string | Print text string and press enter after it | +| Command | Parameters | Notes | +|:----------|:-------------|:--------------------------------------------| +| STRING | Text string | Print text string | +| STRINGLN | Text string | Print text string and press enter after it | ## String delay -Delay between keypresses. -| Command | Parameters | Notes | -| -------------------- | ----------------- | --------------------------------------------- | -| STRING_DELAY | Delay value in ms | Applied once to next appearing STRING command | -| STRINGDELAY | Delay value in ms | Same as STRING_DELAY | -| DEFAULT_STRING_DELAY | Delay value in ms | Apply to every appearing STRING command | -| DEFAULTSTRINGDELAY | Delay value in ms | Same as DEFAULT_STRING_DELAY | +Delay between key presses. + +| Command | Parameters | Notes | +|:----------------------|:-------------------|:-----------------------------------------------| +| STRING_DELAY | Delay value in ms | Applied once to next appearing STRING command | +| STRINGDELAY | Delay value in ms | Same as STRING_DELAY | +| DEFAULT_STRING_DELAY | Delay value in ms | Apply to every appearing STRING command | +| DEFAULTSTRINGDELAY | Delay value in ms | Same as DEFAULT_STRING_DELAY | ### Repeat -| Command | Parameters | Notes | -| ------- | ---------------------------- | ----------------------- | -| REPEAT | Number of additional repeats | Repeat previous command | +| Command | Parameters | Notes | +|:---------|:------------------------------|:-------------------------| +| REPEAT | Number of additional repeats | Repeat previous command | ### ALT+Numpad input On Windows and some Linux systems, you can print characters by holding `ALT` key and entering its code on Numpad. | Command | Parameters | Notes | -| --------- | -------------- | --------------------------------------------------------------- | +| :---------- | :--------------- | :--------------------------------------------------------------- | | ALTCHAR | Character code | Print single character | | ALTSTRING | Text string | Print text string using ALT+Numpad method | -| ALTCODE | Text string | Same as ALTSTRING, presents in some Duckyscript implementations | +| ALTCODE | Text string | Same as ALTSTRING, presents in some DuckyScript implementations | ### SysRq Send [SysRq command](https://en.wikipedia.org/wiki/Magic_SysRq_key) -| Command | Parameters | Notes | -| ------- | ---------------- | ----- | -| SYSRQ | Single character | | + +| Command | Parameters | Notes | +|:---------|:------------------|:-------| +| SYSRQ | Single character | | ## Media keys -Some Media/Consumer Control keys can be pressed with "MEDIA" command - -| Command | Parameters | Notes | -| ------- | ------------------------- | ----- | -| MEDIA | Media key, see list below | | - -| Key name | Notes | -| ----------------- | ----------------------------- | -| POWER | | -| REBOOT | | -| SLEEP | | -| LOGOFF | | -| EXIT | | -| HOME | | -| BACK | | -| FORWARD | | -| REFRESH | | -| SNAPSHOT | Take photo in a camera app | -| PLAY | | -| PAUSE | | -| PLAY_PAUSE | | -| NEXT_TRACK | | -| PREV_TRACK | | -| STOP | | -| EJECT | | -| MUTE | | -| VOLUME_UP | | -| VOLUME_DOWN | | -| FN | Fn/Globe key on Mac keyboard | -| BRIGHT_UP | Increase display brightness | -| BRIGHT_DOWN | Decrease display brightness | +Some Media/Consumer Control keys can be pressed with `MEDIA` command + +| Command | Parameters | Notes | +|:---------|:---------------------------|:------| +| MEDIA | Media key, see list below | | + + +| Key name | Notes | +|:-------------------|:-------------------------------| +| POWER | | +| REBOOT | | +| SLEEP | | +| LOGOFF | | +| EXIT | | +| HOME | | +| BACK | | +| FORWARD | | +| REFRESH | | +| SNAPSHOT | Take photo in a camera app | +| PLAY | | +| PAUSE | | +| PLAY_PAUSE | | +| NEXT_TRACK | | +| PREV_TRACK | | +| STOP | | +| EJECT | | +| MUTE | | +| VOLUME_UP | | +| VOLUME_DOWN | | +| FN | Fn/Globe key on Mac keyboard | +| BRIGHT_UP | Increase display brightness | +| BRIGHT_DOWN | Decrease display brightness | ## Fn/Globe key commands (Mac/iPad) -| Command | Parameters | Notes | -| ------- | ------------------------------- | ----- | -| GLOBE | Special key or single character | | +| Command | Parameters | Notes | +|:---------|:---------------------------------|:-------| +| GLOBE | Special key or single character | | ## Wait for button press Will wait indefinitely for a button to be pressed -| Command | Parameters | Notes | -| --------------------- | ------------ | --------------------------------------------------------------------- | -| WAIT_FOR_BUTTON_PRESS | None | Will wait for the user to press a button to continue script execution | + +| Command | Parameters | Notes | +|:----------------------|:-----------|:------------------------------------------------------------------------------| +| WAIT_FOR_BUTTON_PRESS | None | Will wait for the user to press a button to continue script execution | ## USB device ID You can set the custom ID of the Flipper USB HID device. ID command should be in the **first line** of script, it is executed before script run. -| Command | Parameters | Notes | -| ------- | ---------------------------- | ----- | -| ID | VID:PID Manufacturer:Product | | +| Command | Parameters | Notes | +|:---------|:------------------------------|:-------| +| ID | VID:PID Manufacturer:Product | | Example: -`ID 1234:abcd Flipper Devices:Flipper Zero` +```text +ID 1234:abcd Flipper Devices:Flipper Zero +``` -VID and PID are hex codes and are mandatory. Manufacturer and Product are text strings and are optional. +> [!ATTENTION] +> VID and PID are hex codes and are mandatory. +> Manufacturer and Product are text strings and are optional. From 4b4e9cab8bccbe640f7f2c5dda0c7ff45555f083 Mon Sep 17 00:00:00 2001 From: DerSkythe <31771569+derskythe@users.noreply.github.com> Date: Wed, 24 Jul 2024 18:47:36 +0400 Subject: [PATCH 04/52] Update Get started with the Dev Board.md Signed-off-by: DerSkythe <31771569+derskythe@users.noreply.github.com> --- .../Get started with the Dev Board.md | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/documentation/devboard/Get started with the Dev Board.md b/documentation/devboard/Get started with the Dev Board.md index 8747d126ee..4a895f9993 100644 --- a/documentation/devboard/Get started with the Dev Board.md +++ b/documentation/devboard/Get started with the Dev Board.md @@ -2,7 +2,8 @@ The Wi-Fi Developer Board serves as a tool to debug the Flipper Zero firmware. To debug the firmware, the initial step involves compiling the firmware from its source code. This process enables the debugging functionality within the firmware and generates all the necessary files required for debugging purposes. -> [!IMPORTANT] +> [!IMPORTANT] +> > Building and debugging the Flipper Zero firmware is fully supported on MacOS and Linux. > Support for Windows is in beta test. @@ -55,7 +56,8 @@ Then, run the **Flipper Build Tool** (FBT) to build the firmware: The Developer Board can work in the **Wired** mode and two **Wireless** modes: **Wi-Fi access point (AP)** mode and **Wi-Fi client (STA)** mode. The Wired mode is the simplest to set up, but requires a USB Type-C cable. The Wireless modes are more complex to set up, but they allow you to debug your Flipper Zero wirelessly. -> [!TIP] +> [!TIP] +> > Use the following credentials when connecting to the Developer Board in **Wi-Fi access point** mode: > Name: **blackmagic** > Password: **iamwitcher** @@ -88,12 +90,15 @@ To connect the Developer Board in **Wired** mode, do the following: 4. Rerun the command. Two new devices have to appear: this is the Developer Board. -> [!NOTE] +> [!NOTE] +> > If the Developer Board doesn't appear in the list of devices, try using a different cable, USB port, or computer.
    -> [!IMPORTANT] Flipper Zero logs can only be viewed when the Developer Board is connected via USB. +> [!IMPORTANT] +> +> Flipper Zero logs can only be viewed when the Developer Board is connected via USB. > The option to view logs over Wi-Fi will be added in future updates. > For more information, visit [Reading logs via the Dev Board](https://docs.flipperzero.one/development/hardware/wifi-debugger-module/reading-logs). @@ -110,14 +115,10 @@ Out of the box, the Developer Board is configured to work as a **Wi-Fi access po To connect the Developer Board in **Wi-Fi access point** mode, do the following: 1. Cold-plug the Developer Board by turning off your Flipper Zero and connecting the Developer Board, and then turning it back on. - 2. Open Wi-Fi settings on your client device (phone, laptop, or other). - 3. Connect to the network: - * Name: `blackmagic` * Password: `iamwitcher` - 4. To configure the Developer Board, open a browser and go to `http://192.168.4.1`. ### Wi-Fi client (STA) mode @@ -127,13 +128,9 @@ To connect the Developer Board in **Wi-Fi access point** mode, do the following: To connect the Developer Board in **Wi-Fi client** mode, you need to configure it to connect to your Wi-Fi network by doing the following: 1. Cold-plug the Developer Board by turning off your Flipper Zero and connecting the Developer Board, and then turning it back on. - 2. Connect to the Developer Board in **Wi-Fi access point** mode. - 3. In a browser, go to the configuration page on `http://192.168.4.1`. - 4. Select the **STA** mode and enter your network's **SSID** (name) and **password**. For convenience, you can click the **+** button to see the list of nearby networks. - 5. Save the configuration and reboot the Developer Board. ![In the Wi-Fi tab, you can set the Developer Board mode](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/klbLVj8lz2bEvm7j4wRaj_monosnap-miro-2023-06-23-13-06-32.jpg) @@ -144,8 +141,6 @@ After connecting to your debugger via [http://blackmagic.local](http://blackmagi ![In the SYS tab, you can view the IP address of your Developer Board](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/5XbUptlfqzlV0p6hRUqiG_monosnap-miro-2023-06-22-18-11-30.jpg) -*** - ## Debugging the firmware Open the **Terminal** in the `flipperzero-firmware` directory that you cloned earlier and run the following command: @@ -159,16 +154,16 @@ This will upload the firmware you've just built to your Flipper Zero via the Dev To debug in **VSCode**, do the following: 1. In VSCode, open the `flipperzero-firmware` directory. - 2. You should see a notification about recommended extensions. Install them. - > [!TIP] If there were no notifications, open the `Extensions` tab, enter `@recommended` in the search bar, and install the workspace recommendations. - +> [!TIP] +> +> If there were no notifications, open the `Extensions` tab, +> enter `@recommended` in the search bar, +> and install the workspace recommendations. +> 3. In the **Terminal**, run the `./fbt vscode_dist` command. This will generate the VSCode configuration files needed for debugging. - 4. In VSCode, open the **Run and Debug** tab and select **Attach FW (blackmagic)** from the dropdown menu. - 5. If needed, flash your Flipper Zero with the `./fbt flash` command, then click the **Play** button in the debug sidebar to start the debugging session. - 6. Note that starting a debug session halts the execution of the firmware, so you'll need to click the **Continue** button on the toolbar at the top of your VSCode window to continue execution. ![Click Continue in the toolbar to continue execution of the firmware](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/lp8ygGaZ3DvWD3OSI9yGO_monosnap-miro-2023-06-23-17-58-09.jpg) @@ -176,5 +171,4 @@ To debug in **VSCode**, do the following: To learn about debugging, visit the following pages: * [Debugging with GDB](https://sourceware.org/gdb/current/onlinedocs/gdb.pdf) - -* [Debugging in VS Code](https://code.visualstudio.com/docs/editor/debugging) +* [Debugging in VSCode](https://code.visualstudio.com/docs/editor/debugging) From 5d82ecfed528784ff63643c33632d8936612c569 Mon Sep 17 00:00:00 2001 From: DerSkythe <31771569+derskythe@users.noreply.github.com> Date: Wed, 24 Jul 2024 19:00:38 +0400 Subject: [PATCH 05/52] Update Get started with the Dev Board.md Signed-off-by: DerSkythe <31771569+derskythe@users.noreply.github.com> --- .../devboard/Get started with the Dev Board.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/documentation/devboard/Get started with the Dev Board.md b/documentation/devboard/Get started with the Dev Board.md index 4a895f9993..a6fe301783 100644 --- a/documentation/devboard/Get started with the Dev Board.md +++ b/documentation/devboard/Get started with the Dev Board.md @@ -64,7 +64,7 @@ The Developer Board can work in the **Wired** mode and two **Wireless** modes: * ## Wired -![The Developer Board in Wired mode](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/jZdVlRTPVdSQVegzCyXp7_monosnap-miro-2023-06-22-16-28-06.jpg) +![The Developer Board in Wired mode](https://github.com/user-attachments/assets/32938d4a-20b7-4a53-8b36-608cf0112c9a) To connect the Developer Board in **Wired** mode, do the following: @@ -106,11 +106,11 @@ To connect the Developer Board in **Wired** mode, do the following: ### Wi-Fi access point (AP) mode -![The Developer Board in Wi-Fi access point mode](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/tKRTMHAuruiLSEce2a8Ve_monosnap-miro-2023-06-22-16-39-17.jpg) +![The Developer Board in Wi-Fi access point mode](https://github.com/user-attachments/assets/1f210e91-3ac8-4f4c-a910-cc7c52b94346) Out of the box, the Developer Board is configured to work as a **Wi-Fi access point**. This means it'll create its own Wi-Fi network to which you can connect. If your Developer Board doesn't create a Wi-Fi network, it is probably configured to work in **Wi-Fi client** mode. To reset your Developer Board back to **Wi-Fi access point** mode, press and hold the **BOOT** button for 10 seconds, then wait for the module to reboot. -![You can reconfigure the Developer Board mode by pressing and holding the BOOT button](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/57eELJsAwMxeZCEA1NMJw_monosnap-miro-2023-06-22-20-33-27.jpg) +![You can reconfigure the Developer Board mode by pressing and holding the BOOT button](https://github.com/user-attachments/assets/8fee05de-fb1e-475a-b23a-d1ddca9cd701) To connect the Developer Board in **Wi-Fi access point** mode, do the following: @@ -123,7 +123,7 @@ To connect the Developer Board in **Wi-Fi access point** mode, do the following: ### Wi-Fi client (STA) mode -![The Developer Board in Wi-Fi client mode](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/xLQpFyYPfUS5Cx0uQhrNd_monosnap-miro-2023-06-23-12-34-36.jpg) +![The Developer Board in Wi-Fi client mode](https://github.com/user-attachments/assets/42e7e69e-51b0-4914-b082-431c68bc75d3) To connect the Developer Board in **Wi-Fi client** mode, you need to configure it to connect to your Wi-Fi network by doing the following: @@ -133,13 +133,13 @@ To connect the Developer Board in **Wi-Fi client** mode, you need to configure i 4. Select the **STA** mode and enter your network's **SSID** (name) and **password**. For convenience, you can click the **+** button to see the list of nearby networks. 5. Save the configuration and reboot the Developer Board. -![In the Wi-Fi tab, you can set the Developer Board mode](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/klbLVj8lz2bEvm7j4wRaj_monosnap-miro-2023-06-23-13-06-32.jpg) +![In the Wi-Fi tab, you can set the Developer Board mode]](https://github.com/user-attachments/assets/fbeea000-1117-4297-8a0d-5d580123e938) After rebooting, the Developer Board connects to your Wi-Fi network. You can connect to the device using the mDNS name `blackmagic.local` or the IP address it got from your router (you'll have to figure this out yourself, every router is different). After connecting to your debugger via [http://blackmagic.local](http://blackmagic.local), you can find its IP address in the **SYS** tab. You can also change the debugger's mode to **AP** or **STA** there. -![In the SYS tab, you can view the IP address of your Developer Board](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/5XbUptlfqzlV0p6hRUqiG_monosnap-miro-2023-06-22-18-11-30.jpg) +![In the SYS tab, you can view the IP address of your Developer Board](https://github.com/user-attachments/assets/aa3afc64-a2ec-46a6-a827-eea187a97c04) ## Debugging the firmware @@ -166,7 +166,7 @@ To debug in **VSCode**, do the following: 5. If needed, flash your Flipper Zero with the `./fbt flash` command, then click the **Play** button in the debug sidebar to start the debugging session. 6. Note that starting a debug session halts the execution of the firmware, so you'll need to click the **Continue** button on the toolbar at the top of your VSCode window to continue execution. -![Click Continue in the toolbar to continue execution of the firmware](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/lp8ygGaZ3DvWD3OSI9yGO_monosnap-miro-2023-06-23-17-58-09.jpg) +![Click Continue in the toolbar to continue execution of the firmware](https://github.com/user-attachments/assets/74f26bdb-8511-4e5a-8aa8-c44212aa6228) To learn about debugging, visit the following pages: From a1f961ea2a5fbfb0f38970f911a705abd75ea733 Mon Sep 17 00:00:00 2001 From: DerSkythe <31771569+derskythe@users.noreply.github.com> Date: Wed, 24 Jul 2024 19:01:47 +0400 Subject: [PATCH 06/52] Update Get started with the Dev Board.md Signed-off-by: DerSkythe <31771569+derskythe@users.noreply.github.com> --- documentation/devboard/Get started with the Dev Board.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/documentation/devboard/Get started with the Dev Board.md b/documentation/devboard/Get started with the Dev Board.md index a6fe301783..a679ccb11e 100644 --- a/documentation/devboard/Get started with the Dev Board.md +++ b/documentation/devboard/Get started with the Dev Board.md @@ -132,8 +132,9 @@ To connect the Developer Board in **Wi-Fi client** mode, you need to configure i 3. In a browser, go to the configuration page on `http://192.168.4.1`. 4. Select the **STA** mode and enter your network's **SSID** (name) and **password**. For convenience, you can click the **+** button to see the list of nearby networks. 5. Save the configuration and reboot the Developer Board. +6. In the Wi-Fi tab, you can set the Developer Board mode -![In the Wi-Fi tab, you can set the Developer Board mode]](https://github.com/user-attachments/assets/fbeea000-1117-4297-8a0d-5d580123e938) +![Developer Board mode](https://github.com/user-attachments/assets/fbeea000-1117-4297-8a0d-5d580123e938) After rebooting, the Developer Board connects to your Wi-Fi network. You can connect to the device using the mDNS name `blackmagic.local` or the IP address it got from your router (you'll have to figure this out yourself, every router is different). From 6947efae2749788523d6cce9355d739d1c953c99 Mon Sep 17 00:00:00 2001 From: DerSkythe <31771569+derskythe@users.noreply.github.com> Date: Wed, 24 Jul 2024 19:05:14 +0400 Subject: [PATCH 07/52] Update Firmware update on Developer Board.md Signed-off-by: DerSkythe <31771569+derskythe@users.noreply.github.com> --- .../devboard/Firmware update on Developer Board.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/documentation/devboard/Firmware update on Developer Board.md b/documentation/devboard/Firmware update on Developer Board.md index 1cd205023d..0df5c1f7de 100644 --- a/documentation/devboard/Firmware update on Developer Board.md +++ b/documentation/devboard/Firmware update on Developer Board.md @@ -52,13 +52,13 @@ If you want to learn more about uFBT, visit [the project's page](https://pypi.or ``` View the devices in the list. 2. Connect the Developer Board to your computer using a USB-C cable. -![The Developer Board in Wired mode](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/Aq7gfMI-m_5H6sGGjwb4I_monosnap-miro-2023-07-19-19-47-39.jpg) -3. Switch your Developer Board to Bootloader mode: +![The Developer Board in Wired mode](https://github.com/user-attachments/assets/d13e4e90-d83d-45bf-8787-6eadba590795) +4. Switch your Developer Board to Bootloader mode: 3.1. Press and hold the **BOOT** button. 3.2. Press the **RESET** button while holding the **BOOT** button. 3.3. Release the **BOOT** button. -![You can easily switch the Dev Board to Bootloader mode](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/KynP9iT6sJ3mXLaLyI82__image.png) -4. Repeat Step 1 and view the name of your Developer Board that appeared in the list. + ![You can easily switch the Dev Board to Bootloader mode](https://github.com/user-attachments/assets/aecc957f-f37b-4bec-af9f-9efd4837152e) +6. Repeat Step 1 and view the name of your Developer Board that appeared in the list. For example, on macOS: @@ -98,8 +98,7 @@ Try doing the following: ## Finishing the installation After flashing the firmware: -1. Reboot the Developer Board by pressing the **RESET** button. -![Reset the Developer Board](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/rcQeKARgrVwa51tLoo-qY_monosnap-miro-2023-07-20-18-29-33.jpg) -2. Disconnect and reconnect the USB-C cable. +1. Reboot the Developer Board by pressing the **RESET** button. ![Reset the Developer Board](https://github.com/user-attachments/assets/7527dd7b-eaa5-4fac-8d67-7ba52e552756) +3. Disconnect and reconnect the USB-C cable. The Developer Board should appear as a serial device on your computer. Now, you can use it with the Black Magic Debug client of your choice. From 63351f3fb6d69b5f8ee86eb5b247bf21085a82a9 Mon Sep 17 00:00:00 2001 From: DerSkythe <31771569+derskythe@users.noreply.github.com> Date: Wed, 24 Jul 2024 19:12:40 +0400 Subject: [PATCH 08/52] Update Reading logs via the Dev Board.md Signed-off-by: DerSkythe <31771569+derskythe@users.noreply.github.com> --- .../Reading logs via the Dev Board.md | 91 +++++++------------ 1 file changed, 31 insertions(+), 60 deletions(-) diff --git a/documentation/devboard/Reading logs via the Dev Board.md b/documentation/devboard/Reading logs via the Dev Board.md index 5cf35d99ee..41461b1cdc 100644 --- a/documentation/devboard/Reading logs via the Dev Board.md +++ b/documentation/devboard/Reading logs via the Dev Board.md @@ -4,17 +4,14 @@ The Developer Board allows you to read Flipper Zero logs via UART. Unlike readin > [!NOTE] > -> Flipper Zero logs can only be viewed when the developer board is connected via USB. The option to view logs over Wi-Fi will be added in future updates. - -*** +> Flipper Zero logs can only be viewed when the developer board is connected via USB. +> The option to view logs over Wi-Fi will be added in future updates. ## Setting the log level Depending on your needs, you can set the log level by going to `Main Menu -> Settings -> Log Level`. To learn more about logging levels, visit [Settings](https://docs.flipperzero.one/basics/settings#d5TAt). -![You can manually set the preferred log level](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/INzQMw8QUsG9PXi30WFS0_monosnap-miro-2023-07-11-13-29-47.jpg) - -*** +![You can manually set the preferred log level](https://github.com/user-attachments/assets/b1317d01-8b9b-4544-8720-303c87b85324) ## Viewing Flipper Zero logs @@ -37,43 +34,35 @@ After installation of `minicom` on your macOS computer, you can connect to the D 1. Cold-plug the Developer Board into your Flipper Zero by turning off the Flipper Zero, connecting the developer board, and then turning it back on. 2. On your computer, open the Terminal and run the following command: - ```bash ls /dev/cu.* ``` - - > [!NOTE] The list of devices. - +> [!NOTE] +> +> The list of devices. 3. Connect the developer board to your computer using a USB Type-C cable. -![Connect the developer board with a USB-C cable](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/iPpsMt2-is4aIjiVeFu5t_hjxs2i1oovrnps74v5jgsimage.png) - -4. Rerun the command. Two new devices have to appear: this is the Developer Board. - + ![Connect the developer board with a USB-C cable](https://github.com/user-attachments/assets/0f469a31-2dd1-4559-918a-ff3ca3309531) +5. Rerun the command. Two new devices have to appear: this is the Developer Board. ```bash /dev/cu.usbmodemblackmagic1 ``` - ```bash /dev/cu.usbmodemblackmagic3 ``` - > [!NOTE] Your Developer Board might have different names. - -5. Run the following command: - +> [!NOTE] +> +> Your Developer Board might have different names. +6. Run the following command: ```bash minicom -D /dev/ -b 230400 ``` Where `` is the name of your device with a bigger number. - Example: - ```bash minicom -D /dev/cu.usbmodemblackmagic3 -b 230400 ``` - -6. View logs of your Flipper Zero in the Terminal. - -7. To quit, close the `minicom` window or quit via the `minicom` menu. +7. View logs of your Flipper Zero in the Terminal. +8. To quit, close the `minicom` window or quit via the `minicom` menu. ### Linux @@ -86,48 +75,38 @@ On Linux, you need to install the `minicom` communication program. For example, After installation of `minicom` on your Linux computer, you can connect to the Developer Board to read Flipper Zero logs by doing the following: 1. Cold-plug the Developer Board into your Flipper Zero by turning off the Flipper Zero, connecting the developer board, and then turning it back on. - 2. On your computer, open the Terminal and run the following command: - ```bash ls /dev/tty* ``` - Note the list of devices. - 3. Connect the developer board to your computer using a USB Type-C cable. -![Connect the developer board with a USB-C cable](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/iPpsMt2-is4aIjiVeFu5t_hjxs2i1oovrnps74v5jgsimage.png) - + ![Connect the developer board with a USB-C cable](https://github.com/user-attachments/assets/0f469a31-2dd1-4559-918a-ff3ca3309531) 4. Rerun the command. Two new devices have to appear: this is the Developer Board. - ```bash /dev/ttyACM0 ``` - ```bash /dev/ttyACM1 ``` - - > [!NOTE] Your Developer Board might have different names. - +> [!NOTE] +> +> Your Developer Board might have different names. 5. Run the following command: - ```bash minicom -D /dev/ -b 230400 ``` - Where `` is the name of your device with a bigger number. - Example: - ```bash minicom -D /dev/cu.usbmodemblackmagic3 -b 230400 ``` - 6. View logs of your Flipper Zero in the Terminal. - - > [!NOTE] If no logs are shown in the Terminal, try running the command from Step 5 with another device name. - +> [!NOTE] +> +> If no logs are shown in the Terminal, +> try running the command from Step 5 with another device name. +> 7. To quit, close the minicom window or quit via the minicom menu. ### Windows @@ -135,22 +114,14 @@ After installation of `minicom` on your Linux computer, you can connect to the D On Windows, do the following: 1. On your computer, [install the PuTTY application](https://www.chiark.greenend.org.uk/\~sgtatham/putty/latest.html). - 2. Cold-plug the Developer Board into your Flipper Zero by turning off the Flipper Zero, connecting the developer board, and then turning it back on. - 3. Connect the developer board to your computer using a USB Type-C cable. -![Connect the developer board with a USB-C cable](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/iPpsMt2-is4aIjiVeFu5t_hjxs2i1oovrnps74v5jgsimage.png) - + ![Connect the developer board with a USB-C cable](https://github.com/user-attachments/assets/0f469a31-2dd1-4559-918a-ff3ca3309531) 4. Find the serial port that the developer board is connected to by going to `Device Manager -> Ports (COM & LPT)` and looking for a new port that appears when you connect the Wi-Fi developer board. -![Find the serial port in your Device Manager](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/KKLQJK1lvqmI5iab3d__C_image.png) - -5. Run the `PuTTY` application and select `Serial` as the connection type. - -6. Enter the port number you found in the previous step into the `Serial line` field. - -7. Set the `Speed` parameter to `230400` and click `Open`. -![Set speed to 230400](https://archbee-image-uploads.s3.amazonaws.com/3StCFqarJkJQZV-7N79yY/ROBSJyfQ_CXiy4GUZcPbs_monosnap-miro-2023-07-12-13-56-47.jpg) - -8. View logs of your Flipper Zero in the PuTTY terminal window. - -9. To quit, close the PuTTY window. + ![Find the serial port in your Device Manager](https://github.com/user-attachments/assets/aa542fe6-4781-45dc-86f6-e98ab34952b0) +6. Run the `PuTTY` application and select `Serial` as the connection type. +7. Enter the port number you found in the previous step into the `Serial line` field. +8. Set the `Speed` parameter to `230400` and click `Open`. + ![Set speed to 230400](https://github.com/user-attachments/assets/93463c78-9776-479b-a6cc-d68ed712d0c4) +10. View logs of your Flipper Zero in the PuTTY terminal window. +11. To quit, close the PuTTY window. From f8ad2b556b5a7c8b97a85fb6e9e5356aa5aea4a9 Mon Sep 17 00:00:00 2001 From: DerSkythe <31771569+derskythe@users.noreply.github.com> Date: Wed, 24 Jul 2024 19:13:47 +0400 Subject: [PATCH 09/52] Update BadUsbScriptFormat.md Signed-off-by: DerSkythe <31771569+derskythe@users.noreply.github.com> --- documentation/file_formats/BadUsbScriptFormat.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/documentation/file_formats/BadUsbScriptFormat.md b/documentation/file_formats/BadUsbScriptFormat.md index 8b0a449020..0b8381c1e8 100644 --- a/documentation/file_formats/BadUsbScriptFormat.md +++ b/documentation/file_formats/BadUsbScriptFormat.md @@ -189,6 +189,7 @@ Example: ID 1234:abcd Flipper Devices:Flipper Zero ``` -> [!ATTENTION] +> [!IMPORTANT] +> > VID and PID are hex codes and are mandatory. > Manufacturer and Product are text strings and are optional. From 0286a336a1ae66d3741a51098e4907efa2af51e6 Mon Sep 17 00:00:00 2001 From: DerSkythe <31771569+derskythe@users.noreply.github.com> Date: Wed, 24 Jul 2024 19:32:38 +0400 Subject: [PATCH 10/52] Update FAQ.md Signed-off-by: DerSkythe <31771569+derskythe@users.noreply.github.com> --- documentation/FAQ.md | 82 +++++++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 35 deletions(-) diff --git a/documentation/FAQ.md b/documentation/FAQ.md index 96b11aca53..67581999e3 100644 --- a/documentation/FAQ.md +++ b/documentation/FAQ.md @@ -15,7 +15,7 @@ Follow this link for [details](https://github.com/DarkFlippers/unleashed-firmwar ## INSTALLED UNLEASHED AND NOW BACKLIGHT DOESNT WORK? -You’ve installed a version made for custom RGB modded flippers. The version ending in `“r”` is specifically for “RGB” modded flippers.
    +You’ve installed a version made for custom RGB modded flippers. The version ending in `r` is specifically for `RGB` modded flippers.
    Please, do not use that version if your flipper isn’t modded! @@ -23,14 +23,13 @@ Please, do not use that version if your flipper isn’t modded! See default pack and extra pack (for `e` build) list [here](https://github.com/xMasterX/all-the-plugins/tree/dev). - ## Where I can find differences between original (official) firmware and Unleashed firmware? [Right here](https://github.com/DarkFlippers/unleashed-firmware#whats-changed) ## How to use SubGHz Remote app? -1. Open app, press Back button, select New map file +1. Open app, press `Back` button, select `New map file` 2. Configure signal files and their names for every button (also you can add only one signal and make other buttons empty - just don't select any files for them in config) 3. Save new map file 4. Open map file and select your previously created file @@ -43,9 +42,9 @@ Follow this [link](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/d ## I installed Unleashed firmware and now my mobile app doesn't connect to flipper ( OR I changed flipper device name and my mobile app now doesn't connect to flipper ) 1. Click Forget flipper in mobile app - 2. Open your phone settings - bluetooth, find flipper - if it present here - open its options and click forget device - 3. On flipper itself open Settings -> Bluetooth -> Forget all devices -> and confirm - 4. Make sure your flipper has bluetooth ON and open Mobile app and pair it to flipper + 2. Open your `phone settings - bluetooth`, find flipper - if it present here - open its options and click forget device + 3. On flipper itself open `Settings -> Bluetooth -> Forget all devices` and confirm + 4. Make sure your flipper has bluetooth `ON` and open Mobile app and pair it to flipper 5. Done ## My desktop (pin, favourites, etc..) (or other) settings was reset to default after update, what to do? @@ -58,20 +57,19 @@ The most common cause of the flipper not connecting to google chrome is having q Or having second flipper lab page open at same time.
    -You must close qFlipper (or other flipper lab web pages) before attempting to connect your flipper to chrome. +You must close qFlipper (or other flipper lab web pages) before attempting to connect your flipper to Chrome. ## Flipper doesn't work! How to restore firmware??? Follow this [guide](https://docs.flipper.net/basics/firmware-update/firmware-recovery) - ## Useful links and files Flipper Awesome - place where you can find almost all links that you might need:
    * [Awesome-FlipperZero](https://github.com/djsime1/awesome-flipperzero) * Dict files for iButton Fuzzer and RFID Fuzzer:
    -https://t.me/flipperzero_unofficial_ru/37058
    -https://t.me/flipperzero_unofficial_ru/37072 + * https://t.me/flipperzero_unofficial_ru/37058
    + * https://t.me/flipperzero_unofficial_ru/37072 * UL Releases in [Telegram](https://t.me/unleashed_fw) * UL Dev Builds in [Telegram](https://t.me/kotnehleb) * Our [Discord](https://discord.unleashedflip.com) @@ -80,7 +78,7 @@ https://t.me/flipperzero_unofficial_ru/37072 All is simple: 1. Open `Settings -> Desktop -> Change Flipper Name` -2. Enter new name and click Save +2. Enter new name and click `Save` 3. Exit from settings - Flipper will automatically reboot 4. Done, you have custom name which will stay until you reset it to default or replace with new one @@ -107,9 +105,15 @@ Please follow this [link](https://github.com/DarkFlippers/unleashed-firmware#ple ## What are the dev builds? Where I can get latest build for dev branch? -This is an automatic assembly of the latest commits from the repository that have not yet been released, the previous build is deleted when a new one is uploaded and old remains only as file in the telegram channel

    -Be aware that this is not release ready builds! They may have bugs and issues, if you are using dev build and found issue, report it! In GitHub issues -
    +This is an automatic assembly of the latest commits from the repository that have not yet been released, the previous build is deleted when a new one is uploaded and old remains only as file in the telegram channel + +> [!CAUTION] +> +> Be aware that this is not release ready builds! +> +> They may have bugs and issues, +> if you are using dev build and found issue, +> report it! In [GitHub issues](https://github.com/DarkFlippers/unleashed-firmware/issues) Dev builds is available in Discord, Win channel - `unleashed-development`
    Builds also can be found [here](https://t.me/kotnehleb).
    @@ -137,13 +141,20 @@ The server will remain active and will be automatically updated [Guide](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md) -## How Can I Unlock/Remove SubGHz restriction? +## How Can I Unlock / Remove SubGHz restriction? -If you are using Unleashed firmware - **all region locks are removed by default**! +> [!TIP] +> +> If you are using Unleashed firmware - **all region locks are removed by default**! + +Also, there is a way to go outside of frequencies stated in `CC1101 datasheet`, but transmission on those frequencies may cause chip damage, make sure you know what you are doing! + +Do not edit this settings to bypass region lock since there is no region locks in unleashed, all chip supported frequencies will work without any extra steps.

    -Also, there is a way to go outside of frequencies stated in CC1101 datasheet, but transmission on those frequencies may cause chip damage, make sure you know what you are doing! Do not edit this settings to bypass region lock since there is no region locks in unleashed, all chip supported frequencies will work without any extra steps.

    But, if you know that you need to bypass subghz chip safety restriction you can unlock the safety restriction which will allow you to go outside the chips supported frequency.

    -This covers how to do it and information regarding the risks of damage to the flipper by doing so. Please read [this](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/DangerousSettings.md) before. +This covers how to do it and information regarding the risks of damage to the flipper by doing so. + +Please read [this](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/DangerousSettings.md) before. ## Can I clone a car key fob for my own car to use flipper as a key? @@ -161,7 +172,7 @@ Nowhere, this is illegal in almost every country in the world And you might be banned for that in our communities, since 99% of that content is fake, or showing illegal actions, and we don't like TikTok related questions. -## I was banned in Unleashed Discord/Telegram/etc.. How to remove ban? I created GitHub issue and it was removed too! +## I was banned in Unleashed Discord / Telegram / etc.. How to remove ban? I created GitHub issue and it was removed too! Not possible, rules is rules, read them before sending messages in our communities @@ -169,7 +180,7 @@ Not possible, rules is rules, read them before sending messages in our communiti `sudo dot_clean -mn /Volumes/Flipper\ SD` -> `Flipper\ SD` may be named differently for you, replace with your microSD card name -## How to sort files on flipper microSD on macOS/Linux? +## How to sort files on flipper microSD on macOS / Linux? Will make sorting faster, and will work for OFW 1. `brew install fatsort` -> Install fatsort using `brew.sh` (only on macOS) @@ -180,7 +191,7 @@ Will make sorting faster, and will work for OFW ## Your Flipper feels slow and unresponsive? 1. Make sure you using good microSD card from known brand, flipper works with microSD via SPI that means not any microSD will work good even if it works ok with other devices. -2. Go into **Settings -> System** and make sure that you have +2. Go into `Settings -> System` and make sure that you have ```text Log Level = None Debug = OFF @@ -191,16 +202,16 @@ Will make sorting faster, and will work for OFW ## Flipper crashed, stuck, frozen? -Reboot it by holding Left + Back buttons +Reboot it by holding `Left` + `Back` buttons ![how to reboot flipper gif, shows how to hold left and back button](https://media.tenor.com/eUbBDDEzmwMAAAAC/flipper-zero-flipper-zero-reboot.gif) ## How to reset forgotten Flipper pin code? **Disconnect USB Cable if it was connected** -1. Turn off the device - hold back button -> Turn Off +1. Turn off the device - hold back button -> `Turn Off` **If you can't turn it off, try next step but hold buttons for 30-40 seconds)** -2. Hold `Up` + `Back` for `~5 sec` -> You will see reset screen -> Hold `Right` to reset (and `Down` arrow to exit if you don't want to reset pin code) +2. Hold Up + Back for `~5 sec` -> You will see reset screen -> Hold Right to reset (and Down arrow to exit if you don't want to reset pin code) 3. Done, internal memory (dolphin level, settings, pin code, is erased to default settings) ## What are the differences between x, y and z firmware? @@ -237,10 +248,10 @@ The Flipper Zero has no available attacks for this card currently. ### Amiibos -- NTAG215. that's it. It's not going on a MIFARE Classic. +- `NTAG215`. That's it. It's not going on a MIFARE Classic. - Currently, you cannot write Amiibos to new physical tags. yet. -### HID/iClass +### HID / iClass - `Picopass` iClass can be read using the `Picopass` reader plugin - 26bit Picopass can be downgraded to H10301 RFID credentials (note, it is not guaranteed to work if the reader is not configured to read low frequency) @@ -252,29 +263,30 @@ The Flipper Zero has no available attacks for this card currently. ### LF-RFID If you're wanting to make clones of low frequency RFID chips you need to write to T5577's. `Blanks` do not exist. All of the chips the Flipper Zero can interact with are read-only and cannot be overwritten or purchased blank. + T5577s are multi-emulator chips that the Flipper Zero can program to be other tags -### Unknown Card/Fob +### Unknown Card / Fob -If you have exhausted all options of scanning via NFC/RFID/PICOPASS then take a photo of: +If you have exhausted all options of scanning via NFC / RFID / PICOPASS then take a photo of: - The front and back of your credential - The reader you use with the credential - If your credential is a card, hold it up to a very bright light source e.g. a lightbulb and take a photo of the exposed antenna. This is useful for identification, post it for us to identify! -## How do I access the CLI/Logs? +## How do I access the CLI / Logs? To access the Serial CLI, click one of the following based on your platform.
    Desktop web browser* - *Chromium browsers only, such as: Google Chrome, Microsoft Edge, Opera/Opera GX, Brave, and Vivaldi. + *Chromium browsers only, such as: Google Chrome, Microsoft Edge, Opera / Opera GX, Brave, and Vivaldi.
    • Connect your Flipper via USB.
    • Ensure qFlipper and any other serial terminals are closed.
    • Open my.flipp.dev in one of the aforementioned browsers.
    • -
    • Click CONNECT and select "USB Serial Device" from the list.
    • +
    • Click CONNECT and select USB Serial Device from the list.
    • Wait until you can see your device details on screen.
    • Select the 💻 CLI item from the left sidebar.
    • Done!
    • @@ -287,12 +299,12 @@ To access the Serial CLI, click one of the following based on your platform.
      • Install PuTTY if it isn't already.
      • Connect your Flipper via USB.
      • -
      • Open qFlipper and look for the COM port next to the Flipper's name. (Should say COM followed by a number, like COM1)
      • +
      • Open qFlipper and look for the COM port next to the Flipper's name. (Should say COM followed by a number, like COM1)
      • Take note of the COM port number.
      • CLOSE qFlipper, otherwise the next steps won't work.
      • Open PuTTY and ensure you're on the Session screen.
      • -
      • Select "Serial" under connection type.
      • -
      • Set serial line to the COM port. (Just COM followed by the number, like COM1)
      • +
      • Select Serial under connection type.
      • +
      • Set serial line to the COM port. (Just COM followed by the number, like COM1)
      • Set speed to 115200
      • Optional: Save the session settings for easy connection later.
      • Finally, click Open to enter the CLI.
      • @@ -339,7 +351,7 @@ To access the Serial CLI, click one of the following based on your platform. Unfortunately, iOS is incapable of accessing a serial terminal over USB; try one of the other methods
        • On the Flipper, open the settings, go to System, and set Log Level to Debug. (You can keep Debug set to off unless someone asks you to turn it on)
        • -
        • Once you have the CLI open, type log and press enter to start watching logs. Press Ctrl-C or Cmd-C to exit log mode.
        • +
        • Once you have the CLI open, type log and press enter to start watching logs. Press Ctrl-C or Cmd-C to exit log mode.
    From 012796d113356401a6e409f701a90b12eefa7e65 Mon Sep 17 00:00:00 2001 From: DerSkythe <31771569+derskythe@users.noreply.github.com> Date: Wed, 24 Jul 2024 19:33:22 +0400 Subject: [PATCH 11/52] Update FuriHalBus.md Signed-off-by: DerSkythe <31771569+derskythe@users.noreply.github.com> --- documentation/FuriHalBus.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/documentation/FuriHalBus.md b/documentation/FuriHalBus.md index 248699d778..7077e3abf0 100644 --- a/documentation/FuriHalBus.md +++ b/documentation/FuriHalBus.md @@ -6,7 +6,9 @@ On system startup, most of the peripheral devices are under reset and not clocke Some crucial peripherals are enabled right away by the system, others must be explicitly enabled by the user code. -> [!NOTE] Here and afterwards the word `system` refers to any code belonging to the operating system, +> [!NOTE] +> +> Here and afterwards the word `system` refers to any code belonging to the operating system, > hardware drivers or built-in applications. To **ENABLE** a peripheral, call `furi_hal_bus_enable()`. At the time of the call, the peripheral in question **MUST** be disabled; From 74527d97b9dbf4722fafbc5feb45521a9e00d975 Mon Sep 17 00:00:00 2001 From: DerSkythe <31771569+derskythe@users.noreply.github.com> Date: Wed, 24 Jul 2024 19:40:28 +0400 Subject: [PATCH 12/52] Update fbt.md Signed-off-by: DerSkythe <31771569+derskythe@users.noreply.github.com> --- documentation/fbt.md | 69 +++++++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/documentation/fbt.md b/documentation/fbt.md index 2538f23dc8..a8759f8eb2 100644 --- a/documentation/fbt.md +++ b/documentation/fbt.md @@ -9,24 +9,35 @@ If you don't need all features of `fbt` - like building the whole firmware - and To use `fbt`, you only need `git` installed in your system. -`fbt` by default downloads and unpacks a pre-built toolchain, and then modifies environment variables for itself to use it. It does not contaminate your global system's path with the toolchain. - > However, if you wish to use tools supplied with the toolchain outside `fbt`, you can open an *fbt shell*, with properly configured environment. - > - On Windows, simply run `scripts/toolchain/fbtenv.cmd`. - > - On Linux & MacOS, run `source scripts/toolchain/fbtenv.sh` in a new shell. - > - You can also type ```. `./fbt -s env` ``` in your shell. (Keep the "." at the beginning.) +`fbt` by default downloads and unpacks a pre-built toolchain, and then modifies environment variables for itself to use it. +It does not contaminate your global system's path with the toolchain. + +> [!NOTE] +> +> However, if you wish to use tools supplied with the toolchain outside `fbt`, +> you can open an *fbt shell*, with properly configured environment. +> +> - On Windows, simply run `scripts/toolchain/fbtenv.cmd`. +> - On Linux & MacOS, run `source scripts/toolchain/fbtenv.sh` in a new shell. +> - You can also type ```. `./fbt -s env` ``` in your shell. (Keep the "." at the beginning.) - If your system is not supported by pre-built toolchain variants or you want to use custom versions of dependencies, you can `set FBT_NOENV=1`. `fbt` will skip toolchain & environment configuration and will expect all tools to be available on your system's `PATH`. *(this option is not available on Windows)* +If your system is not supported by pre-built toolchain variants or you want to use custom versions of dependencies, you can `set FBT_NOENV=1`. - If `FBT_TOOLCHAIN_PATH` variable is set, `fbt` will use that directory to unpack toolchain into. By default, it downloads toolchain into `toolchain` subdirectory repo's root. +`fbt` will skip toolchain & environment configuration and will expect all tools to be available on your system's `PATH`. *(this option is not available on Windows)* + +If `FBT_TOOLCHAIN_PATH` variable is set, `fbt` will use that directory to unpack toolchain into. By default, it downloads toolchain into `toolchain` subdirectory repo's root. If you want to enable extra debug output for `fbt` and toolchain management scripts, you can `set FBT_VERBOSE=1`. `fbt` always performs `git submodule update --init` on start, unless you set `FBT_NO_SYNC=1` in the environment: - - On Windows, it's `set "FBT_NO_SYNC=1"` in the shell you're running `fbt` from - - On \*nix, it's `$ FBT_NO_SYNC=1 ./fbt ...` - - > There are more variables controlling basic `fbt` behavior. See `fbt` & `fbtenv` scripts' sources for details. +- On Windows, it's `set "FBT_NO_SYNC=1"` in the shell you're running `fbt` from +- On \*nix, it's `$ FBT_NO_SYNC=1 ./fbt ...` +> [!NOTE] +> +> There are more variables controlling basic `fbt` behavior. +> See `fbt` & `fbtenv` scripts' sources for details. +> ## Invoking FBT @@ -38,22 +49,34 @@ To run cleanup (think of `make clean`) for specified targets, add the `-c` optio ## Build directories -`fbt` builds updater & firmware in separate subdirectories in `build`, and their names depend on optimization settings (`COMPACT` & `DEBUG` options). However, for ease of integration with IDEs, the latest built variant's directory is always linked as `built/latest`. Additionally, `compile_commands.json` is generated in that folder (it is used for code completion support in IDEs). +`fbt` builds updater & firmware in separate subdirectories in `build`, and their names depend on optimization settings (`COMPACT` & `DEBUG` options). + +However, for ease of integration with IDEs, the latest built variant's directory is always linked as `built/latest`. + +Additionally, `compile_commands.json` is generated in that folder (it is used for code completion support in IDEs). -`build/latest` symlink & compilation database are only updated upon *firmware build targets* - that is, when you're re-building the firmware itself. Running other tasks, like firmware flashing or building update bundles *for a different debug/release configuration or hardware target*, does not update `built/latest` dir to point to that configuration. +`build/latest` symlink & compilation database are only updated upon *firmware build targets* - that is, when you're re-building the firmware itself. + +Running other tasks, like firmware flashing or building update bundles *for a different debug/release configuration or hardware target*, does not update `built/latest` dir to point to that configuration. ## VSCode integration -`fbt` includes basic development environment configuration for VSCode. Run `./fbt vscode_dist` to deploy it. That will copy the initial environment configuration to the `.vscode` folder. After that, you can use that configuration by starting VSCode and choosing the firmware root folder in the "File > Open Folder" menu. +`fbt` includes basic development environment configuration for VSCode. Run `./fbt vscode_dist` to deploy it. + +That will copy the initial environment configuration to the `.vscode` folder. -To use language servers other than the default VS Code C/C++ language server, use `./fbt vscode_dist LANG_SERVER=` instead. Currently `fbt` supports the default language server (`cpptools`) and `clangd`. +After that, you can use that configuration by starting VSCode and choosing the firmware root folder in the File > Open Folder menu. + +To use language servers other than the default VS Code C/C++ language server, use `./fbt vscode_dist LANG_SERVER=` instead. + +Currently `fbt` supports the default language server (`cpptools`) and `clangd`. - On the first start, you'll be prompted to install recommended plugins. We highly recommend installing them for the best development experience. _You can find a list of them in `.vscode/extensions.json`._ -- Basic build tasks are invoked in the Ctrl+Shift+B menu. +- Basic build tasks are invoked in the Ctrl + Shift + B menu. - Debugging requires a supported probe. That includes: - Wi-Fi devboard with stock firmware (blackmagic). - ST-Link and compatible devices. - - J-Link for flashing and debugging (in VSCode only). _Note that J-Link tools are not included with our toolchain and you have to [download](https://www.segger.com/downloads/jlink/) them yourself and put them on your system's PATH._ + - J-Link for flashing and debugging (in VSCode only). _Note that J-Link tools are not included with our toolchain and you have to [download](https://www.segger.com/downloads/jlink/) them yourself and put them on your system's `PATH`. - Without a supported probe, you can install firmware on Flipper using the USB installation method. ## FBT targets @@ -68,7 +91,7 @@ To use language servers other than the default VS Code C/C++ language server, us - `copro_dist` - bundle Core2 FUS+stack binaries for qFlipper. - `flash` - flash the attached device over SWD interface with supported probes. Probe is detected automatically; you can override it with `SWD_TRANSPORT=...` variable. If multiple probes are attached, you can specify the serial number of the probe to use with `SWD_TRANSPORT_SERIAL=...`. - `flash_usb`, `flash_usb_full` - build, upload and install the update package to the device over USB. See details on `updater_package` and `updater_minpackage`. -- `debug` - build and flash firmware, then attach with gdb with firmware's .elf loaded. +- `debug` - build and flash firmware, then attach with gdb with firmware's `.elf` loaded. - `debug_other`, `debug_other_blackmagic` - attach GDB without loading any `.elf`. It will allow you to manually add external `.elf` files with `add-symbol-file` in GDB. - `updater_debug` - attach GDB with the updater's `.elf` loaded. - `devboard_flash` - Update WiFi dev board. Supports `ARGS="..."` to pass extra arguments to the update script, e.g. `ARGS="-c dev"`. @@ -76,7 +99,7 @@ To use language servers other than the default VS Code C/C++ language server, us - `openocd` - just start OpenOCD. You can pass extra arguments with `ARGS="..."`. - `get_blackmagic` - output the blackmagic address in the GDB remote format. Useful for IDE integration. - `get_stlink` - output serial numbers for attached STLink probes. Used for specifying an adapter with `SWD_TRANSPORT_SERIAL=...`. -- `lint`, `format` - run clang-format on the C source code to check and reformat it according to the `.clang-format` specs. Supports `ARGS="..."` to pass extra arguments to clang-format. +- `lint`, `format` - run `clang-format` on the C source code to check and reformat it according to the `.clang-format` specs. Supports `ARGS="..."` to pass extra arguments to clang-format. - `lint_py`, `format_py` - run [black](https://black.readthedocs.io/en/stable/index.html) on the Python source code, build system files & application manifests. Supports `ARGS="..."` to pass extra arguments to black. - `firmware_pvs` - generate a PVS Studio report for the firmware. Requires PVS Studio to be available on your system's `PATH`. - `doxygen` - generate Doxygen documentation for the firmware. `doxy` target also opens web browser to view the generated documentation. @@ -115,6 +138,7 @@ To use language servers other than the default VS Code C/C++ language server, us ## Configuration Default configuration variables are set in the configuration file: `fbt_options.py`. + Values set in the command line have higher precedence over the configuration file. You can also create a file called `fbt_options_local.py` that will be evaluated when loading default options file, enabling persisent overriding of default options without modifying default configuration. @@ -123,7 +147,12 @@ You can find out available options with `./fbt -h`. ### Firmware application set -You can create customized firmware builds by modifying the list of applications to be included in the build. Application presets are configured with the `FIRMWARE_APPS` option, which is a `map(configuration_name:str -> application_list:tuple(str))`. To specify an application set to use in the build, set `FIRMWARE_APP_SET` to its name. +You can create customized firmware builds by modifying the list of applications to be included in the build. + +Application presets are configured with the `FIRMWARE_APPS` option, which is a `map(configuration_name:str -> application_list:tuple(str))`. + +To specify an application set to use in the build, set `FIRMWARE_APP_SET` to its name. + For example, to build a firmware image with unit tests, run `./fbt FIRMWARE_APP_SET=unit_tests`. Check out `fbt_options.py` for details. From f8b0eab063780ca2538ad930591c3e5fb1f967c5 Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Sat, 27 Jul 2024 00:57:58 +0900 Subject: [PATCH 13/52] Debug: update QueueTools.py availabe -> available --- scripts/debug/FreeRTOS/FreeRTOSgdb/QueueTools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/debug/FreeRTOS/FreeRTOSgdb/QueueTools.py b/scripts/debug/FreeRTOS/FreeRTOSgdb/QueueTools.py index a35f0894f1..4984d2a06a 100644 --- a/scripts/debug/FreeRTOS/FreeRTOSgdb/QueueTools.py +++ b/scripts/debug/FreeRTOS/FreeRTOSgdb/QueueTools.py @@ -102,7 +102,7 @@ def GetQueueType(self): except Exception as exc: # If the TRACE functionality of the RTOS is not enabled, - # then the queue type will not be availabe in the queue + # then the queue type will not be available in the queue # handle - so we return None print("Failed to get Type: %s" % str(exc)) return None From 173ecc800e0ba4dc7c418e8ec108d90c462885b4 Mon Sep 17 00:00:00 2001 From: Leonid Meleshin Date: Sun, 28 Jul 2024 01:57:39 +0400 Subject: [PATCH 14/52] Remove unused entries from .editorconfig (#3811) --- .editorconfig | 3 --- 1 file changed, 3 deletions(-) diff --git a/.editorconfig b/.editorconfig index a31ef8e753..1fdc58bc6f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,6 +8,3 @@ charset = utf-8 [*.{cpp,h,c,py,sh}] indent_style = space indent_size = 4 - -[{Makefile,*.mk}] -indent_size = tab From 0223c23cfbaf0f6fdc4a42d8511a5a78ec9d22f4 Mon Sep 17 00:00:00 2001 From: Jan Wiesemann Date: Sun, 28 Jul 2024 00:03:35 +0200 Subject: [PATCH 15/52] Reordered VS-Code Tasks to follow the [Release] > [Debug] schema (#3810) Co-authored-by: hedger --- .vscode/example/tasks.json | 46 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/.vscode/example/tasks.json b/.vscode/example/tasks.json index 1bc6d9ee75..aab2994f77 100644 --- a/.vscode/example/tasks.json +++ b/.vscode/example/tasks.json @@ -63,12 +63,6 @@ "type": "shell", "command": "./fbt updater_all" }, - { - "label": "[Debug] Flash (USB, w/o resources)", - "group": "build", - "type": "shell", - "command": "./fbt FORCE=1 flash_usb" - }, { "label": "[Release] Flash (USB, w/o resources)", "group": "build", @@ -76,16 +70,16 @@ "command": "./fbt COMPACT=1 DEBUG=0 FORCE=1 flash_usb" }, { - "label": "[Debug:unit_tests] Flash (USB)", + "label": "[Debug] Flash (USB, w/o resources)", "group": "build", "type": "shell", - "command": "./fbt FIRMWARE_APP_SET=unit_tests FORCE=1 flash_usb_full" + "command": "./fbt FORCE=1 flash_usb" }, { - "label": "[Debug] Flash (USB, with resources)", + "label": "[Debug:unit_tests] Flash (USB)", "group": "build", "type": "shell", - "command": "./fbt FORCE=1 flash_usb_full" + "command": "./fbt FIRMWARE_APP_SET=unit_tests FORCE=1 flash_usb_full" }, { "label": "[Release] Flash (USB, with resources)", @@ -94,16 +88,16 @@ "command": "./fbt COMPACT=1 DEBUG=0 FORCE=1 flash_usb_full" }, { - "label": "[Debug] Create PVS-Studio report", + "label": "[Debug] Flash (USB, with resources)", "group": "build", "type": "shell", - "command": "./fbt firmware_pvs" + "command": "./fbt FORCE=1 flash_usb_full" }, { - "label": "[Debug] Build FAPs", + "label": "[Debug] Create PVS-Studio report", "group": "build", "type": "shell", - "command": "./fbt fap_dist" + "command": "./fbt firmware_pvs" }, { "label": "[Release] Build FAPs", @@ -112,10 +106,10 @@ "command": "./fbt COMPACT=1 DEBUG=0 fap_dist" }, { - "label": "[Debug] Build App", + "label": "[Debug] Build FAPs", "group": "build", "type": "shell", - "command": "./fbt build APPSRC=${relativeFileDirname}" + "command": "./fbt fap_dist" }, { "label": "[Release] Build App", @@ -124,10 +118,10 @@ "command": "./fbt COMPACT=1 DEBUG=0 build APPSRC=${relativeFileDirname}" }, { - "label": "[Debug] Launch App on Flipper", + "label": "[Debug] Build App", "group": "build", "type": "shell", - "command": "./fbt launch APPSRC=${relativeFileDirname}" + "command": "./fbt build APPSRC=${relativeFileDirname}" }, { "label": "[Release] Launch App on Flipper", @@ -135,6 +129,12 @@ "type": "shell", "command": "./fbt COMPACT=1 DEBUG=0 launch APPSRC=${relativeFileDirname}" }, + { + "label": "[Debug] Launch App on Flipper", + "group": "build", + "type": "shell", + "command": "./fbt launch APPSRC=${relativeFileDirname}" + }, { "label": "[Debug] Launch App on Flipper with Serial Console", "dependsOrder": "sequence", @@ -145,16 +145,16 @@ ] }, { - "label": "[Debug] Build and upload all FAPs to Flipper over USB", + "label": "[Release] Build and upload all FAPs to Flipper over USB", "group": "build", "type": "shell", - "command": "./fbt fap_deploy" + "command": "./fbt COMPACT=1 DEBUG=0 fap_deploy" }, { - "label": "[Release] Build and upload all FAPs to Flipper over USB", + "label": "[Debug] Build and upload all FAPs to Flipper over USB", "group": "build", "type": "shell", - "command": "./fbt COMPACT=1 DEBUG=0 fap_deploy" + "command": "./fbt fap_deploy" }, { // Press Ctrl+] to quit @@ -180,4 +180,4 @@ } } ] -} \ No newline at end of file +} From 30c2676d60ec6d55f61e7d1d05d1c07a72152c2e Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 28 Jul 2024 19:46:35 +0300 Subject: [PATCH 16/52] subghz fix crash and wrong states --- .../main/subghz/scenes/subghz_scene_frequency_analyzer.c | 5 +++-- applications/main/subghz/scenes/subghz_scene_receiver.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_frequency_analyzer.c b/applications/main/subghz/scenes/subghz_scene_frequency_analyzer.c index 2a0b5e498a..9e5289c548 100644 --- a/applications/main/subghz/scenes/subghz_scene_frequency_analyzer.c +++ b/applications/main/subghz/scenes/subghz_scene_frequency_analyzer.c @@ -69,8 +69,9 @@ bool subghz_scene_frequency_analyzer_on_event(void* context, SceneManagerEvent e return true; } else if(event.event == SubGhzCustomEventViewFreqAnalOkLong) { - // Don't need to save, we already saved on short event - //scene_manager_set_scene_state(subghz->scene_manager, SubGhzSceneStart, 10); + // Don't need to save, we already saved on short event (and on exit event too) + subghz_rx_key_state_set(subghz, SubGhzRxKeyStateIDLE); + scene_manager_set_scene_state(subghz->scene_manager, SubGhzSceneStart, 10); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiver); return true; } diff --git a/applications/main/subghz/scenes/subghz_scene_receiver.c b/applications/main/subghz/scenes/subghz_scene_receiver.c index 01b46d2486..1a00634180 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver.c @@ -146,11 +146,11 @@ static void subghz_scene_add_to_history_callback( if(subghz_history_get_text_space_left(subghz->history, NULL)) { notification_message(subghz->notifications, &sequence_error); } + subghz_rx_key_state_set(subghz, SubGhzRxKeyStateAddKey); } subghz_receiver_reset(receiver); furi_string_free(item_name); furi_string_free(item_time); - subghz_rx_key_state_set(subghz, SubGhzRxKeyStateAddKey); } else { FURI_LOG_D(TAG, "%s protocol ignored", decoder_base->protocol->name); } From b2305ce5c7a6ab36babc30243a589eccfa9edcb6 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 28 Jul 2024 19:55:18 +0300 Subject: [PATCH 17/52] upd changelog --- CHANGELOG.md | 63 +++++----------------------------------------------- 1 file changed, 6 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 777f87c7a6..ddb64ba574 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,64 +1,13 @@ ## Main changes - SubGHz: - - **Novoferm** remotes full support - - Fix Decode scene in RAW files - - Add manually -> Add Sommer FM238 option for cases when default option doesn't work (named as Sommer fm2) - - Remove broken preset modulation - - Normstahl, Sommer, MHouse, Aprimatic -> Fixes for button codes and more in Add manually - - Custom button improvements for MHouse, Novoferm, Nice Smilo - - Hormann EcoStar -> Add manually support, and custom button support - - Hormann HSM 44bit static -> Button code decoding fix - - Choose RSSI threshold for Hopping mode (by @Willy-JL) -- NFC: - - OFW: Ultralight C authentication with des key - - EMV Transactions less nested, hide if unavailable (by @Willy-JL | PR #771) - - Update Mifare Classic default keys dict with new keys from proxmark3 repo and UberGuidoZ repo -- LF RFID: - - Update T5577 password list (by @korden32 | PR #774) - - Add DEZ 8 display form for EM4100 (by @korden32 | PR #776 & (#777 by @mishamyte)) -- JS: - - Refactor widget and keyboard modules, fix crash (by @Willy-JL | PR #770) - - SubGHz module fixes and improvements (by @Willy-JL) -* OFW: Infrared: check for negative timings -* OFW: Fix iButton/LFRFID Add Manually results being discarded -* OFW: Event Loop Timers -* OFW: Updater: resource compression + - Fix rare crash when opening Read mode via Frequency analyzer + - Refactor frequency analyzer code for better readability (by @derskythe | PR #782) +* Docs: Remove not printable symbols and update docs (by @derskythe | PR #783) * Apps: **Check out more Apps updates and fixes by following** [this link](https://github.com/xMasterX/all-the-plugins/commits/dev) ## Other changes -* OFW: HID/BLE Keyboard UI refactoring -* OFW: CCID: Add CCIDWorker -* OFW: Disabled ISR runtime stats collection for updater builds -* OFW: VSCode fixes: .gitignore & clangd -* OFW: ufbt: synced .clang-format rules with main -* OFW: Code formatting update -* OFW: scripts: runfap: fixed starting apps with spaces in path -* OFW: toolchain: v38. clangd as default language server -* OFW: NFC: ISO15693 Render Typo Fix -* OFW: tar archive: fix double free -* OFW: ufbt: added ARGS to commandline parser -* OFW: lib: sconscript todo cleanup -* OFW: Intruder animation -* OFW: Desktop: allow to close blocking bad sd animation -* OFW: Updater: reset various debug flags on production build flash (was done in same way in UL before) -* OFW: Fix PVS Warnings -* OFW: CCID: Improve request and response data handling -* OFW: Furi: count ISR time. Cli: show ISR time in top. -* OFW: toolchain: v37 -* OFW: NFC: Cache plugin name not full path, saves some RAM (by @Willy-JL) -* OFW: copro: bumped to 1.20.0 -* OFW: input_srv: Put input state data on the stack of the service -* OFW: Coalesce some allocations -* OFW: updater: slightly smaller image -* OFW: Updater: Fix double dir cleanup -* OFW: cli: storage: minor subcommand lookup refactor -* OFW: LFRFID Securakey: Add Support for RKKTH Plain Text Format -* OFW: NFC: Add mf_classic_set_sector_trailer_read function -* OFW: Separate editing and renaming in iButton and LFRFID -* OFW: New js modules documentation added -* OFW: Update link to mfkey32 -* OFW: NFC: Desfire Renderer Minor Debug -* OFW: RPC: Fix input lockup on disconnect -* OFW: Thread Signals +* Misc: Fix typo in comment in QueueTools.py (by @eltociear | PR #785) +* OFW: Reordered VS-Code Tasks to follow the `Release` > `Debug` schema +* OFW: Remove unused entries from .editorconfig

    #### Known NFC post-refactor regressions list: - Mifare Mini clones reading is broken (original mini working fine) (OFW) From a403e5f543a5423e39ac1700ae4711e9e489445e Mon Sep 17 00:00:00 2001 From: Liam Hays Date: Sun, 28 Jul 2024 14:21:56 -0600 Subject: [PATCH 18/52] Fix typo in "charge me" screen. (#3812) --- applications/services/power/power_service/views/power_off.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/services/power/power_service/views/power_off.c b/applications/services/power/power_service/views/power_off.c index 4da374b31a..dbc233dde5 100644 --- a/applications/services/power/power_service/views/power_off.c +++ b/applications/services/power/power_service/views/power_off.c @@ -33,7 +33,7 @@ static void power_off_draw_callback(Canvas* canvas, void* _model) { elements_button_center(canvas, "OK"); elements_button_right(canvas, "Hide"); } else { - snprintf(buff, sizeof(buff), "Charge me!\nDont't forget!"); + snprintf(buff, sizeof(buff), "Charge me!\nDon't forget!"); elements_multiline_text_aligned(canvas, 70, 23, AlignLeft, AlignTop, buff); canvas_draw_str_aligned(canvas, 64, 60, AlignCenter, AlignBottom, "Hold a second..."); From 360005c1d56a223aaa81388a696f3a47e9b65d51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Mon, 29 Jul 2024 22:06:08 +0900 Subject: [PATCH 19/52] Furi: update string documentation (#3803) Co-authored-by: hedger --- furi/core/string.h | 714 +++++++++++++++++++++++---------------------- 1 file changed, 371 insertions(+), 343 deletions(-) diff --git a/furi/core/string.h b/furi/core/string.h index bcdf9336c7..2bfb60e496 100644 --- a/furi/core/string.h +++ b/furi/core/string.h @@ -1,7 +1,10 @@ -/** +/** Furi string container + * + * And various method to manipulate strings + * * @file string.h - * Furi string primitive */ + #pragma once #include @@ -14,66 +17,72 @@ extern "C" { #endif -/** - * @brief Furi string failure constant. - */ +/** Furi string failure constant. */ #define FURI_STRING_FAILURE ((size_t) - 1) -/** - * @brief Furi string primitive. - */ +/** Furi string primitive. */ typedef struct FuriString FuriString; //--------------------------------------------------------------------------- // Constructors //--------------------------------------------------------------------------- -/** - * @brief Allocate new FuriString. - * @return FuriString* +/** Allocate new FuriString. + * + * @return pointer to the instance of FuriString */ FuriString* furi_string_alloc(void); -/** - * @brief Allocate new FuriString and set it to string. +/** Allocate new FuriString and set it to string. + * * Allocate & Set the string a to the string. - * @param source - * @return FuriString* + * + * @param source The source FuriString instance + * + * @return pointer to the new instance of FuriString */ FuriString* furi_string_alloc_set(const FuriString* source); -/** - * @brief Allocate new FuriString and set it to C string. +/** Allocate new FuriString and set it to C string. + * * Allocate & Set the string a to the C string. - * @param cstr_source - * @return FuriString* + * + * @param cstr_source The C-string instance + * + * @return pointer to the new instance of FuriString */ FuriString* furi_string_alloc_set_str(const char cstr_source[]); -/** - * @brief Allocate new FuriString and printf to it. +/** Allocate new FuriString and printf to it. + * * Initialize and set a string to the given formatted value. - * @param format - * @param ... - * @return FuriString* + * + * @param format The printf format + * @param[in] ... args to format + * + * @return pointer to the new instance of FuriString */ FuriString* furi_string_alloc_printf(const char format[], ...) _ATTRIBUTE((__format__(__printf__, 1, 2))); -/** - * @brief Allocate new FuriString and printf to it. +/** Allocate new FuriString and printf to it. + * * Initialize and set a string to the given formatted value. - * @param format - * @param args - * @return FuriString* + * + * @param format The printf format + * @param args The format arguments + * + * @return pointer to the new instance of FuriString */ FuriString* furi_string_alloc_vprintf(const char format[], va_list args); -/** - * @brief Allocate new FuriString and move source string content to it. +/** Allocate new FuriString and move source string content to it. + * * Allocate the string, set it to the other one, and destroy the other one. - * @param source - * @return FuriString* + * + * @param source The source FuriString instance + * + * @return pointer to the new instance of FuriString */ FuriString* furi_string_alloc_move(FuriString* source); @@ -81,9 +90,9 @@ FuriString* furi_string_alloc_move(FuriString* source); // Destructors //--------------------------------------------------------------------------- -/** - * @brief Free FuriString. - * @param string +/** Free FuriString. + * + * @param string The FuriString instance to free */ void furi_string_free(FuriString* string); @@ -91,55 +100,63 @@ void furi_string_free(FuriString* string); // String memory management //--------------------------------------------------------------------------- -/** - * @brief Reserve memory for string. - * Modify the string capacity to be able to handle at least 'alloc' characters (including final null char). - * @param string - * @param size +/** Reserve memory for string. + * + * Modify the string capacity to be able to handle at least 'alloc' characters + * (including final null char). + * + * @param string The FuriString instance + * @param size The size to reserve */ void furi_string_reserve(FuriString* string, size_t size); -/** - * @brief Reset string. +/** Reset string. + * * Make the string empty. - * @param string + * + * @param string The FuriString instance */ void furi_string_reset(FuriString* string); -/** - * @brief Swap two strings. +/** Swap two strings. + * * Swap the two strings string_1 and string_2. - * @param string_1 - * @param string_2 + * + * @param string_1 The FuriString instance 1 + * @param string_2 The FuriString instance 2 */ void furi_string_swap(FuriString* string_1, FuriString* string_2); -/** - * @brief Move string_2 content to string_1. +/** Move string_2 content to string_1. + * * Set the string to the other one, and destroy the other one. - * @param string_1 - * @param string_2 + * + * @param string_1 The FuriString instance 1 + * @param string_2 The FuriString instance 2 */ void furi_string_move(FuriString* string_1, FuriString* string_2); -/** - * @brief Compute a hash for the string. - * @param string - * @return size_t +/** Compute a hash for the string. + * + * @param string The FuriString instance + * + * @return hash value */ size_t furi_string_hash(const FuriString* string); -/** - * @brief Get string size (usually length, but not for UTF-8) - * @param string - * @return size_t +/** Get string size (usually length, but not for UTF-8) + * + * @param string The FuriString instance + * + * @return size of the string */ size_t furi_string_size(const FuriString* string); -/** - * @brief Check that string is empty or not - * @param string - * @return bool +/** Check that string is empty or not + * + * @param string The FuriString instance + * + * @return true if empty otherwise false */ bool furi_string_empty(const FuriString* string); @@ -147,19 +164,22 @@ bool furi_string_empty(const FuriString* string); // Getters //--------------------------------------------------------------------------- -/** - * @brief Get the character at the given index. +/** Get the character at the given index. + * * Return the selected character of the string. - * @param string - * @param index - * @return char + * + * @param string The FuriString instance + * @param index The index + * + * @return character at index */ char furi_string_get_char(const FuriString* string, size_t index); -/** - * @brief Return the string view a classic C string. - * @param string - * @return const char* +/** Return the string view a classic C string. + * + * @param string The FuriString instance + * + * @return const C-string, usable till first container change */ const char* furi_string_get_cstr(const FuriString* string); @@ -167,63 +187,67 @@ const char* furi_string_get_cstr(const FuriString* string); // Setters //--------------------------------------------------------------------------- -/** - * @brief Set the string to the other string. +/** Set the string to the other string. + * * Set the string to the source string. - * @param string - * @param source + * + * @param string The FuriString instance + * @param source The source */ void furi_string_set(FuriString* string, FuriString* source); -/** - * @brief Set the string to the other C string. +/** Set the string to the other C string. + * * Set the string to the source C string. - * @param string - * @param source + * + * @param string The FuriString instance + * @param source The source */ void furi_string_set_str(FuriString* string, const char source[]); -/** - * @brief Set the string to the n first characters of the C string. - * @param string - * @param source - * @param length +/** Set the string to the n first characters of the C string. + * + * @param string The FuriString instance + * @param source The source + * @param length The length */ void furi_string_set_strn(FuriString* string, const char source[], size_t length); -/** - * @brief Set the character at the given index. - * @param string - * @param index - * @param c +/** Set the character at the given index. + * + * @param string The FuriString instance + * @param index The index + * @param c The character */ void furi_string_set_char(FuriString* string, size_t index, const char c); -/** - * @brief Set the string to the n first characters of other one. - * @param string - * @param source - * @param offset - * @param length +/** Set the string to the n first characters of other one. + * + * @param string The FuriString instance + * @param source The source + * @param offset The offset + * @param length The length */ void furi_string_set_n(FuriString* string, const FuriString* source, size_t offset, size_t length); -/** - * @brief Format in the string the given printf format - * @param string - * @param format - * @param ... - * @return int +/** Format in the string the given printf format + * + * @param string The string + * @param format The format + * @param[in] ... The args + * + * @return number of characters printed or negative value on error */ int furi_string_printf(FuriString* string, const char format[], ...) _ATTRIBUTE((__format__(__printf__, 2, 3))); -/** - * @brief Format in the string the given printf format - * @param string - * @param format - * @param args - * @return int +/** Format in the string the given printf format + * + * @param string The FuriString instance + * @param format The format + * @param args The arguments + * + * @return number of characters printed or negative value on error */ int furi_string_vprintf(FuriString* string, const char format[], va_list args); @@ -231,45 +255,49 @@ int furi_string_vprintf(FuriString* string, const char format[], va_list args); // Appending //--------------------------------------------------------------------------- -/** - * @brief Append a character to the string. - * @param string - * @param c +/** Append a character to the string. + * + * @param string The FuriString instance + * @param c The character */ void furi_string_push_back(FuriString* string, char c); -/** - * @brief Append a string to the string. +/** Append a string to the string. + * * Concatenate the string with the other string. - * @param string_1 - * @param string_2 + * + * @param string_1 The string 1 + * @param string_2 The string 2 */ void furi_string_cat(FuriString* string_1, const FuriString* string_2); -/** - * @brief Append a C string to the string. +/** Append a C string to the string. + * * Concatenate the string with the C string. - * @param string_1 - * @param cstring_2 + * + * @param string_1 The string 1 + * @param cstring_2 The cstring 2 */ void furi_string_cat_str(FuriString* string_1, const char cstring_2[]); -/** - * @brief Append to the string the formatted string of the given printf format. - * @param string - * @param format - * @param ... - * @return int +/** Append to the string the formatted string of the given printf format. + * + * @param string The string + * @param format The format + * @param[in] ... The args + * + * @return number of characters printed or negative value on error */ int furi_string_cat_printf(FuriString* string, const char format[], ...) _ATTRIBUTE((__format__(__printf__, 2, 3))); -/** - * @brief Append to the string the formatted string of the given printf format. - * @param string - * @param format - * @param args - * @return int +/** Append to the string the formatted string of the given printf format. + * + * @param string The FuriString instance + * @param format The format + * @param args The arguments + * + * @return number of characters printed or negative value on error */ int furi_string_cat_vprintf(FuriString* string, const char format[], va_list args); @@ -277,37 +305,45 @@ int furi_string_cat_vprintf(FuriString* string, const char format[], va_list arg // Comparators //--------------------------------------------------------------------------- -/** - * @brief Compare two strings and return the sort order. - * @param string_1 - * @param string_2 - * @return int +/** Compare two strings and return the sort order. + * + * @param string_1 The string 1 + * @param string_2 The string 2 + * + * @return zero if equal */ int furi_string_cmp(const FuriString* string_1, const FuriString* string_2); -/** - * @brief Compare string with C string and return the sort order. - * @param string_1 - * @param cstring_2 - * @return int +/** Compare string with C string and return the sort order. + * + * @param string_1 The string 1 + * @param cstring_2 The cstring 2 + * + * @return zero if equal */ int furi_string_cmp_str(const FuriString* string_1, const char cstring_2[]); -/** - * @brief Compare two strings (case insensitive according to the current locale) and return the sort order. +/** Compare two strings (case insensitive according to the current locale) and + * return the sort order. + * * Note: doesn't work with UTF-8 strings. - * @param string_1 - * @param string_2 - * @return int + * + * @param string_1 The string 1 + * @param string_2 The string 2 + * + * @return zero if equal */ int furi_string_cmpi(const FuriString* string_1, const FuriString* string_2); -/** - * @brief Compare string with C string (case insensitive according to the current locale) and return the sort order. +/** Compare string with C string (case insensitive according to the current + * locale) and return the sort order. + * * Note: doesn't work with UTF-8 strings. - * @param string_1 - * @param cstring_2 - * @return int + * + * @param string_1 The string 1 + * @param cstring_2 The cstring 2 + * + * @return zero if equal */ int furi_string_cmpi_str(const FuriString* string_1, const char cstring_2[]); @@ -315,46 +351,47 @@ int furi_string_cmpi_str(const FuriString* string_1, const char cstring_2[]); // Search //--------------------------------------------------------------------------- -/** - * @brief Search the first occurrence of the needle in the string from the position start. - * Return STRING_FAILURE if not found. - * By default, start is zero. - * @param string - * @param needle - * @param start - * @return size_t +/** Search the first occurrence of the needle in the string from the position + * start. + * + * @param string The FuriString instance + * @param needle The needle + * @param start The start (By default, start is zero) + * + * @return position or FURI_STRING_FAILURE if not found */ size_t furi_string_search(const FuriString* string, const FuriString* needle, size_t start); -/** - * @brief Search the first occurrence of the needle in the string from the position start. - * Return STRING_FAILURE if not found. - * @param string - * @param needle - * @param start - * @return size_t +/** Search the first occurrence of the needle in the string from the position + * start. + * + * @param string The FuriString instance + * @param needle The needle + * @param start The start (By default, start is zero) + * + * @return position or FURI_STRING_FAILURE if not found */ size_t furi_string_search_str(const FuriString* string, const char needle[], size_t start); -/** - * @brief Search for the position of the character c from the position start (include) in the string. - * Return STRING_FAILURE if not found. - * By default, start is zero. - * @param string - * @param c - * @param start - * @return size_t +/** Search for the position of the character c from the position start (include) + * in the string. + * + * @param string The FuriString instance + * @param c The character + * @param start The start (By default, start is zero) + * + * @return position or FURI_STRING_FAILURE if not found */ size_t furi_string_search_char(const FuriString* string, char c, size_t start); -/** - * @brief Reverse search for the position of the character c from the position start (include) in the string. - * Return STRING_FAILURE if not found. - * By default, start is zero. - * @param string - * @param c - * @param start - * @return size_t +/** Reverse search for the position of the character c from the position start + * (include) in the string. + * + * @param string The FuriString instance + * @param c The character + * @param start The start (By default, start is zero) + * + * @return position or FURI_STRING_FAILURE if not found */ size_t furi_string_search_rchar(const FuriString* string, char c, size_t start); @@ -362,19 +399,21 @@ size_t furi_string_search_rchar(const FuriString* string, char c, size_t start); // Equality //--------------------------------------------------------------------------- -/** - * @brief Test if two strings are equal. - * @param string_1 - * @param string_2 - * @return bool +/** Test if two strings are equal. + * + * @param string_1 The string 1 + * @param string_2 The string 2 + * + * @return true if equal false otherwise */ bool furi_string_equal(const FuriString* string_1, const FuriString* string_2); -/** - * @brief Test if the string is equal to the C string. - * @param string_1 - * @param cstring_2 - * @return bool +/** Test if the string is equal to the C string. + * + * @param string_1 The string 1 + * @param cstring_2 The cstring 2 + * + * @return true if equal false otherwise */ bool furi_string_equal_str(const FuriString* string_1, const char cstring_2[]); @@ -382,37 +421,38 @@ bool furi_string_equal_str(const FuriString* string_1, const char cstring_2[]); // Replace //--------------------------------------------------------------------------- -/** - * @brief Replace in the string the sub-string at position 'pos' for 'len' bytes into the C string 'replace'. - * @param string - * @param pos - * @param len - * @param replace +/** Replace in the string the sub-string at position 'pos' for 'len' bytes into + * the C string 'replace'. + * + * @param string The string + * @param pos The position + * @param len The length + * @param replace The replace */ void furi_string_replace_at(FuriString* string, size_t pos, size_t len, const char replace[]); -/** - * @brief Replace a string 'needle' to string 'replace' in a string from 'start' position. - * By default, start is zero. - * Return STRING_FAILURE if 'needle' not found or replace position. - * @param string - * @param needle - * @param replace - * @param start - * @return size_t +/** Replace a string 'needle' to string 'replace' in a string from 'start' + * position. + * + * @param string The string + * @param needle The needle + * @param replace The replace + * @param start The start (By default, start is zero) + * + * @return Return FURI_STRING_FAILURE if 'needle' not found or replace position. */ size_t furi_string_replace(FuriString* string, FuriString* needle, FuriString* replace, size_t start); -/** - * @brief Replace a C string 'needle' to C string 'replace' in a string from 'start' position. - * By default, start is zero. - * Return STRING_FAILURE if 'needle' not found or replace position. - * @param string - * @param needle - * @param replace - * @param start - * @return size_t +/** Replace a C string 'needle' to C string 'replace' in a string from 'start' + * position. + * + * @param string The string + * @param needle The needle + * @param replace The replace + * @param start The start (By default, start is zero) + * + * @return Return FURI_STRING_FAILURE if 'needle' not found or replace position. */ size_t furi_string_replace_str( FuriString* string, @@ -420,22 +460,22 @@ size_t furi_string_replace_str( const char replace[], size_t start); -/** - * @brief Replace all occurrences of 'needle' string into 'replace' string. - * @param string - * @param needle - * @param replace +/** Replace all occurrences of 'needle' string into 'replace' string. + * + * @param string The string + * @param needle The needle + * @param replace The replace */ void furi_string_replace_all( FuriString* string, const FuriString* needle, const FuriString* replace); -/** - * @brief Replace all occurrences of 'needle' C string into 'replace' C string. - * @param string - * @param needle - * @param replace +/** Replace all occurrences of 'needle' C string into 'replace' C string. + * + * @param string The string + * @param needle The needle + * @param replace The replace */ void furi_string_replace_all_str(FuriString* string, const char needle[], const char replace[]); @@ -443,35 +483,39 @@ void furi_string_replace_all_str(FuriString* string, const char needle[], const // Start / End tests //--------------------------------------------------------------------------- -/** - * @brief Test if the string starts with the given string. - * @param string - * @param start - * @return bool +/** Test if the string starts with the given string. + * + * @param string The FuriString instance + * @param start The FuriString instance + * + * @return true if string starts with */ bool furi_string_start_with(const FuriString* string, const FuriString* start); -/** - * @brief Test if the string starts with the given C string. - * @param string - * @param start - * @return bool +/** Test if the string starts with the given C string. + * + * @param string The FuriString instance + * @param start The start + * + * @return true if string starts with */ bool furi_string_start_with_str(const FuriString* string, const char start[]); -/** - * @brief Test if the string ends with the given string. - * @param string - * @param end - * @return bool +/** Test if the string ends with the given string. + * + * @param string The FuriString instance + * @param end The end + * + * @return true if string ends with */ bool furi_string_end_with(const FuriString* string, const FuriString* end); -/** - * @brief Test if the string ends with the given C string. - * @param string - * @param end - * @return bool +/** Test if the string ends with the given C string. + * + * @param string The FuriString instance + * @param end The end + * + * @return true if string ends with */ bool furi_string_end_with_str(const FuriString* string, const char end[]); @@ -479,33 +523,34 @@ bool furi_string_end_with_str(const FuriString* string, const char end[]); // Trim //--------------------------------------------------------------------------- -/** - * @brief Trim the string left to the first 'index' bytes. - * @param string - * @param index +/** Trim the string left to the first 'index' bytes. + * + * @param string The FuriString instance + * @param index The index */ void furi_string_left(FuriString* string, size_t index); -/** - * @brief Trim the string right from the 'index' position to the last position. - * @param string - * @param index +/** Trim the string right from the 'index' position to the last position. + * + * @param string The FuriString instance + * @param index The index */ void furi_string_right(FuriString* string, size_t index); -/** - * @brief Trim the string from position index to size bytes. +/** Trim the string from position index to size bytes. + * * See also furi_string_set_n. - * @param string - * @param index - * @param size + * + * @param string The FuriString instance + * @param index The index + * @param size The size */ void furi_string_mid(FuriString* string, size_t index, size_t size); -/** - * @brief Trim a string from the given set of characters (default is " \n\r\t"). - * @param string - * @param chars +/** Trim a string from the given set of characters (default is " \n\r\t"). + * + * @param string The FuriString instance + * @param chars The characters */ void furi_string_trim(FuriString* string, const char chars[]); @@ -513,28 +558,25 @@ void furi_string_trim(FuriString* string, const char chars[]); // UTF8 //--------------------------------------------------------------------------- -/** - * @brief An unicode value. - */ +/** An unicode value */ typedef unsigned int FuriStringUnicodeValue; -/** - * @brief Compute the length in UTF8 characters in the string. - * @param string - * @return size_t +/** Compute the length in UTF8 characters in the string. + * + * @param string The FuriString instance + * + * @return strings size */ size_t furi_string_utf8_length(FuriString* string); -/** - * @brief Push unicode into string, encoding it in UTF8. - * @param string - * @param unicode +/** Push unicode into string, encoding it in UTF8. + * + * @param string The string + * @param unicode The unicode */ void furi_string_utf8_push(FuriString* string, FuriStringUnicodeValue unicode); -/** - * @brief State of the UTF8 decoding machine state. - */ +/** State of the UTF8 decoding machine state */ typedef enum { FuriStringUTF8StateStarting, FuriStringUTF8StateDecoding1, @@ -543,14 +585,16 @@ typedef enum { FuriStringUTF8StateError } FuriStringUTF8State; -/** - * @brief Main generic UTF8 decoder. - * It takes a character, and the previous state and the previous value of the unicode value. - * It updates the state and the decoded unicode value. - * A decoded unicode encoded value is valid only when the state is FuriStringUTF8StateStarting. - * @param c - * @param state - * @param unicode +/** Main generic UTF8 decoder + * + * It takes a character, and the previous state and the previous value of the + * unicode value. It updates the state and the decoded unicode value. A decoded + * unicode encoded value is valid only when the state is + * FuriStringUTF8StateStarting. + * + * @param c The character + * @param state The state + * @param unicode The unicode */ void furi_string_utf8_decode(char c, FuriStringUTF8State* state, FuriStringUnicodeValue* unicode); @@ -565,76 +609,68 @@ void furi_string_utf8_decode(char c, FuriStringUTF8State* state, FuriStringUnico * func1 is the string function / func2 is the str function. */ -/** - * @brief Select for 1 argument - */ +/** Select for 1 argument */ #define FURI_STRING_SELECT1(func1, func2, a) \ _Generic((a), char*: func2, const char*: func2, FuriString*: func1, const FuriString*: func1)( \ a) -/** - * @brief Select for 2 arguments - */ +/** Select for 2 arguments */ #define FURI_STRING_SELECT2(func1, func2, a, b) \ _Generic((b), char*: func2, const char*: func2, FuriString*: func1, const FuriString*: func1)( \ a, b) -/** - * @brief Select for 3 arguments - */ +/** Select for 3 arguments */ #define FURI_STRING_SELECT3(func1, func2, a, b, c) \ _Generic((b), char*: func2, const char*: func2, FuriString*: func1, const FuriString*: func1)( \ a, b, c) -/** - * @brief Select for 4 arguments - */ +/** Select for 4 arguments */ #define FURI_STRING_SELECT4(func1, func2, a, b, c, d) \ _Generic((b), char*: func2, const char*: func2, FuriString*: func1, const FuriString*: func1)( \ a, b, c, d) -/** - * @brief Allocate new FuriString and set it content to string (or C string). +/** Allocate new FuriString and set it content to string (or C string). + * * ([c]string) */ #define furi_string_alloc_set(a) \ FURI_STRING_SELECT1(furi_string_alloc_set, furi_string_alloc_set_str, a) -/** - * @brief Set the string content to string (or C string). +/** Set the string content to string (or C string). + * * (string, [c]string) */ #define furi_string_set(a, b) FURI_STRING_SELECT2(furi_string_set, furi_string_set_str, a, b) -/** - * @brief Compare string with string (or C string) and return the sort order. +/** Compare string with string (or C string) and return the sort order. + * * Note: doesn't work with UTF-8 strings. * (string, [c]string) */ #define furi_string_cmp(a, b) FURI_STRING_SELECT2(furi_string_cmp, furi_string_cmp_str, a, b) -/** - * @brief Compare string with string (or C string) (case insensitive according to the current locale) and return the sort order. +/** Compare string with string (or C string) (case insensitive according to the current locale) and return the sort order. + * * Note: doesn't work with UTF-8 strings. * (string, [c]string) */ #define furi_string_cmpi(a, b) FURI_STRING_SELECT2(furi_string_cmpi, furi_string_cmpi_str, a, b) -/** - * @brief Test if the string is equal to the string (or C string). +/** Test if the string is equal to the string (or C string). + * * (string, [c]string) */ #define furi_string_equal(a, b) FURI_STRING_SELECT2(furi_string_equal, furi_string_equal_str, a, b) -/** - * @brief Replace all occurrences of string into string (or C string to another C string) in a string. +/** Replace all occurrences of string into string (or C string to another C string) in a string. + * * (string, [c]string, [c]string) */ #define furi_string_replace_all(a, b, c) \ FURI_STRING_SELECT3(furi_string_replace_all, furi_string_replace_all_str, a, b, c) -/** - * @brief Search for a string (or C string) in a string +/** Search for a string (or C string) in a string + * * (string, [c]string[, start=0]) */ #define furi_string_search(...) \ @@ -643,52 +679,52 @@ void furi_string_utf8_decode(char c, FuriStringUTF8State* state, FuriStringUnico furi_string_search, \ furi_string_search_str, \ M_DEFAULT_ARGS(3, (0), __VA_ARGS__)) -/** - * @brief Search for a C string in a string +/** Search for a C string in a string + * * (string, cstring[, start=0]) */ #define furi_string_search_str(...) furi_string_search_str(M_DEFAULT_ARGS(3, (0), __VA_ARGS__)) -/** - * @brief Test if the string starts with the given string (or C string). +/** Test if the string starts with the given string (or C string). + * * (string, [c]string) */ #define furi_string_start_with(a, b) \ FURI_STRING_SELECT2(furi_string_start_with, furi_string_start_with_str, a, b) -/** - * @brief Test if the string ends with the given string (or C string). +/** Test if the string ends with the given string (or C string). + * * (string, [c]string) */ #define furi_string_end_with(a, b) \ FURI_STRING_SELECT2(furi_string_end_with, furi_string_end_with_str, a, b) -/** - * @brief Append a string (or C string) to the string. +/** Append a string (or C string) to the string. + * * (string, [c]string) */ #define furi_string_cat(a, b) FURI_STRING_SELECT2(furi_string_cat, furi_string_cat_str, a, b) -/** - * @brief Trim a string from the given set of characters (default is " \n\r\t"). +/** Trim a string from the given set of characters (default is " \n\r\t"). + * * (string[, set=" \n\r\t"]) */ #define furi_string_trim(...) furi_string_trim(M_DEFAULT_ARGS(2, (" \n\r\t"), __VA_ARGS__)) -/** - * @brief Search for a character in a string. +/** Search for a character in a string. + * * (string, character[, start=0]) */ #define furi_string_search_char(...) furi_string_search_char(M_DEFAULT_ARGS(3, (0), __VA_ARGS__)) -/** - * @brief Reverse Search for a character in a string. +/** Reverse Search for a character in a string. + * * (string, character[, start=0]) */ #define furi_string_search_rchar(...) furi_string_search_rchar(M_DEFAULT_ARGS(3, (0), __VA_ARGS__)) -/** - * @brief Replace a string to another string (or C string to another C string) in a string. +/** Replace a string to another string (or C string to another C string) in a string. + * * (string, [c]string, [c]string[, start=0]) */ #define furi_string_replace(...) \ @@ -698,30 +734,22 @@ void furi_string_utf8_decode(char c, FuriStringUTF8State* state, FuriStringUnico furi_string_replace_str, \ M_DEFAULT_ARGS(4, (0), __VA_ARGS__)) -/** - * @brief Replace a C string to another C string in a string. +/** Replace a C string to another C string in a string. + * * (string, cstring, cstring[, start=0]) */ #define furi_string_replace_str(...) furi_string_replace_str(M_DEFAULT_ARGS(4, (0), __VA_ARGS__)) -/** - * @brief INIT OPLIST for FuriString. - */ +/** INIT OPLIST for FuriString */ #define F_STR_INIT(a) ((a) = furi_string_alloc()) -/** - * @brief INIT SET OPLIST for FuriString. - */ +/** INIT SET OPLIST for FuriString */ #define F_STR_INIT_SET(a, b) ((a) = furi_string_alloc_set(b)) -/** - * @brief INIT MOVE OPLIST for FuriString. - */ +/** INIT MOVE OPLIST for FuriString */ #define F_STR_INIT_MOVE(a, b) ((a) = furi_string_alloc_move(b)) -/** - * @brief OPLIST for FuriString. - */ +/** OPLIST for FuriString */ #define FURI_STRING_OPLIST \ (INIT(F_STR_INIT), \ INIT_SET(F_STR_INIT_SET), \ From afc4e299a1d8e501ac456958678cf9fef0f4e6c3 Mon Sep 17 00:00:00 2001 From: hedger Date: Tue, 30 Jul 2024 05:30:25 +0300 Subject: [PATCH 20/52] toolchain: v39 (#3793) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * toolchain: v39 * vscode, sublime: re-enabled clangd binary from toolchain as language server * Sublime project: update for toolchain v39 Co-authored-by: あく --- .sublime-project | 4 +--- .vscode/example/settings.json.tmpl | 2 +- scripts/toolchain/fbtenv.cmd | 2 +- scripts/toolchain/fbtenv.sh | 2 +- scripts/ufbt/project_template/.vscode/settings.json | 2 +- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.sublime-project b/.sublime-project index da2ef41a12..0ae007b341 100644 --- a/.sublime-project +++ b/.sublime-project @@ -10,10 +10,8 @@ "clangd": { "enabled": true, "initializationOptions": { - // Use with toolchain version 39+ // Set `"binary": "custom",` option in LSP-clangd config to use toolchain clangd - // "custom_command": ["toolchain/current/bin/clangd"], - + "custom_command": ["toolchain/current/bin/clangd"], "clangd.compile-commands-dir": "build/latest", "clangd.header-insertion": "never", "clangd.query-driver": "**/arm-none-eabi-*", diff --git a/.vscode/example/settings.json.tmpl b/.vscode/example/settings.json.tmpl index 5e0da68977..5e5b5dcf41 100644 --- a/.vscode/example/settings.json.tmpl +++ b/.vscode/example/settings.json.tmpl @@ -12,7 +12,7 @@ "SConstruct": "python", "*.fam": "python" }, - // "clangd.path": "${workspaceFolder}/toolchain/current/bin/clangd@FBT_PLATFORM_EXECUTABLE_EXT@", + "clangd.path": "${workspaceFolder}/toolchain/current/bin/clangd@FBT_PLATFORM_EXECUTABLE_EXT@", "clangd.arguments": [ "--query-driver=**/arm-none-eabi-*", "--compile-commands-dir=${workspaceFolder}/build/latest", diff --git a/scripts/toolchain/fbtenv.cmd b/scripts/toolchain/fbtenv.cmd index c0a3cd8700..182ba9bb10 100644 --- a/scripts/toolchain/fbtenv.cmd +++ b/scripts/toolchain/fbtenv.cmd @@ -13,7 +13,7 @@ if not ["%FBT_NOENV%"] == [""] ( exit /b 0 ) -set "FLIPPER_TOOLCHAIN_VERSION=38" +set "FLIPPER_TOOLCHAIN_VERSION=39" if ["%FBT_TOOLCHAIN_PATH%"] == [""] ( set "FBT_TOOLCHAIN_PATH=%FBT_ROOT%" diff --git a/scripts/toolchain/fbtenv.sh b/scripts/toolchain/fbtenv.sh index 156fabcca8..ce92beca75 100755 --- a/scripts/toolchain/fbtenv.sh +++ b/scripts/toolchain/fbtenv.sh @@ -4,7 +4,7 @@ # public variables DEFAULT_SCRIPT_PATH="$(pwd -P)"; -FBT_TOOLCHAIN_VERSION="${FBT_TOOLCHAIN_VERSION:-"38"}"; +FBT_TOOLCHAIN_VERSION="${FBT_TOOLCHAIN_VERSION:-"39"}"; if [ -z ${FBT_TOOLCHAIN_PATH+x} ] ; then FBT_TOOLCHAIN_PATH_WAS_SET=0; diff --git a/scripts/ufbt/project_template/.vscode/settings.json b/scripts/ufbt/project_template/.vscode/settings.json index b93ad82f1a..d304752a92 100644 --- a/scripts/ufbt/project_template/.vscode/settings.json +++ b/scripts/ufbt/project_template/.vscode/settings.json @@ -19,7 +19,7 @@ "[python]": { "editor.defaultFormatter": "ms-python.black-formatter" }, - // "clangd.path": "@UFBT_TOOLCHAIN_CLANGD@", + "clangd.path": "@UFBT_TOOLCHAIN_CLANGD@", "clangd.arguments": [ "--query-driver=**/arm-none-eabi-*", "--compile-commands-dir=${workspaceFolder}/.vscode", From 380ec2ac46606c7fc2db796499e10f10076384f6 Mon Sep 17 00:00:00 2001 From: hedger Date: Wed, 31 Jul 2024 19:38:20 +0300 Subject: [PATCH 21/52] Added `-Wundef` to compiler options (#3815) * fbt: added -Wundef to compiler options; libs: various small fixes for missing defines; desktop: proper access to current RTOS config * apps: fixes for FURI_DEBUG handling * rpc: unified definition checks * Cleanup various defines use * Cleanup configs and move SVCall ISR priority configuration to furi_hal_interrupts Co-authored-by: Aleksandr Kutuzov --- applications/services/cli/cli_commands.c | 4 ++-- .../services/desktop/views/desktop_view_locked.c | 5 ++--- .../desktop/views/desktop_view_pin_timeout.c | 6 +----- applications/services/rpc/rpc.c | 8 ++++---- applications/settings/system/system_settings.c | 4 ++-- furi/furi.c | 7 ------- furi/furi.h | 2 +- lib/drivers/bq25896_reg.h | 4 ++-- lib/drivers/lp5562_reg.h | 4 ++-- site_scons/cc.scons | 1 + targets/f7/ble_glue/app_conf.h | 4 ++++ targets/f7/ble_glue/ble_conf.h | 12 ++++++++++++ targets/f7/furi_hal/furi_hal_interrupt.c | 1 + targets/f7/inc/FreeRTOSConfig.h | 3 ++- 14 files changed, 36 insertions(+), 29 deletions(-) diff --git a/applications/services/cli/cli_commands.c b/applications/services/cli/cli_commands.c index 5a1b11d803..b4eeebbe63 100644 --- a/applications/services/cli/cli_commands.c +++ b/applications/services/cli/cli_commands.c @@ -260,7 +260,7 @@ void cli_command_sysctl_heap_track(Cli* cli, FuriString* args, void* context) { } else if(!furi_string_cmp(args, "main")) { furi_hal_rtc_set_heap_track_mode(FuriHalRtcHeapTrackModeMain); printf("Heap tracking enabled for application main thread"); -#if FURI_DEBUG +#ifdef FURI_DEBUG } else if(!furi_string_cmp(args, "tree")) { furi_hal_rtc_set_heap_track_mode(FuriHalRtcHeapTrackModeTree); printf("Heap tracking enabled for application main and child threads"); @@ -279,7 +279,7 @@ void cli_command_sysctl_print_usage(void) { printf("Cmd list:\r\n"); printf("\tdebug <0|1>\t - Enable or disable system debug\r\n"); -#if FURI_DEBUG +#ifdef FURI_DEBUG printf("\theap_track \t - Set heap allocation tracking mode\r\n"); #else printf("\theap_track \t - Set heap allocation tracking mode\r\n"); diff --git a/applications/services/desktop/views/desktop_view_locked.c b/applications/services/desktop/views/desktop_view_locked.c index 81d3fc65f5..f3b001e1e0 100644 --- a/applications/services/desktop/views/desktop_view_locked.c +++ b/applications/services/desktop/views/desktop_view_locked.c @@ -1,12 +1,11 @@ -#include -#include #include + #include #include #include + #include -#include #include "../desktop_i.h" #include "desktop_view_locked.h" diff --git a/applications/services/desktop/views/desktop_view_pin_timeout.c b/applications/services/desktop/views/desktop_view_pin_timeout.c index 2811ba7d25..d7e5507a75 100644 --- a/applications/services/desktop/views/desktop_view_pin_timeout.c +++ b/applications/services/desktop/views/desktop_view_pin_timeout.c @@ -1,9 +1,5 @@ - #include -#include -#include -#include -#include + #include #include diff --git a/applications/services/rpc/rpc.c b/applications/services/rpc/rpc.c index 6ad16fbff4..00ec2259c7 100644 --- a/applications/services/rpc/rpc.c +++ b/applications/services/rpc/rpc.c @@ -228,7 +228,7 @@ bool rpc_pb_stream_read(pb_istream_t* istream, pb_byte_t* buf, size_t count) { } } -#if SRV_RPC_DEBUG +#ifdef SRV_RPC_DEBUG rpc_debug_print_data("INPUT", buf, bytes_received); #endif @@ -268,7 +268,7 @@ static int32_t rpc_session_worker(void* context) { bool message_decode_failed = false; if(pb_decode_ex(&istream, &PB_Main_msg, session->decoded_message, PB_DECODE_DELIMITED)) { -#if SRV_RPC_DEBUG +#ifdef SRV_RPC_DEBUG FURI_LOG_I(TAG, "INPUT:"); rpc_debug_print_message(session->decoded_message); #endif @@ -452,7 +452,7 @@ void rpc_send(RpcSession* session, PB_Main* message) { pb_ostream_t ostream = PB_OSTREAM_SIZING; -#if SRV_RPC_DEBUG +#ifdef SRV_RPC_DEBUG FURI_LOG_I(TAG, "OUTPUT:"); rpc_debug_print_message(message); #endif @@ -465,7 +465,7 @@ void rpc_send(RpcSession* session, PB_Main* message) { pb_encode_ex(&ostream, &PB_Main_msg, message, PB_ENCODE_DELIMITED); -#if SRV_RPC_DEBUG +#ifdef SRV_RPC_DEBUG rpc_debug_print_data("OUTPUT", buffer, ostream.bytes_written); #endif diff --git a/applications/settings/system/system_settings.c b/applications/settings/system/system_settings.c index 73969de31e..636d49b42a 100644 --- a/applications/settings/system/system_settings.c +++ b/applications/settings/system/system_settings.c @@ -92,7 +92,7 @@ static void debug_changed(VariableItem* item) { const char* const heap_trace_mode_text[] = { "None", "Main", -#if FURI_DEBUG +#ifdef FURI_DEBUG "Tree", "All", #endif @@ -101,7 +101,7 @@ const char* const heap_trace_mode_text[] = { const uint32_t heap_trace_mode_value[] = { FuriHalRtcHeapTrackModeNone, FuriHalRtcHeapTrackModeMain, -#if FURI_DEBUG +#ifdef FURI_DEBUG FuriHalRtcHeapTrackModeTree, FuriHalRtcHeapTrackModeAll, #endif diff --git a/furi/furi.c b/furi/furi.c index dca674da57..f4e64ee099 100644 --- a/furi/furi.c +++ b/furi/furi.c @@ -15,13 +15,6 @@ void furi_run(void) { furi_check(!furi_kernel_is_irq_or_masked()); furi_check(xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED); -#if(__ARM_ARCH_7A__ == 0U) - /* Service Call interrupt might be configured before kernel start */ - /* and when its priority is lower or equal to BASEPRI, svc instruction */ - /* causes a Hard Fault. */ - NVIC_SetPriority(SVCall_IRQn, 0U); -#endif - /* Start the kernel scheduler */ vTaskStartScheduler(); } diff --git a/furi/furi.h b/furi/furi.h index 80ee30457c..d75debe987 100644 --- a/furi/furi.h +++ b/furi/furi.h @@ -2,8 +2,8 @@ #include -#include "core/check.h" #include "core/common_defines.h" +#include "core/check.h" #include "core/event_loop.h" #include "core/event_loop_timer.h" #include "core/event_flag.h" diff --git a/lib/drivers/bq25896_reg.h b/lib/drivers/bq25896_reg.h index 23d094003a..baadf6df27 100644 --- a/lib/drivers/bq25896_reg.h +++ b/lib/drivers/bq25896_reg.h @@ -3,8 +3,8 @@ #include #include -#if BITS_BIG_ENDIAN == 1 -#error Bit structures defined in this file is not portable to BE +#if defined(BITS_BIG_ENDIAN) && BITS_BIG_ENDIAN == 1 +#error Bit structures defined in this file are not portable to BE #endif #define BQ25896_ADDRESS 0xD6 diff --git a/lib/drivers/lp5562_reg.h b/lib/drivers/lp5562_reg.h index 9103e5395f..a901cbada3 100644 --- a/lib/drivers/lp5562_reg.h +++ b/lib/drivers/lp5562_reg.h @@ -1,7 +1,7 @@ #pragma once -#if BITS_BIG_ENDIAN == 1 -#error Bit structures defined in this file is not portable to BE +#if defined(BITS_BIG_ENDIAN) && BITS_BIG_ENDIAN == 1 +#error Bit structures defined in this file are not portable to BE #endif #define LP5562_ADDRESS 0x60 diff --git a/site_scons/cc.scons b/site_scons/cc.scons index 603ec621c6..c5d99b8965 100644 --- a/site_scons/cc.scons +++ b/site_scons/cc.scons @@ -28,6 +28,7 @@ ENV.AppendUnique( "-Wno-address-of-packed-member", "-Wredundant-decls", "-Wdouble-promotion", + "-Wundef", "-fdata-sections", "-ffunction-sections", "-fsingle-precision-constant", diff --git a/targets/f7/ble_glue/app_conf.h b/targets/f7/ble_glue/app_conf.h index 43be8129dc..9ceb747c19 100644 --- a/targets/f7/ble_glue/app_conf.h +++ b/targets/f7/ble_glue/app_conf.h @@ -194,3 +194,7 @@ 255 /**< Set to 255 with the memory manager and the mailbox */ #define TL_BLE_EVENT_FRAME_SIZE (TL_EVT_HDR_SIZE + CFG_TLBLE_MOST_EVENT_PAYLOAD_SIZE) + +/* Various defines for compatibility with -Wundef - thanks, ST */ +#define CFG_DEBUG_TRACE_FULL 0 +#define CFG_DEBUG_TRACE_LIGHT 0 diff --git a/targets/f7/ble_glue/ble_conf.h b/targets/f7/ble_glue/ble_conf.h index 4c523a707e..c34c54de66 100644 --- a/targets/f7/ble_glue/ble_conf.h +++ b/targets/f7/ble_glue/ble_conf.h @@ -9,3 +9,15 @@ #define BLE_CFG_SVC_MAX_NBR_CB 0 #define BLE_CFG_CLT_MAX_NBR_CB 0 + +/* Various defines for compatibility with -Wundef - thanks, ST */ +#define BLE_CFG_BLS_INTERMEDIATE_CUFF_PRESSURE 0 +#define BLE_CFG_BLS_TIME_STAMP_FLAG 0 +#define BLE_CFG_BLS_PULSE_RATE_FLAG 0 +#define BLE_CFG_BLS_USER_ID_FLAG 0 +#define BLE_CFG_BLS_MEASUREMENT_STATUS_FLAG 0 +#define BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG 0 +#define BLE_CFG_HRS_ENERGY_RR_INTERVAL_FLAG 0 +#define BLE_CFG_HTS_MEASUREMENT_INTERVAL 0 +#define BLE_CFG_HTS_TIME_STAMP_FLAG 0 +#define BLE_CFG_HTS_TEMPERATURE_TYPE_VALUE_STATIC 0 diff --git a/targets/f7/furi_hal/furi_hal_interrupt.c b/targets/f7/furi_hal/furi_hal_interrupt.c index 35c40c2595..cf10c8d33d 100644 --- a/targets/f7/furi_hal/furi_hal_interrupt.c +++ b/targets/f7/furi_hal/furi_hal_interrupt.c @@ -120,6 +120,7 @@ void furi_hal_interrupt_init(void) { TAMP_STAMP_LSECSS_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0)); NVIC_EnableIRQ(TAMP_STAMP_LSECSS_IRQn); + NVIC_SetPriority(SVCall_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0)); NVIC_SetPriority(PendSV_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 15, 0)); NVIC_SetPriority(FPU_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 15, 0)); diff --git a/targets/f7/inc/FreeRTOSConfig.h b/targets/f7/inc/FreeRTOSConfig.h index 62310511d2..2948faef93 100644 --- a/targets/f7/inc/FreeRTOSConfig.h +++ b/targets/f7/inc/FreeRTOSConfig.h @@ -17,11 +17,13 @@ #define configUSE_PREEMPTION 1 #define configSUPPORT_STATIC_ALLOCATION 1 #define configSUPPORT_DYNAMIC_ALLOCATION 0 +#define configUSE_MALLOC_FAILED_HOOK 0 #define configUSE_IDLE_HOOK 0 #define configUSE_TICK_HOOK 0 #define configCPU_CLOCK_HZ (SystemCoreClock) #define configTICK_RATE_HZ_RAW 1000 #define configTICK_RATE_HZ ((TickType_t)configTICK_RATE_HZ_RAW) +#define configUSE_16_BIT_TICKS 0 #define configMAX_PRIORITIES (32) #define configMINIMAL_STACK_SIZE ((uint16_t)128) @@ -34,7 +36,6 @@ #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() #define configUSE_TRACE_FACILITY 1 -#define configUSE_16_BIT_TICKS 0 #define configUSE_MUTEXES 1 #define configQUEUE_REGISTRY_SIZE 0 #define configCHECK_FOR_STACK_OVERFLOW 0 From 01b402ba2b701b39974a0d5351653732c002d076 Mon Sep 17 00:00:00 2001 From: Astra <93453568+Astrrra@users.noreply.github.com> Date: Thu, 1 Aug 2024 01:59:41 +0900 Subject: [PATCH 22/52] [FL-3827] iButton ID writing (#3734) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Function naming corrections and enabled writing ID for all dallas blanks * Enable ID writing for ds1971 and ds1996 * Sync API Symbols Co-authored-by: あく --- applications/main/ibutton/ibutton_cli.c | 4 ++-- applications/main/ibutton/ibutton_i.h | 2 +- .../ibutton/scenes/ibutton_scene_read_key_menu.c | 10 +++++----- .../ibutton/scenes/ibutton_scene_saved_key_menu.c | 10 +++++----- .../main/ibutton/scenes/ibutton_scene_write.c | 4 ++-- lib/ibutton/ibutton_protocols.c | 4 ++-- lib/ibutton/ibutton_protocols.h | 2 +- lib/ibutton/ibutton_worker.c | 10 +++++----- lib/ibutton/ibutton_worker.h | 2 +- lib/ibutton/ibutton_worker_i.h | 2 +- lib/ibutton/ibutton_worker_modes.c | 8 ++++---- lib/ibutton/protocols/dallas/protocol_dallas_base.h | 2 +- lib/ibutton/protocols/dallas/protocol_ds1971.c | 13 +++++++++++-- lib/ibutton/protocols/dallas/protocol_ds1990.c | 8 ++++---- lib/ibutton/protocols/dallas/protocol_ds1992.c | 11 +++++------ lib/ibutton/protocols/dallas/protocol_ds1996.c | 13 +++++++++++-- lib/ibutton/protocols/dallas/protocol_ds_generic.c | 8 ++++---- .../protocols/dallas/protocol_group_dallas.c | 8 ++++---- lib/ibutton/protocols/misc/protocol_group_misc.c | 2 +- lib/ibutton/protocols/protocol_common.h | 2 +- lib/ibutton/protocols/protocol_group_base.h | 2 +- targets/f18/api_symbols.csv | 2 +- targets/f7/api_symbols.csv | 6 +++--- 23 files changed, 76 insertions(+), 59 deletions(-) diff --git a/applications/main/ibutton/ibutton_cli.c b/applications/main/ibutton/ibutton_cli.c index cf6442c061..2338ca3c3d 100644 --- a/applications/main/ibutton/ibutton_cli.c +++ b/applications/main/ibutton/ibutton_cli.c @@ -156,7 +156,7 @@ void ibutton_cli_write(Cli* cli, FuriString* args) { } if(!(ibutton_protocols_get_features(protocols, ibutton_key_get_protocol_id(key)) & - iButtonProtocolFeatureWriteBlank)) { + iButtonProtocolFeatureWriteId)) { ibutton_cli_print_usage(); break; } @@ -165,7 +165,7 @@ void ibutton_cli_write(Cli* cli, FuriString* args) { ibutton_cli_print_key(protocols, key); printf("Press Ctrl+C to abort\r\n"); - ibutton_worker_write_blank_start(worker, key); + ibutton_worker_write_id_start(worker, key); while(true) { uint32_t flags = furi_event_flag_wait( write_context.event, EVENT_FLAG_IBUTTON_COMPLETE, FuriFlagWaitAny, 100); diff --git a/applications/main/ibutton/ibutton_i.h b/applications/main/ibutton/ibutton_i.h index d355a4ea5f..454837e977 100644 --- a/applications/main/ibutton/ibutton_i.h +++ b/applications/main/ibutton/ibutton_i.h @@ -36,7 +36,7 @@ typedef enum { iButtonWriteModeInvalid, - iButtonWriteModeBlank, + iButtonWriteModeId, iButtonWriteModeCopy, } iButtonWriteMode; diff --git a/applications/main/ibutton/scenes/ibutton_scene_read_key_menu.c b/applications/main/ibutton/scenes/ibutton_scene_read_key_menu.c index 890e0a2848..94ad4b69ee 100644 --- a/applications/main/ibutton/scenes/ibutton_scene_read_key_menu.c +++ b/applications/main/ibutton/scenes/ibutton_scene_read_key_menu.c @@ -5,7 +5,7 @@ typedef enum { SubmenuIndexSave, SubmenuIndexEmulate, SubmenuIndexViewData, - SubmenuIndexWriteBlank, + SubmenuIndexWriteId, SubmenuIndexWriteCopy, } SubmenuIndex; @@ -30,11 +30,11 @@ void ibutton_scene_read_key_menu_on_enter(void* context) { ibutton_scene_read_key_menu_submenu_callback, ibutton); - if(features & iButtonProtocolFeatureWriteBlank) { + if(features & iButtonProtocolFeatureWriteId) { submenu_add_item( submenu, "Write ID", - SubmenuIndexWriteBlank, + SubmenuIndexWriteId, ibutton_scene_read_key_menu_submenu_callback, ibutton); } @@ -78,8 +78,8 @@ bool ibutton_scene_read_key_menu_on_event(void* context, SceneManagerEvent event dolphin_deed(DolphinDeedIbuttonEmulate); } else if(event.event == SubmenuIndexViewData) { scene_manager_next_scene(scene_manager, iButtonSceneViewData); - } else if(event.event == SubmenuIndexWriteBlank) { - ibutton->write_mode = iButtonWriteModeBlank; + } else if(event.event == SubmenuIndexWriteId) { + ibutton->write_mode = iButtonWriteModeId; scene_manager_next_scene(scene_manager, iButtonSceneWrite); } else if(event.event == SubmenuIndexWriteCopy) { ibutton->write_mode = iButtonWriteModeCopy; diff --git a/applications/main/ibutton/scenes/ibutton_scene_saved_key_menu.c b/applications/main/ibutton/scenes/ibutton_scene_saved_key_menu.c index 668b79ae3c..6727c5458c 100644 --- a/applications/main/ibutton/scenes/ibutton_scene_saved_key_menu.c +++ b/applications/main/ibutton/scenes/ibutton_scene_saved_key_menu.c @@ -3,7 +3,7 @@ enum SubmenuIndex { SubmenuIndexEmulate, - SubmenuIndexWriteBlank, + SubmenuIndexWriteId, SubmenuIndexWriteCopy, SubmenuIndexEdit, SubmenuIndexRename, @@ -20,9 +20,9 @@ void ibutton_scene_saved_key_menu_on_enter(void* context) { submenu_add_item(submenu, "Emulate", SubmenuIndexEmulate, ibutton_submenu_callback, ibutton); - if(features & iButtonProtocolFeatureWriteBlank) { + if(features & iButtonProtocolFeatureWriteId) { submenu_add_item( - submenu, "Write ID", SubmenuIndexWriteBlank, ibutton_submenu_callback, ibutton); + submenu, "Write ID", SubmenuIndexWriteId, ibutton_submenu_callback, ibutton); } if(features & iButtonProtocolFeatureWriteCopy) { @@ -55,8 +55,8 @@ bool ibutton_scene_saved_key_menu_on_event(void* context, SceneManagerEvent even if(event.event == SubmenuIndexEmulate) { scene_manager_next_scene(scene_manager, iButtonSceneEmulate); dolphin_deed(DolphinDeedIbuttonEmulate); - } else if(event.event == SubmenuIndexWriteBlank) { - ibutton->write_mode = iButtonWriteModeBlank; + } else if(event.event == SubmenuIndexWriteId) { + ibutton->write_mode = iButtonWriteModeId; scene_manager_next_scene(scene_manager, iButtonSceneWrite); } else if(event.event == SubmenuIndexWriteCopy) { ibutton->write_mode = iButtonWriteModeCopy; diff --git a/applications/main/ibutton/scenes/ibutton_scene_write.c b/applications/main/ibutton/scenes/ibutton_scene_write.c index 465b063010..1f7d3cba6d 100644 --- a/applications/main/ibutton/scenes/ibutton_scene_write.c +++ b/applications/main/ibutton/scenes/ibutton_scene_write.c @@ -52,9 +52,9 @@ void ibutton_scene_write_on_enter(void* context) { ibutton_worker_write_set_callback(worker, ibutton_scene_write_callback, ibutton); - if(ibutton->write_mode == iButtonWriteModeBlank) { + if(ibutton->write_mode == iButtonWriteModeId) { furi_string_set(tmp, "Writing ID"); - ibutton_worker_write_blank_start(worker, key); + ibutton_worker_write_id_start(worker, key); } else if(ibutton->write_mode == iButtonWriteModeCopy) { furi_string_set(tmp, "Full Writing"); diff --git a/lib/ibutton/ibutton_protocols.c b/lib/ibutton/ibutton_protocols.c index ecd5f9a0dc..7955b06737 100644 --- a/lib/ibutton/ibutton_protocols.c +++ b/lib/ibutton/ibutton_protocols.c @@ -160,7 +160,7 @@ bool ibutton_protocols_read(iButtonProtocols* protocols, iButtonKey* key) { return id != iButtonProtocolIdInvalid; } -bool ibutton_protocols_write_blank(iButtonProtocols* protocols, iButtonKey* key) { +bool ibutton_protocols_write_id(iButtonProtocols* protocols, iButtonKey* key) { furi_check(protocols); furi_check(key); @@ -168,7 +168,7 @@ bool ibutton_protocols_write_blank(iButtonProtocols* protocols, iButtonKey* key) iButtonProtocolData* data = ibutton_key_get_protocol_data(key); GET_PROTOCOL_GROUP(id); - return GROUP_BASE->write_blank(GROUP_DATA, data, PROTOCOL_ID); + return GROUP_BASE->write_id(GROUP_DATA, data, PROTOCOL_ID); } bool ibutton_protocols_write_copy(iButtonProtocols* protocols, iButtonKey* key) { diff --git a/lib/ibutton/ibutton_protocols.h b/lib/ibutton/ibutton_protocols.h index dd2afbd6ee..b0c542352f 100644 --- a/lib/ibutton/ibutton_protocols.h +++ b/lib/ibutton/ibutton_protocols.h @@ -88,7 +88,7 @@ bool ibutton_protocols_read(iButtonProtocols* protocols, iButtonKey* key); * @param [in] key pointer to the key to be written * @return true on success, false on failure */ -bool ibutton_protocols_write_blank(iButtonProtocols* protocols, iButtonKey* key); +bool ibutton_protocols_write_id(iButtonProtocols* protocols, iButtonKey* key); /** * Write the key to another one of the same type diff --git a/lib/ibutton/ibutton_worker.c b/lib/ibutton/ibutton_worker.c index 2874f120ff..ea6febd125 100644 --- a/lib/ibutton/ibutton_worker.c +++ b/lib/ibutton/ibutton_worker.c @@ -7,7 +7,7 @@ typedef enum { iButtonMessageEnd, iButtonMessageStop, iButtonMessageRead, - iButtonMessageWriteBlank, + iButtonMessageWriteId, iButtonMessageWriteCopy, iButtonMessageEmulate, iButtonMessageNotifyEmulate, @@ -78,11 +78,11 @@ void ibutton_worker_read_start(iButtonWorker* worker, iButtonKey* key) { furi_message_queue_put(worker->messages, &message, FuriWaitForever) == FuriStatusOk); } -void ibutton_worker_write_blank_start(iButtonWorker* worker, iButtonKey* key) { +void ibutton_worker_write_id_start(iButtonWorker* worker, iButtonKey* key) { furi_check(worker); furi_check(key); - iButtonMessage message = {.type = iButtonMessageWriteBlank, .data.key = key}; + iButtonMessage message = {.type = iButtonMessageWriteId, .data.key = key}; furi_check( furi_message_queue_put(worker->messages, &message, FuriWaitForever) == FuriStatusOk); @@ -185,9 +185,9 @@ static int32_t ibutton_worker_thread(void* thread_context) { ibutton_worker_set_key_p(worker, message.data.key); ibutton_worker_switch_mode(worker, iButtonWorkerModeRead); break; - case iButtonMessageWriteBlank: + case iButtonMessageWriteId: ibutton_worker_set_key_p(worker, message.data.key); - ibutton_worker_switch_mode(worker, iButtonWorkerModeWriteBlank); + ibutton_worker_switch_mode(worker, iButtonWorkerModeWriteId); break; case iButtonMessageWriteCopy: ibutton_worker_set_key_p(worker, message.data.key); diff --git a/lib/ibutton/ibutton_worker.h b/lib/ibutton/ibutton_worker.h index 2a12a3194d..6abacc3b6d 100644 --- a/lib/ibutton/ibutton_worker.h +++ b/lib/ibutton/ibutton_worker.h @@ -84,7 +84,7 @@ void ibutton_worker_write_set_callback( * @param worker * @param key */ -void ibutton_worker_write_blank_start(iButtonWorker* worker, iButtonKey* key); +void ibutton_worker_write_id_start(iButtonWorker* worker, iButtonKey* key); /** * Start write copy mode diff --git a/lib/ibutton/ibutton_worker_i.h b/lib/ibutton/ibutton_worker_i.h index 5f259a38af..2b910bad8e 100644 --- a/lib/ibutton/ibutton_worker_i.h +++ b/lib/ibutton/ibutton_worker_i.h @@ -25,7 +25,7 @@ typedef struct { typedef enum { iButtonWorkerModeIdle, iButtonWorkerModeRead, - iButtonWorkerModeWriteBlank, + iButtonWorkerModeWriteId, iButtonWorkerModeWriteCopy, iButtonWorkerModeEmulate, } iButtonWorkerMode; diff --git a/lib/ibutton/ibutton_worker_modes.c b/lib/ibutton/ibutton_worker_modes.c index 83e207de93..5900b10a27 100644 --- a/lib/ibutton/ibutton_worker_modes.c +++ b/lib/ibutton/ibutton_worker_modes.c @@ -20,7 +20,7 @@ static void ibutton_worker_mode_read_tick(iButtonWorker* worker); static void ibutton_worker_mode_read_stop(iButtonWorker* worker); static void ibutton_worker_mode_write_common_start(iButtonWorker* worker); -static void ibutton_worker_mode_write_blank_tick(iButtonWorker* worker); +static void ibutton_worker_mode_write_id_tick(iButtonWorker* worker); static void ibutton_worker_mode_write_copy_tick(iButtonWorker* worker); static void ibutton_worker_mode_write_common_stop(iButtonWorker* worker); @@ -40,7 +40,7 @@ const iButtonWorkerModeType ibutton_worker_modes[] = { { .quant = 1000, .start = ibutton_worker_mode_write_common_start, - .tick = ibutton_worker_mode_write_blank_tick, + .tick = ibutton_worker_mode_write_id_tick, .stop = ibutton_worker_mode_write_common_stop, }, { @@ -123,10 +123,10 @@ void ibutton_worker_mode_write_common_start(iButtonWorker* worker) { //-V524 furi_hal_power_enable_otg(); } -void ibutton_worker_mode_write_blank_tick(iButtonWorker* worker) { +void ibutton_worker_mode_write_id_tick(iButtonWorker* worker) { furi_assert(worker->key); - const bool success = ibutton_protocols_write_blank(worker->protocols, worker->key); + const bool success = ibutton_protocols_write_id(worker->protocols, worker->key); // TODO FL-3527: pass a proper result to the callback const iButtonWorkerWriteResult result = success ? iButtonWorkerWriteOK : iButtonWorkerWriteNoDetect; diff --git a/lib/ibutton/protocols/dallas/protocol_dallas_base.h b/lib/ibutton/protocols/dallas/protocol_dallas_base.h index 05620329f8..66eb42f155 100644 --- a/lib/ibutton/protocols/dallas/protocol_dallas_base.h +++ b/lib/ibutton/protocols/dallas/protocol_dallas_base.h @@ -25,7 +25,7 @@ typedef struct { const char* name; iButtonProtocolDallasReadWriteFunc read; - iButtonProtocolDallasReadWriteFunc write_blank; + iButtonProtocolDallasReadWriteFunc write_id; iButtonProtocolDallasReadWriteFunc write_copy; iButtonProtocolDallasEmulateFunc emulate; iButtonProtocolDallasSaveFunc save; diff --git a/lib/ibutton/protocols/dallas/protocol_ds1971.c b/lib/ibutton/protocols/dallas/protocol_ds1971.c index 64920f6ace..3a9e986411 100644 --- a/lib/ibutton/protocols/dallas/protocol_ds1971.c +++ b/lib/ibutton/protocols/dallas/protocol_ds1971.c @@ -5,6 +5,8 @@ #include "dallas_common.h" +#include "../blanks/tm2004.h" + #define DS1971_FAMILY_CODE 0x14U #define DS1971_FAMILY_NAME "DS1971" @@ -31,6 +33,7 @@ typedef struct { } DS1971ProtocolData; static bool dallas_ds1971_read(OneWireHost*, void*); +static bool dallas_ds1971_write_id(OneWireHost*, iButtonProtocolData*); static bool dallas_ds1971_write_copy(OneWireHost*, iButtonProtocolData*); static void dallas_ds1971_emulate(OneWireSlave*, iButtonProtocolData*); static bool dallas_ds1971_load(FlipperFormat*, uint32_t, iButtonProtocolData*); @@ -48,13 +51,14 @@ static bool ds1971_emulate_read_mem(OneWireSlave* bus, const uint8_t* data, size const iButtonProtocolDallasBase ibutton_protocol_ds1971 = { .family_code = DS1971_FAMILY_CODE, - .features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteCopy, + .features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteId | + iButtonProtocolFeatureWriteCopy, .data_size = sizeof(DS1971ProtocolData), .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, .name = DS1971_FAMILY_NAME, .read = dallas_ds1971_read, - .write_blank = NULL, // TODO FL-3531: Implement writing to blank + .write_id = dallas_ds1971_write_id, .write_copy = dallas_ds1971_write_copy, .emulate = dallas_ds1971_emulate, .save = dallas_ds1971_save, @@ -74,6 +78,11 @@ bool dallas_ds1971_read(OneWireHost* host, iButtonProtocolData* protocol_data) { dallas_ds1971_read_mem(host, 0, data->eeprom_data, DS1971_EEPROM_DATA_SIZE); } +bool dallas_ds1971_write_id(OneWireHost* host, iButtonProtocolData* protocol_data) { + DS1971ProtocolData* data = protocol_data; + return tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData)); +} + bool dallas_ds1971_write_copy(OneWireHost* host, iButtonProtocolData* protocol_data) { DS1971ProtocolData* data = protocol_data; diff --git a/lib/ibutton/protocols/dallas/protocol_ds1990.c b/lib/ibutton/protocols/dallas/protocol_ds1990.c index 67e7545f45..5ed2171c63 100644 --- a/lib/ibutton/protocols/dallas/protocol_ds1990.c +++ b/lib/ibutton/protocols/dallas/protocol_ds1990.c @@ -23,7 +23,7 @@ typedef struct { } DS1990ProtocolData; static bool dallas_ds1990_read(OneWireHost*, iButtonProtocolData*); -static bool dallas_ds1990_write_blank(OneWireHost*, iButtonProtocolData*); +static bool dallas_ds1990_write_id(OneWireHost*, iButtonProtocolData*); static void dallas_ds1990_emulate(OneWireSlave*, iButtonProtocolData*); static bool dallas_ds1990_load(FlipperFormat*, uint32_t, iButtonProtocolData*); static bool dallas_ds1990_save(FlipperFormat*, const iButtonProtocolData*); @@ -36,13 +36,13 @@ static void dallas_ds1990_apply_edits(iButtonProtocolData*); const iButtonProtocolDallasBase ibutton_protocol_ds1990 = { .family_code = DS1990_FAMILY_CODE, - .features = iButtonProtocolFeatureWriteBlank, + .features = iButtonProtocolFeatureWriteId, .data_size = sizeof(DS1990ProtocolData), .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, .name = DS1990_FAMILY_NAME, .read = dallas_ds1990_read, - .write_blank = dallas_ds1990_write_blank, + .write_id = dallas_ds1990_write_id, .write_copy = NULL, /* No data to write a copy */ .emulate = dallas_ds1990_emulate, .save = dallas_ds1990_save, @@ -61,7 +61,7 @@ bool dallas_ds1990_read(OneWireHost* host, iButtonProtocolData* protocol_data) { return onewire_host_reset(host) && dallas_common_read_rom(host, &data->rom_data); } -bool dallas_ds1990_write_blank(OneWireHost* host, iButtonProtocolData* protocol_data) { +bool dallas_ds1990_write_id(OneWireHost* host, iButtonProtocolData* protocol_data) { DS1990ProtocolData* data = protocol_data; return rw1990_write_v1(host, data->rom_data.bytes, sizeof(DallasCommonRomData)) || diff --git a/lib/ibutton/protocols/dallas/protocol_ds1992.c b/lib/ibutton/protocols/dallas/protocol_ds1992.c index 0b6cd4fca2..05ea9a15c0 100644 --- a/lib/ibutton/protocols/dallas/protocol_ds1992.c +++ b/lib/ibutton/protocols/dallas/protocol_ds1992.c @@ -31,7 +31,7 @@ typedef struct { } DS1992ProtocolData; static bool dallas_ds1992_read(OneWireHost*, void*); -static bool dallas_ds1992_write_blank(OneWireHost*, iButtonProtocolData*); +static bool dallas_ds1992_write_id(OneWireHost*, iButtonProtocolData*); static bool dallas_ds1992_write_copy(OneWireHost*, iButtonProtocolData*); static void dallas_ds1992_emulate(OneWireSlave*, iButtonProtocolData*); static bool dallas_ds1992_load(FlipperFormat*, uint32_t, iButtonProtocolData*); @@ -46,14 +46,14 @@ static void dallas_ds1992_apply_edits(iButtonProtocolData*); const iButtonProtocolDallasBase ibutton_protocol_ds1992 = { .family_code = DS1992_FAMILY_CODE, - .features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteBlank | + .features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteId | iButtonProtocolFeatureWriteCopy, .data_size = sizeof(DS1992ProtocolData), .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, .name = DS1992_FAMILY_NAME, .read = dallas_ds1992_read, - .write_blank = dallas_ds1992_write_blank, + .write_id = dallas_ds1992_write_id, .write_copy = dallas_ds1992_write_copy, .emulate = dallas_ds1992_emulate, .save = dallas_ds1992_save, @@ -73,10 +73,9 @@ bool dallas_ds1992_read(OneWireHost* host, iButtonProtocolData* protocol_data) { dallas_common_read_mem(host, 0, data->sram_data, DS1992_SRAM_DATA_SIZE); } -bool dallas_ds1992_write_blank(OneWireHost* host, iButtonProtocolData* protocol_data) { +bool dallas_ds1992_write_id(OneWireHost* host, iButtonProtocolData* protocol_data) { DS1992ProtocolData* data = protocol_data; - // TODO FL-3532: Make this work, currently broken - return tm2004_write(host, (uint8_t*)data, sizeof(DallasCommonRomData) + DS1992_SRAM_DATA_SIZE); + return tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData)); } bool dallas_ds1992_write_copy(OneWireHost* host, iButtonProtocolData* protocol_data) { diff --git a/lib/ibutton/protocols/dallas/protocol_ds1996.c b/lib/ibutton/protocols/dallas/protocol_ds1996.c index d78a303f86..12c91b001d 100644 --- a/lib/ibutton/protocols/dallas/protocol_ds1996.c +++ b/lib/ibutton/protocols/dallas/protocol_ds1996.c @@ -5,6 +5,8 @@ #include "dallas_common.h" +#include "../blanks/tm2004.h" + #define DS1996_FAMILY_CODE 0x0CU #define DS1996_FAMILY_NAME "DS1996" @@ -29,6 +31,7 @@ typedef struct { } DS1996ProtocolData; static bool dallas_ds1996_read(OneWireHost*, void*); +static bool dallas_ds1996_write_id(OneWireHost*, iButtonProtocolData*); static bool dallas_ds1996_write_copy(OneWireHost*, iButtonProtocolData*); static void dallas_ds1996_emulate(OneWireSlave*, iButtonProtocolData*); static bool dallas_ds1996_load(FlipperFormat*, uint32_t, iButtonProtocolData*); @@ -43,13 +46,14 @@ static void dallas_ds1996_apply_edits(iButtonProtocolData*); const iButtonProtocolDallasBase ibutton_protocol_ds1996 = { .family_code = DS1996_FAMILY_CODE, - .features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteCopy, + .features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteId | + iButtonProtocolFeatureWriteCopy, .data_size = sizeof(DS1996ProtocolData), .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, .name = DS1996_FAMILY_NAME, .read = dallas_ds1996_read, - .write_blank = NULL, /* Data too big for known blanks */ + .write_id = dallas_ds1996_write_id, .write_copy = dallas_ds1996_write_copy, .emulate = dallas_ds1996_emulate, .save = dallas_ds1996_save, @@ -83,6 +87,11 @@ bool dallas_ds1996_read(OneWireHost* host, iButtonProtocolData* protocol_data) { return success; } +bool dallas_ds1996_write_id(OneWireHost* host, iButtonProtocolData* protocol_data) { + DS1996ProtocolData* data = protocol_data; + return tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData)); +} + bool dallas_ds1996_write_copy(OneWireHost* host, iButtonProtocolData* protocol_data) { DS1996ProtocolData* data = protocol_data; bool success = false; diff --git a/lib/ibutton/protocols/dallas/protocol_ds_generic.c b/lib/ibutton/protocols/dallas/protocol_ds_generic.c index 101db1dbe2..128f20970d 100644 --- a/lib/ibutton/protocols/dallas/protocol_ds_generic.c +++ b/lib/ibutton/protocols/dallas/protocol_ds_generic.c @@ -20,7 +20,7 @@ typedef struct { } DallasGenericProtocolData; static bool ds_generic_read(OneWireHost*, iButtonProtocolData*); -static bool ds_generic_write_blank(OneWireHost*, iButtonProtocolData*); +static bool ds_generic_write_id(OneWireHost*, iButtonProtocolData*); static void ds_generic_emulate(OneWireSlave*, iButtonProtocolData*); static bool ds_generic_load(FlipperFormat*, uint32_t, iButtonProtocolData*); static bool ds_generic_save(FlipperFormat*, const iButtonProtocolData*); @@ -33,13 +33,13 @@ static void ds_generic_apply_edits(iButtonProtocolData*); const iButtonProtocolDallasBase ibutton_protocol_ds_generic = { .family_code = DALLAS_GENERIC_FAMILY_CODE, - .features = iButtonProtocolFeatureWriteBlank, + .features = iButtonProtocolFeatureWriteId, .data_size = sizeof(DallasGenericProtocolData), .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, .name = DALLAS_GENERIC_FAMILY_NAME, .read = ds_generic_read, - .write_blank = ds_generic_write_blank, + .write_id = ds_generic_write_id, .write_copy = NULL, /* No data to write a copy */ .emulate = ds_generic_emulate, .save = ds_generic_save, @@ -58,7 +58,7 @@ bool ds_generic_read(OneWireHost* host, iButtonProtocolData* protocol_data) { return onewire_host_reset(host) && dallas_common_read_rom(host, &data->rom_data); } -bool ds_generic_write_blank(OneWireHost* host, iButtonProtocolData* protocol_data) { +bool ds_generic_write_id(OneWireHost* host, iButtonProtocolData* protocol_data) { DallasGenericProtocolData* data = protocol_data; return tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData)); } diff --git a/lib/ibutton/protocols/dallas/protocol_group_dallas.c b/lib/ibutton/protocols/dallas/protocol_group_dallas.c index 7dad756690..634c9ab89b 100644 --- a/lib/ibutton/protocols/dallas/protocol_group_dallas.c +++ b/lib/ibutton/protocols/dallas/protocol_group_dallas.c @@ -133,13 +133,13 @@ static bool ibutton_protocol_group_dallas_read( return success; } -static bool ibutton_protocol_group_dallas_write_blank( +static bool ibutton_protocol_group_dallas_write_id( iButtonProtocolGroupDallas* group, iButtonProtocolData* data, iButtonProtocolLocalId id) { furi_assert(id < iButtonProtocolDSMax); const iButtonProtocolDallasBase* protocol = ibutton_protocols_dallas[id]; - furi_assert(protocol->features & iButtonProtocolFeatureWriteBlank); + furi_assert(protocol->features & iButtonProtocolFeatureWriteId); OneWireHost* host = group->host; @@ -148,7 +148,7 @@ static bool ibutton_protocol_group_dallas_write_blank( FURI_CRITICAL_ENTER(); - const bool success = protocol->write_blank(host, data); + const bool success = protocol->write_id(host, data); onewire_host_stop(host); FURI_CRITICAL_EXIT(); @@ -307,7 +307,7 @@ const iButtonProtocolGroupBase ibutton_protocol_group_dallas = { .get_name = (iButtonProtocolGroupGetStringFunc)ibutton_protocol_group_dallas_get_name, .read = (iButtonProtocolGroupReadFunc)ibutton_protocol_group_dallas_read, - .write_blank = (iButtonProtocolGroupWriteFunc)ibutton_protocol_group_dallas_write_blank, + .write_id = (iButtonProtocolGroupWriteFunc)ibutton_protocol_group_dallas_write_id, .write_copy = (iButtonProtocolGroupWriteFunc)ibutton_protocol_group_dallas_write_copy, .emulate_start = (iButtonProtocolGroupApplyFunc)ibutton_protocol_group_dallas_emulate_start, diff --git a/lib/ibutton/protocols/misc/protocol_group_misc.c b/lib/ibutton/protocols/misc/protocol_group_misc.c index ddbbf6bd80..95f34829ab 100644 --- a/lib/ibutton/protocols/misc/protocol_group_misc.c +++ b/lib/ibutton/protocols/misc/protocol_group_misc.c @@ -284,7 +284,7 @@ const iButtonProtocolGroupBase ibutton_protocol_group_misc = { .get_name = (iButtonProtocolGroupGetStringFunc)ibutton_protocol_group_misc_get_name, .read = (iButtonProtocolGroupReadFunc)ibutton_protocol_group_misc_read, - .write_blank = NULL, + .write_id = NULL, .write_copy = NULL, .emulate_start = (iButtonProtocolGroupApplyFunc)ibutton_protocol_group_misc_emulate_start, diff --git a/lib/ibutton/protocols/protocol_common.h b/lib/ibutton/protocols/protocol_common.h index 5383158e46..52fa1589bd 100644 --- a/lib/ibutton/protocols/protocol_common.h +++ b/lib/ibutton/protocols/protocol_common.h @@ -11,7 +11,7 @@ enum { typedef enum { iButtonProtocolFeatureExtData = (1U << 0), - iButtonProtocolFeatureWriteBlank = (1U << 1), + iButtonProtocolFeatureWriteId = (1U << 1), iButtonProtocolFeatureWriteCopy = (1U << 2), } iButtonProtocolFeature; diff --git a/lib/ibutton/protocols/protocol_group_base.h b/lib/ibutton/protocols/protocol_group_base.h index ef57fe0bc0..bbd53e31e9 100644 --- a/lib/ibutton/protocols/protocol_group_base.h +++ b/lib/ibutton/protocols/protocol_group_base.h @@ -84,7 +84,7 @@ typedef struct { iButtonProtocolGroupGetStringFunc get_name; iButtonProtocolGroupReadFunc read; - iButtonProtocolGroupWriteFunc write_blank; + iButtonProtocolGroupWriteFunc write_id; iButtonProtocolGroupWriteFunc write_copy; iButtonProtocolGroupApplyFunc emulate_start; diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index 7e254ce401..d2a145de5a 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,69.0,, +Version,+,70.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/cli/cli.h,, diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index cce5a320ab..52bc07d7e6 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,69.0,, +Version,+,70.0,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, @@ -1950,7 +1950,7 @@ Function,+,ibutton_protocols_render_data,void,"iButtonProtocols*, const iButtonK Function,+,ibutton_protocols_render_error,void,"iButtonProtocols*, const iButtonKey*, FuriString*" Function,+,ibutton_protocols_render_uid,void,"iButtonProtocols*, const iButtonKey*, FuriString*" Function,+,ibutton_protocols_save,_Bool,"iButtonProtocols*, const iButtonKey*, const char*" -Function,+,ibutton_protocols_write_blank,_Bool,"iButtonProtocols*, iButtonKey*" +Function,+,ibutton_protocols_write_id,_Bool,"iButtonProtocols*, iButtonKey*" Function,+,ibutton_protocols_write_copy,_Bool,"iButtonProtocols*, iButtonKey*" Function,+,ibutton_worker_alloc,iButtonWorker*,iButtonProtocols* Function,+,ibutton_worker_emulate_set_callback,void,"iButtonWorker*, iButtonWorkerEmulateCallback, void*" @@ -1961,7 +1961,7 @@ Function,+,ibutton_worker_read_start,void,"iButtonWorker*, iButtonKey*" Function,+,ibutton_worker_start_thread,void,iButtonWorker* Function,+,ibutton_worker_stop,void,iButtonWorker* Function,+,ibutton_worker_stop_thread,void,iButtonWorker* -Function,+,ibutton_worker_write_blank_start,void,"iButtonWorker*, iButtonKey*" +Function,+,ibutton_worker_write_id_start,void,"iButtonWorker*, iButtonKey*" Function,+,ibutton_worker_write_copy_start,void,"iButtonWorker*, iButtonKey*" Function,+,ibutton_worker_write_set_callback,void,"iButtonWorker*, iButtonWorkerWriteCallback, void*" Function,+,icon_animation_alloc,IconAnimation*,const Icon* From 56fef61c6665a0bbc9df937afd0d0a1aaac55963 Mon Sep 17 00:00:00 2001 From: DerSkythe <31771569+derskythe@users.noreply.github.com> Date: Wed, 31 Jul 2024 21:12:26 +0400 Subject: [PATCH 23/52] fix: Ensure proper closure of variadic function in `mjs_array` (#3798) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The changes ensure that the `va_end` function is always called after `c_vsnprintf` in `mjs_array.c` Co-authored-by: あく --- lib/mjs/mjs_array.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/mjs/mjs_array.c b/lib/mjs/mjs_array.c index c74487d65a..9230436e8b 100644 --- a/lib/mjs/mjs_array.c +++ b/lib/mjs/mjs_array.c @@ -19,8 +19,11 @@ static int v_sprintf_s(char* buf, size_t size, const char* fmt, ...) { size_t n; va_list ap; + va_start(ap, fmt); n = c_vsnprintf(buf, size, fmt, ap); + va_end(ap); + if(n > size) { return size; } From 59eb749b2b89c7b0eaf4a3dba55c542ce7070a6e Mon Sep 17 00:00:00 2001 From: Astra <93453568+Astrrra@users.noreply.github.com> Date: Thu, 1 Aug 2024 05:57:00 +0900 Subject: [PATCH 24/52] [FL-3879] Fix plantain balance string (#3813) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix balance string * nfc app: remove ? in plantain Co-authored-by: hedger Co-authored-by: あく Co-authored-by: gornekich --- applications/main/nfc/plugins/supported_cards/plantain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/nfc/plugins/supported_cards/plantain.c b/applications/main/nfc/plugins/supported_cards/plantain.c index ef46efd65e..1c3a6737f1 100644 --- a/applications/main/nfc/plugins/supported_cards/plantain.c +++ b/applications/main/nfc/plugins/supported_cards/plantain.c @@ -230,7 +230,7 @@ static bool plantain_parse(const NfcDevice* device, FuriString* parsed_data) { } furi_string_printf( - parsed_data, "\e#Plantain\nNo.: %llu?\nBalance:%lu\n", card_number, balance); + parsed_data, "\e#Plantain\nNo.: %llu\nBalance: %lu\n", card_number, balance); parsed = true; } while(false); From f73d60cba8cfaf5783f0987441ce51e735d65cd6 Mon Sep 17 00:00:00 2001 From: Astra <93453568+Astrrra@users.noreply.github.com> Date: Thu, 1 Aug 2024 06:37:37 +0900 Subject: [PATCH 25/52] [FL-3766] Refactor detected protocols list (#3809) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refactor detected protocols list * nfc app: fix detect protocols file name * nfc app: fix function naming * nfc app: fix detected protocol menu selection Co-authored-by: hedger Co-authored-by: あく Co-authored-by: gornekich --- .../main/nfc/helpers/nfc_detected_protocols.c | 85 +++++++++++++++++++ .../main/nfc/helpers/nfc_detected_protocols.h | 29 +++++++ .../protocol_support/nfc_protocol_support.c | 7 +- applications/main/nfc/nfc_app.c | 19 +---- applications/main/nfc/nfc_app_i.h | 9 +- .../main/nfc/scenes/nfc_scene_detect.c | 7 +- .../nfc_scene_mf_ultralight_unlock_warn.c | 6 +- .../nfc/scenes/nfc_scene_select_protocol.c | 19 ++--- .../main/nfc/scenes/nfc_scene_start.c | 2 +- 9 files changed, 137 insertions(+), 46 deletions(-) create mode 100644 applications/main/nfc/helpers/nfc_detected_protocols.c create mode 100644 applications/main/nfc/helpers/nfc_detected_protocols.h diff --git a/applications/main/nfc/helpers/nfc_detected_protocols.c b/applications/main/nfc/helpers/nfc_detected_protocols.c new file mode 100644 index 0000000000..339d4ddc23 --- /dev/null +++ b/applications/main/nfc/helpers/nfc_detected_protocols.c @@ -0,0 +1,85 @@ +#include "nfc_detected_protocols.h" + +#include + +struct NfcDetectedProtocols { + uint32_t protocols_detected_num; + NfcProtocol protocols_detected[NfcProtocolNum]; + uint32_t selected_idx; +}; + +NfcDetectedProtocols* nfc_detected_protocols_alloc(void) { + NfcDetectedProtocols* instance = malloc(sizeof(NfcDetectedProtocols)); + + instance->protocols_detected_num = 0; + instance->selected_idx = 0; + + return instance; +} + +void nfc_detected_protocols_free(NfcDetectedProtocols* instance) { + furi_assert(instance); + + free(instance); +} + +void nfc_detected_protocols_reset(NfcDetectedProtocols* instance) { + furi_assert(instance); + + instance->protocols_detected_num = 0; + memset(instance->protocols_detected, 0, sizeof(instance->protocols_detected)); + instance->selected_idx = 0; +} + +void nfc_detected_protocols_select(NfcDetectedProtocols* instance, uint32_t idx) { + furi_assert(instance); + + instance->selected_idx = idx; +} + +void nfc_detected_protocols_set( + NfcDetectedProtocols* instance, + const NfcProtocol* types, + uint32_t count) { + furi_assert(instance); + furi_assert(types); + furi_assert(count < NfcProtocolNum); + + memcpy(instance->protocols_detected, types, count); + instance->protocols_detected_num = count; + instance->selected_idx = 0; +} + +uint32_t nfc_detected_protocols_get_num(NfcDetectedProtocols* instance) { + furi_assert(instance); + + return instance->protocols_detected_num; +} + +NfcProtocol nfc_detected_protocols_get_protocol(NfcDetectedProtocols* instance, uint32_t idx) { + furi_assert(instance); + furi_assert(idx < instance->protocols_detected_num); + + return instance->protocols_detected[idx]; +} + +void nfc_detected_protocols_fill_all_protocols(NfcDetectedProtocols* instance) { + furi_assert(instance); + + instance->protocols_detected_num = NfcProtocolNum; + for(uint32_t i = 0; i < NfcProtocolNum; i++) { + instance->protocols_detected[i] = i; + } +} + +NfcProtocol nfc_detected_protocols_get_selected(NfcDetectedProtocols* instance) { + furi_assert(instance); + + return instance->protocols_detected[instance->selected_idx]; +} + +uint32_t nfc_detected_protocols_get_selected_idx(NfcDetectedProtocols* instance) { + furi_assert(instance); + + return instance->selected_idx; +} diff --git a/applications/main/nfc/helpers/nfc_detected_protocols.h b/applications/main/nfc/helpers/nfc_detected_protocols.h new file mode 100644 index 0000000000..2ab46add39 --- /dev/null +++ b/applications/main/nfc/helpers/nfc_detected_protocols.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +typedef struct NfcDetectedProtocols NfcDetectedProtocols; + +NfcDetectedProtocols* nfc_detected_protocols_alloc(void); + +void nfc_detected_protocols_free(NfcDetectedProtocols* instance); + +void nfc_detected_protocols_reset(NfcDetectedProtocols* instance); + +void nfc_detected_protocols_select(NfcDetectedProtocols* instance, uint32_t idx); + +void nfc_detected_protocols_set( + NfcDetectedProtocols* instance, + const NfcProtocol* types, + uint32_t count); + +uint32_t nfc_detected_protocols_get_num(NfcDetectedProtocols* instance); + +NfcProtocol nfc_detected_protocols_get_protocol(NfcDetectedProtocols* instance, uint32_t idx); + +void nfc_detected_protocols_fill_all_protocols(NfcDetectedProtocols* instance); + +NfcProtocol nfc_detected_protocols_get_selected(NfcDetectedProtocols* instance); + +uint32_t nfc_detected_protocols_get_selected_idx(NfcDetectedProtocols* instance); diff --git a/applications/main/nfc/helpers/protocol_support/nfc_protocol_support.c b/applications/main/nfc/helpers/protocol_support/nfc_protocol_support.c index 2ba5c65ba1..630b3beef6 100644 --- a/applications/main/nfc/helpers/protocol_support/nfc_protocol_support.c +++ b/applications/main/nfc/helpers/protocol_support/nfc_protocol_support.c @@ -150,8 +150,7 @@ static void nfc_protocol_support_scene_read_on_enter(NfcApp* instance) { view_dispatcher_switch_to_view(instance->view_dispatcher, NfcViewPopup); - const NfcProtocol protocol = - instance->protocols_detected[instance->protocols_detected_selected_idx]; + const NfcProtocol protocol = nfc_detected_protocols_get_selected(instance->detected_protocols); instance->poller = nfc_poller_alloc(instance->nfc, protocol); view_dispatcher_switch_to_view(instance->view_dispatcher, NfcViewPopup); @@ -186,7 +185,7 @@ static bool nfc_protocol_support_scene_read_on_event(NfcApp* instance, SceneMana consumed = true; } else { const NfcProtocol protocol = - instance->protocols_detected[instance->protocols_detected_selected_idx]; + nfc_detected_protocols_get_selected(instance->detected_protocols); consumed = nfc_protocol_support[protocol]->scene_read.on_event(instance, event); } } else if(event.event == NfcCustomEventPollerFailure) { @@ -199,7 +198,7 @@ static bool nfc_protocol_support_scene_read_on_event(NfcApp* instance, SceneMana consumed = true; } else if(event.event == NfcCustomEventCardDetected) { const NfcProtocol protocol = - instance->protocols_detected[instance->protocols_detected_selected_idx]; + nfc_detected_protocols_get_selected(instance->detected_protocols); consumed = nfc_protocol_support[protocol]->scene_read.on_event(instance, event); } } else if(event.type == SceneManagerEventTypeBack) { diff --git a/applications/main/nfc/nfc_app.c b/applications/main/nfc/nfc_app.c index 62a1206f11..f3aa5e7240 100644 --- a/applications/main/nfc/nfc_app.c +++ b/applications/main/nfc/nfc_app.c @@ -50,6 +50,7 @@ NfcApp* nfc_app_alloc(void) { instance->nfc = nfc_alloc(); + instance->detected_protocols = nfc_detected_protocols_alloc(); instance->felica_auth = felica_auth_alloc(); instance->mf_ul_auth = mf_ultralight_auth_alloc(); instance->slix_unlock = slix_unlock_alloc(); @@ -142,6 +143,7 @@ void nfc_app_free(NfcApp* instance) { nfc_free(instance->nfc); + nfc_detected_protocols_free(instance->detected_protocols); felica_auth_free(instance->felica_auth); mf_ultralight_auth_free(instance->mf_ul_auth); slix_unlock_free(instance->slix_unlock); @@ -433,23 +435,6 @@ void nfc_show_loading_popup(void* context, bool show) { } } -void nfc_app_set_detected_protocols(NfcApp* instance, const NfcProtocol* types, uint32_t count) { - furi_assert(instance); - furi_assert(types); - furi_assert(count < NfcProtocolNum); - - memcpy(instance->protocols_detected, types, count); - instance->protocols_detected_num = count; - instance->protocols_detected_selected_idx = 0; -} - -void nfc_app_reset_detected_protocols(NfcApp* instance) { - furi_assert(instance); - - instance->protocols_detected_selected_idx = 0; - instance->protocols_detected_num = 0; -} - void nfc_append_filename_string_when_present(NfcApp* instance, FuriString* string) { furi_assert(instance); furi_assert(string); diff --git a/applications/main/nfc/nfc_app_i.h b/applications/main/nfc/nfc_app_i.h index c91ef33df0..0a09fa9245 100644 --- a/applications/main/nfc/nfc_app_i.h +++ b/applications/main/nfc/nfc_app_i.h @@ -26,6 +26,7 @@ #include "views/dict_attack.h" #include +#include "helpers/nfc_detected_protocols.h" #include "helpers/nfc_custom_event.h" #include "helpers/mf_ultralight_auth.h" #include "helpers/mf_user_dict.h" @@ -106,9 +107,7 @@ struct NfcApp { FuriString* text_box_store; uint8_t byte_input_store[NFC_BYTE_INPUT_STORE_SIZE]; - uint32_t protocols_detected_num; - NfcProtocol protocols_detected[NfcProtocolNum]; - uint32_t protocols_detected_selected_idx; + NfcDetectedProtocols* detected_protocols; RpcAppSystem* rpc_ctx; NfcRpcState rpc_state; @@ -193,8 +192,4 @@ bool nfc_save_file(NfcApp* instance, FuriString* path); void nfc_make_app_folder(NfcApp* instance); -void nfc_app_set_detected_protocols(NfcApp* instance, const NfcProtocol* types, uint32_t count); - -void nfc_app_reset_detected_protocols(NfcApp* instance); - void nfc_append_filename_string_when_present(NfcApp* instance, FuriString* string); diff --git a/applications/main/nfc/scenes/nfc_scene_detect.c b/applications/main/nfc/scenes/nfc_scene_detect.c index 3ef153657d..7ef3f9d870 100644 --- a/applications/main/nfc/scenes/nfc_scene_detect.c +++ b/applications/main/nfc/scenes/nfc_scene_detect.c @@ -7,7 +7,8 @@ void nfc_scene_detect_scan_callback(NfcScannerEvent event, void* context) { NfcApp* instance = context; if(event.type == NfcScannerEventTypeDetected) { - nfc_app_set_detected_protocols(instance, event.data.protocols, event.data.protocol_num); + nfc_detected_protocols_set( + instance->detected_protocols, event.data.protocols, event.data.protocol_num); view_dispatcher_send_custom_event(instance->view_dispatcher, NfcCustomEventWorkerExit); } } @@ -23,7 +24,7 @@ void nfc_scene_detect_on_enter(void* context) { popup_set_icon(instance->popup, 0, 8, &I_NFC_manual_60x50); view_dispatcher_switch_to_view(instance->view_dispatcher, NfcViewPopup); - nfc_app_reset_detected_protocols(instance); + nfc_detected_protocols_reset(instance->detected_protocols); instance->scanner = nfc_scanner_alloc(instance->nfc); nfc_scanner_start(instance->scanner, nfc_scene_detect_scan_callback, instance); @@ -37,7 +38,7 @@ bool nfc_scene_detect_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == NfcCustomEventWorkerExit) { - if(instance->protocols_detected_num > 1) { + if(nfc_detected_protocols_get_num(instance->detected_protocols) > 1) { notification_message(instance->notifications, &sequence_single_vibro); scene_manager_next_scene(instance->scene_manager, NfcSceneSelectProtocol); } else { diff --git a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_unlock_warn.c b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_unlock_warn.c index 4df8a62899..a0b6986d1e 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_unlock_warn.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_unlock_warn.c @@ -57,7 +57,8 @@ bool nfc_scene_mf_ultralight_unlock_warn_on_event(void* context, SceneManagerEve if(event.type == SceneManagerEventTypeCustom) { if(event.event == DialogExResultRight) { const NfcProtocol mfu_protocol[] = {NfcProtocolMfUltralight}; - nfc_app_set_detected_protocols(nfc, mfu_protocol, COUNT_OF(mfu_protocol)); + nfc_detected_protocols_set( + nfc->detected_protocols, mfu_protocol, COUNT_OF(mfu_protocol)); scene_manager_next_scene(nfc->scene_manager, NfcSceneRead); dolphin_deed(DolphinDeedNfcRead); consumed = true; @@ -77,7 +78,8 @@ bool nfc_scene_mf_ultralight_unlock_warn_on_event(void* context, SceneManagerEve if(event.type == SceneManagerEventTypeCustom) { if(event.event == DialogExResultCenter) { const NfcProtocol mfu_protocol[] = {NfcProtocolMfUltralight}; - nfc_app_set_detected_protocols(nfc, mfu_protocol, COUNT_OF(mfu_protocol)); + nfc_detected_protocols_set( + nfc->detected_protocols, mfu_protocol, COUNT_OF(mfu_protocol)); scene_manager_next_scene(nfc->scene_manager, NfcSceneRead); dolphin_deed(DolphinDeedNfcRead); consumed = true; diff --git a/applications/main/nfc/scenes/nfc_scene_select_protocol.c b/applications/main/nfc/scenes/nfc_scene_select_protocol.c index af644035e8..f2c92b6313 100644 --- a/applications/main/nfc/scenes/nfc_scene_select_protocol.c +++ b/applications/main/nfc/scenes/nfc_scene_select_protocol.c @@ -14,21 +14,19 @@ void nfc_scene_select_protocol_on_enter(void* context) { const char* prefix; if(scene_manager_has_previous_scene(instance->scene_manager, NfcSceneExtraActions)) { prefix = "Read"; - instance->protocols_detected_num = NfcProtocolNum; - for(uint32_t i = 0; i < NfcProtocolNum; i++) { - instance->protocols_detected[i] = i; - } + nfc_detected_protocols_fill_all_protocols(instance->detected_protocols); } else { prefix = "Read as"; submenu_set_header(submenu, "Multi-protocol card"); } - for(uint32_t i = 0; i < instance->protocols_detected_num; i++) { + for(uint32_t i = 0; i < nfc_detected_protocols_get_num(instance->detected_protocols); i++) { furi_string_printf( temp_str, "%s %s", prefix, - nfc_device_get_protocol_name(instance->protocols_detected[i])); + nfc_device_get_protocol_name( + nfc_detected_protocols_get_protocol(instance->detected_protocols, i))); furi_string_replace_str(temp_str, "Mifare", "MIFARE"); submenu_add_item( @@ -40,9 +38,8 @@ void nfc_scene_select_protocol_on_enter(void* context) { } furi_string_free(temp_str); - const uint32_t state = - scene_manager_get_scene_state(instance->scene_manager, NfcSceneSelectProtocol); - submenu_set_selected_item(submenu, state); + submenu_set_selected_item( + submenu, nfc_detected_protocols_get_selected_idx(instance->detected_protocols)); view_dispatcher_switch_to_view(instance->view_dispatcher, NfcViewMenu); } @@ -52,10 +49,8 @@ bool nfc_scene_select_protocol_on_event(void* context, SceneManagerEvent event) bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - instance->protocols_detected_selected_idx = event.event; + nfc_detected_protocols_select(instance->detected_protocols, event.event); scene_manager_next_scene(instance->scene_manager, NfcSceneRead); - scene_manager_set_scene_state( - instance->scene_manager, NfcSceneSelectProtocol, event.event); consumed = true; } else if(event.type == SceneManagerEventTypeBack) { if(scene_manager_has_previous_scene(instance->scene_manager, NfcSceneDetect)) { diff --git a/applications/main/nfc/scenes/nfc_scene_start.c b/applications/main/nfc/scenes/nfc_scene_start.c index e8774b4aa5..53857b8495 100644 --- a/applications/main/nfc/scenes/nfc_scene_start.c +++ b/applications/main/nfc/scenes/nfc_scene_start.c @@ -25,7 +25,7 @@ void nfc_scene_start_on_enter(void* context) { nfc_device_clear(nfc->nfc_device); iso14443_3a_reset(nfc->iso14443_3a_edit_data); // Reset detected protocols list - nfc_app_reset_detected_protocols(nfc); + nfc_detected_protocols_reset(nfc->detected_protocols); submenu_add_item(submenu, "Read", SubmenuIndexRead, nfc_scene_start_submenu_callback, nfc); submenu_add_item( From 53cf700521f4060069d69196aa266ef646e5b307 Mon Sep 17 00:00:00 2001 From: Filipe Paz Rodrigues Date: Wed, 31 Jul 2024 16:44:04 -0500 Subject: [PATCH 26/52] CCID App: Refactor (#3808) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Move iso7816 related code to its own folder - Refactor Iso7816Callback into Iso7816Handler - Created new file for CCID commands - Renamed variables according to standard Co-authored-by: あく --- applications/debug/ccid_test/ccid_test_app.c | 179 ++---------------- .../debug/ccid_test/ccid_test_app_commands.c | 123 ++++++++++++ .../debug/ccid_test/ccid_test_app_commands.h | 7 + .../ccid_test/{ => iso7816}/iso7816_atr.h | 0 .../debug/ccid_test/iso7816/iso7816_handler.c | 68 +++++++ .../debug/ccid_test/iso7816/iso7816_handler.h | 18 ++ .../{ => iso7816}/iso7816_response.c | 0 .../{ => iso7816}/iso7816_response.h | 0 .../ccid_test/{ => iso7816}/iso7816_t0_apdu.c | 13 +- .../ccid_test/{ => iso7816}/iso7816_t0_apdu.h | 9 +- .../debug/ccid_test/iso7816_callbacks.c | 65 ------- .../debug/ccid_test/iso7816_callbacks.h | 21 -- 12 files changed, 248 insertions(+), 255 deletions(-) create mode 100644 applications/debug/ccid_test/ccid_test_app_commands.c create mode 100644 applications/debug/ccid_test/ccid_test_app_commands.h rename applications/debug/ccid_test/{ => iso7816}/iso7816_atr.h (100%) create mode 100644 applications/debug/ccid_test/iso7816/iso7816_handler.c create mode 100644 applications/debug/ccid_test/iso7816/iso7816_handler.h rename applications/debug/ccid_test/{ => iso7816}/iso7816_response.c (100%) rename applications/debug/ccid_test/{ => iso7816}/iso7816_response.h (100%) rename applications/debug/ccid_test/{ => iso7816}/iso7816_t0_apdu.c (85%) rename applications/debug/ccid_test/{ => iso7816}/iso7816_t0_apdu.h (81%) delete mode 100644 applications/debug/ccid_test/iso7816_callbacks.c delete mode 100644 applications/debug/ccid_test/iso7816_callbacks.h diff --git a/applications/debug/ccid_test/ccid_test_app.c b/applications/debug/ccid_test/ccid_test_app.c index 46a1237f93..abb8ad3dd3 100644 --- a/applications/debug/ccid_test/ccid_test_app.c +++ b/applications/debug/ccid_test/ccid_test_app.c @@ -6,10 +6,13 @@ #include #include #include -#include "iso7816_callbacks.h" -#include "iso7816_t0_apdu.h" -#include "iso7816_atr.h" -#include "iso7816_response.h" + +#include "iso7816/iso7816_handler.h" +#include "iso7816/iso7816_t0_apdu.h" +#include "iso7816/iso7816_atr.h" +#include "iso7816/iso7816_response.h" + +#include "ccid_test_app_commands.h" typedef enum { EventTypeInput, @@ -20,6 +23,7 @@ typedef struct { ViewPort* view_port; FuriMessageQueue* event_queue; FuriHalUsbCcidConfig ccid_cfg; + Iso7816Handler* iso7816_handler; } CcidTestApp; typedef struct { @@ -63,6 +67,15 @@ uint32_t ccid_test_exit(void* context) { CcidTestApp* ccid_test_app_alloc(void) { CcidTestApp* app = malloc(sizeof(CcidTestApp)); + //setup CCID USB + // On linux: set VID PID using: /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist + app->ccid_cfg.vid = 0x076B; + app->ccid_cfg.pid = 0x3A21; + + app->iso7816_handler = iso7816_handler_alloc(); + app->iso7816_handler->iso7816_answer_to_reset = iso7816_answer_to_reset; + app->iso7816_handler->iso7816_process_command = iso7816_process_command; + // Gui app->gui = furi_record_open(RECORD_GUI); @@ -92,174 +105,26 @@ void ccid_test_app_free(CcidTestApp* app) { furi_record_close(RECORD_GUI); app->gui = NULL; + free(app->iso7816_handler); + // Free rest free(app); } -void ccid_icc_power_on_callback(uint8_t* atrBuffer, uint32_t* atrlen, void* context) { - UNUSED(context); - - iso7816_icc_power_on_callback(atrBuffer, atrlen); -} - -void ccid_xfr_datablock_callback( - const uint8_t* pcToReaderDataBlock, - uint32_t pcToReaderDataBlockLen, - uint8_t* readerToPcDataBlock, - uint32_t* readerToPcDataBlockLen, - void* context) { - UNUSED(context); - - iso7816_xfr_datablock_callback( - pcToReaderDataBlock, pcToReaderDataBlockLen, readerToPcDataBlock, readerToPcDataBlockLen); -} - -static const CcidCallbacks ccid_cb = { - ccid_icc_power_on_callback, - ccid_xfr_datablock_callback, -}; - -//Instruction 1: returns an OK response unconditionally -//APDU example: 0x01:0x01:0x00:0x00 -//response: SW1=0x90, SW2=0x00 -void handle_instruction_01(ISO7816_Response_APDU* responseAPDU) { - responseAPDU->DataLen = 0; - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_OK); -} - -//Instruction 2: expect command with no body, replies wit with a body with two bytes -//APDU example: 0x01:0x02:0x00:0x00:0x02 -//response: 'bc' (0x62, 0x63) SW1=0x90, SW2=0x00 -void handle_instruction_02( - uint8_t p1, - uint8_t p2, - uint16_t lc, - uint16_t le, - ISO7816_Response_APDU* responseAPDU) { - if(p1 == 0 && p2 == 0 && lc == 0 && le >= 2) { - responseAPDU->Data[0] = 0x62; - responseAPDU->Data[1] = 0x63; - - responseAPDU->DataLen = 2; - - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_OK); - } else if(p1 != 0 || p2 != 0) { - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_WRONG_PARAMETERS_P1_P2); - } else { - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_WRONG_LENGTH); - } -} - -//Instruction 3: sends a command with a body with two bytes, receives a response with no bytes -//APDU example: 0x01:0x03:0x00:0x00:0x02:CA:FE -//response SW1=0x90, SW2=0x00 -void handle_instruction_03( - uint8_t p1, - uint8_t p2, - uint16_t lc, - ISO7816_Response_APDU* responseAPDU) { - if(p1 == 0 && p2 == 0 && lc == 2) { - responseAPDU->DataLen = 0; - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_OK); - } else if(p1 != 0 || p2 != 0) { - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_WRONG_PARAMETERS_P1_P2); - } else { - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_WRONG_LENGTH); - } -} - -//instruction 4: sends a command with a body with 'n' bytes, receives a response with 'n' bytes -//APDU example: 0x01:0x04:0x00:0x00:0x04:0x01:0x02:0x03:0x04:0x04 -//receives (0x01, 0x02, 0x03, 0x04) SW1=0x90, SW2=0x00 -void handle_instruction_04( - uint8_t p1, - uint8_t p2, - uint16_t lc, - uint16_t le, - const uint8_t* commandApduDataBuffer, - ISO7816_Response_APDU* responseAPDU) { - if(p1 == 0 && p2 == 0 && lc > 0 && le > 0 && le >= lc) { - for(uint16_t i = 0; i < lc; i++) { - responseAPDU->Data[i] = commandApduDataBuffer[i]; - } - - responseAPDU->DataLen = lc; - - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_OK); - } else if(p1 != 0 || p2 != 0) { - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_WRONG_PARAMETERS_P1_P2); - } else { - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_WRONG_LENGTH); - } -} - -void iso7816_answer_to_reset(Iso7816Atr* atr) { - //minimum valid ATR: https://smartcard-atr.apdu.fr/parse?ATR=3B+00 - atr->TS = 0x3B; - atr->T0 = 0x00; -} - -void iso7816_process_command( - const ISO7816_Command_APDU* commandAPDU, - ISO7816_Response_APDU* responseAPDU) { - //example 1: sends a command with no body, receives a response with no body - //sends APDU 0x01:0x01:0x00:0x00 - //receives SW1=0x90, SW2=0x00 - - if(commandAPDU->CLA == 0x01) { - switch(commandAPDU->INS) { - case 0x01: - handle_instruction_01(responseAPDU); - break; - case 0x02: - handle_instruction_02( - commandAPDU->P1, commandAPDU->P2, commandAPDU->Lc, commandAPDU->Le, responseAPDU); - break; - case 0x03: - handle_instruction_03(commandAPDU->P1, commandAPDU->P2, commandAPDU->Lc, responseAPDU); - break; - case 0x04: - handle_instruction_04( - commandAPDU->P1, - commandAPDU->P2, - commandAPDU->Lc, - commandAPDU->Le, - commandAPDU->Data, - responseAPDU); - break; - default: - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_INSTRUCTION_NOT_SUPPORTED); - } - } else { - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_CLASS_NOT_SUPPORTED); - } -} - -static const Iso7816Callbacks iso87816_cb = { - iso7816_answer_to_reset, - iso7816_process_command, -}; - int32_t ccid_test_app(void* p) { UNUSED(p); //setup view CcidTestApp* app = ccid_test_app_alloc(); - //setup CCID USB - // On linux: set VID PID using: /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist - app->ccid_cfg.vid = 0x076B; - app->ccid_cfg.pid = 0x3A21; - FuriHalUsbInterface* usb_mode_prev = furi_hal_usb_get_config(); furi_hal_usb_unlock(); furi_check(furi_hal_usb_set_config(&usb_ccid, &app->ccid_cfg) == true); - furi_hal_usb_ccid_set_callbacks((CcidCallbacks*)&ccid_cb, NULL); + furi_hal_usb_ccid_set_callbacks( + (CcidCallbacks*)&app->iso7816_handler->ccid_callbacks, app->iso7816_handler); furi_hal_usb_ccid_insert_smartcard(); - iso7816_set_callbacks((Iso7816Callbacks*)&iso87816_cb); - //handle button events CcidTestAppEvent event; while(1) { @@ -280,8 +145,6 @@ int32_t ccid_test_app(void* p) { furi_hal_usb_ccid_set_callbacks(NULL, NULL); furi_hal_usb_set_config(usb_mode_prev, NULL); - iso7816_set_callbacks(NULL); - //teardown view ccid_test_app_free(app); return 0; diff --git a/applications/debug/ccid_test/ccid_test_app_commands.c b/applications/debug/ccid_test/ccid_test_app_commands.c new file mode 100644 index 0000000000..1daaa70c39 --- /dev/null +++ b/applications/debug/ccid_test/ccid_test_app_commands.c @@ -0,0 +1,123 @@ +#include "iso7816/iso7816_t0_apdu.h" +#include "iso7816/iso7816_response.h" + +//Instruction 1: returns an OK response unconditionally +//APDU example: 0x01:0x01:0x00:0x00 +//response: SW1=0x90, SW2=0x00 +void handle_instruction_01(ISO7816_Response_APDU* response_apdu) { + response_apdu->DataLen = 0; + iso7816_set_response(response_apdu, ISO7816_RESPONSE_OK); +} + +//Instruction 2: expect command with no body, replies wit with a body with two bytes +//APDU example: 0x01:0x02:0x00:0x00:0x02 +//response: 'bc' (0x62, 0x63) SW1=0x90, SW2=0x00 +void handle_instruction_02( + uint8_t p1, + uint8_t p2, + uint16_t lc, + uint16_t le, + ISO7816_Response_APDU* response_apdu) { + if(p1 == 0 && p2 == 0 && lc == 0 && le >= 2) { + response_apdu->Data[0] = 0x62; + response_apdu->Data[1] = 0x63; + + response_apdu->DataLen = 2; + + iso7816_set_response(response_apdu, ISO7816_RESPONSE_OK); + } else if(p1 != 0 || p2 != 0) { + iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_PARAMETERS_P1_P2); + } else { + iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_LENGTH); + } +} + +//Instruction 3: sends a command with a body with two bytes, receives a response with no bytes +//APDU example: 0x01:0x03:0x00:0x00:0x02:CA:FE +//response SW1=0x90, SW2=0x00 +void handle_instruction_03( + uint8_t p1, + uint8_t p2, + uint16_t lc, + ISO7816_Response_APDU* response_apdu) { + if(p1 == 0 && p2 == 0 && lc == 2) { + response_apdu->DataLen = 0; + iso7816_set_response(response_apdu, ISO7816_RESPONSE_OK); + } else if(p1 != 0 || p2 != 0) { + iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_PARAMETERS_P1_P2); + } else { + iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_LENGTH); + } +} + +//instruction 4: sends a command with a body with 'n' bytes, receives a response with 'n' bytes +//APDU example: 0x01:0x04:0x00:0x00:0x04:0x01:0x02:0x03:0x04:0x04 +//receives (0x01, 0x02, 0x03, 0x04) SW1=0x90, SW2=0x00 +void handle_instruction_04( + uint8_t p1, + uint8_t p2, + uint16_t lc, + uint16_t le, + const uint8_t* command_apdu_data_buffer, + ISO7816_Response_APDU* response_apdu) { + if(p1 == 0 && p2 == 0 && lc > 0 && le > 0 && le >= lc) { + for(uint16_t i = 0; i < lc; i++) { + response_apdu->Data[i] = command_apdu_data_buffer[i]; + } + + response_apdu->DataLen = lc; + + iso7816_set_response(response_apdu, ISO7816_RESPONSE_OK); + } else if(p1 != 0 || p2 != 0) { + iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_PARAMETERS_P1_P2); + } else { + iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_LENGTH); + } +} + +void iso7816_answer_to_reset(Iso7816Atr* atr) { + //minimum valid ATR: https://smartcard-atr.apdu.fr/parse?ATR=3B+00 + atr->TS = 0x3B; + atr->T0 = 0x00; +} + +void iso7816_process_command( + const ISO7816_Command_APDU* command_apdu, + ISO7816_Response_APDU* response_apdu) { + //example 1: sends a command with no body, receives a response with no body + //sends APDU 0x01:0x01:0x00:0x00 + //receives SW1=0x90, SW2=0x00 + + if(command_apdu->CLA == 0x01) { + switch(command_apdu->INS) { + case 0x01: + handle_instruction_01(response_apdu); + break; + case 0x02: + handle_instruction_02( + command_apdu->P1, + command_apdu->P2, + command_apdu->Lc, + command_apdu->Le, + response_apdu); + break; + case 0x03: + handle_instruction_03( + command_apdu->P1, command_apdu->P2, command_apdu->Lc, response_apdu); + break; + case 0x04: + handle_instruction_04( + command_apdu->P1, + command_apdu->P2, + command_apdu->Lc, + command_apdu->Le, + command_apdu->Data, + response_apdu); + break; + default: + iso7816_set_response(response_apdu, ISO7816_RESPONSE_INSTRUCTION_NOT_SUPPORTED); + } + } else { + iso7816_set_response(response_apdu, ISO7816_RESPONSE_CLASS_NOT_SUPPORTED); + } +} diff --git a/applications/debug/ccid_test/ccid_test_app_commands.h b/applications/debug/ccid_test/ccid_test_app_commands.h new file mode 100644 index 0000000000..ca3275aec1 --- /dev/null +++ b/applications/debug/ccid_test/ccid_test_app_commands.h @@ -0,0 +1,7 @@ +#include "iso7816/iso7816_t0_apdu.h" + +void iso7816_answer_to_reset(Iso7816Atr* atr); + +void iso7816_process_command( + const ISO7816_Command_APDU* command_apdu, + ISO7816_Response_APDU* response_apdu); diff --git a/applications/debug/ccid_test/iso7816_atr.h b/applications/debug/ccid_test/iso7816/iso7816_atr.h similarity index 100% rename from applications/debug/ccid_test/iso7816_atr.h rename to applications/debug/ccid_test/iso7816/iso7816_atr.h diff --git a/applications/debug/ccid_test/iso7816/iso7816_handler.c b/applications/debug/ccid_test/iso7816/iso7816_handler.c new file mode 100644 index 0000000000..97214d1b22 --- /dev/null +++ b/applications/debug/ccid_test/iso7816/iso7816_handler.c @@ -0,0 +1,68 @@ +// transforms low level calls such as XFRCallback or ICC Power on to a structured one +// an application can register these calls and listen for the callbacks defined in Iso7816Callbacks + +#include +#include +#include +#include + +#include "iso7816_t0_apdu.h" +#include "iso7816_atr.h" +#include "iso7816_handler.h" +#include "iso7816_response.h" + +void iso7816_icc_power_on_callback(uint8_t* atr_data, uint32_t* atr_data_len, void* context) { + furi_check(context); + + Iso7816Handler* handler = (Iso7816Handler*)context; + + Iso7816Atr iso7816_atr; + handler->iso7816_answer_to_reset(&iso7816_atr); + + furi_assert(iso7816_atr.T0 == 0x00); + + uint8_t atr_buffer[2] = {iso7816_atr.TS, iso7816_atr.T0}; + + *atr_data_len = 2; + + memcpy(atr_data, atr_buffer, sizeof(uint8_t) * (*atr_data_len)); +} + +//dataBlock points to the buffer +//dataBlockLen tells reader how nany bytes should be read +void iso7816_xfr_datablock_callback( + const uint8_t* pc_to_reader_datablock, + uint32_t pc_to_reader_datablock_len, + uint8_t* reader_to_pc_datablock, + uint32_t* reader_to_pc_datablock_len, + void* context) { + furi_check(context); + + Iso7816Handler* handler = (Iso7816Handler*)context; + + ISO7816_Response_APDU* response_apdu = (ISO7816_Response_APDU*)&handler->response_apdu_buffer; + + ISO7816_Command_APDU* command_apdu = (ISO7816_Command_APDU*)&handler->command_apdu_buffer; + + uint8_t result = iso7816_read_command_apdu( + command_apdu, pc_to_reader_datablock, pc_to_reader_datablock_len); + + if(result == ISO7816_READ_COMMAND_APDU_OK) { + handler->iso7816_process_command(command_apdu, response_apdu); + + furi_assert(response_apdu->DataLen < CCID_SHORT_APDU_SIZE); + } else if(result == ISO7816_READ_COMMAND_APDU_ERROR_WRONG_LE) { + iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_LE); + } else if(result == ISO7816_READ_COMMAND_APDU_ERROR_WRONG_LENGTH) { + iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_LENGTH); + } + + iso7816_write_response_apdu(response_apdu, reader_to_pc_datablock, reader_to_pc_datablock_len); +} + +Iso7816Handler* iso7816_handler_alloc() { + Iso7816Handler* handler = malloc(sizeof(Iso7816Handler)); + handler->ccid_callbacks.icc_power_on_callback = iso7816_icc_power_on_callback; + handler->ccid_callbacks.xfr_datablock_callback = iso7816_xfr_datablock_callback; + return handler; +} diff --git a/applications/debug/ccid_test/iso7816/iso7816_handler.h b/applications/debug/ccid_test/iso7816/iso7816_handler.h new file mode 100644 index 0000000000..d67118ce6e --- /dev/null +++ b/applications/debug/ccid_test/iso7816/iso7816_handler.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include "iso7816_atr.h" +#include "iso7816_t0_apdu.h" + +typedef struct { + CcidCallbacks ccid_callbacks; + void (*iso7816_answer_to_reset)(Iso7816Atr* atr); + void (*iso7816_process_command)( + const ISO7816_Command_APDU* command, + ISO7816_Response_APDU* response); + + uint8_t command_apdu_buffer[sizeof(ISO7816_Command_APDU) + CCID_SHORT_APDU_SIZE]; + uint8_t response_apdu_buffer[sizeof(ISO7816_Response_APDU) + CCID_SHORT_APDU_SIZE]; +} Iso7816Handler; + +Iso7816Handler* iso7816_handler_alloc(); diff --git a/applications/debug/ccid_test/iso7816_response.c b/applications/debug/ccid_test/iso7816/iso7816_response.c similarity index 100% rename from applications/debug/ccid_test/iso7816_response.c rename to applications/debug/ccid_test/iso7816/iso7816_response.c diff --git a/applications/debug/ccid_test/iso7816_response.h b/applications/debug/ccid_test/iso7816/iso7816_response.h similarity index 100% rename from applications/debug/ccid_test/iso7816_response.h rename to applications/debug/ccid_test/iso7816/iso7816_response.h diff --git a/applications/debug/ccid_test/iso7816_t0_apdu.c b/applications/debug/ccid_test/iso7816/iso7816_t0_apdu.c similarity index 85% rename from applications/debug/ccid_test/iso7816_t0_apdu.c rename to applications/debug/ccid_test/iso7816/iso7816_t0_apdu.c index 3de5555f49..216f2582f1 100644 --- a/applications/debug/ccid_test/iso7816_t0_apdu.c +++ b/applications/debug/ccid_test/iso7816/iso7816_t0_apdu.c @@ -61,24 +61,25 @@ uint8_t iso7816_read_command_apdu( //data buffer contains the whole APU response (response + trailer (SW1+SW2)) void iso7816_write_response_apdu( const ISO7816_Response_APDU* response, - uint8_t* readerToPcDataBlock, - uint32_t* readerToPcDataBlockLen) { + uint8_t* reader_to_pc_datablock, + uint32_t* reader_to_pc_datablock_len) { uint32_t responseDataBufferIndex = 0; //response body if(response->DataLen > 0) { while(responseDataBufferIndex < response->DataLen) { - readerToPcDataBlock[responseDataBufferIndex] = response->Data[responseDataBufferIndex]; + reader_to_pc_datablock[responseDataBufferIndex] = + response->Data[responseDataBufferIndex]; responseDataBufferIndex++; } } //trailer - readerToPcDataBlock[responseDataBufferIndex] = response->SW1; + reader_to_pc_datablock[responseDataBufferIndex] = response->SW1; responseDataBufferIndex++; - readerToPcDataBlock[responseDataBufferIndex] = response->SW2; + reader_to_pc_datablock[responseDataBufferIndex] = response->SW2; responseDataBufferIndex++; - *readerToPcDataBlockLen = responseDataBufferIndex; + *reader_to_pc_datablock_len = responseDataBufferIndex; } diff --git a/applications/debug/ccid_test/iso7816_t0_apdu.h b/applications/debug/ccid_test/iso7816/iso7816_t0_apdu.h similarity index 81% rename from applications/debug/ccid_test/iso7816_t0_apdu.h rename to applications/debug/ccid_test/iso7816/iso7816_t0_apdu.h index 50eb476a9c..a21dfbafc3 100644 --- a/applications/debug/ccid_test/iso7816_t0_apdu.h +++ b/applications/debug/ccid_test/iso7816/iso7816_t0_apdu.h @@ -31,12 +31,11 @@ typedef struct { uint8_t Data[0]; } FURI_PACKED ISO7816_Response_APDU; -void iso7816_answer_to_reset(Iso7816Atr* atr); uint8_t iso7816_read_command_apdu( ISO7816_Command_APDU* command, - const uint8_t* pcToReaderDataBlock, - uint32_t pcToReaderDataBlockLen); + const uint8_t* pc_to_reader_datablock, + uint32_t pc_to_reader_datablock_len); void iso7816_write_response_apdu( const ISO7816_Response_APDU* response, - uint8_t* readerToPcDataBlock, - uint32_t* readerToPcDataBlockLen); + uint8_t* reader_to_pc_datablock, + uint32_t* reader_to_pc_datablock_len); diff --git a/applications/debug/ccid_test/iso7816_callbacks.c b/applications/debug/ccid_test/iso7816_callbacks.c deleted file mode 100644 index 6c1bb106a9..0000000000 --- a/applications/debug/ccid_test/iso7816_callbacks.c +++ /dev/null @@ -1,65 +0,0 @@ -// transforms low level calls such as XFRCallback or ICC Power on to a structured one -// an application can register these calls and listen for the callbacks defined in Iso7816Callbacks - -#include -#include -#include -#include - -#include "iso7816_t0_apdu.h" -#include "iso7816_atr.h" -#include "iso7816_callbacks.h" -#include "iso7816_response.h" - -static Iso7816Callbacks* callbacks = NULL; - -static uint8_t commandApduBuffer[sizeof(ISO7816_Command_APDU) + CCID_SHORT_APDU_SIZE]; -static uint8_t responseApduBuffer[sizeof(ISO7816_Response_APDU) + CCID_SHORT_APDU_SIZE]; - -void iso7816_set_callbacks(Iso7816Callbacks* cb) { - callbacks = cb; -} - -void iso7816_icc_power_on_callback(uint8_t* atrBuffer, uint32_t* atrlen) { - Iso7816Atr atr; - callbacks->iso7816_answer_to_reset(&atr); - - furi_assert(atr.T0 == 0x00); - - uint8_t AtrBuffer[2] = {atr.TS, atr.T0}; - - *atrlen = 2; - - memcpy(atrBuffer, AtrBuffer, sizeof(uint8_t) * (*atrlen)); -} - -//dataBlock points to the buffer -//dataBlockLen tells reader how nany bytes should be read -void iso7816_xfr_datablock_callback( - const uint8_t* pcToReaderDataBlock, - uint32_t pcToReaderDataBlockLen, - uint8_t* readerToPcDataBlock, - uint32_t* readerToPcDataBlockLen) { - ISO7816_Response_APDU* responseAPDU = (ISO7816_Response_APDU*)&responseApduBuffer; - - if(callbacks != NULL) { - ISO7816_Command_APDU* commandAPDU = (ISO7816_Command_APDU*)&commandApduBuffer; - - uint8_t result = - iso7816_read_command_apdu(commandAPDU, pcToReaderDataBlock, pcToReaderDataBlockLen); - - if(result == ISO7816_READ_COMMAND_APDU_OK) { - callbacks->iso7816_process_command(commandAPDU, responseAPDU); - - furi_assert(responseAPDU->DataLen < CCID_SHORT_APDU_SIZE); - } else if(result == ISO7816_READ_COMMAND_APDU_ERROR_WRONG_LE) { - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_WRONG_LE); - } else if(result == ISO7816_READ_COMMAND_APDU_ERROR_WRONG_LENGTH) { - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_WRONG_LENGTH); - } - } else { - iso7816_set_response(responseAPDU, ISO7816_RESPONSE_INTERNAL_EXCEPTION); - } - - iso7816_write_response_apdu(responseAPDU, readerToPcDataBlock, readerToPcDataBlockLen); -} diff --git a/applications/debug/ccid_test/iso7816_callbacks.h b/applications/debug/ccid_test/iso7816_callbacks.h deleted file mode 100644 index 6b408c7f50..0000000000 --- a/applications/debug/ccid_test/iso7816_callbacks.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include -#include "iso7816_atr.h" -#include "iso7816_t0_apdu.h" - -typedef struct { - void (*iso7816_answer_to_reset)(Iso7816Atr* atr); - void (*iso7816_process_command)( - const ISO7816_Command_APDU* command, - ISO7816_Response_APDU* response); -} Iso7816Callbacks; - -void iso7816_set_callbacks(Iso7816Callbacks* cb); - -void iso7816_icc_power_on_callback(uint8_t* atrBuffer, uint32_t* atrlen); -void iso7816_xfr_datablock_callback( - const uint8_t* dataBlock, - uint32_t dataBlockLen, - uint8_t* responseDataBlock, - uint32_t* responseDataBlockLen); From bec6bd381f222cf14658fd862a2c7f6e620bbf00 Mon Sep 17 00:00:00 2001 From: BarTender NZ Date: Thu, 1 Aug 2024 10:21:49 +1200 Subject: [PATCH 27/52] Add lfrfid GProxII support (#3796) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add lfrfid GProxII support * Add rfid GProxII support and correct linting issues. * Add GProxII support for 26 and 36 bit cards * Add GProxII 26 and 36 bit key - fixing minor typos * Add GProxII 26 and 36 bit key - fix typo * Add GProxII 26 and 36 Bit support - Change comment to not fail lint checking on XOR Value Co-authored-by: あく --- .../file_formats/LfRfidFileFormat.md | 1 + lib/lfrfid/protocols/lfrfid_protocols.c | 2 + lib/lfrfid/protocols/lfrfid_protocols.h | 1 + lib/lfrfid/protocols/protocol_gproxii.c | 261 ++++++++++++++++++ lib/lfrfid/protocols/protocol_gproxii.h | 4 + 5 files changed, 269 insertions(+) create mode 100644 lib/lfrfid/protocols/protocol_gproxii.c create mode 100644 lib/lfrfid/protocols/protocol_gproxii.h diff --git a/documentation/file_formats/LfRfidFileFormat.md b/documentation/file_formats/LfRfidFileFormat.md index 2463195e40..6bad4a3c08 100644 --- a/documentation/file_formats/LfRfidFileFormat.md +++ b/documentation/file_formats/LfRfidFileFormat.md @@ -47,3 +47,4 @@ The file stores a single RFID key of the type defined by the `Key type` paramete | PAC/Stanley | PAC/Stanley | | Keri | Keri | | Gallagher | Gallagher | +| GProxII | Guardall GProx II | diff --git a/lib/lfrfid/protocols/lfrfid_protocols.c b/lib/lfrfid/protocols/lfrfid_protocols.c index f0c28f6753..8ea1f2b498 100644 --- a/lib/lfrfid/protocols/lfrfid_protocols.c +++ b/lib/lfrfid/protocols/lfrfid_protocols.c @@ -19,6 +19,7 @@ #include "protocol_gallagher.h" #include "protocol_nexwatch.h" #include "protocol_securakey.h" +#include "protocol_gproxii.h" const ProtocolBase* lfrfid_protocols[] = { [LFRFIDProtocolEM4100] = &protocol_em4100, @@ -43,4 +44,5 @@ const ProtocolBase* lfrfid_protocols[] = { [LFRFIDProtocolGallagher] = &protocol_gallagher, [LFRFIDProtocolNexwatch] = &protocol_nexwatch, [LFRFIDProtocolSecurakey] = &protocol_securakey, + [LFRFIDProtocolGProxII] = &protocol_gproxii, }; diff --git a/lib/lfrfid/protocols/lfrfid_protocols.h b/lib/lfrfid/protocols/lfrfid_protocols.h index c90e842af1..e9c61616ef 100644 --- a/lib/lfrfid/protocols/lfrfid_protocols.h +++ b/lib/lfrfid/protocols/lfrfid_protocols.h @@ -30,6 +30,7 @@ typedef enum { LFRFIDProtocolGallagher, LFRFIDProtocolNexwatch, LFRFIDProtocolSecurakey, + LFRFIDProtocolGProxII, LFRFIDProtocolMax, } LFRFIDProtocol; diff --git a/lib/lfrfid/protocols/protocol_gproxii.c b/lib/lfrfid/protocols/protocol_gproxii.c new file mode 100644 index 0000000000..73cbe8f39e --- /dev/null +++ b/lib/lfrfid/protocols/protocol_gproxii.c @@ -0,0 +1,261 @@ +#include +#include "toolbox/level_duration.h" +#include "protocol_gproxii.h" +#include +#include +#include "lfrfid_protocols.h" + +#define GPROXII_PREAMBLE_BIT_SIZE (6) +#define GPROXII_ENCODED_BIT_SIZE (90) +#define GPROXII_ENCODED_BYTE_FULL_SIZE \ + (((GPROXII_PREAMBLE_BIT_SIZE + GPROXII_ENCODED_BIT_SIZE) / 8)) + +#define GPROXII_DATA_SIZE (12) + +#define GPROXII_SHORT_TIME (256) +#define GPROXII_LONG_TIME (512) +#define GPROXII_JITTER_TIME (120) + +#define GPROXII_SHORT_TIME_LOW (GPROXII_SHORT_TIME - GPROXII_JITTER_TIME) +#define GPROXII_SHORT_TIME_HIGH (GPROXII_SHORT_TIME + GPROXII_JITTER_TIME) +#define GPROXII_LONG_TIME_LOW (GPROXII_LONG_TIME - GPROXII_JITTER_TIME) +#define GPROXII_LONG_TIME_HIGH (GPROXII_LONG_TIME + GPROXII_JITTER_TIME) + +typedef struct { + bool last_short; + bool last_level; + size_t encoded_index; + uint8_t decoded_data[GPROXII_ENCODED_BYTE_FULL_SIZE]; + uint8_t data[GPROXII_ENCODED_BYTE_FULL_SIZE]; +} ProtocolGProxII; + +ProtocolGProxII* protocol_gproxii_alloc(void) { + ProtocolGProxII* protocol = malloc(sizeof(ProtocolGProxII)); + return protocol; +} + +void protocol_gproxii_free(ProtocolGProxII* protocol) { + free(protocol); +} + +uint8_t* protocol_gproxii_get_data(ProtocolGProxII* proto) { + return proto->data; +} + +void protocol_gproxii_decoder_start(ProtocolGProxII* protocol) { + memset(protocol->data, 0, GPROXII_ENCODED_BYTE_FULL_SIZE); + protocol->last_short = false; +} + +static bool protocol_gproxii_can_be_decoded(ProtocolGProxII* protocol) { + // 96 bit with 5 bit zero parity + // 0 10 20 30 40 50 60 70 80 90 + // | | | | | | | | | | + // 012345 6789 0 1234 5 6789 0 1234 5 6789 0 1234 5 6789 0 1234 5 6789 0 1234 5 6789 0 1234 5 6789 0 1234 5 6789 0 1234 5 6789 0 1234 5 + // ------------------------------------------------------------------------------------------------------------------------------------ + // 111110 0000 0 1001 0 1101 0 1111 0 1000 0 1001 0 0000 0 1001 0 0000 0 1001 0 0000 0 1001 0 0000 0 1001 0 0000 0 1000 0 0000 0 1001 0 + + // Remove header and reverse bytes on the remaining 72 bits + // + // 0 10 20 30 40 50 60 70 + // | | | | | | | | + // 01234567 89012345 67890123 45678901 23456789 01234567 89012345 67890123 45678901 + // -------------------------------------------------------------------------------- + // 00001001 11011111 10001001 00001001 00001001 00001001 00001001 00001000 00001001 - Without parity + // 10010000 11111011 10010001 10010000 10010000 10010000 10010000 00010000 10010000 - Reversed + // 10010000 01101011 00000001 00000000 00000000 00000000 00000000 10000000 00000000 - XOR all bytes from 1 using byte 0 + + // 72 Bit Guardall/Verex/Chubb GProx II 26 bit key with 16 bit profile + // 0 10 20 30 40 50 60 70 + // | | | | | | | | + // 01234567 890123 45 6789012345678901 2 34567890 1234567890123456 7 89012345678901 + // -------------------------------------------------------------------------------- + // XORVALUE LLLLLL DD PPPPPPPPPPPPPPPP E FFFFFFFF CCCCCCCCCCCCCCCC O UUUUUUUUUUUUUU + // 10010000 011010 11 0000000100000000 0 00000000 0000000000000001 0 00000000000000 - Profile: 256 FC: 0 Card: 1 + + // 72 Bit Guardall/Verex/Chubb GProx II 36 bit key with 26 bit profile + // 0 10 20 30 40 50 60 70 + // | | | | | | | | + // 01234567 890123 45 67890123456789012345678901 2 34567890 1234567890123456 7 8901 + // -------------------------------------------------------------------------------- + // XORVALUE LLLLLL DD PPPPPPPPPPPPPPPPPPPPPPPPPP E FFFFFFFF CCCCCCCCCCCCCCCC O UUUU + // 10111000 100100 10 00000001000000000000000000 1 01000000 1000100010111000 1 0000 - Profile: 262144 FC: 64 Card: 35000 + + // X = XOR Key, L = Message length, D = 2 bit check digits, P = Profile, E = Wiegand leading even parity + // F = Faclity code, C = Card number, O = Wiegand trailing odd parity, U = Unused bits + + // Check 6 bits preamble 111110 + if(bit_lib_get_bits(protocol->data, 0, 6) != 0b111110) return false; + + // Check always 0 parity on every 5th bit after preamble + if(bit_lib_test_parity(protocol->data, 5, GPROXII_ENCODED_BIT_SIZE, BitLibParityAlways0, 5)) + return false; + + // Start GProx II decode + bit_lib_copy_bits(protocol->decoded_data, 0, GPROXII_ENCODED_BIT_SIZE, protocol->data, 6); + + // Remove parity + bit_lib_remove_bit_every_nth(protocol->decoded_data, 0, GPROXII_ENCODED_BIT_SIZE, 5); + + // Reverse bytes + for(int i = 0; i < 9; i++) { + protocol->decoded_data[i] = bit_lib_reverse_8_fast(protocol->decoded_data[i]); + } + + // DeXOR from byte 1 using byte 0 + for(int i = 1; i < 9; i++) { + protocol->decoded_data[i] = protocol->decoded_data[0] ^ protocol->decoded_data[i]; + } + + // Check card length is either 26 or 36 + int card_len = bit_lib_get_bits(protocol->decoded_data, 8, 6); + if(card_len == 26 || card_len == 36) { + return true; + } else { + return false; // If we don't get a 26 or 36 it's not a known card type + } +} + +bool protocol_gproxii_decoder_feed(ProtocolGProxII* protocol, bool level, uint32_t duration) { + UNUSED(level); + bool pushed = false; + + // Bi-Phase Manchester decoding inverse. Short = 1, Long = 0 + if(duration >= GPROXII_SHORT_TIME_LOW && duration <= GPROXII_SHORT_TIME_HIGH) { + if(protocol->last_short == false) { + protocol->last_short = true; + } else { + pushed = true; + bit_lib_push_bit(protocol->data, GPROXII_ENCODED_BYTE_FULL_SIZE, true); + protocol->last_short = false; + } + } else if(duration >= GPROXII_LONG_TIME_LOW && duration <= GPROXII_LONG_TIME_HIGH) { + if(protocol->last_short == false) { + pushed = true; + bit_lib_push_bit(protocol->data, GPROXII_ENCODED_BYTE_FULL_SIZE, false); + } else { + // reset + protocol->last_short = false; + } + } else { + // reset + protocol->last_short = false; + } + + if(pushed && protocol_gproxii_can_be_decoded(protocol)) { + return true; + } + + return false; +} + +bool protocol_gproxii_encoder_start(ProtocolGProxII* protocol) { + protocol->encoded_index = 0; + protocol->last_short = false; + protocol->last_level = false; + return true; +} + +LevelDuration protocol_gproxii_encoder_yield(ProtocolGProxII* protocol) { + uint32_t duration; + protocol->last_level = !protocol->last_level; + + bool bit = bit_lib_get_bit(protocol->data, protocol->encoded_index); + + // Bi-Phase Manchester encoder inverted + if(bit) { + // two short pulses for 1 + duration = GPROXII_SHORT_TIME / 8; + if(protocol->last_short) { + bit_lib_increment_index(protocol->encoded_index, 96); + protocol->last_short = false; + } else { + protocol->last_short = true; + } + } else { + // one long pulse for 0 + duration = GPROXII_LONG_TIME / 8; + bit_lib_increment_index(protocol->encoded_index, 96); + } + return level_duration_make(protocol->last_level, duration); +} + +void protocol_gproxii_render_data(ProtocolGProxII* protocol, FuriString* result) { + int xor_code = bit_lib_get_bits(protocol->decoded_data, 0, 8); + int card_len = bit_lib_get_bits(protocol->decoded_data, 8, 6); + int crc_code = bit_lib_get_bits(protocol->decoded_data, 14, 2); + + if(card_len == 26) { // 26 Bit card + // Print FC, Card and Length + furi_string_cat_printf( + result, + "FC: %hhu Card: %hu LEN: %hhu\n", + bit_lib_get_bits(protocol->decoded_data, 33, 8), + bit_lib_get_bits_16(protocol->decoded_data, 41, 16), + card_len); + // XOR Key, CRC and Profile + furi_string_cat_printf( + result, + "XOR: %hhu CRC: %hhu P: %04hX", + xor_code, + crc_code, + bit_lib_get_bits_16(protocol->decoded_data, 16, 16)); + } else if(card_len == 36) { // 36 Bit card + // Print FC, Card and Length + furi_string_cat_printf( + result, + "FC: %hhu Card: %hu LEN: %hhu\n", + bit_lib_get_bits(protocol->decoded_data, 43, 8), + bit_lib_get_bits_16(protocol->decoded_data, 51, 16), + card_len); + // XOR Key, CRC and Profile + furi_string_cat_printf( + result, + "XOR: %hhu CRC: %hhu P: %06lX", + xor_code, + crc_code, + bit_lib_get_bits_32(protocol->decoded_data, 16, 26)); + } else { + furi_string_cat_printf(result, "Read Error\n"); + } +} + +bool protocol_gproxii_write_data(ProtocolGProxII* protocol, void* data) { + LFRFIDWriteRequest* request = (LFRFIDWriteRequest*)data; + bool result = false; + + if(request->write_type == LFRFIDWriteTypeT5577) { + request->t5577.block[0] = LFRFID_T5577_MODULATION_BIPHASE | LFRFID_T5577_BITRATE_RF_64 | + (3 << LFRFID_T5577_MAXBLOCK_SHIFT); + request->t5577.block[1] = bit_lib_get_bits_32(protocol->data, 0, 32); + request->t5577.block[2] = bit_lib_get_bits_32(protocol->data, 32, 32); + request->t5577.block[3] = bit_lib_get_bits_32(protocol->data, 64, 32); + request->t5577.blocks_to_write = 4; + result = true; + } + return result; +} + +const ProtocolBase protocol_gproxii = { + .name = "GProxII", + .manufacturer = "Guardall", + .data_size = GPROXII_DATA_SIZE, + .features = LFRFIDFeatureASK, + .validate_count = 3, + .alloc = (ProtocolAlloc)protocol_gproxii_alloc, + .free = (ProtocolFree)protocol_gproxii_free, + .get_data = (ProtocolGetData)protocol_gproxii_get_data, + .decoder = + { + .start = (ProtocolDecoderStart)protocol_gproxii_decoder_start, + .feed = (ProtocolDecoderFeed)protocol_gproxii_decoder_feed, + }, + .encoder = + { + .start = (ProtocolEncoderStart)protocol_gproxii_encoder_start, + .yield = (ProtocolEncoderYield)protocol_gproxii_encoder_yield, + }, + .render_data = (ProtocolRenderData)protocol_gproxii_render_data, + .render_brief_data = (ProtocolRenderData)protocol_gproxii_render_data, + .write_data = (ProtocolWriteData)protocol_gproxii_write_data, +}; diff --git a/lib/lfrfid/protocols/protocol_gproxii.h b/lib/lfrfid/protocols/protocol_gproxii.h new file mode 100644 index 0000000000..002c3024fc --- /dev/null +++ b/lib/lfrfid/protocols/protocol_gproxii.h @@ -0,0 +1,4 @@ +#pragma once +#include + +extern const ProtocolBase protocol_gproxii; From 4f46032d325f921a618862514e109a98ffada317 Mon Sep 17 00:00:00 2001 From: Astra <93453568+Astrrra@users.noreply.github.com> Date: Fri, 2 Aug 2024 15:03:12 +0900 Subject: [PATCH 28/52] [NFC] Change the plantain last number display from "?" to "X" (#3819) --- applications/main/nfc/plugins/supported_cards/plantain.c | 2 +- applications/main/nfc/plugins/supported_cards/two_cities.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/main/nfc/plugins/supported_cards/plantain.c b/applications/main/nfc/plugins/supported_cards/plantain.c index 1c3a6737f1..bed9645546 100644 --- a/applications/main/nfc/plugins/supported_cards/plantain.c +++ b/applications/main/nfc/plugins/supported_cards/plantain.c @@ -230,7 +230,7 @@ static bool plantain_parse(const NfcDevice* device, FuriString* parsed_data) { } furi_string_printf( - parsed_data, "\e#Plantain\nNo.: %llu\nBalance: %lu\n", card_number, balance); + parsed_data, "\e#Plantain\nNo.: %lluX\nBalance: %lu\n", card_number, balance); parsed = true; } while(false); diff --git a/applications/main/nfc/plugins/supported_cards/two_cities.c b/applications/main/nfc/plugins/supported_cards/two_cities.c index 402e9d90a2..6f348fa615 100644 --- a/applications/main/nfc/plugins/supported_cards/two_cities.c +++ b/applications/main/nfc/plugins/supported_cards/two_cities.c @@ -158,7 +158,7 @@ static bool two_cities_parse(const NfcDevice* device, FuriString* parsed_data) { furi_string_printf( parsed_data, - "\e#Troika+Plantain\nPN: %llu?\nPB: %lu rur.\nTN: %lu\nTB: %u rur.\n", + "\e#Troika+Plantain\nPN: %lluX\nPB: %lu rur.\nTN: %lu\nTB: %u rur.\n", card_number, balance, troika_number, From 8189062771918dcfb7839bbff0185e43161dca18 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:47:12 +0300 Subject: [PATCH 29/52] merge fixes --- lib/ibutton/protocols/dallas/protocol_ds1420.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ibutton/protocols/dallas/protocol_ds1420.c b/lib/ibutton/protocols/dallas/protocol_ds1420.c index 42af9f0b18..54f75fc1f9 100644 --- a/lib/ibutton/protocols/dallas/protocol_ds1420.c +++ b/lib/ibutton/protocols/dallas/protocol_ds1420.c @@ -23,7 +23,7 @@ typedef struct { } DS1420ProtocolData; static bool dallas_ds1420_read(OneWireHost*, iButtonProtocolData*); -static bool dallas_ds1420_write_blank(OneWireHost*, iButtonProtocolData*); +static bool dallas_ds1420_write_id(OneWireHost*, iButtonProtocolData*); static void dallas_ds1420_emulate(OneWireSlave*, iButtonProtocolData*); static bool dallas_ds1420_load(FlipperFormat*, uint32_t, iButtonProtocolData*); static bool dallas_ds1420_save(FlipperFormat*, const iButtonProtocolData*); @@ -36,13 +36,13 @@ static void dallas_ds1420_apply_edits(iButtonProtocolData*); const iButtonProtocolDallasBase ibutton_protocol_ds1420 = { .family_code = DS1420_FAMILY_CODE, - .features = iButtonProtocolFeatureWriteBlank, + .features = iButtonProtocolFeatureWriteId, .data_size = sizeof(DS1420ProtocolData), .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, .name = DS1420_FAMILY_NAME, .read = dallas_ds1420_read, - .write_blank = dallas_ds1420_write_blank, + .write_id = dallas_ds1420_write_id, .write_copy = NULL, /* No data to write a copy */ .emulate = dallas_ds1420_emulate, .save = dallas_ds1420_save, @@ -61,7 +61,7 @@ bool dallas_ds1420_read(OneWireHost* host, iButtonProtocolData* protocol_data) { return onewire_host_reset(host) && dallas_common_read_rom(host, &data->rom_data); } -bool dallas_ds1420_write_blank(OneWireHost* host, iButtonProtocolData* protocol_data) { +bool dallas_ds1420_write_id(OneWireHost* host, iButtonProtocolData* protocol_data) { DS1420ProtocolData* data = protocol_data; return rw1990_write_v1(host, data->rom_data.bytes, sizeof(DallasCommonRomData)) || From 4d985ba8f843a2a67be9579dcbe39de73f975b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Sun, 4 Aug 2024 18:54:02 +0900 Subject: [PATCH 30/52] Storage: remove LFS (#3577) * Storage: drop internal storage * Storage: rollback some unnecessary changes * Storage: rollback some unnecessary changes part 2 * Storage: cleanup various defines and int handling. Ble: allow short connection interval if internal flash is not used. * Storage: do not return storage if it is not ready * Save PIN code to RTC, update settings * Simplify the code, clean up includes * Rearrange some code * apps: storage_move_to_sd: conditionally enable with --extra-define=STORAGE_INT_ON_LFS * Load Desktop settings automatically * Redirect /any to /ext * Abolish storage_move_to_sd app * Remove as many mentions of ANY_PATH as possible * Fix desktop settings wrongly not loading * Improve desktop settings handling and strings * Load BLE settings and keys automatically * Improve BLE configuration procedure * Do not load bluetooth keys twice if they were already loaded * Load dolphin state automatically * Fix merge artifact * Load notification settings automatically * Update desktop settings strings * Load expansion settings automatically * Do not use thread signals to reload desktop settings * Load region data automatically, separate to its own hook * Improve ble behaviour with no keys * Fix Dolphin state not resetting correctly * Add a status check * Make Desktop save its own settings * Check result when taking and releasing mutex * Improve default thread signal handling in FuriEventLoop * Make bt service in charge of saving settings, add settings api * Fix a deadlock due to timer thread not receiving time * Lock core2 when reinitialising bt * Update clang-format * Revert "Update clang-format" This reverts commit d61295ac063c6ec879375ceeab54d6ff2c90a9a1. * Format sources with clang-format * Revert old stack size for desktop settings * Allocate big struct dynamically * Simplify PIN comparison * Save pointer to storage in Desktop object * Fix region provisioning for hardware regions * Remove stale TODO + siimplify code * Clean up region.c * Use sizeof instead of macro define * Limit PIN length to 10 for consistency * Emit a warning upon usage of /any * Add delay after finding flipper * Remove unnecessary delay * Remove all mentions of STORAGE_INT_ON_LFS * Remove littlefs and internal storage * Remove all possible LittleFS mentions * Fix browser tab in Archive * Ble: fix connection interval explanation * Bump API Symbols * BLE: Update comments interval connection comments * Storage: clear FuriHalRtcFlagStorageFormatInternal if set --------- Co-authored-by: Georgii Surkov Co-authored-by: hedger Co-authored-by: Georgii Surkov <37121527+gsurkov@users.noreply.github.com> --- .gitmodules | 3 - .pvsoptions | 2 +- .../scenes/file_browser_scene_start.c | 2 +- .../main/archive/helpers/archive_apps.c | 8 +- .../main/archive/helpers/archive_browser.c | 12 +- .../main/archive/helpers/archive_browser.h | 16 +- .../main/archive/helpers/archive_favorites.h | 4 +- applications/main/bad_usb/bad_usb_app_i.h | 2 +- applications/main/ibutton/ibutton_i.h | 2 +- applications/main/infrared/infrared_app_i.h | 2 +- applications/main/lfrfid/lfrfid_i.h | 2 +- applications/main/nfc/helpers/mf_user_dict.c | 2 +- applications/main/nfc/nfc_app_i.h | 2 +- applications/main/subghz/application.fam | 1 + applications/main/subghz/subghz_cli.c | 100 +-- applications/main/u2f/u2f.c | 7 +- applications/services/bt/bt_service/bt.c | 135 +++- applications/services/bt/bt_service/bt_api.c | 36 + applications/services/bt/bt_service/bt_i.h | 5 + .../services/bt/bt_service/bt_keys_storage.c | 105 ++- .../services/bt/bt_service/bt_keys_storage.h | 2 + .../bt/bt_service/bt_settings_api_i.h | 8 + applications/services/bt/bt_settings.c | 23 +- applications/services/bt/bt_settings.h | 7 +- .../desktop/animations/animation_manager.c | 7 +- applications/services/desktop/desktop.c | 304 ++++--- applications/services/desktop/desktop.h | 14 +- applications/services/desktop/desktop_i.h | 31 +- .../services/desktop/desktop_settings.c | 79 ++ .../services/desktop/desktop_settings.h | 49 +- applications/services/desktop/helpers/pin.c | 72 -- applications/services/desktop/helpers/pin.h | 11 - .../services/desktop/helpers/pin_code.c | 103 +++ .../services/desktop/helpers/pin_code.h | 25 + .../services/desktop/scenes/desktop_scene_i.h | 4 - .../desktop/scenes/desktop_scene_lock_menu.c | 8 +- .../desktop/scenes/desktop_scene_locked.c | 12 +- .../desktop/scenes/desktop_scene_locked.h | 6 + .../desktop/scenes/desktop_scene_main.c | 5 - .../desktop/scenes/desktop_scene_pin_input.c | 8 +- .../desktop/scenes/desktop_scene_slideshow.c | 7 +- .../services/desktop/views/desktop_events.h | 2 + .../desktop/views/desktop_view_pin_input.c | 18 +- .../desktop/views/desktop_view_pin_input.h | 7 +- applications/services/dolphin/dolphin.c | 33 +- applications/services/dolphin/dolphin_i.h | 1 + .../services/dolphin/helpers/dolphin_state.c | 26 +- .../services/dolphin/helpers/dolphin_state.h | 8 +- applications/services/expansion/expansion.c | 59 +- .../services/expansion/expansion_settings.c | 22 +- .../services/expansion/expansion_settings.h | 8 +- .../gui/modules/file_browser_worker.c | 2 +- .../services/notification/notification_app.c | 53 +- .../services/notification/notification_app.h | 1 + applications/services/region/application.fam | 10 + applications/services/region/region.c | 147 ++++ applications/services/storage/storage.c | 9 +- applications/services/storage/storage.h | 4 +- applications/services/storage/storage_cli.c | 2 +- .../services/storage/storage_internal_api.c | 2 +- .../services/storage/storage_processing.c | 47 +- .../services/storage/storages/storage_int.c | 744 ------------------ .../services/storage/storages/storage_int.h | 13 - .../bt_settings_app/bt_settings_app.c | 6 +- .../bt_settings_app/bt_settings_app.h | 9 +- .../scenes/bt_settings_scene_start.c | 3 +- .../desktop_settings/desktop_settings_app.c | 20 +- .../desktop_settings/desktop_settings_app.h | 2 +- .../scenes/desktop_settings_scene_favorite.c | 10 +- .../scenes/desktop_settings_scene_pin_auth.c | 14 +- .../desktop_settings_scene_pin_disable.c | 5 +- .../scenes/desktop_settings_scene_pin_error.c | 4 +- .../scenes/desktop_settings_scene_pin_menu.c | 2 +- .../scenes/desktop_settings_scene_pin_setup.c | 6 +- .../desktop_settings_scene_pin_setup_done.c | 8 +- .../expansion_settings_app.c | 4 +- .../storage_settings_scene_internal_info.c | 2 +- applications/system/application.fam | 1 - .../system/storage_move_to_sd/application.fam | 18 - .../scenes/storage_move_to_sd_scene.c | 30 - .../scenes/storage_move_to_sd_scene.h | 29 - .../scenes/storage_move_to_sd_scene_config.h | 2 - .../scenes/storage_move_to_sd_scene_confirm.c | 70 -- .../storage_move_to_sd_scene_progress.c | 31 - .../storage_move_to_sd/storage_move_to_sd.c | 188 ----- .../storage_move_to_sd/storage_move_to_sd.h | 48 -- .../system/updater/util/update_task.c | 1 - .../updater/util/update_task_worker_flasher.c | 1 - documentation/doxygen/Doxyfile.cfg | 1 - furi/core/event_loop.c | 14 +- furi/core/thread.c | 6 + furi/core/thread.h | 10 +- lib/ReadMe.md | 1 - lib/SConscript | 1 - lib/ble_profile/extra_profiles/hid_profile.c | 10 +- lib/lfs_config.h | 204 ----- lib/littlefs | 1 - lib/littlefs.scons | 22 - lib/subghz/devices/registry.c | 2 +- lib/toolbox/crc32_calc.c | 32 +- lib/toolbox/stream/file_stream.c | 4 +- lib/toolbox/tar/tar_archive.c | 4 +- lib/toolbox/tar/tar_archive.h | 4 +- scripts/testops.py | 2 + targets/f18/api_symbols.csv | 10 +- targets/f18/target.json | 1 - targets/f7/api_symbols.csv | 10 +- targets/f7/ble_glue/extra_beacon.c | 6 +- targets/f7/ble_glue/hw_ipcc.c | 4 +- targets/f7/ble_glue/profiles/serial_profile.c | 10 +- targets/f7/furi_hal/furi_hal_bt.c | 11 +- targets/f7/furi_hal/furi_hal_crypto.c | 58 +- targets/f7/furi_hal/furi_hal_region.c | 78 +- targets/f7/furi_hal/furi_hal_rtc.c | 8 + targets/f7/furi_hal/furi_hal_rtc.h | 22 +- targets/f7/target.json | 1 - targets/furi_hal_include/furi_hal_region.h | 1 - 117 files changed, 1385 insertions(+), 2118 deletions(-) create mode 100644 applications/services/bt/bt_service/bt_settings_api_i.h create mode 100644 applications/services/desktop/desktop_settings.c delete mode 100644 applications/services/desktop/helpers/pin.c delete mode 100644 applications/services/desktop/helpers/pin.h create mode 100644 applications/services/desktop/helpers/pin_code.c create mode 100644 applications/services/desktop/helpers/pin_code.h delete mode 100644 applications/services/desktop/scenes/desktop_scene_i.h create mode 100644 applications/services/desktop/scenes/desktop_scene_locked.h create mode 100644 applications/services/region/application.fam create mode 100644 applications/services/region/region.c delete mode 100644 applications/services/storage/storages/storage_int.c delete mode 100644 applications/services/storage/storages/storage_int.h delete mode 100644 applications/system/storage_move_to_sd/application.fam delete mode 100644 applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.c delete mode 100644 applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.h delete mode 100644 applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_config.h delete mode 100644 applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_confirm.c delete mode 100644 applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_progress.c delete mode 100644 applications/system/storage_move_to_sd/storage_move_to_sd.c delete mode 100644 applications/system/storage_move_to_sd/storage_move_to_sd.h delete mode 100644 lib/lfs_config.h delete mode 160000 lib/littlefs delete mode 100644 lib/littlefs.scons diff --git a/.gitmodules b/.gitmodules index 038bb57e6f..0297da14db 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,6 @@ [submodule "lib/mlib"] path = lib/mlib url = https://github.com/P-p-H-d/mlib.git -[submodule "lib/littlefs"] - path = lib/littlefs - url = https://github.com/littlefs-project/littlefs.git [submodule "lib/nanopb"] path = lib/nanopb url = https://github.com/nanopb/nanopb.git diff --git a/.pvsoptions b/.pvsoptions index 8606eef154..4040dcb91a 100644 --- a/.pvsoptions +++ b/.pvsoptions @@ -1 +1 @@ ---ignore-ccache -C gccarm --rules-config .pvsconfig -e lib/cmsis_core -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Kernel -e lib/heatshrink -e lib/libusb_stm32 -e lib/littlefs -e lib/mbedtls -e lib/microtar -e lib/mlib -e lib/stm32wb_cmsis -e lib/stm32wb_copro -e lib/stm32wb_hal -e lib/u8g2 -e lib/nanopb -e lib/mjs -e */arm-none-eabi/* +--ignore-ccache -C gccarm --rules-config .pvsconfig -e lib/cmsis_core -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Kernel -e lib/heatshrink -e lib/libusb_stm32 -e lib/mbedtls -e lib/microtar -e lib/mlib -e lib/stm32wb_cmsis -e lib/stm32wb_copro -e lib/stm32wb_hal -e lib/u8g2 -e lib/nanopb -e lib/mjs -e */arm-none-eabi/* diff --git a/applications/debug/file_browser_test/scenes/file_browser_scene_start.c b/applications/debug/file_browser_test/scenes/file_browser_scene_start.c index 9eb26944ff..0ff6303bf5 100644 --- a/applications/debug/file_browser_test/scenes/file_browser_scene_start.c +++ b/applications/debug/file_browser_test/scenes/file_browser_scene_start.c @@ -19,7 +19,7 @@ bool file_browser_scene_start_on_event(void* context, SceneManagerEvent event) { bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - furi_string_set(app->file_path, ANY_PATH("badusb/demo_windows.txt")); + furi_string_set(app->file_path, EXT_PATH("badusb/demo_windows.txt")); scene_manager_next_scene(app->scene_manager, FileBrowserSceneBrowser); consumed = true; } else if(event.type == SceneManagerEventTypeTick) { diff --git a/applications/main/archive/helpers/archive_apps.c b/applications/main/archive/helpers/archive_apps.c index 43befc055b..7aca293649 100644 --- a/applications/main/archive/helpers/archive_apps.c +++ b/applications/main/archive/helpers/archive_apps.c @@ -30,8 +30,8 @@ bool archive_app_is_available(void* context, const char* path) { bool file_exists = false; Storage* storage = furi_record_open(RECORD_STORAGE); - if(storage_file_exists(storage, ANY_PATH("u2f/key.u2f"))) { - file_exists = storage_file_exists(storage, ANY_PATH("u2f/cnt.u2f")); + if(storage_file_exists(storage, EXT_PATH("u2f/key.u2f"))) { + file_exists = storage_file_exists(storage, EXT_PATH("u2f/cnt.u2f")); } furi_record_close(RECORD_STORAGE); @@ -68,8 +68,8 @@ void archive_app_delete_file(void* context, const char* path) { if(app == ArchiveAppTypeU2f) { Storage* fs_api = furi_record_open(RECORD_STORAGE); - res = (storage_common_remove(fs_api, ANY_PATH("u2f/key.u2f")) == FSE_OK); - res |= (storage_common_remove(fs_api, ANY_PATH("u2f/cnt.u2f")) == FSE_OK); + res = (storage_common_remove(fs_api, EXT_PATH("u2f/key.u2f")) == FSE_OK); + res |= (storage_common_remove(fs_api, EXT_PATH("u2f/cnt.u2f")) == FSE_OK); furi_record_close(RECORD_STORAGE); if(archive_is_favorite("/app:u2f/U2F Token")) { diff --git a/applications/main/archive/helpers/archive_browser.c b/applications/main/archive/helpers/archive_browser.c index c34c505a23..5f7bf8b962 100644 --- a/applications/main/archive/helpers/archive_browser.c +++ b/applications/main/archive/helpers/archive_browser.c @@ -460,16 +460,14 @@ void archive_favorites_move_mode(ArchiveBrowserView* browser, bool active) { } static bool archive_is_dir_exists(FuriString* path) { - if(furi_string_equal(path, STORAGE_ANY_PATH_PREFIX)) { - return true; - } bool state = false; FileInfo file_info; Storage* storage = furi_record_open(RECORD_STORAGE); - if(storage_common_stat(storage, furi_string_get_cstr(path), &file_info) == FSE_OK) { - if(file_info_is_dir(&file_info)) { - state = true; - } + + if(furi_string_equal(path, STORAGE_EXT_PATH_PREFIX)) { + state = storage_sd_status(storage) == FSE_OK; + } else if(storage_common_stat(storage, furi_string_get_cstr(path), &file_info) == FSE_OK) { + state = file_info_is_dir(&file_info); } furi_record_close(RECORD_STORAGE); return state; diff --git a/applications/main/archive/helpers/archive_browser.h b/applications/main/archive/helpers/archive_browser.h index 02cf8d708c..fea6ddf7f6 100644 --- a/applications/main/archive/helpers/archive_browser.h +++ b/applications/main/archive/helpers/archive_browser.h @@ -9,15 +9,15 @@ static const char* tab_default_paths[] = { [ArchiveTabFavorites] = "/app:favorites", - [ArchiveTabIButton] = ANY_PATH("ibutton"), - [ArchiveTabNFC] = ANY_PATH("nfc"), - [ArchiveTabSubGhz] = ANY_PATH("subghz"), - [ArchiveTabLFRFID] = ANY_PATH("lfrfid"), - [ArchiveTabInfrared] = ANY_PATH("infrared"), - [ArchiveTabBadUsb] = ANY_PATH("badusb"), + [ArchiveTabIButton] = EXT_PATH("ibutton"), + [ArchiveTabNFC] = EXT_PATH("nfc"), + [ArchiveTabSubGhz] = EXT_PATH("subghz"), + [ArchiveTabLFRFID] = EXT_PATH("lfrfid"), + [ArchiveTabInfrared] = EXT_PATH("infrared"), + [ArchiveTabBadUsb] = EXT_PATH("badusb"), [ArchiveTabU2f] = "/app:u2f", - [ArchiveTabApplications] = ANY_PATH("apps"), - [ArchiveTabBrowser] = STORAGE_ANY_PATH_PREFIX, + [ArchiveTabApplications] = EXT_PATH("apps"), + [ArchiveTabBrowser] = STORAGE_EXT_PATH_PREFIX, }; static const char* known_ext[] = { diff --git a/applications/main/archive/helpers/archive_favorites.h b/applications/main/archive/helpers/archive_favorites.h index 64ffcdd7bd..75070c44d5 100644 --- a/applications/main/archive/helpers/archive_favorites.h +++ b/applications/main/archive/helpers/archive_favorites.h @@ -2,8 +2,8 @@ #include -#define ARCHIVE_FAV_PATH ANY_PATH("favorites.txt") -#define ARCHIVE_FAV_TEMP_PATH ANY_PATH("favorites.tmp") +#define ARCHIVE_FAV_PATH EXT_PATH("favorites.txt") +#define ARCHIVE_FAV_TEMP_PATH EXT_PATH("favorites.tmp") uint16_t archive_favorites_count(void* context); bool archive_favorites_read(void* context); diff --git a/applications/main/bad_usb/bad_usb_app_i.h b/applications/main/bad_usb/bad_usb_app_i.h index 34b3db15cd..a4dd57d8b9 100644 --- a/applications/main/bad_usb/bad_usb_app_i.h +++ b/applications/main/bad_usb/bad_usb_app_i.h @@ -16,7 +16,7 @@ #include "views/bad_usb_view.h" #include -#define BAD_USB_APP_BASE_FOLDER ANY_PATH("badusb") +#define BAD_USB_APP_BASE_FOLDER EXT_PATH("badusb") #define BAD_USB_APP_PATH_LAYOUT_FOLDER BAD_USB_APP_BASE_FOLDER "/assets/layouts" #define BAD_USB_APP_SCRIPT_EXTENSION ".txt" #define BAD_USB_APP_LAYOUT_EXTENSION ".kl" diff --git a/applications/main/ibutton/ibutton_i.h b/applications/main/ibutton/ibutton_i.h index 454837e977..fc2324c635 100644 --- a/applications/main/ibutton/ibutton_i.h +++ b/applications/main/ibutton/ibutton_i.h @@ -28,7 +28,7 @@ #include "ibutton_custom_event.h" #include "scenes/ibutton_scene.h" -#define IBUTTON_APP_FOLDER ANY_PATH("ibutton") +#define IBUTTON_APP_FOLDER EXT_PATH("ibutton") #define IBUTTON_APP_FILENAME_PREFIX "iBtn" #define IBUTTON_APP_FILENAME_EXTENSION ".ibtn" diff --git a/applications/main/infrared/infrared_app_i.h b/applications/main/infrared/infrared_app_i.h index d353b2503b..75d4e230d2 100644 --- a/applications/main/infrared/infrared_app_i.h +++ b/applications/main/infrared/infrared_app_i.h @@ -46,7 +46,7 @@ #define INFRARED_MAX_BUTTON_NAME_LENGTH 22 #define INFRARED_MAX_REMOTE_NAME_LENGTH 22 -#define INFRARED_APP_FOLDER ANY_PATH("infrared") +#define INFRARED_APP_FOLDER EXT_PATH("infrared") #define INFRARED_APP_EXTENSION ".ir" #define INFRARED_DEFAULT_REMOTE_NAME "Remote" diff --git a/applications/main/lfrfid/lfrfid_i.h b/applications/main/lfrfid/lfrfid_i.h index b1f82d026f..2fcedcd7fe 100644 --- a/applications/main/lfrfid/lfrfid_i.h +++ b/applications/main/lfrfid/lfrfid_i.h @@ -38,7 +38,7 @@ #define LFRFID_KEY_NAME_SIZE 22 #define LFRFID_TEXT_STORE_SIZE 40 -#define LFRFID_APP_FOLDER ANY_PATH("lfrfid") +#define LFRFID_APP_FOLDER EXT_PATH("lfrfid") #define LFRFID_SD_FOLDER EXT_PATH("lfrfid") #define LFRFID_APP_FILENAME_PREFIX "RFID" #define LFRFID_APP_FILENAME_EXTENSION ".rfid" diff --git a/applications/main/nfc/helpers/mf_user_dict.c b/applications/main/nfc/helpers/mf_user_dict.c index 70b1114722..7f60d339e6 100644 --- a/applications/main/nfc/helpers/mf_user_dict.c +++ b/applications/main/nfc/helpers/mf_user_dict.c @@ -4,7 +4,7 @@ #include #include -#define NFC_APP_FOLDER ANY_PATH("nfc") +#define NFC_APP_FOLDER EXT_PATH("nfc") #define NFC_APP_MF_CLASSIC_DICT_USER_PATH (NFC_APP_FOLDER "/assets/mf_classic_dict_user.nfc") struct MfUserDict { diff --git a/applications/main/nfc/nfc_app_i.h b/applications/main/nfc/nfc_app_i.h index 0a09fa9245..295a75a4e7 100644 --- a/applications/main/nfc/nfc_app_i.h +++ b/applications/main/nfc/nfc_app_i.h @@ -66,7 +66,7 @@ #define NFC_TEXT_STORE_SIZE 128 #define NFC_BYTE_INPUT_STORE_SIZE 10 #define NFC_LOG_SIZE_MAX (1024) -#define NFC_APP_FOLDER ANY_PATH("nfc") +#define NFC_APP_FOLDER EXT_PATH("nfc") #define NFC_APP_EXTENSION ".nfc" #define NFC_APP_SHADOW_EXTENSION ".shd" #define NFC_APP_FILENAME_PREFIX "NFC" diff --git a/applications/main/subghz/application.fam b/applications/main/subghz/application.fam index 5f9f24dcd3..1abcf7f548 100644 --- a/applications/main/subghz/application.fam +++ b/applications/main/subghz/application.fam @@ -12,6 +12,7 @@ App( "!subghz_cli.c", "!helpers/subghz_chat.c", ], + requires=["region"], resources="resources", fap_libs=["assets", "hwdrivers"], fap_icon="icon.png", diff --git a/applications/main/subghz/subghz_cli.c b/applications/main/subghz/subghz_cli.c index b6d3bf5c4b..4f5c4cb623 100644 --- a/applications/main/subghz/subghz_cli.c +++ b/applications/main/subghz/subghz_cli.c @@ -20,14 +20,9 @@ #include #include -#include -#include - #define SUBGHZ_FREQUENCY_RANGE_STR \ "299999755...348000000 or 386999938...464000000 or 778999847...928000000" -#define SUBGHZ_REGION_FILENAME "/int/.region_data" - #define TAG "SubGhzCli" static void subghz_cli_radio_device_power_on(void) { @@ -480,7 +475,7 @@ void subghz_cli_command_decode_raw(Cli* cli, FuriString* args, void* context) { UNUSED(context); FuriString* file_name; file_name = furi_string_alloc(); - furi_string_set(file_name, ANY_PATH("subghz/test.sub")); + furi_string_set(file_name, EXT_PATH("subghz/test.sub")); Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* fff_data_file = flipper_format_file_alloc(storage); @@ -595,7 +590,7 @@ void subghz_cli_command_tx_from_file(Cli* cli, FuriString* args, void* context) UNUSED(context); FuriString* file_name; file_name = furi_string_alloc(); - furi_string_set(file_name, ANY_PATH("subghz/test.sub")); + furi_string_set(file_name, EXT_PATH("subghz/test.sub")); uint32_t repeat = 10; uint32_t device_ind = 0; // 0 - CC1101_INT, 1 - CC1101_EXT @@ -1199,47 +1194,6 @@ static void subghz_cli_command(Cli* cli, FuriString* args, void* context) { furi_string_free(cmd); } -static bool - subghz_on_system_start_istream_read(pb_istream_t* istream, pb_byte_t* buf, size_t count) { - File* file = istream->state; - size_t ret = storage_file_read(file, buf, count); - return count == ret; -} - -static bool subghz_on_system_start_istream_decode_band( - pb_istream_t* stream, - const pb_field_t* field, - void** arg) { - (void)field; - FuriHalRegion* region = *arg; - - PB_Region_Band band = {0}; - if(!pb_decode(stream, PB_Region_Band_fields, &band)) { - FURI_LOG_E("SubGhzOnStart", "PB Region band decode error: %s", PB_GET_ERROR(stream)); - return false; - } - - region->bands_count += 1; - region = realloc( //-V701 - region, - sizeof(FuriHalRegion) + sizeof(FuriHalRegionBand) * region->bands_count); - size_t pos = region->bands_count - 1; - region->bands[pos].start = band.start; - region->bands[pos].end = band.end; - region->bands[pos].power_limit = band.power_limit; - region->bands[pos].duty_cycle = band.duty_cycle; - *arg = region; - - FURI_LOG_I( - "SubGhzOnStart", - "Add allowed band: start %luHz, stop %luHz, power_limit %ddBm, duty_cycle %u%%", - band.start, - band.end, - band.power_limit, - band.duty_cycle); - return true; -} - void subghz_on_system_start(void) { #ifdef SRV_CLI Cli* cli = furi_record_open(RECORD_CLI); @@ -1250,54 +1204,4 @@ void subghz_on_system_start(void) { #else UNUSED(subghz_cli_command); #endif - -#ifdef SRV_STORAGE - Storage* storage = furi_record_open(RECORD_STORAGE); - File* file = storage_file_alloc(storage); - FileInfo fileinfo = {0}; - PB_Region pb_region = {0}; - pb_region.bands.funcs.decode = subghz_on_system_start_istream_decode_band; - - do { - if(storage_common_stat(storage, SUBGHZ_REGION_FILENAME, &fileinfo) != FSE_OK || - fileinfo.size == 0) { - FURI_LOG_W("SubGhzOnStart", "Region data is missing or empty"); - break; - } - - if(!storage_file_open(file, SUBGHZ_REGION_FILENAME, FSAM_READ, FSOM_OPEN_EXISTING)) { - FURI_LOG_E("SubGhzOnStart", "Unable to open region data"); - break; - } - - pb_istream_t istream = { - .callback = subghz_on_system_start_istream_read, - .state = file, - .errmsg = NULL, - .bytes_left = fileinfo.size, - }; - - pb_region.bands.arg = malloc(sizeof(FuriHalRegion)); - if(!pb_decode(&istream, PB_Region_fields, &pb_region)) { - FURI_LOG_E("SubGhzOnStart", "Invalid region data"); - free(pb_region.bands.arg); - break; - } - - FuriHalRegion* region = pb_region.bands.arg; - memcpy( - region->country_code, - pb_region.country_code->bytes, - pb_region.country_code->size < 4 ? pb_region.country_code->size : 3); - furi_hal_region_set(region); - } while(0); - - pb_release(PB_Region_fields, &pb_region); - storage_file_free(file); - furi_record_close(RECORD_STORAGE); -#else - UNUSED(subghz_cli_command); - UNUSED(subghz_on_system_start_istream_decode_band); - UNUSED(subghz_on_system_start_istream_read); -#endif } diff --git a/applications/main/u2f/u2f.c b/applications/main/u2f/u2f.c index 6a37769a8b..0143eb245f 100644 --- a/applications/main/u2f/u2f.c +++ b/applications/main/u2f/u2f.c @@ -4,7 +4,6 @@ #include #include #include -#include // for lfs_tobe32 #include #include @@ -319,6 +318,10 @@ static uint16_t u2f_register(U2fData* U2F, uint8_t* buf) { return sizeof(U2fRegisterResp) + cert_len + signature_len + 2; } +static inline uint32_t u2f_to_big_endian(uint32_t a) { + return __builtin_bswap32(a); +} + static uint16_t u2f_authenticate(U2fData* U2F, uint8_t* buf) { U2fAuthReq* req = (U2fAuthReq*)buf; U2fAuthResp* resp = (U2fAuthResp*)buf; @@ -348,7 +351,7 @@ static uint16_t u2f_authenticate(U2fData* U2F, uint8_t* buf) { U2F->user_present = false; // The 4 byte counter is represented in big endian. Increment it before use - be_u2f_counter = lfs_tobe32(U2F->counter + 1); + be_u2f_counter = u2f_to_big_endian(U2F->counter + 1); // Generate hash { diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index e3afceb70b..d72e745ee3 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -61,6 +61,21 @@ static void bt_pin_code_view_port_input_callback(InputEvent* event, void* contex } } +static void bt_storage_callback(const void* message, void* context) { + furi_assert(context); + Bt* bt = context; + const StorageEvent* event = message; + + if(event->type == StorageEventTypeCardMount) { + const BtMessage msg = { + .type = BtMessageTypeReloadKeysSettings, + }; + + furi_check( + furi_message_queue_put(bt->message_queue, &msg, FuriWaitForever) == FuriStatusOk); + } +} + static ViewPort* bt_pin_code_view_port_alloc(Bt* bt) { ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, bt_pin_code_view_port_draw_callback, bt); @@ -138,10 +153,6 @@ Bt* bt_alloc(void) { // Init default maximum packet size bt->max_packet_size = BLE_PROFILE_SERIAL_PACKET_SIZE_MAX; bt->current_profile = NULL; - // Load settings - if(!bt_settings_load(&bt->bt_settings)) { - bt_settings_save(&bt->bt_settings); - } // Keys storage bt->keys_storage = bt_keys_storage_alloc(BT_KEYS_STORAGE_PATH); // Alloc queue @@ -384,6 +395,7 @@ static void bt_close_rpc_connection(Bt* bt) { static void bt_change_profile(Bt* bt, BtMessage* message) { if(furi_hal_bt_is_gatt_gap_supported()) { bt_settings_load(&bt->bt_settings); + bt_close_rpc_connection(bt); bt_keys_storage_load(bt->keys_storage); @@ -427,6 +439,87 @@ static void bt_close_connection(Bt* bt, BtMessage* message) { if(message->lock) api_lock_unlock(message->lock); } +static void bt_apply_settings(Bt* bt) { + if(bt->bt_settings.enabled) { + furi_hal_bt_start_advertising(); + } else { + furi_hal_bt_stop_advertising(); + } +} + +static void bt_load_keys(Bt* bt) { + if(!furi_hal_bt_is_gatt_gap_supported()) { + bt_show_warning(bt, "Unsupported radio stack"); + bt->status = BtStatusUnavailable; + return; + + } else if(bt_keys_storage_is_changed(bt->keys_storage)) { + FURI_LOG_I(TAG, "Loading new keys"); + + bt_close_rpc_connection(bt); + bt_keys_storage_load(bt->keys_storage); + + bt->current_profile = NULL; + + } else { + FURI_LOG_I(TAG, "Keys unchanged"); + } +} + +static void bt_start_application(Bt* bt) { + if(!bt->current_profile) { + bt->current_profile = + furi_hal_bt_change_app(ble_profile_serial, NULL, bt_on_gap_event_callback, bt); + + if(!bt->current_profile) { + FURI_LOG_E(TAG, "BLE App start failed"); + bt->status = BtStatusUnavailable; + } + } +} + +static void bt_load_settings(Bt* bt) { + bt_settings_load(&bt->bt_settings); + bt_apply_settings(bt); +} + +static void bt_handle_get_settings(Bt* bt, BtMessage* message) { + furi_assert(message->lock); + *message->data.settings = bt->bt_settings; + api_lock_unlock(message->lock); +} + +static void bt_handle_set_settings(Bt* bt, BtMessage* message) { + furi_assert(message->lock); + bt->bt_settings = *message->data.csettings; + + bt_apply_settings(bt); + bt_settings_save(&bt->bt_settings); + + api_lock_unlock(message->lock); +} + +static void bt_handle_reload_keys_settings(Bt* bt) { + bt_load_keys(bt); + bt_start_application(bt); + bt_load_settings(bt); +} + +static void bt_init_keys_settings(Bt* bt) { + Storage* storage = furi_record_open(RECORD_STORAGE); + furi_pubsub_subscribe(storage_get_pubsub(storage), bt_storage_callback, bt); + + if(storage_sd_status(storage) != FSE_OK) { + FURI_LOG_D(TAG, "SD Card not ready, skipping settings"); + + // Just start the BLE serial application without loading the keys or settings + bt_start_application(bt); + return; + } + + bt_handle_reload_keys_settings(bt); +} + int32_t bt_srv(void* p) { UNUSED(p); Bt* bt = bt_alloc(); @@ -440,35 +533,18 @@ int32_t bt_srv(void* p) { return 0; } - // Load keys - if(!bt_keys_storage_load(bt->keys_storage)) { - FURI_LOG_W(TAG, "Failed to load bonding keys"); - } - - // Start radio stack - if(!furi_hal_bt_start_radio_stack()) { - FURI_LOG_E(TAG, "Radio stack start failed"); - } + if(furi_hal_bt_start_radio_stack()) { + bt_init_keys_settings(bt); + furi_hal_bt_set_key_storage_change_callback(bt_on_key_storage_change_callback, bt); - if(furi_hal_bt_is_gatt_gap_supported()) { - bt->current_profile = - furi_hal_bt_start_app(ble_profile_serial, NULL, bt_on_gap_event_callback, bt); - if(!bt->current_profile) { - FURI_LOG_E(TAG, "BLE App start failed"); - } else { - if(bt->bt_settings.enabled) { - furi_hal_bt_start_advertising(); - } - furi_hal_bt_set_key_storage_change_callback(bt_on_key_storage_change_callback, bt); - } } else { - bt_show_warning(bt, "Unsupported radio stack"); - bt->status = BtStatusUnavailable; + FURI_LOG_E(TAG, "Radio stack start failed"); } furi_record_create(RECORD_BT, bt); BtMessage message; + while(1) { furi_check( furi_message_queue_get(bt->message_queue, &message, FuriWaitForever) == FuriStatusOk); @@ -498,7 +574,14 @@ int32_t bt_srv(void* p) { bt_close_connection(bt, &message); } else if(message.type == BtMessageTypeForgetBondedDevices) { bt_keys_storage_delete(bt->keys_storage); + } else if(message.type == BtMessageTypeGetSettings) { + bt_handle_get_settings(bt, &message); + } else if(message.type == BtMessageTypeSetSettings) { + bt_handle_set_settings(bt, &message); + } else if(message.type == BtMessageTypeReloadKeysSettings) { + bt_handle_reload_keys_settings(bt); } } + return 0; } diff --git a/applications/services/bt/bt_service/bt_api.c b/applications/services/bt/bt_service/bt_api.c index f0e792d42e..39b9a099da 100644 --- a/applications/services/bt/bt_service/bt_api.c +++ b/applications/services/bt/bt_service/bt_api.c @@ -77,3 +77,39 @@ void bt_keys_storage_set_default_path(Bt* bt) { bt_keys_storage_set_file_path(bt->keys_storage, BT_KEYS_STORAGE_PATH); } + +/* + * Private API for the Settings app + */ + +void bt_get_settings(Bt* bt, BtSettings* settings) { + furi_assert(bt); + furi_assert(settings); + + BtMessage message = { + .lock = api_lock_alloc_locked(), + .type = BtMessageTypeGetSettings, + .data.settings = settings, + }; + + furi_check( + furi_message_queue_put(bt->message_queue, &message, FuriWaitForever) == FuriStatusOk); + + api_lock_wait_unlock_and_free(message.lock); +} + +void bt_set_settings(Bt* bt, const BtSettings* settings) { + furi_assert(bt); + furi_assert(settings); + + BtMessage message = { + .lock = api_lock_alloc_locked(), + .type = BtMessageTypeSetSettings, + .data.csettings = settings, + }; + + furi_check( + furi_message_queue_put(bt->message_queue, &message, FuriWaitForever) == FuriStatusOk); + + api_lock_wait_unlock_and_free(message.lock); +} diff --git a/applications/services/bt/bt_service/bt_i.h b/applications/services/bt/bt_service/bt_i.h index 04c1734b75..192da00135 100644 --- a/applications/services/bt/bt_service/bt_i.h +++ b/applications/services/bt/bt_service/bt_i.h @@ -32,6 +32,9 @@ typedef enum { BtMessageTypeSetProfile, BtMessageTypeDisconnect, BtMessageTypeForgetBondedDevices, + BtMessageTypeGetSettings, + BtMessageTypeSetSettings, + BtMessageTypeReloadKeysSettings, } BtMessageType; typedef struct { @@ -49,6 +52,8 @@ typedef union { } profile; FuriHalBleProfileParams profile_params; BtKeyStorageUpdateData key_storage_data; + BtSettings* settings; + const BtSettings* csettings; } BtMessageData; typedef struct { diff --git a/applications/services/bt/bt_service/bt_keys_storage.c b/applications/services/bt/bt_service/bt_keys_storage.c index 6392c2d677..57742e8e26 100644 --- a/applications/services/bt/bt_service/bt_keys_storage.c +++ b/applications/services/bt/bt_service/bt_keys_storage.c @@ -13,6 +13,7 @@ struct BtKeysStorage { uint8_t* nvm_sram_buff; uint16_t nvm_sram_buff_size; + uint16_t current_size; FuriString* file_path; }; @@ -66,44 +67,114 @@ void bt_keys_storage_set_ram_params(BtKeysStorage* instance, uint8_t* buff, uint instance->nvm_sram_buff_size = size; } -bool bt_keys_storage_load(BtKeysStorage* instance) { +static bool bt_keys_storage_file_exists(const char* file_path) { + Storage* storage = furi_record_open(RECORD_STORAGE); + FileInfo file_info; + const bool ret = storage_common_stat(storage, file_path, &file_info) == FSE_OK && + file_info.size != 0; + furi_record_close(RECORD_STORAGE); + return ret; +} + +static bool bt_keys_storage_validate_file(const char* file_path, size_t* payload_size) { + uint8_t magic, version; + size_t size; + + if(!saved_struct_get_metadata(file_path, &magic, &version, &size)) { + FURI_LOG_E(TAG, "Failed to get metadata"); + return false; + + } else if(magic != BT_KEYS_STORAGE_MAGIC || version != BT_KEYS_STORAGE_VERSION) { + FURI_LOG_E(TAG, "File version mismatch"); + return false; + } + + *payload_size = size; + return true; +} + +bool bt_keys_storage_is_changed(BtKeysStorage* instance) { furi_assert(instance); - bool loaded = false; + bool is_changed = false; + uint8_t* data_buffer = NULL; + do { - // Get payload size - uint8_t magic = 0, version = 0; - size_t payload_size = 0; - if(!saved_struct_get_metadata( - furi_string_get_cstr(instance->file_path), &magic, &version, &payload_size)) { - FURI_LOG_E(TAG, "Failed to read payload size"); + const char* file_path = furi_string_get_cstr(instance->file_path); + size_t payload_size; + + if(!bt_keys_storage_file_exists(file_path)) { + FURI_LOG_W(TAG, "Missing or empty file"); + break; + + } else if(!bt_keys_storage_validate_file(file_path, &payload_size)) { + FURI_LOG_E(TAG, "Invalid or corrupted file"); break; } - if(magic != BT_KEYS_STORAGE_MAGIC || version != BT_KEYS_STORAGE_VERSION) { - FURI_LOG_E(TAG, "Saved data version is mismatched"); + data_buffer = malloc(payload_size); + + const bool data_loaded = saved_struct_load( + file_path, data_buffer, payload_size, BT_KEYS_STORAGE_MAGIC, BT_KEYS_STORAGE_VERSION); + + if(!data_loaded) { + FURI_LOG_E(TAG, "Failed to load file"); break; + + } else if(payload_size == instance->current_size) { + furi_hal_bt_nvm_sram_sem_acquire(); + is_changed = memcmp(data_buffer, instance->nvm_sram_buff, payload_size); + furi_hal_bt_nvm_sram_sem_release(); + + } else { + FURI_LOG_D(TAG, "Size mismatch"); + is_changed = true; } + } while(false); - if(payload_size > instance->nvm_sram_buff_size) { - FURI_LOG_E(TAG, "Saved data doesn't fit ram buffer"); + if(data_buffer) { + free(data_buffer); + } + + return is_changed; +} + +bool bt_keys_storage_load(BtKeysStorage* instance) { + furi_assert(instance); + + bool loaded = false; + + do { + const char* file_path = furi_string_get_cstr(instance->file_path); + + // Get payload size + size_t payload_size; + if(!bt_keys_storage_validate_file(file_path, &payload_size)) { + FURI_LOG_E(TAG, "Invalid or corrupted file"); + break; + + } else if(payload_size > instance->nvm_sram_buff_size) { + FURI_LOG_E(TAG, "NVM RAM buffer overflow"); break; } // Load saved data to ram furi_hal_bt_nvm_sram_sem_acquire(); - bool data_loaded = saved_struct_load( - furi_string_get_cstr(instance->file_path), + const bool data_loaded = saved_struct_load( + file_path, instance->nvm_sram_buff, payload_size, BT_KEYS_STORAGE_MAGIC, BT_KEYS_STORAGE_VERSION); furi_hal_bt_nvm_sram_sem_release(); + if(!data_loaded) { - FURI_LOG_E(TAG, "Failed to load struct"); + FURI_LOG_E(TAG, "Failed to load file"); break; } + instance->current_size = payload_size; + loaded = true; } while(false); @@ -130,6 +201,8 @@ bool bt_keys_storage_update(BtKeysStorage* instance, uint8_t* start_addr, uint32 break; } + instance->current_size = new_size; + furi_hal_bt_nvm_sram_sem_acquire(); bool data_updated = saved_struct_save( furi_string_get_cstr(instance->file_path), @@ -138,10 +211,12 @@ bool bt_keys_storage_update(BtKeysStorage* instance, uint8_t* start_addr, uint32 BT_KEYS_STORAGE_MAGIC, BT_KEYS_STORAGE_VERSION); furi_hal_bt_nvm_sram_sem_release(); + if(!data_updated) { FURI_LOG_E(TAG, "Failed to update key storage"); break; } + updated = true; } while(false); diff --git a/applications/services/bt/bt_service/bt_keys_storage.h b/applications/services/bt/bt_service/bt_keys_storage.h index 587dd570dd..b7a127035d 100644 --- a/applications/services/bt/bt_service/bt_keys_storage.h +++ b/applications/services/bt/bt_service/bt_keys_storage.h @@ -17,6 +17,8 @@ void bt_keys_storage_set_file_path(BtKeysStorage* instance, const char* path); void bt_keys_storage_set_ram_params(BtKeysStorage* instance, uint8_t* buff, uint16_t size); +bool bt_keys_storage_is_changed(BtKeysStorage* instance); + bool bt_keys_storage_load(BtKeysStorage* instance); bool bt_keys_storage_update(BtKeysStorage* instance, uint8_t* start_addr, uint32_t size); diff --git a/applications/services/bt/bt_service/bt_settings_api_i.h b/applications/services/bt/bt_service/bt_settings_api_i.h new file mode 100644 index 0000000000..4412958931 --- /dev/null +++ b/applications/services/bt/bt_service/bt_settings_api_i.h @@ -0,0 +1,8 @@ +#pragma once + +#include "bt.h" +#include "../bt_settings.h" + +void bt_get_settings(Bt* bt, BtSettings* settings); + +void bt_set_settings(Bt* bt, const BtSettings* settings); diff --git a/applications/services/bt/bt_settings.c b/applications/services/bt/bt_settings.c index 3602cf4977..abdc97f7e7 100644 --- a/applications/services/bt/bt_settings.c +++ b/applications/services/bt/bt_settings.c @@ -1,23 +1,36 @@ #include "bt_settings.h" +#include "bt_settings_filename.h" #include -#include #include +#include + +#define TAG "BtSettings" #define BT_SETTINGS_PATH INT_PATH(BT_SETTINGS_FILE_NAME) #define BT_SETTINGS_VERSION (0) #define BT_SETTINGS_MAGIC (0x19) -bool bt_settings_load(BtSettings* bt_settings) { +void bt_settings_load(BtSettings* bt_settings) { furi_assert(bt_settings); - return saved_struct_load( + const bool success = saved_struct_load( BT_SETTINGS_PATH, bt_settings, sizeof(BtSettings), BT_SETTINGS_MAGIC, BT_SETTINGS_VERSION); + + if(!success) { + FURI_LOG_W(TAG, "Failed to load settings, using defaults"); + memset(bt_settings, 0, sizeof(BtSettings)); + bt_settings_save(bt_settings); + } } -bool bt_settings_save(const BtSettings* bt_settings) { +void bt_settings_save(const BtSettings* bt_settings) { furi_assert(bt_settings); - return saved_struct_save( + const bool success = saved_struct_save( BT_SETTINGS_PATH, bt_settings, sizeof(BtSettings), BT_SETTINGS_MAGIC, BT_SETTINGS_VERSION); + + if(!success) { + FURI_LOG_E(TAG, "Failed to save settings"); + } } diff --git a/applications/services/bt/bt_settings.h b/applications/services/bt/bt_settings.h index a4e76a12cc..c63220abb2 100644 --- a/applications/services/bt/bt_settings.h +++ b/applications/services/bt/bt_settings.h @@ -1,8 +1,5 @@ #pragma once -#include "bt_settings_filename.h" - -#include #include #ifdef __cplusplus @@ -13,9 +10,9 @@ typedef struct { bool enabled; } BtSettings; -bool bt_settings_load(BtSettings* bt_settings); +void bt_settings_load(BtSettings* bt_settings); -bool bt_settings_save(const BtSettings* bt_settings); +void bt_settings_save(const BtSettings* bt_settings); #ifdef __cplusplus } diff --git a/applications/services/desktop/animations/animation_manager.c b/applications/services/desktop/animations/animation_manager.c index 8e04e7894e..dd2ae76a1c 100644 --- a/applications/services/desktop/animations/animation_manager.c +++ b/applications/services/desktop/animations/animation_manager.c @@ -97,8 +97,11 @@ void animation_manager_set_interact_callback( void animation_manager_set_dummy_mode_state(AnimationManager* animation_manager, bool enabled) { furi_assert(animation_manager); - animation_manager->dummy_mode = enabled; - animation_manager_start_new_idle(animation_manager); + // Prevent change of animations if mode is the same + if(animation_manager->dummy_mode != enabled) { + animation_manager->dummy_mode = enabled; + animation_manager_start_new_idle(animation_manager); + } } static void animation_manager_check_blocking_callback(const void* message, void* context) { diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 8b0c6d7538..66e503e967 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -1,31 +1,24 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "desktop_i.h" + #include #include + +#include + #include +#include -#include "animations/animation_manager.h" -#include "desktop/scenes/desktop_scene.h" -#include "desktop/scenes/desktop_scene_i.h" -#include "desktop/views/desktop_view_locked.h" -#include "desktop/views/desktop_view_pin_input.h" -#include "desktop/views/desktop_view_pin_timeout.h" -#include "desktop_i.h" -#include "helpers/pin.h" -#include "helpers/slideshow_filename.h" +#include + +#include "scenes/desktop_scene.h" +#include "scenes/desktop_scene_locked.h" #define TAG "Desktop" static void desktop_auto_lock_arm(Desktop*); static void desktop_auto_lock_inhibit(Desktop*); static void desktop_start_auto_lock_timer(Desktop*); +static void desktop_apply_settings(Desktop*); static void desktop_loader_callback(const void* message, void* context) { furi_assert(context); @@ -42,6 +35,16 @@ static void desktop_loader_callback(const void* message, void* context) { } } +static void desktop_storage_callback(const void* message, void* context) { + furi_assert(context); + Desktop* desktop = context; + const StorageEvent* event = message; + + if(event->type == StorageEventTypeCardMount) { + view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopGlobalReloadSettings); + } +} + static void desktop_lock_icon_draw_callback(Canvas* canvas, void* context) { UNUSED(context); furi_assert(canvas); @@ -122,30 +125,39 @@ static bool desktop_custom_event_callback(void* context, uint32_t event) { furi_assert(context); Desktop* desktop = (Desktop*)context; - switch(event) { - case DesktopGlobalBeforeAppStarted: + if(event == DesktopGlobalBeforeAppStarted) { if(animation_manager_is_animation_loaded(desktop->animation_manager)) { animation_manager_unload_and_stall_animation(desktop->animation_manager); } + desktop_auto_lock_inhibit(desktop); - furi_semaphore_release(desktop->animation_semaphore); - return true; - case DesktopGlobalAfterAppFinished: - animation_manager_load_and_continue_animation(desktop->animation_manager); - DESKTOP_SETTINGS_LOAD(&desktop->settings); + desktop->app_running = true; - desktop_clock_reconfigure(desktop); + furi_semaphore_release(desktop->animation_semaphore); + } else if(event == DesktopGlobalAfterAppFinished) { + animation_manager_load_and_continue_animation(desktop->animation_manager); desktop_auto_lock_arm(desktop); - return true; - case DesktopGlobalAutoLock: - if(!loader_is_locked(desktop->loader) && !desktop->locked) { + desktop->app_running = false; + + } else if(event == DesktopGlobalAutoLock) { + if(!desktop->app_running && !desktop->locked) { desktop_lock(desktop); } - return true; + + } else if(event == DesktopGlobalSaveSettings) { + desktop_settings_save(&desktop->settings); + desktop_apply_settings(desktop); + + } else if(event == DesktopGlobalReloadSettings) { + desktop_settings_load(&desktop->settings); + desktop_apply_settings(desktop); + + } else { + return scene_manager_handle_custom_event(desktop->scene_manager, event); } - return scene_manager_handle_custom_event(desktop->scene_manager, event); + return true; } static bool desktop_back_event_callback(void* context) { @@ -205,84 +217,45 @@ static void desktop_clock_timer_callback(void* context) { furi_assert(context); Desktop* desktop = context; - if(gui_active_view_port_count(desktop->gui, GuiLayerStatusBarLeft) < 6) { - desktop_clock_update(desktop); - - view_port_enabled_set(desktop->clock_viewport, true); - } else { - view_port_enabled_set(desktop->clock_viewport, false); - } -} - -void desktop_lock(Desktop* desktop) { - furi_assert(!desktop->locked); - - furi_hal_rtc_set_flag(FuriHalRtcFlagLock); + const bool clock_enabled = gui_active_view_port_count(desktop->gui, GuiLayerStatusBarLeft) < 6; - if(desktop->settings.pin_code.length) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_session_close(cli); - furi_record_close(RECORD_CLI); + if(clock_enabled) { + desktop_clock_update(desktop); } - desktop_auto_lock_inhibit(desktop); - scene_manager_set_scene_state( - desktop->scene_manager, DesktopSceneLocked, SCENE_LOCKED_FIRST_ENTER); - scene_manager_next_scene(desktop->scene_manager, DesktopSceneLocked); - - DesktopStatus status = {.locked = true}; - furi_pubsub_publish(desktop->status_pubsub, &status); - - desktop->locked = true; + view_port_enabled_set(desktop->clock_viewport, clock_enabled); } -void desktop_unlock(Desktop* desktop) { - furi_assert(desktop->locked); - - view_port_enabled_set(desktop->lock_icon_viewport, false); - Gui* gui = furi_record_open(RECORD_GUI); - gui_set_lockdown(gui, false); - furi_record_close(RECORD_GUI); - desktop_view_locked_unlock(desktop->locked_view); - scene_manager_search_and_switch_to_previous_scene(desktop->scene_manager, DesktopSceneMain); - desktop_auto_lock_arm(desktop); - furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); - furi_hal_rtc_set_pin_fails(0); +static void desktop_apply_settings(Desktop* desktop) { + desktop->in_transition = true; - if(desktop->settings.pin_code.length) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_session_open(cli, &cli_vcp); - furi_record_close(RECORD_CLI); - } + desktop_clock_reconfigure(desktop); - DesktopStatus status = {.locked = false}; - furi_pubsub_publish(desktop->status_pubsub, &status); + view_port_enabled_set(desktop->dummy_mode_icon_viewport, desktop->settings.dummy_mode); + desktop_main_set_dummy_mode_state(desktop->main_view, desktop->settings.dummy_mode); + animation_manager_set_dummy_mode_state( + desktop->animation_manager, desktop->settings.dummy_mode); - desktop->locked = false; -} + if(!desktop->app_running && !desktop->locked) { + desktop_auto_lock_arm(desktop); + } -void desktop_set_dummy_mode_state(Desktop* desktop, bool enabled) { - desktop->in_transition = true; - view_port_enabled_set(desktop->dummy_mode_icon_viewport, enabled); - desktop_main_set_dummy_mode_state(desktop->main_view, enabled); - animation_manager_set_dummy_mode_state(desktop->animation_manager, enabled); - desktop->settings.dummy_mode = enabled; - DESKTOP_SETTINGS_SAVE(&desktop->settings); desktop->in_transition = false; } -void desktop_set_stealth_mode_state(Desktop* desktop, bool enabled) { - desktop->in_transition = true; - if(enabled) { - furi_hal_rtc_set_flag(FuriHalRtcFlagStealthMode); - } else { - furi_hal_rtc_reset_flag(FuriHalRtcFlagStealthMode); +static void desktop_init_settings(Desktop* desktop) { + furi_pubsub_subscribe(storage_get_pubsub(desktop->storage), desktop_storage_callback, desktop); + + if(storage_sd_status(desktop->storage) != FSE_OK) { + FURI_LOG_D(TAG, "SD Card not ready, skipping settings"); + return; } - view_port_enabled_set(desktop->stealth_mode_icon_viewport, enabled); - desktop->in_transition = false; + + desktop_settings_load(&desktop->settings); + desktop_apply_settings(desktop); } -Desktop* desktop_alloc(void) { +static Desktop* desktop_alloc(void) { Desktop* desktop = malloc(sizeof(Desktop)); desktop->animation_semaphore = furi_semaphore_alloc(1, 0); @@ -391,14 +364,13 @@ Desktop* desktop_alloc(void) { } gui_add_view_port(desktop->gui, desktop->stealth_mode_icon_viewport, GuiLayerStatusBarLeft); + // Unload animations before starting an application desktop->loader = furi_record_open(RECORD_LOADER); + furi_pubsub_subscribe(loader_get_pubsub(desktop->loader), desktop_loader_callback, desktop); + desktop->storage = furi_record_open(RECORD_STORAGE); desktop->notification = furi_record_open(RECORD_NOTIFICATION); - desktop->app_start_stop_subscription = furi_pubsub_subscribe( - loader_get_pubsub(desktop->loader), desktop_loader_callback, desktop); - desktop->input_events_pubsub = furi_record_open(RECORD_INPUT_EVENTS); - desktop->input_events_subscription = NULL; desktop->auto_lock_timer = furi_timer_alloc(desktop_auto_lock_timer_callback, FuriTimerTypeOnce, desktop); @@ -408,19 +380,95 @@ Desktop* desktop_alloc(void) { desktop->update_clock_timer = furi_timer_alloc(desktop_clock_timer_callback, FuriTimerTypePeriodic, desktop); + desktop->app_running = loader_is_locked(desktop->loader); + furi_record_create(RECORD_DESKTOP, desktop); return desktop; } -static bool desktop_check_file_flag(const char* flag_path) { - Storage* storage = furi_record_open(RECORD_STORAGE); - bool exists = storage_common_stat(storage, flag_path, NULL) == FSE_OK; - furi_record_close(RECORD_STORAGE); +/* + * Private API + */ + +void desktop_lock(Desktop* desktop) { + furi_assert(!desktop->locked); + + furi_hal_rtc_set_flag(FuriHalRtcFlagLock); + + if(desktop_pin_code_is_set()) { + Cli* cli = furi_record_open(RECORD_CLI); + cli_session_close(cli); + furi_record_close(RECORD_CLI); + } + + desktop_auto_lock_inhibit(desktop); + scene_manager_set_scene_state( + desktop->scene_manager, DesktopSceneLocked, DesktopSceneLockedStateFirstEnter); + scene_manager_next_scene(desktop->scene_manager, DesktopSceneLocked); + + DesktopStatus status = {.locked = true}; + furi_pubsub_publish(desktop->status_pubsub, &status); + + desktop->locked = true; +} + +void desktop_unlock(Desktop* desktop) { + furi_assert(desktop->locked); + + view_port_enabled_set(desktop->lock_icon_viewport, false); + Gui* gui = furi_record_open(RECORD_GUI); + gui_set_lockdown(gui, false); + furi_record_close(RECORD_GUI); + desktop_view_locked_unlock(desktop->locked_view); + scene_manager_search_and_switch_to_previous_scene(desktop->scene_manager, DesktopSceneMain); + desktop_auto_lock_arm(desktop); + furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); + furi_hal_rtc_set_pin_fails(0); + + if(desktop_pin_code_is_set()) { + Cli* cli = furi_record_open(RECORD_CLI); + cli_session_open(cli, &cli_vcp); + furi_record_close(RECORD_CLI); + } + + DesktopStatus status = {.locked = false}; + furi_pubsub_publish(desktop->status_pubsub, &status); + + desktop->locked = false; +} + +void desktop_set_dummy_mode_state(Desktop* desktop, bool enabled) { + desktop->in_transition = true; + + view_port_enabled_set(desktop->dummy_mode_icon_viewport, enabled); + desktop_main_set_dummy_mode_state(desktop->main_view, enabled); + animation_manager_set_dummy_mode_state(desktop->animation_manager, enabled); + desktop->settings.dummy_mode = enabled; + + desktop->in_transition = false; + + desktop_settings_save(&desktop->settings); +} + +void desktop_set_stealth_mode_state(Desktop* desktop, bool enabled) { + desktop->in_transition = true; + + if(enabled) { + furi_hal_rtc_set_flag(FuriHalRtcFlagStealthMode); + } else { + furi_hal_rtc_reset_flag(FuriHalRtcFlagStealthMode); + } + + view_port_enabled_set(desktop->stealth_mode_icon_viewport, enabled); - return exists; + desktop->in_transition = false; } +/* + * Public API + */ + bool desktop_api_is_locked(Desktop* instance) { furi_assert(instance); return furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock); @@ -436,6 +484,30 @@ FuriPubSub* desktop_api_get_status_pubsub(Desktop* instance) { return instance->status_pubsub; } +void desktop_api_reload_settings(Desktop* instance) { + furi_assert(instance); + view_dispatcher_send_custom_event(instance->view_dispatcher, DesktopGlobalReloadSettings); +} + +void desktop_api_get_settings(Desktop* instance, DesktopSettings* settings) { + furi_assert(instance); + furi_assert(settings); + + *settings = instance->settings; +} + +void desktop_api_set_settings(Desktop* instance, const DesktopSettings* settings) { + furi_assert(instance); + furi_assert(settings); + + instance->settings = *settings; + view_dispatcher_send_custom_event(instance->view_dispatcher, DesktopGlobalSaveSettings); +} + +/* + * Application thread + */ + int32_t desktop_srv(void* p) { UNUSED(p); @@ -448,31 +520,15 @@ int32_t desktop_srv(void* p) { Desktop* desktop = desktop_alloc(); - bool loaded = DESKTOP_SETTINGS_LOAD(&desktop->settings); - if(!loaded) { - memset(&desktop->settings, 0, sizeof(desktop->settings)); - DESKTOP_SETTINGS_SAVE(&desktop->settings); - } - - view_port_enabled_set(desktop->dummy_mode_icon_viewport, desktop->settings.dummy_mode); - - desktop_clock_reconfigure(desktop); - - desktop_main_set_dummy_mode_state(desktop->main_view, desktop->settings.dummy_mode); - animation_manager_set_dummy_mode_state( - desktop->animation_manager, desktop->settings.dummy_mode); + desktop_init_settings(desktop); scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) { desktop_lock(desktop); - } else { - if(!loader_is_locked(desktop->loader)) { - desktop_auto_lock_arm(desktop); - } } - if(desktop_check_file_flag(SLIDESHOW_FS_PATH)) { + if(storage_file_exists(desktop->storage, SLIDESHOW_FS_PATH)) { scene_manager_next_scene(desktop->scene_manager, DesktopSceneSlideshow); } @@ -496,14 +552,12 @@ int32_t desktop_srv(void* p) { } // Special case: autostart application is already running - if(loader_is_locked(desktop->loader) && - animation_manager_is_animation_loaded(desktop->animation_manager)) { + if(desktop->app_running && animation_manager_is_animation_loaded(desktop->animation_manager)) { animation_manager_unload_and_stall_animation(desktop->animation_manager); } view_dispatcher_run(desktop->view_dispatcher); - furi_crash("That was unexpected"); - + // Should never get here (a service thread will crash automatically if it returns) return 0; } diff --git a/applications/services/desktop/desktop.h b/applications/services/desktop/desktop.h index 4eab24fcc5..e83bc3ee4d 100644 --- a/applications/services/desktop/desktop.h +++ b/applications/services/desktop/desktop.h @@ -2,16 +2,22 @@ #include -typedef struct Desktop Desktop; +#include "desktop_settings.h" #define RECORD_DESKTOP "desktop" -bool desktop_api_is_locked(Desktop* instance); - -void desktop_api_unlock(Desktop* instance); +typedef struct Desktop Desktop; typedef struct { bool locked; } DesktopStatus; +bool desktop_api_is_locked(Desktop* instance); + +void desktop_api_unlock(Desktop* instance); + FuriPubSub* desktop_api_get_status_pubsub(Desktop* instance); + +void desktop_api_get_settings(Desktop* instance, DesktopSettings* settings); + +void desktop_api_set_settings(Desktop* instance, const DesktopSettings* settings); diff --git a/applications/services/desktop/desktop_i.h b/applications/services/desktop/desktop_i.h index 4bcbb6585a..1dc7c7d219 100644 --- a/applications/services/desktop/desktop_i.h +++ b/applications/services/desktop/desktop_i.h @@ -1,6 +1,8 @@ #pragma once #include "desktop.h" +#include "desktop_settings.h" + #include "animations/animation_manager.h" #include "views/desktop_view_pin_timeout.h" #include "views/desktop_view_pin_input.h" @@ -9,9 +11,7 @@ #include "views/desktop_view_lock_menu.h" #include "views/desktop_view_debug.h" #include "views/desktop_view_slideshow.h" -#include -#include #include #include #include @@ -42,9 +42,8 @@ typedef struct { } DesktopClock; struct Desktop { - // Scene FuriThread* scene_thread; - // GUI + Gui* gui; ViewDispatcher* view_dispatcher; SceneManager* scene_manager; @@ -56,42 +55,38 @@ struct Desktop { DesktopMainView* main_view; DesktopViewPinTimeout* pin_timeout_view; DesktopSlideshowView* slideshow_view; + DesktopViewPinInput* pin_input_view; ViewStack* main_view_stack; ViewStack* locked_view_stack; - DesktopSettings settings; - DesktopViewPinInput* pin_input_view; - ViewPort* lock_icon_viewport; ViewPort* dummy_mode_icon_viewport; ViewPort* clock_viewport; ViewPort* stealth_mode_icon_viewport; - AnimationManager* animation_manager; - Loader* loader; + Storage* storage; NotificationApp* notification; - FuriPubSubSubscription* app_start_stop_subscription; + FuriPubSub* status_pubsub; FuriPubSub* input_events_pubsub; FuriPubSubSubscription* input_events_subscription; + FuriTimer* auto_lock_timer; FuriTimer* update_clock_timer; - FuriPubSub* status_pubsub; + AnimationManager* animation_manager; + FuriSemaphore* animation_semaphore; DesktopClock clock; + DesktopSettings settings; - bool in_transition : 1; - bool locked : 1; - - FuriSemaphore* animation_semaphore; + bool in_transition; + bool app_running; + bool locked; }; -Desktop* desktop_alloc(void); - -void desktop_free(Desktop* desktop); void desktop_lock(Desktop* desktop); void desktop_unlock(Desktop* desktop); void desktop_set_dummy_mode_state(Desktop* desktop, bool enabled); diff --git a/applications/services/desktop/desktop_settings.c b/applications/services/desktop/desktop_settings.c new file mode 100644 index 0000000000..f66fdeda71 --- /dev/null +++ b/applications/services/desktop/desktop_settings.c @@ -0,0 +1,79 @@ +#include "desktop_settings.h" +#include "desktop_settings_filename.h" + +#include +#include + +#define TAG "DesktopSettings" + +#define DESKTOP_SETTINGS_VER_10 (10) +#define DESKTOP_SETTINGS_VER (11) + +#define DESKTOP_SETTINGS_PATH INT_PATH(DESKTOP_SETTINGS_FILE_NAME) +#define DESKTOP_SETTINGS_MAGIC (0x17) + +typedef struct { + uint8_t reserved[11]; + DesktopSettings settings; +} DesktopSettingsV10; + +// Actual size of DesktopSettings v10 +static_assert(sizeof(DesktopSettingsV10) == 1044); + +void desktop_settings_load(DesktopSettings* settings) { + furi_assert(settings); + + bool success = false; + + do { + uint8_t version; + if(!saved_struct_get_metadata(DESKTOP_SETTINGS_PATH, NULL, &version, NULL)) break; + + if(version == DESKTOP_SETTINGS_VER) { + success = saved_struct_load( + DESKTOP_SETTINGS_PATH, + settings, + sizeof(DesktopSettings), + DESKTOP_SETTINGS_MAGIC, + DESKTOP_SETTINGS_VER); + + } else if(version == DESKTOP_SETTINGS_VER_10) { + DesktopSettingsV10* settings_v10 = malloc(sizeof(DesktopSettingsV10)); + + success = saved_struct_load( + DESKTOP_SETTINGS_PATH, + settings_v10, + sizeof(DesktopSettingsV10), + DESKTOP_SETTINGS_MAGIC, + DESKTOP_SETTINGS_VER_10); + + if(success) { + *settings = settings_v10->settings; + } + + free(settings_v10); + } + + } while(false); + + if(!success) { + FURI_LOG_W(TAG, "Failed to load file, using defaults"); + memset(settings, 0, sizeof(DesktopSettings)); + desktop_settings_save(settings); + } +} + +void desktop_settings_save(const DesktopSettings* settings) { + furi_assert(settings); + + const bool success = saved_struct_save( + DESKTOP_SETTINGS_PATH, + settings, + sizeof(DesktopSettings), + DESKTOP_SETTINGS_MAGIC, + DESKTOP_SETTINGS_VER); + + if(!success) { + FURI_LOG_E(TAG, "Failed to save file"); + } +} diff --git a/applications/services/desktop/desktop_settings.h b/applications/services/desktop/desktop_settings.h index 54be6aaa91..c07ac314d3 100644 --- a/applications/services/desktop/desktop_settings.h +++ b/applications/services/desktop/desktop_settings.h @@ -1,43 +1,9 @@ #pragma once -#include "desktop_settings_filename.h" - -#include #include -#include -#include -#include - -#define DESKTOP_SETTINGS_VER (10) - -#define DESKTOP_SETTINGS_PATH INT_PATH(DESKTOP_SETTINGS_FILE_NAME) -#define DESKTOP_SETTINGS_MAGIC (0x17) -#define PIN_MAX_LENGTH 12 - -#define DESKTOP_SETTINGS_RUN_PIN_SETUP_ARG "run_pin_setup" - -#define DESKTOP_SETTINGS_SAVE(x) \ - saved_struct_save( \ - DESKTOP_SETTINGS_PATH, \ - (x), \ - sizeof(DesktopSettings), \ - DESKTOP_SETTINGS_MAGIC, \ - DESKTOP_SETTINGS_VER) - -#define DESKTOP_SETTINGS_LOAD(x) \ - saved_struct_load( \ - DESKTOP_SETTINGS_PATH, \ - (x), \ - sizeof(DesktopSettings), \ - DESKTOP_SETTINGS_MAGIC, \ - DESKTOP_SETTINGS_VER) - -#define MAX_PIN_SIZE 10 -#define MIN_PIN_SIZE 4 -#define MAX_APP_LENGTH 128 typedef enum { - FavoriteAppLeftShort = 0, + FavoriteAppLeftShort, FavoriteAppLeftLong, FavoriteAppRightShort, FavoriteAppRightLong, @@ -45,7 +11,7 @@ typedef enum { } FavoriteAppShortcut; typedef enum { - DummyAppLeft = 0, + DummyAppLeft, DummyAppRight, DummyAppDown, DummyAppOk, @@ -53,19 +19,16 @@ typedef enum { } DummyAppShortcut; typedef struct { - InputKey data[MAX_PIN_SIZE]; - uint8_t length; -} PinCode; - -typedef struct { - char name_or_path[MAX_APP_LENGTH]; + char name_or_path[128]; } FavoriteApp; typedef struct { - PinCode pin_code; uint32_t auto_lock_delay_ms; uint8_t dummy_mode; uint8_t display_clock; FavoriteApp favorite_apps[FavoriteAppNumber]; FavoriteApp dummy_apps[DummyAppNumber]; } DesktopSettings; + +void desktop_settings_load(DesktopSettings* settings); +void desktop_settings_save(const DesktopSettings* settings); diff --git a/applications/services/desktop/helpers/pin.c b/applications/services/desktop/helpers/pin.c deleted file mode 100644 index 0b1149d6c2..0000000000 --- a/applications/services/desktop/helpers/pin.c +++ /dev/null @@ -1,72 +0,0 @@ -#include "pin.h" - -#include -#include -#include -#include -#include -#include - -static const NotificationSequence sequence_pin_fail = { - &message_display_backlight_on, - - &message_red_255, - &message_vibro_on, - &message_delay_100, - &message_vibro_off, - &message_red_0, - - &message_delay_250, - - &message_red_255, - &message_vibro_on, - &message_delay_100, - &message_vibro_off, - &message_red_0, - NULL, -}; - -static const uint8_t desktop_helpers_fails_timeout[] = { - 0, - 0, - 0, - 0, - 30, - 60, - 90, - 120, - 150, - 180, - /* +60 for every next fail */ -}; - -void desktop_pin_lock_error_notify(void) { - NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); - notification_message(notification, &sequence_pin_fail); - furi_record_close(RECORD_NOTIFICATION); -} - -uint32_t desktop_pin_lock_get_fail_timeout(void) { - uint32_t pin_fails = furi_hal_rtc_get_pin_fails(); - uint32_t pin_timeout = 0; - uint32_t max_index = COUNT_OF(desktop_helpers_fails_timeout) - 1; - if(pin_fails <= max_index) { - pin_timeout = desktop_helpers_fails_timeout[pin_fails]; - } else { - pin_timeout = desktop_helpers_fails_timeout[max_index] + (pin_fails - max_index) * 60; - } - - return pin_timeout; -} - -bool desktop_pin_compare(const PinCode* pin_code1, const PinCode* pin_code2) { - furi_assert(pin_code1); - furi_assert(pin_code2); - bool result = false; - - if(pin_code1->length == pin_code2->length) { - result = !memcmp(pin_code1->data, pin_code2->data, pin_code1->length); - } - - return result; -} diff --git a/applications/services/desktop/helpers/pin.h b/applications/services/desktop/helpers/pin.h deleted file mode 100644 index 23d16b0aa4..0000000000 --- a/applications/services/desktop/helpers/pin.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once -#include -#include -#include "../desktop.h" -#include - -void desktop_pin_lock_error_notify(void); - -uint32_t desktop_pin_lock_get_fail_timeout(void); - -bool desktop_pin_compare(const PinCode* pin_code1, const PinCode* pin_code2); diff --git a/applications/services/desktop/helpers/pin_code.c b/applications/services/desktop/helpers/pin_code.c new file mode 100644 index 0000000000..d1a37ed24c --- /dev/null +++ b/applications/services/desktop/helpers/pin_code.c @@ -0,0 +1,103 @@ +#include "pin_code.h" + +#include + +#include +#include + +#define DESKTOP_PIN_CODE_DIGIT_BIT_WIDTH (2) +#define DESKTOP_PIN_CODE_LENGTH_OFFSET (28) + +static const NotificationSequence sequence_pin_fail = { + &message_display_backlight_on, + + &message_red_255, + &message_vibro_on, + &message_delay_100, + &message_vibro_off, + &message_red_0, + + &message_delay_250, + + &message_red_255, + &message_vibro_on, + &message_delay_100, + &message_vibro_off, + &message_red_0, + NULL, +}; + +static const uint8_t desktop_helpers_fails_timeout[] = { + 0, + 0, + 0, + 0, + 30, + 60, + 90, + 120, + 150, + 180, + /* +60 for every next fail */ +}; + +static uint32_t desktop_pin_code_pack(const DesktopPinCode* pin_code) { + furi_check(pin_code); + furi_check(pin_code->length <= sizeof(pin_code->data)); + + uint32_t reg_value = 0; + + for(uint8_t i = 0; i < pin_code->length; ++i) { + furi_check(pin_code->data[i] < (1 << DESKTOP_PIN_CODE_DIGIT_BIT_WIDTH)); + reg_value |= (uint32_t)pin_code->data[i] << (i * DESKTOP_PIN_CODE_DIGIT_BIT_WIDTH); + } + + reg_value |= (uint32_t)pin_code->length << DESKTOP_PIN_CODE_LENGTH_OFFSET; + + return reg_value; +} + +bool desktop_pin_code_is_set(void) { + return furi_hal_rtc_get_pin_value() >> DESKTOP_PIN_CODE_LENGTH_OFFSET; +} + +void desktop_pin_code_set(const DesktopPinCode* pin_code) { + furi_hal_rtc_set_pin_value(desktop_pin_code_pack(pin_code)); +} + +void desktop_pin_code_reset(void) { + furi_hal_rtc_set_pin_value(0); +} + +bool desktop_pin_code_check(const DesktopPinCode* pin_code) { + return furi_hal_rtc_get_pin_value() == desktop_pin_code_pack(pin_code); +} + +bool desktop_pin_code_is_equal(const DesktopPinCode* pin_code1, const DesktopPinCode* pin_code2) { + furi_check(pin_code1); + furi_check(pin_code1->length <= sizeof(pin_code1->data)); + furi_check(pin_code2); + furi_check(pin_code2->length <= sizeof(pin_code2->data)); + + return pin_code1->length == pin_code2->length && + memcmp(pin_code1->data, pin_code2->data, pin_code1->length) == 0; +} + +void desktop_pin_lock_error_notify(void) { + NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); + notification_message(notification, &sequence_pin_fail); + furi_record_close(RECORD_NOTIFICATION); +} + +uint32_t desktop_pin_lock_get_fail_timeout(void) { + uint32_t pin_fails = furi_hal_rtc_get_pin_fails(); + uint32_t pin_timeout = 0; + uint32_t max_index = COUNT_OF(desktop_helpers_fails_timeout) - 1; + if(pin_fails <= max_index) { + pin_timeout = desktop_helpers_fails_timeout[pin_fails]; + } else { + pin_timeout = desktop_helpers_fails_timeout[max_index] + (pin_fails - max_index) * 60; + } + + return pin_timeout; +} diff --git a/applications/services/desktop/helpers/pin_code.h b/applications/services/desktop/helpers/pin_code.h new file mode 100644 index 0000000000..848c915b6c --- /dev/null +++ b/applications/services/desktop/helpers/pin_code.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include + +#define DESKTOP_PIN_CODE_MAX_LEN (10) + +typedef struct { + uint8_t data[DESKTOP_PIN_CODE_MAX_LEN]; + uint8_t length; +} DesktopPinCode; + +bool desktop_pin_code_is_set(void); + +void desktop_pin_code_set(const DesktopPinCode* pin_code); + +void desktop_pin_code_reset(void); + +bool desktop_pin_code_check(const DesktopPinCode* pin_code); + +bool desktop_pin_code_is_equal(const DesktopPinCode* pin_code1, const DesktopPinCode* pin_code2); + +void desktop_pin_lock_error_notify(void); + +uint32_t desktop_pin_lock_get_fail_timeout(void); diff --git a/applications/services/desktop/scenes/desktop_scene_i.h b/applications/services/desktop/scenes/desktop_scene_i.h deleted file mode 100644 index f481733aca..0000000000 --- a/applications/services/desktop/scenes/desktop_scene_i.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#define SCENE_LOCKED_FIRST_ENTER 0 -#define SCENE_LOCKED_REPEAT_ENTER 1 diff --git a/applications/services/desktop/scenes/desktop_scene_lock_menu.c b/applications/services/desktop/scenes/desktop_scene_lock_menu.c index 5951a8e4e3..5ca95c4c59 100644 --- a/applications/services/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/services/desktop/scenes/desktop_scene_lock_menu.c @@ -20,7 +20,6 @@ void desktop_scene_lock_menu_callback(DesktopEvent event, void* context) { void desktop_scene_lock_menu_on_enter(void* context) { Desktop* desktop = (Desktop*)context; - DESKTOP_SETTINGS_LOAD(&desktop->settings); scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); desktop_lock_menu_set_callback(desktop->lock_menu, desktop_scene_lock_menu_callback, desktop); desktop_lock_menu_set_dummy_mode_state(desktop->lock_menu, desktop->settings.dummy_mode); @@ -38,11 +37,8 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeTick) { bool check_pin_changed = scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneLockMenu); - if(check_pin_changed) { - DESKTOP_SETTINGS_LOAD(&desktop->settings); - if(desktop->settings.pin_code.length > 0) { - scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); - } + if(check_pin_changed && desktop_pin_code_is_set()) { + scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); } } else if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { diff --git a/applications/services/desktop/scenes/desktop_scene_locked.c b/applications/services/desktop/scenes/desktop_scene_locked.c index 846b2b5412..e7eeebca6d 100644 --- a/applications/services/desktop/scenes/desktop_scene_locked.c +++ b/applications/services/desktop/scenes/desktop_scene_locked.c @@ -6,12 +6,12 @@ #include "../desktop.h" #include "../desktop_i.h" -#include "../helpers/pin.h" +#include "../helpers/pin_code.h" #include "../animations/animation_manager.h" #include "../views/desktop_events.h" #include "../views/desktop_view_locked.h" #include "desktop_scene.h" -#include "desktop_scene_i.h" +#include "desktop_scene_locked.h" #define WRONG_PIN_HEADER_TIMEOUT 3000 #define INPUT_PIN_VIEW_TIMEOUT 15000 @@ -42,15 +42,13 @@ void desktop_scene_locked_on_enter(void* context) { bool switch_to_timeout_scene = false; uint32_t state = scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneLocked); - if(state == SCENE_LOCKED_FIRST_ENTER) { - bool pin_locked = desktop->settings.pin_code.length > 0; + if(state == DesktopSceneLockedStateFirstEnter) { view_port_enabled_set(desktop->lock_icon_viewport, true); Gui* gui = furi_record_open(RECORD_GUI); gui_set_lockdown(gui, true); furi_record_close(RECORD_GUI); - if(pin_locked) { - DESKTOP_SETTINGS_LOAD(&desktop->settings); + if(desktop_pin_code_is_set()) { desktop_view_locked_lock(desktop->locked_view, true); uint32_t pin_timeout = desktop_pin_lock_get_fail_timeout(); if(pin_timeout > 0) { @@ -65,7 +63,7 @@ void desktop_scene_locked_on_enter(void* context) { desktop_view_locked_close_doors(desktop->locked_view); } scene_manager_set_scene_state( - desktop->scene_manager, DesktopSceneLocked, SCENE_LOCKED_REPEAT_ENTER); + desktop->scene_manager, DesktopSceneLocked, DesktopSceneLockedStateRepeatEnter); } if(switch_to_timeout_scene) { diff --git a/applications/services/desktop/scenes/desktop_scene_locked.h b/applications/services/desktop/scenes/desktop_scene_locked.h new file mode 100644 index 0000000000..7d5b6b7bcd --- /dev/null +++ b/applications/services/desktop/scenes/desktop_scene_locked.h @@ -0,0 +1,6 @@ +#pragma once + +typedef enum { + DesktopSceneLockedStateFirstEnter, + DesktopSceneLockedStateRepeatEnter, +} DesktopSceneLockedState; diff --git a/applications/services/desktop/scenes/desktop_scene_main.c b/applications/services/desktop/scenes/desktop_scene_main.c index 5f3778d132..af01ec8c7e 100644 --- a/applications/services/desktop/scenes/desktop_scene_main.c +++ b/applications/services/desktop/scenes/desktop_scene_main.c @@ -141,25 +141,21 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { } case DesktopMainEventOpenFavoriteLeftShort: - DESKTOP_SETTINGS_LOAD(&desktop->settings); desktop_scene_main_start_favorite( desktop, &desktop->settings.favorite_apps[FavoriteAppLeftShort]); consumed = true; break; case DesktopMainEventOpenFavoriteLeftLong: - DESKTOP_SETTINGS_LOAD(&desktop->settings); desktop_scene_main_start_favorite( desktop, &desktop->settings.favorite_apps[FavoriteAppLeftLong]); consumed = true; break; case DesktopMainEventOpenFavoriteRightShort: - DESKTOP_SETTINGS_LOAD(&desktop->settings); desktop_scene_main_start_favorite( desktop, &desktop->settings.favorite_apps[FavoriteAppRightShort]); consumed = true; break; case DesktopMainEventOpenFavoriteRightLong: - DESKTOP_SETTINGS_LOAD(&desktop->settings); desktop_scene_main_start_favorite( desktop, &desktop->settings.favorite_apps[FavoriteAppRightLong]); consumed = true; @@ -175,7 +171,6 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { break; case DesktopAnimationEventInteractAnimation: if(!animation_manager_interact_process(desktop->animation_manager)) { - DESKTOP_SETTINGS_LOAD(&desktop->settings); if(!desktop->settings.dummy_mode) { desktop_scene_main_open_app_or_profile( desktop, &desktop->settings.favorite_apps[FavoriteAppRightShort]); diff --git a/applications/services/desktop/scenes/desktop_scene_pin_input.c b/applications/services/desktop/scenes/desktop_scene_pin_input.c index 6f5bfe8cb3..449dd97f1a 100644 --- a/applications/services/desktop/scenes/desktop_scene_pin_input.c +++ b/applications/services/desktop/scenes/desktop_scene_pin_input.c @@ -10,7 +10,7 @@ #include "../desktop_i.h" #include "../views/desktop_events.h" #include "../views/desktop_view_pin_input.h" -#include "../helpers/pin.h" +#include "../helpers/pin_code.h" #include "desktop_scene.h" #define WRONG_PIN_HEADER_TIMEOUT 3000 @@ -49,10 +49,12 @@ static void desktop_scene_pin_input_back_callback(void* context) { view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopPinInputEventBack); } -static void desktop_scene_pin_input_done_callback(const PinCode* pin_code, void* context) { +static void desktop_scene_pin_input_done_callback(const DesktopPinCode* pin_code, void* context) { Desktop* desktop = (Desktop*)context; - if(desktop_pin_compare(&desktop->settings.pin_code, pin_code)) { + + if(desktop_pin_code_check(pin_code)) { view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopPinInputEventUnlocked); + } else { uint32_t pin_fails = furi_hal_rtc_get_pin_fails(); furi_hal_rtc_set_pin_fails(pin_fails + 1); diff --git a/applications/services/desktop/scenes/desktop_scene_slideshow.c b/applications/services/desktop/scenes/desktop_scene_slideshow.c index 012aff7519..7599241164 100644 --- a/applications/services/desktop/scenes/desktop_scene_slideshow.c +++ b/applications/services/desktop/scenes/desktop_scene_slideshow.c @@ -45,9 +45,6 @@ bool desktop_scene_slideshow_on_event(void* context, SceneManagerEvent event) { } void desktop_scene_slideshow_on_exit(void* context) { - UNUSED(context); - - Storage* storage = furi_record_open(RECORD_STORAGE); - storage_common_remove(storage, SLIDESHOW_FS_PATH); - furi_record_close(RECORD_STORAGE); + Desktop* desktop = context; + storage_common_remove(desktop->storage, SLIDESHOW_FS_PATH); } diff --git a/applications/services/desktop/views/desktop_events.h b/applications/services/desktop/views/desktop_events.h index 7749a7e153..07631dfac2 100644 --- a/applications/services/desktop/views/desktop_events.h +++ b/applications/services/desktop/views/desktop_events.h @@ -55,4 +55,6 @@ typedef enum { DesktopGlobalAfterAppFinished, DesktopGlobalAutoLock, DesktopGlobalApiUnlock, + DesktopGlobalSaveSettings, + DesktopGlobalReloadSettings, } DesktopEvent; diff --git a/applications/services/desktop/views/desktop_view_pin_input.c b/applications/services/desktop/views/desktop_view_pin_input.c index 965b5cceb7..c89a143c87 100644 --- a/applications/services/desktop/views/desktop_view_pin_input.c +++ b/applications/services/desktop/views/desktop_view_pin_input.c @@ -6,7 +6,6 @@ #include #include "desktop_view_pin_input.h" -#include #define NO_ACTIVITY_TIMEOUT 15000 @@ -14,6 +13,9 @@ #define DEFAULT_PIN_X 64 #define DEFAULT_PIN_Y 32 +#define MIN_PIN_LENGTH 4 +#define MAX_PIN_LENGTH DESKTOP_PIN_CODE_MAX_LEN + struct DesktopViewPinInput { View* view; DesktopViewPinInputCallback back_callback; @@ -24,7 +26,7 @@ struct DesktopViewPinInput { }; typedef struct { - PinCode pin; + DesktopPinCode pin; bool pin_hidden; bool locked_input; uint8_t pin_x; @@ -50,7 +52,7 @@ static bool desktop_view_pin_input_input(InputEvent* event, void* context) { bool call_back_callback = false; bool call_done_callback = false; - PinCode pin_code = {0}; + DesktopPinCode pin_code = {0}; if(event->type == InputTypeShort) { switch(event->key) { @@ -59,13 +61,13 @@ static bool desktop_view_pin_input_input(InputEvent* event, void* context) { case InputKeyDown: case InputKeyUp: if(!model->locked_input) { - if(model->pin.length < MAX_PIN_SIZE) { + if(model->pin.length < MAX_PIN_LENGTH) { model->pin.data[model->pin.length++] = event->key; } } break; case InputKeyOk: - if(model->pin.length >= MIN_PIN_SIZE) { + if(model->pin.length >= MIN_PIN_LENGTH) { call_done_callback = true; pin_code = model->pin; } @@ -102,7 +104,7 @@ static void desktop_view_pin_input_draw_cells(Canvas* canvas, DesktopViewPinInpu furi_assert(model); uint8_t draw_pin_size = MAX(4, model->pin.length + 1); - if(model->locked_input || (model->pin.length == MAX_PIN_SIZE)) { + if(model->locked_input || (model->pin.length == MAX_PIN_LENGTH)) { draw_pin_size = model->pin.length; } @@ -155,7 +157,7 @@ static void desktop_view_pin_input_draw(Canvas* canvas, void* context) { canvas_draw_str(canvas, 16, 60, "= clear"); } - if(model->button_label && ((model->pin.length >= MIN_PIN_SIZE) || model->locked_input)) { + if(model->button_label && ((model->pin.length >= MIN_PIN_LENGTH) || model->locked_input)) { elements_button_center(canvas, model->button_label); } @@ -247,7 +249,7 @@ void desktop_view_pin_input_unlock_input(DesktopViewPinInput* pin_input) { view_commit_model(pin_input->view, true); } -void desktop_view_pin_input_set_pin(DesktopViewPinInput* pin_input, const PinCode* pin) { +void desktop_view_pin_input_set_pin(DesktopViewPinInput* pin_input, const DesktopPinCode* pin) { furi_assert(pin_input); furi_assert(pin); diff --git a/applications/services/desktop/views/desktop_view_pin_input.h b/applications/services/desktop/views/desktop_view_pin_input.h index c430aff9ff..4605b6ff15 100644 --- a/applications/services/desktop/views/desktop_view_pin_input.h +++ b/applications/services/desktop/views/desktop_view_pin_input.h @@ -1,16 +1,17 @@ #pragma once #include -#include + +#include "../helpers/pin_code.h" typedef void (*DesktopViewPinInputCallback)(void*); -typedef void (*DesktopViewPinInputDoneCallback)(const PinCode* pin_code, void*); +typedef void (*DesktopViewPinInputDoneCallback)(const DesktopPinCode* pin_code, void*); typedef struct DesktopViewPinInput DesktopViewPinInput; DesktopViewPinInput* desktop_view_pin_input_alloc(void); void desktop_view_pin_input_free(DesktopViewPinInput*); -void desktop_view_pin_input_set_pin(DesktopViewPinInput* pin_input, const PinCode* pin); +void desktop_view_pin_input_set_pin(DesktopViewPinInput* pin_input, const DesktopPinCode* pin_code); void desktop_view_pin_input_reset_pin(DesktopViewPinInput* pin_input); void desktop_view_pin_input_hide_pin(DesktopViewPinInput* pin_input, bool pin_hidden); void desktop_view_pin_input_set_label_button(DesktopViewPinInput* pin_input, const char* label); diff --git a/applications/services/dolphin/dolphin.c b/applications/services/dolphin/dolphin.c index 95982f1af8..198c1483a3 100644 --- a/applications/services/dolphin/dolphin.c +++ b/applications/services/dolphin/dolphin.c @@ -1,6 +1,7 @@ #include "dolphin_i.h" #include +#include #define TAG "Dolphin" @@ -223,6 +224,10 @@ static bool dolphin_process_event(FuriMessageQueue* queue, void* context) { dolphin_state_increase_level(dolphin->state); furi_event_loop_timer_start(dolphin->flush_timer, FLUSH_TIMEOUT_TICKS); + } else if(event.type == DolphinEventTypeReloadState) { + dolphin_state_load(dolphin->state); + furi_event_loop_timer_start(dolphin->butthurt_timer, BUTTHURT_INCREASE_PERIOD_TICKS); + } else { furi_crash(); } @@ -232,6 +237,32 @@ static bool dolphin_process_event(FuriMessageQueue* queue, void* context) { return true; } +static void dolphin_storage_callback(const void* message, void* context) { + furi_assert(context); + Dolphin* dolphin = context; + const StorageEvent* event = message; + + if(event->type == StorageEventTypeCardMount) { + DolphinEvent event = { + .type = DolphinEventTypeReloadState, + }; + + dolphin_event_send_async(dolphin, &event); + } +} + +static void dolphin_init_state(Dolphin* dolphin) { + Storage* storage = furi_record_open(RECORD_STORAGE); + furi_pubsub_subscribe(storage_get_pubsub(storage), dolphin_storage_callback, dolphin); + + if(storage_sd_status(storage) != FSE_OK) { + FURI_LOG_D(TAG, "SD Card not ready, skipping state"); + return; + } + + dolphin_state_load(dolphin->state); +} + // Application thread int32_t dolphin_srv(void* p) { @@ -247,7 +278,7 @@ int32_t dolphin_srv(void* p) { Dolphin* dolphin = dolphin_alloc(); furi_record_create(RECORD_DOLPHIN, dolphin); - dolphin_state_load(dolphin->state); + dolphin_init_state(dolphin); furi_event_loop_message_queue_subscribe( dolphin->event_loop, diff --git a/applications/services/dolphin/dolphin_i.h b/applications/services/dolphin/dolphin_i.h index d4add808ad..6a6b3dfd81 100644 --- a/applications/services/dolphin/dolphin_i.h +++ b/applications/services/dolphin/dolphin_i.h @@ -12,6 +12,7 @@ typedef enum { DolphinEventTypeStats, DolphinEventTypeFlush, DolphinEventTypeLevel, + DolphinEventTypeReloadState, } DolphinEventType; typedef struct { diff --git a/applications/services/dolphin/helpers/dolphin_state.c b/applications/services/dolphin/helpers/dolphin_state.c index 5216b961dc..5cbc511458 100644 --- a/applications/services/dolphin/helpers/dolphin_state.c +++ b/applications/services/dolphin/helpers/dolphin_state.c @@ -1,11 +1,10 @@ #include "dolphin_state.h" -#include "dolphin/helpers/dolphin_deed.h" #include "dolphin_state_filename.h" -#include -#include #include #include + +#include #include #define TAG "DolphinState" @@ -26,29 +25,28 @@ void dolphin_state_free(DolphinState* dolphin_state) { free(dolphin_state); } -bool dolphin_state_save(DolphinState* dolphin_state) { +void dolphin_state_save(DolphinState* dolphin_state) { if(!dolphin_state->dirty) { - return true; + return; } - bool result = saved_struct_save( + bool success = saved_struct_save( DOLPHIN_STATE_PATH, &dolphin_state->data, sizeof(DolphinStoreData), DOLPHIN_STATE_HEADER_MAGIC, DOLPHIN_STATE_HEADER_VERSION); - if(result) { + if(success) { FURI_LOG_I(TAG, "State saved"); dolphin_state->dirty = false; + } else { FURI_LOG_E(TAG, "Failed to save state"); } - - return result; } -bool dolphin_state_load(DolphinState* dolphin_state) { +void dolphin_state_load(DolphinState* dolphin_state) { bool success = saved_struct_load( DOLPHIN_STATE_PATH, &dolphin_state->data, @@ -64,12 +62,12 @@ bool dolphin_state_load(DolphinState* dolphin_state) { } if(!success) { - FURI_LOG_W(TAG, "Reset dolphin-state"); - memset(dolphin_state, 0, sizeof(*dolphin_state)); + FURI_LOG_W(TAG, "Reset Dolphin state"); + memset(dolphin_state, 0, sizeof(DolphinState)); + dolphin_state->dirty = true; + dolphin_state_save(dolphin_state); } - - return success; } uint64_t dolphin_state_timestamp(void) { diff --git a/applications/services/dolphin/helpers/dolphin_state.h b/applications/services/dolphin/helpers/dolphin_state.h index a8d8406bef..bdbd98d473 100644 --- a/applications/services/dolphin/helpers/dolphin_state.h +++ b/applications/services/dolphin/helpers/dolphin_state.h @@ -1,9 +1,9 @@ #pragma once -#include "dolphin_deed.h" #include #include -#include + +#include "dolphin_deed.h" typedef struct DolphinState DolphinState; typedef struct { @@ -25,9 +25,9 @@ DolphinState* dolphin_state_alloc(void); void dolphin_state_free(DolphinState* dolphin_state); -bool dolphin_state_save(DolphinState* dolphin_state); +void dolphin_state_save(DolphinState* dolphin_state); -bool dolphin_state_load(DolphinState* dolphin_state); +void dolphin_state_load(DolphinState* dolphin_state); void dolphin_state_clear_limits(DolphinState* dolphin_state); diff --git a/applications/services/expansion/expansion.c b/applications/services/expansion/expansion.c index 0b00753fcf..219bf06414 100644 --- a/applications/services/expansion/expansion.c +++ b/applications/services/expansion/expansion.c @@ -3,6 +3,7 @@ #include #include +#include #include #include "expansion_worker.h" @@ -23,6 +24,7 @@ typedef enum { ExpansionMessageTypeEnable, ExpansionMessageTypeDisable, ExpansionMessageTypeSetListenSerial, + ExpansionMessageTypeReloadSettings, ExpansionMessageTypeModuleConnected, ExpansionMessageTypeModuleDisconnected, } ExpansionMessageType; @@ -86,10 +88,8 @@ static void return; } - ExpansionSettings settings = {0}; - if(!expansion_settings_load(&settings)) { - expansion_settings_save(&settings); - } + ExpansionSettings settings; + expansion_settings_load(&settings); if(settings.uart_index < FuriHalSerialIdMax) { instance->state = ExpansionStateEnabled; @@ -104,7 +104,6 @@ static void static void expansion_control_handler_disable(Expansion* instance, const ExpansionMessageData* data) { UNUSED(data); - if(instance->state == ExpansionStateDisabled) { return; } else if(instance->state == ExpansionStateRunning) { @@ -122,9 +121,10 @@ static void static void expansion_control_handler_set_listen_serial( Expansion* instance, const ExpansionMessageData* data) { - furi_check(data->serial_id < FuriHalSerialIdMax); + if(instance->state != ExpansionStateDisabled && instance->serial_id == data->serial_id) { + return; - if(instance->state == ExpansionStateRunning) { + } else if(instance->state == ExpansionStateRunning) { expansion_worker_stop(instance->worker); expansion_worker_free(instance->worker); @@ -141,6 +141,26 @@ static void expansion_control_handler_set_listen_serial( FURI_LOG_D(TAG, "Listen serial changed to %s", expansion_uart_names[instance->serial_id]); } +static void expansion_control_handler_reload_settings( + Expansion* instance, + const ExpansionMessageData* data) { + UNUSED(data); + + ExpansionSettings settings; + expansion_settings_load(&settings); + + if(settings.uart_index < FuriHalSerialIdMax) { + const ExpansionMessageData data = { + .serial_id = settings.uart_index, + }; + + expansion_control_handler_set_listen_serial(instance, &data); + + } else { + expansion_control_handler_disable(instance, NULL); + } +} + static void expansion_control_handler_module_connected( Expansion* instance, const ExpansionMessageData* data) { @@ -178,6 +198,7 @@ static const ExpansionControlHandler expansion_control_handlers[] = { [ExpansionMessageTypeEnable] = expansion_control_handler_enable, [ExpansionMessageTypeDisable] = expansion_control_handler_disable, [ExpansionMessageTypeSetListenSerial] = expansion_control_handler_set_listen_serial, + [ExpansionMessageTypeReloadSettings] = expansion_control_handler_reload_settings, [ExpansionMessageTypeModuleConnected] = expansion_control_handler_module_connected, [ExpansionMessageTypeModuleDisconnected] = expansion_control_handler_module_disconnected, }; @@ -214,6 +235,22 @@ static Expansion* expansion_alloc(void) { return instance; } +static void expansion_storage_callback(const void* message, void* context) { + furi_assert(context); + + const StorageEvent* event = message; + Expansion* instance = context; + + if(event->type == StorageEventTypeCardMount) { + ExpansionMessage em = { + .type = ExpansionMessageTypeReloadSettings, + .api_lock = NULL, + }; + + furi_check(furi_message_queue_put(instance->queue, &em, FuriWaitForever) == FuriStatusOk); + } +} + void expansion_on_system_start(void* arg) { UNUSED(arg); @@ -221,6 +258,14 @@ void expansion_on_system_start(void* arg) { furi_record_create(RECORD_EXPANSION, instance); furi_thread_start(instance->thread); + Storage* storage = furi_record_open(RECORD_STORAGE); + furi_pubsub_subscribe(storage_get_pubsub(storage), expansion_storage_callback, instance); + + if(storage_sd_status(storage) != FSE_OK) { + FURI_LOG_D(TAG, "SD Card not ready, skipping settings"); + return; + } + expansion_enable(instance); } diff --git a/applications/services/expansion/expansion_settings.c b/applications/services/expansion/expansion_settings.c index ca48a29031..274ac74304 100644 --- a/applications/services/expansion/expansion_settings.c +++ b/applications/services/expansion/expansion_settings.c @@ -5,26 +5,40 @@ #include "expansion_settings_filename.h" +#define TAG "ExpansionSettings" + #define EXPANSION_SETTINGS_PATH INT_PATH(EXPANSION_SETTINGS_FILE_NAME) #define EXPANSION_SETTINGS_VERSION (0) #define EXPANSION_SETTINGS_MAGIC (0xEA) -bool expansion_settings_load(ExpansionSettings* settings) { +void expansion_settings_load(ExpansionSettings* settings) { furi_assert(settings); - return saved_struct_load( + + const bool success = saved_struct_load( EXPANSION_SETTINGS_PATH, settings, sizeof(ExpansionSettings), EXPANSION_SETTINGS_MAGIC, EXPANSION_SETTINGS_VERSION); + + if(!success) { + FURI_LOG_W(TAG, "Failed to load file, using defaults"); + memset(settings, 0, sizeof(ExpansionSettings)); + expansion_settings_save(settings); + } } -bool expansion_settings_save(const ExpansionSettings* settings) { +void expansion_settings_save(const ExpansionSettings* settings) { furi_assert(settings); - return saved_struct_save( + + const bool success = saved_struct_save( EXPANSION_SETTINGS_PATH, settings, sizeof(ExpansionSettings), EXPANSION_SETTINGS_MAGIC, EXPANSION_SETTINGS_VERSION); + + if(!success) { + FURI_LOG_E(TAG, "Failed to save file"); + } } diff --git a/applications/services/expansion/expansion_settings.h b/applications/services/expansion/expansion_settings.h index 38e9f8d025..4594918e33 100644 --- a/applications/services/expansion/expansion_settings.h +++ b/applications/services/expansion/expansion_settings.h @@ -25,18 +25,16 @@ typedef struct { /** * @brief Load expansion module support settings from file. * - * @param[out] settings pointer to an ExpansionSettings instance to load settings into. - * @returns true if the settings were successfully loaded, false otherwise. + * @param[in,out] settings pointer to an ExpansionSettings instance to load settings into. */ -bool expansion_settings_load(ExpansionSettings* settings); +void expansion_settings_load(ExpansionSettings* settings); /** * @brief Save expansion module support settings to file. * * @param[in] settings pointer to an ExpansionSettings instance to save settings from. - * @returns true if the settings were successfully saved, false otherwise. */ -bool expansion_settings_save(const ExpansionSettings* settings); +void expansion_settings_save(const ExpansionSettings* settings); #ifdef __cplusplus } diff --git a/applications/services/gui/modules/file_browser_worker.c b/applications/services/gui/modules/file_browser_worker.c index 15117eae2f..a6b00537a0 100644 --- a/applications/services/gui/modules/file_browser_worker.c +++ b/applications/services/gui/modules/file_browser_worker.c @@ -15,7 +15,7 @@ #define TAG "BrowserWorker" #define ASSETS_DIR "assets" -#define BROWSER_ROOT STORAGE_ANY_PATH_PREFIX +#define BROWSER_ROOT STORAGE_EXT_PATH_PREFIX #define FILE_NAME_LEN_MAX 256 #define LONG_LOAD_THRESHOLD 100 diff --git a/applications/services/notification/notification_app.c b/applications/services/notification/notification_app.c index d4c5b91c8c..35d2fe675a 100644 --- a/applications/services/notification/notification_app.c +++ b/applications/services/notification/notification_app.c @@ -438,7 +438,7 @@ static bool notification_load_settings(NotificationApp* app) { File* file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); const size_t settings_size = sizeof(NotificationSettings); - FURI_LOG_I(TAG, "loading settings from \"%s\"", NOTIFICATION_SETTINGS_PATH); + FURI_LOG_I(TAG, "Loading \"%s\"", NOTIFICATION_SETTINGS_PATH); bool fs_result = storage_file_open(file, NOTIFICATION_SETTINGS_PATH, FSAM_READ, FSOM_OPEN_EXISTING); @@ -451,8 +451,6 @@ static bool notification_load_settings(NotificationApp* app) { } if(fs_result) { - FURI_LOG_I(TAG, "load success"); - if(settings.version != NOTIFICATION_SETTINGS_VERSION) { FURI_LOG_E( TAG, "version(%d != %d) mismatch", settings.version, NOTIFICATION_SETTINGS_VERSION); @@ -462,7 +460,7 @@ static bool notification_load_settings(NotificationApp* app) { furi_kernel_unlock(); } } else { - FURI_LOG_E(TAG, "load failed, %s", storage_file_get_error_desc(file)); + FURI_LOG_E(TAG, "Load failed, %s", storage_file_get_error_desc(file)); } storage_file_close(file); @@ -477,7 +475,7 @@ static bool notification_save_settings(NotificationApp* app) { File* file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); const size_t settings_size = sizeof(NotificationSettings); - FURI_LOG_I(TAG, "saving settings to \"%s\"", NOTIFICATION_SETTINGS_PATH); + FURI_LOG_I(TAG, "Saving \"%s\"", NOTIFICATION_SETTINGS_PATH); furi_kernel_lock(); memcpy(&settings, &app->settings, settings_size); @@ -495,9 +493,8 @@ static bool notification_save_settings(NotificationApp* app) { } if(fs_result) { - FURI_LOG_I(TAG, "save success"); } else { - FURI_LOG_E(TAG, "save failed, %s", storage_file_get_error_desc(file)); + FURI_LOG_E(TAG, "Save failed, %s", storage_file_get_error_desc(file)); } storage_file_close(file); @@ -556,14 +553,46 @@ static NotificationApp* notification_app_alloc(void) { return app; } +static void notification_storage_callback(const void* message, void* context) { + furi_assert(context); + NotificationApp* app = context; + const StorageEvent* event = message; + + if(event->type == StorageEventTypeCardMount) { + NotificationAppMessage m = { + .type = LoadSettingsMessage, + }; + + furi_check(furi_message_queue_put(app->queue, &m, FuriWaitForever) == FuriStatusOk); + } +} + +static void notification_apply_settings(NotificationApp* app) { + if(!notification_load_settings(app)) { + notification_save_settings(app); + } + + notification_apply_lcd_contrast(app); +} + +static void notification_init_settings(NotificationApp* app) { + Storage* storage = furi_record_open(RECORD_STORAGE); + furi_pubsub_subscribe(storage_get_pubsub(storage), notification_storage_callback, app); + + if(storage_sd_status(storage) != FSE_OK) { + FURI_LOG_D(TAG, "SD Card not ready, skipping settings"); + return; + } + + notification_apply_settings(app); +} + // App int32_t notification_srv(void* p) { UNUSED(p); NotificationApp* app = notification_app_alloc(); - if(!notification_load_settings(app)) { - notification_save_settings(app); - } + notification_init_settings(app); notification_vibro_off(); notification_sound_off(); @@ -571,7 +600,6 @@ int32_t notification_srv(void* p) { notification_apply_internal_led_layer(&app->led[0], 0x00); notification_apply_internal_led_layer(&app->led[1], 0x00); notification_apply_internal_led_layer(&app->led[2], 0x00); - notification_apply_lcd_contrast(app); furi_record_create(RECORD_NOTIFICATION, app); @@ -589,6 +617,9 @@ int32_t notification_srv(void* p) { case SaveSettingsMessage: notification_save_settings(app); break; + case LoadSettingsMessage: + notification_load_settings(app); + break; } if(message.back_event != NULL) { diff --git a/applications/services/notification/notification_app.h b/applications/services/notification/notification_app.h index 434773f2e5..e195465741 100644 --- a/applications/services/notification/notification_app.h +++ b/applications/services/notification/notification_app.h @@ -11,6 +11,7 @@ typedef enum { NotificationLayerMessage, InternalLayerMessage, SaveSettingsMessage, + LoadSettingsMessage, } NotificationAppMessageType; typedef struct { diff --git a/applications/services/region/application.fam b/applications/services/region/application.fam new file mode 100644 index 0000000000..a4cdc94ea5 --- /dev/null +++ b/applications/services/region/application.fam @@ -0,0 +1,10 @@ +App( + appid="region", + name="RegionSrv", + apptype=FlipperAppType.STARTUP, + targets=["f7"], + entry_point="region_on_system_start", + cdefines=["SRV_REGION"], + requires=["storage"], + order=170, +) diff --git a/applications/services/region/region.c b/applications/services/region/region.c new file mode 100644 index 0000000000..dffcc6b2d5 --- /dev/null +++ b/applications/services/region/region.c @@ -0,0 +1,147 @@ +#include + +#include +#include + +#include +#include + +#define TAG "RegionSrv" + +#define SUBGHZ_REGION_FILENAME INT_PATH(".region_data") + +static bool region_istream_read(pb_istream_t* istream, pb_byte_t* buf, size_t count) { + File* file = istream->state; + size_t ret = storage_file_read(file, buf, count); + return count == ret; +} + +static bool region_istream_decode_band(pb_istream_t* stream, const pb_field_t* field, void** arg) { + UNUSED(field); + + FuriHalRegion* region = *arg; + + PB_Region_Band band = {0}; + if(!pb_decode(stream, PB_Region_Band_fields, &band)) { + FURI_LOG_E(TAG, "PB Region band decode error: %s", PB_GET_ERROR(stream)); + return false; + } + + region->bands_count += 1; + region = realloc( //-V701 + region, + sizeof(FuriHalRegion) + sizeof(FuriHalRegionBand) * region->bands_count); + size_t pos = region->bands_count - 1; + region->bands[pos].start = band.start; + region->bands[pos].end = band.end; + region->bands[pos].power_limit = band.power_limit; + region->bands[pos].duty_cycle = band.duty_cycle; + *arg = region; + + FURI_LOG_I( + TAG, + "Add allowed band: start %luHz, stop %luHz, power_limit %ddBm, duty_cycle %u%%", + band.start, + band.end, + band.power_limit, + band.duty_cycle); + return true; +} + +static int32_t region_load_file(void* context) { + UNUSED(context); + + Storage* storage = furi_record_open(RECORD_STORAGE); + File* file = storage_file_alloc(storage); + + PB_Region pb_region = {0}; + pb_region.bands.funcs.decode = region_istream_decode_band; + + do { + FileInfo fileinfo = {0}; + + if(storage_common_stat(storage, SUBGHZ_REGION_FILENAME, &fileinfo) != FSE_OK || + fileinfo.size == 0) { + FURI_LOG_W(TAG, "Region file missing or empty"); + break; + + } else if(!storage_file_open(file, SUBGHZ_REGION_FILENAME, FSAM_READ, FSOM_OPEN_EXISTING)) { + FURI_LOG_E(TAG, "Failed to open region file"); + break; + } + + pb_istream_t istream = { + .callback = region_istream_read, + .state = file, + .errmsg = NULL, + .bytes_left = fileinfo.size, + }; + + pb_region.bands.arg = malloc(sizeof(FuriHalRegion)); + + if(!pb_decode(&istream, PB_Region_fields, &pb_region)) { + FURI_LOG_E(TAG, "Failed to decode region file"); + free(pb_region.bands.arg); + break; + } + + FuriHalRegion* region = pb_region.bands.arg; + + memcpy( + region->country_code, + pb_region.country_code->bytes, + MIN(pb_region.country_code->size, sizeof(region->country_code) - 1)); + + furi_hal_region_set(region); + + FURI_LOG_I(TAG, "Dynamic region set: %s", region->country_code); + } while(0); + + pb_release(PB_Region_fields, &pb_region); + storage_file_free(file); + furi_record_close(RECORD_STORAGE); + + return 0; +} + +static void region_loader_pending_callback(void* context, uint32_t arg) { + UNUSED(arg); + + FuriThread* loader = context; + furi_thread_join(loader); + furi_thread_free(loader); +} + +static void region_loader_state_callback(FuriThreadState state, void* context) { + UNUSED(context); + + if(state == FuriThreadStateStopped) { + furi_timer_pending_callback(region_loader_pending_callback, furi_thread_get_current(), 0); + } +} + +static void region_storage_callback(const void* message, void* context) { + UNUSED(context); + const StorageEvent* event = message; + + if(event->type == StorageEventTypeCardMount) { + FuriThread* loader = furi_thread_alloc_ex(NULL, 2048, region_load_file, NULL); + furi_thread_set_state_callback(loader, region_loader_state_callback); + furi_thread_start(loader); + } +} + +int32_t region_on_system_start(void* p) { + UNUSED(p); + + Storage* storage = furi_record_open(RECORD_STORAGE); + furi_pubsub_subscribe(storage_get_pubsub(storage), region_storage_callback, NULL); + + if(storage_sd_status(storage) != FSE_OK) { + FURI_LOG_D(TAG, "SD Card not ready, skipping dynamic region"); + return 0; + } + + region_load_file(NULL); + return 0; +} diff --git a/applications/services/storage/storage.c b/applications/services/storage/storage.c index 21f8789cec..bfe2a08b21 100644 --- a/applications/services/storage/storage.c +++ b/applications/services/storage/storage.c @@ -3,7 +3,6 @@ #include "storage_message.h" #include "storage_processing.h" #include "storage/storage_glue.h" -#include "storages/storage_int.h" #include "storages/storage_ext.h" #include @@ -42,9 +41,6 @@ Storage* storage_app_alloc(void) { storage_data_timestamp(&app->storage[i]); } -#ifndef FURI_RAM_EXEC - storage_int_init(&app->storage[ST_INT]); -#endif storage_ext_init(&app->storage[ST_EXT]); // sd icon gui @@ -106,6 +102,11 @@ int32_t storage_srv(void* p) { Storage* app = storage_app_alloc(); furi_record_create(RECORD_STORAGE, app); + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagStorageFormatInternal)) { + FURI_LOG_W(TAG, "Format Internal not supported, clearing flag"); + furi_hal_rtc_reset_flag(FuriHalRtcFlagStorageFormatInternal); + } + StorageMessage message; while(1) { if(furi_message_queue_get(app->message_queue, &message, STORAGE_TICK) == FuriStatusOk) { diff --git a/applications/services/storage/storage.h b/applications/services/storage/storage.h index a4dffe6330..6dbeb0d36b 100644 --- a/applications/services/storage/storage.h +++ b/applications/services/storage/storage.h @@ -506,7 +506,7 @@ FS_Error storage_sd_status(Storage* storage); /******************* Internal LFS Functions *******************/ -typedef void (*Storage_name_converter)(FuriString*); +typedef void (*StorageNameConverter)(FuriString*); /** * @brief Back up the internal storage contents to a *.tar archive. @@ -526,7 +526,7 @@ FS_Error storage_int_backup(Storage* storage, const char* dstname); * @return FSE_OK if the storage was successfully restored, any other error code on failure. */ FS_Error - storage_int_restore(Storage* storage, const char* dstname, Storage_name_converter converter); + storage_int_restore(Storage* storage, const char* dstname, StorageNameConverter converter); /***************** Simplified Functions ******************/ diff --git a/applications/services/storage/storage_cli.c b/applications/services/storage/storage_cli.c index 918e796ce3..17fd4eae4d 100644 --- a/applications/services/storage/storage_cli.c +++ b/applications/services/storage/storage_cli.c @@ -33,7 +33,7 @@ static void storage_cli_info(Cli* cli, FuriString* path, FuriString* args) { storage_cli_print_error(error); } else { printf( - "Label: %s\r\nType: LittleFS\r\n%luKiB total\r\n%luKiB free\r\n", + "Label: %s\r\nType: Virtual\r\n%luKiB total\r\n%luKiB free\r\n", furi_hal_version_get_name_ptr() ? furi_hal_version_get_name_ptr() : "Unknown", (uint32_t)(total_space / 1024), (uint32_t)(free_space / 1024)); diff --git a/applications/services/storage/storage_internal_api.c b/applications/services/storage/storage_internal_api.c index 4cbce7546e..defab966ce 100644 --- a/applications/services/storage/storage_internal_api.c +++ b/applications/services/storage/storage_internal_api.c @@ -14,7 +14,7 @@ FS_Error storage_int_backup(Storage* storage, const char* dstname) { } FS_Error - storage_int_restore(Storage* storage, const char* srcname, Storage_name_converter converter) { + storage_int_restore(Storage* storage, const char* srcname, StorageNameConverter converter) { furi_check(storage); TarArchive* archive = tar_archive_alloc(storage); diff --git a/applications/services/storage/storage_processing.c b/applications/services/storage/storage_processing.c index 9e96765b62..5645899307 100644 --- a/applications/services/storage/storage_processing.c +++ b/applications/services/storage/storage_processing.c @@ -2,6 +2,8 @@ #include #include +#define TAG "Storage" + #define STORAGE_PATH_PREFIX_LEN 4u _Static_assert( sizeof(STORAGE_ANY_PATH_PREFIX) == STORAGE_PATH_PREFIX_LEN + 1, @@ -60,36 +62,27 @@ static StorageType storage_get_type_by_path(FuriString* path) { return type; } -static void storage_path_change_to_real_storage(FuriString* path, StorageType real_storage) { - if(furi_string_search(path, STORAGE_ANY_PATH_PREFIX) == 0) { - switch(real_storage) { - case ST_EXT: - furi_string_replace_at( - path, 0, strlen(STORAGE_EXT_PATH_PREFIX), STORAGE_EXT_PATH_PREFIX); - break; - case ST_INT: - furi_string_replace_at( - path, 0, strlen(STORAGE_INT_PATH_PREFIX), STORAGE_INT_PATH_PREFIX); - break; - default: - break; - } - } -} static FS_Error storage_get_data(Storage* app, FuriString* path, StorageData** storage) { StorageType type = storage_get_type_by_path(path); if(storage_type_is_valid(type)) { + // Any storage phase-out: redirect "/any" to "/ext" if(type == ST_ANY) { - type = ST_INT; - if(storage_data_status(&app->storage[ST_EXT]) == StorageStatusOK) { - type = ST_EXT; - } - storage_path_change_to_real_storage(path, type); + FURI_LOG_W( + TAG, + STORAGE_ANY_PATH_PREFIX " is deprecated, use " STORAGE_EXT_PATH_PREFIX " instead"); + furi_string_replace_at( + path, 0, strlen(STORAGE_EXT_PATH_PREFIX), STORAGE_EXT_PATH_PREFIX); + type = ST_EXT; + } + + furi_assert(type == ST_EXT); + + if(storage_data_status(&app->storage[type]) != StorageStatusOK) { + return FSE_NOT_READY; } - furi_assert(type == ST_EXT || type == ST_INT); *storage = &app->storage[type]; return FSE_OK; @@ -559,6 +552,16 @@ void storage_process_alias( furi_string_get_cstr(apps_assets_path_with_appsid)); furi_string_free(apps_assets_path_with_appsid); + + } else if(furi_string_start_with(path, STORAGE_INT_PATH_PREFIX)) { + furi_string_replace_at( + path, 0, strlen(STORAGE_INT_PATH_PREFIX), STORAGE_EXT_PATH_PREFIX "/.int"); + + FuriString* int_on_ext_path = furi_string_alloc_set(STORAGE_EXT_PATH_PREFIX "/.int"); + if(storage_process_common_stat(app, int_on_ext_path, NULL) != FSE_OK) { + storage_process_common_mkdir(app, int_on_ext_path); + } + furi_string_free(int_on_ext_path); } } diff --git a/applications/services/storage/storages/storage_int.c b/applications/services/storage/storages/storage_int.c deleted file mode 100644 index 324ce63286..0000000000 --- a/applications/services/storage/storages/storage_int.c +++ /dev/null @@ -1,744 +0,0 @@ -#include "storage_int.h" -#include -#include -#include - -#define TAG "StorageInt" - -#define STORAGE_PATH STORAGE_INT_PATH_PREFIX -#define LFS_CLEAN_FINGERPRINT 0 - -/* When less than LFS_RESERVED_PAGES_COUNT are left free, creation & - * modification of non-dot files is restricted */ -#define LFS_RESERVED_PAGES_COUNT 3 - -typedef struct { - const size_t start_address; - const size_t start_page; - struct lfs_config config; - lfs_t lfs; -} LFSData; - -typedef struct { - void* data; - bool open; -} LFSHandle; - -static LFSHandle* lfs_handle_alloc_file(void) { - LFSHandle* handle = malloc(sizeof(LFSHandle)); - handle->data = malloc(sizeof(lfs_file_t)); - return handle; -} - -static LFSHandle* lfs_handle_alloc_dir(void) { - LFSHandle* handle = malloc(sizeof(LFSHandle)); - handle->data = malloc(sizeof(lfs_dir_t)); - return handle; -} - -/* INTERNALS */ - -static lfs_dir_t* lfs_handle_get_dir(LFSHandle* handle) { - return handle->data; -} - -static lfs_file_t* lfs_handle_get_file(LFSHandle* handle) { - return handle->data; -} - -static void lfs_handle_free(LFSHandle* handle) { - free(handle->data); - free(handle); -} - -static void lfs_handle_set_open(LFSHandle* handle) { - handle->open = true; -} - -static bool lfs_handle_is_open(LFSHandle* handle) { - return handle->open; -} - -static lfs_t* lfs_get_from_storage(StorageData* storage) { - return &((LFSData*)storage->data)->lfs; -} - -static LFSData* lfs_data_get_from_storage(StorageData* storage) { - return (LFSData*)storage->data; -} - -static int storage_int_device_read( - const struct lfs_config* c, - lfs_block_t block, - lfs_off_t off, - void* buffer, - lfs_size_t size) { - LFSData* lfs_data = c->context; - size_t address = lfs_data->start_address + block * c->block_size + off; - - FURI_LOG_T( - TAG, - "Device read: block %lu, off %lu, buffer: %p, size %lu, translated address: %p", - block, - off, - buffer, - size, - (void*)address); - - memcpy(buffer, (void*)address, size); - - return 0; -} - -static int storage_int_device_prog( - const struct lfs_config* c, - lfs_block_t block, - lfs_off_t off, - const void* buffer, - lfs_size_t size) { - LFSData* lfs_data = c->context; - size_t address = lfs_data->start_address + block * c->block_size + off; - - FURI_LOG_T( - TAG, - "Device prog: block %lu, off %lu, buffer: %p, size %lu, translated address: %p", - block, - off, - buffer, - size, - (void*)address); - - int ret = 0; - while(size > 0) { - furi_hal_flash_write_dword(address, *(uint64_t*)buffer); - address += c->prog_size; - buffer += c->prog_size; - size -= c->prog_size; - } - - return ret; -} - -static int storage_int_device_erase(const struct lfs_config* c, lfs_block_t block) { - LFSData* lfs_data = c->context; - size_t page = lfs_data->start_page + block; - - FURI_LOG_D(TAG, "Device erase: page %lu, translated page: %zx", block, page); - - furi_hal_flash_erase(page); - return 0; -} - -static int storage_int_device_sync(const struct lfs_config* c) { - UNUSED(c); - FURI_LOG_D(TAG, "Device sync: skipping"); - return 0; -} - -static LFSData* storage_int_lfs_data_alloc(void) { - LFSData* lfs_data = malloc(sizeof(LFSData)); - - // Internal storage start address - *(size_t*)(&lfs_data->start_address) = furi_hal_flash_get_free_page_start_address(); - *(size_t*)(&lfs_data->start_page) = - (lfs_data->start_address - furi_hal_flash_get_base()) / furi_hal_flash_get_page_size(); - - // LFS configuration - // Glue and context - lfs_data->config.context = lfs_data; - lfs_data->config.read = storage_int_device_read; - lfs_data->config.prog = storage_int_device_prog; - lfs_data->config.erase = storage_int_device_erase; - lfs_data->config.sync = storage_int_device_sync; - - // Block device description - lfs_data->config.read_size = furi_hal_flash_get_read_block_size(); - lfs_data->config.prog_size = furi_hal_flash_get_write_block_size(); - lfs_data->config.block_size = furi_hal_flash_get_page_size(); - lfs_data->config.block_count = furi_hal_flash_get_free_page_count(); - lfs_data->config.block_cycles = furi_hal_flash_get_cycles_count(); - lfs_data->config.cache_size = 16; - lfs_data->config.lookahead_size = 16; - - return lfs_data; -} - -// Returns true if fingerprint was invalid and LFS reformatting is needed -static bool storage_int_check_and_set_fingerprint(LFSData* lfs_data) { - bool value = false; - - uint32_t os_fingerprint = 0; - os_fingerprint |= ((lfs_data->start_page & 0xFF) << 0); - os_fingerprint |= ((lfs_data->config.block_count & 0xFF) << 8); - os_fingerprint |= ((LFS_DISK_VERSION_MAJOR & 0xFFFF) << 16); - - uint32_t rtc_fingerprint = furi_hal_rtc_get_register(FuriHalRtcRegisterLfsFingerprint); - if(rtc_fingerprint == LFS_CLEAN_FINGERPRINT) { - FURI_LOG_I(TAG, "Storing LFS fingerprint in RTC"); - furi_hal_rtc_set_register(FuriHalRtcRegisterLfsFingerprint, os_fingerprint); - } else if(rtc_fingerprint != os_fingerprint) { - FURI_LOG_E(TAG, "LFS fingerprint mismatch"); - furi_hal_rtc_set_register(FuriHalRtcRegisterLfsFingerprint, os_fingerprint); - value = true; - } - - return value; -} - -static void storage_int_lfs_mount(LFSData* lfs_data, StorageData* storage) { - int err; - lfs_t* lfs = &lfs_data->lfs; - - bool was_fingerprint_outdated = storage_int_check_and_set_fingerprint(lfs_data); - bool need_format = furi_hal_rtc_is_flag_set(FuriHalRtcFlagStorageFormatInternal) || - was_fingerprint_outdated; - - if(need_format) { - // Format storage - err = lfs_format(lfs, &lfs_data->config); - if(err == 0) { - FURI_LOG_I(TAG, "Factory reset: Format successful, trying to mount"); - furi_hal_rtc_reset_flag(FuriHalRtcFlagStorageFormatInternal); - err = lfs_mount(lfs, &lfs_data->config); - if(err == 0) { - FURI_LOG_I(TAG, "Factory reset: Mounted"); - storage->status = StorageStatusOK; - } else { - FURI_LOG_E(TAG, "Factory reset: Mount after format failed"); - storage->status = StorageStatusNotMounted; - } - } else { - FURI_LOG_E(TAG, "Factory reset: Format failed"); - storage->status = StorageStatusNoFS; - } - } else { - // Normal - err = lfs_mount(lfs, &lfs_data->config); - if(err == 0) { - FURI_LOG_I(TAG, "Mounted"); - storage->status = StorageStatusOK; - } else { - FURI_LOG_E(TAG, "Mount failed, formatting"); - err = lfs_format(lfs, &lfs_data->config); - if(err == 0) { - FURI_LOG_I(TAG, "Format successful, trying to mount"); - err = lfs_mount(lfs, &lfs_data->config); - if(err == 0) { - FURI_LOG_I(TAG, "Mounted"); - storage->status = StorageStatusOK; - } else { - FURI_LOG_E(TAG, "Mount after format failed"); - storage->status = StorageStatusNotMounted; - } - } else { - FURI_LOG_E(TAG, "Format failed"); - storage->status = StorageStatusNoFS; - } - } - } -} - -/****************** Common Functions ******************/ - -static FS_Error storage_int_parse_error(int error) { - FS_Error result; - - if(error >= LFS_ERR_OK) { - result = FSE_OK; - } else { - switch(error) { - case LFS_ERR_NOENT: - result = FSE_NOT_EXIST; - break; - case LFS_ERR_EXIST: - result = FSE_EXIST; - break; - case LFS_ERR_NOTEMPTY: - result = FSE_DENIED; - break; - case LFS_ERR_INVAL: - case LFS_ERR_NOATTR: - result = FSE_INVALID_PARAMETER; - break; - case LFS_ERR_BADF: - case LFS_ERR_ISDIR: - case LFS_ERR_NOTDIR: - case LFS_ERR_NAMETOOLONG: - result = FSE_INVALID_NAME; - break; - case LFS_ERR_IO: - case LFS_ERR_FBIG: - case LFS_ERR_NOSPC: - case LFS_ERR_NOMEM: - case LFS_ERR_CORRUPT: - default: - result = FSE_INTERNAL; - } - } - - return result; -} - -/* Returns false if less than reserved space is left free */ -static bool storage_int_check_for_free_space(StorageData* storage) { - LFSData* lfs_data = lfs_data_get_from_storage(storage); - - lfs_ssize_t result = lfs_fs_size(lfs_get_from_storage(storage)); - if(result >= 0) { - lfs_size_t free_space = - (lfs_data->config.block_count - result) * lfs_data->config.block_size; - - return free_space > LFS_RESERVED_PAGES_COUNT * furi_hal_flash_get_page_size(); - } - - return false; -} -/******************* File Functions *******************/ - -static bool storage_int_file_open( - void* ctx, - File* file, - const char* path, - FS_AccessMode access_mode, - FS_OpenMode open_mode) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - - bool enough_free_space = storage_int_check_for_free_space(storage); - - int flags = 0; - - if(access_mode & FSAM_READ) flags |= LFS_O_RDONLY; - if(access_mode & FSAM_WRITE) flags |= LFS_O_WRONLY; - - if(open_mode & FSOM_OPEN_EXISTING) flags |= 0; - if(open_mode & FSOM_OPEN_ALWAYS) flags |= LFS_O_CREAT; - if(open_mode & FSOM_OPEN_APPEND) flags |= LFS_O_CREAT | LFS_O_APPEND; - if(open_mode & FSOM_CREATE_NEW) flags |= LFS_O_CREAT | LFS_O_EXCL; - if(open_mode & FSOM_CREATE_ALWAYS) flags |= LFS_O_CREAT | LFS_O_TRUNC; - - LFSHandle* handle = lfs_handle_alloc_file(); - storage_set_storage_file_data(file, handle, storage); - - if(!enough_free_space) { - FuriString* filename; - filename = furi_string_alloc(); - path_extract_basename(path, filename); - bool is_dot_file = - (!furi_string_empty(filename) && (furi_string_get_char(filename, 0) == '.')); - furi_string_free(filename); - - /* Restrict write & creation access to all non-dot files */ - if(!is_dot_file && (flags & (LFS_O_CREAT | LFS_O_WRONLY))) { - file->internal_error_id = LFS_ERR_NOSPC; - file->error_id = FSE_DENIED; - FURI_LOG_W(TAG, "Denied access to '%s': no free space", path); - return false; - } - } - - file->internal_error_id = lfs_file_open(lfs, lfs_handle_get_file(handle), path, flags); - - if(file->internal_error_id >= LFS_ERR_OK) { - lfs_handle_set_open(handle); - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - - return file->error_id == FSE_OK; -} - -static bool storage_int_file_close(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_file_close(lfs, lfs_handle_get_file(handle)); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - lfs_handle_free(handle); - return file->error_id == FSE_OK; -} - -static uint16_t - storage_int_file_read(void* ctx, File* file, void* buff, uint16_t const bytes_to_read) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - uint16_t bytes_read = 0; - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = - lfs_file_read(lfs, lfs_handle_get_file(handle), buff, bytes_to_read); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - - if(file->error_id == FSE_OK) { - bytes_read = file->internal_error_id; - file->internal_error_id = 0; - } - return bytes_read; -} - -static uint16_t - storage_int_file_write(void* ctx, File* file, const void* buff, uint16_t const bytes_to_write) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - uint16_t bytes_written = 0; - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = - lfs_file_write(lfs, lfs_handle_get_file(handle), buff, bytes_to_write); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - - if(file->error_id == FSE_OK) { - bytes_written = file->internal_error_id; - file->internal_error_id = 0; - } - return bytes_written; -} - -static bool - storage_int_file_seek(void* ctx, File* file, const uint32_t offset, const bool from_start) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - if(from_start) { - file->internal_error_id = - lfs_file_seek(lfs, lfs_handle_get_file(handle), offset, LFS_SEEK_SET); - } else { - file->internal_error_id = - lfs_file_seek(lfs, lfs_handle_get_file(handle), offset, LFS_SEEK_CUR); - } - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - return file->error_id == FSE_OK; -} - -static uint64_t storage_int_file_tell(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_file_tell(lfs, lfs_handle_get_file(handle)); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - - int32_t position = 0; - if(file->error_id == FSE_OK) { - position = file->internal_error_id; - file->internal_error_id = 0; - } - - return position; -} - -static bool storage_int_file_truncate(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_file_tell(lfs, lfs_handle_get_file(handle)); - file->error_id = storage_int_parse_error(file->internal_error_id); - - if(file->error_id == FSE_OK) { - uint32_t position = file->internal_error_id; - file->internal_error_id = - lfs_file_truncate(lfs, lfs_handle_get_file(handle), position); - file->error_id = storage_int_parse_error(file->internal_error_id); - } - } else { - file->internal_error_id = LFS_ERR_BADF; - file->error_id = storage_int_parse_error(file->internal_error_id); - } - - return file->error_id == FSE_OK; -} - -static bool storage_int_file_sync(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_file_sync(lfs, lfs_handle_get_file(handle)); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - return file->error_id == FSE_OK; -} - -static uint64_t storage_int_file_size(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_file_size(lfs, lfs_handle_get_file(handle)); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - - uint32_t size = 0; - if(file->error_id == FSE_OK) { - size = file->internal_error_id; - file->internal_error_id = 0; - } - - return size; -} - -static bool storage_int_file_eof(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - bool eof = true; - - if(lfs_handle_is_open(handle)) { - int32_t position = lfs_file_tell(lfs, lfs_handle_get_file(handle)); - int32_t size = lfs_file_size(lfs, lfs_handle_get_file(handle)); - - if(position < 0) { - file->internal_error_id = position; - } else if(size < 0) { - file->internal_error_id = size; - } else { - file->internal_error_id = LFS_ERR_OK; - eof = (position >= size); - } - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - return eof; -} - -/******************* Dir Functions *******************/ - -static bool storage_int_dir_open(void* ctx, File* file, const char* path) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - - LFSHandle* handle = lfs_handle_alloc_dir(); - storage_set_storage_file_data(file, handle, storage); - - file->internal_error_id = lfs_dir_open(lfs, lfs_handle_get_dir(handle), path); - if(file->internal_error_id >= LFS_ERR_OK) { - lfs_handle_set_open(handle); - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - return file->error_id == FSE_OK; -} - -static bool storage_int_dir_close(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_dir_close(lfs, lfs_handle_get_dir(handle)); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - lfs_handle_free(handle); - return file->error_id == FSE_OK; -} - -static bool storage_int_dir_read( - void* ctx, - File* file, - FileInfo* fileinfo, - char* name, - const uint16_t name_length) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - struct lfs_info _fileinfo; - - // LFS returns virtual directories "." and "..", so we read until we get something meaningful or an empty string - do { - file->internal_error_id = lfs_dir_read(lfs, lfs_handle_get_dir(handle), &_fileinfo); - file->error_id = storage_int_parse_error(file->internal_error_id); - } while(strcmp(_fileinfo.name, ".") == 0 || strcmp(_fileinfo.name, "..") == 0); - - if(fileinfo != NULL) { - fileinfo->size = _fileinfo.size; - fileinfo->flags = 0; - if(_fileinfo.type & LFS_TYPE_DIR) fileinfo->flags |= FSF_DIRECTORY; - } - - if(name != NULL) { - snprintf(name, name_length, "%s", _fileinfo.name); - } - - // set FSE_NOT_EXIST error on end of directory - if(file->internal_error_id == 0) { - file->error_id = FSE_NOT_EXIST; - } - } else { - file->internal_error_id = LFS_ERR_BADF; - file->error_id = storage_int_parse_error(file->internal_error_id); - } - - return file->error_id == FSE_OK; -} - -static bool storage_int_dir_rewind(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_dir_rewind(lfs, lfs_handle_get_dir(handle)); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - return file->error_id == FSE_OK; -} - -/******************* Common FS Functions *******************/ - -static FS_Error storage_int_common_stat(void* ctx, const char* path, FileInfo* fileinfo) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - struct lfs_info _fileinfo; - int result = lfs_stat(lfs, path, &_fileinfo); - - if(fileinfo != NULL) { - fileinfo->size = _fileinfo.size; - fileinfo->flags = 0; - if(_fileinfo.type & LFS_TYPE_DIR) fileinfo->flags |= FSF_DIRECTORY; - } - - return storage_int_parse_error(result); -} - -static FS_Error storage_int_common_remove(void* ctx, const char* path) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - int result = lfs_remove(lfs, path); - return storage_int_parse_error(result); -} - -static FS_Error storage_int_common_mkdir(void* ctx, const char* path) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - int result = lfs_mkdir(lfs, path); - return storage_int_parse_error(result); -} - -static FS_Error storage_int_common_fs_info( - void* ctx, - const char* fs_path, - uint64_t* total_space, - uint64_t* free_space) { - UNUSED(fs_path); - StorageData* storage = ctx; - - lfs_t* lfs = lfs_get_from_storage(storage); - LFSData* lfs_data = lfs_data_get_from_storage(storage); - - if(total_space) { - *total_space = lfs_data->config.block_size * lfs_data->config.block_count; - } - - lfs_ssize_t result = lfs_fs_size(lfs); - if(free_space && (result >= 0)) { - *free_space = (lfs_data->config.block_count - result) * lfs_data->config.block_size; - } - - return storage_int_parse_error(result); -} - -static bool storage_int_common_equivalent_path(const char* path1, const char* path2) { - return strcmp(path1, path2) == 0; -} - -/******************* Init Storage *******************/ -static const FS_Api fs_api = { - .file = - { - .open = storage_int_file_open, - .close = storage_int_file_close, - .read = storage_int_file_read, - .write = storage_int_file_write, - .seek = storage_int_file_seek, - .tell = storage_int_file_tell, - .truncate = storage_int_file_truncate, - .size = storage_int_file_size, - .sync = storage_int_file_sync, - .eof = storage_int_file_eof, - }, - .dir = - { - .open = storage_int_dir_open, - .close = storage_int_dir_close, - .read = storage_int_dir_read, - .rewind = storage_int_dir_rewind, - }, - .common = - { - .stat = storage_int_common_stat, - .mkdir = storage_int_common_mkdir, - .remove = storage_int_common_remove, - .fs_info = storage_int_common_fs_info, - .equivalent_path = storage_int_common_equivalent_path, - }, -}; - -void storage_int_init(StorageData* storage) { - FURI_LOG_I(TAG, "Starting"); - LFSData* lfs_data = storage_int_lfs_data_alloc(); - FURI_LOG_I( - TAG, - "Config: start %p, read %lu, write %lu, page size: %lu, page count: %lu, cycles: %ld", - (void*)lfs_data->start_address, - lfs_data->config.read_size, - lfs_data->config.prog_size, - lfs_data->config.block_size, - lfs_data->config.block_count, - lfs_data->config.block_cycles); - - storage_int_lfs_mount(lfs_data, storage); - - storage->data = lfs_data; - storage->api.tick = NULL; - storage->fs_api = &fs_api; -} diff --git a/applications/services/storage/storages/storage_int.h b/applications/services/storage/storages/storage_int.h deleted file mode 100644 index 456d72408f..0000000000 --- a/applications/services/storage/storages/storage_int.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once -#include -#include "../storage_glue.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void storage_int_init(StorageData* storage); - -#ifdef __cplusplus -} -#endif diff --git a/applications/settings/bt_settings_app/bt_settings_app.c b/applications/settings/bt_settings_app/bt_settings_app.c index d86c9df647..8972820644 100644 --- a/applications/settings/bt_settings_app/bt_settings_app.c +++ b/applications/settings/bt_settings_app/bt_settings_app.c @@ -15,8 +15,6 @@ static bool bt_settings_back_event_callback(void* context) { BtSettingsApp* bt_settings_app_alloc(void) { BtSettingsApp* app = malloc(sizeof(BtSettingsApp)); - // Load settings - bt_settings_load(&app->settings); app->gui = furi_record_open(RECORD_GUI); app->bt = furi_record_open(RECORD_BT); @@ -48,6 +46,8 @@ BtSettingsApp* bt_settings_app_alloc(void) { view_dispatcher_add_view( app->view_dispatcher, BtSettingsAppViewPopup, popup_get_view(app->popup)); + bt_get_settings(app->bt, &app->settings); + // Set first scene scene_manager_next_scene(app->scene_manager, BtSettingsAppSceneStart); return app; @@ -55,6 +55,7 @@ BtSettingsApp* bt_settings_app_alloc(void) { void bt_settings_app_free(BtSettingsApp* app) { furi_assert(app); + bt_set_settings(app->bt, &app->settings); // Gui modules view_dispatcher_remove_view(app->view_dispatcher, BtSettingsAppViewVarItemList); variable_item_list_free(app->var_item_list); @@ -79,7 +80,6 @@ extern int32_t bt_settings_app(void* p) { UNUSED(p); BtSettingsApp* app = bt_settings_app_alloc(); view_dispatcher_run(app->view_dispatcher); - bt_settings_save(&app->settings); bt_settings_app_free(app); return 0; } diff --git a/applications/settings/bt_settings_app/bt_settings_app.h b/applications/settings/bt_settings_app/bt_settings_app.h index b79e369511..5255945ff5 100644 --- a/applications/settings/bt_settings_app/bt_settings_app.h +++ b/applications/settings/bt_settings_app/bt_settings_app.h @@ -1,18 +1,21 @@ #pragma once #include -#include + #include #include #include #include -#include #include #include #include -#include +#include +#include + +#include + #include "scenes/bt_settings_scene.h" enum BtSettingsCustomEvent { diff --git a/applications/settings/bt_settings_app/scenes/bt_settings_scene_start.c b/applications/settings/bt_settings_app/scenes/bt_settings_scene_start.c index 1d72a9e6fa..a76740bd1e 100644 --- a/applications/settings/bt_settings_app/scenes/bt_settings_scene_start.c +++ b/applications/settings/bt_settings_app/scenes/bt_settings_scene_start.c @@ -70,18 +70,17 @@ bool bt_settings_scene_start_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == BtSettingOn) { - furi_hal_bt_start_advertising(); app->settings.enabled = true; consumed = true; } else if(event.event == BtSettingOff) { app->settings.enabled = false; - furi_hal_bt_stop_advertising(); consumed = true; } else if(event.event == BtSettingsCustomEventForgetDevices) { scene_manager_next_scene(app->scene_manager, BtSettingsAppSceneForgetDevConfirm); consumed = true; } } + return consumed; } diff --git a/applications/settings/desktop_settings/desktop_settings_app.c b/applications/settings/desktop_settings/desktop_settings_app.c index 238d866f2e..a0ad102773 100644 --- a/applications/settings/desktop_settings/desktop_settings_app.c +++ b/applications/settings/desktop_settings/desktop_settings_app.c @@ -2,9 +2,11 @@ #include #include +#include +#include + #include "desktop_settings_app.h" #include "scenes/desktop_settings_scene.h" -#include static bool desktop_settings_custom_event_callback(void* context, uint32_t event) { furi_assert(context); @@ -90,18 +92,20 @@ void desktop_settings_app_free(DesktopSettingsApp* app) { } extern int32_t desktop_settings_app(void* p) { + UNUSED(p); + DesktopSettingsApp* app = desktop_settings_app_alloc(); - DESKTOP_SETTINGS_LOAD(&app->settings); + Desktop* desktop = furi_record_open(RECORD_DESKTOP); + + desktop_api_get_settings(desktop, &app->settings); - if(p && (strcmp(p, DESKTOP_SETTINGS_RUN_PIN_SETUP_ARG) == 0)) { - scene_manager_next_scene(app->scene_manager, DesktopSettingsAppScenePinSetupHowto); - } else { - scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneStart); - } + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneStart); view_dispatcher_run(app->view_dispatcher); - DESKTOP_SETTINGS_SAVE(&app->settings); + desktop_api_set_settings(desktop, &app->settings); + furi_record_close(RECORD_DESKTOP); + desktop_settings_app_free(app); return 0; diff --git a/applications/settings/desktop_settings/desktop_settings_app.h b/applications/settings/desktop_settings/desktop_settings_app.h index 1a2c733eda..348180fbf2 100644 --- a/applications/settings/desktop_settings/desktop_settings_app.h +++ b/applications/settings/desktop_settings/desktop_settings_app.h @@ -37,7 +37,7 @@ typedef struct { DesktopSettingsViewPinSetupHowto* pin_setup_howto_view; DesktopSettingsViewPinSetupHowto2* pin_setup_howto2_view; - PinCode pincode_buffer; + DesktopPinCode pincode_buffer; bool pincode_buffer_filled; uint32_t pin_menu_idx; diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c index 384c0739c9..74d09b2ac3 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c @@ -212,13 +212,17 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e strncpy( curr_favorite_app->name_or_path, furi_string_get_cstr(temp_path), - MAX_APP_LENGTH); + sizeof(curr_favorite_app->name_or_path)); consumed = true; } } else { size_t app_index = event.event - 2; const char* name = favorite_fap_get_app_name(app_index); - if(name) strncpy(curr_favorite_app->name_or_path, name, MAX_APP_LENGTH); + if(name) + strncpy( + curr_favorite_app->name_or_path, + name, + sizeof(curr_favorite_app->name_or_path)); consumed = true; } if(consumed) { @@ -226,7 +230,7 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e }; consumed = true; - DESKTOP_SETTINGS_SAVE(&app->settings); + desktop_settings_save(&app->settings); } furi_string_free(temp_path); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_auth.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_auth.c index 5af25cd614..1e64165314 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_auth.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_auth.c @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include "../desktop_settings_app.h" #include #include @@ -12,13 +12,14 @@ #define SCENE_EVENT_PINS_EQUAL (1U) #define SCENE_EVENT_PINS_DIFFERENT (2U) -static void pin_auth_done_callback(const PinCode* pin_code, void* context) { +static void pin_auth_done_callback(const DesktopPinCode* pin_code, void* context) { furi_assert(pin_code); furi_assert(context); - DesktopSettingsApp* app = context; + DesktopSettingsApp* app = context; app->pincode_buffer = *pin_code; - if(desktop_pin_compare(&app->settings.pin_code, pin_code)) { + + if(desktop_pin_code_check(pin_code)) { view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EVENT_PINS_EQUAL); } else { view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EVENT_PINS_DIFFERENT); @@ -31,10 +32,9 @@ static void pin_auth_back_callback(void* context) { } void desktop_settings_scene_pin_auth_on_enter(void* context) { - DesktopSettingsApp* app = context; + furi_assert(desktop_pin_code_is_set()); - DESKTOP_SETTINGS_LOAD(&app->settings); - furi_assert(app->settings.pin_code.length > 0); + DesktopSettingsApp* app = context; desktop_view_pin_input_set_context(app->pin_input_view, app); desktop_view_pin_input_set_back_callback(app->pin_input_view, pin_auth_back_callback); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_disable.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_disable.c index f31a968944..abcce66da7 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_disable.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_disable.c @@ -17,9 +17,8 @@ static void pin_disable_back_callback(void* context) { void desktop_settings_scene_pin_disable_on_enter(void* context) { furi_assert(context); DesktopSettingsApp* app = context; - app->settings.pin_code.length = 0; - memset(app->settings.pin_code.data, '0', sizeof(app->settings.pin_code.data)); - DESKTOP_SETTINGS_SAVE(&app->settings); + + desktop_pin_code_reset(); popup_set_context(app->popup, app); popup_set_callback(app->popup, pin_disable_back_callback); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_error.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_error.c index 1ba3c1b2da..711683c3fe 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_error.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_error.c @@ -6,7 +6,7 @@ #include #include "desktop_settings_scene.h" #include "desktop_settings_scene_i.h" -#include +#include #include "../desktop_settings_app.h" #define SCENE_EVENT_EXIT (0U) @@ -17,7 +17,7 @@ static void pin_error_back_callback(void* context) { view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EVENT_EXIT); } -static void pin_error_done_callback(const PinCode* pin_code, void* context) { +static void pin_error_done_callback(const DesktopPinCode* pin_code, void* context) { UNUSED(pin_code); furi_assert(context); DesktopSettingsApp* app = context; diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_menu.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_menu.c index 7375edd3f4..e0c66cb288 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_menu.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_menu.c @@ -19,7 +19,7 @@ void desktop_settings_scene_pin_menu_on_enter(void* context) { Submenu* submenu = app->submenu; submenu_reset(submenu); - if(!app->settings.pin_code.length) { + if(!desktop_pin_code_is_set()) { submenu_add_item( submenu, "Set PIN", diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup.c index 93012330aa..08f5fcb3fc 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup.c @@ -7,14 +7,14 @@ #include #include "desktop_settings_scene.h" #include "desktop_settings_scene_i.h" -#include +#include #define SCENE_EVENT_EXIT (0U) #define SCENE_EVENT_1ST_PIN_ENTERED (1U) #define SCENE_EVENT_PINS_EQUAL (2U) #define SCENE_EVENT_PINS_DIFFERENT (3U) -static void pin_setup_done_callback(const PinCode* pin_code, void* context) { +static void pin_setup_done_callback(const DesktopPinCode* pin_code, void* context) { furi_assert(pin_code); furi_assert(context); DesktopSettingsApp* app = context; @@ -25,7 +25,7 @@ static void pin_setup_done_callback(const PinCode* pin_code, void* context) { view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EVENT_1ST_PIN_ENTERED); } else { app->pincode_buffer_filled = false; - if(desktop_pin_compare(&app->pincode_buffer, pin_code)) { + if(desktop_pin_code_is_equal(&app->pincode_buffer, pin_code)) { view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EVENT_PINS_EQUAL); } else { view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EVENT_PINS_DIFFERENT); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup_done.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup_done.c index 170e6bca56..aa3d2214e5 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup_done.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup_done.c @@ -11,7 +11,7 @@ #define SCENE_EVENT_DONE (0U) -static void pin_setup_done_callback(const PinCode* pin_code, void* context) { +static void pin_setup_done_callback(const DesktopPinCode* pin_code, void* context) { furi_assert(pin_code); furi_assert(context); DesktopSettingsApp* app = context; @@ -22,8 +22,8 @@ static void pin_setup_done_callback(const PinCode* pin_code, void* context) { void desktop_settings_scene_pin_setup_done_on_enter(void* context) { DesktopSettingsApp* app = context; - app->settings.pin_code = app->pincode_buffer; - DESKTOP_SETTINGS_SAVE(&app->settings); + desktop_pin_code_set(&app->pincode_buffer); + NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); notification_message(notification, &sequence_single_vibro); notification_message(notification, &sequence_blink_green_10); @@ -32,7 +32,7 @@ void desktop_settings_scene_pin_setup_done_on_enter(void* context) { desktop_view_pin_input_set_context(app->pin_input_view, app); desktop_view_pin_input_set_back_callback(app->pin_input_view, NULL); desktop_view_pin_input_set_done_callback(app->pin_input_view, pin_setup_done_callback); - desktop_view_pin_input_set_pin(app->pin_input_view, &app->settings.pin_code); + desktop_view_pin_input_set_pin(app->pin_input_view, &app->pincode_buffer); desktop_view_pin_input_set_label_button(app->pin_input_view, "Done"); desktop_view_pin_input_set_label_primary(app->pin_input_view, 29, 8, "PIN Activated!"); desktop_view_pin_input_set_label_secondary( diff --git a/applications/settings/expansion_settings_app/expansion_settings_app.c b/applications/settings/expansion_settings_app/expansion_settings_app.c index 2b8208cabb..7544bea324 100644 --- a/applications/settings/expansion_settings_app/expansion_settings_app.c +++ b/applications/settings/expansion_settings_app/expansion_settings_app.c @@ -27,9 +27,7 @@ static uint32_t expansion_settings_app_exit(void* context) { static ExpansionSettingsApp* expansion_settings_app_alloc(void) { ExpansionSettingsApp* app = malloc(sizeof(ExpansionSettingsApp)); - if(!expansion_settings_load(&app->settings)) { - expansion_settings_save(&app->settings); - } + expansion_settings_load(&app->settings); app->gui = furi_record_open(RECORD_GUI); app->expansion = furi_record_open(RECORD_EXPANSION); diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_internal_info.c b/applications/settings/storage_settings/scenes/storage_settings_scene_internal_info.c index b7620b6e82..5a367afcec 100644 --- a/applications/settings/storage_settings/scenes/storage_settings_scene_internal_info.c +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_internal_info.c @@ -27,7 +27,7 @@ void storage_settings_scene_internal_info_on_enter(void* context) { } else { furi_string_printf( app->text_string, - "Name: %s\nType: LittleFS\nTotal: %lu KiB\nFree: %lu KiB", + "Name: %s\nType: Virtual\nTotal: %lu KiB\nFree: %lu KiB", furi_hal_version_get_name_ptr() ? furi_hal_version_get_name_ptr() : "Unknown", (uint32_t)(total_space / 1024), (uint32_t)(free_space / 1024)); diff --git a/applications/system/application.fam b/applications/system/application.fam index 095ca1ab2c..c5f81defa6 100644 --- a/applications/system/application.fam +++ b/applications/system/application.fam @@ -4,7 +4,6 @@ App( apptype=FlipperAppType.METAPACKAGE, provides=[ "updater_app", - "storage_move_to_sd", "js_app", "js_app_start", # "archive", diff --git a/applications/system/storage_move_to_sd/application.fam b/applications/system/storage_move_to_sd/application.fam deleted file mode 100644 index de47de0551..0000000000 --- a/applications/system/storage_move_to_sd/application.fam +++ /dev/null @@ -1,18 +0,0 @@ -App( - appid="storage_move_to_sd", - name="StorageMoveToSd", - apptype=FlipperAppType.SYSTEM, - entry_point="storage_move_to_sd_app", - requires=["gui", "storage"], - provides=["storage_move_to_sd_start"], - stack_size=2 * 1024, - order=30, -) - -App( - appid="storage_move_to_sd_start", - apptype=FlipperAppType.STARTUP, - entry_point="storage_move_to_sd_start", - requires=["storage"], - order=120, -) diff --git a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.c b/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.c deleted file mode 100644 index 011bf47df9..0000000000 --- a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "storage_move_to_sd_scene.h" - -// Generate scene on_enter handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, -void (*const storage_move_to_sd_on_enter_handlers[])(void*) = { -#include "storage_move_to_sd_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_event handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event, -bool (*const storage_move_to_sd_on_event_handlers[])(void* context, SceneManagerEvent event) = { -#include "storage_move_to_sd_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_exit handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit, -void (*const storage_move_to_sd_on_exit_handlers[])(void* context) = { -#include "storage_move_to_sd_scene_config.h" -}; -#undef ADD_SCENE - -// Initialize scene handlers configuration structure -const SceneManagerHandlers storage_move_to_sd_scene_handlers = { - .on_enter_handlers = storage_move_to_sd_on_enter_handlers, - .on_event_handlers = storage_move_to_sd_on_event_handlers, - .on_exit_handlers = storage_move_to_sd_on_exit_handlers, - .scene_num = StorageMoveToSdSceneNum, -}; diff --git a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.h b/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.h deleted file mode 100644 index bdeb4a8433..0000000000 --- a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include - -// Generate scene id and total number -#define ADD_SCENE(prefix, name, id) StorageMoveToSd##id, -typedef enum { -#include "storage_move_to_sd_scene_config.h" - StorageMoveToSdSceneNum, -} StorageMoveToSdScene; -#undef ADD_SCENE - -extern const SceneManagerHandlers storage_move_to_sd_scene_handlers; - -// Generate scene on_enter handlers declaration -#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); -#include "storage_move_to_sd_scene_config.h" -#undef ADD_SCENE - -// Generate scene on_event handlers declaration -#define ADD_SCENE(prefix, name, id) \ - bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event); -#include "storage_move_to_sd_scene_config.h" -#undef ADD_SCENE - -// Generate scene on_exit handlers declaration -#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context); -#include "storage_move_to_sd_scene_config.h" -#undef ADD_SCENE diff --git a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_config.h b/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_config.h deleted file mode 100644 index 1d7b2d25b8..0000000000 --- a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_config.h +++ /dev/null @@ -1,2 +0,0 @@ -ADD_SCENE(storage_move_to_sd, confirm, Confirm) -ADD_SCENE(storage_move_to_sd, progress, Progress) diff --git a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_confirm.c b/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_confirm.c deleted file mode 100644 index 08c9e2d7fc..0000000000 --- a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_confirm.c +++ /dev/null @@ -1,70 +0,0 @@ -#include "../storage_move_to_sd.h" -#include -#include -#include - -static void storage_move_to_sd_scene_confirm_widget_callback( - GuiButtonType result, - InputType type, - void* context) { - StorageMoveToSd* app = context; - furi_assert(app); - if(type == InputTypeShort) { - if(result == GuiButtonTypeRight) { - view_dispatcher_send_custom_event(app->view_dispatcher, MoveToSdCustomEventConfirm); - } else if(result == GuiButtonTypeLeft) { - view_dispatcher_send_custom_event(app->view_dispatcher, MoveToSdCustomEventExit); - } - } -} - -void storage_move_to_sd_scene_confirm_on_enter(void* context) { - StorageMoveToSd* app = context; - - widget_add_button_element( - app->widget, - GuiButtonTypeLeft, - "Cancel", - storage_move_to_sd_scene_confirm_widget_callback, - app); - widget_add_button_element( - app->widget, - GuiButtonTypeRight, - "Confirm", - storage_move_to_sd_scene_confirm_widget_callback, - app); - - widget_add_string_element( - app->widget, 64, 10, AlignCenter, AlignCenter, FontPrimary, "SD card inserted"); - widget_add_string_multiline_element( - app->widget, - 64, - 32, - AlignCenter, - AlignCenter, - FontSecondary, - "Move data from\ninternal storage to SD card?"); - - view_dispatcher_switch_to_view(app->view_dispatcher, StorageMoveToSdViewWidget); -} - -bool storage_move_to_sd_scene_confirm_on_event(void* context, SceneManagerEvent event) { - StorageMoveToSd* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == MoveToSdCustomEventConfirm) { - scene_manager_next_scene(app->scene_manager, StorageMoveToSdProgress); - consumed = true; - } else if(event.event == MoveToSdCustomEventExit) { - view_dispatcher_stop(app->view_dispatcher); - } - } - - return consumed; -} - -void storage_move_to_sd_scene_confirm_on_exit(void* context) { - StorageMoveToSd* app = context; - widget_reset(app->widget); -} diff --git a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_progress.c b/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_progress.c deleted file mode 100644 index 7aa951bd83..0000000000 --- a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_progress.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "../storage_move_to_sd.h" - -void storage_move_to_sd_scene_progress_on_enter(void* context) { - StorageMoveToSd* app = context; - - widget_add_string_element( - app->widget, 64, 10, AlignCenter, AlignCenter, FontPrimary, "Moving..."); - - view_dispatcher_switch_to_view(app->view_dispatcher, StorageMoveToSdViewWidget); - - storage_move_to_sd_perform(); - view_dispatcher_send_custom_event(app->view_dispatcher, MoveToSdCustomEventExit); -} - -bool storage_move_to_sd_scene_progress_on_event(void* context, SceneManagerEvent event) { - StorageMoveToSd* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - view_dispatcher_stop(app->view_dispatcher); - } else if(event.type == SceneManagerEventTypeBack) { - consumed = true; - } - - return consumed; -} - -void storage_move_to_sd_scene_progress_on_exit(void* context) { - StorageMoveToSd* app = context; - widget_reset(app->widget); -} diff --git a/applications/system/storage_move_to_sd/storage_move_to_sd.c b/applications/system/storage_move_to_sd/storage_move_to_sd.c deleted file mode 100644 index 652c34c720..0000000000 --- a/applications/system/storage_move_to_sd/storage_move_to_sd.c +++ /dev/null @@ -1,188 +0,0 @@ -#include "storage_move_to_sd.h" - -#include -#include -#include -#include -#include - -#define TAG "MoveToSd" - -#define MOVE_SRC STORAGE_INT_PATH_PREFIX -#define MOVE_DST STORAGE_EXT_PATH_PREFIX - -static bool storage_move_to_sd_check_entry(const char* name, FileInfo* fileinfo, void* ctx) { - UNUSED(ctx); - if(file_info_is_dir(fileinfo)) { - return true; - } - - return name && (*name != '.'); -} - -bool storage_move_to_sd_perform(void) { - Storage* storage = furi_record_open(RECORD_STORAGE); - - DirWalk* dir_walk = dir_walk_alloc(storage); - dir_walk_set_recursive(dir_walk, false); - dir_walk_set_filter_cb(dir_walk, storage_move_to_sd_check_entry, NULL); - - FuriString *path_src, *path_dst; - - path_dst = furi_string_alloc(); - path_src = furi_string_alloc(); - - if(dir_walk_open(dir_walk, STORAGE_INT_PATH_PREFIX)) { - while(dir_walk_read(dir_walk, path_src, NULL) == DirWalkOK) { - furi_string_set(path_dst, path_src); - furi_string_replace_at( - path_dst, 0, strlen(STORAGE_INT_PATH_PREFIX), STORAGE_EXT_PATH_PREFIX); - - storage_common_merge( - storage, furi_string_get_cstr(path_src), furi_string_get_cstr(path_dst)); - storage_simply_remove_recursive(storage, furi_string_get_cstr(path_src)); - } - } - - dir_walk_free(dir_walk); - furi_string_free(path_dst); - furi_string_free(path_src); - - furi_record_close(RECORD_STORAGE); - - return false; -} - -static bool storage_move_to_sd_check(void) { - Storage* storage = furi_record_open(RECORD_STORAGE); - - bool should_migrate = false; - - DirWalk* dir_walk = dir_walk_alloc(storage); - dir_walk_set_recursive(dir_walk, false); - dir_walk_set_filter_cb(dir_walk, storage_move_to_sd_check_entry, NULL); - - FuriString* name; - name = furi_string_alloc(); - - if(dir_walk_open(dir_walk, STORAGE_INT_PATH_PREFIX)) { - // if at least 1 entry is present, we should migrate - should_migrate = (dir_walk_read(dir_walk, name, NULL) == DirWalkOK); - } - - dir_walk_free(dir_walk); - furi_string_free(name); - - furi_record_close(RECORD_STORAGE); - - return should_migrate; -} - -static bool storage_move_to_sd_custom_event_callback(void* context, uint32_t event) { - furi_assert(context); - StorageMoveToSd* app = context; - return scene_manager_handle_custom_event(app->scene_manager, event); -} - -static bool storage_move_to_sd_back_event_callback(void* context) { - furi_assert(context); - StorageMoveToSd* app = context; - return scene_manager_handle_back_event(app->scene_manager); -} - -static void storage_move_to_sd_unmount_callback(const void* message, void* context) { - StorageMoveToSd* app = context; - furi_assert(app); - const StorageEvent* storage_event = message; - - if((storage_event->type == StorageEventTypeCardUnmount) || - (storage_event->type == StorageEventTypeCardMountError)) { - view_dispatcher_send_custom_event(app->view_dispatcher, MoveToSdCustomEventExit); - } -} - -static StorageMoveToSd* storage_move_to_sd_alloc(void) { - StorageMoveToSd* app = malloc(sizeof(StorageMoveToSd)); - - app->gui = furi_record_open(RECORD_GUI); - app->notifications = furi_record_open(RECORD_NOTIFICATION); - - app->view_dispatcher = view_dispatcher_alloc(); - app->scene_manager = scene_manager_alloc(&storage_move_to_sd_scene_handlers, app); - - view_dispatcher_enable_queue(app->view_dispatcher); - view_dispatcher_set_event_callback_context(app->view_dispatcher, app); - - view_dispatcher_set_custom_event_callback( - app->view_dispatcher, storage_move_to_sd_custom_event_callback); - view_dispatcher_set_navigation_event_callback( - app->view_dispatcher, storage_move_to_sd_back_event_callback); - - view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); - - app->widget = widget_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, StorageMoveToSdViewWidget, widget_get_view(app->widget)); - - scene_manager_next_scene(app->scene_manager, StorageMoveToSdConfirm); - - Storage* storage = furi_record_open(RECORD_STORAGE); - app->sub = furi_pubsub_subscribe( - storage_get_pubsub(storage), storage_move_to_sd_unmount_callback, app); - furi_record_close(RECORD_STORAGE); - - return app; -} - -static void storage_move_to_sd_free(StorageMoveToSd* app) { - Storage* storage = furi_record_open(RECORD_STORAGE); - furi_pubsub_unsubscribe(storage_get_pubsub(storage), app->sub); - furi_record_close(RECORD_STORAGE); - furi_record_close(RECORD_NOTIFICATION); - - view_dispatcher_remove_view(app->view_dispatcher, StorageMoveToSdViewWidget); - widget_free(app->widget); - view_dispatcher_free(app->view_dispatcher); - scene_manager_free(app->scene_manager); - - furi_record_close(RECORD_GUI); - - free(app); -} - -int32_t storage_move_to_sd_app(void* p) { - UNUSED(p); - - if(storage_move_to_sd_check()) { - StorageMoveToSd* app = storage_move_to_sd_alloc(); - notification_message(app->notifications, &sequence_display_backlight_on); - view_dispatcher_run(app->view_dispatcher); - storage_move_to_sd_free(app); - } else { - FURI_LOG_I(TAG, "Nothing to move"); - } - - return 0; -} - -static void storage_move_to_sd_mount_callback(const void* message, void* context) { - UNUSED(context); - - const StorageEvent* storage_event = message; - - if(storage_event->type == StorageEventTypeCardMount) { - Loader* loader = furi_record_open(RECORD_LOADER); - loader_start(loader, "StorageMoveToSd", NULL, NULL); - furi_record_close(RECORD_LOADER); - } -} - -int32_t storage_move_to_sd_start(void* p) { - UNUSED(p); - Storage* storage = furi_record_open(RECORD_STORAGE); - - furi_pubsub_subscribe(storage_get_pubsub(storage), storage_move_to_sd_mount_callback, NULL); - - furi_record_close(RECORD_STORAGE); - return 0; -} diff --git a/applications/system/storage_move_to_sd/storage_move_to_sd.h b/applications/system/storage_move_to_sd/storage_move_to_sd.h deleted file mode 100644 index 135f3e9b0b..0000000000 --- a/applications/system/storage_move_to_sd/storage_move_to_sd.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "scenes/storage_move_to_sd_scene.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - MoveToSdCustomEventExit, - MoveToSdCustomEventConfirm, -} MoveToSdCustomEvent; - -typedef struct { - // records - Gui* gui; - Widget* widget; - NotificationApp* notifications; - - // view management - SceneManager* scene_manager; - ViewDispatcher* view_dispatcher; - - FuriPubSubSubscription* sub; - -} StorageMoveToSd; - -typedef enum { - StorageMoveToSdViewWidget, -} StorageMoveToSdView; - -bool storage_move_to_sd_perform(void); - -#ifdef __cplusplus -} -#endif diff --git a/applications/system/updater/util/update_task.c b/applications/system/updater/util/update_task.c index 0eae0eaf52..8f051ff77a 100644 --- a/applications/system/updater/util/update_task.c +++ b/applications/system/updater/util/update_task.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #define TAG "UpdWorker" diff --git a/applications/system/updater/util/update_task_worker_flasher.c b/applications/system/updater/util/update_task_worker_flasher.c index 848cc54942..e7e1bbbedc 100644 --- a/applications/system/updater/util/update_task_worker_flasher.c +++ b/applications/system/updater/util/update_task_worker_flasher.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include diff --git a/documentation/doxygen/Doxyfile.cfg b/documentation/doxygen/Doxyfile.cfg index 2596d161f4..a7838163b0 100644 --- a/documentation/doxygen/Doxyfile.cfg +++ b/documentation/doxygen/Doxyfile.cfg @@ -1023,7 +1023,6 @@ RECURSIVE = YES EXCLUDE = $(DOXY_SRC_ROOT)/lib/mlib \ $(DOXY_SRC_ROOT)/lib/STM32CubeWB \ - $(DOXY_SRC_ROOT)/lib/littlefs \ $(DOXY_SRC_ROOT)/lib/nanopb \ $(DOXY_SRC_ROOT)/assets/protobuf \ $(DOXY_SRC_ROOT)/lib/libusb_stm32 \ diff --git a/furi/core/event_loop.c b/furi/core/event_loop.c index 26401c84b2..feed8d6f44 100644 --- a/furi/core/event_loop.c +++ b/furi/core/event_loop.c @@ -107,10 +107,13 @@ void furi_event_loop_run(FuriEventLoop* instance) { furi_check(instance); furi_check(instance->thread_id == furi_thread_get_current_id()); - furi_event_loop_init_tick(instance); + // Set the default signal callback if none was previously set + if(furi_thread_get_signal_callback(instance->thread_id) == NULL) { + furi_thread_set_signal_callback( + instance->thread_id, furi_event_loop_signal_callback, instance); + } - furi_thread_set_signal_callback( - instance->thread_id, furi_event_loop_signal_callback, instance); + furi_event_loop_init_tick(instance); while(true) { instance->state = FuriEventLoopStateIdle; @@ -177,7 +180,10 @@ void furi_event_loop_run(FuriEventLoop* instance) { } } - furi_thread_set_signal_callback(instance->thread_id, NULL, NULL); + // Disable the default signal callback + if(furi_thread_get_signal_callback(instance->thread_id) == furi_event_loop_signal_callback) { + furi_thread_set_signal_callback(instance->thread_id, NULL, NULL); + } } void furi_event_loop_stop(FuriEventLoop* instance) { diff --git a/furi/core/thread.c b/furi/core/thread.c index c47df55e49..69c6b0f04e 100644 --- a/furi/core/thread.c +++ b/furi/core/thread.c @@ -318,6 +318,12 @@ void furi_thread_set_signal_callback( thread->signal_context = context; } +FuriThreadSignalCallback furi_thread_get_signal_callback(const FuriThread* thread) { + furi_check(thread); + + return thread->signal_callback; +} + bool furi_thread_signal(const FuriThread* thread, uint32_t signal, void* arg) { furi_check(thread); diff --git a/furi/core/thread.h b/furi/core/thread.h index be09e040ea..e8cdeaeafb 100644 --- a/furi/core/thread.h +++ b/furi/core/thread.h @@ -270,7 +270,7 @@ FuriThreadState furi_thread_get_state(FuriThread* thread); /** * @brief Set a signal handler callback for a FuriThread instance. * - * The thread MUST be stopped when calling this function. + * The thread MUST be stopped when calling this function if calling it from another thread. * * @param[in,out] thread pointer to the FuriThread instance to be modified * @param[in] callback pointer to a user-specified callback function @@ -281,6 +281,14 @@ void furi_thread_set_signal_callback( FuriThreadSignalCallback callback, void* context); +/** + * @brief Get a signal callback for a FuriThread instance. + * + * @param[in] thread pointer to the FuriThread instance to be queried + * @return pointer to the callback function or NULL if none has been set + */ +FuriThreadSignalCallback furi_thread_get_signal_callback(const FuriThread* thread); + /** * @brief Send a signal to a FuriThread instance. * diff --git a/lib/ReadMe.md b/lib/ReadMe.md index 64da39e358..4656f187b6 100644 --- a/lib/ReadMe.md +++ b/lib/ReadMe.md @@ -18,7 +18,6 @@ - `infrared` - Infrared library, used by Infrared application - `lfrfid` - LF-RFID library, used by LF RFID application - `libusb_stm32` - LibUSB for STM32 series MCU -- `littlefs` - LittleFS file system driver, used by internal storage - `mbedtls` - MbedTLS cryptography library - `microtar` - MicroTAR library - `mjs` - MJs, javascript engine library diff --git a/lib/SConscript b/lib/SConscript index f331198a42..7f13aad445 100644 --- a/lib/SConscript +++ b/lib/SConscript @@ -27,7 +27,6 @@ libs = env.BuildModules( "one_wire", "ibutton", "infrared", - "littlefs", "subghz", "nfc", "digital_signal", diff --git a/lib/ble_profile/extra_profiles/hid_profile.c b/lib/ble_profile/extra_profiles/hid_profile.c index 85fb101b8c..f559a741a6 100644 --- a/lib/ble_profile/extra_profiles/hid_profile.c +++ b/lib/ble_profile/extra_profiles/hid_profile.c @@ -373,6 +373,12 @@ bool ble_profile_hid_mouse_scroll(FuriHalBleProfileBase* profile, int8_t delta) return state; } +// AN5289: 4.7, in order to use flash controller interval must be at least 25ms + advertisement, which is 30 ms +// Since we don't use flash controller anymore interval can be lowered to 7.5ms +#define CONNECTION_INTERVAL_MIN (0x0006) +// Up to 45 ms +#define CONNECTION_INTERVAL_MAX (0x24) + static GapConfig template_config = { .adv_service_uuid = HUMAN_INTERFACE_DEVICE_SERVICE_UUID, .appearance_char = GAP_APPEARANCE_KEYBOARD, @@ -380,8 +386,8 @@ static GapConfig template_config = { .pairing_method = GapPairingPinCodeVerifyYesNo, .conn_param = { - .conn_int_min = 0x18, // AN5289: 4.7, we need at least 25ms + advertisement, which is 30 ms - .conn_int_max = 0x24, // 45 ms + .conn_int_min = CONNECTION_INTERVAL_MIN, + .conn_int_max = CONNECTION_INTERVAL_MAX, .slave_latency = 0, .supervisor_timeout = 0, }, diff --git a/lib/lfs_config.h b/lib/lfs_config.h deleted file mode 100644 index ff8bc4b235..0000000000 --- a/lib/lfs_config.h +++ /dev/null @@ -1,204 +0,0 @@ -#pragma once - -#include - -#ifdef FURI_NDEBUG -#define LFS_NO_ASSERT -#define LFS_ASSERT(x) -#else -#define LFS_ASSERT furi_assert -#endif - -#define LFS_TAG "Lfs" - -#ifdef FURI_LFS_DEBUG -#define LFS_TRACE(...) FURI_LOG_T(LFS_TAG, __VA_ARGS__); - -#define LFS_DEBUG(...) FURI_LOG_D(LFS_TAG, __VA_ARGS__); -#else -#define LFS_TRACE(...) - -#define LFS_DEBUG(...) -#endif // FURI_LFS_DEBUG - -#define LFS_WARN(...) FURI_LOG_W(LFS_TAG, __VA_ARGS__); - -#define LFS_ERROR(...) FURI_LOG_E(LFS_TAG, __VA_ARGS__); - -// Because crc -#undef LFS_CONFIG - -// System includes -#include -#include -#include -#include - -#ifndef LFS_NO_MALLOC -#include -#endif -#ifndef LFS_NO_ASSERT -#include -#endif -#if !defined(LFS_NO_DEBUG) || !defined(LFS_NO_WARN) || !defined(LFS_NO_ERROR) || \ - defined(LFS_YES_TRACE) -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// Builtin functions, these may be replaced by more efficient -// toolchain-specific implementations. LFS_NO_INTRINSICS falls back to a more -// expensive basic C implementation for debugging purposes - -// Min/max functions for unsigned 32-bit numbers -static inline uint32_t lfs_max(uint32_t a, uint32_t b) { - return (a > b) ? a : b; -} - -static inline uint32_t lfs_min(uint32_t a, uint32_t b) { - return (a < b) ? a : b; -} - -// Align to nearest multiple of a size -static inline uint32_t lfs_aligndown(uint32_t a, uint32_t alignment) { - return a - (a % alignment); -} - -static inline uint32_t lfs_alignup(uint32_t a, uint32_t alignment) { - return lfs_aligndown(a + alignment - 1, alignment); -} - -// Find the smallest power of 2 greater than or equal to a -static inline uint32_t lfs_npw2(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) - return 32 - __builtin_clz(a - 1); -#else - uint32_t r = 0; - uint32_t s; - a -= 1; - s = (a > 0xffff) << 4; - a >>= s; - r |= s; - s = (a > 0xff) << 3; - a >>= s; - r |= s; - s = (a > 0xf) << 2; - a >>= s; - r |= s; - s = (a > 0x3) << 1; - a >>= s; - r |= s; - return (r | (a >> 1)) + 1; -#endif -} - -// Count the number of trailing binary zeros in a -// lfs_ctz(0) may be undefined -static inline uint32_t lfs_ctz(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && defined(__GNUC__) - return __builtin_ctz(a); -#else - return lfs_npw2((a & -a) + 1) - 1; -#endif -} - -// Count the number of binary ones in a -static inline uint32_t lfs_popc(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) - return __builtin_popcount(a); -#else - a = a - ((a >> 1) & 0x55555555); - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); - return (((a + (a >> 4)) & 0xf0f0f0f) * 0x1010101) >> 24; -#endif -} - -// Find the sequence comparison of a and b, this is the distance -// between a and b ignoring overflow -static inline int lfs_scmp(uint32_t a, uint32_t b) { - return (int)(unsigned)(a - b); -} - -// Convert between 32-bit little-endian and native order -static inline uint32_t lfs_fromle32(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && \ - ((defined(BYTE_ORDER) && defined(ORDER_LITTLE_ENDIAN) && \ - BYTE_ORDER == ORDER_LITTLE_ENDIAN) || \ - (defined(__BYTE_ORDER) && defined(__ORDER_LITTLE_ENDIAN) && \ - __BYTE_ORDER == __ORDER_LITTLE_ENDIAN) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) - return a; -#elif !defined(LFS_NO_INTRINSICS) && \ - ((defined(BYTE_ORDER) && defined(ORDER_BIG_ENDIAN) && BYTE_ORDER == ORDER_BIG_ENDIAN) || \ - (defined(__BYTE_ORDER) && defined(__ORDER_BIG_ENDIAN) && \ - __BYTE_ORDER == __ORDER_BIG_ENDIAN) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) - return __builtin_bswap32(a); -#else - return (((uint8_t*)&a)[0] << 0) | (((uint8_t*)&a)[1] << 8) | (((uint8_t*)&a)[2] << 16) | - (((uint8_t*)&a)[3] << 24); -#endif -} - -static inline uint32_t lfs_tole32(uint32_t a) { - return lfs_fromle32(a); -} - -// Convert between 32-bit big-endian and native order -static inline uint32_t lfs_frombe32(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && \ - ((defined(BYTE_ORDER) && defined(ORDER_LITTLE_ENDIAN) && \ - BYTE_ORDER == ORDER_LITTLE_ENDIAN) || \ - (defined(__BYTE_ORDER) && defined(__ORDER_LITTLE_ENDIAN) && \ - __BYTE_ORDER == __ORDER_LITTLE_ENDIAN) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) - return __builtin_bswap32(a); -#elif !defined(LFS_NO_INTRINSICS) && \ - ((defined(BYTE_ORDER) && defined(ORDER_BIG_ENDIAN) && BYTE_ORDER == ORDER_BIG_ENDIAN) || \ - (defined(__BYTE_ORDER) && defined(__ORDER_BIG_ENDIAN) && \ - __BYTE_ORDER == __ORDER_BIG_ENDIAN) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) - return a; -#else - return (((uint8_t*)&a)[0] << 24) | (((uint8_t*)&a)[1] << 16) | (((uint8_t*)&a)[2] << 8) | - (((uint8_t*)&a)[3] << 0); -#endif -} - -static inline uint32_t lfs_tobe32(uint32_t a) { - return lfs_frombe32(a); -} - -// Calculate CRC-32 with polynomial = 0x04c11db7 -uint32_t lfs_crc(uint32_t crc, const void* buffer, size_t size); - -// Allocate memory, only used if buffers are not provided to littlefs -// Note, memory must be 64-bit aligned -static inline void* lfs_malloc(size_t size) { -#ifndef LFS_NO_MALLOC - return malloc(size); -#else - (void)size; - return NULL; -#endif -} - -// Deallocate memory, only used if buffers are not provided to littlefs -static inline void lfs_free(void* p) { -#ifndef LFS_NO_MALLOC - free(p); -#else - (void)p; -#endif -} - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/lib/littlefs b/lib/littlefs deleted file mode 160000 index 611c9b20db..0000000000 --- a/lib/littlefs +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 611c9b20db2b99faee261daa7cc9bbe175d3eaca diff --git a/lib/littlefs.scons b/lib/littlefs.scons deleted file mode 100644 index 3d68e07bae..0000000000 --- a/lib/littlefs.scons +++ /dev/null @@ -1,22 +0,0 @@ -Import("env") - -env.Append( - CPPPATH=[ - "#/lib/littlefs", - ], -) - - -libenv = env.Clone(FW_LIB_NAME="littlefs") -libenv.ApplyLibFlags() -libenv.Append( - CPPDEFINES=[ - ("LFS_CONFIG", "lfs_config.h"), - ], -) - -sources = Glob("littlefs/*.c", source=True) - -lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources) -libenv.Install("${LIB_DIST_DIR}", lib) -Return("lib") diff --git a/lib/subghz/devices/registry.c b/lib/subghz/devices/registry.c index 779ba81d7a..9722c15017 100644 --- a/lib/subghz/devices/registry.c +++ b/lib/subghz/devices/registry.c @@ -23,7 +23,7 @@ void subghz_device_registry_init(void) { firmware_api_interface); //TODO FL-3556: fix path to plugins - if(plugin_manager_load_all(subghz_device->manager, "/any/apps_data/subghz/plugins") != + if(plugin_manager_load_all(subghz_device->manager, EXT_PATH("apps_data/subghz/plugins")) != //if(plugin_manager_load_all(subghz_device->manager, APP_DATA_PATH("plugins")) != PluginManagerErrorNone) { FURI_LOG_E(TAG, "Failed to load all libs"); diff --git a/lib/toolbox/crc32_calc.c b/lib/toolbox/crc32_calc.c index 78295167f3..60d709a364 100644 --- a/lib/toolbox/crc32_calc.c +++ b/lib/toolbox/crc32_calc.c @@ -1,11 +1,37 @@ #include "crc32_calc.h" -#include #define CRC_DATA_BUFFER_MAX_LEN 512 uint32_t crc32_calc_buffer(uint32_t crc, const void* buffer, size_t size) { - // TODO FL-3547: consider removing dependency on LFS - return ~lfs_crc(~crc, buffer, size); + crc = ~crc; + + static const uint32_t rtable[16] = { + 0x00000000, + 0x1db71064, + 0x3b6e20c8, + 0x26d930ac, + 0x76dc4190, + 0x6b6b51f4, + 0x4db26158, + 0x5005713c, + 0xedb88320, + 0xf00f9344, + 0xd6d6a3e8, + 0xcb61b38c, + 0x9b64c2b0, + 0x86d3d2d4, + 0xa00ae278, + 0xbdbdf21c, + }; + + const uint8_t* data = buffer; + + for(size_t i = 0; i < size; i++) { + crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 0)) & 0xf]; + crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 4)) & 0xf]; + } + + return ~crc; } uint32_t crc32_calc_file(File* file, const FileCrcProgressCb progress_cb, void* context) { diff --git a/lib/toolbox/stream/file_stream.c b/lib/toolbox/stream/file_stream.c index 80cbb7d5f7..a0dfda3ebe 100644 --- a/lib/toolbox/stream/file_stream.c +++ b/lib/toolbox/stream/file_stream.c @@ -159,8 +159,8 @@ static bool file_stream_delete_and_insert( FuriString* tmp_name; tmp_name = furi_string_alloc(); storage_get_next_filename( - _stream->storage, STORAGE_ANY_PATH_PREFIX, ".scratch", ".pad", tmp_name, 255); - scratch_name = furi_string_alloc_printf(ANY_PATH("%s.pad"), furi_string_get_cstr(tmp_name)); + _stream->storage, STORAGE_EXT_PATH_PREFIX, ".scratch", ".pad", tmp_name, 255); + scratch_name = furi_string_alloc_printf(EXT_PATH("%s.pad"), furi_string_get_cstr(tmp_name)); furi_string_free(tmp_name); do { diff --git a/lib/toolbox/tar/tar_archive.c b/lib/toolbox/tar/tar_archive.c index 80144a0f4f..db1d5177f3 100644 --- a/lib/toolbox/tar/tar_archive.c +++ b/lib/toolbox/tar/tar_archive.c @@ -289,7 +289,7 @@ bool tar_archive_file_finalize(TarArchive* archive) { typedef struct { TarArchive* archive; const char* work_dir; - Storage_name_converter converter; + TarArchiveNameConverter converter; } TarArchiveDirectoryOpParams; static bool archive_extract_current_file(TarArchive* archive, const char* dst_path) { @@ -386,7 +386,7 @@ static int archive_extract_foreach_cb(mtar_t* tar, const mtar_header_t* header, bool tar_archive_unpack_to( TarArchive* archive, const char* destination, - Storage_name_converter converter) { + TarArchiveNameConverter converter) { furi_check(archive); TarArchiveDirectoryOpParams param = { .archive = archive, diff --git a/lib/toolbox/tar/tar_archive.h b/lib/toolbox/tar/tar_archive.h index 3eb97391e8..fd0b28b87f 100644 --- a/lib/toolbox/tar/tar_archive.h +++ b/lib/toolbox/tar/tar_archive.h @@ -54,6 +54,8 @@ bool tar_archive_open(TarArchive* archive, const char* path, TarOpenMode mode); */ void tar_archive_free(TarArchive* archive); +typedef void (*TarArchiveNameConverter)(FuriString*); + /* High-level API - assumes archive is open */ /** Unpack tar archive to destination @@ -67,7 +69,7 @@ void tar_archive_free(TarArchive* archive); bool tar_archive_unpack_to( TarArchive* archive, const char* destination, - Storage_name_converter converter); + TarArchiveNameConverter converter); /** Add file to tar archive * diff --git a/scripts/testops.py b/scripts/testops.py index bf02feaad3..4ae10c7f4a 100644 --- a/scripts/testops.py +++ b/scripts/testops.py @@ -39,7 +39,9 @@ def _get_flipper(self, retry_count: Optional[int] = 1): if port := resolve_port(self.logger, self.args.port): self.logger.info(f"Found flipper at {port}") + time.sleep(1) break + time.sleep(1) if not port: diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index d2a145de5a..9e58a67464 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,70.0,, +Version,+,71.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/cli/cli.h,, @@ -687,6 +687,7 @@ Function,+,bt_forget_bonded_devices,void,Bt* Function,+,bt_keys_storage_alloc,BtKeysStorage*,const char* Function,+,bt_keys_storage_delete,_Bool,BtKeysStorage* Function,+,bt_keys_storage_free,void,BtKeysStorage* +Function,+,bt_keys_storage_is_changed,_Bool,BtKeysStorage* Function,+,bt_keys_storage_load,_Bool,BtKeysStorage* Function,+,bt_keys_storage_set_default_path,void,Bt* Function,+,bt_keys_storage_set_file_path,void,"BtKeysStorage*, const char*" @@ -1372,6 +1373,7 @@ Function,+,furi_hal_rtc_get_log_baud_rate,FuriHalRtcLogBaudRate, Function,+,furi_hal_rtc_get_log_device,FuriHalRtcLogDevice, Function,+,furi_hal_rtc_get_log_level,uint8_t, Function,+,furi_hal_rtc_get_pin_fails,uint32_t, +Function,-,furi_hal_rtc_get_pin_value,uint32_t, Function,+,furi_hal_rtc_get_register,uint32_t,FuriHalRtcRegister Function,+,furi_hal_rtc_get_timestamp,uint32_t, Function,-,furi_hal_rtc_init,void, @@ -1391,6 +1393,7 @@ Function,+,furi_hal_rtc_set_log_baud_rate,void,FuriHalRtcLogBaudRate Function,+,furi_hal_rtc_set_log_device,void,FuriHalRtcLogDevice Function,+,furi_hal_rtc_set_log_level,void,uint8_t Function,+,furi_hal_rtc_set_pin_fails,void,uint32_t +Function,-,furi_hal_rtc_set_pin_value,void,uint32_t Function,+,furi_hal_rtc_set_register,void,"FuriHalRtcRegister, uint32_t" Function,+,furi_hal_rtc_sync_shadow,void, Function,+,furi_hal_sd_get_card_state,FuriStatus, @@ -1626,6 +1629,7 @@ Function,+,furi_thread_get_id,FuriThreadId,FuriThread* Function,+,furi_thread_get_name,const char*,FuriThreadId Function,+,furi_thread_get_priority,FuriThreadPriority,FuriThread* Function,+,furi_thread_get_return_code,int32_t,FuriThread* +Function,+,furi_thread_get_signal_callback,FuriThreadSignalCallback,const FuriThread* Function,+,furi_thread_get_stack_space,uint32_t,FuriThreadId Function,+,furi_thread_get_state,FuriThreadState,FuriThread* Function,+,furi_thread_get_stdout_callback,FuriThreadStdoutWriteCallback, @@ -2509,7 +2513,7 @@ Function,+,storage_file_write,size_t,"File*, const void*, size_t" Function,+,storage_get_next_filename,void,"Storage*, const char*, const char*, const char*, FuriString*, uint8_t" Function,+,storage_get_pubsub,FuriPubSub*,Storage* Function,+,storage_int_backup,FS_Error,"Storage*, const char*" -Function,+,storage_int_restore,FS_Error,"Storage*, const char*, Storage_name_converter" +Function,+,storage_int_restore,FS_Error,"Storage*, const char*, StorageNameConverter" Function,+,storage_sd_format,FS_Error,Storage* Function,+,storage_sd_info,FS_Error,"Storage*, SDInfo*" Function,+,storage_sd_mount,FS_Error,Storage* @@ -2641,7 +2645,7 @@ Function,+,tar_archive_open,_Bool,"TarArchive*, const char*, TarOpenMode" Function,+,tar_archive_set_file_callback,void,"TarArchive*, tar_unpack_file_cb, void*" Function,+,tar_archive_store_data,_Bool,"TarArchive*, const char*, const uint8_t*, const int32_t" Function,+,tar_archive_unpack_file,_Bool,"TarArchive*, const char*, const char*" -Function,+,tar_archive_unpack_to,_Bool,"TarArchive*, const char*, Storage_name_converter" +Function,+,tar_archive_unpack_to,_Bool,"TarArchive*, const char*, TarArchiveNameConverter" Function,-,tempnam,char*,"const char*, const char*" Function,+,text_box_alloc,TextBox*, Function,+,text_box_free,void,TextBox* diff --git a/targets/f18/target.json b/targets/f18/target.json index 229ec0a7ad..9c450aa83e 100644 --- a/targets/f18/target.json +++ b/targets/f18/target.json @@ -17,7 +17,6 @@ "stm32wb", "hwdrivers", "fatfs", - "littlefs", "toolbox", "digital_signal", "signal_reader", diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 52bc07d7e6..4bfe37abb5 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,70.0,, +Version,+,71.0,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, @@ -764,6 +764,7 @@ Function,+,bt_forget_bonded_devices,void,Bt* Function,+,bt_keys_storage_alloc,BtKeysStorage*,const char* Function,+,bt_keys_storage_delete,_Bool,BtKeysStorage* Function,+,bt_keys_storage_free,void,BtKeysStorage* +Function,+,bt_keys_storage_is_changed,_Bool,BtKeysStorage* Function,+,bt_keys_storage_load,_Bool,BtKeysStorage* Function,+,bt_keys_storage_set_default_path,void,Bt* Function,+,bt_keys_storage_set_file_path,void,"BtKeysStorage*, const char*" @@ -1556,6 +1557,7 @@ Function,+,furi_hal_rtc_get_log_baud_rate,FuriHalRtcLogBaudRate, Function,+,furi_hal_rtc_get_log_device,FuriHalRtcLogDevice, Function,+,furi_hal_rtc_get_log_level,uint8_t, Function,+,furi_hal_rtc_get_pin_fails,uint32_t, +Function,-,furi_hal_rtc_get_pin_value,uint32_t, Function,+,furi_hal_rtc_get_register,uint32_t,FuriHalRtcRegister Function,+,furi_hal_rtc_get_timestamp,uint32_t, Function,-,furi_hal_rtc_init,void, @@ -1575,6 +1577,7 @@ Function,+,furi_hal_rtc_set_log_baud_rate,void,FuriHalRtcLogBaudRate Function,+,furi_hal_rtc_set_log_device,void,FuriHalRtcLogDevice Function,+,furi_hal_rtc_set_log_level,void,uint8_t Function,+,furi_hal_rtc_set_pin_fails,void,uint32_t +Function,-,furi_hal_rtc_set_pin_value,void,uint32_t Function,+,furi_hal_rtc_set_register,void,"FuriHalRtcRegister, uint32_t" Function,+,furi_hal_rtc_sync_shadow,void, Function,+,furi_hal_sd_get_card_state,FuriStatus, @@ -1840,6 +1843,7 @@ Function,+,furi_thread_get_id,FuriThreadId,FuriThread* Function,+,furi_thread_get_name,const char*,FuriThreadId Function,+,furi_thread_get_priority,FuriThreadPriority,FuriThread* Function,+,furi_thread_get_return_code,int32_t,FuriThread* +Function,+,furi_thread_get_signal_callback,FuriThreadSignalCallback,const FuriThread* Function,+,furi_thread_get_stack_space,uint32_t,FuriThreadId Function,+,furi_thread_get_state,FuriThreadState,FuriThread* Function,+,furi_thread_get_stdout_callback,FuriThreadStdoutWriteCallback, @@ -3186,7 +3190,7 @@ Function,+,storage_file_write,size_t,"File*, const void*, size_t" Function,+,storage_get_next_filename,void,"Storage*, const char*, const char*, const char*, FuriString*, uint8_t" Function,+,storage_get_pubsub,FuriPubSub*,Storage* Function,+,storage_int_backup,FS_Error,"Storage*, const char*" -Function,+,storage_int_restore,FS_Error,"Storage*, const char*, Storage_name_converter" +Function,+,storage_int_restore,FS_Error,"Storage*, const char*, StorageNameConverter" Function,+,storage_sd_format,FS_Error,Storage* Function,+,storage_sd_info,FS_Error,"Storage*, SDInfo*" Function,+,storage_sd_mount,FS_Error,Storage* @@ -3482,7 +3486,7 @@ Function,+,tar_archive_open,_Bool,"TarArchive*, const char*, TarOpenMode" Function,+,tar_archive_set_file_callback,void,"TarArchive*, tar_unpack_file_cb, void*" Function,+,tar_archive_store_data,_Bool,"TarArchive*, const char*, const uint8_t*, const int32_t" Function,+,tar_archive_unpack_file,_Bool,"TarArchive*, const char*, const char*" -Function,+,tar_archive_unpack_to,_Bool,"TarArchive*, const char*, Storage_name_converter" +Function,+,tar_archive_unpack_to,_Bool,"TarArchive*, const char*, TarArchiveNameConverter" Function,-,tempnam,char*,"const char*, const char*" Function,+,text_box_alloc,TextBox*, Function,+,text_box_free,void,TextBox* diff --git a/targets/f7/ble_glue/extra_beacon.c b/targets/f7/ble_glue/extra_beacon.c index 0fd452a5a6..f9b9b13ef6 100644 --- a/targets/f7/ble_glue/extra_beacon.c +++ b/targets/f7/ble_glue/extra_beacon.c @@ -8,9 +8,9 @@ #define GAP_MS_TO_SCAN_INTERVAL(x) ((uint16_t)((x) / 0.625)) -// Also used as an indicator of whether the beacon had ever been configured -// AN5289: 4.7, we need at least 25ms + advertisement, which is 30 ms -#define GAP_MIN_ADV_INTERVAL_MS (30u) +// AN5289: 4.7, in order to use flash controller interval must be at least 25ms + advertisement, which is 30 ms +// Since we don't use flash controller anymore interval can be lowered to 20ms +#define GAP_MIN_ADV_INTERVAL_MS (20U) typedef struct { GapExtraBeaconConfig last_config; diff --git a/targets/f7/ble_glue/hw_ipcc.c b/targets/f7/ble_glue/hw_ipcc.c index 4daaa7e49d..43785a1b4b 100644 --- a/targets/f7/ble_glue/hw_ipcc.c +++ b/targets/f7/ble_glue/hw_ipcc.c @@ -15,6 +15,8 @@ (LL_C2_IPCC_IsActiveFlag_CHx(IPCC, channel) && \ LL_C1_IPCC_IsEnabledReceiveChannel(IPCC, channel)) +#define IPCC_SEND_CMD_TIMEOUT_US (33UL * 1000UL * 1000UL) + static void (*FreeBufCb)(void); static void HW_IPCC_BLE_EvtHandler(void); @@ -113,7 +115,7 @@ void HW_IPCC_SYS_Init(void) { void HW_IPCC_SYS_SendCmd(void) { LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL); - FuriHalCortexTimer timer = furi_hal_cortex_timer_get(33000000); + FuriHalCortexTimer timer = furi_hal_cortex_timer_get(IPCC_SEND_CMD_TIMEOUT_US); while(LL_C1_IPCC_IsActiveFlag_CHx(IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL)) { furi_check(!furi_hal_cortex_timer_is_expired(timer), "HW_IPCC_SYS_SendCmd timeout"); diff --git a/targets/f7/ble_glue/profiles/serial_profile.c b/targets/f7/ble_glue/profiles/serial_profile.c index 118a76e8c3..1d414889f8 100644 --- a/targets/f7/ble_glue/profiles/serial_profile.c +++ b/targets/f7/ble_glue/profiles/serial_profile.c @@ -40,14 +40,20 @@ static void ble_profile_serial_stop(FuriHalBleProfileBase* profile) { ble_svc_serial_stop(serial_profile->serial_svc); } +// AN5289: 4.7, in order to use flash controller interval must be at least 25ms + advertisement, which is 30 ms +// Since we don't use flash controller anymore interval can be lowered to 7.5ms +#define CONNECTION_INTERVAL_MIN (0x06) +// Up to 45 ms +#define CONNECTION_INTERVAL_MAX (0x24) + static GapConfig serial_template_config = { .adv_service_uuid = 0x3080, .appearance_char = 0x8600, .bonding_mode = true, .pairing_method = GapPairingPinCodeShow, .conn_param = { - .conn_int_min = 0x18, // AN5289: 4.7, we need at least 25ms + advertisement, which is 30 ms - .conn_int_max = 0x24, // 45 ms + .conn_int_min = CONNECTION_INTERVAL_MIN, + .conn_int_max = CONNECTION_INTERVAL_MAX, .slave_latency = 0, .supervisor_timeout = 0, }}; diff --git a/targets/f7/furi_hal/furi_hal_bt.c b/targets/f7/furi_hal/furi_hal_bt.c index 2d76188da4..2c1a9367b0 100644 --- a/targets/f7/furi_hal/furi_hal_bt.c +++ b/targets/f7/furi_hal/furi_hal_bt.c @@ -87,10 +87,9 @@ static bool furi_hal_bt_radio_stack_is_supported(const BleGlueC2Info* info) { } bool furi_hal_bt_start_radio_stack(void) { - bool res = false; - furi_check(furi_hal_bt.core2_mtx); + furi_hal_bt_lock_core2(); - furi_mutex_acquire(furi_hal_bt.core2_mtx, FuriWaitForever); + bool res = false; // Explicitly tell that we are in charge of CLK48 domain furi_check(LL_HSEM_1StepLock(HSEM, CFG_HW_CLK48_CONFIG_SEMID) == 0); @@ -123,7 +122,8 @@ bool furi_hal_bt_start_radio_stack(void) { } res = true; } while(false); - furi_mutex_release(furi_hal_bt.core2_mtx); + + furi_hal_bt_unlock_core2(); gap_extra_beacon_init(); return res; @@ -198,6 +198,8 @@ FuriHalBleProfileBase* furi_hal_bt_start_app( } void furi_hal_bt_reinit(void) { + furi_hal_bt_lock_core2(); + furi_hal_power_insomnia_enter(); FURI_LOG_I(TAG, "Disconnect and stop advertising"); furi_hal_bt_stop_advertising(); @@ -229,6 +231,7 @@ void furi_hal_bt_reinit(void) { furi_hal_bus_disable(FuriHalBusCRC); furi_hal_bt_init(); + furi_hal_bt_unlock_core2(); furi_hal_bt_start_radio_stack(); furi_hal_power_insomnia_exit(); } diff --git a/targets/f7/furi_hal/furi_hal_crypto.c b/targets/f7/furi_hal/furi_hal_crypto.c index 1879eb2cae..4deda293a2 100644 --- a/targets/f7/furi_hal/furi_hal_crypto.c +++ b/targets/f7/furi_hal/furi_hal_crypto.c @@ -262,36 +262,54 @@ bool furi_hal_crypto_enclave_load_key(uint8_t slot, const uint8_t* iv) { furi_hal_bus_enable(FuriHalBusAES1); - if(!furi_hal_bt_is_alive()) { - return false; - } + bool success = false; - furi_hal_crypto_mode_init_done = false; - crypto_key_init(NULL, (uint32_t*)iv); + furi_hal_bt_lock_core2(); - if(SHCI_C2_FUS_LoadUsrKey(slot) == SHCI_Success) { - return true; - } else { - CLEAR_BIT(AES1->CR, AES_CR_EN); - furi_check(furi_mutex_release(furi_hal_crypto_mutex) == FuriStatusOk); - return false; - } + do { + if(!furi_hal_bt_is_alive()) { + break; + } + + furi_hal_crypto_mode_init_done = false; + crypto_key_init(NULL, (uint32_t*)iv); + + if(SHCI_C2_FUS_LoadUsrKey(slot) == SHCI_Success) { + success = true; + } else { + CLEAR_BIT(AES1->CR, AES_CR_EN); + furi_check(furi_mutex_release(furi_hal_crypto_mutex) == FuriStatusOk); + } + + } while(false); + + furi_hal_bt_unlock_core2(); + return success; } bool furi_hal_crypto_enclave_unload_key(uint8_t slot) { - if(!furi_hal_bt_is_alive()) { - return false; - } + furi_hal_bt_lock_core2(); - CLEAR_BIT(AES1->CR, AES_CR_EN); + bool success = false; + + do { + if(!furi_hal_bt_is_alive()) { + break; + } - SHCI_CmdStatus_t shci_state = SHCI_C2_FUS_UnloadUsrKey(slot); + CLEAR_BIT(AES1->CR, AES_CR_EN); - furi_hal_bus_disable(FuriHalBusAES1); + SHCI_CmdStatus_t shci_state = SHCI_C2_FUS_UnloadUsrKey(slot); - furi_check(furi_mutex_release(furi_hal_crypto_mutex) == FuriStatusOk); + furi_hal_bus_disable(FuriHalBusAES1); - return shci_state == SHCI_Success; + furi_check(furi_mutex_release(furi_hal_crypto_mutex) == FuriStatusOk); + + success = (shci_state == SHCI_Success); + } while(false); + + furi_hal_bt_unlock_core2(); + return success; } bool furi_hal_crypto_load_key(const uint8_t* key, const uint8_t* iv) { diff --git a/targets/f7/furi_hal/furi_hal_region.c b/targets/f7/furi_hal/furi_hal_region.c index 26eda5b7b8..4e5ab7fda9 100644 --- a/targets/f7/furi_hal/furi_hal_region.c +++ b/targets/f7/furi_hal/furi_hal_region.c @@ -71,66 +71,80 @@ const FuriHalRegion furi_hal_region_jp = { .duty_cycle = 50, }}}; -static const FuriHalRegion* furi_hal_region = NULL; +static const FuriHalRegion* const furi_hal_static_regions[] = { + [FuriHalVersionRegionUnknown] = &furi_hal_region_zero, + [FuriHalVersionRegionEuRu] = &furi_hal_region_eu_ru, + [FuriHalVersionRegionUsCaAu] = &furi_hal_region_us_ca_au, + [FuriHalVersionRegionJp] = &furi_hal_region_jp, +}; + +static FuriHalRegion* furi_hal_dynamic_region; +static FuriMutex* furi_hal_dynamic_region_mutex; void furi_hal_region_init(void) { - FuriHalVersionRegion region = furi_hal_version_get_hw_region(); - - if(region == FuriHalVersionRegionUnknown) { - furi_hal_region = &furi_hal_region_zero; - } else if(region == FuriHalVersionRegionEuRu) { - furi_hal_region = &furi_hal_region_eu_ru; - } else if(region == FuriHalVersionRegionUsCaAu) { - furi_hal_region = &furi_hal_region_us_ca_au; - } else if(region == FuriHalVersionRegionJp) { - furi_hal_region = &furi_hal_region_jp; - } + furi_assert(furi_hal_dynamic_region_mutex == NULL); + furi_hal_dynamic_region_mutex = furi_mutex_alloc(FuriMutexTypeNormal); } const FuriHalRegion* furi_hal_region_get(void) { - return furi_hal_region; + const FuriHalVersionRegion region = furi_hal_version_get_hw_region(); + const FuriHalRegion* ret; + + furi_check(furi_mutex_acquire(furi_hal_dynamic_region_mutex, FuriWaitForever) == FuriStatusOk); + + if(region < FuriHalVersionRegionWorld && furi_hal_dynamic_region == NULL) { + ret = furi_hal_static_regions[region]; + } else { + ret = furi_hal_dynamic_region; + } + + furi_check(furi_mutex_release(furi_hal_dynamic_region_mutex) == FuriStatusOk); + + return ret; } void furi_hal_region_set(FuriHalRegion* region) { furi_check(region); - furi_hal_region = region; + furi_check(furi_mutex_acquire(furi_hal_dynamic_region_mutex, FuriWaitForever) == FuriStatusOk); + + if(furi_hal_dynamic_region) { + free(furi_hal_dynamic_region); + } + + furi_hal_dynamic_region = region; + + furi_check(furi_mutex_release(furi_hal_dynamic_region_mutex) == FuriStatusOk); } bool furi_hal_region_is_provisioned(void) { - return furi_hal_region != NULL; + return furi_hal_region_get() != NULL; } const char* furi_hal_region_get_name(void) { - if(furi_hal_region) { - return furi_hal_region->country_code; + const FuriHalRegion* region = furi_hal_region_get(); + + if(region) { + return region->country_code; } else { return "--"; } } bool furi_hal_region_is_frequency_allowed(uint32_t frequency) { - if(!furi_hal_region) { - return false; - } - - const FuriHalRegionBand* band = furi_hal_region_get_band(frequency); - if(!band) { - return false; - } - - return true; + return furi_hal_region_get_band(frequency) != NULL; } const FuriHalRegionBand* furi_hal_region_get_band(uint32_t frequency) { - if(!furi_hal_region) { + const FuriHalRegion* region = furi_hal_region_get(); + + if(!region) { return NULL; } - for(size_t i = 0; i < furi_hal_region->bands_count; i++) { - if(furi_hal_region->bands[i].start <= frequency && - furi_hal_region->bands[i].end >= frequency) { - return &furi_hal_region->bands[i]; + for(size_t i = 0; i < region->bands_count; i++) { + if(region->bands[i].start <= frequency && region->bands[i].end >= frequency) { + return ®ion->bands[i]; } } diff --git a/targets/f7/furi_hal/furi_hal_rtc.c b/targets/f7/furi_hal/furi_hal_rtc.c index f5f7bdf2d2..d5cda74767 100644 --- a/targets/f7/furi_hal/furi_hal_rtc.c +++ b/targets/f7/furi_hal/furi_hal_rtc.c @@ -411,6 +411,14 @@ uint32_t furi_hal_rtc_get_pin_fails(void) { return furi_hal_rtc_get_register(FuriHalRtcRegisterPinFails); } +void furi_hal_rtc_set_pin_value(uint32_t value) { + furi_hal_rtc_set_register(FuriHalRtcRegisterPinValue, value); +} + +uint32_t furi_hal_rtc_get_pin_value(void) { + return furi_hal_rtc_get_register(FuriHalRtcRegisterPinValue); +} + uint32_t furi_hal_rtc_get_timestamp(void) { DateTime datetime = {0}; furi_hal_rtc_get_datetime(&datetime); diff --git a/targets/f7/furi_hal/furi_hal_rtc.h b/targets/f7/furi_hal/furi_hal_rtc.h index 3bdbb0c729..030b464cf7 100644 --- a/targets/f7/furi_hal/furi_hal_rtc.h +++ b/targets/f7/furi_hal/furi_hal_rtc.h @@ -46,9 +46,10 @@ typedef enum { FuriHalRtcRegisterVersion, /**< Pointer to Version */ FuriHalRtcRegisterLfsFingerprint, /**< LFS geometry fingerprint */ FuriHalRtcRegisterFaultData, /**< Pointer to last fault message */ - FuriHalRtcRegisterPinFails, /**< Failed pins count */ + FuriHalRtcRegisterPinFails, /**< Failed PINs count */ /* Index of FS directory entry corresponding to FW update to be applied */ FuriHalRtcRegisterUpdateFolderFSIndex, + FuriHalRtcRegisterPinValue, /**< Encoded value of the currently set PIN */ FuriHalRtcRegisterMAX, /**< Service value, do not use */ } FuriHalRtcRegister; @@ -257,18 +258,29 @@ void furi_hal_rtc_set_fault_data(uint32_t value); */ uint32_t furi_hal_rtc_get_fault_data(void); -/** Set Pin Fails count +/** Set PIN Fails count * - * @param[in] value The Pin Fails count + * @param[in] value The PIN Fails count */ void furi_hal_rtc_set_pin_fails(uint32_t value); -/** Get Pin Fails count +/** Get PIN Fails count * - * @return Pin Fails Count + * @return PIN Fails Count */ uint32_t furi_hal_rtc_get_pin_fails(void); +/** Set encoded PIN value + * + * @param[in] value new PIN code value to be set + */ +void furi_hal_rtc_set_pin_value(uint32_t value); + +/** Get the current PIN encoded value + * + */ +uint32_t furi_hal_rtc_get_pin_value(void); + /** Get UNIX Timestamp * * @return Unix Timestamp in seconds from UNIX epoch start diff --git a/targets/f7/target.json b/targets/f7/target.json index 665864d7d9..35f1766c19 100644 --- a/targets/f7/target.json +++ b/targets/f7/target.json @@ -25,7 +25,6 @@ "stm32wb", "hwdrivers", "fatfs", - "littlefs", "subghz", "toolbox", "nfc", diff --git a/targets/furi_hal_include/furi_hal_region.h b/targets/furi_hal_include/furi_hal_region.h index eed5bef92c..79a823ba45 100644 --- a/targets/furi_hal_include/furi_hal_region.h +++ b/targets/furi_hal_include/furi_hal_region.h @@ -2,7 +2,6 @@ #include #include -#include #ifdef __cplusplus extern "C" { From 41fcead7103836f42842a358a8244a2557439f15 Mon Sep 17 00:00:00 2001 From: Sean Skyhawk <166570980+skyhawkillusions@users.noreply.github.com> Date: Tue, 6 Aug 2024 22:57:32 -0400 Subject: [PATCH 31/52] Images linting: ensure that all images conform specification (#3802) * Change all icons to be white background * assets: re-processed all *.png images to 1-bit * assets: also stripped profile data from .pngs * assets: also stripped datetime from metadata (`-define png:exclude-chunks=date,time`) * scripts: added image linter and formatter; fbt: added `lint_img` && `format_img` targets; github: integrated image lint step into CI * scripts: imglint: fixed deprecation warning * images: applied `format_img` * fbt: added `lint_all` and `format_all` targets; docs: updated for new targets Co-authored-by: hedger Co-authored-by: hedger --- .../workflows/lint_and_submodule_check.yml | 16 +++ SConstruct | 40 +++++++- .../file_browser_test/icons/badusb_10px.png | Bin 576 -> 96 bytes .../images/DolphinCommon_56x48.png | Bin 1416 -> 301 bytes .../debug/subghz_test/subghz_test_10px.png | Bin 181 -> 96 bytes .../example_ble_beacon_10px.png | Bin 8727 -> 96 bytes .../images/lighthouse_35x44.png | Bin 8910 -> 258 bytes .../example_images/images/dolphin_71x25.png | Bin 1188 -> 226 bytes .../example_thermo/example_thermo_10px.png | Bin 7293 -> 91 bytes applications/main/bad_usb/icon.png | Bin 576 -> 96 bytes applications/main/gpio/icon.png | Bin 1760 -> 91 bytes applications/main/ibutton/icon.png | Bin 304 -> 96 bytes applications/main/infrared/icon.png | Bin 305 -> 96 bytes applications/main/lfrfid/icon.png | Bin 308 -> 95 bytes applications/main/nfc/icon.png | Bin 304 -> 96 bytes applications/main/subghz/icon.png | Bin 299 -> 95 bytes applications/main/u2f/icon.png | Bin 583 -> 98 bytes .../system/hid_app/assets/Alt_17x10.png | Bin 112 -> 100 bytes .../system/hid_app/assets/Alt_active_17x9.png | Bin 3614 -> 93 bytes .../system/hid_app/assets/Arr_dwn_7x9.png | Bin 3602 -> 79 bytes .../system/hid_app/assets/Arr_up_7x9.png | Bin 3605 -> 79 bytes .../hid_app/assets/Ble_connected_15x15.png | Bin 3634 -> 111 bytes .../hid_app/assets/Ble_disconnected_15x15.png | Bin 657 -> 113 bytes .../system/hid_app/assets/ButtonDown_7x4.png | Bin 102 -> 73 bytes .../system/hid_app/assets/ButtonF10_5x8.png | Bin 172 -> 81 bytes .../system/hid_app/assets/ButtonF11_5x8.png | Bin 173 -> 81 bytes .../system/hid_app/assets/ButtonF12_5x8.png | Bin 180 -> 81 bytes .../system/hid_app/assets/ButtonF1_5x8.png | Bin 177 -> 81 bytes .../system/hid_app/assets/ButtonF2_5x8.png | Bin 179 -> 81 bytes .../system/hid_app/assets/ButtonF3_5x8.png | Bin 178 -> 81 bytes .../system/hid_app/assets/ButtonF4_5x8.png | Bin 177 -> 81 bytes .../system/hid_app/assets/ButtonF5_5x8.png | Bin 178 -> 81 bytes .../system/hid_app/assets/ButtonF6_5x8.png | Bin 177 -> 81 bytes .../system/hid_app/assets/ButtonF7_5x8.png | Bin 176 -> 81 bytes .../system/hid_app/assets/ButtonF8_5x8.png | Bin 176 -> 81 bytes .../system/hid_app/assets/ButtonF9_5x8.png | Bin 179 -> 81 bytes .../system/hid_app/assets/ButtonLeft_4x7.png | Bin 1415 -> 79 bytes .../system/hid_app/assets/ButtonRight_4x7.png | Bin 1839 -> 79 bytes .../system/hid_app/assets/ButtonUp_7x4.png | Bin 102 -> 73 bytes .../system/hid_app/assets/Button_18x18.png | Bin 3609 -> 96 bytes .../system/hid_app/assets/Cmd_17x10.png | Bin 116 -> 102 bytes .../system/hid_app/assets/Cmd_active_17x9.png | Bin 3618 -> 96 bytes .../system/hid_app/assets/Ctrl_17x10.png | Bin 116 -> 102 bytes .../hid_app/assets/Ctrl_active_17x9.png | Bin 3619 -> 96 bytes .../system/hid_app/assets/Del_17x10.png | Bin 116 -> 101 bytes .../hid_app/assets/DolphinDone_80x58.png | Bin 1664 -> 448 bytes .../system/hid_app/assets/Dpad_49x46.png | Bin 1078 -> 232 bytes .../system/hid_app/assets/Enter_11x7.png | Bin 3609 -> 86 bytes .../system/hid_app/assets/Esc_17x10.png | Bin 117 -> 106 bytes .../hid_app/assets/Left_mouse_icon_9x10.png | Bin 129 -> 94 bytes .../system/hid_app/assets/Like_def_13x11.png | Bin 600 -> 91 bytes .../hid_app/assets/Like_pressed_17x16.png | Bin 189 -> 126 bytes .../system/hid_app/assets/Ok_btn_9x9.png | Bin 3605 -> 92 bytes .../hid_app/assets/Ok_btn_pressed_13x12.png | Bin 146 -> 95 bytes .../hid_app/assets/Pin_arrow_down_7x9.png | Bin 3607 -> 79 bytes .../hid_app/assets/Pin_arrow_left_9x7.png | Bin 3603 -> 86 bytes .../hid_app/assets/Pin_arrow_right_9x7.png | Bin 3602 -> 86 bytes .../hid_app/assets/Pin_arrow_up_7x9.png | Bin 3603 -> 79 bytes .../hid_app/assets/Pin_back_arrow_10x8.png | Bin 3606 -> 90 bytes .../hid_app/assets/Pressed_Button_13x13.png | Bin 3606 -> 89 bytes .../system/hid_app/assets/Return_10x7.png | Bin 6630 -> 86 bytes .../hid_app/assets/Right_mouse_icon_9x10.png | Bin 126 -> 94 bytes .../hid_app/assets/Shift_active_7x9.png | Bin 113 -> 84 bytes .../hid_app/assets/Shift_inactive_7x9.png | Bin 116 -> 83 bytes .../system/hid_app/assets/Space_60x18.png | Bin 2871 -> 116 bytes .../system/hid_app/assets/Space_65x18.png | Bin 3619 -> 112 bytes .../system/hid_app/assets/Tab_17x10.png | Bin 110 -> 101 bytes .../system/hid_app/assets/Tab_19x12.png | Bin 984 -> 109 bytes .../system/hid_app/assets/Voldwn_6x6.png | Bin 3593 -> 77 bytes .../system/hid_app/assets/Volup_8x6.png | Bin 3595 -> 77 bytes .../hid_app/assets/apostrophe_button_9x11.png | Bin 94 -> 85 bytes .../hid_app/assets/backslash_button_9x11.png | Bin 3595 -> 90 bytes .../system/hid_app/assets/backspace_19x11.png | Bin 3612 -> 105 bytes .../hid_app/assets/backspace_hovered_9x11.png | Bin 3612 -> 94 bytes .../hid_app/assets/backtick_button_9x11.png | Bin 3593 -> 84 bytes .../hid_app/assets/brace_left_button_9x11.png | Bin 3601 -> 92 bytes .../assets/brace_right_button_9x11.png | Bin 3600 -> 92 bytes .../hid_app/assets/equals_button_9x11.png | Bin 3595 -> 80 bytes .../hid_app/assets/hash_button_9x11.png | Bin 3598 -> 88 bytes .../hid_app/assets/percent_button_9x11.png | Bin 3607 -> 98 bytes .../hid_app/assets/quote_button_9x11.png | Bin 3594 -> 85 bytes .../hid_app/assets/slash_button_9x11.png | Bin 3595 -> 90 bytes .../assets/sq_bracket_left_button_9x11.png | Bin 3598 -> 89 bytes .../assets/sq_bracket_right_button_9x11.png | Bin 3598 -> 89 bytes .../hid_app/assets/underscore_button_9x11.png | Bin 3593 -> 81 bytes applications/system/hid_app/hid_ble_10px.png | Bin 151 -> 96 bytes applications/system/hid_app/hid_usb_10px.png | Bin 969 -> 96 bytes applications/system/js_app/icon.png | Bin 3635 -> 88 bytes applications/system/snake_game/snake_10px.png | Bin 158 -> 96 bytes .../blocking/L0_NewMail_128x51/frame_0.png | Bin 1389 -> 402 bytes .../blocking/L0_NewMail_128x51/frame_1.png | Bin 1404 -> 416 bytes .../blocking/L0_NewMail_128x51/frame_2.png | Bin 1434 -> 445 bytes .../blocking/L0_NewMail_128x51/frame_3.png | Bin 1438 -> 459 bytes .../blocking/L0_NoDb_128x51/frame_0.png | Bin 1424 -> 404 bytes .../blocking/L0_NoDb_128x51/frame_1.png | Bin 1425 -> 405 bytes .../blocking/L0_NoDb_128x51/frame_2.png | Bin 1423 -> 413 bytes .../blocking/L0_NoDb_128x51/frame_3.png | Bin 1420 -> 406 bytes .../blocking/L0_SdBad_128x51/frame_0.png | Bin 1370 -> 392 bytes .../blocking/L0_SdBad_128x51/frame_1.png | Bin 1387 -> 404 bytes .../blocking/L0_SdOk_128x51/frame_0.png | Bin 1387 -> 394 bytes .../blocking/L0_SdOk_128x51/frame_1.png | Bin 1395 -> 400 bytes .../blocking/L0_SdOk_128x51/frame_2.png | Bin 1413 -> 404 bytes .../blocking/L0_SdOk_128x51/frame_3.png | Bin 1403 -> 405 bytes .../blocking/L0_Url_128x51/frame_0.png | Bin 1380 -> 387 bytes .../blocking/L0_Url_128x51/frame_1.png | Bin 2046 -> 391 bytes .../blocking/L0_Url_128x51/frame_2.png | Bin 2044 -> 392 bytes .../blocking/L0_Url_128x51/frame_3.png | Bin 2045 -> 385 bytes .../external/L1_Akira_128x64/frame_0.png | Bin 1832 -> 916 bytes .../external/L1_Akira_128x64/frame_1.png | Bin 1888 -> 883 bytes .../external/L1_Akira_128x64/frame_10.png | Bin 1733 -> 914 bytes .../external/L1_Akira_128x64/frame_11.png | Bin 1601 -> 836 bytes .../external/L1_Akira_128x64/frame_12.png | Bin 1385 -> 714 bytes .../external/L1_Akira_128x64/frame_13.png | Bin 1815 -> 945 bytes .../external/L1_Akira_128x64/frame_14.png | Bin 1701 -> 902 bytes .../external/L1_Akira_128x64/frame_15.png | Bin 1409 -> 699 bytes .../external/L1_Akira_128x64/frame_16.png | Bin 1369 -> 690 bytes .../external/L1_Akira_128x64/frame_17.png | Bin 1398 -> 702 bytes .../external/L1_Akira_128x64/frame_18.png | Bin 1360 -> 689 bytes .../external/L1_Akira_128x64/frame_19.png | Bin 1330 -> 688 bytes .../external/L1_Akira_128x64/frame_2.png | Bin 1836 -> 894 bytes .../external/L1_Akira_128x64/frame_20.png | Bin 1077 -> 547 bytes .../external/L1_Akira_128x64/frame_21.png | Bin 1276 -> 749 bytes .../external/L1_Akira_128x64/frame_22.png | Bin 1688 -> 834 bytes .../external/L1_Akira_128x64/frame_23.png | Bin 1984 -> 941 bytes .../external/L1_Akira_128x64/frame_24.png | Bin 2015 -> 951 bytes .../external/L1_Akira_128x64/frame_25.png | Bin 1812 -> 874 bytes .../external/L1_Akira_128x64/frame_26.png | Bin 1395 -> 761 bytes .../external/L1_Akira_128x64/frame_27.png | Bin 1426 -> 775 bytes .../external/L1_Akira_128x64/frame_28.png | Bin 2053 -> 965 bytes .../external/L1_Akira_128x64/frame_29.png | Bin 1891 -> 925 bytes .../external/L1_Akira_128x64/frame_3.png | Bin 1908 -> 912 bytes .../external/L1_Akira_128x64/frame_30.png | Bin 1951 -> 931 bytes .../external/L1_Akira_128x64/frame_31.png | Bin 1911 -> 927 bytes .../external/L1_Akira_128x64/frame_32.png | Bin 1726 -> 875 bytes .../external/L1_Akira_128x64/frame_33.png | Bin 1923 -> 895 bytes .../external/L1_Akira_128x64/frame_34.png | Bin 1126 -> 571 bytes .../external/L1_Akira_128x64/frame_35.png | Bin 1555 -> 768 bytes .../external/L1_Akira_128x64/frame_4.png | Bin 1989 -> 948 bytes .../external/L1_Akira_128x64/frame_5.png | Bin 2000 -> 921 bytes .../external/L1_Akira_128x64/frame_6.png | Bin 1869 -> 903 bytes .../external/L1_Akira_128x64/frame_7.png | Bin 1868 -> 888 bytes .../external/L1_Akira_128x64/frame_8.png | Bin 1891 -> 918 bytes .../external/L1_Akira_128x64/frame_9.png | Bin 1817 -> 952 bytes .../external/L1_Boxing_128x64/frame_0.png | Bin 1548 -> 632 bytes .../external/L1_Boxing_128x64/frame_1.png | Bin 1550 -> 568 bytes .../external/L1_Boxing_128x64/frame_2.png | Bin 1609 -> 668 bytes .../external/L1_Boxing_128x64/frame_3.png | Bin 1518 -> 560 bytes .../external/L1_Boxing_128x64/frame_4.png | Bin 1537 -> 569 bytes .../external/L1_Boxing_128x64/frame_5.png | Bin 1555 -> 568 bytes .../external/L1_Boxing_128x64/frame_6.png | Bin 1543 -> 560 bytes .../external/L1_Cry_128x64/frame_0.png | Bin 1942 -> 897 bytes .../external/L1_Cry_128x64/frame_1.png | Bin 1952 -> 910 bytes .../external/L1_Cry_128x64/frame_2.png | Bin 1945 -> 897 bytes .../external/L1_Cry_128x64/frame_3.png | Bin 1941 -> 922 bytes .../external/L1_Cry_128x64/frame_4.png | Bin 1938 -> 897 bytes .../external/L1_Cry_128x64/frame_5.png | Bin 1928 -> 907 bytes .../external/L1_Cry_128x64/frame_6.png | Bin 1946 -> 909 bytes .../external/L1_Cry_128x64/frame_7.png | Bin 1950 -> 918 bytes .../external/L1_Furippa1_128x64/frame_0.png | Bin 1302 -> 379 bytes .../external/L1_Furippa1_128x64/frame_1.png | Bin 1333 -> 411 bytes .../external/L1_Furippa1_128x64/frame_10.png | Bin 1524 -> 546 bytes .../external/L1_Furippa1_128x64/frame_11.png | Bin 1782 -> 722 bytes .../external/L1_Furippa1_128x64/frame_12.png | Bin 1607 -> 531 bytes .../external/L1_Furippa1_128x64/frame_13.png | Bin 1679 -> 594 bytes .../external/L1_Furippa1_128x64/frame_14.png | Bin 1714 -> 652 bytes .../external/L1_Furippa1_128x64/frame_15.png | Bin 1775 -> 704 bytes .../external/L1_Furippa1_128x64/frame_16.png | Bin 1475 -> 516 bytes .../external/L1_Furippa1_128x64/frame_17.png | Bin 1428 -> 510 bytes .../external/L1_Furippa1_128x64/frame_18.png | Bin 1346 -> 458 bytes .../external/L1_Furippa1_128x64/frame_2.png | Bin 1339 -> 420 bytes .../external/L1_Furippa1_128x64/frame_3.png | Bin 1328 -> 405 bytes .../external/L1_Furippa1_128x64/frame_4.png | Bin 1383 -> 453 bytes .../external/L1_Furippa1_128x64/frame_5.png | Bin 1390 -> 461 bytes .../external/L1_Furippa1_128x64/frame_6.png | Bin 1397 -> 472 bytes .../external/L1_Furippa1_128x64/frame_7.png | Bin 1302 -> 379 bytes .../external/L1_Furippa1_128x64/frame_8.png | Bin 1291 -> 379 bytes .../external/L1_Furippa1_128x64/frame_9.png | Bin 1337 -> 417 bytes .../external/L1_Kaiju_128x64/frame_0.png | Bin 1312 -> 654 bytes .../external/L1_Kaiju_128x64/frame_1.png | Bin 1302 -> 658 bytes .../external/L1_Kaiju_128x64/frame_10.png | Bin 1332 -> 677 bytes .../external/L1_Kaiju_128x64/frame_11.png | Bin 1228 -> 624 bytes .../external/L1_Kaiju_128x64/frame_12.png | Bin 1152 -> 601 bytes .../external/L1_Kaiju_128x64/frame_13.png | Bin 1152 -> 591 bytes .../external/L1_Kaiju_128x64/frame_14.png | Bin 1162 -> 603 bytes .../external/L1_Kaiju_128x64/frame_15.png | Bin 1209 -> 619 bytes .../external/L1_Kaiju_128x64/frame_16.png | Bin 1158 -> 580 bytes .../external/L1_Kaiju_128x64/frame_17.png | Bin 1161 -> 604 bytes .../external/L1_Kaiju_128x64/frame_18.png | Bin 828 -> 453 bytes .../external/L1_Kaiju_128x64/frame_19.png | Bin 817 -> 411 bytes .../external/L1_Kaiju_128x64/frame_2.png | Bin 1288 -> 657 bytes .../external/L1_Kaiju_128x64/frame_20.png | Bin 1222 -> 624 bytes .../external/L1_Kaiju_128x64/frame_21.png | Bin 1494 -> 800 bytes .../external/L1_Kaiju_128x64/frame_22.png | Bin 1685 -> 873 bytes .../external/L1_Kaiju_128x64/frame_23.png | Bin 1680 -> 873 bytes .../external/L1_Kaiju_128x64/frame_24.png | Bin 1690 -> 876 bytes .../external/L1_Kaiju_128x64/frame_25.png | Bin 1658 -> 870 bytes .../external/L1_Kaiju_128x64/frame_26.png | Bin 1716 -> 884 bytes .../external/L1_Kaiju_128x64/frame_27.png | Bin 1741 -> 888 bytes .../external/L1_Kaiju_128x64/frame_28.png | Bin 1686 -> 865 bytes .../external/L1_Kaiju_128x64/frame_29.png | Bin 1626 -> 853 bytes .../external/L1_Kaiju_128x64/frame_3.png | Bin 1305 -> 660 bytes .../external/L1_Kaiju_128x64/frame_30.png | Bin 1677 -> 883 bytes .../external/L1_Kaiju_128x64/frame_31.png | Bin 1639 -> 854 bytes .../external/L1_Kaiju_128x64/frame_32.png | Bin 1618 -> 857 bytes .../external/L1_Kaiju_128x64/frame_33.png | Bin 1595 -> 820 bytes .../external/L1_Kaiju_128x64/frame_34.png | Bin 1591 -> 854 bytes .../external/L1_Kaiju_128x64/frame_35.png | Bin 1560 -> 841 bytes .../external/L1_Kaiju_128x64/frame_36.png | Bin 1592 -> 872 bytes .../external/L1_Kaiju_128x64/frame_37.png | Bin 1494 -> 832 bytes .../external/L1_Kaiju_128x64/frame_38.png | Bin 1489 -> 820 bytes .../external/L1_Kaiju_128x64/frame_39.png | Bin 1438 -> 798 bytes .../external/L1_Kaiju_128x64/frame_4.png | Bin 1284 -> 657 bytes .../external/L1_Kaiju_128x64/frame_40.png | Bin 1438 -> 835 bytes .../external/L1_Kaiju_128x64/frame_41.png | Bin 1412 -> 821 bytes .../external/L1_Kaiju_128x64/frame_42.png | Bin 1425 -> 839 bytes .../external/L1_Kaiju_128x64/frame_43.png | Bin 1397 -> 845 bytes .../external/L1_Kaiju_128x64/frame_44.png | Bin 1217 -> 622 bytes .../external/L1_Kaiju_128x64/frame_45.png | Bin 1177 -> 614 bytes .../external/L1_Kaiju_128x64/frame_46.png | Bin 1300 -> 655 bytes .../external/L1_Kaiju_128x64/frame_47.png | Bin 1268 -> 654 bytes .../external/L1_Kaiju_128x64/frame_5.png | Bin 1318 -> 665 bytes .../external/L1_Kaiju_128x64/frame_6.png | Bin 1312 -> 648 bytes .../external/L1_Kaiju_128x64/frame_7.png | Bin 1301 -> 660 bytes .../external/L1_Kaiju_128x64/frame_8.png | Bin 1308 -> 655 bytes .../external/L1_Kaiju_128x64/frame_9.png | Bin 1336 -> 666 bytes .../external/L1_Laptop_128x51/frame_0.png | Bin 4914 -> 565 bytes .../external/L1_Laptop_128x51/frame_1.png | Bin 4917 -> 568 bytes .../external/L1_Laptop_128x51/frame_2.png | Bin 4914 -> 569 bytes .../external/L1_Laptop_128x51/frame_3.png | Bin 4914 -> 564 bytes .../external/L1_Laptop_128x51/frame_4.png | Bin 4909 -> 566 bytes .../external/L1_Laptop_128x51/frame_5.png | Bin 4908 -> 561 bytes .../external/L1_Laptop_128x51/frame_6.png | Bin 4900 -> 563 bytes .../external/L1_Laptop_128x51/frame_7.png | Bin 4907 -> 562 bytes .../L1_Leaving_sad_128x64/frame_0.png | Bin 1575 -> 591 bytes .../L1_Leaving_sad_128x64/frame_1.png | Bin 1589 -> 600 bytes .../L1_Leaving_sad_128x64/frame_10.png | Bin 1386 -> 423 bytes .../L1_Leaving_sad_128x64/frame_11.png | Bin 1358 -> 392 bytes .../L1_Leaving_sad_128x64/frame_12.png | Bin 1365 -> 400 bytes .../L1_Leaving_sad_128x64/frame_2.png | Bin 1597 -> 619 bytes .../L1_Leaving_sad_128x64/frame_3.png | Bin 1617 -> 628 bytes .../L1_Leaving_sad_128x64/frame_4.png | Bin 1544 -> 562 bytes .../L1_Leaving_sad_128x64/frame_5.png | Bin 1523 -> 562 bytes .../L1_Leaving_sad_128x64/frame_6.png | Bin 1555 -> 571 bytes .../L1_Leaving_sad_128x64/frame_7.png | Bin 1574 -> 583 bytes .../L1_Leaving_sad_128x64/frame_8.png | Bin 1479 -> 492 bytes .../L1_Leaving_sad_128x64/frame_9.png | Bin 1382 -> 406 bytes .../external/L1_Mad_fist_128x64/frame_0.png | Bin 1556 -> 647 bytes .../external/L1_Mad_fist_128x64/frame_1.png | Bin 1580 -> 665 bytes .../external/L1_Mad_fist_128x64/frame_10.png | Bin 1606 -> 653 bytes .../external/L1_Mad_fist_128x64/frame_11.png | Bin 1556 -> 627 bytes .../external/L1_Mad_fist_128x64/frame_12.png | Bin 1541 -> 627 bytes .../external/L1_Mad_fist_128x64/frame_13.png | Bin 1545 -> 628 bytes .../external/L1_Mad_fist_128x64/frame_2.png | Bin 1558 -> 641 bytes .../external/L1_Mad_fist_128x64/frame_3.png | Bin 1583 -> 661 bytes .../external/L1_Mad_fist_128x64/frame_4.png | Bin 1560 -> 637 bytes .../external/L1_Mad_fist_128x64/frame_5.png | Bin 1557 -> 639 bytes .../external/L1_Mad_fist_128x64/frame_6.png | Bin 1581 -> 637 bytes .../external/L1_Mad_fist_128x64/frame_7.png | Bin 1575 -> 643 bytes .../external/L1_Mad_fist_128x64/frame_8.png | Bin 1581 -> 647 bytes .../external/L1_Mad_fist_128x64/frame_9.png | Bin 1584 -> 650 bytes .../external/L1_Mods_128x64/frame_0.png | Bin 4344 -> 673 bytes .../external/L1_Mods_128x64/frame_1.png | Bin 4351 -> 676 bytes .../external/L1_Mods_128x64/frame_10.png | Bin 4370 -> 685 bytes .../external/L1_Mods_128x64/frame_11.png | Bin 4342 -> 668 bytes .../external/L1_Mods_128x64/frame_12.png | Bin 4327 -> 659 bytes .../external/L1_Mods_128x64/frame_13.png | Bin 4363 -> 680 bytes .../external/L1_Mods_128x64/frame_14.png | Bin 4306 -> 656 bytes .../external/L1_Mods_128x64/frame_15.png | Bin 4325 -> 660 bytes .../external/L1_Mods_128x64/frame_16.png | Bin 4346 -> 679 bytes .../external/L1_Mods_128x64/frame_17.png | Bin 4338 -> 674 bytes .../external/L1_Mods_128x64/frame_18.png | Bin 4346 -> 674 bytes .../external/L1_Mods_128x64/frame_19.png | Bin 4339 -> 670 bytes .../external/L1_Mods_128x64/frame_2.png | Bin 4344 -> 676 bytes .../external/L1_Mods_128x64/frame_20.png | Bin 4314 -> 661 bytes .../external/L1_Mods_128x64/frame_21.png | Bin 2648 -> 694 bytes .../external/L1_Mods_128x64/frame_22.png | Bin 2733 -> 673 bytes .../external/L1_Mods_128x64/frame_23.png | Bin 3084 -> 688 bytes .../external/L1_Mods_128x64/frame_24.png | Bin 3236 -> 699 bytes .../external/L1_Mods_128x64/frame_25.png | Bin 3298 -> 700 bytes .../external/L1_Mods_128x64/frame_26.png | Bin 3363 -> 701 bytes .../external/L1_Mods_128x64/frame_27.png | Bin 3423 -> 696 bytes .../external/L1_Mods_128x64/frame_28.png | Bin 3371 -> 674 bytes .../external/L1_Mods_128x64/frame_29.png | Bin 3106 -> 685 bytes .../external/L1_Mods_128x64/frame_3.png | Bin 4341 -> 664 bytes .../external/L1_Mods_128x64/frame_30.png | Bin 3051 -> 660 bytes .../external/L1_Mods_128x64/frame_31.png | Bin 3072 -> 688 bytes .../external/L1_Mods_128x64/frame_32.png | Bin 3000 -> 631 bytes .../external/L1_Mods_128x64/frame_33.png | Bin 4149 -> 516 bytes .../external/L1_Mods_128x64/frame_34.png | Bin 4260 -> 626 bytes .../external/L1_Mods_128x64/frame_35.png | Bin 4376 -> 703 bytes .../external/L1_Mods_128x64/frame_36.png | Bin 4393 -> 697 bytes .../external/L1_Mods_128x64/frame_37.png | Bin 4380 -> 661 bytes .../external/L1_Mods_128x64/frame_38.png | Bin 4390 -> 662 bytes .../external/L1_Mods_128x64/frame_39.png | Bin 4383 -> 663 bytes .../external/L1_Mods_128x64/frame_4.png | Bin 4327 -> 666 bytes .../external/L1_Mods_128x64/frame_40.png | Bin 4402 -> 684 bytes .../external/L1_Mods_128x64/frame_41.png | Bin 4340 -> 635 bytes .../external/L1_Mods_128x64/frame_42.png | Bin 4253 -> 564 bytes .../external/L1_Mods_128x64/frame_43.png | Bin 4342 -> 635 bytes .../external/L1_Mods_128x64/frame_44.png | Bin 4315 -> 680 bytes .../external/L1_Mods_128x64/frame_45.png | Bin 4267 -> 618 bytes .../external/L1_Mods_128x64/frame_46.png | Bin 4301 -> 654 bytes .../external/L1_Mods_128x64/frame_47.png | Bin 4326 -> 669 bytes .../external/L1_Mods_128x64/frame_48.png | Bin 4313 -> 648 bytes .../external/L1_Mods_128x64/frame_5.png | Bin 4357 -> 680 bytes .../external/L1_Mods_128x64/frame_6.png | Bin 4334 -> 658 bytes .../external/L1_Mods_128x64/frame_7.png | Bin 4331 -> 655 bytes .../external/L1_Mods_128x64/frame_8.png | Bin 4352 -> 676 bytes .../external/L1_Mods_128x64/frame_9.png | Bin 4360 -> 682 bytes .../external/L1_My_dude_128x64/frame_0.png | Bin 1615 -> 811 bytes .../external/L1_My_dude_128x64/frame_1.png | Bin 1637 -> 838 bytes .../external/L1_My_dude_128x64/frame_10.png | Bin 1044 -> 631 bytes .../external/L1_My_dude_128x64/frame_11.png | Bin 990 -> 625 bytes .../external/L1_My_dude_128x64/frame_12.png | Bin 1100 -> 681 bytes .../external/L1_My_dude_128x64/frame_13.png | Bin 1494 -> 814 bytes .../external/L1_My_dude_128x64/frame_14.png | Bin 1460 -> 809 bytes .../external/L1_My_dude_128x64/frame_15.png | Bin 1440 -> 786 bytes .../external/L1_My_dude_128x64/frame_16.png | Bin 1210 -> 739 bytes .../external/L1_My_dude_128x64/frame_17.png | Bin 1399 -> 813 bytes .../external/L1_My_dude_128x64/frame_18.png | Bin 1454 -> 837 bytes .../external/L1_My_dude_128x64/frame_19.png | Bin 1648 -> 826 bytes .../external/L1_My_dude_128x64/frame_2.png | Bin 1629 -> 807 bytes .../external/L1_My_dude_128x64/frame_20.png | Bin 1433 -> 794 bytes .../external/L1_My_dude_128x64/frame_21.png | Bin 1032 -> 599 bytes .../external/L1_My_dude_128x64/frame_22.png | Bin 1054 -> 624 bytes .../external/L1_My_dude_128x64/frame_23.png | Bin 1050 -> 610 bytes .../external/L1_My_dude_128x64/frame_24.png | Bin 939 -> 574 bytes .../external/L1_My_dude_128x64/frame_25.png | Bin 1447 -> 764 bytes .../external/L1_My_dude_128x64/frame_26.png | Bin 1509 -> 798 bytes .../external/L1_My_dude_128x64/frame_27.png | Bin 1504 -> 789 bytes .../external/L1_My_dude_128x64/frame_28.png | Bin 1529 -> 789 bytes .../external/L1_My_dude_128x64/frame_29.png | Bin 1625 -> 835 bytes .../external/L1_My_dude_128x64/frame_3.png | Bin 1599 -> 802 bytes .../external/L1_My_dude_128x64/frame_30.png | Bin 1575 -> 826 bytes .../external/L1_My_dude_128x64/frame_31.png | Bin 1609 -> 824 bytes .../external/L1_My_dude_128x64/frame_32.png | Bin 1635 -> 827 bytes .../external/L1_My_dude_128x64/frame_33.png | Bin 1668 -> 842 bytes .../external/L1_My_dude_128x64/frame_34.png | Bin 1588 -> 824 bytes .../external/L1_My_dude_128x64/frame_35.png | Bin 1551 -> 811 bytes .../external/L1_My_dude_128x64/frame_36.png | Bin 1656 -> 847 bytes .../external/L1_My_dude_128x64/frame_37.png | Bin 1545 -> 818 bytes .../external/L1_My_dude_128x64/frame_38.png | Bin 1650 -> 821 bytes .../external/L1_My_dude_128x64/frame_39.png | Bin 1028 -> 560 bytes .../external/L1_My_dude_128x64/frame_4.png | Bin 1623 -> 843 bytes .../external/L1_My_dude_128x64/frame_40.png | Bin 1225 -> 673 bytes .../external/L1_My_dude_128x64/frame_41.png | Bin 1256 -> 788 bytes .../external/L1_My_dude_128x64/frame_42.png | Bin 1055 -> 701 bytes .../external/L1_My_dude_128x64/frame_43.png | Bin 831 -> 553 bytes .../external/L1_My_dude_128x64/frame_44.png | Bin 623 -> 383 bytes .../external/L1_My_dude_128x64/frame_45.png | Bin 556 -> 313 bytes .../external/L1_My_dude_128x64/frame_46.png | Bin 928 -> 545 bytes .../external/L1_My_dude_128x64/frame_47.png | Bin 1206 -> 724 bytes .../external/L1_My_dude_128x64/frame_48.png | Bin 1019 -> 625 bytes .../external/L1_My_dude_128x64/frame_5.png | Bin 1648 -> 828 bytes .../external/L1_My_dude_128x64/frame_6.png | Bin 1570 -> 780 bytes .../external/L1_My_dude_128x64/frame_7.png | Bin 1063 -> 640 bytes .../external/L1_My_dude_128x64/frame_8.png | Bin 1024 -> 636 bytes .../external/L1_My_dude_128x64/frame_9.png | Bin 1078 -> 664 bytes .../external/L1_Painting_128x64/frame_0.png | Bin 1607 -> 860 bytes .../external/L1_Painting_128x64/frame_1.png | Bin 1618 -> 848 bytes .../external/L1_Painting_128x64/frame_10.png | Bin 1606 -> 859 bytes .../external/L1_Painting_128x64/frame_11.png | Bin 1579 -> 850 bytes .../external/L1_Painting_128x64/frame_2.png | Bin 1608 -> 845 bytes .../external/L1_Painting_128x64/frame_3.png | Bin 1585 -> 851 bytes .../external/L1_Painting_128x64/frame_4.png | Bin 1600 -> 848 bytes .../external/L1_Painting_128x64/frame_5.png | Bin 1609 -> 840 bytes .../external/L1_Painting_128x64/frame_6.png | Bin 1588 -> 853 bytes .../external/L1_Painting_128x64/frame_7.png | Bin 1630 -> 858 bytes .../external/L1_Painting_128x64/frame_8.png | Bin 1623 -> 859 bytes .../external/L1_Painting_128x64/frame_9.png | Bin 1614 -> 851 bytes .../external/L1_Read_books_128x64/frame_0.png | Bin 1762 -> 762 bytes .../external/L1_Read_books_128x64/frame_1.png | Bin 1762 -> 761 bytes .../external/L1_Read_books_128x64/frame_2.png | Bin 1756 -> 763 bytes .../external/L1_Read_books_128x64/frame_3.png | Bin 1759 -> 768 bytes .../external/L1_Read_books_128x64/frame_4.png | Bin 1771 -> 772 bytes .../external/L1_Read_books_128x64/frame_5.png | Bin 1754 -> 755 bytes .../external/L1_Read_books_128x64/frame_6.png | Bin 1750 -> 755 bytes .../external/L1_Read_books_128x64/frame_7.png | Bin 1747 -> 759 bytes .../external/L1_Read_books_128x64/frame_8.png | Bin 1750 -> 763 bytes .../external/L1_Recording_128x51/frame_0.png | Bin 1752 -> 668 bytes .../external/L1_Recording_128x51/frame_1.png | Bin 1742 -> 665 bytes .../external/L1_Recording_128x51/frame_10.png | Bin 1708 -> 681 bytes .../external/L1_Recording_128x51/frame_11.png | Bin 1745 -> 664 bytes .../external/L1_Recording_128x51/frame_2.png | Bin 1688 -> 679 bytes .../external/L1_Recording_128x51/frame_3.png | Bin 1745 -> 663 bytes .../external/L1_Recording_128x51/frame_4.png | Bin 1735 -> 686 bytes .../external/L1_Recording_128x51/frame_5.png | Bin 1691 -> 665 bytes .../external/L1_Recording_128x51/frame_6.png | Bin 1752 -> 671 bytes .../external/L1_Recording_128x51/frame_7.png | Bin 1689 -> 666 bytes .../external/L1_Recording_128x51/frame_8.png | Bin 1766 -> 682 bytes .../external/L1_Recording_128x51/frame_9.png | Bin 1732 -> 668 bytes .../external/L1_Sad_song_128x64/frame_0.png | Bin 1464 -> 723 bytes .../external/L1_Sad_song_128x64/frame_1.png | Bin 1442 -> 719 bytes .../external/L1_Sad_song_128x64/frame_10.png | Bin 1044 -> 568 bytes .../external/L1_Sad_song_128x64/frame_11.png | Bin 1069 -> 578 bytes .../external/L1_Sad_song_128x64/frame_12.png | Bin 980 -> 538 bytes .../external/L1_Sad_song_128x64/frame_13.png | Bin 1150 -> 611 bytes .../external/L1_Sad_song_128x64/frame_14.png | Bin 1153 -> 603 bytes .../external/L1_Sad_song_128x64/frame_15.png | Bin 1137 -> 602 bytes .../external/L1_Sad_song_128x64/frame_16.png | Bin 979 -> 541 bytes .../external/L1_Sad_song_128x64/frame_17.png | Bin 988 -> 546 bytes .../external/L1_Sad_song_128x64/frame_18.png | Bin 1049 -> 556 bytes .../external/L1_Sad_song_128x64/frame_19.png | Bin 259 -> 75 bytes .../external/L1_Sad_song_128x64/frame_2.png | Bin 1483 -> 719 bytes .../external/L1_Sad_song_128x64/frame_20.png | Bin 922 -> 489 bytes .../external/L1_Sad_song_128x64/frame_21.png | Bin 895 -> 472 bytes .../external/L1_Sad_song_128x64/frame_22.png | Bin 831 -> 444 bytes .../external/L1_Sad_song_128x64/frame_23.png | Bin 803 -> 425 bytes .../external/L1_Sad_song_128x64/frame_24.png | Bin 859 -> 442 bytes .../external/L1_Sad_song_128x64/frame_25.png | Bin 854 -> 441 bytes .../external/L1_Sad_song_128x64/frame_26.png | Bin 821 -> 427 bytes .../external/L1_Sad_song_128x64/frame_27.png | Bin 791 -> 416 bytes .../external/L1_Sad_song_128x64/frame_28.png | Bin 871 -> 447 bytes .../external/L1_Sad_song_128x64/frame_29.png | Bin 954 -> 495 bytes .../external/L1_Sad_song_128x64/frame_3.png | Bin 1470 -> 720 bytes .../external/L1_Sad_song_128x64/frame_30.png | Bin 871 -> 451 bytes .../external/L1_Sad_song_128x64/frame_31.png | Bin 926 -> 472 bytes .../external/L1_Sad_song_128x64/frame_32.png | Bin 889 -> 453 bytes .../external/L1_Sad_song_128x64/frame_33.png | Bin 933 -> 483 bytes .../external/L1_Sad_song_128x64/frame_34.png | Bin 873 -> 444 bytes .../external/L1_Sad_song_128x64/frame_35.png | Bin 907 -> 451 bytes .../external/L1_Sad_song_128x64/frame_36.png | Bin 803 -> 392 bytes .../external/L1_Sad_song_128x64/frame_37.png | Bin 769 -> 395 bytes .../external/L1_Sad_song_128x64/frame_38.png | Bin 909 -> 449 bytes .../external/L1_Sad_song_128x64/frame_39.png | Bin 915 -> 471 bytes .../external/L1_Sad_song_128x64/frame_4.png | Bin 1442 -> 730 bytes .../external/L1_Sad_song_128x64/frame_40.png | Bin 918 -> 463 bytes .../external/L1_Sad_song_128x64/frame_41.png | Bin 883 -> 441 bytes .../external/L1_Sad_song_128x64/frame_42.png | Bin 1020 -> 523 bytes .../external/L1_Sad_song_128x64/frame_43.png | Bin 788 -> 459 bytes .../external/L1_Sad_song_128x64/frame_44.png | Bin 997 -> 598 bytes .../external/L1_Sad_song_128x64/frame_45.png | Bin 1061 -> 634 bytes .../external/L1_Sad_song_128x64/frame_46.png | Bin 949 -> 571 bytes .../external/L1_Sad_song_128x64/frame_47.png | Bin 1084 -> 651 bytes .../external/L1_Sad_song_128x64/frame_48.png | Bin 1016 -> 584 bytes .../external/L1_Sad_song_128x64/frame_49.png | Bin 1092 -> 664 bytes .../external/L1_Sad_song_128x64/frame_5.png | Bin 1453 -> 718 bytes .../external/L1_Sad_song_128x64/frame_50.png | Bin 988 -> 582 bytes .../external/L1_Sad_song_128x64/frame_51.png | Bin 1159 -> 682 bytes .../external/L1_Sad_song_128x64/frame_52.png | Bin 991 -> 586 bytes .../external/L1_Sad_song_128x64/frame_53.png | Bin 778 -> 404 bytes .../external/L1_Sad_song_128x64/frame_54.png | Bin 830 -> 429 bytes .../external/L1_Sad_song_128x64/frame_55.png | Bin 720 -> 361 bytes .../external/L1_Sad_song_128x64/frame_56.png | Bin 576 -> 275 bytes .../external/L1_Sad_song_128x64/frame_57.png | Bin 398 -> 178 bytes .../external/L1_Sad_song_128x64/frame_58.png | Bin 474 -> 208 bytes .../external/L1_Sad_song_128x64/frame_59.png | Bin 970 -> 470 bytes .../external/L1_Sad_song_128x64/frame_6.png | Bin 1487 -> 722 bytes .../external/L1_Sad_song_128x64/frame_60.png | Bin 1370 -> 683 bytes .../external/L1_Sad_song_128x64/frame_61.png | Bin 1578 -> 737 bytes .../external/L1_Sad_song_128x64/frame_62.png | Bin 1508 -> 753 bytes .../external/L1_Sad_song_128x64/frame_7.png | Bin 1480 -> 721 bytes .../external/L1_Sad_song_128x64/frame_8.png | Bin 1438 -> 730 bytes .../external/L1_Sad_song_128x64/frame_9.png | Bin 1480 -> 728 bytes .../external/L1_Senpai_128x64/frame_0.png | Bin 1756 -> 805 bytes .../external/L1_Senpai_128x64/frame_1.png | Bin 1841 -> 839 bytes .../external/L1_Senpai_128x64/frame_10.png | Bin 1846 -> 849 bytes .../external/L1_Senpai_128x64/frame_11.png | Bin 1824 -> 833 bytes .../external/L1_Senpai_128x64/frame_12.png | Bin 1826 -> 835 bytes .../external/L1_Senpai_128x64/frame_13.png | Bin 1862 -> 855 bytes .../external/L1_Senpai_128x64/frame_14.png | Bin 1815 -> 835 bytes .../external/L1_Senpai_128x64/frame_15.png | Bin 1855 -> 844 bytes .../external/L1_Senpai_128x64/frame_16.png | Bin 2009 -> 903 bytes .../external/L1_Senpai_128x64/frame_17.png | Bin 1918 -> 880 bytes .../external/L1_Senpai_128x64/frame_18.png | Bin 1686 -> 789 bytes .../external/L1_Senpai_128x64/frame_19.png | Bin 1593 -> 781 bytes .../external/L1_Senpai_128x64/frame_2.png | Bin 1879 -> 858 bytes .../external/L1_Senpai_128x64/frame_20.png | Bin 1281 -> 632 bytes .../external/L1_Senpai_128x64/frame_21.png | Bin 1318 -> 647 bytes .../external/L1_Senpai_128x64/frame_22.png | Bin 1102 -> 566 bytes .../external/L1_Senpai_128x64/frame_23.png | Bin 1537 -> 744 bytes .../external/L1_Senpai_128x64/frame_24.png | Bin 1414 -> 704 bytes .../external/L1_Senpai_128x64/frame_25.png | Bin 1486 -> 733 bytes .../external/L1_Senpai_128x64/frame_26.png | Bin 1364 -> 659 bytes .../external/L1_Senpai_128x64/frame_27.png | Bin 1325 -> 654 bytes .../external/L1_Senpai_128x64/frame_28.png | Bin 1278 -> 604 bytes .../external/L1_Senpai_128x64/frame_29.png | Bin 1179 -> 586 bytes .../external/L1_Senpai_128x64/frame_3.png | Bin 1861 -> 842 bytes .../external/L1_Senpai_128x64/frame_30.png | Bin 1198 -> 614 bytes .../external/L1_Senpai_128x64/frame_31.png | Bin 1204 -> 593 bytes .../external/L1_Senpai_128x64/frame_32.png | Bin 1248 -> 592 bytes .../external/L1_Senpai_128x64/frame_33.png | Bin 1669 -> 765 bytes .../external/L1_Senpai_128x64/frame_34.png | Bin 1767 -> 804 bytes .../external/L1_Senpai_128x64/frame_35.png | Bin 1832 -> 836 bytes .../external/L1_Senpai_128x64/frame_4.png | Bin 1769 -> 813 bytes .../external/L1_Senpai_128x64/frame_5.png | Bin 1869 -> 853 bytes .../external/L1_Senpai_128x64/frame_6.png | Bin 1893 -> 859 bytes .../external/L1_Senpai_128x64/frame_7.png | Bin 1835 -> 841 bytes .../external/L1_Senpai_128x64/frame_8.png | Bin 1772 -> 807 bytes .../external/L1_Senpai_128x64/frame_9.png | Bin 1827 -> 838 bytes .../external/L1_Sleep_128x64/frame_0.png | Bin 1542 -> 583 bytes .../external/L1_Sleep_128x64/frame_1.png | Bin 1552 -> 584 bytes .../external/L1_Sleep_128x64/frame_2.png | Bin 1552 -> 594 bytes .../external/L1_Sleep_128x64/frame_3.png | Bin 1563 -> 599 bytes .../external/L1_Waves_128x50/frame_0.png | Bin 2272 -> 552 bytes .../external/L1_Waves_128x50/frame_1.png | Bin 2282 -> 557 bytes .../external/L1_Waves_128x50/frame_2.png | Bin 1446 -> 558 bytes .../external/L1_Waves_128x50/frame_3.png | Bin 1446 -> 561 bytes .../L2_Coding_in_the_shell_128x64/frame_0.png | Bin 1074 -> 580 bytes .../L2_Coding_in_the_shell_128x64/frame_1.png | Bin 1076 -> 575 bytes .../frame_10.png | Bin 1209 -> 620 bytes .../frame_11.png | Bin 1231 -> 620 bytes .../frame_12.png | Bin 1229 -> 619 bytes .../frame_13.png | Bin 1182 -> 600 bytes .../frame_14.png | Bin 968 -> 531 bytes .../frame_15.png | Bin 971 -> 533 bytes .../frame_16.png | Bin 1160 -> 614 bytes .../frame_17.png | Bin 1082 -> 574 bytes .../frame_18.png | Bin 1068 -> 569 bytes .../frame_19.png | Bin 1123 -> 583 bytes .../L2_Coding_in_the_shell_128x64/frame_2.png | Bin 1122 -> 600 bytes .../frame_20.png | Bin 1153 -> 664 bytes .../frame_21.png | Bin 1134 -> 635 bytes .../frame_22.png | Bin 1021 -> 637 bytes .../frame_23.png | Bin 929 -> 588 bytes .../frame_24.png | Bin 856 -> 558 bytes .../frame_25.png | Bin 1499 -> 782 bytes .../frame_26.png | Bin 1408 -> 746 bytes .../frame_27.png | Bin 1367 -> 724 bytes .../frame_28.png | Bin 1882 -> 934 bytes .../frame_29.png | Bin 1757 -> 840 bytes .../L2_Coding_in_the_shell_128x64/frame_3.png | Bin 1115 -> 601 bytes .../frame_30.png | Bin 1426 -> 732 bytes .../frame_31.png | Bin 1423 -> 732 bytes .../frame_32.png | Bin 1482 -> 725 bytes .../frame_33.png | Bin 1518 -> 811 bytes .../frame_34.png | Bin 1539 -> 806 bytes .../frame_35.png | Bin 1536 -> 800 bytes .../frame_36.png | Bin 1539 -> 794 bytes .../frame_37.png | Bin 1528 -> 815 bytes .../frame_38.png | Bin 1837 -> 911 bytes .../frame_39.png | Bin 1780 -> 896 bytes .../L2_Coding_in_the_shell_128x64/frame_4.png | Bin 1144 -> 606 bytes .../frame_40.png | Bin 1778 -> 907 bytes .../frame_41.png | Bin 1770 -> 908 bytes .../frame_42.png | Bin 1741 -> 887 bytes .../frame_43.png | Bin 1004 -> 557 bytes .../frame_44.png | Bin 1025 -> 557 bytes .../frame_45.png | Bin 645 -> 378 bytes .../frame_46.png | Bin 837 -> 463 bytes .../frame_47.png | Bin 820 -> 464 bytes .../frame_48.png | Bin 925 -> 517 bytes .../frame_49.png | Bin 911 -> 510 bytes .../L2_Coding_in_the_shell_128x64/frame_5.png | Bin 1126 -> 600 bytes .../frame_50.png | Bin 880 -> 487 bytes .../frame_51.png | Bin 837 -> 466 bytes .../frame_52.png | Bin 876 -> 482 bytes .../frame_53.png | Bin 820 -> 466 bytes .../frame_54.png | Bin 913 -> 509 bytes .../frame_55.png | Bin 1080 -> 596 bytes .../frame_56.png | Bin 1026 -> 554 bytes .../frame_57.png | Bin 1132 -> 586 bytes .../frame_58.png | Bin 974 -> 513 bytes .../frame_59.png | Bin 1309 -> 688 bytes .../L2_Coding_in_the_shell_128x64/frame_6.png | Bin 1077 -> 587 bytes .../frame_60.png | Bin 1269 -> 648 bytes .../frame_61.png | Bin 1011 -> 563 bytes .../L2_Coding_in_the_shell_128x64/frame_7.png | Bin 988 -> 541 bytes .../L2_Coding_in_the_shell_128x64/frame_8.png | Bin 1201 -> 602 bytes .../L2_Coding_in_the_shell_128x64/frame_9.png | Bin 1214 -> 617 bytes .../dolphin/external/L2_Dj_128x64/frame_0.png | Bin 1640 -> 596 bytes .../dolphin/external/L2_Dj_128x64/frame_1.png | Bin 1687 -> 615 bytes .../external/L2_Dj_128x64/frame_10.png | Bin 1630 -> 609 bytes .../external/L2_Dj_128x64/frame_11.png | Bin 1660 -> 612 bytes .../external/L2_Dj_128x64/frame_12.png | Bin 1637 -> 595 bytes .../external/L2_Dj_128x64/frame_13.png | Bin 1654 -> 610 bytes .../external/L2_Dj_128x64/frame_14.png | Bin 1667 -> 622 bytes .../external/L2_Dj_128x64/frame_15.png | Bin 1344 -> 337 bytes .../external/L2_Dj_128x64/frame_16.png | Bin 1251 -> 278 bytes .../external/L2_Dj_128x64/frame_17.png | Bin 1292 -> 327 bytes .../external/L2_Dj_128x64/frame_18.png | Bin 1498 -> 516 bytes .../external/L2_Dj_128x64/frame_19.png | Bin 1530 -> 574 bytes .../dolphin/external/L2_Dj_128x64/frame_2.png | Bin 1726 -> 668 bytes .../external/L2_Dj_128x64/frame_20.png | Bin 1698 -> 684 bytes .../external/L2_Dj_128x64/frame_21.png | Bin 1665 -> 636 bytes .../external/L2_Dj_128x64/frame_22.png | Bin 1809 -> 747 bytes .../external/L2_Dj_128x64/frame_23.png | Bin 1775 -> 704 bytes .../external/L2_Dj_128x64/frame_24.png | Bin 1758 -> 739 bytes .../external/L2_Dj_128x64/frame_25.png | Bin 1725 -> 617 bytes .../external/L2_Dj_128x64/frame_26.png | Bin 1835 -> 709 bytes .../external/L2_Dj_128x64/frame_27.png | Bin 1759 -> 637 bytes .../external/L2_Dj_128x64/frame_28.png | Bin 1462 -> 458 bytes .../external/L2_Dj_128x64/frame_29.png | Bin 1407 -> 422 bytes .../dolphin/external/L2_Dj_128x64/frame_3.png | Bin 1777 -> 722 bytes .../external/L2_Dj_128x64/frame_30.png | Bin 1408 -> 404 bytes .../external/L2_Dj_128x64/frame_31.png | Bin 1404 -> 425 bytes .../external/L2_Dj_128x64/frame_32.png | Bin 1327 -> 307 bytes .../external/L2_Dj_128x64/frame_33.png | Bin 1306 -> 298 bytes .../external/L2_Dj_128x64/frame_34.png | Bin 1341 -> 453 bytes .../external/L2_Dj_128x64/frame_35.png | Bin 1255 -> 290 bytes .../external/L2_Dj_128x64/frame_36.png | Bin 1059 -> 75 bytes .../dolphin/external/L2_Dj_128x64/frame_4.png | Bin 1727 -> 705 bytes .../dolphin/external/L2_Dj_128x64/frame_5.png | Bin 1641 -> 623 bytes .../dolphin/external/L2_Dj_128x64/frame_6.png | Bin 1635 -> 613 bytes .../dolphin/external/L2_Dj_128x64/frame_7.png | Bin 1588 -> 557 bytes .../dolphin/external/L2_Dj_128x64/frame_8.png | Bin 1608 -> 582 bytes .../dolphin/external/L2_Dj_128x64/frame_9.png | Bin 1610 -> 595 bytes .../external/L2_Furippa2_128x64/frame_0.png | Bin 1389 -> 447 bytes .../external/L2_Furippa2_128x64/frame_1.png | Bin 1417 -> 466 bytes .../external/L2_Furippa2_128x64/frame_10.png | Bin 1524 -> 546 bytes .../external/L2_Furippa2_128x64/frame_11.png | Bin 1782 -> 722 bytes .../external/L2_Furippa2_128x64/frame_12.png | Bin 1607 -> 531 bytes .../external/L2_Furippa2_128x64/frame_13.png | Bin 1679 -> 594 bytes .../external/L2_Furippa2_128x64/frame_14.png | Bin 1714 -> 652 bytes .../external/L2_Furippa2_128x64/frame_15.png | Bin 1795 -> 732 bytes .../external/L2_Furippa2_128x64/frame_16.png | Bin 1549 -> 575 bytes .../external/L2_Furippa2_128x64/frame_17.png | Bin 1514 -> 568 bytes .../external/L2_Furippa2_128x64/frame_18.png | Bin 1441 -> 514 bytes .../external/L2_Furippa2_128x64/frame_2.png | Bin 1421 -> 480 bytes .../external/L2_Furippa2_128x64/frame_3.png | Bin 1411 -> 465 bytes .../external/L2_Furippa2_128x64/frame_4.png | Bin 1454 -> 506 bytes .../external/L2_Furippa2_128x64/frame_5.png | Bin 1459 -> 511 bytes .../external/L2_Furippa2_128x64/frame_6.png | Bin 1465 -> 524 bytes .../external/L2_Furippa2_128x64/frame_7.png | Bin 1389 -> 447 bytes .../external/L2_Furippa2_128x64/frame_8.png | Bin 1348 -> 408 bytes .../external/L2_Furippa2_128x64/frame_9.png | Bin 1347 -> 423 bytes .../external/L2_Hacking_pc_128x64/frame_0.png | Bin 1604 -> 571 bytes .../external/L2_Hacking_pc_128x64/frame_1.png | Bin 1601 -> 590 bytes .../external/L2_Hacking_pc_128x64/frame_2.png | Bin 1606 -> 574 bytes .../external/L2_Hacking_pc_128x64/frame_3.png | Bin 1654 -> 617 bytes .../external/L2_Hacking_pc_128x64/frame_4.png | Bin 1658 -> 616 bytes .../L2_Secret_door_128x64/frame_0.png | Bin 1648 -> 846 bytes .../L2_Secret_door_128x64/frame_1.png | Bin 1655 -> 820 bytes .../L2_Secret_door_128x64/frame_10.png | Bin 1552 -> 806 bytes .../L2_Secret_door_128x64/frame_11.png | Bin 1548 -> 773 bytes .../L2_Secret_door_128x64/frame_12.png | Bin 1577 -> 780 bytes .../L2_Secret_door_128x64/frame_13.png | Bin 1541 -> 785 bytes .../L2_Secret_door_128x64/frame_14.png | Bin 1578 -> 797 bytes .../L2_Secret_door_128x64/frame_15.png | Bin 1897 -> 965 bytes .../L2_Secret_door_128x64/frame_16.png | Bin 1918 -> 945 bytes .../L2_Secret_door_128x64/frame_17.png | Bin 1882 -> 948 bytes .../L2_Secret_door_128x64/frame_18.png | Bin 1907 -> 961 bytes .../L2_Secret_door_128x64/frame_19.png | Bin 1974 -> 960 bytes .../L2_Secret_door_128x64/frame_2.png | Bin 1636 -> 832 bytes .../L2_Secret_door_128x64/frame_20.png | Bin 1937 -> 953 bytes .../L2_Secret_door_128x64/frame_21.png | Bin 1894 -> 954 bytes .../L2_Secret_door_128x64/frame_22.png | Bin 1923 -> 946 bytes .../L2_Secret_door_128x64/frame_23.png | Bin 1966 -> 963 bytes .../L2_Secret_door_128x64/frame_24.png | Bin 1958 -> 973 bytes .../L2_Secret_door_128x64/frame_25.png | Bin 1946 -> 958 bytes .../L2_Secret_door_128x64/frame_26.png | Bin 1881 -> 942 bytes .../L2_Secret_door_128x64/frame_27.png | Bin 1902 -> 952 bytes .../L2_Secret_door_128x64/frame_28.png | Bin 1969 -> 960 bytes .../L2_Secret_door_128x64/frame_29.png | Bin 2094 -> 1023 bytes .../L2_Secret_door_128x64/frame_3.png | Bin 1599 -> 816 bytes .../L2_Secret_door_128x64/frame_30.png | Bin 2028 -> 987 bytes .../L2_Secret_door_128x64/frame_31.png | Bin 1922 -> 949 bytes .../L2_Secret_door_128x64/frame_32.png | Bin 1900 -> 933 bytes .../L2_Secret_door_128x64/frame_33.png | Bin 1938 -> 966 bytes .../L2_Secret_door_128x64/frame_34.png | Bin 1923 -> 947 bytes .../L2_Secret_door_128x64/frame_35.png | Bin 1913 -> 949 bytes .../L2_Secret_door_128x64/frame_36.png | Bin 1937 -> 955 bytes .../L2_Secret_door_128x64/frame_37.png | Bin 1944 -> 964 bytes .../L2_Secret_door_128x64/frame_38.png | Bin 1683 -> 829 bytes .../L2_Secret_door_128x64/frame_39.png | Bin 1662 -> 898 bytes .../L2_Secret_door_128x64/frame_4.png | Bin 1618 -> 815 bytes .../L2_Secret_door_128x64/frame_40.png | Bin 1725 -> 897 bytes .../L2_Secret_door_128x64/frame_41.png | Bin 1654 -> 882 bytes .../L2_Secret_door_128x64/frame_42.png | Bin 1495 -> 827 bytes .../L2_Secret_door_128x64/frame_43.png | Bin 1440 -> 816 bytes .../L2_Secret_door_128x64/frame_44.png | Bin 1445 -> 824 bytes .../L2_Secret_door_128x64/frame_45.png | Bin 1464 -> 841 bytes .../L2_Secret_door_128x64/frame_46.png | Bin 1446 -> 814 bytes .../L2_Secret_door_128x64/frame_47.png | Bin 1369 -> 773 bytes .../L2_Secret_door_128x64/frame_48.png | Bin 1529 -> 845 bytes .../L2_Secret_door_128x64/frame_49.png | Bin 1851 -> 996 bytes .../L2_Secret_door_128x64/frame_5.png | Bin 1625 -> 820 bytes .../L2_Secret_door_128x64/frame_50.png | Bin 2132 -> 1043 bytes .../L2_Secret_door_128x64/frame_51.png | Bin 2258 -> 1075 bytes .../L2_Secret_door_128x64/frame_52.png | Bin 1615 -> 809 bytes .../L2_Secret_door_128x64/frame_6.png | Bin 1591 -> 802 bytes .../L2_Secret_door_128x64/frame_7.png | Bin 1671 -> 830 bytes .../L2_Secret_door_128x64/frame_8.png | Bin 1612 -> 824 bytes .../L2_Secret_door_128x64/frame_9.png | Bin 1575 -> 818 bytes .../external/L2_Soldering_128x64/frame_0.png | Bin 1778 -> 738 bytes .../external/L2_Soldering_128x64/frame_1.png | Bin 1768 -> 738 bytes .../external/L2_Soldering_128x64/frame_10.png | Bin 1781 -> 744 bytes .../external/L2_Soldering_128x64/frame_2.png | Bin 1779 -> 738 bytes .../external/L2_Soldering_128x64/frame_3.png | Bin 1778 -> 741 bytes .../external/L2_Soldering_128x64/frame_4.png | Bin 1784 -> 738 bytes .../external/L2_Soldering_128x64/frame_5.png | Bin 1782 -> 745 bytes .../external/L2_Soldering_128x64/frame_6.png | Bin 1799 -> 748 bytes .../external/L2_Soldering_128x64/frame_7.png | Bin 1797 -> 748 bytes .../external/L2_Soldering_128x64/frame_8.png | Bin 1798 -> 747 bytes .../external/L2_Soldering_128x64/frame_9.png | Bin 1778 -> 739 bytes .../external/L2_Wake_up_128x64/frame_0.png | Bin 4779 -> 817 bytes .../external/L2_Wake_up_128x64/frame_1.png | Bin 4782 -> 825 bytes .../external/L2_Wake_up_128x64/frame_10.png | Bin 4835 -> 790 bytes .../external/L2_Wake_up_128x64/frame_11.png | Bin 4838 -> 809 bytes .../external/L2_Wake_up_128x64/frame_12.png | Bin 4775 -> 743 bytes .../external/L2_Wake_up_128x64/frame_13.png | Bin 4783 -> 719 bytes .../external/L2_Wake_up_128x64/frame_14.png | Bin 4722 -> 730 bytes .../external/L2_Wake_up_128x64/frame_15.png | Bin 4742 -> 755 bytes .../external/L2_Wake_up_128x64/frame_16.png | Bin 4639 -> 717 bytes .../external/L2_Wake_up_128x64/frame_17.png | Bin 3796 -> 204 bytes .../external/L2_Wake_up_128x64/frame_18.png | Bin 3834 -> 251 bytes .../external/L2_Wake_up_128x64/frame_19.png | Bin 4664 -> 789 bytes .../external/L2_Wake_up_128x64/frame_2.png | Bin 4785 -> 824 bytes .../external/L2_Wake_up_128x64/frame_20.png | Bin 4779 -> 838 bytes .../external/L2_Wake_up_128x64/frame_3.png | Bin 4793 -> 821 bytes .../external/L2_Wake_up_128x64/frame_4.png | Bin 4815 -> 833 bytes .../external/L2_Wake_up_128x64/frame_5.png | Bin 1743 -> 825 bytes .../external/L2_Wake_up_128x64/frame_6.png | Bin 1630 -> 775 bytes .../external/L2_Wake_up_128x64/frame_7.png | Bin 4722 -> 739 bytes .../external/L2_Wake_up_128x64/frame_8.png | Bin 4731 -> 728 bytes .../external/L2_Wake_up_128x64/frame_9.png | Bin 4656 -> 708 bytes .../L3_Freedom_2_dolphins_128x64/frame_0.png | Bin 1059 -> 593 bytes .../L3_Freedom_2_dolphins_128x64/frame_1.png | Bin 1114 -> 624 bytes .../L3_Freedom_2_dolphins_128x64/frame_10.png | Bin 1451 -> 769 bytes .../L3_Freedom_2_dolphins_128x64/frame_11.png | Bin 1300 -> 713 bytes .../L3_Freedom_2_dolphins_128x64/frame_12.png | Bin 1666 -> 857 bytes .../L3_Freedom_2_dolphins_128x64/frame_13.png | Bin 1946 -> 947 bytes .../L3_Freedom_2_dolphins_128x64/frame_14.png | Bin 1929 -> 949 bytes .../L3_Freedom_2_dolphins_128x64/frame_15.png | Bin 1929 -> 955 bytes .../L3_Freedom_2_dolphins_128x64/frame_16.png | Bin 1850 -> 938 bytes .../L3_Freedom_2_dolphins_128x64/frame_17.png | Bin 1872 -> 930 bytes .../L3_Freedom_2_dolphins_128x64/frame_18.png | Bin 1715 -> 881 bytes .../L3_Freedom_2_dolphins_128x64/frame_19.png | Bin 2446 -> 1122 bytes .../L3_Freedom_2_dolphins_128x64/frame_2.png | Bin 1592 -> 802 bytes .../L3_Freedom_2_dolphins_128x64/frame_20.png | Bin 2383 -> 1091 bytes .../L3_Freedom_2_dolphins_128x64/frame_21.png | Bin 2399 -> 1090 bytes .../L3_Freedom_2_dolphins_128x64/frame_22.png | Bin 2396 -> 1108 bytes .../L3_Freedom_2_dolphins_128x64/frame_23.png | Bin 2398 -> 1094 bytes .../L3_Freedom_2_dolphins_128x64/frame_24.png | Bin 2394 -> 1107 bytes .../L3_Freedom_2_dolphins_128x64/frame_25.png | Bin 2418 -> 1111 bytes .../L3_Freedom_2_dolphins_128x64/frame_26.png | Bin 2434 -> 1105 bytes .../L3_Freedom_2_dolphins_128x64/frame_27.png | Bin 2434 -> 1106 bytes .../L3_Freedom_2_dolphins_128x64/frame_28.png | Bin 1835 -> 967 bytes .../L3_Freedom_2_dolphins_128x64/frame_29.png | Bin 1852 -> 936 bytes .../L3_Freedom_2_dolphins_128x64/frame_3.png | Bin 1553 -> 814 bytes .../L3_Freedom_2_dolphins_128x64/frame_30.png | Bin 1829 -> 953 bytes .../L3_Freedom_2_dolphins_128x64/frame_31.png | Bin 1882 -> 961 bytes .../L3_Freedom_2_dolphins_128x64/frame_32.png | Bin 1888 -> 966 bytes .../L3_Freedom_2_dolphins_128x64/frame_33.png | Bin 1878 -> 955 bytes .../L3_Freedom_2_dolphins_128x64/frame_34.png | Bin 2056 -> 1001 bytes .../L3_Freedom_2_dolphins_128x64/frame_35.png | Bin 2048 -> 1026 bytes .../L3_Freedom_2_dolphins_128x64/frame_36.png | Bin 2042 -> 1006 bytes .../L3_Freedom_2_dolphins_128x64/frame_37.png | Bin 2062 -> 1020 bytes .../L3_Freedom_2_dolphins_128x64/frame_38.png | Bin 2073 -> 1007 bytes .../L3_Freedom_2_dolphins_128x64/frame_39.png | Bin 2000 -> 990 bytes .../L3_Freedom_2_dolphins_128x64/frame_4.png | Bin 1551 -> 805 bytes .../L3_Freedom_2_dolphins_128x64/frame_40.png | Bin 2127 -> 1028 bytes .../L3_Freedom_2_dolphins_128x64/frame_41.png | Bin 1602 -> 789 bytes .../L3_Freedom_2_dolphins_128x64/frame_42.png | Bin 1463 -> 750 bytes .../L3_Freedom_2_dolphins_128x64/frame_43.png | Bin 1556 -> 795 bytes .../L3_Freedom_2_dolphins_128x64/frame_44.png | Bin 1850 -> 931 bytes .../L3_Freedom_2_dolphins_128x64/frame_45.png | Bin 2130 -> 1052 bytes .../L3_Freedom_2_dolphins_128x64/frame_46.png | Bin 2139 -> 1061 bytes .../L3_Freedom_2_dolphins_128x64/frame_47.png | Bin 2155 -> 1058 bytes .../L3_Freedom_2_dolphins_128x64/frame_48.png | Bin 2179 -> 1063 bytes .../L3_Freedom_2_dolphins_128x64/frame_49.png | Bin 2132 -> 1063 bytes .../L3_Freedom_2_dolphins_128x64/frame_5.png | Bin 1490 -> 781 bytes .../L3_Freedom_2_dolphins_128x64/frame_50.png | Bin 2191 -> 1065 bytes .../L3_Freedom_2_dolphins_128x64/frame_51.png | Bin 2165 -> 1065 bytes .../L3_Freedom_2_dolphins_128x64/frame_52.png | Bin 2205 -> 1069 bytes .../L3_Freedom_2_dolphins_128x64/frame_53.png | Bin 2151 -> 1058 bytes .../L3_Freedom_2_dolphins_128x64/frame_54.png | Bin 2146 -> 1058 bytes .../L3_Freedom_2_dolphins_128x64/frame_55.png | Bin 1952 -> 1001 bytes .../L3_Freedom_2_dolphins_128x64/frame_56.png | Bin 1878 -> 958 bytes .../L3_Freedom_2_dolphins_128x64/frame_6.png | Bin 1592 -> 788 bytes .../L3_Freedom_2_dolphins_128x64/frame_7.png | Bin 1537 -> 792 bytes .../L3_Freedom_2_dolphins_128x64/frame_8.png | Bin 1460 -> 778 bytes .../L3_Freedom_2_dolphins_128x64/frame_9.png | Bin 1490 -> 774 bytes .../external/L3_Furippa3_128x64/frame_0.png | Bin 1442 -> 476 bytes .../external/L3_Furippa3_128x64/frame_1.png | Bin 1478 -> 504 bytes .../external/L3_Furippa3_128x64/frame_10.png | Bin 1609 -> 605 bytes .../external/L3_Furippa3_128x64/frame_11.png | Bin 1826 -> 742 bytes .../external/L3_Furippa3_128x64/frame_12.png | Bin 1607 -> 531 bytes .../external/L3_Furippa3_128x64/frame_13.png | Bin 1679 -> 594 bytes .../external/L3_Furippa3_128x64/frame_14.png | Bin 1714 -> 652 bytes .../external/L3_Furippa3_128x64/frame_15.png | Bin 1805 -> 733 bytes .../external/L3_Furippa3_128x64/frame_16.png | Bin 1575 -> 581 bytes .../external/L3_Furippa3_128x64/frame_17.png | Bin 1560 -> 596 bytes .../external/L3_Furippa3_128x64/frame_18.png | Bin 1492 -> 548 bytes .../external/L3_Furippa3_128x64/frame_2.png | Bin 1472 -> 501 bytes .../external/L3_Furippa3_128x64/frame_3.png | Bin 1466 -> 497 bytes .../external/L3_Furippa3_128x64/frame_4.png | Bin 1513 -> 526 bytes .../external/L3_Furippa3_128x64/frame_5.png | Bin 1519 -> 533 bytes .../external/L3_Furippa3_128x64/frame_6.png | Bin 1526 -> 548 bytes .../external/L3_Furippa3_128x64/frame_7.png | Bin 1442 -> 476 bytes .../external/L3_Furippa3_128x64/frame_8.png | Bin 1456 -> 470 bytes .../external/L3_Furippa3_128x64/frame_9.png | Bin 1477 -> 507 bytes .../L3_Hijack_radio_128x64/frame_0.png | Bin 1611 -> 587 bytes .../L3_Hijack_radio_128x64/frame_1.png | Bin 1619 -> 596 bytes .../L3_Hijack_radio_128x64/frame_10.png | Bin 1642 -> 612 bytes .../L3_Hijack_radio_128x64/frame_11.png | Bin 1660 -> 627 bytes .../L3_Hijack_radio_128x64/frame_12.png | Bin 1627 -> 600 bytes .../L3_Hijack_radio_128x64/frame_13.png | Bin 1674 -> 635 bytes .../L3_Hijack_radio_128x64/frame_2.png | Bin 1615 -> 594 bytes .../L3_Hijack_radio_128x64/frame_3.png | Bin 1622 -> 591 bytes .../L3_Hijack_radio_128x64/frame_4.png | Bin 1667 -> 625 bytes .../L3_Hijack_radio_128x64/frame_5.png | Bin 1672 -> 629 bytes .../L3_Hijack_radio_128x64/frame_6.png | Bin 1609 -> 589 bytes .../L3_Hijack_radio_128x64/frame_7.png | Bin 1755 -> 707 bytes .../L3_Hijack_radio_128x64/frame_8.png | Bin 1754 -> 719 bytes .../L3_Hijack_radio_128x64/frame_9.png | Bin 1706 -> 658 bytes .../L3_Intruder_alert_128x64/frame_0.png | Bin 1788 -> 873 bytes .../L3_Intruder_alert_128x64/frame_1.png | Bin 1811 -> 874 bytes .../L3_Intruder_alert_128x64/frame_10.png | Bin 1681 -> 824 bytes .../L3_Intruder_alert_128x64/frame_11.png | Bin 1621 -> 819 bytes .../L3_Intruder_alert_128x64/frame_12.png | Bin 1701 -> 831 bytes .../L3_Intruder_alert_128x64/frame_13.png | Bin 1764 -> 853 bytes .../L3_Intruder_alert_128x64/frame_14.png | Bin 1417 -> 742 bytes .../L3_Intruder_alert_128x64/frame_15.png | Bin 1392 -> 739 bytes .../L3_Intruder_alert_128x64/frame_16.png | Bin 1541 -> 780 bytes .../L3_Intruder_alert_128x64/frame_17.png | Bin 1414 -> 753 bytes .../L3_Intruder_alert_128x64/frame_18.png | Bin 1574 -> 800 bytes .../L3_Intruder_alert_128x64/frame_19.png | Bin 1315 -> 668 bytes .../L3_Intruder_alert_128x64/frame_2.png | Bin 1758 -> 878 bytes .../L3_Intruder_alert_128x64/frame_20.png | Bin 1320 -> 663 bytes .../L3_Intruder_alert_128x64/frame_21.png | Bin 1363 -> 686 bytes .../L3_Intruder_alert_128x64/frame_22.png | Bin 1318 -> 676 bytes .../L3_Intruder_alert_128x64/frame_23.png | Bin 1412 -> 683 bytes .../L3_Intruder_alert_128x64/frame_24.png | Bin 1530 -> 748 bytes .../L3_Intruder_alert_128x64/frame_25.png | Bin 1454 -> 692 bytes .../L3_Intruder_alert_128x64/frame_26.png | Bin 1477 -> 866 bytes .../L3_Intruder_alert_128x64/frame_27.png | Bin 1520 -> 872 bytes .../L3_Intruder_alert_128x64/frame_28.png | Bin 1486 -> 816 bytes .../L3_Intruder_alert_128x64/frame_29.png | Bin 1511 -> 859 bytes .../L3_Intruder_alert_128x64/frame_3.png | Bin 1707 -> 868 bytes .../L3_Intruder_alert_128x64/frame_30.png | Bin 1550 -> 764 bytes .../L3_Intruder_alert_128x64/frame_31.png | Bin 1497 -> 746 bytes .../L3_Intruder_alert_128x64/frame_32.png | Bin 1437 -> 696 bytes .../L3_Intruder_alert_128x64/frame_33.png | Bin 1316 -> 654 bytes .../L3_Intruder_alert_128x64/frame_34.png | Bin 1346 -> 669 bytes .../L3_Intruder_alert_128x64/frame_35.png | Bin 1289 -> 664 bytes .../L3_Intruder_alert_128x64/frame_36.png | Bin 1293 -> 644 bytes .../L3_Intruder_alert_128x64/frame_37.png | Bin 904 -> 443 bytes .../L3_Intruder_alert_128x64/frame_38.png | Bin 956 -> 468 bytes .../L3_Intruder_alert_128x64/frame_39.png | Bin 1251 -> 600 bytes .../L3_Intruder_alert_128x64/frame_4.png | Bin 1766 -> 872 bytes .../L3_Intruder_alert_128x64/frame_40.png | Bin 1412 -> 706 bytes .../L3_Intruder_alert_128x64/frame_41.png | Bin 1496 -> 757 bytes .../L3_Intruder_alert_128x64/frame_42.png | Bin 1866 -> 890 bytes .../L3_Intruder_alert_128x64/frame_43.png | Bin 1494 -> 745 bytes .../L3_Intruder_alert_128x64/frame_44.png | Bin 963 -> 519 bytes .../L3_Intruder_alert_128x64/frame_45.png | Bin 1397 -> 691 bytes .../L3_Intruder_alert_128x64/frame_46.png | Bin 1109 -> 589 bytes .../L3_Intruder_alert_128x64/frame_47.png | Bin 1113 -> 592 bytes .../L3_Intruder_alert_128x64/frame_48.png | Bin 1117 -> 583 bytes .../L3_Intruder_alert_128x64/frame_49.png | Bin 1267 -> 644 bytes .../L3_Intruder_alert_128x64/frame_5.png | Bin 1674 -> 812 bytes .../L3_Intruder_alert_128x64/frame_50.png | Bin 1250 -> 647 bytes .../L3_Intruder_alert_128x64/frame_51.png | Bin 1270 -> 648 bytes .../L3_Intruder_alert_128x64/frame_52.png | Bin 1566 -> 807 bytes .../L3_Intruder_alert_128x64/frame_53.png | Bin 1603 -> 801 bytes .../L3_Intruder_alert_128x64/frame_54.png | Bin 1660 -> 829 bytes .../L3_Intruder_alert_128x64/frame_55.png | Bin 1644 -> 828 bytes .../L3_Intruder_alert_128x64/frame_6.png | Bin 1683 -> 812 bytes .../L3_Intruder_alert_128x64/frame_7.png | Bin 1676 -> 799 bytes .../L3_Intruder_alert_128x64/frame_8.png | Bin 1680 -> 799 bytes .../L3_Intruder_alert_128x64/frame_9.png | Bin 1653 -> 797 bytes .../L3_Lab_research_128x54/frame_0.png | Bin 1687 -> 654 bytes .../L3_Lab_research_128x54/frame_1.png | Bin 1700 -> 660 bytes .../L3_Lab_research_128x54/frame_10.png | Bin 1640 -> 612 bytes .../L3_Lab_research_128x54/frame_11.png | Bin 1656 -> 608 bytes .../L3_Lab_research_128x54/frame_12.png | Bin 1639 -> 600 bytes .../L3_Lab_research_128x54/frame_13.png | Bin 1689 -> 646 bytes .../L3_Lab_research_128x54/frame_2.png | Bin 1707 -> 652 bytes .../L3_Lab_research_128x54/frame_3.png | Bin 1680 -> 651 bytes .../L3_Lab_research_128x54/frame_4.png | Bin 1691 -> 655 bytes .../L3_Lab_research_128x54/frame_5.png | Bin 1708 -> 655 bytes .../L3_Lab_research_128x54/frame_6.png | Bin 1689 -> 646 bytes .../L3_Lab_research_128x54/frame_7.png | Bin 1655 -> 619 bytes .../L3_Lab_research_128x54/frame_8.png | Bin 1645 -> 602 bytes .../L3_Lab_research_128x54/frame_9.png | Bin 1655 -> 607 bytes .../internal/L1_BadBattery_128x47/frame_0.png | Bin 1384 -> 405 bytes .../internal/L1_BadBattery_128x47/frame_1.png | Bin 1390 -> 407 bytes .../internal/L1_NoSd_128x49/frame_0.png | Bin 1411 -> 416 bytes .../internal/L1_NoSd_128x49/frame_1.png | Bin 1410 -> 410 bytes .../internal/L1_NoSd_128x49/frame_2.png | Bin 1416 -> 418 bytes .../internal/L1_NoSd_128x49/frame_3.png | Bin 1415 -> 420 bytes .../internal/L1_NoSd_128x49/frame_4.png | Bin 1401 -> 407 bytes .../internal/L1_NoSd_128x49/frame_5.png | Bin 1412 -> 413 bytes .../dolphin/internal/L1_Tv_128x47/frame_0.png | Bin 602 -> 510 bytes .../dolphin/internal/L1_Tv_128x47/frame_1.png | Bin 605 -> 519 bytes .../dolphin/internal/L1_Tv_128x47/frame_2.png | Bin 590 -> 509 bytes .../dolphin/internal/L1_Tv_128x47/frame_3.png | Bin 598 -> 515 bytes .../dolphin/internal/L1_Tv_128x47/frame_4.png | Bin 601 -> 511 bytes .../dolphin/internal/L1_Tv_128x47/frame_5.png | Bin 598 -> 519 bytes .../dolphin/internal/L1_Tv_128x47/frame_6.png | Bin 585 -> 502 bytes .../dolphin/internal/L1_Tv_128x47/frame_7.png | Bin 596 -> 523 bytes assets/icons/About/Certification1_103x56.png | Bin 3038 -> 488 bytes assets/icons/About/Certification2_46x33.png | Bin 229 -> 224 bytes .../About/CertificationChina0_121x41.png | Bin 5314 -> 448 bytes .../About/CertificationChina1_124x47.png | Bin 429 -> 420 bytes .../icons/About/CertificationMexico_98x41.png | Bin 5219 -> 330 bytes .../icons/About/CertificationTaiwan_33x32.png | Bin 4835 -> 205 bytes .../Animations/Levelup1_128x64/frame_00.png | Bin 1326 -> 337 bytes .../Animations/Levelup1_128x64/frame_01.png | Bin 1597 -> 576 bytes .../Animations/Levelup1_128x64/frame_02.png | Bin 1754 -> 725 bytes .../Animations/Levelup1_128x64/frame_03.png | Bin 1828 -> 870 bytes .../Animations/Levelup1_128x64/frame_04.png | Bin 1686 -> 731 bytes .../Animations/Levelup1_128x64/frame_05.png | Bin 1672 -> 722 bytes .../Animations/Levelup1_128x64/frame_06.png | Bin 1659 -> 599 bytes .../Animations/Levelup1_128x64/frame_07.png | Bin 1540 -> 522 bytes .../Animations/Levelup1_128x64/frame_08.png | Bin 1557 -> 527 bytes .../Animations/Levelup1_128x64/frame_09.png | Bin 1551 -> 528 bytes .../Animations/Levelup1_128x64/frame_10.png | Bin 1604 -> 529 bytes .../Animations/Levelup2_128x64/frame_00.png | Bin 1368 -> 362 bytes .../Animations/Levelup2_128x64/frame_01.png | Bin 1632 -> 593 bytes .../Animations/Levelup2_128x64/frame_02.png | Bin 1812 -> 752 bytes .../Animations/Levelup2_128x64/frame_03.png | Bin 1860 -> 894 bytes .../Animations/Levelup2_128x64/frame_04.png | Bin 1700 -> 737 bytes .../Animations/Levelup2_128x64/frame_05.png | Bin 1725 -> 741 bytes .../Animations/Levelup2_128x64/frame_06.png | Bin 1684 -> 613 bytes .../Animations/Levelup2_128x64/frame_07.png | Bin 1590 -> 549 bytes .../Animations/Levelup2_128x64/frame_08.png | Bin 1598 -> 547 bytes .../Animations/Levelup2_128x64/frame_09.png | Bin 1604 -> 573 bytes .../Animations/Levelup2_128x64/frame_10.png | Bin 1612 -> 576 bytes assets/icons/Archive/125_10px.png | Bin 308 -> 95 bytes assets/icons/Archive/Nfc_10px.png | Bin 304 -> 96 bytes assets/icons/Archive/back_10px.png | Bin 154 -> 96 bytes assets/icons/Archive/badusb_10px.png | Bin 576 -> 96 bytes assets/icons/Archive/dir_10px.png | Bin 311 -> 90 bytes assets/icons/Archive/ibutt_10px.png | Bin 304 -> 96 bytes assets/icons/Archive/ir_10px.png | Bin 305 -> 96 bytes assets/icons/Archive/js_script_10px.png | Bin 3635 -> 88 bytes assets/icons/Archive/keyboard_10px.png | Bin 147 -> 96 bytes assets/icons/Archive/loading_10px.png | Bin 4349 -> 95 bytes assets/icons/Archive/music_10px.png | Bin 142 -> 96 bytes assets/icons/Archive/sub1_10px.png | Bin 299 -> 95 bytes assets/icons/Archive/u2f_10px.png | Bin 583 -> 98 bytes assets/icons/Archive/unknown_10px.png | Bin 312 -> 95 bytes assets/icons/Archive/update_10px.png | Bin 156 -> 95 bytes .../icons/BLE/BLE_HID/Ble_connected_15x15.png | Bin 3634 -> 111 bytes .../BLE/BLE_HID/Ble_disconnected_15x15.png | Bin 3632 -> 113 bytes assets/icons/BLE/BLE_HID/Button_18x18.png | Bin 3609 -> 96 bytes assets/icons/BLE/BLE_HID/Circles_47x47.png | Bin 3712 -> 222 bytes .../icons/BLE/BLE_HID/Left_mouse_icon_9x9.png | Bin 3622 -> 92 bytes assets/icons/BLE/BLE_HID/Ok_btn_9x9.png | Bin 3605 -> 92 bytes .../BLE/BLE_HID/Ok_btn_pressed_13x13.png | Bin 3625 -> 95 bytes .../BLE/BLE_HID/Pressed_Button_13x13.png | Bin 3606 -> 89 bytes .../BLE/BLE_HID/Right_mouse_icon_9x9.png | Bin 3622 -> 92 bytes assets/icons/BLE/BLE_HID/Space_65x18.png | Bin 3619 -> 112 bytes assets/icons/BLE/BLE_HID/Voldwn_6x6.png | Bin 3593 -> 77 bytes assets/icons/BLE/BLE_HID/Volup_8x6.png | Bin 3595 -> 77 bytes assets/icons/BLE/BLE_Pairing_128x64.png | Bin 2307 -> 564 bytes assets/icons/BadUsb/Clock_18x18.png | Bin 1083 -> 132 bytes assets/icons/BadUsb/Error_18x18.png | Bin 1083 -> 125 bytes assets/icons/BadUsb/EviSmile1_18x21.png | Bin 3645 -> 128 bytes assets/icons/BadUsb/EviSmile2_18x21.png | Bin 3649 -> 130 bytes assets/icons/BadUsb/EviWaiting1_18x21.png | Bin 13020 -> 123 bytes assets/icons/BadUsb/EviWaiting2_18x21.png | Bin 12913 -> 120 bytes assets/icons/BadUsb/Percent_10x14.png | Bin 3624 -> 108 bytes assets/icons/BadUsb/Smile_18x18.png | Bin 1080 -> 123 bytes assets/icons/BadUsb/UsbTree_48x22.png | Bin 3653 -> 151 bytes .../icons/Common/ActiveConnection_50x64.png | Bin 3842 -> 357 bytes assets/icons/Common/ButtonCenter_7x7.png | Bin 1440 -> 79 bytes assets/icons/Common/ButtonDown_7x4.png | Bin 102 -> 73 bytes assets/icons/Common/ButtonLeftSmall_3x5.png | Bin 1741 -> 75 bytes assets/icons/Common/ButtonLeft_4x7.png | Bin 1415 -> 79 bytes assets/icons/Common/ButtonRightSmall_3x5.png | Bin 1738 -> 75 bytes assets/icons/Common/ButtonRight_4x7.png | Bin 1839 -> 79 bytes assets/icons/Common/ButtonUp_7x4.png | Bin 102 -> 73 bytes assets/icons/Common/DFU_128x50.png | Bin 3177 -> 617 bytes assets/icons/Common/Hashmark_7x7.png | Bin 957 -> 79 bytes assets/icons/Common/Loading_24/frame_01.png | Bin 3650 -> 138 bytes assets/icons/Common/Loading_24/frame_02.png | Bin 3649 -> 139 bytes assets/icons/Common/Loading_24/frame_03.png | Bin 3649 -> 137 bytes assets/icons/Common/Loading_24/frame_04.png | Bin 3645 -> 138 bytes assets/icons/Common/Loading_24/frame_05.png | Bin 3654 -> 150 bytes assets/icons/Common/Loading_24/frame_06.png | Bin 3650 -> 132 bytes assets/icons/Common/Loading_24/frame_07.png | Bin 3655 -> 143 bytes .../Common/More_data_placeholder_5x7.png | Bin 92 -> 72 bytes .../Common/Round_loader_8x8/frame_01.png | Bin 7324 -> 81 bytes .../Common/Round_loader_8x8/frame_02.png | Bin 3606 -> 81 bytes .../Common/Round_loader_8x8/frame_03.png | Bin 3603 -> 81 bytes .../Common/Round_loader_8x8/frame_04.png | Bin 3605 -> 81 bytes .../Common/Round_loader_8x8/frame_05.png | Bin 3598 -> 75 bytes assets/icons/Common/Warning_30x23.png | Bin 347 -> 127 bytes assets/icons/Common/arrow_nano_down.png | Bin 2311 -> 69 bytes assets/icons/Common/arrow_nano_up.png | Bin 949 -> 69 bytes assets/icons/Dolphin/DolphinDone_80x58.png | Bin 1664 -> 448 bytes assets/icons/Dolphin/DolphinMafia_119x62.png | Bin 1280 -> 668 bytes .../Dolphin/DolphinReadingSuccess_59x63.png | Bin 1177 -> 368 bytes assets/icons/Dolphin/DolphinSaved_92x58.png | Bin 901 -> 475 bytes assets/icons/Dolphin/DolphinSuccess_91x55.png | Bin 930 -> 515 bytes assets/icons/Dolphin/DolphinWait_59x54.png | Bin 1539 -> 385 bytes .../Dolphin/WarningDolphinFlip_45x42.png | Bin 1437 -> 262 bytes assets/icons/Dolphin/WarningDolphin_45x42.png | Bin 1139 -> 258 bytes assets/icons/ErasePin/Erase_pin_128x64.png | Bin 5220 -> 651 bytes assets/icons/GPIO/ArrowUpEmpty_14x15.png | Bin 3616 -> 101 bytes assets/icons/GPIO/ArrowUpFilled_14x15.png | Bin 3628 -> 113 bytes .../icons/Infrared/InfraredArrowDown_4x8.png | Bin 3589 -> 73 bytes assets/icons/Infrared/InfraredArrowUp_4x8.png | Bin 3592 -> 73 bytes .../Infrared/InfraredLearnShort_128x31.png | Bin 3952 -> 368 bytes assets/icons/Infrared/back_btn_10x8.png | Bin 141 -> 90 bytes assets/icons/Infrared/celsius_24x23.png | Bin 257 -> 154 bytes assets/icons/Infrared/celsius_hover_24x23.png | Bin 204 -> 137 bytes assets/icons/Infrared/ch_down_24x21.png | Bin 2931 -> 142 bytes assets/icons/Infrared/ch_down_hover_24x21.png | Bin 2903 -> 126 bytes assets/icons/Infrared/ch_text_31x34.png | Bin 2925 -> 129 bytes assets/icons/Infrared/ch_up_24x21.png | Bin 2913 -> 135 bytes assets/icons/Infrared/ch_up_hover_24x21.png | Bin 2898 -> 128 bytes assets/icons/Infrared/cool_30x51.png | Bin 3742 -> 163 bytes assets/icons/Infrared/dry_19x20.png | Bin 996 -> 122 bytes assets/icons/Infrared/dry_hover_19x20.png | Bin 978 -> 112 bytes assets/icons/Infrared/dry_text_15x5.png | Bin 968 -> 80 bytes assets/icons/Infrared/fahren_24x23.png | Bin 258 -> 151 bytes assets/icons/Infrared/fahren_hover_24x23.png | Bin 205 -> 135 bytes assets/icons/Infrared/heat_30x51.png | Bin 3747 -> 167 bytes assets/icons/Infrared/hourglass0_24x24.png | Bin 231 -> 138 bytes assets/icons/Infrared/hourglass1_24x24.png | Bin 246 -> 143 bytes assets/icons/Infrared/hourglass2_24x24.png | Bin 237 -> 137 bytes assets/icons/Infrared/hourglass3_24x24.png | Bin 223 -> 136 bytes assets/icons/Infrared/hourglass4_24x24.png | Bin 239 -> 144 bytes assets/icons/Infrared/hourglass5_24x24.png | Bin 218 -> 136 bytes assets/icons/Infrared/hourglass6_24x24.png | Bin 238 -> 145 bytes assets/icons/Infrared/max_24x23.png | Bin 224 -> 146 bytes assets/icons/Infrared/max_hover_24x23.png | Bin 208 -> 134 bytes assets/icons/Infrared/mute_19x20.png | Bin 2918 -> 126 bytes assets/icons/Infrared/mute_hover_19x20.png | Bin 2877 -> 121 bytes assets/icons/Infrared/mute_text_19x5.png | Bin 2849 -> 85 bytes assets/icons/Infrared/next_19x20.png | Bin 2894 -> 124 bytes assets/icons/Infrared/next_hover_19x20.png | Bin 2873 -> 121 bytes assets/icons/Infrared/next_text_19x6.png | Bin 2852 -> 85 bytes assets/icons/Infrared/off_19x20.png | Bin 193 -> 121 bytes assets/icons/Infrared/off_hover_19x20.png | Bin 160 -> 112 bytes assets/icons/Infrared/off_text_12x5.png | Bin 130 -> 80 bytes assets/icons/Infrared/pause_19x20.png | Bin 2861 -> 105 bytes assets/icons/Infrared/pause_hover_19x20.png | Bin 2842 -> 92 bytes assets/icons/Infrared/pause_text_23x5.png | Bin 2856 -> 85 bytes assets/icons/Infrared/play_19x20.png | Bin 2894 -> 122 bytes assets/icons/Infrared/play_hover_19x20.png | Bin 2869 -> 117 bytes assets/icons/Infrared/play_text_19x5.png | Bin 2850 -> 86 bytes assets/icons/Infrared/power_19x20.png | Bin 1006 -> 120 bytes assets/icons/Infrared/power_hover_19x20.png | Bin 996 -> 115 bytes assets/icons/Infrared/power_text_24x5.png | Bin 981 -> 85 bytes assets/icons/Infrared/prev_19x20.png | Bin 2893 -> 123 bytes assets/icons/Infrared/prev_hover_19x20.png | Bin 2877 -> 116 bytes assets/icons/Infrared/prev_text_19x5.png | Bin 2844 -> 85 bytes assets/icons/Infrared/vol_ac_text_30x30.png | Bin 2915 -> 134 bytes assets/icons/Infrared/vol_tv_text_29x34.png | Bin 2920 -> 133 bytes assets/icons/Infrared/voldown_24x21.png | Bin 2908 -> 132 bytes assets/icons/Infrared/voldown_hover_24x21.png | Bin 2884 -> 112 bytes assets/icons/Infrared/volup_24x21.png | Bin 2910 -> 131 bytes assets/icons/Infrared/volup_hover_24x21.png | Bin 2895 -> 123 bytes assets/icons/Interface/DoorLeft_70x55.png | Bin 564 -> 390 bytes assets/icons/Interface/DoorRight_70x55.png | Bin 570 -> 377 bytes assets/icons/Interface/SmallArrowDown_3x5.png | Bin 3592 -> 71 bytes assets/icons/Interface/SmallArrowDown_4x7.png | Bin 8340 -> 73 bytes assets/icons/Interface/SmallArrowUp_3x5.png | Bin 7976 -> 71 bytes assets/icons/Interface/SmallArrowUp_4x7.png | Bin 8552 -> 73 bytes .../Keyboard/KeyBackspaceSelected_16x9.png | Bin 1812 -> 90 bytes assets/icons/Keyboard/KeyBackspace_16x9.png | Bin 1829 -> 92 bytes .../icons/Keyboard/KeySaveSelected_24x11.png | Bin 1853 -> 94 bytes assets/icons/Keyboard/KeySave_24x11.png | Bin 1863 -> 110 bytes assets/icons/Loader/err_01.png | Bin 394 -> 193 bytes assets/icons/Loader/err_02.png | Bin 397 -> 193 bytes assets/icons/Loader/err_03.png | Bin 385 -> 193 bytes assets/icons/Loader/err_04.png | Bin 385 -> 193 bytes assets/icons/Loader/err_05.png | Bin 393 -> 193 bytes assets/icons/Loader/err_06.png | Bin 398 -> 193 bytes assets/icons/Loader/err_07.png | Bin 401 -> 193 bytes assets/icons/Loader/err_09.png | Bin 394 -> 193 bytes assets/icons/MainMenu/125khz_14/frame_01.png | Bin 105 -> 108 bytes assets/icons/MainMenu/125khz_14/frame_02.png | Bin 105 -> 108 bytes assets/icons/MainMenu/125khz_14/frame_03.png | Bin 97 -> 102 bytes assets/icons/MainMenu/125khz_14/frame_04.png | Bin 103 -> 108 bytes assets/icons/MainMenu/BadUsb_14/frame_01.png | Bin 992 -> 107 bytes assets/icons/MainMenu/BadUsb_14/frame_02.png | Bin 1002 -> 108 bytes assets/icons/MainMenu/BadUsb_14/frame_03.png | Bin 1004 -> 108 bytes assets/icons/MainMenu/BadUsb_14/frame_04.png | Bin 1011 -> 108 bytes assets/icons/MainMenu/BadUsb_14/frame_05.png | Bin 1004 -> 108 bytes assets/icons/MainMenu/BadUsb_14/frame_06.png | Bin 999 -> 104 bytes assets/icons/MainMenu/BadUsb_14/frame_07.png | Bin 1004 -> 108 bytes assets/icons/MainMenu/BadUsb_14/frame_08.png | Bin 1011 -> 108 bytes assets/icons/MainMenu/BadUsb_14/frame_09.png | Bin 1004 -> 108 bytes assets/icons/MainMenu/BadUsb_14/frame_10.png | Bin 1002 -> 108 bytes assets/icons/MainMenu/BadUsb_14/frame_11.png | Bin 992 -> 107 bytes assets/icons/MainMenu/Debug_14/frame_01.png | Bin 3704 -> 110 bytes assets/icons/MainMenu/Debug_14/frame_02.png | Bin 3713 -> 110 bytes assets/icons/MainMenu/Debug_14/frame_03.png | Bin 3716 -> 110 bytes assets/icons/MainMenu/Debug_14/frame_04.png | Bin 3717 -> 108 bytes .../MainMenu/FileManager_14/frame_01.png | Bin 102 -> 108 bytes .../MainMenu/FileManager_14/frame_02.png | Bin 103 -> 108 bytes .../MainMenu/FileManager_14/frame_03.png | Bin 97 -> 103 bytes .../MainMenu/FileManager_14/frame_04.png | Bin 97 -> 102 bytes .../MainMenu/FileManager_14/frame_05.png | Bin 97 -> 102 bytes .../MainMenu/FileManager_14/frame_06.png | Bin 85 -> 89 bytes .../MainMenu/FileManager_14/frame_07.png | Bin 97 -> 102 bytes .../MainMenu/FileManager_14/frame_08.png | Bin 97 -> 102 bytes .../MainMenu/FileManager_14/frame_09.png | Bin 97 -> 103 bytes .../MainMenu/FileManager_14/frame_10.png | Bin 103 -> 108 bytes assets/icons/MainMenu/GPIO_14/frame_01.png | Bin 90 -> 98 bytes assets/icons/MainMenu/GPIO_14/frame_02.png | Bin 85 -> 97 bytes assets/icons/MainMenu/GPIO_14/frame_03.png | Bin 84 -> 93 bytes assets/icons/MainMenu/GPIO_14/frame_04.png | Bin 83 -> 90 bytes assets/icons/MainMenu/GPIO_14/frame_05.png | Bin 79 -> 84 bytes assets/icons/MainMenu/GPIO_14/frame_06.png | Bin 83 -> 91 bytes assets/icons/MainMenu/GPIO_14/frame_07.png | Bin 83 -> 90 bytes assets/icons/MainMenu/GPIO_14/frame_08.png | Bin 85 -> 96 bytes .../icons/MainMenu/Infrared_14/frame_01.png | Bin 98 -> 110 bytes .../icons/MainMenu/Infrared_14/frame_02.png | Bin 95 -> 104 bytes .../icons/MainMenu/Infrared_14/frame_03.png | Bin 91 -> 98 bytes .../icons/MainMenu/Infrared_14/frame_04.png | Bin 83 -> 88 bytes .../icons/MainMenu/Infrared_14/frame_05.png | Bin 83 -> 93 bytes .../icons/MainMenu/Infrared_14/frame_06.png | Bin 91 -> 106 bytes assets/icons/MainMenu/NFC_14/frame_01.png | Bin 104 -> 108 bytes assets/icons/MainMenu/NFC_14/frame_02.png | Bin 98 -> 105 bytes assets/icons/MainMenu/NFC_14/frame_03.png | Bin 92 -> 93 bytes assets/icons/MainMenu/NFC_14/frame_04.png | Bin 95 -> 104 bytes assets/icons/MainMenu/Plugins_14/frame_01.png | Bin 106 -> 108 bytes assets/icons/MainMenu/Plugins_14/frame_02.png | Bin 106 -> 110 bytes assets/icons/MainMenu/Plugins_14/frame_03.png | Bin 104 -> 110 bytes assets/icons/MainMenu/Plugins_14/frame_04.png | Bin 110 -> 110 bytes assets/icons/MainMenu/Plugins_14/frame_05.png | Bin 105 -> 110 bytes assets/icons/MainMenu/Plugins_14/frame_06.png | Bin 107 -> 108 bytes assets/icons/MainMenu/Plugins_14/frame_07.png | Bin 105 -> 108 bytes assets/icons/MainMenu/Plugins_14/frame_08.png | Bin 105 -> 110 bytes assets/icons/MainMenu/Plugins_14/frame_09.png | Bin 104 -> 110 bytes .../icons/MainMenu/Settings_14/frame_01.png | Bin 110 -> 110 bytes .../icons/MainMenu/Settings_14/frame_02.png | Bin 110 -> 108 bytes .../icons/MainMenu/Settings_14/frame_03.png | Bin 107 -> 110 bytes .../icons/MainMenu/Settings_14/frame_04.png | Bin 110 -> 108 bytes .../icons/MainMenu/Settings_14/frame_05.png | Bin 110 -> 110 bytes .../icons/MainMenu/Settings_14/frame_06.png | Bin 110 -> 110 bytes .../icons/MainMenu/Settings_14/frame_07.png | Bin 110 -> 108 bytes .../icons/MainMenu/Settings_14/frame_08.png | Bin 108 -> 110 bytes .../icons/MainMenu/Settings_14/frame_09.png | Bin 110 -> 110 bytes .../icons/MainMenu/Settings_14/frame_10.png | Bin 110 -> 110 bytes assets/icons/MainMenu/Sub1ghz_14/frame_01.png | Bin 97 -> 103 bytes assets/icons/MainMenu/Sub1ghz_14/frame_02.png | Bin 96 -> 102 bytes assets/icons/MainMenu/Sub1ghz_14/frame_03.png | Bin 90 -> 102 bytes assets/icons/MainMenu/Sub1ghz_14/frame_04.png | Bin 76 -> 83 bytes assets/icons/MainMenu/Sub1ghz_14/frame_05.png | Bin 79 -> 88 bytes assets/icons/MainMenu/Sub1ghz_14/frame_06.png | Bin 90 -> 97 bytes assets/icons/MainMenu/U2F_14/frame_01.png | Bin 104 -> 108 bytes assets/icons/MainMenu/U2F_14/frame_02.png | Bin 103 -> 108 bytes assets/icons/MainMenu/U2F_14/frame_03.png | Bin 102 -> 108 bytes assets/icons/MainMenu/U2F_14/frame_04.png | Bin 103 -> 108 bytes assets/icons/MainMenu/iButton_14/frame_01.png | Bin 104 -> 110 bytes assets/icons/MainMenu/iButton_14/frame_02.png | Bin 108 -> 110 bytes assets/icons/MainMenu/iButton_14/frame_03.png | Bin 104 -> 110 bytes assets/icons/MainMenu/iButton_14/frame_04.png | Bin 108 -> 106 bytes assets/icons/MainMenu/iButton_14/frame_05.png | Bin 100 -> 103 bytes assets/icons/MainMenu/iButton_14/frame_06.png | Bin 103 -> 110 bytes assets/icons/MainMenu/iButton_14/frame_07.png | Bin 110 -> 110 bytes assets/icons/NFC/ArrowC_1_36x36.png | Bin 3692 -> 195 bytes assets/icons/NFC/Detailed_chip_17x13.png | Bin 981 -> 113 bytes assets/icons/NFC/Keychain_39x36.png | Bin 3775 -> 213 bytes assets/icons/NFC/MFKey_qr_25x25.png | Bin 218 -> 193 bytes assets/icons/NFC/Medium-chip-22x21.png | Bin 3740 -> 148 bytes assets/icons/NFC/Modern_reader_18x34.png | Bin 3670 -> 153 bytes assets/icons/NFC/Move_flipper_26x39.png | Bin 3698 -> 187 bytes .../icons/NFC/NFC_dolphin_emulation_51x64.png | Bin 1591 -> 389 bytes assets/icons/NFC/NFC_manual_60x50.png | Bin 3804 -> 309 bytes assets/icons/NFC/Release_arrow_18x15.png | Bin 3631 -> 126 bytes assets/icons/NFC/check_big_20x17.png | Bin 994 -> 113 bytes assets/icons/PIN/Pin_arrow_up_7x9.png | Bin 3603 -> 79 bytes assets/icons/PIN/Pin_attention_dpad_29x29.png | Bin 3688 -> 177 bytes assets/icons/PIN/Pin_back_arrow_10x8.png | Bin 3606 -> 90 bytes assets/icons/PIN/Pin_pointer_5x3.png | Bin 3592 -> 71 bytes assets/icons/PIN/Pin_star_7x7.png | Bin 3600 -> 79 bytes assets/icons/Passport/passport_bad1_46x49.png | Bin 1237 -> 263 bytes assets/icons/Passport/passport_bad2_46x49.png | Bin 1295 -> 296 bytes assets/icons/Passport/passport_bad3_46x49.png | Bin 1304 -> 307 bytes .../icons/Passport/passport_bottom_128x18.png | Bin 1149 -> 177 bytes .../icons/Passport/passport_happy1_46x49.png | Bin 1296 -> 297 bytes .../icons/Passport/passport_happy2_46x49.png | Bin 1328 -> 314 bytes .../icons/Passport/passport_happy3_46x49.png | Bin 1348 -> 330 bytes assets/icons/Passport/passport_left_6x46.png | Bin 1083 -> 115 bytes .../icons/Passport/passport_okay1_46x49.png | Bin 1244 -> 259 bytes .../icons/Passport/passport_okay2_46x49.png | Bin 1281 -> 291 bytes .../icons/Passport/passport_okay3_46x49.png | Bin 1304 -> 311 bytes assets/icons/Power/BatteryBody_52x28.png | Bin 327 -> 173 bytes assets/icons/Power/Battery_16x16.png | Bin 281 -> 103 bytes assets/icons/Power/FaceCharging_29x14.png | Bin 308 -> 121 bytes assets/icons/Power/FaceConfused_29x14.png | Bin 317 -> 132 bytes assets/icons/Power/FaceNopower_29x14.png | Bin 302 -> 117 bytes assets/icons/Power/FaceNormal_29x14.png | Bin 295 -> 115 bytes assets/icons/Power/Health_16x16.png | Bin 282 -> 102 bytes assets/icons/Power/Temperature_16x16.png | Bin 283 -> 98 bytes .../icons/Power/Unplug_bg_bottom_128x10.png | Bin 5355 -> 114 bytes assets/icons/Power/Unplug_bg_top_128x14.png | Bin 5945 -> 156 bytes assets/icons/Power/Voltage_16x16.png | Bin 294 -> 103 bytes assets/icons/RFID/RFIDBigChip_37x36.png | Bin 2372 -> 220 bytes .../icons/RFID/RFIDDolphinReceive_97x61.png | Bin 1421 -> 472 bytes assets/icons/RFID/RFIDDolphinSend_97x61.png | Bin 1418 -> 475 bytes assets/icons/SDCard/SDQuestion_35x43.png | Bin 2042 -> 179 bytes .../icons/Settings/LoadingHourglass_24x24.png | Bin 3650 -> 138 bytes assets/icons/Settings/dolph_cry_49x54.png | Bin 973 -> 283 bytes assets/icons/Settings/qr_benchmark_25x25.png | Bin 395 -> 193 bytes assets/icons/StatusBar/Alert_9x8.png | Bin 3611 -> 89 bytes assets/icons/StatusBar/Attention_5x8.png | Bin 1690 -> 81 bytes assets/icons/StatusBar/BLE_beacon_7x8.png | Bin 117 -> 81 bytes assets/icons/StatusBar/Background_128x11.png | Bin 410 -> 201 bytes assets/icons/StatusBar/Battery_26x8.png | Bin 313 -> 95 bytes .../StatusBar/Bluetooth_Connected_16x8.png | Bin 3613 -> 90 bytes assets/icons/StatusBar/Bluetooth_Idle_5x8.png | Bin 79 -> 81 bytes .../StatusBar/Charging-lightning_9x10.png | Bin 3674 -> 96 bytes .../Charging-lightning_mask_9x10.png | Bin 10182 -> 96 bytes .../StatusBar/Exp_module_connected_12x8.png | Bin 3612 -> 89 bytes assets/icons/StatusBar/GameMode_11x8.png | Bin 3610 -> 89 bytes assets/icons/StatusBar/Hidden_window_9x8.png | Bin 3604 -> 88 bytes assets/icons/StatusBar/Muted_8x8.png | Bin 3626 -> 81 bytes assets/icons/StatusBar/Rpc_active_7x8.png | Bin 3607 -> 81 bytes assets/icons/StatusBar/SDcardFail_11x8.png | Bin 81 -> 83 bytes assets/icons/StatusBar/SDcardMounted_11x8.png | Bin 74 -> 76 bytes assets/icons/SubGhz/External_ant_1_9x11.png | Bin 1092 -> 110 bytes assets/icons/SubGhz/Internal_ant_1_9x11.png | Bin 1111 -> 110 bytes assets/icons/SubGhz/Lock_7x8.png | Bin 3597 -> 81 bytes assets/icons/SubGhz/MHz_25x11.png | Bin 1660 -> 117 bytes assets/icons/SubGhz/Quest_7x8.png | Bin 3675 -> 81 bytes assets/icons/SubGhz/Scanning_short_96x52.png | Bin 1388 -> 479 bytes .../SubGhz/SubGhz_External_ant/frame_01.png | Bin 1092 -> 110 bytes .../SubGhz/SubGhz_External_ant/frame_02.png | Bin 1097 -> 106 bytes .../SubGhz/SubGhz_External_ant/frame_03.png | Bin 1079 -> 100 bytes .../SubGhz/SubGhz_External_ant/frame_04.png | Bin 1085 -> 105 bytes .../SubGhz/SubGhz_Internal_ant/frame_01.png | Bin 1111 -> 110 bytes .../SubGhz/SubGhz_Internal_ant/frame_02.png | Bin 1111 -> 110 bytes .../SubGhz/SubGhz_Internal_ant/frame_03.png | Bin 1110 -> 105 bytes .../SubGhz/SubGhz_Internal_ant/frame_04.png | Bin 1110 -> 108 bytes assets/icons/SubGhz/Unlock_7x8.png | Bin 3598 -> 81 bytes assets/icons/U2F/Auth_62x31.png | Bin 3761 -> 250 bytes assets/icons/U2F/Connect_me_62x31.png | Bin 3767 -> 239 bytes assets/icons/U2F/Connected_62x31.png | Bin 3765 -> 248 bytes assets/icons/U2F/Drive_112x35.png | Bin 3695 -> 195 bytes assets/icons/U2F/Error_62x31.png | Bin 3751 -> 248 bytes assets/icons/Update/Updating_32x40.png | Bin 3704 -> 184 bytes .../iButtonDolphinVerySuccess_92x55.png | Bin 967 -> 521 bytes assets/icons/iButton/iButtonKey_49x44.png | Bin 1970 -> 260 bytes assets/slideshow/first_start/frame_00.png | Bin 602 -> 567 bytes assets/slideshow/first_start/frame_01.png | Bin 558 -> 499 bytes assets/slideshow/first_start/frame_02.png | Bin 656 -> 530 bytes assets/slideshow/first_start/frame_03.png | Bin 595 -> 536 bytes assets/slideshow/first_start/frame_04.png | Bin 548 -> 501 bytes assets/slideshow/first_start/frame_05.png | Bin 579 -> 536 bytes assets/slideshow/update_default/frame_00.png | Bin 2211 -> 562 bytes documentation/fbt.md | 2 + scripts/imglint.py | 97 ++++++++++++++++++ 1232 files changed, 154 insertions(+), 1 deletion(-) mode change 100755 => 100644 applications/system/hid_app/assets/Alt_active_17x9.png mode change 100755 => 100644 applications/system/hid_app/assets/Cmd_active_17x9.png mode change 100755 => 100644 applications/system/hid_app/assets/Ctrl_active_17x9.png mode change 100755 => 100644 applications/system/hid_app/assets/Enter_11x7.png mode change 100755 => 100644 applications/system/hid_app/assets/Tab_19x12.png mode change 100755 => 100644 applications/system/hid_app/assets/backslash_button_9x11.png mode change 100755 => 100644 applications/system/hid_app/assets/backspace_19x11.png mode change 100755 => 100644 applications/system/hid_app/assets/backspace_hovered_9x11.png mode change 100755 => 100644 applications/system/hid_app/assets/backtick_button_9x11.png mode change 100755 => 100644 applications/system/hid_app/assets/brace_left_button_9x11.png mode change 100755 => 100644 applications/system/hid_app/assets/brace_right_button_9x11.png mode change 100755 => 100644 applications/system/hid_app/assets/equals_button_9x11.png mode change 100755 => 100644 applications/system/hid_app/assets/hash_button_9x11.png mode change 100755 => 100644 applications/system/hid_app/assets/percent_button_9x11.png mode change 100755 => 100644 applications/system/hid_app/assets/quote_button_9x11.png mode change 100755 => 100644 applications/system/hid_app/assets/slash_button_9x11.png mode change 100755 => 100644 applications/system/hid_app/assets/sq_bracket_left_button_9x11.png mode change 100755 => 100644 applications/system/hid_app/assets/sq_bracket_right_button_9x11.png mode change 100755 => 100644 applications/system/hid_app/assets/underscore_button_9x11.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_0.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_1.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_10.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_11.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_12.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_13.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_14.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_15.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_16.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_17.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_18.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_19.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_2.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_20.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_21.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_22.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_23.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_24.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_25.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_26.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_27.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_28.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_29.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_3.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_30.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_31.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_32.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_33.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_34.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_35.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_4.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_5.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_6.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_7.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_8.png mode change 100755 => 100644 assets/dolphin/external/L1_Akira_128x64/frame_9.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_0.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_1.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_10.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_11.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_12.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_13.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_14.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_15.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_16.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_17.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_18.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_19.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_2.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_20.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_21.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_22.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_23.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_24.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_25.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_26.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_27.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_28.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_29.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_3.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_30.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_31.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_32.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_33.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_34.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_35.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_36.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_37.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_38.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_39.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_4.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_40.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_41.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_42.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_43.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_44.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_45.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_46.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_47.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_48.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_49.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_5.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_50.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_51.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_52.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_53.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_54.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_55.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_56.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_6.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_7.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_8.png mode change 100755 => 100644 assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_9.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_0.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_1.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_10.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_11.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_12.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_13.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_14.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_15.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_16.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_17.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_18.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_19.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_2.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_20.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_21.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_22.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_23.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_24.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_25.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_26.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_27.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_28.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_29.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_3.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_30.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_31.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_32.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_33.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_34.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_35.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_36.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_37.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_38.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_39.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_4.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_40.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_41.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_42.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_43.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_44.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_45.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_46.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_47.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_48.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_49.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_5.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_50.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_51.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_52.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_53.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_54.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_55.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_6.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_7.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_8.png mode change 100755 => 100644 assets/dolphin/external/L3_Intruder_alert_128x64/frame_9.png create mode 100644 scripts/imglint.py diff --git a/.github/workflows/lint_and_submodule_check.yml b/.github/workflows/lint_and_submodule_check.yml index 3063d943d6..6b71253cda 100644 --- a/.github/workflows/lint_and_submodule_check.yml +++ b/.github/workflows/lint_and_submodule_check.yml @@ -95,6 +95,22 @@ jobs: echo "C Lint: all good ✨" >> $GITHUB_STEP_SUMMARY; fi + - name: 'Check image assets' + if: always() + run: | + set +e; + ./fbt -s lint_img 2>&1 | tee lint-assets.log; + if [ "${PIPESTATUS[0]}" -ne 0 ]; then + # Save multiline output + echo "errors=1" >> $GITHUB_OUTPUT; + printf "Image Lint errors:\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY; + echo "$(cat lint-assets.log)" >> $GITHUB_STEP_SUMMARY; + printf "\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY; + exit 1; + else + echo "Image Lint: all good ✨" >> $GITHUB_STEP_SUMMARY; + fi + - name: Report code formatting errors if: ( steps.syntax_check_py.outputs.errors || steps.syntax_check_cpp.outputs.errors ) && github.event.pull_request run: | diff --git a/SConstruct b/SConstruct index 89a337cd50..b4c8d7b290 100644 --- a/SConstruct +++ b/SConstruct @@ -322,7 +322,12 @@ firmware_env.Append( "SConstruct", "firmware.scons", "fbt_options.py", - ] + ], + IMG_LINT_SOURCES=[ + # Image assets + "applications", + "assets", + ], ) @@ -359,6 +364,39 @@ distenv.PhonyTarget( PY_LINT_SOURCES=firmware_env["PY_LINT_SOURCES"], ) +# Image assets linting +distenv.PhonyTarget( + "lint_img", + [ + [ + "${PYTHON3}", + "${FBT_SCRIPT_DIR}/imglint.py", + "check", + "${IMG_LINT_SOURCES}", + "${ARGS}", + ] + ], + IMG_LINT_SOURCES=firmware_env["IMG_LINT_SOURCES"], +) + +distenv.PhonyTarget( + "format_img", + [ + [ + "${PYTHON3}", + "${FBT_SCRIPT_DIR}/imglint.py", + "format", + "${IMG_LINT_SOURCES}", + "${ARGS}", + ] + ], + IMG_LINT_SOURCES=firmware_env["IMG_LINT_SOURCES"], +) + +distenv.Alias("lint_all", ["lint", "lint_py", "lint_img"]) +distenv.Alias("format_all", ["format", "format_py", "format_img"]) + + # Start Flipper CLI via PySerial's miniterm distenv.PhonyTarget( "cli", diff --git a/applications/debug/file_browser_test/icons/badusb_10px.png b/applications/debug/file_browser_test/icons/badusb_10px.png index 037474aa3bc9c2e1aca79a68483e69980432bcf5..2b5a3bf97382a13e951505546ed51b9d66da0899 100644 GIT binary patch delta 78 zcmX@Wk}yHSgOLFUmU?~?08;9nE{-7;bCUnmPk5=we3+44&5=z_k8Rm<9v>c_p7rYt eJBXd6xINKS!UMvl!qLiD#K%R*5%=r#Gtx=Y8TZE6OVIIq|qj7bJe< zy5jO1=Yqom&kURC)I4#RSS)m~(!s1~YQ$5-5mnPEU&y$ua^B*sm20eZPyWJCPG4E( zI?WLzu!to{e-NRdh7!uCB1)@HiiH&I$36VRj$a~|Laq`RITlcX2HEk0|H1EWt^DMK zn-q!zT`#u%F$x5Cfo9#dzmILZc>?&Kfh)c3uQY&}PtxmcEph}5Yy%h9ZB5w&E_Z;T zCqp)6NAlAY@_FF>jJ_!g4Bi60Yi@6?eVjf3Y3eF@e*+vG0%HZrUiWx+PiJrco@w>> z11Jx2iD%?txBvhE24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2j&6<4mK2EGyVzy002EnL_t&-(~VF;3IH$&O6mV!cBetK8hQysQ-UOgfvg0; zBe-|?EECl|C-=m;MRn8Ku~%W3;1<~@+&|jU2gXe!0|UhaI{*Lx07*qoM6N<$f*l_4 AO8@`> diff --git a/applications/debug/subghz_test/images/DolphinCommon_56x48.png b/applications/debug/subghz_test/images/DolphinCommon_56x48.png index 089aaed83507431993a76ca25d32fdd9664c1c84..9cdc2e448e9aa9219e10cc39e8e01a392dd74a69 100644 GIT binary patch delta 286 zcmV+(0pb3L3#|f>7=Hl(0001Nu7utI008t!L_t(|oITGWZWM7GNAb`9$A}dq9f4Ry z=LmZOIvfE`u;C!A;1nnbC%|GLqyk9=0!PsZW-I8V+nq0B3G#{ek|#-=N0NDW8A&cP zN0Rd_7e%((w#D%QSH%(Q7WW-eNYr-7(dh;KXS5&nWVIBjS_NizYg|x=Pr^vz*7zxJO|P-dw2IeZq?gec9-rD zoPZchQ_6}yP{Slc4I!!28K==nodOJ_nsCY-(wOq2uZbLx!rlYU{KIi)_Wj!D_j`WN z^FGgREXdEDF)ewT&1Re7Tj(uBvlG44lnH3;I%IzsO|z`*Vr!`uv?9QOwgs{#Ld+Ki zC9n_zxxBOkx@@+IwMwAaD)#3Ik`}gun2kLe))Crfb7e+#AgzHGCc+X$b>qJuIf`S7 z?8b}I{ghw#z>uiaLknQh@LJUrqHcVYS3v97F^OZN zCe|7^J|?QzUx0Zu17e(=CM1fYFpjtLk|a4~$g}e?hGH0!VoBOT&<=s(1ct%J9~?O} z$)jW_dkX9yTX~%W*i_IM%0{ z7EmP^_pKn`<5>E(SixgJU};7`)7Hidp&+DLnizsebUk}_-GfgbN^il9b`v)f+ z{o5Zry)d<7`fHQ^uw_;+x>mcPw0&8iW69x{k92O{Q}`yFdH=5d$pbf49w1&NS)G+vhr6y}5TMsofQirRDUmKilk5=(KGouJ{H9hW=$X zgi;)vI!jl!_4H3jD(?Jz=8By|i47I&tKA1y9{nfp;_|FxKBDNWp{hN9hJ1nU?z%J6 z?>UxyzWvO}Pgc~rCZ#5%Eq+_hNS~bBdiGlT&f%%e`hHjSySR2=JuK2^+%;$R3#Wz~ z=e_mfqW23bPa0fhe)HdE5+GelU&!jS3ckUZOQ)CC5?mo zo=tzG_4|RuvPUO|mhCwA>y)1c%SWC%a4?a-x|J*?ch~+n=R7o@>p6J2dE=$stKZmK z-xoTRwET2^Wu)&1U7!Ebw!!D?x`xwQX3pMnrRwCT?`4GHt4&?|cIiI{_^XYp-np>6 xE^lPSXzOYCC4X`6tl@OB1M5_S7jml-Y~(TPp{aTIejNKZ`m*!Atyxdk{0EAy49frj diff --git a/applications/debug/subghz_test/subghz_test_10px.png b/applications/debug/subghz_test/subghz_test_10px.png index 10dac0ecaac608aba6d445bc5fef45d8cc1efff4..77dc6d3829b637f19f93cc438ebad9665757a5c9 100644 GIT binary patch delta 78 zcmdnWm@q-YgOLFUmU?~?08;9nE{-7;bCQ3&Kk(&z<4bks%ff8SczJwyczhUneCj1; e+>o3xgO7os)sWpNcE5BkNUNu-pUXO@geCydZWv7f delta 164 zcmYe;$~Zxyo`a2nfuYyv{9Yi%SRCZ;#IWw1%u67LCEd~2k%3`jKlh(RRv@3Vz$3Dl zfr0NZ2s0kfUy%Y7^zw9Z4ABU#Js-%&Ai(2t@Y>(^F=1<5c7LrCxXjW&wYI37S@L-d zlY_$z@fnP}H!$Zo$7vk6W&X_U$?=`5o}^!KkZW|QTu}SiTEL9)>@ij0zdjB(fyOd; My85}Sb4q9e0LTS7*#H0l diff --git a/applications/examples/example_ble_beacon/example_ble_beacon_10px.png b/applications/examples/example_ble_beacon/example_ble_beacon_10px.png index 7060e893db14944726f2d5141ca6fb29f5333bc8..c6aff41893af137325017726344242b1be765e11 100644 GIT binary patch delta 78 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 s&EbDf0vXfy>QBr&AC-wAfI~0-0#{d8T literal 8910 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 LNkvXXu0mjfZ-`eu literal 1188 zcmaJ>TWAzl7@kEf7@I;~nks=zCO(*wx$f*`#%yF}XLqwDyN&A>qX;^elkAYpoN;E7 zT_ad+1+A!okV0Py4WTxu1Va$ocu7nty*w!DqxewhOYlKo`cO5bXEwXhhv>kWbN(~m z_uv2drZ1mqY}nO+VOV3fM=78^gVxT_7W6*!a_R}%LS7*wW3%^LR*YCPxa}3AQ3{SH>$uMGA5P2T2Jp{6c<6W*XAQqH#%^s2xM9KFZk*3S#GF1*!&>f^% zK@ez$qdAU52+})Y`)Y->z4mn_H8l$Gbk}rz6WVy7R@LB$pCFLS>#V-n3T8~@-t~m;fvub zaw?2&QUafr!$gg1Y?8kkH}Y;SU2Q?+5*@V5TkW&nn$=s>o55hv8Yf7xu#|2!_;DXYyRGERL7p5^$LFFB*mz<|?; Yf#Gfl&tlI~4M~tLPgg&ebxsLQ0NfTDUjP6A literal 7293 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 diff --git a/applications/main/bad_usb/icon.png b/applications/main/bad_usb/icon.png index 037474aa3bc9c2e1aca79a68483e69980432bcf5..2b5a3bf97382a13e951505546ed51b9d66da0899 100644 GIT binary patch delta 78 zcmX@Wk}yHSgOLFUmU?~?08;9nE{-7;bCUnmPk5=we3+44&5=z_k8Rm<9v>c_p7rYt eJBXd6xINKS!UMvl!qLiD#K%R*5%=r#Gtx=Y8TZE6OVIIq|qj7bJe< zy5jO1=Yqom&kURC)I4#RSS)m~(!s1~YQ$5-5mnPEU&y$ua^B*sm20eZPyWJCPG4E( zI?WLzu!to{e-NRdh7!uCB1)@HiiH&I$36VRj$a~|Laq`RITlcX2HEk0|H1EWt^DMK zn-q!zT`#u%F$x5Cfo9#dzmILZc>?&Kfh)c3uQY&}PtxmcEph}5Yy%h9ZB5w&E_Z;T zCqp)6NAlAY@_FF>jJ_!g4Bi60Yi@6?eVjf3Y3eF@e*+vG0%HZrUiWx+PiJrco@w>> z11Jx2iD%?txBvhE24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2j&6<4mK2EGyVzy002EnL_t&-(~VF;3IH$&O6mV!cBetK8hQysQ-UOgfvg0; zBe-|?EECl|C-=m;MRn8Ku~%W3;1<~@+&|jU2gXe!0|UhaI{*Lx07*qoM6N<$f*l_4 AO8@`> diff --git a/applications/main/gpio/icon.png b/applications/main/gpio/icon.png index 4a6eccf0584358bbd927564b6c3dabf9a6eb90f9..7b54bb5cb3a1382f11aecbbd9e85a6c531c148ab 100644 GIT binary patch delta 73 zcmaFB8$Ch7nUMhqmU?~?08&bxE{-7;bCUOb??}BXrpCs`kpyIRHiE#$8Pi|dF*6jo Vu?0)298L%6@^tlcS?83{1OS0w7|Z|w literal 1760 zcmah~e@qj16h8_x4iS+blQ`loCprP!yOvhcOAiFfpvFQ2ILj8sj`rL3XnR-guC!%g z6WA6}r_n_>5OriujUt-p2+p8kXl9tpG9lUcLq-^x45JRS1+%E^do6+pY)OCI_kBL^ z^L^j<-uGRTsW5+e-$PrRKtwBnona~L!R4zM%2+9EyT(WuJ-NWa6x8ydq_(isQtPy6tyorO zq|Q%50XGn7)bDn&0_mr)pe_lYB{PnpL5k?4FtgEw=5jnhH42S_z%nCI9dEUf#rij< zo#BeY9HQtUaop$gDSYV)j<@4VtyYT@DqN+KLxx-kup;f3v%*?QBBY@Qf`w;1BEzw$ zq)AtDUXj8uh@;cuB4e9XXNBqG!$jZ`f-4mS{yZJ{nMLRlGLP$o z&vS(7TiC@9&vd3g)Ss{yRIHkb)1 zFQmau+rd`A+C>M2DTx<=?TqzByCmfDN|o5gGH`3vtc!UTqp%DWuAGI+7KEf!lP1Ow zTxLDv2CM*8XQG$|%N7B1ITy#5z_tbywn?K&*97;QsRbFtjhq$2=`TQr+*}jS*%%kZ z@(r+YE4_?MlrtVIH2ddM&^j z3>C_SP=T|FKAH#Fc35Q!%eL7VSfl`IlG+zlp(+KTP|tPoIRKPf{BZbmXt;Fmp2eoa z=S8mz5}v!L&@W_z0{~7Ed}fru#mq1QESx|*95vss`9+B!VY?YvnE3@kkPZ9m_EQDD zo0G0r^jGDbj;@KRzF|7DF+QPsAT_=%=TyR5UgFYU%UaaQa>d>TXHU<*>!%xcU+9SL zXh0u@jf{;RAH&u?#ZxZsoEYwU?ZJKO{!m!Xmp9dEG2!a&suQu*%1_G^8qdYVY|g42 zJJbwr8j53&{&sgw=9Qtmz@f=YS^39WE+h`eHQAf#H=8ncp3FG2Tcy_2=e|;`v)W?T)HzCD&GN>rbh;(bdimjkF(hwtI`7 zerqbMDEpoKVP*39o$Cr>+P?TWw(k_SdfV;JtNYxS1F}cQ>eIUKom1~?75P%ENV#B?PR&Lb*-5QGoBgi((fy> zb5lo|zbC^ttl*oL9*K&DZ;zKf1!V$)EQ^!AVMt4BA~b3Z`s~uggI|53j7Es1vYx4_ z=I9e!lEzKzS2UPnkpqF_t8X7v6MqhT(E8rj<6Re5{q*aBxZXxZxlTB_{+~gr?QQAB NWXLPjcjUa=@GmQdSu_9u diff --git a/applications/main/ibutton/icon.png b/applications/main/ibutton/icon.png index 2fdaf123a657c00c9c84632ca3c151674e451ae1..f73af065f427ec8fde39168d406f997665b8a842 100644 GIT binary patch delta 66 zcmdnMlrTZXM%~lJF{ENn@{i*Oer%ulQl9zpeCD27H=p;CGtL<>&pI=m5)bWC*+s&X`qmbr;B3<$Ms~3f`-KX%+5*7 zhxan`%;z`w!#>%c-@wM^z<~n{3>VXQv+hhNs0FH5Epd$~Nl7e8wMs5Z1yT$~21bUu z2Bx}(CLxAKR>lTa#unNJ237_J>nn=CplHa=PsvQHglaGb>IpG01*)?$HiBr_e$xf$ PHwFezS3j3^P6<>&pI=m5)bWZjP>yH&963)5S4_<9hOs!iI<>&pI=m5)b(dHL6nbwD9yPZ!4!j_b)k${QZ;XFmLn zjqNsD+YPq1J8W%_*aXBie!OR3*tC!PwU_7Q9H4U564!{5l*E!$tK_0oAjM#0U}UIk zV5)0q5@Kj%Wo%$&Y@uynU}a#izM}XGiiX_$l+3hBs0L%8o)7~QD^p9LQiz6svOM}g O4Gf;HelF{r5}E+GUQp8j diff --git a/applications/main/subghz/icon.png b/applications/main/subghz/icon.png index 5a25fdf4ef1c6cf53634aa74675001a3e8c85b7b..70940ad77935c769ca4df4b73621723e6b812316 100644 GIT binary patch delta 65 zcmZ3@6hA@5TFukNF{ENn@{RWgW@w-JGO_U`H?uG^^JG2d$tM|)oll=BAu&Tjf+1%M VTbRvDTP6k|@O1TaS?83{1OP@`7iRzf literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2xkYHHq`AGmsv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R1i<>&pI=m5)cB{fFDGZlI8yr;B3<$MxhJ?+;A4eL&#) z0Ra}bue?07WhLz78x$BO|L3mq-MMxdP^D^#YeY#(Vo9o1a#1RfVlXl=GSoFN)ipE; zF*LF=Hn1|b&^9ozGB8+QQTzo(LvDUbW?CgwgE3G~h=Hk=Gf#{`fVe+UKu0050L&%FQu0fcEoLr_UWLm+T+Z)Rz1WdHyuk$sUpNW(xJ z#b48EMXC;V5OK&*oh%d;anvdlp+cw?T6HkF^b49aBrPtEf@{ISkHxBki?gl{u7V)= z0pjT7r060g{x2!Ci1FaKAMfrx?%n}Hqs%lb5Cb&5YNir#e=(C?6@#x35I{d-=$4sf z%t=xbp5yBtKEB>Xd6xINKS!UMvl!qLiD#K%R*5%=r#Gtx=Y8TZE6OVIIq|qj7bJe< zy5jO1=Yqom&kURC)I4#RSS)m~(!s1~YQ$5-5mnPEU&y$ua^B*sm20eZPyWJCPG4E( zI?WLzu!to{e-NRdh7!uCB1)@HiiH&I$36VRj$a~|Laq`RITlcX2HEk0|H1EWt^DMK zn-q!zT`#u%F$x5Cfo9#dzmILZc>?&Kfh)c3uQY&}PtxmcEph}5Yy%h9ZB5w&E_Z;T zCqp)6NAlAY@_FF>jJ_!g4Bi60Yi@6?eVjf3Y3eF@e*+vG0%HZrUiWx+PiJrco@w>> z11Jx2iD%?txBvhE24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2j&6<4+Si}m`RfW002ZuL_t&-(~Xe14FE6*1MP_YSH2VxC=CcVG=4FF76?hQ zJ(2+VGu_$Lww$bV?L-xwgs#TvI;F4-w$bY`0j%B=Q{0aW)?_jMUQ$)>00000NkvXX Hu0mjfRdn(| diff --git a/applications/system/hid_app/assets/Alt_17x10.png b/applications/system/hid_app/assets/Alt_17x10.png index 78529ca07d7d8b0d3767b7536a91f8f42cc67ece..54c4557bad508a8816d2a9bb78f6ecbeacbd37d8 100644 GIT binary patch delta 69 zcmXR&nV{mJ?djqeQZa}1;6lL$0|thTA9i&mFX3xVy?;uJN9FkQ%==X*FYPnom}#~A Z1M>kkwkh=`JF*ynz|+;wWt~$(69D9+91;Kk delta 81 zcmYc(n4sdrS>O>_%)r1c48n{Iv*t)JFfb^2x;Tb#%uN3Ae}Ch{;!5Vj(E@&X2^Ad4 i%^%*eu}!cMU}l(gQ{-W`r??MLHG`+CpUXO@geCyWQW+)y diff --git a/applications/system/hid_app/assets/Alt_active_17x9.png b/applications/system/hid_app/assets/Alt_active_17x9.png old mode 100755 new mode 100644 index 46a21a2e85584b6d8cbd4923cbd6787b2d5a0041..bd1adf606d0d367d35b55d5b646688187e3a493f GIT binary patch delta 75 zcmbOy6FWh|m5~7m{!IS05J;(bx;TbZ%wavKD9E6|z_9Tyx5%UmElNU@7;+NwcsH4> cms4b~v3SLtd|Ts&15iDKr>mdKI;Vst09dsbE&u=k literal 3614 zcmaJ@c{r478-GRit+FKPj3Hahn6Wj}jAdqQG1ifh7K1S+jTvKVEG7FAhor2HsAN}B zQ$pE72~o&imLvz?vBXLE#yO|+eSds??{&TJb3gZU|9xJ;^=ma>TS(Rk(j0a?d}UFPNjifwuE{K?7TNwSXG;+I9=3r#BDN{+f6 zfBDt=$I#n;eYLBfIyN8m8&8)lajLq6>V?JAt@IoX!o`a*2X=jkYHe=$I0-S05LIOW z(!y2V%7Ggye85^53UvrvFZ2xH3wkRi4AkRu>UHWS!s(kLIgqr5?5s4wnH; zLy|Ff0aFXUa89P0Gms|$c(i+YP5=%%fQR~}Pj7*6&RSL|AK-pXS(Yy^6#(ra$KwFs zBS2Z#vCHNFQ5TT$v1vvC?{xrOYgZpD;QnKvzEfJP5)c*#bRFYkGy#E7z@tq?B?ySl z0%R-}T~WUus*s-6;#DfE5>>5=FpqE-)(H@Db%h+z=(LtUBx6Y0LCQ9TGzMoWz$5gf zJ}kWkfV@;$UbagcL7kEnot=isT*=cqU!DtYfjvDZHmABu8Kwa6krmdxsST~#7k)%A zoVI!E;JkqEDY3kBtBF39Ql^i9yqQ7QCB}Ab%=52Q4-8CAPQE|djBzKua=o}oX*^x; zx^ec8Fx29tBG1N z6OOwBl5yEdOYj140_Ljbi-SE|-s5B1>-@%J2EhF@#(bfvIz=bF_`lkyOA}f3|F&C#r&8#>+T@ZBh-aU{03_ zAQvm8MKp5*zG#bEVsE@zuk2?KD!9 zPuOLUavW2h&vm-z7+17M|6DerBTCNNrl9=R^|$+c<$YJF_dc_p?i#s%z%JvBYft-( z<>!pg{L5@{iCEdF)_97BLe5^Hy%YuZ-g}w0cNN|yDzp-GjbO8x(^*nkbQhu)SL=do z>MPOfN3W}0SJZ+Mic9X6jFyPGEV;B3Qi@MGU#zfj(Q}?C7I~Lm>QcgSm~~ckrW7A3 ziYuWM(FrDZ!rV3z1l^i!o9wZ79P=KWo~UgBiFqkh1!*h$NtDK(i!f+bd(bg(;k;H& z=7v&DBD$nFAA!|7s^?nev~m~@~F&$=D4QfU47eX82N-> zNqR;)vDB*6vD9+5&ah&xkaM@ryvA)kLei}DsQL+YOG--TPR_LRfb&S9XrUY)ja;dK zl=u}W=GWlZ&;1MMGjpGv3eUBr7mfzkO@G^e5xPOxpnWS`u@ol?R*9<$4vBZ}MZGWx zpre$atwX;%Vox@iVhc#uNf{rbQ>(jCw|gyqwUA1pww#zyouIYQT5hWeswu14;J@JK zvz_qOcQx-Gu{~nj+VQ&MR!3i!K@J+$51-DN&gst?d+c#M=(skwi2H7f z)<5Pr!mWVla{OeKMLDPZU|&snP2sM>YP&SM(%e2u)BWGMFS*5!74A>H7aXeK(zq8% z6i<1|;};c8^J#Ty7oT4IbptIV5jP-Ns&rf_Ebt*y26+rQn%#M0-sIwo<@6aSh1ezC z^6kI>C6z7jt&pv5pfLO( zAB8_5!Ysml$NE~x1?A_-CdeW3*UEu8v!uLgGg-5g$nwakhH_=!w%@LlE3ZyxcBXbx zC1V`IKKH#5B7GtyHie0+$Hc|B#+oEE;)(mZVHpPO?qO`;815S`9XFaof!QPO=^QoC zGA@CfK@A!`)qiTz0`YNs-Am*UtkhMGCqw<`9k^R zbH2Td983;K~$mwf`>#WWOp8lJtkO&dUBboMeDUM zopa5o2&+>I!TUv=YIqgd@QBZER?J0oD(2$saR1y%dm_|r>=Ef(EJx8;HsNxG%#eJB z?4|b_!$DJuar9TuvxcudEG})X_U`iO@tOHFs*~$3nO>6dDMQjXbZv?~no{>kS{x$#ZdBxD$ulm3B4!PH^ zZWzCOHsr$Rg75X|C9hkrSFM^6Ztlcve=cxxz4#52Ki&y zW9Sw)blR(P?2HtB;i)w1V~_b(;`EW)Bb_G}pRg7yho<(pK5@;yhdfRD!uo>ROnYnJ zT63c&yQ2DpU-f)Q-J?*S)fvTHqt21#y5QgCw)%Q=5$KV+r4ah+i`A7exsfoY`bKAa z%>Y|{zP#4H_VlvpoY??&B(B%QeRKHz!tkXt_3XT*?qSPS!I-G7&D50?DeTUatd#ax ziP+iP!^Q~2xCwJ(=6fNw%ezZ0SAO%>W_yLa95igLcecN?JF`1KV=*J`IqgEh#+Uk8 zg?mFSjV%YBy$sTWomxJ&KG(n=W-Be+9+R@4ya2kSvE}>6gB9mDh3jbwX=z&m{FzJN z7YwdN^8PCoSms2QGu?;9CNar?nK#{&46>$?C}bxx$vZgUB^d<({F+n(kwwJYBE9G| z2x;2}5=3M0&;Wok31X1E{KzbjCz(R^M}rq?o`XSDZ#3A|0I!Q@V9CBzs}LsHImC|O z72@ZG@CKV0gHS<89s!NaB7uTvXZ-__L1^%wyhxtBt%ia@f10rT(BQvM$oydXob4)K@^L$jcT``bYCYi*dGYNG1*&mg3@TIfpfxdJG2yOs@ zfi&mMrK0Bwu^OfPTq&-|19c|*_SO?Ttr6&UYk2s+pj z%z5k9)>gs5%@LlYVU05*1Pyw6)Qj#_h{)uNRNeuKc8N|+-Bpp0no2zB3ogQF0HAt6 XbPZ5WQgh&4Jpiyax5HInJR<)M%F{Bk diff --git a/applications/system/hid_app/assets/Arr_dwn_7x9.png b/applications/system/hid_app/assets/Arr_dwn_7x9.png index d4034efc432b102f6f751d001dc6891b0763c55c..dc97d3abcd48580f0869d2e3d9dd2e90574cb96e 100644 GIT binary patch delta 61 zcmbOv<3B;doRI+tt|@c#0Vy$07srr_Ims5sjxaRx@bLKZ9GAGq$RM1>%<9KyUIbF< M>FVdQ&MBb@0I_ZknE(I) literal 3602 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 JTZ;Aw|2NmVF(Lo} diff --git a/applications/system/hid_app/assets/Arr_up_7x9.png b/applications/system/hid_app/assets/Arr_up_7x9.png index 28b4236a292708b412629ffafe30f6d011491505..4e199c7d053e412139101955ad9390acdb48b85d 100644 GIT binary patch delta 61 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 literal 3634 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 F2>_C653T?J delta 83 zcmeZFn;_xG!N$PA;B-v27D(xMx;TbNgqNOj{yjUfWX-fE0bCa+Md lj7UvBS!;1QL0)Q=zORYsj~s^J?Ld7Dp00i_>zopr7yt~28Xy1w diff --git a/applications/system/hid_app/assets/ButtonF10_5x8.png b/applications/system/hid_app/assets/ButtonF10_5x8.png index d1a7a04f06dcc4b5446aad5a40a9863038bf56b5..a817cce367839a5c48844c7d51ceeb531d008aad 100644 GIT binary patch delta 63 zcmZ3(7&t+~l92%jB)d4K0VxSj7srr_Imr_eyb?Af6eR>CL>xGB;0OZ)zYXKgXM5A@ PKx#c*{an^LB{Ts5K9CdM delta 155 zcmWGs!#F{ro`Z>jfnnd|ML9rEOCt}an8@pP0cG|a4t$sEJ;mKD97&t+~l92%jB)d4K0VxSj7srr_Imr_eyb?Af6ea9BSkTzn*vZHs>cX_xJLlkk OkXlbyKbLh*2~7Y!V-vRk delta 156 zcmWGs%Q!)zo`Z>jfnnd|ML9r!MP|ku_QG`p**uBL&4qCHz2%`PaLR7-P6S}gyVX0N<-uS z|No5*3=9rM3LNOr>2#G-T diff --git a/applications/system/hid_app/assets/ButtonF12_5x8.png b/applications/system/hid_app/assets/ButtonF12_5x8.png index 50d2a7dc63b9d366ccfbacbc05e6bb0d9e335b5b..a50b16ca319d578a3059061b9ad9817585ed4c8a 100644 GIT binary patch delta 63 zcmdnO7&t+~l92%jB)d4K0VxSj7srr_Imr_eyb?Af6eR>C+&J*1`6WApa1Qg%_o1`T PfYf@r`njxgN@xNARyP#h delta 163 zcmWIC!Z<;qo`Z>jfnnd|ML9rzopr0C^!XumAu6 diff --git a/applications/system/hid_app/assets/ButtonF1_5x8.png b/applications/system/hid_app/assets/ButtonF1_5x8.png index 7394d27105fd0a27067803bfd633a26bedd0f1d5..53a30974ba8357bb83a3813d887b5cb64d16a813 100644 GIT binary patch delta 63 zcmdnU7&t+~l92%jB)d4K0VxSj7srr_Imr_eyb?Af7$qbnR2)2V;0OZ)zYF8#t2+c0 PKx#c*{an^LB{Ts5H4GCj delta 160 zcmWIC$T&fwo`Z>jfnnd|ML9rHVG`WQT2{an^L HB{Ts5ioP__ diff --git a/applications/system/hid_app/assets/ButtonF2_5x8.png b/applications/system/hid_app/assets/ButtonF2_5x8.png index 9d922a3858147116d65b6f03e2b36ea846b2f60c..df28654a5ecdbccd5abb56cd854325944b409fe5 100644 GIT binary patch delta 63 zcmdnY7&t+~l92%jB)d4K0VxSj7srr_Imr_eyb?AfJW4Q1usEP{@Cy?I{}iUpciRv3 Pfz*1s`njxgN@xNAL`xJY delta 162 zcmWIC%s4@!o`Z>jfnnd|ML9r-2*BiKe8okATbEf}$2-L~o>FVdQ I&MBb@0QaUb(f|Me diff --git a/applications/system/hid_app/assets/ButtonF3_5x8.png b/applications/system/hid_app/assets/ButtonF3_5x8.png index 95c2dd4f4198e182a1a62927c4d3627400a7b883..a36cd56b9c51b843a362b5f3e3bbdc18acfa1c4b 100644 GIT binary patch delta 63 zcmdnQ7&t+~l92%jB)d4K0VxSj7srr_Imr_eyb?AfJW4Q1usHCc@g)<3;2-8f#qOgU PL25l+{an^LB{Ts5O868& delta 161 zcmWIC#5h5so`Z>jfnnd|ML9rI OkXlbyKbLh*2~7Ysz7tCT delta 160 zcmWIC$T&fwo`Z>jfnnd|ML9rJ<4Yz6!4T%i3y%DS OAhn*ZelF{r5}E)(E)!1x delta 161 zcmWIC#5h5so`Z>jfnnd|ML9rhT|;+&tGo0?a`;9QiNSdyBeP@Y+mq2TW68xY>eCk|AkJ^JsK#dHZu6{1- HoD!M@ diff --git a/applications/system/hid_app/assets/ButtonF6_5x8.png b/applications/system/hid_app/assets/ButtonF6_5x8.png index c50748257ab8e06f90007e93b913d5be4999d096..1009799a56b9405c8aee4ae81e50b79d261b7c22 100644 GIT binary patch delta 63 zcmdnU7&t+~l92%jB)d4K0VxSj7srr_Imr_eyb?AfJW809U~xd@z!ydazB^2_%XQE0 P2C4OQ^>bP0l+XkKNoW)- delta 160 zcmWIC$T&fwo`Z>jfnnd|ML9rBz^R zz|*|qa`l*+tdQV~NOD7yoWltbYcmkHOQ`&t;uc GLK6U47Bj#A diff --git a/applications/system/hid_app/assets/ButtonF7_5x8.png b/applications/system/hid_app/assets/ButtonF7_5x8.png index 396c98f5104f94b6310593ce6c7e6ce3d2369ef3..a6c44ddd8e1325cfdbca381c9c93385f8c545f73 100644 GIT binary patch delta 63 zcmdnM7&t+~l92%jB)d4K0VxSj7srr_Imr_eyb?AfJW4Q1_;KLKfg=nI{2`2w_kH-k P6r|SE)z4*}Q$iB}Y48=` delta 159 zcmWICz&Jsoo`Z>jfnnd|ML9rhT|;+&tGo0?a`;9QiNSdyBeP@Y+mq2TW68xY>eCk|Ak<>}%W!f`#d%aM;k zfu}j)|NqZ665^}pcy-C_k}kM*?Dv!DFRpe;3UxjC%6jmv;2+EUN-m%_22WQ%mvv4F FO#o2OG-3b% diff --git a/applications/system/hid_app/assets/ButtonF8_5x8.png b/applications/system/hid_app/assets/ButtonF8_5x8.png index 6304d7fb888b2cf38c54e7124aaa604d1610629c..a789a0f364f3d6d93555673792ba616269cd0852 100644 GIT binary patch delta 63 zcmdnM7&t+~l92%jB)d4K0VxSj7srr_Imr_eyb?AfJW3EsusEP{;0q%I-x8+D&2^Dw OAhn*ZelF{r5}E)ppA!!N delta 159 zcmWICz&Jsoo`Z>jfnnd|ML9rBz^R zz|*|q|9@k-o?T~L{Fb)#ay?n&n)PJr#rUt1*Vn5vs^u*g|0;g=R|-%YgQu&X%Q~lo FCIBLYGoJte diff --git a/applications/system/hid_app/assets/ButtonF9_5x8.png b/applications/system/hid_app/assets/ButtonF9_5x8.png index 148e69580f1d71fa3d6051743329e52d50fc7b5b..222b2e151d07f1d2fb955a1bab63673c4ec41672 100644 GIT binary patch delta 63 zcmdnY7&t+~l92%jB)d4K0VxSj7srr_Imr_eyb?AfJW3EsusHCc@g)<3pbT>$LuH)~ ONUf)jfnnd|ML9rwc6x=<11Hv2m#DR)*JzX3_IIbtBG&KJI z|KHfaz~E4%z<~~(lMN>moy7nC|8L(_C&DMAtjs-!HIad#^R)QSu7#$DfI1mGUHx3v IIVCg!06al58UO$Q diff --git a/applications/system/hid_app/assets/ButtonLeft_4x7.png b/applications/system/hid_app/assets/ButtonLeft_4x7.png index 0b4655d43247083aa705620e9836ac415b42ca46..7c43f3b04d49a12cd2e9e02c259d0dabe251dff3 100644 GIT binary patch delta 61 zcmZqY_MaeO&d2}+>~a@tfs~l1i(^Q|oaBlFUm9LAFf%(dA7*T0XHcBQvUK|rFFTM* MPgg&ebxsLQ0P}VcPXGV_ literal 1415 zcmbVM+iKK67*5rq)>aU2M7$VM1Vxif;vTv~W2u`S7ED{V3s&&L*<`XiG|9wd+THd> z5CnY!sdyuJtrvQyAo>KpiLcV|{Tkc)riAbluXfwSZCApL`ztB&p zx6LGKvks4K_4~)qD&oGa-YdJlW)hAKMNJd7<=t?6c^RI1>c$ifyjaM>^|&8!ey zB4!nh9u>5uen6Ve@<H5rru6h<2Ef#GQdQ*CmZOlQi~N!?9H`Rp;C% zU}CB21#?;r`&0|6C0}b-=jODa5|nEJ#ntxQ&{~jpgtwDta4hftr~G=#p@V36e4Zjh zq%J~{y26Jjn=1Nw-l*3%QW5YFE*v4z3gt0$&(*xf2en34c?JpH8+FYldo+Alvg8af-pG4(=!fyUi-Wsg z`g#n9VUcf(DFr{poMSNzw-lz>w+HV+n1ELr&SLA#LHUb0p(xWQ(1*vJ-i+1!`swxZ Z!O7;c$;lT_->m1Ovaz)0yuI`A$q$F8u*d)a diff --git a/applications/system/hid_app/assets/ButtonRight_4x7.png b/applications/system/hid_app/assets/ButtonRight_4x7.png index 8e1c74c1c0038ea55172f19ac875003fc80c2d06..31de21c0e2d383947ec4ff7c00ba44e9a9f5a475 100644 GIT binary patch delta 61 zcmZ3_=RZNhoRI+t*yS$P0x2<17srr_ImsFc1_=TQ2|yf_P{hE%8O5mTc2;W-NTsK% KpUXO@geCyKoey6C literal 1839 zcmcIlO>f*p7#Yw)M6zw!O+@VZ{?d|D~WYi~8rHRY?X-&T}Yen`g$^+EJ;z+|RV zE@PoDvZ9%#+_}3bC_5Cj8jDGq541mi{7F+&KF}W65sr$Xn5H|YrMQ2(J7%Yc%;(zO z57ax000=TsQ+1Ke@+w#iw3au3cGGQWY740k2ijH>P(6tD)S)be>gX6Tj7`<`b>di- zgWp$8Y+?i31~CzF0&E4uRlA=C(Mp~K`{74jEchB|)4DDK!ZVhSwdFyw0YIZ1cDh0S{OvfO-U_~ zvmRF*m9sWDXNH)GOyqS1Skhxbr6}s*7t&@~kFM(NW5}qh?Lu@lJ}HE;FDiLdGO>LO z5pS*%E2grR)l^;|?O5b_?u0me&c1U}%jrk8*%=Wk%i)8yp2P|kuxmKg<=(u_`oQRI_0 zS`-DNysBx=#3&qSkgA@hJP>~D+ZM(s5jI6Owp`?yE=3e`YGUqkVOp#Cp=3wR3O4hX zX6BLsN3UBzV(vI5;|SZHgOb=HD0VFjpTyfFW}GnQuh>2*Q`k>*cAmA#iUT7EXSpo# zkPm5~#I-o^cpgfe#P$=4-Pi*SpT!-@nJgp8L347xe>5EKl`=_ZFc8XGy+_j=_R_7! z@vZZMowS1GJ?Zw)eetks%~G{BTR>T}9|jt0j3Btyb*C3-`C?fwY3EY`q*oYZ39DpM z&uJ;PCZPLs4QO1Jd_|A1PF)azZJ)RZ`^-VMWr6e#XUOA%3eLG_Ch@BDOHzMk*MF0G zCo7xMd?Mg*HMIXw%nNz?%60fZiZPlqb?GqUpXO`F&Yi!okZl(n>P@r1P2i)yk3DgRwbHeNn6e|;J^SK4TM LH~i+q&mR8;k>NTA diff --git a/applications/system/hid_app/assets/ButtonUp_7x4.png b/applications/system/hid_app/assets/ButtonUp_7x4.png index 1be79328b40a93297a5609756328406565c437c0..48d0f9f018c427711451652e88e697b4ca19a094 100644 GIT binary patch delta 54 zcmYfEoFHMy$N&UcdnGOaDFIIx$B>FS$rZ;-nlt&CnHhMwnA-OxGVcVb@pScbS?83{ F1OR#94r2fS delta 83 zcmeZFn;_xG!N$PA;B-v27D(xMx;TbNg!}e5@-Y~29D4Cz{_G8*+0QLPZ;y mCvnJ|Wh8!?z4yAUT$r!ukIjxv?|}LkJYD@<);T3KF#rG+2^$0e diff --git a/applications/system/hid_app/assets/Button_18x18.png b/applications/system/hid_app/assets/Button_18x18.png index 30a5b4fab236d8b57242559ef94fb1c5dbb5d10a..2334dd8be080864f1de5b58f086b9e6825624c9c 100644 GIT binary patch delta 78 zcmbO!lQ2QTgOLFU>b7qF1*FtHT^vIy<|J1fC}>FiU+=z*m50xVhlgiL0^863JU*R0 ed_3$Dd<+aO)$9*4kDvJo((38z=d#Wzp$P!ozZr1= literal 3609 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 diff --git a/applications/system/hid_app/assets/Cmd_17x10.png b/applications/system/hid_app/assets/Cmd_17x10.png index b29da07b7166bad378fc1742bb8c14c683adbb0f..68b3be6068f9a6ff356699f03fc94569f1ef92ed 100644 GIT binary patch delta 71 zcmXR(o1o&P>*?YcQZa}1pd&AXg20gjdBQdc-+L5TL{B&{?N3(ot(4NYFiTT>z`T5k aW+VUkGaOcPGo&ss0D-5gpUXO@geCx6cNfqA delta 85 zcmYc*nV=HDS>O>_%)r1c48n{Iv*t)JFfgcjx;Tb#%uN3Ae}Ch{Kl|C*-a70_cV|9) n&w%3|*O7E(DG7&94m=F=f<)ZQrx%6*buf6k`njxgN@xNAeBm4m diff --git a/applications/system/hid_app/assets/Cmd_active_17x9.png b/applications/system/hid_app/assets/Cmd_active_17x9.png old mode 100755 new mode 100644 index 9d31b4eb3ef642f5125c8756c0cf2cf97f622ed4..9f9cdea9962151c529de5684f3f66da99c989285 GIT binary patch delta 78 zcmZ1^lQ2QTgOLFU{!IS05J;(ex;TbZ%watkD99inzbP0l+XkK_r)9K literal 3618 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 bG(Rw&RN`=2^zdL30}yz+`njxgN@xNApc5J| delta 85 zcmYc*nV=HDS>O>_%)r1c48n{Iv*t)JFfgcjx;Tb#%uN3Ae}Ch{JNMbzavk=lZ*5Gx nAIou%?a1@TQW6fI9C#QurHf9m%zx+))WP8C>gTe~DWM4fqm>=E diff --git a/applications/system/hid_app/assets/Ctrl_active_17x9.png b/applications/system/hid_app/assets/Ctrl_active_17x9.png old mode 100755 new mode 100644 index 6fade6dd77d8bbddac2007450589286af18951fb..c16df04ee42b03abd79f45b53b536d5893f10d61 GIT binary patch delta 78 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 Z69o8o0PsY2>?1Z2ur#&9Rbt#D{tY0lGRgn| diff --git a/applications/system/hid_app/assets/Del_17x10.png b/applications/system/hid_app/assets/Del_17x10.png index 95cbf7d5bd90cf775fed9f8f780933b94c5650ec..3fd55e92f27a0d18f456f5d879b37bfab43a0c00 100644 GIT binary patch delta 70 zcmXR(ouJ~Vzmvv4FO#pW)7XttQ delta 85 zcmYc-nV=HDS>O>_%)r1c48n{Iv*t)JFfgcjx;Tb#%uN3Ae}Ch{AK%&9ZY$*6J5cc2 nN}!wBa6)~|u0}=`{v!-44~Tp+Y+NS*)WP8C>gTe~DWM4fsSzEm diff --git a/applications/system/hid_app/assets/DolphinDone_80x58.png b/applications/system/hid_app/assets/DolphinDone_80x58.png index 594d62d5294997399bc3b256fbe7685ce10b146d..881aaa8d2aa6bbe8d563d04c9a0f445cbbbe8be8 100644 GIT binary patch delta 434 zcmV;j0ZsmZ4Zs7C7=Hl(0000F1>-yb00DM=Dav;R zfV4N%e7sc)sXx_pc2Fw=j81b1#%aC+R)BGZ^ANyboj05SnF4fD_c*OpN2!+mz~Ka7 z3Km-T0Br1Ck$;>G7%hzpm;o#>(B0oZWZLtC6fbZ2bdv!0Ex!*$+{b7B$=c#IzgMj! ztOXzjdxYl~&?=}DRlS$)`c#T48)<%E%dW^9z}N*=&Mo5uxEvkQD5|fYim%L_^?(QP z+}!6EKs$FmW4A{R1HNYLZm|v<>=+L($ROj3(S94c04qnv>PsvDn?`FN3gFs6Nq^G- c+zoL32S{wWDTQ(aX#fBK07*qoM6N<$g4`LtCjbBd literal 1664 zcmbVNc~BE)6wheY2!uKFLY*phgJAoI;~(9b-S2(h_kQpF-Zi@^ zF+PgtHqDL0;qcVaN)5Xvvag&wj{R2ntG{IzUnWw^ETRmI4WkK8n4Z!RfZBv*5gG#1 zJ63#0gm5_H9b}T0(Z(&5iMAyfDpT!HDDqb46vJwW~kNcFY38LI^aOT(OO4TNw@UFO4^9 zTaz3X0@M&zDwoFDnivAcz-<2B?#QLcvXLjyBwHBFsHE^*6Jci5N(G<25$Z|3oFF79 zt{0&K1d|yAVyOrc=nxShkm0BVg>_OwC(@1Cc@tix3X)1BkVqB;1;KD+Br265;Soxe zN-Rdg!lmdKR&BO2m>DO=e3Pv2Q7rOStUQ7yFovR&D9Sk235nShLs_#a3xG(35HLFq z!%4I2WR9y!uYy(*G?_=}RWxM+M$#-N-#`HpAu80Tmd;G97`! zdI?Mr{87CA|E3RQNrA3j`A_eR9kC7R5?@aPyLmlNgqa;8nw^%VblFu7XWV|ZGAzm7 z-ns8C-3V|CWLx`RUVV5?e=~JLXGNd*gA2VSy}M^liFW=t^rC%5`mI^MKJ^z*yC+9$ zK8y8opgw0i#OZbK-@bIOr+sL3X*0ny?F_5$?^u;L5LsJ%K{s=fe|&Jv>M52PH5+{E zciwC+?Q1wXec-Dn?aE=B+ip?UBV`Bm*T(s!wWZ~plEuod;*9$(j?$d6^(EcKbW!X< z&nIP6%$5Z)#Sc{zYqC;eHfJr#r`xJt{34$f<9D)}sVN9J6SzfMQhTpr?kB2_2ge#4 zPMiznH%5_{H{8XZyCE8Z^qt3(nNamZCKd_dTt1 zybD4vFW|RcM-rOAUY>VP`H4R@hUX>mS_}#FURP5QO}9;kzD&7Mf0X!18#*Cy#s=lb zoGCF8teZgFA$ z+RoI3!Q}^!2oJhss<8vOJLqi_j*V;@D?$qOzS!qAdI~fh>f!$Rlk&;`Vf`4<% z;twaDuf~1bzjhOXb@_XjZ49oi7zcZBs XY(V!OcIS4x{t4>Hc;)f%%(edjvT}hx diff --git a/applications/system/hid_app/assets/Dpad_49x46.png b/applications/system/hid_app/assets/Dpad_49x46.png index 26e30209e73cf335721ad5de82af75e923527e14..82ef51448bf0aa755b4e838cff42692e82c75db0 100644 GIT binary patch delta 216 zcmV;}04M*p20&aD{;7v2a9d%`QFiab+} zB4HFO48lWkhh8kuZM;DUZUbU=`BDVS9>H8-$|GD6rWrYT{V(AWE2e}k%~M2*4f>e+(dVF+l3w3){Ue~JI;KrgU+93KHF93 z4_=}oDniMF*Psp^BlVDY2qNo{haiih!XzSz4nYLlH>;~1+6HFc`yTK2d%yR+H&;@< z#~Zx+y%>fyB;sNkSq8mijR$=nF7C)8(*&dau+JQXdD#Y7w`vXmJfX`ukOs0kcJ?Xg z#4t~*mg$H6Qc_S%os``ivY=ZCjbWW#1xr?j0mKJDPBX&9`ut-8*VHg^ij!!`ihv<4 zK5m1)@!pIwKCJL6(RB>(EC`4|2T;Zf`iS8Og)mX#6_D?SDFQF0z~L~lA*x?W;StjY zI8QP@g{B!ih`f#f8{+w3FxZZ>H0!760L5}X)-P~Df$6|E9|Bdh)j=UG#y0DrQh z(S~kq(HhR?RiR6x3bI8pB<;3UPL!nor|SAvwgb~(Tkk)Koy?d8s5EfQQCmU78*Fw< zSwh4HGBoXsX^xa{GBspE(-|@?oaIOcZ;@n0Gu%jP2_i{C!f>E$C?Fw*2}D9_nkx7? zk&kepV1x~IFibSs!v{JdfmoZTA`B-aGVX zRHu@eXt7vC?#adF3&`9`h~1gO>#tLZT?=@<=X#IgwziYnS#- zKB{%D))Mi%8Dj3xOkGBx>gE-;p;)HpTMSo8c+ zefBe`n$2DO@a*T>{HL8qR*m&y%g0yW)(*!mue{7(*Rsh2%KfI>%hNBORKFi-nv_;| YXR*jEHmfYXNg{DrBHAlH=*dp}0hQ-mxBvhE diff --git a/applications/system/hid_app/assets/Enter_11x7.png b/applications/system/hid_app/assets/Enter_11x7.png old mode 100755 new mode 100644 index d41b8feffbd4e7bb584ba974d5f860fddd9faca9..1b07df2cfa42cc7fa9726ead54f75f89e1118868 GIT binary patch delta 68 zcmbO!6E;D@j*$TfzKM2y08+A^E{-7;bCPT9C%$B4c4h_vAo;k`QH_<2!N!6m{X>rU PQIG~tS3j3^P6VSw+1wo}3 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 S#$uWS2P{qPaAg?xh<^j66EJ`P diff --git a/applications/system/hid_app/assets/Esc_17x10.png b/applications/system/hid_app/assets/Esc_17x10.png index 83a6f225fc6b715d49746579edf2e5b1f98aa193..bd7e3cb963e4c62056ac8490e44c8e0c51d89388 100644 GIT binary patch delta 75 zcmXTTnxNul=;`7ZQZXm_&-n`{t{gmYAO(oO#CJ8m{A0_e=FHBfc8rzB$9=Md#D8NG eBSQlN28Mn09G4a>J+ztu2s~Z=T-G@yGywn+=N|L` delta 86 zcmc~QouCrPS>O>_%)r1c48n{Iv*t)JFfgclx;Tb#%uN3Ae}Cgb*^ckbAMH-EwcUH~ oa7*UI{(A>5B;7o~Fo`{hVM2xQqa${W?LaLIp00i_>zopr0QSQmEC2ui diff --git a/applications/system/hid_app/assets/Left_mouse_icon_9x10.png b/applications/system/hid_app/assets/Left_mouse_icon_9x10.png index e8ff5a308c4320dbe3ae8f13445cab6dcf950a45..1058e9f9b28e4212ca5af1445b893fbadb80f4b4 100644 GIT binary patch delta 76 zcmZofB!es!M0KuXoq#WAE}4(q{#ybJ;&tQ-D4&q%l}nAbKbBYSFVdQ&MBb@0A$-3>Hq)$ delta 111 zcmV-#0FeJ)fdP;hX$S@Y003qMbiM!p07ywhK~#7FjgL_Z03ZlMH|hRYuB-$R4fiAX zrcTZ+Y>`CNLy%}Npw;@4ZSVui1r4=KqXIq#@9Bx3xtGbmnr%^jGF3*4u>dbhAQj(e RV3hy>002ovPDHLkV1k3dDUJXD diff --git a/applications/system/hid_app/assets/Like_def_13x11.png b/applications/system/hid_app/assets/Like_def_13x11.png index 38fed467b6840df38bda05963e478d6fa951ab09..99c467f0f3887b8b937f30b138f1f818c222b5a3 100644 GIT binary patch delta 72 zcmcb?5iY`*(|B^zB7!Qv7@$TN^?j7K7RG4aZO#rH98R=v~f5_%mh2Sd!2%{Hch)c}W z=R`3D&+&B+A7AfcJj?sspQB&Nn+)&?#IsB{EaDB~=}k-LyiXiqB}pMZCmuKGg2azp zmtB72Ty)saGb2VOJx?4V7K$A#cQ7j%D)AI?R8cj`_h(&JIB#)QD>c@-Cx2lmudOU| zo#rr-Si}-Ue+ZCKLm3rVh|#K%Vj@lZ2@n5};}^*#ldB9yjs;YqLUR1zfAG6ovk;$j zlR^og`^C0DMu6Zh(5&0`_pxm^Pk_KPaHX~V)dn#0NqW7lMUQ~+HgIv>*5p0lat9cE z(j`N3qySBSp#Z#}(KqFQfm@(&&F!tVkJASrLtUkAe}IESV6;ft>mKj!>Fn*_Gp+u9 z0H3{bxroFkWdHyG22e~?MF0Q*|NsA`*`M720004EOGiWihy@);00009a7bBm001mY z001mY0i`{bsQ>@~2XskIMF;2u4-F;>o7(Xj0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJLm)>m9s(8R$22Mrty2P7CCSTKC3VEFNa;qMOs XVtolOx19jO00000NkvXXu0mjf1L^Uq diff --git a/applications/system/hid_app/assets/Like_pressed_17x16.png b/applications/system/hid_app/assets/Like_pressed_17x16.png index 0fc4fcf42c457d883742285a753d4829b15d1e45..f64bab7e458d1244afb83127c86e129d6b89b545 100644 GIT binary patch delta 108 zcmdnXST{i;jgbKeZg{Qy1f*O&T^vIy=CB@A6mxJ8ak%(=rUHl5$M;TK)T9gML@qGx zSft=n&{I9zXk8rtJb5|eZMH6L0*v_^Rcfs7wB40j(wdbrr>c(UCtvU~Y4ejHgFRjS KT-G@yGywnBJiL4V|w~_1!pX#NaMO{(-884zd99g&IwE z)j}q6w}ZX`q&TAMWCB7v`i)b8vLy=&AW(Hn>0&J?1DsBFCQ${-06QnqK%fesTIk^R aSMUOB)?y-qOZtfb0000XWPQ0?-3#61iT^vIy<|NzfnEz6r+1ZHsvMrk$8yKmwP0NT>OJidQ W-_DY|k%50TNSmjtpUXO@geCy|UlbPr literal 3605 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 M>FVdQ&MBb@0J5JBo&W#< literal 3607 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 QX&eA7&1_6djNPvM5BL~PlmGw# diff --git a/applications/system/hid_app/assets/Pin_arrow_left_9x7.png b/applications/system/hid_app/assets/Pin_arrow_left_9x7.png index fb4ded78fde8d1bf4f053ba0b353e7acf14f031a..9b6ccb51f5b8d6f0fdd285152ec1a19ded3b4958 100644 GIT binary patch delta 68 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 literal 3602 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 diff --git a/applications/system/hid_app/assets/Pin_arrow_up_7x9.png b/applications/system/hid_app/assets/Pin_arrow_up_7x9.png index a91a6fd5e99a72112e28865cd8a004c7d1933fff..4e199c7d053e412139101955ad9390acdb48b85d 100644 GIT binary patch delta 61 zcmbO%<3B;doRI+tt|@c#0Vy$07srr_Ims2rOPVwJnVAn8sjcrt7jKN@*#$ZMzB}>VcEo(xFhBigA zRfKF&B$OpfLSqS8d&l#8dVcR8Z}0is_kGT}&h`CX>-l`{D|W}MM1o0W+qqCz&a@8xmO|M3uh;cln|6OUI z@X7fQ&dki(hqbDStcmq@R)<*FE(x{7@jPF^02^V5=v9ihMb|f1hw)0IhxkF_<1H_} z1sVWgmXE~@Wjrum=ebV>cmZ0s_CATm;a}mEc52Q5C=nO}OHAzGNx%Y4+73-pK+|sE zf&F7oVIUa*{8{JBz(BDGF#W^YNC4<9N*a&_dh_-a2?DV^K)SlsK3W zOCXnR0@miQE9D7uc?!4U4XYLag5q!qVkYiDSh|^JD*)2x1yFk>+xS2jzFcTm?NE^$ zEusR=1Jt#ow51*G(vhl2c`F}0KRYy{Jo3{2p&4FwzqpssC^#!EQ$-Rz!G~$z2>|jd zoi8@^jT0uuM~BC~Cj2=+8uB*%W~pE!<+;Jls%yObfcUWvPM_P@SPvhqk>^2RtzXee zpw9{L8C-GI=@-g9A^bLEC5ENHZn8J$mR*yf;vV50J7!cpZdF6S#2Ee38Kw@!gf4MU zH~T|ofioE<=_Pgf;Tvc0l%P^<+(Zk%8H}<#p|aT+abY8Ff9Htq!&92lSLbk7D(t{E zjjU(bM04fllo5%^3-CFm)D5AeU=e^FXGmfr{&k_>d3a+)aa}=xN$7&sHTfNh zfVj6VoV5%9Nwq8SCK^0ITUx;v0I2%9`_$cJSLF_4$)r9^g5d7-;)ha7k^2JBT`QGyenmoI!B!BgFZa^nPSIjjmHP5e8zHBct z>}g(M=h3f$4B-6LI6_z_Ow{YzNBpU4Q5No3aPn%6GK4Xlo>ROYK@oQ-NLryT2hS1Q z#~TwSIW2hlviM8?O9=^9I1CPTS9MyYOrlcISt$H6?B!qJq`S6dsv#09^-K@M!vvfq zTkX5@UgaFs(|?Idx+S6ai8fy!JtnNIngF-nVeN7Z`Pkld>>sQwike&!d8m z!q}j+#PS5O1l#Lt&96qwr4S9#BN(B)eb|Czi6eSM<1zl*H{oXKxy8rZigMly7Dpp) zp0Fn82H8REqlzST12a_HGG$OL1zP#tZ!<{Vq-7t-B%@O3Q}|wsw6|$peqXmwPE3aX z2;M0YDH7g@_E4AelRGO{xVu~ql8(6}@GdRA$pQKSu8{71L+l3C5qDtez&Yu}Hxem` z6sMHXl!;;o#{fs;ZdUOQhkK4<_f9*Vzhmk6*zQY_(0iGC-9?Iy&x;P0wqt{_@pc`@ z-STVPHZH9aL>@&(Sms8e^BoA~ujOKuWnROHb2zgex)a}&rr!-4kCTs9rZGVRYYIV- zvlx3+K(QCwE72=^{7f5<=%`? zl>Nr(;dCk;g6aw$Opx=3=@VvK69`}ZZjdTEXD<)m-PPh#nON_W-)WuySB2X5DDN+N zOj#o@Hg%5&TlX_@z|RoxL4x-e)E6|2*6eRf_RH|9>@0i7Xl-rM9ANjdo2TOpy0iRp z@HHQ+`qyJ4Zd+tE9Emv?)0oNb81R+irnMuZ>Qj# zxib@y+4A&mNoGlXP$qd$YD6l2f7kv+drBW{dVN}WI%9gX}>;*m9J4X{*B+`P?WbMg?R|_dOLt0YC zJHiM_Ty3A^GkR^rdo$!_RLz|l@F22ACA23r zJ#_ne&f4MCmW}wIwZp7=nYm*E?mRDe#(1hP%3plU=f|hSpU!`KyPiO-!1Ha8okr4T zJB37Cl;}y+I@x)J6@t!yw`NAC^c%r!=@Sa8&{j3f-kx1?ksX4A;-S<#E11dFr-IQ# zR{qfyN+h{-*_HEB`wzg2wZ9!NvuB)PENk|#M_tyutK;V4i>^I8-0%C89^}pT^~d@X zrZX$TDvB#EGNXQ4%%w>%B=-r;Tp6wJtw&z@62Lp*pP`dAn&FVjAe4>`?UC_VILOQnvfFm7kYb}KIe$4b!q%cDFE;P^!}5wFhS$flol=(c zKOH`gTJ?#vwG4c%BV>!!U?s|3f2Oiv<7D3Rncea6%ttMQ=SEEn7*BSKM z{I;U9VyY&6%QWwRxn-WhQPHJ&t+6%>}7+sVXoLpPbO)$>wJq(%cIl{yAd4L zao(3TFdv5v@49^(rE$qwH>D`KxrI{ti`zebVW|0ofEcHjRC^^ydT1 zit!QWV{YB&7Fp!JzRyR>-^@&*rwXPh>}8kQ`$wvMO}pPl&We;M%*Bo=xRH;1X50$# zU5slhYkSkir-#>@IobM@-9LZpVE$4__664#r;U<(Fif+aek4~_5ISPczF+n%G&YJPZd_dwhcM)XK$a~zGT6f@?}u{2kzI_J`y5h z5613ABWPopVbs3NnT+5kv=awJUz(1+_-pXaxwBvFzTRqoHSnr!F#SULqTm#orO}0` z4PcuJ1W{iBF zKEPVWtf%|A9(S$wMs?&E%QC)W%H5Wm7d}tKyUte8et?%f`c=!1mLN-!R-v?wVf6iz z)G6X}%Z#&ODdUID)ZtFfy9=wnb=?6Uetyt)y~(QPyq;Dlr>K3}Q=wY9_%mo}MmAXZ zJ7&N&B%XPHy{2#D+xAtlZx_lo9}?@xLqFZ?+&f;mh;c-PqH;Eqf4z$u?y_pN>Q=E- ziH*-zQc@6+ub%g8PZ}Rf89BiysN>^Vu*|b~eTqQIXzO`L8nmD()4q3juuoh;Z zx{Lc)DaWwDG3=>cj9@&S2$*_OJ%}J{GTxhrCE`61Z>_G%gwd42_vIJi(910C^C-NfacQ^Sl-eB6%Xg&U!Xb8ybq}LqdnpiS{AK90(zP z1Ord7u@T6SiQp2Di3~i5N%p4%Aecz--@FL!dP@uegZ@@w_#wgnaSCT+2SQQlM9?8^ zm=*yFg@O(lXcIm0a1R|XJV6r#hr(eH8234(1v`X*>mXnTpnnFKYmn~gg}|Cy{$q~2 zLxO!63>pFg2@Vd{4%X48(!C)t0|NsH6b^yIwYVBu0W1mw&(xv>sQhLyCk7DcBpQQ6 zrGT~=@gCGb1`^D5_CHaOY5&qv0{+PqH)jwgo(6$wL${*(t!QKO|ErS8|7r&?u*CoR z`+pJ#IIw6$2$mQ?4WtvewewQhGDSn6=tMk&N_U`A{eLIY&WFmN2KZ2EAh?b;45V&@ zCy*#xlKp=}Y-|wLlmG^vLLge3Bf(q}Z4${7VPJ`Z>caJO59#RW!C)3BeO)*VWoc## zg<9yK4D<|sW6i0AKr)fS_>J}aFIMl5*sX>j)3}z+iF8sB(bJMnC4>Hs8bSKAFYrI| z{e$)VvoAV-#6q~vK(=c8ziRzk#BHFh<-g6#-Td4BL<+a(>D=bN76lY@FUB@IjDy9m z(5*YN-4s*8oj}&+rVh+L4|neH1o$j1E!71)pl~xe=$Un0lQ15DzW@MOBBhHB}+m>LbCLY=Y4wK?~kwVKJMeb&hxs?-|t+n40QpA+b4G8*k_>A)gsvzul2%)`{+ zGXO-B3u=_{$d$PU5YEZSn%Bo%6nB$X*pi8HtvlN(j>)<>oU^ms-{SJc!?CVM_kGpq zD|mb=fG|Jac@dmEE>EYKyFP!dPw~V2q0~L3V4zJ7VgZs-lDyFoU9CnK9lA z{|)s3FeAcdMKT|ltq9$x0m1;iQ-6nS!_cqj3MXxM0Gt2}LS)A!gg7{$QQxIe9%xhs z9ymYp6$g?4Aeep95(3@bioPky5s{%vM(c>C~+;D?q3rCl<9Vk3~u)C^5I%(w`)RT2PH zm)f7N?K9(ykBtnC`Hctjzt`uk1dC{xK3DmG+T--QM)Dliz9M@cHh&jC)x2t{F@ZnKih0C+}OXW@w z`v&$?T!Pj1rsQGSiPMN#jg(cf#BeEqd)~3u;mM}Qyx`i%uR_AH()f-rz&vtJ?~1BK z0wCjWh+r=QKw`~Oyt$4L(2|<}2>>cTD<8d+q=bD10syO=GrJ#HY?6E~&#jfte6C(u zt0YX=Xk{+Bqt-;ma^pzUR`Hw4DHbX&wa9MK#}7nQbGD=p$&@~a?~@uIls$T8lCHGT zTRHoMa^-n3QHw^99AP{1;ufE{Zb&OgDJ@PELckbai^>O2T$Dcqsc&TD3l~}jCU{~r zzv(gLjjtXx|H*H&$^=ebjw433!=?SMd>|aXa>3gB5?)oiL6JC$H*$+NBC6x}hAF7kW)t|J z9m26ua#NsV=VV?4pXG3D@mM_ij@FcBscZ$vT`c+>{Ka38#5<0qS`o5Kbu1s`Lk`}C ztNnHRw(Z$k$NrL*^Gd|*kZ!s*;vl|Vi-WL}unWTUV)XKz^G!Qs$eCE}Ne-py;|QoE ziVIFnDC2DAI9^+BdO1=ikF38qj1|k>fy+;lJzzvK8x_5E17Vq#bN5h7VfH)F-HXT@ zhwUgiVNOuz3x#rqq3K#J8H#9LzFuDEn{={2c`*Pw!K@JLkKSgT`X;p_=<}wD@rmf~ z;gVA4rJ@@!K08%{R8FWAD3_@~)3CQUyiHAObb-A`sHOQ|-+Z0sir>Ak`=mm`YuRLE zvRiUw^7vgB*AQ2;PWD|1mwT?8?;UeHb=$`Ek<+I_v3H91It$fZpB3&YZpDS;;+@(K zdF54mt)Bf!lqxwNW0P|pljlM#d!=%9yW%SZX%=tU#c&gu)D60B?{lPNX$l**VOcE< zdIIZ=4!P^c^-J)}8av)1B>n2);EeHy%mc04Tcui0=!xi=={@WUEb=RgEZW->(No>y zGtHP*oSy9AhtjjmvvjlOkrd=&s943GibEAK6}_QtUrgT;C)pEX^RMTnC;HoM=PBRw z=9RwiyZG%Idtrv4Jsg!__&(xHGl%#&=sLN)edgTIoh`h8iiEm=ymq_1zsj}0Uhw~9 z#8NW#s4ujm8iU4JvG{?xr?d;JWxCeN2BzQy;MMf~vb=1*A#83ixqIOEV` zVaGg#~3WwEx!kV?Q+q$;Ioo@pT$VAd^FJUK|pMWk7 z+6G@N*C4B;DJ`9n-?bZYSO3eQQfKCI=Av#Fcf@1azbbAvzVOP^{k?%t7-9b0z+hZ3 zaVn!cs{C&G8PM z+2JN0Mjo7#`(m!krk0qEMuRP#pvsP;1yp-=xo_t(VjQijbFbzedRSI|z~tIkmRs_| zzW)8E&_4stJKBW4G7xjb>97-2u07S9vv;%V`p9kjaQuUwaZ+YdW*$z8oKmXu9#*!q z%+XIrCsAsIJw|!0mU!Xy;)v!_$Xu^Na16FRuM}78B&~>r-qB$lQ9i;d$5deszcU!{ zTl=!4DREZuWEJOuQ~85O-Q_Hg*+EE+^)p4ySZAeheYhvC!k0y!={Us;;FYATIt}A- zuHORLec$46(H*yLp>@u>8zvVfHSws$-w!_}DiD%=UHO5jok!eG?^a6o;?lWyihn$? zDIXhlckt>wInSo_^n5%}_Ii2}Gnqe0E+&@qiXwmuR{ESqQ+U(U)H80A6kIb79 zf%9=Kr7f>pM2rYV(?^=0aC^Vq+>^Huk#*XW=eAmOudMomc28GLfB11cI@{U7;B zQ-8QzAye z?YX)QgQSmUMA3ROrqjb8(+}^Keqk~C{I7xACr^BG`h2tXW#7w|fwa?Q^Pou#Tc-nA z6Ux=gqvW7&R`EYy$;(ndrfyqZ_A8PP|3nOJFp782&dJ(|nq3+>oA{}~w;(&q!3^~- zt&hEkT}cb_JmgvBk8aC0Q(}I_mU%5U&3zn?_nfJue}^pk^lFtIEJ78dY$NHbLzw$V zXp^Kx-n6?(G4s3qJ66M%C`$TCPDSu}Lmjrwww;{p%X+9*d9fjae!jTBR?Bh)&695p|Np`_A@%C6Gkw(!c ztlQ|bD0BfD08GqSbOJGm#02}0{K-@lg#WAt0w(*SAnr!?Fncs1cZ-)AAzU~M!*noC|vOF)r0RvA`FmlWAHx@MBtF&>xaZy+5F>9 zprIfEOeP%(g@%WR>xUcY(-{6xxUsP@6o!Bz5PAX&y%08)Nnq(wLo|OgSdl`A3^JWb zrcuG`j07KAC=&${1pA*XDD;16sUiPVN>DQ>i$I6M^|Nl)Xlz**5m^jjZ zpQ#thS=L9?WiG40+mRzvqC`xB>H5sFVffs4KqX-!S)&$7{TGz=zWF=INHY2 z0tT}-KpPtw|HfL;h@lh`mH8X%`(G^lkJ$BrpwI=Ltw;=V7|GX$L8E~G&KgPnV=RW& zf8_fI>-)!83~m01g$ja!uJ`tT_4@agV1U-ee}`9~{5$?6s$k|Bg5ln!QST+V7#p3i zF4n&y*YC(C3v7{K(X_L&aAEcMczb*MMhV&2h)M`^tW<_XOB8+kL0OWLfY3%j)E-d2 TFC+3}9cE|kU{!4CefEC<&8td2 diff --git a/applications/system/hid_app/assets/Pressed_Button_13x13.png b/applications/system/hid_app/assets/Pressed_Button_13x13.png index 823926b842b8f9868fd70d6f1434dff071c04d5d..d0e2c3a3735944e80ec2300afd68f40aa5f90ce2 100644 GIT binary patch delta 71 zcmbOx6FEV`k&yuiq9)wD2&5D|T^vIy<|O|JI9TA&^zs0^8XM1r0|$>BIPgT_z=wrQ Y3=U`9wuDcQ1RO(?0Mk|NnE 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 b6{VMJBCfGK_$?xl4ASW7>gTe~DWM4fK06pk delta 107 zcma#6n;?bP0l+XkKaN;HR diff --git a/applications/system/hid_app/assets/Shift_active_7x9.png b/applications/system/hid_app/assets/Shift_active_7x9.png index 1ec9ce11e8a8c1ea00673280682e896435e155b4..1dbb762f954a2c1934ecdb640c129288d5028925 100644 GIT binary patch delta 65 zcmXR6nIK`q$N&V_l)3qUl(eUdV@SoE delta 94 zcmWG3oFEa&!N$PA@Grt_F_5zGba4!km|EKB$j4y7ap=IC|M6++Vw)D2>xOE2Mr3VL yyt&YkZJDG#N5bC9KmNDo`G)5Fd&zbC7WW=?LFwQ3MLq$|VDNPHb6Mw<&;$VY%Ob`A diff --git a/applications/system/hid_app/assets/Shift_inactive_7x9.png b/applications/system/hid_app/assets/Shift_inactive_7x9.png index 1cd97076edc7f3a82d640aaf6f17188ac42c6b1e..696e7e9eedaab871471a38dc72b337afd10cca6d 100644 GIT binary patch delta 64 zcmXR3o*-e($N&V_l)3qUl$587V@SoEzopr00oK>m;e9( delta 97 zcmWG8nII9v!N$PA@Grt_F_5zMba4!km^!u3kdMKDgX!Rp|N57gN@d+zsN?3>G({z6 zV#`_%c01`^g)&S6a;IK>D5)&$J=4A~@toXsrccuZ#gdoH%m*67;OXk;vd$@?2>@Nh BBR~KE diff --git a/applications/system/hid_app/assets/Space_60x18.png b/applications/system/hid_app/assets/Space_60x18.png index e29f50ae9220d2f9a9753850dedcc6be0a211e76..7d2116ad5276af2c272f4a44b84f9a75037c9405 100644 GIT binary patch delta 98 zcmdlkRx&{%hLHgX^c5Rs0x4@x7srr_Ims0Vz#!qkrvLWLKycWV?e~8OU=(H+xzNm5 mdW?CRiyIpVFsiY4bTBbE6!Yd6HnB_s8RzNh=d#Wzp$P!;#v*?J literal 2871 zcmV-73&`||P)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv 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 VN_%sSbR7Ty002ovPDHLkV1hy!X)pi) diff --git a/applications/system/hid_app/assets/Space_65x18.png b/applications/system/hid_app/assets/Space_65x18.png index b60ae50970b8be827ae32ddbd9e1b0d28c8b3a9a..eb417f674680d75b68feda04d9429e35236bab9f 100644 GIT binary patch delta 94 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 diff --git a/applications/system/hid_app/assets/Tab_17x10.png b/applications/system/hid_app/assets/Tab_17x10.png index 4d8471483e54ac930794fea6828371cb75043d77..0be2d938c856fc1f5787d34fd1a2aa519fb57ade 100644 GIT binary patch delta 70 zcmc~xouJ~V~!pEeEC0+O^uC>BW+7sf>6cr14j-V aU|?7$$2LX2obv($5O})!xvXO>_%)r1c48n{Iv*t)JFfb^1x;Tb#%uN3Ae}Ch`pViEVs|Cbz5-Q4h g8y#yV*a$E)Y$_66eu`IV4p1$Fr>mdKI;Vst0FH|oF8}}l diff --git a/applications/system/hid_app/assets/Tab_19x12.png b/applications/system/hid_app/assets/Tab_19x12.png old mode 100755 new mode 100644 index 4dbde3babfc9f03a485f51eb8442602d46090bf8..6748d1f4978fca668023bce4b62227422582de80 GIT binary patch delta 91 zcmcb?o;yJzl#u}lR;=Ew52Q>yT^vIy<|Jn%1SI_Y|6k$qLVF&cG#(xwp1nLeJpJVc ph6V;8yusi^n^EBu=NmmeTntJpIo8gauNwt2$J5o%Wt~$(698cb9wGn$ literal 984 zcmaJ=zi-n(6t+~Ulqy9?FaXoZU5eEBY{&Uwt8PhbheoQaC=DV5LofEVu~PeteQlf$ zmG~h+1p_-1`~irKfdPTUz=l*NHby2k)^JXfv_pd>`@MU5-}m0T_xZTKd3Ry{);z~? z3$=B#!R$5mX69zt_rsNg_sra+R*P@dcFT2#FsuG{>#1B_VRUn1VLm^#Yy$^YIf8JXh!M=WWpr4czh84GeYpY--(HMb`DFTVV7sOhk^Fv;Z`DqyPV3Q=olyyW=0!39o zC08ltbBekQWKqsRF$d*bR?2B&UQ_a5^zf`;xmvYcDu|{b$yT)>NtRW%q+&@i zq(a%WDw3*ZJN zrDm3!$M)Ji2b!PmVvAUb@fUyngn3bwgS{nwb;1 VWz0QT7<_jao~v1#=DW)FFr@$h diff --git a/applications/system/hid_app/assets/Voldwn_6x6.png b/applications/system/hid_app/assets/Voldwn_6x6.png index d7a82a2df8262667a9a03419f437ff9b350e645f..d6d7e286a3bd7a5d5e11d1032bbdaf3466b01807 100644 GIT binary patch delta 59 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 literal 3595 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 OAoZTEelF{r5}E)TyBMwj delta 75 zcmWHIn;_xF!OXzGFsnUW6G*WI_=LFr|NkGz3_WzY4oC@mx;TbZ+)7F~z$o!?(+L&^ aMm7dUe+HHZQ^gyA(hQ!ielF{r5}E)oqZQZy diff --git a/applications/system/hid_app/assets/backslash_button_9x11.png b/applications/system/hid_app/assets/backslash_button_9x11.png old mode 100755 new mode 100644 index 6cac74a57a1094853e8b67a936685b77211a9b70..e579e113ec9c4d9ce1f491ad25887e337abfb198 GIT binary patch delta 72 zcmeB{iJBnc#K-^ytxB`D0VzdK7srr_Il4zS3Ni>VFl_u09C7=Y*@B5mkKeuMn3mD? Y%ib%TY1%{2ti2#jp00i_>zopr0AD5<`Tzg` literal 3595 zcmaJ^XH*mE8Xgv;HC1DIy>sDqWh0E^wD3tO(q&yY9U|?%p|P=6k>IywCHtXU>_4J?da3CB9c2001c) zYrHdm731F$qJsQqdNffR0K_fmINVVi91g_hu)OJKsQ?f#nCU_zxXdbGR!5hywlSeM zY+26oq9A8%T&P^4hK{P3?2#DNI|K4g4LdC?gp}K|V+7;lL$As^=}KM^e=jnndN)4e zUd)x3>*K-qeBaite(cgeXvNpHUCn7riC(8Jl)OAoQ|8JvZ@?t!Stm zU=|dQ%>~RX1wu1ZHC%vfA;6=<%X1Pqst0&zUi#Pvgl4X#1q%S~H&o>XvJ(N&ZfXo3 z@Hq?=cOScA0gzyToVRT=3V5#vz-)-#)<9VmP~RmhQ4WYo0x+kTNNqqU81QIQQwsnt zrvY-7i$vq!4wlN!=+0=zr>5Q?X~w#fUlK2F(i%_K z6F1KO9%B4`b>+je3H30<$uKLSwGWN2mhE!(bzc{|>^b}~!RmXJ#MXC}K5(;*XEjMj zZqjL&Upzkj>JlOc9E-iK{o+9H7G+{gcU{nA%m64mVKjIE7b-5MEZ8wu%A(K08dO%v^c7VUKRT z@VZ4(Ww;m%hG zAXjUZMGWUBRP+hUr-_H#07Urrs9G!djj(bj%p1waxaxePy_YTTO1!3U;pqtq*%_}n zkM?4&8s3?CUF0J(m|%iyh1GxBBZ6!`3xl*YVILmS6-)B!cnB_*ENa@P!7;dIBlTUeID}^PwV!Mr-Y4|#>b2};I;+j<7G&sK?^R1`AEfw} zi=b}kf)2JtPGwFtO(Cb0r&Jf+#WOw4{O+&0OlUd3Jaa^8T6S80T9}%OFn7I|?mUuz zhp^Ki;W)PBPNnk$r|A6M`sdP7oe>H)wmBttZ}#o=QS@1*KlsFbx^v{_eutFT#NLis zt4}GP1ebY|Qc>~|tuZt$rHnlyduU3$Jr7dta+Uhxlv)WeBlwrpnKYR+mMcl8Qs;tv z;!E+HM{a7|RMvqK3JP-zM++rfms~pt2?eKIE|yxlB3&j6#NH$qxfW&~{oq09+K?ZWBkIv zk7cX^Z5{f}33sx|43|T`NlqERoLJpse6Qc~7fYF|^p+Eo>XVEXM$0`7VGUIcTl>%U z^Xbm^)w$ZahwTpAwRXPhyxaLU%^(8*KVm5+F4i`@1Cn9_$xvw@IUdxzl9^GF z(Kwes^kCj_o<1KveEXIDZS5>Kr2p%tHrxlN=^j&w+c#mpW5pqkIL9#B;~6!m7c`Mr z@~*5ZhgY~tUQjgoYQniaX)RB?JN?S2zN)RN!?B5#bvkkkcS&uFvK6$|1LTDs z5TFUhhM9-C|FpgqbV2obyeWE!`n7yu&irb2wYj``LU>8|bVG@%Pus88N>o>8Qo9nn z=+co#Lq5HIEkgcCj%x~$)QpUdBu1IWvtvkmd*CSsyq;m4{}}!oJ{donL4!M@9_Sr0 z&@m~5oG~6WdaD1_v<2er_Nt$hNwPU>yAK7?DK%uCeKz)eZYg>qb3$S=STPmac9I=< zr>k)}GEboZvP&18Y-ShZaOlRr%w=`*6|Npw+|4@>FCN&a(nteCdklMG-s4W_>~~nS z*0B$|{%c~bL7@5zWRC81^<~Y1YqfS#b|V?+EQR#*AO-@1u7gKhPrT-bEmXBns-%6U zee^!xQA~|2-+aN0tAg&oDbns+ajkfVo1S5Di_9ZI0DC=P7 z+^dS0L)VOME!^Ik+ts*h{CZ_hlr2$Dh4itm_zbGt*e`HMd{TbL!Kh=x#l}yrRO&GL z9gF6ODWxHG8bS8HVW%2ihBrJG@ckm;Dn1=~@yqbLxs#40sN2|M^0%l=WfS?>E2VNn ziYfA!-fIm9Oe;sTUOrD7zVWD_sJWWb?cM7=`*Bn+%UwFTFy&*4G*fC|@R8Kmu}5<& zUoD29DVU+bohV#86kIC=Wm_75#!L?uYf9)S~ zuU*|RX@554D&T70@7+&bw^^@PH7$)ToLx&^XPhi?VEE0o3ib+ah^R?dzN>!IuhNSl zI48V4_{B=P_2*}snF~BUDMKmOUv9NbsIl>ZQ?sjLW2^h6(1Yi%1{aTu^!SsJhDV+rw`7C_a)I5yRT;6%)A%^ z`F+@9=x$~3j91s#85!2XQ(5kKufdKhHNC-!B zqpPE4fTuZMQtMcIdf9Bwd;m8R-EZo?IsATM_|lnrUiMPYu+^$?WJLF7;!1)HZbw2| zLPwNT)R(M7CMeW|DQ9E$dmgTv(yfuDxOsQ8qf}7=8nV{^813d@rUvSE;ERA(xg66n`XH3k4dZ90L(CE44d zy;uwgdD{mPz+m&y0AOqyz$Sb7Qn?^cDvi#>fEQ|>gF$o(223=thuO1nR3Ex^5Qpj# z>`jOn-C$2K)yvns09(L&2awT)4g%@SjPM?2m$Q zEDjZfg245>U@$nyh;Qi|A`YQYMn*=uAOsA7gu)D=2m?I?5^Z3FhU58polMxhxKW#X9?=lSh46T$aBNiw!~; zK;R%Pd$JduxqYJj2gKeUZNv2El9^sq8$1TgCxOuE6ttzK5e$a3G&08_&Eaqh3zUH+ z5^IS!KqAfYNCZy*2NuurI>(?gxj(R!|6mXOBX(O63^qS9p30%0r&26AEC%S0s?qfS zk;@??EF5Qu!u=!PUs%dN=VJJeSSUXk==N;?Yt}!G_yXEC|5h)5^SAz~Oupzje02}J zPRH`!4B?}81dFY$Exzg6*cZZI@}C osV>i_@% literal 3612 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 V0CdlhVa7%P7ACg1a*SKVzX6{fE$jdQ diff --git a/applications/system/hid_app/assets/backspace_hovered_9x11.png b/applications/system/hid_app/assets/backspace_hovered_9x11.png old mode 100755 new mode 100644 index 17cb1b7403b155769fc0f792b3cb7219fefd8cfb..a4acbf0db8542db823e6797a80b67c974c4f789d GIT binary patch delta 76 zcmbOu6E{J^jgbKewyx`*4y05)T^vIy<|HRHFdeJs;qmbSB1Rq_88056dL9Xh88Z|f a1u!u9t1xfgsp0q$q|wvW&t;ucLK6TN0u=@T literal 3612 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 OAmyH}elF{r5}E)Ar5HE> literal 3593 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 DXpAVr diff --git a/applications/system/hid_app/assets/brace_left_button_9x11.png b/applications/system/hid_app/assets/brace_left_button_9x11.png old mode 100755 new mode 100644 index a61db48f369b3a565c9e2cf025f46e30895534f0..56eb690434cfb7376542e4c25c10ade46fc1e8e9 GIT binary patch delta 74 zcmbOz6Ei`=g^>XWT9syP15(PKE{-7;bCUnuKk=o#@g+aAFf#~U=4VsmlbGGw*xAa+ XP+`n6twHliDM*{AtDnm{r-UW|L4g*N literal 3601 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 K_%f_p_`d<5jx4SK diff --git a/applications/system/hid_app/assets/brace_right_button_9x11.png b/applications/system/hid_app/assets/brace_right_button_9x11.png old mode 100755 new mode 100644 index bf6b927f192184a6bac5eb2ca1bbfd45d32bde4e..8df2c19ce88c4eeb1766e50c9d6cabf4b472dacf GIT binary patch delta 74 zcmbOr6Ei`=g^>XWT9syP15(PKE{-7;bCUnuKk=opv9r0c6G#G4YvW7)p1;kFo(+r) X3H&V6-X|;x2Wj(k^>bP0l+XkK{4E>^ literal 3600 zcmaJ@c{r4N8-7LhEm=Z3W5^aWW~?(A%gorag^`gKV~jCr%otN+DOs|`At`G_WnU_a zgtCQ_5t5y3NgaGy;v{_IoYVQfKhF2P*Y&=?=lxyxeLwf}{GRu^-nirTmLh_3f&c)B zSX*J8II95X7UJjTJTqfl)d4`zoPxm|x5i*VbOz0va-IYLfy3F(WSsN7G-`c(6>Sq6 zcGHIDB*hPMLdSZba%|dXZq6g$ksHgMm>8BI<)|rqO>mHJM)7W9 z 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 OQtIjI=d#Wzp$PzH;S{O> literal 3595 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 E0Z1+=g#Z8m diff --git a/applications/system/hid_app/assets/hash_button_9x11.png b/applications/system/hid_app/assets/hash_button_9x11.png old mode 100755 new mode 100644 index bddc7aaceaec73be99928fcbce82d9e9094c2f35..0a3974f643651a0354f89aadaa299081515944ee GIT binary patch delta 70 zcmeB^iI^baz{mgutxB`D0V#P;7srr_Imv(SpEz>h01$m?YkVoiJXx$qB(b4`nIZi# V%d}e;_j`l1c)I$ztaD0e0sxk68wUUY literal 3598 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 J3Dzy*{{Rw;E3^Or diff --git a/applications/system/hid_app/assets/percent_button_9x11.png b/applications/system/hid_app/assets/percent_button_9x11.png old mode 100755 new mode 100644 index ce12dcbf1e42d9c5bb2d2c0c8be79c495876cd92..72190605bcb196dce3d7afa61051ddc9ea88f1a2 GIT binary patch delta 80 zcmbO(lQcoXi;)2cT9syP15%ovE{-7;bCUnuKk=oZ@udv2Ff;RHIp)bc%$LpCmTl+p g;omdKI;Vst0OTAPWdHyG literal 3607 zcmaJ@XH-*Z*S!eRn@SN8Cj_Jk2?@;vLP_=2C*O= z6*P)~(gYL%0Ribs5s?Ajp$H@G4bC{<_haV0Yu)>t`>eh9+2=gxu5}ZRI#^4H?h^$7 zK*H7r>&#n4c(<4^Kku0pN6-WSQA;WYbJP}t0Wp|#AL>~$00a$iTqt;#X*tx&$P(Hv zKK!~J-C0%`#N-gTR_F!57t}2#4AkPXYjyX>ZApDaXP)2-kLIgor5v^s z4wnJULz2+<0dp(9a88Dr3y>=Sc(i(Xjsr(^01x#`pSyu@&T3{TAK-pnS(Yz11pw_K z$72CsW1ytt*kwzAs0+yW*fk=64?2LZEy2eIc=!~kZI>1+2ZY4|U8ndMO+X+N@Muv{ z2?C-s0U4_Wg30fP%A}{Xc%8~DH>p%bSVp)D>jVf92#^CB?Y8oVWDH3=NLl8P`ru3j zc!a*x$Hlh*keedQt9EfCs9mzGz1=X0D|uSy>r25cu&3wv=43}P!yEuUvBEkxwV@UJ z!i@#PX`6Qr&I$OQ63acelIT+|W&Q-nogN@8GPZkTdHZT*fB)pf#D^n|Xm`>Z!o^KW z{pni5#@Ro@Ox9PHKfV}KjewtwuohVTSpRm(K5u`=HIZn~q0hrchD)|I-!jkcbZ zL@k+dr`-Wb*sLpy@H}t=`kLmegI!zRW24$@{HCJ@z{4}9e4!~i1t-1uzuBov6Ir!m zD*&)iMX!6WAP+Y3p zt6eL&zi#JHo!GjEVKiE`u^ugr7WEF_&-BnNi9~C}wmnqR@_@cKSJJO_@{LVpNJ8pe zpGl$^Qr}6!IdvM<5h4N>Ey8<9$^-Fyo|lO#Ny74(F{{dTHUhg7RY9-gWt_lvDF!w$ z=gWAItBukEin#+3cf#sA=(oiKG+n1_N(ge8W1rO;g5EzR|lsS*gaNzzUz<1 zy`FGb9MMKwrFVDo9;kF^Jf_h|b$0>=u3mX{hwY<#_^#buR$cziD%0A9+4?s7R8n6L zc>9$LA+BqK4zw>-@keu3(S;xhzCml$@wuQwe?>( zuT_2Y+|MoNO@1BP9|IIW4+bXQGKOfULf6Q@&TOQH%_{j>ZQcmf?-m227{9XB#4yg{sIlYvIhre@Qa|@p;Je>R>I9SG| zaW9f6p7NBZugV(cQfpE#KEL?u21-aGu3xfP>9|r@;A5r?@)&X?tNrGj*~M2&Y12>& zu|vA!gWfoIPpf7lmE)4#ZB3DHA`Z|6Zdt((hb<1Lzuu(?00M$b|jkub3{DQ zIbxt?S_C;`GGO#v|G8Nc#K-Mz50OK(J!`ig0nsWm^gsJzbbWR)Zj3V~HXbUU0c|pX}CMW#C^rcR9uysy-FYbXm|%&?v&&p9 zT90G#EFrxttVS&a=NECR?oDLf6F$EgF;~&an2R$*eX}PWiBPxEC#3JO97R*vgv(_z zgYxOJmp*6=1x+f((ciqx9J>Cvu(+|(yThl;XZrJqPL8`|T2cDvbV+}S{(;95qsJc4 zE`PHegr>J?3|2*PF_m{;nmnr}=f7@mGd9ED!!O~#;|=G!hM$o7R{cBY6ho`O>HpR< z=w7|DVfy;Tpevs%uE(c`yk@&rv0_%1P&B=ownjTy>Oc#aZRYRd-w;xft9{fe>roM?=@R3FQYwEysWOpiMq2mhY2IpcJ zV=hCcCU6xykQ^wWC?I#wVu@=e)C-)GZ5wad2Pt(4#zM5>N zb~`p#-K@$gt32UXITup%B-CeRS~16{eR!!R_;WqDL?IE<;j z(cW6s&sLu+t#+(Fy<|RX(T^F9>oIfR9QrUnbm>ejJ9n{j$a+OECaPmIWjR?2vokp} zxiwZIb|&YrDFQKO#@v`*&&PClcc|saZ{FE#Et8jnhOPF@^tE?pbly&1NKbu9yO6i> zwRT3~!C+H;(}5SSgY;mhmX58>*0G1!O7nL|r5qXrb1 z#^U@y~CK<5srhAe>wlorj>`W$k2M4?+n*ad6CKXR)5pniN zFFFlE+QvYFXbc`308Gq+7$h%0G7IEMrcnJ+;Q6YTU=YKy~3zI9!K^&#{63WMlwm-Q2f!~Jh4jrKP> zkmXGNKfnJd9EcBQkfF}xK>9hR7w_Z%s+CsCxXV{WyX@3)bnI- zD<+)=`cXBK`tM#0|J}=Xu#9Me8&}GL6z%q9?E+Qv{J|l fPHq}n767Og5QqX~%r~Nc<$(cPO9yNj+9UG6>eVio diff --git a/applications/system/hid_app/assets/quote_button_9x11.png b/applications/system/hid_app/assets/quote_button_9x11.png old mode 100755 new mode 100644 index e96d29ddcdb5ecd51c261269e782f663c6f72d52..9fabcd26cd2b35239a0b68293760ff7cc48f9725 GIT binary patch delta 67 zcmeB@37sHe%g6u(txB`D0Vx?z7srr_Imv(SpEz>hz?Zhh&PEXOWI5KL$lw*uG)?Q6 QjRi=(r>mdKI;Vst02#m+$p8QV literal 3594 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 CZ7IkA diff --git a/applications/system/hid_app/assets/slash_button_9x11.png b/applications/system/hid_app/assets/slash_button_9x11.png old mode 100755 new mode 100644 index 60871320ffd6627e73f7fdb54085745154411832..b877b9106de05240d67cd575ee302c1c00fb9113 GIT binary patch delta 72 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 D%k(OT diff --git a/applications/system/hid_app/assets/sq_bracket_left_button_9x11.png b/applications/system/hid_app/assets/sq_bracket_left_button_9x11.png old mode 100755 new mode 100644 index 0983db129625c9b494df43f660b220f91635721f..ea50cd657c3fe1412460e488a686b4b1e98b4458 GIT binary patch delta 71 zcmeB^iJTze$jAT$txB`D0VxGf7srr_Imv(SpEz>hz?as>P9S3B{F|8YC@~=^fq@~& Vn|WGUUHwat9#2<4mvv4FO#qe-8b|;D literal 3598 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 XLCnn4oL2n*4btQ3>gTe~DWM4fb`BYC literal 3598 zcmaJ@XH-+!8odb8n@SaNLO`03kkCvZlq5810zraU2oOTV6hbrC1sR9Dhn=}y_;0;9>X)nx-^WKl=yKCKhzH`>z`>SWI8-2>gOo;z5KL7wi7Uo!c z_R7b81$a5x-;_uv6#(EjA!9J7EHD@lok8;?Um^m4-%y$Z3Fj~;fm$D1MO#J%-?OCI zi}Ql)(YJ!d;uKZo_(V@e$z=|T+tnU0G2xPF&WPfSi3z?fZl@-AlYf9`TJBLy*yE_1 zt(y~pkG=b<)<3uJyzDoaEnG<}?c}N96-+SKw9^h2%tIeN@F}dRp>bjwVidx!KnFy5 zOFiU#x8*s2jUavfy!W_fu(;6^ea zX1eU8|NHS`(OFe?rIJhZD-;kWAuhb?K0HoNkfX{S7Lv!sbO`$hDMpYw|72-+h?dBw zmG=OU5hu>hc4gbIL%6u3Lno$8_=5V^x7@p6H@B&sna%>b5dcgugSvLqprwa{^|*s6 zJCBYna(SH>$hf?I%dZ#D=ADYc!I|mlfs+kr7ecGkwH;F3g&L>r zOMe9EZ>_I=dNZjI0zVgG#R~&U6psox_3P$$JI7D4aT*BXBQ1P0^`(k&$)Acvs4nrGixT-0bse3 zR{K$zmowNaY@(C3yJWa+mT?RS_O!U`0|4i-3J_dtsbLc@0AMphRG%5ktkz1Y)o>rF z-9J(*u;r?A1Fg_dhZaTidjub0xT+L}qLm}spUJAaLO&YGYSq|zMa0vEA$5+ggi&;n z?*!iTTIH$`J}%>C-a`brp(qZwn|S#cUdiO}4Y^u#u7kG}KrK;Xc3{gmZF89YO&rM4 zTy`17*oTNbYx+7)uNi=cZbej?!S02W*r7fOzQk1I>K?vf`bgk|2NRYOE0K}b6ei?1us`k)c=vOp`{<7bzaihD#cd#(MPg6KZ_%?rqP(g@Of*ho7A;vFc>V;}eX!fKn`$pVr8x_(-7T4q{q*@ZvN&B*7;hQp+?ee1=O(leqnS~J|lB)GBT;}rYR+)Ug7 z?btKuqRcY;r*@IKhqNxIAlkzuEG)B%9^LOb>?P^7PJa4@`TD@<{i8OCADp_|=FGk% ze&JkY2?|Ashc!i!l%-Rpc%(?uEUBkSR@u@$x1^hJ8oIFgq}gPVWSS#hwM_M@cw8(0 z{gd|<@5`t{ae4XK`D6J4jw_CBxY)e&4%doJ9W@=M^7uX`6gcLmotk%$aUkXC9Oa0X3yoCxPE{AA0C_Zl=yn02oGHF}3 z@)jyTFB5^$JgMnaYQJ*N(~xH>$!FsM(}r(WIVW)?=;oN%lFFotOtzL)1&nysJ3k>Y z0bgKVU{_!^U#(NTkdu~OZBpsH86s@lbW-W8k{KzsV}IJL!=S@x4u6h>H43>_49WM- zlF6*Zvffg27L(H7oDWX7qUDVFSI>Swat*qT+opWaSu+#FbC(J#a1RT1Na?@R_Mz#^ zLYszvx5J#PH^O8Q?h_IxZp2k|=|Ao@{nb?DHo5Wal)@CHk<$2Bky}wt(bD>>^ zbw##Hww{%qRa5)>_DAh~$=azXSU-F=bvCs>b-dj5jNcixvfQ#)M2nK?Guh6IWmVMh zGYID_yyKa3rKUw`MaTLoiz;&taHj~v7M3gOK--v7FHrB(QF0>9gmR zwnAcf$<90Kt#atm`#de)rFRPVJFD}Tp|ii>&M5b*@|2K>PM&YuqgxRP1?k7z7v7h) z4&Tvzu=H?u;b7gtiMwT45tdHsviQ%{g%=Se`ab@{{8Qrlk4K#5F4TW@vrLuJYg@43 zlvo^8tr%eK9df?5HMI66hxfdIBmYeJwfT|$g>$xesPp(s!uNXsGb$^z8PW`#h$e?joF!pZGaZm?|_l^g?L-^oxbHZzjXg z#CGN3%CIs_#pAd7ud0YSEgkK8hPWrVRor)+&SLlIOG5t!wQEr(uQZ)yA}lbW5jj% zQCZ-ud&l@i5!%vgQRYOq$?mOLy(+zqv&*lT%O%4zhn!wHr94GmpnPS1)!&Klv2Ch+ zP?=I(an`$HF`)Wopy&FWOuBBz=xVk9?-ILxz3B+lX!S|}ZT;Q)+PK7M5JPFZqpfm~ zrLBJlbh1mXv@7ZS>CfcXTCnWhO2s#=oUp&D#E2GcWyg zxUsJB=$jTlP1yO>)0+#mtPz&%(&KRv+v%&I>&m-ce>`7v_>i+1FC8Dh%f*?rvbCgr zFO>aXDa|y&GaYE2OcsGb1dKgsZbXm;g+LhDK?ETn zFm-ng4H!t5ZE5MiPaqJwy1Hs0xCUGks-XjgYpcUGk=nXQm=@^o2h8@!@bE<1V@?0| z$KIj9UQ8w(35Bv)EC@>zLSvAiFa!bt)qq3caCJ69-PfPWB>1UQedT{BV2Qr&3^JWb zrcptAiUc>>WhM&Dj`puKDD;11slI=gid{6QAAt^qK{WQ#`T?}I{{K)4kxcFV3G%gxV8*X_p!9?B;pO@42EQF$^MsNn_w>v`arKdCH5%r1^T$=peW@1O`&J zCb*NSdnYP?Qmn0!7F1s*f$C1Qz@orx5eS*=fy83qx-e5+4P%TZ8U`~lL1>$5qD`^d znwrK~O*lsD2Nz3ozf2)gnLoH5|KY-Z%H5j?3Z3m4OJtC*5Isy8Gz#d?tdZoO#-d~L zQ@y{r9zTsm$MmOMC_5PFUT^=a*FTQf1GH!UGrjE1Kl4wdvWK3*p6n*ciaV#0Fc8 Hb`AYEX7(&M diff --git a/applications/system/hid_app/assets/underscore_button_9x11.png b/applications/system/hid_app/assets/underscore_button_9x11.png old mode 100755 new mode 100644 index eb000cba552b8c8d3dadec6a69d66525d04f3dfb..7ab5cdbab572473561b6ed9b2bce07b48890820c GIT binary patch delta 63 zcmeB_37jBd$;bc%txB`D0VxSj7srr_Imv(SpEz=$fmJpsVN-HKQUU{mMIh5Obptkj OkXlbyKbLh*2~7Z7IugPF literal 3593 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 diff --git a/applications/system/hid_app/hid_usb_10px.png b/applications/system/hid_app/hid_usb_10px.png index 415de7d2304fe982c025b2b9a942abbf0a2b6dd0..0e78f2b78e66510a7f4b05aa22f667c776100498 100644 GIT binary patch delta 78 zcmX@fo-jeegOLFUmU?~?08;9nE{-7;bCNgMAGq-5K+?zQFKwA8GcXG?Ghb$BQ*&fn eCd@AJhM$3`P;{_8I$1oJb(V z#>Co{9{@i91|(QuX5%*?v9pwOnxqT_55D(az0dQ0J@>lZy1%+|YXtzX+Ss!@;>_%o zt2y!i@N?&lIBxPQduOaNrjU+e?;YX%)UR2L%LyN@}>atRF6-9xXE~}dAVr@YBcOX_U zM#>gat3`~BQpG5%aP~Eh*gj89{x|#<%&i_M$ zU=f}04!x-NpTtRb98uJv2|I~hvAe-WmMSu=m=ez7E@Q{@LAHmCvt-C3h|9793l4Gp zF!O9qA&z4-!i1C1r48GZ1c~hXo`JDuS-aJ0wOrd$)taqWN;ON>tZH4WV;fs@tj*k$ zfQEdI^)9g5QfwxOAQG8v8vD3;Z_1q-{ zl$i_hipxU&G!&YTg}8q|eDGX6j4SPCw{~`RCd@~lzrPU2?S{SEO@H(cJnv<$o(G-l ph0_~rZ>7^_`EovpzT_W+OY7j;8rXcd{` VROYU>p1}7YEuOA^F6*2UngG(26<`1W literal 3635 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 diff --git a/applications/system/snake_game/snake_10px.png b/applications/system/snake_game/snake_10px.png index 52d9fa7e0e1b884774a6e58abb1965b1b1905767..3ace2de40d6d616c2464b9f898ba7bdc82c6b0f2 100644 GIT binary patch delta 78 zcmbQom@q-YgOLFUmU?~?08;9nE{-7;bCN9%9@z1OZ?Ua%ceC>32aIi#d3gRy&XACr ep(dXYkjTJL#lXI7)ok~-Ag!LRelF{r5}E+ZR~bJ5 delta 141 zcmYe8$2dWvo`aczfnnDh`+gwB7T^=&`v3obAT#vP}%WQZXkvAt51!MM;5S zlR^#$FI$2mOM@0`x8b1>WlyCWCq5a7DJwH@WiS{lZ~k%)s7toQHKHUqKdq!Zu_%?n oA*VDiu^=%suSCBfFI_h|KP5H!tFxpWP$7dSyQ`neI;Vst04~HVi~s-t diff --git a/assets/dolphin/blocking/L0_NewMail_128x51/frame_0.png b/assets/dolphin/blocking/L0_NewMail_128x51/frame_0.png index 5f7f5fa42540ffc79b300b75ada0d5b5905ac426..d948c55bdd21442dd1f0832cc11abb7f680f1c24 100644 GIT binary patch delta 387 zcmV-}0et@L3X%hm7=Hl(0001Y8$G=M00CJ^L_t(|oW0XAZWB=u#_`{qU1B$pETuz8 z_$K%Q90AFPprAo{G!%4nlpKK@;0qwRqP3w(i6fA(oZTIYtdp1;G38$~^SBV z{7-OQ`St$!`VOo=GBowRW3~Hhr0yyGhx?I$rXn*lb2w`h&+IZYHzkKsww^@j8*GDAmI1q!9ogSx=Fn$$SI_cl6Su}n zMf37;Cq`onG=~?1UZA=?w9KUPPFcjR-I2|J#hY4eHy|=#INqOrFRB6So0?EYeUY^oYu6MiMY+;Kj zQN;x;vIadFcK_!KDa1KH*7p6B`B z|M&a9-`lOhrow_v1qgx^`kOr=xMtwP=9}R=dgc}mm!}PHhp|nK7%4#qNQ1130P`zC z7YG4C?%g>FY7oS{Hx}+NIsz@cq$(C6t7Azk8bl*VOb zF1+0qpaPm3L}Sf;I@s113`>1+iIefVTC66`LjnaD0+v>K5=lPo!k2h?xX+4799vQ` z;x2sIsg6J^=2mrpIV?0GQ51zaI17*kMr0#`RE;qdLz6VT9R%&*8J4FxY~{kCL0yjU zA&+mx96Y)3s9|V4Nv2XMONzCqdKXD^97j?N$uI=eAdeWJQj_1Co*+(~Ov! zz_N^jsO~acICOS73PlS9R*4hIm0ZEBk!e9AX$wUvN;b45?W7R`|GTlKb~4MmV^C5cqzz%YFeHk4I_-taH#F<2L&$D>NS6p%3d9v2S3Smc<@ixLa$6mSw81q4E7 ztui41hm&AzlEB(T*)B44j%O`A%h_q4k7ey%uaBm^?nbWBXy3{N?-_D z&J&)Bh*qafa=;t{k+8B>$Y!$%1m}oYrHI|mIviGB>j#*h3gVxB+zE=2qm|y=J5dkN;RWSU$ZtYFfWe zESt}4A$R{H}-UrO&M)2Q?JMG z&UTeP+mFmWrr?>vv13Dc%TwF+5!0NwdamikvAb+Z{HoADWsP&K&CK zEI9kjRk3*A>32?iuDvz#^9O}TFGPonjJDBD1BdH|(ObvnpMRo4>wb<#w$`4Lj*Ja) zKMdw?h#p+n^UXNA2f0&PLZI=(?7~XP9bleLJN(7pB}*$w3spu8HX>Q^!(D4&7kwX7zYc`4H`4E zotqAo^j(`ps(;z!z+HSfu#B(>uy1Ce1=8j+bB-02sG8tf3Y=@(Cy{B|A?At16C01E&B07*qoM6N<$f?CD2tN;K2 literal 1404 zcmaJ>ZA=qq9KX`ym@A984JO&(a>N&y*L&;R-KYqCktP(e)PMt(>)lg&f%eYpK?_dk z*cXPuDY}Ja2_xB(eHnyl+y|yYT(*dQ5Hie!I59Ks!={@bh-_{NdkU2Kfq1#Q=Xw73 z|NZ{&_d!kdzUW8IQue226f6RKy4-p7f6ysZLA51JRM|0ys#UkNtz-kc-wHw#?cH%vFO@`L4&Fo z;`}bpnmKrKU|~&DID&}BJ}9?o4h%ZG8bw6$`PPY}v9(;mtPu%bAt)0`L?WrsR${g41?SY{;FZ^`m_@hs=Pw6L~#B=W!>hBq{>M5UPBsGrn7GWHw#i`DRWJD6`Ev#6L2AW2Wz= zt&@#KeJ7iCo|&8LyP0D@a;$qxo!+bqeZQ+p*N)Xc#r|L$*<7ab`g?|&hoggsPaBb5 zHhI^4u>{o~|1$GQ!?~wdm=nXo(xuGdeG3ZWxj4N4=;h@dKg^CDkB!&&AN}XUCqQ~yJ+yV^Bc(bV%FeU0Ek diff --git a/assets/dolphin/blocking/L0_NewMail_128x51/frame_2.png b/assets/dolphin/blocking/L0_NewMail_128x51/frame_2.png index 5394851f554ca56e70e8f57060e70815d4237aad..aa1061b94c8e2f93a6bd54af2ec718391606e553 100644 GIT binary patch delta 431 zcmV;g0Z{&$3%vu77=Hl(0001Y8$G=M00D$aL_t(|oSoA#PE=7C#qr<0^MGlL7&d=+kf9R{o(omO8ZBvx;Udpo%#MFzrlLOxar%G*@xXHjLgpUa06+0Y_J_29>llOTVkClE2Tg)u;@t z_HNcO>3=85+cmH`E07h~lqE=ubLmf#LmaG002ovPDHLkV1j_u)m;Dp literal 1434 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 J=SmNC{s%XK{D1%e diff --git a/assets/dolphin/blocking/L0_NoDb_128x51/frame_0.png b/assets/dolphin/blocking/L0_NoDb_128x51/frame_0.png index 759007623af4e16c1bbdd167750e2ee47152ff88..ee52444d899a225466c7ddd0af8ce0f313936f8f 100644 GIT binary patch delta 389 zcmV;00eb$B3zP$p7=Hl(0001Y8$G=M00CP`L_t(|oUN0wFGEojhre_BQkAGyEQo}G zokT2_{vjF$n~~jXB4M{$?1-h4L|%wRBsv&uo{dExk+_=n9mDI>zS_i@&i!(J=l<@= zxng8P`2!G<*?wR^l$A`ZXC=#5MZbx24q^y1O=G|Vz%@RruYdKU`}O08q{4e{9$YuK zE*j&3*K;E;M}Wu8Jf$@NIb1#aaXK+pTPf}Zi&7y5O4f@%z4kY7Y5u+sp;~S<1)U{8 zJF=M^Z9}-5tMD<5Uotc6oV=aaPam~COwg4SDS#6HToB7%qp}z36l}F&CDLPW%+WZN4xWuHi-fv z6bidt;CvhkTy{Zjd#a5BPbp|sW0c+kDJ@0mn=(Tl3VfyKycUxBj4=kHANWAnCy4=e jaKKEm8UQB$@IAf(*g=_|b*0Bd00000NkvXXu0mjfqkOB( literal 1424 zcmaJ>eM}o=7{B970l}#(o141x2ny=;uGcH=9dz{L3hhEWs9nmOi(K!n^epW)ch?Va zadne@WedbVbi{u!8YNp?FfO{V#0_IKx=0p3##k1`#E}rP4RLXPEaH2V;{G7JwZlb)R_1XZ8c7yR<2!{rcEJS+vfv@Tye!^?34 zC&*#Zkc}sSHUu@dWRn~p6E!3(_DBgEdh_f#6p;iQ8Z!F`U(zK;B~QO1KHu*T^8GQM z7SNWhRTa%y23UxT8i!=#y$O}c+R$ag3^?o8IEpN*XfYe=&^;nuz7E7CDqR8Hz$y9u)XPkY+`QFafr8#UGGtXjIdZ431|q z8AHZokd+?XNYgYj^Gvt6D((KbAGM)nH#z!~>!#rxacU>a_(hDB`^x z>53p4X1gMR_Hezd%%|dFLi4gV6nrrVlEAc*4r3!rx=k*YFdE%12TfVsjja|JYjwFS zW>>++npoQ5Y;3eTDHDL|SgVV&TC8r?;$%q^O%$-+gsO1~UM%>PbiaA5SDm6Hf*G7w08NJjb)sP%SGWzbwo&y8x=e9hgRDbsK z6Ef6S(S7;fb@rpp%LSXz@rW{fS>17~6JoYFskkNe8RoO-H6`W7FTX zr@x!+Tx>hAd#EyZY1f#%9RLRw&EeL#H&mW_^ zZq(1#?RwUW`{AuE3~t{%YafIc8jjo=o;-Mv!oZb8W1EH?ncmMzZ diff --git a/assets/dolphin/blocking/L0_NoDb_128x51/frame_1.png b/assets/dolphin/blocking/L0_NoDb_128x51/frame_1.png index c9810b61e34bfc61f4b62a26225afaab6a05490d..a6547589950a0ca3fd22d9ed35f0ab0eaef4a31d 100644 GIT binary patch delta 390 zcmV;10eSwB3zY+q7=Hl(0001Y8$G=M00CS{L_t(|oUN0)N&`_4hQApX-NF#WMnzCW zA3zWrLAUl5G-%-)XkjBJSSVQ9+Spsz*h)lfL@2!otG@%70OMVbC5uoYnlKa0DrFbReHa^c;3EzNh`e9 z=GlF7_og;p^}254?E>(4SfIECAm^J`9j6mxm6gJAbx{HmplIC~XxiUkwY~m0fl!U3 zat6Ma0R5JYDgd@4Jk1AQOXkBAtSgPvMU6FxGD!g+6xuC_aG-e84gjeRJx*2vB7e^B zneQXnD7{6Nw3B~dmzZkgVrejmCcfGr{z1zC2>$O|sTAHn66ZXON?z+{jcjw)W zb<@nop#oxHevm%(v@0`D5Xd_ult; z@A*BSzvuRZg4GuDIx_@87Jm&_2lgabRIUlU$ATLQzy|Ae)m6~(^XsR9klXGKxFP7o z{^hs%B|u&psttQ*XJ^5&;q;|`uq{(-p3os^MJm1EC%@aX41!FDV&NvEDNxG_O5Dne zN<^|I;wsRFpt6dD$_t&6fkdSCnCwDlK0bvaG0}xKmIR1^>XABPHGP^?-xmxEeVqa$ zq7~&9b6J7~7UGh@BZ+vItg{IhI%k*#=kzs>B6BK6rwetbJt9qk5aLlZ32|6$m_QH& z;$W;IAK`^aWHUk%qzxx%+(u&r!BPxM)5!dT0)GfnrioFuj`Pj?1Ck5vFbtK&@t&R@ zYY$~rw07LaFbqzRI7wna1JiqDgHK?xUXU>|Z-$d}L5rzIOp%eaSw5n48!i-toXI7w z1_BG#WqrP6pm=zKS8fd#!_T=;@Wm>|MAk>TZFY|IQXY=5*}NV%Lp!~8pTomBJswAi zCu?I-EaR@S+nqj|0?;(p>7kttrUDne3L0x4>Y$)eJu7iXIU+LXzfleE}QN%Uz-9GR;#8(Sm}k`hWB z5+Pt9;3!5rBnpc}qY;c3qE0?aF{H@b(0ROgNBuH{1velUH5(G^;0eaz6iJNaof77Z z(oT#o5qQi-M+t^x2!bX{Pz0YNB?uHx6X*^?Wym^r3)q?-6?|b<($d1bNirBR4NTLO zwXbgmbFTO~cev)u-w$qIGl1OV{iw9&=Be+mF4;yTcOI>XkD7~)ef@m$7e#)?e)7kB z1?o2=zs_tNUNyM|K5%AVu$}ttaR*$K2Nh4Z47{?maB%Bct%kaG!tpL-`}Ev{WAAi7 z+V|@9*7qAPuKFhj8M`)S8qW9q`B%K8GkXp{| zUH8c&pXDa|r}m9jHiUN9TfW$Ita-fahANvT*_^huh0q&z`;BBsS}}aa(jY>+@|emG z%O>I%Ti3(Jz0=ID3IBcHjI2&QR{0d9Ux6<@lq4-fmyhfyrCau&HeZ;!4EwEJrdwid k`O3n!k*R0@uHSlgdG|)TYUqQX8`6J4zcn&_(&8ndxBv4S$u~esxH?eWt?Cqnto#U2* zf-u#*U*7-C|Gk+Jqq&p^01;W91_t=1WMR80dG)iM4hbPZ1%G*?XazU`!uh|gKS%wG z?Jt+(4EJkzcszXn?R-9Sw{GNjA8?$k(0Kh@>iIsEL`GB@~YO*wW1GN{fo+Mvc-~kJd9h zc)pjlWbnoYR}MbL?3oYGPf+-A9YL{Gp@2`Lr$SL6BvJIlp+FhqS#5y_Ih!^H*hE6} tqEaBo6Q4r`@QDB{jmHUK@(ADK29PACneoGAFaQ7m00>D%PDHLkV1ft9ymtTq literal 1423 zcmaJ>eM}Q)7=J5*k;&F*qKk;TosvxOde^&y_D(AOxMCYyWVI6<+rstkN>6C-=pD8) zbWD~F9S#DE#C;^wWgpJWY50Qyf4B{&?jxI-U;ALw8G_j|)X0{7goV9rsq+uxCGWlO z^WO7&K7Y^csj1#jkiR@108rrdZ~?e?z(vi^f$#ULi&nwSpanKK!O^c)`~rpfjSjy9 zfa5*)&G5NU&a3eS-Ltc^@c7s#=XSwuq3YSH0dW6Esb$!9anC{kat_GBI=#;CV+AE@ z;zcDSnUYZzY6DPFnN)e9Nz##!)F{Vn=#9}6C?bnCw6@Go_*It_kv(m3X>(h3P-trs z7!j>pUyxssWTAzqr1MBJ+8oo^qzz3QX5l$?jiX3fMQ^g9j+95F&R>JLl(>XgOlC|V z2m-M%CXo;ELMXHrAqmoq6Etq7F@j(zhNWp_?m?kH1gVINVK%^3&H00p4UOo!%Hnt; zkuW7FlM-*l%?!if1c{R*1~o8kM@;9FSWH`$F*0X{lQbbNtGcYjkd#?Iq_pZb6o#D1 zC93-Ux2?ytxst)+;YnV_%_ahmMpFr zm!-^=wQ*N0<8YRjGZalhXbNj}(N>Gq%~_lrNijqg>y2qT9}}dkUpeJBgC*~YWnFQJ z*OhosQJS+kRoqJ=kVek^~(?z-oRYcY)GtyCm4%WBr%e= zN|-fFTQR;&;4w2DCK!?-2%0QI5j;&w7$}}1&>e)zkTrb^*_s*^{PwJ*q}%f*#o&;| z;WSOpDC2O>qh8Jt^qijBU*Go}vdFC^dVhOnuz#Qn>C*qWq@Q1Gd}*M!>-Rz8@V?7E zr*n}}@ciqqg3!z7z}c~VM~*x=^wt14JI}sx`;b@eJT|iBi?#?g(?S;*w(Y%CTL0az zzU}9JestP2w&qNMy}tPIb@tKj_ip7iEFZUR?6{h9b!>t2dhYbI7ky`qH^14{Q42N= z55D4lDlgft4}%G-58O1mCl6F{6Q1IZ)s+kW?C4%MwdD92Q!!XyB1|nbZnmGt!Cws( zKm}~>+NGBt<|jH|+wC9UX@B8?dC26_pZ0bhDr$MBXrA-aM$n$$d!sbc_qLdO?Vr!a zO5XUfoGM+rY(Mz7zhs%Z`efdfcFU4U5G*V_3cfz|?w6qbbE4-wm|gkdn~mUyTPKIS zH+C8(Mk;&@uPLPKxuT9X-rYD5&Q~yA(yP7-dY}oxDrn=)o diff --git a/assets/dolphin/blocking/L0_NoDb_128x51/frame_3.png b/assets/dolphin/blocking/L0_NoDb_128x51/frame_3.png index b48aef97839e4766b73c9630ae25c4fc2abb3d3a..c7668019d48e82f956b8f86ab75274bcad7e3395 100644 GIT binary patch delta 392 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 diff --git a/assets/dolphin/blocking/L0_SdBad_128x51/frame_1.png b/assets/dolphin/blocking/L0_SdBad_128x51/frame_1.png index 147561f0a40ab1c8ac7134844843d659783c2109..dffda30108017f87c977db565190a7b02b21c21f 100644 GIT binary patch delta 389 zcmV;00eb%H3X}to7=Hl(0001Y8$G=M00CP`L_t(|oUM~TOT$nU#m{{SZICwYBoq~k zI5|~tH($X)XEzr`aB)#cyEr&@a8>X#=pvFuT*Npk0GoSL?9)EL3i{1kc)WUFzdwsmT zMYx&u>=cxGV@Fb;yFafh8~`Z80cfApZRd5 zU&gmln4=Z_^Dxy~6};Pc@-?Uk0Ez-P9n1WBu{JGKrvE+q2t*B8WI50KRk~gm1(XyLBv4b00000NkvXXu0mjfHaf0* literal 1387 zcmaJ>eQXnD7{6m1%f6t|Y*E6R^9BSqulLzr@3OMBy>_dtbJmiT1kJ8@x9!||*WBG` zH${tMCK{B4NHeEmMA5_yvY8l32u>yr6Ny-XIAU7c+;l^ZG{2&xIS3lXqqz@ke_!25V-eFNBFGt%aRPJFTP7a)}OdBa`^ znm$-{ODqHO+OCdhU}>kxnFmHUu@dq?4jFpjb#;=~Fcix_D{^MO4{?c00pFIO$jV)%FoXd32;RDvbTK^8g{CSR#^63~DBy_MmxS9-MR6IEv&|tN{<|&3Qy(;V#6l8w$cYNK7IK z0%19aEXGAC9)A#_2#UlB1}7PeAb6VN83rjlDDa0M&4%2|M}%O(ACNp~zhxzP98aZE zjuh?CjXs>@I1VQ$oT4zGftkaaC8jaWY*+>GYcgH#lzEL5+@x5o=D^p%xjxgMEO6KRkh9Na8kh|im4A7k^!#ZdPsa?sEdNWRXzx=I{WoE8a} zTfr1J8OIo!W-yL+^NN}uMrZ7qbknUc_ zjfqZ4#7L%>;3$qD7|Mwvc%GCXP&`MVI|#K**8DACYi?BVm08J2EAyskV8{$GO<(UH z-vZ`56cW7A_H(~wtF*I7weUyH++Q=-CeCcyANi;$@ZPV1e{9#|pIjRJ`$PHYu>@pa zY}y0wORR?~y3Nc~+02~h{aeroRC*e|IQH3I78<{Q4O(|!&*^WjX6rBf{QB+7wriIm z`*rTc11;b0_+j+w+4ZfJXO8U5%uz1*5IkP;cC5bj;#0MeXUKBX_wQqfnR#h$X466n zwrz0uYKc!fAh@;>c&pS{H^?9XnyhKFR8MrpE6fEUv)xb2X}n;_SYQX1AZmC28G_uJUu4iK(h93-HIaQ#DW%@tp68wV&^{r9b_B&5^+7MO#nlJJkoE zi0706KeBH_d2D)j`K7kK^*;_)!^7q_xN(BM=Plbw7Mac-dkrSvyip2e$5@YhV)SO? vBvkn%Jb!-d@Cz60yI_9tjiq;QkJinWJ10r$+s2CRx&K=z&?%ho^*s9@I19&{ diff --git a/assets/dolphin/blocking/L0_SdOk_128x51/frame_0.png b/assets/dolphin/blocking/L0_SdOk_128x51/frame_0.png index 6ebbc111108abec43afba4189e410100d199a821..89af52e6976afb50a0b19ec58c82671f5d36d3cd 100644 GIT binary patch delta 379 zcmV->0fheR3W@`e7=Hl(0001Y8$G=M00B`+L_t(|oSl=gN&`UeM}o=7=N)FV|>MrY#1HpJTzhI^*-C{9TZmjLF?8^Y8Oz{aCg1Z1A15Q4qBKW zoeONb7_*oV7ZceZMvV%LEdC>o)v1AON|rd5#gS>Ei*d4uF2)X=e{vf;Lz4v|I zd!FC(^?UBsj!=6|<$aX^fSQ2c6NY;RE_#y%z9&QV4R9+n!tHHfYH`OeP}tP#3c3K8 zd86tdVKbD=JN87pxm*q&_n!XtCAe)(`kyiYs6CxuW!oAb&j4UKszkcXuHYVC(h^o7 zs)@2Sok&7$0GeCVNkQtDO+=J?71fFUHhT(1l&BN!v;~P^(k;go|A;O>ITDIUBmEK= zMO#~HDx1?hL`cY{fTR-xs==q7XaSgq=lnH}A_Wz*--){N9+9qK2jbRr8DXs?CJ_XI zu$(n2h=L@Fk0BI6kvPHNB!dwIPjfuOAjJoT{t%>DkH+}0$5-?RB_|p;%_NWGsZ`3E zqOF?Vi<2D3;RJtj%4* z*vQsqXUR6&=U_ z3lsgIeCg*)pkk(P*Y8!r-skVmsxN|b^WaZ+*EfteCO`7Yo7KAx^qm#%`WT=AMPm?*Hh_*EinneS7=C$_pU)(5K_^ z9gR0NaBk`2q2?>AEgAa!U6U2~>%?;X>XAn;|BCm`Mdmv1*>>$h6%E93zvU2?cKrpW zxB>Cb!}K*U02aZQO_{#xGuu~A&S$>6x7z8idf@?Q?GLk=CNg`xc8pr-9%qi78lGt) zu8tm=K9~yboSr2uUGHqE@9F=*f()Yj&mPTweigib(F#_(Zy`!%ez<2k4aR^Sd)9yRCOMt@+TWnm%#qlylr0gFmVBIuv{-!iG08=n z05BjZOZv6_mEHHt+qII4N#X+Hpx3x#v}+rQib4k{!Uh-&0T|0b2%Y-)T0Pxr7H$@+ z9<%~kG7g?W*?M$po8Z+1p#hFGjjR)qkBGsEN>4-@97#HpPXI2*;;U>A1qAC4$)S6# zTm~BFqii$`z`(PY-q)cqZA=qq9DlH&0tH>7VsMztF(a~F@2zilq10=ywQRJot^*d9tk=5(8t7fuJJtfz zRE=4-#l5T1ec3+fGK_4p4;o!I#u8cPlo)&o*@qD~rm`g@3?nf^_OzwU55!BJd!GMu z|Nrm*_WR%4&4E2-C6y%rfU*W3AB1}vF1pYF-)90<)o?4&f_q$G=<3t=pitP!`8fd2 zzF+#UPz2?*&5a??($W$GysO<(NLS-=5J(0HD(ed zH6oi*u{hKQpw5|!3u3pdBN4eXsyNWui{GP2RC1uL7C+&SyXCH^uRkHb)E@|m{oNuX zq0aiUlDZTN5n{3~AgNf7qOmClngwRzIdhGpNLEGfcA#9wBhuz?M%-#bMrY_~B7zu+Jcm#OMdE}RC(Rf^ur$M(&B*eDLVpNSmykNxAn#rF2PFsErR#AP$CJsV zDM_2uL?=!%41*ICPEi=tz_dO^7gCs_Rp&sKVR%^+6VbRHRTU%yD@4>@-GRc8bGgLg ze*X%(qAiyU77tGeahx;}cr2DlFsrTULHYk!R@K%*eQ_BN%9`4n5M`)doi~O>e6pjA zB8-M@N+Xh9`1x1weexn(`Ia~V^ZCQ6h7IZZc zQq`V36`H$LUDdkOI6~1T0;y?@Dw3MicIBG{+my?imlM%9WXYRQV@S5nY;=`4s0b|( zR=bSJb~1vQY1)i2w6z0^L}Z&_vr-~0Gw8Ct^jQ6JgoQUSmv}xT)+P{)%`QeDU->w)PyzK!O?-%V>4c9jamWfTrk9>JO&;lw$zm|{bMdt@A z4^M2}K3_0g>Qla3lQM=4`wuDPLgS7{`@kLNZ1Laq;h)ZLJN@%73#U5Uw;U_^6ZoGw zanx7-$v-=RZaZDo#C*G9%Gk?4JNiPkv1#3#f4uYH;kzgBBeOSn&%pfX`gGflkHG7N z_}widmbZ4TJAT#H!Ia_*tiHE)DMB diff --git a/assets/dolphin/blocking/L0_SdOk_128x51/frame_2.png b/assets/dolphin/blocking/L0_SdOk_128x51/frame_2.png index a3450ae05db24714b36703cbd4c507ae0cc07f66..3e7d95af367661183b12d76aede818664b124acb 100644 GIT binary patch delta 389 zcmV;00eb$03zP$p7=Hl(0001Y8$G=M00CP`L_t(|oSl=qN&`_4hQB#Euq!A=tVGcj z8_Nhjz^1hI2?PaOODkO~k$?!kfbU_E*jR{&m0Ac{3r!j^UeHy{jz!jFcNGIpcfPs( zGlvl+Yli+{OQe_rq5@8oNf|7qQ!L|)3nRZ3-Q85U2z#Ij;D4ptejKk{FE#xx*o&Xm zVf4UqyT9*5u-4&zUTN3^rsxg?_x^86`%e24Ow}?Z4wg!es%l*yw^i##1Me#FwdVmo z1ncN~Wp#4-;qYu`%EqE`fjE4wo*NpKxulDw2}8JGFen%%pheWx@jAUzt`$zlwtON> z+0mX6+tN`Q7=9SYOTWuWx5JW6*?5z0=^_%)Hkc&hSyij1t=*lx0G^38u<4o>!r9B@ z@pNK61J%86Z~HUEz>VLHk6O7Ux1t;eM}o=7{8`KL!s!R;Icq=If4ww_1@l-F8PGym)#QkBm3=L*tFmdW)hA!?S=)yLZDG7@vpnz{%iu;4?lK0;C zdGC3C&)4s{!M4_BgMNb^K@fxA#|Gg(02fuDh3`*WtE%CqQG(4bWaNj+87LHVIRj1v zIeDn$U#<|!rEM)C&+_szJT5LSE-fuB_%{9tg<{FKQ$dijvzetS-}Kl3f@t54hr((& z(8BOy!pOzMs9;PdB&dxbjZJBZ<9h@ZjS5}yq#c_b9mCLg%#Q772!Md(7P{lUep%So z-x}ikdw4pAHEl8I8`BI#NC+y2rW3tMg-P47EHDGlnQH<=vnpzj9dl+pqTxUr>K0`I zwHi%04*)=|v@ym-IX)V#M@c}M2w)~mW*h*9q8YOpU3oC*4@Dd0SSJ%?y(|8pWXHNy zRbmJtl}Z^?lu?ws2op`y1Rx2L#GwYR>`AIz8c!rW~wm*j=K-+0Dv&enZT zTgEL5oGQv8QS8lAp{-j~MWtJmP?9nNbkmM_GA5>!x_pyhn{rvRf*jv1#JsYYK(lpb z;%me~Mkx+hYyvLWOi|oSQD&T`ES-2XDp)zIh2$xL##ZcOchxUPSa<_-k@6uiRu0fs zTa3g>4no>G%{H8C;5po6?gTVR17Ic_FqFuW5(Y|S2y_>ra%9ckLbhf`g;<@HjI=s$ zLJ|&{45#V$IpR8;_I5w(4EZLe-#BpKYqa#WKMe0SpI&!nS-!CmeYmE$=E#Yw$3laZ zcYa&nv~8jKm6}6^4r|9}dUWh(B(m$5QB8fp=inQn=)$Xh%69eZk@w9{XrMIRA7Y z^vU*;s;R@+>pQXH`;Sf)UeTWa8%(1Wx&$(UoI}RT9k_1#f!kl+7?8`(cM_8?{kZ@5 zbGpdMs~Xf^uNfa2*p5q2XgiR-XFQL5SmJnbZm!}hU&#mI)NHWs=*Q0#Nx$C5ILa@S zfyu+`hicJqRpfZ>lgK~A&ugbV`?h+e&ANS~z~H;49XM98yZPEo)8x$1LHAqjx0Xxa Z@3SOK#WK1uKlD@4-3^8Fum@TIUVpaj`_a->wdHrgUh=pG z!v~h@{e35bl@9ldO2Zy7Ww$T5^M6wM=d|C!L_J56pjvTMRU7)SrP?qWc$cX!o&|Up ztfOx`%j1jpho@5$HW5uqB;ix-%y7FilXkJRU;q~k1_i?yw23-8D)2J7Jy$QCjBNTu zmQ_c4Mq(??EPpW27Z#-76r|fh$)~Kp%9nHz35X3Qjd)Vknu)c$lV`v)i3T=X(?U3X zkv<-et!JRN_vMX0LJTzhZhX`(EV&&OK-nz-x10wh>p=vhN^e!Q@#|N90HLvf+W`Y2 kQkTp%yt$zApYtf#Csi|_!n!VVC;$Ke07*qoM6N<$f($OM6951J literal 1403 zcmaJ>eM}o=7{3CdgRwdz*@Dbnj$|3r>wUJ@yU{`0Ybj<$Rw^rIGritjX$S2ccLyyb z%ub?_zchv{j?9f^F7a!~mQA8=3@|Do#zfubM%5L8o}RRytKHsF}tmQ1^l`S-6Na8hz1`|UwIsCwl@GSI8Z&Ap9bvA11h zC8TywSxHTn0|+VE5a4X8Bdv2;7m^3&z}dXU5IC=5w7U?u=@E_un_#b^$uMIhP!Y#* zm|<;_5EH~$>`|D+Ndm)ZjG$2*=O~t=X?W#9fIk?n(WE#R;{7ZBfaF3FhM{s8mdRvn z8Oo+;Z5Y9_EQXU9Nuodl)qB#0kVVsa)iTHm3@_`VmQ;xKA*OU0E(C-M+_iok)b{XcCv zuO`OqO#*FN&YG9CWVbB&H6;b->&zwB ziGz$$0`73isO%(SC{0l`%2JLv8jHz{z&J>el38TMUb?G(%Y+3tAQyEtB#seqmT^iX zN(und8K<47U>60HpyN18vN%qYb_B-qqy&LtCV}oE)G}G~w}7qYs9KbB7R)wQ1)>3YT1I_p0`2dskyjpO`q zs||YZx0yGgfuAaJFLqyk2r3^c4juL-cG(KHUcWbYY2&DKFdnbJ)iOfvK4^)AzTNiD zmu2_A5vOZEdSG(vaK=*oNn38(vbbY-#=B{@d0=V##NsbQ6W?1--AQ-sVs7@I7=LSH z`SHS^;mDK)L(JTU=vQNvTRvC&=6kHstEHzS*7;EN$;{1?Ipbj?clOk#+?j!* z>&GUheuN&OIt$_PZy0Ewu_zUdX}IfIx$Y$^^xS22fj;qf^TBSrRk(I-{`u+ca@66P S>|~!b|91_(Mt;N-edZr6sMksW diff --git a/assets/dolphin/blocking/L0_Url_128x51/frame_0.png b/assets/dolphin/blocking/L0_Url_128x51/frame_0.png index 387c85ea2e6295a42ea6e9a79fb4744cbd8a0b15..e95d7c3a4199d77273e3e40c208fa25ff4d39e34 100644 GIT binary patch delta 372 zcmV-)0gL|R3WEcX7=Hl(0001Y8$G=M00Bx#L_t(|oUM~RPQySDM&E86WTcQpqCtR& zp@9=1(GVXc)D+wRT+jy&5Rofz0vosiNRbdoaVi=L(-0Hc9t!^`>jo)ex_O%YX1|$T zC77XE0Vt)MWgtLg9@!e0M~M(r5#`ojOHDs?Gu0Jl~Ao=R;2~nnMqG$(lz~FF5pc zvQ7Z(X-EMqvb>GAL*r`K$D-Q`fu1{=?6>smJ&|+ZbVNd#`y%3th7h1vT{Uqmr{>nG zd5L1DX3nmXnQc-YsZCI7+==)sEESfZFEZ5&S?d}aN%~cZq!$qy?CTOpKVSA^Ri7p3 zYMuZ|hGzKzSsG0-<-CQ327bz1J=o@=8n@j)RvAKQfHS26VxU);3qaIAe2-s852dGY SAW-B00000ZA=?w9DmB&loet^955%jm67bNy_eFrlM21NcCgXHN++O^^zEQ$>D}e-umvNY zhJ`I|S>gxA7b6?l7ZZtQCJKa%m<^3nL)?ssgM`E>12R#E3!0hwTuadpxJ#aUp8s>d z-~au8XIp*8N{aUu0{}{z8W}&_Rk+Lr`SAUL@7Zd&>16*g3QT;nZv_ekJua^cfR8Th zeiSN%a#3q@z@1K~;qlaGw+7+%q}bRg15kQRTRMAT+W`Rbhqyq8(&23;BSOLyiV9)Y zluC#Y4M1IeN(@Eftb&Bu9*%b!)~Bx-5H9L8v|GHGSESh(*Ek@tZ3DhQWFQ`KL=E-N zmlW5fNT?yfDj_75=;dWHa3D2H4H09Bu-Q~fk!m8p|H@WI1SL}Y%mGY z>)qDQ%Ud~v*+Wwy5yedynn-97X3( z3J5}Pt`}Nkf+EN5R@aB!Ayj#%JGw>L4aK;!54M|Sf=n4U4)Mkmv3{JH)0)@j}0Q?IPK zV{d--_Kz*d-!EDJm|GjrgT=z91{VqrT(0_|a((U&=)PapkoWSHX)y1ZyLacrsP6l3 zH!Fg^7xm4H;a`oXH%{m}mNxU|?TcmZ@7@^()ni>#$FG#X1`yIlJ6* zIDYTy(kF3!1+K0goiY{`s+-1D)$)5AMXFuk{h7jj6KzwIN6PnCfjym{J~3N07M~fv z-WeD3)rqpx_<4)*5vjv6IAf6e*nF5%~}8e diff --git a/assets/dolphin/blocking/L0_Url_128x51/frame_1.png b/assets/dolphin/blocking/L0_Url_128x51/frame_1.png index 9975ca3f042623b1cefdd5eb913a804dd185d734..d614498e6a77ea2cf2566278441567ebf0180bde 100644 GIT binary patch delta 376 zcmV-;0f+wn4~GMg7=Hl(0001Y8$G=M00B-(L_t(|oUM~TN&`U@hrfAQF-0_jjfj|4 z0(t_$CRwcPJb+C+fhSN0v{w%x8^RpG7~}s23Pf(nTE{Kfdt995;bwo^H~k$@RTVO)~_ZvxVJ} z?eADgB#3}bfwY*CUyp^#g$2Reh=E4%IoztrizTXVSL>>wPI{`^Q-KhmQEqCITH-B6 z&g$NbmL#suh;jSL$HrJOS?rgfry5AA9G0L9zD#v+<@886J1CR%G(zBETmo(9W=FOp zS%Ls@P=X{wfaJTQCkVN{#Rv}pv@9`$s%uo`cI6K%LkJykVoaYHXcTXw4{HA5dwc;8 Wv5rT5xx$wK0000Zx1+ literal 2046 zcma)7eQeZZ81FF{>;n-<1QBA>NgRP*KdyJZ)}7n!dSjE_7~_zkaqwRIc58Om9&NX~ zO(Z80GffznD1R7|LBweI67k~?F|f$|AW{4ZxP*v`@CP7b2u4Vh`S!jxlA&DEYu~58 z-}C)EeW|r&`ONYKablB%BDdXv=Pc0hBFq zrKzF*0ddKYdmNQbQh-2j+=`}%4Q!C{No?2?l4ynrhk^p<5BnPUkmL`AcyFknV=}In zk$geK;ykE99Iija`FVd>;_D^WBhUqIlWy5Smtn!KhU~I5PqQq;k}9q8BnJT`1t7?z zFD9ryKg;r*;?MHMkO_fpm{G%s7y7lekOiFexM{q4t)?qR%33mk03~3<0O7PQ$uOvI zql{lu3qk z38|#sN#MoGh#@0xn8>i>U7_<)@8?P-K~w96N`q-6@NDyn+GNS|$X*`OGKsRRk{k~` zWK30KB#>1x0EWo(l?g@9tpOxK1sHdT2eiQZ6_#XyACi8R^OL|U1CrrXT3`j5 z=2$O*Q`t#(#y;d2~zmiofo)89g$n>9^RFxvR} z)tzO7C-BPfE&h+=WAMsi&|SSFx3P_y$PdS^*3TMU@vEHC+vMG67MHGHvUh#?F!t!$Oy$0F-|T<# z0#{e@#diI(Hy&Jy)!}=V4V<}uU1VDi^Te#yeI;8v_H^7n?>QXX@PTV&)O90x`t&sK z;VJL0y1f3Ew+(FLm1hS2EYF0n>DY&v=!>P;W6iT3zPxPI9(+DsxuJK#k8@rq$;>}= zrOv!?bZZprz>aL1y6fqAgRY^A^vK-do(Fuc_LAtq)XtliKITU%GyCSA?HJg#()CsM z$%h8?=HE~G@S&=2lU5x!qknkzYeHS(Aah>1hJ877t_<6A^S&LYPR<@a_Rgyn*gV&X zMXlexH-E?1M-G=(U-xAG>KHBA9qF(A^j7WZi*Me3dGC!W*PmiMO=tJFJD=R9aEo-P Ie#4f30c52?h zkmw0aY+y?}51<8}z!RvOXs;f?ge!OgKD>b@B*wy}va#4oHn_WE0W7>NiPOz5|M`6L zjN+QG1Te45Zj z)O3KV>Qd8AYzROw2Vd7MLZBWQ@GjbAjo+LRK4H9UP<14Lc3ons|GsisA@+A8$>{L)~Sh0v0V+F z)@^>4C=ZI6GjcS>7ZXPr>8N^=EXdnXlW|JT$q_3jGbgzW5wv$V1KNzRa5dMbF#`Qz z2I3R}LVpIVAVB10B`gBO*`&Q9!sGw|C_GjWK(i2XPZ>bqfD2=~L_l?V8(mQI58vYt X$n1{CLoMdF00000NkvXXu0mjfrj@8R literal 2044 zcma)7ZEVzJ9PbT=lWk#wi9}wkU5pUv_2sU+w(i)D>y0hhjkz6RxTrkWKE12EYfIbP zZU{I~B7_g%Ok@EPQ3DzcuS#N6P%waBB=aqZX5d@Q6cP9!9}L-idT$%aP%hU#eV+b) z|M&mD+uGZfSI>NKCWc|vEzME~S_jbOn?4QQ54J6+MT^JoSiTH9bbkKtXfr(#iiR-k z=#I);pd9UIw7140Kn2qkb9tm$6-R#gT%FuJ|S>T2@=G!FsU`KvtZ}CwwS!GM-~*K zVQKZu`mBf~q@e@wY&xaeVm3(R1dHg|J*Ege2XT6WM99^McSYOruwg+w;AKderfEDN zc;mFn$Du$k!C9JRD2AmNj$|2;1c+IyJA7y$T&d)*_?MKZAPOd z>AGEr8Hyg21t!IKX)2v|JP(O2U7Wi+U8fgflZ%Di2b@Z> zoR3o(Re&-Z$nnLn1%YE&F~dj|>$SZY1)TMHX?)QtO;?OQd+{U!lz;<+gj>2K!=Sp2 zF}%puiGKbu+9%R^+r+4$Xlj26%96C7WZ4)~C;DjgzYU5yM*$A_U$7#Js$r!8Djh8i z5|A?W1c8?_BZiHXVIjq?b;Zg@wVzLw1TC!>DovJ=#&g9hYEuM{^~qcS(lUvnjDi<{ zD0r$GCxNW;K=lc%0vMveS0*JrKL*eVO2C9c0YD1@USUZV@Q~zHKTiTq1|;KGX@M1J z+Rt(XPUSk?ZTo_$&6_^Za`Eo! zBhT+kLL?HU`cC=F!)!x!`hW#P3Dg5qmJ*9EiUL{F-4;W|l&8r_peG=jx~K^!f`A;O z-0?Ko-FhmY#M>j2$4we*`H`7pqnU|zh*uoh?yfZUp^mg#XsGYuPt~K(O=pV~iZ!3R z`f88$8D90`@j%ze__3F3R?L~*`u$k)-5c4|>5UaZ^ViF#-w#~6AY-G82d-bK!KD*U z;^e#?o~o;lVxFh=zl9B}2QHrL{-Ery{Ws(RL1XC5_EWp=|B5PKv*{OaW9PSnk%9Z# zpIL=9dP3bbZ`Nd<9Hl*fzTJX7`_6D|thM%feE5>*%k}d|=a%i!yXj32?7Mui;Y`y= zs``f;A8+Y8>~YE)XUj82D|YtI!~C0#pLdrx$URjDb*$gY>ZD<2pNV%F0)v9S#+&tnH48V}DJtbBYR!7TFb zRbT(m?7HWLIhQMkp8IJbCVzf7{Lk2Hf86YN{*1H`E@6D{VaHhagWD2mlMXFgv-w~1 C;FU-K diff --git a/assets/dolphin/blocking/L0_Url_128x51/frame_3.png b/assets/dolphin/blocking/L0_Url_128x51/frame_3.png index c44b171bfaae20b74657855c263a48cb0ca3ae85..928c1a78d31a768410cf00b2f1f85e98eab7d311 100644 GIT binary patch delta 370 zcmV-&0ge9s4}k-a7=Hl(0001Y8$G=M00BrzL_t(|oUM~RPQySDM&C{x6eLJ2r9l+L z(7*|hXozpX6+%tH4ZsC`-~dRuLQW6^HvlOTqKH$`P`H7Z$o5d=$6l8aUpG%Pv-6E+ zjbcmK02pJuGEgA4OZIwp$?3~(ung2s?4~-XzOw)2+u*T1uz!IMlX*g5^+?m=8nWvcLATr$&~Ac5_Fd%XDFThVV(c6N zp4Y$;gw@6Y#6c*Xn0aa-l+4r~Tm<;7m@5=PWPwX#LK2{}+*Sx`{^5K40X%nPUyrpdsjGRs2E(wr)<`Ih?gQv@O`D4TKWKZR0o@#Cd`UBQ_`=+)=rAo6j0Q36 z$o3ikfC_Z3j4e-u$HvCcL><-m6Bc@&{=C9%d@6J5@WTGk09 zEeV~utd7ta*0?yQ1F;iYcoL=*H9*`vF+$*q6d+c6qI6UjU|Nav8?e2!ZG z&Lk~!N$97a!C9JRD2AmN56Ln->){y>Ui=ZrAdWX0lFY|LEk%Rq6d=-;rSlZk+uQ5x zbvZR7MKONApQ2fcWl4k}%|6uvIZ`zn3QCG<7(IB6=IwIj@`qQiLeczZ1F1$ z1@#Zegfy|+R@oW~5a^9lQY5~G4Km&k8+HjHnqk61(C_BL-WHz_;sn9x5lT8H<9bepB)3pnd?()fbaiYjTn=E4aC7y=dy5O(X541@YM z!Eik5~qZ!Ds?Omz!QSTQ@6@rG+1Em&2%i{Uw<&{a2$GSw152BQzEX$yHAzHw}?WROgo{e@UIw4+ZW!tCn+J`E#YM`Y)|Il<6eQpx1pa%X8{3Z!J|#Z;Po9o)B0(=ONMdIq(r?#TI#2iHAxa(Ksvh1krws~uNX zE}J)HaA5r&2j-~RB@8wXzjIEn`2GDZ?6XDRoO|zX<*M4RD`LZKn;k2vEBZm-?04`M~}_rPW`m` zBHtn3weVT>M}+;tpY2Ttux**PU!MN-1oqe7s^b^@OZP0P?%MnASKZ0$Tc;0P?)(lr zT6r70y1Qc8K)SvbyLqO6tY+x>&cU6d)vu|y>sMh_x8}vR!$&$sK0H06=~vMrH&uZO z{jJRnTYhdoTkpNzF?i)=$M-MfDo^dab!$=IofX}ezI}1+zV%o#&bYWtIA(uwTf=Rk J!_6I={sms0m|6e; diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_0.png b/assets/dolphin/external/L1_Akira_128x64/frame_0.png old mode 100755 new mode 100644 index 36c1bbd4994c02762f5b17ea12993524b0f782ee..bef9d522da9114d81321fa3fdf2835134218f891 GIT binary patch delta 906 zcmV;519kkU4wMIw7=Hl(0002`twPcO00Ub|L_t(|oK=!vNS$>U$3MT{`zKUaZ5gHgsMS5Vtf{4*Y40Jp1HaBcU^J2vyNw*B0EZRUKVy$<> zQG^gfkS^BFYiFd%@W12OIp=-4(82b-dU*KoeV&UC-~;gcSbtB6hzJ-LKowqGN^UMT z30*jHT^=UP=`-6!L_|9|4+jePt{h-_lTgG?XBtFA&?@ICgbtbWfjnBwiABH((*Sot zmL_aad(S-hLYWR!@#3Xe6v%@n_x^2B1zha{)&PvFov1xFBO>B~8oTc_eRSc%dc|%> zHf#XX`L`1r9)BsB5-S~o9vetFL3nvv&3ryT9D>5UQ*|_U-2B6TeXSR5%-DUW$-4Ez zlau;NS1PmBVRU;sE9w4*0JI)RIP6rzipaUrfVd7145rr3hUYA|fQ6Lj8Mn)+)Z5;0 z7+R^WX*`HNeBjf7OA9Wx4GqNM^0aO*YZ1xLomWRk2Y*ebsPWD-P6X7(d0oK_4EeO( ztP%;^dT0N&2g#UyzwyO>ksCipR#!#`wLQ@Ndb_khr?Nv^5-c_Et5$EtCA`sL1>M9= z6o2l$yhFBW&z-?*Ln%FHPJU3NYjxf1W_6!lq0wI~`(anmthd5`NbqLv37>J61mu&d*vjjX&XLT>W^d zml{Q`f5uYfu71$-_mb%=s=n_JyV5#U4VnoL2v~U&d;?0B7adr3Ufi?0C0TELtx6M0 zDSs!^VY#WW*PqekJOJrU4L`Lhw{ZcRdao+Dop5;G&REo+c~Bs|9&Y&<7rWRU>MhtiM%Cd~0d|YIr!B gsLP{?K1%!#BldMq!?ggg00000NkvXXt^-0~f-f7b&j0`b delta 1829 zcmV+=2io|Q2dEB^7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000KsNklLp5y?^uhv;x3x@|`!Aq3irl zas0$r=Ow$bJC^>cd`Cd*ACJe6GdPap7S12TQ~)I-c2s~f<+!7V)t5OwlKt-Rc0bXB z3_CbL$N6f|bb{>e<-Xc)$^p=Ut*QWLvz~p|GJPfU@0|7Q*`xuGjWSgQKnG)GURm;4 zuq5vt9p5?6r+>N;PkNB^nc&$CPxctSRo1_or7>$xl`7!uAWBH` zh1q-irfrNIAGpk(y6sZMm6vNz@6_t+7<~?)RD=#X<9{8S^~^Vb6q~9^gOR@?P?lDJ zD`tAX9@&V1zI&M+cogK-1sGF-ro2w;Sw;e{r~o@kTIWhvb$*uZSvBa~J1CW9<$1nM z1@K@mW0XwuGT5xIY|MfS=~i{wwJY%!9KfUVjT)xcu5^B+qe_gcuD%t(G4RzDK(z_2 zkL+SHTYn{cj80^8^z2Mqscf@=0kFFQWLXyJQhGir$!D^fdDlCzOKj(Vvo=&okUf7^ zi*{82MyHjj%FgUmz_Na;&+m=NekAWWj&MInMkUYV8wrdSDit6yrZS*{w=b&#k=>CU z9k6X-g)WO~ADzUo_(1}rm%IazQPEn~FyvSiXn&Qg$iB1a+yQj6-@l9WsN=9l`0e0s z1*m#F%1{)9YERwi{LC(kmCny}b(|em%`x(S7f?l*n(e9%)XyWS-b28jBg>;xn^hc^nz8k9hEB7 zHrUFcme-7lSNrg&vMY0bW^-76h3rM|XMeni(X*`rRL-tsqN>3-UvWrOZKC}|x{xgN zJcDvR)q7}95z2djN-0wTG6zQMS!BJj3W978Y~~|7yiFCl&W~hdQ$}dt*vtXEfs8!V z`?Jjx`tAJywQkM@QbmT_+C~pEQLFz^#zA(S8$cRkNoG_x# z?A}@D+plc-XR8SU@)6p%J>LkIae%9#IMc3U7<9Cj34n?WXJD%kdIu)OA%VhCgIv6IBt0JfC%PWiO*Is|2k8=uQE< zft=T=0B98T>nD^-5xuW~bw1Ss1`z<6gEKaY4$`i#4qG`WnO(zTu2qA3 z+Th<~0?DprY*TIWpHV+4)Eo0^r&~J|=XCpNCckQd_VXPiF>>q-KGY)Yx~)Gen90Vo z$QriN`IXLyuS6w!KJVJVk~eDu z(midPf4UPvY4f=G6cEkp%-ZO4mOW=<7LuX7lL6gPAXLw(7EqP9SF!&c`k4Ufl;%n& zE2na(ilsj(^p%0I0#U1oU<1KAFRCPG9EPfgA~WI>7E6Cp=qo3JF@Lzx3Eg4X_p>Sx z>0>fjX)*p;wXO;XwB|UDfA2Sjct^08FKCRK>n&+RRp6Bgf&%cPerFJq4Rf6b+5;=^ z3<0$=(7Tb{YI}*+{&N*zqPj#no2_WXRPD2}5c_8XKeB@w1Mdd*Fe>M(8CGR^1*JWm ztpa|)OPd6&D4 zi4}p!wC0Z_fe2YpzKi2`0TSM^C;;9qgMPt5`qi=3Ma3`fhaT4N4)*xX`upNPv2(ek T+}wxz00000NkvXXu0mjfGxvqB diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_1.png b/assets/dolphin/external/L1_Akira_128x64/frame_1.png old mode 100755 new mode 100644 index 1950347a638a2b3b69ede1d93b6bc301bc0a82ec..4d476beed414bbb4dec01c48fcf99d236ce64485 GIT binary patch delta 872 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 delta 1729 zcmV;y20r3?XKG(427!i|H|2q$(65n{E12E-I1!S2^eD^4knwrImWm~0M~VmIj4C&0dvkD z-y?pbEAQXo53(!A<6~KEwLV%Ls133)he3eTlg%L$KSn+IGJjdz-imKek^tGhu4}wB zr~milqj{onvXFM=c$)fHKF&Eqgyro_1^AZaYYFK{zNZM;SZFGM{FU}2N>Cv#Q~=H3 z>B*0*mTJ;bV6$o<_hEitTh-OMMKS06Nr2OnPS946{NA|@bdW&$%>r;~tBCMwgb^U08mo>k|>zgy#2HHg;- zk#zp;_xqCHIreWR!4CyE6%qO8&v%aR`O!%LG)@Nzcz^pJHNc6;$ono5qj7c=glMcC zH39eeb-Mf$BJ#g`d_uHZ&)U9=1pN9sIr)5o-9cZ0my8ZIy^91dWaLDglKfr%Xhonk zUIz(|Rscd|(syHrBALgvz-mUeyuPnflaD0zWCbAq2vvewg>5wXnZB>5S5gGmb$vdk zDgb>t?SB)Z1*jL3uTlVsIp@&|&`C(I9_S>&@d|({?9&uL-s`|!B={Ny;CPw@a{O-j zulP|V!SM>f!2^B5djR_L&T+=jRe+wYkl-s7fWVW`y${QAc(Hd!@(HUX@bEsNpwbWx zw#NFEc_BLy+jnhGR&A6yExk`oein!*D@m~I+xn_@pi8Z)|O-?AI;@`%9}M0 z6{4O#rwStVfJXuz%dhy`z$|{_oH)?jqDMm+o5vNvlXa_rIWfs75nh`rWZp7I!_TYW zCx2e6l7z{MR!*Yg(-UMymALdp&TsX_mG-tTs|2_Hn?UUtV@cFE$$6$C=g+G|(BhII z!EFj4U)!Q!psNP-{Djp{u;zv4zY_mQ-$xYyC7-@~c)CW3BI73_!x(EPohk{oD}a`K zuTR#mC*EhEF}dFnpLUSIvLQ+E)+DI|*?;8o_8jO8Tk+Kj%!)1KpG=BnU-rL4kw0Vo z9lxIhUUiDvW?pP?yOI7;AG~&`Z6tPCA0mEu{XJaQHQv;5=U!{s&Wx!kfd*|gYPPA3 zmMoN@?7r{CVfAR3>Ay_@v=xHdMQZ}G#rs*SR&GD2jo03Sws%M86D7fJ6?n;kJAVtp zO7bhgr+)k++eMC*(FKq#Xtn+;cD1pxegFA|kWLb4wla?LzM8TiTh(A%{WOwjK1Rlg z-uF;da99JZvXEdEZdvD1U@UpB&c*6y$$Vs0OPkuMA$!_c$=h2qvRVtELan-=Spm@s zywy5JBb?@A^%#fz&#ExWTeLs?oqxcNZGZ>C+Jj{~uMK^dpfS2nF_vAVcAAYyn@BqZ zl(#4e)n5u-CBd$(B+{>o1l1D(`LQx)rbb%Hm#Y9BMTv#z%94TUI;m8FP8w0A^6ak2 zKeA=vpC60vB0*IFBFWcC(7F1h56DL?PAf_fjT@>xw8doEg8yGYM?sh+4u9=i1TE?O zIrY=*aXT5Gqjt3`B0<)Nh;nu)wfY}MRE^7tdwo%GqNLlY1m4Pz^p)*ABA|F78?tRA z#+uJ60kVT|cqE`epowP3LnK(O6Hua~$)~oKf}#0Gl27+4dC^E<5}>mnq^njK$zWwx zab@rG>{SXl*&l5WmMVCwn18Mvr!+!Z0Xhan0m*J1noYD)Beo=AEPEb2|Fya%Vs9l6 zXi=C1s19yD%T~7;be{mKc6odv#T-%w-nVlR%DB1&;GHxlvbBMAWZ~^9=ujx`&#EtE z2R%bIfaOOv-VuZdAf2d?p>iDSoTz25wPs z6>-rcW0e#u^XN{r1@bdR0P4sML<$}rlxSe({+ESE0{ZMqekI}EO5|bAnJ0iWV38o2 z{HTItVUfTpyt-C?)E89jb@&v)5&_2W&#u{(FOP$(;49vOr3hK@v7&SKNU#gb1Q;VG zx6uk0J-5b)`p0cqV>(n2k^bmbskPfhinrgS2FYp**4e*nMR-TD4p_<4#+H6qB-nvJ X_(GFPPY$UZ00000NkvXXu0mjf-B(HP diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_11.png b/assets/dolphin/external/L1_Akira_128x64/frame_11.png old mode 100755 new mode 100644 index f7c08643141d78db15528da272d35364a932fc29..f767fe332b3c2e1f3e2814ff3e95723f4f30d1fb GIT binary patch delta 825 zcmV-91IGNp48#VI7=Hl(0002`twPcO00Rq2L_t(|oGsElY+Gd%#_|9A`gQ8sief4| z4g`XMfyxb#g({*@Un(InWT?Q2%7ht^f*Pp{2$m@C0s}CR0X2M7@kCwQfI)mnEWL^Z zbb<_NR4GF&B8AfHD2DngwyzJv&2*$kzh^i{2el$1B6daO@qaJ3$Y`+uzQp0m_X~Ig zVo&}RS-YM@qeVpIs`RpQ>(vhn>bO!PRN&!-b5((xA~HCX;oq{K`>Tjit^)!j7~NjE zParzGBFl1=Ocyb@4m1EE^iI2irV2y=4d>jgwB{~QtAS(nwS2vyX#$&oa@C*J=7c5+ zqya2)X;9a+fPVr&fyK&TT+_Eu18|tx#?$x?;sDIh^+;-lYv8z$u8~e!Ps0}CvXJLA zanDU^xQ96X`8hVZ+j2Yu2Pk)EhacW!v+uS5^?L8oOsTXUlbkMu4anT^_bX*OcjW1> zt3E)ox0)%HR?qksC@KZ$pT9kTgVj_@auoweVRFN=0M%fKr-9K21^{DI2uTe*u@69J&k~5K*et;Ks4KPwaC1-vxGn{p zumY%z&>!*%o9i|1m*LfUx{=8aJ=MS!ognh)Fh~vTNb7_14GK@_+3M75~i*a1FG}eczUk5(j0O1_R;w z_IICr9DYOQ*`{WoUoNv;9*H+DXQycZr%I5@T!ZKhh->J41tVvELBD$gxe`aLj#1W^u2Y|9Y8e1{aMtrv#4pY!TO;B{^v`OI~Ig3 zQ!-D@I@FI3l#aRTnHMfDauzqJBC00000NkvXXu0mjf Db<2F1 delta 1596 zcmV-C2E+Np2Eh!F7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000H^Nkl;{eJ6tp7r~QO+JC= zdDQ2VjGYY`t>xy^6 zF4_vTRUK7=j3S5%u$@+9W)ghW?|WTjmG{^UX=vWa}GBFxRaAWlXL?td5-q)Bmwe; zY=j8VaRQaaZOPx5jH^Nd%hpC(0Zx(N?XAZ`H9k!RxPSc!36LLTBSZixplRInCc@D% z2h)|lW+O}h$=C#L-TOJJwE)Ew38eFa6ai?UoCMuu@KoW`1UV6d)xUb`*Qx*>ackq0 z2;(7Ab~~Vb#}r^glV&SGYJ-vneLj_Zy5jj~9=A0wom)p*3D&RzNYDaDEBmjY8F@}B z0P=}qLy5>Nf@lpARf2H^kdO&jV)>iN=L&$vnSULxcSUEDzt)QcSS$b5aGC@Zk%^XU zMH1vic1w9}3y^^JT&?J%_ceQ&WOF;)m#1*^#O6h&xbxy#0$8~U0 z>NnDUU&ntIKplQ@MO&zhY0pVT?ZRjOOn(7J2~Zu})Uj$8v}5b6of9}x17ru)A&XKx zmd`3UStDbwkiGO)um);?)Q=^N^Ze`td4FPPwLyKP!ivYAmFOr^#v4IwX-2$PZbhR+1FH0-w_3{l7vZ=jNTVP7IJ>%QOW+eUzw4Vf0R?{!~9Ic*x z^{iUHWkidr=<1?Av_4WX=@~zttL&=h@mO=yP5`aALn|+n6y6q*iTjUkH#}*PZADWW zsYcNJS760ErT|jXvwJ`HQB6jbbkP{S{xwoeU_=2jgO3(F+E$W{2ldtbMSo(d!0p@H=YS1aJ2u6 z7!L{d^9i6;9Fbc(`5kc}GVbf?Q#VFWwQ43Hwr%<&#QkP z-n}iL)#Ftp-j3R<#KTF@S%2Jhpp^iT1Wpz{+RC=%zgv20JJKrOU-Y>&hBb~VzETTJ6Xuu# uSW+0B950#B>Zhw7sX)|+)lakcHvR`OA}#W-ti$q_7b*S+xmbafJ~(R}hO_ zLZak!^>+7J%$~$4hW9>x^WMBaU{5%T(&huT%pW9YXnHj&+JA!GBq8E=*vJ$v6!Ge% zmdZc?`*7z9^~_g*!kyG}8PEX6si{e8+B=9k(#Sv_AdI_a-kSZ>3)YNP6alu<#P0+a zH~^8zV%OI@pU712x$b`yVlfLzvu+rIgz!oQhZLXSp!~ zL|w0wDfDuJqJLQMO47A=UeBaD)% z9W5+EEDIJy|GL@$;O-(oDMoWi1G&5lFf?m~Re&Mt0DpV&6%_!7DnJznQ_^H}v$2Do z23*Df#)u)&fJeaDh?ta6>=0^fjjA~m4jL33$bEh{@C-58GBNz%%Zb@K5RnI+@+*40 zcIyZPai*9#&1h8iEc?yuD(dccy5Go;x^2Wey{PX?&@bW=lE*#So$vqsncjNHt%vQjN zXsR*sJG1g5eFH&B;94|XJ(~8GWUlI;O^qgG*f-r)&1ELyHWK9VqLKC!&YdRO^=(so k8js`WTR7_^=eD8!7hW>&`<{SCp8x;=07*qoM6N<$f`dOshyVZp delta 1378 zcmV-o1)ciJ1?dWq7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000FWNkl1+ma+J2((V@|NnBGCwEyEFhR7TCnF}hr%Dth<)Sms7~>sZjQ9OBz2|w-+M;7? z{mge(8>$m+yOKf1o1f44LIPwMGK&luB#_#skzjlg0qAb2(tj_q!*7y+_w_Xd*jbFz z@W_+3i{SPU7gemTtU#*0^Z9C<$5+fJ2+;&9d>-coa8C z(2@XS$Rs$Kx%0lOolr(e(3SvW{2Lm^IQ!SZJPh5yZke}|{gt8QNmvt^Mwp)x33fb! z)Q|VjC4U1M2R@o?c>-vVCd7%LwL_8BPX>06d^Op&1h8_B!>1ad^ zs2A{%pmh>h5vT7Dc1uGp-;My^w4+Z0Awh`{Q1R9+6IKNiK~`1pzVGJgoYeun4p?vfp3$a~f;5_+!W0GV#z zbHTyoC@dLoW=@m06FEvWzI$+t04Em$S!~VlmM5@o6}7%4Jw8Q($hajAf>6u}u6CSc ze1D|W;yZeEz0Ak|bfOyy1>=AR$X*C-k&&b;vM7;$PZHr|C@6myfEq!Xa5N@ca@+$& z^sa;!A%HG4Uwq5G@9e}?c(G#sr%P22@zV*Aod6-w61=Q(EZS$*T5Oeh3z@PWz)IS* z$(=~RR()EbVkVN6Pe9A%05toypt)I8K7T`}=vl-qAfc!f0V3{}%AC4YL(UK^xrl5Q zRwO790we_yBl3Fv2E3<*)BrcGeZ5HY01+c-#`7jSQCSam#*r$Co20e8Knek*gA;3l zmf<4?jL7g^d3ro)ZgU+p9Wsfcksurbw96Tq`FhK^9U$XbI-_M%Mrk>9;ks$<`G3aB z^m3u2U}@pR&W+^hWE@;w5_ye(x|Fllhu=?l2`i07WkMkUF+Ok4f2cy5q9{;zj(7lc ztV~$zgXr!Zi^_xuuoFMg{yhe<7KVPJ?w`u==blABaUP+~DLR&$09kR}+W9LFAuWK^ zRx++d4oyaSj(8h%z827R^yXZ%t$&LES+NjVTDg8}msq zr3c~>AOf5;zSf35+bMhKn5WuvIb?1(NI><{unYki?tf)`Eo1h^G;4gVzNVOMcHFU* kG;)3Tb6$pKU==R^2b7lxiTL9%M*si-07*qoM6N<$f|X~41^@s6 diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_13.png b/assets/dolphin/external/L1_Akira_128x64/frame_13.png old mode 100755 new mode 100644 index 0094ab5ae47a907a77762c47340710643c8078c3..01d8b8c9a5d306c22cc73b981b6de3866a8ac47e GIT binary patch delta 935 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 Rh4ugd002ovPDHLkV1jZ+x>NuF delta 1697 zcmV;S244Aw2c->=7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000J8NklPj$FB3e~iH-A-W?~**0Jd9>yknPPez#&IaH-&(?c)ue+l6 z?%to78`-9H;x_sE$#J~4Rv&F#-bS<0n?ry%2AiNQP(@p>|9_n%&}^UQ*$&I;HwM4= z{(ZHkFSd52cHdpYY-AzVPp+#)HZK;IKXNQNcT)l07JO@QqLk)cHG7B;TK@_q@M2_< zRaF4X;QzrNTVy^awd4K0T`l|a{uy$5Yx6^Zw*>=#HF$;Dl_dBfz|Jzy zffPR#S8mT6Uw`@`W&TbQs0y$%to$n9SEhj(5=a}>B#7eqCBW{5UTfC|zlsD%K&}2> zAG${IJmkW>1zwP<(||Qz##hA0(LSC}hcvJ&yq#`+zCr=C&ox-}fM#nY3HrZ#dn-Uy z@ICt@N?_$~&37x`Bfe((ND}=h!0yQGP<}s}yKI*s*?$aHDFJW)Qv>V>KCw)Wo()cx zWFx7-vpGY8AHUA?Ja<+AM1J}GmE%W#L}`Y%(E?nV4(NKkHTZH)tLCVUlPw4lyVXiS z*JEe-Cm`~_dVE5*z?3#DztJKT^=Eqp;FBI*^c9E#B6vQojwNyF>Ar2=S@`eX$l{|Hf_qI#f`1g}s4dOcME=#{}$ zB-l~`Bzo_UR)AH6tRTVG3ZPZkPg4N-Sq6~`$gxI9@CpUsxSIrW{1N%*m?c4ktrdWS zFZ2_h1JKVa$Ke1uW78YGbGsdw}BGKuADuRNjrC*G@{QU5)fXY03$nW=lK%6RKV|h z*MGyx4R6KnWG7fh!>kfKS^*+i_lWz%`Dnq3+C=ueV;~=A8wH>Ohm(?Dd9^!Y`)XoH zKV`Mv+TZzQA6y}AEfO40Q2;IIQ33M=zfok)>->HcT=Xd+wUOgJ;(rEdPst*GWFHRe zN!*>gAAL-09ofQ1y3Tq?mq~3@z9j1E-INW!CWRh(wI_f`O3{#AlPK3`{GxW56q53_i5lPv z5+FHSwzb+sBtZJ3K1A)bw#d4U1U9mT;zOOTCIP`4FXM+s0&g+oqNDO^1xpK1Hh=F& z>ktKZB#oO2u!;oM4$<17H38Y;{k&bPRm`I&4h>fBM(2Z)08NJ;{(M8oRSGZ?{E@|{ ze*7idMRTP#$hu?;TC0D??o8aiUlMioX}}sMGYQ_;QWnkD=wf;OERtA0BI9H~M-`3Z zdkV0ORVsm3Ao0&-AIq2MB;n=jk$?H2zF2)`=BL?`bJxa-NcZ7yuBrvJLM=OnHc9EL zRp8CeM_X7gW%0Gl7Pj1uv?bqeYGPWvWrK8?;))Kt4Tl$ zAty@Lj1L+KX6pnk&}i_ft$(Lr+Wf16uM)4d_|L{6`7G-Q3NPNKj_xv5EvG1mK7Y zMh+SLOhwN7XA${BuT{ZE1HL*9w6=f%9G?86!H*Vv1qrOeYbN-kzEspc9+ncogSI1( rh2s5Z!FRj|PZ2VZV;Uj$R+HdACUF5(X_P&+00000NkvXXu0mjfQXn72 diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_15.png b/assets/dolphin/external/L1_Akira_128x64/frame_15.png old mode 100755 new mode 100644 index 33607328a0f29b835feab64cb0b46b83318d3766..529ae406e4baba3abcb66bacb7c1ef174dd241fe GIT binary patch delta 687 zcmV;g0#N;d3%do77=Hl(0002`twPcO00M$ZL_t(|oRyJFY)oMs#ed(u-{>W@S9G+f z%q8)NM4}Q}A!gKTB_T15SEMVpEJQ8DkO+x{+E^gLN~4KL#4Ay5VnXd|g#?*;RHcu( zG-}$Jxqpj!-LZ3)C*L{ef6fR0Kmo+7i97#3`VS~cfDs@bQw(wF>1(A3Ni;i3ag-`1;eynL9y zC)Ds`s<}Vlp;KY8s!SW#NIja$Lfh7{^oj=B!!ZEXwu$P|0K+{1p$kK_>EIlxx4wTU z*mj`b=f18CWPcjn?fzIWcFT=y#tcff-^^uZREUi6KK65!Sw2kF-X1;Ncdx6`2qb%Kejl(U2j+U_I=K*%NAIMDxjuYEk5>zlwFdT zH)A^@i*YTW37|!B+FP|jvL%lOPDO2ZGfJ!7Rt7lyK!0^cVv(T+Jw5)b7SvNyF76|B zzEi=%R!~>xO-#k#e4OKz=JRSK7dhqCiBULw!m^M)x@?LmXLGh}NJh^%rQeqs`0tEt zx%&|&qm$`@a~%;e08~Vl07I=YCUqQZ{GrF|Zgcs|)wj}hKoiq5YSQ&h%Y3H_lG;Am z>TK%WpMSSEq6uxv%-`*%1%V5Y7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000FuNklu&2X2zI8u|110aI74ELtHE*F@=2AKHpZ^GeUNR}7-Npc$Kvbs2F4g;&e`M1 zG4q=LrS$ls<25=3d^8@B0vhM=eR>0*j5&S5_qwiaduRhV0Dn-tSFzFiBlrU0J?dLPKDFoKQ%o1rP+ zO9Js6Dl=;YY#I23d|5eGVP*X)<%2v<>6!EC2=D{yRh1*gs`4qMXb>IS05*X$07?1S zqa(&qkp`LsZhwH}{TPzcqY)x&1YdXqJ?`TipdhXX0PjVWN!MHA0CUc{EBC$fn1LjV zdb(%61+GMlpgF(>V8wftj_0iy0JpXW{WNd`u<~elmy}vj8AJ>Ru-yPo=i}2n0O$HK z^eB)?LBH}kG6HLSR0=qq_jimKl47xOtcHJ@Y9yI|#((i319%s#7y$MD6#_^l>@q3oXb8uW4WlWQ48H0MW&C6!+q0X*Jx3Q@0zIV;T-x+aF_cLF@JR;vS; z3-dlA0!Vee*GR2H7W3;u+K`YXq;xLGQ#*mt?pb#Jj*%l`WB7aKxRa;7a92)~$#w7| zhJUE75tTIt69MpnMMh~utMV#Fya&23&*4PEEZ5%6<`7vUYMobiTbATt&%GZo9?4?Cym6bi;zyemh zqN4jI<$X&ISBhE&Q|LrqSS5VY z9LpFb(x;I@N@_K%M1e;~0I8gcfSc<*&`MZdZE=>$O#P=7TwQ*_B9Wc}{nB`&RbO87 zT)MVb7KT-QNasUkXmcY`z*8zd?pc5*EN5A#So_ez`${PqF#<^jhesJewts&2 z?hVWI?m0>{xw%%i&{|iEqRUOIv0wn%6p-!QWy3VRC*p0Z5rNLl7<4Hg7!RldBm<)N zNS|qPz49!>@bZLR#Bx`=<`In`&tX@k07;P^Bf#@5BdDt3cdO^P0a(hf_9(5ws4{{G zxA5$BCypAx-O9(1s*PPnfagg2(SPRd!VwN&<^0{s=ho2_U{xlb3L}C$4d4;~CCsb* z>O;}k{z}7&lb_ks9k{&}tkwEfXKY7Q;0PPOwiKe(<#)E4J>d3p{8@n3Bj=P~RTW5k zS@FI|3-~U0&*xSH&<={b7f{8jC1_C~qdbtY(+IL>@dyq;af%VcdMoQ%EpysP^U8BC z7*-T>{{AzyqbWcO{{X9$ij-QBeN`GAjs$R>LF7AHl#YKfCU<#X5n03pLft@VT)VE_OC07*qo IM6N<$g6DIW%K!iX diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_16.png b/assets/dolphin/external/L1_Akira_128x64/frame_16.png old mode 100755 new mode 100644 index e115834eff3b0d2b3240dbf798a3152ba8995eef..d7c0152123c8a76278e892cbc2bbe1cf7a6b797a GIT binary patch delta 678 zcmV;X0$Kgp3bF-|7=Hl(0002`twPcO00MbQL_t(|oRyMGNK{c6$A9PEt5f-yDKn$g znb}mh$q+*5G2^1WgaZ*#vuRTh7Dc&nF7^=Gn9CNCwJ4AttH9_n7c??ZTp0z?jH6)- z$?=sF-Fv?l^SZO_tj_m4-}nFi-#Ld^5C6H;XnF6Rg3*dov40w4-dLx-vb4FE#Khr{M?#zXAR`r` z&##fg$eWjE!2B3XUK`4nk-HToWN7e)n(wx>V0iB2yg_(cm2X77w%5%uW7aH@$qixF ztI@jOb#+K1`+lgS{!smTEwNZE)_)B{dSpI8VqA)oG$Zy?zw0Xk ztydSn2C`^MDWztl zAqwlwAshhoh^&2dYkm!W@#*==Z0vMG-BL^B+t#EB_6F03%&WmXXu2uBcZ1n_bP?5N zf^lhK&VQ+D+(Iy&cX1}p?&UrQ5|Vd1W>S6qtz#hta2eE*@BP`90&p|HgVb?xL_||c z85!UuanmI~i*7(5lkNgo(Eui)Ge^Jz31~ny@M6Ux4g-1T_aL!DHfJ1{YJi#$HzLEb zIq%r?0W^gk-D&m9-)z6FFB$+^IF1Xo!x;B9fFG)Hryn$ZJ!}vC16Ly$@bY)i8~^|S M07*qoM6N<$f-7o8w*UYD delta 1362 zcmV-Y1+DtB1=$La7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000FGNklH6s;EZ#}S@7&QN5EpB4uRxcO}Sh-4u7x&KRXairla#we5GnT zaKVX;Mu2QbI61(?v4-9neku9&y7rOeGweD?z$DOfmjaChQUs_vdvF|J0xa^QRRMK` z3@11_z+hyOU-eb_44g*LKxC88b!X^$8wc1SiE9}-G{R`Yhl1)kNniq+8Y#+HicB`Y zPuG^_c(9T~Xn!on0fs;d|9p3A_q3x!Lr*ezlE4YDcDi=G)d{#>4==j-)5aY@n>e(Q z!>`l%J!?gi!gB-+gcg>q1d+=kWNLDVGrdg}@N`HdMnNMW>O98*1|dSCHZQvSThQ$Q ztIzpeM-9mRp54#&@H~T$-AQ0p-Tbr>MbGZ{=F+5-^M6&pe^n!Pcxg`?J))$(KxFr~ z%&j)m@23hF1c^+`0qA^m_j}RCa*$s~z(GDZIXjV0@1IWK1ZV{Fa6F5Ay6#K5amK$R z{~+^!&RLR;({3G4&=7E0`lvWe>`$?6s0DaIM#~yGUR=DSK z+C6O@Z+;{qpz@L~I3M_)y9db`WOI1rqv5!ve3P!VJYP%n2{}O6qBns>K1xJun3awY z$$yzL+QS?n9p#}8fWB}`z88@SAcJ^o4GoWJ1X*1>J}>hHYS7ki&D=*h?qeE3(Iici z>mi1o`_aY?;xHo|_Yn~Qec=+>J&EU^wrXH^d*x+>_#V7v1jwkDrH)<8IgB1XT#no3 zm7r*^AWG-gNbkx(w0kE(l5K6i^uXKI+JAFJno&_(wygqM>Tm?s≧Px+pBNv~wTH zLt3MN+vg}7I)GNfQS@fTkrFWy(j_^G;FhE{;slxwj_n-4+d;j$C7o!W0ByrsvR=2) zTi5ECwnWLT96%$#=V1|9ZA~OWL)Oz|dmK9LNGu!vGU&%RCo@J6(dRh^nkS4(EPqE7 zY+FPCkNm8R-K!`NC!q446J*u!BP;bS`T!pJ**nUrFtVH=l3O6Qj>2*Wm`y%~R&9)O z0xF}~W66%d(pK=rDY9GcGd4&IN6dN({ljy ze9c^sj@q#!m2DZew&V#>^f=fS5nv>&=8t!#M@jQqw2|f&GFRKxi2iER@;?a42>)KG zWf7^Zo4sRcB&gqe5P4TtayqpNusVL$?$NqxUa#Kk;aj`42S~+$tQpng=}VNHZ+QgJ zz)LfUOfTu;b3BKb0WJTKY-+8Rkcjy6bJ;Kgcn^RkXIbI41?UlikZ3)JC+|7^KaBb{ U*K^>(3IG5A07*qoM6N<$f}h}#1^@s6 diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_17.png b/assets/dolphin/external/L1_Akira_128x64/frame_17.png old mode 100755 new mode 100644 index 8e5fa20d8d9290e70540c179fdc8f96d97588e30..95068c50f0a3e5d016a7ee2213482fedd1d4e4aa GIT binary patch delta 690 zcmV;j0!{t)3cdx97=Hl(0002`twPcO00MMwTNxEpnjbSZ>RvEOZ6sH1>qMB9P{%nF=Xb@o%_(})`Q5OY5mV*!_ zhK?D|sN*{=M#nepI=g!~_xFAGJ6!mu6hJt;@$%oH|0rDm&41I#RSp;)WNzcBY=I`m zvKjB>WEMk>@EDY@8GwFD>Ytf^E~Tvl9E<1;*2XI@!Z#P#%3|cKPfG-2_oX=l(I4T@ znTFe%_w^I^`@PPcMc48|4Hn%B3^EC6;h#n4ZW};LNeDp4aK+0o^%tp4-SARO#klwA zZ(2{)cmi@ent!#_tXDSIPQ?8lhN=uDSBiI!adS+jL**G`#=(KhlOyfHT@B-SpV(h^ z^QbVYS|y~ECfgM)?TT)q@6Aj&K{vDzi9Kg~z@=v?ks~9HrqWe_I3d-}ToXql*a@cO-LEgNes zhwDI;pAJjbt({$){wYbGmRLZxjjaZrNMcg3cN&PDx{~OM^hjD(#3VIntYyN8sd&%o z+-QMgrzdoKs}Y#K8exTSxUG4Q$W$O%H5_O!D+J0YitDSlQaP4?P)}bei*DVs@7#E^ z5$pndZGYhlg{dQJ0jG{a5deld^}d^rV$dU^iHN+lwq_ezi%}6kMBI5e@NG4LE+QHr z^RT$D*Kn=@hJyTVaPRuCYe|38e4iCl)n_+*;}!x?TJFHGbjz}cqXBYs24dL2dPoEI z8#6G97D3GP_Wco9qTDezIHUn?{Ys1!G?P>l8Y^(Z`d&v8tJ^2p%kMx{gIRd- YFSTU~ldvI{e*gdg07*qoM6N<$f>cUI82|tP delta 1391 zcmV-#1(5o_1@;P%7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000FjNkllt^B zBUk;Qa>f@OuW~}bN8=VD;9wuVb_?*Ss1$;xz-X+b?lL=pRAFw6j{-|%IC1cLUcR^Fagr( z*OV`vXared;D026$Xl`An`_VJ`GF;uLRmP8xg~ym~H^OMG-yjQ|6%QHxPDc$1%7)DN$=H8{bD9|v$d2=~5oE+d6=!T)n zrwa2b*_2nk)z} zWbQ~GLE=g2nVrCB7j1O?j4=}HwM5RlXjjgoFLenc@@YJxv>N_-0J;g0Q4^|{Ue<_i zMt^S-M(0ZF>7GUrsDZ=`s-A zaE?)%|JO_j7!j{DG}^t1V-&Z~0j$I+vVYd1(G!RH8qXNDq|ZtQDa~14;IE z>azf(4j;{mk(%72;mKjS_h^5j(TRF4*qF;r48S`Xo^IPfUft9AghL7p_;7*;3+@*L|GL^mJvj93q;o0*k%B$l~18n8?%gn zuF>SN*3QK89KehDvz0ILu@r#x>VKtYy-Hkd0Nejd7^?jA?AOTlBel9Vx5tQ=pZ;s{ z4@0b4-|LLc@Cs7GM(;g^SatczRx<)ko~@q+P&bMwKdUOxWa&A5krwbOMD}Ny0azO) z&27lasx??%U_^P1#!Mr~*o*Bs0LRvh7GrJq)gaUdPSksKjI>6Y5P@m=*+t<-preM%g*ZFbN>H7|2f=CoB3?e*gAfv zg?Fd^=Z0;Yh{c;eZE!dR;o!BtsRsGrk5ny!yKg7$pH z3WW@88vT_{X@8KTo*kR}Z5yp(&+QMTRLk`~(bBf<*UE_*<$E~ur`Z(|-I3bMD|;`v z)~jycSY?HFWHEB;_AlAJv*aQQ8p%Q^-{>Nedf|(e+R7@z31vkD?)4Q=!(bVag#j^r3oRWhyXj29Qy!ZOvv0fS+#ZIr+Q5T5GfJcct0}ts-|E&>r11*(9_L{qq@|(Ob`q5 zdgoLBx_==Y08K%ztPkfwmyXl55WB9vv`xa&ak^H=)@+9v#lU&VpN&M}eErOJ&;&&Y zp-h?Zgs3k~@q1)|MKhEr4uY}_{-&Yz>4KD51z;Ik^Y|^muK+4=CL1LLGw#EkjU}{Z zfuU*uNsd|J!}%H{Jpi@i1Fv7T00000 LNkvXXu0mjfT*yx} delta 1353 zcmV-P1-AOJ1<(qR7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000F7NklXU0RDfWX%MxIF-%wbtM`4v3D0_s0PM?e0Sq z?!)Wu0~GGXtF`|DpvG&*t6-g@Qow_ds^y>z;C6VU!ivKCYk#`Lf*WTTb}BYH--D_F zZW#M@9LE`oJr|un<2;oDE=E^m{~5#bY#ITutSl-8TnJozVMqo+LFdgNH3qK{j1++{e2AxwJE4;}06ZB)6_}~+DM{p7 z1C;`nK_Y!3)UP)RP?=uid7Cca9YJ$F=jkgDF`P1hix3UX*}QJGpA^FeaCe^HdF0x` zC^F$+lS9YhB5-!!{G>6eB&@6%#zGB{JLjt(?(T>6#D8%V5gF3lejdsdoKXp?3s{DX zC*w7d@UP9~I)wgt5kVUvs(ido0%w4~q5)I{SPE|x$SB`RHDMlLMI~G#{P`K9wV!T5 zn@2IK{BvKZ2;c(uusshM&%wD@``&^^6MG^Ko>K;3fGUlCCp~Pg8=zjERlc^yG7c)E z3_t-Fnt!>9TKdfLcr4cgZ#Q2&)SUe4y$98aq z9w&#U09^D%`}_<$h|kCwYrPC2pi1H};=NuaYV4i0PU|@O*kx7<_=Z z=ozB>ML_TGql-XquE+Deqz;zlZ6T#~nc~kvmw)-O5r9_s(VkwK1E9BibS?&M@gg}t zT3B}Z9~S|lUfpCL&Uz;C^2;TLaELYb6ACLk@l^=Sb3iprC5=C@x z_kS9AxB-kPeC@lq7p)cl1^@ zK(r;3)@m{`d6nj$1+-dcTLbX);iFZtrzf{$Sm)5fd!`#1Wiu(ZGyuzkMrCs{ zz4b-3(B#%yY@xNUMw^FIBYYdc-TXf{{yONu&3e{KdwL2q&wkR{5rdw>Rlr6OfPYiI zRT+EbdgWP$;jI%^zSNqDt%xAc!=9A_Bt?3R0I#=Q@Bk8usHHjU@sjZbF4jP zMu8c?%I+7&EiZ#K?_aea9;J}awQV!b+GVV~=d6Kk69HC2BY&*-1W~0~6m5jO^33JD z+AF`cw#Vz>8R6e*wKPRa`_A@Q90~gGBZxdJ>G@pV25POJ<~(UDbp&t=$yz)omG(P5AICaZpjl70Ra91M5#JcP;94700000 LNkvXXu0mjf*f4`y diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_19.png b/assets/dolphin/external/L1_Akira_128x64/frame_19.png old mode 100755 new mode 100644 index cba72f16f7b1c8fe5276187a8ac66bef4aa913d9..48e60709654fff77269bfa26894651cdf54b6523 GIT binary patch delta 676 zcmV;V0$csE3a|x`7=Hl(0002`twPcO00MVOL_t(|oRyPJNK|nY#ee@dZ=6xbX0Xhm zUOFLB8JOTgkaC_yiwH{SgNUe+mbJ)D6fK&*Xd(2mXwfPO`oI=R1Qn4zBg#dTo1m!l z4G6Xn=UJdm&Ai*<%`|U<7Tw*w|8veg_rM?iyA;6Q%E8dT;eXLQX#T&U(r1FrjLkQc*Wb8B>@00Bl_EuzY|)bnz&5Mi6r}Ek&pKfGu+`zJ6Cy6qQ^rSu6GtJnQ3^L5cm|uKXG_aiOIFP$(xneBgi_y zCiE!Z^Nu3wy_Orm>9~7K+k=siMCZi@*dBn(Lcr;`zkjj?;Pd&Jv0s{lo9{{k_{-oF z=~X^{uffwdIl#pjQ9hNyfit))1Z{$)RQfHde6Q=L$Ug`Y%;$K#~$7PL&klR=~b1VEKWzj+Ee4R36`Q~BB$%Qyhi0Nl`Avvi8_JL|-Aay59v zgp`K1@qbAI4R~{SuktxA5K%myH#&}6<9AfZ(;(H=F*u^f$)PeZ>5Jz1y%$#017saQ z0ag-zhcR+`y-F;lyp8i3jMT5a&k(@CbL#1L2~=S;<>UH{%ojneHA!HD6sIj_ACZfH zV^}3&uN*4VV=(CffM@ucay`no6v*|(un4Ax(0}C-O!NSrlM|7(+da{G?pM+_cX#lGs<@Mf*UWB#xtgUB!4@bDx1FVFk#MuV!5D~ zz^L*gZdR-PTp)B&Jf;+ERmCjkziR&8y1v)Nn;fD3Q48of6*H=DQrwRgZafAv za`GGgBnk9xI0lZ@BlB{%NZ9ztX%j|4lt5(dQVnQ9Oek7MclZxX++LbaN@>s z_&5(BrBe}bV|$A)Bd|`j#aX6s6ZnuqP=8Mz?tyl4>D*pf7*_Vdoor7U*Xsq|!W4Xf z0eIZMwfL0^tLVv`ptUy{zkK!UF;9cPM=ePlA8^!f)n8m6kaA{j) ztrD7yl|~TRiz`Ba2Rj(Cgtnp4d94y{qxiDiuk!BI}xIbl4NL z-y?|p8($6+983eX)K5ysC_ELy5somW+^QH)dMKiF zYoWB2Xd(e~5jUdNLro_pwVTb%z8-ehtIzS_dEe*#RMZfg41exQ0ott*CZ(qUbX{Tb za{|DuD>^HO4FF|%V0oC+8?8?OXbkuwXI3m_Wt zwFzuK=ZT1TXcbDr@k+v&2be>HUS`a&{VMb3lY|bgeKLMa~ zD^_&ho>zj@dVeKV#LNaumP9^#a&P7REnhlCK<6$I-QR!whNlr1vV*QtD}#M)zZBIa z0rO+N_nPDPciBZf+Ag3~=3a|vccWv?7FsG8K%3_ep5892GiL`%#7(=~YgU!rJ7`R- zTnMqC>aB+Iumc(Be0nG) z@^)m?YvzE?&*#I#Fye>wp$ zte@K^8_|RDvA;5LeHh()jQhsA!rNXSEvZ|e&su7DBDdHPfDS40dTRQ?g~?mpqgQZ^ z{gvwCPk%rDPjPHqVLUH-7|L$2D_jh2HXye(=qW2cEF;g#u?T7god>fAUYgms9ii!@ zQ#%*Kz3i=alXQJVL`3}2o2FDo`YX|b#%X`I zf8ZnaNwyrrd%)32^=D-)GwVLHXj)>Yi{JpN_kZPlceVTQL=Y zp7%ET?pge>(04%N04x+Y+?YLHB4*N%8Tf7s1w$Ww*iyeAH5(gdQZIH5&Bj!C?hs2- zb!phso{~pbZ|u;jTBvq*jkJ9o$d6iS5fKSouI)y!sM+GEtBH2XmZufVEmyyI2lQtSz@3`7flYL@6Kcb6abK=l{)DI4|%kA|e$c##QX(V+E(9 z+CJtZCrKFBv13)j)iIl}-%FzY*UBvb5yD1o>LLzMV%_I|@h>WcPek_!@QnZf002ov JPDHLkV1kcprCVNo&+h6vNC;C?Qgwg${ zIDX>CzInHyuhMVz*fU&#b-bN(9LJOM{g^A_pCjPiY|znPrS9nvU+h)qTYOU1ds~0V zxChQ&$g2FR1MT=~<|DfQl&nX#jv*9*E3Cja!aL!Ws4|9Hsv&-=nJ6?gVAGbUQ$g;&Q58m5LFI_)WWDkMP^437L8~=ZXYaN$z<;Xqx;;G#P&J^~1EFZct@G^s zD3Gk&X_uW7*?E@p$9N$FoIztKKviAQ_>A(=eO0$_L(gPY1#JdE8@SuamCx0y_mRWY ztnccMtBz-QFhHaL z1xR$wzK<9{VHuWT%3{xSKEkfLB`XFq=22}N!!dwjP*qWv0Z`Vf%)*X~GqKb8eq44O zRQB5M!_U0vzq$(0LcGj~aiRrgmAIAvD(5qn%bc(5%e?RR#xsO}t>9-0_Fvu*uOL%y zjeoW>nR6m}YCUmA=12SDoq)2}+Q9-hTVFJn*=z&MAGP)i)&Ojwo#G3fRVb?2tJR;` zveWr2V574cjc3;)y-0p%&zOA{kO7!s=slxue}-34VSwG4Z!?HF6X|68m)V8(POTHr zYXwgX(8+dYB+7Q=DD=L=Huk-RS{$*gXMcJ!HbVNLnK=bu>1Y4JqK7ZP;nX?&uoiy`Zf5%jIl%J{LB^~gsSsb zf`sjv8mLPQ&_QRhQ4twsCChkJP}+MHn^DlH*_X*y=1x6T$6JIy5V9K?opBBVKw`+ajd9ZrTs{cvObSFr~S*JS4Y$u zqH&6YI%DVfF0)0pGg(UTKh`k5h<^dtGXa$W{KlzAW5y!YT1c&HDzyidHNGSO(3z|h ziYPOq_HJI!x|mfbXZ9-kq%LO&0iagzi1t_?Z;fIUS*iMw^EwO==|=i1OcB|yKy`kl z9sK8qLKS69ai@|-dcEuw=U45p^L&=ivEJd8Grj8kst=HkEEu*iz&pTbJAbMLlpbAW zEeoX$>poYAP)QJY@BZO!fOk%|A?i`4&?>uzY6NAQ)tZ5^ZHL7_wg^O-x$1l*J3HgE zz_7M4WUXAJTVbT=UixR^GGnfQozAyoE3|F(R@y!^wi+y%O|y1EHH;JhNNDtm#?J5k zm%Ywpp?PPWsa|JvKay>)pMOy#qM)))W@F~Ksp}~KB4=8mr~}9r8c`kVt+P$Z#(OGM z9IHAa3wWDx%o*qi@s3nbVVybte!oBea%kpE)!EFj%qTymdOprMs6fizcM-7>YZ?9Z zDaXrF6QK*~uY_H#1&sQ96hw?J*-^sQ%QC)_eW)ePYM%$Df6);3EAM0q_To)(?dI;d}5O Xxe7uE<4sky00000NkvXXu0mjfM8um( diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_20.png b/assets/dolphin/external/L1_Akira_128x64/frame_20.png old mode 100755 new mode 100644 index 457fa7a00ed33b014eaee9ed47df12af9526ccc8..4b4c5b14c6f5dfea9ee86c54e2480ade0e9e2b08 GIT binary patch delta 534 zcmV+x0_pv=2%`j$7=Hl(0002`twPcO00HVrL_t(|oTZaJXcSQtg}*m5x<78Rt0+WR z-2p)`jj<5Y%?82BLIh*GT3E+U(qy%Xg-Ci~+16lVFYE*hvC&jkVrC(@Vv$TV!P#Zj zV=?o-k6`qYOYr2f~vU zBWwUX{ScBK1mFWm`*J|vn@|ID3rZlxZ-Ek!ky^4K&VK+AkOd#4_EW$CJV~-3D1fsj zshW&XW)6yqmr2!OHE_kU&2k8W~^MFf;aBi~HNc4KTJ$jx*U0AvWZ<#qQ31osjOusNXs zo3o4pbH)Jq&nI9d2%b-* zftz!w1Rh{3aJ+Co+_qk|^P-)jO_{OvM;vf;seR@shmY7|F5Z$(Ek%%=dk_KUTvTHK zN=PZCi))Zjx_^WSF#B)6pLHJMLv;bUGkF^F{2Ci0s&nw5Uw1E#_K_J^%v44_d<*&gTK%UcUg&M1Oei8t1 z`$6wzLe5HW^a^Ed25LtwywJ>3kY@9)$ z1&>Idsy=EhfTn`E3SJ8S>e<{m`b#s2R*P#4_!$Dtbx>nSzklYIy5A9e{eOVbk$Y=T z8uuIh{eNXOa@Dq+m!bCsaQ$7tXj;3B9)j0g!zy^WfHMp568_O*zf8TCj8lUf;|ap| z;FJNN2SP@{Z3IbIeNSN8x`v%8=X{6@Xa$neK+`LuSQ+V@NUR`*sSwnYIn>I=n*NgO zT3Ps(`{1_nS>*sG3$Q){MqLDT-l*}PLT^A!Wq($!vDkkTH$o6KZT4^rUXk*z@SN`& zu2}%4CLFCx;8?jDIC}o2*g#kb8Ej(1N-aX9=H{Fm#?0sCg4?Wx8Py{q-ou+g)zfZN;3%`z*q;UQH$&;LEp6! z?|&){dnsP;xWg1c^U#L(dkxev{M|jP zkW-i^t^9*i0i+u=qaGTO(kdKb^Db2a+*ca3JyG}ogaxqp@!m8`a(?Z2ZSu7O;ey1c znSBfy1XAw-{s(&HYjh-C9+xVIN11tL;YuK50PRBs)Wo-3h9x)~iPY*mT>-xST_rsJ mY)z3g=UK9fUoqSDc<>KzII-b?C_wB00000w-3kcGIKLbaPNvT&0?MRB9}Z)jZ%73?4s zl!zH?22Eq>WID0$&CI*U#hYpG^4#-%_xsK{7fI4xg&iq79e==hbTZr&SOuW>4--Ho z&;efp4>kd40w76uK2g|_IHqRF*!KW}X^&fYV90=^1h#w=$bgs#(DK_yfgVu90Jll6 ze3b|TbdCYgWJm=h6^rMc-VszKZ$Po=HQgsQU~~~Y0PE!(hjWwbVoVYNcNTy}AY9-L z18#i?P4H9{$A1y98J87xSj!DKm%ufk*}#Z^PgCkY9L*djsR}7HbX7Xgb&aI=k&35v zRSNZHeI#WD#T68q+r{3F*YQ02qU`@W$;4V;8m6=WG43Bk7EE)A)iu;%#X_uvD69eF+?~NlLP|OKNcu6@I4yjonE^!3 zC0OQjPk#o$UJtMX?)w_94e%6Tx9Lt7`}1E=6mf%i03EoN1J>daaWOLwW%{k5lgv}2 z2kRAp`gntnI{Z2-9Vq}yi_cw~`lW388+^XxI^FceZ=hC++)b-1+qz!7K7M=%&giB` z=Ku50yR$t2Gk)@qwfiY<>#d1%AM@n4ZNRgO3|b*FJ;U9!+kjU-%YmAOmpSIQ--Ra* zz8e7KOT2oxwJ%9o496{B;x+z$&jT}UNbLTG`4;qBgjb$MBmdJz5xYad&p T@o-{u00000NkvXXu0mjf2|ift delta 1268 zcmVSy(;8-2KtdSy}+lDSr>jR3yBJz4c2u0l*y( z$;Ue+W4D~5vYn*_up|A6h_L-83X~DRANe^bA%Gk5D>}LNeq`5;=ue|Sx&S1(UNT1& zWZH5ff>Z%m7J3y#P{9VR2vP-LUFByIP=WjjjR?v`fY$Dgc&GXI2A1nt6~AK)kr2`Z zpdtSxw@DmmA%D6`JDw?c_bjAV*sTFyNwcs?TRVhCfN7Km`M14->@aTmZhzuxF6{sA`BJDA`P7?1UU^-b zPgmo#W2w2Uo{gFd+UgboDun$L;CxE`U4kmlx?9&p08b?!14f(Gu9OHxlb0ipqvisL zCZ9?V*5J~PmQ?MS2$$wsKS6decr1X-oe$UXBL5RG#yAr| zHu>H=|C68=KsNbs?5B}+3#w&(6aliy_dqp4MSuB3bqe4bEE(jVkoCk1DJyUnR$>8U zk-s|uXx6=*!vmBLJddDwPEiWL{dR6L={#0pUt2WdG1HC;Lh!`O@5haxEb=j#lDg=gt2)P^n}GaSc#~e9hVw;aTBpo_lTxQUKZ2{>?34W%4IZ zcB&VC3Ba0s>%#BJ$2ICWP4y-s@k0O=$hUswYT8vL|6_1h-%BD!2dX!MtatvLTe_RMG~ngYz5#Q_U9T@ z+m;gqHP%}Mlx@`aTRS4cKlJNT09NGBxwxudvh(qdU!@Xjz_hW82)i`H6{J!4RqG7K zQcLpjJaCO&@da(6=JMl109Bj#UJR5W~sb_}MuTMUvmz z;(dTh8lguW~pS1=_ z47!sNQ7_Vim5S7i^`Ho93P!y}@L)ki4<5ur_LCm$MeE696X`)ol}7w~5HqcT76h{g zBiIIaR-!@FWY*Ypnw_1;!w}!&1Ml?dPRX z8KYt|8_{*Yl!|fF_Afu#-$*e`V27{009(pncy+`0R@JJJMgVAFe5-{6bFf#Q^6kBr zI8VU~eSpfyZI-xl0C*fAO#6;o*XUedg3=_J_{b)if@v@oGB{pk)cgJWKPAmUFm-C| zEr!hHndc;Z3x7e~KV z`nN8vb|J{R&ht^W=3vqQH#>~kX!o0bpx;3LPadtZJu_bl~{LphIx`GAAuK;=w-aCkebyx!SI2cX#U@?r1r?si(s zY;fNCtoOMHNQYa#KltpEcPG<{0SZV1j?9_utbeX<#!yER_6hs&$v+(C?S#AmDT#OW zLLliY1*@M)vf)F;C!;ys8h`LwpQBAsTur8KNY`hcQN5;=H;Zdd+fuf8uF!XCv6ioU zYD%KkRjQW#sqp)WfaPSDfymg8y9@UzbWmkI_O4(q92;5t(8JLlcyuAWm4~!NK#Xq$_JQZ)Sk;FX;V9r_aF8Jj-smavPJ*^002ovPDHLkV1g6a BmgoQg delta 1684 zcmV;F25b4k2ABW2p5CoO}|Ch-_f(o&7bPva}j=Rbg9UKEa%*EQtrIeCVN;&6*qLlJ!|F8QO za?YR6wbv(u*$W2V+Pyus#*Oe-N=dKCVtZ15F^=dyM#-;u*MG^`fg*isKUC2F5!$*V zdyS0osxK;`=*HJ}GX#^6bN>9G?XCAe5$N7mUZu9L_D$VzPYGBb^^3olxkn87(m|@9 zzokx=d6&pvWd&M!H1w88d;gQbl5c%3DnLrI5?GrV+3*?UXr}*3#IKMUAwMNU0jgjO zv3=VeDWEoHU4P_HvjWKJm)b~KTPej>fZBoGK&{VCGTM3A6Smr=Md8V%rRJ6;{|W*% zuz4mb;I2(>qu>*XO$k#@q!`o_Es@{0d!eTS-8{=}^e1t*LRjh0>0m2?J<;0QUu^!* z7KpAi`>&MS2r6LWC2%`zozqUSO3r>uD(Q%{{awei~R&%TEcdWc`RG<-S&=PHtKYEHK znXK>wC%52ci=0%$^dWLuM-NPm6{#2T!q;IT3=K(dIO^LG%4m=UX8 z-&QLEodh(!McOj(g5?M_E1-R!l92^?%7A>&241TXsTJ&u0iw|M7b*rJX`r`plK-+& zz}=XsfUB&)Y@l+QkAzi->4QSLHdZYH?ZT=$L*$g*0W^(O9}3k5vXsF({WIYCxVGIc zWq(^;HXZ?@1Q!>8MEmXcT0d({7M_oLLaZTSmzPp&ASFqWqXrvTZ% zyOjVc1hE<|RRH^OP+z)Av33HrqIbw~i2=|8LIkZ~dE(r(S(6G}+m5sWi z&jwr+fFa*ff?k-uZImGP(!}d?3i0RxvF;Y6wRi_b{2M_i`TYdmtzASzqkl?cm16J4 z%=o~&Z1TAHJQeJbFM)9Z?bsex`aDFI5rskA-p&BgTT4zU6{Mc;!P?BILap8;HeO)& zL0YS&6pSoUTr5P({>aTzyD-FcSaa@9pCs9tzCBoi`}wtYD{%S65DkdnS_~kOKSKNp z6Dk#*&^r$#Fh=@I@_2n&^nbFMY2XN?V9_fMAz0-J_O2?2ZlUyeM`k^GKj9^}YPR zfvnGK2V7GG|L4S<0jGCM%C`fQuArU)|)JmqYC6B;jFbC#YIYJl)o{lk(bcP~YzyHZ(r??(ZKMlhTBnbhR{9ZOfRCbAtx4j(dyO9=ow}`39}sQshzDaJv|K26~gHC2fD{8vzdVkv6JUdsocx1jaF}SPhXg8{Q zbEtkkUr|**ppbfYE;~{`M~lJT6v?pQEuW53|b-y%}CMk@^#HF$RmOU%3es!jE7FrT9=81up^_A`(JD7!W z5!LT^ZGRkSK7Yos*OpQ|5{)k0>@Vz|51*Ov%$Q0F3zcH4L;d3~XtDt&G&*}i&K;eK zYc8vftNcmquayj;=niO3WC3QcFkUW_DS}l(JLh-1x#2I`5TjGkkoEe})YXx@AAb-pTH{8Bc7Q;b_E>Y#z6CjeNg>}_ zUDoAw6uCPMuK)D;^r@>q5Btm6WRdfn?5VKJM%!yyr?ZOd&S?AdgOd0qnwKSt`OZ$MTR)v$AXCQ>UN z{y%7(L@{OwSgHc`SY3PKZ1MoS2Ld&4>>OZqL0qhR;9r52larkgyJ-Lb002ovPDHLk FV1gv7#rOaK delta 1982 zcmV;v2SNC)2fz=I7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000MaNklkW~&LG&C1EldhWb#FhYwt8g}Zt+nn&;=b>7UDwxD-b3Rh zm^lpp>9HMp(|lOkS_f;bFWv0#db}L7pMM;Y{2#9C`u36cwSRHwpC@=v(qxpp`AuCb zvLQLq{g?J??|KSy;aLwy*9_kZEFSyb)K$yML|SW2-n~~wC~w1<&GfAEWGJ=Jkho`174Wv+6sBIk?b_U4o$fUY*94c0WGux|~Ego@m& zc?^`#Ad^HMlzh5ik5N;|=J-y{VC8nC6Fo=Hg~vcPv`Qw{M|!emW4s6DOluup z7-!ZH6=vDGr~^-bKN>;NqU3#xIQkw5s1b!ucA*wM&39_kHJzwPlk>c*mN{!Qp8h^| zF(5ydaDRH@ekO&rA_syV8;wH?Wq3xiNZQ^ff;K?QtcOp)s|VN=H7OH{IuUeAis)DQctAB9k_R?|G$QZI(6H_^$fO|@ z5g2}6MAEd-y~&6=87Z{Gghk*JLa_!_^%Sl6Y++d8&4l<9iq$_yk?30M^JP#JDiG5r zfqzZ{p0{g6DZ@Hl==rRCPl9n8Git5%|J%S5R<4Da2zSg$0vUA10J7d`9ZM%7KxI$Z zHNM!wrHZV9$SVSK0?^|aWRxHAi;ia%=oBWe*~q=ezw`qntk>x9pq0}JjoEOlF&Un{ zbHC<)-?)>QH4t>JM|3^hxAQufVO;T8B!6J#_=)CJye%90BV)3Rp;O?V=ozfFJ{v*i z1Hx0fInsMx;m0;#5N$oild*E->o$L~sgW7$8URbonj`12{R31)Wh#6mdsg|@bB1?> zt`T^!_Aiu!i2&ImPA}3rPiK_RdMA=a(?|2OHAQCrrg2L72%$_TB7mhV_G}#~-+wa# zly{Mg%zbN&1twY{a4Ot|%UFv@4?Te2`kTQtTyT}W64m5D|SB07u? zOaquYDk0h%tn&3d3)W`r&XyJk-YRHvMFEGFIP=db-k zr6|h6%YofcE!U9Q{ONV>bv&tfB*$7`_8k2|uxf(}{*sZTYk*TiAXvpG z>I=xKKNG$!+MX;7P?P6ffDAot0H^XDI=V&SUmHQEs-M7g=dp{Z8J0ExFAp;fAf}h@ zg?wusTiBuF?nEEruc93RWPhGTp*70o(fa|!->VbY!cp_;c0{{IR6U8XG|LgdYkO|O zTA|(sqJ~aJhK%Bw-u;vj{HD=ld4D?vSlzUY5GWPwdtQXdTCvyOl;fi{dF^9sZLEw8 zI{VGgq-4I0o!5%Y3h9ORir0I^U^dhW9A>c<1F5E(sTV4pdgcTs)7)By z0d$CaMv$!$^!QF{V0l{nqIpmD@=xISyMRjAUkfYRdjXU|H(G63e&eh^TI@z|14~2? zRO4O;F;kVxF*gXT>?mSQ8-Z72baBK0P9W1p?kK;4Opl~O(|VtY zQwzKFVxrp6f6)Aic!np z7ussji(+eJio{~J!tjxH3&Z?9^!l71DDR#jr6Frjx^24+Qh${V1pJB?PK^Y*KL-!! zJ|$s(;NxubekdQE&X%3j=p!u^n!~z3H`d@s4`(4iFlRtfKJfRxvZIeYsOvqM%iK=? zXY946PwGeifZ`9cM-}B;pFa1JQV|unYsqa|=bBbuF6#sG)~EDZI%*w_mJZ3l~R`)=?Zr*hYXFKm+X6cuK^||lu z!fof@_rCh=_v8MKpatU4uToDQ>3OK5P*bFO5(5ftePl|{jh~1ey;EYlT9E>@9o{k+ zJ+;0FlA`O9BIO2hwWX_Fa$!tU-F=<>H0ck|pB2@VDt~6U#-tJ%>3%C#sc<)+p;n2= ze9=1_)I|~TJR~xyM0&M!NefP!6cN(Lvh>oUC_b%5CWy_vn|(^atyU_g3GxM6Gl z4rlCGT#Qi~Z2r4cXh$kog>9sThbW99)Cta8?w-Yja+rP1UfLlB27e15E1DG zT;d8?UIYP~kSetjui{q#Ml~4g@uZvL?immZuyKc-iG0}jg9_LQXsTi9N+C2lfs0n1 ztl`|kzu%!lK+A5XQD@9lrx)3{O5=LKw)8jMtuhN5@WI5AI9X6J3#dh*=DNHTsM5Ih zn14kfu5t^Y79l8kF}8T?i0EwiUvpOwxG0yb0}y zuLvFS63#(cg7}np5Q=!4oT-bU0Y|b)tz5=}KmAWE4^FR5*6Jwdv;5EJKXfvp63~J&d*ieL*pfw zISl>ou{-N^(_z=vG8kigWV3$Ow3{B?x$|1jtL`pElQIe+x;9ke^wWQ4rvbzLjG zAwJRlx3+5UdJ1ymSqn$k4BZMW8tY!yRrAVtT5C_59}a$K7S$hgSrd}};oJ&X2f1>3cB%h*oy{n~L$63_F%&w6g<165?> zr$je@E=EoE1_M%5#s+ zGEhE)L=tgO(%A)DMs*<@<9BifE4Cw<=s9vOECX5BDv4MhjY#-7^~f@&K9v`3zY~Bq%*L8izI-9h&8_EMe<8$V+%YmW}AhdET`Xny1$i zocy2(ERcX$_ioKWT8~15#mg={Mer;#^0MAIYn^CLWj5+kt*}u} zl7W>6$Q;4qlg(2sTGmz5L+7gJXui;O&N=2&IDer|s~W>DZM5r`KO;eV*)Hq;C9D`8 z#at#PGh?dAit}x4vYSW*FCXYWAdkMaFRg$cv~orC*mW~N9uV;Z8$lY8g=N;T?lbVh z5F2N$`!bwF9>J?{tSp;Bbbg(lLVLn@b@5K7ScU4a6iY}*p`wz}%QqMoe?qXCwdb7w zzkdwMgaAq8CL*g_&|2`F600i1%E;AlZpKiP?F|(942Sb!ihXshR@1;Yb~Sz zW*HbAzQ+(7r_nmd%|&!ActVM+iSdMT9IGr0(7en!vUJQOP;Z7!ROHxdQex#KSzauj zqGZwI!Q<1S*WEoxqm@be11C;aNqL2x?>%rppq43$6#~+E_JnWwYL>WPF|{^jIjNV-)9R z9?*>+3edR;W-ZIrYGE;!jVcCD@PDv9T8Odi*xg2(R?J;_{ZIgA(Ml7Au{=wN+Pz2R zowa7fo91)Q@2`im9lo7}GMaO&w6q#QhzZGzS4Ycx-a2|5YIrch*JYl^6T=HLj>#8J zhlO1)5LN+57!sL7*6^Asmb*hPJ&N&c97p#ouM+K*RkR4Fl<0XL?)w0d0)H^iD$F6; z8CT0#<&Jwr?%$)4JtM|*Ro8sWg?A33yBtEEU|m^Dj}+!aY~AsQ-g+mhjaSEFCu`vo zowhEaTYI)VR%bcg-F*A{hau61egmt9U!Qf4;<#j5MG@mkM2mEcwT3m$GXj-vJEFuoDQAgk$~2iO4$E1p-0gvPXB zcP$>xtJd_@b96mG6hAVs4nC_uXk9sG$0KB$H&yHR1lE<@u?Rgt)PLu{!6;kGp@xa~ z4nfcLc(70vSeFObQI_X%{!H8gdoaJ14SQX;NO`R_(731#n-xS=5xej?n^DXG^g?5t zVScC2y(8FYo}T|3C86g;)sIJGppvmM3VK#j^b|bJ&w1v;xz^-=! zook&?CMzHK3rc&Fj((=Pp6??`sq@}UAm#4D)w1gai{N#HVku;>nn5h{HZ_>G`!OE$u;#W5w5w7O~o z=tcwo%LTABEn5kBJ`tY*@U z7c@JbbB3+r&d zYaQm96igIjqZYAuh^T*X5*16fo-s*o>d(Y^2azpNb`Ml5rpHT^&oJ%OokT7IbEaK6 z0v!U-BAz?U2v)V4WJOJ#Ov#7Fb(dT_V9vA}D#l2@3y5N2=1@8W&pgW@V`aBmzAOzC v3ZwlT{oliHg0cQ?+^mp1to>OzQiOj1Y#MZXCxqR~00000NkvXXu0mjfJKM*= diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_25.png b/assets/dolphin/external/L1_Akira_128x64/frame_25.png old mode 100755 new mode 100644 index 26c944d16e6917c7e73b40e072cb8f87a5ca8afc..9da0a4cc6addadf436d7b057df3443b207f88350 GIT binary patch delta 863 zcmV-l1EBnr4(bMw7=Hl(0002`twPcO00S{eL_t(|oIQ|TY!p=(hM#k0ySvbzUDjPo zOzjTbAoZpdF~$~mHbkRDjWJe5gEne{QH&a+FJJ9Av45B29X2ld!Usm}`^vtfRG!GIz={^ygK!`mOx zy{;_eZ)5B$c378=>nF}b^Jn&9MfT~ak=^P6{8Cy(eizJ8yz>qpt+~C%Wp^BZ_ggddz<}!NWhp%KX+(v)1yIGliHgcS7_^)X}hq`-qwDH#P1$J z0@!u%rrg`BS2saQbWchoYryl{Dnl|`(yZIPMt(Z~-G8so&WkFho0;e`>100a-uP)v z;jBMJw-S*nJ!iIdj*E!vBB4n)%P+}}R$0O+i0;vtHF}%1?rN!n8;T`ux>&qe`?%%x zsi8Uds%fTMiP;cN^rmK|R`56-OVkuk;pbk=po#_WiY{pw!0UYtV773*PC|^N>N=Z@ zhz647<$vju4zq2*EP!f{pM1z#HaLI=SgMTlwf;LCP(Q^q8~*Ey55yaZi8NWZ&e;{* zC{eblRfaxooC1&5MPs*nf=9-1MrkRBwluHA+2dqt(2gSJtY*I5{ zTrL~k0B5kjnQDW(>Y(#Jl#W|7ZgByD zWLN`qg9Cl_5Aq>+FQ`UW^~5=1K#fT>-~op3%V5$VA}-{Atfs^uel%i1k^rM3i|t~3 pm+J389HbftYdBT4Jk+r4{~vITOV6e=O>+PM002ovPDHLkV1fjcr=I`- delta 1809 zcmV+s2k!Xl29yqv7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000KYNkl-zRte}9+8A^)zBT{$MR$Wva` zHKQBS6aD^{yV|;TVSVuE4oBCB+zd1s^S7$2)Rkdc?U}6K-Vvp&31cSHvd&H_)vzm1 z>mS)n+A~{5Z0Tw-faWUJc4Z6@p~!51tv$1QrtEG5+uiBfX6x4bwL?oQ?)!$Hd0&eM zvWWUmOXk|wqJK+tpVcXHUFXW%e4gG`pELu=Xw#cuIfh63n)0Vzgau9i3g4fZD`X@T zbC1n5aJ>hG1pMGCXBTW5RfVXJ--#JC-;UNq_F4PFG?1m%RfzVH@D^W=i++o`fD?#D z^DF}}a?xBPe7OK?P)#}1E~>D#V47uTcC0m#a%XD&ynknw@Z2ZbiQZ0^GOTBd&e3~S zhJ->=3jiF%Kp3zx@wJ4s<=%QvJb$UtqvnZW~ zW*8BA*ZQCdLaqVn;!&{27}hgbi!XIS&nw$`8_pZs!hPTVX<$Z>76)Xa>h+$s(9&R; zn8ey`atv*ASkJ)5DH5oil!xY3_K|v_>vdh@x_=W}yn~kJxXACX-_b&QwCOGWimaTB z9+ikL=X;&pG2%PC0$wa}0>}^|&$_l{SPik;4iEz(ePAI-!pa8NMal$TD=asJ{HMG> zzsq|X8)(d9>5F8u&xKIQ6!KZ#*}*H7Vht*~Q>+Dv#2uD9u*P75%IbxUjD20#zr&!2 z3x8OJoP?DkY5JpGE@3UMXGD>>q7&Yxff-092wa6$xB#t9cDH+em}MAdLU&VScJA1D z%ODj5Mi4cSNFRm;JXuyCrs;v&N1rk4c4uG7I9UduV*o^T9^_78ES23|8s#!RSL&l> zAzpqhe~SjP%=lJ+D_x@0FMp#LGhPOgUF5`jvNc1==!pVLZ>)}*!5AP7 zj9T+9ssg7-;l)ZT-WvUFsRGY5Kb-rY~#tx=JF@769`H}n^)Qe zR3c(zD3WL8$nRd!#~c6j28keJAao_L3T$v^wO?u2E7Dj2V)a61vX7Hc1KBb7w||1G zfvQ(bEIu7G*s9Y#90>xgMQ5UM6eoDQ z68UOvTut9>q#ubVES!i79+d@XKn$`Iq(xFZ`MW0{)g+!2`LFnB9blqrf;6@mgEIs+ z8(@O6CgwH-@6pvtlG4@}Sh?HTc93~j-On+O^IF(gK z4@Vim@~yH>XI;I*M^|J5sDEXa;o&F)MDtpYZg(ngNKSOpGySTvgbIWWAWD^N|IAp{ z_*&$i$@#N#tu{!uZ2LF{*gfn(Cw9?sJZQcijm@Nd)v`5t))<{=F@SFZ1igAS_W5^2 zCoT2UWV8L&zEuklVIS>Y7k^SQKy{5e>w~R4-iz`*qwApHZsyBiD+sJGgx!Z_O36qj zo8$jxL)bbEJY}gBnSj^c^4A@V$3Q#jtj6|n@Qx8ga(#9p)=AU)oH$}-u#+}c;v=Qt z$iqj1F|DA4WLrnXR{ttI#SlaPA3!3K(ye`>IPGe#>*v3M`Q(93r+-{C2>g`q+kqGP zN5|<73Qrs?nd1+|0J`Yu^bV>jxjxAVs>{e!P0Kz z{ZvND;MceSEqBl234ig!d>*!~_MO2o1NhXg={T^G1tR(Bl&xXbEK)_b`;fVxDgrU` zciu|Mz7vr}cct~QE}$zt-5s;)^pQbE*Jz)T(?E}YPECS!)LRJ@xy!#l>Gs%pOJ@Pr zBxGN#^u}Ldy$uu@rwW~iMa)aB8nktgWBdVN8OYy+^XKXS015yANkvXXu0mjfc2s_v diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_26.png b/assets/dolphin/external/L1_Akira_128x64/frame_26.png old mode 100755 new mode 100644 index 2972318cda5c23c60ad9a4618daa45b292c90c09..e7838e39f389a62bfa15f2f93d72e736d2841ca4 GIT binary patch delta 749 zcmVyHL20KfTcU?&W+3sP{5rVBMA#e7X;fTbYawxn7)dMe-hIn z!ICJ6FE(fui36dbbl$s%#k|+xx4Y*%=ljn2t{IzR^S{X8-+uytNf?&Yly?+$MAEDj ztpT%=ewSJR1ZyzsCv(8W5mez>R{#JN=uYKSD@k2xsrLfQ<7Hh>Vqw!{?xZ3~nRLI9 z7ytuL7C`xbGm5pwISOO_d9UF$LfUe+06PuXg_ED;o=@4Uq00XQS&^0BXGrbUxpS`DY#rCIMKy2rPUJa4;H> zbfzY0v`-ce9R>I}1kAm=7Ahg29Wm&NwpyqrfPWGEfq#Hio1Y?m0j9KqEW|PJa2kI; zE;kYj?FhL08d(ahoxo)`Al+){ntby=1>pLDTagy_D5?PV6E`58QdZOIk*)%~8`=f| zcS67e>!;ja$>_S24QB%0;Vb!)|5VC`Q(1Pu0TAdSfOVD|gAP2|%K*fdp}(1d%C9qE z-X*mBc7M)5TD=|tC7Qh(rKxspWyX`t~7Umi~nY_2Yz1-bzfkxp36E!A2h zP3iWxHXFtJqgrC$d<@fK!U#7ThmA!yD}O8wyk>>?#!%82=z!|jtC=JG0@|fo%yJU) zO6h_PpMb6EH1)F*4wwE~_YClqB<)qgF4H{~)Ka!IB|opW1)J*H$#}UA-Em+S$Ky?u fJ7%n@Kc&_q!ktVMaqYSX00000NkvXXu0mjfBt=@V delta 1388 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 delta 2051 zcmV+e2>kcO2Za!j7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000NKNkly@6ov3uyR-6Z6{TqUYQ9+DSy>jGUr$!1C6m`(LAW_ zF5~Zz_s#@G5y1EB8ms~og}jbq^rKQ$mpic|(u59>MF8Kg8UdmOMMkcmBg2mCZ2Fxk z;VOO{K*^P>BY>KpqZE|!gs80w)zNntf0t9e$G}7e<-#liOn7n?^;M9OP}aYKhyy4x z|5d!k_*^JD$$xXv=Xrj7Ms3zuHZo)p!q01A_3Iem4nBb7FhZFfsBGSqIL6;HaJ5jD zKdV)MQqn2qs*gx4YN0Yv3H?l7q<4m>OkIVKGB8u5vXH8mdl~-J&o;HjN4iw>@%@#& zZw*wrTgk91?HtGPCk4!KZGU`66!IhZ{&q|j=GnU|Cx6L)MmqU481WdUwY{3cJ*~1U z7S7g+h^&H0e`IWARFweFJ}aX@$N?g6MV`qN?A8%tD71f=I1N; z6#>*qvwuzUWXO;4{rvZpUhd^Z9H2XAMDWmeWu4w0XdRX?S9JfGa}W-|aEhFJ%9IYUD-bz06n_|E>c2azUmz6c$7Ok zvK8Z_y{hDC6fM>HGd_WSqaoNCq{vFvPI zhkxiPMrZm}B5VikdjP9kWXOoAqD9zz=6^g?Bd|?Wpg1j)i}H8Zc|G%2iDw2F0d|Fd zmY>;)MB}US(C5l&?wtI}iI3zmUHoVCJ)3*>4Xc1FU^(5tXPcEpfJ*tLjEkI3HGcQR zv-z0*{`PRW>siN+rmt*f^!+%hnW;;Vx9J;7>lf-`}P)n_M@ zd2D4ro!qF>ij0q<`rN0NZ9qbiG8HFbbFtHD7nP+YKMwH?t9!&f{J1Bad^`U%7)m!$ zWJT-!aI!(Jg0t|6-m|b1DO3s7S-!TiqZGnU4AP5Xm*J;=Oit#Q*}CkU9~=NpWQC&d zEH8P5kx??1pXrpni=s<3$G44d^?w*c-xoD<`9tu_0Z<-^LJJzt+OBS#8kVoj|1IPD z)2gIg|DNg3s-p8e$2%i;YKe0tgsWJw`AX%mQ$ErM&CT|`Q#~;p$1&c!!FASG<X| zZ-TmcOrC<(dsQL5SrmI@1b>K5r$Q_x4p7OzS8_Eo7Glp=joTfMO4BP27TpCr!U3ua z+<9m4jr)i$x;ol1uYaK5Ex1AoeW_#HpMnnYWjB~R@Q4V&7&7V;ja3c5`qD|2`6S1j zc*H$`?ZeRd1r4hE6}i5C&kU#bVY+v)>H_Mv6o4))<^s?iwa4reh5aZMSXoFn&pTn)dn*UZImq>%f_Q5vt>?Jbyptb`t0p-yP4s&$eun z&<&t>&Rsxp=DH@X*FS;1Y^vsCjH&5}Z zwDnURj2j)GdR3dviTY=E3{@vU@)UFkYnINCe(Y(-hrDP!ECO^GaJ6=iPWF}4-evDq hM`h`&Dr1Z>{sWQ7djtP_PBQ=i002ovPDHLkV1nOX@;(3n diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_29.png b/assets/dolphin/external/L1_Akira_128x64/frame_29.png old mode 100755 new mode 100644 index 8bcc83a1db2c9656942f74f1f632247e78502c92..b4a35158e37b076d861f8cc395b30cb1a12878fb GIT binary patch delta 915 zcmV;E18n@`4xI;(7=Hl(0002`twPcO00U%6L_t(|oHdb8OdNF-$3OF%S$0{lyRD^A zY~3M7;~x$+_JG+020Ylth!{a@H0>Ir#u#G{Dw>+^)Y_moVxs9m(~0eYVr#Jx+oTX^ zp|uASHZ%k^H4LmNC`PvY=}vcd=6P6n$IpB3`||xh`cIv*#M|X6{JRHR(mDe3?670R?2NqrOrc?tDTEf&KciLH|IrWMC3dS z{;WE;++1A;lX!&OkooxEOClp8k})Dq%Is*{{BM0(qu%fy3XL^Q?yiW&%S1(vCiiyk zf2kiB1)?f9e1EL=%t~gUKXu498eXvhW&yPzZ@gWtU&Tf25eq|Y|GwxmmAMUDoKMKs-aRA3LsmW|=ks#sb#aDd}Yfz`92wcYo2%R!_zLN=O1HD92eC0vp z_0ddWyI%V1Q9wnCr9TsAobb_rhQ|Q4z~Ii=v{iEOD}TGnId*NWoi?H;1G?6d;?qaR zW`6km9s^A;ToNDXYW((Wyj@`+N%7T3ZTMLY`z;JJZG(pP+%E^Gu6}Q1;_;E8@xbU< z4n0r^+AiNam`je@pa!nng>B0H)OdEG9HJ45)F0V*Ew*Rs88eX-UzLu1@!;XmHMV}$ z+d&hkZGTgne$-!u(xREeARwJ17F?=}S?MD8cS})eac&!)=K)}Yvco45CEb)15ad9m zzrNG_894?}wicnFP*L?sg()}foVCNYLr8+%8XC zw6&L4JSJLX$pFwV_s|~IvEBoOjDL|U13}JZs(%_@?-Du)E%UQ4tcW-p zE4o!(IkZ}ht=7SP_FX;KhnO4S04tXCa;0oCl+uba(&ME|E#m-9p;Se;q<_;SD+OT3 zcqkRS5Xg-DlMr9Q(;q^-4&vN$L7_c42Bs+>7XXEp)oiR>KqP-0Q0TTc>XHLiQUFwm z?0>anB45luFCxAIco!$)&B=>EfL<%2Ywz7S@!wiZM3$9y90|Iw*SMAbF7E6*r@{k3 z_*B@A1lHox=H{5 delta 1888 zcmV-m2cP(z2jdQq7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000LSNkl3*>1xy40DS8|1W1xE;N>sC?83?5*U&uwj^7(cOB<>p2u;t^E{h!?Ksb~wbuST zs{rY-_Xy;l$rWHoRXss=gL|G71pnpe8HLMu}uyXwuWw>&BmJ6%l>zV32qGFN^M8b0Bhz8O|M3X)jlruot{MR%MMa^$0?)G< z?QGr(T;=^8%AWmX12Y9Yb4gJ-Y6|cS&_1si-<1k@2YCAH_YXV3hDRKjMF7jt-g|T_ z3qZQjbL8EP(|=prfAxL_ngTKfW0+*QHo8{@^P&uTdPb8~zDRE*oqRH)+UPjR)7j05 za%*+ITFo+}%as33-tQUyBdgZ4Q0p=4SEUO;9xT7(CNjBH<=?H0JAi9{rhx3gB`UVm zv|-0)VcwI)iva8lz)M$A`2SYJNDqRdjjOh3IL=c}HGlMvDF2(nzXk5YO9WuvS?!l2 zMMf=@>6Ds^a3n>_C zRJ&wjyzwdzWo|}qMHJ{Xw$uO-qT2(tps**=?zvY1j$M~*FPa{gd(g>!`0b1jV@v3+>2Whb{g?Ck6#&;z=ns#p#JSBp)>5NFZpAdkq% zuYWdz2NP}F@kzF3v(c{o=7jE9||u{M|rCoZXLvF^g4saJBbm^AzJBp}S*V1<#Yft5AsmBlDH_ z?^uj^*nSQ$lPf#CgB|{?R zewOBr*4F%$u+>n{0cLY-HT)~7VI9#lCivW(7UdvF}bS_5E8W}7m5fTPNw9NI(}oi`fFqjqtI zF2eFyVgR0!?K95;S3)^4+|^rWrS&zD!3a%2SIiLGeTFw=88zMyZBW2dmev>@>?4)fZ1H9 z(yxqP31w~7RAT9($KR#+j@yrdF`D4L0_?*xUJ;$_m{y^K^w{?S?o_;8XZT;k*f%{^ zd%yJ%uNaEX-bW1vKYwTIV&1D5)13t#gO&L>oc|k$){2(ALl_2+C!44A{44rvrO30g zkML0VXIF2I#d)5u2Eb0WcIEw11Mp~NMsQVYhp2WRBiB*9w1KL}c?)2;BJAxhP8EzO zKU1oDRrw*pa{#r_$(X-O{@aztJTFvIQKW2@-VBBhf+|XlPFW1E#tI|Iyf#Wdp3+gq zt57z886{$lj`EkKzuIszWkr}(e*es5x&v+((Ar)>(F$1DN>0000}Xn!3jqKg5b zZ%h~p50)D1O4KEO&jZ>9Y%q1v*)IN*U;EJ3yog8xI3PYd= zDQW|l;kLAh6w#`p4c>|>IO_q6fcECGRO0lMh)942;x^K+KLNx;XEV^O4y1~wdKABb zIinvB9SEx3iGRqq3l`ZS zfHSA5+TTY!T@W9oI>Iqk`LG(FSsmY|6$+e-v25~M>YtOLB|46q@swuEBWuU2Uy~x9 zX&W-(P5aE3Du}+ONL&vc{Ml~)f<(02x@==G-N!zgO@F*oKCj@~-`I1If#yBQzO|&g z{nvu&(A^{Y>ZJ?!^-I#-6{rl*IbaRn-t)M@&Rd%zxSf8p)OBknH4-Rdeyk%^48k{g5 z2e8?)r+>F-8=Q$bH~`gt(|e}YwQ$nW1n5D#c5++ULXe^%zag%>!Q2*{j8z@6nH^Ya zT{l==-w&634gp30)~fpp3DnW^d9+eWsb?1akw1e9vvJe9#on%%?TxwVTu=sZ^Sd3l zFSq_^JJJJvx~*|Kdg1O3Pkox}q6bDx9?hw}ZGT8;(5@B{S<1=5Lz*03G=HB=rNuwc8xvyz;n9hkCE_HOL<*v2H(2+*ABh( z6VKn9x}3Lm9Bao~&Km$WZJ${&o6iHD77-a&D`UpZd;?T!rIe~i_PP|556cE%5ebYP z=6?Kwl`ln1s`azQ{OC*d$rB~;Rqov6aS!5yo(2%zWG$Oy%=zw~Qb<)IZkzP#x4T^2 z(!}cvc9her?Ol|%rQPzBnz~W}Z4peWd5pI6rN`-OzRZ(|;U4asHkDfAHyB*&CMb z@9y}CFMIK61K*_|>9I9jfpxr{a~#Ku^Zl4R;eP?}>1@!^U)|U_-p=c!edN@qocb~T z1?pEe@ahGu%C9F#}w2vZFv%bw=Zr4#1DAW&;}p*|-dyJ#J?Jv~jzg ztbV(OpwxP+BTBPXS=DS1l^$eIWJ49l*!T+}RYR|MS%hBlpa52hUeyLRzf1P6bp9A4 z{w}~rG=DS3Mtt_O3ZHKMr*i7Ny-4Y)R{Wp_aS%8=8@2lCQ;(XttRe!*AW_qi#tMLASZ6KQD(PW<0vN@{k4yq-Bbu>)QWgMW(oTCLOCqHvO(qln4O0;`t zi&j|=vV-}+;xY~pAqtjief1k}9jI(TCNH~>*3$(Fc&0Ow;cbfc_pKaYC(!1wds)ji z=OF&zpJ(zrxJs^q_J0ojG@?vlH-A)hKAIotisY$a^VODh2OjY!VxrTIpmYH%W9Rtn z9RovTd*>ZQWsJw|OF;I5hs~K|7^$>~HeBTbSr91gTf|wa2UVT7EdUs?id-*F)J|xcHH*5oTIDg`*Ac!&rLML$9bqBNq8aK-T z$T_PUz-l{U&FmiH2#WJn&XB#pQ4!5Y^3p#O_f9CzS5I6-@Q|E{Bu4WX{5yy_*ZySo zXZ9jlC@>>kQUEZ4?32y)Mt?{1*vVJA05r~$pi0&2w0+F+nXODW+W#3~p5UUnk^Gkc zuoKw{V9YY@IfH&XORL^4CAG3slg(2cdj&~Uf{Kzkz-gi`YF^)l1F$;lpG`zH+s^T0 z6reyvr<#q8Y(e%!t*^H!3p}=0j0ZjD&&6ki$zNAfy@!&GyiR|A%70OU_ew;1ZuMnQ zh4nIiz)DHwB@U9E)l#cpk?stQ&dko%5WI=t~0La>&$Pp2HSKd`9?-?S! zN(Z5k%qSx$?+c=F6OSnYK4mkg?7ySi>+wH|O{`^P?JGO+ip^R2ALE8!26>fAPbBm~J=)9ZQ#cDI6pnXIDjB%Y4mHA`n zzsO;Mh-FpIY7k@@>oEZ^#=bP()tw=0-MRscWbc~yr~nv4TiEUtx{4ivsAPps=6GBH rOoVmqCXT-f(VNXG9vc9E*n|H7GO@RU*n=3Z00000NkvXXu0mjf0t~$! diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_30.png b/assets/dolphin/external/L1_Akira_128x64/frame_30.png old mode 100755 new mode 100644 index 9f477f8d7fb77c88420b25c3b6102a36faba6d0f..8702554973587e44555e57bba992c5448c9cd8ca GIT binary patch delta 921 zcmV;K17`f652FW=7=Hl(0002`twPcO00U}CL_t(|oHdYtNSt*X$6wF)p7YKh^qeeR zNa(Q|h*~=%w&51{ShK~TIH)@-&|NF2)`*J2n2md+LACv{L9v9%a(@(du}Wfr;kt)h zAT;n=2}0OC%fdNf_c+fyJ@5JShxYHA*X#AioA~4Cfu9orZ-1Z2ns_e(sjEQ}`}IDN zd66*wPW0f;qZ7rvNKWJvRm!9?3t_E))CC7j20GD$w5|AZA}NuZDxcYAYh4FdbO*6O zM|A+{Rll=eB!4d=>w0eL{Da-ozwyu}Au4>ao65upGvETc$})ESp0*e#tW88kI*vE~ z%`kR&OL3`)rMpeddjbbg5Q~{w4;n?uI8pIbEXyr43l4^sqGtiBX3UN&RARV>%!{X7 zsGTfhRNOJ#r4RtI>POz@ts$CR`o$wlOPBu@mi7VueShMq2+TDHJGFijK0g8~hPOWZ z?xXqdZTw%^0HmMm_%$%Ga6c_S%!-G5vgPTj8-{j0?vKZN!~@m5tL~>pUt&l4N0}9m z;gjii>b}^kWuNJmr+UQGlXoX1+*njrL!8}Xpo0H4TyrKPaC$8KUJ}si4y9IRY^^yx zKd=2E9)E4$Och%PZEc{u5#_v;Nfik!j#_GB(KW0+QpN^a+tHfJw$JX9GWe#>EWQYH z^8SF6m$J(IQo7d^jOQ6YTOR{Y*;4<0)C3)MPCq zl8;JZllU+o8#$5Ql&tCiZNVU_hEnfi6xCLS<$qJGUxB0!fE(gMmwoFv65Av!#8u}m z6j&YDQbHwbZu;4qtc3q>+$M6)iE-528uTK1^h9{=5(+@5OyZ|tpDx)7d=~g@D#9O6 zkNX_Zu9*ok(wDOvFN$Op{+E+zVIZ1&9Z+l=ilE?t!{Qr&&RvlO^bo+SUjvH0)OZv* z0Drpy6iG0HHDG&#fKLH|?0Q8K){?*i?J031_1-QoGa@2#pLXanH})Lcs81$ukCV_Q zxh&#rFK3)|`U5XL0=(%3ob6u5!*8sZq+I1L-vRiGQs_H7Y8i?@{T2}2pm)%)ffu6k vZM!$_`s{T?M0Bxf%Qw|OSss1Z0Qe6N=n|P}$iP&300000NkvXXu0mjfaofLH delta 1949 zcmV;O2V(f62cHj+7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000M3Nkl8M9qWtM<3zMEOKy|s26$I*K4&3g_U$I)7A zA7dG4dg#4|-rwWb;t$bBKxZD~Q5rKC`>yVx>B!&5=iXXdK7UDsQKUddD{EL01JFEr z26%_^s}#>@qBFnIA}<2yd9#rq1IYv8ix~ln29}WTQvMFwQb$N`&;ZWxpq^}AHUe0O zwL*Os+Cb1=%y9IYe^L1Zmi+p09ETT9*nSw+N;fTP)n6 ze3a(;p}1HT4B8|^*DCPXT=~1+Gh0Vo;r(}czT7+12Cf!i5mAw3njxP0#n9%==fBZ=F{g|ucy=ei z1kMh(s(gzUGBVAVhbr&XGThlkxc2}RU~M5%x^+;i%V6_8T9$Y1D!dSnUfb*4tIXns zn184MW6%ou^0O8GB{D|g?ZE_I?HHD_BL#3JUai?*$$E%*pF9W>_L$?fK~@pz@x+QN zYc6a3W)u=pI(xqp?oFUKmNgnH0(d=gWUnY)J!aJ{Oc|c>XFXl>v7_qOIBS5Ypd^zP ztZ-`yE>a}Qxq8gwUC)g~5Kl>RO~k|XJbyiop1bh!HewOLE09pgWCfrHlrF6Oyl5i# zXDI-s8g`C|vJo^L6qPQC0An)*uRY7;DJ!f+Dt5+KWSs4nneXLnNjD08Hl&ZOZ6IQZ z!4d%S2)RzqjTC9@o#p*IyoD9BR-vZTs^!UE+TD4!)_?(6!j1@ljp@(w>2&~lO@D=e ztQv*Q_0B#Ntqbe%lMU%Cs#HdV^D0;$2zjlwu~!qIxe}2Au+jh`Ya`LndLN36>Rp z89q>?WQB2*uNAm|70iJ05*nB9*nj)zUaNEvUrdQnW6M zZb7fh)DDcN3@pQ)5q5-s7G*snn29hENd3TnAR-EOXs;(`9fCDi3nnWNj~7ip>KKun zj^u%yVa#Fs?nnh^7jQScZe!K}W((ZviaW}Wb@sB>PwWBzD0Jp|6?Q6L(tnrz{OTE_ zYp+!P8G+hA5CO8@UsWJVTDuHA67?$g)%*N)6L<%r5#=i7BRaZ>U4hR3cPYQMhZw+< zFv35(CqUy_`m7_8bH;wF@Qik;3%DA)yx%I)SUa1kgV21&Z?*Eh{T^=sJ8vjwg^fHo z@|5!{`O!3(u_0ML-T_F7ixOF$7>`lqxAsK_5W%X)BLmYHN$43- z{0v``{*3Zl`!WNtyse^*v*^!WIL)lrYnkyyXg=BiX7WF}+Lhz0kkMd| zo?R=wwPz`Q@N)ULfqy!h=+6;Y6}NXYw;QPUzFYCS#*ud!=O2Vv?OP@DQN^)2lAr7~ zYxXQUe@Ev%DbKUZpuyKmzVxc$DrUTQ!%DU1pj_%14C{m0I(>)F)}eWtx2n!z=7~OQ znfBg)|JN`isA}ttT$E&r#Aqb2_SZ_DeQKH!RPDEd{=+Z-`+qy{00?Ydr2!0jE59sy6$cjrHiD$ikQ#F9rOomi-nrKS_U2+Al`7j$=5zym9uVgb?h zl%Aor6RrWQC{gEVE7YMhv?2^fBdXZwI#2oDo_9ydj~aj#NhKSpJdMI<#yhl-t*Ema j`ZG0>m(%Z7xE97AVJ9)t9e90%00000NkvXXu0mjf-lw|+ diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_31.png b/assets/dolphin/external/L1_Akira_128x64/frame_31.png old mode 100755 new mode 100644 index 4f2deb5c58b47c14558a5183d1a7e9b90b16d71c..68249a4d5275447b2d2fbf35cae1a56f9a07f7c9 GIT binary patch delta 917 zcmV;G18V&D4xa~*7=Hl(0002`twPcO00U-8L_t(|oHdePXq9ywho9f?yz{)-{+y|E z;>~%LYEv)TaL|Zg?^aPq2m{e}Gk3r)g8r?G*sx}=b+Iv|b`ceU`OZeJ18PF$lJdMO z&_x#;P299GUk&uM96Q$Z{Cm&)?PBY5`M~G7dPp6^tQktxr++0B2|E&i493{`=6g~W zk;gFB_bJod^ZHyCfY;6gGH`3?$Acmz5&1oVejhW&?uAvb2tEyi8-}KS63L0kVnXRF zy7{@%Km1JIgxo%3!K&~5xaWa_ya}8~JE)H5@4q9mEF#5(UKsc^e({Cx0@kMVCu0>= z*LHkq;#&|#n187M)>T*CoX8CkDJOJW?HAO}x&Q?m&@R_Uo6p&K@Rx^CPr$Q{&cj_S zi=^W@34hf-6(jq)A`TRM1JKr=rS4M~uwbgtf$G(6hAXV26UH+>JOp)(&fyi67e}ZT zNoXIo53k68lEQiiazNwex2JVn#M{4DB!SDOp*mMZMSpZ^tVa??5-!=>)Cfm6&df~L zcCbTNwP&MUEvmx@oTS&-7?cC?l>Cjug8E=8u}p%*XuYY9`w>I~Wxda#hc>FzCI{mm!c@=~( zzd=$LBdk;!YnSOr%BLw$ z0DqL{01V}zun@SO1ZvPCOT!KKOS%59MI_AXUtp%GMeZ8*=RkOZT_VoGs$#qxd?e-l znLcJkobCrDksw}7xuCNJ3k)Ez{y1<*eC83MZORoJhf rY)SoF4WI?}%@2neTx!Ym0Q?8c_L^7ggAUAZ00000NkvXXu0mjf@b$x- delta 1908 zcmV-)2aEWh2loz;7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000LmNkl3?ULg-2vkye|5x_?IZcrsXc{5gnQT{WIguqm;#;}hdmP7cJRXm69LHeKiQ_oN z7~^fM0;K1?M<9PiUXPD`hx9$ZU7SVN(jUV=Q#(dKk1<*jDt{aF6d2L!8kT1O)@Z*) z`IgTZzZGlWF+6c#F2-jx@9}t~f4Z%tw3qc7NqF&=in)Bjy-y%=@eg7Fnw`KqU%A3jWsI?;%Qc43ERi?j9D)wbk`% zi!;9?KgBq9;}g8U>WI&%TF<(Gi1~afT>$bxugA}GuB!aIm2n3mhlxHf)c{eB$GjXd zR(P;WjLdLY`2SZ8BSNVQV0~uh>8!<5Lcce6%97D}+kfyEhkpyT26{zGWyKjg)JTzb zEPHxJpZpCN~?F^aUAbI21UpY+fxv}Q@_u#Nr!b8 zirhGVH&nV&TFTyaVNrn8HlHJ^?a|ES^hb=k^-^_P~}xs{-j~oc;mak`fg>uw`Nzm%FgSVg>#iq zw$AeCY%Hn=vNch+(}j(2nWxXF!04O}OaVV#Kt+H`_08HpPpJ96Q~23=9-nGNP>am! zT5m3<&$GLOmt}CK6|&TzDx?~PqWYt{=c*Da-G9{OIUnv?=siHRxDqw6dtjc)=2Z{N zGcZ<&cCn&#rLNiyEX?H^AVZ`$MTsmovUQ3)6+SD7XnLVMdm>GbHhZ@M=^mg1FRvlL z%=lJ31P>Nvs2m_3dbFM?J$uiLoatz#D7T-tMSu$PtmuovzeS}0WroL;s~QOwmzeex z*?+SAu)?`w1Q?xL5kN5-yFq(UQJO$_hf|3N>|nc9w$fTMBU*L7UG4N3A$c*ZhRn=ZWG>J3D8LC#k%lor+(SEyh ztLw6kq)UI|Cjw*>cO$D{yA}0HKD`qxtz@-O2c=&F5hx5(>dGdV_gA3w`FA1mev6d? zIs)$h?e7IBt=uGH$C$#S;!x$u2;rH%geFN9RVLRTiV(gC3N zR}UGBTU44Ni${~m%#aniyQ5R;)MNDiji4@A#XUyf02HsUhFFYlmF~s6H$d7uLcL1o z*PO#}rShw|)c~$SWI*f!%v&27Y!pE-Rd{oEE5DkK|AYZ_ zb7ME`JD}3OwFXf0|8AZcs<)I(`5BF!%3rzTXx{^TI&8nM9(I=7CrvLh z%qP1CIZOE~_!B9hif(VMrhg1J9?@M{r_x<1mcPmXSTUvo=c|U0(ahvrrG@XRY4jrv zVCA+iqSH}6^2jQBkDemuP8!v_lkEm@MInd0Jn!78e9O;E52~CMSytD2XTaoKG5}A> z-l23aa8wzTOB;sOb*rJAwTm6P2*zWgWB`$p?O4?USD@S&o^`91-G5qUz%#k?7H|yF z05T=xm|eHq2-GmGqNB_zk55s$MQQ+09Q9y3p+8$&y%oF*^diV^pd)l8 zZ0?8@XBVFe|H$J%N%>=t2++-S8LAOsw;ameR-(zLdpyc=**$>QLRH%-HFsvltG-j6 zp!z$&RlvQ>v9~$L|9@}1_U($hYQ+ec@pyb9CCI;!IX7z2_43)R+$y5$;a~e0|Nk0@ zo4G>yR;cKZy}9$9Y6Q4el{qW&tn4d16#m&WT4TY^^(_LNmG@T-AflBS!BwptqEj!Z z&)s;d0jjweaYfiWyEs*_qWny$>Qm*X%KeI7u*EF&t_rskXKkgi$P1NJ#FVYl>%ya( zb^#ToVnKJOA?z@M%xhWtiIk2q-i^=zI!eSG&GOeum0po!m1bA@^SdY0C*kM+7=qYc u&D!tCM=27KURAMb3R8+NMfutMPr-jiy6CUxQDj2^0000 ziPg-Dpsl8Ast7@)d4viU17^`lR!OEV6e2>vO+n2(HQ=@c6~TpBC`Mx?o3?1sd}vE6 z6f&iP39WV_)kNAf)8^mnWaeEL6YuiJIp-b@nP%K{W9CFcBYzF!&Nvu#J<>r=HK!k> zpwYqgJ}w+r)mdGvD(cTSr7x)Jtlk?NC+^^SsjWFxy{^$YWTyNI@%>?*>WvdWHN9tI zZm3IDS5=RUV|j|lT7Sx^>XzyknD{m_c6Q%aK$zsq+cFcoeK_~TQ2+-zF!BBC!(RK7 zWuWY^a6sPG?|;v{ab@QR;kcopW$(>L&W1oF{QHggBwqTq_kYFGAUxbizhAGaTG2vJ zjab^c`+d{}L*ZH(8XC<2>GG0lq=DOwpKSPgFi789Q;ifB;qhnXN78HCs*z&uh=n5+ zyx)8<0g`ll8p0po_dx)nP<)z}*U`_%0MMdX^kmY1?tgSpZI%_E!rv#lZ(i8}7NmXn zvXegWkgDbaV)AocP;irfOal0z&f(nUtnv|7WME*Ti8^;@i=6M*xEBD5c( z!dt33tAERg%bI-}!#V&BuB@(El!$6bSQPMil~D@SROJ5JS|3U#30VG8$z+DCgM$U& zvT>&1(g2~j0DUDD;9!!F0NBoCajHWl9S@?bS8I9&pvZIrSb6!>p#Y#C+}51xG4PP8 z#cd7Hp7b(1z+_*5t!%d0r)o*qJF1hhA|p6}(tq4`w~oow$=q%r7WDD@hZj^Q-bv^> zVt%#o(fmd9_>E3>!LDZ}`b_zHS}XDQR7=n@m+y;3x4N{nr(U&$)O9rDsAG}M4gl#S z6~TRQtHlCH7W`xcEI$e`DwagPgg|~CsKg{-<5Ddn;AMf8iUY-^Hv>=`usyx-BC3U^ z%2~`At;BRA(bjg2vjnD|5tW@oGL@e0*i!v>)DxaoY)dV;!cwG)mq#4eQ&SVt6A5MecxMa z?dx6!njU(tq1X5L^sW|7mX8sjwb^+dEcxi?%03fZ&$33k>B*i4(BozW#sFz;*0Q6+S_zBSEREK_`L}55`;iCO^kj5Ji%7;iFih)l zkpjxKQHWyb-x1cHXABXBfJ}_Zpdtk5LqJ}@%O%bdenlwoXpSnyd*64{l|~*wE+}8i zzY+9#h;9!(7JuJY6#kjeXQ*Fqo`p;8vhJbREMu0JkqXFK{MChDkqfM#`P%=^uE@Yg zN-i`XB`y8ErhNzDORNk9*136jqii0zV1|i)m46oW8rtf!!q>^>6@`BWq7X2Y19So? z-lO>MS*Mq0L`s6LSI_n<`W+U{k^RzD0LlT-9E+Akn}50X^{g@0p_-0;L=~ET{box&%iYSdY$onzg&)znGOiQ`wn~OP;ps8*y&h|M zk^e2;hL`(zIoPHrThOi-W!`9EtH$@{q34-$@~Oz=JKk7%rmzYafhT-KUuO80^{=*k z9mbCIFn`&7d1I|Six~_10MW#(Wh44t(x;!Z80lN+vh|8#CLsxj&$E8XV6`x!O65s81S6xe9AK6ai52c& zhB_T;&a(KG`3b^Ec11@femdUkwSUDX8lwV1!u71)%RQb3%VT$xd4Nc`O!CJzlPsPY!6P1?4sVac9w1W% zFo`A-h$npAg_P@97O&^tLHMgYRHtiJ0nxpvoYEL|{}EqE=zTq@6j!zQGkJQwUidqK z{eL04hpdko&t(4+=wNilZiNB;40RpvgleAUS-|fD^g$jYYzWZv5VSI|9!b++s*k$~ zzoRM?=yII;K7eIuY=bAtwvmD`e08CFdB%wKTvbVCl>l}E8RE!oTW%a#8sh;xKCEU< zf5z}0;V$LiD4*86&ricVfuYh3xz=omK!5ZRFZv#fnV5fNg~*&qGTlK$%(-ojf2#gYVp=TAc!p_i@S8wkg?b8*Y z3R&SF(e;aj9`WeWtHP}nK!1W6jq6zH`m;hu{AqgL`)GcITPlFwuxAyX@T;u9Qs_tb zKu%SFEVG`#(B{t+zQ-q`k)31BA8G`R;K*!Re_jx|^yrW)<31z&tkARkp??qNSedvA zfP_5z;Y}8(zb$KCrVd^ue5U-0##Hl_Z3#mKu!Jn{&1fA9rem0Ok5%yYtoa+w`j5cR ze;Co4Eo6O9&Z|~}=x|W~TYH8Ky$r0q_Ir_XTnQfqh^&egNQDwGhlE@{lL%J8+N0e6 z5qwnO^XuTw{0yU+p7iRRVSjcn2wr(-h0PUwRO07r;nm1`gi-5X4L0WY_g8|K9BFITUejd&+;B^d-!U``Cxm`9PwS=CbwF+8xpMNE6q+ua5dr90|xUW~?UcHW7zecVc zjhz*~q^oIMr7`r8-7|l$=NUqYnO=}d5;Z+WxpdXwT{Uec;mQg>Gxu!#0rFA^ZT`@f QP5=M^07*qoM6N<$g7a!?>Hq)$ diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_33.png b/assets/dolphin/external/L1_Akira_128x64/frame_33.png old mode 100755 new mode 100644 index 1adf3d3512df3861d0611f9e7cffab7d5e6a632d..795b88fb40d4ce37cb009e37bb813f29e02a0ad6 GIT binary patch delta 884 zcmV-)1B?8F5B~;`7=Hl(0002`twPcO00TxzL_t(|oIR0UXdGo2g`e-;Z<5K_bT`FF zP-!N1tH~0Zy;7;#Ox5^vWdhl~u!vZwc%w$FZKVMxklIM`=R&-&s7p#fCV^BWBL2{| z(o!tgHISHSYgSrmrJ+t^NhX`kd|qtnxjY;==iv}!ad%`s8GrlXBcyasLmCpX>v3lR zt1n-=w*|>qg325$VkRf3Tu2j!RSyGLc8svca8 zM%Hpexqb-%Cx746{4`QPBh$fv(iJoR@jGBmm5NPqUTu}?R40!q8oB|ptq23dp?4iDM2duH7=6(s>?FxrwWt^id3`%J({|3Ikt(VU$ z1+1n!N+cf@zqk9#nI9V=*|q2d)g|%aaOcCLA9a>QxR3_TCkU~a@PIm^s&X`^{eO1h*^iVi!gfZzwARiXbc#0`Lg!D zy4IO}X@C2i!T?bLd%WlPi^|u=7-LNLI(v3L>7B$&7z1Gb(WBAhp-|qeF!9+bHp%N^ zz96cZUo(c_>l1gS&}Iift1&w7RsnovfHDZ%o_{haVy3A{NX)nZZ!0xaGrFGjaVdiG zlm`MW&<-HQT7p8^^~_2{>;s7Uo^~Ln&OivFe)3$ZT<{xi)~Mvg%1*7sZUyR%5wrKt z2-xV~+7bV{7YO}Upb7%GU=snvAP6sm&4G9Wm=pr)eF)X?`Ax~N{t`m5wudX5vm06* zgl(8dY(0_|szq@H4RLD4|L_{jQ-fQe9k3NkPy~S_MY|0XYVbi5-UtUuq>K%CAVd$i zb^)aJ0fITK(yj-(#-ds6jyI;oh15+0r2Ne#k6W~$?jEj@0{joSi#`MzOtL2c0000< KMNUMnLSTYTUad3$ delta 1920 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 delta 1117 zcmV-j1fu)91m*~k7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000CSNklyoQ52!PS?{a@MhqeqJr!X+2u$~UvquGN?V0g_-B0ND3^hhuR4ghdD z=7F}yeNLhG=lX}+mHM2NSpdK-DT{D91xjs24J+EW{ndi|AoY)) zlgjtA0enX*eWhS`tAX1%+_iR|6oNET@o_F8KvO`}UH1$Dsr))t{EyWG9B?kU#uZB; z$Qq&&KNkbQ0_KEH-yh!McyGx8N=n2AXi;(+LOr2b00tYvrD3C6w@m3u*Cus{9>5A7 zwGj`%je2TO>3{nB(ZmD%H0m75T$|cDLK;IGR1cudy`_;at;}id0sMxKmJ3D6l@0&n znS+;NKNr`vS9~o!p7bNU6s+wTSQQyb{_wq8W1WHg6;}O}GT4-~5=<84%X0D!C8)P!hF27j?}^;FCoM?I!#4q*Mp4OE`Ost-e7KUrW*_g^3YD>Y;o~|7Y}Q z<|NP(GwGUQeR5 zUx44wFd9ZPgAuG+%%Te}t+I2jjS&KwLFhBFmVZV(&G4hEZ_@dtaMMdkI3&#wdhRyJ z4X@OB>-l=oD;!A1J5y3N8g>>yN4iww=Mh+GnRo=2``u{>cg;>Vfbv5c$LE{^z05ws zX73*WFZY^$Z`$e{eg8zB(0?hvDy^Gv=Xk&883HU*K76xiLTLFyt$Bh00PvwUDqrh$ z7k>{x;gnxH_2X6xlPfiH_8QQ#|35>!X>A5wx_;EA%4)qRtwWI;pasF1Y)d-$$Fv*om5|~Et zK31wouMwmnJR7kr{7G>&^ME+wG%!c@I|#1>L=B{eVP#Gdr)U7Jg_^EXm{}TvjUhi06;Xs#gJ7*qs8%hm zd<)gT5rol7nz?h>P6-d9Sg%j)G&KMV(c;mh55o=MU}S}GB6FJoaHR6bGfhQMD*qm) jFo0D4eN15h$$k6-SI}1*>7K&^00000NkvXXu0mjfXHOGD diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_35.png b/assets/dolphin/external/L1_Akira_128x64/frame_35.png old mode 100755 new mode 100644 index 9a101f0aa36d323084e06e505fff0b14cfccf8e7..7a2154c4b9e3e6cddf192e0cd50e608e8f445860 GIT binary patch delta 756 zcmVWTI#$t!-asuJ5==q&GYN-TCw6E&a-8YCOwsb5*!ucs@J*PkU9=2U3~05jVNdVhW) zcSgeV7R+>eZhvp$*Efy-#_I=`P+(>!>DxVQt<-WYG}EWhsm9=&9Vy0P9Rq|7W2VmE zm$EI^@X(c#Hrv1MUX{f}O7sBXjrhB-!lc*{ffFVguMg-gpGPXv2;LojpsQh~-xK*I z5sUXRe1A?ChCULxFGZ`XCrs?67k2II1-%L$iS{a;V1Fd~5>kiY-nbTmr6sd(8My9cxDrh49$rle$Uzpl^_U(f&@=!r-FKvr`SjFMg(f4K9ed*M#=Va0CsFuI$c$+9Kt3Wrx)JPPy5a)q4qGp|1`}tao(++F7I8rmUx;G&`zogv{@GAE-XOK1 mqh`Q8GOZrB0qCytKlCpwAS=?+us4PP0000vQiN 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 M07*qoM6N<$g5O`!Q~&?~ delta 1987 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 delta 1998 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 diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_6.png b/assets/dolphin/external/L1_Akira_128x64/frame_6.png old mode 100755 new mode 100644 index 07a7c70c02c9159e7fd85538962a093e12204a45..f16295ffdb39620bb2722dc6d5cddb8771716509 GIT binary patch delta 892 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 Eg2WAsy#N3J diff --git a/assets/dolphin/external/L1_Akira_128x64/frame_7.png b/assets/dolphin/external/L1_Akira_128x64/frame_7.png old mode 100755 new mode 100644 index 275f2a35770c4d3b88e915969cd713f16e6eb690..e28db783284966104cf946b0f3d0233b1011cd25 GIT binary patch delta 877 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 a9{&Io>v?2)L>U(V0000j=i$Gg+5#p(eV+ zaKxJ>y%`Wmpb&%DZZbB;`seh#Uew!9p67YSxLm zF+$-}K@D(d{!7O<-PK3oMi4-!)u?zAqyzQiK@IrQjSZ;jfc;vTXN;hgShjHeSeXbsoK|c^o zc(f+m&Xclc#atjPo>hl(%2K}ZVh^ap;_-)g6h%G=wrkWdShti`8umU7fO%9rHSYBI zmPKxzZ`7D^u#!#>E3mP<6@nt3N>HrJiIlE2Yg%9=fhzhRj9|34Xm(L8XA_#hY{` zQ=1mfdU3hQbelq&m#eyhSa&M4|5M>!XVsz0O8+W} zRmW%n`S{JV%~zD~*nJ4;T_C0Cy@kW|)e9CI0)NJBs-?onmi32!^`~Cn?(^$T)Yc{M z!Pq;2Naq27DJfNhO})W>v#CE3@jg{Yla&l-PW#DSJV!7ZQ8Ur<5pmV;-Ph?Q??eqJ zs$w3e$Jlde!3q*LqKLiNykd*HGh^qSPQ!`%Vz)ac_r2AY-rcc45fN|DjG66EdSlT+ zk$=Ap%VIJd+r3Toc6h_EQ3-NxfyI~3wD!rBDl3RoNu@76{&zGTRtYH?fJ&KL=g)k- zrvUg6DU;b*T)!JhZDB@S4XDf_BX{Xo1+)g#=T8mgM6=s1PzIEJIago*x$auYxfewP z8#en@_8&rhaX`bG20Y4JRa-i7ywoH34?0ebN3lX$ Qg8%>k07*qoM6N<$f-f`5(*OVf delta 1814 zcmV+x2kH2@2bm6#7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000KdNkl`NK4{)C6I*vnpmiT-BJOR%0FMTgy9Z5jfES=IBl$R$by5E(t9)FwwS*LX*0ixgAGnE88 zLD%vx#>-^?#o)JbKa5J^=pOmvCbDw==0!TMN`n@{|tY;RkNCISb zkz_rt1$e>N_D#(KkzwqLcEJ6@!DT+O0<5)u1%ImiBeM7Nsy&^RKm%_HkE#ItR#??w z>J!lsu|Zp}R(}G%N5Z3801|v{?TR)qnFOeBqU~UkI2@Nz>-PVzdiw|L6zHi zMFof^!(c2`Cm*uTjl0cL36$zl-zzzOvayUcfNL;P9L_af# zCIQ!_*>u|%LD9iWld;yP1FFHNK<5pQBWhno-d>Yzu+H960kXlD1~E@=H&4E1@!K5H znFQfnsef?N*~=0jGH6LgX_;>IjK)dy|xfd1|*3iewDb5Q~;#h(|xEs4y`X=Q30gjdwi>H zP?A@z1nm`|yUd|F`TmYdAURXgg*->~NHc*2D}VUb#d-g}8WW%+=oHagTnU1w+X{$u zv$DE7lK^S2Z3)mF{7o`b&UxR>0+FNj+KT;N5_lDlRsgFSlv}_=&^bYb1Kn%&=1Kk9 zxvDRC5?D#;%>ojapDeNI;B!3|c$Rln0EC;h)}dRf1bmp>@CHCBKB>2WtAf9l9Y93i zd4J0PF+$r%f4uz?-o3Rk@htyJ^9S+@xDif(D}%rFS@0%ax+kI|6Tr^W&p~gtH{@D_ zDqjmFfEM(r;IEbM!|3@;@X=ShZqUjUm9GtyZ~{!;_~ST!{ZPHuxe7XiZ{14Ez6_97 zz&UAe70_G2MDV>Jd#^awSxE*58pzBUWPkduwhOKGNq*!1{%9x5Nr3L)BRyN&k9-Nk z&q=r{_!%1`@RC6KPJn-!Enp(}=u|G9mH451D`z5{GIF+0Dqnbc&$Yo_O@OK3XD~f% zddY>(3RRxj?+&yx{5f0!z9IN~Sc*C&di$*}O|&xzhb<#>t0QN$w*srueZ+UM8GqpJ z;7g9z1{>u4m!9+Xc=9bh*5H>(rVhVpTq$312)rZsTHv+G-%Au^zsAAZhXkKKt0Y3z ze-`IA$2C|1(DTwhsb6V4_kIcJzP*?3i6)n%)3VJ&R~4XZzn(9W08a@%=c_@Ip}h`C zdpscAz9k7Xp6?;ByZ0l|97ESEE`QcqCit`hc=ktvPwhg^Pe8NhMag_a@ad}*@)of7 zcvS=mK9U4fmd8o5hs)|t0;|=DtzrFZ0iD73N}oi=E6dyv#6YAsBeRAj)8k_$8JFq# zBm#6E_~Ar5fjCqm=G}a4JsJe$)4QP&o>t3{)~~3@H_FeOaWp?= zfh56kp6A&ee0rlR<(HC0W&-V;whz_Y#iQbfY<#@)?+Vb3so+aoksH}j0V2UiDnW!# zB@UZ|gqLPe71^MpH%HS)&wpikNawj+3WR5cPZd@Y9DmpQD?qdjNTfTQBUJ{Evvkgr zKWSe_d^8`tCW23uL~cAiTPcs)jrDAm%C>c`!V{?o2xk=L3@{BIY%S>fv)Us&dT7@T zmS&5Le>xzwg0Tv~m3n)+2PM9alyttgGx*V@oQ})3YwRzCpnVz{z<)AM?W_O@-;5m= zI)^~cpW@a(6Nd~;+45R-pmaXkrVu;s0Br@wIlv;~eC`bGOvHKC;ODgrRE~7kvzywO z^-mYZTL1zy_DX77$+DGfD@} zbKs9eq0ZpOqc<)yMSp9P{Qi-2NOCM)5&ryKN783;c?GbHmWDZP52|Zp-*yXpPga+< zrrCUFC1_0mWC)V>M6x@26VTo+%?c4@Z9rz5$tsZk6ERUB@9hypZVewYBfYvC(yJx< z7BPXg3gD5qz9gyYLO<8~3^4ya8~m&d`x6QNRC4?Qei|EXfe%dp6aWAK07*qoM6N<$ Eg3Wzzt^fc4 diff --git a/assets/dolphin/external/L1_Boxing_128x64/frame_0.png b/assets/dolphin/external/L1_Boxing_128x64/frame_0.png index b6b2c75b8fbe7ac7ad06e4c1f3df878dabc56887..59d3ef3fab147eca080ac6f191292724929aaab6 100644 GIT binary patch delta 619 zcmV-x0+juX4EO|)7=Hl(0002`twPcO00KWrL_t(|oQ0FIYg17a#(($qh87!Wii1*w zbW$OU*ulZUw^RoybZDH5)b~ok(tkkm`fsEiGAX1WNI;~iHj}tqtw^C*qI5|R^d@4p z(Y%-A@X|JkLeKc)obTT696lw4nx1kPC})uUuS1>LaW;@a@PA_v><4{Bxa2+58j#}LMpwuN2t4gVHr8Mf%bGV4A#3QPl zaMdP(O7V1FW50w<5Or%;V?)HmL{9JS!W9@+zZmOy+YGH7oDJOIZ-N+#CGvjnM5S@Gm-}7BBFchvZCXJ`oCaP6uF-3Cd zjvNGB@x90xwfVR()(kZ?!yTDfL9g8{qyR|SytJpFF@H~5+9D#qVvPs$Km}-t??uLF zA0PxqLQhHt?m@b9Ehi%F?3`09Vj+F-c37kxS(~U<^&&Lwli#2_zC;GSP^6W-eLmGh zc~UaybqGHeM(@*66S;Qmg=Je2kxthODBrJu1a&Vm##sPrUI406^Ag7Bbs!JGWUSEu zWgCdda%B9E?oI*fxzoF3fZ>{VdY4QPQ0wjkl(m&yuZGlv(KOU!FJ2~~=KXvJmt83t zAb@~mPQ*RV3&2rtfB+)*1PG850d92zdvMcq98bGZ%5HTV$lG%va1(_z&$dZyq1)O)Wu3iJV94;ACh1zYCMC_bZpT4+ zIOTERsVB!!K@m<-xgiP+1S&&BZYOXE@;DtnP~@c?r}8@IuiJ|J!I4Yy`~AN8e!kz& z_myS7swt+tQF#yqnLJZnez2y%<22@g_XXo>FIYxu?rLqi64sh{Rf0-IB_zR~7+)*- zC0=Zv_qAk)pq$odpjxZ;R&s(8GxHf8b21hOXb7@TPR4nmPSW6zR2!8Y$RB(5BXCr7 zAhRr9+#4^KBGIWWsx-Z&Dj>Af39N`ro&?*I954`*G#*aI>g5ENbRfNUIk3-&F$C^a z(dryXAE|1u4=z_!3AULDRKRf@wy|bOhXdgwKajk`g4I3K1m1lSn^ayf1xy zoeCr%jChs}$FN}r7kCE6d5}@YLQ80fqHL(m77Ec;!9ws9i(r5vmg$`PIw>mx?U~u$ z8x3%{H(ZhoCQ1dPQ@r!tYhdgQzRG|btUWzFo6fBN9)k3F9#?4~dG^X|&)`lt|Fxc; z-y2It585G)AH%+0r5+}Sl^t%(yJ4t5n|@kX>H2dfbffUD?(?DPPUK*d-FSZVV>g)8 zkOdvfYoYV=+a7^VHk+Z-+oAZrilSigKRVcWq*4;IC0gS%DuZ|n+SAD&7m*9(x>-)<||lH5^TLRT<5$y;k#S& zHy*6Mn9F<{XCsCJmN_xE^<&@LYp!zG4$JKkr+*#rPSIQMr7h4_-8hR=cXz|0>LneH zIDGMxbC*79kdLP$Qi?K*(WY_ zGRHbnL)xX!xXkZmTO+}Z>9vzx-9MzENbSh3_4T>= zC!y=~mVJ#TvF<=_YTcd1_SCuC`dI7x%_GhXe>v7}*uNbsgbuxs{y?rIkIgEe=NA{| z)2DKN8r$ZcTh`_5Zr^MM{ukl~Vpu1_rp&2`eK6m29 RlWQ~oXOFwewY4m`_&*QaAY=dl diff --git a/assets/dolphin/external/L1_Boxing_128x64/frame_1.png b/assets/dolphin/external/L1_Boxing_128x64/frame_1.png index 347d71cc2087a490525faca17adf953c89a888a6..ecbd2741906135e1d5b2b0759213f59e7defcfc0 100644 GIT binary patch delta 555 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 literal 1609 zcmaJ>Yfuwc6uuz}_yA+Al{!+_6_r*uyPI8-%}Rtoh@wOgQyL$2*z9f~jmd`1QbMd2 zs^g!_370I~jX+}Yi8@7eR6 z^PO|g*>weTXC@3CI}`wrkUPs#2xS#~GUL_oeJg&04T?9F9EUPraw!#@ECRD2IYlJb z%aw?QA}3Uqoe|RkP_K5|9g4%2$MTX_%SCLoL9ZX80Z7jX`Z?YsDu`1oar;c@-Gj|2 z;ucKkducYp=Fb*O-LpcnI6pMk&WAj_Q9v_hAn8FCI`E1LhXlP#eE~LTLi_x(a2-+O zDAH%5cuZ(NDTl29$(CdhF=$DQCkO&D7`39n>70~{V09Er8j*nu zg#l&3#THtu1L5G#gqA9bpT+TtiVAH7rIq9ooHQDZIHALJIt*H1fl8mk1uV$_30 z4Dhnsuec>267k46rEOlpbH~2GK&@ca@F3^MNiBhUy^+-VtOH7+_&<%8 zS_kZvei1Je15&xn!y|D`jDlhLUL7c62-&dtvKyWYx6~r>UTc$y&eIu{l7^D;a`W)nFE9m$Y6G)d-UXE7GqoJAR^ zEGEZnA;>5;*B4MYA1_8@yJ74BEb&S#n=Ol+BFT11S{iMHf>KG50;Q54(NS6gNwsmj z+ZWNi9XX}`q%ETC{!kRGvgAej%FMc7LV?gzj7ukon2``@jHbvmm_FyibQCXgl#|qv zoDLnp3on$fzf++Grs0pWVHu-~A$X3#2o6@1Nux!~Nl^yOU~oEVJ)cH$lo7=tMLg0u zFLY8=1=};Sd_Ed*^L)5OADk!|j?SZ#A5Vv47h8~L&w(-=4)5xyyAD9i%v_7v9_;Mh zdcAQaGJI9@q41o#)>2Q^Q&8A@qMpYuC!T9e+4lOr*hcTYZ9tFy`!0B*d8&qD#QKfD z1T{xI^24$!@>$uI5>T+h8<+Xu@ECA^8aTU*jG1x61JFUC&P5ucXUguXuBKb_cCEc> z4?nqbV{=-~F;BDO**nX$x28^6z5Ve)&DxB;3qubaN->Kcvb7ve1noOlhK?_)j=ys1 z%=o`&-VHp?69Vmy=jS9_a2^_+KqdrxwWG4{77vl~V>rkER4&V-A5RN?c# zw^i+JabcWtpk7rGmltczKl)?rHPcT!e-0%$h9gT}`zQbC?1Vw?q&hWy{SmEE`HfBW z)z;gaMz*w>HxElWQ_R+#0^<_zFV>8@*V;NXVP0xdt-3p<*VYF9^cD@S9Jdzi$afTVp0jH=p054s!W?OQ zvSmS1TvJch;|Zt1`Qxf(BR;LMEF9&$eWI4pOv*ksB3l!8)j@oxGMt)9d;yBwM;;xp zjs1^@s6 diff --git a/assets/dolphin/external/L1_Boxing_128x64/frame_3.png b/assets/dolphin/external/L1_Boxing_128x64/frame_3.png index 7004e10c30dad43342b1818440c9917f5b2eefbb..aee654cc8fc9f9ee4585211b4a806ffa9ca68c7a 100644 GIT binary patch delta 547 zcmV+;0^I%X3$O%`7=Hl(0002`twPcO00H+&L_t(|oUPM8XcJ)=$MNrbTwz_bkIc*GhJMayGw3$biKKtAe2JK3O(%7C02BiG@)5)3xPL@B(c4_ z+~aUIxdc=Y-|@$DpZ9s6_g*DLCaGmGv;I>s{A1xpRSNm z-}>{m!W__>8wW8au=jnY^=`%mEHKnUCs4}p)n%pBS*4&r&czV<1mr<&?3dWUSfY;1*VIF@D-27>>RU`FvnB;Q0>eSpYl%^> z8~2GlBwPaRLw`jNM23lBmfLVpj&8V_r^u*=>11pQ_FxC5jIaY!Mz<(|*80lWmEi;_uL0cl zl0NpKB0Z7L>MsL0;D1TDgwmgFURY1gTU~*RUop#V z_+~Y>N|t^$nMZzeyF~0v=5d&_=^EZ-9?_miCq2{0ufQ6XCPvY25g93C7l`AOq0dM) z7^d&#NZhE}O5Mx#FiYB~UpjrnowU&w2|lKc>wUJpmUU~l7FlRv+1hMcHM`!uUC*t(a(AQM z039D07-DG52r~jA0R&CuV=5>LH9{gEl5PJ06J&~n2umF55KLsg-B#oe!sYJX_kG^y z_dLJn>+RZQFBRmK<{=1DP_x8U2iH#cISe`Qf5WiF3zrhj-Kf>eAuY};0C9?P5TG>? zz8Ta3UTj}+29zU6PM73s)Ed1Wn;=Jwd`8EZh{PZoLCPx=FRgK_-NBO`3u{`;MiB9M+!$w!veHaYR;!gDX@aJ4sDZ2PQH@XFQFUI{f(xjE zBE>XGj-nZhd{A!F>=-0F5k(~C^*%HlRVQ-=vqmKN7(p3HA`;1jHmM#*kJVOv z?J+>q0ab2O1Xz;Lyet@|@5zobija+Mxgx>3@U1RcXp4ZTR^zf`@Wv=gqRmQDRz76r za0_b=;jD=Z;=I`maF*pl0!xx+I>cn{JPz-)a&)!X;^rtfOHuCXD$d0^s~8JY#krj> zlFDLhqN>J61(5YELEn>D*Aua}Y6b9`toUTPHQNZaVOf*aupC2a#z>+sczHpJW+d}7 zRhkIe1r%u|5Em+U?`I@|Uk(xc5V#;#4ZW zBT_V4Qh)TmzSZF16CD?)<=i+v4w)E46bd{7o_K~#a|8H{BZ7; z?!8xvb|kn}*Bd@r|E&JOO~1#vsBHJv`KGj|;JmnNpz~a3uYQkV=YV6U&UkSBnbPFS zQGaQzp=xh2m-KoVckXw|?u*iyVp_=?6=lR*Ba^SjJ zI?~;g`gh}{;{3t2bC>U0n~xlxNta&wHoU0s{TwWi+??y7`c9=A{K-B9%e#B!ny&M+ z<>&8DNv+*DpWKw^SupJQGH-ebR=3rE$1(cmx>vss?xjg7a`N>(>)`Fy3~W$0vti?FB}T|ytmz{)9rbt zvFGWcwpoSA)P-rk4Ev^@WYq7DRW#jJs|%W*vkd$D7dFgW>c7=>HX$3(fuZ!OtGlJ` n8&=#P(yLSVrVW)Ll~eMOtxd&vvW3|NI{>M1FLQlb)wJ$Ed`=v~ diff --git a/assets/dolphin/external/L1_Boxing_128x64/frame_4.png b/assets/dolphin/external/L1_Boxing_128x64/frame_4.png index 556cb8948d15edd4308f66442fd5fc8a4a74f038..eef11402bf4677befc20b6dde9880638f33d56c4 100644 GIT binary patch delta 556 zcmV+{0@MA047mi57=Hl(0002`twPcO00IC>L_t(|oUM~TXcJK!$3O45v?Y|gSfN`4q`P;2HT>63&ql4 z{(T*K$z1~K;v2vBeV_Zi@Ao|;+BT78F|_`ZaQaWjuVLZX9e>{9MFk^X+0LNDOAI>H zIhp+XZ^an!$mt7RY>)~)i(1DmsiU8gbWXC&OucE$1aV`GnKH&=DlzRcjtS;9n+GX2 zX)o$E=)n?pu?9tE7EKZKWdZ!{B#k}>j4G>FIR7v>iwDcyRmtzq;ktAuVKf!YF@7E7 zrouTc0JQ{Iy*Umb=O^px_834l?pEhbCSWw5G5ejRDt|r334Bg$C7@aApJjQXnwR#& zJPx0axw!XoVIGXa{75>?^jiVuPm5uumG{zCgmF~xKFGUP3K>^j#M>xit8kK>b|byi zwObzO#acUl@*~oV)5g1PN4vFdxx0^}-8Q;I-C9o>=+eNYr-7~k_$K)k#hLpdvU)+r_3+pqiBT{*df1;IRI&a*Hp+1uOWR@mEfZ-Iks z2B|SW8a2u$45OM%YO=u^wGT%R3{XeW1{(-7DX}JV{HRD9O?nSF^AE?J-F@Hp+2{8> zzvpW=6c;TtOfpS^AjnWyz68Bc-vSTrnsW)T-jr+9Iz|TP`quBzpmz6=i_|S=4wqDp!OeY}A2_*k!>!F2)de zL`5riAfu#8+{JLNqKdHHOrQde_UJ; z)gNFzT>h9laB?6)O$)OaR$X0fuBOb2T80q}!(cdxkt7N<&`3>4MwoF-mgAv~Xh$@U_&<$%YDc^^ zVG;9)5v5WUKuH3#5@3+N`#Xv&0ygXtRRVS4D>y}{l*N!%$T<-3#q5{-EQ1paAF$D= z-C_%%7Ax&Td7Di{EfzW;Sa94%2B?Icd*NLSP3GEYk|y#j1d*4ULvt2a4rQlu=sXvP z6A5f#D5CKpK}`6TfbTIZabGN(tBSm)s9r^>NHjumP|=h~Pzl2%Wyaw-ZeEZ=aY<&p zN~1w@qAFF1{(M!D;gK}6(mg2PHi{0Aei3DGzXi2WgcXF(2T+m{M4s{yB*Bx&7~X$Z z`bIkyNI)3j1RIuS0yHl0G>Y>eqqNl`qCSeUqjtN`XR!%Zf~Ob+0~E1%=iJpv2@z<| z`1a0dfWw{P5<_63R4_Wti+lUP*i9^6?9Bt~@bK`?@0-s;kZ!n;b9tlvml`*0ZpSBc zUBkmYb9Dw=_-dA_lc2$2vck4+AI%lZs+A{^}5-6xj7uzu( zGB$^joI|%ns1*D8?XI^{plioMCx7f7H>W4(e6Pv)#_oa6pP)^AM)TITzaJ=i#rmvq z?K_uSF5GsH|8RkM^RJh#To{CgDzEKtp1W*Et6I<=U7x%?<6>9VY5wuqyL(w<_(9iS zA01EWY&@|te^tq@3CEgFPhHdfoPN+0n`bz_&v^>k>)f04?%^X_CvHb$^4bp5`tCpb z`gh+f_3As;HTSw(ov%+^qt(N7Pu);?Y`G~tMjGlCo?MlZ)>%JehtUL`|X@( z`l)?W8=8VXxnySn@z{Z#w()WrFBP?16e>P8Ffqr!y5v;tdQ$gS!8faq8fUV4VKTHY zHI~$N@aD14mXtmJ$)Pi6h|A+zp6Pi1#oFnyQ`z(P>u;stP_}N``D-&9Z1JCRVO|mU IX-;YVe~?!xZ~y=R diff --git a/assets/dolphin/external/L1_Boxing_128x64/frame_5.png b/assets/dolphin/external/L1_Boxing_128x64/frame_5.png index fd6170340449e3dcfef8acf374f27e539a1ccd24..cf2299b28403dd22e6b5a1a48d4b134cd6f84bc8 100644 GIT binary patch delta 555 zcmV+`0@VGJ47dc47=Hl(0002`twPcO00I9=L_t(|oUN0wYZGx4$3K@`Y==lADCtz9 zV23P*&VbCdiG8 z==LtyETU|Xtr_rN&%Z4-m!#wSzMrbs^wygt%z*E}O@9^M4kN}ce9JVvhnKBB!yx-92)wW6fU%$6S)ICT4H#ED9#g*W`zL#h z0zkt;>OBTzI9@T4_dNz`ygb&nd%ZZY(Grm-kq*n^;~BV6?CD6)Ldnssa$m<$sLm-t zw|hFa;ps%EBnkm=S?SB^Rz~dFp+EFjpo03%WeBj6T z36?SL6eB-QsAO3Rhs?;24=M@X%Yh%Iwun+OPaD}=mO4K<@N~MejJC2Do6D6v^1_QT znoAOXi8IVR9KIG~7@Lrc&81e$qtcycLyREaOT%15F;%7$!7_r8~?D`e*hrDMT(Z-b2R_}002ovPDHLkV1j*c4P5{L literal 1555 zcmaJ=du&rx7(b&M9b@Z;F38xFOE;znxA)QaO$&Y8P8!xyMxz7KaC;wHH`;r-y=7%e zHa0{Fm?1{N#0UoD6@rUo5YxqNfB}r4L9+31aTtLGMi!DGi;DAfTaiD|`#R@*_xpX{ z?|W?x_+QD(nVkaw$n!3ttKixUUq`kIes5;C`QTEdc&e2ZqM$S|G7p@b7~&CcgsI`H zc!t}s?mTY;K(!?ttX8Uhl@u#RbWBP|mxxFZ4S;QNLSoo@UO_^9O*m@T4kx>`NSL#0 zUo-k}pXBCi!%G@venq1{$TrrqR!+Nk5n@YF&_IM&7$gx{8;wy3yLQ|z1@|d2rbWh8 zlzO{%f>gCHfVf4ON6b0`WpNxw%vK%GF=R+DFziBv#7P1p;A2J!Geznt!ir2@TIf*b z1geUzm~;nEc5SVqNEC)OG&JZM^g2is2+ik|@+bV;iChlR%@f(zFGdkFj!C zQo>>sNm*n2E+9IzoV2QWJ4{J!>}&QT3Te|5k9JTX}cEw(Q#ppvf_l55lj}; zY%mF^!DtDgjLF2K27^Ul4LEKh1%2Ai)9`MW)9Jy@CJW&)5`@R?vd{*nOK;Y@EFLF~ z6KSkB8dI1k%cp&Zp>H=ylTN3_1F?qx#8PgVXB1HmisIUIBLr$iMU2&o5<=>AIP#K@ zVZ+gsWPYkj6G79w9A3|J6|xvX#?wrNpF#mQ=`8}u@u(H&45&d*7-9H~fRcKaXY?V0 zBp6aViRYe3-$bWE2@FF@v!N_j!Gg1l1;rVdQH#;QqanTCjGE1%kioYOJ!DJ_ESnc6-c4S0AwTznKxlnh5F4{cZl$8Kt%GU$Qp*x1+?SNHS-FlC09b_NsI zhE~3Ru?5fV{AO%v(^hiu#ND>mQ@aKO2G?LmGTxWNsO0P2`S9+_1Ov&8fw)Z#?mfVP zEeqUvlnF)-Ue8!VH5GyOw&INLQSNYE@jUSR?Nj6rUCAxE?SXysy8Dm!VL$CYn0I*Y z*5XFTuu^z+S!u!D+xGi(--XPqxerH%Zw=fzJ7 zM}Il+@s^68XBCKNu5`UxDvb)2&ipH@FU(a-S!xX!-JZ2l^J8}N%{z;b`_wt9`}KoV z%l2nyOux7e40inb_t8?~^Bt=G&Q`=;v}uQGcW*N3uhg8It)7}QlST$W26Ft7^!(A` zEPHds*;@}k`1(doYh06C*u2m3+fEx&4(JCv&$gDSXPw?#QnqS_^^G0pRmCqXJzL9y zU7OeEk|hQB%inb;dql2dxj(NuPAXmc(dT4dcT6bN0pJa zA602~kKqgNZaTEBeEEl!!MEmI{j6Ud=`3mPWmlbSnh83?%Dqbm=6@>Sx<`A4)dTB5 a)0A8QsKTKW#`a^dO@P0MS z2nOjvg`O&vEaVG#&|Ae^+=ybli6S=dl=>O=q8ATE5wXXL*@%jlfFNj14MwE|Qo2z{ zwI-V#57}flIVgy8oHy_H{_~$Vn&25kLT4=gQ{u;8D}Ie9zJIInD^4__2~Q1kw8BY_ zR!Fa%`17;Ep3#Jl0X=O@`cE+d5&#G5+i*hO03<QIUg#|?Eo8|aA7LH?N#8|XLy<#_|;+kuV^ zxI5{2;tv==8U0pK%LRa}OGUhMFJ!a|(vwIp4QmF7^pY|SdipC%Rw{rACMD_4_t$2))v|PY?DO9o loH$UBPaM*de*D8`{{{$ZK`E{x_W%F@002ovPDHLkV1o41{+$2- literal 1543 zcmaJ>YfKbZ6uv-K6f0_KXthYjfmThKo!35QH*95>!9wFI#YOR1W@qoR1MJQ?JIJoK zc13EXsjcyc+FBwFnrc!XjgQu7WHmm}w5F}C0eloBv`Q^nEm}=ONv`J|IfHB2Id?}hEXylJfLGRv?pE}VrQ7bIh=E`2JPEaARdt^7n ziv2<*EQNw6yzDH@10ZFs?AHr%9ev2JAT$7ZGeU|WRznSQ!%8V&!*3mF z#WBfa!{-~Flv62yKB;Jh3g@nv?Gjg1ixv+);|(k?WJL!2P!q6_za|j0hHUttT`OA0 z#Uzdms%X_Ve27%Jvji)URfw7OG$B$Hg_$jS=n)t<>lMUYjG-8sq|sw0XtR}Jt+WLj zzHsDF^?0qN{LEo@XlKKHnxh>dlQDxq@`YIs?!^}~Qx%-eAEMemV3RtrU2 z1h0uB%m$N}Fc>*EA(%{%Fc>(mXrL$)<7E?eo`o-9c*bt$92{L}py|Q_2ge)i4%W;% zxI#Nm(FtsEAgBoe5hi>~$oDYT{#>lJK!t)Pt1eltNfbhfPuAq1PgXF7)l=9sryxp! zxMX_#l!k)lp(-tho|&rb#|G1Em7YO?GO?VO@j${tc?^VsrHv?j!Amf#2nE(nGqk|q z!+6hA=^Lt4Btc;)2{u;F;^in&;0Q`U8Rd)yNVr+nOqk7Xx4|SDX@RxiB%(;hE9a?7 zN{CQ-#+Of818tr(7Yv||Qc>$1BM%%$Z8xH1ma7oWu~=+J$F?f~BL9YEQWTjp=kMZY7D-gxkbf~V&G(*9ysc}LGy_;sK_D(W7a z@gqAK-rYQY-Ti^0ypCIe`uYvA_WQ@815?|$#SIU;z|U)b`@X*Ohwax7KCtg?Vy7>N z^)IZNG|HbpFZ=xCfnB<#)xpITNk>K*dcpaw=xDI%&*_=X8PT`??RYhu>Egzn+I6UT z=c$|FDdKTD9n5>Zbkje}x_Xm+LA}A>12%=m_MGgEynA|eWBr(nA}$~7++Fs5Rp;p3 zi0{69Ey^e5T>CwgHSQ%4J&9MDrl}FS=H55I3Kw(E+=;F|bAk3ARLTaD(rYTVlq}+R zbgw!)!f1=S?O{0nbiOeoEi)1V4av&6aO-gVh!D*ZA0x( zIn^5*t8TS)?qAumetrtYOzBUKw5{(xdO-T9dE&=&x7~dNE~j_Ri6ns=yC>Y4RJStz P%Lm1Uv-v%aiu(Tm75_Op diff --git a/assets/dolphin/external/L1_Cry_128x64/frame_0.png b/assets/dolphin/external/L1_Cry_128x64/frame_0.png index b2636f005f042f1e3f163c5b349d026338f06f6b..58ceddd8fd8c37b45fd424029ce861a8bdbc0af8 100644 GIT binary patch delta 886 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 Y0`{AMfs!t%$@iz!Wf-*0>4jDQ1IiTYMgRZ+ diff --git a/assets/dolphin/external/L1_Cry_128x64/frame_1.png b/assets/dolphin/external/L1_Cry_128x64/frame_1.png index e73499e9455bf597f1821f3eb835c0fe7745ab19..df0abf137fe426cb4fc5911a8fbf9a6391ffc094 100644 GIT binary patch delta 899 zcmV-}1AP3T4~_?r7=Hl(0002`twPcO00UJ?L_t(|oF&oEPaJg^fbnNuzG-I(!azv0 zieb9t;I9J*jXy9jl5MQF_NJ$DGA2zb#iS5Kc3e$L6A!i*k8tRfR8wP#CG3#230{=M z*tA(GlZLb$y1N5Xc45CWuLu5vC!dGO&;QX>ZxdB$=mmR1 z)}pb|i`Qd`vvWVV^Z;*#(UfBR{NY;gZmuWmd*&C~9E`-7{r8o`6La=$oVt|+DftdF z4U9(_pNm>q)PLRQnr-UM%8Fi)?(BvaS4+vVkD8OsP{J^#)4H9f!zP{$OR~i5Lt!eg zwYfLC7wnq2;ss>iP2&`|xxO}Mn9TK%eI&+pKGxC)qtZtL6dXROzQ>pRN~=*X?x&ii zE8D7e=yzI;=dDcjuv-2~Rr_0LYqGBAb-JccRdv21>wjCWx7`1rn2Wyv1~aOa{Zub+ zR`*-|s`{iVf?2Y;anHdA9HeV^wcP|a6L$ij!xP6Zq>!-O6#(o=!($ZdbZN*kl6lRKyHUB*`e4bCNXy zz?U3Ldw!5{G65hq&SU#W_0w>N6j&eZVqYtFHg5fv-H(g<*Kr*YM=|*`IM#z-EQ#D5 zCkudA!|9Nhf%0ssi_v@8bV@Fk0=Vdl>J+$YpD@W~;H<9C9WhmN%HAsX2?S=BlHaY>YSh-!) zthRADuLruR_rznMiIWopH9$o3gex}8TChY+2m9654nvPOn0gGzyL_^m9BgrL@EXGJ%886|c0HuXCQ=ryC z}f@A%2N}pWp~&lTr*r`0;v@xrKlAakR%2Z76A@RSq)(;PNF!4V-hPW zfcPv$exPptQAaadY;gvrj~jzsJZ>$@$@Y_*ZJeqvNSYJgNsj9h?wuabTQa9A3Rlj#{Ly;U`RPps-Q;#h=XOC_1I^%C6yd%ff z%!#o?M4csyM_w(w7FYFAehpu*xEL{>xMma5u(Yko_noI@drjM>b3K6?IqJC$sgDnnuOIa~o4jBd}iot&=Irn=2;m;m$86^@eb5Hn97w&^p4~ z$?Yrd{kdPYy;Huc=@?It3HU|2p4g)?>I*HOec&HBSTMVGjv;+CD7oP|V`We5y6!R0 zsoNov1dS41wmzc$W=LsC>Gk?ywQ*v9T_PPcj~KosNG*!^DdW)H((W};i)Lp;L`}}S zmjNuTE`TwIVM4s$k4>z$h%R@jk1Le-kyUELEnA=%&Xg7n|D5R%av1J z?}Pt_D7r2chde*Bza!$BqZ$HtUN|sxs1XeL-}Ch(l0W+`jWvHZ|qLKy6ul2QJ{BM&s_7~oU|P72py)c@%BCSb^R4)q5b%tSwJ`6*q%RJzEP6> zI&YTIVb~g(Q&zD2e*3KECDf(Jl)I_1Q9B*O|swPC_qN zUmtKhW$Ev@>WjatOX2_tU6=g}9J`TJj{T&U`%2rNM>3%F8^=WoYk2Q?1zoYD^6*XI ztB=pwJ_){*XI2{ z^ub>hY&p8;m((Rc-KKfVbXr6+*)nwc-O%9|x)n7v19fm;e9( diff --git a/assets/dolphin/external/L1_Cry_128x64/frame_2.png b/assets/dolphin/external/L1_Cry_128x64/frame_2.png index 16005a990f1003ea79408df53bddb8fc1a4f48f3..17b991809aed12baf577468e1a3442860d76186a 100644 GIT binary patch delta 886 zcmV-+1Bv{Z4}k}e7=Hl(0002`twPcO00T%#L_t(|oGsGNYaDeLfbr-1=9^>+A)QLW z9>R8A(wpe^q=&^$Lxmna6mk%1(2JKgp_dI}va?ZXFPb1;Jf)}JG}MDB#Adfpq@G&! zQ0;b|Aq0|QcRMu6&hE~S*F$~&gbxqB%{&M;+DSLAK5TEKTYqAlbS?D+lRGz2DN=1D z-PT^-s%g?~-^v5IKGm$3R-+q&OkUZ$00EHhdg!sihqyWPuT~`o}FgpA078hxPAsW zr4s5(MvwJtwtf=;DLi!#J)F^R8UPbUBBBEG70V_?KGFmjL$qKJKcrvq z0b^wdCw7|1bpS@*le*BSe^?>|U{2_NK<->F3;@8Fk=OfmnQ}v01dzI%H;!GkW#Rt> zzv7vx;eY9H7~+E~-hz+&@o~62hXu&=!>u@rhwTGZReei#n#>S|qs1lwDsX=X-+~8# zLp%NN_I4Zpa##(C5*+Agi`qa-i~C5pKh-m?_ba$pz&z9|y#hane&m z&L8xAZ-SaMeUqNFTnce1Ut*Na&f`EoTFP3V)PGcCT_x`9sRqeWD^%4ZT^GK!M3Xqh z-vL7|c$V?kY_t0cK*Rx`h#7kb4@P()A(L-5C%aYIN3V_17s4SJz$N)L#FNOwJ+mmz zK6C*i<)~sqRxqVMnHK3LBlG^1~(i*6$Y9J-*c*W^xI()Ume@e);O)nd%ZvX%Q M07*qoM6N<$f^XZY{r~^~ literal 1945 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 diff --git a/assets/dolphin/external/L1_Cry_128x64/frame_4.png b/assets/dolphin/external/L1_Cry_128x64/frame_4.png index 3f7dff4db63ab16d65b5524967813afd7320d7c8..4e2e8024029048c3902237c818be210d1334b9f3 100644 GIT binary patch delta 886 zcmV-+1Bv{S4}k}e7=Hl(0002`twPcO00T%#L_t(|oGp$|XdHDIK;L}%VK)+zNdy(F zWts-;L3HiGdI)AxQpho$Ja~v8NI}dR719QiOoQN_biH{?dhw!YdoiIKv(p|V2eAQL z(wc5&8X^k1*-2P3W9HB2p?&AasH##9r)bw_nh&P(#wWo~TX`JFgDT!> z1NYxp=J`k+(tnv$E2_nIJ%}rLTo}ULT?LHWF<-R@D#BU8PMF3JMo+KV!U$NGe9xhg z4=k9-{E_1(>K>8sH{V?BXDj_Rk2PIsEi9eT#ia(#bgJ2?1o4N(!x4=pV`=Z=FzoqX zSeZ{x;ZteqzuR?9b^mu&eX%Y&$bfM-Q98h)D|W^-#(%-@uL5Nx`P}!Q5n9Ov@N6if zp_@1f9miV+bWq%-;y0=+X8`m@vN5-NVaj{0*XeQrM6$By&nk!F0z9Q`f2V1oLEKtZ zRZZR(GZA97vjzZ|euJ@T-01l%u>hzV@L#s7okrOKK#hYM2QH@10LYw>ShdW%U<)jmVPtVfB{ zQjC=zT36xV%#r8XydxdN8OH9eVN-sWZUM)@fqx4geICZZ3pkl3Of0WnLO%w?x(036^~@&eFCph-7`wZ+ z_r1EX4;X<1muw&cRtf155^H?=aL|W5#08Ow8eC`e)5E{!JSd4%%Gkj1i+p&`i$EkX z;cqzMD>53M!KO1P99_Aknra}^HC%&d|CziA9gt1ic{CMbh5$17A48A47cXe$jsO4v M07*qoM6N<$f@fQ-CIA2c literal 1938 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 Po`0iKks_~3She~8EY<;+ diff --git a/assets/dolphin/external/L1_Cry_128x64/frame_6.png b/assets/dolphin/external/L1_Cry_128x64/frame_6.png index 7871674dbb919e67eee73a6335c249c2860c00c5..4bc351b8d54416955e31e94297f4140581276d1d 100644 GIT binary patch delta 898 zcmV-|1AY9O4~++q7=Hl(0002`twPcO00UG>L_t(|oF&h}ZxmG=!13?<_0bMk%d+u6 z43wb~?ZL#}?4g#?EP{y#!_}A);}r@QN(|Y3-I!PsV^=PkXksP)0VGD3P{K|Vh>&Q+ zlT8-dq18Yv-5r;0ceXq8o`-&K-{Xf`JzJc%z3H0E7M~QW4S)40dxe|7p6zRjZ*NxL zi?s~5h9JMwOu?&cX+id{dD$8Gv9y+K&B1E3nEm8Fs;)Tep7%;sS;!&phvmXoVeFoU zkuS|gH--hhe|+gYh1F3(6)GtviU&Mk_Mxas(6qxGQU;T^W13EJqnSN&u5+&Hrd@MW zLWVqct~c&gqJJC3mAEXP`UG?E14+7n2OLO@Bom-=j!455_>#JNRI6?jZM`@3{q4qI z9b9dy{!6oYvA$SLnC{hd$^vz-?NQM8_=b}b2Rz(cf|&TEy9|$6x0}1>l929R8f_Yv1oi0|B7sh1pLFtgO!YmjL>W z_?#x0%_Uk4fFe6y?e!X)rKwxaIhU5$T>Lrfo!jiWu5-?%PSBGr$YVkP5&>^0T$&*c z0K|y$*ME6u4r141r3Ygen=*>>xQ8*uhR@m5wZ`KL~NjEYFW7mnsU+rER!;4vzc z?s>Xu5FTQP0wO6GJd=_eEyJ^jV-lGBgaH%9Kn%ixnczahf1Wj5tu)msS?3l8OUnc9TTPHgn178e|F!2lZi8&51=bUFu(J$De2}Y} zSUK&f1>iR{w%2L)ww;?f?woUOUM{rfa?#!G(6O6%)-*@_^6Ptde@6nb_gk(WwA+5{l^(7w|7tAxH@fq4zKLChMSniD7D%$1YKY$^AoUT3nE(4HjetBX}+1L%lPk=rt!@ptTosQrbfHZXBYHC!}eW~jK zB6(XtYaj1LZwx@l-Lk`Xj09H*0Hr%Q%KgKOJ}gZFh+^a(dQXpda+hzEq-#+?_+Z!n YKc@tvTZHPGs{jB107*qoM6N<$f*zi{$p8QV literal 1946 zcmaJ?dsGv577hg?P_QCrsii`vgG#kdl9>s4L4c4UC2D940db4k$vjBJWMVRyfUSU4 zE4EN-QK6m!TD97Oio0rCJcxQwi}ek4?ZV266|&0XETE#S>_ox#4^QXJ%=JDbZ+;*JEp;*8~Wm{}Yu)pC1 z2v|rZxHv{9(%IFN*^-j)pwjYFjYNJ9At%9vcp%QL;2c;f76;tcl{TlstpuO?Rd93f zwh#oKny@)a@ENI0ogPp#4hoP8V2BWjM1WK-phz4sp)^j+0}v4c3t{e-La>E4hwfK_)3f+a;=n&)nZDJ`ywDM zq=J^wBC$y(flvgMK_XO)Kr(`$AQ5gt5Q3nklvpz1=S6r_BTZH%qnH$vz%ZPwR*4a{ zOopOzBq=5dM${8ntpVr1ihJI8K;@C0|+N5 z@YZ6BjbvQTIo>mRmNG^;EUPI}<6x}7Q;`*x7Z8xpcnmEvp^!)-h9NO2p&%0~l|fQD zMVKhD2$xA=a2!wmLA+;m%I$DT*eAFs#Bv%Ygfdh6y7bu_WX6{mOlyfL`N^VXtlTt7Lu#(87+)(c$I@%0Oh$zx+<+%)~vwY6M_ zeyPP&M)$9~D<>ar7X_(D`U*UMhvxBSjon)~E!%qVt!cbZz)jabo_@WR>H6@i6PH{> z<5+ip|8M;TDc8GR8CkY;|8eX|(dg^Hmi@Q$pS&lpWh}=&fP>Ai7_5t`%x~AMtz8v+87)tMo8XWPkpaS4Vx`9B;tTI!CM1eR=^m1&C_4zGt7VhsoVtLN?NXZ9V{ zzoa#1X=dm(fx44dA9U?*864fVVq5oMXu7<(G^hGnMB6?fh0KGdH%D3%+iwpw`duOP ziESDElH0AB?$X&ksWGidv#W;4D%IwWM_V+ZfqBe%XsqMm)Fno0UF{buJr93q|D`~+ z@sM0elq$cGrZw`hdtt4PsXJHux#qOBHBEjwtHYD_pQ>wvkGqElqqZM;%q!ALxATv0 zRqtHU+LtryjB(wLVP{a;h+j0n&JkMPhycpm=E2%y$~_=^r`RX>{^qQ+<(qr*E{1i6 z%PQ+1>~842*D~qYk=SoH?lTPi%v+u{x2_k^Gs|Arn+wt!c1$mmUx+>Y37s)@YGXZp ze$%=5JJs-4{@-7HKP;|$3iP=2#=n%C5??wwbYy>r`iQ5Os`I@XaL%WsZ;Sfa-k{(s zeW`!(@Yl)a7KI0k57)$`R^BOZYU`^F^^M4+=CrUK2}5gme}V`Ea)0Y;C~<7 z;wh}}%8qQxaIe`Be`Z(p&5tIh-~B`mcfJi3d60+?qddA#SSFBzwZAq^8$we diff --git a/assets/dolphin/external/L1_Cry_128x64/frame_7.png b/assets/dolphin/external/L1_Cry_128x64/frame_7.png index 5865e91e114fe28637c1a8d7e105328f358606cf..f1f78883f53077116fff20eecb270fd3dd445f2b 100644 GIT binary patch delta 908 zcmV;719SYI50(dz7=Hl(0002`twPcO00Uh~L_t(|oGsAbYgTm}!14F_>`R@6t+UvL zg0i!xL0$-L5g}&nC<_dt^d`J&{sYY^!NldBvn-qtwYms{U>02jL0g0^*w}fz${=bW zs4?d`>Y#<&^PG*xo%48pe7dmP*X4_`>O*a0qpHKIWtfHHC4c1OtS#1@lv5Z-jP=y2 z!*qqs$(j!VK~@j-;e4ob?`lJnA1Q+R&AFS|?IO|aN~0Q31SiLWmF%sRU^GnLD?^FO z{RX|~y6H=P?K2AsovS9}E4scsuZh+}k*NG&b+dvPZ^YRI^fRJUySVyxmX@voO>8lR7a!PnI;swnJ@Xi|Yd#2anLL zhgya@v%Hw9=0ll88z06CE^2x*Xp180$nB2T{S+sEAAdL@BAoH^`egs7?i%odBb4XQ zVpZ9aC14lEDG!OUEu7c|a0CV|-e@oiz>d3;IC!O6UthI6fF7}hJhrCd0RW!x(IGus z*W|%mQ&qJ!W)`|{Rm>2>2 zIF-F;YK4QhM9YT*EEZW(=sBI~)_(%k-}thToz|=fSGsjtRj-RjbTMV(8KH;(xKZB- zG=JOHu=9Sds(*`hkymQX-($`lTm_IW2nJAg9EzR;+NA4()th5Y($z8mg4HfYcl%Qt zwhf3Z=6;#2xjuX81EA34&PI}rCM~L}8j@tylg0Lf`75ofs;VKH1!a*`gXAk!RSl)q i%wxS)VtbE2{sS!U-Fz@5CCUH*002ovP6b4+LSTYx<;AT4 literal 1950 zcmaJ?dsGv57M`y7z?CAt8^H|&CD<~VM+TCN2@(lN4um4a!b(*plNk~qnUD-kcqkFs zQc5dIwF*md+lpA$-J+Flt?Pm`vf_~nh3!F*;?`PGURJDow#Z>83U2@Kbk5BD9&^8Y zzx(~}JyV{PxY=j1U@-syKAJdnGC#WbCu-3={(WmvrIsIF;9}Ca6qex}q>Tnt23AiC zHD)rCPNqpier^Y?0DyU=CS4krrcEFy)+{DHHe#pQ%A)~5vC(NIscf1P>gi0AMF~!v zYXOBOgAz;)*CJYLG;K7+71-#Mf5g+g&>GfDi_lR64OfhY<|MFo?H+?D-asbV3$; z(3}S~ZKrG|D`#RYLXSsM&*pJTkSF^j3$s$D-(#+rqXMJ7zoAP~Wj;S8deKu83RLbxGAemDU+h$EZ*=7@t)Kvzr!bCo#R5_at5X3CgE@9G`GbUr)T=KG5E#P)}k$ZKiT-kS-h~Pk#D*MNeQ}`nVA`Wy0xum zH{YRk8nsI2?60lfb9w+-BB_s3wu_NOq3NDUoE?5p1OY) zeoeWvaaG^%;?uN1>%;#Pi6To~Rn7OAuLEex%l{T(V=1|y0bMcpTG7!WFuQ5j_zqlj z=^O9DkRYabg&bSAHtGDKFhAA5o2;o-sikTAhp$ak1^l6G3)~KDprM1Gn{L zddB*w6O6+5_?rBEFIHc+2VZ}+!)yEHs+%EQ$7_Rpt@ENf3v1pftoz%?3L=7){nrgF zQIyph`y$)+ir>GQ5LA|V^SzAeis!Cz_1^>f{O-Td_;`W2r74)q3qK#yzqYQp2u=q= zZcX}wS)+Bg<2#Gt8@c^{r-F+AY1b~P!AFO4w;sE5xTuQlTr=!! zs6Q|jb$>;LyIr?nL*smQCEyPr@6D@mxmQL5_a60pxuaR`4ZQthrJYj0Ia(Ukm6hK0`I@7zB#UCGb;Elz-jv*_y5s&1 zkNdDd7$W#0!F3fmv3K+5Bjtv^uUxv9hYGr8r<^R3OcYcHW!Mduiwtc3$c)jUUmUuhZ zw>q~o(^Vh;NBTTzq%QciW~IA-Qy%D-+}4^mywWuuaHM^6-K)Lbqux=w2mAJor;Lxq zYBnA@yyV2XsG-%p2d=%0S;j_AR{yZ|_`yK)(Hs7c8fw06{E2A|AkGZk{c-;f(4ygV h_q(CBz$3p5;5*&?>Ck?~QqLb#6O*X^>!ys7{{eU+08an_ diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_0.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_0.png index 396ec251af3b8daf90ef7cd0a210deb6661e4d79..120855f61b750f24895b007975e5b61e7863b56b 100644 GIT binary patch delta 364 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 X>db2`AP$2n00000NkvXXu0mjfe=7J2 literal 1524 zcmaJ=eQXnD7=On$w((&`FquG{mz%%{yWUr??VYPz*LJKzaf}YC5$N^qy{)Y6mFtal zpfaZjD7aySNC1@(1r-JoU?2;O4Hpp;CuDpRnFs_m105~|f%$e@kv|BRyL;dFd7t0& z{GP8>r8B3E9x;9d0ARGM#8HOUI`kE$C!_z>^aeLt#_3M4K3i4v8c~D5CaZpkxk6$E zEQ6w4yXZK~2OzmV;PL8S_Y6T&Lk2OfV~B+!2n|4fK`bIlRZz$Lup$t);x`W+!LfjB z#piNv${n%8%0S5y4bEON(<3dZl6V;}coEBw3CKVQ>LL~k1;bGxX2l2W3TPh}lQ=e@ zqE}h*K~i3KDP~tSh?xyEAyE{CnRx@0MaIu6qLha*6ho6Vdd&oF78q8bd2HyxkwZ;Z zgfd6*kUMm;;+47{5lFJ8rp8di8dR-Q z0X2-pEsB1%TDRhe>|hk3h}-?pa5y@YE0i@dCPqlwK#`$PJhTDrs9pyDr}0?rsHZjp z$ubyKt2GIgM9E2jQTm?jD6WXu2rp{^R2MPmP^Ib+4C^k36-PG)IUoz>Vmn>LQbyLq z*=X8nx3LzJ!^U$(oZV=5noS8CkHZ=rMjLBmO=hQ!jbkk)j&j;KB<3u3Gsh&bu5eTr z!xBvR4IsZmSni2f!LC73S2d5S1`|zCTB+)4v{H>=3~QjUT(>9%!g0xzc!dT7c0et# z7|O+(8o~xrECe1yfi^0X%s_=;jFgEGMI%Mu*Sh!rF=-vatf1x@=bt!odK%M2v=5tQqh?d)7Y>%E?81H>^U2cQX55;N_hg=3 zy))Z)X=2mZ;Hn2ng>SF8x7^oh-#58rO!rj&_}GqHdtQR2=g$N|SMPxfrF&s-P5!bU zuan0|&Dy(sbwL-5jr(@ZXV3e*;Cx5p{vB7&_1rP1tlhe=;LiJbZM*z^YXF!!G9$a^ zXYlu)>|wx9Yf0cp;XUkfXO{Tt7H8Yd6?~ph)|{R8F4(B0um8SnZ;I=Jn)Z7two0hG ztz=neEnc{+;FYT4*5tcg;F4GVXBt@Fk}PWr-|bB@PWX67 zL6XlaUT+L?AEw;;^Iv-M=(^p{t=`mkpwqv2(bmsXaeGVdi4#{Il-G5h+kXG4*NUAz zZJ+J|ncGi|5~_1s=S>;^QR?)T`8RP_%k<47K)uzUQP)1V@CL};i1)0?{O)AA+3}6e zWo|BMZitzF>h|vYpyQb@f#vqfywu=(v5Tp#!ng$$S(oS7#sIowL58mczxege-keC+ z#LNj>DzmQs@Yh*zY+Hs&O^^+2c2o77rv9b|kPNmRPM&mm;TI=SBLJ6krlYCISN|U&Y$b63 diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_11.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_11.png index e5ee82f701219ba4b592bc559354572cb96198ee..2d98d57ab2f86cfb5a51804196a2bd979708d35e 100644 GIT binary patch delta 710 zcmV;%0y+Km4blaW7=Hl(0002`twPcO00NmwL_t(|oL!PZh!b}d#()1elVoZFy9*u^ zw`~?Fy_KvUHiy~{w7v8o^}5A&54H#CE=8~) zB_pgD1WCH4&15r^&qHF?^gI6k?|Xdjy+2Gnl^s!dwhbT3=yQ0hs&e z0(5r*j0Avs={jV;?B)2K<(Mqnn1UTjtJu;uMg+ifxPvw(iBoV5wPE>W)9?~k0fkgx zJI2S=cG4oOJ%6}`8{Wn!{WV_T*}Gi@fcIU`c7aW4j;jw_=7-~HKZD1Kje{wIHxih8 zKaIy=ACv%oy9SoUJ$gkx2RIn}KzR#_+>|7JaHC}mP7q!6{;mRi3*h|$_`{AQy|~c= z7Jx(jz9i+3S~h>_%_yKUIn~ct*MpS$1caFK=y1mBWPeXpFrBD)mmB?#B&pN1jFayU zo%{jV}CM-?_H9H8HHzh!6)h4c%6~7OHg>O`#fw4e?<-Tzz&V- z?i-2nBQ@0ay~}NvxI#n5?tGP7nQN}(RaZ)&{Ad5^=*zggwgi6AlHvIa-qLEsv4|{K z1pl33J}PXL*P0>0slH5WU@-V8hF}{k4+WqQSU>pm0$~4s?OQc+jS#PRPT+!d?#8%A sh`l8lYX3MkfPFDu*2e&BL@|;!ATAlCfMfCNVH&F;J94N*l1?6bd;k*;c#M5zQR5E2Z~tF^35as!--= z<`AhAtqxKWBo2w#TowkyFeH+&aRbWJBSsXP2k~GYm&2uR5sNF5@(?Lk0u5hG+97E$ zN|RJ^!|v!)G&7T;Y*G#O0bVv$;b3}QuUwOFZC3gW~f zp;GV>tFhWC)QaIFeoeIBVXWwXu~H?8qZC0V6GZk%6X-Gtim+!AHi(C?VQ97%#Y|SW zWRAN+LjkLB(zFgY#F2yr8cea&^cf0Vz7aO?a3hPyhlMN@<-;tAP$FR=Mm{bUpdurT z(jg4t4WFcLs7q-H9foa$jT93YC1MQ0Scm~JvM?jx$dZUr0ZVK^Bq)yXaaVinFfc%GmtDTS5de?38kHj1 z(SB#&O7aglKy~ZQMQZN08F~|_m{j%q{!)!Ts5E0jxmV(bN3XcDiioHMFK2@0Rs!?~ z^?z6&CjZ)_&F|*;4(H^6)Du8{|J}^`t8Wu*Y0b}yn(oj0P>iMpiDeHaT6qz*UZR2r z#-PrBI=_101&3F!csHS;%lC!Hdc&gLgTAEClDu&z8ea7+IG=bgH@_neY&To3Z<7Cg zqpicH@tje;(5ETgwwy8FW0WQ2(mLBH`ONMs+S^`N@ivB>QF~+$W@Wlcn(7&Ob)9C! zOIIg~Us4#5o;AZf$NmfGj^DZK{tXu+RPo!rzZj=-8zvXV1Q*x)oa`=|2<9w`35zK5 zC<8Eg?Q+-34ZD>^X0QO1kKQC{*go2`W@=4uvm$;%0a@5k-#z10>do2KHGS3Ls!@mg z!(wZ1PKmm`-dW(EQE{|RReZiZAt(z>JAF2|;ON7rescrHf|IP*y)47&R`L6_;CSdw zYF+@;6f+ClDN}qS>#2NhcJ|Kq?l{!b)U{W6Z_z2v^|r){s`vi4()Wxpe&8NBDPzc| zZ)L__bI$UU0!3wq`A~?fqU_?X!)L=*`M7pbJD$Hh;7jQzrFqv=QEBO5!1M6IZ95$? zV_lokyLr#*9z9`v*LXc9Egs%;tu@HiB5j*e@-+I_xSg3_g7P1ev8!jQW~apn(@mp6 zE7_JMY=5IYp##fKmx1i5Cm5GQoI9TV*|gW-bNF0nZM;9D`EIvgOYwWzyNt%OPVbH* zi5E)0f1KZ{Tcn$~#mbQJCN!Sim+kquBY$_+g~|YJ+5T~rpk{yP)m3NmXZzH|&I}F! z)p)UQeAm{+uW#u*x3qdT_FpLpDfy`-GOJLM+-2Od`Is{!RVeFu_%J^B7$n^P1;~cf ze0kBdjlFRVp%HbFeWTJ-vs0L^c3EtVpYy@bmlDTBmZvWd*NxY=1RgT^Y6To`DR>=z z+-W{iU@A?0@-ST9b9co~_2r((hW5U1^*>ze9PoodgJx`1d|-jy{U_3>6I9i)8F~K# DYC4#k diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_12.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_12.png index f3059dde7389447105b97d75b62613662d28d24c..95d09d14beb7dc18d38f07ef3930e19d25c04f9c 100644 GIT binary patch delta 517 zcmV+g0{Z>O43h+q7=Hl(0002`twPcO00G)bL_t(|oZXVKZWBQehQHan3l^M|Lqy;r zLYIyLkP!_{xN`$7B}x_EAPWj1)UQ55=wR zxTa&e`SzcGW=8}6RpjYETcpx&EEAI~fnB1(((?+$U>D#Fn12E3gAsd9-vC1Z^w%r! z7>u}bO%kt&!BFZT_qjfR5Ht~fEV@Vz>XR%0o|57%0=Ma{Y^8~_*A}P~6X1ZmTI4_- z?uVKJU7hA22+c@)5M-+F;U4h$rS>3H)gFdbr7FAz)G=&`o6k*5*y%Rz+`dIz6$6rK zr+G<-&{owkMt>YPOCX}~hTkXRIMt*A324o2>(=iQa|6_UV0SNv%YKO^v;fnvb*0?k@Yxu%2IUSD zex+bW)nMb4K8+6ao)0k>VF+M8!9ZRRMleVovHvB4KO_ZvnWhv#loR5B?!-v}80)v$ z2#|vPn)sb^JOU&*^=D*iC*i6VGT~e#R!lid3?$d*R|otBwQr<1VQj@ZRicMKFt;H1H4;fM7!(IdF~_?kQi`G^giIon;ZOq)l=%cYg!=+1Q41yzV0e#T z@NhmfVv#Q5N(CJT$qq!}_1kPu4Eq9uxq?}fglNA+DkdaeZzQyS?SPO2{-^Ow?Lc0c zA4qaQfGg!0SQ2MS6b#e%d`A&Q$VT%z?}2rpOH3S7>IFW*YSLlwM$CFxjmlz_W{`xO zR4NQoso7{C)k>3rQe-HMa-&(LjM{h>R-uB)QW%sfvw@6YDYZpumK%%&AI(?8j{#A?9_V)vt9UL}W8?uXaC{!el|-As;pPM`;O6|Oj1&{-G#kx$d=bg?NQDLh zHUZwV1h5vK^P>GJ)_9&lK`M6=tPD7DnVeAKG%Y7^N=Z>T>68Ptf>t>R8iqfBXP-*l zK$k)Z48tE~qhSJ#%eVg@ zZi}!Xer0NU8PZ3KX2cVVj(U?0-`^V^O59qQ z5I(1HXsp9>$Xh%g8PV8Y8fI2+=su^vd3EPM%_C~ZZfko;Yma^U z;yBSY^_gLZZ@Ns{n`aE)PLXs>nire>Zu@cBgwzWc@w&^Zs?hk`X+H1DtsA>yS`V-N z@~s7{CMOq+d_Pfde0zZl(Qoe5>H`l;*B!OvsZ-9lW#4q=Hm#rZSM8NYEkwO2Np+!mOhesFk^YkdEguw=?igCaPV8-b zd`%W6m#x}-y%DQ68+P{~=!~CIg`Yj;iM7 zwS~p*KTJn{sj(%Eo|Qf7`*HfDxNC)Vi8VVKr%hS%TSA4YnN!7VJW+djnmb-UPy1us z$nAS}H?&Pma41r!cf|Ko!`35vW({xHeulkTS$z3X*}>0F7`C=gS)O@db@HOD=>^-i z+*x5QSh!sM>zGrg_9ZH>*t3L#X}a0^q_kr_2XoU;Hm1#RmNZYsPGjL0)Nk~hoQnvS eWwS-)LtaLjgqP~?eC^_4Zy{E*-Bh1ZSn(fjV@>`5 diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_13.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_13.png index 5d1ff45be8dd5e6679795bd041798bedec2d9f5f..c385a5ec45529fe854405d541ced0c0f0359e2b2 100644 GIT binary patch delta 581 zcmV-L0=oT=4blXV7=Hl(0002`twPcO00J3FL_t(|oXwKIYZGA@$3OR8OezL?ijWTd z2@ZDA3>`YO<@di-274Vq&rra)NHY6`?9wSSVeu^^iQ1piFYb46)I z^Pe8ADPBk^fbMiI=!0<}ZxvGt?hbxW0qf&XzHi!4tOxaON@0BLB#5HqYt>LgkFQ5b zMU87vPJGViR1IhD5I6$1A}AiV#2(r0u770uI+D8CfnGI?ArpeVzl8^o1zo)_MN9+3 zWG6A~4S?0Yh=1kfR(8N>wgu#=Fns)0-u4a7GO+7gi=O?gJzgfFAjOeYaVhLXRflZ~ zQXJ3g1qJO_9+@Au2Us;U+M?slnA;f_;4DmZ_!fW`*QKzH-k0prDQy^BfJU25CO|!$`Gf)&EBi}+62M#QU|}-7%g^Y`)R9M3nmwlNehU!6iJtFYY+L$6 Tg<&HF00000NkvXXu0mjf<7yFX literal 1679 zcmaJ>Yfuwc6y78lsR+g=0#eub7(kNUWbkr4ByL<0F_k8Dk z=iGDlNSc0q;GEDo5CjFLY#`FX>;dmOe;)V_`M;+FQwW=EWHT6=%_p4{lw@YIC^*GN z?xNBu(p-?+M#Vu8uf%FFvPNC1%EZ{jq*q7mwmASAg5nb04$_oEv2Yf(%W97oj(vAo z2wTnZ!fkRLs&i;4i*-YxlgcR68%%{cCfqDcOn~FuDqz4yu_Wxa?Y6sA?s(ypT@_e+ z#fT7|QekuAh0~;rx-?kBI4M{umWWI!io!}< zPW?~gmD(;tfrCQQDHoIHG=VFjSNgypeXn=qRRnBQo19i~FXV25G3D7PJDWnp3&Dxl zY&ENtT8%`Fp)yP%Pm)NIHAz^Ef=I&UYPm+HNmeR+HeQ95Yj6TnYoyBLBy0++#?*v_ zkZB|erBtKU`miZ>7faerl+Ujf_?^K@UW-*}oD|72P6Na2_7y>zg<%<&g>k@AOpL-2 zI?`mddnJ+H8=4N7pq$n{lv(R!Z17ZyRn}KfkjQA%ETw3XRE8=8hxB|yT7%ih> zUu(Dh z0a*gB6c=B<%OBq{=eeund8XPE>%Z!^O@e_D@2Fi=GH;3B#ue^mEjhQf&0W`M=)slp za_LUKyT6F>SJIZn14We&M#okdc@LIX{iqN`a|-#ZpfLaYkg%#Lyyc(a?t4vv@MuTP zf&EbMlgtQW;r2S-x_jsJoZ5)89fvpr`(d7kEz-2~M2LA8JFi21HDSl<&sw8}_x9F5@R~`tJ1bkI(nK9rES8XSPz3-z*L~ zg7PoR8}w1J>$-xU!rW(%DtcyFx)qPxFWss#z7=$iBOoiIiC;#pI|XJejRR+=SGM(z z^=!SJ-$h^lm=1(gu2b7ft32b1rm~veiYU)s!)o>FhHJg8@LdG@;bGaVsG+Rv8|$G2 zE#=u)XTvk^cE@#$w}wEKKj#(&v>9tBx{ssF-dNhYdCdgF>HMmuF>+(YqPpG+4z$(J zeCmA}Q$6zT{4?mW?Ac#uHTqfJ4ACt(K;(uR#%y&bk3|<27JYvB+cljN0o}1D(yeYEz5V?}R_h@5Q~kRSZ{Bb98z8ie#vb+2&9t6e0lT{rZc8+jF*TMf_S;Z*SByecoW+LBd^$iq_wXusXl6N3_M z6B#H1<=9qaY;7izdjD3+fOnftDC0YSDh7OCD@vnb{jHlDJGo7;CkOW}1KNk7L#$x{ zO9NH`Hhe;Wb`97*_Gy=ElW919_%1<8BOTq)s{!$_34d6x069b?kkwGC^3zVkG$Il> zi;--|>Nq%PKuu+p2Uu?QF^EW5t;+KSDbAtDXaL)0bQ!RodXbJV79Qb;luK0&ptKv_ zoAef-7}tmn7T2yT`RJi^tQZ}*Iy8r$MSMggl-_Vpz7FPHI2X_IN=;!s0jM_@GME5Z zw}D6p40zJ{`iJt(N`1L$vpdpN#BAXeX?VrykOcgW=H1!Lp9}~%(}8lWdQ&l9A@bTh z18O)I_uim<14{6=F9#zAEaCU$?i}`~fdZWHQ|80xCCEoomxjm^fX-6!gl6a)JR`tL Zz&~1h3VB{;Br5;_002ovPDHLkV1j$>BmV#Z literal 1714 zcmaJ?c~BE)6#pV1hXPe76{xz6g4U8`lg+^f!j*6-Pz<3`>no(LBQ=H2H~k;p8*baWb>LTP9-W*|VMn#v-ecpa8aC<#nm zn16u?1;C+Lt4gEO5)-62rQ>3D9j-;EXV3tIhFkO)o=ebB7LlzbW$gZ@W;Uc%%h=0A ziEyG`PUL9giVQ?bQIZNT%EeJNJ3I^uwMZEQI)cU^i!P5eN-Z+>m|ZEew~KjfXiSC9 zm9fW3r6ndqa>_tJ5-y*E!!QgB9=v&Xc?O!J068jpP2ZpjZ?XxJb10fJ=1_V_fN)`GVIqcW zNxS4-dxgdWRuBel0iljDP&#NV#Zv7nDDZ_ESS=tl9DxuPb1+N@b5JpgauAJ>2o_-y z4U942kK@%ZrEa`S83_}Hev*w87irL79Kkt=8qsiYjZniugE0{&SdE|dNX;Q4%T!?`7+ z-TF`!TkZ8n>hO^N9$rP-@vKd^8^5xR!YxmnDy$=&PQQHH zX#|}szk7NaYf=DnUyJT!>m^gq2SZ+?L z-^xAf_P0Q1E7oSMIIt;1_drN&@ z`IhVec%h5-$a2R+1Ii6GZ|$8Cal)_i#GJN~^AXcFZdTQ?d|9cBpAEmQgjj8T&cNt= zNy<7bUo;!JCt*R3r9JXy->Qp@f`T0-j0*+0U1w+2xYL6r6##w7x z8yz>tzfrfNs8%;T%er&h-3C{qtN+Yia{ZQ!idvThuxRjMPn)zs6Y)48Jj`5@A2K6T z5fStFdi|-tBig#kyFDF$cXpfF487;y*1iVuwxxtefC#P*_OWiO!}dFwVP)Y z3oZqKp+|I}&#!|ChgIF>9S$A!`RV%lYj-Xza`zo2yPWh7&LFWZao&*~0S!K6ZmAzA zI{CfNR;}zTuH-rVu%UW2=jwF7lxH5+&`;0;Z_ULkwUWN!N}a0JbQ2LK9drlvjnm7H zn!|$5m8`gZf7KP&m1XL(GHuoE=FLqT>6*U8Q!l!12d7Mwc%Alf@-DflQ{_6_5 p*P7!{4){{XOEewP3M diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_15.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_15.png index ec11dbd035180df5121aac86b2cb9e92506014c0..d9ef6edbbeced46b0c820736009f1aa8f1e1a3a9 100644 GIT binary patch delta 692 zcmV;l0!#hx4ZsDE7=Hl(0002`twPcO00M_eL_t(|oL!Q^YZPY~#((q9ke!rB#v&LC zVLvbSP!Hl&nhZU8(?bv5vj0F~@lv5+#vas*;D3-Ddl3rFp@)_XRA^2n2T`mg8A6*Z z7PGUZ)!E&dd3u-~)V{ax$NRny-}^jx(sNa+nU(RsG9aS-5P!hnJs>FAq~>;u)^|rG z$~sB_2%u1aN0+$Wkpj@ewctJ|2bS9%8~LJyRJ9#FE;VyK0JN%;Rq05o@&;_{g``5N zMhRdzo&a+II6ykfH8jzK!{JHVj;j) zDEf{C0;mDDV1GbnfF{1A>Y&o62|1wgTS?RXviyZG2g7mz@7vDu>W|IELZF25-#eQT z7-Rs>3$%XeAs9qJkr8_7jd#vP#7i9(05m<2c7_M?{?hdLUUT*O>ptm&i>)t?qcqR4 z9!7~#z)yhd#xSWc0_cGwchLR5XA}scthG7-+8{M*3VYhtg0Ris^&&n_e$U2l};4U5 z1m1wpcm{q>;5*<}0w8H^Lv>fGh-QKL;*i4(2rcp%sHWZ(!27Bl*;oFVq9!c-KM zsn01YUXv*@byMF2_co@^dCqH_icB4w2YBLzEERG4!)IQS-|zR$_w)UJzSm2kbhtWZf%l^6qGUl8YzAt;s2 zV0!J2JEk-l zY$JVi4&&fTLdCX&x%9o;QBaX%qe^C6TwU;N1MSFhlOEP=P($1o5#b_K3X@)}LlG$| zmubafqh5C934z}P9mnSG060A^L zzy^|WO(O{tL%YFODOS1OLP0F05JEyyLWvZS3vpbE2r)T^2~kQ)DrLBWLU1npHazja z)U|afC*i{IwzE+=WE7@!pbjBQpp?)-Nhu+w#AQMyfnqp`N=Xt^LNG@W4tCA|x~N^m zwPtYpW-PeFo53PI+%z%V*c1&s^@JO_PS(+OV{2nsLUzpPhMVpI(Kfxov>uh;|08~4HYjS;NV>u zkU6h%B>cdCpfjNqoZpod1(va=uK+c-KQ69d_-TSfOEZv`F(moYq6JO!B9-#`n3CJA zf->gC`8m~wY)b3BGzvI$2;v<$v2=Uf=8-G%c`JHN{A;WydABTYrS{XIQG2^QOAu^s zx!i&swgA4OD_7P>q#Z4cpTTRIaHlc(a-Zllu>9(r9?hCvrubjFBwpp!EidiLyW3;v zGEv_4kg6veTVvuY+jKRDpl@r2}W$TJCvXZfDShRmNDV_bWA z)3+1@TZ`!E3!RbC=cK*P3(J2lC3Nz0aS?(B0F9 z8K1Acbh&g(%mw4qolDC%t=yMT`RosTc_i@nwmj>mA2u8-NczIn0rYh8Uq3WR+Ns38 zrm#N=oIulsv%;Nsw5Pw+nPLhx&GwYRtD5KY%Ss1tD~awcuUQw_4_Nrg%j&LXUEQPp zJi)pn!^5UNVCPH;a{_(WhvWV#+vb&;@jzYffQ=7VM(plCYR|EQlaD=q5oq`*bJ5~{ zjp->v6UvvxWZyLHFxbYX;iYcvYOreP!XE!H*syDf_i3^7$8~4IDbb?$EH4)U1q$$$31WB06k#c+re0!C#QsIL5G3mzMu8i=&kV diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_16.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_16.png index 720e95f9e0b3efdd30bd0d9bada7ec76ab34518e..d6824382688060103df0428c9e02b89a98097560 100644 GIT binary patch delta 502 zcmVWj2*z)ID@d4#?KZ^43^g$=1}AV8`IL^GhqQjzQ`_Wc-c+$P;Qi>*)RT>tk! zzk}>nZ(*?mWWC(9Xf@Rvn`R>& z&d=Z{?cEtxuYaJX9(NP~_Vwwoh$Bsrba@CcZ(#zApe_LCz!=1)yjFWxrl-1&up9#k z;5W2*{i7+hQBzmC9P-gpK`eMZfSRH;ybpDRXW7FAaN@5BFK&T3vlgz|kHFUg=P*gM z1YDI8E+D^TC12E?Ysk#@D3WNsj4o! zUdS7OYP?y)ad`3tYWUs`duafeJ<29;>Rk8U=Dp-9;H2K}SeZQ9?wAar8$cRfhLKdR sz1$uNyZHbPb7CpI|ITWAB>xNW4*+w3T!$+ZvH$=807*qoM6N<$f=A8nH2?qr literal 1475 zcmaJ>eNYr-7+(+&`3f?quyk7($icnc+r5w7jRTJRh*ORjq$H<;W%s>fNAC98Tet&* z$qN}jDogud%9zQ(97AW68q;VXo5;-6D4l_^24>WP7|hHh9i{hxGyibh+1>YjpM8GM z^LxH_b9vd5$qAVW2!bR#N~{%deHlJQ@eAPlLi{!-Tpm_!RqATlr3QEfAZAgn1*pTr zyFmru#ikd(1NjKDAS6{*sa4KWPLMqsKCGh&dVCO#Ao+zsA1|x}Dq0KNlGlV?`l260 zCDDYf(K|_}&jRYCl4b?0ZZ4}7n%4=eh!qx~`9TgE@Bo!ZgPwY?p9`9>S-TwEhs6Yj z&Z?;EOxPT$DrY%rkrjX%HCkLCNfI@(8X)piE$!lk6(~hgT0#qNBd#@a6wPT_bpFDi zLq&9P6;}JaJ9si-b*k#)2qF*&XaclGR@{V^Wm$rx2#Ug?2JUb2s(cXl`m-VytiUfQ zl24UnFB-PU*UAm534>(kqVV{f&fA8){`p+NtPw%pM`$%9;qin+o7MKK72tmwch&Y+ zHu(Ti0sL}5o+;1`W3iJZ}H(H7IB zjyCAcTCL4urWu3P%<7Bv7M;arG(>FN4QsG4c6+hjZnT-{FqWZMi;(?@@5MUbd(99DB>aAdM$RrD)plC|kt zzxv=v#)h`+xO2yj?*;blr3Kx6e>{Kbcy)dmaz6Ll5r16#?@O4SF?FNPkKY=PO+SXn z%VRSGkA(J#r&9-(5QlDd+s_(`29};nyuYIbIUC=Y`Retfr8S|kUFE|_Z!727Uq85!knoY z*&I9Vem(D0+C%X@9al5bYNp@sS=Ufjwk(_VmVi&h4ok^#+cm@{^bRQV&-1OnkH$FY| zWsI*Yw7;&nBqt^Mo!sXN14DoPn8U5?dBJ{UQN}W|i|Lj2Z{PIQ*72SPP8?kO@1DWS zE7FG-hs-(YXLe CnGm!9 diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_17.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_17.png index 7debe764fd0a0229d825208e2b4437ebc0661934..1a94e80b6199539af683f85c3d3e3ecf338518c6 100644 GIT binary patch delta 496 zcmV)27qVY-n~L#Gd_WK67TD`F`H- z-E&$(+NF*F%-H}jVOD_{N1I@{0ZihlSE}Z!+Q?v|h3ZuO6o&6%XAHm}fYAF0t!DsS04E_&fakzC zTDelaDF^3(wkpDS?7Q=NKKjwPi7AJ~TLJ`l)vr(|{_nH9l0-Zb-A@)uwWXhpC_=u9{)x9-!L5RzeN5D57%v_(_(3*57M(L#3Ui|L+FtLtYr{>C_LyflU~o)C6D{pqX}D`|Z5aoP zgqh8VGwL*h%{bj;Gde%OkT8uH7d0fB&1{b$84f@B7k^A&Jyh0n4K8+`wou{{Wv7fgS(S*gipqo4!CCuy|+ z4Mc?XpaKX|(;F8+A%fU8Dxqq#I#|MrTEs3`I`&v33egBsxHJ|O#Cl+&wP3xXda;31 zXE0Qeyx2-tkPJpSP^TCZmW%gTZmbsxg);m^C6MLn`S~BARs4 z1uh>&`8gl$Dd2sKtH{MUIlsFgWn)4t#keSsk9Yfhw1s6T563$x3g*!5b}-HqHlP}& zpo$>nSF!vivD{O!ET;p()bx<1g;PyXUZ}IS05a}yk_EURI7yr-U>Ka1oxtM~+%hS^@RNAyiPR;#6iQ$i z(G(k2bjgfIq(z*TXc-q}r;IZm!G(Jynh^l)1c32i1f)na~V$a(PL}KQb}`w^e7av>-@Ydw}GC7CoU-(zN59!OOYhqB*{Le>@^CzN^XvsL7YYq))4rYm zPWINsu7kDu;yk73z?RaS-KYBD#sErFFJvy5|heSzIO$ z8$|1V*FvPb*fsL1Y&-80{RJL~)S zJ)yVESCrd%dkccDeR1~m8wVy$`D&oF>b3Y}HO#i2mJXU-gdTgZo$flEptjr)k&D z&z>>&!HkRPxO4dLPG2}{0Ia-wGxzb=mlHcXe@tvIy|(j^dVI>>KOe5nuIm*lows@- z*r$0NApO{-54cuiQ@|J;>M5R;cKG?UIV~;ebCEkklk((8pTw>IWWZm_A1hk7@jtSo B|H}XX diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_18.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_18.png index d3674a02b4d464401e7ef842b8abb289dca43740..54615c61380acfb0fd53e4fbd7ebae5fa5b50963 100644 GIT binary patch delta 444 zcmV;t0Ym=63d#eJ7=Hl(0002`twPcO00EInL_t(|oRyQkj?+LCMvo^376~DGilnF6 zjxs4Jc?8~qa>J8A#WqM#ZUu&haw#I9Kq7)-7YPwd2^)uveJJdV9Sek*#+sx1^WD#L z6WKq3zk~BWIEf&y!KfEu)_irLYNe`eMDmZePh#NzDE$+7(|-fL1Qf=#CO2webL71y z;({soRdd@Dcm_8oKm`cF7m(a<`X#_t^{kUp0^Ep=3BLfYwjP8Pz@QUxzBfQZxCOwp z9WH}tA3zuZkhP>9>{Y8{0>Hd$&?8{d0ovTEMoQ^tJ&iT+^7TR&*)W1N5B10JZ3GwG z)w#>)SV0QUTph(lg5F+AKq3iV+!v8IB1muP_6*V7OYc%!HB>Ya^O?VkHM#d zr8=&QF2xT+b?c^XQUzuYfc36ef-}|Aj`a5cIjgAS4q(>o0^qm$={&a7rPhv}={VL1 z9B{(USWq{`k;Tr_6u5G|;PP5$+N6M4=SKnXkxmV@+BG$?S&wqiOZiC;Y$Iq=ssNa< mzaGhS+uN5(+66_u?7soELPCG#`A2mC0000eN5bB7%zed1U52dZjP8*Mgq8Ad)K?`wQ_^I>)klR0lA%kI+MM$Z=u4qwb$(q z#AVr%B`#B!F&xA{mi1*-d4A7VUvFyIS5)vs0fu2k!8##~)}!dD&C5pb-}2rHp=GD(Z#DO8vKa>k#5|JL z2Jv7Nw8Jn2Quiy@VKs(jA5$W&W^1UP7qzGbq;xEasE*JWR$Y_Of!GO6ybZQ1s++hy zHcsG*+aCWO>~&1&Qnx89=F69i)OS_R*vH++D6%IB+?*b-Kq%^q#7&BSP)=L zG!)%bG!;)-1Z~8_4_=G%PDv`hu7h=`~0jkV`EdS6X|+cj`e$(HLTa+5WGUbBXBO3^LaDapc*rQ zD#DCkCFM7bbv+Qv`wR$7&4_4PSEdP?Iy6&@b!a+nV=OdY5dxy3rX-cA3Z(-UprIUw zQozun_*#m2WfKZkyG%dliU ze*bvx8q;^ZICtnhd48et=loKb3#)3bF6}z*K8>Bd*}Ur~qV52@JYD*NwAlRVAEndZ zU*1tE-&yvYeQe-w{mF@zhfA)MWtWe-H|;qTR2$tl;hb?R&L}R zU-DPHz3tX(MW^m%-CCTQdS-IC>Y>P`5zDmvPs!CQ(aF)pBaeLk;g-NTEmk<(eB!eg zPu<&h(l@`9%vsj#S&i&VKb%`(?+%P#=wJEwyYZR$w%MG5y{4Y*8Jzg`{bczB*7tJO UX!F$J?Ww<7(BB|@;5~TkKMW<;eEt%=_p4?-{W; z0sjmb(_H{bU;F+Oy-Jbh6L10Ro+i*Gm;+B@CF#wRqyTH4WPb{<>Va>7iU%f3euE|e zgHf{tA%NlVt^{oWu6vuMW>1oIrCI4Ccm3m^e*#RXJ0NwTlg`gi^`xvH)ruWxHu_Mi zal?UMj`gLm6`Qj>AQ55-+iq!0l}iTQT3jrB?`%mKQc_3&$PC22!q^R91Ne-+B;qOz zKRpoDNlu43cz+>+aT7XqfGUrb350EGVe#!lOA>uK>*xL4h68t!tntde2ds>7x9kAP z*p(Ns0o-o82=l~higw*n>CHCuoOvJ_H*Cumzz7sjv031H!AKT6FDjquGAP@3N3@*v zeA3?1i)VR0B&lq&lq5$iN=7aZBY<=zDYfKzf6rMt9kOY31M#WeerZtwp?7Vh%b|x%z*%{iUEL~wuH!&*1%pDkE9?T47 zAqs?~#+n)vwOVPbRuio;QsbjFm5S2Zh9Ey|Q)Aj-o5sd8twF^`YQXg_%VK|!-ptIs z_uTWH^PO|gnLY8Qt;IzT79j{y9Ni{1!+8k4TMF~x_gdl0F*ucaQqpU&G_O~701{TM zHh@MAxg9hES?%kd1l0(VKddK`UNY7wD3;-qGdjMMVM8>6RM)0#S?L5G+6LNnGlb24 zHIAXW8p3w6F*0UHK!?7q-vKTCO$nvHQ{h#twg#$l=D%zLXsrP@jjr+bQ`0|N)<|zG(}MG;c$u*XhxuTba`OV zp`&U-vsl0E4(>u&hv(S>LG43f=8Vc4Z-uiN2of6^fLiA zOi@xK%mf2sm}l$Qh(986ft-!iur$<{sJc2%3NuUC2wxvzxu7IPL^dFCIc(H)J=s)1 z&aV#rE@Q)Y#R?Gz$e!gSEUPP51n~~bv)m5LMrp=JqMKu~qMI2>MdpUG0gJ%VcLBBD zu?%!6#e%*H1wnwr5a$fxx7{RanY#>h059^p@aRNB2^?Xj!- zCeHr;O#6@D$H&=&wg zYu@@U0FN_h0IEW<4?vU2SkNuuJKMmEDZ93)TA#jm%cA|RhA}Kxs%*eak18g`;mhWn- z&(kZ>6Hj%VdejVfLk?DL!=d3S(>`$HX5ex+--Rl`q&O4+pDB8%>#Iksx{n-tTbAE! kfmH$<%evlDU2GIp6rPHfrdmX zENF*G2$b&E&qF_kt?1WMX*(_L5M?9l0*;QWm^Bd^!~9!{CXhR!jb~uHrU!_*iPHqG zDFLF@Bhiu>h8C1K9U zTQa&5wXO_C>ASxpM-j0RcUl^{7tj?k0N!Cq!NdVk5DR>2eu4{0EJ(|EBBDVzWx=Y~-55fq|GIaPB{6_rJ(G@a#ATcFKSV?iBtlZD!5 z=4!)s)N+-H9jWO2{5)E|c=l2+hE=ffNHA6W>E_V2N6+C^`-HjqnThn(^pg*N_-Rw+ zdHwSKKkl?dqcf$^`~CEl*YX$k`nwx`2z8%pIpu%m%x}YuZMIZLH$4Bi@8@LI%gyze zd-uVnn-aF+A${P=$9?~-+4|$)k<=yVg6h`p)d#xi1DrKfu+e-&wov!0h_l&kc#kzwTP; z8~x>2<72xjYBO(}e}41%s-u&&o2K7f-*BwWPmUcOy!~Zla(v^ieAh`{X#KY4SM9qK vhc?&m+&_Qh`ui6LCdLjv(YAVOTVDnC-l2+_XWdPwoPSt6+8h}Rwe|l8@=ndx diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_4.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_4.png index ecda8127499047c22c2dc2216fa68a4be335c8b7..909c6106c7bbe37c1f7a871ef014c09f774c92f8 100644 GIT binary patch delta 439 zcmV;o0Z9Jm3dIAE7=Hl(0002`twPcO00E3iL_t(|oaK?RPTNovhQE7bNRUv?z|g75 z&XOl+Gj`++$lisG(P85ix^-ZKfj$6|d4sBoC_^PosY*61S`{0v{dcf^bHgk2jGxYb z&VSBt#A;doGhobQ1(b>2hb_95axKep3aLiWt+o36dVQ)TYB_jaNr?0yq?<7f|_1yVrT>lNvKLi#GJdh?Zu9oLl zx>lX!{dNX=zPMMVES4nQ3O#b5-%5vt`KVtXWDzNjwDD75DTp{@Ht83TeaBLdGp1q& zu%RewcGU)o>3`|Z3=3ZXXW^k>>(I5y6%iai?9TEo%6ve1bnHeGEI-I0+k)}n3W&Js zEg&7yPay^LZ77LE{+5$Os?ie6B{>s>eF-=j;~%sGl$j6DvJHHF<6qc(tgrm7A1d9s zST}V5$}Dz6*8(GurRQqvbHPXsw+yPOrYfKzf6kfnmXnD1!QT(C9&=`o!&g{&-X37?pou#a0fo!+9wGq5KbC(@qXO`K4 zT@YJrv9(3(BZf9MO&Y7gANHZv7F!dfm{e>uY4MSe+E&|QqE+z)vDKZpFq&8HS{Fd0`uaTl=Wdty0<3W27mUPWn1HbGrb(UeF~31c*)r?4V75F|OFDNdZwe8N0b zrFJM*s!9l(D={Z6LBU`QP$CTj1Z||u1OP^gU{O8<6EH%n30MLYK$wb%O)kR4aYR!bWI2LHL zI9O0d)1;!Yxin+>2#s8NUA5O4kH?X?`P}F>oi0Uk@pf-)?3S-LXBf-)dp6#`zvP$n zzNR&2;p@gNVe44let(k#=VM(9C32e~|LlXz#YE1LMm-ytDV=e0k&b)7bD@ z=hXODKb^7tT)BMcKqL3~)^+P{FYCJ88~<)%V9o5+i>;4MdsA~$(sh4HX)90WK7T#& O>vK74_+u4M@Awb%llwP`AAr(TRg8~i^$=m>;RYHM;2`FrpSP&&P{Ps}T{_W)onR4`I z-n@B6EW`4j5yniGh&wMU(fSHocalGK#}rwMPtK*qN`+D#-|duhVx;jx9;jsh*qYRqDUp^Y?%S z15Zd37#HpNg|1abX}|VB&u70?CE)EIn5?-v^B3aP6ZiJUG23=6-FBp^sjnn7*30Q74Ba pg<6*6A6b^1`96#QiZ^95@B;2xT06h~73lx~002ovPDHLkV1m^n(U$-K literal 1390 zcmaJ=eM}o=7{7^gh#Bid!d!^C9fY~C>s@>Ox*G*bua%k=SShp77Vc2S4H6K807y2r*v(W!)_N#uhJgj*_TD>f3aiBuXCCW_@ z_eDT63_u`uwtorBFf40VI2h7G{;ixKM~on?W7H!GLStB2g{}ah6>4}BYz{}A#Es-I zfrmvW@r2b+`xQ5A30EgnSf8i~3W-*M6^V*+yiDhife6$9u1DIUF-~_9^L9D3Pm3u6 zpI6aZox}pEkiQOh%PPd}MiVK}G>zL?BNTzTiIIS?88_2r6JxSU ztY~35il;4tCb>g%5{T?V6cNSmUosqxE#?YkjnaWanT#|QiKIiD*N$lc_&<$hwPV3f z1yTVRlRH!al|(AafKmGH?kKH@*l@LK7}W)|@v_hnflzl&JQU9p^7g+P_6vH1HGGn zBhJ>JiGEP*@7w-qp5Z{?l|oj%^2KXK!zJUQedyPx9{J?$Z@v2GKWZ~Oa*m(5<*J|U zKe!)^J#?8l)?NKsZIj_b;XdeH*LWaOP-^nx_s#LPL|NAw`lSh9@G#uI3Gjc+>c=W`7oPHkKJ_oc$( z-L3bE8+VW8-6KuL^XSRispRatdUtQvzGq&LA6WV3#F`daS~>FX!J98#yIj&$HCtQQ z7jG^;&*^j0AK>uxxh>44Ck19_`?ZSq_x^OMH?c1CUY4FLxc>XebGgq>L(=^88@FZG z%a6aFShfEv`1}rrw%kn33>KumnHtQWn;0L=-?6E?7t6wid$RHmzg0AV PN`U!1HT?0a#$Epb%nSD7 diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_6.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_6.png index 29cadd14eb86d70e7731057ce93d2ead1de6f545..d1e4f0af4918ad9bb105ece349490e00c10ecbce 100644 GIT binary patch delta 458 zcmV;*0X6>h3fKdX7=Hl(0002`twPcO00Ey#L_t(|oaK?RZqrZ{hQE8`HmQVgh7L?k zc9uK=czwZW~EF`H(v-sDoADRIeUd(q|A7cPMPM>tgJeMSW z(7jsg-rvpo`G>%gK>$($lRC7h)u0W>+T_#hqY~u zf^}c@^g+jk)_h1(tW8PvicQH`$ioPr-fFsrf93;C0NL!3UH||907*qoM6N<$g2|EE Apa1{> literal 1397 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 KMNUMnLSTY<#inQg literal 1291 zcmaJ>U1%It6rOF`CZ>sKmBb2?VImr9X6JW*X2_;ab~a{dHeI$`8mQRZow<_?*_|0@ zCfVJ9ajnI+R&32fEr|LQ3AAWM>4OqAM#Me@T7xfEXpxA8hS~%yVuu#J+C4s~{o+Ip_kskjom5Scni6yCPb9 zVv4{kD(+~6sFE5?B=M+eLp8Yz zkV9M5#FX5-;STL0#E9!!B1Pr%d4HbsoAxlp2!cS-EXA@U(jc9p;erBbIPEnHGISJM zw_M#caL*#hm}72)KxC^?Zd{HK=)|w;su=2xGCds4bHRYb zFtMn_g@dvr1bPBdJ{k)JYc{sR@*GQtB_S4yNt}lb2l<#R^$1L`mzH>esbS-W;{rp0 zHNQIYyMdJ-h!vwY1g>ePO*307g5-$ln$C!6;VkE;@s0#gbiU>Vx_I8=LW zGly4FEb3cOV0evIS*VdLPX|c=c$yS~fdP1Vi)&9G?e@(reh|NTd!haAxc2DZYj(pO7e4aq z?JF4m8!Ki$^{uqrTGuXMt4)Q|XBs|hnc0;*T`%uyTGugy0-lB$sd>aq0HPL zH>vICe9s==pKU7cCF{Q4CeOCs*>kmR9%9-0v$4`js-=|OUTVYMK3jV1_3j1i`RO70 zp|?&wUjIGw#XV*zJXG#nncDmCwi}0!zx(r3|15vBWBsq4M{ZmSYUE4LNS7xMV0~Xs zw$7_3CXckPUhX8u$ELLDH;>N0_Tj&6Pu#Ui-_EYRht*;9tgqBD7n|~aPx07*{7KKy GvHt*X#JFMr diff --git a/assets/dolphin/external/L1_Furippa1_128x64/frame_9.png b/assets/dolphin/external/L1_Furippa1_128x64/frame_9.png index d192f2e344e7c9416b8b6c07fd5e249c99248ab9..77d0198d0b61b6d6089e9e37ed97fc9ade9a18b9 100644 GIT binary patch delta 403 zcmV;E0c`%c3ZVm#7=Hl(0002`twPcO00C%8L_t(|oYj&sPQySDMW2nM1PO@<8VV#R zC@3lE%uzT75=DFixB*w7q>DQ`L`i4UQ6S==NO2U$pJI2`ac;miyL#F`^XKnIqQ7GP z57=byeXw_RxeX$*7$rT?nKsIiE%d2Lo$9ay?PU5Y%>zJBZGS4YlK>8vD@mGq5HnAH z0M0w77cT(g4$Mm6cVsq(`jn*d-fCQP1W@HB$!U6H$M6i0l$*>z3DEHB8>^8deVnE< zZ_GVz66aRK)jW=@XkEKQWnke>gUS^rK5+XG10%C2e`qz6r1fl7xVGX8AW7c5q~!#F z{W~vRh6iw|Mt@67Mv*sWN%{X7n?u@=hhL2cr2((Csl#-Zhm8U|HWb-~&7POc`!YfKzf6rKf&1cT*=LZG%x2Q^}y_r7Lih25Q{tg;lBHN`|DcW3Uv2=j1uRu&p< z)3ouCV$)WljZvd9tu~EK>`Ht@NNLhotTm>sKOixsO^r1gYLx`VcD)NM_6O-?X70Ub z&UemtUh`^4`{s)B+HwrTDx$4Y9IZRh(_B`J-dD=@#?VsZM7o?#Q*{P_4Y8nNCLtcx zK@W^WpbS2L8a85B@lGw#<#ff`MA_6Skk_Fyx`ogf*4UJ>fZPWiJPCU=BS6f4HBR7~ z5+JsEVob~m!(Od*$cCLm?Fo6PPZkuS=~28fBO(JjbO4^w`;C;C2@s2RMYPY0X#!tV zary$p5~;3O2Oc(Ui2Ep(lo^J>eF6m)z$JMV$PeQj!?84rZXe0|M2;6(0bjldZ`qejXBh71dS zHRN|08@w%64BHSmrkya&{z4OU^qP*D>NPE#<0%GzFa~7J$V(dX6sRHCA@M=>Xy0`Nl+M8fsH78 zRKYLvGRZ5vO3JERB?Uk5kbZ?10OZ{e3Vwn{6zP1|+|oq_5o*o+c4aKkVP&wOfu_ku zV{>fHkt7}`#LFUqT<+Yr`;Dm!wYxWY z4>ryPuUNtCp{zbVs!zWQoB#Owm5uwF-n?4b+B|yX-V6KAM8DUbq23ri!Jnren)&g- zt{I|X&-}Ie^VcW8xnAZPtK1{KTy=4iH2(QVu3ysItIia6PlKoE`xcCB_H@am*PCaV z;gX-<`RahP}+0jX|?1gn_jzR>#4VglXT@s?u*Z|H#YxMUDTg@O_LU$ zUB7)kHhLL!2j}Pb59=mhyysZaUv)=&e?7boo4a%OTI`96aIUy=>RRCb@#kibbN^mC z+^=6=`15Sth-<^fB9?HU4Nn-IRYfD^zrXk8p=$c%<2zi~hJ&vCo!L2<|CvQ2?b0Wq H?w$VuqvX<8 diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_0.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_0.png index 8b8dc80bce09adfd26988d9021687d77b536961a..ed6f4a71f529bb5376546faa292e965a98103f33 100644 GIT binary patch delta 641 zcmV-{0)G9V3XTPk7=Hl(0002`twPcO00LD>L_t(|oQ0G>XcJK!$3ORS>Q$>buwVzJ zZxIVF9Saq5qDb8`2s+so9CUN6Am(U=Iyfkf4pl+uAkx7>2YZ*Qt2h=S%?VbDw8^!E zCT%Y7=WuBZvEXldeE9O-_xJB1rXby+uspg$f$jxvFK~K+-G2+{1?s;FD?KH>3iVgv z10CT(ceJA|JV@bq0G~TRHUPK>tw$+{0r=#5QUeqwO0}BAO7AdG)R3os(g#HnLioeS zL9Tg#)Sm_dIca1|jk1V>VHgU_lhp+d=Rv^=awcfzYxZ~R1}KOj;~IyEy~&RCyY+_+ z{eE)*6u$w;zJGF(aK{G4$K|4in(NjV%RVTkyxg+Kj^&)^P3rV=cv`$c=gLxf+5;Pg zN5w>Bo<0B7&LwT7eRl3axDPCZ)?;bKr034&V-U5Zd z9>7oP#6Akk=j)eol+3)z`wE+cLSkLP<5gQ;r1@zbSh56TMF3~w)pfTb_sdf1P zAgf1AC4FUgOOk@rXsEG**g)kdfJ$cX?4;I5(~>biv!+q78^!6+UD~+%1jSaCMFf;8 zT^||8rg|SD5)ZtompTEFtckPLKujX b{&(>QyJ8ilcY#he00000NkvXXu0mjf(U>ZP delta 1305 zcmV+!1?KvW1)vI$7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000EiNkl! z9vlzwsRa1aLAChG-i`h5a7r0cT|980rK&1 zwUXT*8Mph`eZ4FU5kOPybzQGec!l*&!|Zn*r2HqzmnMLv{I|h6?0VfJbH>BT@zy!6 zB0(w#_=@roRDT7t_J=5!J!cQYIe-N=i;=^aWi_Zb@X+30|CW2JpR?xl5GKGA){n}! z#<32Nnb1l(QrT_pF*}K-zYxL(gIr94O7|=k=DBPy?pN6s8D<$7Ed;cToq-;~yg7TG z3$?Od#lUpgJrb~uj79)0o-t%r^ums`oSuyKTC23)0e_=P*5qUfq7i{j0%{VtvJz+y zSi7zvsyq}-#b|keyw1e5DqtnhgV!umljV7W$QmNnZ+WJ64kp<`Ng$f=>^j*s;BHHBNA zp&c8UCx3e%3)fAW%}T^Zk}6H!j4|zajo4c5peZiW+s}FkCa8S?ZK2tPdnIN28S9Yb zyq3~sGf0lJO3o4G&jz&$nBBHqgsB1A)pbsbgy z%ULXj1E8YXa=p zY-;=SnaZN)1+x8uEa>k9GO(lKOBr8RHU!Kp5r+uC%=$IgCa?8cwb6XQgSIausnhOn z|84K_);+tDcr*k=mF8u`J0w*edhs9iFig)oOaR3CGA&-DsWMaHy{?`d(`$ff*00I2 zuz#Xbpm+c;OCH&T){D1#=d*k1mc{l$q2{VbyjYJ^8PJ{uFu{uF3^_fQ-J(YTMEOz% zQXw$Nuw5C*ssOU_)siLMy#|I=BFgW1nhdrg0BR*su&R_E2`mMn*6-y*^>ZnYLAq_e z9lT3x)Pj6A;ML?>cMny5&&^x&jbIB8uz$PqE0A2kt9UF$T7S2e@68j%7JUG#irA49 zo(Dk2MLK}(|0B;O5IjPF+2z^_Wb1e|$LW=}%p71T0luL43h(giUM&*HaaNze>U+qs zqa>J~1lGh!F8IyJR4H};+I8(bv^lH}WOhvzQ#?R6ji0(HW0@!Yx9U81g%q$=^zSSF$`?kUa zI!87fq(cDW);u80w&u;qV*;_vXo%2&?kO7%D362dLQ(Xp0gu5MYi5*7Ps&H<$dG{g zn?VQ=m!Cbzrz(sUZ6}w_ z!jpTNF*m&mU|AX4`VVx_e>rre@}rpD6nZ1hFNgj(w)*AJsP!NBKaPJIRT8Lu=szce P00000NkvXXu0mjfpPO-3 diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_1.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_1.png index 956de6170702e0c83ae51952e3083152f555c3e2..f2dba5e872aef3e103459098666b5ef1327b137d 100644 GIT binary patch delta 645 zcmV;00($+H3X%no7=Hl(0002`twPcO00LP_L_t(|oQ0IZOH@%5#((enMklG}VFZ$C zPY5xRh&Hv5oWg}m|9}wNxoei~-m}`Zap@{&UywnRL^)3*C&gP%-PZ;d&x3Tk5PCYLQqMx=on&AzI0^9f z{*7b|Z0NltfM0!=w*s(hRti2oNpEKA-df=DHQT`0Mt(0WQ@hWT3op+`&L4oJL^f+oCNn z6f=axS$-fj@?!|YVdObwfGc>{= delta 1295 zcmV+q1@QWk1(phs7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000EYNklH{hiny+;0j4>40RJH- zx$nDO*M*qsU@;&BXzh^Tt$-1rwL^k80!o0^4hh}{H~|jcg?}joI9}jAI3D2Rm_~r( z1>S)_PYduSP(oK5U&y&iav(Z^<^n(3C9Ldgr!zS@z#v9L+)m1G?GT`ZED3f~ertyS zWkgA^qw-q=B!SZA=|=kj?YQ}aq6g@Tr9b`pm*9DUoef~v14x_tn&M}opCu<3nn*(g zctZJ+`74LR=YP+JE^U0)`l;fj`}y}(Olt%o-CmSj+Bi!N?LfQyE8TZwEsYqXNE2YS z^&{rCWR4to^suE|AgUzG(j{3@AHx}BLUh6$hf!Yd^L;ww9Qh)ia9RdtNBY{SQ9WB3O>lZ_I$|pE9 z5=7yZi*y}p4sVQy5&>qhR;Pp5(1+8tK<@80z}-eb|BgKrditR z=6{I>P6DfrkHmlJb2LOm0r3D{&l;f+UP_@lj?uNFeS6IV(0;&Z?l1%J5P(nw;y_j; zh1{k0wJfC~5=VZm;sv(r1MFJ*NoAh|YYg`Sk-ch)rAn`Ok*)dwvs~f~Qh6lM6qnhb zme_fgpV{v=1enlPuPS_Z8Ib>scBhKlF0dIgzwvxn*b zMU1()aEK@ZtWE+wR9!WnBhxar@JI-Fx?V@ZO49geD=+Y%RUDD|Ei5I#FDag4w3OrF zM1$4n+M*F;A>)d7Ede7K^#qzSrFid!fDtlGA;3tFzmG*VfhrG3qKLG9`FJYRh<_#X zv#suL==E?985W|;Kh4eV6n4CdCsN;|O2IS%ke1~Mn|-dZo1#0c=K~#*a-$E?DkK;V z0h*A}g}tX`)_qw#=>?);!iw+G7;Bvj%8j7Tx(qx)M-{bN!H9=368f2Pi_Wx=qhq0e zGspvf92%LAAI5}&(*5W#kpw3!2&HP)JgVkN<6tPOuX9C5%i z8%ZZ$_!mp7fP?+8)$8HMn%Cp}<D%PDHLk FV1hL+T($rJ diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_10.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_10.png index 93fdaa076741a409d4afa32fcb97e52783210847..bd6291f994b32a665a60df60dbe13c29efb940ec 100644 GIT binary patch delta 665 zcmV;K0%rZR3Z(^*7=Hl(0002`twPcO00L}DL_t(|oOP2;YZFlvhM&2eHq#&&3qsJ^ zrXZpqC~n+{8KnzxA^in4?pz4%QV{7Vf(sWdxN#%)2MBJ&4-hk`pn_ukq7_>@#iAl= zQne;EnR#8@X`3LP)#2fs_nvd#dmWJ&TEc*1vqj2bseh@TlC)ml5j4{ld`tZ5 zDrgG>6l_|E{#%i=X)gSyBA#dg4{?IpBDkyI%;DU`R2B>@ct9Nb^Hbjjz<>glJpC$w zb_E!Spt{n#jVPGi?PDN>h~=e;(&(M8Lb^+)TEjy@=O_l9g(rI+abRG$>O`QVzF*@X z9_#tXM)BHX8GrZ#^uj>4S)AI7fy7SMeRTRv$!po=+0~KcBpC4QzQ6MamqTz#1_J(PVGSV8ttySA0&vj~*b~b)z1pV1Ka-3WHkQ}=#?c5%b0UlbH$6Rx>3X+N{s$U5Q+0rj0 zDJcqQ_Km#@t=WlBf28wE=bq&4DNQ?j{oCdo>%f`psV=AQW5%x6IqV&=6{jpXbjjV0 z0pjZ@1b>G1<*ml2I?ACEnIVG#4n!AHJL$$CCwdTjUaA`)1&PSi6ptO(bX+!YqQN~N zi6dN`l0Eqbqp%JF*3 z>W5lu!J|po4(jb1u_}pLH5{t#8jc@n9sC8kUJ^H5W22Fe00000NkvXXu0mjf(}+EK delta 1325 zcmV+|1=9MZ1+)r~7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000E$NkluIu{u@9c9`%1W)H%LDwI;AJG3m#A9?J;uRWGo!^^b9?fNcTG#m=6=A;AB@)*ESL zQC=Y1C%|i{?jwAj0NjSojkl0MvQUrpTIP!MA0(6#fQo@|kvp}At(K&%8U7AGKV`iZ zIe2~4TC4W5jDG;!VyYExNhC9t#*ug>aq(PpeoTalb(Iic)#g~M2yPs;VN%TYwt2bh z9zt^C;qT#?ED6$O;BLy-WKbIke;}~?jd%x5u@>cX@~Cxs(Vhf$xKBxzwh@^uy82n7 zvM>oUiD8NWmRMS`S)MH065AuCofH~0@1U)llId9+tbbU%Xz>7WA>G|SE}mC=9L?IW zGN>_dotza@kj7v+ULuvZf}echfs5r;vhimwfrJ@52Bjd$Yr#B4GN$Nrx19yNvF}f{ zWwEkhb`F8P!@S0M2&njZ&ALVpKHmwn0*5uMXsUCl#IU(I0V3?Lu#fxrL<~Loj57hOLDCJ0FF$R2IlqvT3N%nMry2tU5LZQ zZD{dYBS@=Gyv?9WxCs#Lcv)mX?3zSEg<}#}?!kCc`C~Lx0dO;{SuZE2s-&wX6He~5 zQf*h|kI_^GaEy;WU}fB^+GLIdR&dIf@+nG&Hh)IL`D$1KR0(K-r2N$tL+eYSUG3N% zFe?Bm5u~h`3X72tKvf9dW)Z|`1Sz0A85iC(Prx;kIPzExD3eS49090Stn_&$ETtjk zEjSCNK3hYC6+iRE5RYQ3ss|`fvTBKh@cJB2MIed?MMzF5QxhRV0r1 zT7QN-TM_^#SX{it?N-HcWP*gqkYJk}!0O_0tGTMzV1cFSV}(cg zToOu=!2A47(@9wUIH_=*O{lz*pf zW;ZM+gmc`4Rq@P8@wb)m4V#hjTPGBqOw;g*y@%m!bGIpwB}PKA%IJ?wB|@A zo;_J9Sd@u-`IX&FPtQPGL(6{{A%7`2vKgKSj)ol1S|C=2la9GtzZe1$ZS-_x*jab{ z6guYK{y6xc7b*cFO$m5!XOdVs*H@tuAd|?gQoa{oCv diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_11.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_11.png index a4e194825e119a0b5b363a40ac793e3aa39aa511..e4a6d1639dcac25a86ff537e56dd863c50d89d94 100644 GIT binary patch delta 611 zcmV-p0-XKK3Gf7v7=Hl(0002`twPcO00K8jL_t(|oQ0D=Xj4%X#(%l*)dt$=LlDwI z^1u!q3hmYol|=l9Q#*-ccR_ShQ1b?ND}t+~I4B5K5TqjJp$ogOV8?*KGS`G{((eVPS9@OW+V9x|N9<{I@nh`KG?k~Aq00x}vPJe)&;*Ikp1|B{vCI{!gP3?bWEA&4t*ER!ONPvgKcH?pL?*0f}`orON zGXP0a&1SS*T|Lp3VnrFBl@}YMdvBQmTFXZ-1i3h+S+ZF@|GYZ!x)`Sv0a6!_Oe#%6 zpi^hxZinB~zqZ!=VFSDiy)@A0e7#x50Jm8Rz*{&x2Y<1t{c;Xchqi*TOEHLK^V)K5 zaAhN|5@DeaacwYetO;Oly=Q0FF6E zZ32*8ZyfV6z!U(9`5$V8xX5TTo?4>WN@7R^)MIdZY~T?{72Q)SFPnL`=KPd_G-aY3 z%ri8a!d!r>ycgGTg1*22O8)kJ6fQDiat0Uc;(=|KaW#vgcGcE1CDkQWB&3rit3s*c x)K{`?6>9&0fz*GyZD0V~vF`?wM6h==e*p?oOB;acD?I=J002ovPDHLkV1kpi4_W{K delta 1220 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 JPDHLkV1iH=4g~-J diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_13.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_13.png index a745cdb03f1a04bc1638c7f76415ea14c0e5d35c..ef2875aefc3e8e6290f9203a93faf8c16d853055 100644 GIT binary patch delta 578 zcmV-I0=@l!3C{$O7=Hl(0002`twPcO00I_CL_t(|oQ2anZxcZjhT(T78*Btb3lbs? z@=8#o3!(`HU?Xu!gX9`S2ptuqr1SI?`~>_DFcMM_6kedAK~5s1AaSu>B}5pTn_^q* z`6zZx98-A8XU?3NIdcZ-u|@~d);{n=>@zY97{%Dn>n?h+(3a`9?XyiQtE*IiJQlk_MjNe225H7(TF(p?yR=>xny5xKj7 z)NiY*oL)9d-+y)`15*JZu<<=?`=d|!wNd=U5CUM@W}ojXp|RDKJrH#`{{2$5Z? zmckT@0P~wG?o0x`2)HP1u$@3HP5Y!9;RAYb9{Q&- zc$Q8A#j~>k2JTQnpk*>egMnEZ#A#a{#DK3-&>iNr22l1#7^0}coGBQ5oKFC5(7@L+ ziU(V+lRK-cBdIANU8p-%>my(NV}77&dk6-O>~&!Bwuf*dU1=ao4FCSjUtG^K^IPN9 Qx&QzG07*qoM6N<$f=Sf^r~m)} delta 1143 zcmV--1c>|31b_*U7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000CsNklpsEKOU3AFd^LTDDyF&;vc_G`x3b&y;vV2KlUAe;cB=C2e!cU|Ve zk5&-Q4=rRxcaRnXtQLOu7~hH%7mx)`dn6%eY9BXu^;jsJ09mGA@~u)ZnuW2t$yGu< z1k5DSGy(deu*Hpsk(CBQ-->;HIB5Ftft8$C<}l6~Z3WU|0Ic(8S^Nt2Yhm37bbs1CV<}~}b^Am- z9gGef%+%TOBH{z8k;7>!cE3a#t(Hfg?R_*%KtF8w;OqEW5{UHBtk-RLkp5^`wk9&zqR|7uqjxh`-+<1aa1MHicE{)wMdlkE#1V3K=Bv?c!e3QU7XP1b=dXN zYiu5A{+T_NC%_3+J}TX#(npCD9H?(5!5V}XB?&;KT{|#a&#HA6Q6Gh5#pM zdL%UdU;2Il^_c}*37{1^)_8*VW)jF+(bIzKB7d&JG6Ha|QZ1yzT4gyR2w@dIr~RI_ zq!YlKs*Ib28(rxtq=U8!LMwb~ym2lM3DOA=p(W#3T>7J_$44Q{ExJ3Xag$tiWn?N8@|=np>AfNL--^n`63L`V`B# zEPtg??KoLm#MX+rCC-#vz};Im2-IS>!?qikP%x{&nQ3c735#{g27wYH8XCL76>wk; zV+3?36u2Pw*g}v-@F$UCHrS(tiTQiU1(fdvX#DbN=HF6`iO^)O0y=|bg`n2X(&$V` zjUP>ZAC(Ha9}kysh0Z@W&|&F-VnO6A34dG!kQQpiN#Ee4>7pj}LK z3dprsBN5Sz!QgHBSguX^pFtLkrYize|KJUEAh9ft8heHWtF&Ju1XvA>TAP&w(i)~MfN)gF z!zQ$reYr6(%vu}^qM9&O=AO<1xT+S0C;?Cfl2wA(8DnJ3?G6IR;zI}YKQjW#NUh$I z4OkFX3WmPv8@haNKxi)jrXaJhX#Y+9dJvDZsI~s1V6e_vR15d=c?_pyUgB&Kf(S2tsqp~WYmT3(iWkDA4x%MErdjEaaw2Y z>tZG}jTF!7@Nmw1KJK|lk2PpW>-&HsVwV9kU>E|Oay1ksRarFT%3wL*fZVFtp3X33_OjTh79Ju0RYX`MvFbq7OV^q*i^gZ-pj! zJG%!2PM~E48EE69V5(8~Gf)LMyE<#nrC=unE=wzHq@bC}K8-?LKy%k#gOB`fTIEgX zje|i!w*r#Ny7{H7PG^(Pt3s0O`|EJDv+2BC0!fNx>wo$^z2Pj*$OVXV7R+R9o^Rm- zM0sH3?w#b>=@fh@0W7Z^yFHp}Tu@w>4f5Q$Cj%s}04UQr;bDOF2*8;?-rG()y_l_N zWa{T6208r`y7JIHgTV>trJ#C#+{3_q77(aLzG^TqPMbJ8t3w!YRrjL4ZeRcve)v8L z7nm>=gGY;X@xUf+T-8vVtlM6(rJkfU3F%VHs?i$w>L1IA8r?oHa3o~F42)q1?%hCv c7z%yx7tdHhg0WVg8~^|S07*qoM6N<$f}wpB^Z)<= delta 1153 zcmV-{1b+M51d0ie7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000C$NklJTLyc{VyfP^~=?5+=tkt}LU=2#IdA;7m_bX0`Uoi@X=BjDR|0k1usoDXnvfDo)C z=;nNYLx3=}BN6`KyD{XH@YhPj!7;jgmn!6 z00ji73jI=YB_*RfqcWj(6X0GHwYZT4Rc&CLTv4B|0)MyrBhJI$t%xFK0?Z7;pL2`O z&geUY*4x>*D#&pB_*pj01eh6QFw0#&md`jM~}MHCfJ|CAQi3;=CFrU~~qT+;Sq+NFHtu{PPNw zzZ#Y~R(}UVQ6$hD37V+!gjR4K33I?&-f>amX`yHh!KrQGv`~{$r*{_HUx+| zGkbS&PQ%wx*GoTB^GNf1Y-~?}r&T@;W>wFue3VGRVOCvfauEtG2|zjhsRYogXGqs* zjsUGQBe_Hy0_?EUGod;Er3XxApIPuI0klr18h=mtyOjj;NV*zuZRAy0MgXo?u7z~7 zRz;2sLRg*8?f%GG$_WrHRYoJRp(~FH=|)=}p>_Ujym77w36?w-?giy=uKeN1mK|oR zjs-ji0AEc+ZEceTV$1{){5Sr03YkvQ?mUSgUP8|1_Y$(D6r8bJs}d{R+~FETvvp~l z#D57znVrbgw}UfakwUfORGCPvl{%KVP;LSD-L^@f7M5Mq36xW)sKAA3OG63IGk(@G z36zl0(0Cf0fP*!R5%@TnflG3?6@oO5--#67WN+q7>b#eZfcCur&AGf=__v5L89SL% zKs{I{1Oe=|qbngbel+!cRw)>MJzTtkAWaI!XVW)y`QCukUH~pZys+&4Q~Je_t^-7!QR&cg4E&E@R?mE) TTIo+I00000NkvXXu0mjf=DZHX diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_15.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_15.png index 2f50fb8c94926ecfcae5a58014f61be647119b4f..1bb46d54a1b9454e1f6e5bf9ae91acc2b967cd7e 100644 GIT binary patch delta 606 zcmV-k0-^o63F`!q7=Hl(0002`twPcO00J^eL_t(|oNbdmYZOrwhM&1R$!=6|2?#+X zJEDb^Q5zd^SFo^>{DQc4DFjp6$X>EX_Ur3rWaJ^=OP=ZPu<;LVT6yEw_Z8*gN$a>GU3ap2lx|11VbU!V|} zzBJ)-d`nOjH7QRU3~(iSl%JC^4DzCdw35H65sPFqQQlM9x}~+WZQyo~_du3L_-Z0` z_tfs}DOZ-XDH-tB3Gq1&OuCKDQ8bnM%Cyl_ZicRh3NOh}YA`I(XZ6%h2apF07*qoM6N<$f`jQD0{{R3 delta 1201 zcmV;i1Wx&DY>d5ICPmJ*1bdkZZka>ZHcm_ z^+bRw0>SGu`+%Q~Aa95TfSVCr{liiA=z0davT;`6p?G-B8}0;vi_b3oW(9eizwab~ z-!1DJrH*h;Zz~WM1H7s3Z_VdD-V}=T`w*uWpv358kALp*Qa%;Wcw1I?0z@))NAwPr zfrC0ttb^SGHwXTlfoTGCfkwjN^6#54B7w#wXspJL6xAF9P`(LY=Y)ECITr?Z8k3Cg z9qrAo`h=MP9u+T*pw)xORbR{z0nfvYA>AXvJqv&=U+IQ<=D-nT;*>U;TXXU$YbiC^ zR)`Ri1%FWa?<`ZZ%E&8Ya>^T-fB5(KGlx-zpdliKurzQ-At(YPIW)?W?%}L}lr>Oe z&Fpz-9l-nKzJX938vm~$-fHl83PB1)kq^d7yU6{xcLH%uUiuz^nHoO^RKDeYYK+;n zJjMc86w9@RXCW!eY9+MyQ*uD1uUM$^1i&@;et!)|!P!NWoiT~kdT=O702m36lsl@! zbKkST^$I$yR-!+H3GY=oEE5B0O*}3&d(|2=z#G4!2#+eF$6B^pfYC{ps$Mg5ba;?M z3OxIql$l;#gO~5`NV5Q=g;s9(aF9-)l-g+&$CZjb>jB{eSZ!ETE&fm^AN~oiOK}Va zj(=(TGn)A)M7T(H_AQP9S;qTPFGu_cqUtvbRGC?3lL_x>ff|~b^j96VNK2n#Y1v z0&tPNx9^XvpW`{a$EEg0JCEhwv_ep8y4I#NhBTIDytiV;6)gYraLuBmF-G@TDrH(k zoYrcvl3*zfq?$KcNQ;{tJ43-*v+Us}X3|YGzoL%W!)iz^j3CkPFur zLOe)tPJb>+{YuzTWXP^9vzInR^ia3n7} P00000NkvXXu0mjft|Kj* diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_16.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_16.png index fc7b76696c1140ed9f17af4fcccc840e8a07b32b..76ebd1f395f76afb16239f9ec4fa1f830bad86a8 100644 GIT binary patch delta 567 zcmV-70?7S_3B&}D7=Hl(0002`twPcO00Ik1L_t(|oQ0FWYg17a$3O4p6`!_+Cn(fG z^2QE=Zg#LX;Ez>DHyz#V=wu$^AE3CnHG`vIH!TRc>Y##{R*Do9@`6JeL=&}=G<~^W zhnL1@I^>KWKKGo%x#u9QC?818|9~e_pIjI)i~;Weh{piq27jfAMl{g~CmIt$BNzjU z$3Qav#2!dm0$>m|0FXr0Z5>z$P?O6_j7F3CV2Y$FEG4s$q&v4piS8g*K< z33RrHMu1LMb7kGdm_i72hB>+q*L;?NGYeF}Ff)IsKh(7jNd2~|D(X#hWw$07D1=17 z&P>JK%zx#_?|;c3yAML3)m?A<`4LXV!IytC6_}EJK3a~12=9@WN5)k^@%0T#_yD^W zp!n(D`}>(u12``&YYrdK?Mtr!*kA_(ytd&SM1fY*1Owb*Ee3-Z0Z5YDybQCg7FVui zAeAfYM{Ao8-(&z%90Z3`@90ccwg)hE_lW5aJKX~CUVkuHT*z`PC@srv-YUPV$p;26 z0eE6J-Uh1%X!ZbD+Ug#UFu*wgyvi|kEj}{(l}*X(?FAUTm`(;RoSuFRQbP~4SC%V2 z{aR?rz#Iu_2`Zd8HH!gXEE-*=njx~|q*YXPQ;#r%md z(j8wycpg8I#_s!W_kI5rLUBH!0_c>}6$Q?w zBEZL4B7lkl=TZ^i<17&Y&@as@DH$zr+-TfPaW`M)M#i&ze<0$7kdZX*mE^ z6I&htp0^t*ljml?bp~U{XN|!X@z=qq;b67ShR@dgA=DydY}Q(?ja>`ciyYVb(=a7t zl1V)q?0{N3qOhFopEGluvj45xAyXq8t}FcI^qg zS^!x~kbhMK-0vReM=r0AX$8+daP+K#PVl_ZWz>XdFL@eXCRRCJ2k72YQ zi><#JTPLDjPAoRGW3WsB+$M<@Df`XbdDQN4XnzNvS`M`5N#AKn7r<vDO;9Zio3t+ZN*ag?o8wH|G93{po2pco6=(Y(!3OJ#AT@QUF~h1P&)6+%1hw{@8Lb7@{@TRO685R@MqArD zfwOh&SK-!iZQb8LV|JHq2F-3@K%N@@C4aE+Ol9&NtW(H!Jp1uh5rn=JNjpm7Z6YzWovrlJc)Xb#|s2+EUw^=bYy}T%BB@cx2m2!9yPp!na65P;8gBLGQt zNm5t8CCLB*03OL;4KL~p6)m>^)ny~+j$tE(*6`?y=`n~?csy7{x>t3(YRe6#`SjCV zxZidu1nMg(_z-XGcanWn6%?c!)9x9ps>;WC=}EnJTXekU(&xcoi;xL`6J@Oc`msD? z3d&1gw6`o74u4K$e*wH1i|lH>*|%5WaC6&xu>z8m$bVM!^TC!^ot6)fWGtA;#5~`@ z2k2yhk=wVr&rUjccMf26?a0khSL3{rifokS+8r67y97Xi=CJ?+Y<2*=`J?S!H|d3R zMI%$+Co#xtq;UD6e+q*a(RNTeJ04)*E(-`$CR;KX7^gu}bV&y=;HwgJdUYcMDEBQ4 zQM|x}DM%W8tWN;8+rU>DCEZQi&ezqJv>_o~tXtLUeZTtqLRYm`4-6cN=?ep6SmJ)j dkwC5oe*k)PH_BvgkLCaX002ovPDHLkV1k@N799Wp delta 1152 zcmV-`1b_S71c?cd7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000C#NklV=(?^yA{^8QlmIsl3HCt>0f-I>c0n2eh<^?Vc0eit4(cPF0LKc{ z#<2h|2c!-#!fge1uMf1AEV>uuSP?8Cz_*|kRD{r#lwp|*__kPJc0ZMbPjq5{5WFO) zCVZkpfH15is3?4*Lx9)ggJ=i;4c5^FK73V8h(g;}-Vr4IuDTYW(6a*7_Z=d@z1g>GyjIq&Qu39sO)1zyvL_C> zwQhWk-11elgee3-Z_;XEr0c33dL@K|Kz_JS2|s&`**U7a$Mhf&32mOyL1&rYHptZq zVHM3kQSlhS6I^LkxZRQYyu~yDcm}YV-BR7*2`$sKKYwyQ{IeNW#7zLLN z_U;35tJo^nn)+xMDn+btJ6TV&d)J_ZF9o*fvpA224bTdM2X&S%D0d6m9Q^ePq(2&l z9IFDMdVeIaxCD#Uc%oKtZV8)!H@(xW#?ytO(uJTXGA%~bB1yvcw388m;x+_`3Nxce zAqkCN*Smi7x;M{g{+T_NC&1HHJ`1F*M@k<@q|hK`SC&|$hmr*73H_-6aJHT?y2j!H ztip`M5@iUmgQg>4@&BV6Or-Zbc$5HEq4ye3{C~5V1ez)7TA;O&S78|ev|hOtqr+Nd zIS_>K3SZOy$Xe0~5KUFuP4bPdbQPn6_6ou(d}+LPt_TUz34qX&b}TLZ(a452vsrF| z&q1VT6Vbhv2?9B!f(ZZ4f8PUANLI}o5oDH-()_c8ELjRhXlqtr#hW`?gGgGJMMzqq z2!Gj$ggzaNfTt8{9Vcsxy|wn-l4i<1&^}u>2(-eZMU~JKO3x~2X4=zG;`6lcl?(z$ zKr}R-hE~AgHH;SAok-Av+-(a%7QydCirHXK5@yfek6b|cUVz0f?`Hlz#TbMpYZcHL zEGq;N?WNI~7&U$@`8_HXgghRu;Rs!SaDU{6rvusxB4&UhHK4t+2WYOL{np zmmZ4&BqCTBgH8dp7Aq2nW=s#!rjO^^l>ZszL2J4YkopI2fVV11l=xtX1tXT;Idc0I z8Sf2nm!`8y!4~0Wq=MR*8BHPUKBMz{$I(jAErv0`OhDpUoHX_f307&pMF_kah!~JlcO!zZl?kfT%Ds1$x}T|M&%}e{-0N S10<6G0000|e06G89%+B(#{UiQ#wf53Ee=+(b$2#7c<8qf;WugK8Jv?i`BQeQ#$>j8kpC zoOABkox3LDyx1dGKGG=E_E5Y)hE2yTFtwAj)R zT&7J+AWJR%g9&7ScZtGO%oN@Ml8Y7i)N(Wjeo$jzsZ;Qm;${w-NFu3{Bs~e=bZ*&9 zGxC2-2@Oh4V#SWm`YDqz<*tgSy!NBs5;`td=e=btN#0*17JHTU*olF4QI6TgeQ)zF z^phmXPY%aX=znxSJBvd7kNRr_&bNVZ>17Tu+1t2?6uaek6oJOxtOL%>0%+epe_>`$ z>VA-0|DoGt8Gt{2wsxJ*R}0Ga+d-)AB}vU`^)jk%R$UcgY!|w^9|zo7`h hJ&2BjrUtMgfCt85*oVV{@{Rxi002ovPDHLkV1l;D%_{%^ delta 817 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 etD^G3ckve)%{@wWD3>h&0000HX1Cz(J9^jXw zlmOQYjA7-TT@P>=R##Ln0S>~Ba{48}A=q`7@^@B%6tCz)dLD2uiq6Co0VKt~@0+f0 zBq{nb!FC$RFab2>X9Ja~wL6^{yS?L34se?Ct7S+s`&ZQ%t1z7dXvk)^CCgJl)?E5H zR92TgGRAJ}e}A3<0_?DUYrNK)x`|oyk`&KTmF!lBwp0(Ws`AGzQ2KoaJjL_1W|P2@ zg^&_K8Ugx5R+oRPT&TAB65*;&J)XzOKpFvPEc`mWFvp)!%SXHbmBp34Ixk2K0Y6ds z*&&9?=RZfspnXO|LfI)G3oETb@?z-th!@b5Py3@DAb*QUAp-Do@6IDkg=O~d)$6i6 zB^pAs=h09C5kOP8dJ2&Ci}thRXdz1TDBfHk0w8P~l|k_n za)^!$C8GT__m7Yus%PWGc!f54Bd*+1?578RT))0WkZeC-^sx?$1T8NSq z7doQVl>FUyAjSzFhfe?jSw4+NO8_$DFx5QS0wh0D*7ZKN`Ih5 zo8G6twz7JOM5A*U4gnewtjSoLa6q+SQlusqs#S8|CSdn-^ecFF$<+#Q!Iv2$$|V;}Lskt?kKLdN#b4ZOwlje{&8UTf(jIRz#xQF zZ=hE?h=06_c@&7%AkjDib`KQ^b!1{60tvwAf&xjPKzqpBB95aSF*{DMtOMK*08Fgv zO2?sqr|1_Q$EJvurJswvuMO9qcY%&DH5G`prP(twZalucH5qf1~*j}cYSgUS|h|KC@wwW*p0qo=1?Xq=%Q}idAz_%YnfD$#Dt(%dt6=2BkYpp>l z=2f8L`z@ezUjsnokEIo`M<6^A0Vv@q;5Rx~o&?z9Kz{+>s3*&3BS40d3CYUM;H@z? z2Xco^1-SzHvYU&8yl377Yk@$X%nazqa#vCR9LM{Zy$^ULSybq21%mO~0&ws}KQS@v zI-c{Y9~elFRutyF5PhFc?vbPx?b}c^MiTg$Ur`F2Nc$<|$HlCyz0E&sh-|+r&nZsq z+K6q31zZ9zWk$g|=(rtffDvuP6lEfK`P+j&kglgFw3mHJ#JNzMHBUZNrxn2`z<9p0#99povGk1P67p~L|`!C)2C#7V>0jU50002ovPDHLkV1k~uA=dx^ delta 1214 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 delta 1681 zcmV;C25$N329*tv7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000I@Nkl}~)=lMN-&Y4*T!%hAc zZ|NCY)*X9)!6^M;oKXHQ{5OCmzO(Yj7~{2sjgB1I_1*DPcz=5`%{hBdz_`9^fWlPbTZuX`k-CDV;gzpAY?A^Z?wNwUIK6%twzBe+?+U zoZkA`17Dk&>&ZjULXuOXDW22wJWu6NBq7k_7h!`+unZ%5$oxPlUF{sab(TC5{fzNj za#;M|*&9gV9e-X`>6P0<=V@ysw`tvYjeZ1{AzORU!hyzLQ#_?-;azdVoPotCt8`0w z{2Aq`9f0<`bjWm0L~)i;M3qnB?NQ=wJ&*8*c>pRD7qFuA=;1{@i6mdU z2{^{rdVjs+wkejf>1WQbm4&qaQxt6>;*Gi<>xJ+D>(J@pOE-UwC=Vb(y5;mcDhD?f zG!XQyuq!39S!}HWq)l`@KxU&}%$MZb)JjY#G_RTk!~;m1ph8l?PAFfJ$2uG> ze00$@sLcB689{OY%9zjPLLqYiG!QOTqZvVWpMTdpfR^E}XOaoHuC-8vSV?|y_AHYhsxHs^Gr*63G0d5%17`>!SN=PI7ubxx; z&jfntB#<{f0F_}k_&&3H_Cl_O_ab1y6NECA=2i~!w(`4(%3i&>sPlPegtVS%nSWJ4 zzJIxs@mP{$2eh+^o*CkDyfSVk3ThCD_>EKmy4JU#?HwsYm)2_$vBoiaO^vDt;4&a_ z+6bhI2Z<`(_ipB$Y`E**q!?N8NZl}?RYg{ltRi2j45R{9Gk-5Xs5WtS;dWAq@B&tY zZ5cykpAZk=A$#EHPTGx1LTij^$#UoROMl-*&+tzf*y+GY%xEI033EazpH@!Zs%A7m zJb)DfI?p|1%cYY>pz%YO%N$uckQ_h~BC?*hkF}Pvl}kiug^E-m^Nk4(E)<9`uZ zFY!m^63{9ja~NajhNFc8F9e`!^$4gTMZ8a^t%gYiguYSc!O; z-FZmFLv5`BD6|@welOj8K40SPxo<9qmuy9iiSzdMN1yFde)jT0a)4df6#^<{X~Y1n zWHG`&18={n5P(Fb1Vr-ftVbDprGKKZ=0|fSz9zz}odaZ&pllAXqYBXYAU$0sBz3{} z&-dba^7g+Js+CoiuLzMyy?mnEREwZPJN)MXP*_UcQU08SX84w&?lyvo zmxTOV!Sq%m6+!7C+oY15XahoAqU_qrS-j}Ns@tNsn!5Q8xTipd04itoR)0pS5^4N2 zv^{{N@Q#bGCUuA#jG%G5v8A1#_IHdxNs6-c zc2xmrAmoV{zK1A(NDeT@--+N_dr~QgoTEYqY493$dboF|Y2meKBTb&$ji6oSS=AFD zmCeJr6xQEe1ymEZY;NIY-GBUds|?fLAJBw0TUBs=UBg7>HeN1gz6Bu*Mm1zbK@4qz$%MiO@mh!rLHvLnn@R bc>Mw~?X|K diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_23.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_23.png index 9d368900c94f1a6dd069d22c2a5f79cc5ce0d497..55d2e56952010bdee33d18994b7554ed3a3722d7 100644 GIT binary patch delta 862 zcmV-k1EKto4e17u7=Hl(0002`twPcO00S^dL_t(|oK=)fXdHDI#()2JCdpcs>>fO9 zlay?OEvN{I9|t8L1J?9nP$(k`QU??Sr56v1rY8R+h>I769z2M4P!F)cTfO{uV;o9dKkXW$Nn47pLG zdz;3$&oTGlwcFP}zu@{(SnU|et)G4Jaed(B1K>{tziK}2f3ZHQE4@vndTQyl^r6f- z^ZSS{Uu~*H;eY;1C*l_thZ!YtEUxbi1>XHf>R(L4FCMs2W2oo1=X3YejvpuV!1bLY ze;y7d&YlMKXkq-u&@+|Ii-(Vu`Z{!JU(QsWE4@W${QUSzpK$HdiW@b~JzQ=)J(!2> zj_ISgzB9D&tYa1jz~#ae5{21h6mq~qDim>j=cS{*gMXGG*QN;m#M>utPi)UG*Ed)1 ze6p$H2d({21#mAU4N@cu@0>glnpkj)cpJFYn}7eX6@UR&N$!&wyWnZ879`%tVnn^n zngEQYd_^r{lO9iZm=WS3QTZEBEa0J*1c6zb0btI%97KGkyj|isqz?gtEiibznZqIx z@67^JWq;V-?Z;%>Dzz`kvRifw@oCN+3%%qq%i59$0-rI+<+Lj{-HDfj>Z!MMCI5k= z^(@w_iz?7q>j*>R&9e_St@y-kNSv7&dwn;>yZL@#|9bWN@&@cdBEW=U*LUX7W#-;R zV8elg#5}PAqn`K-7p4PC%qt-bBak>I452;y5r3p*iJ*JOQb8F+pn?XrX-yUah|e21 zVd$o8+YGlTa1fUSOeMw&5>c}nSRkWi1%Z+^VMvL0AO`Wd1SH0ivkgo|L`T~iSc;4S zcw~9g-1-{M)NA@juYN3M-L_zCwUaV{CqfMqT%-&vW)$7FSuWjJZ@bjtMp^?Kqs0lYZFIRQz%Wh#K_)$JHKUI3Ti=6ZT;MwS8Y*H%_yL{{$ZnERW)TyHFcq$ oItf5QYmyZNUcdVe#@Z(L4|w8cZb4~~aR2}S07*qoM6N<$f+#DQxBvhE delta 1676 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 delta 1686 zcmV;H25I^12AU0!7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000I|Nkl3?)(i|Ci@HROq;_ZIIp-0A?@=zo#HuIu_SZW((1{Lc|E zyyqsNPmS#QX&7mo`I0pCD}pso($wQ!ojbaBo*DkpOX4*S_5j*I-dIFG;*ZepWCN@J zIGJ4#p57kF3@Yaw$pBWwdt>ui;ja~z(8_o9?$X<_?|P5r{>t~?^!Qr)|Ago%86xu| zZ$$p2JrPmE%0%lPU<$g5E>;g< zWfMytITjhao3c;A3qHLs6R z=>a^iTQzUivupfnEoSxuQ;tdZ$!KQ)1hP+v=E%8!N(MljYKP;YpxpyRV>;3!8nd7H z?Z&UjY|YO&hTLn^sXkFU)=y8NYzaV=xWfrLWx!gC(9yc-hB;a%=U3(atQcvbDyT*S zyMHb}4UulB-rZi~gD_gnK}$de+W4pgb)Dw7I$b#fpo^HN0F+^Sg4DH5KDWPWOanaupbeA@#WIn=(4S;h6y@Q~jD_RhmqkO6kan$&)23 zqcwjz!sNBWM-uX$6+xx|)e_J#nAbp_c7Fn^qhA@PlEytpfE{2rDn~&k-#Z#Qt+SP~ znOUxV42&*;5auh~VT9<6eG2Hg{w`;wWB}wCSy{J2_6WPv5v-JNMZI3LQx3$bC_O+V zOhm`K{?&>^y#!*^sQy|;VLHeYP8|^_8Nl0M^e7{*e_1l1b52CzN*=uil?%x-D}PXW zfK}>4)?2AsZ&0+h3QJZm6J=4o0JG%Ul}RY~01Q~on#>AF8QCSvYV$pZneuxtj}9Xf zqViLEfG2!$v*Y4O8YD|Ub26&z8*8tRoC2y~lmIK0qVuy(jn;l|O$MH9S^ktBfCbGn zdkR3KG<$4Cu6C^+X2pN!{-UMv=zre{)Eo1(<5sk3mQzGWR)kkqe=kU_3owsgy9e;P zRpflV+JqCQ08|!ajdgnQz;gcR{saN_+rX&9ML*NyCr$y~I&Ae7)rPtPBnZ4Y@b3e7 zU>sc-IDO;hZD=KHGUdtAe#||91sPdU3Fy+T8U!g{nPBRoQV!p9Vf0)bH=(2x2i~8)?@?kfg~(lnG8nza>w^yWImkAwnbme>*Hkl8TKDA1~7=CnCZ>IEm$!8@8lRv_9g{l+mavbv>04)I#QBBt^cK!ET|@PAJ}_bt2e`30X+?Z!CN zsF;@MhVOkoQ(hRIeAO0B@V!}l(x0y9o~w;NX*y zNOI5I7{6{>GBk);2rfKQO-{U*+Boxbvhjt0Zk6_@O&dyS8yN$jzT>cQw*POknHM3g zW0sa}C{I6}h<}H>3Dx@nHqK6+tY?qE{9rdW^uGJ-nj8X>0KmrC^dQbwF9Bq`jepLB za;WftoFC_HoP9Nnw^uI$3|$=?dhW!d-ZP+%a=VF*v(?|p<^kBF$FZSzaI)&{B70Is z;)rMCsN~=tP{xMdD>p-r1aeY9;%M>6v1kO$2dD!H8-Gk6X-EP-NswXVZ1wg>?j;Y< zQ(HUO*4l^D{e}sy5)AH*b@xis5on^HK>dC}1JPjFnFdFJuOUTTx)^A}I)%9dRV1zx zh@(I%)|V#`Sat;f-FGo#NXTL!U>sL$jU5DN^a1!HN6%to?~FGG{Xh@eKLLSvhLKXL zx6kKj-+xKSp!r%9P`cW)P#|!TI@h{;lS=-_{3sIBV65RNB|W>HfIzlB5=B5Izra=? zA;}O@pl7=U2n1{IH{4%kDtTZ=kr*&hRO$u&5y#L8YkpY?79(`!(%PnfZhNkS zr=4$Z38bEhB25a3pk9?2#vxTq*+LCkD<$3Z&wmZHQ!Z&|>t6|Z122klIDHmuS>OPc zG=rm65pfZR|j~i+GVz;xft0u<=TB?spxT>pql?SXshN_R0}GoZk*4iR8_mosdg=Nx?T!U l(JN9^1YZCDUCa$l`9J3qb3S_$O;i8?002ovPDHLkV1hJfm;nF) delta 1653 zcmV-*28#LS2Ko$;7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000IoNklz}(XAUPSbv1U{d?!>{YgO#3od zn;%`bOW&gF@wA?C+Wc9SpDa3ixA2CowTKYt!iavz={JsIN$pjqu* z!qSw@4Z-78<8yfw%NU+$2-3)3>x<~!T2Q-7L1-tXLq9W@UzR|YGOe-J{^effe!Z)@ z_so9f^Tp$JU3Ae<4xlMNG7m*xj<@Dm>uKR>=gs8!4qx6JZ@d?7r7nnw-s?g1t`U^u zBm**e>f9srcYl0vSVD@zN(gt}W0!kaJW5`p`?Yv_|7PWTir3c2z~U*oR>qTRw6ySP z?bqX}YH?c=Id+$#^)Ar!fy8893zuBAeFM>7t_i2s}@* z^KcQKUKu4=1U$EkQhtX1gd!%<$vwJzeW6YuXG&vq+J6I7kQKVO&S|4td$;xw=Q)myc@S7?E?m;bR33p}x z?YDuP0gFlL&ZdmuCqq+SR^}BM9jO9Ncz{Jm<{KxC<}^JGSr5?80f@wJn6PU-lMJGA zfGAEYB}?zl&;{`TD;bm5dZrnHb?)!e#ph(~#}kZhx5K>vgJ?JLCcJ0A2`)KJWAjvaqu99iJL) zD+ce-^#B&XTH@~U1jzw3CL;4?lSX#NjA1>so2-|iqoa)3;=V8!_^o}hf98Xpxopky~%1#oD}m)~nAUyj#kdqUS- zX*Iq^P{{$Rm5kR1IGO`YVJZY zMG!dz)|eO3*Mv;FBe4XI7RaeK@`5GMQ+*SQpX}Og4?sj;PBqeK_QF}a3dsRDQKZY8t^%US90ZG>Q>WkJ$3i;? z;Fiu$>_ny?;lp}%XGil+NF$IxzcYPwiCv2}k|j?zf)Glt#$SZ%M}-fs@^Sw#B%*+7 z!WK0y{@HsMAb-B|eTH`GvVS<0JGk!xq8V+5*%O&K3e)lTB&@^G3IRm^FGqHiE!W%$ z6HOnXyvdTb0*#+=2=Eq_i)-J>@foHw-!I%<{$aXpe`z>xT}b2N6$)1JM_@_Vgy9F|2D2mn8PXsrEX4fF<(7=Hl(0002`twPcO00TQoL_t(|oHde7Xk1kohM)7@V>?NvGviMn zwbhyUlael^sVk8-w?(m1ifzLMK}rWiT!<*T5UM68!J-Rkwl0bpK|yk@ih?MLxmAR2 z0#z5b%wPu_D23SGq-k>|bLW08g75ByXZ5@<6e;Z~)=Dx241a+D{a;hPJ?#L%0xvZ9 zUWsfP9lU)*1}<<^iBu!^VCh!tXTz_K82R zQ82c%5&-JxmjX8SV^2DNaMK?JY!pniqF}S$bYNpYIe&ck`DcN&LI@Jo8GgEs1JB=h zh>mb_@kn={Hs92^`LD`+V>0a2C4nN1UW!aRLQQ%A`XO~h!x?AlCWNpHZH%5-86LUt z>e6t_77Et~?~%AhD2_wqe1j|@FynGqMa)vl01`173S=a+w#^0t)H?t!eFrTdF{fvM zz9~Im6MsP9?OsF4bH2);<0PUxeWDTaQ#iH-$r1RN8W+=oD|g=w`;nMB19i7CnylFM z1O)u*U5$o0voPCjaVM0BqzCQ3zL}Lmnu9=ip8=4U` zb7J+|bwx~0YFwb5eHFa270s_{mq1lh_6%tzMz&YoLdRIjdK4$9X1{kAR5Qw|Ib~FD z&HAdUYRb53YN441ZGf_#m%J?S3jb%kXA1uTpA~VXn2)jp00000NkvXXu0mjfA)=sm delta 1712 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 diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_28.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_28.png index 54a889d8151209f012e5b42e1da564793606c3a7..02b31050b11c23dfaf93475ee86c66b80e7d7c7b 100644 GIT binary patch delta 854 zcmV-c1F8I$4dDim7=Hl(0002`twPcO00SsVL_t(|oHdh8XdGo6#((dB-h7x&clRQ$ zZ7^dI56wa9NvxV7iil}zK&B{daSz_S6fYu$^i9MMa%qo^LOVqZvSZA_iw8ARk5VCe zu_i^QSZGD4Q(KyMcW3ACA^IF2cs}6afsjWC;rdn%Z4lrX(0@Mh?APodq$0$&er-UT zrs;}~^n=g$pZ#HC@~Exfg)m47DaNk)z_lB%*sjQAS9C4n^!?F2Q=>NXt*3H7aVr)- zviN%AoJ~YeJCXTCbJFPSd(LKl_jKl4^X^&^vHmGGk;X|UO#otbNOtkN>Fi=&Lk?yE zo5+zemt6)Rs()f^=3knN{QejJ>y1qUe`!MkP`5*5e)Ux5_ZS9AKiCmKL_kpa5vuj7JR8QwhAmKV@?)%GEc;faQT`gqR=-n+G+cDGI(3M@-MGFM*6pX5y&y8@1t z`@^-gE4%l|e&zGY-}g0|asVxUGEPMFbY)z#CUDFFc4IsFT8-D%m9jtL0gzFRf$ZHw zU*p3%mAFn6R(~kjoq8>7tj2rxjr*O?WUJ^ms1FRG+?{a)+4&cEZg7zY_mr4ax>H|oi zo0rUJNq-u{1I+a@c(T_(Id-Dd37pJg#*bj-0GcuE{f#= zBz{XyfQF#Kn{(|zsRCxEkJo%BH^R&TehaMq?PM;0&U%A#72v@s4=`zA&T%5?>!RZ| z{H%^B9$;=BulY`6^t1;!mHAh*cnuLFh=Sq)B7Y%3GOFDf9!RT5*w8}TPei#2@L)ATJ*U>6q7e?k7mhn9~fzwPuPXcE#mDw~)`G~GHz2PxJf2CB7X2uBKk{RnR8P6c= z0gwjM6lW?S*__orDD3}>)|_`PSmo{l7CA^PE|ov*575|stL4%)xg-r@w;3+D$ZNN z;WKT2cNlNQlTkdtF3x%0S9%3e$T>SBuw1HT+zby;QE0T+LCFC$COq@C28~<;-&-fK z!t0!C)$5r~W`&O^EN^`@2Z*{<1gqmW*V>J-c+kc~ld7x-KpNQ+TpnHz&y*a1-G5Tm z`Vgx;qN7oiMYid+qP=PZSNWw@0nvnN*X4?afG1QB5f2avmEOHY4>2VNh*S$!oUh^u z${!=fM>XUzWY<~+NLWdVe6F2*9Iw&##CEw(r?F&Y(Lvw4J|zd}LRSdLX4|XZz3;O0 zqwwnP-9gx+2rT;;blI4D*)_T%e1EX^yfXMmTezG9c-x>>t?Dh?PE`StmZz@Xbvw1O zEM#PgD0={{iDO|hJTFi7yE8^cBM8^acqg1wZKg%&RzkJ=?*Uktf?^AX!7C%@S(Ua? zULrKJ`)~PsfR56xI|MKjUaOhaiL57h&&jL1hq$~Lr51V$W(dIKuA|z~!hb;&Q5jl? zVRcB#Ie@0{ii^*l=%~w-#@eZ%(`9s2ev}*lPd;8*;3>6eSJppuIbVDdzz4gyIJrCzTRCDR*}{PXK!~nv6b?K00F8qV+U+p4bTT zz{__OY{T4zgXI@PJPODrY=2(kl0UCL3&7v4+#!?rWemLfd4osx3@rNq-VH_=>~g(# zxbv>^k*)C6nxzmh#`=#YD+0nbcS7;fXPo{Hbmt_pN|SWlAz-zzBw#(m@e#%&&nH&p zBeQtlmzJD21MYb7IK{ml- zw86b#7{P0d*nb;WffkRg=a^)6ewwD?i9HM%X0+!Sn(lueAWHz5#?K78a5@B3=w|bx zXv<#C{Z0xmvKF*c9aVZq-~SX&8cqhtA1w!1DgKTm?k=4CaET$;vH|QAe@C14C!*Rp c%+mS?=i_@% diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_29.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_29.png index ba79b3b88ffe58a083b74dd13bfa3133aa7c23b3..c00255748bb8e9c5d6970f62341eb1c4d6061b9b 100644 GIT binary patch delta 842 zcmV-Q1GW6x4AlmZ7=Hl(0002`twPcO00SIJL_t(|oHdhAXdGo6hM(^@pH13~*}Z6^ zDQ44FQ44KzE7o>Lp;FMGpaX><%pv#(5ei-uA^B3QEh0t`K|#!10+LBV=uspSPX$Z= z97>BD=qyx9DJF}yW|GW)KMxz<>pMmHBHjfI12Uv03^4R#xtcfKHDH9zPq) zKxa2RtX~G3m19S<_1|v++P)7q4z8bgEXY3o3c~Qf9c)%!yh%9@`ToPwbByh&2Y{RW zEMnW?$~ORBz=4f}H&@~Shf|9O;_<1uhvS=TzU906y?=HkP8dCr7zb)u0-Kc=+uykH z2z=EBWFei3HWC`f-Lq?e%s3*=N#U1D9f(F}oJqJub9oXR;)n9t4&n+Q2HVe)MP1vmReylnKKJBK8x#8*v zATe7rZ-1wed6$MaJ;#qUxYqdrFb*UmVIXlFCW2-If%5N1(iGGw5lBqlg`&5kfIzf* zE^+rvbGyp`lcs%|Q@I}WAbpF delta 1621 zcmV-b2CDhh2HFge7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000IINkloOp*f5@$hr}T^8GEc;TSav48&Od47!hKVxJASfZ;7 z*x68*C93h9Hvw;65B5EMwh-%;GeWykQAceEkA9EsT-0CJ^~Dq%D^R+nm)E}Ny>I(H zFKGX@8fyT``PR7=`tclTo|KCA2J+M>78|*s(rlDcs0DC-I|E?nTjzB!5UvR*JMrfn zxX7oXj2jQ_qJQR5Y=rf1Xc5oZe(y!GTq!}^c(|z8P^-R-er$(Cqm`g^O3WcK&;Fjf ze>g|F7cL0bTI9e-i|lgnCb&;;0RxfW(PR7ViR;1fE}=`?U#qqI#I#^o)j?60NDl1Z2nH> zs@mWsHGn4t!12_z!ufb^1aN*O140|$fYDQcWq%V@>OYwZs-j<#Q*m#jrvS;=Edxee zcJoy*K?Ih2<{UbWTcTrptvCf}z_eS*K+$>D%>y^FS09{9ecpxJqU1y&RTaHed0f-6 z*7rJTHd}0&V6NMuL>uEd1z3TdpK%_=DqcG{xqFOcW5qpi$ZnF`OK%h^QvjZ;>5j3(GCEU}1tq^5*pUKG z9pADxz>Q&@n=Mi!*mLjwM!H&rQ8?MbljK&^J<`0bCt_DdcLbxq9c;yE+Q$xvG@v4g zo_aDH##{qv2H@9P-*m{0nTEznl=Ho(hJOq^j9JnNOwIlSt=nb!KGQ3RfIDV#@2xT` zFxkB9Juj8+7~8`IL!$;ho@Ee-7qkbkWK zyj5#Q2ki9GaT-;dqV*I2!JVxsDx=!0QVQ@qr>HuDzM)fDfxnM~;o{@#DR@r-os`GY71k%1Hp9;9o49eFsvbK|hV+Ociw6d>u(>d@|C`auvx zx(3KR_3}1~s#1UjUDVvgRMGn{>3;)wAhARSZ*@Mk;VFha!2-|o)YJf74|z_cfR4zw zGF?=5h6P)G9-yK*Lp>L$N&#F^SM7X_S*0Ve2bsBP27pB%{4CQ}jj)Jk4opL^DOKTo z>BOJ~R)*4#)&Ou3saF(JDZp|X$;k9>&det8qO=b{MSeC7y!lxG2TbkobANd4U;-%L zf^;7M-V}`3j!NHRM`WHB{hntcTo8EIBDx8@tn=Y$+akbHoJn&%W2#d?XXlWEh0*Z% z?oA;6VhHY8Yh$diL>11V){SPVW1zf_^S*{Rr7N)$C>a`UVsv%btm(?5+dICixz)*5 zw;`Z-rDTOW>l%x~V*cAAaA} zPv}561+3-UAQ5D{V;N}lE8Y8>m|!j0p0Ph1nL(x!j>201U_|qF_Q4P*Q%g_RTE0IU zmo?~1Inxlq#zrD4yNGY>Vc_GPr%%I;H~;?tUSK1s$mm?;suVDxH%?j?d2OTu>3WL2 zKweA-I&}s5n%huY5>XcCyKaJnCwhetZT`Sgkiz(vlA`X{~{vJtYDj8+p?dV TshD+x00000NkvXXu0mjfyQmk< diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_3.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_3.png index bedf366c6ccf988ca20807c9062e7e7f7b70d9b9..9cac278976e0f8c7dae970495ff5113a484f4645 100644 GIT binary patch delta 648 zcmV;30(bqH3X}zq7=Hl(0002`twPcO00LV{L_t(|oQ0H6NEC4t$3OF&)m4fef?&zi z*@!TTkS+@S*$t#T?yXCx$BugpI?RyAE*`zP#|}XTQ3mObN{23?{gu!h!9$6*qhzi* zJFmm6vTj80^yBk;zxR8;?|biuMvm5-VC1Mb0lN`cjUd?w%zs8eBar`k81ZV2stXv3 z#w3!^ta-Qq7=%Y-7;dE@XfF8IEy-NGwEY<9#^G*t6a)8SZ8VgwO+T)%j_U+j`!uDdzI3gO&NEi#Y_kq09TYH42l>HUf)iN2!IR@3@Hq zCIrxAgPX3Vv`gm} zuI=`!3iNxY0e*E}-|@hN?mh*0|2$bv)t7QTmtLv~gn>e$n4heZ&_?dA6ppH1)CG0p z(kpOMfiovl8NMb?)9guXLX1XbPJ($LY!O>t{T1^5v^H(S{}X(2#g?fEBy9T3>_td%uS!`N3?sl70Tq=Y_f8vQs0;XVED)XBPReiX#sDdJNwAyp zTe}2E!%Bi3mEYPWz|Z5!90#}7NcLlqyRyF$(j0f5e<};0CiXnf))PJj@VgcxQ^qg> zIOU%TJa%s#gMVx9-3<6kHu(PPFX4m;@FnGQ3)<&6)0$cO;)oH&utHGv!dVEG*=dqY z>s+Xez&a*rr&D9CBBz@GD|WwCKG)7;mbswTdXKa=Q8M)YF%c?AP-+22RQ@XD!A0VB zT8FpXi)C}4N%Exe;c?+0J4=Ex0^k9SfHX<1Pb#?5WPifN9Tg8)luwPRiUef@fI(BG z%nr@8TFrANik23doA-$N07v48ywXbG%uJvw9qtH=6_Cin^+TC<{5dDn>Utu|tH=mG zaUAT))uZw&c3TG(H(1=878^vy<+1>sqCe>W3=` zN%uuj5(8ih;LWAE`*s1P6s}k!`Dsobbv=`ED&@EKLthE2CMHD!jtD#M z{Ekl)f>wYdffZW12>X#_Xl*oXO@Q6w2`UA&KvMqfj3MO$Mk(loN+S;Jv|UVtw!h?qVOR2=~qUvR(D`zla#vdO$RG7=f}Dp*SQ#tHT zI7n&k@PJq))x(AlhFK*vjZYN7;AQ229Kvd}~OMjv> zp&k5K^82b(F!Xr12JcSyR>v&zEET(1kj@7>DCJtuP%8T%*v{|?@NFi$P!acI}7Lq4}YtYV3Z60c7fF_SGWlrM_AkA|0$?0z#5QfsY{je zxIR|+eyxqCy%ioZS;i1P48n?~I>=1ibFXJXvWloWgxRI<@+<&e+sR~CVdb1g^j)3> zRPD0r-G4!&{Fg&#D&LE$O5>Ms9}oX=Z1u~b-raxAe;)q;>SwfYfJwge01E&B07*qo IM6N<$g6ch5dH?_b diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_30.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_30.png index 0731760dffbaa07d4e1f50c1fd65bd0eb1f6ef19..8d9176c4c2d078d41432a756bddce4f700f11c2f 100644 GIT binary patch delta 872 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 diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_32.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_32.png index 39f5db8a0131b28046b4450ce84eda9d9f519ba9..c97abe79bd113dd2f53ed6e26b0afa01822a08dc 100644 GIT binary patch delta 846 zcmV-U1F`(l4A};d7=Hl(0002`twPcO00SUNL_t(|oK2ElXdGo2g`e-6ugS8;WMWuI zmA2E1NL9!WwxXb9HewY-6za5I*%btTZ}d*B$utJqE30>6auHAnWGq-B8WG)zD2ReK zXhjoACm366j5}*gGjV6;^> zZlGnDS)CtBvD-gQPJl^)4yv_{+F1Sw&|AdJ>KrJb$}>kX`fn2?g{R|AV8m>{8`~I9 z=gqWir{{3Wm8l7m_M1k2=`)^nq-^t1 z<mZ0)*Wk8_znjI=w{&0CzFf!GHAVLqxd)5p}TED?zrn3RhEdta)iSRxYcmKq}I zVn?GYlF%iR(~ijInPi`cNX)QEVqiJ8B7iPg(0RLtXZTmcnJQ?q+5Zfb)HU1l{7>!w Y0AjRM>)yyKxBvhE07*qoM6N<$f`IjvYybcN delta 1613 zcmV-T2D16t2GR_W7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000IANkl{J<5M|MV+}*|tM~rxqHQ%gJMSy_ z_qI3(&}N~8Sv&e(o7u=S6x0bg?-M}yQ&|x?mq&n|@I(QWo<&oOB=j2XD((`0s~tl3 zO}%AymjsygLw}K(sjDH4A4xQ|yGQ2{-47si-x)#Bem@bjttOIauFyT_HKSV|0r-1V znJXP-1^pSlnPYgJK%$RKv>Dx(#|x#we9BC}WjiP36_vV|oMuY|7|f|4qs=L3VexG#^?7fIRO8hL52>}cZU;0fsOd<6Y3!LjGBrA^iCcShGJ8eP_Hlk0lY{6cFP}Nt5Ob{9RNI z6q0<1?ll>-?-Jcq1kjj95pgJw@n^g#jT@3!kM2E70j2xO8h)#_<4aLYyYqg%C+h&G!HqOzr325%pK-zd46NQGYoBxhETN%MB9897S z*}YhI{<*cbXBU8mTr|-`dCoHF)3`ydk_a%2$FK2j2Ab?hbh9&fWfD~d%@I7ZbDbkL zc+bKH59J==x$(4wqh8dj2yEXhUAqvfTBn47u$?(%?XtHoeogo_mRydER z4u3H4Mg&3j+h|`+(OJVI(aGZBHOOeYBMPicV&ACnvt5AJM-qNKllJ@GqRp&k;HfF_ zTEVAbAnZc9JDRRjmC^D<*#VRYDi9y zk)vYvRz`sv9j3LS2;ez%;b#RWff~4?>bC>OasW>;2`%zuGIo!`XHHNxYpZjLDt~%Q zcL5ZVG5H{>l~hGbJ5xYqs3@i(I93OU*3m0zW^hA&Ac9EclD{jd1WIB3v@*T3ZG{tP z^j12XRK~ZE&H-pahZcFXc9O8#AQ0TRu1erKs$8BtNjOJ32k`9ssk2ng0mlWzHO!|Zm1T7R?T}|D zZpa6s&Xz@#PC5sW4DLM(km#Y1q7U+Hg)H8_G#5JM1f_oupfUf1P-ww(D$3V>bfm#RqNn&fPY)?$|itX zTXg-a!c9t*bm>`6tD*pc7ti2%HP3R0s1cEwfY8+nKo+9Kp-6jrN0YtC1k_|eXqa^X zYv5A-AHk>Wk3HbVwW6sfG2Ef6w`Dwpx#ro~tTwX`m+qCaY0&6#S)`qU)W1rHR)6!C zL7pT~8i?i?9#~~m3zqCin14m(jIQteoB-()!ORK5OF(Pue-M(H0omD&uGRdr*Ks^& z1}m`bzlLS7YyXb+k4DW*ZjgaVyEWfGjmir0jk)6a70FPA(ssgIbD`foJa`}Y*TG&$ zYaPAQcPo&govBe|5;kw!%ohCX`%`QM$veG9|Ku};-HsChm9Z=butp4jB8fYNsN6gA z9NI7K05ij{%3gmOBF3zUHem;-2=%|np(5J29RLaSzq9^sP}}_hgJq1qXadwI00000 LNkvXXu0mjfZYu;b diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_33.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_33.png index bee4cff087224cb68fe8a894ab1b4a017d1f97ce..20299c04dd5c338cca155b6035bda75eb703d8e5 100644 GIT binary patch delta 809 zcmV+^1J?Yz473K27=Hl(0002`twPcO00R3-L_t(|oJEpBXdGn}$A8~9pLMM^yA@Zr zD9yBDFGa|ql8VxNZ9o(crj+ki+U-RTiijv^1KlsO+JXlU;<05#gp#2Usd$r2yy?l{ zr4S`kYe-AWL{`f`<7}s(fkgSK z#~Fp04~Q+S{r<^$kI8{O(vfSDcW!(Dt=*XUKs*ran|{w>^gkxbP6F`Sbn8jd2F3-V z5O{2B_hDZtW&rO&HC=jOU|awYL$UYu#H_SUl+DC8PRN6e>(8Yx{bXE#kJVMcJlr$i zUQ{kyII%eR^nby((u2SKoF4hrxBz5zvi){^a5FMnZyKZQ%f3;UXP$oL>oZ^7j?)IlY1Jvt-TDzwkvSQdXn5*{XV)LSb0fbbqLh(XW!Cz6CFmp!y;S}peTHY}@@5&-R! z{c+6MX%9gEx{gAzNYVqCfVzQ?k}v<_(dx3z3GKLGf!fZoHE=U_>BIIT5HsPI+@fwxNDF@;)h^*0L>++aM+XJe#Xm+g*7 z-m3QpD;K3I5Qs?1l{82I n>LRkF%esa)cV2_3Le>5SL8?&^t=|4=00000NkvXXu0mjf3rvjt delta 1590 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 FV1grd*;fDn diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_36.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_36.png index 9a13e7c67db281d96949e0be75aa7ee4197dfa96..627a02ef2e0a58d2cdcd61a0ca7a2cf89b8e45dc 100644 GIT binary patch delta 861 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 diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_39.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_39.png index 7510931b44bb100b314d9bc617843bd51a2cf164..a2946bff32cb54497bdb072a5b5ff1311114c76f 100644 GIT binary patch delta 787 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 M07*qoM6N<$f`|5%@c;k- delta 1390 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 XzXre(1B*(M00000NkvXXu0mjf9Wft& diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_45.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_45.png index 2a3ea8e23af713aa1210d6e19693e576aea86d6e..232a5c63a1ac6d18249400415fc2dcce397ce53d 100644 GIT binary patch delta 601 zcmV-f0;c_$3FZWl7=Hl(0002`twPcO00J#ZL_t(|oQ0FUYZGx8$3OSWwLKBx6ofd) zT~Wl%;*!ZGf`Te$)OOQOJ#lbw&_6)1e?hGv)Gg;At%LMs>7X?iDz*wGsal%o z<-QJg(KJ$grXL@k*YETEke;dEkhTv2OT;#PX2382tbaf-0DlE6|z((qpOAeH2XGdV3-D=tKaQHl~xY6f6UbOY7`l0Nu;dK5vH@U@Lr6 z1|RuZm2uoW7!)*1AhoyJ?>-i_yZe>R4H;;jaYpXEwtq&!+U!_J4>YZ0RtJ+i*5Z^5 z%s6EdFy+|1Y+*xg&k-y-o;?uj}{Q9%1Fgvph`rXoz*c6N&+0vAomV3XLmkaQz#RZ-mCPFh}FElCXt=}J9Ot={+5-xs^8HG9Co niI6@saGa#?-VHd!;Pk+6_P{=KF98(V00000NkvXXu0mjf%1IiC delta 1169 zcmV;C1aAB01epnt7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000C_NklY8+afiU4ICAiwbA~6$Pr>9U_31__S940U#jBx>Y1!4k;0!HyWk>S;l$d0r#6= zT;sSwDn>#$0s5W4()rSL)gF2!qzOT*ou56%>>SnmA6s<;rJbxj=&bPDC%KXkRx$jy zmOy~4(61#|S~9vbG85`)0^EzD7T1%2A_O9#8|9@!M+dz@PawJ%y#uHKVyb?A6Z+Rz0ji-g8ZIr;-SFp1XJ(4)*d)mo}M6o;p zP$Ca{cS%kgucNNlzNhBV=AW^#BmtgQ_PpS#91b^@(IMTgi0!ICeM3%56wUJjLod8J3 zXb)>uzJMTv*ZI=!kE|vAoj_#U7S&srf%c%ij<7o4(pZa-07?L@9EqOuqoGu%jGG@F zW>@q(xWrD|`5s##1h6D4BP8Rb>&LI--=%vIuR9qdI}XylrIJ7mR>f-vP)-?% zphXDp^PqB_5=r2^-Q;YyH_+^vKlFLvky+?Y-FIA>D1f_4PVkfG%J06T?$ zkD${Z12dJ=eO;vcH=RYM-4`5Zmcs3#R>VrJM%Rq$VJ-h#uelfti jfl+5op~d diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_46.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_46.png index f4b263b199c8402088ad99c4dc27ab3c38f0bf2e..3d2b6a87b660ce03e9d14190189b37ac0aa783e1 100644 GIT binary patch delta 642 zcmV-|0)73I3XcVl7=Hl(0002`twPcO00LG?L_t(|oQ0E5NK{c6#eeTQ>STX>1c78S z&j=BUl3LipnhB)bl(UW~+qp_NQD8A|-^QgoZPBVA7g5$`p12Akt%QQC89^{YnWq(w z_TD=!-dN*AbXJ!ihx2{+TrSeMs)e+?16U$RP$dI~8eshe+4S+?kGsAMrHK7^*UsD#7@zE((fPSwYj)H+A05jO$#u6Ct02py0X!>)P z(92lvY6=Xx3!v}LxTB*k1_GC9CupNEw{R?jfi3VBZ?28PRD%PG{BFT1-MVz66!j}^ zJaxaHp6=tmU4O(t61C-R4x)jHF$__!OPvkv?N`!sU7&BX!zQhiHacE!&Ps+oosC-n zuO1FXgMhSEQeG)NFO95hNC~L3ae#MElcnbBr~H~}SzsI3K>b8^YDa};urT}w2&@Uc zkxRUK@q~kwjq)!$Dvm4=K589~x?-^D0qL>QTfW3#7Jq=IhR00n>%|;MQlKcO4eO5eY)A$mAOe%aJn>_P zuOO$0vm8ptt$*kS2oC2iH^h$93UZ3vW-eTl0m5kj(&g0yHU?NO16ULL{U7nBJ(Y^; zuderDkb70EfOGc}M=)3}ehjiFTWkzmXA*%1Xv`W6v`{3-#HL*sNGNBQw{u+sD7of1 z$eX0oWDE(S1U5urk%R_N5H3f4svuv|qJ(s&5Gh}%`syFkq4K3|U|_FDl??1A!m9>J c0!VIyUjjZtsx*X=T>t<807*qoM6N<$f(bz%D*ylh delta 1293 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 VzJ;;}%Ypy^002ovPDHLkV1k?xbOQhY diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_6.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_6.png index 3f84ad47e3ded623ecc0323b5d64af350fd1e61a..54ad31fb49a56882929e0483276e3cc1de96284b 100644 GIT binary patch delta 635 zcmV->0)+jb3Wx=e7=Hl(0002`twPcO00K`*L_t(|oQ0GLAj=!9kN3t*akfrDC37B}kh* zB{WI%@{Yr6o0w8O9&aJBr<%w)d|>)&W@Vf)Iea(0Kr8;s8o6?~Et)Bu5PXcY{l$08QkB!6!>&$n111 z;|JKtRSz_bAg79;vegqVXjp-iBe~il16j}z0=L`Qy7g5(=~|C%0=8Vx`~sjc+jL)T z90$#tx24k_>3?T-iz;nQYkx_wRd;I$O=>V+c zDn+FpKmDoL21>iiIy-lC*4y!+d^!)MZQP!os=$0{YI0Yb>jVkPUYiD-Z?0E2b+(!2o?iSJ01mu4y?NEB@Y zAm0wg)g);ZfKEnPw-W24A%KqNZl3ed&0H?=(T{ z)oT|gKy)PCX_78Wr%*QKRYBxqJ0eq-xHu`38=}Eo*CBul&LK3=B)tFx;2kg;i=2Ri zh{4vLrnTWGPo|LLjN}j*lD6b)5{gJt+-oARNdpb;jt5BMDJQUE;}>`FSPg?pkz0BK{d z>w4veb0WWO{#m36pl$x!(C4hJWfl>r{3pqmBES=y?~$KToHnMvKJsRn5J#`qbh(NI zkqHZ)p63c?4v0aj#iT$XYAp=Mf$gRS% zw2>S-&VK@bzmmmkbCF!ICu~ISlO2Zw^s8a?k-wgmhlJHH=S{_SaF^sTqd2N?$s^ImjFhxVbMS8d6PWVVuobeRo+dIcE%}o+-kQhmo8Q{R z)4&y&r8wTz)Jidr4C{68=Fjx3uO`53NSkfNWPgn`9XnZm$JPXRstK-6lr-Z&Z(u{}whG@d{5F(Vz!t|ZC?@VMXT0SX->b>g(n*%O_#D6IJJ^)Sm1 zgMUUCB}s_M@=hbF<7nMai_!EN?K;i+B{>>aR0{AAfX)XHGEhp?EY`|}Bv)O@V=Pi- zu-ykjb}9W@^M5?s6XHCZ&t+N_0_u!lt3E(fNfEi#@zmW*Kv<=xJhVJb2HOx|X1qg% zC5r^w2Ju`VGe^ntt^6Z`EkZz~EP4uE*?*pzywbnW%FoD2V+33D0e0GG3tIU`G0F!< zT~7X7i}|Q9`3M2tw(%4r58$~j(gEcEN6sZYSW195Z#+k~j`t?HR&xuP1577CB&P3F z0*)|JeqW150(za+C(t^d^x7&3rVt?0kYTC*b#x#vn?<>rQH>($1tZqCIkNz3h3t0#8fU@`M^0v=Y+0 z?yz^t5`f;EqO$p#%m_v`Itm`8dpE{oOtVN(ZUlAr6TxVL*^OFRU3l`9NXD=Id5u9z z9zB46F~q{ClP1aI3fU2;WcvXy#VD>piM1C|e91>vE+VqY`hlwcA z)qqFVQ)`HjU`T*b;-V!UU+VgCcoRVSSkXha-1D@ip;Z8nK^2*ZYNB$jC4*um!6k28 zUQd+({{?|8KGS7;vhnnGEUf|#_QO`c9D1yIJ!F%rf`$MRJK P00000NkvXXu0mjf4*zXh diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_7.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_7.png index 8ea650ad0751323ce367875d8fe030cf9627c951..1488511859daf78d14ae6f068fc6d4c54366d209 100644 GIT binary patch delta 648 zcmV;30(bqD3X}zq7=Hl(0002`twPcO00LV{L_t(|oQ0G@9^Au(uTW?Z9gXZht#)+5zoA{ddCp)1>Va zJHQGvP;Z||{_)b?ig%<38HfOdteUP7nN_yG6h%bj+o(1M>DWA(^}qoI8cIG=aghcn z(g>oZP$mLecIH?}q~9NHo-^AH!ax+Km(kO52?b^3NRf^BK&@ATbk={SnzOn$?Cm8F&-4=1Avtgoera5C^{?w@U#Eo;$z=| z!Mx}gSUYxl!ae2e9_5dz+wX?Q6u4Lj&@r^|(0^ofDBlNb`d1#`04o9rw#GI+1t7-J zpfB2wgIF{H*bbg`5-O~ag*PLBM6IR-3Xoe~FOd3MrGF|4ygPG^5GVvIBcNbhGj$!% z-)k>FfQU$4bU~z?duz=U9e{dHmn^#3r=A{HJGqz?SxyhiHE{rvLjX3Z{oskpVgNR7 z%a|-L%m-C%Sql}=3XSxh4*N3>Q0+1f)u*m>qJX^V)A~R-gMvn!nCMvNzmA4Tl9T(= zniN@Es(<%2MbQm0X#lz__X-rYE0bOwNLDF>f~e(g_&$7$F@f>5g9pscf)zSI`9yL8 z|$+i^NB@vM&5ruum2<-v-LBSlFD2ovadP(=(=D%(> iA}v|hQp5G9qID delta 1294 zcmV+p1@Zcn1(gbr7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000EXNkld1R%O3IDZXr0$iMhAq2Qy;2c~J z@Z}grfa?X?G4tH62iOeH^Gxlm4kf_#0y)f9KGF36+hB$Ai7o-Y9+vwk3T02-cYtZAH}M zAOL?M1PuhavNEjXmgwKRkOjQs8R>pjbtGi+d)Gj<~+1|5T%CFa!*3{&O2oQ-ktui=9cfCfVHi#?cJZ$jnni1{nIdMW37iCaf#N?E5I#J zDkmkS@XzZcRB95{^ZA-um(l{X42+a8p9stPH21HSvGx4&v)A;|JV{NES~u{^Af)np z8%wLaLhW{?rcVtkgqGh~vE2(N+F1;{4IGVZ$A4~xSK`W##%}(5Nlx!xY8*=dqBE+4 ztQV8QM@IRUQAjejCcqAforj2Wy!u~D-dZd_TY@7# z5dfL>dnJt3;>_j)qamG1ln|Qoqq&3hd3Psp6tYV5;^}I|6X}PY=>SHQXN}7kWj6sL z)_>R1;+5t^%Bk6~ykLglp7KX|IEV*`G$atRwYccDNmoE>?sy?HqI~|dW&Kevuw^62 zA`!afi~v7y%hg9K0ZaK7q^{%8DqsXq6~KzSf(QvLc$t4amapkqzDmk>2Y>k&)}=;^ ztX>(d>t+<#GPlgvl%7clw|OOOR8L_xynmj31TD&!JYHlETM*z=lwZ&izstPHoH9o0 zg=7=qE&2dj6>&N#tXS-kKHK}3&N7k+E+N29<=O~nZdn`0QCqSGF2AQ=FqHtGu6PMv zMy`=S`kbGib%9i`VPQA{KFOs=5b4o#aAjuu{k6;`tzc_Id{fzZrz4_-x~WxLxPO!z zNueduS=7+<=iwf*mTo;<3tBsA$aS^PE!2Cq6piwxX#$`R7F_~L7e=$oOl!T!etN2h zESf`rMue=(&svN(epQ|kd6rf(_RRGFxeg}EUs~|FwLD7}qQ{Pg*LvN#(FOm*5D)yq zq*oSdUJo+LpG|~FPBpC+ob8YE41bw_?S$FN&m_sw#M-?L)FwyWTu<{SQwMwFkk%(1 zu5=z8y=!O56wRNSuY)7ahu#~pY*<0cv}AD1t}f7P!>a)PyWLzi0xO?s#M%Wiz|IeW_m7fKw)A&ia|2g!_vDJSL&07C;|NZy_mhDl>rw^mi00000Ne4wvM6N<$ Ef|{&#djJ3c diff --git a/assets/dolphin/external/L1_Kaiju_128x64/frame_8.png b/assets/dolphin/external/L1_Kaiju_128x64/frame_8.png index 2c8cf3f5d7c34f1eedec4def10bb28095f2e1c4a..542ff45cbfebfa43d20a9fae4670aec87ef15cf3 100644 GIT binary patch delta 642 zcmV-|0)73Q3XcVl7=Hl(0002`twPcO00LG?L_t(|oQ0G0Bq!%2O8FMr{%^87c@iwG7~OREcdM&y5*+zUA+L!AE0Man}CiBnvb8B-NcU{ zwcHO|qoA4fCVy8Ud~GNGjs+Sn`zJ|99VdQQ%Y7JadEb*xN$u)cl;Eg@}m#q|&*!wIekV4Iu6~YNQzFJ%!FK;JV##wn3u|pAWCW zAvWs0EUDa{z6rmGi3}Q?hgA}z<-uFG>Y-sa%`11KG=DGKmX@Snm);kG3Hn@FPkd;LW~r6Eu|k6kL=t6>|)Y)y*ar7n}oV+9`>c>_*;@(G;d= zfrE&_)*d2XBupig?%he*NJ@x=QtL@5k%$EOV*_v$DCLVB^!rY}w?6*>wYz}i<8VP@ c3H#s0U(O*gzK_0NQvd(}07*qoM6N<$g4j+aFaQ7m delta 1301 zcmV+w1?u{b1)K_y7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000EeNkl|1Y~w0tl72hLY@PfMT14MI9WTN;dcNJkJHdecu;I)WJmjK?!=E z=eqA3CGKDnUG%2vq(`@(qOm4d^i7QDSB-*6*!- zGzCWXN}rdEX@3?8!UR}h{n~ub^N5FqSQoWWgi<`pMbD`L>H%ie#`I7$qM+v+wak8e zd(G_uHKzsWTf*qiS!f<$#=J;^Q^nHtw<@Y)P7W{+z_Iy@koIV~Y%A{5v6KXj995nG z8Uo&?{5})64p^%gkS<#yLInxRssI!!Sl=s>dan@+ZhtbRSZ|HxWc6!ClOU7>&_%4a z_O^!TI@$qBE;zd{*R(9>CKqu@;PM=k~I^R>4^&w+71-a2WL*RJQbdMP=Y3 zfTvlKl|fPIRW!HUzt%`#d5LUe$3srK1{5G=V80;kpe;G5l1}nSQrNH*>j@7MsUrCW zH?9)peSd(gGOhM&bPlexvgYSV-CjpR zfHyy=Bn7+-L@pFn`$oo7E0>hso{@+^F{=D(Y~Kf10j;XB?jAh(&o0Wpu9px%>y2}- z5%Wo&z+3qsmH(PnFdC6dk&45StX}H{Xm5{5^pPa0f0mMP|TTpSNeNTtG@R z`?)xvz1qg+#%W71zP;~dYI{#K@p(yfmP7D zdVlm8={d>zIXMz$R0`XDHgE^!OW-WF?-_7odRIMC&U$1-uoVH&CC(_Uy1v1a<3tr_ zRR|~&Y|{v;vV4TxcJQ7i&dzor09t9rSjA2E@lCLKY(jeCV#F*TcRHMqjEg*C1@mxpt{7K8Ui%Mqe6gI zXCq*F0MB!g4q*TP$i0LIyW>FS03`(QxL|AHQFk{xm#_}M ztzRMmeNO5Va4qD1+$afB9}l=O&eq-u*@Q z3b_t$6H7oTK?2qTk`&WhzeR3qj%+x9e=vk1+vq_nwW7=Dkr@pU+&}NSv*Ez> z09xwpV`viXEEa-QShvF zRVa&ugW((?8mqnlPu5KvL8C;-#&>F*(irGv(8xwJ&6O3&rMK*@K(ssRLCN0<+#xPk zVRgxg#ui^3Im7x7cr5?kz@yByc-_~=9l~HSK?Z>m)J{f+AjJOv!E_}L7RipL zx$4Zk4x_Sd_>LdG@AuyC`{fzBmY}wTxKjs=Y#qR^2Ua~u)_()D9#9Wt8^tVv0~m@L z0EFV3|0oRnjTR%?-EgXPQ?lN6V>in#Z-VS53I=KvFRYd9Z)}2Qs``+zET_TI*)r+8Gm8I2l5ts(B9%8LRT0q(%ybCGtq&`_wp0~jpy$j`XoVzzH!#l^Xm{D?$0Q}6RC)tWpAzsXlvXP@9wt@6b=eI00 zTri6IMxC0Zja*oIbtqCOK=7a?A9f%pti9}p%wXj$bAJei!?=|Oni3DIE&^!(ssr|! z78^kI_6`62*^GYOIZw}sqUsfV4Kw;HvBZlmLhNMJo&s7y;29zAR$c;W o{F>wa?~qYl*Gi}>x>0`tsznJD>?z}x00000Ne4wvM6N<$g3HD)NB{r; delta 1329 zcmV-11AB1#(Z$(e)toBi9D>aXZ5(pc=u8$RoGS{}!x||*$h-jHx$@xT+3GnH? zfcN@Vb3W0@0BN8kSkd`JhX7xXLx2KUSzy)ZCwhPYpWX+|!gXE0>(>6Bv5rRv_=jpRA*|mtmHCL9+esO2@1AmC~xj9vlVCf9tNv&vl&UDe* zLQCsmm5%5<`Y|(&p<4&A_M=bj`J2=Gh(NM{MiyxtF13%ZOE%Hc6LDU}jsVU8E8q0+ z?A4?8E26D|>l={rX7vVznLxc)#pMYDzA0=CxbGb_X_Bp!KHM|A>%d`b$|X-nDWV>RWKtfaE%{Ag8u(;j&C`i zXz_OhX^Y|QF)9~UB7wIIzU_RXP3{Itcr)8bBtT(p7yEHE8`d!vwkE*a7#)a~9L@Pp z?--UY0V@kjV`FDUF(=hVN&vS*h^l}@$qX>7Zb@~tK@(is<0^3JU6OOHOwd1%lmPTP zGJm~9`a6QEqI8TXL{Q;gU!gD1)`iO!QUr64(Gr2;)gHjhc20eJ0$P)Y>H@tU5bYgi zAWZ-y{c6!5L6VoX=I1H-be!Wjwv_?e@zKU{d@hp(%0C`1u|H}jGrj7*Kugy>tggNt zgE(KZB|Y|%p}YiCEp)Yw>NIOLd(t|1qJQ3UzEzeGET;p^l5eZfFFHa3ZO2eGeqVOH z*SeGr@Rl6vLEp@^#}YDR*0chT+-za$SHyUb-3xQ}vNk+pSjeX8(S}Dd*04kgsCNF7 zkmiW&;Vm1IJudr1Gr$r$zz&Yq5Z%g+3uu|p>N|IgHjW2w0#rtpHDT|4g{K`|aWjTP_NI^L z*!1@UL<9+~FR;o$gm`affu|5D1%GKNxDAG)pP*(lI+t%pA3#V?Rr;Gj8k*pNI;rn+ z`+utdP0JN!V(cT(pT&1;%5cFB7JiT*piD$1&(|A0sN4@W-fd@3)hl*UiO n`QgYf$5KBW>5cxA{`2??kKw*mS|C)A00000NkvXXu0mjfEUk1R diff --git a/assets/dolphin/external/L1_Laptop_128x51/frame_0.png b/assets/dolphin/external/L1_Laptop_128x51/frame_0.png index a42e97fc44a4d901dc76d92743252777571f34e6..cd0f0bfb48ca439b1826090e5d4ff5c594595516 100644 GIT binary patch delta 552 zcmV+@0@wYrCba~R7=Hl(0001Y8$G=M00I0-L_t(|oQ0CVYZOrwg}?W9HnaYK>>@%M z-2n>=5z^V2r{W)=jivb$f>o^c6$&;Yb`}8xmR43;2);$_SFi{e*eOyZV0I@c*;z9) z$6|I+D^K~|d(M5ld(l4{$O3XKq<~cdp1*WqG6>6!qa2Ha!+%$6KN@f{m5q~waH?r9 zI@ko!YEttEd*f>X+fXK-81~wh-qmN)RGLq(X)Ki-9ln%iQguAl2--Gr2>@nL$JjIg z5#X{KBrepYB&~r9fCbJi3cc?ds+98QeU0L*ZBr-#CU5UTZwm_yJU7_;uAUr7Cjx6`c40`2d3Ij!E-^{C_mOc`d1ultyc#IBQ!9paLiy z^DYoeno9~^BWOp;7klAWon%&ssDMz_ph(O4;=p|UV;i%UFMu?JWhv*<{i#08Btbub z;oI6+ zYfBff6@U+R^(ye+uWSRdI7}dU|oFf<1nDu6}W>p?!}ckWzw7PZzZn zN_r?i6=R$;Dx2)g9|HtJs`~|6fSnuZ`o8Lj)zAlz{ydha&V}p~7McoozX{=VcVGn$ zV$1pGJVqlAk7NL{*_ZL_b!8Rfj5KVM^y=CZGL+MGeU&tP8@HOtK8nXvlGkis)V)-c z@%(~uU0e&k+IC6n&U3UNn-1BbY=VGYDfvFvpR!@gU`s)*j2z58-@?Q1^TVU_Z@t-TeqJk*__U`v27pV$;*lGH>T;m?s<`AHaAQw<_JUX z0-8FR4;bBET`t|3H#YzZlS>|$!53XbVx4|%-4%U(Eapp@({j)Zd*`c{#PId=^$cj` z@`>?_OI^yq{>SkLF3+4mR7nWh5WxM{i$2{(fZ$vyd*jol>oWGn$asj^^~9QkZf31=5il1b@IL0;=Tx?`)-ac`9y2A_q(TL1@_DFJYX+dTh8pkRLm*CiXQ* zRn#meR675zJn?A!`IC=qp|#nq?^2rcr6#P8|P85sIUR;)DyhrNy9IU+r@(#G1*i2HjS-E+vKLPigV5Fa(@U3 zSwpmw#2%V%904r$i&h8_9AVZimH8MbRNQTqg0=7kfy^aS)n~#IX6R?)vw{OoV#;P% zKap0mEk+`3F}D56*MwLxi~HBw2^jkoZi-4mg(>P7%frL!>#XIwVjsgqX)^U@jZVi8FG)e z+o`q`qh^WfW6!k5oX0%IpuvzuQLE+){f{{l*S2nuNk3hF zYvb+Q+iM0i4@!n=-PC*|I(eEg#G5LfCq){5B}74*Op`SIr;!aMt99OMiE35tGA?~~(WvBH#c;uyDsnO3j7iEoKUSJ^&a*0# z6t?GBq0hxTyR>%W%csxi*@hIBbm)vWeDc^u+~v5d;6THB!TTdwb$d$pH15fMVG(qM zU}56j;Mrhx$jyRy*Kw0$5pgI_(>t{wv$THqWk;U3?Oq*E|8lpI-ZOPMb?L!X!6#-{ zZM<|UrcF6lGt6ZmaYJKO)$i(SHLSmkZzmnDZNz4THtDg@g#iz@U+eg0F^HRU>%F9n7SQBiT zN8)n??^6AZ1<@J38O2AR(hsJM?+b1{;xoXgc~aOq7*l*!qwmra?u(swwR_8Y4;(e4 z3!`=_rB`Np=d*F+J>2oPId2mmwT}0UWd#2nTr|sH zbYEOGTO?g3Z5JyV+j{E#seo3^R+}weC7Vl%9NKg3a~9gh+h+7|dLKO7>fu$YRm7@Q zEDWoF^@Mf$)st89ulBxTnCKe!hUd&!MtlyPnBMTwW!fjqAmY#Py(Y3zB^bUk9&G_Huq!T3vd+ zwEiqhXRabAt}agRq^fsugLcG|vri<-UET6eC7-0+%ZVel9&c5RKh*w-fkXW@cysW; zkgtbcMMDK6z$zFYkwtCQ8nV0hvL(I6QRA7$m_vpG-@3v&XW%-gydIfiocccHUFw%q z8I9@z zo1Cn!5slKA`5vhYnmW24EbI6<?>?6t}Jm&{gUitSK&bDoomEbm>X3 z|7%vj3XJ@a? zO32>6VQ{0e$p-$ltIx~o7vct!yA-YwpJ5K^e;!Gk^lbWYz#yQKT~xbHZB^^h*1RaS z#V=C_^M_2fC~esj-LX_qm)qstBNQ~ue;lkCd@7h2ye99{_UGM!FJFHx>O39ma3QY@ zkBGSbNov6EcBUhP*WQ+EyTg#TePAin(XRcAq^u(AZ_!z4&rkKC3n`1ml7}1)F_164 zwgQa;(P%ns+6X`h=FoZtA7|F%1xG1{)+D-nJ6Ywc`( z+l*QiZ>cgG=My|AvfNVAXY2j2$@tTO=jD0zf_kfquKSRW6&sSHdGm;&z`h$(A*qrc zlQok%J4T{LzK+a%yj{}cnEzE|RmRMcPnNAYc%Xz)tzGN^AY2nXY#s%G&)|??1OS3i z0Puc401z?&K#`Mk-PstN5OuO66Tx5I(r$C<}Ln$02S`UQ`3|ukn z8=A*=q5rdt-=cZsFb*B*Lg%rAxKug_-}Dce7z}FuVZ(nxCI-`4{9km?_y0Hfryd&h z7mgFe4fy6J8Wl+opa+8Tc%V(_Uj}jf*nBq6kNqD+|C;{hh!q8(w+N10CYUvp082JC zXho!rr3oCI(W5bG1T5at!U9c1V=*Wc8cnn?G9;ocjfe&)b0WqZZ>j%N#_za>M3NcF z0EaTi8Ie}Fcyqj=Ine-zw=f`~EKo*2xi%~wpTeTjf9hp|dX4D5XhWO<6@k;o&=5xY z`g8;Zhr=Qa_3>D|4-ISRL-qZ}Cs=Ul6h50vX0ro+rm53UFTgNZJrr!KJ%!3-t@uUj zUnq1-3ZHHQUrAa7N*{qTB%|@)k`}Fl!V*xZ?@)U-jp-Zq?@+Wp8Er(s7!mZ1{tXIl z85)I8`G3JQD#4e{4Wxj{!wjS_=tvHW0f+sH4Z(sPz~+LAS6270<2K->l*{&I27nX) z>vFoXKfZ_4lFnrY(`h6wI}r9Q!3oUYIGBXNVDvFY<~X#u!Afw76-ulftV{How|7ATqv*5?%UL*Ul~ z;%#GTMs~mZHuI%JGfGONb$PklnxFcjX5+S9hsCrH2j38sw5I0>52qs&<|h6ccs>82 zZ|JK)X}(0LYMYeO-}squLm}Z1CBSnMwRu_@vVDAn(E#*LO{zoJz6tRZGd*)tQRP&m0a0(T; zC@|K9$@PBR zs-g0xtUICr<$k1P;$cE;`6}pKF3jYEa;GLrX3MN|fZg5XoyKl9;nX!=Vzx*hg$*^> z&=S*OQI}}J1;j^#B*?HtsNiGP6(?h4nJ>sLIH25BS79(W@*@>C$aS1yj~whepv)vRXvdpnz`m~K_OY`xA~ z;}5%=cYi!~ISsbUo)(Fa*r$f!@4Fo^GJXp#n8`M35L%~9x(4hsJq*$6)^YT82 z+kl$=1@{aB6NZ z>ev)fnWyFn_U88jHei;1q1UWhn%7=PBk5>#T?1*x{@!b8B9(_D^`UB0mjYnAF~(*A zNB}pEAax;@(kucO01KQwE;N6srK4zHAzR3f{TOFn4dlYcpQ_=GM~~C=#>!^nX)@^!F>F&Rrz`W3_@6vaxOiXYC4ew ztpJ7}9cea_$_6b-vO9nQxN2}{sL5#ASTF~RkZ*B002ovPDHLkV1jBX{Sp8G literal 4917 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 F`#+JmA3Xp7 diff --git a/assets/dolphin/external/L1_Laptop_128x51/frame_2.png b/assets/dolphin/external/L1_Laptop_128x51/frame_2.png index 93df45f84df55d52a5b31beee7b14cd3b744e8e7..d8a2623b44e72abb0081747f30153c6b3361465e 100644 GIT binary patch delta 556 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 BF|Pms diff --git a/assets/dolphin/external/L1_Laptop_128x51/frame_3.png b/assets/dolphin/external/L1_Laptop_128x51/frame_3.png index a86b5e744bd7adb1cba70fcdc13e5ef53209267c..d4ab7525c683c73b5b26ae5d0def93fb3d4b3ee4 100644 GIT binary patch delta 551 zcmV+?0@(esCbR^Q7=Hl(0001Y8$G=M00H|+L_t(|oQ0A-Yg9oPg`b(d$*v!eT|`Ku zd(px|gmiXh6ztW;(iHxH#VUf30TpaS>?{Hi{1IA+nMLg*SOg5@3MmpWyEhoJH}1Xn zSj;Y%%G1sBp7))PGw6g?WC1xQQot$&&p)~_SP65}j%r)%?SH>p{5=KZp=>kV3#X>` zvV~0%jp@`P!QT8{!ds})FZ4Szmd>?T(oi}cUe~r%aj?H8jimZ$s12C0sY?McD{+j? z0+0YMk05m+meMQ&7XS;Kn-n^~)K?`Hue;i4<})^f3SjX59&}c*K;HwM&AXn~5q9pp z9ytTa!Ph`45`Wc<0POPfgKtjWnuJYXw=wq>w^a#@b}O z!$-<|C$=m=_i=#PH?0VO8%eGI0~G5J6deNqE`LFBI)Zt5$c@G<>-IYoDI50rHFdK)?!=dScSt_Sr540wg&BMt;vA0p2ktA7YNZV4; p*qS;D03e!WSCVAJNm>2}{sO>57|b7@+mrwR002ovPDHLkV1k0z_x=C? literal 4914 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 literal 4909 zcma)92{=@3-#_*(ds&MyMYb^;GiDyL%~-O=B(l_)8DqlCG&9Cl5*2zVRF<+7iIA;_ zEQyk&ge1`>Qc*&9loa35_Pp=)^?u(w*LCK;&wc-YzyEsw&pAnME_TwAYLWl|NITdQ z+`%yxywKu8;D6Ay87Mdi)2*DX0HFG~)EBY{07#lJY;4@P?snD?2ciuIiNj!EC?g~Q z*mvY+gp){*loEQH!=ujKLkPMbdEV3t^hKZWCz7*Nck2qtppC1w3Iyeegws%ax0|u| z-8Oj=s^!*_s>C*l>mpT%Btw?%z@HW6S3l0qF1;*gy}$giVQI3tXQwidUJTF76m=9x zy`wl2ZS!$VvfhyX8*L1Dq?}P%3u^bI!Ka13ju2#LX_EF zNl=VDGD%Zm3_AJ>cwsNGYwyz?hA*g6H#0d7jy)q>MFkPwh76-;{f|#ueH^0}v4sWO z03CzuPWl7CKKBRNSJwkd(_g$%qmTQD#5&{Jy1$H#(WtMbZYyDPtgTO<5TjH-HPGcQ zt^E1E@=Ko@u)8a1&*iy4VHJ|G-7w(xv!#Fsra^QIFg_6NmFb& zOheQvCqgE_O_6vg=|b{dN4eTF9j_(p8D{v*kNKxR$+j(@Z*Nda>iZ<`MoEtC57W1d zc`v3bDG#~7)b6)Z$h!6k0f~tm(LeDgcV!y;m43ZwR6G9646a*S_fWUOEL!>F%^rob z0s{7e`l(`fEH{h;HoHa3V_|GzW~=(AcsV%HTn-$ADJl|py{t8jB~B~oRLbYV*Mjfem!(jluh zOQCCvlltrRfpX|$*=+&UvtIklHwEra5+?k?Jw)?Ql_!z+!%T%2p#Yu6kLz`~sSZkj< z#ZH@vok_RfR4RWd=^(*q@5bu%h~$WDQ`>!x=~@$MzV`PwX)(kmrygP6^FJnWImND$KGVHMD)<0a- zFEslU{B@HdLGN79zT|i$qw6m06!+xI+v_@OJD+7lZ+6WLKjE4&tUau^;wDgZwpgwt zwWw;>NWqOR_qXm(ipqqB6#o`8U^+fe5wwsj?7X(~ z%wwCdIJ}Lyf3t71-F{CSVw>wm*FxgUJRScN=dw#0c3gJl`aAj<_y(7G77v`P%c;xc zSMdK_5ZX|4EWTSUS2WkBQN`~Fvu0|`Gxeydyu#r={8|cLhEhN70=e&QF^D5B)7@S?qq_J!gb5dgt5S0Ikrd zAXW%5QOtA9hs@(oA3jxl>hqLtZfG_Tl`}_({v0tiyZ(dwY(S(*^t~vb$jZ5?zqJ;H zmq<%y3lHaBE%BGG$2^Z|`l?ah>wDej{)Ft8<}cw(7HfKCycB0B5FG@hN@vC)mEq>^ zwhN(cs`JTy=AGP|)V|cEbNF*Ndh-ySRpV8!s}|XhW@={ci@!_^lYazV2W?36+csEI zRdS)E;S|&0V|h+uU7}I4hJR7Be)Pjr4<*YyJoAsGC6jOEBoaH0bZ8{)@0q7#5N}4W zj_!FG=xtQqTuu+MaF=FoqcM6Q3szPZS1+3`}~X?|vM?(kxZWP>sT* z`#q!Mqlo zhy37Yn10Mu-NE;-pOn=dFbq)kgJJY4bYphi&~NyhGJ!ocyzjAm3*~Ho4R6Jz%jJ3Z zh@VW8Or}HTtBjQCg(uIpxxnH22WmG5_MAFOTNf5B5q&t?&S1YmQ>k$&-?O>WrTm)T zOWy~cWnN9q{20yX;og{zub0BMhP8)H%dlmiUi?@x9n`z0#556?6*=QT@uCc0NoJin zv-b4SGh5b=ZcsB{&#S*ORNAnZIGWa{R8Jg4?Kl2Bo-*y*@@|hw$R$=`?K(}Njzb-J zF`7$XXZGg5G~cYUdFO%NFX!rV`~3R_!p3-Ad>#HVK9Mh-H@{`*LFkib%Z2xkC%9b9 zE5*U08|T-II9<wh*(TtDw5jovY!rr z;#BvgESdM~0PQ^FH%eR;V95mSSI7c7&C^^TU?2c(O*CX6P{lZ~4NzdyZGG zGX0vGM;BhO$7gcW#?$WqG5Lo_xX0AB`pihy$nq_*aWSH7k%p(4`@a5}%Tqm}g&Bp# z9ljl(HN`BhS#+x%Sa7@rpWZB)mzqy3DLvI1yE5ut2Q8UV~JBG_a~FpUQZpwSsjbLeza3lzejnnQP(I3t|d zHnbpyeH4f05#>UnL#N)B?aCmrlxKTLTh{d79kvJRSUK<3=)hUSSP+0M?th?(3Ukpg1|k07(*NFxM1G<4Om zZ_-?zJMAAcek;u-MY3sdcN&)!#-Y$a@s0n0iF{D=4ubsV)0nqAl84N{RQB^)f)cD3mddj0!-)jHy^03>#of zgW+&ADhx|Ars8O(C=*iz;u{`s!=aIREDnjq3i(;4Za<>{L7|Nh5M5_7g~42ni{8IL zXaq8kW)58~S{T9@hQN}LxNk*^G(e#7KiQpGR7POrzl$P`Nk~&X$`o&c`8QGU$WX~V z^8YJLrQicuoKP}YJd98>od#z!=}^e8+~93kAuJB4c-6XpU3UOKN;#}RMhLj^zdlY^ z&&T(45@;L-pGLLiutFi<3LMY)O@NVDYa|+n!eEfrnAPN16S20oXe0t*Vrz@TVr-#5 zu+-la#Sbj@KVsp(jIn2M!Q@2#IQ|~Ay+39l43Hl@KX@`_^(cc5kwKeRm98%S&fx#9 zBEI9pgJ>Y-&(!`VU*E;JtUz8knM1RpgH`|A;z2`ncQBY#RyY?do$nw@5SdA*fxQ(D zU3C+_+JwIQ1^*uZe_Z~y_b(0Wr#RRJSEs-FFL?8-gVUHGH3#g^u#H^s$sy?NK(Hct zwY|#rVZKAG5lL7Yo)_8Uqt%|E`!Lj^;-FHJ2Z6Fh<~V6A6RtG_V~q`2|hn&R_UOAumR8j$b$9L-F`2DdDtxBY;+0?P~X0z>5j4I0ROLDsfF6H zQ$9~sWG`(>(h@fxLs~YRY)Qj=37yUB6141FK0jcyuUS08r$~U;_eQ*Tuz1jkt`t05 zD`~067p{6NXxR~f49>}3eBB|?&ri(2e!clvA}vU{QA*A^NwC!sdBKBlPf)s*vsi@t z7+RBcL^{?ze)PymX^Y;Z)?1$gb?VlqO~u`sijqc1^*vTRvNYp1;4&~hDJ7^*xEi3m zyJuZA*1BfQ0f>@EVD$6%?T?L-PJEKyJ2bGlqH5tvy6YW|>rDqB?t)`L)$>zQ&hncs z#nZ+F0kzjue9T6K$NpINzdZxVe8AirO&26J+7$}dR{NwZOi8#~6nhMHVp~qV57w}I zlkn*97*^)^poKf(xwuti$=)r)D`P8SE1Inq4h9M$Pkmk2uf9Pz5M2lr*1O~W2YtdO Aj{pDw diff --git a/assets/dolphin/external/L1_Laptop_128x51/frame_5.png b/assets/dolphin/external/L1_Laptop_128x51/frame_5.png index ef1a75b90e1508fb8835ca398a0d1ebb9a77c00a..0f0528f50a24de3e57d81319473248d9eb056a1f 100644 GIT binary patch delta 548 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 diff --git a/assets/dolphin/external/L1_Laptop_128x51/frame_6.png b/assets/dolphin/external/L1_Laptop_128x51/frame_6.png index 7e148697b1cf2d268c4c2e74a6cf921c3d0e6f82..1c06ae08f29753f2a81b2f07e5f501475f523b9e 100644 GIT binary patch delta 550 zcmV+>0@?kfCbI;P7=Hl(0001Y8$G=M00H_*L_t(|oQ0CVYZOrwg}?W9HnaYK>>@%6 z!%n9lLOMJ1BKQYrV<-6&QpReh5VR4ovj`XzD=RB4EZ(AGyM={dU`I%ifZ3g(B(vtt z9E;gOQ+dko-gEBb-HT3XAPdMbmpoPpr2M1h$-pl*j&dya4}V^+{%pX>R5nib{h6jc zbg&7c)ua{?cI``mZ77qE40~-$@7fb-D$S@nL$JopR z5#aI~B+l2RB&&h*fCVnh3%ws2s+5YSeU0M0Z8InVCU5URZwm{&N`ctKzYh;pL~Ky(xH;*x() z$aibY3M}9Eu<)!?1K>u?BR*_yfN@x*3{w?c-FoaW8If_M{Jv!{-F0k^Wfz$ArI33) zD4gXy@GgUsG@%o)0LlPN%1EiDf|JxkF#xZ+W752!IDZRoUQ4PZWzp&=&fAs%Q~<#- z>jJT)nIw-!(2i8h_d=^qGD}2MfUjy0vT`;*u(bZMjpJ4tfDFGV74`}N2e3`{-I$1P zt7DC)Qq`p|Np_EfF2Lpa_Hobws+EO0bP2Yj9L#!XPLDYBr4av`Pgm`273U;L7FyC+ oDq1^DM<4OmC&`G@viuMH0m0oDOUby-CIA2c07*qoM6N<$f=)pJ9{>OV literal 4900 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 diff --git a/assets/dolphin/external/L1_Laptop_128x51/frame_7.png b/assets/dolphin/external/L1_Laptop_128x51/frame_7.png index ca19b669fdbb968b7ce8032fa3597ab83b76b28d..24a9b853a68c78476ec6ef0f86744af4391b90ed 100644 GIT binary patch delta 549 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 diff --git a/assets/dolphin/external/L1_Leaving_sad_128x64/frame_0.png b/assets/dolphin/external/L1_Leaving_sad_128x64/frame_0.png index c7751a1d4b721d28573bd3f3614009aec223909f..011570b2c37b21349aba25ca232c65810bd2e796 100644 GIT binary patch delta 578 zcmV-I0=@mG49^6R7=Hl(0002`twPcO00I_CL_t(|oVAd@Yg17i#XtA;VMK!sVnIZk z5(g2K3S9)P?+wyP(52wuAc(j)ICg4Nb#QQTYd66$L;nMP)xii6S_{R&@Kj10L6a9# z+E-uhI}R`YNO2PVE|>e^-0wN}7y*DxcH*#W{sUMvyFgL@)PKbqQvh&(03)LQCuY&_ z2h+v!-`kd1Ec9+4!9jEQn>~;RWLv4%R%!`G^(7Rtt**LCt<=(oP!8z>i&M^m4Fl?Q zI+B;#>2N^`<&az3gzLZA?i_9O=h%B6IP(i=>e^DDVsoNY?#mu6AM~V+ESN%3^;bRF zjVzc#ISsP_K!3-W!vOB7>hfs}^r$1$g|UH-5F{&!IT-4GKG^Ve~z2H-&Ns& z1o(e0`EIrYU<3dQV3iI^D`{p@lxz6b`}>aIF^(yJ3g7^+1q49xrKGh~dM%})997@; zJl=o+#h#?CX=z+aLOJZ|g_8GZ;t~KelD02EBDDfs$bTxWce^f8y>7Bi-6vK1ut0Fj zcV&Sn&*bN*z_X!A1M0f5yOIt>zS1R}si=JjpmHTZwo<`%?|4d*^*LamJwFfNDM`LI zW~5i^%_fpO*>-%~e?D^d#n@O6L{kr*j=zhK)$2w!cRo<#$cf>5=eBQyi-|9SDPO%Y zS~HV?(mR|dU5)@RuGMNTW_uR=Tx#7QseogQ1NfLctd>e8S7;W17;Xme9eeB_(EP#x Q2LJ#707*qoM6N<$f?^^OIsgCw literal 1575 zcmbVLeM}Q)7=K#^mijRxsAw|1)bEe$eQ<@|LBZM=+Bb5`C0DzI^g+?2cmGGUXh=bo-imetXCP*fSWEb61m<s0S*EVw0L5Io+6W2v zpovthQ@tSNuvig;7!;6nHGy(Cjw9)`+J(EdE`i49A|y@{7(rr$1|{Jf=SQyIt55WwK}MKP_Eg+iR11EJ{F1g~c8xV-qx@p_H6V4%SC_3BeCtp66=yY@rtW4QGPqLfLpZFA%^#^n8(v@qwat7H2H@a&KwusqrMS<8Ec*M1o1Z0gwW4$E7! zoOSjN*|+^Ob{Ocp*JZtZj;5Juhdvww+6~^xH#PU{{$^yvky}@j(PZcCabs^p7F@31 zIHBz+k_hfDn%(x*?#D^<;%9!}YMs%sd2;{N(?u5#TAlYl>dq>#qcU~-c&EJOFL2g( zb|hebtF3xs0M$Fsmr^UH8xx(&kYP8<^$PIl(gAiw|A@+!_c_q|`Th#&Ov74b_ujE) z(~jPo%EfV~SHIQ2bIbXzGnYWsGyU6j8ArJq&x5XlXV)@;qirb^X6wkV(#?95gH(a09+$+Z?)Lv@%$g@53Yd4B_=Cu`W zNT^%czT{!Z13K#)pMM7qr*tXfhmj>c3G(^p60Q_}yfm`~SDeaPPd6rm3wx$zXm`=) zPHghcUBCRaWCDy5UsW_Uqua8y*>>Xj;fmqMT}@k4EUN}ab@kbtX3eBuYu;R!vA2qu zTJ<0=?~PAo2iCPx{GENH-Upw2Fz>;f-sa*)bQAOUJLaBqbz$Vkwv^KN^P-~m!lA9% avIL-5JF)tkYN{Si5-^)`jR)sD*Zc#8Gdbq~ diff --git a/assets/dolphin/external/L1_Leaving_sad_128x64/frame_1.png b/assets/dolphin/external/L1_Leaving_sad_128x64/frame_1.png index 20b3a71045078ab145fa43dbf97e18dabda89d58..6ee8edd662d6e45c8ce26af062825fce2a6507f7 100644 GIT binary patch delta 587 zcmV-R0<`_L4A=ya7=Hl(0002`twPcO00JLLL_t(|oVAlpNK{c6hM#lh(qu`QAV_2b zLVpm{t~UNGLI_&4$X&FNT)P{g7{_Q)xCnQ;Dro6Kw?XEW7TO}H5OLvfrJ|-q&eT{l z;oD7Q-2p{OdCM33ydf?x0uEL zW{}I||K2uFeK)`NV9^vs`V-I!$d$CDjCX_=^fgiduy%P4M93DPIIBK=P85oSDiuGb zig&qaR*Gavf81wVKjHHn_zfJq->lH+&3Q=efvth=sU}JJZTlBJYV6rA_pd%x*5{m5 zk|NonnVkcu7=P0Vz+xCUwG z)GJ9+q#z}Ve+>Cv^2S~{04FUur;~|EM%KU^;3Cu|<*_Ee+wcl?AKvF}qb^qW+&w8z^PzZ48I>6)ki8Ix!4>9uI zq&ALgV?^lr+W8QS)bb<6cC`)qo~=NDsVSe|PJ0)G@eEjFlCNr7VYR!vI}m7mXN0#y Z_ywTfFRSzn$6x>e002ovPDHLkV1f|-7mok{ literal 1589 zcmbVMc~BE)6#qg9a%k~r$(SB&Hx9OzWDk;%U5N+@DX}CXVxi+q&1SPX3dyFMg#;OG z#G@8EsEp2_s6}SlI@TUkj!|?-t#(?p9TgAC;8nF)YOB&i9glQ_#P$!zKe{u!?>pY_ zz2Cd`y<*F&lagi00DwuRLPLolL&7^ZQ7n9~B(5_HVme@{zH$K(JY4!BFp`Eqj+NwXd$71dD&Jw5>qKu&JZN6{4w57`)}+pB}G_w>S$ z+pdGl)MnJ|(=#r2;ZlxSxYSZgFRh>nJDfWQ$_bK!0T07dP|#E9^^-vzJZ6^^*3n}G zhQ?I*3LX5ARJpkr(z6@`Wh*fSjiM-&O(<=sLu+FQG!w#6978Z1!PE*IBXKo}siE-) z7W{E`2U%h;j(Zb!I@rbYJ`zC!fq*iQrDQoLf)NCPpg4l#3PD5RukrF!P~r80x2ZgEC1=8*pbkX(dDCA5H^pdiSY^}#0j&)^vzu)%vnNlQE7o7 zBaz65KYnl)fVg~fsOvT#yL11*g3u*N>${*sk}z9V zYweb-N*$WuyFIgBzb&w4OXs-(@r|418mRC5G7z3V&pErSEkzral&5}8pBzn2OI|Nx zCs!65R&O4NADMa?pk!0p&d;It_*v&L(A;!%aKaBY-G?EMDE-0~2|3^OyI4N_t9oFO zv{f963ytiTLaK{rM0Km~_Jh9XHz1!@gR7zwU_)wn&$hro&kprF($K^e&XlrIRmL}x zgLvrf#iV(EG!}`I!6Es|?Om#FU0Z+K5%ASLvFUUZc2rWAhW~u~oMr1PmNL;izH7)* zRhun8vu+az9bA6ry6JdB!myQ;uD#ncK+m-Y zH;$c<{dsw1dggPW>t^S^`e)KSoM&W>2+lh`CA_JEEExi2wpIEzs0$Cx7P@w(=7Y( z&&)rwtPudnq$ieA`~&Ek5@_g8yTrzf0aP6@;>}Mn-KGzA8h@SNx9#M&d$8y*2cv-E zS4m1@f+f9#%8Vfb-ocXW=f-9M^?GT_PIxATveX_*ZTr(DFtq0bwKoC}ysyt6dXl%B ziRa9iLUGl+J(iTj(yJ88KAN-h4$w1Z5`eq<#M7>nd`KTsC_B73vJKGx-a4OiBNvhq zNs>ZYOC+yt1b>yHqFNDy(oX%bmY);`A|G_pSI?s%JY%|w)hr4WRdiicP#dsN5L69- z!2K5k7zu@Cu<23+bb(f}#_~0cJJ4<~ZLI>Qu13t|RDA{=6^g=2AU9A|00FEy;2fT0 zAg&Dn4l-cU{j_p08bQH_Q#c>#v?~Gg&W8XQG9O>rj}pigWluEo00000NkvXXu0mjf DpX0Sd literal 1386 zcmbVLeM}o=7=J56Sp%eG$>zZ5wWd0ccX)?AFOl5S{hdk3it6APUu~^9<(%? zoCt}SeW}SpT$Zu9NutS?m}!={4Z`9Qb7&gN&+oCZp&f#02=pST%c*))K zzRx|s-}5~jZf+{Em)ijVCBf~!2$B|h8;c6iceZF>2#JlRKW4V*aWgF%5NuU+31Y#7 z*a0I@RQh|qg!KRvq}6E5jD>azvYv2?IU8ptkwjKigiQSO2!CczF>^We8WAIC9O z@!-3-5EV*#VW+x1YrvLlb5zcD$-II$Y{BX?0wPF2Q^YcfZY?EbJoqB7fX+EJiDQc< zW|s$F3Mv)~V_w~WSe=t5WQwA&I^HQ!akm6{ss>{yh9+r-q&b421%?x74qJY3s>P81i^E^*d49PGAvLI6Znki-oEmfIk@WGU9s7X`R zH7v&{N_wy9!BMPBNhFe?&CFS?Dpw$Zvtv&(C5L?AE%-!0wd9kEXfR^xS>S2 zcts}MoJ%1T(Z##@S}HD!VxDI;JVntio(;Ho%FocW-|MdP^M0?FcXKSw(3CHa4QeS< z)MS|Vts>vcSoVQf!D~R#)QzaFcjxCI+^L&-s#8y54C`dD>X0a_T2AwHu1iZv`=Fur zK_y`532d>OC&-|~?tC^9!I z|Cyb<3JqlLxUviAva(H3Ln~yUU2*QcQ;7EL;qcC=AIXJWs?A6vB5fUV|So6+xYx7qOH%d{_y_jn@8|JADgN! zdX^jATXpsN)H->p>Dy2_xHtby;~ua9&~W^{hhD}1hz=dSbRpID(T7&a!DoRs$$!z(n6IvAE@ec0K&<*nb*f{(6SsL!BJV0StSR zG#V1E=`9g#r9kTGDG|&b=Lsc((qIhQ$(58SKrfz$E%{=nJ~)URpmw9#|BCCNev7wmWopXPlY3 z(?-*gplCu;v>4#YjS*2G=nGg2LL=dUL<5>ssje#?g=UuT2J>e1-D;+#2`DwH(JmUN0CX)2p7MmB>stvLMGjRnzWVnByf9GY6c zA)|__LKB^mC8?xmA$~`g=EF@~Kwub-VZuSaIV^;OL4oHy49n1=5;u}FEh#6% zl5G{)p5yv&%N2tLlq}6iXj-P!2eGtfX=Yl}G1fz}SVL5j)m-uBkz$o*gAPGMeI67SLgSnqUr%kb!39bM~tr(41Aqx)Na|r>Cd)o_p(C0LnH-LjHt({^#A_ z-}NcBcmA_gVnsbze1kG${P-CjeHkLfgAl?- xIm5Nz1U@`pwLLO=scJh!OV^nfpLT|U3rwzA9ysd$U|sPK7YTQV4h1%C`3IS^&G7&L diff --git a/assets/dolphin/external/L1_Leaving_sad_128x64/frame_12.png b/assets/dolphin/external/L1_Leaving_sad_128x64/frame_12.png index 1edc9348061162f58f2ddf1ed86ffd4c7a1dec93..fef1b5d50a75dfde6e641f08438c239c6e3967ed 100644 GIT binary patch delta 385 zcmV-{0e=3~3XlVk7=Hl(0002`twPcO00CD?L_t(|oVAfLPQySHMBgq}5+S6R0*Njb zH4@x_P;dllu0fT!63#ry@p0+@_q03QSGa=-L& zvAWfJxVQrbFmB&lJd(0jY%soo@DxzBw9kRH7~Y-R1_*ZR(SE&!U$4Qux%I6Y4C^-D zMRbl|gk3-}lX~8zQj(-p-Wi3bFyITTu;620Kx7q}1ur(mnlh4$f8aUcR-TAog_MM f6gq@n^5gLhM#h{>$PID300000NkvXXu0mjfT)e67 literal 1365 zcmbVMeQXnD7=OEVr4$jPk!7Iqa)V_?uJ_U2*1N2u(7Q>Ij;5<|2_xY?-fqX%yW{Rg zyG3Bb&BPC6_%)&?E+jhsK#ajeQFK)j(W%jh#-h<6YEVLefaoBG`F2~Ue=PjrC3nyJ z@%*0W_k7)B$(H*U` zO^x6Wu?Z?+#$czmuFrz4eJyFFuS?-ne03AnnCFp!EOaC+pY7IdJ|DrS?eb_{Iwo;! zTE*##;4`G!5=ks(SP*Ln(1b!!6xP56WGWMuAxEvk7>c1unjvYHU}&CUd78y$9~}9! z)C`{znrFSCT?FrR9Fr%>TrL;L1p|iFLDC$@krYER41qKVyH|IlJfYh)WeWnd6-zT6 z&Cs!uMM*Y#oCuD%&IFM)6Nx#)x;>jJlr%CgnIs*c$ZWP0*|fIpq~O0a=GC^-y(T16 z&^CH31yv+dQwF2#-P}=05wYPnS{f>g)GZiFPZsJek6BQ13@dFI-Q_+=b{dXhcN!+f1Op6Kmyi@qFP+?5s?to*0<^U4 zP;Iu1EH<5HUYmyk&2kJ!NkM|*V1@|M!4MIaCDcEmOal$sAQh}<@mak3f73@IQe>%D z{?j|t*KbSI0L0Gr7 zod;ex75YE~t$X_a-rEF<6OOyMYkbGKiZ9RQy~PW=#u*n@T^L^fGiZt4;Ytz}g6q(I z3@E&_u(toNBVI7*tBX~D2lIOl9<5BCxUFXQN^g3At_8&>xw{J2b-#D`#o`;lS|0iE zad>=r`=erg`_b{sjxf9_dij<&pMTDu{_%J-X#KSP$eAH5F|e`r54Y#D$`#reICS+H zfAVS9V9ih*d|Ux0-gEu3&{@&H)pMh(^8Jw$ge!fPQbSMpstQdPuWsI1d93PpvBy8@ z32$Hfo6B5u+GF~Y&u)rdZ|PWi@J{URS6e|f7#*9qu@T?d#?fR;kxdv)}l+dZvj_cTh{o+$jJH9k1j5@2#42h G+5Hc+R?XA^ diff --git a/assets/dolphin/external/L1_Leaving_sad_128x64/frame_2.png b/assets/dolphin/external/L1_Leaving_sad_128x64/frame_2.png index 5752d80e6fa14bf9a7466a6cd78ab60e1c1b1a58..64103f1dba9878c30a53b126b5eef0e2dc7f6aba 100644 GIT binary patch delta 606 zcmV-k0-^oA4C@4t7=Hl(0002`twPcO00J^eL_t(|oVAj{OB8Vw$3MTBNw<<(OtB!{ z#UP0S11|+hp85-_QxOF1p-Wd!?h+oldG#cF3_RGShzK0hgM^WF2oJlAhUFIK4(@_8 z?#z5UteWdF>Rlf1!+Y=hc<&hjfK1b4am4-um@`K}M*mbLHh(4!;Oqk<{MHgPH_{5m zGKIgFEx=l~8GQu{O+t3P2|579RYjTAB*q=oFHb10Do`{QOI59TvPhoMz;-cnBlH2P z)wCf^#be%#U=tt)h?V3ey_NzXBWv%27a){W0Ocb| zNu-GlNe={>NRlF5_#h>oEG+^Ak?wv50Sb&f`BwCHSbu7GGGez4!c(m%TPWG}Ht&DODOS z1-<1midW2pqI@)PebL^{<#I+zqsM3besHWIdv<*nB05^lBr6mUwR)C(3*l`=v s;23BRIJ0Ux0>1QvBdF}3@R19@0mnl`zXl6~AOHXW07*qoM6N<$f|6`T8L8UAQWNNFgPG=_DBNR9YWJKO`Ae`M#u=Z-Ryp$X}j6D**0mN z+JICkA|Qw$)BzNS!(zG7f>0<(aj*=aBb0&^VUUTSfMB6W+>{3WgW(T%X7_!^`@Q#j z*VgA|XQ<M>AzWgk4~c$7|C3zVDz0_OK?+ zOoJV>`_e#(C$m}r1=ZOOrn-zFSxxd(cuJ6x3~)fC;UHJ;^;1EUrq?bdt)s`N2JTf6 z%S@Wbq@4C#IE@zoJXwn)42EIwWK!$G+(s85v57E&5jctyC~iOqoFWVqZh-q9jpR>Y z-BiBC+UHH$nKUJ$=%Y|H5C~`kIxR2EL2;5KQH($d0+BQjf0b9HgNWBZCT76`{EXo7 zi5}hyM=jDWzCtu7+A{QvmHehB{o!!;E~Egms@zIf&*UBW-)1`8!hW$DZ+&ljEf-< z)(BjPo@5!sXwb6=OY2D^ISF$!G##_^G`v+$;ut{~NOBU1KT#q~ccGkZK{* ztud_4>lbM+17f~ClJ7pO{+U=RO#rmW3l5$ykM%)r2`}>g65an8$B5x zt4{?wtx19I(zuWoIMT zgdjW1-#?)4+?h3}NfHVsjm)f;zsByw^bJ3>@5HrSpe6)4FxpdtF`{PTgR?huNQ%;_z9Ech|zWw))(pHkr8;=uUS|YkFsZ z%C~x~@^oHzOG3}XHyaBo!|!g}kiXot|MEB0Z(k}MT9~2#YI*#IbK%t|6#luMXRV)C9KIf2b!^3oI~&IK{8I95-O?Q= zcZG(?LObJ9Z`*q8TlTPX>(0m%A_)3NiTIT5Y%hW3`7OqmlKXSu&4=xO- zN%N+_ftnvKw;R7}Xdad$%NX7UvXbxL?a2wrpq#NuWi|?xM}O$H^lZzQsm1gD0pnau AiU0rr diff --git a/assets/dolphin/external/L1_Leaving_sad_128x64/frame_3.png b/assets/dolphin/external/L1_Leaving_sad_128x64/frame_3.png index f62078f8426cceae8fdc9a4a5146da8db9ddd122..a05fdf82532623b85fee981df0ed67e3efc2763e 100644 GIT binary patch delta 615 zcmV-t0+{{L4D*G$#<={xp27meb0F~CIFD7H;!HBKM2#dOX$---4dI10e^TKf{EJBFE(8SK$6sC zFuoIxOX0eYIx{jhxGt*1IA>7=wOg>vo3JB9*a zZJj!eBOR|2Nd+YhDU@?WW&l53ixt5&D)B`?#f&7t%ZL=80hJVTz1=}Dd~Od#a4sdS zYcm6rleIKM6(Apgo`YL&aH5Iz_~t_snjZ@r4Eog9kbhR~w-hgj@>Gp|51#A+sC41z z&Jw|`QxVXW_M;$4T9o22lryumOBG1I9!;A(0WbrU%Vh%!1i;`snxz0wP&f-H0rp?Q znOWike|%`pc6YnsT3-|3hYyrWCE|E0FG)U-IWRT`keAeKy(@jXxwPa79sr{Ur{7=g zZJY;5pJ1h$d;E4_KDtsao8s(RhWOsg!}rgu4uL62EJNI^Tz~WBL;xPv`3s1S(N=if z4IUQ7KsJfJpiu&6W}XjNC(Pw?IZvPwfCz2`@E3@CDa&<3#3ld$002ovPDHLkV1o7f B5+?uv literal 1617 zcmbVMdrT8|9RIadEaed@o3DW$=bW;6?cKG7-VMf4T3%~eg)T6L$o1|D7ih0*4_lZD zqHH>+Y%?xSjgN>Z8q`cp=G;cvn9)5lrct{^%wA+$1SPr|$eiqo)a?)BAG_r4`+Iyp z-|y%9x{dadf&|q(6#yWisL)(0$yVv5lnUuPr0lRsVyj-c_DW~~vT}l6nyKeR$jR06o^1H$nO+#; z*=)GnU_))*Jg$x}Z1!IgGdP%J|5C~`jI*s6~)nWueXi;2?OGugD7?C}NRz3XNhmEOEUbgxhPgJuvL?Po+vqnl?y#wU`Fgy4{h;Cbj)yDfcgp zhidyBOdBh@fHZ0v}Se_+u zCx$al21i&U=S1`b%OFOBo<&$%PZ)^|)Wy(r)Xu~3`6iQ*(CPCDB7?v%OI|KUm`oN_ zhiBmVhKx*O6kFu+i?oN~qP}^__Y~IhNGzG><7iRvIRv30+6VSJK@|LTf)~Pd8XQ_; zqZ!^4IZ2OH>3+~=&d0Ch*nFShh9=WY@(-ba83>#}X&r(RoD0!oIz3`^(o+BEU6~kX z(4o2v13ZOi|8M%V5-Dw@SN_vG(IcrLBg+S~AZ;E@6X%ge$S2K8iG0;gY0hHoR)`^*bYpAh|D1p4}xs6g<-g8n<1!85|w}+Xs`EQ>9=-!y^8ydLXXritiSf zHp2ueH(JxHK+@3F$CmF?eAT(b)I-7-Z@oL;yLW$U@kzEa_WF}4Pc%L~E&Ssjp+tDL z{O;8gWbS^|+DoSjE!}dvHT0WHRdasLeEG{?VyS%m=pBD*Vn>_o!Y3Z*J4vHTbaSuz z@m~~uC%bdkQ|9$Hb-4Ow=<>GScD0#mOkVW*czZY|VGl^^pCxEqTe}98-yWW)h7QfU z;e;HwcO9j@&F$2Twq?icX^WDPdpp$Ust%asZwYG@?ZtZ+-wvKB>&i-9qLS)1Tr;Nt zgp^CuKJo`PpSF(k)aB0N@q_i4KJ)Fwb7`sz7j$=Zi#LJ34xj*@-nq-x)}~ZPe)2_@ K67x}0P1`?uJ3A2o diff --git a/assets/dolphin/external/L1_Leaving_sad_128x64/frame_4.png b/assets/dolphin/external/L1_Leaving_sad_128x64/frame_4.png index 021e0582200da47411a7dfdf078ff4181342c13f..569fc7779a99f46e6e3b63dd0e4755c4362ac45d 100644 GIT binary patch delta 549 zcmV+=0^0qE46+1}7=Hl(0002`twPcO00H?)L_t(|oVAlNYZOrwg}*yHVPXvIZcqrK zCWbUZFtHRAr-_KYU|}KH3u!b>;uKn>vQ3#HR$D~;0cN(5kSc+oO<-3^5m0AG5_H1u z+hZ}i?q&rmea(9u?tSOu-1kfXAj@|=2G)NNsx}}@=%2bcvwu=ga2Aup-@+PK z!hRQRx%R0R$^n%6A|z<>$9gWQdo}<8V+m}ZgFM?f%FIl^=4w!NK?NshmSd!$V&Fv&fJV|LAB8y;Qety0?(n$+( z?+(Dn1wU@W93_6*3iw#o9*1eB*}r=qJZzLnI1>%o8&@uueJpc;4HpzQD;?5eO1oLi n;*lNl4<1yMoTSZbNs{~mI9lkl<_#uO00000NkvXXu0mjfNOSdr literal 1544 zcmbVMeM}Q)7=MqV0xCooqbTTkIK~3k`)EshClyM|M;D8v)={Gqu6J)sC%voJLkehC z)Xf+XG%oYw4|N|-WRB>fbK;^Ehg0WtVwU+4GtoH%bHRONOEeq10(JYt_{T1}d)|-d z_dLJn>o!$Zlub^VnF0WqY%jMtRT)v=q9l#_y`R+XP(`{@;#L+*UZsJPA+QLN2cq@> z=Yvkj35}~Rzybg?4SttfaXS{WycE!KF&%9<5LD3s6cmPo9KRAOs0aG|q8S@Hc^X6g zf*GqaI7mm(3Tyr4O)^~ERN>;AR`QI16)r#v!mMf_02K}m2kOKS8#ZGjc3E{DJ0>u6 zL`7L?#zslG9hIn6k|Ao;QaDeNBx+=|9@1;_K!(giX_BT0iY6!nPE#yxU?~GS_F$?% zS@5z>Tj`iLb!WzE6(z_LL_3`3AKLDRUZfrlDJg$v_iC@XHk21C5; z4=R31L}L~?k5sRiF_r6R5P_h>@zk&w8cUU$G$PCe2}(;6fj}&>5$%xTg#Xfbrgq5H z7=(lqhNOC#S1aPpii6ecJ>OAGQDws}lKpB~xH_A}*9V}e*llJ^z0nGOfu%hZ&3kwn z7fjHD>luN^O$NPy3!I)YG5MsI=eW3?XW>bTB8?>!$uRjAiYl?1^j4#_gtF$FiY=B> z#umrg#gM{@JdFGHtG-9EWa)FUtW}1bBFQdEs*CqQWv!%0p;{@3(mE}T<~TUsFUC$@ zj#X(iXd9IMtD#UTO96Bw&8+_!6et5jGbE?ONd|gxJ*Cs*CJ(3fkKSvfpg~9K@(tJ+ zUiiQ1BUDmEtXKZiJMkm6A!Ey@v!HICP7@T>5t7we8R|Tdt^6%leDmSXE#g^p(uVdw-x#n560)!RURd~k0A4&=nz`neD>qUv-YjkmuP36@ z?-&#IRi}Xhv4x24O^kHsgGndX*KJSRS5Pyq*7#HP0NA~0R?+RDrrgOz^}kL)9#w-V zICn({)?T0S;70%E&C^!Qc>vlRGeBNWbMLiBvjLWyZ9}HFwkCCD%8Ii)4^Rx5gzS*S6CWtMauTPgIxZ6f%El4zb`{p41b@LGPuaRK37>fKK#+(wu%Ei z7IzDB=nqZV)E%!@w^jEXo>X%ztJuIdM}ACj%{epv4*m18ednC%%fUd_teQ^vmh)a} z)t<{aSkhHl*fFlVytY59=WzDMbj?>GgpE9oMw&}g!Lhl8SaM|T@!2gtV1qYjYEB`m zyCWbxVII|6)i15XLAL?v?YV^<{qk~J%Y}ZWFj6RAO8fd? zE_rPJHgNTRTU7=)bL6$(rnG%(IqlJ&`?%`O_qLN=9pi!z;Qn&&HQ>9jF)3$Y`HH;o z(1gI?Qd+pcByAv>*4^gTPk_peV~^`QoNF>%Y^sqXe2cV+uKm(Zc^lx7I?h+OIH`_}pY+c1Q>;3^BLLK!0 diff --git a/assets/dolphin/external/L1_Leaving_sad_128x64/frame_5.png b/assets/dolphin/external/L1_Leaving_sad_128x64/frame_5.png index d7e88112a8ae23ce0c59cf2dad130af731798de6..d8ab4235c1a62fe60ba795046c94984db0193f70 100644 GIT binary patch delta 549 zcmV+=0^0ra3$g@|7=Hl(0002`twPcO00H?)L_t(|oVAlbXcKW9#XsN6!8JBQQWUCa z8%sf*IyebRVrbnRvbi}Z2)1LkW^iZ+p<}1gy+d&mL3*tYPSS1;YEme)BBqfPda21h zhu@`5iktXbe%$BYz4z|-#{>W}H{)?`{0FdU=fJrB#dJ4&4u7ovGKb_w3_6r*{V5NM z0DkfmLv3lmL-C;Lv8BQR@Cw~Zq?&gj*t&LW^3XDH0thmIx`&b?fGPd#>!BDp0*`nB zAca+73{a~jDGsD?%2f~c09$~3(xZJ1pa@hQ7M<8WZbjvh`d_XCk$EX9+4ofp2kLyk~)(1CDr7oL}#F>o4RMfw|cyQvdQh6DwI0*~y5Sdk=D zz)~o9s^>PqJOH#IpVOtf?8TfYOL`%0qYp~~ga#llKO7LmDyU*^SmE=V@jJ&(;+W54 z#-|(Yls#aDmA*+41x}5WIK@bn$a?Vn@mOA%Lk=XU3Rqa0;}3FSGv4i&L+7}f#IbG@ zwaSb?Ny=q+U{+aySgxKXM2e!YTvqR=D<-Yt8%bX4q%Ky&tPxb1<~h^YqH{9 zdQvnG72ka5u_>~Ib<@oGo{<7=WEqwc3&x%%>bm&RnicA{mUD%tM@Hx)t1}nAc(FA4cz(gKVb_zxn$8T+ zehW+gZ&8Uup>EQmMX!&b!?87pyBr-&ohU-WhFO z;gDwBs2!|dd*$!8KS%6|y*>SC)&XO*>`+ztfa|x%)HSR-wQS=L`P-sOJ$&QZ^6|09 zCxC8i3Ca9r02^kkejRv2i>7D+zSn%9B>Dw#B~wFszkkq@Qr`tw6s z$?dC~_wP9W;pqN{f9?oB(5%Zy>9gpAU3Wj;=Nj0MHd$&*smKQ#MqSwgOveWCE%<^d zt@Xg&Z*N5R;8X9(WXG*dtu?df=4qndY4@^T*>vLI3#qrP7q1Rim(3iob=>_`7r1kE z>v!0fj;Sx6@Lh#=l?ATJ0*fav-yhuhS($C`#+x;_zd3%Gs5*Oo$59|OTaql*M_T$= znl%t3Q$y7!q-hGulWZx{3YA~ diff --git a/assets/dolphin/external/L1_Leaving_sad_128x64/frame_6.png b/assets/dolphin/external/L1_Leaving_sad_128x64/frame_6.png index 142ebbca028e5278af20d8ad239d516fb172cf02..c927e79284aed3ec773e818f4ee5182bffaed3e8 100644 GIT binary patch delta 558 zcmV+}0@3}G47&u77=Hl(0002`twPcO00II@L_t(|oVAlZYg9oLhM$?eve`soHx`25 zu84^E#S$BZTrB(t7J~i)F>O+)dmF)6Sz1QH!fYX8Bc{j(EYe9pv@zbr#zf^N81e2V zd*`*7yPDm`MyDC(nKSQu&Y2k_0Fd!BmVxmfz=9b7hxAWfGJj*r06`BJWySs@=C$hw zcTn^fmnO}AaJ;7x`Stg!cJUJ+w?~p(76Lb8p=`|qfK&0GYDJ;TTd=r$Il5Sg4uYk9 zD+eJVfHvRf8d7UKmZh`57eF}#v^D7?ZcC|RSxsGQ_SN#^a`hnq-IgcoOQT;UxvWrE zs#q+B@196<*?;Dm*H|&no=3n&vFwk0D2=YxC6{(`m*Ep569Apz+-B?W$SX-s8@Yz1 z?VnliLfTM}RiA1O_)l&9q<8gt(CW-A zuxuIP#7s7IQ`rYDSsb!uaS$CctD88?&=5uECev)orbe=C%H{{VB6a)2_{T1}d)|-d z_dLJn>t1sgFH4*TO_k1okUtRahPzy}o;3HfTofF)!@$L(6wb@UiV zk#QAegAIK|s>0<)@+BD}*#;8h2!cSe8H0!Lnmv#qvJi@(NSvf_lEx^~LeUnIMkXFq z^(XUQOQ~b&gg13(L#q_UZ^7|kFlY!G4U)VbCmDvp2@0nuOx3^wn?!{TVPYU7X2Agi zoGkbiK@yRuMb;zLDmGN*`X~sW-{pF2SPV?0N=+IbV*NO2AaI{A8risZKq-a)(s-hF zpnQ`b;-xSk)ykY&5pPBetY+`&j-rYx8_Nn=P|L#BI3%vt2Svr{u%YUWffslSG_tA*)Doxg^!Z`oLW!DN>+H@*|YdKp_iUEGLN3 zlZDYLJqp?ZWuXr8OJ&K2jHlTmJdpxJF$8PG2nKpF6KOPIW)G|OkI9=&LfS|e7t!bh zp8vn;!&Opvv{(MqJFz3RA*0L3v!HGsPZJc?5t7we`EJkPS#{2I?xOMnRgR5~wO=~$ zJpgft(_t?UUB0<{dsBp%+Sqz`>#vO+zK2;a6nD%CW=$KaSlu)9=`|gc+O~`)^?-HZ zl=>(?1&SfA+|s-O0O_ zW%x4&4DR3SYZKo|Ysm?p6X$lFSXg%dnckB3TZdEJt^^xMp9R(~t?fERep`fO<}KEh zT-Z2!OVn<}n%Db~7Ee(Y3i{N3+uE13~wLO_N#KBLd z-ne$Rd)}D=ipm-VmhjQNZA}BW&b8`CKQ5YHS?8HIc^kfVIHBA2wGkXTo7tqBdDWV3 zeOMQ6)$3=@jjK#RtdU9J&f7`7)x}v3^NsYB`kv-#mlntOUg?})(|7svZQ#TA-Yv{q zZsNho`P$o;r>`#Cziv!9aPh)+P@R@I)R7bvwQc(reDRrBIvvavIvk{|5(CH?vEmcFT9#;*Z=@h!d;uk^>6wEgk?#rk3GDNSWg zCwAi8P?hfV6+^^1xv24E{E<7-1-dny8cx&bz|MQK*Q{%BN495hJ7=Hl(0002`twPcO00It4L_t(|oVAm`Ym-qFhM#kLv5BqNmKIdh zwn4C>VE+Oe#b5tG7jbeD1ktTi`+*8}sR|A*f*>wta8X2un$V>~(R6VTB>{`Hl-iUC z{ZjLNufvz5B(8dw%YAsyIqy05UK0Swk{w6K`VXLB9bj1hw0}xu)(7C5z(l1z#0uGV zFg+anm2@lH0gA;AkPpE@&;r2@IP|0iX3Bt~O-YI)@~5zpc7aq*+K=xyjg0`HYBf^$h zL-AUh@8q-?DVr#kNG)Kh_0)^w$UwF=XGl^t35m6#34dp1whu5f$4}0Bzyy2)1!KpK z7+?~*4jg<~Iqn4%fJtCsOhev)@lVhX6teLnKQ(pw#yKDda6ZcUdptXo1~S0qdYDOm z=R{r=VEJe|{UzU@UaMWnd!p_-z$|NTpWjK(dMugoBrCV)-waK9 ztTzPcXEQK!=3_uhk)!fBKAFQ?QkD#%-^nyOm7xmp;GR|Z1JKkNsqySDasU7T07*qo IM6N<$g5=o-k^lez literal 1574 zcmbVMeM}Q)7=LSxR#Jq?V1O9U(@Zq9*SofqyHRYRfE5d@)`;2MxZYi%gWet2!?vJH zH@`(Qoms+MR9qZR7nqYxam1_uKCnq5Ma(Y~=Ws63M+yuu)0~rmtRAw0 zu`?tcsOe&|0g(ILjxw>#Hk+V0kD83=sQn&ZLIaRJ!_Sjc6(d4Urozn{;hP-?V8~4y z;dy$S#>VF{mF}5!0yC$s*g@4*Q8*3H$bqu`gk-?Oh$Q6qRI^^fZ-j^J64E+yjKI*4 zidbcYp9WQCD~0knfq@KaR7Ght8pwdFof=n`lfg9^5T?OU1jP_kufk9Q(-Wv38h&8O zpFq0^yQN^*o3t~+m7>TK2;%ek)IP166DklC$8ki1AsD8TG*sRIE0TT{>zy36U}3zJ z;O0d)$3hW{q?4-^jj$B!(m8;_A`S7AJc6nrYzj#km64$s0fH7<%IqjsK$NAnB?nfhD|$1}|+nxB`8Vpy&Y)0)kB z27|f49K~8$uSl{K6ZP$ud=FzK%3pvb@&twyIl;kk)zLmEt>i?`TgmYdrd4B5x{ajV zY~*BGq)JbdwlIQwAww4koCg}BnQ%WZ1U-)78d9s$;EYS9L$x|pmXnnFN9Qu2j9#nJ zX6oT#JpF&^L!_XPNU!{-ccMp9Lq?X*WpMo5rmOss&uv^Uy|W) z__N=(^Z_tJYqgji{xjDb8`wjTGCwXH{&mBirOEB(38~-OY>7Jp>z6Ek0&V+d?cJ-g z9569>Kw;XqUv}|E(ja(T1g`8!C=U^FvNzj)4rj`*Tz=Stfb_(#CNw1tu)$X|(!g8F zlLc3k%coqZ2d8?+g0=!aR65YS0z3|VnLv9FrycAZ@ss?DsXsAwa|trptHXvyE7$b z{kH3(W#xmNogF~XLtWEm1}lI0ef~vz#pMyFM;$uXw|ain#m4&sYiLWm>%Er~w!R)Z zReY2_e(ngX-v*91Po5r{8{9Q!qP%_oE$84Q)8;dZrauw2v}?S8_ETc?`P!aL)Fx#I@=>eHu{WEbAJ)mv{2(zCYrwzMs)u>J@JI~Js#9X)B! z$eIj|F1Vn%r|7S?xH10jnuGk_iLUtNOB%K-``Qc>-iSE{nD0IgnF29edmf+fE=*XI z_%&#}wkv66tL%q&mfV=-v~AfSC{~zv@2-j!$D59R?`hewwB(qHjh(V_^qMA5ZP!#{ zlrVnErvWf`?47&a0eD?)W0(A1OYNmEZXe#Q$iH3HU{vlr;!K{E7~h(lapJ(+vW?Z} eJMI?+WuRw6%9Drt8cs+4+}8YJOKWcV`~LuABSAU< diff --git a/assets/dolphin/external/L1_Leaving_sad_128x64/frame_8.png b/assets/dolphin/external/L1_Leaving_sad_128x64/frame_8.png index d307e7a27cff7b80c61e15a3a80e52d80af0052e..da93d6f148d45578b67d9a81558d4e0de2116015 100644 GIT binary patch delta 478 zcmV<40U`d!3+w}s7=Hl(0002`twPcO00FZ}L_t(|oVAm`YZOrwg}?iDV2xSC1W^%X zCD>TS#(D<}Ya2WN070;IK}e?1!p_3N(#FOV!B!C77DBp>jUY)}BNmEC23N?0ota}X zoB4&M-sUkM=e={@y>CnaAS+fJt@;mOWG&FwKXu8>P6GtTz<)&C++w4!3D)`%Flry_ z+aUUzZB%`I*~g*h73cxV4kRhh@T>ai*DD|$Xx|IX9#jf#3r(j5SetB0dvbKY)=X3H zIJ#I*5jsvhs(}Qj;T>Orz`Nf!S8B=Pkof)bkIHr|w!#lD%U~MIeY4Hi5im774|sML zmcOq{`Jr?uO@HK0UR}Hoa8z_XWp;V-jig+Xq)!i>BT;3mhy*&7VrLd~MB0enY;pW9 zaFCYs00( z23|2he&&=3z=yhCHeg<_N|1F^fF~ueqCdAQ&`V&RqpsL!+;-sSIlu(SC~^RQ0I@^i Usz%BAH2?qr07*qoM6N<$f{Xm%7ytkO literal 1479 zcmbVMeM}Q)7=H_h)QOOpC5~lso}%Dv@1rgBP71WNNH+?#vI+Y@uXk_hS$bEmhrN;! zt5G+TC2Vef#5u)}ZEiUC$KpOP5p;8=i?A)Ah9xqMb4wP{EGEce40{XI?GNK0yX5Y9 zKc3(7{GPAd>8)RtJEvd{03g?0>+~U+KyOt}Ci>pY>GB})wCZY7*T?}i#wifk1=$ZV zcbIF1KFA62jY(JzKxRyAY*L#%bu2H3ja*8{sD&d44M2IN7UB31R53qn6(t*f=X4*A ziGmGZYw?htNHq+KwH*pv(^22ZcZ7IGz$+`Ta*ag>!cgTfE!-wWSbxh#c zl!_X%;nSp=JYK9?Rv=bpqzpVsl2{pI^pgRrA2Q?$j3#M{plE`!7-)*6Ei7fhW*!{* zQ-lEPbJomwLpvKDRMiMe5V2Uy7&94VrInx{+8p-m2kDYa9StJ-cZv)Ubug=Fkja~b1E zW8G3z^0FG{JCl2nzZ zgLXni+ysRhMGj+AX=cSoP@pUf&5)eQKr%33FjFS8!RqHw|Cj@16ttK~Q>g`?!3+O4 zeFP#!qdp8;uCtjGp8YJG(O`HNJGK;&u;4dk^n)`pW%uh5I zUEIdyb%)C5U8{9|px@EFh1u%G3o@!E&lu+{_}%r^=9bx@_b+J()WDqk{aGNmn_CzE zX3KVPVIm%HE6N|g@?>K0+%V|ezUm#ne$Tc=t$UA^cVw14AIW#J_~4ecy73MDo07Wz zU=t|*ySaX;){|+9-Dpex(Az^D+jwqPf!F8g)Y=OVJyUaU)+^tA)w06Io_udXmNk3q zz`VPlcxg_3Va7Esab%=E>1@s0-`z1`0!oH=nM2C*1{{)Z!TAHG{G;H_UE=#6TV8uE zL?1r>Nz02nc1Ea#wtV6|7`?u7T<}-?(Rl~F{Q1GRKg)I(B)W^A?d|+}#Y$JY* zhZZ?U_w^I%rC_Kg)H8Zz+5R)b=Cdbm?p9vEoxlInqRWT%LzgStR)3Unq3)KE8L;-{ zT^?^PNoHi-?LR(NIy`VHzW&KUh;p_puZ&%FW?y$3S-(6U>;lW7$#2!MI Z4IFz58h$>#wJG&$b-U`FCmrjz{sWQH1k(Tj diff --git a/assets/dolphin/external/L1_Leaving_sad_128x64/frame_9.png b/assets/dolphin/external/L1_Leaving_sad_128x64/frame_9.png index 0d28a861564508c8510dc8d8de27e2beb901ce17..edf48b0f0d605e9deb05521497d75a80afc0c002 100644 GIT binary patch delta 392 zcmV;30eAl93YG(q7=Hl(0002`twPcO00CV|L_t(|oVAj@N&`U@g}*yl*ezBJB9cO6 zA(f42W#^``Rtqicg}i}{#oDD71RuaIZ=j&@4Ps>%6-8`<7BL!#xfc63y9k2lZI<~s zbI#%JKs=IsF_h*XK&T~fFMpa+QGEq)QlLV$ctyjGeO1h1uzv}`FJq(pv;YQa=3oF| zs&R^jU1oy37(xRdz-i?Q0>Jl6#YXd`Sog66J`RdNTBnTy@Xvb9f@FHBKU;`hy`;6Z>H-n<8kMlf=?Xdn9GD9$#oETtaYK(MkXS002ovPDHLkU;%R1h$M_4##lrdLM0R??UCHS6s6dNht!0OSs;>g_E{-yF2L7 zOvmQLX|^FM$@Yf>jZK6^Vl>N)3$u$eW<#@tsL|nKOcb`nxR{Be`@r{rqJNP6;U#y^ z`|abk8w3F_4ji})Y7t~pLJD>09f7^9AjfRHsbe!@3PdAFZJnX;LNCzKFzA-z9_-fn zPcT#xJy^RlKn4^q=#h3ORnVGj4hhL#ff2E~C(v4hg$80k=TRdTjccso!B*_DaBUtF z7`mdO_j<5ZQXPR7)GMn1b=fFfAW0H+F}5%nafbmz?m}sjrU;5AC?`%+EbU||C%X1v z(4Q(s*dW)m<_+#VSdXqNEI}j^30uN$lhtm5Vi<-XX@aJ4sDWz(ah*5txK^35zyVEA zB}JFyIBHtt!*ZYQ!64VwAYw`&ux>c6t)&VkjWBqHpll=&iuPAKp-G0RX`m>dx6#!IfnLh)@{&H6*O$Ti zHsfDar5Lcvr4N$ zb3m2)f!L(VF?1!(th50I%E{0S$=h*~0TJ9m*&Vn$%)|b1L|hbb+DUtj6I;WJ|2KUE zBt@9L@}J(x9KnV(m+P|tH|x^`;&6miI4h4^Un+ugmfNy7K5BShMjrF^gznX?*} ziu`oyz3dw|q>}oIzU02bSD!z0e=+Oe7UVY42xgy|OrjqnClii))I{MzR`uHxd54D% z%yZcbw-(#dKMw8(OWR7zu39S7BV(7223wbqyOC&B@oaZFax_?gb4RuVg z-`LvEjdZ?Z`Kfrk^ZZBlRMzDe@8(-3KYM*@babX5?}e+k`>xFVRd9(E>n0ZZON=)k zc3a*VK*XZ@u^~G$biFR8zHIS++2BxzmH+?% diff --git a/assets/dolphin/external/L1_Mad_fist_128x64/frame_0.png b/assets/dolphin/external/L1_Mad_fist_128x64/frame_0.png index 04aa17ac07fb2fbaebdb7c4ac1c6f8fbe1876b4b..c1046f9e11f9f0a05a5d04f19857644f1cc786e4 100644 GIT binary patch delta 634 zcmV-=0)_pQ42K1f7=Hl(0002`twPcO00K@)L_t(|oL!SKZxcZfg}>c99E;e*iLgKl zQXHtDK%|U>l+Yt23P%y5a6u7?CItl*cac(1Q1B0M8J#Kk1JPLu5@n2NTp+~}MFIx- z2u|#reLEC)zSx;&cHYjuH#3^WiKHh7GI9f(#D0_j*iL~d0e_&YM?iAZPcxJPV15*n z7ZFFKsf`SzBfe?HxRr9SrR+ncNIAIYDc@rZXxGhLO_nZzVp;iRuty~Mw{}~bzsOL4aGs4-0@+qZg&Cr~mCi28 zUuDULFoSmeF@KJ34mGKAxtHUs*Qkv5GSh)WJ=V+n6PJaw7Y#^>#VYOE&YshfIHtQa6!bfY20<;aVMR=`Op&?elfq}a9&ddERfh5$wuWE#)m98 zJrU`r6m$9w0JalMZnCcC;}6tN0JV`mF)jelQXug++@wE{o`{G^Gh+QfxoW>7zLE65 zY-Uo9xTu+aW1KV##By4@$(zon1YlJ3-&yrYD_Du+sbEw_Jsw1VD)vg4G<_-NKUmH* U0r=;=Q~&?~07*qoM6N<$f{+F)bN~PV literal 1556 zcmaJ>d2ka|7~domLfUdnOQDowSyU*p*&}I^T^n0+w1jDB3}J}cKf2j{AsM>6VY9WN z1Ji(I#+Htf&M+f7Vv(bc)N(i;C`dR&=~(ap6x4bEe=q`Nn86XLQ(xK!`Ga9+cHev7 z`+nc|`>t*CEw9cu%rqbflJ8mS^20R=-%7m>ey{0Y^TMTAbqCcIa#(HR6o4!dZoML20uH7 zp;5t(tt#`9-k1|aqDz|{HX*VwU9QbDf|b;=4rtwsvxNs>gZj4?!pZ6Uyri&2`SDT1O2stl(omM&wdGIZ?0 zpg%{f7)MRWj8D(WPK`{(NkTgNlIMl%7>m-#+;8J{k)`APf zc_kWCqq2l%EOH^aQMF@`>u3;S%EX#(aOjgDOLSfv@GZvgHGly}8<~ZCGHi0kzq}ggQVFaW|WIE@ePRfd4 zduFx|CIcQG%odQ~Kq+u??9PI>;M9%x)dbvd9UdOubLs705JX$xaV-fXE`Pm!i*ypr zbMGG>?p_srUiWvK*a`f*i}o;eLvt#x+`Zj>Zi0De%AHlyk!!scq;G21O?_wg))xQJ zlZ|hl?i)M_b{UbM|7=Wpw@pS~X&G3yPdkL)>TB_J_2>Exc~V!y;C;h_Nri<6kiB9v z;wkw?Q?;Sy{j&?xzuH>XzM#>UO8@lMYAzi5V(8LfPW#>K#Y1gNBY_#6_(#=_4^AA{ z8J^HwE=*oG&?lt|#ss4){yD!%KrOnrDb%ylG%J15r+W%rlPm0`| zoIP>ddn?MP@5oILes9<~3)ywcBF@uy{g}*0hX37QIN-gmoAeb@S~BJ7oj)y^8ku~j zpp)s&)kbp8v=ygzG#)KFI2SqFP%sOv_#rm)TvAiCV9&(l%AP-ZZ0GY%eR}mq>lwqQ zopV0q>yAyV+#BBB61<_+|K2q&{mfZ=YZEfQ_3+LC-PSku&#q;E8#gCO^`G*W-gBJS z1dr8CKtye8UtbmCSnRrq_{yiv0G(w0ZOtboNoud3eO{J diff --git a/assets/dolphin/external/L1_Mad_fist_128x64/frame_1.png b/assets/dolphin/external/L1_Mad_fist_128x64/frame_1.png index d93b1f588d42a88503e2938fe6590228afbf85bc..24c08c043c837be35dcd5a80fd5e852dcaddbf55 100644 GIT binary patch delta 653 zcmV;80&@MV44DOx7=Hl(0002`twPcO00Ll1L_t(|oL!T#Yg17a#(($b*#?`mX)!2N zXsVMAVkapGjk_ogDMdswI22quIJoG01qTNQ|AS^MiT^@*kro_{xMUEL;?Qc8yw zT10G-x;E06wz#Gl;fWy!o66c(iXjKL%gQY?0<@}Tt|Ck4K(?UV0$2l*^!uurtH>Q~ zhjN-|h~3N<)-DxR6BgiyPHBweTX1uP19;@EkEzIAo}EW1KsZZADxSPkM)?zjyDRM- zl$&SC0)GPSxPK!YofK+Z;1Zgt=B_+n*|j+6bBCb-B^Z7S<+C zqK+-pks7~uju)rOQP;i9X{LYW$*;!ADjFci4>;Ubnsk)f1l7=EkjuK za{wtqZ3nv!2eg|2opM4Gl0UmojfrbT^#L?KNRv`DVUddTkURjXGMbJdg8~1rB(DHw zLf00Lv_ql@b#1Dqn&Z1^+7c{?BrIyT9C+9scHeAuMS?HpPvp*PNhgk9MUYb}t6hI#C4LH~>5)*o%NTovY4tCf-U{M8pgd z)d2vWa#ZkGTqDE(vLSEsF-H%88S}X`LYf5iyb7ST6W{UfMWh-p4mz4u543`n$e;8E nX;h;|^d_TK3FD?O`1}XzGB;`s--&7f0000eM}Q)7{6;>t$ZkcMR1ZG1(Pzl-em?Bmdx z46_6xE>UMtvoK9`7_-c|sYqOAG$Je`I5jcr+}uK ze$Ur+_^KD4O}t$&tXhebCK%N~1jsCsh-`_*nS{eIWtUO+DKTb1 zrc~r6hhdsjo!5uBLRRfK;MrAgEM&pHP3vLkS zrEp9Ri%}$Hk>$j#vcsTqoem-r^Ln2ej>czFr6vtaurZ7<;aDV+ifl?dF4uzpX*^du z?r)6&tQN$@trD+RBv_aRtJ!<8qm-h`hFLF#)v~Z#+#KXS8VDAf#YO`T&mT^gdl|{)fid)is;0uYe7!QdtgrrO)V)U|nIGU0a zr>Zm^v>Qm_Z9u4y#0WB#W+wa`3OoUL)@r9wPQcah?Y1Cl<8d0rS&Nmlup~(V-Y|m~ zo=M+yqpA`$j98itLr_*b1-Kwe^L7i$n&}{FCs`Jyf)oe>fYVkBWx!O5SgLcL>7=ws zZO_#9>13#fr?Um3>Oe{AN+_&*?Z&QEeO)A@VHm|6E_Fz=S083 zvp#t;IhI|w|N1rb${2|_fBx!laR-y}UEhxmW7Kx^Zi)- zZg*Q1e@A?9YJ&(Ru1&y2^(!Ig;|H4>@{(fn<|kThq{hbu^x8X#i51K8uLlM+c>aji z_a~e`aH;e1XrAuj%fHP&lBaat{hTnxiweU+B`do)(!g4Wev_==x-kMHS7A` zUK$9@8W=vGFy78OuK&>JgYnKPcl!mUEAtwX?7h@|;6$%OmjzXb?ehwcEf|{kVBSOM z(5`|;<#32~j&c_Vz}`o1@=mn!bZ60P)b0k#o|M zk-?hzocpd8Dd;7?9fG0dFy4Op%ytU8`(C2@Ang3ZAK2qL+b|bOvN<{2gMYS_?)fr$ oFPjFi*|_+nxBC0%CMy*fn&Vk~W$!XqU+VwuDX(_-l?Ar{2aXdbAOHXW diff --git a/assets/dolphin/external/L1_Mad_fist_128x64/frame_10.png b/assets/dolphin/external/L1_Mad_fist_128x64/frame_10.png index 47185499d7ac7d13e9c24210e59b912b8c557cb7..324adab8c2ccbac2f6019778acf186d841b27ac6 100644 GIT binary patch delta 640 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 diff --git a/assets/dolphin/external/L1_Mad_fist_128x64/frame_12.png b/assets/dolphin/external/L1_Mad_fist_128x64/frame_12.png index 15ded267251deb5676fa24b1633c1e4e280fb0c3..e9562ab71f0bb4883c988245200eab5b72b7880d 100644 GIT binary patch delta 614 zcmV-s0-61V4D$q#7=Hl(0002`twPcO00KHmL_t(|oMn@-YZO5k#eXxqCI`tG4Mt8< z-K=&P2+u12f-}TiS_b zV0FalF4Wg9)K@JVXvc1|pm8s{p3{K%w)Ldo5(PXut59G?oRkumfov0cYkTF>w-)BKC}yce6KLfXQ}=DdUUAsSw8ZkRLIg@+Stu$NG-S%#1jn- zs1cXoptTb|_0RybCp}oGuT34Vq8ql-h~20jw06Q7FIL7_rE&YF?(d@fW^-8sV>V*= z^Zso(<0aP+2O(T}_`7qwnuv}Fq4(}(IOCz=3lYG;Cx1HnfY$aa1{~@tz$~$LqP;Dc zcDevV&$5ZFl`1`$syr}nKog=MNbYl(xF|OxW<4}RgDWnCy{5bXn2UXpfU=9V4*S{! zCV)B9btGC6u{7=2B?lV>s2~bxu&8M!JCdNCzNj$C10}6j0H*adrIb>tthWHTIyWf3 zWc9r4ZeL1AoXKx^W-V0!&?f2PB9FTXkya=<{gh5+lytC}CXO4K z^LxJ5hk{jO4U-KBf{gY1JYgu)@O9wt!>8N20--6RTBKg(Zk&GHFVhO>%rWK`{(NkTgNlIJCeMt0a|6;ZmX`>%jvOd|Xsi zQI^n*M=l~as7?%W9Zn*q1Oks7ONo(E!J-iQxFL z!XP0x#Ch0}Xh{|ftM~Lk8AHg1T^JW(Tey0U%s0eKTpEjyybK`RcSA$+$2R+RyaInx}uUIDYKWRJPvyn z>z5KLC-EQ~TZFMku(qdS*@`&eR5@NP%k|kg2-V7}oT!x*ls21abY_6#MJc11mFd!O z(jE{OR|3Hsmt*KqnOX4(6nF~ooSm`Y5rKs1Gma?k;7JQkayC0{<7nCpcx(hOJXXHp zL4_KahLUB&Qf51229YRk;TapwSuIhVp*apWN6jD#0BNz?%oqVF5}C<)Y?87nIG&l~ zqs@SqN4o_ixKMGpIsTSi&2Z~-Lkp@ap&T3>-2Ka^zaoe>$M11hr!IDHUGu(fYMy7^ z;NYJ}gs#Kir8gYx+#axrvCY@!Xv40XJ-;W9$swhrx5}9A^%kXj^Fn{;eXwxq;7g4& zl3P!lzS|RP{tcQ|f7J)OaaEtmA?2R<9~_PlZ4yZXEB*M0xcCm3yd zwtk!bU8J>WgVFVsalVwYOzeKf8+y=m^_>G_OAi<}He;ObkM^6#P9iI?o!{o)Y`Rvs zLyNHE=9KoIYW~Y`W^KvN^o#vTcOtj$QmOH*VasbsjuGj4?!w~Zx@DvM6Yx#>cRGuT zx9F7ikYUn>$@&(8J#@MC>^?@HySp`?EZa7E?zUU8%Y{pWuUkf=1-9{J-5uKX$h3mM ztb(fY{mQ`?+?vzhe01oO)j6)~Qp)?925;M&~|hQ#T4+qCCvRvmat~v!N1Xz z(PjMN-uBG{ZIS2GKYiYJ?eMdRPwQ&QZ-4N$4w?OCn>f{j>?-|G@A`iFZl5N6AvpTh zCS*(N?G8kkZX6Sxpt)g7*K2OfSi5fB`0nB0(VT;x-w3Z(o@<7fuG^uMB$j Il`nheKjID@Z2$lO diff --git a/assets/dolphin/external/L1_Mad_fist_128x64/frame_13.png b/assets/dolphin/external/L1_Mad_fist_128x64/frame_13.png index 13ee0450e23fe651e38cdea5d5bd816c8ed3087b..449235a1ed317b554ec560f54ab0dd5dc75e5a08 100644 GIT binary patch delta 615 zcmV-t0+{`Y4Druuf^m(v|P+*0e=3?))BMWX%6ppEjX z+_0fvgu0h@X@73%j7w(&I+;Aa6$#R{RE|C$|Iz7M-t#?|sijwX+D>Um#lPi8a}5os z5$EBswKsX}#w}bq9mf$To9KqEG~=*QK5XqxmfgrU#>&0wSkpnfro5BbWlXgIzuQMw zmfg7P5dmDh_p5udi3S*j2KsMbOqN|Vd?H*L!_XrdSeJd6uW=2pq{!)z;~ID>6JK8Fc0_%aaB$l|}upkd6s zV=2)Ep_Afs3BfFBK3-6_wSvk&Z^V}jl>Bd-#a}p4GP@VZnu`Dc002ovPDHLkV1laV BC-wjU literal 1545 zcmaJ>YfKbZ6uz!*MS_V{Y>RE`bg&3*XXmlcnXo+e0n)IzUDlQuQ=Of;%dWUP%kBUR zi8=z>n5v}4rqRYoV|}z>jrCCqMnPi5N)&5ieHE#oO+_P`wwRK*y$h`MhjEgbd+)jD zJLfyE+2|}OoS8f?82~V|Xpzl@Rt3FzNmJ4Hc2biAEorj7OfHqYat$AbAYYU`5GxAs z<L;c}8@S(c<2l3@s>K}2eUG9M*^k@SQG8;l5H ze@OOAK`d^O_efQ;8An_vf(V2hj;Dr$k;zn{q>)iRMA90H3&v{5rTNiiE%6dRVlV_)eX{Gw}mn{s6EPR&Wl8A=~2oU05Kq$xv5&STTgF6oJF z?LWJ^cg3B*2Lt>1LED|tDX%Qa0eQ=JZ+EF%KmWaVPHN_-_1jdA*ZR&>6sJ7u+@R7Z zYkFVK`(^s^>;K$sT)NZQc||*a=Mr$FvufAntbxZzOLK>JD|O4=T^Gtv`PSyIKE%yA z;RtO3&F`-}r?P?>8$9Y+jkkWC*>t(Sx;yFH*u|wIhxpqcZhYv@I1cI#jggG9qj>-Q zhOt3by&ov&r=3eaKKy69Dtqq2)V^tJQkR_{xVG4~ZnyG{`oN{nup_6FuO~;r2XCb? z{Mwxl*RkM-W$&s}?3-09`S!p1vPLTVF6j4xn@_5$+0GGP#y#Ip-C*yO*#~+SD0x>l zEvz0>S`YJcE^bp*X6QOfZoZwV{8+6$c(e)hoOr!|Z|0PN$9XAO|HFYs)#_;XgO)as zHNQDcbGN;9H2+lEwZoe_a!i-fU0;!FXDF2orBjE-<~20@@kVFKKApOGW!J|CuVg)< zYj2N4`WC70jSiFDEucNes3%81In9BVpO3lDtH4$;YuH+udmkwM29{_{QsnjDgPyjp zQ?v36$4V{Pvq5R~lQgAuTYXnA4srtlaPQUiUlvAH?fi}4NF~TsrGPy<=C-`K;Fcx+ Ob1t%%*uJx@sQ(Wlel_3# diff --git a/assets/dolphin/external/L1_Mad_fist_128x64/frame_2.png b/assets/dolphin/external/L1_Mad_fist_128x64/frame_2.png index 32c0a1b9b50237f972e47318b9cf28fe57794711..c94fbaf161a1eaa293d20a64a1ac1d35faa854f6 100644 GIT binary patch delta 628 zcmV-)0*n2Y41ooZ7=Hl(0002`twPcO00Kx!L_t(|oL!T#Yg17a#((#|*R;@t+G4R< zp%FI+p_@*5Zi16TN)f@11s4T}4q{%RgM)v9(10M4I0Pq`@*;I`vK=c9O>r=^m8AMg z(j@O5hx_vS(zBd%zIX2Topay0lp^WKz6@R8CAMFA05%d}Tz>!v^$>`^bdw6D0GJ=< zMHj*>+J6s5J5?hp&B65xvs{Cf^ehWs7C6wUS$y%Jke=noH@wXhNBQ|2PiiR@ z+MG3-9M#SA)54;?pB-SfxSTm%La#gIFWrgm=8vi$dXtq%8{-vf$oqz^a9n^!{y5L! z*54bG70coA87@D(pE+H^l1igVb91dXSwX{B==;zP7=Qfxh}QZHzVj&$kR{Tk!M1<0 zM$iBVD~?O#cv2US%-jR>1~ffP8)N@x7^~!oERe0B35|k7=rzmo0$?f%3gVOVaaLdt zv(qn$SulU>(*4xzMn3&ovNxE`j)?p=$2OhUlx-x|cH@o8GO)pf)*ir^zN(Z`O6Bw` z0Nhf0bZwJ$IcFbGHwI2thpO8606a>7*kAF*i$m#%NXH}eM}Q)7=NKyuq)yWZeZLz5Bym4dS9jORf@GON+(r@&4l45*Sojv4SH9u$0&*! z7?(j*Fvbnd)ajybiJ!}&b2W{t*U_#R9GY$suUyEs0|&kYgP9#F^(bw zDoTY79VAuaDMFl*3=y+|#5jT=5Hn-&5q^sgGQ?DbA}A6kDV)r~DAG#hSjik@=s{I~ zGViw*yJik~Q%^QDs3>78j@Q)G7;0#PBnNPkVHljCaEiiI4J=YCDr^)JBUy0^E*Rlt zA*=|Jh{PWzUHcq`%KInwX* zVFb@|n2~@qX0aG4%)}cZZ?c#yMre%Nc@~}~au^rsU>xKOf+X{u78gx9^GSlFXHulg zVvb|oVnks@4#s^8s_!AJ<+)g^Q--V}$zDmSjQ2rNP*S8wPzoayZJ?0J9+nftnB=us zl?H=$L0NbY@-t;AgbbwFDm;S%M?#J@Ge*qE6KeR3#gADy!iW*9$xNA8ilQNh4&nKy z(l^+sszePV9A{%CX){AZpC2=Fj0t0NjDC!vSQexGH1tDA7|kXc#Z`)UtaF~~q_{|J z&)D|KWT=NHvjs(Upk#G&Mr3an)Tz@J6?*g4wZFfA>%~vI0Z1I}cFpicyH1r37mpDs z%lh9x@KIl*Mzi*)@V2n^n4HnlkkH!LdH2rQ+nUt6#@{&|=scbQc8%ZkW!B`4jwKTw zt^URn_-*h0o99wNXWcma>T4R%v(QL))bAVh!=q&F@y|9LYagYJE^ci?(u^75Emsbo zPO<-#T-Vf))0 z1$uUV&S;YWGIzK(J8_ckYH4pt_Lai)41Ex@R|V4l`L%h=342QYDQ`CT_U4YZX?Y{* za=)X!-a)q4uWM{t^U{J{N4}dz>3_bL^2g-Dz5W$%(PM|P`N!Aa0K3Bu`a;5#vc6J2 z;|@LkO`mQAw^F#f_>aUx_u;M0y`b;x-IwkEzLOQqy$=-e^%p>P>FI;MqK9I^pFMlzqGjbt zKOQ>Z2IZ|^bxfa1fdXexbLQfNB%-RbJ86#{nLWt_>K{+hA3YiE$<^Gd-uCWp4f;3m zw*8Vk^7`h}hcBmtuEIAm!TQyS*KJ!{z@`1^nGY;1{c6YTvWk^`T-p5Zmv1l5Gd&*L b-U2jWjB|9i{hGEn_NR8|&vET?lrQ}cDb**T diff --git a/assets/dolphin/external/L1_Mad_fist_128x64/frame_3.png b/assets/dolphin/external/L1_Mad_fist_128x64/frame_3.png index 93593594e9c7fa130a763fc5becb073fe8fe39c9..eb23cfe0cdd78dbe24ca1ffa2a02ff67a11cdbab 100644 GIT binary patch delta 649 zcmV;40(Skc43!0t7=Hl(0002`twPcO00LY|L_t(|oL!PJXj4%XhQE8?Ya3`nwOXuJ zNWe)4v6DLGxhW3fkWxgjW5Gqip@a0jLI(#yM+YGRK_zu4PA>8y?cg9mY&!O#|( zYD$yzy?Y#PlD_mT=br!m{Qo)k9{gAiWJ9{?(4`ZZawxkJnyST}o(2ob-BgO62A9ezERz7XD`s>_CXaxzf(i@Zc11GJDrR&^ zE^9xQhO;4lb*wNwP?&ODU?&breHw3~3keO7*H35rT+9sjj~EJ+p_Q^Oby-wKHPXZ@ z`Q6W`&|}htMt>R|g#DeWK9^c_{@5(%U?w?B_DhycotPyM5Aw-betpF&CNxTq$9b@v zaG_4CT4TFnPCm>}YJl7iV5~4bxIcwnaL8S`7GKY8FTHOMmt$>=mwSY~ty+eofozqX z99!>RwTH`S0FO^_`tHra{V59|)f%qJMuM&|0_PJ0EiZX=3e1D?w|H zunN#9J1()~Nku#c$8VeGplL%BWB;>ZUE~C@1=3|S4FhaJyH=7X03&heOF$;TnSpg} zDyEW?qN(~4Wknp9wTl7m<=)<4iU%U{$L!d0LQ}FQv9Z?Ks5H@E08(0e00a8$DW#NB z89fhx>wnitB{x}@GJ7ksA%3$1?9E~sXcGW%k7(5bop#OynU|fT9Eiw)={Bk(n^mB` z-I34;k!47oTQ4LuqM-@Ei1}Gch&DmZR{*pQI%@T+R#a2BKx*%#x}g>1Z9P=)wo$PU j(Hyc_3H_mu)%*u5w>+G>3oJ(f0000A z-#Sf1U6yRfVq8XWMAR)VqB4PG=o~DXOr1=ey6G@eaU0VuV{d^v|1e&1_q^|O&+mDD z&)2r%qQZ&E(~|)J6P=6fZX|2bo0}v@-`h#MT}Y%$4v(}<^h;H27=k=r^g+xSV9THz zvi#cB-7p&f`6i*nBY9j)ESwn7urV7=G!Q~)0J3wUA(pFv66S+tLePreKY0en1m23j zu6I$ckPVg#i>kwLS#?nfS6#uGc|2z!mL0Vq2LULtSTs->j98*pe8jH>onvYe$3{$~ z3M)QJ%Ht}=Y+@KC|;QN zTio`7v1sUK#mglrWFg6_swz#DRwIVXNZM>RlN3WT41p|&$l9R9Mu}h~Gw#6-BV1Sr zNrD)}VjfwaxJI(#i0fz)fso7f)NwE}Rw`69GRlTXT0@b6KrFKn>xkrr|I>J`b);l% z2$F6X5!Zw{)DeGX9E_^>;y^J&#Ky8TETFcqm3EO^6M#X}JiM0Do9%SIJ)h2_Xxd>j*|m(#K~uE0fT8Us zV;t)YMkF@K!FX%|#U8`jUWm2W!jP53aET~Z#^<28T$IE}xfsG2t%kwWE|wF5G0pr~ zmqwGe!?5rc=qu1|wr&8Ab~^d<@S& zQ@+tbMH-YwD9*-0YmH_t^!W)LXEqS5Ugsyw49gN)zZUu-q;y7u7AFx!GB!ESOj2Bh z#xr(&x*6#5bhls-EmRn7PF>}yNoea7#Y;*YNDdDVAG&g&4}b)X)1Frnz530H@w+-O z<;>yXiz}Om_m}Q;8uu-jx0OoIJ`Kv-W}mLmosMkA*)^Z&LnUB?FpdsfYE&ply=Q}JXyK73F~Ud) zIiOU3p~*Zkb%J#Np!#FOw5+q{doTN<6s`;!urEylOTKT{O8d7qdfBw*)E?0mHY5HHkvflV7qg9qx z``h?&3f1-mMMkwK>$R%WTrsFYovB_8F<(p5{X-fx0WcCvV=P zyfyjOf#U}5((i*g@3js6n9z8u@7+XmVs5K!21xi)NS9ZxOa;yBvyaPKRd-&&8d7c- zbT-WU1izr}T~K4MzE-+!a*KTH$(su7`uCya9#w69k&w{7c>k*I6Q_K09!=cHZ@P4? zNL56=cCZDgziYXkhz-5^pfBZKhUXptTPWF-bA@TOddEJ)dEsQwdPO^67tB8LQtqc` z-bmm7VcK2%vaJ2;2d=(6{9D;!)tzI8LGX6Yt?pyX$5jFBr_zJ2^_|mgb3p&PIsjU4 z?%_e%SyON7M?Hay^<_uyc3zY?L${`4iRe&Q zO_emY?=hV1CcWkP{qOnrfA4(8OJpF2l7&l`bp0&@u$>D90e_&cGa=m><`qf-u$1K# zMZ^<1&_*uhL;};bx|1{5QtpvbUWM6#`n>Xk_Lswcas zphm@oUJ307lYgD6375`r<=QNdp)o#7_1;sC^w=y6e5j7k^6RG;G_Dv@J1U=ros40R z<1297-Wk1VS)sOh;j>s@pFUqhZ@JVONTqz--Wkod5@n3DAJ;mvyo(B&&58z|glxjU z@1IArDZ@{~4!2*fPM@!(E(4(V?Oj^24_{~!1;l4R(0|%}&uJvT%K&pE+Kcym@r~C7 z=(ik~#HmF$6PPZ&FrPp(!ju`=@7d2>_+!Id3r*iBScOrqDQ^Mhlb{-h6n&fq9B31o zFdWRAt|#%bh@d2ka|7=LYOIns_rP$^a1F3{oH?Aau{JxJOV$Vfsd8Hu1{H@h!w+GaOR7MgY_ z23mWmlo5-92SO4TSo8%1`vq|MG%=X)=k?We=zLK?tAZh-|zc= z-?hz!_Swm!#*YF3BwOcLiqtivzNQfx^?PMRt4&=}l>(=-Kz1utydMIyD7zqH_3|aK z2=ZceKrJb2&lw>iDRRF6i~CXaKTj27SCx4i&@&OFU8zdb9H&ig?5v zbYZ5Au=(;~sb@}&A1{UKisIvNysD~7S4Hb&e+f>qEQ=EqPEnYufd#51g%4sB?_e5 z<-!P&7cho^G-fn16s8v$DC&)RBLkV3oyXxB+F&*ltT~S~6C_!XZ?w=&6bJ?*c)fwr^Atrx0Ug4N zkECy~QB{c=hA+m3BWVLmLzf$41XhpnnT#7_DW1n@Hx1no5{yAlqqs^Dk9N)@ofH$P z?HS!ZoDB8waJHbN4wPS=oDnG-wCdC)7S44PsB3?J|HtPy{tQ6;b5@Jl5&YrAD{o1f z^d!2!zq_qx$M8w^t~$xVeL9<6mQgt&;b?a5gByL?@e}GFT#G0CA0>yo(oH{(o-{B0 zU{USUwKn1Eo-ZnT62R$YFPK(e(Sn{)BhrEXQ#+aYOMCL!&NXN3 zK3{uW@wv6Zwm8@IVPC!D3?FH%&MTkce2`a%ytZfI$T#E*=U=+FvU#h0^7@e}eX{HA zv?L$6#4H6Fnwh=KA@J^HM3WW&XF>8UciZ2Eow@PF;p^{D>fhBAe-3#suB)Xx;mo%YUHm%40ZJ1tObxBF zN45}1dVO;j2%V=&K?)k4f2>u5RPWFhTk=*!+S5VVH7=Hl(0002`twPcO00KryL_t(|oL!T#Z__{&#(#GTm2>G#HZS#Z4;u5m)Nb9UujhJU>_Kh5m+xO)zj2`_I~iRg$63l?$l$ozEe2cM(^3U4WwE*Ztn+6tw_bOg>gEvet`0u&8h}4?82YV zAA+Ss1Fvs7Tz|AxINMHLHh{sWmnq{X|Nhcs=o6lPL4Rxe6*80`6@XISgU_swhN-3p^`ZWNB z(l9^CS8JaalLs`(rt+CHbrRe7%>>}u;o=P-yC_g*;aj?uv51T%JU0m=^~a)gB7Q9C zCzDw(dX|JHCkjW2sMa395bii>#qEknSH#PxHS!@wa-rlBL0`)G4@jReMY6F3f&c&j M07*qoM6N<$f)wQ+fB*mh literal 1557 zcmaJ>eM}Q)7(b|hlrnWd)XmJ>!JKYh@1v#d-6&9Ll_F&w*1+ONxVydw9rW(j9=0I3 zj?6@}`2ooiwrND?BJ{lQfLGlX13MbS873D#-PqJbU&R)P! zpVx|2>wxv ze2VImB{XJ{#<=eIFl-vG$PC?1f?elzdsh)ly*=p2mjM}s&>%R zpa7yA1m*gG04pM9$H6dr&vq13glyP113p+5uFftC^?o3!PP-L@H+rwn%aXiTphTX> zNiQehMiLlsi^WLeCa)2AO%{{I2#j$%Ps1AxW}A&<94jarNl}g>i`_sMIVh4ctfVQs z#T>^vrJ%}50*L$eLEkf2`!lg@Q2=nN9Pr3;UAzz6HL@xPYh(qb4SE_~>f!{S6q78A zRcShCI|%qT0q@Fy>_?~4%=(@}L7;%ZnHeL_dr25RV-azSKpJt9Gnr`Bz1U`#ldYZP&Y<~ZCS8h{7@X*8P*7y&5~vCes-lj0)S zp0VxY$$*E)vjrqLPyskOPWHC~ICaVHQjY_!(P;FGp?x(3OKUs3JG!K~ z?VnG3`Xpqg9ZJ+2nc3K-*(sf_jo49ks8-Jg^mDV}oSom*Kj_z)n_~BqHsaKTs z35ERXykimJ&*yr!uOCTS+@DbrwB4Dn>-pv#e@@e{-68yb(hkqZttYd(kDh3u%9f63 z+HVdZ`x8U?8{CBlI-9JLGr={oxyR0>kEJ&xmFnByUOXP<*S$Xv`NeWD;eP$_-H+0B zS#!TG###s5_g)|P`C#jTiV@Sb{@g>zwu{Z9*Vmm=jTxJax25hM3c40@&ljR~-y5hi z=jXRpWNpiS*>wr6pZh^#d#yP*-aM;nYs#6@!M64!rLIa>c=bCNXlDQI4rZA&jJPxk zrrGnbb$oZ{z17!W&F4*rJ6DZXy!6)E#$@Dn@}cA_lex(${Y+$UnNQm>r~R{Ye0eHY zypj2KLC*dSL)m@e*)2&O$5O9uIa!(V$AW>u(o|&g?|TxIAK%L?{OL~Fob1G^l|ZGjfo|yX#L~(jlW{_i-eeRMj@2jT}ALGNiw?2pR7hoz+>QowIA?;pCNYQ_nt4 bIF&?(B3akR1|Keu{ivOeGW+orRW1JkP{l8a diff --git a/assets/dolphin/external/L1_Mad_fist_128x64/frame_6.png b/assets/dolphin/external/L1_Mad_fist_128x64/frame_6.png index 17930e075838239a97b2055f0449220f528d4dce..6c2fa6ecb7ea72ccaf91e87865c184e2bb4704c2 100644 GIT binary patch delta 624 zcmV-$0+0Qz4E+R<7=Hl(0002`twPcO00KlwL_t(|oL!SWZxcZfhM(PYKBUC5h=>#k zq*$b*K(a*P0^y?~Erp{L6fTiyQczHF7byh=KY)t3BeIcbX`(v_4V{Y=>0&Dd7LF7{ z9G&Cb?oiyFKQhhUJp1lDJF7W7Baxg+w%p`MJwsIpE64-Xaov{bID%Vkpu?G(uDrhhTdZAruN@)UCt175ME;Gr$5A8}*9%;`= z-#Hbpy;|L#t8O_tpk@5}jK}kMW6A?e*?BcnB@THxQ7CX?t{0Okec4l1b=NRQm5W1E z;8My#cMa_avwt^LGgVr{@~vJTLv6a3%7dqL^i(fIK2)ZA`S#TdY7-A}JH^Yem3bu3 z@d@ZP4@R#WXrSosT>Gq6x96|6(7QRj8d56ung^q$hEdi!glP6{642nKOnyRLVr&4_=|K_w2!$2c`O z(KfVU7!_=Y#OorCre%DVhy2P0$L>cWau%1%>73e1BqCkB?;;}7OToD#XCfkUskIB> z#2BTNQfYbpE;DP-O!6WWA~_XrI2r9$vS{n4pq_$EAny1p5|K!3n(8>aaq`@fsjGyzE*XF&S^eKyB{K7jcc~BEq7+(^DfI4dNf>zxwvBkm79$9j%1QQaDI0i99i*2oLc3&WcWY=UVfdN?+ z?V*--TBl>H1@uVkz$tYnT9lEFA9!u-(U$ z11Dg(+T~w^90*db@w&>yGRHic<$W3^rlSe@1Q`uMIdeh+!&U+jc7t-S--O)mIF7(x z&V;;_?Z6#^6;ybO>H?s&uGq!aRkB77nUf3WglO4-4~PsL@>ThRbjXAZ+NI@vOpGD$ zpo&;&LWW3{IZ9wF9{{jkL!c~<soWw{Hl{L^{tzTq9s6Utyw_pQ7 zHsBRRFYkwA78y5REt(LS>rfCr!Qpsh*dH8Dm7Fvz#0VIn!7-mN7TKV7P;`R-X*^Lo z=&BU}<^(~$I>5>m@npooa`v9?D5fa0q2~v@a#@%v8_!nzfM2xROo)7=;k+D;yE&Hd zxZNnuF)T{qK#Lj-6p89M3UE4u&OiYwZs$pON~^b6a0{77Sa5>Kw;F6((wa};gtmYr zYzBQCYxf65#?OMdZ?Eio7)v}AOIrhg5&3|N=d0pMC`P$rx5phl8mP_0J`JOJR7UZ+JcnIabJoX0vT zE|S|bwtX}i^5M~J0lz#@0eNx`_ULxXQ@lPd=L?p(f|oT6!Zus{_F6sDQajNkU# zc=gu2hoAg8_l|DM#_o?k+ft{z{@M>CllIm_(!;Jrb0@YfYR!sTR<>sr&5W!`ICkvZ zm+G-qnQ+3%E1MJ44dx~H_Po3A+ho;x)7=Y;RpwDwZ(gHSO-tAPyLh_leE-pu6}hQj z45;pQ{xYvuZ!jE$BK7lg4oE_^Mc6T^_s14w`{7ABH=spLRcQzL)npM6(!ZCXGr_P3+F3SC@iZ{GugRJ9a+#8DP!MSdsNXnY5%3d=;Ep@Tq&Kk zW`x1+#wC3#_b41XyE--fod(s;!gT4-#{TTxlB4;e@l;EauPgn^$9?#+iOKCq@9&)_ z3ao6_>CQxGt89DUgw*1n4d1u+Z2GVj3UxH~M(*G0K^5aJ&+gtjqT9kq$CfvYFz^2~ z@5sZ|ow?Hb9W$Vgo9h)7FRmCFULYifby6C1US&~8)f+0y(;)Bh6nIwn+-;2tDpEtr zh#^v&>$i(U6je|3EIYhrY2xEWGH$*zeHjCt!?Vn1+uezEOf-m+Ey E0hXRQ8vpn41)!b7=Hl(0002`twPcO00K%$L_t(|oMn^0YZO5o#XmEKpIHFbyMM$X0idZFd3H@Y6IDRWCHx*nW!mFLn&Z2R$aQRaI@Ca1g{n5oI+Q$LXVSk-2T zHm&+cl()#d34gU2wBrrlR1H)qwHAi5T!MUm7VFFvwsc<>0tc-AEbrgiUcToci(A

    Dz&5tb5OsXh{Z*t8CCR{Ylm@G@2Zr2L( z2w*DmB=iv{_jwa1i%b0UVO6gf<^ey4q-L4etpyi;mTsYPNd5RuxPY>0@+ zcBiAvJZ}X6#=s6lq%M+rJYfK7Cyya^AQiD&njz@eNhayoRYYBl1R@ehD?Ji+Ci}^^ zkI!Q+ QZ~y=R07*qoM6N<$f-9IJ-~a#s literal 1575 zcmaJ=eM}Q)7=J5*QbeYxn;)5HSrnYt`)Ets8=cS=v5N(SI;t$D*Soj$2JO}BA(i2* zh#HN`Vsw#ghHf&AlIdJVNQMd|OycHOoH0(LL!6?{O*Z5FWb7?a=O4yP?w z@A=wPn4g!doTdZ-B-<8Ri;xVXH+yUx`ra5@Z%1OPoa>Z}MUPy?N)Y7mq8nm1A6o{C zAj_{>aRO!m5Vu}%IAy1O5yOc-H5;{2hkOBq1|VyGD8O>%P{!P_Oz@jj_uAT3n82G< zB|1B44_KgASXeE=;_7?{S6$8-dDZ-Pv8)h-9QdHjVj*9JKgfhksv*A&I!D!n3L7$! z%T20bQcimzW)UTb>D3g@ktB)fjcPaPF}R_ToQKgQO%W7LP&%BZ7+S|rI&9=op?DJS zVT!B^MxvpcN#&L007DQ}RaNRLjarn-2+C+Q5+qH~G>$Cr;3~h&hH!r{E#|=rgPbG; zWI^;}QID)!tdvbE#C13cU%+mE?${q3DHSRj5n=-br6viVFPhnqbxJ>bxz5Bg=B)ucjy)V#nmq?_j`kK2ut zJj>x)5^8XRK}+MAycY7AhD?JNYGZz0hS%v0x*XDKHd8qyMdexyRt;^*rASJ%fTpYl zeGF^!2W8gJ!B}ho#U8=tyb{Y;B*@C5GDqV$ah4{qQ{El#qTdODM(X$|C5BY6IW z@(m9v(x5Z~F*XdP(Hk|;?ZLI2F%xHXS`TidSr*rLG|&Sfsnus{R0N_(L?`EkNs6h^ zct(%UHv?Us?-ulVKY;UY&al7oYTU;WZ}1%OerZPpw|=+eoCt=sCb zadjIXuDRXDKN!svM<$6!yZ9STjoe^%I+M<8opVkpE0+m%v`$pi|ww`iQ$_A1G}5O?UMqEUHy`{?|zEBH!<9=m>KS4 z@3dTezhg(}(z=#e*N%65o^qB31vQlgu8mF2$I_n8wo=RUPu`nw`?Lj5j##{@U{7_| zlOJv!JMOxcvC^Qpg5iJe*Z`EJNAn(Tw$0Hd>{@OpIGVU~-Ewg2NwY0n+gXeM-Pzl& zxVt%++|f3e4DQxw+({jk;q#a?;o{>vuPM$N(-U2b!BXp0ML>F_%wGC-eCpHIpMl&B u$Ac5y4NK>oy0H5}Tlen??c;m$!U|Awa7tXzygCuh4zT6sTMwFDwf_NH0Xzr* diff --git a/assets/dolphin/external/L1_Mad_fist_128x64/frame_8.png b/assets/dolphin/external/L1_Mad_fist_128x64/frame_8.png index 570c8b0c4c48cced5794a0adac9f8f07f3d3cc36..9cf7366e4b9fea0b3640d6499538262f56936127 100644 GIT binary patch delta 634 zcmV-=0)_pp42K1f7=Hl(0002`twPcO00K@)L_t(|oMn^2YZE~f#(y)rZ3As-4F&=| zD0mYT3kp3HlAb(x5=`j9Lk=EvAAHt0m=jrm#6vC|Wkq2%PGa#$*3ZLIZ*|>*Z7z-{bieLxJUUk(zYr$(}N*lO;IL zb&pVPo>dz<*?<3UsvS4cr7>EgF~xWYgXAo^U%UM?otT9dKT^qAq{Q}7LPPT2x);z7 zH8hACvP^ZWemLH$p#c^yIvivQo3rOdbj4O0u`8vm`r&xK7TCsEsh#FMQ+bq8?s?JD zz(}?O7=PX$&(|i;FwO(^)4#3rA{bxfkMw=l+pu0_o`0Qa_{I=e_FVk_7l3v7Ds6gT zm2T41W&e2BXKv@c0}N`GO2>M#hKOEpl UZWBeis{jB107*qoM6N<$g2?M4>i_@% literal 1581 zcmaJ>d2ka|7=Ix>0u%}kU|Ru~w2rNIvsZ2#+R&sWnABQQ8t!g(Uz*S)8#Y^##-b@= zxv>sd9mG=35r#6Jj0{=}j8bMmjtT<~RM25ir~)!&KnroxHpm|gJG1-V``-8azTbE4 zs`9eZQ6sWO002f=rkg6nH7dSEGO75zDtp%^E}4SaAnOs$fQSa5pfDVunOZ0yPFUmd8{{_+ekVsftU+F- zvf;KsF?4&TM|e0hQf6l&wTzCH7fwYA!g|qw4+=CA_Idq5eb^u$u&WpMaWN)G22_Mv zgM5&b!&Z(Ib38;e3Ib(t97i-dg%fvaoluA8BP31|7(rr$3MC0WsnQcFWayEL{&?1< zuP~Jic@s|txmyqddJGGNLW&Tj;P@Jh(CKs-PGTg9iW+FJ-Y?K$)E~@FSTMmL!+QdP zhw~$Gi?oxg6AW^Z>tGPRfX(*Eus=AIDlutTm=0is0>^y5cw__GL7@WvPveQ&L3@1w zVihpR)$xp25m$BsEN1WNj^c_U8~tm%M=T5NHE~Rx5Bdd*$siYR6s(8U<4%?#Tuvv7 zvowP$aY&(Bt&&95tP-+nty-&u%7mRK;Z+)~%7~jvrV&P*Ak4*D6GaxA37nuxNW!Gm zB(N5LP@w$`O!)SQzK5{pr(*TRJfsDVw{x5~(Ff&jPT+!WE`X4ff<$s{G~@BdC3*2G z4F+w3yk`kyOL)$Q45V4_c>)E7fDEnCDN!eji{b0EE>z3lN))Hn8d6P@Bn27y5T1Q3 zeS?iEO2jY%2{w9y(&#AYbfHQ{r$%X&(uL|snno!X1ziy0N{yP5V8<6P@FrZyRKqq%f7`ECm%{?4IK@AZ!|VOyY(%rq`8MkDT>JO{YfV(e~)eG z$lL64)<3v^es?-(=)DFef8HPg5B|*Go_6o`{VlQ1PRF<}GaQGbWn89nL+a=ZndH3Z zFQ8nCMA}_1UcH_o^%sP0D5P!4WtTo?kXtv}-u$st($}$f*)J!TUw9~&;w{6wM~xoY zM5h2t!PuOPrcBwq`3J9@ozvE|t$$&A^3CUZywCjBZoSvKV`oue7dXxyPM0h)?k&t( z1gu2S@K3krfjtYF(j5O%;9Oec$XVWufb2+a`Kx2RpUuADCN3{(q|epyIdd&dZJk9) zi0zP4du!9~{A;VzHv)%x7+BJumoo28&4eEIkE<7%PTL2)EtVAv-6xiR%;};R<12QmJM#- zLBaXqYtOc}Z>#lYoy>~1I@Txv$L;w(T1jsLW#f0{rdCSUcJ-x#Z)RP*Uwt|iSR07j zbDLj^u3H|O1OojhR@z(m$sfKq`*|w5I_&uNy0m)Bj3zK{UNwd+OsbA_WrDwVOqi0t zc@mhKw*Te8jj#J7-pVWX7dnS%c0^Ex6-Rr|S*W*8Mi@D6SZ(8-T{{Xy* BGI;<1 diff --git a/assets/dolphin/external/L1_Mad_fist_128x64/frame_9.png b/assets/dolphin/external/L1_Mad_fist_128x64/frame_9.png index 2b6b6e57cbe2126dad0a5e24236024079c1c6fe7..27e3dc369bceb8cbc58226ee233216b79774aa17 100644 GIT binary patch delta 637 zcmV-@0)qXp42lJi7=Hl(0002`twPcO00L1-L_t(|oL!T#Yg17a#((#`R~u|Awpa)_ zv>=EGirpN9L>C1ohlCCe-7IwJ;Gm$*3v_UB72KN5@-pZ@Q1VK52~GvINpVRjHNm7L zP2ao6;k~3u&vNhi?m6Fg5BIwiBJFBT2g|uj5`Pu}*c<|r3V%RH20(Js8&((tz|BF< zjH(t?_r>bDHnn2wG42dGC>r*){J1$U-ywVuQ)9}^^2Sg8@)iISY;N?Yy0Vm`v6|1y#(^%6;6YXW1 zJD5tAB^MfL@P8_!Dy0<}Q>i|K>exMgrRj{$lKJ<&eIlc?eB~fDHcNeBeP@J2Gr^-E z8gd9=x?HDyT;A@l`3S)DS%c=M-13#vJW_Oxpl)$}t-Rfz@*~$;C-rXsp52|AH_w={6t+sGhQv4Kg-*Ui- zkOHQOq!8|HgiOAt19W`HC33QJG%P>T&+SJL`j`g|J(px2rWR^e%u#yomJ@pqc=K0xb=9@x^*cDq*rY ziocB}E!VltkfR51mQH}=d(;o>Nw0_paQI}PAwmnlnh7&&9*cnteM}Q)7=PQ&s(dJJh5KEpBWhbBo0M#nqTPan#%V<^zYMF$NHX01e)&N-YqhW@vg%aX}HGIgbx%Gp@=BN3BqYNIVjTZByfT%CJBeh zn6!0;A`%l~VbV7*`_>yx`a;}EzR;Goi;$57(JKf`lYLMg5F{ZI5W)yaX-Q;;n_>A- zLNYT^rQx6*P~?|Gu2>X;$WWST{y7v_0rk9A7)b*|k`!b$ zBlg@g=^JiTSt5rKPO_m1%4nvb&yVU@vjJuFIzMVA83v{N6!b%g>x>3UgUJ-JMCUxy zNlB61o{8<#$&e3EXA6epffD7((MfxaWn;#s={BYyCjIRmaQ+hdT<5YE3{<{bJ7j?w#$6N9MYCH+{O;&CS7K*R_ zC7j20p3?aTmRwzaD;=DDY>OeMMuYBlW5vnXzUyZmD^+m8I$uYs>Oj|-=8dBbS>=k; zryhVe8VmltbA0WIU&pGOt;=rDR&|UD?SJQ3?E1yIPrhkU-fCPpD!+Z~w*yW6zPjmM zW#P%{Se|-HYMQbHpGbk+iGtBmmD<00!luD(o$*@xdF!;J6>awv_y()(IQWJ8vB$PQ ze+wIX8Jund_fb>YqQ7-#z+zKx<;=U2c^uE}-WFe`=G!kc+e+tTXLJIb2ALCXF4&&c z4O(Zms*k}PgG>H=e;S}BS?EcncpET~_dutVY7M(|DHLZ#0YVQP&9xnKN z($8zJ5b1`ToXra^sKur~rZ#PT6ivI-RxW+n!AD!SWc=3SOgp!ds8%A4#(lAuItM%F zDrVTKRT*RM;jv6roWvWZNQ<4d7cLI8Re^$t9KRvwoVU;2 z*mAY#H4s&9d%ak-BSD zATljo0eZDS|LHYFwPXG0m}Ka)?0$3a>g?`OUCr0OP;`_|cY=()TY4U&p!;%@C6>9< zS(@?>39{9J+hFdozO#qlTIK%i(WU5>_*uoHSE|A8tW2zJpy-3dKiuV<=h#(L-Si(i C12D7z diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_0.png b/assets/dolphin/external/L1_Mods_128x64/frame_0.png index 220908495ad987548598b3c9d253b5c0898a5e76..e185204eec4551d3af3f18d48a6736e067d9c055 100644 GIT binary patch delta 661 zcmV;G0&4yEA)y737=Hl(0002`twPcO00L-9L_t(|oUM~FY*S|xg};0Khz&vbWkDS% zexR^>VnW0Lx}y$R8w4|qhyn5}b;t%turNTRMo4t1I#dF|z_SoiVX4Z1KtOOnf(Rk` z8M(2YyywGU2NGC&$8R|I{OA71#MW{CU(hx)3pRnS05qB=6n`Zt08GG#-+5{yjSBz? zlqHD`08}K&&O)&dy0zq6*GAv^s6E&~BaONHElH9~Vnf}`j1d@A?zc22$$=Mus#c}3 z=`DlVsU{VD-Ljeh?S~J4GQrD9==DOF+3X_*U}9oxVy(+VuyKkV_e%2)+*AzY5kT(b zc4$0-wEH)Z;eXhGlQGP8Io5`^ zcf}M1@J~I0EOq6zz5z59w-2lq1B$20`UsesM@s-`VJ(3Qj_n`%e!Xo0s0OeH zGO!cJj;BCCdm73qSjMsec}r4P(wthukUs#60Q^}uGk<3Z_!&ZoV!*j=r8nErN+YBO zFnFc)rS-W%7p7X00!2?APu@6UWoQEUfYY;oO~aXx<9##pj7GR-5n~ba1xdcj06>RI z1mrawj#S4wvCY?Tv_Rnew$k|{X7)Ko7UHFNPqh*c4@s{i52kIrFb1uddJMSlQ-AMH za9AJ>|JTgSjx|2%zy6PAX0IcFOYMn^@3$-c^6A3*F8Uz=2>^%PZ}cJnrkX$@*>>$0 v)hd#P&2h#*jet{@l#qw0wrpnKRsAy>pDR>;R}Pig00000NkvXXu0mjfKSVN0 literal 4344 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_10.png b/assets/dolphin/external/L1_Mods_128x64/frame_10.png index e90ad5e90d9d22f6dff7d583ff77c79483616922..d09cc03a0e781b7012e38893da2ced098ecb0c1b 100644 GIT binary patch delta 673 zcmV;S0$%-+BCQ3G7=Hl(0002`twPcO00MMLL_t(|oUN0+Z&PO!#((Gd+D`cL&C(5g zk?6og2F8e71YN2QfdR24`~{2%slwMx*#IFH7BaL|VSxb&Lh)z z5G8w;2q#0PdS>Qp{1Ejm zq7X5gljJKrZvdJYA%G4J>rV>HiOt41C~@cKsbB6S%z!~V_K{@1QBKlB4rxRl9JH;u z0<;pU34h?eTfJS|z+uj)g>E6BJ?wxGAW-%9m=FD5fwonutHJu6OTa@|rJOt?2>SEK zfVWUwt5U#xkfp^=7gv}d=TFVd>~Q^)zVvpQnZ1bs&UePny&F~g>z%{u4tgN~H2@B{ zUs+A#FxdcdwfyC2#brrpa-6N7GT@XX)mRTv+!{2qZ=(J$_SP>XD65@w00000NkvXX Hu0mjf&rdu6 literal 4370 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_11.png b/assets/dolphin/external/L1_Mods_128x64/frame_11.png index 031c0ad81a1ce3f4f77b62f74dc865fabc2103ce..78ca6798f24db063f73592cb1a33969493b39fbc 100644 GIT binary patch delta 656 zcmV;B0&o5HA)Ez}7=Hl(0002`twPcO00Lu4L_t(|oUM~PZxaa=g}-|}NgQ6DG<4uW zf|~pQgeMAg6oDdbLPtl5D8OT?Gzbu^w4wkPXr0Dnxt%0IlefyPyU3gje- zZ2;sY$u7Z28}#>*?`|9Y>LY%#jRqRU#fBuwC9$n;X2t;Y@{0`>B{}d8(726L-7!mV zwooIl|GI2cfYql@Pn+QVQE0V7nBM6l0bp!w_r@Bx`e1ora?j)JoCAM-odUKZfVu-G zMuD{X45;@-6@S6(`Z}xCv%?Oh$;p>kC0!<0c!4A7_Dx2Tw^bn6bUHuH!~m#C=FM?Q zS2Z)E&S!_>=E^)!Q?fR+fzu*A76Yc*{!XLq(7Ui_7F6D>KpqGGGZzCNhsr=c074?L z^QWd#z_C)s#sTY6H#5|b)Ra_Iqrc=8-~j;hB{OrDfPZrkLX-f`L(49YqA%63@4fdy zouy8(*Mvetk}J9%)vv{tgBpPMSeyTM0xpJ3wav`COw4au#Bju1Mv`xErVQvrmVm7o zhqc=9dSY`ij>@U z5YSN$Kz|6}Djl4jo_qw5QuAK0weSb<99ra)JB2Rm0DRKDX7|b$Dd(L*TI}-3Mg~%U zWoBlls^9dzeaOu0V+3$>b?nCHQKdic9F`8y4gshDaMJyLtN&?*8jz_B-JMaKm()*= qv-jHoI5|lbwn7xw&Fp_s{{i!0C`ekSqvQYp00{s|MNUMnLSTX_0yJO% literal 4342 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 Y^oL+X!q1V(-@guPi=*awrf0(c2Rp-`h5!Hn diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_12.png b/assets/dolphin/external/L1_Mods_128x64/frame_12.png index 856e068fd002a75f04ef4fd9a20649584763ee01..bfe678880a9bcbdd9e9e0c8758a74df39e104a5e 100644 GIT binary patch delta 646 zcmV;10(t%CA(I7=7=Hl(0002`twPcO00LS`L_t(|oUM~PYgADbg}=RXoykMZ%@5GI zf);lE07-6)b`~)|z{JklMn%lr=`6Jn#KsgV7!gtkLYhpJfZC{y2x6Rxg%FjQ2{Ds- zWR}IfiI3V{owGQsvsi0w6Mv8Me}RUXS?~wY6o9g+Kwgppz<&g+&-30gj#+>*3`VJP5{i`E>u?uCS#ig1g$t5940A^-nK(DY=Q&Exw9|4`P6D*sV z1FS{#X2vQMvKJ43OtMu58Y?Sj0^sBTYPUuLBt4l( z?}PK)a5|a(oqq_R>hwy%@fhmOmp~PVVtai7W;QozET79c+tiQ6Sh>E&@Yrh{dKU+0 z$R{6`fuQZ+cZTECl3jyBBH&Faf^Htwfr6y-z0XrYQq&FjWq8YOOs_HP>xDUWW$;_NpU@A>B0i0*n zzcxUNgAq6SB>7e< zG`!MJuveJeW|AXL&+fq4#l!#u@csk}N#gNt$AWPi>dWDlP)Y#zBWfMq52G*#;1&Wp z3J?MWDt|qQ`QE+;)B%E>#oNFuD_^3J0Bi#AMWfB`^>32AlWmJ#&2IttJ2Nvo{d`S7 zTZhcdK1TpIH|F$pK=r-yhsi9h5P&iOqwe>%BLK!KKwo*^-D$-IN$KV|LmL_33`;7r g6Qa1fTmC=i7l9!n3YW>L>Hq)$07*qoM6N<$f~9yQs{jB1 literal 4327 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 GasLPY-HN^d diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_13.png b/assets/dolphin/external/L1_Mods_128x64/frame_13.png index a0366b2cfb4478ee1e6a3261351ad2608a960caa..ad29e872d4c2699ef16c362ad54b820ded27f690 100644 GIT binary patch delta 668 zcmV;N0%QG)BB%wB7=Hl(0002`twPcO00M7GL_t(|oUN0+Zxaa=#DDK)u@k<$K|&O# z!;3^qPeZ(bX%GbW&=X^Q5?GBPBa8NS4429 z%Q`Y~{5ceM!dJ_yo~D>LdNX6<%W=Lh&@eL#J_A|;&}eFqmw%)n%z%2S_I{4P4e%O3 zAti-^B(V+v6-f&67l5^0Ki$qqzc?Fxts|yg2H4dX93F{FmUZyr_J|@lKjkHz=t#eXuN!R#NOP#4r{;I_C~?|Ah-Ax+}i>v3_ZBRW*WM9!vwaQ_z{g+mk_K zDVW=do!Y#*8B=XrxBls;n(d@e{AA@|p;w%iv|+ZLD}Nu)0Hp}wIo%v zT#@9w2krv!uxe(`0&sHZW&${mZG3TpHuK?7`{0eb3*Abq0;Oe1fg-5S99q-JW*-2L z4$|+29B-SM_kfN?t?d!l#w7XbP-yt`IKf6>a?K=1Jlx%ZV^0$U48X?|C?<)=>lq6U z+Lo~#Zhr~Y1aRM@_U^4P1+xHdA)vhgAwZz&y_o+xmw*f)=s&#${ATHSiU~jyfPXaA z>RtX%*xLf^`ZTvnc3S2;Ks_VmL`;Kgg;EK&<+8HC1J{aW-S7s zR0GD+O?Rdh7bOjw<7`Ejl literal 4363 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_14.png b/assets/dolphin/external/L1_Mods_128x64/frame_14.png index 24fd557abd9732bc5c44221f0d2de36aac1276c5..94ef0e680788de1860edade8f390b813874368f7 100644 GIT binary patch delta 643 zcmV-}0(||_A&>=-7=Hl(0002`twPcO00LJ@L_t(|oUN0)YZPG=#eer^%u8b?pq;uS z_;)0u#7f?NHz8~K?*TkRW{9mDJW)}P=)CHh?iZCEa0kD{4uzz}=_m+DUQXqp-Nn%3) z5=pWP@by%N?k)SD&qjZ9#4k3a+#^{iOOjktHj%rVnUM?K!a`YzBqY@&b&h5Q#W{LS zQtP3lX-N*OCQ!?O>eA9-6I8Bw+GvDua)YDw40`xuV*%9=hI69w?bPW$sOwzse)#F& ztW!GCP#Qxg0)HquMMVIW`b(gMgNguW*4C&l9`AP|ivY_iD~wLO#)<5!rP)CGVG#({ z1I%FfCqNtl&WJwh9q?u*g7yGvvxkDD)7?)~LG??3-{19pH()A`v`Slls=4(H3R_Wj zm)nKuJW2rU?BuZu;8e{l1guTT%urcUT~eZQBFR|=?tcLAXvWN(Wnik8W(qh@Y;a|W zCW|34K=-3s%dMoIz(iS6pa@F04mAWt0Pg~i57KFc9BZ1Hw}Eww>N_K5`y_d-2O3@+ zB-kuW|61Bl+&jAiN9I!l48R9dD5R;!8yyP{+V;MF+)`#zzp$l7Wk{9H@`veFnjrug0ORhr8W8{!MW8R+c5_;BK~isXob5ky!5Nj5(Fsvp dGP8eH{TF=nJ~pl(D2f08002ovPDHLkV1nX}E8GA8 literal 4306 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_15.png b/assets/dolphin/external/L1_Mods_128x64/frame_15.png index 3bf1d3ed2b4aab9c4801cdb145d64886751a96ea..5f3e54d9565e78c069d0f81d2e942921062d9049 100644 GIT binary patch delta 648 zcmV;30(br8A(RD>7=Hl(0002`twPcO00LV{L_t(|oUN0+Yg1tq#((GZ+NP~Gw~M%F zuHv5|Hfr4jMWnd3?t-H@NN%=nTF}M8c5qP#9R$S>yhRE+iHo>2CJI`Lkfg2oXg(f? zn~K%dGyZsa&ck!w$HeY&{x7JTnFW7=^=XcS&oB}pzRnHs2@nK1zU-0P|el91Gp)H|Exlpk1c zNa{S2G%IOmOCtg5D=Vi>&>V$UD}PHqf1L`4+Vab7SN3*5w52ydIsmt+5{An2oa4HvCit_;ZG@!E5 zWZoAesNkS70AB+7WS^C0M&b}Pm=R~$28>DlQa3j%DPW&UM^?cu zO`od)0h=LYYhYa}2B<2jDXE}pL6Wl$+ymfo(af9@aDN^`h+@EbYMC#iXl*%6z4uqu zDRm0{CQMZ&1&W}uc+#>^2Jk-c%(jxC3XN$IOAz4e?A2xi~!}t&BW4VdF!?P>m_Zfcs&!5A6kqC2E1(LO@5EfDph{ z+&?pO>VFwPjk5QH-t*hQJ7|%MZ%uXC0^qCeHoMo?q^x%aZLw=3jUlM{2QxF9Uf$5p z_CYhV&k?}Q`s9u8qpJP>bYXFVb_hTMz;XA*R(jH@GBA|vxihPLPEy(&XMAG-oUEjT iUWoD)GyA9NzW~wlI*6S$P(%O#002ovPDHLkU;%=XtSpHD literal 4325 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_16.png b/assets/dolphin/external/L1_Mods_128x64/frame_16.png index f0b44898fb76099f26cfd61c57c2c252e843faba..7bd404a93edf23b6e49bfc6ad41b612a135babaa 100644 GIT binary patch delta 667 zcmV;M0%ZOAA*Th97=Hl(0002`twPcO00M4FL_t(|oUM~RYZPG=g`fLoOg7PEC!K{l zqvQwV2Z)(StQ8Tli}rq$DhNBKgcX1_)&-!V&l52pdkpet8sTW z*_~st8!_5?%cnT^aPB=OwvOZff~J|7_XlVTK!d5lh$MMHrGJ#b>TTZHKqH8O1d5Wx zCIA9Svh%QVB0;yRZtL3cZy(XqO*GIbEvJ$sCn=d3sGFHF0C}*Ssw4?XElIt@NuX$8 zy(MYmuB3TMn_F55(0umnkO|tOkYzp`|IMT zq0xR0)H4UreSea1a&3*~zQrFNO&`Xx(PZbBsbaPJ&5_?}>-3e8_&QvQt9vk-vZN=hFr0ZD%UI8_Lv9|JRH<*{? zF|O*q4+ZSh+>r+0@xzB=1FTEk0Hu=Jl1fTTk{qkR4SxXcmCeji1&)FbVGKAPSmDzs zTB-Pb@A(I9R5wa_8)i~Tp2D{;r~An-yH`&!$`Lb zL%5AWTkPUU3-;jNn3>sJ<-2}%cAJ@f3<0h*Cog{;Rpa;5`Q-^ZJ^%>-2b^2V`X`;K z0Yk~QYx9Z%N&V(HwtpW0M^REj&qq<+%>JqRFBIexMm5(<9C!c#002ovPDHLkV1hl& BK3f0) literal 4346 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_17.png b/assets/dolphin/external/L1_Mods_128x64/frame_17.png index c98c70c91261ccdfda7bb489908991c192199121..f10d328f9db8908aa2deab71a8d4255f5c78841c 100644 GIT binary patch delta 662 zcmV;H0%`s7A)*D47=Hl(0002`twPcO00L=AL_t(|oUN0+k4#|{#((F`wL7~$=5D94 zbBRAg?3JueVk08DS-nJwgv=e)c2=QLprAm3gh+hE-H3!rG@>zPNZ2egGpza8`FIpF zE0)$Ne|htqC(n5w6C20*zo21e7W@HP0?=qGFfK^}uvAQ8<$oq`Y^0G-fE03)#5w@- zl4K`g`Dlu6lzrpc=x-nKvvoAmC_b%8l3Y?cGg3D*V+02Ir!^HNA*m^;e=yA}9$9Zn z>fV-AkhH#~nF5XH&-a_4H398*2uJ?(F|VtvFpN*fJO+DSi1ew?p(R|)fwDs>3A}pyj=nUoa*7Wk{BQ!22{~7 znOCIR>&p2B;>fC8?-dQIfL)Tm#@v$;_NGaDNCwh!VhgVA&57Xn83ddLO(~ zx7;lbS};?S8b<5uhx^jxam-pSi2m5SuW(;Zxr37%_sm}Bk zaJWj?Gk>=b&~COt2oR`rJ?87$8K6$KoelaAF9I*2O+E?gA*%p<)a6$1?3dn*ygO=( zogQzJN%7ZaW;VO@T|YZJ%*@_L0E>;O^PeYF|NZI0(l$CF04V@_-LJHVC!MJPnRL^o wg5tcSVRM|#-$%g7NlNL5D6X2>KUMz)TdYVX@ejZDWdHyG07*qoM6N<$g6DxY`Tzg` literal 4338 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 TR|WGY1^}2Eoi;4jzZmsD!#|dj diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_18.png b/assets/dolphin/external/L1_Mods_128x64/frame_18.png index 4f7b7ae82eb0a11725af52a2ece0ab0f85703825..05cdb7be820342e5baa9063e0456327749969b37 100644 GIT binary patch delta 662 zcmV;H0%`sFA)*D47=Hl(0002`twPcO00L=AL_t(|oUN0+Yf}Lf#eetq*{1a)uZy^7 zp5mV&_7&K%W>xrcM_F|l!+{|lOCX2BnzEdUKCgE2`8fQ51j%YV06w4p{R0a7SR66*jc zNs^s`rQ<2OS@n%;qrZK`PuI~~f2HBai;-iVJ0g)|P(us8~Pa!Cv1~Ac9zuGO$NebAi z>Yn!n?BvXB0|@vLLa_nXrDlNYlG>8Ws+T1>%fNL2?tfOy%&7uLAcQCZocmVzIF6PU z!h!exd#zR1%KbJ>)g`&2VpuyLTM;q<@AI{BZyHXA%y!JoyKIkEEn+lcengVDc$)#* zS0I2U4!u{SD~Zj=I4E)F;OwCX2`9jy5qlw7%u31NkbSbqgK675G79yCN&>j=R%h21 zaJXiqp?_NlXfN9!1PD~Q5%X>J9MG_GB@cQJE(0$hr{yF^jQDFaGn-lXuAiNqW@aBEfQ!w^3tz_7`2BQYWgDFkfE0lJ?pO1{NvASkB;9mn wPH{=npgGRw??d1eC8hL26xYn`pQ`@?+Q&dN7!Nva1ONa407*qoM6N<$f)9;CssI20 literal 4346 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_19.png b/assets/dolphin/external/L1_Mods_128x64/frame_19.png index b3ad6700cec06ed37af344e2373eb2bbd808edd4..c7e290ff9207f0c7bf55e926b63ac076b7eac061 100644 GIT binary patch delta 658 zcmV;D0&V^CA)W=07=Hl(0002`twPcO00L!6L_t(|oUN0+Yg1tq#((GJ+NSj*x0{RR zD*hQ_Z=r4lMMT`HyWl8-k{hQkq7E(&+Cc|(u!A7@fwzdDlembBF;UP`g(SA-qq)iB zkW{R$p7F=aa~_`aJ|?z~^M66p%q;i=v<0BiRAF3_0${n6!hh;L-q}c_m;fmhB#BJ` z6eY>d!OF=L-L3f6wb9=`;uo7}q)~camn6BQbb6$2X2u8%iqGpRNkURfQvXO=R6MfY zlGJ-3Xese{$tU>*2Ube}{Rp7zKtTyK z+OL3G#{qiJ;D6NmI?esp)&iO#Ok(NoF9!;h?7K6#-`1IAJbAwi1UR+h9VIb9JPfF+ zVKQ&Z5!7%{6@aRe=Im7FL^gb3surG3?sOtsu_Q%{8z}^N)Bq->K_x5BOA6Sj%Ki^v zr)Q5gfPl3S3JtJ~ngOayYD+4qUXtXj0=EHJDw~;80e_A`2vGt!k1YRb0Q#EBK^vy)l3dZ{sCFr~0#pHfz}nKo88{nqv}!LlO<#gBjbN8-sd6IRV`Fsk?UvI4lxo z<`x1vz<(|X0Rolp#C+el05r&V@KC0C?-K8WF3Idy4lVye#@riy-{22{CJC8 zioZ28v)Sbz`q|xMX7(`xxZ0e$@^wOu-=8il@1h$5kOFYX{Z?mq(&;LYOSj#aS6q}d sY>u=2#|StDNh$ph#Wgegr|Q1|(l$X|g|SU001E&B07*qoM6N<$f_B?BnE(I) literal 4339 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 literal 4344 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_20.png b/assets/dolphin/external/L1_Mods_128x64/frame_20.png index ea2eae4d7cb6d87b5f75327cc668f38c0ed0d383..76f90079224ea2b93710eb5f88f03fa50e176fec 100644 GIT binary patch delta 649 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 DJeHGU diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_21.png b/assets/dolphin/external/L1_Mods_128x64/frame_21.png index 00a7a6e99c02f28a51350e2ebd079919b2b17a1f..a0c56bb318d5b3aa05eaaf5307bd01e1c1040e28 100644 GIT binary patch delta 682 zcmV;b0#*Ik6t)GB7=Hl(0002`twPcO00MnUL_t(|oUN0;Z&L>pg};0K5+_Ynzf4F- z;78S|Ri*v|jb9*L5JQC2wc&4IfK~j2HikG~4ahSX>jp8#XaOnZMJ>DcGy zzXC8l?Q^?y^nY|kDL{RB8vRz6xH^Jkhn!Pg(4)v->1DJ%Tcl>>di%9W!Of`17l?Ml+!YPYx`$wo-Ub9;>n zI88GP0qasTGgOzBO>XZY;|!3db~{bZbY(7OZY z))NB^z<(zaC??5(6TpL6o63#jmav!r?x)l~`60|e1;8x?^a(%+5NPp!%-+%WKm#D? zt=|HkSbC9S0kRxrf_&**;-rwiN-~d|uJ+q#7gm z!{i$65E#PGjQh%A1VAYRa_QKe1;s^4gXB0<&m)I|Q;?L>3sGD%vv;EY3IS&~XB}F` Q`~Uy|07*qoM6N<$f(OMwI{*Lx literal 2648 zcmcImdsGuw8ovRfAc2aCT6@+`qs972GLv^w0)&J|#83n(Xtg+*Okhfq2}y)N1%Y<8 zP_ZbKQWsX()wTFqt$NxmJ!{m~)vm9K0!7`jf(HQ+MB0M#*c%|!?rB~B**WvLbLYFi z@ArM*@7_Cwu`!Xp)8|hI0QhR6)N$~c2d_{s4|rdH{O&98;cbapV*|ivmg{1GU6u0y zn3_W+B-xX+E9C@j;^KN*M{*q|3$z9xD8ymGi8RuV=*SextYG)lon#}FUcpWjX;H03 zMW#|w*;X<>J0^k1P9tP`c1SQ1@R5mw4ZT_Q26>!1 zV!{`EQ?OI*c8i?H%goH=W(v5pHHC-CWHKJg=kfU*Xu+{%neDiPW40}HBdAFmVWli~ ziZ&xIL|jL2v@6(<>39ex%OtGXHjyTnFrEXq@Gvgw3dwD#)jr+SWSX?L*~2rSmkGYV z3T#WrvXHzu(nfEz5@dJ=X|^wPJF}$HcG{Lo{|2|o&%a=(Cng8i>CqEB(ny*h zwhh{1WBe>~m6gQpv^9aIjqXClx;-L%J{Ln?Nu=+P@KRxB7ukOXZTq1+4M7UJX zG3bN>4la@!IAT;pVwlh%CIuK9`Pr|EHqurtt%unaJlU^Nsba0Pfil7mwz$YJL=&zO zV=}Rr18c-a^n~0%TTM6=8fC&$NS?)<;*ve20mF@=Y_P^z6B8+(OrK~ODP&BYa-48Y z3I&^Rse#n9C%UO$N%OM>G!C1YN@q=74m+IybaHII`wB$ z$p4Z0L|Tbd+?+zf6_&?#1;cZ#MdL-`{dc{77KU3~N+^3*HEk1V2*Xn*6B6uJU4$AF zM~I~o5g!f1uyD0ht;QlEFf2lVDkZ82@wiVT<@P=f!h5>6F`iGXq3*$OVRkhqcLew{ zxu=k37^W5O7@>*k&D^&l=&54Cm5&3l2W4X$6dy$I-gcP4^4-I=*IVUdd2T?cI}&A2rr%wl1GK^!c=rj)Hi`dz&ly&Z6qx@R?Jj zIn6OOm237fj(!m_w{R=-)}{V_WgV!9E2+t2p2w#nx*Z;uwO=C&?>9ay40tu!(Xx(;An7I@=;k{!i|=MgZ?ca)vN;NewVKX zD}7YLyO(@lK3#vN6rIIbu&nHa|Gw8A40yg?S((4Xx$6o)E@>9mOZ?`IF;o^y%_ENH=w>4x&ciajcZ_@ z_WOitjsJZ}^ar;CGd!xxgI3GSkG=mx|FkAeablX()9B$mVm#Hl=c{gRkT=LLSl!N2 z%u9Nqb;GB%04XoHw&=nVZr4lR`{o}6p(5o@*51oaYlnYg0A${kqOibq%b16RA8hj3 ztSR%$+c!|ut;^27l-t-brP}|U>kVnogLf1&0$yb7-|~VorR|O&Fi{!{qD~l zvoARPsKGKvc#&FlN_ zt!xRX@7&GYl3to+A9}lZ*`hOy>aOccx;H%sNUNZz_E72fH9!vfLGQG~jRzL@2|i4A P{rhRcW7LPkHWd5^f;iH2 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_22.png b/assets/dolphin/external/L1_Mods_128x64/frame_22.png index 137d5ddf6ef0995d0bbc0e1d6a26720ee04d7c13..bd8464e4e264c1f20789b82a37d79fafabe85351 100644 GIT binary patch delta 661 zcmV;G0&4xO6`=)?7=Hl(0002`twPcO00L-9L_t(|oUM~FOjBVLg}?jrfFeX51Bo%w zK9RwZ(ZN7b+#HBeoU~z##2VKy_#Dv69R1%GYVbCyWX(7=BN!lXP zmcDWv`XHjKclvX3bN-Wa&oOa$9RC+6o0)lk02Ki!o;T{CDBst1ccg_v1~W33qk;TdK|0zqMcY#ajFNM zZIL2X#$!@X!+*!E_ohwIIGqP-j?8s>Gf=9$0}53~>lHo$H@3Ga_f7ruh}N0@5Louu zxBl*2wCUJ+t|&!&xUvX%IF5|I9lz1Eq-l^BoCDxvCV&EtvYGinUSWBpC-P`qJ+smW znDX6oksKw!1I_Mc!AqbaNs+Xdi;`oK>>yI9kE+UJTQy`;6Ai z%tgSi1(l-#_gf^n_yYb!0`DL&ZQEfRspi``;L?0(fC0Ef2+1&Xsr`(3!`9i-hO>}N z2sn32wSSXcFbJ~%&U`@q06u`H%;OZByLW*SfY+Fx2Hsot7ReA`8-R5UR-$`9B)NLr z7Q55F1K^g;%xvWKnts(zn3=5x01vii^}R!-gYf&|BsCv^EC7Sf%~S&bhVnp5w)Nqd vQb|e8<~TaHV!+WYDNDmgse+mPQ}y4?vpf?$j}C);00000NkvXXu0mjfGk`uS literal 2733 zcmcImeNYo;9)1I-mJdCx9R+FWUT~CyZnC@i-kNI2htM;Ciej5k>oN8h3@e@MC#;Aqa zG9zYmX<4f+waCq`E=td$i}Gm|BV76%vcyM100--#5TC>DVAL z^3_63Fd?$en2BgPH;c$c7)oQ91W~9&xLhhD6we?8Mqpwbeq|`GAf-xDLLi}!5N2~T zW^$Fz5XuFw)IzJr<08dkuh%Q`N<^I7BF0rJl^7$$1cAZ`l=nM5ln-_C36lsqmZ#k| zm&e9Aksu;v;tD)!A!IsHg2Och>*PZ+LBYg6$|c4{Sg@qYK%?>Dp$^AXH1E+D!Ym=a z_XXy&{4Q3!isiWiH_hq`S*IsqGMUTDc{tw6J%HQP<6kgj=&6LR0=Io!9)=dPcGdy0 zc^He2^K+3}H%oaqcNWLlCmWSHnGqof5soBg+nfyN<$oV!6q>;5C=aU^!mdeCOoC$4 zEP^0q7>VP_7*1l?M5qz^fT29pqXlz}&Fp`aP@|DdbMhX_NwaA>wGfgL*=!8SVk!wH zp`@sZrC8Ktk`ky%!N^d#9GB86Il~ev#W*iGU&qk}K_!CoCv3}bG{l%vlT?~z5~)h6 zLMZ|_p$sdB=GAg`&TZrvsIKJR`)OKjrkgX{?C=4yPTGw?I8_VZmNxkJ@$uQq}A-7LnFHl8Fwd1(ZQEOEu@2P zU>RZPw(UMLKUzT(uwE+*K_B9hi7=isd%TpJ)mUIle$|EI2a)Hg!iQ6TG>7~jsfT2x zt(4Qk!WC953>G5}u0<0~5&v($?iyp#TpDQmU^n@Y3@MalN|5L7?`6s)Q?Ss4C`QpZ z3VltZN?b{!7)~fCg^8tUg>-_2-F6pi(!rPlQ>G|2G8utsaa^xc>U6llfa3-Urcr1O z@(0f}=y16~u2jI8DZesvT!V>H#1F4|Jo28Ed{RKTJp_kS`x3mE+Synq6x$8=trea( zTL1{pOw(zyeCL0vYH^0+kLmlz#;VBUNzE}$pY5vneDk+8TfTZSPSkbz<5ufa^>k@? z7f@aVO3*q?Jm0On{6o%IRmo*X@lx=4^2pwnk@HxXvCkVT17Cdqcv#o58Q!Qa!-2E> zD`Q>$48i7Gcdiw0A2BCweI0`s3B5AQX98hfRrIpQ+th~ND4?T+TA&JSY3F3tw)=O0W>(!5a_ z(Rmv5l=jVAbn58=N&89})*x^-x79{ZFL$@Doo?FjazeiBYT==zj`*X7pUh7IzIN6# zXvgETnr{t%O5N;~U3dH}KeSIZ|6tBXO+&i^-Qs^(hw69i{c2j-;@)XaJgFs9pB=g4 zt*Yg1Fb2qeW zhOb;W`NWIcPxilHGKQT>-rtARzP+#V$F0+5?`bO{dghdMB%Kh(KAW&G=7JH zl^FpaRw0PrHGJ-94W0DkH{Tv;D%%ZCRxZD`b>!-Yjy&J>ZEM~Rr~|V>^`dhxWrV3O zy(z#%S9=7FHwUxZzsy@LK+a7o({vneYWyU*>Q4<}CDzh~vCRWUc6{KJ~IZDKoEZ$N;SDtIwI^T{o0khR8xQ?qYFm;f9q}S zS9~DMR`R#s_=`uNcy(rc{lJaDIOuVm`|ycFbE3BPi2USS z-`^YS7%OdVxw$htCpu77@BDWw4=PWeP0Xmzld|?tpET3 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_23.png b/assets/dolphin/external/L1_Mods_128x64/frame_23.png index 89690fc0382f7d227ea9a2ea97b13f7809b0917a..4074e09830e5a71dbac8036727779f077911012e 100644 GIT binary patch delta 676 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 literal 3236 zcmcIn3se->86I3kK`>SzDk_eH4?H-#^V*%6738tY3XxSrjMh_4XJ_uhM0RJ{Sz$p_ z5Zd^tN2umBN5E&mM@!nAsP!Eon$%)qeWdD%4^)m3s{(q^p9)CvvcRp z|9}5?|Nr~%%&thAJ~cQnJP<*U;FM%@Iy@J_BYr?1_&a}BQxrS}xRQUaBFMlH-{FUp zR}Mpv0T<0FQur9obIR=#9lXaE);6o7Q1yhlyul zESBI4h|aa9p(e!*P=l7hMS`GFme-O7Mo+PmP>P@k9SOgBoMep*XQU~#>x02)Zpm&; zH(R=5!K+v-%j0nwb-KK~JZ&DWRot06lIM9HLFp(8hZeY+@AL>>+^I%(Bbb3Ix@DI~ zR-C90QLrhCJh2#L+PMUWs|VJpcBKg>Oy?C`I#Nscmeg%%wZ7cc;pnkeJxRGRN*CW= zfz^zB7to~xRaxW~K~gSodLp}nxv~_GqGl;S!L8@^3k)T(C!lMQJG&!2lBfgOzyYyU zXiIkRa~Vx;Ab1pahN5J57b>kgB1%zO5{;T8J0&Ggo#!_5MuO-xwL%?8f=77KnBp=B%1E(BntZ`nkz{-R>zG=t#uTUO5u74OF~?$% zlvb7{BP|LH5I6!SX_m!Bo{?}~5)3#;>j^;HDM_S32QTPvR>VcVO!)jeWh*Hn#OTSU zk+Rzb5zsttV@U%}+874s7&syTPw4G>)-KRwH`)xh3_C~2eje4wN`i=@-9~W~!Quu% zU~s@P1TF}AJx+@@&aNj7fM)F&`eR&^lC8L{iUhMuKR=&hGNri{yPOSgsOeJ^(Uc^U zf#eMa9M%X!CDCYC+ztT>O?C*GK<9F1`eYAjz~v^(Dy(sSS0l{=IbEY{8SPM~Q4oDi z5sQgFH2?|gnwEP>^Xo0B6E-gkK+u<{q|;1Q?4CTq4H7b8NnWW!-A|EMh1{1@hj|xx zULbJ*2o9I*48R2gXUBP1OM(NmNCBpM>Hin%U1=4w1ZO6IJFE_S^ToWL+|viY)vlT*3Yk6Cozi<_!mgnip5bwUB5k+?d<{ha zJq}1#VkC|SlEEI+!6I9J6_#Mrvw&d)oDf73hqxlnk(`JVB*hA>4TvJkye<~tX--cW zc(_+c6i$**TyS8+fxwEajSvOGuK#bW?rnn5QT3vz9sot!|_KKTz#k4 z9X>ZxQ>#uIgWN9Piy;?A1%LDCU~6S5vi$Lr7WK^0Pj_%%^hI3T`xk{G+=u^4ynA-G zW^dVheM`(?ZI6}&`mYPFolfnVa_0VsB)`vQO?WEZC_i8L&cjvVWtTs31lArHKj9L2 zzqF;?ujT9>|DwDr&kBZIZ&-GtqEDLT?3h8z9vqmAd^H?-wlZMM#%&Km3;mGa6$e>C z1ifT5;z;uDUhr#8?L^Z~FZPF!yP=j_tu^5pBX`IT8RU~ETadvsCoTB;hoviSS$3A* z`1Zi15$mI{*-JM3*6S%{2YYp`7TeQ#cN-}rIL&3LzgTtqv0PnW6;AlYr;HpoZd*{~ zKd;9Gr6NtM7if^mkq^H4RZaP-m2DA$_tFYC9jyr{JTyK!$1r=(lApaR9cfB0{h)er zP2Zx=W)w)Ae#Eje|@vf{F+eA761 zC%$@U=mJgre4^i`?*^ETkryuAuCJnI46R3&4E$*AxG(2}dHaS=uKQTdO+T`+dBm3O zK{dnwaiM-o&9^&FyB?p8tOzeWCUb`Gkn;7P`j1_)(MHYRcAoH5P9^2oB} zgfkP9*KD@k)(tAc+H0qc(ZmO3C2bDTS`%zq_l(uY_?dyLwVT^7HXr>>)TvVsathyS zS+xq8yua;8Kx6fskbb9-ru~LP{!!N>E;e0x8lyQ~Q{Csv-;qBqKioF#;K0jiMK{;@ z*Ty}moHBm)No?c$1FFzg;9NMmXzazxt0QjVSMRCRMyEnE(I) diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_25.png b/assets/dolphin/external/L1_Mods_128x64/frame_25.png index 2838804e566049d8593108f52f572d6f6f185dcf..776f1a73df216db7523513a7921a31909fff8ece 100644 GIT binary patch delta 688 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 X`N*M1_L8U#0Z2)jXs#Rgdg;Fbz)FQz diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_26.png b/assets/dolphin/external/L1_Mods_128x64/frame_26.png index 2af49cf177b8ad12a9afae3acdfb1dde5368793c..4df95f37596acd927c36190b3768ea3d5122fcb6 100644 GIT binary patch delta 689 zcmV;i0#5y-8odRO7=Hl(0002`twPcO00M+bL_t(|oUM~TY*S|x#eetu;RGo7nF$Im_;Vu!%Y*}mU!?)h}@G4ZvW?+Y4cX2BY;Ab$XLl|Y{)1%L^7e~Xva z^%w@ILQazC0iYmBb{6`UKsTrS>#@wmKW%}#`r06MSLnrf9h3s9^{az(jt=3>cmkN|jxx%%A!_&wzK zl9_qRwrJTRvJoR0N#5k&1kizg0=E3LC4lzx?0h^nQhMUtTFz2y@7*zedRn9B=*+1l z?~h+5g@1Tukvem2)`J1tn8`vdrV;~z?^5sj#*Y2riCYM051S#xh+LIzgM)|e1Js!y z4cZT`08e3&Li{5E^8mcn)rIuJTzXdC>bAws_ch6k;4jR~?C``#eO}sWW;PuGTx#V1 ze79cp)uRh5n^_70r~+`%eROf94#fn>RM-7Aq$*ND(n@ojjUT(f$w{ix4pC`kbKmHH XQu;(&o|WXS00000NkvXXu0mjf`&mac literal 3363 zcmcIn3se;675)LA2qwM}s16&=0cF^k*_~%xW!ZOUX*Q8T8YO8tpS)ZtHj3(1yT^PNe-7+qquqOxB_vB8buCi z#>_sQ{{`#etL%qh1F|&j%%q0(MP}Vk#6< zTL~4XQgb*y9m6>c>oGM$9f*98f83a0tQf%&6i2EaGnPe{z4Td3&1TNz4Fq|wAer=Z%FxEzqcG+7#rH_feUqYvGaQm;ptq+PyraLnGY1|_#!jl#ENmT5;BeL@ zHHPw-M4}Q-i)xW!C6Thv2(xgzo`%KSNLo^>c@*OX9EG?7%HWKEVmLwbv`rEOTK%k8 z602fJs4o<^i3Ez{Y6)&Xa5s{8TA*#1z+-muzp?tZ2~1^VwJM#SBrqM08}y7`j~k6R zZd74fT4$u5;7Jn33`R>lwS#-V& zv@U7tE@NjU80&^V)EHyI-9r^%f5D|n;HKk=Yh7!vEgzKLa&y*)DJS+eF?o^Ta7$Er zH25gyen!XVuSU7kjt?8MCbji`*Z5Q-p}f}VTv^{nS4J+~nboC3A= zN&#nTHU}G9CSN2Yx9pW;!TiQ9a?I76C)&&r$@4x>ivIbXBd>rzjRJ30MkM9$yfgN# z2!IbBWtQ^nC6j^2P;w~m@BzVOA`{TT_y z{KAVlM;qsYm=4nmv47v7zD;ba*)`_mtp`z5aGu)c9@Ob_jt17jixRi}xYGIM{*js5 zx8I-f>(O|@kh<&<(H}-2%3noVrd1?0;jdq4udFA`6Dq-jVb!X66~8%c|5x6gL2o6u z)gL{6M1Fg&wDi+mGZ&4Y>dD%;dg1$%np!%i?ELDiCF(EdHjYC)ajoE_H&(iFc)4ZdDRKHTSMc;)3Sr?i<>_w&i2Ig0e^>9&Z`i&-JQC9W#34=hxL$d7Qs=~&9 z-YrY5S(SV-r}Mz&BOgp1pWE=G=)?j8_ws@!Y}f9b#x_rG(!`PFNAkxte^v&Pw{Kdo lv8MJxbnIUv>V}q2-WX2||MR!|k diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_27.png b/assets/dolphin/external/L1_Mods_128x64/frame_27.png index 7dc44d061e5e7cb6e5fa8ddfa4e0f099f0855c8f..3ee650af3d6e93d4d1baf9da9d41d70fb46463ff 100644 GIT binary patch delta 684 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_28.png b/assets/dolphin/external/L1_Mods_128x64/frame_28.png index 87df75ff79f23e3b622817d5ed7f969f88a8f354..406d965ea3e6c6b5196984e7fd5720e1288298c0 100644 GIT binary patch delta 662 zcmV;H0%`rL8lnY|7=Hl(0002`twPcO00L=AL_t(|oUM~RXj5Srg`fA!Z5n@jGZaM7 zT(yH^CvlKA)j9|cA}VgJqm$rbMQm<1M;%;T+Cc{eQ9%$2V(Jel4&tCVXiZvBP$7xN z{4_T`4)rcmwzM=Facj~@zxTKX@C+8 zNRnqTZ81jyz|KK`2Xu46{rPS1w~qXi-%vtYcvO`nIY~$ofSDNyu#$UJRY8&iihzb~ znEB+zLrL8`k|rcM>UO|dU}N zTRshKx?M3x^PZwS{o%WLActf9k*8-SV@qO#ykH*yuZjUwaMaDr2g(ZTr?T?s9pC+K zCtxZM%tTd34e&s-%cXc3l@v)U3sG)DlC4H6KmM&Y%YPbDi>R0xs!D1}DySNp`~|oU zz}=#mITnDU@ijxh@xU^R>*z4=$J$pusJqZDv+| zw%GapCV+cwW@h7$7xlBV&CKj$0C4&HtUj+(Z8iLUI8Da~paj5(b2IG#fYCCLD)n8P wP(CLqZjNKa_XKbZNGj3uQNChk|5W`K;d40In-3b%i~s-t07*qoM6N<$g3WI@bpQYW literal 3371 zcmcIn3vd(H6@9kD0ESQoN-*Y=9hqPPth8TAyRi(iWMK!(9}tB=p?8fY&NKu9@0QXO<|dK0Q=a3F#xg0Ja7oWnv@%<@rb>Bvjz>TXa|Vf21QkibXer zcT&!P4HbGaN`q)xX|_u)oi7WDZel8t5)m)P1C75tNt;B@EV2yI@zLRELB%aj zwL3au;X8}2P}2gU!4M9I^L;RzP*RIDiw-kwPr(=Hg7t?w%7hDMh`@k>)>F}xIt`u9hnxC*UDhEjy%uZRJs91M(st#tvay zx{Y5zv;`5=)SydMy`7E9?Tkn;jGiXO&hYpZH5__2%BaHu*`bCkI@~pmq*#*TTnr=f zlt|O#DO#kcc2g(TfdV!7pfO{1QH;p&BF{fytSTON$>W$honodxq(Q%oGVK-}CZ+dy z6wz#yIG$z@sZfw3%`C@~(C9XikTshmfsO{*4dhp~x@BOGzRtiRhX2@_Hlt=;6W|B2= z3@JgHCS{3|5yjEGV&rwi_i=5iR}DH<1y`57e?8M?%MGe-j~71(O`V)ZWTxAUv|u!n zxJNodkwv!}^g%2%j}I0gL%?4Ul|80`)6MXNaF0tm25B1lWyh7*L$s+=gmQE!EIK)= z2BhdZmOb5+`SB8JhYc4Z4Ehk2w3~%gw-$y$WG%ogd87&rKSn+TiyuxMQ36Y`SR4|9 zh?JygFH8zg8jUn33q}Pof~hn0{|ohwvdV?fUx4r%)}ZToGLI+s?)uQp0QRI0-6vy+ zzF6B8X857_zE^qYq*(C`N2M9+=xG`(=<052_k(G6^DHND0tp#fA{B%O6H|dY4ZwU3n8ERz%<~t_7r&U*T3L3{_u@owVEnDO zj^6s5igh-HhwGjXC`EHMTB~r}o4IYEDkr zJHR0njE~!!dT{xBiQ4|DL%b}QH=r@vX3ylvt6 zmej%f?mm-v<=*M$KWqT5XUb=1J+b5)Ykby<%E>!_^0RBr)sEV}O-D}_g9YhTPfwcj ztCYgVcQ>RS?KPyXT#9MvJ#^)wtgXNQ=Ppy9)|AS%Q#g6#oQ`N)rDk6s(PPCj^#nxuqJ{}c!=#m}ymRvn>Hn(-%s->r2 z=9K2NKc9)?V)N$}TatVz{RF!7r4L%c--&{5@r%?fo zEu$AL8x@zf{)xAj*7omz>R`h*PeR$d$@wX3KLu}OEx7DDO%M5Z!KJ*v|0NqpHCu{4 zS)jp2WPENkQY!v+V<6Zx=FHrjSj+jPF_ix6#+d3G*JsrIDSuiFai-U+*7|Mxs^1@9 zId4yFSz-C;VKvu=H^rZ}0iu6xMR|DNtf6+#sD<&1o?kg2|H8F*`cKcwId=A=A~A+z z@@G}?V0GR09nZzQ{oC2r@cCOu(+-2%IiRRy*Eg${@7kUi+j1BWHu zJ5YRLck|VjgvRnomzUhGZ(1}Z>8TN?=QL|$nqKqFK63Ko+SOMKRn-Y)!Y}^u#|>YB qv2Xq^Z{w^xO@jw*irdutQ18{fR&GnX0S`t0&Sa)%+jpnsm;VQXvYayj diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_29.png b/assets/dolphin/external/L1_Mods_128x64/frame_29.png index 2fdb9d736412fb3a40d9b88a97b45895d988b3b2..1a46e8b01421d5fb37cdad4329da26c14f2eba8f 100644 GIT binary patch delta 673 zcmV;S0$%;17_9}67=Hl(0002`twPcO00MMLL_t(|oUM~Ri&F^{hM#kClgaosH0An-LWJ zAc@YJWb*M^Bpdu_J=NhoaLxLPr3aRDT9Dk`zQ4(5Pguuko(| zo&wCJq%bE*{4W4CNeZ_A26VTdxzrlZre~wCeZ=$@0H!A*o^#CgAmQw)jd-r~}+w zqV*Mw0g@X|dmDJ_7g?Gc#NGXHEb0cA1$yj{wfUU)HNxwWjcg$vJu$SzKQxLKsqO0Qmz3F00000NkvXX Hu0mjf=;Si5 literal 3106 zcmcIm3v?4z8op_jXQ3d11%Vv~#6mlnMjhvkUp?fI+?kXX4}lfB+wQ) zyR~3>)q^0cP{gx&E(?1&l25q97Gh03Q~FK-lPvx z%I>qkLQnb}Kb$saic^|XB$;JAISETB6%c?I21TsYTdW3z(nLIrE1>((Fo|PflVDLI zo)U71<=Qhbi{^(Ir>6*sq6`>s*3%qoWcYZDp%{v!(cehWyug|S1A}$^aOBM|D}uvn z>+pr167j-d&?k^&NlA&m#Gu#wZjv^e%_PN;3_~CbB2cCV#Zp2IjP69R!hq!W_<|ly z#X^XpOPdu;#1Yf>5WK!FST)d*CX_I;RP>Rwo(hH3X=t}U*wpLovJM2(W+N{he7gk> zILmyHbijZ%%P+yS*-#CR?sVoW)Ph=|Q2PaLU9azBC`(-qeY5<<;q=H735%f@VF!>c z9p>i~EPf~kHNR8SiaQIH+368u7(I=}=6F;&BD=U zjw4Wwa7>m2Me}<_Bs7m#bVJgoxgpptg8fTjdXL_bV%qmn#Sh2$@h4~VlLOr1BH6~;hw zgu>7wp%{=tM4F=sPNqyeG;n5@3wDP7f1%!yR;f@_-4K0YN&MFb^JsGKt`6Na;IFAe z_rZ{%4{N)^$o~}I&noZiloZs%A!!CWYMLs#yQ-ViePfywqk%QEW&*X3i;y8p5h4YR z1f+SHl}%xs<0lySIYhHSY-&97fHuK$|@(>^yGFC6jKhKk5~T}xH?w8Sy~@YFrEcQ5FU zDd({7)y3bfzWUj2@y?y0`@x;2%8a#f$|$fx|5J0t(+he{ynA`)fh`UBulhdNapm>| zv951I`48&49(h!0Z!qf01YpwTPM!I(b#-F%+QrzU!Fi@wLDh0M7Qev zKOYC_Ki+f(`4MHu`(BNUKGmkKZfG0uCEpPL z>el9C%imy@?%p>vt#^D6HX?J`{M9wwLC`e0a)&ee+DnUlAl6o!w6Z6-c9c2yaJL2{~{|)%_iTCyC1&89thyy2| zt{4thoXoV{uG{8XcUFA+*nrl}i(|(E>fO>Y0M8d4`)~YsHa=@a#oSAO)VC&Sy7H)- z*t7HM2CqE7D`VA+Z7&q$CXD#1aiX|0t}s?p-`Q1Jl)O<{SvT;gKJ9u$!IAp%)@S~J zA9}85()2Zhxysq5lacj>RalNB)|aH+O5&vVPfM-DYf2WyL&0 zUFwY|KulCqRYcDjGxrT{G57z+>fGx7^|im;*-t0x^k@UQs4$tLji-OVwxKZ%?;^nBIg jQ+3I@vnw7S2^@z>3)$yPN`d}nXcwQ6HpRLkPp|eMH diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_3.png b/assets/dolphin/external/L1_Mods_128x64/frame_3.png index 1b0e77426c54323d46644d443ce364301dca1962..ea3f7c0061c53c2828cb31f56551649f29fa06b2 100644 GIT binary patch delta 652 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 bLx2O|;^IXc4Q(KPe>p5ntxd{|+%EnP;{}-{ diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_30.png b/assets/dolphin/external/L1_Mods_128x64/frame_30.png index 785f19fd04e3b9259a8313a465b2424699871c25..f3ca771915cdaed50b9707935ff2296e4200c45e 100644 GIT binary patch delta 648 zcmV;30(brE7nB8%7=Hl(0002`twPcO00LV{L_t(|oUN0+Yg1tu#edJ!Ym@qwn_W#5 z2XS(8Y*VR&;7|lztLR_gq9Qgo;NYl(i%UD`V3#@wg^Ki6Dd;3F(#4q6L8yf!TAQZ% zI1cw#{8)Xa_dW2Q_i)a6O#C^{{{>oRX2EYjTL4O@1{p~T0Dlv(KF0@3Ii>+($VpOQ zFl`A(8NhBprUQCf^*_HY{;i|*dKXGb%S#POl1oC80L;vg#6TJpmKrKca-gCJow8Fb zn;GiyGCQX3yrd~fjt#gPu@wWYm6fxmr0-Ua-Rfqt{=bf0A-AxrW9^_pS zncXP%zR2El^?yqp1Lzk4>H(Q+Ic-3*{RZgas0zU4%}u_aJ3Z{!F#wC3YaCdZH-|&e zBNMGI0|lJcxY>!s5`cjI#S^P1fp?Y5P|rBcR76ct>q=e$YjX);s^w;S4JS_Sn%#*Z zfI%ANpxP@;r9mYxu1rie0jFhVAz(e~W`-J)+LFp@B!4Ea1CIfCRxvZD3S3Cii~wiB zvTGxBSPm2IgOBP~yXAHn#u}0W6`?+JW?N7L@B#3AoPIZCvSVi619q&~K3L@5kR;zq zgoZb>1iuP1ycrEsO3v=U`NhZp1MqAFg(&jUZpVUg+cz|fTSO%S+>ferWIv3;EPz`G z=r}+K5Pzuhq{PO~ZAk16`il>Nw-#Tg5CLog@L8kn-kq4&IPH?x0M{U-%2DykGrpMn4Y002ovPDHLkU;%>aSt+gn literal 3051 zcmcIm3s4hx8s9*vfM9*}6tTAJdga=}Ci_aV8wmmlufqUEUJ9IUb~likWMg(A!5bv) zaqYCVb6A~Ldvek#)1rcUcl3!KoPvtORV?25WTYKY+QQhYTBLA#|Aa^N4z1Ih%Vb~w z{l4G#`@Zk@?e5E287bkRk)aR-g{P$&v%%2|w)o%xurF>NcnTasoT;lM2%0(1w<(~v zc0@o>aGo`%KrS$?&~c(&$?~FEP4dL&yD$7otO67LDm2Ofgx=K_y!!Rn0P!R+QEKsS!A+sLTAuXLmFbWdqvN~m} z=zx8QtXV9R^$1`(o`T&u1?!L|$^;6g@~}=7uEcyPO&Xd^_cyiMr>rG8sT@R^;5#j_ zlvCjpRM~>}m0%O>09yjK zxSyX>XK)FuEV^<;(KgwrtjUNlK`3$fseG%07v0j+K1LG`f{~R4Jp#H$p%{r`R1QJv zD7B8jqcL2EVdJJIpaY(j*}IJiItL?k1O>W$m$ArOEfo)9YBK549FojBI3dlbM*u0M z)ynHM1kK@uphX3aBvFQ;Xq4767)o0x3x#1?GmaB}Uclcda%H|s`25FZ%ZnVqn5w3Z zpe>k%6<8F*G(4)MC^JekS}n@qjMhSu9LF%)NwiFt6-*9myA##NiU)`sVde;mCQzEy zT2Ko|u_#NEJgU)<3`XMwfpHcD{vobGw23a0$b;&Vcdn-y3|TJGVzq%AQg%uroR(zJ z;EYCtf*v6-&*?0p%gzF!S?z3zpmI7&e6j~LK)R_`3G}#PVvtq}>nF}^R@kpj9n1NK zLXU7hH3&R1v22~D%nz2(IIO!=0HF6#$+(#$T4Xot5)w*4OMX;^s(X=_*z)^R*N`}- zvCtGs;S`C|I3=L01;~UUNXl%X)x3bSld1n-s85uYD`g!e0(iozkpCf>2a@}AeVAqd ze@Y*wPe$c?u#PKC^`GMVLFJQ^k^pAdCrxRhr-^LIRCnX1A57Y!CMkwuP?o^WC@)YL z%3^{V6>u$2@iZgw8cVF7h0Xe7SgcvC6(}&07|Y=(z~z7{Xb#12Ld$B+0>^2o|Hhge zZA^>NiFATmO<)EbPcqU*Bc7a$0-)PD_fDlU{Oil7fG7e4vtVoB9h zl^_4l=AjvN!fzD_fE+~TJ;*Zjy*H&-8GIr~*>tJAC+3k_l!e7Xr z9ZiRVU)rFkhT38WXLc0khPAyrwj?YdxBJSqvAzT<;hg2|f1zN_%#!U~^R|54d0T>FiffQvkM3Q6CVtQzsYney zG*^FmeNco@y0u`&<$dCf3qjs`q`KqrrQTjC0cvTipAFe6hir?ghI`*wP@P)*-Fsh$ zMto5VAqmgs#$Zhc1~1*NIs}CZ4MFIEf!`b%g&li3e^nO>4b?;|V){cjdmFO1T_V(2 z&#T4V8KSI!Z>cXAB-@?6nv@puBW^HB6+j}zGKPlX~?Nt2hRoxro zmp$Bm{ami`;Scvb8(8;F*pna3eLiU=bMxGm@R8x>Q=k7U-#Zq(^<=v7!iA1?xsDl^ z2Ts<#=NXb;B(u(TxC-;E4UJKQt-H5e@6A>WHeT&ddo8T`d;PH|s*gf%Uh=*_rwgk2 zF60-cUdVI9`_0;zzzQCD25q-uo%5f*+|$^$_%yt^FV*r%`{JIHzioJvEe}3^?9rC< zFF~`PGY8C_UvoYXE}HF3Olk_{+hMI-_$` z3YdkWL(hF~zS10A8+g6wi}b^aO^xKo`^C-1fYDRC9?CivKe}|58#0tfE#ZRpM>^=* z&1-H|A8ANgw9hLgbrz|JCHEv`W;D=A4HK#@u}5Zr2Y@k!hc>dMicl4=(QkbakfrA<3zpt{6Z)1(5ehOeeJq#b_O<;m{@kll%MZ zUAfrluyX*GEpBsa>4iDygBpo&V-*N+l!ndvV@qP!>*M_!7l2Q5laNn1icRr3g{7%p zd2BDnfGL-puN7Q#jA-F73m!C@d(qge1rw4yYnHI7(SNZb;3%1y4_J-7nW2KDNK!_H z*yJ7H82~Tm%*?R~T#Kg}0*)o?+U^Ec{aAbByQ-Vjj08gkNuE-WpC3Vx18@!C^)Se1 ztYT)a1{_)t9;CS6A;}%YKS_V z-@E>yTz@8WQ<8IMRXNjRmmk6cfHNP^`B&w5!|^otJk9Rm^x$D^w^v_&0(|VDOb`O> z1Ms8Lh-!C#Npe+5Qm(`9Bn|-F7c(;(eLtc86H6E2Es!nDrtmqwa27n*qPbcot+irwY&lgl$Sgdn4P)9ZrI&fb{1H` z)QQ#BaX) z^g>#8EkY1ko+&5ak*`nFa-t=I&$2M*K#%1qWM`IV!`<*12| zlCM(falI`b7){Bwc9310p2O9aa||z!UWrCJwGhAp94zXzn5~l586}^<)xvxCutJVb zm^jL#5J z?7X1O(j|Ig!KWy>(c!RZ6^iQW>WFG(glI2Q5Ddd8a8f~%7_`8o8mohKVpeJC6oL*& zoZVz|m_#e;Mq~|Qr6WoXnNCi@Vw;AwN}e>qgejb?O+iH9?kPhWB4kT0ot7GX@Fq=_yh>}sf3%BXlcQE9+>43IMyLlo#Jf{F= zV1d{Yv?V6^*|hO?z&b>GjwqU^3Y9q(5hck80)2Fq$;yk>(qnE$9tWUf9Uw{$t43kC z62qw+QmLiXT2dK~6IvXfG}S{L@T`Nq)0ouc;G~wM;Bkks$eVzfR;T-I;LvPs)}T zIfyZxO|2T>1|@AEFiub^F%?eHn1*8v7>=`mAQ_(57}Qf}8Fmxw9M*h0s+$!L5lJ=2 zaE!oV97_XC!&3yt5-?>PLjes(DV4ZEB}c!D8!wtgyI$mBc9pk}r^Lr++C{-+hA*V7 zq&PGsAzn=|YBdIHBu9BpD~NUr3x#H~uw_7DvzEDK4{5;ZCYvN!;~GyRWrGUOo!Nv= zs8h>w?xu*6b8a;NUhWw-&5-8%o6sa|wGlwjd#Gg6OcDi0HERd4Ww0bas6xfv$V+V1 zy{QX~5@=YC#Q>}%BMOd7WS}Pnv$ocactRibyv>Zm>NN)q!^09SduVc zJfLul#R2Skg61h+!vJ0_L{6|Un|=t3HK=Gn!G!{6IRb;Y9Ht>O9EKAl4c899aWwVc zSW~Ty)3_#16RT2@csxNQ=rlSVk(fvjiAp?{j!#tI-7_&xNz#dNIP{GBA3b%1I#I2m z@56H<2a^d^+&l9VmbYz=Fl`e^t;%<)IIHPTfqc=()~C=XYNi z{dd@k^RsP>knvwPm#jf*r50t#m5c=dR_Hm@i1pvzmAdtz2q$V)v#y97MxG46xIXUZP`x8@+VRjSaYSCSeI8hkQ?>T|0KnD%|th4*(md)u_kLp|?Y zE8a@g$F7c)o%M=1SzmSaDMdqHQ;=WJNI=Z2`615s(RcDvcl<1?C{6k(vH){~zkY|bMsxbd*Nhb%E0+Ab{wnY&IbMd)s=mx8gF5ifA$m~NDU94zxE_` zi8o5ZTVvZ>sSwv|#fuwXx`HG(?=0S0Sa%glabb+VD{Rl+CHwomi-O$W=qU;5x`T10 G>;D7y8Z;#U diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_32.png b/assets/dolphin/external/L1_Mods_128x64/frame_32.png index 92db8f024d73371252f11cbce26f4ca1a6c87047..f4d0972d8b17a2f094fe93b8ca15ac2b15fef976 100644 GIT binary patch delta 618 zcmV-w0+s!^7xx5^7=Hl(0002`twPcO00KTqL_t(|oQ;z|PZUuU#ees)>@JAe*DIaSpjqcH-w^M4tc+ipiohpzRG>hNECNuY5becuNxkWl~;k$#C5fW?F# zIw2Em#taM4otY}(#taKk3xNHtt&4piZGqv{)%-w*1t6a{u-rQUmDPM);>YLFm)T_l z5jFri9zfYZ7JqyQ>pMWZH%kCB)hY*<&!i1R01|{>IR4^kJc|Pv`)Lz!59Q(y{0ITw zEqPGJKsL^@q;`KcpLh;OxbXy zc=*9QTS~+L;8~K4O()jAw{doRZoIAvQx#R^#QB|bD}OUN?SflTRazZw-P$N>$6@Xp zVA?=aTwC*49#U0Pizo3vXJbtUAYHx3ydUq40j{ju;{gbO$y#vj!rDMjYlC$8;M#T+ zv3OHejX9-_lVft}0Tcj?IDnph9`(LSN|zq{{A}KsY{urNI_nRCw_`-O7N82iUZY!Y zFZ@td(_>Oq)zXmM&C~$Q2N4mOese*8H^xOoc0GWVgW~Sj5e)~9Ig4Ey4gdiFlg6w? zUhIAe7z&0TU02^#)%fQaj{WKZhMcMfbR5(#AISxPKP<)aArnOUW&i*H07*qoM6N<$ Eg49nK#Q*>R literal 3000 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 sZmyi%KKwu07*qoM6N<$f=hVns{jB1 literal 4149 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_34.png b/assets/dolphin/external/L1_Mods_128x64/frame_34.png index 12f22abdb996b1a1e301e114c3d1f60c641e2ee5..d8fb6fa4a18d2e4ae8d550eb0502dd7e3690ce9e 100644 GIT binary patch delta 613 zcmV-r0-F7#A@T%}7=Hl(0002`twPcO00KElL_t(|oQ;#cYZOrw#eeT*;%x9^$Id3~ zG-A7*#KIjVf~EciCY2G3Lk-F zQe{R6RS}T^Bbxwf3kMAMUM-jC&|3efj$q9%1KAVg!w@ilD*#Fp!3 zAb>b|2kwev{eK8AFtfW0i_+JS0;n+lO7^0aYXA>i^LZ7w8;_N92}XXz0Ph!l*mg8j zY?hH2sP+$9ltgR?47VWdKViT6sucFdc-!Gr>I{df+39OBRGfnueY&a?HVqTEI)^{Z z@?t3l0N+q%ta?`aw>Rh4=O+^pX!JzHnL2xYcJ9iVSbre03Z;HiIwHBp{C5j96X_Jq zojS?ZC|h5GFBPjvBgTP(g}`pq&}soELr@kd=6)LTrI8*f^8HS)SWi=$w?#x#qz^o! zu0De{fEH)`VfT)+k`B&9OYvy0T20THf%&@F4~l3xJwZy%0J^_<>GW(AAH(f80O*N` z$XZ_(#$N7jiHQEFlu~N??Pd9$O)90-h7Zu%>1=FHNIY`PYZhc403iSuwO&en>wW}` zh2zg}NKg|IdpVlpzXpJ&Dk34dhXmatxd8ANJbePd1awdu00000NkvXXu0mjfr?wP4 literal 4260 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_38.png b/assets/dolphin/external/L1_Mods_128x64/frame_38.png index 13caae7ca2e39adf8dd0e33d7a94b1fc326b9090..61e2dbac505f79685ac7d96bf1c564b0f23c2cda 100644 GIT binary patch delta 650 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 T<^(JL{>NCEA2Ta9@i_NCw3V}x diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_4.png b/assets/dolphin/external/L1_Mods_128x64/frame_4.png index 45e47de12adccf1b4deaa8bf4be3207357078bf2..2260541b41f5b7fd04c96a2e5d244870d9d3d806 100644 GIT binary patch delta 654 zcmV;90&)H4A({n{7=Hl(0002`twPcO00Lo2L_t(|oUN0;Yg2I)#XtA<*|b*7>*k;) zN(XW3q+1(*O*#}oN3G~Tpo@ywyn>*k4lXWsP{B?Pf>4mYS_(Reixk8(si2}l5~)qo z$J01OT~^M369SXWW?-e5pW z@HPE!pXQDeQ-8NxK#~VYToD-owZ?0pjVmcM4H#cpq26<-9gw+{)ekJ*^?4|pRLoHc zAQLUl0l9U@_HSAOBo4cw4ZNMqL%T*&BlY`SXK8Gx{v{web71ixU@B)nRH{xbCD7D* z3^_<<(@}Ox?c8}uPMl`gh1+8QZkNq01guTP%urQQLw{0H)zsu~z#{;jO`4fg0#2vX zi~#3_^)2_)WG7+rYZz8$0vd z>5=5CsnGCRAHn9r^sYp`6wo*`ZGe~Cc18*$8LM{SW0pOEH8tt3kC3&lREp|P#3gGX| z%q}f4G(hV6+VM#M>U6S0N`Uy&PxY oXBTj?l46n&6)I--&#C_gTOKJN=IWDR00000Ne4wvM6N<$f}>9=djJ3c literal 4327 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_41.png b/assets/dolphin/external/L1_Mods_128x64/frame_41.png index b6c6fbb19168b4e5b01f36c2a17bbe00336a4a7d..010ba0efa181a937ec518b5359a13dd6c7a3b380 100644 GIT binary patch delta 622 zcmV-!0+IdnA^QZ77=Hl(0002`twPcO00KfuL_t(|oQ;#QPZUuQhrjnY@6Kr4H6gJP zcI_yPq0_>6OQ5mR|3I*T4icj_Dvv^Qu`pLyS;*DeU}>V>5@N7Z8)IVBMG6Qc-b#>N z;BLoacfEzg#OdBIzj<$FzIjBg+wJMsk>sH{6#pmK|8o3NN`I*m5N1LoMaPO#E zVKvNR>M#JwcrCz59R^^>2k45)g|Y!qv%Naf#ImQMo*n?Wlhxs6=MJuh7~=z77r@p~ z1rNgL9YlAtOMiVB-`>u9i2;-!{(yj31K3b8pBLfGjcSpLNAN0jgaGg7T->u&4b_xo zAcpEt*h^6oP$I}*L7IC$8vidjz7IA%rBYBKpeDwyhDv&DQ5{xP0X8)gHd+T4W?`;? z0UP=aJ%_9>+It?r>YMY+(*scw!MV1GaC)RZ)VOX*8GlYqiwGjalhP8oX)`&M-f^V? zPn2By2!;UnlAwwF(p9NJv8u5L!$vO4oI{Axh9$VnUOR8+Ylt_?zh?^k7AB* zTv+|8N#c990S%E_AALZ=-u^<+Cr@LnO@DAiOLBk5vf`{iRny77mjnxOI$A$Och*Ku zP6Q!TI%fcvX^V)+lFZNaIh)IllsOL>5?MiQP?YR@|hWV}l zm$aUb-E{f^(B~g{a!ou(MADz5IkuGv8cRfcx;Emi6uIQ_2QSB3$NR^3ANO)y=k@!Y+jXADeO+|0vx0~yhyVZpvBsG@ z@xD>K$5;r=drt}_+X8@y8OhAd!P?9WN~2SKNMs@aFb8v;L)=qWwi%7A5G7nq2NoY> zlA{5b3R|c}@@RqNRRDipQrh@MY`lo8>{h89+>xepeImHr`0@O`9AA@5@y8O5oWOim z9xi?y9=b3;|MShyn(3VB^-floM3j`Y+LfsSKS0kZ)&M)8oNSM4YORd|ZN-i9LnWuU z&wT}60Kg)c#f)IwKe*0!j|zYQTA#*l>E^LtG1U%gZUFQOFbb2N7UfHE0$Ma&T4aHi z?ZAEKN8Tbp8UT=4VWu#k6avhBvo;a{21-(g<$!^L9VJ3QA|H^o*J?M&_$lCdB--f! zsNp$~&o+i>@Hdq6MIEg~TY;i#1%Tir_Y?_ZParDG^gufR#ee{_oiZI@s0}zD*;_wa za*7tq!SMkN-1Lsj!@Ziaob+ymkS~j)Fgudflu=en>F-r8!0&O^Eo; zTiqNAT?EctH_j?+D2&-SgAWKUcS@S(@|&UpR;E=pn`0w4lJ@nCYdtt|VC$tN_lq0{ zm~AubiPIJHU9IWk(le3hCFP6_;nWZaz>c$Tu&dnim`iSm_{;}N5O?nl28<)V!Y?a` zUI8S1wa}~;07$K0O*U5N13EH`J^(6b3RqDt#h)mL@0Y zxjpas_L?|hev=j<8T>A6yp&hc0IX9;E-Q&2hR11LjVgl9#LGIuUbN7QKqaPrS3Gbk zU*L3Ey~Gp7Ybir5Q1qqsOEp%gwCIP9;Mbra<0p5N6)wHZ5A0!RNq9tM6!`ZjRO~d2 zsw^n(Is7q*0fb*lB1H9|#COw8-qv?DhY+WoCLN z=39suBn}eOjPu$n?=OE=zIc0;JR-~Hw!o{*tQHsK8?<7U?=^{Q)FbZuzwZy*dZkS| z9h>f&9+5s>>T)FT$iY5Vsi@1{BNBH{x`yAjJo3olLy7R~ZFl=hl#V2*r1LBs3_l2e(C=5~Qx;LCI~Y1x zH|RA_pWik=JGc-;%QenDkh_efU{`{Kt97a!t7EH&g1SB#y&}xAW`vj9mc?h@^;j)a zz7;OZeOl;W=uy^1Y6xr?qEOK5PO3+DY&KS%H;|gThW~{KUxf;2$T$f$nu&w(~%pRDf^t+KA z6y37Lva#9R$~$G*Wlh1^lo8o++2nn_`<9&p22peCb0Txs=LF~VzT>~Eey4ozQfl8J zt<zn}_y)**d2)%Kk?sgq)#IQ~! zqCX-lV#|8oPyIFSM)HsPG1ixDOLhXDe9!nM`D&vTq91|%!OHwu{I|Af3nU6W6-0;` zZ8a4Wh8$I3f;T<_W1CX~DNnBp3;UCm}^zf@9Om(Yl01oif+%}jfx zQ2eMBIi90TlFyP`4VT@wA6=^P$+5zjafY#Spr1W)^rvra(o%BCewFlKU$!6F ziA=kcoI?gzr*d7> zzhmC%hnuaPj zy;b%;>guVG3Dy*)O)>RC+scH>YT(zQt>jpnp27;JatHBkHi$dw%;VdSGdZ|g+_Bf1 zBR-p-R#imLZ40YSx$nTa|7d{2Ji0UrtG9T%O(nruE<^+6;Z*I-BrW!ab5C<0W^6c& zyE`5E;>Q~PlH?TAd+U~&`Z+hP^pdnzZb13BV^0WM@#)@27W^{%j=M(gmrFmzrm^po z|G00-nHqPqJJlDq%%ThqzCTpeHb0A-Et(BruN-M%mq}y0>bB{q^rc&VCh-QQE5i zej#nH=CL}{&A-+nd^w=^^SO7)3SNrU^-~e=I94I{FY=Pl-a5PGyT!t+AA?FBzE@xW zP?+MRleiOyrA=l>Q3tcc=Y z_hRdV*ziJ1zTwTAOtmQC%fh4=k7IJTAetT`k~mnI4{@k zpyBJRVb+SxdX~S3qerc;Sy$dcImTz3s#7biU*AtBdo0$_zQI8DT1C({ z#&GwJQ)h`Q+<7;Ha>h5?S^b`cSCMOe4Sj)ce!S7}xWTGjcsZw76`=NR2S>Gf`A6{g zdASgg&o;vzp~=j9>ve-0pSG+?e2T2td_ZiVjQ;R!@a$?lDzP9gd?9Z$?boXdW4%`G zR(&d#Dv8Ot%F2omh1xIPovCBR4~u2G+9F(kv1SABPLFJi|2*8~zCN%hx|+~cU(PD| zN?*8Jau3_A(yUz5$ueBJy&({x?R0NulxB0AO&CNy8KTi43S0(U%lp2wQks4}+4t4PkEDwn$r=8Syj;7fL5O zhuXOiLj4JP-mrs4Py;5Gr+`9a;Gs+kIUo?rG=%-77t0&}79(KLzaR{ML)hO=x!XEG z&8T!DR96EHCm@kXsIHy{%1cKZudC;!bpVP+qR|MX4g#eKN29Sw6z_)qbHR89>E1qA zCv(ex%<*Q1u+t0%4U0g8goJ2>XlhXDz6g|_o*n{;MxfDf9s(Z73Si)w@PI&-KN`%5 zfdo2<#voAxpuaWZy{JJ9Lm1E5zoVegY;FHl91!?Vu6S8PF!3}5N&|_YP=1H@7dnvP zMEqYj{v$fjg+(JGoQQ$cAUc7!B|a*D$h`FZcSFB{Ja4e}blw3X08cij5`rki0EV@> zA&j@8;Z5?!VlY~GO-+;zTnnwO1=k{K`oQ&&nmTZ_Hd;?p6QheF5HWxB{3pJp4$?#q zgVfVTBTZ2#3v-OQIm*%!g|gH{n&_HY>ipqa2Lv+k0R-Y7+a#Xtf4G?c%Eg+|iFgK; z?n0%K{}h75X)1#nc$!LsqBS+Np?hud1X93n$-dva^mowaL^>&$=xs@-QlNjO8B6*P zF6d}ubaZs_XgDuaB3uhk)PiGlF$B1tkB_&mx2BFZ3Z)7AhwuIWO&@~i6ykTS{GZzS zBjOe0@8Q4Az?=NrPQ(CS57Bwe5^?xm4X@F}9Bf=He*OBz8wv{xi;Ig78#!+P0O+o@ zxrqyNa4sw1Y7A7&B5?WFFV;^7p)tX8rcd=BeJ0PkA5LPWUNR6b%3R6DhSwRl+cr;s zO^S>f5rIbT1fmJIgrg)@ji;9~zy=fD^#f;=0i%X$sD{~0gobHI5rI{-v67fF z;F<9fqTLWi*)0+ZG~zKrDM6!r?7jy5(c?zlT-=JZlz7}!BR*H~y)}&=$dCP0DkzD3 z#D`P20dMaG?A-7-`2*y$AftJ2*3M%x%R$CDK&~%HA#NrN@wPHWu)7anCxds4?u$Ho zIJ_1DVmdl-brVhi@q1upv^&R*fl3iiQ4sEqx}aN8PgG^NJ2(@dC+^o;lzn>9sj(tF zdS&9Vpxx@3J!#v4%aH{#aoKF({ul17e&)f(Ev17XkxJ*)RN%72x&GP>gWFwOTy90S zcACdPT9^0kRYVIcX3guZCHDJ4XxRrwlx`$MJyBib58=yid*~rsy2T&#ap(Lu&+sR8 z7x`Wvj=7xk5jsP@pZvqR7}GgxU-T*ZW240}9fdAZPs2`8QY8OVQisBhEU*0ZQ;JgF zeGa{ooR6R1Z?GG-7d3cD7$5I!9Y1Pxudg$@`1&K!WO-xExI>--X3|%)+fAd)1ubT>9 b7eWHHnZlOuxnixqe;n2pcIM@#p6C7teSDMt diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_42.png b/assets/dolphin/external/L1_Mods_128x64/frame_42.png index 7d2dcda5d98ac939ae8263cb7db583cef6574fb7..1197601e33690cbe7d6d8527637cd76dbc2cfac0 100644 GIT binary patch delta 551 zcmV+?0@(eXA+!XL7=Hl(0002`twPcO00H|+L_t(|oQ;z`Xj4%X$A9OU=EV=%CkRd@ zPu#T*qC=sND!MpybTiuB=;8+`z1c(%I#lS`$-$}amb}=(Y;_VBHE}8;=2fFF32Bc* z-pjoa1n+X;$N!xFIp>~BTEE|^Zl#(ZkH5};g5V#DJrR)tKz}juj+k0QfwZoj&Q_{LI9VNSvVVaHssT&=QPLhJhGNLtrIDfp z5jtNQ&Bn_T%9CgedH_^1Gk4cbjI(qd!!v`kbRMKxNQrV4Dr0~Lzb$Ntj1 pxcY{YcOc`y02DZL;Vs*?{y(MFyM(X1Z(9HW002ovPDHLkV1fz_2XO!Z literal 4253 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 IM6N<$f@OCsR{#J2 literal 4342 zcmbVPc{r5o`+sdQcCt&RK^tQh`($575!qGB7=ytqjlqn>NJS}2wyepL6vC-Uwo2KF zA|d;d(2(p)zv-OQ`F;O5*Y}U_d%er^+|T{_+{<&{*Y&*DZBJSV@XGK403cwAHnn4Y z8LY>UhlBN=;)$~c0A3TkiHWVHi3ylYA$j5baR5LY$g&T1NnDfAA6df*IT`mamZ$nh z01$;@o@Qa!T;baQ=8CYW;hU?`yiQ``BAIB%#>>6D=&b1RoWoV#MmM5Q$2gwV{w6X(nRK{vM4GT6n@qnu#j>9$wi zTyFqik%LYPqm~(LvppsO>;Sn}RZ+BQ>}O=P?LlV%oB)hML}&Qe;_ZNDRflFVpjiqi zv;V`B7f1pCe|o4f1b8R_%>S^|=K}hR5{D##{@i^)Wz}+#zPKCYU z6_8VG2vOy1C}m@~K0{itGitejpjel9Awze7k!GyY4uG}U0h9fEJ2=2r969iw`q85E z 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

    `cx7 zHpiOjL42rGG71I@4h~igR#PQWykQ6(9UT}P2}2^GEDdM?ok+#dpu_-$-wdX>04xPh zrs7FN@GnM;2Pu%M2Vpt;R}=)Ywe>&5#DKqZ#mX9th9Sccs&E*A@GG=GwF9Vjxc_(K zU$p}q=wuws4i`WQq+nTF;-&B#%u3&XH}p%9 z!i^CKGgEC-Q-rxW0%5KOH_|dO*ZhsOBnD71L@e&NZ9L2N-&nQ(iba`Fa2P6y;y@z# z|1Jbu9}<-m;6oyVk!q?M;KSA!ES~sFa^%-8{S~w+j)D)ud74v51n{3}M&bX(1x*cY zO-(Hf63Pk{2UW-5)S=p1+E}QLmzSrOr<$e)0-*-^8}IqQrVqw)3ihj3{-bt&i&zEu zYxqwyuqOYs6OPF0AquNmB%`IcSdGSSYvo|}^XE_25Cj4V3JMPC+wTAXdx@o~kppdD zJ`F^94dypnS=wO^<-g78<-ry%Sj{S4_sg7K96YBN1MTP#PH(-_g4B44Z9KFq~^=mqGNP{EgxF<0W`#-`{uwB z@N;dc_cQ%VfS^&IQ0=#_a+KW#Gj78lO4L@>mq`MRK>QqI&geA%ZDLi}SuRG>?ct{r z5)9Q7E^^KMqw3KVpq!WIxRhqCDu?hZiF`^R6VC>q4{jZQhKH7q@@8F>21?oU&kVv# zxIm+%+uq}btHHt}0tGvTY;c4AOTB!aeUXQEEn0le0Tt_4ng>*h>?`QH0^mv~J#-oc z%tv;DwR0eE33u~&UQH|l;hOc%Y(7D0o`t%+3hE#w9 Z;93Nk^X$3K`tbw+OS6-vrN-`;{|~Y=oI3yj diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_44.png b/assets/dolphin/external/L1_Mods_128x64/frame_44.png index b018a94c19c4cdd239a3043b1ffe49e93cb0f471..a10c370204585cb761166b976ec31bbfab0e6b1b 100644 GIT binary patch delta 668 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 literal 4267 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 Bcas1B diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_46.png b/assets/dolphin/external/L1_Mods_128x64/frame_46.png index ed38122f52a73a977c2ed044d22e8c113ae6c3f9..f9e3ec5f40efdd52fc6d19a43accea496f6f37fa 100644 GIT binary patch delta 641 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_47.png b/assets/dolphin/external/L1_Mods_128x64/frame_47.png index 38610bb4b4a9aa68f97442f901f3318941a2305a..2e87539b48b8d96f27bc24dae8aaaef9671b8511 100644 GIT binary patch delta 657 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 Lomr`g$L0S4vAUb6 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_48.png b/assets/dolphin/external/L1_Mods_128x64/frame_48.png index 7f6b4b29a38e935cdf69f158929d29cf0de5091e..ad22352cbff7c821836bba19916dc8939f4362ec 100644 GIT binary patch delta 635 zcmV->0)+k9A&3Q#7=Hl(0002`twPcO00K`*L_t(|oUN0;Yg2I)#XtA>}j4p!*fyzP9wYj_CO&G$buQtxJ+z5|RX9X2uX06ra{rmgK-Hph=r#Wy@a% zbJJCd`m?2#0L>RKj+@~91avwfoZhM<24K&g?T*!NWWZ(=JD=ni9k{0$NJ{{zliJbo z1RCv^Kp)2joPUd9Zhf8R$dP`)^9b%VEZO^IqL9|i=}CG=E`GNH6gQlNrd`V{0a8~? zP5`eLO3-h((x__yRmIK2tz1Cvd_g||Q?;;Kt2?Ryprwrjia2&C)BSOD378CEAN0Y_ z&Yo-l0nHgGG{E}Q3`pye+LFquXC{9G?f~#`!OWZraDOUGGX|W;mjASaE-N7sz~F;= zm0r1BhUvPbKqaW%KGqRb0ek>Fnj!6loa~yJ_kj&7wRe|T9FgR$On7)HPw@L-#@6F8 zqU`MsoLG(xFaXcTP>f@bhGBUyW8))ZxWz2Qfcrsp5A1>|SORbh0Zjme0D%_nM*P^g z0yF@EbaeS9@XC@46k~vO06uG~-M{)>lJ|yfvCFv@fWI*_v)N~#^s~F)%uBx?Ww002ovPDHLkV1l^*Ed~Gp literal 4313 zcmbVOXIN9&);{!JL^=u~2o?w_^hoF>C`~#lN(cc0qyV7=X-W}ADblMnMWiSW3L;HK zdJz;vKUsV}drYqJJak zj}AK%{XNT`UR_yu&{M8|U42?`y`LEE-m8{|ai#!ls*sCC!98GAm?_M-YXsj-r$ zp~1A}<(&^Z_47INyS>ytzKBBta!GTAo`8l`v?g*`D!~HX($NsXD1@G12Jz2zy>e%H z0{|;b)SxiRW9?mrMC`bNz&bPr^aa8qP9m%``%XZD9M>x5-mStTE8er3LS_ev#q=~q&4f^W- zXz&W)lckec(OeX{=Yt^zR9eN)cQNb1iJS8>`)$$Td+{gxrzhRw zF{}nU+{cLOW$)mb#} zm1uno2eWQF`(cbUGWL*5{4lteT_iJ}8H_52VCzw&wfwQ`x-f zLFq{~iF}C`cXm2n&(sJa-^5Otaugo3DoznNqk_|(WxjV8p_iHe@LW%6-h1|kvB1Wth2Kc(S!*8o;t65dghn zYOU}0(5>7p$t`!zr-y;JwQ6ET<73X5Ug=(*-YXC$h&H5Z$g{$&BCJAfBzUB8#AVrc zS$KJIgyv7q)yY-JT}Kj-oBkYis&(h;qU%Qe`@U+u!!A-6IMzGYc^5wQ8?O`Aiq=KG z(uQdLQfe?|cGW~NZ@4;kr8^P(#VZ3}+rJVu`QT8OM_p2jM^V2?(eYZjZ`a+YRf0sc z+{#HuT*{R{5u1*C?9q+RCQGlu!3`Zb^2@s~?H;&`SZA z953xONLu`nBbPS>BeajUT$pI+y5fw~LgBW17nrnKwHWUP-@V>=zY#o+YLp2Z3d;;* z+s)fKz1_8!@Uv->`dxU{oW+^pCBrO3!&ULCe=vD5NikKE!{&lNf^u?_2%GnE`V6d%*aKF%LTy1!+*(EW@(cEZ>@ zwpI!+mMO9oDtPh~;-TW#bJf-qAIhe}Q2C7Gj(bD=YC`F)=ch+KpZNy3mwS3!d1IHd zYa?nO)?N*|{?l+ZU4U}<7{~IBnU>)e)QxFB#(D27rJR{8n=}fxa(1lnxyal?Z&zNR zrlX2uVu*TlhCuog?b%3>o+VV&Vzz{6cJ%P~sO)G9!^Xnfh3BejYR_oinaj0H-BAB@ zI#hq#BgVqWzg3CD!b+Z+BzEVy%nvg=gQ3smeII>3LNroxQgVu{c<^b}@*iL|Cu%I* z@v&v?<3EOLgB({Uz)glPgk|EaMFJJ!PF8iULHLz{&@PXzCuw_@Qw~

    q?m#)^$DoTy5VRN6sY7NR}d)>5}S;PP#;gC4SwoJ9}raG)_y$ zUAipsw8Y`(yvBG`5kN%lP)yfdo5|CE_U{22qTldQ*v-D%Q$?-cr+}Z63EtIHqI;b% z7~aW=PWBy}@G<`pG%JFYfVQLK;2O{RjelZoTo|uG88~`8HD1X1xf9u)j2_YcYvWaG z_4$vW21_Nba&q@%&v^J<06d1=UvJR7me1^P*&9|pcQe$@IsUYyVNPQ~X!GH9NzmH7 zp8IvBPOnJ5R*!|b@#Ef)9m9BC<=fg&XgUFAY*nS-h1E&#VcGGsosZ!koS_V(qYv|w Qi2wiq07*qoM6N<$f^jbj4FCWD diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_43.png b/assets/dolphin/external/L1_My_dude_128x64/frame_43.png index 6a402b350b0adf105f727593be321aae2ea9e93a..d71c76f05d58182e992a3ccb95eac8d253273ed3 100644 GIT binary patch delta 540 zcmV+%0^|L^2B`#)7=Hl(0002`twPcO00HnxL_t(|oYj##ixXiKhMzNjF<}HZurs0{ zvV~|!8Z89DOGeN>u(?>yTH06%79q^C+V}&!G!nImnY{!Stw+$xW{YLlGPZHRAQ%>B zoLEe5Gx!HQ-FbPx_dCxy(j{3^O9?71{2z`?kaFZ6ImjZd`F|ahyC6J$mdZF$OJ!)U z>{*5i0StfU(4vJoWIT0nP?Q?bwx^EZv+P{k8(JQQKV=EeSV_3Ho}$fEVvM87XNfs1 z4{MP{E4l1S>bCOljagpY)Lc-mQx5QpwB$V7T;ARdo0@M?O@q4R9Ie zwUP_NrGdQ30epM#DL%})+%f=yY^$lXh_R@(902y}<$r=AjE+ql1U=Kzjvx7_q@&F@ zUiSLuWq&=f^qdU5gm6<#D_L7{OuO${KeufzzO>L?haf<70MLl!AqWs10DnxF3mxDfMserp052vd zbbuE#iYo&3I6RneI-@M+M+b09PUrv=7-b#D)1p8Jc)*z^ZcWR{qfVJuliVSA&c{xS zLJ=%3hMGCKv`ig+ZkJ;7Og7`<3Ig|Lei2DOi*#Djqpag_vrZ4ex;5t|@zlmA>&2hS zTxP}Q!3@x@2!GK5PN#<;qO9YvUOy+z`LE9jUDrh=MseTwlGCj5-$r%6LI|Oi^rw@~ z41QFrk~T}L{QRjcqL%#h`x5iH(E5G&$h|8+#xmQ+HrlNd}^9#Z4RfMlCI%Px?bw8m<=ddM=s5sSexG} z`Cn=*&J$-9^~}u?rCA)3I6t4?*8!yF^d2+gND?5rKD$W2^Rxz=Z9aHULez|+?wOZJ z_?JKrW`T2y?t8s>5quS+N}HRo)6Zcs&!U^a*ME{c1OXa$g5t%|!6pPXYdr8_2Z*vr z-i}4kTPZ|j;p?!Vsv yxh+E0ZsU1Q?*7(uqg<`o@k`ewy}vgfseS?SEx1fJoCb>k0000>(xfX>Hf+(fBRL!d|(sGY6o4F>?O=tpNkQZ^A2cE%lT7;7)mqD{F|*Jq(KGz8(n8TJ&RDN&DAqKnEXl8RvL zboRHea4t+j%4w|cgYBAj<73mmU3bYSyja~x!po|0%8{jnq#p5S|xf)GxD758zuusxA$4^ay zuccI14jh*2eEvTdU{byIJM_Kzu4RbWyrKMQweo(E0Q@4~&GW!#)g wS^&9XC?$Pw{!_)0+wZC(Ca3mdEahXZU+t@^W@a}&#sB~S07*qoM6N<$f=9I!^#A|> diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_45.png b/assets/dolphin/external/L1_My_dude_128x64/frame_45.png index b0ea1a7e78c0b590c493451bc16d27dfbd421928..70da80e9baaed157f51e8351aa08f985894403b3 100644 GIT binary patch delta 298 zcmV+_0oDGj1i1o`7=Hl(0002`twPcO0096=L_t(|ob8jbZo)7ShW|fGq=+d)volt7 zW@5=urY=Zz5L+c4qBG(tn3<3hsYq4#JOyIp4ax#SN^3JW}5k7#d@3nQGjuBH>}8+xee6~XK^Kb=++X!*i{ZWU|Tll7Rx~yuWcCg8EXj wVT`2Vrq7YR_9JhwH4ANEPd=3WD%HOqM;JX%fH(jYF&sod8~}5yL?Q!~vj);UEIy z08qqm5CL%jC}KE>Xkm^?O*l-4x~J1ZgdtZfLk@AB`es8M01oCpPp;F8g{BTr3%PjV z6V;k(-3@i!dy`r?6bUan0Q6uEO9y~!hMxlmcp!7&01yX&H~<{URX5wGMe#6&g9!Kl z2Y{Xo2N4hl=zn4<)Vh9=rw)))EfNYGU_bm)jug`x@}~VGhJy%b=m78;3OGa`z-6E4gDzGvby_d)!cvsw(4FN0nL6w*S(*nf?-(BaOHocqI$xVXbqH(%YC zuk%e8T^xQ6hvH#zDdxO+4u>M)$wPj45_UJUlq>b*=y~1tKCt-GWfo_}$~s!3yDz1U zcHLNba1*N47xDd6H|P>X@`Whg)C`{RQbTNDA?=2tlG`>U0q|27Y@{x3{z=%wpf hmbFiO=@|T3{sD|NT=Axh7|j3x002ovPDHLkV1f+_=5YW3 diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_46.png b/assets/dolphin/external/L1_My_dude_128x64/frame_46.png index 3113ff2e623dbc8f684d790420b396e3e1fd811c..ef0cd69bdc0157715ce1b44e7223bd2e2fb7ec86 100644 GIT binary patch delta 532 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 M07*qoM6N<$g44D`4*&oF diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_48.png b/assets/dolphin/external/L1_My_dude_128x64/frame_48.png index 2734e2fcd57ef6b102da9c2a977264694246b63e..30848e939e847e84aa263afdbf9a013b4cd0249f 100644 GIT binary patch delta 612 zcmV-q0-OE&2k``u7=Hl(0002`twPcO00KBkL_t(|oXwK4YZGA@hoATO0_ROfO$I@1 zgo=`M6*`DLiiJ9vAxDEKba8Uf{sAVZ6+~R>AUH`;1i33T3I$Pw8x%wb7p)x%Mn|Ld zrt6hlzH_*wP5le}w(sM4-}iZceByKPh&ysoDJb`UCwhf{34hNU5@rIRjUgc!0R1KJ zU=KrsO3h@iN2|o?@iL-XpdqaO1|(daK#+^E}MtL-g~Kp#kJo1a|cO%Gk3!Tyf0==w|E3XEdM&M7)4s=mDtL z9e@l8tQbJeMxatAZ@KkVm7=BOfYJ28dei_Sd69rzXoK4g0Y^Q-^Z49sSoNy_C*|Ha zP^iI8-(3UA#PvMr{RwwX7clzr*aUO~@UbJcB_$llR`W7Q)dK(~Jx=5wL(bU(^x7o{ yD1Sn%hb9m&SSujYVJuSY%|bUU)WF>7ul)r!^@==SY6v+u zI=P?5h$0A%&%c7vK{+G^7KhfbovmUKNs2OGzjjAg z382i^-IqbvR!$)z5w{8p+}aJUitM z9m7ED2;&qY5`S>53sE|P&%-Al&8-6PJV)-`x(_M3*(9MlBZ6hD8T3RHVL^+^z_kK+ zO!0*tmXK@R@fh>VnE*>Bv{r^VrrDab6hYWJ;8z?7GqslB`0*y7xK_wdGM~se0V0w! zf{!-=+XQ$KJw#0azCIHmICzQOX6vQTM#cZA37`=aWPi28dxh~BjyOakxWcQ(*X~Cb zK}}CIzy4p8*XvcjUi$)Hud;@9zZGU^J@Q@;JM|&+@=J$jMQI=_TXvS#G_%lgNZygx zKNH{+J6*HxVySHfJ9J7t$b6e7z>bQvvRqo@%G#k*>haod_5ITmz`Fu#UFo%-)VtdK z9(ro|%YX8nVrl|dDvgyf&8hFKub(dVJeujy%h4EFYUqdv2|Om9sbB62H)s|knbe3=)E zzU~CbVE&cqtt5LE!bm69%-LoB?4;n(xv1qp;??`W@iY%$Lt|Qh4z_UZckA{Z`|!ynlpUC%{Vb(dO%pX_+AR z9sxR@C|>@PzzpJBMbI*I1ik(4kSEsk9nW1Rz(^6Sz!C>KpQHIA3BJAqTi43D8X5A? z<9}2WV5g2*tmxIq6n`rpZ@!R>G+&D2WOx8=k@B8Gjf=^z&Q5uNQ;O-CYb;)FzTfhPZe7`C3jdY?CYAxdwJ f88h+D`XTWTT^OOn){qqn00000NkvXXu0mjf8-nee diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_5.png b/assets/dolphin/external/L1_My_dude_128x64/frame_5.png index df225594910480d7e00543e706d7286736ca814a..94ee5d1542865d135d8546f2539230470dad332c 100644 GIT binary patch delta 817 zcmV-11J3;L47>)A7=Hl(0002`twPcO00RR_L_t(|oNbd|XdG1(#(($DT{0_+Gp(Ui z4cSSl7>o}ADHhaZN)z$1(k`ZmG+LF44;EBxq3I6RhxpbYeNm(!B9ajFMJmQLo3v=5 zXj`agZR@T!L0kK0H#E+snYqV@-G&wX-tKokzVjXKIoOe-(tiq-F5=Sy-RJApH|o0u z@0Cg`la}RHtBaYgp3a?ZRm5>|e=OpycKP)zncTqgO75*p+6>GF)NYHT)i`ipc*A6` zb^6!m3H0Q|rhlJGWY)OpNH26=GTS-ba}G0A+p*~izjbaj6WlX$PMN{fu7kO!v>La1 zxxV|vjpY2;mtFa(s+mZgJ7c2crAlZ_Vdeg-d7&rD%onG>85&}+PuhmvLcl@^ESN+C2|lMHbyy-o zbhltJ<$uFK0@~Mv)X5$XzzqQOyB2T`hN~OoQ>j)k5e(E}gR8?wsXz>vhC(3+eEwES zz2pOEu5JzCqKM1|py13d8^`i8&;j5X&gj^rqff)lJwVL_nQnin?W1GJTHHG5HQA2` zoO-3u^Tp<7lKkdLNi0Qs02hFVe?(F%kxFm@O@I4C5{gw~695bGf!)U*|;k}$MHOJR$0cu{gq+Ny~=sO7DiJ*K+=-|b!84;->3RDTr zU(YlWFG?|z2+gmYw{NayFYPJp~Dp@Qc0&fO0& v$|_M9tw&agj7aq@TChHY7n%Ps{2%@W8K+@wTqfQi00000NkvXXu0mjfguIcj delta 1643 zcmV-x29)`{2Jj4!7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000IeNklm);RN74x_hwnoGI}b{e2&s*1cGRF9wJPdYQn`n_X0Z8r91(cbxqX z&P%y6$_!k6_jo!toj(g2&*0A+kKAzpfOZuicQlw_G=}gfX@o)kYRXFY^~|2_787vK zR0vMV)N=vg=6}KX8GAF$V7T$CndT`_84;2U5SbjOl@;+tWrjkH72^pEVcok}dy{4W zZ^>;g*KS0KTz0|D$36GH)H7Db3z7R0+Lp>o+e&+S?LGX*04t*ZNZV?8MNmdtz< z-nB<$<;LZ3V&%_{{-v@4+I$@z50Mmxs-MGC z>Xo>Z-hWehxjr3qJ@`G>&TG(g4c>m9dag_{0A3hfq^DnYAsVt#vj?2)md9u2(7Zmw zARbl@GXTJM?u;j*=N_%sl#E#+`jN(?UX>~7Seij_F@dH4ucy=fi^MNln;Qer#m*|} zqGo_9N!n!YESK7KMB)?4o4IkKdzqP=wmZ3oGk=v&8AAF*!1b5bgB8HNr_YwhOC>dS zDhub)T>L;wZ7p;S8UtSS5MThhunH!SEHq*Sl80p>G1Y9xsAN(1Sb%;M>Qz>S;MM|0 zU{Rl^e-%6q)9dj3RYoU`ammwKYn=CM0!NihH-uZL_Ab)iVipY<&$7nz>`4TgLvnNX zzkhLGTz=@l^z7gk>pA}_7Rc2_+IvC!Yw}wL?CHnN?Hw1($|+fzOJau)uCyl9CaAP_ z?>Q&6k03HnH8Oi9v7KZL)?BBy0sT2bbyb_#n(tdJya}H6xF7ACk+G8AM(n~*_ZqSb_?0nno3e`+N5LJH(Y2gU z*Z@yv;aS71^S*KqS26+sIRc^<#pRkFL^rEC(#NsQFPLcNoDrP?FfqVvWEVdx(yvNc zGxAj!!l-kcbdZP_XN4a%0&j3i+wKs+u3(%=T<6!GaevmC z5qO7mP|N$Ne7}};XP9ZA2a$Vmt-cB?l^+S5SLggvTMSnkDBUA_v5GOWSxGgX#5fnjV$K8dmJa;|E&W?s58UP1vW3^af_QE;k?{dq?{k;mFIj{dAMB2D&>i6D} zXXY5m$t!^6-ZknMzYEZyeL19kvVQ`4uXQy1X}PKMt>)5SXFT8iS{$f^de$_(Q&sl005otr1MWo zA*(Wsio1o8%tPuw`v|N;hygqcjs`*%Y2Qej-Y$a~7h78!z}3m1UD{q1Ab***S^XlL zSe>GcC~&m_gzf=4G&aZvKoLXGj*?&A1K|0ef|LOO$dRwNUPAQPkRtM5;FrqJGDj!~ z>=UsAIim6Z17<5ZqsWo8^Tq($bAmq8XH=l_m|Fe5Xm%J)}$ zKfpi`h$r;~g1dOgE)oC8C4W>U%zqlz>$H1!k0I>H2BYv?SI<=NsP_XTzYcyP^;aRX z*_M}&vOtA#nFhcKsRe>s{Zrrx0)L(Ib&SRzR~l$pqEx@?>Nkqf+qkN+y_pr)Rtgj? zc|5Fg9qoYb0d@#Vs^In1h(TJ)k;c~?$BMnYvPO-d*WZo+dd0dLRb=eYgH~_bzl^UK zfCh3)znOZ7GDf}M11a{Zln(&lBQ<`CGFHQTz5>{L=&ASo$YkV)DBRa!7Vu&|c1R&9UIX~!_y;ayGDeREOf~=j002ovPDHLkV1kdJB9;IE diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_6.png b/assets/dolphin/external/L1_My_dude_128x64/frame_6.png index 4c00552ea2bd7bebb0243febc10fb51c35d7aaa6..34233f5bb415a2f1a372267ddd353087d4486e74 100644 GIT binary patch delta 768 zcmV+b1ONP@42%Yl7=Hl(0002`twPcO00PrVL_t(|oVAnRiBx$~#hpWh&p39BiqBLhjPONmr>|I#kfm&~6 z`VQT@F~fRp_J65suz5o{w>8VwKlCg0%VQDQ#dF(sj&p;@%q;iWD^&O7Zgar*JGH4h zy?~;XU44Nidoeb%d1>Sce%#01@ItQ>8g;h!(Cw##U5C-FN9VsjIAzZGxGABr<#NUOwRcU4K+I9X1;ObL)X@6h+#WmHF)jO{)pPrlA&-?Y4 zhedjl-gcJC{D=DC1Lxy3o@V)eCZ758(t|oU(MFB?d|F2A@czH_>F^g!Bjh7xflcFj zD20-}kT=wXM5ry=w-NAcR?P7vIs^gIkO08fmF5wMf>pp}m`np10ZWlOC6*99DrERv zvXFuHHGd%vvv>;10f2tbky804xc7p5I#4w0E4F!lb?JZ{?_Fb3`3*-KkLt&M>ZBNR6dz3 zrJed%Ye&Dd+KxHN98GtOG60YNgyc@F$|wVxO?lfT6sN=$mu65E<;k=_3IrWZ>A8uU z)e#^DLJaM8$4h~3(6=2eadYJ2*sZK|1aylTxAGh7h2l-%yiT^T9AMP$nDiyYarmdE&u@Fx?I=wey;U< za5gT<0I-6!XOZt8oQDel8o;ObjwrIT0iE-~nYdeP&{~7*x_{n3l-i}XgHt-4la6_C z2HYW_g5IS$o*ZHyZUEk+y9Z03GcBH@KkswX?;fnd7Xw5Sy-Z^0tu87+jp|{UPu%?% z&P%yA$_(81-Q(%nbp0%7K7)UreB=`s0BBbM@<4+LMstWP6L`n{)smGO|DBEP787uv zsSuVY(keo$Dt~AN!_8mKG(QC@BSMk^B8%g)(prn=2O5)9R1efxF@6F=Sobd0nWq`R z+j56%_16pr&nHz6kk?ygOkznSW3s)eR`Qn z10Mfj7$7h}wvB8;+gye!2)b7%GwSyNzxRscJdI+9}dVuzW`{C@D#^%u$?*|_q{*La0Dnn9$*VCz?dt|1va(zA+ zfNpkHi#IeImN#$=r6~-$eY`ft%c{{m<9~iP*Kwxut=L)#$@p+9nDwse*gdwVpNitH-h-b5L;oW}LBel8!$v&=<+)Oa_<{-$sqVTb;NO1{vF~-eV*M?*{Gb}^I3i|1x^N#D3*Gix2iA&3(O&TnphzYRw0Nw+Y&1wf$ zkr#Ng{fsibh!|jW-XjeFK&LzIK>Bm;4xz#bB$+rlG>lXp()igSunHjt@PBMrG6Zej z3_J$pHL?+9&6x9819%TIXqWa^1xS`{*0{(aRwrH~3S4afsf!?u4YCPP#1OPlvhyAQ zufG~u!%5!+S{ExLw06boMP@TAm43qIO(on05K;6_FRXy3 zhW@mmys5}QRY+cbn3U<50SVf01RPDN*5q%92rm8dd^le}{T zmI2JTdY<|xVHSRi;;OLYJhn2xgZs!C#0fE4oW8%#YvA&<-TAeA`~3V(m^s>O9zn@QIHNj z6q9T3a_5k=ruhr}w(sTlJ@3QwJ>qlvh%6ZF zzSF$@^T*!x=6}CDd}d#Um#Qa(d8fX3)MwcM%^db&_iZA21`7hIvgqiAGXfSA5I}x)<$|Yb2B#N|WutzRQfZLO$&( zhg<+(ZKkg#1{0T+#;d`7Ftv)YLgmOG2lE>=maGsJD}Qa2G}ckmF3vm+FcR_22$0*E zEAQKFKxrcZtGnI1yWeU8%IW{m_oM3PXD%R)6@u|_>D_~!L8dAOv$VKzc;16tAaj!; z;KSZ@8H(HLo{HNAn)Z=rI>?Qt(#GMI&FlEFo7Wg6J?O_m|Ct#jlAleYEn9rttLYPA5+oYSRwO)6{FfLL~;2DBxQ4ZOM# zkW_(q;KMA_YWItKGbfPNA#Vc*NcM#VNfl$gUwM&;EpLsBtWX5qdS08-tppRLLf{E zKIWK$L;}PG5P!+TdA)e?qY;~LVFH|g^tp81(IMhzE$)h}N)n1DS(*>mutu()CBqKP zfIXt-@2}nS&mc}DQU*j6A7iJQ@GDlLMv1w@vqyHmCYXXmF!qRCKdSiZ?@6h(mQTdp zsI`{zO#bD(zvsyxa&gzOwbr6dv^E=>-sgj6Qw4#?bANb5>$8LDJAj4h*nBvSYp!J7 z%pKs7!DLDluE-L^#@AZ^9;@pyPwDtoaa-y*8~4a$Hf8#W$T*k0Q4?r0K&0x2y!y=QIugPar zq&wqbaerzQsrfy?%ydg}anVW5w=RN{`Ke+^)d5E0TNm4|$=*c(HPJ5i@D5-tp2U2u zg0RxZDsR#Ct?4}lM3_$P1no|MjkDkzwfT-a02avGe99n749$S+X6OJ^(Q~gmx(C1! zW%@{5twQMHp0-;!hgT;w>j0EUUgl#{W;;Qn5PxR#bH(;Bf2RnxIzW{9Gt)UHNs9p* zH_Lw|wx{`0owmOTj4)riE;dpcGt;QCSt)g57+aHn4-lQaG%V&DMTSkW-2pgB>@1S07*2xIJxYlw0*dRZ1Ga{q0yyM% zlYd;1+C_;m+^Ds_%!$uu;cYtJlpQ(Oy>$SscH=G1Xf1AN6;Re4KgHHQ=U2g!V)KfK zym6f9R?G7b3F2fl7S|HfJEDvJR44fUqnil_?M@~s9tux(1hq3PBGN=Ho#6Y&zX`;V zq0+58gtf`mdcr)O?w9<3K!-C%^Jb!da|IeUI9pHoqH@tOudkWA810fjuS(v^+p)23)j!z*Nwc< z!RHuPpIf8%5tXM@58=5i$t+@gyV+X0z1#!fXrN8NbBv?$tLt`AE3|oe<0y}n9~UtG Y0MS(Hq)$07*qoM6N<$f@_BRDF6Tf diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_8.png b/assets/dolphin/external/L1_My_dude_128x64/frame_8.png index 86e41e913b7ede1d900fe79314467ef21f50ce10..1f574da9456f9a236ca37f32f8f0c7015ffcaa9c 100644 GIT binary patch delta 623 zcmV-#0+9WH2>b+)7=Hl(0002`twPcO00KivL_t(|oXwK4YZFl%$3MU01%T(ov57#)q) zo6;+HdFOCRoB9{{w)gn_e!tJ}%M+i2N8F){Ngx)zwb8R9~@ZD=~BzL@WXP)PW349pnBP1b8zH@w^i z#0MxOY>z-}4yG8Iw`V9v5s1He3ZTCL_MXSqST45b@qPlz?IBaU^Uleq^tXLEbCAgH zUk4}bdq_Q?+1#co3X?h@+W251bjoqzd z=zQDaFVHi#57-eZU}YYX2?8Xux&zalQOC#7IH3xxF0ER6jQ}&|V_Ug)6uWG|7f&0g z)8dxDJ+B!H6WrWXDTdBdFK*YVHqBTsHC0dzVC5oIs(;H7m8t|8NY*>zRBj(_gCn!r zj18@y9x6_q4FNTqf=czB-gv#)nDg^I%=km}^OB(f`nvpigJ%^2up>&K@w zp!!629>0(PsMl?P3<<0*fSQg#rHn7S^;MOkrR0Fo@W6UB2SoBB2D#7zw-W-6dV=Ti zxiM$euV@0ClzXEU40(uVcu_Lu5B^=0B^D;=)0|3T7 zPUIg$&e;Mat&#(jKOxpb6X?!cD<@61NH>4xb5dIDd&-1rgPlugLSMhLCfk zlly6$Q3S#9*;jCOPzFg!i-T)$XRX+bBt@Ce@7 zCcxG5PErrn`+sK_d8r9djXA6)0NpQR0%V-qvdyf}siOjj)a!Mw*#zJ#RAgXL-90{j zzh#T6z`X)^O!0*tR*-w$@fh>lnE)aaMyo;`+pJAmi6C?x@GFiCGr5-F`14K3;$9&? z$$S9i1c*q^3O?S1+$P8uF+BIxOf=GXs=_IkbA*S#;`wUjxu`$-tV_0ZR5@YI)?mtQ(8D~cntvT0{= zO*<<)4$2;R{WAeRvC}#8E~eTf@X$&1Wae8n0X!;F%XD##lI5Y3>ap5S`u^<+U|oT| zuC&^Z>VK7XzlEM&{;GVZ*qQ*EN<+q_-Dk8fUsSVZdFi#@mty7l)&#}%P+c>_G@$43^RmqE=^1?t&h~j{eP&siKAJcHU{(lM z6E36kX;6h!iwSi>`W7-?`y67{kwpOpl`g2AOjW5-X8nx{^jqzSFdMr*2<3CDsKQ# z`+o;lDu(R%9P>8r^sC^jCg+YOBX;~)yxvPf^<-&RwtmVS9{G7;74!hG_Qi1Y{MGxc k*$Pp5dyLqLch?V!f2N$dsV=B`bpQYW07*qoM6N<$g6AOmrvLx| diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_9.png b/assets/dolphin/external/L1_My_dude_128x64/frame_9.png index 4334eefafb905d4a60de23eba29fc7311a6898db..5e75e2dffd0711ba3c912119f7718b082111fffe 100644 GIT binary patch delta 652 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 P00000NkvXXu0mjf!91O# delta 1613 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 diff --git a/assets/dolphin/external/L1_Painting_128x64/frame_11.png b/assets/dolphin/external/L1_Painting_128x64/frame_11.png index 89d003d071e2cc1f55f2c13f361641f996385ece..e6ea79c3778f0147b375dc4df1105ac7ab711b31 100644 GIT binary patch delta 839 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 Y16@knQP*kC3;+NC07*qoM6N<$fu>b%7 diff --git a/assets/dolphin/external/L1_Painting_128x64/frame_2.png b/assets/dolphin/external/L1_Painting_128x64/frame_2.png index 8bfe6b33c57afb008d06a5b1743c5bd6164d2522..302d5be61e2e34847c9f4849bdac6d40d9063e8c 100644 GIT binary patch delta 834 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 egaIO;YySg=bf9>Qi_M$>0000^!lv5rwMrnktG5 zTd;wMHJO^E)ih0Bk|s0Fymya_X=)XEmp?w|Z0_$UaXMt{rGFhc16+-^0=*|^aJt>z z5>xzFsFN7rUy<;C@!TE6=@J?Lc9B1Ib8JgY9HJiHE_}$?I|(I;3DZM2ccfFphQ(cj z2eyRXV~n1zU;A=vN19c*Z}#8FS6b%%cI&t2&s9z4$dvNe`!a(^E9&SUt%me;xz-dl z%^#e!2PgA034iXla(!i{x&Xj1szLzVwtbTLo}8zULoKJ7}B z3|)Mn5q~&uwz5$P3eP;8fD)&P-}qq1%h_bO8Z`vw2^oas-Ip2_5J@^~s|ER@`bx1_ zG(`cgvYLhN?EVkyB^`baFzK=KK2O;pG1dX}#l#axc(uPFq*X<67IjOk%G}|<=8&-Y zun8p(qYrI%e|#Ke*P&PxaZStLEnS*<`-UA79e)-<)oN6m)3rx!PE4cttxR{EAITqY zep*@S3gG&}Q2&VwYhSPDw0#yJo0*vH`^gKViV39)aQCUZUmW<#u1DGq025{dYTtWd z1h&5*(zA2f$+T-Lo^aY80M1-4)yHi&6U)zJaU&^bK3R+ctI_@puI3c zhd!f?gN%b8NNrDSY@^g%dWU0bVB0=j%r%0sf=J!wX7oT10mvwz!YKU*(yo@}t1d4* P00000NkvXXu0mjfzVoiGFKuWM6BK)fqg~3q;uY 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 diff --git a/assets/dolphin/external/L1_Painting_128x64/frame_7.png b/assets/dolphin/external/L1_Painting_128x64/frame_7.png index 336cffcb4c16ef9dda5fd12e4e56d9a94049c372..8212e629c737aa69bbf58783e0e22b7976a95d9f 100644 GIT binary patch delta 847 zcmV-V1F-zw4B7^e7=Hl(0002`twPcO00SXOL_t(|oORJnXk29!#_|7o=T4GNQj-eN zf~YYlmM9n(iXe7wiJO z6O;T`$VnXFx`_F|*mV=}NtJBjMlo2qTH6p`>?8_q6a~n7Hxr^WLwk~)S2vQ$0}hqp z>%wev9JBrK`D+_Vi!fVUdV4TzpDT2Fh0ejVtIoYwOz!CAr?b09LK&IraLjK}{@3co zYE)_sO089d<$o1T@1I^>0AQk~W@Q!G3+t+?S_Lz933`vy1i+7|@h73{Gd~g$kzUl) ztI)c`W@~y%xWgnwvX7aXj1KgLvQr&V;}PzX$@ zlBDkpspwp$4l<}}0Mw90e53%z=PyX)ju&!no1PSr#7O(%E#sWIGWy7T2^?^1NfdBf zPs@qE030XnBhGr9e#v~k$pa_mMH;OEIiMJT#F=_WeM@fqgZBu3uY;sg?+9n^+dJP^ z?0ql>Nq+_M-~MU8Z;21A+JC=)@Kib(AxJ zO__1V60eeWIf&zu1#{hJBVFO(7_6i4u?jN3H}bM8{>DBp>Eu+2e^wJcOAQN zyB^>!cHDLB#)koZ*w~F!4?r`JXQOA_hXMK-07(o!Kg0lY&Tr+{b-jG8IT6Jl26!(6 z@I;zp3{@(f?0+e@=4CT{S0cPScwG#@{evXQlJ)c+fGVI_k`byU0F{eodZa{Hwnpu+ zWOvgzD&N|h1-|};0W!fyYBtIM9aLG7fh6$``JR6wpmQHj*)adtdQFjJtTmUf`=%Z; zMo);eRvJAUemVnGLFK%>3ibjT$;K#nvUOy5mI3aLOn(o6;OQEe34SH;3roggh7&>Q zOyCpPowQ$E;HltCIWiCw{;b3XR~5d(HPPTQbY7P2<|mNHPqlK0>b zw23E9&C(O4X+A%rBYJa)BFdy$d0y}l+v%F{o4`|)$;*MK7u|g4iQ2^?-AOveYb?#5 z1-zRky?<*cDickD$Q7B+?O=h3f>ZY7@(WPX)@_EzTZ;} zpeDfS)1aL|uXo_dg7g5^=|>I$w?j%eFBwlUK=Oai{qinF@*M*~?&tm?_m z;8Dq@uG14mSI~F%0Mxb$(0ye0^EmAo1X>Sqx8Qe{lv7Nm_5hyXoh8Bx%*o(GPAw)u zr3Xms8ek8gok|4ANvsAr+MH$AbbsJvFH>d!+Vr4CaG6n@Ztx`i$XajRZ5Y53EImKr z^abyvqh%`^EKjGUOJmt;Im`NePUAg*R|a?j?Cc37!#OOSl7qAajy%)kW=^BzzmBBv zbW&W`W#0mtT;(&x^GRC#!%oJrMv;pKgBD%(CU;utFEl7M1Sa~fthOtRhn6cg6s1( zobAr7byn|z0HuG8fwX4}*MD{W{VQPzm8=tP&6k?09f-=O%+#$jE7NLBI~c%9i1jtb zzyBDbWs#N5RFK9Pd{a9RWhIo2tW(4TMn8M|^?X}7`5A;5AlkH8pU2qC1YRACI*GDG zCiq-Nr7^2AK&Fhn+ydw(GO)6d%H7cySkBO%dGaJk`{4h!)?{$v7E&Y-K-c~O X%grfbAn=<$00000NkvXXu0mjf2`~&k diff --git a/assets/dolphin/external/L1_Painting_128x64/frame_8.png b/assets/dolphin/external/L1_Painting_128x64/frame_8.png index a44a7315da3d4a550f3453dd8d221dd9131bee83..f13bf906cac809773cf69ad903782a78d4e56e4d 100644 GIT binary patch delta 848 zcmV-W1F!to4BG~f7=Hl(0002`twPcO00SaPL_t(|oORJpXdHDI#_{j_+nF{^BZ)$4 zKs0F)EI}|H6hZ7xhzGr`lF2p}Ohpf34~kl>F}S~Yv7lf*2woa{%XUY|7CiU|*@;>$ z*fxqrBQ?#WCLtu1Y)IPt*_nAg*tAvXdwlpj&*c?OO~BSAEq|T^EQVWw+3Pu^rrEzP zCit(AlQ_T)5%Yi1dkgVZ88>&c$d6pBZHaI8QwweuIdJ`33DN1kL&^SY8_C2GhmnIf zgxTvjX5X<3*Ef2bMIACfBec5?t%VD`X`$l^G7ZFTY0fu zEA9-6JIe?wtACo_H?_6^z;H#)>KgJ2Y^thi8O+hk(2>|}0Q`g+I{|I#)kH+312xq$ zG=N*tZ#B+^sUd*0muIYmN(? z*P%kJAI!FbB>Bo4=1!(PrNezWL^aoVjAebUvKD7&C4Yi9^VKYqX*jjCQdt;`fMHdV z^y5BVs?27pAbC{-Kou9UNDho;9-`5^p0D>B^rVO+MjER&us>cMcxbK&l9-z=0s9*Rw zoKJtZB(BdmjdU)%BTmn+5Z40QF=(*(lv8Sl`NU_OI>f(HF+Hi}L?$Q=;-EnY-2<%} zy;{not*V=)Pn6QYnCeEi>ZrcE;rFQtqy^-GnSbR+?_PP(_mt9OKd7!}k1xG_DEZm% zn>K-j;2w?EB{aKzFEu_EbamV9_UM^R5JsjXF_^Oh+gW`*@x9RW@I7$YgU`Rq1R-=+ zE~}=mO|2K6P46fTrKUTow@BQi*$?HHAY3uUWH5x#A&t`8{A_A^GmjqxTjc8nlL`-GN@YZM^@L?%5Uc%RT#1LeV1F9{P6*y7wAJ`3z?-$z z_$t7gwbke&Kr1gBr{i}m665Y9Rw+S+Dm*I!YJn&DE2OTq&p3vvaa;{>iXW%8)i|yO zIK_`s+iH9j;LX}Y7owdoOet%wuuOh6Rlx^402xWV>3% zqxPk>Nxp3mf|Xv!0uXa#re#$NfnUXstVh z8cVgB5AUu3SwK6NSHW6BEo`&`ldXc`UIjQEo*E#6mw#)ZC;6GgPfQzA8FnP4lE6E# znzRpWa98rFIX#P;r11u1)f!e}Rq}i9uQh_ zM-{Ou$$v_%S5<&JNPvq%d|jMB(>HGtBSFReEM$m&H&Lko)cD@J{@XxraHC^2o0P3c zU?MM9GCL3Z@40?fDF9V8PaiJt0U}A0UQkfaJ1tYpPJw7as<<9wapTV7sK-+ysF!#+>^MdalQH(^vwtjUZ(+ff`D zR=qRe&Sp5LBwRZHGXcRZ8JuI)z9Luo~R_5kI|~?(Y_mtuUtzj?ETW z2~trFTX&SlziO;_4}h`lk3zGk3P9z~&yrEIy+f&a8#`%%GqFHMN*m|HPA1BSyN>?g8FYF`vj|oAkL&f_F&pIt_$q^te3`uN#`XieF+Qjt(^*u$VBNV_3Du|WT~x&O>f~qFNF6KiIn`JCykebP+keLx zL)sO0)B+IH4qXw93O}`ETgPTe;PU%t9@)?xB;Xcuq5?plr>zXJc9Qv-VN=!aq3mjN zo>~J;R39tWb$HkF+#MJR);Uj2e&vy}OUc+8Kr>uH;Yk+%wG{1!^7m-_jTlcH9Db@2|IjEK8t6TJgAo2pj=5 zQfhu=HbxXsfwIY$6yZVbT+0sNU{#W=Oj7o&z{QYMNI|0RO8&&E8UT*{2ebA`fa;gz Qxc~qF07*qoM6N<$f|myW6aWAK diff --git a/assets/dolphin/external/L1_Painting_128x64/frame_9.png b/assets/dolphin/external/L1_Painting_128x64/frame_9.png index 7cd4252910d4f9fc9b398f349d21ee6bcf6834ae..65c88162784e6f4143cfaeb1f8d072f5a32618e8 100644 GIT binary patch delta 840 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 literal 1762 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

    >s&;jK0 zK`fIP+y;pO{`&Y5%D`uLOAY|v$32eq%*1dp3u4~|`nVjcE&J1pT~p(0>v<&LmrKwXnzot(d=T>1^Z&}hZ8`cVZ$+0?{}HPXrSbReWAX5j!Xp_h=JrNH(mA- zXwfUpEIu z#Atu3-{<>&^2uH^$P|$>Y^2OmSqx#wI`qMd-QBc5@_*t|1Vrk|p2hJKwDoL70$|9x zzH{{S+9&TF;-NNO#nRt*j;ZcSGm@{Q#a%okLS(_{#^i4ZF zwJF%O3csEdY-z|B2-mLEDz7A~Bln)o)Zx!S> z9vTyo^?&$)f8qMAx0hv=IR~&`iOPqT7`rR06h}nlwtK)2mgbg2S=Y|IQmT}>{{Tl26W)=Bp#1E z?au;ZA|jGfBENcTr=-@xJ3FqP{OZBwD?h$ae`xg-=#~C^oaf$ZrSr~?63>Df*?oT( z?Q&0X-=(dm)Z`adT3JcSJ^W|x>um!AXRa>jt{gLD=L%V(|c literal 1756 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 YKx;?vKP_DqJAHqfBu$FCBGI(=KMzur`v3p{ diff --git a/assets/dolphin/external/L1_Read_books_128x64/frame_6.png b/assets/dolphin/external/L1_Read_books_128x64/frame_6.png index eabe9def3375a009bfa5cb8604e7e880eee5c187..aded14709cd4cb0b90260b66859ac1c24f0d2d6c 100644 GIT binary patch delta 743 zcmVxQp``5&)I~uM3k`^hE~SMyBP|uAYQc;m zl4=XNjI9J@BD97ywn>voH_6O?J?vVre?q_G!^`{fd`k2DnScKU>VK68Y=FQ9V_XudMDnAFVIxZHM!b+DG~|C;N}qmhVpKz0-QXNU9Cy zIbDT#Fb(@bX@7$bh8?gjcbyvpd;=PZ0e7pzZL|Rt9I!6Ai)TocZvqhzzss)Q^n>V|oddrqMD6)i4P2zziga9 z^G;6%SZXCSY;hR!Cae+P<2?Ls&a??vqxrZ3={&s3AOKUksC6dkk;CRQmkMmYWAo-S zIcvoC$8E682C=tQ;DLf7uZxJtIbGDfdxB1RXm1rCBbwB@B%>c#ea@0Ayh zsqyP(Qd&yLyz+PE=DP0glRwTFtr;dr&*aiToj9?htE;(^CQ781ktAm-1&~SVkW0wa Z{sDqpHT}3>$!P!p002ovPDHLkV1mYpZLa_T literal 1750 zcmaJ?eNYou5Wkoj5fIc$1!XiITC3%f%OxQnf)bJ-Fa{7}#bS|5?h>w$T(}%2P^1w? z5Q?Lt#nFy-;z(5xkW!>pWk9KlR7-`b2m*gtks^v6p(;#EFML@4aJ;*B@4dbK?f!P( z?p$GP^!hpOi`)SKm=hVHieqL6GeX_i%=@9+UJWz((dq;`o;1)ll)?c8M(S{GqzN_R zaX5-)reDW{0f6lwvbWCo>Yj>Hf!4QA5!ZbvRfhK)RiBA9bQ(^RBB!-SjZNL2{PeBogP zCYPzg#6hq^DpabZ0)bj74HL;!>TpqzDomja4@ahLybUW6Db!-2Odv&M0vA>$R7jNy zSf)^`V5t<5Ok*R>RvIwG4|RpAt|9mm2c(!`xeu$*`c0i9HWiuEELBos?!kjMawA)Q2wK|&PK zqauMpr^A>4Ch^!CiJPoZM#2PPndTxlU^-YRLJ>$T6C)6&6QK|qq?bSvOdtx93PiX_ zst5TDMZT+M-l(Bz5mT713$b%JH&$VdIzoX8GEu?w3l> zXUFeuOTE%K^6SushFLMyNsrw|@K+g+q5RwtfA-a$QB@PtYir2aSuMTvq@!S4@ycC2 zuQFQ4*6tr&6CK#`Jl@c|%(t!}@l1Wscnt8MMbUCGslw8glbif)M4iOT-*&l7_Te4ti$_n-9rpYkxUs6n?PSJiN8|Uy|Mi2v#Nx?!p6&e@tlP2n z&S$(e8+}ffeA>M!ls$X#m>LS#uDJXt%(&ds|DNsEYC^hBIWkbuDjBHVL&O)9dWCNC zII;T9K*7VGkHvJAfj0q9NAut^_KkaoetNK#`$bcK?3rUhe#wsoNf?ZD}qy z*8AK(Q*62l06(-B@$%BsEPpNckLM4R(wT#8jc&*NL$hmY>`$Y7wq};x2AxNuk0Ov? z#CInS+$CQ==(stQZa{SS|?k&FNU diff --git a/assets/dolphin/external/L1_Read_books_128x64/frame_7.png b/assets/dolphin/external/L1_Read_books_128x64/frame_7.png index 3ff0aee0c806af1bcc5c9a2a268a3b6e124f925e..9540789e7e668cac122554570281ab7ce3005c7a 100644 GIT binary patch delta 747 zcmVAL_t(|oZXVaYaC@5#(&@JEE}A(ST$*3 zEp84A(h|A~JqQguL4;b62HGzT1?`9wDHV)ISwp6^gN1_jV4!LbizuWsMX}I>7R{hh zLfb=nm|DnXf~{TCYPKemZj+gPJ!D(ZKf(9-H55?M}~k|2VO_mPZ19A2o8V z@N}CnIS^?L8?@neIi>>jNU0 zHfVCX4#`Ls4S#{s23r_)z&hXe*(4Acu&x+(`yD_VK*<5?oV!#96&OGaBnP?W0FeQV z0@lY|IRk7rJ2fN+nHZxw7%A)!KsR6bb@9^HH?EuFP61qLT-Fb`Nd)Uv=={5SuehR3 zzwWy()W7U{E@6;JY1Un4sVsyrZ0`H?NKX&#&%L-50e_Ktv3Fr&jJ7dbkpLJrZ)~1H z^Lo_-mb-}zTO5x1Ggd9|ISY5pMvrhYZYCaNP1wl@0CT#mbuO*S;YV3K*fwqR(nDa? zD*SOwuuKC0dxr`KM8NVkh6c35W9cPapEY2;3vS!%xN~u!bs!cA?Zn+rK zRS{{9CEm!-Pb?Pd51%ow%lf1Kn^V7KM(6Ux)2pFTf0_;`Shc`o73hS!n|M6`vOf!q zi-<@{iTuj#&61jp4>w&s_WjnSOV{3X-#G!sa%BJG_G|CA(s_GRiB~}#+Wu5G?Q(B% z@WNv!)YP|TT3JrXJ$pa*!-j!@Q&$^Cca9mdGleWvCr|F`>+5XEQYF&LNm?+K0?4Ip dD5T_C{{ZR^GYvrgY|Q`w002ovPDHLkV1jMwV!HqU literal 1747 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 literal 1752 zcmaJ?c~BEq7=PieLJLR{td7f)QBgL#xk&&?AVH}FnUGer9d)zWz#5WGlO+U{LM_Du z&{kViEZW-EK|BW)br><7A{09m6-2AFUbTo?4+_ZORJ!4?{^7W@yYIbkzu)h>XE&s$ zEeM!2Z4v+=AZ4LS%dW-jBlPoR-`S0iVRi{;)R{~MZDjIr8wr#KT2DeLW;~13lDHxN zqgFBw0MAlNm&s&mQso3~=HYG~p3`h)(E!9HIITEgA{j_eW>J=S_))_d7@`dE@Di~G z(^!+pY-(YFjm#)W(-8$GLS}#y=0kB#IZI$B860w&b1ZhbGaer0m9u-d7=@ux6~+_~ zk2#g8Nr#eX8wp8ye1yO-43f%tqyZP`g+`o+h6I>^kMh}Ditwd!fl$tuLE{(98nhXV za;++P+#Gv~hqD>RDo4@0ygXi>kVo6HP`*qiLoop=5Fo4uV$ZiQxD&D1BPSSCq@A!) zR)(T2ked^WAY~pLN@+2FHGqg=d(>W83ke*F5v^|@)LINQVgXU;( zg0i?JQSK^@1+5}&l!G)R+h{X1nr1om3Ks-20YMN_Hhi&|M8rmsj7@|s#KHn%Y z;9`t`$MJ@j(l^$rtb`52I^m66MjFIYJuXBHdbWQg5)sR*$BhUn#*G3ACgO`lF)+%y zh`KxHrB0dXDHV4u>P3esUK89$hIa zrOtV^DYMLRAM;BZ8R>YMqcL+!{^rK^7)?FL-<%WYHES)p=I{_YweNVhaWJ7_J^VXS`>?&xdg3tBmf&MaIt4cp=D_OLT%?eZ!6E-hVIJJeYho!6)pRpg!>fBgBF|;(B4Su zgG$BGnKx8LgPo6CG0!UQ{x3F_QGJ_|05|eZMBSGMc7Glfl&(NBPVklfi*FBqhDB|8 zFfWerwN3_i=3V@5g~__caI^K@oNAPTtX_(mXii`|oT2txJ*6xF_>$gJ-#fpR3vTtU z;)HY+`W2T&al#%Upn&FF(RS+WK7k*An*f}1wD>)Dd8C7_x(oGh7KMAR06P+cd;xc| zt3107oZm9PkFz5(G;~gCY(D62FYyL**LXl`t!MGDD|-5crsNQ>?!cP7S^XZ0u(-O0 zpS{k4-$FZ?aIoR_rTyYzLFJ#-wbvhHm3BRDsy{PuY(B@zj{{KU^3a;z#CwGpA=4FI zT-&XSDEew6_iEEyy)pZS7L{KP8H~kDvn3U+doKUj=Q`TWU!|;A*C>^=b?vlshHCP= zs&-n+whj1Q-CbVdTiaTYR*JqKswk2id*k{R#me4gwXF}gQ{R)I;gG`IQNOvg>RJos zUli!y7O+&Ca<77w6F*wyT^gS%zD2cw;SuKq^4W#E&4PUqG=?;oD+0$j6ie(=F_ QM)$uaMV+QPl(=&3e`D>68~^|S diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_1.png b/assets/dolphin/external/L1_Recording_128x51/frame_1.png index f3b3f8a977f357187cbe110fc5f5f3429141dc2f..0b549c648cf12a72f9d140dffe3468fef11656d2 100644 GIT binary patch delta 653 zcmV;80&@M%4VeXy7=Hl(0001Y8$G=M00Ll1L_t(|oK2IvYgJni#(!(FV|GO27Mp+v zvjht}BR1*I3Rv9k`Ui-$R;ChPn0bUJgpMP3-Z>HE>@w6>0BnVI2 zo`DqA2hjO|a6{iADTP0PhGD3WXx*x>U+8J2mFl$6z*r{e+1=Dvo;ay9IHm_!zJJP> z-#4w`ASU6hyW@J^BvN{a=%xj$D8@&9b*KG9Htf>+^FPD@m`9YWCA>L{02tHIsWFn* zv;Rl(7r^tcJ;>@ls4jbf1;;-?1Q?KvJm7&6P!LZy zqp4j+-od~*FW3km;5sm~=44^9gcY9-+eY;T7|LUW zB<7P(aOqG;^6`J8xxuaikaa|YdStvjB^Xnz(}1jkzVzN7i);gaYU{^ zqp>-Sm`2LYu4>&{E;e*c>sDDy7DM4-(7!T+wud-VvqXk54kjBgyHdBtv{R_w!)U7( z#F#(|jAJTbwx_D47OIPws#8mdfF8hh%&nwv1Fr$LVV>PZQh;LsLqxGdVxZc}-}opj z7ph@Q!+)>Pfm-O8J|YP5oH9s$b+q?_mKV_{d|IrZ)c`7*l2UBk&PDB+)GBj npgmQc*Z+Pg%>nfBmeL;qAVNY_JF!#%0000O4V9A$Urw7);}C~cK5ya?f3hA_v}|G z$qRkGg1rC$zUoAkmR+6fgL`t>cg_!g!R!*m#HTY$Xai#>tQ1h{X&nWrO++@Or3ih& zii=bv0NhezYC4myS)?FolYnsP2plF0iv}Pv#$h4IT#A8oRJPF^1rM~Gh9RRq3Qm(~ zP>m&y$}uJuTB#+4$*E*vE-BZ;G0{+@L%|Z5D29L>raZGv;fR9Acopp4B^JWama=R+8ZiG(8dmLVdU0>c#|IW%#>tU;^Z zpwOxkCd{#?C^&~;q3`1BA#8zNt2nS-eg-tT3C>v=t zS{Ng3hFpwMghOkL6o4z+2aw)RjC>C3dY+Z;v6;0-wC^Ms0MZxSBf!?TBNN`*% z!zmPzi%Bsemdhd#f|TeGgHDebC>cuV+lIEo}k2WxeP~9ktjZHffB=2@t6$7 zlyPxNEMgL?Hrp7&Oj47!jjZhnY{VO}ia0ApFtjz5rt>BnAti@qXj=|#fiPTvLg5;M zG@4zK4_s9m4_ZZ8jVmdAf|WKwV`)|xU*iHM$4HWtvEfT36e2N*hqLe9i%y;MyM1>O#2;DOD%#%$YKjkzl_gfMZoCB|!sj{aylxe^)k`)2@jHHC zM@#bi>BC=g0{GtTl{Nc!;m(_Go*v*@o_&3k+q67Hw^&@T0BTEp2C*}#d7-1JMsJ?$2Ld(n^(=$D-yiJ)kD*>q=xn?7O%iQ}nuXpLQ^}DJ({kdNU z9vfIc%Wrzc`7L!VsLu_qz3m&{f2Dl)O5dyXCo`s*S6%`u54Ed~9;n!#cjAK4r?}VW zvUln1X=PU=@2w~WFZS4^yOwjZv`yKdi7xr{pN{w$eWHb6xV7)|yY92YgW8MEnX|09 zz>v|FH2*QWw*IkS!%{GGDx*%h_yTitRv@1`9v0mU`g*;Xng?rFZMw9%D@1&uzRNhR zv>Ag-Z1nBuI?hngwwW8-f<5t{%3C$Mf@iCI+7oO$(`0A8h(g}r_U;Xw*dgyPEMbR` zOFIG~;D=cJLH)ymKe$&pCl5bU2SoCmjTH~McKwsO;`Cup6re>O1;0y0D%T%I9iOZ^ IydbOOKgU^uQUCw| diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_10.png b/assets/dolphin/external/L1_Recording_128x51/frame_10.png index a474c21479d42198b80b6e5c29005440d8ebba61..e45ac86be5d0ccaa110d75141d7d9de006970241 100644 GIT binary patch delta 669 zcmV;O0%HBF4XFi?7=Hl(0001Y8$G=M00MAHL_t(|oK2F?OI%kJ$3OSX8y!s<2iyo1 zdlOuAWdd2mMT1YW?ZQRKvL$~&>Fk<%3Geh%krR7H6o&6rZ{WT&&RTYq|ZRM8%#ux*;W?l|Tw zv>OPkbB;=a>H;k7Al%dckc8ZgqkaI&i(0nIySKaUvKD@5Rv5)tCh6+WluNs@lqt;U zI0w^nE_kdELyZPc;w0`m8WJ2tY$Q1rJ)R`$*?sALC$=w-(wZ0m^9O;O;6IAZaUZCu z|2lE$YWQ^ZT7Mzm1FY|n*$JrCkt!X`ty$ZMEoQzCfuR__{dnjQDt|fz_=!az0t`q> zdmaY_KtUYoI#asQsY7waA=n)c_%!io^EFZ1hLn!WC;Y#V9TIUTg{`T}U$nn|7OK}X z@tD{ihsxSuOJOl(6jbj5+?(WG%ASU z(Eoqtm)6-}@uD#>%*cTG9GMyehNP)b@OUTZ?tJu+3>h2?fgKGC&Y zU7d;_Dp~G?){!pes=r~hRSF`>WBvjzUy;2>A^V`cuXbf6Xr(?g>41B~0Ga?)O9D_3oAmihfW zo2=JI`@{odCG1vjY`l847kaS)9nPnX^>fx}h+uu9SYW{a00000NkvXXu0mjf D=tMiQ literal 1708 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 diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_2.png b/assets/dolphin/external/L1_Recording_128x51/frame_2.png index f61e59efd34b111b72877660b6715ca48940bf7f..2901debc4eb1e5711f313c5e901a9b3d317e52c8 100644 GIT binary patch delta 667 zcmV;M0%ZM|4W|W=7=Hl(0001Y8$G=M00M4FL_t(|oK2HGXcTJ{hM(_bHrZ9!jM{7w z%%@mb1>qJ3BiuxV>>P_E;@iE41LvHV^B7f8ewU`yReR}{7gh@ouYX2#Lxu3p%(LEeG%a*O zgeOhMNQ~+|SbUH0x4uPUGPe))6)67DqEY;HsqbcV=*Jg?35;c$zTTu*T#ckiU{3eZ zoo%|@V}%IHguIF3sP70RcM#BuGb}ooCfL~Sth-NSzpf=^F#zTPITyfBMrJSyYN~gp z4j#*oJ~=*=e}4d;eI~V2P_7~+z+7CgVPrAaMv;x9ukIiJ1|yFh0-cD5KmZt!gw*4J z98eHPE1|BfUKNIi9fA!2d=h(fex0CWbLhEj%D;g08v&Prc75hd=gLZ6I+cn)0mEdH zfIq=@Vj(QE;zEuP`<=BgmF2NjCNPxnn6YIfq<#(EV}JL?QCx8(!4My@=D%;h)!36; zyl50z{-;(kCz07&%=MOP(dcFaUDKkG7m}1Ab5L@xOv(0<$P|1f!I%hUCt#^pG$wU1 zQ@xAPMj?nXo)|cQ83IdvRn0Y1UBwI+3-JNa2iS)BFWk)ZHNYt5>1`wim;)FiC`U*c z7{UiY(|-ds=w_;ZQg76MJsqe;ebX3Yj1k(IsyjK*_GSm|OtsTq(eZ9NU9C=xiU)S{ zNKfxL-}>?6bG|XQ>x*68Sz~?E8qEWEF_qn;;-9+@9|Q6Ls-)f)3%iK_4K^Vdd^tC- z-UjPig{0Q4EWf1s3GJ(DTMupFfp%53o&N&pClpo>N-9@{?~MQe002ovPDHLkV1hGx BH7Ni9 literal 1688 zcmaJ?eNfY87=KH_BEuUvbRZM6;05D4(tJJcqgMGxFT=t#OI>Kj{07jL>Zm#|V`wVu{dklI9~Q(B79 z=Vfn#1_RO=tL!Q6I)% zhiMRvC5p;0#^zh8#QgXqGCz~V_54-g&`P_4B`{G80ohGiW}Ctu#-HR>uzRN%=0lSz zOlBB=%Bd7h0u)7CDM%(12}lG%AQ>*C^aQFC8wfH4LJ?F1i`ZKx5Xls%SRulp>5I=A zwCW8CtulJr9D54mXE2OK0mHeuxx!qrkhZ47A{@tI1cgylz-kC=d1i*N3(U4)7lV?r zkyfLHG16wp$w=tv943sY)K5kE-;(EHyd&)vfe1xT8(U7h%6;d=9nlmqgICT*)Kx9QLn(n zVu?&lAp%@NN(2&ICKnJSrV|)+delJ45JHEeE}qxnqcIUCSINXOF@lIhs;EdjN*XE0 zaFq&I;gNEs3#&HU7{W|aF55=d_B0lKBUTY*r3i+$Ced`3s}T}1Xoj|B&=v?43lV6k zh9He*r(~J4N>f2ADXVb#0pfZ72A{B`Y zQaynoB!3#Oe{{?-c;Md^yzvLv!69;f&uHV|E>PcofAQ@|UvQUnhl7eAeDltg<8BUU-P8C@C5g>x zPcs7wdjmj4adktg+Q+eVaHmJ9*UxUhB`+LLJ>dH|Ji#1msY24OS&JezHk{g)@rPG) zWLfBW;RoXn3z&z0$N$>u9=NV?03g``4@Dq#VASX2rZh6VeNnxTAP#wRKL00XPes78 z>mL21IUy}C+NyZObH}6E?;>B%?Bn>*xq z{c<;Nc6Y&9Zt?BX^o8IiPrKMGt{%*O3zQG!H8o^z&fKCIs_pYGrH;?LFw!wrt$TnP*XwBk<^YZ8|TG`KisU^ zZrf3KIp*4Py`LQ#F6`=jo>jx?Nsrn)vS_Bi!DD%EY1Mu&aO7CTlE)$a8*fz}Pn5U% zdY^Yo!Al*n3E_Ufmp{{n=a}V3A@oi#Sl*~O7*w0RcMkW^l}~E85oP=O*PP z=(^;n=hzo1JwL^6*~e{Jo)KwL{IVidt8IW}f5pp72XWUjfI}AIG+~X6^s(OiO{gKZtSX*^^IvR^|Lx Ns8#XGW09X0{RbQ%dUXH* diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_3.png b/assets/dolphin/external/L1_Recording_128x51/frame_3.png index 87e297b2a7292eb0a93ec9b426d669a76476c949..c0e2388b796b8942e3f6e94c90e3f3d9ba700173 100644 GIT binary patch delta 651 zcmV;60(AY+4VMLw7=Hl(0001Y8$G=M00Le~L_t(|oK2IvYgADX#((GJ?n~unHBE}( z9yNuPF4$}nvJnfl${!$>Vk2%P;$w4SrHH6tp@H+M!r;48(9$LKQCn; z#3zGuiGB$1aesxbI|3CSouOmZmAWA?P|KpBY2emjR)NIgLAlHuzylQM5WoU4AfPS4 zxGdrW0~U>GRRKp3Ky4M>T6T_(4f5^=^c)`7f{^C;*oBs^#f1|uwL4o1lCXs5dvNF` znxZj3Y?0IC+`i%Rte($Riz6s9_SY7 zL(zmXZrUh`JyXbe19Od#Tu2!cQ|OhD-fR4djKWB`OBs7NT{ZW&)B!%;CV!l20u<_t1A zJsz)AO`79QayXS`&A3pQlanLJ5esN0MJU2BOo*UD6y~#+;x)yfq%0(3 zFtY~Q1lbu0EuF>6Vb0l!D2!&cdYaf|namZJHKCO-3q=A%Xf)bG8`rk5@znoryjI(i zU^7#~c*;U&F(g+Kz1I|&OW&If*%di&@L0yc)rH7V(qxvAGO>|LIm~?#=nOhsDi%v* zVhZ775>mpKV6q@SK}xlJy;g_nDH%d&F?5ROb$AsfMkSaiP$otYktke&DOLxmR7%xq zSr~#U!ltp2CJRfLNNUQqfwMh{mA(;+D;SDkX(oZDGo~6rlS;F+C6zWqs91nNzG{Lr znCucidzB`FR#J>1o6@Nm+6axO88^Jf1r$R`l9X}bOQjTFs+V9~B2XD$ED02e^np4; zijeRmUiV7+COVaqaABCIyumR_CzWXlF<+idNdG`h@_GrSjf33 zw0F)coirul+S9(B9u4j=JzSKDn<$1GodtUfi@33yrHM`m9~&EUaB#qv)mH-G*dD12 zOR)ZYsmz6GMx2zkp+>f5n^$vMtDQcci+D9Bx1-Sf=Yj9i|Fk2Zb8EomwjWAQBNtX; zK56mJU8?Derr)%+?YA(+y92W)$!)^#R(Cm}5>??)enEf(73T+$_~a&%EapB;|I2 zwO##SuD=b`?Oh0Z8+e*~d9K}OoZl&^=goTy_yaAk$=&tT+@_I7i#GPSLi2}BO`C3j zG?gR{tnY{juEH+9ADVl{*A|*x$P4w`=m>dsz*U2vmSMMsRnbmqimI*y**-maULVTc zJ))gk&-$wOILv#veZzMumk$m$Iz3W+E?-o1=$LN?vp&S3Q(F(9K(KFlK!aP2u&^yQ zzE$lp^6e+yFT4ubeTRmNceKk7)bt$R-wo=YWYu3^&%bMV*f@u6)bZxzNLuO^&eNVuC{B~32%jJpDf0}-w2gs)# zdzOCHzs%9SYDCkzdw6$#Uw2S-RT=F9h92C@j;*sr1ncJ%e7)}Yj*7#h&||M_yk=AK zX(_OjS4Ra55DVk_-Hx6BgO+o)>OnTTMXlYbNt8dUowb$czIkP^dc;$-z5225rmNlf z-7Ul&y{I&=w4x()#M37vAWyn^$*&(?4sRjghHZ2EjgS|)Hf@k-{?2kRz;|DIRI^mX`I?@pmkUw)VaBZI*Z=Siz#r~6t M43ANsSe^XYfA0;5ZU6uP diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_4.png b/assets/dolphin/external/L1_Recording_128x51/frame_4.png index 62428a4055a629a59736231282016f0b6154297a..c81f905398ad3b18c1da68e1559e2955dc821494 100644 GIT binary patch delta 674 zcmV;T0$u&b4Xy={7=Hl(0001Y8$G=M00MPML_t(|oK2Ilk5p9@#(($jTXxpK>?1Ur zIAJdd1r-@%Lt-(H&QAUSqlFDrY-LcAox515F$OxdP#X&?#h56Cab96E6p{c1nFRFR zLCG!z_RZ{)owxhmyw74-;@5pA=j5DxIX@#=@qekHBaMp#Z-3dW1Kgj}Ots}7v&#P1 zv+iIRWBGI4GnXP=hu*(fKG#ERO6gCcun6_*s=M`PmnWKPDy>;s7{?hV?kM#qeP|Ot`?HCRe$z)wU=l0mW=^)!nx$_w1Gy^ z6d88H^TVCDUaQy*RtfM8%MEi8Yg#E^4AiZzjQcmQw+bL)F- z3UCf!fq$rxU>m>`9sw%a%aE5+SkbqgmrnEDU%3gGkmC`WV&{AHU zX*OGjYyggPL+6iP8tm>qt!8WUP#??B8W+}`Q5C`6)8%y*!yW(VaYPkClOni!?HK7- z(F+Lnp1r@S;G+G5!e}{Pym^o26Eu;O>5T(CP#Z2Ot6l>1AE&Ea$a3PZJpcdz07*qo IM6N<$f-F8luK)l5 literal 1735 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 I1z)cG4^f_N?f?J) diff --git a/assets/dolphin/external/L1_Recording_128x51/frame_6.png b/assets/dolphin/external/L1_Recording_128x51/frame_6.png index 942f082b83af4a2228227f53134ca6b9ab3fb391..aecd99f1a4bd270e1e3a475d8a660d3507f4d3ee 100644 GIT binary patch delta 659 zcmV;E0&M-*4W9*&7=Hl(0001Y8$G=M00L%7L_t(|oK2EDYZOrwfWLcoq7%_|Bu&62 zUcti32R0VMPQb!We}LHA=ypEI-nH?Cm`*JO3u_-(Xd&zrLM)WTMgk^g)(5Pj+1*64 zt21+t#rnwC9XN2l1D{b9Wj#8es@fa;orShf;ay3Gc;Ta|@qer5Xjo`P2(KEBQiAFu zXnsPtp&yWh%ASG_X^lB`vHW59SjM_`^GDWyZ!cw(y&CuQ1IGjs*V#mFryPZlJuyGK= zOs}UO^?TNITbiAA^%OS;v#PqBHQCE-oR zeVVC0z-ZkIBFO?TfPI((guqPJ3V=k-3B0EDZ3W89E tzu+0qikELGfBmzOtuq|}IIjQz literal 1752 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 Eg1$RDJ^%m! literal 1766 zcmaJ?dr;GM98W>zjiASFzE~*gA<#BS(}wma4=GGkkU>S%o0=vmRA^J%AO%56cZi^< zY>vrL1gxTNBJ;s9R1gm~apLBNigPl>$4&8pIuIYoQlQR1Jab8Yzu!0C&*%HT6voAV z>gGJv82|vc=y~#Zb~Uk&(9xcKr!@6(*<}h7nZzW}DkcNhQ$RRLD=9EqgC|q*6i#NY zX{Uk#zK9PhGKBgs7ccrq(&KcgjdS$tzrQe98qCX zW!zDxl49b(2wG2p7$4>l5Cnmkginz;q7}xN88?MtbW(vJBO`;KA>`BgWC1LZNCXffKoB0Q!82rP8QjRz8hmXGa>_vH z)jCE^Ye6d`uB6i$8JBf-GzyI_Cgv@%)-aYUHfsVSt`op~NTAVJLmSaHF!9v?ZoF69 zpvcrwf_Tb6r|Su}Br0DUm`&e@4OtagZ={R#YPK$Tnw%!mHI$Z#mdm*87e1*br6Qpa z#e@{Zlb{63LnT-c4<|%Qo=Qm~Dhh*er3A6@ybljWppXy~%P}DY!*FCo5EdB~6cq$V zph6VE5TOkltu-*XmY{65)vWC?Y{Un#(g;0;Gqheo(`mLwh)bav+K@u)Kt#xgK))EA zP;0G{Io2wT1}&%b>a`RZrKdIENSdYU_qc#a5P~2uHhhtY;)ztKgiQp3@r0-thE-w` z7eNGf3{Sq3zR^x)C2SZvn>SJkMT#&bF65C)wtvK8l;u_8Djp@mRfrfuVG$a{6|gP} ztex{tC)q@7ds??|M}s}Q9WF}CPL!S<9XfxB4?A`f;ub0*hlhtb9FBB)Lj?fX-Hw)r zD~x}(?kG&`ggV zZ?!a>Dp+^htIyNqakyd6)^*jngB`m{tJik_))Hj5ZU1@BywbLW{8pgy~GJn-!3c#n`PfOFZsG;dDVN2WPI<)mIuvjZBJUsAlf zanN|yp&OWAMt#q*_<>0EM!U0fa(=R}@U4Wy4_*!I1AeH0olG8tlL@mZI92ZdmJ`Kv zQn-hUIc~joQL+1H4lQ*}Bkh{HFFeZJUgm#jC7?ut z0gqqLHKjXEc``T8f3o>vU!>QYmCK&bZ}i*a5waq6?kRIX#*qoz4i@k0T2`_l8!?1G zb&xyO79FBrnp^WkKDUZ3oX)12`pTSSi^W{i`rv>j)hYjibM)ozx~E~9i!)vRdDL}> zyre2}{i3I7mASsXiucKQ(J#;fp#JEWoi9ZlJC7S2%Xs~$HRsLoeqi1ceHKDpAfp+vmF&odp-bN8uFeRe+Y={{dnSy z5_m>^XP6`PU?N(_@pxJTRHpDf^;ya_-i6b$(yPR zMd!?e>gMK;?9mS)fsj^`v4mnAsj6nho(IRP>*nV^T$vUFh`C3;l*8Lo2mq$0V_S*d zJb4(%O~AbPPJe30A+$&e&>gqLqcAm)NH2@dxJ%nv8iwM66PUNm00CeifO;K(98i!k z-o-SvMfE-OoOS|j4|w7xOfARa?Z-Bd^x1PT>)~^yF{q94?5LOdR$7@B&bHA*Bh-9A zB@GdOP?P1hB~B_nO6&InB5SK`0Jj-B&9=-|wnt#Bjeid$A=(ZGNI~tZ^&|Us=KS)a zv4oT&`)^2DQpRT7q#gOyw)P2M4!=fv>@lE_~@7YyF~| zO9Bk%=*Dc+SU+iv<^jCeQ8eiDFWslF0eJuscw3HdB)NumRCT_{PBIn+K`6m$d&y8% q%)X}j?axJ)t?ftw^1`elzX1^XLI)v_ZQ1|;00{s|MNUMnLSTZOVK-F( literal 1732 zcmaJ?X;2eq7~V)gj%o+1jv$?`K`bcAUI`&9h%w;^5=4lAjs-Wn8(2fKAz2{UQG

    qppjAtyD%}9F{&3vc-S7L}eV^yOXV)bq z#*Xp!_XYr9j3!Q<%&!jq!93mgcXnN$h+q7;=yWcHHE;!ll?Id)tEWMYiO8apX@V-u zy+lU)@>oyC|VMZLA(i$I2o6s5_u zu-2lYvzfSMRyt)_qK;fY8Dt_$9V!1%@Ls8lw-Ex_DInXFV63sVn_rIsc^+2wkxRrIv{D8< zSsgQCjz2|;vN_IzLr_6MfusPFu+}UHQ79A;j6x_X<~78&LNiC$#b#Tei$P7>NGoIE z7}g9r83{d`$3=>GXNRLOS+v^M#Ae$_uK27$cESQ75*RX>oS_YA+qh)dK$ZPOK6 zXegPsv3XXKFNq=01?JQDZbME*-Wz9Og>G;SXmP|lxCcHiwmd%B}r1whcA=SVwpjz;1hw$#h5eE^lxJP08eX0uxhuzJJ2Pq&%;lFo zbdpQNx2JRadNlaM>*1o!{6ty#(V=Fusr=Y^Bqivg2L}fQ0s$UydN%-!YSgHeI(vK5 z_Pd+9K+ocr9fM^@dh+!S^R?!#3-qCrJB4NLOg-}I*qX;TJtsVTFmL|~_q)B@TGHw| zYbxKrAJg9w@#yIXUDK1&D%A+(~~^&LCeaf8^v&2E9MySj@)_X3;l=0wgZ*{H5qbXhkoblhsMDY!>wtuj=7fGJNlc_dAZm&8Tq zAKu!xWqu-ay?@r^AI=5ctg%e}96#97yD#%bLsilF3(BRJ{c`n}E@T>et7A&=)#D;Q z(rl=nfJ>%&h(U=WLNOc=Xk;6$9aujy!YkFV_f==>_-Zsyq9$ecJP5 zx-#S?=WS<=hhr90Y%t%LjMqXrC0#Q^0uugOj0}u*Fj)%`_i3M=>Xz?nzcO(&uz1UQ zq*PFI#5*2r%^)h>L0v;x<&xOCXDjq>^-sM*m?!T6?O)l_8_Ql*rbd1IumXF<_N;wz z0Cxui{(Tg5eXJv}Fyl-)S-83FVjWWyH`s42ChEqVtnd+#z%0-#}FCIM)tOuILk6xqmmlQewE1Kv;b@iMjtNsJ* CzKN9p diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_0.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_0.png index 71e85fe8f97f8a8de21ed4f969091bce2a428dfb..36e5de4c9153e0086230b7cb4e322bc34a8590b6 100644 GIT binary patch delta 711 zcmV;&0yzD+3)2OV7=Hl(0002`twPcO00NpxL_t(|oV}7yh*f16#(&>8-*k>~(W4?w z|7K3QPy$6<%|e|!jTD7Ak=NyNq>@Lc_1Ds_=g=iDI$9m z;{R76y-zR?I#gG#PN!eQ=((V~K@O~Zt9Exyd9~EBfLUi2bd#W2BZI-pDb~ir@5kn9 zqVd6rU7GwY*H7y;(y&9G>D`MQaCO@u&3z8;6oY5M3BES&C6Yr;%nKWXZTFt*78u@x z1$6YHUoK5Tx_^DmI|K1olLy`yZ%&bp2K$}h&8K?4Se^$QNA4|`6GdEwCoNzumP`ZW z#t&>b1YyXOovYiv(%_l;5X)F&%q>4Xn_wN7Pq31PZ@*pNYY2k_CeQWbe$!CGHRBBI z`g0;a54ImMwZ{VCz=!0Rvp6y=FvI3o(-`;|Dhn-7On(ARAgmmZw_d{y zQ0IM(XrUNUu*H0Vj)kj4zwb{+wyv)4byv81j61*F_%z4l-N$0r;Qy6>DwR^X)Rkp*HUsbmsx$*FEnJW! zB=r|MvObMR;XId`8-E%nQ2}f0oCCwpb#H<6$3Jr6rbunyY+!p6(K z{NveqY>D~V!?tio)V;hr!S=k40E3me^>lF%SU_6n|23wz&geq#Z%Hv5f!#002ovPDHLkV1h{!RLB4T delta 1458 zcmV;j1x@dLA?Iwywjt4O5(ONs(W}N5G6prKg^?wR_ z?>G+ChSn!?-$JJERq(NU0uT1$A;2HU+Y{jK5v2(d=QCsb+Z_`FXx zZlkhao!cxU0P1`S>BCPevtE(#X(6X_?2+teNl)=wv43cNvX*3OyQ#Hi?)dCtM0Qgj zb9RDe$$k|HE>Q+b4-<)<8EB=XhRR(yf)#SIYP6LA=%Vu-&$DmT5mw@fD3df-Psuu( z8!}dJgC@qKwy)L4nOa;QIbH(le5tbFc1HF`ZC3n&i8o=T_ND8sEyw}1teH>D`l}zw z9_@pWAb0yAktXgcLqzUfDVnV{dY+Pw14)Jz0BNpqw-9F+8f!L9s+o|W-$~g z|DFjM2~|rwLhIh2HLtJbKG_iq{%05C*7mhGLD~x(Y&mX6-fpyw%Rx+58e`F4oBK@WlK$C5+4eog96j56M^qhSMsw*AuxFrOjF^B)GTG-j= z?0-@0B##92a4dWjtU1~GIRjR_qyMf_uTyxE-z>Ooz9uFCBF^S=%ztLVQ zhlmouA{Vk4+8nBqu*`FL#z%Mv^D}MrVkCI?U5|zm}MoIA1bA>F1RRHR+5eXtT5m={W zeO@DIO3*_cwRu${MA!7ynqA^Wc9Ya+WhfYxsahYa#9c*%nMx^+$7?{O#2XqN?8=Uc zOx$y#hlDz5UfNklg@dehL4A=S<$nao8l*NPWvM(L@H!#;0)^j8ExcgMQhzS(en)t- zY6>6?>NY;uQ600+BE0iL?OM)=s7xd@R)vROWgvgBOenC3w7WD!2<|CuJ-c4Urgy>=?_>vgc%u%N`7L4t~8%t~6lwh?8k8mj`XmqFgx zIJ$oo70_&~aLlT5PlM}SfGZWdkq5D2XSWeSMNT2vnC+O|&Tp-?fBc5iJB5=3c>n+a M07*qoM6N<$f(cEqivR!s diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_1.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_1.png index 31ab932b965f743aa00a3b619d5c41a400959ce5..f487ffdb76b1fa818080a15b778b5f7a2f7e75e3 100644 GIT binary patch delta 707 zcmV;!0zCbq3(p0R7=Hl(0002`twPcO00NdtL_t(|oW0Rch*f16$MNs`&O37sGC0R1 z8jHGzAaqe7Ey{&)k5h|kkp^98*A#_|ATCslkaFHcNJ4N>K@cJrE()QHpqvQq!Br43 z1<@|=8TvDe#^w$a-g~|0ygwJWKn%A%%MZUF&jSwt3v10h4}X#*S#Fy-=w{BnaA81dev+5;0`f)6rAAFPw&he@=s=%xp6`#&Rph-1s>Ri z1NiLuFQ`pHxqp3Q!5U*u-Fw6Tu`ipajHBI7@G|%*&I698Env>n-jO6+h8_RDp#&Hh zKVbo$o2DR+nYWAMEwr;Aa24xB?DiS}*jq zwx)(URYTE?`-B=+zq@*g)b{E>AF&rNe(ZQ-<;y)_2K}kjwfNoEryn&xl2BFOL+d~k zCT6s}qIDhY?#*rMiLXu7WA+{(`Q-|{*eoS!Gvv}&?*_U350?!fHU-R9GBo;oa!Eri zOJRK|@_!puQ&OeA6xK&V!_bfvB&qIh%5v?!9)J%34%F?uFG*35Mx9kTpQR4qa{~}# z(;`XXILq1iV{ZSpfrSm`o&o43HiAAx*+UoLI>1PyZxz&C{ZN|fd?XvNe|w0hpY`?6 z_n*hsn4*BY;=7ang`EX<=rspS2D5TswHN4iMm*hyavjmh;jfZxnN|rvlUKHW1K1)N p&?e(SKQkx+OWcbgWgEx?Hvu3{EM|OO{M7&e002ovPDHLkV1leBOw#}W delta 1436 zcmV;N1!MZp1)>X(7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000G4NklWZ zAH((mFoIhD61ES3hXG>PJ^&sDh++Exco-mt?E~OpfEcz9fQJEo;N1w@2f#`O_=e!y zJ^)ra;TzJ=d$j?j{9Z`QHS3)jp!HrEdNZ*!0JJ-NGziY~Y%VPQ-OL5en0Kb_O9DXp zsDlFu0%@0_bALq8`amVaVf+J`EWIsE4}g|qv={CzK#Kt)izNk2ODCOMV>1NW`%yjF zfiN`y&|O&<_B_we|EmmV1x=S__oI$PK40@tcu$6|U1ktW3jhx#w|2JnJNnGB^N>a5 z4$uP8;~*w%dgW4r6hJ|{q zYrxaes5R7RKPw299s^Ow@c?Ske$)xpAj;f@J!mN>%0|l@L0V2j7C6HZ+WbfmWaMOY zt~#dow+>uZ99t&*VTk6W7R@221U?RN0No){F{jBy#`NqOnX)wdhSva^lQJmO$^h0X z8aaNgPJai8Oet+&EWHfkjTCezwPdXGdStY@ytY{S8d22xiKedQHNY(FaC7Iq|A_P* zmR|>3S)fL+1zFA?!2;ep3(gw!SZcu*3~-m@7@coM{{(?lSHVSPS$qoM<4VDL?8tZo zURg~pyHfYqf!Z*w6UcW?%fQ~nPHQ|ZYF4F&41Z+y6sW$Qt|cizGEA$6GcQK?Zi}>o zBg{i>h(Ov{h>h<%?E(rZ7$OTdx_4jETX?N0<|zg>=IGfn{S=UK`BL@JXT8Ov=^_hA zhci=W4<5PU0g$!e5j|+1eFY*nnHlq@1OUIF;5ldnG`gc0ePml1JT0JiBJM_zZk?a0d@~XXGe-{QQ27^Qn>17wtWh#%K#v5eZO_ zoMnE?J0m*N7yvPz8)aAb!^lop6Xi9wBPmg zieoqfR9GV}v!EJ{tRgfM8kP3~Led9~E983sk7DguX3;wn9;eO<1U{$N`K4gCzJKaK z^u;JsNR1b*Ah`pi0<$NB7QuG_>d)7x#>Xx}FiXyg=gQvYx|K; ztc@L6KxHtDbOc^e{m;ZD1$e3FqJPkk4l)*1>ylaKXk8Mm3IvZIyy@st1h$TNnUH!2 z*=W%@BE#jWtW}>Ebp2=G*Jt59D(^v(AMrwnol=Vx(aHM-wC9nvL9`-t)Y0!E+d2hg z(4E%brgKE*u{t4ofx@3f)~TgSOF2FEbgv-~fS%(_%7MkK@GfG;;#>7<&VN91H6Q2M z!CC3~k^=aPMbbepkXE);kpQ=xXe`b|3(Hx(lMe$#8a>E(Nk=plWUy4^_*=(TL>e~P zCnN;#Ix*7du@+HY9W$ZXW$A%X8OwMovtn&NAA~@IjkythzM2Ij9WxxWdQ+G#gS5Pj q9?3@J{S3V=9itty+WDoF@)ZwJQ;9!+*aw3E0000AZ9)UGN^HLjnmeh@MEifFC0gf}9XVaO_|8Ldw`*^ApZ@vx zpP5_WuBbQq{^0g2#d!W-a~MC?1`O=8ROA(c8=>3P>pN zZOu3L8U{t01I%2Et_~`h7#Bd#^DfccMg`2Y1Z)HHz5Zi|nsCd(0zg`27E8*sC%hGz zZae@-f6Mef@qd^mqabd)QM3WlMxm~4aC~>M#Cw1z&hCd2gR%5tx3CbPymq_WIrL7a z(O-~^;*W_Xg*b4&US^Hum~VCyU7Ur>YIrYrlmPQ&Rn>|kupH7WCC+qB#%RF@-a7*N@$NZTpgCVm`1 z4$OPy)*5KfM#c6TOf~VqegFp~c{8~hycSSN*$wkp04u$&72+`-xFU(|GZV)NWZkVb z;9*>c{!B+FleMbeEQzngsz7%Q7?YC#Ynp$%_OMwA$a`0V9RTJQ3z*g$018fz;|K?2 teef?Bwj{RRqPle*Jy`<%6c8Rx;Xi(0sYBZ|WKsYC002ovPDHLkV1m^$`r`lq delta 1035 zcmV+m1oZp31e6Gn7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000BVNklrMnA421{d`@iz|!(a$<>5cXj{gO>|bY~fQIFy2x=Xu^o$@_laqLlLUbxVJ} zl%oAe6@42=?Veq`jq)f3kS+KXZou2;yot|~H%ATr^Q;A1>3`e)zVGwCFVu5rQ3+r* z`jLY_q6T&(iktcH_z?8qQ)oy2O(GEsfHV40xj~p(jyu3joqVGUhy-xM=&$ri-%Wz0 zaMS^A?9AIla&#Gp1l5%|tAW|?WD*El08#djG_CAJlF22GIRLimi{`@Gf*)T zfOPbGb(&;Ea(^@awhywn080S7x_^cG;GE!VJJUmG8LNq5Ng#KpEmNmfGPr<=0Jy5p zUOQNk%>~E;u(JQG!CyUBhW5`0tph{`-)faIx=-r@=+l6!07m=kv+p@bI@n5h*(|>& zO(ih11tYtFS^$!=>F7O_k>nj{&B`Q;Gmr#ez5e$^(|;!Fvt|kQ2=^&~QbQm8eDpIb z!AUEa6vskO23?MXA!D5kW+RmV`cBShxoE%%z;h&N1w?5p`Y|#%0qj7wTI9CPPzgYi z`Eo}M<$e~FQht5r=-O?VIl!)?&^xlt)Z4)C1eSdo2$=%3R(UcRtU{wKtd+p9RRH2NU=`p@(}24G(53;({jEkf;xv%1 z4$xxd0&P(0yx!i6y4#s$)VG8Rz`7=&p%noo;JajS)^0Qx2uT7_6DIETbOT!fP|pHL z(e9=9@3%-Ut;ldrAZ!^Z$*MISc`^tyt6#MR<$s)jSO7@M9=QOASt6;~k3j056=r`J zqJew5M$0NWldLLM4lrvsiVIx*cLAJE9aR9mcO)Z#DFs_6gOU-|ilE-}cESrmrz(TH z>16b3+jC+yu(}>4HW&vuf#k4?6tUy%N)Si#^`FHl990i^gORqbwyObSWBR2fLrfBu&4>IJe>eYr_5tXne~KM zBKxfeVCgTI-hUw;(_|FHZnugAAZrwA6NBZejV0a#Jha7TC^49VUhEbo0+d&FbuowD z=zjDUBxm;9#FCj zza4-B&U)p-8c4>&+2R^ZHS)k_08dF>Gr1b<38-YOhIveYxn9)@@fZ(WkjC~Ii{$|F z<%KoiVY?3fk*Ml{O7?AhDKY}N={flZVFa;)^0{yH`u(ZX093`^3axSK000000NkvXXu0mjf D91{lf delta 1060 zcmV+<1l#+<1g!{=7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000BuNkllK(03DI zIdD~g8yE97lDMXUNZ_i{PBt+5n@j}RCP0+@Be|6oNiwN~n*!`E0J4EcbLp=m&4CLu z0!VlNsYR3Q$ba34zg>eYDzHU>Ro%aWJMkUkYZvnb(K1#O!-BxwleSEYT9H8oObD>c z`s}rX8M3JWn*dhwpVj!Yd1V;?2%&X=NaI^&Db#aX6+m|bM+rckuaAD;fnzS(JfA0PFn!B!4tx;?6aTu_+vP0h}5-^*;5U z72%{6Opaoq2ZKji!jNGd3}!l?t>*seZkE7WcF>%dT$`N&xGcfCeoII0jz@gQIbysX#~&h#D~Mx~ChkBmlP; zKnm?ydVjw~aA}1MeF9-=pd_l+ETpFqMp8c;3x7(VfS3SC%%)Ue2ctkza~^@TJ~Nno zF+_vi?iwv-!I>nhm?^+$+$bt=_4fjH7L}?1o<5O`08A;^IvAAfsFnovnYSan5ad-E zT)7kK)sDv_8<<^>A{&eXctFyuVudVKK_~)fgTYgIH^;b=6gMImgdhM)%Jdh4z8(++ zuz$qtET41lUjrNgtZD+(;S4Gw-2emuB-Jy|h{m@n${@~d1c*xDET^BrN-EnnFb|@0+s7j+gW)kiG*0YL z@1`0JLvHbT>#rdlfdi}XdfIUz*|6WzZ0LI9$LDHwh{cL6p^-`M6lpo#B;m~VE-ENlp>o1lrKd@HZHg{ zT6}M)nQU_pFt-5Y0JTMQ`C3Qa_>_;C_-c@Je%=CA81eTDYCr{-={oqEG}7h;04KxK z0>xly-eWzG9e)k;CYgp>E8tH*(lo&D9XyO;h2kH!pI$46y!zJNUCd!F*1fHA%F&<_ z*kU0sy2}h1ZDF!OQd_~}O1*GF(E_>cR**AWQc>X)_H!5!3`&8rfJPi(QZE`jrt9YL zBD%P~pAHnEz69zno;l%8$x@~0xz1rXYJWt92bSZu-+uvmUTz0VwUXn8u2c;$CG&S| zpD70_XD@;?U?;b(Q=Fn2U`1xr$lO^j!HkAUn{?Sy>)JvcQU^sP4zzZll_zr`z{bYI zQJGf5&C53YxBx7x_0uOn_MCmWx>?EBUms-FDJGZ#nuD4*!^Y|n9Ke4`(w5j=r^D<3 P0000A^NMi%Gu-nCi0wE`Xw`e3c z%E+eTDt`daGBCrc<|E_Q3Z~)_NXv^+Xk{RL3E&Dul3av@Y2z*cl%Bxs()8{%b(_1p zg>JX2iJJgC>mxV0-bu2ABmnBY0JnHf2Cb8iJ{fc^0p62A&ykN(21Eity4^{0GWe5F za{$dQndCEwAWsI}R{;?dnhAFSjG%P}e*zE!@PD2Rz5ulhgnBR}8WDsFCjjchA*;{4 zdKiO}T60F))A#SdE`10w)URxY49YO??-0BITMMEU_IuQC85fbWB&n%n!& z8VCWbo*LG00V!4&nO5Ixs(E5Q0ZKP}SF?lHGG~*}$%S*wC$=7PiAfDR{m`>ns zO@F^b%PRYw!QFl}>BmT2g}m$xx|aY1UW`!dn`&;kc7X3>jSF|8XT|G;pk2#=C;?J# zgX%RJPsjVR3~Wn)m2Dx|q4&PWzoq!C6hh1av^s+wujKDW^{i|8q9@??Ly>5cAu1>9 z-hGerP|B)}tu2J50CtIzP5?c*6&|G~uR}g_v(ImQ`)h4CcsdD`jDF9XMydUQ(XPij sFLAnA3D9)T6srJBZpErCMk^8g0mATZTRRf=s{jB107*qoM6N<$g4uwzr2qf` diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_13.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_13.png index 165b0635a7c309b534db8d4066155aff0180954e..41abfcc610c4c9f798f46018afb35bf2a1b77696 100644 GIT binary patch delta 598 zcmV-c0;&D}2;&5h7=Hl(0002`twPcO00JsWL_t(|oK2I@Y7EYA=F)W8Kn^(;_k2nH(3B zdz0DSkKg&ucg|seM>|0HKE-{V6`*ps;Dy5!kWUBYD?mCGfPa}ErC@*rfC(p<4*=>6 z3}68mcT)8a0IOY3sIzxO7od4@(HjU?PN1oJQRGheMN?G^JMBC&5@=WS^MIH-5KU;R zcD=W0w-gXpk_MU#`x>TuQ3BAmKDt^cq-CrVYAH`cO=3?#TXP^D2+2%+)}lrRZ5J~D zk+1U2mE=)PHh<4Wwnv86<0p3>jF?_p`?5JXTpq6XdHIR+YNH`A7`(B-gSZ?*YeuSo4%wcmPmr~m}L%m zfhF^V*toA28S~RZpl6{YRv>0+Z#Ead(>{%&mGRuza(@9P|N;HZ|5oPnU-?2Vqm6s;7P zcfulJ0wctRfJ(%K+eZdm=vhffib;VJLO(ujvFt!&eApIJSS~}qqpGb|Usco9ArUKZ zdO3l>Bu|7u-$1tU-4Ssk2NIbqg{uG@#mEv+?J}jiol||Yuex6n(=_Uk-hkV7_%Et0 kz{Hra3)G`B!Po--0Yk#WiSKou_s!G@vB4K)XH9^FB(v@82d`Yd@by%-36M z+OJe$?jzLi)wSEu9wh;)8NY*T@Nt|s;mfn}tj2#HoUk2p-+$ltecty?H4ZIQ1i)5* zX5&NXhJ{FRGya_TlI+H(U|jh(kwi=Y&g##K8;Gfey8_%a$v3KihyXXN{*F25yNR$A zxGKPnlX)9ST+_fzpsErl8(2M4i6CqOM9F_9x3VKiC6#bf0PX~2Ht=dJ^Yu()pu&s* z($#-z(j+UA8-MYSb5KPESOnPB{X3`w=NMl*nJ0)=v6>hb1af!UDotuf1r;zM0GIXE zYX=yrsQ{S(R`Orf_}I8A^nZoWIzXiHt+EuTolym{yMdzwfcDo{e{&$2U@PKPll&QF zDuIRA9Ow7Y0fC2+MTFoRMg(xAc)Vc2#sXJRB1 z$vFd{1(!&fDuZGIWMcMeKR^qOJIFLY7|ebcq5-#_&h3+QQ%6%4-npbKDsc7h0-){T zet(^UPY4Lp90{`y2A}8OGA(w<18ehkgcHCk7#vqWR4_V;%x)l@0G^m#z)8bbsS2hd zfHoL}?s*uUdOVDRXcb67fGjD~C&mUT2w(|LB@lY|(~yn;RyBc>l|U^b-9QQgNK!Ov zd%wUDP5>xxpFgkO^Nt;)WR&zNN(Dj*uzxasG_+}BWX*vKlmMPv!5NKjRWHamwiUvU zgza*A3|3M(Rt!CezWRa6>e>GJ1j1v0Xq;G~-iK;55D{Pw*0{(L=tUTWb9m%LFj!sz zq$D|Qe9jM5pu;U*L|78QOSUq|VTAE_O1FE*OAW$kQ(xjB5pGV zLlj^n^BB)6E3i}pkN}vWv;klwq{O47X3#ShM4#t+j14U2|CkHVtp1ZVff>~Lz*xfd z=m%6Hwr~mQV}M9V$?BQDK_t_V;6DOnmH$W;kiav>u~dU^rc}NgO@3#R00000NkvXX Hu0mjfWvu#M diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_14.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_14.png index 3ad1f1c2d64d6f0fb0074f9b386f73402e7221ea..93b0dfd43aeb5f397a5e1c7cce9ed0cac6bf03ed 100644 GIT binary patch delta 590 zcmV-U0Y7{{fg}r;$6i~tr+YJZ>s2f(}s`XhjN0}WUJ zW;|+L0PtuK6yoi@VgS$^jfM@lb_zX_(YW;BH$4#<+m81raL|wBTcfzWuf)+483b?L z&je7uB#*^S?$vaLsRQWS(7IR{t4v!D=5n?YaV99BFC}0a;1=487SXD?cC`Rd>bpAj zC1pCNUY>2KoqwsJN53l5o-)1q{N~T@Btl}+=tpKZCW`p{c>5r26k=n|`t>j8p(M|t zb?eEwS@tCwy>#z!6$jHoaj}*h*1OY9^bct71cgG~=;rCC0EWs!{<&UeU7}uLTrnxJ z1}9cs3DW}ZEGe2iHjgpfZ!MODOe?xoR`5dGdKQ4YPJh&;H+6K|ypE)`X8c}2-i=jB zh_KD_ cBzg<~0hkKAr@_EU=l}o!07*qoM6N<$g5NnA(EtDd delta 1144 zcmV-;1c&?E1c3>V7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000CtNkl7zxnL_ybad!}q)i|D7DXs_~y^O@G*d`Pskkd%o{0^&VE3 z2(ViHm5q;K7#1VN&G->+&o;z5fn+mWA;3fZEjlX)Y4$n^^H4l(!e6L*!HV#yQ>TV#E09bvU`YeHFg1v~> zP4Z{7$pm(m;L0jsCV(bwie1B5NzsP3>`b~S1B(FO`+xsPSe|L;vf%eR7#l;l3*h9? zvGdqDj&U*h<&bzsdahzs4+h)B02DZ#$a7Agvs$Hw>#71FJ%L`Bje!|wr!Z832h00Y z9l|%E909CSDG5j^Mc}xZaSbO>tlUOcjsQFCCjEV1^gI;@P-CrX6}z~g6HElq_&n*V zk&XuqyMH>4xd7@K_#NzcXSntQ?9N9`97TfpJbbp*XYAZu_wTwJNO1ukexB3KJNtDQ z1U}F2#>CFAuyP%h47@`q0VETnoygf&kFltGP{*-9t9$KGH5hCc1nw{gce`LuGd2Ww zH&7L61UT&m=2go{{BZBPyS5V{!U+)J2BeVIIDfPfUeOJ-b^+XAkTVVi$?m1gs)tA= zfOk%Sg7$jL)^)WrsiXoa#h}QXfb?G6oInNRd0D=X+B*F?M}fG{qJf8 zRex0A>fZ%mhCi{b>#))(lxYd`4hE@CA*w=1jd?rL32-VH#AFrQ9YmnA8%QU>NnmyV zs7daU6)Z&nYcROGK5}=UQMC*eC_#WKTc*D;HYh;=Pf#l0xoU4hIRbd)1iVVP5y*4{ zB?thGbEp0PL_fz8sDpO zSn=H`q_>3a_Vg=wNhPcioFF{hUW@(SP`3|27y0QKCFDv`10}%9P}Tr26V{$WPVM1@Ay2xCFa@xzey;+N29ge>@qPH2Gd}zqj)!$RdlTWW z&jYNWB`fFJ9Z{&?HFy)@k07wB{6}U6J+OKfPS$aphug*zHHM$5dZ{{w!w`Z10000< KMNUMnLSTYHrwQKx diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_15.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_15.png index dace07e837079e675d4e68f82217f27cf94784f2..64780d71b3fb7687f0c0a541ef009049cdcf02c6 100644 GIT binary patch delta 589 zcmV-T0txMDYPC_zJG=&iV&)tzvc87Z3`4iGtK-=*p!oqzh?N=|+^2RvAYplj9<} zcP6|1_|A8}b4~(0+y=s(4EG$a0F8s29vozVeA=(x0_3m(Fn{;G0tQF{m~p^-08nRO z01LpBL(M+`JnDOeI(w(+19XSOK@BdPKv#7*DjfJpS5-%L)_LTl&}-=DT5)w>G^MNB z_ui(LC?KvR3p5?~HOvm86rg8)bhR*?Mf881RjW3Pao7C>Bsbgn&bQ6qKRr5r%y zt9)}MMbwh@Gk=lIiJ|rQ`Hg!Mrsr3`tX~#A8czWju)E<`I7_Du*?kro6aS*xvWgz|fp!E4 b7dPQQG`+bKC)}0|00000NkvXXu0mjfc2+man22-H;m|Cc8ZDN~j~<)YBI{d9I_&a6VyBDh;iDPJ+-`~JS7*81;rkMVk~ z)%q(<7{^GBdv@(L)M6w+Hs?1;9p2CLCH%hma#ZJ+vL%a8*gN8<;(li6CMEM9DwWva%ydCY89R08#@WJ9svi@jB8RxHv`t zZS;E?O%svQjDNqkK^7Gd5nxyMZ{SW`;(V(yJ&2aEni!S@N;_?tjM|Vv1&$Cv%KGfJ zgB7x=0Gj}(iSbe|MT$LbPlu;BqGL6vil`qKa}>AJwB%sa%A5 z*Q>|E;Rs-nN^XmK=gieI)8FHa75x|)907Ki8NE5W);c}gKfb4ZZ&u71->)4TGE4-} zta;L?;eWobZ^O2+&4@zXqpoX6kPS!A1MKd5NuV{lS92NVJo|1SWC^eufs+ij>;30G z2^^nW-KVh1ACMfpgDU|fhB;wKZSpk|Vnz(@e2|jCbV(o=D`Rud_>I?A^@2=M-y@6w zx0iuc)b4f$t7kcc%0viv0(dV2)H|)uY9$0GN>j160>LhfE73mBg=AtWSoF5JA-kj5CK*5p#H(SAo z&OcR@L7dwR5S75yo_>W>QrXJDrz?P^>>Ezhv+c77!gGLVctq&!Lp2tt6hPB-=^;(@ zZo%6j5;gEb_!3}+mLyTpxXbdrmw_n(Zpjvc93n_@^ii+|cm+6}3?ewc0ijJC@?no6 zk(?mGie#q_vUr0ez{*k91TYd>Lvx}r`e26^ZcBhA`aNp`Be?Z}KDm>QgBrWnG60_g uL_$kelmw51{|JC8|B))7fpjcUD)0wH7mh1X*@w^o000042*SkS~}1EkUkF0Ea(4U;qceL4O3yM*xim2Cx8(BeZu1 zz{^#~&}bhSD}ZvdSqI?Z4V0>zb{m0Tl&ad=N%UCapdRVhz<6>g>L^uLowupy3P_YR ziMqb7VY1E~KyAC$)j}(CV0UmFY4xRCJPUmIKJ5_W&Rt zm}Wg}2HBkUjDMu38Pp~NBMdYR@B?@jB?beFZdzChe6wM9QSN4gvVyd)r{S9c)?)uc zSf+=?hS7q=R_GRa&`moW#xR453X9mt*ij?^#`;-&T9Y72z)|G4QwPsYkSNIKdjaL- z;)a0rRgV_j3%RX2MwVpoFKtdE;DGP@+uj3`x?B%T6Mxgrn-Ho2n3Be-9yk|J$vB94 zEP;*w_6%t-4RAx+jZZC>3n<3JPMff7rMnA428k?{;!Nb3}%7@lwMEKFEP>0x&!oZC>>^NDWw%5t$lw)t@Y>kC*$k2 zR_P^0jBR{t_w2RXs6{A%Y{BoG2K?F2oA|W+aMa+JvKDM-Y=3)et+dvl`XNOmfYt0r z4*nZGuy3NcnGcVPpa-AAbLQV961D(NW$Z6FdXrvrc-;8|bB*OB@_MNI(Q z+3z)IoEdqV@qa(ZAd3qe31CETtGztr>f6h zJ6Ms;1;_%>vj42XU-c_P`)7pK0V0F1wM%*XoTm$*F9WUuc)Pzo`}+jW0BZ>^o8^zB zsRU-WU}P5%3xHELefuBEOhOOzlPu0ax*4Rs|Gy378GpXR-ZH)e>_of0FB4Cw3ETNGl%_WBw`sr zae=F!3s@aJ>(~G5z|;XElEIZL{1w6l5P5^h3xDKgAkBjz*~lVPC;?C(4w=2j>tPH^ zaH(yGevS}A04Q5Zi!Zi72SNav%v?Zo*4_l10Hn)6C({==MJ@vn0zbx@5*3!4iJsU47EN~BZ1`rW3qP2X`*L^cR)_uz>DxDKnhnRQL}NE<$Es! z(`o+>$`a>_Ydf3Cupbl)VFRv;4QVdnJSLIe-)`d!@Po rLXvyJF9$%i|7aI@Uc;g-Q7-TW(5QW0iPbXI00000NkvXXu0mjfh*n!ImP+uw%jZU-f{KpNCux9xBl%^V5}EXqd3j@$rf>v!>KO@gTbN1pwjI(V!@ ziGcbP0`nVXWXcT_v%c%`l3O9SMW;wj3V)O8Gy(^FKYwg`4>0Ad9+(>4E-K(8f+>lU zbf9>tV0)c1j(MzsU2^UfszO&l&693@N@ZCx&JTu@eny@8eBZM#i^Xmw@_f@P3IQJM z0a`l}UubpWjw20M2w@Kjbowi7w+KAu+A_BNo zee~MFj%Y4G7J!ufM-Be&x+1iHg=-zaGx$=gl-Y557eG$~rUIDVUthhyfz!cK!i#44 zBVj6mku4b61)c@KDVxrILm5fvf$oXo45XVu((C_hAb*eW6DB)?dbl<8h@Bi^|A4sw zvJz3Cr34c|)J{eQP5=l&uCA~IibdYyz2!*&oMjHBlaM+Rr5##` zIl!r-5IT}#?Wd=OI3TA1mlW_i!lfNz6vj)Cklc%csQ_*|MkC0l*W>wDzvqDJ0^ufs z9H{pZB7cosDcl60od%k%Q#N$2M8I`{NNK>O6ikKFk&jnJu)I0}He7l4a*O+Z_WsPmDATME#e45GULQW{`y2}9cM zB(?oYqYR9WhyzGg$zHxQet&%5{zg2~0E!Ewet$0Dw6u%-1hW({+rnRMob&tJ-OL$r zF9dnsAhH5E4Zt`+Hlhd>N&wV{Lss9hdKiNeTxuJRfY&t87z2(RT+cKBApq%JIa0xC4NJHHm($XWv$ObwmkYQG;PlA2 z2Y-}ytmYT93M0Zb?br%H^Hy-w;LjKXk9ch>AS!{oHT@1LtCZSDIJ58ep1KOLt_->h zz?)uxQk^~q-K)q$fhB-(vUbbuL{AG%dwz8TE5bVfS0q-s`PL1r)4);yS`$F+J%$vl z&%JX4Z{Qt3dNSxKJgNvRUBFZT2&3N{G)pI#3Sbwg*9o8}JK@NYJ+P{ShSO;Ys$!O|6I(0(fNY_&K;mWpS5oh>S6@2`@IDkuzvtdJkaj}#0O}=05JAw z`x=15RZxhJ_lgxjzFt=yxOoM+$hxUL_(3irjhXt4B^Jt&eCZT-&XibkkyXgn|Jj^lYOwg?I+r3Q*F$?m3@!IasuE0hIGouojjPWlXh zDjkF-z_b2@M1R2F#~k#E2(C#wg_uYKybKoSfN#ks_Pj--;Z4{UmI}VUaAq>>Vdqgl zR-u~Xhf5tmrOa=@j(dwTWM*J71yXCZ6}F{o*@8I~6c|*v>4q!<(5Bs`z1H*?zo#Wj zf6gpC(w#*>eIy+mC?!?a6+JKsFfw;f{yQ>F5fn+3z<;0E9e7}Y%bmKK-1epks7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000BaNklyF(j429vS@Bhl_k0UBdx%i5gX+NpbOeQ-!!Hb14q_vdt6(!&I|0Qazzkco+ zkJnnYU#Vie$Ju?aj=e@LN&#dGeuEqE{yAUbhv&sngI~&Cuz!v5-oNiF-}ga1hZdCp zcD)}t_%m8yXQFtS|89HAIfnn+xyfk;qYi8C8mos&r*Yym{sKhm&r5=kbPaB~1|10V-@^(^CYq-UUF zCID&gztw1x9)HQr`1>}<;sPuIoa+7!>VtEFuWig5Ld#f93`+vJD{Yw?wUNOEOa#DH zefHYHj%+SK7J!xgXAS=DxiZ}UiqJYhWbmzKDYNVJE`UA^Tou4XFvaqZ+x^`rAJa z8TJoc7eIE<1ga&K03sUsv~xH+Z~{Q+Nu%Aj`TTee1@vJ6P5>vo1=3$zGv;SOB>>4Z zhtfz$4Y_(zWc*uJ%pBm<7zm9;$>ce23sFHH2114aZ4bA0h}oDg1b)kWw%eNkd9X zwpua|1F44q%bvDdpLm&20YujXG>P3w7_0k6bAb>6cv>_!#0&!{F7Whw z0jH^*)w=~127Ko8Yn_N0VM$H%OR_C zZoQ0QQ7P=ti+qm|LI5aJ%D-_r7(xJ+tX#md*S-Xt0JOtEV+=TQa3hBS2mwfT4v~Ui%71z%Qh(gb4Z@Sa6V}Nf;y65GmOOeSsUiPS zWR@U|P~S1^&(}QXs=X}TU@CxJptK2KB+`ITre>bgx7qa2N(9%208Q_|SrZtc)(83$ zuE%}MO2igJ0(=e-iBznf)3;S_AmtAMpxS?=3rO(HaaL|1;U}z%vuVN<;2Hn`00{s| KMNUMnLSTZFQP~6l diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_19.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_19.png index b6e3de1acd2fcd3eb3215288e06d304d9130b170..39ce8407618ade2149ef19fd6adc2a75bd57f6ea 100644 GIT binary patch delta 57 zcmZo>@}3}J%*X%)zt%ck0#ZVrE{-7;bCMGzSQjUV^e}y5U|?}zVEoxC_#LFm)78&q Iol`;+0J!ZBg^|cn)l6tUs@i>@Lh|Tb1^VH?rKiA(pMf*kKOiBOZbD1`FmRk_zV- d3I|%KHZ+B?e)o$HIY19Ec)I$ztaD0e0sxHPOo{*i diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_2.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_2.png index a76a000224fe9a1482500050448c90aced435ca6..4ec651e93604bfd9fad8203693ffd6707039641b 100644 GIT binary patch delta 707 zcmV;!0zCc83(p0R7=Hl(0002`twPcO00NdtL_t(|oV}4js8nSbhM)hRb7xLAG>1^S zS};c=0vF{@7t%SBn6!`r4={t(&-Y-oxt2|csTyqut6Eu8s-MPfR-(VmJMl!R+x>6S`|^-( z)Fykj9a;aXqQP|y2fe-p(&C`QRgN+>KOw?O9;sEdq$|C?m2{?l&T-WOTL4Kv{9KRp zmLm0*YJCe_+<$c6-Psk-l03iSJOeSf5BLV~ylqxe^W2z_AmB&X{eSB@KyKVd3-E58 z!}vb4_H1QB9BxgH;0_kh#~<+u)&p}2YmE8j#&~lVU>XCG7K-RV8I_~rA8l`0fXWd@ z4qF7w#?}}!#|!T*V~*pIuC*SLhrs;9zgRzk81PFA?|&!Mf9e8W7mmTY?=med>AX5c zQ?>1wnVC$#e|@Z>UfC$_HN5Yc^7v%eLoRp;6SQ>RQS(k)60WKMU6dQJf5azkn z2Jm57*==cuZg!+mr!QLrp*`_y!J1OV%b`6xyZ{5hme|C>-uhP9Ko)xTTC z;$kE_bc%tg>V_b@@Ol@U#%xK9GtS(8x!4IFlso{uU1{F^_XN=CWy=k9w5YUpUXtww pxq*-uT_aBbi=X;A0ndRP@Bn5=HvpuqJ~aRU002ovPDHLkV1lC8RI300 delta 1477 zcmV;$1v>iA1gy# zJ1c{m6L~HnGxsX^I<3Hivv>&b$MNw5xO<3RjgKclHE`~+dVgM}Oltf?fIp7g6W|H) zIozHAD?;mE!tDw0M1UM_Pk<)^TTL$3%}SV^q&`9b?oJ=WV!UZ& z?(^Ld0_u|ao_|4Bh85chKp7u@A%q$yMGI{$4>)<0Eb0p?cwEHmrT0;dtpu=oKJ?!C zcbFgGmj&fzZ|gingKJYpljKSADKe}g!Zrd}jSoS6?MpgWGsd?ZHPm`qM6*Kkdbmy{ z3ARQ6tAV8N`(YArIe-=3`Pl1Mc&6m_)w#{lDqw;OuYcaT(KFvW4wSF2b22UCAhP?^UVJn=$8%P6FQroTcn+`|SH8fp8lNhKEua$c@9)PHB(OTUVjT2R?jfbuk1M>>I$_fT{2 zGm9*bUYT}qcI}Gy&-GI*Iv!5~IZV%{ygnPXpr@^H081Im&5Nw1$&_^2+6Zbb=WUc6 z$nuJ=UPLb~npMfv5V7TDBLGI$Xp+b8?Brp1FQKY&8v47oBZKS>@6o;!usiU4-0z?+`D9trEGREQN zSCJq}0K8X^@wKC1f+aw6L;y+H>3Y@zZ%&XgW^@i$)p+w8^B64xKxmu$1QNh8+PF%c z@KHxSlRo3*wx;a05fNa*v#{qZJB`X0SOqDRYlM(ws!ls2z=XxiwGyoA++GEbVSjg$ zfLeQ{@mm8CAflKjBHWn-k?|FX62PPD*Q%07%SunfyYDf4-$KqJNvU1=Y!#op^nYvWoOr6q+cUw>Fd|ADK7v^`x7UY)+?B+5XM#KUUjDl$Ow&Y$_Y zbq%;joZDQ{(<||o1j5a(JmV&^FP4j35h7p`;K=A9)ColG^{WcdLb(RcV_@}A2`x8) zM6duK1vtX2CIWQ89bn7Ai~^Vhkrr|#yk#pz0*VL~fC*=Gjf^h8%0TI2!hbDXNiHEG z>qPal=w*49=?+q|q!v5(d?MV?g9OOjJpB@^5a}cVwE3E0C1Ys%Snf_Ns5(l22#{&? zSmxY`1QySh%0>y2mvizpT{2kmuY-3~5LKX(UU=?XdH|jX0LM!XvFrW4eIY~~Xf&!P zl2kNsJi2*gM9+6`$(dQJ0zR(mU`x;6`@Affxey65Ywm{YHc%=}EE}7DA$o z5u)FgCTlth3Las_6Yu~?Yo3680iGlUOP4M!T`Z*_bQ>tvQH&48{McFT6xQ|enYs6V zz5@WPr7lDU^A>=DwEO}j^;sxANE-5%vd87G7*rv0S;)`BuzyLywwR>EU=hPQ3GY0f z>FQRTN>UpgP8H?UFl*sVl6KKiw7Iq*_-$%37X0Ejtljr5_dYmY0n%m!@)`K2zX^!Z z0|QUSwiYbhUPB^eeBeDDu8Ba*HQ2}88rW-~*^NN#4(XZ^;cC(8jn* z!sM@n^X|G*FW7%&zWh~FZYvyaQZSR2?mH0mlFV> zrL>Pg44|p+DJBKlx%TS^Njb~;`brOynz*G{@##@7?7m%RAO`q1zb>b<#p%s*u0BqP z0p-bCk88$mnN#BG5#zGwOv7~;84I=*ZWDkQP&=A5FH|wx*HA>75a~+NMF0{U)o8ba zdyy*^gijVV*Svh}2&(~0$!d-{YB2ENq1qjDRN>x+m+qLOoL=OM14j$s;XgkJnR3`C RI!XWl002ovPDHLkV1nyj+)@Al delta 912 zcmV;B18@B41DXer7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0009_Nkl6n z0<{Ns@=95%CgEku0TG}z7S?c>QZcm7fbEYqku6|31#p#bF^L<;jw0?|O4dpCsQ{c& z(!W3GoggKlw=2OP0Y(n7u*9qIx}VT`pa1Frt%0>8LVwz5qx!}z_-_iRJ9nuuYx5R^ zTOOy{marXCNJQtYxquh}ZZvKSt16(T0Jlb*HHZ?Rclb_y07I7ko>d#%q_n64EQdp} zXjdU8b^gA+_HVal`!k470niHI=(^P^WwtrBy+_;m+RyKyk^`KOV0C|6RqP34&G;5z z`ee|_oPP|-H?&}>FXrk1J+L2}sQ2A`Uaf>l`Qo2ga62+~`*Zi9Lb zz_FpTCVyCk(cbPR3Drtq#aFhEaeg~ZylUe&R25)nH!tM65n(Ju*%!3?r$T^H!RBPS z*GB!r9@KMy7OO9ejea+Byf@j`Brf`JC>D@)J%1!WSULUFsM7BYv`A})04a@0uv!Mr zK1z8Cjpe5X2}B97oAhDw11g8L$KN6!Co`1;qy&?H$h{Q(uyO{H6Ji9|8JzU#;}s&; z6U-?<#V%nuqNjDdwQ~|w5FxNZMz`7G90*H+O9-U7wB3kG@f5%bxB`p(A4f(r2G|3T7=Hl(0002`twPcO00Ey#L_t(|oNbfAYTG~%hChwf#)X3A-U_AN zyg{Ko5(F;GqR&qY+VnJbo)FqQFEL>v zt)z9Q$l9ludK|;SxG}^4&7g`^&&vy4)=fhg@Y=J#ietDB{^8D=cm}XrzxW<2^1OWJ zlE{$BYAGEWLw^jY*h1oiAqIRd+*4f`@b!*0&{30AI52>#zj|D>vzI`hA3DeFGy<4Bp^*C=Q1l^WjqD;>gjqSB3|{iXvuPNc&|3bz;|e@4G8XE`J{;6uS6g*TpF(_wJHK~9@6B>p~9 z07>x?9N5#a%t993_`RP(1_mzt119|#RG~xu10mX=(c54Ty8r+H07*qoM6N<$f&mcM A0RR91 delta 884 zcmV-)1B?9F1OEn)7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0009qNkl=R zB3f{spclYSWMqI|09n{Yc+>*eg@jB{3m_Xi2#{6)I|LsAw0{CX0lN?>1;8G3Bv1+f z4a|b16999t5kV&aRImz@N&u`uMh2At(7`BB8UZi{mjN^aU;&#@DFnb4R3=aefDKH7 zg%d{_?}0Yqfa8(kn(0PTUy zcPNvC6aln^x5Rshpe4NBN?y(FO)e0664-zE8EjADM}H@bNCadf%mHRWZ!@kZ$x<3> zt$#9DOa7Z&0A>+*I>C%|DItAH`7-|+Ap*Dyyp$M?2%eJv78eLv13b;bzD!8pfe>JH zgqMI7S#{R=hz#A`1;R=|TidS|X;<$UAxaFp!o38{wtl0sVCmG!&Y%^@yo^dO0sX4| zDi|X%X@ADGIK}Qag&`e5mcy7UH_$8uSM>kw+%=>s0eujpZCsWQo0SDE`E0FY(GWYp z$O`Z5`tEsa>-Q7)u;3&=qMJC{1s<0GsWAGc&e898kYu6f-9kh+akKy)F9Q1`TuX|YUg7n+K zKA0MkXTN*i0FD;2%;yB@0w`rnp!Cq@N0hVKtVW17u`B;=UVcE)skWpu}$fS^Nv0ppffJ&P&n&0000< KMNUMnLSTa8cYE;w diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_22.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_22.png index 657788f2b0ca93da8d4d7e875b6899cfa0ef0267..5b8635a5159eab7a45b43ee210c26bbdae04efa9 100644 GIT binary patch delta 430 zcmV;f0a5LYfKO8|O z*?~()m~{xc1Q#F}H!w>Om(n6Q{^=5Weg?nBf)SFQiFN&W=}sl4Afz~)dR6Zx1ps`I zdYgHUBO@J>hNa=tmt)B%=odJhwh72qjV1y4s!=7NST%|SRDY{Ro`B|m<4ZFOM6v#H z48*`e_lnaJN94)8M$e{o6Yzx7PSZIm3&aCt>{m`&*dlL--mUdwEqb$~($py9A=aJ3 z$*B0{e$H!L5XL|}%;Gp2@2S(zrMT6{E(t{Os{GoGfdEeNQ5wNm<28(bh_~mQbZiu# zs_vwAG%_guet%AktyJ8rlXjz#gI+H4_}ymHH!r1a(4(}Uj2F)=C<7IopDk)^16Cam zG^j2X#zRk>0+HgojSi+ivY33`C*o|Nk<5ibNyWV2te<*z;1U>dA#!9te<}oKh-@T&4KlLeAOse3tr& zz5qsf17|6E08TO^Li7Mc=@js&0XW5kNKpe2trGyG1>l6nM}H7404QPykrDv*Mn@7Q z0BB+ck`4go#zqt!0H|UGlL`RVMn)DD0O(=_lm-CC#$^x<04!nyl>z{^MrG1(^aXfn zw25OUWTh0EO(XCCXpE^%7#-*N+uPD6C-5y{D~4#y+zA3h3P2~os(~8wo_~8wB2Wwh zXQeg2Rw+f@mwz+B0}Ft(@phX3z7B>cUll9>NYX%no&t~npj7`2f&>6jr=|cL0N?8O z6&wJk3Kdc)0CqOgOk7JN{lq5%C;+7D#lOU)oU@y$h$#RAz^co$%??0+gb<`c;+vyqIl5`6-^O==D7 zMgzQ-(bndpz!jPRJC|;2J&%XdB)C!Z3Gh^Q{gcH^gzF3gVE4^GeK|s-GKoF`QqoQ0 zL{9)k0~<01u)1lCXZcUHy$3Tr*vudM9!ro@jNb@6S2i*a%Z0J@MYvu@U5Oo5~ z=#$|qTYtZ;2AfeS;0l08^^MH=Cc=LmlK^!E%~TSi@ewKD27pI{zu)SKx(+5ClK{1t zP4-R!7XYjb84coYUE!1Hh?&5*Jl6OvtJD)xa{v(kHxHyOS<#|Rfauq^t@~=P`!WT< zy6>O;{cfRc?9_-h0T6UT3YY<4S^Zw|cuJLj5`R?!%q;d;o-0Du*I)tw;>f?&%ooFE z?}2?hK$8HHMIPyf(B5%SWLZ$#0q|P!tIyXnT)N#`@@QFCK646CtOZDS`Si??EEA*2 z3bL&LL=2i*U4!&nf08eXo+kJ)z$fZQv#R7v;d<= zy@rIW|18+e+qOf03s4A5uxueS>&JE{sqUAG$=cTc0B4q#7*01cl! znCt#SQuoRnDQIVNV&!voD!urO3c?+QM zW_N0Hu>7wW%%nAoo?MUDt!3vy!9959~3nEhX{R2xdH$H002ovPDHLk FV1mrdz%T#+ delta 792 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 VZhby@6+Zv~002ovPDHLkV1iHo#i0NI delta 843 zcmV-R1GN0P1J(wR7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0009BNkl_Yrzk1D2DXHB{iy!L- zoS-RwR9qWCn}~*UYk-JiSm4qCulRhpG=L@1%;(Mk(FCx@m45+V@%eFM03`8|+H#5; z1H8!K!T^yX4h?t%po)*$E-LT_c##F#08ye08CU~&5Z^-^XTTcZMF&U&M2IXeqz7z6 z$cgx~4I5I%^1M;xW8Hv~U4gOyv-3-#-YoM6lmV!$3ZE&Dqn;ZTm=Zt{f>XSd65Dk= z0?`Sy5ZskD8w3CsH>753ou~i6m_6*xSm0>Qu1SVvOa)k~h>0 zAo+rKu6?WEHK9rX3ZBfRVgT;NmR^nK=mXr=ITSAe5`WP!>ZnofckAq5iOUkuTf!ZQ zpR+@qCF*lHR~bDZngJwULM{HzW{~ECWctRE~`tWeK>o6o?o=s_sjWP2j1` zoVe@*^q`IcUIYvv?fPECmi3%!gqueLterruls6jzNPikO14s?|cF&;>6+Lv=Bw*TlAdl8j1|;OdwaZ^g4ow(P+Vz0ir~Y zwh0j58`%IF4`KbuHu~%xC*e!L$$f4x0m%TKqJJM1v}ap3fK|hLJ9)J39X$)cmVgnO z!bCU0k^!`$pOXGpgh5NU8Kibi4S>{GF6t@b-j3mNCNgRk7#cuR{4)AiJ_323y)4jM zCeEgaEOv{KtARBwQR{Vv*0%!n-#AAoC`RjM057S3@3^xs6`QSTI zQABP8?L~Td?8*}H==;M+K$L)4YF$aab*FCh|DAS82#-(({uux@`l&-iF02KT<`>;q V2rQ9E-n#$*002ovPDHLkV1j}sc-{a2 diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_26.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_26.png index 83bc94316b1b2d3c125a8f82485caceb46a6bf99..75eae29c7c6ecbf38df290a8c2f3dd2fa5d3131b 100644 GIT binary patch delta 413 zcmV;O0b>5O2CD;*7=Hl(0002`twPcO00DAIL_t(|oOP2uZre~0gg-7HASOVd*V%9( z^A;|{qxb?jgLtRZ26TWF0bIBgQv`7*CKeDOraUS9{z%xbS`KGt=k1UHP)phYfC1o0 z$5PdnK(l1{CD3LtYs?tk5|*T~U{uAVw>4}DxWc|IjJ~7ci+@)ZozEEE5-3jvpj=|9 zDq3s_gwrR$L6rtMpy90VW!tr$^c0hN)j0C86m5CTqYdboDS&h>Z8a1c?aWw($Tv2y z@Z=-lc$s&tG)dZr=nNVrAnx9Qr(!Ipw7_sGopMt5&u5^6%5REKQTlz54w?d^fsz(9RhCI@HE*_emMvVze9KXx`Gpi9f>!);;b zZ;O^5Xh)xrO49n_+iDxKwAZ=QG~0*gGHW18i)8G5}NcGsRj1#sE)AC>sz4 z*y8&EVStSv?gn74e&*OSt_FBQ0@-mhz!o0^_bGrKb|Zgz+*C4Yt=qNPh0?;@08&C^ z;ajiQd;BWIV1M|<5Q*f^3aMoT)-R4w^#Bs$rIbQSiB>Ra%nUGFanhB$P4I(>0no(X zyiqrRl=vD*jsmRar0D@z6O4|k0g$UdvwAO}W&p{GWvPCaIFG0pK=OItf|W-B_#S|< zs+bTr09*A-!)91f14w`P-s{~NhuK(Kh#A1!`K{t^6MuZ-@;bOik3gehUac(VM$p^H z)`%FuD{1HM{VooxIGLU*rVU^z{#AvpR z$D#EsT#FfNL$mb!&oT`Rj{u(YzU294S0 zCJfU6{C~TE5;G0l-eL5n%K#P$YrRK44!y$AX*Pg&wOk23V}j%7S#bq0(_{dI52wG z4*HJ0F{B-c9w0OOoxc#axV>B&z^eLthF|Fo8-LbDK^;;582~lV5Zc}mAjgl$hXGbh z9>aRQCT=}I9?p-+KmTnh%&I2%GXPrkAAiW9SDca0Vlfh+kH z0FM4?K>}nUAXcO?$YS8fDv+ejf2Jk|_K@Z9?P5g|gER&Nb$>Pr+5#T{10aCC>lG$+ z`!l+Yfr~*h*tZ~M>qZLr+>MNL<;tZ&;pJIC(JNF-KT>f}81`{!8R21JS7RQ01E&B07*qoM6N<$f~mf(>i_@% delta 780 zcmV+n1M~c#1D6Jn7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0008XNkl&2gZD_4BE^?AGrM3Q-M4K!HbRcWHtc=hP48#L z%R7J(ti@j$IsB1G^41O78Eq?7!dYfzRDm~Q29SJR zV}vzsh_`^qMn6Oh;FbMX#tCCxGi?B`($_0)n4ry+0e>u)chj-y@9sVFb2J8mjN^de z)j*Gj%|*M4fl&}^p!WlmR`5bpS%$g*DG_?IxmNOf%6ERuNcXWixAy}`W?-)YX5uKF zpSqIRA8@k*Se9R@Y>h6YP4^f;v*GeR4 ziz+fhLcO-lE>O?%i)s>Ys0V=z8HUb_y%9(LZ+}2kgEwXsAeH}fF>Dd>KSZ6f;N=K6v`^ zk&ghNM8pGtPTt9<$)Si(2W4Jib07zovxrEQRH$TWod@ZxuYU%L9LgMQ4lYT4*Qo*! z0O^lL<$KXNm>h~et%33;Z3H+RuSG<9_$u`fo<+_((7+#p17vr0K?;`T_GZ>jOM_$dxJ@h0@ztyALE-N0aP)kMy%fhNyFaZDe zVhBfzPiBy@9DS_Y3ITZj;rm~j&(jV9K*jNF5NdgFgDQ%e+y1Vi7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0009SNklsJl?!n(F$QwdusN;Mrs>5r8x7uLQ$vBY!g=fI&6@wZ0F%9vaR^Cds8> z4#@z}LFK6PLw67)U62F{>l?kPNtZ3A!(I92=O@X7r=Q>EFQ+HXK4V5tsVwQQi!>?M}ef7E&-MY3o1Hx z32Dz6_Rq0A9u!Pe0-@Xq4>=$*+pphkOQR-+LjzdtC|A4giZ&y$cM4V>_{jkxb#Nv0 zELyBY_FC;*@y`I<;#)UUf0zXNdfMtb>wWI|8h^lB!#Qb<@U(Gwl@hztoMBs{-k{Cv zl=$8U&U^c3sDDS$DJbiEHt)*=L%ce93fIPctix~#hcA?$d>UkQIws)qar{l zzvbTk_oKhHqW5O$0I<$j%t-xA zIPW>a_xC46+#HF(@ME zM3Urt#b#{!?9WYLp4{3j!$s_thDV`?9kG!&3jw65#=Ea1wTjxnVj7yJ;%Vr~UB9Td zgOM^56~HRmf%C`7&W)yS9JU%(xtR1#?L2dSH&8gZUX*Klc>o6UrGfTqSxWaI3l81_ zQ*V!a50aV%UVlAsqa9wiJ;Ab=jOOo(F!)qI{Y&08+~1Zb+wE&d-m1`)?av$d4aX9Y}N`ZCx#OP<6Y&{@1>i19}OZc;oGac0VOqH?tJcwYFZ{~soDFw1wSM$Rd3fpF~q-p z*Me2$%QgkL1Y4fn>%hqxFqw7-gpv}bhdua60kfj-F*^7zp>rR`GURtVqR}LSH|@lK X9C@Xw!FkJx00000NkvXXu0mjf61n7m delta 944 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 SGO+&u0000ly|3Hoqq?C7?>EOF~~ekKNv%5 zXZSJDQ4Dkx0}YI#mTETingWl;KSe~E9vEpnpy4TlB53*y8%904YlcC|e+xRUR22p@ z@;k^i{?QzYh;_zdb6Er>qt(V0Bq*xpF87W6SGMq9N%+RZ2Zm2F^Fd1aj}Msx8LVVf zb*t9oaBe5HGk*#wZ|L`>6-eO^rvaweo;m(S56A%T+&KxA6B#2)Z{wLkYk1l6CHA$T)?)%Iz@le3H75PE@Z_!C*zdqSufC3gwzzyy00000NkvXXu0mjf{|LiO delta 860 zcmV-i1Ec)I1Lp>i7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0009SNkl}YFqt`QJBrngEk=ouw%n}!F>QAe}68n0|5E+aT@^0x4~rq zAm0vm0f2m4Tm=B~?Qs);DDtD6Clwa~*sW0`u{;2fzm}x|fc*6=3jpN%U`YTV-w*$+ z4g~2wnHqpnI%PQ(LSj!&6V?RYB1`EMx!mnnvdj8F^$KuZmsn)0Vt5ZibW{US${!V1 zRuP0?9%`ciO@H|*{jC7Ilv|Ie1b`!-BQxjxyFEfMhviejJy7;-7!JU!tH1Smr~>+! zO$6O=uI!fZNJGU449x>@ul^DFt$kOI5O%0YCVhZf)LX-qp}POIzzAU+lUo2)K4%yS z@j8eDAi4V9{-1_^_4X<8M;Th|5GYawnEgd1_j#`Ta+@8*Y4I8W3;EI+ zLg~371pj%w1$dSZbm#`a(-l()*b&%y;@`v-;oMx;vT-a_it z%6PO~1%F_5BfN>HED-5EqbT>ix54v-A^;w~yw*9qJ*aBQZiPbQSl;=hqL2!yWyH`Le9 z>+MSMCsvbf0+14K0;#^@seOdq*dhR>yk04PDu3~<387P_pv~V5noaA+Da!wE{jHQ< zhbgjL3PS<#cE79z_GpFV1lcXNxCKagnke!X?pcTf;I)Ay=hf>&oG>bIT>)CX^&TVT zyB-bHKTorB2t)y}xL=m5gSis8!@-ok19VD%K(zw&CRsGzA(VuGxEO;)fISM} zTvh$O4%XBD+OLAu$EE!4fP|@Tv*VJpv8H| z?UXk5b{o*b&Moc_*l8zL7Q#+vd!2SR{s22|#B^Ti4-hsB!U_uJR5ZAgd=_42CWBMH zdER&4?_&Z0GZCo(Km$HY$xx9^2VW#)sgS2ak$(y%75-a8>OiRYqb3
    ?!4$7OGN&iAm=dj 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 Vm>|QaX0`wT002ovPDHLkV1nc~ewqLP diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_22.png b/assets/dolphin/external/L1_Senpai_128x64/frame_22.png index dd241d24ae578441ddb0870387494b574909677c..21a72199409a69e86d234aff25f7871eb64f5a2c 100644 GIT binary patch delta 553 zcmV+^0@nS`2(|=}7=Hl(0002`twPcO00I3;L_t(|oUN0wZWB=uMbECS7zu=_XzedR zk!VsN*?&NVsE|@prldh@e?dOM`3$OL5fbSzqM|^`S|B9_ir0kTb$0y@#V(1HnpYm( zJ9lQDCX(AP=Klllf~&jWYy$*JAhtjStXSohXT;4`rT6V zw;6lrk%pe9THQ~XVMsL6i3W(kwW1+WN9=;7g}PErqm-Cx)dfBQJuJ$hAL;QfRjUG+FiL z^_Ndoto$=yE^DGmj9ec?ABQm&tL^klgQ67Y&e!wWVjW9(v3GMZZSqH*myhpVgBa+% rN;ef*KO(x=;+CTIkWG+6u>t-9nIF-V*J9s900000NkvXXu0mjfU=s$M delta 1093 zcmV-L1iJgS1kMPM7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000C4Nkl-TmB;NUUqxyH1B)8AVfAY!<;+;zC? zwBx01-<`#ueb%=101=X^7OTXkvw!57lDwd6fR&w1^nWt`NZUUPYT>@M43=I$f_ntm zErGK(UhBLg{XG93H!@JF29P{xl;|P8hKKl)*K!V}y1M|aPHT$p5&k2HUlVrb{=s|+ zh!o*;fS&;H9RPkI;YbS3OvwrxjVI%@X4WHi8N9(Yu$LOp#xeoSB zm?Gv9H8^IJgm0_u@X&SeDxxnhl)NxS`;rErFTTe36b;}}1q2XVa7x~8ZWb?n4n=FM zK7Sct#jKB-PxPp@yCnRq8CoZJ+GF-g0$1F51MDSw4ehe5Q7p#p4Pedf*ByjUNUnEh zFL%uJ`S*X@9FhRU7Jjyk(uvdBF|6L&s$A$$b`T!m|HN%odpU{kiZ-cL1kILRwTNz} zQF_aUM}n+kfZ0$unm~s36qvj z(bBEFjB8{m=vKHGSJ_CB>=ZQUjfcnpR5&R+&t?lOud7=oVCMic!qN9~u9iohDLI_E zJ2cAHm@Ww6zN6Yxv;@f4rTj{@6vB`Ac0Mfs ze1LpiDn)?&XGeTHh76!R1AB?u5q=$RpAh18`EmG+`)33lv3>af1f^M}*5Q2S00000 LNkvXXu0mjfHuMjp diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_23.png b/assets/dolphin/external/L1_Senpai_128x64/frame_23.png index 944bdc74e99bc530de3bbf37368532a2dedaa377..fd5d53b27d1748b4b73f8edaac4c478213cb13ac 100644 GIT binary patch delta 732 zcmV<20weu_4Cn=r7=Hl(0002`twPcO00OT`L_t(|oV}4hh#X}A#eehd=#F@>izXy# zvKuUekRoD0aL2+j5D62apt-`%#zx|wa66+sfhwxhoU{9(Qvh81Nt`Sjx>L zhgrSI?JO&IGnsF`XK@h~tbOJ0{dmpu#J^+sUqJF8fjU_MpnpyhFM=i9Bhg*Pk6I3z zH9rLKBD^TL-v4{y65dkF{S@0);{$LyHpv%fL+nj^Xgr;GOK>#Yzs`+m2l%Goo!69U zub$}6P|7}w%yX~5)unJygwTB=GD&*W=SmBueYo+*X>aM}&FO`zz0>oGF1PmA%(E*; zF17;`I{^Q;U4QdqeyXqz8Ui?e;)Gf5XWa~V2v9ygHWx4azIF;P_3?>=-H7PwP^vW; ztCk+DN9NV}3BY`SgYv7yyzVqz^X6EK1|1aqUG-8}-zf9G-G=Rg6J>92&~i&i1cpR@$QNvZ9tqoAxm1t>Fg+T+uyM{7^j_p`a*@d~P?jm(x4%d; zv&Bp)qnyD(vklgqVH=23Siy$^X&}kf(g(ATq;<3^N!3*DV0KIzqM0O(YgLo|C*@@L z8Q`3cWA6yUumvYoKKAG7#bjp+R8 zwE#Gd<3K3|Gp;ii;hjquS@O9=g}PJtBTv=3e+6V2so4WmjP6gY!Ez5UVxr#D-)2lY z((ctf!g3GLd)8wxbF%zd#fZ+Ud8#^hX-&3!fSHy?X&lFK`^?_|ODT7s-H?>o| zG*JeP5?rj&|A*Hv4Te})oh$EEG0xUK2YYXH!*_}2bsZPV)~O@C zQ?ngh>42?hUo)we+tqjwD`p2?US;+unswZs!Eo9w4?yp)nms?u1C09bim*9Nz^9nA zVNrsX*HFg*wNo8f8-UP$^mnNbXI`361m0jULf0A#SlW(cP}}fpI1A`8pmFOnglmO{ z-imaN!+#oNjxryPk$goDAQ99oj>hs=!|DaH6mvydSns8PkY-uE>lNtd?fiRhpLvD= zuSa(Wtn<}u1KKg~g1`t9JG*MC#i-R^(42ND%vH&Z9Z$coeMUJI|7 zZ4GtreT98^HL_)Mmj?N*ov;VMfQWB2xi0{96=whVTLWJ_}GV@rf_t0|DU!;}=Y{V`Q~o9ZT#M ze!bp~gL@#vfApFGFiW%b!bw)(SjTM9mVbD8gurr!@LR?fvSd2Gw`1#N2CWO_E_Y{b zU;EOGX4{H-NDW`dakv!VpHj+)wy`zOtr$(7FVM(psABXMB*P1M>l?EoeGW>;Tn7N~ z5iQ_o`dfmi*^8J3Nx33{u!i1<*0t4m)KQC`HCo4)1g#N1xBgK;I3pJ5y~ee|@_$=2 zuG(BV6W%wDdi{2v_xI@Ze$yC;mzUP~6n9&|F8Ar7J5%^pFVGX%NSN6kz&dC5aqv!P zCMmVCEVgGWXq{Jhl*wxp)_&J#624dPUTB0jI;_&BeNlLXuPOwsLdG%kXt6y?A=Mh_ zn62j)Ps7Kv!Yll{I>5@vS3*Y0Gk?pQRVC1*v^+iaSig1K@TBE89*^VeG;n1ZHWQYr z;YwaK!tYuCtkjT?dkX@ii?pi*`v}6%p8G1{10)Uf65UyQAE7nrOr?;ptnDrm08)N{^}+}6`+o#k1_Yi@@VwoO?amsHw1UbkC4bP2qfP@K zRq&pmGb;S(cFDhUzE%kzFl+(9V+nr;PZ@OvT33*sX9eV@Qt)W7%HU3{NRvjiBf_V` z<={e}A^c$$&>AetPz0-M3Oyd8!lzdXF8t^gV?GP$4YnGZO4~|g7=YID>(#3WUd0*y zZQ!a38n<@37(1Xb0L?*>=5%){Gsrk2kmzuP{y#tlW0`yV46l{tj-_$92jJ~iY{B0Y zV8y=M5`2_iW_3@~rbn+OaA^##1XjUovlGb+eEZu#EkVk(#qwqdJ`=MIfO`c=38X@i h)w@v{ar#tdzW}KjZUEql3|;^L002ovPDHLkV1iA0=V1T< diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_24.png b/assets/dolphin/external/L1_Senpai_128x64/frame_24.png index 3f445593af79067b2b2ab416f92953a1ed9c4cd5..7e7d008bc37d7858ab33022b896ee555e6ebb1d7 100644 GIT binary patch delta 692 zcmV;l0!#gd3%~`C7=Hl(0002`twPcO00M_eL_t(|oV}4hh#X}YhoA4gJ+lPiMkSzv z?tm5nn-q3IZXhByHp0e2ga~#vf=HT}9YMj$2zDZ*4cVXzA_Q`>6Hc%Y+*oW7)Xcyg zt{BJ;hI3}~&G-E*_O1|n-}2#w-#;h*ea8O*df+Fp5#Ypg#eX3fU-|i@!JC)IfD?WK zk44x&=O=)qra2#^IFb&ALnnT@#fj6K_3?)|{Fo}}Pahje2k#A?csp~ihRrHT;D-tn zC8-&ylyop38h(8DdJa^;=6uNZ_mZ@nhLNN&AKC}+?u=oQtTWs`iyBGosE*p(Q=Ff* zYxlpZIhL02Gk(+HJ?tuD*GltIdsXrDo)3K`*Er_r~*lUBpS#O_FPT zdFP&_2l8Ga#(NEt)aZelAg|H+rCk8}0FI6#Vs90+umLV_;U#R4(f=5LtUhX8e*rCN z1r-MPk8%K)1K8Io(Pai~0fxO&(UJlzGoWukO>(qb{ePb+d*#rMx6ay9^IRbx} z0iF953KHl(bp}*Ck%t^t&^zS}l(UgG@Du7P33 z;Ljy@_rJK`Iv0QH}EmS>y@fpS0 zY7OE*TS2A5BCf;jR;&7VfX*2}xX6+nfJfKy_Y1D8B5k9Ck)+QQw^x$x`oCpB*db;= z0uOhq+%h_g6uuLH aQuqgzRi~Oo{U2Qb0000|2BQ49(rii$~~;SVjXOL4A`@oPl{%fv4Jr^#*pk$N-1#T zW${=oz>T%I4dBIb8^DX>Hh>q$Z2&Kh+W=l1AqH?9$I@%>?|%%wBdlH*>UwzB0gmH< zQi}M>(c$Py=SKnap$vhOLAzewSN8~@6#_3DzP9%z^GAyu^}fncWolm>>KJ^@Gy?Ys zz`^SI()rqPGpL4;xrEzB0O_7<_52Er@}+w-^$grN?D5`^tj|^vAi~=$G^KgMOccq= zEqdUdF+BoMNq>;XRgyflkSeBU6x_I#%EwV>lnbRsfYshW!J0E@>8^s8=TAidY>oB( z=!)lY<9c&eVi)BDJf9K(=5m7r07@l1f;JIbf!RHunzNJgF}xzc*?Msg5@uH6JQkys zv6Y=0L(RDgM(fJ0yE+Hh!6RB@)ySint9@23N_t1pc7Gezcz&I8lv0ZJ_$2k{sDzA? z3xHQ9H-?&Hm6ytqqMp4qg5DU?VBX}?SN)2@h4@|q3X`lVQ7ceSZcnaO)gI`yI)ChJ>rq7kkM@Jy)^9*?` zJUOq+P`;JN5(D5AoKZpZhS%vJ8z%r=wgjN}mw#DkER`#9O6F!GGJn#@AYHSwPQa5Z zGRnOYT%jQ4Q9X78xY9CpkD}q( zt!qQGg)a3x)V9?|0dXP70n3#S@LWP}KYx#agjdv7FoL=psK777oK&=@2?;Ex42_}n zjB_}|}@TG|WPZ9l}I7PUQ1%o==8agy-w)v9+n1$-v&$LJ|&G*7!07JnWb zt<){Rx`*O3Yjz}UO7fR(vt?K~RM<=^ZtfQ?vUP2g8{4b}o6+ZkMegMt?h#_GD8^+3&}p8hC_YD-EsJdq)Y1p4I^@UkF(S zud{MX%X;M6*>9xAR*LQmA*qN+u)O>7y8$PIQX|;P06e{%qPtS@o?DA%uV?E3J7lmQ zk`l*7pAGfd>!S5u7oGsHBoFLm$Pvdj3C&&hcTV}E`@O_)MDI+uIAWo_!g$_@hZpT= zcs80OcvPm|O&O|{ioIN`e2ON=_iD-?!KxdsIdtNI6eEwWSx+gNo?IgbdinZ-hbyqWfu%)HKg=eU??=s)1yT<+oA!{wf1#G_^TKY*YYIe&mdbAYaZnFm%jW&x<* z0<#Lhi6A;)9Q%TJsS((FXP@yz*9QRQRf1mlaHY0c*Z}K^S*7*Byn1?W8Q{B&VEs;K ziRu@M5I9}LW|fGaTwKrw27k1ffAf}ik11i1rVo_NKx)2o=N%d^hI=O+Q+xj6jY5%W8>2x;$PIb-IKJLk<3AdUT-cnv{ z>Km04)qfTT#|e&rbGwJ)`xami%Mjd(nQB`t@G@32vi667@?s0$7y5%8Xtuj--D*9jtO!1dV`RznCHb z9&98MNZ+drB7ZsClV6OsIRjR^4@Us65KW2polc^6?e&o+jzRMUFIIJa0~ZO}ee0qP z=K$8#S7A)6Os<_JIso{R%-Ns>pucJU;y!nCfHqJs0!aJsC&NDe@C2j?aTZq5!-C^D zzC=3Bf3yw0zqc#A6d7}SCEvw!42+6LeMd={WFs3)8%WXZ@^ zffQC(&j$cx614AJ8`^ibBzo=2k%3dFm!wJH$gv_}qQF~XHhO-O?wjfWO*j@nS4$5T z=W^tb2&Ro?UAeOfhPTBmB2b%Xk(*w-5r8we#Zi{uN5gB61ePPB#po5ppt?!9Q`NZA zm5l&RL4Pi3pu)Mqq~EhZPZ-ikWEEJ58G%G@%V};q7PDHVBe|rN%Uif@E;_Cz%Q|mO zSFio{)snAjK2rJIs>y`aAtU(>&M7={Fm^7)YetIT?9ASh)0_p5^Rgo43m&|uSQcg( zTrwmj{Mm#Yf#!VeIF50bZw1pTBn^`om3#jPq<<(NhWadOvIa+0M$6 zhv&C*6JBXw%!D*oOBuUi#^RvITzo%Ee#6bfphts5h*fMcqgeEr1FSUhN@%6i6$?te zVq6q=nFMMWJ@Kqajwo&j5QqYQa@2_<63Ol*3VMi|5dnSzzUfRMH zHS|nqm00|Hb~$**H;jURg-0)j^tMoB1%HhiUK`h1hR=M{3O_8nc`e+CAED6|r2t}K zyXQcBt%T>9euMVJl6x7X_X=2V%o{mC{yB6ev;@bS0O84LPLSkDS-90k)(8@r8|}}* zdW@XpjVozo>+SCEKgwe_hlg;qv@o-7P%w9(aXePJVdtba>? z$KXr?U~nO>%0QeGW;ovpD~Y0GZQEu$2F^G_VFO0Sv-D40K?8|buN{E>A8kg6KqKLD z6+N7-SCW8^8A<%Svbi=5o-w(E*Lz&-5&$zSE9_9&7+M17HBM%z)RM!|8ouY`A_4ce z$iRAb3DBFI7bDJ$62cNHEvrA0i+^}(0#O@}^e^86tgFzHrH_Vbi3k~qpY)prmSnFw z_c9S+bOmUAEqkAKj`!@Jt-V+jNi?`u4$WIKav=-SBY?;8BijHcNBZuOH)FMVka?`^ zA(a5L&aVxb32Buqk0WW@s^k?TjR2NCaitXoFs@hS%FJ5%RvB&raGAK~{D0LP4=`6R zuT#0xgQuq9X>TTgH*vbRRZsg@W2C0Q_0v#N3SQ0m(FZUVXlH&d3V8E_3aA9|hWE_s zTNWy-mtH+M`^?ymq%qV|@QCwA738o=6lv(KbX;eU^rl59OP@-lo&p-Y2@A$*4sXcb z`#B;}5@eR(#prVgBUFa|$U#FM3$oAk4c2EP(Z{qEi$Kyj<-dbHtAkFo%K6b1OP{QH i^rYonPaki;DE>wI_aXdV-=mY8YSfGlSiXOalpnt{mLoRGP20?`*`{)Nnw?$vU zF-WQqbT~roL#`zp0*1AZjsTPoM9Q%pAsJA%+N$CKG5xrhbr-;*OY0a1^jdSa@GfY- zUoZIpE_L4pBg%}70yxwT8o=o_CmJEYkH!vNOS}3w0EUDJz-g4#goLnaMq7==1fa+w zA|jH?!+%snO7FHB4mBM~3S>f12J&;RJaZiL(Loq zx_lb~-5U4|d^@>k!Q+4i&Hl6L0~6zf2PCA=TR)xc~qF07*qoM6N<$f|jTqF8}}l delta 1357 zcmV-T1+w~+1=I?V7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000FBNkl*45i%wJ@k>Lm|p)X_tMb^Q9R~f49^x=s7DTr`P($&R71mY8~uMve3S@ho5O{tuIfox#Pku(YrP<&L}R5pSd1-P+Q*%=%m8;Xq_l2 zBu86G5Z(nu2aq{qvu8i|z_=M+dk(a`HF#}_oxHm$ihmc2%xffwVzzu^Xu+KJkfkz~ zF-DcH)gL=;L<{&V5wOMJ@_hwJ#Pv_Ov|M>ag|j#eS;WbgPb zJBQLo4@f@SYtEMfy&i^gj#x1O^u#~b@yuKbO?dzSUdkeBP*V}^0rY+-Tp))(HDuZ~ z%JDT{iGK=UbyU=#D0<8oZCgj->3?NqV-*14b99-JbXY0sw?ZR<$C*-~ID!;hKOegQ ze8m;G@0Nxstj=F)b`)fiKx$_OcCYl+P}?e%d)5K2st~Otpj+P-($LIl%QM?8StzTq zbkEG~kyo7IR%F>Ok)Zbkpk&?g4^ky>C$;3rs(&-wibyO(x74M))ZU1RvTfV_R&XXf zOF=15@8SDBQTn_z0itPXZ#*C^sge?mP=SZn!f)8&eP&uht#+>maN9e*aiblzr9jH9 z-~d`{heLD{UwR1uXgi&ZYz^ssX}QQqGHEy^0Y+ucEQpc-U!|Qzh8+^J2=FVZohg{{ zj(>ut1hsM)8IvG`0N(-NcS1X-MfA{!rrKwy+IILU{{{fB0Pqt4zUG@`NA}^8^~DVi zUb${5Pfu!TaB1l;ng{p;|D69DCOdyMcmp;rJJ<_S9>PO_HvstZ{{5xdss%AS7Vw<8 zWZC&Z0L6e;$)+YNf>>!c01#IJ>7H~y!+)-*#-{x6_cCualQ4r-2`@zRTD zyULw06g>QQFs;D7;xGPHIqH0B#|%j0uYa91 z?)1m(?Alq7;rvn0PC8cR%1Q0)wD8%TpQ!>P>Wu{VY)*L`tielyR_Bdyel%&M{r!{# zh$7<1nKR$oZ;b?>-U?n_!aT65K#K!ckbSOyOPaX^_)o0>mJ}=go_VA@a{FvOSHLsB z;He1!V2gykusDCTGI*2#6X7Y3b$`9EI?QrNv|8d!N^1jLKmh=9wuY9J@aT65tibt# z>D$0rGlY^r+8W_97RTfEdOE-5+2Ju@B3x<-pmL~@z_Tn^%g+YQ`VJ!i_uxl9FiW4_ zT|l(17d?)<0p6A17);yI5whm^$o7w7#CUos%~LM{7Uyb;WI0kjGlna`C`Lrnx*p6> zvh2Q}QURjNjI>Nx%l1OAH?=O22WSONpsXO8S!8%R0`v?rS8zN=1_}NG!7KOWw(gmx P00000NkvXXu0mjf-jIax diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_27.png b/assets/dolphin/external/L1_Senpai_128x64/frame_27.png index 66eec542a91752a5246f1cb18e4d4cc00b12e463..e815ead02a8723014880112f25cf0aa79481cf93 100644 GIT binary patch delta 641 zcmV-{0)G9i3XTPk7=Hl(0002`twPcO00LD>L_t(|oQ;w@XcSQthQE6=(T%TcVq+m> z+8|;qETY9uBt<|3o3)E;nMQ21-U%q!SqK&>G57g+fx`1&_^(`{1uR)47!v~isIdGNXfP7!$9 z{iIkdtz_!!lH?TO?nwX?ri#f@D-~RnB-!HeW4BVlDn7F;SB_a)z((O$A2x z0yI|pjg7}m(atq;0JV5$Guhc=Dh#Zg00V+1HvJIDZ$qR!YC2*YDo3UY|9(fpJL~ z>451ze}dj;gc*=LZ!m32(t^~|^B^hf z#vXWz1@ds;j2R!8ax9R8m>bhBkhfXcJLKILz@h2P!y`9#6mSfZ)+KR7VOfe6G7#&P zzV}Pff_hB{tTW8#bI@>+)RH2t7cNVxM@UMfKymeeq~+zTY)DUO0?74ImQ+?*3hR=Z zvR*r}A%GqzOIk=GNp(qa8A%F~AOmZK)KnqqueQ=m^PTA5O<8~(Pk;t+_MrpdAfUE` b=A)%QtVci{7Ah2h00000NkvXXu0mjf4d5>~ delta 1318 zcmV+>1=;$J1+5B@7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000EvNklmaMHpg@Z5JEr*VYC?AU@8NMihshAewfAp9_5e06n_TrD1RId;6nkWYlPI# zbA6OQ7DosH=Xrv=0$|&(T!BaVBXP7)s^$7%ECPVDwnwuAX3F2e`)7XF>I?wzYyM8k zk1@`9p3}aonE~E!bTUAG{~eGoWuEyM1v3Kxd_Wl6rRxflBO&+j_-A>)8gY=PdK&L} zXMnV!##%28zJIa-a7$SFZqj?!o(D;;6tT~t^=z-F=R&L=`EzT!Rr%65R-_D+K8Iqd z_jWk5054YdeyvAal%MyL+N?{9)Zd*2q=QhNPJP}%`2auZTIE~E&q1*Pg(G(MFhJ>r zrO&J3N>Hbz^3-E3h9N;Rf+HPRQnEG%s3G_)&?vvuhkr_)fwJdo;|ER-3Y-xfRL7E% zDPu?l=RAK!`fnk#q`R&D;?1`XM=v_P?=wqEHwmgCeX_W9tL1= zb@_^hkjDvBKdS1Q-k!1Nc$tIk$wge8fIfFd5sd<7rXD0KNkFS>ZX`gDVVK zV7V_iQh+xAuK>OS_^cIZg;;}pRq58l-lQe7B0`wRwC5HK`os=Ve(f zYAp>Vd9=@?`rpO?D0&0r_1|Lz+`Sxn9=g#QN4L$Omdik1L)UEIrZSbPeVPrN(T8Vp zgVgLkrhU5Z2DXj`w2IGVD#@iWf|(3KE5ko2W{)f&MeU5Bb)+qgQQF4sjZ#Ly&40IN zFJMZv4yw4_xe5==p1Zw3JR)&(rInBL=&uQXQAceU0qZovQ)tX@c+!tp4MVv8$> zJ6dB10|4z<;41xU*H6p1z0MS9W0e%QVt^V(m3qIn@S{n+dVtFWN~|`F0f4$J&^o)& z=GUVsUNYFc{T2++V&W;qOVm1p5r1fE7eMlJGBo~Wkc6ufHaeq_cHBn55(mA^V704Y zl{reQlj2^$Xysoi50^H89(+KWlPP{0R%4G~v?0#~i(@SN(=czo-Wshpyd>m7Y5F~d zX$)ZW#I26fnx7j%KF3p~fu4ZWvxCuYqYut5jQ{`u07*qoM6N<$g7?{fIsgCw diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_28.png b/assets/dolphin/external/L1_Senpai_128x64/frame_28.png index 1e232ba91bc7e94f0f0a04d94956352b137cc794..24e579be15fa10b8d96af344028c65725b578c7b 100644 GIT binary patch delta 591 zcmV-V0MH+8LK06wH$(+d#b zh`W-Tsx@uos;Zjyji{UfpR6ch;l+F8dFij|YY({y9%&AskvQZ8SP}>D4rEt8g0wTP z5$;~+ylS3nT~+gXUaKw044C=C(>47hlx1MNNcow0vCmUgUDukbHrF@4X+x%g!Gh69 z7O`@>7!E+ahkqcm03^W9+}dG8g7W3zlNe*mQPNAPBi_4)0l-Mv%m?q@BapC^+-G0! z=2qoZ-UED%W~B#6b>i+`z|Y1Xm$4cWF#5JM&0{=w@MzctTHwPBh}TATzuVj!WUkE! zoZj)&4h6O&G1(Qte#Vutp(RRF_Ka`f*g>R?mUKsTuXOHG$%d0Xr zwp-h>eHEt}ih%ZOKT~5Qd4>b6HuYAX|9YdRHrKSF7MvY3^XdMn#cVpsJRyM7n9A`@ zdl^9RAxHo_F?4bzAnlecBWa%t0ikI5Y=r+K0;Jtpe~39!cwj-JR?NW5Vu!7kYD+(< dYF)Lae*jc@2y8GY#U=m%002ovPDHLkV1jCd7ncA4 delta 1270 zcmVlcLSe`X2@ZcFH+tSlpIv z?*T0KWhubTSqgA-mIBb%a&4toPRS&pNs3VwS>R&MAv4D z1@N{a%PRSCC<_oN*p$*z9D>JDgbx5={jIHxr)dE^@NBDBm`nIF54=EEbNtRY7wwBu z=7q~!=9+TOnS1lS7jIM`J@wBd{FV^wxp3tzb7rG}MLfkZ%{hPlQDy4q*kaeud$(HA z2k>UZ7r5HnkADSkL8{lY##?D@R_4#r#}$N+!_eq4w$`|eC8Y!pJfPW1pjm{Y3RFw& zPxa2nx>l4gNBMT?^LxAl*c!0q_tEmvP|llmJ|k--$@Iks;0i_{S(~E?vlop(q`Gze zk+qV3dx-*OLrv`L!l%%#v!om&YsD!LX#r+~`?d=INPkK*GKT^e64svGA)NB1ltFt2fPd>98^=VJ%#wEuG_d)zZG@1Nr-3|x$%argkn!ftORSX;mZI3;Lh{kZztgCPw|0VZKl zf>MU7uc_C z-T~kZ0Dc3&_wEq|5Ow%s8G}Yh+PI$@pZ1P{_J8!T*8=>7PvL*SL4 zl!v?BLxqM`dKBOt0KWbI{~;ATIuRFNqEhM67j~W$pfQOzp`A-561YT;l;FX5T7mkx zM>Ozs9Ng6!&#tM&p0`hPBd2T&)J2v0xpf?+O>G;kyg*OCxGjqU{4&%z9NOzuoFmnf z$bYentsYl-?%}hHT7Vxzy`PZLYgZDUWi39)$^-`D<*ZSTAQv(8<_%sH;7%7qMnbCA z`MBQlX8~p_xc5n`bSKbqZg3d|unN{<1vHt*NM8W=(K7~Wo}>cYX&V6OQvyvG zDP0Ds|Dw=@m|r)7?gnQ*vEZ~}VtoS$3x5_nZ<4=YJ@Vz+>*3TX-5M@t*T(mhAhh0h zt3U1dJ)sVS>hG)qXik!@ibjDra9M3V?{%gWmQ#YuZ2{c=O*um&$F~$m5PqvKyv?PQ z;OrRD{nZ1)S9Nxkop(_y-=@3RykGbBvz2>7? z8>+v(Gp*eg;Or@4&Rj=C9-8udb^93CaYJ7=Hl(0002`twPcO00I$7L_t(|oVAj%Y7|ivhQE8Vnkgh1AxH$# z@eNX1C99>cU?A%w2x-K`*+LZN)q)G4`$5xP+W*>J9Jkh^T!YcQm1OuG>jCP)LxOJm8GMeRB* zw`7ZNnznuaF@M{2Gmyj1$-8{!rTGRY(UTs(idMJe{laD{g9HRUczpgWAdRF(Ri$SB z>AHk8mMS%cnz_+i$smFnR|0VcNQG2L8){r}K{Dt-30+*uCKwpx&;=gcYz;Za4Q&Ao zT*w3TUQa=v=|J33Si``FUA({YA(a8iEbo^?(bxkWSbxr=0HQj)pToKsAq5z?y>N%U z06!uUY;p&eeeSZ~t$ZK6c?%E??G;p$ za`f%22tj}-r@tr1@!ROznc;o~MA<}04oLa+w=*Mz1&EFrL8&B&K==c$1c-9_S3zBa zq%W~L*0ul+==l=Rw;rhNhhuq_gCm}Ps!SSdn2jktr@Ipv2^6PJi@+lpH0E?6K*ZC3 z07C+8`Fk>G&40NqKnK>Ra3+K1oSOguEKlJ~2F*Fmqkzcfzebw@^ptycC9TM%Mu48s zR1bTlzZ5)_&kYMXGKv#mBn-yG#`M=#Myqfu<#X3}wCCgpL-*V84_#i zRW4^^x;TLm94rVPa$u4_RFqOsA*~nzs2jHu=3Jo)cYk2C_MG!FA!mE#8U}iM*O4Jf z@L^svP-C8QC>q>$E zKT}GdmR3MBJ7$p!ppc;Fqs;n{WML$NK2l2WDW%^jrSC5T8kkeD#W!PVj13WuQVfIM zBuL0hwE%z9KjnX>j`Gh2t7lg|K<^!(D`Q3|E`KNl_(&;z`~Pn+eAK)OG?b(zFUDEJ zrfci=((+OW@ILtVv`URl)jXk|#i*V?0Qm?tsigK-DhfD#ZB~P{+>i|-fyQ;kA;2$8 zBa4K}8Nj^?MwS5T!vTi?Kd=oYNN{H5uL4R_QwlyasHcKgNMNn}=ni4qPC{OjS^!7T zJAa@29w-GR3e1W@6cTtUKe`o=-WStqAZBx~eDWm=Ic;djg?TyHI}eY6Rb8WY=-TqI z753i+7y`=a*Wm2I3Sqk`T}u4PRa%?X!i>XxG=asabh|qKY^`1g;H4S}Jz;``UlknF zA5;70Dhu0hrT%WEe9kye1Q-p#{WcW<;eQ#E7e%lrT4T5Etxi65JhTtsVxE|rqZw^* z!da^Fd(X!xp!5yc+^TkXV)WCo5qcZ=F0wCyG5ob7G*3h+$XYK^NkCN_UxD}Nm7 zqeal6Kh)*{o<15UEhO$hYf$!rV&%BGjJkg-TTj-v(WYYu*}wsE(6|oas124BkHaw; znI$VH>gvSm?cb;-fC*)({oCIj(1%{9t1HMFnEhN0WoINnhk;x9Yp9h*Jxr@sctisC lM9>`|VLdgha498y0S9DrH1)e%^$Y+2002ovPDHLkV1im27eD|2 diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_3.png b/assets/dolphin/external/L1_Senpai_128x64/frame_3.png index 9a3c13f66213c3e25c8363eaaf5701ea980b9586..c610eddcf855b4a929c76bb8c1ad24dafd1e5edb 100644 GIT binary patch delta 831 zcmV-F1Hk;n4$20Q7=Hl(0002`twPcO00R+8L_t(|oL!PlXk29&g`e-6JCi$Y>fEG3 z+E|!rjelLGpfvuF`HHP1xN$GVfQpD%|7mL__ogX|pd`4_Vr@rUxO1VXMPhT43Ry^- z)P+(inb;z!+RohkkeTGpe6NdX%+#|yoO9sidHKqh+obn!yMHwQ*P-e{wzD?YQVx*IYL$n%6Tli`a(*D(H*sTrhkDUXH(}3pgiYn*fIe4t7FgQ zrFd?sJSQTe2^`57EU9SgEplq?5d$O!+;wA6LTYL_Y+wMG_y{l61UuOWvJPGYi6?F) z*A4A}8-Qy5kGcs_!GA^-*8rwr1klllNOz3$%1;FX;xRPi1kbHMUnD%wxU<7fHmpk5w?0yP}g^LfFuhz{efz2r$u-F z0CCN8j;(=p_qA#>S*1>&Ruwb!o{~t5I_xEf_J2c104H(@eGa*<4NCsb8E4{wtiE9L zj@lWhp=5}$Z~Wr0uYXyMx)|-{ip9`s(kG#B8y3iM6^_nrj^#>4uGB}$#Vs#Ai#`2W zMQ+COkNtSQ*xG(UPZlq=<7!R;-qD!_?Q0%FNoEdOtG!!8otO99f~0?K00+8Gey)$< z-Z+nDv!R<-Z+=GGUL1o-xb@>HyL@CsZ*%Ff8lkf<$9Ev}c;)p#G1dtiw*ETWVy(xso7w zo<-8J`fFn!)Ul(+=!Q$-NM+E*@_xwr$Jj^U>j4#j$j${&yC*Pq7xJW6^`0%(%>HV?-hNyj83SBNgFw(0|G78xhe<+kDNsM?2sAXsKxR zu}Z_06+l+_gP+Lxhqk6F(40sfoKLxL(gW@MjWz*)CSQBwC8M$*(pE_qEwBR>;YX{Z z(Pr`OmCmwHMyXIDvS*(cpQHw**BK&B|hW1BmN5-~m!bXfov|Mvj5s!dgM>l9C zDwaIUcea}F6i<`yjyij>#!3(^D~@P+m)q2^TA3_mj{*rxo5!n@*7(wlF z0TH*qD%bi zoIrX4i*{$&==3@kEoqT*t#|W$@Gbx$BYczqdII+5oE6|~HqP55Z;^Sd+^G`(y^=i& z^?wsV9NGAyG0CAFRB#$+C5~O*!J?D#d={*#sRH+lA(aWDS+BMj`Fw@&t8rOV>g;JA zTK^ST_RSz}#g@xM)d4z8xf5g-p79`e5IRRF1XSUblo3zi(WxM+P}WJ_-2_?1<=+kT z;%3)ITb|^OUgj*Et^nMsw2Pv%aFx*SqqQ|AX(iECg6WSS282c|W@s z=u&_`o9LW^>@n&pLES+KIuzhHBKoU=P6)FbcDIcFY9(-wg2CqePDH;F(H}(g%j$To zT}gLb&P0x6&pN}u>V`C{0Do`W_RV)4h^|Gb>+$NR3r6-p3RfQ;32qJQ&R zR-z6{k%aS__n}aKA)`Bv9I|ULE_z)?(StZAaQy*V`R@~+%L=k@u#&B&3}xH z%kd)zh-jGhA&!dGbwK-sQ3V?BkrJ^Rl9$S@Df*C&nFDZF<6YQzcloO~DD!EYS$^dG zLAN)t6b}hLdWYe8l@A55Cb*LutyqIrYI*%SJq)KAZJ$vBYyNH9KED?r zL=S0ZV!XGB+->qPa{lVP$U+fKd05mnFZ_0}$0*U-_!m(!Elc(`#Y(Ouea}i)8iA(- zR-1f=+6P{;A;O3?W>zs!(qf_F5;OhKpX4>-L85$k)m3H78dxBvhE diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_30.png b/assets/dolphin/external/L1_Senpai_128x64/frame_30.png index 36d1212bec67b33d81867f71d1320ca7ed6d0942..00edcb7f2587eaeb0a132cd963c80eb7ac3d982d 100644 GIT binary patch delta 601 zcmV-f0;c`03FZWl7=Hl(0002`twPcO00J#ZL_t(|oL!SKk6T3)M$e2bWRRk`phyuB z(`~s$itTI~+N7gE0{;V`3dIV)RJ8dAyZ?ZaB9ZKla$BlAM+j{s5YJ1LwUc=>hvGd4 z?@lwL^X|R#z5Cq>a&yIg&#(8yZl$mL!w2wO)rDxS*_2d^Mt>MXA+`WQgb}oa-K|@~ z_W%XZq>V0BlcHH`)yt_#_bI@e^S;JYSOW}trNxEwsq1N7cQvxha`u}KE}CUmqcCy( z(Dl)1)ukkx_vUPRZx_)rN`yijK_tqlH1e?t9>X4UM^?N@mb$9rLgP5hA=+eVA(wlscQ z>Ie`jV8=Og#-zs1wmLshpLEhE^xn{RU<{mhr6ar=Gk*fRri3^fEnhJNyV4;(bA5Lf zyU_q(`&KWCZfhTDxr)P&;3!n=U=A2#3qxjXU1Tx<5PeMCiAK;ZA*D1k2_RKNFN2HXc&G3@&Z_kii= z2i}gm4^jta16Dm~dvO1D#BO#AjBkPwM>i%Y|C_H?{l7d>O(m83@I?_$86T#!oP?@N nDO=U8wcmAbKPS~j{nh^fj2oXc+QoA{00000NkvXXu0mjfbhjoE delta 1190 zcmV;X1X=s$1g;5?7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000DFNkl_SQjQcBa`&W=kGAf*I3XUI9f6yEyn3b-TzN*oH0>ItP}RevME>RY3^US#D zO4BLb_(;|$)<8>6RTr>=1X>$!$r?rZnz(cf&HmRDT|2E$q0N45NK|wg!pQ4diTyI;K><)mj#F*Uv4K?>Y_aff5r)l#gA@ zYVK&Y1u_97o1!SjbGa8w0?V{jE5Kf!24WNwq1=lhK?IP3K<&e`_LcQo9!zpgnqJU2 zdq)dR0*nOE5^kkpJSo4H0do;7JC`3>z(`2U2FL;|vVR0t(8xG27s2A}0je0FH{nP) zX+RQ5*;e3MD2-qc9Ru8oqJvVL!aU~|yG9U|f^W1@R}C#bUn}R7xPqGiioletwNS@R zToSy+034qZEoies+4`-a;j2gIENMA^6oNP<+pELNIdDkOtOQ!t($9p^t*;@m0+eyo zb-FRYu7CEXm!gdY>bG94iu>`R3PnD+F;WO-CV-D?qufWzz!-P32>1|CX3lcL5k_ zV9xoc#SJNmKpCTXs8;*(YEe>3{r?Tz(Fx?Pp&`?34#^sIEUcmJLbeaZi92b|_(2DvWhQTz}a@ z5?~j+-Fyw)1PF+-5ho==I0AU{!7E@HgM=f%mC;hZ)C$}L2!!6vmso^Tl!85@bvvnD z&iZdj*R#e=03*zrO1)>4@dqSsz&!yX27NP`XSus{JOy_Quo11B%T+4Z3fu%x233KQ z6z}wPfQaUwgPmVoxg|jFKs+>udLNJ|Q8KO!7^!FT7yK{87VNqm%m4rY07*qoM6N<$ Eg5muXfdBvi diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_31.png b/assets/dolphin/external/L1_Senpai_128x64/frame_31.png index 037bdc8ed6eba76a6f3431eac40d0af8ee688ee7..3d2d5d6f74f722b72df19fc49b4e447f869315e7 100644 GIT binary patch delta 580 zcmV-K0=xaR3DE?Q7=Hl(0002`twPcO00J0EL_t(|oQ0DyZqz^&hQE0@VMP-QC@3Of zBqS))Af;PZ)Z74$kSb~wXi<3dk zgKJ2sE6GbztxB)`+yGooxatitZ6#?YX|B1X-H=!UlmJ8l#K2)l)ZjQ~0?Gk!mQH5J zL@-qCY+vO@YT(D}>I><}OZ8lp7h7|zT(h)7w$1T@E2Qm^k!s}8B1n%e=m zqgR|NK?RygUVleAuMTvo3k^M8aF3FQT!JJi%j7SmUO$Hj<+uzSzXlrwyabnj9Y6|f z0u+M-9(V*ypR70+hod*G^dsm7uz5S8DQjqnlMN(&;5avWB_$7jY~%o>=tL)(-uoA-C1rDTpiVy1C$*ASg)%AYr8B+|6zDn{wC?>pSfvLvU|5*ZD7avh!lIz#XizLx-Y z4cW*^QUZFBz$^HpmoETXU!L{=Jwv@Z!X==GEoT_{Pk+_L)@k6ZlR!xu7B=;CSoM1p z$!dpq0F@<}a~vFb2aat{DX?DlsBL@rvv%a%Y6ndN^C>p^^jOQ)Il+=_Mr(Q`ZF6Nf z_K=T*wTe6-8F3a%K}(P1eBP>Ujtz%e? ze;e7h7k`#H3#h?+X~F_Avu(^Cu3gI#VAQ^(b)-6@?G`i}_3#9Ua1xi>5G@!QViw@&SSk3NeuW}{G!4>V=EYM_kgt;o3PI0GkcK>pCsbKZ9Ujv$q7NEi?e=UE z=kwGrS}5;n9ak1pu=ZNdYq|J}Bfmti#(%(?0koen)#NRlEVT=>NBeQcC}=-mA%7YM zV0$OdLZ_u&Wg4ZmYXk|n?bP1yE&-ljzi9MZ+hsW;MMaI=XclnBe0+3zDTUMrrETc{ z3m7#LqUGb!Nno{U251l<+6NE`QAxQXQvaR^5T&MFA}T3859)}gD&X78PVKXm`j3M8~*|EbIAd(ns-M40000< KMNUMnLSTZ3;31*_ diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_32.png b/assets/dolphin/external/L1_Senpai_128x64/frame_32.png index 91ce1886940f2df4d02737d8508626b0f9e1efac..819ae205e9e5550b4964b4d5a86ba067ec620f26 100644 GIT binary patch delta 579 zcmV-J0=)g;3D5+P7=Hl(0002`twPcO00I|DL_t(|oVAg$Y7|ivhQE8AHG>veVhRPp zDeNrVMo1cW1Pk9Hc>_TZgv88fV_}iBR>7ALi;!K#E<_fw6UmqqsmzXvWJhP_{uVQ{ zJ9z+ab??uA|MQ)5jJS9#|4n!gfX`ggc9f^(S>qT2sH09RV}CxttkazeIvy1)nHUd1 zF}iG_H?87CCnOZGAuv}+^((;3|Wh`Fqk;4o)#c8F<}B=u<(MEem59)fgiD@ zRFH7(a6SegL`OP`wCV0?A}KmR+bZND?J1X>#we1aQkqo41Se^bOSwv^RBiyMHdY2?NGWm6sZqa^Gj6%aFiT z<{C#wlM}f!+iPK%*eu$I4fq7l50%a`79GGPmg|V({CS=qyt-lcYeU&F^ delta 1240 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 KMNUMnLSTYMw;_B0 diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_34.png b/assets/dolphin/external/L1_Senpai_128x64/frame_34.png index a28aac4e0f1e76750594be887fe23ec7778094db..53c2ce75c1263ec8eb96df500abd661c9e40f131 100644 GIT binary patch delta 793 zcmV+!1Lpka4WtH;7=Hl(0002`twPcO00QetL_t(|oVAicYg}a*g`e-6JDHo7nla5n zv634p=rV%RDzEFy z$z&?hP;2JKiF0S>&V0wkqyc|`XZ5~^vpUZ);=i)|A4cWp;eQcBLJT(dK{hR?ht|Un)3X4{21k2yTNCoq z&!+%3=^nUuH6LEL7uu_U;#j9T)5#levGj67(!l9%y;S{P1v|BSH-fg3?I~T0Q=XRLxZDsnU7vmOZ+gtfIINCeneAovpIaLlJbq%pIxQl~<2k zjoNewAa{Wm?R)Lxj|aB_2H?WH{mp0lOacyK+DpcJVY2&X?@*jP)X&z2od#~Cwgjf= z{SX&sfpWL0iOHx^q2UrUu5fJPpB&jo5lA4kp82$RBluEJ?0hnli8_5uMb8$%A zvcZ0$5rQ2__IA+$e+lepW%&CcO!y3JvA>t-gPA}~9+IT~eA%+J8p2scdn*dfEE62P6RYnem`Tx9udAx3gN=HQL*$?REe~qZbor7W1DB>|+z4 z9C$OQ@Gpi1PE?$_PFde9t8!w!V8fLT0~1-3PDQq%#LAp2<|AMt3WJ24T}E3r42|v; zF?=^^Z@Q9ag1~%~kAvd*)~^(n3z^<+>e}E~y?^;*H?@pjf*Ej7^tl7)HxFi7PqjYy zDsBDo_F3H5S5p0z=}&j1wUdnBv@7*r#_=tek?)VL?bx#AS&YUuvGcNrV_VXv4@dd( z@3WX2-rS{c?T7eJVL2EwJsZV$*F1L;FC@(QgQz;~eXwXB@yah@o*;5N|1|DwpZpgG XuM(SZAU2E400000NkvXXu0mjfPFRhE delta 1763 zcmV<91|0dM2Imcs7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000J=Nkll=ATGJ2*nlIlXfwtfqjvFq)CS!@}*JgSDO-R_mDSK@ch?g<>R-ioL2MoYXri zdxwshodhz2)6T(mS3=b}YJezO=kFP}S5HjeUjO{n=5e=2c0Yc81qX=e+3VCT2J`f> z(l54`V_1<|!+%}th(aw#hzL53nLCc5W#?JzhMz5iGaXv&kaPZu0BoR$auE-`0wTum z+3hLm^JQZ)=aA2|KHf8o0+!8C|2qpcR_?>_#7H4d@)V-GaU^VOGSHwicCKa2`p$|( zjOgc5O7TiQG^{phtCHA_-UapAr^M%F<#Vl1R1cQtTYsDeA^Y6qU|K`;uINPN>ESL^ znLCYNpW}RI&7F;H>8RO~>3)wG9)FeswNMv{7&FmYHm%Twk>jXN(Xr+D8acN}JC1YL zjLj4e=M}NWe`S!2zJOgJj#rH7f(U}o*T0=-V4)%Mod z+OD_8PJc<91GEqurU-kE6Ns|n2u|(#9de__Wc?T{`#zlnVuPq+p2AvAvJ|&;>M_C$ zr;EsLb@UbI5Rv|+l>a$EL=kHNS|UZHW^IvuMXaiR(7AfnMfU%79gHP}m3w+%@rddS z9=F(O{Fw%vHI_!?thKXHO5tVTsPQdMfRRAH*MG{#8JL;7t+8-N;#{v5!RTE8LyPel z0rYr*C-Vep)XqLow}>2zJB@IlQOCObP1^H|rlf>N3i0G?^&!%%vQ!(#ihM1=_M>{c z-wNM{mEWbpl!!lvfb(UMvIe1&-}`&zhm`iGyj>R=TYsB%VtEW9OxT*2rPp%l;y zuYatIL<(=57F}9Hz18PxhU~@hUkvf`=8A=82U@G@_K5tG*zN#wSIPh7yInYGgsV8g zkqCgHm2rX{J3oq5hPr|i97_R~fmh~Nbgl~Vfc)V=&D7!hqb!d>P= z;`plx;*$eJYI35?HMY?pw1wUk?JQ%@js|tC2M36<;qMUsN3c3=td0gUqK7yDyMOh% zx+6%Ptv0>4cr$mRCJ&9h;>i5huZCHJz7pw^j(YNdB??bJ?XF~2N_hASA(66()u<=) zChDNc)#jp=eO@_O(KAoB&fa)d^z|Z{WwR#^5b-GOOB|m$!gLijl>R7}*P@t!%zWKW_tBu-aG^3j1G`@zu{ZehbsY zXDnBFV|dV_PGn403R%x1dRXh^?baSWt(~vUNs~o6faSR!ERUVV;zvoFbeiX-)555Sma>$waFi2a{qp&Y=uqF~lpep+ z-^vBNKG9s=6K$+i&`Sb)9H7SuS!A$M2)?)G8(E7w?tf9NempQLiU0rr002ovPDHLk FV1h~^a}EFi diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_35.png b/assets/dolphin/external/L1_Senpai_128x64/frame_35.png index 04f8c1a7f30fbdc51cb1c9d7ba2d0a6b5e7f87e5..d6b2f16d86cb083cf749b2462c726984fcef832e 100644 GIT binary patch delta 825 zcmV-91IGNQ4#WnK7=Hl(0002`twPcO00Rq2L_t(|oK2HWXk29!hM(`u&CE?5?IaD- z*1(K4pcY!wg*4idxne6RZrqnb7K*sAmAI%jntN-CA}9@RwAi0W_bvoQBqld$Aq#1f zcA=C?rdUdfHZwQLn3>7U{f>)qlDxa`;hgvIogcpUbwjbL%6|biWdYgprU7uWx}4Q5 z;>X#OMSm-}dFb-Ktr5;r_{>2lr&~Uf(5r{x&kbYI;r%Bd+62knryroqeyHjId zEqS&2g^IuX)!V_pu&QH_`6G~Tjy^k-yX&z)&k7H_R4QXn9-qGz60t2d=e%_}vlfO| zFG09sBBHn6VSoJC{eh+5e5=KL-v2>U@^tyZsWZC*W%)d09`(x6E01j7AuR0iyq69f zG+9cVy%pxZvRGR5ffmmv^=`KY_VNXP7~s+M%F?oU;< zChx8FbvHj1gZ0|vcb6i7%@MLTZk)r}+S^GJMo%>A^M3$B&L*#ogUL8Qhp9opuT8v} z*TUp#>7J^p5IDNs!;*}4G*d7WFMB{@&~1Sc4QZIsW?vnE>95EnTU`g*20&Yb7a;N4 z|B)>q4!8lB766F75EEx)oAxnvX85(HbzRUyfAzs4^VCcA4Dq5T33G%qs8UpPa%jvS}QCC6YUS{|!nFJG$YQeFSC zUoRHYoi}8raH|tnxCmrEoL?4ScoC!9??JlSzax~qe%=wZ`S%BLpy$GOGK~8i!ebu2 zq%t#$^J4pPJiLS(f0DH256;U@$3KGELts})NwNPwQh=0eL%a7-00000NkvXXu0mjf DZzGq# delta 1829 zcmV+=2io|=2B;2@7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000KsNkl8eeD1LO@FD6yV$~gXq9D{!<$6O4(bC8CL>!EWm1Qv+~E;}iXHfE(ArN`K=M5p6_tv;k2FK+3ex zK=jTM@|tz;jq|bb9DwM5qigv95vfk%InbSBTn{_Z>q>3LuvRZOB^0#5ZSo^YPVK*Hp$H54k!KC zS_z=7UU|)m<$rP&YRM&%)1~~q>WA@kfS1N(>E;<;%Bm<0SL76#P&Gq`=-jMl?Dc=y z2S9^Hg(GFX@X@n^d7l{!(CeJDbPDNzg0R$9$qB8j9}D& z(Uq5VuuS=!WyEdUelvhJXmled(=T&Pj-%~5Rv5pU!hbW2SScqm2DjTod*E99Ywi5u zM@vQP9?lee3@zNqwq9h7-*ocw1Ie0|EQQ(-Ln3F847Bqa(2zwNb!i5 zYcv&M1oSzZ+0H=EN*>iaTTOV5r`dN$H+!+hN)R(yJW{xdHZ{z4Cd=8QK*rL>@m9Sh zn@Bkg)NZyELG5w^5!#=f_>Eu{6Ge@Q`XN~MeSg~tls7~b^AzrxP&H;!vNld+%$|g_ zp=UlXA;8MWt&S2IrZ_vMk07f1tWYMMtA{0d|L04g+&KKV);Wu49&r^Q_N$ULA_paM zy}8qI9JmY|HNKS-NG7mkSB8yB*0E&C6)ER>HRgk70SFo6qXf`1us7zY0Y|fO-X?X6 zjDKV0PCfD8E7_w^-w5K!#urUV4sD}?%UG2-R4vJRcETdn^;Z9)ybdaH4n>GH8-#9G< zSVov-Ahh!Sb{42|fPahREJ1b~b(W#7-~<&8@STYME0D7USIg+nb^>=R7(ARGMD&e_ z{vo2TpLnu|%FEH0St@io<2hy>;ODk&UySP?1GHUz_InIxI6*iB{MqsP(&FZ)8h^gQ zI;YSu^NhdgB+o!*13G{-u(o&4yG+n+IwDTI!qMek$jZFn%>g1cIZ*EWdS(#OhrX&J zn9T-F_KO2Vy!{iCzE1&if*EYU89kH(pi{4_I|A3)x~C@$%%o>z@R=du`JY0)!;&i- zn}a)Qb_Hebtu#o);Il%)ZW-1(yMLESqQq*4vFh~|=L;i1`e|)M`LfHlC?Xf&&jR%&_oRWb~h8EqeN0&Dzj+upwyAmfa7e7eFByvfa^e1E9}+7ceg zEv&eYWb*qf$A#Yx_7o+W8~>tC*7Fdoh`bUjaH9m*6M-YLm z1|DdTs$>s&V6_v>WC2TmM1R9o`bEPnUtsM%l;ont*XH)}?O>UJc%gw0f`n({l6Bu% zPT=X!*{&D84k8VWoK!k6N@PP{4YNuUnI%`2idS%gXrD7!zzW*N?IBA#E4H8&V@(7pj1=jCRTX5MqE{Cy;X>tB6dsYVgyxq`##`Gj%8M#6 TPG{BIIBZDWob&i?(BT8hfT@0&+&QR=XZG?zH{XP>1TORntz8i+uF?cN4T^!Tkpr{ z(GT|(pDXVqtb6`bKVH7wXQbqt?yb2#=#`IxdT_Ikkr_Mo*W|Ld^U;zo$Kn@UF%(7Q zQ_=3&E30?Eg)Nzf-0zXg&bA2)sf!du|q zQ8mKD@9M%~dw=!UdBkhaUFG%lN&RHw&!fjjJz+f$xqtVOx%tDTi+PEqQWG~GpS6D3 zIJIYQ8SuU*Nv4lj6V-5i61o-xo($e<=n5w{Kl6baOn)+7r8K;>BqD)ajNM90+WNib zi{k)<2^c4>f3v9r7zdwbSy}t@?RPTD4;DCVz9i460yV_Omm9+g^CPDAmQS zpe7<>;TainFqm*;yE(P+k^^LC?E6MZe7fqi->U)O>gVJ#ePyQ)g7mkadhMY(bS%K@ zGa7(${N7eHpnySV=fm6Of!U#i5?4ez)uI>?5zQLPhm=>_j$}eo-Zskv^uR*zk^>w_ zbgp}!1%H5$e?&y2TMEvKR7GOzO#=`)w0be>TPH9#5OuK1B z#H~lyB}l|X{8u+3MxqlxN$`i5hJIoMBn9>x*u#+JcBXLJb6u6Sr&b1ba@^mV~ zvKd^Dv{_l}+tx zo=3@04Z!U2by3a?duexl29$4|`&ysCeg@4hheC*dcSV~iET`e5?8I|u96zfcx7-6H gdmHf#pzBlr1D1!JV9bJSY5)KL07*qoM6N<$f{-VZ82|tP delta 1765 zcmV>e#0?S3AH`u-_^0i&H>6m&-%4Y z-SQ6nd-Qz4v-A;Rp!VEiR7mpjs;IH4^Apj_RgHip014!-y%-*`Y^!u^-S}PtjFiMt zIvJyiewTBd6o4}qJ;=$7%bYew6oS*O#fUJ{A{dXi)_?uwa(if-uUU6#=bIlb6|Fv2 zX*jY1$Oymi63GpU*UQrI=xc4rqoRG2UTEiEGy?pZ{OpaFjLLpUTjjiHfjy8FezY>; z?HUcQY)1X$-dW>OUV!*L9R(xek`U@I1uVa3!iu$FNFi&`B78|#<0Vr?Sn!OC)6*17 zQ;6Ntkbg)Pt_j#<7-@ATacc1dy<>jV+R(KqFPg%k{n6TyvF)0$5%Z`WC4$IJMLYuf zoY|xi$XKx!DqHAU89bsZ`QiPMe0S8@i#1k)XjySI-i^d)WwMk#3M4Fzj%W4O+(gRV zK&`XI2x^xLh`9Yx*?ucVDGpMSs4&r72$pt4QufJg?821;Z+#mt!Af^6k5ng>~JMZw2E9}4Bd;qThuETVbDD(LC4daYGUM(Z6-Wr_^KTf5u#TK$?>)E z-+wFF!}C!<0ctjmkJAp3ExTSAhCZXb;rHO4-Morv_1l(oXVL z6JiUd|2EK4gr08F@+7NynJaO*0&uJ1?|=N-Rd`pSb4>97=thQi?Z#MKt^kp^ex>l= z-3#8D^LOFnT?|x-Ph~ya2TezbIKQk0O|0&eFS+cUQIr#0_=s{0*{t=iJ z3U*7d*1dbL8n{|vta2@CVY8F6QGfL1-f%gda)5{yY7cRYvN{ji6GpudNP=BtpF!va z^pFj2gH=G}DHl&$uTp}j#mqi`&(QD1tLDLZ+erbed-JO$ep!Cd0Tg=pR9p8*FLSkW z79&6XEnMV_HO}7S~S$gN^czBc=Y1D_M{yRNl~CRNSMz9WCeiku9a9* zULItrIs5bt@gF@gT@kVxc$5zuyX(i&_Y%K~xE@^a7)it%9`v zGD(+h@ULP~EYV5|R8L#X*M^AIlpxdJOW7pdZM>Hq^SMy_RjBn2mgOT4tQq-n9Qc8dmaJP_NDr&$bG76W zg^ylBkMdK?bEe$0EM6bA!P~(y$@8+y4CH)SB}1iXZPKT?(FhM2+P!iLl;|PhBVG|7 z+qTg|mULEZLG`_t;i65d-4I!cXoAQnMGG&pfYz5y#!K5T0D1f+2q_*?00000NkvXX Hu0mjf;~G_O diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_5.png b/assets/dolphin/external/L1_Senpai_128x64/frame_5.png index 7a111afd03b4a20d23675dadfdf070cf0be65452..838f46432b449465f3d679d6f1176818288ee5ae 100644 GIT binary patch delta 842 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 KMNUMnLSTX~^;t9k diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_9.png b/assets/dolphin/external/L1_Senpai_128x64/frame_9.png index 00b02330e1bb9d3c515b63a7b146cdd8e66f33da..577207e5cec431f00d71b3bce1be9dd9fcaf474d 100644 GIT binary patch delta 827 zcmV-B1H}BJ4#ozM7=Hl(0002`twPcO00Rw4L_t(|oL!PlXk29&g`e-6o0*$Bnn@a@ ziG>+!@TVJ7P#S;8e8E;y+_*1=ER^EHR;$u#HTT98e?Vz)qs7{eh`4hhs72DrO;@&Hr_vT28k{_=?~QhP zV#$igN20ynXD%&%1Isc2sb78l+3ts4jXDeq^exGaZqb#Ad-vwb0U?_j>X=#6Z>Sn**efp*ycnS;KjCo?m zPOh9Ec<$vXiRAQ>Ojh?@(S0l7yaRP;_hr+2R!=cr{x|?aP;YN7FxojgD16!LrsQXn($mA!Fm`a-dSqnIJI&c(utF zvQo$|m#&J4XnaRH43>Df`8GK<`J@42BksB}Dgkvh9yBokOn*Wu-U7RA7-Sv124c_N zzFar71FjFMbsr5Ap!^oYHGpXv8yGVHgd!qRFQi3EBBEJnmir-`2Xs6HK;gr7K(|je z^QkIy`hPTZs=hIec7u?a2cRVyN1G5T4g^nDG|YTz7Q z1M3bYwVA2XP`*|bGxolcP>VX8YV(0^AC6^WI)9Jc(8ehFJ7b*bN7DMD%{nTRQDbcZ z#=dr$L_QJ8!IGS9JX*+asZ})XCtw&Xkl`B6p`KlP>2t|2k_!KwsA5ljQIT7b{9`{| zEF`-w>Y2i&E?mt?Aob>aS$mqt8Iq2xkgN`F4s=#N?DW3&u8-hA--$2vQQU{=;x0o! z$u!jBytaclLm!x!+juu_SB@OlTO4l}Y8$>?CZUUi{{e)AmhTe`&t?Ds002ovPDHLk FV1j%Qjza(d delta 1824 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 JPDHLkV1k2p4D0{^ literal 1552 zcmbVMeQ?uc7*DqWUAMVW6~>remchYCl~J%L$kOE97PmAdO=&lg zO;ADM#sPZj4!i+VIXyu1gjoo3EX)IZi1j};9x*a$BO>J@rSu2@B2Ra z{hse9uY2Z{W$1Er5CmnE&vaC(YqR>4Xp`0V1?_sbx=c`U6VtpXQM6JlMUPj%=#TWt) zLzFrza?dHB+XI(MGJq)qfpR#G!xU`*JWKkG)hst1CUKI$2=%5=f?`M`L(uTZg{TH) zzM83YxJJyWCo58`C_x6pB9Vw8Vl+r{4Mxy3jo~CllBkM6Lk$6ijiP~2enNu-gg99U zDuNV%;~H7N6jrQ=>g>HJ#Gu=KUvVHbk}EZ9SdI^=B# z0<02*q_E7XC8^F&kk#}(+)x~-dc#!6f?5~0-XU>e5d@TShZRx37VHx0EvLwR8X=a26xKITA6bbx(lr18PP?9v6QQGJ?p(IXl9LXC^6hR{+eE$EY z4^y4O;=S^p-bskmhKz6T4}*HRKTaT^&XBAQ%Q5$qGIh{KduDr`8jU6vi(Oinv=f4o za?2eyZ?xyK?~j(_xYl?z_C0lW*TP5Bi~2g-=bb(>HLXQcs?utn*;RU50nNRaH~W=jR69WY4rmDpE%8 zfO1k(PVD(J|K#n~SN87f(VttPKpnRn{q23L*N7LVp&Py&=*)|u#KpY&PMcQAh6ZFh zdFvBnTD>`%;2UD$&f*s)=#!4NzGiv3+XNjb`LK=Fe8p%E7uOS;1;{tKdGh2FOZA0m z%|g`|yL;CiZ`yh$XCvOU?1M=I7gl*Tq|Z-lw|RZ~odkYwUNcLb1o8weS7(m}aN#+uE2Ho&V0;1zVi82k0ePsV6_unlg82 z_buwZGX~1->o9bk%j@lGx%pcp8UA}(*Evo1T3zq#woG^6bUwa!)b^OHU)l3nZql`a z_PM$l`cY%E4vsqyncBp|_A8?}SW^FL`wIs19Xilx=j<+`Myu~ksXqV#KbpE~h${2yKJoa5MKuUh#J D%PA@i diff --git a/assets/dolphin/external/L1_Sleep_128x64/frame_2.png b/assets/dolphin/external/L1_Sleep_128x64/frame_2.png index 70ad96ddee80ebc482de9f7db27fb42e56add439..20f3709d2387829e55401f4e6ab6dc32a00b6b13 100644 GIT binary patch delta 581 zcmV-L0=oT>4AKOU7=Hl(0002`twPcO00J3FL_t(|oaK-~OH^SLhM(_vM@6NXEU7ll zr3`Elwh?9#%>{{|AZODe5Q_Q(RvV#Uu35NLTD8)a{eh@f-XhW;&^kwm#zim_BhKi| z{oWRXHuV=et8g3f{RoSxt zZkppYyFLJ;+x3VXoY%C-tD#O_TY3b8dP7`PQ;Tb=>4R|)Ub_7i_FbpMAmhIQv$*y# T2*g`@00000NkvXXu0mjfs`n70 literal 1552 zcmbVMYfuwc6y5|zBZeYA21T*UVn?)W_L0D5*Mvt%0(1;Sh!v|&-RxcRRfjl{0bXF{c>8=f*r`5 zhc=M(@5ZWrqfAN zSiykb%1wDq5zMDnejb~0`O8K@On|!OqfxUG-aZ+(Q86UoZvW;H<~DdM#k~{ z{|z6elENaj@}Js?iqwLPET1-mx_R18z_0d@q&ABsFL8s~XcOFvJr0dV6Ap)mmutU- zAnlwYd!8qB<#zejmQ%R?P&oYgop~+RN<;{}l)IC$y(#?^lW2XkJ`jZI}1^gLLOgdZ%rUovCw^z7E~ z!l~;=Cr*03x1pOj(EG`&H@4hZp>-BmZ15W$dZ9@eJ^e`6RF+g8EV=NvRs+5Y3CO_R zB{wLYd0^GRp3#v4sG)jIrY)to@nqF!?L!)OQq5({hS5yO)oSRtesqr~=HW%x%;6~? zUwmt6TLM(sxw7d1I&nhwz`{?>>-6lk7qok4Yui3@>e%qT_GzZrF6PhIVswe=+BFTK ziVm;fszPr|6 zcj-`^_TI8{=QlTZ@1CaX{P0(3DEGSfcJanplll`5>zj8jKK_fXYy0sLP5k-#Gq;Y- zyFF5WHGX4h<4?n1T)|JAO^)3)U&=2io40${H}7_RYmuQ%gVm4bA4&Z_Z>Bi(FoDmR zYg^&YKdIAX=pC`QzZUnWnT6RyH(Qt7dr3Ev)&)&nr5_%!-0hG2ql+BH_Wici8~*|F Cax7W^ diff --git a/assets/dolphin/external/L1_Sleep_128x64/frame_3.png b/assets/dolphin/external/L1_Sleep_128x64/frame_3.png index 03b2f529a1e8741ea968d05ae6737c0beb54dde6..ba0ce672f3a49a20854cb1fd87b0c505b20176a2 100644 GIT binary patch delta 586 zcmV-Q0=4~{4A%sZ7=Hl(0002`twPcO00JIKL_t(|oaK-^Zxc}vg}-~VCeA}-d4xyh z6$A+ilnTj3#I6+4P!KnCktp~B0UD^hU=U>@(NHCnlr#vavLHm#At72~M?yG7BpV#z zB)fYLh2vm;15?d>Ix}Zx;J=88e<}+@aX$knfQtq}I-m_0Qh)3QK!vlW(Jvz`ueheS zfK3ini~4k6YuW%N)X%{dOvKnMF0yBfa15O`qZNcX;lWR&S0C;eb zeU98&pE)?lH!IFbHP!mowv?-?wQ#q5Fw`cj!=-3=4j_h+dcIawCN+|tViW)aKNfo6 zB$UCyz4_kI>3_O&Qb*3+?!VAf!9(Us0(ey52(-^Qd*eC)t940gsT(s6SQGmI4RU2~ z0BfS&1+-%OIsvR&lC+|xv>X7Qx>BxHy_Z_gfr4r+k07*qoM6N<$f)?-xR{#J2 literal 1563 zcmbVMeM}Q)7=LLi)(%;5;uxBF7M+aQ-bah=omK_f&N5rDlvs_^UhiIPhj&-6hZIDI z*g2;RKf?T+24#!JI7Cf!$fAU(i7}GQk4430YGUG?6JxRuKcKrJb^F8k$1ZpGzVCCt z-}C+47p3kGM{2S)0DzIs**1^7*2~Wme~MIpBW9)OeK_%09+E{t-8L>(>f%? zT6OdCU6?Ce1cRa3wIVF5b$glGN`_>0GiM;vqm-v1zh7%7}YhAy3K zP-H78kIgY;PCi+6K}iZzC|X@zZKyUH1aS$9lO%~^1WFKk8KIBV@Dd%>^O2mS1{;hp zVkj(y1RhCfqys{gWYx*ezKDVgyIe07^O2!k$yr0AbQr}A7|L;p&<4>F$pim&PJ(XjT-D4)k9HE7imwD=Y`Oe>u_wvt5 z&Mkh{{K5F{{Y_6fRa6P6xhrqX=hL4{t318r@UHvjjk_HRjaH*-&(ONJ7UkLwj&rp= zG^_hA{BkosK6V+NGY+7-+p+lY5sUx$)S2Z0Y-3B>>bJG+d3V&S8^3+L$h^y6t+j4t*Ib3yv(Msg_!tx``>ULcNR>uEX^z$8ezPvtQ3p=^x#=rVubj9& z%{DQzBNcF?4&CYA{A6cp?7UAoiyYIe-ahZfM;RNkk@V5q4!)~(ZOKy|O`Y((wYB@? zoV!!@fvy8@tXJ8}RXc{?&U)~7HORWOyS(w?gzd-D3p_m~p!r#5>xQgzCx@Lqe>0;4 zxi%){>Zn5lm!0aXd!TmR>B8m3<^F#4=+3QoKwit?C#Ni$r`j_YC)lxLn~r>G(fYm~ zYkd^Fl;gNE>2}lMR$^bN=26ei^0ALs99jc9a)f*8^=t_|o?$VTr2B)X`1qL_XKJ-S z?K(N2ygvTTy_0fV{GWmBwZ*C*?r&SEx_o5sqE!{Xx=hvc3_m#0mG*1j+V6$L@7ig1 K+u92K4gUZP|0-qx diff --git a/assets/dolphin/external/L1_Waves_128x50/frame_0.png b/assets/dolphin/external/L1_Waves_128x50/frame_0.png index adad4f41300d50f3f2f2b39ab62b84cd3ba704a0..aabae9cae6e2ef6a7c824779422c7ea84a9bff30 100644 GIT binary patch delta 539 zcmV+$0_6SR5vT-^7=Hl(0002INA4H^00HkwL_t(|oK2HIYZOrw#eeVZm|YB;EhM-W zx(j0E2QY;)vsJ!8mc%Ntu(uHlk=<_~_z4t6WJd^MBMRAxjgS#_ndpU_dJwW(srd#q5v{lQsT-XFEd<)I+PvSm46gbY+zpTdk)@h4_lxafz5KQ7 z0KAgM8s^ZJWY+e>pw|cZd+?(n%;^4EV+6pTO=`_w)}J-|zVF}m_g}-f*EH`oM&P7I zTwfvnjOpikzkk19M9i*vP5~V5ErUJlJ3gRZz}}M`Fi(A_4;Xiulg%CA-Yw_thc$E( z$ZLB*=c9Ay{nDG1ezq=v)}nEP_#rU)f)~Ja)d&_}!i!oEc41a?fWyb6!4(<+LnH}W z$+4!AvVqau*98kQpkBGLOGCp~OtnJe!FWh{DA5IiTz^zjI+#dFN6(868#u54UICc! zG7y1e>IvsX$J9uQyBPAE*Ca_tIw$`d`RsaB dY0R0ee-vsJc0Y0F~}bxibCYt`N|mY2f@PLTb;5DiBl8bKBoMI#*F2sG3W>P5+p zUF$oDp`u{NR+zk`H{t+6v9wJA%i79)d|M-L6R@I1=)x!q9fX0#q0w+iQrV~-i}_{Y zSf3^^GzQTc?O3rM5UuuBq7GRBsKr3xJV}zM#by8kNBfxo$InM;lBNg>el0jyGz*afkW8vVF9Sdq&ge8cUmKH+`V~~}4g0k6c1W6M#jY9;kwn`co#U-^M z;lT-1UJ)ajC`+jBk@L$j}JR*i^q5rQ(1L^!Ndi=kDm3fxO$ zLbU2@jR2wwsB)9S0|+m;XY6W*k;gbp!r0XeBrRzUtN+i&i8unE#6_BvP^?S>Pk;~z zLw_pdL?sDDg0d#7LHTc7CzoS|&;!6~u@#C4b;E_6GT)@T^f>JpTrmiuz?zK=2W%9D zGqB6J5eNYHGfV)t+Gsyd*-RvFH6{E^WKWh@jBbac*l2OMD9Yuq8cl8|Q*3dV7`Mw! zmn3XGlB#hM4-&COJ$8ULF|^r;0}Ertjb<~Ab7nuld78JHZM224@l?#7btr(-WW^`T zp@di~6O}+|#z3NlUXB+fy*5vcGXYLc19nUoE)F@;Rv%5VP`f7UJd$BaG7k01f*5EW z52bO2^iej}$goD!eNeb@1Wx1r6)f;H!gv>M=CgAJ!p$XX6(=h2q?#MI7yhp} zh-6Zwq6(YTI(8H+11rZyAra;X_Y%wT`nHC|IG8&&HaSt^BxSZ*86%XTpRwUafivTN z0r+vAH_?KLqpScxWyGDf1OapzZ!wLNCLc|+Ml(y%iN3{QsvOW-I0Y2f!yPag5yj2; zAScxWc-9h_PE%-*h1wJHSP(Xr}QsC>SLAbgIK~i>koW;KCLx-z9vksBzj?qyqGdzblI(tg*SNY7^ z8GcjU^1TRhyZ>z8)o)7r?q&>xP7LQF#r-{<4Wa9&%hIHyy;|X}l;@8RdbX!E98SNU z7Fl`mkM8{`#;F@uXXbcPBQwvPbQ@|PL4IBCI5~4lTIkMC7Ubn+(TuvK3%>ZMy0&h^ zm$P2G)X=~6_q-zy=R}Vb*1TVLt?W7UMzqV&aPDCDB7g0=7xJYumD25@qxQj@clY&o zSIs#yzx$Ir>u2wnBHkSuxs|n}cKTbR7r?RAS!X-;_8h2i^k4b5rYl%izN+TtZyVaJ z#%+5J{K>ek^~_vz!dbDhVle%UJ*VgQZ62Asbn4enynFfC-s~Myf5u1sISu{$J6ugy zdQ#tOF5K0%dDgt|-&~%0fnHy-&7GE&)q(BF%SQ(~v(vM7t{HqF<<*hCxs{zoUC6!+ zb9?{!C(A7t3vxQzFKHhzrKv;fHePm4zqMuPMKJu?jn@yf|M>Cd4KHQv{^8S23oQGF z4`iKP{L7Z$sm$Eof$rQ>i+4WyVU5aW%pKnJcw7DeUQ{~LdGmN_b>51tx#t`G?|e7y X?SpCAnR%DX^?w{5SGjX{NnPh(NrwdN diff --git a/assets/dolphin/external/L1_Waves_128x50/frame_1.png b/assets/dolphin/external/L1_Waves_128x50/frame_1.png index 462824be2ad9e4e60ec92ae7537e962daa7bd9db..4adada4f3129dcfd0136f84fc06ea7f76c23276a 100644 GIT binary patch delta 544 zcmV+*0^j}W5v>G}7=Hl(0002INA4H^00Hz#L_t(|oK2EHPZUuU#eeV3AZsKnF(hbW zn60I;u~TQavNe$>ozYJqjg^Tz;0NF%7z>)6Vu|#!N&NMP|+Qc3b7N$H_1oHZ(0I*Wzk5r73Sm$0KWKn4sflPR!P!$2VINRkdS z=u5nkb`${+4jPhKexLMO4&eBWtneRn&srS-zF^kpe&CpL&bg27XpPn2<6K>m`uiG6 z${f&^q~TDxr0jaR@YD=i7R#?ykB2!&%ntuiidQ_M5qZ-UWR1&r~4!*pnXC~QeS)esv^+7U5DRrhilZJL27SX79nAl%cudU7}=yMo}YJh zWHA~CF`l8>Q{cv6_$7z_3mqXS=;Nbx2Hgu zihvmqHA)mWK|{h2r)(;5C{7R+6fqkRh&X}7#0i3^fIR1S?OH}Mb=vg$efNF8|Ks<6 zd|%g<7UyS-%^IuGXfm7y_A)rGf)ACJ41eD|t6c+!)Y2liV_;waP8aU$T?vQuaKYk; zMl)`b`Xp&yeQhd49TMG@N~Noa<)xsG6C@AN)d#~6tFB%klFNil9iGgkKXznplcvNd_7G zpwOT!c-b<0-k>@7Wkm^;jsPjcc%j z2rr9aMU+B_s*&?ZHHrm=&c;{-!!B1saVRnvD;PDro(tooj=+OKm0A=XQOdv_H-<$= z+znxXmw|{>Bl7^lwReOawb1e)hY<)nYC%Xzh{NdrvvAywz$b9w8aWURlfdI30D@3o z1acx1gu;GFks^NSZ&W9?qk&Kjz-X~0vIy&j3)m&TMpfywTTr;86GVYE>S+!zB#F^5 z%a|Sr0Q1na7c(=IhbI{W!J7?nJ;TW}Hrk$RwHov$n}Z}BHnZN4XQy*bHUpjK$fK-r zS!XDsa3LPVZHv%0FnK&i00@lo5PD4SF;W;K@J5UWz)Ud!kN^l#dDbQaPLX7{Bn9Hd zS{jc8LeV+`ndRbmF{H+3_7D+Z=M-Q;)xyOfN6PG`NR~9Sq<$_zvjh=?x+FpLHVlPQ z7)`iIhSk$7ZMX{x8%N+2?q9(I&w3>}$iV^rR`k zRF=GA0B%Ie@~w!|VKb79(TGtxQtgpgO6@=vYk`m_OF<-B5Y1TaRSL> zUISw=kepEfgf}i<=Lb+_EX5Q?7~B-a>WwVH#Pb%j9g)0B9VdfaAMAjU6j4l!_j4g1 zfM+d^szlWj>A%w%S)s=a-c4tiG8`!#^6s7(mJY7+i6sh;71o^`M)!uC#*lq<2_Et4 zG;zJam&64HLNHP?yncS1(lJ4!NqWy|&vjSsKT!EyNAip`?Z7~9OMm~BwQ~A%3YpT9^-@Y4#W>-6Unt1&3r)`_F{6CdEHmfUX`KfdG`poTm zZTFOJ{^09%t5Z*>6-#^1&m7;~>F+XLX`h?Cs&&qZnWL&T=_Os7otyeddf_+SYjsU4 zD&#r03ok6ymP}}6awhh56n#I2+*o*O#+aPyYwM~W2&FCVF5D`;@Yanp)0ew)7V-ajAV@+S(}&tKlSv|#dq)t%S7mS}%wYI-W3`R&M} zs$0c*0u2TaBLDyZ diff --git a/assets/dolphin/external/L1_Waves_128x50/frame_2.png b/assets/dolphin/external/L1_Waves_128x50/frame_2.png index a5a72884989dd01e871f7133051e0146dcd5b1fe..84b2453bae5bf2aef2ece09a8df1823edfdc75c1 100644 GIT binary patch delta 545 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 diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_0.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_0.png index e34e7969077ef4ecc5a858c3924eb7b46b37b264..7f1c84c26d091ac3284ddbb7e2b301732027b6b2 100644 GIT binary patch delta 567 zcmV-70?7Tc2*d=C7=Hl(0002`twPcO00Ik1L_t(|oNbdmXj4%bhM(``r1npHi-J`O zNelJ|EOnAngrtLmBE{mMAYvzR5X>Y_Hb_w^h~nbll2K_KEtU?ZNF8jUVir-+>*m&q zHBC*^&*A>$Cgxl2=)BNsfdU-h?6TaHomzyWCId?aZv2t$VAYQG1@K+=aS3xzEY zWPn_|!7&kyrwzN0w+P7hNMys#{XuH&i7oOd4E;1fL1KyZt`^^F}CChss?xB z(bVa+&Q9-?cfzEHRaJFwBQ)*t9-D^M$+_tGmOD$OxjN8(ZQMB*A%W?j_XAvQa!<4M zGlYtGBWO!UO>e`&^@yp=LTM<{VhmLLD{Nw_x`pcB*@&VHNX`e{B60!|$@sIR6bdMO zh_n>o7cfa5EQ<(8LVRGmzPoR-d)q(5mR2X30_(Q=ihspDxGyL_`zrtd002ovPDHLk FV1mS25BUH9 delta 1065 zcmV+^1lIe+1hNQ_7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000BzNkl(Uz?s2!`8d_5QEyxj5rlY~}~SES30fcBQ5zAfnBDN-5iXt)gt{1iqYK7ND|< zgzn4^)-)}^%Si!vIVJ(1rmP;*UvBEOJX(HqEY*$fllT#R0F64Qt3J)EYgmYaMdLLKfQCzJ zJ@vXp(3%3EjkO;C;7v#x-*bv(*B6>aevfv(vGw!8}E3j z9q9xPL~{D>z*C3TuNes(#FL$0>$57UW(iC~0FUg^>wm3i9ltJ}@66MkPwVvz2}lS` z763)@P_z$~q31}Dc4t=S)B3H}011I>2=F|h78OMKb{38mwtDpnK{|mK;O}e&tnI1! z(g}PyL!3aKM$gf&L&$Ob_Utu{kfw?| z3c;>g&woiLu#?rzzo%{K1O~)oSyqb=l zV}B?3vz3y|!Cyqve#s(IG7|Vhw9e;9&vq#iIMOlWWukV(YIH>c`E@O7XWc6}B2t(5 zaeo+s95b%HJ$nUH0IqpbcbgH(z#R8@U0MJNTbW#8aC~_Iy z8kqh_)NGzujng)+(mJCJiA!4mDIj!LCx2+Ops2&bvH~z`L8dhojwS@+5HQQs^=#L= z13Lao;p_-3WdT-OjG>kwlGansQH5ape;w;>_Y*ONoiP97NKI4kNNb^OAoW~F!5^t?L}B@w1!xaBIwI{Z j(~s)&>;`_r+@JCnH4;`)~t{uxAY$skfSg}OwcU|&H5TOnu`L7~YY zbSTEbYTEid4)4!Rp8ckK59j{wITx-X+D8x{*DS9BfY8h+Nq?ef9BGo&-G(}=wu6eN z!jbK-Z58$qfZ)O4U?B9VCLma}Lq~(%4p90sbk^T@3?FR%07?-e#X3{1(0w@IEJ09R z?)QZeD0?q7%I?po?6^1rORO0HP&FW_G6tHMBsZ8h!cLNZIj2#r?5;Wh2tYaK1@4s# zz5@U~1TO}TlmWmmtpzv!q`m?`Gk~B^+ivV23`H|X^Z&n0A5N)U*OzT4nQ-xvs)i5<1IFw)O#5oBwWHXUe@{1{c$RlR zc)eavwqt3ilO3&}-^cO4QMD4>NAKSe`}s{1qgiKhKW~0wG=B?S0cm25GTBN5Zq6SM z&>6)-XJ!U(S{`6?R1Z*G5A_JBcevXVy9Ur7U#w%A_O7?;Sd~85na?U2%9VZQ8UPpISQ}iOy5HufT#Hly_v1e{#B78e~1^5`o!}9t+i8;##d{tNs+3W(Q&MS zN8o*ql;y^t)qkZ?BJd*k#L0L#&9z%~X-0=G%kEQ2ev_ioNo*evsf7Bazp5PJ@C{?bxc7I-GCYMhcVROe7Mi3H#RvzyV z9{8bkcmi@{M%&qwF#-x?0NUdmSN2xNXpf3B8o})R8p9HSIHS$}PNYrTGnWWlfQ%>Y z1_Oye?YFixNaD^bH@Y|+tvy+|vA6~xz15TQv@&Qpq~50)(fywV7J*(APZESuo^@T3 zC%X)k2!8|_RRB^lVz5Nu=7b`FJuUs_$I>}ZNP5>;*GtEi*o@5N8D@W$kO=H(>kZOL zmLQBq4y|=hdL3=0cLnkQQkYlD^U~gZw6x|~kb6mGSDnonAy^_1V5TJ?Dg;XeI?OQW zXMiJtJS~a9p0WbX zs7K=y`&1QFesYoC{Z$<6Uy@C~~dxr2AL!`BY&)&>l!6#Nh&5JG@nfA>FGFFt(y8vyrT4iY35?v8NhTK;YqgL5n**X$PKl4hP zQ>F3LC=vLL7AaeutqnlZE%b%Z4s2}z6n}06yBNau24Lx)9hQad4d6KZKclj;5tIRZ zgBZbzlmQU95v)4vDeB9hRW05lvyX6Q$^#Ij$l>a|k3)~a?}Yc>d{usyfL$zJV|7=r zvBX~s*S4M)K1=-TSia}*Y#loR|KrH)p831-w6@a6IG&&R=FyCX!QXOPpW)Y2fFvb) lM#$se+Od$z?;z@;d;y;_Uk6aYj#&Tz002ovPDHLkV1gAy`ey(D diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_10.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_10.png index a28a21225a8fee13308130f7a7e935ecc60a85d0..ee9424ee54113585ade555f3d4845bf3828aa176 100644 GIT binary patch delta 607 zcmV-l0-*i53G4)r7=Hl(0002`twPcO00J{fL_t(|oV}CJOB7)k$3O2oT zb=t`U7j~Sd!|Kkge?W73=fm^;zR&x8-WUGIr=n$I`EJrE=zj==#ntU0G(e^Vz{Q^1 z9stI>YO_yQEsTClU{EQNeSO`xhSg*lP$IdKVU4H89~^ejpdssMd#O9y@hA|vT6Dr%jmN-9ybsGjP9&7LDeGC~x^b|O zN4bz#IdV3Q27lK}?MMlN*@NGFfY879Q#{ZgZ`{cPgq8Wn;zb@x{FC0g6J@G`#iOT} zzYh*)?Q!*LAHV$y*YCjkvA|j=jsffrAnn7TF`ZBXIbEdF67fG%c zikm0GOS@N!vA`}`iQj&2sxI+!;_veiarXlN^{~(Y0f4fd#oJfGMDu~6%vvTv85 ztC5ff5Lgp40v4#K37}I%ytXi^aDY_wkTktOYb2Ni{{X-1{g6O*M9lyI002ovPDHLkV1i8tBNhMv delta 1201 zcmV;i1Wx(bjQ40O)){a@MrafX&pU9BW;#z8xiiDM%!VG%3g&vjk*l{gmvJ>7xCvq%CQ zjwHb0NCF&=B*5WF0!+Yt-`9QL@LDUQ*?a7?dOS!1Ov2~$fq&Q9b2)j)#pGfMyK3A^w6&xDn0R*tQ5L?ACd*F%XQ#&~NmElf{fEG2-KrCvrS5&E%Y3y8Y$ z;`XcwZgqQdYtcj&dWPyj*PilP{Z{*)etR*M06qJ6vGtH3+J>yt`d#1Gwk{<4m`Gz@ zPHF>BKUlvRrhgG&lyLKqAljZ*Ct9&gkZHE49&ewR_>)3WvyEVi2AHARBLhrr;Ky(R z%naFT*XS*q;263E%#PQ+x**aQk8rEo)WH+t%tt!V~qi1>0l-XMp`FmT>ZjGSrr=6MwB*ZQ`u{SYv6y5Dl<$_1EwS z!_)#CO9{XxqdAwIB+)y#WSzY!&fMqym`Z@_(&KVjCOY}ON6Sf) z|9>$p3Sj#t+bg~0dv!odR8YHTExPcOLFJ?yxAGaIw80btSgV)~ZpLIYc>g$0Hqj#l zr5&4mSwCu{*ON^Vfsrg({agF&f=ITGWdQ3kmMto$g^pWg0^f#HHNj(wLy5s9`DnLNuz%jkKtddP;|_u|zaAb%PPYMD6em==ju`5fK1`sz9KLSvE9fM*;U zUO@nDU{S`iPz#;!Gm&Psfs{NuYS!9}gnTXA+IAvvb{LrZ{!eU2fG2P=DZW+&da?85 zGr@=M9VY^Nu=B*%u#Sz75P>at%LF6Ha|9GENU_;^9`JP*Z<13N~I5ae`0XnKGXR@(_<)IbSv@*i^whHU|>U+31q-pKXX zod%Tv+ACF7s#TWPp6!SeNdO5jYAV9e3z&($@Q((VF-awKd&BBFjikQ;kO~x(GQCul P00000NkvXXu0mjfMlwBJ diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_11.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_11.png index 3d94c89103c538422a75bf4cfcbb919f4997c1fe..7400b90eb81aea8f85af46aabac06d9f5001f48d 100644 GIT binary patch delta 607 zcmV-l0-*iR3G4)r7=Hl(0002`twPcO00J{fL_t(|oV}9GOH^SL#((d7?|ejpGa-a& zd7&09N`{Ieurz2BxDcV08>vmSDQMBIt}P;WW7w*VNJt9O5S0?4lN3&2;3AY&kWU&~gNQit3 zSWQSm(&Taa$=TVZssnV1RDG3BUx*(Y%wU2A8a2}X@(~4p73dZ5q{*S7FEXeNK>i;zf|~n&I*(&aSj$*riTZ& zS339mIZ)o>XL(Z?O&=a@yKmJz)jRRE{yXaRWHJjVFE{i%Fjb>j&(oR-jZZhg)lYlw zzKA_s)qoF~{QSV`%+53Fi)sP0edO)Q2@5d1`3?~$G=Hr+)W@GxXm663a}zFY?=MYm zPGEvpI<-=P)V-~Z?uI}{s&kA)ltRg;_1|B_2Gn>i0030lY631m>}j?ExI{>y9JpMo z*m9zP+gMeJw20Xl0W?WafhwRwM2f9`P+TKnv8mQgt0hF~m_85h+W)QPF6& t0C3P$mWYJ0<=+;mHZ9X8$^uB%fxkeC@{?Uf8aDs{002ovPDHLkV1o1S9|-^e delta 1223 zcmV;&1UUQb1kVYO7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000DmNkllqyrp| zbb!N=4sbZq0S-qxzyw^^Rj%t|uTdM+-_j4su^=5_5?-$tdw-3dQ{!=cw0@|Mgmi!f zs77iHc3s!6!RoctPFm%h16lDZn-qey2}Ha*q2o3OkV0NM!#XV80xE&w4BS4`42)z% z^*|(xdxrFo$Qf#nFpUHBglG!ucLP4m}UG{zJ(W9b!lbQ2*d5I^?CbA zfjEWMuN@o7FBj=>Vl9 zF&u><5n#3P>zHZWek`p7RuaekMPRKHtcJBhIFfKiYc4QRjrj^Ej4m&TuGnA zJC7#tb;WB{Htrdk6W7;6#yFCP#lA1S+Hi%1Uej%k&^){{A}Mh77ykVdv+ zT7Lxi9YCr5*EZhOuhjy2`b%=@K1{O-2(QXO})XKOtEus^qe{H+bB+w(vQ>~LKfNdMCFV_yGj*<5=eG3o= z-=rRJGG|zN989s=_%n&;Q}MVuKrcAbHh-d$r}aSm%K_;?@W-6B^O95-F{Q zff%^odfKU7VZLTm62`{9vqhiQ0%_?wPWL65_qfw)GFhSKxrOr6Ms2F zp?Cxdj9^#e?uP9+KrhfCR5}EYuW|q>3`R-Px8t!65KR~J4B#DGJHRYMr4#&zI}2Dz z{zjkuCqChFfV+%gbp+31RU<{RcZ{XiE%)}Js{e8WrqcEH0Rw8wgkD*bcFO!N@d(|82C l1&lIS`%fQFd9kNOt-pDr6^VkGuVDZH002ovPDHLkV1k?YF?s+1 diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_12.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_12.png index 74e0b962c55e38a6a8576397ab6a3e8fe38c1c77..c8779d6b4a89aacbb0f8932fcf8a0a7658ed2e6e 100644 GIT binary patch delta 606 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 diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_14.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_14.png index 42f844d3d73b33f409350c8b9bdb4b12d17202ea..7209b545fd4f851b2625f5705dc4eaa17d19fe54 100644 GIT binary patch delta 517 zcmV+g0{Z>P2a^Pl7=Hl(0002`twPcO00G)bL_t(|oQ;z|XcR#d#=m(tn`~6bT}W{; zCkC}h6VeJPvO=0bh+rBUK@hAg1RMhn`7CyJ_Z;uQ*UaNL-}~mxFi#PGhro{ABE1d(!Xjo#5`RIVm?lX*T)1wkUZ#?$ zETs3bJ;2+=JI}jGV_wgV0sz!g#(?0+)yt+As%al+=p5TFAsOrkb6%6_~Qwq9F$H|1xx;m`^3X>XdUO6Xz z)Mo;m1(dgm#((~)k&(Go4+u$y2ZCtnb#?3ofCxa@DNNN0$zRDo*H?`v$D_)-MIVv? zXbx(8cRzP-J~I0nf`>no0oRAQrYcMwl5Ep56=;0AFf*(m-1QYWV;hnfMv00000NkvXX Hu0mjfUDWnK delta 958 zcmV;v13~ZI7%V42AK=|NocS4|hpAXWP<(I#~K7n{j;sl+$uVCv((VYe}}{-?tl(e3!E= z9LMp^c7%o|+10M|S<3%LA%9h#sIJ-MiBD)GyF`UhDr{ zJ<&bLsKBqjE?ogoXvc9`0Vh1TPpQluBi`GYQf8bH#Zham+)P#U2z&wzj0P7(7Nh{` z?W5t!0Ld5_RDYHr@SDbyxYh6udT(qQ4X}1VlTrD~UGlQ#W!5FcLLD@~2}r$Na;Q+W5E2wunLUF$8EQ gncL!ZekrB=0CVNU0ogAB3jhEB07*qoM6N<$f{WeCcmMzZ diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_15.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_15.png index 861b16c65ef501353d9f1a34e1cdd0d60ba00187..b7725b350246151a588b8c36498d8cd0a4ef165f 100644 GIT binary patch delta 520 zcmV+j0{8vP2bBbn7=Hl(0002`twPcO00G=dL_t(|oQ+dKNK{c2J@3u?`nA9raWUpZ zQZ3ww+rWiCa3hF9ZrlVy(5gicxXeEgEoxCli&pX%ZIZEC34)*n7AjJt%i#ZZ?fMkh zOf%op;=lL*_!^2F_Kh$x$2teBq|eO zOm;5Y0ob2;wBC-?rqtvB06@H93`q3eUeLWzjQKz<Au{3HwoWU6z=*=$2j}9? z>Ue-_fbiB(+kd^>-#_`>145GFu|zcYu{`)5Km?%ZfH)I+@se06&+WQc=jvla((DAMK0=)WRsStgu>yyfl7Fjvl+Blsc(LYzvY~2Jat9L zGP=yKo6tFuOl(mBi7zj#I*W1Y6%8de9Ee>C=O63+c<1Zw(s3-V5UkU&K002ov KPDHLkU;%>0e*fhF delta 961 zcmV;y13vtf1j`4I7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000AhNklZI7%V42AK=|NocS4|hpAXWP<(I#~K7n{j;sl+$uVCv((VYe}}{-?tl(e3!E= z9LMp^c7%o|+10M|S<3%LA%9h#sIJ-MiBD)GyF`UhDr{ zJ<&bLsKBqjE?ogoXvc9`0Vh1TPpQluBi`GYQf8bH#Zham+)P#U2z&wzj0P7(7Nh{` z?W5t!0Ld5_RDYHr@SDbyxYHQ$PB>Hp8oA1f)oHj zdN(n$5L_>WL`Hg)O|wD7Ympg%(0lDY;;@hc0D7;zMH7MeICwYrkI=Lq`5Q%<0TgH^ zh!pjdvy{)Y7WG6&!D|yK`b!~0K(rIPk~(PPJ|%|$BT)k+e>!$^%s(8djeomrix?yy jLx6UYxh-Djmr}|PD#*tH`i`;^00000NkvXXu0mjfONP#d diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_16.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_16.png index 2f4b3b839c503640240c59136155cdfe758c9b68..82b1feae09a5fc3b86a2bbd0283bd3a8835d5f13 100644 GIT binary patch delta 601 zcmV-f0;c_l3FZWl7=Hl(0002`twPcO00J#ZL_t(|oNbdmXj4%bhM)7@V@YdkQ|M5& znm7m@tm&d?DJG>ZN(X-iK@baq;1&cO?e&K)4y`VZW^l1YU7hT$xL5~^f`Ws+wg|-~ z(H0EpO+JTvZ_-|Tmvead&U?=HbBwZ6LQ-CPTLchoE3c|bsec`jQ&qLSZPyp(f2Ptf zvBc5p&ImO*cL&(5i$yFS?vEWg3&5}qGEhEaPxk}hJPq<|uBGexXnGRB@twK71m6EPXKmjGu~XsZYyScFRiZn#Im2vG9?6smx58HcrF z7hVI3AXM0#>b^Hq0@nwG$6>oX$h-lB!~7iC%+^Ocm~f*uc(nsJj=qG0;ln4P>y-`t*wm&9$CV}^bAJq(0$5-o_3O#ozCkQ=VEOcI zS-a2g^Ic#>LsLt-Fc79&7bXLTo2f%Z2v(s%nIV`~T~Yn}eY#l@u;79ZwI5j!aI`g5 zQ&hLlN7W0H`)!Od2FQlVkx^CEY#bMNE*CcAYRh9iT3g^x5^N>Gu0jHIE+>Gqo&e@S z5_BZM=2D#ms3)(DOCV141M6i>qN=K|WHJ7f+2}~`ioY=3 n3~JRlxl}qkephTNni~EAr6=YQt+*A>00000NkvXXu0mjf#EKJV delta 1151 zcmV-_1c3YI1c(Wc7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000C!Nkl}E?TAgHJz+?UB1H40Y*%(PdnwU)$d@n`n{5_|EvFRts_ zIgZePM)ov0e@gi~sN4zsaLe~ZIe*}n)7Y8t#|Iaj#?T0$7Jt?$i!GhNm*bZOxN!sLt;-&dfK(3UHQ~pupA`|falNEI!cPu-_JrMBF@$hCvz_*xpLW$fJ8B&<+Ae%=fcGzlQ>-`aXoTPi}3 z%Hch#OoBANk@$MG^5Ju@>oU(Bj!|s^@HO?lRZnvGEPu|R=DE1P)+ZOLYR9t6k+p0I z6baG^9K=acjCLHb-n2~M2?FrM6GB++cwoJuOdyxkiH1`Y?163zz&U-s@rX}#Bk4VLh*6lEAled22iX7sTWt5&JEY-+9RGl3_+9%aFk%|C>S08-|y z7uHN$DSzMF2DCe#oZJ(XOtWZhcnURcg0op1ujOYxe1 zcZQPcFi^VQi5bH4T=h~OUMgQDU)2jCt!oW_r67s(YR$xPKazlZ`k?MZ^n`z$l{;Y( zEqN!_fA$~~2Gg2FLWhe4d6t$!1e>Ypf_5sc(HX80u9K1}ZfLWjw6 z@L+}Zcvi|pO6C@y{I%*!WgMuj?nIcJKwNH7uJ&lP)n`jF)DbW&$K-0&$M>v+?j^#i zgC>&`2)}E?n_lcbW#cTyXn&S@^*FdzEO7!Y=Cox6D1lHWT`HIQ)*Nt+5W>2$y|cgP>x+imIMQN*yv{4!qJMxl?4_$PLzW!L@~2^oU|s#IFx>*2@O^~iWfRRB{NDni zO>8D2JB7IgDDl(<(t4FY|8?xkq5j8_tsgYJ;akRoEcS@95h|C8C)t0VX*c1TV!yrsp zKJ0e^c=8d%TYoj^&B!csKxxDf;6!Z%Kz_h5gY^NV0_2PVa$b-9E3`PW_58dd!(#vsFS03y6BM>bgTc4j`KMm)+w#t(_-Ob<81z)Rg>R4kdUrYniv;1% zVaTohkkW)#0CGT=|FHBP*NjXN2Il;Wi05|alpC?;FEowm!&a00000NkvXXu0mjfgA5O7 delta 1073 zcmV-11kU@u1iA>27=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000B*NklFAPp!3<#IgAE?G7Zqi>oC* zpU*e@5gJsWI}^|2!W*kGG=Bm(!CFPw(g{2qzcfI@ zDh%BjJ809?0EZ(9a5%aIsI~r3Wi3tb<8$d5me=arL48Jm=mRuJYgc-o`U`Z;YrW>$ ziSC1p5`6Z!bO}H~Cyvt!81Ue}r8-ZPc<*FNn(+=PKDE}$MXI7p;2S`}XyAm%0!e^+ zc{I2*Kw=CiRDTvB$f>rUfL2 z89%K|`)KWOWvuUDb^?2B((-9#k-?l(i1l)LENs{MH`BIC52pGBeuznKb~{ zxYQX_N6 z(`L{UFE`Uc`ZiXGWLj2gn6K8_Cjb|-$7ds*<*|qxv2RxpH-A&pAZV8n0{zdnc!-*6~_0 z3DO3VR!4+5hR3YA&IFw{!YaJSEsKQhdF z0o;AhAX)NSNYy)UK>HPMCaZ+NKj=_ko+`6KBmoGd^Ma9ykOcS-X}g$egNQ^(0uX3t0HT_OBmkgy5F{E2#8B|5q0t8I z2QZPwCN+QpstF=VJ;hau{Og#+@3Dy_{iP5S5becgBAVT&NE2X0Q~}9<9eX&;|0+0A rvwx>Nizp;NOn~;1`7GY#mr}}Kb>49bPpXFC00000NkvXXu0mjf0z&kX diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_18.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_18.png index 0b8fe650ea9feb34aeeb719057b71ec175ebe8e9..3114dc5992de4b0e7f340b0527b967e2ec19c884 100644 GIT binary patch delta 556 zcmV+{0@MAh2)P817=Hl(0002`twPcO00IC>L_t(|oQ;z`XcSQp$A9zoMK^Mq3s^)G z$psXyiD#okn_JOF2!dJ&RslgsClF80|z+RezOIM^R8!wL=}(73pVc znv#U+U$zhUaQ4=VZnAvFp56<9Jktsoc3qi?dr>L)u-w+ls)iM8SN5cBjAMAbw0?W? z$>0Ud>X!G;H_VCmAX!t}n*Hh&>e&gHj<8Rwwo?Ld% z?4yS}5^zjub){I~l>6(!n~Vz}SU!H)(9F60VYSQDl7IDVHUZNOhimS{!btKf$-|tg zE~=`w)PMyawAQZTD1b)e*4z6L_tG@*M?^%%qVcy3jH{|@*q((o5fPb+&XxaJy6r&J zm-yQ&Od1TN!JyY3E{d>Vsa-2#pG3Pq*BPmU@du+ uF|b4B@Fn$Jt5K^YDQ-4*a^6@s*_wYcsk^C5wSmR}0000<7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000BtNkl;c~1X42AWM@Bhm5$1OA2Gzlk&E`)qDopluf;UomG?O94GN3t#dzFmRjyIl3) zJkM{|BQ(^>&eqP?as01Tjs(w9+jquxzUY_P)R{cb#ZSzp(0>R>hBb?^We~VIe>^~C z7KN_N3f?q5z~-a?Hm50oQp$%btH<;_zph>5_gnd`;65Xu#sC#|u zW8v}uNgv#(5Pu_+#L=>T?jaB{KtUicTnh@dPwQSQNJN59tz3TWsk>G;54NQ%8{C4Nla?v0%$Yn ziHAdjnH88}B@>yc@pPq>wg99xdw$K!h&*QC&TQccdPMO0cJR!vN9_nC0Bhx~m!3H? zU+I!o%73(L$UXeHRsWf+--{~-sPKmB>A+eztq9NCLRwDM(rMRe9_UKvDtMozdnIrd z<&Ut!o^9C(z(F8)pZpj>+6nXQj!E^Y_x99<=V4vf@`xaWSGI$_ozt_&Af=IxTX{t2 zR8M^3dMA)KsJF4uovh?NT<-+ZfC*JtPjH29&wpAgk=6>OKH{Jt{|{}r=P8Rdx=_3jQ@&MAyAQtG3 zRDaJbLR!n0>Z+ZmvzS(($InUiSsiE^$d5gnCnFmSi6vUYK~Fx>I-T-J5IC~YzUg+Q zfRmn&z+v}en|5wtlefXzt(Y)%S*v3e{+L4OwHQUIHi0$}vKWxO&e0D-zwxq}E&00iFY zJ9vW>z%SYsH}wV)g^&UuSZ_Q<9TrjmjMi&!(L|u`1w>sFN3nhZCQ{p^2QZ+XAd=Nn zuH*Q0Yf&Gx7v46Jtp7O35D@LbMiOn@r{oX-64gNRU&n3^{Es88@o$%F5sl{B-~T diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_19.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_19.png index e3c50e3088fa1db5437386262897f389c51da6f5..9c79cd16b49348e41da517ba366e1d1bf6e893c5 100644 GIT binary patch delta 570 zcmV-A0>%B~2*(7F7=Hl(0002`twPcO00It4L_t(|oQ;z|Xj4%X#((F&Tl*@}q|hPS zN>fnCQtP5rm%gHlPy}@loFanIO&nZ(R&mfpT?7|1xL8vEEMh_MRTQiaih_d(c_@Oo zm_n#&O?n*OOY#y@@J#pq`0jVkci(-Ybe5sJg7)$}fYEkMseh_cY%3;IRc*TMx*)ww zO+%VxdbjNX-W|LCG)YQF?U5k>jWjNF1@iVfWXamnj!OuzdXTK~u+fhSh|rC4b}DOcTu19WJa-9{>OV delta 1114 zcmV-g1f~1O1mg&h7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000CPNklByw;Pc7F0Q(9 zp655)5gIhf&eqS@ar|vm-U*&V?cW*u`Jz8&V`t)dTztoD41bLPDX?YvdUTKat2GHklU5YAZ)kVH}c-9MSPD9-WJQ2cAK&M2WJ4O za;-5|RBN5>5ras*++OQjBH|s#NfCbsJjy-gX}dU51b+^MCi*q8x#Mhj1%hXk)L2haR?)Q*4%V9mVsqGycE zXS$@BGJowDat_~awST7Q_rj$CDtJfrIIvbu8^Uc{kfu|$a@uif1D)wy1>S4vo(Y_V z`6HsRXIVA^U=hgEC*MXOt%P}2$E5bub9>stZCJ-O8xe@`%5t#RIX!C(QWZRNj#orrD{A?E%lXn=f~M##rEl3r%g+on zQ{57Qd>;iej6%v-?P;~etL!6<1W>?>L3O)l=FW@Wb2P$uwTf0gA~B#0AUzCX0bP;m z8Gl7cbNNzRwf%Gy(-L}opVXe!0SyEBwrBBVWQQSIqIEmyu@lYd6px6&k)8Izl=22=b*&SSHlEEcRtlK!wIl*dPGI;s^s9;Har8Y+A%w07y(v}{Nso> z$Iqc%TmFrp&5;Dy97%x9kpy5^UCU4)6Mu3^fX$HvVCZ?ucx5C31k{zv9Y~M_AmC2l zAsZwC{y|&frr97O5t0A|))P-rZwpBPhSpdT@T!Npis zlM7dw(jvmmjDb55#D$xJ+C;mgMbKs(TNoG-6-3bH5iK%D(2WHWzG-2lL6N(te9}g! zK%zovW=@Mccizk}XLIlU-hcjk&Use}wV|nxAlgm9#7<77^L}hi0zl#1cR&;OVU9W})jd zz(Jrxr47f`=znd10-%*2dGv`$N&Ncu=079Lk3RMTkks7RHPefkueP|XXE>iT z-Gj-kYgv~v4x9$UWTTm;jbTO~noC@sT(HE`3?z~-R-T`68cjHOXLRV@0TsBZp93JL zDvFv&YR&q{%u+;*A+!8!dv^lMeB zdOi6aTZ1~;+2;9u9REJ5BEk32=Xb_=e$$)Tw6pMiym`TF8h^S2B*U7;*op)u$1e}i zF^h(-j1|0Td4S|71xOB40a|PST^V(0y_`O$bx=9FFFXUt0Vp~jpzB#{ZOhANUJHL4 z$bdB5#lc((&=C=wWbx9Vs8Z11oiH*UWK>t<)mm$kb?zpFJ0Ychqh1dgi&ZCzkOwH} z&;+juOHvNY1AlOiHL47z0?+|a_l)8@Z6~>Q{=PFGKMOn-uXzAIepD9;oGL?fE<+?x zd&ZSOx<_qR2A}wm@gUc(y$dN_lta1l0EoR(0a^?nEfrU`e(ue#Qf4Yh&-`$~N4}#- z;2@+>_ANyEh{~`sfdjZx_`N@`K}J1+D-(!*QD~6dp?}qmXB=nc26qde_8SQaUL`OU zKw|dNGt|c0&hy@<@s#js|6Xt4RRT8&)Djb%Kk&}c@^6&5Jc$`rE>|i+kw7PA+{f^K zkCtLD5|{{*vV^vS=}Y)8>cDENkwsodt1n$^WHVyPGg^NHTF3~IK?Mu(B`^blRJd39<>Cyc>wtlv?PpwA9)jwul~TkG7}_AGj32 znmF`~3tkcqE$7y49j=Iy&S*TJJ^o*TB7q84QGb9lM6gKU1~@|mPh|qHBxY8|uW${* z%Ro=2P0QMOh?&&S(;+B}0)|2WB4*rrN6re)GU0SAPb=Xa2>)pqFGJUwg?dd z{b;$3>h$ZBnZVtI&tZ94ifPUS-qlaxCx$%$Cw&sZ>h-j?C=-bK;ovTfx0S97A6&W} zEDK%tO5meY4;WL3df%A|opfXMG0jx~f z?ntQs(#j&MHyAz;vJ1EpWKo1Z&h55?CC=i>MR=B~J7Sv8&%SXFj6zb zeTwBmz_%?klkksY!G9e)DtzzwGHixXxc_maW_fo#J0lcpmn=ifm+&J5SO+hjd^Rc| felS!^3T4D!U^UI(z@aT_00000NkvXXu0mjfYIzRv diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_20.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_20.png index ae6e765320468d8e8f2d65e5f7733beb50428158..96a1c159bd41d10a04b93d239af69b3806ba2105 100644 GIT binary patch delta 652 zcmV;70(1R=377?t7=Hl(0002`twPcO00Li0L_t(|oQ;w(YZO5khM$?+)5}H4MT}sT z6BQIwq!UrNHI3M$3rVHXAE2dzklTobg`ij~(auImA!4JuF)6h1EYoN%{zc!(VhxeG#hipL1m2sU@?y(#yjg? z$zkvMfPE!xTpR72y&;{Bu;?{k`4JZ$vVsR5rpCh7B!3*gIjq?#mck-QltNi?U;*rB zmmUr!_c^IOjG1AmXUVPXSd;I__9;ZYn2u5K>+m^;fl2QbnM^+l52sMAcbYtLfvA)Hx$pOM$ZPYxuIHm3pca7^yF%~G002ovP6b4+LSTZGFe;1y delta 1144 zcmV-;1c&>W1%U~W7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000CtNkle3rp#%BkmJr|;KQF=waEoupim?hM!0c}SLXKz>{6ra+JlK(t;SGx6%`*MIu}$ULJ6uv`K9HXLf7)AkQ-uG&0DeWFw#WDmd=6*2Zw9O1n z9@4Qv0`e?Cq5z)ctbI}Y5sRHw`FfXIw*qj*r;?ckKe`96?N3kxDo#nx{ndA5&Tay5 z#kZ&d_dp~w36MFjAijGEpdR^Z)LnfgCie&lNd)mI2o>P+NS>)3Iv5_8s}n zgi~{N5r06s`}f|)RU7^9vjK^aOs&6&oFm{`0wj-qkvs9~ld_GHO3DW3b9K&bTeXj3 zB!EQzBi7;SyZvqE&+-P6q%Y?)GG{aa%%=e9+OM_QLR&E8@rl~ZSxzIK-1>e_kDcK||#>iUF0c=@j5CdT*zN z^r8eMsa9Avf)VFpDewvelCyvNt;Z_CMjXI#&E|pfotpFBy z27I*JkMgInkC>%iB3kO9CcsGkJsUvDZys1@xmO*cb3k%ZrN4^VAXJCrSM0H|1~Sgrp_`yz6S2224g`v7hR)Il7zMXj;c z|3+>5@hF9!-PYnGH{f9kAXSNWwoq-V?|=4tHuO1ba+@JKXZ0IF+)E&m=i<{~h-dt> zf!KWSrEBK>)7!vj7oAin5D9L~I_yYe)cBfLV~9^={NJOYti* z5}y(~T5(8i zd)8>{SZaLyXw4Jw_QVneE>4dvPb_TP z5~u)NP}b$a8pA4hWM0zNS$(7=Hl(0002`twPcO00KfuL_t(|oQ;z)XcR#dK;QhmGv`IfrHB|o zazavQQrKxwxGiF-rZVYrrIm;XvC6F`V5!(jNWjKIG?fUVJ75Y6Q4kTE#MMFrVqA>j zHs0QTi`~78sr)bu^Y;CjKl>Q~DEkd5ygm>iggS*n+V=?u6Ta8@!<&E~SN`l+qyxdQa&6_vVWq(+<>qj`anjSuV! z0mkx$$-s2yvj+m^K?k@g=o)E?vjPMrD^;Lf-)q>;s*+wsHT`3%Aqez#{SpXlcY#d} zuLD*=;GhMp@qa+mQ^qE9;m=JFcz-GfJDG7f2k%la-Iwn=VE~wV-KUAFuhF2U#?@a~ zP+pCAP{2HXcFU^)xNk$_33_4k%CbVW-7{PT!90o%Y*;YY4(+ReVCsRhlR)K8-N6OS zR6}huaGLX)%vwO6sD8UV6rY||J!uh~r+ndi;M`@ELVuM4?HWs4=V9b}zt%x;mI-YH zWevOpK-Q9I&{s{?!rEeh;LIsu6;Bg_6Ce~l0JT{kgcdO^tn!f%5Q>3DP*1!h#DLJs z8>ZE?l|}vup|uzMhjGM^ZRh$Rw44d=EWj~tTPRSJ`ShiHy>WjMptz=t`~FFc_x>T`{o5yEz%!VJJsuN{HV zE5kc4)EKwFvKa!D^&7Efi`4r63RaeRFj3UsssGHted)h^Ko~QNRmp@m)o>3ra z-+LF^JB_dC0Z{NJU{3b@GYg*Q`TH+B(h^{o^jnaf2)!j-0)MFTPKC4&3)`zcGa-!v ztY*AN0-}*k5mFFuWbrMW0H2ur7a4pECBP>q|3$Q~VFak;|3jqDAq1%8|3sAU z#|aRT{MQBt5rm8&!BGO#%-`d5ERGSNl26CUm>eNMC7+K|u{lD3N`791DL`S56LE4U zKqX%X?|8Wq0DoHh3p{v|z>NS^_}u{)0%S|R#CA5d@`{}c0Wu}Ofa90~6!h?jqd5U8 z`FFvT0F``ySjW_q0JY`wfoB}u6`)9;U?=-o)Zhk;@ww(Qh*JH}Bq$>MkAFEP*L)v1)&Np6aQ4WU3Y^$Bjy5Q>pW_?F zCS-?VYXvg}5EmgE*BkGZvx^Z{zES#?LbMHp)_(4QASr|19iLlCsua88Q{tP{ zwgw^s>}I~#jKy{W8U>QJ79O#qAJtIn<$)xMWK zPJjOvvowN;Y6WObSIAI4(?B}Qwd&yQo7K@Udlz6W|G!0kSGd7969p*Ti;xBS33(66_L<4N^j^RiBb23$sfZBV}Shkj9c@ zD$g{P@+i_hQ)TpNHQppWIIigaPwmO*?QT~qt|{X+`N#igwe`ip~K4SRFjoZ zx?jLz5&*sl7gvM?xHSU+NQs+POb^Eu0IVSkKovI+j^5pJ_UcnN(7*6}0w@_fwXkgH zLXIt+0Z6VoAxYZol7t8n9>bEMhjR>rgeyZfeHVoeKYyAKY*GP+ZAUTX`1|aei%lRiZo$y^?!;KzVcpOmmuDH0q)E0&39L*b z0)YE26o9laXW3~Rdf2NmL_>a$a&r()ho5#eKu3XgUyL0vApi;bbFr{ng>a!jd*IkH z2>_~P_-QFCcFbF_+G?_Id;s0mvc zpAx&iMjHTzrhz1YWsm#;0H#kKLUP4-ks!%M59lL=dE)TM5Pt#eCqGzi0Xx6|0000< KMNUMnLSTYXBOyEh delta 1011 zcmV zX3Z{@+VD_$wWoj<&x{=-dX4gAzPQs8fOBDX#*^&0LVs8{|HFn7z6V#MwWhNrhohf# z1}Jqa^)Go^wv6aD!$aN#YR#ynvun<;$-~~)-UGCFdd{cVGNRiI&qqr*1svyxuy^;( zaXzGzvS(z6pt=a^1r68vPe5r0g}z2>xe!{i2bgjGj#*$fh*#S5(U>!_nO6GFU%3Y; z`MDVYqJPJu<);`3|0YhNE6sdT&hPPBOaYKjs*H`=Q`3>cW3~s-xbt`D6*PJoOWQ6i zN@g}pC7)KqhmB)g9l1QE4pMgYb_iTOF+TLmp`+tpjZZ5GN*UU7bB$*wyD&X#P?-X( zoWBd6Y?t~T;O)*2p`8JwfIb#Jy8S!J`F|nc_ReBZw~lY{*G)v(%Y z3Ca=zn~OCr&gcR}f(Pdvs>A03W%Mt+pW@R@g zz<+vn-Zp_F{>$1q|icGjwqw5SPr!jnO5 z1g(OA(#2_^W?rc&9u^R)km9+^Rb-q>x*a@7>sHp>2KDh~W z=i^vi2C@!Z`RFr&S!l-U^bhse4cX2e%0UL@I+04iOyhS-1_)v7I%(-amECZt$#002ovPDHLkV1jZl(-;5% diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_23.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_23.png index ef4876275d1b45266fc7b2d6c72f04eb52b30bbd..df827d72ad2bc698ad1f132bce55cb08e68c47f7 100644 GIT binary patch delta 575 zcmV-F0>J&D2h0SJ7=Hl(0002`twPcO00I+9L_t(|oZV5sPg7wOJ@TUag9Z}^J`yJxU~&P%BSuM}!qXIJ zT3(L>1q<~r@a7KRJvq7OeCGoHaS2ZW+C~Xaj&2*n**UqSqJQU|`AkdalrYz*nSC<@PDN(LIi0ElNd9$ACViRMOlow!GRi!EL2#GHCSooUlav+9EoQCaR%r1 z>Tj8u{=QwF9NZhqz8D64V~$GjLO0Nu6)tk1#zhXqtgua`9bgEg z{*GA%>Z50yamgz{-b#Gs$F0os^6dQ!g{x5(#wNP**MEFty+qf|$XJlochhSmSuIsb zDiD{JQUDOYce4PJ_)=n}YHatzIj$hm4K7T<6lz?2WO0rK1tuQA0f5~AmjDI(?4gYX zKmiAheEtyV0tC?gxYV@01xS!{Mmp{StWT9+-UD!>3h(+IvQ{;=dxGSW4{nyoI!TsD zu2Hcy)i~U-2_OZP-65bZB61l(hbR|jz;Tl71z-s2o#w$~0LYQ7;SVEm5Su&q4SE0o N002ovPDHLkV1kC02DAVG delta 919 zcmV;I18Drr1fd6z7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000A1NklCodlu}6nxA^RKAg~uf0Otq- zI7bk`If4Mr5d?6KAb@iO0h}WU;2c2!=LiBgM-ad{zNN%xL4TeR6~H;Z@JY^jmmdK| zz^We=z&U;upx*s)CU`e;&MD{o%kyCifXN?i2Q5)T{u%P6l!NRS6NU`A0+b2)XURi+ zs0#$%16T!4hd>GT1=a&5u`TN(d5Fs{pbB4IIr11`xa+U>Npo$A4wg_ApZ?pUAO5O? znBi6O8aAxS?|-n7b3PLw;0HNp{v_}T%$BfW(WezUrw@Z94uH}vj)o13KF!*wD5c1c zf}>-ggL|@Hfgb^){d*?vwu7(uFi4w>T6d=g&_Ph|%8}LTp;zcw^ob&WH|aAk9292STry0|e&rk?1ouds@qLfG50nIT8L$oOW+|*A_+3au+bG zH=`4C0O#md08RF4>shaAT6*0dht8hlpP;9uV_h%00Otq-I7jzu;o5_oIFGIYXOM*c zH0%y2#DAf*TyG)+jD-_dOpX^0U%L~M$xrF8Jzg3A zEdp?p|5o(g2MMes!88FP`A3XeJ1Kj2aUcM7UyS6Ru_Jy83EBg5D}VY*Sc~>`OUdW@ z+<%L8Mh9XS`LU#Oa(ZY3do2U?w5t*P$d+as2z7T>z}~jgih3#+F zCixI(CHYpNc>u&PYjgOmU|9O0q21*l`m__)ZUQa=N&hfnSMo=bFDsSC8VRaT6b!!= t%t`*rpnC_<_VwN9wOTt!z^MZN0K}6Utq?L56?Fgr002ovPDHLkV1n;8uL}SG diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_24.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_24.png index 4dfe3a02906da0657ffad6d044f26840fd297a4b..688fb69af045a0039ef9c4529ec2450a7ce93a8e 100644 GIT binary patch delta 545 zcmV++0^a@D2Cf8<7=Hl(0002`twPcO00H$$L_t(|oZV6}Z_`i^{_Z_XPKVYJTNgJ2 zLq%scr}3Dnf+2+grCB;5RJIzaQrsVaU|~U&utJfN1qF#pd68J5Q&~cUD}<0}NKA?%uuozW3b$|FIFzB}A;mn+^3?h1QvE(tj0;T0K4GS-}G?P5Co1 z*Hnn%NKLUyCF#{u;iYoE(Rw?~iBak^?&_{1l_ixWl}X+biacW@ahjxiiT$)zPm9wP z`jJ4V$JLeue%lrE`|J+GXpMhvCE}UxF4tMFOdNFLK0#BWenP8 z^PDQ>FYVUBM(?J5KMy!kO;DsVnGN1KT2@!J+fNC*o1xJ}Fq@OhcTXq~>*xW)oMD-*;sg%kvBUjywE5z&c_MFO8}@hE!osK|W= jUX+<_02-hxH6GwMB(nc=6~SDD00000NkvXXu0mjf3@iPI delta 845 zcmV-T1G4e{aMf2!`cy-~TJSKNcI#s>NSa<$aQ+*#_b%MWA;ZIp@3sX8F850q`zx0OP;` zi~|QS4jjNZZ~)`L0gM9&Fb*8RIB)>tzyXW{2QbdpdprxW41XekalZT;B6@2cKoK7G z5dn;IMSyVkBPTc;B637@?eotOz&HQtIEWnu@_Wd8?|)>!DPis*Ik*hu_mby)qyvC+ z;8Ea~1kUh2Fdn{%aaezn=VYsZAe_6_$fq2pcKp$E(i~f&liE;~IsMy{Cx2mrDZ``W zHEgUV|Aq}Bx_>(Wumcg*cLI0t>=`yzoYM%M+ryw43E=D!N5jU7b858_@ZQgF1*2k+ zQ=8e3;Bo+ze|yqf4j%C^NZT2;?oJJojiA!CMpmna9-*`1oFwwSuZ6t#Uh2(nWT_IJ z)ZIV33YcL-Qzz&VngF)>I=7Z*j?j_lX+(e)JK8$pPJf_AjXFX{s@GGax6W-vozJYn zfi5jQgsF`nI88g64WT3Y0HB@Ej5<@Zrd_!Yu*2Gs6a1Mt?b@{0mPBvmDxg)bMF)KV z;}j!+ruS;=tsd31^ok!2ZO!C&(9_acT@O`&ao_;PDZVWnjhsEHX(SDg0NUr>4zzam zG&+LUM}Nao*O=9s7`?i?&2fsJ%anmDmo6i8HOs&r-Pw9*1Q`cafN^d|z#Cz%NB7Nl z>PYok?P=)Vj)0zQyeE4fQ9ab?_I3h$=Gn8Zqji&iA*2;c-6E=|_p^|x&=KE6yK82+? z$s4)(v0Z6Gxmy`1IVNk6tX1i?R(AqtZ$7tk+Ho*?^W$+_sHy_AHvdFsZN77TPYSaS zgGO=&q}l!m__(_wS+7y+R&#U)s{Ubw=H|zCcSmF0;*4K3FZU1uYCL#`6YLxXc8HvR XGa7is{O<{_00000NkvXXu0mjfk#v(_ diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_25.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_25.png index 1f9d6ac54774f9fe83adf60e075e8e75dc6f1503..9ee5743961184e4a9751619eb56f1a9e4897e98b 100644 GIT binary patch delta 770 zcmV+d1O5El3yubm7=Hl(0002`twPcO00PxXL_t(|oZXVmYaDePho9eXerr;iWCu0A zV4AFHp|A^zrHG{|jv%$@!B9F`EZA)hf(Ks?iiQa8hzGq1g-Q=vb5Uw%u`0?|bC_9Q zE-jQA#TGVcH`Z9lOLv3Wx7nTjdgwv$Pw;bi4$tX1eBggPC4c`B8bF+XNd*{KJPy{5 zt3aOy7?eq{ChrC?Re`@(l7bYs3vB5@Q#$Y(8>TcdXAYRsAl?YNYtOD8^WTjx_NeJ)TfH!en9@O;!)mi%e{fUY|FWVY`F;~5ziEJl9KaoR z>Rv$CntT;X2%R%1?~u_TStkS%ZO=Gh8ZS?Oyca2~f7Xv3J-?;>h1~Spa5VFC%f>o5 zg-H9k+4wDymF&5VstDf1o)b|NSz+2gS8q%x^5qrxjen>U2P?aa^-j5m6jx8wqfQ*G z`d1pA4biaricJ@`&$frgK||G=w}GX1A6a}7%+%7?vGa!%*27Er)Lm=GVCDzEYrk%V zd(4k1wdREw4;fA@Ah?k4{X%u+gdLCdS$(M%!S4rR^82uoVUVJH!so* zO?S;5hQ2P9!Z4V}4Qn6%*ag7X5AKX0=?snZ$&3|_rRPQ-OVsqu_lCxmBavKAzc~Kq zOL-c%Fr(_tIH)pVv%gBy8=e^$X~seIqx+Iws(UokzSQ8hE8*Mi$(i9P?yCPE6_q#_RR!XTIZU~8g0Ip73gfvv6Gynhq07*qoM6N<$g5f%G Ag8%>k delta 1493 zcmV;`1uFWE2HOje7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000GzNklb43rl6|6k5MER}IYOP-!zfyn}VkJn1=^ZbfD9_LmB4Kuf zKi?<9mygvB-hV9qJW`28AR>&Ugpu)<@vZf_0niiH%fIoY_tJdJDI}iR`n1MV{GbbD z0tt~4R`aBw`)bDKuY1>@4a)IS1kUh2Z4JI2KV>}_oo_+o*P{czPLy-h>9jFw7eGUu zbd8MHS~$xI`1?JG$bgQu!aWD-jNGwkYC-u&WcZr%yMG^E{568o#>jYH{GnC9<_OZ~ zNF?czK{J%ZA1w~G8V2PQk%7;twO)(Bp3{cT(Lz>l%jYRMB1=RDUi@i=U|Tm5#YS4i z9@~Y#3GDSc>7-cRpMmTM(5_O1>E*9=FlaqA8U-#t2F)x0tpaLB^^Zi4==x|OnB~wj z+CjSZl7Fv)Be|2$ISm?L>$D>Eh^3>M_&5OSJ<(HRo$!%UGAnIF_m!?$h_-h z=N!?FhK?Oc1EWz*iUd9K)LP3=mhmNmo|0yU|5@-(x+HH#HxL<*&V9e%c~1pvMwh}r zeSe)%7)d;4Ak(=$Xay+eF^bg3!YOGfPf=Jo%W{rgQ9+7=R(fmW_!<@=z%2kv$P$M4A{VQ7`dhcPh z4Wx5+%g;G!=~^6bwSn5=r#ZpSNOOYx8ZT%p>HyifE>j`9Q%%-ki0IIh7uCrn1!!L? zpya$SO0>@`4i+RqSET?tFQXvL(0?80qVfIQ^9Z1|e{`Zo1{J^(L{pSklW6xEkT%!b zi@t{%J0c(I1lIeWobdAil2={43Fsc^TGAf$O2`9F}Z+j0f-VNt`6O5n!~?kqB6%tk5ZO+JA{AXOmev ziF|y+DEEk?SYt2$9*yS5K9796jc-MwTG=CETCQFh0Z>@`AP$(>2A-%Ni6g!Lyyk5nA9Sj4r-c579(}Fm zC+%te8hAqZmvEZ#OS#r0Cr;=I!AmNxMsoj3!U5PJcsB8d&KJQWW?H@0K(EX_3&R00000NkvXXu0mjfwC>o# diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_26.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_26.png index 379e29b50da74d40cbe316425e68671a6047b9f4..2c3fe69873bc400e2f07b95f5b07152af35847cb 100644 GIT binary patch delta 734 zcmV<40wMi?3+e@s7=Hl(0002`twPcO00OZ|L_t(|oZXVmYgBg_g`eMhuV{!SgHSrf znvB#G(;(edp(b8G5S2otWK3|;G~%M0))oqiW8)2WQ7K&(#f1|$I!=VK*iu_k?~EVV zR%vS%C19J}WV(=nq1Umu;fwkfxjF8Sr3RTHnJ3c1b7@^ViEJrIq~0Xn{F-LT6MJL zdMwX}%iYAr#JH8+QXCvMev92&LuYlzA~!FvZG^JSM9lCz^-t_v&j*oq^JoQg3mP7) zBtq{&JTt9_tA7Ig>EM9&&;m%gN@g5@8!JL~+ct124`6r4n%&LV3-2G?QETYsQnI** zHxlzQHnBera-ho}V%eHq`%w)$ibYSgv8NbJtIA0C+E>ejcFq|R>x*s?O+HvjNdp}n zb7@Y7;{H+jcoBf!&)B)z2o&x;{oYru5wKw)>c;?j-+u-$@u`Cn-H@Lv{Z#Gv)c<=5 z5}mJSGUHaZC;hz+4r5gNCF(>Rw6D|l-*rSD_Dz;~V&`H5+lkahB&?pk4_=`6Q==mj z>s8S5mh%9O$yeHLI|vfF)#3tdxHemlAv#s?u1*5{(xl<6BZOVfo6Rn8=y%K&%%!F$ zeVl!%T7UZ1&F^Dj6syv&nm=k~+lB^Jt68)#rdn53Eo4;dDikj-Ev=XWf!3chs$tE_ zw(rfThGltpHwBys^w-Z*U{v^WU};{J0Whx6m4XJqniPPoakE4$>jU;lH63@J7WMQA z<3!C{U(ZZ?M~-hQeRrtVf8&PIfGEM7}{s=oo)X-_ry2U3?xE9A_; QY5)KL07*qoM6N<$g2-EH2><{9 delta 1401 zcmV-<1%~?S1%L~X7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000FtNklMSHpdBo&2a)?bDRL!947!a#|ePVaROj-Tz~g{z6;tJhXFRn1%Iiv zeoBvniGZws7+`a}7@%eUsR{lzYOST#`ttMJ5dfX99S1m2j{JAX-}n6{dr`tLLO4K~ z5%R0)^OxiyF6#s{03#FXvx073Q2KNB%|>H^`@Ww=;OK0Y=4{GgnriRc&&uHRZ2QF7 z=LMX@G9M?yc7Fj)nEUj|Qvn0#(F#y)^CCKB+l%ecoPys|4$brdhx)soz4&ViQVVM^V+0izX z61WNMjXFGz+5jyp;20^hGVS142+}O1ZY-}kI>KTRJAd$)$Cp7f3qUPXqVvygySVcl z)&irLHDU*xf7(?rE|zc>N0CucN5SbIaX42PkH#wiMz()k#q6d36(P|*hBa6{iP75* z4rc(Z)yby+8Ib6|l&1r|&dg#*3&@Kg>C+;M-&+eJ&FS6>JHr;u0URr81)mk%(U4`! zk7WSmNPpbQNn^OmeN=Sg>O8|1F5tL;jM_)-j}`=%2V9=>)Y1V+ zG~bg2p7Vc1N5jcT$6Hp`H{gKiv8T!XjCMZN;(tlexpMVSL8@uEV<0lWHb=DUNNWS7 z%-87un;~U-PoXP~%`Bi(?*S~EA<^hJ!ovX6xKHE9+Acs)hL%DXFHmMS{YPxF$l`Gx z2FN%DsAmzIYOTM24`5LMPmHTkt$(#JK<|6Xc#lmUc}g#9As8uWBkXAjw9vnXY0j6b ze}8T>vf-UGs)J-Ve9x`fYrocRYPh5*;j)CPY%QB$=^!#-t$=&Sv}e}fm!4VH_Amy1 z#zABNsr}=O=FTPSnd(K9Q6$@}Yh?z%Wo<0m=7aO&wKUtv{|m4JDus^)3@Iw5;8?Xg zpf*`zfF_6MfZ+Cslgmh^Z~%BO9<0jZY=6#Xj1kZnpvmB87*<=kB0B;$05lrG8SJTo zC8Mx~)RBM@x(LEir#anXXj8WRU<2ViD+L3kt5!Ti8++H5 z_R9kC?*S-itzSlK)8?l(iee>>cD2u}F}N_K^v&8A4lvs(uyz&ZB1mi3MmnDZm49X4 zwg->T7$Y&(jD5j6QR}dQaXYlKI)AjWD^Nd$PwxxX!vb>+u!{3bS?7xs2+#hEhG(6} zO`znw6`XIutRtX}lkNjn+aGM_<0eo#Q&(XCNnh*wTALeLYo-06)}q!{kARh(zZzEC zAIni-ssTLCpK->m7-*hjU?qqF;D0UrRyA@aR@)!A9+fnYe-HOYvi1oT*#Xg{;pVbJ z+FxnCONvU1b8(TuDJ2=>2@V{jl8h$1L><(FNBw~rAhU|? zQ4-@DG9N=b_ebv|r_)h#tL6k{n0j~QGJ!Mt`<_r^{00000NkvXX Hu0mjfcoCnM diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_27.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_27.png index 16210a792bb313dfa25674392ec0795c782dcc8d..3253a415fec4dfe185ad0daedc4e728240238ded 100644 GIT binary patch delta 712 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 Hu0mjfmiDH9 delta 1753 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 YpUg@JvRv4?XaE2J07*qoM6N<$f&-xjW&i*H diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_30.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_30.png index 645ffa6692bd5d8b4dfd364b80f5126d1a30ebc4..d67714a898331bff909538b8c9f604a5da0b41d2 100644 GIT binary patch delta 720 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 eB7^pl@7+H>SQHJyN@N`X00008-)1*WWCtVE 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 Z02I|Uv#X&oWvu`J002ovPDHLkV1m#6gQoxh delta 1533 zcmVC?2fD#6UMwD6=zAybM9H2|TDx+)mNk;(dgsjT0*t2(c06dPz_)&da z5g-F?A}bQMCpiEdi$k>zWCW;&G^tgjW*y*e<9CjK9LG32Cn?FzBskxMI~U2Ef9e3; zgK+riPH=aG9DiesSEQ5Ia8iP^a-ZD=*8M)hvlnIupp>x=Xqm{W{q}BHxfsLGZ=`M^ zIzYzgTpx*mY&7V0qKy2`BOb-C)fq?!s4S;qSkAjvN4Ps`SjO)@+e>n=Gf-pv;{ct8 zkKoDq!43&7&Lt>5U+@L)xJoe%l;S%OJjQ1fSdqASA%8i-F~*ow<5j4<@Swh{ECf|M z;vJC<>-*jUI+GhocJ|hbLq&ejd2eBnndO#i59Pk^0zB{@H!STlp|fN4b8;%8fVDVQ z#jVuu73mc5I!(rk+psQF=-$aK*Y7xv-D_57MsJ6l&I`p>g@vxni=T_x*1L>b32SM1CvHC+;7*byMXg7oF5Rt3 zo}|N$+=hN1;4Vl6Q{Pt}(`Dqe3b}ptgN<09Wxch@APm`I7+W zEPqx4r2!@7Vf7Aw$NgMsY`kAe?JDJ2VdW2h)?`NDc7RN-Ksg3(V}Z14D_6Evo;Sm{ zwv9w(FIxX*5QKJ7Lg^4SV)fQhxyMI=d8#@Rx*|a2e9nFLB#PgH2!CFly!?f701e-4 z#1&Y{UnmE#fD2jhid4ET{Z@GRTfvjr0e`G#Q(P&dLRNJcdjh=t!OvbkJndbDAXxaw zoIRz=;J1S+>uPN~d2%^G#uKGT@RQ)FJ$U;>(2@lH$8+Fz04_1XpSj8(*YBq!gq1v1 zaOQFV>qUihwaNAKgt=A4D=VrBR$iVewubj*Pz2BuajBQPDwWz{>}F^$utB?cihtme z_wsnJRN14Rk?+149Xw@uGj9PaSK^abJ%=6nn{)nkfNX`28<cdS${L;>UNTjt4iNi+r1rNjPcRKN=P-dm9Xpn4`I>2 zlRpX6xF-xl*YgVVoT5_VCsnYxHgMc08-EPBC`5&R_>THcYlGimKwDC_KA~4~dlTgh z+}>l&gsJyWH~s~y6KIt{44C*yi;y!qW$PFBf-(x;3%!P=ve$~Fk3vP5?SFDQ$_XT% zINM+yx$i_9|8DOyf;7071T2Rd%aiy)`B`LTYP#b^;DKg%Ngw!3{f7}!#%od9s<8B) zlHG;Kc#(Np`18n@#(YPBD7*@Iy_M^4kISO2sXROm39H^4|)^o#;IJLdQciB{xbWIL2300000NkvXXu0mjfr)TLH diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_35.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_35.png index 05f9639b95858b7ca89e9637c03447dbec50e1c1..61bd92f5f00d39d0b6cecc4aa774e4f597edc86f 100644 GIT binary patch delta 789 zcmV+w1M2*M44?*(7=Hl(0002`twPcO00QSpL_t(|oL!PnXdGo2hoA4;*<>q8C($ZB zD7y_>ilPmA38G{QdJ7m2E4fG!L@%W*wjd%p-$g5)iqM?HkqD&+aR+-U6yink zkR}sEB2_b!#xRp)_WOC5#DnkY<$0g?@cuDf0RH-ck$C`u8h;eftTWRExV9DQ#OeY- z@S31W3p(~nLUW&P+U&-v%W_-sL5Gaq1RpAyt&MV2c}y8AZPy?V<=d=F`KUJKGbL^5 z5|^aX_)YmuF@Gzq+fM*FfFVH0toV>e|CY}8@Tj!Wt|s|Cha;EGwmJdY(6%#orFUs8 zYr|V^awM{=@RAF9JZLN_jl}>U8ck?ojGr-bI$!pL{$+1i>EG0FVoVx)5r_S`Aex@Gu zg%z+gZ-2kzYUA107a`y~z6s9*aQ!+V^@2P=r+)3^$>YaE1KH7QNTh~gD)-}rD z;{?lv=eS&h@nmY=aMi(M#r8F<7{(`^|F?X`Rxo6AP8!=_WB-5?3 zbCW!XR_u#YjNm9w^j>{p$X7XJYm&5|gC4eDpMS#SDS&NZcCXm(o#&@ghQ>nh=~C9` z?C#{zIKCy{_C5%&-ecg?54@k1ep9>{$3tSp+ruqMRXkYs+OrYS=iUR2s52!RHo@f8 zw*V6p<0BZPOv|SwX=7W3WF7FzG{9IB5K>Xi3?%7~YBrOQihSp+B>fzRne;DLowDEx Tm=4Zs00000NkvXXu0mjfBh7>& delta 1530 zcmV^hh+bf{B!JcQk%$vi_m(16&1- zU}-z37!w&^(qVV}=K$FWWLEFk)~m-DdZXiNvVXJsjXHY98po^vr+YdAcrR_LSIBtf zIb-!nQKhod=xI~VUrz!ft8P?Cd(BNUlg!N|!~;4<&(>fS!mOMl8>xGLvk;^Sp!;M0 zOd4$Llii;y3MkndJ5Rxdjw|s;|JGzw;Qf67luU1=&?124;WO_DMk7=>qcx878kJ3- zU4K>t?Pv-{=^-^9PrLdpJU> zQ?yby?txPE>>G_g0^zT>Yfa~=k~3%v822KY%xHxPx`+L?~@yUD}Xw{IHy}Cfq$sOqc!>KTpdWbp~;ApEJ`6C zS^X%`zSZrJ{u!Q-ZNLJJ_Uu0lk$=D?Ynt;|$(=VedXgxsZFRe`tu+U4zcKO4I3qX4 z1F26-N=nMmw$ke6JiFrPhaQcp+gUQW_o6&ytAyR|;?KoPidQEzsPXSq6F`#6Dp;II z7jy6D>wWA$DzI{ejPl=N{Eih)fXKIO`?MNpbpS~j$$5})SA`0aXE_}W-+!pVTKi1m zMsS~5w*80z2rT8L*PL?FWatD?ow#wL$jU@(78F`ih#FqgXMCpq!w4xtph}|(YoBXl zR3kE;XPzGZJo42s+fM|D!mEJSTc!SpjG6H0fjR*q%PUvwmyQ6aB3`3u#@{g+tcYe~ zyN($vpY~5jfKi}?tXF5wyK}2hna@y}9I9*v{Z61qU{st$AWb;G!3nH3))eEeAS zYK)c0I~%_>tWGkv*@FAZ2+)OQk8RSqcy}O`)UoY|Om39H^6Oyg`R6JBhMrWB+!0*S g#yZ;3d0#QdfA(uUcN}dLzW@LL07*qoM6N<$g8PBrZU6uP diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_36.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_36.png index a968fd015ccd5066b7482a0930afb349fe8191c4..6924299da0445bf6c524b8cfe0f5bbfe56683799 100644 GIT binary patch delta 783 zcmV+q1MvKV44MXz7=Hl(0002`twPcO00QAjL_t(|oMn+eh#X}YhoA48*}FY*-t5IQ z2nsi*NFl)-*c?XPDPpH27Atm95NtwNZA8S(G@4+e2nQ+_SIRAd2$3s-J0KRR&c-5; z+|Hq9#Xq;R?uDJ)&VIiXv)9D8`tk6*Z}I+23xI!qWbOh0et!kVP^*$@0c;HeJ+=Ef zfd87HMjb-Cky4w`%4)4xrCh9OD+*e45<04Yw($P4osvt;<`nNgN>^zhIXOw$yqry0 zFOH0C9fRb&BO{T73d|9JRatH-o^8nJEpUO-W@Qxf%43RH*=hyyKyH;iDWBKA+(7B7 zbd{@8VcfplzJF*+d-fWj1Yimf&=gmA@?Yt48;1%T-PbaI11G zQQuj%S%~Z|oJ;&R$BiY!+w=jV`IH(~30$bBV8Z}R!c@}j6Ju#N|3FfgiKM~KSnB;f zmejK)P!9`eEEYh+0#F|qQ?DLp3-%J9pQIJ?y@a}j(|--P0(aq51L&2hH!UQ&i#JkF z6N^HJhY}MhbYQd6UN@kK=teEZT8iVB5)Q>C#W4~rIiII?3cqA|ElIH{<;x~1AyqN~ zW62W z6kiH^hQ;j-x-R?Bxu*1+;>|do5-T1}hmy*;yW@0dBciXJ1H33aDLk8E^71=?M&pq= z4AMY5XC$dV(pa(yaDEM7u?7ffT&{N|>Cdt`kdVgty^E6cYa9%u2Z0c;bk_~H!2kdN N00>D%PDHLkV1mZMbfy3R delta 1533 zcmV~Y+Tj_%3%+7Afsx^Lx82}t?|;3|jDNb*Eyq;_K$Tv1 z*e{gBD*|AZeqK8vkbG8>0ixLHbc)jhfXm4^T>_d3)C@2NSj-|y?Qni; zuN448R@CX1e>C0243I%IMXf}3Ub}*o%0p14({)|#t7?+yma*HYuY#HLSJOn+d)#v!%z@5qrV`ASr?h)F$!iK~Ryn71jH_RDYqtAO-+eu&PM>Ee_WgdsZ+=ydPXS9yygxnepQCy;xmbW_82v={Iy|HYD=SZgFB%AUzfGVzB6KUWpA`s?73sbT*?)|1Cr;E|Iw$zj9-@duH*Yng zGCb!K6*UFYy3U@PWcwwNf|2t5IScT>`?_J#R~>jrj;P3HGrlVhY^>*5dOq$eGN|G; zW!%f2dc7*Ng-~hR*|_Vvz7Khu+YTyZBJwpIPRD-%kextg^-@}|9yIkv<$qedv-(jTJ+i3G3P`%AGk|7vx@Skb zRUY}PR-cwtDm#suOewI-?Kg_R$f~0XRrbJV`m8jF2Rz6^OV*cQqFI~p7-Cwn(ewqNKiz@vm#(4d9R zCqX*zu!`skxM~0dQtQ;>@y;usBD?LaDu0}zFN7e1`M$-QBlI(!B!5MEH$?0=vlAi< zg}W8(d3ECSyIuoNhNr5x>{Qwa`o-r04gjgM$Dc{`+E_m36AHmfJ5?2gt_)xmC`fx# zOKGdyzNetlPF35eyA@0o;l+yfw}oh<D^3eNtLz^piPS#Ep+YF^o^#L?T@Cj-A`X{Y?2^l+iyM!A4`%a+6Y;`e% z6o0d4{5i^}f)3%c65ir(&_A_;Pk&9Zt@+=hE!t{2N_(>XI3Dzi8WyC^lT^4w3Kn$r zqd>c3)pRo+l$X~|d`z|vF#N9mT)f6yD+ULx)#0;>NXlDN_|%offy~2eCwkwLl_b9O z`jDJYBkdIb?<-z1fuIGHB@5BZ+FGK>@>~%FsN*et)C}N-mLX83QH8DN zmW*mdIs;IK8nRIxS#}+}QCZJ$o)W5j2K`Q;hhdbRWsqnE?jV>}#9Wy*eF8CzaAtWNM=fwtp?0M?UQ)j^|qU j>SS1*R0-0&@0jBsd}4~)W-C5$00000NkvXXu0mjfuEX(z diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_37.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_37.png index 8393e3ce8c06155317ed42bd54da230581eee48c..72e71368d00fb151a82349fa8fe9416c1d6d1946 100644 GIT binary patch delta 804 zcmV+<1Ka%g3$F%{7=Hl(0002`twPcO00Q<&L_t(|oL!MmXdGo6hM(`7+3vO`&KgTk z;;tgcvryrIaPrK#K&|?2_YUcJFRpzm>kSNb>TM22FXJ zFr&p-ru@@EsWg65et%QUNbB}pKq){45HTZ8aobu?z?nLV&oL(ZDK&*;WR&8-YowB>j4*kXG|IB=s3d8ZH;o z+Mk7_HS2&@w}kds3A8N$t)Vfk`f;|TYKMF+9VD;Xw0{_C{h3kGk+z0w>*rM1ob!j@ zHUk)+A6z(@h8C_)!~sf8%+)g)^u6Quk*dDdPB}W2MV6c$u~4TF9~_G9DBy>#=Yt0z z8Tq@8zV)~3PhK4PiKE`)xc}LD7spwL1^?MgyG!{K85XxUb)77m?#Zueu<6dt5fZeX zzO=jTO@Eys78ajx*WkdX;p2q3In0{?{M%#YW6S?8r19AJPadFa&K`LIn^j}&l@!3d z6BeZpQ@Ybn)OKs)+P#F_{2um3U7sT`b^yo$v}3?o8lOCRysntba~XCjSh=!DXo$Jz z{C$^pY-tWp&6a`5rdsCvgXA4K@T!(02KYy~&$^pUy(0<7DzB>{<+>HV6pZlfx zs_lLA;9!BuSg_MulS|m*$wH~S#^uC6Mc=z|?`NdnlzbT_6^WAVYD`ER#u|W-3OC)Cq(9uuP(mv5 ie;rOr(vL|rl>P&|fwn(W%Bk}J0000WV& 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 Y8ydb4ri91qn*aa+07*qoM6N<$f;r=Ro&W#< diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_39.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_39.png index 7ca97b4a7de316242b68d76e29ae0e8db3c1b98c..8a7e28ebc22da1260a872c734df684cd5788a11a 100644 GIT binary patch delta 885 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 S5DnS@0000S93v diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_4.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_4.png index 11253dd628bf57f12e735cd8aac4d2e14bc57d55..87b339fcfad498abf34a7ef2417ae2bf5a2f7876 100644 GIT binary patch delta 593 zcmV-X0|43D5*kcK?Z0OajX1PO&{{VbW zZBGK_?9F?TThTBOO1BH^P{^0n;f&sxN6>_xG(>NfSU!loS@_$V&Wj;VH%e ziD`+6xV~C>K7S6(0m3*gQP12tclJ#fq7I1DF%K#VBx}DtL6T&1N8)vE(YL-pc}ks$ z0YH!>n;nIrOB0c-W6*r-?<2`=%S&oGH}-J()$Nmy_RatR6eLPp=JnCKRVGrq@dH&r?}u)ZWXFRBbO(B2 zq#k{nGepY~n%bw`g$D?A&p#!WesuO|2EtuoN8u=d^FUk!0DK#e^yAf7qL$~A?ztf` zpJ=~)*J^l4i>;|6LdM-5C+S6!WT)anySW4;jNU1(L-h+ou3)#kH+mci{Ly=aS$v(g zSpfpDBucJXeuo7FG@EJyK!}iOlC&xyNj6#FSXYp4Zo}V_CSW_%aIIb`RN2(F>?vAA f&lF8)ZM)+i30L44Gkq0Y00000NkvXXu0mjf-31hW delta 1135 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 Q2LJ#707*qoM6N<$f^x)A9smFU diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_41.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_41.png index c33f03e927ae06d8adae5aadaf5259663c9b1d22..7126105ef1528bd31bfea93f3c321ef16a078298 100644 GIT binary patch delta 897 zcmV-{1AhGK4U7kn7=Hl(0002`twPcO00UD=L_t(|oTX52Oq6v1ety6Ag*zlVGA1$U z4rVB`F|`j#qTIo3nrq`$k-F8On$^~7@ui$L?nqm!)>th!TPtxzYq$#0i7wCg42#MU zFkvUWeC_%6{Qd9%|3TC=19t%uD}V5R1rc8%s1=D2jxJ;V z8iVoWt~p~k%SJ}Py4kh_!+6pR90(Aoh28bOj#pjLzdXbL152Rx=X0Jt1M zlFm}I8L%~yBmjS#@6$f$9tQv}1FlHQXI)nzZ2*`F0QS)x-4Fc(D1uRq;sjcgp( z0pM*wGwa^Mx_|72Hjp#{gy!1G>w_;egR}v-C}NylyZ%BSr~rVb_b_ix4iCKuh5`7L zV1xsUubnG_2|%Oii;Zv~dFGW5m)>wR=2-s0+To$!bpW35+I&g?sJs)%&zM5CIsV2bAHvsqb2jl60}0_u~YRNE=wsM zZd;e+2!C}GZt+Kc<8be4|C7LIzK$z}3+~->o>|YwTLdnZ!`X4Wz44CUej}dcXYD-E zrWXCrFEY75_G^d{i}I#8(vtlW#G3Cm0NyxcAq71^I7Pw_WWYJbC1h1DjY?QdaT zMh+EfeaSoDhDgg!Rz970R-$p8>S9N~uG~3qp#9vC*I?6|e94i4~;>f`I_m{P@kk X$#AL^Hr+$-00000NkvXXu0mjf6qdHV delta 1766 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 diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_45.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_45.png index 86630e83aa56102061ad25113ff5fd8240abb336..e6da05bd15a40ac27ca56d376691640cb6b34a89 100644 GIT binary patch delta 363 zcmV-x0hIoQ1^NPz7=Hl(0002`twPcO00BWsL_t(|oRyPLN&_(zhhH)o8UJv#i~U3!GMffYP}7Z7>?J%AuMUAXrE!pso{gxaC){9GiNWS(uMZe#Q*?k?2JADsE(`pB32cZOJPHf delta 632 zcmV-;0*C$j0)+*T7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0006vNkl*>=Mq3@ljGg!zaj$y+(a%29bl~j=$hxm S&cBra0000@v~SY>4;+ zf(wGAk+l>oGTuQdNh4TW?HxFR7myneasg{;AqY+iu}xtm!fs`o0VQtO?7S8;bLPx( z(XW{~&w0Q1`+;LbH!N}F?e7%8s*Qa~;lLLvhzyrYL&BY9pW{@OSl75%WaEu|fR+3hwuVMz0w30Vfz3ga(_TM{= zz~H}%s`y4lf`7weMjk8~A~^J*&m%M*)CvdvuU~SW>@NNIJ1=QtcyUna8@8S8Y|-G{zSy;b%7knzB2l20D||3hXy2MV!*Ke$qV3aqY1^ rUwnF1UM`E%T9J&#PhVS?jB3Rn%^ZmwaV&I?00000NkvXXu0mjfe=*kY delta 826 zcmV-A1I7H$1H}fA7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0008_NklTXw@B3Qv6`KrKR5r!YKD418h==;3^p7D9?nMwh^%7h z&g_s)kpT`TnE^mwYO{lNW`+P0(FXH*9#NbYDImZ=V(?fN`8IMRT6%s?8VF#-h~V?>Sx5i@3>Y1Jy4~x#ibP0B00A1A6@0q= z(rh3}009hGVWCH@1Q4Ks)mHh`NH9zQ+DWOJ_K9toO;-V8$8t02fy?O5&$UI^rw+k|#cwPh^#@yx9%&Rl)Q$iH<^kKR%Z})~kcx+LBt;lbRUv zB!X!MpnpN+LFECaBdcfdV_WELYTHu#J?{5uHZ#otJcv?or77Z(BT8x`z4cb;;qZ*t z{WNf=bXgkwUFG1Pt?P8~uAOum-2~WaZhO*csSJpcpWLHp%x%jw2{iDkYs&S z0!ZiUDIr=aXRYG2yneT1mmDSa6_o(eoAu~0UVnj`T~hYU(g%T3k%mj5S@U0l=89Vn zZ1oKxZxux=W?%6;lBF}iXmaxvUV#9=q~<2*_4gh{fB*z($~vO?B8HuS0F0ajA?Po@ zTpb7?P$GdBAV2~xfu~VVNuCCJvb+Upm5?Wp0SfRIbjlsVr{&-iZwG&ozg>W5%Rw6K z0y7Q=KOK8G#XlUGI|4rCF^_}f-!35cA@P{M;D->xH}a@=mA6BYX#fBK07*qoM6N<$ Ef`fu_;s5{u diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_47.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_47.png index f5b4529e448844213c2482c22324c4ab69bfe0d3..3d631e3fe573bd044fa4e9f59101b22ebe9e8d0b 100644 GIT binary patch delta 450 zcmV;z0X_b-2G9eL7=Hl(0002`twPcO00EatL_t(|oQ0FWY7|iv#(($D>^df^89^{Y zAe%g*&b5XS2!F{(mub*v(~K5Gd;cnNiXK z+geTu9q>H7+joKe@_X|A)JX}_VD@yvya5lSYaKg^hp@$K2ke32&;c*NOddNPD@m)h zqey|c*8;NuB5Q#o;NGG>m}8a+>_%3Seiasa;}l-q0uW-sat=e4w=!+no+Rb+Mri*% zQxEk2tEj4OQh!7Y2rzL2LIxCx{n3D&x9E5mO=JR^mL5&&+QLjtg!OH#3B zjsf6_B&oQvRKV$@0ARP=XB#@Tanc1_Z#)nl(5Fw?mq{$yd-C*McODu?%^b@0GNIQ2 z!2L+jfK?3`L>K|NmwC(9)G=023ex;q0fmDq}VgBRcWE?>m5F`Fgtn;9aitAjbG+ zJ6uDP>}uQj3gM?w*b~^1w(pAD`Jzu&vlG~J@fTJz)C0MWwSP)y!yxc*J~BXJ6+?Gs zhir-ra5%*b0BmW^4x=+O1b7i`Fz@@$iqj(n1eiz)UJ95t3*-XLrO?U%0VYrid@Wcx zIi7ldiwqFJh+H6e0Bae52e0(mQoyMUH4z|y0lld{_Z`WyO46k=bPfnG7#jSMbpWkY zyd5P8PzM-@Re$jLI%+*S_xYMM5MU59g3s4CLIMadfZ4&P>y0srL?}rB0Xlgr_;mf! zY><-x0t{e@4m4#_x+9KXeM#)ib)1&-B2S- z!aWl*>GzUIv(H=1Vt6T-PC`u2pRl@vMsHgz+O!&G=K^RCl44Z~ZfOf`Picy_2Zrqe z_|&A<6MsS$^qdUxxZkJq2!~~W(p@lCIjyRlLF+N_A^gvXF-F_Nz*T}TMH>8F<>0@~ zbWY%I!9Nu<0d@=iNvWTLO5ou%3n0CI-D{8Xg8C>RS5%R{2G&C*KyF|seNDTb5ZdMG z`M#%dfMi^w5_0%VX#-~|X!fJ@-1*Hemz zfu1byfzNXCwq1|`1b7QN{I|W~$xN>I(T#IjDAE1H{Aeb&^qvOtn*oqHeR2VC5^SemWv~l#` zB=_S#|2bUlabjCWRdM+{1Td8vND`yc(UT;vRi?gjr-jUPPd#M3&TLC7 zz24}u2abIM2Y^o>T)4}44W^Q&CkBc#Fav_R0RmdbE(Uxva4v>!zsMeQKnFtaswDkN zJ@|1sfx8DGfPaU<$2PDtxdVVRSl)bsd;VGFjSXYiOY)-uK?GiB<4&7^g&Uv&xTui< z4~UvDOIU+t`~eNWWL+^}3e4kjbjwC>OHwKWMI%Ud@2|T^Axw{gvh5-8y*poLWU4PD zDgA9&5Rp#@tQent1i%GJQu@vCx@@V)=w*(nW%Z4jW|)1w0(^Q?ah&W|z{0D5^jQvS`39~=6-TzD;GK6lc%Oqov6V@+q?mM4EM+Gz tX-#KupQg)sa-2K-pmY1sJU_@B!5`hcv10yeQm6m`002ovPDHLkV1l9o=OzFE delta 915 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 diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_51.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_51.png index 3608e114f1fa09137059af4586b259f248f0ae8f..0ece627b4d7af0526ce8203eaf59afe83dab97fd 100644 GIT binary patch delta 452 zcmV;#0XzQ12GRqN7=Hl(0002`twPcO00EgvL_t(|oSl=wN*qBDhQF$w4XY&XC?1p~ zG6xUdyyoWk207*yeFNXX7Q}0Ofxte%<{ly78pu5l5O7X8`zfT7ExNU6NT?##^Q(}n1(kg5gnIy~z1>E<>J_V8*TvU)wLM-iH>|JhHCuV!?WMNWt7a*i uItJIp(RS=02u00Z^Z&n`KHPCFYSlm#6*&8;oumoM5gEcvulv651j6!fw*g=;pZvph zT|4b?4GprV&GRRv|3+aa&?C?9iSzuSznrE{pwFj#;WUMMpntZoPFZY70)z7>0%T56 zsAVifQ$&E^Kmfsk0D{xZ0ko*?i@WlTlWf_=5&=9_!t(J|li$1Fs;b@F1aY=assi9T zHXqj(0_Xbln6^FA>)!W0J!+{5AeTNRP$A5o^b_nU1tpCFt%x-ewbTSKGGQ7kZl^sh z$M>#V6UWo)e}5x}broqt9a(bk3Q0U>KU+%Y7#ga!e?y(Gp^I>>-Qi8)BzkK*#;nh;6MPu85RJy zbH(a@S$}Kd@Us7>G*AbqW!K!-EYKT^CteAlRV(MbW`W*VtcZYX@2f3<`*CNB&QHnL zSe`%IK&$Z(r8W;&|ZN9Rcp zCInEjqG`lZ#xG@gN022VIG=89co#sBv{YH79DkcyOBk>N1n?zN=%+vc!GQpR0|5jF z0x0lQEcV#7Ge>TmZ2LSb9?76i6vK08*?J6jVl$qTTFzhvM0>d0M1Q zWBc2tciiJu@>#onqI_%ndu&FS5*3Ykz4&mzP}%hB-*p18+-+ zw;{3$6eRfy&u(%|c5@h`I7rFl+{y~Z_jd9tvTau%kfcJA4I_ZS)jJz-U#$l>nNSKoTqPrh?&}6u>|oEb=KNlHN~i7cXJU z?dJfZpxJNOsedy7hk{YVA!mNVuJzc=Y-Yik>cdX`%y;m(MX0EnKOnboGqN(LZ_ zud2+icnsyd?3oVC5|XgWK_5)B#-jm~%gah8ZCM~fig;#bwwNlwBByxd-`5IY)mr|< ze^jsF^K~%XpM*{STs`ckTMm3*lK)?!A&5@`u(BS2pH0UBxD7pKEr^;8yvqZHjQrI- zm4(RS=02u00Z`Tt)|A8u_OssdRP+RLWdCaP^IiU;O`U-}H~c`GLOoDxSbtg?TMPmZ=T8R6Xi=zT zEM(Kj0EZI-IGkn|AVn=L?&@wd*|Liz0(dKg0OzIrQz7ZTItyieTwn0Ds0w((?h>Kw%uJZJi(1p7K1A z3{V0546ih8kN;;g|7HzGcO158Y5Lgb5u)!?Pl`5j_wnZ9h;}Lxe z7;VLzj-Q>_bi?m5JKe9S#1>Dp!tcY2MAt zjk+aal!cQc*PaQamDW!|od7h#nUS<%QUI&UvsMSN6x0czHE_XhFH5N{21+1%>*zcQ zLY)9o`V_&4vulAH3BJcZKc!FqsI3HY&Im^Ee}94d1XN~#%t%X~8L&~7R9OT*+p;x* zvrwvWp8Dq%m=HjTRDe%O{SdWdfM5+FfWrv^98L%T;As$vnfnL<98L%TK-qEY0duc` zD|q{F92Pf>vd>e$0Ue{p25 r|2yTF$42te1@s;=j`<6IN-2E-%nF;H2!D;f00000NkvXXu0mjfdSiKh diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_53.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_53.png index a91b863c7022fabf43f473e2a8c09837d1622bfc..55574b441be8edc20997a887a7c1454e913a12e0 100644 GIT binary patch delta 452 zcmV;#0XzP*2GRqN7=Hl(0002`twPcO00EgvL_t(|oRyQYZqz^!hQC>_!-a#KK@^Du z!39McNK1D{f}S#6;0>;f(qxf%4WvB4(L;r=poRxPI@hTzMLOlkorhxWtg}iYG0m<% z{qxVvYDbjoVThv)*9m~p5MxzUPJ?1!Rn?Ay>sPtS)U2fobANN$J3*qg2O|ekgUY_c z03RzzcVVcr2?iwl29M7jFYWVJSP*Anpr!e~EPj4rdgZxsqQ6#U4?I*o*AKn2TX3KE zJ@6ESy&iZCQatH-%vE*1FhJpFsDLaDDN+IhW5HGc=2@8bu!hlJaR6eWaZAV~2e25> z*$ddQZ@rTNQ-7Sn-g?}cPcbA=@=jHCt)a2hgF7C1BL+e7IS0V^1=D1^1W1Oes*M_C zvjC8+OIghUSRF*BK>>&pCl^<(14p~0m#V7G(t~>yLk||-W0~{7`rGZZZ2P1Bzdv>z z_`by5t}ro3k0Y?T6@foT5m>|?moaEu3zBvN*QasolRXwZ>Nc$Oz>d4EtmBlf%B)Mt u+mz9~`f<{%F6!T{Vvyx;J{dd6TE#z!0hXaGKt%HZ0000+jfK?3`Mca|NmwB(4i|$0mCIo$k{LL=#0eV5H#S-6=RG6xaI3@1Hil7>7VPm z-n8RrXp-H{&vytvMqwn-Bl&knKi~AlZt4X3+}rNGyYn-j-V@9z^DSzNp3{}C$7-OzhjXFR-qp3be>#?NS26q9Ip$?x}2x=7-x1*HBPzRWZ zR`7WnEkhE0Z_XwNU=k~W&)b_J0tjFNtAkJ5y{=0ngpvp#fI;30K5bu`4RRt_A^;1s zVw@J6cUbAuD*|MI0d`yF)guBG0dR-xM_RJKg@2`U0TL%_7oenpeCkcR_5N0p z{VExNI;Pb@nhx!?MWZyWMXRl98G!c=>DZM1YR$yWu*GVx=crx;(%U0xFzI`>%BZt! zv7G)Xs&@gsy?CYwMklwdq<%_E22~vb-u(Q`<5(1d6x0En0|7K*{q~Oo0XSz^0MfN< zR(p(PyMI;J1m>=;rQ0lE)$Ufh1W+oDNVZv^WVh99P@_u#(#M@G20w)Qid?JbR04}a zD|i?Nwidu>07gDvTSs@2Ahs4jYXD{i>a=@(4)yES0!T<_<7V_s55cFI(S!gvn$HeO zf^StE{M@i65I_J4PpO{*0XPQ&a1I3E90-7MQh$+0G8Y2@I0ph?v^;Tp0wxPV+B|(5 zhsM(Nw}1c$ycSTJOgbU(2?*c=uaWbT>8aovfZ*|4(jWkaHxWPp89a%gcnxs!xF?0* z5}xQ2WPk@wUJx3>Cj-!u;fW_Xiq+-q5`Kq(6VuyFP89)$0O#PRW1S=Z;mF!@DKGm@ n>>?z8hJe~hV&8ee4L#Nj?{o`D@N* z?)}a8opaCOUMK2dG-F&Y2LPrrb|s0!Qn4dRey_~>$*oIj3xAh~tuI>zo{~C{+lgx6 zhE4|f74X<=9 zj|^P&3)&h#1=qjDs7M-1if5H76Ch|A&<8L#2HN)jkVg;#_$EmgO9M0p?+*Yz2J8)> z)6Kea20{1({C}&BBF82^gnW^tg$!odpP-nj+&P5LqH@Ug8F+H71pYqoiV|$3;Nl3t zVSsA`+Z6>vU@Iuj;d&`-Ybr@g888RLkX1M6O$y1uq5z!FAw50<;I9EkXK<12SrkLQ zElFDbUUy;Mg#dT5ePVbY4(kfn>DNITH*>vG&6429W_-~W~AkA{v`LAJQ)Vxe!QGpXZ^kI_MZjFV5TwU*>q{#Xl0Y`NMO zpU=lqM`&P@_14Z;DgQ*}NFYaRUytp4!T)%3XClvq4|sEE1b=!R%S&g=N#No9$^Z>7 z4t+Ck$flVA4u{MDi7d0(VRvRu0~j(I%vx*LI4h<|11Qph*8(=01$u$TrWiFt8bARm z@OQ!Lnd7PV&zK<%AVe<^IDmH<00)mcmkKyE!<`Y*00OM0`rc_ISP%*&MxWq|S5_;~m%;=E{{>nArL#Un!L=C_V?8xLuS`Qva zxq38$kFU4G1Y(uIcA=4Aw(}(#P*RU}@Zoj2_XGnEHHsNvr58(N04Y6I!H3tso8;kh zu?g~7zy>^Q^q4h)iUF(}XNJ+S)dMpo$P92eDhBY>OMf_UdXl%^KT6ZDRtS1(EbU^D zCoMY}HKuAIh&!A1uH~)09#d=GYk*$r&15a8sF@F{S8`-+SpR`!(lR$Jo z0Jp(l?Erq>i|Y=po! z(tiLy;2OE7jVhA3UIl1_O>hEf0K{n~NCR{@$pmQt0&Ie)Mj$7FktaSQz`8)hr-hjT z7(@#?3^lJDh|A&CcE>CE32soVl)3Jxc{=<=XGvHIc7qOFk4FPvIncs^S c{8CE!3uIj5nysYCEC2ui07*qoM6N<$f;W+#NB{r; diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_55.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_55.png index b8a8c651257dd42798c7d1ab1e1a46adaed2f06b..8711624f94e10b2cf8540922d7ef31d27be04837 100644 GIT binary patch delta 583 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 LNkvXXu0mjfPMQ>e delta 1123 zcmV-p1f2WI1ndZq7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000CYNkl(Q+g!2!@?g^Zu{gdvVq+$^Zg_Vu$Z0$#l2U@{5X2z`3wKZrp_Xs@AyGBg@3*QtYc;AY&8k|<@|^M zoh%BynH!=hDS%=>tAep~+7iHFFsEA_`8>~$vLxk{01mPE2Edg384gVknR|d zxdPSuXF@0eY-DtVM^D$()ss<>62N9G*+A$t>9eDwd%dFwN&p*xz0u-)OQgVt1WW{# z2-?I>=VMUAPk#wu1E-ze8GHZpJSBiAPK13aH3V!Tqw_mm1SNm~ZrB58t%iV5GWUMS zHUYpFJKaMfZ8`mJTEYc@r6E02pkB6&_pESB?{95`0JzlUP9b1vP>dBvSf4w2R?s~Y zC~auSj>9LKI#%r2=}gW}sSWM|sFOrGR`v$C=cLiK_J0DLu$=w3?gmPplP01{01jBQ zeqAWi-inn^iLKu^`#wSmzzItz=MHhK)(Nk1BB(@ABB(FyJB+!yfiYUj+4vN)G z=*%`rxqt2vz$=&TL1yP`?7)yj0*U?Z0S?OBh+HE>9KCg4y}EdbE1W{(td6N;8K!f59jvd zqoL}i#29H`hKLio3dk~%f?$oV9fC4At}|=nS${quQ~+6>Kc+~fX;W^;FXCj;Xb-e? zoV#$tSM3G@Bsq1?`I?G+;$ z9)LNJ3X{}|#S4j}sB6@)C9M;_i%9?yr}lfYI9~#EI<`XCX$QyZd;`9xDG?-5-i?m$ zWPi6ECef_I?9VM{0(Uf)CcKTGacNSIdQakE-xb@zaPmT>ma(N>{~QiQ+S&Q;@V}d@ zRsmR;rp80b8MEl-X31CLlj9t^HyVw6?-P-bBBLK?z+NDyz&+?q)-l&YB zRrIeBKx;pD`&z@(w^T!MX;v>s&9aW#dVf|=6}>_L(k)o+5V2zdC`m(Wp4ajU0ko!1 z)6VXP!+>`bnAx_IE0%#A(VHr>10%O{y#QK^3)R?s;vvf-$Xx5=3GL@EcYg`Cm zSP|ANa(G7C6*0ZyU&ls9FU?RuJsX9`dyD^ZB-ax%T+{T{m0s;tmKE>1KF{A0p~_D? pbLHCXnbvHLXtfj8Yav=(e*kSV`$U6!qVxa&002ovPDHLkV1hao9=`wp diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_58.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_58.png index 61efe9f450d441c98374135072d61d9d1d7d5b17..846266c123d432bfb5a79633fef483d0a3658350 100644 GIT binary patch delta 499 zcmV8hl&BIE&`FXwSNqWlXKur z=a1gKyL-Mf(GJII43@)}08Y#3ND{qe#v@6J(`D87_P?U8vVSJrzsqiEL>$7AJ!wI- zuY=DaXu|gW5U%;NTMxscHE*ZiLwHOXedOKZ+lIAt5@w79n*q2%4KA4C^hc_Lj2OTI z5R>-dlGW4Jlx@fuwc!#Jw;MFLn1*oIQAa+2PSu;lMbMAZ4t0Lqs z=KF{wN#MTtaAQD}&ETe)nSt$%=dF??4Xaw0k+iSH6!We!E1ReOyi(7=B)$&&Z>o#a p3-xy)m0XhLJ9{qqL0))D_zMDVvx+3pcu)WU002ovPDHLkV1lKM_?7?w delta 964 zcmV;#13UbI1kMML7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000AkNkl+m_uR2!=^l-v5=Ii;lBg22>C{^4+vE*%}*u5s~aZA%psgqspIlln^2jwe)9r5|D_?+MLht<^S*z@MUSWTfPfPYP_RVJGUftT~~0FhM` zx-&a?Q&IrVczOjRnY1o|$zVp87&3(L>8qt57r-P+xdDkM!1{>&l!V{{m`F5?Myx>1 z{+bY600YSlp)u1r_ln7=6c@l?B-y~!XsvB?L&y8(B5(l=Af1g8<4ZgRwj^L8@I=rc zMj9W3T7Fyr1Amxp{763gLkKPaD`vR;R(uH<#EQm`L=m_E4A|ie0Kk_3Q&yh+DJ}qI zcA5PV7k~k~%zgkDfGSc0&a4&mOrSC&jafPuXdQzKU@|>t1EqGY2Tm>kB_y@~($m0} zcCCph7k~oNtX~vL>ukmPr^FUNS9>491)zk)m6wV*dVlYkUMq>fcL57Q6>R`~ja?I5 z-VfEU3t&MgV?{V|KrJ3|0d&%0h**rl?Kh1PwCV=)aku~!NDU-0HU(xdt{7@wz=Obv z^i~Degx1opdw|7hiSj90Jdq1vLvrI|Zv~~FE#UY4j&j{%gyjAMN`)Dv{N04B0R z@yK-o(0_OvcLl>mYTLY8KH(|>U@u9Q(yvteybtVWO_8Lzd@Qd|jlboKsjd&3BZ;wEzK(gcoq(vgv2mk;#V9ibTyx~)##Zc5W zY}t|)iCiUs8m&jMBgRppH{M7^?};F2J2qX3G=K9a73LKlpm)};wB5td7~hcssBPCc zl{7PJ_D67>0Jz(=v|Y{E++4v7xc}~>1Yi}ha~|sG{eOOMZvV#!fHJ=13zj5Xtk%z3 zWelaFKSlrm-_k4qJRT_R`KdIkmZ7LpaO!%E-m0P_1kic}%UvQy1b{U`aNBb^LI42# zG=D8;H=ykWYGWJ8_K6_tLzP?vr?I^N0PI{f7EfrFeXjty1kB#g&Lls1%dY{*b{8vh zObjrZ-mT^;ya3;_p`EaL;HekjBzG(;gDm*-0ILtQgmsiINd(mPDN(u+9`w>bJS13~K}8_! zMaeeZ_UrKOb<_Ht9=?2^&+p&!C}DGGwnnmiyaJ%59AOa=Vt-{vyNHMhl&R0v|Dd{{ zywLxq-7RTMr7*9KV(1%q`sLIG0N5!i)?8{{I0=9qQ)w*Cf#sWb z0GLBvC!(2J8gSejVvF9g+abZwcigOQU%$HmP>kA!@qh8rt16iBW~6!8KeDIy!3fkw zAy(ObLS%wY4;rwm0PJg;8tYMa^kZ+Np$FQ!lPW$JidIW@=iZgss{F#Xu%_*N|LGPJ z3mx(0tR0yd5856}iDdoZ^^Hn{X{cI`Xv6J^6EznhlmYxUhRL`34J!E!K!IlVT=WV4 zMk`sm>wiLPJDFNm>Bo;mZ0000< KMNUMnLSTYDMn{qW delta 1302 zcmV+x1?l>*1)U0z7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000EfNkl+frDr9DJR!; zJ=u?~L5=Ke6>xGmi6zUd*PQ2jlUnZ_K8lJAVKztXUS@A%QQ)mjx)8 zMMGD{3f7cWfP?$dsxXm7dlcYdph=HRWX}0ZmPL+90ZIr%&+D*;HYSyk%A<2y7KKu) zx+>`%B9;KjKx19QZ2{=Sa*da3RHmN5S{7NJdI>_HT8prr7Q<5V3!b09qo29WBEut3Rbf0=pv0{Ga?*@MHoz<8Btu z!P*Ct3(!ox)S!nbz7bJ(LDRbEk8(6oR!kbkzK>wDVX0JqXtTKPTD`fY?ZUKY8B z1Wpbs%je2yaJc|_u4VWvbx|EnzLi|oWp~OxqA#!{MUmjz4yNaxtzi1R<_DY`;N)8~ zjgos=-PQC|;BXj-o}r_4!aOUR%F;4k+I4SmR%&FsEyVL=0vpjQ3n&4l(CIS^xcaZ# z4u3`y6^YSjffnXz`2=?qpk?bcQisZEvaDH0E1@hV(;J4-wrUyly0`Vzc#||XnsriL zfK|gRX-5kzFB@$K4T!bxXj~-ph|z0#oEdLv)9eDci9u|=RtnD%wMVZ}JxgD;0k;rT zkFRf05RPz{_Bln?+C^nvLjom5(3FXmxqky*Yeer^<(KlWBY_e)CAf3)OFtx7Ie;X; zyi?Qv21|9?G* zy!SQ=z)gN6RN`Enrym?z8N4JnB5NB3Na;IUmQsSsAn_3{A=PW55XX?7YlyfyiY*jC z3PaI7>xAAx05yg1*7sry1xU%Crq#+v(#bt=H;G*So50=!R{MYJrr4@jUI9`XXQ~mO z7_r^^Bv=>lbUgbc>YcaxSxWJZn19)@4F|Xzt)b>D_@spQ_gBHF0jE~LliV2<=a0gF z3ov^}C5&e2kwlQTphjdWBXW-m5YVDnn&s$eXJ{=!;#WT znBkdcwYIG4Ub3R--PVKe-9H^ng9R* M07*qoM6N<$f|5&aI{*Lx diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_6.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_6.png index f99662e70f0d928b252670eb51bed5fce26b3b38..119d8d3461211a94ebfb754561209fa5605ccdcd 100644 GIT binary patch delta 574 zcmV-E0>S;Y2+IVJ7=Hl(0002`twPcO00I(8L_t(|oQ0D=Xj4%X#(($bC3#k`FW4d0 z2mwU|k&2Tj*c6ITkfL-_5GsN=6f6jxq*lcwBYGwxIwQQi&RY!eCvTRv_8Vj`0LhUV7N zi-iMswoJu=%zpryV!d*8XU(o|1Dq(D>(+^+l~_8T0`_S)^cWG5KVBv5^dO*>Yw_|~ zbk~pE(V`EhEo8C5p-UyE0mx`-Q_qt-o(99f>6)sth7;zq+R5rW$W=0B|h$*32~kR1E;ht5W^=UO=}Mz~hd^3;+=YfS3N~j>Y_= z?ficWdjZ=3o`0m#xcw!{?UATVm*J;=J3+!QWKTfoRw)D*D-t}h(cZ?+86Xinu-hhM z9_<$q5jXkZ1(H0DkvvgKDb-R2V5M4~@3g$NPex)p>9L%ruGvAS>x&zv6l)b_OA;6y|5<>B zRU~w0>|jmP0t812KyY*gfSa-Qoj++lO+)1@Wq7*Qj-@`zPZ%u#4`j4GEh>Y!11e9^ z@}zyTRF~F6_4!y=+=ssnlK}KyoRr5G9xV<{=i1%sYMRa4(Z>2#Fs5g{_}`PbYONJT zs&W@Fhne^2v44WI5VwJeF`&4=SF0sA+AA}Ht^jaJMwUV{*N89B`jX|@(F$n`ugwDq zN6!LqS26RRx&ojPGc-Yocxm5JKf5fxMdLLKAdzWHKP`PmVO%ai(sX1Eq^H#8j_e#+ z$I&(#ENw|b*V}C&Bncb@a#?r6D^#Ovmyy5$e0%X*AAcT=*0#+W%#lE3@=-o|YIQBq zKPeqW0j0h?W0%H8%RJ?_zAXe@0nq%nwVWjiSjx`{Na-{WrD@Q{XW4r{z4)}>>$==? zw2aYp7GPz!npR6M&qD?+{qpvDPid>l+kT6%dR&4>2$BREvC?kEIu6TvCJ8iPrNuAB z&I>H%On)xGL!3~3t*(Xi-Puo6Nb?`I04M~EPX08~MTw1e38JC?T(>1fJVl8y8={B($d~>?9AA-HX}w6DUt*dASC?w7BB}#uJ#`WvmX*U5kta21hsnh+_IVhED?%XCnn5I8p!tVdyO2RII#9 z@nYs+YxpoIaR$O#02%_01g_9w1)!8-ihq=y4%b=02|$-iB3pyd7Jv&u6hWX05K;ho zSKA`F1@SN_0{iE80Z`uQ?;)fGpwR9&oWA&_{Ivko*Rg1^cb?CaF#qF7%`Co=r;WAcNk3EX^%qHae(VA?6D7Dx mp63>?6!Fu_Mq2z@YxxaI%7@JgPr@4j00000)+kb35W%d7=Hl(0002`twPcO00K`*L_t(|oNbd!NK|1I$A9;m&&D*Hs|YBD^C6 zZ7N54==hk^;$FSi@T?C1@0{Ov9vnkhZHoWR4c#jMN(BOdR5)8%J7!06vMZjEwezc?vBwRdxL;o%2nqXD9?giA z3xxfiRYY<3>+V39{53Tig~sh(DYy}6$#9;Mr;3Tux`4UhVC>Qixxam(rU;x;n96(t zK;s-x7J+)6h<_|Zpg91gnHVphZ~%jx1%|@Ce8!J(gZ7U;-0t|E3m74ET|DE8NC=J3 zNG1hj2X^ck0w|Y5;)y8kEY^GhFu8Zr1V!z>j(&heb{0ybGu>o=m+Mie#SfZ6^Wj~| zpVk+TKF%IiemOVh^zCO|lfb8x1)7emu1i}}*O-sLSAU>s0}epKy~SxFi@MnDAP#7H z)YgH`7cwVY=-&pKrkwRWnQWZv++a}zMK0ZY^2k^P>m7{+nsxvNyHX|qI-Kdbd1n^L zj<)s;K`bGQmzWhH+oGGRLCuKt8Pg(~vhz*maj1Z{gL!kMeI>Sd1zRK(JdvV^C>#I` zrxXk)>~y6_H4qU<8Tf~?JX24S1&J&w*~gooMCMV|%$7y~9rH7%HxkQ5BZxUcL6!b} zT}@lTOK`JZ=9}+?byNi@Bf&*ZB~rdJ?hSV>E&NRkza$|dqDoCG-K}DItB$<@{{Ri^ V=n`f^3!VS~002ovPDHLkV1nG}AYuRj delta 1261 zcmVU>xfF&N$B>nwU*H6XWsW4`$QQH-7*vtXURYlEBUJ#{yK$ zqM<8e1#6lXU~{AbYz~(KP*Ya#>6M#0t&CP4-AjF=b`o(kS%B)(R?vHzhstnn!P}zX z&#iPK4pRXl0SxcTmfDv3LUm^hs;r2!lu}TnDp%Ka(7Ckc*Q?CEtGw36+hGaMvI405RfRAWfD4TeK+8{jK{^d=5xA8f-NIcKfTs}~ zZ?O(L!Ta731(6gYq6kR>2LP>jO_&j(dw}|sXR?jYRQyi10-jttsE9%;Fi zl_M(rr+}0oN#I4SB76!umOKvbfSH8r0ks6K!ysgy`H`%2fP=2+enmv$_p`lcRe}%+ z)bjXCa<9R2G`u2a6mA5~AA}soUuLgO25MtvS8(OkUr|a)64(N3j-*AR!PC|VWF#;M z59{|X9)C{=cy!RnMFOR(v^5}dXVqJY99pZI6J!(=qX8jLTca$p>o}MWM*0?z*Wp68 z>hbMoMg?dY6H)>xjIQ-%ajaIjNuU+QLxd3JY2{Wxs}PX8j4T0N@#wt&kx#-jR}SS{ zE}zvNO3#W`1-9zlWeqbD=)_eaNGGJ8en+07hJPY~HI1(P9zC;&q*X>MkM1?H*&hrN`?Q7lv&(q#T@>F^Xu_uRde-B`h8tJ(d0_6mb=hM2{%8rmuR6YuB6{3P|Rfb`t zb!QS7@lrHsaei6`5kc=fk05}@k&(bIkbn3BFT>sEdhcn!qPGisDH7O|nDIKJ8Fs4= z?rGPvMQF+*jdKLtzYf-(^QavnURoOUbH^5h-pymqJ&#Y!>IDllj_}->n zr8Y-vx)&qNEng^>r(-R+p4gTIdKIr%FeW0vR<6*3j074$%>7C`clPN)I1>0KM1S^V zFKO$E-T@?pZQa1uV9Xst;eC$8whB0@?lZ2eSl_7=Hl(0002`twPcO00H_*L_t(|oOP4WYZE~jhM$>CYMWNO1;HwX zqy_r}482JyLXv|AMT*6Pf`~nd2f>~^nkb@Dkct-%UUF0#j}}V=Q=}ejK`|H6qVX?i zK#i$M`gz#d>}HMcWtL~&dFT6f_ftZrG+~we$3*}wzEUD0S1C@?|Vp3Dy9CN`8sPsX@YU!s7 z7J+{nNfGOuX+e=K$RT>iaaM>lgif1BK7ek^uCGh&047 zZa2kyV;$0HR>qI5cA$IBk?jC5jH>wu06mtpEA1B%X-OzlVR-j8`fINE3x6146 oUb9~Hjvw?oiOel+dL8Td3pebpjgYm>x&QzG07*qoM6N<$g3p@@D*ylh delta 1001 zcmV-O{Td3`Oyb@Bhkt7pKgm=}t%}Z6RdcR0R|ve@2{MwbojaWBK>%4kW+jZX4Hi z{jwjSp+LKjpQDZMisO9Koz`8+p2u$qKM0DmdgD$15Y;NiSjfW|5k zx-&ai)3gAGlLBx!CIO(PtZma@ZtAo;T79%FT^pSz@gv3n8ts|3LAPlcs>7d!`MD^( zF0Z$9oH8oBv+ubp05pNoyExM9)&{lb=a#O8+FJXxGTy#RR_~oLxN5BxWvX@_*j1oo zi7c7d3ZOaR=YR0d+mH)Ld~l_*C>autp7wJKVG#zi3(&Udey@JdEkwbh@tOrd?$Ual zcHAOpT>;R1ttUP>2}$Ee&e5=(OA@Kkrrj+6EF26 zgTRSMLEk6vTtl1J%mhy2o0H$JXH`%(o|>Uf1IikPw(G z0LtQ_Y#(Yv_mLp&&aWn)Uf*gBkPx_BfaeCatRSklvv91i)N51-G6;MFK4vRm?N6(h zLEzy`2?BW;-ABJtptut&YQKlpe^(Hwm7y0N)Za+2hLgE?v$DerLP~j!>@|&$9u;>K zf?c(qlYc?rAgh~yPv0^K42Z|FnqLNK!5lq~$}H`o1c$rP6##8%mNg4#X=gcaG9Pmg z*vsOffDn~w^>$!&|L-M(KqtEhfVGbq1O~+#2)Z(XZ6E#eZFH;`NcQSz_0hH#Y_6`s z-@+9HHYDk?m>n%3^kxnhacC@V`-1dC8#yrLDRj^b%gG> zfzpQ{J##toN|~2y?NEF4O4=HvMx6Lkp1)Uctq0HsL@MJGk0ys6=h`iq;L)J--Ewpv zJAc9Nt=4=U{6sYEmn4l01!~-GP*TL z0eGM-Qi&`GDF6iRDJZI2NC9B<9)+U`fnvBIB+|3+2-NIL>Ffxk1yG=tAd=Qo?o#B{ zxXJ6-MAH6Jhzp2zV>5~7_bKTDj6_wC{Oj1mG5>L-=KoG9i>M?|Ee!rIhjq X=#3-;Zz#GY00000NkvXXu0mjfRq5PM diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_7.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_7.png index cf09a7842a0a864332ebd0f10693e05fe46a883e..bc407b6ff96f96fc65bff3d97c50f8cff7193ae8 100644 GIT binary patch delta 528 zcmV+r0`L9Y2b~0v7=Hl(0002`twPcO00HDlL_t(|oQ;z|Xj4%X#(($bHhl&$dC(zh zg@A}4sNmG<&TTtK`0bl6$EiIFHjupWN~nkC%9N5I5`Q83Q84GRKzXM%|-KU zp%m?V$Km~JUxIj+d-?dj@1Aq+IZD_WntXJ#>s0_PSxkwD;D2U}<02xaoVh+$!%TIc zlF-AS9Rj?ax&1V{H$#BVv^g^dfa)qA45iB_D-8hM3v8g1s`t!I{qnX0lkzg0K=W{U zb@AwOFk#AbO-^(tj24;uI_ySy8-3Y3>R4BOPZaPm0ty*Vz{`^v)|1) z5n4BfzV&(Q=6$FqlBM;aXgT0V9K#{td}377`JNiXr)y*5y-RX7ZSwW;&1diZZ_Fh? z+n+wDbTt*F)vkz$^#9~dwdUi!=vOk+D5Ij20F841*nfG`!;xu_nodN=gA|DK`jALe zOGHF|ZVV1?%!udp$M64{v4L9Rh%&eSA*tmhvpI$=+it@k42J2H_kU$}F|oOxk2D9c{Yg{P00{?U{~=U+_1=3c((?6m1&U`m#=-0L zda@p&flhX{em+|JsZ>RR>lppJVm}}7%WBqHT+e||tY)DRpnoRTDwC~5U~>L>fWayj zx-&a?)A9hxDFa9j8v+Kyjg63iA7|hr4$M!b;quhu5k8KqU(@FNYp z)TdVCz~Pijvw!0900oa_#!G{Y2an6kg~{Ig)Z|s40yF`G)2UCXEZ0d~Id~o)OZD{B zovRxM?D*kDz3zUL8Gqwi)-o`^=iaITNb%d6Pby12AxP(88g))Ws^6^O!usbdE#ol+ zoFCRp!|Va5i(1?i{4NPTj~KMv7hg~NX! zmB0y}82oWxPe`zM0#gX^2q&t%RMsN;&b-g3JT>_6{??FSF@k9iKrI1N6Jig@F@|9p;qUpN^+gfd6%o%+5JnD2sE%m{GSzrB?6Oy!+>ig zkP~GdQD+sAmQ_J-nWw_X%9vgU!(%Q)XktxD(|<&vRXlp`>s>^NYAh}hh|gg@*@#Qo!eoiSc%jYj?+XScWy_ZAxCKwhsgur zcmCR1KR(`tG4NxbLiE9J&G^$We9UdMxM~B&9biL;?A8_!^}~?1m(rhsGVIaj^iKg9 z27e!hHcV;*_;kT(b+~PJkkkfHBsPF7t{>xm8(74q3?MmW010uu3y4mnMV^@*!s!hl zJLwGouKj1C_5%Q)BxXuF&DY_A) zH-Oe`Mi3QtLrCOCbKuyYp%2OfAgsS|ic7-L+IyVK(CFfi-w=?&-Fe9{87c%Mr~Y+p za?JlYQrbQhH7&!Wcnbm2qDQv0UH1!8ztWQU1~0P2Ibbx{Bme*a07*qoM6N<$f;@cH A+yDRo diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_8.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_8.png index d12fa6abaeb935d184c0a5f82713bebc827f1ef0..7935a77552fe89d8172c9be07e1ce27d1caae0ee 100644 GIT binary patch delta 589 zcmV-T0$U)+j1 z%5ffZrWOa|DJ<4MMy-MM~tzEep-1PvINMAY8a_Pj!@v&|IQ)FsUr$~w{ zM64F1AZ771`|Rw*^ri>2iEM@{o4sfs>&at*0|u(U<;@c+;T+H*5=eu?fX>*=2Jov> zxh~lAdyi}>oqrlex!_Oi{^4POyO;^240IpA<^qJ?o!`=ssvxXZ{+x3nrAoYmmGoF| z&+2S$e^>++6fevB%0TweK=VTf16Vk}ZqIk!Q}0Gn1waL**0pG<1_lC6d2M_I;KtWI z_g^I*&((d&mtS|!jjz9;Zd4kqmi`YXhaJESO06QEW`9$-@LhDLOi51qNuTCVS4WnI zu^_0Pnyo?R!OGIiBnC)g&<8hb?y@fw08>H{5m)075n0lA3SfWvHo81|xQMm&4|0Xl z>Vfdg_DM;yT1we}z4lCem3>+Y%1MNUMx1+78)vzHV5=I%?iPlSM)5I>=`@M4}&DYBD`KN^?x(EFN3Gqcy`FfLK0vD zYLME1UDx#!u=?3*XU%erKrCM6kV26606pwZ__&P#){>WG*oUoKKou}rfZKasfKea4 zejt&h-9vs@;taJ%{d?mxezVv@fT(ko1Pl>+Ap7det)$YYY8%BtM$YBWQjj16p?KN%QV2q5-q_#Txx?jmJncO@GBw=Pa^P` zz6GoZe(jgh1yLUu;a1;~K=i75^19UzY7_A_f~f>p75uh;Mi;QYw0+eTM%!EK{q|h~ zX$sG-9UJwj2~W+}9!w*^>fp<@VbO4DN*{0_KPFx941u!Bw z<$dpX*}86Fm;heT*uX}sSy2UiCrR38v$6&2y_EM7vDGJwVG$Ue)m{mfsgZl*TK*({ zW6Ks$VSnYj9+67PW8xJU5`mG~&*a?lbGyv3Gv2GRY4^}GX|@qDrinZ>J|h+_Tl730 zwqyZvA7e6rXyC1i8`>v(Y6o z9aZvJ|2$vNJ(Lo9<1)Tl7!rZ(7Qp_1!E4{zFn{7Q;iFpwjuu#Eq%ax~F=Q&0_>WtE z7Jf=FECD7zYu7wmOE|6=CxWl}zX0?FFkg&SWs?~SvbR<CrK?Ynni`d_gu^prt6bW;+_E2i+o&nN=%9;3!Vnc22>vN?^-mln${uaugY49?MpM zpML>}9G_V&n0_O^^^l|`GRiKPHd;HmjC=KrS=wOP3SbE*ulmQdAKfCNX(3ZhWQ3r! zvw|=C*TxuK?Usl@uZ%0xBKg4b)wY{00waAzs&!Tcux;bnYVAnv_v0an5jnyirWj&zX%_x{%U zM(wq%sa_uygda_So>b6E#o9KWNVCS3_EPa{KB6%rDPPaFcB=?vfgY+$_2$0+3&*Vh zD{_9XuP2k@I0BrI7M=pO$|$#p2p*RONSr?Vy<_815%^dF)GFhNKxv+A({qL*@qZB_ za28Gt_?Eh1o6z}kQMxN9aR`E2|H*c9%U?;t%b00000NkvXX Hu0mjf`Wq~* diff --git a/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_9.png b/assets/dolphin/external/L2_Coding_in_the_shell_128x64/frame_9.png index ace68d642e239e5d78c917f9c877ddc4b283d39e..99072fae973f11fdc1da146427b30af1a96af6ed 100644 GIT binary patch delta 604 zcmV-i0;B!D3F!oo7=Hl(0002`twPcO00J;cL_t(|oV}9GOH@%9#((GB>&!%gGa-a& zd7({7IuP!2?#Td3~BNCE=G(=^D=p=B`UASFbAIRC=Y7umyzoCh6)s~RZ^f;w4u64}{jqbC2;fZHwbjz9 zJy)w^Efi}(>#iZ*IsD?l$ip-m=v4}Trr2{MxZ?pRk^Wp=)8&)zCnvf9ERng@s6C~-ub=4c z-db!qXtJP!xi9iIKa@H$)cC+b1BJou*mCEfdNY>D04liO{3mRxM$-lj>B#dj0M|e7 zyZf^4(NZ~=bnaEx(&YAY%0bnG-8As-)Tjek!Ay^c7k`P#tbCJbQkKN0{kTu#hbvPA?WAd2e%lVHyomH|&F(vi8I-W&lf!h=?1}5D{6A_7ouY>FfB$_|YtOX&jcwsgX`|X`gmNf=Kry8JOX!y5^xPThTh5$gNoGS1E>Yin)pc+&KM4Ajh zf!Z5BwN*F7j)DXzH}VI~wKX&jkmPoV`b5NUF{MqiT-I8P%;AoRNNLC*iLM+u0C;GM q^X0RO(M{7YVyZ3EHp&4=l)+!0h4=A3`01no0000Z++YHVB9s(Fo5~O1VqoSp0dq1Bqvm1UMW? zfWwglI2=iU!;u6CzPdDGBmshOT^D;TJ%6Xp|G?;nTNYpt9%%Q*s}xXLDpAZq|U>`vHti~w55OERp((j}k@7|y}%Gt0q}joyAp zB8z(_^+OY9QhCX~)jra16iW!;?OY`RLWCYryVm#iz7)AQ(Wi+tZQZ8Y0O^O;Zw;XY z7@4V&(Ll1x&3{-;kV$npJ7}LY@kfQCRM&$r4KNa-DbT^CHt-{a05hFm;bC|Z0mt+u zAj0|8E}{#(eL#d;{gecvmDQv7H9JxnPhUNlN`NTmxAqZTfcB-eRU-_yw$|tECxxUb zta@$Rl1)x{a((T=Gy+6BpSCp`<}Klbh%#Efluu`Jvwv1{oYfy|EIpW}0ag;AloW=u zFeL)4c7AO$ojZ=DnZPRIxW68td4knIGlVk*XK&8sue(MEBr!wF^bBCfNFZeZJ%W=y zw~m*!`x=G`U^xwStT&tGRlrY@q#c{KThKmB`AiXOHc%9DyMb=$ZYCXI=!>k(s|$dlSf#G+PL8jpn~ zyMP{n=XJc6ag)}`o?L=-{40q*?!MIqwQEJT5iPL%oj`O8sObQ0pq!YbONjOm^sh@lbhWIXm-_)d<{ z1Q@;M?pbv;;TX}52Ve7l0n!hE{4iRUjqXsS`dUQeb~TddqwUb8bav!?9RYfo?rnp+ z#|cEOFH#-O(bbkD4v}_x&@BRyS*3|OE)R}~z)|e9^z4AJOknF&&-Q8t(#bf&BEU}r zMt|W>3cJ@&KdYMB9u^o>fQ6=zpPEJ+6*+AH|~)AQG0)M1_=fq$??K>pN## zDlg?wW(dMp6QE}+sBOjCGL}fw+NJfW;^+D(wdvXN^(*mzU~9!r3lW!w?cHjkE>af12^5q~%f zyE^j;nz_u;h!NJr1X)&xi=$HTn~SSkKypZzC3;Ud6O&PXD}0bT-j za6s=FzI2+F0P_Icsnyf4&J4775;YrdM$ZJm zC(nhTlRiSs3cz}hIuaTV068c`LX+VQTF`u0gv|g@`s#b>?h(cJu0)Ed&3+ke>Wlr( zTZGZ^pJ`Y;1nOWS9WmlUn2`)c_C`aMED^&`I_jaJfuzYH=mF_yT_4eaF|XYzp{U>i z#Li?pAh0gWVt=gz{?3m71|a<7s+9YYV!-`wpcFu{{xPNsT~*WrDOVQ*Ll2+{AW*3| z5Nqck3kd^sJp=LTnzYwpTnL18Eqd)eS+AiKrLGw_yj?IoJcYiSv5Gb-PY6<|BwM)R zi_VPP5n@obrCrnYRKnJDD~mvJ3F1ZaDR2P^&ZDC%Eunq+7Zju&8>O{ z-0VPo`YlCcGc&x9g8Yi~E9EM>yY0BM-=)l-l)hYgs?A@Fl@o=Y59hC$xmOAM8_mgg z&DK`6bm`s_ifsK-Ym>J}e>l5Cb0iBr>mO%$_-xfN?rao|346)&Cv=Rjcjd}nwKV&t z{di5J=0M1o_Z!QNg~sy6El>8lVNeuA$d_XjMR_@J904APtJopZ9>n2_@i7=U z7bDo5qK$XJUPju&uN5^?pmsbByVGQPN$hY<6bqD1?xCG>Ooqzsc5iND-YzkV`(MUu zy+r^u)WlR3N~EUfj2LD#=ya%2uU9Bh zW1=F3L=`@4y2B;X4uf5Kfw#kBWmel>Bf*-eP~sNUg5V^jLI@Q}A{L4z5lWGWsgxvv zlZ;h5foESS-*~G63rNH1Q==wv5?9fj0#Tuu0wI+Ij*tw6A_QqAX(dfqX^TQC2NLDp z&UvMid?wJI-tEiT03R=>i*taH62R;jKKImvxto-^G}{Q)(b3Vbd+KgLkUuD{F5A;P zl-J?7g@(qAj(+>#&CXml|0Zr_S82ZHZeDvy*Ju;jJ-hsezA0>E#l3uYha5U^Z>Hrj;ykkbVy( zL46TIbF*1n{J{pT?v6xo9<)U43Tx~)`z5sFVb6jaPj47mAKvhutpZ*b7P-a!N8;9@ z3ro9Gg5bIvmscG*Qq}j>>KVNk`=Zg*T_+_c-ONz+{$JhD?ojH!F6!FjbH_(KGvo4T zNzE+3jDH7L?fGc0wxi?flfyyRHyoX}sd35a<>mwOs(`D<6810nBs+(le86u<`ih#^ zy}u>s^$RmR4?>Tb!eblzdgovIYz}*P@xhY*>qgA)p<$=CdWoYxzNapsLOtW%ntDsQ z4(XcR_@lDhoOz~JcYDjDsQpb_D|=EW^|a>Zb?vTdi!SxwV{T1quXIbck(b-2s<>lA z=A4kxkjeloaz{{gXXn+Y0edb!OMh$%zf~Jw|8dQ2`@z*mMF^XA;pRVs=Vx#4^z56% zZH|gqDAqKcY&;qg@kMJ$LtJNE;i=`Vk5=CdHl3_0S3S)2d> diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_1.png b/assets/dolphin/external/L2_Dj_128x64/frame_1.png index 32e13541d83eb0571414851957a4b8a5647a8c03..efd0fcfafdcdfab812548ca38510eb19bf2a8850 100644 GIT binary patch delta 602 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 F(|@~CN2UM( diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_11.png b/assets/dolphin/external/L2_Dj_128x64/frame_11.png index eca4a1296ee3dedf9ebd3b010c7be8763eaaa44d..956d31d02c7c866adc21ac57e8bdcc058797dd93 100644 GIT binary patch delta 599 zcmV-d0;v7`4CDlm7=Hl(0002`twPcO00JvXL_t(|oNbf8ZWBQehrivs#23XRt01ro zg14jshl;`^SJLGX>_-5Jg6=kNke&kGBBd{q1#~2VAe#AoEvNaP?b<56oSluH9+8G?hwTNy4BswL!`jD9(3}Uco!^!?-z-Srf zlK`X|H9P?m+^v|?sg06OW_nIV08Oy?4x`bzh@@}zg0Zx0Rt&GeXSZTl$Zt7!6=P#I zlZc&)A$IP+AKB8DLg694+Wy%7TjF!BY0T9y>Nzk<9Og?%Jiv@$`!P%Ku zKh&r8SmcZ8`GC+E_$e`Dj0%_*G`rd*lR$+jfcUi0j@^mGfPMwg_D}6WXDc&LN7p>@ zLV?(JeqAI+vn}6>WH<(RHU>?*@iUKyV-0kh0LPQ|=6@tcr#5n4W_s#H<98O9Z|P4l zdnyu{PonE(J$&Ur2a7KB7F#I?sf{l3%sk%~5h>&bEd3nwuq7fTrea+!jqFQL)*KW8GjOjrMs9qg`8!)+sD#gKRA(Cf&#%w)b| zkf3BHc~Hq1q%cf2p=1mIxC{e8>C{HhHoYZW8%|)%h;mX@y~hUVwK4Tv3AF%5Dc59? lMa9%sY3U+vO`sfPfWH_G?!mKaPLlut002ovPDHLkV1hft8M*)f literal 1660 zcmaJ?eM}Q)7{5{wsDfm1laGv?g=~Cy?e%)Jca>^OTLfY&D~+Nvlk448D)z3l2egQz z&P`+lb&HF*5tVG6ZU%;lafqm>bCdXm&S7L5V{Aj6_<=^iIbm0z&OeNoyL;dFx##yh zzvnAgn{QeiC5jgT01%a%qc`)bkAE}~LjL_%#5NS?f3o1<(va*E4De$9i*@h7#onB$x(skEY^LQ)}@u&y;y8II!t8wdjN8j#z|aD)e9+(|(T zdfH98>`uZsFu3yd|`-ndX_A6&C63R}g zNCl2rQA`ODq!ouyxeSL08ID0Ti6W>>VO3Bt6}0mryh4W~a-|N<&eCSfWCp!f3mbGg zxdJw1$g?n59>nG{ZjN9`I_TTZ`<}+iUy4=fTr|P4E(^=93wA<&G0U;;V%7;Fs00O5 zj09ZYE@pshv5veQDF#%C<$5)DPfr$!W1Y1VI&SiC}zV51%cWKt6VJQ zDM|yK^IRtdMSOb(w$EmRKRlZ*n&C&v#m`RjuGTz$?q=jKu^9MuVq(I7eb27|5aP|% zYb~DMKO62ao8Vc74Sf^-H=EP3ttUd7empeZ(3|R&+hf0Q;(q`5)48`byTd&P(!KSar-7QgDb=rJ z&T`&d`M9wt0jL?BCvFSNU#0tZ>{H)9Anj>VXyYf=wq5Vog}8LpwTUB};}U-})+H7T zyCc2c9;bG~psDNE`jSGAgkRkqo!QyGaG<8BCY%ur<(!Py7+XdCH-GNfn*7VCuWO4S zW?$NYWptGfwe?u|!gQD4GPjN0FE>PQ@LxoifZAKo*1Jp5wymV%+~(7C3= zug)%Nm)_oJr5ZLj?B5mH6a|b_e7;%|e<5CDB7|^Q^al=e`ddFmJQ3vi1m(_9>yz(d z_m21ku{QINt;uwuD_q^`&-l;zS;6s_ZjuPu#^3Jhie;4 zyLPa-gK5c88&ma)<23R0+<~1tYBdc)&5FT<^wL4?>*-}9<3k^IS%z2iSJmAJsg5Z) z=-GC=_CRD(3>tlY{eqT(^ME0G`&$14Z_}mH{MDggW7cQ?+;Du^+dJH8x4jJ)Ua2{> z>~g(N{eyW!S9Mu|rl%ztC@&cbi+K=%9jh01KLkF$DySH{zaTx*GV;{|W z(mqGi4mm_>8_+bWlaD8 diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_12.png b/assets/dolphin/external/L2_Dj_128x64/frame_12.png index 5f92e47fdd7cdffb93e2cb52b64dd87858071c6b..a99135d7b154a19a28a8ec51426fdae9264cdc2a 100644 GIT binary patch delta 582 zcmV-M0=fO=4ATUV7=Hl(0002`twPcO00J6GL_t(|oQ0CTZqz^!fIqKŞ#0*P}G zbjuUml_{)XBqUye?(PMGpbG`ElY&qpUVuDCx-(Kl8_IOIsW>DQISD$P`|(itF7^c^ zwpx8V`_0bmfC12o`C4q8yFl&&{tpb$k{YmpK%q4Irsl{i$6qacD9JfaQaLi{N9P%smWb7gMj`Pa zSub0rQFs*g0)M4oQzQjer6unvRAwUZb;t%^?Q;NQR?u3}l8@i}?iL(lPO1 zlItDTWWw3njMUH_qZRkvN&mPxQ;`Li4CLlO9oPG@;eUGX_5#REJecKrhqg@RWqSsO zZjtB*bVcO2T`YR)(F44i!%4wL9aLuG#L4xRlYmtKhOR{VQA0#x>EAl0fF!klnF5o= z-zIG94sZcDrQ=Ae#-X%C`l7J(AVV(ST1cyR6o;EP3kL)`guNe7&KL|ikx0zajLCdr;GM98U}4iz153Ly=JC&`Fv!P1~fSyxO9@S=M1UVS3s$Noj#LAq}>8J|gGy zrW?~u-E?z$zHcWJ(Xs6We9hwyH@Tfo*ii8?<=n3w_Ddp2oF7Az&gJk~7)NuB}nY1YMnRv%f$ z6f-1UQ`N>~13=U|ucJgLvCTD5tWQOTbyOiAC!ql#J2%9UR0Sh|E~d=uH!AzSX;Fe+ z+NhkbwIMdn#CW`Omh#NJr9}>EX$3{l%G?|D~;}^&f<3u(8^i0oS1JryX=bTvALAFSW}{O2qN2UDfzlDU z3&ZsgNx29J)2IoER1-MFP#B7-buJx^&=EV&!|O~0s?nS9!h-xlwc29N&qpjKlSYSF zw3-4O(L}ITe?TDp6ch37m3$9l^)JL4OguvhEbn01%19^JJ*>b6JS+#Im)P=Yp6esi$rpIx}MbJ1zXtZj*4#!ZO zaw~`N^fT!jYE?-hg~3JG7;qFv^(3Q#^oUvm;W`Y3aEd@640q$Cj>O!gOQVD(ig37d zp6R5BNNUgU_UUX$ho{rU_@$BJrP)#7ubq|VF2+9BVUgB>fq{LUySf2D?y{Qm9igsY zx3_IRgN!ow4h-}jIOpQsRJJK?UC=?6Mvx9J;F@;a+2+2oO1 zzFu|8wr5WPm{rl>cBR_o?VslQ;wJ2+GX8Bz5(}ap-f{vhE4e9VYWf%j&fiQpdyJY` zOU$$%*xg^6bf)SndlFoK{Crc!jXgK~$GZ9)*^TqA3itBjoK&zWy7utr?zXq&2mdHJ zxxBe<)8);DE#u-x^glR%B{nZXFAt4KzbMW(T^ftZpO_NMM+YaZPEL9#-!QKd(N3|?l$+N920Vr zFP%*C{FK(bA_hDPFNyz4eOL>;GC6hA)+a3)7y5K@qDQ2c_;&$X6VUwqHlTK-%;Ou| zfQ)WaC?*2STDRRjQ@UF=ry+4_IhW8oL3Dfqsm|GNR+p#JT(`^_Q)>Mgd}BGEQg`r! zhDCXn)?hKFtqTFdw>`ZNj>NZL+dsWDkQU`!d}o1jBL$*qqDNK!5nhZ?zPej}$m- F{{s^?M>YTe diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_13.png b/assets/dolphin/external/L2_Dj_128x64/frame_13.png index 1b1017ce259d7b511bfb2d6c565cbe8350ca929f..3c5ff7b3374e5bb3a61b9e5cff11b2485d0c2b1c 100644 GIT binary patch delta 597 zcmV-b0;>J?4B`Zk7=Hl(0002`twPcO00JpVL_t(|oSl+bNtp)aA|b^Ef7T)>mpHzmIR80Q zGS%ws+cz_BX2AhiVG^^${{rPdKoF#hfYBUkX-$D$V5~%)Vt;}0^3aEMhPnTuSrX2H z8$U9o{^aIJ)zqJ?eur5d9*7Ir$!d&N4&>rV&fXTb4ZRE;V(G7+MtqvmLUI5vn1epp z2-r}~5zL;d`saApgV=5(V^#I9#B!**Khr=a8ejle0$c-&urks>^-8?k9qJd`CSrWa zhZLN<>#P+Xjeka(unKJaI>`|p-n$6iSG_$MfbjVA=lB@#E;+d<>^7U_dO4^J>YihT zO?{(1kSvEKJmjp=2~z3J#<&lu$>g<5(x9+y0Hx6rPd}yd literal 1654 zcmaJ?dr;GM98X(TD+i*^sccSTIXtJPP1CeZdK6j-NN*H-(8=R)Gfh$`&?cmT7Iu#6 zx%0&-6BVc898TSx;Hg99oDZhsd~ABCi0_-5!tmxD+t_?;Se62H{^6NR^85Y1`F_6N z&-Zm%ZO>W|8~t`P006Pp3?f@xgW_XW$i#P#V!cgV;)S$4A%}Gdev)SZ3(Yzi(CQ(J zm~4imtIE$aNdO>Q>2~A^dA3X=#d=g^SVtA`a3UH2l2QU3NtH4J=wyoAUX!x_+fz!= zO`DXtIvZ@`Qki0RMm5jmRA)J;>QV})l_|+!Qotx0@Gt@i20Ue6pD|!k4%;<~`>CoRG!Tarm{Q(;wl)TU|0hha1{k3FzQ5T#x)N_U_`5i5%GpJh*5(Y5fmJ~ zl%hwTb{VsY^ihA}$)qe61kR{d`~7~EU#nvIBDDs`@vsd9fkX|+SLGGR0Oa*0L@W@D zkK)~&;AXvG*dpmmSS)Z_YN}Qb zr|GowF<2YHTD?Aj^ioX3w_Ef*iq*dsYfR-CQeb%p%a%nt!CuS?tgo2mKm=8x;A|U7 zxxHb@d*LdL1Who!yON>PdDa6Cr`hO!1qGK*t4Ex$6GAZD0HFp9gPb^xLAX|@G3YTA z!6=t<6i>gDzL8cHC1My{gpCnHFvLJITF3xvv=F985eTDj7(y`@M(Rn_MLM-gwMbDN z?wpr8DIyZvGrWB<8{*-`bTM9Wq ztw&pOz2Czz1pefd5QH{lj9a@_|D7_VI224w&N(ydvp>vR>5|1K zPA)D6LQyN|o{oI!{$+p9>*{yNexKO+bO$#6cz(h~cv^Ew5882L_OS=V(n-Lf-uP9a zRbc!50(0nn-M!Ymi<&N-Q0&rVOg;Hi_d%D=UK^8d?5nsUZp6-0nAzW@a^uK)n`w*acQz<;3$*I9tbQ@;V$A-)mv zNPSraroon0L2b}l(A?kxVE>dXoIM?fpnQ_ z475){sFfO2cYmaCS-vo`4S;^@umDH<0xQ%?%?9~0Kzjm0Oc{=l>wYZihQ6buaM@ro zvQ6&k_kIt+(JpfG zTu6THV2=pNuNCz=_LnC6TG9XyH>axU4Qm_YZGY&I#7U~Z%eN_Fe_2~ zx?6|BWqs}0CYw6e$D0$eyoDiONr~uSglQcy9U!hajEB%lk-}x3x?MLp1Oc&ZL!BQH z;7y0QW6Z759s`#EQn)ve*c3Pd%+xVrpB=Vl^D*s*9={0S5imJG`F{0$=6D5l`vAH> zr+z1@Ls~0)4@;w(DIlstB>hq>sAhWgmv7H)GIP8HY~$=h06;7|0Q-|JcJ{cYdWwL{ vRQp;1_f@s8GTS-kn=WvN>bbGE{{{a5KLF}eXtd9A00000NkvXXu0mjfH7*h7 literal 1667 zcmaJ?e^AqQ6i+R7RjFglAB@c{t$MK2v}qdJq=2Q6qCG6DwJH-Fq-{!b(5ALwlV&00oqu@dl6=44_kExD zKJR_sOUjLz^FGOa40A zApvPyvSe9;0XDePCc(98qBlk|m?0vJ6Hrjqy+*E`=d049h_kF15l4j9L&IWuFToFrtvb2zNtrL@h_v z2nvo}63(N?W>=et^f7i0Y}cQ9lj!B~r&l#A69$r5fy zYNKsxs}jd7D5io)s|ANpg&c=SIgUY;6-7|F(xSA%wy>QS;W4=i!L>wcda5>EF4qxS zEv!pRQz&6wf+7`z6=AI2)#^x1Qws?O#M!Xq?%Z%IiyVW>>^H#9CtWE2;BZHH%gY{ax9> zC)HKLoj@ynAyGVdW}pYi-+d>lv*q>s_e8*!d-?!-{^s#Mkx@3S4ghlgou8e}8w!e( zo|e7I+wsUVyr^6^#C3}9o~_>}zP;?9_57YcelI$Alo{-4NMmufIf zueUd?-I3BUNI+E6Kz>!b)aW;L$IX)5-hF!t0+qd*p?LS1!jfsT z?gkSAZId@$l73gx`nIv0f9xsCyL*^Th_Kfh9_(zX<2iyA9m3NwRBY6_*jWKz*%zXtfZu9Xi~;@8j}*ap0E4 r14aC?w7aOMg&+C!?=^uYKr=29SRN~Sr=Tku5B(POx=f-uHE-R2HCSU* diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_15.png b/assets/dolphin/external/L2_Dj_128x64/frame_15.png index 9b796498c0c48c2c9125e98dbfea9c0c812345ef..69d233ab575adf016b9307608e4cefd2995d8b36 100644 GIT binary patch delta 322 zcmV-I0logf3ef_P7=Hl(0002`twPcO009_DL_t(|oORMMPQySDh2dvM5Q-EjQy?WL zKsf>OQF09=3Ud=~f=f!bG~je8P>_fvk`VT%K-lAl*z(iN&fC=pfP=b|OOnnCgKTA> zrNhi&;&ARTa>z=D%0MfJrNhi&;^1TZWWO+S_|wuw%_Z$))PG#kg|{T#_t|qv8BHhw zxB==o<;utI9U6t_0w;h?sK9f)I_w=9hbn>~VN-sF1W1F9?hEVwjt>9|tN1GViZ_6r z-|-Z3yZ~ux6`xgrM$*>TVPU}zw{brz>Cx7KA`M&KRSox}4*#4>QX!QQC~aXV)x@Ml zQuz5?(n*?Z0y`|w_~96zztz0G3l&porFE#-J!iC+0Z!LrS_ObP#~~2l-{tSlH#1p< U1B}&wBme*a07*qoM6N<$f*gXBxBvhE literal 1344 zcmaJ>YfKzf6rKgPB1nVPmPk@M9co&mv-4zjX2KR0cA?vJaiwdam25kYyD))yI5V&d z{%}KUjP(aL#-t@ptfo~HZSg^DLSwYs z@0s(R^PO|gnb#6+trca}We9>)#P&qmq0GUjv9uVz7fMIsP(0yAJKgf-Jl&v>fno4Ks|yKzp5oW-Ol(vQ8D#^M^_8p1m2;$+-v20hxIAsg%;YD+3Zy^5e>4ZG3$tOyDo8(r(j?6gBn@wzqD6`oX%=0* zFc{HR(_(w1Wi=k$g|HsiwM2r*WHNya6EN*=f)WJ5^Fh-%w7{J~!@?YQmWe;VsrJIO%{ z5beM*`)viDNxHTGhV^@JAkPr85udd+cra35#8moqV7ReJ2!me&s-}txC-5@M2XRS} z1)OCl0hcI&$AQAqEXB#3N~#4v>*0ASNDJXeOG{I@g`%R7aF~oXH!~a=tz(*ak||(g zhT}?x0t&G;7<&~PeIQnBwt?iDcG5Ka3Z0PXFntSWt`@PAkGGP9+w4`#|5U23UWM4^GX_9#jE#~Z>3eC z2Bu*Z*oZvM(?JO^c#xzRoaa~?=M{m(Sw786oW!OjnZXE1k?=a_zD_ErV0(JYwb_81 zwdn!|94Q;l&SPbN`~>H2Lt9@`cUJ=oZ-7!G~sv4Z*RGdpLt(;QFk`(M1HN3K3S3x z?h*foSF4IX?k2lNh@xByx$Xb`^^t|eft<`8dnruc+pu@~*vV4j;ATZxtVWa@+h?~b zAKm-(&eCFaY&_K3@Yn9CrTJH8o$=WevIB~D-@hQ>q4&yD>PQtJ6~$=vyH%iHe!m|TBnl1+LIqF|DDd*V zh*zp{+KUXc`vAZtBT+CjynMXfdY5npGROD~*X=-h7K3KYkbfj!WIHqL_(C0sw2M(t zElfHG<(|QO*O&m00IUz#U@KysIRLZ@Y6aK-fh4~qBQf3zOgsfX@F=D=TJolIT%5sH z0Z7u4*>+_3*Q244%rT@3@2wa{Befb$BQ>f>jCiAM|Ho3P!RLD92Zxed@yO|aUH||9 M07*qoM6N<$f|oRMNdN!< literal 1251 zcmaJ=U1%It6u#*;Ce${is8o%$on$xmA#|9Td*{sg zzVn@P&v~ypxqrvDC$|9rc9cu`8d*E!$qXjQ``X|_g)C1*g{kO(XGJX(V30LE9aCio zHE<0hbMEK`JO)7Gq+OqirYaMf;W;ddeb~0+6Epy0>9&uIX&g~HZrE;${`1RoG-aD9 z`nAytU-5IeX_w{$d|-aEZp=>`(4^C^P-AV45I8tORNI+xL#>^n*LXFukIfuSt+_>$k#Zo)oQUViS>d8CqM{e4pC%?2NTY@5o$ATIMQRt9rDs^R}-Z0a4>=X}i7aOlkj200UJ zqz5MTdvKuGk*LvL4Qz5SXeRF&vkrEnay~_qKdfn+nxQ~dm(?VL3>`AEBtQlUP-U2{M}m zxqGNOQ7@2nb#?X3Pam(4-PLkFTW|mT$CYn}&QseH)w`?5=P&=b=aZ!$sL6>UOx}E? ze`{Z3VDQ4?q0HHi+qZJ!SMYAf&9*X!GiMjm)XTRaej`)8)PMSg+Ye_-nOl!u1k1Ru zZ-4*Z>EFQa{^vT4Q^$6_4{FQC<*#3o|8x3-qRjV+yf zhlH=c+dVen?|J(B1@P>hcfzX&hlV?U{WG}u`Ri{dmbV-{HVi&{Jo7>NE_-Fyjpr|2 zTL4D}sArCE_upE&xcB$dO&9!q{oi4KUt%P4Zs1<$BuIdp=XWj~{U~dZTtT@onO_<| Ga^gRXW|=zx diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_17.png b/assets/dolphin/external/L2_Dj_128x64/frame_17.png index 80863f0b6935ebcdc353deb69a6b5cf4d0c4d4ad..f606afb4bf725e43d474579fce86d188ea178be6 100644 GIT binary patch delta 312 zcmV-80muG~3daJF7=Hl(0002`twPcO009n3L_t(|oUM{EPQySH1;;qVNLUIq$OTez z1ebK=C@v^C1jQaDN1&vj@Db8dAQ@4F(g+a>NFIf~-pxvQ8-8PJH2c1vwWyyJ-5e3j z-=K^dMbyY6M$I&ukw%Tgj2jD*I+j5df--uf2thu6~8N$bJ*zU^Nu&=Ua8;Bj$iu(<(P zIk5W#cFSQ4WHB@80}s&7l@DMI%o@DZ)n_P7|*p`cWu3O-I%%|8ZwZ%HJ9W~E|~=*oE27&jfM8X;EgN@(wi zDFRHO&Nw4+p4zXX5s%dHq>@&r(Imqp;?XFbh{af*PK4M&fo7Z7lEZ|nc-Xltt%@l=YD+WXAJXoq~g(Bb#dwD4_l7W{^N3W<Y-MP88j#+;%e)*wV`r+Q!^6&d*!PZ}nesb;Ey{|`4O@H^E zwHM}3|8eWz{nxu@dbl(Br3>c^cWWQC9SPidt0z+1Om{ACD`0t~x diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_18.png b/assets/dolphin/external/L2_Dj_128x64/frame_18.png index b4527bc83306f43a5ee138258cee037f073fc276..392b12e25125e5397e0a15b98b3dd64fcc5c167b 100644 GIT binary patch delta 502 zcmVTHP zxLCC8Q37Sb6?Is|7St&`){k9S>g8@y4`j#=0DE_vv|x8VUDx zUISJjTAhQ<1eBTscs{^wR=e@WHGqx=)Js6U0N{fLuIvMmNq}bTgZjBe3fcfy=Nfjl zA<*0eI6%{UzJGu-0%B;!&`Jj)^6U7|$v*UfMN>rN^Ko|a7G*)-NCDc4AYjXYUH~u$ z{}zv=8uC{(s7MKjh=@G+zFz-s0OAxw^^A=kpbC&rBUJGp+^C0u_b~yK04yKAny_At ztCY(_%-QJ}xKx1U>x9+>pjRp69RTA3e3=HBZ2+Drz;B%)+ma>Fac%defXraGw4ObA zp95aveC*}dC%K03v{cOC9?->sqc(BqewK)cq%&fmQ9bT3PSDV!RP+@_gDpX7HAdl8 s^Efmbgbq%T_lr4>N<}sXz>5L?0%As_SiPXlNdN!<07*qoM6N<$f*hpfeM}Q)7(YLT(BKS}%sFwKrxQi5z1|(yyK05P6{u2HDwz#iNUwKqrGxfrd(wiN zAY_|n6Py#qaEfMbnr%AgK25WY$!21Mf-VjlpaCyX1T^fe@dXWGBQ|2!0QYgR z7DGo=lxib3O3Goip#^dPpqz%lMS{?wdQKw}Btg4K3Ah)cBtcSIf`m7&BMmy*K+@>g zg+Y%2$!)Ong=7BU$%s`cir=8shC(4th|4_zi1?nWDpsS zbzthUYjF! zJ!ooAEOw&kjOXCQo_C2$%VzKGJoEUBtn&x9RIa)DMYM7aUUU0Y^QGvtTSLg&vU6!^ z{++SANb5iY&t7?~x%I><=e0@da~Vs({*6dauBCBc>iCE~{bWPu9_G)#w$8D3u?^8} z5;gEaws7OvD_c{X!M4jcGEf61uzU4P(c1+xUtGHxu`v_`q=u$!{_=IJkz2(knwig z6h78eu)lN_-H>XH|;_$zl))tN7eM7a0-Bp>eLkt1+uU36$^2gP&KbYYU7z=K$u}3bzxu<>2}iPRUG>i&yV>qE zty5pWx9h`c7rKWdEek&_t9zks#p`A7AoiIr+mkox+tV*auj!lLyw|$CV#l<9qT?d! zEw!PeeV>Jn4}NTQmMOOJ!?m_4hiYfFWZsFC_Wz3{Qw_yId-t_X`N+V~)hUtwjl+jh fpD?dzxRuq7Ftbvw?pm70#Q(Myb1A?We67btK@-#mT8t05)-UM7n4Gm$tIa= z@n*~<7EU#MoO?OvybAza6XSl+Y<&r+6Z}U3{w6s3SK*1x0DooK^>1%2{pQ)sYLOY8 zXahuCTCPD}Bs!FM1I)z%x3mDFj9M$si$oM{6QjLRI5I#H4S0lIPyui;@fG(*i)jE%(7;u~ zE|h#I`e>laxwg{WgX=D7Urt(ISBnA4f(B)&wJT8KLIA+7$Vuy0ygKEvfQACp+R7+Y zMF|=nz_5!lJ9&c=jjBVf4eI#;pmO9VaDUYVO0IxC5r2t$(@y_g(Eysez_3dIPYfu$ zS0WPk!v1&wP|&v~z|$`97T|ynA|i4Y_NM??4n;&pt#Eu=aFvRPh(yJ)RR;ExCZlIF z31k9yQpI#(0X&m{)!5xeIel9_`A!MALORmH&yh9;%;x~)gH-Ve<7;S;f`%f{$tjD7 z%&aC*?keRqz%bAt?2#zqhO6o*RV>``cs{@%^B&!#Uwldi00000NkvXXu0mjfgMR=8 literal 1530 zcmaJ>eM}Q)7{6L71%}|q+!x!9b1`bX-Y4zdg~Cc(5JREXIvaJ9>)ll@&|Ym%sYDTR z@e>ExG@5M$wq;_(sTs`g1q{okZlXA|S>iI6snacf42>93ySG4{e;6-!_rC9Q&+mDD z&)02qmKLR_zM2X_PtFEp#R8s~ev;-qqmW|sWNfcOAW5wPLPLNX`}Uu9E-Wqv837Te4S_+k)ckrRw8!3%OAE}0&$ z(n!!YDI_nK#KMr`hlkV5$<7x$th!m>XH5Q9~8EyFuf;5B0Hj6vb|I?1+6MA61 zEgFkm@9msAZ&7B|`F?9gv)Yn2-uc$I@UHDui`z6?AJ^8$wB7QfF6hD!*1O6{H1mz_ zar)iA&;Dx5*korxTFMKn)P;-f`=d(e z#O`;Rq}G9!B>tPc1<=Rq|9M!HetWZSP4WfU)mt~VydGBFcP3sNbC#HulzYyuJ}>OK*P?A$+w^zl{m##_S|{h8YpGlGerECpU9LWQ z^F-Ex8OaSVXQrJyoqg#j_IjPQuHC=!;Pu`;QMPsFwSlH1f2@V9gF`OSb1A3cs%QFp zLzUdw+Qq9s+PCt+vG20(k15%DweRM;$&-%T9%NiOtX-#@v-JF})G_VLyF1}%W7ChN zyZ2PC(KOvC>KBkh(;!#2(z|Kbj2+r7y1q^M*=2wA8SnM&>^XKZz2^4m`Tu^}IPL~D z)Ux@=oNagd$yF(O#?Jdt!^GVWQaK-WH$+dmDHSVqt!%q zvS8O-=jkx6oAw9vULM{r-{*P1-|zdt|2gHofcX!_-wU{V0e@%rRc%+Pc3Sc1)NVk> z1yHdN?RD-jG(cn9lifp`K4icsRe{Jl5A}8xXvg$W8(vk1ZU+Z{2S|gDO8^Sp^sH&>jBTNiwcXdmKXsfu(XrQN^th^)ZaPAdk465!)h7!uUb zPk>vsZ+52$Ndvgx(IL~zG$gR%%ppZ*k)K6tr==fEB>pT117k=e^0uEX5lb-qO5SLc zhzyMa3Wd-dZ(3?wdYyl+x@ZM7Svzh{w?LxJ*LJf0D}Mm%z=?4PCFfBaiVQDf%!sX% zx5~f3PWwRp9W$$s$k>=a_8dG93wI^kaV9gX&-Na^ zd@Tgz#)r8>50~_QFK4@p*@HyW-HofgZ<$Fh9Bv({gRVh|vU7Rt+?OENw~P9x82GB1~ImNsQ# qD2z^xD8_Rv1c--9CqG?J{Q<=E=7eFC8?pcZ00{s|MNUMnLSTY$+b!b& literal 1726 zcmaJ?eNfY87*9byPI2l9OdVpbd^$**CZ$b!fCbt@l_FvfQ05(JnnHm#r46>_L_66A z(``)H1i8)W?o`l$;`xCff*{+e%*{XvL3(r&00N`GxS7$Prs$>aC8+e3Mhi5aGSTq1cudta2GM{2V4V9xe#&CyP+qs}# z8^g_rQo$-y0+p*zDmGJVi&NBOaXyJ_xhrD9Xq$vJV4xTRv>6JF7Ktr}J7rhG?ww*j z7o1XI@?*Huq%u{hU;=HXK%56dBn%5cG0r1l1Qu!#Ev1VD5g0-FFv8xD0FelU5=02j zTwK|(FM7{Z2sQt$f?M(k*qfB*}@P7GMX$hP)0^6i{Y|gcv`(y zLW*!qBgDiIL27VFhzf9s5a1X@kwQc$5NSkOSnIO$I=mttjfzvq6^i&cxj-P7#l^w$ zgalLs%cIbE3`Sj8rP0C=Mv`***0a86u<|!zB?)GVU}&?NrVCu1keW*~v?Z4|fryYN z1jAJXsW&<$%biu44q8T;^&2Uz!b}^$sWeOUuc4reLPdxM)<6h`iy@&H!ypZ=#ULDw z5{N~Z5Wz?tcLuM0C4JMa%1YQUOfEJO48agFL7|Ws7N8I&5+V>r;xHt{bQmEbggQcl za``MpzO!>)=_HqkZBOU+&8o@<*e9XkU%I80_j%HZ(V(#$pfqDB-95I6!p}Zx`|V-di>IA`JoQ?{ z?-X~gauf~6MrQY?^^|%y+wUA+=%Bl+X4SOKsrI?FY+U77eL84-cy&egngcaFAb_*v z^35%~fx6-Rz>&nlLoE?NvLkW5N7cz}u1E7T^TT%n!W_r%yWhGr(s8CwD(zLb6*b(F^Xy8Fzc>7>?8EUV^Ur3lQjDJTa7_F~PX>HB5Jd_csxO4F`nCSq4sd;QtidVYgB&M?yl+XQ0}gj{;)o!eY0)2>0t7WuzyV1 zPi)V5RXxGIR^Nf%^ky_H8n46P=>8VeV zmhElv2o{Xy9o>-GceGmFAD&!3R_dz_4?BON;A&l$-!Ai$?GerP`|XLBt@S2pgX~mc zmd~MxqGK&7zs}l<4sQDD&&KY3DPnZl`To|fU%nnFKK65H+`8bJBb?i3t{gASE7`I2 ztxCn?qx)m$ds%hH_wwF_db+m(mF^k-)zA4HPhjOE@7@FZJLWt8C`x&XtT8@&>wjET BgtY(w diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_20.png b/assets/dolphin/external/L2_Dj_128x64/frame_20.png index f63904f29b2f44112bcec74fe738a623b2d9f1c8..c80e59d0786eda558d500de166381b8a177aacd7 100644 GIT binary patch delta 672 zcmV;R0$=^24Xg!_7=Hl(0002`twPcO00MJKL_t(|oL!N@YaC@5#((qeY&T%&=AgDj zFewy?h#HEAT*{7K?8$R`(HwfoLGVAADfTF|9t(vHJ@sb)gPmff6c1Uw3Bs-wO)8Y6 z+0|^bGxPH>lURHX-{HsmKF`DV(sS1r=|2wqGj(7Q#=Oo#5`P0#Mh%d|VB5SFKviI_hJ4`kj@<+3?OW z70Up(c}VeI_#q`?nN5J4y$>ihdpdWdsXFe4*4mgnW(l$aw%75uj-x8ww^GHxTd*3j zfE-{8^c!`grGF!fZbfR5>PYA6L9e2#w{%}s3x5xP!3Hb=z>oZjJxe`O=lZDz?jtO` zSS7|apk8)oSDg(EPg)R|TRU=?pa2PSZcYH1mNoa&DDLk0v&OyDaVhXqb$&fgic z6}3N&lP@MORYT{O42A&5X8>Y4*Kuw7y<2~TCF)}R@_*d3wRb=KDOC+0!6wsa>sdAg zAUwGa5Z&xGQK5AgI3{Fl*8qUhZ?Bm&ZPYT_O4{#7sXB{m+FSnQK7d_RtL)0fD;I-$ z!%&-yr+YE*d=$ai6-{DD+Lp`opmpJ%39XE_ckU@wG|_E<*HjJR?ZxISivYydpL(h~ zLY&)6k}cN=r+z&LYE3!P|s1O&^0cr46(KL#|9- zn};{2r`s5cn~F}y&BIgY1|lfp&f()w<_XGl^9eqVbHYiN0(Ji3Etll?`+f8Me7~RX z>r#`Eo;EXhZZH4P$O!qoHCl07u%@S#pxQdIFA(RpyXv>l2gnYFjEWxI?eeOyVxm#ChUsYy+_Q2 zzzG#5PXbMn%2H>5a@t0LA`SwR2*Lw}A`Xe52&P4Kls+Cr5tPqGQ1*s-sF;U|Q4E~A zAl9Qzrx#}`lvDoLlLRs{j8)9#Ivfs;gU_LD1};w|5_xQ(D9mcW_6-(>aKaY*0|#Jld{u=Hj=H0et{Rv=I{RiTNol=L6e1M%EG7=5{Ui6(V28& zQXs;$7%qefQY(TnK2HP_JP{64B!*%o<-AG$O6ysoE zoSGm_7LR1Hr%IDSD=3?(h|(!-v>BX8v)J?o3i<@T0M#N|7{x_G7!%?+tQF~SSj11@ z2?aQY;-ns$!s}j3-(;(@5;hF0myH-laa2f9d{~I^_%JTOP#7mg2#n!+oDdM0p3w3k zE=!T?>73U($tz;p)3bdw8|>lLbWs*|q-^Z$Sax10Vdrjo#!5{pySm-(@B12V0Dy0U zN+HuY|LDjLvUDJU^W5&shfb(Mc97N&&EKt1yG}dtkoa=q$2;L=4PA!F!QPzKvZ8Hc zrBR_SpW&_dKk+HQveD;pf6U9hM8~c31N5$es%9uKE;mrxxX~JhxoUm-$0K8BC?WaH z)pfaJbr(-ss~u~ul_U3BOmT+&y~w&!V_^I6`_WRVaZ{jlJg8}-czauB{Gzz#x^P27 z-8va<4hU=7bTs*MS{WV`8VVDQp}l98`YS@nfG-OL&Byx+D}LQPXWHXE@ag7Rzl&am zjXvFe?^MsK`m>8Gm9x_;G*tV-871A4S+Z}}3dkFW3huX8G+p?L7tyOpdlXa~o}Z}s z=9&A#7fU{#QPocYj=_0PvxevOJdGbZV%_&}=gI3ML62R&)y0{;Ys@30f9EwGuwS}+ zMRos@uG*sU)`~L>qQuXs9DPxGg_4ZT_jGno4_4gL?1T*uNv>&o=k{Rr+GRuF`2GEoX$eX;jmbqa)9i>YV9q z(A{mL>RW$~Uca<&%sUtm1R#hl@4Frf3s6%T<53TGiW?9wj})A>}Aon4&N`}L>w58Jsjn05N)j;9{8cm aKN6?|A`4=UbUyd|HB_nTio+?nu73e(FMSmN diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_21.png b/assets/dolphin/external/L2_Dj_128x64/frame_21.png index 076448fa940b42f0740c62feeb1943e00616371f..c3768e27b2ed29280a2677db1e87a670998360e6 100644 GIT binary patch delta 623 zcmV-#0+9WI4g3U<7=Hl(0002`twPcO00KivL_t(|oK4cPZX9J4hT&)aS?`);rF!36% z_fU-2_TT-lj=uBh)xi_9QJa^^Sk}P%rg@!}18>N|eUq%q%71}vLlXZq$AQgj@L#*M zuUVQZNL*G)6(vtiNR8FwOD$zKH6_*J!Kyi8q06eo2RzX1n3uU+LBS4%&d^Xv&K5(p zLSZJYTIZ~=RG4A^s<2X(%bCa;ni}oUkRdIov!?Jm8EBB1`W&sYX9JZ(oyuUH+T>q& z=;kHkGoxl51Alwp(Sc|Ers&v#teMKlf<7_r{S2dpWZ5FG--bA1VS+nx32)&QS;M_p zHDm?p>}fPi`W_!$?|&zv?(#quh(9Bx#`7+H^oq@F4o1iV5W?1n=opTA};3p z{h>^)0cfVu-T|X)f4?5L>x)Saz;VX1CLmw$@$eWj!$*+2-%#?4{^s6(mX zF)gOmv6Sji4=T0}W(4VBhoYk3RmXx>@MzFt$I&S`)3H>ebOXfthtr+i{l4$*`@Q#j z*X%Z3_L3>#Gs6J@n39pM$r08H;YkV&5#9r#JG8saj+#EE!4y`F8~(u_y3OkiUJ#Q8D|y>LltXSy2Q%Z_zaCoEPRm|%|?=z zD+vQmC?JY9C?Om}ln{j|35cO_6i4I+xe+!7?7RxE(WD>*f@so`)oBQls!^-q)RYuV z4yVenWCF$l*bJM4r))G6@NE`+k7HB*7fYsa48^mYo@I*zouDgZdDc};o2?Golrq|4H$3hT(oNJDS^EdU7Kl%Y}U zU40#^dbtj8a`W?%LyH%`6}ly&*VFx1gE{omDr;oyu{FcK{O{^Fb-JF$&zg8K7dr4+ z?~w=CS(C?*)wptKuE=0Xn&zI_b}E1Bg&0r5*LNmPmX~}PUNL1y=Sb7>y<1o8Y4jdw zZwI{t+h-?EjY?Yk!SuPF)76JR{zTM0i402I&`O?c{Az0W(ETd!jF?BcS1P;S-@NUT zw|O-ud+50|P~8crXXo}~y|vc>Ji+6%sFxQQYDJe*KRO238~!=9sJwO0a&JHNr24_H zf9hdKeX(DBrn+rw{q7)DO`oOcc{H+PZDZq=?CH@WXlH---V0|tkIZM~(+^a(INuw( zT4OqFQk|cX*MerlNwcD^H)tO04-2liX_40fK_NG-Md{Os%+j6hzpSY8w60E!o94c) zQ;GI%=^Nl6$i7s(j zdVXBY@C|y|hNy>;k>!u(HFk)Epp~_O|TUWV$e-xag2+53mE$H?f-@US&5NnTHw%hKG{ubHTrC$+!GWa?jx>IuR=61uGuuCUn-P(;VNI@mp(>qsi0_UI(@nS&LHE==?~46>Y3P-=bBIav+ZV(4UU$iMgUUA8-f& diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_22.png b/assets/dolphin/external/L2_Dj_128x64/frame_22.png index 8651f12f8bd91d684d5943af135697e9e7d700d0..f5fe6855f88e4060a3b3d6315e67e215386a4c4a 100644 GIT binary patch delta 735 zcmV<50wDd74(kPw7=Hl(0002`twPcO00Oc}L_t(|oJEmOXdGo6K;M45$p$uyy+Ig~l*!wE%eE4hf zz%Ykw%H||~GVHJ1+GuVpBmkdndm()H_UFU;Rsi;0-u(9qCYOgxHuKnYH;=nJcSGye zBN+)K>=|GDb326F^_*S++Sx3*{t|u^*WESJ)PG!zYTg*EM0q2j$GNQY&WiiRFXkz<8jg=`a#)SVft;V;SK4WRD?G)cKMbk>jW`4)rzf zv1H!$_*2(U!zIFk2>=wsV$3l1vZ-pSP9*EP^qYCr zLK&Wmd`n-b#TIIbmzLD>3aP3&W_70)3#_X;4m1nqIe&>QbYGpdSyQzcVDaLqFu6e0 z;;cp(aKjIBcx5Yp^*pL&Qezo9DxnQP z?RXerPJasm8>i z@~5FSQOhnmQfJUo^(N+ebPDpoPjGO0%X%ojg;=eVT>!gUp5!Psyng%w^lKZS9y+Rw zT@MXF#<((Cl%U3X0If95QrFR3(*tNZ$eZ3nr&h*bR6cJO;Qs$*mNQ1Z=6~pvN~>oKBs}eBcH?PQ|I9PCZbZcy@=6gQ@rcL6#~w|M1Ku`Tc(1d_Ujs=li;p zWll;94;>f^06@5Ig2uqDUhYu|dEDDCT&3rh0j$=Jr~4z zbXlxQgC@1dA9qTEa#_}?lt}XP^Tqj6G2@yeK@|!`zy^lFoCfSJaImBYcDUnuEof*r z<+3?h8{+^27D+QRpG|@|wr|6*JN5c^h8^ynWN~Secu1!N6(bV6JrLU)Z8vM6|EKXm zZMU(&NlOg0o0;#TxSCkwdcj=&KJF->$gxpQcG-5HL;Q7>>%!G7DnqweumoMw5aPD2Apct5Z=_t5K^FZAyw% zhG-L{$pj+p#p)bxmUK{buWuXYy9bMW6st^e(Im^bj0`ikw-YjR8J2P9GENY~#W*O^ zla$R7kc21&&+GSfnTT)$&9ek5!rR@V0tO-&XW=6~~MkwSkE++`stgsNULYjce zWdx29lojg1Ti#3G+g9ZyTo}$?HcA2`FgZy}VL5_IVM2yuFhMC07$>X*DI;+!X_i6~ zj-n*cIq!8+uZU~U!1mp2aEEu(MLW2Wa&fcMYI2R_<}NsMqEXAO-QC?g>bEp+YX!u9OJ&N0#opWU_y|KR&zITY9Ip_V0eMJ9@lr5#9y+=*fn)byNzk7lC0BorAn|VQRv$u&DmcOnOTTQ7J>G zhekI#=Dnzt+{!u@RNbtPSw2{-EV#in0n@Srpi{@2x@pMC8^Ydx{vsjItU&pdSwt-PK6 zS#91uzkh93W838TKX{SGFAjy2XD+JPiNxPi?ZGqDUD3RhoxbRnlB(asvjpeDc{lUj zv5%xHy?x|)qk^-W_*<2p^{;2$-gaQ!6ID$GPfH)q{0bT(hl$$bfOqq}+0Tj_59@Bl zjU9S4v>`9m{LA*Tk~ZfPzb;+?y6=^15A7P(rRI$glsD#HWVeqmsb4sALi%jlynp4V za<~K7N`<9QE9(ZzJC96RKl(Ud6*}uwwpg@c)ssK#D^c&&(jToVK{cst%vzNZeD3QV zg(0gJjm|w`l%o{tsyvoy!0K diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_23.png b/assets/dolphin/external/L2_Dj_128x64/frame_23.png index d2d8e7e5144697f5932a8e920d673c29de730372..f404dafc3c37b891d38c79e66c379801f18ee59c 100644 GIT binary patch delta 692 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 JPDHLkV1g=eU10zK literal 1758 zcmaJ?c~BE)6c30rP-qp@im0rM2aImAyIGP=B#=OYq&0{!Dq65?HXDeLY}{-lfC|V} zwcb|Iwt(ZP$XJiodQiEnodQlp>4=IVc=Yf@ysZb_a9ICv+}Yjl``*6ad%t(hu85DD z=IcGmo5$n%YGPG7Zq4N$1%D9t{*%8}%Pj${I)R-+g-D@v6k*I< z)JTQ%c!P?~`UEyXJ6%T776IYX5jZV24$b3*M>=f;nMSdIfl4u3lrIAu27#RVCJ7t^!3&j$E(~@qr%baqs*RG7)yTn2e=v86U z1*F#~F(Oj7_9MnysxI^*@bwYTNah zHcF_Y?6iX+xtf@Q2f$qZ-tWkz$gz>lV9Z=$h;$WAIxLix)u`kk_eEed8)c+eiW@Lo z0uiJ^3SlBd3K57DhbR(5F+^+-8)4&sop<5YF>shTDjJT7QpO;NTBTIN>gZ^Z7*>ag zqHtI=fYn&-EMX<70pDiMcONz?=Dk>1G(!?j!Fnh1W8~-1mR)~g>X^|Ll|zt2{D102!jX|aukKG z&Uveo21HzYy0&j-gFC#LF3QS{6vNF<2YSrO&7EibbiJBedwP0yUMy?p@!T(IR7$huUd5+gHGv&pc0Q~_ z;GiGxlt0|!@dZD>E{Li)c5jK!DxMTJ6S4V?_s~sv>9OJ{e>Ac&8C0xX>%R>C+S_yX z;a{`o#BWINf-hhWpC?Tlx2Fpt|0vd-xF4MuTiC2w*?c4CK$OkmxowLcx8G{s z;t_gSH@xA8RCvJ&~N&egMHju_DHv%X1{FDt3L!3`k~ZW^vJt^ZURI^F$C%=JVnrF6O6CW8lkV#RB7FVlJo~DCSj3Lp8D2hT#;niWp0_Yqz*n6dKDZ<) zY_kt~Rxy9a;=9MMOC}^g_7vrA_eyO*-0u4}PILtA4qvDqJgVcHyzTb9=y86ED)r~5 zM+~0Y)eU>ZW^XC_DJ-#dX3>PbUf(*9qLO{GrMuQAZK`YixTPuW$dG`%xw>>O{pj*Q z^CHiXxgPp!MUBHwU5OaAbL5aStBNm;E%@s|#(vD}@UG((a^<8rV(TF06p+O4DXc50 zuR_;OezvZ@w9XmG3n;$Y_Ce{Bk(t4d97{I0hh!hz?|(tko<4Q{kkp2~f%kWZOc~6p ziBWhQ8#-rb?1S64_~1-M)mYyf>)cj@S-{;uyFNc?GvzcO2XDW zzBPT3J+~>t{g>8?Imv{g^hB{k+2#{6-InQ@wblKGoF`agjBHf)fPRuSuZFr^EGztX z)_K1m6gQuZux0pM@l(8*IIUV(5_D|Gxbn+mtNAUv?=*RSXa8t{6T2J#q;(e%U(3{Y m9xdPYnpbkUs(yvQQM(0a4Qjp+llDA`(Xk%Ehd2 zDCW-GR{Q>U_L*m%XSjYUeK`1kRuA?<9b2Rd`fV^>u-XE3^M5I}SIlPQt$C8azt?Te z_Vcfc1A(^+2yyZ=q#p`+JwGjyFIEM7ke8C+ljF6h3%L!0H}7m@=LoNy^kuxIqpQ60 z>OTc6wFoo66tI^um-YweAf5MUB7Hr2*n;nRs0L#67ibq)#L)Q9wet=tQ{UE*Eeh9M zTpxH$aCfo(rGK&CipxAxx0iW)XCeCKRX^hUR$kcf5l)T0i@XWT65J)6vFUc-rLknTTufG;k)8#8zz9}R;e{o#@~0#{G=cwc+| qG6&((?fPN48-H&qxzUtrbH{&4vZ{_|gfB<{0000F literal 1725 zcmaJ?c~BE)6#sy57DU8W#KG>YGA+s`o6VAJ76ODEz(@cAr<7@t&1M4ul8wm%fm%$l z9j#N_3|3pmTD-8eQ#%wD9kBw%dbKi&P8E@3)QY0@Xi>o{-Edg{aNOD5@B7}q-+RAz z&3>AlnHmxl83X_bNl#Pf@T-%5k^_AB_g?{D==fzer^)AXStD0P*%+WSuzChcH&ew- z4nrBLmz`h|0PtC5%FE~Sbr~ehnuU}{N9ZtHc{BhCNe(MTmoXfqXNpZ01$?Kq4Tekx z1^iB&4%JyzOo=J2#>V8#`vgYhxg}5JhMd6+<$)kVY{S*JB387z<%2CJ~_+e5o4t;1Z6rk|I%6Rh6(xB4lmFBC%X9_t?NNgx5gq)fSF&AQt<)DGO@G zPTNdY&cs?Ek3~w)R&WZKXFCyw*{ah$H*B#_CW}v-$U#{}Vj(Irn?13OYumXT=6@P5 z)wbtVTNzOfV`nRDG+z_ryeTlBzgIi*DDrH`ESrfh3{|dX=?XJr;nLL#nExU)m<%K> zl@ofLkRcSUmm|1DEJrA@oIn^F$8fP!FEyZsDLXI2YqV&bG)0ALQQYz)P*wmg_u^|bJz+@C7L1d^{f)G+1LkL=qA~<0rC@F;-DZK<1 z@f1a#&UvAerbK*udbZDJgFif`MLAU&dAg7tK02v>}lu&!24jj zTAAm#cxYpmZ6IERD|Hr$-+O z!L^tzpAQJ~bKAoMlS$Afu(kT(mydzaxQ<}Z0|I2A;9dw=9MaSoc4tY^YwfwA1_jd^#YL4}boG-Z53Ewv z6?KwVTKCmA;Fa_0f7Vm_d&@wU1Q;cKW4=XX2z9l4oyoWqVKk4^nKIy@g{Tg z(~~>>&irtaiTJIw?TqWjKXV6b%7u50+tGntEvI?`+R$2;8kTu!Z0m_?I9k~l3-5Sq p$L=z@*M-{A$~&a}JMcSlAAuU92nzt5=kdiK<+DE`JoBkR06m>_$8msMfyu zL+moMtf^m`^t+0r>VKF$(d3Ln{e!#&UPTIr`x^q%)rM4fv2P{VThv79oqkF#_;_&Y zVdE*2FnHy}ViqkXV0Hag(I~jkqYiI0cRPw&+iM7o-%Vk)Gcl764Sq_ss!5mIAyuSr zmo8K`+j&{WT7;edBH&#Uyy8}-2~sK0;Yc=ACOd^$Fh zax6FL{6uUm?VOtChaojnf$cdwd}fddT+7r777!LXCo;SlPa$^Hvuqv}$`tLNUqAhk z=#~d}>g)BtV&}x-eZulec|@}uDAAxif?!kqUq821ja&1j?IL> z^dpUuUk3GbSTOkfixu?g!Tp6(bNhRy6U1gA3ydpNeP+QD`@8SfZcuxR(*AJAZxh%z z=E(eD?p0Ij7jWKzAYHtD37>6E78}^puMdND+cIk{M*};zS9x2${0yV8<^A#s1^%0F fpT(LA{e=GkDZbWJ+5A&N00000NkvXXu0mjfr94<# literal 1835 zcmaJ?c~BE)6#o*CFsQ)bR7It;6V!sb$!4=8n-v5?f|4-`7&Wb^*=#nNLb5U0m_U_T zZ$%NQ2Z~iHisMy_7oOGVC|>o%15wAD*1Od@Y7yv0!TN{e&hCES_xAnX`@L&+UgogD zox^&B0RTE@4AErsE5|=6p+WrnL1>AdU!qy9ksZNUSug3LL8^r@(@=(;oIq#Oq$PjS zNjedLpgA^!ku~av5)@;XkO3Wu&+g>W03;^+oFtV?vyhpdU~?pipYJ~;hHRE3@#q9S zqIagz6Kz8ZT=a;7VFs!omr_~8$%CLoAHf^2(<}-3?0F71;Y$*~w@dK*fLJPq-m9>= zN#YNrjQUI{jd9VCN`k-?g2*7HNT<$vuQWuaZ!9ttg-E2K7U_!6j0>Z5W`(IzA$8-hM_!m+QDXMlEnNMiN$6iD1{0) zW4IC~DYFX3 zQZ`3G5+A72hoCjI%Ql&|q`Me9^ghjm?K2dt333H$M$9mZtCTRN#BtcHvf!{vo*+{y za16yMtGEqs`6PWGT9udZVL02_5IBmXN|KhtN<=1yaRr9LIHf{h47cK>g2b$(SuU3H z6s3XA`J|KDMSOb(wjXDMKYW}n+QE;Mi=UnGT^(io+=XNgHE8*@wY9bCTE$I%NaHdz zsRm!e&J`DyJwigY*IHZayv3Il{%M&{Uulm&m^l`@pYr?aDTkY;Ha~jqY3Wn=Ze6pb zk-p!-xje0<#nyCsP6TMU|8kJ?@#?e5x5icYe&T9d$iIdLKRL9QdsBKY*K@dh(YdJJ zhoXR_E@DFRz^1|7-WbW9lRO)VD!bkaW};NkyzobD{6~nuA=6(n+3^DG=yDRtxO7ug*Rn5A+zUe!9 zWGCM90-U0_7Hj}8->z(q_h((2C2v}66dH86pn84SK|&r}-%tkhQRjsV#F+w9g8$Ln zVauo90TEo0Kpm4L;?4+&vHjJN0!8=+a7Faz!dFE6cffvY|LwYw<3;ijT(4;>f+{;6 zsO~=58O!1O7J>YQveFvpv@>Q}T=d4!t&=zFk7)N_0#!jmZunXK&Ek#$j90)@9xOcZSN}Sdc#9?%Z_mYI*m$+hWi3Swj_(Vk^b8($WtJZwBL^+h;%w`UZ*w4iU5 yGFN08BYf;tn8$_B*jzjYJUzoFv|1P3+QkHP*F=sS+q}rY?<+$)OtV#On*JZ+TCjKk diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_27.png b/assets/dolphin/external/L2_Dj_128x64/frame_27.png index 39ddf46ab3bd195b3e75567a3f91021720c9e1c8..48e08cf62a24b412f8c6d4dd5721ed8ad0c88749 100644 GIT binary patch delta 624 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 nn=?Fl^SeV|8BXJuyP39Md1O*k3KaGRa| zbndxl?<{<Ca=R=)*=5 zf&|)8jv?576s%bjsruhkbOT^=E`pQ*=&Tn3xl!pNK;Ps`&<5iw9+J3)n?-DDvc{CS ztV*WJ)`}Jgt()kmDh^EKVMgB;gbGcjRh`tYDg!mgnj&neq{%8gpQK8fJ~yN9xEdtD zHS~%a41q7sKYzi(F)&UGj+VgO0sDtJ{Tf^Wd$;SG=sZh$HBuQSZCfzTgD&{X_KUah z0&t2ShxO)vFE*mD)j;>DPi9H-g0~r8f36m^J);Yq`=^t5LF07kFeN5bB81L~h5FJCem|@tcg&F+lUB9?%E63=4vCBBTurrX&W%Szjpu)AcUV-Cd zcw=#lkid*v!c@jIalvdcx`o6z=SDPP)2PwR#kruExUh(hjWH8h1m6P=_Xpavec$)# z^ZcIQ^VJ@IW%=5yC$bO(S?k^As)B1AK4qDy@O>k*-v^gm!(C(S&_YIwr~^chwID#f zVX+QW0a0$?yC&~qq7P_%`h;Ej_MPcl5kpvxBq zJ?e6ZuX1^o{lSwRt2c}YZ?Uwrw3u6Hv!>TsNRHzY7!-v=4LsVa8e$ArqXkI>7l=x_ z5-}7_MH7f(P-`;m7-YK?MmXa0tpKahfq!YNsvQlq zMu4RXM71Vef;9;hB#mMI{@+nT5whW5&=pu1vC*YTO<|xKUY8w%U(B*1^OBWggA8lK zMJdSP3{7&lNOCL=B!*&0YtSkaauR1Xdy*yuht^4XnH`?8k3#iuh$GMTCYV=iZL^2kx!Hq zH6eLAQKhAzT|ifwf$Y(>FuIs#URi}gsF=1=K_ZA#EN8BA{^_LDD#DWhk7LI09$b5Gz_mCL{)F%mOJ|5}orv zCnZI&JrmoN*?@jSoDILzvsaM8iICpFO6#+L~7Zw)Yy*4zCAf^tlO9;e%{QcN? z_Gf73tLvs0zT0lymEOB^!zTlU+dq!&EghYa_Df@Zo1SlOyi|03bL-b3%;F`FqxhB75eX$TK?`u%+XpYvmPM`+G{c$OUKK=yUq zOFz-~>Cp*wE@OS kWlgiQ#)aE=FPFznh;lgdO7=+pfy6J->#lUY@2Kti2RHiax&QzG diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_3.png b/assets/dolphin/external/L2_Dj_128x64/frame_3.png index 40d1314c95fb07190f995925e69f77df558f8cbf..4772c92176fe13acb8e9275cf26ddfa90755928a 100644 GIT binary patch delta 710 zcmV;%0y+Kh4blaW7=Hl(0002`twPcO00NmwL_t(|oV}6Hi%oGD#y{WhIoCZj<{TrD zF6Us%ZcJ<}{5Uk(D0Z?yBuk-WL*^u9sVpWo#zHBZNs^IGMcz>Ys>@a}XXoEp6q}`2{q7Lu?2{M4(Ze??k!jB%Bc?5)js&oTnZN@<1 zTecQ(K!-$tT5SQOcGErsMUkC=2Rh7w+~J!5#zDspAaEVPOVQy~K$6B+nhb6Ogd60? zji{+H)P8I~U_9DRFf%cDrkzVabOR|J|G z`;Vl69Djc?x$@$)y(p@>!JEo*@~7K+KJ9tJxIa}|HQWVT&r4pJtl?JQCDlV;L>_LG zTtF3sDF<$m^-?q6g4~myRl5T&R{(4g@A2>RKl3(9R&TsK+W3TIv<$he8c(#{I z*B&SS+1KN~H9eB$TV4G3=j72`t$ZkJT%IspM?V>y{9PZb57)=!OeWpc&B(1n`R??I sbY30~ntao+X0*ywf<)-he|4Bvh?EnA( literal 1777 zcmaJ?dsNeA6ptX!!4ySyz*i{vnx;+D7Scc`l(rV7h)@;h)TU`F9ki)QfP#v}Q*{jR zdFIq1zQHL+Jvtd4buwS`wZTzgQykzFA7ew9=wLFtRH*Y0k2y)c@4LCbdw=(JQk0TB zEzm#A9{_;BM71K7TkYHv=j+M6+kDq)xFwWTrn703k6 zxlG0afae;MHl0n^Bw++)=Ho6MzRhgq&;SrS)n>(sOp*ol z%6R>x(lsey0!5Rcln+A$3=6?%DW8B5Sgc13q;U#}z=%iyBis!M5lkq?5HUD#@i>pP z!HA_QR0ICFlZ=V0wEt3n9Z)(UTHIID)~Q+w`w!m zJS!{%gg+iqwJ|0#kB#5G5 zr9>o0VUZh~Xkl2~LXd9XCeHT&7I`NYOQ1=drD!chWw|>cC4*uqCWEqqh?p-1Cu(rQ zWN}F*xvJD3w1T8fIix{FQ)cj0nlaN`C>SN8C`1qIAq161L*i%@h4fMb3Q0v0VRRHK zMo_}Y8^9ahNMC=eauO~KtD6mmA}A7#lOiY@7K$J=N{m1#A%!6^YDDoUTx`VkBA$Sw zC~$So8=d49aqa2azMc*4@OrvP3pY|UH#>C0@?dW6yi=02N^W&Jo%?R>_!R&=IuaG} zTHEbE<_%hVAND=xbap>JwCSSv#`WJY*yHNSr8x~ruy?@aZU4qjty|%2&41}Ps)ZTS z&~SME%!2JJ+GanU&~aKNubvfj*2q3x(4}Lv!`8HnpS+}FOw~qo3sp?4yxSN6+UJI6 z72g=TXIoO>V`^=^v)M|&)ZeWeyY$Ph_Jp9F+a8cbS9pEB^t2=Ifm>A4AL0V{EP1mIw>30iOq)uLK>okRiy>lBR_MbYy7I(x7p2uiCOf!87(} zk5z|#q>DSg_b(_iyk=9Yj@Nvp&^OL;0t-6rr`t2MQ@y$I`QhH~oe^hz07hD{rf}=> z9+CXV+XsOP-|`fDw)Y&gb_S5;p(o|;L)Y>I~$)hhJ)JV4SL__$2QpOs=CTkLiU2}Zy^Ck6b=tZFpw6s>+jai0+s<# z^N0?}R1^f9de$R(`qlBW62E&tLqLxVj2K8B>;-$hl`ZNR@@)IWI8|WPqcW(p?quk`u<+*0)$>P* ziZ*rVhj^E4+BFC zJF#+Jeazt5`P9_F!lmPGhd8q@gs07T@cjKlF_)j!%eOkN?RIpXE*gHe_u|cez*Vto z|AtCQL*c}l9bcn2gFoJKY{Vd6AO4iJeTzH-fQAKrUcxWfcGpiRQJJhbB-gF{58GOv ANdN!< diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_30.png b/assets/dolphin/external/L2_Dj_128x64/frame_30.png index 27c297e8d59c983d0a06ce9afafdc39064216039..631240dd01684471aa3f46547101b825fb9a7b0d 100644 GIT binary patch delta 389 zcmV;00eb#`3zP$p7=Hl(0002`twPcO00CP`L_t(|oXwLxPQySDg}=2IVu^$-5)vih z1h}M&q2>@Y)X;;JNU7*Jf-gY{q~HKP07WcOxIiLE6d}YJ3jgdbZ~&(K{N9^+wyXqy z0{%6~)z}9^F&-$NdM~X>d7Vx^zh1dh}`Z;wh zbRI(Ho?^vl>Vm~h-+l)X`OtdKmD^>#W$-ML?@yN=Fvl1E>1vQ)x}gM^bMFN?6@%v9 znFk__-_|f_J$@qcO2TBL4n;%?#;S`0GKGr6pW}{} zk~eo~G@#Vs7!WCmh^oNHx?E(t5kQG?(BFSU(@afUg|SaXmaS&9eTDUOY-pv}cDHEY jv;twn`bYj9DxU%0Aq%&?>#?00000NkvXXu0mjfh|0D8 literal 1408 zcmaJ>YfKzf6rP0z)~)4H)TFJ3af+4#v-4zkX37ft;Mp#$+cgr4hIuVaV0YHpp}TC` zWUFb~{;1#&joKz9n$}lR5lz%I^00|sYcrp@Gh{}AEc8zbMHO( zeCK@U+;irLx1naed6OA}p!IdNZXcKv;H@;JgYPeQznpE;XP>c}<2Kk}Ak> zU65~;eKId~z4(n>4ngUM6n~T6*iKh9X;17Tj_~ z)ReHUs3ACMkr&iX-HrgZ%V7k=9?z=bP-G=pAZ=KT4`YM{$AZCRY)je^-6#J~V@>Ud zzbhd3k*Wl5o2sjkHZ=^Bw1tL?JiMrcl9Fx7 zTUrjI}Ii=#9XV0bG}2Y7)(FhCJYR?a<@loEmR zOfFY@18i2iOAdjS(m?M#)c2JN`YzME(_aPV#l^*wmrq=QAjAGTx5FR%@%PJrWWS7? zGR7|49sFy*wFU^`;UMVO|*cWakyoStc6*)cm!&`@H_nlwp zF*0}a)EyHKOdH1AzQu0*-9MH0ld-SA$%!u=fd-^IjZyKO4L24ZYPkN0@rcQlQp|;`e;wT z!GC)6s?uWge(8EM@qK>%lf7TuY&N5b(0pO#_Qxp0+f&D1r{rP@#gJW*+n|L}axNu4OzVvwe9JU;vjA4Jq zh#}s1JneAzVjwa1dMUhMYAG5>&wUl@9Nq!_S~Bo(?&b%_kdQPJ~{u%69q#* e7k@BOlQ2NG;zy>fj4vzsPpqqIaG!Rzy!0Pj5bA>f diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_31.png b/assets/dolphin/external/L2_Dj_128x64/frame_31.png index f2aefbfae2f1ed51e8e87c69f47d42b6d57b6a7b..5dcfb355d4b930ac6781c7c60e8bbebd677a4c73 100644 GIT binary patch delta 411 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 literal 1306 zcmaJ>TWB0r7(Sb%F$s;dr8G7o9VeBhC3Bz5&Wzb6drellF>DqMBDQlmn+(a$OlBtT zCPcEtn&Lw!MG8f*^`TKKR;&-fQrpA}f)v3JDaKxmSV5s6_+U$*SF%trYpeqR)F-=QX|xv6(@|52-hb4bOrd437w_|Wt*n<<90cOIx12KuD35}*1EGUs0&CM+}au{6t3G>dM6VP%GwSsvTCaOBa^ zvvN9?*zku=A$-8|Y?-3+`8=8DNXzM`7)g?R8!Ss84ZWq;#p3{vWCi?&@*6pmOEhC7|WA9)|^r_!}KKw{VJ^o9fOYXI@A-6 zmBZH3EE`);$hL9^$6rxD^o%2X1l|`sM{q5##pu^^LK@*LX zgJx&^Yt=(@SKV_Y6Gv;QRGL{jcN>5}Loyc56n?pP=4Rcu*!I|gQfcwZPah92C5~nz z&-RY(taFF>?Q5*h~!hU|RSUbC_ zPgYKlVPXDM`#adv%Rip${A~B{rRfV`G5;+Rh=C39Wy>%%7E_R$fJ+XcMCjQio`US1}{KL=LZ+3!*AKu=BU2GXYFyC1WfNOfy UNHl%vIsb2!jCaRAjU1c&4=x3@iU0rr diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_34.png b/assets/dolphin/external/L2_Dj_128x64/frame_34.png index 81f133ac5592569c6963b813e7eee54087a5195b..e12c77c8a1fb102672c871ef2893e4e49e8e5725 100644 GIT binary patch delta 439 zcmV;o0Z9J63dIAE7=Hl(0002`twPcO00E3iL_t(|oZXSXO9EjS$G_*VLW7hvf*_)y zAR=fgsNn`PYSQqa(IK!P?hk0Xy&-3baEd4gN7Lnqkf#2Gknl&PJ>($KDP6<8de2FJ zLGN_;xzGE(@52N9zvC{BfS@!2D(#fxT?%gp#gibVPS;XAf`4Z_0f*sh7``w!%ww3~ zVDZoxThSO;z5rU>_`Wp8_jzbU25xz=(uVsi=PI?4*O~@Y=XM6b8@Dp@_9!Y5J&`sr6!D>@3s8op0Wj71dP)Fm6gG_ds1nh=s*4^{ hb2pj>`VTJvegX2&d!D|SCZhlV002ovPDHLkV1j}n#f<;} literal 1341 zcmaJ>YfKzf6dr^uO>wc>#DuoN>0qKnXXm-QGZVJmC+%vNlI_M4k(7DdWk;AtX9jn` zqy_t<`k(ow@g( zd%knNbM85FsIg(2ckPC?2!eQ%+v90C_rN#2rWAfJujxy{sme(-IlGLklNT+3L=-~; zXi^i~KpKcj*WPbI9fFh|R5MLZQ)-7G8=6ln==faCglGh*+v=L4+zuR60&S`u!e+<5 zz))2QVY~e)GG)d_+=< zkCu`Z(((Fbe{dJVa*ksP1d-3@eR;-bSZxHw^L)VuP2*4lx4U#lbaCCTDO!jFTeeiw zQ4Jj}SQI6r(+Oda?NS(;nM$n~*6rnF!L$*sXcCld| zWhfpODW1cD%+f3skOB&+6z!~rrM|($R-x}@Y~+DhA!Y&5F|3SXbQCM0F=sf2oij|7W_>LBbV`&}y&$PA+|p9eabT&h z0HxkCG;}e|g1QQYte*+c5-H&{#|LpX$Z@#DD;&-)_nFO2{78XwZa_kaP&;`s z^86 zSUq@pTkhoJga3XP9cY=_GmpMM7uzXC{=`}2Ir8(V-PEWZzWVV$rB99_?|#t3jSb&D zG1W6sO5ahlsJpK9YyZ!`hdtM;-btp$kBDg4~+HYXme{t=gri$nls2pT3LVj*o_N?A6hce5Fd%Q GzV;v5Zqt+i diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_35.png b/assets/dolphin/external/L2_Dj_128x64/frame_35.png index c828207d33ed6ec94a71c904597dd24b4805b3b3..335f819d81d694d9531bf75b5680b6bebeb5d068 100644 GIT binary patch delta 275 zcmV+u0qp+g38Dg!7=Hl(0002`twPcO008MpL_t(|oW+naY6CG4MgLAU>=9Bd!&ZY& zWKy^eK7cV>2~}c_;9?Of!jc08SHk6~bZgi&{PYdlK-kN5KtZWpSPwC#(6D$arFJjk9iP{RC0U{4&l~DU;p&!1v46V3qgC(07(@NT$Z^C{ z-4F^QwFz(xD7>Wu0Dk+Jr>wt+5^tEge9YFfD9FVfZ Z1K@5(8WG?RR15$B002ovPDHLkV1gmwd=UTu literal 1255 zcmaJ=U1%It6dt>whW_M5Y@;ZQ(+X8PGk1P=cV?2!-_E94%%;m`!T1t-XXftiG?|~y zOuCblYMP4L2dhGbRV)#;STGjEKd=xj6j5KaNeZtO$oFf;eg zne%<;JLjHrB0scm`<92d5CpM3JD?WuI*p&6));Tnc@?~m%q&H& zx&&h>YE9HgE>ET%50NqhXdM8KOv;Q7cpz%Lfl7Nx9`FJSczn|wuW+Kmi)7=Xa7522 zDFwB^5f6W*s7esH3d>fjRi-L1j#p+mS(YOXo~N+~?N8bP3~Afn)nrhSuY0B&n2t?G zj8JnXf)s_-uBBnQx!gLj?Kg^r%f^P#WjO}0mKEi;>g@*w^uLS^z5U{(i`WA4oe59J zXHweL1mpVMJ5c0^)hPQt6CVs5R~>!ALUxc?JlW9@lWEyg^ zL?d0~MJ}Nw3}7^QHo^-6P(`37`uq9-$7R&sUXV$rg#^gNg+2)gO>EZo18D208Qa9M z8`$_gu}a!QFmSx07njEsKIvB=dj zE9M3gN^v2t}wNUBbI7S+%zqE-u$Dv>gZA(l_taKlmb6d2eFRBM&489_+hz z;oRS%y1e+=hxU!5->~+!w`-g+9qTS^J^3%!Rd4_0{H@X1+h;c|-u(Kt>8>Yhm#FZN zPIPSkw4VL>^Sw*Z`U@RseQS$A5P8p$J+jU16A`K z2Y(-ZyuRG}QEjL#{A=d>(F2!fj?A69zV+hL^Eb*X?~Zl9v-{2p^RoC@aI~eJIOg8x U{4;a%BF>k{W`@*reFtX#193vGHUIzs diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_36.png b/assets/dolphin/external/L2_Dj_128x64/frame_36.png index fc923b40236dee851d9c3b1f60a64d0050b67350..39ce8407618ade2149ef19fd6adc2a75bd57f6ea 100644 GIT binary patch delta 57 zcmZ3?;XOgZn2`Ypeyw%71f+yKT^vIy<|HRbur5vz>0$cBz`)|b!1%LO@HmdK II;Vst0Kr`l3IG5A literal 1059 zcmaJ=&2G~`5O!4wRh2k$fYZvA_>ow9y>^nd)zBt!N+Z=JN+S_*Vr{P*)A|Q{OWdAN zC4@Nf25{mE55NI9@&pJZj@*#?2w|PXrH863+dDI!Z~o^^fA`__)my8QBwg=q+XHdG z6z}HBviSa4dFzPlChv~;UJ~#L&6w2k6PJNrMEBW%QUCb)ceXA`%df-Xh>x5d%S$4K zmO4rir2;KU>l;N%y#vO9%l5;#DW84*B7@Lx%8zRfa?%bPhubF^+dJ7EdM5{->B}1r zzng(Hff}|n!@>qw99ekG{Jv{)cg?c0N2#nL1#3a+G^0qFPSQg-NPJVmwRod^ZGh zzFjO9E0u}ed3UFHBKGcDe`nYg_jEe_@bmp|L4ls#8Wz9)ep^}++$orTinljQvOH(E Yze-?JTKaM0*{hQ8b$9KL?Wd>z0Hr%cDgXcg diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_4.png b/assets/dolphin/external/L2_Dj_128x64/frame_4.png index d372ff643b40c4cf27bc810fb25a3ed239535b5d..57a9dd944b4d88f47620a7ad4423f739190a6339 100644 GIT binary patch delta 693 zcmV;m0!sbA4Z#JF7=Hl(0002`twPcO00M|fL_t(|oK=!fNEBfh#(&?pv+b0tvj`D{ zwi5~+)w*=>&jw+auv>H}E2Kk*h@iR@I)|X6&>`rghoYm04jE!j2pM#+AW%|sY#}v~ z9V2o#$9X%<=dOK+nQz|beV+GuUIws8P8PDDAvT3p*ai(PL4Q)n!LElUwb%oIDgZ$O z_yF2;;XykXZ5x0>wtBY`Ahp+xMn}M|w^tCf3vQwcpoVk+0Ri9wG^na4JoX;A*of~@ zi-nb<0|Nq}Ee`Jc%%N2eEw~5K{=@IjO{gt@j4ECV|U_ zQUD*yHHwW6l7CKPR+>W_+<++Yr|LJhjROq?s5rW2#FHty+)x1u5a}e+ZVsp|4vVzW zFceZ-W@!;X0V}-~y8Gi>2TB$9KZ7QB>6gv`Ocu z{ZnX@={2CX-J3v8m4)fQ6 zN9c1l3?RKDGPMR72kT?LK7oG$9pey6(W5RD8D8V~j5t>QPV^g`f)8xoORZQZq$LDK z$w4vv=5R&U!>~?DGP344+03%#csV=|8+U!B?abV))!Wx}>3Rsrt<_xrxL@AuyCU9;nM`l^5xU6V3nUzLjT25#P7;MKG0|tsFK)WH`XvOUk&Y)eK**nBM4mhYn zr%548t5Y5Cmd0AZwNjFRMp;RV z-c0LFM$loA(3mo435Q`j6o$d9QoS*3v<@eWNgK~jn0b6I%rh7qu?=cl=~(K28t>G$ zsx!?LFP5^JGAtxh6P@1(n91M!9XS*kHu%RDJyRGWU1lOP43v>p$|M}-3s3WwtkP(u2_s33_|`MNhq0pfV(|zIMbIXT+GI)}>4cb66K%4ln#>>~m4iCG2GgPtCJ5q- zMW_%#NgZbxuYD_hL#@h4m@v#EY;Y7o5ivmtATi7rK&VKFKq!g9kPy|OgoqI82#tWl zV<_?*o%2>Fjfj}`bZpYwXXb8nOq5#AtOElB`~N6w0|4h! zN|{t`Z#k9V9^C+Y6g^v|cS*1A&?cSPF?M`c%kkols=C1J<@3kDFJ4_`ClV*XJO8+! zox!f^_vyi+_Sly-^|^R=-`s(FaNBrO*MH{L9GK+s-Q$JN>Smw6rTXpA*nNQ;8eA2X z9w*z$n~!S!{wE~ffz64j7pBc;6$59x;t87FbTPD|9L4h&xE59jLtLzJo4L-T0dTU< z-<`VZ2eW{r2_bi@XY}TG^pqRQI@~Ebj>uyfq2m5tBmo(HY z__3&Mpdz+)c+p zEi2yNr+jBFH==i9Nqyr1<@Ur!KF8FpE8{#%XU_1cJ&<0os!v`}=~>dus{scZn=&U{ z-G6S>QO@NJe`?}a#Y#JW)$b02JK8(8*vgiEOAD?=`ezsHE4nxPNQ}QUVaB8BG7B7&sd zg$6t(>cxYt5yWG?i3cr};!#9UFP3%>g2#Xd!Hen5V-6x#O3X^Zcnbv~!M0{&z@(No z(^g1ow)=b7*z6pt|1ivZy#N0DGr)1Bg@FOs06$h76bl0mC4XrAcUcnR05Sup{I44T z$dR#%bT|k@5}ItJ+1KQj;n5fJ#8WF3*kO;c&O07b5Ry=5<&Zondt?B|8W0Q`l$IMv z0}mPz(kru}&5jZFV7@oq|A@dt>BbMx4d)=slUCt~>`5MA^?3iP1P4FaGyDPJgN>?k zbSD1(OF;M|T*=V(j-Sbza{M|{_DhkrJNh)|nyEnSaAYh1St*fum+ z8}-!HN||4uOx(KL1wi*#s%M|o_zAnATkG{R@RuisHzz-#WUeJfaxq|hj{JJH3BB>d zZA@(uEnOg=@-Nw=FKRXFoc?-qqO`E!;&cAAwb?;u+iu^G%)|FjG3T)RL|Jc>6if!;(a wZ)*>_JzAO<{>7Yv#Rk?~kPRhce!G`G1ggH^Y-T;VfB*mh07*qoM6N<$f+GSGCIA2c literal 1641 zcmaJ=eNfY87!MyJDxd>l;+-=KlMOI!zDSddDuouQvmIZjsBsC!Fjr4Os1%)+;r1jmjZSE;h9VFzIpQee$VfD z-sjnnVVoB_ar#6607CWY+AMjkke}q>0Qub?ywxBt(ULA#$`&nB3G3tmjafADpx(yj z^I1G=E-gCCCjmgfIw2=l$~7!tIMJqHy*>)J%^{-!AZf1K!E(!a2{iHff?W;WKY9WJ z1+yAjlxRQ@s5xSGJs^&CuLAV3M1W32eN?f^J)(-Nm@o&l8F$N_Vi~z?j zNRH?<)3RUk^6&70eZw@b?6|CjMn zZ&yyKgI8wpF0t6j$!B7T@qy*~y*iNBQC7pe?-b;NVGFe)S8U_$l3uHZf~8TbmoX+p|2A%tfC~ktfB+N2n7MYV_-SK z?zO~uPiZu1E$mEO*I zp_6UZqZfQKqt4>>;xjM z^8PHOwjt_zU~pS+L{S8m^zfUe#+G2q@4#fs@xV*_1Uz{|?YxsM->)fCLNVHs=M&a@PPedfEmY;l0M93#=g}bGU*!Tk%Yz zPkH-Z==ck+4_@og4?2$*o4Xe&4sOhnxVNG!>Tb1EDx=nS3GrlSf`5CEc~4!{hr^kX zU^x9pdxWr&udCkP&l&a|>i7FAB~toiO5v_W?wT5O>-PFzvFL)vnEJACzn->bHMzSj zJMlhE*tOFsD_d=Rxv8Y=*ur$n-U-=@&)0Jgn;G`AM@#g1GnzEFTS_m*9y{e9IDJQE z@wu*B$H>_quhq7MZB4Rd85gd9FC=i+uDUq#>mTz&_I2%Eqe?%tEpE!Y2T!&>uoI&hrEhO+t@MJ8-10H(1?aH75N0`nbEpTRxhfH&ZWW7d2gq>8$F!Z2WfVx#EJR z1=R<-kakt;o3lyd{!Kf|Gp6pn_T}wl=5XSpye9pUwJh&n9kBgWwI{X%Xd4dJ?Hpg* QB=;Vm*BQ0VDS4~^1HhwTkpKVy diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_6.png b/assets/dolphin/external/L2_Dj_128x64/frame_6.png index 8a1e84a11eeb499fcd47e7709e166c714229afe5..4a6f97d20d6de580f77b94680594236e831a33e8 100644 GIT binary patch delta 600 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 Hu0mjf_#qMD literal 1608 zcmaJ>eNfY87=K%!D`HPPR0itI%H%{yo1~#lDxC#Vq|*XIopsy^X_A&4w25u71*g|? zI=0=ZL#H?9=EQBDI>$adZyw$uIQQY^>E^sCPTX{Q>U1jeYl<67fja;2%q4l>_sR2n zp5OD8*DA{9XvSoY0RU+1rBtQ7M&!q;PLSUh)N38`k|Eh#QkCG5LUe!wg{%Q4T)2tFMh)6s=}qKpQhV0KufnR-rw+?<#9TeR2r?bkv) zYtb&ucOVY2n5*MUn*&@`bD5KAu4hPAJNtR4AZ(Tm_&AA%!oCK7&>XgChwYl>eN3#^ zLc=Ojy+u1h%H^nliiH3Nkvars5Cnxxq>e!_1b1UB=gEUG1T*LnOuk_hGo!c}!=cej zD|-yE9&;sCGU`u0S+sSMB%1a5P$;Ae8FWIxt4B$ajM>02Sk{1pO@4_E!~S4a+ycb~ znE)?Jyx@mo7HPN8C|R^J+mSGQqQmjfus=AOEIDoZFfHm)9isR7VzCWt2c=5xe;SX~ z4mz7ePG89dg~k9Q*Tj<*2g~_;vZI)y%*I?E;N`;54V1t%`Z&L2rz~3ei;m@4Gh-wP zH%^#fnsJjbZa_(xMo9wZ7#zbs1qb1SSN@OhU;)>hJ$8! ze@v1StI|l&6c^x^a%@RJ@Ik|AHuI06;K?@_F*o9dF@iL~xQQTOH^~w(X~;)SMgqqO z#-km@vyY^2q*Y~!9EKQYVHGtry@HX*11CX6@+6AX#KIN>2^BaM4#w?V6yDe7aL z^GGMfMRI$_whw1RK0KT*&M%KtK%Skf(9TkM?o<`?oHltK8XEer@4bEilr}q6=nS8_ z+HT+YC8DNw4Ayl0I=2AIj;=a3dD(_lzU~euwCYlq^-#*V%{kq7lfsJo3UTpJLeDvs zdJ{PA-KYKsEIu-j7BSpOcT>G9BISGME`6cp~85hw;ZFDdHDY|JsOAvv=Ze^y-e(x|vb`=b;}4 zgYZQv7aV<%vF`noHy5?4Rwk=eB^B2jCTd>Yb2n#TOSJFX?w6Fw&}pk_%|W*MuV~i! z3>Vmb7(I*Mv#OEK@!Qm?na$CstZe&`qU2I;Z(CJD&#v_Jq-LPrrY?@`n=BnpNK=X* zYp!Td>o$0bx{vK0OkSw!O9?K|o?>D*P83wBlRJJCt}Q4$@OGD{sKp{#k6RUax0Ex4 z&pe+jS#LNqr~W2TCAI!O?U&ALinlZ!d0VfR=Vl_=ZHX;c7L3C|-dEp9GpLe?swZ a;?v;Bx|Au6L*e|`zuj&tqdJRfTmA#Jq%n&C diff --git a/assets/dolphin/external/L2_Dj_128x64/frame_9.png b/assets/dolphin/external/L2_Dj_128x64/frame_9.png index 05de5d5c698a86baccd74cfe33d1109ee566f793..12a3e590d5678c40097c18d57875280b28a1c104 100644 GIT binary patch delta 582 zcmV-M0=fOl4ATUV7=Hl(0002`twPcO00J6GL_t(|oSl=uZWBQehrivsIF4e%5~0L} z!CTNF#ipYO#2qCsfE4ovPyiiwhKeq4Kpp{}fCB|7Rg@M5DHjO|D%g-noP+mN~pI;W{R;scL znrOr5%2AV@Dlw1A0h~r9>fiHlHp#n%S)U$bz!Ikz&77B!OpLA=0OHdq1Bg@5%y}$eE}UOBI2dgK)(e@%yA0DuD>~qiuT&Ou|mq}T{h1!nkZM|MZ$jgfv$Hf z3i|}kCO?P1Ft@>Ur4#|nrpIV78&Xybl{#QPs~NMQs}}{8ml{B2vl)Mt%!W$&1)cWn ULMj^0VgLXD07*qoM6N<$g5)6%7XSbN literal 1610 zcmaJ?eNfY87*FY-RYd$4;Mce;$Tm0ACTVDsj7keF*o^{*I5_7`lQe}4+JrQW!qls% zb4>51c<1~=xedSADd@J-`89URhTeJNoJ=VSH#ZzR*%XIt?mU(Pb^hU*OY*+&ljrw5 zzvt^xo0pRnGjY~L003ef3vKzz8c-gKR;|2$)qd<$mYK4>NM0nk9l8c<#6f1aibVx_%_lOD_08-QZBF&a^GRSbnyw?oD#SE^5Usx@1i>h-9*y>W2bU|qgz*Ik_81Qg14f;K0ULWN*L!)*nWgimj zA#hYhE;U1Aq>7w*V1^)ZAgM!O7C}(ZMCw=sLvRLjaqjsbhF}Igf+;tQVibx~7!HnK zkm6Btxv6|x=D0uQWQIy)S)}y(%F0Szr9mf1#d?$^$&d{UgB1q%nM#HWRYfs3fT-PY{$azh)(BY!(QKbvXr#x{j{h@b%@^M3B@+5?UVDl|7ko` z+gDH}a{7GECsatRQWJMl7_8*)*^WYr3L7d{;+4YCWj2AW@Niz)VKYO@7oCfDQLK?9 z7@RP{G|P}MZa_(xMo9wZSRBJqBV%+SuCSe_;W3k)w51!xRbht|!tr)~bp`2}2CCp$Lq?Of+YJO$cg$2_ufd1WO_?PPhr$NaJprF+h5SqCV6) zPjpgPq_k&f`*=2#!{h1Vyvj&P%ItLP`YBGCyQsYE0=u$~jEwBPzUKx2L}WQ^)&hUm zo$YT+XA!Oa>wkOX;<~QBn7V_(e%mts)!T`xh`H12)j!U;=6Bz#Oan$@fu38(fL6=y zNHIRq(5=b)VDjF(NkH}=L-&SmJLV1qs({niGM?YH=EceC#=$8`Q-hj7{gn3o&jo?E z(zd2eh*B{t|4ynq`_6-?nxLh{r!^MdY zC$;gLk^YF851H$lZ!L#-^{JECRQ0OaSb|!JnRBA?=;}?wvpR!l3lKP7f3iO!5`2)@ z_=UCtys5c+DeGLeba8gAs{MdZb@N$M@Qcm}vksJ!osZl6;O; zqZVUKS5pJ1I`6?&2&DzA+N}en>UA zv$^-BzOD#!)VsT4T$(-3&eWm3`4IgLP`WPPQ4LD>cnAgGEnF6I&bDd!+;Yu2Fe;`of=&Z ztNc2POlU$47JqqQ!0^QxX^)y+0}#4v;5&K`byv|3C?XfkL0o2_1tukhMR~E|UbQc& zX@FigBn_07H`VepAbw)rg;pdfRKJ{<-T?G4WxX9h0T;%yEh&|@OqFAG^;>G12lJdd z`>16sQkt}tnB4*sj}r2SPIF!YN6tI|_<@rlX;>DKcPjUhi|Ux=hA}WO;Gbn!8B>g` b;T~`c#qlHy1G#!X00000NkvXXu0mjf0hPe) literal 1389 zcmaJ>YfKzf6rS>^fQtl)6iL*{KuuLz!9d?ABS!Rds zE-8hSYP2-c606l}<0I-1wb-UfYa1Slw33jBw6V2KfFCyTm6T|V#8mJuu-G4@lRI}ECfNaYpPv-IQPQ0G9wj!Z)Xg6;q<8PZq#?Gk{;zXfH*|8 z1)wz{z7_ZZFUC72K^cOi9+Vpz^+xXwPEbQeKA~fbg~AYxAY~P?FfX(L9c=-vvSP>X zTpGntS+rw&%wEzPc7mW>-KBw@U3CpYSDV0!SVcKn7UQ6S5YTxv7HU@_T+EKG*yZ3l zAto?%MMZD3W2>YZy*|{bY5=twDO?~)61B2MAo8XbTH=Kg)I^#nf`Y?}Q&!GIa}{j=>Y7D2trcxMpy@9wLlnYbvtY;Sd-hrIvoxM4vJx!B(_G0 z=)59;q+c2OUB$AV`(in#26$c78dSACSp>eIs;iNp8b(dDkwmw7c|leZlBW_kv>LDr zX!1TFdNehJuB4cgH=sZ<5-FO1gqs-Bg7Z8>;;e;baav-4&CFXRl8521;>CMXw_2r8 z0>cO=*>HkcVr>E~;Iv3fxF9hS&f0i0ZWC#i2Q&i!Yr_agkw{d{Jynzx!O~1D*V_Va z)*A~bu$wg4Hi61LJ+S3A`*t+AmzS5}a@W^a4XbBl+l6XQJx=0}F|19Lr6 z3RWEWCc8AVEA!X=N47lvIWqjj_aCOl|NJptS+eP`f&B%6-Fwe^ijVjHQTo7JGe773 z^zAvlFoZ;4MHYEGGO+?e7fI`9w1-Uyz_$s3*lGgEV0-Wwbva<>|8 zq?4t`EjS~Ob_F7IyYb}4=J#}{sPA@#r2J@{C> zmGoqdSSMe*)|WF{u6;VvrcRe1Te{TzZ|(B()tt76ww^ES9~;WOkVzsZOH+!!4Bft! P_yN|q>s+U+0tf#C(`@H9 diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_1.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_1.png index fecba5ad5980606b225b44da816122cf0d773a98..93ff00a848b0b8acada6e2d19d0d33f1c5446a3b 100644 GIT binary patch delta 452 zcmV;#0XzPQ3(^CS7=Hl(0002`twPcO00EgvL_t(|oaK`}OT$nUhTkNWih`|fiXXwr zp{TQ<>EPhtpp*Ur7neGSZbfkLPlyg89g1#FitSVcp&bMVMJpAGidwALq)qZVcyn*s zzu*}k-t**~lSCuhOUFM0nwD$>PMQnh2rFc5jIwm>>##GS7JpuP=G(9WnrqeNxy;CTvtvdie$5KaUc_sIM8aE<4T$XzR_P(zyx|eU@C`2tUojg z>M2Q&32iSG+Lk*@aqs*oE4q*)Bb=!14l z%rS{x($#2Nf51O8>SWEx%Sl(pNS6CXf}3)F0>I(dr<`<=B%=knoPSKx9ktZ9%Ovd$ z2KUgh3gBf_ep@;cDC4mvHUU7g$|zZtEx>@Y4P-(IKRrtNmPlyguXLhq2Lj&E0kQ}= u7*YfdsR&xGWQR!Ten&zM9)L(EQ1uH#tV4O8Ah&z~0000YfKzf6doSZl}BQw5u_^Plr(Ma?9A-!?(B@L>po$nixen=jleK-2S(VPWp?N; zgwmB@Nz(=sF=-oukeEi(O4S67Neh_zNJxFOLfVMYK8)6;Hc-K;Pj;CuGT6PNelBTKz7OmJTCLiewIzf|M+@XSsj?zk@qgh}@%=Q9W7~!A+KhStI;%^CrxQG>7vCF}A zTufl-ii*~3#a2mG`^r$Kq5_oBQ@B8qB+9UQAo7L=TH=M>sDU(41O*=krx?yaa}-Y_e07+i9mQW|y5cIZRHY)6JL@Ha5cAS=wc^m@SOkZi!LDrsPX|IdQ`=auB4cgH=sZnB~mm12{#x?GtToy5@*dUi_?-3SWG-4kvt546)!%J zy45O$5*S7>!G;q|5^E7?0jEV;!Uf4F;jD!>;TDl*c|aQhU@aH{DH8Fjd7z3CB3PR7 z<$7Dd&3a>j0PH3ew#|}cT81r`R<@_o9gD@_a^HoiE(A$B>UG&GBQt+hUw%8~SsfjV zOwEp9f7|z7JVi=51@A6= z;@Hx8d^#nz{8C;DbFV+;tF7M5&ZUz1x`l$Y&0X0GHJRP-Jf1IS&d=55>#j9s1V?Op zqnVF>d^4>kbv*UANKekIbab|8?oZ_4y-6;*JL#L=Uo%muuHQ2~a`Mut;fXJEcWys8 zJn+bw?I&&*r=2czPNZhXMou@N)UnqxdXd8y9KNxp&vXCTlAkd=UvQ;oNG)nj$Hktq~>yZ7oPoQbc{b>{xPikR%*GGnq$N2rTcTX&pf@+{vQrc2;ZHk zO1i#ylwR68m^8EL=H!RRpT9lb6G;8J@q^k{a_;Fn`=1(;$B==dp}t+8CcmHDoFv|u z{N=Ib+|lzkQaaRZ%&MAuqU8HNopbi5=FTHURfA0R-A!k+uruEAb2TRyZ|ooKCKhI+ pwyrnM-|20v8J&>k4(XP3B=X+oB2Zx`6U370fuwg9gueUQ zg2N+8GfA>}xckpNY9vVNkkuwrX zlF{Ve{wm;+tABWA$M#Ry*e`(rOz=9RvLLB)Fy`shX*>v0FobW?(1OPRrv9Z#&w}sd zVDz?isT2$+{{7V!h_cf*#t(oOBR7NRrkIsad`S ztF2!<$C9+F{Kc5z4k!bF6@ba2X2dxkx@!Zf0>Jofuz$#HLMJ+p{cmYKuFq*T%oQw~ z&N7x%$IabKtd`nJl?SHm6F~syIE@>d5)U?Peg?Ut2B5cJ(IXmG5IImD+Mu5sWBmf) zH(=Ljf{YSg;zvo6cHhSJ>T4&QQYce5WdfH8YR3XM&!NaW8p%U#zcgtjsh*nVCZzv- X>db2`AP$2n00000NkvXXu0mjfe=7J2 literal 1524 zcmaJ=eNYr-7=IBE@T0-88A2!8SyFLiZ@=zqH!e8u4!QIU@zASDy}jLc;pFc2+*{<( zN}>!c4Q=|Q6O&A3L80##um!P!`yZbizCU5^Mc#kLGdB;zcE>6Jk2LXfTY>0OaLI!-7}=HOvRg{2>c|Emola3}tilQ(Rr-PEf_*hvGb1{ZuXp%;+iJ(n9!}2tT4L>+?s7f+l zVlNzahfWr}T+_llNmf-=>8eQvPMRQFiGnuG8l}7HmDuZO5p!A9;qF1SBD{4 z0wYSLDx#9e*>NyR-{T#{6cHQ#Mb(e$A_VM;SQ&&N&1tvb=td{`CEiqMqo=c!o;4b* zH0`iiS+mh@`{mAbymVPXjx2aIj6xFRLfp`-Xmn)hQDObW6!|Et3$0dmVP)ss4R-vJQ?NIeE zg;Jra1hK&s^ZrLrp!G5(F;FHLJ!K>WK~E8!k>dzf) zV8IZYCKZj%tdG8_Mldly8 zo-P=9^lDGzACor_OdYjAzwr2xQ!|(bqJ6|1D>augJ=a{CvR6uen?ccr(>c3?`;xSnZT=lG7B`(A*>=S~Meci+MD#rt7jRo;pp zuaTW&=Imd&Cchg-GrwK?>9bxBIM=bRao6Ruy|+zC>$e}szx{4*+a6#4S^%bvPRr{3 z8T`F3YXtDoY63V?a2LDOl_9*m&CzzFj?3jsnzB;f2AkE?jo-KJPja4DQhrayR`WHt zR?|Me;5x|JjQ6fh|L#Po$^Nxw zNZ(r2R3A0|)Z;nuUdK~k0Q0R?xygZdq8E}|`OHOS8JFf+#{s%yQJS|1zwp)WzU*-K zr1Xi~$}_I~@Yfk|Y)6_=Nm=B0qoJieeaDyP)3wdlGZNM{Ih$X7@@mee<-bhYeA*qY u`EC87z4!VT_Z+@ky`^$q!$3nlNCZ0$Cr-Y!`12E}5rES%+uktUTl*ihIwm#% diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_11.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_11.png index 0f293281fa28434898b3c4a81126d3ba3a071210..2d98d57ab2f86cfb5a51804196a2bd979708d35e 100644 GIT binary patch delta 710 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 Tg<&HF00000NkvXXu0mjf<7yFX literal 1679 zcmaJ?Yfuwc6y78lsR-f|0jXN;g2PKOA@N?!EWy`Of*y zx##R2Nj0tuo)s|*0D$1+^;jA^d)a$!Adh_x2A(jmQ#hkDGwC$Nx8&!vk_iC7E4G=;jMTtk)mP* zoW2CCLzjg@(=h$CJ9d{SuriDjg`m8=JW-xhM7wrEVgx}TSOQ5TLRLfQ&UY}lN9b@b z_glb7H{r5585`{YeHQUdI+sZluw0Gf{gFLts5{qESZuf;YsqJRc z$p2})R@-gLcal&V>85jC1bZaZazB_&-`RTD4TAz|@FbBiG8bI;FyI<8@e_LaWipGx}6{Z3=GZ^WWn7l|{p%S6+={6&yzr5W07rJbNeDuTgi z15Vf+K1q!4gr)+&W1mQx4e?NsVZe9Y#2^I8DOBLa9Yc2?xH}hMTW*3AGqSTjiLR+zEQKFc+R4L4a+=BnzQfdn>ue$z{9I$ zWs)6yPhTM&sHCh5`wJ@`j*Kod^Byj({6P^K$0^{i03rh)0D{WKsOEo$y6!gygCp(L z2lfGBPcx#i`P*uFYww>oa%!SWw;$s4?*n;Wrcm459WCNr>bME?R!1JIJ7zF^H>x1+xQw5~>Al;{KR(y{ZupmTp4&@sev>HV z2+Y4CuQ$fVuk8$b26CT2F7KXU?NU5xyZlR~`JIsSoKU(N)9y=bnX+WzGCLvmwCxcDP~Q0W2rNG-|Isbu6x+pz!m<->&Ky59*3PDaRhC z|9!FXlP*o$$er)UGg}6@pBnc+y8WOfpdZsWn7cJcH&K%M<`^*R(CHt!=kKO$&U1Q> z7GDgjj}W6#m?*@#V=#35VpPdfVE%x-Zs-hmr6m3!z9>asUze58)b_=hkh<#NGk?ZL zb8;SsW_OOy99mdZlF~R9;;mZDe#om*z=4j#Z4;r*&V;j(+@zUxPX=v!`T~Iqd>(xb zTAI3mqxvYw_@ZKH1&}_lZ&ge?=h9!dS05T#!<`Mx%bov?fMewPei6w!BX&WPQT!it Coo9Lg diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_14.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_14.png index 1efff0f21bd9b9a3d6a7b0f8c53623174008c8d6..25b4ec565358dfbf2ee26bff84f53fd2f1798084 100644 GIT binary patch delta 639 zcmV-_0)YLp4U7el7=Hl(0002`twPcO00L76e0lT{rZc8+jF*TMf_S;Z*SByecoW+LBd^$iq_wXusXl6N3_M z6B#H1<=9qaY;7izdjD3+fOnftDC0YSDh7OCD@vnb{jHlDJGo7;CkOW}1KNk7L#$x{ zO9NH`Hhe;Wb`97*_Gy=ElW919_%1<8BOTq)s{!$_34d6x069b?kkwGC^3zVkG$Il> zi;--|>Nq%PKuu+p2Uu?QF^EW5t;+KSDbAtDXaL)0bQ!RodXbJV79Qb;luK0&ptKv_ zoAef-7}tmn7T2yT`RJi^tQZ}*Iy8r$MSMggl-_Vpz7FPHI2X_IN=;!s0jM_@GME5Z zw}D6p40zJ{`iJt(N`1L$vpdpN#BAXeX?VrykOcgW=H1!Lp9}~%(}8lWdQ&l9A@bTh z18O)I_uim<14{6=F9#zAEaCU$?i}`~fdZWHQ|80xCCEoomxjm^fX-6!gl6a)JR`tL Zz&~1h3VB{;Br5;_002ovPDHLkV1j$>BmV#Z literal 1714 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 AM*si- literal 1549 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 WZc0siU)M*dq+&_f00GI! zz>q)CHUk3#LpKl$omg19AjSly{sjia(xDPaFtH)*9RWfhh9c^!NJyX}x2cF7Kl?Bw z@7d{J;EtcpJ@4LgpAm}{@Sg!=1`8k?>PB6n11agsSHRPNbbqJTqPIow_oWIL+u+B$ zU-v3S0T*5#)J(_Hbmi}`GChHObt$YAAEfEz&9h3;fjsREqK-2S;e>O^-Omp6;OrkR zZ=81?YvTU*Nu=C)3<_N{TeZQ^qxDX)!?Fjt)_Ir|)%u6poxC3=t+@x zH_|3-AA7J#vP`zMJp+$93W+<=pRH5AZj7bTn*5}V+09LQqM_~mW`pRV`_(HHHhrDWAVEB&->?Uyx>#Y=75wR2zu3TW6eaHe1+i=_ep zOiu%MecZ_It2#xoaZ0hT+8mPPF6mmbO%_`spNA1Zu~a(2KZnm-1m~pJPXGV_07*qo IM6N<$f?8bO`v3p{ literal 1421 zcmaJ>eQeZZ81Fb)HV|Wspkman6WP>W+v|O`?6&*pja}Fs$2i=O>FnCKTr+yT^*VOD z5f}%!ki{(gL1HvGzt}(-2?kO82+HCjB(lgf$}qw*8MvSm#&o#B`QEmh{6T2izVG|= z`906?`ReXqVCA9(OBWyrvdCA)Rlv0cKF%Bid|%3G_rv8e-CL!vRVBTV*8t)Y)mni1 z6n-P90KC{#e+m>Kh#@J5s`M&qgk9t5@E=y=&Z6Xj75_JM2VkO0BQJjSa6rl5HT-g+fv2h1BZI^}nw3xuq zX%)TBfz6Pr@&{3mssYqyq;P>GNz}#|fykR`X^9t}M@^)OA}Dy>K= zP2LQ|QcYFR=@hf_T_{jyi4;vh!cAt9_KHvTzh|Z;N&y&UMv30;H=*(Ik&#s^x(cMwC}5zw|Iwly?;E{dE|PF)G_ct zYggXs(YNEdbFMA_crdx^(c8lx1%oe$_oZyVpL;GovW%IW-_gAGpOM|w z7pq$v0)gI=0_5OB&OE!F9@_Sjb4krH?42L}n3`PZT>ezo!tOk0xVP+)o5p#+y_ejR zs@vjkxyW4}8~-(XyJsAoTlZY~tIc)(d|Tp1^pHUqUrd|6z?E}HJVVV_+g2|NZ|FESwtsRJU4Q1n yzt47$w%p1te(TbSrR^)Psa->BKK-zz9Wfxv{f5x`pF&sCKS-Z9z#VqKlKc)Bp4wY%#~K}xxKx8 z9on9A=)w=+8=t)I`9IW3PRgbclKY?hjt);FcEu2OX{YZOHL6@LEf$1_MtI!m`*&X!L{Gi zd`4Y7`%;NK4TD@MFDmDU;Yk`-QVEj|)#&p#AOByq?EZ2R`$nr*3t} znzxb^alm$&AAg4(7ix*%K368~5cFpb$r2)e4L}RPJ{f{N^a?7RS*K{n6djh&9JmE( zlr1g~z#IM~@D*kT=kKqV+mh;qJL#jUq@J?TPBnK2NUythp@)*xQhT&9JqAc{vzS#t zF(=NlA}N!WT$fKe(6Ll^59TfvKA?uPNSSTQy1NA?t~^@u$zUJG!bbuC@P!~lQh(G$ tX7G`V@|fi>W1#22(9$oBDSTZF{sUMlAscN7n6>}_002ovPDHLkV1mbT(<=Y~ literal 1411 zcmaJ>eM}o=7(W;S+aMZnE;2uEZAeDu^{%~s-9cCSNvo8Rt^@oG*Sq)VL3>xO2b4x9 zBU716K(aXT0|#+&Zf0{cTQr#wA<%A7cDcLveV==N z&+~h}Zf|u}MgF>?bqIpwdp%A+Tsz=Xp1TIVf649f!R3C%Rj2Hbc%_Yz0b=8%AV9ql zrUCc?!?ibm3Ca*;O{Wm3Q|f$`G%H0kOiD)+k3=CFLCUQ0D8n`Z1r34*LA0o@of%T0 z0%uXx8hnH=>Hs0ZlaRrVL{)%IG_e$?vTj4m;xsf60Sbf0BVjQ{$1SQwyENRV#JCDw zR8g8NswGl&zG~DV$pAHJv=~be1Ztu*fMaw)l4saQP#vMu;#zo{Fs+H!k+haVmoF7` zD04jRceMiOQ9-gxQADCX--=-|wwx=NH9XElajk~HBau{Si`p^85B{gIs&*{U z9tF4`#H1FPg(czDX)sLRogJkVAsc$TEWo-jVW-5lM1ZJxofZ}RqTvLNHn|;IJ4xtC zqrs-tx*RsrY;@WvgWcfJJ6tAX+Qw>FyN)uEI)lyRvYAs@J7F?A-2~+_+udfP-jT+7 z#hAi~EJ*tmpxXy0` zN?;h#G#i>V@RXS)S&ZaJ9%Feuk5OjEfSEaxVgRWJfHJFaND)tU&23$j7Qxm`ZCAzu z9##emh;W)@I5wk)&P>CR%dV~rxRS{v-0mD1--RFk%^T-6M@nz~dw|Hklw&ocQ@O!!&RV(WhjX+iruTo=6Ra=u|5*4%eO_{Icl*#s zNX5e5ySiTKAjMJF^lJm>D&ou^`O`Pm2?gDF@Tr`)iU&R&{Ti9MQ7kx*7gX;$+*|VK zLA1g>-W!+O?K3}I{kR@E9iCDbUf-~#Xz+=ams|4_@77&@`;!7}k{H|c^c$!D+??Te zm3!)Yx+W@X);{p_V_S>*iatO)zB9gAb|E)JZtL&cTKd&&RTkkkzFM+x){xbL6w zO diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_4.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_4.png index 87357012697d8989ae5e66e0c10747a5d529782b..eaa20698ec51053ffad71ad647ad7a854d923167 100644 GIT binary patch delta 492 zcmVn`#$FwF+Z073^1lK2aMXfm8YmL1vRB(d1?u_bAJ-OiRwSEWPou64&VNG zkTD{-{Gy*T9Z2J)zwONQ6ei0HUdGsw#>3Z}(&mgoPx^EGrRPP+)}_Q_MXY`ub~Q;-8j)_8joe~ry;+U6DW||hO&$eNcK(s}hVR-zDfU2n-J{8p z{E8&0FZ79rZhs)J7Mdsewkk`HZo%Qz0SK{#6nROfQ3}D|$1+{?@kIyVyoyDDs1q3o zTh9-DEWBrkvv3kpU3V5>pRfp9C(TYUd&)I}GNX+xS8rf>%x@3B3XA2>0Ml26fz(-1 zy84}(B+}Z8x_KSqHD=e|mgG$KF1iOe8Iu%bo&h7Db7g5`cYzPr(hAW>^;A-@oW@Gu zT}21e95C`LuI6IE2xKX^sZC75NDfB^05Coa?545tBwsaQM6EN71LgLRq>APxqc!Fw i-LwxQfM{Ww5dHx;+-I3Uz9+l@0000eN5D57_YJk^Ao4r#0~9ABHOgruls7psmJvW&T&AF6HiSBrG3j)yz9{`-oYZG z#%)f;uSNM|0gW^6L%}(ck9YK&;?tI=0*9Q2kOiO|9fwa9IxMb)~zh0usdQ{K=VwcnkfVzW1 zCGY}4s;xc`au6hCo8t59eop}>szHO0&@seEC>EW(Fz8T| zWX{XGCf&i44GZXcm?Ma2G-`-4234yhD3)ajk|t;xhZ=aKHlzzNJQT@FTHrxM)ReHU zs3A0AQK(RBbQ=cAPDBw5dpwT}ha!`?f>|SCLYSZoBoPcILL1kP=w9$YjVEeHe6?Xf zctJ$1(L`7hIV%Z<>3h1Pgd$|a6=@2ri?ESb#hM@p>2BVJ!7m0$kvNOXLFF=}kujU> z6ykdV9 zAtZvNUj_P|#9E$;c(Uf6bDpYjRe#%N;3u$ea$0?N+=6c@C59CMV+4S;Vg#f}B)aCYE=r1EYbLgj#sVH5 z4HgK&Y0}`>bf&)SfFn1pxWMO($K!Cj`rPGu1etQ$&D(vk{yR5tKU8MUjf-=Fj6i|MI14n0WO-0JDy zbbjfKt4R03_A0umYaS9_P`vii{N1hbH@^MkRIa&!-jCd=8%Ryxv*WkXD@fm`b1n|t z3_ibjNrQLy{@J%@AbBH4r`}q#*ssf!_{qLWfy)g9o@3# ghf_C?B6FrpL$=vcj^#)X_{1O7?JVS5bIZ5=2VyD>V*mgE diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_5.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_5.png index dbbeb1fe16a90746301b8f10a46a9c67059a2242..272d99f74230d4442328b61f6add2cbcf1c83127 100644 GIT binary patch delta 497 zcmV14kW-X zDJb#+NnB7+P`Crp;EEDiP)SNikoOV_WQBoZIaxD-Cv zU-YIv>TvOdYpu(vk5#eub1= z108gZ$IA*Tl7FP0&?g?bzWiEbw)A~XmM)!w!>>a3#U1)6P6in?znmb%M*V41XWlne+HPm zD)c39Rhjj>HA%Enpr~6nAh9vs_KqZHX2;fjz{!|2AZqg*7zSL(61xX{xSmCbKB}vd z!j){S^utwjG|2(OpyFyS0gOPFf}7avEisbAF#`Y?od@=_u}P(`nlj?nImVH4J|wB4 ndC72{c}XYB!w4W=n52Y%CaH57g=6tz00000NkvXXu0mjf_xeQeZZ81L-}8)Gn{d<`(GH$)fdwY~N}S~=M5ddJRibBuFN5U|(2<+@$3w_eBH zKn8(73iUx6xnnY?WFiPM##h9Z!gURN3NnoFeLJJh50@O>Q?4&iB|Xk-0C9*fA=te`4pKB;3)C{c(;kXdsQQC_G7IvNDaKk5b{xoCw37OW@^2rDWDMl{Wtjm}E2(0~GT9!)6WNQ_N5O#^mWxKE04 z6FQ)xS2|6Dq{{szs9V(lYB!UZKoA6KXUst4EkR1+g_)>@u#h+jZ#zcXSqsII3_5g~ zphHcR*iz0rQlS z(B!Bts}VG5kq@fXy3+*74o0Cw{r+LYk=RhKVAk*iAH_*Cfh$Tfv;pmyUJCxF@l@?t zpe73NQV>(CH361H%1eP^`kw75sR-GyZ)h^C3m@iGp;`eE-N!ji@QYcLMb_?hlZ6yP zQ#PxMBt32y<*;!s##(4~({7L5ma_3Qtec=+wAahnJuXKQ%Ww?svXC_GaoBAnH;nZ~ zVmcoYK+3NS{SILr&&0BB4e+|E1ynVhYJ!rGs;jY(8bvLXnLuCh^MV{nO7fEx8Vr~N zn!Fr{UQJcdffTdyQz($MM2Hq3VHTROVLVS07-M4?jFM>Ju<~|^;9&@Zc=3tU4R$G% zz%ZgIHmqQk7>7U!7$s5?CP=h|F%I5}IYf%#0YwAAI7~RCh$p+|i7rZsU~49~!(#yt z!-EAPaGEqYHirW(IdJ4gmdp!y`uqFg_RW^dwFqMP(#N?1iT1l&=Rda&&El>-T6(;C zVU=;zj>(6q54JB~2y&;UU8*nJTYfOux?w{9#HP-Qo^3aNJ8NJ3RolvY7t$4TA;Y@D zeaicV-TtPdwWmJwL^u3=qDDX#Ukc>RZSIM8oW8#;qqFDv#7$sH$*9k>37W!`@+^m#-3ce$ZaquFs4(`Jm@Uw`MN(mC1r8TG5Az>VX^6C=*J z5^bj%FRc9V$UD8~TWkg0)2oXc9>&v<7epT^n8wj4U@dv7apPTEK};Rt&?dqTnLK&Wf!@3|oBz{6h*^*<`B9-j=4zuC~= zv>Pcq+5TYCpXA=1%P33q^k7q{qbRQq)u zNGCa|zq=`Es~5LKaBa5_tR_PT(s=1_OPZX-iZhrj7dqz_-%I1+n=R@2P?AJX`g8KN z*C`*zz;@t_E5XCPg~Uee;dUSJ+P7Qz%OGutqc=cik z{sEThqK_{;fCc6A0Ff6N2%9gz`&jtE5NF{uq_W{GzyV<%woe;g5a+Z`P-4{HcC|W| zr~K~VS75R91z`F*H;}v)W!CRiCDBSjUUzOmVk5rxu6HD7Qh}@<08YlF0ht%T$mdd) z*nQyR%`8InNj()6EN5$_pRTOK=?ob8Wmk0xFalX}Zfdi)#7GWz{-<$`FM_>nZBo_L zdcvdT1;wFed`MDR^DU!w=3Ba19!3CBVVVm50be(CAr#jjqW}N^07*qoM6N<$f)jq^ A00000 literal 1465 zcmaJ>eNYr-7~cy+hVdiJ39U)j#R7@F{k)IeIPthUyep1_^GwVdTz21u>$ux%Z;3+# zkrd4aG8@AhCo-lF32_D;o6!P7OYM)$G-uSQ28%IE6OSxs{J7o&&isRM=iPnZ_j#Y+ z^ZcIYeV%>2v}Eb@^heVX1exw~+P!dYg71>F6!;xZd(#c4xtgO~Tc*fbouC55Dk+r! zbp?eg;01zI|MGE=k02?{eqXs(?k?smo;m?wz3x;lLwqgT`_g5o%iAZdc8aj1bu>O-0k#Y2&-qy;;O zh^jxV`IQiwuqae2wVDNkWXGcjhTZPFhC`8wT*0gnQ6WrFdXfkR6QPZ1M>H?^pT?xx z5np{65MB^bYE=2;XSG!-iuIUSH#*N2x%_61%oGg$uIGyA{$l6 zkSt>~SSiY3vodC*-O3pX4K~*1Fd36JCd1lTv&}(US(C$RPGAc;hAgsLNu!muJB(&W z66*>@G$AB{q+dVuJAq~Hi{))95Hv;gDN0SU2uiCJO^H-1VU%X{B%0$EM1LqDS(Lb; z@qq0>^}hn7B2@{ZV=3nSlTe^onUrWC<1|YeaY0~7oHKG9&d4k<8w8U~3NZX}ymU|M z#;X)cU>M;f8(uWXoLOWj%_RHx_mIL@|m*-g69+CwyATU(z*0!$Hm4O1->UPEO4*Ae&UUD zU(SC1YV(vI1I6Ma*Ix9_Zd;I*+8mzMINUUcI{iW0@gsYC=l2{fE0@SY!r4xxN<*0& zPi)Y2)0>C-=Q+7^J3(s`fvC%~2W}2?S8ts4ev#WW@X57bws+M&um>qz5tw>9WA4{S z-+L7wD^}^rNzbRe!_CWWZ57SY) z?4glAm+x$PDX;sx6WIfsZXA1I@qYY|p;_b>3S?Adq-pb?)ZOeNH}?+~oZ7K+RC$j4hJM>wCgf=`c5}n}>J^^KdDBWN7_9yL56+`)n>tQrdKN|Zc+PzO?)HX`ddfND t3~^yJ?~dp2XwI#@oufI?-1P;zROBlyrLTSK)GLXfsmoDf?Q4LD>cnAgGEnF6I&bDd!+;Yu2Fe;`of=&Z ztNc2POlU$47JqqQ!0^QxX^)y+0}#4v;5&K`byv|3C?XfkL0o2_1tukhMR~E|UbQc& zX@FigBn_07H`VepAbw)rg;pdfRKJ{<-T?G4WxX9h0T;%yEh&|@OqFAG^;>G12lJdd z`>16sQkt}tnB4*sj}r2SPIF!YN6tI|_<@rlX;>DKcPjUhi|Ux=hA}WO;Gbn!8B>g` b;T~`c#qlHy1G#!X00000NkvXXu0mjf0hPe) literal 1389 zcmaJ>eN5bB81ML)fQJN$3`x|cFf)~2+v|O`aKLfB8{iJ`#wIh8U9Wu$^|O>LL#!o%`E}`aEV{Zh{j0F1m6P=_Xk+U9frz+`DUIU0zR09C5 z3Gpq!2Y4~wJ_*VYB=w-&*rYdkcd&vQGV%!>V=NSgXap&%h=q9}2y`?6T4cq6-M%=A zp|a?}p0#*MZ`cJ|nC8&usQ3M5V8&26+6U|Z#x^`jE zp(aYKkMpd#gC_^ps_S8vAfnNzF-jX%t%aZ%h9O83VKU)R1CPWNosZ#4q$p{D0}(-! z!@8_0Xu={NP&;%72Fb2Q5ej>~>xPxcTCQN$h!`IxC?iRPLW$5;v?IC?{7+*;?MP!h z3g7p zc|`z8zcTc@hBe<4%epkc>#EkMs%^<8XlPY+HPWhvQ4?(>(QRH{kd=hwiA04~1LlAx z?*pPoQ$y%VidlIB3Y1wQMH7&4lbN*QJZ~m(#>y}_Et!Gc!rLU0hvBc{#k*3s+NDqe z!w4tYu!2Qm>;f&|v`9<1AekkcvGW$(F47DSXfpte9U~w`BGEN>bx~3TTQjj;9}9R` zA1t82Y0}`>)PK@41V?Uj!;VJx^71m=?)v)50R-8k)^N_o*p1&$?0Ik;HMrt`kLovN zpCQe~Y8MPkzYG`#(lbuJw)?ZDGl7Z256$J9+b#c0b+<2^e)5eM_LjwceIGXTE7fHS zT`v|dHv6J?u06#YE~Hl2{j(W?>C1CqZoao5wm3PzoeIBncJUB(V!Zpn{K#Owf390f z!HWIgWS3@kX8yYW$d*SxM}{B!{)5!`pFhScOE&%0zrVo0d+(5^_;}ABrT4u#^K;%$ z-=5V=PQ7!g;m)=8=gFSutntZ1%_$Sk>r?DRJO2LI>#b*U@`h)?%+%bLcL&CZ+^vS| z>164#OOM+_AG0avFMo8jGI(kHF!L5tH<|y%=Gv55&v*4{X|4Ods^0Uo;hCjfd1;Y_ z!t|lsw+FGK+osQrym$NMALhm3=+(+T$zR)p7R?rf%e(e;aY}Ff@r4_mNd0eh_dgPE zAw5|mw#iqo_U4S1YoCq;)#>tMOBb8}tzBNek`sJj>$$?dvBBK)nIv+uG^O~<(5;(^ OA7G8UjyqlDKlmS`0O%V4 diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_8.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_8.png index 30b97cdf54c42b02607c803d0c6b2c4dc3fae9d9..e2433ea58461257b2e39999949ee249a4c35c3e3 100644 GIT binary patch delta 394 zcmV;50d@Yw3YY_s7=Hl(0002`twPcO00Cb~L_t(|oZXT?N&`U{#eX{qB%q)+f}rRD zJc5wbLa!ls13|D$3VV;BrKN?9l>r+o4OrM|z#>5+M5AVdlYJKM&djbiaGHhRzW4ok ze32+V!~X`8s9FR!9JB%=t?GDA?jhUM=s5&$l1)4?d_iS9D1V|mNl%SH(E;Xn14Tp9 zxaJj#fy#?lSV@`;ydnZH?|yU(9NDhxYYb?TTzW+U+F7f%a}bT|*v-AitvFW<;rqh< z2UCY}r?cfj7t(g0lRQf^4?|el|IR@hZ1950?n9EEta=J|q28lk*kxgZPN9aB<|h+n{il`U`h1r1;HwPITx3}- ocZQilaoIu%q-F3&VIBAZR2ly@(dqR~00000NkvXXt^-0~f+zm5&Hw-a literal 1348 zcmaJ>Yitx%6rQzd-4rRsD2<3POn(5;*?H~m?2NnZZg+O+Vz=Ft1sfj;)0sQnX*-Y3 zPP^MR+K0p9{aGFw(10zXS*=q~^VtBlWS58Q zf|$V2B^A3PfGv}1i6_voVF8qNQMg2sB+7CwAd7S>qlnT|C{5B7LBWT`DVC=hp5oAz zfkB6stnkf3bj2Oq1+bKDn>;~eG8tEfaT!({L2(>MkTgNlIMl$?y}B)CaXnpKv><@A zWT~dD8ai6AD7G5ib^wE9m!r_kczo5co?gin%o>puO@eZfgr*fjThdP3&ES6;Yig&H zy(S=xo{fg7I)-#J zUQdXkBH<9@^9mu(Q|Af0!x7e7w6PX8EQAG*m!#N8$XCE}jE@U@Lmn@~)?+*Qa=-$x z)E*#5Eki?>Qp~GsP@vojDbql~X*cP`MbS;-oR{NpMsWk5M`RUJgyApa<$F@MT%}L~ z!!V0%c*&!1K8cZVMrIUTQrrs8`9u%ylNn9~j2i&XhY^q>QK*`Gs;DS}rCC_6wgud* zHWtufH(9W4@C5NVY`L;TLo$-j=izeS)a)w=;)uqCP%?Y<)>}V3d=Pa;zRKrkpVp?^ z)iKAf4YyN22gV-Q^T?*9v7Z^$#&hk~$fsT(HMj3b^reFngBzxPSr|T5-}krPFthE- zn?c%jY5R*GoY^>;BFcCB>juyA2d=XZ*)wKvVu8GNxblg<%R>|EuFg8z92cM2bozQ@ z?Kt*FX`g8Zk6rmc(J&LkP{?zTlj$diVIN zJ-0Hsn$VNKe;Jtn=fbv`@|Q2Jd+v=xcTOHz{OJ4Nq`wwt^Cb^{vn6=vv%A%kNO0J3 UgZ=Zn?!td97HJedsXH+EAK;(UI{*Lx diff --git a/assets/dolphin/external/L2_Furippa2_128x64/frame_9.png b/assets/dolphin/external/L2_Furippa2_128x64/frame_9.png index 7ceead056debf20ddfb783cd21f49cb053171ddf..be1afd958aed696adcaed4dced58c1c55ecf7538 100644 GIT binary patch delta 409 zcmV;K0cQTg3a0~*7=Hl(0002`twPcO00C}EL_t(|oYj&&PQySDg+Dt+2@(9wn_}l0IId=zH3n> zNjl$+b05q-ZuFg+hx0tk&9p4(Px&eUI4qnw;f6c6F)&KKLf*AjE=fQ6GIL|aJ3tgY zdP&U=0P9zN%zvVJ0Jqg(VF48QU>NYh3Ilbs4_}oBGXq{5rUnX=*k`xaKQReN5bB7(a$t@C(_m>4ae>7dcaK%&f^BBV`im&3l**{ZIJ_$ z<%TnvTb8+Gks0-zWM*Q_wvdQ17$CST&Miu|M1$MnMKHgOMJNqB)X9mM;`K zG$fge@wLnD;K_@2T9(e?cwb+iqmOoIMh8x^EQ=EqPEi=tz|4Nt5>l9IRu(Mqz!VKd zw-il9au$Vlt=ICRknB z6#OdC?=seNPb?QSfM97xT+_M>O%UzWEY0lHbcCWE1oCu55EV5i*_x}+QouYgl$U{2 zYiLO%pJGl~g#zi635fzSMmY&LCJ0UfW8Ex^(XtaTF2N%c0t|l%FWr^8r7ndM7=~V8 z!-+1LWkg!UXo;3FQFh80%Lp!vk!V%`v=ac9L2*bC&vngRT~rXk*34~J#sVHz1`DWg znhZEL;j`nX;K;3wHpD~OY!+^JPG8w;vlWHHyg#1$e*XBy4X+Xrir)H*qKKk zDN*10?b@NEQ;8PKUc4{;?f!w?J5TI5(e%R`r!Nzpp)=wynT1{15&QfBx_A;~;^$lT z96Y+cr|iRB8?Sx5n;-7(snnVE&2-}GFm`A$G3i?4t9k0lm+BU79GN59S{G-Yiy8M< z-Dz9%fN%Qn?Csf`O%oSB+Pt=GdZ^<-=GZ^aILc-oY-zt$7fJtGZhyRJ&`5mVcC-1` zJD)aO?t1Ui!Yg}Ej@8`$>ucYQ`%?Q$F0KDb+D!fK2Ew`zrWc#8Z#_8l#k1)m+neE{ T(RK4Lf1UwM1IV6$cG77J7i=o2ngS;C|8iIi(SM{^s=xyr7+3_Z_gcaj zAb{x~XRU&}{f!J}w7dq)B*_}E2&eStBi5DRZsh={IeQ6f9MrG-01Mbztk(#){t(~_ z#^EWUemqGQf+Yg?@(sWUOy=2!`tHPQvS+yn?(HkU1fb)%Ihp9+X*s@zX4fb>qg wqBj97L?;^YWEY0Z5h&|e?+_1gcJ8Wed zt8Snuk!^(O#DPO_S)vGvx_TYd|a3eQNZA3N-4pYBKPR4ZP5r2?J1CW&y36h?2ii1k26?8xk-|Ojx zA=;~li`908J!qoJXlrGNDyl4SdMe93xEIdJhO#0$-hiLtNGRf88DMo0Jv?q#$FF0@ z2n>y@aOHaV2`QJo5Hc|#3ew6^nMa{eKw4Z*c}c8P=_5TE5T?LT1m$n74Atr|r4GfR zi3{c(hP*zVgRo4v<9B+vjN^hj1PO=3@~~3QgjOIZj^l^|LoiInYslC&0gjBw0&IHR z0zt8!5FO-bCIH1OlBG-qr-ym6PonS#?e?dJ1MEbu_^crjGKipZ1>*O|LL1j+IS2JG zjc01J&NV>_aZoH%5%TaQ@ukPXeEOd6D5l7>(Jcwld|k+u1mmgjQvuFK=wbeg+)I0P zYFw+em~ld-QCd*cY{D&s8OJacVbZEqIA)C7cor5jWLiu(foe?#MGR{+s*Jc+skCTR zMgwY5$Fa5m%aH*O757W?ekZVs=VEoH5JhrK$jLA(<4sUl#&8T<#sncuDOW(!Vmjbu z!tA10eV&9%P$7CX<+X$uKQx|T9sMiYS8CNVwMwNyHA*E$ zdbRKb-ur(Nhwy}uScm+lW8z1A8^)GTM}Xfv9U>~gPfmy*5r;eJI6q!Vh51f1FUQ8l zS}!(T1wgpWMi`utOT#;_u092&ZEAhE{`T%eny5je>02$nv{jb#^VYgA+fH1*_U9K} z$L{!7c{)cg{xQEdIChfl!Ud16q_UO!*C$DO;7X9p}Wqym3U--!=oAR#@bAy(0up&@F`1 zoX)&0U#H}n1=rIc)t(2r$s_A_Nx-YQbE;NNZvod6I&Ww_*p-~Hqmx)z+Yao)*AhPf zF5pTWs;k|y_u!5OrK>vsZH>^CSan{zFkf_frV}h5wuuUsx-(Q2#UD=5jO{HsR{c|6 z>#QY$dg0@mcIVPIu`8t!Yj+i$>h^cmJ^<&0jiURF{Z+SKFwAY9baHm$!0%ZpiVKpG zzkd6BYI9R{&HXD4-#XO}!P$3vKI-{QAYI-f-hK0K_IIhHk~wM9jr-)9^Il}1H9EC= z$ekWM3Uzfzd+ftRP0P8|79`0h9F@zs;`Tc;FJv6(W~`rn-=~oZ-96P+we24d?yL9I z-RQOqv|YAm{Wvf%cMtu;>-myP%cRnwZD%B}By{Y0tMgjPJaO%Ns4!J_bUw3SLtfNv z`JB1QmS;a&H<}W?Cr~bKAf#h2Pj8ZM9XZQjxBI%2N77G#o$sfW2lWejWB+xVxqvue HbZ`6zdoeq{ diff --git a/assets/dolphin/external/L2_Hacking_pc_128x64/frame_1.png b/assets/dolphin/external/L2_Hacking_pc_128x64/frame_1.png index 45aeb57b557469d696703ab104b5a6cf276ac9db..88849fc6b79752bb3885b263721281f77d00f386 100644 GIT binary patch delta 577 zcmV-H0>1sh49*0Q7=Hl(0002`twPcO00I?BL_t(|oZXT=YZOrwhM#-yBpD%OM`E!S zAuB=12EnAW5HgC5g%Z&1EVi_;5G=F_bAyFt{0AnTunH1E%S<8a50GrYk4zM?%q&Ql zB{TO}+}T9`g10;GIrly1IUM+Zo&uBuM4yOyl<|SFIuVibSbtDy@VAFX5sre{5(0pM zf*Ih-gg1=L%`aF`tzqgbs;w~V#mk`y}K&J5T+r|%d P00000NkvXXu0mjfPwxxk literal 1601 zcmbVMeM}Q)7=Mp1YX?IGH7M$Fpi^giy=zOkN`-zph-j(Yqg-uf& znqYK(%_t;OoFiK@6~CQ~#cIUK)GU5P<_hA*#BGSO8OdCx?26Rw591%Z+}-oO?>)cg z`8{7(S5!DZK{`na07$Upn~Fsl5T9I0wD`U+*=7|*ijZd)N;s!bN%Az%JGe3$ws^?Z zbTLgjsw&#)YyhHJ#%34n)&ecXdE{hRNACA{MKl1}IesrmxoH6|qgOMm4tf05IRs`L zI;2!>Ram`7+QsBo^K?mdp^d6`Q-lM_nFnY4wW0wJEs(I^Q_lLdejPGwS1Yc=$0!01 zs|ao#@{*L@S_B(8o`yAYOhzdb3RpwPX$OgyDV-!W2gVgRhGOEakzpDwuGC@#JaQqT zL*C)k7Msi??!=uAaS4J~i=vg4mGVlZoa0xc7(o!I0!MLNCThrhRjfezWvnkfV!=fF zD4y{O49CJ@i)0zMM$jQ5*_TmxyjJTg!>n&4S7O#sKj}p=xdQcg!l4ao`-EcpUmCB~ z_SveuG+IpixHUW_mc*GJ0gLH-v!k%0$VR)6XT-XYV$vbv7rBFRXw`&9 zW6mQ?s!XLB!}5%T*_21%xXNVIs8s}Rh}d`?7T0H)jf6?9G3pgztihl%5E`Y@oT)PC zF|#^?wXi;cWGOo0ml6GrU{!C#YK=Ti3LJ0axbjF76uCHo^SL-Lj4R~|cxEZXI=D*T ztZ;o^hHIjEW-aY7^PC4BPOz4F9Ra7>sZwXDWLX%2$y8ZtLPjVxYMEN4%EU62N}P0P zkP*D&|0E6-38CQ*`A^40j>I+$FJFy-xOp{1G%HRHFOCRR|I{UpS6oqnEl-p~Lqkn> z_ICjgRcbNmZT=q~)_Z&xVM*QZ|?6rS@oo1MLdsi?}b8l2Tz~5 zpU^gV>czBk-kf_+kEx-7&cLzwzWq?|eEmMiWuFdaUY)%2#PyuHpy2eMeLtOf$DZ*s z=((}1CN(YQ^5fCai|W=k6ut_^d=fZX7Z0tP@~Pz5LL`u$nA=(!ePzSn{mEZKr4vnH z%mmp-!9yDAQH~8<=-EBC6O4=M{Gg-T2nq)hVmG|_hSc=$ft0cA#(~j+1%c+-fPnIK z_a>fK0`ow#)CAZxSo-<+wO|P{7W$?7Ss;p;k=}FS?MCT##Q?cg8W6xz>BDjLNuaML z74UJ}8;%|bsvA;svva3zsv8xA{)pi->^}TZ&c|C^)^=(A$>mX7b_8Y@S=&=V3)p)c z+nJnslh1gZwyWV9SX{#lZXNY4I2)T1-1xOC&{liNaHXgEc-^%evit7M-wz&6DTMY$ zJ)N@BJ%7pKU{Xw|wRhjrL!k*Fdt#$3NCbLoGqblz{sNOE^Q0}ICrGfheNq2|Cv$-g zopZxIy@~FS#N{TjU5^$d2A(awbfly6@VmO}iS6ez(&7i(W;8s!52t+pV{&S8R9Eb& z3&^_i1LG_owm_lSl7kO6$JBDop3&~{d%7kPmz`Yls%6GqTbnm^_b;P*$A3{$@!Rc3 z6FLqj)}>nFyP|_@<-J8U1#OciW4BtGaOapsN0L@ft$2QN^RMqSr}}ohRom5aYgRAi zo;OQIe+ONh>h-O--S~WW{`wZ#h4k+BWc+!0U>Xz$=IG;>H#M#+3;)zDd4;AUhE*H> E0U%63I{*Lx diff --git a/assets/dolphin/external/L2_Hacking_pc_128x64/frame_2.png b/assets/dolphin/external/L2_Hacking_pc_128x64/frame_2.png index a4508f14b5a5802274f21c878a226c2aefc3612a..c2e190203454624cf95282e8ffe4de535a8e580d 100644 GIT binary patch delta 561 zcmV-10?z%$488=A7=Hl(0002`twPcO00IR`L_t(|oZXT?YZPG+#((dhBrAkuL4^Ye zcOeK#5VW*&1se-N(ChC5SfsNG_XZ2g_zg^9O-n;@BfJr?EP~C35CdZada9;vo0x)Gs1?P zC$bE|9Ue{Vaew3invO+)tl9Q(0NA8q%sS#JW2a@T0W}r{s*QCL2vB*;r~xJ10?ZQ| z_n`&?y~bEHB3~BNE(gkBqkbO!0pPTmQjR(iykL)0AYQk1pJJ%#j1c-h>TN8QOob9H0P*VtSw?MS|J^aGsx^PJgnYly7Sysl>+?#^&mvS^gb< zzRXq^lqNNR5-1nD#TGa6?eRp)0ZHYs29_pL3YM|A{ODiozfB+ov|A3DCu8}u1XyyH z=<86_LNx8hQOez4R zeSH^QsVWgHL>ln;1SVi`L5*CB@ng_luOD2mQly{QX<1h)bkVsUy(?7c-FZD|W$LO? z5rdH_;>Qp_vSl-IOv8dE4D66ZV8anzjLfO{IWi<}Y-5`k*%hhVAI3j+xx43m-+O+~ z^LxIo&Qe&AlrT2|0FY!_p||ofz(4tMk^K8X++H&;(m8{jE23ST4`)fBA?Q*PGI{Va z(n{jQ#tnUBE&!2~+h*tN=2a>u?GfW49kJiT@Mr*Xm-`vqSwV78DOu*G)WXLd7le?T zPzy^GW{H{6k>&0cH7r?FQ)qM6R5&q0xI7Qa^{aRT9+JZ$zo(M&s{CrqR)WUL(V^lEg^ZCR+nV4qFUo#kSF^*3J+s8zc5UBXL7}74ff*h~wHPXs8FS=X z4PsP;u_nsP;gpjM`*rhvXRyjwVpTep#5tO^(R5|F2`uF_M|;a@29nCe5@<<@n<8kR zcWJ0T&%@P|th<^dj4bVerW34kzl?xO;gTzqa*-0j5RqJ|z(kk~RfrUFc@B~zlSy#` z70%#^|C2bFCj^H&$Wp zH}iInmEBwZY`CVo>&6k_r@EP|Ps##kvwCG9sU#jGRO?vuNm(>F1)$jT>+;gB9 z^x)X%g4=zgk5fVSy#p!DAXQMgBp9L8yuEdHa$3Ogbab4UxEPU91PLthgSO$u<1t_; z!ao>W3XGQ3`S0F|1y{Aq%B|TS?gCursx$~6j2fgYu_H?*kJRx24xFBq4T|f&eJ#Hr zqIW_5&)btSl&<}ey@?IAcuS8Ykh`_#uxU@{sZ7IPwB=*}%JRS0BVi?D=q~Vjn^9`e|i$A*lbawTh3tH&|uItf` zgzvMuiVg1+I~K+Df8{cZuH9(9Vb9246W9y};yr#U<@X4A^1~$~O+Og|XZx*VmnO47 zC!BqyqTtQe^-+<>?~RA67XcH-8d{{7@0 z{Fb7eqZyY627Gr5J0A-7bX=YbR<5Z(AxKTswG5_zumEj~o^@@*E(a`bxwI@jQ&6}0 z<2Ill4R+5%yH=J9dh#5_1zDNpd;J~twV^+|$xx_o I)jGEQ1JdV1B>(^b diff --git a/assets/dolphin/external/L2_Hacking_pc_128x64/frame_3.png b/assets/dolphin/external/L2_Hacking_pc_128x64/frame_3.png index 350002167dcadbc5d4793f9bdf255e95c5341361..cb5868d3fc0cfc24bcee324eb490157bac38f35c 100644 GIT binary patch delta 604 zcmV-i0;B!*4Cw@r7=Hl(0002`twPcO00J;cL_t(|oZXVYOI2|g#y{U5Uaus1g9^jK zYZ$1D4h;@brzsk0iMs{evBAM5YRJyl8X9$O@e&QuEoidQE3^cG4WUBCJ(WBu zIp=A(YV|MlZtv%Pc;J2B7yh3zfGGgkKhW+^x{V7qmXsX;(|_`RdsqzRe*v&#jHv=n z0Si0PvY-%2EdRVj1Aj9T@biLw*f_p(^xSCcwRV2{3h|0$q>G0Ay~9QrF`{0JvV7 z0FS9w^D_YFxqtNrEHSu^8New%it_;ZIKW(ZwCL}3x82wTvl@!WdjaL+V_;fGxCxed za2s`Cag@7YQ6L|05HZ#V7)z4`Ai}$|CSWVIZrVZjSq6N$Nje}Xyy2V!Tdt+$T>xDS z?l{=2Iar40G-yQ30H^hIES8irxu&)XOOtHg7~}aqntuY88U;?FhuyxZDtHsdMQ*VC zatUBrM*$G|-u0svl9Ztc_`%or+es{?bJCiW;VTw)%w)X+9$w>1Su)bAR#ZSgiXiJB z?#yx_o!e1cDIh6}3*fL;)B?+nw|uD`tF1=R0<@6Dlt>t8#{w*=i}Yz?@Y!Y=0Th}x z`W!@W=T%z)SQ8fVNLwL!!gK+6Djm}pd^&NY+yx+)B%uI)E2{17g#8( q&ck;H-!FBHlsHLByFikZ?StQb9s2;$zQ~#Y0000H;vHjurqdRx^+{gLO z`R;klevy)#ICaYGDF6UWH7?SnveL`G@u6Jy`$y;&6DwvhdJB_A7BDW1!U2tq%*R2a z11rQ+am?mf*@njf0GF_vEsVvKq_mO_5$4wsxgAax4FGX!w-d7#;|!RO7upGxV5s$s z0JPgwf()5SY;q>xMfOFjC_HUdve~+-*oxW&>V;sOTge)5;0y-39VG;8rUEUV2uRLV1yM9__ecsC$RE&VwDLLjxi)slq9pB zm1ARL`>)mC1c0DwqfTRXU%y{>BlQbLQcQQqV!7ruHhw@3Y5?uq%p(CWNX=U-TXoK2$;P;xjXsz@JUzou85h-+czFM)Lao1r7z*6 zWL6EEa{=NgCwVyWK2KwHM21%6@xbBpj$-tMrEF5}vb?AFI=;ErALi?9jOXNtc{2yk zT}j$kIj@^L66yS2?U`5g9uTp{&dut~d^uD*gOkBIHKhpUUZE6aH~4#Ev{~FpZ|ts~ z=H!rRDb3h}y)oYYS&baC;`u3}t>ykgI<4}qL~NSRxhv?%E((obXO5O_SA2Rw;5`=H(UUTemoVqUIA8N*TNwA^SJPX}>mSw}*(@Rk z|Nb*om<7nlo#x8FX4fuVyT77|9Oxg~u{&o6k$E8F>ZXOf zV@p;SdR`)f^&y#`T#8#%dJLaG z+jSv52>C4JI>!=KS6DgHd*^aYt0H+pZJ#!4gGSQ0L_sTB)*q(A<=@J3uwq%~@4KsK zaSq3-%Xgfao7Z??bYRTX&9ArI%fEUHs4e>m4=0}2C!H8M2&jYjz?W{mYP+H<(f=nf M>XUWHw0Z0P0mtBHEC2ui diff --git a/assets/dolphin/external/L2_Hacking_pc_128x64/frame_4.png b/assets/dolphin/external/L2_Hacking_pc_128x64/frame_4.png index 7addbf932786cadeeeda3e7e344b670344f3f31d..4b1f6a2aa8a09db2756a67f938d0f526566eac57 100644 GIT binary patch delta 603 zcmV-h0;K)=4Cn-q7=Hl(0002`twPcO00J*bL_t(|oZXT=YZPG=g`f8$n+*nc1(lUV zvJnN7#uOGQM5hxAZDc#aEiF={5iMNj4GNaAwn>l_VidG6mf3)Xf<+2R0xCOdz%moG zSi{U5i#0L+1#fqsdpK~v7~Gdn18n4?_n{N{{_IdF{TbU z1uRen2*5Fu_7v{QC)&V84Fi2qGz}aF=GqSHy5KG+0HzcF3V8MuHkTsn)x@=K0k{I1 zo-X9~0PvY-!cqqJdLBJ= z%@%8Ac*Z>U>r4SB^yG9bDYscg9Tk>EvKeEH$8Dy7rGG(zQ|L2cV4@D*gfWpDtm-ZS zENdtL(%V1RkJ?C5#!G-7eEYDK#8TRlMx+d1wXki@G^?-xZ}6oo8SPg)Dqt8zkPVJ> zr@4@}w$)JzNXp^@IH+Z{!LscwUmHgnD-pB-&1Nwr5-OcofF*U2K9AR)Zj=!~p-H1J zLG*XO7gT^XVK$Gn8IlDi3&2zDn)%xMp^?#2HwRD}&uwLuWhGJKZ9=l9cv(alesA}P~1E!Zt6iE3Mg`hQ;$=oq5?jcV;(m^9I{lw?GKNCEGNnRJ??k!cVBDc zVix%EC-VUS@QaL4>pAJPg&~ z{oZLZ1OVJAiy@Is)J4k)+A73dIzorl#-RZqB-CNUi8PW0Q^-^cr4aNUJ0SoqMui|j zsuSsKD$;C;$YIDuIWYzzCyl_2g3$S3h(pd9u#zkeI;`oGUG7i_p4ydjYu7O>0H3O` zX$rwJQi-}aP(?E&C=((OArgr|873r+IGQ3h;lx}J6`=@>aIXwPWO7t2M=)^Y5pWI} zqe-q;Ye(F1JB7f^vNkykXJusxv&2H0Nre#%!(b5#qbS5_K=y2k#T^i3pEhbiP1*^@ zVq+~d1-dNaDRc&_5O8FlMPaq+bk7Y__K{q1S%V$84Mv0_*lKl!_Eg)>>dAj;yinV2 z$hMKNp0v{$48fJeG;I{jrSIjAT#6hUc`Re$>Vl`MX(Gc)Qf#DJA>eL=MvGA{#bh$A z22)Fd#99Q=s4%TsgQ2KIt&&M47^)n#@gl5Pt&wO^R3%e|i(FWxQli9UVzD+zq6|m0 z(ot+AWoL1UAV>XLIKLxUX`=`8y! zSACv^t0oysCTY|%v=w}sV7cW51W=RIB#{P7pkM?;AW5(kgD|m73P~lBAS6gEMscG| zFoHM!pTxl&A=uR+|LK^~Bd!fy%jYA&ZJrMiNpX|Ia3fNhwD%-8US4t01`Q{Nhlk59 ze{~fA+%`t4!wrrrzZFL@CqZBJ#r_j)<#=N0H`9$po6pq0y|;p=SUS~%=-ZHW{MMVj zjs=RgDJM+B58&TrQ?}h7GxHkUL9r0!=5{D$PN)djstpt8=%I>zIePg}gxcl)Y_8zEM)6ZOvXy&zoU z-Dqc=a=#wonO6eaMSFQajBUGK02R*(ei#?m7g(~V5UBKjlz8c{%MXeT9r4TN_wS>q zp1S7p?w_I7&I7{Qq{#HeLE3_r<8J=Tk)-xJ?en}MDh`(f(xqP z>_)dCp9xzw=Pjsq_vi2PSYlH(hW6oS{fgc0ybEaSR=+w=SqN+!BNW8l+rGLwAamE) zZ`+f}9Y@QEo&abWKshhmteP=>L;OeKye;=LuMDRCIeUMr*=zY?-Jwl6=ekpyuL+Za zpf8&B$WgG<(hJd3-x=x;OTAbUyLNC+)XGz>4b6sxkn*XYm1?D70ST?{XUa?4*7xmh zdF}j@?OivcjW7@F4Vwo%EKj=^SUIQLL3S#kQ^SYD0CL|{{% Vukz#EMy@vjAW{>f-mgr~{|5nAZIu83 diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_0.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_0.png index 8f29d5e2c7065c50e1ff361f437e85f24cfd1113..72cb959f02b08e90d24ee9a23e4fa8699d53b6ca 100644 GIT binary patch delta 835 zcmV-J1HAn349*6S7=Hl(0002`twPcO00R|CL_t(|oNbd$Xk2v^#eerd|IAF&d`yZV z217m+OD)6(L>nPAQ;IlY7Dk;{D=G~IL9>vc;0G-YRYrtEZdZv9{KW#dZ{4JohWbiTFd6 zrNxQ*h)?O_*ue@>y7+mi6@M@{K#1yE#2egFHU2_kfQT}>&(1GAEeYejK7G!QvZC4e z2YRcFVJWn^r=L7L6mwy1>Jr5ke{bAUPq`*jr8>J;% z709#rbOTLqK;%FbcnHh&&#JTmLUZa)iPGhM7CVgblcvj8}L#YkP*ET+J8UT&|L-&$}1`^(bMPQ1>J z9{}sDpTunBU#e97%lH4ZV1O~uNr!Q>h=epON0`tPL z@>c*{8ZQBuqf_P?K>2a_2_G=8OzCGyz^$gvhkq)&wcPRAgAnrjNH_+M;!2-$s#iTt zQl3qFj!eDWH&AYQG9Ipff9ADMW{o$((&!_EAIq|geXpr+ zZQ|#_mtw10(1Y*Bwk*rpJUmFC%WBh~=gM#`iXzC7he;f2S_{wN~Vd!#sy$d|6`z@Gs`3%6($ z`-y75O$dR`r9=6aCu{QUY9Ylg0I4cHCOxJ-MznRvB~V22Wn{laE25}~d@C||F~A{w zAHY%$!lblLqNSasG4Ao%onoRqbrfite5GfRIzZD0RDT0#7toaZO$8s4!ag0DI4_n$ zJtxzgON$<63P4*r@>>4KR8tUi@86E%Wt?$VT|MJ0^}O$(fEh98X{a=*?rn4x1DK!i}lGAlhZ zJugekGnQ-$pvE;LLNx+-XV3j;6n~o+4Cl9j$P~&8sYf7Epic1c%4s3{r9E9$x;1Lg zf`9Y0X^Ny)Jl}g$tD`IE4rKWDrffVCTnX+Za4zCjhvruF!czOyRTE@sAdv2;Dc%~^ zTxHOv)&M*jOwin>2``iTqV)#f7YVo7DVih`E)Rb9uDZoTwj~t}z#5LAa{_NottrU&` zoH?YBu`Ws9OUm?eB)>#uO*b^&JI?PO^my3lp_UQM_Xw=;Lk+?UQ&&>@Jd1ZnlOKh$O!U#4^`P>M`kf%;jWn8T<&Hz!kwSR7| zMcV66W0O2wGX^PSpB0X;2qXx_zYpL zJJS#%XIFW)qQ;Rjpw21&v1rdI&_lF+(lBWX^~kCjT_<@c5)rNFaP;p6w14hyL%ljv z14M>PUXHAWNR4lluI91XNI>t+Q!YX?Qd3xRU+E%=a2A=#qLd~w5rVJHdKFR&A@dOl z($FlzCpW;zJm)0>RCB$>VAKet?qgn}tBOXecTF*w?#N1=^m)YjB*V+d+wB4>h!mDq z7h)Mj^oR0hd99c8tC67tQh!>C%6UbVP`ykgB1lG%c|~g->iL;-IKMQ7b-_BPEdq2$ z21ICRM5ypB-D4`K!}B$Mxg08}I@5fGeitBlVmGRmoHgEguBIT%v%Sx~_Z$)VcFAMS z5JON&8yRCj*H50P$J3Cn@$aQY&-0`EJyg@^pA5!${hvXR2q0OkBxLBWNb>1O&=mTz1 ph`9+oI6?ZsI99%?2=L%{@DHzJqYn^O%cuYV002ovPDHLkV1oB84VVA` diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_1.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_1.png index f0756ff855ccce089ad99ac229b550b19c3ddbaf..c973f205b89e8f1a76659520b7361e48c7837f49 100644 GIT binary patch delta 809 zcmV+^1J?Za473K27=Hl(0002`twPcO00R3-L_t(|oMn?yXj^3*#ed(IdwWy0rh;*> zjP*_}lqxhn46BwUh?OGvq<8hrybPTn4hMpw-rzQ-tE@ihoFD~JN-|UwL8V|in0r|} z5nBo}y`|~~9czN^(vs#LACl#vo~QqJ_|A9!e4GOvm{7lfWq${(I*1`9S<``qnlb;E z>?9mWY`4Z=Z?GaPB-(F$WX!k5*hHnPefiRi_ku)MA=9=!>mJWYxcUb zwq*D5?svhS&mU`P(*}EHWoxQyDMVyE{McPiQQJ2{N zv^F&x8O7;brhhK+$&!&Iab$gIwJz~~mOe?U>XS8 znED_w|8uS0SD{5{De`{G6$mBA&-fAajU}&Liv-w+D!^n)I+z7;eSlpzM`mU&_^m&^ z(^SBH-18~`9P(k9OjGgOu3rG$2LW#1CiL8vWSuVd^ncpW)_`Gf{Sip~t6V(n-gk^_ z%f*{eF`RdOxWh&O=_)y=A7CBVpR)eZErr`}o$zlhW-iwyeR{!X1l+;tldR|WuE=sr8KQURz}0T{jiiLR6+ z#d9wY0DsO?8D4w_fba9Ofc@dI@yT2HG8LfwXz6MzrgLipRiNjx`Lh+6HxdJ64WHM_ zxfXG%$;mvV= zFLU?elv(%7VEWzSVzCqrJyfA_qR6Ik_GNW0oqzSTzRoXaxo(oTodM#5=irZ1XIP{+ n*&?ZIYmB^3`6Ex#&SLW)TEmuVj#zV|00000NkvXXu0mjfVRw|( delta 1650 zcmV-&295c&2KNk*7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000IlNkl~LI4%PbFszb_+U#xJhI|bY*#ccpzj(=?x;cu%gv?{&gBp}VN zl5cMdj)8-@Z>cZnez_4;$b!?Tl&@+4+`^)ZeVg(JB1S-A$;TSc*O`TA09lKxX6{p< zDMynRPYYVwkmgbPCA>Gq0Qe@nF4VUwe*pDR={ctnoi~HN@B1FHK+mFAF!yQD6zIv# z8@p1b{fE9?xPMqF;8y-Cq|mO(C8BJvmYBse0`RaOvEm~NJ}(^3%tsNC%PNPMIRTh5 z-2Xq7j37dE)my3vRtOkb&r^O@CXpH-LtEninF2U*?Mewn3Y{o3-gs|r1eN(!qh&== zgtnD7Dh+?5L@Sj~$4Z-!@?+GP&|(YaFFH4}9#RLKQGY{iVBvt38w@^!P*=;FH`Ajh7j$^M6vJt`}Y9c`=!w9 z5j_J){V-E&L=}oC9x*a0GNYhreY3)wgfkR8d*sP@PDEK=Soe;N8n2p8W{!$~q?eNf>&xI|`cDQ3XXpdc@1Tihd^4AC1Ql zOa*giG=n_Qla1$r=&>^TT#7>U8a-95K>0_ZXBvTJ#9sd*qI@l~X!QYKH-e+(S6%}k zMI~B*R)FSZ>&V3wYeft1`4uDMz}8yrOC5xU)qfDlBGQKCMqrJT{>=G|))!e+>WAam z3O<{eD&s?Hnb~&_T5X~AQL;@}dNyeD4THq4Bxe^AThtXju(_RM1%g zMVcaLG^6i9tZ`X>vWOZx`d)^QD>Hy2tv=FAM`&rSTWvk*zIEiwVD<>Ajpw|80} zX@8MsXmdo;4HqmuWn2kw5nz@>!!%CoC%mLT{xW{W(Z@%@LBBJ<}#aIMdm+?p=$Tp(V$3S|en?s8i zuNgG^0_R9bO{k+I!9aAK=U)$x3XwKB#($M=nqM{gTu9W5q%PgKPoH_6yfeU+jHbw= z_w#H8qc1BY&$l9h_FJl+r8!qqG=(NR>KM@)=4d=3y>kl7^N~ovy`F|h$Chgi@&T$0CCkAn}+Sj2-p&$l9hCa|k}x&_IQ2QrF3Qhyd= z1mFh2^Rjg0^G*kY7JYWZM)W8*1GNU=Iho&!csj4R{Z;3pdExpi-V)1=L|^2KS)$VH;*%|(nrD%O$f z#;pn6nAZf!Fhz|aI*zVw?IGg1(XfvmzYy@fc-Qe~RL(DN1Ci>p_xE=MG;Pr5StE#U ziu0}&wh_hBF&aI~=qv?Q!GGHya_v7n%I#Ze1JPneLN*d0=>f@`l3*nnpwRf$_~-X5 z-m0$;jTxF(xJUCmjD}3z_ghe^g7XI224l70r5yjLNFsH7!U{g;Ytij zwxm%ewi3f@QceL28v5fyEGT;Lkk|H9>)o}=}h=@blHb3IfS2q#*ihVvMZok+wAqN42_;=ak z(R1BXH2TD%jk7Tv$qO(B20XhLF#NVjQ}{ZC8FI?tKYu6Zx}V$7Z{fs>X&CZ}_HO}Q zOm{W=KD{hfKdb;4z2BK5Hq++sBS**p4{q;1Tzu!RmNrgpSwc)JEwBCj>`nse2`E5* zA=;lWd8%8#?O4D_HJ*FsatO(A1HhTT%VstnfvjCR0pNy%d(q8)iT$-O*zI@(h_OHY zdk(A?L4S-rG&RWeMhXnBeR9xa`xl!cVeG^#05|vMeRfC~d;L`(psUZrLGE*G{^DVP z&5ut*gNJZ!?u@Fc#d9s>9GgEs2B>P|&o3c|d;X=dl4@7AeeyeG(vW+l`yTW*o}jKPt&7S1zB>ZMynu8LH+i1z_E+8Y7kqL2cpFQWGTN}nV3tMm*1UU z&eKD(XM@^s8MAPFzkN1nBZY|yV6A(+erdU~TfrZAT%qU}0OJn~T+kI?RsVYhYuW(d Z9~27&PeK&u@ZA6a002ovPDHLkV1jL%bj|<( delta 1547 zcmV+m2K4!+29OMp7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000HTNkl}Oc;|ZW^MM-d)eShTubdWYNWUwbXzm)RJ;q7N@{U_S@BMIcJ-Z{BDz)OPD z>?>9QyJhKah>!s7x3!;T-wy)NflxVnvhy2I5}an=dR^B=6Br~(nURf-?wCv?S>t)_ zL+v`-zK9KYpMUl5eZMD(46?G+%W|$ZXS9U#WbhUVkTFK=>zSvh0NSKAS@P_dUi;p? z2rNfO?~jykJtaWxI}`Q#H`0vBQ6sH3ey@)ac*aLaAhlbCcL>l1N6MBvB!PVHo|8LC z?L36`*mt!p-zR~ZlOr+dj)c&FhC1GskCka(FRV4Z=zj;TA>SQ{EU&_-p`trqdd;D! z1Frxi`_8Z@l6bzN8So6Oc$hLPj9D9ISN?&tPk$Udf=C^!-RF(@TEdz^N~8~zG}#*w zCO{;kp8+e*(l*h`Vb|Jrjr$W}_{u{d1TEIlges#{%v$HkNwGTwWXt0yv_y@PfRh91 zCv$C)5Pz@=E&}j+6)j-Cnz~5)0jQ7jGPp5h4J)dopH3!(0_ajR^(Fte=ArsOz(*m^1x^&JUIb{ zc2t^`+i;su`||g)f%-%JN|TKM&#VM*)Ct_dS~AGzmp!)BzZV|_;4HT!JaP!5O}3Ya zA&DBYvu8?iue3x<)##WJs3CxtG+G<&KKfd6CXzTJwR%Q9?}aw^Q{%h^^Bh1*1QA%W zLZVt;ugc^XMttg>?#Jm&_p541AyvL?jYE@k#! zXWUUHIS_|i?M?#poj^_Y=(Uu4EO;i6FmRHMuIsWDfWk`bC>c&#;3@D_C#yn4+xS1; z#7@fzPK|LpL8~a#J}XWQsSn)>pk4VQpQ;4b0h(nK)DNQ@jfZ^K?*-8MonPCecz@+^ zCn7|$d)iKNa<(Fl^e6c`O#vhl(DzR#g62HWd$YsfNdH>-8p;8BS1DnXj)PBuCeM5= zNV}P9jM`9heyufE0jw}_x+3(>Ly&f*5)E{3Q zl|-61AR&XdMcR)NOjA6s0`xWxw<99+DGER*+M94x8LW1mop483j-}W3bAOio;VM8v zPu6E$xk0?pDMKB^E%Je{=x=s4bcS6*EwftFD{i`=zXiM&x~N#HW=>35es(oX_Ch>#(}ShO!o z*?1f7EUA6eF4@jS=2NSZ1Al1mdE{3!ss_}#8OCaTpgXo!y_9U9d7M9DU+*UDef~ZN zuqI1oGAg^C>k37nj*#XlK_WsU5=z<`_U$Q+N$$UM>&sL`;_m|LfEj(9Y~S~vi$~y* x^t(Ze>lyc-Y~NbSv;TK6m+BFClD<>$2XQ>oAjG)iR{#J207*qoL9-`(z-A8wVNqu zZK1S^UF3xd-PGiT{F$W5yswKlQC#KQ+>dj=d(L<6y$5!J(SMGTouLdX+mtYiKMf`X zusy|Xl8kO2S!;Zimn6BpRJo{7_+QfQcg4MuB)jdna(?K)(y5i+OD2GNL@5Fz#Ybqz zun&|vaY6U>*M-pOm0j1>q@aI}7cw81Y|XE!7hqVD5~sf&gNdLdDH_6zeJkmaL6REO z!tR)nB5dX~`hO@kqnVg^SduzbGn(z$ast4YRSZBE0MGej&5Qz2whWlabIZA2TV;T% zKfJfA>o5T!XMk|vi7n~?2J4bHUk`Y;ZsVA$0YBv>U_rY7{J|{9Q?4M*A7Gf ziUnNGCDh#gfNNmJR?PB->RV?+C_4aU=VnLJHxVO#fq%Z);%vM2g`~yzaiTo<_(SV; zNu5g&_S0-WJNrRfk~a5X*uyc;@Ow>?rvAiIamUAFb3X#;B-pgViI?4cNs`hVrzjGc zi<{Wv0GfX84R5K=$$9SuNm6?5VpMjZb+q{)3*1;pd<(DMd}S_svyUAvxrU#XS~V%z zs%g60pnqt|rwfu6Kbe!#sR=JbQBq0>fxX~Wfx7<2q(DG0 zDJhk@(nd@!;NZLn-$FK51Kej;-wKmmKXT6~J@4NO!F}_|jRT=sA)R_xcLFfM zk8bXDJ};M!wsStnG`Sl#<0GG5J~jcYr)~>z+W+;|+gJLo`aG0r0;Es9w9)qiaJM&; rR2bSGrR@3^_0atL`2pV1N{>ATy0)g=aI1|f00000NkvXXu0mjfg|~d$ delta 1542 zcmV+h2Ko7g28;}l7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000HPNklH8laRywN@&nY+3Jg`96tgn=r0Mt$+1b`8$lDDgR{o79y&r zTWJ=W;`!erUoIgBCrZWi@wIw)zv;C1B=mL_{H+Y-yVdcM0=#d=cEXcqt?+zB!{&7VdU}NMj#aNzI{zj>8^_0H zt$iZe9^FOY>hKrM`JPw1nh~tn*GV6OSh97$3~Itd--~<3&U6YQ;G(!JBr z#$45^?zNY-cM%crJ#u+W($T8$v*f12Wn z`se;=9VEwjPY|fV)LQ?47TzmZBzhsemriymA8it4Hj^T>5T!;u-=+LwbOO;_J%94@ z-Cp1G#>j80(TfyTRPMp6{93Et3FHeS$32bF6O_++^p2b5CG)6<(2FSFi~xLaV_>9A zEj8>!W|JignfZDKT6+GyYBj(Kxg13{Upx1i(HI(`tNa!LMuSeR=2!Bvnl_PsqRIfG z&)+Nkq=25%Ee6qQHya)vy>un5?0?82*U8$4OX=+TlteTJHO4KVd2a<~73P^AQINIX zDC&;Ziz>g?I{w$eGXg;h#|YCsS~KtnKeCqAXF;zsN*>k#z0D(=>ItT|IG+<8rwMlk znv!~Bt$nXTwh_F16X>Z(OZoebK%N*7Pewi7y59x9-_?rO)@k?I5#Z4_!GD$6HmeC( zQ@mt4$_zTcVWknE-v1I#CwS@Y-}*fz0%(hIkLJc;DPCHvc8z%YRYoAwfCeiv_2y{n z@b#{^4*LKj<|D}5L>5n+H%U{Akn(Tse&xP1u0+NcL0b5cSMC8`L@eJL&*|~V#iNw= ztT!GB=e@|q<>HNO8A?Uu5^t8Mhqc<=eBrEah|lde0k% z5g^+rvOGlFq()a$oDADNKD7BVvY`9lrF_mSzp7)X^EU9Ez{B?}4TMfl@b82p{-@9^ sXyJR+{Mofm!AC>@8Fptd3ag)ne=g82{%Tk1BLDyZ07*qoM6N<$g46#Dq5uE@ diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_12.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_12.png index 6a7fe1bbba1c39e4ae252b9ba8bb27b1e62c6d23..488958005864bfaa7acc312c555c61faf862aa46 100644 GIT binary patch delta 768 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 DHOzC` delta 1535 zcmVVTgKs=;p32X+PJ3}pD3o^ZAoC11U;*f`TKEC0;=Dw zRlo=d(0SYQPc(i5qTlUhAW8y$4GkAhHhzPr-{~p<&EmBrPBIuzTr^ThYt9<~ZdJml zZY5~?eItN2nSZA68RJ{eN+dwmK*^Gchz_keW{r;=lBqHfF=S*+KUVVuJt@585Z&UH zMA_YdYu{7)0FhFyAJc%4pnp!n%=ShJarfNg4+$uk14zoxfE2SL_xW=xad+dQI1ds9 z2;jw~)ylDI|Ivgm!_BV57u3zrKoGe+VE6!>`@N#c}M8 z{~kQ~cI))8%BTL`C$?94e753Z#J!@pv##16#SmaA%5zy)pE8fYXUp^FySBFsxo5hk z?OAWWS%16{V5Zcw$dN@1WDSV~nKEg(oAHS{0w4lvIe~Yovd9ooC?~&myX10E7L|2)~uFtbl%n8 z4<SCwyi2x6f z-66|pHAhOlm9LXCPkvTkKy3tRn?V{y+R674pV4G=77^vogp8RkWLBwYdVq|wY&51@ z}b{c;KmYhfk(7ecs=2j-&JivJa zaPJ!aC*y0+6Y0kG8c}y5z{@)MMDLrCet(ueKgIY&@w`N9A@|inDMd7P8-E9!9^kxS zxc45CXW(-@0n%R4YyJHlI6UK92_jKWR{u%R^kP*O(xKUvADoS#wy^d|G+)n0TfuiG z7h3bLI{6s{skQ#T4n|JA*S6I*Yb8xur_h>jH!K$~VbH%`J%p(*C2yTz&evj4v;nZ{MSa;2E$t_HIT-z>Oh=u9clnt(q7?@8QqC3*eut zJ63l*$xnh6-VZJ2d+s>`o(v&nm=vfRA+Nk2*8szf7N@_5f@l7DgrBPFYr5PAtRf{@XB4BJp=Lit!i!5_@$J6{~y3Jz7|v4 z^+;&QOt>_{qaMmD!~1f4#@J#NFtz(2_{m0vMCNJNq@S-qG=?L|pyUZx8-M@w09@Jq z_frg|%K!u59D;b&q%jSuW9XJ zb*`}6oe#-O%I^bkMUG;24rFuEGa88{!_VyR(@|@+|66#(oo0it-yl l(OBv&GV7*BFcQL^h=0XEyx2b)>3#qJ002ovPDHLkV1n}U?j8UD diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_14.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_14.png index 3eb9a1f6327dffcc27476326c75d9b48c1f75cf8..50b8299e2acc78505cd753e3adc08636baadd66c 100644 GIT binary patch delta 786 zcmV+t1MU2(44np$7=Hl(0002`twPcO00QJmL_t(|oQ0E3Xk2v^#eetzUiwBElawSh zXl%x%ZaPI%RBSUv)R(AOO-4c$j0!42Bv^`@!o2K+f(CIVVw!@&xX`#LD1PKciLI-2 zQ$eX_YQc}DDKBQsB+k4!E+$#I$XOi@hjTC7b741_cD3vdsecNng(?8If<^35U)<baizEPn+~hS{)%5Xk$YS7?h-q4GQh0 z`Ylq7DeA+^5`PUUeG~|qB}spUNJ>NS)CeRjbO0Wt=BI`lo|^(t0|*4r5@=8%3y?au zV18;Da@>@eG9Tw}2GH?MFXS>2;0U)WJpbV9t=8m;_ zo8(m6TI*Ps4@z&Vrc$G894zF)^HNf(HC6v<94z#|T!Rklu2O%u7l6^{u58!oKnGYz zb2%=xgnwKu#zMDPS;_(6p707W#^KWae@K$*%m0E6yMhkA(<;mO1&a`AdhL@|NaGOL zFzNb}-i##aY87nAPCRp24|f8v+Kmm-ez^1KiPk1F5j{iHubnABD@kgeOehaqPeETF zNn+sdt;MHCtNu!nfp4d2`270&M`g_#J%vW?&VRS6+0sJHk5SdJQXF%S7cOc&=K7^k zvtx5bs_m17+TMKpG_3o_^HF(rnSN_Azk$gG~2Vd4Mqo;5%4|*`|^e!)@`nnt&g!#eN*W0B~n) z@Jj)=#xDij96tlNIofN0ZQI~D4%oJ>bzcp4t6{q3+gbylGJno80(#yZFhjoE(da@* z7=7;%$&ZgR#m~6|X2`d-2A~AtdrLW#8M-cV4z9b4@&V?^x4j6=63MMPvOiyUCv?kq z$}ONmWOQGge@EpbI^{d<8W<&#jzz=Sot2O1lCOFTh*p`AB2Fq?G@`xr+PNb*`xen9 zTQ0+je4hrO34hcgG*iJ_L|Pc}{3{ge(b4Hx()_G^OV>clvcxdMKGQ6f6CG8)#$=SW zZ)jRYB7r2|_C5eYGlU3{bbVDhBWzu9W(P|01(E`?)p!??na?xlbmD5|Mv;~81^`D@ z`I+X8MTE3}ceOtw%y*|4Nw!r)2B;JzqcHPQvVS?$jjUoiiI^P$W*b;nJvFNa!hLsd^3~B{l_D^TNNaW_>?S@b=Ii7QNkhC-nkG_8nb63iC^$9fX~=$6JSs+^-qxj5IJ;_)yXKMR&|^n zM5JiFRh9i)C$QonE5N#f;b&en$efdzkBFwS41Y$Sp6)B=B?%UTk-N7R4JULqvfg}vd0%ERJAsiXp!L3aPSoap8YI2|>IJ2TS&;$x82ZN$>wm$A z)Li-&Ly)|8Mx$z`_oH6i-wD({*RDcZLHTVFp;{1+)>U12i2xaJrA2NJbe+^P{$xX- z$n;9CuKrO!52=%-dAH=jl7|Dl-y*a$fMe03Xk{QDnW%Xco((I2*WU=T?ynS5C2KW6 zta0hgRRq-mkEbrf_tGz&gYO^IYJas37azAg-Xba@1R4!KJtAmPlfDA@k;8%%aiiDE zZQK4*02Q{CyCVf2B}!YbK}!ptWC&EA+Evk$anv9@J$Q5;$MO0*fmNkvj3G)KWwP54 zW?iee0{MAS+3_{ntG9=R@GYRr7&64sbCFoBc+4WJe9LH~w9wBig-WmZzJFWJI4^Y# z?2Hf|GU%mYWY^q z&O{$h2SW2u$}hz%C3omajDG+lLiPl!2}u(g&d)F{ofA<$4fE2ulrHOU{(6?OD^B_t zJzQcs3yEM&$QAlL?0F-mRS8J;fjY8gZ+0#uAb^9)Pz5lbHlgOcJo4H3`x z_&+<$Tc2|Sd3zRc1|rJIhB9j(06jM&I?h@J8Tq#UT6h#uVP8PnR~{fE-%BFE59{C` XNwkRaCvP8800000NkvXXu0mjf^!@8Y diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_15.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_15.png index 6244074889e65942a79e6f658f1ad82e989cb88a..8fb3240d7701f5c38351ed976fa4dbcbf492113a 100644 GIT binary patch delta 955 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 B#906U diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_17.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_17.png index ed8d96bab11cdcdde1efdc162669fa9ac5911ee8..0f6ec25ddc3fec023a24cc19dec0fb09c37fc759 100644 GIT binary patch delta 938 zcmV;b16BOm4zvf57=Hl(0002`twPcO00VnTL_t(|oHfv2Oj~6b2Jq+m+NLL^gX&%2F2>wBXf^bf!@dB7JPPrgnEH0U@Cs`myV43{ih zmL3-HVs;Bgi^d_esO!>!J2?7>_Vm17^lEnp_Hnm=o zI*E$X`^rRyW5ni+lGFvPN!Hta;0^m&Yl_0-Kv@{18Em<3)-~Ov#bku>fb|e@FxQ^m zU>JZWEXR?Ct>aZ~a z);s2IypZyzRI$3PXa!JSMthHw6obF)^>z>ueW^D8^Pxy-X?m@d1Hj8uKYwz-51VL3 zH3xw0-n4fzjKU-g8;FREx8I-8y0hf|?9-!cCJd{j;|{VV^yT6zava3lwv;>^BP z^QOe?&$udocRt=Glt9-HpKm1%{u?kf4 z&40pTahPw_HZd7#p;!l^fI+0{o_hWI&v_vPc#4kZvK#!D_vlI1mb}LQSRw*&FaeByoDoliZox&o|Y;_W2np0jbp8pRqcin z-sx37owsmn%M!A_%%KJp?sz>X5oHhWx+A=F0zZAs20u3}yAS^OKU^5gDv?3~asU7T M07*qoM6N<$f>}w#mjD0& delta 1879 zcmV-d2dMb82igvh7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000LJNkl2(Q>6a3=3z@|Nk=ku$zvn%C>C6DX^O9P#|%fSdksJ_ikg1eT*^oeIH|tv2EL! zn9nBWJA97sE%tpM+qQkXo(&u?x>`R!;a6uY+i&$8w(*Yuh=0gfhX}L%StO_g-7efG z0*`)LsB5SaIkSsnY=7JK7U61&aP{CbKNWO{E&DQ~e?&^61wEStciQ=tKw(O*&P^f0 zzVCktfI;Yzp-KdtSQl3fzUmk2gU_blRh!ZMwr%6h9A{)u7LBpid*>}u6?YH5I`5AB zE4E+Cz|(joXMaV-iO2fcULEIZ!MFZ*^R@TfTchflA>MY-Xo2hwX1{xVyv4_fR(HnL zf^X+^R?(*H=*s39Lr?$&ThwUKNI_5y*bZX$uNM5y&aaYyDd$n_`(7u&>}Uh3q=*U; z#)zxtmAQ2VxrvuOMTIGb75-c(z zsA*wURo%gnf{)FI+4k-g->UI^WyM<+O7-oHsiuV}2+_DJ&-TI3C$OQxVPz{+y-VrNRRqM$q)d^?ZM*tkJ{RRIvI6+!7=*^w(qPznCgF+6-z z#NVs|GDJjR?HE=RibsQw?bWmr6>`xy6@M?K00^ACM}$Z=&rpQUJTiMn(#jEBS^+G) z-5c#@hDZ@u|Fa9f$ew-AlqwpB&4Z3{7k>gwctOu<0|q9w%tj`stk6V%yQc`Ri1ktm z^CL_fcO$?U>(pSv3rKb<@WxR{z}hiH^UCT6Hpd^n-H`wjnHtz<3OuP*3&rexb>~Ml zhvEa;Vb@E12k3%L+Iyw|36)jb=nM0$yYo90zqQSdlk9qH0*q1HwW{RK_IRHui+`7w zJ2~I$hbNzmC|=t~D8Ph50xysrwvGRXFKYivfRujf@s!mkk5+&Pj09C8%zkLElEW1e zWWmb%L)cjsORd_z3 zZ`I(V&&)Sg$DsX7e+piOiUfNniGSIqvR}NKp_9*#AgT!-qX24E?zLt8j-(HdG?g8n z%~SQkv+N40J}&3J@tuB1?+?q*+H`0S^+$$yD1C4 zwdWO=MR5`{W@vJRxyyzt0 zjS>0xW%uqWpbBcwL}47MQhc8ID3N;_7JdC1hFgUH4$ zi$DfNI$3*G6R_v@eJ3bK2z5khvT+}u0%l&upD}m=SXF?|$0N_Sa>VN(vhh+R^9*!% z(yFmB`0TjFz`n9o#(%vU-s&-AjL-kE!b(I15&PtteUQQS5s){t6URD)enfQSUDAIjWTC}mXFyfcRwx=>CBq9#JshSD)~5YnYgTKuEP1k7&E_AjAGT!)wF2&;BG(^oX&kf+ zR~wgf;H2cpmh1>PT2BIZ&-3YzW9#47-k;a|{ZTc&SK`;g8Goc3soST^DDvjQA)koE zO>>6a1NtBJ`p~W@q~oSZYYMHbEu)q?qzx#l+WP?bY!*i9 z#nMsom!1Y((@YtF?m=yB1k!dS3W)v!dlv4 zxM8MSg&0qcJZhi<{*h&WDO-n_F6j6Tk*h-@t{3@IwT-R5Y}n`QaIxEaK0^nXRu2B;5W6Ne{zZCbn)iL(aK zeC(R*G=M2ZbZB7xf%@2P8!9`YKm)6cKwn`465o@-r-A%nW^1Gqv7d=u#sG5eKK@!@ zk}0$NbRdC40F^!{zu^?tL-sfbh<0Qprt9~m_hey83?{5u(mIILhr`PY3IU`+1Zk83-wJn zg@tz&J<^#4^7m$VKWzAV-(CdobZ+xa#7|7CU$VeU7IR&-(^7ullUZqc;>YLas$NVI%MzyJElrBHV1LjP3Y%Ju=HGiUAMQq~!xEFZYlsme;-{L3}o zr+@zAnYP8}=2M&PHQT%V^|?t+0`Lmj?_BN+`0CR&w2q00$jnoN-=8my=@UAbmF5*) zozpqM!`@CSpP0{Np2sVgYzohoS&|2ZzcnKpr#NZxRKi-+UD=U8m|! zeQP}YkOwgRR_W~5$|6s9-~nuK8dQ&1)G!(A0T{m+w53O%V*sC|l+2ZWUJ*Ih6^ZGE Z{{X0ww-lca*P8$U002ovPDHLkV1np(;%oo_ delta 1904 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 Y55tkxIRl$M>i_@%07*qoM6N<$f*P5}T>t<8 delta 1972 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 delta 1631 zcmV-l2B7)C2ILHo7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000ISNkldx$ zI0kUG9)DLe@WZuujPQaV%8+Ps1s-<|T|Jngth>tbmjb>VKYs)Gay+sV?wac~Mw|pj zog^ey%l9aWW8lf$UGts9h`o%K#})FW4d9cMf5P%MZ-2~qJ%*K+l<&$Y@L-x4S21@L zB4bDQ^}Jdu)g-!7zF`sgZOWH86^QPmh>(evSIgHe0B@Gy&wpzx>rlU&Y#x^Kd%tjD>xW&y zD2Y`h+IzN8oQandU@_3b&{ay7Uda|<-Z~7e2%4A3^H<5vDpa3+fE~TGRp946Yb{1O zR(kNpFri&X*ipzjs~(?z9lR2(puDhq{?u&=Xo$fbGd! zCy(q4AAdwQTi{(SvlDLy&|;lCR<{z2$Lf3R3E@ull7*)M^j4xPE7_>v^TOpB`mNr* zo_~&GYK#o7Y_V$$s{t&J88OzH+oF6uUmJmj?AGZTLXWvKh8aLc7^os<3@2)zGU>=N z0+04pieB-qfchRlVl*>7M?G&1uRAB7YY&f36n`tRf~IKzvo_tju9vU%nC!ax{luzJ z-;)MMu45WNW})cCOzXOGeJf?4=1kA}D3Xkzqrn)mm+m~Cz402|HNea;#dy5eVaui$ z#{0EFtWJrooj+s<+jatx=a(|4t%{7mGb)racEs=qAO)698PS_Zd5>+#j6!5wks(Gc z+kc&ojeePL6nt`0PP%+M^9Xdpx>E^O@gK>o$`D z808~6k-?#N3#fbO@z`o0UWbxd^Qg7fR^mO3qxDL`U*70(SHm;V5e=?cko5lKO+6^O zTJ6-xi>%+e5u<<0d%GyVl=9-~QC-8VwSNMdx0eXOhIgir%P>^RxOeSW!t#7ZHmeFm zi5r)RHv-A_8OBVsrW)!LU=bO;v1kJ$=*?`jSog9{ z(&ELfIBCH?fW(N<-mBoA`8ymzkqoVd7@FG))5)a)$blZy9=tTi&qk2Z>!jhMIQA@q8Gwq9VOrI%uR8*CEHS}%P7Pk;IPycuoY zsvW%kf~Fe@K#$XO^uAiWz9saYv>16=k(Mz6JqKNxwZa-8<8f9#Yq?4~BgTzNCp|`l z41E+@)?&O`KjQU?_Q7zVuiUT&Wq5s>mD zLqJ}t_kiYE`$crJ%Af5VbblX!VIBzt<>(ze-x`aIP~T@G#fdCWE3WD90U`mS%`;eO z4BG2GzI7z>#zmMBA$zXWH-X+}tX#wj0|_Ua9x{9%hy5qvns0fHo})dWh=$$v#=C4pbqW5PhI@)ZH@*_{`^;i(i&$)*7_*Ug3 z&qwk?jI{zNd5tu^}1#?t^wiO;|2`L}~r?2ht#F#rpw d$ob(j@DD0nd{=BE+&cgO002ovPDHLkV1nGyZK&t8UcVy_5lD^cEfJy zL{ygg5{nO(+3wDmHbV|Tkn-DrJQJ3unnU&?u%N^MXvhRxHW3*_*)vobj^AYNRQWUj zpjkoo=G|_%;!e^)AyUTa;pcnH$me}2JB1EYvX5d-VSmP4-J`yO-{+=eKQeDeZJ@M= z=!zkc$VdpzBw(xtIKv(q3VBBR(dcaV}>{|EXPe+9=$`Ls9VGeP6n zdsBx|{4H}34w9&pwU(4}CkU3H`F5lCdhtCJ!zn|~=K+OyzfbA9=LG%Hb?zV)QBrQZ=V zEMTwvT1*9E)nDq5Du2wmpL29Ye#%(S;b8)qS~fCyzydUO7I~WZyZDARtgfr?JH_}j zE3h2t#9sG?+byMDhjnGD5QMu_5@$9s05B-^(O`?WK1=28AR^Lh%h^%Sy_xC`=VvBJ z?|(`>wpBa%eMHbr$8VJfr#KnKh~Z%XK&dC*8G^j8;m1z1a${$9v`wpjHE$El%Gc`_ zh9J*6WE^Jz!3eJX`<+eB1JuI+PR1#xdT~wO;06k&bYM*i*gx=kWe@`p!+=Xww0Aeh zWbh0q$Q*PjuMT< R>u3M~002ovPDHLkV1oQo$shm# delta 1935 zcmV;A2XOeg2ayku7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000L=Nkl3?T*|y40DQo|5x_?ITu~_>_ug7-?Ygcu zFrE#JcmBD5Z_#^i*L8jSsRG&aw%I(iF8Z0-+KKG^lzF@NaDTP`3E&YKn<2s&Um-z- z0F|KIgS#W}7Jg6a8LC9i?D{pP2;iMOr3n6gc6d(@KJrt+46#-GiJVk!;8;{;;flk| z9<%$T;3GdHjI;G~cJ8hB&J_R+&JZ~;lNO@qcAcjNU-b*k@y~|eRh!Z0>$eTYY4_wFzR)4< zV4JmrHeg#3KW1kQa0=G`O7Q(T+yU$R-xQ!6R@5D23o42*gWtOOz9O##-Ky+w<3|z5 z978vDHxXuGZ{n)03@ZiS@QwNB&t@k5R`>qJq{x2u@6cve+nE^!I6d-=P4i{71^fZo_q5vJ#vMel@K` zHh<9bY;EsDN`PuUUPZRChzvF;D7cmcV>~0nYLKG+t=gSEe|t_;0nlywZDe(bA2&9~ zh+&^qZe+EFK&S+Nbq$7ZMCiTu6NTJqs5ubLiRzXU!T00Uw8C;fTYJXeFMl9!0o#}_ z_U!mwim>73o z4$&4tJ`ji`r*i&SlOa+pzXsYb8*lMS0t~QVGeto2Z9v#TSJMDme?>`Hs`9?sv131o z92T!8fQ2VRC0~1$@MN%K6cV7^UJbqvoDU`|^1QmCvDW^_5TG^vAF3iL^(12Jpnt_pw^>Tic#M%%6`U0E4|fk<^d(ZgBUkQF@Cz})D;}l>(In+$z z?Krh)M1>c6mj%&3SJFqMY>J9~gnt6GrhRjU-us)6R6$wW`+-u@YPS#tUqR+q?;HQ) z(7UlixX=wmwlfL#wlZl}gYL;S3q<W+Igg4g!6|meH zwP~yJ>({lmvfwNGVE$${>{$6Xg5HYgQ2ovJx5IW2XpFLUrCVTrp2SC{0Ds%|u^j4y zqvUT-mX(`28+^8x3cl_4Ur7N2sE=pu9D26WhOu!1lW>j*o89~FTp=!zns zUOd~=301J`Zzq7wFV!6BF*|oh@UucKA{+7t{Z#h6LjjPDLBt>bzW@f6i91>rU%XZF z?XKWQ!DL+oo0r**-mhLFZ^N(gh5Al}YPGw|=?V$ZO*^RoE2L2sWTyhyVsQNZKRqC| Vn`u&6SO5S300>D%PDHLkV1i%xwrT(X diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_21.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_21.png index 0d407de64bfc2072706a182f61cf9c0aa101cd6a..904d2931f1cdd380f39a50756003d26f50a4de25 100644 GIT binary patch delta 944 zcmV;h15fQ6%*c`@Mh$UU%$9+?Sm{C1EkiK@ zxiU5uX9966V-g*MIYtpEgR6!1?(s$2x1W6fJrDExcfvYr0DldFUi(0Jo;f1aYzls0 zR>2Rs);3|=(tU?F0*Nr^=!!xzSn<4StA|Ae)dG;BvVZJ}4kS2Ykda`8Tao|Xk7zI( zv3uZ11*F@B7IAnOFgU)K00?gwYz2vk^Ew*Y zc)SLB%#tU^iGL!2OJtp%T@&E!`cgU%tf~v>c;mDQN@}jp>_i_0h&o;CFM!OJtmPX- zVNRs*Y7Io?SXmr511izNZ+)f!e8}{3y-Xbh*6o)S33v&ilAnoNfVrv@97M~oZa692 zOos2DT7hZaZ6o*TbUf;mY2fj|*LOIj< z!$Z4i#mMT!xFhK!SxkdCTe*v?izV8rbPIr3Y=8LeX>TYqEPNZVU)kKemjdj#coA58 zIp-aJ3YdmhUP6AqINp;2B=#tdZ}iS}b~k+swuio*dGD&b#+GTZVS|nh9~|9Gw}6z~ z8^KV;1j~RkN(hVd{eL#3KNjt3S*p4v9+dZ5CJAJOn`zOoxbZ5YF z>3_3T1J7hz_6Pt7z)w55Vv(3_6bgU>z?jSG{Q}S+r-w~-+ S!&OTF00003+m_=v2$c8a|9{#0vh>oVfC9%!_E}Xb z0QjJd+C@AAo~|7~^3aZuBQw9VpUR%AfcYm{C|hjb_n(b;^lu%zd+@d2M+YC-?PUCn zd@{t$@%0Z9k| z5f2E+plvF%wLCq$=21Y9b*~CO%5aZqvvoSGNddq*W`8NpGa4OCG#An7(LKQ|1I!4U z)u_3)_8Ac9Iqr*~%wgLfWCp9qL;yRYH_&^yBKVPC-ac)>wg2+nHr8nUF~->Ti5;Nk zjS&yM5uj`)tUmlJgP)ySr3{HaYhwxkdf_SvL{O9C0l@=7HyBsazUPk>)PFG`&~qbu z(*Ur}d4C&0l6ANY5M=yp5UiH0>#sDTED)9fAlg7A2;J=3cKuFp?i75)e5gdS{xM0o z@6L;$jv&L;=Fn?cq^XIJZ4Z$>0Qo#S_^7dE)@SKo?+?jOBQFfVbexQ^+001P%v8!k zHcTVGy|~0Fon%(tD~90(jQ`k6=h+CT-kFV zUw_8<|13@eK;(=_RO|IP3xudF+%@y!%4bEuZ8)M6YXSeEqHRDl2 zc&reWzNi#@`FU3Wh#Uz7?|{2Uva-?4_JMvQFlB(gJpe>1K*%x%Wxv(!((I~R1`0CT z3(~dv-n=m$1OSl?2w4q{I_vDV!1%VZ!GFveLbjCH{r-CXGysUW8zLL2F>s@Z=4C;P z^k*APkJh_42Tx$^AD+)jfTjWfZY5z7>>V}LQ@H)H6z&5(+)Y?A4*nXh&A zJ|eN>Hc5Wj*t`6AvDi#U)Et2T&3}n%JWKs(4)UA*v~%tH5mPV?@__Al9>#(Jp-a$uXN}+9(9XeC-@ndsv>h=2Y@3)vjQpw%(&KL zgOBDRzdX?E`AA;D08#xz6z}~$L#mnIWd?7)=xcc_0Bk3ZvO|CObk77r#D4^=o(BRe z%^PW(%us|9uLc09VbGo8O4_ihE=T;_(6`NzBuh;Ano2%ZRlPUDjuwAQhLuA3E` zvIeU0)%O8tUF16|fe1{G1i*}V8JS(DI`09Zx!$uZ_-G$2J3&zVH2{d%%xCV?Ge^Zz zcoux*YX*X-JUsqI(2P{FIe+T~qJVhUL;c&1L%L3yMr+@ref|4S03d4aym6$PQEldf z)?%9ROysQm=tBD!cks zeT!HK0U>%9VCOQyALE4#z=(IaXx!FhEi3wG3$6$V?3I-b{UxUs?*GU+m2~4b;<=|oG#$Jax)Epvw~O^ z2_PGI5lgj}QjxxAe}y0*bk^|XH9Y{6oz;%r&a+puiez(8gO` zH`jaR$$WbDnEA;59mU>g?B}*M|14k@t<^(gf|2R54A22VCQ$>LW&bR=G8T3J=g>%O zqcY>I>mO+(ScX#e)_bJ002ovPDHLkV1j$8n?e8p diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_22.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_22.png index f53ee0588351daa326d75d7f83454511592676a1..4e0235770b81ea3760088162b7a9f950734a499c 100644 GIT binary patch delta 936 zcmV;Z16TZm53&c47=Hl(0002`twPcO00VhRL_t(|oHfvYNSt*X2k`gvz3Xo2SCS`qsri3);FP*hr?& zY*C5LqdFUHc-olcopPt=bHASF`F{H29{+vud4JyD??-95bbszo%_X714z3LyxXGi{ zUEc%9YM2TF)xdx~S1uQbRCPe6YU02zg}D2}RWd{;S?j$i;;Y4xG3kLJ6j0?dCrq?7 zrQfj05Upg=g(x^ak5o(p*M$LQpZyVtXXz!MO))V*64gNi-R8v1pe4< z6lKe#ZHsmyaX8kt#QjmXHM!4w(SRv*P;!rCQ4srJgpgar=iYr5#+UyEOkgbv$~k ze}7{s_hJVI`wAay02t$Y!Z$oa9ynP@579meJXKgKpLW=`kf=D;AU z0tkRP8)XVWO>ChS0C4yEUgSCOEbF}u2^3C=K$?YsI6E{KGW>d1agW10000< KMNUMnLSTX%R>`vf delta 1920 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 Q4FCWD07*qoM6N<$f&jRh>i_@% diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_27.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_27.png index e82d7fcd14f493a04faa51ee47faddcf2b77141a..b2521cee3cf51c8b4e6f2156e9f8553a176d7466 100644 GIT binary patch delta 942 zcmV;f15y0$4!8%97=Hl(0002`twPcO00VzXL_t(|oIQ|zY!h`D$G^YdUDvU~UP9(X ziS6Rcup`<0V_`&1D-M{`!W_M=W|~T(C@wKG!Ds?;1>=kug9b?mm@ph>?cInoagi8D zuV@h`S!t+ssD=P0dg@(LSG7EE32JS%GzO4KrR4c8m(jhXh2Rv22SKy(D!}z)j1Wq z2g@5;H$lXwCSi0GC`dRa0^qhfwxwGIa*C`1Anr4%pSb{N(oQ&E#v-Qkk$*>sNRoEa zx#ZsocxiXOH-AVpC!Zp7WHP}k(e=J~9Js5*@$PenbTrUq>pK>rH)Ns%*7-+~q)f?7 zm?$O@`K0YC8YqX^J3(Dmh~nd?b+Huupmt)$sc<*uEkid&6%3(Az9Y#5TyJ?r0xERX zoUEppmkOPKxj3VR`GcnyB8#bNCk1|dx|E}wP18pWCw~Iq?@+D#NIg^a24EjL$MyFVADW68s7xNW3QWr9yNfN99s8n@Y0~Yd zmJJJPP6i96PI3wc7+*DeHN1Z~tug}?QpjXRyMH2%kP-UTx2pilH|g{>L$Q1YK;m&v zXjf4|`>&u3HG@L%sA2g77(SvMm}gfFOCAXErk*q5y(>F_B)v4+{6pHXpb}N#kr;ovFba?&2-^{N{l_TP_J3OtnU>aO|ENs2Zzz@EPM;%I>!Q^n35d)%`0V z*MIXsOW@v8)9U|gH&+QZp|r3bM14Aunzu*7zuX_?uNw-7dB=4$R`}ps8I~(}7WM&9 zc_lyqazob+MQs51Z5se!;%J=@0PBP|-j^dHr;E>N#%CTtHn%rBLK5iE} z(7uJTs#!m4m$wBDM+Gi6_9GM2YMd5@Mkn}1Tn0>Zb4@$W+U1J@Im$2n2f#wNsc=&* QkN^Mx07*qoM6N<$f(CZCYybcN delta 1899 zcmV-x2bB1@2ks7#7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000LdNkl3+mh=j43wwx|G(^g*d<3t>DC3rIQDkcR3-+5Kut>|=W>Y1DI#*7r$ji8L%hDD zUE@4YIgaB!X8i6w%f9Z$tY4Yeu{UVG4j(c$MMMtyj{pNZh<}iA@Y{lKv5O374*RT% z3ISerKxG0(1lzuI({^Cz$)8zIWzAK>{ODkfpDfPvd@qE_zjf@}gRlMG9egzJ%!yyY zOXO1~v=bGEB1N!mdcKv-+KJskuO6~a^8c0pkK{G@_U+shuJ-&DMx?4&5DnK7CAKyS{~B-nA{uOM-R;pb14 zZAi{M8=it#QXvxjCcg2+&(sak`ZQiM>_iNYaP9j3O+jF$W9d8S=D?OfwPk9<$pV`aP%Y+vA$CZ5mpsog`i_R zE0DdEi_&UTu ze-U6j{C_PHL=|p^2&4VCNzjd`>aP@{St1bvw}0tzvuR=FwG)~7Ji@K`iN=%(;K2(p za?p~(BaodVLxis2cb)zY(&=_@Z?itM5&*%IY8%)J88So|BpB^i1ixExB6W!Hp*GbT zpcA&J(N5Yv42)pR#ud4Lm3%Cpvw5O9^i71Ug{KG|X`ySKSJfQI7m+`E zaepZR26hp_OAFt6@}qTXyDJ#uzk&b*-9*TY-*p13C*B6NLI~SlA;_gQKm?Bnwhsg9 zi}EBJQ}ws2(DZz=0cQCft@&e~ZzjM1TCfQIew-mH3T@w6neDn|ur;GG$XB!{kZ5-x zfJpphiSFaUtE{8jLdM6=0yCp--swlaeSbW^3jqcqHPFu@u#;F-1h4;Ufyrcj_6A{n z2>)Kdw?S9(<2^b7l@rEn>VCFhvo@HY9l=Lyj8cj%D3MPhHza@v54sMb?iax$g6=aT zxwEn#-2f`KJ;k^s0S4H~N0N*-2%U6ocWjgm1ln-)zN?1F_C@W?m+^XQ0*Lrk{C@yC z(Kg5$5fOABJFjlfo=((1%Ihp8u{j>800R*TX6xJx5h^};{i2$Iwdo(-5BdK{1@OR# zAtHZmVCDo_dl3nuewmY>C6NcK6pvH@k=%(xd9u2}Sv852B6IQ?iK^>F3h{nDXZ7(* z!E(Cyj8**_UPaDOxgBH*K$hkh`F}G77*sRpelx+3$W+CnY5-Ibv(4|YZ*67Tb-!%z(KzH6TUT^V ze1rm6Nk=Deri$Nz>dBu~1~z{5*SI|a2J9)cf!439SF05twXfdEX8jlmEPpb$i`y50 z(S{&NUCEdBS+?Ci8>++))*j;1x$+dzA=L@H4QdlF2wy1U)_qsMi;*0Wy`ot+G)i&GI@sQMO;TAVl*p zTZjnWX90F>Cio&ZRe;J>$o{T3kZma1IMlD>x@pPf5djg}!m64V{D0$k$aeu1WFQ|JS7+9gG+Xt3YKqe>c7>jHn zAp71%qAOI@{^;MawrKu}4TM|P00mYO8{h@g zyMLqmxra`rn}Ij~Yk%d#jTKzEDc%(e^+ z3jWon+k;JQ_VqZ9KmTC_`>;c!i>13a4f%Ky+%a!s`qXM lsFEq_m))}rynPyN{{V)JmUyk>aYFzA002ovPDHLkV1fv*k$V6D diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_28.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_28.png index b16dda91d5811ca36993ea8783a19934068ea27c..5a5043ec52f10a8727a71d3089d011329f070733 100644 GIT binary patch delta 950 zcmV;n14;a`55NbI7=Hl(0002`twPcO00W0fL_t(|oHfpWOw@H8$MNU)bDx9bXQ9Ac zWnOI!21Mv;T7JsSw#rEC5=|LlS8CbTs zQ4d9+q$%5(6p2Kdow+UJ;A-x3H!Voq3`p|7V{@V%ygiPGxM?6y%xF=NUlrEmSl>Xh z`>s+pS-Cgi7c+=TeO`#_#;Bcva%%!Z$BxJK4-NXupOGQcB-vV$%w$YR&l)=j-+FDMM})6JQS3B}-Oq!AJdR87dUtACJn^NY}t$>P}OVh4Ujx{m))xjP_WOj5mG}sl5$i;v5M-`Ceb)LJ~8MC;$ z`JHk^WPQhj4@$BlmJ=!Rl_4Uj5j%hTHS=IR@Mq+lAt3WxM~V;ZO&z*o#TztW?798n zQtu3csCEBiJY`6!xg2r$<&d230P6?3QWvFYPa`c8(OK}?9MZ_fb?)qVsmj$;jQQfG&$OXQa&9!x6$oM<8bj(AMl|E7zz zsqc-_R{Br85l$D(yFT+e?T23;xbzs3As@N-D{2Cd9%Ii1y}Fz{@%z|gc-|@Bm($iC z&wopgCf)ab+BDTZT#?(BhSm9+^P7_G?{&IU$he5CtdC85r2TKd>lqaS@aTf$A%_(o zmCBbM^<;#}YWC5iyc2`~qE)yxw5T&k2)x%j29*J_T?K4_{-$^p2@PA-cL=bhXUIRV zLNKllgaCMGb>G*Gpw(p@fLBfbP^t}FsxJb7$#JVYw%!QZa3vQCoYj&~pLEo`Z+YA3 Y|H-Y%wRo>5xBvhE07*qoM6N<$g1GA4@&Et; delta 1967 zcmV;g2T=IH2eA*37=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000MLNkl8kG(KM(Jli08|{%nXhPpnt;Wd4_@1G0;^o8T@mH z)9v>sb@S&}{dtVP6@W3TL|;}VBEA`aTvt)PiaRnsI#>O+cZQCw*nYZi1OX5+t{koe zs0P7`K{8qIEcZ$dwjcR>nr_0BhQh#{HsF)!$GOqUeUFZyWEA3L@wR3R6(x}RRR`zC`8)3)5r(~Z&C4g;+ zWA4=+1eF^ zJ2L+Y=T`<<^h3w_5zyW*Jcwmw7fhH=And|7WquTlCVy*WhaK`VyT4ekxe|8`_)y&;l0gV2Y5k)1tgN(=Sk~`!4o#+Ok(V`B>Gn2n+N84Ba5X2Z) z4rQ6eGJkEx0a;bS^LH7qBG+vD@j9@8U{$qR_OZ<#$Ksd3sEEd}N21i|id&vf?Zpgx{Y6kt(Mpj?*>feb7NvI#!gk5G>E^q5WE z!Eo038LDjpvlyRQu+cr|%~MAu2(tIMuCf^`4({=EnbYoYey1Wut){c*mKMN-@PBv8 zuyQ^-$JW_dK2umlQ17pHzAy1gr(MqfNPh(|M2^fdHbRu;_`XvSI#1-y^zQOu?`L@Z zxAv(3@JdC$J*uKc!4d@m+qcvCOwMV?Ez;Wawjq!K1!unz%1LT1+K<`A_Q;r>4y(p_e&7}mfdzpI1XV3o3K|Op)*6_TBAq;gIy>l9hDb#_ z(<;8I1t3`O!ZkKG*x#Pc(=h&3d4DK33-Z42GlX19%u-v5n( zFzfv4Z6jK*IDd?X27n=p{8_97g6;8ZUFTPw7gc~P`0V-U05B+LuLObZSAPzxWF)Hy z*?HC50;5OyD*PTF04kHzby<`_~-e=A<#p$0Ke89?ikdd zH;b9u0z0>=o8tTE0H|c4fnA}hP}6>gcjTzf~O%IjBIb_IxHsrK+iR^2h)%ppl}1i2cq2 z0i9npbcMgsWw(WjE+|`t#@;_V06e0ML16VzG%Ew2YDbJNnq~0Dpd6`WSDA14H32Y2 zeZY&d1+hBqGk)3NiZoekU@bunlD}dG=t3FH8=4tB;*p)9P@NOh-+!G7z^WM1e%(KW z?1su-)pw&n$a*^C9c4Sq$jUicuw`?>KXcPlzXMc1dZ;~Y0{1kLV=5nFqAXNAqwfjX zw+JPpI@8`gvI0a?wl8y0Uu8E4oXETVUj;*^3)4g0+cVytA8T*_ol&g-ohkcDbV^|N zUB&60w&3})y?(#C(trAWoq()XtJls6_YPDH9%YnzhYrZHC&R2=@%zAzTL_zX?A>ek zHRqcV>55ZwG#swVP?2Zn+3F^7o`1gtRs^{_6Yd5YTiwHVAj|BXtv2faW4IQe?uje7 zV{R~+Gr2LleW@KoUkmN;m4R@DW(BH(c>Ui#y498B8-_oH>VM=N-N)^39JbhV6&au1 z)yDI+^ZmOwQ*g&z@QJ{wo`;!Hb$+H(MQ8jjaF>nLE$D>`dO`j3HvlJWd$-g1tc4(= zs&z-=c>XV@=&B&!)Hbl+t9yU-sm@rT_qgj;X0~{002ovPDHLkV1jO9 B(k=i1 diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_29.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_29.png index cf91009bf353e6640c865697cfb6ccc3c2f7a175..04bb206bc5a4d15f19a52457757be97d9066687f 100644 GIT binary patch delta 1013 zcmVt=?{vCI-8N{!WcVTHnwi-=MUra`w?9e-Bo*CX4|;ozkkBLPwEUs?*uJT#eYIN zlk+1E9E}5LOI#fo&e&K0*B%2|kK%X7i2+;%q_9!_mK6hd(8kjNuh`)(6A0JU&6g&i zWvmE5F|Fr4q9&xPW+3^(-@Gr_8Yz9b;z z@#?UNa2zmi2!EmZ(7F>ssf43c7SKX+`~E{dC`;J+dO(}Xj(eQ9mAaZxxe}$+7*dvg zcM}R7JNHtqZnG{hj~slxUF96rcqfaCPk&Qu+P%lr5=Z`?by&FMgjId}fu6|t5A-yh z5GrePAUQ3wM&&K5!ZS3(MkbB)U?n0`xhO5(AF+`SV}G1=pzP3ElROALIfub0SmXWR z2T88E^GB;zWmazzh93+`=yr!?GT0ZHv^4;JUEZ8|>Q8A-pKC5&S6=T17+!XzeRh-j zCd5BOr8dhM?Y3((YsQ~Q8egU3uw7K^)eWN-mUm&B|?R^FN?pQb31 z#1Qfz%1UJxst83U7=nXF&Z>PrPJqpU7DBpg*_N@&t?ZIGUJOE0_1KBtvXA2F*g9Xp@; z>4T$Mz#Cb*Tj`m#zCh{u_Wc#UaGI%egx=}9xJSE9tZSl~#<);GMd82#w?q69znefy zXj4#@^rAgpVrTvJn#-6Ml;?EgN@3m3FNafPDGK+AlE&9An=fjY6qv{?CbiJ_P{R_T3KsIP2O3g6_Vo=bFc!_3cLu3m8% zJ<^`BEYbW*$Fg_*ewhc~q-&t>-4^h))NWg~kqtr}a6l~D`pGZ5rWi60z8oNe`wCi$ zKAor5H6&No#6e8oax2#AfAZx2L(gxRa?w0Jzp=Vu!l;!55iC2Cb_)!d=hEC9paa{? j(>Dh;HynPpCJz4s*&dTzqa1S000000NkvXXu0mjfLm=*L delta 2093 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 delta 1594 zcmV-A2F3ZX2EPoD7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000H?NklHl0N)jA$pPQ@oc<>$AK<}_Ag>aR|qB z46f54?*#iexY{1&GUyfXD50V#S{-1}lkcrSq;;+Y=8G)@GYs8z0zAA{jd|{k8iJ>J zH0No!N_L#L+rAMbokGhkd&X!A?DT>wJz|tcI)3{`5Ed5K*~{bro&?S-*o={Mdf2Kl zoe=>_xPQ`%SXnn$X;A*U%E=0L@w`7mK-Qw~+K{GP0NF#_*{$0}`2dYS3hiowcJ^8}RV z-4x$#kldct5RmEHXAq&uDcd{W>j|>xPA)rTEq{4fHUzA4gcN&YM!Hw-1V*xJ>iQ$KcJ#!0x^!J$ptBcXDb&+~mgsRPCxO|fM)m1g<@Bx&1r=EP zi5^bN+nv>xXB5_xHww$uXB9|=vs(gK1=l*~knRImk5Z*M+UMvKwXQ^KwHLU$^BB=d zI)4OYGw}JI(xKmbX-d3#Xh}R}c<|;v-KbV-;!nc3g}4rz*AsYJwAH)-)A1^_vgXSA zyh3ZjL-Y7MC&xf0nah@M+I;J=u!m+O)O7bpx(pynXN>XxCt-B5_rzPCfUEtx5zQT> z`B|?~jqx4*h>Y?9hzE!$)l<{sja^-CWq-VY1h03 z-OA@qftKiK^WOm(W9UryIDXh1V1E)>q5Md7;SD`^fW~+3K0wSHR=q_8uOt=V=O2iW zl&@{ZQ!Qw*%%Z)M5m-r}1S@g&$~_DA@BuLZPv&pcz4$v%^Qbcsy$aDh2hY(AK}sa0 zbuC!(Weq^vSVj3>W8j$A)_NMOYQbBU&p8r2w7zKUotf)=S&Mi!7>W7#dw(f$d|7XR zuT`Se;dVHFR*-FOP67hCS9^^#~qUsD*~Ba|RkpaY&88v;UHO z$FP49gcqXBRZm>EN1%ek>wnx0uj^m!Ib9wg6Arp9JnJbYFJ2FZdFc!tliqyc!-8Mk za=63;aQ7<4LlIHBHQu8rOeYFypAxOhm8{6g{6!FEm~J4unJBX1z%qcY({8O{?f)v} zbL*WFlUi)8DF3R>YRbo9q7ysp-*edJ_b(5iZ3-)!`@ADG%WG* sBdB7cTlFgT$s#m8z*Awl|6lyYA7~`?^uTjJ2><{907*qoM6N<$g6^>kxc~qF diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_30.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_30.png index 08074849841151bf7e31c917e604a6f103c05bca..44eec1f2413119d52c7777c8210bf2ee829a0020 100644 GIT binary patch delta 977 zcmV;?11|jR58DTj7=Hl(0002`twPcO00W{)L_t(|oHfdOOjUIN!13?zcMkVl#KFyh zQQhHjR92>zJ(&o{l|5(OC5P-`;g-#n71`WqS)99^f7F`v7nCio_7Lu=xUg81GY*me zwAI++YAdm;&Bs9S;)DC(-t+5^*5~h!II+;%@Ttcw4xah9d4KK!ow?>rl`We1PgtkI z&$;kz3_z>%bRe5_umR4m1KEM%FV}4Wm;|J7P}8>E0&uHCS_jfKE(wYitg=q6uz{&mi;+U27e+DMuVKoAnwT{EPS;RkH^Ec_5c2S5 z(?Yl|ShGTC0e`epaiLV)RVoE&VY%zG-T*9*JAMbCRr1av_YI{c<0`*IDOEtq+OIA` znd{`A&PQL@1=hg9mxfi|RXv#$9s&Iot#9wgmKGm4v#eiu_mfa5 zhc6OKl20n%w(HY|W;n=%@#mF|h~&n5#>Bfh2YDAo*MEiOz0X?sAoRovv3?fp;xq(7 zlK<}5gx#)^kF^RT2!Txm8Yu6t_Fg9boK#{I+TP-*X$Be@w9q(^+&rQu9wKt4ouB!MC1L5>3f z6`|S!L&)Y-+S934ZLD*GluJ3Z%X7$57bD#Q;Yx=0s6xGQ&3Tj2jv-o2=^3cbOGj^W z#E1iFlVX{=ylSE{9MgiKAMqSH-9e_OEn-3tF@GYW^5x_Buzx71g~+WQQ8IZi!s7YX zY`}!d0ijQN5#ilvcqbNGV;JM5a%U^K4J9Y5{hR~k+sfn+RD3dHrh*-sM??;aeCv97FKX;&|Sn}%$9|Gm)fkwY^*4H|lJ`Y_L8nkU&w8INw zHBEy}dSuYHZIPZ?`bzd_{|Br7ANq&e)iZka+|h~dl6gA;!gzJ} z$s1I3x`97d<^g^2nVGk&-|CM%+};1^))@Q?3_6j3nB8s>00000NkvXXu0mjfd#LF> delta 2026 zcmV2*>2-743vZX|1WDFx++*^hLjO)6_|J!fqw)H-H zwdP!HV~o<=6&bn_S;OkXp2>DkmrI9Z4A{n=Jxr;Iu$gNVr+-L4P5y6zcI1WU&O{y} zMsUjG-w_E;V(medqZX(tqB|`n)qD{03OM%Rr`DJwBZRJOv^v>%eb_2woxDg{)y9;ulJv17wWA zGKLBPYyD3<8b(heC&5yPwf18Tv^q(JqXp!>_EasPuJ|ih<9CmS-OvhW*H6Km^D6=% z!DJgNBxJi6mQLi|-3ZW?0y0K*rxCEd{or$q0ehjr+J7i^J*~?q-ktlU9G?P|_fa~& zzS{k7vh?I0=~m%!O8Ivdf^7UJ7=cCpOC2^017O6<`)rs!nG)VXzQl<=RS`ABC)x;t z&i56iBID`A9T5PL&x+${U6e_coe^fv`SoRxr2tk7RI6*$zk5^NM?ooPgnV|&(I+Ex zQbPNQ_J55+o}wN|A)a!go@BM1EXXniDl|A&=36f`*JZ5y3JtFWgs2Mo|ogiwJSBj4s;z+1&dY- z^t*s+1n>~4xFZ`vrxHfKUZ+B0hKQ5in}J9E7~s2r2)SM4OChrbo?PDw_ZIOi3U~xs z&p(BH4JJz|0>}w1BN-!3aHMuXX-XSG)Z$+YezB>VmHs@uLvdD-WO)udMt`EQD2mB~vD5q6ek^&q5G5ZT1K&kHBPXIP7PU|+ z@+$V79Q`SIe<4f$82=*xn~V+YAfGAClSlW}1ZRuaDo&E0Il*{+J$Zh79gI!@IyCP< z&nsWv=LzinlFQrZU3s|E@bpm|J>QXs9s}8D0%PXC@Nu78t!l(wuR zD|3p-QTY4M!y`t}Nm{4ESQtdrzK3^{ACV_=qKT#t_;s*8SHHV@MOTSP=->Hl!J6yt zf{*D;8bahVfOVxm3rCA}hJLSjig;q=NNBzH|YvY(dMs`x8KY}C*gtSA;;Tfg_xrZ*ST$4d>MCq8uytdLz< zqiO_JN;;kQBQi$GXGQ&w2!Qg{Dev!srvO=NWXMNpWZk1@)_fI1v483fD>b6NXy32~ z@HT>k>_#MyWx+P>$sxz+NKh$4vof>OjrL;sVsm)chn!ejH7bbEeb>gN(xV0;m8C6R z_lZUTmV@OzyCV6b&^#d7Sy9W3-Me02W9&0EGYI`$3fzV0(T1(erhof)g>a-G_Npqwg6x;^{A^^{0ZTtw@~`Xq`L}^61hK^}i|*Q> zH6N103!QRK6amoM6{BYBq4}bQSs^!710btso6`!E&pN=Oi;grX+{-zT=X=JDa;Y2_ zxmxpNpo_i}*9TLkhwl)Q93M>=5kr)7N}05bmIosFWIsfLZhvRbQGXA2kp2<@A|W3k zo97~-9nH_$kpVIiDm4I_x9a(k{oX~oyqZ4=(}FR9BO9xZjmT$>%@{#ec~Xu@B*+-w zUDucY51L8sht2H^hDBvsvbHVQz=#iAd4Q{3~^O2;ooP?*{R?TftQBr?Nar0t^Rh4HL*G zeYV)BOFh{YrES2NaZ;c__N(CO&(dOK>SeK&ak{eL{sUwvr0+zG(6ncm6zVQ?zT z20%pzWSb6{G>!fMfU9X(yK{QeU0+JUUrJkAuRd|Bpoh0M+aUenEQLLPUpHj*n+7uT zQxZ06MN7!rCC-!7q9w_i&Zo%>2|`P-A+=)EQ#t zL6s69Qh(MRd)j(2b^S-L0AOh^%(y_??M=XVG0+`fI$5-;EdvjdC_M@Q+f%@OP`V?# z5TMk_KHyoGRXusU%!+&Sv0=a(P@TG4T;}cfjb0!LW7<|9y7}Y{+f|?nWc3IACz!~U zThL1Z(QKff959iu=Z0V@fTYp~rfQ`3)gXu&OMhuVbltuj0ELLXqLiU@mA#ETpld8Z zf1=e$mV#@!;bsaj;+lj>HT&(@P)!O%8$ zx$o+rHl*!{)e@cu8Bo`Bwi~wh)z(%&*H7_rb(GUmlDurJowvwe^KU!q_m;8=1)2Qm zg@5V2ml8H_Nl8RX#Sxd5jI2AR%`YzlD!RjqP+E6*FWfD%w^W(HOl4*qM_t|0T+4Jb z;}Ch|0hoP5`C6WV;xQ!`eNa8CM{G8$!YdFd0y@7CKr|_F@9=Qk_kA^gvfd>y8-M

    MXb9lD7=p=wys0X&$r{d=(UOPGr{{j8$k9|&;M<@UQ N002ovPDHLkV1jQg&G`TT delta 1919 zcmV-_2Y~ps2Z9ff7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000LxNkl>~XH`G2$a&w?QyA?*N}Nf;;C z74c6f!A^Uuz044g=1V)k43H5gNPn{uWX3HePrQdq=Y&-l_3#}|Ajdz2oeI!e3;Whu zsWo5T!_`iq(KkWII|z^YARygZ`_I&!|n3ADX^J@Wp{xGPeKTLYkpqvtZG z&v>ZBYDHkyvcl#a^JIzl94+ktOcYrat8|7L0#-SJ9BT)nwPn;OyH8e8joMv|F`YEM zVX}`Uae7Rv;va!@s5hknD@{q8cSDn|Ij}go zw{9!#oW%;_JKPsRi1=)d)dsJWUTxcH^84p*gKnqqXXcISvK6>luSAQ;Y^sigZ*+o; z+-L9Wd4D`)#_-zSQDtmBo2jl>Mq+k+RI5Z7k^3yzer&s5<3uWTqmA)MVddW%V<-8n zeT);Lb$L;hk@nSVMsq}Je2ql$hyqyhk2ZG|Mw|fk>p+|OCh|++3(hM`eupNFSy+aI zS!gAjx%Tm_VwPQdrrk;0BLqaUg0Q-&<+tNl4r8RSSsZALV5EOe+R69)nTxy?ft+$X@Cz zVVW>cp7n&fEjn`P`63{xj{102zaINE@jK^$d^PYyZ-U-%Ytyo%&dO-kajf>JRzZC< z*nfH@YJ;B7)Iw;z^0TP`vJp!XQ$XoCWR-4>7r{y^R$pfG8Jl-u2l*O^AD9BXh?N7P zqoXI$%=tMZ@m`8T)xC8x(erxqy&YC6w%XkCgLMYB5LNID`3$L{hbR1jl2(u~>;VG$)3V(3D z@3UyF;qL>yA$nKAOJm+C;UuyOJc~Yu`F#M(!`PG{C+PQgZ0rgZu=4v8(XZ83SNAJ` z>bj2_z%ni>0?|aHhFUhv_OtBW?W7ra4!yz&wBvW&9{C#xN@{dl4!N zIM4QuQI+%HDGs`>oZI?`;LU#_IgB<9Mb1n_Nn%ljj%@OrW!A2Y?cR}kH?qgX*2I4g zw;aJ+fJc7jyd4p1r5MJR%yT^-+a_|l-AXWvTGd|)wO;;skuKX>KR;brkAHwUTIzNg zbvfw-(fU^3#mg>(;ajN_3U}2&X*?%C%L;WM5(@CfRr({kVg*H##leR=oJW`N)CmLof*>`kq zJ>LlVvW=+#+Sq6?2AK`l#G|4`F9MAb&A|elZg#&<=<_iZJWIak1Rq}tMFZ`Gcj91` zXO$B$g|8mZD;TqT=ejc#8MuQK&wxN{90?NfBWPrd}bj}Iu%5Wtage(!q|24O1%i`&-F$z z{dPdkC+*7Gq}ydTPtMOML1fcu@_%Xo27069qIbiaN7o=;TX+|dDXbtd~ z0(f}}Ex7kN5&bfv(41NoEJv^+*L%)Je%5I`oOXht?*p8Qd_A{CUgQiCk=-+!DaRir zU#|1i_2U~snaFt}_v<+$*_ZA57~c4!q%-3%>pQIge*hQ*&Q-amlWzb3002ovPDHLk FV1k!Tv0?xK diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_32.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_32.png index c9c169f2eb4b33cc403c054bc170d3880343f82c..13bc7f178730b0986fb9cb042015acb9344ceda5 100644 GIT binary patch delta 923 zcmV;M17!T{4y6Z>7=Hl(0002`twPcO00V4EL_t(|oGr?4Xd87Lz~RsDcb7}M)-{fG z>)hB5`)1Nv##Cg&W^gZtv%|uARm4dZI)uKdFMJ`2y?}~Nl)adU6Gu?H)|{iYIw)*w zuFQAJ8ex&@q)9VpOaCqXvnEY?_w|LoeR!CfOO-xzoIa7PlYgF=Sy5BkF8zq=fO)?$ zmN}(q2=TmB7u0!3K5qi$tcwE?hpX=6`W(V-&+7v5u!2=nxu447D2-q^u!aVTTRblb z>Jn}S9S4l8(+;W=;^-Qx!k6A4FdzY#lqFtx)B)7Ubt9ZLF*k1z^|Zrs3?jd1d+6?7 zB2EWLRiqN?>wl;1ILh;&xCsi3LQ09uc_Qh1BH^#*JKx;2P)C|>y-P6$nDWUNb|9JC zP8EQR*3I9ql704G8eBPjES<~4VLceM&-hy1 zJ=q4*7f$N-u(tulW8P)Rxop$J(aaJmkvR1vK$z1{5P!`8rSDz_3TyA{Vb~1f@$t?@ zAjo{Eee$;W%fY};02Z1(YojK);(R**w$>}V{UA1MwZ;MCuuu8OoqN^w@Q*#Db19J} zZS;TDTWv1(o{z#DggV6X^YWE$as%Yy#%1s(zYZL*?*1mcV)dZ*^5m~nhR3t4T z)$K-2Yz*Jki-`z;WT-)ntAy?us{@dj5o6=fxPR#Eu|;5GYuU14`-swW{!WmFa#$aS z=&f4)=EY`EWtKKv*!p^%9-UqVAb-yA*(^5d>8V*Ckil{CG}-g)dZwjML{#A)RlN2p zXLZjjbAYnOz6MFCtNLjAcfb#75A{)bNOkLdznuUM#x~BlSVK2FJ<Ix7!Zlx@$_Z?n{ZwdQEs&8Pnr?ZY@c72430~;wU z$vT)90ULPgjFNs2%t9>`A>45R>%If#RLg&3_l4oM?j)$4kKA0IZK5)r!KwgehyWOJ xDN=QY!33xW9(-xCwc`8_07mME=em>dFBIE;lWx{MNaz3n002ovPDHLkV1hfs&8`3d delta 1897 zcmV-v2bTDy2kZ`z7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000LbNkl2?ULIt2$V8@|5sLjw7L?)$AXaTv^&#r&Xy1Yw19KHKE@cWwbpxYe?I2S8*IBnWn$ z_&b>3v_28XYwLvrUTw*e-KRW@ zU5s#2e{Fq)!hcajPdvw43aBy?66Fy_;3wx>f`IEg_e1Y{bFF6;dr7?quoUOds|-#J z_bq9G%I52=I3JlmWq9LK?*Sq~U7fhMkb({hG3na-gV zJ*6k>6l9H6RU1?Tm3yKfMGk3ee`)~95!{JV?y{UK$$zQFs`D%LdXn>7!|S=;S`)RA zl%xVH3a)BH+{FM-bH22mRD`xhQh+Cj0(H6;1Q8=-a^8t_5S@40`6$dHP;-3rfRz%nYf6Wa`{;!_P!rDS(L#musjNtcFxRAW zBhKfk2}wsNb~v9y3uKW25MdI$xz*LPC(C+{IDcJZEq?Eb;J%Q2(|dpK0xH@hDNjGi zXj!^{!XCI2tuBg=(dLaYelvh3YzNSwLN+_^dorcy_vqf!`3ZKD4w*EMg3Gw7Hh{Kg zsH}>@$CK|l-@5l?ctJq{eH|QW5vAONwr_O3D9{tB<-&i#@fNiDP7DBTuvA6!d30=~ zLx0fLl62E_LNIlwI$5>KQyg#Qa{k%6#~}s)?;jCimHo2EFesx$S?g}cd&PHkz0tez zU&Fi#(`y~Iv4~Py4x@Qn(h(_?B-TQTDL$tfnRa}2z1GMtg-S1W_`eCQRpc*A=Dmng zma`Bx${G%Nu|xNVj7PzPPh#LzXhD9_hksUEMDJPA$`{I>d{2J%J%zNchZCv6I`tK6 zY7D1-7ho-ljL-JTT19S+vEUU-=-d-EfyQ`MGQ}=HbEfB9Bv?+pB+=HCK1+3lRb5Ma zJGC#g)kdJrNihHw=oNxhRE;2dVre>|KYR1FZYOKYD58O3t?x1buLC3ntlD7(+JEWv zx(+_x0@XFr2}p7xEV={H6f(xpzYVNVJah7;&cc%E1)KLAc~5{s>ZJJfju{ZCN-{@LEVRtRY<;hkCwRvunGt=>Ge z2H;pp9lIduB;D&{jDZ+NTLh_+qkj(bf^mgL(I7ybxubPkh30&*4P2!?F1VuVe_Cs) zfg73@l6M1ferv|>19&F^eMgYRE<HewKX9cwAtkAc5&r~<<`HDVckiQb<^|2g?^PfV85+waleIq$Gs~dd>Gk@h%{iIfy z>xgu2?w3Jcp~opul6M-&3lMD{a;o?mJK4@FvU%$sVc#*v-`@wQcp*fUIN|(Vg`(Hq zo^rkf?c~!y@MxdzPyMxUz8DwG9W0IA9R!uKxvp06OV@vb^AWx0IDXJS{&Og@aVkt3 z^Q4x@gIDa%YxL!iSHxw3`hSS)BeDF?pNNqPBF+rfVqRPLL~xekh1a|%=^qJ*3L9wc z9%WlZ2Y&si0p@3~5ajos+5vc{!g^*oA6b{OM+A~>r%Y>{Crk3_M-4zHSwUbiz{w!U zG|qBF#(xf$4bfsx(oefy ze1fD1PY>FHccuX(5Rg-2wNnx+RI`C(JA_@mbgW(9{!XArjn-zZ^l%cq`qnCOtvc7n z^3U3pBVr5550(R^IT7dg-amgIK%%us-s2Sdq=K+D{rhoAZ~l1&ULjXyqlojz81H`} zL{c~lYd+Gp>;z3$^M7ahY}zAo@}tbK0xkVSo!@)^`yxnk$g1*I8%67jldw*=M6H>t zR&}pHtKzNuOAK%V{3PBDY6otY$kmb))rab}iNvGTy1bl6+$g=Kh&!zDmPB{II z0qA1fFsE@c2(*-EoqUfG5C-vdI^py;2G9(0M{d3g*<3ou^I~hZ1~~2f9|q8rSuto9 zch>_EnymqDWdKQ;72H)=BA9wvdyJg?2xEA73h)RNB900000NkvXXu0mjfhEa|{ diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_33.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_33.png index 0e939aa2d4e5885feb69215c7a2bef331e068041..6cb3f7c8bfd006649160864e0fdf75b9263ec0c8 100644 GIT binary patch delta 956 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 WO2lk<^{oH^00{s|MNUMnLSTYEj<5Ux diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_34.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_34.png index d0f3a5383d809824126230e478a9e2ad74da83ff..0b0d3e5b55171912c9398ccb60399c510ed46d8f 100644 GIT binary patch delta 937 zcmV;a16KTl53>i57=Hl(0002`twPcO00VkSL_t(|oGr?4NL_Utfbr+|z32Yfbn`Zp zT8TTc=%3rN(P$CPGkY;22N&{~tgSAi!C*xaEP@#xY3xmuz3Igor4;Hsr=hLAScu+Z zzNqNM?r1_Z(BqA*(3wY3u3qmwzh128<%frvdAIn5ZFg%uZGY!_|Gukc#4P@RYJ&y8 zE}uRk)I@lmn}sTm?f_<%qNS%@S8H8zb6fP|@;RE@o|gsf=|lxl4tmkHvygBj#4>=e z!DFk%avI{V8kP^SX(tYP(;&JbDK<5iyvq=lL1D12t-@X#2+}D)Fv?RTy(>TnAm+%O z2I6)b_sh%p34hZ^XMT*LNMDFd}vq~H#YH%pE8V_nT1gxl=hbn z52-S#e}9iy%Sy!paid%ZpH)`3ZJ2=gxK9jsL|wl}PtpV=l?*p%RqMkktVHWCZC99q10ECk!988I?&i{i0hMIIBG^wa~U%7tb z?w7GtdIH~(#hyfe`E9jRkwQ(X9^=eHm4#K7`hQqD+<389%k;}dXJdS@!UYp*uPS5S z-;Pd<_dMFVnkRW{i=6$so^T`J@I?o$s`c#BjS@{cy=Kcv*bk}D$933Tvw6Km7j=1Kwx(oca?`eL zWIrK=wEWb|U_wvZD0^`nNQdU_2lYTd7=>!bf%hwvFDBM(FlP1uG#k63W38w9!4NE< z39~eK|A;gMW;K+&O?wm!FbRnntnA%avLZpC6CX-J>Er$?&-4BRVfu|DAZ7|E00000 LNkvXXu0mjfd+Eu~ delta 1920 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 T9HSKC00000NkvXXu0mjfGHBM* delta 1935 zcmV;A2XOei2ayku7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000L=Nkl1(URjh2$WO)|6le!+-i;`4KxVZp1Q6|Ib%x*31}e69M^SSV~lYe$N2O12m0Rp zJA3tH&U<5wlI)5OJFucxq~koFc}CGVYm9z=9LG3w+x$-mdw*rI%jkC)e^vigM27c} zc7V(xj1%mN_$QcPhd$mJt{8qI?EovVHhqWD-^>JAWDFmT{pkGLh3w{J>gaX?DgQ2X z7~j(Qx-M!ivuBq9c2lQS5dKE`myl~|24Wd$)nTRcdu!d60$3x+3RTYgElyB196OI4 zH(5e6pgx21iGK)TARXbiI6nmlH@?ci@f2ALEY$L`Ic)Sl`$0 zb?%ms&aiSA(xKjz2Hpy<8#v_vG)YgiA}A_0c6k3P1An|VDtANL}|lreK}p7$=yr82LNSEjo|RwWh4IOK3#@C@*)d&B(LTf!Fy+ zr;+z|ppuHKko%#&4%P}q)xI99smgm^1#@V~QJ9n^b=?8I?v6FBbA}%UTZf5qxt=G- zT7N~Imt(ExJHW6&H(Oco9Js>?Ed8MaAP;0KZnU7cF|QTOB9jWVj#_Ut=1yvsI&{j^ z^35-Um?-t~)k;KLhTIW}RyX45a~DG~t#B1n#z)_fSN)QTS?!aT7PJCcdd=kdXbcOh z_0ne|$6D7e%yZT+7E+(jyy1DdzUNh}x_@$x3Px{}ojFlEa<#2PhM)I4Tigm5htRrz zJjK0*q79--x*7?Hg(6v~2$i1$SbNgh-(bONRjH@^*JB5Yp0LU5H1qlnc^6IH$J`fTcw>GA0Zmtc%P2EhP`%73lu z97UmLe8w0a1L*X^w5ri_Er(&KIqoe^z#9L$F8kX+mI*v~^q)CcOL?XaL59%=?qrU; z3O)u*9S468;1zZ3Vv<3!#_xpgO5}Y{m&_Sh5r-VlIwv-2J!B$(KL6?h7@GE~TDck2 z4rYztNvXP%m_TVu&RMM+vfV@ljDPVF8-A+AStdoSMm{ne>lkc=BL=iO7bFKowv@ZG zHeij9^f)WVmjW%CTZw#&HnWGwv~N?cS1VME|3onu86Uy?JwO!U*7F@XzjC0=cvSRS zwE~)po_82Oa=gsgNT0vH4D#ARRxqN^3@kQ@T2F5-vle=mZSA@vKcaTFt$%f&|9j1U z8t5rpHU6B-Y{D`+lE*kfG&f2O%o$a>0H%A%1gOT(zlUdyZ_#|G@jZE+Eu~i|Y9^=} zzltdGt@CFC_9q2cMrQ=>ihS#te(oVk1)1k}8{g7rLbt1oKHA3S&%*U$S};14UD4Pf zcLkP{yv6uT8#u@5K>z5Cd4E+u5;mW$7^#!a5xOe#jEor^sDNDsYa^`>V)?&*5P~LH z&$}XixA7TNjmysIIIF1bjC8T;yN@1#iV3TFUELhYVeGtYL^B4fRPl_g?D?QzMEbFv zht%nd0rUV}=|)9T6;WH|K}O)6IruKfV2p}W4_1r$#Q+|?>j|rcpMN&moS&uD>YP>R z^}PL8^om+snE(uU?U96?|q5U=?C)hrn(u zGX4spl;E+|>b~T4MK-d7XFxP3WBlVd{{B6H-jr6L1D)LiDvGkT!Ro%WAy(G#7%{re z_Zj0~*Jb}6U{_n#C4bjTN!k&lk@TypJ!1^i1B7tPUgT%w-+BG|?_le1OMl@mbjezE1Qv(^=G9{Y z4|f~?hXE{QSah*Kr$c#;P|e4(^QbZbv&JI~fRtemCOfCPRt3`$ZXytT0G+?hc?@Nbd_7U82eWPt*Ya03|sh VyTVD%PDHLkV1ldYu$=$^ diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_37.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_37.png index 4935b75a6f35f2c11093d8cee1a0e9991e2a1bf7..a28bd7bd9ca4a0c44063ab570542fabe30679034 100644 GIT binary patch delta 954 zcmV;r14aCp55xzM7=Hl(0002`twPcO00WCjL_t(|oGr?2XjOF_!13?@ch9|d)3x1V ziyqcGVwU)jO9<>m^STHvjaKcfQA}1adZEG!g+S$=Euj~Y`lc5ls)0G#&Tf`#vpkNi?LM7K2x3bTIQ zXlkoa6XCi}CoFf#1Tb+uy1vG7wAKa3tJL?)Q8eSO+X>p$i87*W^xu}%2?-}c(gqMV zxGYO^BL(s8M%stim>maQG>Ar|f}-Y_`w@gCP#7%fbZ)%`1gQ!@FiPK&bUy|{05Q+} z(Lmg42M zeUoNxhtU#sdv1_F6ioL5iIQZKqYE#l604qT0>CsLCVzS1r=0p_?!Xm@Ju)m=SlE4w z{lv55aIFCmpI~jM(yIoWUz=kEznE4-HG=#D+Gg67zrA zvsoaNwtq*rWI0^s_BYcvl!^u7MBWa&I8M220^;L5aH>7(-7v6wz7a?&`4IgQ#jt9d zU*l=LsH82(eI4~2|6Iw&8(*mgk#qaYdx7aS=R+UrYo$}$)7Vh+%*z36s!*9&Wo?J~ z!RiZ_^G{B1>kKHX>8@E^MfbL94eCE zIILytu?U?Q>{;=6Gt_>nWX7*2%m-{aordJEmBzmI!~C8k&D_%|s$2Wz+*CJJ2Y}Tv zpHf&SQxgHBU~($~cbK!XcmnzW(}>c>L-sz|wbR!@fmE0P-J=GiX^5yXZi8ef+@-ph z+JC6SMeSW5DG(00-&r!!&2JT$K%YJD^jowx>!Q|ICyx|p^z?$o7tMN6m-3S}1t;qj zW*nYx)>=nR94Qzr-k4>nFW(vjQlUAXO;le4<9%h@@LHMDE4tqWBex7-vvDu)CKfC( zCf22aM$CU-*wNJohG+=PDu_{ cy{ixY0|1|+!{000asU7T07*qoM6N<$g2(*XtN;K2 delta 1942 zcmV;H2Wj}k2bd3#7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000L{Nkl3?T+I(3`>i?|10PIjCVC!Qle}*NpS=Q$t1QUoBHy!d-poe^E{5@c)ec7&+Q-h zXXE$kHIg}=9mg>xd&Y(xSg|X!aqQ37qih@-Q%)q(yt(Y)&5mv z#78JQKt+k-1iK>sj!dw_o@ftOh#x3BzzW!+uOR)&nV^aa@!8n7ufJWWF3y&YZYQwv zuR;g;%;xhvrMb$Q!wj%Hb+U%=8`Hmq)#Wpgnvqr=);fQr>#`D{l3+VjJMUYZV3s&_ zo;q%137-M|9)Eo9h!6$V5x&I?AIQ0i_aBY02l=n1;&OA)w0%tgI{WMDma0#{n`@Z5{T{ z{k^Z<7SC$b32nvEUazkiwmo*I?AVL5rDDE4(6y^pR# zxL4|bIyQeL1N0tP}3_*x7{0m$I);{_SjjPn62R-f*A4D8tb#jj?KG+ z{LXbSSt~kxc1PTN&_e`Y?`JmErrvLLf*pk0#z+U~2HH;mfIyOsjsuff=HcHF>9ooZ4#w^A@ z`yUn7p7(eVorV3gsAKh=bF_igx;oSBS$}<&w3TBPlaB)9%D*2d4&iNoM}|j=vIU|} znng^cLs>)y>y%1^Yi*c`tgA9X6-Yn)G%#}p)mgeCA&R(cPBpuD(zDZ!ovYwVCr}#k zsSIERMno`~m5$#>FDoxzb~SpD-e?a{U-TrXr?4~wpj3{ID~RZh48WX`+1E{kFMkQ_ z)DV@ItD%yAo+tk_P|XApGV&F&q8QAk5y~P) zk(ZIGHlm2s%#Q3Gl981Kwohu*MyN#oc>hlikTpD3c-EYuhKk9&0<5khGHsuMG6s{6 zo?WqCg?v<|-m|r{S|Vo2zpAE2r+=MskD?bfq~o2JwF@fwXbtJNf+MBuh=exM8(IM} zT;0&9gdqEdE>FIni%uY3_SLmNBOlH=iG@mpM;*F1sUloel0w60)K`48RAj& zvo79851Xs#Vqj5=?q}p@^H5Xj^;QDZ>-qD~!z<(?gS_C5+NbEZHn4sqJ4$AA(YQ*P zT0wQ~mFE0B&%Y&rk**5tXnZQp)On=L9E2Tb?U<{;?1=gdKi_gnzZUM5q0Sejr!MkW z>z^H`WC8X46UkSOfn%Hx^nZ^hJ!*=WuLSW?}n`6=GC@M$Z9+c&OeIW!* zVDDKrm_cVcN9c%DFQX!}BRE*kHSACtKI8;%KL9lotP}2P^y~ufK-EDMTUm;pk)M&T z%7Pid4?t->$^cz;ze0fG@gC~2NR_d(_S;}oPB09JJD33wxy%VN!+$D^w1)a;*}~M+ zw+p@jMwqcJJNl}92ukq!)8+P9i8}W=Bmg?oxR_87L2Unqdfqt z!_1Hw`0|4Ev1b{sb^@>4UOlR%&C7}iL~|HHdun&nmz9JlTdg{F zCZkf?*t6_9?knV<=YPq+53s8%@A`WIB73Gc=x}W1+6m@#Rq|;D@Qdq2mrT@?*mu?u z?1uTDu4dNPXZCxC9##rwGQea1hY<>*TIlZ?Sm~?Upj@k%CAB33C?0!f^JQ(Y@KMiD zDHDDk>(Hafua=}M$Uo2X_s78&na4gUYcNN=!Z|xLz*VIG%6|Y>xi_Y=0e8cnGG^vy zutcKTZ^z8^09TWLo+tlL#8m6&D!OE?I)Vc02o`(VCCJO0jjXIafQ%3`w6Do*M3C0#cT$+ cqX+m86u~jeWDfxHjsO4v07*qoM6N<$f`fd{cK`qY diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_38.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_38.png index ccf5bdf09e3120f0db853fc2fbcb147a03915ee3..ec5731155475ce83f90d0cb602d5a8f9205e0d7a 100644 GIT binary patch delta 818 zcmV-21I_%C4ZQ}C7=Hl(0002`twPcO00RU`L_t(|oQ0B4Xk29!#ed)TzGQ|b<2<37 zritS-{x4_;G%z)R#8n3d#2TWDb}utt~(r+5&`wpxnl+ zVG~rWCY+#R71W*Cj#I<7|_Tr_qcWVBI-^#j_;^+UEmvv&xLj_s#kth{g9x4caYt@g5 z2yQ{{JQQKvN`IPg;kR}as1s3gz(cERm&2UwAmMxRU=561P+`tPLydiH9>$a; z&VZ0y|5c)05nC@4=0x;8$45;dFZX|?0JPB_yuPG+OBCXDr3~VNn)DNg{sKUc7{EF5 z)G01Dg6VSr&nO(z2$YS0-Qs5UJe;`i19jGn-zS4{ zZnf)XZ`!E^PxOC%5d+--8Y*({@(Ks2{0{wS9Co{dcp5&!<~vv0fnWXm`qE6-xBzw6 z9B_H0#XT~8J8ik0fPTsIYFf%bwsGlj^A~2-m<6C0N7&f{b#qK2A7G*^D{5@TN~te7 zp9TGci+?uCv2M%b6af~>^7C%;u9@NkI`j1&! zOau&i_ywTeIF`qh9oQHO+Afup zoX#ww`mUsEH~XHx1R!(y!1RA}k|!s<)uLQ|^V^{9t~xi-x>G$|{0AU7d1aOA0|^5P wc`E>;fz3?`Yf1_tB7qVy*kHBFk^(^SA0BH}skys2L;wH)07*qoM6N<$f?P$36951J delta 1679 zcmV;A25|Yk29pht7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000I>NklYK&e4!#R zT3AG@*cH`&m49+0A+|#K^t@FVR?Ao7tB)~;XPpR>64MrQlJcUtE{cqYAlF;8B8ERB z-?U7c@G!_y4#H#=bJG46pVcWQ$`i`ZPV$9n0PO~}9HlX|+QTzILTq$cGs_Dq-wNk4 zQ$S=$!GEU=Yd{R;>W+c$9nHa#Trw%flW#>$HO82GAAi8ASh+wXM8di!#Ofk5s(jCD z>3R=Rdl;D;AoLG9sW*an8G~%q>pAoC{JipSSrBG+>RnZ!veLlTb+BXuWXWHQks41XA z5VOz(S$~lSTa$|}EzO{g5#j6V0$0LY1VFLM^QCwjCbdCt^DRkMvO9n%1;;-x}yk%5a9 zlD%;44V+NAo?tTytSG_}I@&!f`NNRj`{|QmtP03PPWqj%*{z^MWGk)b1@SWyIuNhd zX5mQ1oNcwdhbY?f3Jbp}k4M0D9G(MMLX3oHYhP(?#879wb(Qj~@_i-Bo&`j_%QGT+ zY=7-sDC{fJXkcvKMb)p znVAW2ju$LTA*{k@cwJcWK+S=YIvi0S|2+zB+I20?F9Xd)EvVy>KcIOS_#(VuPP#G(SIXq z^x4R<3tppOEe-I0&j2a1tbILCL5x=G`L*u|c2IaG^0fA^3!nse8mNX8HtEMQIzAkt zo`)EyG#KKvwePzln?~F&U3IVwTf3p1Zwo+JAqd! zeP#%PMggg&iF&?wl%Vk@4UDpF911A{_TGQmKxy&HHjwT`Tf$jbU4j(>G=KiQh>?v1 z)*uR{fu;{D&7a-}pvS92KQ)9^^sNYhMuuo4up-oPKI3rQ04=_(R{w1dz?rH9LbK8c zv^1c7myQQ!A_3a+MvH3cdP~`21hAC9ItplEzcM9onrJsreOv*_NTWv3|MD1De%3g& zqQ?uN)_GoC^R?XDHDOdi%75$LeQ1=Mcl*{+guIGY0 zKAzEf!l1k$p6#8F)*KPX%PO7A;Zy_AlU#6=S#2E(?OIFeS(^M@m4D}0PN3BQ-t|`P zApJJW?-!!(Apwbq`fF;*%+6A8TQJ>~Ozoi*0p`}zM0MuchQU=$vWsDXL> z^7>(SAhkfGUa)Zb+dxG5Gm1xn-dvQID|oK}a_?2T2>o^Nl>)T97UhFp`&+y}f{J_k Z1M8XONu2@@_5c6?00>D%PDHLkV1lspE&2ce diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_39.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_39.png index d276c21233c76a9226e90ffb3065d2f9bfaa23af..dba19aeeb6dd9d9a42733537f65105266ca1e2cc 100644 GIT binary patch delta 887 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 i1s$$zUG!G)ApQXs1!yxhX~>5F0000v>NA delta 1613 zcmV-T2D16D2GR_W7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000IANkl5g#QfFfa8F$6monB`c>stcm;adX!IKB?>$A58*Nd>lg6UgpgeRJ5o zKRKZJ8VK-TDHS7RXy837oS@^JcVmhJ0PvBaDJr_&qT_V}%Gb-2^4S&BN&w3YDT^w) zYjA{VSx!J@@kaEg7$4xqCUA_=t~}15mXS24w0P`pd;oxRCULJqkK^8sW~HqRt_R1;1i7x(AWe@%IpADI%fo~r_h{0Di4t!EKf>3v1bmt>j+P4CNY0a_~crr79}($nB^sXsbCmN4T+Q~?)+OXmPm z6K7=wE-IxO9ckb+2dJtg`rcy}AIq7iz6+=}OV+IdujQUw3dm-FJ21;krzcHiQ)1=X zr~Mvr3V$o(+=X{33om~Zno&;ocob&<&v0p`G9x`jhUVR9`=iimEy8Q*K74iK=t|Em zxjdMWEoNn)jGo)x25NVE>8i!8mFP+|tn%}&HN6|zAUh=mMadNc;R8p!}D6Vm%`@D2$?{LwrIC*v=*?*CBygVbksElk0sAdI8C@Y;yJfn*3 zbc85BFFKrsmchtv?OMw^K=vTk{;YAO0gzWVdYkC(3$iyS4zq$m;@vh1zL>3!0!+s< zIO6#3FbKlv)brVO;Jb`}?YEk~$ZR3nK(2I{ZateBAo}7XB2aX%Mb|qN>X?3FzSf@3 zOn=uMWNH&=ZJznUWG3(cNn2xqYcj2CZx&W#O?i2p?kNLA1~eSA4u#V7(Q9YKDLt8> zLZ|b}?2Z1Y49D*t`E{xXRPh>(Y&P*aSCbJ=pM%2Xn(0TWF6DK=z7WE*P83M>`iO7@d3!Y0IhN0 zh;xebC{xQ4S(>YH$xQXcHHFkMxP25Wj1NFEfM$qniuE8e{pv(E`*Hi|AW5Q)vx08XxBY^Cs;wCHHMs1SVpc6nI3-+fIq46El04t`4b%h8<1=AtbLWa z2S+FC2tU-*vc|`a4RtE)@l}t#8`SV#J!$kRGE{Xc_5hCs%E7oMNE2Gxw?40`7Wls+d6rpxi$8QPgV z4R=>yu=WA){}VA0qg&3v3B?_HXGicF9)Gv8anuH+GiVtB zA2xz$MzI=WPL`^S8D#Y>z6;0-K|edo20&iXnKN;FG@ew>?o1< z67V|icka0c&t6VG?t3;9bbkjC+XGZ0G21&t4u_S=)xqmI?H4K$Nb5PS>r{R!ANQTg zYw?cgXL$zb&JY*6%7ms^uft+vTj$aupZh-J+)Fb+Btt}y@qErmT!!#Eh-7>z^I4G} z*+27B((9BA(48Tw&S)9`l8L74sQgmoTl-h*`zZrhhn<}vJfGE!phg+~T8o{VIMcg zTA!KnwGRHf&42gdr2E*dpK05srB9BT58%4@)~O8xD9v{a)m(s+?)Do;qlJP_DLZ%Y z8#s{b+$&krOF+OsvzLDodx%GEXY4EGM4R1_qP+`Kl^-qaN8Vl<910^&NX@5Y7ppgRD458VdcK{w--Gu_sXKXtmnEoGt zA&l;`0e?VCcM-_q=+7r(0&x5B4x-b_432`sV=0Czo50L6Muy zf5;(`ffnt33Q&3T=*R3q1~SG~0Mhy5DNy=Ic5M+Wdpn75u;jdaB2xNg^AVYriiq|+ z3q*sbKQ{(K^`P}NE^@&Uz?0*4-%+BKLRVOp!Wp;+8U+Q>!>>YQWeyP zloVAU^$fP%6ZQ|0N1QK}_SidvD^L`2G+A|fLH11F(>ebs}rkN^Mx M07*qoM6N<$f;sQ2>Hq)$ delta 1721 zcmV;q21faT2fYoD7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000JWNkl36PvEO#sKA z?tE%vMG$1#H(>dX!-Y300zrz-Q=L!kTd~v21gmzo=3{UU9|1sxX9NP3H?F%g$3kW1 zXE~qR+1kH#jjoXx095cwAXsJLsl|$*GV`f?M0Bn=R+6ukUo!xxkjy}cEHX9v2|Stc zmBEc`#;xIvU4Nnlk3+D*lb)f>lNg{nOm3pUxHM>(Nh95eUdU9|3>^p9q8*d0D8+c#qvH z4(A#@&JOK;@4elcgQdpJYZx~nF0eeoP!$M6?o-aU=6^lQ9#$El^Q5|7?f;|Th=M3J zTML4+aZ#V>2`ZgG>r~BFNhjA=X?n#HzzN5DnGK_+L)s-|0Q-+w=WC9~XI#)r;6AI( z#q<76cVieJy1289AT5L^i?W%Z!ugVuBmIz+(G-$APXN9;c{933YHL0_@Pfy^C)C4Z$XWI5mJVi>7%LJ!O(lgWOa(Ju>q?GKz7#r;?xMmR>#fbAQ{hm3|K#sCOHA({j7d`6y zS)EcAdxHSSOLooJ>7i_C$0I#k38u0VutIwo*?|tlAk@l2rd`@jVTN&V?CN@56;w3q z{0cjeevyLd7|*T*183E)r-6EJPvfI?wtt$U=mJ#-jJ8$NfX!F7O;*!M$F6|Wb7?d} z>nZ+7IHkE6;4++ZrdIo-674v?QVMGRqT)z>xEgbhaNPWYJh%#IX15iaL)BnKg>D}u7f40xE zWK(#X+bIU{2;L2D%Zm1orcMGLB%yqd?QZ-m%ggBfFr?+MkJwP68VwPv)OA84Xoi)`;BGoZlK@fYv_0BK2(fPGW#v;La2% zuy@Ht3`m5}{hH$)UnXjF!aeL;cvTjDt z?jW%2&2AtOH#H`b`DplQS#BYkg^|FDoJ3l(kx4W3QhDqy0EPb2c>o8EIc65M>Oe{x z7u7q)URFkXw}jsat(SQUyMND7-u`6}Qqng%KiUUm_a`1&AIMz4S-m$pmJ0Z#ny*1B zYZY~0!%QHq>iug1hXI)J98TH7RAY9Iw8NKVWU=Y0-Wwli&OgbCXy2-ByUzx8;ciWD z_y&+AcENK1wZoaH)7s}}^-`;P&67av4|Y3W(w|{tcHrzhWb(rGZGT{E`<>sKZ(`Y9 zz4wrY>R#=SJoeMitmt)p7m$tWVDdCW9vRyEs{K1xcBOF{Yp60nwz4NN8wB3qw@ywY z`Xcu&d!l;ZejngzCa6XR6U^$JLF81D^UaLjx0ApMr|%A+$O+ku?A=GXt6=}@So-=~ zv!9|e2(mEqokT_evNC@p>KB}jsG3tI3(VNKs$cvoVZW07Phj^tt?2&`-_M@DfiX(a P00000NkvXXu0mjfo6k_& diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_41.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_41.png index 529f6cdd4554f19c211e1c06ee28370e31309452..f614ecd7dac4eda3bafc3a0ad262dc040a03eb67 100644 GIT binary patch delta 871 zcmV-t1DO2w4Dtq$7=Hl(0002`twPcO00TKmL_t(|oK28TXk29!hM(`7FEf)SHP=9~ zi#D0mwuoAdqENAPu0O3skSffLfhxw8i=YHWTd9~2TquaBm4ZK1QxHvaTZ5QVG{(6h z;6jmxmc&I2z0^XcX*#)WCds68XO4?$!Do5S%Xyo8AI3&A6Zb`xh*GEB-}DDN!w##`Z%O z#nFxzrvk0R>wk?w07tzim(H%*` zAX88Mv79lVpUppFn?af$THMkvGb*3xwV^swCt@K8@s1u&+& z^FtzsmVbSPYaan=bE@J1Wb)&o`&A9cc)UWGq0vsZvvvuz?^}S|KLHKtz<4|ZfIy=J z#XGhCU6}w9c0d`3Guk@2qjV8|CPOemM&%ZGKR#d_DG}jCJtbO517u?8~`u?0LB>L;W!Sk#^Q5| zF$NsR@p%V7Tlb>ZZe;C>TybqAecnC#4CQz_q_F@1Clw|+kbh!~@e!aoTblqMzq|9P zjU7QyX&=J#pM;a&=m-QYI(KzGwQt4FC=;yO2@qp&34a2B3a3*10H~14K$ux%YV;krbH{fE zH(xVp4KH3LdVh#Ggco?)GcI!{2I$`L(q_Q>nV^r3XhYYI z*X9w~sntL`FaDr95V$-#jxz;KA8+0Hbgq295&aY$fxwyPPXO?NcLYL4UKP4_e8lb* zhf9T?WQXGY18pws!5Q!AJw3$X@}25I*y3r0(a77P{O^+(qEmg6m_&(6bI^CwIzuh9HG=m(U0iSHtOi2`?R(CT%%vNm<8dxy zjG-AL<$pL&2@21=qb*V-Z{8UMlKqmsnoXTWtt4M^Jbpgl-`@wQ!b~7|yM)V$GC~y9 z&i4Y^x?hcO5R7JPR?`BP)s+^ioNooQXa6cZyQF{!e;HI|)XI3N=)?-1-seu!s$s3L z>~Ov{C;GF3nP9?s{Ye3q5m8ECea{;2Et1CwU4OJc>wN3P!)1H#X>u$E_{h^zK$e=K zLEurjhS_nuIp0eW5jiupmByMMSx{UAMh&uz(qNrdBI9>(eq{b3#|2o@s{Zk_+X<`y zDqN+@=qW+dmvO!}m)Ut(&gZhIExeYguGw!1fJknW5M5x+@zV2I=SPFio5#$Yc@T8s zwtrIqUHk|%XL`C&50xX?Vg&&o&uz*gT31;?$mh3;RtE4YPz@^!EwKToSA0&#dGudJ z{Zaezv$YW_0^#hUm?xai^-Fn`JCEmBZog!o^?Y~mpt&N2&usK%onH-3>r!PMK?Nga zQCSN}^S&YlP=;zUMt28{RbX+((B8M6(|`^fS$wrX@BIji7y6f&o@ZBDDFn>3K?CwW4mC{vpA3$Y*nd=+CZIzlvcQRP_@qe4b z^3k7DK$a1H4IOivO{voRQFz5IBE*L^lIS0=)-mLb&VQN(&<23Hvw9~^iT?3w<@~ofpW|u! z`7!V*d&J)di0phyS5lyOJ@%&<}|1*eFf3!e+>jHY`@~ljN7_C>XT~_ZUIg|>u3d9|qKU)V_<2&=dgiI~4s`pa_ zq5)ct=L&apeijwqbMThBmw%JB?&>U7^`87eq{lyN>@Nk&ui*l)b3MgQPOP?V^{C3< zr@K)bk9bnA+X<|qsw!wj8@<0vx9=(aGkQbc1|ptbR7-zFZKBQD8t=XD!E2*Obg$?Q zGr-f%2Z%*>w6nLWyQ`JVPhr-$3V%#7Koz=!DN+qbWJGjmEU>C))@tso-ml*W_@!n~ zHV7&LKl|=XQ%bTkqxY*5_$$sw%yh@H^1Ec;1@TYER^sUZ>JEY`WLnY{0qFk8n78hJ vii(=RlU*h2Zv9JtG2~6?E;^sYivE89OIe(35^}#Y00000NkvXXu0mjf_PijU diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_42.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_42.png index 15168cd11124217a5092687483149426b63aebba..4bd13c36fd5830622c49f9aac68d60dd439dd247 100644 GIT binary patch delta 816 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 diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_43.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_43.png index 16196a7062fb707b4adc7a2199a42d9709024ab5..bc9c6dc21d82dd3ff737819cb76da43d596530be 100644 GIT binary patch delta 805 zcmV+=1KRwc3$O-|7=Hl(0002`twPcO00Q?(L_t(|oK=udXk1ko#eeta&b&m^CS;>R z$)73;wzWYJl?G;zrgoL4kXI`r>dHlNB^aSfUUegGM5IftV8J*~TLcwFVnzzOstuMz zFdgzxX~#5ap61^qZ{9mDGEd0ra?kzU^L^)-(&X0cx*0>Cqkm)X&5gU69*t*q409mh zn2B*~h2VNnfMnJO_2W`AFdyDEN+CqUrh%h8IaObW#Al;jOII8-J&$~__#$l~w}10Y zx2>)fI=>De_5CY73^wdwYMy$o3Q1Vm_ZrA`Qhxu>tFZ2Ggnxi%WV-&EIsvD+^Zmf{ zvsG)Oe>KV zDV-p8V?;z=DeB59lgSY93g>vDQ+=!QPu@(V@BDpkb?TG!=j) z0{V&VOAY`YSlc-nb(4+ABE3(b8a0IdYLLkC+Xxo~~HXQb8Cj^KAcwu`XOd|KTteD?0HJ1+da^2=Mm z&78RO;Mp?3w>fgE`=OeoY#dJkeHoW3D>X@4*MF)ebS6#>csI5%8 zmGGrEQIn)0p3EX{B`jLiB8*xc delta 1434 zcmV;L1!elM2A~U&7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000G2NklQac!jeO7GEoD5o@sG!_8hrotowDSuK*-vTtUH3Rtg)ybzi z_Hcqo{SYPoB;5Rs9*&@S=c?pW{aW<2W`b5d0c;su!iNJ;;Sr8N<>7U9?G*Hin--vbuE{~4mnSyQ~yGA~>mD_8XpQ48&@XYh!0DRyGN2rk(g*l4$%=JZDaVFUVD=-A-WFm z$V0n68bPI$SrV#!&J%^vpk(sbE0do)TIS?>PJeMvjx;Z{6gQK6M0B;^LcUesoEW~YV;#0$yx@WV`u1kUHaGWa`$Rbd>B-N9iks$P5+}(zei?-Bith@*HwXi z34h)fzcQ#$U;1p0;oszxf=KhLBj6QFX7e- zAOK&%vFoBp>7U=9X&XKJN6Q5GssVCN;4Mmabc9^xkC++#J?pfO450PQqZL`nSyqaE zYsPKq1X6s|0Ifaq-C)swbo7s0Pc;LaKz}|!Y?bXnuem%YHh`cEuro9#?qOTcEtR8G z+#;$nfJN{Qps9US@i!uCO7b=Rn=-%~Fr&I3y>;ends;F8Z4~Y35LD;Ujv)11M$E%; zYzEN!9cbHV`(~|Y^(g@0r&GAQGf=$YWaGij(>h+Qk$>8Py$v@dRq6n0k zZU8;~Q)rn%d-y=l)2nY0T;G#$0YI`uK0v-YruQ_bkP69}ko1-G^ulXbRDjgXD|Q08 zP;Xyg7vyxU%?RG+SX3a?&iio+;C}%-i+Ib&N zD6fP|1>zgX2dMj9e2S2qIfZ7fYwRh=tQN?sYj0I{gOW3dB6Wk*xQ>uBT>6f zxt@eH2j`?_-d~+S?G$hV`8D==qi#ir|2h`0ZzmmK9TGj!kBHFS^iQKsaD-Y!I?#+P oRQ#VoCy?KI+L^sZE%W~a-xIX4!qskl{Qv*}07*qoM6N<$g3-0ZwEzGB diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_44.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_44.png index 06fb2790559e9f8b7b8a762b37c3475e86b7b7f8..8e271e10a94cf914c0aa595657c61433d8ba50b8 100644 GIT binary patch delta 813 zcmV+|1JeAZ3%CZ57=Hl(0002`twPcO00RF>L_t(|oK=xeXk1kk#(($bPF|{MCxn6( zBr_>R!B$!YX{Ci3q={Xn5%OxpMRlPriYuWJs^nESA_#TSrCP9PoTmjrK`9|m3JQWY zSki^*kVlm^rb+WO|0bC??{kqnA$NDa`@7%y?m4D1wm!9DhJVmksQ<#$h@0%zNM?sH z`vdxw;Fb%)ji3O{DIZK3*D}4+;RAydLe!@OM|Es`b_JR~s~x7%W+=|By*d|>4Ri0X z_e;NxmJ6NV1<>;SYu!BAWe>H?voA%^3~P^^g*Den^`k$3g%y7_ybYd_DgHHn5>9dd zYVYakBi6?M?th3Pxac2W`aRq8q1CY7^Qv$!eE*XkZueS#;!?rEMgQR6Nm`z@o(X23 zTMsx>tDK~RtHi~uHrA}@<=5WeJV!cJT9W_#ofJ3=>^hn%&1#?3n^N)aCGX#w+&-@4aK-Lu_)F3p6mBv*ME#%C?`<@JN?pR1`PnK8EIkY zTxH%Q?LS*^#IR$iS;cm++kpVg*yRTo+&-|-K?H3tHb4nj$N(5yfQ@Ca0bKy*sSPM* zV57HF1z?E*XxLXA0PI@^$|MYOIFr=!Ue|oFr~R584jKTQm<2B3+}BNHfQcW0Djm+J z06;K#h<`>#7ruY6C8^c(spg@5#`*LCFuIvK!XI30NlIH4tx0Lg`DQam)#4y6+wk)U zz+3=hOh+{*?BmcDRS8^Z9v%R2Kt;lg)AGPxgcp zbxHbI>zQ=7$v56;U6PLROcryu$(&VPlHSp+){Nd00000NkvXXu0mjfi=dNt delta 1439 zcmV;Q1z`HP2Biy-7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000G7NklIRKyl0F+Xoh2uCt8(Z&V zlv3b0j?XjoYwa`Zbu^-OS*~?$IDM_ptTtjD_W_MDB%`m);2JM{8o10>H*6*?SFYmpPB(UVVPM$lQnZstQbjt zi-gwm9{VLZ5(laSXb)DUR^udDQQ28eLF5+MO3e1*0tOHn$%5VfphP6hp zjMYF3(M^0ATJBt`~Qc@3E7j zhcC`n^ACi0;9ZPaj)IA`lCRl1oBUo~1)Tv@3~>N}d8GEhLVjzD98Lal9G`zJn<7Ye zfK{Wv0+TFd06g|iTd6aSs2iFugCf`=`YWvIe^%W_jjF}1*cX81H|61?*^^%uec-nvA#^bUk5>2E5v=Dg_WFT_2?f(K7fz`T30M+ zg$3$?^*x1kY%i=^Zlo^b?7zI^dyY+az<;O{wjRt}(@+MW*HsoS0&UM9Ij@=L2%1BM zGC)h{F0eRoX8IplQ&CuX>Z$>Dj{FKwtDAut+a@Pp;;JhH;De$aoq@h}qo0k`JKO0b z{G0@OGr_Kq&O2t+HQb@w3_TR#E&v<7yE9vx39aCpabi-r6MsO7 z{3mS(6mN2BR~Jz6Wb)sJlS}{g%I*157x0HYaY|?V+MbWEf7lz%E&$*=!aeT*cIy&W zd@nE>CxD#(F{I2Oojv1zdi5=W+WRIP08lKE51?1a_@3kxTp@WUID0uez3|Q}D?lQ8 z*^@vj)O#+l3tBIMA{hZ^6YKblHGhlh{pkYe0B>u!GoCO9FTQ>=h^GFxknfEi4W8CG zbKRnPFG?t_gj)sT6UYbX|4rPiH10*O-U|!iBAvt2P6DMlc;-esqgGbQ3Z!1WC%s|m z^PfOE#pCtP>0B=WxqzJ6k zJu?wqC+$pv(?L0j=>0kgl)8X7kRO?!H|kad`=?{;_35MotV5zF`YSSQH~rD5H#kBR tnGSSE7Ha;@pf`};+wI)FMi@Q%{{vIeyRdlw|BV0u002ovPDHLkV1jL?yAuEa diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_45.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_45.png index 5a2221cb9282fccb2758f6d5f0d0d854d864d06f..026064c5a1a77229d0f0f028d297e6126da24210 100644 GIT binary patch delta 830 zcmV-E1Ht^b3&{qM7=Hl(0002`twPcO00R(7L_t(|oK=ubXk2v^#ee_*{AVW7+QcZR zMUsiuh1QxNh+3*MNK(3LQ^;#mgIG7ZC?MEH`Y&LM*`K2 zHCPkDRP(fAW1BRinWQh7dGENG8ENn8-gD1A_uOmpqpMTPW`7Wkp=~cuA9Rx)I+)l& z%qE|0ri`nk{ZoD#s#6{)hl@@3OmM{j=>YYc2uERbd~O-49xE-HpKwfe-0|AEeWU`; z|C}}Lwp2;4JLW^|c@rJb@wz7I+gO;h zj!LNv*A(v`VRpW7tpOW{ITpV>*?M5ZT4oB!=(w~zP|^Ge9-Xlu0JArOEsS8Hg%Y^Y z1!zma`Xm6{xduRFOHZ`}7(yUN**@ZG^1*JbP>%ubP9(+I$28yeb>>?))cY9#+vk7+ zE$*Xg1b@KsZy-u&cOGdOz@O}8)n&l*dSXd&=Mi0i^+%jXKLCPO5#NkAuoz2<-_ENl zMS1HD*9rT;7}HX~+jTUSRJ$)Pl|a^e5CHQEke6_QxnT!jZ)-Srn{PMuqzRmw>Da*~ z;k@>{0I&_f?)ji}DFOT8i!JekPsX?~vysMks6~5>@EgQVm0Jg&F8aVH&=7cdzn2g>3Idvms zRW~tRHM{(HlTlx9FE;u)V9xmezmfvR3}6hYLmHQ)@y3Jx1JK!R2VzXEo&W#<07*qo IM6N<$f>S}8*Z=?k delta 1458 zcmV;j1x@0DaBmN+gwi^I60D#sSjIeDRXlwC4MQaVV zZTmcfKWo>luhoe1WqC#2Nc)Yh(R)Z|w1>170AQ!YBm+{k)_*<(ddBVvz}H{h_>{*A zC&=UvF|wb8onNSMgr0X^)%cXZ89uFD*jr zk`52vC5~V*2!C(zdiOZZD`kM{h?jx^uScBTx|ZAI-~_TAp|?)DhnZtl?MEJ}BEBbw zB~r72d>;Hpwj*$QbREwWw0zt(@~Ny`Ud#Rz6^_6&&zA%6g=aWIgkBb^BHqIHjKQTw zPvS#+-&%u1GjOkQvoa7Hf$k=)VjF@Gu}R8G2AHv>q_WM&187Eh;V z^aPd0*NmExIie7I0BKS0T4uvI+E?=64DkLVYJAP`n$f-TXgas1fAJJRVP$I85u|9g z(#&!M&P%58d*w6AyH(Gl;Gw*2jjWEO7H^MWeb(9}TGnbbsv>{X^qzUb5e<*BwANaW z8L7sNHh)3l-nCh^FOpKTjBm+s+Vw0**{A0O8~l79APXZ$7)1t$H`2Whm1+E*(zSI} zFgrmj=0-AzMG29{apw6f<7@j$a%Yx;5nqxGhNpl`raVzU>z7&@u8RDK(^+J&KI73F z%Jnq}(g@6S=2qsiQzSJcrGH1`Q+YJH9w#_@i+>}jX}0cF)kkX3D;U4WpR|{BU0QFk zm&B(!3XZ_q2}{pawj&WIpwISroi#qC$890Kj~buyNclH^AtZvcI^GDZ#^=a3KBXI3 zHygku4&YVDS&l-DYc>9;L}oOrD`}LS0IBkz4XdLiiYrBbbblaZfh5aU4-kFz;wsK!;s5OD&mPZf=w^UQ z<6jAxUA6~Rds$Cxh?ETQL{!M;EvYjYHMfXR2Cxvm3oLz&Wu0fgYTbEeG*cPi?m#)t zmgVfysmYg;0q&d)JhP5WpyO3L;E49CGXRxg^^|YbzQ>I5S1WA>y@A)Nvakxflz-Me zk^h9FAjQ+<8DXbJl_r2a<3Ft&ycObS0dF_{o3g+zrGI>tYCgYDpZUZ6uuJJ5U$svM zpBVXX#PAdV@O|cgQ;K{#c7T5Rr|4w{EfcI7vP6OWKDD=zZ~(|%KY$+j+GhfMK5%t~ zO8oZLSm2d4D@Y>yijzQ2)H)tUqJJ8VD?u7$aXuqT^~jo~m*~DwMtO#_xTmQCasjK0KJ+_tOL- z1HIZ#@do4fu4#1mNlDX9Z@TKm?7lm{;W_8u-S~(n$PmQ=VEwnDBd_WH9{}tkREXU)MK+5N|TRRthub9nyMB`Q=CN=)P0m2znD{P6!_GQ<%0c z!w#Vg@CW_V(v0JySKrZnKYt~xa@g}W2a3w79Z97pC|ee84g(fw}P*Z*()9=GYdp`nBCv>U&B^M$JMb~KQsIP1LW8B$N%em`~Uy| M07*qoM6N<$f*_S;UKopdv#ry21|De7Z55qDZ$-3VITQ zqZ`A@;nPEMsju7MrJ^4coT_(~H_ zRPu*uxDp{DodI<#Q_())W!~aRGt)UG@5o<~6nzV9P36OMw{mv=t`yH9X;`BxntkT$ zWf+;a!1*{Fie?X96f_L!aC9+}UiC(Pt(!)2!7aITyMN;tZ`7&}*g=P$ zxSedXV1ov1DMbZT2f%7US}HbGPm-Lo;0R&pxi+i=76ic55~RCe%M22Ldu$zmwhi9s z0ze4lXxQT}17LPGdz>OqbS1^9msC$*O8)F7#y$q%U=1iR=)Q__09^hN+FdfvBLP6U zI>wqyf`8}ji6zA&XLK93o^c-I00@ReyaTVe97~En%`1}HdFL7WV+@?aJ90jj)QR&_ z0Qxsku#gv6-wy!H2OB-N>rn$>AMS%IbJ;@xt`EG-{p48ST1>lC}YSrzTQW_J2kHQV!7de&xQ(^1LLqwAPgtBQ7Ks z<|V1l-fqZZWcPML050gPr1v`ZrtO(d_C2nu=TRV=3>m-I`la3`#B?ClaNa;ayUO?b zugm)9Ho!huTLOaCHO*+pwqBPYU%+cMt}eS002ovPDHLkV1kgYhPeO$ delta 1440 zcmV;R1z-BE2Br&;7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000G8NklcPi0 z&Pakv`#P-naX9IX8Hpfe=c>WS_Kn!-Wr9&V0elS3;UfXC@QOsh^7{4Z%CRuB@~eW6 z?F9ILUZZm)CIA*Zk_gtaaMxr-FthTpe2S>AbgU#_TYk+1z(Oh$Au`F>=sR#{#m`J` zI%nJ*UbIWJ;C~4SZSbULROU(yFuUTpV(9lXN$(v?V{%ae)rlaDhXBtk}B6=qeu$L^7U zbB!KnhxU7G4K6LfQsd?|jB|)fEKf4bN`x-=uHajKXMfqlT1K#+SeM8EoH3QGpvj_i zdPh$%Gx%CiE0`k-wg=z_N%txnMoov53>BdLM>hCc;I*Jf{m|yzOaJUH0K;q4Xd=)+ zdOPPz2B5Z724C_mYrl7%E&9i{9Sx1nP)oE&u#EM}sz`zg+P8x5VS(9T1K)jVtu@IQ zZjG~)bbsNapYiSzJYy|6Rl&Cyj_RBRj(wygIN;y+0jl6h1a3@K^Ap`lRR&+0bZy)$ zxRanwwnnOKZ{VYqo@qGy=PH7)>F0u9xfED-aS37W0xFF1RtH8lkdZ)CSANvy>OLUC zF5Rz>gCI>nwlT|8{U|Y6nZHBurR25bMv~x?27hO=Q&a9Wta^>4475V@H} z9tDpm!HS*=KDHy11k?}C&e_4|?8qho7Z3LrLMoJLnB5)YNs9zuvvWr9sV?sK%A%c? z008%Gd7_8}-&!K?_OF_;rzAjj3pN`#z*-XE@lV)!9QN1msxWOExN7xNcW|2* zNPm*E+KE-Gzk_S=xV3dP>aPM#n#5Nk%F+rH@7N^rFAS^J*=-uqX}1o+njXi4zYx%QpVI{%I*tAFMR;|Bvs zCuWu*JJaGy)$c8&k&{4-j~*an~GvdfNOmagcI zt%L#Ih#9^`mef&r-y5VDz$17USV5?!{}I;of|D=VKg0lk$l;D8p!y_~Fu<;CfUEoN zgzh?L>$YTnJp-(Ay7!d+Yb5xqOkNh)?%jRK;^b&OQu%kUXI0?*z`lG-BAhs=+bI<=x z74mkR05bh!NX+oZ1bgEG;JbbRz4ATp1a{j}X>SH2j2HE{icK?m*^@vjH2O-I27dM3 z0%vbWW>O>mR?SUT?>m7%3Lm)h5qxy6=^UBIQN2Uo2Y3@^`1RC0MSt|Bz7YiQ zp6a)tv0%k^mmBYC2JvS`^oAKgGWzWpIT?(=dk9q(gAfB$D&8H|$!SDRHF+P4C2-+ib-E0000dAv=|A0oPcoFenk)j~jlpaiWG^rrsC1kKrj|R#L zHr9@KNT{2-*raANv-5bE88z?e;rBk@!}Ic)$@zX~+qBS^*nbwhP?}|G^UQL$mU?RzSQ^Cp zlFszE^c|LZJhq-lulb|vx8T6%ZqwCwQpZ$pW8;1?IDcdvf5kg+sQtvMgLK@2je0QL zO6QC*LruWyhO~L|&bx|0fTtDd&O%p`B%4E+?*V`f7$O4q@Sp(E+gYxz72stz0$>hP z%t;>2Bn@h>l7lk^ zu>R>n&3}~{&o2!mrGv>b!{m#mEuMs71YkZYLmxU~0PF)LxVqLj0pLpDk37Qv$DaBk z%0&qlKG*|f`lC-IQCaov-u`~u?$u#-RfO5TQ^QIScQPPL0{YiO`W?3w3W delta 1362 zcmV-Y1+Dsp2H6Ub7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000FGNklF z9LMp!roNYsSzkvZDwjoWN>`(Rb@d|${Br=VF$J$9NXDDh_ele$>* z&Qi*EQrxQ7jLaRM!T7CwJ#s!_d;s{-G4=Upu7DVT>P&;g2wGT}&G?l3BaNRK3Ph@B z-d`91qn8md8?*v=UhhQq%4b(!^1LklVMkCI0OJWpu#TIFQHh@?3AE~uyUxNsC$&N) zco~5^hx=@W+<%4kaW3HjH}4*OP`3MqfKiShC5qJ8PdmYA+P45F&{&62ec**zO1b6$ z*^Xez4=~L?8T+$WyjP!C9_n+JUXJ5{4|mcNtJ-!Nby;KjU9o@EiXSC+cGd8)tX|LH z8dXt_WpRd43a$OlWc<6BPhFK{B|tO0cw*#?Lf9Mfts9U_{>2+DWVe zJWSwmgny`lxc;KfkZpX+u?R*OzrO!uc1{h(t!(dpfTgXc-?q(6#zbT2i~82k?Mfg&amICx7Au71^{u+6k=22N>u8GZ`O`;W0kI zwQ9+T`J>}}3rV)2N#Lv-B2nXG^dx-T9zr(MkOTu5V8+!?jiot(MEx1r{tQqb3XNjc z)sLYu0B*M%&g@A=V&R>Nr4qdQ*}Cbp%jyS!|Mvm3n$%ibw&!+GPQ{MYU-7XdK-L6h zHGieF@=CFPXB+@fEHO}nH}Uhf&4x5zuI$^q<^y9 z8Qcxz-M|)+Tf*4zvsVk0yj&X#ymQS8r;%|lUkt%U%i0;_O35cd$=fTJm-Vvr5FPjD ziy_#M-u(fO05d?k3G|jE_fiJpIB3})XpgUqj5&DrMly949rv3AwkNbwkBa##8=s@k zk#S#=!-L*&zuykF8Xph5tMR#GQhz_VRF-s;#h|_8p6x;J9{=jbuh?M@QFJ{IuoJj> zNle(br#8sidneMh6dP!eHs(CzhMo$hgx(#I{2)r{mg^<`d&YG?6Q~XT7EpOoqzx Un)kq%;{X5v07*qoM6N<$fIwV+LDq zh*+o-q&DOfv?L~@b9)^I{qwtx#~@)zXrwu2=T98+?`q^h?0nUfW9UgJ*z6@9E&Yd8ZwbzB(?+ z^LB(8jm~2NQ-2?vlq!YMd1)nt`xzP9C6&GO`;s!2A2{rM1qZyXRp2L*@>^!Vm&(1v zl2jug;7T|d7V{YT=6GH8vUigtN$#AR?i9`e?_y-IF7qpOcz>#}Jr=+OD{yP?8qMd7%t&)R z%Mk;xnvwoFI;&=^O8_nTCe%j&_MRAEOM6q4z~yu-Jnx18W=k`phX*wx)smSwCGWR~ zk{Zuu`To|5zj#kF&oS2s=7TO-GjuL~Q_D{4DzT|1(T1+#D<3b7Kuj zjgLvnCw~(*9U6FH0qL}Cu^7>FO~zfF2Egp6MLwHCduFTzVDB(F&Kscc&6S2EtvNR~ z&gNfVw!1!$7zQ8bAlRet#SNW*TYl~9YPZD?;x6=tR->GA`o-h3mKXtNa)05E>R=dDyDW2bCX{c!MI?(ZrO z;qBD4Bn|7-&oi=fuIEP01Ds$ZOyKoLj(*KvpVhw0uD79icJ1E?-`dwcYF?;q{A)M2 z!#gex#KLylv%1C!%pOfhQvbs%Tx|r7)nJp6)Pl*>Em2W6n`m?Y0XBiFU_2Z&$N&HU M07*qoM6N<$g6zMRw*UYD delta 1523 zcmV5|(Z43<54|5tW@bjd1O-5ds-Z>HnK21%e3#cdA&xBvjI>jDeMaey|qJjb}M z3y$M>&ncg^d){krWaaW)%ieJOTFBs`2>@`wj{y|)Fa(c)vwta{qL(pnJm|eBA_j1B z3$>VD*Y#e64hyoNx>ar`{SFcKp?o`z|BpMLiss>e6)i*Se%umtqf2VCU1EBE*G z_)+WN_EB6PH2_M)i&{gFjKD*?74BAgHqv?b9*=!TC&>V^LS+nrGXO8WTJ-YxOy16} zHA3f4x&h@F$W`wVL2o-@|L=3^o^%`0f zR;`u4ihtrU%sxOh1EV<-@fuHL>1hlSk5!cq0RA6?vXC~fq*2T)Q#rlJS%8IVW$v!C;KP(Fa85mXE5%r6SmVPmsKK-Ylj zarak*`9@F;W>9{S11l|}d``wfX9sjMfLWA}<$v)S0iDOu+67%Bz|474GXgvYBU=~E zj4lQcRr)AH!5)sUp76h0=r1^XEof%%2l#xSo*D&yzB^u?!iU=o?e~KSMjHwj>MiW* z{Qy621zQDBH22N!{RK4N@2qGEFD(Z~6u;`Gap9kPzAH|x3I^~imKIgsId>S2*65Ms zS%1~QEu7j>i2J@Hp6dMoLIkj`03cph!>V$(f*1iZJ@ZwHKa3|H{V-AyfL=2jH@mUS zE?+C8A^^ZX`SA%#)=*Ug?67&e7;+YDAHW*{qQCgf2&)TP(6cAf$_O)j|8xSQkzi$b zYM9KX-q8!m@=Zkm+9F=r7<1FYp6It5@sS603Tui|O#z%`UKI?|q6omRTvwR}%5{NsT%=S!!6 z9pN$V9u6?F|8i=UCgps5-4Rw4kPKh)M(&RkQR#PlpF6QoS)+W-8h|d03iUK_dw(MB zN5o02z6+-1HBb-E!kk_;&&SVqjsyVwy8_f9FrtpZHPkfabNn(6S;n830ljiLU#b~) z1yurFZ>#E`o;)}wl$2eg1GW>0;XNft3oA5M0GCVgXX&{{C(4^TpA{X-oNOQCC3$kT zKOik;W+RZi+;h^goJQjpkwtSjE`KUSZc~TkMg(($(@Q?$)Xv8CnC{WLQ_5fDFSJAZ{>E&^H&4s z;RW;z?mY!rdD&Z3Y9|kAoTdEZIDY?bptrE&h^?-CT5wt8%4dAdLgGmcu7BL~@RJHf zZp=w1c=OCo$_J?PWbT1m$Pe7isd$ ZihtF{ZW6dV^CSQO002ovPDHLkV1oA~!VCZa diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_49.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_49.png index 0e6845ac244980c1d2fcea4abc84ef0b33b215d9..58993db8b09d36ac78b9eab00bc3d2edc3d79dbe 100644 GIT binary patch delta 986 zcmV<0110>s4&(=r7=Hl(0002`twPcO00XN@L_t(|oHdYtXq0sv$6w#)p2ywX=3Q&o zV2PW{RHiWn9Iq|>=BuYL|mWC*qBOs#lN5=#Ml=3)ncki%cr*WRUmD?V%<`o6(e{?J4M7a z>zq<)Nuey2-GA95l8Ce4=mawIfk_-B!L zu&G%@GFVvL{j0}`geOEqY`ud9m2MlZjb>NQ0hEGSqhCvF-^t0cY5+upoQFP%2U;XV zsiOg*DgD%s@wN95=@i}jhrdz2*u9mDaRA8TiCLcNNPnbe(h(WX05p1Czx#rFRyr2L z84ZZ#WS-s~l;d*u?BT2qcsChSo3@|$8#kZ<1SUWE@{NhY8P~J*#Tu}_X|S~-oK)G= zrJSS|g7;(o!F5$kaN`F{v{;k!*j8>KmKSvx^v0XqE5h~RDpI+Q%fFQk_-~GjoXOd2 zZj_Q^d4GDtk`~MBX2IIunhkj^vQ9g7$sJ3AwN%FL zOm1C_)iS>D@p%>f@tbos)4TwH^Q4KneP9vhhWpYil4*Y;Xq&#lL%OLP00}*OR+-uC zCN26+Cx8lN2gajE8ht9F@&gK-vbQg9OD*qc(to2$1ps8rGM6?#woiX%aqjfF4Vn1C zK7X%%WuPzsKz}-VD3!XVo8IN30MZ2o&(C@@jA}e>i-?npJo4Q!jJIm^L!*HIvE3`7I=ck zK7Q0U2jI+i>7suO>J+Y~x5|N<9n*$Fvu~6G`>&;nv~<_Ve?SAjSMrFkJpcdz07*qo IM6N<$g2+SjL;wH) delta 1848 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 delta 1620 zcmV-a2CMnB2H6ad7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000IHNklM6-GT5pd}Q9cpTmvj>q*l`@<+7$vE z_v=RJMS?r*`+s;!0i(c>9I6Rx$8gC?2ay!;$;u}h3}A)QxKJaZSfeMc9gRRs4;kgZ zViyqA-_crYNIuOn6UoJ%(j;TDi~!kdhmyTWS-B4q#h>Kp8Nf_vv^;WT$YNIdjIZ$` z0XGUX?C*>KXQdyp2-J{K3jb`pj~?1fPg-F(qkL(v)uu*cHB!c z0#1kXR^j1SRxW~{6hLHqZMH+$)h2oszvlTXr_CAI<51HO7wGtA8+)#y6RtzifUg&$N;>E$a4|85t^CjL<8`uYIO3KWhx3S z4M@mDDUX))%+4VX-#_x)lK~*gl=^p#*;%1P4wW$iX`c)tX$(0NqI|ETLh;lFdeb$J zq3Xg*3){2sj3t`_#$nnx@Iq*N^5W^%@twa zYJM(vSvip^&bi0$#ZFl&TG(JV@u$IwC8zaCv5x&w0y0{arw& zpp%L#iI(@C?_>4qR?8|O6Y{maHF}a0jelz+9Sg#Pv=53u24EF*(neNTli*dwnqrYc z4e{)X)T6;OTCI&nVMW(;r`6i;H-g4ZMxrxClI5YE7kG5gHB~@U07_%L=V4W9J-%t{ z->IJ!Fxp}vgQO~+X5iI6)^iTNzgZTBo2XU`Iz~Mu6KGYLTgVRu9wM2!Ir9XXfNrfHqf&)D5eUiU3}%a2vrl zv{^t0GV|CH0mjX(DHc+!5Y-G@UKNo6+RS9IDn&dxAN}`L(~K`{O-?Z|zy>s_{GHP{{c!oaqr+OcXN; zL}`BTQ&xLw^_7>`h*l}_7Qi&>Li-0?h|vet&Hu{&BM zjuo#D77#rbvEvRL$F9TUUY=i{53@Pel@POodO-VM<#sT$pMUB#&H+q`=-g;L&Htwt zCqz9ERRkdK>?9XwSu=7kpqFI{Q%&Ge>gZn#0Z{>KCIq4kX8(g%{BCG!Ih$QJQ(ApXcSjd)>A!4n8hE+sbxMY-GeGWiKIG}pi`7{vB!CoQ~gfcCYI#$6{ z7He`5`K68kQGZwiiqLwxmPirI?L?FbXvlm!iRifWR3;I5VI zO64+$dWpA;*&69$^UJua000n!*{zyOBx&!uM&ykGK!2k}_q)~pPO+xK8|47F5#QNt zr*FvD_eqQcU;(O*Iz+$(fCE6I;@G7l;fD-!v3+SAfXb|pr zxwAMy7&-F zOHcRC0YE|rq#ylG+lAc=TMLPZ{1RW=FxmI@-$N>j0DvUE`{|*~{$CD7)cJU70QyN@ zp7v!-SAY6tYHwEK#wjgra|Jm`UI&tjoU!-`aL@ z!FBv{C9{?qzCW{F#*q6pYfbmbe3p1U@!;LR3Y1f0f6niYI&=94pXbuI5hvLD)0@U; zqW;DHZx^j*d%yW!i!g;4fCwg}-F-F(QR00000NkvXXt^-0~ Ef^^jCN&o-= delta 2131 zcmV-Z2(0&$2-Fae7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000OENkl2?T*_p40DRU|0`!dw%k;f)R*nF!w4L5b!x^`u**V!yJAVQpW8k+rAF(SKm<}AP zq7ncPw$VuGd7eL;P+1>2S&e^#^R0a|c4nC%gKOW>wY=8>44@RdLL5ej%EGrfpV@y` z8JJ~&P6>Ep0CoT~jDT!l4cL(>E3h;3t$f7nUNdW7>i=F705Iv?35x04N=+g8<7<*ZCR8-`UJE(DFM-08|a_27+>SbeKDsV5jpx?RdmX(Ay@k z(}m8I2DaYo{#TcU6}11aIsd}TW1w=JdbCk%6|x1{Ljw65WWYPRxnu>P}Z)p@JZ))&WNF-cY6R_iaPM>Yo#oBkD4noKikMM ztZHVvdY>~dF%YX`iET=i4IH0o@Vd_b7qRSb0T-e=?#<8WtTu|DaDFx$cRb2g^)7D$ z88AETIIH0mnHT6wjzn2lQS+7FY5=Ty4F9?S7=MF1cP0Sr8jC0ps?KM!RBuvohBqJA zzBo+uGhMymSHf0eN4-3b?yKMxP=>OoR%@d1ihet$ zXn!Bqp}h*#XK^LhtNCnfM(@)*gbUqFWJY>)<^=`L_vX#6VKOp@yQ79r$%;SAmBlIwLgnYG9j2Qw2uV=j7w z$16z;+Zg~2#~Rr^1h&3|4&$&okM?9UewOi6FtCzhZNXrt*WdU18K0pzHtxw=$rP2W z&Xh6hWaZ#hj`zTlkFgs|$Yl(`;2qN4B_PVisy%joNK$ZdUFj#Ql zoKHa=h;0yO)`8?}92nEO0#;9@AMFcRC*Js3zAm z19+5jL3OAZV^=jzs*Y#%SW0K>K9ThvDt5dvz!H*4Y9Si!eDpCS7+ zmwFFi5oNwtFVz9sHEKK?;mRhDsXTO@@73MiKwo(06ut?xf~*2`hE>FVX9i~HsW}0l!MzI}?c2}kZv^4}Yz<|` zAfiUi>o=?&cKo{6%{0&X8M)D3b_aq=G7N@?>aH_gBnr2OgU<1~cz6ZG zt%({)53J;ku@?}P0AWq*Y=1A%K{jY2=O4%Mw**u(RT-5n7uG=R8@xbK&Q^NxiUDDNGEht~ zgNh8#p>_^CYc}VB3sl{$AYuZ0kM#|9PUL)5GNRzKws~~v!3!LZN!b~D43uFg&u3l_ z6@DK8H^T&G;4zD$XQX+xv5NDfvX((rp52?;1J3iDUTHkpTz`8mt#1T*!GVg9Vp%jQ zdbV@em?|e3dlfn?pvDz*p&kr^j7*D&v2i~o2IvL_(l~P%8l@;&Q5dUpl`^2OL!fOsDX$peC!#sbph@9@$*X6z`DL=Is3r11R~Z z!()I<@I^@w)%DDN(hQ)Ci#BP0&rlm0kvT+MqYigf4@?m0$Nfk9^B6>(vlldqVbwm= zzNY`5zzQwe`;jx$;du^G>%2qG+KHK(O^yr$sQXpM^7f(j^$Rfs$yII3c9j4C002ov JPDHLkV1iY+{}2EG diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_51.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_51.png index 38184aa75e307e689cff898bae3a09765ef43093..4d732c3926daf472ae4ed5a45313fb048db18f87 100644 GIT binary patch delta 1066 zcmV+_1l9Y}5wi%87=Hl(0002`twPcO00a6-L_t(|oCU!TOq6vT2jI`|ckgj0Aa^7u zr04KmhG5v2UrQ{EU2K0FJcxim4EBp0Srnw9&g$%Oc|wq z$q0nqB9OjwfNLyu$k`1TolY5pwGfcw=ot$DVG+}2_`(bp@3Spl1$r4KR+`to48@>F zqFqEGSvIuM^fdEXDSOF03DXtyhl)@mk44VG4FCe-Tj~gFNd&<%*-b>En5WyR)eok! zNUe*=E4TWHf`2-Yg{JMLL~hZti-_!i4*QN6q8j-PI}v$cA}PxAJCVDjv5APnP@!V{ zp-Yz?K_Vhe=tLO{9QWinBdZnyU<`PmRlKNG;3Qw2=P@pZY zE1^>~{!4p=1F!ROg- z>sKI%2j^AdN+Y}dXaXCdTEW@@bV{t*yg;4(oofs_%Q2t`*+#P=i7 zOyOYM(|^KyO~%4)BQdnu+KkKbJ8N{NIW-~Bza&Czx+Wy%KuXAFt8SGlJajz~HtB+7u zeAH+L+jo*}35X-PA@-}^Fx(I{u;)L#RqfC0Y=6Z2r4eH+qGl(n31aDRuFh|iMLYDg zC@ads?$UwmUSxa_w#`CPW^$a}UGDBJMNN;fE4uBKN6Cix$;i)_Wg)w#$H420RN(aT z(W!<};fE7_j;G&{0>jAFr13Lx!X{-fWYpihWtx>g2f=ff`S(+wtqI9_OR?V@zLJv^pr z;!Cbw_0ikf=EI7R2A7u6&&02W<{it|9$2(i_!fq5^P!JDcN4FC{;yq&6NazH7E(j* z5taz;PzCJho*yaV_t*b)>3-D(7il%Z0e|oAB!kqOHaS#doeS(j8&{V`KRDW-@nq{6 z59u=Rro*u@f8QQh@?u5pA&lkmEGnq7nKMW|LI*xcIk%IkDWbXlM6>f8`E0obC;d#x zxjWET{84qnbn+Qx$lM2U&@%;9S$T+vmYlI__xN58y;R#^yE?Y!U~4~gCp{! ka{s5TH9PzXJb=9a0cMu%7-lchxc~qF07*qoM6N<$g3Of)8~^|S literal 2258 zcmV;@2rc)CP)yrx@}qw{e!5KH$c($X zwqqT@0LpNxBw>WAE&R3QGylKU26h=>r3HL206TykMnE=*4%|^GC*;n`kNQz|V|Dia z=>OL>o?Ycx6-LFl7N2zvxw3m&zDf5EvvpXwtNV$GaSgdZz;(=?1BP$PH!2=!I^M_k zj&$?*w*3MNT?Lhc&V0a_eLDl7yw*-yK+~>uk`KJSUY+?+RaEl2D0hBBOOPSjc>MrZzTU40C#7I>$>Xi z0hprGKu|p@?!S8`xHI{GVIEL6x4sBE0R#mAW#cpmu>Gti-%0#8hgl}H{SE?vuA{3! zP|2~;Zg>SOqy1Hc$O zxjO)ed!kf8=q8`(QnN`X8QFT=`y*juo>{e9{z}+MxuaiR*Y%NL1}r?lmE_+oD+RDC zUuA$X@{df4T04hQRf9Vl;J&%H8j@W~&pwr)F8o>TU$Ohu86X;7*|)m4+ZL3LyN0?7 zaL&xJYB&8V_=G4&8LHKu>VC(5yyqS;`m3b-Sv=F*nL~E$KC?q$#+8HBzPUc5vkVlt zK3liDhv{$*_jC_;3Sn2C&H%IYbgrEkV>}pd_Q{3C#MXZ>03w(nI+LvOPxdZHxSvqMzR z?iK_>^a9de10nV4yc%@mZWSb-5;LodZT7&ofX5T>0iEpH;f+=iILV`(RYpWdKG|Y|U>8JCJ$ZZ4byK6$m<& zAN49W$QYTiA7y|p2$XU)6J+o25;Z$8;AT29e;E+s&n!8svz4;H(kA2#&~XwK#%l~Z zOF-t}j;Q3L?#fQ2U>68;J*#wl-${OCg!pp7g7Rj76(`X#d`$z{HIp4Cag*-~##8}; zwHG((7&qnv{h4-DQDyC6?xnvG)JeWVB|6uoD|Hy^{j|68%=M=Ng1Wa#`>Ox5_e@a# zj3df}Dd;4hF#v)9opHpSDeyiX3|8W4O1Obyp}vr__3dSQN$_Oiw5Iof$+4t8_N^ zWHW+O*(i=qJX`h*&*OoK&Wtf7Sz@LUHn5<>_+m4Jy1L1aS65iVS={QL(pmY@DZuDk z<^wB+2Qz|6aulNCDlsw9?4>|d%>-^d4iMsgOn$~DyG+wfKKje%G3DRK_W)TRTj~9{ zKHjgurI?h)V z27;<8vv#F`&f17W`>O++Vj~5{6&om+t7-Qc-!S9M5p}3hs^q#3GX{u0s9w#k(RP){ zPD{&ZUB!{Lq!S6pSeWhWy1c&|7&lIZE@+|?uC40ulwX;ixsLf#&o2RXNps5Sc=?lISz8bA42^NEP?WpqJ^3eou+MKinjuutTfb zLMN%+%5{^^{8Q{S6N2r9#ZnECDsDE5tO7yp%i{g`eSnT(1%hm_spz(96>49W@XY_X zo=J?O0us}Y`?Gl1ImTCJhs`3&=8qX*HTg_gb;aPEzRK1`LFRJW2h-63rPDSMT#i4g zl_NE#VAf&RHAJDm;qJ?j?Uq*Ltw)XzEDT(b1}#) zxy)atyVI7YzIg4Nk6IV)M*F*hcB4N_|4yJwYiNue!b~6oBJOeRu=mk#1j5b?po(XO g0lK~1l`O9R0h`z=xZ>{7K>z>%07*qoM6N<$f}HGIiU0rr diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_52.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_52.png index 1259a591a4b81d5bf1d12cf1d6dc739f94e88a16..b2a87c442134ee04a905f6251ad8060629a4fde4 100644 GIT binary patch delta 798 zcmV+(1L6G745FOzqT}X=dJWF%xutyZhbWIrrSdxflK~r+=cR2gD+xJ*2r$de-b| z_X2tPb8n8MJ4g-Cj%uV^&vFnX=@m z;r*YMY0kNax=EXJ_rLmuvGv*GUC`2GW*;}sRLjJu{^^8Kb*#?g7YPy7Ae;K+;-_~X zn&dl|uSH2Vb$`u$fAi7r&sgW!$47_1-OQ_I8f&a7@#%k5Rh3{^r>0b;^43fw zcRoWV2c)^8Ah&8Kfr^eObz6Xq}YoGxbnyEaX z*|D(G&Xsy<3&6{O6v24EJ{k&fqE|EBCaCI(C2~Tp>wf?~bGawvI(;(0b3u+oR2U?p z0IIrEc1RO}OfqT!yf#)Mpv{H>zR!}*nh<~*s(N)lc&QY*-BT`?z&qZo-h(j=un~lC zgDhFD2dL`H3kdsx!EVSAy1?xg_9hrcyH_zWBs?r-Z~#mVP8`9N5aI~nnyPM%u9Dg9V9mgnUsa=))T+lZHz#5!=T-Cd_Q^tW} z8B^UjYxm9vg_*z!;Sx6Z?LjkJON`Ib8AfyGihTWW@#5((M&e@;!1DUUE7>6_fwXTI zN!Wq64!^w>#HKKEE1rd;v}D4!(^3N3%afrm3x6jk$_*C?&fR$s9rl=(34hujdL0;V zPCoJN8(-?p0H2dEgg)`bZ`FVFs@dvJXeSp-X{@iGZ{G}nGYH}%eyhHeD8crcs1(x3 z^Od=mg2gBgpmXJh-CkJf<6Z9u^h)V!W6xjGH+yOxVgt}PHGd22e^1vMKpUdFYKZoJ c1s4GS0zwo-z;Py zk5SjJbkEZHynk<%dGHI_P9pfv#-E7l*E0U=_4;5CYV>*EVwpV$(8h9$t|CLgZTxq5 zSv)UCf#_MPFFD(u14tdRoIvy3Xoo#inWxj)A_*9p9D8&6OgprkmPGF7d@n$YX3GgI ztjzY?rb2-sti$+-v9#REVp46jPik|Xi(LTEl zzy%=V)qfdNz3wD4lHhtk#&WCOh(n?M*%^HR4j^@+vqKfxE1-?J8D#Yq4We`sI6w!m zI@Rr=8FV>G7wvcUg*#*?!-n1n(u8+p`BijG4YS6tpfVlqK z_y&DEGnC>{pEM<;Wmm2aW`IP#wX~YWS#>F%V}D?ts42jsFl&8aT3flg_N_kf_{(sRMM9Uq3kM%3Zdr2l*e)j3VK^+1*4Wwc&NRXb=g(jt0=Dh_Tck(6$-{>RNj`FZ z72{8Eou7fn(Vg%%Q>66)sUCOMs~Ml-Oh?T759^G5*S0Z1kW3_)JWLfP&D@8JYDT*`3@EAc`G0f~DMw#VG$POdVs1m)XwU#6` zNZxDhck@jo1m0Ttm6@QD)9lkg&k;1k(_KAjTH{4Fzs5I@=r!wTL28f7M9)!VH)k@a zwEgizk(vN0Pw=*Qt$D8J7(BwgBY$s$_k|C0TKyGFAO+XAFwC9+>V+msLM=&S4E_+Vh_QaVc1vhezm8qiL%h%V|9Nmm(J_pJjsTupqJOk&ACr z-h*DC5l_8Vilm4TDFUtX^PC^O$fn2H_ego`9AO>~%}FFytt4^?G(EaM5r5+~DvkU6 z?`Q(2C1R1puTrlQRt_W$dGmbM)$|+5DJ=betOIzBp+JpqMXuKltyg6Xlo_H-fF!$_ z=;yY|=waK)4@7iC7`=uFN136koL2q_phM>vIR>D0BYJ*#kx~JYz#);^RZc5E&sQE- zfIDwS&yNT_S01Lq1T+Fx)_M*#WeJ}E2sw3 z?v%sG0jx-oIzg{}!^35t%j*|<-#bU^Yx?bY?zfe|P6nt98yQ;5JV%rPymD6LN9!Z{ z%{uu914J9;<)w}x?L~1GGerCEMY2}ETfd0BF@7Cj|Ga*$sz+W<`a{rrUVE#KXUp&E zcb9&(&l>}vcmWZNl(`|}Nd2b%cQ7hA(e#aRtbS7raO3ab2fy_zXMr_xCjbBd07*qo IM6N<$f{Nx0rT_o{ diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_6.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_6.png index cd916c4040627d74ad485e83a77231607c884129..713e66f22a3c17457b43743e16f23f4bf10059a1 100644 GIT binary patch delta 791 zcmV+y1L*v>459{*7=Hl(0002`twPcO00QYrL_t(|oQ0E5Xk1kkhrfH@OD1V4FTpV? z3}y`IBHg5lG-`APv{KMTA(>{tMQ5d8K%;_)pz|V%V4>|IQK?{R7d1?j8O5E8z93i^ z+DsNfT+NgS!K9dp)yZW3yq}9V6^skN-TAoZz~TN5W&VvlP=DikIv{q<|Fry9>_|$3 zr--!u%ov-4eq)R=#^wlsvd8i0L0EQELN6YAWha_oKDL1QvBhk6=Cd{pJl{6eu6V#+ z03PbML08;C9e<*?*sBmA>D4*h;SJ~1kp}QK>ER9jQZ+P%i?I+$NgWoXo%Z^erz&|# zpl4%y) zlSv?10sD9dU^okS6~LBi0L(i+0|316c?sel)d9l<*tNA%0+Kzs+hTJ%x9Rh%T@0|j z4X}NG1|6T8%+*=9ISXWCH5fLq*bf8SpNG(FlpMy}+djw4Mv zh|}Tk-9#$%dx_iixo5iJX+jh1Q2Ja~^jN^5uqsLFND2eE$1X1c&<0u|oWQvuh-pK4 zU7HTa@JAbOLpDq-5SzhKud~vT8I+8LO_he^g zjIG0sSaAu88OZLgWTxWtXKwP8I+;wy6tnwwX=~`=ZwI*ZXaMe&`jf%()w#;g7Y1rm zfGH4W4}CD?9gFV4HyPMo@!osz+;&epjsjBvczyJnF8~O$(W2=jx3ST+>K{1B-$1Ns VnGkV@1yBG0002ovPDHLkV1h1Ue_;Rs delta 1586 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 M07*qoM6N<$g7E1sl>h($ diff --git a/assets/dolphin/external/L2_Secret_door_128x64/frame_8.png b/assets/dolphin/external/L2_Secret_door_128x64/frame_8.png index 3621243f71f10b63c819eca3ae8474717db41550..567ac58acba78c5e86ff50b97751006c00f106ea 100644 GIT binary patch delta 813 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 delta 1570 zcmV+-2Hp9x2B!>=7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000HqNklmmcYAT4Q4j_!vmpcN0+xJWY zqe}7!LpR0Oc>?HOSF`VnM@v`EnoQ@=dDY7O7f^?jPksv_j_VH2szLkNIAfTV2boONDcc4LVm3_@lpp>|1N=wl?LSdqk$@x)O z>!DeE)IJsVMSpC-<+!b2OG$KI7FEv8>N4tlOOF}$jZ_eS%0OwN7pYunkCvi$TNIjn zxH+O2wd&++bE@nc!FD(jB0<2%Nt<*PN=CGXw4o+mLt39;w)0yHz74b%mo~8yM(JNW z`PKXL>^IB4XDfK5nJ|wS6zi z0nocLD}S4#x?Nq-kXj9w1c220=ATEvWk`-ZjstS=s17rnAIU+g@D>1>zCDTxd6Ens z2sEqL0t9)(#y_Xes+sK$M%i1N_a)6yxmm+{fndq?+P)g&pgKk8&63j*?gU0qL9Z1p z&>jdQ*|=oz5nYgqq9UP;+H0vskc3Erra8Gk<9}=r$@o`0B%VAp5S9-B4bjsrjgP$P z%Tyb8po{^ujiYqRja-%KW?%2pAjrsqpr^bBvZ_c=G!`M&43J@Wud{QYlhzM;lHfS4|Yw$5vR=}UX572>7TC`l!##G3>8d_6GN(xuhzhk#vrcjI| zbSOryj0%i8N1Dg)YKak6#K`~}RnzBJM1ONMKal35dS;!kopzM+GuKuXP6j}KT8Jc4 z5sco^GeP$%*(Op_-`P0Yvrg}j6wlV#D}pm-G=D*_+^ZlmfTSpzrCSvK>4D%?F9-u_ z2P@Kgj*RzUGC*G_S`%|QnI_XJKoURed8Hnecu6Nestk27XOKJk(J^$UxDWsP1Cj~+jTB9fm z$zCHexPR0ffCF_BT2gkId}FHy0T12|E32;xZ0#By(Vzd^exKmfnX(Tz^?g$%P%N78@Nek6VAXHt+v zb>YsZ>t}wdeE^FItj$I+>zc3(i3Bnor!k1-R7s!gHLG1WmoUJr`z*=~$apT78_d&( zJD)S4#Z>%vjiD%;NYAv-B7gQm?UZ5w3W*IySV5YfWdzUp9=&>cdU{Lq=(^J9md#N= zX?jt>44`eA8;oy2IzisgYDUmNPrT-QL{Cre{+zF)=|gSJSz%w10o-TY#uc&4{HGi_#zH|6&qxb$*VN{0NM(x U$Y@R|VE_OC07*qoM6N<$g3w~^4gdfE diff --git a/assets/dolphin/external/L2_Soldering_128x64/frame_0.png b/assets/dolphin/external/L2_Soldering_128x64/frame_0.png index bd20ae84369ed42105e0a1a546d1f1d654f9be80..db687725927834ad03e883cd585787ec16a4b930 100644 GIT binary patch delta 726 zcmV;{0xA9S4dMlm7=Hl(0002`twPcO00OB=L_t(|oL!PXh#X}Y#(&>Cb32n9+1nV! z<)WD_?5|OjT(N^#Sc+N*79MCX5|k^{88v}mqlJZyc&(OJDFV)cBnm-95w198HXOPV zqO;l6o6XM7V==Qz@>Vau@8SLPe6It7lK;a9a<~WVe#*U}tABwcsc01*gC_G^;B&H- z4(q1If1p)__mwmV?*sKJ9r>+d6&qzFQK~rTfN}X0X}7A}Kfb{OUcb0IWR9 zT2SszVlduWDW;DHZ>7%Xa0O1?n17hvG_kTLyu6WN{$@_ha;=7a!vPG6K+}4tza>dB z@&XRsbI3X8oPTR%1DT*d%@YGRVga`9lZ&hkcN!2aNP+<-GrTr(h}?icWj z>)z3t?}$c`t^l5vy^HH4`ju!*^z|%K6=~>0%>eJ4Lw`mN95#C7ZGg?pHGcTqg*f!z zb8_w9c7QOPG<~1SNpyg8?p87b$N7;#*?}(#=wK-!&Ti#qhX$JPeq_RYNy&5Wkjeoz{fu;w zaRT=4hJTMb-+2sPpb38{ph}Uh&M?AGIiTpr5N(f?Jb{7aw|B z1)Nsqb@H>StmyPnJ^TvYeqe70Z2QQgcz-`53s1iM9GpSSPV~_y%an72rSpN!Qr~_1 zW5Ovob*G#H;)5Fl=3_dcR${b5&8xtHBYOy0JS?9>nVS2&*C@|87a|TQlOM*62E^Wnaa=|;hIJb5lLjv%f z3Y#Mrybmf>r3Pae3kAwVh)@T^Fet-Bl%5o8Q3I))3yNVe0wLTj6CyHPjN%9ej$8uH zp+#@NHH2cs9k-JUvRT%QLr_6Mfv5l#F_tU{!7vPh#gJGm$TGIQ!*F=Cl#n113RH$5aj{r9UTO9Hp4R3Y{m?VQ4s=$ zrWk2GQ(z5q_UL`e1Z6SiQ+kDkF@f)jj2k}^fP~aa3}UTTNMRC0s25A5LQ;$Bgs2vU zWl}=~sv{A>2wwkxiwAK*LC#6}&*Y3AapUM*exL%k`9LO$<``t*sN&Uu)^ju)uTD&k z zmbo)ErEuD_=X2({f`@UA<}=QaXCeF!}`d57tXdH@CDlD@XrBxiKTwiSKNk=i%ND@f$A$W4^ly+x?ys-SQM_RVp^Wgw9=T-rOu4dma9BXzI#owWsQQiM@$TV*RAc zz!!0vsxD;sv}W%qDOp#oytOHGKTWu7VhEHM=F!;`9t8IUA6b{` zeo@W*5i?kkmU^jVP~_iO)L!j5Be(qips4Cn_-A8!nf&0on>`v}pvJp-+5E}8y@2i| zwam44jZ59}*&#q?)44TnZL^zx@VM=8rT5i!KKLg34YqOH)nfrqOOUXB`tnlu)@k>* zx7(k4G|aB=b5ohJv>9J!+1(G#d2Q#H+-8r#*Yz7pn_QQ?iY|u^Ta{;yrtKuA{GGn# zc(TI1e_&dU>0sABL#d_zL9MyDe~^HHg?ICpu57&RogH%WP5O4}3y62U_tx8#p~>Cx aMLb~qz$CN(>RyZUFQkl1A`Zu7miz~5 z5M#PQ58@>v3L!a6>nTTx9t00Y`~yTp*@K}wqOd54M=#=D^^{`{g1w;e5`ySKkyU%b zpd%8UaVJjCPItc^x<^UsR6O-kU)B4S1G)wOhtbX94zT?ZcYlUH?@E%Ut->Q}GQR~r zo2_(MH$DCXts=Oqr9p5PsMqPpZx!n}R)kV+qTY6w75 zvvD{=80g(g<62K;Bc|1-TLn;T@!N;Ug z#yzlm7=JwEd;{o@Q!i#R*?cZ9?dU5mUtA&kkY)7SH(S`?8k{kB#7Qc87}zo|GB)L$ zYp(owqW62MZ%bOKv_u(v`}#NqsGLut?~?kKe$*QRFE8z@lS<|BJyb7sCtL9Reb1!4FCWD07*qo IM6N<$g1h8bb^rhX literal 1768 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 diff --git a/assets/dolphin/external/L2_Soldering_128x64/frame_2.png b/assets/dolphin/external/L2_Soldering_128x64/frame_2.png index 514241266b9dedb21dc9a4e5a72b77d7038a77c7..c0adab3468557f3b1315cdfa2922db8d0975ca81 100644 GIT binary patch delta 726 zcmV;{0xA9T4dMlm7=Hl(0002`twPcO00OB=L_t(|oL!PlXdHDI#((d-lieX{lhpXJ zq|zDCdp#(W_OOe1@F>-T=)r>CCHO%O%1l5Zc=G7YUiGB69s*89szNQ|L2`&XTY|2H z*jcl6C(Z0U9%ff*-_y(Q|M32w_rrir$^YSWa<~s{e!~5soqvubshBBR#7!2=K)~Wm z+N+xy|ACnze4wO5_yDNq=^&UX=CM*nQtqUAI!7b3l;w?Ujj?g;k(9e#p1(&GfS3E( z43wLrJ~;2s6-Q5Z-c2oFZw^l1JpL%V?P5NjaC;@ggY}#~(}fzYI|dLJ9Uav@-IXNC z$qU%C7m%5mS$`udc)qcsp3`>7X7l>9HNc~yQ%i>$151A1>j*?spD8%E`_vGEq^9rH z&WSWh#z5%j9SW-HD$rB?*mO2A4a+{jUmCfjvOIaXX=i#fa^QMA88%?;nHvsd)ZGGp zvE{$D5E#)Q(lwx^>FNhdB>I(TNc7b>QWdEeKut{Rn}0n928ItFe-B_ivt}Lv_n;pJ zTPB1ECC z!vm}buimm&UIi(H^}Y6^a2e+ep6Kc+L4`>l_Lp%WCIJKq;KPeth%@#fZM?qn^A~rD zu68tz%72x-`K1WQX{*n0xcFjT`RUhQb;O+esU}{0Lx$ib7TPbEsdBt;Qe^Om;e5rS;*E$EIikBXF zRuw!UTJ8L-Dlghyq_sDs!-uY30l&20qS`v#K2M?Z`KMqGeRiX-<6Cepo>~B`C%y0U zr+S(c$y*ZAx2b;L_)VHfZ%Rm#j&w(wNRiYSTd*!1n_Yo_0m>grH3Jx(>i_@%07*qo IM6N<$f@KqE@Bjb+ literal 1779 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 Y0nq;p%b?ZI6?y(bDn+WiRhnP<56?u6S^xk5 diff --git a/assets/dolphin/external/L2_Soldering_128x64/frame_4.png b/assets/dolphin/external/L2_Soldering_128x64/frame_4.png index ca696e4cf425d7108426461b313fc8619bad15d7..3249388656a2480257f945a9e52158edc1387bfd 100644 GIT binary patch delta 726 zcmV;{0xA9Y4dMlm7=Hl(0002`twPcO00OB=L_t(|oL!PXh#X}Y#(&>Cb34ObvUf55 zSuWxXXderOkQ6(Jg{4Fb(ZYcC5`vOKojFiAtWw&UQmnK~ao_~xRER+=g!=Woj zyjgGK&gEw3v6xvUd8?P-_watt`^N!6#s6Uh1v~(*e#(QPt$#q0RCWrFxXt_y_$+tQ zVbj+54|Iy~p^^sSL!eotBfnEDVzr8-!pMqjfhNvn^e^9NjZI^Vq{7_A#d}l(ShbgT zpt?Fq!1!RHID9U6FLOS-3vlw*(I@#G6N~YLo2xnIuNNfDmm0WfIDohebl41aPm&~~ zC}G#VjGS}Mxqntx@=|L>L!)Pqck}ww8(~oyG}2v7ffYMzO$4H?&m4?92@QlGsqK3$ zIF@GV6bS9CK}kJd1BPmzn0FJ?xJm&2(!?ZH)$yZkJM&wS0XO5>xCN)5-!>qp8I;J7K-w}->-2gnz*FIVy)vrWjqOYfs>PSN$8e+U}c7GW;aM{F3#D5to8c(&tD#t zgM%$iqkn3(Xn!fg=`}B5JYIgKsO{uij{P0-YaGRY{CEl*Y*TC*JmVx)eGF_~)H%y? z&b3#5I@J$-HTNVPtF}}*jIQiu0CVTJoBQs=*+zzQD@DzVXMR#srC;gY`psZ}QuFF# zFQ|s6h1V<2sJ5~@Bjb+07*qo IM6N<$g2we``Tzg` literal 1784 zcmbVNYfuwc6utp@h&+pJ5k;4v^3Wu^n?N2Ac_cxi1SkZFij>V}11TgMl8ppxEzog% z6;W`2Dq5;olqyB5Gq#kfbyN^Us-hw?>WE6UidBj@R_O-8_J`w-?(FWl=ic+3_t{;a zl(5jv#n%M@;3kigCeyTtexjW1>GvJyG6hYhQ8E>kLTage%tU}_4XGv|xgN_Rk_k*x zkk>{;0ARmTr&LiYMZ5?n^=!;0!?x;;G#Y@2NUIUUa|jAj6InWgm^s*dj0x#9VrE*X z0#+C$M7A!j&_tvZCMfa399*bjMlOINtRh;0o}e(us?Rl;MOHC$Os|Mu+qOAOXiS94 z5i?&qrBWn864FFKd^WM;aiTModjwC^3_E_H`6`qeAgUvB5l^D>`c&D`w;%Y?!0h+d>-v5}ahhOj=AhT@r1;1ei|WyA9a{X>UY{CLLWDELTe67Cm90;Rui4{pq1V)i2B}wK^G(u7~Ns;Dk(g>kkHUb5u z=?oe&-yCeK(d&?lQuLdZi{8k85t!qi-x#Z_}* zewbFk#W93Aj@SI({>B8T7QF~59vKrv9f3Qw4bp!bVF|Y2F5_f z@T;n8j~9bZhm4oAi*nXfe!T1H<#zF1A?Q6gdj3&h$wIJmGg{idopE*4@%S%JARIid zIA&kFyY3Q{K4;`bK(BMH;E28P(~^o}g}*BGmiO7=+3B90Py0B-CEg$%#wwOgM@C+B z`^n>G1q81y&MTQ@+*w+NWXfV!hd4Esw1fR_y>|_94c+>ajnSCVYxRBqPZn3U^>swe zg`RJ1D+mPrc`hm2ywmz6%W9C!N8ys-uPjyfy*e1K-&xuuf(5?yA;2dCgX~)M4SkU* zAg2y@k7Dewga5#5JA14B#6^d$Yc zaZ}g%TwdF^+07@Yiv?OYjdXZ;0%Ntz+wHSC$jD4bDY5z4;TNFsW~w%|GRjmQcsUfD z_-m8&qWo&&{TVBKqsm9RZhL?w*Qe`6^M0;NdS1M7?n7R4--Yt2IS1^ViX`bJ2aijD zEU<;WCD{5!MjGaRq-OmhFndG1IArvqA2+u*y~a6g*W|nlYaMoXu2SA^dap#FPYi)OujB+BxvxrJK&s0jBs()wW`W#o2EPUT=F*s z2DxKvKDzhNT36I+M4CE2Ls(0F!BTWl!|0208LE0FTS@I7&)0UY4 diff --git a/assets/dolphin/external/L2_Soldering_128x64/frame_5.png b/assets/dolphin/external/L2_Soldering_128x64/frame_5.png index aa7fc8ea0f4d658610ee89aaf2c68514807c758d..43cb2a283dc22f381873bd03fb40afd4aa2188c7 100644 GIT binary patch delta 733 zcmV<30wVqP4e14t7=Hl(0002`twPcO00OW{L_t(|oL!Q!iyUwF*w#Va z(?60VIr$K_?SEBdW@gsNhV?7WDC#*ahpcS;`ZE~d@vvQMw5Ks}!Y_CogV;9!Dsb*6 z)DVHBX78o;k?u_TV<7Si4nxW+0eY&Rs%DNUEfRpgG;&Eradf>|r@9+Eu-TogHQ@A% zw;jl+*N5<{b@sIo8u1|3Eg(>}bo~T<{YJb?{KGg_8Gox6LQR+8$881%h7Znt1aKy^ z#*dIgNTTqX$!34s0-|Wtyn8XHuPvnW5Bg&;E)5(C;F}?|@RSHxLYn@o@k$n?;3)(t z3+r(CP0j8jjIbWO^^*m88Kw}Ghpi{!3eGa#*9J9|nDj}~!GW#>2>O8UUgEhVWd~9j z;0Irkc7HRD!Ny_qw1p0^w37x2ySv9<%S%7`j^&e^WH*?0|M+BYhz0NTv6c!M*qQvjnIt3;}fG)L!-mMv$N5<+Jxx4Yj3T%D3AO zMkTL5@sbKyRu;7KvnqYqT0wR1JG6IdV-@`JPF6ti@n%NW{`PAyhlHE)=U-GQ=ew1K ze$B2{`LoY=C$N+psYbdJ==asFMNOo4B_v4)`dgYvvDBQ@f~~;RY!w~?iG@ZF`*O94 P00000NkvXXu0mjf$xdd} literal 1782 zcmbVNc~BE)6kiBOkkgS-Lo$$TNEQfqL8KzI zR7$PZskfHOQAf);qJpBWsMXPmc+sIKtyU{mm_h78HypNqIR4R{-F@Hp?fbp=d)I8G zEPa*toWMB%0C=Y)OXRdHrJr~vgMJS)x2Mr!AthB(Ye^kdgj)zetR>Y1m}10p2swdk zi}QPlSO8!Y8Wc)OnU*TlkVY=<(BayQW*Q9uv2ivtuE`}RP)+0*Od{4uXBP`JXhp2d zs5CguoJi;m$t4zIZArR9Qi6X~}^Qfj|JkD1@RMT7zRPHc_~ZW3q2}+e*oae`&l? z+o~uw6Of#+k_8qGT@qdRESOH;+Z{O+X*R+Pi-E2So+lwS1xCU|rAS09`U_WU&oMvNs>e)CJEysh%`|k#l(q{ zBry-6S5eW(EH=etrErsmnDuR-ea~Rww_=5f76PY8i-IKcW*b4KCn?gZC(R&=aS@Q6 zX)tNYBI`0ojiy7E5Eerrp-r-oMsO<0Lc<#f@NhLxhpN>aLcl{fT9g;f!PS_CgQ+o? zAFYeQG&mi=G+z6ElLyhHAV;VCr*meH=yr50UylO4c|A;oiJl+}Ju1n*I6;q@n=Dl! zrRC)0wWb>8J?z zWB6^TisIm1-oVMd=XZR2PTCPPG?$v|H=14}*Bz5DdF3SbRVlwt@iqOy-qUbxrCPmD z+RfO8O8fT@yE`9PKJErEvRuKfgBO?&3xXOByVSIGj@Z2cc)NXjIwL-(sfL+k9`)Yw zOR>-3uZ*&eb&;V#?&To>vU_oHbE?;kcA9%kl$1l|O zVC&G8lTVkGN<7&>L)boWLl(bJ76c!aj01Movk50xK={2xQf&a|Zpd&+&e4b1d{j#y ztg*%QkbkzaABgE+A^6Ps=+c6!3KS?CO8ndWVa}H5;a0`R75zJJ8s;~CViqrFx^zpq zSCuN?_<|N7e>wUnq^-wm!S&s2SHI*)-ax~$)`Q!W%8B)b;Kvqv9%1TDAYlYUatoZ@97tVeFK!6Q1FW@#Zk7ve9G2UhluD z?RNj1THoD0s)N5pID@?|A!)-{aCO2^@)>Tz@w4ugc7H7RwpgzVl~265=b_!5@X3YA(c$#7$(D cZg%zp_}|T2>vB(g)$u1vk)}(IC8+HG0C{VIwEzGB diff --git a/assets/dolphin/external/L2_Soldering_128x64/frame_6.png b/assets/dolphin/external/L2_Soldering_128x64/frame_6.png index 85d1e30c9bd90b8aa7ccdc2355c1c33e9d183356..29d09c423d5b6850c966e8ff59b0f2e93482a61e 100644 GIT binary patch delta 736 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 S(Df4l0000Gz6kW=T zh6aKaPzpXzK#6IBpd|+Qpg|F$A|j9qqK~FVgo-7)ZoF83`1nWn+}-#0^8I|@Kf7cx zt32KP-2njb6h{f=l(bS`n5z@@zvY@QrNo=0D1nS6)T9|R;6S*FP~f0gi>2Ul98+!D z(1x!70H=+bxCAmmx|*jXv~oOMw*hVqJ^#mS6FzI0WD5qphcUmGx98a+Js#mwYDEKXyAkj znZ~D029+R{fdaySgKRniDPb4}*<3oV!cYZMjVYIcD2yTugnHQ!!sek&9>N8u9vbD) zpi=YX!pJFi)Q(R}B}qMx!7!W6bTgAq7*ZGrm&;|qC<8?yN&_-((vg@2(isD%EeLU= z(xB0k8bSx!En*77MDl4=u#;J6^-}2z!#d+st*ELoESR2w&|!vFYfo)L+epgsf5UjG zwlQv#9%smLBVjTqsg|e%r@>VDUhT-PNJYb2W6)52!P13<(xk<8q*%zOQ8#pzM#Wpk zMK~;+&4g4i%7K&!3x~KU%7i%T5R|E4!3d1ArtQ28kBVTF&E*O?kxVv%hy)xqQzS$X zM8HLvTmc)I#)@@D64NR1Y2O;k_Y_v}N-R%cz%i0A#1TaL^dQJm36e0T5_%A2(h)E? zUZYbHX5-uT9!;h!#0{E_xGK^>Xu*jh^E59BfQ2boYE+?sa4rjhR46M1!W2v;#8fb0 zc8Hq8RAN*DlX%ttEgpjkieaCW|4h#G5jBqX>DFi~%Z<}Gej>oJ)o09>b2&0z9aVgjgSmu@A zcWiLCE(RX58y#d_=lsgu#fQRspeJnx2axShSQP?X4}ej<`wcm~c3?(D(V%Z~G5q2A z=I?Ds0k|!Tb-LbQU3(+3wE0Ln}2z3%u`o?zfxMi<~uzjFXj zd3I-TWx%JB0LLv)!=6g|mxn~;wI*7N+vN@K1$A%P^OsB%^$_~4*JNXj3L_4B`vcEe zNqx0hUJV-r8`Oy#{lF6EhErEPMjQt&WpF&}9Ck=ZFYlnik^mXdsR;8uJ!xw$^k*?KH3efTBNW@K%t54DWbQiJ1_Lki70sjMwzG3AC>O;TvWSdJh z>Dv)Nu3S?wURtyFU~7z9*rJv@Yoo5YAH55Yipa$h;P^txMKU&ay-2=o0dp+kalJ=! za@Qk%jVa+;_TDCcJOggqAN6{9{K95a!lPr6C6(6v<|U5N&v$#j|5P=*-9y@&Bjk=o zwgcngT|Nahfb<&fRKMj(op1otoQG8#uh%#OHx%wj2w{FJlOr<=b_lrh(XB@^oRlhd&Z90%jfop zQq=($N6wl$+KS`T#CwZI-yMOE@`^p)-bfQi2U`Wb= r6Z_659q(V>{>!>yFXv(7GoNJOS+GxZ<r diff --git a/assets/dolphin/external/L2_Soldering_128x64/frame_8.png b/assets/dolphin/external/L2_Soldering_128x64/frame_8.png index 12bed1b4a04012af0eeefb7566680314c52ba787..f74c6415ddba714419207e9c02436b75c026e2d3 100644 GIT binary patch delta 735 zcmV<50wDc{4(kPw7=Hl(0002`twPcO00Oc}L_t(|oL!Q?iyc)I$3OSX?3;1dyxlea zcx)syg?$=>At~M<7M2n%L<YmR%+;h(N9)LiqQ!NBR5lHnimVa^KQ=sO7v>iy5RCb|x z#DD{T0en`09x!YH3|4tq7V=*ig#QEW@;LSv8B48KkyIF2kuA~Gxs3ih*8)k>EVf80 z%$;4{M>T*|yZHiC7p4gqA1pKWpAFv2oX^e@9JzJyaemuGwE*Ge^&IoJ3KE)?7Ooo( zAT9&#w?qBCbbqWUVaL6MoO8~(F0JInt`!Z9orZctMP<-RcQgam?1Z%ui0*wF zFm5Nb5Q3y`?v3D3nx``$v=as;b+Z8s)jriM9Mhyq0RGa{BvsYnvW<%DrB3OtqE00aEl8y7So8b68+!c0KA#FOwUV5H#7bI_Gn#m=`9IK(!TCWb19O###Y<_4xBp&{{k_qViS{Y Rm=XX0002ovPDHLkV1h|%XB+?k literal 1798 zcmbVNc~BE)6#qg7K~7OYyw`=Qs7ZFSfgBP<2?9b80U;J0-6R_lA=#K+NTePSM+CK1 zE2YR$#fm_+f_6k&5Adpj3KX>t3W&Cdj#zJn z;@27pUMxY8X(km@5{=I=m`UG<9oZBaHj>3A9a9%PRYt1P^n`(qkV#?Y3s&C zNI(cNjvC>MI4V>?aKwB*#t~@(_?S|Fpa>xtw(~wbCJ>-9kys{LhzU_NG(?Pwu~5D+ zKqwL|2*CXPhp`a`ipC8pV%WEi@jZkM`5;yjVj^&wG{uu->Tn~(Xi1u+w4@Q@V_X!P znW!_UNi*eVtI^w#WrRtWPN)}}NIf)|WQp!Q1O&KJpy4Z(96~HWIcmNjfP*VB6$evd zh%i7S!c;g458>7SH+ejU6wlTv|LL6JBc>f~%Xg!|Y~BqMVPGc6#EgpfrSJe|%tpjS z#fLI-U|^uMbzeI(lVc-f^W!adu6?{c`Xb^&y%{LmU6WKONN@RUGU6M|P7u1^y$-&) zdUNUPo*t#MfmL;xwOsgjdy_+5zebuF0%|sHx!eOfPd?3gv2rK5y3PrhGg}^ZT>w3` ztg2eJbq07fW5Crq%lGrmNK)^uZg;y;r`$ltzERrFlCeF%|)5`A3pJGLg%!;_KZHm#Ds7J^tAQ@2p+- zlk!sQ!K^WLvYup*E3ELK(pHjfHH782EU!5@rR6%;&g(1|-f(l)QlCdGm&5*#@zx-x zvPHmq!{|+(!Fd&?*OTlNR9*!O+0OwND39i}Qwd?N!PS4=u@?gCx^n?w-?0U-jZUWd$YBOt8eDM9PrrX-kxrt z>CatO%Bk|6wxha@T~*VuM0?utNknm+!5&(&u3;*-FSWTrmz(>`{S$J@_0=cn$ld;> z{gDKg1<(DtE3$9y@!Yx*XMEBXov>s~DVXH9?a*ES(%rtrr(-A*U+>(O=;rL_vE|c~ zL6_K706a#{yHCH9qXipe50-D8_EVEGSLamYlHlR}d|Y<(fsLl8o}qiHr{U4<*`vWH zG3gE9qXQzM?pDDOXNyxFaPf&O?mz3*W8PG0Eid}D99cH9@MZN=yW|}$ty$8P#_tW$ zrHSx?GF)`edBdU%*ls$AvfuvIocxz=bsgnJc2J@>im^{pk8LkD?ug5|eU5jtyg6ZUKAm^%&~uj=y$Mt5Z--_FzS`fdovjgN zZ;m0R9$dGkpl`1GGEKp*FM?gzQQm2_MN|DQo-7!3-o*rMwzQY8;LZK=+PI01jinpQ xOY-T-lfO=XL_t(|oL!PniyQ?I#eY@Z^T&kD%!QPm^R|a$n?!)P1@Bp##IS)eLc7G&Ed7}szEvv90LJl?3 zalM>zk7yL#hekSdA0q05avC;@1N4hX%A6!i4yc(~Lhqe#mWRzp9!Z(ose^u00(fyd zg=q{F8?zXk4}d4n0z1!i-b*ax52&hr;KLRY!WNam<(D+|kS>6&!?BU5${G?zZxd z=3~`sYB`X$Zk(UPb?e<#%gshfy_P!!%BznKGtmteKYy#zJW?5H970X^X@xaY10$S1 z@jS3oVrruN58w;#`_Trfyh-@EjEOdpw9p)k6H|vGjA0YnctRH#bR%i3`7jL<@C3R! zvlvdks^&k!f&uXQPZngQC$L(Q0H;>P3QTk%GEFaOSNh~Tl@2iB*Z{!<@U0W9#|g(F zkpaB++kXXRW0jgmML%0^N$)@qv$b{T<*f80Z<$Vy;2e9Szpky|!z=8k=is+$3~Tf!0Jpt z6wmHxkx$;0kiPHh&yCH#7Sh`ilB6ANOA9HImM_(^A?%s0!~e3CRZe9F#;*VX002ov JPDHLkV1ifGU0nbG literal 1778 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�?vbazMY@}04#AnHVzaAb2BWSL{!54 zmQe~L1~Rk(Ktnq$5Qq08P$2FEFP{KSDE(yv6yoEd3AM+VBg_N!3En;?;bg*@a0?rJ zxF25K1FEeB(Fnsb3=jzv93+hB9}t8M(}ezI7t2`xCc~kSzeFg0n$W*NIhb2P^hsm_ zL{$j|!y^y~h^o30(p?3EQ&o3ID?(5R6bg<|fg_b+C=?cfWW11n9w@^h*~1fSZD90| zJH}2E>P?{pV&U-6&`_mNWhD~X3yxG*SBE1|a1;v0kbnhI11PvKSU`~U9}5PAAUxS8 zkm5rMfc&XtO@@Q zO&@T#6F7>wEgs4cLp>BmPZ^0ps_FjGH4O-&-~#Z3KfZk!zW>oR{GYm5eKG+@A(3rJ zB>z8!VC7Askb=BPfe@6k5(Xk~j>G!|{H7@UKBd2dHXx9FLI@s4WD*hbSDLXt{{;e? zfKgW`AaO9f8V&(Nt0FyM>Sz=OhV)d%s}pbtPrND$`j5WHf28m4N@Y+OVFdm`gT<&2 z)KySuJj_##fP|@H(2Qi_acG#QI!+b!n}bnNgTfgQ;lC^AKPu@DiBX=vm;bf~WAkrw z5ds(;MP{^)oW-F8M%y8*%xnx9^RHjOc6N5Qx3}5Z*%{llwKc}Lva+(VvBAvD%)-K= zqN1|9yE`>CwZFfwaVS+609X;G2D&z3Lko`J#9_pNkM9jXzx?%Uar&_g53eKGN|4Rh zO*OtYhGUV`j7=FxN7)fxQD+?f{!nP>+ZOO}Se@%piKatSp1)iX8DKBuqkH(S1av)7$w zIU~UZ`rsBst`~;1RntRp_(#~O(E8$a@Jl^n%5fk79wVsdHp$EB79z37ast@wE8ckh zTEQ1cUdfiz0vE9s2b8*ftpsWd+i6${NJ}SmC6&ozkWb$@jkn-nX*7?#vD@ce320vb zl8)E`;SZ3bU7$}2z*BeHfZ{26JjaWdx8%ngqt`)+!ws$ua?*NZvHmZY!ha%f5MOf^@#XrS6ovESv96cPu$5$Bs++0tQ`=+s5KVMGT+9=wQpHpj!pMB6N|du`Z%mId*?o!ydZ zd2>QL?{U?HteCv~Y%I+}VXJjjB{skGNhFh7v^JB5U78Jtz!eZv4OA!7$z-~(htQqE zV;;{TbiY2q^lP|ypC!*h@eTb%7U)LLQezig+}Se5W>jWnrV%5$9BcZ9GJ%kL+|)BN z65NPQI*LLAu`S;h&S{=s_LpLdmfjrUjqa5NjKD3Q>n&cu!qGNuJcahrcdv(Xcc(CU zm@LUvX${#bycYmxWvj8zPPe^FAe4)7`paDSSc5Mjw*-9;k~x1g{f5q`OyLVbY_-Wx zawE}6M6+>c3?;o_=XkC3vvBz~vK)<8hYB55{9%`Q$h$GWl@Iiwuc^V8xg?)Xzt zwL<9m;Oma3iUXg4;=I%1MWY=Kl+TXgd#7_{8|=QU2ia|egg99WK^pSDZ%fAB)835cW6Efdbl#|l z){F3N{1K2VV!v{AfUmHOV_Ytu=B&sZS<3&y_N~BowN%mf_jl9ZKDFyld4KJ~tBK%~ zuI<%5UR`8$Dc!!X!HQ{FAom=_>*O7blZ1|UoC=_0zslKUQf&VtO;Da6;9|{6jEsf= z*CMozI0eyJ(H~(PZ7`B#d&cy&t3^}nSPt;n#I@5?%yPN$=TAxtn8zd+L3-E{aB7y3 z;~GspF1J=R7u*%NV0c$9<`Dx(uhHfnWT~ZjTmqOf@D>tbXY&J0<>N|@+HpE;=5e<_ z$F@i9d*?AX$U)fdiwSzWb9QCki>W)_P)GwAYAV>8tDOQ5rrj$S_LuV1x40zsK?g9<&j=>G$&h-8TX diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_1.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_1.png index 0b99a32ff9c04baa54b66b8e0504ec39ff75ace7..6b614c773b42ecd52ef989e429c8b62ac9915308 100644 GIT binary patch delta 814 zcmV+}1JV4hCAkKW7=Hl(0002`twPcO00RI?L_t(|oUM}0YaL}2hoAS%WHL=IapDI_ zAvGh2N@?j8ghouvNJX-eECoell^8b?iW{*uua-hx2x(T?SQ8XcbWz1cij=%D^%Dvg zDYlf-Oi1yzA>K?4G&g2uj*F(?AK-8IJe;#QhadcZ8BG66A%Bl+UcE~(NsWW5XCNd* z0Gn|g&Jaa_0L&N%6+-R^10Cn=vS%Ok0Ut2KON*~J#&&IdNpwTVGl)>c6wzI%!c0dJ&91>@A-AORP);jKKm-rpz@9CD1hh0*M_ z4BB3G7_-`4cz@?wo6(!W55fKmK#27|>6=LF*9bfE4j(+2I$h=C-wF1%-xMgEcVL#S zi@zdYY()?n7bLy3x-Rxu0H4^mMswPUcg}a9#s_bDM~v_M?%g}0BnD4Q_~7o!T*y1e z+cRtx5R^!MZh3E`w?eWrah1+JUh7$BMgX*!xYl^)uz$!CUEeRMs))DiKrAs_;kVg` z#7L=^R%dUXD2k2gy}DE?iJu&LIX)^Td-M;V#25E={przDA@n>usxHs*Y{ccMP&htx zh1j#Q+rA)&pQEIh3T$3va^C9+Uiz+eecpUCme%cQ@cquuf9mUXD=+SgNQ_ao%?a;9 zTD^Vbk$+A=$1=a;ve1|zhKYBTipRF`46vOM#rSdtRVd;}#CDgY5Was(a&)F)sqX4@*<6L=sz z&;(X77N0{7;cwD}>i}V-4&e=&@C$0e<{83gILjo95QN?^Ld|7pOku&THSrl*`j#?b sAt%Q3QwLj@8VlOga$;SJ-ShqWFBa!KHY7J5BLDyZ07*qoM6N<$f_lb%u>b%7 literal 4782 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 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_11.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_11.png index 8d54da6c61b0b1ba2b876bef8fe1d023ec958909..a90b2f6c00d38252189acabf2a5b9639aa36ee9d 100644 GIT binary patch delta 798 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 VFrQLE34ShsqrHn=g^k~-{{y`aaz_9F diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_12.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_12.png index 84046a46c8fd13e533bd2181f088fb726946fa98..69605e7a20c499d9677c1379947530ffbc116d4e 100644 GIT binary patch delta 731 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 diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_4.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_4.png old mode 100755 new mode 100644 index ff0b1fb289159caa83b6b6e1c32044a261999363..8ee956c4bdd53353efcd4eec0013d7ea346ae41f GIT binary patch delta 794 zcmV+#1LgdW45bE;7=Hl(0002`twPcO00QhuL_t(|oK=%iXj^p{#ee@VcS$C(je?NP zS?h}r?qP8-TZPdmC{rrk*g7XDtwUtWP(i1A*tk~(U#6%aW8fq~WRz{tA*heJTLm|K zNX0n|icQ%{D?TJ$+Vv*h+~Y$B*7I`Ua5!){93GXVD>bQoF@IQ)L|KwzNzD^Iz9jc# z9?-Rb_FJOFI;7KU{C!nYcc(P>pg&TT>~sa_z6cv0ukNdW_f#6N?V#boldk}=Bxylv zJza|>k@%9-lA;^$Ccfmk5FicSBM-O`jB$Vz*u4iC2crnkiEz(9Oc9Jq04%=^gQtQ5 zcpBIQY`hGXCw~X#J`RA~Vb~v$2GkA#$TSaa@t2QlUAf9p{r#ALdvZz>q&1gMYVceniqI1|_%!8r*vTH~{z; zhJJ)RJ$odz08P%8A?s2PNooU{d3`J(^N#z~mtt`G?%T!(ArS}5Qer^+3_D7|Zx_IM zK$s_c|4Z=87k~i`vdjg8{Bs^K43z*rrL+IG<3^nrLbUa^a9>?hIN)Re;57N%k^%?p z7?O-}GJmBn19zz(=End`GdaKd-c8`nXMKU`dP|`#1L-rqAmy)0<@dJ%slAesE=8zr zr4W))=ji)uR_e+d3xTTuxdo}E>}&w+k_TdFspuNQ#Pb#DORwTAs)=q&yV YvlEedk6GSlGynhq07*qoM6N<$f|6cyeE7QBK7zxzq<=MFa;06G=?;8fL>jHXjH?U5e zew{jN@-fD9?in2;&AS@cec$(q2Dh+FXKGALNPI0Bf49LY9)DEXq15R=2X^QT@MpA) z@$p^uAq0YCU*xpt51KLt;YwbUhX_jY6GB)QQQI@8lbrCChWE{&ANbBfa%Y%z!Sn1P@55Om00KGa7!*E2?|vcvu6z zsiYa`(3u*9Gd>s7$5^j!tJh)@phJmDSSO}(4b;H+WP6gs6G&hZpmRfKv8$xjz6od~ z;I1th)w-($__iLw3FYCCq2&lOa|6_pAe;nR*C%47j(<|3$H}G1UskWm^_T?kDsYMy zsDRbFmBw2hQQEJF39Jf(jx*SJDEug~qng`~_NpMvGUf>K^`&l(l^yjRO zwDk+Xe=4Tq@z|{K$9O7dw!(P*LI`ED^^*#Vj5n1^%-do z3|)wXgH#!)3FflV?EBJ~m9S2~<`E<>L9vR+R&~IQdsc2}2lFEt?kYLnq;j@Ii-69H zbZ^3)O($p|z!2(bs#qsTn!6HODeLiO+B~O`V2S`)w}Fi<((*g?F*$Ujcduc6fqT0)I$G%CcU|o-0mLha28af^-OoHcL2Huhq$x zY#K{7`7`KF5WB;H`@e=&u#l2KA_fI6=Ww|<8<%P6NS|rf)yR;bf*9#WP&6a=GFoby zc;}X$YqGepyOL9_I?$eH(MA9OpHZ`2v8s~N>y=g_LIQl9!4v_ol5T+uk{W9xq<>bi z)S9*4?SPjAvj`JFb4RAIV&i)^gG)X+Z=~sWVmPS4TNx<1LwqeM>M?G$@x7$0oUapB ziC7{75*}bEhp(l3)riXY*3*wcy>28ywlMuQkSen(fr`}roNhxuY20b2pF*mRX3N8p zZvoaR%Yv)_Bkx-GD?`XiNM27eet%^Dr&_^S&~!a2Wa^c3X&dI9XBRj9%zi(tQ*c^|gewCNFn=LEYogCi zTKhm{&J`*HyFZd(V@HgR-yiUJgOk1mcu>(Hd;+XlWJNWwGN)LXuy*tpXo#E20X)KX zBH9Fs%t@O~74Uegsx@(~?1;VGjiB8m0I<7{+wccQBUxy0-}O5F}VU* zE+vFk3eM-3S34fmV!$b9EY2O(veIxfJncDbM`Utco90_S3eI~eQmyzjSnFIzCefo+N7PZ3|Tq%X&-yC wDDeP4d@sBoh&WOl^Jn6IsDV@sNcaB%Tj%;%Zz#%R00000NkvXXt^-0~g8F^fI{*Lx diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_40.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_40.png old mode 100755 new mode 100644 index d413cf0ede7649a87df21726f796cabe144cc090..24de01dabc88b9eb9f4d5f925eeea0af2c259fb5 GIT binary patch delta 1018 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 Ef?OFE^8f$< diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_41.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_41.png old mode 100755 new mode 100644 index 2770772652d5d4af0f454ff21659edf08139f0ca..beac49ed878b9aba5eb00f9991b226e7d3427e16 GIT binary patch delta 778 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 diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_42.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_42.png old mode 100755 new mode 100644 index baf3c7c79d561f7be0ce0f6ea3c06befebe5d16e..2a095979a876227cca3cac0275c131651aee73b4 GIT binary patch delta 738 zcmV<80v-Lg3+@Gw7=Hl(0002`twPcO00Om1L_t(|oV}94Yg}a%#n1P>kqIG~=|U2$ zW`Y~V5u579O5g=tbR}5KP?uQ>3c9Nc@r@KLr6A&}8%bT+PKuL43u4uoSRtacQ;K3x zSgTtFGNq;|I$BY^D!>s;&R1$}+JN=gcXj2A0UUKzt2%7iSftX*b{t&EQz8k<6 zgD;!I1NC3|cA_iyhNy_&050NzJ5@h}s4uoLN62VWHV3h_>eY=rPh^9ZPUUOTu`F(+ zZY^LILO=sA4m+;6$O(u69U>-#byj!47lh7-oDh1rhJVV0xjXAS)}fbIt7_6rtJTYg zNIX*N4Fxo_XTR=_;{sC11p%#jR>^!)7+6X2pVJGummMn@$x`kC~%RCw(`aMHhz3b_u`9+H4UFm$JTd@`-pG2}taa-?0ZBC7?W|B0X$w0|GJ+ZIyrk2qB zH{FHp-g&j(e`k4a*QtM_pxc9qISqz&{qem&DZY8XuhM2(6Nz4qBx$sMdep1wKlK>< UfkyzU`~Uy|07*qoM6N<$f)>PVRsaA1 delta 1457 zcmV;i1y1_z1-A>37=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000GPNklFSk$t(a0^f;Mw{z}KsilikQjqNnH!Q^vtB)wFm*3<#8iNen_ zR=j1^?5@FcB-0!N-rW_p!*pWFq9Fh_Ntn`M6NGIouz!%sJH|>_NZ{Q;H01cYXCZ)Q zf*rFQvO9jTz~gkQ^SQA#!FCz}X2TmhoIn^#2d{Ir{kfHY$+!anED1Q>xu{F?KQ>yOEqiOjS*l6k2KU_GB!LL2Z< zeKD*`9e=sZrt6Wt?SJT?Awb4}89^L`l=4JiGGg#-@8FI$44xJLCI5f>oF`k-xy!Y| z`jlcLRrc;A22cs-d6(mnk&$};Vp~s^gRnl?D++UdR!ySY2Gb|Y`QtcNSt&amw*0v> zi5r}aHWd@J8dZCKN1X+?*I9AUj`-?20y5I0jDI|LCZcom_O*<$oB*x0=7}D^1UZ!7 zS(vfvyUID4<7g_3Kivua=IT6{8*|icy!OA3f2@#>II6vOylhamf&Qd2w(C0X01;)p zt0`LWfCkaX?Z}7;DD1GO)n=t6q=6oVd!G?jXOj~WoU<}bjL2OP54G0frQqzs3kGlT ziGPwmL*Hy-%_P8R!(;w&sHWh9#R4ArnQ7tpop%>p832DRq{t4iC2dJGS~P8?5KW&W zl|imPgI(POSnd3i&s&TPD}z9f?0$6}0V|!qW1F;sT6NSt4zq3BW%sL@04ob3rPzWz zOwhgp4t7@)MYRJ+%4eonS!eQTD-IT@PJ!z8 z0W7SIM%Ixt)3V)W2W}Q{^IT1k)ZYh~;e2hnW$nLn6;f5q9Z30ofQ-TlR;ZC=&aTPN z24=VA>2)W-2}PXsu|@<$Qsvb zTi6f2NOQ><(?CfOm#;@K%BB>(D}TIINlBJe$;4tV^hFj(fT;1gLA^yC?JAzJ+AS+j z(^krWu%MX=q^aXm>-_5okS2zK8qBjbN$seDk#>wx&+Hv$Rv=3`kXz+knvKb>wSJd^ zxvHF&S=3}^ZtIyr+lu3dI`+7f*;228-;p|C1i*;UJ4k{l0$IzQr^Wy)gMYsaQbW5# zy?$V7MzKsvQMf)M8M+eEA1$c#O-k=9S17AvtaHHcweq?7ct}L~5-#k^H&_rzO@c%O^`u+Q*&EV$sJS`RGa-w{$Q0Na+r+kd=20+Qp}i8%s5 zP(uESGj@Y>YAO2XDwfR5{VJbES)rN89Y~~!-ZfXPe6C$b#BTopZImhcbcVmO00000 LNkvXXu0mjfwQ0-a diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_43.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_43.png old mode 100755 new mode 100644 index b4cb1179f388fbf1cad5040e10a9dc10728725d4..32e35f4ba32ebd18457157b8ccc927683e1e8978 GIT binary patch delta 784 zcmV+r1MmEl44Vd!7=Hl(0002`twPcO00QDkL_t(|oUM~jXdHDE$3MT>Niv$PS%hE_ z$u4-X2;vIjp|$Mcg6p-x?rq@hAdvbZu^9Vtd~Yd6Rj02p%rf(vX(Tau(u>xXVg)TLOGG^NhUj%2m= zS|?p<`^UjLKu{ie>c!$1SSP$6UmbadU$9ufp7@NxDPZF%@5He91J=HuOWoKfIeoj? zTxxup8hv!_tABp^QZL(deS2uXU_`D9+^q$lzv&E?Ym63ATbI1SPa=toyP&#_zhzhCtJtty)Yha0%wZDW9HALWq{D_CKL5&284f8_C*71*qa(2-&Rv)4nyE-iV}D83um=H~qr?Fgt}2ogN=jl4 zJUR;s2cBYSD-+)@m24vVZ&@$B_6^&E!6T(x@LNJt-?Ti2QuflqDKZNYhKKhN4-RfEIZm8Cu~ zn*+X0Jb!OTN*AOpuOg8o-sbMGqFDOF^CT<9&yVGE02F9p#|Jje;>Cj)$VPXh#>MRc5taiE0m~G!;1r?V8NMs&j@qiXL&>7cCxAna7B-;Km1Y#+ z<|9D3Odn*Ta~h|9@%SVuw*d2TekHBu-OJ6ahyiA86v+D}B6tCtKav1mQ^deFnq|Azd+%3o%xd?bgvygB#ZcoR(K3px z9tU~k7~I0B_eY|weEO>*d}{4D2JpzEfNdJV;j;jat=7%eT9{+S&9@MfI}j0@P;#)m zZ9DG?2H0~Xg9lOcS(KrQH-p`Egfktq_4 zb6APTJ%7V;v=i_3NRRnS7~Y7A&GwLi^FrfE#d_h^I^Wn|!%hGxs2SUD26(see#Gr8 zGDHH&DCx#EYS@E7DtZKAo?s;tY+*SZX2z{oZa%dp?m6yD^^4eL|1=P9en^;sAQlzz{s3eHAiP65=6>tUqw$1ku zq}D&`IU-{<7g*^jJTk7@yb7GY6-=?O>WZL{m1QAg_MV)9D^IzEThc&CcdjzR82$f3 zHlu+{B`JKglU;rKVZ4;8coyKrOcIQFJbn-VWP{{Ly@2ZP`ooZ_&DRu-ekK9u!z+{0C95Bo1?&Wf#sH%*u1`dH z=^Baze3mgYNx*@dlOsVjb^>^FQt8?l;Wes-R1rhWPH!#n&UXbN_rDCnsGN8t%J`%8 zm7vM7>cySBYJfex@@MG-AS;316RTYT-mx4Bq(Bw-`6g5qkwBJfTt_3gbdVBmRew4Y zpiw$m33rD`*TP}43g%1q zy!VQUEOak+B;y3@c&RLX1tK;&eIH=<9hxa(MCZ$Higo<#sGZVdBza_B^=si#;JY}x zfmvYV%{ryr{XWwxWNc*qMo^R>vwsU29%MX0bZj*JtJZ^q`_IFF1<|W0I+yhdnW+Z_ z)dN&2Zk2;u_tM8B@7?|%LNtM6|2re$5mY^cN~5@E zW1mP`=*MEF31tx<}mJ1xr!NBa5=YNP}f%v6R z5Q1B-U*vRgbK!B;YGRf=QKM38$7|Buf3()Y>B${fc-9*8-@>CV%RA1psTMb;>6Y;@ zR#HcZr@4Im8tWf9`6pSJ02~V~thx)c>KD`;Gg3L}?)JtUUYP$!5T$Tsou8X)HCUte z3c1nR3+3rJ(xvJEcL#1<0Dq~ue^1LHGoQ2`2~yBVZMJ28l>m{b*MqyG{yU&uqtV!k zn@jQpY9WX!EO4)JoPb*j+KIqFn!Im-wWtG`1ZPi6i^rc{M`8f1@Jf07w<40Ac&;-J z<`09o(`cy`a3>hQzdAA}acn7gPrA0*TI~k#52yWqTFStussI2000>D%PDHLkV1f&d B@=5>z diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_44.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_44.png old mode 100755 new mode 100644 index 09dfc28e8b22b177fc837c0353f25be284370ecd..4dfef4ff656b759967c175d73e0c9788c550fea0 GIT binary patch delta 921 zcmV;K17`fX4xiu$@t@zu(-V&+(6L_HIoegL_=V%^G}dq6fcZmc2S0yrR@-5M#7AH z*#!)&!PIM)|Lz^uc)5a_zC?eU_#yM6LGzvnzB&k^9P1Apx8`)bc_>c1-mJvM~I zJF>ju^1Gk^S|w<{{YWt3w~u*N=o7_rX~oi#Su}r9^>)|n{p9ERCz^$D`2g%Q_JY{* zx5i%+mR`LO@GkLoylr%Bxh7mS0N7hM#ynRKUYE*$DqwBAv~%OBM=e*@eycQv4JRR- zhtdUQAGNKWR)6|R1E^rEI60E*e){xk;r4+eNNi8HKfnEukx|?#fHd+4Thh@t$8AC- z+hwfsou7s`oV_f{0sweNo{4$>zF9CY>YQ1zt3R-BZs60yB9uMimHD28t^9UFVM|su~9HPJa|xTw9}63DMfy0$|@$nn~&7 zKiY+qL;&wU?XlE!*XFR0knn^3tK>te*;kdlLLwu8*W<9xwr#THu|vwVs;b*#bE%vS z(QQ$sK}Jx)OS;Q=f3(r9gnrWj>^q$=czcH48&XuB11K?=c_sZ6$IY8M^kC|0CX%z? zoTbD^%70o|pSq}ovxS`NBMeH@iWTeFktE3-t(EUG=H6GGeoFan*w)U)$B@r^9ONVsE%L@ zj^K`?z!z5@KTPNcIT;$5{Jm33>8hSA6Dpz1R&Z!Ka?OaVMp50ePleb?$ka9jRCAW8 zp%ix%f7oj7N5PAdf0y=WlIDBlehkUHFs0_S&p!qTHPdQlSdWALpg(oO6ixu~^|`c} z;eV+Er#yJ0+3d1@85lW=W|*P@AaP(EGs6Z@F?woY*UL1GYwmdEOZSDf@f_*u-P>-j zQBEfT${MT1qB}32mlu?y5kNEzT#zynZ>x6*IT`>UuDN}hZ(38xekl^#JvFMbPILyc vB(7Pv2zhHzSw)G8(;%VEw*&(E>;D6pO%h?DMF_f*00000NkvXXu0mjf5v$T; delta 1847 zcmV-72gvxN2f7ZB7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000K;Nkl2+j8qT46{A`|6kTV^r*|C056haJ27WE@y^$XZD{1JOSBK(u~T z(WnAb`Cv@AhgxsntGMkw#`^2|mQVl%F20ZEBS0gzS^;d#75{cU7Fjhe+&>c!&K*?> zsQ{S{#P_(FN>+6u62sIfK7LVs4UQHMwBhI6c6R{=)IoRQ~OjS3V5T;<8;MYy5=sDssB7&B82JD26d z-gh4dn><1)CV8ikfuVrQcB&`e$}&Zy$n7zy&PKlM8m|Zrbmlp^%V+`0jy6A*Gs`<` zcsya@vE$3`p^8?i1&dGdrSk4};9};a(rIUqJ!)*d2Y;$Ej}TS_5xE|o%r84OviPCz z!#ZaqMnSGP1~AA985L8VfE|nTy-s2|D4F)GQUvHT!<&lV{S0u{F`$B5ZHxp)7S2Z; zm@gJT;;6dcURR0$eR#a7_-J(G^GL+{8ao$C75>|86j8{9;hCHh@UDDWm)nthe{DJ z>+gOkz^4{NLD}dLH49G}9B0snv#-P+f z5zdMgIMLcNoWL5imb}JXB|A zlYe*zWniGIJo-KRshH|Q^*-uadtE64m1BSQRmzGak$HcIqVVEHfR#n(>8yEOo6WOd z+k53_+Y)~jJY!Z?D@mNK09iwTM=`;MQ1Oi(cc=tx&whU(Nh|Fx#{VaKXHam2ioFWlQzfT$R*CUd0%R3txRtZVx|NKSMd zc+FT*GW1bWfKM5_sSc|E$qb8)Ni<%2`!K&u32;7ke-uYa0p59JU@_n;o#pxQlz)X4 zrzhQ!5>$$c?fKYm0~z4zc|>Z)Dn4eE4!a-swa;2>&-{A;j|>Z-y|0puVB6=>+D=Y2 zKQAAA_HzVWP0ksk2Zje+MqaCHGla1M@)S*Ve`cRYDL@vSQBWDk=qsy2OuFqD#htZB zDF6axfAC%JVkAZR!##0c6pOM*g@5cjb?vR&TWjqOB)wVzuppQ+SkN=z*|}K~S$BIe zWfdsepUrKpeHQ@R^wY-($gJE)^P{6AimMtATWbxA@z2-6cOd61vYBN&4(Dh5W#(Ip zWIQs~`FKnm_NI?_AZ>hSs((&r&#Q!X zAFB)DRr51VZ2kUH0Q>MAMhlJti6zaRduBT~Duz{sk~uC^hgZmNt>u0T@PhE>U8w*O zsF^j9FSJpqwgh=(Wqg##-}mo-CvX+WqrsiIKYMqzF_p^ZpJ_hp8~v5P4Xhf3JCQtdeAxG|EClPnHT{R8ndTd9!l};y?>I7xz7?O}frq--V8tAA`o(PtF!F$z%a zz^iRG-)+kk_9H$6WR>7f=E-?h{yp3G@6R}oPyh?YRmFha8JX(nRYl&_@DU1tpuU4C zQY+-!<4=truK*0ZyPAy|$-+5o#C6fUM<@W=-4tNo|NolVlHaeR&Q|$GP0{bCzYBPm z(IY?sz1lJb>BSwXSAV4leu}8I&-<(3RpfLKSNT)EkTlO{_87}5!yg4;o4v#MD$9V) z%p;qTQ<)zfb2f(Xm}m}qSCcwRx|*K_akj831YC3!s|JyN|OryYH&_v&yh- zg?}aNYI5$ND3M)BevhBsvp9dQw|}1ju1NlF<0?Cgd|a>M@G$JKlhl|^dM25X3cs5I lbhG$n_FI96#{)jM_8&d055CZ{%WVJv002ovPDHLkV1iaFfW`m- diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_45.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_45.png old mode 100755 new mode 100644 index 94b26fe061cf389574e00424a7e8da152d4cb242..de4d7cacc96c776eee06d743450a5733354ed262 GIT binary patch delta 1043 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 Hu0mjf4YwYd diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_46.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_46.png old mode 100755 new mode 100644 index 28f47d714d4aa620cf8aafb83768f38dda2399e9..bb57197952b48856e13444df728fd32682321698 GIT binary patch delta 1052 zcmV+%1mpYL5Tyu^7=Hl(0002`twPcO00ZnvL_t(|oF&R(P?Kc<2k`&%@(i|tF@Y7F z6$4g!TiDP%Di0kbDwrppJR>Z*1$b#xpyi!u#Ned7v}+xAS!y;tF6n)O>`Lk6PDW~4 z&_ELC7}=<7#L}BaV{Ghw`q1z5j{v%20Gj$Yiq5b9dPWeOQhx)0aUf;swO0>cSVmBO zM+ZPNmX+zdkrRng$)-pEjK>T2AL!oja5*7qRshhzt^DJ;mdX32gZW1ZLr|x6*)$dH8*^Jq@(&Pci34EK z>q&#(7k1b55Pzb#0su5*2C4PVph8Rz0D#f8W;RBR6KcZn{}{{LefH|w^Vf*Up$`Bs z4lMsQ>lc4UlrGwWX8>qkelzufac}E~MAn<#0F1&@`}k|kT|vsVApp=Ej6mTI zs@GCjnB+mIn!$X}q zb5G}FZem6eWgzu^%8sD7I8E!6R^6r?q!%PT!ICP+Z*7m?M`TEwCDhg4>@GR?gj!N0 z&bt)!B|4Y)e^qBRcbX}K4rr<~x^M0py;xADCk&FYIquwN^%uTXPo*o>M8<;BIhA)t zz_aO$PJeTna%4BgTC1D|{VM`FXo9rMt!+%=S&C zhr5W3r{3L;gsJ1J3*7^cSV2>V=UR<+^nBoTSFNvVI<#eNE%kz@=k;Z<&tF| zqOHE!jWa`eYqG2o+ks3d2#!P3IBCcnlK2O4et+C0&QBwKAa)E(j0LaQxBnK@yK86d zz#_^qXRGvQTI=55oit@YBW1{S4vOaoM_xeO_=&)y7-1Ekh?uAv`|(dPpFFY|)3Uco zL=}%Xc1I|7(<%JRo)yBc+z`ip7m837V_No#-prUsSo|UqalL~Pc0{;EtV*~O#0)D} zL4W4&2_d2$p`d9>mbGAPoe<(5Uz514k1<9d^BN(nF-#0!WY`aL5{+ zmGdc64FLe$r4B>5OglokIvW6Bh#s=e$AA4$N!h|nJ_AHgD0VLkt6y0{x9rsdAQ$&5 zX&i`Bdh4xA07StVtbQb{R;p>Btuzdf%X@Id8q^`5$Z1cmbHkqzjn}#W1w`0Uy=rc; zZ`72-^^l7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000OLNkl| z%mm|euQ@(h0lMTNuuA5ueiT`XOs^(e7xOC{;B>MpAiPrnSiRZ$kOT&Lc7hdg3`dna z-c#>bzpesQ$bamB_z4Ptz;)!ix*kbDg1nrWa@coSJ?#1R@nSD`NUeZ(N@g`41498< zRTd`SNLIFatRK~wYO;|pjIU~ap)=3PCtMlGQJz>Is~N$p$hXDK=HlgLbI&%HjjbkK zDYLQ{E{?#A$eEsSc2(ea6aYc($hZBRX##w|qA+W%Uw>;oKZqatej$kHtU~HZ^RSMM zZ9o13UW>`adys7%#Gr$z7Pc(&httbEkC90eGQhq$;$V{-; z1n9%#&3?E3z8m1(BtLoeNW%IVxN3sEc&I3zW%5VjPH?bsUtMSarK=@b5rAZ6NU(kx z$Tqf`{(lbnm~XazmjA1gOeR@&eRmTuLa-@3P(1<>Kh+@0vgBb6l_p@epZ!n(EG9#$ zDp2|RL-_iqznOTOY;<3lA|?x> zx_{?^TbbM_M|Pimj^0!C;5yIGbv>*AJCL1tMnIPQU5p~d7RxNF0Bp;#@iW_v%H8In z8ja<~^33@6{9M0JCPMr;CUpdcpj);ysRu|<(j>>Eg~Ol%=o#khZMjj@T7U9 zupA-6+uzV-~3Mv_9xTn2r|aV7vQEg4hJ?L8dIrG6GvIijS>iJmfuj7V ziNx4gOEl3Z6Ki93cu>mr76sU3?jHswD>`dfcvS&1{-b#IJsbj+7i$8$egc2i7=Mo_ zKm?#C-7H}Qw_;TV@CanjI=N+W!+cMaL}B@e0$@M}B&q;{$Uw;g&GP6d0OqVF9DOp- z(PxGmvT{rQwMZ!jv&m}!jf zE#PSdU`2L}HOnS`Z!i1DHbkTV478JaCrD$p;xn&_RIM!6uM^TUqyo$P(|rQYo}s$FmK>iV!)Z+|=I<1>J@%%mf5nLUk3pm!!v z4N`5|OtZ5I%e-&%jbcn0ZH8;`zXt9gwm^Iqk+9d{J!Rgz7?(Xq8SWh1SPs$DW^iCJ ztETGSK1*i+51j1~_fZc(mVa!e*yw#ECwm5{kk8^|tg>HM@Tl;0-}m)p3z%pER%n*k z&Y7TMQKPU1uK33DO*Ka(hiwnu@Km?$wbpenWIy&Mezb>t=D4 zwaDKJP<2vOfGIoO52qUuZIXQEC$nu-$X{#y{(l5blAkrNv$qslX@AZ7REM8VZa9Tj zqS2-%KYFgVE7lA)H+%ofE;^Ba^iwhK5H$g2XHUoYD!)!sd4{B&oXuE%zusGGt<%YW zLi$e3oBqxjz>AZys%m)?+i3#K#XcYZJwT=4C(Ju1Jf$+$zZ#4kC%b)4@Zl-z&gbYi zf#^&X{ugHVWCg6cZ-37jQ@OC1-rlSXx34Zw>a1||_W@M02*T4=i4{$IH}7cA#@K3) z&RF*>z?6DS0jyJdaC)*4y8bgwQ1M&cvoQy31{FJMvS?ez_~Qy-4I5$7CK@ZV?`L8# zP&-4EA^+4reQ&L^KLtdG83xppscoo|Q`S0@Ha%1w|7zVg27lMkp8_&qPdC6stcfOw zo=-PHHXeHqt#t<2PX7;Px2nk6GTWS3cFp9&$W}F$&j2>~|H)38!1|a{((LfrvqNS$ zk++fpU~*aeOZmsR_NwmhYo`ged1OuO*`ELX`M!VuK0`It{+|B#0=(is)jT;=6LWHQ zP!rnOUQf0Sn|~iF1g>-c#gHs`pV|znS=l7mYt>ZKbk6`&+lbAB`MoaF0GST61v9xq z`FXcR2O>}TDrW0GA(7>M(gc|^L+SSbtZ=X680b$L?&aOH$H_J~LEgkQ%ICY*6(E#t zf(Y!%rclJ3G+9LfBYTRp?0S_C`yMtx#j?s_-|tvQqEj=?`_3llt~+g#(FXY8xVW86 z`~M5@vR2)@vvn)~c;B<|ACK;uJ%A`MyI1t@#hJWzZOSiOmr)Xh*L7XjKZdw}kk=cq QDF6Tf07*qoM6N<$f@^Il)Bpeg diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_47.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_47.png old mode 100755 new mode 100644 index a9cc34ca206c1a8d8e9520981c1826a571b6a2d0..8aaceac98de4430e26c206045e84bb4a0f9432e6 GIT binary patch delta 1049 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 diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_48.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_48.png old mode 100755 new mode 100644 index cc9a89dad38360000ac94d965adc77513adc63b3..11e017674d4e8fad372b9448c125797bd29484f0 GIT binary patch delta 1054 zcmV+(1mXLG5vK@{7=Hl(0002`twPcO00ZtxL_t(|oF&a`Oj~6Dhw=Y=dfZxIYgwt2 zL8QQ$nl{{q1pVMz8gU>lBgz3?0_$R80-FJ+(=3BfmYI2(v1T!Gjs(PA*m>!wV`Bys zk26tljLQ-r8{K-yAZ0fxXG>j%C+zdQuc6$8-JH`@A2u74~uf(|tZgD|`$d;H^* z13L&R7Pqyp+BH+@Y0ACKP?YB?W2*3wD6|$GJ$|k1g$hEFtN@@1Xp+5K4tm}vT&H3L zAS4J)ANia1%#fra0Dz`ympA>+*RzcOPXzEx`RM*#ms7c0g+KD|P`?fmbk1n9>DYn7 z1>W_N10vv0bAJzSGUW8+5`z_pYlrtpt6g93^v8IE2ms8l|D!TGQR`6?5$l(!yhB$9 z-{>1BCIm-}NPjNwIFd_|Or*J=FjC4@6og0=t=baxm+XpQnHndl#B7!d+mt zQ(3$S(sJTw2*Vx!G(CPY{UT4HNqOpVXb!)Er*$oVpMNHj*q6QapjDX8%NX*-GOIZk zE(J*$b(;I5GghigkKSn9duG>m{X>1Caqeb>`}&^KU*n|0!Xx8;?BOD$HFg z?R{0vZRYF%7JSs1f1~GsV0NW&Z!sr+C1Qg-XPvw-S#BU=dfh%_>t0R$z;*S!?UU=g z$ZOjYA%6wGhhBE(LFq;>NTZd&sL#xH6ZG1U1m!ob5&RgbG(dEdBYlQG3>DY~ibIS=C_j(U? zM2k4;<`pKZoZ)JHC#)rdL?Wu+ov+hb&z@+HA%8J<5i9RqsPcKTYO0p5uC-}d455p+ zRB8AB9jRMNS;8m_VPfy&2pfG;Gx5PU5on_#c_^1AK+aJ-nb@(Wc_4G~zcd2!qB9H0 z*mxp^LJBvt2=k7xGyZ1Q<}h*8j-U^U6W9zmB9o9VvtSzQ9$|$sCbd0m=V|KhjS6n& zV1I~fo|JpTM2b}btZ8ZdC!_WZ5F_GNy#s6B+x5!bxg@JK!i)TOKu|HxLN``w6xVpV ztsEFLk|=89CJU$$Qn!yW1m#2XpnG*8l(j07*qoM6N<$g0Ud*SpWb4 delta 2178 zcmV-|2z~db2!j!j7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000OzNklLk|1al0TzJq}Qle}p>zRNeU1Q6XL{Zt$b6&@BT*oH6uIqTcUh?x# zxJHYg4czf(+>bHhUW^s}WNYHR?0l7P2RFlW>T>=BgvrCtF@Grb`Ao5P7M&$Aex4;U z`cb4&1XJ-KCOkv!kM|Ys_%mYt@%dpWfJ!djuhwINW^A_tM9dxkaX*r*iwnH)= zmaL9HRxmXJW`C5B5w_~^O5Jcx^qVTcOfgsF`L3%<3MO2|$<|eQL;qC=tFsU@Q;xWn z#l!9oA17NpQ&bG{lddcoDsgV7X7a7fA(1NXz@$1G>lOE8BskGo=HyeZF+uJ%#>Zl2 zal3}&35mzXS3Eksmii~FcMV7&GO0ova#Xj z4}G7}IV)lXa>p1zkey<5OmzZwEUwQwiN&B~IMNV1v>dt_|FcQfAz`=f~3fjniUZ9rwF3VEgr_u zApx^-?}q~XRWekCz#?ODRPt25n9u9VpWd@#D(nhx$IppO`R!sotpLn0VJdlUvQdVk zAEg$m;E_lf-b?}F{qu?B&s?8W09LH3`)6dgYkyhyXLu1usv_5QU7yl<7+l=Hii0Jg zTF1!KDR8A6Y`szvH8z;q;CrPG$8qde00a|d3*`$xAFr`5uDeqKRJXHuR=S&!D_&Lc z(FePqDFO2{>~xaIlELIUf@JebeU8S6aHkSEioxz>%BBj0dz|r6k-Ji_EKaEa(Q#&& z7=Kk@r|@Wz2r;m`6hM(6`lyN(*JsL6Nj$?lO9JL+Tu;^6jlaj2x? z*ur&=B1AuxTr+G6XGH?$Cw^9bDYO&Nowh;(#H)N)W63=~p0#UcyKz=3f@EDHKm;~> zU+rP9Xm=<;T$7QzI)|C+aP;e((AStZ?Ba5D)T9pLn8G!k5;&sRq_c$cTB%ArFaJU4Ib$I)?fo}0LrZGT{ zl0>lq-M+m+fWe9AIkl?rz1_(K6)Cm6hXzsp>oZgJI~isa6N zo3m!du;|X%ut{)T^}h>XfbJ~%@H>KW*E?P1C_=T@neow9^W%=w%zspUzq+!qYHsp& zjR=(LyA27pYL$;lvG8ZSw*C@`j#p+gdtKN2KOX5=)qOJsS(WvU!mw-SS&Hqe$p8BP z-rVp1Pjpmet24WbVMiBNqp8Y&^fU9Ir~Dm9LjfY#oyl1-b$(QnNCdWisE@K$Rf=aQ zg>ss2SMlGP;Akj-8h-^(D*-z@4N~AnTP-qcj_h3aK>DNtTvziuff@LxOm%TqJQV}; zQz^pC8Q95@6!E;Li+>yo3V;EknK3HpZUuCXSinNm-(u&tja!qKCJ)bj(B$Y`H_=DJOil1*?kuL z-8RmB3n(FFC%&Cy@RJna?dQv=R>dr~o+V+%RN_}iwtLcXv-VpgsPu6!{-^c7hp6W7i7A%Jq)oubi`D?s;*2 zg+Gf6&qX_(B01)gVYOrL^#7Ei4O>+JbwAdF)hAy61IdapcKfg8hyVZp07*qoM6N<$ Eg6umwdjJ3c diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_49.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_49.png old mode 100755 new mode 100644 index ef68cf86614c97098e4bc877527deead0c8b577a..c667c9f81ae0599068db0e9664d7e16e73f2b3ae GIT binary patch delta 1054 zcmV+(1mXMC5T^)`7=Hl(0002`twPcO00ZtxL_t(|oF$WgOq68+$G^|R3*3w79Y4;b z7##6x#z_O56V{Z2NrMbRu)9leyjb9e<0Q;GzZqr2gpVhTi-1 zS_VPMLmdEdBq`B-H~DcupynV2Af3;7zpiWdrV>J8O#mP+lf;SWx5p0<+Tu0vb-WR%u zNQ!l}(!cdy(%+MDD#_CU0K|8!Yc`IKeRP({tBS;LzMk2e+UgaQRUkG55ahXMQUwMu zZim$0^k$xScI+8J0d>_EK|GS_TX=Bdw?=_M=$n7&kbhiNVWoG18B2sgI`l-fTRhrV zc4h1M_hACV4j;+$O2a1aS{o^Bri$WoBU!Pft$XXzi=Im-$n=dxgUREN?spaZn5Eg< zD(K}1LsoLW*ih>~G#?c(Qka3c|5%mdzRA@*0=?i;8f{lg6|wSgvu0{)<3B{!ZQ5rz z*Di6~)PH$(Vl!c+aV{#dOx)48t$XLsQT0R)F@AX}j5>Sc>yCV0<<}90{X91e`$rO< zc28~ats`;>wKtJg>3nvMqdzMlO;ExF9Ts;V)GAx-`oWoWfsr3T?^S#ec`MYMeld_k zmG(Iks?OQeD=~vUQ+_Yn)IF#Dd~`s*yu5PF$$!1zYHNj>J^Pwvp=;$EEf3=QO0#8h z+&ECV@YDjFoWrtmD=Ux8bGe5MP(^troEAAPCw|&wS;+qGjN_lt)ywGh%974Hn zgt9#+0f)zXXCT5#P90`cY1biORc*ys2Y&jti^x&G9Gi*n*+nvcC#ub`1h$v^5_#tZ z4u8}<(z9YBhZg~`&JBHQ(2h9}6qJ}Efb)-yiT+7Q1tgf46S0dIoA>JyZ> zA;1@k0LU8GHpMTn&?I2cQ-HLAj>6fpOt8vH&M~%x(BqZ>Y9=AKshr=aUIuMxd#uq; zQpEva=Qteva*Mh)T|><#07%lh`ClcS`hRkRVBhc(0QC_=xC~>*JS{c(0f3ich_PYw zheC@X9{|V}aD^L{9(pzh0N`0~CCog`j*$_~W*-8JsaGo;j1&9>uKKch$aQtP2`O@l zoC41GIl!4^xET5pwo4#f0fU0rnP6$e1&X7B)n!;6LdCKjez#yWW!n)u0|eW72^Yoa Y|Jd-k2_`qgoB#j-07*qoM6N<$g1>|M?EnA( delta 2131 zcmV-Z2(0&~2-Fae7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000OENkl`{k70p6rIX*rW|VoMYVl8}<^*~b`Tjzc!*9FNCC-v5NF zHG6O2wx4l6#)xwsxVb&W4>^G73+o0JSV^Pit(|Sk<5yGTiz^Z9)C8;+2XQmt4>$Stn9+cQPREf z6%s#10g%*=e5+)sBEaz#g_(2ynCtn$JfZK)I%i2#pMM#V7F?yM-l+glvQ#lypBSr> zY0oM}fIfHf=AHqfq%vd0gkWBsY=zU4ZzML`naU6HXvb7K*ee3`!FXVwt-tRA=yVRV zcXfEwVNo0vC9(c8+eE})XWQ9PLc8weIYV$3$h$i|iwl#i5)hHfl3@KZl2Nkl+)C1v z3RL(}_5y^REmJvdiJCMf3+B*L|~FJIf^{R7xOu1 z?ercMm4~zPWZR|Lw>diF8}K!BB( zBI{KOpvYozM1>F~5#v&ciME|;5h&a*Q2+~e-LtP{cz?ZYA)HWzC^>9ABRHc1QI|$t z$<~O9ySjZn#rgmEb4h2xNB5Pn@uzWOf*HBHxV?m__tCg)(RzNyIHUkJaNF^W>@0~3 zIDeDzS1SNhpNx6(Z~a7a&9Et)krH@*#yD^Wzy&-B>)LJ+*m<6R4n~$&c1m^Syc5wb=X&e@vnAn)-JEoqvk&*yF*!HP{!*SLxi! ze3dlx>#gq>9fY z(3OAHxtR{e^)bGPKg)p{yPn~5ssI*j1-u8gQv{tZs49THzuN?MjK^El{eR4tQb1fk zGAx2GT(oKt;nr`q2%>I_a8x?5a?nzV*p+MLV^=+yA?~Mt8(6VSr!$hGLl8b!+lZAk z_KYRni?h4$+O5a>iN>?0z?i(P?}W`c^x_+zA}pFZG|`%uX8qj2}Gc{hn?QDvNFxohn)?)xt>Cd5zD)MUTGX=3XeLV zTCD0U!LCPt2RNPh?x9Q-t)~Fq^NOtoIQ6Xn@q2mk;$R9eM)9wLPk&e>Q=QYVI*TxJ zx_GmPJG9QaiuX>lM)7}DoifRt&L4I{9-Jz6E%| z@3wVLKrA?>bAYtIPk)--i)~TZ_3lpo<5Bn)paNRJ@3OnrI#CG7n@z$h1p8X++N;HL zq6pAmO95;^Sk138&p(pZ>Hf^R-S}9CGqZeV{ir0fD;D1vg}(^$j8*U{%M?}?C(fzj z@UCp^df(wQ!pMrfQ}kO3z<^iASA42x?68$3qN@^$pR81G34nAywP?wLXD$reMV2)w-=W2!c3qz>|z zKm+fk*!E3PZotDKC0}N~ps;p+jOY zb1)NvdJD-43Nt!e`(}JI-wsotelK6X-@_Na@L{(k-K z{boItL_d(Ewv_xe-w!0;MF1J_cfRZ*FpdFuU@sl#7#NcP-2``Z2a{k_Ltym`Onn}X zg0Ed$fOS8E6@SQsxl19CpM%2*89O@B&{GFeF-nG}L^ zZuH_<3hflA1PQP{cj&Bi=d2IVY!z@}cNe_yCD076w12=qaPOd`PYoVLQ4U6?W{&_z zfaV{~1bAimT}f?lcTcXRedd4hUX|1V_x*QkDI~aG11UA=eB}e6OGPlluFbFtz;D;U zfmfO6)!`K6zm^2v{#(822p~Hv$>2p4v9$!PG1rng%#jpqxgB-B@6Na0CMyb~V z$esX3RwTClSOnNmkq;Z;#^bbFBFU}IV1&TyK6*tMiLDCW$P-D|=VJi7D)RtHDFC=7 zEJq3q4cP2AumMGJV*u0~<`RI`AZrv$&I2s{$J>4I;;fVw#}m8=ZVJ-Ew1~zBcgyne z*Y9(uN?rqiRSf<~vITl20P;MikDK;v(Y^mKP0?SqZlaR#00000NkvXXu0mjf>MmxM delta 1484 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 R10MhY002ovPDHLkV1j_4D?$JO diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_51.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_51.png old mode 100755 new mode 100644 index ba00473ddd16115e1bfbace6df50d3da336372f8..3d7005fb690ee4e7872b421adc51d8841e2a5194 GIT binary patch delta 1056 zcmV+*1mFAh5UB`|7=Hl(0002`twPcO00ZzzL_t(|oF$EYOq6v1$G^Xa-*NYxD38b$ z2$Lfo4NtK{=aezO5Pcditt?b^6L-&{cNAlhX9fjfLOk-pri1oDSu9I!UOY0Dw3{(#8|s9NA8UCZ8369M{{s z(*EJbahjl@3xHVSt$p8SI>w361OSkquO3eo>ehTonE6!?0I}rT4O!JiYifwF^qOA< zt>*|9Lw(M4S=;Kzz$RXYtVRM~8@aR+0IYSJrlBwP;kC1!7$UQC{$Q7G(hA z&5*l~zvk5L4nIy62m`gxLfo@fe{gH>rNfkgcHO_H%6|hDv86YnE2jyAyz9|QpZIRq zwo|J{zK^90>vZDOa`W&B-Vf>#D=M?$3`b6Hp9H{=+KNn~s6TL0IU3a@g~8sUnuY-DsMaSo|09N=sg} z9%+*~u760HBsLO84o}XH+a|8-THTR*aegiF#w=^7j}>}4Q)~8oRuPs6Lm4lKMcLq@ z$9xk>`aI%|5t@&a7WrsizS^C$$WE15Dq(8!D0$Ex{3VZ%3u-hN z2pr3;NW#lAE+7>p!Ty-Ezk5dctxv zYJcQYY^#AXBaA-$Hi_Jzdk4cAu-7@~(fw0Z{NJ?ej1l4$es?2im`TyJ8|fDjrAl%i zpc|mWw{)(8bCemfefdZnOV18v#Id5hB&`aISpHVtIy1< z1VsgqJ3`<;&?L<;&|(Sz>GAG*clr-sn|~W7-5wGaS^J#uy!2=&uLmjM9&Bs^rgDf$u_G-c|DOl7q%w>UHj0h$@U=TMF3Mkn!* z0Z|YRSDAws3;UNDHffTd60U$jL1JK_y2)q7G^rY}`ew5#1CO*4uO+V;i2-2RWf^l> ab<_VTmr5D delta 2164 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 diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_53.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_53.png old mode 100755 new mode 100644 index 18337cd63c7b7021f0f14c0c2f4b510736127926..f443ae5c30244583ebe72de59d1b53f8b049e3e0 GIT binary patch delta 1049 zcmV+!1m^qa5TXc>7=Hl(0002`twPcO00ZesL_t(|oF&bFOq68+2k`In+;ey@UHS%| zo<(xxs{y6s#}JvVJ78CuqgwEA%#pBJw(JLBqgLv=IZ7=zZ*y*9xEM8{djQ#j*lg)L zOQ#D3$`gz;kD5YotRsHiaoj!q;s2lQLjctYK&d%YbYVx&oPQ)}F#&+qpR{G@gA*5X z2+C$u0LpM$YT(ZeOEE^v;}n3_RCutVZ`YnpvfC=Zo9U*E5rnpC;s!hm18l) zWznh4jAPXn<7uw-H^1c!O^-g!1d=w9UCm1Uw(#tOPk*j95-;)sj?qDFbnBDX$KxAb zX9Dv!Bn#z3efL1PF3A9M(b zwEKNKe<(1$)&*G}uvbO-o(FmRZe1OY_!ufyef=1?rr)o-{d3_{7IwQW^Yj-~C^dC$ zriqD-e}55gazqv-bZQbe)R3yQQPCV}W%3!%%|;?3;`>v?OM1+n`BekgQX1+{)-J0| zBp5*Ny`MI`-tIMs@Jhx>O9^Vv%{AEz_5OnOSyXhhfYc2hgP7`=AG}EzCx)M-L)4mo zGnQw!fKbsD2?oyz_qb;JB9~Gn zqdHa?5Q^7Y@y3!41nC)a2+-$L&+Gx^k_`$ig^HLPq3&^qApk_Es781kBWgO

    +*@ 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 XzNOlU;>0Dd00000NkvXXu0mjf)Rh)~ diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_55.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_55.png old mode 100755 new mode 100644 index fd8269bb4d5af2a4b30bbbc4213b4cbe43fc41e4..da7a84aea874415cdec64cbf32d0eda0779fe090 GIT binary patch delta 991 zcmV<510ejM59tSx7=Hl(0002`twPcO00Xc|L_t(|oIQ|lOj~6b#m{rOU3xnr9a0@; zgCchdRSdAWvFPNMh#4VH;`&lUG}J9(jDK)bB#MTPuz+TXM3ZG2Mi|jR?k$5EHWD7khL2OMFq?ir=> zs?S$k_{j?)F{m3%>V%DZTI#)zs{XHOKS2(=2Negj2B#ph+6U>wI`tSvM&q7 zyQcDF_v_`6f94+DQZ$sr{`>2rYhP`7%W}vtmzMVYL8>{DWWkgKpLVn* zn;NR7$A5RVHhlhW+?-UHx?a7N^>A=$XY9VDf@yMRsogtyAgeG*dnqcVX^(p>zLlb_ zJyL%$R2TIuk*Jx@xBy6v{dQlzlH;a<%Aq&_d7d8@uI6Ot5Z7HX0MbV1SlQK+-Z8qO zguMXeo^Q?bAGW*W;#noE0YY2H;)ztB9Wn99rhlISmdIe1k}{M4zsn-DZA3FOH+C;y zyVoNUTB(Nk=D>`o0o^V@I^P*6p_x+(sVGnL0CG`rSK-EY(Pc2!%>9flaBmu4WmOiD z!2mzA08g)Conb`O0AIk=9YV^y@`Z*?kpWeM2EZCjsmf%SA_fRuE_F3K(p~mY4dSGd z1Ap9Os4(@L|GrTojuL|kR14o49LqaZM?OIv;QWrN#$mG!cx^gIE$6&}Idxc=bIsu3 z#FH$%p_bR)W{tOrb)TIJ32cQp-7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000M4NklaU00<>Hd)o6jj&>}H*4lBNr@a4$ zs||av*KJ?peB2|>#l2!4Z;XBBt*`LT)XnO-G@YLXA$WKnH-E+M?AnbGiw%_djkOT&Lwu2RM3`bQv z-cw_2Ue^ICWPgr;_yz|+;707bIv+_ug1nlUbJ($LKkRwWak0T8q*lOtn*$&)v-XW- zWyNFjC}FD3M!s-;wbu)ic}aftiu+@GMldV(ZE>@hdH7k9v*NOAt4>$Wtm4AS5$WFe z3W#rU00ec!z7<(Y1USCpFs-$(xn3UR33FdIIU`ZMW`981;wqxr=>QQ~N=!Br-6BgE_<}1Rjki2?52e8kt-Q>K%0T@}C?)UOV zkrAWU{a(FDzL)3PP0kw}K-qQ#UKDJu5~o*Re}AS3^+cfZ^k;t^zyS+8U0Esu96eLw zv~@(sPE`b|?!OLje7_N61Z2opgxJ?nSF$xCaeE?&)_KeUY@u&;03`yit65~k!#Y)o z$E!2z1ZwSD9e^z!ZRQOQfWT!s-^*|JY{x0PX0@q0BN2Fcj^kzru*I;=J>?9z9;+j= zcz?{r_NU0GbgJsw>^>tG!SUBh@R3Y*^o|Ot0hy8J&CilH<8+?*Y=7?l z^G`T{0vSoPS0)+-dbVS|&aKQ>q+#BQ1FB%-?Akx!03LajPRlw-RRq~OA}3Sb8j-EK zKeNZ5Z~!HSD%ea!473sQ5ZJ1NAkj+jUYzImpN>VfmL0$r&8}|{$&3SxkZ1R)|`(s_!p7Hex^4W3tr~|yk5h9{za%Q?bvzFc49r)Yzr``kH9e;P#mFf1Xqg6$X zYhi6GnhS-=>YR3fyW_1QKr*9lj!2qW-&@o186*ci$IX3y#cSc<2`T4Q;>pegPJXOq&7$sr!_*0~; zSikZf4CmRas>j~{`fVUfo?SEp;z*~m`Ck4k*i1B;upPwe8x=v1yWUf<^)5!Loy<0A z!;cY(NS-IdqT*kS*X)3SArBk{kE zJ&rYJEW2i72l+E1-evzbSYBISk1HbM&P~{2R2{p>$9+}f3HxXB*!nKMt>u3kxEh3N ko@)L(uGQF8Ul(@#zd1%IC?1!Q2LJ#707*qoM6N<$f}~o&;{X5v diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_56.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_56.png old mode 100755 new mode 100644 index 300cbd9eca4faeedb0e8705a4bfbd6cbd91da2d7..7d0b0732ad2876c00af6253fda01f3db46ef90f8 GIT binary patch delta 948 zcmV;l155nY4!#GF7=Hl(0002`twPcO00V_dL_t(|oJEsuY*S?zhVS=qDm^W%9kj*@ zk#0LEX#=d_0Dp{i%>WmSt+DT@8eofN$^6I$2!xEqKN>Se#ClF=ii431 zh2u=N5o;#I7Gz~B$tJK(D8`MAw&(Rn*ZTi@?&rDg zgBV@5?&^UPmo^aiA3ohVTQ6KMS(O|udz|IDI&D$<3KfIZt;a6xeAZ8h#SH+$Bf&Pd z?A^qhgbO9@0K_F?+rCtr_cpOq0|10wJH|?GelpJZ`xJoAH{7t}hn3v5&0q4bDk(E$ zm^-pINBcXQAAj)OYa~!0wJH)_YF*z`PONUg(221l!TROR9Vv~sQUGA7<(KQSv8IHc zP~^5;ckMqvw7u^taYz6FF}iWAc-6V+iMnVM8yeRR{xS>j9zF()h&dU3@EHU||5_#D&`47xY{a_A-{GlgEN3XfM zY~L1$!@EBVx!fhq1tQ_i_E?L{ACj5+95Em4uQ}6_V!VznY(e9VhGAs*5d{GBqsY?v4Bsk~7Ez=if6nYCf@@qZOQBKy^8z-n>@=}D>cw#+FF)rxZ7 z-2oHIGDwt}oxOxY)&hWVir|B|>P{2cS``K`e)g2z^cA4x`!HTk z-kPwu-I;tJn@+?0d##<$=WPeFXfnhr6nozGWxeyK!CFJ8GEbbtcvI1KO{vTix>vX} zPk&DDS@dU~;MD5x!hxkuBTseSFaSQu?qzALWd)&Y+O+_Hbi`GY1nVX;0IO5AOa{0R zB!eljNOPO<_&}T7>yI-24w~ WKV|-hd;vQE0000Bmu(i^s#T-Hnv4J#@P0Km)D;# zTC>+?-1a^0#~g7l=8As2HFnNBU)4JkH;d=caQ+Mki-*@SDSvjo1J+8=SrP4ZuZY%< zB8?)L$_Hb@Gt_=Nuj01vG1ec~w}b+y;^KU?9t+g5)e2x^uK2h6k!01l@cc|XxVEbl zQUNj@i1T=uN>+6u0>jpKlmY#!T+f1*ZGy;;eO)0R%gN@&{7M2SIaw*+taz36l_Gn^ zs`z7osarrt34a-3qYjVM4cAz|t^#zxJR{FnjjAYEaFr)p7u5~@M;)xr!kC$I*tIMl zHa~qFY;gxvO!7%1D~2juwo^U%R+b@=0(ZuwIveq_dpr^x=*)BSl+hL_JKFqM&Mfb& z;q3{D$8KNt3`JU{7A!u6m&$wEft#6=N~gU8?5?r>UVl-Qd4MnyMBsY$WPaIgBU?Z8 zeOTuV#3;xWw*d^Y0!GDDCt%0odasjM4oapytB?SFW^hySyUzgcx(%q{RvQC>fraa_ z4$K#eAM2>P-@dMp0DXA4srY{r;A)UNWH?I-4_vfP9G;@FTY(p6q>u<)S84IwqwDN$ zQe;LfzJHQo1S<=I^~;Kkl5O`^KvODEsh^7fs08z;jtmeag;!J$K&+o4h_Wnrm_vmG z%;ww=1^8RZ5CMT8BRHyfs$R_J82;0{2d0W$#ar=nAXDxJ>)i^#3=5`;mn}BRu=S(V zLIG}x8zCjCIJ96~L~+_iTOUb}&tKIICB5PL%|x)b{<6m9LIH<@SK_s5rd>MschCO1_z2 z6=#*~>=ve)@a4Mz>mV|956p~DQ-Ex)5r4_l-U?WDPqaT9hl<<%9Do()ZaKe70aW*T z1d8Oh+p$=0rKFe_iv#_K3J{UuZZNM+x08Y^=ovVt@Mg)+D#t61;-=7A`qE$#>!H>@IKx4%4&R1m2 z5@X-@uL7{5Wjfijc@7&hpdoRq=TCq3i`f|Cs{pKUY(I88`pb5%0z+A5&lvyz#gAI6 z$gqzw#uGrgS^*enRRyv8&=>lQ{D0g1-Z@_U9YX@V{B7XfV7*%bJkYb?v#w))Jn)#0 zsH;0R)ndl-^3%Y(!MaKTRFPHQ(R%dBN>VLKm@NzeZ z9k4y~_94KY|ET-3YdVIYM`SD2bBy@A057npXip&pf@9;0tO6_p=PU_W?9rJl2C4x6 z&8_b|8{8e8ug+(486VqL@9YS;jCqpp#ge@xl|Kor8r~;YfUn}1*X@|u=h<0VuMj1Q zKl0D^;fU7yB+wpKv9n~b$$zP0d89qtiT13_SEf$Yri;i@RnXEWft{kg^BJH@f+{&W zq(^(gvy#oD{0#7?ju`;YDg+~!cQ&rikau-6e9X@R6bQ=BD4sp5O2&7Bzil6;0AAsh zMMUVvp?pQLtjPbz{3j_uw$Rz)GryV6jVu%28S>j}AM^VF2ucPB1%C=F>PqnEI&VEY zw{zY{{6-K1Cn~U4_^9{@W~4-(KeWhC7W|pV$2rfc>F1@sW8C*Sz*WV& z0;H;~Zi>}@e%D}w?*dkV@Kn&xoZGdhf N002ovPDHLkV1kFRqM85z diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_6.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_6.png old mode 100755 new mode 100644 index 56f37fbd8943ee285f8451c64269c2045acf4cb7..645953060340dd3b0da29933ce360a64917c1e13 GIT binary patch delta 777 zcmV+k1NQv543q|t7=Hl(0002`twPcO00P@dL_t(|oK@0Kh?I342Jp}O+t=CAba#xT z%`CSLUFxuP&@C#bL!wcvkt-`9YKVkL2q_w6^LnX6h+c{gW(#=`P4H%y*olHHgIx-= z5Ml*Iq1aq^b^p!Gx5Gx+b9pWg&%^WZcse5DhvA5sZ;I;?;eYdph(<)*{HUWA5!s6s z#KpqQ+o9?%luGk_ZYUy}&qZ8$tkyRak&X?bxrGHU3~d}FUt2yAlbvWpM8x%o ziS@&ch|sDO602^$?7EAppEq48@7@3!0fba^OJf=1`AB?rT5dK zi#%38fQ9Et6@QCK+2I0DgabM2LqmUJ|t66#iD}N`NW8~|u^+m*yM0c9&W@Ybd z0~o-Xv8gdCI$n*4iJa>A`xls6dh0io5{#Xo{8{UCL0iJ;>lOSQhr3CML6eKVf=g$~ zlI(oFSv_yM@XG*_(!CtjF~i)KNG#CS<5te>CM4y#YJP_@@i-{&AHH~*GIrG>a?$nZ zk#qCQTz^wx{q3nBo!OA?n-8pKMUCvF z)TM#8pEyKoM5=<{zgA=oc1wGvp|iUXx#*I-180xUTiuY1R%lwF0;|}w!kSP$7(LJ* zdfP_Him_++!1~Z(n&-3cv(bMPuxzwF`>=prfB8RlT>2Y9FhDhr)oxk<0000{5AMe`5nZb)-`-DFFu$W^Agx0N@4yxbGVVuImDNZ#S?_ zoP8^8*2c#e-*ey5Hd4RcxbFMDPjtA2T{cr^VnX6;$@#k-PJi*B#tx%S{~Xw1Gr*72 zGS0_+9Wn3ly9IpVhZWjAq5l*-Io8sU#NFGCVUrX_J8Y(_hmLO%Lh4g{58S2$4{E>| zP%`iYV4Jwr)@?Hl|B`d8NFcq(%6EBi`xrL*H0J~G!V6%n&BHMq5j5K{xc6B7F4ry4 z_XLF+#R{7_XMamu!HnWxHUA<3RvJ->l_a3!NUN5%If(=+0ah7NjnyO=kfH*$+anH7Ac0AMl@mIPT`8@0 zCZLgkySB!twp}H_r_~5fNDs#tnnsxE8=#g1VG(FupMQu>8zrH~jZ4K})~?F;F$v%` z;FKs(0jqQ?wYMUoG+z-HSQ!RwXZ8o*!=NxE#qT`}sBpd(fw^`PTv>n@SOIgN)%`_3 zqis2RBuykm2I`os^GAC+&TNM9`auX~vh_&^^R#0P5cV@F+-5(yiHzEAO==`ls@5ZE zJ@NC*+<&BM-+K+Rh@g!Vu{YY5+JF&p_^Bw50Qi2&AYtEHIjJ5Jc%#DUXc2+4;Y|}S zUUfS&_JFjPW+THYM51ph4b%p%=*}WQC#==4MFc5IP;`;l$`06euqX`-ixXulh^X8s zH1UYP*PhX~!$^u2K{iEvmRSJ0ld~#yCp`N+c7Hbh^5&)w$)3>{;|Heju0>6+`qQ-E3xY*Xo3zzifJP~p;< z0e_7Cxohk&PE1j7!pq7QRsqlRk_cciopZjnJ!p|)79CYcsh+S~8(h~_69I6lG24$7 zR;5Y9EAuqaXfW<|li9*_9e`V*^nP@olP1IyWh&66F}N*(+YVOif)oKH1GNfN7S*f6 z(R+~usx3Z;BO0E`&R=(baCpP?O5V5vOUZXt(nRA|$}q8I))MvGd0LtAhaC7`w1a6Qs`q zqSd|3b5@_T1n@?wT|}@*Pyw+JWQn~R1t$$F3+wCTA1X_wp5%Ec?5_lR3{*jB6X&BGSJH zkXGIteIa^jdqkr{PJs(_= zC$5_N5(CXGvcvX00PtS~hs`EMjMdsu6dw{4G(9Ydg!NYc`W5Rd zJq+ph0v^(;KMFmG2$^v_&i0bWGu|%D)B~n}5mX851u|jY<6zq6Q!E@mz|{k|Ib`P) l4kEx8IdCVLbQ_RJ@ejv&@gTdu5 diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_7.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_7.png old mode 100755 new mode 100644 index 0e4fb27a62b18e47dd86366de6503314d39c0c09..4be5ea9ac612390b492295e3428f80e9883718ee GIT binary patch delta 781 zcmV+o1M>WV444Lx7=Hl(0002`twPcO00Q4hL_t(|oK2EVXk2v^#ee@h&o{4h$V|1u zv}!tWp$kFMmbS5KGcF9R2vKy@E+oN)xadX{8*1u%xDsr2p%jJE4lewtMY|JSI8#ta zS5xp?7j2*=K`ohNn)!V5j*HiTcXQ#Md*SfAhleETQbX!pjDMCSaaNLINzHdhLP_rN z0-#?bdasEx|0~~5`!_X7!$+mX`@-p(WT&gZ@I|=ovD&j$@TPpgc7dLpIQ23ROOlqP z)}cl$i6oSymejp=Gzlfo)d76)_Kvwa7_$Hwu)AJj7L0L#eiwImC*xpLBjD!iF!51T z1W)_60h<=U3V-Cl+{p;Y9f9Y%_<(wK0J6 zZ#8VfrW0cW>ED4l_hUo=ZhrSM`1_ax)xA9dn~(SRO@Fbx3sB>cHh2fGPfL0qoZ3ro zz#Y-VXOfn{srT_$5ZpWRw4|0{*!7*DbL)SkEHmm4X8_zUp%fcH42+MXg86#y7U2EY-FR4c+{go-dqM^YwAt$rX|4GOU8Ip9Iq3)zch ziRoLH72&!-aNt%%4++SUPSXt!g3gv#H&T3O(_pQ?HoKAP{_=l@gKY~b2-Ud&0000< LMFvhpu0mjf?l)@& delta 1531 zcmVOE0c1hLj$v6g^6>g6D0Kf|X@V+k~p63C2Z5pdi zoPM1;Yw}m%@7!;6j5P0QJn#FyHyYf+l+M(cDJh5Yn95I@U2K@I@6s zfs%qZVAY9x+D_|C-M?fU%M(cJ=v>Pe7spnmZ!Wqfrh@k1Vf?G%TTAo*+ z?+qDh6dgKq#($PV!A{2Cwf`akI+dtICkdz=>8Yh-ZX$t7fG#Df(MzD5q~FjloCBoE=~TjdR4B+B!E|e zTf9I8tk$hG-tvgjenm`RRTy-fIUh6~2Dy~EETl+~GJfw_K!x!&56q2|;Hm<=STo@D znsTK|U0oaNA%WK`+>Wv& zu#yN`^5V^IcVr`^Seo?=U5MBrRR(ebxe{k*>M1W^J^h+Tkh}!NDH2=N0Xq%~Jb)Do zGmEvnz$s|SFCE|7&7%iJ5V1J2(|EAq2fUksI*SCJIWo5QRi|VT7 zDKrU2Y0ZZZl|?7C@_dT`yRO}nJ8)x85kNAOM~*c9780y_ z{iZ846M$31^PP*EU9Ob7ZdC}YexBT*3*Yt@k_4#A@VzBpXH}rd@p>PQ%u-*a8>>z~ z+JB`JMJ(e_Y?5YNFX2#c$%{>{59L13Q+pUxg~{$38m+=8QufV}pnJ`@z7zpYl`?Ay zSS4dMsHddUzGtzLK+9_;NN|k@pe_@j?qF&CHwEeq@Y*y9(gdjV0=scA@{~`5dV^^a zq^ba|PIn7-Btg~~OLk@>PnVgTtjVTPn129TXD%ez(GZg4MmA{D?Rzjyf^7l-)RDlF zq5W>j@xs&K$;@lX#QC~OP(lEJJrY=R?;vXY=si`KB0*UdkWC74Vbu#HaCa;eViF zpSR0Eb@I+~Mvz4fDjE7zcQcEwoS@}2@H7!PH|WXaCp&N+SR|-G>-zxJu~{QllmMRl zCvchsq2pjGc;YD2Bipk%mhQKB1}X7F?C$@!GLZJwsQ`M-yFpcCvC6w?gPnrZFxxE; zLm@zmvsPJjyrpR@I@7|wiAbS5K4l{)xQ)nc%%>55Ck(KSAb|ZN%_(Tr$Fy#hkaB@2ej~u2wmCaq>{IrFwu$j? zFT!Qur#(eo=NDEd^aR$mWW#{^MvyeoO%0gL=AJOfbiR}g1K-X9JTFv4`|g$SEYS0A z05>ip%L^`Bub7`JVI$=%dvq8SIbXM!w@U`E!KFoK$U6NrMGfC~%d1mF~-@ESB4 h&;M3<5$MNs`&$ye`ZL)&b^;z0 z4+&UIMQIZ>tk}bD-IUBEv-9&XTgd}mt(y$g>WYQEC||Fr^O&w<{kUH$+_ zB}px*dw4#TL>5R=SBn2WlLeCRB7g$;`<`+U7*hZq*c0zD1;!}AdW<{1mr*bpA+UNH zYFEMv_}V`VY=8L)tV{{aoezQ1NjMf$0F*=k6gwY28LWP)O_yt&)%}+Q?D!;^n0S3= zms?i%s@!bm4(@y={A0eiEqAk9Hersx3Vz z6eT4xsU9WUovVDYD}`=q&Oy5aZuEUbX>2kEe|+Vrqzgd% zZaW4qtX-GX0(a-5wG_$>zAdS1aCaOae){3>K*3;bj}K@z`!)p6u$yI8A$dXPt6&Dg z?g6lP6C8L)j`YSNfYNnI1_MjVhqiG80Pn{Ajj<)*toue1xbGKRe^!GCxShkV-pF5h z&51zraeu>!w@?M(m#tt>^yok_gq2AE?_(**OSZik$cj;!UYHLvIS!W8p+%n2`z{1b z>4@?aHv=#y>Cubc2G}Ag>%+KY_`rG}hNm%H2ys1!`E?9eg@w@^mVX3>S`xJ!D%S)< z8`9jZ9JWo$05}-uu=W0kk(B z062-IwHW9GU&3do0<~IOQuS1R@Ff|G73ej3p98QDUUuP_U@328LhJ_Uq}17G`APP@4i9{>OV07*qoM6N<$g8Fu5hX4Qo delta 1454 zcmV;f1yTBn2DA&17=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000GMNkl8Me%e8x4|1NlPs--T8d$t;lljKHcaHhM5j&BJ<>QkEsZZiW9N}vrW z5!?Zo6Sv!DbEfWJGLGd5qn@I0B~6@jvM~_kHHi zXj^W6QcNUy25OjIU%rnWF+^7hmZSnXN5rglFG!M{zX9pQDKJKFm9uauG!tO{70%r;!vma}W z2I(yA^$b;r90y%#ARSDLID3q?a#vZqU-Jl(m!Oy>WGg%1+C6u2VIJjH@zo+}Z%{d! zqD4Ua#T>NphtoiuKJ^+06J6~-F+6)J(IR#iK{`XC#;SQj^oI^4de#s0p}iRs<>Oqr~w<; z@|u-MsRLlpJebRod-~LB1XmG)H#VpiLHhdu+yr{hxgCo`qoCekwFsW09axhXF?^(- zl^F&X>u9hUwi>jCB4r0zSx>457$y@42&KQf3#wv*^ccWBFk`gLzJKlj zO9UA(1)!yKJGke&8oyz-2*Ms<4#16cR@5~|*0 z(U5%%^^EU9FGsw_qs5_r0=RN8)%bGnCCq?!JzKGM(uGlE1HK7h_0G)%zBOx~XN=)_ zHUm;D5XCD7u!;;<6bDV0=p5QJ`tM4R-plZU4FWaeYn`t=|D~}lzEXiDQ-2JzgvQka zqW!wkK+T=5-Z9c8i3LwVD+?9JLhmu~ssws>xu+goAqwslDGAoxB+s!roA7|nKUx`N z1%Nw@4DM+g#i#+UoYilybY}I2GOWJ+UF-39w)%Q8{m$Gq5m58#UAhkf|4kH07tfpx9XOtPyhe`07*qo IM6N<$f-VNB^Z)<= diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_9.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_9.png old mode 100755 new mode 100644 index 5bcf7e588cf19d1e70c5a1a39fd9553b9f2151c0..9cc334e0ab9aceab2fc9122539a19572d9c39a35 GIT binary patch delta 762 zcmVCF%RB)PKGf)Ftt$B*l`N@Aj1> zx##-<-3n;GCi478sg$4JR3vqukyalo9jQomu?%#N!voJ%rpu5#lmcu&=!KDwP6Dwc zsV=n+S7S-^N|Mx)qI+k1B`N7bfD|MTJmNwyiU0|)eJ@i4BL}b*;f_5?4vcaD{P8-B zd=d;oQU~_{JAbZ&^^*m27lOqM+0$?|A_c~Gi|zZ)&1LRSUZ!&%z}0&Isq(xwo)(b4 zqYn#{OMBg_S{LO$?`;m}Z`5vAvy~GIEaxap4^^~Qn7p(Y0gx>8c7~(-;M+>ZgQLvS z*v#Ud~0tEtr)0{&qnZIX8MeD>wk=cMq^+{hMniO4jy8CKe(S> z*^D7Mv35k#dj`Ku0PGr>ngM3OeRaDNL*~)Gmn5|yaeSlGg!B)ICnU8Egx!JmQ@t+& zNEkGVycz!2f8DQCw}4$8 z>DpBf21aE7JiC20ebOiWM}LMG#Q%cL7youRKXa^%`BpUi@8Tjhb%707*qoM6N<$f<-=Kz5oCK delta 1484 zcmV;-1vC1F2GR?V7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000GqNklW-x zn{htwtHrv*za!umepsR16Z*U0564;>lDN-KW7s5x(H%C^-9yK>2qE>U%>%dDffqGk z3@91c0oW#Px9zr>hJVR9RwR(-Q8||vcaCAByEz|#7hV9hHV?;eM9^%*;O0?1m+Kbj z+d-j5QDHOZY=7w}SW)~{>n{?Z(uhn{l7NmQ?ONKV6A4rTR2h+tY7z`cQGwdhi3BgJ z!IM&&feM?cLpbMiXZmRCwQcuYOafFGkqK+ZWX^#)81HP4IP5?IlK_kqx5p+lo#~7MMSm_%emjq!EX#KAB;eW-h3f>MOB?&!lTq^!%?aG{w zNdT__nv<=Ck@`P{D48|&FZHVtM}w7N&~|2ju<UfINM35jUe(zmChV!)u%(au? z$^xRm>X;f8nJ{gS752=}Xj{o1P7_IyfjVZ^`J+7@XEnq4d?AD~+4{*1riJv?^NI?& zS$iXW;D7em1__ZPt&7gNKEAWQsM_Ee1Q`8{ac1p}w#DN{=KB;ZM*x8DZ^C>TV8Z#Q z7tlijZ&c`x6cLz30B=gUBb}o*3_C2<&ta#19z>3VsWcD|#HmlMjnof-)8L{)4z|am z2Q-03v5Ul3cEGlS#RxzN;AzJhGZQIxz@u}#qJI)U$F@i3>%nY_n4SiX)QA4#784sA zNnNTy(>SROO$D`i?V6{RB2p1NuoMBL@UI!d{U5`-Gb*A0_q(;baT_hOsDxH~NQnTP zW4RsBahGFobNIGni2ZbT(TE_0>%lA!p|%_I3Xt0RjPq)`m=kWnF&gS8qeq$+0gp*jz^C| ztGHH)G46F;xmf@``#6O>(a6HP?0!3J1r3J z`~I&1qM_9)Zg`3i61){H?t9%~X#?D*0)H+M=*{mv%HJdKJoN$2mM0JZK;IPABuFm= zdDSxaJd*lVh(RxAZP5fG*Y6In1n^AAv*WqGXrJCmdfGoF0$`jb!BQPS%Js+dEOR_*WZd;q;zgrDy~dK#Dood5p>%#a|17+c;7p2cu_G?F}d_kUwV zNWk4KOpOW28o)iUAS|=`dNRD4AVVXhrGcmLZq6U55{6*{oT^xHn8~-f&u9DH4T}UB z_(A}!(#9D@zf*-S4ywRz5==#a&o7^-T`NT?3*H^?*$9=OQ8!XOwXj5h&rS-6pgE$O z!?K|rVNx;9ok2kY0r0?9n<%2^e1GISPl8qtn7MHsNG}9sixjOMkX?1`49)TMNQkWe z)>pzZ@zaVz60n2uZpS-5vME|s0)L@{9IpWnU3#z{%2Osx_=<+YS{h9 zqPxR;(PKS(8mJZ+|Mx;AfL8YH2x{-?>fktbb`dT^3rrP)xR81({BxHiUGz-l__N2r z=idnOUjKSfK?Kj+FkKzJn#pk~3SvDss0Ur%?0_SzWt mt^mf;Tfx8R0gn)rNbwgPm21lz6%sQ50000egUU?HS2m8n81!EO!s0sI7-P9;sMkS?c9?9wQTg1cyu6oK4vr`hv% z_F2T4+4Cc0nuQ<#dGGz-tP$hKa-x9!54gGU5%o4m6c5^2(SNz~Rd6X)_A>&jM;ZMK z6^+6rdR;~p>wq_=6KySMp2Y}q&>HOs2H-Nf5oBOL(2SrCZiYO9PLIM;kKl5h-=@0U zt&#`ZNk0a=Tk1xe$x0tuU97~wnvv$m3tHAUrK709wfED&yAVyEXP+qj)7bHiC7atf zb(pCiuH=p9(0_V15p7R38UAS30$>VK7c?z^o|+dvt8Fu&-{H<6PB>n|QPf!ddc6w= zA^P{trJkgg^TE=G4M~ND|3FRmt^h|<;V)U4lce1kT?+tRg6;ivKppn|mC;*CL+O=w zai5fGPilFM?o}q)LZRnU8s>>|-)RjveKu!w#=8hi4o4qDACHf}Ujn#&-2GbEc2|;A z#D}^Fz^^c1rvWGeFr@(~!}ivMh`!V2IH25Px# literal 1442 zcmaJ>dr%a09RHyrpqLujRF1eVp`q;U>t4Hhz`c-bJRm%kXc}*C_jj8Vf?N-vMX-;kdKAzu)h>-_Q5^ z`M&nq(&FVaradqX05HQ<Yh9UmjN)jQTCK;|?HhgEV>y$V;>7kk9|YLS!h{5)(~ghvJfP!q67pe7jRBNlwjE|2zcF^OYi zDq6J#A177rF2(GM3Ne$8CPa#&FcYVPlEC;_zaZvf48_nSjcyY`n|OxhX%3sXaO6;x z{Ct_CaKarrS@0@N3-KgbTU)EEWp#>LNzxq0krYER41qL=a9vOnB1ABpm9XG|VNsPs znydt|xJALItkWzwB0C;MAmn!6G#m_1?p2?*zhH)jOrrPI23VR00uRe!-AtPI!TszQ=y%6{<=A8%r@S--ZH3F(_`@Oc(?sL(rn0BRB)Y5q>{yV)UFz6wE$+0x#W?y74YW z5)?)#!G;$Ne$FhiBEd?mpAh|eKf##=17Vg}PJpZ)Le7knh$0#9np?UkAwsPg-`*Sx zbhtTKFo>o}jgL+JPrK2`O)XvFamHdXv|V+gKMFunhs$C0L@xZk>#MetSgMnY#rl`N zvT*7>6*~%gW)59w`8zb{ZBC4ceA+ZLRCbvg-f85cx#Y%?xpvEE2ai_f zr#Rj?+B|Zu`L|iuHVt>~zfs;O}^x$1)wE!(})H9=vn(=@+t6s``UMt zD|%}|3G>~gJy%)>pRw;v-ZjVl#oX#Ha3!fC2zCFQX9B};1mCoiABI9;BfeqVQXjh?z_O(B@$}4wttkyh-t75Ry&LRX^!A=J<|*?J9=BZXT>qR0)VLk1 z{81MucAoh;4dZSyw%2gdaO+yDRo diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_1.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_1.png index 7af08829b8c67bb7e5625d6e367612c3077c1374..67d77257f22241335e81d3d11a273e8bf8e7f6df 100644 GIT binary patch delta 490 zcmVYDMSQC2T7SCVjkVcQ$-tX1R+9Z#9|Q**^dxs zF>{Z_?A$x?CwQ9+59dAaXCRJ0!+!30u|?xu`R zS3HjLSg)*iF*&dibbVR_T4u$A475(fjP?1t6Fh^fjv)LtRtTj^qgKUxMZe0BqRpsz}@cAcz9c`l2xnMs!R&O#p>z(S$e-Ml}L`n9dH(&TniQaXKh0_s{k53CRO%WhYf zBq`i3n=`rtH&z^A g-2rS*lH0xX7wEuNycG_C;{X5v07*qoM6N<$f^hcb&Hw-a literal 1478 zcmaJ>eM}Q)7;mA|`Zd1XWRB_Wn1)5K_tnzgg^HzDl#j9w%f}KGj_X^wLGQZjVGA=@ z(M0DaqR!1N*@kl@Ml#fGE{a4zaZX((&d=ZU8{Kzv__MW8S?W&6;P21uu7Dy=$}VB zQAG4u(GruBaQf|_Qe0Z6fMsKWh+S3yVm6SNKoA6CW(>f?Qx&wA7ZxHEL6JBKZ!<=kS&C*!1{uFl z=uq)^*+MRR+#Nhw(MnbIvp60M1`R>lAS6|bu1;%p)vxbLwKTaA5+~4PLJAn8aCa+SZowwH#=pIAc}W0KzasQIj?H=|mbEK@S7pU5%hk~)a8=5x9H^B22t^wRB+bbSq7;$59;wh+ zz#LG-)xeXj$UbB=#jN-g3IsvHxJe6U;?pUN6pReUm?#GGdPy^7WXu9@sX)i^o+nZ_ z)}>Ga!|+Ghu!70USOi+YXb5kW`d?*UQ}fp`rA^(5F5A({IQF&N@LzlHcWj^kz6M*@x53r9t!7f%VDIYP>Xez< zi(JFB&BY78)L$-6JCvLd-$i1Z+g^A+`8)m;aaG&8ueANzt4SqI54*!{3(38WYVcM; z>TtcQL7m<>vuKuiLpWv1puFPtTm6SF?l)?$r}QQC0_D!m;*M5b?m>O;)~Sa23~k=c z_%++|A1CaZV;w%*axgV~Eb05qmme34*;}65TOaR(G@!S4M^1s1_ z{lL-t3)Yl{PM7_B`J=pnBdzT{J)f;8YPq!KTd5~j_gI&#xpW}r>=$dvYmq-|j-!BU I%PMd959gs4Y5)KL diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_10.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_10.png index 0ef6d471df6c00a27ae6135757b3fd98337e4f84..7bca8d134b519d608dbe7e08119baa6e898c4c12 100644 GIT binary patch delta 592 zcmV-W0Z(3wY5BCv~{jz1vIG19i(f(b)}2h8c?IBX@9;B)Rx>0Fw{uBC9pt; zCe^V3+=`-`V5=KeCDH^b8CIgbUmIfYA{mq*U?W2(J9>OI@mE^!B+Vu!`RF@i+LGLs zrpap$YKbHrt4OCFY;H>$j^q}3Pm=7$85Ers=A{V%>|F;bfH9GGT93J;36Xi@!6Kv& zVB*XJoe;0WVt@Jb$y*G0@12H$q*NLmJ(47={v99y*axsz(d{x6Ew9nsW$r~L7O>`d zm%`T^)nl;s;lNL_X+Hdmz*0MmYQEyL1+4p_e#3)rCI+ilrNy8H5mmgVe#JTQkf06Xv?GQM-DUfEzO#mx}_h zmjjYA@+<`E9oQ*>PRTLjYA7VBB+aGc>aAas<5pvXIrGy-?6a3$8kqHp20^E&LRhj* zAcZfbu}S6x;3p7zV7g@Rl%=Q-mw)ZK^mr|tBFLg;mp=Rr(W)(Qy$_RkO(VRg#nI{` e%MGm3!h`>5^R;5&26(gp0000c~BE)6kiBfbfmU+P)c=Jmtwt=-Q3xgG$h%?KnW%oDvqP=X0w5nBpZ`O0#%#A z18`8hT5YM8dg0Kb=-@TZh^QSE3srlJrHmuB*j8Im${>hJzW}lR;kdKA-}k+JzxRIc z+Hy9bMhM*Kpz)R8j3=i9xT-KvTx=%MEFzZkw z3*~0a?A0@Qtf|p33-D@9@> zhm*)6jic_sNsZ+3yq7@H!oosPp;W~Aa#1mk<0vLUB@!Xf5c-QeJQWan{7GR8B;%)j zte0mw4;->c*|`EnN_%u?DfG;8k>mZayy;vv3 zWKxA(D;68{TB%AwYH_(vu9xWzN=4Yli?FyJ;EXDr(x5eluqwS#r&1a*Osv8&rA`vY zrg{84<)N9dUl#Zs#cE%QCGp_rE8LR>Dvg-)kfDUsnyno`-3QM}{1 z)Qxm0kbp3}VKxLUcj78qN(-e9sZ&ThWlkZkqU1uALyA+3RK_s43PAxyG}JZEbx~LZ zS~IkLHWuLUY_J#)m?j?>8*^~E5scgzONPxbG&BUZ+2?*(4MCCbrIA`&pzXqEi?*JJ z$CE`58+(7;u3vA^wcL3yZ&uvJYkQ+Nk`r4#x%>6t!J+2z{7YB0?Qq`AiYi0<;;1iE zFB=10$GSy--C7$cO|5c0jCf@2A(}S-se!VN>7K5uzTVN7et$~GTLV|q5B{^ia#{87 zC*sS0iHKRayI}6crKSC=HvM5}{dn879@D2YdM1=t5~s7L-I=4`qILRzUVUkUHTPak zTetDve0b-UuS`QhSkYt@ELm^A)kQ|h$Hp~91~0cX%dUq!1i`o7wm4*#SLt2W_- zlOvjMRMZ@auw<7GLgpf@;ioeRc+~xhL8~UxR58JL;bucpG?} z*&A--qb9*^^{dh%s!?if8k3Bk!_SX_R%n#2wrKM^QSsF`%xkckV!_q}OB27(@z|{= z8~VQS){Q-KVqY|5ta@;0e+<;Wzol+(mG$wrT`ObH_RbZ}LpNUP`*qhEWWd{bul?`u z4pi4|JN{%Flra>wFe?6w2k^c@IC!m;&z;=2`$}?N&jb l;q4O_7imw4KF~ytht5O^>Z^8?#f5(EX@*SlknY2h{{TjCTkrq? diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_11.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_11.png index e6f397eb8e756f678dcffb65395c194e23b20cc0..be63ef5c408606fca38ac288e2ff43497ec3c39a 100644 GIT binary patch delta 730 zcmV<00ww*T4(0`r7=Hl(0002`twPcO00ON^L_t(|oL!MYh#O@XhM)hRNiv$i?t;)3 zSIr{gO|tf|DcE+PdhsCc-O74UFM=LR(ax0iP*3&NLY1!Ip?Fd7BIxeSdQcDIE+SSC z%?Mizg*E9m+f0&~c|9a%jo4-w&o!Nlr_$hadysKYyTLhuL{>RniRD{vSC1 z=Bz2^XgXsGaW-qZ{NbQAl{g_J&tB?IB{g7l?3?R{xl`cy#>!N(Fc-s}*1K5h0LK4|9Caa!i(OPQgBvHSE$ZmJonF_#ACc5~pASwPE>eWN{Kx1Nqco zH^#*@_R}(~|9^Z7Gx`)u<=1h6Z*6tu0nW9a9Rl0Z99M3)tm}_|`!Z}Lb{tG0Je0uP zb7?#V4?_juyZ6CnagSb^R{)O1E>PWpGB+hfI(4IE8LSeXcYdz}tO7Vc0`90IMf&1K z%aWe~j$|G{*~iXbcr5g&0mPV3uw4gInv>i4Smoi98Gmb&p6Xz=T5~Q2{f-Lht4?Gy z&OSZ36T02Wj)nb2=Xh$?5Pa?70`KsWM|`+pVjck~cERmk{;+( zXCxHgoqz-V(HRISmkLSR)8DNba9;%KpBK_6 za5{xF#4GLT2X05gT~VMO*hh<|xhzrrO@Z33bFpm_Qwn4m&eyq>nP?@in@R%JpZb3l zuf^5%C2+l#ERMV2EUkr{49UDjaGx6GMQNwH9#i>vulHrO4i*L<$KdUP&3ysL2NqsD z2iSx6Tw4!K;Nz6v78q}Xtr!#d*vBP{+8>PtU|$`V^*jKZAq=E{0EHV{$U9+-BLDyZ M07*qoM6N<$g6F7QIsgCw literal 1826 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 diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_13.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_13.png index e43b1edb862f1f9b0385570683d28d64f80f3f73..c385a5ec45529fe854405d541ced0c0f0359e2b2 100644 GIT binary patch delta 581 zcmV-L0=oT=4blXV7=Hl(0002`twPcO00J3FL_t(|oXwKIYZGA@$3OR8OezL?ijWTd z2@ZDA3>`YO<@di-274Vq&rra)NHY6`?9wSSVeu^^iQ1piFYb46)I z^Pe8ADPBk^fbMiI=!0<}ZxvGt?hbxW0qf&XzHi!4tOxaON@0BLB#5HqYt>LgkFQ5b zMU87vPJGViR1IhD5I6$1A}AiV#2(r0u770uI+D8CfnGI?ArpeVzl8^o1zo)_MN9+3 zWG6A~4S?0Yh=1kfR(8N>wgu#=Fns)0-u4a7GO+7gi=O?gJzgfFAjOeYaVhLXRflZ~ zQXJ3g1qJO_9+@Au2Us;U+M?slnA;f_;4DmZ_!fW`*QKzH-k0prDQy^BfJU25CO|!$`Gf)&EBi}+62M#QU|}-7%g^Y`)R9M3nmwlNehU!6iJtFYY+L$6 Tg<&HF00000NkvXXu0mjf<7yFX literal 1679 zcmaJ?Yfuwc6y78lsR-f|0j=x$7(kNUY@Qn)O0q<;BqBtOPRFv@?3#edhGda|f)Sbe zKr9wI6kr4ByL<0Fd%knN zbM862N74-IgJ(s|0stU5Wdokh&0g+a7bxJKgMshqxhb4YHnABD&E^p<3P`drW(rKP z6T7H%im>G8v{LZ^ASkvOO{__uswNq`nDFU{J$5ID27vgr9w$L&Q!HqvcG(;W(CD{U zAkbz>fVRo?h~BBCthNmWE-ItIU?dB&Nz4MRO$6gTYR-V2VhPY=-|cX#JqggHT{XA% ziD3wwRAI9dpea%&eHy4`TokAjOGG4sAfOTxQx*a>OKF0P1yKZ*z!GjKMG~bNm8vBe zIDJ8!LzjhCr{lV5cib)kva+mG4a0ePdEz{&m~ribB^ZXm2nwU9h|>_c^BpYV5jor| z{1$M^O}cDO*2XwMpGCsVekz=FY_e!My{1Do z0zo+(s?lh5er$@v%@Pih^82-Mey6eMYq4sriy~OYWn`G${vt@TGA!e^GENYciV-kM zPmnf;PZI4rp{amz%4OR_S#&PO4o;?6ZF>a;1VOpDB`T4eP@p0SDZ@mV9K}R5Em5K} zOi2;_Uy#O@TuIgGT=^ZPQ{1gHofa% zry+v;h=x;5yo0jiuE+-e&|A$nu^g4&*P9auIsPc) z?~9EecWK&2Zhtp!ZW-WzVmR>d*8P@%eq7gJ>ed|HOr!P9(O}l0(?9ah-$~t)=ky#c zz8F>?AyF^I#Uaj}gQ4RWmzF#M<`2m0hR*O;p>gjLi&Ay6e0lT{rZc8+jF*TMf_S;Z*SByecoW+LBd^$iq_wXusXl6N3_M z6B#H1<=9qaY;7izdjD3+fOnftDC0YSDh7OCD@vnb{jHlDJGo7;CkOW}1KNk7L#$x{ zO9NH`Hhe;Wb`97*_Gy=ElW919_%1<8BOTq)s{!$_34d6x069b?kkwGC^3zVkG$Il> zi;--|>Nq%PKuu+p2Uu?QF^EW5t;+KSDbAtDXaL)0bQ!RodXbJV79Qb;luK0&ptKv_ zoAef-7}tmn7T2yT`RJi^tQZ}*Iy8r$MSMggl-_Vpz7FPHI2X_IN=;!s0jM_@GME5Z zw}D6p40zJ{`iJt(N`1L$vpdpN#BAXeX?VrykOcgW=H1!Lp9}~%(}8lWdQ&l9A@bTh z18O)I_uim<14{6=F9#zAEaCU$?i}`~fdZWHQ|80xCCEoomxjm^fX-6!gl6a)JR`tL Zz&~1h3VB{;Br5;_002ovPDHLkV1j$>BmV#Z literal 1714 zcmaJ?Yfuwc6uuFVhXPeB6{xz6g4U8`vq?xc5FjMH6exyJDRzWqvw;ZN4atTCY;D8` zQWUT=DpFs?%4iwt3mvA^f{LhhXhB;`6<-KeTP@IvQc&pziS>u$&hFlO&z|p`@4RM9 zlapdSJ^VcY0G{!2N)@x(m?zTBiFx(psSC))Xau-8X0@3 zC=pIHD2N1QfZ0Fkb*K2keJKo;4lnBVw6j0FeFQ$#qeMVfe}8B&)i}TUo1rgQa%bzTx`an zQKOZrlraK+k7u!1xE2AIGG_DmD2no6gohv;MuTH2Bx%gbAx(1~7L)eDMjcZZEKf<{W<5dD@k$w+`NGxcG*WSl zf*&P-g@O=~oX?L|$OV!Rr5qJSi4;Obv^d0J<5gI>T#TZKFiIRPj~U0pN|6#l#0pdt zBT+`f4s1MWqA?OD9Da3--wCYzwOFabNMJN&R8v%*qY098D4H_mPzDGQaA9acB8KZo zyX0Mag`NkjB#gQOLK9=8^w4;UrMg#8fMJA*n=j#run>g9$Au^d6(J}`tL2LkAu7f( zNfvtouX!nT&%2b7Fku)RY^1nIi%M_-&Jkz?S`MxiYB{I`6LBOO0g4dglr0+pYhf!l!S}QQvO<4D=22 z*oMDKt8U5`5A=ik*B*mdtoZ7DP;%*TOc&U(yi%m}+Vg2^KA^$C6ktWcvw7gUYfDDE z?SVSB+UJkd;h}(CWce(x^GikhZ>6V#pWWQkap&lwnHz33emyn{w>);Ku#I%O{PJC= z33RSF@#GTLqy(0}7X9(oi{_pWhI~fJ4@b04-wrmh`DH!nyH^5XNOpH;{Pgykxa(*A zDtE2f+X9`bSe>4E%kZj zo3aDp1#Y@S%bX7ksMgiIwR>9RG5^YAv)e|_MNV12QC-LKW2G*7I{dZ@Vzu?T0+Z`S zDeItO;Vi*jF$;1&x#S(6oFj_{yL>Vg@Ywn#F4ZHDf54 zM#en4R)6yE$hNNXZg1z`T|Fi@L+=H2_LuZ_t(p3h_hOICW*$p9%kNZUFDSrs`j5I+ zW!&3UCA<37M>XjWe@seKL$iH2Ug`Z#e;WH)IXE;Y{7A=U-@R3nwxlmRoqphM?Z#=v z$i+Y~^pFnn{dF+mpt`%f!>OY_KiyD&_4fINo_?cbmy6;4X+dmD+zfd~V1qB2Tj~#r zj(_jFStmP#t9VX7tgBwdxiZy1<*An~>=U$LhW5hcT5;cSrC!}?z9A4M?e_%rjZ@1G zTf&3SmMp(@Z{=n86=i$Et3#%PEuPm`UFfQyDryF9M@-HP_d1t=l|e-*JI`e7{?{FJ puQtyf3$~4hkm9KMNvx0EV8AZ*&aK-~XR`lA;-iz4-$Z2={|7Lff7Jj0 diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_15.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_15.png index 96b19669673d0eb6642adeb63c53d5c4546b010d..228c294823cb9afd901a9a7655c144fd2928e35d 100644 GIT binary patch delta 721 zcmV;?0xtcH4&4Qi7=Hl(0002`twPcO00N{*L_t(|oL!PViyLPYg`asfNaJJ|jZMIE zh|#!7inuUojibR3aF-M*((U{J2Maeg7@{{W@=*lx3nG5Mu|d z$+FoMHnv8_AG6ZTds2*qo!ss|oO>^vbMd5mD&<&~;eTa-kbmO8048q$LBRmWS1Z)p zo)su<$O7O)E+3CJ@oL8ifP`oTz5`{z$<>a2)|8OSl_KFxHJ1ROj-Ga;eW}bUFw}iX zxm3<9V2HR2)B%V9O|>COJNWHL5En z0Js2oH)0JR9Dl$jOh^r&c}-F|F7<&W19bRG(&AxJ+#$%oU@`#jdgEm0=gP4FD4=-p z^&kWTDL~};>Ye!!41_>FAn-0%n}6>hY+iN2&cKjiNWv%rIAJlQ z}x%I&J@j$)9Yzs(KPf1Gg;G{NpZmXUWfyQKV!ZlCcTrLH9*np3 zN*#SxbYrA*x<8es>MN!T(gWRWN@M+ASZE>r)0e#<~J-kU&5^DwZ*1Zloe zoRyQFv;7SisO>B^aZv9<08)9}jWv_zc>_Rl-%3k5kji|Si+9_?4dAM+6x!&^wWX49 zncVqZc2mI5mY`gCX94fa)yP9-A4+nw*Fg6qxeVZ63S519^r(5z00000NkvXXu0mjf DfALm; literal 1805 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 CQA6wi diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_17.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_17.png index 49aa979d745313982d58025ced17c4219ed36138..f5871e49c1ee85fb60d5391c3cdb971fe7fea8e7 100644 GIT binary patch delta 583 zcmV-N0=WH{4AcaW7=Hl(0002`twPcO00J9HL_t(|oL!Q?YZGA@$3ORatr1ESih`5L z;2={025n4!rVW2;3;MJhUyfTpcTuf>sI03gegoF* z$Huy+sjz_p07X7l8m6JrBBL!Im^+e^9R{EV&axZnfz18luTMY&Do~WO&9RDYNzzD? z`jV_U4nV*kfH}Z3O8|@z_z|m^Iakh$FmaxMnv#@DZK*EFFAp$)M_8~wokEh7*?%vk Vi5!D;Y}o(+002ovPDHLkV1ilG2ZjIu literal 1560 zcmaJ>c~BE)6kkk4M7+j&!ldgmSQIw9o6WUbgCv_oqC{v26{b#cv%7&9vKx~X0=1ra zqIk4ZwX|qwI@TGF!ReqKv5Hpg_=ipvr>#~Qnc~rU;5}9==@%f@KOA><_xrxL@AuyC zUAwMu&dlM-lae6_8t%xmy1=>&Jh@2<@V=h3$qAN;vaLielDu*?8xkNhFL?ym5n#&& zm%#Eh3(pACAxN>p=Pr>;ocS~-1=MUzM;!?S0UCm)&xizB&M(NYM=1A+CZwnJI0E~4 z6Eaul#GOG#sPN_0hJ>QpIc~1j&rv)wBL|)yp@D&bAhU2JP$`D#hzaSlOM`t(j3IEJ zitINb{iI5qg)k$91lXV^P!7j&*g&ZTp4E6rFUw`a8eBtQ1h@?-VW2f6O;GT_g#d>k z-b=fz_5pX`WI`%rIY?tzb#=A6np8`na*UuT3d1#+MuP$kG+ZOfYy=g<>2V8IAkrv4&1d#2IA`o;sUl|s|1GxfO!y;@DBh)w+2*g6`(+Wo!n0+{T-*7Ohpo=nQs)&1{chEsWh_(c0~L3!%5$twbE_ z5W_Mnazfm%5BMFx+TMz#nUKKBQphbymGLGhtdL|WTpqzyd}tu`u6li$NPYWGu}W9*F~5HceB?$1Zg)@IpNUqQR}CVodDg7tf-IlJ-H75rRx zT}s-atz2%^(BhQ=m+d+;BsF(sY0tEs9=&2;`iHvHt9EqVADJeO`}olZge%e)`TV^+_mCxuzp?9{huCY1OvY)opU))kDM((HYTl? zd32T8le+0~(zBj2_j+y4^VFT#`Ppl^J4j_wSvq{Lw<&r{ zb-xR)?OK(8L$`5$`;((vE?j{2{qo7`B^Prh+&g$h6n<-%kbJBb9ow#YdHb7rPnF$M zmS6qsz~^5a&!~KuH<5WiX>s&H4z=yrj3q1U{_*b~zkF)**7iG0+blMtb?Bwcx;%IX mesgvHhPv*JCBMHMJs(n}4LZ}juem7puXfnxSPxj{ulNsC?K+$Q diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_18.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_18.png index 7739e294ac6ec6d9d6daebb993b38f8c2e693474..d2a276eea0a314165b9ccbc5f4b52757eae45299 100644 GIT binary patch delta 535 zcmV+y0_gqJ3#0^)7=Hl(0002`twPcO00HYsL_t(|oRyO?YZO5khM$?78X;&13Rd0~ z7Gfb5Vx#63u@O=PECd@eaTF3aDAZwG}fFZ4>GaloPWWPg{slB7bCq~I|BXxs9} z{~`6ll(qvFw-nf30qVabE}1lvgmzbT?06}36$_nC)cGpEtnPG3PXYxXAa}7gia0nN z@XWLWhXpOOQZ>eApcawOzz)E5suU5n1NO}%PcYbda3{z@(RQEQG9QF9^ZYc^-+#H_ z=60M0uxo`bMt{ss1*G*Aj{#US)^hn+Oi=FYlag_$!TFs9;B|$D-Y-5-@~gf(aS(5A zUsAWD)E~*}kD$4BIJBK+s?j^gEL+IuTu7rVR#s(N0}dU{7$2#+2uucVeI9qq z{eu^-l-alZ==LN@c^K3w0DgqoE&z~w!4w9duz(C;O%z_P`Ri9hEgKw ZH^N6&co5LLA;ACu002ovPDHLkV1mqn`(pqA literal 1492 zcmaJ>eQeZZ81ER6-ExEBrhI6ibQ4Fk*RQ+lweDcI`(Ov$Ty6&roUpEaZ!7GsrR})e zLY8BIY%0zP5fn_w$TY|Vf(}2B@G&9IXfU7{QA2<%0mS)%AJc*7d)p5AgV3~n-}mYB zd!FC()%J?=1v%L>vJnKy@t1jma81CcBr6lX2eLW>aG7p+tBgt|Y{Uc&ATCL%1*ktF z)PW!nq^33fpcp|iTjfxdQ59Isi%P^Iq;xFthzijNQanGd3gT*DptYb*jykcQj~v5L zS#n}e+X7@jb%T1jtXTt<&E+And9}z%*!+2Dah!(+BES&Pc%&h!^KmCOVwZ>el$gNK z5fx*#6B{K}6{tYniUv^DLg6Awk|@hrfF#hhOjr<~KxvYu2nyaTPO&`A@DzuRT^Mwz zNnt+d@r}8ICnr{K7%EQ?u~^I!V=RhRM^GHc5hP8}G!8Xzy(wx4aXhLQq%C-WE^4xB z$VwDVSrlrOM#G6gvZGN%)Ii{l;ix{AE0{GRE~o@$A&E#N721flZUn*qH14UbhniGC z1c9zJY9cI2xF8LN>ASz9lpp2~ zQIyy1VjOmli?fy5+*Y@jwWn>|3tQ?SefCn?$9i495iDtC-JF&4xx6e%mwMA!e^fVw zs0h-2W$1Sd>%A|QcWXc}6fLAE4e2JRs8-RcJI|576Yb zK=Nry1RY5+FW-X#NzyQG%7NPiJB?GKmBTq3&EerN#nM)e6$M8vHinn(O5JFeLJ15* zO|#)eTbOf*jEFN56UN1`HH>o(!G=2|h7$l|1%Pv41f)o$y5_DfN{e7?rnYy+0v_%R z7Kp-W(%{(a0o`UeauX{ShrG#T5^k5AJlBFC8Rz{TS15kr#%n)L+CXM)8a|p_L{K|l zedv+kj`n5A>yFKRU+?ct_Rs$%Ki)F5&sw?nH~m1e|Mbi<&>upYv$huFK#2ajfrDJCYgB z$$Z_LFj0Fg=A8u@`NhkHtu;NulO&B*th%{#s{akC9f*u7!O>B)Tl!o!Fu{?FMP(UO$?Eg{18?s8yzhs<6Q-r~%VKhE%Z_J+7lT))=k`kvWPSNDn_HP*6%I%>@Tfp{SUt87d`+0 diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_2.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_2.png index c36e54b2fa31dfe36c236ecb570729dbe8a0d267..c5e8a2a5b9b2f89fd0a338b9cf468470840e1598 100644 GIT binary patch delta 487 zcmVOC=x1CKm$^I5k)GH9ir$C z@7+(~Td&O{u+`|>*_mJS&l)j*EdLd-|A1nBK1HK9bQBKS-G9_lV-{Q-DE$$DRV(H9 z`I#E7=;%cms@MW}X?mfp1#Qp{AOmd^2XF#K$}oTw>>kSjL{OX~>qj2+MmS5<`r^T* zh*Lw+zTn?nFS+-=Gt$@#TPt-f=FH4I)NK=gN)|mZV{L$LgaJL)cO9@_uWHn|`r!)F z?dcO%pKftV9Dn8ZIe<+D-9C<~cuUrN#y&}0&wSg3Wwu2!&EPERl?JkQ1z?P`aGU|y zm=k`H)nMni$|!ipaFKj#X9Bw4R#MUkRwmjG-aZ;h$*rlCgZoWM!S9;xT!tV6HrFLN zGh_Axz{wb|^zLgQPs0$$uOxjeS@Kp~KRHQp(eYYq|=U(jd!% zE30+20wXz`Z~L$c{&=uj1>Su=SH+rMdbI{c+h^pHi$l%mkfiChTN4B1PlEd`N$Q8+ dP#(<>=r5DmV%SN4xJCc~002ovPDHLkV1mX}-irVL literal 1472 zcmaJ>eNYr-7~hj9AZ^OZveLF?D420?zwT>yIN`XxlN&i;0F$PY_IBTu3-%w3^@;uZNN;))89m9VUZXr{qI0}9Xu)KDrz5zcU8lXf|{j)@5j zom9~)oY)kpQhy=pRyBay%@i(@B#GKtGmr#2z{rBQ0HsNqA}BcQIA!N(hND zO_I4H-aG9M?wnY;u7^2-sI9Fv*D_{RTTW0c%Mv6_&@>J;@JL-q7YsZUNsU|JK}6Jo zVLhmZ(3nLbpjPWn43eFSLJ9l*Hw}j()476KBMc!-P-c=)lvrq!+7Z17{7>Vy+L4mF zFd&LRM6K3DcqMXb91PQUXGbwb$c8J>g7991N?sMK6%f*Wyc2^bW+^CfcCVYtVMq&O zv$`nC<90C)8}DMRIaasD?Xlb9Hg1Qtxos5GC+!}WH->dsToj+fdvbCdHpXSQ#<9Lo zL>EFLi2Dsfzf)Md_l{W3tpPz-wGvgWj2A&+xvHy?ay5+7jG08!{el<_#UvTA8=4B3 z2U@TONM21<(8&~Y!P`(ENgBpYIdH3Bqj5^KusCa_SzMMWJ8fa@qTmQ%(|GBY)J;_> zl)x~;aWg_$9*}UqD{a3`^w+?4nPE@czjgAcB z*qemE?}cNT$)^VNfB$Up)h|L4nMI}pv$H+l7iJeD_qFg18A#POVkEIMG5SD5w|Qvj zK!Oovq}3bK9_buDhd1v{T-TFs`l@ej-SM_dFZ1(KK5E>zWAm@&BW=|tIWfIs!?#K6 z^HPz6Z&*eu)uWfJhvs{qIr*u1<k>fG0XvX|NI`0z-IF<$o2d(RJCew?Xaxuq;Qd-Q$p?wPBeYs^hUT7PGjbvNI2 z0pEHt?+`me&RpWP5 zUhYE9_07&O40a{g`4-iZAL_PCV_>4OmS+vRtIvwZp$F&QEC5@6G<~>yPw}7nwv8T3 zl39(rThzWMXMeqltv`U~>Y+JX$R22rer;8J1@jQQ2H5r#fbK_+s_a<+(_+N1$E6YL zd(#TX6WFh$57#H4`)RQcKVfmQ;g{EU29lbth%&xWmy{`;f{L!52KMLuFIicVq#YHW z8QlcvGb$#%_7YH!AH|dL3rVT;v`}&H6>C>&7CriBs9dsvywACm+Kz1DX$3fV*fO3g zR0NTQcRrWfll!9w7bo7Y`Ji?rNm&T$1OUH6whI7c9z=Nrko)aTeM}Q)7(YHHl_?IF&1l4&rwc6E^}Z#XD87ZD*NR*clX95!oYC6p#_3GaSXDvlj*( zs-mAOcerNV!IK3GXqv(iL^K-JM;X1W)({lSvII#JG>tkt@*-=svvf;L<608ef>yU-I5D04}4hsgq=tW87j4nH6W5`0L z$Y7-?r`^h!iX2wfU^CbY?M`D+%Er7{nld<@Bx`h9T}iBsrWupVZgd&!CWp=8N?}XF z5seQEAmvv|`kld=o`~h_D&RF)^~!Q>stG&+S(76HSwU$=Pof2GUXa2`$&1Mf%>?WK zs`MrhU8)>Hr&G*H^H3m38pchTa06dNr5mPa9h!LWjBJPoh@-#y|L?e-`ml;m()4gsnPr1 zt6jNEmA1woHa+OnOpG3=+O_rd^agcWH53^=QEoN7Ddw>W~BE0^%pKq01PSHvYoXbyWH>scRfA2+WX6C z;ZOEaE^_$UA^P^>-_EOF+kD@qmu|S}TQ;?3DF04FvuudIPZt)uA-lryar3E(anYf(UdVDljx$)@W!mZ!kY;PFeyZ`$p@~2bY)i)T>(Q}VE{P1Ld mj%~Lt_FOz-y^!%B*N2?=EM2YG{9|VFZ(8CkbDXmI8vg^(c@A;_ diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_4.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_4.png index 2c096689a8a945696d57da9e0f3ada1f10cb5b16..41575e79f9a4f21761c5c9965889d7f7dd8ddc36 100644 GIT binary patch delta 512 zcmV+b0{{K#3yuVk7=Hl(0002`twPcO00GrWL_t(|oZXW#ixWW@hM$=WUIe);qF`lG zSXjvwcAmP3jc`T4La<3Ht>o?xND{EfZ?H;nprVD9*qLadR$g&}s9g5&AeEAw$FXZ> z_qE8*ZQ@UGs^OWL_j~!?Z;V)6mj4Rae?Ypvctw+!v{Wqget$zNm3eS}sOU!ltQrx& z&(3MMw52Cmp<+|usp%JGEvQbj05PaXSb#%FBgO@Yzy(sp7SDCGH$F@>NE*Iw#y!vsp_DsMS~vbn|9e=_8MGz zdm3qT_GBN++JD0?M}$FQA2aG=+r!QP2Q>gw7^3f3v{a)f+5jh2D#58l z{nS9*e6b(RVw>VD9K-}2XG0G8MO=cdgL-?6g_PHf%Ou?`R|~OpzOF_@0j!q40PMcH zKatwkkE0yksY)vHF6rh)$ZY_yu`bD(xv=j7PR95K-FbQrBvH}C=`%_1GFE(*^s|Oq z*7%wSKc$hYXfN|1lai?7sxAj6Gsv>!vV2^vz(@|~%iha3e>_;rH#^?Pr(CS+t>8ACh!D?bd_<$!3v$Ly`u?Z^%ZA4f+eId~)GziMtB`0000Yi!e26gH(mno&SQtbky+X0X9<{7T~3G^I(LG!ae7LIx3&*c`{9fhIP#OHv>O zK^f1M@`Hk4(gtgV&;}EO!gz=x*cfP=3abRwV5}6z8&Ntj7-DocZNvD1um4bs~@e0ASl=4=KNq@4!$B?e=z>3+vo+;D9stvW=at)!7CzU3risp_Qd#k zqF?00l?%^`1rXGKMKlo9g5DBVkYWZttz$^WWPpaCf@w*a7Z!*b91`b6<5uLs(PjjW zhONkKlNa~O4zVoiUaW{S7ncTv#R~)`j7%$p3z94_5EC^XPR7dPDx0(-J$6~JPKz-F z?orVeSdm^*L9Y*XNQwy41_Bju9EWMfAclD|L`8UE3QXc8ff3-PQG#YkiX|Ah??He= zB^+V>oU6|r*jbS>O_Ny+OC%D81Z9wvc^JVk42F{!NuodlRV(8fpG4#8_>2WkR0Sm} zYf&iVVK}b#Gx+mm{>C}ScSG!h|b(#X&PZwVoN`0z`q>#b5C z0b$4)HmqQZFcyIlP%2DCP$6QBpp1n#p_VYk@FHatMaF_)fFhQznwP35BLbzFUcP7x zuzAr~VjOgn0@|j!bkh*fasz!O0cUr2H&}jnvb73=`rY+#wm|Z?dt1-fpMrJV;qLC% zB}cY%oZA@MKlEzj&4xWxZF>=SC3&re21E0JWe?$FOV3pfdA_oy7CW{6_vfd1>y}t* zMwNc;<|l7<{M7GQ?aAZ#t|xa^ukRe2HS%ZE;JP(XZijwgb++6YTqEVcrH>k?7nKwp z?7F+Dy%5WtKjOs7%hNB+t-o9d4VZcV%X2$672W={MQzBESAE^MZ}-(P`a{&PyQiD? z22;g#rq)%qrmSFI7w&(5_*cAV%IwIcZ%dXOoHa5vi9UWWHPM`FoOO%zHLkvHMt`i| zIN>Avqnd?z)1D4`inQsMx8)Tq{de&9#IIiV51n(FN1fQ-)RMn@c-F9~4;KyzO}KR; z@x`|KLyr!wgN_W{qubD4oIPiJj&6-HyDtCPoiXQcd{F4p$$8Dlur~9S;`RgY?7I2! z)p0pj3Tt$}i`j1acvXD#fSu)jarKeGlO6Z2G!r@R{&SLQdpzU*pfkGX4dW2&Ul&*G z*sQe79eQK>-`|W{I<~o?s%3jlhdU&%ebBn~?JWle?z;52$-VWWucAG%?K{Vu!;8qS z&hp5H&en++_E%!_Q~p7-PInci!k>FP&Q88=dscmI$!FcqnhN%DHv-xl)}xb>`c$xb pgtYheTl_EU)u-GU$z7E_68d3k|D9O=nEdq5*W)bZ_S!#L@gKt+D2M<6 diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_5.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_5.png index 792719974b8f9fd47ea7180e8d635612b9df10ce..f7965d9f7c1bcaf3dd18bac4452d127da2d49e84 100644 GIT binary patch delta 520 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 literal 1442 zcmaJ>dr%a09RK-1PQ}#7rgFq}2@G{_Uw7Q?$|=V^N-WrFG zivSNTqdmrC$}(qS8XN3E6w_D`di@SK@(;$H-TnQ3-~E2R z-_Q58&lVM|nll zRr2#5yK~GPI$7{?O$+fPSyfe~uVVFzT1L_w$B`66G7Nz24GNg*)2HwqL*ZeH#u!|9!nY6 zY@?N?9X2a#&bC`QW1i7wusKZG2^$k(%}%S+N*S|F4y$tnOBtLt8*4H+;x?>I0_zHf zH6bX%gkKr?9m5*$h~;f66f{NkDoSOd35v=UO$nDPA&g=56!wr?5anQ8k`=GeXux); z%1=SbsVV_%B*nZu0R@U;P~5bcFbdfWL5l{C;EW7M`2DnrF>oePF#GT^ymVXYM!OVA zP#B>E8(uW}IkU)$1S_$ALi8K_1ZNhEgjr%a0kQ@NIWtZoie$WNZtJ3i2(@N>J3bcZ zFg{o?h^9$JW5fNvw*ZaYw4&8sM=TaY+qGx9qX0~5cG<1o$d%s?ezor`rgLzySoiW* zGN;{BvOl+d_P~{fzeDpr-uX`Pd%knK=EaD}r*#7Zo?dS7KsFy;Ms6LNZ?k-Mtg~!o zvi*(D`k_npzs|X_ZLsCYt>Wf>a8dqd4mKCm`I06r0u5=~hAiMm?}iVPy1@I58{SPS z>8JvQ%y*NUuJ7r4#&#&_;5_#i^DA1x^+_eEXNH|$rcxe Uat0f1lj46(m!rVmmRDN)9}k%S>;M1& diff --git a/assets/dolphin/external/L3_Furippa3_128x64/frame_8.png b/assets/dolphin/external/L3_Furippa3_128x64/frame_8.png index e9246c0b7ef0569d13ce7cd90ad126c82351a2e4..2cd571dff7b471a8a858b552437c7b15ff9db19d 100644 GIT binary patch delta 456 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 GZ1@jf+6?gk diff --git a/assets/dolphin/external/L3_Hijack_radio_128x64/frame_0.png b/assets/dolphin/external/L3_Hijack_radio_128x64/frame_0.png index 6fb7de66c4f56b8ef4aa593bd7d3541b7072938f..0c47516c25ee00d805fd82eb613e66753e01ea38 100644 GIT binary patch delta 574 zcmV-E0>S;u49f(N7=Hl(0002`twPcO00I(8L_t(|oaK_gOO$aO$6ufC^K_nOc}-;~ z9%Rs<=+cl5cS3L(4Msy-IkXD4IS4*;Aec0`L=hAXLC_#x4)+{EOW3a=1P3jLAdrO0 zyL-Inc{kkEU4KKL@%?#!e!M@QH~d#2Nm3o4k^lq%IKWFAKz~V+6an44Nwtw`Mn`d? z2VB|A%+kQ=FFUtG{1)SE@S!k^`#3qcJUO@wT(gjswjTB%8!*%k6rRqKYM;_Q1YR59 zt)#$$HU=J$ZvjU}U4Tuuv~-m;ms7^i3E(gVFmjz!%@PYZ8d5z6?yH%ZZG-^57rEj( zB}r%Iuq8^5gn#QaGqb6;octVAGo)ApV7wR%>-hFTJ@WSf*jtPeZUJ8N9^UxCy6)@} z`^~Xhc!2@f-_<`&$wAaoy9c&ZX=5BbG}8NiixEWx6F0!m0FdEWo*=tfZ!vz{r+8^I z4bLS>-{`tK-%-ug#1jDC1m~}MB`KEcl_U*^_iFPY=zq`mtA)|WiKP01t69I9<$o=w z)VQvfv(>Gcppbu-0OVa<2B4@-0L!vI)(2b&?Pf(%O@91(Kya918X!uXmyOLV4^+zm zKhvzyzq&Q^5=uKc>0Ru+Y*S2mB!u_)@lM}m*nsVQAZyOcy^<6HPz6|{4;X_HB|X{} zCB==VCpQuX^j$5(#EvXLN%cmFB}f(d;59at?}6WLOS<77^D_&M-@a$w{bg}64FCWD M07*qoM6N<$g3nP1HUIzs literal 1611 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 diff --git a/assets/dolphin/external/L3_Hijack_radio_128x64/frame_10.png b/assets/dolphin/external/L3_Hijack_radio_128x64/frame_10.png index 1e3890a7bcaa73004aa9f340d1f62736a89900aa..60556a9dd76e09ca304de8e12cec056ecbff22e2 100644 GIT binary patch delta 599 zcmV-d0;v7!4CDlm7=Hl(0002`twPcO00JvXL_t(|oZXVoOH^?b#XtA^UejojMvD{- z2Qp}(Ihz(KE{XX5Kq3MxBBB3p&g5J@?*o?)SpqNCBCD@c#iMNvZ-AV}F1E00($U1IS5|%0SDf zxKw-E!sW%GR&aSUGfRR^ek@!G8+)9M&*aj$x5M4D!`-vMISZL<=wb7zfSyJo`*55@ ziigKCY35?5KdP`E`(CPA3zHw&faRlpROnnjOh2q{04a0c z;F6>efKU>^0-ZoV^eJxDs>mt2u{8D!_QiDRdwoGfjub#n)mn+gNJaVJ)tt)rz{juO lT#Ett`Jvj4B}?N5jz7vb=kqtOhZz6>002ovPDHLkV1oG~Bennl literal 1642 zcmaJ>c~BE)6yGFrNXjutJ*emsY>Sp8yV)F@NGu@w3G8ZcAC+yxx2zylRsd*m-^Lw@&Y<#b~VGIZ(2uy$wT?mOeUgmhx8N{gpA5 zmoGf~_sP^zYm_xlSDc^jp5NR6>%*Bv5%DLg_gK=ynZK&12}ie$^9lX$`eWPXpyI+Y zAaLWubTN=(zP&dBs9ltkaddO{v6y+eJIrg(G?W&hvi3>9(RkOTI5psJe4ZMOW=xHf zR-6|0=QPTC#Cfs)Tg%sXof>#Pw&Jp2WzFeYQP&JE0RP%3=(zi_uw%D%e8wR8_vSBd z)Fd?=LCn7ie(xfnz8vLsk%%eEOlm0Ky`hoy-yYBtO^QxItuX-*AM6oquWJTc!qz_Y zZxh)P4+-Xq`+>{TI+h<5Grdi_QtM+j29Ak4WMMLYq9AqqEhH&25iU1w>C0L@hZ62P z?&zEyU=A0FTiWU}K1mzDXxX_dnVPEwPvfiV3N{{i!W^EvF_7Hlxzzhd(|zh-cw76N z&g50~f5rp?mD49Ixu>+J4dl=Jb%3&4DktB76*KI5W{keXrKXW^l#;fCQ)!NJ~_v>0hC;;bW?NRe^(4V^(Q-Pd|W&oIG z9=>B~p7gW=`$A5vXi}^4qi5}cN`fJx0_E6w>B!7-KApj+SDO!OZ=vKT{3nH)R;_UEaXo_jq(#C>_ z9BF{Os%sRBkyhk`x29CS2Y&5a(g^=NKO^Ay4L5Z2fP9l+p#T5?07*qoM6N<$f|F|} AqW}N^ literal 1660 zcmaJ?Yfuwc6uwD_I3QKPCu-TQpisKm-E7`9Vn{-bV=w|@97bi6Y#>6iG1(ZPP=nPG zY7wk;v=(v7SO=A&)wbH!VtgUBv_7bcS_j8bYq7qt;{&Ma28i{CkkumD$D9p57Kn8UL#dar)24H$>v6D0xQVe9G@@)z5G|Me;>I`Ulv4S;Vrx+3{wih|viee=^U{}HJgJKkh z22_|rB|J#Vs5d}r+C@Q90gjk441=U{feEw9Oq3jZ2NGgJ9L0qwE=Gj7LMT??Vrb}r zS${5zRgtMlAM(bYlyCvVI29=B^?C(fLO{FnQCu#UqnHpC3K3QVahEt4vKVo=r-UqM zD7V>Vb22vC0R=6RCfdU&VV3J)5O$|t|H81tJ(MaoX=pL&L~#Lz+U>!}2DIHwCiOp! zS8BVnOPmy%Nx5l{%gk29Iwb^Vv-f&OK}D90Vy?@^mW3?R&}NUFaxglL5@v4%7Mn#O zm55}7SgIx@G8K+%)ha?J(WvC&G_hKw)=DKI8?VBORFqE=Ytp+rpo=b$INh zl`+q1&j~t91t)7_m>p(t(aYUbR^`rI$NA=I%+!kTy}UZGm+$Aa4?oSl!A$~8<$mx< zQ`@0;LGATi?r{fvy3g;Co)uL`^)8=UlZ*34c^ZYZIJ^`pMxT)bQ+yyDCGFzn3RU#z*c;@<;EZF6HIXz43F)!+UA%u-$Ivevh7 z(!qwM4ZcSw>$u~7ujwTEZs zXTWpwE3lE8#EMl27+Y3;i^n9lCIFWdUi>W4_xW1#4`|q;`m4A3BHnC6QTf^v*Q*@` z^ZTatEXHk*ZZ7qhy@F=t?o>1?cTdg}&~&M{r1Grt&uVw`K3()KUGMq3rv4Fmy|Hzk z%^kzCI-tVK^U7*RVmWyc;CO6!@)OY5k0*nLdew9Nm~C6tUn;NMJ2Ga;`WP@Ht}bym zccNAn))sk;)PB0(pD@`<901sb=(cZXj_KqZ+sWSoljE=THQZdZu`BWYc;miSJ!t2= zY4FAFEq~aVaP^t$VMFKSD>~_x3o^d18+-hQzk2k+f@2dZ+ h2=EDM_nzlr%*y{$J1 z?+V3psU$pXd>U5j7HpM*vUIfQRy^<8k^+=M2!hc&f9fEeQU(ILk#?nlE#%rqTS+4*YdC4xoRu@|- z6bdZAeAyXcJ_LooFEXWascjL>NiG!|)KU3e9)O0R`B{Ds%T)<7Y!@m;w*eXM`T>DO z-hh;7Y?#es5}aaQomVKT%V)T{Do)QMS()&BKMf4H1et~Xu4=cB_8X8fyENDb#V7)g zsmN6ZWSmr~tpGMjUIEsra3zOf7_8H)?3jbH3wmrWOkf0#;slColmt!_8XDKY6AuFX zd3gt2XwIGR22KXVDa#%jMQdwoRkfr_@>Zg_Uavq>rsR0FTB*15Y9))?d6wicN>A_z3Mit%u6e49LL$(b z!R?c&0EZ`YCAh&bdBN1|y3+a)n7F8dMT}*1bQElhdoHbnps=M@vyt&%ySM%N;T|}_ zQu}!Hz|OC7hLW69-?{s+*|4>3Xi0zI@uQyjk+9Sy%LS$yT|KNM*f(=ND6>ze*7 zkEJi+fk6qrQ-5{GNj%_~nHH-KEa{5~Bm`2j+eYRFUJOJ8ny7fFWc|rw;n4Z-UxlyR zM(R^Lcb%GIdn2l5-icfLs4%DmnUmNbmA!X~Gb=tk_R#IMLk32{&nB9Thov?OWKZ(isSL!%5BHPmL&{a^h|F)7Knk*g?-ji zt9Wbfn#r#n3~wiIMh-Mhimf;bF)f2f=uP_^9qW8I(px^!DHzqKH5*d;{YNjv69)zi zr7tJ_c&PJ2;=XsYkki)4E!y4rt?^yHmIvql{-&ck^UHR{X?yGaO}W3^)1A*en`XSa z5k4oEcML1ctB_*)r1-&FG0t&q^NKiCZ|VCP&}PH3>~Eu++cN3MnBwGzH~9y9eCfw3 z%MG3DXJ3Tir5hNlBXUZEC#Em@1Z&<~2JgtXlO<5fVBT%+6{ccx^MGl1bSIrO+<3O@ z_3sv5u4!hbB`cgSj0D1PV+T4T*;=!5Q+=KzeY?D;V}B9!aq6idsJb(|Y`P=jXT?zJ uo4&&K1$Xv9KXp)ljW(2N?(WVEOMo7&ed*U;O-k@L0$DBj=JuS5hW`M3kwzi_ diff --git a/assets/dolphin/external/L3_Hijack_radio_128x64/frame_13.png b/assets/dolphin/external/L3_Hijack_radio_128x64/frame_13.png index b5e75921a2adc58f63359a7f8ae900a642554c41..d92aeb984e0d97617e1dd3e26cd68107d36e26a7 100644 GIT binary patch delta 622 zcmV-!0+IcS4f_O;7=Hl(0002`twPcO00KfuL_t(|oaK_=YmIRn$6ufC^Ef-3jk&Th z?ZilHV=ffi#W^b)u$UQIqRk z3U1WQ%#y&0smY@u{sLod@Um|J_iAU`@XoejV7G-_snW1(seq1ZpzqEAiRv!(9pF^~ z-jxJcP{qIlG7G?>E*D_?7j~)3YcQ=wKP`Y?34o1zXqqpvfW;w&_2534nc4FYpm`g+ zT&*N&%^-G>Cx17Et2HyT{xO!n3kr=S$O6!l3p%yr&9Ty)KXdEq)W-1Zg}Io6%HTOW z*nD`_yq^7CIzK&LhPwxxtq$7h->cH=hsD_GM$_q!_h6!5&cZnyBkL}g2H^|X@NvxX zrtVP7TZpb3$r&H+Y+Ba#w4t3v+jTPA6KQ^qZroX^HGi7b-+Oo`$nBU&!UIXtXX;K3 z)fCc2F#^D|U~{jRm&$U@lBCY?k`0BRKi@C(b={67l}@^%tunLBkBbQ*z5Wa#+4@l$T0ywu@sL|Ex^{0eUVPx#07*qo IM6N<$f~hn%qW}N^ literal 1674 zcmaJ?Yfuwc6yAgh3hHz!2=&on8?4H}W*>Pk1PMuaSVAL)7AsXYn+-%rcG)Zts9;1Y z+R=)Sf>J;nb*MVEbZE<{SVd9PX>BdFSha$tPEmZ&+A3BCx)Edj;kYxq_ug~Qcg}ZS zv+GRh$y0)71OostB{fB#!LJ_vO_&(Ke{W3OXyljaoFR)_MBBI$f~5ehm9|h|s)NX- zGAP1YT6l(v1Au^4c5@b&WlY0K+94r)Iuf^o;n4sPH{Z<=WIn}#7An{7)QImLJ}L(7 zR*m>wxe+lkIx5eeQpQq?%F@kbSw5+@is#3Jac-P9;Gj4HbUO;1F5ImVKe3DRd!HB< zgHKere2sXVRF=^M>S&e%l@b&p5d;C1YKaB0sVtNli2*SLLtzwyQ8|R6I3~wYIr#Ju z^ZrQ2*0- zp|;Ch%203y<)VvNlCOv@(hugd_i{%*MV<}*Hf!h0LKNs}vdBR>xm3MI%-=|?b}Oz_ z$W&6fQYTfYv?yxOX{9QKUaOWT%5^fGL8Sfm6gB~d9vDOCt0qvRMwC{O~D+Yl*#P^c-2 z4}TnQeJ*w5P0CC7Fc?1@TqaWyl#M_jL?uNa(khcdYKv6{5vavVNUexUjakJoPZ9QY z&2wGk7xAs>+di8L{_t$BC?`KmEI%~{W-iT7T%akWlttlhXByXGW{8CCj*Lxk3_G_pBgIIF=67jex_!jtVYqWRc*#yBiQ_r_mX9A7-YozIq zQ|ZD5)5`2E!*_0uTm%%87FGt>gHP3OIlUej=)EFbyX$+Ar@ZIE98P*3s9(7#FzE5j zneg4!?`S*Cx?4y74QkG;+#lWAH(e&%U^2JWP8JT|q@(UP?gX3>doixO;*CsN@=MW-Ov9`ecR@>IaCaOVrc}?xd z8IKa`zZ19be_-4E@~r6A zqfqkuy*F5{wjem>J#T2jk-T44pO}$S+7hw64(P=<9}FA#sVpQ1tyYhftZ0r8hj#26 ziTbto*l*$vVgIatfoOTr{$fH4*(HdZ7t|!|ALzaq3n(*c+Cg39wty86 u$*<)%Dl+4PTQ7zsk1j)8yGCy%dj!BxNXV-0K%n0DcStp)>klO6RQ?BP`e-fy diff --git a/assets/dolphin/external/L3_Hijack_radio_128x64/frame_2.png b/assets/dolphin/external/L3_Hijack_radio_128x64/frame_2.png index 6a239a1b69fc34ee2487214ce05396be87d8a1a9..a4da82eaba21adc303c524932ffa2638a9d98cbd 100644 GIT binary patch delta 581 zcmV-L0=oUr4AKOU7=Hl(0002`twPcO00J3FL_t(|oaK_gYg2I)#XtA^o@x36TPJO4 zNx%vYE$!l93nm32RvZcrZrZ`oLLEehLZ5?+Ae7+HMHE4C5Cn(P*dZ?zT%`UQq|l+& z4uT*S{E;-xd&ePZ6aNP9c)sV}d(Qb@_^(Qmq#8gu1_%IffPa@XfTAR+3UqD9mHJbo z+6oih;7Vp@mIV5~Y+VoWn~W2|hukdgN)HK^0T?d?!#ceAr&jfM0Qi2-#asovMjqaH zYDIUqiTuV|&A-F|Y+rif)07-k58Uou16wFJ8M^t%NbdN}Jo>5x6PKZ(V+?mkN|k@= zfYJGY!nyS%ypSY)qvQ5mTP3qAo&xYDI5puFrAV$mZoAWZOl0pC~0L%0P zV=$t)TRxkjsHi^lNK8sUngJ0x(f~!(>Ma%{mF0t1S1R8Fzx6EXf`5*mS#bOX2+H5R Tgx7(*00000NkvXXu0mjfJNXA3 literal 1615 zcmaJ>c~BEq7=I9M>R`cXr82k#q+ZGHW^-;6CFIbcfiy+@lBZDf! zVx4%1RI$~D7&x9qR8m|*V;F|0G*Ty4s&=v(Y$77VWH^e;P+TFA;iODK;tJ%+BZmHX zrj)cB%}>0+lTPdw1V4$QRaI5eDniQfE)>^jG$3t>d`Q?L<>V>^ofvW*3c~BRTAv#B1)ih|CJhZzeiWBtsMi~gY*0HO*xCPSJXbs5 zsP?m{oegjmJPj*SnjHbd?7i4gSP`-zi+B$#3sq+1=n60E6D&rZ7~V)34@0Vyay6k) z83?6XkK-nTo=_`|dW|AqVUQb4DrLmR^RPHBlPffGEFae^!&tSEkQq!kh7)EPZd9ux zSc@+pP(GTC`1L@)Ls-K6LM&5ms-y2q!MiHr-(w7#M)tnV+3s20*mkV$?f=J-@F%)9^X+ zlJV%kz>Xc`)AQU>wIA{2jWOmym4#O-Agx9iMKn&mM{E{dd&m*wIIF%ZD{zt{-2QndkG1@^V8dNToWtBn<)Xxz}Pt9@EXMv4CEf zYTK3g&EK{6zyEdnxSkT!rM~{I4s;Z5oo~>BUhVCkHQ(k%PmFCbr{vZ}g&g9F^tDI! zr-lyW=XMR>*l&2WbJ3WBgjp$XT0N_h?lz_Ax5wqpKN#D*Z8s6>`$`&rd5rmkd#6&{ zHKCqS1xc;via#qYL{w zkoNa{ale^oEX-0}u+{vrIpM+9x)op7@3^r1PR2%UXMaVCNH{D&7?n`R$6sQq*^c>nPVQDe%4C0(tV$bqbV$LAdArm}m; zb#&I=D~EpirFMBvM)dFnMAE&ti1;r6J*7eUYJ0pAG~gY7{%}XsKX2`(w&oN|#>)Ly zuK4$@4unLRy@|)VM&7y~T{b3u1KH?mxrJoJlsv>L<4dw*`VvxS#@q(onX@`u=5?Rl n0?r)x_`yKk997%q{+N+qtUT?VEs4uUhJW!EQ=xHBeo5VbJq$&j diff --git a/assets/dolphin/external/L3_Hijack_radio_128x64/frame_3.png b/assets/dolphin/external/L3_Hijack_radio_128x64/frame_3.png index 8cec74395ec549931d1436a739d5ed4f7aaebe3f..c5ba8af0ef2ffad0cf4195c8f782afbc8799704d 100644 GIT binary patch delta 578 zcmV-I0=@m#49^6R7=Hl(0002`twPcO00I_CL_t(|oaK_eYf}Lf#ees`XPSQ5I@L;R z16FWoX%|7;At?xH#i8KfXorp#;#7x<&s7jg5$qu7q9_P%CD9=-2<;&CYYKE|tb-zm zg(^+cymuUu^5Wm%9nU@YHzx@fDeEJxJd&jN`I1SK-br(+DJ8{tuWOC zPRY#7lEA5*%FO^TW}NjuWpg;6XNFg1hF5^A7O>jV!yc!6Mp}XF^BjrRDP1GrwgB#G z0?cn=-~yQ#I5zJ1*j%ioqo`YH^?GRm93}w9u5q$iVykopRL_C)&CJX;UjX!9;)>HQ zNjkHLEtB67PJg?Zna#dW^?mX8awNzDFj??Nb$nyJUh{SV_<6q;F`w+iZBB6~=f`yq z!lMJ};e}2Eu%p$#muKZvE45hd4X{TWF@wb?M)$H8Gio*b>C@o#0?N}-&7Nz!QWz<-tk(9!p++3}~5r1~A_zy{4M z^Jh7s#&zAat!*v%+04rbAmfB301A`=EXA9N0pMc5^?gYP^1}5Y!C`_qfLi3ZsnEA)f*)iA??cpx3Q@_7ra(m(gpvRpBy;+1(gll)XwvM Q)Bpeg07*qoM6N<$g8SAOumAu6 literal 1622 zcmaJ>c}x^n7=N%(EtaD-Eoj6{M@vARopaB+bzyfAD67kI6wfldGr$&hXPF(!f{H6% zsHsP58m}4}D^+U$IMX6Ganv@u&VoBFFrY-Ttm<0Zt#mpEKH)Zf;QA`VW6 zexxuHX19Sab!60td~VH>JbO)EO&XdUL87aR}1$+F^(eR zDpHvaogh_cwjc&UL0(Uxtk&SD6BrE?vjhAYB z@~YiDZsk2frD%s0DV`Go!|c7W3&N(=(O3A2c zg~~uH)u|+DGNjUKr7=~bNK+UXgGr?f*?1Y2Bq>IrVVE>BRT;#pjWlI2kpxMnQ>0O? z3Sl!{9*K3?`H)`+^gD^AUy0QkM4pudF;5W6Lp@+A6(qq^D!37fmJ>*_nYBAyK}kxm zLK6WSdC~DH&!vlk6B$pj*6|VwHk!55c9O<;m72g9UO{23l4LPOF+szFQp58w{0Thw zLh2@(6iQ$i?hqR-!>C!lm?bbmO%s@%V;D?h;~0!3Z5&H;gjz#!C=My&!LE6si$WsU zn!)Y!sep&)bH%&hFo|$#&h{kif)n?eB|Fa)2n66Zzw>G>0O89rjj4Iwo1^=0iCsvX z;b$f`&wSrb_tG{_) ztDfzT2VEoWRajHT1GlUpJ8&@P5mMB8C4B84Sr>0*#btYE59J zWuWn3FM6giE!MKPImYtcmOJ(qKs`0nFmUUO6IfaA|1^S)*9y}lJ#TK+4FAg*6qIyU(W3sZW~m9J&TJIMYVqMCRu*p z;h#rcCH}s!`n4xg4z%AJ*^!eVuI%hc&K`;d8IQZe4hi!sS6+*XJB>YDf0|j;mVV|3 ztf#K&_=0o!MX8%s0hBs&_nAs@Wy<~d&mS#+`1TF3Z}e+_U}vmv)teX3H@6;nlJNc- z<><;DvSUM3cf`QCgr}Fo%S|#Y@iskBJ3S_xSd-8uYaR%1kL)do=mD2!7wnMzern#X n@ND^x`2jrPT+Y*xrM@tbv~K!w`oXN+;GaIzw8YqyR#f*NKJQSk diff --git a/assets/dolphin/external/L3_Hijack_radio_128x64/frame_4.png b/assets/dolphin/external/L3_Hijack_radio_128x64/frame_4.png index d034b0a533f7961426d579bb00213ed0803e56a3..23166c1a6505b42fc85634ad8ab5b879c2a16526 100644 GIT binary patch delta 612 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 diff --git a/assets/dolphin/external/L3_Hijack_radio_128x64/frame_6.png b/assets/dolphin/external/L3_Hijack_radio_128x64/frame_6.png index db53a0bb41fea9c0862ba15807136063f3844e20..fe9a996a17a5318c09cb48ee4acd4b14a405c2bc 100644 GIT binary patch delta 576 zcmV-G0>Ayq49x_P7=Hl(0002`twPcO00IXlWNgEs_+3SaB#gxM>I1Lfkr3`WzL6QXIM|g5n_PR2qxqWfP=YodO+hm)K*h>M7U!}kO#X=57)J}o>YG!5|5x~F&F1v0? z(usL&iQ*&Sx_`~gZ00S;K84$PQmg?mSqR5;Xlu1m_jdr;zE^K@qY>b>{qQD-*L8P` z*l)Mh;tLGG{*GRrk@G9{#KIq7cfOrZ7}bZy(Ir3eqh2SRx(0q90DZ(+!l2wp7~U-k z7t3jQE=l@M&+Ub-T4q-~0pLw|dde$GvD|S@Dgmm#~mOr-^*0Af7@CbTwIDYfuwc6y5;gA)w_^5p|q3T8oa!zVg^)2oSQN#1b1ZC}In4vKxpYyK%FafZ7IH ztBh@ZRIP1guv+m^>BEXfZGE;QGPI?F*1^$XsQhrs)OJd1%UIJJFxDTAJF|Q5J@jxQ@d7ji<>m*xw8PDcu$`@TaeCR^(`RL{ zi_y!Lsw}9*Yh-I&#SH?xxM88q(cpGy8CiZFoEy*q10GhS;ee->^XUS5*_d4&*hj>O z3?5Sv-Fn$Lsd9@IHu3@sYZRE=fubm^(JJhyleDv1bUuuuIEG+2f~n*7C~_Y$K^mn?yKiSIw0qKv!WI# z*5?phUeU#KaKs{Q=j%kh3~(I}!sE4A9vS9*4^st_h6HFYf+*MPL2dId1Rul}f_jE@QMZiY)lHdYmp=&ALQRiVf(M;)O;6}l?7@bC~ zBng$qNT^8zhM9~8f>cumt*TIER2oehb=1a_u!I3EEFuc=Ld>9!U`dL=jV27mh$0-L zNKF)L=6oW}IoPOQ7x0Ut6scBeOi#t?i~>uGykO(`+Gr10Yj~0O)$m>zCln~0W1$@` zE+Uy5snB@96f3w^vrLh|d*HDY>s(KuU?*q?;lKzvt07Ujl2zeyT8+_il@levL9Jz3 z5dJuxc`S9~O$sC+3~!W;PN^hm)=8sslq68OgHbBwT05hZ)0my12?iy#I3q&FXJe0iEyNP5Bwi}y zE}yNi?y8rdDX-n^2<_c>F)5h-AZyWWcm=s7X6@Yt-+0pFB==(14jno*S>Ll!EZ&~n zcI(dHOPadGl!4Jy+vN={?~?J>!HXp^sc-@*fs^6*XJ!pcf0On|YK*(3LAPn}h6Kv0 zO7A(9^w+({U%1-dOpoMg?LNbDUm1RI?R(GlWzte^cXk{-vK}oc86c;r`XCYG3QnCBXMPyNweQLUS(|%DQ%6 zIl_JEAA*jxH=oHqGxY1Gt=YnSx+jN}7W6+qaYbHx-|Dm+bU|Z&^}IZO+K*R`PS2>b zT;29z%;jrj9K6@rcQX9#)KEewYuiXi!H#RDATx2@gQcSdUm*+b9v)FF`{~@uv|AEy z%IAj0U2uQa&ks&lzS!p8bMo~ya~fLTcpDnlzx9fwytuKdX~Y?K3Ho8ik`rca)sE$o lZM}n?Vd*~3mcK4;3Y0#WaUi*Sv^(;1H=7nxpBAoY`VZU3L#_Y- diff --git a/assets/dolphin/external/L3_Hijack_radio_128x64/frame_7.png b/assets/dolphin/external/L3_Hijack_radio_128x64/frame_7.png index f2015a77d1776b3a6bf21928ba8b0df916b7b0dd..06e38fddc650f3753669ac2c669923d4c91b23a7 100644 GIT binary patch delta 695 zcmV;o0!aPa4Z{VH7=Hl(0002`twPcO00N3hL_t(|oMnlnAc`5kxVxk`kS4 zQA9t6){Nuads?WIPG|Q$yyy3O;r|F10vqD1Kq;jDy$qBWf`2*0D^#qm;b6sADL|b9 zurd~FBvyeRgI2;v^zGa0m$X&-}XFg>%E^UJyg!160OX*Iq z@}M89F9hN)1AiB=fcO&dVNKMyNaEivC8OFI({eke01F|2rejntrHIQ~k4yuY&mto7 z#sjEo<*+GMRn;w>NDt39E2daPM2@^=<45;+u_ z+827TjI>vsnH8%g5!Gwq86U&(q4Sexwd)B&rW|3=RDXAex9_0gK@cP>W&^{()?2ww zyl)`A7ZAfl$?3=>PP$*%khHORlzKnZT0=IAd!QSZ=4jq#uBg_gXLb2N>#a+S92^hB zV^vlCO3CGmMVZ*VG62A9ch^2^RMl5grK+lp-c7mafiC}krY(9uP}N+QnU@+7iT~~i z>Ed;*n14L2Jmt2<9|iz%fJ#ofFbJt)`apyruTz8=OV2=YW0@*`N%wYfk002ovPDHLkV1k19J~sdW literal 1755 zcmaJ?c~BEq7=Iz+5kM&(94anR@l3LtJCOh(2Sy2`973@wo9qG+k`2ky1PUeMID^{a zMXU9uI98puibvI2QH!lmsMdN>)HEPe3tDSO5Gys^2w4Ac+?n0?-uJ%W_x-+WcC{`s zK7bL%000DN<|~t_)k(dvBk9z)bL2WLwS$P8_Q)IgZns8@&WFj*)x08udx3u?&2Nl1_97|k-~!&7INkP(wH(*;^s zYf<32#`(ooJf%1>)li&gkYLQ1Xei1dr3{#G5``S5e6vmJkTGA_l~Q}Jn8So#sE~Ow z<^ZV-tqxKURvZ$s5tadlVMrul>)~v%9+$v#Auh~CI0%=62v}T1$`wcv0W|n9DSuWh zTbis?4|=0cGG;DGTBIC~-EL>wd2GU(!$Bkx2?yqKxLg*c!Lk*ZNz}nI+old#P~tX& z)o3A&gcz8`%qO8<~v%Pvf=P zw$vgE&Pm2?M4{C{RU~`r5SYr|n;m%-DK^q1tC1=Tny(}bg(logYLqf2b;HJtm{cU> zi+KW(f+rNq5k#es^Ta}>Tq1}QDEJDMNH}EUby%Jpj#KmEgmH*m=*5baJg!28zz9#x zMU-OE5LRQhk*L{#5BW7xeh0CFH)5p6i;oMqEL4b~EI~HRqYgp| zj#J?e;IUUyH_)V%gbKql#74^Ji%~oqg;}te2eS+qpU;x$F+K}L^cc#+V6lXYF*y`P zj<;)G>7pSK)tcVz%c-CaFXsw3Q^RDXriPPtY$Y{u!*vO%Dv!rQZPUKH@&N!oE{#&2 z>S%4wSZk(7_#g3jJ{K8fmhf12YxeI8i($*{A4+6tW@1=x^pIx1h-L|T}6b*Hi z`fVb120HP+GfSE#(!*V}vz(GuWvZ%4d;YH5;e*NOLB~_pSIc~V7LDy4^L5{ezSww7 z(O!&p$6w!d;mJ6Df}I8}doX_2ZcTKFwp|PKjDvj^RTgb#`8;4XWzagnuyYc?zO#5( zv)|JYFb4!?Zs@lkWGsI)o_2bh``@MDOWjA?`dr5v7N3UbPS@%v!TA8N@+9krDUGqT z{OOz#!J`?nhn89TKA6M`R(R>-Nd}om6f2tBaF~g z2GX`jl8yHy{GYCb?H&Op$N13q#(eYr!6gw1$G6UfYO~bCtpP39vnIejtbm&f&ixwE zx~1yz_AeME)xG?+&6DOt`-aQg6?dWox4&~wxICw+x+gQxn5!_if+YTyb+y!g!g6_&($Fd80Uf)|; ZpmuW5!+&}%Zub6eG^#}9S8-Y8{{f+jhG_r* diff --git a/assets/dolphin/external/L3_Hijack_radio_128x64/frame_8.png b/assets/dolphin/external/L3_Hijack_radio_128x64/frame_8.png index 39b8d5f8f57d1bdc48e5c4a35ccd6ff8c51e67a2..7240e048b50a03b7d358588351f46acc4d5542d2 100644 GIT binary patch delta 707 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 f*xYFBn_dfC1Nuh{S(fwqjR diff --git a/assets/dolphin/external/L3_Hijack_radio_128x64/frame_9.png b/assets/dolphin/external/L3_Hijack_radio_128x64/frame_9.png index 8b5e6f5ee7d9cc21490a0b7f4a481114ffd1a64f..c074f6881856f42612f9fdd06b9895522e7af5f3 100644 GIT binary patch delta 645 zcmV;00($+b4Uz?r7=Hl(0002`twPcO00LP_L_t(|oW+t)Y)oMk#eesE&-As1j+F{x zf`x_3ED)_!Uq#YLL?)52WWkQ4b`}j!Y(zq&5wTW7L5h9Ha^e^u3~0p0d&56J9WH_zwn^@$n9r?L%8R=*N^O8KSFl% zJ}YyjsZl$9H6O9DNhC9aw}!~H5c%vz@LIn0u4KTX)+KvD*d!JeT!bBJdO26piGJmp zUOGy;IiU@|T7N8Jahd7{a39Rf>~R@j#V+=^c1hB@6WB!_tQD@^%*={USpFuOE0SRh zfbHXFyS4Pi{(8+#zu((4d*RFZv6RDc5zkq{%PxE9Z9i1dx$0DcV_J1eIyH(B(4eHT81T|R(0!+bvn@in7k)W>O}?|<9ZKIo_s?Ro{j=ICX|d1*~N ztA%~MKF;_+R{(b;NuTJL8E#WNFKz(vDB3dMm83*&g(RuFe94B(px@W84i>JblIo}2 zysb8~@cYG#5a7K2N;G+t!SHs9AaqG31Q=%$=CC~Xx2*zt${dU}p?NXJn#LJQaoVrh z*m?blnSO;p^-P&>flDfEU3nB>CWViw@AbZIn5h(};pryESOxULK}jm5zL%HaMkG literal 1706 zcmaJ?c~BE)6yFd)4kJ?z5wvAls^Hipd*m(=LJ}2fAOk_8RhrFa0|Ana$pV1_2HF7` zoffUOo*iU77(3Wj#nPc_O07qsD&kbdqqX&_Rnbxvsx;jIvHinwcXq$;d;5Ox{oXa( zq|Khs35yQ{0DzOZK$Xj^Zsti3VKeU=As=d(C5~3>={(9zSKtm3P?#tq31(XHLNb@c zO_eK7lBoc|uCwU$v|h7NMo?BB?$hD9tab(s0I6v%J5H34G-xCXEjBqc*mVQ~Ehag% zSg3(Db|qP4Sy1I5^Qy9SL{$kPH9=`}!Bm%wF<>QW9CTSrZBCg>4vpEBF?*kw4}oJU zbcq}qC#BbDK_%rNK`{^E5-<#dVkyrEnY1~GTe!mvR?*vxxQmjnrAaR;<=qRex-vinril&@JlpRDd9t@^vaKd8q zNoM;hG#;>ubXdws(>w=d1;v%G+U5yJ_LKrk*TmcU#ADMY!r2*J5RGmJ3@k(4Bv z@W=6{|D|rcNf`+fhTYFbCJ;z)(u~7gSc1V^!XyxIrACv0iz7x8j+tPI6g5G7h9ckB zHUH}(zldo~-}d=bFo)-JMcSBQaxhb~wJ)-QnYdu>LY>;{^)lQ1?*3W;2x!k#DRi!Z zyZY6(-{8qfUhnRR3&t%~!%HSjo5E=@T9>Zgm6A2(Ht&mfar@wKch!1vcj0HPLpQe# zPw%N^JqZ8BcSiu8l_xzHI}XCJwe|}}gmYxzhsnKV0WingRWhP(Y!n0QALOV`D(bHl zhYi?5n=Yj+2q*~DLeF6Bx2e@FiS^SfKTRkdCA(5C2_MRXV)~Z@(G5*mS~c*_N1dFO z;%|;N&It%lkL?Uh{{#y-!8#FE!BVkk;K0nQL2iTk&-+0@;$f&|a8~CZ?6$6lyJm}u zF2(JAdqpttV^gZ|=p+EWd3IPHm*Q?$ox6+2xXYm@NLvk&%$gmZKaf~kmK~J1@p<_&Dbl zeDCX#p|kr&EoBkz&F$^V?AU3m?5$b%zM}iB;H9`Q^I7B2R(fA%J6mVds6mOLh4w)yQfdTuiq2TRswg_`{QTi*YzCk^Gx$> zoR1dQp~(qseJ|eYZHl;ltMx|S2Kmgz!5^qsg#xEo%M9TB=54E!XU+7qy}EpEZ=Rvp zru(UylRk*w4RzNfJV-j8uHDMk$0S}pGsU^+_dA=;1Fq@7U!4c_QxoJ#8UGxO#Ke2N bqfrLn%e<(hX6udDe1DHjb+&46hN1pnA>wj5 diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_0.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_0.png old mode 100755 new mode 100644 index b937cc086069ecb5f7f451e4ae7af655d78cc8af..3b179a0d46e725e31200b948cba25a729c72f689 GIT binary patch delta 862 zcmV-k1EKu<4e17u7=Hl(0002`twPcO00S^dL_t(|oHdhAXk1kk#((#|H+hdVW}cEt z&>zTiE>g+DjiMyFiC8FBL5l=(LmE>R z{~(DPOvy_MWk^EurY7-aGV_j$=X}fWd>qd2a1KB{%{U<$fPZ#Ps%l4SP&2Zl?5`y{ zp_%r>_JdmDGXvbUXS^GrOQVMGqn&b54FL*pc!(}$)B=EGK=XpJ%n$;2Xk08P%TUdz zBT!ae<}yGdng&8K1M6G^I03YS5?PNt14Lj#vLaGMMc`SqjCc_&wyw+jaBl&?6EUsH z$v7(#r*Kszp?@6l7V}&N7q&e~fhSZ7m#qM55?T#_=@bzWSr-xczom#sMTv+cz&isX zB9TrjF=WO?#HcS6SrL)QwPi%32p0`2eRM1QG?P5hB3IM@_tOjZ)mvGso| zQ&$&NU*AB3?&0%d6RS~xcX|Q>ZFgT<+m|eX3VKGs*HIij`mST@NlJrXf{Xh3;YOFj z!B~;?A*W&Q)|EV0Q8S-XyT!K8`1(Ssb5=gsV~2p z;D=T0bGMzmX#+KN?6}*0yr{HMgY1acHQjRBArE@#U=>i16_s*d+f7R<~GSzyU-UWRNnh0=!qhskeEiRNqM3NO* oma8K38miP(26Ud1sTqsFe{d>&A1e+vk^lez07*qoM6N<$f*9VL_5c6? delta 1784 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 delta 1677 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 diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_13.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_13.png old mode 100755 new mode 100644 index 9cdea5002fb0862a1786f91e60e3f05517763689..4f4a2623c334fd7cb2f113aadc6a9b5b41127ef2 GIT binary patch delta 842 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 M07*qoM6N<$f+gx@rvLx| delta 1410 zcmV-|1%3MF1&Irg7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000F$NklTO ztM72{wP>IB&$Q=#-_#tbKCcANH@-Xram0K2K%YJ2>!^lj`F~cE07i(nSU1{MYI8U8 zy?_J|Vet|y){V^J&V*aNfG7ZscvKjg^+%%j5O)>>0#*QRAeRY`dq?}dEBO{L@FRd| zcW({evI5HoG`<92vHFa~jw1ig)^EjL%Kzd?u8jbMxrQf5c#im<5zVFY1W(TiQy*KZpS-fQ-V=DDhPL$J%8e z>7behdg{wPMluVu?c@G^a2*Ck!$bT-b_|vZz)F1fnZz9tCV)0I^c>iX5HF4UcnTRI z0vM?vdWfgu6b{HcR{(mPUQyRWJq<*vgVE$8t{x5gEPrA-3nDyS?PJP~ph)8DbL$6R z;etq{h*=MSE>I--qk^&^BCVZ`Oz-9L0MX<}oc$x?_hX(x1ljY1E`)d{pv4H@l+F@+ zX!Ad^2&`-GT}RaeWbF5p)mwu~%Lh|LYo5pBm7>HHy$wrkw?h10fcNl6YbT|3{mr3B zuc6J4>VMZmrX*@hA6mQ6Gn%3ZAd-Ab3?O-l$ZKPn7gnu;(8$lIfWD}Ot`mu>=vm2^ zAc?}WjbsLd7O_cl$Si%o>SQPpXvmE6H4$nTLAbU(>9YbsO`s9vqqUB<&rc9&CCa=(ReV^u@_eB z_Z)s92DMwsr=D}`VvU7_Ba)>-i|&u|O{@S=@~Jk~ zbbk`98eSPItiKdS09wH!iu{p4(qctNvbdvx{k?!vZ1sHVeH5Mw*;#S4t?#E0R56SE z(YBtkjwY&=+udgiSY`QF-0P1bGGu*!Vt|>JkASN?TphCn^!W!OO0l2)&n)@gRS4PG zy$30y!J6fc09T1bY7LKQWPE}^#Pvs!&wrsEv;F^ePxahec);UT$~gI>L65Yh^v{q( zDWu<{gZtiS{QMI!Qsfv_vEwXV>eJ(W&PaTZY#~4wLa4zbQaDQ-(9fm4)g$#^-#sJx zZLohfg4&YWE;3D`tPNPw|~Sw z=$NGlw}LhIIcj;D2WUZg0dMdb5wy-kR_68D0z46aCZquLOr&x1MFrTuljZ?Dc zaReOMb_T4*6?GI&-UmP;Yvf%N-hc*KG;5Y|B+QuOmjJ95GMoI?J84N2pF%A)CZ z_BVWG0hR$r(?Bn{V9~mTMAb27Ab)fF`eXrhAap`)I}bdIUl(HJ^s?VVMu1u|Hzz5( zp~mufXsyj_1^FI~rmB&|OZ`wW3OC*i5ojO}gEXv)rlkerFk7&k=sf*!BIw8QV%s+P z?*(uZn~gpnMiya}r)t4fQu}wbngIpPqe(Max|UQ#1bv$*u)i0e zVO1S~n#XMNBfU*eI&xMpT8(Yn{}h4{WGq1K*CMD@L_t(|oK2G7YaDeH#XsLWv%Ax>n~Z&N z!H}J*C_WifP(jn#T1p-TpM@ZT?;;Y*l6XBH zfg$FSY#(Z#sU+BYxIkm`P+OCuU?uX`8B3Q74m7S}K$MyDGO2@F@ zqw%g^tXA|?l7BR~HKg$lYt2CClB5?BmA5HYYr2#qJ(7%}D-ycn#yL=34Yru0BS}ML z0o80i{G`tEkd`h>2wgURtzJLNzta)J5m4i^q}yb^rLuLJ16_)?#n0w;rQ_!wY}pm5 zf}`^cE>`^;1M=W^bFc53q}_EcON;AmmIhf5$jZQ+6@T*~#0XHQ4wf%Q{0S={PYjlQ zbOTx*K!d~q`4g)y>o2JsONIk@d1ouy_=0dR07xy}0tl@H~o#9=*!VwSf3)=X(Vavop= zSns7Lx_>zum!x1(8+whv1Gqg##y9YTo6 z%ZK0gA=ufxi#y&N6=3@zxM+P18rT`K?Fho#qfiW7+#YTGX9*BhJ_asM62BF({{Bsp zji-_x3{P_~FGzd=8U#N#!6^Os1DBpVHD9BAZ-=y$bS^!U^gotbDxaz{1nmF-002ov JPDHLkV1iwET6h2e delta 1385 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 TI}Q%S00000NkvXXu0mjf&6A1~ delta 1569 zcmV++2HyFg2Br*<7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000HpNkl`CRiTxI|}>1CwVN==L}0~oNoyS3K#=3w9TSGH{{Z=*f8 z`q;MZrO*B|>G=wvbEyKmhFfzKKwGp*;>Whg;5{<0Kz=`#m49H?@$LzcAPGhYv49R5 zA@WM(xAr&Y)k=WkCVgmGJwtxgr1yP){CKzm;b-GmcVr!2JOD#x#@!=ei5$tlk}_P? z3p^=+v{)J9S+~w;u7@j;e+G{Edy4l^fNJt1$Po7Jghz32?OgJsq>cSu)%Ewd;x=%X za_14Va{35K(tkG5_ifUpUQl@DsQ+DX zXRJPhYT|#W0aOQI7d%phv)sHkhM%?j@Zx|}9iXag%l5Cy`6&bsH4SWSzN@udeT8!U z;Nw;u=rJx|s_$#(4TtO>@jRePp!ebd%l$JhpHV#Yq<`@jC)kkI+)M*A!X;>zHW-=X zQLpsgSQtXb_sNhdr~AJDDL{t&8CIV?_LZuHS5SnRF%=s}9nZu%K&DfvqYC1q<=)X- zd_uMmox6mWD`ChUk1irgK6{&};s9y25}a{A!otG?%o<3Be9c{J#SGM=^zB!Af-{fF zJ((c|uz%p4){O&@+FG(bx!zb-D#1#tk5+481z2VEOkXI*aUtjO5%MIDQzc76M!~2p zpo)A%j`dDvK{aca(n@a}ntW}(Y_W}vi86Q!0wW87rg+huUV2uQxl{$0JtB1tbPO}n zNYeu#x_`R`%p#u+^ekA!_byoq{Kntakm8JS z9M)V8Fyu?h=VeIZtzg6rMO}XXJX5=u`nML*Qi56N`?Lbj4Ef$VXfi@|fHR`}qh>vR z=8a1m`x%wMNPm$)QJR~#4T@h4(*{&g)k8duwSPuE#3*;QA~4qP#VjcKUO%mY3Q$Ep z+JBcOFEa5Ft4XiyFDpxGZ{7%M4c}8(ax9CExcDoh!ulDG7`)sFvIJ{ZA1Rt>U}Qxn zepQ8vkk4Y2rEUQz`BekaKAVxFuRwH9X5Y)MkEj4q^3j|XC0|3I<5zi;nP9RWwp|u4 z3gD4%MWHC9x;fJ})Aw1ZCKELR4^Ik!kbj>Ad(NPZXH>*@P=W)FWx9W^%dIwY)3Bv2kH-ly^;@A(O1PAHX;m{|#dF14^ zO3qUjz?NgPU}cP{4tvSu+ac8r;0qx=*i$QuXf`fjGK^304v{PkHHe1-Sk{GfkiC>) zDV22|@d=jCxculd4YzRs(L5i8MSt81i5r_HwYq{$^q2nn1`v6{N3^do?yFQluu}wCG%$_<*#A%9|y1tRCY}GgzPoVXO zR&O6M(dYrR1}G3Yk_EHrAtG}XB5M~Zv(GS0(F3el#A@=-Bt9C?NYA{KPm>o#X%L87 z0x}Uaaz2Cn4DphTF;np7gqF^c_VB-stwzKJN;1wMKjY#xd6E*eh8nF$W)1!U@wz1F TY{P`000000NkvXXu0mjfy&&&X diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_19.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_19.png old mode 100755 new mode 100644 index 213fb76369bc1c7aaa3f47f313df9fd93ab36330..23e10f5536442f3640afe31a20d7caf0eebd9d23 GIT binary patch delta 656 zcmV;B0&o4J3Y-Oy7=Hl(0002`twPcO00Lu4L_t(|oMqELXk=9s2Jqj#^X89`&BQ|3 zA~J(0ENHQfkVQ?NjfJ(Ojw}QlC8dQpFK8tqB33r0Q?yBA%JmTx0v1~AhQNmK7MoN$ zRy#3o=32a&)x-~Oald=+x!*b8Jt|iaqHFj+v3H%Qu7_06Pk$+;5`xMor5S9b2`yDf zm5@?ODa~kQq94;j1X&!<)69|VcW3Dd3d`~6>Z8lCu*k3*a#phpQd2>7+ghB-ry&ZU z7k1(_?bS%lTCTFmsF9EuX^lf1=S}tr_qY&?F?hSrscCOfet7z#bpD@yvp?2IgpcV?C&F8;N^Y>JPqhgF~5fO@_G(Wq7IHhxAq8AzV4DL-QQTi4X z&DHbB5YfC*d$b=+^fJZDje}p$65Z;-MDN`njvv0Ge}7ifN}JPzhnZ@nr+-$-)<|#m z`0|rK-e)NL6wJJ_-D5_)Gi)T?eYskwJFaEHXW#AXpO9%c^u_m=oRc-%RDAGFXTK@# z5;Nt8FYYrSc2fc4_A@yOSq zKYE3q@_$&gVO{>Xv&D2c*YOpzdPp&Dbhxj~vdSYz3^r>z^4smaU%DAv6|dEoh0mus zG9hi&*y*BQT8gXKc-7Z`!7A=n$2H{WpIM5}zQ9IJV{P>}?SCT%XE!^v51Nl?l+tOZ qLuYx$sF}GkbTVNa7DJ{?#Xqvw@wE%AWnTaQ00{s|MNUMnLSTX}<3aoY delta 1308 zcmV+%1>^dh1)~a(7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000ElNklY-5B7k<$ z)(i9M4Q5f-wSx%51kfnIF63JcwhE<`B_x1$_@sd~7_`P4Wco$U`G){n<4fDFBGr>% ztv@{8g^lzY?0W%iTaT7yY2cG~zr{JdT33|uQ(}U^Rl$cfBFHF3Z^O)F2AuIzVhB)$ zkxVuk;d?M%6n~;aXk^AVq5AzH0AylsGT2t*^1Ud1XTfEc4BUL&JU4EH2jEEX4QKog z575%n%-mL+?L&Z;pb=dq2a4br)@!A7yHcN;v2V#v#;!gZT0xLSdkL&{XeHO@d4TBd zoI+3Gt>aBPh6WxtkLU=9h80Hh;sGt^FQxQ@z$nD1yMI{|uV|DBiJ&z?OMfe5m4Lk+ z9L3-e*!WT-jTlo)vf9TB{@e?o8hH}92WWKa_Z1i&zupyvubrTX%RUd#tMKhmv;>;k z1=V+U-UyzcWuxw6;W_7S6n&Bilo6!z%*t%x308ud1M5rtL{N(ar@)>4lAQ^UjEa#R zy2}%2vwsk&T}&PdJq?ZVTZ;6O>a`$UpJa?bX<#H^Mbzt_r^0`S=@P#;GVkXIIB|~}o=wtgs_(1}71RwP z>VIw;*Y*TvGq4Lr@AY+hQM1sj0qiRh@8@B4ARQmTYY+E6pjVTh z8M9a8XhqPYGI%>CQ=)D99|2AlgMWH8dCEgbA&G`Z$KHt*_POD}Jw>$&9<$Iyv)1!? zbkjXp$xIf4Qfe!FMQ*Dd%hF)cj1Qsp3h;hN&iUt?LOtN599}%Y$cCc4wq`9R-w)s= z6&%H^@lUM1<+U|LnEJ0_R9RH249i^?nS2^(3qKMaZ~ec4*8QJ?nN+k#f)#(*NWz}h S_e0nK0000!KmyCB4u7CkQ=4jg4X_E~Cu!MC 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 X+hR1CF&}yr00000NkvXXu0mjfN<3oR diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_21.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_21.png old mode 100755 new mode 100644 index dc90311fedc0a9c14a749f6f297d5f7177f4ca23..64b38cbff52754f84f0ba9472d216dc5cdf27d0d GIT binary patch delta 674 zcmV;T0$u&n3a$l^7=Hl(0002`twPcO00MPML_t(|oMqF$i(FL{2k_6m^JaIH&CbNi zVr2$F*ur89Aqisg3Jb9|))7IpQ2YaweG3*A79v(6WGh({lx?zYo)X9wiWX*B*f@Ej zU?7FhDlg8DYw>1HvVNNb_nz~;-|s!=s62)coxuMOwoe{ZCx25a=%CL62AWG2J82GE3x$*UigP#7llAR^J+B!}PoxRKL6m@<+_`ge+|{Zln@j-rkx&?qzf zWaQyTV-MwimZZoCZOG_-R&e?2tt_(|=P#cHiB~zy2U#30!7zgcY6aWAK07*qo IM6N<$f@y(7VgLXD delta 1356 zcmV-S1+)6D1=9+U7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000FANkl+ioK<2taW(|NqOg54)}?3m7oIW#&jx(!_T#2AsC#zV93UQA&ZA=WyRQd{z(Q zWi77)Je&*QHT_TKQ%ZsRz5%%cFAw56P4K&p_f#u-Wi+x%D1SRGdgdC;m{%QdmjZYv zojtK#twAq!UNaOStN@* ziR|^G?R}__UV(itShn?O85RaUY4>NG)1%jl6Fz|81deh(vN>UlR$3dTCo+(P4Wj3T>;W z?W}SAd>`O+bI#FHTJ3nVwqYex_?i4l1@D5@3DxRX;eTcbt~Z^%A*=Io?R3 zto7auxD6$KE4XFyMuae2n-*n^US{>4#g@M4*f@(Y8m+Ga0H#r3ZphH! zwO2U08d+nxxP~-mfCUvaQGG z0W4^Wnq?tQC8Pke)0$lWtwonYQ?6XAjf{RWs7WLI=*5)?;@Bk_glQ#uEcF5G)*;$Y z2EBc;7T^TW*qUUjVBttP4}6ahy(Qc&Tx_v45i|0~9+qH}i?S{o5K2XLihOvi>_OXK=P2E1Dy zK(hq+St2qIy7Mjl%!K+e(j31g4>0rS+R4mYGNKi3eU8inNJN#ud*rP&^Yme@SE1|U zx(m=8u3d;+8GEvQyD7aDNlu~y%zqZD7SrR;t?{|HPHSAJ3Z4Tiyr=-Pcedv&^S0T_ zacCa&Hwm7T=`RIXIdLwTLdOyvpT!%N%J0Mo`CPc+)9@|42> O0000 zyRazY)5fQndDr6Qhr5283x{*Q_j}Iw9Hoa4qDS!mz|NzA@_*5k5(X)yG=`wGl~Mz% zsivb0sT5L5DW!%^CfZLYBFJKOOmmFn#(a}bQRv5mhd=Gd!U@B6$XU)ZNNoq@%T{6| zpM@xZUf77Uv@=D*Ir?R+w^$+Id7UbcRn8mqYhLGX-n;oz-LNqr4R=r54^KWlZi%xt z&@CRTPz$jd^M8q$mabd%ofvEE>4p1myN!i7#eqdjU-%8ZINOF%y8n)+upX_gBM(bo z7Au5LnV;2y&M&+9=I}=6=)|aJU)*&`Zy{!_u5|vbi#aZwdb_q%qC3`dWYXis;^y${ zqvKHt#g(x=&fMRBh6Ca(lNNuKHIt9BnqV5G>u~RCTYvf>GD5UlfgQScYQ0Rk_{6Pm zCyDv;PTlW)c=Pb94-6(#I_cu<+Pj%zvu7|V#TC-dOSl9h@d{`*+K2e+2z*wYZNTAl zn1yMvxoGeMQJ3Fg4-bxe`4h#P|0xmG+eQX=iSwy|kGr6dO(D6uU{pd}Y3u%Km+v)k z0a7trmwzJ^3Wrm2g5|;8%i~ydp_B*bnT=XsRK#ZOdqou;L2aDjX9v-+KqJ2Z%GfDc z9Um1ww~s7qa64ChlbfK5%XnqewLiFL8Sj^eQ^+xxScuQPz-rF8<@|^4S;la3ZjSD) yX)A6kr61?!nCmxewKq2obD2pLm1*Qs+7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000EoNkl48wfw9W z;)}KT65!>yOZmF~H{<8Ju2O3)T`2Iyi*TQ2_+8~a)r;N{oqwz{%1%m;)WM8-HF;eG zuueL9V!L_+FWS6j5Mh`A7Uj2zJk?-XsI{h$ptr*(4Q#<+G`>ORzPPUIF9EE^*S5_f z)teBlKiJ<7G}6~#&qZ(BwzZ_Cfp1#<5&Lwut}x@5LIi?Dni&HXaWsLxN9K2#XfMd=uK5S2UfG85|;$eTC1z?R<2-{ZQ zEaPMEH#sB{^zAkM_S*-1o(W7xeLOMN4VBf%;}7@ty*Wc>bFk|UzfWlcx5b_ux@dJ3dK z(`tO{nAliWSjooqQR~4!8a5K~V_!q#ju?N3Sjd{4w6@0*zyfX+!sn=!p9z>zc*u7o z0jx~tz|{d@8>t^lK`ZmH%c7ej37~~W8CY6}ZGQ_MaH-&GJemLvnpK$X_PvEJ3$*nK zcMQ-^YNyFz?Wk1<4}7rpS}!m&81$sTLv;YG6Bszb=iMNseq6iLpq*F97T~SJN5dk| zNvYl_IPd(57=S~@%BK!~q-Uw*J|c(o9{F#O1C~-y3u+C^RnItrV2Y#iXpPdL?AD5y)CQAlv_I=uZ9Mo{MC|hM04stZn1*5K z6)G7%1JSkoXn19~F@>HQ>@>g=x~E0>r3Bsz#yaBM+i8%FVxK~YQJAs-tnd>>3T@3i zq9}s}ie9-|Uo!|5ImS>Lh#jRyVAq=YE`M@mR9m;Z5Hef2nhao8nR^9>JOGyG&V*$f zkiO6L6P-?a(Vzc&?*TNJ3PBilFOiPq%Cl2V54^-aGSw`OV7=Lt33t;L>jrW-Q05bzuukoetTOi3Hk>JQW0EJN!SdF>5 z64?LKzSjWtW2yvl=k>c_)nfT82^p0e@BsNL>$$SUuJnN7mfE{btzbQwV~cYL%XKA0X?} z#>#X2NJPnu7J^FQm5$x2^+LJ~nQ5TYjNilR6`DSqPSGo2E5OMy4_Uk$_dX{|CMSKZ0vv%p&T(dc;U-wlj@|1B6@C>Waf=?}-G Vo_Rc7EH?lE002ovPDHLkV1lL^Zt(yB diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_23.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_23.png old mode 100755 new mode 100644 index 7a048dbaeedf3e989157baf407d2c3afa212d170..fefe0d834ba18d9c25edc9e8d72faaa0c4db7fbf GIT binary patch delta 671 zcmV;Q0$}}w3#$c?7=Hl(0002`twPcO00MGJL_t(|oK=*+YZO5g$3HVW>uoNgcbMV| z&8;FBtYT-SE2NMJ{y+sTJ+F3kADF$kYq(r1O7`I0=*)r zK)V>C7J#Gxv}L|Ls}; zl8DXa)oO7-GJl#*g#bEojd_WEI0G6S5Rnfznt`UWgx8gojRuKs5NM*X zswy(`@$-}-2KFVB1f>nD7F41`0=R>_Wujl0cq@_)eo<}eF*L}RZFNa1GvY{7kO)6b;!arSYZ(*0u zVlYZD{(o_@T!DXAlZncj>EdHVMAp$5r7-@IngMzb&}5P|vNT?q1vXEiF)AnZq>;n` z4T7=)hOK<7i*)Y*djLwgG?j?_z_@+cHWpE!(Ch%r?huQJbOvkMm3t!6zfVvXN_KmW z-L-IP3rb delta 1405 zcmV-@1%mpk1%wNb7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000FxNkl!jz?IT|KjDQZ=l!(|pl$YQ zHju!TzjI!qK?A4|FK6J%|9-zehA@kWXYW=%(VzjG5Ofwz2@&Jn!3L+O|1&@RqIUr^ z8$F^Zug^*9Z+}>p15^tWv+`uKK?UU#Ei!-+x?PDZIU>1%<^88=pJQ1F$V#Fz=a7o0GY|T{LfGq5y*+{a-KdXSxNnjPq&cZ3> z_j_1X@eNS#=G>JSKiXF*?J06U;jJQ4;fo&+{|ZXE)4DBp_h z7TqH`!G9@mng8&zJ>-m*Y-}V#i!0NYr?cKlj{O(Nfqu}1EBbC8SUw>^p38Tp>dc-TW%UnlvKeMZ||Ed7A zQ)Ezd9OUIm{}Vx9;f%z1%hS=T2K3l@B@?JQfVLP<36?QFGCz{6F5CWIu6ch8j; zwSV%cmura}Z>z~GU9Isv^hu^AxAkns(9CZIk0{miFy7t^D;^6)nZ(QH`}T-JwXhHY zHw5c>4}=N4J$fOH5J(N|F!qWc~>TTYr z@;wVjV_?Lit+u-jAp%df9|ka!-D_=DY>s9;BUx~!OsgT4d(v7XvRp*5zYfmKs8?Y& zK}FgkYd>j(XdbY%3OI!-hIvvBxKg7a0}$oBKF&nc7&Bsjw7S@Zs9uH{pmqXAHb0ZS zswtl+Rss?g`@@hCc!xeS#yWaX)#lcoS+M#^&-yb8UivOO2e>mTdhJOJPw%!vGIl+?oLzR=k}IkjO=A&_An0O9Mk=K!Z2~29RcQAvY(Wr(<{|2$E?RJ*3n3#?2#E!u|FVeXS*l%h zk?ErUHueckB2FdGj!7qZ_r24_n;9o(b>>F_nU zJ`hnQ=m2fs0C)g?hV6j7ED5L})7St@LqGzkWLgCoPczZ5bC9H#Zu4J0BkgT(AKx<_ zVY0~r)J!$+>R<6F=J|p2&QOhF(Y=f10#4F#4vNH|v=X4;Pr85%rl540TsRkJDXQPP=U5o>yq{|n-Kx34`Vr7(^*=WC*@`eC(kLY8wpkJ2DJdbY13HTs489U!2YfWyccm0Q zBfSHr%fKe8FAfy1AtDm>fKhb@XkY39!B5jb>u4{QsXQ1LdHh{3mOu!FMg9kj=nU%# STBEH100004GtMe1T;5)mr_LVs_!3yvg! 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 delta 1471 zcmV;w1wi`Z2E_}I7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000GdNkl!9ED=V%-KtbHdz8jC|3N0KqpZq4VRk7@Nq)}EQ)8W-I=34eD;ib_j>R>;f{UXIJ9A zd8@3&uB20hV}AhD>_@VJJ}%N8B_5GOYWI}DvI4VWfEiE~fNq?%8InSLn|P_O7ie1P zY}Oh?h+j!M#qu<8CGj1INw;bt5k)wGbP7`eP%D5SQ^3i(5u~o5jbq8j$4A%1@h#$| zeF<3rssyuqd<34-T-Oy=TCc9qaU$swTm_K)yARG7ND}& zgOVjJ0y*(k{|w$pIz^}sFp~OJ60a!&mt#frZaqI6(V$d%9#Vk5nLPL9L82vOhIpxe zMS3RT1k%yBhO_|{F_Mc&<=+-4s;g~5lSPTN6^-11kt>n&J`K&1ky(U z2Z2_bR)0XDeLY_kfkdwMog|Yd$Ihfz-BWa=DuLSOQ&^i{y$C+1HZOmM%d{F*E(`5z z27#FXgMtTVo(n())F7Ssw~$_GExk3~nW$PT1R<6{OY^EKftrj|*42m}uF?2NnqSQV zs?D+I8u&9=yoL0R8L2HY-dz!Wqu+V(lyUc)wttn;I||nYcmq@{3K>JQ7H=TE(x;<9 z=M3KlQXugICpJ?<@cOPKenvHJ6k7U=z*GQFV0sIvnQwH_Zy>!RT8+yh6JPN@x7BD3 zUO~XyNZ-x8OV4xMR-;x%%`Eh7=6yzxiz0f;Eqqu2v~C_nG#%WHbgRIHV5AS~+p~Li zXMfDPv3C zL^}P>bOBM}q&}nB!3d(}J<>0N$omtSzSdaKT>zgD$y;Y=YX!1(_v||fR=;ckXg28- zcke(=UL+m-HnP!pwy!jQ#eK(!Y0vcUxPKAS`6=O1F&Y$BArr_&`b80`c2ZRM^HGQ~ zfMg!4Cyrvogw9sTK8J^urX7Wu26}hI1xwbn zzX|`YgE>Y_An%*qylo;{MlDj;`A+1$zTa$e3;f85!Rk zz)@slGx()Y3$p^jnE_mM{M}IYMi4UiO8l928MCslk4j($+9gqR+-yP0dVlWkg!>5p zJ^+VShOH7fW7Ye!*18zC@No7?>J)({f80syPZ$}TL_Qbv7l>C{aie4+mZMa36Hp%D)L)v Z?Fatg^ML_`mU93A002ovPDHLkV1njj%0K`B diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_27.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_27.png old mode 100755 new mode 100644 index 4b003d034901d8b626a9115d3861c2c7bf8ac514..c7f848cb793e8027b7022c247b78cbba78681c8d GIT binary patch delta 861 zcmV-j1ET!!3+M)r7=Hl(0002`twPcO00S>cL_t(|oJGw~XdGo2z~SG#Gw!UQ+4Ue4 zvLU=>36*@1AQ}>)md|flNf{jDHb;&BnDC%RN4&_BjqA z_+EEm^jk^XrVkgM_T4Dj+zwK1Sh9@~RQf=_@0&2@>ZKeA0p-Ru%`wbd^#B|kOL@It z)Z~@fWGVzF@p^IX&wcM3#ff!5fPUYp+ug`^VBm@-g>G+3v*A@^nZSyI9kv!K+yeua&HrEo&)L#LDcA7yoKBJ!FU1HH%&<&o}^?OV*>XO z)z>0J>Yx>l8e@3G7H0Zayu=LE0~i1fdj4)Y+52EBgnAkT=bsJeepm$KWywpBzFp6o z+=7OV3tEDx;A=B|4*23Rg?94vR}1zr8)8)eB`RDan}55Ypb4M>R5ltl#^4tgGiQVm z-Rd{X(6;mNlEO0OR>?NTs1${-bw);-SeJ4Tt30GUUv3w}!Y zwvQK)iJe#O7olw*BzV};O_J&5f-y!vbapJ8&zNEE#^0|Pldyhv%*TZLayYVpj$JmV zj<{?g!GD(kSsQ9zF|Jf)XZu+gSOKhBdbg(J@@b%+(h!U=-h)WrSV?$q?8(0|t*9_8 z8ut`|caS8kIp%1(2g}TYn0cY&G8jz<00000NkvXXu0mjfV~Ub< delta 1514 zcmV3Ns{Cs48#%s|Cc={cgQL&DIqXs@>XRQK?-fSyN>I+uH!h`bzSW^j@DXh*LAfU z^t-zqeMUdi_6VeTwC9pM61?XbIk`MmUvJ**{MNYW-bpw^Qhy8rT|kyt{+w@$MIJ)z z{rtMF$6-N`Q8q3cIwnf|jj#epr@j}6c1MZl7OUr!@cBF?(3H<>SKS_gr~oL*l3PH4 zwC^F_l65qY{fH>z2+}EB3lQBntNk0qdvnooM!JHPNT+~Zzz9DkjX#5UZ{8|vu`1~l z;TRxd_E#Vtk$+Ws?kRy~1xCdHBcLh(-8j#z^G$x6c&V=!XiDiU>Jl_Wh@VM1#q>0A zCh<2AlWx^QB8u<@(kV;@K&=3ROaTXVHC7EEvdPwbl0`t*#PJsK(!PW&09Ar4Inn3Q zu{lvurS<9xH@--^1Xlqh|1JeNQknREW(ih7d{ssu&3{2Z??O5SWC0?@o{_bB8+`_YI7rBZuH0q)J@xi1eAEg>_+OZ_X-GYMZH9bIq4 z6%V@%>LotXE_>p4BK?MTIJ9w~yMTyL8u2`Wwmu_>=Jj;0$ar5My$5g*Xg$*kD73HV ziz1N7)qlQ|Wb))#ne?iAiW{j)ptkuG*5+3)g3qbV%iD07W~0hwp?%FDFcV-<@ZijI z0jPi)q!Ygj>6O;fTjQCDscrC#1EX< zObx;7JCpbk)wo`0=`R9P0X%`}Eudz;(M9h-`i*EcE{jZj#rvGrLu>E~0(K*PHS;dD z=Qyp0S{XI7(A~`Yh#(h5^psn8SOBzc9z`@AT#aY@vXxB?5S7G_$LUoXp4MXi3>0?=sEDNGlj4L&pF z@sN$ivwfxcEABgbOuN_L%D}`dfcikK+J7e%fxMuw3Rw#@N@*k2PKpYDju4NMnJeG(qJ6SexRF8JTeT1gKW_v{!C!0r<$us9 z5E8sLh|JkKz{~({ZW}>l!Il#ADo~GHeEzDay&8XY0L!P+januDZ|!*> zk?D(Ilxeqe^O^Wd1GUsi%l&D)H-WmOh>6dVzUnEr@RtTk!ddkJsc1B#2qZyMU=$-w zdsLR$__+)4N}DLjvx-JDg1C%nkAKeb7XIo0+C`9M1?ck`xRr`qoJfBZJDqY1KbJwA zaL=^PN(nhe2XT=AZe{Yl^*@3@vK`3w#W*oq$LzJA#P0h%-QverHUUaYAH-CagUAQ0^ z8NfxypNWjpX4j(rV8mPaUrqa47etRYf-=yqkE7#8wf+lrb_pXCya(a`55QsFBUIqc zmnEu@akI0OS9Aer>So=s_Yjgv)mFkv_x&EyzZXy~bcFQP@Fl`Ie%=T|gd273*;9y` zi7yl0+Ec#rETAH$SPeT7-ecNRzSNIK?T#-K9t|kF{znip`4pF07*qoM6N<$g0K+Z%m4rY diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_28.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_28.png old mode 100755 new mode 100644 index df2008d932da4f7bddb66eec62034958222b519b..adcae64da4f93d04562ebef1910c2e5482f75bdf GIT binary patch delta 805 zcmV+=1KRw~3$O-|7=Hl(0002`twPcO00Q?(L_t(|oF$OKiyKuOfWP;fArm1aa}ZPr z>rje<2MKz~VI{A1PYV7AN)Ew#k;b0lvUFdihn#GV6%+zJ^x`3UD;Ry1h$EEU#e=Y} zrqdE=J-9o~29nv%en_ z?kA=4^&kQ6yy>mT_Z}ssVATQy!&7hBb*q9u?g2u=uySbW;6920!7ohX3g+^9`>F&vj=^yUP~ zfVtuc2kp5x)<~ZKdI!g720Ie~wi}J&Yx~4YgB%cFeT7N@!ro25M}U!nBKWclNZ-$4 z0ghfD2>hHC0DqqYU&whh=v5!6m3_h#Dj~JZ0I8fy!%uvtfY+S}MFOq7_6$&ywJ$u< jxE^}B8v^fL%*!tTz35P{)Grw<00000NkvXXu0mjfCq8)h delta 1480 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 Hu0mjf9IM(B diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_3.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_3.png old mode 100755 new mode 100644 index 97c138235cec8852dc19894ebb53cb3e7ceb36a7..d8155c7e2d4dd31635be4b924416ed7fcbc75c6b GIT binary patch delta 857 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 diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_32.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_32.png old mode 100755 new mode 100644 index 856c8455712a3bdfd45b85ef4d37baa8edcfda8f..dcc5cfdde81e17a434fc2b16b0a9497d7c55c997 GIT binary patch delta 684 zcmV;d0#p5+3%CW47=Hl(0002`twPcO00MtWL_t(|oK=#)YZO5g$3OFSOjZouf(Y?v zrj!(V3K10XCgLApYat|7HiC*o5u$^n5EMyaVPSDrX@ek$C@$xf7HVU#+LM4+7+q0x zFWKF(xV=mKHp6`R&UbU}jtvJ$3h^=s zf=>odk}e>)s)*(ufcAW=6fOf&0T1YekZ-^HwF_5CUqYA(kO24ywN9REU>QRALI*Mg zO9sSs--qDHA;NAM*s}!!6fwr3`p}qKdh|a{$aVTA3kz{lht;$`*bc^%hC!C21s{mBJVFbRWoX*baXAXC-fAjq&0 zS1Wi<%Ia?>R~*#j5=l1 zDUCjzU)21)HLE)fXn?pwswrWYVcT3(47`sAll@rp-hcko+zj1zz^oAX5|sy5(rpd` zngGgypd3n$*g^?ve>o#b;5^R2nFxIj1k8quy(I&X(ARZrr+4-y3IL|A@c19Y-3{%) SanV2k0000h zOTnYj3OHqw|EONPx>t|Dss^>fT86qEaSKwpkfC{mxu?*EZFNejfXWn`g? z1C+9NG|si|nNrjxT19ZVmtk-O&-K?p_wSNEMAV+;=VSP!(VmXheqF)6t@` zTOvl!F+ZTZUNcG>X{dK`99sq9J=QK7eVe-&ApshmbAJTN345*nZ-8kFXbliCdJFij zwPgI|5izJ8pp60}N;yr*D0RIu@Kgt@`cYK@@Mg=X&`MPcPc_O6sE&iH!D09xVTjsC z=j6iP`9TNL0jSFf@Q`QbYNX`L2FA1Mfzl602Nx7J4#i)?S0iTyngejF3p4o4>*ICo z3>matN`FY#j^9=>aFIm$Lr8ozd~OjSqR5%uz0ob}tno%xI^unTZ$YP`#Xu>n&)&;^u=?>^nLPlE_pbCUEqfmzszA#4SOn;Wj5%ODccq84 zw>|)TS;_~js0OLLrMzG!RyU@V9)F`HFN9zQz!-30yft>EkqmD^q-6B)UdfnNdUB!t z{f@t9<_X);P)|hw?7YHSX+ZSoGO)DPa_WuTQD{p3EhK2e}dA`*NTz?(hZUv(pLP~hD$l-qL_t(|oJEt*Y7eXK=E(EGYjos zanV6D&8MBv&3~EV>c(g7rwuRZzb(4G7FBjDFxuVaeJOib1fUr&OWH20U|KGQE&-gB zUkBKk_FhVoGi%1134F{a+h%4C6a%bh3LftHWPk?aDtH`RCZW#VWlO_J1-uNBP)Fm1P8xStFa(C}rNK z!>s+~yi#L+#|NhIxRaUSj*mmp$lGdFu4DTUJ9j-bY-7>P%nSq0N~PX;vkIudSm@V<35WswCL{j^R=Kxi04}eA zl*XS1*8g)7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000EmNkl+N>cs8XC3;S_;VpnaxbleCb$f*5*(FXwRen8*1qTOT* z`E5VVdZgr9g<$loS+G3}&h!`&XeG8^6W6D0%YS{BMe}=vL;+qaFe2aUba{lT zpT8fc)o9M4%}hQJ5Cv#s<7RzP~} zWhWm95P%3PKz&bPcBM>do;O3twW)Kp|15K!ggF&VVV1i6nz)PgXQABaLTA?Ad*3jc ze}-EGK!2PEm_5*l&{yD0!)yI|x;XXhM&WoqoO8tOnXb6&qxwUO}!GB+x2#WN|S0S4Gwr$pDZm~=NsAz!8 zpmFyBt2F4hlMgKN0f2wgyp%&I-P9FMHYpuMcwY4)=t%m>h3(OSd8_PhGG zWPe@SE9VGgj{hs%d4Nc5<)VWTG%48~Iebm-BLj}V94aA~BTlMayDxBVARllFfG0-h ziaxl{E#`C=`I$}q2+Q6M)@m$8Fm-;<9L?F7TsseLGyN4N0f;!;0bO2wCR9AxQy;b`A}^zR78rEPsGC4xfR_8)*APuE#p&E#w0R0no(K*{?zY zU)Jts(_f(y0PRC&-IST8N|IG0XZ1Gx+8>Ja94~JnA5aKDR&8Dl&M�d_X7wZzJF8 zo4k#DKyV#=`vXRx3e2cx@n*0V;07;#H{PQ870VMr7VN00(-xP^>J>BYqXeu4*ng@0 zH*MgXtRh(taKiL!@9m|K)Dvjt;x4UjM9L!|8Y_+zs?xdseG|wd;AV;LG0W;j-E7{9 zF9B!^C*Oz_g{HUT2RKjsi7V;o@ubDB+3<5}!OuhgtlG-?fd5vY$JU}yX@$;ep_rAM zd*{DNDE@|lt3p3*S=J8nXLCt~pnv!LZz8_p6S;UxJgw~)iD*l3W9r;p7T#i3pO=C3 zo}`Gkk8Z{X&}+Yj)C{Ee&5fp-`w^n`&|A2)yCI~`AFzX*MjbA}e@B`S{2w4jS8#zG`t1JXeu(?Z&xxHj} zAB&ld)yzCI&-1>|GcORCgb*fS4zPe?0venD0bpDNf!q1zY=85+-yyxP2KrP)m!$q6}8Gm^%QS@Xy&*0fzV~hc~`E>MJdbXDNDtd26lG=lm&ajmf?@sQ$ee+l>L5a9d6TeNPykrLm4ujnPUJMi z)Z5iay{j1SR=f+teKPiZm8$6Nm#w9g_#mL>Zfj%=JAVKMLXO?iV`Ir8rxA8;Y_IHA zm~2LpmHLhQ6Az~g?3({dg8p!6F0W??;u8#{jAq?>{2QQ|Iv@}RfX%tq7C_)~hE6zb z9K{0!^KMlE45UG^p*nS+Oahc9FbCm(F?C`vgwWquLcDI~fervgz;pgnpn`2*HU+b$ zqSV)ANq?e&10L(Mqm1#R$ZS`V>@+Y9=3`PgjR?@HG_$(yC~u%yrmz^f`m{jnl3on{ zyp|-}p&ecVF8N69bxv<(z==a1DahK(l7?zK3Z|Dw0P(N~K;ED|kd(L8l_c^O-I1iC r;bzL_E#d&Mr6024JSrtAap!+xcr0n6F{FzC015yANkvXXu0mjfwMsdN delta 1339 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 diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_36.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_36.png old mode 100755 new mode 100644 index ae6fca1cdc7dc429f0b227663dc72d75ce560d17..28aa1539cdccdb36b504467dcb6ee363bd2e4bc6 GIT binary patch delta 631 zcmV--0*L*M3WNoa7=Hl(0002`twPcO00K)%L_t(|oL!SYYZOrw#eerX$xcvqCn}gC zx&x*a#Ks7LOeBS!g_VtLYnMW>Fp`Pb2fsn|3-}2nvjqH8xnLndVK*3zNF)=HWV6}b zV=-@B$tw@%oO|AR_W{W`#88I@;5cajOGNgJgtx2g=lYitHA!H-TSV{~!<)QQx z(7Q4MTta|aXlcZV=$`Wov+ba1Ps7a2ZJSvDaWk>22X{XF^T@-=7tup{I}kaBSuy3lZNIlPu+?SC3@f$cjgvuA^;1HGiyV!r@8gq% z3oW0nt1xv8B7ZJ2`FR;2Fvfc~7+^>J2`ex6n$K7Z*GEM+|>@g8R;vp5+f9R}XR zsS!noWW^MuZe&M!Rj?~b&Mcz3SKAkCc}d9i%M6DYzV%l8W+&R~0>(WH^_=Wtwss>6GyXtY|kU%V--pLe#W+C zW@dqoLva71H5J#NDqUVABhwB6Ku;2iu#60V<1LEuDhq(dTS(UMIX!@i=&i{pzIc;j98rK~ zvhVx;`W-EM2HL%7;(K|gl*6y*cLrZI4Ri6M;*?MBmZ8SN14yLyTc{v9-Wdd+tb%)L}f0 zQq7>5LVt_bx1)C6$O=T=UL|Z%fN1(<5pL}`>Ha?Wo6QKk%GF-^k5|SiY_kBU`ng7a zd*!~J|2|TL2u1`(ERQyi(@1dvR^%)#q&MOw`hRElr1zF$7Tkwx@<3P<94YL%CSYWOMh@3nd zs0^Z7OmOUb0oBQmHlW%o&j9#!$a)6?X+dDb{A-oKjD_PFgy&l6Z&iqvkY)i!N>C9I z6CEM<$7TTylK<1(K_nYMU>EsZW+khTavoq*r0L72(U<^H=jYf-z85Df1hgG2LGtAu z|9^^T?Rv+TLH>`+0;FhI`db8upfH2{DrAoUZwEJc`uW~ntX(&238DchdY!7o0Y?vn zMDk**XAo)5?C1z)%0XgF3}EHP-fJTkBce#!duzN=Xk)DaxC_|T{w4a39kjZ<2iXlA z-c76mXd1W@lv#a$>GRqCeg^rKcDe-ksefPz(H$!ljoN2YCgHIl+2mJC{d&MGKxEOP zyM1)85;Vj?@emsiVhLW`NpR_(H=KJ90=#keuc9e|)sd{K z7$yEijD?H?l~FekJ+)kQlXUS$jw;56|W5&v#^PjLhPDZr@# zw}2_jq@rCxLv_MAJ}29>-V-{zl>+^pgOU8IxbFMDrBgIJ1|B_@l|jDsEUyyqW>96~ v8@|3BjBabr7MU_5Yww}b$VuWSwTJ%#6q|bPq9JX<00000NkvXXu0mjfY8_gp diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_37.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_37.png old mode 100755 new mode 100644 index 2567cf087dc21d20cfaba449cb21bf00f59188c3..95ac16500c361d6a26ca7765e52cb2a9bf004174 GIT binary patch delta 429 zcmV;e0aE^m2fG817=Hl(0002`twPcO00DwYL_t(|oXwKGF9bmt#(%TsWFtOScavfm`Ww-g0!;N1As_Idr+ECJ;l7Hpldl>*|70^@Pfkv#- zLe`Z3AOjfv3eUf+8%8$)jB-*jb_S3ygA3E2wct_2ib@3F&96k&r^A=BVqrkH7Y5>x zRM=5i4Cm6GuaaShZiEbS+`SKPiMabg37{RU+_fxKJDNIPDhtb!)t&Eo zAIY}oZP~at5q~QkQ~6agh3GUuTy#E2^W27x8-t8h%7SLnmrifD-T9Z3R_WFulQna5 zTMnlvf!>t_Xr5X&c}XB5*nYd-;S?&5T<-z!wD@jhD8?+p3Hn|KoVTkl-RFql3wmo$-VwkD XoYH2yt3E;`00000NkvXXu0mjfNN&du delta 893 zcmV-@1A_d!1BeHZ7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0009zNklyG0f424a#@Bhl|j}fz8*EW|xz}TM@(WFgE;^Tu!Gm`)yL*SOr?hXWd2?01K z1mK(yfOA3s&ItiHCj{V}5Wqrmes+uH>HaMwh#Nt!`Er0aRDTzo!VzzBLhq047n!U28KFQ2@P4wx;|QvJ zfjMV$8M+!*0)Gg;i5kE;Apqz6+1-I2c8=j(;dMhj5j8-C5_m4yHx!ko9N=Ixu_!>C-tzMUI2e4{& z8rZ^ngKr(z_W|hmjU54Fd5o{&S^yaObFLQfTe2U(xqkrg_)V++)~vTa3vev}ie&vb z<8R7-0LS+MdZ&9_k!U^p0m1?PqZZ7YGQV)80BE4Nbt&7ujQxcx1@Lvh`(cn~AMYfN z5~*FhOSo)_KJNo@Vl_<8j;ZQlL{m zydA%;Ie&}=C%E1LB`*>24Rq*ooTt7Iphd(U3Lg522rZ8F&{IFgDMp`@Z31vtaK7Xk(P5^xeT*d2uE}|Cer$E4RAs*XdqT0)jZn!y|kRi?%F4% z^fL`SDL8M?oBbo_{r2@570st+BQ>iF&OnQsCV~&Q)9p~ZY@vL2h;j_4g-RBM zkJ49YE_;_HB8pY42ohIoNYug=8cGt;o%Z$;6442(q7o!RB0@n#qBsqA*|VeA*}I!V zh{`lO^UM3c_jY!Hf42z8mt6jWDL_uG{l;ARL!p90Em#rTdExzK*PBL zOV8SXq@g{LSgyW|dp-2*g$c{np2n6;?12%;O^X0fF*L2=H3|}d;l;J}#KBUa^Q{2j zN|Dt-w~A2^ljk1YR}KQsHc4>Mv6<uw$eXb7ytkO07*qoM6N<$g3mA1D*ylh delta 946 zcmV;j15NzY1H1>27=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000ASNklIOL0!Uj?mGw*h-$CJ1biO$)=C2?8YVmki3~TTzX_)eWdYk5NJh zRY4lP4_EdEf|!T_FmfcK=e6r^PziGc(0~n^JYE|>RpNPQ@%E| z>|}fZzCB090Ik3V!Y`nx;iyMrBHTJ7s3yQ}vQ~o9_J8I)nyVL=IqkUsG!Wp#PL?1i z_uTb2sDj4;r{mhUgr~qn5Qw2I-AeBUq`VuH;1vbv_2g0Y zart;lplbp+AMfWB<^(0UUI8TO)~0*f*FQG|ei%i66E}*s za%BDX9~u>aE~Sq8_06nQx)0Y54w8D%bEn|}Xk!@n0%ew`)_Afe_gp^RQeAlC`i{?y ziVbRGhTda<1_jVOXQl_gkpi^M^J&>Plx!5(bpUOQl9;~Qcrza^rxbYOlwc-FM=C*x zF@MGzJ-VhJ9Jy&78l-w!+w-;}#Q15w*)(k!IKO7Y>U5k&O9prjt3cyQv4(WPa4&$v@K#LJ@Y$6?hV}KouK@BkrQp}^BuSH2eR>wXe zgwHf^C*!<k?9;pynWEnZg7aQvqFqT5}&!W2aO!Xv@a0dOhSDCP9oH(jvVG2+?ErXL=;h zJKn2};D9vuS$})m$J6_npeirFF;Wle^z; zFQ$YRwsx-6zmN$G5<2a}zfQbP86UW|P*x6rv^-jkTYrA}-B8of24UL-(+}==7BC=o zeloq@C3q#>m4|~-AdvlY_n>n3!rJ*NAO@rPfzC?cUCr-bu^*!aR@bB(Ky-1~|1mg*i7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000D)Nkl3G140MkA|G!KhZmqh$wy{}aNEoR~If1auc!A^sfC2}v#V30J2e~)`csY&$ zUXCMxm*WWF_-fqh0e@Drl2PMXZC()^573EH z3S8HfJ&b0Y9N-5#TX7FU0(k2pX~?wxQpylMz9N-(c6FnXWenKwC@w+*IQWY@4PrF$ zh^+;X<$~|*cNX!8^dzvym1dEDS3f8;I?vJlrwc$LarI<#rtmc4BYj8KFYO$FyHTkO zFlVtn3uFm%=6{&(_G-%?1obYAx4kAnY&(mfEaDOANnkCZ!h6xgt9M~%d!uaP5$OW( zE`ZkxXS?ZI-yTl`kWV}!T>ueKZ$Qh48QU}7mqlQfFngfx0-~AtotZmk$h6Np$fy5% z=PPCPy=ygct(Q*%YZzr&l7MQ@)$d&O30iZX~$bV=dp+#7$x_Jxf2SKBNB9Ppp z$7S+x5<%_oW@T)Z1affemJ&6dD@3qcM&E+1LqKF(ru{Fq0g!hX96J+_*fs=sVml2B z+*5c%h1Oo$h3trJ1z>^Z0+cLHl188;92(>4Ju3{XCJNDu!GDI|?SudJG;FsEh>&5C?CC@6tLJcOHEewn zScCP25C2W7?;(2U_z&=K0RZSpB;Nw^E7tLB8Gm=iV+GK%d$6{MlGoVX`T;h~0czkU zezornz3&L{{?qUn0Z7Dav0iie^j-~5uzr9|kAf+zM9$lmi$E&#`da_3W68o&Ie>Kh z>dnlx_^l;*T0*Gx%lpv8U_Ez5Z07-bEFRly?mKb<81*!(ir|(Up!V{``*Mb#(pfQH zDt}8?Y0Ia5NhBqW(v|nS^44*A4#`<{MU>)eh1Jb-3>BjB-gdQUru z;q9%f6t_7n@}>6;wdd751Fx5f35zGTIU53%g*ouTE25#*RKZ{ zY56TN-?DgbthGFVwhQ13L*svqtjIV#?SG^Fc%P%a&;sc20G35Wo`Hj@k=1+U~dHRFupGh;A!TfA2c7C9P9`Arn1XYo3k2q;F)t0rd6yV3IX?>f)zW|Hq&lp3V= zmT9uRv13UqAE|P_EXvER>R=c}| z-6R^x13VqQ0^seeerk2@faw8B_UMve#b}O5j=|flj&JtKhQcWXLBIe2002ovPDHLk FV1huXS}Fhl diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_4.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_4.png old mode 100755 new mode 100644 index 0f81cd5dcdb6e26f764f43bd0520fd409db3d9d9..bf55efc7dbcef6ec97e8dca663642af46fdc92f6 GIT binary patch delta 861 zcmV-j1ET!q4d@1t7=Hl(0002`twPcO00S>cL_t(|oK=%sXdGo2hM)i6e|OfHWG1qy z3kG*-3$3YzcmP`(yIZtUP*5+t$c;n=Ed>u3q7h3oHDZbtt>6i%7`)J8upS_^LQ5vv z#t3c6MOqUzc7lRSl5Qq3iF=y)yx0Wld-=RCAH00L01c#x`G3R#Iy7~Kopr!Eu)m;v zJ&}Vn9Xq}E))Sw(z#W^0_XBim)Tg`Xpi)rB00qR@OE(khDnQHy&6BRzcm*H8LSyh~ zQy$0GL4s84nSTy22G9(o*>Hm11?yIT9-sr1$U@NX0s*)_wulti6M*GmWWWkwX3Ij$ z+pr@KV2QYy=zrOgEmEqN3zhhCuQiip3=EVlsTUqm^>TI%P(MP(1#ojBA|eYSB5Nl_ zL~2SzBm&;(6%h&6oD#%`MZ~@FetPV>bADJNp6WOL7BV6tjP?fV`{l&zzT?v?Qq^jY z^PHJadQ>_&3>5|-`#866F2rM?WJQmIQzWqpp&tvA34fi0LW+5u(A{xREv8t3#F2=G zl6EbLfNLJMt=v>0)~#e5^b4Gp74gzel#v77INEDHw>n+(3qbI7k)#evL3~4u08DeS z&o*Y6NnJ_?AYsedaAsb^R=@>V9QxDA8~mnyWH%DaSAlTn#y<>^c|M~4`=5TfbPH>f zY_>ynaq_n2Z|=Idq#IX%K3aiM=h|z(4Nh(Ibe0#n#K<8oMD1S=y`MLEXz3ZreL(Do z$$?os18@EMt&LRN?OTtyb9bs0zx?K@2apf%e)yT>%+39j&qpF6(VSltnVvmv+%CB< zrB+WsW{#fuoBrmNsaK~(B&teLMC3T{PFS5H63xl1NErTZ9*IiB^(`CFpb6HtO>J$+ nO=P%E8gUc<1KC=>?RxMZf@gg-BrO3S00000NkvXXu0mjfL5Y;Z delta 1762 zcmV<81|9k62IdWr7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000JX!+|B7}>yL4Q_DzfMFZn<)_>d!jo7!Ki{~`_=hTW^gjHscf16E1N1!YUDnf%QN5e zzCNYwx`$68L8Xq7iUC%X@0ok#pQDP8Dh0_9EeOfJrv-kQpj9KB1w66n?$Z{DIZ!H# zu33HV#HuW>>$r?BMNMUGvrWeWjT%;u+~N{*+{ z?gBnZu~iqaOO7YtW&snQq}VE+er|!Vn;g&roVE!&@F$SIgB;KTpdUGW3ZBZtPr`B~ zP)EQ|n}5b^#(-o;PxdlnM&fZD`84wPYKanvd<0@tdc>G%dqQ# z*nEHMi=IF$ld`c<)ve;E(X)R!e>C#9+9494Ie)uc>uz$q^>gl>u|RZl=jWC2k#elS zup5zh!9qm26_@fWNFLy6;I55f%I!KW-Z~Hgs*hH)@ra(^l6w^ytMNvgR#{v|uuO`U zsjWwXuoKeRE*UDi`IQFhn<(rv zD}M?v(vO_zY-Zv4$0!(a^~)Or1(EW4W{n=u7(ZD+bO7WcSiX)BDXK(HNH)s%{QfRP z;w!dZw8qucTwD}5DK>>%6ddIrmmB5{(1GyzsB zQ(o?U2YF5;jAh2PW$m_fOBR3yR!?oPw>e!KhlsjTxwG0?L2^X4b_<{p5sLMTo_G`- z$?p+VmEUQVDkO;(#k@JU#{dyQm^njWCNC2a&+D^aR^BHNO?|uMTlxbL+4_Ok#((;r zMRx`BZg{Dsm;SLaG|B|<{1A#_WxtM^f;BIaG3y`iL`0#oT{Pdf?vGI*07^$Jzr{>- zBx7J>WE8jCl&{t@p5@x#nMWj-(}IGJ4LfLCVw-RwrCaQ%eBtJkEKlS&{)?cJQ>pjuqMqiSR=z^ zxtVM{Zw(n}#b;7jsdOoCM(Guj%y}%7|3nN@CJOKvbJ@7^J!*P8O}~Xo9$z){-R}&g z7{FrOY!ekmXAF7_eVws8b0Q;cS#aw`-&XYgl=3YSl(PV)eAz~Bh^2gQ41XqkMv)ck zz(^30L9V~ktY_VAs|7%dV$dYWC||beKqj_`_GRt~ZG4yVwZ-coK`IEe6e3MF>$BTO zTbLVWZN`eF(e0U~SW!M&!>R@NMSwX00yF*Wq_d6iPCp~l3g(!WTk+P7Vw5OpwpH>)ul6q&2}U4LeNRGuUh?Cg4%&}*9WTfUwV-iiUx{D17b7ql|>5Ov3| z3*2SOl8cM@`ARHsCp@L$B?VbIxpzTZr`5Ox zwe>84jyc%D3|oNje%M?w#(6$Ja_t1`;00W(-+=bJ zfxemU89-)i_bI)5x&S2FYBYEjpaI~KwpYAXY0jrgfvmcd-`e)m755E|j%o$woS`0XoPX~5- z4cgAdQtRW5sh-f#di}&zSAa%Cm%p4d^xu6s2Z_ti|9@%<>ON+~SyWd`A~LEsesk1A|fKW>O#sw#;fLHV7ayeh)=E}5tJl4zYS1mE?2}6t3;+I zZ4&4SQ-O#_Mz(tV2+N&&HAf^sNy`?j_UIq!YatfNs<%r%S*73KSJIpXN2&zo_L*0Y zZzND2G=J@cZ+Wy9&9A-@2__)Zh>E)9vvK+~q^4m52Q4na=KeUM9Zj#90Tu3R4*3xz z%F4ynlY_}x;79UZ-W)(>JDEYCysA22YPhd04DhEu~NV$CC zTf7|uBo!bs(f${asBn}D07W1r5@o(qs)e8;pf4oSO8ud-9+Iqy1rd?tj`lV}^7|Q& cS1oe>0rYPR4puS>oB#j-07*qoM6N<$g2iM*fdBvi delta 1405 zcmV-@1%mp*1%wNb7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000FxNklzvO{^Qy8X zg#eO%*l7{1IOnsAE~;F^@)QtV#8m{^#rf5ED}kHCvH_0c_-IFwm%G1A1WMJbCxTjw z8SC>?Jpea}lYfQh{ilRn4y)#0N&sA_pa6+*M-o^=bVa|TeM6KHz~WH2`_DXj*LE84G_scR_8;D8oEnD_?5R0vqu zw*{2LO{8fF8h~>?KI?mpdnzG}wMF1&Ou9%}#q#1F( zbPYa7U7z*`AuDq+wF9uip0VSp>nAeQK8ys^Jyio(9=J20(`U^M??4Kcdzw?Volf=B zd#58nWPw(zZ|NH@!mP;Cn$P*1MzI3V4~u%-AAcDED5iW{G^mE=eCsP+tA^2bIyEjE z0W8pRn%4eXzbSC159$*Ix6@BM$|At8j)~Bg4Jxef@GY$iUL)%qE%!J(BtN(bz~xeE zKpdW+5i6Z!Mb!Bjpw<`P_o#l1Pz2D}c@08^9tZm~otljZ2`u(o`W+$PMXbgg1GT}t zX@7wuLFEo!1uhzLwsVmZKc|s^Ys2;18bJVUfrpu<2$Q=yTZ48C!)-0%%|Zmq26D{i zhyWvk#+nMg$>|iV;!x5}@OqZsIJ#rSBZGR6CsAYyvIEl2cOYyToZq=-R1OBIQ{xj#B-3#dF>QOr3pVlO5^ z=*&+%ccp;QjDBl@HqH`Shq1sdcu0<5q^%DPcXg1Tm%#HMOXK2wiQZ>bC{wJa?qllaU zG*syZuJ24}!uh&Y7Y(BmB&$x=5pLdTQg1vgbG2H zV<7yE2gmm)V=1F8eOloq!m2`%M|4y7SOTvXjR5lB=~q2;2G2di%3m=||0q%MqG2UiM(rl2I!By%+ZL8Nrkjhl*s#A#{Wh@0Yjn-)O? zcNSW3G?q?Fm`u!{dCt6f$Hg1t-@Cc@e&;*iIp?0kh4(G@y?-cxdUY%U`dvmo|2mom z5Bp8V-+6TLbX^6@8+)o z%Ds!%?75Bs1_QMOP+y@EIeWX7goq=u#Xo3#N(4c)nmXe_UcoQ$_G$j-5*UdcW!GYY~1D% z^b!zH`>DBaaNX@EneSxsrxb3Jl40^E;>qVbFFx$GUSas4voerBX#*t#5BF5pqG;gs z<)rU$!mzI~xcl&!Vx)cr$ZYU?|Ch&3UbkWE7?7SZWq%jt+Zt{(O4aJsQq`aEIumzc zB=vcqCXfDb6b4<-g3{9P|JCX*cdC3=PcsX+*|o_^?90dNE2*4;ib=J9mDrbmx-HcN zh@G<{u`l8LSp!-`x06Y8KHOEt!YFABON6ON`1L5U4n-ZhW}GLS$LagIaGpi1zgEAO zwSa;&oquKujs0nBSvDV_q)R5Nr?LNA%+h#(6sh$?^xeR{;ja8x11pZQSxw)Lou`yJ z7(n;jf_bi4MZP%a4c(l9E0iHJyPtX#HkTuC{8dNK8OR01gFxF&gJ$4vF#ek(A*7~T z4vVDw7Vb=0(gYc5S@s4||D`Rr3n*@30PBwf0b=B8C|Uk?K}pxnG?V&kg=f_|IMN9K zP-_w{FL6A4Ipvl}wEql#CjzE`oJdq?Q&|r|MLNEJ00000NkvXXu0mjf_DN-b delta 1490 zcmV;@1ugpZ1=tIa7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000GwNkly9fS2-cIn|0{cbY-}jy4m!^6e92~-s(^yrrrTRC~D<1JN00vij#GS@hVgSGC zw&1<&-rH_|B?chfmb)1T-pk!{BklZ`hk)z>US&X6@YQ%)Dgiv+dl%^*p95TV19$UX zX>ihBjyHe@YkzTs0gN$jmn&4ly7v`c=~Yfq0JqV(u{ple{o=T~d%YE_cx*EO%Rxay zsMzoh<(#N|nD}XDz`hQyJUk06eEWCZtPCH`bzA95bT}H3SHIL+)&uNTJ{1N|zQNvo zNpq@Y^Uz)TgAk7bsT%k6CX6JbRer6Ox5`1mLT76dD1QOp_|uioA(O~vLPqqwQU*|Q z1FlA8!r5BA;&H66u9Q*+U{${Lw`_MX7z!C9(tg_q=T)2&rd=KaIOXFc58|$huS`^> zzI{~rma|@x1X71`YDl`AKAy~@{&0@9$?;HKM$2RPw( za4VkD-zxr?E=E-O_{M8AsP!LnnNV&tlaw&jR$_g_A%Cs9^h`bAA-9r)qi#TWG4h0;r5g#~alpz5=OP|slnj{rzRUyM)g!Ffhjeq{xCG4`9p?d{VAOMd z##T;Qy+o(_iTP#ux7NrTjrWQBBKXe(=uNC1faA5q18^}Heuoth?PS42@ILWABI_$* z@qZ*9cW>e4_5hZfLs}X*WJ=&@Y>zxW`_Slk&yDjE79~nKhQ^!X)qAgf7hu^06~7>) zOub4On17ZAlo!&K=5vbFya49Ijd3!5jWvS-XonMZKUy7IscZ_>bftQmc?K^p3%q$t1-N}%ykRula&q*aIr);zDo7-g&4w9jZbeB~Wf<0kPsHvnsVw$!~+*Gmf%6g>+xK3A2VSwr{cHE@pWT>vJS zJut~z%rPxP_9zb4)N`Gs88p|y^?#Ls`;8zYm-|11s&9$c!ZUQ>JUm|tbr`F>1$7}b zS{pw7~p z9IJ_7btA}924X=h*{YU+;_obSMo_K%NP?#&<(@=vNh?@t1bqphboR6mm4B5t(@V(0 z+ZVuVxU=!}1JbX9IY>fiJpj07cU-oVojZ7G{H0Ra69(8mfJYb)EN(1A|1@~wu?3cp z;4**~@BkG_RCU-n5mMg5jay)8{7|8SYIwbKfJkfg0gn|8BM3|GM2&qJ!>j_l2}wos zrV5cNU=>y?ej*c2pb?N&fJ=q(&SZ(h2{LGMtVF~JQXati@};7T%*s$HkA$m~Kan*8 svjlNT6mXF;EW%_9*z#D1sFQ>#fC*OvphC z+C(C)*wCFc0X0T4X@s3*-<`jQ?eF;fF3;s57y$|iL~b>P8h?Hnyf%;sCfLVOP`BOdMT63vdSWyS?;pfj_v4ZeQ?ltFRK6e=+~ zPUis7U_5GQ))ztqpg(ONSsH)_yu=4IGUWrQ;K8LMi_YO)zo~Lm&;T!9h^^RrjXh13V58*rt$*!P&bi}_znYG>2NYdnC6)9T zySd(JO=u4qi;tgnj;a%8y+57>1>7JxnB+IEj4w{u;0*Bf%Y_%5?&M0zyQa_?bW|E| zwj>_g`t+tkAL_v!`f}}^weL?3Kk=#!&2P{Xv%CNJ<+F|*cUj{(UCXCmvb;|&CgjqG zLHlQWFMr>jn(xdQ-CIGc0lVvq?@szMs42fyD*}p*>f$R)v8o1v73+tNH3)-8PR*J- zzMl;H`k!n2Vi(8H<^~4N)NME+3H$1;x2LOfTR#JIQp}d?S>xRq)7yZeE{4m_$K6@5 z5m^_&x%Z9RHJiOIzV7JT~ZBSs8GiGRxBQ~Fkg@&`wr4-I$eo{gW?mrKh( z9QP-E8}akh9F6Me`>N&+Hel6_!=^?O{`+X}h6Anf{an}JlWym-g&~-<5dHg4fT1-p z4r{ndzfqIv{`}6`IiMK^N|$^&`eEtsCoKcH2+@}UW;>_8HGM;{y}$}R(0g_rBtglK zQ)macBoXrw6k?RDEbZ5ys~Pz>fK8t|yOm-l3-3p$HYGi9m)Bd_ePD^0LoGd+Wk3aZ z05FQ`Rtm}hRgtV9%>0>>-;xkSMDiIjpHLQwQ6eIi{13w(b{C5J#+Lv9002ovPDHLk FV1lbBpmYEL delta 1863 zcmV-N2e|n92FebQ7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000L3Nkl>oEIW(-b#Ov0W zQ_yVL=(cI=L*+_q>Djz-Vm+xnl5JmGv1O!Y7&WAgd+?LhcLHewjG>49eUIbBL{Em)i0rq9e$TEF0e?2Ex*%#$_4%%`i0m6JA5vpz z_mMM+76NP|PNaj5?*~pJdn$SBsMxaM&k2Q`weE?vC*t5t%25f>z2oQvC?Sw9Kll$E zo`gp-^tS_*@ttzjAB3EQ_u~ofY>7CQYzgSXTJpONdpdqh)0KX%6M*jg2npy|L4Q~knGh3QoegS{EyL>`+w0W##3h})><_JWWtu_aO&jhB18)ro!&q-A~G`Z3A!vE|dn*SN& zQVn2L_w+M`bg%mDoHt&J5*h(AyHXHUX$N_`P8xfna@H0-({3RhL&o`$l%TB_PrF~* zpi|(*9+Gpjk-&4dmV?n;Zt3Map3Xn&e7@tQdlpf(=r!lO8v(L9#>m$MXx^6QlFhME zXL!!Hu5r?N>tsfNE<|#*_ev)ejRcx)e1F$y5dfVZqPtq~QQMJ}sp+NbS&9HRcE6_+ z3H4s}?(Gz9oMc1P`ShOWRBxwCa**iI76Gi?(Dl0CdpR4eWg;ZD`u&LWdDR}RyEv)& zj<)i>WLsMVxE&Fs3G>3z+Ua~pSi4^;Sou8;uK<x`tq2f03PzobIDdf} zCK)fu(O&nn)_v4I{=D>@XSX!hE?9HZu1ofRzaJMOfRwAH5Jn+|HYCsS_tIxcuV;rh z4+)XYg4{!+TLdNnyd9?zz zB1T9+pSOxbPj+NYq{`cR4lPPg<0A!Blt;}QTduqFDhhpQ+N)y?0@NkSp-_U zujKZZyGD@9-xlz;Wv9l&ALGjuI9 zT^;8FnqApKa3e~h?=Il`LSq}4=`2uYM+-u$(~3_EKsY9ZuZfkAO^8+yr@ERbCYSDt88JtF>b2zEX)9;Z0O`{(N zK^b&Z<)>S%rx0-p0`!nfs^`oIka1$QW%=8or7`P10yM{aX?M=~GXg|&QpbVK--=Ub z1siBlZH-SyfVVmSWR)JpX~%DLrIR0RU_|lFVoAdrZ1C(ji9i+-L?Qs%Ep(h4RBh8sa&iVf@f>1@LoPT2>pKjw$04WG9`~&J5q~%?Ue~178002ovPDHLkV1n=% Bldu2) diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_43.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_43.png old mode 100755 new mode 100644 index 32d4eb4f1a2867fa0581e96208f223087a910713..95e61d24fd4520d1124dc2663ace989f4e6f40fc GIT binary patch delta 733 zcmV<30wVp^3+V-r7=Hl(0002`twPcO00OW{L_t(|oHdZYiyU&> zDG;}idskn46$~O;131Sp5E=AX0TAj<-+2`dAmSZx29%-#&$OO1Frc6Uhz%GbDKM(Z zn+x{XF)<*b0l3ifxXJ*70wB4~fCzBB3$UR{m0|$(P6kbQp<50VZ32{od;d2w$QTvR zeAW$wWEFY#JAVcS5KmmfOUEsI>#PE3rcfKy-^um>Hfb5$^)Q*@B8MDt&9w}0;c2oy+K z+6MbT0=DRBDJ^Ou=?B9-dwo?Iv^C%xV2h1h(g~p17qEV#j6aw3d%t8c1K48io}{A( z@O};MI`n6fj({NmqCb~(Qg@J_$J!-8RCL%$SJ*;Q8#;Xrr}_;^N&#a0({Cj2fe&eb zEFL|LSmH8Td_{BCH;woq+{L2VL+BM1uhmtW8DB$9aOOP z=w delta 1488 zcmV;>1uy#P1=b6Y7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000GuNkl2Q$R;Rtl1`;-K}rsbSlzAn-eCi+wVlVm(5ewN-bo#> zT+Q>FW>M?-XKNJLS9CzDaMXCGP}%qZ0R#Z}r*MQ}GQGP3s(%?DAcz11r@YfM&gn=c zjY(ab&$ZURKPx@v>)gE@LJ0tHp24@}ddHUxi^-t9Zbdi&0M3x0YArDIvg+4+|1m6v zblo!6KnelIAUn$5_E;|{y`^_KX?(0t8UY3}J+*oi(B6xUt06=LdhhuJ7z24wEfsj8 z68DV9&~wq}eSh~kIv*jx7}SHer2=hnb|ZRGY55odRtjjK$)Rrq<;Bv{&jW7Wj}l-Y zg9H^|@&1+ZqxF&I`U(L6;=T4QQGn9Z+r;6<(9Xv-0s!cY7S-^`hDOhE&+Pr&J9(Cd zR!6u>005b-+78-~l?5&NqKtnE*9kD-SqkmSiGnm{<$v__xvjvAQ5;p2uQ4Je8>fa! z-VacW004R;artp2V`tK((Ee7GBLIN@BMPZVqKM#)0xMaZjw{_Fy?@NXszWG^^*PaV z-hmW0SNcb$6VDt)Zrn)k!WGJr9v|xir!l{Lgi$pUs?iC{it(7cP!)ky zqJlJuTqLl_q2vxZp3bE9K5EIBv0QwN1BwWs5_G7T)J%-VYp4)zc@AIqhUUyxw??O} zWgwosQ(v**96X=1v|_PL?U=J1kKr}?TH#F%Uk z>w=U<(8-zsM*!~p%JZ}l0RPS{_b{mkj-0C$0z`Pi?h9rTijsZG_#SWt>(&=RRPLpIUmZDot5oO2 zzSa0U;PhB_PoYo*kizNh6mi4&mUre-20lN|nIeGX$x;N6&{}&aOLf|Ad7H)fo``4F z#dGhN-^V#96anUEITqh29Hp_iUc@de9)E2GO8}{A&w_>or@<9cr;tIg?FgXlq*-N3 zt=1dh#;#HbTJa!2w1-O}Q+jq41#T9D+E(yeV2%Kus?>w3QDD{q;Qd5s0MN5?dn8$K z!E>7c1J=!_3V6(AM;hN!IHGq@0Tl_sMX3h?ZnITO0&4kFjR*rL31O|ddhh=Upnu&- zI??%x-uJEq%MKrhsMSd8y?5(2V)RCjcT(O;f*I2G?#@bzlleWuVil0FzUSmdkzmNW z)hwD}X@O@n*EBMZ|C1=~HLVf3?+{McG_$^Q*G{VowfCVJ%c|deEb|W{DD09TyJbyb zHXCrAY8ZIUH$PYc>Bo+ z%^j5@BHoK46pjFF3Ro$-qmbtszGpsCo`fg85=kt@b%x$EDO7!c3}|}`mK^@ZC84(c z&D|%>5tWAKH1Jv7m@ogH!|!@4R}+kL(ZwvT0gnA)hy_;TXNOG+8Gmbb>fB7| z3=;fo28|nT!SkXg!~AN=Ij&{tvT7D-=8H=MWD$5PZ(6#4^Utl+MOF7%xf0i%hM=RcD_<@ufzzS|zwYvZ2 qgj?!`>bP11WNdzT#=N0NCHw{G&J$Kp1>jZy0000+ZHQoz z;$gL=rR5;lr;#+Gmi`8d_&|#l|HO6%tCWJ0jF=yhMlyCmAv=K}C6;;#^u))$@aW2(I0C&eSd~*^(Dpy*8^rL+7+kA zM}3Kx%ICm@gRqM(Ys$S7%^9KglaK@Hc^XvxTk6SCk)Ipp>p8>0KO(dZkoB0m25&M( zVIkGI(+eoy3HXkoA0fs}@)@8Ms5{_3z+Hi}+}E?E1{+<03)enaNuZ2XKU}5h}fF!)^ zjD`9Dcq?r1bAAj|##3rc_nWvxoLqNw59@g(u22stR_&00000NkvXXu0mjfklpL3 delta 953 zcmV;q14jIZ1j7fA7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000AZNkl+bA+Lu#zEZ%8nHhKdtWvrV;JIH3U?Wry;2H^sLJS1ae7}xM;+fJePPLBW{H+N!+prp4<*SmsM z1MCcIke5Y1Sc<{3hkgil3eXzD%JX*$;)HSj2z#wF;K@#Lqk~a(Xqx!p{s! zWKtD@9)FR*vPIgGaST0!JKT#F%6*-v03f48-#`SCwr=S2UFighyy_GnxdBR->g;pw zESwh<(PKi`?Ks#AB>xEjGs;PYkQW*uVEbtW!a06g14#PMwfoJW-bkb%J-pg$ltq3w zP!evj(5^`r)bnJBOpqWr@A2(O5u|qmv*g{(V1GiFe7Dc;QG{wOAbN!>TBMk#k0T~Z zdpI{TK-WMO$Wj2OjA>_Nh*s1uevEu?;CEg7rgy!_UK?QST5JQ~4!$P^PUj8xaI>pO z4DSc$xYBh$A(T-I$oZ$H*)S7@Z!31p=tpz|QzkjTe zobyD(k6;nOB?4goL{q3>^@S$)os{dXut;y903c(m8VsaJ4F4sAkN1ihp7Tt^!$9sh zn>&|H{l8zv;+eEgIQs4(FLHv}XSJOqfHLB}Y?%r^X)OLVwg|wo&8)B`&070SROk3L5%iHw9CP3s?T> zWZQ~NE2OWE}x%c}%IOjV@=^4~Khgy7&A%a#)DSs8?hm_KvA%u`pk1SKO z)2SseMapD8OQ-rq>`MRl9mKMcPO3nz*E~)q;BsUz{tpG0Rn4Q6`opJ%W!>0M#nX_9 z_*!1;#>3R940UfZQ)Z8b7IDBO_4_e)hb>&_@fVLpUCyy{ksm$H#S-V$F8y2h2qBi3 zbw=uC{32OCE#Ta6j*Tx+`&S2_On9W!1->WI@gr~kSo^obvIIM2Ibcf2%rn61*U>8qTI zXo7uq!y5KRy|mQ6G&hzUaIb&nld#@qp4dF*ffwc`Hit_VEBrmU@ajuCL&++*a_u@; zlTAbVaDS@|h2eFCjf&si5-qlF*NbQZZY&ki5{Kh?{Jbs;yHaY8Bxeh`s#REx-r&>a zqrGA=tf7qck}qx^Y=(B4LnG_s+RokXE03+C>&jrGLaT??Ez|LvJG|eue;qQI+^9xT zXl<8M<6IPIr&Ua@j2J1UTT@d}*vuH-m%9ge<{;+6smB;m6;6tT{{ZyP^xE#ih64Zq N002ovPDHLkV1jbpRIva6 delta 1390 zcmV-!1(Eu*1@#J$7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000FiNkl=v_*L9UI-h+R%m*-3T zyK&cAf3)F?_u*MR0Sk6j)RV1fSOHd%vXjs=WiVr1aK3H@uzxN(dttj;gDBd%W+=jS zT|Nb{2)`}lQwbY|TI&!cz&zZg{3U4wL9O2}`TL z3&<^WEkn}4H|_omKRsGj9QmaX3NR}8$i@kC)I!=Yk<6e+ekp_kw8>}&^G5hPkT*-w z@i>ujE%#zhxPSX@+^F3skqRSx%Yt?wzm&Q2z_J`=@*5vo@=F00fHFfIxu4+UXS=#= zOQ3`axt?(o(13wD<+5qJDU6mESm(M zv*5p(;ABK*0aAsJ+Obi113)kN(ZEhKE_{8}&X+j)WdR_r>k^~rOhteeK!X{@6b{;T zYb&eSpnt3kB`?)!U{48FA%pyA&M#Sltkl+;g;;nw>RrK6^aPom>Sd<3xX<3})_HYZ zz^?E_{Lp2=>kZJIS#}WT3bImL4XlT9uGGZb%&&jsMItwCNXH2GWw50BT{z+JD!=`LYeAt)2Qh@Yw`a#hV!5n0cJHGlY& z9GBbCoXO{QcVq|ey!*9P(_dc~Z#91_LGA9|V=2E$n?e5QQZl8~cx(<^)Bz%({Ji7_ zAUx}ckUv9i*wXdJ+@cN;g;oh#n+Uw*Q_rK&1j}$PWSdfodp4Z;h1aBsWrB6v~X=eqkoMF@Yqtn+VQFTu#8qz6MH<73NYKhTTGd@FG}mZ zyVpyWRtaYUkI#NTz)U5eb_jeOutB5LBh$1< z-=p|>C^M%GT(Yc$CUE5DU;(#=U5hy!GUrVGZeXwT5&3LJVJ2hj)8KK7@Mp}Ul$U)$ z1chBJfM-KdR@=Ikuma2u7_*U?W6wg*YFib-{i|V=+13gpyEyX(XywJ7d2pEayMfvF wzXcgJh#o%TEZ_@2-0umLuuE`tGG@r{57;|!ktiAOcK`qY07*qoM6N<$g2uL($N&HU diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_46.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_46.png old mode 100755 new mode 100644 index cfc81bd3f34bd989da1573353a3ba25cb5d3e227..b19f70c54d4db1921b85af1227b14367b39fda14 GIT binary patch delta 576 zcmV-G0>Ay$2+ahL7=Hl(0002`twPcO00I} zTdI$&ISCBN`j^%ij1|h|y(BOu?=Q>>fKn#gq*_=qlduSipi~Ays&k7icZDll;o!P= zrzPZ31;S(1G=XeT0nSiTNJkZz4NwpGxB?)~--g7*#Khv8C^!CmIG3`*CWM;7+_VBP z)V%wH16^px;eXYhx4$EZpufoE^yKI1#aA}B!wUys52sw@VKNyET~i^41h&+5O7@=6 zdc%N7YKKgR=_~=LQsj6&8v(evaybGUW%Z?zXe6vveYR6 O0000(+4<0YNbOE}h8=Q63_q+r46pF@zAV>k0?^;E(q39OC!J z9b^1>!@+)dtUEw~S4UkriViz~6)B#KE@^`qSX8bKO+(v2C@SY9~nBucq(LA0EQqi=5kh zX;Ik*?lk)))@f~9wa5>l;s9F7hcvwO5hAbG$2{YQ^o;BbAo4?~I6&$Q=4IRrf5xoA z8sDpYO9pGZQh$F-?kO83!QRXAwv>>MX=`nKYk4kOdZGS2d81N6%Lz2scx&TZ%VR*9 zY&|@wVN2=EoWR=n*76dda@E}hl%ZY=*2cG%r$CYiav?|q*2cG%w?d5ZzZ7f*YvX&D z=eF%3_3MU|Yexs~#x4f@j_GrJfX~wyq<9q`MrP=l)5Opdne*Kp) ztE1mhMaP7KWtzOWp=*?fa$j5Q?mp6KLdAT8`?b4q!DC zDSx{jiq2I)c7Qk50WgO^)?=04K_s9HK{dR|308!}@`Wx0X#>0OULm|vY6#ZjaZw1O z?3-)Pscj_A5h%|vpN(K-d2mw*I*2R>0={(!hT zw}KZ2<-S782~Hhg5pWa8oTu7yfOY`NeSZM1zEby2@|wFZh^MLpSkLU$$di`WL>UFD zIe=wx!rJ)O@>*#1>k|R2i$R$8dM8hld@X*S-q)d^mr8oGwehXxDUdwEuKsQyq+H`Z zfVJ_h<+-3ng~VI#K<4)Wtc|ZNk8Q(ol3LWJMuuSr7>Nd6j6Wi8k<>v^o9YPcUqub8 zot|NhLAkew(X|7xgyvjeWTyRYptSrh7_9*I?DqrjRdkUH S4!*+x0000+)LP_mLj!DcT=vUl0+SnS?q zH}kLFyqS6PfAb#_S{87{0=*J}0$LWXqF4kF0xPOM{_8xwsb(L-OvqSpgvB<~FGo=4ax9A}F+^7o@;1F#1Z&hpTYdVRO7kb{RUb*++} z$28tBAd=c4lYTn$09A?{t!D!OH&-qOV1ullRIb=oT_XZ?q7VbvpUgZEL+5?AcxUaP zM7tlGjm*(}L!(Q_7`FrLUK<_TyJ+Gq#`S@3cW)lc!++n=UIF?j1~^$#P!0k9*@CjN z0z-21gfOXPIR*}sS)FoP^N~Nv6jB}1(CHBL#bHCI4usCzd(UfG zzJ3+lhdj=HZWsn^eqLWyNW?@C%#z{?dKx^k@wao=ka=GLN{0EY-{_{^@ Rb)x_P002ovPDHLkV1oHd2%!J~ delta 1104 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 diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_5.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_5.png old mode 100755 new mode 100644 index cb62bb7b35561bb23a3edcffbcd502dc0d23d350..7c0c0539d4ecc1f857107265980c08c4e706619d GIT binary patch delta 801 zcmV++1K#|K4Xg%`7=Hl(0002`twPcO00Q$#L_t(|oIR64Xk2v=#(y*KpX{^7?u%H- zAtwJ4Q>qt3MJ-6pOX{JbhZby9^st3iK|I)#hgkDAV5x%WSrk`@2n8kJMKIV`rKO^n zMLmSju1}KM*rxbeYLbTCHy$?IIsW)&hWYpgkVZTI`mtp;-nz01oFMk0Mv$(N!U*TMn8Ef2 zkqSX$FH*VRu4x2$VNm>maWlzv1)Mrq-UPz*qK-hT=-EnDRNw2;mC3FjinI-U{SjC1 zdzT&8psxi;Inx77CD(zV^DF}mpk%i2BUD}<%zt$W25kdY-b6TeDRR4{oxyYgSU>-y zdv0rE63`>Z-+oAz?~dSh2tjM#@a1=Y=hr7JgY(eMrK4WGZvRRA^8i#Mu$r#&3%mIg z&}QN75O=D3|6fNEP&2EVnc3g+r_H&;3XHcU!P9gP999txt0E#vc#_FSzj0vgci4=l f4;p^(`F;NbvPw7qls{BR00000NkvXXu0mjfvTlN{ delta 1669 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 delta 1242 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 diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_52.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_52.png old mode 100755 new mode 100644 index f7da1b587590cea578793c35e68f8d87d9b2287a..043481281a24ca2a2db9e7e313099142ccba1f22 GIT binary patch delta 796 zcmV+%1LORj45tQ=7=Hl(0002`twPcO00QnwL_t(|oK2F?Yg}a%hM(`7uk$0FBonpT zMWGj0u@Rh&7-(f~Nh@vyL9TY;B7cBND5#4nbIGO!!DQn`7eW_WGA_DsArX=rqBx7R z2`(g{CKpmLgh+0f#7w+*?&~5M%)2@~yyu*k!@*F;Z-h&2B7X?M0uUGc1%RjzxNbf> zDNaH1p1B+WaUb+%T{3yb;T`#@mjJa>5EZx*b^9$5@GtcUpbWM+RfZa$#J!Ul&aT&} zkyJt=H~?GDVB2HH|38N#_gS6Hfiwbdy2>yNhXtTo$AU$$9|9EDvC!oo00&&iu!%J| zlY>I=@}ecm!hfd*3lU`?qinm5`Y-o2#Sq}DZu8N6OXj?ZVB)LX5)%tTGks!kjJJ0I-MQC;IKxtI??awRocK5er{>+uMtyD zpb)~2g+IZAZKwj@Tj-qLn<><6TTs0m!!r~@Qh6455f9)R6c0lSY-5%gC`Hiz^7KCn zpL4x??DaZNu)rv=2alf|{a6FwIY}Ew8fWGWu$Yk>_h7^I9*~Su0|ve`(x+(}F+Tq~ zxEsMOntxfE9>tVy;)9)gXl6QprF#hj^Y<%e#QEpH-Pu@s_n=ZPb%R~EcO`gsaq#^K zaCBO4=k8{$HRhSS*YdJ$ls+Oi_5r^s1Xa3A{v2>22#_SDIW#5r1?F!6avOWCFTzlFV;3;89Q~A>`=({zdR|$F;2m}I#(pZPu~OJtHY*_k3lBBy5Ql}$rsV~ySy`IhpX)`|y a{uKiZ42an6)Zmo>0000bNZ-1c;kDxyBgxP;lS(xUNfk{cY?R z10Ek;=bRK#QwhX;k5&EP>7@VOrT&!S|}< zkSD$s_+kJ%lObz!Gm4Vxd}Pgk1ubRZtiovcsW_#G+m5WUI~kP1aa!Kv|GNN9(3$UN z7^>PBNiV-7G(Cji9QNTa7n2bEr(UQZ_30@_#-+mC{dE)DHL0m9Oy;4No5r z5Q(?dmna=h%NoP!TQcYj z12feY5`QAa5HPEFWR7GU+IY+5MU5*GA0_&yC8x8-XXXGMZBt5{3s*CSXuR`Ihi3#5 zZ>K5VLPS?fu7fj|FBKOq)?74^vThz%+$2U4K6=%S&VdbJbyKIR-I~2Y^e(@4Rs)r5 z!=1p24EVIm7bz6*Ub|Jb&^fF5^v0rq41g~_Q-2C}Y@%viy1qmM8P^4B1Xg7gm78k- zn)0JUjmD-`u=e8R5G%oRBE&Nx2ww)Ra(C5;w687fQat*76ia>i`>}69mAKj1+Y*`MV-5*qKbXCW#^I~U={fej0V>Bdz zGd=vj62;$6W&-8mKIe8L9 znkZHxa{41z*0gG%-(`5CbTqzZs}r#aHj0x#$=zq&R@I$>*ZqsU)81E>jn=&jU4LKl zB2gnze-pYs!iRdQw&jJ~UYrR?Xu^u0w-8<+L~5v6C9kK8YCc#219WDJM% znt>-j%7^sH>1gyne;>pEDo^^1@{vXdA6KDxIzDRvoW~5J8r~Wba65l=z`*B65dwfYUs{N`J*yC3+d2 zXFLHy6XB)R14KMRmzzhDP|rw1S#`ksQLkaW_x5sx2k;<`n^8J?dJw~__B0uqk_U-+ zC)Crn<^bNJR$TRf&gJ7IA@bN=?dhc4z=P)vw7q7Gp~M5s06qB`4}r|-IQ1SsXb40N zLGq^2Tx*OmuKT|4>XVK>dw(0%HksWlI;I1bAs`7cM?^nUIl!A>o&Kmx?t&JQs^&$# zrs)AFQO{MMB3R9Z?&eQJmd}XHEzfY>jLKU*fOf*)x(|xZJ$*BPs)ZsYOa&w>?_6&s zI=z``04aiw;5!vF(^vRcAsRq52Z)Y~j{QL&$~-`}`}Jc4d+{GRNfOEa?LrDr00000 LNkvXXu0mjfMIq_) diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_53.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_53.png old mode 100755 new mode 100644 index d8e390bb59c7b6d61805410e5e8f5eb5c5c3f91e..cb8d0f15f8e1fc2e7c0bc1761ad256e3731e9a75 GIT binary patch delta 790 zcmV+x1L^$3450>)7=Hl(0002`twPcO00QVqL_t(|oIR0GXk29!#ed)TUS=jSf8J;+ zE((3!l^{5xivgqa2LIqv#1{ocgKLFo6$KmfbfJP`x_415F6>043&A3qyb{qYY7Gb? zSoH~|hSHiBY%^~A9|B=>2;?uBBPm3ehQQ#YpU>}cEkM|f`eBYqCij8VV5Sr+xMFV^xlRAHEJ15<0bSJTHtO%fLZwWX5s_KFzfBH zY6|DBV}TU!W7V(2wqfIP_jnKhV_!@9v#Tb{7as@zk@(s7rEmLX#?rk+ zU^`zJX@9ZbPiS5}Jxcx13(v4r_WRw0s-BAc?U^TaCg|RnE+Xz&nREW5!6(y|7cXr- zN66qOod4bD?5<6`{4fOkk^+a~IBjWNgKpWHl4Lq&X-)}fv^f9RXJBHZ6#u%m43?)_H|CQ4p6P4@wehb-lq$y3lV2pii3`D!uTK8gb-}kz%i~IT4yK61; z``&)Ge2hqcTEA1{j_6j6&-NY;0VdEkE_UFQ;U#RHy2u6bdVd0F4x2Dy6*yfx$M6~g zT-U`;0~9<)gYUq8CP^a^xidR`luCODm>AnoT4uoSK*xItmw_jXRqOOB0#HVR&hkbs zG$v(OEVl!esK!~TQlHmM0T^5nXMtx$aZ+*Efnzd&mDM=nwN%f^fLCu6R>4cEjx2Bl z0lW^(L_H)S%yWQDk_Z5|w)h}}RRMGERN(O+=pekoBqN2buD}Pg+R5)h(sL;+vdAJ6IHx+Ifng>VgT&dW!jCX0U2l?Ibd=~%QS8vUUF&k zHa2YaQnwnGu}ClxprhEKoXU~GJKt&1p^c|wk7E)ZdySk1Mh;&p4qUYKXOS&!Aa#E& zm z_x20>r({^(>qd3(jP3(eJGKH6skItn65j6ytnJ(c=-#XEB8gS!r?;0etol%!X4E}K zC)TC#n33W#jaRu+L=nzN+8)1n+=DoFMiQ#F8gG)%p>?<jcj~xxo$-ygH@A7ihgZlNRo-$M>C4GsKb3&3q6q(%kWjOBs6lx1AmeF z$bxgG#5TGK`F`~}rjAKP6!oB3E-Z}IZi%~MHg}w=- z=5#E?64`joA9X%ljzO6c;O-aYs7yV=wXK@6@bc4g)%-!-{}|JsXYn~5Gme|9@H5R2 z9HjKfwbd$X>iuZu$bibEUHAL?Nq;FGo!d2LS`6TMha-dbTNkWF8E&(Yv3vAN)&P}P zI5?{zBEa%1%I~MX3eQwj&wfzw>>FW&sZ{ z3Anzq_aB+Lek-b_f67>IbUcLQ-0Q0O-^Qids_K3u17zk>*w60k2~avvV}IbDc`-H4 zR0h!Isw`k6?SE6)eN#GM;^PRz$kq%{zVvS78qNS#XGbysCRit`3Ox(yy_ujYh+1j@ zsnDZp1dF0L+A4q}nTqVKC(bmUNa`$jGZEfe15iq0w(V!y+!%>C3oKDtnQ5vsL3b7m z?E`!_b~+Ug+%q_9+b7a2rGJB$1X56O?`eLqT-6NF0c+$(GK6L{_+DppdF4yQrLro1 z9>r%g(jmNq}RLT(7jao|?V6r;TK+|)2l_5FJLWIsb z<`)4t!Q9^`!cvV-j=@?$OXwnj_)+M|PPXES`Jd83>eISZ?g06}gf~&^`tLd8@aR7k wnv=6Ojgp8Y09FQXmYfc$$ULDilzyMa7kaN-XPC_c8vpufW0RR91 diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_54.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_54.png old mode 100755 new mode 100644 index 8dfe5defe07510256ba1b870a23f9b915aa25664..66179fcd1a6641ee8e24659a89eb90444c842cd4 GIT binary patch delta 818 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 diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_6.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_6.png old mode 100755 new mode 100644 index 2d111a7a17b8286c98a599df7dd949a088b48617..15034fad322eb919e0a1b653455813c648e7d8de GIT binary patch delta 801 zcmV++1K#|T4Xg%`7=Hl(0002`twPcO00Q$#L_t(|oIR6IXdHDE$3O4=er89F?nFrO z5Sx*3Ui;F~%;z7}iw%DoQA}S;Y z!O+HaLW9}15oc?Rn{;=cht2kT{P2D6@%{l)PjQ1WlKVR(QGdF64xs3~Inx7kG35xL z2VO>H!9e^r_;ghXp}3vnX`T!L=sC`zU^b0{65&ts9hA*Fm|5M-U@{u(f%$1GKp#wd zAOT=u?I`Mok{f%4QwCY{exJD*&1z&d)c)2?L03YSu9ysvsxB*HAFcToeDWL0cNhBfqIiw1(=K=({)h}M3kc(!f z0QX>VsazrMjc{))>1K7_L`2wg0U@MRy)TEKB=Lar>#mZyfH>7efp)9isZu}$qWusC zQqI_F0S*lyZ&@>9AV=OnwGZOEh>0p0z0IXNl9Yi1F@NBOJdpU0qSZda+)nS_?|}p; z@xbVh*gG%kO+j9N|)hk

    Z4<4C|ssqBc_s`2l?a=7#di|~6 zMrQYY-2OH9@n`22UyvyZ&cEbZ3!z`&dED8GYmp((JoT^!i0I>o$@wq$Uq?e4Vs>lr zFt9cOX@A={Ao1_rULxISv6R8iI-t0veyHrQ8`|KASA~@=;AWER7@v2F{_U#@(j}iZrsex0?SgRO z32Jp11h?p*66eF*TYnV=cg4Z+Wit)=fTCpWPJaqA4tf=atp$zO5Iq(({fKmLFkJ-y z&F|hnyInDH^z%<`pRC*+!e#)jv;Wb#@e#c~#j*r7a8$W<<}sFlBh;X8=C6~1M!Lo? zjB*yxb`jW@+*aSg<>MKsna!A)*`M-NklTWl%(*n?U zwD46HAQ}Tmw32y0HKwre6$-!w&!0uGL*Ul*4BxJ=BPvgbSR7420&x#OFT%gv@ygpEXAYJk`gW1*oo%XMfOGw7U+SBsY*fwIml<*Md*np!B;i|iiSa)4dAS121St6{$*iK| zWFTq*E6V3uoWWfXk4+|s;9*OQWaCOQse%n0GWl1 z=zp$_9-r=bb}S8I2RX~~b%s)s?d$x-Gb?cV2T`wF;XSY>O8eg)EQU&%h` zSUGL#^i1<-!{y|iFl zYDX;3mct-q0nqerv{hID39B1}D*_!43EBpo^mk4_`}+W$f6MO!c;>JodMP{bjvobA zNH3(Fi;U%=L%``uvw)ScksP>^SARNR#hj?+;%-Fi7gfyCEPx|o39PotoiF)bB;Q_{ z!=lp)P6JY*NpoLxtduOkn~$UUu+>%}d^Ad*@mB>Y==CU(#B<770B0r=`D-*3tA6;? zfdqgOsPMTWr2J0cY>ZhtBE6Ut`F^Y5TfO!6_?VjLnq>7-{ZauSb`-dSBAl0XpF*$ane{`kQ82z6G9&4O0{ z*OUM$m|1wyL1@tRuLyUBXn&j%Mbwha1V1Y^^Vn?M-+n5Vcjn4*f?|API+(F;+!CPU z^FCC*w=__)2IGEJ2`U69El73X<{5uh!}o%p4bbOwPDxoLzSS&1@ywAx;FE`IoMbeG>L*!uNuj-s%DyACoGo zCH(8UYCj1>{n+UNpGRP#pEY*lDqogxr7Q1OY5{g={%&aL@{FF-M$D%PDHLkV1j)eIC=m8 diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_7.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_7.png old mode 100755 new mode 100644 index 4c8a9d2e5d6dc050b1e7f33372a813743c131146..d5d30c8ed9f5aaca632751645fa0410f9783826c GIT binary patch delta 788 zcmV+v1MB>Z4W9;(7=Hl(0002`twPcO00QPoL_t(|oIR7xYaDeL$3M?A{hT=5Cq$khXJF9QmEodtadg^)PKN};!^5mFM?i6oghS|p$+0; z32{56smURs)0n2)xVw*s-Ocy-;d$ZtKF~S-U8@#=W0W6DWc>6 zhTse;%Ld{Pzz^$62)+Fpuk%U>z%ZhLg4qQW6o)^{6)2f?F|(GLLDiLq;Q9sYfj*fI zK>|SaP+l_Y`T~q^06lU5HaR9jkN(F2!iq9YIn zVvfBwfcOCeAI5UP>uCX^hly};hJ1o5kUpNIj8&rjy?-SBw{E>an1lC(4scRmBkiJg4gsQ zcBMOdf^*4jzyokM%S^R^qFM7-h%07#3l3TvHh(@qP|#<@GJv!RjJvyhbfbTTcpQjb z2mLSv9*6*C?k{>=d&x3bgaUuZ!OEk;lmgX$i1%uDbn29fXiyUoNrHL2BR?xx{~h+CFPZ%2;{U!OI)F1X StPREh00003+p^m#424Yo|Cc!rr|c@S?npp))=bB>4MIjjH)z^hYoirmjK8FN?;rR0S?|4M zY)E&E@iQiM%?AEn%#YMhYG>u!GPf_4n_qx2#$&Rogq{Ivv42qSrFItKk1^VNjn#hx zoE3og8NjqKT}h~?@D&O`xuR8}TWC-&&x%Ud)Y@PEzrqFd-hU<%PU>zqu+sv-Zwh~$p_^;LgS_3gawGb;O zD9YoFLfgqx@BM!T@CZC3BEAKcE0?mYUP%0DTf$aX+ElX-zt0yq*W$u`C9kvPr_6OxLx?GIeG+E_hGFVo|@l>0$8^Zy|~o`PDp~{Hj}7R zMqXG>_f+CT0dQKQ9ZRaf$&^Y9s9NK{o0}`kp^>XBz)55r)|4jHv;S}D2YFl(;z{>< zg#zG7#D9C;k)qU!6|n|_%TX?v^Egn4*Mx{v7W|3v3%qk{4^a<}JXa^{8gpYZG zikvB2ZCt6J*6xS`NV%~k?$Fvm0ayj%-TUB7e#D$heX8BV5f>0W#^h;}JX#eW#%=>jTEPUh!LyLb z7{D4dc^UGw&9nroG%WK`A$(5BGHM62@0K9YS~7)gJ&}Lbt!AXPN68^FaV_#WP4z8?yZ z8GkiLS8a6rbk{DQ0KD}I zE!K$kmuS7TKxYNf3RmPEHigpFB1j0UMWlSLr@b`3FM zTtA#WXjd!$p8Wyb9{S)_!0+b#Ied@*aDQ}O7VVKto%PD4ckns2N-g~`PZ_W(3g;g2 zbNFpuJ}m(zr5NxJrKr7wABczse$f>d^_|goRz&AuX9~z=Ngiu8QCbSN`anwn=AjqG ziULvQo^l5(w4snG^Uj%n9MnUQn?YIdrc++4;eB5X$=q`7J+viPU|k%TzYhh-%76c@ zjBzV}3)@hEA8faK^=BwSW)^_6qg7fHTQ-BF z{1^+L%N{)RGqEZ_tO$@^gsv1kpY;N+l26n3Uit%Y#;)`aj&*|~U_?sh z807B*M2TtG897HF6<8`1Va3X2&E-cH;7xIE7pN7{fOR)0CG-}lFz;{J5e8kqMYtMP zQrHM0mP9I)X+<{;kDrR2M1Q5o{4{R##~N1WjVqbM_jo)@9Q8;8DQhtASCybbaMX&b z4%|HSwG7Dv$`aslU|Wh;e9vY9R4tr)w+d}v;AU7;H1Fc!l+2TAW8Ns5k1W7D`I?4# z>3CNORg^hVsKL-Gb6Q_1==9W8q(wc(cou?IgQ6XK36}o51n*rmyMGl@s~&FoKZC4Q ztlNQW>Kv#b+M}e_aV+D*d+K`RNEr9*Hvzh!NP&&p1DSL&4Q%SUeHDBy{V!uU!DqOQ zo$x3tB^YTndik)fZ0?Htm0E!6(((y#>9W=yxAmrlP-s+2E(sf6A-&dG`wwPu^fp9S S=iUGS002ovPDHLkU;%>Hxg28v diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_8.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_8.png old mode 100755 new mode 100644 index aa0d1e6a77a0c418968ce80c94524774da64403d..dab8497c8f49ad2185a5c2b9066633127b1241a9 GIT binary patch delta 788 zcmV+v1MB>d4W9;(7=Hl(0002`twPcO00QPoL_t(|oIR33XdHDE#((e4Kf6O&orze; zAtobjB`88@KzgZ}Y+FdhgMt(V4_k-|#f#pg)XY{}^(tCKDlQTcdQs@bL$Ol@i&SV1 zK|(3(ga#XHN~bZJHSEmuFxkH2kN4ik_udCcH^ti>Be@%rM1QI3MS!w6-5!92m>>ce zfD@=J8i?BgU*A?jC?D)N%CjK=gN_R*n9ZZ0M7TMAfWWN4%(`X<&1iA}uFqQu`gl43 z2>{JKd0flo)X3?7>R zyivD-JoQP)mMi<%sl5mFAME1cJcs%Xun)(ygFH9qKe-TfhK0-f>pF@3_VMS(Ubgu+ zQf@_#XSx?o*Zk01X6A0I5nOeP90Ph@j|^T|dd2w&UW31LwsQK5p@x|C^Bh>8=GvFv zyERDMd4Fz=VykRMqnbl<{_fB6mcAX4T>yhOyUFME$miNaCM`sf!9$C1pGQfL-Ul`XA=?Id5jD Sp$#?w0000iqQLS*VlEueCFR> z*Htn$?YH;-Gp6*K4gS1b9_v1<9V$06w+~mEe*nGrx5=tfdVdC_#Ufp|+9AsCy|?F@ zsGkAN3((IQ;C=CaEv4RtuP^{96s;;9=|c*6C@Mo!Yrpb;MF_aA>t`bAr0xy_J3Rn> zMhjo%0cJUX)K+rur*aAlUts`T@%+0P>`=JX|G0*^aMXbi>A2P`_;zWuutopI zffDIVKz|0wyED8VaUOt9GF^qMg_hZ4RVd-3WAOJ{Ki)XIajOTAR*$t=G#g_x+Dbc_ zTqes~tU%jX^5$cBFblUBfaNw3-hmhbcjK7_E-P-&7-{4luK*Oq_7LC+jyzOWn^{zl zHiUpy;Kc(}SFI4&61M z^xkC-khNlHf8*6Nf|(RBtFmWZtJ);1K*W=8A%VQwB^d!1IzsreCSPLP$d263qF7et zaNJvN08;5xG6KyrpoWm`v8vhpDJVApsl4pf(XCp5H%OuQ=Z&{2^UCgBW{RlwC4~X*Y3X&Vr2XI>kIpg*4N^UxmwLT$Aob^sR{I2!4b9zyC98OxJ_-s=^okol2ZZlt|7wwE$X zhG-F2+V(*&WLvGY(z)Wj6j93(yzIeyMStb@3`3fHetmUby?7oC*)KA;_V-L6k0I83 zE*SDE3E^4k%zfxYXwRaJ>-D9{YK@^S3Pf&Xh4ZncHsZ1H2xeEDx3aRYp_u8zGV}}} zc|T$pl1@rX!Lu>&t}I|hfs(tI!a)YKG&vHk23~dpt2jXP`iWTp0?JPi&VkBnrGLzP zT&oYMpSLtHdlF|>E&5&LIs&OsG6RkLc?=!tbI8eo&JXtl5Bks*xhuMAHP?v}q}_(= zfv&ijzR>$-LW{`(Du6x+Z9Bt^E3mpSxFOK~EUqIJma=%nOBS#rZbozO*?TH6n<5TG zi%(WRRDnpUY00wnKuDx-q-~|F1AjbbXEJ#!XQxFTYAl-J@Qg!xKR~^TcqFU}*{iy8 z<@3I&AylSwd_2@spfd4xO+Yct%Ga zp0qQm2K}!is?1g8Bc8-_`F~oaFS6${@b*)&e2|LGh*g|I%pzFbP~!9Nc>%Mb^pEh*Pn|04}T0&97bHQR_@k9 z%IvC+V9Wm*gj(e3u#`n1k?5In`K-dZL293SSAHNO8yN+QPXl+&{946$1Dr5wpRenx zJrZWcF^ba(UqoSIoK;p|)^lqlT6*Q}OFh62%ij$xUH01ZwzC-lC(GK(*4puY{s6at W;{WA~lS%*p002ovP6b4+LSTXb6DRcm diff --git a/assets/dolphin/external/L3_Intruder_alert_128x64/frame_9.png b/assets/dolphin/external/L3_Intruder_alert_128x64/frame_9.png old mode 100755 new mode 100644 index 9f2d03b7ef748fffe01b04df3165b52b1881f3f6..e445ae752b7557a266e14969d6c4d07634e40a40 GIT binary patch delta 786 zcmV+t1MU3v44np$7=Hl(0002`twPcO00QJmL_t(|oIR6IXdHDE$3O4QFUd5f-HA}i zp*Fu#)Kn0cTD?f^Wa}Z~Nzi)fVGgYa5v+JLnn{sVZ(j6Nbt&;uXf1g0Q0hb>{;8NC z9zrPF2`NpGlulxsY{Kq551Z{fet7@C?*Y=t2=>QF;d&%hI)C;CK-oS&*#*-v6%Wt_ z@1inqAZ{0Yx1vN)KFaYLuS5WJJuahQHi3fTac8&z6|**G)-W@u`Dz!;O;`zfDC>e0 zfZE}rV%By746Ons1psTjw_E6NUNLL)4$_ILoy;p{ZC$i-M#M^hb&4`4s4ANuY3oQa6=)OCbw`&R0Y7w|_%hM<3X!{uq4LKt4jX7vlb_F+R!ZDwjQRI%9CO(|?5n(w-mvN-t4iAKNz$NXftG z940k7$Hht0;iA6Fl$- z+$yB*B7e&Vuse_)(gMci#sQ_ab zu@5z3yeJLIe=u(4=qfmMaAybj{<%-I%BSseVE3vv(n2%FtybLyVRnnz2JDAmA%MhJ z?&}!ur}uyWz%Nxf*Z}&>7Jh+b)J&IQ*qX3<4u3&GpBBpjvIStsuk+#U&J_}{H}Ng> zg9z9b0jg}xzO4U_u_WOv1k_m{Kcf477yl*zlM!~|m|Nq|V?*IS* delta 1648 zcmV-$29Noj2K5Y(7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000IjNklOFZ}0tQP3f8q{(U(;);OylN;k5%uPHVE0DAAY&8lL027e@Fk=m_(2=jaI*L#iB z-vP}E(9ap*bMbjCrapzQ5CF*)tuh^%Lvnd2DqYic{iXjaTtI8>XCvvR?sfw^Edc$F z7QV^?L}LJ{uVmg&jVUaAg#d8I^Lr8OV7N8^XhZr~ZDj)BHFw#;nD#lchBT(qH}AlR zG2SOdrd705Xn#8*u#)9D4O?9R&s%4?Y{q&|&a-NHc3_JDSh=xw?<7Rrljep_`>yYk z2s(9>BxJ=BPvgzaRD=n1%nB1v+@R|^m#z%Fxep$nJ!Vfc@jD~hO3Z@5-&zB>E)oM& zGqG}mqBNe!w4F4y*8UR!55qGe;!{wmxsqk|!lDm35`RYAal6R#00{F>WaKJVgg|o- zW8TvP+aDM3t;|QDX_>`*+CDq8e-cm~;B@A%=I9Zi?gOnDKDEC$0YHxty*Skb4p@xR z4wIy(jJ!ae?y1Cw0PwVC_E=H{o=mAMQ$H{ZxHyo9Mvk%oPa@-CO>09v=l{q!O5+L> zpLDNB2!8&ZIq;%4D}orl zC=dEHMvXq`IBq3oSCsylU`X1>+baT8O@Gs=U`Rn9xAHGUdNi%^T&46*x<9*W<7it3 zP(jfmaeklfhnG&otw@4FUz(eE@ta;mH7**_S7!pzJ;=76v-PBV9&0sFS_)px0nmMcJ&gVT3Q1AntO zF`~6AUvLGIRz;u%f0;EFzLs~)z)La}nLxExGo3u>i>~8Eh7e?C0mB7k%{8#)FbE-f zmfo$-AH^yIxggN_BJ}5=H&0cmGJ|b!XPQK78Hs<5#z-wW26XIDt}hPQ*+3S1rW^ELX=6e0)MwOFk%g? z1t@Vd&=hdz=1Mrp>R5YW#Rapz*Oin7AjOB3IXQNve{`)A1c4(`GUpI~A0Rr}3_By| z2rU0vAqXp0E^9A8vH)+2b2>v&cxnz$x+X~oy+tZc`++!>-NY!neoqNRUy zK4}bs+fT)gNu|S?Qv~Bge}6nf#_6KPgV|XF=ku))q%mA7fo24YS&%fUI&h1eRAwlT zl^r3KQ%S+qEI_M;OKq#r^8eoeG)2p@poj(FYgvJ;_=h2$&F7WBXl0RF9uFj6_(Z*) z!&*C|aK>M}U9#YO?cV$6PsRQZ43cb=~z~vJ7cbN<>N{% uzz)gZ4b801`t!cgj6kc)Sj?tZKF=Q+_UjX&lDF*u0000L_t(|oK2CvYg1tu#eeU6Z@<8PfS^^X z3F4rF(5W3P&_^;iE1sZ~Ju0N_9kDQ+uPxxQAm;Nb^UfvTg89sdPO6(1XQ1gaMU+!UG35FHt*ESU*bi=gwN$;u{AH;&JEz+uIM3b@;s+e&oP1LeM#p zf&+MxQn9YSIDb}K<@&j@CC$hQd<;?3!4KPlo@V?L;~ISq@CoRf4=Zm-FVDgvb{uGp zy@2Twz$KQYqh#SQmZSqo77+QI570Em@4jg|0yr(OJ3zwm*aj%`zt9inDW8s&U8&V7 zhJ(_)l%(VX*wSu|dIj1Wuqn0guV)Umn@IJxEMUFsg@5N@91V;82xcLt3vMsy)&OQU z%?uRsga)2TiKH;I6&Mv0SEFIVl zUIX#f5qj*-5%?Ca0JYCAOL${2V4)xQu6M8)g2$v{Nkhq8w$d@3R4g@yqEMBrByml# z6b&_-3Z+h!3h-+C`_wut0p>AmEiH9m;hv(YjDDX_X;YHqgPDic%|2Eqx*Lk7vbzQ8 bq$KGtWP?=akGDTW00000NkvXXu0mjfL&m5Z)t|Va82oo|&FJ+T#AVRVsSx8{&7`y{g zV{093hbbP|p;pv-pry)Dt#kzKF;cZ+si5^}6^m9YI&_1?`iJAr?0(<(zW00Y_pVuQ z&it&1@Yrww03tNARXTq4@UJ9P$bV%{dIP`2aOylRmo;-P+Q9(nCf2}!8Y^AE=os2m zUh+MY3;@Da7JVL74ROJoLIA|5)u#_>TOb2TPN7F2~Jc|M@Wf-YU24g0YfJq5S!W4zmFo7DxVgp9Hls8#y5+2(uU?V5y9h!Wc%HVTxu@SWKFv7-cq_#4;m<@Dve$=RDO( z0TJJx{_T^=;15q`i?Q(o<=`i$zoY7Xe(HjA=IPb^Ix;fSaPG5S00`QoQKjqM=a1Fa z*ovl4T+uz;dgn|}ho((ZS@!kE60J4s=tr_;^?xmPkE~rE9@6>C>9Dg$W0wGrx&||a z2ea=5dt3WoX z;1(H6u%Whb(YdnwXR7yuJhY{!du1fJskWi>I<>01uHyBSak6`9-llTkVLWii z@pD(o>YStbASehJDQMWBI&hu(p z)7o9YRw`rHfg?S?f3Z5&^A_aTeRH2e)b&C{=Bjh6uSFTHl`VQuFqzRaK8j>y?C^p}E@czEb`MtoyOWl#*qb zmUlHs*)!Y_z0J2Fz4*4Iq%mjs=0r1_u}r@!L;6lsPWalljpkF%be>JV3@wEXBjW~>5rCO@od_Cc+R(uyc^UF zuW*JZd1-Vf5=Yfv5|p`Y_w56~__XA`=B@VA8-(Xm1;N0DswtNeRl42&Uxh|JU)7Y6 Gzx+Q_EN*xJ diff --git a/assets/dolphin/external/L3_Lab_research_128x54/frame_1.png b/assets/dolphin/external/L3_Lab_research_128x54/frame_1.png index dedff602416aedff47635b5ad14871cab7575e36..2c4b1023436e32ba8e23d8056679e12bc5531445 100644 GIT binary patch delta 648 zcmV;30(bqS4U`3t7=Hl(0000d)~pTy00LV{L_t(|oK=y}OH^SLhM(`7Yom}qASesV zOSGtwg=31+EZrZeI{)?cD`HD!Wh!!ncr3=^5BFH2gM^44Mw!lsR5KiJ62RL{#2!Yx?=H+1A6hpJqOq$-4I)cH&E<% z%wQQH0KmAC1Alltta4r1BvD(H`a;FxGjJ3SL)>)m-L{~snf$=GM%Doy0okdj`U?MT z9>9(Ot)XWy9s-=_opg{+?a5%D z)M5dX_nCmwB9Vb7QYtCRtp!HqR5s%Ps6(zuXq+_x2ABiJ0POe-fXYEi(g~e_l$vAF zJG^oZjC-9rKHO!Iz~dws6UEn82Hyj)QOikEP5m3&sZ_S~yZ~6w`GXz(4UI}te{_5A zOCs&s6@Oj=$)y48*8}h@Tm<%)pNC|IpvOWt@J(-ECV~v3N+k8AlZ9$0bX1Ad=!+v& z3zEcDB~skiY$}pEuT(&0e`kmNj!S@f1Z%Ui9a*@icr2%1XNI*ZN%Fui11IGG literal 1700 zcmaJ?Yfuwc6y6XJ1#!etB+B5rFg`kNvb)KWWKHCe1kFH@hB%;A>n7QR6!Yk2g#=`b z)-u9?fP=+4R7HHXwkV?&)T*&ywboJ}?NlrxRkYNKT3bMKID%-LopQbYM({zUX9D~#d#V-P7E`l{+r5F-)S=ZW}gi8*M*d^G#Pb`4I z5fvs!4vmt^(xih5J57ONJ_;KU1OdfTz8*12^pq4?0AdJ+3Q$ad;xL917*3!#IQBrS zKiX&_w94c$Z|q49WiyO}5D4<}^7wf|zMVD;P^nZZKrjJ@!K?=CblVux1>2l4ehW&< zX`n3*#$vaDK8vK@zK)SYEZ5N>tPYLlm0_E6ELCjM1TNAcK>3KkYV}1nqU~g~)PFSI zsO{9b9h5*zIqmCc16vVOj33Nq@Bbb76j?UJQrg0ng3drA@+uEv=|AA z2sao-aR^MAgc4XJ5}ROBZ<4}sdZQE|@9lOb&e%J194`X0lI{ufIqXo_U)w9al{>+gf~Y&&CjX4@SgCgfw_ zJPm2E*nE=tzAB9dt)ys6E@e!n?N)Fk&4lF*6yh*3MTsR67&VH7uqaL>f~8W7goTJ6 z$MvX)m5QJ-yz#a4jW#MPVZ(6v*$_fpC^X@y5Ee^BVi-k5CRj>R2#kx2VpM7}8F7gL z60j5nzRr2All&sKJ$>6(lffQd%@$>22a0AVXSO^3EIW1M(o=ORb{!rb-ru(SHUI?F zsg;R3*R7Tv#kK%+qVnSK@Qq~`ih9v|lF%uKR6U#SPB*U)I7=TLvZl7n83x8?peLXS7P>oQ2lr``VdY!hw>HlQemJ%~>aZ-Wr1Hz?rbjzd&mAdA zEjbhOd|#9qXe&Kw{e1KJl}l%Ao9$gu#RVgd>!KRq$mSxWA-+%rFq)qFxjJAG_k3pm zyCALmhPmjIg_)}c_#V6Gq4MnB2=l4~w|N6ofonkt^Ou*+o6MPbQM&&U!Zj9OI+@?w=UTHXJK^S? zfWHIj73Hf!^szOZtb)3hTeXh>bCh}(RHU_R>>ZDvTHk);BoTc%+*7+ayL}24F{e+_ z$g8e__SKYPig=Ezu_NZMKV#|Uq~J)bqgq*-s3aN&erefO+xHXiO2<~v)U@|Z1=RR* z!W|^{LHGw#o+qet11oF|34>J+`re)ttnj?kzeST6{!FrS;ES62*6@Uh`)*Wz%Dr0n z5O${z@0NN!2in59Gn4MeR4)vkQ~}Vv;*Br9uH?>%UX%A**sQHldw?x---`|DkCJ+a b0waM78B>4O7C#yE{WsLAG-Z9#noa)#m>PJ? diff --git a/assets/dolphin/external/L3_Lab_research_128x54/frame_10.png b/assets/dolphin/external/L3_Lab_research_128x54/frame_10.png index 1a53ab75d5114b56cfad205e3bca9502735a84b2..02a91f9baa8f0fba3947bdc37c4934ba86718c3c 100644 GIT binary patch delta 599 zcmV-d0;v7y4CDlm7=Hl(0000d)~pTy00JvXL_t(|oK2IzYZOrwg}?W9vRT2nD~d#j zWVEr>w9%c-j&f?_kVnVhEF^BG-*M%0SNDo zIKTn~fLtYZfCt+e24uVx07o@L%F`&YsMwRgZd|DA2F8TF95)z zK5q8(V^?8atMlFX15oU1K~Jb^n7hWg3kA%CB`EJN}PN7@c4% zcwT@Crpfy^hmsx5|IYLd>4nrAmxW67lfriMB_X{+y5Mo=t`0LYt7JVC8*k)kOni=~)X zeegM!R8W<&fkij&01=ctY5*&fZ_QxqYfuwc6uu-V%A zWND_f=p>r}fV9G4$riFrv$ZzfDWm;5GOyDmq5()q^tx!ZZ@kd!(uC2Y9kpqaVC`D)rtn3tUyCvXCdd&dUf!iU9GtHi%}RF zR1ucy;2~1kCNpH<-7KV*;fM{xFi1_xte9P6Wl1a^l4Eil#pNijMC7iYM5m5v2lyU;?ML5r-fCY;6 z*xU}6;NUsPZ;`h0#exnNxef*4beT-g40E30REbGLy|fF(Wf7gG z?Xi@)STvLM@WpPMSP}cA09ef4|2y(4ifpuRyB%U#=t7FO6+2l@Fj6{Lypb^uMynx| zHil4P2y0hp5Q0$K5!z}e5tWr8l?037G)4#Pyavxw7|P9JYN{-19Jf{@SXzR1<4gMIW)~g z+Z>!<@}|E^LqSul+p&ygQr)~08ceg+@d64exte9w8V!OogaRQ{1c8vGoJJIwRjIV% zgeWE8VLbC(`i2@+l!#%t0&KJjr9xp>;tE8qA=C(t6Ly58SqxDUj2b8Hc1EeO!Kg?P z^>@y5ofHs>?djh>n+);rY_?cV94NOqIaM{kYs9G=X`XFK5!Zo%f%*%zmjICD8>wWA zxBKX(Fm5dtPW||>MVK2jaoGU4G?Bx@`2Aw5pz|b-M7F*88U& zt-c5SAML8u+MFp-fHXm5`Kx|PYGu8udR?Kb?mQ!>;2c*V=kIq9kMrn|np@ye=ME4C4{ zvcu!aC5hv&gUc(D&)G6MQ<7mxZ1JWoJ!1{wzA5j=JE!0GNu!IpTPJ6HxMTW~Bb!~S zV`PqRE_pD*JpV*67&i|xg)GdKovm1Ps^X|*a%4+LQqDOlh$^3!{!K}!>-9U0=Q}HB zfMea?MPa87#jUxk$NPU?2p%rD_|6{aR$PChwZ3wFQ^V;4sr82|t8-KDpmE&wUBOq7 z+;ul)jlZ0GGA5`n&ewTUedh488c9-jLDQHZ{n?8BZS7OW_xD|j%Hy}3m?@3!4{o?r zwes;H@NRt9BV*WxUEt%ki57*mDRU)X7xQ%+jZTy_H=~R(2HuD4@NFWYYP|mpI^H?w8?(At37(}XJHdQxz==M zafr9KDJE&(Td}8a8GPAwqX%rht5smb*3QfKwoAT9YwYa_0SR-SzHzJyNCAC)EL1si R?>+y&-~yanO)t%Uks;0e`?+jduK|ZGn#fv~G?# zzykPy7AjF6>?j1ZJqOhBx|5?>7s$iqfik7o5fM~-O8KpymIJidH9!-O984W_kKvwT zh?y`oA_uT#vA`v@fc5(hYGrec+Pb)tRY- zAFlV5CSLf40N1HzA$tYbo5p+Z*d(M% zfN!ZXyojFpgUCiANpVAK>g3Y4?eDzc7o{P<@@Np?393CMA5UkbG?F44034XoD=3|V z;hwUDZcG3nlz5UzDd*K1jJ=#m3O;LaEXKiX@jh4*AC7jz`eq5Z_+MgZp8hZCgY*<& hj!N44D=8|b`~#5^E7VeaSsnlY002ovPDHLkV1m$M6e9ot literal 1656 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 G+VmgBHA?>g diff --git a/assets/dolphin/external/L3_Lab_research_128x54/frame_13.png b/assets/dolphin/external/L3_Lab_research_128x54/frame_13.png index c46dc3babf7be71b3a3f35921a861035b33582bd..daa7667cc1f86a5d9f424b2dbbeb2ed1eba65d12 100644 GIT binary patch delta 633 zcmV-<0*3vW4Tc4f7=Hl(0000d)~pTy00K=(L_t(|oK2Cxi&S?M#XsNszK)|{90-cY z%Df~+EF`Q=BBIVyEG+dun9{-`T|yGvFKJSywR42DfsGdaKzH8StO&|lC6FRdNl;<4 zGqba}Z)e_nC&j#3a?20*aL&0GN!pZ3Ng6^#0FFwfvZbvhNq^QjcH_$wpdT~HR|W<= z2Ozt8C;$eq2q-kiH7J$}KzINMIOS3~RjJLLCz}Qh^1v7v2d3EKpG~SB`eEV#FcdTT z8YrnRtBuz3_yqm>hEf}^P$qlH%~SV-z1GVM8qfn)@aVs_=XPu z7{I^-DZpv~Jbx`-^Y#ix)%k+%D+BANk1yjWb_4ujlbF@p=>!+@{dHS+{^t-wybScP z#YEYK7`T`Lob&*va-bb>%}W@R0ptO8o%1YflK-xMO4VcQpujYt9$!GKm9stv=3$sH zcrXWSX!`B_sxy*)lB%|>!1m?i6to4?XSg>fs`PIAw|_^C$~kiH4P5l=s0Wn`TS+&@(#IQX1Io zRAqT7d2;GLfH#PN_fgvEM+8F)&tNjw?g5ZbI!vMwz{O=slK{F3wZe5 zO#QuHE-9Gyx5u;3!DlVHXK5~P*X8*4Z`!8#*t{*D90#|xc<|jEWY?j)PM!Hbudf~~ TK3~5}00000NkvXXu0mjf0?sZ` literal 1689 zcmaJ?Yfuwc6utpOiW6EYiilH}&@w#S>?0eJtVE-PK$K7lQQ`yYCfPs+l1-C^gji9m zjzVQrT3Z!cTB%d4sG}82b*L%WinT*kpgyraa5`42=m==hrW+vEAC5b-d+$B>eCK@U zHCvUPmCg^H8VUg5t22~2+`5W;lS2ZzuhcXkCe}&WX)wpg=xIo8p$h37 znlhHZcaly4AaJc&t7CPVOwzzugp^N5=(5;2Gyo~HT{g;4OtX-lE;L)^f_q1g2_Umk zF31yWP>n5>E;47h?R2g?OKWf!8)Qbo>{(EXi{uPgXqJLpmJ+LjbjbxHc1dpU6C(m> zM1?Ju3r0!lG}%xpW2YgB5Q7aUib4{ZP>-6VdRm6gfN&JY5DZ5!F^pp*E+#QCH1-HM ze|DpZ%u%Ywym2SFponE{B!W1dPN7pIWbB0qCX>k!6i09z<}_eOxs|0{u+;}V*dNTo1lBt$TgOc1b4hEuQz)r-Y? zjNqh%U<_}3E`6ho%1O8|Y<@PRNGuYW#Fz+{NC^pyVT1{mQ8WsR38Ms)nM_8p)F41O ziiodsp6evPh-**Z_Ss}`hi9`zTe*RU#kQ*s4~} z(Yh`k+E!_8M?;j;z22^_!*M@vZEw-UTDI516+fNey>a-MYeiLhO=QRIA$|$cFy7YM z)r+35I1;(udw1od;VogF=8u;=7-vgIAFFs*S9b%&y;FrilEzn*4LuEMX`O~Qf(&Me zhnEMJZvoxcQ^t3k&G;&B92DE{bw(;qzkl$DUElQ%>*JRGb_HY%MmO^(fbZk8fFdyw zI|Nqo-C+dEYnr*;RkL0J`V;QVS_IEc;!O@P>08I;g9DYdp7nJR%JVgfjzgiV_CHc& zmWF~O;G-JJUgEvK%BG*2oF52=d*D%IAc(0#`rR&RbQynnK1M%(E)7hki-y`Mx* zXu$FT{Icd`Q|V&98g7e*l9D$Bwd)+47tSy1Tl2c-lbaEWp6-QmDga&N4uwLUXPkfS zlkRTbpd^-@xp;it%dM(fcDP_*NjTIOy%D%BeVd(k?m+x~Q&0Ra z2{2E0>FR~?S~xRv-Q^8^xes(#Vy5t>)SmvkvXS4D%R@EkRDRjhDgiY8)|$`nC#+5! z+z6gT&p%ifv8~~#Rt+T{&TkL2Oj!4gredO}@#yxf`hsIX{Cim5+F(#8yEbiE(cWuK zmG>6`L(-bgP5nGiR(0cm?4A6xXFgaE)OX`?%iej8NGLO?e8ui=D9Lf+Q(eIy^5qZ9 zbZo=B0U;+FJDpRTtI~#dG_9=v@|Efpr3F0Fq{s-{`Q{hB_0s}>t#yPq&e*Av@-i+` zx~~TtiVJPG%41@x9dQo>H+}YD%!7*Ba{=H=bJm{$wGoK-_G_JY^<9He9=X)u7R=NB z+Zo&!9^ZDgc*wo@M-d=rFMM?ed~GR@3|K&i&TPw)-yDebfa5)rV(;wPR^$6wsME5P J`{piN{U76AYVQC5 diff --git a/assets/dolphin/external/L3_Lab_research_128x54/frame_2.png b/assets/dolphin/external/L3_Lab_research_128x54/frame_2.png index 01f07c68df29a7319cb3d143560f99c85dd57beb..34650daa637ccba50b513048feacb55c94051795 100644 GIT binary patch delta 639 zcmV-_0)YLi4U7el7=Hl(0000d)~pTy00L7A%_EYONoN9>X; zzyd)C=zK@51^S-@s+-Yfp;bQCb0)OTPw);#m12c5*#KY{J+ji{00z0;o516}Ay8}FY+9$*66oscH0DBZ@ z^xcM`005pz^>lhGk)%yY77*nH4`ACE&&&3PVt^ijUFH9=5h(o^bbu+c^p|{;8cUV1 zQ<{|0ep!HH!TL{cV5S$e&o#*z~ zjC+te@|P*&d+Y&Y!g#p);xGVfwW1`|w7>Qxl`59}J%H8XKwDOSO@orOE9{BiCeo%| z;XaTY>3DX$tAl6Z5b$&PPDHK`@)kOP_j&>|A>k;eF-fu> zfJf5lll4BKxG34rks?Ww^)VCh=FwM7>xH`H(>wK;s0GaA1dX#(RLShH$Nk}R7Ysok Zz;8pJHZmFPL+1bh002ovPDHLkV1m*1D--|# literal 1707 zcmaJ?Yfuwc6u!I!Q2|9!t7g`qMbu4plU*~+2;kjA*Iq}E6=kcP@JSY+Iu`bI8f(8;)& zxC&8O7ErKABh~Q}uy;wsL$YMx<2v9yM;G;M!KqUfPg5uEV!)5*1 zb$UsvTsi8EJ;}Ja3}cn>`A(;k=M?g2dk!BZ2!f9Y_yPgUYQTNcBB`PC7#Wx4`YH&sRi%1u*y0#X6`M4^i?s4l9>O=9J&}!QJD61Je;RMq zcBJQ9DSj&Dp!4inwj%oQF)*9GcRTVZvTP(Nb^}`$(j=#~d1lJOB+6x6_J*f3=pz#EIoXL7W0b zP@z(Q%Eh8FY@)@%kQOa9=G(yf9>t2^iIv3JDUzY>=`?K`>jQNz&Crfq+6oDTJOQ*o zMQRNek0jDlrB^}ADZ606gZ7KLFjK?q1#h-h$J zgJP@{o#sG-;8titZhumE}SWI zKR?*L{qlyq=`GLuHf?TiSO>dX_X!8QW^kr99tUO8rJPTz!Q6BlWKJA<5L4h@T@v^Tc>2JqRZ{^^B+a~u5s748r^%l z3{x^V0n~zjKXVQp3qCGLa&$blfdZS^T{l@}9`bT?u&Ol0+26y1cO;jrkGbcH>=e?zSPPo&$JF1kmfq$=<|J$`K-S=*Wm2WgIs&*v0D{6aPty*Q%;jF>FYM^|$ zybU~k{Ql17d(pcGUFwLQ2wRn)tGlHdgzWbDb4|mqciQ(g1s17-@qm?)@O#&Lyy+?Jv}^q;0eg6SP)4Z4cgYs*?RZl7i~p11B`j+XFW7Ec~#}C+NC}> zADi3XA5lld)Rcx4)=Y1e`px*Io{Fwa@+k~kK4AKOzcT4_?p039oa%Al_IO@>+4?IP z+xwsOD8JRoQ;u}{eIra!Lnl)^bIRvjU(_4lF9eUq=Ot8# fJAFIi-CkgF=G2C5SL>#Eejka7WcjIO*+u^WnIm@> diff --git a/assets/dolphin/external/L3_Lab_research_128x54/frame_3.png b/assets/dolphin/external/L3_Lab_research_128x54/frame_3.png index 148fe46405f933f4c4afb993733866a6c4742d4a..7da00632d5d952b058d780e7bc21e86eeb3b0196 100644 GIT binary patch delta 638 zcmV-^0)hRI4T}Yk7=Hl(0000d)~pTy00L4;L_t(|oK=xcOH^SPhOhTMM;$@SRUcwF z)FKN4BghuQ9Qy_SgZu$4f)*Kl%v(g#2jrrKJ6*JB6S$N}XEX>aLaj{{G~+6e7>|xP z+4f^sFMk#R3RyPm3!4_$hyco? z-43uoIR@l1)dQjbH6TI&aG<)BHkGPUo3B_12qUUM)zQQbeg{_3?S=usqF&4#kkXps z$M9!NmZ}5Vu$X($sWPy5*8wi@Y9@+nyI#L;%vUU-aX>c#TMn@88Az-nY}euY4lF%H z`zx~O03PKzUUiRhS!x2MR?j=>Ce z5NPy0g^@DA0JGArpWaF(X;YE~M6nP8>=_fb-ZYW`92M9#{x4ex`G18Bm>f%gm367H zREoQ$3CZ`%0$eJu?x1aGF2j4Nd1oQFrPNEcrYvBC%YTbc_+cD%i+uxTx}cNpRn&?B z%vhFD>Wf8U1CJ#yDbAfL8kM|k-~g!Ma|O!ASrcJ^IWi0b*pV3kl_I%xA36%2s>8Gn zU-=^W{If)-lk3W>U^x!P#7UI2@GI4vBvqBwPcM}$os$5ca!F5%p&>~+9Ouq|Or_0m zdGI-qo_Fghl-CBj2rZlicHTZJ4hDVDX(0oA)-24#5HO@v(jh;tcYn@@J^VPCyd>EW zASCU?yH6VlX=hy3bU63UG Y1_@h5;bb4#aOuaL7|CxWTfY6Qg*9ESx2%mv*%6@cAb;)n$u z&Dp$+hi6zf7`8}RSs$;31g=9txI9MVGsA9fI8{Q@kO1XDFgc32T;a$D(Hx&g|4-wE zXwDq;&`2K5u|BU&sE8wRL|Mq*%N>P*0vnCV%Lrwmigm2b=c3(wmQD)^Z{&8yt|1Af z%}ykvFzrx~FhQssFlBY9;bf~_tt4m^qflzZ&WrR7XtDt(^~7u}O@(3lbW*3l)AbmN zDGWHKBUK~1S#FM}+%|f|HzWAg>6L~w)R6vCT}`@|rg+wCX4&GAKFBR(d6p|=Js_@- zdzaTQIgND{{EgaRg#2?AEDaSB$T zR;AL45rUL}hV|{wrEjQF1&I)bXM~MLp;RawN=yN(NJ0f;7~z1`6pg}4!mh&94u@Sy z+8{)rh=e=mxlS4p3GEr)KAQ~T@NBkdw=hs%VRAaXQpdy2YyI7{XX<>e#O=ij>68#*xgPVCR7hqVt%AD0{# zou1PoF1T-2MUofpMO@nYch$i1E@1!m)^+2W)`ESrqRH|VkWTtPWU}aPP(%2>@H3}HJ36|Au4n&0d=a)mm_hHC7?jcrZKb6L!AIG-Pdpx+K|vRwsuNB6C#*vvZp&Jv*o9;K-Fjk2hgQ5lw`EIvVb-<$4R4eA5_Vn;ZR~cSOB%n=6eWi{0z51gfeseD7TxKSx&G znB6$zVLVW`h@5DOPi^DXnQ5Nd?a^RGqqwe>NR&Le711*xh7q?$cDZkgdv~l7g*GI; zbAEJV+okWe?Ty`8KWoX#>P1BCf*Ihk!&fBw0{7CkNgWNw{w?y-eP=_a<4HhU$>B1S z^zzps16#Us_8Nl$G9UMpZL=5noOKU!A`dl-+Og}4W0p53t@){^r>|^x5+z9l{1x@{ znooE=ae({g$;zso8Gk|^@>k2G(S2q7Tq7R3QPaLTrsEZp=v?APBFNuK&$gYZ0WAB9 zB#(D@1p&<%i}OxN?=LHU`zNxpB4Z0)8?zaBItm5iAH{e73w}H`{Ex`e=jgtfZ7KZ^ D-1uoN diff --git a/assets/dolphin/external/L3_Lab_research_128x54/frame_4.png b/assets/dolphin/external/L3_Lab_research_128x54/frame_4.png index 0d402b0dbfe4d4021bc076b83bf0098e9ec4ebe1..9a5d688cfbe729724882bd9381ba6e44519783bb 100644 GIT binary patch delta 642 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 TK3~5}00000NkvXXu0mjf0?sZ` literal 1689 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 YV`bz=*E`=i=KmEKQ!)(SFU{TlAI@}Lp#T5? diff --git a/assets/dolphin/external/L3_Lab_research_128x54/frame_8.png b/assets/dolphin/external/L3_Lab_research_128x54/frame_8.png index 0f681e6abbffe2f8c4bad77476392253f324f0f0..7fc99ca893a7106aaf1d4eb67d45d7ac3609d1cc 100644 GIT binary patch delta 589 zcmV-T04B7;c7=Hl(0000d)~pTy00JRNL_t(|oK2I@OB7)ohoAS|Q8&okD8j&S z?UJ_)qAr3H2zBVtJ&5h*F`;9%FBNnN^gn2;OD8d~Tjl5_3rdet(2l2)qMcmB+1;7_ zbeMJYdwlpj-ygiZNYWoEm81v?IN+3&Dy;5QCE5PX%B28cxqnO}e&4XbCji15gAT9& zKA_oRvj?^m0jf^}6}J#dtwu<13R;vTr(m|bSrPV4`=mv=OhvUxd-h0nI-#OoT z%`VqxPaZlXeh2_ysCJ6Rz^?)Rl|~BqFX^Q!`Q=3}Babt(7S2a`7?4i0CI-?vDJx@O zD7s|s4@@cmf~EG{JT6a{r7*KjAr;gS`kihb4M6H7znd}_GaO`Mtag_YzH{IR4B2TV zJX4~>bZ#|cvrj4YFvimCTytr$Sx&=~CPJxx1#iH~a1`WsI$U0bUkUfxRq*?u7=@u; z6|Ptb_mRre=^-`iVIY|hN6Z+8K{C0}gjq-vBgax85hlV>T!i8hM1(6u5(O@S`X8A0 z=b#?G^TrNj35h@ZPyawVeadDI%ae0$M7Br04 z?6JE!JL`gi7AX@uk5j@t*S;W}Zk_IlVVAc*ReaJ=KjlVoA%;4g!N_{Gy_|vhpT;w_ zy}2cB1~o8VcAm$~SHzMO0`u8>zN4Tb&qk5svGZl292(X<&&jwrtwss+H$vJ@D@a0O zrU@yAFcvY15QNNvP$r8Uk(y|^gkUh7!l;m)XW=n1CY2Eyxe8AwaXdp!YQ!RS29Dw4 zOcAajWg)EA<>e@snF;x}^S=AB_mb3?m~+1g8lxLP!Y$k;_FCBF0P-i3ulo zDFOH6>8H}y*QmUN55pZ|qYz8PVv7V9BQlbZAvjK05IMzQh=ibJxZGl)C8QZfd5UPT zbDrv?kce;3;P%O6@P{X}#klx^^6-;W$LXZ})D6^UAC*P z2R|F^ISNH*th>GFM)oLFWjk7TuTE>uIj!!>ho+RfA4TkokBMB_I$ocsifJp`v>(!+ zxjo?Fn${k6|D8+WG$`0RS=%B2 z2?6cuZx$NCHav26Gx+n>j!^|wJL8MahF|WkJaKn(6P9tTtl(Ul4U8=u2Cg66k=d~I z0ko#!({2^;mU zPneSuxF`5%DYa$s>di3$qoY%^QPK>67DO6UYgbgIfEvq*(xN>-zn(dAR=w`{`RF~3 z_?eRrKr2&Wra`+KP*!4{exP z5Qe=quBP62I4kx7JNoGK{K427V_nWmn%n1Y3dNr^zB9}EDVnSB;TPMdc5hvN>hA3D zN3T>j-cT1-)!rQ!eljbqxOPrT%L3nQkUw^4Cmhi3=kCjY+;IM1|Bk4Di+Xt<2!@DD)E!uWp;qJisWb4B_5#Wga@wkSSKmfir V#DeNB?Tz3MK%0@R*{&*j`#(KRS^)q6 diff --git a/assets/dolphin/external/L3_Lab_research_128x54/frame_9.png b/assets/dolphin/external/L3_Lab_research_128x54/frame_9.png index 0f391b75e5977c5395829f3035b5f40916ab6bf2..6b237672e46965f347f9966c8c79f1f366934ca4 100644 GIT binary patch delta 594 zcmV-Y08jWHi zy4u(&1<{6Nr?jx}CtycmA)N(rZ)|K#sajW;9EX9=e+m4xk%EHluJ?s6&!F$$`!VbTas*b`tjWWV1K;sCFzspk$X0P_m~8-u4e zAP+aO6wTW#?0;Ce;`i_{WTy^xZQ^&^dn6dwA0Ku(zqmvL8f{<|+IqiN=pa|v(oyf@ z5pAs~30H?-y7Ubjb04__J-J!FM`}LjS*gn&<=;?F`YM6jHsEh!I zTKio%Wzq|&xGoE|sF42|9YeYa``W!1ur;r|kb0>&(0@;wn#+``rEV^}%7rxGZJB9j zupVTP;S(7wWWbZWR8$<02hgWMXq?^mYtSPp6^~X4dCf@)xKBNg=#-!{hxf&?O+=jl z-%@8{8NKmGlC4yd`Yo-iS4cnXu=A2%hDHGIrh))ZP#;)|nQUIlVkx!(z_F=(fXY>v z7+6-&14|%+3a?Tr>^;! gLc01ZDK5AC1E)7L$s)cCBLDyZ07*qoM6N<$g6_5v{Qv*} literal 1655 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 diff --git a/assets/dolphin/internal/L1_NoSd_128x49/frame_0.png b/assets/dolphin/internal/L1_NoSd_128x49/frame_0.png index 9a48d15f7a61949a492799c5098957738b9fe837..0ba376d653ee511cd9c365328b5270cf36a3f752 100644 GIT binary patch delta 402 zcmV;D0d4++3!np#7=Hl(0000w)10;d00C!7L_t(|oNbc5iW6ZJhMzezk|_d7xq@tB zyOot#IjOx0ZLBP9tTNcxSjaY8Y+>mQ2$q>f*eeKuh)KXAl^HPL1ZTe2Vtz7{?CH+K zIq&&JEpv<%(6T@Jg|)#?9zr`Mk|J_oT1iM+Sq>y+hJaxJuYX3f5;%j6 zZ*DId;GSVzfB4vd(8pNBapkV@7Z_yw26%G}Ue~%4{6~<^qqk9W7AJ$pH&qkBE(y5G zzf?61ekTU+!+#Rwz%sUgPiZw7@C~+}b5S;uw30qcwgrd2j{&r%ynOWc-%eU-BdK0c z2=Khwm;oFP>q!kBgkH>GaA*KoFJPG6QHvJEDjysi((zCIO%J~jMK2jB?jJ$YfKzf6rO>yEl_;4Qd_`w9E{MWv-8;59cE-(c6WHn0^%ATQe_@@VFSCf&J65A zupyY1U`>mZAR%eQ7!8_;qP4M7BbHbb+Zv)VC6zR!KQv7njQr3x#jJOM#r`0j%$t%a<w?oAusGLD7O% zN!4UvjRwO|8$k*WN5hiR224x_ErE~||8x3V91EyUyw2{WykQS$4U~23;KlALpVHl? z@G5@zP)1r|RDcLUU`kjt*d8*3s1siW7T`L*P2$+9irMDGU2%_Cy|)JQXga_+D@`aA zMPVFo1**izHov4C#2AX9NgBQ!L309Q6KEb=e{kp#!wPlPFVu=9>mH%x#9K`>ERbX* z60t^XR!wgqX`bgviXj<>fEt9+6*8qL5i)YuK-OVIU?_SZYzDLt7KfE&t;2NUFzB^x zf?=Sz2{4 z9BohFY-TT(*j<#PfOQnOIhro^xI~xR!-_mtLi4T?H=VF84;iKuQb59Y0Qz3HwLR2U z@aRA?HQlFa?FmBEv}&eiv}$3Du~}&>zb+6`wTQ7laZ&K9)-o4?9_R#WiLM2))mjUI zP2x}~JHrD%L&(6!5fsD1^a}t73!&O*2di+5oyFJf)dy<0Mq9W8a|tIx5?F`LZ@2M) zVC*~u;#mhFvjr4Evyxv0GFQMT5{{9p#Dsy8aS}a1sx`u{?n1`K8;0EIn7Fjjbsz*= zO@}=-)wp*ScKgfaqRUtI!}lYpJ7%$M#rL?o3$f3SO$=n+9;v)MU$rZGZ}C93rQ`iO zjoXhcUE(JHzWHg})!<;(o72OU((6d}SM|PVHad5+fgkwdR$uS7CZyEnB(tw`hUSZdAIXX-*pyN^tLFmqzUi=IaA9~f*tH#EO9 zmiuAme1z=HlPhPI$L^#g4?fv@wz+gWlK0)O6)B%NDqJTnx4#gXdE@+JXupR`={f&s z?>PF+zaQV&8SU`YEIoA{^(FP7SI}YV>yCyQ{)yQ2B`(4-JjjzW@LL diff --git a/assets/dolphin/internal/L1_NoSd_128x49/frame_1.png b/assets/dolphin/internal/L1_NoSd_128x49/frame_1.png index b58936d817d4967a344cef335547992207d239a6..4764b4888f8fa28d1c7ec15eb55a8ca08f1dfd1d 100644 GIT binary patch delta 396 zcmV;70dxL>3z`Fv7=Hl(0000w)10;d00Ci1L_t(|oNbaVPXj>|MbEw+k`+x_Lx6;^ z#iCFI#a8nxz@U&A6dMc%K`;mel0QI#>`El6X;MN9si=ZYXu@u?>_hAa)0Q!lIl1rN zH*W^DR*tU*Yklb$vB4{AV3!1{0U2;sTBzz!G9W4{6lfVZ^nber$OSxM(AX(GGr-s> z2{0QAhz;WZ6b=ax6n%76HD6H7gBgzqT63m95A$GSA$ATViexjyAXEFSFUVxZU>}K( zZ&z!O?;>1ZT-LyI5&B_R9!I!+1d?eDoE`#4m2U@k9pYYa64cL*#z(z8Md`Rhd8zX&XRC6fYm>_t@8=zNu<8pp|D} z&z_h^nvOa(5TMyi|G<*xgstQWsJ>-ljA%z|h05r3SzOx`_nn3X^nhl#Z7U)OA{KuT q(gr%U2#l`)PUcpMVspZ(eM}o=7=K$n1RP43b_>X=C zon=d$_{UuQ182}Mr&%!Bh+?8i5Ty%Hzm zJL^kJ>QX#Hh(lArQt>|3;8Pxa1(-+c%r=Q*D=KEM2lr+?VjbZK=F<`obK7Y`q9_V; zb9N{TjOd67(hiKF7@DNf>n3P7&p3FR!?F*KJYrZ~LXPom{-&%)Bzf>2)6{vAOeT}| zq{FTyx=EVjIFe#Wh9Qs!VGO9IkRnuL>ncbV#t#iCq3EWfsaOV95Vd~OgQK8Vvx)2B z@EW>mWQ&H%N2Uawr0o z(eS$y3c4Vn&#y`Saj2RhzXwMrc3F{m8A>b*Ws%^Vl1RuR>m)caMiU$>$}BCr7&q(kt?QPyye|O- zQ%giOtuIH2NRMV}MvtarjKfZ2)q53H){;g|?xN6Dt!D0r3FRP^n-W?aTd6g#tP_V! zIT;Sd7(#>&H$gEhO1~DmQ6Xdp?P4W2<7Dxyy?j#*S80oOP%e5dB%XCSVonDK3C77G zAdYnrB3nxlG%LhpD7tGINx(63g_tN%GDD)9NVQ7Xm0iTxOv8|C9g~sPx(=$S)e@+u zn6T|E>h`XX-y02nFf&qI{ytU|xKcRw&%sGd+S+jL^)&*ICrvK!XwO&=Cm_74xG8XkQ0Qo-j-_v{}1 zX!5YN=DU}{6PNMy&0zE0Q2AbB+O^tdrR zP>3xaKRfYzcsuA0?n}?U`$X|5m{OL_rHV^0+_xDVB!7JDtK=w{zN_JyMQCLwE8C+4;=mv&OgyK diff --git a/assets/dolphin/internal/L1_NoSd_128x49/frame_2.png b/assets/dolphin/internal/L1_NoSd_128x49/frame_2.png index 5b474fff262306ecccbdc2a0ace273bd26e55219..554fe0156909101e78b58b257a9646c2c56d6151 100644 GIT binary patch delta 404 zcmV;F0c-w<3!(#%7=Hl(0000w)10;d00C)9L_t(|oQ0CTN&`_4M$gV(aD|`|EVPhB z5Z^#cBjR)T(+Gl~Z;(|B8!MX>HsV8Qr)zCzVI#x@MXYqefQjDhSZuO;qXBPum^m}| zV^HTMl+@t74}C^lP-hz4mWpZx3sidwRecl-L}`ZtMFX3q>wgp^0)g;QSnN41VB9Hf zU~nuTE{KO!c(j2^y2rJuCVwh^g8@f0O!^;C^9y{{5j!x{Ls~BQtRt@j##JQVIi1Qt zvW9SSbew^}hv@!%uJ^fhwZ00p``!k=MPRG%U4~D*_+@+HHUdx&-tGiuYrVZe-y&k{ zNGknS?Or?@IDZJz3TsF%M`Vs1qTb&Xkks`Z9%J!wtF2Z_E^7H3v4>Z?1F$SIYRI yDFXd1J0X=&0aH%1^MRWyz?3v=T7n_x@BZA=?w9KQmaP*#Iu#5snZH%*x1dcEuQP zJpcdi|ML9)_o~06)nwdcL=eQ}ZQ}xPPQgJI6~gbe;q%pSGH8L;Mr3?$^G{GH>ht(K z2r_ZF^ftc+%4_}Y!RB;24VOD-=3jtQiPH9zh9LLOWQL)ldV2~%3f~F`yY+5gJ1fc& zGcU;kFvlYb)JBlHhPc9u13*Uw&=-!nup5&XF*Gc>ur8a=;!~PHf4D8Fg3e?|P)rVp zjD$7Rn~ZgF79vD|&ZF_jU{qt{E-VYo!gXewz|gFUKH$PU8INeU&yP0ADnK1(5*IBN z3+iCZK;kLE8sfzol(JAHLBiL8lMa@$vLu7%9t?U!(K=NMu>r0n=MhRStY6m^mLOuW zm^o%O%W5A%G7LjlD1xGJsDW#VsLsdnsJ3MpBnQI*O;p2*9+snM29_7(A>D<+pqI0W zC_di`dQ{654VI6H^9n(lEkq=eNinOf=>hP6EURj3!Gr>c0MO(iRRmCdOWqik@$QZ? ziZB}X2{jBah#%x+aVP?!x|efd@Wd>IB~}6=O#?~58Jj5Jl0e&VMhKBOLkkj3N_NUY z+VVK7*|%6pr>&7`wmTagB-z}=a8#p*@>m&;Avvb0DR1kIYC0bkLEd*5`p(&MceQ1k zRKV-98kFV1JR$u3vMy`=vVu}pGl^Drg`<)j)3)X>3SQN6<{VJN&jP7Ml_O}j)@*o{ zI3$aWVnB$(1z>gH7K(=HJAnfhLb8%}T69o08q3*Bchqp1wr~gLqU1wjX}dLKvoZju zYzzcqXge;@P76-bd`JRt^*#=&*394wfa zQF_#_Pb29|^G~O5*6dA;Y#M&@_~-tch*`P%?wMOf)33dA{gK^o6dE3gBkp)**`rm+ zU-i@U((Hj>>(QxyYmsyXGWxyAeXMl%4~uKvYrY%1*7DMco%7yQ`Pkb5V|#4cgxY!Bg19KQpSlFB|~DLUW}BUEU8BJAeQ0I zH$Mv|`6w!oGCmR()zIS#avN z3mrAJu|JZJR}o{AoGsO0+)>*zb?W}#FZg$*<_@){_SDtPI!Cu{HtgH_#q}Rc-Ok4z bbQeGLd>3K=>hGz{9~SX8cW~p4y)XX(7=Hl(0000w)10;d00C=BL_t(|oQ0CHO2beThQFLdj3BmdI!G({ z04_S(41#ZAaS;ST-@xkP;^gAsB0hwUW)xh+!9}Poigc(@zC4CH3)1Dy#e%bqL;0un-D-9=-vs;pQQH&?S@2{ zaVz~){knMc;D5lk3FDDmPS9gYZQ@l`KX;_(L~0WeoVmNwfg~G8%c)AFl5NpbBb!*e z0kAR}p-wj#3|avU8da$?nvsk=E_cEas-UO-ws$D zIe^msS`7A=*R&s{3!_rCvvbpLcon5kzt-U!;5)Y)4i8W7qW}N^07*qoM6N<$f@fL4 AEC2ui literal 1415 zcmaJ>YfKbZ6rP1$3M|m1!Io$rG}Q*Aw$-#D_0`righz~p)@o8>+W3Ipg*$r8aLI}KTXh5}7)?H=RmGbV2$K1c9BeUK0(G3I zMr^#K3cwbRM4>f;l$OP#yx0j0Q~({a;=%5m8OBgq@?g!502zpSL0IBz1$&4WOHi7mDT0Ex3#VKhZRaQ!O1ts70?|6EqI)`L5ufM^1`+O3HIny*VcLmD3+ zC}{|@;Tkj<9uVKfoi2ZLX1k}Po&5E%wY0?s-_0ha{EfwMx0!dXU;7)o-| zF3OR{S;@cJ?W^!QNxRcs>7uAAZzan(p{ly7%IozxDyXz?t)d&eB7$^m8OBce(vS7! zyc*yQRST+WSGpk@!>Xa`VKs`M7%b&4J;LEq+d>VjC7Mo&W1RMo!_ESn zcCZi#@_`GCo5U%G4@p39xoMHdP-3w$VWLE`i5_XHrG{P9!j4T246!^hNojfNfC5KN zgEO`B?W1*Y+PBsEDuVv+#}Bt2{07bQ&8```z3cjcU(Xf&aA?B|-UH{|)0g~c_7fIi z&(zS3fp@RWzjN%={9mp2{w5uHpV99hy=7{f9Nfa+%}K0k7_Ys$o-j+3R%G;-MDeU8 zF_BrfO9I5&ry0M*q{7G7o0m z8rv{7{^2uynsp|N%xqdWD=f$dN%X`hA&UN3szID`$ z#W&E=iufMtA_#)ML8A^XPA(l>dVT4XFDJN`Oo3M z7qu#-t_G{V^cAteGYepkG*z1Yitx%6rQCoyR}lQZ9;)C3{na>JCB`x%-FTvcDHn~yKR@PZG+m*<8C``cV;p( zWtXD3L4)Fp20@~KB!)&brN&sJf=M4~B8rwqNYsc1B_Sb}EK#FIO6uLVTlvv2nLGEM zd(ZjK<9=rjHHCH*TFa~mf)oboePK8!;h?g!;P=YG&nw_$F~U1)kdf(i*P)Qz{`vWNxNMocxF1gWT7A2LAooqChoz)qXA(iO-j*Y6W?Qg<6V;fF zmsA1R5-|;GBS>XcLgU3=V4?!(k`)h@Iy;7;vgE;99YHdv)q-xhen1Di20{^WpjTui ztm@H1Yh{9i2r*#tXd>397+k`GEdX2gx0D$KwUNp7fF&t zU91gAJT2Ixy!bFmlQcz8@O9yoi=*uv#iC0O20fx^r7lIeu&-{(Ba}Q?w`pn|LB!*6 zTik9_^)7;9S(YGaf~Ik(fg5`jlTYA^v1t)x3C0HuQI|DSRuwc2%L{71>A_&oi`m4q zU~m~-F_wx3%SR-5ji78K5sRf$T+lYmF!(=~6}64XUJVdoV5t4N2%!3=j4>?Z-5sSB zVKiK$F2f7r`+Ta{9|MXR@OdzJVv}TvlYq!DKoW4)Aqu!8FbX+kj%2ydr{(ZyEYtvUS|mmaEkP zZ>oAkRr@l8XzEr?)#z3=l(yR_w4zm3BsFeq&0G|`s>RHGK$rIbsZLj8=t8YId4)J6 z(m}HzO5*~syKs_bVES(0f`yRml#>x%w1dHx?4>(uxJX;L19Q4qVeJ0>kHcO6h*tLd<( zwq33E!)|X5_`H$&FK)cidt?f|=lL6JnZL(ob06&JEglWu>V5OlD_@Rx74$UZH!XN{*U z?{9so?qtgH*FPy_F7L7>VXYW(w_JIBPjOM!spDr~Qpy7-I?fDDAw9#fi^elZuI2X6 zL-_C3$EON92gmcZC)L`v`Bvms3%YFrxpvc?-4G9*OAcEaQ`@J1Iel;YXPfJURo~w~ z^>WXeqlK27>$|A<#*LPecgAkEA9I~cA~X5HWY$B-cv~pnR(^Q$=~bU*b#mJ;z4gtH zU#+h`KRNx=wX)JJgL%p5Q2B=0@3eI@N8Wwz!edprGfy-oFF(s1DjhsC{K?P*Ipzze za$jtn82#w<@ww{#jYo@4{BgCkb9VK4I+QATEje*)U)P^GXskVZ@Y~h-|JvdQ0=L(v O|8@a?$Tw2cdEh_m_R@*~ diff --git a/assets/dolphin/internal/L1_NoSd_128x49/frame_5.png b/assets/dolphin/internal/L1_NoSd_128x49/frame_5.png index d7f8c6402a27c5a2eb565d12b595a3a438ed94ee..657cbf815ac3c1d164be3ec9a72a3f32a9eee53f 100644 GIT binary patch delta 399 zcmV;A0dW3=3!MXy7=Hl(0000w)10;d00Cr4L_t(|oNbaJPs3mkhM!$OQ9;5;5F-IL z41ym(P;?mYP}KT8KVT?C?04k{f44*qnTIExT=ykjqamP7?suCpb8ufVVt z-(@oeJ_CVMH-7~&(DTJ`8D^IO4=}7GNh;b`y;YSVB>8OvkWeN6MelxY(3=miS~#Y2 zKI3uCvT(P_jJs!h+F<^uRR9;@`nv#g4Z(??3*Zcvs<2&v*gbjM`f+VhX3tC&_}g;q tD%PDHLkV1l|Oq!IuC literal 1412 zcmaJ>eM}o=7{5Y6#+TX5+!*L?H~(N}*Xv!cJ?_>DwAVqE0>LhTBeU1Lw{R)FYwnIw z(71*v(P3uHf;h|sKcbjL5cULiX=$*GC0X_l#L@>h-#L%EmjY+*Ks$^|><` zoJRwKp=tqD?amUSxl1)vy-SUul+8k-m94TOslEEX>_x$=TF;yZntT*U2Q@W{rfbc~ zo5Uem?Gy{b6dnRL2Def)Ouq^+un>}sbkHJ0*=a0eFWphYb=txmm`f}h5=T31VY`h5 zIAv!c5KBAo5M5=(Nm>X?AjDKrqJW`9nwT(9B1NJ*NVQJb^e$vUiVb+e1H{KK5(m=OgYNm#>cY!8O>bKA%qGXf&B1f0zTbUp ztB~hVa^vWndH-Z^dvT2ek>^jwO@V>4!&`z2hYL7k%KxKjrmbiPTIL)~ymq7b;;y7| zw&L4*UlxT@2>>MiwkDa!Npt}*?G%*eCWOC z?n^7NduEN+iG5>DBL@;A&zK)K zy!~bWnZLK?86y+<&$sT8iOY@uEPTTv#?hsm7q1HKb1NNJ3U)Sp(p&c=BAxXjSoO2r V#OII6-|b2L_$A6-q)3sg18^untB9l~?+#2l*9GS%m-u zk{nE`u|2R6nthkFlBPCVy|oVvNdde9!h5}U;bT-z$FdV?*2u+;L(9pTmXgYaq{bQG zc4+aR1<+b*OMgkr*%sj|oOjZHXPXVCEr9Z&+NGp+_Hi+3Tu5GdK#&Y?RP!g0CO{;) zg`~4DAPXEzdNG!!=N{gRq~am5Cf)pgBsUaeCyRGE(p<{rWIf_A(rZa-WxdjqW`5VfvaVC2}ENRuXLz41jPtv7t0HjGYkxr$0 zxm{2SIk>+W8^KGk7BldTKCOjsVD7{!fSdeU!=pnC^@kKzQIIGIC}0q)NR!BC`$EqA moCl+=6@!11?0p&h*Z2df4l1@c^}Zwk0000oFh0X$~lbDR%OGfw@tkv!v!1(_0Ha7NWUZSa@ z+Yk(M`i?MB;lZHl9Se~6u&+HF2fnmAf{^?*ZUI&+AOfyy z-}=>Fqy>07Gk++6-#F7_#d4WZoK!Qd3Q+7&*mQj<0?d(CDt(DY&FVSrv6b$V8Wg?* z@VRWC$IJ!v&JqCDI9O6XEJ-iKoug<99;{0x1(gw`z3axYUqA3WemJbuL5LKZi;=Is8f~MX2+TW*Z+e0>u3kLf0N882d8spmu~@Xw}}2jZeoxE zz>|DlJeCS2s1mv4QxRDkSvf#f|HTD~mqH8xasYsDz9Rq}1Yqw!Li_Oc!Ps{{7r@;x z22nU3K}I&>ti*=^&PzC+2vhn92e|g-*G{TFsMIGJ?Sirb-FK#Eg7DCL%l`n-&4MEU bKLQK@@H_^gvWeS)00000NkvXXu0mjffT;=+ diff --git a/assets/dolphin/internal/L1_Tv_128x47/frame_1.png b/assets/dolphin/internal/L1_Tv_128x47/frame_1.png index b0ead79941c8c379f99e604b4f3409bf7da6b1ab..81f12ca091bc6e15cbfc5dbea471ab91bdb7ddae 100644 GIT binary patch delta 505 zcmVIhBzijt3A%(|;FVG&6p_yg!kgUPK8ib=z;rV^ z``*l($3mK_i*h7cuEpdl*gnjYB1x4rU4LU71Jp3aTD1NWz(J!% zsuz;9kQTCr2&Vv)(C=8D{H3y{sA)W`;VpnDshYyeC0O!64P2QqrtCTbo^zgYnRGyz z3OFeD!Z4(0J`W>h(ln&iF!U^LcI34KB#+G9Rk&C#z3;{M*sbaHy%KF16YpVH@*O@d$}qA6fXU`Suuyx@Wsv47VQ^KyrNEV!AB=sR|KEnz=1WUaBsm zHO80%Q-BAqHkQia5aK#>>0C0>@-*5(TkF#Zet^B7$pbg}Mb6U)SgOxCT&BixXeeQj v$>%O@y?vr+&z5Gq*?RD=liRxt{ww?ed(02v^Q!$i00000NkvXXu0mjfxqRr& delta 592 zcmV-W0}8sA_B1vdv)u;b@1y)0X&vD2As3M*aUtI0Ds$bBkNPqKH0ed00nXi z$%Q-tc>v#}96bI{09Y2`78Jg-pP>L=IiCSAEy7QIaIwQ700`+Z&NRR*0#xHOJB~O| zMF6pVi+dOWf<<@YFr)3Is_W`G4}r)w#sbv1xiMIemK)VbX=*;3cdX9Aw6S7T3xLQ(YTrAFLb6B* ztlVt3W*BGypaH9bvj7am*{u!LlcoSF@d3+KTXgzUqfj6}3&Qe>wNBjey8akvDQ#v! zh^E@hl$7-Th8I^tMlqA#F0MNajIQuTwPwPGdD0^&iGNOONA3NG=0%-ti!afz;npils~UkjSZR0oxMan2zqGqC&3R9;EKm%dy61AyHs ecm=>mfB^tQ`3C;?8R#|u0000oK(DK^$aWa%nz*>BZNPhZJ|hD%#Q}!IMz_=U)hk-3FZ|B_I%si84q#*t zY-qGN11d>+>ZLq1#2N4o;IscRc!KijNOml#mWyhK%JHd6NxG6$I|JMcEb!}9H>*SPz?A1W_xJ#w-}l5`FbZau+Ks5g}gHL~s0C-v&*gb4W2 z&MXe155A;E#|GdQ{&M~raQb4pT^#H`NC9=4@g5LKRcPgqq*=Tt>7oSyk~kbo-=(T_ zo4_P619y|LA-n}^G5r?k(O8&+xgRM5?(q8>9v@+-J|(aYy;z<{2K`7`5{GTJmvZKE l1tI1I`4H7=H)@0000Ssxra=000?uMObuGZ)S9NVRB^vL1b@YWgtmyVP|Dh zWnpA_ami&o00006P)t-s|Ns900033O(|!N|0p3YOK~#9!%$VDj!ypJnIsgCD^N>^n z92AJ{8Xvmaq{^1Niikki;7?lv*NESL6<|t^8Sp*%MkerM0DrXAjmFw9cGdtun=wUz zglW;$5#9pa-h33mJVYj*(RLE_0Bi`I1yB$15H_}qs-M0CxPE`Ejo0#ZF5VDa;`EGq zprZQD0=&&b@ZL-P7knfO+-kUgPr+P@!b7FRgor9{SpY8u?sK>j%DxF#iA)gAL?OAeAa@~; zM7jzCWSUtUKDo+7KU_0DB`q7I4`^<{lt6ga>HspMMoPp4WE%S^-cI1C_Y$+KyJ6 zlm!qLsGq1RG*TuQvjEm%=OW{sWC%b)H@kfcFw8Q#=+Ss303Zc`8GOtiOC2pjP2_@4 zd1R*{VgOnFI};=>g(3jgJaho!(zpV^L4fG~V<{i(9E^SSqX6{4xGIBJ_2UO|I&TL+ zF5%)pfI3Q>5x{*ezXQ77s1!RHXM(Z@x_72$obb@S<$nO^M!^w)KLG{+8-oV2VHk!F3kjq6_l7g!38sAP7G&{?v?evrajEdbN zwwg{0$B`sG>p*33*;%e3z!!5jx`SpPM=B(#Qs`BCmhPvFOMt~nC58{}u>iWBN_|P1 zs#LXS!NCAvnSWM*< zE2sbt6r{d1Zk_4G3JSz}y+P;v`(q&Jo^AhPcl%Kagckq|-EJ0uR2BhA%G{QuTq>8r8e>d~ zNg)TW*O5x#1j4Fv@l-O>{36($hU-!beuBN|WK~#9!%$VVlgD?n$+4q0xn`zYq z!V*BeyG(zyTEiCt3r0i);tl_5Yv4Qh{Z|2oWzK;2>>HcFFMk7|?QUe(RJ2cKE&!n5 zoI-FR?|?kOosdK1|2F{4MT7~3d-gLfK$On!0H}+IL;nu|Ab0I+E#45I6CfoeD+09a zYnMXTBllh~ywX;B>bw9mhmVZ)K{Hpn2G8o{0k{Nl^~{<#B||%4#H6>oIOGoUnE53O zhI>{5T>c83T7NUory>Ay$9yJF2*9!YO=s1xj}icpiAon>voO5{UThwJ-FpDzpP!IN z!0rM}$$43uvS$YXD;&o}ZtQpfM#I!p34p+ez<*EpE^hpAzNNI8+b7i&6Ck9l_mTsk zF=OQrrLjmFt)R3n*-dJg-vjUsLsMMBA|~I>TxxGra(|}>>+1*HUOA3Zcc&@>d+fu*%7Be8o&nZ$mr{yYz`qD`)Bu&TfPOjwng*@DS$~NE6L}@V_qyp z^@N2U+Y{@!>rVho4M5WW%NA^aBLGz;x&Xl&JP*b-X>S1V){Q#=OJP5tXw4f7n9^Z`Ih>Uox%^a-RD4R95WiOR)9Mb0Ttx$G~9hGwu+ zPO7yk4jvs<32Hhxh%z2vvA1ulPMb;dsCj|KyNQ?TQDZx7TD*9sCu(u7Hf?|yK6cAC zK%kdF4h+f#K!4I{_s=MSz@J@Sbq*%)fxzM0d7c6x`JQ*q4tp0ld&Bw$qP4BaU^U^TW~mq}|CRQ(C(IkWWI*^Stjs&lK(+BePFY1cXc zAWHhf*W2pc%>ZzR-tqopp!HK&++uC@VFt@PZzL0nQ delta 588 zcmV-S0<-=91K9+S7=H)@0000Ssxra=000?uMObuGZ)S9NVRB^vL1b@YWgtmyVP|Dh zWnpA_ami&o00006P)t-s|Ns900033O(|!N|0qIFZK~#9!%$VDbgD?z4eg6NaS1P3> z@jZoVQ6EY`@nk%{AtHiUm%X}maa{iMM*&=xeGEKjf3XQa27kad-Bi!iwD0WP06>GB zhPbE`PzUghH9J7*Kp?zd`{~I6nhmS|pY}ezM~s0HpL7|1`iV0=oX04^Hl= zCV{liIMZaEecjq2pJ$R~2)pmB0Z?oWJq|MesC5j|0C4Hq z(qk)8l8*pk@J)&=e-%jpRQXpfD0~$103bI22qyRd05<~gXLu5B<|!(blncOawR{yG zTNnVG5k*L+DxHe`D(*m23RwVfjs-)G>NG0-PG)vNn}OYLruT^Ortg;j0l;n)+ydZF afB^txc?PZ*Zo7#90000WWD(}M04duNYDn&_$l2l3a4S&Z8Kn-K8MVlu995iaA zx{#zoDr5~2&HyN(->K~Wm9i$UX*_J`Er2Mgn%v7JSZ0A5xH4l**=+4-Ar zuwPEYFr;X?3?pUIJfzhy^ek?1?6m_VPt5(~9x6Ue6(lWd#jKuK`X3kk1l)R~lEVA$ zSO8rurIDodQh!oCvEX0~B&$^oSbo3azyoNs3s_FxH9iNdD-T*{v)=kpQY^Gqxdk%^ zq*A=lTF0M30oarDa$0HbTkT#d`3b4^%NE#96-Qze6%qlg?r`B*%&(o@N%dNi8im%{ zxAp409eo49xFmbCC#g~E=`DJvU!MX|4{Y}r!|lg85OQC%oNfz1szOAP7H&(Dm#WKX zjWH(2qyPu2;!!5=~6P%>MYtpi}h&)-@!i2#GO6*BM00000NkvXXu0mjfG_Uav delta 585 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 V2Po@6t}Orn002ovPDHLkV1hJ*0oDKj diff --git a/assets/icons/About/Certification1_103x56.png b/assets/icons/About/Certification1_103x56.png index 6e11bbbb222cc54a3e6883f81522af25fd847e52..ae6b4abe0bf15bc3f7d6dd54e212f68312d6667a 100644 GIT binary patch delta 474 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 cuJ&5K1ntnAA0Foz>%07*qoM6N<$f}(K9)&Kwi literal 5314 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 AQ2+n{ delta 415 zcmV;Q0bu^51FZv)7=H)@0000M+FsQF000J1OjJex|Nj6009C@%egFUgVo5|nRCwC# zSlhCLAPn67|DQgs#bkp7`(Si>hSZ@Tm(2~>5ddHEF7cLD-JVYe_67>X;J7sm-1ISJ zYOr7BIXJ{W*Mc|a^D%I2zd3lB+d6cgrDw#~cVF)3frBOw(6pd7MjmbS9^n%de7q z8gmH*eN7^$NxuPF6@EXoi8>^*7SDDC7pUIr0)NgFyvqiP=DpEl%h?Z1+@8l=v)u}fc?>ehXiz-Z9Fy6O;gi?FVl_*a zEcs^~7ei*j33<7aU^6hSG4m|}@2|KC^Szp6?m%?9kTKtiJ8ZzR#>}@2+%3TDLP&)jlTWTkQ$(xb+g|dza-y=6la4goOEiCm4SM3;=?20_{ul8NvVn002ov JPDHLkV1hr!!;1g_ diff --git a/assets/icons/About/CertificationMexico_98x41.png b/assets/icons/About/CertificationMexico_98x41.png index 9b1e45e6f248644a4f20e4620216d57553a9fcc7..a49433d7be52e6934a857c318537ffced523911a 100644 GIT binary patch delta 315 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 diff --git a/assets/icons/About/CertificationTaiwan_33x32.png b/assets/icons/About/CertificationTaiwan_33x32.png index bf2bfa21a7b7a7045a87bb2c521e50490f3fcfe9..393db57c8df8b70965511dd2763c437345ff006b 100644 GIT binary patch delta 189 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 diff --git a/assets/icons/Animations/Levelup1_128x64/frame_01.png b/assets/icons/Animations/Levelup1_128x64/frame_01.png index 39c910d3a41314c985e4ce79337cbbf30d1ae79e..1429d994e5164b3d75947d4e95daf922e30ceb91 100644 GIT binary patch delta 563 zcmV-30?hrr48R1C7=Hl(0002`twPcO00IX|L_t(|oYj&&YZOrwhM#+9vKf;lGiVk< z2+0I21Qph93&DwvAP8Id0}^a3gBFUSdqq^V5Wyc{et?Cg;>V0a>ZCB0!K}ezVNr&x z;O@?5kHviDFL=81a(K`4o_pcHFLSi1*hd--nh}6sDi*D%7=O}Zz*4tIxuAe26TM59 zn;WH%+mnH5XM1dzVYfc9rOL(Xc_ye`j)VArQV0Yf5eCS5}$S{b10`A!6A ze>gz^9FH4bX8Mf)h^_VP?dt9Y5s{CsNwZX|>GwK#v6c>;SXvB4MD{|11L*nnT>z5v z73~08H7o#X_Deekw7T^vHG6&Kak}>D832x5ZKUBk=NbT5s-1}002ovPDHLkV1kaG B5v~9L literal 1597 zcmaJ>eM}Q)7{5}5%D^dpRi@)O7`W*5?s^B;R;rYKC`z%G8Y+Q}>)l)EN_*Y)Sc`6o z=qAjeQ#WD)}yh;LPt4dw`DnG9mu!RfIf~Wx+2mqNwqk+0$*bp^hBX$i?jvW&i zI-(-`jo2tDx7~r7MG2s+hQfK0BvDqc0RpG>&|Z$8hiXYJMNsf&af&r)X#=H4$1V&y zlmxHAX|avDgF7QuE6X7RK|~@EO@!8nQVl`r^?HKT5?U<|HSlmlQ0Ag|Fq{>)U;$xX z@`Yrd7(`SmTZhvAp7#_;NdvV zgY$V5g=+!BA+9YtBqdTWuzYR#wf^hH)} zk%^3Bi-TdA3-TcD+XsD*VNK7)8q5;lWKnX7VqLru9JQh>hHJ$Ts--m~I;Y$h6vRmQ z)mV*2L$(0P_ZARrk{Ccol5Frjg8)b8=hIpi;2zlNIO7qZBzSZ<%g~&cVR(k}zyL<^ z!c)l`?NfLHg9ydB7)T0u^LR2J2Y}JzJj+nHhbFbSmt$F)CMg}muowX;60yE{s*mDF zusLJmlfi(SC!+;|aGoSMIBLq(1&1!tQR1?~b$EDq|K+_`5G27^Y%#f_f823bZBb^b zgnx(k{&b_X%C@ij%eKlR1xz4AxW=oeHrzdS@wL@=Po(b|Y|8y{=6&U!_b23JK6qSl z=Ul(3U+Z>w81&36ROoa>Vw};AiR+k0+1z%t8NFY0jwL6AiTw!i~cvHBP6VAaH(t%~zvICA{Agl`I%Vxu z68zSrmC0!dz3ofM=AK;@KX*2Lw5i2p+ufM1m_OK}@82}P>xjFuZtgeW@!@ny9%#*) zwmG$JIs3-vs-E7n-E*90d}+P&5)voBGI-Sa>GrGlauUsV&W&$Ps>}&tmW&aP|S$*a?s)anPWU)!;^ zL#VILC2LNl&CYCZzS55@y|-=+x*uu2(bC40EMboCNF}Cqe)a1irm04ewgSz*9By^% z53in~QmPX@4W{I>O!-`%ZUS=a#>U^Lq$RausA>A~+>cfMi{lcGP4_BNmUXd;&QI)Z z==qd;({~>{d1mb{bt%%QGTu(SaN34cx>QKxEJgeM{Y=w%WCnXCBX!LKlhR`U;qFB diff --git a/assets/icons/Animations/Levelup1_128x64/frame_02.png b/assets/icons/Animations/Levelup1_128x64/frame_02.png index 4975adf8627b62a22d002bfc1d7be423dcc5e83b..4b3bf5f83e073dd7834902e16d5a4a8e39456089 100644 GIT binary patch delta 713 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 literal 1828 zcmaJ?dsNeA6psZNpyCkU;tYj3n5KEOkTz0_&{lEs<_M@LX_7*fHnk13Fb={*k0JvU z6<<5*acnphaZW|?QNg3QIp;Rz024uk4K^7*jwqtCRKWR%$DAbJ{l47ay}$c9*%%o< ze~jx?R{#LUgf37<^J@d9m#njz_o z)mNE70C33D#l~~-VT%Zg)r&~Gj>xJv@@N1ER9KB9wTj_D4U?=h$b~)C7lfdWmJ8$j z!;mmz2$P~)kZEFKGQ(r3%vF?(7Aod~fmVVypl3J|wCYn0X2L2LzP3y7vi%qqg0EG$ zRdV4Vsrax+FoZQRATB~73PBJMmx&mf#57_pNzDc^1Vdqzzi|k~2~13&GH~b;@(xY3 zmWWoWhurZyxiE#}j06l@EEbVPEMiT`Fe;PDU<89P4B|B)bB2Kugd(LhNr`dku$_0|Wini*7Go+LQ%O-&6(UmwD^;ohvA--> zg$2(;hOwarGe;UIX4tom_dSGFz86b`m>7~{O|dMSI@}16DJ;jDQ&=O2iA4zL8>chS zti|kSuhC%0O2(v1XK1yF)q}5-Oz7T0fD{J=h%uajG<>H+5)I8uv_=Zy5;3WjNGJ)a z;R6`N({Ckjuuu6DJ_zG57Xm>Utv`hXKnx?1K@=`QA&nTpAT5dGVljeBB@$c+^Aurw z-@MgF!$*8`+Qm16!EfG-7GvP&$;1!Nn#4Z)*f~WmidFIJz`#IRsv7#R+qh3KqUKV$YLpsF+-C>Ad1 zW5>=dVf}1sI?^UO=z_-BRDvKiqR!gx~J?s>wfxY|O9R z=3<%TTyv!--`al0bHepClGHZaLthvA+^UGKm8UDa^XhJ&LO!34xwW?BwHEl^*cY-~ z<8`=PGTBGH@UQB_-Fu367GaZe+zy?sU%%opS!1ew<>HilXz7!K%hYRTwIl^?#-}*f z1@ul;6k?`QBD!{0eq6!w)V()%oo;Mv&+BX<;EJruyw*DRnNDc~;QgB4(jyyYOl#V4 zKjtX6d&H=T8#b$@NiiP<{E*-MHL}KC;E)jSZWDr^Y&Z%6BZIC-Z|b#-?HQLFTsSJS z@$Q#_w%gOBZtV~6c9!ORQ`9$FQ0rII=XiRz?nsY&dH2H2<^3{|#OCdI(@=P&b)sPW zyMOp7w6(KXWo40nJ zY|eY}PX@?#b!4yazvau+ju3P#d)l$6(`iE4%ZY-9f5|pwy$K*30`J*m9hcRstx#3CvLZO?i~j&Y CQO3gn diff --git a/assets/icons/Animations/Levelup1_128x64/frame_04.png b/assets/icons/Animations/Levelup1_128x64/frame_04.png index e6c88df92b73b89f1ad31810be1a653c3fea5d6f..3d97117312105ca80bd36fdf2884aa197d449d60 100644 GIT binary patch delta 719 zcmV;=0x(L_t(|oQ>1ZYaDeL$MN?wGjS$MmTbY4 z_=D_-2w^<52rV9hUGxtSLMEGA7X=Y|(L-y!xDzjy_0S>+;>CE|&e4;%ZZA^fd2J}w z%(jY^Dw(uNoi)4r@vv?pz1ZjY;q`p^K0Mzq{D1kK$AX~t1bXFu$N5fV;fWa;GjH+cCt$Z$YbYDR|F$U{pKD zDqt%_jZo7cT5UVK-vMHPVfYKo?l%Csu_O%w3$KMof`5LEX?1G=aV$ysl6RV@l>yxZ zfY*_R6VYu-GQszEp!jJl0(N&b7EN_OkP^$N{zv@!JiP;T0P5RkZ%PU9YV(GZwwAv4Bwez`+}$>SyL@i$<56Tpm+!RFsFf~`B1t0%kN!h9 zj*GIra*-^2RARhdaw>?|A?K002ovPDHLkV1i=c BVy*xH literal 1686 zcmaJ=c~BE)6we_o2w0(7EJ|I2w$PgFkwB7#KnMwk5ag0$7>>iMhk9}@h1G@VD8w4dC-Ij zQz+w2lFCpgLXotYg2V!pPa+5ciKPNcOJEwIjvyC97=ocN3SKcE72}u?N2Soz!vg`$ zS{ z2o0YMLQy_OiAX-7(Fyq)2|^MQEkO#!5~rUR;iXcsG)gGM#F$EgqN+%#N}*J#f`vg+ zg$h$dAWm$o(ZUc$l5)n@gVBBu}%3uuP66woFJ6ABP0AYE_N z(pF2L=2MhN$|uDll&=vY7+*(-#X=#1N<<gi@&~&dP#;2;lXt&#&t~K0bu{c{|l@Y17 z>-RHn7{7%);{LVo+jqBhkqhwFC4EtW3*T<$zCId!FiEzI1fFWbckNm0!wC`F3?{`-k_IuBzxtei%cnRJ}L)M0R{}2G+6F zZG*9Y7OSOh-!=B>@A8IMxp8A|xO=x=!2Y(+gJ-d;8f8QB1>^h2=QL`k^?dIQyM-j| zc4sTxD_T;{yi;1W<)2XO1@7zLRZQU{WAjPZ3s_`D;x8k!Rx(r zKja`3H`3xc5OAPI-m|UaXIjwS9Q;g z|NJ!wnLSd#RzRm}F3x!OXko;eggHLEjEeb+)zxy`<>_YMQx@?^U1w9t;}c1K@m{7o zOMYbiaeBb(0uyc-z1&v+X;R|B+QqeBmLg>`K?T>>PuurH!->W=`<=?xPu9n?my3`3 z&mOS$&p(%)uDO_#>eK7qD+r0I9N;9mtXS)}Fnc&`tj4{o`pL{(#jZ!9gTHL`??_vJ zfKzP`85l_E${B5GU~kg*br<+>+p_$N<2uSbpn2@F!~NZyb)lDw!Z{wSWiB%sx(wTa PLRqX>Rf6(}B5%!qVpw+j diff --git a/assets/icons/Animations/Levelup1_128x64/frame_05.png b/assets/icons/Animations/Levelup1_128x64/frame_05.png index e7bae4d6c8e7b60de8cb5d4751ae8d9259a39338..639d7fc17978cbfdba742e90fc0f690b2c39ac76 100644 GIT binary patch delta 710 zcmV;%0y+JN4blaW7=Hl(0002`twPcO00NmwL_t(|oaK_uYg}a*#edJ8m&x>+*r>gw zg=sTjm0>mpOJS*)s3KTDl!4lID&Cu zg7`siO2JNO>1{FzH}>W}E+!-RH~1_M=Nz8HIq*Nb@f-kg6@LH&u{fP_%Rm1zWO(FU z^}nJ~KR-e-A8kvJkIs)hfBUnuB>+JhYsVuN-rV=Va}EqLb>vcqUd{WPWZ>|GR+^P- zXk04-0=XNPVeLk`TpI0zCyrO`p~aJ0Rzwi@=jnX<+*3UK<22 z>rGAY3JC1{Fna@f4byv_=~PKJC^??Ra6E zhN{*8-Z;87Z7_1eHZ&3k$%J+bVaso*W}I>_3M0u(YEo1FwLF`DDEom%*9+TzLshS5 zAmoZ)IRMI@)92<5?vHf~EIJ^o&Wl9e>N_Sicpty(Hs_~>(`S3pkU@V;km!pJu<}hk z31LBw{D07Uf4`R$E)IIae0g>3$F9WVrH$88ul?X9dYU!EQZsx;S5-9<^U(d4cGusY zKCpEEv1Y5Ktem^m3@gpBoK;jaW_fBlur>&+m1BSER-BW^uMm|sdt<807*qoM6N<$f_HaZ-T(jq literal 1672 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 diff --git a/assets/icons/Animations/Levelup1_128x64/frame_07.png b/assets/icons/Animations/Levelup1_128x64/frame_07.png index 32e864e9827420142930083d480d331024d033f9..d59622993855db1376bcd8c5b4e516e7c67a3deb 100644 GIT binary patch delta 508 zcmVPYY3EBb!w2N{PZGyK zCc(QRuONN!HQ2toa#R@2Jg$dXvs)P9=ElX=x$@kw{Nil#+i80r#ubBOK;~nd+ZuX0 zH_jLJFpr z!(mWF!iEKG2;kcg*ji74Ykff1Jz$*_)Br$N`2diB!~~!r1F(1oEa=Yb2q4xz=m=;e zycH3N)~MGEQ2D0XA|fI1Bm@8G%!D=0Hs=9=~&RTr_)v`!!2Xb17`Ej=(CIaW5>_R yr|_GHv;FtQ?aRwU=kt9j9VDO7qXG;}H-|stA)(|ngP7C+0000lpcNfsA0gc z;4`?ar4Pfwol#va%OL|nM59qW%HUGiPf&Wjo*-$0rZK32MH)nzi(z6UKk2~=B78Uy zk^_>6COmRpsZKVkA=u$8f+2_Fkz+CPuvV~YM2rg&6iyPsU?R04?TG9G|HF8qcBHZ) z1PB+1NOfTzw#1j8G=}ASdZ2_NL}Mrq2Vh^gTC2p@1%W8rtwuGx!G(Ze&~d=aahw<9 z3n>btfriI8uaCjJI+Evf0>?9~F6rk<_9djw!f16imbU3A%4X5qN~|`UmMPSi*ys{7 znY6Ww5t$Qtkc=IGvCV7=tEKhkr`j4UVZg~!xKfg8lSHVfmSibXErn2;!AW##RX`M^ zXynC2kA_pWf^eW72&G{uhz=Fm5O@Lrj?rovngy5_G9A-+1tgoGE;=1Mw!5dLIL>q&-FN=xw&*uC4Znihe$~NUAEd-L-0kus zvktd4b)`E?wVS_whgh+2EWSyhisJ_sDkr2?m?x%AIPEvRi)_AFgWT)A-;$?9Zk`oV zLVYi%ps58@;_dEc&+@jWF$=~m*faKDX(zHZXH?WP`ciFt`c{|Fvuq@?>tuWXt{Vb! z&3Wz*d$02K6q9mm8tck5QLDT1*md>GvZ{VYZ1vUYuDk-xr(((|(;@q++&ZNF1LPs~qy>5Nmh?FjI;C+jq@u}~$RyFRM)b3xp;ltj4 zUf7$r<(&U% zE4lk;thumebThty%=r6+vRkAVy);)DQv5hN>$`!&x?{7-dKcfxHhtdGbotBIkc-zp zt~M^wT)%m*{C>Ksr98cC%PMNJYx@)?@A-Qd8ZCi=E6$PI?~k0V=*Uv$A3kUNA@v~h zY7sUVMW+zEytcAL|>t;DnRKT5(UD*ylh diff --git a/assets/icons/Animations/Levelup1_128x64/frame_08.png b/assets/icons/Animations/Levelup1_128x64/frame_08.png index c692f48952c106373b56ecafd4bce7ba1295f5da..23b9a9bd0d1078681dab2f5e42bd02bc32fb19e4 100644 GIT binary patch delta 513 zcmV+c0{;D#437km7=Hl(0002`twPcO00GuXL_t(|oXwIyZxcZf#ecimGZ)FkwxDo> zauNj%g(aHMkZoyzk6=1FLXTi0J^@`iT+w2Qf&vL&C=wS)rc4uM)1`2TiI8%#eK!>M zCl^FR$5f-Yv+vEk8Tij5Dii(hU;ZAgxqJ>0R!@nz@1{N9J7cM;78dyDHs4UR^L zAHq3fa+M^y<$t=s`_iBZ0Plb+JOLHgfqEbL1?``KfpP)xYxWk6&Hx$!_<9&k29SG5?9tE!z-Yim6{&ie zIfyJ8x&>xwwjCPN15h!R`yDXt{$l{$FHF<37kSc)nSoenh=@o!1)EQMBd5HE_nd2ka|7=JXS#89*jgNP!m+d9ax$sTDpS(;usXn;T{(Nd zzTbE48t1HOBQ$Sl001NG#g-DZE=Ny+T7}*n>U9pZj8Uv*%3Rr}MENiTgNH=xd5nEiLNrG%rTP_l7>HN@+n_tNGvR(k32{1IG#b@L8Lb?y)KNyGQAg4`nkJA25vh?BK1N89%%lYij0j;d zq=>SFB`oqDxmq#di0nWV!H~o8)UXs8%oWO-F2;v+l$O*5gNe}kwIfOi{GY~iwIi;Y z5Y&~xh+G{OP)U55Nia&^iyb8t5gTrHSVVQ<7g}VYItV4jZZYBLi`FZ8IRg(pJkNUw zA)BHI8tMgt_xKpXV;}|I;N=B|H6-mk4_`zY%uJ4vW@)Q|qO4}4wa8+%<}lgDA}d`~ zNG7p%DWdR_0F%B&&{G~1zyRL+ zO!5Z$6rG?TLP;(hNkLz>K;{q->WzfJ>M6p*kTl`rS(af)%AnV?xDHX&CHm%>K1v>; z=1hoB2Lo-Mjuw>AJcZHVd_T8g6B@cS=S-Ist?_t#_wU>O03c^_Er#$s`}2At6RG*kH%iwIIOcLFlAe36?42` zd`H8NV|%w=Ik>{cJos)yU)9OG6WtnTd|p~cdKc)+S^(;2&%4_4jr#TWo~>!v`$I_3 zvoG$iyP*Gc$nt#$mMrTc?^4j2(rjCMyj&wy2`SEwopXM!ZT;kwq%d6%v)^Xy1k%`}eLa8Mr}TBFU}|SM{nDF;MJcVm>CKkZ6<_sg3WvFCvsz!Sm}nk; z;m#rV%4Nqss3XP{gY-=s0@>?ZeiF@xx#8B{Yx# diff --git a/assets/icons/Animations/Levelup1_128x64/frame_09.png b/assets/icons/Animations/Levelup1_128x64/frame_09.png index fb1c8bb9042d28b4e0ace883ea20e23cccf7ea52..1fdedbc1901b27246ed9f1fbf27aa2e8044ba817 100644 GIT binary patch delta 514 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 aR#*bwkfy%NiRRUj|9VblzU`o;xcWa;e@A@) diff --git a/assets/icons/Animations/Levelup2_128x64/frame_00.png b/assets/icons/Animations/Levelup2_128x64/frame_00.png index 77b531076df19b7a04056d7ec88284c29ee33421..0bf23b5c58f72c3813e7b88cb3d804b163170b4b 100644 GIT binary patch delta 347 zcmV-h0i^!e3hDxo7=Hl(0002`twPcO00A*cL_t(|oaNFnPJ~bp2H<~q$g*bLtkq(o zW@CfpCN_3ZdIXQ*4WzKJ^Z*td!5i$WtnF+uG0_+kDX@@T7z>CL| zk<>b24~LXFp!at9nTf>Kq@CWUYw!W{=2wrgb&2sd%3KbO=z3MCTPWpM3167#O*uW% z5Z>%ukpvvmiDyM45rBd;2R}TP35^t>Ky<8002ovPDHLkV1k^{nkfJP literal 1368 zcmaJ>e@q*76hAD#$1f9?fm_&lB#eb!?^nyUCza7&8Fec(r5V)($M^2Or4{b3UJqLc zZb;M#aT|#yBN`n{mY8g!G25IP1I8?7@sF8kV&-&dVsviKFwG<;1najzaet6q?(TiR z@80LV&wJnZZamPjue|ipQVhe&eeGfp$x-y|Ew-TdFU2SPNYt3#u-T2u6bpsTu>XJ{>#7xGZLBFZj?fs^+>(j|xgVOi1p8u|i&*?@ zp1@;@i|DrdX@A@Uqp|j319lB}gyi9V*{KjMPvFfd0Xa~i3GkFUpe2Nqi&*t5pmkPF z5%{W!+3zCONQM0Y+@l*1=dBDW(=?6qPAgOZD{&DZ@4;D`Whe&SJjw6^%L$AVU%voPA5gP6w8vxf=mo)CPtWPK1Wy zkP5qKPqAm}rP&0j^i$GtjN=y+P07?J=iInXO zL$c5&lR%1aq~xGw;81|f@s6CI&G2?xYpdJMb3EJTU>L8*>2-@F(V=&NW zW3-@#=E*>VGq;QbG<1c510gSxnM~%)wNpP~SYFsCwuVwa+?l#w@g-j7`8kuh_wejG&>WbN^GdD&mUcXv1T{-jDQ_Ucsz|W3J%eAv7 zUio*a)_%DEcG1HNOEo$sR^gpTJT0T?$qVC{R`SSPLp^r&^O=$HylFDMeEof&fAXs< zooye~7dZBu;^x2pbVn4cSWI$li}GQK5L_Kipn zbp{91D*^TB%iEV~LglS5lzy1LSk*UFd24@B$s1Uc%d)iCMQ`gpUut&T$d(ZxN%2swiG*YNp{(1MF m{QbNoef)R=n>%@V-)J7T*jVI!`&-GA{nz=t9paq3ckDkK+0xqp diff --git a/assets/icons/Animations/Levelup2_128x64/frame_01.png b/assets/icons/Animations/Levelup2_128x64/frame_01.png index b53437265966c6367911b3c54d172284822e39c5..b9990b406a410d06549ee3d6b9062fd3fc56972e 100644 GIT binary patch delta 580 zcmV-K0=xa-4ABIT7=Hl(0002`twPcO00J0EL_t(|oYj)gOB7)k$3O2olTNxgL%ARY zHbKXN?Y2nZ*u5WzPF=LRbd)0c1^EgU*ujMUfw~7>h0q-X&wA+)iH@6)w3LGeyE^MU z9cE`||ApS$^YDE?&-eR2FZ}n%^cH<~PoY862JnlH#Z1^0>3O;pSoa@UU28?%K#&3{Uyrn+AIU~94|n}s*eNw=EP$bD#Hk*Gz<1l_Sm@d^+` zU8t9gyOMk%rn-&>x1RChxsQ`EvH>f6Mo z3R*d4d+){KSbtc}eWSkc%e=^SrShf zHsblAJlxkqH4+(jz}Ft2&(Ag`xVydhXE(MhfL$Ngt%d$Qc}qkH*aUs0`wV^f-EuO9 zaOm5pXgFV#^e1RAjTV)xG4sk%2FmMn-s9P4ln;%Nzkj(8o2yXH8F&YpQD_9TeL&N` zqyWmn2wCH3P#K`%`A!IE|L6n(a4N2P9q4xgAhxDEtEsr-A|gw!0l+SmvhTIOa3>R- zJ~vtu5!tF496+C$-T)xE(x)9jtEvS+*?woofL4!}GuX##ud}gp7XdhVtD1$|y`1gP zQc)*de?7;K81R5Wk(!9ej2ycrv)(;#0PF|dI=wdxXjLfMHx1|&lh?`Wl!1TH8^C(Q ST1f!_0000dr%W+5I;yntOYgyG!7bD-jbCAVLr!BdJp4%iRS|NG>D?iBKvc z(~_a%V{|I@NvE~GT5DT;*HK5OVzo-^qoPGeDivxi{-KtNN-sdHe>mRU-G1NR{&s)6 z-|qQxveP5O;=&*ZiZo{Eb46JzK664P;=3z!l}Qv61%pM%<86WmxL8Qb@KzQ!+Ced! z%K~O;`587Df+Y2v*&SrpCNWx#JE^V*#v8iJBjyiP!uvI1;ni#dk|={<4`fjLHl zRIs~I$gNR>b498F^z*+$S zR+LV}ag<<{GzzRX1!`4cG*B^sR*Yjn5;;Go$+Y)*_lj7@qamP&Q8K;T_wo-YeDLQV-U@a_`c2@?t#1}Efm4uISK5$a zJo7^FhWb?0h)FmDTqq1@ZHY9NgtDwsjnbqNN39BsKy82|6$%VjiNO%LNKx+Zn-}^h zpc0$YzkEIz;^z5iu?}&bT;kv)|AvH$Ll=^hWj2U%U|?Wd`_>K!3NAA0wPx?NzbrwH zdMu)GV4%l1vZZo^E;am@X;jZC++Ke1YW9*xU-30}7u|gPb$GA-#KxcNo(Az<(${A6 zY5u-@*_}|_oKg68ea*@Kbkp%?pQL>8;MuCCw)C*-+mc4fI4CUYhn8c@cEqjx@_O%f z-{P&+T@C%0W`;gel|OlUJ(sAPvSi)l+Q{pQO}AHf^vOmxwǘR?xI&JHpJ@9)bR zC=9#b5S$>1$?R%X=%k>wXJt=jYkl?VwkK;%_Lj%*_wJmIKpuBz%)`}37M3>WpMKW3 zsKJ#zcJ0%sv{6N1f8>X4%+c3tyDh)3*sS}!#H5}enc!O^jZsw2Y8u(rQ1h^`A$&tH zyuR?8>IMJqoiYZRcIE7~Q_Yd(HMNp4r%uO572Ut1?eJ}hZPe~Q+jLRelsVgdBP0A! zUYXB__pV8~75(eCmn0=Eb2{IA??=)jyL&@=W=sEgZ{|R^_fY)USX^ECaQle0Ymy3z zL+cis{#g-UP_-Od-bXWy#^h}=Co8dp`jBgv57{c3w@Z&k6yz^B{6_fqCmv6#A+6!_mmw`DBJSs`kGG6H@+k;izOVnn=yUTI-J4#wJL2FU z+`^Ufd{gG7H-$xcQ|AU@S9}|ZS(|rw>hQ^%Vx#wT9{4Fex;ASjhkSf~mq(7hHKI9l z-?_-RgWZ2(Nu#0jDLc0AEr-?xO)}rQy7QwFyr6zb0v#RO!cpxvgW5Fh4+y4pOvrbW z#&>r{g`XS;6;01SEa^C{gBF@&A*fmkUC895(u2S&; diff --git a/assets/icons/Animations/Levelup2_128x64/frame_02.png b/assets/icons/Animations/Levelup2_128x64/frame_02.png index 9623af7d87422a4d538f5b2359bf5a59d7651444..a57641e449d81717dbdd312379154d3378fab341 100644 GIT binary patch delta 740 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 JPDHLkV1kR9zxDtC literal 1860 zcmaJ?dsNeA6b}!fGFuM<^D&hy?1-RgleSn=Ezg#RPkyXXB^Jy(>#u*9-Bxwx=hU@VpDwe{@ ztn~BL900Iet&59igl`?G#Wl%Npe(k=bk(nk7P-NfMzLhKUfdNGygq3)qxpU~vm z(HU7CZ2+wvaSffpDj<&RP!@WlTK(Fw!8BYeu4*C+ZWN(HM5NbSQ+s7?Vq>ZQX}s0i z6qjYBM6r~K&R_`cNVFa!V6J@c4rDdt*vO+89d|Bxnvy0m^pt@OS1KUxi;&cja$lU% z;5e><2_F=N#gvqQagA02YkUy`_a$*cBJ&;b^ENz&A;DrSaF$FQ;)|lHU`!RHRHlSmNMmkS1o zIEo@`-@MUBBPy;rt;^Sg!EIiT7G>b(iQxuE;8cBy8#;&R$T$@z2L}gtUn}k4CR7=& z42-i}Ke4zl^G*P7%fR4X^N|X@AU$$(#h(c&o|!fuPC#u2ru?%!r+%4ZS9)&qJ#pvr z9Cvs4Nv1hhF?lkwuw!uFfG2xg zfNu-i2BI7~YiO^=bEL7+FV;nKFYkN%Nu-^mW_JFA9X}Db1DbXp>+j*s(I+rq;H{Kj zm&LqnsqQ}_0Jk?R?zw2Utl^SoZ*|t}>VwUdzL%foN8E|3?_Oz0xK=wo^3t7r{`i#0 z%6cF`2FvT|-W0QdDY12bQOq+|_m-S58HT zjcfVK*fK~%o$heUZ|tW}#x-lVZ4=x0wBB7+F%GIR;1}iOl*Z1{ zrzTbftP*4u7OX9MmiWsAuPwdD4o3uO2MG5bMWQj|OjB{CYqS5JnPa;;6O9oabN4bo ztVr^Q5|OX(e>KLQT(Vp}wLZ7^R7yrzz7L#Gm7V@iS;CAPY3Zh*`$vSuusX-r6pg8%GDlOjhBMz^Pr@^+i*e0k3ahuMO=eYdYf1e6o!gqF+vAH7a@ zfApdXy1HIol2eq8j@E3sg$$4jAR|S>JfUZ@jHO{iE%9Wa~likJ*BK z#akCWJg!S^(#KZa;OCS(b*07c3$*XaYRLE2NJ2*+dOYp!0{2^ve+S&W(vrO-H*vaX~ZIv3mb)MRRIZ~Bhr6{U7&e&{z}CY8mwwLPqBY0m?`m~1H@ z)8$v%+g;%BU2EZu*$*cEt}alwp>3y}-fz!}uh3yB9d5mAv5PKe4-2mBa&+Qf2=XLu z!l@ylE)mx^ZNF#RoK$?j&YxcPbmWTB(s@sU?1&2>R n9JgUVP!$!~=cxWGG|vXOdeS+u=;;Qj^}iObnx{Mvl$ie?YfjKf diff --git a/assets/icons/Animations/Levelup2_128x64/frame_04.png b/assets/icons/Animations/Levelup2_128x64/frame_04.png index 677a3367e8d4ec943c88097d48abf95fcd29510f..4b7367a37f186dd6158e776f761ed8b17c87822f 100644 GIT binary patch delta 725 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 diff --git a/assets/icons/Animations/Levelup2_128x64/frame_05.png b/assets/icons/Animations/Levelup2_128x64/frame_05.png index fb58fed1e0fbbe7bed41ff7ab0e676ae7067edaa..a033448f7776a23778654b4598a2591cb3839cf8 100644 GIT binary patch delta 729 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 diff --git a/assets/icons/Animations/Levelup2_128x64/frame_07.png b/assets/icons/Animations/Levelup2_128x64/frame_07.png index 4f3dfc8c4a875a8b9eda2c87337cb46d984a93b9..cd4324f0d1d55145cd36ebdb8696fae25e1c4b3f 100644 GIT binary patch delta 536 zcmV+z0_Xj<45b8+7=Hl(0002`twPcO00HbtL_t(|oYj&sZ_`i|g}-;>HZFw53{;V* zs3(*ODzS6|3w{8wu^_UMjUpJT4Dc#d6&nnUpq7~>Vqrouh@l(#2YnStc8Fa!X#l!2&f(o^)P;eTp3Yzc4=w|<@SXsx)p z3Bd!*?z+Zh#%IO2Q#*`Q@01y{IovBV&J5KxOLMp|)TP%_LKbYUKTZY%;r!iPo&ZWVd3D2q@F-RQ zlW=g$TBHXn01+8GY$7off5+#zGdqXZ+zHZRvBTPfE9VacC{E)2oY_kEkRx|;p`P8& a;SWo;s}U;;{|Q(C0000eNYou5Pt+eKt#b>N3r60Vv*|Q?vlVIXCj0oV5-3sV~uvKUhXcCf!xL9AOW=? z#j!Hh@3AOV)M~Y@1E{q_>lfN~uyrh08B1-8jOZ|m)~eY0Rp|>5>mQCccen5D?Qi$D z`*v@&H7hfENZb$rK(u*=F&oNK_@qUI!}qm_brvYbNG7{9M|4Vl#>)deCpvh<>}GQK zY@XqYmi)kL0SGU5+3b?tGK*$Kx10&u$OCQKL_IvvplXz0MrOAHcl=LQnW%zlNzM|LSaBJ z=cKcZ8U5klPKV}7l844|zuzzSE9Ig$2PZWe4NfRXn6F5Xm;fgDCWbs1c^~U_ zc_f!8AVH6eLoASVC?wmLh1+AXJaa7g`fCNNh6flAPRa?~?GC2aYweS=`TuFW(AsA! z^6+>z?-L8WEIbnD#1I&k@8yAlhL8 zU~Do;VhUcxVvNJ7#2jjZWz-zQDk*iy&x`Pe6eFcJ7*Z%jhMFWz28}7*XfmZJlQrok zMY^5{VabaO%(G(jbP0cCDE5FdJu(DP9T%# zxdcx1`;vlZ)R(f6_qqysF2gIjk=`QHt``t+vMLot@hXg=92BNv8JIl9DKW;$kQ#;B zNsuZh+K=a+D_&opLJds96XHS>B=1aSi4=_IRT_+?R3zq55(>=8P?SXxtnYKZb62{rk^X?YV!p^-x&gm!oa>Yy8WPJy1M398q^5547C4 z(=`pGR&3LMcXjcZs!O%&TUU0T9UD9OwB@P3et@<7$a@poKcu7XkC(Omybc7eJ={95 zeVAT`oY3Wg%ij#!8CQz7e+E?1k2v+d-@09!H^lt)TH2jsceBLCC1C47eZ~&3zv!t} z_&4Eh`Hhd>SvsNsSpR8Dyuz-ccFIjNa2a%(+3mscgKUD)(#(t zw8@O~>&LHHfBxd!(XU?lRI{OFd+U~6#H8u9DWd+|)cGYU`CDfXm+#1=%jz6d{CZe-=ON2ixnVKdliTcNt1Fg*&2?Ebx{I5+ zgpH|Do0=|$7h61qiQNx3j(i0l9JO7py?yRc`IK?OnrzMDL2(Y~0!7l1CXt2ypeH8>Q% zb;N+`8eso=**r(niYY6c;q3Ck&G#}t!8=PTXR2$!mp9!Qduq?dd+#O#l~Z%5`#E*!qQWH533d`rguo=FX$ X{(3~&sLLIZ!9Tg#lx3_*UtIPdOIt_2 diff --git a/assets/icons/Animations/Levelup2_128x64/frame_08.png b/assets/icons/Animations/Levelup2_128x64/frame_08.png index 3a5a28805a856668c4d05c0824cb8253f9dcc732..fea362808502f86392df0d3cc21f0782f4c5bf73 100644 GIT binary patch delta 534 zcmV+x0_pv}45I{)7=Hl(0002`twPcO00HVrL_t(|oXwHDZWBQihQA%pI=19wZH2-O zWGUzgZhl+rWSR{CT1N{p9b@8~*`%+glDb;B362UVq3m+=1*4vL`u$eSp&4 z7c~^H2A4xX#Wvljip~GVQZwX2KyuqP6xgQl#TJ1132+nuVzosnM1FZyU zJ>DKux^sThfDchPD`fh7-N2Zo%0 z0!y_J+bZycg@3S-1=gs80-;C0VPMF~bVmXFuJ2^7!c~Sn1)i>qR^WFNr2%>1$4Q213))tp{c=cTGRpt zAO`YLv?nq>1(Uj6Pa#(bLvYY+rH!IgJR#QX9mGFGBo=xpsPkziql?ji5{sn97*By; YgoU!1Q4c#vrvLx|07*qoM6N<$f-*Gdr~m)} literal 1598 zcmaJ>eNYou5Wghyr80hi)uN+k)Pm?GcbC8=R|142NRZG>Oe<&|xm;c(1G$U2qlst{ zg&DPek2;Oj7O=G++G*`bty2`y>Qt~++WJMO&QPpcuo}l1Ypr1V0>t`<?RQM*LO_6fcXW5^(|V68(%1AbKb70I1o+ zECV*cI9Duh2U!Rrt9RQ=#1cyp&GH@v6R}YQJYI-KkgS}5mtiY_h&sSBH>Z<_T29DO zw^Juym|?*!UIQq17gYPeg6d*BTV26wo${P)G%G+u2Oc0YXuwm+33NawAM{JZbwsU{ zqk|@5g-$+1s>EVN4ZIJal!Cxm9LG^gs{l@hbf{bmI~OH!l28)xrZ9q{Nfk|K(cw!D z1NxjU+Gflj4hMHSdATThX{FNd_bdD=1@Bv?B(z$s5+{`;i9riYSiy-*0ON!iQ4dBS zus*j}bn_e<@yIy%Dp4ngWQVfwcrBKvjyYktR3S8;&L{b~H7DOBPpT={o z1^WswP}+dNSNT|YB(51zFf8AT14RrW8~Qb$8=ebOY2?`|58yoD8d?G*Lg#!y7VMjOFe&WpTI&U;Z(rNGg&g>KHt z`-Rz&Ga5?S2z>6hfHU96d(gom)9&XGaItDNMFBO&P!0-HvkXk0a;h-K#SmIjZJp~YUy*edrd-mqm19gXFNgFzmz6J_Ojw54`LgeQ8`Hz=h&riUQ zeIhwqg&da#&Zi~VGJlX*XT9H*b9};YNgd5E)&668*zwGD!Iw&Nb^`))|R<#+{L8v+j=E&C@}2K>3MYP zQJci7HLb)h)i>V%>Q4XeCl>w8&D}+&ZVp*J>9$aIPMkaK?O+EV)5%;v7y4=4f|^g0 zuYNwpAC?@P+AAFEq4q78xgNA1UN;J>QS@Gz)7Dwv)W7P~rh6y%CVaTqJ1w`!8v8ZU zxW#!kRO%8(m#yUN-8H3gmGa15eNuDEJ;zw{z^vL*;@!H=V*U13t)x^_c(eaaF)>%S z>vYqP`&xy$dt$8N^u577^I~_n3L6H@PwofvTf(UldZS7gKDvW{W&J$i@ZVL3T1QMm YrcO_Iys{zVX5^1AGk|J(*OVf diff --git a/assets/icons/Animations/Levelup2_128x64/frame_09.png b/assets/icons/Animations/Levelup2_128x64/frame_09.png index 76267a2a8d6689a04241f432e55501ae91231b2d..fd4a3de1d47408f91a3a3a692072e3b597f13bd6 100644 GIT binary patch delta 560 zcmV-00?+-#47~)97=Hl(0002`twPcO00IO_L_t(|oZXVKYZFl%$3O4gnZ|Ny&Pl~U zPE_b*gNRhndV*s?N5{H32s()%CJ(YWbZEgvs8~Uq3l2I+d!lFu2RAz?rnI1xNRBiZ zlX&-YxOh4HC-|G*`@Z-6y$|2tga5Ab=}PZC(g3wED<~{gI)9T2HiD8*Co(3*VOhHW zPY;K!0KmEVyn+U%#aso@kx6b`6V9b1n(-$A0+B!hko`soBUE-rkxM{{wf zT9M3OFzMtbyQq6_UaQoy;f2cf!v+*ZV!(Z|CSr=qP=5i1CbWa$hbW6g26!bRA|5;z z5nqGl1JQB@Yys%{!24E`$8q2xKqp*81N$L*06-%^1D4O*q(RU~GQEPA2)>sHlN_o5 z;Q4=3A2R@sYtXRGOZWwF_5f(;lP!(fB!m(Wg7~0n)vqGkfDa1LvbrX+19+g(KzV2v ykvrz^e8$1W?&&SlDq8J!(jv=B}X=z#+_E6{MjUE<;O0RuAZR}a=9 zwF-fUO@v|tGD0ffk^`GK9}AO89Az*JgGrr|wbO)6?Vya^sAMeZ2xZLP!R+QEKt7GBhUfV!^ed^ zP%O{*TwcM&dEk&o+QzLB3Wo?u9O)IA)ET^#~c10RbmUyUVWE z(yWc9X&cHU;y6mM8V03p4mE1iVhpXd(~O$bhW$JaZ%U#_t;u92i8L*an@u`%DrGh& zsS|anW+K&yg|QhPUZ6b;8;tJI2etFBv}nglQt67Ff>S>w5w6tLE}0? z>%ef00~y8JA1U5Qp8^d?!W-tI$8gq>$Y4n*%W8BeLuzo;rp5@=L6f9fjp14l3{e4! zs!-oN(nnzxXwJ~`;b4Hx!_i_rV4i$naBABQE(Svvk&~5c26AXNb1T^#gXkl)z)r?=GDGjbhag<;X+I^Ym6=HYV95f`oAcqZx2a(kL`jA zr>s0$L{0pyV0JGRm@8{^D*hcDh-o7WYI0u`+Yr<;XkD>Bc%qXNp|hDh*D`Ll^weakq7Hv%jfw#W(x{ z=>21dVzb(Jb&K-P`lF*|_1(Sw2F1rMeMe`;O7=9r1CxGOXl`#sJ>e>%0zNo z{oWJK{^YpC8Xi()+wY(6oPTMVVdBL7FY3A`96tB%M(4hThr65ka}VURX5_fG22Zb! zcq^M47(6xZcJrzFd!+pM4pEviX5EQh*}FXl4(^5Isfc=M7VK`2DB^yND1>?ggrqn2 zLQJ|$tT-#tMy-|?>SV$AowIgI^S@8AXPU*T`EN9Lbx!TG47NX={%ZU{f_Tqb{pHHo z*@Xqy$CN3mFIgKZtNdrl?MA6~-iAGQ?Z}O496dg+|aOkG? j&5o)3_*?4sMo0#=U6ZG6`PBUh=qxD1oJ|E&3oHKv!xl}j diff --git a/assets/icons/Animations/Levelup2_128x64/frame_10.png b/assets/icons/Animations/Levelup2_128x64/frame_10.png index bda1bf44ce0a0cab9a03d15fd284b709590f3b4d..fae53599787b66557f8f3b33f9ad92428d7f5b97 100644 GIT binary patch delta 563 zcmV-30?hr)48R1C7=Hl(0002`twPcO00IX|L_t(|oZZqfi=0&y#_`{K=gnr7+1(L@ z7_zVfT8Kq5sD*;YH@#rKKp=J&0j(4a$=;AAMT!J$gos;NFIc!m$c`wQLeMJOgq@Ip zvTWF4vzWN!yvJfDlbNsJsqT5W&wbAQbNK(){N$8iwQojf6o1Pv&Im>PzBBW{(YSGC z=0?-~4f8ZV{r0q%BGT#Ne~?72M#)UlM$;+v<$cm#{yA{{!-Z+0(a_T2vW zlQdXwrbqepH{q9&<@v*(-W|5u;BgPf|Nfv6vZY(C!NYa(iSwIVQA{yDadS25G!6M> z4rYWFf0fgg-Cc~BE)6yI=2qGGYkSZLK*mQuBJv%5)PlP!USBxuxN3{-Kf%4YYAte9-vT}r@q z07osJIOy08Whx#_J*u_UX%#K!sJ-lXRA;0Y?dWI~j}}`UmC`RjtbaJ}?0)C_z4v?9 zu5ss2jUV~qNCZLRozv_dI9J2ZqK<~+6?L5pPRWX+NGT9~N;xY5#LA0afI9u`V&DNR zU$N|KkcA-8D}}-$rN}jt;Y7cd4a;al{vbpnNLEfL$a1AXLA_wH5HMr6kF{Z_z?-qT z87|Tlw1E;~TBQUED)S4u%2Lk6V>#JqR)~QL{6JyRkbh}FWh1MvVxuL4wkfgx?=_ZBSZPJm7yCPnDJnD}sRV z09h=PIG7S&Y6J|!_iRI9LCA)gB?&Mu>{7ePmH9zHaoWuoywUOk&lp+YWm(pXa~Twc z>wtm7S+7rzdyOQ=8hMt})5eINr{PV8JcrSdLDG3NNl^}))#|Y4*^MTf&2BY19QFv- z8ITn=z=4Qu0ooqI8uFfrWo!~)6;Ub_#ifx#aF>XRD3^#qRHxUH=;XOVfEUZ&-y0-Xp(xG*FId>I^>i34CT;T&zCaIc=!;XamzW=P6tFwhtQDH7qjd7_RYN3b}< z%g2oYH;-Ej1Ykc&uyN|D@^`|f8{wW==z#OUz(Dh*Z9gMO)J&({S{Ul?Ez)f4BGoGg zsw$gzeSWkf(6}URzWLmo_{1b%5c!_D@$n%zjjp3!yE2Vq!)Av$d{+5rR!L=3i)*VDMSr|DmPI(qrLg% zbd@mTSlqeMhu^*06+@(@T$sIAq>$o6h4Jku-hL#%!+du?8SVZfHz_x!IFxHl**QD) z*8UXDnjVvFEPf(;!irny#qOiFo`Qs!-{=jea{qdC=h#V^+PKH|ilMG$>;t4_OUIp4 z3xrJvKDw@L>-?tmBEEAT61+5t-gh=H?ZbhBG) d`<>&pI=m5)bWZjP>yH&963)5S4_<9hOs!iI<>&pI=m5)b(dHL6nbwD9yPZ!4!j_b)k${QZ;XFmLn zjqNsD+YPq1J8W%_*aXBie!OR3*tC!PwU_7Q9H4U564!{5l*E!$tK_0oAjM#0U}UIk zV5)0q5@Kj%Wo%$&Y@uynU}a#izM}XGiiX_$l+3hBs0L%8o)7~QD^p9LQiz6svOM}g O4Gf;HelF{r5}E+GUQp8j diff --git a/assets/icons/Archive/back_10px.png b/assets/icons/Archive/back_10px.png index f9c615a99e69c0100b03a9ae7b2df903da4ecd66..b7ffd4efbdbec553767c6d955c6c3289747728a5 100644 GIT binary patch delta 77 zcmbQmm@q-oodF1zdVUfBQtF;Ajv*CulK<3Cc*)LuS(as~Ut6IC((38z=d#Wzp$Pyfj~$8t delta 136 zcmYe8#W+E-o|%DxVf&xhe?W?{ILO_JVcj{Imp~3nx}&cn1H;CC?mvmFKt5Z5Pl)UP z|Nnu^&_kE&fD~teM`SSr1Gg{;GcwGYBLNhY^>lFzk+_`9z{JPKCdtNT&DK_Bz})df e+M%P7kwL11DWYLp+bN(z22WQ%mvv4|2~7a^@FXn& diff --git a/assets/icons/Archive/badusb_10px.png b/assets/icons/Archive/badusb_10px.png index 037474aa3bc9c2e1aca79a68483e69980432bcf5..2b5a3bf97382a13e951505546ed51b9d66da0899 100644 GIT binary patch delta 78 zcmX@Wk}yHSgOLFUmU?~?08;9nE{-7;bCUnmPk5=we3+44&5=z_k8Rm<9v>c_p7rYt eJBXd6xINKS!UMvl!qLiD#K%R*5%=r#Gtx=Y8TZE6OVIIq|qj7bJe< zy5jO1=Yqom&kURC)I4#RSS)m~(!s1~YQ$5-5mnPEU&y$ua^B*sm20eZPyWJCPG4E( zI?WLzu!to{e-NRdh7!uCB1)@HiiH&I$36VRj$a~|Laq`RITlcX2HEk0|H1EWt^DMK zn-q!zT`#u%F$x5Cfo9#dzmILZc>?&Kfh)c3uQY&}PtxmcEph}5Yy%h9ZB5w&E_Z;T zCqp)6NAlAY@_FF>jJ_!g4Bi60Yi@6?eVjf3Y3eF@e*+vG0%HZrUiWx+PiJrco@w>> z11Jx2iD%?txBvhE24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2j&6<4mK2EGyVzy002EnL_t&-(~VF;3IH$&O6mV!cBetK8hQysQ-UOgfvg0; zBe-|?EECl|C-=m;MRn8Ku~%W3;1<~@+&|jU2gXe!0|UhaI{*Lx07*qoM6N<$f*l_4 AO8@`> diff --git a/assets/icons/Archive/dir_10px.png b/assets/icons/Archive/dir_10px.png index a4cdf453e32fc40a206e4225fcf477a64a1f6f99..1b64022c2ca090cf0c85d64a90414bd68c0a8a6c 100644 GIT binary patch delta 72 zcmdna6g5G@iID*amU?~?08)ycE{-7;bCUnmPv~rIT-ntK1RLi~>}+K0lHfP^XV1al Wvzpc4VA4$wkS0%8KbLh*2~7ZTP#CKK literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2hGm!icqpk;}SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YhSC&cyte;|tiNFKbc z^$EygED7=pW^j0RBMrn!@^*J&=wOxg0CLz%Jbhi+pR)4v$gv!Fu~!r*B=T3-0%kIwEBzxs9jH>Z#5JNMC9x#cD!C{XNHG{0 z7#ZpsnCcpuh8P-I8ChDHnra&uSQ!}1Hm=h^(U6;;l9^VCslmhoqQPBw`6-|V22WQ% Jmvv4FO#mLQPFnx~ diff --git a/assets/icons/Archive/ibutt_10px.png b/assets/icons/Archive/ibutt_10px.png index 2fdaf123a657c00c9c84632ca3c151674e451ae1..f73af065f427ec8fde39168d406f997665b8a842 100644 GIT binary patch delta 66 zcmdnMlrTZXM%~lJF{ENn@{i*Oer%ulQl9zpeCD27H=p;CGtL<>&pI=m5)bWC*+s&X`qmbr;B3<$Ms~3f`-KX%+5*7 zhxan`%;z`w!#>%c-@wM^z<~n{3>VXQv+hhNs0FH5Epd$~Nl7e8wMs5Z1yT$~21bUu z2Bx}(CLxAKR>lTa#unNJ237_J>nn=CplHa=PsvQHglaGb>IpG01*)?$HiBr_e$xf$ PHwFezS3j3^P6` VROYU>p1}7YEuOA^F6*2UngG(26<`1W literal 3635 zcmaJ@c|4Te+rMpvB3VN+jd&`{EcVIRmr-MBY@-rmW-!dw%wR^5l2Wo|%bHM9Lz^Pm zDnhm>63UV#p&=nzddKs7dVcR8Z}0ubIoCP&_xruBbDisaKG#KOM>`2|C2;@%BEIG^o4aN2?EQ4| z833%t6>XC8%$K?X;Lb@&n>R$qh`Y8WILcjki4a z7ij>1Ss@NPf_2YqRp2fS5CrJmI(wuWhkr#?I%{|Upd?@jEIqMBAQ1yJ>9{t@0!=%B zdoB+N;y?-jkU6I;!N6?^VEVhgsR+^D*2`FtS<%2#LogZZr1*A~P(tS^lXQ|1cCWO%KTLD06 zx%1h&ky+xz_~`Js-vpWWy&-=+XqE;x-90zBUUgYe7?5)8;PrWrjr9o88wKtK*9H|I z1^V29fWc)i-F~sWBjT^amSZ_atLD3MuRAxHsO%KqvSmiy_j)z-Q>^JP-C^2LY{Vk} z?|OgOEN~*zJfozpAZqOdjv7*miJxc@wuDiaCe+p&qff8J@9P}VyMIhe?$R9gVudr< zp^@_hlVrWSIdw#O@-%!-HEm5SIaC7Ro_DHqe7yNl3%M@htAJpvB(^IAFprqmzO1w* z36S#FgL9SuAh~uq!CX@SXiG2r1OQc^cO1KwqJVxW3INu5XZGK-*u3?bEVoWF`6ta02i^Ph?RO(6KC)k{@&u#__o4hy{%3^spqOI7L8%RFW$OK+Q3WLkbur&8H2 zWaQ)gqRvB~gIPfMrFeW~Crr}s@_XE|%NJ~XE@G858s+h0Sbg^deY^_RFhowdE*HlW z-6I$qDKjm4{G8Nt^4Y{hJ1iP&bxVC(txUR7)I%)l9PIgD;N)9QW$Izl%k^wu#Qj99 zEmz~~?p?cc)sO!rDdU}t+9TO~Wz+; zK8WOk(v!*)wA;Lqf;5|bIfzJauyI2#8R+Wr9tK4%IM1e;Epe*Z}3x`NwI}j3zCx`I_(xH z-wPHLzVLc@ovMaVJyC;1MKa6?Kiis!{~UCcRM9zmZur*rmVnBn`hbE?`+~nJG`?Q& z|D?}WF!kfocKUMlJ`x9lOmMy=czO)+Vh1ZZEfaI^MWD zJ17@d^S-KoH7@#wO?Jb_XYQNT>GA5Q(9A$9uKm! zvPag|EJRkz<69+JCG{a$ltI}M*@S&v`xacNeX!}(Y4PdI=}j}ni?~JgMap7_O6yK( zm7W8v1E(0Q;MNc_y=tm(Snow~eesJ)4}WF<>&%>aeTAEc5?iFxL(&yoC`FfwsMo?; zQpc3OR(3slvrv%rG;5&bJ>~6(R%Ao?ofQY2Eahge7f7DP_t_=v$cffZIYn7T&*u{- zAjdFA;WQ|%x zPeew<=GEMl13z2V5`NSUbH2&XIg0oQJQElbs6L}~=AlrKkg9No@Quy-B5@*5H$k?V z%2{p|lkik!B-82?z9}!`bqD;lGCSp7iRQ>1QT_>S)j;p+*&ctsLv&Cof_8HmJ=ywL zG-k+-98;l6Qp`|T4wv1xAAVcs%i%H?)(O^{@g$^ zhK!%is)($(U2%qe;fKv!x-?5>kJ!w`(fZzcmr0yzWU;xSQOH*Q#Ip7qd6Elz1}p_YC>@&qr3OC`AR0@J&Xx}V;!km}8)b8nUY zxMy22KH}l%-F<3-L+R`Lc(DA{%oJ*>aEi)Z@~pjkusYD9`}O%*i4x_xxG`mK%E6DU z>tTTl@oi;ouiAw4ar!eyTOV`#zg;&dSPaWK?bYJGR&uAj=DkK=Pwj`$lk<{MDsl%t z@=~U&9%-^Yf~sx87pPrd&wfZy@>Q;^9gp}>VHfJukehJw#>vf#HoU1o7L7b`x3>0y z7zJYxw+n@!k7Y&D`m$y+Lm$zP?3a9QG4|}Q!JDT}escbNz5T_&i?+dx)8z}IQz(vR z7os+pt6f0JLtd}ueZE|fqjFruuBQA~1P}HJAKa*);E|h`vlltHJbE_yQxTykH^7)tCFH28DoZF;e)I_&-5m9h^Z{GzJl5 ztOL`=L!mH`A>Yz7fEyVb8yXsFf#6WME(B@-f$M9-brJf82$&w|pAXFU$RPM3FxIyJ z_~WmT-~bkjj(|WyLql~!b#-VAe+bOj*cbwZL*Q_2K0=$xp|WsnZ7Ngkw}Lg1iD!`L zEE0_h+EB##(t=q?FhAP=9D_ptSC-2BCsq8ULD)Dt1f~PsIM#2VgTwz1rBMDwGg%no zf8+f>g_*7#IuU{)GHJmKJpc0i)HYnv5mpQ$jzwd*(rD!0nRE`Iv1rTy8XW}J*MWof zZX^x{g+X;FI&fWmLl9J#0E6no_JKfq9dLLObpyQbZ#4%8gguqX!cp-=dut?^udhQQ z5fD~JmKMgAP+dc~fj$goV`Bk_8(7*{>f68#taOcF(BE8Z8a|jpq_Tc<3IFBl{gJy- zEEGE5vo(=H3Lz3~88iy$?}Q*oe~tzAN4Ys37v zu=$IBp9Yc2e-8|P;iJQK`8_wV$rOP{m<1M_=T5C8xG diff --git a/assets/icons/Archive/keyboard_10px.png b/assets/icons/Archive/keyboard_10px.png index 74a10e6db2e784486a6781c0db8346373b9c7409..dc3e3cee21d3da29158eb77e94720c4d22f9fb9b 100644 GIT binary patch delta 77 zcmbQtm@q-oodF1zdVUfBQtF;Ajv*CulK<3CXl!iUIB()hDdx!<%$Kv-)O6XFHS+*L c&wqXYz$e7@|Ns9$X6T{IbwG-zopr05+&7&;S4c diff --git a/assets/icons/Archive/loading_10px.png b/assets/icons/Archive/loading_10px.png index 4f626b3d58c1800c375ebbfd358db6c72374dbcf..a6065b6c0b07f5f7ec2e6af07ca6bc7305718bf4 100644 GIT binary patch delta 77 zcmeyX7(YS6osj_umU?~?08(n6E{-7;bCNSG4x}7E@TH~k97Szr>Co*%Q~loCIC6K97g~E literal 4349 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 delta 123 zcmYf3W1Jva%FMvPu>DW$KOn^x;1lBdzYEA>*!6Xn0g&P>@Q5sCVBi)8VMc~ob0mO* z>?NMQuI$fP#RZrYWM&2j1BIkLT^vI=t|up?CnV%2BqTO0l45JKPY5~4z`~&Qn7RGx SAFne&WelFKelF{r5}E+bFd_y3 diff --git a/assets/icons/Archive/sub1_10px.png b/assets/icons/Archive/sub1_10px.png index 5a25fdf4ef1c6cf53634aa74675001a3e8c85b7b..70940ad77935c769ca4df4b73621723e6b812316 100644 GIT binary patch delta 65 zcmZ3@6hA@5TFukNF{ENn@{RWgW@w-JGO_U`H?uG^^JG2d$tM|)oll=BAu&Tjf+1%M VTbRvDTP6k|@O1TaS?83{1OP@`7iRzf literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2xkYHHq`AGmsv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R1i<>&pI=m5)cB{fFDGZlI8yr;B3<$MxhJ?+;A4eL&#) z0Ra}bue?07WhLz78x$BO|L3mq-MMxdP^D^#YeY#(Vo9o1a#1RfVlXl=GSoFN)ipE; zF*LF=Hn1|b&^9ozGB8+QQTzo(LvDUbW?CgwgE3G~h=Hk=Gf#{`fVe+UKu0050L&%FQu0fcEoLr_UWLm+T+Z)Rz1WdHyuk$sUpNW(xJ z#b48EMXC;V5OK&*oh%d;anvdlp+cw?T6HkF^b49aBrPtEf@{ISkHxBki?gl{u7V)= z0pjT7r060g{x2!Ci1FaKAMfrx?%n}Hqs%lb5Cb&5YNir#e=(C?6@#x35I{d-=$4sf z%t=xbp5yBtKEB>Xd6xINKS!UMvl!qLiD#K%R*5%=r#Gtx=Y8TZE6OVIIq|qj7bJe< zy5jO1=Yqom&kURC)I4#RSS)m~(!s1~YQ$5-5mnPEU&y$ua^B*sm20eZPyWJCPG4E( zI?WLzu!to{e-NRdh7!uCB1)@HiiH&I$36VRj$a~|Laq`RITlcX2HEk0|H1EWt^DMK zn-q!zT`#u%F$x5Cfo9#dzmILZc>?&Kfh)c3uQY&}PtxmcEph}5Yy%h9ZB5w&E_Z;T zCqp)6NAlAY@_FF>jJ_!g4Bi60Yi@6?eVjf3Y3eF@e*+vG0%HZrUiWx+PiJrco@w>> z11Jx2iD%?txBvhE24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2j&6<4+Si}m`RfW002ZuL_t&-(~Xe14FE6*1MP_YSH2VxC=CcVG=4FF76?hQ zJ(2+VGu_$Lww$bV?L-xwgs#TvI;F4-w$bY`0j%B=Q{0aW)?_jMUQ$)>00000NkvXX Hu0mjfRdn(| diff --git a/assets/icons/Archive/unknown_10px.png b/assets/icons/Archive/unknown_10px.png index 18d31c67cafd7cb56aed8598ac6b2ed20424a029..2d2668e8531646523b08a5014804bf8c75081902 100644 GIT binary patch delta 77 zcmdnN6hA@2osj_umU?~?08(n6E{-7;bCPQ+=D##$o-DvTS%&#?JlnE(9v>ba9~&N@ dc!?Pj5)4IiSf3e4KKl&P>FMg{vd$@?2>?=X7M=hA literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2hGm!icqpk;}SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YhSC&cyte;|tiNFKbc z^$EygED7=pW^j0RBMrn!@^*J&=wOxg0CLz%Jbhi+pR)3E$QubdY!n0v$$PpuhHzX@ zPT)yQNJvdhNJva!FlvZk>0n+kgYg_2gKP=oK5i+EYe1!{C9V-ADTyViR>?)FK#IZ0 zz{pV7z*N`JG{nHd%Gl7##6sJ^z{V!Z delta 138 zcma!_!#F{*o|%DxVf&xhe?W?{ILO_JVcj{Imp~3nx}&cn1H;CC?mvmFKt5Z5Pl)UP z|Nnu^&_kE&fD~teM`SSr1K(i~W;~w1A_XWY@9E+gB5^r+MSem?LBfxE2A6LZ24{*B hZt$luT>Q_>FfEhIUc2YQSD;b`Pgg$|mUT`EO#r1TEYAP{ diff --git a/assets/icons/BLE/BLE_HID/Ble_connected_15x15.png b/assets/icons/BLE/BLE_HID/Ble_connected_15x15.png index 64dab9b5307410bb10fd7a6634cc35ed88af4671..1301399da974836ee21daad8a7274102df8940e6 100644 GIT binary patch delta 93 zcmdlalRrTsoRI+tgx9Wk4y4RHT^vIy<|O|}JpQ4f|K&seV{UG0eat;;F8TZyneork v!05KoCNJZy8is!h5-d&}Q#pU|!(l!KyQ8D>*If=u#s^>bP0l+XkK$n+)4 literal 3634 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 literal 3609 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 diff --git a/assets/icons/BLE/BLE_HID/Circles_47x47.png b/assets/icons/BLE/BLE_HID/Circles_47x47.png index 6a16ebf7bbe999fa143c683bef713a6e2f466cbb..bf72412f5590fd172de7d5c67d4c6ac1591e20aa 100644 GIT binary patch delta 206 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 biU<_Yn+9Io=xs3K`2!qm58ISjpSt)z2v?8| diff --git a/assets/icons/BLE/BLE_HID/Left_mouse_icon_9x9.png b/assets/icons/BLE/BLE_HID/Left_mouse_icon_9x9.png index c533d85729f9b778cba33227141c90dea298f5e3..5bd2d395f5e86d799ef4746d0f1ed57853a2d93b 100644 GIT binary patch delta 74 zcmZ1`6Ei`=g^>XWPQ0?-3#61iT^vIy<|NzfnEz6Rnc19Km>GmF$FnUfVmnsbK4XR? XgMTV(R7i8+Wso*cS3j3^P6s`=Ym`zMxZ&^MzmGt7Rt~vKJ1Q z1Hpin=S1B>;G~d3#L&M|1&Cjf;M%pvu`sfzFj z1F4ToZvY@GL5`R0(ne5+WNAl-Q5;wDlq z3x?A-?;V&I@I5J(b$0cdPnneYQy^<*fUv~eu8n2(jmrN1smaMcyGFDJ={4cPCbj-l zEn(x#pJ66HR#!g07*~scpNOy)So>K2X4xTUU*}DcD_%pN;;nyFh;98)eg|%}^{OOl z%T74U1jJ#}t}nrJz_I9?TCWatZ;{7Gb=LV!M-72Tr%m}n6Lj-Wc=La=*N`T%YsXgs zV6lo(_g+(&Kiv27SSM#|!ED1i>i`h$V|z0I08V1nAo$niX3fF?fX#}~eq^DvT(?K3 zR&Zb4&Y?Q7AD%{6&}xnKXlb-4IeZ_>Q>*wAS~IHsk+QZY^u4*VL9MfIR3cLnQt$Rm z62+AIP7=&h~e|PN>q&#R!EIpQ>n8Nkh!J?YK@U~2HPhX+Q3|{ z;z4dU%8Mx04n*{EtLF)aTLAc_A5qoTuv-yj&Zzg|PcfDG#(S?=-4lCDX2a6r<+IY? zvYzZkT{p^}ep}=#H4tx#Y1XU#yhljC@r)j%sR8}?kd8>AciUrdv3OC_-bY7^`Kw}A zygMIr1Y{yCYekF%IA{=Qzl9Caf#}$0lMmXbX0U5O#8`y?igUdNI5FS;iTd+he>U#% zg2SSTHae;wWa4*2r9)#djmBy+u^6~U<&7P-k00Q>WxB1p{asXNbPCc9Z1$=qwhoZ} z%7hTNbU+7NA}2E@8z%K9l_pgdJw!9S%mW^*xsGePygqHGI3+!0FeOMyfm^uUPjea0 z&&KaEj6a4h$>zE|bdJv7ZE!XX(SBLp);_1?-tBjLeHDCHX%9cMpYIyJz27nUEup(@ z#`<&eXZ~f5xI~oP<>nZwregXYp*>VZ&Yp)U4!Mf&t|>O-^^9S&DbuM^sSG!wHdp(+ zT*7P7+jh6rZ!2j-@dbssg(HPxZcA=$`1pd8t`|zJ-1J>13Pj!~6}c5=9GP`ha-|j= z&W|pn<}>hS55n9xVg=nB92%T351g|epPHy{0*QGmmIvvm_(>E+osBSTRDaywfBu|y zRmz5P)iqRMK{f)TZ>LWvcUijSVnU}m2c6CH{L2Fz~Dc8WE5=J@h zSD2KXL@cr?axSu-tuZQ{%ge~Ev8-}mkC3!zw$nJSVNH$i*qJfy+V47?Cz>aZLm^j6 zA%%W9O4(Id&P)Hi`IO8TC&M!x7M|3%dt1+Mv^dNO;}k)CI;{%zh9(e7 zdLLEfa0*vR3ks&+Oj&m)Oeai?N8lswr`{OXR-YeYsz5~9rFm@&k?U9e#1O9mr++tALh9Be#b={ zZCuFBKN6}9gVkQ?=jcpTUePGHQSBh%Fr1FelutVcqQgRzYnoX&5F5+PDNgr9qOGs;Y5VGk3J=RkIGOom5aSvDm$o< zEO)U_b0}y^DVp*6W$MtaCj~`~mE=yJZl9S?Bf6O$l1YWhpOPj0CHe=RNQ@qRGPm;0 zauAx_t~pqBnTx5s|I*}HH6^dLqy4ZM{sDd&{~d2M-#z@4)Vt>2HLny}{mtNyo8%lTGBfGM2RCkV6K_Jn}0({Rg&9V`MyWF8-;g? z|8Q{DTC(}K7n>Oi99;<`3Af+xG>xk=vB8rwt0JST`z4SA=dOnqj|si|?VK`I8G0I> zwwPv>?wYpl;pOq%>5XaEhc6=`Kdc9Tle%MI;vQ_bgm0w{%v^exNL}o_o^dkea8VKC3fInZ_N%%QeAY<+nccWFk<*HA^9k)mN)4qw>RHERBth zwyJ)P#(YV&Q}wB3^Er!t%y4v%naAc(-@?$v)3uzerLH0CRl&&1otp_O@lu$b@u~4` zQ4&$JnTJdfh;cL4#>|gAOeeWhJyT)x-ey~=f;=>At!K8kqbsE=J9#lV@g@Cy&c>J8 zS;dEgP4!LtU$h44!%i+AU7xGt3~`hf?vF}2O`Zo`)ZFs@^YM!7+r0He#l*xd0sfSw z9}9-JF7f^=71@?VwkyMj%^|TUfCZW1MFH8;NmPmpg+vYxXr-6{0KX;;Ph=Bu4oGhX z9YWgnfdtW+JTw59m<2IO-hLD|$csXy`J=!KRWHFH8W{y97~=GBObo@BW)s4qxQ005 zy+i!G5oEBLDaa%U$s?ds*d$O8{fvJgG6)6!ixsqKLR7APj>= z0U1MJy54$vdLUy2ghD34z4U!Z-Z~(-9vlXR@or;Xm@yKrkAxvWe_vo;Ko;2t>4LTT zI~?zX0{gPrOe7S_;cy@veF%d^g~AXB1XK?Wg~N4u9=d_S{%lf^u79BFPX;U{(3?eL zvS|!|&^9BC+f`KWG(Vj?jt3W?2N;TeoGKMQ%pm%(NP`ZAaxxIP31 z(!`OxY5v<5t-l~R9MaZ5kWKRUrr2UpU>*sCMk6CJ2$%uJ=#V~4&&mJ>v&33pF^AAt zI2vON*M}kC#y_!GhWA-I#h?8XOa3p`;Fs9#fuJ*ak+BpO?Hq+{#bVGwe`SrN{aOp` zmwbO?$-mYD|0Nd669e7u?f>cZPZMu|wzvNbFYoZr_*49OGtc4;_gwK*74O3kIpTn~ zjj{=6BfNKE{3D{aXVoTAUm;Mb1;5j7# diff --git a/assets/icons/BLE/BLE_HID/Ok_btn_9x9.png b/assets/icons/BLE/BLE_HID/Ok_btn_9x9.png index 9a1539da2049f12f7b25f96b11a9c40cd8227302..ceff4e8a880932f33253e78b69656ab440ff3e13 100644 GIT binary patch delta 74 zcmbO#6Ei`=g^>XWPQ0?-3#61iT^vIy<|NzfnEz6r+1ZHsvMrk$8yKmwP0NT>OJidQ W-_DY|k%50TNSmjtpUXO@geCy|UlbPr literal 3605 zcmaJ@c{r5q+kR|?vSeS9G2*Q(Gqz$f_GQ#q8r!JE7=ytqjlqnNNGaK}Wlbolp-q`& zs|bxHiiEP0&{#s&zVZIv-rx7f*Y_O9^W67+-RF5;*L_{ra~$^-2RmyaK{-JH0EBE1 z7AVdru>JD$aK0bym%#uaXpT2Gcd#)x2azcxAABGV0BC)Aj-lw(6)B^^6`Y8RS?}DV z%)ko(See1!Eb3M$dL6)A6csaRjExg?k&xVzi*Rm;?iNJk#f=mkVEUR~jXN3dd|Lmz z;y}sMh%ol-?E1&`>dD;6jdps6NYoxN)s%@sf4~40YY6LAOtMEbwA4g#OCpANL823^ zSH66W05Hcxr$tg98gFntAOYL}xm$C;Skv&Ym?{TVR{)d(41vWacX1`7fM!jnW(lBK z26*WB#9I(Z1Ast!xEUC@Cj`v=urcBTdP`FWq=DYTy`}s>0vC{VzHdNRvxNFy}ir1|g=xDsrFP&l1P<-Sv zXLqYVYz{b^ZIV@1Ulg->7DEgvM*Min&Y8{8QW! z$_pA434?^wCTq$4%^>Zo8&|8XwbCv;KEd;WJJ{s;T}8R8Zwi7ssk$QWQ5l5+opKfX z;8D*COFEB#4W^*FIrRU%PDSc?B(}+9ZV?N9(yH>0uSnM?xg!>+>;e z{{7tXQQ|ZFXD*7q3XD!pwnih-=66+Qlqtl9;N-D|PHoI&B5d8>^V#i{mE>V0gQgu3+(DG%B z|8W!pl$lbQERt-0eZA%NSfvE4F>VAYP`DpeoF;Zm4`)2id;6xgSysWl6K$pWANcRZ z!ETRXKIU9G=@9lEB?<{ivj7!8FE9WN;qoo2Lr0#c@DmcF=JzU<73PmM3 zbe!-gs`c26Uc(AKz7%U!a0yZ5gsprdo1i51MjJPeHtV6d@Jy=*+_3dJ^>}p#8N#kPK_4t?hltq>u=?m+t z?em(Y%u3Bp_pyV?c_w-4c}p+?Y$aHr>TuPGs@SUj;Er!b@3GVLDS@T8OTts1JFS-p zKZ=&5zp;DRor*`Gy8MTeWdpVJv2(4-*slRM@XXG+i^F&Ku>7i08vKenZHoS4s(!!h zJE}*MHu7PR_IfdNzu*P}3^87K?f&A1;>NMsgKcR6**;aB74NC7tR(NB?{dHT-9QhXa*KoG!kGU1}$l2D>ypo)fSBuG$ zkTW4?+|I1m?6ZH8tD4^fB{cUpoEoZOo%4hl!EtNtQ#?j*jJR)x-Mn0TrxrX2uT_rh ziOh=Jxsktqbd9x{^s{c5z92Pk$LGoQl53o+=7QXXCp-Z>io998w|DCCCGfr20oiRN zX|`KH$W4)wN~)J$kYB~>4EU;NcS^qH&yzeUzXokpMegg_lX$6ve^4}%bY~Sg)%uJ- zZpb$p4x^GS5d{XJP=STbfpHV`58UBH& zKFg&BgS6bV+#-|^KBGeIBee2B zrM-`uTB^_(eS+{-KK1h3l`-Yjpv8X4z*uBwQ3a~pL0Ae2xvNGyC3A|#MARToe$W~8 z+4{DsyenENye9df1M}gNUM9_Leh6G=`9exL-cdSKQ_CGyEdZ3W5uoR!Lb^D)9!bd=7h@R=M%=|JqX9XP;Z6# zFD15Bw7qTP(ZlG?o@#x@=wG;XxM(>n@4P$9WwY#lW$h=`zMi_zq30HbV-zHheqpE0 zR6kXtxdzl&Ml2D#zDIvflJkb*e zIAI?GMjp?JBK76WW`{l{pFAY|%5?nYUxRnT&y6~Kz19AD;C0(z*7?dM{%HhVtqWEc z%+M$z6u@uQu)kg_%2PO_U|n1JE0V1>iVbekOLEOG$U6X^Umc519WC)L$t%`#Di0$ zY1|5H*440_`onhmXeayq`8EIg?x2r9KWe()q}QayqCMEC?c4meb4}#i`HHPaxO&3SPtSVKj@ND?Y+-@R`CDnf-d`T>vTn8RR<=@3 zNXk=Gloyh#S@3R89WHrXBHr;f(&ZO@I_Uo7;O5Bs@ecGx@7%7{_>Q`Adg&sCeZTYp ztVy{^vAUfOpTDzF*4`h%X0odWn`#uZ4s4igIV^UrVVg?c*{>K)hHq^^RxU2CM;WN> z;oK@^sg`J}BguyvilN{DQ*V+N4rD{X_~KAFj5qyk3(gP#cvSIDXe!zk3B!^InwV{j zCXGPmumQl(m`28618`K37tR+?goD{H>cAkpHyrG$XA89@o8$cOh%gGyG0e^h8y0{y z@CF+jfedLdjsO8i#eispKw=P#1_%GG3**eU%@8o?ZwNI24*pM2Xj=!6If;S;9nsX% zz(S!=&=CVoZ;TfP>*b{m(uQhlL7=)2EnN*L6sBVU)71t2^ME<-DBeCWl!etl&NwSL z*pEsj!yu5*&``}#9ZeF&7oufgU;u$?L$tLuI0%g(I+2Q@X%K^ye=Atvg0K`knTjV7 zLEDNLFH$fS4(5dVpED51|H=}B{>c+3V-OmK4AIhrZlCEl(AM_T0=zuK- zizjYd4*pHCwT0ObgQyrH7H4At2XjO;@px~TsgAA%R9|05PuEIcOUu&SOwUTs^00xK zshI`T;)sF%Z>|Li8%)3vslU12|K;lbk-Oav1Tx371&)Fb!FgLzNCeQ|r-tGG9E;W; z_5R^{|2Y=zKXM_QU?AJI{a>~IZQ?Z0_VnM@<@Wt~$(69B!!7?J=0 literal 3625 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 diff --git a/assets/icons/BLE/BLE_HID/Pressed_Button_13x13.png b/assets/icons/BLE/BLE_HID/Pressed_Button_13x13.png index 823926b842b8f9868fd70d6f1434dff071c04d5d..d0e2c3a3735944e80ec2300afd68f40aa5f90ce2 100644 GIT binary patch delta 71 zcmbOx6FEV`k&yuiq9)wD2&5D|T^vIy<|O|JI9TA&^zs0^8XM1r0|$>BIPgT_z=wrQ Y3=U`9wuDcQ1RO(?0Mk|NnE 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 Y;J1h6-qpw3w}P~Jy85}Sb4q9e01*-vP5=M^ literal 3622 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 diff --git a/assets/icons/BLE/BLE_HID/Voldwn_6x6.png b/assets/icons/BLE/BLE_HID/Voldwn_6x6.png index d7a82a2df8262667a9a03419f437ff9b350e645f..d6d7e286a3bd7a5d5e11d1032bbdaf3466b01807 100644 GIT binary patch delta 59 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 literal 3595 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 literal 2307 zcmbVO4Nwzj8csqH!AcR^;-I$60s@0cc0(X!Ar(w8LGgNGFX7@NWA_5Fl{{xFJ*vX=x>q zLB{5ph;@1KiCA7HCda{LuK|%}gd;EzEDD$ndLx6F72qT!kIDckl#cziMcc(UP~}kwh1F* zws30t+O44xrHMdU%9Kb^`k9wXm{A#!NJODP;0Dr&Q#nk~GZzRI$`T6D{%S%~jQ7RKml#bMM2h3XaazGQK41?uiVM2)ro>W(>MKnf+MU5Dt zQ7J&qIUp{ zIp?wE!;2e(vR=`fGE00N(|8`_fMVLvgK}tE0)h zkVk2$NWzcKs9*Egvh>2TrrMjHq;zSzjeDiNPac?k+;Nj{%X|jg9Ay0y5tk@Htw3ATT`ta`*~H% zYe_H9zW>k1Ri}IQZ>);(2=qDpM%n&Sb0+Kq=eaeOtnjIekp77l^*k)AYTAt5>ALjg z+2T)qXky}Q!=soY-Mq&se4l^;{W38Ba{gd^uX_}D|75jW(}jfQPe!BKY)66FoASnv z75Sa(h8vC!EQE!v_vQ0D`5&k|^Q|o}ba=i}w#g-K$dE6u|Ln7SJEgVM(wZdWa7p$o zLE*JoRaK>`t~q_KYQKt&0eyc#I;-i(dpkztJ;~?sUp}dqR@R@pxF*DSw^hGn57pD~ zYLipcf$_+l9cLykomn#1*J^dXe0!kWgFkFr;M5k;)v$W+-x`jMkM_@trF1SyPre>E z9gO-$+zq2k%*zgP5c;N!u^=w_-D`mTR z#mt!ZsvlaOL|fjt6)d>!8+8;|IsB&67oP_=6uq=cyzA);t>r^|)q2}=SGuhweuIeK l-D+9gIS9B;cu3u!2$I*mZhd=eoz4E6qKS!DH7-xx_AmDMVyyrG diff --git a/assets/icons/BadUsb/Clock_18x18.png b/assets/icons/BadUsb/Clock_18x18.png index ab06d008eeba32030ecbf0168f5bed327343f340..71ba0274fba0df3044b6a99963e5ef012be5f6e6 100644 GIT binary patch delta 115 zcmdnZ(ZV=EB8QOy2ZLy&c>dHY7!G+>XrAmhmrpW7uiB0yz6DVk6*7o2cu3?B)ufD}ahRLkB^#*BF zW(+6r1en?gi5F5d!xYDp5IRekuuZ(^`X=}D=?ji^k;%=g6;KIFxb04_MR;y)w(hJg zIXdFTFR;bLpadQ!kWIXf9~+6u^?41tPp?Ie?VFG#lN*R?RH|$#h%l=O67K*2SWOoY zY(l5mJkQENmPDY4lEMREdK@474sq7K^@ouJQ&cpTmLrE2q%}4K)8rlOC^e*NjLVTrs{%V#;4FLC zC$?pB^pAjCWaN;hs}59oNrgFH$!nM|I5OsSpkPOmF>o*%^6ZOOHK6O|ypof1l2k5D z6iP}#E0is5(vovJ7-DTdCeU~A(6^iV9$?i2u|_GvkOWaZ2s*MpIGXvHdg~?miN9E#E=_7kHFcWtsy;;hPX5UXe8_3#zDq zXb1y5`rq`4RFs(Z%0Im`yrK=6Zudrk9`=R_`*eaLIw~^@<_9`vhpRL7GF^MU-sbj$ zk923-)AZh6%COnY%az{dohuhNinsKw?88Ir*M#iW8F~86kI!WN-olal-?vXQ tH&1*4&tJE{{+|EzEA!;>$7pBdE|X#GcTBi({Mk23%Gl*u>(S)GjXwlaS&0Au diff --git a/assets/icons/BadUsb/Error_18x18.png b/assets/icons/BadUsb/Error_18x18.png index 16a5a74d96686c9ff2d9d96984a285f3885cffbe..28de03da893bf1b68581c5bc67bfc9e924f6975d 100644 GIT binary patch delta 107 zcmdnZQ9D5*m5~7m>b7qF1*BX&T^vIy=GdNCDA-^iz;N)fz>G5!m;|OY`ZV&GE*0^r z5IkvP5vF(kmMpXK$GV3)zS=tMXBs6r{*>pQ<#|!^opW^rm;9TZ0#jqpFOUM6>*?y} Jvd$@?2>=8$CoTX0 literal 1083 zcmbVLO=#0l91nDeA53H@GKcca5EPcrrb`o6$JVsAu+G{QR&T!My{=(RUY5MA>A)Sl zdD4@f#M8iCym|7VCs7c=gNnj#9z6JU@F>)meoPNz2Ls9f|6cyT-~an|dGX5V(KAOm zjvFl&tO}E3@q0MIzVO5rW@4P?YIKP-Xd4EYn?t0ILD7XPxPl?-ti8fB9GBQ|sx?|G zEtocOMHt(Nk?S)w$IZ+}KD1Xc1$DgQcp3i3(`P(zP=;SlmE@A2#Z9NM8Q`VO#j3rz zY8!~3y$og|lM%R>LJ+wvFEpbJ-{Uoz9$!m5=$X*f4Bro`Rw{!m2{6z_MX+UA2D%|4 zSci7KJ_S@+RU}!H6itw2GijKb1_lq$+y$s%R;>KM89Qb8CZ)b9N$qx9Y$rt$tVoJs z7?P|?swyxGA?$b*MuHbk4jC*Q+JWO!hj<`ngmtn`Gdv5mpM&d{N_)g!IH(k>nG``^ zQbbvD-8iwHbx14tZy5Vpht-acr3wzodSJ7LG$w~&R=k59#fB^z^J?I*uE3T>>~$A= zv}k2`_D4hxGLuL*QZ`HpN(v?gZCb}d+E%e($Qrg470Wh8L!SNcdRo!)nwHX%a#B%p z*|~I9OY7;JrO#Vx(vXMPq8C!=*?8#NVZH}g?Le%V4KSo6s1ni|jzPIeC<&Xy2dXNj zz{L`@9WTDQ6nCkgw1op_1EYLET+l1C>Fg7Np-(rEjMD;|PN}R0nkLjCM1rR3EG3vi zX~a_KYA3hc1AOxR-^6tGo!e{*7ot=XaSLN&)^x7*$R z_;8nL#iBJ=jXt&Rz8&Mh$jFComtIimxkqQi diff --git a/assets/icons/BadUsb/EviSmile1_18x21.png b/assets/icons/BadUsb/EviSmile1_18x21.png index 987af32587ca7fbada8810abd0cabf788c9c04f9..1ba168c618c6398c46fb3d0c0ffc009e43612adc 100644 GIT binary patch delta 111 zcmdlh)4(`EB7>0u2$DB6I{_(oPZ!6KiaD;QHu5$Y@VFj4KAl@!ET!4QXVS$REujHo z38MTBI#xS=?U>)anQgB^)A@q}3Jq#c+RjXrI`ymH@^s8)tChL#f_svu^E6-j;>80p N+SAp~Wt~$(69B%BD!Bjv literal 3645 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 V0A_Pz|1^geur#waEi!h!{2vr@XiES9 diff --git a/assets/icons/BadUsb/EviSmile2_18x21.png b/assets/icons/BadUsb/EviSmile2_18x21.png index 7e28c9f018a0f2cb572e5f5ce1db2e5c71511dd9..0318d425aa2f7f53a3b003eb0d91be385bfcc9cf 100644 GIT binary patch delta 113 zcmX>o)5JJIB8!m$2$DB6I{_(APZ!6KiaD;Q4EY=!L|iYvc6IsKbusfu*uP6U4o1;R zQQb46QeIem&6F$qBzs0Q$BtXkfg!p5mYn9op#PiaEj(Q?#rJZgTe~DWM4fKR7E) literal 3649 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 NjisGMnc1oH{{vTjXlVcd diff --git a/assets/icons/BadUsb/EviWaiting1_18x21.png b/assets/icons/BadUsb/EviWaiting1_18x21.png index d39d2173329d5317fc2cdfb18738922a5eeec6fe..82fc0f3302e2ae2deaa750e4571c8dc2275968ef 100644 GIT binary patch delta 104 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%0DogpcYr`$ z++qJ}>3@a%wq1X@`yto-TOabSio8kl{&AQ7JzRfg^#9`P_cZuloB>JwpGp2Leg7lZ zf8_eN6!^Em|B0^u$n|e2@Na?t6J7t`SN77L~l0$9an+)c;9a+DZRZZS8{^eP~v1|B4dJsqoRU?V`GD5l`ss3 nQ0VFS$rk^gGaUX?&&TuWzl20Zg~WpejRzY$8yg!r zkBJK=CH!Q5xcQHB=;4BfhYXXMl$j?p2r~=w^D{HVc5=(_v);r8GSbu4&t;ucLK6U~ CK_oB$ literal 12913 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 literal 3624 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 diff --git a/assets/icons/BadUsb/Smile_18x18.png b/assets/icons/BadUsb/Smile_18x18.png index d2aae0dc37f4fd3453e3254e4a9cd33e753019b9..c0ff50c0bb319405e55120a8502e30f55de30424 100644 GIT binary patch delta 105 zcmdnNQ9VH-nUMhq>b7qF1*DujT^vIy=IEZ-$lIVG;&AXe_fvlrJ%>9j7bSen6Pc17 zGq1F1_ov&+Fuxc7&EBgO%#xYRu_QZgaaNk8_x3k4j&jsBzu--g{b92QWU8mDpUXO@ GgeCyHxF&-D literal 1080 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 literal 3842 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 literal 1440 zcmbVMO>5LZ7>3B0UTd{6LeL$!>SMgR$1#+OC>f>WbBi&Q4}`hi)=4nY!B^ zRS++F@uGMUJb3aT=s^*^`ByxtKS0pQengRK)xc!Fo_XHy_wM4t+~~;u5yLP>tMip5 zJ#SCPj;;EC7QMf%r=8LK<-{;{ji+Oa@#yhB!`QZ0)RxtQGk2+A_%pkO15A>@E!$;O3zzJQJa2RR6$Nr)W_ z7YND|Tm*y9)Y4+VL6$0~2eS0eHCswW1j0_IV|Q}4jGGXbN+pOK=s1=}Sjk$bXx9pp z14D)iPgpD>C1eOvMp~Dv$~Cp7eG`HxqYaaRo3z7VmqrlVC^e}E^jU_BR^xV0xX&PO z^MHpc(O8^ewU<0EgKtP11Q|L}vp2Lx1KT!4C$+VR!zG@`)tK?w8(QLlp<+=>Dw(w8 zZ|umfGixGJjyY8_u1VP*25NE00vv2R;P538`m&Q8Nu>-P@CsGjHFeamg|L;wH8e#W zO!E1o7!ic}P*3N9PZj+;u=GV^ZBwYvNJGW})m{<-ZE_fe&7L&RBh@fbG-SM5aZRnN zErd@BC0xw0I=6BS)Uc*#9$8bxdfj3UYD_xCJf@Ru_`V|9Y8t`ed;cHbpO1yEAlm+a zo-9J7EZZ{nq_4f4Gr^DZYPq}^%Z6y{i)3l;6sXRY3%FD$SdNX;MDHaWnHPzU>e`@m zF7WGvRa<~wjuFbzGH^|n#-ID<;8^^(3;VR47T2VI$csKKkqyJgp_fv5X;ksj_%dA!DP1fvqs5@M&TiMq)XFS~oQMEEt+wm~CH#1^@v8^9I ze!KeW*2}SvVq)w;aB`3F^wYBk_vc38mDg{_-`&1AJ@Mku!7q1qAAXYd(CX|$<@u>= GH@^cCN4$jq diff --git a/assets/icons/Common/ButtonDown_7x4.png b/assets/icons/Common/ButtonDown_7x4.png index 2954bb6a67d1c23c0bb5d765e8d2aa04b9b5adec..0cda838e058b7cc79dffcefc04125f8008d556a7 100644 GIT binary patch delta 54 zcmYfEoFHMy$N&UcdnGOaDFIIx$B>FS$q5M=NfyUG@G-DnVlsDexYqvd$@? F2>_C653T?J delta 83 zcmeZFn;_xG!N$PA;B-v27D(xMx;TbNgqNOj{yjUfWX-fE0bCa+Md lj7UvBS!;1QL0)Q=zORYsj~s^J?Ld7Dp00i_>zopr7yt~28Xy1w diff --git a/assets/icons/Common/ButtonLeftSmall_3x5.png b/assets/icons/Common/ButtonLeftSmall_3x5.png index 51411acaf8d921da05d3eb2c9dc54af6253d0c5a..0fb7fb3139a8fba08f03da748a46cbe41e85bb4c 100644 GIT binary patch delta 57 zcmX@h>peljn2`YpR&ZtW11TX-7srr_Ims3WN*Wp)7dAd*VBm{lI;^hqtqY{e)78&q Iol`;+0KKaayZ`_I literal 1741 zcmcIlO>f*p7&ahKo2qaqhfpq-djZk$%y|8=w(3@C9LP#IMCnQmH^wvLT`OykYkRYs zoT^?B;uo|6iC@4U;DCBW;=gbKi5tA$wYLSeAr~xpJ>z}md7t-vAJ2Sqc<|Zvt(#k# zrd=QHM@R5{3+}hCya~VW-FW^7Jg%1eU)Gv-?M8dQp*{ONVOnfB!?F;G2Nuyqc}b zBRG~bnFDtXSh~_z2D_DHjjF~<&H6?i_7Qc9nwI|2!>kZ$QGeVj>K4d|H8M1yYZMV^ z*>FsqfcgO$enLq=$Ql}h4+Lx2<-kg0>DgtVaU6__x?u&EqbM{$l$m8BV7}+tuE$a0 zSq@@}Em1=3A@YVvlBUw7iI6K@us%|J-d3VrzqYMV95^=B4BW&`9Yz?k9m-HjY=#mp zIHKIL++;u<+p&ALFRBc_95#EIwN)j6(XkWHXZ{dLo4UxhZ3_)KOnG8C7G)_(9LvyO z#NAahRmDm`bq9tnc#x_pXW*YKXA_CbV$!-9*ddGktcKQ|b>GJW`KTMsGJR#bfbrJr zp~2fGOJQ`cvsYB_ayr+vi>U-vE z8hTQo0do@}q+|1ew~jl@dIf7Dd~w8;)|a-&elhI1?QpZ%!(?+@$O2NW;4p~JZ~p=Z y$%mt8XME);|MRca^}+V`_7CrGJ^q$H_qAWYe)sq9x5o4Kz!~iwL_gmD>dD{nYamVl diff --git a/assets/icons/Common/ButtonLeft_4x7.png b/assets/icons/Common/ButtonLeft_4x7.png index 0b4655d43247083aa705620e9836ac415b42ca46..7c43f3b04d49a12cd2e9e02c259d0dabe251dff3 100644 GIT binary patch delta 61 zcmZqY_MaeO&d2}+>~a@tfs~l1i(^Q|oaBlFUm9LAFf%(dA7*T0XHcBQvUK|rFFTM* MPgg&ebxsLQ0P}VcPXGV_ literal 1415 zcmbVM+iKK67*5rq)>aU2M7$VM1Vxif;vTv~W2u`S7ED{V3s&&L*<`XiG|9wd+THd> z5CnY!sdyuJtrvQyAo>KpiLcV|{Tkc)riAbluXfwSZCApL`ztB&p zx6LGKvks4K_4~)qD&oGa-YdJlW)hAKMNJd7<=t?6c^RI1>c$ifyjaM>^|&8!ey zB4!nh9u>5uen6Ve@<H5rru6h<2Ef#GQdQ*CmZOlQi~N!?9H`Rp;C% zU}CB21#?;r`&0|6C0}b-=jODa5|nEJ#ntxQ&{~jpgtwDta4hftr~G=#p@V36e4Zjh zq%J~{y26Jjn=1Nw-l*3%QW5YFE*v4z3gt0$&(*xf2en34c?JpH8+FYldo+Alvg8af-pG4(=!fyUi-Wsg z`g#n9VUcf(DFr{poMSNzw-lz>w+HV+n1ELr&SLA#LHUb0p(xWQ(1*vJ-i+1!`swxZ Z!O7;c$;lT_->m1Ovaz)0yuI`A$q$F8u*d)a diff --git a/assets/icons/Common/ButtonRightSmall_3x5.png b/assets/icons/Common/ButtonRightSmall_3x5.png index b9d5f87db1ca55141449cfcc3bf054417eaa84e1..c25ba7261ba7802169ee792091a6be7c73130204 100644 GIT binary patch delta 57 zcmX@b>peljn2`YpR&ZtW11TX-7srr_ImsRg0SO5}T*Sb@@{Zy0z0)smfmC_A`njxg HN@xNAw3rb? literal 1738 zcmcIl%Wm676lEHu%>zLLWYHwZf?zfc+Tjd`l=wgx!?E02K7gZd!)A>b-AnNYDb z=UD-0O?$90FBm_PwI0iHnuo^kzrHc_RD{NpUPPi|OHR_A(^5V@-5v4MBkl`h`li))oId$h zr-Twrdf1}K>IcLLELU%T22?9W66_DYYiq$%XiVz52r!<_X6DQ`RXN6%@B5fgOeq2c zsup?8<|wc3bqoVp@iHyyRONcZ$YOO|hXyEJO(84Rw0YIq1cu=`E3jpfW=b6}iq3{+ z*&1Ed+b2+^)%#K6YP2XM-j|g+F1g%3k$HWuD^^TYt*VLogtqnH|4=CSx?pi!PM7uw zj^$Klz+C~>TIwr;tx~dDl_RC5T~K>nMV(qE)xUm{=0eS?`;DS@fE=(|h6bc&Ap((k zBdZr!eqejwSR^211&yE&1gqKkz)Gaa;ylnO3Wj-Avz*J}AT&UfnWiG(Hm6?C6^L<1 zqL@1bP64XW zqKrwxT^V~c?$~}TQ}}Y&^h4H0l>o-Xk=)_jK{NqDuJ0r$_IQFAaV$sJiQn_7p}()Y zrKYNklmK^aLl-wVr`&ul_BH)&R_4UgD(ZOFr}nOx%X#N!gVeJ4h)=Wyh? zQXrf4V!h1m}&`|!B-3a0&FC= whJ($~<(FI>9{%<2-NwbcKNmOR7sY+;Hox}g7dMW6Yj&IA_U_=9M~Bb;1{rl65&!@I diff --git a/assets/icons/Common/ButtonRight_4x7.png b/assets/icons/Common/ButtonRight_4x7.png index 8e1c74c1c0038ea55172f19ac875003fc80c2d06..31de21c0e2d383947ec4ff7c00ba44e9a9f5a475 100644 GIT binary patch delta 61 zcmZ3_=RZNhoRI+t*yS$P0x2<17srr_ImsFc1_=TQ2|yf_P{hE%8O5mTc2;W-NTsK% KpUXO@geCyKoey6C literal 1839 zcmcIlO>f*p7#Yw)M6zw!O+@VZ{?d|D~WYi~8rHRY?X-&T}Yen`g$^+EJ;z+|RV zE@PoDvZ9%#+_}3bC_5Cj8jDGq541mi{7F+&KF}W65sr$Xn5H|YrMQ2(J7%Yc%;(zO z57ax000=TsQ+1Ke@+w#iw3au3cGGQWY740k2ijH>P(6tD)S)be>gX6Tj7`<`b>di- zgWp$8Y+?i31~CzF0&E4uRlA=C(Mp~K`{74jEchB|)4DDK!ZVhSwdFyw0YIZ1cDh0S{OvfO-U_~ zvmRF*m9sWDXNH)GOyqS1Skhxbr6}s*7t&@~kFM(NW5}qh?Lu@lJ}HE;FDiLdGO>LO z5pS*%E2grR)l^;|?O5b_?u0me&c1U}%jrk8*%=Wk%i)8yp2P|kuxmKg<=(u_`oQRI_0 zS`-DNysBx=#3&qSkgA@hJP>~D+ZM(s5jI6Owp`?yE=3e`YGUqkVOp#Cp=3wR3O4hX zX6BLsN3UBzV(vI5;|SZHgOb=HD0VFjpTyfFW}GnQuh>2*Q`k>*cAmA#iUT7EXSpo# zkPm5~#I-o^cpgfe#P$=4-Pi*SpT!-@nJgp8L347xe>5EKl`=_ZFc8XGy+_j=_R_7! z@vZZMowS1GJ?Zw)eetks%~G{BTR>T}9|jt0j3Btyb*C3-`C?fwY3EY`q*oYZ39DpM z&uJ;PCZPLs4QO1Jd_|A1PF)azZJ)RZ`^-VMWr6e#XUOA%3eLG_Ch@BDOHzMk*MF0G zCo7xMd?Mg*HMIXw%nNz?%60fZiZPlqb?GqUpXO`F&Yi!okZl(n>P@r1P2i)yk3DgRwbHeNn6e|;J^SK4TM LH~i+q&mR8;k>NTA diff --git a/assets/icons/Common/ButtonUp_7x4.png b/assets/icons/Common/ButtonUp_7x4.png index 1be79328b40a93297a5609756328406565c437c0..48d0f9f018c427711451652e88e697b4ca19a094 100644 GIT binary patch delta 54 zcmYfEoFHMy$N&UcdnGOaDFIIx$B>FS$rZ;-nlt&CnHhMwnA-OxGVcVb@pScbS?83{ F1OR#94r2fS delta 83 zcmeZFn;_xG!N$PA;B-v27D(xMx;TbNg!}e5@-Y~29D4Cz{_G8*+0QLPZ;y mCvnJ|Wh8!?z4yAUT$r!ukIjxv?|}LkJYD@<);T3KF#rG+2^$0e diff --git a/assets/icons/Common/DFU_128x50.png b/assets/icons/Common/DFU_128x50.png index 951cdc198dc0247e34557f2c249466478456981d..256a61b6bfcdb5aa62a11bb0716c5c2fdd5f3775 100644 GIT binary patch delta 604 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 Ys4p)n?jO73|7?&gp00i_>zopr0MUUj#{d8T literal 3649 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 LTALIbyM_M?u*zuP diff --git a/assets/icons/Common/Loading_24/frame_03.png b/assets/icons/Common/Loading_24/frame_03.png index 7bb66fca0a9bf781969f7a3c156c2ef829f994d1..01c99c56e78411720ace7fa7e54265c2ade714d2 100644 GIT binary patch delta 120 zcmX>o)5$nNqL7gR2u|=YgaWAmPZ!6KiaENc7V}2q_PH@hN&o};i6$rff5HKk=Gey!) X`?ZAS!Bgo9AUix={an^LB{Ts5>=iBq literal 3649 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 XG<+`+menTQ39`h~)z4*}Q$iB};HN85 literal 3645 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 JmfHB7`5%CoVEzCA diff --git a/assets/icons/Common/Loading_24/frame_05.png b/assets/icons/Common/Loading_24/frame_05.png index 80bf88e9650a845804162d12403a8bb2f7631b9f..c144a72ede4818ba8fa7d3003e48d5a8b627205b 100644 GIT binary patch delta 133 zcmX>mGmUYAL>(go5S-v)2nABHo-U3d6?0e*ZWL^C5OFwIe*esk6HkJyl(vX#ZDc(D z!O17Xu}h($rE#L=yxkGJe3R0r+q5mPn|xY*0p||Z7-l`jskY~Hs-M}O+IwR4)clDn lr*1uwKke6q&ElJH{AS-`raM*D)9gRULQhvemvv4FO#ngQHZK4G literal 3654 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 W0n(a=Iq%{Q0Jc^RmZcV+k^ckPJzkpt diff --git a/assets/icons/Common/Loading_24/frame_07.png b/assets/icons/Common/Loading_24/frame_07.png index 190d2edf343954929ea48f993e59e6c2357c5d85..a7843a35bfcf1ebcd5d9e239932afe06e928be86 100644 GIT binary patch delta 126 zcmX>u)6Y0TqMVTd2u|=YgaWBBPZ!6KiaD$Y5Ar%VFt}XISJ`B`BPa6K<%T0?Cw5D{ zXl%KBOW;^_g-PEtY2EDw^4Ej|m~w@qqE@h9Hhp$#qD=pxbX5)3^$MJ22eq8yf6R2X de3X#s!JYD@<);T3K0RWvPFn9m} literal 3655 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 Qb0?0anT=_&v0M260R4Sy)&Kwi diff --git a/assets/icons/Common/More_data_placeholder_5x7.png b/assets/icons/Common/More_data_placeholder_5x7.png index 85025d9f0acc7275b44e8fdc45ea8e2c9293e68e..bbfdae047b3654a4c5cfb3910f7c423db92f8f88 100644 GIT binary patch delta 53 zcma#?m>^-m$N&T{?(A{~Qv9ASjv*Cul7AdL!qCja$iVBy7@X2!SP4?%>FVdQ&MBb@ E0F%cLBLDyZ delta 73 zcmeZ>nIPf9!OXzG@V&D94v=CC@CkAK|NlRb8G7h)9gq_Aba4!+xRsQkz+}**;LyOx Yz+lY4vhuc66i|}E)78&qol`;+03kLN8~^|S diff --git a/assets/icons/Common/Round_loader_8x8/frame_01.png b/assets/icons/Common/Round_loader_8x8/frame_01.png index a5dc239d85e8a02c44786475069a9b683bda5aba..b8db2a4b5eef6edf734886f7446bbdfe7a8cd6a9 100644 GIT binary patch delta 62 zcmbPZ88|`Gf&mELlr*aWDG5&($B>FS$rfk6biY&(W(L8@w!+d3iffrJxwwBR1*!FP L^>bP0l+XkKF6R;! literal 7324 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 TxH*)9T8IUCC+Rm6uZaH!P{_=Z diff --git a/assets/icons/Common/Round_loader_8x8/frame_02.png b/assets/icons/Common/Round_loader_8x8/frame_02.png index 162d8a8f42a9492ace7717662ec13d525ee90f95..aa0f22a4c9dc55f59a391ebd6a2794c130f4fc47 100644 GIT binary patch delta 63 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 W0R@kPHAx&eU}I@-QEKLS@qYkZZBH2h diff --git a/assets/icons/Common/Round_loader_8x8/frame_03.png b/assets/icons/Common/Round_loader_8x8/frame_03.png index 5483e47345687cbb9bdca56f6c9a946ebed1b542..cba466ef68f43cbe43a96618e082252875bde7d0 100644 GIT binary patch delta 63 zcmbO%6F5P_l92%j-jp<}0VxSj7srr_Ims4hzVv0<3p0b@WaY^M42rx=mlRTxr-9UZ My85}Sb4q9e01+S%*8l(j literal 3603 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 MS=gADnz>*8AMz7TL;wH) diff --git a/assets/icons/Common/Warning_30x23.png b/assets/icons/Common/Warning_30x23.png index 5f7e02dd857e172635a87dd5a1493609d8b95c3d..f307436f506d24ec1dc7b33c12920456d0990f41 100644 GIT binary patch delta 97 zcmV-n0G|Kb0)LPsTSiGlK~#90HOa9Jz#t3-(bIPZXEcw3!~!l|I5-95x~HS7OVmK5 zBLEQ-vErvEv{@ZC8*TdDf}sRI449fPap*>ZaU1Y_pA8(iKnHx*00000NkvXXu0mjf Dc9JF? literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^azHH32qYLxTn-%vQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIU-u|8QZ1q1V3bmoi89ep|OVeVylC|H+AqrXO_` za@X$aW$-@D&A#aKgSs<^wA?1|{?Pz5S+&G9q9i4;B-JXpC>2OC7#SED>Ka(+8XATe wnpqiGSQ(jX8yHv_7)(lGI*FnoH$NpatrE9}$CkTFff^V*UHx3vIVCg!01Vw{tN;K2 diff --git a/assets/icons/Common/arrow_nano_down.png b/assets/icons/Common/arrow_nano_down.png index da66350bd1c0adf134a018454717a354eb88befc..244b022a5545ac3b5c379b9186d0107f4ab67712 100644 GIT binary patch delta 51 zcmZn{a-ATd%g6u(Tlu5611TO)7srr_ImrnL5kTG&hJ{I{x-UTTp00i_>zopr06K0B AD*ylh literal 2311 zcmah~4OkQR8NU#Q5D{35GBa0VQUsBFlJJp+&_Ix-U4W*1SQ&pjo^?!EWk-|zkS z|KIoi6crJ^jzlH_0I*K-Td@p(67gkYZ-?JYv1Bp;*g8R>p;4)!;h}IEjJ&H;D8X=0 z3nGwG79Iis0fmJz3F=KTuEM|8Rc(9y+uY8wvLYul?=RJ9vW~plqh_#5)9X{5RxLW% zGJdBN+TuGj`z5qh=qhq)_-dedU_QRVbMx-<2L<#K)lnyGbG>HTpN1d*mz%>_oo`ir zac%0A*502+N+z@K_n{MgYY*1?#2@bSu<;?Equ={(uJ)bgmE-IXme`kMpMZit!APAV(U%!yB&sOxT*`X_G#=-PP zS_x(Fm1{LX+^@cHet4nn=$|?H@-QE-vj@zkp8PfUX-{_Au0bF6d?Mg|^|!6m*02`8 z^3Nk^-(AUlmUA)ePO7OVH}caemcg~3So`FNH*)yyM=r*g;a)8NJOiq_?lKS7K@L+i zAff*9euOk7G$~^~xV&i;J9E~*V)uz*ET|i+m;uhJO5I>}jDX z?#vfQLgwW3ORh~GK_Biaam1Qg>9dcY?ujcsYCl*M=(d)8z=IiEGZoUD6IbK;rHlL` zmh^Ti zA3dc$KJ)#+cz@&8pUl9e=-uY#vC$4zNZCB?Vf)#}Np%eEvSW6px;(wzAz4T3WJ{Qm zqTHEH)Z$^*#?2=wMV>A1st%|+_-{G!ZXBkfsz-GlotXrh%;;ZmxnMLy)MQRkeKt_t zcKt1*ze{&pcU$VsLtWZke1kTwpniL-vHlkN1NM3fc{d$vzTH`hw9Pll?{`(o@B8m` zG_T1f=8W~kUgC{${~1d%d=1B&!XE`isD!8JF=>jblPBKe#XhxhZv_l>`g;2myZG7R z>6YN4)RyTY_boX?eZ#`L-=apu_ zYYf@hO&55n_6IdyYgD}*IlBJCJO>4H?;ij1R}0+|>g{e+!m4sZ#Xh$)=(x6`>ek)h z=?po9(_P})|FlJ&*t_T9uYhHf!bs9#CZ?>+Uv?&t@waIz#Wog zsTA92yDOx*KWoa=OYNP#hl#te<*@~Ok9J5)(5RVZTWeX>8CZEi}=aMTFy#w1J{T*KkYZwX(Cqu8%SquPy zo{x(f5K~a}nlvrS*9TFp7JOW`sF_rX)dWioqVAAJQ9@w^r1&vd3>H;LqEILTM3u~! ziMKDn@wXtV8pCvaCNm==gOTCOfRPj?J1{Vi$>K0M96D}6M>DmULQmJCwC5x*c*G#8 zL?9go!CH!iSCIs#V?k7^#nIxm5T`~bl`gu{q6>N988Y<>9h1#qF*O?IYDg55flEQI zibSI`bs$p)qHsE*1aWiPYD9S9{(k_gfiNifCC)8htZ^^a1W#FjJCREHVpy530kxP! zEW{NI6{O;`MLd5Vhvmm(`-#}>u&@9znyYur$A89Qqmymi<&Oa(UPWhQ~1!zczikBKyj!z zl*baYR!?&UbSa)CX4Ojz$bEUH&zYA&mzWo;yOgT69iE?3OL_UB2&lkdBpQa(gg@8F zR=WQ|EOTW!82m^C!uMZcX$>J;z+9nQuoo~beY32Oo;Rsgi+8DzgnN3?@j{X=a?TAO w0vjY^QMCPUl&ZwU8D~@C)&I-~=dC+Ic+<&l&ZGLhe9N4WghhzYg(Uv*zqIRhbpQYW diff --git a/assets/icons/Common/arrow_nano_up.png b/assets/icons/Common/arrow_nano_up.png index 4a1d5be85cf83a3a1767d3b422054285f978c9eb..ccaf88b6e54ca43315fc8b27463eeeee56e937f3 100644 GIT binary patch delta 51 zcmdnW?m9t2myrPow(>`B2U0wqE{-7;bCM$t9AIEze8RBMb3#=BNZ!-c&t;ucLK6U3 C84gAO literal 949 zcmaJ=J#W)M7`9pos!AP@SYSH2OOS}qpGj=RR3VqPk?JT)Es-%7`;u6xea5~JClg|W zAHd4Q(gBH?ftjCBBz^;b04bdFRfYsh_Ir1JpXYt<-sj%8TNfwCPmcvbIB8y@4v&ZY zJvhq0x3?b)JUn5IF1w}!HpK}MYCi1~&3AHzo}9$uNj)@%OjyA_#n2d}TPY6W7ToxSS{Cdfsxq`Pegk@$3btW)>$1 z3Bw=@Z=%%7Y;nnJ@o~NkMX*d^V_RH_>N;&urwIY3q!c|_RzTU5aK+clhNhd(fhwyS zlr^YoMMbk@!_p0~eneg{@ds81ov+LBnJtbOi!BJJ)2TGoB$^DNVwxtDRj8^(o>5F^ z5yM$AN>4Woh@@T;#4Ml@$Qf~;PM9rnv8!E#@s>79*C)l#3}!fniX`W|+9W#8|5L+o zo1L-_x!1dsICW<+fgO_4N#gO|4Nmh?u~kn9W;Agrz1bXOdqf#cM>GbiE|oyR!CnyM zE6PsIp-wrJABN8Wp6-sAAM~T{ktPsT(Y!-XtUu z+hF~BY-ukxH$)io%7`Sv8{(fQGz80CTfq)3nyQ-yb00DM=Dav;R zfV4N%e7sc)sXx_pc2Fw=j81b1#%aC+R)BGZ^ANyboj05SnF4fD_c*OpN2!+mz~Ka7 z3Km-T0Br1Ck$;>G7%hzpm;o#>(B0oZWZLtC6fbZ2bdv!0Ex!*$+{b7B$=c#IzgMj! ztOXzjdxYl~&?=}DRlS$)`c#T48)<%E%dW^9z}N*=&Mo5uxEvkQD5|fYim%L_^?(QP z+}!6EKs$FmW4A{R1HNYLZm|v<>=+L($ROj3(S94c04qnv>PsvDn?`FN3gFs6Nq^G- c+zoL32S{wWDTQ(aX#fBK07*qoM6N<$g4`LtCjbBd literal 1664 zcmbVNc~BE)6wheY2!uKFLY*phgJAoI;~(9b-S2(h_kQpF-Zi@^ zF+PgtHqDL0;qcVaN)5Xvvag&wj{R2ntG{IzUnWw^ETRmI4WkK8n4Z!RfZBv*5gG#1 zJ63#0gm5_H9b}T0(Z(&5iMAyfDpT!HDDqb46vJwW~kNcFY38LI^aOT(OO4TNw@UFO4^9 zTaz3X0@M&zDwoFDnivAcz-<2B?#QLcvXLjyBwHBFsHE^*6Jci5N(G<25$Z|3oFF79 zt{0&K1d|yAVyOrc=nxShkm0BVg>_OwC(@1Cc@tix3X)1BkVqB;1;KD+Br265;Soxe zN-Rdg!lmdKR&BO2m>DO=e3Pv2Q7rOStUQ7yFovR&D9Sk235nShLs_#a3xG(35HLFq z!%4I2WR9y!uYy(*G?_=}RWxM+M$#-N-#`HpAu80Tmd;G97`! zdI?Mr{87CA|E3RQNrA3j`A_eR9kC7R5?@aPyLmlNgqa;8nw^%VblFu7XWV|ZGAzm7 z-ns8C-3V|CWLx`RUVV5?e=~JLXGNd*gA2VSy}M^liFW=t^rC%5`mI^MKJ^z*yC+9$ zK8y8opgw0i#OZbK-@bIOr+sL3X*0ny?F_5$?^u;L5LsJ%K{s=fe|&Jv>M52PH5+{E zciwC+?Q1wXec-Dn?aE=B+ip?UBV`Bm*T(s!wWZ~plEuod;*9$(j?$d6^(EcKbW!X< z&nIP6%$5Z)#Sc{zYqC;eHfJr#r`xJt{34$f<9D)}sVN9J6SzfMQhTpr?kB2_2ge#4 zPMiznH%5_{H{8XZyCE8Z^qt3(nNamZCKd_dTt1 zybD4vFW|RcM-rOAUY>VP`H4R@hUX>mS_}#FURP5QO}9;kzD&7Mf0X!18#*Cy#s=lb zoGCF8teZgFA$ z+RoI3!Q}^!2oJhss<8vOJLqi_j*V;@D?$qOzS!qAdI~fh>f!$Rlk&;`Vf`4<% z;twaDuf~1bzjhOXb@_XjZ49oi7zcZBs XY(V!OcIS4x{t4>Hc;)f%%(edjvT}hx diff --git a/assets/icons/Dolphin/DolphinMafia_119x62.png b/assets/icons/Dolphin/DolphinMafia_119x62.png index 1bbbec84ad7c1ddc9c58e5bfdbe577a07fed89f2..4d47ed5b110fc9cfb875a3b4ad2f9035fcadfdca 100644 GIT binary patch delta 656 zcmV;B0&o3*3Y-Oy7=Hl(0000v6}f`|00Lu4L_t(|oK2EDY!p`%hQB*IODuv|Bnk?O z*&;~Dsh~|^H&md=#SW}UB)cT3+|gyGLqaLiSfR5kWX%%ADIy_7(XMDgm=sou6c`EN zB9S}>lb!M0IX}hh!>74A_dEB$=Y=HYEltbU z#jZy<&!_A`tCFAQ<8DFSUOt%d=8PI1A_%sLXLg7%Z+8MPp%eJ|%AT>!ub`+WY0Vs!K#*uayr2y{9o zS@PeHq^w-ZIVUBmr4yj5f=FeeN_rQ-m9>yAMcLI?AD#l4j6|bErDVX3Rqv$hQY9HF z4^@@&rq3iAqyh;#EmYwSR2f_?a{`RjS8LzXxkj;b;4? zDD56-SJk0pNbw!zk(T`ZiN7dGUe(VJn*I8+4~(II-2A^NNxQ17Zsvcv53Cd50OYra zl8;o^N@M}Aw{whk@@0*?QEe3YJF0G5D& zw;%65aDQDmX_iboE?(8aKN=^MWauitO4T1a99EJAT;=f^?;-Dc0NbJ?z5G*~hli2{ z+Ts5`f353Pm;?ANwx#Izdh9nPqg-+ECF}h5p;9DSP_DT6g%#1?&lmw=Yo|5HzVPnm qch8o)5PV!|$JtZsY+UP(fKO%;$VC4Uv6lb<00{s|MNUMnLSTX|I7CJO delta 1272 zcmVl8 zcA&LaLZzh5J`c$}`U&M?b$STuy^n`r8YSdPLoJ3z#Sg*n2!9XD6p>?$J_+Ei(SAH= z?N5Y}-usxZNff+h6FY5r?c5D6aw$T0L{isj3tk`iVa~a*TD1@w9g3gu{tlONJ;ZW~ zwJP`t&F?TN*F$J#5k=X}uGFs#bF~~raP$UfMr?L26|vy<3r_!IIo+Vt0Kd{$M+} z&o>dw=G;hPCAoCv$9ze~`sN&qK`J+zSc_6QA9fo-;(yQH>wDl$xe>%hDAnu3x1;wy ze()P!qdP*q%9Hfn<=x%APgnPx(+_^bgNg?WRDX@{k^*bCsUjJUhtKC)A7KAJ#z-aB zYuDlj{M}P6XP=R^1VVrChL~;O{Sb1cgi3R+*B5BVOHLNSnH%Sqi`H6*x;SDj6R;8- zwOCY`jDN5T?PqP6*8ZwGLYq_FIyR)SaBqDMuwd*BEHxDW*ad$yQg=DXCrA1dnRM?GU zd6IUObMo)wM@vrR&S#zw9o>%V2j`G61~;a3+%C}PTJVP{Z&QOd6px3-uJsL^9?TEiA}YeYc|1Y=UjNdwRh!aOllHZ zL1cyUya-jUhUiEI?+Cq0-miv7qbVqqJta;XXK$mUR4iEG-Q zD!xPyF(4@#C%p>R0&c+F9IRvEz7|_m(PLXsQN@$gxJJ1VlO6vaRB$Q7YoD@nN`I9S zh^l2wkY)gi;Q2mv^+1w3Jhr(Fq8YC;=P$!DM~nwq6Qe@%u4t3`vI_Sao7KhK@{{$^ zIdR&RTrDirYa$EEl4&q9Jw*t66wBhGyQY{7U(Ag5Z~GSxUqTT4Gm|hU3k4+UUXA ii}V+64(i@1<^BaY>0lxz$?l;50000PeHif-4*Z;+Y9(2Vf&4Hy>kclgdRbcH)}o{J??M>ht?a0?Rs;Wo`|I=r?n|NV-?!;a00000NkvXXu0mjfK=qIf literal 1177 zcmeAS@N?(olHy`uVBq!ia0vp^)DSr z1<%~X^wgl##FWaylc_cg49qH-ArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB+XP}#GU|^lpi<;HsXMd|v6mX? zCgqow*eU^?3h_g30o>TUVrV!4LrlLSu|VHY&j92nm_lD){7Q3k;i`*Ef>IIg#cFVI zNM%8)eo$(0erZuMFy_*fK~@!5ITxiSmgEfrKz*2sj;DkpMZknD6wv4b%oJ<^ zJ|V9E|NjRvLl0f915!UdT^vIyZe6(^E!Jef<9czm0A z3tiQZTzK79dS605C-KUauQq03?HktYO@Gah6}dWL!K=tEQF6i?wpZ6>D42{4Kw06Cgbx4xeweJDDGS}F({`j)7X?o}J zyX`DecdFHnf1Yl!OLgg{#J>1HY(M3>ay__X{YpODaR^Nc-<&V5lUuWQxzBn#x3aK( p%=f=fPd;t;X_5T?htnCD8BU8cnRk73T?7mS22WQ%mvv4FO#oZ0m5TrX diff --git a/assets/icons/Dolphin/DolphinSaved_92x58.png b/assets/icons/Dolphin/DolphinSaved_92x58.png index e8704295c6ea182ffdc880ba160182c22531d708..4d8195b805f26db22c46aff9ab6e243f866d7db1 100644 GIT binary patch delta 461 zcmV;;0W$uD2ipUX7=Hl(0000LIRml)00E*&L_t(|oL!N>YZOrwg}--aWHu_~Ar=Zk zR`p@r-q7M9yvIGtjXG}f8Y!ot!*aD$P6A!ZVPWM-L}V=*(U z__~jC?>UG2kR+*KE)@mGg z{p%nH;{OyRsg>%jX5Edmcf(E$^<~#Vvx1{by`m_f(xtuIf=^F+rRK)Jp&Qicu;Zi9 z42t$y6a%yyOj;2zU=*e7Jp*DF)i5S~4_NXY;~rcCjF(-xQD=}k&Qto{&805w8_XcM zPy$%x!Q?q6KpRA$`<%YtmU{*xrO1O6h^x-j6y zYsNsbgQW764kWEIBq`AsNmVd_f(CFiB1+j7Jp2*u9+|1YNxEi^4skS*AN|H?~nak33n%^wa3Hum4thdG4lgpdw)}}BRq<1FP~o)Mxu~G zHo%XdNG!B$C*a>PEA&YMsKh8McrsAnI}k@H1T3~ zYQqcnBA*H?Cx4J+EakHl3*vjVj>=t;ZduOv2oEXJN3|!ce}5awD}02N;%BcTkea1v za$&9FqlreOW+@iAFo*aolHbMYY8k6nwstq*)Hi2d3XkC&FauJK9X zCB2}iETJb|lihH9xb|=WfHiSh?ctDIly|FEGXa~1lz&wU7Ci}hRi2{{FWUeHFJ!gq}(4YZ_l&abdsH!Xa!Vl%$>IKKkf00kBx5PgWS zXl|{(&qf)-0raG!4eN1PqHMSD#tHERZwlwGTH6n2?x(V9x#MF`nqI5jl+W829ePX& z=U&)s!hhm)+D03zRL`odkO>oo&%UF`u^?_7<8DFNy9aY>-$da%8z}MSzpez7bwA4U>=?o!RvB&d&GCV;SkcpH5$A8Zw#(ko2Q7@$u=@o!CcU1O_BXRRe zv*I$IBefx^h&`KPyKn+vv=PWEUUKYceR@=(eVbxMzDav_RL*!D2ekWL1fJjJxqj>x z#UA;(!Q+DySrsx_;M_Z-~5WQm1Ip3Qymc@@Ez|ipkk(Un#uoz7z>oSx`pWxtch?0cB(yr^LPX QuK)l507*qoM6N<$f-6X(j{pDw diff --git a/assets/icons/Dolphin/DolphinSuccess_91x55.png b/assets/icons/Dolphin/DolphinSuccess_91x55.png index 80caeb203c69add5e5786f576daeb3b018b1c859..1dc514db64453962bfe371a43dbd9487a50345f2 100644 GIT binary patch delta 501 zcmVdkYl+00GKLL_t(|oIR31Yg1tq#((cg0>usuia6Tc zf*BkO4T4i0?%)TgpTG|w(hIt{IQRwZEQMrfv7q%v)KSb}K@gL-+E|Ea(mshbnjlQbx7Jz%Mr z_6aB#JvSt!h3!_p4Zw7l|7Gm)q!8s0X^I0n=FGKqCoXKNg^w*DR6AJK<|!`55inPq z;{o@49aCEq0OBRg)tI$7tMk6T!&v9`LMxw7lg<{S#yQvL+mq?r2cEG~xA9Y{l2_ic zCSo1X4pxe61Ah-c&?=)w*zQUtCGw0FBweIRCf>3pz#u=g6gl948H#fv&tKdsJt@^x z6SY=6{f1JVY9M9a(g@>#p>SBGiF@SPQs+3PC+V?*^u6opHza8)9S*#GivU8tw6Y8E z6>e9t*IxjJd;qMn24pd_EXE%00VnWoQin?~C6R`#=7qc`vmmboEj+p!b600000NkvXXu0mjfV;Sf` delta 920 zcmV;J184k$1fmC!7=H)`0001E05-S)000SaNLh0L01FcU01FcV0GgZ_000A2Nkla80tk`0v%FYt{QS^;XijtOsVUD?#;+`c<*fIT3&TD?M&)R06pD<=<1yq5Nwf~f2r zMN`RW@xLABntwfCTY_ptrAMf{iq3Q;JF&UDl~uOa zg?P(CMRjAsIiXlOBC^3oZY;&8ZO13;~r#7 zijH&*kq4yZqAgaF8^eiAD<3!>sccTskv46YXsfF57=P&+@Li_Gh2toG9^~VuCW2Tv zS0WRt+p^Xw!Iu0Y#^dYd#$HqQTxVrWwdRMj$Q($rcWbugmcj{3u`FvwKF<}D8m@D!-h}kt$IN~H+|CIiRoSO5cBNdM zj912IM}MFy$rITAejJdiR>q6n*gK?TKPZ!8Ka?#g`nIxnmA8}s>O8W2zoBd{8ENdy z>%@9HbENqXH-eQsC&AwlnDM!o^E2o!JnO(1tMlNTM}wlgZteMG@Y+*97>`SIH~z`8 zVTn_sW=F@&a4A|W3qOBk!%}fd*%`Qfh)ZzQ?0<@#q_;L(K*hAa2hqnE>{mV&?4AV? zIYvM6qu{F96*eI9?jk+0;R}QLx7otB*2Mo*dJDlBjSja7cs(mOYRx|7yE#C=O?`f{ z(cwHl_R}0xpMA@nWNxI#8b;jNAS*wDkE-xrrS6q3lyGWY)}VrF-jo7F1;)Ny5<}P;))= zxtP(aZVg#KYv&lf5x7C{&aI9T%C3YgRkvoS+4Ft)`#*eE_JeG#Q~Y+NW06JUkL+8W uVijph(S0000DW*S8T!o1*Cy3B;32(d(R-Y0@O_A zn@I-SX=rEcQlG5N(q+e4@PinEU?1*+Aj1_1JD}*ZFc2UL5Pwrd2LM{j7}5Thj1Y@{ z3<><{*U-L}MP5C?dkBu7{!>nfGI}^TK{a3!Qvvh|1UD`;>v=5ZyeCS0 zyZM#d*9D%@A42iZ#=lDzEGp)p0x$tu+nxKY6{eve0dqiqi0On5eTPW2a8%p&hpeOh zv#VDtIP9OH*K3BI0Ssn=Q~HQTq|+~KqWfGrzQ`?WKgJ8F9rhA=$*3yT-051Nnw QPyhe`07*qoM6N<$f{tLR7ytkO literal 1539 zcmbVMeM}Q)7_TxvVkTomCL+^Y*#zgVcfEdG@1$sHsg_w_rI~d&$Mx=QX`pxI?w~DG zro}ki=He9N&_Ti`78?x@D=!CanvlS37m0^u7O6DJd#U+#XghA8u=x zLmoyiU#_vDR-X|Rc$Sv&Ah#^bPL~zZ1S4OR2Bii_Nr4xL6cq3lu>u*;%SZK+k{mup zssZ>Mb zk6g0IGcM9*GLPGnc6xb%DEdeQ@%#M>ze>UJZbV5C1cG7+hQSg77J{ru1z=W4ifAwa zf#y9v(ZjJ&SR>`+N<_U}@^&l?ug_|IqL>xNlO?4M2~a*nsX!60Hyqn2S`cmEUpJnL z7VJSEKx{zZN_bkTi7P2Wmh$&(Lt&ug4Vle*q{2`|CXO!g0#>w`^m6G&!FU)F01ZJi zDgwqR+y$$(Din5NDgfg&p&^t`EpV!w5j{`is|~mcSE4!`H={~rMh2n9v2>%!Y*wo= zL%NoTa4oDLQY;N3wmp*VajsOmXK+a)4=9o2?HpGW>4cmDPUM6F&Ie%{1q!8DDcZw^ zPv(cKG#0c8@Sak@n0d|%ji#COJjDeJCkRT(;4r1cl&~6OG_Vus)G&iF1gZlX7e!0q zkMWuRn?6Kx3JLehe|jf!BsFAMd@>Ev=E*z(RvIE+nwHy%w~xzY6CsPqU=Lh4yJDcZ z6Po&U^y9~;h!=VtW^kh+xhHRS#n8kB1;N^zTOU-}jt^9|rp!z^xht{srQ)bM)0q#e zk7XJYs}HTYad7eWrjx~6qgb}NbTISa$Ok|3gAR9UWnYJ8T_dt?-;{SRM=k&TY~QI` zxM$?Z)bgaRydCqi&?B{1Hx=0P`#ZN>SakCW8$*W%^6qrp&s7bbn}^zx8n#bjV(w+T z=B(O(%O4Y~>WFP?FjcLMHs4CX@7yi9^68}**^hB>>!Z(e5-Y0JulH^F)Y;Qlo&y4!5XJy&P2X^f>R%j~fugQDrUhJKFb&o3!JHFXY<^gwY|2tX4{xoBiF>$rUelbShQFVSm%Y{Es8*(jTEf3&OGcKdF+D%@4+0EB A-~a#s diff --git a/assets/icons/Dolphin/WarningDolphinFlip_45x42.png b/assets/icons/Dolphin/WarningDolphinFlip_45x42.png index 2ba54afce0249303787fb3d94a78cc167a81a253..a2554eaa6a39e1f6484ae145856b04c0600f7e17 100644 GIT binary patch delta 246 zcmVAXYC^5Hw%FW(aRg z1gVDTBi>CLg9;r3Q$z=#H+alwx8?`*+Qz;RPw@;KewXWFEN_OQVmhBdLi08)fbPN% z+^~7+-IP0Jkc}}nY!k|?>>Q(?NokBVSC${~G(uCiPxMSc(03BnW w2}ozPfSC}G*CbDP`uM*9k0^0DQZ-Kf2O42j+piJdTmS$707*qoM6N<$f-Rk8KL7v# literal 1437 zcmeAS@N?(olHy`uVBq!ia0vp^x+tIX_n~5u`@1BDVmjn}NZ`zM>#8IXksPAt^OIGtXA( z{qFrr3YjUkO5vuy2EGN(sTr9bRYj@6RemAKRoTgwDN6Qs3N{s1Km&49OA-|-a&z*E zttxDlz~)*3*&tzkB?YjOl5ATgh@&EW0~DO|i&7QL^$c~B4Gatv%q{g&Qxc7mjMEa6 zbrg&Yj12V+fyi9f(A>(%*vimS0Sc6W78a$XSp~VcL9GMwY?U%fN(!v>^~=l4^~#O) z@{7{-4J|D#^$m>ljf`}GDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaozEwNPs zIu_!K+yY-;xWReF(69oAntnxMfxe-hfqrf-$ZKHL#U(+h2xnkbT^v$bkg6Y)TAW{6 zlnjiLG-a4(VDRC$2&53`8Y`Fl?$S+VZGS)Lx(C|%6&ddXeXo5l)>e$qx%(B!Jx1#)91#s|KWnyuHfvcmlo299R znSrq(*!kwBrk1WoW~Q!gE(Qk1mP$~)DOkJ?)oY1UuRhQ*`k=T)iffn@Wcz` zz>|M!9x%-p0TcJDoOQE-Iq{~ai(^QH`_*ZU>zWmKTucA|KmWe+?mErbXs(XSlV`YU zyj{3y=hyt?pBvV_R?6ew^D+M8uNu3qtmT_y-D0L)TyCc0dsA%UJkv=5Rzh;RJXOUd zb2IbOTqF$GpKcbJdrqLVzGd1T*X2+9*4{lY#C9V4>K2V9OE2i`>{wIr%jf)?BJJZd zuUTJdQogkH&a9}lvA4LA6npx)qIWK?x%%_%t!Ix}6uLep6h2dsS$*~Ev(@QR+>tKg z{Rx5VCNfp6n;I+CU0M0%6tiXxoBrH_wi@r8w!N3b)U#YQ?77X3J+inwuOh!a;>s!M zv#A>UI^rh96)w2m$Hn}af3o_`pcBH`g5Q$P&bQHDxm}W5pZ!?$r-&Js9`F?M>z7Y^ zY$~^~+n{bs1@D!OSqrT8+&A~yr*>6)e(dx~*IxLhbfzrnPjRGZ^@Z|QqP|R zTf{vU*uQ$uw_jB|PcZzAILGiaHBNU)cG13w&3AXCSuJ$kaL2{#H7|p$nykgUeK8Iy zEju&pn3Sd&9GD@pm18L<>(i^uuF=;{N93ug){1WBn;h+#e&AT0TJLc_#>&d$ZvF9E zzJWrXr!3AsoxANwWh&>=#qMTJV%skmUV2;@?^2MR`M%R;)nyx{?bH9g`?l#1bH%|O Uzg^}hzX270p00i_>zopr0LnWHWB>pF diff --git a/assets/icons/Dolphin/WarningDolphin_45x42.png b/assets/icons/Dolphin/WarningDolphin_45x42.png index d766ffbb444db1739f2ccd030e506e8bada11ee8..310be0f70f6b29946be012157507f1121b77dfbf 100644 GIT binary patch delta 242 zcmV!lPJPrd%(fDa9(qN`5xUe-^=N+L;Lk`VRqsAZ#lli@!k(Tt~#r2Jn}? zOQM6PRHjMa~2-;gV@-0_Z}cK6D1-i*0YhHEm{q9{3SMR=xfL^#v! znX-LIOty=}WY2vi7KY15rfEmfD}iTL-J~AiP4NYmE_SClUi``j%7~7k2|c0((0=W! sO8_~x0QcD*k{%3^{{{1kW<>(v4?%%ijr%{U<^TWy07*qoM6N<$f<7>Ai~s-t literal 1139 zcmaJ=TWAz#6rQ4%BpO*okt7zz3Bkm=bK9L=XV}qhW_HceY#KHzP4Z$UGyf(-b}pUy z<8ESW=_MtCk6tj|`k)VrCbo(SMH0n`eW+KIU`wG5O`$IeMg)Vzf7adDhv+af=lqBB zo%5Z`zqhqzdu2s+1%_dji6%LPq#u2o%9fzN?;7Dlq6)^^VVjkKImH23RI|DPo-mXi zkOGP}@Wrnnf?-SQ^>jOIPc{pxWsr*JL*@+|p)oA7EpIDoAAoo_=+RA)c=F3Qf$N$` ze9k55q%DD7y=l+^ZG$aob+Aw6HDcRVJdzhs00Te;&l_3O74jlch$|r7GgAa!aDjay z@rG1;vK5ys2jF3n@vAgV<6)izn!k6Qhd>D(EhD7l zcrhJ1i9|1iwm?z2T#n2INXzM=7@p@Tnx$CQk39VDfC-hn-*jtB5oF-1j&4KUGI1}W z(rxuakw9eMRAJc3%8 zlBq3$QTyJX$a6$&1ldyi4Pe5AEE32Sg@vDzY~7qR?1u@oXh zd9(fBtV<@eK%Tm=yy&p7{=h^#@1W)WFFSe!U5pP~o71uR`FW)7xc*=d5_b}EG@XBZ z@<7MRp-;+|o}SzJvMyfx>37Y4etBizf%0H*zaIF?2ObZt?$D;{o|esJ z*PgAOIO^*8tL%z2)|}k$DP5kN5}8qo*wNa8y?R2=%wO{gCD(`sHt}TzWQuK zMDIJap(nb2=7*ns*oDcRBbC23yy`kvKYV`ovU`a=EmxNv-90;;5r6+l8hQTp^u`Hn XX6*+%8gHC`h)Tl}u@-r>vFqE{F~5F& diff --git a/assets/icons/ErasePin/Erase_pin_128x64.png b/assets/icons/ErasePin/Erase_pin_128x64.png index 92ca5f91cbb528563ced1b4f585c40ca3e8c27c6..847146b789c59e370fe0d953026f026934986ff7 100644 GIT binary patch delta 638 zcmV-^0)hSHD2oM<7=Hl(0002`twPcO00L4;L_t(|oL!Q?PZUuUg}=Eo!3l9;i4;p> zvSVUlMM!ACUyQ_p!UX>UU3v=}6HF8aj0P($EG#gRU~O$;u}eaX9a@Mc77mce6u=I$ zad+9-xfZ+2K0M9KJGt-XJNI2wLt71@nos5pLuiJ!2ix%QUVn*jPpHBaWWe?T91<7= zHeP=lZccsA2r&p8?LN4+rss-*5P}80Un6@V0E7})0W!V}0pMr=_*j{xS6J4K45_MW z(cn-3j}r-XziHgD8cB4%LbmHPR8`AbENZIrs)y3{{r1_Us;XMm)uE;BKcl%%bHbXl zCD8k3bhdfNsRekceGqJ?QE5TKl zLl+!swX-z<-CTBEV88mSS^are_1UH-c~udoV9n-Z7=JGuE_xtXC2IsgSNa!xpscET zJgvI8*;<&gs%mY=Bn8St1}T+@fn6h!Cep7^RsP>WE>`_u&*6VH&1%zgtQ% zB&RA!Vs{eiR$D>^qO_Y=ki?DEk8iq@K-L$U;(cMcQ{V|Y>#PvL+S8HWqnEM{48MQp zdyLQIa;pQkA_=r$mw?Ye&ki+#fS}!=z8}Ob4lbZ?gD9OQ1jhQn3JuaQHHYs&)H>Sw Y2TK`T4zE$dtN;K207*qoM6N<$f)mdn9smFU literal 5220 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 I(sK{{A0@`iOaK4? diff --git a/assets/icons/GPIO/ArrowUpEmpty_14x15.png b/assets/icons/GPIO/ArrowUpEmpty_14x15.png index 261c6d89e3c9a75d61803c83569b989345cca06e..01209712e1584ef20e549704aaecac44eae5c9b5 100644 GIT binary patch delta 83 zcmZ1=lR81dmyrPo{^TFN38Zv9T^vIy<|O|)eBjgmi7)$^AOGI&BhNBJuE0PxA@PCz kfgk^Lg_)U+k}4FK8RFmZFlMXI(gf-EboFyt=akR{05#qoLjV8( literal 3616 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 diff --git a/assets/icons/GPIO/ArrowUpFilled_14x15.png b/assets/icons/GPIO/ArrowUpFilled_14x15.png index fa35eb2f827bbf3b125673521e94c40ace83f035..2c6dfd9cc6cfb8281f5fbcebba854bec6233cd69 100644 GIT binary patch delta 95 zcmZ1@Q#e5)l92%j{^TFN38XAMT^vIy<}m6qT>8)Whk@mPBjcA7OkWl-y|}=1;RR#m ue?~4dru#BXj0{Zw89?Me2FCYq86L>2$Psv;#<*4rWR|C^pUXO@geCwu@E~&l literal 3628 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 diff --git a/assets/icons/Infrared/InfraredArrowDown_4x8.png b/assets/icons/Infrared/InfraredArrowDown_4x8.png index 2ac7bcdbef24ccececa268c20e92946b4f8eed15..086fa43fb68782a318c7f1f7b09572e553adaf51 100644 GIT binary patch delta 55 zcmZpb@th!G$jAT$v$r|N0x1Dc7srr_ImrnL87UTLKFBbz?q$-6&kM-`squ96b6Mw< G&;$UMst;-a literal 3589 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 Gp$Pz%Ko5@q literal 3592 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 Kv@WysIr~3bh)e$f diff --git a/assets/icons/Infrared/InfraredLearnShort_128x31.png b/assets/icons/Infrared/InfraredLearnShort_128x31.png index 783ad0877c4281ffc9373ab39c2db754eae3083f..cd71a69dbe18a892beba5d5e11f943b8cb158987 100644 GIT binary patch delta 353 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 diff --git a/assets/icons/Infrared/back_btn_10x8.png b/assets/icons/Infrared/back_btn_10x8.png index 10d7beb30837b8651875221e35fd59a90a33fb44..64b25db5af66dbbab86ea2e32165fe6f2efb3651 100644 GIT binary patch delta 72 zcmeBWjG7?f#K-^yFB*fTfs~@Bi(^Q|oa8U%E83Iz~DdQ=R+XHS>O>_%)r1c48n{Iv*t(u1?@du978x}mi9Sv9WdZI zylBJ!`bg^?J(o)CEIF**)@ms{3uyNh_}g@Km0InT=du1DmNwp7{qFL+#SXRKs{N`N YYjPD?Hcu<|0UE{N>FVdQ&MBb@0D=xIumAu6 diff --git a/assets/icons/Infrared/celsius_24x23.png b/assets/icons/Infrared/celsius_24x23.png index 64d7a1db15f32f41a18192266d2547b05924bd0a..9a6c30c759e0e4a29d6adbf99a346bc9ca43287a 100644 GIT binary patch delta 138 zcmZo)%Vx_N369=LfI`#_L>FRvUZ9QU!-6ay3_MWvTF5i r2OF{4KcGhhMUm0F)r{J3ZvW5)?7EFE0nS7a00000NkvXXu0mjf?^b0G diff --git a/assets/icons/Infrared/celsius_hover_24x23.png b/assets/icons/Infrared/celsius_hover_24x23.png index 0488b40f571b62a87a8dc73d23c6b0163a82e2fb..f5eb3f4bd7fb48ad3d8f44a9f7f429e0b0388d0d 100644 GIT binary patch delta 120 zcmX@Z*vU9SqL7gR2rQ#EH2|pqPZ!6KiaEBY7V7u|MM&Pwc$FVdQ&MBb@02MDs#sB~S diff --git a/assets/icons/Infrared/ch_down_24x21.png b/assets/icons/Infrared/ch_down_24x21.png index 8c3f81c3d097649fda8180ca4fcb973afa0ebd8b..a3803c745c4188bf9d9eda63d05a99e16d65416f 100644 GIT binary patch delta 125 zcmew?*2g$OqKuIN2udaicLS+VPZ!6KiaEB2H*z)@h`3&y?Y^OifqlcKB8G!HN;j-r z=lC4qlsRB`PC@PdIcD~T4A%qp!Y(ein#!*)tktZ`+x&iZdy1#&b}hd+>DWkFvl%l4 bWFt25_dk@pZI|mM3bM%4)z4*}Q$iB}-IFaV literal 2931 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 literal 2925 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 Xor6nd?Fm+G00000NkvXXu0mjfZsv+Q diff --git a/assets/icons/Infrared/ch_up_24x21.png b/assets/icons/Infrared/ch_up_24x21.png index fa4074d12b421fc45efb83424908166f49529b0a..356d124f6ab062c6063252c66a24cc52073572ac 100644 GIT binary patch delta 118 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 LNkvXXu0mjf(wcu| diff --git a/assets/icons/Infrared/ch_up_hover_24x21.png b/assets/icons/Infrared/ch_up_hover_24x21.png index 944a973f4a44c288b7e119dfba09f0f52c88a138..bef0ab0cce22b8f3b64a43d2a0f08c962e8eefdd 100644 GIT binary patch delta 111 zcmca4*1$MHB7>0u2udaicLOPRPZ!6KiaEIlHwrc=2)G_BpRcBKz)42B`B;j?YXgPD z6DBk~%sCKSETI3$F{NOR>yStO&>uS)ve<0AYj>5AR{$W90N^4L=L-RlQUJ&DC0@ZjPh;=*jPLSYvv5M~MFBAl0-BNIsH z15C~g000{K(ZT*WKal6<?_01!^k@7iDG<<3=fuAC~28EsPoqkpK{9G%|Vj005J}`Hw&=0RYXHq~ibpyyzHQsFW8>#s~laM4*8xut5h5 z!4#~(4xGUqyucR%VFpA%3?#rj5JCpzfE)^;7?wd9RKPme1hudO8lVxH;SjXJF*pt9 z;1XPc>u?taU>Kgl7`%oF1VP9M6Ja4bh!J9r*dopd7nzO(B4J20l7OTj>4+3jBE`sZ zqynizYLQ(?Bl0bB6giDtK>Co|$RIL`{EECsF_eL_Q3KQhbwIhO9~z3rpmWi5G!I>X zmZEFX8nhlgfVQHi(M#xcbO3#dj$?q)F%D*o*1Pf{>6$SWH+$s3q(pv=X`qR|$iJF~TPzlc-O$C3+J1 z#CT#lv5;6stS0Uu9wDA3UMCI{Uz12A4#|?_P6{CkNG+sOq(0IRX`DyT~9-sA|ffUF>wk++Z!kWZ5P$;0Hg6gtI-;!FvmBvPc55=u2?Kjj3apE5$3psG>L zsh-pbs)#zDT1jo7c2F-(3)vyY4>O^>2$gY-Gd%Qm(Z8e zYv>2*=jns=cMJ`N4THx>VkjAF8G9M07`GWOnM|ey)0dgZR4~^v8<}UA514ONSSt1^ zd=-((5|uiYR+WC0=c-gyb5%dpd8!Lkt5pxHURHgkMpd&=fR^vEcAI*_=wwAG2sV%zY%w@v@XU~7=xdm1xY6*0;iwVIXu6TaXrs|dqbIl~ z?uTdNHFy_3W~^@g_pF#!K2~{F^;XxcN!DEJEbDF7 zS8PxlSDOr*I-AS3sI8l=#CDr)-xT5$k15hA^;2%zG3@;83hbKf2JJcaVfH2VZT8O{ z%p4LO);n}Nd~$Sk%yw*Wyz8XlG{dRHsl(}4XB%gsbDi@w7p6;)%MzD%mlsoQr;4X; zpL)xc%+^yMd)ZNTI#eJ*$O)i@o$z8)e??LqN_gLa_%;TM>o2SC_ zkmoO6c3xRt`@J4dvz#WL)-Y|z+r(Soy~}%GIzByR`p)SCKE^%*pL(B%zNWq+-#xw~ ze%5}Oeh2)X`#bu}{g3#+;d$~F@lFL`0l@*~0lk45fwKc^10MvL1f>Tx1&sx}1}_Xg z6+#RN4Ot&@lW)Km@*DYMGu&q^n$Z=?2%QyL8~QNJCQKgI5srq>2;UHXZ>IT7>CCnW zh~P(Th`1kV8JQRPeH1AwGO8}>QM6NZadh`A)~w`N`)9q5@sFvDxjWlxwsLl7tZHmh zY-8-3xPZ8-xPf?w_(k!T5_A(J3GIpG#Ms0=iQ{tu=WLoYoaCBRmULsT<=mpV7v|~C z%bs^USv6UZd^m-e5|^?+<%1wXP%juy<)>~<9TW0|n}ttBzM_qyQL(qUN<5P0omQ3h zINdvaL;7fjPeygdGYL;pD|wL_lDQ-EO;$wK-mK5raoH_7l$?~Dqf!lNmb5F^Ft;eT zPi8AClMUo~=55LwlZVRpxOiFd;3B_8yA~shQx|tGF!j;$toK>JuS&gYLDkTP@C~gS@r~shUu{a>bfJ1` z^^VQ7&C1OKHDNXFTgC{M|V%fo{xK_dk6MK@9S!GZ*1JJzrV5xZBjOk z9!NTH<(q(S+MDf~ceQX@Dh|Ry<-sT4rhI$jQ0Sq~!`#Eo-%($2E^vo}is5J@NVEf|KK?WT&2;PCq@=ncR8z zO#GQ^T~S@VXG71PKNocFOt)Y6$@AXlk6rM*aP%VgV%sIRORYVwJx6|U{ozQjTW{-S z_si{9Jg#)~P3t?+@6&(!YQWWV*Z9{iU7vZq@5byKw{9lg9JnRA_4s!7?H6|n?o8ZW zdXIRo{Jz@#>IeD{>VLHUv1Pz*;P_y`V9&!@5AO~Mho1hF|I>%z(nrik)gwkDjgOrl z9~%uCz4Bzvli{bbrxVZ0epdf^>vOB;-~HnIOV3#R*zgPai_gEVd8zYq@2jb=I>#f& zAH2?aJ@Kaet8dA4&689vDxtEDmmuRtP5+KKSC z0sw%o&>~u^fdTiKDsAf6X8&gTe~DWM4fk=i>? literal 3742 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 diff --git a/assets/icons/Infrared/dry_19x20.png b/assets/icons/Infrared/dry_19x20.png index c689c067585eee19cd671210de06ed1c4cf400e3..aab1e650fc64f10a80a249924efe3fd399527fbd 100644 GIT binary patch delta 104 zcmaFDUNu1?iID*a-1V$)0x3sN7srr_Ims3WCLH+ke?RkOMmAP8Ha0d8US?k{F=NIQ zi3fk`zbho&*A_^cBg^9>BP;NYv5i@$uZPQrkB5(8b{F5tyUyERfDH9?^>bP0l+XkK D)LbGD literal 996 zcmaJ=y>HV%6gMhGRcWR2F#rQPxfLoB@%bxFY}IX(I-!>8C`wZ`8@bq*#%k>|_LaCD z7%GMq7}yz+U}IoqK;lD)nTB$?D9LG&t zYi5nvE9|{GF~+`)C%?kjb+l;#MDA2Kw@EiNY^a&|BUExhdo2LJQzJ05th!Ea@4(GFK}$6Gsy@Ww%rv?>xselcy;EdVaS7C3f(dI)214B6|9m715J=JjwnhXrwJ(U zs=2J9YIlGv$_f+}C@UFB(Z#H;Wov37FUL*>-=Q?rA?$X$LRS$;v<)Rq z)1W9rSZ=h(ltgtxb_W+(?GQ@h z4hey*3OO)uBgYHU$n74)wsk9rDGD5HnFh~D1kZEz1t}|KO)ame1x=DlrJ|OXOIo2^ zEXqn=74rkENt`_&2XugS&#>A^Y$^ypWR*=Ec@MB#j))I>Q|sR7UKU33^|9{gUUDO` zkTnC--Tt-fL5K+`b%)|*hoSs&z%(B*aUUz=OYFzEP+hN=PEJmkyZQd>LuOVivrtdI zwVKVQIX<<*-Fn8&zMNTmG$)nkrnWvG9a@(^v~E70F{d_E tCMM3t=E%51g4vzDORSBJja7}Ejh%s`k2Q*0BHbTkl&7no%Q~loCIH4O7vcZ_ literal 978 zcmaJ=zi-n(6m}I+p-P=V2$+s*hawuEe@&ivpVd6_SgtVL@2qmOF-SnebOS>J-z>l>Wetd5feY;XhGQ7O+xGp2?Jfy_W}d{c>e(c&o$s--j?jJLIz%K9Fc=@qwS1`j^@JM zyI?2LIe||Y28n+h#Cl@DDX-4`G>jmarm&#_&ztJlO;Di`0h%ah9Z8ZwK@)M&%@y)$ zPTK~Gq^L+zk)md0RhRO5E)Ql8|#^-4rAqfwjE2S84es$Hx0;1M9*{el4hwDwW_JPk|xWRRo04%rIo7XvZ5Aq zQgMzosdM6!fX%V)1-7&ln+n1Yd1aGC-UH%RBkF_c)VjC4m%>uM8P;9iOK~X{@n%rE z+rM@_4{-sd?n1o$u#i6qxaK1+?%!v%9{({`oBM5x+sS0|`s=Ij+!O0&shxc59=Yz` zrM(q)YjqoLW~!Sn4qw*fcTdl*eH3etetovyJ~8$lt_Y9{cZQwoUpP{zTMhF~`RMT< Dw7e|g diff --git a/assets/icons/Infrared/dry_text_15x5.png b/assets/icons/Infrared/dry_text_15x5.png index 7696e1fc8a48c39e06ea76f22917b449ce0cf960..49e2d4ab535654ec87e2e48c65fcba8ac8ac2c2b 100644 GIT binary patch delta 62 zcmX@X9xy?|f{_6THkoxd0x5A%7srr_Imr`t9G>xazT#u)WHa;2Y-|h~=UJW~T~OTv OQtIjI=d#Wzp$PzPA{6of literal 968 zcmaJ=%Wl&^6tz?pRTUL1DMD!EB2gsb@gr$sD<(=}hgzzukOq+ji%vX~#A@v^_LMkT zAk-bKD)9*{SiuhvzrlryJ{c*9Ae?aCWU0 zx3~Day0*f_&Am@OQ^CIT-J^z44K!W3loC zlv9HX1cV`w2FGDyq^3C4HMpOJp$MiBc4Uf|MRnXJsMDALT~czMEGwX>OQ?kN#e$aC z9|KiZH7ILP)pCkv$OR)`0JBHr31i$dT2^D0j-O0%z*uBJI2;b8p(fF|4;5Y4p{znx z&2dC78HEg`xiHz9D_A7)Vn1R&4MC=ey7YvZA}{u`iy&IahRJMFd}c635mY2O>uL^k z-Ty;_V1Z6pi(J)vt#HyFMFh4;LQi6k-(7DjOBEUQm>@>uHl@e&K{f}J(PTg)pys6_ z*mjZUhgsy&l;XOE6DACW9&s#FGf{16fNbJ8RxDnF;OuIJxYiik13QED!t4sA}T)e!N{8BFD z#lY-t|GDdVh%Zp)E|!-c7VA$!zVk6(?u$>~hWy94(cEj>lgWg;&wu=W!_5Q7suqMnff2rQ#EH2|qNPZ!6KiaD$YH*z*J2sm7PuixZ4VamA)r!FZyP-#-$ z;V7fJ*uqJ{+2s=J8khGq{0-@CEJY9g7jOR6duiX9B7?L$uTO3|IJ4lvhQ!TjUr#-1 mHLosn^07*qoM6N<$g7fWe>i_@% diff --git a/assets/icons/Infrared/fahren_hover_24x23.png b/assets/icons/Infrared/fahren_hover_24x23.png index db922c5576f8748eafd7bc4100935fe07c5358fd..9a1f73a087b1c1feeea269c5ff8796bb8bffebaf 100644 GIT binary patch delta 118 zcmX@h*v>dXBA<}~2rQ#EH2^6;PZ!6KiaEBY77DgF2rwMH$ynIO-N>@SX`hXI)CA6* z6FB&~kLbS2y!%1@(nEv0f~WgeEdTiC)`BzllT>qFc;qjQSn;jLOWE_LLchxT8peek VeEG{g?{=z9Kg#&p5Xxtjl(!+~yL@O1TaS?83{1OV&}NQVFb diff --git a/assets/icons/Infrared/heat_30x51.png b/assets/icons/Infrared/heat_30x51.png index aca27c7c8962465c5d09d33938882fc1e4c5c824..f702816d6edd26ebc6d138426069c92eb7c189ad 100644 GIT binary patch delta 151 zcmZ21yPR=?L_H$|5Ui+deGa7ZJY5_^D(0*`w~+Tx0E6qr!``eM0v0ly%@+bCT3YxH zFj*W@SfZTpVXB6cfym|lq~=-L{_Aoz*I)5rR!&)PDOL2e-hRZ| zmp!#~-$Z+Z7{8>#^!+oxUwu*`nlIz^^7t&5s9*BB9n#kXbdMbA1v$af)z4*}Q$iB} D1W-I< literal 3747 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 H9ufZsEpUri diff --git a/assets/icons/Infrared/hourglass0_24x24.png b/assets/icons/Infrared/hourglass0_24x24.png index a382d84e215b74175071fb421eb62abd6c51c294..ce627b002ffb71e2430bd7c25bccb52dd009d419 100644 GIT binary patch delta 121 zcmaFP*u^+OqKJ_J2u|=YgaWBRPZ!6KiaDmI778{P2(Vt<``9G2VdfR5%q>oW8981Z z3)*?KnjR`MY80p|gb7=H)?0001Q6{@cQ000SaNLh0L01FcU01FcV0GgZ_0001)Nkl%4FE)i&Jt? zJra-^F>7x?MzN_A7Ty9F%HI0PXpyh4hW!KR*kKE9cKy^QH+$>;57nvP(F42taudja R2&4c2002ovPDHLkV1kQeT5kXV diff --git a/assets/icons/Infrared/hourglass1_24x24.png b/assets/icons/Infrared/hourglass1_24x24.png index b4cc7b4623ca4e3062db549e759befc43cf16b76..ef048a7bdab260080ce7c6458fc4c9a3a946a57d 100644 GIT binary patch delta 126 zcmeyy*v~jYqMVTd2u|=YgaWBBPZ!6KiaDw$HwwB2h`3&?T_=6HL2|2xulD|q`9h1B z8|8XBBtQ2Z@S4sOV-oq(V`cC~5eEZ-FH7ol|4F~+%i3qnX*MY}aOd*`Rf)ihN1UgB dJLsx>nERQm%+xEvZ+?Jm@^tlcS?83{1OPrdFw+14 delta 230 zcmV3m5b%rM>6;&NK;tlsA!izmbGz!}wLQ2Up5-JD_ zqv-{>%H4-a&O}iopE)mfq=+bM!28xlsycDJa$a}kYl(svc3&A?*VeXE;#O|DW?a~1 zZ^XyO$UqG3kCC}p)qz*vg{CNH?GI0Tkd6!eBHki@pA=CB=~gJBqbYoCuoW|#AGMpA geKh}<>eg}e0a;CWAO((dp#T5?07*qoM6N<$f;-Y&+5i9m diff --git a/assets/icons/Infrared/hourglass2_24x24.png b/assets/icons/Infrared/hourglass2_24x24.png index d2c3709f7044a68fbdab07f7a33e35a9535f6b73..918bd79d869be1a4d5a2c6689cc237033ba408ca 100644 GIT binary patch delta 120 zcmaFM*vU9SqL7gR2u|=YgaWAmPZ!6KiaEL`HVQffh`3zbeZD*MK+io<#ng^EP9|H4 zi3k3O3e0(O;(+h;-t$w~LUkEy!h(|f)gK>r{Qci`!{jN8c3n+SV+hr?;mMqTr^IN_ XrD*BXY1*YkMQ0wO`KKkqfsOo8#Gat4%!n$p2SW*YD^9 X^I3HomLwGW00000NkvXXu0mjfdHP#Y diff --git a/assets/icons/Infrared/hourglass3_24x24.png b/assets/icons/Infrared/hourglass3_24x24.png index e7be1e99557d8984bb5bb0a3d7ff053d730198e1..dccaf46cd75ba3bb40913879a1bac092c41dc550 100644 GIT binary patch delta 119 zcmcc5*ugkKqJWVB2u|=YgaRplPZ!6KiaDmIHu5$Yh#U#HuWqW-Fy*O4%Si>H;0>-W zQ<G#olRIdy^I(u1a+k+G@`_LZ#pd`1U<{B$i)(%<~+V)NhH-CX9DH>Vy`Im~R+ VEb%YBEqyP@3Qt!*mvv4FO#u7DEzSS{ delta 207 zcmV;=05JcE0p9_T7=H)?0001Q6{@cQ000SaNLh0L01FcU01FcV0GgZ_0001yNklp4^BYJ0S63Nj3obT` zsZ82?lQ(fsyZGabeMdiWly92H7P~-r3$x*D&Dk+Zs>>d17R}dx!Q%X3qRZayGQK*q ez_mLh_Wxs);nLzh^KbbHkX4?pelF{r5}E*&Ofb>_ delta 223 zcmV<503iR60q+5j7=H)?0001Q6{@cQ000SaNLh0L01FcU01FcV0GgZ_0001?Nkl<`NNkvcDoZM)2Wio-!$f=jaXa;L|NCDPgVPywSlb|%vH{ZHlUx4MSm>Cji6uw6JK3jn4EH);rlZc1@_i5h0CV+Td)>&)CRhM` z=zEp$wX%ge?*ZasK22>hR5rU6+ePP~iWO5zB`shnMQ=fjh(pJk8`7N;OG`j!Yq|ml zK-}PzB|+_&m~{qc$DAF!B(TM?dXibmf}%8~(WII=A_~?*x~*N2)pe9Q`}Rce+f=Niy@^CbWWi>w;wt fvS+qSxj(*Ye~wAx0K+sZe~?|Cu6{1-oD!MNklEc9w)m{tPfH%u#6{_$N|Cs$Ke`#gkN`lo8Du2)~{>Wzh}W)1$OHmEdr zEwZ`2#@itamF+ZwQ7D|C9Q2Fz_0gp@HKb`Fnby#1feI1X>$aVRLNv58Xt_h%`wKkL Y13@02EsYpGrT_o{07*qoM6N<$f?{P?$p8QV diff --git a/assets/icons/Infrared/max_24x23.png b/assets/icons/Infrared/max_24x23.png index d4163a65f888ac23b84d1e0d072330b34e9390a4..b7836abbf0860038a1d6ed0b83dd02c9c57b78a0 100644 GIT binary patch delta 129 zcmaFBIEitBL=__g5LiZSY5-D^o-U3d6?1eCZscupkZ8Er->05AWN0pJ0U7=H)?0001(q}vHW1xeW!01+u;qf|(eRPGQ`Mf=iPLRRTm zITV%BN}!dpw>-30Hr5B~C@X71eI>QVnG&sWtT?N6{mTMSJV}v$`BRHM0NbZw551r5 zpZ3wtjfAy&NTW7nCrSf3Bw_bDk#*~vUDi8Gv@SpXJL>;}6nOw_O?WZ5x_Zw50000< KMNUMnLSTYT+ER7^ diff --git a/assets/icons/Infrared/max_hover_24x23.png b/assets/icons/Infrared/max_hover_24x23.png index 65f97b0ce3a52af81042eef38574f0ece8cbf1a0..f3e87a5817f49a0fab2959f55163b64cc1028c02 100644 GIT binary patch delta 117 zcmcb>*v2?PB9D;)2rQ#EH2^7JPZ!6KiaD_d7xFe32((>%Ul;1!l;UI7pv%G88&p-w03af?ZFCfy>_Bd~wo)h@E36nQ z2C`BB(c=gkJVceOZPewyHL}82YiuiikY3qN96^2!yWyLwsyWTW<^Y;yo2)KTT$2^; uQd|i)?{7r@N9&X3#Q|{tE59#JeQOUQmuu-+#jW1}0000k diff --git a/assets/icons/Infrared/mute_19x20.png b/assets/icons/Infrared/mute_19x20.png index 410e88ac2ed248413b3c80bfa62563f3b2fdd227..d767e2f9c049b6ce6d6d0d9a91574f5e25c3a59b 100644 GIT binary patch delta 108 zcmaDRRyRQ+jgbKe-1V$)0x4Hd7srr_Ijjd43N|?KFdY0X&Bnvl{VT{xeafe$OQm$! znAP4)niJOQDL&zVRK$bQ$Ga4aKRx{XXkQ}pZ3iL7$#eRy@jha|`HcVMgEGUHAcH+! L{an^LB{Ts5F!d@N literal 2918 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 Q#{d8T07*qoM6N<$f=M%l5&!@I diff --git a/assets/icons/Infrared/mute_hover_19x20.png b/assets/icons/Infrared/mute_hover_19x20.png index e9a5b35102782da59c7ba4993bf8c60f355d4bdb..cf899b8835188cb1df914de2836bdd44a5c7916b 100644 GIT binary patch delta 103 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 diff --git a/assets/icons/Infrared/next_19x20.png b/assets/icons/Infrared/next_19x20.png index 512b68745ac452eccaab049c59fe7133db57df1a..6d48639b88dc502af088680ba1c47dc9050553ce 100644 GIT binary patch delta 106 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 E0Cw^t1poj5 literal 2873 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 E00he=jQ{`u delta 176 zcmbjf#HGqL}ehwS>O>_%)r1c48n{Iv*t(u1&cjh978O6uTDP5b-;kb z+4trD|C_8?cKKdT+^cJ@=%2lzpxl@_AyshZkq8l2`>=jxMv3KTF5TH$GwoAg)0ynk z3Xigvp1fQ9L;sWV6Q1wFzYH~vmlRbLE^A4B_DIM`D`xM)xuz@T3%qj9YujyNr@r!H c!^`~)uL3jf#HGqL}ehwS>O>_%)r1c48n{Iv*t(u1%o_Y978O6lmGnxZ_muk ztgNiee34-htJ_456PH~L54^KAIW8d0HKR`9RQL`N!3#a{QohqVHy9T*ELpvk&FgSKuX-x#WAE}PV$_OO)obwUf$2{1c&%d*$Y>+wmD NQcqVumvv4FO#lpC5;Fh* delta 112 zcmWG&Vw@n6#lghD!0=CERt1paEbxddW?-`9RnAl+Y+*OirF>&~ptenEQ^S9MQR;jdrvbIa9B@86ze{Ix*&$0NDfYk~S1 NJYD@<);T3K0RRV?CZzxX diff --git a/assets/icons/Infrared/pause_19x20.png b/assets/icons/Infrared/pause_19x20.png index 99196d23b5a8c092a84b47cbfb995ae3c7af0796..f3fda0fc458f99d15c90815129935cfa9b4d9c69 100644 GIT binary patch delta 87 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 diff --git a/assets/icons/Infrared/pause_text_23x5.png b/assets/icons/Infrared/pause_text_23x5.png index 72c7b04036f195a8362e8fd69e1a284a5c2eb9d0..fd991be3b9de4137b95bc2fbc31a8685b81837cd 100644 GIT binary patch delta 67 zcmZ1>7CJ$~mXQGn+Wfud0x20!7srr_Imr`t>K>RN`?WXl&`+yiqr*aKZ0|G}tpBs7 TCAJC~gVcMv`njxgN@xNA!jTnp literal 2856 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 Au>b%7 literal 2869 zcmV-53(E9~P)StO&>uS)ve<0AYj>5AR{$W90N^4L=L-RlQUJ&DC0@ZjPh;=*jPLSYvv5M~MFBAl0-BNIsH z15C~g000{K(ZT*WKal6<?_01!^k@7iDG<<3=fuAC~28EsPoqkpK{9G%|Vj005J}`Hw&=0RYXHq~ibpyyzHQsFW8>#s~laM4*8xut5h5 z!4#~(4xGUqyucR%VFpA%3?#rj5JCpzfE)^;7?wd9RKPme1hudO8lVxH;SjXJF*pt9 z;1XPc>u?taU>Kgl7`%oF1VP9M6Ja4bh!J9r*dopd7nzO(B4J20l7OTj>4+3jBE`sZ zqynizYLQ(?Bl0bB6giDtK>Co|$RIL`{EECsF_eL_Q3KQhbwIhO9~z3rpmWi5G!I>X zmZEFX8nhlgfVQHi(M#xcbO3#dj$?q)F%D*o*1Pf{>6$SWH+$s3q(pv=X`qR|$iJF~TPzlc-O$C3+J1 z#CT#lv5;6stS0Uu9wDA3UMCI{Uz12A4#|?_P6{CkNG+sOq(0IRX`DyT~9-sA|ffUF>wk++Z!kWZ5P$;0Hg6gtI-;!FvmBvPc55=u2?Kjj3apE5$3psG>L zsh-pbs)#zDT1jo7c2F-(3)vyY4>O^>2$gY-Gd%Qm(Z8e zYv>2*=jns=cMJ`N4THx>VkjAF8G9M07`GWOnM|ey)0dgZR4~^v8<}UA514ONSSt1^ zd=-((5|uiYR+WC0=c-gyb5%dpd8!Lkt5pxHURHgkMpd&=fR^vEcAI*_=wwAG2sV%zY%w@v@XU~7=xdm1xY6*0;iwVIXu6TaXrs|dqbIl~ z?uTdNHFy_3W~^@g_pF#!K2~{F^;XxcN!DEJEbDF7 zS8PxlSDOr*I-AS3sI8l=#CDr)-xT5$k15hA^;2%zG3@;83hbKf2JJcaVfH2VZT8O{ z%p4LO);n}Nd~$Sk%yw*Wyz8XlG{dRHsl(}4XB%gsbDi@w7p6;)%MzD%mlsoQr;4X; zpL)xc%+^yMd)ZNTI#eJ*$O)i@o$z8)e??LqN_gLa_%;TM>o2SC_ zkmoO6c3xRt`@J4dvz#WL)-Y|z+r(Soy~}%GIzByR`p)SCKE^%*pL(B%zNWq+-#xw~ ze%5}Oeh2)X`#bu}{g3#+;d$~F@lFL`0l@*~0lk45fwKc^10MvL1f>Tx1&sx}1}_Xg z6+#RN4Ot&@lW)Km@*DYMGu&q^n$Z=?2%QyL8~QNJCQKgI5srq>2;UHXZ>IT7>CCnW zh~P(Th`1kV8JQRPeH1AwGO8}>QM6NZadh`A)~w`N`)9q5@sFvDxjWlxwsLl7tZHmh zY-8-3xPZ8-xPf?w_(k!T5_A(J3GIpG#Ms0=iQ{tu=WLoYoaCBRmULsT<=mpV7v|~C z%bs^USv6UZd^m-e5|^?+<%1wXP%juy<)>~<9TW0|n}ttBzM_qyQL(qUN<5P0omQ3h zINdvaL;7fjPeygdGYL;pD|wL_lDQ-EO;$wK-mK5raoH_7l$?~Dqf!lNmb5F^Ft;eT zPi8AClMUo~=55LwlZVRpxOiFd;3B_8yA~shQx|tGF!j;$toK>JuS&gYLDkTP@C~gS@r~shUu{a>bfJ1` z^^VQ7&C1OKHDNXFTgC{M|V%fo{xK_dk6MK@9S!GZ*1JJzrV5xZBjOk z9!NTH<(q(S+MDf~ceQX@Dh|Ry<-sT4rhI$jQ0Sq~!`#Eo-%($2E^vo}is5J@NVEf|KK?WT&2;PCq@=ncR8z zO#GQ^T~S@VXG71PKNocFOt)Y6$@AXlk6rM*aP%VgV%sIRORYVwJx6|U{ozQjTW{-S z_si{9Jg#)~P3t?+@6&(!YQWWV*Z9{iU7vZq@5byKw{9lg9JnRA_4s!7?H6|n?o8ZW zdXIRo{Jz@#>IeD{>VLHUv1Pz*;P_y`V9&!@5AO~Mho1hF|I>%z(nrik)gwkDjgOrl z9~%uCz4Bzvli{bbrxVZ0epdf^>vOB;-~HnIOV3#R*zgPai_gEVd8zYq@2jb=I>#f& zAH2?aJ@KaetQMm5dj|JS$+3_GYk9*ddBj<{mnr{667 TyN&*k00000NkvXXu0mjf0h(^r diff --git a/assets/icons/Infrared/play_text_19x5.png b/assets/icons/Infrared/play_text_19x5.png index c5f067bcf4fc6fa5518d744b829510728896fbc9..375f8155e438a32aa1012941494d7c2236f71d92 100644 GIT binary patch delta 68 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 Ct2{>l diff --git a/assets/icons/Infrared/power_hover_19x20.png b/assets/icons/Infrared/power_hover_19x20.png index 3a41249ff30c4e1fad3738add47af077be33a49e..c8e30cafa89a409e3e493e31ac55c16115abe1f6 100644 GIT binary patch delta 97 zcmaFDUOYh}nvnqr-1V$)0x2s`7srr_Iibf51rI2QupT@s&6VPEYI@TY59c5j10Swc yFa-v`L-NNOcvZk%+`VFZQLeTKio4N}Rxe z*iac5*^rPbF(ENCuplIs?jZ3uz{G~iIZaXqf+hRCJH79Fzdk>&ZQWa#zdjEDSg3AT zb#AZn_uA|f|2B_)Rk&GXem(&S%dk0@g0f4C`uhC>pd(&{J zFXA*tO#G0e0Vu2{A$Il%gDtY_1*Y)h!$$#nt|{El*^(Wula9C1kH~g^tKszb9NiUG z@4`Z2Z~~t&3=@Aph>gS)2D}FM(`zKaK?vJ3g|niXb`7r6h(KMGvyLRma77n!-qlue zs-`bPMN(8GsYp??vT8^cEzqL(r6dSx~?Nh zL5h;)5!tvGFq~wAI5T3fNbE#j$UGXrlo7Y+Au|PD>{%CnIHnEa;iUM?P=Z4wi&EOv zDA2b5AL{$#=$O^XdA?F~fmFs+K8m64CQqJGmBhA{Oyt zP`cZ{c0Ib{0!rPnc==&0e-d!bM_k;WAO3#Ae~g*hW~0pQ>FMe5*Vo^wA9zO+B XAX5OhdzX(+I2Wjvx2$)ioo9al1p3a#)+@eXre<#L$0oT97Cx*B TTtB2fg4BDu`njxgN@xNAmLwFC literal 981 zcmaJ=O>5LZ7#^*aQm6-^pq_>lv4WeKe5|_(jitLu?ZT!k+o*feW|L_*w8_L|>ZW^8 z@T8!4@}}Y+P=A16!J8*RFCrf5FYw?GSSQ=vtq0dY^1d^?&+|U-M;ou5CRadVzoEw(|oSl3MmSn+9_z*^{TlO}Qf{kxyY5&%<+fzx6w zyRLgQ6x}>V%)*$X0a#kjV%OUt47SO35E;U+_Xh$Dd_%ZZw6PsmNhetAC1j(w?s&Z& zPxFQ4Yj7#kIYCI63$t)HO7+YT2E01=^J^r)K?vJ1gd{Oxmh7f7e)*wNxdY9SwJJ0GrDcM#|(jsJ*py%$Fxy8>=f@A%G?-9 zBF?KC1={xiL&I-YLb-hB_5yM)2X*t6BleJu( zh(%ls%4hr6tVdUTfpT}ey!rRy{!?nUMhq-1V$)0x2g?7srr_IjYAL1sfbhSPwkqZFUlPxJbsg!)c3rD+h@4g0k){pSG@k=PKTl3p-ECf=u;v^>bP0 Hl+XkKQWYk% literal 2893 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 diff --git a/assets/icons/Infrared/prev_hover_19x20.png b/assets/icons/Infrared/prev_hover_19x20.png index be9dce7004e32a96e301563d942082c904172265..51f5779f06dd8e2153b97a5542103abd6e7c7297 100644 GIT binary patch delta 98 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 b0k8TAgTe~DWM4f*+dnH literal 2844 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 N002ovPDHLkV1i0;gn0k} diff --git a/assets/icons/Infrared/vol_tv_text_29x34.png b/assets/icons/Infrared/vol_tv_text_29x34.png index caef54c25841658a5fa3c9412deeb69de7f45546..166cbdce6d778b0179a1826d9e0896fe1c853e6f 100644 GIT binary patch delta 116 zcmaDM*2*|RBA1Z?2)d8FzXhaxJY5_^D&{25`2YVuvl=TK8>1Q<5KQ7Y_MeBxex?Kn zocgrR+Td^b58Z<)2M_#d>}+iGZ1@=WTGX#aNaYa&^I`r=In@Uad|+gFUoEWra@XZM PAoD$4{an^LB{Ts5!0Ih{ literal 2920 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 diff --git a/assets/icons/Infrared/voldown_hover_24x21.png b/assets/icons/Infrared/voldown_hover_24x21.png index 6bc57c70eb593c37d5074810bc3c5f828f21e181..b9ac48b4e0d2622a8bf8a85bbaf8de2bc68da348 100644 GIT binary patch delta 94 zcmX>iRxm*#f{_6TN+t<+11WP)7srr_Ikm?WMHv(sSP!PkGkLNs65!n=*e3D+N~9aF v%@m#g`dz}ZA=YQzwi`|H?8rI6x$`H(ZWC_f(ktt9K}LDH`njxgN@xNAE=e9W literal 2884 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 diff --git a/assets/icons/Infrared/volup_24x21.png b/assets/icons/Infrared/volup_24x21.png index 688552751ce0f8f12172e1ac1b0cee0366f9e11b..ebc3f3e42b478a3565221161088e181f52cfb8f5 100644 GIT binary patch delta 114 zcmca7*339TBAbx`2udaicLOOePZ!6KiaD-_4fz}bL|iUfPmb3pz0o^YP&-*wh_}^g z;SbJ_CPM0#Tn5t5j_AzbocBUz%dT&4W?!0li2Y=-afOR#cIt!pWINj`#;XlN0zA6< QMj+EYUHx3vIVCg!0G=l&%m4rY literal 2910 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 IM6N<$f(6Wjg#Z8m diff --git a/assets/icons/Infrared/volup_hover_24x21.png b/assets/icons/Infrared/volup_hover_24x21.png index 5d790e7966f5b842fd74d692beae068c1b8766ee..1d35173d1a2d8a3b193a7d107a4d62afe1b86056 100644 GIT binary patch delta 105 zcmX>vRy{!?nUMhqN+t<+11Tp@7srr_IiZIa@-{dKFdY1Ax}{-B(2r9bUm6cI)>JnA zdFU}C#jEMgiN-Y(ROTK%7nUT&GpqN*lfwOJ+MLRVzAq1oQ&tncmr>-f24t$ItDnm{ Hr-UW|ykaYz literal 2895 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 V$$3O*)*=7^002ovPDHLkV1l??v5o)$ literal 564 zcmeAS@N?(olHy`uVBq!ia0vp^Za{3##0(_Q*j*_GQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIEak-ak_VsVc!u29#>zM zpe>@TFN4o(&Pl3vi+VSCalkpl<1-|z7e;zZcA9_tzMb)a%YyZXbT9S%slVv8B4(m! zQB<4odqHhcAcx1J*v z3=wN2`Z?28g|9oToszWvZ1Q%gU-3CQ&KexiQY$8Ov6r}C)7kWdtBQTr){lx(Ec=bC zJ~Q&3s$W>TMdNE9^TewT`{taq@-NsUbT#V5YvZir8#@}yYWbQ@gq^dQV=c1uO85p% zu7&!iM0PFS&CylzUF;;Uq{{b<33t9ZYoGO4a?5z)chwiB7d+mdKXNQ! zC8<`)MX5lF!N|bKP}jgj*T_7?z}(8z#LC1#+rYrez#wW)@(&aZx%nxXX_e?2jIB&e WAR26gp6CHJFnGH9xvXt#F1YT;QfcX8cna&Us6h z{5Z^ITEXPpK*8e1px3&0I@gos?21M+z4q@qX?2Fh3iT6qP)9hi9;qdn8!Qx7GlM-f zV#r{rmb6W#++(_?o%Zs>NMZZcv-`caK0SD|$GaqVle8LP3fm8{KcLU5ciF{px-?yq zaaL&+GEx2ZEy+Q1n(w!hXvObeSE(IsY`W|FCX-F?v~7OlKQWfX95?S-RsaA107*qo IM6N<$g7zA;cK`qY literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^Za{3##0(_Q*j*_GQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIIqW5#zOL*~S)|zwMEwOP0bRhT=jq}YVsW~6vh}*d3IeXN zN31)4cfL?;Xp|4q@cp7B0AV+D3);<=5C+e>7`V7w%P2TFhy5iBW=eV*l|y0v``5 z7c}!;@?t5zz%zM8QuBkHi+-}31P=zw=en49-z^IZJ@Z9q)`F9UPbWS1RzI#F$spI2 z;icic(P-C974aXl^rIX@_2%)r-MJP0RY5XW^wsR|9a_Obu2*mWV~~Fy8TzMR-x3&@ zswJ)wB`Jv|saDBFsX&Us$iT=@*T6*A$UMZr+{(n<%G6TZz`)ADKvUeQ3`Ik3eoAIq bC8h=w6NrYd=Ch{&H86O(`njxgN@xNAhg#0O diff --git a/assets/icons/Interface/SmallArrowDown_3x5.png b/assets/icons/Interface/SmallArrowDown_3x5.png index 1912e5d246268d75a20984bdc8b996d503f3d166..e795d67087cf7c36ed1d29af4abbc70569c68cdc 100644 GIT binary patch delta 53 zcmeB>ai1We&&U7-#lAm6ffS#oi(^Q|oaBUr7YREU8JNl#6T|dEe}GhYy85}Sb4q9e E0Cx}$)&Kwi literal 3592 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 BDRuw= diff --git a/assets/icons/Interface/SmallArrowDown_4x7.png b/assets/icons/Interface/SmallArrowDown_4x7.png index 5c5252b167d2f9f9a1ce5e7b9f9c99123879c1b4..0cda838e058b7cc79dffcefc04125f8008d556a7 100644 GIT binary patch delta 54 zcmbQ@=s7{sfB^`y_DWm;QUabXjv*Cuk`od#k}QsW;A3FD#ANQ`aIXoZ#?#f$Wt~$( F69A||5F7vi literal 8340 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 F2>_v_4<-Nr literal 8552 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 diff --git a/assets/icons/Keyboard/KeyBackspaceSelected_16x9.png b/assets/icons/Keyboard/KeyBackspaceSelected_16x9.png index 7cc0759a8ca6acdb9b9c2e3dc00edde2f0e93a67..1df3f7fc99dde84e8d74305b6c254d7ebc1696a2 100644 GIT binary patch delta 72 zcmbQj7d1h`iID*agaaqe2U3cjE{-7;b65{5GBOx&Fl=aaio4V>i^aWWGo$MKIhRFl Y{7{HxN-~kpUk1|T>FVdQ&MBb@0L&s4eE()N{W z-JN@vFI~T+Y1-v}FWiIo6?k5J;aT|qw)dv2CwcE-scA1=t)FMK&%d~)Y0rO}4EC%2 z=aK4R$F?2(hE6fX7H(UFBH{$t4v4EaKLer_Vi@d&Z#A)C)-lFal?RqJo6XEw%T&e4 zBEIiim|Bz~ut4QeR$2KDgeVQ)Gl9#&Q7)}LS*mHl<@TY>s++4|`B+t|9IGdATYvr+ zL&4Vp^Jy_zlt*w&PGkz$CD@V$zdYy`l2xi0C^cC%YIhY;r^KZCtp`aa)U15HX4E*y zkX5o{K-UPu6k#$T&@w-;?b`$g7%xpD(1BnTyO^;O$?)hRrco61v$A3tm;JC~04Xy` zM9{K5&YYn{cI-;z+O~({*abcDHnS;pNXu(4c!7VY__VG>?Z1?*P#iGU)eM+zGa?B_ zvgI?>CU%T`*JH?wZ6SP@IW~7zXzvsW>>M^Zjasu3fJoi8ARJ`vf+uoa+eOUrBobcB zw>cJ!4w<1pj@wleRYXcabz7&```zwtp@zu>K9qa+w)FmX*CD>+AZijr7d#lMB4r@7 zBxNIM<=Lo~JFR)Z8qvz(k!=8Gk?gq@8g zfS#k0rCF(l)r=K#a|A8Qr4h!%R?w1c= z{pq*skHW8}pZxgsP>68$^3NZ9>0PQ& Cw>kg- diff --git a/assets/icons/Keyboard/KeyBackspace_16x9.png b/assets/icons/Keyboard/KeyBackspace_16x9.png index 9946232d953ef1cbfbf0e6754be6645e5ea2747b..895124807c8a8cad72fa0646814ff485c273f5e4 100644 GIT binary patch delta 74 zcmZ3=7c)V^g^>XWgaaqe2U5zOE{-7;bCNR>QhxoP{*s;fGCSL{**ZS2>SwS>%&?G{ aAu*G&%$;pghFZ81NSmjtpUXO@geCx1Bo{IO literal 1829 zcmcIl&u`pB6gEEvMG+BPN`-{wNT>+Lo*8@XwOcpZ?1t{5I;81J4Y!WR<6SFjkFlNX zCgRjnK|!3jpo$Y0E}Xb=;LeTzpnm{T)f-4i;dy_hpfu#tmAsxAzxTcGz4y(`m)l!6 zS1w(-q$tWtuiM#y_bNQEzxE>h|J=PM>Pg=HtW=aY-mae)lh*~S0I8^$I!Q-a=}mlXitE9+UN$s!YEtd_TB{DI?graxTNXmKb&NR1RCQdP z*p_AEk5q~&HgLlr6cO9QmPZ_Q{?i~@5yjq4=i_-SnEBeUs&daT#^bR*Hg#DH4C1=3 zfvG_$0t-|gW)+*DtXx|lbVSLEB(D;gsWl=C<$mRBz;u>EnlE9qa$Y7Vm@#3wL3CWF zv@i^U^G(xqX_e|ijf0zqnN0f5E;9~PYWYyXtSU!}MEQj(L+?JpJ#W3Q_ zfcbtgnwBTxh8T$yuuHHdQ+~PEE(EJ&(U)?xXw>#1qDqNQ)vI@tERy5$gPPIYL3CIp zd=0ur5T*!|K7p3G9x*>8*u!{c8h{QWRntB?yEl08lWCYa({L}SbyS-h=I2pl*a_8oT+S_c~#IXiq#zs}!z^4spCcOR_0+*o_q`N6;X{rjK1`QsBs`Gcx|z4v#k QTVG_o&8^N)8~5)21Ktij=l}o! diff --git a/assets/icons/Keyboard/KeySaveSelected_24x11.png b/assets/icons/Keyboard/KeySaveSelected_24x11.png index eeb3569d3accc5a5c56829b12c85079172b56729..25bc446e485413a6c282c94a7037bd6c4657f33e 100644 GIT binary patch delta 76 zcmdnX7dJt|jgbKeeEkX%fRw7Ii(^Q|oaBrI2Znjm*?O9UKKa;7@XYvUFehO`MH<8O c?1TgshVHFweJ^;rdq5gJUHx3vIVCg!0ANWN4FCWD literal 1853 zcmcIlPiW*+7#}^zw%YZuf+B)3d$6*;fxiXAXK-X$#&ks`?Z1FR>QX z26aVbT~%`&N5w=X1OWo&yGcQZD9KMx7+O3JvM4Pgkw_&Y^~HA4kU?pcLYz)%lYCqz zD405=sj4ZsOlbo2yrZFUJVocl(hfu!>phe>@9d^rUFW&j&H}!)!;|9lBv{%Lg~)s2 z4%()#|Dlit(}3xA)*qFJ1uF0J7`Su5Y9oEA+srsEMAi|aKWWt3B%(w#g-G)oQNqL^ zf1*@0Ucg(l;0+nNrXfra);gN*63r#X84bG_S5Oapz-U2_2No;}caH=0Jhz?X1x*6p zZZ%{Or9=^P?a(oNj2+}NPLO5lb>xS(hK#yzQ(Fto(z;~|u)ZaN?XnW(`pULU1i&$^ zrW-ON3~kFtm|7MJL)}ES1tUU3N-T@l>$)*vdoGLM%c1>)tfeXjj8tQ`U&jXGx~+pC zJw&zve}0HDBg6^Jz?Y@lahswqGEXq5ZvEhVyV+dJL>TqqMZUhgD7BZGrskL?B8nzU zEO0}S#T1Md#k9-SH0hSMuhLzKa_I5y_(QtDUmB14ku-9rOM~*GXvjh71`cJarlUj3 ze7uCJ^@AP<(j#0_!EzB61Df%LF0|x7U8vqkd`@?cmVP{k{EyPdWes{X>2la%Rk=(? zE%&0TDeAxbb=w#db1i`F%Wmf5GAz>Wv>@jW_p)ho-#0CeC9cGbyZ*s9Cn^o)Rq=_$h#NIZix%+wt GFa8a7)lmol diff --git a/assets/icons/Keyboard/KeySave_24x11.png b/assets/icons/Keyboard/KeySave_24x11.png index e7dba987a04dad7dd96001913c55566dbde96c8e..328b726a54215de710c5247a6bdb64ac47fe213b 100644 GIT binary patch delta 92 zcmX@kmp4HojFABdeEkX%fRw4Hi(^Q|oaBszgoK~}|Jw^QGc#Wn|H$pLpMOunql6s? tjvPuj_~lw;gX^Q4^=fQvY+`P1ZVZlGJXx9D1^FO@JYD@<);T3K0RYzSAe#UH literal 1863 zcmcIlO^6&t6dpxnjjSF75f9pQJZy|LUDdzSZ6$n-*6-2D5s-9_fx~uK( zotfQBVDX?Q(UXLzXF6aX)%U*l z-d9y`w^q+Do_PF3p-@5qOL5h2N9RU z^i-~BIziNECdw*wjUcQeOxncsbnKa>(*%1MPoPck0jC)~9$50g-#!ks+4LGwn$d`f zMy;%ZsA3Rsk2!`#ELuW>2#g3fF>;CFBHMCo-El0(@X1&g%&$qdl~*F4Kd~*B3^?Z1 z^bEmDf}0)Wn??sYC6l9$X;6esLO7#_ZCmDy?ZqU3l|%anS#wn!7%f39-Qp(l9fyJ- z(?=x}n~2%2PcX9#VmYdECvH{tWzv)!s%sn^Z&a(TMEXG=KBQ~smzBm!)h4cOBfSV| zapw6l2`LyY2x(Vnan#Li4>BO#dXPeox2Fr~f_P*4)DM)gJ3Y$sMNw8+?gqit>2PpJ znU9yygm%~yKzf8rCa_fc*^nlp(uJ1%rwg^aiBIX^Xz9mu$p0vPT2|JhQCGkYtEqW1 zTD})enxg%?Uw4c#Ggk#{pLa8zmSLH8=LI=?xR>pc=yYsHAgcQUxz^arx`9fR>e$sw zj@}Uy75!kQXF{tT9e=F+z^*!*3|n>nI6oucWq!(t2og`=40-O!tAE1z^ID@;X)nEd zVK7xqj`wg%Ed2Op{k=a*YZpKHX787$ zzhKuN9(?M5ojmn%xcU1}OP>$^`ZD?cW@lIaTn=x3xBtP#z16o~{qVMZ>hecsD?jQQ ME3387mS5lf8`39Il>h($ diff --git a/assets/icons/Loader/err_01.png b/assets/icons/Loader/err_01.png index 7ffdf761da64afe452664bd98020b59c06b81c32..f8a43d892c03d20c8d5f02ea567d5d15df9dc069 100644 GIT binary patch delta 177 zcmeBTKFByhqMnff2;NNEaSljzc)B=-RLo(lWoY`(z!>bnz*55&qsZVYb&-LI;X4D6 z2xeelvGD0*U|z;J*WXv2T4a-iP30SrtvlIjc$u1B@lfu>Hc1rlffG%#5>h61G{8yIZE Wl;-uHI?oE!!r0fhd+0g3~V7=H)`0002Q>4jqe000SaNLh0L01FcU01FcV0GgZ_00001b5ch_ z0Itp)=>Px#1ZP1_K>z@;j|==^1poj6A4x<(RCocERf`IQFbu0>-2Z>C2p;3CthiSr~A%hmu>ddy!v{K|FH+l)<2PJ+0PaQ&pMpWpntqs%_AuTtNkrr%8bCt z63GC=Yh#Nl=?LTq5Rl2(B8AftKna2%s5;|tdUdZe3t53FPEc;V$q&^J%CoLQFdfYr zDj(q3t+gERed1Upqq-iRyU8!p^ddRgX{`3*{^lIEl5DQrpfclYIO()PA5{cM^jB7t zv)Q2x;FQDut#oYsLhWI}%(}`?+~2NPUamuI&C0p5cBwkW{&0DdV;RDV*d>~~#)l=d zmyroENL+HVGUdzYNKy03FXf}fbnz*55&qsZVYb&-LI;X4D6 z2xeelvGD0*U|rpLspsC@tK!W#A1CzzWP@r^W1H<;~ WiUD6#154jqe000SaNLh0L01FcU01FcV0GgZ_00001b5ch_ z0Itp)=>Px#1ZP1_K>z@;j|==^1poj6B1uF+RCocERtXM-FbKq^+5f-Sn7FCC7#wGy zCD9(z;ij6Io$5J{osK?d`|Rm9-p6i8TmP7U^SO_a;#q~$5q}h!*?ts?z>L4yB4q*; zO$ixb(QRl^MLhy30TB>|p+yX*M*v0k5mov`#n ze`5^dT7BDwG!{tZUse~DtD4f%(>Ch{&KLK_=+7-g1+Qu$2+a6yf&bu0?J7$UoW-Rf z7!#m0&H9#Gad!!}U#h*Bnd?|$D5V}Qb9X65m2E5itFePPuaW~Z5!aWyOi-5p%u-cf z<;@rY;~W7qFO)Zv#1!cl#+y31P0U(N5foTXv@dH?_b07*qoM6N<$g2j8FdH?_b diff --git a/assets/icons/Loader/err_03.png b/assets/icons/Loader/err_03.png index bb28c29abef21a7debcf62a87a8ec97c6352a4e3..83b12af0a2ce668621c94e44e22b2d03aeb04b82 100644 GIT binary patch delta 177 zcmZo7a|;jr{fpx%Y0 z42;VjDP3c*v}bH!`0rWBz{Di_l!2)xTpB2QQ;V&Ei9!86ka_hZ17qzOAyo!OD?SFT W4jqe000SaNLh0L01FcU01FcV0GgZ_00001b5ch_ z0Itp)=>Px#1ZP1_K>z@;j|==^1poj67D+@wRCocERf`J4FbGV8?Ek-a47#nnnvJ5| zLv<&ijar*Hi8oc*;ZV?QgAtk(Anuc<~-yX=P#9& z?M4;UckK$z?Q5(5rA{zZ7mbnz*55&qsZVYb&-LI;X4D6 z2xeelvGD0*U|4jqe000SaNLh0L01FcU01FcV0GgZ_00001b5ch_ z0Itp)=>Px#1ZP1_K>z@;j|==^1poj67D+@wRCocMRf`J4FbFh3_W$2o3LRk!9Jf1d zC$xEbYND5jh|7J~dB}G6)x7#L*8e<$W#lXN+V1Zb1$7-xGJhyT;bkcT#zxvdR)Ru*O}1@}9}zb{;A=P$z)~rzse*)}Caq*=v|mR@qeb$2XTPZ8%S#@RzI;R|o8bi<-wHKGi9u%6~lOj?>zgkv-mE zRgrQe?aPSZDgk(2Nk$`gD5azQzg|X{ea^8T?sE6jk!aPn*~QrtQL}@RH-I3fGnaeH Q6#xJL07*qoM6N<$f{>G-rT_o{ diff --git a/assets/icons/Loader/err_05.png b/assets/icons/Loader/err_05.png index c606f9a331a9a65719d80e01bdee913be9bfad14..b639ba5d88d10aba526b05337704a3ab24ad341a 100644 GIT binary patch delta 177 zcmeBVKFByhqMnff2;NNEaSljzc)B=-RLo(lWoY`(z!>bnz*55&qsZVYb&-LI;X4D6 z2xeelvGD0*U|_Ah)Yk|buKMhP4ilIQGD;pRt X{!mPqv3TAqkmEdE{an^LB{Ts5S_Ct| delta 378 zcmV-=0fqj-0f_^U7=H)`0002Q>4jqe000SaNLh0L01FcU01FcV0GgZ_00001b5ch_ z0Itp)=>Px#1ZP1_K>z@;j|==^1poj69!W$&RCocERS6D*FboT*+W+5+keCt&1FUuGZBzV*g#2V421zaxdpOqTpGFGk+MAmDM^LWniU0$4jXU zIC*4b2g9^+M4b!-at08Pjd4T@XCQzQ1VK=B#^H=EuT_NXK#3E?jW_&I^B|th$_q>h z=bKZ4IyuKe*~ghvfQNbRxa8JuJW&enP)E@GQf9|uR#eWoc7vE_TTv|LJhN2&jL%=v z<(i@MwCYnquS?4x_cSXNM-zK+kf@^Ru``HQs+j-?uEqvY|M>qb-BvAfHZgV Y1qC&rCS`+MEdT%j07*qoM6N<$f?I{99RL6T diff --git a/assets/icons/Loader/err_06.png b/assets/icons/Loader/err_06.png index f8c4f11ba0f0f86dcfbbbd9d7e267cb46d2c2c69..8220848d6cdaafdae04a0dfe7696ec1528870ea4 100644 GIT binary patch delta 177 zcmeBUKFByhqMnff2;NNEaSljzc)B=-RLo(lWoY`(z!>bnz*55&qsZVYb&-LI;X4D6 z2xeelvGD0*U|rpLspsCYqfyCNB4NMk}p+KV}8yKF- VE5`m=W_tqUI8RqUmvv4FO#opCGTs0H delta 383 zcmV-_0f7F&0geNZ7=H)`0002Q>4jqe000SaNLh0L01FcU01FcV0GgZ_00001b5ch_ z0Itp)=>Px#1ZP1_K>z@;j|==^1poj6BS}O-RCocEm5ZvwFbqT867K(h?-=Z|F@rdh z;?~gSWlN3|J5^P$^u3-B+jig0yKmL||9lkXSbx=P-S1XKZGRKaA}E#Jypj^w>7R8| zb_7W-k-Wh)Y~0Z#OMw!B0+Nh7ayUx?oG6HbI-7*Ernv5QNC&n!h1|H4AFf}>v!yY= z5^v7wIISID#vf$`Wtdd1T;($*lk>XQrv#uQIi4wa3c5i!*neuC3ai zoYYVekh;6N)p(9?4?Z2HyM?r2|M>)zR@MTooh{^&D$i zs%hiP=m=T*i9u(^m$AnrRnMn$86Pc@r@H0r+V;}R$i#DJLLRZ!*>QC z5zN5AV&T)rz`z*lz`*eT+W!UyUf+!jjLY?A3NhU?5@cYS^(TmdVXo8^28L}F;tWiu zj=pVRaQ4jqe000SaNLh0L01FcU01FcV0GgZ_00001b5ch_ z0Itp)=>Px#1ZP1_K>z@;j|==^1poj6CP_p=RCocEmW>X=APj^nA-@0fnk6%+Ea#Ui zWlbiPwby@GM8ugr=kc=Z2C<(N7FIQ{If3VfDPKOL=M0_$r0eo4VWAZ&h#_P`ySk&tvc2cC(VL gWp}NPx#07*qoM6N<$g3JuE&j0`b diff --git a/assets/icons/Loader/err_09.png b/assets/icons/Loader/err_09.png index 5f3b4e57904170c7fc6cce7cdd2063a8eabf49b7..7378aff724e92b684138e815f88e1e7fbc356d1d 100644 GIT binary patch delta 177 zcmeBTKFByhqMnff2;NNEaSljzc)B=-RLo(lWoY`(z*ytJz*O^mJ_E~%PoEf=7#=nN zi5j4)TFLti42+=;3=IFT{%>F~JobWtvF}R2Ii~YE>lqk~)&4Xve5sdUU=%ig0fhd+0g3~V7=H)`0002Q>4jqe000SaNLh0L01FcU01FcV0GgZ_00001b5ch_ z0Itp)=>Px#1ZP1_K>z@;j|==^1poj6A4x<(RCocERsjyfAPA&}?EmjwmUOcz3%%Zf zB{5EfLk_Cj%xpIy`{!+&zm6GY>d{V#hfxKhfZ3s#&&Z1y3V%F67+8hlwkSaxqoxWv zWmqE!plVc!E3gcTL6JV(XR@pDb9gkX;a%#h`(-nn(f&rNO_?6+6YE=tVybf;19jF= zi9RuJ=MQR~~+6TDJ_kD+IyV!7f=D@MyrX;@U_p*>A7X&3lpE z3PnikKm*qI>U83iUpLS;^64@VyE;~Db88SRJafiws%~LMr&ljpzS>!Ra=@xq?aP>* zS->0^eM9eRLj~Q95}I6OcbggK%f+a4)iei>O4uvfBUv002ovPDHLkV1kh>p85a) diff --git a/assets/icons/MainMenu/125khz_14/frame_01.png b/assets/icons/MainMenu/125khz_14/frame_01.png index 0f46d426227edf32f9a9bef76efac4516878f685..d00392a1b197ab4a1760f22686f221e064086b1b 100644 GIT binary patch delta 77 zcmV-T0J8sSY>*^KGf6~2RCt_Y_$R~o|1HCR6UP5HnI;G@Jz`*tlVVY{WwK&m`pdw? jz`&%;z{GZd;lUpOE?W$HwJMn-00000NkvXXu0mjfc|0Op delta 74 zcmd1FoS@=r;OXKR!f`$Mhx*|U|9KDB3%C6@m-rQLAhIu^V|Buc`-e9a^B*=d*tN6$ eVIA+`W_yPD>>^_QdxT~%0D-5gpUXO@geCyflpg;8 diff --git a/assets/icons/MainMenu/125khz_14/frame_02.png b/assets/icons/MainMenu/125khz_14/frame_02.png index 13c252b14f6d1f735ff0e73ef56e6051c6c46ac5..6ffd7fe166cc2a5c89f1d17c6c8e1241d96e2b44 100644 GIT binary patch delta 77 zcmd1InV{lf?CIhdQZXm_hx*|k|8<3#*@c<8FSD>MbLZ(P4ASY^<`c%_Q!hC~LSn`g h$r(5J3~YWdGn|^rnJ={U*&PNT@O1TaS?83{1OPVy8%Y2F delta 74 zcmd1FoS@=r;OXKR!f`$Mhx*|U|9KDp*XQ|PZ}8=Rg2tbN0^tV(_O~ZKmut&SC@JPY e{8y@ty`EwJc2O~grq(A6K;Y@>=d#Wzp$Py0JRkJ{ diff --git a/assets/icons/MainMenu/125khz_14/frame_03.png b/assets/icons/MainMenu/125khz_14/frame_03.png index cdc882e7e10c6724dc9e81c1d65fe473fae74185..afd20d3476a1b345dd66d2d070f0ac33ddd6a00f 100644 GIT binary patch delta 71 zcmYdHo1o&P>*?YcQZXm_&;RM2jf`Dt1_riC2|bgO1Gl7ZN=o>3`oNI`2bP>UaHOo^ b;X!$ZB`-MQA9V5CGXR07tDnm{r-UW|iijVf delta 66 zcmYdGoS;pyTS!f`$M$NzT5zF+?hME)gqtWI2U|L}%l{=;SlyLPretm8f0Y|rrg Wg_wLz&XJuAK;Y@>=d#Wzp$Py2pdD=h diff --git a/assets/icons/MainMenu/125khz_14/frame_04.png b/assets/icons/MainMenu/125khz_14/frame_04.png index bdbc7adf53aed63e46f7c4a94860c54dbdcc7c24..cf93c63f8131263994f910cec89d864b7f9cde6f 100644 GIT binary patch delta 77 zcmYe#nV{lf?CIhdQZXm_&;RM2jg1fY^FIE++eesXhMb|nv6CA$ZW%=y8vIR7NJ>Zu hN=rzxKJeiIKLhtM?&fPID~~b&fv2mV%Q~loCICfdAgllY delta 72 zcmc~vpP=Hb=jq}Y!f`$M$NzT5mK=$H_Y+^#9}f7@rns(cVIBYBbGAIU54?CL*Y?|# chyNb~!*L5yd09Wb{|rFj>FVdQ&MBb@0ImZbiU0rr diff --git a/assets/icons/MainMenu/BadUsb_14/frame_01.png b/assets/icons/MainMenu/BadUsb_14/frame_01.png index 162753d8aa617f30f544e8b2a2612792d8e19344..b2fb1d6532df7036c7cc4f9bdde5ef4a5b3f2a67 100644 GIT binary patch delta 89 zcmaFBo;^V#n2`Yp%#8(VfRvG^i(^Q|oaBUr#1;P!9XW6y;=rL#54nWhnT55PlMjii pF|wS_{#>TLEE89!k8f^oRDW0x=F6*2UngGn78kPV6 literal 992 zcmaJ=J#5oJ7&S1oRB9!}RHl=Q1O?)Mx3yJMC2>M6;S$^+f>06uxh8I6pKD)<+YwMD z7R129(20cs0UHPeWkX2J2r(cAgcuNv3`oE^O;QGerStvhz4yKEyYFsP7EX`<82eYCSB_BtIytNUU@zi8y)M@q>_r;L zWr-O!yV<{Px_3m{CtLO#mu&j24@1)LF=_0NZ-Nqe6qcdqtLgjOXY*qe7`ER2-fjh# zR<7R}S{gmDdEp`Le7d*#?S*=O>DuETcYhunc{Nv&TGZF-`12;@hmMQJ#WQ;DwN$u?u2FqlQ;Wo~2gza&Ww!tQ&OdL@UNe zhQ|vWjC1M&HSPaU$LXO1QbGHE|0x{kO%L%E6yR0gq&K%T8i(>^#YYCgzK-!qw~Vt5 zOmNV^9uP$?3r;QAu7$(kbeo`Qa@h@t;hLzd=2898E$ff=6)5cExUOzz}#g(#J(4$WeFMUp&KR&p* zwY&Rkq<-|#kJm%30qqORgl~t&l#e@umy_EYhac$g=AEgX8ytKxw|?-$=Ej?s-`#Nj v+tB#et>*UR!0?^>Yn#t1>&e@ER2W`l?&|Pl?(v~p@#`xWXVj+`7O(#SvUfjo diff --git a/assets/icons/MainMenu/BadUsb_14/frame_03.png b/assets/icons/MainMenu/BadUsb_14/frame_03.png index 5dafb2597a971acae1ec6aa6d083be1ff1399f1a..6b720f8a9acc80ab8cdbc379e7f77df6afd2e9bf 100644 GIT binary patch delta 90 zcmaFEo-;urgpmOV%#8(VfRwSPi(^Q|oa7b%4@Dd}^ywj&ur~AMd^WW{wq^f$edh4# r{8`Gwqto;K|E8RKN58yd5N2j(;5Ox%p7^595M+#}tDnm{r-UW|k)$9- literal 1004 zcmaJ=PfXKL9BzadLIMXbf(Lmi9t2tcv9YyM$+m9LXbBk;b`rbxv6a!j+CE%2kwj1u zy(kAgc{0(9(Gv%w2X7{5OpHekCZ0|7ZZ!Bhw&B6qi%Mk^h6y*V|+o#F+w~N6WaXdyq<+s0e{->m`_jx>>un2PY}2>x`8z z;DUBZGLX&aA%+QTm#`^naw>3jqXID~!jk34^p7`hX<(T$y%^It%}v9yHBYL2hn&I1J@VX%Ffcd3l6ZTVrR#a!ge9M;Zi8lT^pYx?@09k!d2qSe7YG@M$5LN-N`BHqP^zw3tZn znOKZZ2#I8tSK=+Mf{ZmAI=IC(kGPqR+^`vJmqb>eXI+P8){Wqk;Xpw^mBkbiYuy;%m@3Achr6g^mL7U zJy?2oXRG`6z>U=E_7gx~e!4(Cn@)Wg>e@WF^xb_m@i}&4Nv)-J>xJVNzwF*)PH(;F y9sBrgedXq@o%Q#lzX$hEKHu0YEo|IB-#tLBY)=0g%0GM*zCSfHtGrBI-TVUz6g^}B diff --git a/assets/icons/MainMenu/BadUsb_14/frame_04.png b/assets/icons/MainMenu/BadUsb_14/frame_04.png index 6ca08f842dd71d57b715ecbb968ed41b2329fd0a..f1931ef5ef703b2df41e33ce7bb5082dabfe0b07 100644 GIT binary patch delta 90 zcmey&o-;urgpmOV%#8(VfRwSPi(^Q|oMfGZ#GeJNol_fMnllT#GhhDCrsl^k_AiKy rP3+k3`bfKS!*kbDt6m&9a)5#1<6Z8Ob<_Pnf{gKW^>bP0l+XkKQDh+Q literal 1011 zcmaJ=O=#0l91l}uROj6tgXyfySRM3u3<}FOkQnPrb7|I z+lGP{J#T{OLA=a^r->gY4?5XR#FK&^24gp0y0-IR4ZOS$e!t)UE=g=EAjiD8(=bPFUp% zsi>D^1KXSyVz|I|DVt$Zqk*d#bBF*P&03Da{(AMA1(vC>QzI%=-3+Q(<4q4uHj8DW zIcG>FJ9-|Z0+|Zfh-e_N=N(@T6t<-+({*^vv!Deba|*kcR7ITt8SEjD_} zNRq@ukr%}%MMV7thiF06@rODJS>zj@;)XxmBB-idaD1XU1}bC~mP&AzWy*;}9>(GsDF*XNLC9sK5h<3> zr4wUG5su{&@eVhOjk=8-(&3u>+;mTFXa?J*k+aCNt|K$=VH>n+maX2oBzx+$xn}QN z&h_N-G#Ng;*}rbOb42YEF1yC1o38bdL;dbiV?X}+e3d>5+P!o+*m|_`HNvD1-dWjM zLaSHqfBUk&`%<{^MrXyCtXD6-uP+@Q+}J!*+DiA~7l)o)Ui*CH$4vCCwej$ix){Gz zkNmz`{0P23m~0LYEPmdZUh7*v$vpj_@tf1z{g8p%iQ(PU@tff@EaZyWXJa$B{{V2u BMArZS diff --git a/assets/icons/MainMenu/BadUsb_14/frame_05.png b/assets/icons/MainMenu/BadUsb_14/frame_05.png index a3b06a0e70e47339f86f86e08e177fb000ac687d..8e32911da77e69f03fee61bdadf1bef7c0f2d4d6 100644 GIT binary patch delta 90 zcmaFEo-;urgpmOV%#8(VfRwSPi(^Q|oMfLJhmKr4@MV8v=jF!M{ZkqnTR;AbpLRaB r=lg#nnF)zW2?s6aPyy2<_#aAasz44P=a`tDnm{r-UW|ZkHs7 literal 1004 zcmaJ=PiWIn9F7ylD9nSngL>FA8{)*~Pn)(THjXXnw!%_sS8P$(mOrm+*pe5MHl~FJ0Stum)bW9Z4%;kYo6y$#ERW ziHxNix@j2KK#EK8EGMwMkmNWiElPp_Iv-8K`Bp=!s56~lWGB;2j6I2E!!TsRG=uyV zmKQ~l>VVi7bAG<%k5-g=ZG6s$1krdN{!f2eEdKcKejfIe84?l- lJjedmOG;G$nG)ajGct&^^KnI7limq3!qe5yWt~$(69BgI9Etz{ literal 999 zcmaJ=PiWIn9FEFlR_4Wv4v|Nu;D*gh(r#VCve6~0E1EIe!shL_i6ZZC7Exzkb64+fvxMVV&1K6;f+<<-#5foWWh&qxVt~+DbOSk5*ru*b*U>R#K@&n26n5WKQJ)1W_7O;NLfqte z9;77BGD?P7DqRF3FA9)PLLnLFc{w4;$s}lfEDh&d^Kwqhw1Ux{!d3|JWC&}u8dpnj z*e^ptk|fBBP!!`75fADvF~YbT473$A6qvs45gWT8QZ!1qN)(n_-Os`CI2I~6%p^no*2PB6M{QgroDAYX!b11-7-=sG;KM;lTWYtFo!F~bb#daBI zE12M*f;}LL+%UK>XS)`z1%pk3uFF|BAckwAtfsJ3g0pQ)P6;V(awM%L_)JO=rqpyY zDQ42z=x9O|M^dWT=4#liI>;q$u64lGx^kmta6B4WL%zL)tc;Hx(9Bu3yL(A@)oXFB z?p`Llav?PXqnrKfrrSrfeWGQjap|Vh`pBjI?$gE|zxDYEeH7QSTDlN^dbV;k*5G?p zb948_;)i4B3A_5`a^dm%(Z=@9yZ2ygFP~W3-SYd^AO3VJx6j;bY~LR$>nESD4uAW4 u{q3)OfAvsf@5jfT<4=FTjNMt2dQLI+#?au|`chBy^s-Yk+Q#IKyMF+pi9z51 diff --git a/assets/icons/MainMenu/BadUsb_14/frame_07.png b/assets/icons/MainMenu/BadUsb_14/frame_07.png index a3b06a0e70e47339f86f86e08e177fb000ac687d..8e32911da77e69f03fee61bdadf1bef7c0f2d4d6 100644 GIT binary patch delta 90 zcmaFEo-;urgpmOV%#8(VfRwSPi(^Q|oMfLJhmKr4@MV8v=jF!M{ZkqnTR;AbpLRaB r=lg#nnF)zW2?s6aPyy2<_#aAasz44P=a`tDnm{r-UW|ZkHs7 literal 1004 zcmaJ=PiWIn9F7ylD9nSngL>FA8{)*~Pn)(THjXXnw!%_sS8P$(mOrm+*pe5MHl~FJ0Stum)bW9Z4%;kYo6y$#ERW ziHxNix@j2KK#EK8EGMwMkmNWiElPp_Iv-8K`Bp=!s56~lWGB;2j6I2E!!TsRG=uyV zmKQ~l>VVi7bAG<%k5-g=ZG6s$1krbP0l+XkKQDh+Q literal 1011 zcmaJ=O=#0l91l}uROj6tgXyfySRM3u3<}FOkQnPrb7|I z+lGP{J#T{OLA=a^r->gY4?5XR#FK&^24gp0y0-IR4ZOS$e!t)UE=g=EAjiD8(=bPFUp% zsi>D^1KXSyVz|I|DVt$Zqk*d#bBF*P&03Da{(AMA1(vC>QzI%=-3+Q(<4q4uHj8DW zIcG>FJ9-|Z0+|Zfh-e_N=N(@T6t<-+({*^vv!Deba|*kcR7ITt8SEjD_} zNRq@ukr%}%MMV7thiF06@rODJS>zj@;)XxmBB-idaD1XU1}bC~mP&AzWy*;}9>(GsDF*XNLC9sK5h<3> zr4wUG5su{&@eVhOjk=8-(&3u>+;mTFXa?J*k+aCNt|K$=VH>n+maX2oBzx+$xn}QN z&h_N-G#Ng;*}rbOb42YEF1yC1o38bdL;dbiV?X}+e3d>5+P!o+*m|_`HNvD1-dWjM zLaSHqfBUk&`%<{^MrXyCtXD6-uP+@Q+}J!*+DiA~7l)o)Ui*CH$4vCCwej$ix){Gz zkNmz`{0P23m~0LYEPmdZUh7*v$vpj_@tf1z{g8p%iQ(PU@tff@EaZyWXJa$B{{V2u BMArZS diff --git a/assets/icons/MainMenu/BadUsb_14/frame_09.png b/assets/icons/MainMenu/BadUsb_14/frame_09.png index 5dafb2597a971acae1ec6aa6d083be1ff1399f1a..6b720f8a9acc80ab8cdbc379e7f77df6afd2e9bf 100644 GIT binary patch delta 90 zcmaFEo-;urgpmOV%#8(VfRwSPi(^Q|oa7b%4@Dd}^ywj&ur~AMd^WW{wq^f$edh4# r{8`Gwqto;K|E8RKN58yd5N2j(;5Ox%p7^595M+#}tDnm{r-UW|k)$9- literal 1004 zcmaJ=PfXKL9BzadLIMXbf(Lmi9t2tcv9YyM$+m9LXbBk;b`rbxv6a!j+CE%2kwj1u zy(kAgc{0(9(Gv%w2X7{5OpHekCZ0|7ZZ!Bhw&B6qi%Mk^h6y*V|+o#F+w~N6WaXdyq<+s0e{->m`_jx>>un2PY}2>x`8z z;DUBZGLX&aA%+QTm#`^naw>3jqXID~!jk34^p7`hX<(T$y%^It%}v9yHBYL2hn&I1J@VX%Ffcd3l6ZTVrR#a!ge9M;Zi8lT^pYx?@09k!d2qSe7YG@M$5LN-N`BHqP^zw3tZn znOKZZ2#I8tSK=+Mf{ZmAI=IC(kGPqR+^`vJmqb>eXI+P8){Wqk;Xpw^mBkbiYuy;%m@3Achr6g^mL7U zJy?2oXRG`6z>U=E_7gx~e!4(Cn@)Wg>e@WF^xb_m@i}&4Nv)-J>xJVNzwF*)PH(;F y9sBrgedXq@o%Q#lzX$hEKHu0YEo|IB-#tLBY)=0g%0GM*zCSfHtGrBI-TVUz6g^}B diff --git a/assets/icons/MainMenu/BadUsb_14/frame_10.png b/assets/icons/MainMenu/BadUsb_14/frame_10.png index 50e12f8baa0573c5cc53ebcd0511d53c31e4236e..4060dc72f03ab1d2539785ab2ab5bf0ee261620b 100644 GIT binary patch delta 90 zcmaFGo-;urgpmOV%#8(VfRwSPi(^Q|oa7b%4;?vh;LGL4gAchUH!)BC!@R7Wi|1Ut r1b0Nl4{u3{2#M#fjciL2k`fpgel&8G-u@|`4Kl{l)z4*}Q$iB};Xfg# literal 1002 zcmaJ=PiWIn91e;y$|~+O-07K3(P5L9w52Aj&YHAa!Hn63t)Pdc$y*z?DwN$u?u2FqlQ;Wo~2gza&Ww!tQ&OdL@UNe zhQ|vWjC1M&HSPaU$LXO1QbGHE|0x{kO%L%E6yR0gq&K%T8i(>^#YYCgzK-!qw~Vt5 zOmNV^9uP$?3r;QAu7$(kbeo`Qa@h@t;hLzd=2898E$ff=6)5cExUOzz}#g(#J(4$WeFMUp&KR&p* zwY&Rkq<-|#kJm%30qqORgl~t&l#e@umy_EYhac$g=AEgX8ytKxw|?-$=Ej?s-`#Nj v+tB#et>*UR!0?^>Yn#t1>&e@ER2W`l?&|Pl?(v~p@#`xWXVj+`7O(#SvUfjo diff --git a/assets/icons/MainMenu/BadUsb_14/frame_11.png b/assets/icons/MainMenu/BadUsb_14/frame_11.png index 162753d8aa617f30f544e8b2a2612792d8e19344..b2fb1d6532df7036c7cc4f9bdde5ef4a5b3f2a67 100644 GIT binary patch delta 89 zcmaFBo;^V#n2`Yp%#8(VfRvG^i(^Q|oaBUr#1;P!9XW6y;=rL#54nWhnT55PlMjii pF|wS_{#>TLEE89!k8f^oRDW0x=F6*2UngGn78kPV6 literal 992 zcmaJ=J#5oJ7&S1oRB9!}RHl=Q1O?)Mx3yJMC2>M6;S$^+f>06uxh8I6pKD)<+YwMD z7R129(20cs0UHPeWkX2J2r(cAgcuNv3`oE^O;QGerStvhz4yKEyYFsP7EX`<82eYCSB_BtIytNUU@zi8y)M@q>_r;L zWr-O!yV<{Px_3m{CtLO#mu&j24@1)LF=_0NZ-Nqe6qcdqtLgjOXY*qe7`ER2-fjh# zR<7R}S{gmDdEp`Le7d*#?S*=O>DuETcYhunc{Nv&TGZF-`12;@hmMQJ#WQ;#zT*T=n}f&{k}nRA1ps&Sx_Ib+ zR~RUIdOnmjH@E(2y?QEpYNMUeAsn$+R3&LLKL9X5Mj66-6%rf}4b3$XoDzs(Zji`i z%PT*gHvllt#h{1N9vW|OJRkv_0J&TJfN0~$_N6LE6*mBs1Pp^krvx|>kwBBWbCWpG zBn>=tdg8+mqyPY(5oQJk?g;|3KWvP6fZmei0V$w2e_shN5XS*z9JD^bY4QR%;}VHf z<*a`NfH5Z91-r%pw^rbH9SCYJStJxW0Rr$K7Ij#Ic4wLH5y~FM%!8=q~X}` z753^@f9O1LHq#`dw7%fd=2otuo-`-b5#40hpI%(0_s|& zBiOEy@f?|Cq1c={Dmr}ux}cD@$(I}=2r#cW)Z0JX{j>#NAO4+#Ggb)I6%3e!FR5LZ z6-WX^{IsErRRBn?TT3uG!U43U7qa`Q`m3}@af+1fTV4RL$csGu&~*2nm*UKNq3oCP z)%8-G=v@{jdk)kaikR&hkJ!h5TRP2D#Ft zc*L{(qR!)AgJ{6{n0QP?r>2na_0MRJ>sKw$TtmsKG)iJ7P&%#&Iv9DBUa*8*eJ+~C zdw?@GLTr}z^ktD(_=|~&)+k$)d9m`WQn_dquN&W`%bKtL04Enalq-jdt~JoTVUH3~ zR!o)eiu)CFl~4a6B<7WjI3Uz~W89u!Q8^K6BVZGV=trm(Iu#mqiQuwrRb~)G3}sC<+dzI^Oi!jg6{X3I6vH~KV+I##W#3qzh(OS^sd0KyQin7 zFZ~GFBX~vdQX|6qpiH35Ihi8q3K>X-?OmP^=^0JV8lRwY8Gbi~Z<1V4hgS}VNhG}! zO@*bpriQ0Z-E(%Kx)^se?g=>GcM-mS+V%WhE0-sZVR^>}U8HkfB! zE*Nso*2$cD&zI?&Io?IEe$W#>kI9x z?em_a%t_A8^s$1-IVL%(Im<8tY&D3lO1J7nRa8}fP{%i;511LoG~e>OWufW8PU~gD zkAh{XZ>%0xr-Gh_Hm`1?3|>$2-7rcIB>jOq-b#|`f& z=a#i63zpULthh9*v>`Z)FeE-Io^Yt^(6SS;Pjhx-mVY*LcGsN23VKC(g|N~g-?~p! zzUL_IXc&bS)EbN@SI-oVXumFLD0w~Y<|pTOo0_wvBX#$9VvA^caJrNep(v(^cq_Ce zbwc)gRoBxG%LQ34vIa^&6Fv^M!rz>~ziy|VCD-iv8qPBPF~5o$J=;2#Q+$rZY_8SUaJ(| z6P^*idn0%K=&zQ|gr9XIj77->d!92KFF7VSY9eJLpKt|oDR5_S-`TCh6UXyn7i5o- zgxMZGL3ag8GO1o_QEm;RHQ=Y3*(vdkH%H>6+%Jt*72Ewid*iQk@D7QDlkTqBPPabe zjUKkfM^`G~WHO}I&Wj&9485oR?L@f~?JR9owTC(GzV25OzmQOJ{rS=UfM=9oKV|?P ziO0-lRYp|atBj;y{b{+7E=m(Sz&CeoyrH)Ner=4(Ifc*E${x>jPNQMUCI<4KOHEF< zx8#Nxy6dG z2P+(Wj~q!B9A``t-pM6jeYZNUv_@U(m%vBab{3Q)%N&IyZ6U=+=%=Jl(JK)(h?5_+ zhJ3fattkmylnkp$eCSyD@JVka-F;ygTxa=0QYqF+Dnwn=6Ita$$IW-0Z}D$=oVMvW zibA?91~3K|R$KYSWSRw_xmgJf~9f`aT9W0gkxW5 zw?hM#wLW9^FW%NISP9L!;MwB3S$e;s_OnV~Pu*b1xh0`X@)AeC zuu^8LpB|yR1=d)eUnX{azc`p6>n&GRHyJ)yX&vJ5CO6^SopZZaELk%FG!lN`L0#Qr zJ_1rVZa)G>p2&(I^<~XvhCC&oJS_CebmHY7LwCc@jX8e3-Tr#ub=y$Jg^Fd~83f}< z7pyLbsa8P9gWs-UeZ5|gBY#@ny0&6FoTWL232M|yaLdihIS5}^8^4%5R^(HZn`3Vb z|ClkrShd~A2=qMRS>tEkk!vhP`)*s|wc5P&Wh%jQzMA|4yz1SrTyeYG?^amTYeVgBQ{}TRop?vERww^Hj^GyAjj@RzOEFr$DxmzjQAFhscS+`nu zD_JSUCFCe5$O+2UEc&!3j}$#F66<&u?z+vGq28Yw+8kX!-htZaoflY(?Wikblq^wL z_e&nY8kHIqs@oaxg}WQ2?fvIjm8`0v#u|l;gBvDWj!T`tFpWj;9afE|!nQUbtCyG7 zBMg-HvQL#VG)olCiR4QQK~u1RsSn8;3$h`g{jf+Z+J|wr8EXgtTxW64C>qMn7KR}a z)X_T_bvl8}W&?nsF`bOY1Y&6*Z>%4V2nVxX)PX@bA2`@e$4xHEAwnrwr%-!m zOlTm+zz1w>1Tv(<*aiq#8X80=;E7Zi9S;7}E{r|i`3wPr{)Es1;o!f5LfJWj%t;h1 zNJm{)4Wp?I1?d^6YwBtkK($ptPz_Bzh=v|SQ%g-l6Q-dH(=q`4eSz8DC_cV0q=nVr zzSuK3*q=rt!yu55kP!6{Ep-yb529&cU;xp8LZDDJHbRZcAkxruH6m5%w*?C<6+^+1 zX*d!Qv||zNO$wsH!R$!?N`XMOv-`&|k@|O`*d>F|(PW6Gx(0+m*vacpG?j+L{!bYH zil#a<$XEyxOC<$SFzo&CRr*b4*Y3YN+5xhofjLmvrw1Y$Z$ZKY5wJv>jRhRcUQzeK z`M|XG&{#bkEL2Uy+gn#n2d(X`=IvvERx|MR)zjD0(uHDlw13!zNM9hft8uL znU$udrJ1R&xwgI)R8QB+(#%TN%JetahDfEMi5To}-#E7KzqywGl?yYcV9_)Z#hFCH z|Ly`ue-e#E^(T=*>_4D`ZaAV3DTI1xXNUeu*aAzz1!H}zC?o>t&l1CM|Kk4tmik|O zpZ{;^Anc$ZJALxM`sVj1b~Ek_|4{*Z@{f+NM7DS+Y?Xu-5JlMv+vRBMY`ML?&9Q5b zz$|inM{_n7rq1*}4|_f#K!f|k_JvS1{4(#c&U?DopL~lRv`5zL$`c3^4conIw~%{e mf7o0fB!=EedwK+4q9#WAE}4x<*s)&C5?YZ(79uO2E%O43}z%LDJ5IBtl3IxXj3Fx zMaULKLRqpTG?tM4H_kbo_x$&f%j`r3Cq&;d~FKe*Ovog64R0b4MFJ@F9)k^z9g3^M}*_k@7ypEgE(KyPu9a#Bq~zg$%f3&4vi>|ydpd@!$=V6%Va`f!q^Ixz^&R|HvrKq@x7G5(=((;7TW@FU(jkrUdBifHnsYza&Ltm|M z1lu(-pQ92j6q{2<#3s+f<`hyl1d>980M=!PI{RlkpSBR{!hdja#|Wdlf&r881@-H) zyAlCWKW!Lu832-MSK>`nxq!B`LQXzaecOBLZnCuP8-4(=$h~m*q3O=uFC|!Y!dWln ztLmh=F*__wb|0uS6gAs18nI6>Z*QupjB_2lm-p#I9@*SI8N;GwFE#arCWgdLU6`Us z@9^52^J;I^WdUB(CVp{@B0PGJcU&*HonJaVju(tUYTt+`1WiUu90xZvQ46_?%>oiV zkV^CFR0)IFQzokk{Y@a)we@RN)|$x|9v|oVz#U}r{H}uRwKuu6PP(>;M?`9VV5e-^ zeniBx{G!fd--77CxodIQh)zvm-|L?+r>rkc~Dz;M3@P^Nmq^K}F>Rn9VMmKx98sz0j%9s7n-|WveokKy3ap z%Ktcm1xiaSPY_9PxUts!dbC^u-Vi-vE0BKxRhTSxR0n4~#(Vn~%q%_k-to5LoDcl> zqT#nr*bsAr9U)Fvip8~qGL+jgrOaCj)eE}cW#Ikr%l?o_dZobU$o-aS@6x&gzwMly zn2h`xvRmk~P-G+0`=Csq%vqVDz2!2HblW?8@6*zooS`3Ka_N3IMQ)N^(1(`}he;;B z6-$AqxTb`sOx$yJp}81$Gw*2-3%qIPee&_jv~4io znp`mCtgVwd?Vc~oH_qB=TSFSf7BCD;#(44qSqJN zSJUS`L!FVDnd)N)QL;_4)v_1iMEG)$K&5Ww@ye*m{-BQUM(?px%t?X8w~NA)pF6D= zi9ZV#rN6U#*qsV`P;GwQ1Q~*+K6bV>0sAfRCcdI`_R{d(JuUu~iS_;koi+u3RH*#8 z;`ddDA#LQ#BJcBNX@9{D1R7$z@v#2F`of0MnnP{Lff>G)on`Oot*uRJ1FT+F^K_g+ zcUE8yrsh*s|9WiHZOg2NqcOTMjj4U9VJ&>AcB#v(o32K#OxH!%k1U&>Q&VbF#2z<- zqnumj?o4=Q%d@*BnI-kXnZ!Yf5sCOiU56H(NPU{q>(heM8Phvv43;oU%1gwh4*Ax7 zV)8vl=tsh+^q|&Y0;OuIa9I0waeeXYNjE<^zdTy@f{yf^V+k!{X~AjIPQ;>XMWkDy zEh%HNKPtPPzF#cJe33a&@`?E2b1S0Z-2F8>jZC>_kJkvc>Cf3^^vIdkuh~VJMXweT zCLpJSPrIL9tKRSMBugcy2TE+}uRl3d-E!6oZiK+CwomdHy)ojx6?*GR&7B(XAfiSo zyeB+8eCK-3+L6_kjrd=+!_0Z9IeR`Yu9sY6T-6t3FFfH1>9&z<6jeCNSp_Mh7;hajxmW~bNKbIb# zY;Va4F?82)PYBbGx+#|S*mx`wWabFj>o8VCvXd8|zmyr}U|EwNn}7UKdBst~8{^ro zDNFjFkDN1K^}p<374$|+zyYPoOq99tTxr41)uQJMtK-v|PwEEAS;<)iC?R}mnd(Pq z`N47rUscs4p;6{I@vU6amAA{IN-MO5en~=-8hPS_ z)}Zg^_Z6jG7p20g6COHNJbcny!Em1&0@qr;kWz|qk`B?(^gvbmFz~Zo=UV(*9;a?N zj-XL4^8w6(`8ZT$*X`Tpsu$g~Q;L(DTS%opPdvv;Vp4ou*a2zXCtc4UmQL|xQCN3N ze?7FS7$0%7_v{W^WD@)Oz8o!oJ2QoxDx4y*mfdR~9IXy8?S6N8R;Wa7E_O`LlX&zC zJuft1F|Mtw?QI*64n}9@Wa~3l|9qZq!BS}Ud5;#?jgtH2HJ?=adTKw1oLvx(l$Sj6 zg`GTI^;DJN7Fcb0ZjsdW4 z3lLGdvHOv5%2;Luxi51jBjhRN#9`rAreiPv7`zj9_N(K!y!O`vuiFOG&zCRqPa&DA zUGUl@Ch*E@gIAvoP z`QRjZ3b))c<7QY&|7kaMq?7&r{Axg5H|^uEj~X7gnAPkz({kk`mCySslq(m11uxA= zhY0?#9qD&0eb5-Q~`LfMNxH{s{FRwbUj@RxYY+->bIh)B_@2?DZS+`nu zD_JSU#%C)i$O*|-&-=6|4HrEw67P5$?z+XCqTQbu+!$Fq)`4E{o!zw((@|T>EMB0p z?-xISH!3wMRJAh^b9dHD+WXJ3E7+BTjnxY22iHwD9Tz%Rv5iIV9F~nH!Zz0-%a<0` zA`F!Ga88vnbW1ediR?=c!BBC4sSnv32eKhz{BS57#)o;P8D|IpJZJFEXgb=?7LFwo zH89&U8Vn+Zg9ZRYV+I9-4aCtw-Z(!z2?1ums0D-YJ_xXzjvdsFVvh62BSWb;r%-!m zY-k|Xzz1w>1Ttj6IRr!;9Rp$z2_zbvfdK!>3+ME=ry*d_pCa@?1o$tb&~}a>b21eN z($UaW$7*WBKzarmnz~Q}n6?@S2G!JqK=mM+TIx_uI8+y|WdQp70durbeSG043#-3% zaYhKRKb=m2Lm(j`AsQiC8f2;;MAN{)00M@j(eT0h zz_s--I6WO4Odaa&t*fqs(e_sN_A$Vy8~FO_>Fa6f!mv8pzj^)*udi(h)7I73Gcz}{ z($usxGc(nPS?EA5bhJ6YV>3O|-&h+GjgBEi$Bw0?y!{I>M1S#Y5#($uP6zC8xp!9BrK~x3;#pc5p5x z03{PT#A(cIEKHpleLi*qf&i5N@YdG1l;G=jYGNs^V)hzg$q(crD{Y)nguEMCVb9O& sI|aOp3`&z-QLQsS*3iY%s}v9L0HCJ;df)pfT@D*yV`*fB!=EedwK+4q9#WAE}4x<*s)&C5?YZ(79u>5aidhmhiqz2Pv6~-ec tm>zI29bjR+ewAT^3Dc1l#`kZTHgHtF5=@hD;S&TI>~=9vc7v literal 3716 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 diff --git a/assets/icons/MainMenu/Debug_14/frame_04.png b/assets/icons/MainMenu/Debug_14/frame_04.png index 5f89c2e1b7ba2f6a23d670a80a0ca5250d2172fb..74c7e7fe8dedbd6f53de483d25f2e095550bd328 100644 GIT binary patch delta 90 zcmZpb&6yw(!pHyw=EedwK+4$D#WAE}PV$|-lRx$`T>j5?EF(_MkNMc!`k58^2AUiO qh6V<;VhKAI9Ny8|nE6?_?WaG3pboFr?ur0AkTIUFelF{r5}E*I0UuZZ literal 3717 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 diff --git a/assets/icons/MainMenu/FileManager_14/frame_01.png b/assets/icons/MainMenu/FileManager_14/frame_01.png index 3403ec8a67445fd7e3b3d094f8ce290088a9b207..aaf107ae24cdc295ceed94f31adf8a9629561307 100644 GIT binary patch delta 77 zcmYexnV{lf?CIhdQZXmlLg8@5fBn_7$}@O1TaS?83{1OVs99nJs% delta 71 zcmc~vo1o&P>*?Yc!f`#>Lg8@1f4;-55(1h6hXv}}6&o5A|FAdP3)CidurD&_`Iavs amBJ7h#=j+CO~6D3An%rusQ8Dy*;I{L9#R ceEQfJPKj}zS#w%5ngIwrUHx3vIVCg!06p~^&Hw-a delta 66 zcmYdKoS;pyTS!f`$M$NzT5K8X~GNAC?-3=CTSCwyREq|fuw;Y-`Wf4t7kJPeDv W1TS6n{B@ZD2s~Z=T-G@yGywpXO&d4> diff --git a/assets/icons/MainMenu/FileManager_14/frame_04.png b/assets/icons/MainMenu/FileManager_14/frame_04.png index edeed16d52e3ec98a7726919264bef4f7c4c6b0e..d2909d00b61e3e9851bdcee8ece1b66d707f663b 100644 GIT binary patch delta 71 zcmYdHo1o&P>*?YcQZXm_&;RM2jf`C^5;Ke>X83I~==`7X>)?SSAKE<|8ap4dUuI@g bb7y8)KaXRl`VVPe1|aZs^>bP0l+XkKM6n#5 delta 66 zcmYdGoS;pyTS!f`$M$NzT5z90V$ru=d#Wzp$P!+S{+>g diff --git a/assets/icons/MainMenu/FileManager_14/frame_05.png b/assets/icons/MainMenu/FileManager_14/frame_05.png index 71e4f76a0d7c3586d3ba2dcf727665ebef3d33c4..bdf66a9b6be9909af67921b67c27f321be749578 100644 GIT binary patch delta 71 zcmYdHo1o&P>*?YcQZXm_&;RM2jf`C^5;Ke>X4Gvm*!VwT*TDlvKD2u_G;pyTS!f`$M$NzT5z90V$ruBqUNKUfow*?YcQZXm_&;RM2jf`C^5;Ke>X4Gvm*!VwT*TDlvKD2u_G;pyTS!f`$M$NzT5z90V$ru*?YcQZXm_&;RM2jf`C^5;Ke>X83I~==`7X>)?SSAKE<|8ap4dUuI@g bb7y8)KaXRl`VVPe1|aZs^>bP0l+XkKM6n#5 delta 66 zcmYdGoS;pyTS!f`$M$NzT5z90V$ru=d#Wzp$P!+S{+>g diff --git a/assets/icons/MainMenu/FileManager_14/frame_09.png b/assets/icons/MainMenu/FileManager_14/frame_09.png index af431370807adcbacfd809f79405c05b8c537387..fa7b04e78e0c7e18847ded7a6933dde00711256a 100644 GIT binary patch delta 72 zcmYdHpP=Hb=jq}YQZXm_&;RM2jf_na5-Ado-W$}0Bqseo_@%kA^CACa24>;I{L9#R ceEQfJPKj}zS#w%5ngIwrUHx3vIVCg!06p~^&Hw-a delta 66 zcmYdKoS;pyTS!f`$M$NzT5K8X~GNAC?-3=CTSCwyREq|fuw;Y-`Wf4t7kJPeDv W1TS6n{B@ZD2s~Z=T-G@yGywpXO&d4> diff --git a/assets/icons/MainMenu/FileManager_14/frame_10.png b/assets/icons/MainMenu/FileManager_14/frame_10.png index 53cbfc54154bb88eed9461de0b7a32f2ea4b10ad..c6faf6c2969874932e954d3f3e275ee8c3651349 100644 GIT binary patch delta 77 zcmYe#nV{lf?CIhdQZXm_&;RM2jg1c*cpm@V-@|0b^Raw}-715P{}X;4JaFVgyJtgV h=R@|(%xr4z%nX{TJclfvi{~={fv2mV%Q~loCIFGnA$0%% delta 72 zcmc~vpP=Hb=jq}Y!f`$M$NzT54!#oxclIAv5I8JQ->%rusQ8Dy*FMGaQZXla&+qx2jg6_M+``PvEQa^~@~8g!fBL|ILlOU`KfPBkwsb$k XzByc9Hnl5UWdH(CS3j3^P61h@5Db0 OK;Y@>=d#Wzp$PzS#}y6$ diff --git a/assets/icons/MainMenu/GPIO_14/frame_02.png b/assets/icons/MainMenu/GPIO_14/frame_02.png index aa171cfaf7f931e2cfdd8df710a0d1def19f9ab9..7e227af421ac42dec5c0e96a3bb8d6f8ff94da31 100644 GIT binary patch delta 66 zcmWGdoS;pyTSQZXla&+qx2jg3H*YRcVm@W_D!9KtCH35h!YPZzzn@4ghzFvo`D Ur+>%>9tI%rboFyt=akR{0J?n}9{>OV delta 54 zcmYccouFbU?!|mY_P$g?O%FQLPFp#ZieP5Y`=N~ Rv~Dl}fv2mV%Q~loCIC@%8Pxy) delta 53 zcmazInV@1I?djqe!f`!$M|C@+Wa$?LfeEJ%91@UXa(b%Duw<#gixpQUXE6YQr>mdK II;Vst01WdJg8%>k diff --git a/assets/icons/MainMenu/GPIO_14/frame_04.png b/assets/icons/MainMenu/GPIO_14/frame_04.png index 52ac41fb8c4c969bead35443ed84984518a7979d..e801c88f53cd6106434763237b4fc9d3bd0040c6 100644 GIT binary patch delta 59 zcmWHJnxJB)=;`7ZQZXla&+qx2jf}h-*Q7NXNJvCTIR7^`G}xf=mz5!{gjIf>LG)|} OAn}%W!f`!$M|C@+aOoEZL1u2}3=WQ|(-|0cJrV4E5w~Iz0}yz+`njxg HN@xNA!j2I- diff --git a/assets/icons/MainMenu/GPIO_14/frame_05.png b/assets/icons/MainMenu/GPIO_14/frame_05.png index 30a25937143277bb66b665f26a28b202c426ad5c..ebdc1382a5d0ee4390c294a0634fa72f0b367a74 100644 GIT binary patch delta 53 zcmeYdnV@1I?djqeQZXla&+qx2jf~n!k!KGbIKY%>JncU#Lu5FM+=VlnBN%|d)78&q Iol`;+05wSzEdT%j delta 48 zcmWIXpP-^G=IP=X!f`!$M|C@+_^TI*2?>phJ_#|LiV^IU6{%!q00K`}KbLh*2~7Z@ C+Yn3u diff --git a/assets/icons/MainMenu/GPIO_14/frame_06.png b/assets/icons/MainMenu/GPIO_14/frame_06.png index be19567f3e5aafe13f2c549fd797dd14fd0af52f..5ebb0953faab063d15d296e5736c3c0da3c4c2d5 100644 GIT binary patch delta 60 zcmWHJo}gl`(}4gTe~DWM4f(eoC4 delta 52 zcmazJo}i*H<>}%W!f`!$M|C@+_Ny0+ifm#6T)c@I`iu;R76|q-rO!)Z00K`}KbLh* G2~7Z?s}Df{ diff --git a/assets/icons/MainMenu/GPIO_14/frame_07.png b/assets/icons/MainMenu/GPIO_14/frame_07.png index 2f7a42368cb3a77d54c63665c6f3cd5080fdb858..7138b727d8489eb707bdd0c0e1935c4702fb70bb 100644 GIT binary patch delta 59 zcmWHJnxJB)=;`7ZQZXla&+qx2jf|2T*Q7OWmXwH)aQ<&>Xs|)!FDpYvJFC2<=!<9u OAn}%W!f`!$M|C?RZ|N5W0cLLJ3=WQ|(-|1nBnrHUoU-gb0}yz+`njxg HN@xNAw#*RD diff --git a/assets/icons/MainMenu/GPIO_14/frame_08.png b/assets/icons/MainMenu/GPIO_14/frame_08.png index aa4ad384d062a489fa867c1344c038a986d5e3b7..a753127a8e972edf29b25f4888d6dfaf86a60ae5 100644 GIT binary patch delta 65 zcmWGdn4n^#?&;zfQZXla&+qx2jf_nZVVe)!>?!|mY-nI$u)$#3|J0q|=exetXP7dB V`JZ8>;{S delta 54 zcmYcYouFbUgnPbQZa{7i{a{jh6gfC`%f@E5MlUW!}$I!FMGa!f`#hLgBE%e@^GW{B8VZJn!Ed{P}5+|dfwkR`uG3zkpm2lI`+{s>SPjreQ4-x b1Oi3|*Im5R1vk%-WdH(CS3j3^P6wBS3j3^P6FMGaQZXmFLgDb1|16i81&{r&pD7_RLGbi>v1Rh?Gwf^v&&v-$X&w#1fH&b JF6*2UngEcI6x#p* delta 52 zcmazDo}i*H<>}%W!f`$M$NzRl@n3<5KOAg(*vP|SXu!arnJtzx+w>A20}yz+`njxg HN@xNA3_%ii diff --git a/assets/icons/MainMenu/Infrared_14/frame_05.png b/assets/icons/MainMenu/Infrared_14/frame_05.png index bc1229a25f7d627c2ed91ffef656c20f707617d9..8a08e093c3f1f86e8f2e0b0d9c34f248f323e666 100644 GIT binary patch delta 62 zcmWHJouFc=;_2cTQZXm_&;RM2jf|2T|Kue8`7eGb;a6e9%frlSY#_jJzK3gixPn#_ P0}yz+`njxgN@xNAGg=p} delta 52 zcmazIo}i*H<>}%W!f`$M$NzRl-oGmx4eV|h*i2wlWMgBHJtg`y^&YgTe~DWM4fBF`J$ delta 60 zcmd0bo}gl`h1|K1|ccFh;L P%>V?Ru6{1-oD!M<M@#&BpKznP+3_7)^L^g7Ez&%!<`QN17&x1j dG;rNxV7Oc-7U{HE$(sQPJYD@<);T3K0RXHq9Y+8F diff --git a/assets/icons/MainMenu/NFC_14/frame_02.png b/assets/icons/MainMenu/NFC_14/frame_02.png index d8da3d730d4d7e696d0dd8e994b8564f0755a90c..7ba638842ba52dad66addd662a49d1c86514e8bd 100644 GIT binary patch delta 74 zcmYewoS@=r;OXKRQZa}1;6Yvn0Re`Cdwbhg9PsA7bzw{2A5WDtN1`XOdirJD?i1za ednCKF=?(wNCmcB}8a2lmfWXt$&t;ucLK6UA4IMQA delta 67 zcmc~ynxJB*>FMGa!f`$M$N#p6|HTb{9o+Dpz4;D5+kSbTOnV8gI)gWV7=>C+?PFy4 W9w#BGD=96>00f?{elF{r5}E+HKN%FVdQ&MBb@0H$3VzyJUM diff --git a/assets/icons/MainMenu/Plugins_14/frame_01.png b/assets/icons/MainMenu/Plugins_14/frame_01.png index a3e192b8394ad37bc7c9836463f558e3f86d34f0..bc7cc779a983e5c8ea62100ba268c36dceeb70e6 100644 GIT binary patch delta 77 zcmV-T0J8sTY>*^KGf6~2RCt_Ykod#o#K4#)#v*CU#K6Gx{{Rz%0E5IE#@n1MT*8ch jf3tl1$i%|I@PP*a$;}G=jfBps00000NkvXXu0mjf`er6I delta 75 zcmd1FnxNul=;`7Z!f`!$!jHoOU)vSewk@pV=eT;+;L2A6k3ESy{J(Bt7=Xaj)z4*}Q$iB}0;V6L diff --git a/assets/icons/MainMenu/Plugins_14/frame_02.png b/assets/icons/MainMenu/Plugins_14/frame_02.png index f025f2309f228d6a53391d9695088c28a2538c7a..c914a3e9fcd7cf2ebc472a955ecf40bcdf15aec6 100644 GIT binary patch delta 79 zcmd1Go1o%l>gnPbQZa{7i{a{j#*ed^SQMBTcQAfuWMW`o`S6!%0SDv8+e~i^7~aJ& jzJJRw--b!Sf$1QF?0(+sll-o*FaUw4tDnm{r-UW|F9sTc delta 75 zcmd1HnxNul=;`7Z!f`$M$Bn}uN_h`&7ioKM@9^TMaN9R?9_ea{XYUd##1DV?$9K3! fy6vwi53ec1>5U>mvu_#KF#v(5tDnm{r-UW|6tW;K diff --git a/assets/icons/MainMenu/Plugins_14/frame_03.png b/assets/icons/MainMenu/Plugins_14/frame_03.png index f82dd553aa71b22145f30bf8b5cb483519c63bca..47a1473ff7dd9c81c99238fec0b3aaf6301c071d 100644 GIT binary patch delta 79 zcmd1Eo1o%l>gnPbQZa{7i{a{j#{Ykr7#NsdFtB{Q%OG`yq1u4K`VYhHKTHf?7_7fA i*zU{Wdm&Sv?xSfv*vb9zopr0GXQ|GXMYp diff --git a/assets/icons/MainMenu/Plugins_14/frame_04.png b/assets/icons/MainMenu/Plugins_14/frame_04.png index bc22d3b00e3c908f4b19746ab1e5eb89e72dea76..0230d16a71d2ebed9c948c1462213271bccfecc2 100644 GIT binary patch delta 74 zcmd1Ho1p1hF^5r$;p%^e&wrSHF|f@4z+}w8&@997I)?Gh1BU)DObQH44{k8Nf6MS# ehDjoU@ee~%lz`;N?LU+mfWXt$&t;ucLK6Tvpc|k7 delta 74 zcmd1Ho1p2+ah*|%;p%^e&wm)+{$c2;Vc1{8&@997I)>rR8HWBZ4C}uz^q*mPe~00* e48!jlhChE+d=V*OEzS&N00K`}KbLh*2~7aU(;svI diff --git a/assets/icons/MainMenu/Plugins_14/frame_05.png b/assets/icons/MainMenu/Plugins_14/frame_05.png index ddbe5f7001e61d7d9b5995617806926e6ead6590..9518161489b21d6ae07689c36a790f4154be1999 100644 GIT binary patch delta 79 zcmd1Io1o%l>gnPbQZa{7i{a{j#=rZSzFc7Z{*~#^50;s4m=qb9*w!%a=VfAGU}7j> jVsKzO%fRsV4-*?h{zE>lpC!w)7=Xaj)z4*}Q$iB}i<%oD delta 74 zcmV-Q0JZ;aX^SjF!WR~tgT?!tirJW3>euk?5|mdKI;Vst090`zI{*Lx diff --git a/assets/icons/MainMenu/Plugins_14/frame_07.png b/assets/icons/MainMenu/Plugins_14/frame_07.png index 91a1125de503f7aab323cd7b0123aaea4a67bdba..0ccf3f271e115fbb5efa7ba53ddbf84acac6c6b7 100644 GIT binary patch delta 77 zcmd1InV{lf?CIhdQZXm_&;RM2iHyRBS=A2f^F-GhbQ&A{S)Z7cknrbod*{T)gAI*| hzvb09*^d3MXVkmKdudv9h#dnEc)I$ztaD0e0s!#vA6@_e delta 74 zcmd1FoS@=r;OXKR!f`$M$N%<+|7F_#Tk^1R@=d#Wzp$PyK_#qPj diff --git a/assets/icons/MainMenu/Plugins_14/frame_08.png b/assets/icons/MainMenu/Plugins_14/frame_08.png index c302db0ab3763564fb5ae2310c21589dbffffe9d..360cae32cebb3263814c6ad147afaf737d36b0d1 100644 GIT binary patch delta 79 zcmd1Io1o%l>gnPbQZa{7i{a{j#{Ykr7%ng|ykJN&VB$E#IP)>%zkN&$3{1ZdF#cj< iNMc~({ljFy090nL#<#`AzH2W75O})!xvXz}t1^@s6 diff --git a/assets/icons/MainMenu/Plugins_14/frame_09.png b/assets/icons/MainMenu/Plugins_14/frame_09.png index 2be3057210db4fc1fa5759bbfe095b9c7c64846e..15c2e0a8e1d045f723a583ae25282a90c4f0efa4 100644 GIT binary patch delta 79 zcmd1Eo1o%l>gnPbQZa{7i{a{j#{YkrQW%&x7#L?VGyKb8V)(-N^FPyn2F7GbCLRWc iIX@Wx{$}{Y092+X!e3^;PvIH^5O})!xvXUZ>uyxR2gZVUquc)I$ztaD0e0szI(8pHqq diff --git a/assets/icons/MainMenu/Settings_14/frame_01.png b/assets/icons/MainMenu/Settings_14/frame_01.png index aad9e35588f1c07576ae24838ee23ec3104869ad..1f8f45ee1810467c88f271ae2ee3119bb858c8e7 100644 GIT binary patch delta 74 zcmV-Q0JZ;aZjdQOc$@($0M-8hKO6ua+yZdm0yy*p8Ug|J0|fq$0+hG{_n-vM?gZ)R g0rjH-_%H$E0XNnVr2amt?EnA(07*qoM6N<$f+)fr7XSbN delta 74 zcmd1Ho1p2+ah*|%;p%?|dl?3~I}Ck$7>;dVcyNN@>ko#{Ee!2840U%Hd~z5}O&Gq; eV0e3i;qj9QQ^Cx&&%dxS0D-5gpUXO@geCwv@f@fC diff --git a/assets/icons/MainMenu/Settings_14/frame_02.png b/assets/icons/MainMenu/Settings_14/frame_02.png index 124ffde21345ef896586a1c00518441458ba7cd4..8127986f3600a4b9616f8443cf7ebc5f88fe0c17 100644 GIT binary patch delta 77 zcmd1HnV{lf?CIhdQZXla!~eq?>c=OoKc7<6;Q5^OGC%XN^F2KGDzmvv4FO#pD?A<_T< delta 79 zcmd1Fo1o%l>gnPb!f~BZi{a{j2Kzq@ayAUTdl(MZFuYA+cshmQ^B0EiJPdqy82;oi j%r;@jp2G0@48!d|k@|vln=_~DF#v(5tDnm{r-UW|oNOI+ diff --git a/assets/icons/MainMenu/Settings_14/frame_03.png b/assets/icons/MainMenu/Settings_14/frame_03.png index e4d72fe6fe32467766ef61085378c952a72544f5..0479bef216ba7e5eb38df321f54031b986108e31 100644 GIT binary patch delta 79 zcmd1Ko1o%l>gnPbQZa{7i{a{j2Kzru4;UC*elUeIFr50s_~;eGXC21xUm4!XFv+WTno__*o#EaLI8mzc57*dQ+Y*pV{_zVtLM he8BnmcfXH33xi=lpGQe+#!dzx@O1TaS?83{1OU?H9;*NV delta 79 zcmV-V0I>gTZjdBOHAzH4R0!7rDgf300N>02Z~Oo^_yC*u0L}aW;`{*G`~cDX0M>i} l*?a)Md;oCd0Po-c-|))x75C%v8Ych%002ovPDHLkV1kQIBh~-_ diff --git a/assets/icons/MainMenu/Settings_14/frame_05.png b/assets/icons/MainMenu/Settings_14/frame_05.png index fadaebc9fc61fe4c97444adcf4aa7839b62266b7..5aaa8301053c5a14b4e71fc691a1294f253c96ad 100644 GIT binary patch delta 74 zcmd1Ho1p1hF^5r$;p%^e`#cPJe;Cb@m{Kk2xyZvN-{m1prV0D-5gpUXO@geCwnK^s~C delta 74 zcmd1Ho1p2+ah*|%;p%^e`)?TH?=aX{F#P_)@GFPm=Ng9pYZ(6JF#MBYu$N)j-@{OU efFb=2!}KS;hC<;&LIKeXK;Y@>=d#Wzp$PzKYa90f diff --git a/assets/icons/MainMenu/Settings_14/frame_07.png b/assets/icons/MainMenu/Settings_14/frame_07.png index 6301512e8f4c38f2d01992d725660757cf699646..424e68a089015fbd0e5354441bbfc793ff5d9afb 100644 GIT binary patch delta 77 zcmd1HnV{lf?CIhdQZXm_PyN)+#@5be>_*R5jF;^h+w9eR h&S?7ZsQK^+G1!Ul${hJ~=Pd&ec)I$ztaD0e0ss<_9_j!9 delta 79 zcmV-V0I>gTZjdBOHAzH4R0!7rDgf300RPkg|JVTkya4BL0O0HZ@7w_Cya4390REf+ l{Hy@{GywmY0RPMY|K#w07f_JTWGMgu002ovPDHLkV1l>|BoP1r diff --git a/assets/icons/MainMenu/Settings_14/frame_08.png b/assets/icons/MainMenu/Settings_14/frame_08.png index ce0611e3460a33cdc38a5037297cb70ad956982a..347b760e9c9e986386481f4f39ef16a0869c2cef 100644 GIT binary patch delta 79 zcmd1Fo1o%l>gnPbQZa{7i{a{j#{X-X7#Nr?urU2N!}#bQ)BitA{~j=0wqg3Ez+@o6 j@Y{sxZwll8vrG&UpF diff --git a/assets/icons/MainMenu/Settings_14/frame_10.png b/assets/icons/MainMenu/Settings_14/frame_10.png index aad9e35588f1c07576ae24838ee23ec3104869ad..1f8f45ee1810467c88f271ae2ee3119bb858c8e7 100644 GIT binary patch delta 74 zcmV-Q0JZ;aZjdQOc$@($0M-8hKO6ua+yZdm0yy*p8Ug|J0|fq$0+hG{_n-vM?gZ)R g0rjH-_%H$E0XNnVr2amt?EnA(07*qoM6N<$f+)fr7XSbN delta 74 zcmd1Ho1p2+ah*|%;p%?|dl?3~I}Ck$7>;dVcyNN@>ko#{Ee!2840U%Hd~z5}O&Gq; eV0e3i;qj9QQ^Cx&&%dxS0D-5gpUXO@geCwv@f@fC diff --git a/assets/icons/MainMenu/Sub1ghz_14/frame_01.png b/assets/icons/MainMenu/Sub1ghz_14/frame_01.png index 52dc4ad21f99013e7fc6c344756ea5232db4ea7d..ba1b89f9fb964de0ab761f6e88449c33e205dde3 100644 GIT binary patch delta 72 zcmYdHpP=Hb=jq}YQZXla&-v3|8k$p^RW7qLE?dt&LqcN44%rzM_6Bc$9$NCD`6EBG cFtZ3F1FHa6;pyTS!f`!$$N#p(|Ke?bq*?YcQZXla&-v3|8k$p^RW7qLF5A!J!^7iqhR0`*yu`Pf#GoGsf3!Dt bGIlY%+Q?a1%|6MC0SG)@{an^LB{Ts5Dg+!( delta 65 zcmYdGn4n^#?&;zf!f`!$$N#p(|Ke?bq_j>8mIsO diff --git a/assets/icons/MainMenu/Sub1ghz_14/frame_03.png b/assets/icons/MainMenu/Sub1ghz_14/frame_03.png index c1e438b01c162c7b9fd7f70142639d5b76b3f689..420e568ce951641a7db96b533a8c5e6a9242f5db 100644 GIT binary patch delta 71 zcmaz_o1o&P>*?YcQZXla&-v3|8k%1+a0@dtUyf%}V`EcGV_UYL$A_kzr=*3 a1|^2W<{S*0E_A(M00K`}KbLh*2~7Z}Tp1z& delta 59 zcmYd`nxJB)=;`7Z!f`!$$N#p(|Ke@G}%WQZXm_&;RM2jf`FYj0_A73=9uTtl(g1Zf6l)pSye|0}yz+`njxg HN@xNA0;&>= delta 45 zcmWIcnV_N}?CIhd!f`$M$NzT5zJCpZa~iuCT!p00c-VE_V8S3j3^P6pP-^G=IP=X!f`$M$NzT5zI|^P6%`)yi?J}6NlOb;pyTSQZXm_&;RM2jg3zaM=#@N(uqHBWN2V;?|JH@zXyJ_H+C|zGBU`; VaL#+i=Ag&`1fH&bF6*2UngF*G8XEur delta 59 zcmYd{nxJB)=;`7Z!f`$M$NzT5j(hhLcl>XAcuGou$>`pl#2=s8c^MhRS4)0KUbc8P P0}yz+`njxgN@xNA3ws!~ diff --git a/assets/icons/MainMenu/U2F_14/frame_01.png b/assets/icons/MainMenu/U2F_14/frame_01.png index 6903a28b8d72866c8422d49007bb6d3f9aaa23be..0dc3edfab8ca939b69111df30ef0cc08f9d3a6c3 100644 GIT binary patch delta 77 zcmd1EnV{lf?CIhdQZXm_&;RM2jg3#!xi8nVAN!s!DHSo}UwtCa&qGHv4jlQ?`0_uC ho48=xFL|FH8;0l`d^g^HjC5xJ0#8>zmvv4FO#qL diff --git a/assets/icons/MainMenu/U2F_14/frame_02.png b/assets/icons/MainMenu/U2F_14/frame_02.png index e4bba739d28c7f545f78527629ac063836758b97..21dc5fa7dac47f09bb33d5c104b78173dbd40282 100644 GIT binary patch delta 77 zcmV-T0J8sQY>*^KGf6~2RCt_Y{QsBbXA9GR2gdhrnHU%t8d#YAe_;&y!o(=R#Posb j{{%)C5r+C7OpH7LX`>F<$Xv9u00000NkvXXu0mjfW?Lcq delta 72 zcmc~vpP=Hb=jq}Y!f`$M$N%<+?!1S;+w#1B-w?pe?fjR&O@P1c0!Lc`f7=FW9z8*Y biELsFlXV3WJ?9$uGXR07tDnm{r-UW|{x2C9 diff --git a/assets/icons/MainMenu/U2F_14/frame_03.png b/assets/icons/MainMenu/U2F_14/frame_03.png index 4c903182c9f94b3e94432356d907431fa60355c7..d516bf7f62bfbcc15b44db9c030c910690e7705f 100644 GIT binary patch delta 77 zcmYexnV{lf?CIhdQZXm_N8sTv_ZvU{jaFl0Yx`b5L#@c*@Bc#*pISQu8#-SyU;fY8 hqo>64)qaLVB}43Ez6-&{xvC66;OXk;vd$@?2>^btA$9-& delta 71 zcmc~vo1o&P>*?Yc!f`$MN8sTPwfu*FTPJ*JU)b2X@E^N#2fK3yi}Mb4=Nr6i(>W%1 bFmp5XUJwW@<~@6h0SG)@{an^LB{Ts59|Ic@ diff --git a/assets/icons/MainMenu/U2F_14/frame_04.png b/assets/icons/MainMenu/U2F_14/frame_04.png index e4bba739d28c7f545f78527629ac063836758b97..21dc5fa7dac47f09bb33d5c104b78173dbd40282 100644 GIT binary patch delta 77 zcmV-T0J8sQY>*^KGf6~2RCt_Y{QsBbXA9GR2gdhrnHU%t8d#YAe_;&y!o(=R#Posb j{{%)C5r+C7OpH7LX`>F<$Xv9u00000NkvXXu0mjfW?Lcq delta 72 zcmc~vpP=Hb=jq}Y!f`$M$N%<+?!1S;+w#1B-w?pe?fjR&O@P1c0!Lc`f7=FW9z8*Y biELsFlXV3WJ?9$uGXR07tDnm{r-UW|{x2C9 diff --git a/assets/icons/MainMenu/iButton_14/frame_01.png b/assets/icons/MainMenu/iButton_14/frame_01.png index d9f10748ea04a13f2cd4de7f135479338e193813..6e7398d8698c3fe5a21af35c99cc484e483ac845 100644 GIT binary patch delta 79 zcmd1Eo1o%l>gnPbQZa{7i{a{j#{Wl|81^tRTwwYi!1QwBS3j3^P6@~ diff --git a/assets/icons/MainMenu/iButton_14/frame_02.png b/assets/icons/MainMenu/iButton_14/frame_02.png index cf3422c03cf2a45e43b69bb16599532e1cf2fbe2..531364566b66f951b7f3ed4d9ddb45035301dc21 100644 GIT binary patch delta 79 zcmd1Fo1o%l>gnPbQZa{7i{a{j#{Ykr7@jaO>|px;fbqv4hQ~fk&pt4nabTLpz##UA i$((^nkAaDY0jR9*^KGf6~2R0!8&`2UCD{{x2qGZ_9=F#Pz!@Ysjpqz%K=8V2ne2C+X3 jzJD01|1h)z)%*bfw_6ktyxb|N00000NkvXXu0mjfuvj9( diff --git a/assets/icons/MainMenu/iButton_14/frame_03.png b/assets/icons/MainMenu/iButton_14/frame_03.png index 1b0ed62e06d2bab77e272552619b9ad09f879c6b..31354eeff27003c5e3f640e0319402642a4d0ce2 100644 GIT binary patch delta 79 zcmd1Eo1o%l>gnPbQZa{7i{a{j#{Ykr7#NrszA!P|VEAvr_=JJw`9+q~&lq(7FzGQc iZ2!ZwgMmT*4^Wx2g@E8LDqc_6{n(U5LlbJ2-8{mL^QEl#@S3~00K`}KbLh*2~7b0^%`0L delta 77 zcmd1GnV{lf?CIhd!f`$M$N%<+|C!tV8%z8PHTY9==tBG9w!M^GzGsD$4q6hLelm;^Zfv2mV%Q~loCIE~AB60u# diff --git a/assets/icons/MainMenu/iButton_14/frame_05.png b/assets/icons/MainMenu/iButton_14/frame_05.png index 79f217b962b55520084f203c6535d34c94b23103..82dbaedeb621f44c1280b7c0ea541aa1d55b1e0c 100644 GIT binary patch delta 72 zcmYdEpP=Hb=jq}YQZXm_PyLk6M1JAJtjqp0`t)x%xMzL*O9AucMiwgnPbQZa{7i{a{j#{Ykr7@jaO{9s~u!1R9)mdKI;Vst0E=N8umAu6 delta 72 zcmV-O0Jr~cXOJXAE=fc|R0!8&`2UCD{{x2qHyHl!VE9+U@Z$}`^B9Ktdl>2=sD`2D e4?{Ch%^v{ZQ5C?s&SvcZ0000hBN%tEu|-~j*F0RK1u{`dg!^Z?IH0JyvWc6P5c0Z{Lg9>4za(^$^ZZW07*qoM6N<$g7Y{a8vp84T&wlU$YQyop2o|p%#iuA2<6?W)00lWOWzlVqa`i zU^&NQHlKo=js=IW;YnK~-YeqV5T|Mt#|7~`yK>L`s4?0 literal 3692 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 diff --git a/assets/icons/NFC/Detailed_chip_17x13.png b/assets/icons/NFC/Detailed_chip_17x13.png index 9aaa1c5552a2d115b7042a4bee7a0c636ed00f01..71c56f60c53026b72376618da7aa53a62b72c0f2 100644 GIT binary patch delta 95 zcmcc0UN}J_l92%j(wTN_2T~TEE{-7;b65{<6m>9QU_EeJy>+F=+Qk#EWk?* xTs~d<@nTa+>913ZIhejqdpz;d+26aC_|)awac4_zwPXRA<>~6@vd$@?2>?Q!BRl{A literal 981 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 Eg6y?d%m4rY diff --git a/assets/icons/NFC/Medium-chip-22x21.png b/assets/icons/NFC/Medium-chip-22x21.png index b1f15432d48fd0e956556ea20121101e9f702554..28250ca9c0eae3db9f63f2e842881e971db470aa 100644 GIT binary patch delta 131 zcmbOuJB4wAL=7VY5M)IwTL7tOPZ!6KiaE&^2M!$m^#6Z&8w(rfvifL!gTJ5C5`O-- zpZs$B6z0pn+4*O%+z^>z_qYDQk>d*veCcF#s!ymmpz>nPfg`)#GjJgTe~DWM4f4LLW3 literal 3740 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 diff --git a/assets/icons/NFC/Modern_reader_18x34.png b/assets/icons/NFC/Modern_reader_18x34.png index b19c0f30c9f3928d3129acc9da92d5a9e962d084..aac13396ae38d0372558855c717e0e50581aa319 100644 GIT binary patch delta 137 zcmca6Gm~+GL_H$|5LBJt5)PyiJY5_^D(0k~-pJYPz~FGPKAzLDy@2Up$+W!G>elAF zT9QhNFDh?EaA?}?c_!?bP0#FWqk02-S$;{X5v literal 3670 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 diff --git a/assets/icons/NFC/Move_flipper_26x39.png b/assets/icons/NFC/Move_flipper_26x39.png index ff4af9ff05989e5ff04d3888971b7f7801c59ed4..981c172368f799f62dcc2f08222a130b7aecd901 100644 GIT binary patch delta 171 zcmV;c0960-9J>LK7=Hl(0000v)nyO>004qXL_t(|oMp)|YQkUuhT-S`2x6c^MmODh z1*bOM9D9@AKyovKQ$2!9=?%=#AxPkNYL_lAJiO|>9izT0_10eE)`+i&rBFX=9|%n! z_3oGdGb0mnMMh-!yF*z?Z;@xDtDmwiKf+m<#5bW6UW6yH+a!-+(5SC(QBJ~992U`T ZJODzkAW(w6Owj-U002ovPDHLkV1gS2NZ9}Y literal 3698 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 UmlzLSoB#j-07*qoM6N<$g0{b;J^%m! literal 1591 zcmeAS@N?(olHy`uVBq!ia0vp^#z5@A!3-oDPVO&fU|`hGbaoE#baqxKD9TUE%t>Wn zsJOLu;zqB-0U~YtrCpCM4C8q8pg=t^Am{4A9?$45g^1P8lh%4VPrama=gz8H4)^VR zdhhHSCog`m;0MdT#z$8UDtZ(M9nAlA?)<}o2keWJuFq`?Y;#-_y8ETa_0Lb=2pjt_ zI;fus+I`iEp<}YeBXuUbctM8qv&-&gelUM_I3zQHDW`m~4oe{8FLA4@3db5GzXbC> z;xoAFxtr|~qsG^wdPXnDcli#UJLmB~Vm7E=_q^GVeTL&Z?S_?$y?Fz?FHN+1JvS?I ztB&`ryDA+|K5AUPs4)3=;fxg~fwHotjeqPJ#6BM_yF4*F^z^Oh=kp6~v4q}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO z`Gq7`WhYyvDB0U7*i={n4aiL`NmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTc#AbGt^BsFfdXux715BHZ@62OEx#qQ7|$vGS)XV)HkryH8ip^Ftsu@R)7K} zpoK*#X;wilZcyuhJX@uVl9B=|ef{$Ca=mh6z5JqdeM3u2OML?)eIp}XpbFjM%Dj@q z3f;V7Wta&rsl~}fnFS@8`FRQ;6BCp2OG|8(fR2UuBDVl;Y+f-mq<~?jUy)d#Z>VPg z@)b;>uP=V3xw&xF#U(+h2=`(&xHzP;AXPsowK%`DC>a=cY04n03ap%qQWHz^i$e1A zb6^1(kda@KU!0L&pkQRGXQH413OGX}19QDxJtGq%GX)b%(z*Q}aq-dQ%X3O>pW3rIp+Qpv^9+MVV!(DQ-pixeDL_vC72l7DJro zLG`BKc8d{Cz4}1M=!2piDH*_ofN2ZFgr{pD2c9!h^MKi*2$=3;z1JuL^9);nPl)UP z|Nnu^&_kE&fCZSXr;B4q#jQQlIQf_qd0c5+MXOX$CUrGc&h{NFs!LOA8_nM2jgySt!IBFjn)|4o^*9%oVS*X zZ0??}n8{i*U;Ri9Uic<}|l_6;w1%IPg#Ybbe;UU!j&K6%UWKMy2+v zd+;yhlYZ_kTP_hFZXj~h;=H7@?t!?7<+Cq)1TE_njXLwt{|dW`N6ZgNp{aEbcu&4{ z?-7XAk9w%%Qq`HH9p(6A`#fReDXS{?wu*1&4cg@tlrG*P{m)}d-osblSZ)cuotM$v zPwW5H$pSs;NycL(D`2Zwc+K;@CAtDnm{r-UW| Dsjf_~ diff --git a/assets/icons/NFC/NFC_manual_60x50.png b/assets/icons/NFC/NFC_manual_60x50.png index 787c0bcfe01755f4dcadcdce004a1a0fcfb06f41..6a7f75499edb28a3e489c43d2a6393098dd4e315 100644 GIT binary patch delta 294 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 IrsqTc1+$%)k^lez diff --git a/assets/icons/NFC/Release_arrow_18x15.png b/assets/icons/NFC/Release_arrow_18x15.png index 187a9034542393c02053be27489a01b57db7e0cc..bd487fdb5e9c4130251f4f3cc119ddf252521858 100644 GIT binary patch delta 108 zcmZ24Q#U~(jgbKe4*p%VA4s`+x;TbZ%t`*U-(g~>V?$$SV>1x9HZFAh&T#qvTpk|2 zGkiWg|7B)K%;4K_Lx1O|4Cy$A?E=f}y94&&%Dq{XfWHPgg&e IbxsLQ05)nV!vFvP literal 3631 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 diff --git a/assets/icons/NFC/check_big_20x17.png b/assets/icons/NFC/check_big_20x17.png index 0e84cfa071cafc0e6804f154b8e22973b2952a95..ddc7d3721c83f19390776afa3c7bc27d1fe68aaa 100644 GIT binary patch delta 95 zcmaFFUN}J_l92%jzS?gT22vKDE{-7;b99ey6m$p>U_J1)PAi~`FJvA2(m9ff#Y~Il wUe)b*eqCz%O8-c{MnkO=cJ=GmGL?saU^>2(_foLgS5J^xp00i_>zopr03l2wb^rhX literal 994 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz2!3-o{&8q2PU|?nl@CkAK|NlQwWE6~sz{m^% zZsqL{fj(y}3GxeOaCmkj4angv@Q5sCVBi)8VMc~ob0mO*x+Sg=CBgY=CFO}lsSM6V zsfi`2DGEuI3Te*yDXB#Y?nQ|O8JWq&3IRp=$*IM~`9<}I-^K$qI(fP{hE&|D?PcU* zP~c#e{qkR5|MY^WmkA2TAI|c8kjwS9^@rnWh5U{)PZ}bQe_N%vLt2j8c+Tb1^+9{G e<`%~jcrt7jKN@*#$ZMzB}>VcEo(xFhBigA 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 TFC+3}9cE|kU{!4CefEC<&8td2 diff --git a/assets/icons/PIN/Pin_pointer_5x3.png b/assets/icons/PIN/Pin_pointer_5x3.png index edf3d41bb59c5defdb613ef66b07de069277a524..4a4dc8a7794887a7a4971cb6541e315ade937037 100644 GIT binary patch delta 53 zcmeB>ai1We&&U7-#lAm6ffS#oi(^Q|oa7w`w=^~~GO&d)c5kttpaN3i>FVdQ&MBb@ E0E1KyDF6Tf literal 3592 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 LwKgd=cDwXHDN#*w diff --git a/assets/icons/Passport/passport_bad1_46x49.png b/assets/icons/Passport/passport_bad1_46x49.png index 9b0e7c74ef20cfdf8b046d7597bd857ff786e56d..94bce9c4b12f513624b38ace6f13ae576613f69e 100644 GIT binary patch delta 247 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 q!cqn7 literal 1304 zcmaJ>YfKzf6rOfXRcytG#ws-q!wyIYd^)Aa|e~?ZxbMHO( zobP<+HBWaY+c(tQQG+1JhWO@43a(!GQrCIlclUh%18}+Bjb_{~Gw0?d8z3RolmQyo zr5=z1l3E=68Uzr;Gp?mGZYI$oDyHt0$~xYHZb54V3A7e0N$CeJDuW))2x5z~pJ1q_ z2C;4~K_;v)=+!ol*r019nN~*n6+y*X??VFx5d!GImC%AdU^rqSh%MoYa93L+BC!H&ILn!WIU@>^MNnRn(Dia)OWKZ`0{_!kRoh7yEkLAzV-DF0 zEJ&`gY7CQibw_1I$VPn7)?ihnfrzOL>A-N~kstYg#DHcuBM=At{3xdkwyy^ov($CUN4u)T`SFcE4rB9&*hGA9N zhziB$IG^IfB?{zlN?;k>FDn3-c#`wyI9_EL5+fi*qTD%GbW&9W+q1k~84P$>87*MI zd9vZ)@P{U!fJ3*gvm+fXl}d2?(A=r*2(o5lJQ7M5zJ2AT_}b6V^`7a{=!f+aKwW#{ zK#*+ubL{$0C$8n$k^m}!+ z4aqGxKUFwYO9kHiYvbahk39Cg+BCCo%lQ|M%n6$g@0tAQ^Oob^{JwL>IUGgu*GwPc zUM;p;E48 fV|H=hUc`f(xyf_n$$93k^1mt`O-5$gvSa@Nx4y<4 diff --git a/assets/icons/Passport/passport_bottom_128x18.png b/assets/icons/Passport/passport_bottom_128x18.png index 691ed8b4ad994daeacf0ac0d3966affc2a30fce7..26d2fb53b43358d58c83646e2888d3f02b1df31d 100644 GIT binary patch delta 161 zcmey%v5|3tL_H$|5bS>aS`SE7c)B=-RLn`f@#jAn*e5hFSgL6-t9@wXJl4dh#$3Y4 zTEfU!(#ZdUsb0avXF0>+w*MLr0S{`0;;6z*EV8n+$4FT*MO6k{q^9Z}ohj zaHq}w|EvFh5)3Su#ee*~|L=MIvOnHE1_zElIC1oVRKWqctEmh>nEfvt<~Bb9a*U^| KpUXO@geCy!rbrwB literal 1149 zcmaJ=PiP!f7@ss!N@y;g+S0;f0-}&N^XA{q&X6@GJG*wFo2Hu;bLgRO-n>bs$^3EV z#oYu=q822Iw1@U0cqr|mrO-d8f<4r>f)olZ6-4Vnu@y0*f*$mg_$Hf;J%kL*eD8hp z{l4$_{aYCyd%eH!K%XE8{k6kRgUe<9zPP8Ce=m-`bc2iitTM?aVxP5eN`(EK}^Fc zAeVIgY=<`;O|5DLMK6wyC`zSV)Qzg6jhJOat5&M&Xct?HGKM2UyRicvdlQRx#M(IG*i}!T5B{;%qujfT~Fdyj;g5h;q#in2(&EEfTmZVJ}T;}=JWJBc<;ILb>@_7cp6EUjZGBOHwvTxu|j>QSh@y_ zE};;c$SC@T>FF90WlmAfC+E3I>Zq(geE3FhJnq|(XlSfcVr@ksgvnoLWR=9nafq6;9@F|Qyqq88h>QH@xD&G^V0lg_ibB} zu-ca-EbAqNPv$Jtrb=L3i>7M(Mxgs8*na;b^WpkS2{!#jAFLiWKLan-Cj7lhr3+7c zgw*mQ;NL!s)%9`h^6qgw6Z(8K2&7i%0s*ITX(5W#k}Y3t#6m;N)Q94B?ke)g+mM^7 gU%ivlT9RJ@Zxe-7iPO*tq5uE@07*qoM6N<$g1}^m6#xJL literal 1296 zcmaJ>TWl0n7@o3$UJ?Q+4_XB?PI-XR*}2c`OuAyb(`{GTw%Km&hNQ*0oN34HT$q{C zZ6Q8TQ^1fkv059z0vhqf*nm-M)D$&qFfnR0)`Utz;zQ8{1>vC}F{@a{rYiZhC@mK|dAe$4-atf|t_)=vd_NP9j)I2c94*x7`zGVrY;#IP&rQ3aTU-4&N8Bg zD;&w;oUU=2z==GmYDGKi;W=L91*U;!BMtQw)fkJgTwG@Ag&4=g8{>3C5u336K(RGY z^ld`lt61uxSSjWKC2+j7N!wabnwk_vyvVjgzCV{_?}o(;wDa zlZQTir*r$psSP*X>iJU_zweoT?c<+zz4>qD^{bTQRNT6@=jPUuIiq#zcnzPbyfb_} z^yS~u`T4HJ#L}Z@k9CM!4t7@kzWec+*{)k3{Bxl^^KCm@_f>x6*Zd!Ul}`R#``rot zvzGCA$KfNUf4ckRm5J`Wxnu5j^X!u&$>B$uL_t(|oHfC%PQy?DhT->ooInGFb!vqy zSuddy#hMx{cQ6RSp|L%I`yiV`AqfUjhukCvXo8u7F8p<5>p}56H~`DPRs)Em6$hfX ztO1jI3o>^34bnXSXu*cR`AQreKRz3$bY}1O{h^|#)22woEPv~R8El`dw<9q zA!Qkxz3e46SXS>|<;DJkH^^Lf8zH(ZEaHGVK!j8wN&{D>2qB0a2002ovPDHLkV1jPHeft0a literal 1328 zcmaJ>Yitx%6rNHagjluO2sA~8L5mM&=dm-pJCklnyW7Xw?z-8ow1|+-+_|%zwDWLg z*4=JQ4T2E_{h_2)G0`ZMkTi{u5Qw0Lw#J|dQHh8c!L(6Iq@h|9+oV|Uw%y7P!Xz{I z-gD1)&Uaq3Cmw4kSy8?M!?2P_V>p3U4|IFeIR98utqxMUo{T%Nuc)W*Lg+D25|xTJ#Dc$Ki_)f!x`O zDkj49i_Xv~NOZWaB~nx-lksG{9@9=yj35XU%~C8&A`Q~%He4x78qWHHg)nr0ty!*S z8hGBKB%5hBNFb^UG3Zt_x@6dJ7Bhu%Mr9?7VmvgZ>-oUuwH-GB|EFWHw{0D zm3rIM@%c21+AS#f6e!CaDz?C?EXi>^AO%6;Nx$NQDjnchuZqH7z$-VUZ=p|-1chN0 z*oc7ftGo~RNQr?e$q1a649EbIlAq=SD(_b~FHKO0B9-r)n>wi=LhYH~E)51cER7a4 z&^*~_aK^uDI){etu6T2@Zfd*YjtfxXp%eGRQg&lXYD z>C^k^p0%q=)2sVF6f4_;?|fQ5nD}e+WMi(s`rs$KPR)#LId=cV_R~+^*cMxxJJdgV zw0&8_+g)6A`PQ$~Hy$Y)&plLe;h6CKop*03e)#I^J9|&;h*gA2hyRHmn118qjZ-DT zYs5z{4S%Iqzp~Og+&k7g_(c1f%Bs?t%uxEZ{r1o=vmcyD_N6DLe{8kRrvkelywvq; z`Q^g{dk0@NX5Y;``_suk`^t}iYXe6{)aRPFZu@fLk9C(o@0F3?Ce_;EL2>Mdvm3V0 z_HUjky{>&ex-K?+CR4f6soHSh^7(%sEv3pv->1q>-LVRrpo*u*!||g0KP*xg3lG+| Gzx*E~RoOxS diff --git a/assets/icons/Passport/passport_happy3_46x49.png b/assets/icons/Passport/passport_happy3_46x49.png index 7aef17674336e71cb1cdf323c1fb039e0e627d33..9f5e84571935a11b12322910fe6fa07be325b876 100644 GIT binary patch delta 315 zcmV-B0mS~q3d#bI7=Hl(0001uLZ;LJ009w6L_t(|oHfC*E(37@$MNs~=dW&P^csUk zDo$cBX$ONvde{uo!~=Bj0yYcDCEmaTpo@3}oByVpN(`O!Ch5c_5>B1_n|wYb0G5B9 z5&&l$U|MAx(6|@?v-dxnpbEuJ4O=B&SnaYne*b)oX}QB`=YQJb_sgWNc7JCkf`f7I zWD;ud#3&E7mXW2A^y*?4TLr&~yyCqFZx9#FQph}0SVWgRKpc~W$OTCnqX^s`3R$^) z!v^g3kGw36w3l(_y~zW%y)Rj3`Qys_i8iJ~Kuwdtt*XHHP?ap`*CI||zOpT()Xq;3 zU=oBAAb>WO1T;V%lYpf>r-4d{K?OurG%8#GHiNpbah}dCVNHm^{sE^QUa`!CW%vL9 N002ovPDHLkV1g+ejYj|g literal 1348 zcmaJ>eQXnD7{7&~lejEf6dZ`TCJQE*5i}V=Gtg{i3Pxj)$VR4uj%5Br(2>QcxJ9tO-PXw;3zyuz@B6&Z z?|FXD*S*$I_h|8o)hiGLDGt_15x6?wOBF4H-?y&BYT;6D`y1`erf#QY3m{(2Q~(-` z%S|8xWUYP2H^7Y`%eswdqum$|iK-cQ$T=NHCZ2?71aWW5BxN-QY*YbFM#6(l4~<}` zp?R>UxG)(``arW$(_w+l9d%K)Bc=)(wrL~k&WO-J9N03NiMJ$DV#b5b*%jeFCnhj- zPQ{LSuz6CA;Re)aS^(u86t0paiSmL&lNDK2lnp3N(iB0m1jXVcDKdh{vgpEtL3fs> zixDZX;0&HTShH;>MS@7D(~dObFs&wn5(I%DX@aJ4sDY>26Skbe6RGui3ld1FmXWj# zGlAwT%8J=)doW0KK8AQQ99}e>NG)Uv=8VY5NrG~aL_D4gY)(66N5KCymefu~+mnEZ zfRx#4sjwjW`aBpW@Ai&zija+1ZyB&Ea*JfDt#OdBgOUe>HxA9vM4bc*$0-`F0Gh{H zMo@8?BRQPYR8HkN!AUA=-p*2ZUSj9~!%3{G+DlP>pNr)J66584924*d=;}N+m`K@j zLIru>2K2pv_1zXL`Ya&ZrWG~KmV6sDG@G`WYBrN7%{WN(p|GqPiJYV|SEc!&C14qC zKnqxA9Gy$EXe>d&sR2b{VX*~Tr*W3$R9p}=4(Bx|&`B3dGdc`^9{kf_iiuqr*cMf-r|D(OMvukwvy8`o1`tw&u9$(pU5#95~ z%oTI>8uxp$)MLN!$|u8Ts>&uiuO7ZWBpiL98lP5}6NArIJQJ=spqB+Br+<8N>Vw_S z_Y<{yCf_|@e7Vx~+0Lm4rC5)>;nUic6RxqR?aGg??}}}We<5Oh`o+G7&-IS&?LRe} z-r_uRFyy2dJyS4Wz?o~hpirfB!b{SC`cogKU3Sa;{l$NW9Rh4&#f XzZTxR@26EIx&KWzkJ*w`UYko(>z`MT-G@yGywo~d>y3# literal 1083 zcmaJ=&1=*^6c5`{YN6oOp2ifxLMNGgZ8ouMX*aueq1!Io75CW5WYP_7K1`cmkDlB-hOF=!v8?;5Sw{!P^&I!WElc3#UoyM|F z;!wi5jnoel?#*H5`w1qSlmVA+1W{T1{r;l}0S( zRfXIFW;+qXeHdlaLj;FrBn=W4#1Y65u^Vr*vdF0patM<~;}kf`PAbJ~Ciih7D-x2! zFi-5*I%6&RpT@b?S$ij;a*Jm1c1n0d{OO@HFW$w0azoC>UQGku6};udWILo0t2x;Ccg- zAj&l}d6x!BJ2VaMQLmQ9Avi9x9h^g<=uy|zd9y9mSD~&O1X`A7K+`KyAC+`f^LhFM zfA38B26M_aJdI??#wLpC8%0utSfM^tEM0>omr#gJWR!fv^mGl0GN&l#lXGU0hAKXu z`SEly_~mr9XvFs^<%{$7>7N>3y0PYRyLxnV#E-W>AKvHUM%`Ix_rJUA>+7Qha3B=G z*#5}1pIh%HM!$?7eiFVeO?Ba3Qh5II^{a>9E6OE1hsPo!EeRnwOFFl30@Rw>*txpS!QO5&vC?H tXo#%p4vNeYnxk=GJ<=^W&dg%`^A}x^N0{}HxG4Yt002ovPDHLkV1oZ0ZxjFk literal 1244 zcmaJ=eTWog7$3Ti4$=CfgtU@jq%>&0XLfeRTaUY)U2p03Ze3ShNk+zwl zw#s=f@2Am_-8~kdO=GMcw%0W5z(ElpYfi-twOWdr^Q+-=tY#^4&LkR6 zQFT(~e1S}R0U{NKry<92q@pq=FaR`+XGwt*c$Sk`UZOcp6ID%;$oYrD;R4grih6cF z7`~;bp(ye-maSH+OjTsOV36fiRb@GW6$Bbv(BY^Xfg0_Gs~aA46vDvvBinPy*ds8! zktjuBs`VTkKc8Q4?1uA|!Zl-Sz-M`eV;v_>Y|c82is*kDi&}@JQ6I5I6nY~8#0{}l zH^8`f_YV{sVm4Y|VB@ZUitfP?2f0yBPf_>}W7?)>ambKm!=w!)D6}N1kOnd*)3OO= zsK{!9GhoBdVt7$WCL}%4DJ8p-JfBG?B{{2$ol063vze^W)xhT5Faj<_jo3DhJ&#rI zi`CKr0+AP#Jg?FigTjy(dEt=flY+=_%f@tCN>v;2?^3~@QYj7HVgN+7x#gY>+K?5FH zG_Oh`oire#fx^j2OIA!tf8DB<9c!Bp4m?~u^x&a`cYi-{^R3IP zPPoVV65n0W$8J3}03V&W+H_+b^T@7We|i6jJKg_Srwr=$%B4R#Km9N*^^dcUU%vR^ zl{b6-?3!s#7Ux3KipP+Z}O#J;?kG)wF^K0UD(|>{@Sg# zvv-qQaz}42@A+oi2is>}bl*L5YU5{r{g!N<{OIYUyU+hS-T%N+VrsOhvhSTWpW-}; MT&7n)()IlKe@XVQIsgCw diff --git a/assets/icons/Passport/passport_okay2_46x49.png b/assets/icons/Passport/passport_okay2_46x49.png index 34fd3767b92bc334f15e4e13811020c1e0211078..62f39ba215041204f4f18486e1678594b99bc6ef 100644 GIT binary patch delta 276 zcmV+v0qg#O3Znv$7=Hl(0001uLZ;LJ008PqL_t(|oITJnN+e+vMd7cWHFkl5o!OD8 z7zpJ8#1S_zp`lAKG!YGrq?cgk7L2sT#7x{lnN6THg27*o({F-eyvdEu;c}fr?K{;1 zY*aHf2iqq?wflaFIL#hE{^a63EPttHVHHO~L6~&3p&cW@B!3)rFFytHstG(#)$Z@M zo)uRJ!BS}v%Sn>Ju|b!$AI_xF_Bf%LXla*cr*-bhB^i-nOO{f a{sRtCRp;F#91Y6=0000eP|nH7{9gXN~Cj8-Povj-o(x6YJvi`=jjO?tS0q zeSXjLd%kXOXGd$jZ>*tz1;sM_Qd!4eFl>lMknpC0Ehz)QLuJsfn-T2l$x|4r zs}byJHc2M!D9Gwv^_75cz!GpAYygr=OsBo+n6}plKXx;O?;LNd??=*HtZuz*QXG_H@fc z%N8Zs8uB6-q*{r=u#?F}!=}5CDVQ^&AlU@vCkewS2R5(mdMWTfjU~0+^so(x6mYE} zM}Y;=)>XkUd3SbHR)lPXryLztMaqemGGqYLONbE+-uP8r6*LmaEGw(H3}_B#0=$At zEXm@ms;~;j@5raV{)DohoSTw}2aWT-$McF_+7N=XP*o5hNlBs~I zZyowxz_NG53Q-40p5>%1D_3oU&aCBGZq~9;ARjzSX5S z@A;>FOUxLP5U06J+c1lS4&rqjjy=>tKRJ^ds_R>{c8{$}HYhrX*>`{7SxW0ObGYd=rz{>|;) zcDd&GWRr6A;8aunL+7upZ+znLY-x|L5bAlUr}giN1Mc~myY_rmr*V6W_KxGvY}@kA zrz^ML*p=RQVps7>VtDoM@An>K4i85A-!0{Cta)91@|#yO%V&g!>02KZH?Da5R9nNw zM=qSXxay1X?wu!p9KG=E>G9bk|C)onm&TrzuNNN}x&Gpx4SmR=iQ4_OTeDx5e@cm1 KhdAESxAQ++sKGP< diff --git a/assets/icons/Passport/passport_okay3_46x49.png b/assets/icons/Passport/passport_okay3_46x49.png index e65da5b0e586ab706b40263b637f0fd3647ac5d6..d81f788193f2c0b4f86fa346a7c4d5da35aa9f65 100644 GIT binary patch delta 296 zcmV+@0oVSR3bz7~7=Hl(0001uLZ;LJ0090;L_t(|oITK?Zc||x0MPS)w;MMZ3D>O& zf)WG*K{K@p(mulEF%C2fVSkKa;Ib9S<2vwlDmI3(HitKn?dqbL59Fs?23cK=P)%O< zIUAH8C)Dw%U!;AzzjKpa4C!?-{$s5Re6b8ROB}sA%ba;RpJdMLW@dhfU&v{!tQsQ~ ulYB=f^IK78=OHGjX@d9E>||!=-{)W7TVQ>E(4eRQ0000R)5DzSs8Z{wND1@AE!+ ze$VrJzFzO@Y;Rc8yaqv#hGarc!;^q7T~`agZ(r^0fX6yNmi0H=hF?@%fVAqi3eaRh z=>ch==!5+eAcP>bFPoXHpG|F&G`m136&s>da3C5%LXncAXuZHkRnTKvVQhN*IEI>f z7~9IHsFV{0c{5RV!RB&jMl1JfqK-v2qM?!m9Tb4Cprt~eP5w%}KSaz#yI=z@vg z8^#t%Wm8>f)OGRp)0DQsp_LBLoqZ-aU{**6eY2u#Bu1-gTZjFZb)f4 zz7!1J!dTw-9f>51#UfE;3ES-;YGU z4KZ4(U|7662dWrCHqsNW3A>{7$+k970G6MW!x;QS=%y|i6i|6y)o~Rt0?x6bhATY9 zCt(kQeA6&js6BX*w1Sa(rB7TZJgk#$$1&t%^-rp08LMsKz#7 z>?JIBN30Zef#Tb4#lx?BI(#Kl}VE zr>*Xj7oPuOCYk$s)Y#tsK*%~np8RyS?!L1%zI<}}!MWYx!_m5O^Oebw6XCJ(_ObK- zTzE2ZDn{m<55rd*dxnMr?}ze}_QjcOWc_;&d9i~N9qGpsZ_J!4w`@NTS~`yv?;ke? zhv>V?2d>v2-`~IQ&nd6F)duN|MblK>4PVZ`*vyPb!yT5yrS%35K zA7@kco=YdXx2-A%Zb=_}`+d*RzhdRBuUsVFjp#>D|NZ4t)}y$rkd*-G80G55pQ2+n{ diff --git a/assets/icons/Power/BatteryBody_52x28.png b/assets/icons/Power/BatteryBody_52x28.png index 1fe56834610cb41c959a49f8fc0984829f8e20e0..7f32403daaea3c281024f52ef93af07c6e147283 100644 GIT binary patch delta 145 zcmX@kw3cy#N_~l^i(^Q|oa7(H4UHi1kpDjj*e4`zN!_z>;*a?c&;J4m)E_vq1Ek_1 zLvS&Z%iIO_E-|vL`x{i_r>mdKI;Vst02v!cLI3~& literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^CO|C12qYNT{w$OQQY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fItZejeiaPg*{{Si_^q49 z(b-ZJ2{c-@#5JNMC9x#cD!C{XNHG{07#Zps80#8Zgcw*@85>y{8)_RESQ!{B-o0}o eiiX_$l+3hB+!`)DW7Gv|VDNPHb6Mw<&;$UHx?2bU diff --git a/assets/icons/Power/Battery_16x16.png b/assets/icons/Power/Battery_16x16.png index 49af3c2259a086ca262876e062c1ef2cdc99c285..d59b884faa087d83563f04ad66b7d881f9b90555 100644 GIT binary patch delta 73 zcmbQqls-YlSTU^Kh1fH&bF6*2UngCMiBI^JE literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx?BpA#)4xIr~Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4qb@eTvkfNuHV+hCfRdP`(kYX@0Ff!CNFxEA+2r;m*GB&g_G0`?Kure?Z hC{)ow(U6;;l9^VCTSKDGoC!b;44$rjF6*2UngG10Ol|-G diff --git a/assets/icons/Power/FaceCharging_29x14.png b/assets/icons/Power/FaceCharging_29x14.png index 106ededbf9d37edd55bf106e4beb8be91b163950..7ee7f74148753520c754152920b62456d8ec0d4d 100644 GIT binary patch delta 91 zcmV-h0Hpu40(p=mRX|BZK~#90UCAL5fFKk_(fi*Jj8>b=AhK;6+n~|hf-pGG?x`nU xaWU+yi3_*aqsBS~@Q;lk3?tDw#NH86`2b3d8u9$)q;&uQ002ovPDHLkV1iQpD31UD literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^vOvto2qYMOuhNNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9f$?sa@Dd=8 zy~NYkmHjER5QmD8^?DX&ppcEHi(?4K_2eJF|NrM}oB#iRv_Z|k|LdC`{`_xmFTwZc zzapdJ1(kdM|Nm}&`2YWZhe!Wv6+YJ4Pxuk=pP6A|jKLX&Vi_Z#IjSYD5hW>!C8<`) zMX5lF!N|bKP}jg%*U%!wz{1Md*vi;a+rYrez@UEGoD(P-a`RI%(<*Um;5)5S0@T3Z M>FVdQ&MBb@0ME-_z5oCK diff --git a/assets/icons/Power/FaceConfused_29x14.png b/assets/icons/Power/FaceConfused_29x14.png index dcd2e3c6736144ddc292178f4d7fae7fcc962f30..0f07c872519991637204f3fd5c1737d894470fef 100644 GIT binary patch delta 103 zcmV-t0GR*10)zpOBw$NPL_t(|oCU!#4nQyfhS9G-5nJsRqg%R{sl7o*lMuTwDT%i4 zk#cG|rvK7M8nuvvA~-eA?#yaKUstD}O@>zh!gmN45q3k|0|i_h8chKvd({8{002ov JPDHLkV1j7SC!_!X literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^vOvto2qYMOuhNNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9f$?sa@Dd=8 zy~NYkmHjER5QmDqt6arCppdJli(?4K_2eJl|I4!3*zvvWJ#Sn4_SZTR|Nj5~&+H}hfL)09jl-hRdP`(kYX@0Ff!CNFxEA+2r;m*GB&X?G|)CMure_4`hHX%MMG|WN@iLm WZVlF}Y8L}FFnGH9xvXNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9f$?sa@Dd=8 zy~NYkmHjER5QmC(%Bmi2ppcoTi(?4K_2eJ_|NrN2v;SZ3)G7bJ{!c>2pa1R63xEE% z=VRNT(^8SZuX64@yAbamgGKx0mADzU|I)V!JIr|=Xo6~qYeY#(Vo9o1a#1RfVlXl= zGSoFN)-|*UF|e>QHnB1>&^9ozGB98gKV6NYAvZrIGp!Q0hGMVc<3J4zp00i_>zopr E04(EH4gdfE diff --git a/assets/icons/Power/FaceNormal_29x14.png b/assets/icons/Power/FaceNormal_29x14.png index 52d78c08698f3cb1c70d1b39d44f950664c1b6c6..84e5d031f388d5a7dfefd7241803530dee653859 100644 GIT binary patch delta 85 zcmV-b0IL6|0&|cgPdZ6NK~#90P06th01y}j;qzBYrFl#)EMf#DiFgVM%@yA{!K7+O rE9_tkngQG-EI7e@)-&J5XVB0%hsF^_?7y|R00000NkvXXu0mjfcOoIt literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^vOvto2qYMOuhNNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9f$?sa@Dd=8 zy~NYkmHjER5QhrG39(Xdppd?&i(?4K_2eJ_|NrN2JN*B@r@@wg{}&&;@Z&!}yAb0v z2JJ?H_um%_+<)D8r2oG?!(RbCK3(x2*+8wTC9V-ADTyViR>?)FK#IZ0z{pV7z*yJN yBE-PL%GlJ(#8lhBz{nC}Q!>*kacelY!8{JAfx*+&&t;ucLK6VES60IS diff --git a/assets/icons/Power/Health_16x16.png b/assets/icons/Power/Health_16x16.png index af343c520587f373d41b35cdf8c9b50345fc0286..8ef39f64a7793bafaa23c9e71e173cce52cbf93e 100644 GIT binary patch delta 72 zcmbQmlr}-dN!QcGF{EOS>8Xvp2NW2X4b)$qJO6fR%mr=%pNg_=LG!+vc3FNhcE1+A c>*>5AhL;T-&yTLzopr084)!fdBvi literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx?BpA#)4xIr~Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4$;h+E8 zGgR!7ntpGea5+%5YKdz^NlIc#s#S7PDv)9@GB7gKH89pSvbP0l+XkK`j{LS literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx?BpA#)4xIr~Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4jS1oakC`m~yNwrEYN(E93Mg~TPx(3F&h87_P7FNcFRz_yp1_o9J j29Aw3O(+_2^HVa@DsgKtxYJ?>)WG2B>gTe~DWM4fXX{Nq diff --git a/assets/icons/Power/Unplug_bg_bottom_128x10.png b/assets/icons/Power/Unplug_bg_bottom_128x10.png index 35d73ba76ea10724f02119ac7c7413c6ec7d6d3f..18fd7bf9c2b884b5cece2fdd12bf829295cddf30 100644 GIT binary patch delta 96 zcmaE@Su{Z+ije^bLh`b204YmP7srr_ImsCb4valMJQ)nJ4vi-nLmfC{TbU0ti`W@k wPiE+9P+>pJAENuoCuao{C(nQW1v5U%GekaSTPbJim<=+_)78&qol`;+0BEZnT>t<8 literal 5355 zcmeHKc~lcu7mtVn0nv(}RVp#iD%HuJkPL)HK#3X%i!3VWWHJdMD@ib66O0>+h>BVf z5L8qU3M!y1qV_|<6^pyLp;8wV#08humTwYV@U-WA$8)~^XU>`A&0T))-ru|LzPxmv z|I88C@mLH7GlJvi6NLVzq7T-5IQpGr8ybhfn06`%;K>r=54XZr4WH9YZMGWU71>&*+nu8nyi+sUR&&B)^ZK2foU zl6Q8~thtiLn$A_nJ;I`} z6rSL5JlW&$!{6Ezg=5$@C-4ZdEA7Y6jVY};u;)@t*jLW70nUr7fkoaT5v}ilQ&ys$cxLF?%V?j5acfjUzR8I#-?9BFqD2uUK~HMH}aa z&99gC(eoqi`-*Q54yBg#TV2Zy~7HOOFCHJ$J4j0n>oZPsMw@% zZ}zUcu)oxaQKQgHI>=yZy{XBpQA2X?=7gSb}8IQc5cey&_v)JU#y$&qVI^e)$J70JDHvIKu$J~8(09GFep1%gW z(w$nK72ZiM+&z7JetFw7*A8upxiUNZfs0u<@K_iVFVNB{!jyV4_}I=K99i+SuXbW=5f5eKQunH-Q_2*WBWCE+8n5( zEHjNMDDk)R@wKnP`j(7}SrPi(9KxUaA4YI8GIw;$Q})99x;pNbmn|#9nJ-CYf-L8H zzx4juSb*=w>}hF8%x=)8@`%*4UE|DXHyOd{wVO{?WJFe)Lzv{WNmHn&H|G>PCAC~( znO3RZi{Suldn5dY&qIP75VHRW07`3ZLM50QwIuHerAsPs$lS$=jP{+m_aY1x!5EJn@ zqlres#)orxIB$gt!O;jb0txWdi5FAw?pU0gN+1M-d}h3dK;PK-XpKe*5{X)^mY}5) z6eTw_9 zlPS5}kMMH!dlpbWh&o6~BojzPnT$BtL#^>$jDoxm=pQ}QA?SHd3_{e3I2DZeE=J@U z$H5Q+_@lovP9-&_BY=sB6p^8(YIIieXH(APaCsj+3>1jOGNsWACHpf=jac}Jtj}UI zXpHF$4g_`oi2IrKhun?Es1=tB`Y7NyLwFn?Hr_BlC{Vy+0cadTLOzv2MQ8xTr|7BUfu6IgA*fP;i16#X$rV7G1~?0tku$(3nCxz#<9A z0H4I5@kw-s3xx~~f(THF(W-=`gQGG)2~a2si%O@!LIwaagj9egAn^efnMDC$ghh3M zUcy?7ipo-a(*#!a^OcEWS@gWAl=aXT8BA^R}Ofn1$Tn4J? zBf454)Mz0U;w3_PM7cuC)5sNWigBTwKaWKljTlw|B@7@jfxi<*e4jAU&@(<{>_+?> zCvHZAK}`nr8<3&R3+;u(kInEsXK1|t=I8xd{F_tYa9=0+B7VQp^_8wKV&IF6zgE{* zy1s~kFEajGUH><_u%E6|h#dVFq(v`F?Ryu+q8F{<{Mj>oj8`tqTknPxbY!9Qi%?@Q zmNtfG2xd$EI8x<`S?WZWr_iqttv6Yg$&cd4(I zGg~J*H#IwP$FfzI1I&{q>hC?}>v?~e;f5-yLH|iSALd>;oc*e{=<= G^#294V-(;3 diff --git a/assets/icons/Power/Unplug_bg_top_128x14.png b/assets/icons/Power/Unplug_bg_top_128x14.png index bafa2c4947082eff8f59d48d119e9ca01ece9729..e9b69710465d196cc82bd6b941a39741b7e7bbd9 100644 GIT binary patch delta 140 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 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx?BpA#)4xIr~Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4Vure^!HUN?acl*3zP&DM`r(~v8;?}U{@}~zt4Gf;HelF{r5}E)Ni&owM diff --git a/assets/icons/RFID/RFIDBigChip_37x36.png b/assets/icons/RFID/RFIDBigChip_37x36.png index a60d51d585e712dc76aa850a394b5bdf16244786..3f927a35e3476e27e5017dfbd23c477a95519e45 100644 GIT binary patch delta 204 zcmV;-05ku@65Iih7=Hl(0000cxy}m!005&&L_t(|oNbLEZURvl2Iv3wB^VB{4#NSk z+yK`tX*oed2;m%@fFLl{5JHMT_X_0(m94@;mVF2O& z@_zmXuXS!JDGDL9xtAZjGKgXXDFVLKvi-+BK5hS`2qQ9IN}OY3W0eCuW(B%5R<3MN$I7>$yOC^N9xy@Ayv8+R8$v=!7D zKrM_`YN@tptF6{zt&We;sT8Sbk&4nnwd1QktB#_gQ>Qx8yCgx|sg8e|na$qa{qFhB zcfND)Ep|+q*fa92NR39*)0SkN4(~(ZH6)@F{4dzR-_>Zs^n%6WNZ>^mK&DTefQ%qb zCgVtrX2hzp(yB={jy{D|{SpsvoDp&Hf`9llho`A}rET_dWac)@>PnlXtZ~Shw6^<$ z`=4d@?R(T^O39L?7kfVpU!L5xFrs?v{dEUhFZqq*iBa><3eh0?hgrMVl_=))<5kp= z9vbD)nBB80WAcr~F;8MHT9vt?Fu_0=`s4ZoOou>RJ~ zE@4GwYthjWcvDkFBq!cWI}=@b=x*owk`MC?fD?G(~SG?0yT#5|Z*HkeoNg$>q)EOguV%91@qyKmadLSR~i$@ySfC z8Ewa9;8=Z)qey#*GS`d-+BwtiKrEsJ5L!!M96?Zs!K5W=osK5PAQV9nIHAW$3L|NT z&@rR|3I0%+P2%0mbnDx}T=2<^W+{rF!SS4&9BodlR+KVvXcZGqP&h?lFanbo_!Kr5 z^T{zG1S^m^N$@Lz=tERQ)+J^uW)w0Fl;HJu!20B%Oi(a9m-XYMmQYIy1={T|4)uCF zqGcs~kt(C$1Yl(qU`Aor zNQ|H{O6Q~~Mn^EDaWqLV1Q7_eLm%+0!oFOv$P4ZTFB59FGd7>Bus#mhtY#FF(h364 z#L{jTWzZ8CsW<2_p4PcAmgNnY-r#24Jmrq1IbAz1INvIA*{Txi{D5tFk%Jf=YBC1k zHkn)mftmCifzd`?EXLBD3!_~ok~Zi}v>vb_w5gH+R}SlW7FA`%LqtIFtV?I$Fdav@ zFp7gXMx%+vj4n6n*1L>sY^)nap60cP9#OK3JXAOK+4nZMElQ$W@W2m&_4IUmL=m22 z+@j=Vq0a;_n+b5gFH?0rWC5#95@guo1;KTc4CVz#9sy}LC&O~;nlPiBY6ifg!Pmln zsQhyE1YmQr00e!3NdjTA=vH!A2_$5~j)bavt_ktyk(b%|FQ)!-2KgVU2W925SYIZ9 z8!V2h#o+2z6leagQbfDawV3h=>FC3tA8NFId3 z6Mm%4n&3<-zLk>Ds|JZ!R?^l+nLirbCv4-Y@`3xi4j)#K{Z9Onhvc1>oTg3T1THe%Z@NvVgI9k@8YP>(Np|J5zUF(2^ z_e=Md%{lP!>Z0x5H_pp_9>&cZT3q`?_qnUzC|hsK`TZ?`&hQ)PX*(`8^tk4|F|Awm z<0B`AA4^_8ttq9vusSuxQt@?BV{OcbyDICG7u`#_o;9|ju5Q^+DUH`s!2{cXsrUO{ zOpq?uq}Fy@(_C7($G1%XOEc&`0WC{Eb#7a?f*(I^=%12SXa3*;7@WTF@Hfs*i}wwz zt~xmAO6#V$%9er7w8eYh8?>mrRqDI0HTzHO&cV_LXCKEOjmJ+8I8t_V>8{$;$)6cc XT$mAK7+<@!3WGwj`RwPpe diff --git a/assets/icons/RFID/RFIDDolphinReceive_97x61.png b/assets/icons/RFID/RFIDDolphinReceive_97x61.png index e1f5f9f8017b49ab1ea78a9394ed8ea7684e3083..06deb0a27a5c3aaad4207e43e09d22ecd9fa663a 100644 GIT binary patch delta 458 zcmV;*0X6=O3)lmY7=Hl(0001$F*v=OaPhf>rD zk4P+KuT+m27y=Vp`wv*zdf5;&5+jTZ3@k{91y@-a3LuaW1ab1zh+ z&VC!GdmzvsA%6*~D_P?#;T(3ewxx&|PF&p}HsjDzv!-2uiSP3qCH6EJH+uuZeD^Zn z@HFMG>r9e#?#+o%PYDotY8`5N3;s_%={4J#;-8o5V6&sSSFWxMK+1!jF0~>iL|Xh~ z$ElTV+H<}H%gGG^(P%#c|wPJNta~QCGKmN=2tYXQuJT#9~Ts`ZWSV?Hvj+t07*qoM6N<$f|R_~ A9RL6T literal 1421 zcmaJ>eQXnD7{Agv#{x2p_yIvKhl^r%z3;AfTbW%yMuEcUiZn{X?&IxtS=&4BZnPU= zlx>i)WI>$aQvw7<5XB`bIuRj@1WD9@Lr2D(5=YPwGc*zsSTf&kEAj{7lDqeL-}m`F zpTFm}Rj;U;Sva>4L6DijCB86RMfkc4?C{(9_MQ1~dCu}jtr{(6r9=ZD9z~M?8cc|F zAPhvM>5U7Z96{_EH4?R=q2+?CB^+W_$B|Cx5RD+^6=_|R8-RsMpiWJ?vC&g!FjQ6C z*cvWGhIB8eSC=#!pr(06L~d@7c?GLjjFzVbXdnSB5ltuJNmEF>u?f2Zl(WYKhEAwh z4Q^~QsA#Af^=bw{oemP0Nz#dy@(x9mL|KwbP@1GEf@BGb#Ys|Nc!6cnsRx7Z3?(Ln zeSs-waOcMAElU>&B9%%xQj9}0>IjPGd4i+~n#Q39ZZ;(?F^wn9g*gj8V9JK7TdI~s zvlc~3YqZ=L40SSxgdPgrH=H!5Dg|psq(z;e93+uQWD}dvHmxxDKa7WJn~^3R5Mf|y zjfM;x5?h!9!{R;KQC1N~Bdj!3*cCDE)8xhkNLoRk8-q6vMO6faWjLq8D>(0>TsY@s zOL2+gT{ut5lFP+&G;q>6I}gJ}uK`3$Ga{N6&(WZ|Ub8f_Uei&p7kz1snpCuuxhUJA$%K8tP}c(` zU}y<+qQrvwF!u}>V`HR<(=n36VBt1B^`_fx&WPzU_AMY;oo7=&mIg2tu^u1f5 z)@y#lGg2HF{icooYxXeey6HJl+%===Q-Yg*f$J(< z+gbGCvVprluc__jmS6m=F>l7JjJ;Cb^sMdho~B4w{1|(u#k_H5R;4;`zs)u0gC*%S zI_>C5rsHbY>U}-r=8b&^Mh7zat>Eaqs$E;p%^t}^&M*C`d_!V*2g<#^ZLQq9;N6x= zv^)OzpYh#+OwHKfQ+kHHZreNi()*6Nw&PX5?kxF@U2EB*+}LH?toC1`{oRjksXb78 zx8u;V!Qv~6!ySjp4u16f-y8F;3}d=*b!=ao^)Gw)nS({6qa!CbyuwrWMvi?_zz4rL rb-KI#{JuTj%qEZPotyLfwj*}ruaRky;O7Gyvp>k7e}(TvWo_$!Vg&g_ diff --git a/assets/icons/RFID/RFIDDolphinSend_97x61.png b/assets/icons/RFID/RFIDDolphinSend_97x61.png index 380a970d9004cba5520560fd9aa24aa42924e2a1..65dff82412118496cd4bac999b3d3eca572cba43 100644 GIT binary patch delta 461 zcmV;;0W$uI3)=&b7=Hl(0001$F*f~vWjqUJU zh0&B509&S#9RNLmk4~kc2V4P(srYmBrZ8MnNuvmWWA2_Jx2b_!MkWZ$0Ni?uyeyr2 zrKBl=La5Z?HeA+z-fVSA}|S6Z2S;~;8O?sjyM6)7>& z@UIGFBV#2^>Y{_-&y*a1ihpC%tnQ?9MSo-dD>_|xuapKnGO2w zcDH}7hx@^!?r}>u_GzgzYD)%f@mSl+uVq|U^55(qmXx<)@ZG^T00000NkvXXu0mjf DltbCz literal 1418 zcmaJ>eQXnD7{6`EHeeAZ8ii;s2g4C}y=!}S>mBQswzrLLl$EYRfoyOe?`_T2-g$Sk z9pb2CPQ(a0XM$+dKhO~O0nx;1L}kUOGdh8Ve-^?LG)CD7lOfXp&bQl&{IPJ!-TS=n z`~05I-*YefH&^B@S+xW~kUZ~3J^)t%zRsL1_&wM?{Wx46Gs{C}t*V$YK?jISRz-k% zBSHfR06}hjW(brZNLC^o44EO{CQec#79pi$iAOYuMv#)SxF$$Vz(hsR5RN*rYhQeg zp<&sHZKHjpPxFAr@WwqlsNJ(UDD7#ISQ#rTMN8rwG!Ox%fW{-uQG<&+v01wulvBq9 zhR&*(O-^hssF2T(dQ=^tjD^G{l4Q_g)*=g{AcBJ%MzrGu-R~^fg7z+Q;6eHV@=uu4-82U zYi3xDqA81lsJ56+42C+FLqzlW?i!97^Ob@%BjSQaSS=(GiKG&n)i%rk_&3wK+`#f1_%uMx&~s9uHc$EgY5An6W<9p}B;4 zpogCYa)qu&(Ag4m;RW0?c3PnnQowBrN#lw@*>TY-L0(ZbMKQG9>QDeSkC*Q$-5f{Z z2~0stN5WYZfssX-#AS)L;{r{IxG2~K90(F6+7!i3SxJn5ArdLp+{2>u5u|2HygL+d zb9byj6wZ} zqrIB@aESUiV~B&zwY0sUci%;mf;cmkA+7cD0^$ih9{f{w;v_DJ`sY;R`f3( z?7BXf_vMbW zuU1_w753GAG_~{axB58aI?KM!#N|b)zyZV)ZU9QaOj9KuN$fX{&>fy=f`f8Io+CbZIMpovDCx1HL z?$&C^=R1DyispWLc%|FSKGs*ccUMOLz=7=zt7r7(!|y7;X08;c-@aJ>V5pwIR`S;) wTk7+73`}?J{<7dJ@~ diff --git a/assets/icons/SDCard/SDQuestion_35x43.png b/assets/icons/SDCard/SDQuestion_35x43.png index 257ab1d852460ad83dffa5989e765902fcb09578..a07a98e4b73c5c85162897728a625595e9f69cc4 100644 GIT binary patch delta 163 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 SztR8z002ovP6b4+LSTY4?SNkZ delta 963 zcmV;!13dhj0?h}I7=H)`0001PnQ^25000SaNLh0L01FcU01FcV0GgZ_00001b5ch_ z0Itp)=>Px#1ZP1_K>z@;j|==^1poj8Vo5|nRCodHT8nPvAPh{{`~N@Q&DFU&GLx|l zgrqvDBdxLp;|G3VvR$_?EEBP=>;6HuZ0z&-?BfhV>&+qlEPsuNm|Dg4qvN>VK1(Up zyp@rywexF>C)i^7{(8MCrLVy9Z9!%5NH{TpXdrs6H9UHa5tNL;i)}WJG~PVpYsanU zTl7ke$dvP#V@%tpH;=Rut}S|{M%YEIJL9co;dDw;^F6Cx$C{R$Km$;4PdV&`Rz~sBj0Dmh#l2KY1cuek89$`I#UMY-Nk?q2a^PvZ-3x;>G1Oio9tj5I3%I4j` z6J7NwILXT46S3b5tMhIImN-miuQWahySb{PqC|_b4)aMvqK!Nmp%uUjFRzpQ2~^=E zV7Xuky(i)c@8AX=M$FpXo=&wDS;JX*LK-e9tGz%0On;z!BveOoN!PN9xzB$oy|LP> zgfrv*YR`rDl_RkuCZh(hVt`86zkB#HFCK^82vc37VPeO;)0O>w6~!JNBl#e(Jl5c% zuitULM-D^t+m0Rq%qvPW>TN5-b`^UhTuEGSZRQ31-Xjl_TTq?YjImqRV29aw6hf^p z4j3(>>VIO_HGXqvUC7P`R-*Np<(thVEEKpFjXLhwS?n@HnKydFGrB$E9P6+Jg}HG= zIW#Z|57}9Lh3OffbC?Irqs0@>YJ5v#vJ#7m>8%mhAe}XY$vBL_g^VHQ0_$b0U{9eI zS}W7iqUS1F>7BCoI-~V{Hb1YhG@TPY0<#_N<$s5~+1k^k2p6?7SFnT4R+cFKdt|wn zqKGhJ>M3qrZ$DTrql1s--KqG4x$f^+Q3~Y#6K2`3>GjrEWus-Phey7D?gOj?dP8v(N19u|g z&!S=r+H}F`)&A8pBZEDx7(_lMHs%KESpD#bL_g^fOM`mhSyEV!Gt&U?1o!4t4@+zH zVu#_-zeV&S+mvih*L$V8`N#Mx$ntFazC3nDZAO?!Pk3Sko-4Eq^? z#A_g7v9^zafiV;)`+wR01_s{JjSP%U+6RT0w5NqOix+g zHZb_h+-6|73DnE*U!k0ViRto92F6;?4O|SaQ?=NDrtYi*5q}z(ETTh!M*B7}IC!Xf U^zzJp0@T9b>FVdQ&MBb@0QbH%ssI20 delta 380 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 T?I80e8v&Rb+u+JDu3`TM+ZHm< diff --git a/assets/icons/StatusBar/Attention_5x8.png b/assets/icons/StatusBar/Attention_5x8.png index 137d4c4d054227f27ad6a7e3e374b100d975d9af..225a56ee39d51f2ef9262212736dde08784d02f1 100644 GIT binary patch delta 63 zcmbQm8#qD2l92%jB)d4K0VxSj7srr_Ims^)f)bK|up=fS?83{1OPZ=6Epw- literal 1690 zcmb7EO>Em_7aL~8bUpz^|omTDs`GNSf+{#+5sqt{|hGs2M~O=v!q!&5C=eV3yqN$cH8pR6>G`RwG(RWBWbEkJK-^_v zfiiGJ)Gcee&AJ@s*Ja^vFHB&lPjTirEXNCI!mt3!;0#V;V*_a1k`*?Se7T(rPaIZq z9Frx8YPE`2qqt!e2`Uzg5hP8}bObUYc1?FgH=^77yb?i;B(Nn*H67K^QLm<0Fe(m* zVGu{##eu7KtLt`qd?*CrAq0h!#Ado#G91G$8D^)Wo}3Q6CDBopN8IBfTj)@}?Qd{J zb2~E6|2w^0?is^&CeJ`2+M@Q1@ZbVFTQdQX0k%=GBrtgf=*~W02~QU`VQ7Xm4Xpt< z>=465nJy%#F3@sGwG4C{3eRB=V>6quBYs{-wxBL=$gnK+5R^_N1j|rV4PwVEP_rdb z189;VeV(Txn=Xq*a2)7Gr^I1F>2Ca#DtqCe8$av~r&T<6oX}M$2i>id>tY;sm?nZ| z{H&R6A^5^r9y(hV9Wg07ut%DN&LpV_9m`UqEJ?9cbcBquWYDkAH)K_*{TJJFGa83{ zo@Z04?HE?g4+R#V2CoOF;Has-w>@`zd{OeI<1o`QtkQxz>RQG_p- z!zL6(g*wzw!818Z;S`CF_GVN|09M;PS(IfMc9d>UMr_-Q@3u$w5}^O5mmp(nFTE6#P!fSmv-=dmoM}mdU2?9`nd!3^}k+g4nJa0`JjD diff --git a/assets/icons/StatusBar/Background_128x11.png b/assets/icons/StatusBar/Background_128x11.png index 78ef029ae737fe82080bd709545aff7ccdae948e..b2fe0bb9772d5d37c74e652df2e73914c3c3bf54 100644 GIT binary patch delta 185 zcmV;q07n0s1IYo97=Hl(0001=GPr#J0059lL_t(|oGr>RP6AN?2I2W18wv_3Ozi17 zfeBIWK+w{Q5O#Yy4!{980hNTrb4W=;XQ6?-v4APR4DC|YUtp-(xCh`OoB+z<1Aw1A z&Q}1HS-7U>1l8ouAYCV!qwKA4PlFX;QBMy?x_`4l$ ntV^|W<<^S=P|6)%p#|~}PJKe+y)sqZ00000NkvXXu0mjf^(RkT literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^4M5Dz#0(@)spmQaDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMHK5uS28Lfip@tU>45bDP46hOx7_4S6Fo+k-*%fF5l;8~T332`ZAIM?=k_T^V zeFCx=OM?7@862M7NCR<_yxm_V@sW8a-VcLnJPT z1~~E^P~d1jayNa^|HRIFrW60yr@Gu>&}-W^MJYtBAT;u{K+{9k<&Lvot+tTstUP<| z#4-;3vevG9_gAsjw(zVxqm%MWw{cQe@xAvG?T;szm0Xkxq!^40 zj0|-RjCBnyLkujfOih4D+rYrez+mCd+=VC_a`RI%(<(7Fm>5Dd_?7)q0cv3IboFyt I=akR{0I2AM5dZ)H diff --git a/assets/icons/StatusBar/Battery_26x8.png b/assets/icons/StatusBar/Battery_26x8.png index 5fc1b0cd6d93a694ee460f7253bac4fa368285c2..a9fea130959bb83a94bc4161130c91336806eb36 100644 GIT binary patch delta 77 zcmdnV6hA@2osj_u&g)t88ZL? literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^Qb5eX#0(^7S+So5QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIC7!;n>`$46IoXB1>;0Aig%mtp978y+ zCkybhHVLq?v9l>8v|MBih+^pFYgpao>z40R2Rbqy^;3@ofnEv-xpwG9lc3=G7b1=gZy$jwj5OsmAyU~B}@5No`9Do_K1 Mr>mdKI;Vst0P~nnl>h($ diff --git a/assets/icons/StatusBar/Bluetooth_Connected_16x8.png b/assets/icons/StatusBar/Bluetooth_Connected_16x8.png index c77bc1494f92b16d0a078b47acfa6df6a45890f7..667c6d8921844f31024c82169714733f89fc2ded 100644 GIT binary patch delta 72 zcmbO$6E#7?iID*aZtyx;0VzdK7srr_ImtWz&p-Ize)4hsw#`XCJUl+j<&57Z07c~) X%5^vwD;ElyfHZl!`njxgN@xNARFW6l literal 3613 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 X0xtk%_Z)B;2L)JL*qN7_d0hG*G(b{c diff --git a/assets/icons/StatusBar/Bluetooth_Idle_5x8.png b/assets/icons/StatusBar/Bluetooth_Idle_5x8.png index dc4a8733cd2d2bd2f980f1b9cbf6bd58e55526d3..8d7b05ca022a80405805e406fa130aa231d457a7 100644 GIT binary patch delta 50 zcmeYdoS>pB;pyTSQZXla$H4~&pByY`>TG<;(#(FCmqEdYMc%`%3B<%41+qpTP2wDfUb;0}yz+`njxgN@xNA DptulZ diff --git a/assets/icons/StatusBar/Charging-lightning_9x10.png b/assets/icons/StatusBar/Charging-lightning_9x10.png index c2eaa47d085dd3fdf272bbeba42a1b73a989adb2..0e4629ff580253b5f453a5e0df2a42f7d3a9dd28 100644 GIT binary patch delta 78 zcmca5lQ2QTgOLFU{OUY~ft0$Zi(^Q|oa7&;5Byl&`_i2GFgM$=>h2luj17Jo8q7^h f*mdy0mPST~h3uRKeXpA0L0Uas{an^LB{Ts5P68by literal 3674 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 E55wqT-~a#s diff --git a/assets/icons/StatusBar/Charging-lightning_mask_9x10.png b/assets/icons/StatusBar/Charging-lightning_mask_9x10.png index d44a32ae0819d72acb29b5bed228b24511de2f03..9c0cc455c4e306b7eaa329dfc349d2e9cc524d3d 100644 GIT binary patch delta 77 zcmX@+pD;nvodF2^>O6&kl)9&jV@SoEI@8O d6B4QpFfhzz;tajr_jDIXtEa1<%Q~loCII`Z8rT2; literal 10182 zcmeHtcU05M)^R><6(^=go3Wpz9Xv5fa@NNa1f^n@FN|m?MP#P}it6gl+8;~?CViz2e2;Aj z;e*{x5IRtxXuGPj=5f%|Zv}74Y{GIb?=8+2Z8OJcX5`3m4nAEivAB(vi^W)@S4-Fy z2x)%gKGI*Q<~Lu)#Jf|kQO!)$x~=x+*We5WJMk;utvti$x;f>@;b4`SY(l#>`diiH zy7!%t@2^b`q~4{^y-!Q>f4tfsWze#^q*+& z9YL22EQUYwl^tz}IVnH4xw~B+;2iz*wRFWpZq`JBiFh9^WTra;0sD4fHqE<#JFPQ- z(JJMV2U7rO*#2>QnC&@%Mwil7|;f5fe%#8bYGTU z*gPV?Az;SoTAn0v>2-Mws~`V)f@}>LiCF49Sq{Es?}WtYLdDnUH~uA&D;6qN0G{0$ zQb#q0W=if*rA8#5k@g1oIg4RJGUAr#R|W&E%jyQ{Mbo@$2^VQXvv3imJV9EVZ$a)sa!R@m8~>^^9CBKx7~` zPL9mHXu@!RolGB#XIHAyAX~lVHDLQpre!+h&^lXwc z2lt~_>PB7iU8JX`vro!979?AahE6fS+Lrix*j9583HmLp#%y-Rpypi=+GWU9&kqn5}-|c&*FEb z$ErmYt11NjE$aApUzw>jv@MvVO+02&N?hQ*@3PA~!gCg!f^bStp-qTe>*iB_t#!*$ z`&pxbYMPA<;Y}z>%5Z(V`dkXo_?*_kIz_77P7D9bZPUcN!^%!~y7qk#@`}$l$SU0n zpO3SDTl!d@Gpo`P%@o7{Y^G~L4MRlF&T9$W!ox2P+uN_k#+5mwkQe1nkEYVlhLrTU zwzX9@t=?ML-ECXDH@92T9PZDNkX#G-vgG1DFX&?MsnT49EvJo+Wk+MQV8y9NvW`RV zMd@xc`-W|2LWJoP6_2hsyZWi=F3K|qo~T4)qtg`bCJfJQwtA$LU4SQH=A>`qK2eTj z%s#qiJ7I*EB}e!No|kh9A}wzveKeU zdozv!+ikiru9Bbj`}D~_BzfF>2+JR(`gSd$-!x!IPy|MbLh=#_+S%`dL6>ozJ{J>? zwdqTW--OW1nZ9f$gwr@}+7r7R&Pr+#(bv8r`Ra^M+2nlsX88vj3ri9INxUOm z_vUpL62q7iS$E&6jH&w=R&7;867bz{Kog6eoV2xtHMRQ#`e&{bc_9w4}0GYtI zYsIRD9zw^^6;-=hub%*AMuyOXc24|;$+b6>`>)dd^X zeO(HLTwMx-7@9r(Af@>6mMFn%mmHgn+BA(Wj_33G6~vjnf|%q!yu{lek``>96MF0Y zk`aG(p|6f)JKB?7D>VnjDT{!2OLYmHjQ#Re<_=pz*eN}jPaU9)n)&l6dspWLu{yRg zpsTRR*!uenUlqy#e=oXnd6`?V{29SZ8FukgU{H`hOY)jC_44T@r0K=8i&F-B9xhCx zU!RzXy%Q2Y8?t7WXw6z6M8K`I)TA`}C4U{VO+rLi16w>M@~6^yy{?h04~p*0&UXuw zS!Xt!o6Qql%4rGQ*&Cm5eta$vJ)0@*&pg-bTmfq{(;oITS*Hy1G@!8t)Yv{EBnF}Y z-M6DThTDaU)n+Uci;%a*rf%!X-{zx=baPb$dL^io=@_l&&dLL~9nA-X=X~Ol=NVaT zN8GsVBX>oxk(VDRcgEGflD_$PY<@M{v6}apM4V^3LD^ixRciIyRUUMQBXj}1Yjv-C9@4e8tW3!Nbj==CgNr)s`WBLKGatN@;$FU8SEHvo`TZc z5&OV));^O@?#W%iK7!t{RJ8Z8=K!K^Tv2+=GLtfCTl+ZXhp$%LZ1HNAiwUDl%{1xSq{z{eU^Ue zQf3LfE9zqXo7sN0-Xtl;SEB}j-3;E#Jv!tX0-yFDxC=W~9@vYt>@TUPiGInd%=bly zt;I>4=?l@YD%^Z2I3=%tafz>`B_$-UXo$>5#~iGMU7TE~GWR`x!fBqS7%}hS%TgDW zb3F(|H~RR!Cps04W~iHvsho*_G-8ZN4XSkNqcZ*Ypx2&6U1bDp zW-6V1ug1uz^~tctLZyMC4#NFRQ@0M@NlZTN8BMiot!FXRn(>n-OS~bRr3PCizgc;+ z>RtIWV8T7ksNKfWn6e>rvmuK78iR=sQLelxxV)iyO*NZTJ&$okNx`v%#!ao5-X07* zzPK{}iAGz$QD=|IT%^C*nWsLKKI(u8!k{ymgHEDDH}(c&MR7XK=c2_~7h{LE9ku0# z7cpOXH-{f4+!S{nlJYUQ5!)b$YB0|KF4 z@DmM?d1f}T=?kTvK5szx`Sh9b@%{TUE(3cD?9yv*Ju3Q!ADxYVfWA5!nfh?-9y$HH zmko9kz_%vv_V%c^4qQ9?Q+4a3Euob(Q7Z-O@n zMrqupG`!}u0sf7TIj838mBCeay?|=2iTB?sV)!Mla!3&TZYd9I?|V8gElIu7WN-An zl`BOTr6#UaA)vXPvvaQ8RWr@K+nB#GujU5t7sMFfNm3@Rw#WA}lbW!qnK{;ugvHs( z>w!`S7h^rIE#hZlHyjmGRWn<&%?)`gZ{Kmip$kb$CK^_;TV)w%K5jP{EOu}%G`=!G zSbE@Y+WLuoaNqJZTnuAu-dBF9*Tb|f=W6)DQGmBV*xy3N=6tZ{kZ&-5WcDFIf`** zJP|jK>6a~@U{xA&$1t!Zs@oN_PCoTs?Y=k3xgFq~+0Z-TuWsC+wmri|53M-0Gs=dI8z&d|;U zh`7TC2?Bob2282FwEjFGY}(aJ-$~up(`7D1ccCDh^`eDgXmmV%*gSRVdIgivE377=P73kW?Hxy{OfA7w=XQEX|;0mh}=T7UE zNkGaOKxsa*YIHZu6~zd!Ts)>%|1GTBMi>xL-snN)@6J)@XJznwTF^n@;oG+sn#VGo zFALAF?q*U2Dq8#X8Z=IehqY(b~jYV>`5ciKZlZ+-KzjH~@V7 zv|JRvb^?8?{-@eikALls>`zHf-|G!J@HeT^I(Wf!AutA^ssyQ_)9+bI-8UzJasia( zkAIS9n?Fw9eBwznZ4H2W>Nv?2zVH+7HsGlshS+0DT+9sDtM0QT1Qpv{DkSr`PYVqe z!?56QAf})a{s`YFqP{@Oer{%jrKjAHeDeMh=oMj!I?Ad37J^HN$D(h3`0 ziIXuQ%q=fJLnJtbf~uSEVvhUKtc2*cCQZ?rQp(*ZpuJ8*E14Y$qGfufq7dhGfr6I% zVJuxP2}*t}mLr$5HbO0~;KeltGG%43o>s!CSDcJDr?V5YjI+dYiuB3#(hFsWt`6}z zQEt*|t2k$O_xH>L@Pd-8>5)PzCin04otv+ir`?d)Wh4vELPUXMSOT@!FEUn;RIpaC z4aUH3vbIOT^UF*hNxo)Zj5yPVEwyz4KcV!c@ul-6m5T8XK0l4eJdv=rkk$zocz$)t z9CHa{f}yWreMKnyO1HN$axnHuCDL*N z3T_uOxhF3*>EGu!{-La#ng#gW_Ju zRxZ`m4sF%@6^e7YJ%~`s*7&%dLc0xcK3>%0n+I>*W?gWdh)=tZzRyjcWuNU0ie15P z7rvd_ZP+y=lO*FNBPA;)t3LB3RIrty)iU&3Xi0Qbv~83aiwCO=#8`w1)FbXD+UTqx z<}Pk#KVXCHW1qh?DZG2$aYGEt9?2_ zLCPCe>?t|B@p`nyY{~Dw0fBEs`nlG=H%tT%D~v~V&B=0nIC(5efIhT`HtqhH~g>U-Y2~>e1$rwJ4m@j zh8v@1^I|Kue*MhcsX4;UpuX#U%URpcqFNJg`g6umP@gKH2xNiN>(lf%U9Yow8I(v` z!qdRh$+N1IqNJYflf#%ppM5XKy2Gm@p+gN(Y-`eP6)_l2|Js zq0b;klcVpfz7n3(y-<7c?j;!wPwjUZ(kas!261af%}hq8G75GJUgtIHoYEf8+`24t zu|ei|Qe3jTks572#U7+eWE~P#(Nz&qk=vP;v}_^9OGzh+R2+>guWy5n_6}Wtu2gOX zN&S#$7{7i|Tyk421DgRt+tiM(X?I>)^IvbWx?$d8*?;Z+wbCax_`JDSyI1>)@*et_ zES3nF%QUv5yKhv5RH2*$`6`73h5c%U>@9WUjQdlw%QgcRuSGIOD7T4=)wmRnhmY~S zk*GnfXW~R#->`diMDUC{c`@; zNWFJ`${FD7*dmLga;#+~;yLGkdIS(oqS_9q( zEZhh`?%y5L-3?3yB8xE(b3N8{U?ieu;IG{yvs3*9I|Jz%pjsc(`Pm9mJF^~_$m6cOW)}FoL_JH!uFD!_q)ygvQs_GF;;e# zOLa4t2e{^d`ya^nI3>x>kx7NIht&y7S+1~Vi2F@P?A;wSX(-94XTmHGyx5O>zo%8%9@mw{|t@o`Nj@iF@CS#x>VlQ=@Edcth%<>bLjO-^F$*06@uHLZIMD=t{CEVG5{bg=Y@eI zoRN4gTciWZO@?Q+zKMqmWhcX9BB~A2#wa2kQEEO|q@jpX5D2L3h4O^($Wn4i zW9{rE4U|-VQV?4*JdSugMp9UqKp+SaM1;^-2VpP_1``HBgdq?h5dp+`yW!zpKsVg^ zLy8|9N=O_6i^AYhXg97yPPi@F124nFL+t1JNlxrVD0>l&KL;=aNgM~oCuC9Obz~PlW{}}HtJ#a?E zTYF&xBo6I?MIeE=4387o;n3B{(88_)mDE|L+ce zxtJsJqex3Cp%EU3Eb2-!JVc9-9m-BpR9Qkn93%=BRfH&k!ODsfP!-q}1#vM2ahNy= z1XcLOUEK|bhr1z=zqzA`?no#Y35AMD03{@#;y@?}CIYk-g-ZaTb|5iPTaX=83=a8) zLKll7>H+TZS2MAPBEWE%s4Y-T1PKC)+d)Nua0nCult9=*ML;4@Fxb}ii0Uwyl2`Q9 zWq2S$pg$~nE^xd(8tW>7vIq?yZmP~ z!4XNEqyR`n5(MJ;k=~!_{_m^@CT1@VMMB^}Fiac*BuWGXv=y<10zu+1upLoGAbWeU zKhN<0eLd2`hd&3urAzv--f3$~{+iIAIaWeqQN(PiV9~Bexjd@8l6HSlg#Kgc6H`ts z$C7`Q+W&~-r{WIlwWRu?q76MT7#9>0`{#}Ln=t<`IO#v^Ka0S>bN?0g!&?!J@g^2S zN4ze1zn?yS%J8sK{TE+9 z<^5kAfk^$&Ab%^q|AgzGaQ&?a{4MZ5yX&8D{jCW6E$~0P>;GH0DF3*>K)MkR)&%11 zMEuDNGvdt#nVy!B^7rrGiC?ci8w?;mj@fFeDgnYtg`6c{x#9PzJo^oQ?bfYdY= zqLCc0uB}Y|@ia5dIkCs_JBmaTkGj$oqmv^D8#@~tTN@j=&6JHzEW)Prn8*nh76uj; bb{4?N2Y_krILTll8lbMMqx4w8Cg^_v(=Zo_ diff --git a/assets/icons/StatusBar/Exp_module_connected_12x8.png b/assets/icons/StatusBar/Exp_module_connected_12x8.png index a5f09668267a55680aaa66355966bdaddcc173e1..fc136087bc8543ea66f6405a2895dbce79e4d785 100644 GIT binary patch delta 71 zcmbOu6FEV`k&yuip3YZ}0a6N{E{-7;bCN3(4jefELMpEgd^phX@t=EJE0+(u1cP-h V>xFwq&ff>=@pScbS?83{1OUKU97_NI literal 3612 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 diff --git a/assets/icons/StatusBar/GameMode_11x8.png b/assets/icons/StatusBar/GameMode_11x8.png index 49f2e25bf32025b68f659fb354abe59d61ba2235..88f1a87c1d3e636e885aaaf4c06df966fefec0ea 100644 GIT binary patch delta 71 zcmbOw6FEV`k&yui*qtp@fs}%$i(^Q|oa8@$rz~`AbZl%?{b19~#LO(uJXwKx@m^&H XZ*G>3^SAhyf%JH~`njxgN@xNA#a0yd literal 3610 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 diff --git a/assets/icons/StatusBar/Hidden_window_9x8.png b/assets/icons/StatusBar/Hidden_window_9x8.png index d6fc2b326d03d5b6a3dbabb1d5ed3a8a0140d35f..7fce0d5f6543de7f71512a66edf2089d771e47e9 100644 GIT binary patch delta 70 zcmbOt6EQ);fsp|Sn76%<08;XvE{-7;b65{D@-i@R9NtiS%)pK5+`?4DiU@%mn@N>g WjLgSxuL}jZkN%n}!zEl(m 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 M%FN!h6ytIA-_)%w8UO$Q diff --git a/assets/icons/StatusBar/Muted_8x8.png b/assets/icons/StatusBar/Muted_8x8.png index fee4e09f5e68ce3fd468d2aae8ffea79a1fcd74a..8d35be7fa884ddeda1740cf6a1a98049d82e6556 100644 GIT binary patch delta 63 zcmZ1_6F5P_l92%j-jp<}0VxSj7srr_ImsF+o6>{Qg%WNZIB@pBsSE53LefljR(gkb PfYf@r`njxgN@xNAYO54Z literal 3626 zcmaJ^c|26@+dsBKS+a&?jCd-`%vg%a*q2eZ#x^Q3#$Yf@V=yD6q?BygvL=+&kV=_k zON4AuBujP@8cWFjj_3FE{N6v_-t#%<+}C~G*Y|r}*L{EgIOm3~wYdPlG(P|U0v1RU z6no^|d3d?l@5K)5R{+3oj5jv6wJLFmL43BAD;oRFhY&)m~g zzsmqvfx+7-?3^on8^Bx@7BQ%gjN*3`6W^DKbf~-1#gEL28p%1#^fJ5|btc;3oc0g7 z{(={w!K~TY_0Q`SlbMqnZS;1b@O>gm2@|fFC`?2n;+D0A_w#=;&hG+J+4W0*7)9k$F~ z-RcXT11_W+q!rcVMQmQc5Ce-*v6Ic*Mlj;aq{3E1hu)=NUUCsGf?ILT2u2!0ifdB{&NqLBrV^ug=Ug-`DlsZ?!9ls7&U^KZ)7WK zBsnp=ObqrOs?ilT+BFt_fdAh96hkTd8h8))ixMvBoPFuT!liFu+5(e9BIhnolO=b# z?a!{=UvZ6(+pv*W6eACh+UFkI18(D$OpE0PW00D+!}CE?QDUdT^^KH#&O#%f1Q(>j zf+|H!C+3{NT6|w4Nd4x<%?fi^(&cBTxju0Q7`%EYCw=o>j(-PLQ^+MeCD*q@y7V9- z{AF%I$Ej}tR3P+bEH=CYCg^$V3+CLd>!xlu(9%i`64-IHmSdb2Ru+9cP+X=a8^hu~ z#2FnfI>USZs&K8}mH2pbv?bd3q2i1}sYp4m6JNwtSnXfn#D_MeioqhQbu@SQ(|EKQ zL+OY7LHTUO^M477x+WqI2{zpxv*wpqj90hVW8sVJL#pQ6Do8FFb=6uz>t`F&WFZ_x(WQtnOHxO~qH1$Jjr|-AjQ zKZEuPToZ_BK)N56@|C(MRj|KI3X*2|fahasTBAMmv${;0*BzldBnR}-<)b0u3GYRc z;mMB4Vabz^>>d0a^tZUkyO{@6cv2s8AY<0#mkY`;c z5OUGd&e;EvC&M$rGi%~PD~I5_r$ci(Uoua&$+ro#T~y^#)mMGm?Nj7g6jpS+H@LT| z*L{{UD=|CW%L*W88DyzsEx`%!l>ol-W96sIBg^{&+P~|4#7@(v_?F%;2~G`km@g52 z<}FEnXLYkWo%d5^_Q`N6cYb1m`MZ@zc%%#OLM!w>g0dzUBFdFORlT9bU!Jp+ z-)v0Pmx{iPn8^F4ne`{5k3~16^rnO~^Q2g%tT664>N(OKmmEJcEV|E4t4tHRo&0QN zoHF)iz%!a(J}k;8ste2@42q42#U1H9vSdf>h0Sct@Xw^r?3&eC#w;r?6PDX$TMmfG zcAuc02%%5|S_1vZ71Q~{nr{p13g1pSdC7R)^Uqq;l6-I~zF8zSFjdlyP;j$=csIB? zd0hHOdFP9dOL-ZuGy03Z5IzmGAnHROuUn~Q$TYdUMX(Hi&aI$FF0_nh6=W3DF2+wn z&Ig`%KEGah(B^rjQg%0#(AZaZcBr!Xq8nTffm>^v;?jGk$9XsS?)9n%Rp3EHl|oo| zSX$WbjqLRkYt5T+zp97n3lj6zJZ>CsIL0|DFH2v3&gIJ`$DPJ~f43G-4A1LbkiB~1 zMtk`LoaHEqq#DTunN_Stzn4mShxmKmEb%ikYtR-Y%Y)tfVz0IH4hn~n9;{kUwY=nw z8Z!5bV#?vA(j-?y#f}_Rf28*Pbg3Qn0(C{Dn=$6R?o}B(A6Izm)rmfzmy|#+hL0c0 z4?B~=3}-%KUZ!3DWjdcKLKQv4H+y5OuBQ%hW7MB>(l1>jb1dCHg^Dd6@6UZDIWg7N zoE@a=tmPaZq8)ihB=wp8cm&AE7P8-FyntvWE4pwsBhtpSDmNzg^wTotN!{BMS&qre z+5;y-jn}-d*_Z{q)8Ml~Dbo|AZog7kv~o1*{>o_oa^Z`rPEux4W*$lapHiy)8CrI@ z%*In$IZ^tFUSw4G#-8q5V%?m@%Pb%r*3H$O|+v>idC z92R`&{R^?Eh|c@>jg_xBX(ksYH8m59f1Y`T6~`odIIw(DyUsdZIx3m$${;fy7XK}msNdH>g}!`2)ei^7$GZu;wvj@ zrs9P%&B?dYG<1pB`Qyq!oV2@4dG$ot0Mk6kran9F;{A)emrYsIK2(xl|C8$KXM6O5azXl(KTpYFicCYPi|J&BVv`b}6ywga!awohx zfT5a4$U)qzWPQ7pmnC~%*1W20JB$Sz#RfEJ#W`i?WF1D#uZ~?w94+uD$j-9XM|?`_ zr>|IUr1`p>cB%9-ZqL@2r2eohb6sg#{5l!uGFL(V30`sUQ!G1GgeXRshmkjjkx$N& zrg1CHvrf9j)Sp(s9PP1i5ak$`FfoS{tFvo5BwEyGD!OfBNQ|;)Dp1D1%(e2g6^uk37>v7=| zc!NTNTtyolG5=trsI4!Q#blKaHdM-`9o{h5vR&+0!!{IruvyWY4B6U%tXy4O57$xL z$Ns96qMD+qb|g<~5Qc&S3_VEhIFJPaeI*=tS^oVa>se$i3l+3bu}1-_dtN1w5*_3WMiB+9vMu**#%qMV}pIM zIv!wsJ&-O9&L$w>s2C89;79a_(-7dldEsn(#|;64{tlt~BEbJC3T!+BuT-8DQhSQU^uR2>F^vG3!mu;Xxb4LD2(^v?xmC!~0I!cit>|Do-kpHD6`v0?2>^+0fFk}c!4Z73S??5Z7|38#K_&3_0io*T3 z-v5)>-=0p!K~OkGDuxR4F)=F zg~8&9JDwwdL#(Xe7DRt4hKR*km>|Gx5;Z*D1FoS1HPJRTGckc4H-*7WO|+pp+NPS? zn%bs1T2Ny{t>0J^5;lNHBVuSo13}C{;vUc*;?A0 zvd8W1?fYNu4zMjwD$3e!8yGKxo@CFCSeO{v(|T2+oA>}=Z|&{PR5hP@%p4#NgTe~DWM4fkZ2Y} literal 3607 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 TX-MlFYYS&#YHd=yAa5I#)A diff --git a/assets/icons/StatusBar/SDcardFail_11x8.png b/assets/icons/StatusBar/SDcardFail_11x8.png index 876cfa2290d5ad202938fffad0b6661d85840d2e..cad9c4fcc3e16ec4a455378b5bf68bd919d3903c 100644 GIT binary patch delta 52 zcmWFxo}i*H<>}%WQZXkvAt6B^2}mSNNKQyfYhXIb&cKq-s2}mWzJ&n@JYD@<);T3K F0RX?u5TyVB delta 50 zcmWFzoS>pB;pyTS!f`!0At6B^iGk6Qjm?!!V?qrB1M5OYZ;|&0moor?r>mdKI;Vst E08&5=r~m)} diff --git a/assets/icons/StatusBar/SDcardMounted_11x8.png b/assets/icons/StatusBar/SDcardMounted_11x8.png index 68bc619216b65e89a8f97d2269c134163c2119f0..3a3227adbb018f6a15772a9bca0772b7cca2f5ce 100644 GIT binary patch delta 45 xcmebBnV_N}?CIhdQZXkv0SGJ(G`M-$F)+wwFzmvv4FO#nB#4MP9` delta 43 xcmebAnxLX4=;`7Z!f`!0fuV_+Cu7MIW(K(|W~)9`*98nf;OXk;vd$@?2>=Md3>g3b diff --git a/assets/icons/SubGhz/External_ant_1_9x11.png b/assets/icons/SubGhz/External_ant_1_9x11.png index 175f16048c577901dd1fde5ef322371a9a4cb776..931533c9187e8e919386576c2ad3e25639eff38c 100644 GIT binary patch delta 92 zcmX@YkvBmijFABdwyx`*4x~&yT^vIy<|Jn%1SI_Y|6k#9e?5=S{W2qizut)nNeKxF uNwW?gICAvdfg=Zx960jez=1<2RxmK=@8Fy@p(B|EWRRz;pUXO@geCyw7AJ=Q literal 1092 zcmbVLOK8+U7!DL_=>x%Ds;4pa(1J-OukI#vt?MRh7n-_kSKNb#<}vApHkp`AyXhjL z#f#9J7tfxGh>SVWDJ(MB_l7D9Mec%7j|9DhizCJN}VU%H* ziQ1ykpmvhJVyWA#djxJ_}>YW|;YfEVkWsM1X_Vf~drPfAxk1fmdR0sTQ>23Tg+7-2|<4mz!>P z-PJsH;R=|~bSe-cVuLK)h*CW(u{~X#uJdDo1w9B^FR}fgT2>uYaDsrwi<}Fg1PU7O z%c_EWw*W5#2}-gciUQO)QPQERt1>uxSn4qGe7#{*kKEB+iER@S>w?hfboh?U<77<` zHBA$sBuElR5nQ?*5j*3ebb6p*pwvx*m;^WixuWghO;TcMu>D(vv1J_#N9j?nXx4!DN9K!3tG5uG--VINmc*YPkZJl(ca#HZH2RGspmnh~4D4=( zC?YkZ#L_>!7kIkuYOX3fkn<&^a7qytIY*n*IM4H4UlUzfvC%;1Bz~c67Dd&Bng)xa zXqsh1QLFMCtY~G~ESrS^w-%+uj$AbG9Z=tWu2DUet5*_a6Pz?L-WW7Oy^RS@+c*Z2 z$}3JZUJRcNd9G-gX>@MEjn;PDk+}*qV+Q!$5 diff --git a/assets/icons/SubGhz/Internal_ant_1_9x11.png b/assets/icons/SubGhz/Internal_ant_1_9x11.png index 62be9f276f395c0a268ae5242289aa82565a63d5..f77a649df4154d3b5581a62c02b5263404540219 100644 GIT binary patch delta 92 zcmcc4kvBmijFABdwyx`*4x~&yT^vIy<|Jn%1SI_Y|6f7)up|32{{Q?2ZuXngf88x; t=xjXL*jYNCc{0ahX6L{EnRR-4xEP8V`EJ~~ym}YNAWv66mvv4FO#n``Bf|gy literal 1111 zcmaJ=%TE(Q9NvTk2#;vuh3aLpTp+ry+1<9Ypt7Z;p>#9uWj#ygqL? z`Fx50qr(Gyd@))Z=2MPUSJ_JBu?|kCP@h`|c+?BM1Y}{njd5Z7f(M z3S^vN@2p(&IUoQ zIC~w;bS+L0P=-M_*bGyvTN00WExyi<6%iak*hWb_7PZ<~29+qG0Lhv}R26~(l0Drt zs7DIwH2_tpE1IULNYbFCnwF`9-Y0U0iR)QSyVi5ZcO`M1vDi|SPNySxbU8}a6b&Jy zs8E4W;s`0-4jJxBVLI7ouxUyXKW2Uuf{YP6(H1L-TS2_mNMsFDY%AsI!rC^;yPB-izbhcu!anD%+jvM*F>d8i>9A+@4u)oR%` z%$lB8E2ykj%hf{PwjQPohlKWh``mZWwsNkmRY@pjQPPT{&3+*)uSYCO*P|FfQ#Qa< zmUs=S1v!wR0rS8>rUPAV8i1(=CVrTKr?Uhe$HS(He~-GgBnrS$1}y(9b&duR(F+nS zXYZbh>~RtE6aK=uFVuowQN@%LBojKA4~8i@1}`v# zpkr|9RHKflaEVG*RHurpf5a;{Tb^_c-<Ik>#gsvaI5^5yLh zpYQX@s@vsO_q)?>+e2exHy#d7>>pel`Ee_^|FvxAa_vW&_+;)c-h2N=d-m<==Fr~T fiQgZ8UU(o32v-k;wO>nDa-2n|R~PM9bM4)K-N#v< diff --git a/assets/icons/SubGhz/Lock_7x8.png b/assets/icons/SubGhz/Lock_7x8.png index f7c9ca2c702f1b93d7d06bd12ae708655c79d7c8..df07af6b8097f69202d752e56c37ba81e12a7d80 100644 GIT binary patch delta 63 zcmeB`37jBd$;bc%vh_Ds11Skl7srr_Ims5szO;5Wf`DT~W8*?j21ya7z#ox`Ye8x~ MUHx3vIVCg!0C5BqZ~y=R literal 3597 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 a9|QyVQ~@!E@+ey_4zMz}H7hmoyzn0`d`!~- diff --git a/assets/icons/SubGhz/MHz_25x11.png b/assets/icons/SubGhz/MHz_25x11.png index b9955495667452b611dc2934fbd53a5271d140be..2dae11a7e2aae1e5fba8ef53c7daa6664d8aa376 100644 GIT binary patch delta 99 zcmeyvQ#wH+mXQGn7WGKS0Vx|#7srr_Ijjda@;W#$uwE#)H*fJu?a@AyqHc z^9mKA_fxmUsHzt&-jqMnYO2}sA15D(%1uq?{o~oh^=;pTgsC9&JYD@<);T3K0RWeEbN83mJ&g}OdeG_0>Z+nP6-~#Q<*KHuwWR7mU@c>zyXrq%*@8C@^@}2P6=gUa z%0ojISx?a%$5B*W(RB<6oR5=&jBt`4oiX@4r&*L1kw~PHk#xmI;UQ2ubsS z1OZbX;7O|8`Gv^W79A#ObmzNCbOEvZdpdlnCgQ4zMvar_{#m$vSoq-M;#&X zgi+F^A$Ii8!c;Q}wwpj1Hd|)P(zVdgS`#mU?S(9YFNX|nXDwARU^I1&>D)1}O}K-N zuBl;1vmMNAmAAS!SIusSBu3p(WHEs{iDJ^@N}BYL^pBbaF%VfG7{uHts~OnA?oyOP z>c-Xgaf-iGjRui4DLR+XverFB%OrD#s_Ezs(c7EODebV&fpnMTPhq(Tiy_JQd=Dc1 zpT(uzO?*x^cbC4m#Q%@dtFY2ONqQU_r-Djnl(NN4lcM}PUz4@l+R+RSJ+2(q%@tni z_RJHY&Y<~jUi#!3H14x)f4+0<{HO1<4>zR!_rCShUoT#M^?P&sVverNy*bx-<^7Kl z`sKpD6R*AgH99PRxAW`4FW&RNJ@WYzH@@=!?CqqFUq5^G@{O?h`{2sU=ZkBPJ#gvP fqc?x}BOmJ@J%}IqdHd}j%l|`raoOK_=G^w*7i P2C4OQ^>bP0l+XkKhaVMJ literal 3675 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 Hu0mjf;;7`0 literal 1388 zcmeAS@N?(olHy`uVBq!ia0vp^2|#SZ!3-pwBG0}CQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07??FPLn2Bde0{8v^KOF1ees}+T7#dW-K+~^CEYLU9GXQxDrqI_HztY@Xxa#7Ppj3o=u^L<) zQdy9yACy|0Us{w5jJz~ukW~d%&PAz-CHX}m`T04pkPOJkFUc>?$S+VZGSM?t(C|%6 z&ddXeXo9u)`dWGB6_+IDC8v72*eU@H(aX$Cv2rvwbTM{yvotVrF*h`Hb+t5ib#ZZZ zGBYr7HZyQ^c7^G6$xklLP0cHT=}kfCb;PL`lp=BqfHu3N7G;*DrnnX5=PH1GZIy}J zE#^4QgX&Ge?G_81di8;h(FesXQe4A?fC&i1gr{C02cG^@^MHxI2$;HE)=X;#<_xv~ zpAgso|NjG-p@%NlF)%P5_jGX#skrrK#_ef`6*ydP{{Me@b6A>-Lx{=S+e`Fw7pH3% zdAs~uznOdQKDGRP;?HGHaQkgH+0OUlYP}u%=DQ!xddxlW<9jtjncLh35yqCy>x5P@ z99nmph1Eg!gFqI;m$L2IZAmtkId|qVUWuQv{-flTsXLiZSp3i5+YxWBeR>{4#?3=K zQI)4O879AZQ!=f=OphVwlFMhA6*GHUS2Jun{nDgi4&yF~hwUt~FTby;Ok>#fvsCFC zgLT90@}S8k5r-}+1~*7Jtl;ZBy)z@GLQshF(2R*k^si5`SIfI4o-plV-QgL*9Sk=a zbl8*MN4oOyJ#{*I*J09={JmL|?tkbM6X($R#JRC=Vu_J%Y75Vf{xaL$l#n(7>J9Z>Rsez4>?m+v^4&(=dnl-7VtQ3hUR|<$h?CUGgiufh#fR z%(}0KHCtpPcD3>gZd$&^{MVzu8kg;Bj?5L<)Uo%9dbPy-BY$?*-Bo?}_2;U(sTYb~ z&aKl-jNh-QDG;}};pXvkx4&CUAG$r=-JXeuLGKE4-|ks^mx9VaPgg&ebxsLQ09S_o Aa{vGU diff --git a/assets/icons/SubGhz/SubGhz_External_ant/frame_01.png b/assets/icons/SubGhz/SubGhz_External_ant/frame_01.png index 175f16048c577901dd1fde5ef322371a9a4cb776..931533c9187e8e919386576c2ad3e25639eff38c 100644 GIT binary patch delta 92 zcmX@YkvBmijFABdwyx`*4x~&yT^vIy<|Jn%1SI_Y|6k#9e?5=S{W2qizut)nNeKxF uNwW?gICAvdfg=Zx960jez=1<2RxmK=@8Fy@p(B|EWRRz;pUXO@geCyw7AJ=Q literal 1092 zcmbVLOK8+U7!DL_=>x%Ds;4pa(1J-OukI#vt?MRh7n-_kSKNb#<}vApHkp`AyXhjL z#f#9J7tfxGh>SVWDJ(MB_l7D9Mec%7j|9DhizCJN}VU%H* ziQ1ykpmvhJVyWA#djxJ_}>YW|;YfEVkWsM1X_Vf~drPfAxk1fmdR0sTQ>23Tg+7-2|<4mz!>P z-PJsH;R=|~bSe-cVuLK)h*CW(u{~X#uJdDo1w9B^FR}fgT2>uYaDsrwi<}Fg1PU7O z%c_EWw*W5#2}-gciUQO)QPQERt1>uxSn4qGe7#{*kKEB+iER@S>w?hfboh?U<77<` zHBA$sBuElR5nQ?*5j*3ebb6p*pwvx*m;^WixuWghO;TcMu>D(vv1J_#N9j?nXx4!DN9K!3tG5uG--VINmc*YPkZJl(ca#HZH2RGspmnh~4D4=( zC?YkZ#L_>!7kIkuYOX3fkn<&^a7qytIY*n*IM4H4UlUzfvC%;1Bz~c67Dd&Bng)xa zXqsh1QLFMCtY~G~ESrS^w-%+uj$AbG9Z=tWu2DUet5*_a6Pz?L-WW7Oy^RS@+c*Z2 z$}3JZUJRcNd9G-gX>@MEjn;PDk+}*qV+Q!$5 diff --git a/assets/icons/SubGhz/SubGhz_External_ant/frame_02.png b/assets/icons/SubGhz/SubGhz_External_ant/frame_02.png index 3285496fea846e6f3712065d21818422765325cd..46c843a7cb042656e35e06f2b40c8c2af3e52854 100644 GIT binary patch delta 88 zcmX@fku^agh>-yZwyx`*4x|h{T^vIy=CB?#6l74~Vc7Uyp4n(ZlgJVUR_)TGE}l1f p!lvG9H=o$rAoHd*HszAiF?MAS&RHjR^_hYU@pScbS?83{1OVld9svLV literal 1097 zcmbVLO>5LZ7)}w|(vO1(Qaw#mkQU5$(%pov?Yc?rVz(~a75Cs_C&{E6+GJufb<-lE zBBJ0$Jcyup6H)LFcu4Cquxcjwt@&Yr{rT=a3w*c0UePLIB`TqozqB2r)$NtK zv%T)jxH>gIX3Q9OeK<6dS5k(o~ zbly`m6?slhJPTw|Rs=~BM4gjlL(~jS0lkN%4rA9dYUX0k9o-e!79o)#2<>*8Z!0{G z*91w|bwQK`S>`B$OSVD+Q!Y%V`U)mWoY;?uk3*0tLK|^~0>E()M zO-NxRNW3TnL3XtcIw3XmCyYbUNqs9qLJcK&Gj?c6ys18!rtfG+8IVR}T#9{K7r0?! zXEQ({DVqhB{^4EUHK3zAnqrHbCnJ?p^J1Q}^;w;BUC;4!$x&2@`Z|a4b44pJX_l(% zVqTIgt7xj)qB1L%^rB)Ftz4g54if@H2lajX)OU}o9LY6GF@glgb&NOqjZkf2f|C}G zfUNN$zqNVcv+QafvRh^>`F5LOjn@ehZ%S#D_}PtCW`&*$X$$a06G;g{6nJq zx6E|;?*C?1pg{>)8~xQ*{Uh3|+45jc=;mP3P)NrsrgQY7zLyR4V0F1}?eFi?<>j3( zH>okoX0e`rvztwGXl!iZ?%>2n`{B}!R})juJ~Q8UK7ANGK6&ruliQC5o;J;|yZ3*b gBzy4J(88?&W^##Xb6Mw<&;$Sn8W|4& literal 1079 zcmbVLO>5LZ7>*Qb>Bq^79|wo@(t`O;b~~Z5Za2Gjp<9>jihGhyCX;UHCKHpXn^q7k z9{jin9=&<=;2-cH2t9c5B6tx0gZK;TWIw8hQp7;=&P<-?eV=(hp0~DcFU($@6$D|S zvEjD4y~N+SnJNB#H&>tG<_fEI*)|Q>0Hs8z_|zky5ushuCdfZ{@R_U%!qn@q(`DV} zrj2PNqXHx6QNr1Ru)3Bf2=5UFJhB_cj`;J#M-ha+Bi^%`YBQ;lUbu0XlI_E-4nEw& z&==Qkg4NvS4kE%3$fJIo*|{SQ{n~t894jIiLfD=ojzo2vEl{N?0Z`T?tg1RFLpd-k zlLWY|-T=C)8;YhWDwH(cRxR5y!1xh)z|;@ywp$;E<2y&}F_zehG8hcxfg#g$SJ5DZ zimEHRE^&mE9mEXfQk*SLJh&voX_&B(#-Q+sJi5;uk&7MOB1)RgQ^#>O&K1v^lA}b? zWL1fx;%Y;5#@ghMj5E<$=O7_Un`Cr9#k?fJ;)Kl8cYdG($ko_)(va5$^<9ehBNDTQ z>xlf1?1#RMFvOPOsZyX5Q!-c770H7oDEWSX1E^ucL}cRUEPlCKFXFZ-|mKtuQ zlYjSicHE2e^S7Q(U;gz{^Ikkz5ZCA5+<$xg>c`RXb>YIaaIG(_h5cuXoFg=9TkiYy Goul7(K})It diff --git a/assets/icons/SubGhz/SubGhz_External_ant/frame_04.png b/assets/icons/SubGhz/SubGhz_External_ant/frame_04.png index 3acbc03f44dbbd47da08bb70f8cb1e426fcafc64..12765ba8e7949729ec3f1a31d6292a836fb5e8d8 100644 GIT binary patch delta 87 zcmdnXkvTykkdXlhwyx`*4x|h`T^vIy<|Jn%1SI_Y|6f6vnVI?Wepw!$|3MNnBqSte o%y?#CU|8sIgNKhtr>BRD;SDGIEMwJ@tspZzUHx3vIVCg!0N~CX9{>OV literal 1085 zcmbVLJ#5oJ6t)zpRBbAdSoj$@xl1e6_W3WVt(ua?NgJstQ5qlZ572#LL%^HUhA3Sr59cjxbW@7?#_d)C@mote5e#c|wB zW6f?edzrn{lLhvDGhLr#<|?gq=_c`M-$^i6@ra8-BXqWL8#~_qgU@)0;|kA%PM3C@ z>n0+h=;RnN3uDISxTWPRcF+!{z{T4^Wbr@Vf8asjS^Pb{37c^h_ky*91aBT}bkM;L zGCY3yCRoZ$<{-q>0a>^krDkUF1HUF)=f@Hc1`xVq@x!FL%@(MV1Or2q1q7i2%7*Bx zx`usJh6_M}iYm#n1Pwt}OsJc>3Puml0w$hsw(a^T9NSrZkJ8wbq<+6I_EnK2+mdV; zh6EK!Q3Qq%(*1}!nGmJ3V-Ge?Q4+*7AQ8wtIxg9x7SEC$-Xe^f%~QuwI?{@%CS^`6 z$s&}(Fu&RWozgb`lg63ow6h;$sf|;zmmpRWe|Ah}@|_K4QZ)yU{hY-wSL-Du7tMfGS+3P8 zwx-wB608~(wN|N>$J|DgQYS)q96MmKN8H78xn?!N4kby4klk@3w0eY+v`1o~=%NPZ z^1{msEQ_J2Xi5oahVCk!JP*KJ(?LO$gXi-C4)w5c5&WOpt4`0e6juE5<`;8uSfeSgQ8 NT%)#Ozg^jS@*5^2P5=M^ diff --git a/assets/icons/SubGhz/SubGhz_Internal_ant/frame_01.png b/assets/icons/SubGhz/SubGhz_Internal_ant/frame_01.png index 62be9f276f395c0a268ae5242289aa82565a63d5..f77a649df4154d3b5581a62c02b5263404540219 100644 GIT binary patch delta 92 zcmcc4kvBmijFABdwyx`*4x~&yT^vIy<|Jn%1SI_Y|6f7)up|32{{Q?2ZuXngf88x; t=xjXL*jYNCc{0ahX6L{EnRR-4xEP8V`EJ~~ym}YNAWv66mvv4FO#n``Bf|gy literal 1111 zcmaJ=%TE(Q9NvTk2#;vuh3aLpTp+ry+1<9Ypt7Z;p>#9uWj#ygqL? z`Fx50qr(Gyd@))Z=2MPUSJ_JBu?|kCP@h`|c+?BM1Y}{njd5Z7f(M z3S^vN@2p(&IUoQ zIC~w;bS+L0P=-M_*bGyvTN00WExyi<6%iak*hWb_7PZ<~29+qG0Lhv}R26~(l0Drt zs7DIwH2_tpE1IULNYbFCnwF`9-Y0U0iR)QSyVi5ZcO`M1vDi|SPNySxbU8}a6b&Jy zs8E4W;s`0-4jJxBVLI7ouxUyXKW2Uuf{YP6(H1L-TS2_mNMsFDY%AsI!rC^;yPB-izbhcu!anD%+jvM*F>d8i>9A+@4u)oR%` z%$lB8E2ykj%hf{PwjQPohlKWh``mZWwsNkmRY@pjQPPT{&3+*)uSYCO*P|FfQ#Qa< zmUs=S1v!wR0rS8>rUPAV8i1(=CVrTKr?Uhe$HS(He~-GgBnrS$1}y(9b&duR(F+nS zXYZbh>~RtE6aK=uFVuowQN@%LBojKA4~8i@1}`v# zpkr|9RHKflaEVG*RHurpf5a;{Tb^_c-<Ik>#gsvaI5^5yLh zpYQX@s@vsO_q)?>+e2exHy#d7>>pel`Ee_^|FvxAa_vW&_+;)c-h2N=d-m<==Fr~T fiQgZ8UU(o32v-k;wO>nDa-2n|R~PM9bM4)K-N#v< diff --git a/assets/icons/SubGhz/SubGhz_Internal_ant/frame_02.png b/assets/icons/SubGhz/SubGhz_Internal_ant/frame_02.png index cd87fcdc9d5df2b0d8ffcfb42ab67f975943b6d4..462d8dcd89332012100cab81c07a79c21b76702b 100644 GIT binary patch delta 92 zcmcc4kvBmijFABdwyx`*4x~&yT^vIy<|Jn%1SI_Y|6f7)up|32{{Q?2$Lu$y|GHn$ u(Ajvfv9oYK^JIp_%+7!RGwby9a4{79>6LG#14T9*Q2xm{JS4&p_3=?B) zKx81KNraZKCxY~~BtJW3@K{c>C>0S;K*30Sz9y=w6ubM1IBm7|h?9H}D;YJTPg29w zp%KT$({|9gXtVz^4n*gj^^_THmh-iY%9Mm>hsH8|hdU~OQjL2(i)3ENs>kVC%o5S` zs;a!vgD7wb#niEUsD+5xnq7ev&BrCI1wlwdY*Nc6Y{+wveZ6wULsq4PF|3)O31vgyk@P*Vbq=+4>lq`0XC2O0hlQ}P%mvSvc?yuD+hD3l zyoq30k9B0D60ou3qrf}|z*LLSC@H|_iUjV)!(&-=hXpekkHJm`+~@#xW#2@YT4jxu zOQB|4ey9s>jyO|RDJ|M0tAZ}j-_%MXrBJo|KV?ANu)XWzFTbRTVfp4i-&oS1~4pME>@^IPq+iKN>VzPyhe` diff --git a/assets/icons/SubGhz/SubGhz_Internal_ant/frame_03.png b/assets/icons/SubGhz/SubGhz_Internal_ant/frame_03.png index 459bd3eca18ea8095fa28446bf3916c79aa3da70..0fcd542b62452fc4fdda3e68aea8d46bf92e75af 100644 GIT binary patch delta 87 zcmcb{kvTykkdXlhwyx`*4x|h`T^vIy=CB@QV!Z literal 1110 zcmaJ=J7^R^7+wrWFhmOr(P~%=AGojC-Q3NRGoH5>bC8SSJTVA@v$M0wlI+g9JMk_l z6f6X_u(K7dM9?~*plD@fVP|DwVIf#q%K2|{7cD{-cAnq={onkL2a5}rCJ&uBq$tW{ zYtHY$d=&nP@i7=*PRx$ObX+!<l2?=l(A=VcS$a_ z=RGD8ot7BApJZUIDAP0jjIvcOQNWkuw5I-g^G-!^SW~aLZL^&<_)0vtne!`~3thIk z%1EfroJZ4r4+s)2De5O{Y2o#2>Nc+j>+;x8(KbY`*3=zQOYKF}5IILgw=`y&7*&WK z*{;JQRx!^ZY+~E6EW;$4g+0^tTpJBP6&&VaU^Cg5_~0W09hgkp^O2)>II?^NJ*Ew|9xtVi+rkn$f43 zVd}B7mUi7hDtrKE4EUVe9 z`;I$nPniu;x1055Wn|k*3rSPPN4{h5J+y_0?_=vVa!#elyF#pu3Sn_YNKvea3}IJy z(CISq7B(w-qGJb7A&0mD4y`i?oo-VWrzQAInZTWR_&kqq^Kdp73EIwp7w@625?Gip zyQ1;RRHQj}5NXuqwiX4vN=ZC(D=u%gS*#{oSoRpPVkAF$9~56?SWUnzkR=7`&>MlH@1F0 h{Bc=iPiLMeW6G)L%8lZ}i%&qJw3-Y4>x(z<{RMqXT@U~O diff --git a/assets/icons/SubGhz/SubGhz_Internal_ant/frame_04.png b/assets/icons/SubGhz/SubGhz_Internal_ant/frame_04.png index 1d785d453414c6013996b52792d385b5e4ce5902..8426585d9580d2460601b07899752a22d80163c7 100644 GIT binary patch delta 90 zcmcb{kuyOegpmOVwyx`*4y24dT^vIy=CB@Q_&Ih*a r?kHLme1G1ai7ay-TZGPuSgG`lG4wyLbc#u=2FMssS3j3^P6A4YRYeu);pv9lV3W z7|}!%8)Iu@Cl)5w780?s)k;e%wXw6sS-3+A!X`V<@BjX9{>Rh$;`NciD}#a{j8y0C z2A?nTe`uhOk8g%51AH1~kof7VLH}huxUyXKW2Uuf{YP6(FQAsTHnw-Rdp4bHcqqUiEyMJBrd?_> ONUf)8 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 MrJY5ondim-0h+K&wEzGB diff --git a/assets/icons/U2F/Auth_62x31.png b/assets/icons/U2F/Auth_62x31.png index 40f094ac9ba758ea06838c2bb8376cf6f28f8050..0c22865b2621099e646fd1b24e7269009417af5a 100644 GIT binary patch delta 234 zcmVX1-?!N}dFVox>Iu;{b4?+ z{az18S+6FJ&-$sh1iG2ixpiiHlWjL)Gus*jv*mNCN^rTo8(U6tqh+0$L)NQ+um8+f kJAwP9ab=M<*MW2R1Cs7nrIqzeBme*a07*qoM6N<$f}rbdDgXcg literal 3761 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 diff --git a/assets/icons/U2F/Connect_me_62x31.png b/assets/icons/U2F/Connect_me_62x31.png index 68c48c0e68142548919d6a4b02e40b48a243b04e..d7def86b0c48112ec9b70c7d36f8ecac4367c125 100644 GIT binary patch delta 223 zcmV<503iRj9q$2<7=Hl(0001&N<(@8006d0L_t(|oF&FFPQm~b0MOT;4&CU$rir*Y zdIaK0I06T7s5jvlE~bDta3%`IL8DQLgEh8%2jBFH1ctB=5FUo+Kl5S&4w)aB*+){b z76(d>MGxKtg0blKJbDtcDQ*nnb2qhX2zQI$2BGl&gD|*$ZdiydvmL_u)&;`RB1>!9 z@9anU+6Vd?q0&uIvaDA+K|Q~1#)8w;r5C{{mvXAj%tN-DfG_HRd#b?IT&=_`ofUx- ZdVhYiN{C7@Kw$s?002ovPDHLkV1lF5VYL7N literal 3767 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 literal 3695 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 diff --git a/assets/icons/iButton/iButtonDolphinVerySuccess_92x55.png b/assets/icons/iButton/iButtonDolphinVerySuccess_92x55.png index 0a85465cc52f0130d3b1a7d4c6d74cdf7c494f60..0d8263c5ed022bd46639fc4ca53b6fb16e80b2cc 100644 GIT binary patch delta 507 zcmVHJthL8}ayjS#_ovoM)W zX6HQ?vm3nK;W_tSxc4|w)&&5^28Wue1P1Rp7zq?^YA8vPH-Cy2wdR=gcclG_psu9e z*wzIm#?w9l^>NP)NyXT9tJ(%&y3ctT>%2G@p`}yYNVtyf!~l3qjj)#h1hBHhOI!@8 z$6RAb3NRfob(B}z-(jx7S;BFXSC=8vi7o5m7j3>x=&zk{eYljX_n<+h!p;6tQTFD& zm2JdraEl9&sehcEl?wfQ;_0u2rG2TU!;dX81xbTq_;uM^*#_vL&u_3=%K=-|uic{} zN>RDcq$?FVRj%ztZ&4fg%YbA8D_R&^cm{W|sEvD;@`yUnmGoReA(!W9O_EL(e#^5b zNy-&^@)oTE{J_Ov+uy32eQ1D1Ge8-0_Athtt^)_Kn{+qf!ipqzLg?*#D>k5n0uL6= zCDdvJQm|s9nKDcVBw*1T6X4s#DK`0?X*f;=ST;ix<6;1toX1V^nm~eOtMJ(Q>Zw<% xcqtF^mbJ%G0j`e7pHki~jmS~>kF0FU{{!6@F4%*2N$UUr002ovPDHLkV1h?r?G69{ delta 957 zcmV;u148_X1jh%E7=H)`0001i+%3TX000SaNLh0L01FcU01FcV0GgZ_000AdNkl6c7=NVsWB4Vl_nD;cP@ngX}hYRUi(#ZP1~ zNOEhf)>@lJD4v+NPe6@Ocqc7_tjJg=Vv2B&qDN!Djd&N~kbjIwlC@k}IacD|=nWLv z)&}W8YprJIScxHpuT(ad|8}LD6~0>86yBh8lfri^n;OsVF?gXW`~+pc38s>QmAzYC zH&41qI8-!z$Xg%w1gJ}UOnNEf3a2J$_gk_HY}4dw_Xttaq9tNMb7S)q6+WYEOa`a& z8%g6}c@}dG?|>C z(S807mhdch0*{?evW8k~qnf`YI<{$2?j)+gQA&v-pNr!iHzhbsGJYN@*B9ZEvLoF@ zWYe^~>Rua)xsXIBiL&P>70xL;(!$M>JyK8MHJ)dX?tj(xm+(ZBgwH4(-mAF?c-|6w zlw@suTCUkeSy@GNlGcmU*9OsOTm!WDHcLpEA zVPnMP;?I+j{btU_cDa<@ZiNDLFi|lru45FnwMLrun^v4r`#$iy=1jbB)$kK0AyRo- zbBuIRwUi?MN7OAOd&ed{m$ZlC_2Fs_-@WqewVBJcaxuiMaz|>t`m6me*OEDzo|+u> zhJS}BJcArcNh9Yua4NOjGn$KxRTkCo%pPD>tfz!n;*P{#R>S-KD@p}*+&kfsWS4>z zzRI0MFTJ%%oGCrg*FF@!%ANEYnyq+mozH}-@Fjzo*ou`_h%@8KP!HpvD;$UF*tIm>TX0 fb}L3q!Yn_(*J$yOEP@Dd00000NkvXXu0mjf8O+Zq diff --git a/assets/icons/iButton/iButtonKey_49x44.png b/assets/icons/iButton/iButtonKey_49x44.png index db895ec5284111ccab12d660c1e9f237bd7e49aa..d3bf6e20feac3ee343213f6756882c2ab3cfb6c8 100644 GIT binary patch delta 244 zcmV#V->B}8T(zxW*PXv<@r0d-Hc2wdx`Bd{(4Eg380~WTR^$yJw?msq!jz`_$zR_)N)nplC)d_T znWzzjX|1uxgl#>|ak-~m78P>Ea>AFFFhLgDfXHVvx+UfP_yu>yTg^R@2OhuJiL#qn5 z@Ry%V+qNOmbS{^3=R9s?rf60aMVjGgj-xPwvbuE}XPPvdZO0>FF2onw%od*WZx*5l%A}|`A9-7UT(3TzU!d41;Z%J&$yA4RULJM`8 zG7NV?-Ck5QrpTqeMyHvX^i+{)n1NXgv#>C>WXeb*8(C>|8$U|RC2tHVXhL8kGmcQE zn5bBhh2U5>M=V*Z=?cnOwT_~~1{eZ1^piMiEX8p6j&qE}GZN=r$}$qeOhKc#4isR6 znSqg_sogVyMx#qDs%7wk)w+5m5eWwcRulw^bF)s_V;R`pM$N)G z?k*gpHrP=ZWi(>4Iwc@Ghr&;+vQ#7#h$o&O?h90ZOjLxA{q)yR=H9MN;c)K|wWW@G&bNH? z;`o}#QHHF}^>qd|G26rc~o{2B} zNTIgp=YFqbw2d-unABNx|~ubI1>ocOu-ji$h^hhm#*TkHHAHrBddnsoteII(T) z<%8=!ACb=17|UuY`wMITJsoX7?A@jvP8{BO>G=4-mQ~l^S#|%lj&C1%ZBSgzpIqQ0 zi8Dv~Vt@D+{sK0aPb8L~s;Nlqe;ufIUpd~={BTR#o^a>)>WM_hp_-Phy|K!rZ_W=M zkd6(Hj6Dbj=HGGZ#cj9=oy}6q^cyzv-9)~t>yuRunaZ_OVwQ!3Jfh=ZgQ) z9VgcfXyQ%nvm}@_^Aahn!x=?g*MOoQHp7&kh@ zqlSNHNwcVE*?(;(gLr(F6czk}KW|u4JXlWJ(p2oXmewJ~Tq9{}@NV`O9eSDz8%!@r zXKnWxG(0iEaP*tIYw+YKDGQ%+_640W@YwE7ge*7j!U^nyi}*OUG7U^a&HEd#NM``? zYc)Iw6{e#9K1aO|@#0(DdZ#cQ^-pHt^$2eKJq_D~6Mq-cH9=SKA*ARih@WdIr#+@S zgHwrILJV^dd4}Ls)coGxM&+ym4pn zCwSpChjZ>d=iX*#66AO11&o z&N2YxpR~ROc)%c~Dggio6EeZH1O?vy+WqI0(6#in-w_-6m^ zbcYzH5QdojYkyB`^Fs#K-hpRv$oc)w88URvwBu9_sci?5_zqiGDL|P4@D&RBa=h}H z0RStt?9}M!aSBvv2?asmiY&-qCaqEd^xse1NdoHSm1#lF&rK*b_Qy2mZ#&2DJ-(i%j(YZ?xs)ubLfu#?w1&C*r a5q|(Z#>AG`k_xc^0000ZTL9~*rHm&@+m@AfvcvqS&3rQ-OED8p1>}rb&0yA!#kumNWLMb9+KKE6-GQG?qoP?&>K&rf zrj)=8(w|z&NSe}HQTv_v%qBqPcKj;GKLuCC&opm}vML@fz%o7f3xI6;RU1;I4<2nm iCaM%!pcypw>Cq3BgNA?Vg1o^10000tJ*q zsPCdpJ=(B3BM?8JW!P>6NRk>(a&nRq1DGEGOO^nh0DVuYE@)=J$%g1y@ruCImB8G) zPzI*}J`;rozds#cxmjeqV3bFk`*!1l4`7O^c>vcR=LHaz$2&a80IcZEa(56Gf~3mt ztLM_wbI3^R^f#D&)$^ZX!J1dVoZW2)3PG`upu7Yw8m|Q94#EBCpPMkRL zUxPM8HfpH9WfE3Bx_$wG#06fF2*6vzLUVv@bXUo3_W+915q}RJtu^i%0G}Cu{yD(a zRwp*joUy}v!<}7?F1h+w6Ng%xIJiS6xc~`VfZ8jxue5LhxB!hol-Lsh@c;mbrSKA{ z96$gn2V4MN3sC5u_w+6loi|c zh+yjh?R@sAKbpSdNL~|U0K;)Qz`_c6*1rHCx0^Hi+SzXacsa0I1@?BEMa~L53h`|> z9oqcmT{{87?DtwXI^m@LYXGzQCJDC01Ar|Azr*|h{u~6R)=RWQ0000EWmrjOO-%qQ d00008000000002eQjV1egSn8Gir(008=}Lec;L0pCePK~#90-IFnE6hRn0#6oe819Rw^+;I!p#NGKU zcJH#6pWt-!F!Rkb?>D1_`Jwr*L7~DqB0c#aB4W#FQ}do{0Dn@BHm)hIDdH;7)hH+dqg%gjqf;ONo4sk$zfsvc1C3A1#>zen;e-0CTr*J zKOY!8Hq7~ZCVwK|E`GYl?Mz!p4bT9vWyp;X@M<6c7%GE$*#b#eja_si2CPIXuC?Ld zhlq4)D@MU7u_S;V?9Tu|$Fe*FO(+t}=-c)EH~lAQlx5F?lQ!SaZlWRN1{Mu$lAo2jK#^{N-V{|7k^+_9a~u7E>*`t^9sgcU7cMC z0CuLxcNxAoc{*)npk9zdI=tE_w}dcoaQx|=SArOW0LJ71`pm3;k^$&-V5neGnKC*N z>3m+0xzzdUorrnBvrGA$sVub`b1No~Vuz|8k&lS~F~2zbFRT9mHBC5&*LLMTn|7Sbp+^>KYos-|aynB9krvL16Oj?I~^q6l4rnofGJ~bIs zIXxty`9q?L56Hoo0K6rv6r%-gj01+*{;P*E06)kD^d|AUZ3cvMl<2i87-GKRSrG}+ zt|Xize)-@NAb%pE997i83o%gAEDJ+9fDGSm*p(jpMt6+`hZ}x6@D)SsksFZ8ufyx` z^dwZ`*2%@Mw}Wqh(3~F_C3>Ur=97K~#90<&!^)6hRQhe_b=|4Y(&G8Ympx zB!U(xRv?`yhL<; z<|kZ5C{FfHrvQA0Ge}kbeqQGQOhKG%rGN!c3&slxkO8y~7zx z00;uiJGL?b1`DDDC_8RrfK&ilc(a*@g#b{??Bm-{*Xz5lED1DeA{5cd1ETX&8b^Hv zS(pM#?I~X%z<&)q+zioqQel~$J`qYrh5DGh3zPis%Zrppa@tE7!ZgY?Bv`e z2M{rbBxz!~WjqApt^IwT0SxPn!3OI19y&x+!rr(;$Y0a<%{PyjC1T^N86bAu;@<6m ziAT#{sO}CJgF?CMxK?k%qApseH0OG(K&PY^CSccBu4uMz%-u)10t%~5JXTcqt;AJPtP@RD* zhrzL`rpY6o{SA=o4&AvhlcQsHIw-vHVd YAG3sJjF1egSn8Gir(008=}Lec;L0pCePK~#90<&rUL6j2m~zjx zHUAb!fy_#M3*htsEKvLRFQYP%0Jcojz^Xt(N|sZ4Ad@rn0kU&;_{}})0mO{LP%4qO zqwPBYKH4w>Lx0?)r(PHX3>~nEAZFGDH83pz?DV4H13>Z6@_Xt~r~%9PP5|;eC<#mZ z&P0I#YZ?Rir#i+3mfQyzn4549yVHDnS7y=DbX$Zaj_C0{dUKO4e$mB zv~{Gas=IsodPTLA(}aWN+z*ozH9qs#&m5OxKuiI@V8s;&3jx3%CYY##q1H3*00000 MNkvXXt^-0~f@wzZPyhe` delta 565 zcmV-50?PfE1j7W78Gi!+008J1?K}Vg00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z000J1OjJex|Nj6009C@%egFUf32;bRa{vGf6951U69E94oEQKA0mey0K~y-)<I63_A`}K%)>4vK%4go z21ZyXIs+Ncit=+QaTp)NCT^P7Eq2=XJ}4{uI1#}qRDU+|rVfgoOF{sO&p?g=V^Fq( zxJS-nv6DA21|7jw?8NEQ(FvHK3AoJxzcqa@MB^9gkD_tT4+Eh`L?62_9Bd-)U9I`j zt=s>0_9R3BJKZN7xd3?tZzn3qSJr#f-z<`?~cGsKK00000NkvXXu0mjf DP9*Ys diff --git a/assets/slideshow/update_default/frame_00.png b/assets/slideshow/update_default/frame_00.png index 385fbbe061539ecd682922a07996d5b5ad23bfd9..05d3a40a3c56f50430c3b4653f9dcf58f27151fe 100644 GIT binary patch delta 548 zcmV+<0^9wg5wZl38Gir(008=}Lec;L0r^QpK~#90)siu56j2m~zjvLuOAKagO@svz z`~!lDm<0t(t?YyqOTj`A6b-w9fR_FOwXqQd6+t0_BM24-Vj-f9Orn?+lHHh)%w%TY zv3Q$gg1^91Jl;F^^6t6!9w&Cg_@9Z~b#@bTs#jB_3FX=WDt{&4_WQ!K-8KZS$=c2z zCD5QaeC@@-`kFZ8!U0~qAZ5Xzl%E~3!lob+~7>H#=|>?rhq!b%Fr;M-Z)7zVol5S7vE1sHe0 z#RreaoPvEflYb*4*KJsn? z|McpSv01u4*{iOclnzGd9@Tgz3zcx;(()1gdjMu|<`s#xgI)s~ z)$OOvN=6DK9ZIShQ&l@OK{gLdOgR@DkWx%ebh7J`w0}fbTGWSmwU>PD{53CHZTNM2Sf&>Bq zML?34G?C%CzBNQk_SP~j&` zJVS~cZ|6AANV;t!Rv=udK%u!-l45<5-FZ?-VHL(qii`o4k`K}j4m+kJaFBoXJE)RC z(Gb+i(X6vF0>$MhCdW}brY6)n0#&{Q1*J!mBKay{tCg_$1d;SnjKyq#fl~^WrNQ2M zm6LShat(!RxoJx`!_6z8nIjUSDa73R5`f78Q7R}I@)k>Wf z!!k{JbC%MKXKGL^OM_DF#TMF}gshjM*O;G`EQL(Of_P-4Rlv+@#ON zfH@5M@&yGTEJT`Eqk~OHLdklWmk@5$qzg^aVQnx*!3yY&3~^}{`4BKZuqzM7e2IE{ z3-|!_SZphzO)Yp7P zRX@MbICGh{rX{812W?#OKy=3EdrFFD0l|KGh1HCvNv_IiT*b z9oW11DeITjdI>}qxIJJEgp(Xlo|aLs33KX>lF_2)p>_1V2iYo07@J#u8nwT0c+ zi)s#J#mU=>n&;?ZHF1~gOo!sQ)+X22lUhn|%(3)e-FRy0)f?m~Z+35O>ifQNoYXxAO6^L@uaeCaI5|7?9P(*-2NkV&sN#j zu|gwpcCr27*-5w7AKvoSv%!+WyhApsF5#P>mc-7Qu|K%LnD}=xT1zKB8@v~r*p**# zXaDJ=71RH^-SEb&cY9hcSEn8PcyM2v_jb)&+Z6TP{+m0NSSMExbl+U|MJYP*!p*f4 zR=s{6y&Lxl);;m)y2f@(QhdXQrp3#@Pxe5kR?LZd98)+o`Z(EVX=;45HLm@Ve2?!u zotm4r2&t~W6qDLC)hSGv_F&%g>^)7oGbzeIrOT#W2{$|}JpE5GYPpq@e^+<>arVyV z=QPKX{oJp;GinPCMm^d1X%!Tc%bg+mH*ZqB`Q2n=c3@ztY$$41{C3;v^{SQ9{{l;9 Kp1C=rwB}#tL-H*E diff --git a/documentation/fbt.md b/documentation/fbt.md index 8e083349f7..fee003abb0 100644 --- a/documentation/fbt.md +++ b/documentation/fbt.md @@ -78,6 +78,8 @@ To use language servers other than the default VS Code C/C++ language server, us - `get_stlink` - output serial numbers for attached STLink probes. Used for specifying an adapter with `SWD_TRANSPORT_SERIAL=...`. - `lint`, `format` - run clang-format on the C source code to check and reformat it according to the `.clang-format` specs. Supports `ARGS="..."` to pass extra arguments to clang-format. - `lint_py`, `format_py` - run [black](https://black.readthedocs.io/en/stable/index.html) on the Python source code, build system files & application manifests. Supports `ARGS="..."` to pass extra arguments to black. +- `lint_img`, `format_img` - check the image assets for errors and format them. Enforces color depth and strips metadata. +- `lint_all`, `format_all` - run all linters and formatters. - `firmware_pvs` - generate a PVS Studio report for the firmware. Requires PVS Studio to be available on your system's `PATH`. - `doxygen` - generate Doxygen documentation for the firmware. `doxy` target also opens web browser to view the generated documentation. - `cli` - start a Flipper CLI session over USB. diff --git a/scripts/imglint.py b/scripts/imglint.py new file mode 100644 index 0000000000..fc63f33555 --- /dev/null +++ b/scripts/imglint.py @@ -0,0 +1,97 @@ +import logging +import multiprocessing +import os +from pathlib import Path + +from flipper.app import App +from PIL import Image, ImageOps + +_logger = logging.getLogger(__name__) + + +def _check_image(image, do_fixup=False): + failed_checks = [] + with Image.open(image) as img: + # check that is's pure 1-bit B&W + if img.mode != "1": + failed_checks.append(f"not 1-bit B&W, but {img.mode}") + if do_fixup: + img = img.convert("1") + + # ...and does not have any metadata or ICC profile + if img.info: + failed_checks.append(f"has metadata") + if do_fixup: + img.info = {} + + if do_fixup: + img.save(image) + _logger.info(f"Fixed image {image}") + + if failed_checks: + _logger.warning(f"Image {image} issues: {'; '.join(failed_checks)}") + return len(failed_checks) == 0 + + +class ImageLint(App): + ICONS_SUPPORTED_FORMATS = [".png"] + + def init(self): + self.subparsers = self.parser.add_subparsers(help="sub-command help") + + self.parser_check = self.subparsers.add_parser( + "check", help="Check image format and file names" + ) + self.parser_check.add_argument("input", nargs="+") + self.parser_check.set_defaults(func=self.check) + + self.parser_format = self.subparsers.add_parser( + "format", help="Format image and fix file names" + ) + self.parser_format.add_argument( + "input", + nargs="+", + ) + self.parser_format.set_defaults(func=self.format) + + def _gather_images(self, folders): + images = [] + for folder in folders: + for dirpath, _, filenames in os.walk(folder): + for filename in filenames: + if self.is_file_an_icon(filename): + images.append(os.path.join(dirpath, filename)) + return images + + def is_file_an_icon(self, filename): + extension = Path(filename).suffix.lower() + return extension in self.ICONS_SUPPORTED_FORMATS + + def _process_images(self, images, do_fixup): + with multiprocessing.Pool() as pool: + image_checks = pool.starmap( + _check_image, [(image, do_fixup) for image in images] + ) + return all(image_checks) + + def check(self): + images = self._gather_images(self.args.input) + self.logger.info(f"Found {len(images)} images") + if not self._process_images(images, False): + self.logger.error("Some images are not in the correct format") + return 1 + self.logger.info("All images are in the correct format") + return 0 + + def format(self): + images = self._gather_images(self.args.input) + self.logger.info(f"Found {len(images)} images") + if not self._process_images(images, True): + self.logger.warning("Applied fixes to some images") + else: + self.logger.info("All images were in the correct format") + return 0 + + +if __name__ == "__main__": + ImageLint()() From 0b19fd29e665484223bcae5d53f339b832c4c9a1 Mon Sep 17 00:00:00 2001 From: Georgii Surkov <37121527+gsurkov@users.noreply.github.com> Date: Wed, 7 Aug 2024 04:05:53 +0100 Subject: [PATCH 32/52] [FL-3880] Fix cumulative error in infrared signals (#3823) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Correct for pulse duration cumulative discrepancy * Add infrared test application * Build infrared_test_app for f7 only Co-authored-by: あく --- .../debug/infrared_test/application.fam | 8 +++ .../debug/infrared_test/infrared_test.c | 61 +++++++++++++++++++ targets/f7/furi_hal/furi_hal_infrared.c | 12 +++- 3 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 applications/debug/infrared_test/application.fam create mode 100644 applications/debug/infrared_test/infrared_test.c diff --git a/applications/debug/infrared_test/application.fam b/applications/debug/infrared_test/application.fam new file mode 100644 index 0000000000..bfd7cd5d45 --- /dev/null +++ b/applications/debug/infrared_test/application.fam @@ -0,0 +1,8 @@ +App( + appid="infrared_test", + name="Infrared Test", + apptype=FlipperAppType.DEBUG, + entry_point="infrared_test_app", + fap_category="Debug", + targets=["f7"], +) diff --git a/applications/debug/infrared_test/infrared_test.c b/applications/debug/infrared_test/infrared_test.c new file mode 100644 index 0000000000..0187bd49d1 --- /dev/null +++ b/applications/debug/infrared_test/infrared_test.c @@ -0,0 +1,61 @@ +#include +#include + +#define TAG "InfraredTest" + +#define CARRIER_FREQ_HZ (38000UL) +#define CARRIER_DUTY (0.33f) + +#define BURST_DURATION_US (600UL) +#define BURST_COUNT (50UL) + +typedef struct { + bool level; + uint32_t count; +} InfraredTestApp; + +static FuriHalInfraredTxGetDataState + infrared_test_app_tx_data_callback(void* context, uint32_t* duration, bool* level) { + furi_assert(context); + furi_assert(duration); + furi_assert(level); + + InfraredTestApp* app = context; + + *duration = BURST_DURATION_US; + *level = app->level; + + app->level = !app->level; + app->count += 1; + + if(app->count < BURST_COUNT * 2) { + return FuriHalInfraredTxGetDataStateOk; + } else { + return FuriHalInfraredTxGetDataStateLastDone; + } +} + +int32_t infrared_test_app(void* arg) { + UNUSED(arg); + + InfraredTestApp app = { + .level = true, + }; + + FURI_LOG_I(TAG, "Starting test signal on PA7"); + + furi_hal_infrared_set_tx_output(FuriHalInfraredTxPinExtPA7); + furi_hal_infrared_async_tx_set_data_isr_callback(infrared_test_app_tx_data_callback, &app); + furi_hal_infrared_async_tx_start(CARRIER_FREQ_HZ, CARRIER_DUTY); + furi_hal_infrared_async_tx_wait_termination(); + furi_hal_infrared_set_tx_output(FuriHalInfraredTxPinInternal); + + FURI_LOG_I(TAG, "Test signal end"); + FURI_LOG_I( + TAG, + "The measured signal should be %luus +-%.1fus", + (app.count - 1) * BURST_DURATION_US, + (double)1000000.0 / CARRIER_FREQ_HZ); + + return 0; +} diff --git a/targets/f7/furi_hal/furi_hal_infrared.c b/targets/f7/furi_hal/furi_hal_infrared.c index 029d103cb5..a1169391d6 100644 --- a/targets/f7/furi_hal/furi_hal_infrared.c +++ b/targets/f7/furi_hal/furi_hal_infrared.c @@ -54,6 +54,7 @@ typedef struct { typedef struct { float cycle_duration; + float cycle_remainder; FuriHalInfraredTxGetDataISRCallback data_callback; FuriHalInfraredTxSignalSentISRCallback signal_sent_callback; void* data_context; @@ -512,7 +513,11 @@ static void furi_hal_infrared_tx_fill_buffer(uint8_t buf_num, uint8_t polarity_s status = infrared_tim_tx.data_callback(infrared_tim_tx.data_context, &duration, &level); - uint32_t num_of_impulses = roundf(duration / infrared_tim_tx.cycle_duration); + const float num_of_impulses_f = + duration / infrared_tim_tx.cycle_duration + infrared_tim_tx.cycle_remainder; + const uint32_t num_of_impulses = roundf(num_of_impulses_f); + // Save the remainder (in carrier periods) for later use + infrared_tim_tx.cycle_remainder = num_of_impulses_f - num_of_impulses; if(num_of_impulses == 0) { if((*size == 0) && (status == FuriHalInfraredTxGetDataStateDone)) { @@ -521,7 +526,7 @@ static void furi_hal_infrared_tx_fill_buffer(uint8_t buf_num, uint8_t polarity_s */ status = FuriHalInfraredTxGetDataStateOk; } - } else if((num_of_impulses - 1) > 0xFFFF) { + } else if((num_of_impulses - 1) > UINT16_MAX) { infrared_tim_tx.tx_timing_rest_duration = num_of_impulses - 1; infrared_tim_tx.tx_timing_rest_status = status; infrared_tim_tx.tx_timing_rest_level = level; @@ -632,6 +637,7 @@ void furi_hal_infrared_async_tx_start(uint32_t freq, float duty_cycle) { infrared_tim_tx.stop_semaphore = furi_semaphore_alloc(1, 0); infrared_tim_tx.cycle_duration = 1000000.0 / freq; infrared_tim_tx.tx_timing_rest_duration = 0; + infrared_tim_tx.cycle_remainder = 0; furi_hal_infrared_tx_fill_buffer(0, INFRARED_POLARITY_SHIFT); @@ -655,7 +661,7 @@ void furi_hal_infrared_async_tx_start(uint32_t freq, float duty_cycle) { const GpioPin* tx_gpio = infrared_tx_pins[infrared_tx_output]; LL_GPIO_ResetOutputPin(tx_gpio->port, tx_gpio->pin); /* when disable it prevents false pulse */ furi_hal_gpio_init_ex( - tx_gpio, GpioModeAltFunctionPushPull, GpioPullUp, GpioSpeedHigh, GpioAltFn1TIM1); + tx_gpio, GpioModeAltFunctionPushPull, GpioPullNo, GpioSpeedHigh, GpioAltFn1TIM1); FURI_CRITICAL_ENTER(); LL_TIM_GenerateEvent_UPDATE(INFRARED_DMA_TIMER); /* TIMx_RCR -> Repetition counter */ From f4122a924af16c775673a81e78a396ee729dc634 Mon Sep 17 00:00:00 2001 From: Georgii Surkov <37121527+gsurkov@users.noreply.github.com> Date: Wed, 7 Aug 2024 04:49:41 +0100 Subject: [PATCH 33/52] [FL-3841] FuriEventLoop Pt.2 (#3703) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Abstract primitive type from main logic in FuriEventLoop * Remove message_queue_i.h * Add stream buffer support for event loop * Add semaphore support for event loop * Add temporary unit test workaround * Make the linter happy * Add mutex support for event loop * Implement event subscription and unsubscription while the event loop is running * Implement edge events * Fix leftover logical errors * Add event loop timer example application * Implement flag-based edge trigger and one-shot mode * Add event loop mutex example application * Only notify the event loop if stream buffer is at or above its trigger level * Reformat comments * Add event loop stream buffer example application * Add event loop multiple elements example application * Improve event loop flag names * Remove redundant signal handler as it is already handled by the event loop * Refactor Power service, improve ViewHolder * Use ViewHolder instead of ViewDispatcher in About app * Enable ViewDispatcher queue on construction, deprecate view_dispatcher_enable_queue() * Remove all invocations of view_dispatcher_enable_queue() * Remove app-scened-template * Remove missing library from target.json * Port Accessor app to ViewHolder * Make the linter happy * Add example_view_holder application, update ViewHolder docs * Add example_view_dispatcher application, update ViewDispatcher docs * Replace FuriSemaphore with FuriApiLock, remove workaround delay * Fix logical error * Fix another logical error * Use the sources directive to speed up compilation * Use constant define macro * Improve FuriEventLoop documentation * Improve FuriEventLoop documentation once more * Bump API Version * Gui: remove redundant checks from ViewDispatcher * Gui: remove dead ifs from ViewDispatcher Co-authored-by: Silent Co-authored-by: hedger Co-authored-by: あく --- .../debug/accessor/accessor_view_manager.cpp | 54 ++- .../debug/accessor/accessor_view_manager.h | 8 +- .../debug/battery_test_app/battery_test_app.c | 1 - .../debug/bt_debug_app/bt_debug_app.c | 1 - applications/debug/crash_test/crash_test.c | 1 - .../debug/display_test/display_test.c | 1 - .../event_loop_blink_test.c | 7 +- .../file_browser_test/file_browser_app.c | 2 - .../debug/lfrfid_debug/lfrfid_debug.c | 1 - applications/debug/locale_test/locale_test.c | 1 - .../debug/rpc_debug_app/rpc_debug_app.c | 1 - .../debug/subghz_test/subghz_test_app.c | 1 - .../text_box_view_test/text_box_view_test.c | 1 - applications/debug/uart_echo/uart_echo.c | 1 - .../unit_tests/tests/furi/furi_event_loop.c | 62 ++-- .../debug/unit_tests/tests/rpc/rpc_test.c | 47 ++- .../debug/unit_tests/unit_test_api_table_i.h | 10 +- applications/debug/usb_test/usb_test.c | 1 - .../example_ble_beacon/ble_beacon_app.c | 1 - .../example_event_loop/application.fam | 36 ++ .../example_event_loop_multi.c | 342 ++++++++++++++++++ .../example_event_loop_mutex.c | 140 +++++++ .../example_event_loop_stream_buffer.c | 131 +++++++ .../example_event_loop_timer.c | 87 +++++ .../example_view_dispatcher/application.fam | 8 + .../example_view_dispatcher.c | 173 +++++++++ .../example_view_holder/application.fam | 8 + .../example_view_holder/example_view_holder.c | 78 ++++ applications/main/archive/archive.c | 1 - applications/main/bad_usb/bad_usb_app.c | 2 - applications/main/gpio/gpio_app.c | 1 - applications/main/ibutton/ibutton.c | 1 - applications/main/infrared/infrared_app.c | 1 - applications/main/lfrfid/lfrfid.c | 1 - applications/main/nfc/nfc_app.c | 1 - applications/main/subghz/subghz.c | 1 - applications/main/u2f/u2f_app.c | 1 - applications/services/desktop/desktop.c | 1 - .../dialogs/dialogs_module_file_browser.c | 3 +- .../services/dialogs/dialogs_module_message.c | 3 +- applications/services/dolphin/dolphin.c | 6 +- applications/services/gui/view_dispatcher.c | 89 ++--- applications/services/gui/view_dispatcher.h | 31 +- applications/services/gui/view_dispatcher_i.h | 4 +- applications/services/gui/view_holder.c | 65 ++-- applications/services/gui/view_holder.h | 52 ++- .../services/loader/loader_applications.c | 5 +- applications/services/loader/loader_menu.c | 2 - applications/services/power/power_cli.c | 6 +- .../services/power/power_service/power.c | 294 +++++++++------ .../services/power/power_service/power.h | 5 +- .../services/power/power_service/power_api.c | 78 ++-- .../services/power/power_service/power_i.h | 46 ++- applications/services/rpc/rpc_system.c | 13 +- applications/services/storage/storage_cli.c | 5 +- applications/settings/about/about.c | 23 +- .../bt_settings_app/bt_settings_app.c | 1 - .../desktop_settings/desktop_settings_app.c | 1 - .../expansion_settings_app.c | 1 - .../notification_settings_app.c | 1 - .../power_settings_app/power_settings_app.c | 1 - .../power_settings_scene_reboot_confirm.c | 6 +- .../storage_settings_scene_factory_reset.c | 4 +- .../storage_settings/storage_settings.c | 1 - .../settings/system/system_settings.c | 1 - applications/system/hid_app/hid.c | 1 - applications/system/js_app/js_app.c | 1 - .../system/js_app/modules/js_submenu.c | 3 +- .../system/js_app/modules/js_textbox.c | 9 +- applications/system/updater/updater.c | 2 - furi/core/event_loop.c | 287 ++++++++++----- furi/core/event_loop.h | 166 ++++++++- furi/core/event_loop_i.h | 11 +- furi/core/event_loop_link_i.h | 7 +- furi/core/message_queue.c | 12 +- furi/core/message_queue_i.h | 6 - furi/core/mutex.c | 42 ++- furi/core/semaphore.c | 67 +++- furi/core/semaphore.h | 8 + furi/core/stream_buffer.c | 65 +++- lib/SConscript | 1 - lib/app-scened-template/generic_scene.hpp | 10 - lib/app-scened-template/record_controller.hpp | 47 --- lib/app-scened-template/scene_controller.hpp | 246 ------------- lib/app-scened-template/text_store.cpp | 18 - lib/app-scened-template/text_store.h | 12 - lib/app-scened-template/typeindex_no_rtti.hpp | 129 ------- lib/app-scened-template/view_controller.hpp | 170 --------- .../view_modules/byte_input_vm.cpp | 32 -- .../view_modules/byte_input_vm.h | 37 -- .../view_modules/dialog_ex_vm.cpp | 61 ---- .../view_modules/dialog_ex_vm.h | 73 ---- .../view_modules/generic_view_module.h | 10 - .../view_modules/popup_vm.cpp | 56 --- .../view_modules/popup_vm.h | 68 ---- .../view_modules/submenu_vm.cpp | 33 -- .../view_modules/submenu_vm.h | 42 --- .../view_modules/text_input_vm.cpp | 39 -- .../view_modules/text_input_vm.h | 41 --- lib/appframe.scons | 29 -- lib/toolbox/api_lock.h | 4 + targets/f18/api_symbols.csv | 16 +- targets/f18/target.json | 1 - targets/f7/api_symbols.csv | 16 +- targets/f7/target.json | 1 - 105 files changed, 2096 insertions(+), 1746 deletions(-) create mode 100644 applications/examples/example_event_loop/application.fam create mode 100644 applications/examples/example_event_loop/example_event_loop_multi.c create mode 100644 applications/examples/example_event_loop/example_event_loop_mutex.c create mode 100644 applications/examples/example_event_loop/example_event_loop_stream_buffer.c create mode 100644 applications/examples/example_event_loop/example_event_loop_timer.c create mode 100644 applications/examples/example_view_dispatcher/application.fam create mode 100644 applications/examples/example_view_dispatcher/example_view_dispatcher.c create mode 100644 applications/examples/example_view_holder/application.fam create mode 100644 applications/examples/example_view_holder/example_view_holder.c delete mode 100644 furi/core/message_queue_i.h delete mode 100644 lib/app-scened-template/generic_scene.hpp delete mode 100644 lib/app-scened-template/record_controller.hpp delete mode 100644 lib/app-scened-template/scene_controller.hpp delete mode 100644 lib/app-scened-template/text_store.cpp delete mode 100644 lib/app-scened-template/text_store.h delete mode 100644 lib/app-scened-template/typeindex_no_rtti.hpp delete mode 100644 lib/app-scened-template/view_controller.hpp delete mode 100644 lib/app-scened-template/view_modules/byte_input_vm.cpp delete mode 100644 lib/app-scened-template/view_modules/byte_input_vm.h delete mode 100644 lib/app-scened-template/view_modules/dialog_ex_vm.cpp delete mode 100644 lib/app-scened-template/view_modules/dialog_ex_vm.h delete mode 100644 lib/app-scened-template/view_modules/generic_view_module.h delete mode 100644 lib/app-scened-template/view_modules/popup_vm.cpp delete mode 100644 lib/app-scened-template/view_modules/popup_vm.h delete mode 100644 lib/app-scened-template/view_modules/submenu_vm.cpp delete mode 100644 lib/app-scened-template/view_modules/submenu_vm.h delete mode 100644 lib/app-scened-template/view_modules/text_input_vm.cpp delete mode 100644 lib/app-scened-template/view_modules/text_input_vm.h delete mode 100644 lib/appframe.scons diff --git a/applications/debug/accessor/accessor_view_manager.cpp b/applications/debug/accessor/accessor_view_manager.cpp index 955c0b2867..aeb90c2974 100644 --- a/applications/debug/accessor/accessor_view_manager.cpp +++ b/applications/debug/accessor/accessor_view_manager.cpp @@ -5,45 +5,49 @@ AccessorAppViewManager::AccessorAppViewManager() { event_queue = furi_message_queue_alloc(10, sizeof(AccessorEvent)); - view_dispatcher = view_dispatcher_alloc(); - auto callback = cbc::obtain_connector(this, &AccessorAppViewManager::previous_view_callback); + view_holder = view_holder_alloc(); + auto callback = + cbc::obtain_connector(this, &AccessorAppViewManager::view_holder_back_callback); // allocate views submenu = submenu_alloc(); - add_view(ViewType::Submenu, submenu_get_view(submenu)); - popup = popup_alloc(); - add_view(ViewType::Popup, popup_get_view(popup)); - gui = static_cast(furi_record_open(RECORD_GUI)); - view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen); + // set back callback + view_holder_set_back_callback(view_holder, callback, NULL); - // set previous view callback for all views - view_set_previous_callback(submenu_get_view(submenu), callback); - view_set_previous_callback(popup_get_view(popup), callback); + gui = static_cast(furi_record_open(RECORD_GUI)); + view_holder_attach_to_gui(view_holder, gui); } AccessorAppViewManager::~AccessorAppViewManager() { - // remove views - view_dispatcher_remove_view( - view_dispatcher, static_cast(AccessorAppViewManager::ViewType::Submenu)); - view_dispatcher_remove_view( - view_dispatcher, static_cast(AccessorAppViewManager::ViewType::Popup)); - + // remove current view + view_holder_set_view(view_holder, NULL); // free view modules furi_record_close(RECORD_GUI); submenu_free(submenu); popup_free(popup); - - // free dispatcher - view_dispatcher_free(view_dispatcher); - + // free view holder + view_holder_free(view_holder); // free event queue furi_message_queue_free(event_queue); } void AccessorAppViewManager::switch_to(ViewType type) { - view_dispatcher_switch_to_view(view_dispatcher, static_cast(type)); + View* view; + + switch(type) { + case ViewType::Submenu: + view = submenu_get_view(submenu); + break; + case ViewType::Popup: + view = popup_get_view(popup); + break; + default: + furi_crash(); + } + + view_holder_set_view(view_holder, view); } Submenu* AccessorAppViewManager::get_submenu() { @@ -65,16 +69,10 @@ void AccessorAppViewManager::send_event(AccessorEvent* event) { furi_check(result == FuriStatusOk); } -uint32_t AccessorAppViewManager::previous_view_callback(void*) { +void AccessorAppViewManager::view_holder_back_callback(void*) { if(event_queue != NULL) { AccessorEvent event; event.type = AccessorEvent::Type::Back; send_event(&event); } - - return VIEW_IGNORE; -} - -void AccessorAppViewManager::add_view(ViewType view_type, View* view) { - view_dispatcher_add_view(view_dispatcher, static_cast(view_type), view); } diff --git a/applications/debug/accessor/accessor_view_manager.h b/applications/debug/accessor/accessor_view_manager.h index 66e54e41ce..c0a12cbe8e 100644 --- a/applications/debug/accessor/accessor_view_manager.h +++ b/applications/debug/accessor/accessor_view_manager.h @@ -1,6 +1,6 @@ #pragma once #include -#include +#include #include #include #include "accessor_event.h" @@ -10,7 +10,6 @@ class AccessorAppViewManager { enum class ViewType : uint8_t { Submenu, Popup, - Tune, }; FuriMessageQueue* event_queue; @@ -27,11 +26,10 @@ class AccessorAppViewManager { Popup* get_popup(void); private: - ViewDispatcher* view_dispatcher; Gui* gui; + ViewHolder* view_holder; - uint32_t previous_view_callback(void* context); - void add_view(ViewType view_type, View* view); + void view_holder_back_callback(void* context); // view elements Submenu* submenu; diff --git a/applications/debug/battery_test_app/battery_test_app.c b/applications/debug/battery_test_app/battery_test_app.c index 5f9934e777..363c8f4d52 100644 --- a/applications/debug/battery_test_app/battery_test_app.c +++ b/applications/debug/battery_test_app/battery_test_app.c @@ -42,7 +42,6 @@ BatteryTestApp* battery_test_alloc(void) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_tick_event_callback( app->view_dispatcher, battery_test_battery_info_update_model, 500); diff --git a/applications/debug/bt_debug_app/bt_debug_app.c b/applications/debug/bt_debug_app/bt_debug_app.c index 109feee602..56c67e3e66 100644 --- a/applications/debug/bt_debug_app/bt_debug_app.c +++ b/applications/debug/bt_debug_app/bt_debug_app.c @@ -36,7 +36,6 @@ BtDebugApp* bt_debug_app_alloc(void) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views diff --git a/applications/debug/crash_test/crash_test.c b/applications/debug/crash_test/crash_test.c index ae0074fe1c..2b2be13d62 100644 --- a/applications/debug/crash_test/crash_test.c +++ b/applications/debug/crash_test/crash_test.c @@ -66,7 +66,6 @@ CrashTest* crash_test_alloc(void) { instance->gui = furi_record_open(RECORD_GUI); instance->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(instance->view_dispatcher); view_dispatcher_attach_to_gui( instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen); diff --git a/applications/debug/display_test/display_test.c b/applications/debug/display_test/display_test.c index 3028a13b90..3b742906d6 100644 --- a/applications/debug/display_test/display_test.c +++ b/applications/debug/display_test/display_test.c @@ -126,7 +126,6 @@ DisplayTest* display_test_alloc(void) { instance->gui = furi_record_open(RECORD_GUI); instance->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(instance->view_dispatcher); view_dispatcher_attach_to_gui( instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen); diff --git a/applications/debug/event_loop_blink_test/event_loop_blink_test.c b/applications/debug/event_loop_blink_test/event_loop_blink_test.c index 5c7e0ce558..7f00e63f2e 100644 --- a/applications/debug/event_loop_blink_test/event_loop_blink_test.c +++ b/applications/debug/event_loop_blink_test/event_loop_blink_test.c @@ -82,7 +82,8 @@ static void view_port_input_callback(InputEvent* input_event, void* context) { furi_message_queue_put(app->input_queue, input_event, 0); } -static bool input_queue_callback(FuriMessageQueue* queue, void* context) { +static bool input_queue_callback(FuriEventLoopObject* object, void* context) { + FuriMessageQueue* queue = object; EventLoopBlinkTestApp* app = context; InputEvent event; @@ -144,7 +145,7 @@ int32_t event_loop_blink_test_app(void* arg) { gui_add_view_port(gui, view_port, GuiLayerFullscreen); furi_event_loop_tick_set(app.event_loop, 500, event_loop_tick_callback, &app); - furi_event_loop_message_queue_subscribe( + furi_event_loop_subscribe_message_queue( app.event_loop, app.input_queue, FuriEventLoopEventIn, input_queue_callback, &app); furi_event_loop_run(app.event_loop); @@ -154,7 +155,7 @@ int32_t event_loop_blink_test_app(void* arg) { furi_record_close(RECORD_GUI); - furi_event_loop_message_queue_unsubscribe(app.event_loop, app.input_queue); + furi_event_loop_unsubscribe(app.event_loop, app.input_queue); furi_message_queue_free(app.input_queue); for(size_t i = 0; i < TIMER_COUNT; ++i) { diff --git a/applications/debug/file_browser_test/file_browser_app.c b/applications/debug/file_browser_test/file_browser_app.c index c3e7c898bf..a502a8a90b 100644 --- a/applications/debug/file_browser_test/file_browser_app.c +++ b/applications/debug/file_browser_test/file_browser_app.c @@ -33,8 +33,6 @@ FileBrowserApp* file_browser_app_alloc(char* arg) { app->dialogs = furi_record_open(RECORD_DIALOGS); app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); - app->scene_manager = scene_manager_alloc(&file_browser_scene_handlers, app); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); diff --git a/applications/debug/lfrfid_debug/lfrfid_debug.c b/applications/debug/lfrfid_debug/lfrfid_debug.c index 13c0b299fa..962afd1c30 100644 --- a/applications/debug/lfrfid_debug/lfrfid_debug.c +++ b/applications/debug/lfrfid_debug/lfrfid_debug.c @@ -17,7 +17,6 @@ static LfRfidDebug* lfrfid_debug_alloc(void) { app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&lfrfid_debug_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( app->view_dispatcher, lfrfid_debug_custom_event_callback); diff --git a/applications/debug/locale_test/locale_test.c b/applications/debug/locale_test/locale_test.c index 1ca077db1f..51d45a6b05 100644 --- a/applications/debug/locale_test/locale_test.c +++ b/applications/debug/locale_test/locale_test.c @@ -61,7 +61,6 @@ static LocaleTestApp* locale_test_alloc(void) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views diff --git a/applications/debug/rpc_debug_app/rpc_debug_app.c b/applications/debug/rpc_debug_app/rpc_debug_app.c index 5e53c221e1..1536b8918e 100644 --- a/applications/debug/rpc_debug_app/rpc_debug_app.c +++ b/applications/debug/rpc_debug_app/rpc_debug_app.c @@ -99,7 +99,6 @@ static RpcDebugApp* rpc_debug_app_alloc(void) { view_dispatcher_set_tick_event_callback( app->view_dispatcher, rpc_debug_app_tick_event_callback, 100); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); - view_dispatcher_enable_queue(app->view_dispatcher); app->widget = widget_alloc(); view_dispatcher_add_view( diff --git a/applications/debug/subghz_test/subghz_test_app.c b/applications/debug/subghz_test/subghz_test_app.c index 6eba864f6e..dccdac213d 100644 --- a/applications/debug/subghz_test/subghz_test_app.c +++ b/applications/debug/subghz_test/subghz_test_app.c @@ -30,7 +30,6 @@ SubGhzTestApp* subghz_test_app_alloc(void) { // View Dispatcher app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&subghz_test_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( diff --git a/applications/debug/text_box_view_test/text_box_view_test.c b/applications/debug/text_box_view_test/text_box_view_test.c index 7bbcb285b8..4d63e37793 100644 --- a/applications/debug/text_box_view_test/text_box_view_test.c +++ b/applications/debug/text_box_view_test/text_box_view_test.c @@ -126,7 +126,6 @@ int32_t text_box_view_test_app(void* p) { Gui* gui = furi_record_open(RECORD_GUI); ViewDispatcher* view_dispatcher = view_dispatcher_alloc(); view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen); - view_dispatcher_enable_queue(view_dispatcher); TextBoxViewTest instance = { .text_box = text_box_alloc(), diff --git a/applications/debug/uart_echo/uart_echo.c b/applications/debug/uart_echo/uart_echo.c index 595a13ac5e..be807168ae 100644 --- a/applications/debug/uart_echo/uart_echo.c +++ b/applications/debug/uart_echo/uart_echo.c @@ -242,7 +242,6 @@ static UartEchoApp* uart_echo_app_alloc(uint32_t baudrate) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views diff --git a/applications/debug/unit_tests/tests/furi/furi_event_loop.c b/applications/debug/unit_tests/tests/furi/furi_event_loop.c index 4eeecb2b83..291181c77f 100644 --- a/applications/debug/unit_tests/tests/furi/furi_event_loop.c +++ b/applications/debug/unit_tests/tests/furi/furi_event_loop.c @@ -19,25 +19,24 @@ typedef struct { uint32_t consumer_counter; } TestFuriData; -bool test_furi_event_loop_producer_mq_callback(FuriMessageQueue* queue, void* context) { +bool test_furi_event_loop_producer_mq_callback(FuriEventLoopObject* object, void* context) { furi_check(context); TestFuriData* data = context; - furi_check(data->mq == queue, "Invalid queue"); + furi_check(data->mq == object, "Invalid queue"); FURI_LOG_I( TAG, "producer_mq_callback: %lu %lu", data->producer_counter, data->consumer_counter); - // Remove and add should not cause crash - // if(data->producer_counter == EVENT_LOOP_EVENT_COUNT/2) { - // furi_event_loop_message_queue_remove(data->producer_event_loop, data->mq); - // furi_event_loop_message_queue_add( - // data->producer_event_loop, - // data->mq, - // FuriEventLoopEventOut, - // test_furi_event_loop_producer_mq_callback, - // data); - // } + if(data->producer_counter == EVENT_LOOP_EVENT_COUNT / 2) { + furi_event_loop_unsubscribe(data->producer_event_loop, data->mq); + furi_event_loop_subscribe_message_queue( + data->producer_event_loop, + data->mq, + FuriEventLoopEventOut, + test_furi_event_loop_producer_mq_callback, + data); + } if(data->producer_counter == EVENT_LOOP_EVENT_COUNT) { furi_event_loop_stop(data->producer_event_loop); @@ -61,7 +60,7 @@ int32_t test_furi_event_loop_producer(void* p) { FURI_LOG_I(TAG, "producer start 1st run"); data->producer_event_loop = furi_event_loop_alloc(); - furi_event_loop_message_queue_subscribe( + furi_event_loop_subscribe_message_queue( data->producer_event_loop, data->mq, FuriEventLoopEventOut, @@ -73,7 +72,7 @@ int32_t test_furi_event_loop_producer(void* p) { // 2 EventLoop index, 0xFFFFFFFF - all possible flags, emulate uncleared flags xTaskNotifyIndexed(xTaskGetCurrentTaskHandle(), 2, 0xFFFFFFFF, eSetBits); - furi_event_loop_message_queue_unsubscribe(data->producer_event_loop, data->mq); + furi_event_loop_unsubscribe(data->producer_event_loop, data->mq); furi_event_loop_free(data->producer_event_loop); FURI_LOG_I(TAG, "producer start 2nd run"); @@ -81,7 +80,7 @@ int32_t test_furi_event_loop_producer(void* p) { data->producer_counter = 0; data->producer_event_loop = furi_event_loop_alloc(); - furi_event_loop_message_queue_subscribe( + furi_event_loop_subscribe_message_queue( data->producer_event_loop, data->mq, FuriEventLoopEventOut, @@ -90,7 +89,7 @@ int32_t test_furi_event_loop_producer(void* p) { furi_event_loop_run(data->producer_event_loop); - furi_event_loop_message_queue_unsubscribe(data->producer_event_loop, data->mq); + furi_event_loop_unsubscribe(data->producer_event_loop, data->mq); furi_event_loop_free(data->producer_event_loop); FURI_LOG_I(TAG, "producer end"); @@ -98,11 +97,11 @@ int32_t test_furi_event_loop_producer(void* p) { return 0; } -bool test_furi_event_loop_consumer_mq_callback(FuriMessageQueue* queue, void* context) { +bool test_furi_event_loop_consumer_mq_callback(FuriEventLoopObject* object, void* context) { furi_check(context); TestFuriData* data = context; - furi_check(data->mq == queue); + furi_check(data->mq == object); furi_delay_us(furi_hal_random_get() % 1000); furi_check(furi_message_queue_get(data->mq, &data->consumer_counter, 0) == FuriStatusOk); @@ -110,16 +109,15 @@ bool test_furi_event_loop_consumer_mq_callback(FuriMessageQueue* queue, void* co FURI_LOG_I( TAG, "consumer_mq_callback: %lu %lu", data->producer_counter, data->consumer_counter); - // Remove and add should not cause crash - // if(data->producer_counter == EVENT_LOOP_EVENT_COUNT/2) { - // furi_event_loop_message_queue_remove(data->consumer_event_loop, data->mq); - // furi_event_loop_message_queue_add( - // data->consumer_event_loop, - // data->mq, - // FuriEventLoopEventIn, - // test_furi_event_loop_producer_mq_callback, - // data); - // } + if(data->consumer_counter == EVENT_LOOP_EVENT_COUNT / 2) { + furi_event_loop_unsubscribe(data->consumer_event_loop, data->mq); + furi_event_loop_subscribe_message_queue( + data->consumer_event_loop, + data->mq, + FuriEventLoopEventIn, + test_furi_event_loop_consumer_mq_callback, + data); + } if(data->consumer_counter == EVENT_LOOP_EVENT_COUNT) { furi_event_loop_stop(data->consumer_event_loop); @@ -137,7 +135,7 @@ int32_t test_furi_event_loop_consumer(void* p) { FURI_LOG_I(TAG, "consumer start 1st run"); data->consumer_event_loop = furi_event_loop_alloc(); - furi_event_loop_message_queue_subscribe( + furi_event_loop_subscribe_message_queue( data->consumer_event_loop, data->mq, FuriEventLoopEventIn, @@ -149,14 +147,14 @@ int32_t test_furi_event_loop_consumer(void* p) { // 2 EventLoop index, 0xFFFFFFFF - all possible flags, emulate uncleared flags xTaskNotifyIndexed(xTaskGetCurrentTaskHandle(), 2, 0xFFFFFFFF, eSetBits); - furi_event_loop_message_queue_unsubscribe(data->consumer_event_loop, data->mq); + furi_event_loop_unsubscribe(data->consumer_event_loop, data->mq); furi_event_loop_free(data->consumer_event_loop); FURI_LOG_I(TAG, "consumer start 2nd run"); data->consumer_counter = 0; data->consumer_event_loop = furi_event_loop_alloc(); - furi_event_loop_message_queue_subscribe( + furi_event_loop_subscribe_message_queue( data->consumer_event_loop, data->mq, FuriEventLoopEventIn, @@ -165,7 +163,7 @@ int32_t test_furi_event_loop_consumer(void* p) { furi_event_loop_run(data->consumer_event_loop); - furi_event_loop_message_queue_unsubscribe(data->consumer_event_loop, data->mq); + furi_event_loop_unsubscribe(data->consumer_event_loop, data->mq); furi_event_loop_free(data->consumer_event_loop); FURI_LOG_I(TAG, "consumer end"); diff --git a/applications/debug/unit_tests/tests/rpc/rpc_test.c b/applications/debug/unit_tests/tests/rpc/rpc_test.c index 63ea706ed6..5d26bdb306 100644 --- a/applications/debug/unit_tests/tests/rpc/rpc_test.c +++ b/applications/debug/unit_tests/tests/rpc/rpc_test.c @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -35,8 +36,8 @@ static uint32_t command_id = 0; typedef struct { RpcSession* session; FuriStreamBuffer* output_stream; - FuriSemaphore* close_session_semaphore; - FuriSemaphore* terminate_semaphore; + FuriApiLock session_close_lock; + FuriApiLock session_terminate_lock; uint32_t timeout; } RpcSessionContext; @@ -92,8 +93,8 @@ static void test_rpc_setup(void) { rpc_session[0].output_stream = furi_stream_buffer_alloc(4096, 1); rpc_session_set_send_bytes_callback(rpc_session[0].session, output_bytes_callback); - rpc_session[0].close_session_semaphore = furi_semaphore_alloc(1, 0); - rpc_session[0].terminate_semaphore = furi_semaphore_alloc(1, 0); + rpc_session[0].session_close_lock = api_lock_alloc_locked(); + rpc_session[0].session_terminate_lock = api_lock_alloc_locked(); rpc_session_set_close_callback(rpc_session[0].session, test_rpc_session_close_callback); rpc_session_set_terminated_callback( rpc_session[0].session, test_rpc_session_terminated_callback); @@ -112,8 +113,8 @@ static void test_rpc_setup_second_session(void) { rpc_session[1].output_stream = furi_stream_buffer_alloc(1000, 1); rpc_session_set_send_bytes_callback(rpc_session[1].session, output_bytes_callback); - rpc_session[1].close_session_semaphore = furi_semaphore_alloc(1, 0); - rpc_session[1].terminate_semaphore = furi_semaphore_alloc(1, 0); + rpc_session[1].session_close_lock = api_lock_alloc_locked(); + rpc_session[1].session_terminate_lock = api_lock_alloc_locked(); rpc_session_set_close_callback(rpc_session[1].session, test_rpc_session_close_callback); rpc_session_set_terminated_callback( rpc_session[1].session, test_rpc_session_terminated_callback); @@ -121,36 +122,32 @@ static void test_rpc_setup_second_session(void) { } static void test_rpc_teardown(void) { - furi_check(rpc_session[0].close_session_semaphore); - furi_semaphore_acquire(rpc_session[0].terminate_semaphore, 0); + furi_check(rpc_session[0].session_close_lock); + api_lock_relock(rpc_session[0].session_terminate_lock); rpc_session_close(rpc_session[0].session); - furi_check( - furi_semaphore_acquire(rpc_session[0].terminate_semaphore, FuriWaitForever) == - FuriStatusOk); + api_lock_wait_unlock(rpc_session[0].session_terminate_lock); furi_record_close(RECORD_RPC); furi_stream_buffer_free(rpc_session[0].output_stream); - furi_semaphore_free(rpc_session[0].close_session_semaphore); - furi_semaphore_free(rpc_session[0].terminate_semaphore); + api_lock_free(rpc_session[0].session_close_lock); + api_lock_free(rpc_session[0].session_terminate_lock); ++command_id; rpc_session[0].output_stream = NULL; - rpc_session[0].close_session_semaphore = NULL; + rpc_session[0].session_close_lock = NULL; rpc = NULL; rpc_session[0].session = NULL; } static void test_rpc_teardown_second_session(void) { - furi_check(rpc_session[1].close_session_semaphore); - furi_semaphore_acquire(rpc_session[1].terminate_semaphore, 0); + furi_check(rpc_session[1].session_close_lock); + api_lock_relock(rpc_session[1].session_terminate_lock); rpc_session_close(rpc_session[1].session); - furi_check( - furi_semaphore_acquire(rpc_session[1].terminate_semaphore, FuriWaitForever) == - FuriStatusOk); + api_lock_wait_unlock(rpc_session[1].session_terminate_lock); furi_stream_buffer_free(rpc_session[1].output_stream); - furi_semaphore_free(rpc_session[1].close_session_semaphore); - furi_semaphore_free(rpc_session[1].terminate_semaphore); + api_lock_free(rpc_session[1].session_close_lock); + api_lock_free(rpc_session[1].session_terminate_lock); ++command_id; rpc_session[1].output_stream = NULL; - rpc_session[1].close_session_semaphore = NULL; + rpc_session[1].session_close_lock = NULL; rpc_session[1].session = NULL; } @@ -204,14 +201,14 @@ static void test_rpc_session_close_callback(void* context) { furi_check(context); RpcSessionContext* callbacks_context = context; - furi_check(furi_semaphore_release(callbacks_context->close_session_semaphore) == FuriStatusOk); + api_lock_unlock(callbacks_context->session_close_lock); } static void test_rpc_session_terminated_callback(void* context) { furi_check(context); RpcSessionContext* callbacks_context = context; - furi_check(furi_semaphore_release(callbacks_context->terminate_semaphore) == FuriStatusOk); + api_lock_unlock(callbacks_context->session_terminate_lock); } static void test_rpc_print_message_list(MsgList_t msg_list) { @@ -1645,7 +1642,7 @@ static void test_rpc_feed_rubbish_run( test_rpc_add_empty_to_list(expected, PB_CommandStatus_ERROR_DECODE, 0); - furi_check(furi_semaphore_acquire(rpc_session[0].close_session_semaphore, 0) != FuriStatusOk); + furi_check(api_lock_is_locked(rpc_session[0].session_close_lock)); test_rpc_encode_and_feed(input_before, 0); test_send_rubbish(rpc_session[0].session, pattern, pattern_size, size); test_rpc_encode_and_feed(input_after, 0); diff --git a/applications/debug/unit_tests/unit_test_api_table_i.h b/applications/debug/unit_tests/unit_test_api_table_i.h index 1adec4db26..50524e5b7d 100644 --- a/applications/debug/unit_tests/unit_test_api_table_i.h +++ b/applications/debug/unit_tests/unit_test_api_table_i.h @@ -36,14 +36,10 @@ static constexpr auto unit_tests_api_table = sort(create_array_t( API_METHOD(furi_event_loop_alloc, FuriEventLoop*, (void)), API_METHOD(furi_event_loop_free, void, (FuriEventLoop*)), API_METHOD( - furi_event_loop_message_queue_subscribe, + furi_event_loop_subscribe_message_queue, void, - (FuriEventLoop*, - FuriMessageQueue*, - FuriEventLoopEvent, - FuriEventLoopMessageQueueCallback, - void*)), - API_METHOD(furi_event_loop_message_queue_unsubscribe, void, (FuriEventLoop*, FuriMessageQueue*)), + (FuriEventLoop*, FuriMessageQueue*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*)), + API_METHOD(furi_event_loop_unsubscribe, void, (FuriEventLoop*, FuriEventLoopObject*)), API_METHOD(furi_event_loop_run, void, (FuriEventLoop*)), API_METHOD(furi_event_loop_stop, void, (FuriEventLoop*)), API_VARIABLE(PB_Main_msg, PB_Main_msg_t))); diff --git a/applications/debug/usb_test/usb_test.c b/applications/debug/usb_test/usb_test.c index ddec9d9b05..a71ac3c6e4 100644 --- a/applications/debug/usb_test/usb_test.c +++ b/applications/debug/usb_test/usb_test.c @@ -63,7 +63,6 @@ UsbTestApp* usb_test_app_alloc(void) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views diff --git a/applications/examples/example_ble_beacon/ble_beacon_app.c b/applications/examples/example_ble_beacon/ble_beacon_app.c index faa3feb915..16979543c8 100644 --- a/applications/examples/example_ble_beacon/ble_beacon_app.c +++ b/applications/examples/example_ble_beacon/ble_beacon_app.c @@ -75,7 +75,6 @@ static BleBeaconApp* ble_beacon_app_alloc(void) { view_dispatcher_set_tick_event_callback( app->view_dispatcher, ble_beacon_app_tick_event_callback, 100); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); - view_dispatcher_enable_queue(app->view_dispatcher); app->submenu = submenu_alloc(); view_dispatcher_add_view( diff --git a/applications/examples/example_event_loop/application.fam b/applications/examples/example_event_loop/application.fam new file mode 100644 index 0000000000..a37ffb1a04 --- /dev/null +++ b/applications/examples/example_event_loop/application.fam @@ -0,0 +1,36 @@ +App( + appid="example_event_loop_timer", + name="Example: Event Loop Timer", + apptype=FlipperAppType.EXTERNAL, + sources=["example_event_loop_timer.c"], + entry_point="example_event_loop_timer_app", + fap_category="Examples", +) + +App( + appid="example_event_loop_mutex", + name="Example: Event Loop Mutex", + apptype=FlipperAppType.EXTERNAL, + sources=["example_event_loop_mutex.c"], + entry_point="example_event_loop_mutex_app", + fap_category="Examples", +) + +App( + appid="example_event_loop_stream_buffer", + name="Example: Event Loop Stream Buffer", + apptype=FlipperAppType.EXTERNAL, + sources=["example_event_loop_stream_buffer.c"], + entry_point="example_event_loop_stream_buffer_app", + fap_category="Examples", +) + +App( + appid="example_event_loop_multi", + name="Example: Event Loop Multi", + apptype=FlipperAppType.EXTERNAL, + sources=["example_event_loop_multi.c"], + entry_point="example_event_loop_multi_app", + requires=["gui"], + fap_category="Examples", +) diff --git a/applications/examples/example_event_loop/example_event_loop_multi.c b/applications/examples/example_event_loop/example_event_loop_multi.c new file mode 100644 index 0000000000..ebfb009118 --- /dev/null +++ b/applications/examples/example_event_loop/example_event_loop_multi.c @@ -0,0 +1,342 @@ +/** + * @file example_event_loop_multi.c + * @brief Example application that demonstrates multiple primitives used with two FuriEventLoop instances. + * + * This application simulates a complex use case of having two concurrent event loops (each one executing in + * its own thread) using a stream buffer for communication and additional timers and message passing to handle + * the keypad input. Additionally, it shows how to use thread signals to stop an event loop in another thread. + * The GUI functionality is there only for the purpose of exclusive access to the input events. + * + * The application's functionality consists of the following: + * - Print keypad key names and types when pressed, + * - If the Back key is long-pressed, a countdown starts upon completion of which the app exits, + * - The countdown can be cancelled by long-pressing the Ok button, it also resets the counter, + * - Blocks of random data are periodically generated in a separate thread, + * - When ready, the main application thread gets notified and prints the data. + */ + +#include +#include +#include + +#include + +#define TAG "ExampleEventLoopMulti" + +#define COUNTDOWN_START_VALUE (5UL) +#define COUNTDOWN_INTERVAL_MS (1000UL) +#define WORKER_DATA_INTERVAL_MS (1500UL) + +#define INPUT_QUEUE_SIZE (8) +#define STREAM_BUFFER_SIZE (16) + +typedef struct { + FuriEventLoop* event_loop; + FuriEventLoopTimer* timer; + FuriStreamBuffer* stream_buffer; +} EventLoopMultiAppWorker; + +typedef struct { + Gui* gui; + ViewPort* view_port; + FuriThread* worker_thread; + FuriEventLoop* event_loop; + FuriMessageQueue* input_queue; + FuriEventLoopTimer* exit_timer; + FuriStreamBuffer* stream_buffer; + uint32_t exit_countdown_value; +} EventLoopMultiApp; + +/* + * Worker functions + */ + +// This function is executed each time the data is taken out of the stream buffer. It is used to restart the worker timer. +static bool + event_loop_multi_app_stream_buffer_worker_callback(FuriEventLoopObject* object, void* context) { + furi_assert(context); + EventLoopMultiAppWorker* worker = context; + + furi_assert(object == worker->stream_buffer); + + FURI_LOG_I(TAG, "Data was removed from buffer"); + // Restart the timer to generate another block of random data. + furi_event_loop_timer_start(worker->timer, WORKER_DATA_INTERVAL_MS); + + return true; +} + +// This function is executed when the worker timer expires. The timer will NOT restart automatically +// since it is of one-shot type. +static void event_loop_multi_app_worker_timer_callback(void* context) { + furi_assert(context); + EventLoopMultiAppWorker* worker = context; + + // Generate a block of random data. + uint8_t data[STREAM_BUFFER_SIZE]; + furi_hal_random_fill_buf(data, sizeof(data)); + // Put the generated data in the stream buffer. + // IMPORTANT: No waiting in the event handlers! + furi_check( + furi_stream_buffer_send(worker->stream_buffer, &data, sizeof(data), 0) == sizeof(data)); +} + +static EventLoopMultiAppWorker* + event_loop_multi_app_worker_alloc(FuriStreamBuffer* stream_buffer) { + EventLoopMultiAppWorker* worker = malloc(sizeof(EventLoopMultiAppWorker)); + // Create the worker event loop. + worker->event_loop = furi_event_loop_alloc(); + // Create the timer governing the data generation. + // It is of one-shot type, i.e. it will not restart automatically upon expiration. + worker->timer = furi_event_loop_timer_alloc( + worker->event_loop, + event_loop_multi_app_worker_timer_callback, + FuriEventLoopTimerTypeOnce, + worker); + + // Using the same stream buffer as the main thread (it was already created beforehand). + worker->stream_buffer = stream_buffer; + // Notify the worker event loop about data being taken out of the stream buffer. + furi_event_loop_subscribe_stream_buffer( + worker->event_loop, + worker->stream_buffer, + FuriEventLoopEventOut | FuriEventLoopEventFlagEdge, + event_loop_multi_app_stream_buffer_worker_callback, + worker); + + return worker; +} + +static void event_loop_multi_app_worker_free(EventLoopMultiAppWorker* worker) { + // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. + // Failure to do so will result in a crash. + furi_event_loop_unsubscribe(worker->event_loop, worker->stream_buffer); + // IMPORTANT: All timers MUST be deleted before deleting the associated event loop. + // Failure to do so will result in a crash. + furi_event_loop_timer_free(worker->timer); + // Now it is okay to delete the event loop. + furi_event_loop_free(worker->event_loop); + + free(worker); +} + +static void event_loop_multi_app_worker_run(EventLoopMultiAppWorker* worker) { + furi_event_loop_timer_start(worker->timer, WORKER_DATA_INTERVAL_MS); + furi_event_loop_run(worker->event_loop); +} + +// This function is the worker thread body and (obviously) is executed in the worker thread. +static int32_t event_loop_multi_app_worker_thread(void* context) { + furi_assert(context); + EventLoopMultiApp* app = context; + + // Because an event loop is used, it MUST be created in the thread it will be run in. + // Therefore, the worker creation and deletion is handled in the worker thread. + EventLoopMultiAppWorker* worker = event_loop_multi_app_worker_alloc(app->stream_buffer); + event_loop_multi_app_worker_run(worker); + event_loop_multi_app_worker_free(worker); + + return 0; +} + +/* + * Main application functions + */ + +// This function is executed in the GUI context each time an input event occurs (e.g. the user pressed a key) +static void event_loop_multi_app_input_callback(InputEvent* event, void* context) { + furi_assert(context); + EventLoopMultiApp* app = context; + // Pass the event to the the application's input queue + furi_check(furi_message_queue_put(app->input_queue, event, FuriWaitForever) == FuriStatusOk); +} + +// This function is executed each time new data is available in the stream buffer. +static bool + event_loop_multi_app_stream_buffer_callback(FuriEventLoopObject* object, void* context) { + furi_assert(context); + EventLoopMultiApp* app = context; + + furi_assert(object == app->stream_buffer); + // Get the data from the stream buffer + uint8_t data[STREAM_BUFFER_SIZE]; + // IMPORTANT: No waiting in the event handlers! + furi_check( + furi_stream_buffer_receive(app->stream_buffer, &data, sizeof(data), 0) == sizeof(data)); + + // Format the data for printing and print it to the debug output. + FuriString* tmp_str = furi_string_alloc(); + for(uint32_t i = 0; i < sizeof(data); ++i) { + furi_string_cat_printf(tmp_str, "%02X ", data[i]); + } + + FURI_LOG_I(TAG, "Received data: %s", furi_string_get_cstr(tmp_str)); + furi_string_free(tmp_str); + + return true; +} + +// This function is executed each time a new message is inserted in the input queue. +static bool event_loop_multi_app_input_queue_callback(FuriEventLoopObject* object, void* context) { + furi_assert(context); + EventLoopMultiApp* app = context; + + furi_assert(object == app->input_queue); + + InputEvent event; + // IMPORTANT: No waiting in the event handlers! + furi_check(furi_message_queue_get(app->input_queue, &event, 0) == FuriStatusOk); + + if(event.type == InputTypeLong) { + // The user has long-pressed the Back key, try starting the countdown. + if(event.key == InputKeyBack) { + if(!furi_event_loop_timer_is_running(app->exit_timer)) { + // Actually start the countdown + FURI_LOG_I(TAG, "Starting exit countdown!"); + furi_event_loop_timer_start(app->exit_timer, COUNTDOWN_INTERVAL_MS); + + } else { + // The countdown is already in progress, print a warning message + FURI_LOG_W(TAG, "Countdown has already been started"); + } + + // The user has long-pressed the Ok key, try stopping the countdown. + } else if(event.key == InputKeyOk) { + if(furi_event_loop_timer_is_running(app->exit_timer)) { + // Actually cancel the countdown + FURI_LOG_I(TAG, "Exit countdown cancelled!"); + app->exit_countdown_value = COUNTDOWN_START_VALUE; + furi_event_loop_timer_stop(app->exit_timer); + + } else { + // The countdown is not running, print a warning message + FURI_LOG_W(TAG, "Countdown has not been started yet"); + } + + } else { + // Not a Back or Ok key, just print its name. + FURI_LOG_I(TAG, "Long press: %s", input_get_key_name(event.key)); + } + + } else if(event.type == InputTypeShort) { + // Not a long press, just print the key's name. + FURI_LOG_I(TAG, "Short press: %s", input_get_key_name(event.key)); + } + + return true; +} + +// This function is executed each time the countdown timer expires. +static void event_loop_multi_app_exit_timer_callback(void* context) { + furi_assert(context); + EventLoopMultiApp* app = context; + + FURI_LOG_I(TAG, "Exiting in %lu ...", app->exit_countdown_value); + + // If the coundown value has reached 0, exit the application + if(app->exit_countdown_value == 0) { + FURI_LOG_I(TAG, "Exiting NOW!"); + + // Send a signal to the worker thread to exit. + // A signal handler that handles FuriSignalExit is already set by default. + furi_thread_signal(app->worker_thread, FuriSignalExit, NULL); + // Request the application event loop to stop. + furi_event_loop_stop(app->event_loop); + + // Otherwise just decrement it and wait for the next time the timer expires. + } else { + app->exit_countdown_value -= 1; + } +} + +static EventLoopMultiApp* event_loop_multi_app_alloc(void) { + EventLoopMultiApp* app = malloc(sizeof(EventLoopMultiApp)); + // Create event loop instances. + app->event_loop = furi_event_loop_alloc(); + + // Create a worker thread instance. The worker event loop will execute inside it. + app->worker_thread = furi_thread_alloc_ex( + "EventLoopMultiWorker", 1024, event_loop_multi_app_worker_thread, app); + // Create a message queue to receive the input events. + app->input_queue = furi_message_queue_alloc(INPUT_QUEUE_SIZE, sizeof(InputEvent)); + // Create a stream buffer to receive the generated data. + app->stream_buffer = furi_stream_buffer_alloc(STREAM_BUFFER_SIZE, STREAM_BUFFER_SIZE); + // Create a timer to run the countdown. + app->exit_timer = furi_event_loop_timer_alloc( + app->event_loop, + event_loop_multi_app_exit_timer_callback, + FuriEventLoopTimerTypePeriodic, + app); + + app->gui = furi_record_open(RECORD_GUI); + app->view_port = view_port_alloc(); + // Start the countdown from this value + app->exit_countdown_value = COUNTDOWN_START_VALUE; + // Gain exclusive access to the input events + view_port_input_callback_set(app->view_port, event_loop_multi_app_input_callback, app); + gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen); + // Notify the event loop about incoming messages in the queue + furi_event_loop_subscribe_message_queue( + app->event_loop, + app->input_queue, + FuriEventLoopEventIn, + event_loop_multi_app_input_queue_callback, + app); + // Notify the event loop about new data in the stream buffer + furi_event_loop_subscribe_stream_buffer( + app->event_loop, + app->stream_buffer, + FuriEventLoopEventIn | FuriEventLoopEventFlagEdge, + event_loop_multi_app_stream_buffer_callback, + app); + + return app; +} + +static void event_loop_multi_app_free(EventLoopMultiApp* app) { + gui_remove_view_port(app->gui, app->view_port); + furi_record_close(RECORD_GUI); + // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. + // Failure to do so will result in a crash. + furi_event_loop_unsubscribe(app->event_loop, app->input_queue); + furi_event_loop_unsubscribe(app->event_loop, app->stream_buffer); + // Delete all instances + view_port_free(app->view_port); + furi_message_queue_free(app->input_queue); + furi_stream_buffer_free(app->stream_buffer); + // IMPORTANT: All timers MUST be deleted before deleting the associated event loop. + // Failure to do so will result in a crash. + furi_event_loop_timer_free(app->exit_timer); + furi_thread_free(app->worker_thread); + furi_event_loop_free(app->event_loop); + + free(app); +} + +static void event_loop_multi_app_run(EventLoopMultiApp* app) { + FURI_LOG_I(TAG, "Press keys to see them printed here."); + FURI_LOG_I(TAG, "Long press \"Back\" to exit after %lu seconds.", COUNTDOWN_START_VALUE); + FURI_LOG_I(TAG, "Long press \"Ok\" to cancel the countdown."); + + // Start the worker thread + furi_thread_start(app->worker_thread); + // Run the application event loop. This call will block until the application is about to exit. + furi_event_loop_run(app->event_loop); + // Wait for the worker thread to finish. + furi_thread_join(app->worker_thread); +} + +/******************************************************************* + * vvv START HERE vvv + * + * The application's entry point - referenced in application.fam + *******************************************************************/ +int32_t example_event_loop_multi_app(void* arg) { + UNUSED(arg); + + EventLoopMultiApp* app = event_loop_multi_app_alloc(); + event_loop_multi_app_run(app); + event_loop_multi_app_free(app); + + return 0; +} diff --git a/applications/examples/example_event_loop/example_event_loop_mutex.c b/applications/examples/example_event_loop/example_event_loop_mutex.c new file mode 100644 index 0000000000..d043f3f899 --- /dev/null +++ b/applications/examples/example_event_loop/example_event_loop_mutex.c @@ -0,0 +1,140 @@ +/** + * @file example_event_loop_mutex.c + * @brief Example application that demonstrates the FuriEventLoop and FuriMutex integration. + * + * This application simulates a use case where a time-consuming blocking operation is executed + * in a separate thread and a mutex is being used for synchronization. The application runs 10 iterations + * of the above mentioned simulated work and prints the results to the debug output each time, then exits. + */ + +#include +#include + +#define TAG "ExampleEventLoopMutex" + +#define WORKER_ITERATION_COUNT (10) +// We are interested in IN events (for the mutex, that means that the mutex has been released), +// using edge trigger mode (reacting only to changes in mutex state) and +// employing one-shot mode to automatically unsubscribe before the event is processed. +#define MUTEX_EVENT_AND_FLAGS \ + (FuriEventLoopEventIn | FuriEventLoopEventFlagEdge | FuriEventLoopEventFlagOnce) + +typedef struct { + FuriEventLoop* event_loop; + FuriThread* worker_thread; + FuriMutex* worker_mutex; + uint8_t worker_result; +} EventLoopMutexApp; + +// This funciton is being run in a separate thread to simulate lenghty blocking operations +static int32_t event_loop_mutex_app_worker_thread(void* context) { + furi_assert(context); + EventLoopMutexApp* app = context; + + FURI_LOG_I(TAG, "Worker thread started"); + + // Run 10 iterations of simulated work + for(uint32_t i = 0; i < WORKER_ITERATION_COUNT; ++i) { + FURI_LOG_I(TAG, "Doing work ..."); + // Take the mutex so that no-one can access the worker_result variable + furi_check(furi_mutex_acquire(app->worker_mutex, FuriWaitForever) == FuriStatusOk); + // Simulate a blocking operation with a random delay between 900 and 1100 ms + const uint32_t work_time_ms = 900 + furi_hal_random_get() % 200; + furi_delay_ms(work_time_ms); + // Simulate a result with a random number between 0 and 255 + app->worker_result = furi_hal_random_get() % 0xFF; + + FURI_LOG_I(TAG, "Work done in %lu ms", work_time_ms); + // Release the mutex, which will notify the event loop that the result is ready + furi_check(furi_mutex_release(app->worker_mutex) == FuriStatusOk); + // Return control to the scheduler so that the event loop can take the mutex in its turn + furi_thread_yield(); + } + + FURI_LOG_I(TAG, "All work done, worker thread out!"); + // Request the event loop to stop + furi_event_loop_stop(app->event_loop); + + return 0; +} + +// This function is being run each time when the mutex gets released +static bool event_loop_mutex_app_event_callback(FuriEventLoopObject* object, void* context) { + furi_assert(context); + + EventLoopMutexApp* app = context; + furi_assert(object == app->worker_mutex); + + // Take the mutex so that no-one can access the worker_result variable + // IMPORTANT: the wait time MUST be 0, i.e. the event loop event callbacks + // must NOT ever block. If it is possible that the mutex will be taken by + // others, then the event callback code must take it into account. + furi_check(furi_mutex_acquire(app->worker_mutex, 0) == FuriStatusOk); + // Access the worker_result variable and print it. + FURI_LOG_I(TAG, "Result available! Value: %u", app->worker_result); + // Release the mutex, enabling the worker thread to continue when it's ready + furi_check(furi_mutex_release(app->worker_mutex) == FuriStatusOk); + // Subscribe for the mutex release events again, since we were unsubscribed automatically + // before processing the event. + furi_event_loop_subscribe_mutex( + app->event_loop, + app->worker_mutex, + MUTEX_EVENT_AND_FLAGS, + event_loop_mutex_app_event_callback, + app); + + return true; +} + +static EventLoopMutexApp* event_loop_mutex_app_alloc(void) { + EventLoopMutexApp* app = malloc(sizeof(EventLoopMutexApp)); + + // Create an event loop instance. + app->event_loop = furi_event_loop_alloc(); + // Create a worker thread instance. + app->worker_thread = furi_thread_alloc_ex( + "EventLoopMutexWorker", 1024, event_loop_mutex_app_worker_thread, app); + // Create a mutex instance. + app->worker_mutex = furi_mutex_alloc(FuriMutexTypeNormal); + // Subscribe for the mutex release events. + // Note that since FuriEventLoopEventFlagOneShot is used, we will be automatically unsubscribed + // from events before entering the event processing callback. This is necessary in order to not + // trigger on events caused by releasing the mutex in the callback. + furi_event_loop_subscribe_mutex( + app->event_loop, + app->worker_mutex, + MUTEX_EVENT_AND_FLAGS, + event_loop_mutex_app_event_callback, + app); + + return app; +} + +static void event_loop_mutex_app_free(EventLoopMutexApp* app) { + // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. + // Failure to do so will result in a crash. + furi_event_loop_unsubscribe(app->event_loop, app->worker_mutex); + // Delete all instances + furi_thread_free(app->worker_thread); + furi_mutex_free(app->worker_mutex); + furi_event_loop_free(app->event_loop); + + free(app); +} + +static void event_loop_mutex_app_run(EventLoopMutexApp* app) { + furi_thread_start(app->worker_thread); + furi_event_loop_run(app->event_loop); + furi_thread_join(app->worker_thread); +} + +// The application's entry point - referenced in application.fam +int32_t example_event_loop_mutex_app(void* arg) { + UNUSED(arg); + + EventLoopMutexApp* app = event_loop_mutex_app_alloc(); + event_loop_mutex_app_run(app); + event_loop_mutex_app_free(app); + + return 0; +} diff --git a/applications/examples/example_event_loop/example_event_loop_stream_buffer.c b/applications/examples/example_event_loop/example_event_loop_stream_buffer.c new file mode 100644 index 0000000000..65dbd83cf5 --- /dev/null +++ b/applications/examples/example_event_loop/example_event_loop_stream_buffer.c @@ -0,0 +1,131 @@ +/** + * @file example_event_loop_stream_buffer.c + * @brief Example application that demonstrates the FuriEventLoop and FuriStreamBuffer integration. + * + * This application simulates a use case where some data data stream comes from a separate thread (or hardware) + * and a stream buffer is used to act as an intermediate buffer. The worker thread produces 10 iterations of 32 + * bytes of simulated data, and each time when the buffer is half-filled, the data is taken out of it and printed + * to the debug output. After completing all iterations, the application exits. + */ + +#include +#include + +#define TAG "ExampleEventLoopStreamBuffer" + +#define WORKER_ITERATION_COUNT (10) + +#define STREAM_BUFFER_SIZE (32) +#define STREAM_BUFFER_TRIG_LEVEL (STREAM_BUFFER_SIZE / 2) +#define STREAM_BUFFER_EVENT_AND_FLAGS (FuriEventLoopEventIn | FuriEventLoopEventFlagEdge) + +typedef struct { + FuriEventLoop* event_loop; + FuriThread* worker_thread; + FuriStreamBuffer* stream_buffer; +} EventLoopStreamBufferApp; + +// This funciton is being run in a separate thread to simulate data coming from a producer thread or some device. +static int32_t event_loop_stream_buffer_app_worker_thread(void* context) { + furi_assert(context); + EventLoopStreamBufferApp* app = context; + + FURI_LOG_I(TAG, "Worker thread started"); + + for(uint32_t i = 0; i < WORKER_ITERATION_COUNT; ++i) { + // Produce 32 bytes of simulated data. + for(uint32_t j = 0; j < STREAM_BUFFER_SIZE; ++j) { + // Simulate incoming data by generating a random byte. + uint8_t data = furi_hal_random_get() % 0xFF; + // Put the byte in the buffer. Depending on the use case, it may or may be not acceptable + // to wait for free space to become available. + furi_check( + furi_stream_buffer_send(app->stream_buffer, &data, 1, FuriWaitForever) == 1); + // Delay between 30 and 50 ms to slow down the output for clarity. + furi_delay_ms(30 + furi_hal_random_get() % 20); + } + } + + FURI_LOG_I(TAG, "All work done, worker thread out!"); + // Request the event loop to stop + furi_event_loop_stop(app->event_loop); + + return 0; +} + +// This function is being run each time when the number of bytes in the buffer is above its trigger level. +static bool + event_loop_stream_buffer_app_event_callback(FuriEventLoopObject* object, void* context) { + furi_assert(context); + EventLoopStreamBufferApp* app = context; + + furi_assert(object == app->stream_buffer); + + // Temporary buffer that can hold at most half of the stream buffer's capacity. + uint8_t data[STREAM_BUFFER_TRIG_LEVEL]; + // Receive the data. It is guaranteed that the amount of data in the buffer will be equal to + // or greater than the trigger level, therefore, no waiting delay is necessary. + furi_check( + furi_stream_buffer_receive(app->stream_buffer, data, sizeof(data), 0) == sizeof(data)); + + // Format the data for printing and print it to the debug output. + FuriString* tmp_str = furi_string_alloc(); + for(uint32_t i = 0; i < sizeof(data); ++i) { + furi_string_cat_printf(tmp_str, "%02X ", data[i]); + } + + FURI_LOG_I(TAG, "Received data: %s", furi_string_get_cstr(tmp_str)); + furi_string_free(tmp_str); + + return true; +} + +static EventLoopStreamBufferApp* event_loop_stream_buffer_app_alloc(void) { + EventLoopStreamBufferApp* app = malloc(sizeof(EventLoopStreamBufferApp)); + + // Create an event loop instance. + app->event_loop = furi_event_loop_alloc(); + // Create a worker thread instance. + app->worker_thread = furi_thread_alloc_ex( + "EventLoopStreamBufferWorker", 1024, event_loop_stream_buffer_app_worker_thread, app); + // Create a stream_buffer instance. + app->stream_buffer = furi_stream_buffer_alloc(STREAM_BUFFER_SIZE, STREAM_BUFFER_TRIG_LEVEL); + // Subscribe for the stream buffer IN events in edge triggered mode. + furi_event_loop_subscribe_stream_buffer( + app->event_loop, + app->stream_buffer, + STREAM_BUFFER_EVENT_AND_FLAGS, + event_loop_stream_buffer_app_event_callback, + app); + + return app; +} + +static void event_loop_stream_buffer_app_free(EventLoopStreamBufferApp* app) { + // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. + // Failure to do so will result in a crash. + furi_event_loop_unsubscribe(app->event_loop, app->stream_buffer); + // Delete all instances + furi_thread_free(app->worker_thread); + furi_stream_buffer_free(app->stream_buffer); + furi_event_loop_free(app->event_loop); + + free(app); +} + +static void event_loop_stream_buffer_app_run(EventLoopStreamBufferApp* app) { + furi_thread_start(app->worker_thread); + furi_event_loop_run(app->event_loop); + furi_thread_join(app->worker_thread); +} + +// The application's entry point - referenced in application.fam +int32_t example_event_loop_stream_buffer_app(void* arg) { + UNUSED(arg); + + EventLoopStreamBufferApp* app = event_loop_stream_buffer_app_alloc(); + event_loop_stream_buffer_app_run(app); + event_loop_stream_buffer_app_free(app); + + return 0; +} diff --git a/applications/examples/example_event_loop/example_event_loop_timer.c b/applications/examples/example_event_loop/example_event_loop_timer.c new file mode 100644 index 0000000000..e255f6b61b --- /dev/null +++ b/applications/examples/example_event_loop/example_event_loop_timer.c @@ -0,0 +1,87 @@ +/** + * @file example_event_loop_timer.c + * @brief Example application that demonstrates FuriEventLoop's software timer capability. + * + * This application prints a countdown from 10 to 0 to the debug output and then exits. + * Despite only one timer being used in this example for clarity, an event loop instance can have + * an arbitrary number of independent timers of any type (periodic or one-shot). + * + */ +#include + +#define TAG "ExampleEventLoopTimer" + +#define COUNTDOWN_START_VALUE (10) +#define COUNTDOWN_INTERVAL_MS (1000) + +typedef struct { + FuriEventLoop* event_loop; + FuriEventLoopTimer* timer; + uint32_t countdown_value; +} EventLoopTimerApp; + +// This function is called each time the timer expires (i.e. once per 1000 ms (1s) in this example) +static void event_loop_timer_callback(void* context) { + furi_assert(context); + EventLoopTimerApp* app = context; + + // Print the countdown value + FURI_LOG_I(TAG, "T-00:00:%02lu", app->countdown_value); + + if(app->countdown_value == 0) { + // If the countdown reached 0, print the final line and stop the event loop + FURI_LOG_I(TAG, "Blast off to adventure!"); + // After this call, the control will be returned back to event_loop_timers_app_run() + furi_event_loop_stop(app->event_loop); + + } else { + // Decrement the countdown value + app->countdown_value -= 1; + } +} + +static EventLoopTimerApp* event_loop_timer_app_alloc(void) { + EventLoopTimerApp* app = malloc(sizeof(EventLoopTimerApp)); + + // Create an event loop instance. + app->event_loop = furi_event_loop_alloc(); + // Create a software timer instance. + // The timer is bound to the event loop instance and will execute in its context. + // Here, the timer type is periodic, i.e. it will restart automatically after expiring. + app->timer = furi_event_loop_timer_alloc( + app->event_loop, event_loop_timer_callback, FuriEventLoopTimerTypePeriodic, app); + // The countdown value will be tracked in this variable. + app->countdown_value = COUNTDOWN_START_VALUE; + + return app; +} + +static void event_loop_timer_app_free(EventLoopTimerApp* app) { + // IMPORTANT: All event loop timers MUST be deleted BEFORE deleting the event loop itself. + // Failure to do so will result in a crash. + furi_event_loop_timer_free(app->timer); + // With all timers deleted, it's safe to delete the event loop. + furi_event_loop_free(app->event_loop); + free(app); +} + +static void event_loop_timer_app_run(EventLoopTimerApp* app) { + FURI_LOG_I(TAG, "All systems go! Prepare for countdown!"); + + // Timers can be started either before the event loop is run, or in any + // callback function called by a running event loop. + furi_event_loop_timer_start(app->timer, COUNTDOWN_INTERVAL_MS); + // This call will block until furi_event_loop_stop() is called. + furi_event_loop_run(app->event_loop); +} + +// The application's entry point - referenced in application.fam +int32_t example_event_loop_timer_app(void* arg) { + UNUSED(arg); + + EventLoopTimerApp* app = event_loop_timer_app_alloc(); + event_loop_timer_app_run(app); + event_loop_timer_app_free(app); + + return 0; +} diff --git a/applications/examples/example_view_dispatcher/application.fam b/applications/examples/example_view_dispatcher/application.fam new file mode 100644 index 0000000000..f7b743bcf5 --- /dev/null +++ b/applications/examples/example_view_dispatcher/application.fam @@ -0,0 +1,8 @@ +App( + appid="example_view_dispatcher", + name="Example: ViewDispatcher", + apptype=FlipperAppType.EXTERNAL, + entry_point="example_view_dispatcher_app", + requires=["gui"], + fap_category="Examples", +) diff --git a/applications/examples/example_view_dispatcher/example_view_dispatcher.c b/applications/examples/example_view_dispatcher/example_view_dispatcher.c new file mode 100644 index 0000000000..71d29edfd9 --- /dev/null +++ b/applications/examples/example_view_dispatcher/example_view_dispatcher.c @@ -0,0 +1,173 @@ +/** + * @file example_view_dispatcher.c + * @brief Example application demonstrating the usage of the ViewDispatcher library. + * + * This application can display one of two views: either a Widget or a Submenu. + * Each view has its own way of switching to another one: + * + * - A center button in the Widget view. + * - A submenu item in the Submenu view + * + * Press either to switch to a different view. Press Back to exit the application. + * + */ + +#include +#include + +#include +#include + +// Enumeration of the view indexes. +typedef enum { + ViewIndexWidget, + ViewIndexSubmenu, + ViewIndexCount, +} ViewIndex; + +// Enumeration of submenu items. +typedef enum { + SubmenuIndexNothing, + SubmenuIndexSwitchView, +} SubmenuIndex; + +// Main application structure. +typedef struct { + ViewDispatcher* view_dispatcher; + Widget* widget; + Submenu* submenu; +} ExampleViewDispatcherApp; + +// This function is called when the user has pressed the Back key. +static bool example_view_dispatcher_app_navigation_callback(void* context) { + furi_assert(context); + ExampleViewDispatcherApp* app = context; + // Back means exit the application, which can be done by stopping the ViewDispatcher. + view_dispatcher_stop(app->view_dispatcher); + return true; +} + +// This function is called when there are custom events to process. +static bool example_view_dispatcher_app_custom_event_callback(void* context, uint32_t event) { + furi_assert(context); + ExampleViewDispatcherApp* app = context; + // The event numerical value can mean different things (the application is responsible to uphold its chosen convention) + // In this example, the only possible meaning is the view index to switch to. + furi_assert(event < ViewIndexCount); + // Switch to the requested view. + view_dispatcher_switch_to_view(app->view_dispatcher, event); + + return true; +} + +// This function is called when the user presses the "Switch View" button on the Widget view. +static void example_view_dispatcher_app_button_callback( + GuiButtonType button_type, + InputType input_type, + void* context) { + furi_assert(context); + ExampleViewDispatcherApp* app = context; + // Only request the view switch if the user short-presses the Center button. + if(button_type == GuiButtonTypeCenter && input_type == InputTypeShort) { + // Request switch to the Submenu view via the custom event queue. + view_dispatcher_send_custom_event(app->view_dispatcher, ViewIndexSubmenu); + } +} + +// This function is called when the user activates the "Switch View" submenu item. +static void example_view_dispatcher_app_submenu_callback(void* context, uint32_t index) { + furi_assert(context); + ExampleViewDispatcherApp* app = context; + // Only request the view switch if the user activates the "Switch View" item. + if(index == SubmenuIndexSwitchView) { + // Request switch to the Widget view via the custom event queue. + view_dispatcher_send_custom_event(app->view_dispatcher, ViewIndexWidget); + } +} + +// Application constructor function. +static ExampleViewDispatcherApp* example_view_dispatcher_app_alloc() { + ExampleViewDispatcherApp* app = malloc(sizeof(ExampleViewDispatcherApp)); + // Access the GUI API instance. + Gui* gui = furi_record_open(RECORD_GUI); + // Create and initialize the Widget view. + app->widget = widget_alloc(); + widget_add_string_multiline_element( + app->widget, 64, 32, AlignCenter, AlignCenter, FontSecondary, "Press the Button below"); + widget_add_button_element( + app->widget, + GuiButtonTypeCenter, + "Switch View", + example_view_dispatcher_app_button_callback, + app); + // Create and initialize the Submenu view. + app->submenu = submenu_alloc(); + submenu_add_item(app->submenu, "Do Nothing", SubmenuIndexNothing, NULL, NULL); + submenu_add_item( + app->submenu, + "Switch View", + SubmenuIndexSwitchView, + example_view_dispatcher_app_submenu_callback, + app); + // Create the ViewDispatcher instance. + app->view_dispatcher = view_dispatcher_alloc(); + // Let the GUI know about this ViewDispatcher instance. + view_dispatcher_attach_to_gui(app->view_dispatcher, gui, ViewDispatcherTypeFullscreen); + // Register the views within the ViewDispatcher instance. This alone will not show any of them on the screen. + // Each view must have its own index to refer to it later (it is best done via an enumeration as shown here). + view_dispatcher_add_view(app->view_dispatcher, ViewIndexWidget, widget_get_view(app->widget)); + view_dispatcher_add_view( + app->view_dispatcher, ViewIndexSubmenu, submenu_get_view(app->submenu)); + // Set the custom event callback. It will be called each time a custom event is scheduled + // using the view_dispatcher_send_custom_callback() function. + view_dispatcher_set_custom_event_callback( + app->view_dispatcher, example_view_dispatcher_app_custom_event_callback); + // Set the navigation, or back button callback. It will be called if the user pressed the Back button + // and the event was not handled in the currently displayed view. + view_dispatcher_set_navigation_event_callback( + app->view_dispatcher, example_view_dispatcher_app_navigation_callback); + // The context will be passed to the callbacks as a parameter, so we have access to our application object. + view_dispatcher_set_event_callback_context(app->view_dispatcher, app); + + return app; +} + +// Application destructor function. +static void example_view_dispatcher_app_free(ExampleViewDispatcherApp* app) { + // All views must be un-registered (removed) from a ViewDispatcher instance + // before deleting it. Failure to do so will result in a crash. + view_dispatcher_remove_view(app->view_dispatcher, ViewIndexWidget); + view_dispatcher_remove_view(app->view_dispatcher, ViewIndexSubmenu); + // Now it is safe to delete the ViewDispatcher instance. + view_dispatcher_free(app->view_dispatcher); + // Delete the views + widget_free(app->widget); + submenu_free(app->submenu); + // End access to hte the GUI API. + furi_record_close(RECORD_GUI); + // Free the remaining memory. + free(app); +} + +static void example_view_dispatcher_app_run(ExampleViewDispatcherApp* app) { + // Display the Widget view on the screen. + view_dispatcher_switch_to_view(app->view_dispatcher, ViewIndexWidget); + // This function will block until view_dispatcher_stop() is called. + // Internally, it uses a FuriEventLoop (see FuriEventLoop examples for more info on this). + view_dispatcher_run(app->view_dispatcher); +} + +/******************************************************************* + * vvv START HERE vvv + * + * The application's entry point - referenced in application.fam + *******************************************************************/ +int32_t example_view_dispatcher_app(void* arg) { + UNUSED(arg); + + ExampleViewDispatcherApp* app = example_view_dispatcher_app_alloc(); + example_view_dispatcher_app_run(app); + example_view_dispatcher_app_free(app); + + return 0; +} diff --git a/applications/examples/example_view_holder/application.fam b/applications/examples/example_view_holder/application.fam new file mode 100644 index 0000000000..19ad8d2ac4 --- /dev/null +++ b/applications/examples/example_view_holder/application.fam @@ -0,0 +1,8 @@ +App( + appid="example_view_holder", + name="Example: ViewHolder", + apptype=FlipperAppType.EXTERNAL, + entry_point="example_view_holder_app", + requires=["gui"], + fap_category="Examples", +) diff --git a/applications/examples/example_view_holder/example_view_holder.c b/applications/examples/example_view_holder/example_view_holder.c new file mode 100644 index 0000000000..24907dbc26 --- /dev/null +++ b/applications/examples/example_view_holder/example_view_holder.c @@ -0,0 +1,78 @@ +/** + * @file example_view_holder.c + * @brief Example application demonstrating the usage of the ViewHolder library. + * + * This application will display a text box with some scrollable text in it. + * Press the Back key to exit the application. + */ + +#include +#include +#include + +#include + +// This function will be called when the user presses the Back button. +static void example_view_holder_back_callback(void* context) { + FuriApiLock exit_lock = context; + // Unlock the exit lock, thus enabling the app to exit. + api_lock_unlock(exit_lock); +} + +int32_t example_view_holder_app(void* arg) { + UNUSED(arg); + + // Access the GUI API instance. + Gui* gui = furi_record_open(RECORD_GUI); + // Create a TextBox view. The Gui object only accepts + // ViewPort instances, so we will need to address that later. + TextBox* text_box = text_box_alloc(); + // Set some text so that the text box is not empty. + text_box_set_text( + text_box, + "ViewHolder is being used\n" + "to show this TextBox view.\n\n" + "Scroll down to see more.\n\n\n" + "Press \"Back\" to exit."); + + // Create a ViewHolder instance. It will serve as an adapter to convert + // between the View type provided by the TextBox view and the ViewPort type + // that the GUI can actually display. + ViewHolder* view_holder = view_holder_alloc(); + // Let the GUI know about this ViewHolder instance. + view_holder_attach_to_gui(view_holder, gui); + // Set the view that we want to display. + view_holder_set_view(view_holder, text_box_get_view(text_box)); + + // The part below is not really related to this example, but is necessary for it to function. + // We need to somehow stall the application thread so that the view stays on the screen (otherwise + // the app will just exit and won't display anything) and at the same time we need a way to quit out + // of the application. + + // In this example, a simple FuriApiLock instance is used. A real-world application is likely to have some + // kind of event handling loop here instead. (see the ViewDispatcher example or one of FuriEventLoop + // examples for that). + + // Create a pre-locked FuriApiLock instance. + FuriApiLock exit_lock = api_lock_alloc_locked(); + // Set a Back event callback for the ViewHolder instance. It will be called when the user + // presses the Back button. We pass the exit lock instance as the context to be able to access + // it inside the callback function. + view_holder_set_back_callback(view_holder, example_view_holder_back_callback, exit_lock); + + // This call will block the application thread from running until the exit lock gets unlocked somehow + // (the only way it can happen in this example is via the back callback). + api_lock_wait_unlock_and_free(exit_lock); + + // The back key has been pressed, which unlocked the exit lock. The application is about to exit. + + // The view must be removed from a ViewHolder instance before deleting it. + view_holder_set_view(view_holder, NULL); + // Delete everything to prevent memory leaks. + view_holder_free(view_holder); + text_box_free(text_box); + // End access to the GUI API. + furi_record_close(RECORD_GUI); + + return 0; +} diff --git a/applications/main/archive/archive.c b/applications/main/archive/archive.c index 5db650445d..ff855df640 100644 --- a/applications/main/archive/archive.c +++ b/applications/main/archive/archive.c @@ -23,7 +23,6 @@ ArchiveApp* archive_alloc(void) { archive->view_dispatcher = view_dispatcher_alloc(); archive->scene_manager = scene_manager_alloc(&archive_scene_handlers, archive); - view_dispatcher_enable_queue(archive->view_dispatcher); view_dispatcher_attach_to_gui( archive->view_dispatcher, archive->gui, ViewDispatcherTypeFullscreen); diff --git a/applications/main/bad_usb/bad_usb_app.c b/applications/main/bad_usb/bad_usb_app.c index 0f10d60d8f..2d2d4be86c 100644 --- a/applications/main/bad_usb/bad_usb_app.c +++ b/applications/main/bad_usb/bad_usb_app.c @@ -112,8 +112,6 @@ BadUsbApp* bad_usb_app_alloc(char* arg) { app->dialogs = furi_record_open(RECORD_DIALOGS); app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); - app->scene_manager = scene_manager_alloc(&bad_usb_scene_handlers, app); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); diff --git a/applications/main/gpio/gpio_app.c b/applications/main/gpio/gpio_app.c index 217423ecc3..234cc793a8 100644 --- a/applications/main/gpio/gpio_app.c +++ b/applications/main/gpio/gpio_app.c @@ -32,7 +32,6 @@ GpioApp* gpio_app_alloc(void) { app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&gpio_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( diff --git a/applications/main/ibutton/ibutton.c b/applications/main/ibutton/ibutton.c index b6e8a20cf9..765d536125 100644 --- a/applications/main/ibutton/ibutton.c +++ b/applications/main/ibutton/ibutton.c @@ -85,7 +85,6 @@ iButton* ibutton_alloc(void) { ibutton->scene_manager = scene_manager_alloc(&ibutton_scene_handlers, ibutton); ibutton->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(ibutton->view_dispatcher); view_dispatcher_set_event_callback_context(ibutton->view_dispatcher, ibutton); view_dispatcher_set_custom_event_callback( ibutton->view_dispatcher, ibutton_custom_event_callback); diff --git a/applications/main/infrared/infrared_app.c b/applications/main/infrared/infrared_app.c index c6e4bca026..75c874e73b 100644 --- a/applications/main/infrared/infrared_app.c +++ b/applications/main/infrared/infrared_app.c @@ -159,7 +159,6 @@ static InfraredApp* infrared_alloc(void) { infrared->gui = furi_record_open(RECORD_GUI); ViewDispatcher* view_dispatcher = infrared->view_dispatcher; - view_dispatcher_enable_queue(view_dispatcher); view_dispatcher_set_event_callback_context(view_dispatcher, infrared); view_dispatcher_set_custom_event_callback(view_dispatcher, infrared_custom_event_callback); view_dispatcher_set_navigation_event_callback(view_dispatcher, infrared_back_event_callback); diff --git a/applications/main/lfrfid/lfrfid.c b/applications/main/lfrfid/lfrfid.c index 3bc7a8b130..2da29e134e 100644 --- a/applications/main/lfrfid/lfrfid.c +++ b/applications/main/lfrfid/lfrfid.c @@ -53,7 +53,6 @@ static LfRfid* lfrfid_alloc(void) { lfrfid->view_dispatcher = view_dispatcher_alloc(); lfrfid->scene_manager = scene_manager_alloc(&lfrfid_scene_handlers, lfrfid); - view_dispatcher_enable_queue(lfrfid->view_dispatcher); view_dispatcher_set_event_callback_context(lfrfid->view_dispatcher, lfrfid); view_dispatcher_set_custom_event_callback( lfrfid->view_dispatcher, lfrfid_debug_custom_event_callback); diff --git a/applications/main/nfc/nfc_app.c b/applications/main/nfc/nfc_app.c index f3aa5e7240..bdf9c0e2f8 100644 --- a/applications/main/nfc/nfc_app.c +++ b/applications/main/nfc/nfc_app.c @@ -41,7 +41,6 @@ NfcApp* nfc_app_alloc(void) { instance->view_dispatcher = view_dispatcher_alloc(); instance->scene_manager = scene_manager_alloc(&nfc_scene_handlers, instance); - view_dispatcher_enable_queue(instance->view_dispatcher); view_dispatcher_set_event_callback_context(instance->view_dispatcher, instance); view_dispatcher_set_custom_event_callback( instance->view_dispatcher, nfc_custom_event_callback); diff --git a/applications/main/subghz/subghz.c b/applications/main/subghz/subghz.c index b71d271d44..22e81f2eb7 100644 --- a/applications/main/subghz/subghz.c +++ b/applications/main/subghz/subghz.c @@ -59,7 +59,6 @@ SubGhz* subghz_alloc(void) { // View Dispatcher subghz->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(subghz->view_dispatcher); subghz->scene_manager = scene_manager_alloc(&subghz_scene_handlers, subghz); view_dispatcher_set_event_callback_context(subghz->view_dispatcher, subghz); diff --git a/applications/main/u2f/u2f_app.c b/applications/main/u2f/u2f_app.c index 68966390a9..58af40e7bb 100644 --- a/applications/main/u2f/u2f_app.c +++ b/applications/main/u2f/u2f_app.c @@ -29,7 +29,6 @@ U2fApp* u2f_app_alloc(void) { app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&u2f_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_tick_event_callback( app->view_dispatcher, u2f_app_tick_event_callback, 500); diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 66e503e967..e57e1eb00f 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -265,7 +265,6 @@ static Desktop* desktop_alloc(void) { desktop->view_dispatcher = view_dispatcher_alloc(); desktop->scene_manager = scene_manager_alloc(&desktop_scene_handlers, desktop); - view_dispatcher_enable_queue(desktop->view_dispatcher); view_dispatcher_attach_to_gui( desktop->view_dispatcher, desktop->gui, ViewDispatcherTypeDesktop); view_dispatcher_set_tick_event_callback( diff --git a/applications/services/dialogs/dialogs_module_file_browser.c b/applications/services/dialogs/dialogs_module_file_browser.c index b1558f1e95..12a7439e60 100644 --- a/applications/services/dialogs/dialogs_module_file_browser.c +++ b/applications/services/dialogs/dialogs_module_file_browser.c @@ -49,12 +49,11 @@ bool dialogs_app_process_module_file_browser(const DialogsAppMessageDataFileBrow file_browser_start(file_browser, data->preselected_filename); view_holder_set_view(view_holder, file_browser_get_view(file_browser)); - view_holder_start(view_holder); api_lock_wait_unlock(file_browser_context->lock); ret = file_browser_context->result; - view_holder_stop(view_holder); + view_holder_set_view(view_holder, NULL); view_holder_free(view_holder); file_browser_stop(file_browser); file_browser_free(file_browser); diff --git a/applications/services/dialogs/dialogs_module_message.c b/applications/services/dialogs/dialogs_module_message.c index a71f403c54..9dc9ff9cb9 100644 --- a/applications/services/dialogs/dialogs_module_message.c +++ b/applications/services/dialogs/dialogs_module_message.c @@ -88,12 +88,11 @@ DialogMessageButton dialogs_app_process_module_message(const DialogsAppMessageDa dialog_ex_set_right_button_text(dialog_ex, message->right_button_text); view_holder_set_view(view_holder, dialog_ex_get_view(dialog_ex)); - view_holder_start(view_holder); api_lock_wait_unlock(message_context->lock); ret = message_context->result; - view_holder_stop(view_holder); + view_holder_set_view(view_holder, NULL); view_holder_free(view_holder); dialog_ex_free(dialog_ex); api_lock_free(message_context->lock); diff --git a/applications/services/dolphin/dolphin.c b/applications/services/dolphin/dolphin.c index 198c1483a3..dd2ecd2ba1 100644 --- a/applications/services/dolphin/dolphin.c +++ b/applications/services/dolphin/dolphin.c @@ -192,8 +192,8 @@ static void dolphin_update_clear_limits_timer_period(void* context) { FURI_LOG_D(TAG, "Daily limits reset in %lu ms", time_to_clear_limits); } -static bool dolphin_process_event(FuriMessageQueue* queue, void* context) { - UNUSED(queue); +static bool dolphin_process_event(FuriEventLoopObject* object, void* context) { + UNUSED(object); Dolphin* dolphin = context; DolphinEvent event; @@ -280,7 +280,7 @@ int32_t dolphin_srv(void* p) { dolphin_init_state(dolphin); - furi_event_loop_message_queue_subscribe( + furi_event_loop_subscribe_message_queue( dolphin->event_loop, dolphin->event_queue, FuriEventLoopEventIn, diff --git a/applications/services/gui/view_dispatcher.c b/applications/services/gui/view_dispatcher.c index b4c534932f..63878fc190 100644 --- a/applications/services/gui/view_dispatcher.c +++ b/applications/services/gui/view_dispatcher.c @@ -2,6 +2,8 @@ #define TAG "ViewDispatcher" +#define VIEW_DISPATCHER_QUEUE_LEN (16U) + ViewDispatcher* view_dispatcher_alloc(void) { ViewDispatcher* view_dispatcher = malloc(sizeof(ViewDispatcher)); @@ -14,6 +16,26 @@ ViewDispatcher* view_dispatcher_alloc(void) { ViewDict_init(view_dispatcher->views); + view_dispatcher->event_loop = furi_event_loop_alloc(); + + view_dispatcher->input_queue = + furi_message_queue_alloc(VIEW_DISPATCHER_QUEUE_LEN, sizeof(InputEvent)); + furi_event_loop_subscribe_message_queue( + view_dispatcher->event_loop, + view_dispatcher->input_queue, + FuriEventLoopEventIn, + view_dispatcher_run_input_callback, + view_dispatcher); + + view_dispatcher->event_queue = + furi_message_queue_alloc(VIEW_DISPATCHER_QUEUE_LEN, sizeof(uint32_t)); + furi_event_loop_subscribe_message_queue( + view_dispatcher->event_loop, + view_dispatcher->event_queue, + FuriEventLoopEventIn, + view_dispatcher_run_event_callback, + view_dispatcher); + return view_dispatcher; } @@ -29,44 +51,19 @@ void view_dispatcher_free(ViewDispatcher* view_dispatcher) { // Free ViewPort view_port_free(view_dispatcher->view_port); // Free internal queue - if(view_dispatcher->input_queue) { - furi_event_loop_message_queue_unsubscribe( - view_dispatcher->event_loop, view_dispatcher->input_queue); - furi_message_queue_free(view_dispatcher->input_queue); - } - if(view_dispatcher->event_queue) { - furi_event_loop_message_queue_unsubscribe( - view_dispatcher->event_loop, view_dispatcher->event_queue); - furi_message_queue_free(view_dispatcher->event_queue); - } - if(view_dispatcher->event_loop) { - furi_event_loop_free(view_dispatcher->event_loop); - } + furi_event_loop_unsubscribe(view_dispatcher->event_loop, view_dispatcher->input_queue); + furi_event_loop_unsubscribe(view_dispatcher->event_loop, view_dispatcher->event_queue); + + furi_message_queue_free(view_dispatcher->input_queue); + furi_message_queue_free(view_dispatcher->event_queue); + + furi_event_loop_free(view_dispatcher->event_loop); // Free dispatcher free(view_dispatcher); } void view_dispatcher_enable_queue(ViewDispatcher* view_dispatcher) { - furi_check(view_dispatcher); - furi_check(view_dispatcher->event_loop == NULL); - - view_dispatcher->event_loop = furi_event_loop_alloc(); - - view_dispatcher->input_queue = furi_message_queue_alloc(16, sizeof(InputEvent)); - furi_event_loop_message_queue_subscribe( - view_dispatcher->event_loop, - view_dispatcher->input_queue, - FuriEventLoopEventIn, - view_dispatcher_run_input_callback, - view_dispatcher); - - view_dispatcher->event_queue = furi_message_queue_alloc(16, sizeof(uint32_t)); - furi_event_loop_message_queue_subscribe( - view_dispatcher->event_loop, - view_dispatcher->event_queue, - FuriEventLoopEventIn, - view_dispatcher_run_event_callback, - view_dispatcher); + UNUSED(view_dispatcher); } void view_dispatcher_set_navigation_event_callback( @@ -99,14 +96,12 @@ void view_dispatcher_set_event_callback_context(ViewDispatcher* view_dispatcher, FuriEventLoop* view_dispatcher_get_event_loop(ViewDispatcher* view_dispatcher) { furi_check(view_dispatcher); - furi_check(view_dispatcher->event_loop); return view_dispatcher->event_loop; } void view_dispatcher_run(ViewDispatcher* view_dispatcher) { furi_check(view_dispatcher); - furi_check(view_dispatcher->event_loop); uint32_t tick_period = view_dispatcher->tick_period == 0 ? FuriWaitForever : view_dispatcher->tick_period; @@ -134,7 +129,6 @@ void view_dispatcher_run(ViewDispatcher* view_dispatcher) { void view_dispatcher_stop(ViewDispatcher* view_dispatcher) { furi_check(view_dispatcher); - furi_check(view_dispatcher->event_loop); furi_event_loop_stop(view_dispatcher->event_loop); } @@ -242,13 +236,9 @@ void view_dispatcher_draw_callback(Canvas* canvas, void* context) { void view_dispatcher_input_callback(InputEvent* event, void* context) { ViewDispatcher* view_dispatcher = context; - if(view_dispatcher->input_queue) { - furi_check( - furi_message_queue_put(view_dispatcher->input_queue, event, FuriWaitForever) == - FuriStatusOk); - } else { - view_dispatcher_handle_input(view_dispatcher, event); - } + furi_check( + furi_message_queue_put(view_dispatcher->input_queue, event, FuriWaitForever) == + FuriStatusOk); } void view_dispatcher_handle_input(ViewDispatcher* view_dispatcher, InputEvent* event) { @@ -328,7 +318,6 @@ void view_dispatcher_handle_custom_event(ViewDispatcher* view_dispatcher, uint32 void view_dispatcher_send_custom_event(ViewDispatcher* view_dispatcher, uint32_t event) { furi_check(view_dispatcher); - furi_check(view_dispatcher->event_loop); furi_check( furi_message_queue_put(view_dispatcher->event_queue, &event, FuriWaitForever) == @@ -364,9 +353,7 @@ void view_dispatcher_set_current_view(ViewDispatcher* view_dispatcher, View* vie view_port_update(view_dispatcher->view_port); } else { view_port_enabled_set(view_dispatcher->view_port, false); - if(view_dispatcher->event_loop) { - view_dispatcher_stop(view_dispatcher); - } + view_dispatcher_stop(view_dispatcher); } } @@ -381,10 +368,10 @@ void view_dispatcher_update(View* view, void* context) { } } -bool view_dispatcher_run_event_callback(FuriMessageQueue* queue, void* context) { +bool view_dispatcher_run_event_callback(FuriEventLoopObject* object, void* context) { furi_assert(context); ViewDispatcher* instance = context; - furi_assert(instance->event_queue == queue); + furi_assert(instance->event_queue == object); uint32_t event; furi_check(furi_message_queue_get(instance->event_queue, &event, 0) == FuriStatusOk); @@ -393,10 +380,10 @@ bool view_dispatcher_run_event_callback(FuriMessageQueue* queue, void* context) return true; } -bool view_dispatcher_run_input_callback(FuriMessageQueue* queue, void* context) { +bool view_dispatcher_run_input_callback(FuriEventLoopObject* object, void* context) { furi_assert(context); ViewDispatcher* instance = context; - furi_assert(instance->input_queue == queue); + furi_assert(instance->input_queue == object); InputEvent input; furi_check(furi_message_queue_get(instance->input_queue, &input, 0) == FuriStatusOk); diff --git a/applications/services/gui/view_dispatcher.h b/applications/services/gui/view_dispatcher.h index 905c60975b..9fbf897918 100644 --- a/applications/services/gui/view_dispatcher.h +++ b/applications/services/gui/view_dispatcher.h @@ -2,6 +2,14 @@ * @file view_dispatcher.h * @brief GUI: ViewDispatcher API * + * ViewDispatcher is used to connect several Views to a Gui instance, switch between them and handle various events. + * This is useful in applications featuring an advanced graphical user interface. + * + * Internally, ViewDispatcher employs a FuriEventLoop instance together with two separate + * message queues for input and custom event handling. See FuriEventLoop for more information. + * + * If no multi-view or complex event handling capabilities are required, consider using ViewHolder instead. + * * @warning Views added to a ViewDispatcher MUST NOT be in a ViewStack at the same time. */ @@ -40,6 +48,9 @@ typedef void (*ViewDispatcherTickEventCallback)(void* context); ViewDispatcher* view_dispatcher_alloc(void); /** Free ViewDispatcher instance + * + * @warning All added views MUST be removed using view_dispatcher_remove_view() + * before calling this function. * * @param view_dispatcher pointer to ViewDispatcher */ @@ -47,12 +58,13 @@ void view_dispatcher_free(ViewDispatcher* view_dispatcher); /** Enable queue support * - * Allocates event_loop, input and event message queues. Must be used with - * `view_dispatcher_run` + * @deprecated Do NOT use in new code and remove all calls to it from existing code. + * The queue support is now always enabled during construction. If no queue support + * is required, consider using ViewHolder instead. * * @param view_dispatcher ViewDispatcher instance */ -void view_dispatcher_enable_queue(ViewDispatcher* view_dispatcher); +FURI_DEPRECATED void view_dispatcher_enable_queue(ViewDispatcher* view_dispatcher); /** Send custom event * @@ -103,11 +115,11 @@ void view_dispatcher_set_event_callback_context(ViewDispatcher* view_dispatcher, /** Get event_loop instance * - * event_loop instance is allocated on `view_dispatcher_enable_queue` and used - * in view_dispatcher_run. + * Use the return value to connect additional supported primitives (message queues, timers, etc) + * to this ViewDispatcher instance's event loop. * - * You can add your objects into event_loop instance, but don't run the loop on - * your side as it will cause issues with input processing on dispatcher stop. + * @warning Do NOT call furi_event_loop_run() on the returned instance, it is done internally + * in the view_dispatcher_run() call. * * @param view_dispatcher ViewDispatcher instance * @@ -117,15 +129,14 @@ FuriEventLoop* view_dispatcher_get_event_loop(ViewDispatcher* view_dispatcher); /** Run ViewDispatcher * - * Use only after queue enabled + * This function will start the event loop and block until view_dispatcher_stop() is called + * or the current thread receives a FuriSignalExit signal. * * @param view_dispatcher ViewDispatcher instance */ void view_dispatcher_run(ViewDispatcher* view_dispatcher); /** Stop ViewDispatcher - * - * Use only after queue enabled * * @param view_dispatcher ViewDispatcher instance */ diff --git a/applications/services/gui/view_dispatcher_i.h b/applications/services/gui/view_dispatcher_i.h index 46a4ac7fa7..c6c8dc665c 100644 --- a/applications/services/gui/view_dispatcher_i.h +++ b/applications/services/gui/view_dispatcher_i.h @@ -56,7 +56,7 @@ void view_dispatcher_set_current_view(ViewDispatcher* view_dispatcher, View* vie void view_dispatcher_update(View* view, void* context); /** ViewDispatcher run event loop event callback */ -bool view_dispatcher_run_event_callback(FuriMessageQueue* queue, void* context); +bool view_dispatcher_run_event_callback(FuriEventLoopObject* object, void* context); /** ViewDispatcher run event loop input callback */ -bool view_dispatcher_run_input_callback(FuriMessageQueue* queue, void* context); +bool view_dispatcher_run_input_callback(FuriEventLoopObject* object, void* context); diff --git a/applications/services/gui/view_holder.c b/applications/services/gui/view_holder.c index ca2f9b04e1..7d8b5e17c3 100644 --- a/applications/services/gui/view_holder.c +++ b/applications/services/gui/view_holder.c @@ -32,7 +32,8 @@ ViewHolder* view_holder_alloc(void) { } void view_holder_free(ViewHolder* view_holder) { - furi_assert(view_holder); + furi_check(view_holder); + furi_check(view_holder->view == NULL); if(view_holder->gui) { gui_remove_view_port(view_holder->gui, view_holder->view_port); @@ -48,12 +49,14 @@ void view_holder_free(ViewHolder* view_holder) { } void view_holder_set_view(ViewHolder* view_holder, View* view) { - furi_assert(view_holder); + furi_check(view_holder); + if(view_holder->view) { - if(view_holder->view->exit_callback) { - view_holder->view->exit_callback(view_holder->view->context); + while(view_holder->ongoing_input) { + furi_delay_tick(1); } + view_exit(view_holder->view); view_set_update_callback(view_holder->view, NULL); view_set_update_callback_context(view_holder->view, NULL); } @@ -61,12 +64,23 @@ void view_holder_set_view(ViewHolder* view_holder, View* view) { view_holder->view = view; if(view_holder->view) { + const ViewPortOrientation orientation = (ViewPortOrientation)view->orientation; + furi_assert(orientation < ViewPortOrientationMAX); + if(view_port_get_orientation(view_holder->view_port) != orientation) { + view_port_set_orientation(view_holder->view_port, orientation); + // we just rotated input keys, now it's time to sacrifice some input + view_holder->ongoing_input = 0; + } + view_set_update_callback(view_holder->view, view_holder_update); view_set_update_callback_context(view_holder->view, view_holder); - if(view_holder->view->enter_callback) { - view_holder->view->enter_callback(view_holder->view->context); - } + view_enter(view_holder->view); + view_port_enabled_set(view_holder->view_port, true); + view_port_update(view_holder->view_port); + + } else { + view_port_enabled_set(view_holder->view_port, false); } } @@ -74,7 +88,7 @@ void view_holder_set_free_callback( ViewHolder* view_holder, FreeCallback free_callback, void* free_context) { - furi_assert(view_holder); + furi_check(view_holder); view_holder->free_callback = free_callback; view_holder->free_context = free_context; } @@ -87,31 +101,22 @@ void view_holder_set_back_callback( ViewHolder* view_holder, BackCallback back_callback, void* back_context) { - furi_assert(view_holder); + furi_check(view_holder); view_holder->back_callback = back_callback; view_holder->back_context = back_context; } void view_holder_attach_to_gui(ViewHolder* view_holder, Gui* gui) { - furi_assert(gui); - furi_assert(view_holder); - view_holder->gui = gui; + furi_check(view_holder); + furi_check(view_holder->gui == NULL); + furi_check(gui); gui_add_view_port(gui, view_holder->view_port, GuiLayerFullscreen); -} - -void view_holder_start(ViewHolder* view_holder) { - view_port_enabled_set(view_holder->view_port, true); -} - -void view_holder_stop(ViewHolder* view_holder) { - while(view_holder->ongoing_input) - furi_delay_tick(1); - view_port_enabled_set(view_holder->view_port, false); + view_holder->gui = gui; } void view_holder_update(View* view, void* context) { - furi_assert(view); - furi_assert(context); + furi_check(view); + furi_check(context); ViewHolder* view_holder = context; if(view == view_holder->view) { @@ -119,6 +124,18 @@ void view_holder_update(View* view, void* context) { } } +void view_holder_send_to_front(ViewHolder* view_holder) { + furi_check(view_holder); + furi_check(view_holder->gui); + gui_view_port_send_to_front(view_holder->gui, view_holder->view_port); +} + +void view_holder_send_to_back(ViewHolder* view_holder) { + furi_check(view_holder); + furi_check(view_holder->gui); + gui_view_port_send_to_back(view_holder->gui, view_holder->view_port); +} + static void view_holder_draw_callback(Canvas* canvas, void* context) { ViewHolder* view_holder = context; if(view_holder->view) { diff --git a/applications/services/gui/view_holder.h b/applications/services/gui/view_holder.h index 90ce82b377..78dbfda0ec 100644 --- a/applications/services/gui/view_holder.h +++ b/applications/services/gui/view_holder.h @@ -2,7 +2,10 @@ * @file view_holder.h * @brief GUI: ViewHolder API * - * @warning View added to a ViewHolder MUST NOT be in a ViewStack at the same time. + * ViewHolder is used to connect a single View to a Gui instance. This is useful in smaller applications + * with a simple user interface. If advanced view switching capabilites are required, consider using ViewDispatcher instead. + * + * @warning Views added to a ViewHolder MUST NOT be in a ViewStack at the same time. */ #pragma once @@ -22,7 +25,8 @@ typedef void (*FreeCallback)(void* free_context); /** * @brief Back callback type - * @warning comes from GUI thread + * + * @warning Will be called from the GUI thread */ typedef void (*BackCallback)(void* back_context); @@ -34,12 +38,17 @@ ViewHolder* view_holder_alloc(void); /** * @brief Free ViewHolder and call Free callback + * + * @warning The current view must be unset prior to freeing a ViewHolder instance. + * * @param view_holder pointer to ViewHolder */ void view_holder_free(ViewHolder* view_holder); /** * @brief Set view for ViewHolder + * + * Pass NULL as the view parameter to unset the current view. * * @param view_holder ViewHolder instance * @param view View instance @@ -59,13 +68,25 @@ void view_holder_set_free_callback( void* free_context); /** - * @brief Free callback context getter. Useful if your Free callback is a module destructor, so you can get an instance of the module using this method. + * @brief Free callback context getter. + * + * Useful if your Free callback is a module destructor, so you can get an instance of the module using this method. * * @param view_holder ViewHolder instance * @return void* free callback context */ void* view_holder_get_free_context(ViewHolder* view_holder); +/** + * @brief Set the back key callback. + * + * The callback function will be called if the user has pressed the Back key + * and the current view did not handle this event. + * + * @param view_holder ViewHolder instance + * @param back_callback pointer to the callback function + * @param back_context pointer to a user-specific object, can be NULL + */ void view_holder_set_back_callback( ViewHolder* view_holder, BackCallback back_callback, @@ -80,25 +101,26 @@ void view_holder_set_back_callback( void view_holder_attach_to_gui(ViewHolder* view_holder, Gui* gui); /** - * @brief Enable view processing - * - * @param view_holder + * @brief View Update Handler + * + * @param view View Instance + * @param context ViewHolder instance */ -void view_holder_start(ViewHolder* view_holder); +void view_holder_update(View* view, void* context); /** - * @brief Disable view processing - * - * @param view_holder + * @brief Send ViewPort of this ViewHolder instance to front + * + * @param view_holder ViewHolder instance */ -void view_holder_stop(ViewHolder* view_holder); +void view_holder_send_to_front(ViewHolder* view_holder); -/** View Update Handler +/** + * @brief Send ViewPort of this ViewHolder instance to back * - * @param view View Instance - * @param context ViewHolder instance + * @param view_holder ViewHolder instance */ -void view_holder_update(View* view, void* context); +void view_holder_send_to_back(ViewHolder* view_holder); #ifdef __cplusplus } diff --git a/applications/services/loader/loader_applications.c b/applications/services/loader/loader_applications.c index 232e5314e9..5399ba26fc 100644 --- a/applications/services/loader/loader_applications.c +++ b/applications/services/loader/loader_applications.c @@ -61,7 +61,6 @@ static LoaderApplicationsApp* loader_applications_app_alloc(void) { app->loading = loading_alloc(); view_holder_attach_to_gui(app->view_holder, app->gui); - view_holder_set_view(app->view_holder, loading_get_view(app->loading)); return app; } //-V773 @@ -149,7 +148,7 @@ static int32_t loader_applications_thread(void* p) { LoaderApplicationsApp* app = loader_applications_app_alloc(); // start loading animation - view_holder_start(app->view_holder); + view_holder_set_view(app->view_holder, loading_get_view(app->loading)); while(loader_applications_select_app(app)) { if(!furi_string_end_with(app->file_path, ".js")) { @@ -161,7 +160,7 @@ static int32_t loader_applications_thread(void* p) { } // stop loading animation - view_holder_stop(app->view_holder); + view_holder_set_view(app->view_holder, NULL); loader_applications_app_free(app); diff --git a/applications/services/loader/loader_menu.c b/applications/services/loader/loader_menu.c index 3293548810..25763a0bcf 100644 --- a/applications/services/loader/loader_menu.c +++ b/applications/services/loader/loader_menu.c @@ -158,8 +158,6 @@ static LoaderMenuApp* loader_menu_app_alloc(LoaderMenu* loader_menu) { view_set_context(settings_view, app->settings_menu); view_set_previous_callback(settings_view, loader_menu_switch_to_primary); view_dispatcher_add_view(app->view_dispatcher, LoaderMenuViewSettings, settings_view); - - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_switch_to_view(app->view_dispatcher, LoaderMenuViewPrimary); return app; diff --git a/applications/services/power/power_cli.c b/applications/services/power/power_cli.c index 6e1e34e67e..93d0f232ac 100644 --- a/applications/services/power/power_cli.c +++ b/applications/services/power/power_cli.c @@ -17,13 +17,15 @@ void power_cli_off(Cli* cli, FuriString* args) { void power_cli_reboot(Cli* cli, FuriString* args) { UNUSED(cli); UNUSED(args); - power_reboot(PowerBootModeNormal); + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeNormal); } void power_cli_reboot2dfu(Cli* cli, FuriString* args) { UNUSED(cli); UNUSED(args); - power_reboot(PowerBootModeDfu); + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeDfu); } void power_cli_5v(Cli* cli, FuriString* args) { diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index 64121d8525..189bf24dab 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -3,17 +3,25 @@ #include #include +#include +#include + #define TAG "Power" -#define POWER_OFF_TIMEOUT 90 +#define POWER_OFF_TIMEOUT_S (90U) +#define POWER_POLL_PERIOD_MS (1000UL) + +#define POWER_VBUS_LOW_THRESHOLD (4.0f) +#define POWER_HEALTH_LOW_THRESHOLD (70U) -void power_draw_battery_callback(Canvas* canvas, void* context) { +static void power_draw_battery_callback(Canvas* canvas, void* context) { furi_assert(context); Power* power = context; canvas_draw_icon(canvas, 0, 0, &I_Battery_26x8); if(power->info.gauge_is_ok) { canvas_draw_box(canvas, 2, 2, (power->info.charge + 4) / 5, 4); + if(power->info.voltage_battery_charge_limit < 4.2f) { // Battery charge voltage limit is modified, indicate with cross pattern canvas_invert_color(canvas); @@ -28,6 +36,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { } canvas_invert_color(canvas); } + if(power->state == PowerStateCharging) { canvas_set_bitmap_mode(canvas, 1); canvas_set_color(canvas, ColorWhite); @@ -37,6 +46,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { canvas_draw_icon(canvas, 8, -1, &I_Charging_lightning_9x10); canvas_set_bitmap_mode(canvas, 0); } + } else { canvas_draw_box(canvas, 8, 3, 8, 2); } @@ -46,99 +56,61 @@ static ViewPort* power_battery_view_port_alloc(Power* power) { ViewPort* battery_view_port = view_port_alloc(); view_port_set_width(battery_view_port, icon_get_width(&I_Battery_26x8)); view_port_draw_callback_set(battery_view_port, power_draw_battery_callback, power); - gui_add_view_port(power->gui, battery_view_port, GuiLayerStatusBarRight); return battery_view_port; } -Power* power_alloc(void) { - Power* power = malloc(sizeof(Power)); - - // Records - power->notification = furi_record_open(RECORD_NOTIFICATION); - power->gui = furi_record_open(RECORD_GUI); - - // Pubsub - power->event_pubsub = furi_pubsub_alloc(); - - // State initialization - power->state = PowerStateNotCharging; - power->battery_low = false; - power->power_off_timeout = POWER_OFF_TIMEOUT; - power->api_mtx = furi_mutex_alloc(FuriMutexTypeNormal); - - // Gui - power->view_dispatcher = view_dispatcher_alloc(); - power->power_off = power_off_alloc(); - view_dispatcher_add_view( - power->view_dispatcher, PowerViewOff, power_off_get_view(power->power_off)); - power->power_unplug_usb = power_unplug_usb_alloc(); - view_dispatcher_add_view( - power->view_dispatcher, - PowerViewUnplugUsb, - power_unplug_usb_get_view(power->power_unplug_usb)); - view_dispatcher_attach_to_gui( - power->view_dispatcher, power->gui, ViewDispatcherTypeFullscreen); - - // Battery view port - power->battery_view_port = power_battery_view_port_alloc(power); - power->show_low_bat_level_message = true; - - return power; +static bool power_update_info(Power* power) { + const PowerInfo info = { + .is_charging = furi_hal_power_is_charging(), + .gauge_is_ok = furi_hal_power_gauge_is_ok(), + .is_shutdown_requested = furi_hal_power_is_shutdown_requested(), + .charge = furi_hal_power_get_pct(), + .health = furi_hal_power_get_bat_health_pct(), + .capacity_remaining = furi_hal_power_get_battery_remaining_capacity(), + .capacity_full = furi_hal_power_get_battery_full_capacity(), + .current_charger = furi_hal_power_get_battery_current(FuriHalPowerICCharger), + .current_gauge = furi_hal_power_get_battery_current(FuriHalPowerICFuelGauge), + .voltage_battery_charge_limit = furi_hal_power_get_battery_charge_voltage_limit(), + .voltage_charger = furi_hal_power_get_battery_voltage(FuriHalPowerICCharger), + .voltage_gauge = furi_hal_power_get_battery_voltage(FuriHalPowerICFuelGauge), + .voltage_vbus = furi_hal_power_get_usb_voltage(), + .temperature_charger = furi_hal_power_get_battery_temperature(FuriHalPowerICCharger), + .temperature_gauge = furi_hal_power_get_battery_temperature(FuriHalPowerICFuelGauge), + }; + + const bool need_refresh = (power->info.charge != info.charge) || + (power->info.is_charging != info.is_charging); + power->info = info; + return need_refresh; } static void power_check_charging_state(Power* power) { + NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); + if(furi_hal_power_is_charging()) { if((power->info.charge == 100) || (furi_hal_power_is_charging_done())) { if(power->state != PowerStateCharged) { - notification_internal_message(power->notification, &sequence_charged); + notification_internal_message(notification, &sequence_charged); power->state = PowerStateCharged; power->event.type = PowerEventTypeFullyCharged; furi_pubsub_publish(power->event_pubsub, &power->event); } - } else { - if(power->state != PowerStateCharging) { - notification_internal_message(power->notification, &sequence_charging); - power->state = PowerStateCharging; - power->event.type = PowerEventTypeStartCharging; - furi_pubsub_publish(power->event_pubsub, &power->event); - } - } - } else { - if(power->state != PowerStateNotCharging) { - notification_internal_message(power->notification, &sequence_not_charging); - power->state = PowerStateNotCharging; - power->event.type = PowerEventTypeStopCharging; + + } else if(power->state != PowerStateCharging) { + notification_internal_message(notification, &sequence_charging); + power->state = PowerStateCharging; + power->event.type = PowerEventTypeStartCharging; furi_pubsub_publish(power->event_pubsub, &power->event); } - } -} -static bool power_update_info(Power* power) { - PowerInfo info; - - info.is_charging = furi_hal_power_is_charging(); - info.gauge_is_ok = furi_hal_power_gauge_is_ok(); - info.is_shutdown_requested = furi_hal_power_is_shutdown_requested(); - info.charge = furi_hal_power_get_pct(); - info.health = furi_hal_power_get_bat_health_pct(); - info.capacity_remaining = furi_hal_power_get_battery_remaining_capacity(); - info.capacity_full = furi_hal_power_get_battery_full_capacity(); - info.current_charger = furi_hal_power_get_battery_current(FuriHalPowerICCharger); - info.current_gauge = furi_hal_power_get_battery_current(FuriHalPowerICFuelGauge); - info.voltage_battery_charge_limit = furi_hal_power_get_battery_charge_voltage_limit(); - info.voltage_charger = furi_hal_power_get_battery_voltage(FuriHalPowerICCharger); - info.voltage_gauge = furi_hal_power_get_battery_voltage(FuriHalPowerICFuelGauge); - info.voltage_vbus = furi_hal_power_get_usb_voltage(); - info.temperature_charger = furi_hal_power_get_battery_temperature(FuriHalPowerICCharger); - info.temperature_gauge = furi_hal_power_get_battery_temperature(FuriHalPowerICFuelGauge); - - furi_mutex_acquire(power->api_mtx, FuriWaitForever); - bool need_refresh = power->info.charge != info.charge; - need_refresh |= power->info.is_charging != info.is_charging; - power->info = info; - furi_mutex_release(power->api_mtx); + } else if(power->state != PowerStateNotCharging) { + notification_internal_message(notification, &sequence_not_charging); + power->state = PowerStateNotCharging; + power->event.type = PowerEventTypeStopCharging; + furi_pubsub_publish(power->event_pubsub, &power->event); + } - return need_refresh; + furi_record_close(RECORD_NOTIFICATION); } static void power_check_low_battery(Power* power) { @@ -147,40 +119,41 @@ static void power_check_low_battery(Power* power) { } // Check battery charge and vbus voltage - if((power->info.is_shutdown_requested) && (power->info.voltage_vbus < 4.0f) && - power->show_low_bat_level_message) { + if((power->info.is_shutdown_requested) && + (power->info.voltage_vbus < POWER_VBUS_LOW_THRESHOLD) && power->show_battery_low_warning) { if(!power->battery_low) { - view_dispatcher_send_to_front(power->view_dispatcher); - view_dispatcher_switch_to_view(power->view_dispatcher, PowerViewOff); + view_holder_send_to_front(power->view_holder); + view_holder_set_view(power->view_holder, power_off_get_view(power->view_power_off)); } power->battery_low = true; } else { if(power->battery_low) { - view_dispatcher_switch_to_view(power->view_dispatcher, VIEW_NONE); - power->power_off_timeout = POWER_OFF_TIMEOUT; + // view_dispatcher_switch_to_view(power->view_dispatcher, VIEW_NONE); + view_holder_set_view(power->view_holder, NULL); + power->power_off_timeout = POWER_OFF_TIMEOUT_S; } power->battery_low = false; } // If battery low, update view and switch off power after timeout if(power->battery_low) { - PowerOffResponse response = power_off_get_response(power->power_off); + PowerOffResponse response = power_off_get_response(power->view_power_off); if(response == PowerOffResponseDefault) { if(power->power_off_timeout) { - power_off_set_time_left(power->power_off, power->power_off_timeout--); + power_off_set_time_left(power->view_power_off, power->power_off_timeout--); } else { power_off(power); } } else if(response == PowerOffResponseOk) { power_off(power); } else if(response == PowerOffResponseHide) { - view_dispatcher_switch_to_view(power->view_dispatcher, VIEW_NONE); + view_holder_set_view(power->view_holder, NULL); if(power->power_off_timeout) { - power_off_set_time_left(power->power_off, power->power_off_timeout--); + power_off_set_time_left(power->view_power_off, power->power_off_timeout--); } else { power_off(power); } } else if(response == PowerOffResponseCancel) { - view_dispatcher_switch_to_view(power->view_dispatcher, VIEW_NONE); + view_holder_set_view(power->view_holder, NULL); } } } @@ -194,45 +167,136 @@ static void power_check_battery_level_change(Power* power) { } } -int32_t power_srv(void* p) { - UNUSED(p); +static void power_handle_shutdown(Power* power) { + furi_hal_power_off(); + // Notify user if USB is plugged + view_holder_send_to_front(power->view_holder); + view_holder_set_view( + power->view_holder, power_unplug_usb_get_view(power->view_power_unplug_usb)); + furi_delay_ms(100); + furi_halt("Disconnect USB for safe shutdown"); +} - if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { - FURI_LOG_W(TAG, "Skipping start in special boot mode"); +static void power_handle_reboot(PowerBootMode mode) { + if(mode == PowerBootModeNormal) { + update_operation_disarm(); + } else if(mode == PowerBootModeDfu) { + furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeDfu); + } else if(mode == PowerBootModeUpdateStart) { + furi_hal_rtc_set_boot_mode(FuriHalRtcBootModePreUpdate); + } else { + furi_crash(); + } - furi_thread_suspend(furi_thread_get_current_id()); - return 0; + furi_hal_power_reset(); +} + +static bool power_message_callback(FuriEventLoopObject* object, void* context) { + furi_assert(context); + Power* power = context; + + furi_assert(object == power->message_queue); + + PowerMessage msg; + furi_check(furi_message_queue_get(power->message_queue, &msg, 0) == FuriStatusOk); + + switch(msg.type) { + case PowerMessageTypeShutdown: + power_handle_shutdown(power); + break; + case PowerMessageTypeReboot: + power_handle_reboot(msg.boot_mode); + break; + case PowerMessageTypeGetInfo: + *msg.power_info = power->info; + break; + case PowerMessageTypeIsBatteryHealthy: + *msg.bool_param = power->info.health > POWER_HEALTH_LOW_THRESHOLD; + break; + case PowerMessageTypeShowBatteryLowWarning: + power->show_battery_low_warning = *msg.bool_param; + break; + default: + furi_crash(); } - Power* power = power_alloc(); - power_update_info(power); - furi_record_create(RECORD_POWER, power); + if(msg.lock) { + api_lock_unlock(msg.lock); + } - while(1) { - // Update data from gauge and charger - bool need_refresh = power_update_info(power); + return true; +} - // Check low battery level - power_check_low_battery(power); +static void power_tick_callback(void* context) { + furi_assert(context); + Power* power = context; - // Check and notify about charging state - power_check_charging_state(power); + // Update data from gauge and charger + const bool need_refresh = power_update_info(power); + // Check low battery level + power_check_low_battery(power); + // Check and notify about charging state + power_check_charging_state(power); + // Check and notify about battery level change + power_check_battery_level_change(power); + // Update battery view port + if(need_refresh) { + view_port_update(power->battery_view_port); + } + // Check OTG status and disable it in case of fault + if(furi_hal_power_is_otg_enabled()) { + furi_hal_power_check_otg_status(); + } +} - // Check and notify about battery level change - power_check_battery_level_change(power); +static Power* power_alloc(void) { + Power* power = malloc(sizeof(Power)); + // Pubsub + power->event_pubsub = furi_pubsub_alloc(); + // State initialization + power->power_off_timeout = POWER_OFF_TIMEOUT_S; + power->show_battery_low_warning = true; + // Gui + Gui* gui = furi_record_open(RECORD_GUI); - // Update battery view port - if(need_refresh) view_port_update(power->battery_view_port); + power->view_holder = view_holder_alloc(); + power->view_power_off = power_off_alloc(); + power->view_power_unplug_usb = power_unplug_usb_alloc(); - // Check OTG status and disable it in case of fault - if(furi_hal_power_is_otg_enabled()) { - furi_hal_power_check_otg_status(); - } + view_holder_attach_to_gui(power->view_holder, gui); + // Battery view port + power->battery_view_port = power_battery_view_port_alloc(power); + gui_add_view_port(gui, power->battery_view_port, GuiLayerStatusBarRight); + // Event loop + power->event_loop = furi_event_loop_alloc(); + power->message_queue = furi_message_queue_alloc(4, sizeof(PowerMessage)); + + furi_event_loop_subscribe_message_queue( + power->event_loop, + power->message_queue, + FuriEventLoopEventIn, + power_message_callback, + power); + furi_event_loop_tick_set(power->event_loop, 1000, power_tick_callback, power); + + return power; +} + +int32_t power_srv(void* p) { + UNUSED(p); - furi_delay_ms(1000); + if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { + FURI_LOG_W(TAG, "Skipping start in special boot mode"); + + furi_thread_suspend(furi_thread_get_current_id()); + return 0; } - furi_crash("That was unexpected"); + Power* power = power_alloc(); + power_update_info(power); + + furi_record_create(RECORD_POWER, power); + furi_event_loop_run(power->event_loop); return 0; } diff --git a/applications/services/power/power_service/power.h b/applications/services/power/power_service/power.h index fdc5b527a6..0168a86564 100644 --- a/applications/services/power/power_service/power.h +++ b/applications/services/power/power_service/power.h @@ -1,9 +1,10 @@ #pragma once #include -#include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -65,7 +66,7 @@ void power_off(Power* power); * * @param mode PowerBootMode */ -void power_reboot(PowerBootMode mode); +void power_reboot(Power* power, PowerBootMode mode); /** Get power info * diff --git a/applications/services/power/power_service/power_api.c b/applications/services/power/power_service/power_api.c index 1bb482bf52..6f7515f5e4 100644 --- a/applications/services/power/power_service/power_api.c +++ b/applications/services/power/power_service/power_api.c @@ -1,41 +1,39 @@ #include "power_i.h" -#include -#include -#include - void power_off(Power* power) { furi_check(power); - furi_hal_power_off(); - // Notify user if USB is plugged - view_dispatcher_send_to_front(power->view_dispatcher); - view_dispatcher_switch_to_view(power->view_dispatcher, PowerViewUnplugUsb); - furi_delay_ms(100); - furi_halt("Disconnect USB for safe shutdown"); + PowerMessage msg = { + .type = PowerMessageTypeShutdown, + }; + + furi_check( + furi_message_queue_put(power->message_queue, &msg, FuriWaitForever) == FuriStatusOk); } -void power_reboot(PowerBootMode mode) { - if(mode == PowerBootModeNormal) { - update_operation_disarm(); - } else if(mode == PowerBootModeDfu) { - furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeDfu); - } else if(mode == PowerBootModeUpdateStart) { - furi_hal_rtc_set_boot_mode(FuriHalRtcBootModePreUpdate); - } else { - furi_crash(); - } - - furi_hal_power_reset(); +void power_reboot(Power* power, PowerBootMode mode) { + PowerMessage msg = { + .type = PowerMessageTypeReboot, + .boot_mode = mode, + }; + + furi_check( + furi_message_queue_put(power->message_queue, &msg, FuriWaitForever) == FuriStatusOk); } void power_get_info(Power* power, PowerInfo* info) { furi_check(power); furi_check(info); - furi_mutex_acquire(power->api_mtx, FuriWaitForever); - memcpy(info, &power->info, sizeof(power->info)); - furi_mutex_release(power->api_mtx); + PowerMessage msg = { + .type = PowerMessageTypeGetInfo, + .power_info = info, + .lock = api_lock_alloc_locked(), + }; + + furi_check( + furi_message_queue_put(power->message_queue, &msg, FuriWaitForever) == FuriStatusOk); + api_lock_wait_unlock_and_free(msg.lock); } FuriPubSub* power_get_pubsub(Power* power) { @@ -45,16 +43,30 @@ FuriPubSub* power_get_pubsub(Power* power) { bool power_is_battery_healthy(Power* power) { furi_check(power); - bool is_healthy = false; - furi_mutex_acquire(power->api_mtx, FuriWaitForever); - is_healthy = power->info.health > POWER_BATTERY_HEALTHY_LEVEL; - furi_mutex_release(power->api_mtx); - return is_healthy; + + bool ret = false; + + PowerMessage msg = { + .type = PowerMessageTypeIsBatteryHealthy, + .lock = api_lock_alloc_locked(), + .bool_param = &ret, + }; + + furi_check( + furi_message_queue_put(power->message_queue, &msg, FuriWaitForever) == FuriStatusOk); + api_lock_wait_unlock_and_free(msg.lock); + + return ret; } void power_enable_low_battery_level_notification(Power* power, bool enable) { furi_check(power); - furi_mutex_acquire(power->api_mtx, FuriWaitForever); - power->show_low_bat_level_message = enable; - furi_mutex_release(power->api_mtx); + + PowerMessage msg = { + .type = PowerMessageTypeShowBatteryLowWarning, + .bool_param = &enable, + }; + + furi_check( + furi_message_queue_put(power->message_queue, &msg, FuriWaitForever) == FuriStatusOk); } diff --git a/applications/services/power/power_service/power_i.h b/applications/services/power/power_service/power_i.h index 8cb5140d77..a0c02623a5 100644 --- a/applications/services/power/power_service/power_i.h +++ b/applications/services/power/power_service/power_i.h @@ -2,19 +2,15 @@ #include "power.h" -#include -#include #include +#include + +#include #include -#include #include "views/power_off.h" #include "views/power_unplug_usb.h" -#include - -#define POWER_BATTERY_HEALTHY_LEVEL 70 - typedef enum { PowerStateNotCharging, PowerStateCharging, @@ -22,28 +18,44 @@ typedef enum { } PowerState; struct Power { - ViewDispatcher* view_dispatcher; - PowerOff* power_off; - PowerUnplugUsb* power_unplug_usb; + ViewHolder* view_holder; + FuriPubSub* event_pubsub; + FuriEventLoop* event_loop; + FuriMessageQueue* message_queue; ViewPort* battery_view_port; - Gui* gui; - NotificationApp* notification; - FuriPubSub* event_pubsub; - PowerEvent event; + PowerOff* view_power_off; + PowerUnplugUsb* view_power_unplug_usb; + PowerEvent event; PowerState state; PowerInfo info; bool battery_low; - bool show_low_bat_level_message; + bool show_battery_low_warning; uint8_t battery_level; uint8_t power_off_timeout; - - FuriMutex* api_mtx; }; typedef enum { PowerViewOff, PowerViewUnplugUsb, } PowerView; + +typedef enum { + PowerMessageTypeShutdown, + PowerMessageTypeReboot, + PowerMessageTypeGetInfo, + PowerMessageTypeIsBatteryHealthy, + PowerMessageTypeShowBatteryLowWarning, +} PowerMessageType; + +typedef struct { + PowerMessageType type; + union { + PowerBootMode boot_mode; + PowerInfo* power_info; + bool* bool_param; + }; + FuriApiLock lock; +} PowerMessage; diff --git a/applications/services/rpc/rpc_system.c b/applications/services/rpc/rpc_system.c index 0b9fd33f95..1cc0f90eb2 100644 --- a/applications/services/rpc/rpc_system.c +++ b/applications/services/rpc/rpc_system.c @@ -54,18 +54,21 @@ static void rpc_system_system_reboot_process(const PB_Main* request, void* conte RpcSession* session = (RpcSession*)context; furi_assert(session); + Power* power = furi_record_open(RECORD_POWER); const int mode = request->content.system_reboot_request.mode; if(mode == PB_System_RebootRequest_RebootMode_OS) { - power_reboot(PowerBootModeNormal); + power_reboot(power, PowerBootModeNormal); } else if(mode == PB_System_RebootRequest_RebootMode_DFU) { - power_reboot(PowerBootModeDfu); + power_reboot(power, PowerBootModeDfu); } else if(mode == PB_System_RebootRequest_RebootMode_UPDATE) { - power_reboot(PowerBootModeUpdateStart); + power_reboot(power, PowerBootModeUpdateStart); } else { rpc_send_and_release_empty( session, request->command_id, PB_CommandStatus_ERROR_INVALID_PARAMETERS); } + + furi_record_close(RECORD_POWER); } static void rpc_system_system_device_info_callback( @@ -181,9 +184,9 @@ static void rpc_system_system_factory_reset_process(const PB_Main* request, void furi_hal_rtc_reset_registers(); furi_hal_rtc_set_flag(FuriHalRtcFlagStorageFormatInternal); - power_reboot(PowerBootModeNormal); - (void)session; + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeNormal); } static void diff --git a/applications/services/storage/storage_cli.c b/applications/services/storage/storage_cli.c index 17fd4eae4d..a18b289408 100644 --- a/applications/services/storage/storage_cli.c +++ b/applications/services/storage/storage_cli.c @@ -675,9 +675,12 @@ static void storage_cli_factory_reset(Cli* cli, FuriString* args, void* context) char c = cli_getc(cli); if(c == 'y' || c == 'Y') { printf("Data will be wiped after reboot.\r\n"); + furi_hal_rtc_reset_registers(); furi_hal_rtc_set_flag(FuriHalRtcFlagStorageFormatInternal); - power_reboot(PowerBootModeNormal); + + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeNormal); } else { printf("Safe choice.\r\n"); } diff --git a/applications/settings/about/about.c b/applications/settings/about/about.c index 973d1f4814..e066db25fc 100644 --- a/applications/settings/about/about.c +++ b/applications/settings/about/about.c @@ -1,9 +1,12 @@ #include -#include + #include -#include +#include #include + +#include #include + #include #include #include @@ -204,7 +207,8 @@ const AboutDialogScreen about_screens[] = { about_screen_cert_taiwan, about_screen_cert_mexico, about_screen_hw_version, - about_screen_fw_version}; + about_screen_fw_version, +}; int32_t about_settings_app(void* p) { UNUSED(p); @@ -212,18 +216,15 @@ int32_t about_settings_app(void* p) { DialogMessage* message = dialog_message_alloc(); Gui* gui = furi_record_open(RECORD_GUI); - ViewDispatcher* view_dispatcher = view_dispatcher_alloc(); + ViewHolder* view_holder = view_holder_alloc(); EmptyScreen* empty_screen = empty_screen_alloc(); - const uint32_t empty_screen_index = 0; size_t screen_index = 0; DialogMessageButton screen_result; // draw empty screen to prevent menu flickering - view_dispatcher_add_view( - view_dispatcher, empty_screen_index, empty_screen_get_view(empty_screen)); - view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen); - view_dispatcher_switch_to_view(view_dispatcher, empty_screen_index); + view_holder_attach_to_gui(view_holder, gui); + view_holder_set_view(view_holder, empty_screen_get_view(empty_screen)); while(1) { if(screen_index >= COUNT_OF(about_screens) - 1) { @@ -258,8 +259,8 @@ int32_t about_settings_app(void* p) { dialog_message_free(message); furi_record_close(RECORD_DIALOGS); - view_dispatcher_remove_view(view_dispatcher, empty_screen_index); - view_dispatcher_free(view_dispatcher); + view_holder_set_view(view_holder, NULL); + view_holder_free(view_holder); empty_screen_free(empty_screen); furi_record_close(RECORD_GUI); diff --git a/applications/settings/bt_settings_app/bt_settings_app.c b/applications/settings/bt_settings_app/bt_settings_app.c index 8972820644..174d0bcbb2 100644 --- a/applications/settings/bt_settings_app/bt_settings_app.c +++ b/applications/settings/bt_settings_app/bt_settings_app.c @@ -21,7 +21,6 @@ BtSettingsApp* bt_settings_app_alloc(void) { // View Dispatcher and Scene Manager app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&bt_settings_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( diff --git a/applications/settings/desktop_settings/desktop_settings_app.c b/applications/settings/desktop_settings/desktop_settings_app.c index a0ad102773..ab7782a7c4 100644 --- a/applications/settings/desktop_settings/desktop_settings_app.c +++ b/applications/settings/desktop_settings/desktop_settings_app.c @@ -27,7 +27,6 @@ DesktopSettingsApp* desktop_settings_app_alloc(void) { app->dialogs = furi_record_open(RECORD_DIALOGS); app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&desktop_settings_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( diff --git a/applications/settings/expansion_settings_app/expansion_settings_app.c b/applications/settings/expansion_settings_app/expansion_settings_app.c index 7544bea324..639f7f23d5 100644 --- a/applications/settings/expansion_settings_app/expansion_settings_app.c +++ b/applications/settings/expansion_settings_app/expansion_settings_app.c @@ -33,7 +33,6 @@ static ExpansionSettingsApp* expansion_settings_app_alloc(void) { app->expansion = furi_record_open(RECORD_EXPANSION); app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); diff --git a/applications/settings/notification_settings/notification_settings_app.c b/applications/settings/notification_settings/notification_settings_app.c index 2a7aa97e60..ada2bfdd42 100644 --- a/applications/settings/notification_settings/notification_settings_app.c +++ b/applications/settings/notification_settings/notification_settings_app.c @@ -230,7 +230,6 @@ static NotificationAppSettings* alloc_settings(void) { } app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); view_dispatcher_add_view(app->view_dispatcher, 0, view); view_dispatcher_switch_to_view(app->view_dispatcher, 0); diff --git a/applications/settings/power_settings_app/power_settings_app.c b/applications/settings/power_settings_app/power_settings_app.c index b01f32f75b..d43bd4108e 100644 --- a/applications/settings/power_settings_app/power_settings_app.c +++ b/applications/settings/power_settings_app/power_settings_app.c @@ -28,7 +28,6 @@ PowerSettingsApp* power_settings_app_alloc(uint32_t first_scene) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&power_settings_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( app->view_dispatcher, power_settings_custom_event_callback); diff --git a/applications/settings/power_settings_app/scenes/power_settings_scene_reboot_confirm.c b/applications/settings/power_settings_app/scenes/power_settings_scene_reboot_confirm.c index 62e06de927..25e7b2bc42 100644 --- a/applications/settings/power_settings_app/scenes/power_settings_scene_reboot_confirm.c +++ b/applications/settings/power_settings_app/scenes/power_settings_scene_reboot_confirm.c @@ -49,10 +49,12 @@ bool power_settings_scene_reboot_confirm_on_event(void* context, SceneManagerEve if(event.event == DialogExResultLeft) { scene_manager_previous_scene(app->scene_manager); } else if(event.event == DialogExResultRight) { + Power* power = furi_record_open(RECORD_POWER); + if(reboot_type == RebootTypeDFU) { - power_reboot(PowerBootModeDfu); + power_reboot(power, PowerBootModeDfu); } else { - power_reboot(PowerBootModeNormal); + power_reboot(power, PowerBootModeNormal); } } consumed = true; diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_factory_reset.c b/applications/settings/storage_settings/scenes/storage_settings_scene_factory_reset.c index 2d977176a0..0f8e1aa965 100644 --- a/applications/settings/storage_settings/scenes/storage_settings_scene_factory_reset.c +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_factory_reset.c @@ -65,7 +65,9 @@ bool storage_settings_scene_factory_reset_on_event(void* context, SceneManagerEv } else { furi_hal_rtc_reset_registers(); furi_hal_rtc_set_flag(FuriHalRtcFlagStorageFormatInternal); - power_reboot(PowerBootModeNormal); + + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeNormal); } consumed = true; diff --git a/applications/settings/storage_settings/storage_settings.c b/applications/settings/storage_settings/storage_settings.c index 0508e8e0fa..3546328904 100644 --- a/applications/settings/storage_settings/storage_settings.c +++ b/applications/settings/storage_settings/storage_settings.c @@ -23,7 +23,6 @@ static StorageSettings* storage_settings_alloc(void) { app->scene_manager = scene_manager_alloc(&storage_settings_scene_handlers, app); app->text_string = furi_string_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( diff --git a/applications/settings/system/system_settings.c b/applications/settings/system/system_settings.c index 636d49b42a..1197c7f511 100644 --- a/applications/settings/system/system_settings.c +++ b/applications/settings/system/system_settings.c @@ -220,7 +220,6 @@ SystemSettings* system_settings_alloc(void) { app->gui = furi_record_open(RECORD_GUI); app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); diff --git a/applications/system/hid_app/hid.c b/applications/system/hid_app/hid.c index c640e982c2..15c49e3b02 100644 --- a/applications/system/hid_app/hid.c +++ b/applications/system/hid_app/hid.c @@ -62,7 +62,6 @@ Hid* hid_alloc() { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback(app->view_dispatcher, hid_custom_event_callback); view_dispatcher_set_navigation_event_callback(app->view_dispatcher, hid_back_event_callback); diff --git a/applications/system/js_app/js_app.c b/applications/system/js_app/js_app.c index b389033122..d36f3c8dbf 100644 --- a/applications/system/js_app/js_app.c +++ b/applications/system/js_app/js_app.c @@ -69,7 +69,6 @@ static JsApp* js_app_alloc(void) { app->loading = loading_alloc(); app->gui = furi_record_open("gui"); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); view_dispatcher_add_view( app->view_dispatcher, JsAppViewLoading, loading_get_view(app->loading)); diff --git a/applications/system/js_app/modules/js_submenu.c b/applications/system/js_app/modules/js_submenu.c index 058b32fd09..5ab9bef77c 100644 --- a/applications/system/js_app/modules/js_submenu.c +++ b/applications/system/js_app/modules/js_submenu.c @@ -97,10 +97,9 @@ static void js_submenu_show(struct mjs* mjs) { view_holder_set_back_callback(submenu->view_holder, submenu_exit, submenu); view_holder_set_view(submenu->view_holder, submenu_get_view(submenu->submenu)); - view_holder_start(submenu->view_holder); api_lock_wait_unlock(submenu->lock); - view_holder_stop(submenu->view_holder); + view_holder_set_view(submenu->view_holder, NULL); view_holder_free(submenu->view_holder); furi_record_close(RECORD_GUI); api_lock_free(submenu->lock); diff --git a/applications/system/js_app/modules/js_textbox.c b/applications/system/js_app/modules/js_textbox.c index 33798b2965..b90dbc153a 100644 --- a/applications/system/js_app/modules/js_textbox.c +++ b/applications/system/js_app/modules/js_textbox.c @@ -125,7 +125,7 @@ static void js_textbox_is_open(struct mjs* mjs) { static void textbox_callback(void* context, uint32_t arg) { UNUSED(arg); JsTextboxInst* textbox = context; - view_holder_stop(textbox->view_holder); + view_holder_set_view(textbox->view_holder, NULL); textbox->is_shown = false; } @@ -145,7 +145,7 @@ static void js_textbox_show(struct mjs* mjs) { return; } - view_holder_start(textbox->view_holder); + view_holder_set_view(textbox->view_holder, text_box_get_view(textbox->text_box)); textbox->is_shown = true; mjs_return(mjs, MJS_UNDEFINED); @@ -155,7 +155,7 @@ static void js_textbox_close(struct mjs* mjs) { JsTextboxInst* textbox = get_this_ctx(mjs); if(!check_arg_count(mjs, 0)) return; - view_holder_stop(textbox->view_holder); + view_holder_set_view(textbox->view_holder, NULL); textbox->is_shown = false; mjs_return(mjs, MJS_UNDEFINED); @@ -180,7 +180,6 @@ static void* js_textbox_create(struct mjs* mjs, mjs_val_t* object) { textbox->view_holder = view_holder_alloc(); view_holder_attach_to_gui(textbox->view_holder, gui); view_holder_set_back_callback(textbox->view_holder, textbox_exit, textbox); - view_holder_set_view(textbox->view_holder, text_box_get_view(textbox->text_box)); *object = textbox_obj; return textbox; @@ -189,7 +188,7 @@ static void* js_textbox_create(struct mjs* mjs, mjs_val_t* object) { static void js_textbox_destroy(void* inst) { JsTextboxInst* textbox = inst; - view_holder_stop(textbox->view_holder); + view_holder_set_view(textbox->view_holder, NULL); view_holder_free(textbox->view_holder); textbox->view_holder = NULL; diff --git a/applications/system/updater/updater.c b/applications/system/updater/updater.c index 4c7fd29e9c..15d7dd3a94 100644 --- a/applications/system/updater/updater.c +++ b/applications/system/updater/updater.c @@ -47,8 +47,6 @@ Updater* updater_alloc(const char* arg) { updater->view_dispatcher = view_dispatcher_alloc(); updater->scene_manager = scene_manager_alloc(&updater_scene_handlers, updater); - view_dispatcher_enable_queue(updater->view_dispatcher); - view_dispatcher_set_event_callback_context(updater->view_dispatcher, updater); view_dispatcher_set_custom_event_callback( updater->view_dispatcher, updater_custom_event_callback); diff --git a/furi/core/event_loop.c b/furi/core/event_loop.c index feed8d6f44..2a6cd51d32 100644 --- a/furi/core/event_loop.c +++ b/furi/core/event_loop.c @@ -1,5 +1,4 @@ #include "event_loop_i.h" -#include "message_queue_i.h" #include "log.h" #include "check.h" @@ -22,13 +21,17 @@ static FuriEventLoopItem* furi_event_loop_item_alloc( static void furi_event_loop_item_free(FuriEventLoopItem* instance); +static void furi_event_loop_item_free_later(FuriEventLoopItem* instance); + static void furi_event_loop_item_set_callback( FuriEventLoopItem* instance, - FuriEventLoopMessageQueueCallback callback, + FuriEventLoopEventCallback callback, void* callback_context); static void furi_event_loop_item_notify(FuriEventLoopItem* instance); +static bool furi_event_loop_item_is_waiting(FuriEventLoopItem* instance); + static void furi_event_loop_process_pending_callbacks(FuriEventLoop* instance) { for(; !PendingQueue_empty_p(instance->pending_queue); PendingQueue_pop_back(NULL, instance->pending_queue)) { @@ -37,6 +40,21 @@ static void furi_event_loop_process_pending_callbacks(FuriEventLoop* instance) { } } +static bool furi_event_loop_signal_callback(uint32_t signal, void* arg, void* context) { + furi_assert(context); + FuriEventLoop* instance = context; + UNUSED(arg); + + switch(signal) { + case FuriSignalExit: + furi_event_loop_stop(instance); + return true; + // Room for possible other standard signal handlers + default: + return false; + } +} + /* * Main public API */ @@ -67,6 +85,7 @@ void furi_event_loop_free(FuriEventLoop* instance) { furi_event_loop_process_timer_queue(instance); furi_check(TimerList_empty_p(instance->timer_list)); + furi_check(WaitingList_empty_p(instance->waiting_list)); FuriEventLoopTree_clear(instance->tree); PendingQueue_clear(instance->pending_queue); @@ -81,21 +100,81 @@ void furi_event_loop_free(FuriEventLoop* instance) { free(instance); } -static FuriEventLoopProcessStatus - furi_event_loop_poll_process_event(FuriEventLoop* instance, FuriEventLoopItem* item) { - UNUSED(instance); - +static inline FuriEventLoopProcessStatus + furi_event_loop_poll_process_level_event(FuriEventLoopItem* item) { if(!item->contract->get_level(item->object, item->event)) { return FuriEventLoopProcessStatusComplete; + } else if(item->callback(item->object, item->callback_context)) { + return FuriEventLoopProcessStatusIncomplete; + } else { + return FuriEventLoopProcessStatusAgain; } +} +static inline FuriEventLoopProcessStatus + furi_event_loop_poll_process_edge_event(FuriEventLoopItem* item) { if(item->callback(item->object, item->callback_context)) { - return FuriEventLoopProcessStatusIncomplete; + return FuriEventLoopProcessStatusComplete; } else { return FuriEventLoopProcessStatusAgain; } } +static inline FuriEventLoopProcessStatus + furi_event_loop_poll_process_event(FuriEventLoop* instance, FuriEventLoopItem* item) { + FuriEventLoopProcessStatus status; + if(item->event & FuriEventLoopEventFlagOnce) { + furi_event_loop_unsubscribe(instance, item->object); + } + + if(item->event & FuriEventLoopEventFlagEdge) { + status = furi_event_loop_poll_process_edge_event(item); + } else { + status = furi_event_loop_poll_process_level_event(item); + } + + if(item->owner == NULL) { + status = FuriEventLoopProcessStatusFreeLater; + } + + return status; +} + +static void furi_event_loop_process_waiting_list(FuriEventLoop* instance) { + FuriEventLoopItem* item = NULL; + + FURI_CRITICAL_ENTER(); + + if(!WaitingList_empty_p(instance->waiting_list)) { + item = WaitingList_pop_front(instance->waiting_list); + WaitingList_init_field(item); + } + + FURI_CRITICAL_EXIT(); + + if(!item) return; + + while(true) { + FuriEventLoopProcessStatus ret = furi_event_loop_poll_process_event(instance, item); + + if(ret == FuriEventLoopProcessStatusComplete) { + // Event processing complete, break from loop + break; + } else if(ret == FuriEventLoopProcessStatusIncomplete) { + // Event processing incomplete more processing needed + } else if(ret == FuriEventLoopProcessStatusAgain) { //-V547 + furi_event_loop_item_notify(item); + break; + // Unsubscribed from inside the callback, delete item + } else if(ret == FuriEventLoopProcessStatusFreeLater) { //-V547 + furi_event_loop_item_free(item); + break; + } else { + furi_crash(); + } + } +} + static void furi_event_loop_restore_flags(FuriEventLoop* instance, uint32_t flags) { if(flags) { xTaskNotifyIndexed( @@ -134,34 +213,7 @@ void furi_event_loop_run(FuriEventLoop* instance) { break; } else if(flags & FuriEventLoopFlagEvent) { - FuriEventLoopItem* item = NULL; - FURI_CRITICAL_ENTER(); - - if(!WaitingList_empty_p(instance->waiting_list)) { - item = WaitingList_pop_front(instance->waiting_list); - WaitingList_init_field(item); - } - - FURI_CRITICAL_EXIT(); - - if(item) { - while(true) { - FuriEventLoopProcessStatus ret = - furi_event_loop_poll_process_event(instance, item); - if(ret == FuriEventLoopProcessStatusComplete) { - // Event processing complete, break from loop - break; - } else if(ret == FuriEventLoopProcessStatusIncomplete) { - // Event processing incomplete more processing needed - } else if(ret == FuriEventLoopProcessStatusAgain) { //-V547 - furi_event_loop_item_notify(item); - break; - } else { - furi_crash(); - } - } - } - + furi_event_loop_process_waiting_list(instance); furi_event_loop_restore_flags(instance, flags & ~FuriEventLoopFlagEvent); } else if(flags & FuriEventLoopFlagTimer) { @@ -217,87 +269,150 @@ void furi_event_loop_pend_callback( } /* - * Message queue API + * Private generic susbscription API */ -void furi_event_loop_message_queue_subscribe( +static void furi_event_loop_object_subscribe( FuriEventLoop* instance, - FuriMessageQueue* message_queue, + FuriEventLoopObject* object, + const FuriEventLoopContract* contract, FuriEventLoopEvent event, - FuriEventLoopMessageQueueCallback callback, + FuriEventLoopEventCallback callback, void* context) { furi_check(instance); furi_check(instance->thread_id == furi_thread_get_current_id()); - furi_check(instance->state == FuriEventLoopStateStopped); - furi_check(message_queue); + furi_check(object); + furi_assert(contract); + furi_check(callback); FURI_CRITICAL_ENTER(); - furi_check(FuriEventLoopTree_get(instance->tree, message_queue) == NULL); + furi_check(FuriEventLoopTree_get(instance->tree, object) == NULL); // Allocate and setup item - FuriEventLoopItem* item = furi_event_loop_item_alloc( - instance, &furi_message_queue_event_loop_contract, message_queue, event); + FuriEventLoopItem* item = furi_event_loop_item_alloc(instance, contract, object, event); furi_event_loop_item_set_callback(item, callback, context); - FuriEventLoopTree_set_at(instance->tree, message_queue, item); + FuriEventLoopTree_set_at(instance->tree, object, item); - FuriEventLoopLink* link = item->contract->get_link(message_queue); + FuriEventLoopLink* link = item->contract->get_link(object); + FuriEventLoopEvent event_noflags = item->event & FuriEventLoopEventMask; - if(item->event == FuriEventLoopEventIn) { + if(event_noflags == FuriEventLoopEventIn) { furi_check(link->item_in == NULL); link->item_in = item; - } else if(item->event == FuriEventLoopEventOut) { + } else if(event_noflags == FuriEventLoopEventOut) { furi_check(link->item_out == NULL); link->item_out = item; } else { furi_crash(); } - if(item->contract->get_level(item->object, item->event)) { - furi_event_loop_item_notify(item); + if(!(item->event & FuriEventLoopEventFlagEdge)) { + if(item->contract->get_level(item->object, event_noflags)) { + furi_event_loop_item_notify(item); + } } FURI_CRITICAL_EXIT(); } -void furi_event_loop_message_queue_unsubscribe( +/** + * Public specialized subscription API + */ + +void furi_event_loop_subscribe_message_queue( FuriEventLoop* instance, - FuriMessageQueue* message_queue) { + FuriMessageQueue* message_queue, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, + void* context) { + extern const FuriEventLoopContract furi_message_queue_event_loop_contract; + + furi_event_loop_object_subscribe( + instance, message_queue, &furi_message_queue_event_loop_contract, event, callback, context); +} + +void furi_event_loop_subscribe_stream_buffer( + FuriEventLoop* instance, + FuriStreamBuffer* stream_buffer, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, + void* context) { + extern const FuriEventLoopContract furi_stream_buffer_event_loop_contract; + + furi_event_loop_object_subscribe( + instance, stream_buffer, &furi_stream_buffer_event_loop_contract, event, callback, context); +} + +void furi_event_loop_subscribe_semaphore( + FuriEventLoop* instance, + FuriSemaphore* semaphore, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, + void* context) { + extern const FuriEventLoopContract furi_semaphore_event_loop_contract; + + furi_event_loop_object_subscribe( + instance, semaphore, &furi_semaphore_event_loop_contract, event, callback, context); +} + +void furi_event_loop_subscribe_mutex( + FuriEventLoop* instance, + FuriMutex* mutex, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, + void* context) { + extern const FuriEventLoopContract furi_mutex_event_loop_contract; + + furi_event_loop_object_subscribe( + instance, mutex, &furi_mutex_event_loop_contract, event, callback, context); +} + +/** + * Public generic unsubscription API + */ + +void furi_event_loop_unsubscribe(FuriEventLoop* instance, FuriEventLoopObject* object) { furi_check(instance); - furi_check(instance->state == FuriEventLoopStateStopped); furi_check(instance->thread_id == furi_thread_get_current_id()); FURI_CRITICAL_ENTER(); - FuriEventLoopItem** item_ptr = FuriEventLoopTree_get(instance->tree, message_queue); - furi_check(item_ptr); + FuriEventLoopItem* item = NULL; + furi_check(FuriEventLoopTree_pop_at(&item, instance->tree, object)); - FuriEventLoopItem* item = *item_ptr; furi_check(item); furi_check(item->owner == instance); - FuriEventLoopLink* link = item->contract->get_link(message_queue); + FuriEventLoopLink* link = item->contract->get_link(object); + FuriEventLoopEvent event_noflags = item->event & FuriEventLoopEventMask; - if(item->event == FuriEventLoopEventIn) { + if(event_noflags == FuriEventLoopEventIn) { furi_check(link->item_in == item); link->item_in = NULL; - } else if(item->event == FuriEventLoopEventOut) { + } else if(event_noflags == FuriEventLoopEventOut) { furi_check(link->item_out == item); link->item_out = NULL; } else { furi_crash(); } - furi_event_loop_item_free(item); + if(furi_event_loop_item_is_waiting(item)) { + WaitingList_unlink(item); + } - FuriEventLoopTree_erase(instance->tree, message_queue); + if(instance->state == FuriEventLoopStateProcessing) { + furi_event_loop_item_free_later(item); + } else { + furi_event_loop_item_free(item); + } FURI_CRITICAL_EXIT(); } /* - * Event Loop Item API, used internally + * Private Event Loop Item functions */ static FuriEventLoopItem* furi_event_loop_item_alloc( @@ -322,12 +437,19 @@ static FuriEventLoopItem* furi_event_loop_item_alloc( static void furi_event_loop_item_free(FuriEventLoopItem* instance) { furi_assert(instance); + furi_assert(!furi_event_loop_item_is_waiting(instance)); free(instance); } +static void furi_event_loop_item_free_later(FuriEventLoopItem* instance) { + furi_assert(instance); + furi_assert(!furi_event_loop_item_is_waiting(instance)); + instance->owner = NULL; +} + static void furi_event_loop_item_set_callback( FuriEventLoopItem* instance, - FuriEventLoopMessageQueueCallback callback, + FuriEventLoopEventCallback callback, void* callback_context) { furi_assert(instance); furi_assert(!instance->callback); @@ -341,27 +463,35 @@ static void furi_event_loop_item_notify(FuriEventLoopItem* instance) { FURI_CRITICAL_ENTER(); - if(!instance->WaitingList.prev && !instance->WaitingList.next) { - WaitingList_push_back(instance->owner->waiting_list, instance); + FuriEventLoop* owner = instance->owner; + furi_assert(owner); + + if(!furi_event_loop_item_is_waiting(instance)) { + WaitingList_push_back(owner->waiting_list, instance); } FURI_CRITICAL_EXIT(); xTaskNotifyIndexed( - instance->owner->thread_id, - FURI_EVENT_LOOP_FLAG_NOTIFY_INDEX, - FuriEventLoopFlagEvent, - eSetBits); + owner->thread_id, FURI_EVENT_LOOP_FLAG_NOTIFY_INDEX, FuriEventLoopFlagEvent, eSetBits); +} + +static bool furi_event_loop_item_is_waiting(FuriEventLoopItem* instance) { + return instance->WaitingList.prev || instance->WaitingList.next; } +/* + * Internal event loop link API, used by supported primitives + */ + void furi_event_loop_link_notify(FuriEventLoopLink* instance, FuriEventLoopEvent event) { furi_assert(instance); FURI_CRITICAL_ENTER(); - if(event == FuriEventLoopEventIn) { + if(event & FuriEventLoopEventIn) { if(instance->item_in) furi_event_loop_item_notify(instance->item_in); - } else if(event == FuriEventLoopEventOut) { + } else if(event & FuriEventLoopEventOut) { if(instance->item_out) furi_event_loop_item_notify(instance->item_out); } else { furi_crash(); @@ -369,18 +499,3 @@ void furi_event_loop_link_notify(FuriEventLoopLink* instance, FuriEventLoopEvent FURI_CRITICAL_EXIT(); } - -bool furi_event_loop_signal_callback(uint32_t signal, void* arg, void* context) { - furi_assert(context); - FuriEventLoop* instance = context; - UNUSED(arg); - - switch(signal) { - case FuriSignalExit: - furi_event_loop_stop(instance); - return true; - // Room for possible other standard signal handlers - default: - return false; - } -} diff --git a/furi/core/event_loop.h b/furi/core/event_loop.h index 9ae9f6c4dd..af5987101d 100644 --- a/furi/core/event_loop.h +++ b/furi/core/event_loop.h @@ -20,10 +20,83 @@ extern "C" { #endif -/** Event Loop events */ +/** + * @brief Enumeration of event types, flags and masks. + * + * Only one event direction (In or Out) can be used per subscription. + * An object can have no more than one subscription for each direction. + * + * Additional flags that modify the behaviour can be + * set using the bitwise OR operation (see flag description). + */ typedef enum { - FuriEventLoopEventOut, /**< On departure: item was retrieved from container, flag reset, etc... */ - FuriEventLoopEventIn, /**< On arrival: item was inserted into container, flag set, etc... */ + /** + * @brief Subscribe to In events. + * + * In events occur on the following conditions: + * - One or more items were inserted into a FuriMessageQueue, + * - Enough data has been written to a FuriStreamBuffer, + * - A FuriSemaphore has been released at least once, + * - A FuriMutex has been released. + */ + FuriEventLoopEventIn = 0x00000001U, + /** + * @brief Subscribe to Out events. + * + * Out events occur on the following conditions: + * - One or more items were removed from a FuriMessageQueue, + * - Any amount of data has been read out of a FuriStreamBuffer, + * - A FuriSemaphore has been acquired at least once, + * - A FuriMutex has been acquired. + */ + FuriEventLoopEventOut = 0x00000002U, + /** + * @brief Special value containing the event direction bits, used internally. + */ + FuriEventLoopEventMask = 0x00000003U, + /** + * @brief Use edge triggered events. + * + * By default, level triggered events are used. A level above zero + * is reported based on the following conditions: + * + * In events: + * - a FuriMessageQueue contains one or more items, + * - a FuriStreamBuffer contains one or more bytes, + * - a FuriSemaphore can be acquired at least once, + * - a FuriMutex can be acquired. + * + * Out events: + * - a FuriMessageQueue has at least one item of free space, + * - a FuriStreamBuffer has at least one byte of free space, + * - a FuriSemaphore has been acquired at least once, + * - a FuriMutex has been acquired. + * + * If this flag is NOT set, the event will be generated repeatedly until + * the level becomes zero (e.g. all items have been removed from + * a FuriMessageQueue in case of the "In" event, etc.) + * + * If this flag IS set, then the above check is skipped and the event + * is generated ONLY when a change occurs, with the event direction + * (In or Out) taken into account. + */ + FuriEventLoopEventFlagEdge = 0x00000004U, + /** + * @brief Automatically unsubscribe from events after one time. + * + * By default, events will be generated each time the specified conditions + * have been met. If this flag IS set, the event subscription will be cancelled + * upon the first occurred event and no further events will be generated. + */ + FuriEventLoopEventFlagOnce = 0x00000008U, + /** + * @brief Special value containing the event flag bits, used internally. + */ + FuriEventLoopEventFlagMask = 0xFFFFFFFCU, + /** + * @brief Special value to force the enum to 32-bit values. + */ + FuriEventLoopEventReserved = UINT32_MAX, } FuriEventLoopEvent; /** Anonymous message queue type */ @@ -115,21 +188,22 @@ void furi_event_loop_pend_callback( void* context); /* - * Message queue related APIs + * Event subscription/notification APIs */ -/** Anonymous message queue type */ -typedef struct FuriMessageQueue FuriMessageQueue; +typedef void FuriEventLoopObject; -/** Callback type for message queue +/** Callback type for event loop events * - * @param queue The queue that triggered event - * @param context The context that was provided on - * furi_event_loop_message_queue_subscribe call + * @param object The object that triggered the event + * @param context The context that was provided upon subscription * * @return true if event was processed, false if we need to delay processing */ -typedef bool (*FuriEventLoopMessageQueueCallback)(FuriMessageQueue* queue, void* context); +typedef bool (*FuriEventLoopEventCallback)(FuriEventLoopObject* object, void* context); + +/** Opaque message queue type */ +typedef struct FuriMessageQueue FuriMessageQueue; /** Subscribe to message queue events * @@ -141,21 +215,79 @@ typedef bool (*FuriEventLoopMessageQueueCallback)(FuriMessageQueue* queue, void* * @param[in] callback The callback to call on event * @param context The context for callback */ -void furi_event_loop_message_queue_subscribe( +void furi_event_loop_subscribe_message_queue( FuriEventLoop* instance, FuriMessageQueue* message_queue, FuriEventLoopEvent event, - FuriEventLoopMessageQueueCallback callback, + FuriEventLoopEventCallback callback, + void* context); + +/** Opaque stream buffer type */ +typedef struct FuriStreamBuffer FuriStreamBuffer; + +/** Subscribe to stream buffer events + * + * @warning you can only have one subscription for one event type. + * + * @param instance The Event Loop instance + * @param stream_buffer The stream buffer to add + * @param[in] event The Event Loop event to trigger on + * @param[in] callback The callback to call on event + * @param context The context for callback + */ +void furi_event_loop_subscribe_stream_buffer( + FuriEventLoop* instance, + FuriStreamBuffer* stream_buffer, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, + void* context); + +/** Opaque semaphore type */ +typedef struct FuriSemaphore FuriSemaphore; + +/** Subscribe to semaphore events + * + * @warning you can only have one subscription for one event type. + * + * @param instance The Event Loop instance + * @param semaphore The semaphore to add + * @param[in] event The Event Loop event to trigger on + * @param[in] callback The callback to call on event + * @param context The context for callback + */ +void furi_event_loop_subscribe_semaphore( + FuriEventLoop* instance, + FuriSemaphore* semaphore, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, void* context); -/** Unsubscribe from message queue +/** Opaque mutex type */ +typedef struct FuriMutex FuriMutex; + +/** Subscribe to mutex events + * + * @warning you can only have one subscription for one event type. * * @param instance The Event Loop instance - * @param message_queue The message queue + * @param mutex The mutex to add + * @param[in] event The Event Loop event to trigger on + * @param[in] callback The callback to call on event + * @param context The context for callback */ -void furi_event_loop_message_queue_unsubscribe( +void furi_event_loop_subscribe_mutex( FuriEventLoop* instance, - FuriMessageQueue* message_queue); + FuriMutex* mutex, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, + void* context); + +/** Unsubscribe from events (common) + * + * @param instance The Event Loop instance + * @param object The object to unsubscribe from + */ +void furi_event_loop_unsubscribe(FuriEventLoop* instance, FuriEventLoopObject* object); #ifdef __cplusplus } diff --git a/furi/core/event_loop_i.h b/furi/core/event_loop_i.h index cd10148673..15efa8f864 100644 --- a/furi/core/event_loop_i.h +++ b/furi/core/event_loop_i.h @@ -16,16 +16,16 @@ struct FuriEventLoopItem { FuriEventLoop* owner; // Tracking item - const FuriEventLoopContract* contract; - void* object; FuriEventLoopEvent event; + FuriEventLoopObject* object; + const FuriEventLoopContract* contract; // Callback and context - FuriEventLoopMessageQueueCallback callback; + FuriEventLoopEventCallback callback; void* callback_context; // Waiting list - ILIST_INTERFACE(WaitingList, struct FuriEventLoopItem); + ILIST_INTERFACE(WaitingList, FuriEventLoopItem); }; ILIST_DEF(WaitingList, FuriEventLoopItem, M_POD_OPLIST) @@ -36,7 +36,7 @@ ILIST_DEF(WaitingList, FuriEventLoopItem, M_POD_OPLIST) BPTREE_DEF2( // NOLINT FuriEventLoopTree, FURI_EVENT_LOOP_TREE_RANK, - void*, /* pointer to object we track */ + FuriEventLoopObject*, /* pointer to object we track */ M_PTR_OPLIST, FuriEventLoopItem*, /* pointer to the FuriEventLoopItem */ M_PTR_OPLIST) @@ -60,6 +60,7 @@ typedef enum { FuriEventLoopProcessStatusComplete, FuriEventLoopProcessStatusIncomplete, FuriEventLoopProcessStatusAgain, + FuriEventLoopProcessStatusFreeLater, } FuriEventLoopProcessStatus; typedef enum { diff --git a/furi/core/event_loop_link_i.h b/furi/core/event_loop_link_i.h index 5c0b144a1b..992ca65555 100644 --- a/furi/core/event_loop_link_i.h +++ b/furi/core/event_loop_link_i.h @@ -19,17 +19,16 @@ void furi_event_loop_link_notify(FuriEventLoopLink* instance, FuriEventLoopEvent /* Contract between event loop and an object */ -typedef FuriEventLoopLink* (*FuriEventLoopContractGetLink)(void* object); +typedef FuriEventLoopLink* (*FuriEventLoopContractGetLink)(FuriEventLoopObject* object); -typedef uint32_t (*FuriEventLoopContractGetLevel)(void* object, FuriEventLoopEvent event); +typedef uint32_t ( + *FuriEventLoopContractGetLevel)(FuriEventLoopObject* object, FuriEventLoopEvent event); typedef struct { const FuriEventLoopContractGetLink get_link; const FuriEventLoopContractGetLevel get_level; } FuriEventLoopContract; -bool furi_event_loop_signal_callback(uint32_t signal, void* arg, void* context); - #ifdef __cplusplus } #endif diff --git a/furi/core/message_queue.c b/furi/core/message_queue.c index 3521ceb30b..bd0cec0214 100644 --- a/furi/core/message_queue.c +++ b/furi/core/message_queue.c @@ -1,4 +1,4 @@ -#include "message_queue_i.h" +#include "message_queue.h" #include #include @@ -6,6 +6,8 @@ #include "kernel.h" #include "check.h" +#include "event_loop_link_i.h" + // Internal FreeRTOS member names #define uxMessagesWaiting uxDummy4[0] #define uxLength uxDummy4[1] @@ -13,10 +15,7 @@ struct FuriMessageQueue { StaticQueue_t container; - - // Event Loop Link FuriEventLoopLink event_loop_link; - uint8_t buffer[]; }; @@ -208,13 +207,14 @@ FuriStatus furi_message_queue_reset(FuriMessageQueue* instance) { return stat; } -static FuriEventLoopLink* furi_message_queue_event_loop_get_link(void* object) { +static FuriEventLoopLink* furi_message_queue_event_loop_get_link(FuriEventLoopObject* object) { FuriMessageQueue* instance = object; furi_assert(instance); return &instance->event_loop_link; } -static uint32_t furi_message_queue_event_loop_get_level(void* object, FuriEventLoopEvent event) { +static uint32_t + furi_message_queue_event_loop_get_level(FuriEventLoopObject* object, FuriEventLoopEvent event) { FuriMessageQueue* instance = object; furi_assert(instance); diff --git a/furi/core/message_queue_i.h b/furi/core/message_queue_i.h deleted file mode 100644 index a88d04131a..0000000000 --- a/furi/core/message_queue_i.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "message_queue.h" -#include "event_loop_link_i.h" - -extern const FuriEventLoopContract furi_message_queue_event_loop_contract; diff --git a/furi/core/mutex.c b/furi/core/mutex.c index f59ae83ada..f9848e1baa 100644 --- a/furi/core/mutex.c +++ b/furi/core/mutex.c @@ -1,15 +1,18 @@ #include "mutex.h" -#include "check.h" -#include "common_defines.h" #include #include +#include "check.h" + +#include "event_loop_link_i.h" + // Internal FreeRTOS member names #define ucQueueType ucDummy9 struct FuriMutex { StaticSemaphore_t container; + FuriEventLoopLink event_loop_link; }; // IMPORTANT: container MUST be the FIRST struct member @@ -39,6 +42,10 @@ void furi_mutex_free(FuriMutex* instance) { furi_check(!FURI_IS_IRQ_MODE()); furi_check(instance); + // Event Loop must be disconnected + furi_check(!instance->event_loop_link.item_in); + furi_check(!instance->event_loop_link.item_out); + vSemaphoreDelete((SemaphoreHandle_t)instance); free(instance); } @@ -76,6 +83,10 @@ FuriStatus furi_mutex_acquire(FuriMutex* instance, uint32_t timeout) { furi_crash(); } + if(stat == FuriStatusOk) { + furi_event_loop_link_notify(&instance->event_loop_link, FuriEventLoopEventOut); + } + return stat; } @@ -104,6 +115,10 @@ FuriStatus furi_mutex_release(FuriMutex* instance) { furi_crash(); } + if(stat == FuriStatusOk) { + furi_event_loop_link_notify(&instance->event_loop_link, FuriEventLoopEventIn); + } + return stat; } @@ -122,3 +137,26 @@ FuriThreadId furi_mutex_get_owner(FuriMutex* instance) { return owner; } + +static FuriEventLoopLink* furi_mutex_event_loop_get_link(FuriEventLoopObject* object) { + FuriMutex* instance = object; + furi_assert(instance); + return &instance->event_loop_link; +} + +static uint32_t + furi_mutex_event_loop_get_level(FuriEventLoopObject* object, FuriEventLoopEvent event) { + FuriMutex* instance = object; + furi_assert(instance); + + if(event == FuriEventLoopEventIn || event == FuriEventLoopEventOut) { + return furi_mutex_get_owner(instance) ? 0 : 1; + } else { + furi_crash(); + } +} + +const FuriEventLoopContract furi_mutex_event_loop_contract = { + .get_link = furi_mutex_event_loop_get_link, + .get_level = furi_mutex_event_loop_get_level, +}; diff --git a/furi/core/semaphore.c b/furi/core/semaphore.c index 6413eb65f5..850169ad6e 100644 --- a/furi/core/semaphore.c +++ b/furi/core/semaphore.c @@ -1,12 +1,20 @@ #include "semaphore.h" -#include "check.h" -#include "common_defines.h" #include #include +#include "check.h" +#include "kernel.h" + +#include "event_loop_link_i.h" + +// Internal FreeRTOS member names +#define uxMessagesWaiting uxDummy4[0] +#define uxLength uxDummy4[1] + struct FuriSemaphore { StaticSemaphore_t container; + FuriEventLoopLink event_loop_link; }; // IMPORTANT: container MUST be the FIRST struct member @@ -40,6 +48,10 @@ void furi_semaphore_free(FuriSemaphore* instance) { furi_check(instance); furi_check(!FURI_IS_IRQ_MODE()); + // Event Loop must be disconnected + furi_check(!instance->event_loop_link.item_in); + furi_check(!instance->event_loop_link.item_out); + vSemaphoreDelete((SemaphoreHandle_t)instance); free(instance); } @@ -76,6 +88,10 @@ FuriStatus furi_semaphore_acquire(FuriSemaphore* instance, uint32_t timeout) { } } + if(stat == FuriStatusOk) { + furi_event_loop_link_notify(&instance->event_loop_link, FuriEventLoopEventOut); + } + return stat; } @@ -103,6 +119,10 @@ FuriStatus furi_semaphore_release(FuriSemaphore* instance) { } } + if(stat == FuriStatusOk) { + furi_event_loop_link_notify(&instance->event_loop_link, FuriEventLoopEventIn); + } + return stat; } @@ -120,3 +140,46 @@ uint32_t furi_semaphore_get_count(FuriSemaphore* instance) { return count; } + +uint32_t furi_semaphore_get_space(FuriSemaphore* instance) { + furi_assert(instance); + + uint32_t space; + + if(furi_kernel_is_irq_or_masked() != 0U) { + uint32_t isrm = taskENTER_CRITICAL_FROM_ISR(); + + space = instance->container.uxLength - instance->container.uxMessagesWaiting; + + taskEXIT_CRITICAL_FROM_ISR(isrm); + } else { + space = uxQueueSpacesAvailable((QueueHandle_t)instance); + } + + return space; +} + +static FuriEventLoopLink* furi_semaphore_event_loop_get_link(FuriEventLoopObject* object) { + FuriSemaphore* instance = object; + furi_assert(instance); + return &instance->event_loop_link; +} + +static uint32_t + furi_semaphore_event_loop_get_level(FuriEventLoopObject* object, FuriEventLoopEvent event) { + FuriSemaphore* instance = object; + furi_assert(instance); + + if(event == FuriEventLoopEventIn) { + return furi_semaphore_get_count(instance); + } else if(event == FuriEventLoopEventOut) { + return furi_semaphore_get_space(instance); + } else { + furi_crash(); + } +} + +const FuriEventLoopContract furi_semaphore_event_loop_contract = { + .get_link = furi_semaphore_event_loop_get_link, + .get_level = furi_semaphore_event_loop_get_level, +}; diff --git a/furi/core/semaphore.h b/furi/core/semaphore.h index c6b9a1176a..47a77ed558 100644 --- a/furi/core/semaphore.h +++ b/furi/core/semaphore.h @@ -53,6 +53,14 @@ FuriStatus furi_semaphore_release(FuriSemaphore* instance); */ uint32_t furi_semaphore_get_count(FuriSemaphore* instance); +/** Get available space + * + * @param instance The pointer to FuriSemaphore instance + * + * @return Semaphore available space + */ +uint32_t furi_semaphore_get_space(FuriSemaphore* instance); + #ifdef __cplusplus } #endif diff --git a/furi/core/stream_buffer.c b/furi/core/stream_buffer.c index ef8869dea0..f35abec647 100644 --- a/furi/core/stream_buffer.c +++ b/furi/core/stream_buffer.c @@ -1,13 +1,19 @@ #include "stream_buffer.h" +#include +#include + #include "check.h" #include "common_defines.h" -#include -#include +#include "event_loop_link_i.h" + +// Internal FreeRTOS member names +#define xTriggerLevelBytes uxDummy1[3] struct FuriStreamBuffer { StaticStreamBuffer_t container; + FuriEventLoopLink event_loop_link; uint8_t buffer[]; }; @@ -34,6 +40,10 @@ FuriStreamBuffer* furi_stream_buffer_alloc(size_t size, size_t trigger_level) { void furi_stream_buffer_free(FuriStreamBuffer* stream_buffer) { furi_check(stream_buffer); + // Event Loop must be disconnected + furi_check(!stream_buffer->event_loop_link.item_in); + furi_check(!stream_buffer->event_loop_link.item_out); + vStreamBufferDelete((StreamBufferHandle_t)stream_buffer); free(stream_buffer); } @@ -61,6 +71,16 @@ size_t furi_stream_buffer_send( ret = xStreamBufferSend((StreamBufferHandle_t)stream_buffer, data, length, timeout); } + if(ret > 0) { + const size_t bytes_available = + xStreamBufferBytesAvailable((StreamBufferHandle_t)stream_buffer); + const size_t trigger_level = ((StaticStreamBuffer_t*)stream_buffer)->xTriggerLevelBytes; + + if(bytes_available >= trigger_level) { + furi_event_loop_link_notify(&stream_buffer->event_loop_link, FuriEventLoopEventIn); + } + } + return ret; } @@ -82,6 +102,10 @@ size_t furi_stream_buffer_receive( ret = xStreamBufferReceive((StreamBufferHandle_t)stream_buffer, data, length, timeout); } + if(ret > 0) { + furi_event_loop_link_notify(&stream_buffer->event_loop_link, FuriEventLoopEventOut); + } + return ret; } @@ -112,9 +136,42 @@ bool furi_stream_buffer_is_empty(FuriStreamBuffer* stream_buffer) { FuriStatus furi_stream_buffer_reset(FuriStreamBuffer* stream_buffer) { furi_check(stream_buffer); + FuriStatus status; + if(xStreamBufferReset((StreamBufferHandle_t)stream_buffer) == pdPASS) { - return FuriStatusOk; + status = FuriStatusOk; } else { - return FuriStatusError; + status = FuriStatusError; + } + + if(status == FuriStatusOk) { + furi_event_loop_link_notify(&stream_buffer->event_loop_link, FuriEventLoopEventOut); + } + + return status; +} + +static FuriEventLoopLink* furi_stream_buffer_event_loop_get_link(FuriEventLoopObject* object) { + FuriStreamBuffer* stream_buffer = object; + furi_assert(stream_buffer); + return &stream_buffer->event_loop_link; +} + +static uint32_t + furi_stream_buffer_event_loop_get_level(FuriEventLoopObject* object, FuriEventLoopEvent event) { + FuriStreamBuffer* stream_buffer = object; + furi_assert(stream_buffer); + + if(event == FuriEventLoopEventIn) { + return xStreamBufferBytesAvailable((StreamBufferHandle_t)stream_buffer); + } else if(event == FuriEventLoopEventOut) { + return xStreamBufferSpacesAvailable((StreamBufferHandle_t)stream_buffer); + } else { + furi_crash(); } } + +const FuriEventLoopContract furi_stream_buffer_event_loop_contract = { + .get_link = furi_stream_buffer_event_loop_get_link, + .get_level = furi_stream_buffer_event_loop_get_level, +}; diff --git a/lib/SConscript b/lib/SConscript index 7f13aad445..fb0473f8d4 100644 --- a/lib/SConscript +++ b/lib/SConscript @@ -32,7 +32,6 @@ libs = env.BuildModules( "digital_signal", "pulse_reader", "signal_reader", - "appframe", "u8g2", "lfrfid", "flipper_application", diff --git a/lib/app-scened-template/generic_scene.hpp b/lib/app-scened-template/generic_scene.hpp deleted file mode 100644 index 580346c8c0..0000000000 --- a/lib/app-scened-template/generic_scene.hpp +++ /dev/null @@ -1,10 +0,0 @@ -template -class GenericScene { -public: - virtual void on_enter(TApp* app, bool need_restore) = 0; - virtual bool on_event(TApp* app, typename TApp::Event* event) = 0; - virtual void on_exit(TApp* app) = 0; - virtual ~GenericScene() {}; - -private: -}; diff --git a/lib/app-scened-template/record_controller.hpp b/lib/app-scened-template/record_controller.hpp deleted file mode 100644 index 3453c12f3a..0000000000 --- a/lib/app-scened-template/record_controller.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include - -/** - * @brief Class for opening, casting, holding and closing records - * - * @tparam TRecordClass record class - */ -template -class RecordController { -public: - /** - * @brief Construct a new Record Controller object for record with record name - * - * @param record_name record name - */ - RecordController(const char* record_name) { - name = record_name; - value = static_cast(furi_record_open(name)); - } - - ~RecordController() { - furi_record_close(name); - } - - /** - * @brief Record getter - * - * @return TRecordClass* record value - */ - TRecordClass* get() { - return value; - } - - /** - * @brief Record getter (by cast) - * - * @return TRecordClass* record value - */ - operator TRecordClass*() const { - return value; - } - -private: - const char* name; - TRecordClass* value; -}; diff --git a/lib/app-scened-template/scene_controller.hpp b/lib/app-scened-template/scene_controller.hpp deleted file mode 100644 index eb43109584..0000000000 --- a/lib/app-scened-template/scene_controller.hpp +++ /dev/null @@ -1,246 +0,0 @@ -#include -#include -#include - -#define GENERIC_SCENE_ENUM_VALUES Exit, Start -#define GENERIC_EVENT_ENUM_VALUES Tick, Back - -/** - * @brief Controller for scene navigation in application - * - * @tparam TScene generic scene class - * @tparam TApp application class - */ -template -class SceneController { -public: - /** - * @brief Add scene to scene container - * - * @param scene_index scene index - * @param scene_pointer scene object pointer - */ - void add_scene(typename TApp::SceneType scene_index, TScene* scene_pointer) { - furi_check(scenes.count(scene_index) == 0); - scenes[scene_index] = scene_pointer; - } - - /** - * @brief Switch to next scene and store current scene in previous scenes list - * - * @param scene_index next scene index - * @param need_restore true, if we want the scene to restore its parameters - */ - void switch_to_next_scene(typename TApp::SceneType scene_index, bool need_restore = false) { - previous_scenes_list.push_front(current_scene_index); - switch_to_scene(scene_index, need_restore); - } - - /** - * @brief Switch to next scene without ability to return to current scene - * - * @param scene_index next scene index - * @param need_restore true, if we want the scene to restore its parameters - */ - void switch_to_scene(typename TApp::SceneType scene_index, bool need_restore = false) { - if(scene_index != TApp::SceneType::Exit) { - scenes[current_scene_index]->on_exit(app); - current_scene_index = scene_index; - scenes[current_scene_index]->on_enter(app, need_restore); - } - } - - /** - * @brief Search the scene in the list of previous scenes and switch to it - * - * @param scene_index_list list of scene indexes to which you want to switch - */ - bool search_and_switch_to_previous_scene( - const std::initializer_list& scene_index_list) { - auto previous_scene_index = TApp::SceneType::Exit; - bool scene_found = false; - bool result = false; - - while(!scene_found) { - previous_scene_index = get_previous_scene_index(); - for(const auto& element : scene_index_list) { - if(previous_scene_index == element) { - scene_found = true; - result = true; - break; - } - - if(previous_scene_index == TApp::SceneType::Exit) { - scene_found = true; - break; - } - } - } - - if(result) { - switch_to_scene(previous_scene_index, true); - } - - return result; - } - - bool search_and_switch_to_another_scene( - const std::initializer_list& scene_index_list, - typename TApp::SceneType scene_index) { - auto previous_scene_index = TApp::SceneType::Exit; - bool scene_found = false; - bool result = false; - - while(!scene_found) { - previous_scene_index = get_previous_scene_index(); - for(const auto& element : scene_index_list) { - if(previous_scene_index == element) { - scene_found = true; - result = true; - break; - } - - if(previous_scene_index == TApp::SceneType::Exit) { - scene_found = true; - break; - } - } - } - - if(result) { - switch_to_scene(scene_index, true); - } - - return result; - } - - bool has_previous_scene( - const std::initializer_list& scene_index_list) { - bool result = false; - - for(auto const& previous_element : previous_scenes_list) { - for(const auto& element : scene_index_list) { - if(previous_element == element) { - result = true; - break; - } - - if(previous_element == TApp::SceneType::Exit) { - break; - } - } - - if(result) break; - } - - return result; - } - - /** - * @brief Start application main cycle - * - * @param tick_length_ms tick event length in milliseconds - */ - void process( - uint32_t /* tick_length_ms */ = 100, - typename TApp::SceneType start_scene_index = TApp::SceneType::Start) { - typename TApp::Event event; - bool consumed; - bool exit = false; - - current_scene_index = start_scene_index; - scenes[current_scene_index]->on_enter(app, false); - - while(!exit) { - app->view_controller.receive_event(&event); - - consumed = scenes[current_scene_index]->on_event(app, &event); - - if(!consumed) { - if(event.type == TApp::EventType::Back) { - exit = switch_to_previous_scene(); - } - } - }; - - scenes[current_scene_index]->on_exit(app); - } - - /** - * @brief Switch to previous scene - * - * @param count how many steps back - * @return true if app need to exit - */ - bool switch_to_previous_scene(uint8_t count = 1) { - auto previous_scene_index = TApp::SceneType::Start; - - for(uint8_t i = 0; i < count; i++) - previous_scene_index = get_previous_scene_index(); - - if(previous_scene_index == TApp::SceneType::Exit) return true; - - switch_to_scene(previous_scene_index, true); - return false; - } - - /** - * @brief Construct a new Scene Controller object - * - * @param app_pointer pointer to application class - */ - SceneController(TApp* app_pointer) { - app = app_pointer; - current_scene_index = TApp::SceneType::Exit; - } - - /** - * @brief Destroy the Scene Controller object - * - */ - ~SceneController() { - for(auto& it : scenes) - delete it.second; - } - -private: - /** - * @brief Scenes pointers container - * - */ - std::map scenes; - - /** - * @brief List of indexes of previous scenes - * - */ - std::forward_list previous_scenes_list; - - /** - * @brief Current scene index holder - * - */ - typename TApp::SceneType current_scene_index; - - /** - * @brief Application pointer holder - * - */ - TApp* app; - - /** - * @brief Get the previous scene index - * - * @return previous scene index - */ - typename TApp::SceneType get_previous_scene_index() { - auto scene_index = TApp::SceneType::Exit; - - if(!previous_scenes_list.empty()) { - scene_index = previous_scenes_list.front(); - previous_scenes_list.pop_front(); - } - - return scene_index; - } -}; diff --git a/lib/app-scened-template/text_store.cpp b/lib/app-scened-template/text_store.cpp deleted file mode 100644 index c81a2c4e78..0000000000 --- a/lib/app-scened-template/text_store.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "text_store.h" -#include - -TextStore::TextStore(uint8_t _text_size) - : text_size(_text_size) { - text = static_cast(malloc(text_size + 1)); -} - -TextStore::~TextStore() { - free(text); -} - -void TextStore::set(const char* _text...) { - va_list args; - va_start(args, _text); - vsnprintf(text, text_size, _text, args); - va_end(args); -} diff --git a/lib/app-scened-template/text_store.h b/lib/app-scened-template/text_store.h deleted file mode 100644 index 3fe58ed1df..0000000000 --- a/lib/app-scened-template/text_store.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include - -class TextStore { -public: - TextStore(uint8_t text_size); - ~TextStore(void); - - void set(const char* text...); - const uint8_t text_size; - char* text; -}; diff --git a/lib/app-scened-template/typeindex_no_rtti.hpp b/lib/app-scened-template/typeindex_no_rtti.hpp deleted file mode 100644 index 579a0189d9..0000000000 --- a/lib/app-scened-template/typeindex_no_rtti.hpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - * type_index without RTTI - * - * Copyright frickiericker 2016. - * Distributed under the Boost Software License, Version 1.0. - * - * Permission is hereby granted, free of charge, to any person or organization - * obtaining a copy of the software and accompanying documentation covered by - * this license (the "Software") to use, reproduce, display, distribute, - * execute, and transmit the Software, and to prepare derivative works of the - * Software, and to permit third-parties to whom the Software is furnished to - * do so, all subject to the following: - * - * The copyright notices in the Software and this entire statement, including - * the above license grant, this restriction and the following disclaimer, - * must be included in all copies of the Software, in whole or in part, and - * all derivative works of the Software, unless such copies or derivative - * works are solely in the form of machine-executable object code generated by - * a source language processor. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT - * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include - -namespace ext { -/** - * Dummy type for tag-dispatching. - */ -template -struct tag_type {}; - -/** - * A value of tag_type. - */ -template -constexpr tag_type tag{}; - -/** - * A type_index implementation without RTTI. - */ -struct type_index { - /** - * Creates a type_index object for the specified type. - */ - template - type_index(tag_type) noexcept - : hash_code_{index} { - } - - /** - * Returns the hash code. - */ - std::size_t hash_code() const noexcept { - return hash_code_; - } - -private: - /** - * Unique integral index associated to template type argument. - */ - template - static std::size_t const index; - - /** - * Global counter for generating index values. - */ - static std::size_t& counter() noexcept { - static std::size_t counter_; - return counter_; - } - -private: - std::size_t hash_code_; -}; - -template -std::size_t const type_index::index = type_index::counter()++; - -/** - * Creates a type_index object for the specified type. - * - * Equivalent to `ext::type_index{ext::tag}`. - */ -template -type_index make_type_index() noexcept { - return tag; -} - -inline bool operator==(type_index const& a, type_index const& b) noexcept { - return a.hash_code() == b.hash_code(); -} - -inline bool operator!=(type_index const& a, type_index const& b) noexcept { - return !(a == b); -} - -inline bool operator<(type_index const& a, type_index const& b) noexcept { - return a.hash_code() < b.hash_code(); -} - -inline bool operator<=(type_index const& a, type_index const& b) noexcept { - return a.hash_code() <= b.hash_code(); -} - -inline bool operator>(type_index const& a, type_index const& b) noexcept { - return !(a <= b); -} - -inline bool operator>=(type_index const& a, type_index const& b) noexcept { - return !(a < b); -} -} - -template <> -struct std::hash { - using argument_type = ext::type_index; - using result_type = std::size_t; - - result_type operator()(argument_type const& t) const noexcept { - return t.hash_code(); - } -}; diff --git a/lib/app-scened-template/view_controller.hpp b/lib/app-scened-template/view_controller.hpp deleted file mode 100644 index ccd3c0fd39..0000000000 --- a/lib/app-scened-template/view_controller.hpp +++ /dev/null @@ -1,170 +0,0 @@ -#pragma once -#include "view_modules/generic_view_module.h" -#include -#include -#include -#include -#include "typeindex_no_rtti.hpp" - -/** - * @brief Controller for switching application views and handling inputs and events - * - * @tparam TApp application class - * @tparam TViewModules variadic list of ViewModules - */ -template -class ViewController { -public: - ViewController() { - event_queue = furi_message_queue_alloc(10, sizeof(typename TApp::Event)); - - view_dispatcher = view_dispatcher_alloc(); - previous_view_callback_pointer = cbc::obtain_connector( - this, &ViewController::previous_view_callback); - - [](...) { - }((this->add_view(ext::make_type_index().hash_code(), new TViewModules()), - 0)...); - - gui = static_cast(furi_record_open("gui")); - } - - ~ViewController() { - for(auto& it : holder) { - view_dispatcher_remove_view(view_dispatcher, static_cast(it.first)); - delete it.second; - } - - view_dispatcher_free(view_dispatcher); - furi_message_queue_free(event_queue); - } - - /** - * @brief Get ViewModule pointer - * - * @tparam T Concrete ViewModule class - * @return T* ViewModule pointer - */ - template - T* get() { - uint32_t view_index = ext::make_type_index().hash_code(); - furi_check(holder.count(view_index) != 0); - return static_cast(holder[view_index]); - } - - /** - * @brief Get ViewModule pointer by cast - * - * @tparam T Concrete ViewModule class - * @return T* ViewModule pointer - */ - template - operator T*() { - uint32_t view_index = ext::make_type_index().hash_code(); - furi_check(holder.count(view_index) != 0); - return static_cast(holder[view_index]); - } - - /** - * @brief Switch view to ViewModule - * - * @tparam T Concrete ViewModule class - * @return T* ViewModule pointer - */ - template - void switch_to() { - uint32_t view_index = ext::make_type_index().hash_code(); - furi_check(holder.count(view_index) != 0); - view_dispatcher_switch_to_view(view_dispatcher, view_index); - } - - /** - * @brief Receive event from app event queue - * - * @param event event pointer - */ - void receive_event(typename TApp::Event* event) { - if(furi_message_queue_get(event_queue, event, 100) != FuriStatusOk) { - event->type = TApp::EventType::Tick; - } - } - - /** - * @brief Send event to app event queue - * - * @param event event pointer - */ - void send_event(typename TApp::Event* event) { - FuriStatus result = furi_message_queue_put(event_queue, event, FuriWaitForever); - furi_check(result == FuriStatusOk); - } - - void attach_to_gui(ViewDispatcherType type) { - view_dispatcher_attach_to_gui(view_dispatcher, gui, type); - } - -private: - /** - * @brief ViewModulesHolder - * - */ - std::map holder; - - /** - * @brief App event queue - * - */ - FuriMessageQueue* event_queue; - - /** - * @brief Main ViewDispatcher pointer - * - */ - ViewDispatcher* view_dispatcher; - - /** - * @brief Gui record pointer - * - */ - Gui* gui; - - /** - * @brief Previous view callback fn pointer - * - */ - ViewNavigationCallback previous_view_callback_pointer; - - /** - * @brief Previous view callback fn - * - * @param context not used - * @return uint32_t VIEW_IGNORE - */ - uint32_t previous_view_callback(void* context) { - (void)context; - - typename TApp::Event event; - event.type = TApp::EventType::Back; - - if(event_queue != NULL) { - send_event(&event); - } - - return VIEW_IGNORE; - } - - /** - * @brief Add ViewModule to holder - * - * @param view_index view index in holder - * @param view_module view module pointer - */ - void add_view(size_t view_index, GenericViewModule* view_module) { - furi_check(holder.count(view_index) == 0); - holder[view_index] = view_module; - - View* view = view_module->get_view(); - view_dispatcher_add_view(view_dispatcher, static_cast(view_index), view); - view_set_previous_callback(view, previous_view_callback_pointer); - } -}; diff --git a/lib/app-scened-template/view_modules/byte_input_vm.cpp b/lib/app-scened-template/view_modules/byte_input_vm.cpp deleted file mode 100644 index 754de9111e..0000000000 --- a/lib/app-scened-template/view_modules/byte_input_vm.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "byte_input_vm.h" - -ByteInputVM::ByteInputVM() { - byte_input = byte_input_alloc(); -} - -ByteInputVM::~ByteInputVM() { - byte_input_free(byte_input); -} - -View* ByteInputVM::get_view() { - return byte_input_get_view(byte_input); -} - -void ByteInputVM::clean() { - byte_input_set_header_text(byte_input, ""); - byte_input_set_result_callback(byte_input, NULL, NULL, NULL, NULL, 0); -} - -void ByteInputVM::set_result_callback( - ByteInputCallback input_callback, - ByteChangedCallback changed_callback, - void* callback_context, - uint8_t* bytes, - uint8_t bytes_count) { - byte_input_set_result_callback( - byte_input, input_callback, changed_callback, callback_context, bytes, bytes_count); -} - -void ByteInputVM::set_header_text(const char* text) { - byte_input_set_header_text(byte_input, text); -} diff --git a/lib/app-scened-template/view_modules/byte_input_vm.h b/lib/app-scened-template/view_modules/byte_input_vm.h deleted file mode 100644 index 69031fbee6..0000000000 --- a/lib/app-scened-template/view_modules/byte_input_vm.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -#include "generic_view_module.h" -#include - -class ByteInputVM : public GenericViewModule { -public: - ByteInputVM(void); - ~ByteInputVM() final; - View* get_view() final; - void clean() final; - - /** - * @brief Set byte input result callback - * - * @param input_callback input callback fn - * @param changed_callback changed callback fn - * @param callback_context callback context - * @param bytes buffer to use - * @param bytes_count buffer length - */ - void set_result_callback( - ByteInputCallback input_callback, - ByteChangedCallback changed_callback, - void* callback_context, - uint8_t* bytes, - uint8_t bytes_count); - - /** - * @brief Set byte input header text - * - * @param text text to be shown - */ - void set_header_text(const char* text); - -private: - ByteInput* byte_input; -}; diff --git a/lib/app-scened-template/view_modules/dialog_ex_vm.cpp b/lib/app-scened-template/view_modules/dialog_ex_vm.cpp deleted file mode 100644 index 34f4d0336c..0000000000 --- a/lib/app-scened-template/view_modules/dialog_ex_vm.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "dialog_ex_vm.h" - -DialogExVM::DialogExVM() { - dialog_ex = dialog_ex_alloc(); -} - -DialogExVM::~DialogExVM() { - dialog_ex_free(dialog_ex); -} - -View* DialogExVM::get_view() { - return dialog_ex_get_view(dialog_ex); -} - -void DialogExVM::clean() { - set_result_callback(NULL); - set_context(NULL); - set_header(NULL, 0, 0, AlignLeft, AlignBottom); - set_text(NULL, 0, 0, AlignLeft, AlignBottom); - set_icon(0, 0, NULL); - set_left_button_text(NULL); - set_center_button_text(NULL); - set_right_button_text(NULL); -} - -void DialogExVM::set_result_callback(DialogExResultCallback callback) { - dialog_ex_set_result_callback(dialog_ex, callback); -} - -void DialogExVM::set_context(void* context) { - dialog_ex_set_context(dialog_ex, context); -} - -void DialogExVM::set_header( - const char* text, - uint8_t x, - uint8_t y, - Align horizontal, - Align vertical) { - dialog_ex_set_header(dialog_ex, text, x, y, horizontal, vertical); -} - -void DialogExVM::set_text(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical) { - dialog_ex_set_text(dialog_ex, text, x, y, horizontal, vertical); -} - -void DialogExVM::set_icon(uint8_t x, uint8_t y, const Icon* icon) { - dialog_ex_set_icon(dialog_ex, x, y, icon); -} - -void DialogExVM::set_left_button_text(const char* text) { - dialog_ex_set_left_button_text(dialog_ex, text); -} - -void DialogExVM::set_center_button_text(const char* text) { - dialog_ex_set_center_button_text(dialog_ex, text); -} - -void DialogExVM::set_right_button_text(const char* text) { - dialog_ex_set_right_button_text(dialog_ex, text); -} diff --git a/lib/app-scened-template/view_modules/dialog_ex_vm.h b/lib/app-scened-template/view_modules/dialog_ex_vm.h deleted file mode 100644 index cb63ccdbc2..0000000000 --- a/lib/app-scened-template/view_modules/dialog_ex_vm.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once -#include "generic_view_module.h" -#include - -class DialogExVM : public GenericViewModule { -public: - DialogExVM(void); - ~DialogExVM() final; - View* get_view() final; - void clean() final; - - /** - * Set dialog result callback - * @param callback - result callback function - */ - void set_result_callback(DialogExResultCallback callback); - - /** - * Set dialog context - * @param context - context pointer, will be passed to result callback - */ - void set_context(void* context); - - /** - * Set dialog header text - * If text is null, dialog header will not be rendered - * @param text - text to be shown, can be multiline - * @param x, y - text position - * @param horizontal, vertical - text aligment - */ - void set_header(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical); - - /** - * Set dialog text - * If text is null, dialog text will not be rendered - * @param text - text to be shown, can be multiline - * @param x, y - text position - * @param horizontal, vertical - text aligment - */ - void set_text(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical); - - /** - * Set dialog icon - * If x or y is negative, dialog icon will not be rendered - * @param x, y - icon position - * @param name - icon to be shown - */ - void set_icon(uint8_t x, uint8_t y, const Icon* icon); - - /** - * Set left button text - * If text is null, left button will not be rendered and processed - * @param text - text to be shown - */ - void set_left_button_text(const char* text); - - /** - * Set center button text - * If text is null, center button will not be rendered and processed - * @param text - text to be shown - */ - void set_center_button_text(const char* text); - - /** - * Set right button text - * If text is null, right button will not be rendered and processed - * @param text - text to be shown - */ - void set_right_button_text(const char* text); - -private: - DialogEx* dialog_ex; -}; diff --git a/lib/app-scened-template/view_modules/generic_view_module.h b/lib/app-scened-template/view_modules/generic_view_module.h deleted file mode 100644 index f6c56a9110..0000000000 --- a/lib/app-scened-template/view_modules/generic_view_module.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -#include - -class GenericViewModule { -public: - GenericViewModule() {}; - virtual ~GenericViewModule() {}; - virtual View* get_view() = 0; - virtual void clean() = 0; -}; diff --git a/lib/app-scened-template/view_modules/popup_vm.cpp b/lib/app-scened-template/view_modules/popup_vm.cpp deleted file mode 100644 index 330aa44ca9..0000000000 --- a/lib/app-scened-template/view_modules/popup_vm.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "popup_vm.h" -#include - -PopupVM::PopupVM() { - popup = popup_alloc(); -} - -PopupVM::~PopupVM() { - popup_free(popup); -} - -View* PopupVM::get_view() { - return popup_get_view(popup); -} - -void PopupVM::clean() { - set_callback(NULL); - set_context(NULL); - set_header(NULL, 0, 0, AlignLeft, AlignBottom); - set_text(NULL, 0, 0, AlignLeft, AlignBottom); - set_icon(0, 0, NULL); - disable_timeout(); - set_timeout(1000); -} - -void PopupVM::set_callback(PopupCallback callback) { - popup_set_callback(popup, callback); -} - -void PopupVM::set_context(void* context) { - popup_set_context(popup, context); -} - -void PopupVM::set_header(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical) { - popup_set_header(popup, text, x, y, horizontal, vertical); -} - -void PopupVM::set_text(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical) { - popup_set_text(popup, text, x, y, horizontal, vertical); -} - -void PopupVM::set_icon(int8_t x, int8_t y, const Icon* icon) { - popup_set_icon(popup, x, y, icon); -} - -void PopupVM::set_timeout(uint32_t timeout_in_ms) { - popup_set_timeout(popup, timeout_in_ms); -} - -void PopupVM::enable_timeout() { - popup_enable_timeout(popup); -} - -void PopupVM::disable_timeout() { - popup_disable_timeout(popup); -} diff --git a/lib/app-scened-template/view_modules/popup_vm.h b/lib/app-scened-template/view_modules/popup_vm.h deleted file mode 100644 index 234f337746..0000000000 --- a/lib/app-scened-template/view_modules/popup_vm.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once -#include "generic_view_module.h" -#include - -class PopupVM : public GenericViewModule { -public: - PopupVM(void); - ~PopupVM() final; - View* get_view() final; - void clean() final; - - /** - * Set popup header text - * @param text - text to be shown - */ - void set_callback(PopupCallback callback); - - /** - * Set popup context - * @param context - context pointer, will be passed to result callback - */ - void set_context(void* context); - - /** - * Set popup header text - * If text is null, popup header will not be rendered - * @param text - text to be shown, can be multiline - * @param x, y - text position - * @param horizontal, vertical - text aligment - */ - void set_header(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical); - - /** - * Set popup text - * If text is null, popup text will not be rendered - * @param text - text to be shown, can be multiline - * @param x, y - text position - * @param horizontal, vertical - text aligment - */ - void set_text(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical); - - /** - * Set popup icon - * If icon position is negative, popup icon will not be rendered - * @param x, y - icon position - * @param name - icon to be shown - */ - void set_icon(int8_t x, int8_t y, const Icon* icon); - - /** - * Set popup timeout - * @param timeout_in_ms - popup timeout value in milliseconds - */ - void set_timeout(uint32_t timeout_in_ms); - - /** - * Enable popup timeout - */ - void enable_timeout(void); - - /** - * Disable popup timeout - */ - void disable_timeout(void); - -private: - Popup* popup; -}; diff --git a/lib/app-scened-template/view_modules/submenu_vm.cpp b/lib/app-scened-template/view_modules/submenu_vm.cpp deleted file mode 100644 index 939bb6b1ce..0000000000 --- a/lib/app-scened-template/view_modules/submenu_vm.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "submenu_vm.h" - -SubmenuVM::SubmenuVM() { - submenu = submenu_alloc(); -} - -SubmenuVM::~SubmenuVM() { - submenu_free(submenu); -} - -View* SubmenuVM::get_view() { - return submenu_get_view(submenu); -} - -void SubmenuVM::clean() { - submenu_reset(submenu); -} - -void SubmenuVM::add_item( - const char* label, - uint32_t index, - SubmenuItemCallback callback, - void* callback_context) { - submenu_add_item(submenu, label, index, callback, callback_context); -} - -void SubmenuVM::set_selected_item(uint32_t index) { - submenu_set_selected_item(submenu, index); -} - -void SubmenuVM::set_header(const char* header) { - submenu_set_header(submenu, header); -} diff --git a/lib/app-scened-template/view_modules/submenu_vm.h b/lib/app-scened-template/view_modules/submenu_vm.h deleted file mode 100644 index 223fbd531e..0000000000 --- a/lib/app-scened-template/view_modules/submenu_vm.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once -#include "generic_view_module.h" -#include - -class SubmenuVM : public GenericViewModule { -public: - SubmenuVM(void); - ~SubmenuVM() final; - View* get_view() final; - void clean() final; - - /** - * @brief Add item to submenu - * - * @param label - menu item label - * @param index - menu item index, used for callback, may be the same with other items - * @param callback - menu item callback - * @param callback_context - menu item callback context - */ - void add_item( - const char* label, - uint32_t index, - SubmenuItemCallback callback, - void* callback_context); - - /** - * @brief Set submenu item selector - * - * @param index index of the item to be selected - */ - void set_selected_item(uint32_t index); - - /** - * @brief Set optional header for submenu - * - * @param header header to set - */ - void set_header(const char* header); - -private: - Submenu* submenu; -}; diff --git a/lib/app-scened-template/view_modules/text_input_vm.cpp b/lib/app-scened-template/view_modules/text_input_vm.cpp deleted file mode 100644 index 05e5ed1d69..0000000000 --- a/lib/app-scened-template/view_modules/text_input_vm.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "text_input_vm.h" - -TextInputVM::TextInputVM() { - text_input = text_input_alloc(); -} - -TextInputVM::~TextInputVM() { - text_input_free(text_input); -} - -View* TextInputVM::get_view() { - return text_input_get_view(text_input); -} - -void TextInputVM::clean() { - text_input_reset(text_input); -} - -void TextInputVM::set_result_callback( - TextInputCallback callback, - void* callback_context, - char* text, - uint8_t max_text_length, - bool clear_default_text) { - text_input_set_result_callback( - text_input, callback, callback_context, text, max_text_length, clear_default_text); -} - -void TextInputVM::set_header_text(const char* text) { - text_input_set_header_text(text_input, text); -} - -void TextInputVM::set_validator(TextInputValidatorCallback callback, void* callback_context) { - text_input_set_validator(text_input, callback, callback_context); -} - -void* TextInputVM::get_validator_callback_context() { - return text_input_get_validator_callback_context(text_input); -} diff --git a/lib/app-scened-template/view_modules/text_input_vm.h b/lib/app-scened-template/view_modules/text_input_vm.h deleted file mode 100644 index 5c71c4318f..0000000000 --- a/lib/app-scened-template/view_modules/text_input_vm.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#include "generic_view_module.h" -#include - -class TextInputVM : public GenericViewModule { -public: - TextInputVM(void); - ~TextInputVM() final; - View* get_view() final; - void clean() final; - - /** - * @brief Set text input result callback - * - * @param callback - callback fn - * @param callback_context - callback context - * @param text - text buffer to use - * @param max_text_length - text buffer length - * @param clear_default_text - clears given buffer on OK event - */ - void set_result_callback( - TextInputCallback callback, - void* callback_context, - char* text, - uint8_t max_text_length, - bool clear_default_text); - - /** - * @brief Set text input header text - * - * @param text - text to be shown - */ - void set_header_text(const char* text); - - void set_validator(TextInputValidatorCallback callback, void* callback_context); - - void* get_validator_callback_context(void); - -private: - TextInput* text_input; -}; diff --git a/lib/appframe.scons b/lib/appframe.scons deleted file mode 100644 index fb268579d6..0000000000 --- a/lib/appframe.scons +++ /dev/null @@ -1,29 +0,0 @@ -Import("env") - -env.Append( - CPPPATH=[ - "#/lib/app-scened-template", - "#/lib/callback-connector", - ], - LINT_SOURCES=[ - Dir("app-scened-template"), - ], -) - - -libenv = env.Clone(FW_LIB_NAME="appframe") -libenv.ApplyLibFlags() - -sources = [] - -recurse_dirs = [ - "app-scened-template", - "callback-connector", -] - -for recurse_dir in recurse_dirs: - sources += libenv.GlobRecursive("*.c*", recurse_dir) - -lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources) -libenv.Install("${LIB_DIST_DIR}", lib) -Return("lib") diff --git a/lib/toolbox/api_lock.h b/lib/toolbox/api_lock.h index 5902a4922a..a370514dad 100644 --- a/lib/toolbox/api_lock.h +++ b/lib/toolbox/api_lock.h @@ -41,3 +41,7 @@ typedef FuriEventFlag* FuriApiLock; #define api_lock_wait_unlock_and_free(_lock) \ api_lock_wait_unlock(_lock); \ api_lock_free(_lock); + +#define api_lock_is_locked(_lock) (!(furi_event_flag_get(_lock) & API_LOCK_EVENT)) + +#define api_lock_relock(_lock) furi_event_flag_clear(_lock, API_LOCK_EVENT) diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index 9e58a67464..baf1f8a802 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,71.0,, +Version,+,72.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/cli/cli.h,, @@ -1108,11 +1108,13 @@ Function,+,furi_event_flag_set,uint32_t,"FuriEventFlag*, uint32_t" Function,+,furi_event_flag_wait,uint32_t,"FuriEventFlag*, uint32_t, uint32_t, uint32_t" Function,+,furi_event_loop_alloc,FuriEventLoop*, Function,+,furi_event_loop_free,void,FuriEventLoop* -Function,+,furi_event_loop_message_queue_subscribe,void,"FuriEventLoop*, FuriMessageQueue*, FuriEventLoopEvent, FuriEventLoopMessageQueueCallback, void*" -Function,+,furi_event_loop_message_queue_unsubscribe,void,"FuriEventLoop*, FuriMessageQueue*" Function,+,furi_event_loop_pend_callback,void,"FuriEventLoop*, FuriEventLoopPendingCallback, void*" Function,+,furi_event_loop_run,void,FuriEventLoop* Function,+,furi_event_loop_stop,void,FuriEventLoop* +Function,+,furi_event_loop_subscribe_message_queue,void,"FuriEventLoop*, FuriMessageQueue*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" +Function,+,furi_event_loop_subscribe_mutex,void,"FuriEventLoop*, FuriMutex*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" +Function,+,furi_event_loop_subscribe_semaphore,void,"FuriEventLoop*, FuriSemaphore*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" +Function,+,furi_event_loop_subscribe_stream_buffer,void,"FuriEventLoop*, FuriStreamBuffer*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" Function,+,furi_event_loop_tick_set,void,"FuriEventLoop*, uint32_t, FuriEventLoopTickCallback, void*" Function,+,furi_event_loop_timer_alloc,FuriEventLoopTimer*,"FuriEventLoop*, FuriEventLoopTimerCallback, FuriEventLoopTimerType, void*" Function,+,furi_event_loop_timer_free,void,FuriEventLoopTimer* @@ -1122,6 +1124,7 @@ Function,+,furi_event_loop_timer_is_running,_Bool,const FuriEventLoopTimer* Function,+,furi_event_loop_timer_restart,void,FuriEventLoopTimer* Function,+,furi_event_loop_timer_start,void,"FuriEventLoopTimer*, uint32_t" Function,+,furi_event_loop_timer_stop,void,FuriEventLoopTimer* +Function,+,furi_event_loop_unsubscribe,void,"FuriEventLoop*, FuriEventLoopObject*" Function,+,furi_get_tick,uint32_t, Function,+,furi_hal_adc_acquire,FuriHalAdcHandle*, Function,+,furi_hal_adc_configure,void,FuriHalAdcHandle* @@ -1544,6 +1547,7 @@ Function,+,furi_semaphore_acquire,FuriStatus,"FuriSemaphore*, uint32_t" Function,+,furi_semaphore_alloc,FuriSemaphore*,"uint32_t, uint32_t" Function,+,furi_semaphore_free,void,FuriSemaphore* Function,+,furi_semaphore_get_count,uint32_t,FuriSemaphore* +Function,+,furi_semaphore_get_space,uint32_t,FuriSemaphore* Function,+,furi_semaphore_release,FuriStatus,FuriSemaphore* Function,+,furi_stream_buffer_alloc,FuriStreamBuffer*,"size_t, size_t" Function,+,furi_stream_buffer_bytes_available,size_t,FuriStreamBuffer* @@ -2282,7 +2286,7 @@ Function,+,power_get_info,void,"Power*, PowerInfo*" Function,+,power_get_pubsub,FuriPubSub*,Power* Function,+,power_is_battery_healthy,_Bool,Power* Function,+,power_off,void,Power* -Function,+,power_reboot,void,PowerBootMode +Function,+,power_reboot,void,"Power*, PowerBootMode" Function,+,powf,float,"float, float" Function,-,powl,long double,"long double, long double" Function,+,pretty_format_bytes_hex_canonical,void,"FuriString*, size_t, const char*, const uint8_t*, size_t" @@ -2757,11 +2761,11 @@ Function,+,view_holder_alloc,ViewHolder*, Function,+,view_holder_attach_to_gui,void,"ViewHolder*, Gui*" Function,+,view_holder_free,void,ViewHolder* Function,+,view_holder_get_free_context,void*,ViewHolder* +Function,+,view_holder_send_to_back,void,ViewHolder* +Function,+,view_holder_send_to_front,void,ViewHolder* Function,+,view_holder_set_back_callback,void,"ViewHolder*, BackCallback, void*" Function,+,view_holder_set_free_callback,void,"ViewHolder*, FreeCallback, void*" Function,+,view_holder_set_view,void,"ViewHolder*, View*" -Function,+,view_holder_start,void,ViewHolder* -Function,+,view_holder_stop,void,ViewHolder* Function,+,view_holder_update,void,"View*, void*" Function,+,view_port_alloc,ViewPort*, Function,+,view_port_draw_callback_set,void,"ViewPort*, ViewPortDrawCallback, void*" diff --git a/targets/f18/target.json b/targets/f18/target.json index 9c450aa83e..3452c6707a 100644 --- a/targets/f18/target.json +++ b/targets/f18/target.json @@ -22,7 +22,6 @@ "signal_reader", "microtar", "usb_stm32", - "appframe", "assets", "one_wire", "music_worker", diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 4bfe37abb5..cb3471e60a 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,71.0,, +Version,+,72.0,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, @@ -1213,11 +1213,13 @@ Function,+,furi_event_flag_set,uint32_t,"FuriEventFlag*, uint32_t" Function,+,furi_event_flag_wait,uint32_t,"FuriEventFlag*, uint32_t, uint32_t, uint32_t" Function,+,furi_event_loop_alloc,FuriEventLoop*, Function,+,furi_event_loop_free,void,FuriEventLoop* -Function,+,furi_event_loop_message_queue_subscribe,void,"FuriEventLoop*, FuriMessageQueue*, FuriEventLoopEvent, FuriEventLoopMessageQueueCallback, void*" -Function,+,furi_event_loop_message_queue_unsubscribe,void,"FuriEventLoop*, FuriMessageQueue*" Function,+,furi_event_loop_pend_callback,void,"FuriEventLoop*, FuriEventLoopPendingCallback, void*" Function,+,furi_event_loop_run,void,FuriEventLoop* Function,+,furi_event_loop_stop,void,FuriEventLoop* +Function,+,furi_event_loop_subscribe_message_queue,void,"FuriEventLoop*, FuriMessageQueue*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" +Function,+,furi_event_loop_subscribe_mutex,void,"FuriEventLoop*, FuriMutex*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" +Function,+,furi_event_loop_subscribe_semaphore,void,"FuriEventLoop*, FuriSemaphore*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" +Function,+,furi_event_loop_subscribe_stream_buffer,void,"FuriEventLoop*, FuriStreamBuffer*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" Function,+,furi_event_loop_tick_set,void,"FuriEventLoop*, uint32_t, FuriEventLoopTickCallback, void*" Function,+,furi_event_loop_timer_alloc,FuriEventLoopTimer*,"FuriEventLoop*, FuriEventLoopTimerCallback, FuriEventLoopTimerType, void*" Function,+,furi_event_loop_timer_free,void,FuriEventLoopTimer* @@ -1227,6 +1229,7 @@ Function,+,furi_event_loop_timer_is_running,_Bool,const FuriEventLoopTimer* Function,+,furi_event_loop_timer_restart,void,FuriEventLoopTimer* Function,+,furi_event_loop_timer_start,void,"FuriEventLoopTimer*, uint32_t" Function,+,furi_event_loop_timer_stop,void,FuriEventLoopTimer* +Function,+,furi_event_loop_unsubscribe,void,"FuriEventLoop*, FuriEventLoopObject*" Function,+,furi_get_tick,uint32_t, Function,+,furi_hal_adc_acquire,FuriHalAdcHandle*, Function,+,furi_hal_adc_configure,void,FuriHalAdcHandle* @@ -1758,6 +1761,7 @@ Function,+,furi_semaphore_acquire,FuriStatus,"FuriSemaphore*, uint32_t" Function,+,furi_semaphore_alloc,FuriSemaphore*,"uint32_t, uint32_t" Function,+,furi_semaphore_free,void,FuriSemaphore* Function,+,furi_semaphore_get_count,uint32_t,FuriSemaphore* +Function,+,furi_semaphore_get_space,uint32_t,FuriSemaphore* Function,+,furi_semaphore_release,FuriStatus,FuriSemaphore* Function,+,furi_stream_buffer_alloc,FuriStreamBuffer*,"size_t, size_t" Function,+,furi_stream_buffer_bytes_available,size_t,FuriStreamBuffer* @@ -2908,7 +2912,7 @@ Function,+,power_get_info,void,"Power*, PowerInfo*" Function,+,power_get_pubsub,FuriPubSub*,Power* Function,+,power_is_battery_healthy,_Bool,Power* Function,+,power_off,void,Power* -Function,+,power_reboot,void,PowerBootMode +Function,+,power_reboot,void,"Power*, PowerBootMode" Function,+,powf,float,"float, float" Function,-,powl,long double,"long double, long double" Function,+,pretty_format_bytes_hex_canonical,void,"FuriString*, size_t, const char*, const uint8_t*, size_t" @@ -3598,11 +3602,11 @@ Function,+,view_holder_alloc,ViewHolder*, Function,+,view_holder_attach_to_gui,void,"ViewHolder*, Gui*" Function,+,view_holder_free,void,ViewHolder* Function,+,view_holder_get_free_context,void*,ViewHolder* +Function,+,view_holder_send_to_back,void,ViewHolder* +Function,+,view_holder_send_to_front,void,ViewHolder* Function,+,view_holder_set_back_callback,void,"ViewHolder*, BackCallback, void*" Function,+,view_holder_set_free_callback,void,"ViewHolder*, FreeCallback, void*" Function,+,view_holder_set_view,void,"ViewHolder*, View*" -Function,+,view_holder_start,void,ViewHolder* -Function,+,view_holder_stop,void,ViewHolder* Function,+,view_holder_update,void,"View*, void*" Function,+,view_port_alloc,ViewPort*, Function,+,view_port_draw_callback_set,void,"ViewPort*, ViewPortDrawCallback, void*" diff --git a/targets/f7/target.json b/targets/f7/target.json index 35f1766c19..f5b3cf3b6b 100644 --- a/targets/f7/target.json +++ b/targets/f7/target.json @@ -34,7 +34,6 @@ "microtar", "usb_stm32", "infrared", - "appframe", "assets", "one_wire", "ibutton", From 741329a74351ffa9ac0e12f03aec1d42845f741e Mon Sep 17 00:00:00 2001 From: David Lee <5908330+leedave@users.noreply.github.com> Date: Thu, 8 Aug 2024 08:05:48 +0200 Subject: [PATCH 34/52] Added a text input that only accepts full numbers (int) (#3350) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added a text input that only accepts full numbers (int) * Added to Gui sdk_headers and api_symbols in f7 and f18 * Fixed _Bool declarations in symbols csv * renamed int_input to number_input * Changed name & added example fap * Added a text input that only accepts full numbers (int) * Added to Gui sdk_headers and api_symbols in f7 and f18 * Changed name & added example fap * update for clearing views * GUI: Fix array out of bounds in menu exit (#3604) * GUI: Fix array out of bounds in menu exit * Gui: fix incorrect empty menu handling * Gui: add missing item check in menu ok handling * Gui: remove dead code from menu module * nfc app: add legacy keys for plantain cards (#3602) * refactoring test app, part 1 * Refactor test app, part 2 * Minor updates while travelling * Switched from const char to FuriString. Using Temp module copy for development to spare compile time * Option to limit number output with min and max values * Preparations for option to change number sign from + to - * Preparations for option to change number sign from + to - * Preparing for testing * counter automatic API version change * added trailing comma in application.fam ... because the lint check wants it¿ * removed unused callback NumberChangedCallback * change uint8_t to size_t in number_input_backspace_cb * Removal of unused view_stack in demo app * copied module to app folder for faster development (remove later) * Replaced all uint8_t with size_t... removed unused logic for selected_row < 0 * Optimize use of canvas_set_color * Remove alloc/free of furistring that actually is a pointer * Dynamic Header text with min/max in Example * Removed the need of useSign in Model * Number_input Removed sign from model, started transfer from text to int32_t * number_input FuriString in input_show_number * number_input FuriString in input_show_number * limiting inputs for min/max values * limiting inputs for min/max values * number_input change save button on invalid numbers * input_number update demo app to allow change of min/max * number input fine tuning * number_input, Remove temp development folder * number_input, fbt format * Bump CSV Files * Clear input if value is zero * number_input: handle null on header text * number_input: change keyboard values to char * number input: Remove static on char for header text, change numbers to INT32_MIN/INT32_MAX * number_input: removal of dead code * number_input: fix for crash if number_input not opened before free * number_input: added icon for example app * number_input: Replaced view for show_number with DialogEx * Number_input: FBT Format * number_input: bump csv versions * number_input: allow negative input if max_value is 0 * Number_input: linting / format * Removed dead code, fbt format * Examples: cleanup number input code * Examples: moar code cleanup in number input, simplify as much as possible, highlight incorrect input handling * Gui: correctly handle INT_MAX and INT_MIN * Gui: fix memory leak in number input module Co-authored-by: David Lee Co-authored-by: Aleksandr Kutuzov Co-authored-by: WillyJL <49810075+Willy-JL@users.noreply.github.com> Co-authored-by: gornekich --- .../examples/example_number_input/ReadMe.md | 7 + .../example_number_input/application.fam | 10 + .../example_number_input.c | 79 ++++ .../example_number_input.h | 35 ++ .../example_number_input_10px.png | Bin 0 -> 87 bytes .../scenes/example_number_input_scene.c | 30 ++ .../scenes/example_number_input_scene.h | 29 ++ .../example_number_input_scene_config.h | 4 + .../example_number_input_scene_input_max.c | 39 ++ .../example_number_input_scene_input_min.c | 39 ++ .../example_number_input_scene_input_number.c | 42 ++ .../example_number_input_scene_show_number.c | 66 +++ applications/services/gui/application.fam | 1 + .../services/gui/modules/number_input.c | 443 ++++++++++++++++++ .../services/gui/modules/number_input.h | 69 +++ .../Keyboard/KeySaveBlockedSelected_24x11.png | Bin 0 -> 110 bytes .../icons/Keyboard/KeySaveBlocked_24x11.png | Bin 0 -> 110 bytes .../icons/Keyboard/KeySaveSelected_24x11.png | Bin 94 -> 96 bytes assets/icons/Keyboard/KeySave_24x11.png | Bin 110 -> 110 bytes .../icons/Keyboard/KeySignSelected_21x11.png | Bin 0 -> 95 bytes assets/icons/Keyboard/KeySign_21x11.png | Bin 0 -> 109 bytes targets/f18/api_symbols.csv | 8 +- targets/f7/api_symbols.csv | 8 +- 23 files changed, 907 insertions(+), 2 deletions(-) create mode 100644 applications/examples/example_number_input/ReadMe.md create mode 100644 applications/examples/example_number_input/application.fam create mode 100644 applications/examples/example_number_input/example_number_input.c create mode 100644 applications/examples/example_number_input/example_number_input.h create mode 100644 applications/examples/example_number_input/example_number_input_10px.png create mode 100644 applications/examples/example_number_input/scenes/example_number_input_scene.c create mode 100644 applications/examples/example_number_input/scenes/example_number_input_scene.h create mode 100644 applications/examples/example_number_input/scenes/example_number_input_scene_config.h create mode 100644 applications/examples/example_number_input/scenes/example_number_input_scene_input_max.c create mode 100644 applications/examples/example_number_input/scenes/example_number_input_scene_input_min.c create mode 100644 applications/examples/example_number_input/scenes/example_number_input_scene_input_number.c create mode 100644 applications/examples/example_number_input/scenes/example_number_input_scene_show_number.c create mode 100644 applications/services/gui/modules/number_input.c create mode 100644 applications/services/gui/modules/number_input.h create mode 100644 assets/icons/Keyboard/KeySaveBlockedSelected_24x11.png create mode 100644 assets/icons/Keyboard/KeySaveBlocked_24x11.png create mode 100644 assets/icons/Keyboard/KeySignSelected_21x11.png create mode 100644 assets/icons/Keyboard/KeySign_21x11.png diff --git a/applications/examples/example_number_input/ReadMe.md b/applications/examples/example_number_input/ReadMe.md new file mode 100644 index 0000000000..9d5a0a9e5e --- /dev/null +++ b/applications/examples/example_number_input/ReadMe.md @@ -0,0 +1,7 @@ +# Number Input + +Simple keyboard that limits user inputs to a full number (integer). Useful to enforce correct entries without the need of intense validations after a user input. + +Definition of min/max values is required. Numbers are of type int32_t. If negative numbers are allowed withing min - max, an additional button is displayed to switch the sign between + and -. + +It is also possible to define a header text, shown in this example app with the 3 different input options. \ No newline at end of file diff --git a/applications/examples/example_number_input/application.fam b/applications/examples/example_number_input/application.fam new file mode 100644 index 0000000000..58cff44962 --- /dev/null +++ b/applications/examples/example_number_input/application.fam @@ -0,0 +1,10 @@ +App( + appid="example_number_input", + name="Example: Number Input", + apptype=FlipperAppType.EXTERNAL, + entry_point="example_number_input", + requires=["gui"], + stack_size=1 * 1024, + fap_icon="example_number_input_10px.png", + fap_category="Examples", +) diff --git a/applications/examples/example_number_input/example_number_input.c b/applications/examples/example_number_input/example_number_input.c new file mode 100644 index 0000000000..19d787ef5f --- /dev/null +++ b/applications/examples/example_number_input/example_number_input.c @@ -0,0 +1,79 @@ +#include "example_number_input.h" + +bool example_number_input_custom_event_callback(void* context, uint32_t event) { + furi_assert(context); + ExampleNumberInput* app = context; + return scene_manager_handle_custom_event(app->scene_manager, event); +} + +static bool example_number_input_back_event_callback(void* context) { + furi_assert(context); + ExampleNumberInput* app = context; + return scene_manager_handle_back_event(app->scene_manager); +} + +static ExampleNumberInput* example_number_input_alloc() { + ExampleNumberInput* app = malloc(sizeof(ExampleNumberInput)); + app->gui = furi_record_open(RECORD_GUI); + + app->view_dispatcher = view_dispatcher_alloc(); + + app->scene_manager = scene_manager_alloc(&example_number_input_scene_handlers, app); + view_dispatcher_set_event_callback_context(app->view_dispatcher, app); + view_dispatcher_set_custom_event_callback( + app->view_dispatcher, example_number_input_custom_event_callback); + view_dispatcher_set_navigation_event_callback( + app->view_dispatcher, example_number_input_back_event_callback); + + app->number_input = number_input_alloc(); + view_dispatcher_add_view( + app->view_dispatcher, + ExampleNumberInputViewIdNumberInput, + number_input_get_view(app->number_input)); + + app->dialog_ex = dialog_ex_alloc(); + view_dispatcher_add_view( + app->view_dispatcher, + ExampleNumberInputViewIdShowNumber, + dialog_ex_get_view(app->dialog_ex)); + + app->current_number = 5; + app->min_value = INT32_MIN; + app->max_value = INT32_MAX; + + return app; +} + +static void example_number_input_free(ExampleNumberInput* app) { + furi_assert(app); + + view_dispatcher_remove_view(app->view_dispatcher, ExampleNumberInputViewIdShowNumber); + dialog_ex_free(app->dialog_ex); + + view_dispatcher_remove_view(app->view_dispatcher, ExampleNumberInputViewIdNumberInput); + number_input_free(app->number_input); + + scene_manager_free(app->scene_manager); + view_dispatcher_free(app->view_dispatcher); + + furi_record_close(RECORD_GUI); + app->gui = NULL; + + //Remove whatever is left + free(app); +} + +int32_t example_number_input(void* p) { + UNUSED(p); + ExampleNumberInput* app = example_number_input_alloc(); + + view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); + + scene_manager_next_scene(app->scene_manager, ExampleNumberInputSceneShowNumber); + + view_dispatcher_run(app->view_dispatcher); + + example_number_input_free(app); + + return 0; +} diff --git a/applications/examples/example_number_input/example_number_input.h b/applications/examples/example_number_input/example_number_input.h new file mode 100644 index 0000000000..8d944e6fda --- /dev/null +++ b/applications/examples/example_number_input/example_number_input.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "scenes/example_number_input_scene.h" + +typedef struct ExampleNumberInputShowNumber ExampleNumberInputShowNumber; + +typedef enum { + ExampleNumberInputViewIdShowNumber, + ExampleNumberInputViewIdNumberInput, +} ExampleNumberInputViewId; + +typedef struct { + Gui* gui; + SceneManager* scene_manager; + ViewDispatcher* view_dispatcher; + + NumberInput* number_input; + DialogEx* dialog_ex; + + int32_t current_number; + int32_t min_value; + int32_t max_value; +} ExampleNumberInput; diff --git a/applications/examples/example_number_input/example_number_input_10px.png b/applications/examples/example_number_input/example_number_input_10px.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb494fcd0c81f061d38660c6b26b915fe6fd0d1 GIT binary patch literal 87 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2xkYHHq`AGms$$7dshE&W+{_*(0kM{zXS=p9} j^Z4-a_y}>Z9hPTjXpv=?IGw7P2-4x{>gTe~DWM4fFP{|f literal 0 HcmV?d00001 diff --git a/applications/examples/example_number_input/scenes/example_number_input_scene.c b/applications/examples/example_number_input/scenes/example_number_input_scene.c new file mode 100644 index 0000000000..caf77fa8ce --- /dev/null +++ b/applications/examples/example_number_input/scenes/example_number_input_scene.c @@ -0,0 +1,30 @@ +#include "example_number_input_scene.h" + +// Generate scene on_enter handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, +void (*const example_number_input_on_enter_handlers[])(void*) = { +#include "example_number_input_scene_config.h" +}; +#undef ADD_SCENE + +// Generate scene on_event handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event, +bool (*const example_number_input_on_event_handlers[])(void* context, SceneManagerEvent event) = { +#include "example_number_input_scene_config.h" +}; +#undef ADD_SCENE + +// Generate scene on_exit handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit, +void (*const example_number_input_on_exit_handlers[])(void* context) = { +#include "example_number_input_scene_config.h" +}; +#undef ADD_SCENE + +// Initialize scene handlers configuration structure +const SceneManagerHandlers example_number_input_scene_handlers = { + .on_enter_handlers = example_number_input_on_enter_handlers, + .on_event_handlers = example_number_input_on_event_handlers, + .on_exit_handlers = example_number_input_on_exit_handlers, + .scene_num = ExampleNumberInputSceneNum, +}; diff --git a/applications/examples/example_number_input/scenes/example_number_input_scene.h b/applications/examples/example_number_input/scenes/example_number_input_scene.h new file mode 100644 index 0000000000..49fcd256fb --- /dev/null +++ b/applications/examples/example_number_input/scenes/example_number_input_scene.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +// Generate scene id and total number +#define ADD_SCENE(prefix, name, id) ExampleNumberInputScene##id, +typedef enum { +#include "example_number_input_scene_config.h" + ExampleNumberInputSceneNum, +} ExampleNumberInputScene; +#undef ADD_SCENE + +extern const SceneManagerHandlers example_number_input_scene_handlers; + +// Generate scene on_enter handlers declaration +#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); +#include "example_number_input_scene_config.h" +#undef ADD_SCENE + +// Generate scene on_event handlers declaration +#define ADD_SCENE(prefix, name, id) \ + bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event); +#include "example_number_input_scene_config.h" +#undef ADD_SCENE + +// Generate scene on_exit handlers declaration +#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context); +#include "example_number_input_scene_config.h" +#undef ADD_SCENE diff --git a/applications/examples/example_number_input/scenes/example_number_input_scene_config.h b/applications/examples/example_number_input/scenes/example_number_input_scene_config.h new file mode 100644 index 0000000000..71acbda528 --- /dev/null +++ b/applications/examples/example_number_input/scenes/example_number_input_scene_config.h @@ -0,0 +1,4 @@ +ADD_SCENE(example_number_input, input_number, InputNumber) +ADD_SCENE(example_number_input, show_number, ShowNumber) +ADD_SCENE(example_number_input, input_max, InputMax) +ADD_SCENE(example_number_input, input_min, InputMin) diff --git a/applications/examples/example_number_input/scenes/example_number_input_scene_input_max.c b/applications/examples/example_number_input/scenes/example_number_input_scene_input_max.c new file mode 100644 index 0000000000..7478f58a70 --- /dev/null +++ b/applications/examples/example_number_input/scenes/example_number_input_scene_input_max.c @@ -0,0 +1,39 @@ +#include "../example_number_input.h" + +void example_number_input_scene_input_max_callback(void* context, int32_t number) { + ExampleNumberInput* app = context; + app->max_value = number; + view_dispatcher_send_custom_event(app->view_dispatcher, 0); +} + +void example_number_input_scene_input_max_on_enter(void* context) { + furi_assert(context); + ExampleNumberInput* app = context; + NumberInput* number_input = app->number_input; + + number_input_set_header_text(number_input, "Enter the maximum value"); + number_input_set_result_callback( + number_input, + example_number_input_scene_input_max_callback, + context, + app->max_value, + app->min_value, + INT32_MAX); + + view_dispatcher_switch_to_view(app->view_dispatcher, ExampleNumberInputViewIdNumberInput); +} + +bool example_number_input_scene_input_max_on_event(void* context, SceneManagerEvent event) { + ExampleNumberInput* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_previous_scene(app->scene_manager); + return true; + } + return consumed; +} + +void example_number_input_scene_input_max_on_exit(void* context) { + UNUSED(context); +} diff --git a/applications/examples/example_number_input/scenes/example_number_input_scene_input_min.c b/applications/examples/example_number_input/scenes/example_number_input_scene_input_min.c new file mode 100644 index 0000000000..ad76562328 --- /dev/null +++ b/applications/examples/example_number_input/scenes/example_number_input_scene_input_min.c @@ -0,0 +1,39 @@ +#include "../example_number_input.h" + +void example_number_input_scene_input_min_callback(void* context, int32_t number) { + ExampleNumberInput* app = context; + app->min_value = number; + view_dispatcher_send_custom_event(app->view_dispatcher, 0); +} + +void example_number_input_scene_input_min_on_enter(void* context) { + furi_assert(context); + ExampleNumberInput* app = context; + NumberInput* number_input = app->number_input; + + number_input_set_header_text(number_input, "Enter the minimum value"); + number_input_set_result_callback( + number_input, + example_number_input_scene_input_min_callback, + context, + app->min_value, + INT32_MIN, + app->max_value); + + view_dispatcher_switch_to_view(app->view_dispatcher, ExampleNumberInputViewIdNumberInput); +} + +bool example_number_input_scene_input_min_on_event(void* context, SceneManagerEvent event) { + ExampleNumberInput* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_previous_scene(app->scene_manager); + return true; + } + return consumed; +} + +void example_number_input_scene_input_min_on_exit(void* context) { + UNUSED(context); +} diff --git a/applications/examples/example_number_input/scenes/example_number_input_scene_input_number.c b/applications/examples/example_number_input/scenes/example_number_input_scene_input_number.c new file mode 100644 index 0000000000..d9b1fd52f4 --- /dev/null +++ b/applications/examples/example_number_input/scenes/example_number_input_scene_input_number.c @@ -0,0 +1,42 @@ +#include "../example_number_input.h" + +void example_number_input_scene_input_number_callback(void* context, int32_t number) { + ExampleNumberInput* app = context; + app->current_number = number; + view_dispatcher_send_custom_event(app->view_dispatcher, 0); +} + +void example_number_input_scene_input_number_on_enter(void* context) { + furi_assert(context); + ExampleNumberInput* app = context; + NumberInput* number_input = app->number_input; + + char str[50]; + snprintf(str, sizeof(str), "Set Number (%ld - %ld)", app->min_value, app->max_value); + + number_input_set_header_text(number_input, str); + number_input_set_result_callback( + number_input, + example_number_input_scene_input_number_callback, + context, + app->current_number, + app->min_value, + app->max_value); + + view_dispatcher_switch_to_view(app->view_dispatcher, ExampleNumberInputViewIdNumberInput); +} + +bool example_number_input_scene_input_number_on_event(void* context, SceneManagerEvent event) { + ExampleNumberInput* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { //Back button pressed + scene_manager_previous_scene(app->scene_manager); + return true; + } + return consumed; +} + +void example_number_input_scene_input_number_on_exit(void* context) { + UNUSED(context); +} diff --git a/applications/examples/example_number_input/scenes/example_number_input_scene_show_number.c b/applications/examples/example_number_input/scenes/example_number_input_scene_show_number.c new file mode 100644 index 0000000000..2afdaf5c10 --- /dev/null +++ b/applications/examples/example_number_input/scenes/example_number_input_scene_show_number.c @@ -0,0 +1,66 @@ +#include "../example_number_input.h" + +static void + example_number_input_scene_confirm_dialog_callback(DialogExResult result, void* context) { + ExampleNumberInput* app = context; + + view_dispatcher_send_custom_event(app->view_dispatcher, result); +} + +static void example_number_input_scene_update_view(void* context) { + ExampleNumberInput* app = context; + DialogEx* dialog_ex = app->dialog_ex; + + dialog_ex_set_header(dialog_ex, "The number is", 64, 0, AlignCenter, AlignTop); + + static char buffer[12]; //needs static for extended lifetime + + snprintf(buffer, sizeof(buffer), "%ld", app->current_number); + dialog_ex_set_text(dialog_ex, buffer, 64, 29, AlignCenter, AlignCenter); + + dialog_ex_set_left_button_text(dialog_ex, "Min"); + dialog_ex_set_right_button_text(dialog_ex, "Max"); + dialog_ex_set_center_button_text(dialog_ex, "Change"); + + dialog_ex_set_result_callback(dialog_ex, example_number_input_scene_confirm_dialog_callback); + dialog_ex_set_context(dialog_ex, app); +} + +void example_number_input_scene_show_number_on_enter(void* context) { + furi_assert(context); + ExampleNumberInput* app = context; + + example_number_input_scene_update_view(app); + + view_dispatcher_switch_to_view(app->view_dispatcher, ExampleNumberInputViewIdShowNumber); +} + +bool example_number_input_scene_show_number_on_event(void* context, SceneManagerEvent event) { + ExampleNumberInput* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + switch(event.event) { + case DialogExResultCenter: + scene_manager_next_scene(app->scene_manager, ExampleNumberInputSceneInputNumber); + consumed = true; + break; + case DialogExResultLeft: + scene_manager_next_scene(app->scene_manager, ExampleNumberInputSceneInputMin); + consumed = true; + break; + case DialogExResultRight: + scene_manager_next_scene(app->scene_manager, ExampleNumberInputSceneInputMax); + consumed = true; + break; + default: + break; + } + } + + return consumed; +} + +void example_number_input_scene_show_number_on_exit(void* context) { + UNUSED(context); +} diff --git a/applications/services/gui/application.fam b/applications/services/gui/application.fam index b7dd18baa1..b24f5bbb6a 100644 --- a/applications/services/gui/application.fam +++ b/applications/services/gui/application.fam @@ -19,6 +19,7 @@ App( "view_holder.h", "modules/button_menu.h", "modules/byte_input.h", + "modules/number_input.h", "modules/popup.h", "modules/text_input.h", "modules/widget.h", diff --git a/applications/services/gui/modules/number_input.c b/applications/services/gui/modules/number_input.c new file mode 100644 index 0000000000..777e557472 --- /dev/null +++ b/applications/services/gui/modules/number_input.c @@ -0,0 +1,443 @@ +#include "number_input.h" + +#include +#include +#include + +struct NumberInput { + View* view; +}; + +typedef struct { + const char text; + const size_t x; + const size_t y; +} NumberInputKey; + +typedef struct { + FuriString* header; + FuriString* text_buffer; + + int32_t current_number; + int32_t max_value; + int32_t min_value; + + NumberInputCallback callback; + void* callback_context; + + size_t selected_row; + size_t selected_column; +} NumberInputModel; + +static const size_t keyboard_origin_x = 7; +static const size_t keyboard_origin_y = 31; +static const size_t keyboard_row_count = 2; +static const char enter_symbol = '\r'; +static const char backspace_symbol = '\b'; +static const char sign_symbol = '-'; + +static const NumberInputKey keyboard_keys_row_1[] = { + {'0', 0, 12}, + {'1', 11, 12}, + {'2', 22, 12}, + {'3', 33, 12}, + {'4', 44, 12}, + {backspace_symbol, 103, 4}, +}; + +static const NumberInputKey keyboard_keys_row_2[] = { + {'5', 0, 26}, + {'6', 11, 26}, + {'7', 22, 26}, + {'8', 33, 26}, + {'9', 44, 26}, + {sign_symbol, 55, 17}, + {enter_symbol, 95, 17}, +}; + +static size_t number_input_get_row_size(size_t row_index) { + size_t row_size = 0; + + switch(row_index + 1) { + case 1: + row_size = COUNT_OF(keyboard_keys_row_1); + break; + case 2: + row_size = COUNT_OF(keyboard_keys_row_2); + break; + default: + furi_crash(); + } + + return row_size; +} + +static const NumberInputKey* number_input_get_row(size_t row_index) { + const NumberInputKey* row = NULL; + + switch(row_index + 1) { + case 1: + row = keyboard_keys_row_1; + break; + case 2: + row = keyboard_keys_row_2; + break; + default: + furi_crash(); + } + + return row; +} + +static void number_input_draw_input(Canvas* canvas, NumberInputModel* model) { + const size_t text_x = 8; + const size_t text_y = 25; + + elements_slightly_rounded_frame(canvas, 6, 14, 116, 15); + + canvas_draw_str(canvas, text_x, text_y, furi_string_get_cstr(model->text_buffer)); +} + +static bool number_input_use_sign(NumberInputModel* model) { + //only show sign button if allowed number range needs it + if(model->min_value < 0 && model->max_value >= 0) { + return true; + } + return false; +} + +static void number_input_backspace_cb(NumberInputModel* model) { + size_t text_length = furi_string_utf8_length(model->text_buffer); + if(text_length < 1 || (text_length < 2 && model->current_number <= 0)) { + return; + } + furi_string_set_strn( + model->text_buffer, furi_string_get_cstr(model->text_buffer), text_length - 1); + model->current_number = strtol(furi_string_get_cstr(model->text_buffer), NULL, 10); +} + +static void number_input_handle_up(NumberInputModel* model) { + if(model->selected_row > 0) { + model->selected_row--; + if(model->selected_column > number_input_get_row_size(model->selected_row) - 1) { + model->selected_column = number_input_get_row_size(model->selected_row) - 1; + } + } +} + +static void number_input_handle_down(NumberInputModel* model) { + if(model->selected_row < keyboard_row_count - 1) { + if(model->selected_column >= number_input_get_row_size(model->selected_row) - 1) { + model->selected_column = number_input_get_row_size(model->selected_row + 1) - 1; + } + model->selected_row += 1; + } + const NumberInputKey* keys = number_input_get_row(model->selected_row); + if(keys[model->selected_column].text == sign_symbol && !number_input_use_sign(model)) { + model->selected_column--; + } +} + +static void number_input_handle_left(NumberInputModel* model) { + if(model->selected_column > 0) { + model->selected_column--; + } else { + model->selected_column = number_input_get_row_size(model->selected_row) - 1; + } + const NumberInputKey* keys = number_input_get_row(model->selected_row); + if(keys[model->selected_column].text == sign_symbol && !number_input_use_sign(model)) { + model->selected_column--; + } +} + +static void number_input_handle_right(NumberInputModel* model) { + if(model->selected_column < number_input_get_row_size(model->selected_row) - 1) { + model->selected_column++; + } else { + model->selected_column = 0; + } + const NumberInputKey* keys = number_input_get_row(model->selected_row); + if(keys[model->selected_column].text == sign_symbol && !number_input_use_sign(model)) { + model->selected_column++; + } +} + +static bool is_number_too_large(NumberInputModel* model) { + int64_t value = strtoll(furi_string_get_cstr(model->text_buffer), NULL, 10); + if(value > (int64_t)model->max_value) { + return true; + } + return false; +} + +static bool is_number_too_small(NumberInputModel* model) { + int64_t value = strtoll(furi_string_get_cstr(model->text_buffer), NULL, 10); + if(value < (int64_t)model->min_value) { + return true; + } + return false; +} + +static void number_input_sign(NumberInputModel* model) { + int32_t number = strtol(furi_string_get_cstr(model->text_buffer), NULL, 10); + if(number == 0 && furi_string_cmp_str(model->text_buffer, "-") != 0) { + furi_string_set_str(model->text_buffer, "-"); + return; + } + number = number * -1; + furi_string_printf(model->text_buffer, "%ld", number); + if(is_number_too_large(model) || is_number_too_small(model)) { + furi_string_printf(model->text_buffer, "%ld", model->current_number); + return; + } + model->current_number = strtol(furi_string_get_cstr(model->text_buffer), NULL, 10); + if(model->current_number == 0) { + furi_string_set_str(model->text_buffer, ""); //show empty if 0, better for usability + } +} + +static void number_input_add_digit(NumberInputModel* model, char* newChar) { + furi_string_cat_str(model->text_buffer, newChar); + if((model->max_value >= 0 && is_number_too_large(model)) || + (model->min_value < 0 && is_number_too_small(model))) { + //you still need to be able to type invalid numbers in some cases to reach valid numbers on later keypress + furi_string_printf(model->text_buffer, "%ld", model->current_number); + return; + } + model->current_number = strtol(furi_string_get_cstr(model->text_buffer), NULL, 10); + if(model->current_number == 0) { + furi_string_reset(model->text_buffer); + } +} + +static void number_input_handle_ok(NumberInputModel* model) { + char selected = number_input_get_row(model->selected_row)[model->selected_column].text; + char temp_str[2] = {selected, '\0'}; + if(selected == enter_symbol) { + if(is_number_too_large(model) || is_number_too_small(model)) { + return; //Do nothing if number outside allowed range + } + model->current_number = strtol(furi_string_get_cstr(model->text_buffer), NULL, 10); + model->callback(model->callback_context, model->current_number); + } else if(selected == backspace_symbol) { + number_input_backspace_cb(model); + } else if(selected == sign_symbol) { + number_input_sign(model); + } else { + number_input_add_digit(model, temp_str); + } +} + +static void number_input_view_draw_callback(Canvas* canvas, void* _model) { + NumberInputModel* model = _model; + + number_input_draw_input(canvas, model); + + if(!furi_string_empty(model->header)) { + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas, 2, 9, furi_string_get_cstr(model->header)); + } + canvas_set_font(canvas, FontKeyboard); + // Draw keyboard + for(size_t row = 0; row < keyboard_row_count; row++) { + const size_t column_count = number_input_get_row_size(row); + const NumberInputKey* keys = number_input_get_row(row); + + for(size_t column = 0; column < column_count; column++) { + if(keys[column].text == sign_symbol && !number_input_use_sign(model)) { + continue; + } + + if(keys[column].text == enter_symbol) { + if(is_number_too_small(model) || is_number_too_large(model)) { + //in some cases you need to be able to type a number smaller/larger than the limits (expl. min = 50, clear all and editor must allow to type 9 and later 0 for 90) + if(model->selected_row == row && model->selected_column == column) { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeySaveBlockedSelected_24x11); + } else { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeySaveBlocked_24x11); + } + } else { + if(model->selected_row == row && model->selected_column == column) { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeySaveSelected_24x11); + } else { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeySave_24x11); + } + } + } else if(keys[column].text == backspace_symbol) { + if(model->selected_row == row && model->selected_column == column) { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeyBackspaceSelected_16x9); + } else { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeyBackspace_16x9); + } + } else if(keys[column].text == sign_symbol) { + if(model->selected_row == row && model->selected_column == column) { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeySignSelected_21x11); + } else { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeySign_21x11); + } + } else { + if(model->selected_row == row && model->selected_column == column) { + canvas_draw_box( + canvas, + keyboard_origin_x + keys[column].x - 3, + keyboard_origin_y + keys[column].y - 10, + 11, + 13); + canvas_set_color(canvas, ColorWhite); + } + + canvas_draw_glyph( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + keys[column].text); + canvas_set_color(canvas, ColorBlack); + } + } + } +} + +static bool number_input_view_input_callback(InputEvent* event, void* context) { + furi_assert(context); + NumberInput* number_input = context; + + bool consumed = false; + + // Fetch the model + NumberInputModel* model = view_get_model(number_input->view); + + if(event->type == InputTypeShort || event->type == InputTypeLong || + event->type == InputTypeRepeat) { + consumed = true; + switch(event->key) { + case InputKeyLeft: + number_input_handle_left(model); + break; + case InputKeyRight: + number_input_handle_right(model); + break; + case InputKeyUp: + number_input_handle_up(model); + break; + case InputKeyDown: + number_input_handle_down(model); + break; + case InputKeyOk: + number_input_handle_ok(model); + break; + default: + consumed = false; + break; + } + } + + // commit view + view_commit_model(number_input->view, consumed); + + return consumed; +} + +NumberInput* number_input_alloc(void) { + NumberInput* number_input = malloc(sizeof(NumberInput)); + number_input->view = view_alloc(); + view_set_context(number_input->view, number_input); + view_allocate_model(number_input->view, ViewModelTypeLocking, sizeof(NumberInputModel)); + view_set_draw_callback(number_input->view, number_input_view_draw_callback); + view_set_input_callback(number_input->view, number_input_view_input_callback); + + with_view_model( + number_input->view, + NumberInputModel * model, + { + model->header = furi_string_alloc(); + model->text_buffer = furi_string_alloc(); + }, + true); + + return number_input; +} + +void number_input_free(NumberInput* number_input) { + furi_check(number_input); + with_view_model( + number_input->view, + NumberInputModel * model, + { + furi_string_free(model->header); + furi_string_free(model->text_buffer); + }, + true); + view_free(number_input->view); + free(number_input); +} + +View* number_input_get_view(NumberInput* number_input) { + furi_check(number_input); + return number_input->view; +} + +void number_input_set_result_callback( + NumberInput* number_input, + NumberInputCallback callback, + void* callback_context, + int32_t current_number, + int32_t min_value, + int32_t max_value) { + furi_check(number_input); + + current_number = CLAMP(current_number, max_value, min_value); + + with_view_model( + number_input->view, + NumberInputModel * model, + { + model->callback = callback; + model->callback_context = callback_context; + model->current_number = current_number; + furi_string_printf(model->text_buffer, "%ld", current_number); + model->min_value = min_value; + model->max_value = max_value; + }, + true); +} + +void number_input_set_header_text(NumberInput* number_input, const char* text) { + furi_check(number_input); + with_view_model( + number_input->view, + NumberInputModel * model, + { furi_string_set(model->header, text); }, + true); +} diff --git a/applications/services/gui/modules/number_input.h b/applications/services/gui/modules/number_input.h new file mode 100644 index 0000000000..80e631e9bd --- /dev/null +++ b/applications/services/gui/modules/number_input.h @@ -0,0 +1,69 @@ +/** + * @file number_input.h + * GUI: Integer string keyboard view module API + */ + +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Number input anonymous structure */ +typedef struct NumberInput NumberInput; + +/** Callback to be called on save button press */ +typedef void (*NumberInputCallback)(void* context, int32_t number); + +/** Allocate and initialize Number input. + * + * This Number input is used to enter Numbers (Integers). + * + * @return NumberInput instance pointer + */ +NumberInput* number_input_alloc(void); + +/** Deinitialize and free byte input + * + * @param number_input Number input instance + */ +void number_input_free(NumberInput* number_input); + +/** Get byte input view + * + * @param number_input byte input instance + * + * @return View instance that can be used for embedding + */ +View* number_input_get_view(NumberInput* number_input); + +/** Set byte input result callback + * + * @param number_input byte input instance + * @param input_callback input callback fn + * @param callback_context callback context + * @param[in] current_number The current number + * @param min_value Min number value + * @param max_value Max number value + */ + +void number_input_set_result_callback( + NumberInput* number_input, + NumberInputCallback input_callback, + void* callback_context, + int32_t current_number, + int32_t min_value, + int32_t max_value); + +/** Set byte input header text + * + * @param number_input byte input instance + * @param text text to be shown + */ +void number_input_set_header_text(NumberInput* number_input, const char* text); + +#ifdef __cplusplus +} +#endif diff --git a/assets/icons/Keyboard/KeySaveBlockedSelected_24x11.png b/assets/icons/Keyboard/KeySaveBlockedSelected_24x11.png new file mode 100644 index 0000000000000000000000000000000000000000..fe570a10c3790ca7702dad17af23aea531a7b5bd GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^5mdK II;Vst05s$xcmMzZ literal 0 HcmV?d00001 diff --git a/assets/icons/Keyboard/KeySaveSelected_24x11.png b/assets/icons/Keyboard/KeySaveSelected_24x11.png index 25bc446e485413a6c282c94a7037bd6c4657f33e..abfced776fe8fcf80671f7d15c6ca074db382bbd 100644 GIT binary patch delta 42 wcmaz`n4rR^?&;zfQZXkvBOxKBfpMaNwD3K)elArHCk7z!boFyt=akR{029j$TL1t6 delta 63 zcmYd@o1kK)>gnPbQZXkvBf)`T-gLH}CZSJ0_7XfZ{u#_km{5_%Fg-gVfrX)aD_h?S Sp6(t7AnbP0l+XkKe!U2C delta 29 jcmd1Ho1o8_FwsC;n2RSXv%4Ul0SG)@{an^LB{Ts5djAMP diff --git a/assets/icons/Keyboard/KeySignSelected_21x11.png b/assets/icons/Keyboard/KeySignSelected_21x11.png new file mode 100644 index 0000000000000000000000000000000000000000..23ec2a9c4458c3801ec6a50b96acd2e6132f0aae GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{e2qYMGZ1{ZvNU3?cIEGZrNzO=kkkG&=#>b|{ q2E>^knR#^hczk&H3N+i;*!URCH#031T7H!cq|?*Y&t;ucLK6U`C>3h} literal 0 HcmV?d00001 diff --git a/assets/icons/Keyboard/KeySign_21x11.png b/assets/icons/Keyboard/KeySign_21x11.png new file mode 100644 index 0000000000000000000000000000000000000000..f31e9e0fae1263c9819cd7b6fb8cf6eb460fb453 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{e2qYMGZ1{ZvNSS!LIEGZrVLfQb%b>vHdhq&u zzON0EOB8vHTMRapDrlDT99q4OVXuoy)biDDHPt>fGMIPsTYli4wTNNg3XnOTu6{1- HoD!M<{D~mM literal 0 HcmV?d00001 diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index baf1f8a802..69d45e8681 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,72.0,, +Version,+,72.1,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/cli/cli.h,, @@ -13,6 +13,7 @@ Header,+,applications/services/gui/icon_i.h,, Header,+,applications/services/gui/modules/button_menu.h,, Header,+,applications/services/gui/modules/button_panel.h,, Header,+,applications/services/gui/modules/byte_input.h,, +Header,+,applications/services/gui/modules/number_input.h,, Header,+,applications/services/gui/modules/dialog_ex.h,, Header,+,applications/services/gui/modules/empty_screen.h,, Header,+,applications/services/gui/modules/file_browser.h,, @@ -722,6 +723,11 @@ Function,+,byte_input_free,void,ByteInput* Function,+,byte_input_get_view,View*,ByteInput* Function,+,byte_input_set_header_text,void,"ByteInput*, const char*" Function,+,byte_input_set_result_callback,void,"ByteInput*, ByteInputCallback, ByteChangedCallback, void*, uint8_t*, uint8_t" +Function,+,number_input_alloc,NumberInput*, +Function,+,number_input_free,void,NumberInput* +Function,+,number_input_get_view,View*,NumberInput* +Function,+,number_input_set_header_text,void,"NumberInput*, const char*" +Function,+,number_input_set_result_callback,void,"NumberInput*, NumberInputCallback, void*, int32_t, int32_t, int32_t" Function,-,bzero,void,"void*, size_t" Function,+,calloc,void*,"size_t, size_t" Function,+,canvas_clear,void,Canvas* diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index cb3471e60a..991569a291 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,72.0,, +Version,+,72.1,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, @@ -20,6 +20,7 @@ Header,+,applications/services/gui/modules/file_browser.h,, Header,+,applications/services/gui/modules/file_browser_worker.h,, Header,+,applications/services/gui/modules/loading.h,, Header,+,applications/services/gui/modules/menu.h,, +Header,+,applications/services/gui/modules/number_input.h,, Header,+,applications/services/gui/modules/popup.h,, Header,+,applications/services/gui/modules/submenu.h,, Header,+,applications/services/gui/modules/text_box.h,, @@ -2815,6 +2816,11 @@ Function,+,notification_internal_message_block,void,"NotificationApp*, const Not Function,+,notification_message,void,"NotificationApp*, const NotificationSequence*" Function,+,notification_message_block,void,"NotificationApp*, const NotificationSequence*" Function,-,nrand48,long,unsigned short[3] +Function,+,number_input_alloc,NumberInput*, +Function,+,number_input_free,void,NumberInput* +Function,+,number_input_get_view,View*,NumberInput* +Function,+,number_input_set_header_text,void,"NumberInput*, const char*" +Function,+,number_input_set_result_callback,void,"NumberInput*, NumberInputCallback, void*, int32_t, int32_t, int32_t" Function,-,on_exit,int,"void (*)(int, void*), void*" Function,+,onewire_host_alloc,OneWireHost*,const GpioPin* Function,+,onewire_host_free,void,OneWireHost* From 235cb649a673fc6b526d63dc5d0c992c1df609d2 Mon Sep 17 00:00:00 2001 From: Georgii Surkov <37121527+gsurkov@users.noreply.github.com> Date: Fri, 9 Aug 2024 07:40:42 +0100 Subject: [PATCH 35/52] [FL-3883] Remove internal storage folder if corresponding flag set (#3824) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove the .int directory when the flag is set * Improve error handling and variable naming * Cleanup the code * Fix updater build Co-authored-by: あく --- applications/services/storage/storage.c | 5 - .../storage/storage_internal_dirname_i.h | 3 + .../services/storage/storage_processing.c | 8 +- .../services/storage/storages/storage_ext.c | 104 +++++++++++++++--- 4 files changed, 98 insertions(+), 22 deletions(-) create mode 100644 applications/services/storage/storage_internal_dirname_i.h diff --git a/applications/services/storage/storage.c b/applications/services/storage/storage.c index bfe2a08b21..d05ffb6356 100644 --- a/applications/services/storage/storage.c +++ b/applications/services/storage/storage.c @@ -102,11 +102,6 @@ int32_t storage_srv(void* p) { Storage* app = storage_app_alloc(); furi_record_create(RECORD_STORAGE, app); - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagStorageFormatInternal)) { - FURI_LOG_W(TAG, "Format Internal not supported, clearing flag"); - furi_hal_rtc_reset_flag(FuriHalRtcFlagStorageFormatInternal); - } - StorageMessage message; while(1) { if(furi_message_queue_get(app->message_queue, &message, STORAGE_TICK) == FuriStatusOk) { diff --git a/applications/services/storage/storage_internal_dirname_i.h b/applications/services/storage/storage_internal_dirname_i.h new file mode 100644 index 0000000000..889bdc4976 --- /dev/null +++ b/applications/services/storage/storage_internal_dirname_i.h @@ -0,0 +1,3 @@ +#pragma once + +#define STORAGE_INTERNAL_DIR_NAME ".int" diff --git a/applications/services/storage/storage_processing.c b/applications/services/storage/storage_processing.c index 5645899307..8d86dd3851 100644 --- a/applications/services/storage/storage_processing.c +++ b/applications/services/storage/storage_processing.c @@ -1,7 +1,9 @@ -#include "storage_processing.h" #include #include +#include "storage_processing.h" +#include "storage_internal_dirname_i.h" + #define TAG "Storage" #define STORAGE_PATH_PREFIX_LEN 4u @@ -555,9 +557,9 @@ void storage_process_alias( } else if(furi_string_start_with(path, STORAGE_INT_PATH_PREFIX)) { furi_string_replace_at( - path, 0, strlen(STORAGE_INT_PATH_PREFIX), STORAGE_EXT_PATH_PREFIX "/.int"); + path, 0, strlen(STORAGE_INT_PATH_PREFIX), EXT_PATH(STORAGE_INTERNAL_DIR_NAME)); - FuriString* int_on_ext_path = furi_string_alloc_set(STORAGE_EXT_PATH_PREFIX "/.int"); + FuriString* int_on_ext_path = furi_string_alloc_set(EXT_PATH(STORAGE_INTERNAL_DIR_NAME)); if(storage_process_common_stat(app, int_on_ext_path, NULL) != FSE_OK) { storage_process_common_mkdir(app, int_on_ext_path); } diff --git a/applications/services/storage/storages/storage_ext.c b/applications/services/storage/storages/storage_ext.c index 93e06f6632..a945f1cd51 100644 --- a/applications/services/storage/storages/storage_ext.c +++ b/applications/services/storage/storages/storage_ext.c @@ -1,10 +1,13 @@ -#include "fatfs.h" -#include "../filesystem_api_internal.h" -#include "storage_ext.h" +#include #include -#include "sd_notify.h" #include +#include "sd_notify.h" +#include "storage_ext.h" + +#include "../filesystem_api_internal.h" +#include "../storage_internal_dirname_i.h" + typedef FIL SDFile; typedef DIR SDDir; typedef FILINFO SDFileInfo; @@ -93,6 +96,64 @@ static bool sd_mount_card_internal(StorageData* storage, bool notify) { return result; } +static bool sd_remove_recursive(const char* path) { + SDDir* current_dir = malloc(sizeof(DIR)); + SDFileInfo* file_info = malloc(sizeof(FILINFO)); + FuriString* current_path = furi_string_alloc_set(path); + + bool go_deeper = false; + SDError status; + + while(true) { + status = f_opendir(current_dir, furi_string_get_cstr(current_path)); + if(status != FR_OK) break; + + while(true) { + status = f_readdir(current_dir, file_info); + if(status != FR_OK || !strlen(file_info->fname)) break; + + if(file_info->fattrib & AM_DIR) { + furi_string_cat_printf(current_path, "/%s", file_info->fname); + go_deeper = true; + break; + + } else { + FuriString* file_path = furi_string_alloc_printf( + "%s/%s", furi_string_get_cstr(current_path), file_info->fname); + status = f_unlink(furi_string_get_cstr(file_path)); + furi_string_free(file_path); + + if(status != FR_OK) break; + } + } + + status = f_closedir(current_dir); + if(status != FR_OK) break; + + if(go_deeper) { + go_deeper = false; + continue; + } + + status = f_unlink(furi_string_get_cstr(current_path)); + if(status != FR_OK) break; + + if(!furi_string_equal(current_path, path)) { + size_t last_char_pos = furi_string_search_rchar(current_path, '/'); + furi_assert(last_char_pos != FURI_STRING_FAILURE); + furi_string_left(current_path, last_char_pos); + } else { + break; + } + } + + free(current_dir); + free(file_info); + furi_string_free(current_path); + + return status == FR_OK; +} + FS_Error sd_unmount_card(StorageData* storage) { SDData* sd_data = storage->data; SDError error; @@ -112,21 +173,32 @@ FS_Error sd_mount_card(StorageData* storage, bool notify) { if(storage->status != StorageStatusOK) { FURI_LOG_E(TAG, "sd init error: %s", storage_data_status_text(storage)); - if(notify) { - NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); - sd_notify_error(notification); - furi_record_close(RECORD_NOTIFICATION); - } error = FSE_INTERNAL; + } else { FURI_LOG_I(TAG, "card mounted"); - if(notify) { - NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); - sd_notify_success(notification); - furi_record_close(RECORD_NOTIFICATION); - } +#ifndef FURI_RAM_EXEC + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagStorageFormatInternal)) { + FURI_LOG_I(TAG, "deleting internal storage directory"); + error = sd_remove_recursive(STORAGE_INTERNAL_DIR_NAME) ? FSE_OK : FSE_INTERNAL; + } else { + error = FSE_OK; + } +#else + UNUSED(sd_remove_recursive); error = FSE_OK; +#endif + } + + if(notify) { + NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); + if(error != FSE_OK) { + sd_notify_error(notification); + } else { + sd_notify_success(notification); + } + furi_record_close(RECORD_NOTIFICATION); } return error; @@ -654,4 +726,8 @@ void storage_ext_init(StorageData* storage) { // do not notify on first launch, notifications app is waiting for our thread to read settings storage_ext_tick_internal(storage, false); +#ifndef FURI_RAM_EXEC + // always reset the flag to prevent accidental wipe on SD card insertion + furi_hal_rtc_reset_flag(FuriHalRtcFlagStorageFormatInternal); +#endif } From 3672efa7da14edbbfd9089805288e77652cb9726 Mon Sep 17 00:00:00 2001 From: RebornedBrain <138568282+RebornedBrain@users.noreply.github.com> Date: Fri, 9 Aug 2024 10:08:05 +0300 Subject: [PATCH 36/52] Now fifo size in ST25 chip is calculated properly (#3829) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: あく --- lib/drivers/st25r3916.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/drivers/st25r3916.c b/lib/drivers/st25r3916.c index 4772612135..f8dc9a5eb3 100644 --- a/lib/drivers/st25r3916.c +++ b/lib/drivers/st25r3916.c @@ -57,9 +57,12 @@ bool st25r3916_read_fifo( do { uint8_t fifo_status[2] = {}; st25r3916_read_burst_regs(handle, ST25R3916_REG_FIFO_STATUS1, fifo_status, 2); - size_t bytes = ((fifo_status[1] & ST25R3916_REG_FIFO_STATUS2_fifo_b_mask) >> - ST25R3916_REG_FIFO_STATUS2_fifo_b_shift) | - fifo_status[0]; + + uint16_t fifo_status_b9_b8 = + ((fifo_status[1] & ST25R3916_REG_FIFO_STATUS2_fifo_b_mask) >> + ST25R3916_REG_FIFO_STATUS2_fifo_b_shift); + size_t bytes = (fifo_status_b9_b8 << 8) | fifo_status[0]; + uint8_t bits = ((fifo_status[1] & ST25R3916_REG_FIFO_STATUS2_fifo_lb_mask) >> ST25R3916_REG_FIFO_STATUS2_fifo_lb_shift); From d2ff2825caf89c91030cba55d66c710a916301e5 Mon Sep 17 00:00:00 2001 From: Georgii Surkov <37121527+gsurkov@users.noreply.github.com> Date: Fri, 9 Aug 2024 08:14:40 +0100 Subject: [PATCH 37/52] [FL-3888] Make file extensions case-insensitive (#3828) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: あく --- .../main/archive/helpers/archive_files.c | 2 +- .../gui/modules/file_browser_worker.c | 2 +- furi/core/string.c | 19 ++++++++++++++ furi/core/string.h | 25 +++++++++++++++++++ targets/f18/api_symbols.csv | 2 ++ targets/f7/api_symbols.csv | 6 +++-- 6 files changed, 52 insertions(+), 4 deletions(-) diff --git a/applications/main/archive/helpers/archive_files.c b/applications/main/archive/helpers/archive_files.c index 2f4d6a02a7..7c15bf53ba 100644 --- a/applications/main/archive/helpers/archive_files.c +++ b/applications/main/archive/helpers/archive_files.c @@ -15,7 +15,7 @@ void archive_set_file_type(ArchiveFile_t* file, const char* path, bool is_folder } else { for(size_t i = 0; i < COUNT_OF(known_ext); i++) { if((known_ext[i][0] == '?') || (known_ext[i][0] == '*')) continue; - if(furi_string_end_with(file->path, known_ext[i])) { + if(furi_string_end_withi(file->path, known_ext[i])) { if(i == ArchiveFileTypeBadUsb) { if(furi_string_search( file->path, archive_get_default_path(ArchiveTabBadUsb)) == 0) { diff --git a/applications/services/gui/modules/file_browser_worker.c b/applications/services/gui/modules/file_browser_worker.c index a6b00537a0..521666e6d2 100644 --- a/applications/services/gui/modules/file_browser_worker.c +++ b/applications/services/gui/modules/file_browser_worker.c @@ -134,7 +134,7 @@ static bool browser_filter_by_name(BrowserWorker* browser, FuriString* name, boo if((furi_string_empty(ext)) || (furi_string_cmp_str(ext, "*") == 0)) { return true; } - if(furi_string_end_with(name, ext)) { + if(furi_string_end_withi(name, ext)) { return true; } } diff --git a/furi/core/string.c b/furi/core/string.c index f3e40fe5eb..804445e22d 100644 --- a/furi/core/string.c +++ b/furi/core/string.c @@ -17,6 +17,7 @@ struct FuriString { #undef furi_string_replace_all #undef furi_string_start_with #undef furi_string_end_with +#undef furi_string_end_withi #undef furi_string_search_char #undef furi_string_search_rchar #undef furi_string_trim @@ -218,10 +219,28 @@ bool furi_string_end_with(const FuriString* v, const FuriString* v2) { return string_end_with_string_p(v->string, v2->string); } +bool furi_string_end_withi(const FuriString* v, const FuriString* v2) { + return furi_string_end_withi_str(v, string_get_cstr(v2->string)); +} + bool furi_string_end_with_str(const FuriString* v, const char str[]) { return string_end_with_str_p(v->string, str); } +bool furi_string_end_withi_str(const FuriString* v, const char str[]) { + M_STR1NG_CONTRACT(v); + M_ASSERT(str != NULL); + + const size_t str_len = strlen(str); + const size_t v_len = string_size(v->string); + + if(v_len < str_len) { + return false; + } + + return strcasecmp(&string_get_cstr(v->string)[v_len - str_len], str) == 0; +} + size_t furi_string_search_char(const FuriString* v, char c, size_t start) { return string_search_char(v->string, c, start); } diff --git a/furi/core/string.h b/furi/core/string.h index 2bfb60e496..84b8c6a240 100644 --- a/furi/core/string.h +++ b/furi/core/string.h @@ -510,6 +510,15 @@ bool furi_string_start_with_str(const FuriString* string, const char start[]); */ bool furi_string_end_with(const FuriString* string, const FuriString* end); +/** Test if the string ends with the given string (case insensitive according to the current locale). + * + * @param string The FuriString instance + * @param end The end + * + * @return true if string ends with + */ +bool furi_string_end_withi(const FuriString* string, const FuriString* end); + /** Test if the string ends with the given C string. * * @param string The FuriString instance @@ -519,6 +528,15 @@ bool furi_string_end_with(const FuriString* string, const FuriString* end); */ bool furi_string_end_with_str(const FuriString* string, const char end[]); +/** Test if the string ends with the given C string (case insensitive according to the current locale). + * + * @param string The FuriString instance + * @param end The end + * + * @return true if string ends with + */ +bool furi_string_end_withi_str(const FuriString* string, const char end[]); + //--------------------------------------------------------------------------- // Trim //--------------------------------------------------------------------------- @@ -699,6 +717,13 @@ void furi_string_utf8_decode(char c, FuriStringUTF8State* state, FuriStringUnico #define furi_string_end_with(a, b) \ FURI_STRING_SELECT2(furi_string_end_with, furi_string_end_with_str, a, b) +/** Test if the string ends with the given string (or C string) (case insensitive according to the current locale). + * + * (string, [c]string) + */ +#define furi_string_end_withi(a, b) \ + FURI_STRING_SELECT2(furi_string_end_withi, furi_string_end_withi_str, a, b) + /** Append a string (or C string) to the string. * * (string, [c]string) diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index 69d45e8681..57cbd1d62e 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -1582,6 +1582,8 @@ Function,+,furi_string_cmpi_str,int,"const FuriString*, const char[]" Function,+,furi_string_empty,_Bool,const FuriString* Function,+,furi_string_end_with,_Bool,"const FuriString*, const FuriString*" Function,+,furi_string_end_with_str,_Bool,"const FuriString*, const char[]" +Function,+,furi_string_end_withi,_Bool,"const FuriString*, const FuriString*" +Function,+,furi_string_end_withi_str,_Bool,"const FuriString*, const char[]" Function,+,furi_string_equal,_Bool,"const FuriString*, const FuriString*" Function,+,furi_string_equal_str,_Bool,"const FuriString*, const char[]" Function,+,furi_string_free,void,FuriString* diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 991569a291..e44b3356c6 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1791,6 +1791,8 @@ Function,+,furi_string_cmpi_str,int,"const FuriString*, const char[]" Function,+,furi_string_empty,_Bool,const FuriString* Function,+,furi_string_end_with,_Bool,"const FuriString*, const FuriString*" Function,+,furi_string_end_with_str,_Bool,"const FuriString*, const char[]" +Function,+,furi_string_end_withi,_Bool,"const FuriString*, const FuriString*" +Function,+,furi_string_end_withi_str,_Bool,"const FuriString*, const char[]" Function,+,furi_string_equal,_Bool,"const FuriString*, const FuriString*" Function,+,furi_string_equal_str,_Bool,"const FuriString*, const char[]" Function,+,furi_string_free,void,FuriString* @@ -1959,8 +1961,8 @@ Function,+,ibutton_protocols_render_data,void,"iButtonProtocols*, const iButtonK Function,+,ibutton_protocols_render_error,void,"iButtonProtocols*, const iButtonKey*, FuriString*" Function,+,ibutton_protocols_render_uid,void,"iButtonProtocols*, const iButtonKey*, FuriString*" Function,+,ibutton_protocols_save,_Bool,"iButtonProtocols*, const iButtonKey*, const char*" -Function,+,ibutton_protocols_write_id,_Bool,"iButtonProtocols*, iButtonKey*" Function,+,ibutton_protocols_write_copy,_Bool,"iButtonProtocols*, iButtonKey*" +Function,+,ibutton_protocols_write_id,_Bool,"iButtonProtocols*, iButtonKey*" Function,+,ibutton_worker_alloc,iButtonWorker*,iButtonProtocols* Function,+,ibutton_worker_emulate_set_callback,void,"iButtonWorker*, iButtonWorkerEmulateCallback, void*" Function,+,ibutton_worker_emulate_start,void,"iButtonWorker*, iButtonKey*" @@ -1970,8 +1972,8 @@ Function,+,ibutton_worker_read_start,void,"iButtonWorker*, iButtonKey*" Function,+,ibutton_worker_start_thread,void,iButtonWorker* Function,+,ibutton_worker_stop,void,iButtonWorker* Function,+,ibutton_worker_stop_thread,void,iButtonWorker* -Function,+,ibutton_worker_write_id_start,void,"iButtonWorker*, iButtonKey*" Function,+,ibutton_worker_write_copy_start,void,"iButtonWorker*, iButtonKey*" +Function,+,ibutton_worker_write_id_start,void,"iButtonWorker*, iButtonKey*" Function,+,ibutton_worker_write_set_callback,void,"iButtonWorker*, iButtonWorkerWriteCallback, void*" Function,+,icon_animation_alloc,IconAnimation*,const Icon* Function,+,icon_animation_free,void,IconAnimation* From 4f75d92747e0cf325d8048c39fddc552cc613aa6 Mon Sep 17 00:00:00 2001 From: daubsi Date: Fri, 9 Aug 2024 10:24:57 +0200 Subject: [PATCH 38/52] Added protocol for Dickert MAHS garage door remote control (#3826) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added Dickert MAHS protocol * Update protocol_items.c * Added Dickert MAHS protocol reference * Update protocol_items.h * Removed logging and some defines * Reworked the send code to properly adhere to Dickert timings * Added subghz unit test for Dickert MAHS * Minor fix in encoding length * Added Dickert Decoder Test to subghz unit tests and set repeat=10 * SubGhz: cleanup dickert mahs code and documentation * SubGhz: correct type in for statement in dickert mahs Co-authored-by: あく --- .../unit_tests/subghz/dickert_mahs.sub | 7 + .../unit_tests/subghz/dickert_raw.sub | 7 + .../unit_tests/tests/subghz/subghz_test.c | 15 + lib/subghz/protocols/dickert_mahs.c | 385 ++++++++++++++++++ lib/subghz/protocols/dickert_mahs.h | 120 ++++++ lib/subghz/protocols/protocol_items.c | 1 + lib/subghz/protocols/protocol_items.h | 1 + 7 files changed, 536 insertions(+) create mode 100644 applications/debug/unit_tests/resources/unit_tests/subghz/dickert_mahs.sub create mode 100644 applications/debug/unit_tests/resources/unit_tests/subghz/dickert_raw.sub create mode 100644 lib/subghz/protocols/dickert_mahs.c create mode 100644 lib/subghz/protocols/dickert_mahs.h diff --git a/applications/debug/unit_tests/resources/unit_tests/subghz/dickert_mahs.sub b/applications/debug/unit_tests/resources/unit_tests/subghz/dickert_mahs.sub new file mode 100644 index 0000000000..9737b71a69 --- /dev/null +++ b/applications/debug/unit_tests/resources/unit_tests/subghz/dickert_mahs.sub @@ -0,0 +1,7 @@ +Filetype: Flipper SubGhz Key File +Version: 1 +Frequency: 433920000 +Preset: FuriHalSubGhzPresetOok650Async +Protocol: Dickert_MAHS +Bit: 36 +Key: 00 00 00 01 55 57 55 15 diff --git a/applications/debug/unit_tests/resources/unit_tests/subghz/dickert_raw.sub b/applications/debug/unit_tests/resources/unit_tests/subghz/dickert_raw.sub new file mode 100644 index 0000000000..544fc7a1d2 --- /dev/null +++ b/applications/debug/unit_tests/resources/unit_tests/subghz/dickert_raw.sub @@ -0,0 +1,7 @@ +Filetype: Flipper SubGhz RAW File +Version: 1 +Frequency: 433920000 +Preset: FuriHalSubGhzPresetOok650Async +Protocol: RAW +RAW_Data: 112254 -62882 64 -8912 798 -844 416 -418 806 -850 396 -45206 440 -428 794 -442 804 -422 822 -810 414 -414 824 -832 412 -416 808 -848 376 -446 792 -846 382 -448 816 -828 410 -416 810 -844 382 -416 834 -818 410 -414 810 -856 408 -810 412 -836 384 -442 808 -814 402 -844 414 -834 378 -436 808 -844 396 -422 798 -844 416 -416 814 -404 812 -440 810 -842 396 -422 798 -840 414 -414 806 -850 398 -45210 450 -420 796 -436 780 -446 802 -848 380 -434 806 -846 400 -422 800 -840 410 -408 836 -812 414 -410 826 -840 378 -440 804 -848 396 -426 812 -810 426 -394 826 -844 414 -810 420 -834 378 -442 808 -832 412 -812 416 -830 410 -406 810 -844 400 -420 832 -810 414 -416 800 -446 798 -440 812 -808 426 -410 800 -836 412 -414 806 -836 412 -45216 450 -420 798 -434 806 -414 802 -846 382 -438 814 -832 410 -410 838 -834 396 -430 810 -842 394 -392 826 -840 414 -414 802 -850 396 -428 812 -842 394 -394 828 -842 414 -810 424 -812 392 -434 812 -844 398 -848 380 -844 408 -416 820 -810 414 -406 816 -836 412 -416 836 -414 816 -398 816 -840 420 -410 802 -844 416 -416 804 -824 410 -45232 446 -400 802 -442 810 -432 804 -842 396 -392 826 -842 410 -410 834 -818 378 -442 804 -854 406 -408 806 -838 408 -428 804 -844 396 -392 826 -840 410 -410 834 -810 414 -832 408 -834 380 -440 802 -826 410 -836 412 -838 396 -424 796 -842 414 -414 804 -848 396 -426 812 -412 814 -414 824 -832 410 -416 806 -848 382 -420 834 -814 422 -45228 416 -422 802 -446 810 -420 790 -846 382 -448 818 -828 408 -416 808 -848 382 -418 830 -816 410 -412 812 -856 410 -382 834 -846 382 -418 832 -818 408 -412 812 -856 408 -814 414 -838 396 -428 810 -808 424 -836 380 -844 404 -416 802 -840 424 -394 826 -840 414 -382 836 -412 822 -436 812 -806 424 -394 826 -844 416 -382 838 -816 402 -45228 438 -430 796 -444 806 -424 822 -810 412 -416 822 -832 412 -416 804 -844 408 -414 824 -812 412 -408 812 -834 410 -414 804 -848 408 -412 802 -840 424 -412 802 -834 412 -842 384 -848 396 -426 814 -808 424 -816 392 -866 382 -414 838 -816 414 -428 792 -846 380 -440 810 -438 812 -412 802 -846 380 -438 826 -840 380 -416 838 -814 404 -45226 450 -404 820 -408 806 -452 792 -848 382 -440 814 -832 410 -416 810 -846 378 -450 792 -846 380 -446 816 -830 410 -386 836 -846 376 -410 828 -846 380 -446 814 -828 410 -814 414 -836 396 -428 810 -842 394 -816 410 -836 406 -430 812 -810 426 -394 826 -838 +RAW_Data: 414 -414 808 -416 826 -438 814 -816 420 -414 834 -814 418 -418 808 -848 398 -45218 412 -438 824 -412 812 -418 832 -852 378 -446 782 -862 410 -386 838 -848 384 -420 836 -820 418 -414 814 -854 408 -388 838 -814 418 -422 836 -816 394 -434 812 -846 398 -850 380 -848 410 -418 822 -812 416 -850 368 -854 412 -418 810 -850 384 -422 834 -820 416 -414 812 -428 836 -412 804 -848 382 -450 818 -828 412 -418 808 -850 380 -45228 452 -420 798 -434 806 -416 834 -818 384 -440 810 -820 404 -420 834 -814 416 -418 834 -824 386 -442 810 -818 404 -420 834 -814 416 -418 834 -820 410 -414 810 -850 406 -812 414 -816 404 -420 818 -838 386 -848 394 -828 414 -414 838 -814 406 -420 820 -842 384 -446 794 -438 810 -412 802 -848 394 -432 812 -842 394 -392 830 -842 414 -105578 64 -1760 130 -196 130 -832 160 -128 62 -1278 194 -1316 230 -96 362 -64 64 -398 diff --git a/applications/debug/unit_tests/tests/subghz/subghz_test.c b/applications/debug/unit_tests/tests/subghz/subghz_test.c index 90e6d429b2..ac14bce6a3 100644 --- a/applications/debug/unit_tests/tests/subghz/subghz_test.c +++ b/applications/debug/unit_tests/tests/subghz/subghz_test.c @@ -665,6 +665,13 @@ MU_TEST(subghz_decoder_mastercode_test) { "Test decoder " SUBGHZ_PROTOCOL_MASTERCODE_NAME " error\r\n"); } +MU_TEST(subghz_decoder_dickert_test) { + mu_assert( + subghz_decoder_test( + EXT_PATH("unit_tests/subghz/dickert_raw.sub"), SUBGHZ_PROTOCOL_DICKERT_MAHS_NAME), + "Test decoder " SUBGHZ_PROTOCOL_DICKERT_MAHS_NAME " error\r\n"); +} + //test encoders MU_TEST(subghz_encoder_princeton_test) { mu_assert( @@ -822,6 +829,12 @@ MU_TEST(subghz_encoder_mastercode_test) { "Test encoder " SUBGHZ_PROTOCOL_MASTERCODE_NAME " error\r\n"); } +MU_TEST(subghz_encoder_dickert_test) { + mu_assert( + subghz_encoder_test(EXT_PATH("unit_tests/subghz/dickert_mahs.sub")), + "Test encoder " SUBGHZ_PROTOCOL_DICKERT_MAHS_NAME " error\r\n"); +} + MU_TEST(subghz_random_test) { mu_assert(subghz_decode_random_test(TEST_RANDOM_DIR_NAME), "Random test error\r\n"); } @@ -873,6 +886,7 @@ MU_TEST_SUITE(subghz) { MU_RUN_TEST(subghz_decoder_nice_one_test); MU_RUN_TEST(subghz_decoder_kinggates_stylo4k_test); MU_RUN_TEST(subghz_decoder_mastercode_test); + MU_RUN_TEST(subghz_decoder_dickert_test); MU_RUN_TEST(subghz_encoder_princeton_test); MU_RUN_TEST(subghz_encoder_came_test); @@ -900,6 +914,7 @@ MU_TEST_SUITE(subghz) { MU_RUN_TEST(subghz_encoder_holtek_ht12x_test); MU_RUN_TEST(subghz_encoder_dooya_test); MU_RUN_TEST(subghz_encoder_mastercode_test); + MU_RUN_TEST(subghz_encoder_dickert_test); MU_RUN_TEST(subghz_random_test); subghz_test_deinit(); diff --git a/lib/subghz/protocols/dickert_mahs.c b/lib/subghz/protocols/dickert_mahs.c new file mode 100644 index 0000000000..4691e3423c --- /dev/null +++ b/lib/subghz/protocols/dickert_mahs.c @@ -0,0 +1,385 @@ +#include "dickert_mahs.h" + +#include "../blocks/const.h" +#include "../blocks/decoder.h" +#include "../blocks/encoder.h" +#include "../blocks/generic.h" +#include "../blocks/math.h" + +#include +#include +#include + +#define TAG "SubGhzProtocolDicketMAHS" + +static const SubGhzBlockConst subghz_protocol_dickert_mahs_const = { + .te_short = 400, + .te_long = 800, + .te_delta = 100, + .min_count_bit_for_found = 36, +}; + +struct SubGhzProtocolDecoderDickertMAHS { + SubGhzProtocolDecoderBase base; + + SubGhzBlockDecoder decoder; + SubGhzBlockGeneric generic; + + uint32_t tmp[2]; + uint8_t tmp_cnt; +}; + +struct SubGhzProtocolEncoderDickertMAHS { + SubGhzProtocolEncoderBase base; + + SubGhzProtocolBlockEncoder encoder; + SubGhzBlockGeneric generic; +}; + +typedef enum { + DickertMAHSDecoderStepReset = 0, + DickertMAHSDecoderStepInitial, + DickertMAHSDecoderStepRecording, +} DickertMAHSDecoderStep; + +const SubGhzProtocolDecoder subghz_protocol_dickert_mahs_decoder = { + .alloc = subghz_protocol_decoder_dickert_mahs_alloc, + .free = subghz_protocol_decoder_dickert_mahs_free, + + .feed = subghz_protocol_decoder_dickert_mahs_feed, + .reset = subghz_protocol_decoder_dickert_mahs_reset, + + .get_hash_data = subghz_protocol_decoder_dickert_mahs_get_hash_data, + .serialize = subghz_protocol_decoder_dickert_mahs_serialize, + .deserialize = subghz_protocol_decoder_dickert_mahs_deserialize, + .get_string = subghz_protocol_decoder_dickert_mahs_get_string, +}; + +const SubGhzProtocolEncoder subghz_protocol_dickert_mahs_encoder = { + .alloc = subghz_protocol_encoder_dickert_mahs_alloc, + .free = subghz_protocol_encoder_dickert_mahs_free, + + .deserialize = subghz_protocol_encoder_dickert_mahs_deserialize, + .stop = subghz_protocol_encoder_dickert_mahs_stop, + .yield = subghz_protocol_encoder_dickert_mahs_yield, +}; + +const SubGhzProtocol subghz_protocol_dickert_mahs = { + .name = SUBGHZ_PROTOCOL_DICKERT_MAHS_NAME, + .type = SubGhzProtocolTypeStatic, + .flag = SubGhzProtocolFlag_433 | SubGhzProtocolFlag_AM | SubGhzProtocolFlag_Decodable | + SubGhzProtocolFlag_Load | SubGhzProtocolFlag_Save | SubGhzProtocolFlag_Send, + + .decoder = &subghz_protocol_dickert_mahs_decoder, + .encoder = &subghz_protocol_dickert_mahs_encoder, +}; + +static void subghz_protocol_encoder_dickert_mahs_parse_buffer( + SubGhzProtocolDecoderDickertMAHS* instance, + FuriString* output) { + // We assume we have only decodes < 64 bit! + uint64_t data = instance->generic.data; + uint8_t bits[36] = {}; + + // Convert uint64_t into bit array + for(int i = 35; i >= 0; i--) { + if(data & 1) { + bits[i] = 1; + } + data >>= 1; + } + + // Decode symbols + FuriString* code = furi_string_alloc(); + for(size_t i = 0; i < 35; i += 2) { + uint8_t dip = (bits[i] << 1) + bits[i + 1]; + // PLUS = 3, // 0b11 + // ZERO = 1, // 0b01 + // MINUS = 0, // 0x00 + if(dip == 0x01) { + furi_string_cat(code, "0"); + } else if(dip == 0x00) { + furi_string_cat(code, "-"); + } else if(dip == 0x03) { + furi_string_cat(code, "+"); + } else { + furi_string_cat(code, "?"); + } + } + + FuriString* user_dips = furi_string_alloc(); + FuriString* fact_dips = furi_string_alloc(); + furi_string_set_n(user_dips, code, 0, 10); + furi_string_set_n(fact_dips, code, 10, 8); + + furi_string_cat_printf( + output, + "%s\r\n" + "User-Dips:\t%s\r\n" + "Fac-Code:\t%s\r\n", + instance->generic.protocol_name, + furi_string_get_cstr(user_dips), + furi_string_get_cstr(fact_dips)); + furi_string_free(user_dips); + furi_string_free(fact_dips); + furi_string_free(code); +} + +void* subghz_protocol_encoder_dickert_mahs_alloc(SubGhzEnvironment* environment) { + UNUSED(environment); + SubGhzProtocolEncoderDickertMAHS* instance = malloc(sizeof(SubGhzProtocolEncoderDickertMAHS)); + + instance->base.protocol = &subghz_protocol_dickert_mahs; + instance->generic.protocol_name = instance->base.protocol->name; + + instance->encoder.repeat = 10; + instance->encoder.size_upload = 128; + instance->encoder.upload = malloc(instance->encoder.size_upload * sizeof(LevelDuration)); + instance->encoder.is_running = false; + return instance; +} + +void subghz_protocol_encoder_dickert_mahs_free(void* context) { + furi_assert(context); + SubGhzProtocolEncoderDickertMAHS* instance = context; + free(instance->encoder.upload); + free(instance); +} + +/** + * Generating an upload from data. + * @param instance Pointer to a SubGhzProtocolEncoderDickertMAHS instance + * @return true On success + */ +static bool + subghz_protocol_encoder_dickert_mahs_get_upload(SubGhzProtocolEncoderDickertMAHS* instance) { + furi_assert(instance); + size_t index = 0; + size_t size_upload = (instance->generic.data_count_bit * 2) + 2; + if(size_upload > instance->encoder.size_upload) { + FURI_LOG_E(TAG, "Size upload exceeds allocated encoder buffer."); + return false; + } else { + instance->encoder.size_upload = size_upload; + } + + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_dickert_mahs_const.te_short * 112); + // Send start bit + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_dickert_mahs_const.te_short); + + //Send key data + for(uint8_t i = instance->generic.data_count_bit; i > 0; i--) { + if(bit_read(instance->generic.data, i - 1)) { + //send bit 1 + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_dickert_mahs_const.te_long); + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_dickert_mahs_const.te_short); + } else { + //send bit 0 + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_dickert_mahs_const.te_short); + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_dickert_mahs_const.te_long); + } + } + + return true; +} + +SubGhzProtocolStatus + subghz_protocol_encoder_dickert_mahs_deserialize(void* context, FlipperFormat* flipper_format) { + furi_assert(context); + SubGhzProtocolEncoderDickertMAHS* instance = context; + SubGhzProtocolStatus ret = SubGhzProtocolStatusError; + do { + ret = subghz_block_generic_deserialize(&instance->generic, flipper_format); + if(ret != SubGhzProtocolStatusOk) { + break; + } + + // Allow for longer keys (<) instead of != + if((instance->generic.data_count_bit < + subghz_protocol_dickert_mahs_const.min_count_bit_for_found)) { + FURI_LOG_E(TAG, "Wrong number of bits in key"); + ret = SubGhzProtocolStatusErrorValueBitCount; + break; + } + //optional parameter parameter + flipper_format_read_uint32( + flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); + + if(!subghz_protocol_encoder_dickert_mahs_get_upload(instance)) { + ret = SubGhzProtocolStatusErrorEncoderGetUpload; + break; + } + instance->encoder.is_running = true; + } while(false); + + return ret; +} + +void subghz_protocol_encoder_dickert_mahs_stop(void* context) { + SubGhzProtocolEncoderDickertMAHS* instance = context; + instance->encoder.is_running = false; +} + +LevelDuration subghz_protocol_encoder_dickert_mahs_yield(void* context) { + SubGhzProtocolEncoderDickertMAHS* instance = context; + + if(instance->encoder.repeat == 0 || !instance->encoder.is_running) { + instance->encoder.is_running = false; + return level_duration_reset(); + } + + LevelDuration ret = instance->encoder.upload[instance->encoder.front]; + + if(++instance->encoder.front == instance->encoder.size_upload) { + instance->encoder.repeat--; + instance->encoder.front = 0; + } + + return ret; +} + +void* subghz_protocol_decoder_dickert_mahs_alloc(SubGhzEnvironment* environment) { + UNUSED(environment); + SubGhzProtocolDecoderDickertMAHS* instance = malloc(sizeof(SubGhzProtocolDecoderDickertMAHS)); + instance->base.protocol = &subghz_protocol_dickert_mahs; + instance->generic.protocol_name = instance->base.protocol->name; + instance->tmp_cnt = 0; + + return instance; +} + +void subghz_protocol_decoder_dickert_mahs_free(void* context) { + furi_assert(context); + SubGhzProtocolDecoderDickertMAHS* instance = context; + free(instance); +} + +void subghz_protocol_decoder_dickert_mahs_reset(void* context) { + furi_assert(context); + SubGhzProtocolDecoderDickertMAHS* instance = context; + instance->decoder.parser_step = DickertMAHSDecoderStepReset; +} + +void subghz_protocol_decoder_dickert_mahs_feed(void* context, bool level, uint32_t duration) { + furi_assert(context); + SubGhzProtocolDecoderDickertMAHS* instance = context; + + switch(instance->decoder.parser_step) { + case DickertMAHSDecoderStepReset: + // Check if done + if(instance->decoder.decode_count_bit >= + subghz_protocol_dickert_mahs_const.min_count_bit_for_found) { + instance->generic.serial = 0x0; + instance->generic.btn = 0x0; + + instance->generic.data = instance->decoder.decode_data; + instance->generic.data_count_bit = instance->decoder.decode_count_bit; + + if(instance->base.callback) + instance->base.callback(&instance->base, instance->base.context); + + instance->decoder.decode_data = 0; + instance->decoder.decode_count_bit = 0; + } + + if((!level) && (duration > 10 * subghz_protocol_dickert_mahs_const.te_short)) { + //Found header DICKERT_MAHS + instance->decoder.parser_step = DickertMAHSDecoderStepInitial; + } + break; + case DickertMAHSDecoderStepInitial: + if(!level) { + break; + } else if( + DURATION_DIFF(duration, subghz_protocol_dickert_mahs_const.te_short) < + subghz_protocol_dickert_mahs_const.te_delta) { + //Found start bit DICKERT_MAHS + instance->decoder.parser_step = DickertMAHSDecoderStepRecording; + instance->decoder.decode_data = 0; + instance->decoder.decode_count_bit = 0; + } else { + instance->decoder.parser_step = DickertMAHSDecoderStepReset; + } + break; + case DickertMAHSDecoderStepRecording: + if((!level && instance->tmp_cnt == 0) || (level && instance->tmp_cnt == 1)) { + instance->tmp[instance->tmp_cnt] = duration; + + instance->tmp_cnt++; + + if(instance->tmp_cnt == 2) { + if(DURATION_DIFF(instance->tmp[0] + instance->tmp[1], 1200) < + subghz_protocol_dickert_mahs_const.te_delta) { + if(DURATION_DIFF(instance->tmp[0], subghz_protocol_dickert_mahs_const.te_long) < + subghz_protocol_dickert_mahs_const.te_delta) { + subghz_protocol_blocks_add_bit(&instance->decoder, 1); + } else if( + DURATION_DIFF( + instance->tmp[0], subghz_protocol_dickert_mahs_const.te_short) < + subghz_protocol_dickert_mahs_const.te_delta) { + subghz_protocol_blocks_add_bit(&instance->decoder, 0); + } + + instance->tmp_cnt = 0; + } else { + instance->tmp_cnt = 0; + instance->decoder.parser_step = DickertMAHSDecoderStepReset; + } + } + } else { + instance->tmp_cnt = 0; + instance->decoder.parser_step = DickertMAHSDecoderStepReset; + } + + break; + } +} + +uint8_t subghz_protocol_decoder_dickert_mahs_get_hash_data(void* context) { + furi_assert(context); + SubGhzProtocolDecoderDickertMAHS* instance = context; + return subghz_protocol_blocks_get_hash_data( + &instance->decoder, (instance->decoder.decode_count_bit / 8) + 1); +} + +SubGhzProtocolStatus subghz_protocol_decoder_dickert_mahs_serialize( + void* context, + FlipperFormat* flipper_format, + SubGhzRadioPreset* preset) { + furi_assert(context); + SubGhzProtocolDecoderDickertMAHS* instance = context; + return subghz_block_generic_serialize(&instance->generic, flipper_format, preset); +} + +SubGhzProtocolStatus + subghz_protocol_decoder_dickert_mahs_deserialize(void* context, FlipperFormat* flipper_format) { + furi_assert(context); + SubGhzProtocolDecoderDickertMAHS* instance = context; + SubGhzProtocolStatus ret = SubGhzProtocolStatusError; + do { + ret = subghz_block_generic_deserialize(&instance->generic, flipper_format); + if(ret != SubGhzProtocolStatusOk) { + break; + } + + // Allow for longer keys (<) instead of != + if((instance->generic.data_count_bit < + subghz_protocol_dickert_mahs_const.min_count_bit_for_found)) { + FURI_LOG_E(TAG, "Wrong number of bits in key"); + ret = SubGhzProtocolStatusErrorValueBitCount; + break; + } + } while(false); + return ret; +} + +void subghz_protocol_decoder_dickert_mahs_get_string(void* context, FuriString* output) { + furi_assert(context); + subghz_protocol_encoder_dickert_mahs_parse_buffer(context, output); +} diff --git a/lib/subghz/protocols/dickert_mahs.h b/lib/subghz/protocols/dickert_mahs.h new file mode 100644 index 0000000000..3f682cee09 --- /dev/null +++ b/lib/subghz/protocols/dickert_mahs.h @@ -0,0 +1,120 @@ +#pragma once + +#include "base.h" + +#define SUBGHZ_PROTOCOL_DICKERT_MAHS_NAME "Dickert_MAHS" + +typedef struct SubGhzProtocolDecoderDickertMAHS SubGhzProtocolDecoderDickertMAHS; +typedef struct SubGhzProtocolEncoderDickertMAHS SubGhzProtocolEncoderDickertMAHS; + +extern const SubGhzProtocolDecoder subghz_protocol_dickert_mahs_decoder; +extern const SubGhzProtocolEncoder subghz_protocol_dickert_mahs_encoder; +extern const SubGhzProtocol subghz_protocol_dickert_mahs; + +/** Allocate SubGhzProtocolEncoderDickertMAHS. + * + * @param environment Pointer to a SubGhzEnvironment instance + * + * @return pointer to a SubGhzProtocolEncoderDickertMAHS instance + */ +void* subghz_protocol_encoder_dickert_mahs_alloc(SubGhzEnvironment* environment); + +/** Free SubGhzProtocolEncoderDickertMAHS. + * + * @param context Pointer to a SubGhzProtocolEncoderDickertMAHS instance + */ +void subghz_protocol_encoder_dickert_mahs_free(void* context); + +/** Deserialize and generating an upload to send. + * + * @param context Pointer to a SubGhzProtocolEncoderDickertMAHS + * instance + * @param flipper_format Pointer to a FlipperFormat instance + * + * @return status + */ +SubGhzProtocolStatus + subghz_protocol_encoder_dickert_mahs_deserialize(void* context, FlipperFormat* flipper_format); + +/** Forced transmission stop. + * + * @param context Pointer to a SubGhzProtocolEncoderDickertMAHS instance + */ +void subghz_protocol_encoder_dickert_mahs_stop(void* context); + +/** Getting the level and duration of the upload to be loaded into DMA. + * + * @param context Pointer to a SubGhzProtocolEncoderDickertMAHS instance + * + * @return LevelDuration + */ +LevelDuration subghz_protocol_encoder_dickert_mahs_yield(void* context); + +/** Allocate SubGhzProtocolDecoderDickertMAHS. + * + * @param environment Pointer to a SubGhzEnvironment instance + * + * @return pointer to a SubGhzProtocolDecoderDickertMAHS instance + */ +void* subghz_protocol_decoder_dickert_mahs_alloc(SubGhzEnvironment* environment); + +/** Free SubGhzProtocolDecoderDickertMAHS. + * + * @param context Pointer to a SubGhzProtocolDecoderDickertMAHS instance + */ +void subghz_protocol_decoder_dickert_mahs_free(void* context); + +/** Reset decoder SubGhzProtocolDecoderDickertMAHS. + * + * @param context Pointer to a SubGhzProtocolDecoderDickertMAHS instance + */ +void subghz_protocol_decoder_dickert_mahs_reset(void* context); + +/** Parse a raw sequence of levels and durations received from the air. + * + * @param context Pointer to a SubGhzProtocolDecoderDickertMAHS instance + * @param level Signal level true-high false-low + * @param duration Duration of this level in, us + */ +void subghz_protocol_decoder_dickert_mahs_feed(void* context, bool level, uint32_t duration); + +/** Getting the hash sum of the last randomly received parcel. + * + * @param context Pointer to a SubGhzProtocolDecoderDickertMAHS instance + * + * @return hash Hash sum + */ +uint8_t subghz_protocol_decoder_dickert_mahs_get_hash_data(void* context); + +/** Serialize data SubGhzProtocolDecoderDickertMAHS. + * + * @param context Pointer to a SubGhzProtocolDecoderDickertMAHS + * instance + * @param flipper_format Pointer to a FlipperFormat instance + * @param preset The modulation on which the signal was received, + * SubGhzRadioPreset + * + * @return status + */ +SubGhzProtocolStatus subghz_protocol_decoder_dickert_mahs_serialize( + void* context, + FlipperFormat* flipper_format, + SubGhzRadioPreset* preset); + +/** Deserialize data SubGhzProtocolDecoderDickertMAHS. + * + * @param context Pointer to a SubGhzProtocolDecoderDickertMAHS + * instance + * @param flipper_format Pointer to a FlipperFormat instance + * + * @return status + */ +SubGhzProtocolStatus + subghz_protocol_decoder_dickert_mahs_deserialize(void* context, FlipperFormat* flipper_format); + +/** Getting a textual representation of the received data. + * + * @param context Pointer to a SubGhzProtocolDecoderDickertMAHS instance + * @param output Resulting text + */ +void subghz_protocol_decoder_dickert_mahs_get_string(void* context, FuriString* output); diff --git a/lib/subghz/protocols/protocol_items.c b/lib/subghz/protocols/protocol_items.c index e50d52ac1d..0d9c2a088b 100644 --- a/lib/subghz/protocols/protocol_items.c +++ b/lib/subghz/protocols/protocol_items.c @@ -44,6 +44,7 @@ const SubGhzProtocol* subghz_protocol_registry_items[] = { &subghz_protocol_kinggates_stylo_4k, &subghz_protocol_bin_raw, &subghz_protocol_mastercode, + &subghz_protocol_dickert_mahs, }; const SubGhzProtocolRegistry subghz_protocol_registry = { diff --git a/lib/subghz/protocols/protocol_items.h b/lib/subghz/protocols/protocol_items.h index c5a090e993..ae531c3f9b 100644 --- a/lib/subghz/protocols/protocol_items.h +++ b/lib/subghz/protocols/protocol_items.h @@ -45,3 +45,4 @@ #include "kinggates_stylo_4k.h" #include "bin_raw.h" #include "mastercode.h" +#include "dickert_mahs.h" From 6c6d64f1bda1dd28a828bddf21a745b76aac2bb0 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 10 Aug 2024 12:13:21 +0300 Subject: [PATCH 39/52] ifdef fixes for subremote --- applications/main/subghz_remote | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/subghz_remote b/applications/main/subghz_remote index 6ba386c09e..45395bc2b0 160000 --- a/applications/main/subghz_remote +++ b/applications/main/subghz_remote @@ -1 +1 @@ -Subproject commit 6ba386c09e5650f3ea814faee021829f3332ee35 +Subproject commit 45395bc2b0d8a7d7bafa16702d65696b9d5dc653 From 28272f7a7a472540543eafa690a0dc8621500edc Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 10 Aug 2024 13:18:51 +0300 Subject: [PATCH 40/52] Storage: remove LFS (#3577) * Storage: drop internal storage * Storage: rollback some unnecessary changes * Storage: rollback some unnecessary changes part 2 * Storage: cleanup various defines and int handling. Ble: allow short connection interval if internal flash is not used. * Storage: do not return storage if it is not ready * Save PIN code to RTC, update settings * Simplify the code, clean up includes * Rearrange some code * apps: storage_move_to_sd: conditionally enable with --extra-define=STORAGE_INT_ON_LFS * Load Desktop settings automatically * Redirect /any to /ext * Abolish storage_move_to_sd app * Remove as many mentions of ANY_PATH as possible * Fix desktop settings wrongly not loading * Improve desktop settings handling and strings * Load BLE settings and keys automatically * Improve BLE configuration procedure * Do not load bluetooth keys twice if they were already loaded * Load dolphin state automatically * Fix merge artifact * Load notification settings automatically * Update desktop settings strings * Load expansion settings automatically * Do not use thread signals to reload desktop settings * Load region data automatically, separate to its own hook * Improve ble behaviour with no keys * Fix Dolphin state not resetting correctly * Add a status check * Make Desktop save its own settings * Check result when taking and releasing mutex * Improve default thread signal handling in FuriEventLoop * Make bt service in charge of saving settings, add settings api * Fix a deadlock due to timer thread not receiving time * Lock core2 when reinitialising bt * Update clang-format * Revert "Update clang-format" This reverts commit d61295ac063c6ec879375ceeab54d6ff2c90a9a1. * Format sources with clang-format * Revert old stack size for desktop settings * Allocate big struct dynamically * Simplify PIN comparison * Save pointer to storage in Desktop object * Fix region provisioning for hardware regions * Remove stale TODO + siimplify code * Clean up region.c * Use sizeof instead of macro define * Limit PIN length to 10 for consistency * Emit a warning upon usage of /any * Add delay after finding flipper * Remove unnecessary delay * Remove all mentions of STORAGE_INT_ON_LFS * Remove littlefs and internal storage * Remove all possible LittleFS mentions * Fix browser tab in Archive * Ble: fix connection interval explanation * Bump API Symbols * BLE: Update comments interval connection comments * Storage: clear FuriHalRtcFlagStorageFormatInternal if set --------- Co-authored-by: Georgii Surkov Co-authored-by: hedger Co-authored-by: Georgii Surkov <37121527+gsurkov@users.noreply.github.com> --- .gitmodules | 3 - .pvsoptions | 2 +- .../scenes/file_browser_scene_start.c | 2 +- .../main/archive/helpers/archive_apps.c | 8 +- .../main/archive/helpers/archive_browser.c | 12 +- .../main/archive/helpers/archive_favorites.h | 4 +- applications/main/ibutton/ibutton_i.h | 2 +- applications/main/infrared/infrared_app_i.h | 2 +- applications/main/lfrfid/lfrfid_i.h | 2 +- applications/main/nfc/helpers/mf_user_dict.c | 2 +- applications/main/nfc/nfc_app_i.h | 2 +- applications/main/subghz/subghz_cli.c | 2 +- applications/main/u2f/u2f.c | 7 +- applications/services/bt/bt_service/bt.c | 134 +++- applications/services/bt/bt_service/bt_api.c | 36 + applications/services/bt/bt_service/bt_i.h | 5 + .../services/bt/bt_service/bt_keys_storage.c | 105 ++- .../services/bt/bt_service/bt_keys_storage.h | 2 + .../bt/bt_service/bt_settings_api_i.h | 8 + applications/services/bt/bt_settings.c | 23 +- applications/services/bt/bt_settings.h | 7 +- .../desktop/animations/animation_manager.c | 7 +- applications/services/desktop/desktop.c | 305 ++++--- applications/services/desktop/desktop.h | 14 +- applications/services/desktop/desktop_i.h | 31 +- .../services/desktop/desktop_settings.c | 79 ++ .../services/desktop/desktop_settings.h | 19 +- applications/services/desktop/helpers/pin.c | 72 -- applications/services/desktop/helpers/pin.h | 11 - .../services/desktop/helpers/pin_code.c | 103 +++ .../services/desktop/helpers/pin_code.h | 25 + .../services/desktop/scenes/desktop_scene_i.h | 4 - .../desktop/scenes/desktop_scene_lock_menu.c | 8 +- .../desktop/scenes/desktop_scene_locked.c | 12 +- .../desktop/scenes/desktop_scene_locked.h | 6 + .../desktop/scenes/desktop_scene_main.c | 5 - .../desktop/scenes/desktop_scene_pin_input.c | 8 +- .../desktop/scenes/desktop_scene_slideshow.c | 7 +- .../services/desktop/views/desktop_events.h | 2 + .../desktop/views/desktop_view_pin_input.c | 18 +- .../desktop/views/desktop_view_pin_input.h | 7 +- applications/services/dolphin/dolphin.c | 33 +- applications/services/dolphin/dolphin_i.h | 1 + .../services/dolphin/helpers/dolphin_state.c | 26 +- .../services/dolphin/helpers/dolphin_state.h | 8 +- applications/services/expansion/expansion.c | 60 +- .../services/expansion/expansion_settings.c | 33 +- .../services/expansion/expansion_settings.h | 8 +- .../gui/modules/file_browser_worker.c | 2 +- .../services/notification/notification_app.c | 53 +- .../services/notification/notification_app.h | 1 + applications/services/region/application.fam | 10 + applications/services/region/region.c | 147 ++++ applications/services/storage/storage.c | 9 +- applications/services/storage/storage.h | 4 +- applications/services/storage/storage_cli.c | 2 +- .../services/storage/storage_internal_api.c | 2 +- .../services/storage/storage_processing.c | 47 +- .../services/storage/storages/storage_int.c | 744 ------------------ .../services/storage/storages/storage_int.h | 13 - .../bt_settings_app/bt_settings_app.c | 6 +- .../bt_settings_app/bt_settings_app.h | 9 +- .../scenes/bt_settings_scene_start.c | 3 +- .../desktop_settings/desktop_settings_app.c | 20 +- .../desktop_settings/desktop_settings_app.h | 2 +- .../scenes/desktop_settings_scene_favorite.c | 10 +- .../scenes/desktop_settings_scene_pin_auth.c | 14 +- .../desktop_settings_scene_pin_disable.c | 5 +- .../scenes/desktop_settings_scene_pin_error.c | 4 +- .../scenes/desktop_settings_scene_pin_menu.c | 2 +- .../scenes/desktop_settings_scene_pin_setup.c | 6 +- .../desktop_settings_scene_pin_setup_done.c | 8 +- .../expansion_settings_app.c | 2 + .../storage_settings_scene_internal_info.c | 2 +- applications/system/application.fam | 1 - .../system/storage_move_to_sd/application.fam | 18 - .../scenes/storage_move_to_sd_scene.c | 30 - .../scenes/storage_move_to_sd_scene.h | 29 - .../scenes/storage_move_to_sd_scene_config.h | 2 - .../scenes/storage_move_to_sd_scene_confirm.c | 70 -- .../storage_move_to_sd_scene_progress.c | 31 - .../storage_move_to_sd/storage_move_to_sd.c | 203 ----- .../storage_move_to_sd/storage_move_to_sd.h | 48 -- .../system/updater/util/update_task.c | 1 - .../updater/util/update_task_worker_flasher.c | 1 - documentation/Doxyfile | 1 - furi/core/event_loop.c | 14 +- furi/core/thread.c | 6 + furi/core/thread.h | 10 +- lib/ReadMe.md | 1 - lib/SConscript | 1 - lib/ble_profile/extra_profiles/hid_profile.c | 10 +- lib/lfs_config.h | 204 ----- lib/littlefs | 1 - lib/littlefs.scons | 22 - lib/subghz/devices/registry.c | 4 +- lib/toolbox/crc32_calc.c | 32 +- lib/toolbox/stream/file_stream.c | 4 +- lib/toolbox/tar/tar_archive.c | 4 +- lib/toolbox/tar/tar_archive.h | 4 +- scripts/testops.py | 2 + targets/f18/api_symbols.csv | 10 +- targets/f18/target.json | 1 - targets/f7/api_symbols.csv | 10 +- targets/f7/ble_glue/extra_beacon.c | 6 +- targets/f7/ble_glue/hw_ipcc.c | 4 +- targets/f7/ble_glue/profiles/serial_profile.c | 10 +- targets/f7/furi_hal/furi_hal_bt.c | 11 +- targets/f7/furi_hal/furi_hal_crypto.c | 58 +- targets/f7/furi_hal/furi_hal_region.c | 7 +- targets/f7/furi_hal/furi_hal_rtc.c | 8 + targets/f7/furi_hal/furi_hal_rtc.h | 22 +- targets/f7/target.json | 1 - targets/furi_hal_include/furi_hal_region.h | 1 - 114 files changed, 1340 insertions(+), 1972 deletions(-) create mode 100644 applications/services/bt/bt_service/bt_settings_api_i.h create mode 100644 applications/services/desktop/desktop_settings.c delete mode 100644 applications/services/desktop/helpers/pin.c delete mode 100644 applications/services/desktop/helpers/pin.h create mode 100644 applications/services/desktop/helpers/pin_code.c create mode 100644 applications/services/desktop/helpers/pin_code.h delete mode 100644 applications/services/desktop/scenes/desktop_scene_i.h create mode 100644 applications/services/desktop/scenes/desktop_scene_locked.h create mode 100644 applications/services/region/application.fam create mode 100644 applications/services/region/region.c delete mode 100644 applications/services/storage/storages/storage_int.c delete mode 100644 applications/services/storage/storages/storage_int.h delete mode 100644 applications/system/storage_move_to_sd/application.fam delete mode 100644 applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.c delete mode 100644 applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.h delete mode 100644 applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_config.h delete mode 100644 applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_confirm.c delete mode 100644 applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_progress.c delete mode 100644 applications/system/storage_move_to_sd/storage_move_to_sd.c delete mode 100644 applications/system/storage_move_to_sd/storage_move_to_sd.h delete mode 100644 lib/lfs_config.h delete mode 160000 lib/littlefs delete mode 100644 lib/littlefs.scons diff --git a/.gitmodules b/.gitmodules index df5bf648fa..c9373c0939 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,6 @@ [submodule "lib/mlib"] path = lib/mlib url = https://github.com/P-p-H-d/mlib.git -[submodule "lib/littlefs"] - path = lib/littlefs - url = https://github.com/littlefs-project/littlefs.git [submodule "lib/nanopb"] path = lib/nanopb url = https://github.com/nanopb/nanopb.git diff --git a/.pvsoptions b/.pvsoptions index 8606eef154..4040dcb91a 100644 --- a/.pvsoptions +++ b/.pvsoptions @@ -1 +1 @@ ---ignore-ccache -C gccarm --rules-config .pvsconfig -e lib/cmsis_core -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Kernel -e lib/heatshrink -e lib/libusb_stm32 -e lib/littlefs -e lib/mbedtls -e lib/microtar -e lib/mlib -e lib/stm32wb_cmsis -e lib/stm32wb_copro -e lib/stm32wb_hal -e lib/u8g2 -e lib/nanopb -e lib/mjs -e */arm-none-eabi/* +--ignore-ccache -C gccarm --rules-config .pvsconfig -e lib/cmsis_core -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Kernel -e lib/heatshrink -e lib/libusb_stm32 -e lib/mbedtls -e lib/microtar -e lib/mlib -e lib/stm32wb_cmsis -e lib/stm32wb_copro -e lib/stm32wb_hal -e lib/u8g2 -e lib/nanopb -e lib/mjs -e */arm-none-eabi/* diff --git a/applications/debug/file_browser_test/scenes/file_browser_scene_start.c b/applications/debug/file_browser_test/scenes/file_browser_scene_start.c index 9eb26944ff..0ff6303bf5 100644 --- a/applications/debug/file_browser_test/scenes/file_browser_scene_start.c +++ b/applications/debug/file_browser_test/scenes/file_browser_scene_start.c @@ -19,7 +19,7 @@ bool file_browser_scene_start_on_event(void* context, SceneManagerEvent event) { bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - furi_string_set(app->file_path, ANY_PATH("badusb/demo_windows.txt")); + furi_string_set(app->file_path, EXT_PATH("badusb/demo_windows.txt")); scene_manager_next_scene(app->scene_manager, FileBrowserSceneBrowser); consumed = true; } else if(event.type == SceneManagerEventTypeTick) { diff --git a/applications/main/archive/helpers/archive_apps.c b/applications/main/archive/helpers/archive_apps.c index 43befc055b..7aca293649 100644 --- a/applications/main/archive/helpers/archive_apps.c +++ b/applications/main/archive/helpers/archive_apps.c @@ -30,8 +30,8 @@ bool archive_app_is_available(void* context, const char* path) { bool file_exists = false; Storage* storage = furi_record_open(RECORD_STORAGE); - if(storage_file_exists(storage, ANY_PATH("u2f/key.u2f"))) { - file_exists = storage_file_exists(storage, ANY_PATH("u2f/cnt.u2f")); + if(storage_file_exists(storage, EXT_PATH("u2f/key.u2f"))) { + file_exists = storage_file_exists(storage, EXT_PATH("u2f/cnt.u2f")); } furi_record_close(RECORD_STORAGE); @@ -68,8 +68,8 @@ void archive_app_delete_file(void* context, const char* path) { if(app == ArchiveAppTypeU2f) { Storage* fs_api = furi_record_open(RECORD_STORAGE); - res = (storage_common_remove(fs_api, ANY_PATH("u2f/key.u2f")) == FSE_OK); - res |= (storage_common_remove(fs_api, ANY_PATH("u2f/cnt.u2f")) == FSE_OK); + res = (storage_common_remove(fs_api, EXT_PATH("u2f/key.u2f")) == FSE_OK); + res |= (storage_common_remove(fs_api, EXT_PATH("u2f/cnt.u2f")) == FSE_OK); furi_record_close(RECORD_STORAGE); if(archive_is_favorite("/app:u2f/U2F Token")) { diff --git a/applications/main/archive/helpers/archive_browser.c b/applications/main/archive/helpers/archive_browser.c index bd9b007456..96518cd7af 100644 --- a/applications/main/archive/helpers/archive_browser.c +++ b/applications/main/archive/helpers/archive_browser.c @@ -450,16 +450,14 @@ void archive_favorites_move_mode(ArchiveBrowserView* browser, bool active) { } static bool archive_is_dir_exists(FuriString* path) { - if(furi_string_equal(path, STORAGE_ANY_PATH_PREFIX)) { - return true; - } bool state = false; FileInfo file_info; Storage* storage = furi_record_open(RECORD_STORAGE); - if(storage_common_stat(storage, furi_string_get_cstr(path), &file_info) == FSE_OK) { - if(file_info_is_dir(&file_info)) { - state = true; - } + + if(furi_string_equal(path, STORAGE_EXT_PATH_PREFIX)) { + state = storage_sd_status(storage) == FSE_OK; + } else if(storage_common_stat(storage, furi_string_get_cstr(path), &file_info) == FSE_OK) { + state = file_info_is_dir(&file_info); } furi_record_close(RECORD_STORAGE); return state; diff --git a/applications/main/archive/helpers/archive_favorites.h b/applications/main/archive/helpers/archive_favorites.h index 64ffcdd7bd..75070c44d5 100644 --- a/applications/main/archive/helpers/archive_favorites.h +++ b/applications/main/archive/helpers/archive_favorites.h @@ -2,8 +2,8 @@ #include -#define ARCHIVE_FAV_PATH ANY_PATH("favorites.txt") -#define ARCHIVE_FAV_TEMP_PATH ANY_PATH("favorites.tmp") +#define ARCHIVE_FAV_PATH EXT_PATH("favorites.txt") +#define ARCHIVE_FAV_TEMP_PATH EXT_PATH("favorites.tmp") uint16_t archive_favorites_count(void* context); bool archive_favorites_read(void* context); diff --git a/applications/main/ibutton/ibutton_i.h b/applications/main/ibutton/ibutton_i.h index 454837e977..fc2324c635 100644 --- a/applications/main/ibutton/ibutton_i.h +++ b/applications/main/ibutton/ibutton_i.h @@ -28,7 +28,7 @@ #include "ibutton_custom_event.h" #include "scenes/ibutton_scene.h" -#define IBUTTON_APP_FOLDER ANY_PATH("ibutton") +#define IBUTTON_APP_FOLDER EXT_PATH("ibutton") #define IBUTTON_APP_FILENAME_PREFIX "iBtn" #define IBUTTON_APP_FILENAME_EXTENSION ".ibtn" diff --git a/applications/main/infrared/infrared_app_i.h b/applications/main/infrared/infrared_app_i.h index d353b2503b..75d4e230d2 100644 --- a/applications/main/infrared/infrared_app_i.h +++ b/applications/main/infrared/infrared_app_i.h @@ -46,7 +46,7 @@ #define INFRARED_MAX_BUTTON_NAME_LENGTH 22 #define INFRARED_MAX_REMOTE_NAME_LENGTH 22 -#define INFRARED_APP_FOLDER ANY_PATH("infrared") +#define INFRARED_APP_FOLDER EXT_PATH("infrared") #define INFRARED_APP_EXTENSION ".ir" #define INFRARED_DEFAULT_REMOTE_NAME "Remote" diff --git a/applications/main/lfrfid/lfrfid_i.h b/applications/main/lfrfid/lfrfid_i.h index f949e73e66..913b7358bd 100644 --- a/applications/main/lfrfid/lfrfid_i.h +++ b/applications/main/lfrfid/lfrfid_i.h @@ -38,7 +38,7 @@ #define LFRFID_KEY_NAME_SIZE 22 #define LFRFID_TEXT_STORE_SIZE 40 -#define LFRFID_APP_FOLDER ANY_PATH("lfrfid") +#define LFRFID_APP_FOLDER EXT_PATH("lfrfid") #define LFRFID_SD_FOLDER EXT_PATH("lfrfid") #define LFRFID_APP_FILENAME_PREFIX "RFID" #define LFRFID_APP_FILENAME_EXTENSION ".rfid" diff --git a/applications/main/nfc/helpers/mf_user_dict.c b/applications/main/nfc/helpers/mf_user_dict.c index 70b1114722..7f60d339e6 100644 --- a/applications/main/nfc/helpers/mf_user_dict.c +++ b/applications/main/nfc/helpers/mf_user_dict.c @@ -4,7 +4,7 @@ #include #include -#define NFC_APP_FOLDER ANY_PATH("nfc") +#define NFC_APP_FOLDER EXT_PATH("nfc") #define NFC_APP_MF_CLASSIC_DICT_USER_PATH (NFC_APP_FOLDER "/assets/mf_classic_dict_user.nfc") struct MfUserDict { diff --git a/applications/main/nfc/nfc_app_i.h b/applications/main/nfc/nfc_app_i.h index 867d0eb4f9..1c174986ea 100644 --- a/applications/main/nfc/nfc_app_i.h +++ b/applications/main/nfc/nfc_app_i.h @@ -67,7 +67,7 @@ #define NFC_TEXT_STORE_SIZE 128 #define NFC_BYTE_INPUT_STORE_SIZE 10 #define NFC_LOG_SIZE_MAX (1024) -#define NFC_APP_FOLDER ANY_PATH("nfc") +#define NFC_APP_FOLDER EXT_PATH("nfc") #define NFC_APP_EXTENSION ".nfc" #define NFC_APP_SHADOW_EXTENSION ".shd" #define NFC_APP_FILENAME_PREFIX "NFC" diff --git a/applications/main/subghz/subghz_cli.c b/applications/main/subghz/subghz_cli.c index 43bb25ab83..e8601dc5d9 100644 --- a/applications/main/subghz/subghz_cli.c +++ b/applications/main/subghz/subghz_cli.c @@ -592,7 +592,7 @@ void subghz_cli_command_tx_from_file(Cli* cli, FuriString* args, void* context) UNUSED(context); FuriString* file_name; file_name = furi_string_alloc(); - furi_string_set(file_name, ANY_PATH("subghz/test.sub")); + furi_string_set(file_name, EXT_PATH("subghz/test.sub")); uint32_t repeat = 10; uint32_t device_ind = 0; // 0 - CC1101_INT, 1 - CC1101_EXT diff --git a/applications/main/u2f/u2f.c b/applications/main/u2f/u2f.c index 6a37769a8b..0143eb245f 100644 --- a/applications/main/u2f/u2f.c +++ b/applications/main/u2f/u2f.c @@ -4,7 +4,6 @@ #include #include #include -#include // for lfs_tobe32 #include #include @@ -319,6 +318,10 @@ static uint16_t u2f_register(U2fData* U2F, uint8_t* buf) { return sizeof(U2fRegisterResp) + cert_len + signature_len + 2; } +static inline uint32_t u2f_to_big_endian(uint32_t a) { + return __builtin_bswap32(a); +} + static uint16_t u2f_authenticate(U2fData* U2F, uint8_t* buf) { U2fAuthReq* req = (U2fAuthReq*)buf; U2fAuthResp* resp = (U2fAuthResp*)buf; @@ -348,7 +351,7 @@ static uint16_t u2f_authenticate(U2fData* U2F, uint8_t* buf) { U2F->user_present = false; // The 4 byte counter is represented in big endian. Increment it before use - be_u2f_counter = lfs_tobe32(U2F->counter + 1); + be_u2f_counter = u2f_to_big_endian(U2F->counter + 1); // Generate hash { diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index 36e7446fb7..db058ce421 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -61,6 +61,21 @@ static void bt_pin_code_view_port_input_callback(InputEvent* event, void* contex } } +static void bt_storage_callback(const void* message, void* context) { + furi_assert(context); + Bt* bt = context; + const StorageEvent* event = message; + + if(event->type == StorageEventTypeCardMount) { + const BtMessage msg = { + .type = BtMessageTypeReloadKeysSettings, + }; + + furi_check( + furi_message_queue_put(bt->message_queue, &msg, FuriWaitForever) == FuriStatusOk); + } +} + static ViewPort* bt_pin_code_view_port_alloc(Bt* bt) { ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, bt_pin_code_view_port_draw_callback, bt); @@ -143,8 +158,6 @@ Bt* bt_alloc(void) { // Init default maximum packet size bt->max_packet_size = BLE_PROFILE_SERIAL_PACKET_SIZE_MAX; bt->current_profile = NULL; - // Load settings - bt_settings_load(&bt->bt_settings); // Keys storage bt->keys_storage = bt_keys_storage_alloc(BT_KEYS_STORAGE_PATH); // Alloc queue @@ -396,6 +409,8 @@ void bt_close_rpc_connection(Bt* bt) { static void bt_change_profile(Bt* bt, BtMessage* message) { if(furi_hal_bt_is_gatt_gap_supported()) { + bt_settings_load(&bt->bt_settings); + bt_close_rpc_connection(bt); bt_keys_storage_load(bt->keys_storage); @@ -439,6 +454,87 @@ static void bt_close_connection(Bt* bt, BtMessage* message) { if(message->lock) api_lock_unlock(message->lock); } +static void bt_apply_settings(Bt* bt) { + if(bt->bt_settings.enabled) { + furi_hal_bt_start_advertising(); + } else { + furi_hal_bt_stop_advertising(); + } +} + +static void bt_load_keys(Bt* bt) { + if(!furi_hal_bt_is_gatt_gap_supported()) { + bt_show_warning(bt, "Unsupported radio stack"); + bt->status = BtStatusUnavailable; + return; + + } else if(bt_keys_storage_is_changed(bt->keys_storage)) { + FURI_LOG_I(TAG, "Loading new keys"); + + bt_close_rpc_connection(bt); + bt_keys_storage_load(bt->keys_storage); + + bt->current_profile = NULL; + + } else { + FURI_LOG_I(TAG, "Keys unchanged"); + } +} + +static void bt_start_application(Bt* bt) { + if(!bt->current_profile) { + bt->current_profile = + furi_hal_bt_change_app(ble_profile_serial, NULL, bt_on_gap_event_callback, bt); + + if(!bt->current_profile) { + FURI_LOG_E(TAG, "BLE App start failed"); + bt->status = BtStatusUnavailable; + } + } +} + +static void bt_load_settings(Bt* bt) { + bt_settings_load(&bt->bt_settings); + bt_apply_settings(bt); +} + +static void bt_handle_get_settings(Bt* bt, BtMessage* message) { + furi_assert(message->lock); + *message->data.settings = bt->bt_settings; + api_lock_unlock(message->lock); +} + +static void bt_handle_set_settings(Bt* bt, BtMessage* message) { + furi_assert(message->lock); + bt->bt_settings = *message->data.csettings; + + bt_apply_settings(bt); + bt_settings_save(&bt->bt_settings); + + api_lock_unlock(message->lock); +} + +static void bt_handle_reload_keys_settings(Bt* bt) { + bt_load_keys(bt); + bt_start_application(bt); + bt_load_settings(bt); +} + +static void bt_init_keys_settings(Bt* bt) { + Storage* storage = furi_record_open(RECORD_STORAGE); + furi_pubsub_subscribe(storage_get_pubsub(storage), bt_storage_callback, bt); + + if(storage_sd_status(storage) != FSE_OK) { + FURI_LOG_D(TAG, "SD Card not ready, skipping settings"); + + // Just start the BLE serial application without loading the keys or settings + bt_start_application(bt); + return; + } + + bt_handle_reload_keys_settings(bt); +} + bool bt_remote_rssi(Bt* bt, uint8_t* rssi) { furi_assert(bt); @@ -465,35 +561,18 @@ int32_t bt_srv(void* p) { return 0; } - // Load keys - if(!bt_keys_storage_load(bt->keys_storage)) { - FURI_LOG_W(TAG, "Failed to load bonding keys"); - } - - // Start radio stack - if(!furi_hal_bt_start_radio_stack()) { - FURI_LOG_E(TAG, "Radio stack start failed"); - } + if(furi_hal_bt_start_radio_stack()) { + bt_init_keys_settings(bt); + furi_hal_bt_set_key_storage_change_callback(bt_on_key_storage_change_callback, bt); - if(furi_hal_bt_is_gatt_gap_supported()) { - bt->current_profile = - furi_hal_bt_start_app(ble_profile_serial, NULL, bt_on_gap_event_callback, bt); - if(!bt->current_profile) { - FURI_LOG_E(TAG, "BLE App start failed"); - } else { - if(bt->bt_settings.enabled) { - furi_hal_bt_start_advertising(); - } - furi_hal_bt_set_key_storage_change_callback(bt_on_key_storage_change_callback, bt); - } } else { - bt_show_warning(bt, "Unsupported radio stack"); - bt->status = BtStatusUnavailable; + FURI_LOG_E(TAG, "Radio stack start failed"); } furi_record_create(RECORD_BT, bt); BtMessage message; + while(1) { furi_check( furi_message_queue_get(bt->message_queue, &message, FuriWaitForever) == FuriStatusOk); @@ -523,7 +602,14 @@ int32_t bt_srv(void* p) { bt_close_connection(bt, &message); } else if(message.type == BtMessageTypeForgetBondedDevices) { bt_keys_storage_delete(bt->keys_storage); + } else if(message.type == BtMessageTypeGetSettings) { + bt_handle_get_settings(bt, &message); + } else if(message.type == BtMessageTypeSetSettings) { + bt_handle_set_settings(bt, &message); + } else if(message.type == BtMessageTypeReloadKeysSettings) { + bt_handle_reload_keys_settings(bt); } } + return 0; } diff --git a/applications/services/bt/bt_service/bt_api.c b/applications/services/bt/bt_service/bt_api.c index f0e792d42e..39b9a099da 100644 --- a/applications/services/bt/bt_service/bt_api.c +++ b/applications/services/bt/bt_service/bt_api.c @@ -77,3 +77,39 @@ void bt_keys_storage_set_default_path(Bt* bt) { bt_keys_storage_set_file_path(bt->keys_storage, BT_KEYS_STORAGE_PATH); } + +/* + * Private API for the Settings app + */ + +void bt_get_settings(Bt* bt, BtSettings* settings) { + furi_assert(bt); + furi_assert(settings); + + BtMessage message = { + .lock = api_lock_alloc_locked(), + .type = BtMessageTypeGetSettings, + .data.settings = settings, + }; + + furi_check( + furi_message_queue_put(bt->message_queue, &message, FuriWaitForever) == FuriStatusOk); + + api_lock_wait_unlock_and_free(message.lock); +} + +void bt_set_settings(Bt* bt, const BtSettings* settings) { + furi_assert(bt); + furi_assert(settings); + + BtMessage message = { + .lock = api_lock_alloc_locked(), + .type = BtMessageTypeSetSettings, + .data.csettings = settings, + }; + + furi_check( + furi_message_queue_put(bt->message_queue, &message, FuriWaitForever) == FuriStatusOk); + + api_lock_wait_unlock_and_free(message.lock); +} diff --git a/applications/services/bt/bt_service/bt_i.h b/applications/services/bt/bt_service/bt_i.h index eb94283881..58a60e2751 100644 --- a/applications/services/bt/bt_service/bt_i.h +++ b/applications/services/bt/bt_service/bt_i.h @@ -32,6 +32,9 @@ typedef enum { BtMessageTypeSetProfile, BtMessageTypeDisconnect, BtMessageTypeForgetBondedDevices, + BtMessageTypeGetSettings, + BtMessageTypeSetSettings, + BtMessageTypeReloadKeysSettings, } BtMessageType; typedef struct { @@ -49,6 +52,8 @@ typedef union { } profile; FuriHalBleProfileParams profile_params; BtKeyStorageUpdateData key_storage_data; + BtSettings* settings; + const BtSettings* csettings; } BtMessageData; typedef struct { diff --git a/applications/services/bt/bt_service/bt_keys_storage.c b/applications/services/bt/bt_service/bt_keys_storage.c index 6392c2d677..57742e8e26 100644 --- a/applications/services/bt/bt_service/bt_keys_storage.c +++ b/applications/services/bt/bt_service/bt_keys_storage.c @@ -13,6 +13,7 @@ struct BtKeysStorage { uint8_t* nvm_sram_buff; uint16_t nvm_sram_buff_size; + uint16_t current_size; FuriString* file_path; }; @@ -66,44 +67,114 @@ void bt_keys_storage_set_ram_params(BtKeysStorage* instance, uint8_t* buff, uint instance->nvm_sram_buff_size = size; } -bool bt_keys_storage_load(BtKeysStorage* instance) { +static bool bt_keys_storage_file_exists(const char* file_path) { + Storage* storage = furi_record_open(RECORD_STORAGE); + FileInfo file_info; + const bool ret = storage_common_stat(storage, file_path, &file_info) == FSE_OK && + file_info.size != 0; + furi_record_close(RECORD_STORAGE); + return ret; +} + +static bool bt_keys_storage_validate_file(const char* file_path, size_t* payload_size) { + uint8_t magic, version; + size_t size; + + if(!saved_struct_get_metadata(file_path, &magic, &version, &size)) { + FURI_LOG_E(TAG, "Failed to get metadata"); + return false; + + } else if(magic != BT_KEYS_STORAGE_MAGIC || version != BT_KEYS_STORAGE_VERSION) { + FURI_LOG_E(TAG, "File version mismatch"); + return false; + } + + *payload_size = size; + return true; +} + +bool bt_keys_storage_is_changed(BtKeysStorage* instance) { furi_assert(instance); - bool loaded = false; + bool is_changed = false; + uint8_t* data_buffer = NULL; + do { - // Get payload size - uint8_t magic = 0, version = 0; - size_t payload_size = 0; - if(!saved_struct_get_metadata( - furi_string_get_cstr(instance->file_path), &magic, &version, &payload_size)) { - FURI_LOG_E(TAG, "Failed to read payload size"); + const char* file_path = furi_string_get_cstr(instance->file_path); + size_t payload_size; + + if(!bt_keys_storage_file_exists(file_path)) { + FURI_LOG_W(TAG, "Missing or empty file"); + break; + + } else if(!bt_keys_storage_validate_file(file_path, &payload_size)) { + FURI_LOG_E(TAG, "Invalid or corrupted file"); break; } - if(magic != BT_KEYS_STORAGE_MAGIC || version != BT_KEYS_STORAGE_VERSION) { - FURI_LOG_E(TAG, "Saved data version is mismatched"); + data_buffer = malloc(payload_size); + + const bool data_loaded = saved_struct_load( + file_path, data_buffer, payload_size, BT_KEYS_STORAGE_MAGIC, BT_KEYS_STORAGE_VERSION); + + if(!data_loaded) { + FURI_LOG_E(TAG, "Failed to load file"); break; + + } else if(payload_size == instance->current_size) { + furi_hal_bt_nvm_sram_sem_acquire(); + is_changed = memcmp(data_buffer, instance->nvm_sram_buff, payload_size); + furi_hal_bt_nvm_sram_sem_release(); + + } else { + FURI_LOG_D(TAG, "Size mismatch"); + is_changed = true; } + } while(false); - if(payload_size > instance->nvm_sram_buff_size) { - FURI_LOG_E(TAG, "Saved data doesn't fit ram buffer"); + if(data_buffer) { + free(data_buffer); + } + + return is_changed; +} + +bool bt_keys_storage_load(BtKeysStorage* instance) { + furi_assert(instance); + + bool loaded = false; + + do { + const char* file_path = furi_string_get_cstr(instance->file_path); + + // Get payload size + size_t payload_size; + if(!bt_keys_storage_validate_file(file_path, &payload_size)) { + FURI_LOG_E(TAG, "Invalid or corrupted file"); + break; + + } else if(payload_size > instance->nvm_sram_buff_size) { + FURI_LOG_E(TAG, "NVM RAM buffer overflow"); break; } // Load saved data to ram furi_hal_bt_nvm_sram_sem_acquire(); - bool data_loaded = saved_struct_load( - furi_string_get_cstr(instance->file_path), + const bool data_loaded = saved_struct_load( + file_path, instance->nvm_sram_buff, payload_size, BT_KEYS_STORAGE_MAGIC, BT_KEYS_STORAGE_VERSION); furi_hal_bt_nvm_sram_sem_release(); + if(!data_loaded) { - FURI_LOG_E(TAG, "Failed to load struct"); + FURI_LOG_E(TAG, "Failed to load file"); break; } + instance->current_size = payload_size; + loaded = true; } while(false); @@ -130,6 +201,8 @@ bool bt_keys_storage_update(BtKeysStorage* instance, uint8_t* start_addr, uint32 break; } + instance->current_size = new_size; + furi_hal_bt_nvm_sram_sem_acquire(); bool data_updated = saved_struct_save( furi_string_get_cstr(instance->file_path), @@ -138,10 +211,12 @@ bool bt_keys_storage_update(BtKeysStorage* instance, uint8_t* start_addr, uint32 BT_KEYS_STORAGE_MAGIC, BT_KEYS_STORAGE_VERSION); furi_hal_bt_nvm_sram_sem_release(); + if(!data_updated) { FURI_LOG_E(TAG, "Failed to update key storage"); break; } + updated = true; } while(false); diff --git a/applications/services/bt/bt_service/bt_keys_storage.h b/applications/services/bt/bt_service/bt_keys_storage.h index 587dd570dd..b7a127035d 100644 --- a/applications/services/bt/bt_service/bt_keys_storage.h +++ b/applications/services/bt/bt_service/bt_keys_storage.h @@ -17,6 +17,8 @@ void bt_keys_storage_set_file_path(BtKeysStorage* instance, const char* path); void bt_keys_storage_set_ram_params(BtKeysStorage* instance, uint8_t* buff, uint16_t size); +bool bt_keys_storage_is_changed(BtKeysStorage* instance); + bool bt_keys_storage_load(BtKeysStorage* instance); bool bt_keys_storage_update(BtKeysStorage* instance, uint8_t* start_addr, uint32_t size); diff --git a/applications/services/bt/bt_service/bt_settings_api_i.h b/applications/services/bt/bt_service/bt_settings_api_i.h new file mode 100644 index 0000000000..4412958931 --- /dev/null +++ b/applications/services/bt/bt_service/bt_settings_api_i.h @@ -0,0 +1,8 @@ +#pragma once + +#include "bt.h" +#include "../bt_settings.h" + +void bt_get_settings(Bt* bt, BtSettings* settings); + +void bt_set_settings(Bt* bt, const BtSettings* settings); diff --git a/applications/services/bt/bt_settings.c b/applications/services/bt/bt_settings.c index 3602cf4977..abdc97f7e7 100644 --- a/applications/services/bt/bt_settings.c +++ b/applications/services/bt/bt_settings.c @@ -1,23 +1,36 @@ #include "bt_settings.h" +#include "bt_settings_filename.h" #include -#include #include +#include + +#define TAG "BtSettings" #define BT_SETTINGS_PATH INT_PATH(BT_SETTINGS_FILE_NAME) #define BT_SETTINGS_VERSION (0) #define BT_SETTINGS_MAGIC (0x19) -bool bt_settings_load(BtSettings* bt_settings) { +void bt_settings_load(BtSettings* bt_settings) { furi_assert(bt_settings); - return saved_struct_load( + const bool success = saved_struct_load( BT_SETTINGS_PATH, bt_settings, sizeof(BtSettings), BT_SETTINGS_MAGIC, BT_SETTINGS_VERSION); + + if(!success) { + FURI_LOG_W(TAG, "Failed to load settings, using defaults"); + memset(bt_settings, 0, sizeof(BtSettings)); + bt_settings_save(bt_settings); + } } -bool bt_settings_save(const BtSettings* bt_settings) { +void bt_settings_save(const BtSettings* bt_settings) { furi_assert(bt_settings); - return saved_struct_save( + const bool success = saved_struct_save( BT_SETTINGS_PATH, bt_settings, sizeof(BtSettings), BT_SETTINGS_MAGIC, BT_SETTINGS_VERSION); + + if(!success) { + FURI_LOG_E(TAG, "Failed to save settings"); + } } diff --git a/applications/services/bt/bt_settings.h b/applications/services/bt/bt_settings.h index a4e76a12cc..c63220abb2 100644 --- a/applications/services/bt/bt_settings.h +++ b/applications/services/bt/bt_settings.h @@ -1,8 +1,5 @@ #pragma once -#include "bt_settings_filename.h" - -#include #include #ifdef __cplusplus @@ -13,9 +10,9 @@ typedef struct { bool enabled; } BtSettings; -bool bt_settings_load(BtSettings* bt_settings); +void bt_settings_load(BtSettings* bt_settings); -bool bt_settings_save(const BtSettings* bt_settings); +void bt_settings_save(const BtSettings* bt_settings); #ifdef __cplusplus } diff --git a/applications/services/desktop/animations/animation_manager.c b/applications/services/desktop/animations/animation_manager.c index 8e04e7894e..dd2ae76a1c 100644 --- a/applications/services/desktop/animations/animation_manager.c +++ b/applications/services/desktop/animations/animation_manager.c @@ -97,8 +97,11 @@ void animation_manager_set_interact_callback( void animation_manager_set_dummy_mode_state(AnimationManager* animation_manager, bool enabled) { furi_assert(animation_manager); - animation_manager->dummy_mode = enabled; - animation_manager_start_new_idle(animation_manager); + // Prevent change of animations if mode is the same + if(animation_manager->dummy_mode != enabled) { + animation_manager->dummy_mode = enabled; + animation_manager_start_new_idle(animation_manager); + } } static void animation_manager_check_blocking_callback(const void* message, void* context) { diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 53e2d29c84..66e503e967 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -1,31 +1,24 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "desktop_i.h" + #include #include + +#include + #include +#include -#include "animations/animation_manager.h" -#include "desktop/scenes/desktop_scene.h" -#include "desktop/scenes/desktop_scene_i.h" -#include "desktop/views/desktop_view_locked.h" -#include "desktop/views/desktop_view_pin_input.h" -#include "desktop/views/desktop_view_pin_timeout.h" -#include "desktop_i.h" -#include "helpers/pin.h" -#include "helpers/slideshow_filename.h" +#include + +#include "scenes/desktop_scene.h" +#include "scenes/desktop_scene_locked.h" #define TAG "Desktop" static void desktop_auto_lock_arm(Desktop*); static void desktop_auto_lock_inhibit(Desktop*); static void desktop_start_auto_lock_timer(Desktop*); +static void desktop_apply_settings(Desktop*); static void desktop_loader_callback(const void* message, void* context) { furi_assert(context); @@ -42,6 +35,16 @@ static void desktop_loader_callback(const void* message, void* context) { } } +static void desktop_storage_callback(const void* message, void* context) { + furi_assert(context); + Desktop* desktop = context; + const StorageEvent* event = message; + + if(event->type == StorageEventTypeCardMount) { + view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopGlobalReloadSettings); + } +} + static void desktop_lock_icon_draw_callback(Canvas* canvas, void* context) { UNUSED(context); furi_assert(canvas); @@ -122,31 +125,39 @@ static bool desktop_custom_event_callback(void* context, uint32_t event) { furi_assert(context); Desktop* desktop = (Desktop*)context; - switch(event) { - case DesktopGlobalBeforeAppStarted: + if(event == DesktopGlobalBeforeAppStarted) { if(animation_manager_is_animation_loaded(desktop->animation_manager)) { animation_manager_unload_and_stall_animation(desktop->animation_manager); } + desktop_auto_lock_inhibit(desktop); + desktop->app_running = true; + furi_semaphore_release(desktop->animation_semaphore); - return true; - case DesktopGlobalAfterAppFinished: + + } else if(event == DesktopGlobalAfterAppFinished) { animation_manager_load_and_continue_animation(desktop->animation_manager); - DESKTOP_SETTINGS_LOAD(&desktop->settings); + desktop_auto_lock_arm(desktop); + desktop->app_running = false; - desktop_clock_reconfigure(desktop); - if(!furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) { - desktop_auto_lock_arm(desktop); - } - return true; - case DesktopGlobalAutoLock: - if(!loader_is_locked(desktop->loader) && !desktop->locked) { + } else if(event == DesktopGlobalAutoLock) { + if(!desktop->app_running && !desktop->locked) { desktop_lock(desktop); } - return true; + + } else if(event == DesktopGlobalSaveSettings) { + desktop_settings_save(&desktop->settings); + desktop_apply_settings(desktop); + + } else if(event == DesktopGlobalReloadSettings) { + desktop_settings_load(&desktop->settings); + desktop_apply_settings(desktop); + + } else { + return scene_manager_handle_custom_event(desktop->scene_manager, event); } - return scene_manager_handle_custom_event(desktop->scene_manager, event); + return true; } static bool desktop_back_event_callback(void* context) { @@ -206,84 +217,45 @@ static void desktop_clock_timer_callback(void* context) { furi_assert(context); Desktop* desktop = context; - if(gui_active_view_port_count(desktop->gui, GuiLayerStatusBarLeft) < 6) { - desktop_clock_update(desktop); - - view_port_enabled_set(desktop->clock_viewport, true); - } else { - view_port_enabled_set(desktop->clock_viewport, false); - } -} - -void desktop_lock(Desktop* desktop) { - furi_assert(!desktop->locked); - - furi_hal_rtc_set_flag(FuriHalRtcFlagLock); + const bool clock_enabled = gui_active_view_port_count(desktop->gui, GuiLayerStatusBarLeft) < 6; - if(desktop->settings.pin_code.length) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_session_close(cli); - furi_record_close(RECORD_CLI); + if(clock_enabled) { + desktop_clock_update(desktop); } - desktop_auto_lock_inhibit(desktop); - scene_manager_set_scene_state( - desktop->scene_manager, DesktopSceneLocked, SCENE_LOCKED_FIRST_ENTER); - scene_manager_next_scene(desktop->scene_manager, DesktopSceneLocked); - - DesktopStatus status = {.locked = true}; - furi_pubsub_publish(desktop->status_pubsub, &status); - - desktop->locked = true; + view_port_enabled_set(desktop->clock_viewport, clock_enabled); } -void desktop_unlock(Desktop* desktop) { - furi_assert(desktop->locked); - - view_port_enabled_set(desktop->lock_icon_viewport, false); - Gui* gui = furi_record_open(RECORD_GUI); - gui_set_lockdown(gui, false); - furi_record_close(RECORD_GUI); - desktop_view_locked_unlock(desktop->locked_view); - scene_manager_search_and_switch_to_previous_scene(desktop->scene_manager, DesktopSceneMain); - desktop_auto_lock_arm(desktop); - furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); - furi_hal_rtc_set_pin_fails(0); +static void desktop_apply_settings(Desktop* desktop) { + desktop->in_transition = true; - if(desktop->settings.pin_code.length) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_session_open(cli, &cli_vcp); - furi_record_close(RECORD_CLI); - } + desktop_clock_reconfigure(desktop); - DesktopStatus status = {.locked = false}; - furi_pubsub_publish(desktop->status_pubsub, &status); + view_port_enabled_set(desktop->dummy_mode_icon_viewport, desktop->settings.dummy_mode); + desktop_main_set_dummy_mode_state(desktop->main_view, desktop->settings.dummy_mode); + animation_manager_set_dummy_mode_state( + desktop->animation_manager, desktop->settings.dummy_mode); - desktop->locked = false; -} + if(!desktop->app_running && !desktop->locked) { + desktop_auto_lock_arm(desktop); + } -void desktop_set_dummy_mode_state(Desktop* desktop, bool enabled) { - desktop->in_transition = true; - view_port_enabled_set(desktop->dummy_mode_icon_viewport, enabled); - desktop_main_set_dummy_mode_state(desktop->main_view, enabled); - animation_manager_set_dummy_mode_state(desktop->animation_manager, enabled); - desktop->settings.dummy_mode = enabled; - DESKTOP_SETTINGS_SAVE(&desktop->settings); desktop->in_transition = false; } -void desktop_set_stealth_mode_state(Desktop* desktop, bool enabled) { - desktop->in_transition = true; - if(enabled) { - furi_hal_rtc_set_flag(FuriHalRtcFlagStealthMode); - } else { - furi_hal_rtc_reset_flag(FuriHalRtcFlagStealthMode); +static void desktop_init_settings(Desktop* desktop) { + furi_pubsub_subscribe(storage_get_pubsub(desktop->storage), desktop_storage_callback, desktop); + + if(storage_sd_status(desktop->storage) != FSE_OK) { + FURI_LOG_D(TAG, "SD Card not ready, skipping settings"); + return; } - view_port_enabled_set(desktop->stealth_mode_icon_viewport, enabled); - desktop->in_transition = false; + + desktop_settings_load(&desktop->settings); + desktop_apply_settings(desktop); } -Desktop* desktop_alloc(void) { +static Desktop* desktop_alloc(void) { Desktop* desktop = malloc(sizeof(Desktop)); desktop->animation_semaphore = furi_semaphore_alloc(1, 0); @@ -392,14 +364,13 @@ Desktop* desktop_alloc(void) { } gui_add_view_port(desktop->gui, desktop->stealth_mode_icon_viewport, GuiLayerStatusBarLeft); + // Unload animations before starting an application desktop->loader = furi_record_open(RECORD_LOADER); + furi_pubsub_subscribe(loader_get_pubsub(desktop->loader), desktop_loader_callback, desktop); + desktop->storage = furi_record_open(RECORD_STORAGE); desktop->notification = furi_record_open(RECORD_NOTIFICATION); - desktop->app_start_stop_subscription = furi_pubsub_subscribe( - loader_get_pubsub(desktop->loader), desktop_loader_callback, desktop); - desktop->input_events_pubsub = furi_record_open(RECORD_INPUT_EVENTS); - desktop->input_events_subscription = NULL; desktop->auto_lock_timer = furi_timer_alloc(desktop_auto_lock_timer_callback, FuriTimerTypeOnce, desktop); @@ -409,19 +380,95 @@ Desktop* desktop_alloc(void) { desktop->update_clock_timer = furi_timer_alloc(desktop_clock_timer_callback, FuriTimerTypePeriodic, desktop); + desktop->app_running = loader_is_locked(desktop->loader); + furi_record_create(RECORD_DESKTOP, desktop); return desktop; } -static bool desktop_check_file_flag(const char* flag_path) { - Storage* storage = furi_record_open(RECORD_STORAGE); - bool exists = storage_common_stat(storage, flag_path, NULL) == FSE_OK; - furi_record_close(RECORD_STORAGE); +/* + * Private API + */ - return exists; +void desktop_lock(Desktop* desktop) { + furi_assert(!desktop->locked); + + furi_hal_rtc_set_flag(FuriHalRtcFlagLock); + + if(desktop_pin_code_is_set()) { + Cli* cli = furi_record_open(RECORD_CLI); + cli_session_close(cli); + furi_record_close(RECORD_CLI); + } + + desktop_auto_lock_inhibit(desktop); + scene_manager_set_scene_state( + desktop->scene_manager, DesktopSceneLocked, DesktopSceneLockedStateFirstEnter); + scene_manager_next_scene(desktop->scene_manager, DesktopSceneLocked); + + DesktopStatus status = {.locked = true}; + furi_pubsub_publish(desktop->status_pubsub, &status); + + desktop->locked = true; } +void desktop_unlock(Desktop* desktop) { + furi_assert(desktop->locked); + + view_port_enabled_set(desktop->lock_icon_viewport, false); + Gui* gui = furi_record_open(RECORD_GUI); + gui_set_lockdown(gui, false); + furi_record_close(RECORD_GUI); + desktop_view_locked_unlock(desktop->locked_view); + scene_manager_search_and_switch_to_previous_scene(desktop->scene_manager, DesktopSceneMain); + desktop_auto_lock_arm(desktop); + furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); + furi_hal_rtc_set_pin_fails(0); + + if(desktop_pin_code_is_set()) { + Cli* cli = furi_record_open(RECORD_CLI); + cli_session_open(cli, &cli_vcp); + furi_record_close(RECORD_CLI); + } + + DesktopStatus status = {.locked = false}; + furi_pubsub_publish(desktop->status_pubsub, &status); + + desktop->locked = false; +} + +void desktop_set_dummy_mode_state(Desktop* desktop, bool enabled) { + desktop->in_transition = true; + + view_port_enabled_set(desktop->dummy_mode_icon_viewport, enabled); + desktop_main_set_dummy_mode_state(desktop->main_view, enabled); + animation_manager_set_dummy_mode_state(desktop->animation_manager, enabled); + desktop->settings.dummy_mode = enabled; + + desktop->in_transition = false; + + desktop_settings_save(&desktop->settings); +} + +void desktop_set_stealth_mode_state(Desktop* desktop, bool enabled) { + desktop->in_transition = true; + + if(enabled) { + furi_hal_rtc_set_flag(FuriHalRtcFlagStealthMode); + } else { + furi_hal_rtc_reset_flag(FuriHalRtcFlagStealthMode); + } + + view_port_enabled_set(desktop->stealth_mode_icon_viewport, enabled); + + desktop->in_transition = false; +} + +/* + * Public API + */ + bool desktop_api_is_locked(Desktop* instance) { furi_assert(instance); return furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock); @@ -437,6 +484,30 @@ FuriPubSub* desktop_api_get_status_pubsub(Desktop* instance) { return instance->status_pubsub; } +void desktop_api_reload_settings(Desktop* instance) { + furi_assert(instance); + view_dispatcher_send_custom_event(instance->view_dispatcher, DesktopGlobalReloadSettings); +} + +void desktop_api_get_settings(Desktop* instance, DesktopSettings* settings) { + furi_assert(instance); + furi_assert(settings); + + *settings = instance->settings; +} + +void desktop_api_set_settings(Desktop* instance, const DesktopSettings* settings) { + furi_assert(instance); + furi_assert(settings); + + instance->settings = *settings; + view_dispatcher_send_custom_event(instance->view_dispatcher, DesktopGlobalSaveSettings); +} + +/* + * Application thread + */ + int32_t desktop_srv(void* p) { UNUSED(p); @@ -449,31 +520,15 @@ int32_t desktop_srv(void* p) { Desktop* desktop = desktop_alloc(); - bool loaded = DESKTOP_SETTINGS_LOAD(&desktop->settings); - if(!loaded) { - memset(&desktop->settings, 0, sizeof(desktop->settings)); - DESKTOP_SETTINGS_SAVE(&desktop->settings); - } - - view_port_enabled_set(desktop->dummy_mode_icon_viewport, desktop->settings.dummy_mode); - - desktop_clock_reconfigure(desktop); - - desktop_main_set_dummy_mode_state(desktop->main_view, desktop->settings.dummy_mode); - animation_manager_set_dummy_mode_state( - desktop->animation_manager, desktop->settings.dummy_mode); + desktop_init_settings(desktop); scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) { desktop_lock(desktop); - } else { - if(!loader_is_locked(desktop->loader)) { - desktop_auto_lock_arm(desktop); - } } - if(desktop_check_file_flag(SLIDESHOW_FS_PATH)) { + if(storage_file_exists(desktop->storage, SLIDESHOW_FS_PATH)) { scene_manager_next_scene(desktop->scene_manager, DesktopSceneSlideshow); } @@ -497,14 +552,12 @@ int32_t desktop_srv(void* p) { } // Special case: autostart application is already running - if(loader_is_locked(desktop->loader) && - animation_manager_is_animation_loaded(desktop->animation_manager)) { + if(desktop->app_running && animation_manager_is_animation_loaded(desktop->animation_manager)) { animation_manager_unload_and_stall_animation(desktop->animation_manager); } view_dispatcher_run(desktop->view_dispatcher); - furi_crash("That was unexpected"); - + // Should never get here (a service thread will crash automatically if it returns) return 0; } diff --git a/applications/services/desktop/desktop.h b/applications/services/desktop/desktop.h index 4eab24fcc5..e83bc3ee4d 100644 --- a/applications/services/desktop/desktop.h +++ b/applications/services/desktop/desktop.h @@ -2,16 +2,22 @@ #include -typedef struct Desktop Desktop; +#include "desktop_settings.h" #define RECORD_DESKTOP "desktop" -bool desktop_api_is_locked(Desktop* instance); - -void desktop_api_unlock(Desktop* instance); +typedef struct Desktop Desktop; typedef struct { bool locked; } DesktopStatus; +bool desktop_api_is_locked(Desktop* instance); + +void desktop_api_unlock(Desktop* instance); + FuriPubSub* desktop_api_get_status_pubsub(Desktop* instance); + +void desktop_api_get_settings(Desktop* instance, DesktopSettings* settings); + +void desktop_api_set_settings(Desktop* instance, const DesktopSettings* settings); diff --git a/applications/services/desktop/desktop_i.h b/applications/services/desktop/desktop_i.h index 4bcbb6585a..1dc7c7d219 100644 --- a/applications/services/desktop/desktop_i.h +++ b/applications/services/desktop/desktop_i.h @@ -1,6 +1,8 @@ #pragma once #include "desktop.h" +#include "desktop_settings.h" + #include "animations/animation_manager.h" #include "views/desktop_view_pin_timeout.h" #include "views/desktop_view_pin_input.h" @@ -9,9 +11,7 @@ #include "views/desktop_view_lock_menu.h" #include "views/desktop_view_debug.h" #include "views/desktop_view_slideshow.h" -#include -#include #include #include #include @@ -42,9 +42,8 @@ typedef struct { } DesktopClock; struct Desktop { - // Scene FuriThread* scene_thread; - // GUI + Gui* gui; ViewDispatcher* view_dispatcher; SceneManager* scene_manager; @@ -56,42 +55,38 @@ struct Desktop { DesktopMainView* main_view; DesktopViewPinTimeout* pin_timeout_view; DesktopSlideshowView* slideshow_view; + DesktopViewPinInput* pin_input_view; ViewStack* main_view_stack; ViewStack* locked_view_stack; - DesktopSettings settings; - DesktopViewPinInput* pin_input_view; - ViewPort* lock_icon_viewport; ViewPort* dummy_mode_icon_viewport; ViewPort* clock_viewport; ViewPort* stealth_mode_icon_viewport; - AnimationManager* animation_manager; - Loader* loader; + Storage* storage; NotificationApp* notification; - FuriPubSubSubscription* app_start_stop_subscription; + FuriPubSub* status_pubsub; FuriPubSub* input_events_pubsub; FuriPubSubSubscription* input_events_subscription; + FuriTimer* auto_lock_timer; FuriTimer* update_clock_timer; - FuriPubSub* status_pubsub; + AnimationManager* animation_manager; + FuriSemaphore* animation_semaphore; DesktopClock clock; + DesktopSettings settings; - bool in_transition : 1; - bool locked : 1; - - FuriSemaphore* animation_semaphore; + bool in_transition; + bool app_running; + bool locked; }; -Desktop* desktop_alloc(void); - -void desktop_free(Desktop* desktop); void desktop_lock(Desktop* desktop); void desktop_unlock(Desktop* desktop); void desktop_set_dummy_mode_state(Desktop* desktop, bool enabled); diff --git a/applications/services/desktop/desktop_settings.c b/applications/services/desktop/desktop_settings.c new file mode 100644 index 0000000000..f66fdeda71 --- /dev/null +++ b/applications/services/desktop/desktop_settings.c @@ -0,0 +1,79 @@ +#include "desktop_settings.h" +#include "desktop_settings_filename.h" + +#include +#include + +#define TAG "DesktopSettings" + +#define DESKTOP_SETTINGS_VER_10 (10) +#define DESKTOP_SETTINGS_VER (11) + +#define DESKTOP_SETTINGS_PATH INT_PATH(DESKTOP_SETTINGS_FILE_NAME) +#define DESKTOP_SETTINGS_MAGIC (0x17) + +typedef struct { + uint8_t reserved[11]; + DesktopSettings settings; +} DesktopSettingsV10; + +// Actual size of DesktopSettings v10 +static_assert(sizeof(DesktopSettingsV10) == 1044); + +void desktop_settings_load(DesktopSettings* settings) { + furi_assert(settings); + + bool success = false; + + do { + uint8_t version; + if(!saved_struct_get_metadata(DESKTOP_SETTINGS_PATH, NULL, &version, NULL)) break; + + if(version == DESKTOP_SETTINGS_VER) { + success = saved_struct_load( + DESKTOP_SETTINGS_PATH, + settings, + sizeof(DesktopSettings), + DESKTOP_SETTINGS_MAGIC, + DESKTOP_SETTINGS_VER); + + } else if(version == DESKTOP_SETTINGS_VER_10) { + DesktopSettingsV10* settings_v10 = malloc(sizeof(DesktopSettingsV10)); + + success = saved_struct_load( + DESKTOP_SETTINGS_PATH, + settings_v10, + sizeof(DesktopSettingsV10), + DESKTOP_SETTINGS_MAGIC, + DESKTOP_SETTINGS_VER_10); + + if(success) { + *settings = settings_v10->settings; + } + + free(settings_v10); + } + + } while(false); + + if(!success) { + FURI_LOG_W(TAG, "Failed to load file, using defaults"); + memset(settings, 0, sizeof(DesktopSettings)); + desktop_settings_save(settings); + } +} + +void desktop_settings_save(const DesktopSettings* settings) { + furi_assert(settings); + + const bool success = saved_struct_save( + DESKTOP_SETTINGS_PATH, + settings, + sizeof(DesktopSettings), + DESKTOP_SETTINGS_MAGIC, + DESKTOP_SETTINGS_VER); + + if(!success) { + FURI_LOG_E(TAG, "Failed to save file"); + } +} diff --git a/applications/services/desktop/desktop_settings.h b/applications/services/desktop/desktop_settings.h index 4c848117a2..49c2cd20c0 100644 --- a/applications/services/desktop/desktop_settings.h +++ b/applications/services/desktop/desktop_settings.h @@ -1,12 +1,6 @@ #pragma once -#include "desktop_settings_filename.h" - -#include #include -#include -#include -#include #define DESKTOP_SETTINGS_VER (13) @@ -44,7 +38,7 @@ #define DISPLAY_BATTERY_BAR_PERCENT 5 typedef enum { - FavoriteAppLeftShort = 0, + FavoriteAppLeftShort, FavoriteAppLeftLong, FavoriteAppRightShort, FavoriteAppRightLong, @@ -67,16 +61,10 @@ typedef enum { } DummyAppShortcut; typedef struct { - InputKey data[MAX_PIN_SIZE]; - uint8_t length; -} PinCode; - -typedef struct { - char name_or_path[MAX_APP_LENGTH]; + char name_or_path[128]; } FavoriteApp; typedef struct { - PinCode pin_code; uint32_t auto_lock_delay_ms; uint8_t displayBatteryPercentage; uint8_t dummy_mode; @@ -84,3 +72,6 @@ typedef struct { FavoriteApp favorite_apps[FavoriteAppNumber]; FavoriteApp dummy_apps[DummyAppNumber]; } DesktopSettings; + +void desktop_settings_load(DesktopSettings* settings); +void desktop_settings_save(const DesktopSettings* settings); diff --git a/applications/services/desktop/helpers/pin.c b/applications/services/desktop/helpers/pin.c deleted file mode 100644 index 0b1149d6c2..0000000000 --- a/applications/services/desktop/helpers/pin.c +++ /dev/null @@ -1,72 +0,0 @@ -#include "pin.h" - -#include -#include -#include -#include -#include -#include - -static const NotificationSequence sequence_pin_fail = { - &message_display_backlight_on, - - &message_red_255, - &message_vibro_on, - &message_delay_100, - &message_vibro_off, - &message_red_0, - - &message_delay_250, - - &message_red_255, - &message_vibro_on, - &message_delay_100, - &message_vibro_off, - &message_red_0, - NULL, -}; - -static const uint8_t desktop_helpers_fails_timeout[] = { - 0, - 0, - 0, - 0, - 30, - 60, - 90, - 120, - 150, - 180, - /* +60 for every next fail */ -}; - -void desktop_pin_lock_error_notify(void) { - NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); - notification_message(notification, &sequence_pin_fail); - furi_record_close(RECORD_NOTIFICATION); -} - -uint32_t desktop_pin_lock_get_fail_timeout(void) { - uint32_t pin_fails = furi_hal_rtc_get_pin_fails(); - uint32_t pin_timeout = 0; - uint32_t max_index = COUNT_OF(desktop_helpers_fails_timeout) - 1; - if(pin_fails <= max_index) { - pin_timeout = desktop_helpers_fails_timeout[pin_fails]; - } else { - pin_timeout = desktop_helpers_fails_timeout[max_index] + (pin_fails - max_index) * 60; - } - - return pin_timeout; -} - -bool desktop_pin_compare(const PinCode* pin_code1, const PinCode* pin_code2) { - furi_assert(pin_code1); - furi_assert(pin_code2); - bool result = false; - - if(pin_code1->length == pin_code2->length) { - result = !memcmp(pin_code1->data, pin_code2->data, pin_code1->length); - } - - return result; -} diff --git a/applications/services/desktop/helpers/pin.h b/applications/services/desktop/helpers/pin.h deleted file mode 100644 index 23d16b0aa4..0000000000 --- a/applications/services/desktop/helpers/pin.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once -#include -#include -#include "../desktop.h" -#include - -void desktop_pin_lock_error_notify(void); - -uint32_t desktop_pin_lock_get_fail_timeout(void); - -bool desktop_pin_compare(const PinCode* pin_code1, const PinCode* pin_code2); diff --git a/applications/services/desktop/helpers/pin_code.c b/applications/services/desktop/helpers/pin_code.c new file mode 100644 index 0000000000..d1a37ed24c --- /dev/null +++ b/applications/services/desktop/helpers/pin_code.c @@ -0,0 +1,103 @@ +#include "pin_code.h" + +#include + +#include +#include + +#define DESKTOP_PIN_CODE_DIGIT_BIT_WIDTH (2) +#define DESKTOP_PIN_CODE_LENGTH_OFFSET (28) + +static const NotificationSequence sequence_pin_fail = { + &message_display_backlight_on, + + &message_red_255, + &message_vibro_on, + &message_delay_100, + &message_vibro_off, + &message_red_0, + + &message_delay_250, + + &message_red_255, + &message_vibro_on, + &message_delay_100, + &message_vibro_off, + &message_red_0, + NULL, +}; + +static const uint8_t desktop_helpers_fails_timeout[] = { + 0, + 0, + 0, + 0, + 30, + 60, + 90, + 120, + 150, + 180, + /* +60 for every next fail */ +}; + +static uint32_t desktop_pin_code_pack(const DesktopPinCode* pin_code) { + furi_check(pin_code); + furi_check(pin_code->length <= sizeof(pin_code->data)); + + uint32_t reg_value = 0; + + for(uint8_t i = 0; i < pin_code->length; ++i) { + furi_check(pin_code->data[i] < (1 << DESKTOP_PIN_CODE_DIGIT_BIT_WIDTH)); + reg_value |= (uint32_t)pin_code->data[i] << (i * DESKTOP_PIN_CODE_DIGIT_BIT_WIDTH); + } + + reg_value |= (uint32_t)pin_code->length << DESKTOP_PIN_CODE_LENGTH_OFFSET; + + return reg_value; +} + +bool desktop_pin_code_is_set(void) { + return furi_hal_rtc_get_pin_value() >> DESKTOP_PIN_CODE_LENGTH_OFFSET; +} + +void desktop_pin_code_set(const DesktopPinCode* pin_code) { + furi_hal_rtc_set_pin_value(desktop_pin_code_pack(pin_code)); +} + +void desktop_pin_code_reset(void) { + furi_hal_rtc_set_pin_value(0); +} + +bool desktop_pin_code_check(const DesktopPinCode* pin_code) { + return furi_hal_rtc_get_pin_value() == desktop_pin_code_pack(pin_code); +} + +bool desktop_pin_code_is_equal(const DesktopPinCode* pin_code1, const DesktopPinCode* pin_code2) { + furi_check(pin_code1); + furi_check(pin_code1->length <= sizeof(pin_code1->data)); + furi_check(pin_code2); + furi_check(pin_code2->length <= sizeof(pin_code2->data)); + + return pin_code1->length == pin_code2->length && + memcmp(pin_code1->data, pin_code2->data, pin_code1->length) == 0; +} + +void desktop_pin_lock_error_notify(void) { + NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); + notification_message(notification, &sequence_pin_fail); + furi_record_close(RECORD_NOTIFICATION); +} + +uint32_t desktop_pin_lock_get_fail_timeout(void) { + uint32_t pin_fails = furi_hal_rtc_get_pin_fails(); + uint32_t pin_timeout = 0; + uint32_t max_index = COUNT_OF(desktop_helpers_fails_timeout) - 1; + if(pin_fails <= max_index) { + pin_timeout = desktop_helpers_fails_timeout[pin_fails]; + } else { + pin_timeout = desktop_helpers_fails_timeout[max_index] + (pin_fails - max_index) * 60; + } + + return pin_timeout; +} diff --git a/applications/services/desktop/helpers/pin_code.h b/applications/services/desktop/helpers/pin_code.h new file mode 100644 index 0000000000..848c915b6c --- /dev/null +++ b/applications/services/desktop/helpers/pin_code.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include + +#define DESKTOP_PIN_CODE_MAX_LEN (10) + +typedef struct { + uint8_t data[DESKTOP_PIN_CODE_MAX_LEN]; + uint8_t length; +} DesktopPinCode; + +bool desktop_pin_code_is_set(void); + +void desktop_pin_code_set(const DesktopPinCode* pin_code); + +void desktop_pin_code_reset(void); + +bool desktop_pin_code_check(const DesktopPinCode* pin_code); + +bool desktop_pin_code_is_equal(const DesktopPinCode* pin_code1, const DesktopPinCode* pin_code2); + +void desktop_pin_lock_error_notify(void); + +uint32_t desktop_pin_lock_get_fail_timeout(void); diff --git a/applications/services/desktop/scenes/desktop_scene_i.h b/applications/services/desktop/scenes/desktop_scene_i.h deleted file mode 100644 index f481733aca..0000000000 --- a/applications/services/desktop/scenes/desktop_scene_i.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#define SCENE_LOCKED_FIRST_ENTER 0 -#define SCENE_LOCKED_REPEAT_ENTER 1 diff --git a/applications/services/desktop/scenes/desktop_scene_lock_menu.c b/applications/services/desktop/scenes/desktop_scene_lock_menu.c index 5951a8e4e3..5ca95c4c59 100644 --- a/applications/services/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/services/desktop/scenes/desktop_scene_lock_menu.c @@ -20,7 +20,6 @@ void desktop_scene_lock_menu_callback(DesktopEvent event, void* context) { void desktop_scene_lock_menu_on_enter(void* context) { Desktop* desktop = (Desktop*)context; - DESKTOP_SETTINGS_LOAD(&desktop->settings); scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); desktop_lock_menu_set_callback(desktop->lock_menu, desktop_scene_lock_menu_callback, desktop); desktop_lock_menu_set_dummy_mode_state(desktop->lock_menu, desktop->settings.dummy_mode); @@ -38,11 +37,8 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeTick) { bool check_pin_changed = scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneLockMenu); - if(check_pin_changed) { - DESKTOP_SETTINGS_LOAD(&desktop->settings); - if(desktop->settings.pin_code.length > 0) { - scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); - } + if(check_pin_changed && desktop_pin_code_is_set()) { + scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); } } else if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { diff --git a/applications/services/desktop/scenes/desktop_scene_locked.c b/applications/services/desktop/scenes/desktop_scene_locked.c index 846b2b5412..e7eeebca6d 100644 --- a/applications/services/desktop/scenes/desktop_scene_locked.c +++ b/applications/services/desktop/scenes/desktop_scene_locked.c @@ -6,12 +6,12 @@ #include "../desktop.h" #include "../desktop_i.h" -#include "../helpers/pin.h" +#include "../helpers/pin_code.h" #include "../animations/animation_manager.h" #include "../views/desktop_events.h" #include "../views/desktop_view_locked.h" #include "desktop_scene.h" -#include "desktop_scene_i.h" +#include "desktop_scene_locked.h" #define WRONG_PIN_HEADER_TIMEOUT 3000 #define INPUT_PIN_VIEW_TIMEOUT 15000 @@ -42,15 +42,13 @@ void desktop_scene_locked_on_enter(void* context) { bool switch_to_timeout_scene = false; uint32_t state = scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneLocked); - if(state == SCENE_LOCKED_FIRST_ENTER) { - bool pin_locked = desktop->settings.pin_code.length > 0; + if(state == DesktopSceneLockedStateFirstEnter) { view_port_enabled_set(desktop->lock_icon_viewport, true); Gui* gui = furi_record_open(RECORD_GUI); gui_set_lockdown(gui, true); furi_record_close(RECORD_GUI); - if(pin_locked) { - DESKTOP_SETTINGS_LOAD(&desktop->settings); + if(desktop_pin_code_is_set()) { desktop_view_locked_lock(desktop->locked_view, true); uint32_t pin_timeout = desktop_pin_lock_get_fail_timeout(); if(pin_timeout > 0) { @@ -65,7 +63,7 @@ void desktop_scene_locked_on_enter(void* context) { desktop_view_locked_close_doors(desktop->locked_view); } scene_manager_set_scene_state( - desktop->scene_manager, DesktopSceneLocked, SCENE_LOCKED_REPEAT_ENTER); + desktop->scene_manager, DesktopSceneLocked, DesktopSceneLockedStateRepeatEnter); } if(switch_to_timeout_scene) { diff --git a/applications/services/desktop/scenes/desktop_scene_locked.h b/applications/services/desktop/scenes/desktop_scene_locked.h new file mode 100644 index 0000000000..7d5b6b7bcd --- /dev/null +++ b/applications/services/desktop/scenes/desktop_scene_locked.h @@ -0,0 +1,6 @@ +#pragma once + +typedef enum { + DesktopSceneLockedStateFirstEnter, + DesktopSceneLockedStateRepeatEnter, +} DesktopSceneLockedState; diff --git a/applications/services/desktop/scenes/desktop_scene_main.c b/applications/services/desktop/scenes/desktop_scene_main.c index 5cc2033c3d..25c100ed7c 100644 --- a/applications/services/desktop/scenes/desktop_scene_main.c +++ b/applications/services/desktop/scenes/desktop_scene_main.c @@ -155,25 +155,21 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { } case DesktopMainEventOpenFavoriteLeftShort: - DESKTOP_SETTINGS_LOAD(&desktop->settings); desktop_scene_main_start_favorite( desktop, &desktop->settings.favorite_apps[FavoriteAppLeftShort]); consumed = true; break; case DesktopMainEventOpenFavoriteLeftLong: - DESKTOP_SETTINGS_LOAD(&desktop->settings); desktop_scene_main_start_favorite( desktop, &desktop->settings.favorite_apps[FavoriteAppLeftLong]); consumed = true; break; case DesktopMainEventOpenFavoriteRightShort: - DESKTOP_SETTINGS_LOAD(&desktop->settings); desktop_scene_main_start_favorite( desktop, &desktop->settings.favorite_apps[FavoriteAppRightShort]); consumed = true; break; case DesktopMainEventOpenFavoriteRightLong: - DESKTOP_SETTINGS_LOAD(&desktop->settings); desktop_scene_main_start_favorite( desktop, &desktop->settings.favorite_apps[FavoriteAppRightLong]); consumed = true; @@ -189,7 +185,6 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { break; case DesktopAnimationEventInteractAnimation: if(!animation_manager_interact_process(desktop->animation_manager)) { - DESKTOP_SETTINGS_LOAD(&desktop->settings); if(!desktop->settings.dummy_mode) { desktop_scene_main_open_app_or_profile( desktop, &desktop->settings.favorite_apps[FavoriteAppRightShort]); diff --git a/applications/services/desktop/scenes/desktop_scene_pin_input.c b/applications/services/desktop/scenes/desktop_scene_pin_input.c index 6f5bfe8cb3..449dd97f1a 100644 --- a/applications/services/desktop/scenes/desktop_scene_pin_input.c +++ b/applications/services/desktop/scenes/desktop_scene_pin_input.c @@ -10,7 +10,7 @@ #include "../desktop_i.h" #include "../views/desktop_events.h" #include "../views/desktop_view_pin_input.h" -#include "../helpers/pin.h" +#include "../helpers/pin_code.h" #include "desktop_scene.h" #define WRONG_PIN_HEADER_TIMEOUT 3000 @@ -49,10 +49,12 @@ static void desktop_scene_pin_input_back_callback(void* context) { view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopPinInputEventBack); } -static void desktop_scene_pin_input_done_callback(const PinCode* pin_code, void* context) { +static void desktop_scene_pin_input_done_callback(const DesktopPinCode* pin_code, void* context) { Desktop* desktop = (Desktop*)context; - if(desktop_pin_compare(&desktop->settings.pin_code, pin_code)) { + + if(desktop_pin_code_check(pin_code)) { view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopPinInputEventUnlocked); + } else { uint32_t pin_fails = furi_hal_rtc_get_pin_fails(); furi_hal_rtc_set_pin_fails(pin_fails + 1); diff --git a/applications/services/desktop/scenes/desktop_scene_slideshow.c b/applications/services/desktop/scenes/desktop_scene_slideshow.c index 012aff7519..7599241164 100644 --- a/applications/services/desktop/scenes/desktop_scene_slideshow.c +++ b/applications/services/desktop/scenes/desktop_scene_slideshow.c @@ -45,9 +45,6 @@ bool desktop_scene_slideshow_on_event(void* context, SceneManagerEvent event) { } void desktop_scene_slideshow_on_exit(void* context) { - UNUSED(context); - - Storage* storage = furi_record_open(RECORD_STORAGE); - storage_common_remove(storage, SLIDESHOW_FS_PATH); - furi_record_close(RECORD_STORAGE); + Desktop* desktop = context; + storage_common_remove(desktop->storage, SLIDESHOW_FS_PATH); } diff --git a/applications/services/desktop/views/desktop_events.h b/applications/services/desktop/views/desktop_events.h index c22b19acc7..ba91a30ccd 100644 --- a/applications/services/desktop/views/desktop_events.h +++ b/applications/services/desktop/views/desktop_events.h @@ -60,4 +60,6 @@ typedef enum { DesktopGlobalAfterAppFinished, DesktopGlobalAutoLock, DesktopGlobalApiUnlock, + DesktopGlobalSaveSettings, + DesktopGlobalReloadSettings, } DesktopEvent; diff --git a/applications/services/desktop/views/desktop_view_pin_input.c b/applications/services/desktop/views/desktop_view_pin_input.c index 965b5cceb7..c89a143c87 100644 --- a/applications/services/desktop/views/desktop_view_pin_input.c +++ b/applications/services/desktop/views/desktop_view_pin_input.c @@ -6,7 +6,6 @@ #include #include "desktop_view_pin_input.h" -#include #define NO_ACTIVITY_TIMEOUT 15000 @@ -14,6 +13,9 @@ #define DEFAULT_PIN_X 64 #define DEFAULT_PIN_Y 32 +#define MIN_PIN_LENGTH 4 +#define MAX_PIN_LENGTH DESKTOP_PIN_CODE_MAX_LEN + struct DesktopViewPinInput { View* view; DesktopViewPinInputCallback back_callback; @@ -24,7 +26,7 @@ struct DesktopViewPinInput { }; typedef struct { - PinCode pin; + DesktopPinCode pin; bool pin_hidden; bool locked_input; uint8_t pin_x; @@ -50,7 +52,7 @@ static bool desktop_view_pin_input_input(InputEvent* event, void* context) { bool call_back_callback = false; bool call_done_callback = false; - PinCode pin_code = {0}; + DesktopPinCode pin_code = {0}; if(event->type == InputTypeShort) { switch(event->key) { @@ -59,13 +61,13 @@ static bool desktop_view_pin_input_input(InputEvent* event, void* context) { case InputKeyDown: case InputKeyUp: if(!model->locked_input) { - if(model->pin.length < MAX_PIN_SIZE) { + if(model->pin.length < MAX_PIN_LENGTH) { model->pin.data[model->pin.length++] = event->key; } } break; case InputKeyOk: - if(model->pin.length >= MIN_PIN_SIZE) { + if(model->pin.length >= MIN_PIN_LENGTH) { call_done_callback = true; pin_code = model->pin; } @@ -102,7 +104,7 @@ static void desktop_view_pin_input_draw_cells(Canvas* canvas, DesktopViewPinInpu furi_assert(model); uint8_t draw_pin_size = MAX(4, model->pin.length + 1); - if(model->locked_input || (model->pin.length == MAX_PIN_SIZE)) { + if(model->locked_input || (model->pin.length == MAX_PIN_LENGTH)) { draw_pin_size = model->pin.length; } @@ -155,7 +157,7 @@ static void desktop_view_pin_input_draw(Canvas* canvas, void* context) { canvas_draw_str(canvas, 16, 60, "= clear"); } - if(model->button_label && ((model->pin.length >= MIN_PIN_SIZE) || model->locked_input)) { + if(model->button_label && ((model->pin.length >= MIN_PIN_LENGTH) || model->locked_input)) { elements_button_center(canvas, model->button_label); } @@ -247,7 +249,7 @@ void desktop_view_pin_input_unlock_input(DesktopViewPinInput* pin_input) { view_commit_model(pin_input->view, true); } -void desktop_view_pin_input_set_pin(DesktopViewPinInput* pin_input, const PinCode* pin) { +void desktop_view_pin_input_set_pin(DesktopViewPinInput* pin_input, const DesktopPinCode* pin) { furi_assert(pin_input); furi_assert(pin); diff --git a/applications/services/desktop/views/desktop_view_pin_input.h b/applications/services/desktop/views/desktop_view_pin_input.h index c430aff9ff..4605b6ff15 100644 --- a/applications/services/desktop/views/desktop_view_pin_input.h +++ b/applications/services/desktop/views/desktop_view_pin_input.h @@ -1,16 +1,17 @@ #pragma once #include -#include + +#include "../helpers/pin_code.h" typedef void (*DesktopViewPinInputCallback)(void*); -typedef void (*DesktopViewPinInputDoneCallback)(const PinCode* pin_code, void*); +typedef void (*DesktopViewPinInputDoneCallback)(const DesktopPinCode* pin_code, void*); typedef struct DesktopViewPinInput DesktopViewPinInput; DesktopViewPinInput* desktop_view_pin_input_alloc(void); void desktop_view_pin_input_free(DesktopViewPinInput*); -void desktop_view_pin_input_set_pin(DesktopViewPinInput* pin_input, const PinCode* pin); +void desktop_view_pin_input_set_pin(DesktopViewPinInput* pin_input, const DesktopPinCode* pin_code); void desktop_view_pin_input_reset_pin(DesktopViewPinInput* pin_input); void desktop_view_pin_input_hide_pin(DesktopViewPinInput* pin_input, bool pin_hidden); void desktop_view_pin_input_set_label_button(DesktopViewPinInput* pin_input, const char* label); diff --git a/applications/services/dolphin/dolphin.c b/applications/services/dolphin/dolphin.c index 95982f1af8..198c1483a3 100644 --- a/applications/services/dolphin/dolphin.c +++ b/applications/services/dolphin/dolphin.c @@ -1,6 +1,7 @@ #include "dolphin_i.h" #include +#include #define TAG "Dolphin" @@ -223,6 +224,10 @@ static bool dolphin_process_event(FuriMessageQueue* queue, void* context) { dolphin_state_increase_level(dolphin->state); furi_event_loop_timer_start(dolphin->flush_timer, FLUSH_TIMEOUT_TICKS); + } else if(event.type == DolphinEventTypeReloadState) { + dolphin_state_load(dolphin->state); + furi_event_loop_timer_start(dolphin->butthurt_timer, BUTTHURT_INCREASE_PERIOD_TICKS); + } else { furi_crash(); } @@ -232,6 +237,32 @@ static bool dolphin_process_event(FuriMessageQueue* queue, void* context) { return true; } +static void dolphin_storage_callback(const void* message, void* context) { + furi_assert(context); + Dolphin* dolphin = context; + const StorageEvent* event = message; + + if(event->type == StorageEventTypeCardMount) { + DolphinEvent event = { + .type = DolphinEventTypeReloadState, + }; + + dolphin_event_send_async(dolphin, &event); + } +} + +static void dolphin_init_state(Dolphin* dolphin) { + Storage* storage = furi_record_open(RECORD_STORAGE); + furi_pubsub_subscribe(storage_get_pubsub(storage), dolphin_storage_callback, dolphin); + + if(storage_sd_status(storage) != FSE_OK) { + FURI_LOG_D(TAG, "SD Card not ready, skipping state"); + return; + } + + dolphin_state_load(dolphin->state); +} + // Application thread int32_t dolphin_srv(void* p) { @@ -247,7 +278,7 @@ int32_t dolphin_srv(void* p) { Dolphin* dolphin = dolphin_alloc(); furi_record_create(RECORD_DOLPHIN, dolphin); - dolphin_state_load(dolphin->state); + dolphin_init_state(dolphin); furi_event_loop_message_queue_subscribe( dolphin->event_loop, diff --git a/applications/services/dolphin/dolphin_i.h b/applications/services/dolphin/dolphin_i.h index d4add808ad..6a6b3dfd81 100644 --- a/applications/services/dolphin/dolphin_i.h +++ b/applications/services/dolphin/dolphin_i.h @@ -12,6 +12,7 @@ typedef enum { DolphinEventTypeStats, DolphinEventTypeFlush, DolphinEventTypeLevel, + DolphinEventTypeReloadState, } DolphinEventType; typedef struct { diff --git a/applications/services/dolphin/helpers/dolphin_state.c b/applications/services/dolphin/helpers/dolphin_state.c index 5216b961dc..5cbc511458 100644 --- a/applications/services/dolphin/helpers/dolphin_state.c +++ b/applications/services/dolphin/helpers/dolphin_state.c @@ -1,11 +1,10 @@ #include "dolphin_state.h" -#include "dolphin/helpers/dolphin_deed.h" #include "dolphin_state_filename.h" -#include -#include #include #include + +#include #include #define TAG "DolphinState" @@ -26,29 +25,28 @@ void dolphin_state_free(DolphinState* dolphin_state) { free(dolphin_state); } -bool dolphin_state_save(DolphinState* dolphin_state) { +void dolphin_state_save(DolphinState* dolphin_state) { if(!dolphin_state->dirty) { - return true; + return; } - bool result = saved_struct_save( + bool success = saved_struct_save( DOLPHIN_STATE_PATH, &dolphin_state->data, sizeof(DolphinStoreData), DOLPHIN_STATE_HEADER_MAGIC, DOLPHIN_STATE_HEADER_VERSION); - if(result) { + if(success) { FURI_LOG_I(TAG, "State saved"); dolphin_state->dirty = false; + } else { FURI_LOG_E(TAG, "Failed to save state"); } - - return result; } -bool dolphin_state_load(DolphinState* dolphin_state) { +void dolphin_state_load(DolphinState* dolphin_state) { bool success = saved_struct_load( DOLPHIN_STATE_PATH, &dolphin_state->data, @@ -64,12 +62,12 @@ bool dolphin_state_load(DolphinState* dolphin_state) { } if(!success) { - FURI_LOG_W(TAG, "Reset dolphin-state"); - memset(dolphin_state, 0, sizeof(*dolphin_state)); + FURI_LOG_W(TAG, "Reset Dolphin state"); + memset(dolphin_state, 0, sizeof(DolphinState)); + dolphin_state->dirty = true; + dolphin_state_save(dolphin_state); } - - return success; } uint64_t dolphin_state_timestamp(void) { diff --git a/applications/services/dolphin/helpers/dolphin_state.h b/applications/services/dolphin/helpers/dolphin_state.h index a8d8406bef..bdbd98d473 100644 --- a/applications/services/dolphin/helpers/dolphin_state.h +++ b/applications/services/dolphin/helpers/dolphin_state.h @@ -1,9 +1,9 @@ #pragma once -#include "dolphin_deed.h" #include #include -#include + +#include "dolphin_deed.h" typedef struct DolphinState DolphinState; typedef struct { @@ -25,9 +25,9 @@ DolphinState* dolphin_state_alloc(void); void dolphin_state_free(DolphinState* dolphin_state); -bool dolphin_state_save(DolphinState* dolphin_state); +void dolphin_state_save(DolphinState* dolphin_state); -bool dolphin_state_load(DolphinState* dolphin_state); +void dolphin_state_load(DolphinState* dolphin_state); void dolphin_state_clear_limits(DolphinState* dolphin_state); diff --git a/applications/services/expansion/expansion.c b/applications/services/expansion/expansion.c index 9b0b31cf71..4731cb244a 100644 --- a/applications/services/expansion/expansion.c +++ b/applications/services/expansion/expansion.c @@ -4,6 +4,7 @@ #include #include +#include #include #include "expansion_worker.h" @@ -25,6 +26,7 @@ typedef enum { ExpansionMessageTypeEnable, ExpansionMessageTypeDisable, ExpansionMessageTypeSetListenSerial, + ExpansionMessageTypeReloadSettings, ExpansionMessageTypeModuleConnected, ExpansionMessageTypeModuleDisconnected, ExpansionMessageTypeConnectionEstablished, @@ -103,7 +105,10 @@ static void return; } - if(instance->settings.uart_index < FuriHalSerialIdMax) { + ExpansionSettings settings; + expansion_settings_load(&settings); + + if(settings.uart_index < FuriHalSerialIdMax) { instance->state = ExpansionStateEnabled; instance->serial_id = instance->settings.uart_index; furi_hal_serial_control_set_expansion_callback( @@ -116,7 +121,6 @@ static void static void expansion_control_handler_disable(Expansion* instance, const ExpansionMessageData* data) { UNUSED(data); - if(instance->state == ExpansionStateDisabled) { return; } else if( @@ -136,10 +140,10 @@ static void static void expansion_control_handler_set_listen_serial( Expansion* instance, const ExpansionMessageData* data) { - furi_check(data->serial_id < FuriHalSerialIdMax); + if(instance->state != ExpansionStateDisabled && instance->serial_id == data->serial_id) { + return; - if(instance->state == ExpansionStateRunning || - instance->state == ExpansionStateConnectionEstablished) { + } else if(instance->state == ExpansionStateRunning) { expansion_worker_stop(instance->worker); expansion_worker_free(instance->worker); @@ -156,6 +160,26 @@ static void expansion_control_handler_set_listen_serial( FURI_LOG_D(TAG, "Listen serial changed to %s", expansion_uart_names[instance->serial_id]); } +static void expansion_control_handler_reload_settings( + Expansion* instance, + const ExpansionMessageData* data) { + UNUSED(data); + + ExpansionSettings settings; + expansion_settings_load(&settings); + + if(settings.uart_index < FuriHalSerialIdMax) { + const ExpansionMessageData data = { + .serial_id = settings.uart_index, + }; + + expansion_control_handler_set_listen_serial(instance, &data); + + } else { + expansion_control_handler_disable(instance, NULL); + } +} + static void expansion_control_handler_module_connected( Expansion* instance, const ExpansionMessageData* data) { @@ -211,6 +235,7 @@ static const ExpansionControlHandler expansion_control_handlers[] = { [ExpansionMessageTypeEnable] = expansion_control_handler_enable, [ExpansionMessageTypeDisable] = expansion_control_handler_disable, [ExpansionMessageTypeSetListenSerial] = expansion_control_handler_set_listen_serial, + [ExpansionMessageTypeReloadSettings] = expansion_control_handler_reload_settings, [ExpansionMessageTypeModuleConnected] = expansion_control_handler_module_connected, [ExpansionMessageTypeModuleDisconnected] = expansion_control_handler_module_disconnected, [ExpansionMessageTypeConnectionEstablished] = expansion_control_handler_connection_established, @@ -249,6 +274,22 @@ static Expansion* expansion_alloc(void) { return instance; } +static void expansion_storage_callback(const void* message, void* context) { + furi_assert(context); + + const StorageEvent* event = message; + Expansion* instance = context; + + if(event->type == StorageEventTypeCardMount) { + ExpansionMessage em = { + .type = ExpansionMessageTypeReloadSettings, + .api_lock = NULL, + }; + + furi_check(furi_message_queue_put(instance->queue, &em, FuriWaitForever) == FuriStatusOk); + } +} + void expansion_on_system_start(void* arg) { UNUSED(arg); @@ -256,7 +297,14 @@ void expansion_on_system_start(void* arg) { furi_record_create(RECORD_EXPANSION, instance); furi_thread_start(instance->thread); - expansion_settings_load(&instance->settings); + Storage* storage = furi_record_open(RECORD_STORAGE); + furi_pubsub_subscribe(storage_get_pubsub(storage), expansion_storage_callback, instance); + + if(storage_sd_status(storage) != FSE_OK) { + FURI_LOG_D(TAG, "SD Card not ready, skipping settings"); + return; + } + expansion_enable(instance); } diff --git a/applications/services/expansion/expansion_settings.c b/applications/services/expansion/expansion_settings.c index c00b8fe247..061d630a7a 100644 --- a/applications/services/expansion/expansion_settings.c +++ b/applications/services/expansion/expansion_settings.c @@ -6,29 +6,40 @@ #include "expansion_settings_filename.h" +#define TAG "ExpansionSettings" + #define EXPANSION_SETTINGS_PATH INT_PATH(EXPANSION_SETTINGS_FILE_NAME) #define EXPANSION_SETTINGS_VERSION (0) #define EXPANSION_SETTINGS_MAGIC (0xEA) -bool expansion_settings_load(ExpansionSettings* settings) { +void expansion_settings_load(ExpansionSettings* settings) { furi_assert(settings); - if(!saved_struct_load( - EXPANSION_SETTINGS_PATH, - settings, - sizeof(ExpansionSettings), - EXPANSION_SETTINGS_MAGIC, - EXPANSION_SETTINGS_VERSION)) { - settings->uart_index = FuriHalSerialIdMax; + + const bool success = saved_struct_load( + EXPANSION_SETTINGS_PATH, + settings, + sizeof(ExpansionSettings), + EXPANSION_SETTINGS_MAGIC, + EXPANSION_SETTINGS_VERSION); + + if(!success) { + FURI_LOG_W(TAG, "Failed to load file, using defaults"); + memset(settings, 0, sizeof(ExpansionSettings)); + expansion_settings_save(settings); } - return true; } -bool expansion_settings_save(const ExpansionSettings* settings) { +void expansion_settings_save(const ExpansionSettings* settings) { furi_assert(settings); - return saved_struct_save( + + const bool success = saved_struct_save( EXPANSION_SETTINGS_PATH, settings, sizeof(ExpansionSettings), EXPANSION_SETTINGS_MAGIC, EXPANSION_SETTINGS_VERSION); + + if(!success) { + FURI_LOG_E(TAG, "Failed to save file"); + } } diff --git a/applications/services/expansion/expansion_settings.h b/applications/services/expansion/expansion_settings.h index 38e9f8d025..4594918e33 100644 --- a/applications/services/expansion/expansion_settings.h +++ b/applications/services/expansion/expansion_settings.h @@ -25,18 +25,16 @@ typedef struct { /** * @brief Load expansion module support settings from file. * - * @param[out] settings pointer to an ExpansionSettings instance to load settings into. - * @returns true if the settings were successfully loaded, false otherwise. + * @param[in,out] settings pointer to an ExpansionSettings instance to load settings into. */ -bool expansion_settings_load(ExpansionSettings* settings); +void expansion_settings_load(ExpansionSettings* settings); /** * @brief Save expansion module support settings to file. * * @param[in] settings pointer to an ExpansionSettings instance to save settings from. - * @returns true if the settings were successfully saved, false otherwise. */ -bool expansion_settings_save(const ExpansionSettings* settings); +void expansion_settings_save(const ExpansionSettings* settings); #ifdef __cplusplus } diff --git a/applications/services/gui/modules/file_browser_worker.c b/applications/services/gui/modules/file_browser_worker.c index 7092e15da8..bcd43b45a4 100644 --- a/applications/services/gui/modules/file_browser_worker.c +++ b/applications/services/gui/modules/file_browser_worker.c @@ -15,7 +15,7 @@ #define TAG "BrowserWorker" #define ASSETS_DIR "assets" -#define BROWSER_ROOT STORAGE_ANY_PATH_PREFIX +#define BROWSER_ROOT STORAGE_EXT_PATH_PREFIX #define FILE_NAME_LEN_MAX 256 #define LONG_LOAD_THRESHOLD 100 diff --git a/applications/services/notification/notification_app.c b/applications/services/notification/notification_app.c index d4c5b91c8c..35d2fe675a 100644 --- a/applications/services/notification/notification_app.c +++ b/applications/services/notification/notification_app.c @@ -438,7 +438,7 @@ static bool notification_load_settings(NotificationApp* app) { File* file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); const size_t settings_size = sizeof(NotificationSettings); - FURI_LOG_I(TAG, "loading settings from \"%s\"", NOTIFICATION_SETTINGS_PATH); + FURI_LOG_I(TAG, "Loading \"%s\"", NOTIFICATION_SETTINGS_PATH); bool fs_result = storage_file_open(file, NOTIFICATION_SETTINGS_PATH, FSAM_READ, FSOM_OPEN_EXISTING); @@ -451,8 +451,6 @@ static bool notification_load_settings(NotificationApp* app) { } if(fs_result) { - FURI_LOG_I(TAG, "load success"); - if(settings.version != NOTIFICATION_SETTINGS_VERSION) { FURI_LOG_E( TAG, "version(%d != %d) mismatch", settings.version, NOTIFICATION_SETTINGS_VERSION); @@ -462,7 +460,7 @@ static bool notification_load_settings(NotificationApp* app) { furi_kernel_unlock(); } } else { - FURI_LOG_E(TAG, "load failed, %s", storage_file_get_error_desc(file)); + FURI_LOG_E(TAG, "Load failed, %s", storage_file_get_error_desc(file)); } storage_file_close(file); @@ -477,7 +475,7 @@ static bool notification_save_settings(NotificationApp* app) { File* file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); const size_t settings_size = sizeof(NotificationSettings); - FURI_LOG_I(TAG, "saving settings to \"%s\"", NOTIFICATION_SETTINGS_PATH); + FURI_LOG_I(TAG, "Saving \"%s\"", NOTIFICATION_SETTINGS_PATH); furi_kernel_lock(); memcpy(&settings, &app->settings, settings_size); @@ -495,9 +493,8 @@ static bool notification_save_settings(NotificationApp* app) { } if(fs_result) { - FURI_LOG_I(TAG, "save success"); } else { - FURI_LOG_E(TAG, "save failed, %s", storage_file_get_error_desc(file)); + FURI_LOG_E(TAG, "Save failed, %s", storage_file_get_error_desc(file)); } storage_file_close(file); @@ -556,14 +553,46 @@ static NotificationApp* notification_app_alloc(void) { return app; } +static void notification_storage_callback(const void* message, void* context) { + furi_assert(context); + NotificationApp* app = context; + const StorageEvent* event = message; + + if(event->type == StorageEventTypeCardMount) { + NotificationAppMessage m = { + .type = LoadSettingsMessage, + }; + + furi_check(furi_message_queue_put(app->queue, &m, FuriWaitForever) == FuriStatusOk); + } +} + +static void notification_apply_settings(NotificationApp* app) { + if(!notification_load_settings(app)) { + notification_save_settings(app); + } + + notification_apply_lcd_contrast(app); +} + +static void notification_init_settings(NotificationApp* app) { + Storage* storage = furi_record_open(RECORD_STORAGE); + furi_pubsub_subscribe(storage_get_pubsub(storage), notification_storage_callback, app); + + if(storage_sd_status(storage) != FSE_OK) { + FURI_LOG_D(TAG, "SD Card not ready, skipping settings"); + return; + } + + notification_apply_settings(app); +} + // App int32_t notification_srv(void* p) { UNUSED(p); NotificationApp* app = notification_app_alloc(); - if(!notification_load_settings(app)) { - notification_save_settings(app); - } + notification_init_settings(app); notification_vibro_off(); notification_sound_off(); @@ -571,7 +600,6 @@ int32_t notification_srv(void* p) { notification_apply_internal_led_layer(&app->led[0], 0x00); notification_apply_internal_led_layer(&app->led[1], 0x00); notification_apply_internal_led_layer(&app->led[2], 0x00); - notification_apply_lcd_contrast(app); furi_record_create(RECORD_NOTIFICATION, app); @@ -589,6 +617,9 @@ int32_t notification_srv(void* p) { case SaveSettingsMessage: notification_save_settings(app); break; + case LoadSettingsMessage: + notification_load_settings(app); + break; } if(message.back_event != NULL) { diff --git a/applications/services/notification/notification_app.h b/applications/services/notification/notification_app.h index 434773f2e5..e195465741 100644 --- a/applications/services/notification/notification_app.h +++ b/applications/services/notification/notification_app.h @@ -11,6 +11,7 @@ typedef enum { NotificationLayerMessage, InternalLayerMessage, SaveSettingsMessage, + LoadSettingsMessage, } NotificationAppMessageType; typedef struct { diff --git a/applications/services/region/application.fam b/applications/services/region/application.fam new file mode 100644 index 0000000000..a4cdc94ea5 --- /dev/null +++ b/applications/services/region/application.fam @@ -0,0 +1,10 @@ +App( + appid="region", + name="RegionSrv", + apptype=FlipperAppType.STARTUP, + targets=["f7"], + entry_point="region_on_system_start", + cdefines=["SRV_REGION"], + requires=["storage"], + order=170, +) diff --git a/applications/services/region/region.c b/applications/services/region/region.c new file mode 100644 index 0000000000..dffcc6b2d5 --- /dev/null +++ b/applications/services/region/region.c @@ -0,0 +1,147 @@ +#include + +#include +#include + +#include +#include + +#define TAG "RegionSrv" + +#define SUBGHZ_REGION_FILENAME INT_PATH(".region_data") + +static bool region_istream_read(pb_istream_t* istream, pb_byte_t* buf, size_t count) { + File* file = istream->state; + size_t ret = storage_file_read(file, buf, count); + return count == ret; +} + +static bool region_istream_decode_band(pb_istream_t* stream, const pb_field_t* field, void** arg) { + UNUSED(field); + + FuriHalRegion* region = *arg; + + PB_Region_Band band = {0}; + if(!pb_decode(stream, PB_Region_Band_fields, &band)) { + FURI_LOG_E(TAG, "PB Region band decode error: %s", PB_GET_ERROR(stream)); + return false; + } + + region->bands_count += 1; + region = realloc( //-V701 + region, + sizeof(FuriHalRegion) + sizeof(FuriHalRegionBand) * region->bands_count); + size_t pos = region->bands_count - 1; + region->bands[pos].start = band.start; + region->bands[pos].end = band.end; + region->bands[pos].power_limit = band.power_limit; + region->bands[pos].duty_cycle = band.duty_cycle; + *arg = region; + + FURI_LOG_I( + TAG, + "Add allowed band: start %luHz, stop %luHz, power_limit %ddBm, duty_cycle %u%%", + band.start, + band.end, + band.power_limit, + band.duty_cycle); + return true; +} + +static int32_t region_load_file(void* context) { + UNUSED(context); + + Storage* storage = furi_record_open(RECORD_STORAGE); + File* file = storage_file_alloc(storage); + + PB_Region pb_region = {0}; + pb_region.bands.funcs.decode = region_istream_decode_band; + + do { + FileInfo fileinfo = {0}; + + if(storage_common_stat(storage, SUBGHZ_REGION_FILENAME, &fileinfo) != FSE_OK || + fileinfo.size == 0) { + FURI_LOG_W(TAG, "Region file missing or empty"); + break; + + } else if(!storage_file_open(file, SUBGHZ_REGION_FILENAME, FSAM_READ, FSOM_OPEN_EXISTING)) { + FURI_LOG_E(TAG, "Failed to open region file"); + break; + } + + pb_istream_t istream = { + .callback = region_istream_read, + .state = file, + .errmsg = NULL, + .bytes_left = fileinfo.size, + }; + + pb_region.bands.arg = malloc(sizeof(FuriHalRegion)); + + if(!pb_decode(&istream, PB_Region_fields, &pb_region)) { + FURI_LOG_E(TAG, "Failed to decode region file"); + free(pb_region.bands.arg); + break; + } + + FuriHalRegion* region = pb_region.bands.arg; + + memcpy( + region->country_code, + pb_region.country_code->bytes, + MIN(pb_region.country_code->size, sizeof(region->country_code) - 1)); + + furi_hal_region_set(region); + + FURI_LOG_I(TAG, "Dynamic region set: %s", region->country_code); + } while(0); + + pb_release(PB_Region_fields, &pb_region); + storage_file_free(file); + furi_record_close(RECORD_STORAGE); + + return 0; +} + +static void region_loader_pending_callback(void* context, uint32_t arg) { + UNUSED(arg); + + FuriThread* loader = context; + furi_thread_join(loader); + furi_thread_free(loader); +} + +static void region_loader_state_callback(FuriThreadState state, void* context) { + UNUSED(context); + + if(state == FuriThreadStateStopped) { + furi_timer_pending_callback(region_loader_pending_callback, furi_thread_get_current(), 0); + } +} + +static void region_storage_callback(const void* message, void* context) { + UNUSED(context); + const StorageEvent* event = message; + + if(event->type == StorageEventTypeCardMount) { + FuriThread* loader = furi_thread_alloc_ex(NULL, 2048, region_load_file, NULL); + furi_thread_set_state_callback(loader, region_loader_state_callback); + furi_thread_start(loader); + } +} + +int32_t region_on_system_start(void* p) { + UNUSED(p); + + Storage* storage = furi_record_open(RECORD_STORAGE); + furi_pubsub_subscribe(storage_get_pubsub(storage), region_storage_callback, NULL); + + if(storage_sd_status(storage) != FSE_OK) { + FURI_LOG_D(TAG, "SD Card not ready, skipping dynamic region"); + return 0; + } + + region_load_file(NULL); + return 0; +} diff --git a/applications/services/storage/storage.c b/applications/services/storage/storage.c index 21f8789cec..bfe2a08b21 100644 --- a/applications/services/storage/storage.c +++ b/applications/services/storage/storage.c @@ -3,7 +3,6 @@ #include "storage_message.h" #include "storage_processing.h" #include "storage/storage_glue.h" -#include "storages/storage_int.h" #include "storages/storage_ext.h" #include @@ -42,9 +41,6 @@ Storage* storage_app_alloc(void) { storage_data_timestamp(&app->storage[i]); } -#ifndef FURI_RAM_EXEC - storage_int_init(&app->storage[ST_INT]); -#endif storage_ext_init(&app->storage[ST_EXT]); // sd icon gui @@ -106,6 +102,11 @@ int32_t storage_srv(void* p) { Storage* app = storage_app_alloc(); furi_record_create(RECORD_STORAGE, app); + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagStorageFormatInternal)) { + FURI_LOG_W(TAG, "Format Internal not supported, clearing flag"); + furi_hal_rtc_reset_flag(FuriHalRtcFlagStorageFormatInternal); + } + StorageMessage message; while(1) { if(furi_message_queue_get(app->message_queue, &message, STORAGE_TICK) == FuriStatusOk) { diff --git a/applications/services/storage/storage.h b/applications/services/storage/storage.h index a4dffe6330..6dbeb0d36b 100644 --- a/applications/services/storage/storage.h +++ b/applications/services/storage/storage.h @@ -506,7 +506,7 @@ FS_Error storage_sd_status(Storage* storage); /******************* Internal LFS Functions *******************/ -typedef void (*Storage_name_converter)(FuriString*); +typedef void (*StorageNameConverter)(FuriString*); /** * @brief Back up the internal storage contents to a *.tar archive. @@ -526,7 +526,7 @@ FS_Error storage_int_backup(Storage* storage, const char* dstname); * @return FSE_OK if the storage was successfully restored, any other error code on failure. */ FS_Error - storage_int_restore(Storage* storage, const char* dstname, Storage_name_converter converter); + storage_int_restore(Storage* storage, const char* dstname, StorageNameConverter converter); /***************** Simplified Functions ******************/ diff --git a/applications/services/storage/storage_cli.c b/applications/services/storage/storage_cli.c index 918e796ce3..17fd4eae4d 100644 --- a/applications/services/storage/storage_cli.c +++ b/applications/services/storage/storage_cli.c @@ -33,7 +33,7 @@ static void storage_cli_info(Cli* cli, FuriString* path, FuriString* args) { storage_cli_print_error(error); } else { printf( - "Label: %s\r\nType: LittleFS\r\n%luKiB total\r\n%luKiB free\r\n", + "Label: %s\r\nType: Virtual\r\n%luKiB total\r\n%luKiB free\r\n", furi_hal_version_get_name_ptr() ? furi_hal_version_get_name_ptr() : "Unknown", (uint32_t)(total_space / 1024), (uint32_t)(free_space / 1024)); diff --git a/applications/services/storage/storage_internal_api.c b/applications/services/storage/storage_internal_api.c index 4cbce7546e..defab966ce 100644 --- a/applications/services/storage/storage_internal_api.c +++ b/applications/services/storage/storage_internal_api.c @@ -14,7 +14,7 @@ FS_Error storage_int_backup(Storage* storage, const char* dstname) { } FS_Error - storage_int_restore(Storage* storage, const char* srcname, Storage_name_converter converter) { + storage_int_restore(Storage* storage, const char* srcname, StorageNameConverter converter) { furi_check(storage); TarArchive* archive = tar_archive_alloc(storage); diff --git a/applications/services/storage/storage_processing.c b/applications/services/storage/storage_processing.c index 9e96765b62..5645899307 100644 --- a/applications/services/storage/storage_processing.c +++ b/applications/services/storage/storage_processing.c @@ -2,6 +2,8 @@ #include #include +#define TAG "Storage" + #define STORAGE_PATH_PREFIX_LEN 4u _Static_assert( sizeof(STORAGE_ANY_PATH_PREFIX) == STORAGE_PATH_PREFIX_LEN + 1, @@ -60,36 +62,27 @@ static StorageType storage_get_type_by_path(FuriString* path) { return type; } -static void storage_path_change_to_real_storage(FuriString* path, StorageType real_storage) { - if(furi_string_search(path, STORAGE_ANY_PATH_PREFIX) == 0) { - switch(real_storage) { - case ST_EXT: - furi_string_replace_at( - path, 0, strlen(STORAGE_EXT_PATH_PREFIX), STORAGE_EXT_PATH_PREFIX); - break; - case ST_INT: - furi_string_replace_at( - path, 0, strlen(STORAGE_INT_PATH_PREFIX), STORAGE_INT_PATH_PREFIX); - break; - default: - break; - } - } -} static FS_Error storage_get_data(Storage* app, FuriString* path, StorageData** storage) { StorageType type = storage_get_type_by_path(path); if(storage_type_is_valid(type)) { + // Any storage phase-out: redirect "/any" to "/ext" if(type == ST_ANY) { - type = ST_INT; - if(storage_data_status(&app->storage[ST_EXT]) == StorageStatusOK) { - type = ST_EXT; - } - storage_path_change_to_real_storage(path, type); + FURI_LOG_W( + TAG, + STORAGE_ANY_PATH_PREFIX " is deprecated, use " STORAGE_EXT_PATH_PREFIX " instead"); + furi_string_replace_at( + path, 0, strlen(STORAGE_EXT_PATH_PREFIX), STORAGE_EXT_PATH_PREFIX); + type = ST_EXT; + } + + furi_assert(type == ST_EXT); + + if(storage_data_status(&app->storage[type]) != StorageStatusOK) { + return FSE_NOT_READY; } - furi_assert(type == ST_EXT || type == ST_INT); *storage = &app->storage[type]; return FSE_OK; @@ -559,6 +552,16 @@ void storage_process_alias( furi_string_get_cstr(apps_assets_path_with_appsid)); furi_string_free(apps_assets_path_with_appsid); + + } else if(furi_string_start_with(path, STORAGE_INT_PATH_PREFIX)) { + furi_string_replace_at( + path, 0, strlen(STORAGE_INT_PATH_PREFIX), STORAGE_EXT_PATH_PREFIX "/.int"); + + FuriString* int_on_ext_path = furi_string_alloc_set(STORAGE_EXT_PATH_PREFIX "/.int"); + if(storage_process_common_stat(app, int_on_ext_path, NULL) != FSE_OK) { + storage_process_common_mkdir(app, int_on_ext_path); + } + furi_string_free(int_on_ext_path); } } diff --git a/applications/services/storage/storages/storage_int.c b/applications/services/storage/storages/storage_int.c deleted file mode 100644 index 324ce63286..0000000000 --- a/applications/services/storage/storages/storage_int.c +++ /dev/null @@ -1,744 +0,0 @@ -#include "storage_int.h" -#include -#include -#include - -#define TAG "StorageInt" - -#define STORAGE_PATH STORAGE_INT_PATH_PREFIX -#define LFS_CLEAN_FINGERPRINT 0 - -/* When less than LFS_RESERVED_PAGES_COUNT are left free, creation & - * modification of non-dot files is restricted */ -#define LFS_RESERVED_PAGES_COUNT 3 - -typedef struct { - const size_t start_address; - const size_t start_page; - struct lfs_config config; - lfs_t lfs; -} LFSData; - -typedef struct { - void* data; - bool open; -} LFSHandle; - -static LFSHandle* lfs_handle_alloc_file(void) { - LFSHandle* handle = malloc(sizeof(LFSHandle)); - handle->data = malloc(sizeof(lfs_file_t)); - return handle; -} - -static LFSHandle* lfs_handle_alloc_dir(void) { - LFSHandle* handle = malloc(sizeof(LFSHandle)); - handle->data = malloc(sizeof(lfs_dir_t)); - return handle; -} - -/* INTERNALS */ - -static lfs_dir_t* lfs_handle_get_dir(LFSHandle* handle) { - return handle->data; -} - -static lfs_file_t* lfs_handle_get_file(LFSHandle* handle) { - return handle->data; -} - -static void lfs_handle_free(LFSHandle* handle) { - free(handle->data); - free(handle); -} - -static void lfs_handle_set_open(LFSHandle* handle) { - handle->open = true; -} - -static bool lfs_handle_is_open(LFSHandle* handle) { - return handle->open; -} - -static lfs_t* lfs_get_from_storage(StorageData* storage) { - return &((LFSData*)storage->data)->lfs; -} - -static LFSData* lfs_data_get_from_storage(StorageData* storage) { - return (LFSData*)storage->data; -} - -static int storage_int_device_read( - const struct lfs_config* c, - lfs_block_t block, - lfs_off_t off, - void* buffer, - lfs_size_t size) { - LFSData* lfs_data = c->context; - size_t address = lfs_data->start_address + block * c->block_size + off; - - FURI_LOG_T( - TAG, - "Device read: block %lu, off %lu, buffer: %p, size %lu, translated address: %p", - block, - off, - buffer, - size, - (void*)address); - - memcpy(buffer, (void*)address, size); - - return 0; -} - -static int storage_int_device_prog( - const struct lfs_config* c, - lfs_block_t block, - lfs_off_t off, - const void* buffer, - lfs_size_t size) { - LFSData* lfs_data = c->context; - size_t address = lfs_data->start_address + block * c->block_size + off; - - FURI_LOG_T( - TAG, - "Device prog: block %lu, off %lu, buffer: %p, size %lu, translated address: %p", - block, - off, - buffer, - size, - (void*)address); - - int ret = 0; - while(size > 0) { - furi_hal_flash_write_dword(address, *(uint64_t*)buffer); - address += c->prog_size; - buffer += c->prog_size; - size -= c->prog_size; - } - - return ret; -} - -static int storage_int_device_erase(const struct lfs_config* c, lfs_block_t block) { - LFSData* lfs_data = c->context; - size_t page = lfs_data->start_page + block; - - FURI_LOG_D(TAG, "Device erase: page %lu, translated page: %zx", block, page); - - furi_hal_flash_erase(page); - return 0; -} - -static int storage_int_device_sync(const struct lfs_config* c) { - UNUSED(c); - FURI_LOG_D(TAG, "Device sync: skipping"); - return 0; -} - -static LFSData* storage_int_lfs_data_alloc(void) { - LFSData* lfs_data = malloc(sizeof(LFSData)); - - // Internal storage start address - *(size_t*)(&lfs_data->start_address) = furi_hal_flash_get_free_page_start_address(); - *(size_t*)(&lfs_data->start_page) = - (lfs_data->start_address - furi_hal_flash_get_base()) / furi_hal_flash_get_page_size(); - - // LFS configuration - // Glue and context - lfs_data->config.context = lfs_data; - lfs_data->config.read = storage_int_device_read; - lfs_data->config.prog = storage_int_device_prog; - lfs_data->config.erase = storage_int_device_erase; - lfs_data->config.sync = storage_int_device_sync; - - // Block device description - lfs_data->config.read_size = furi_hal_flash_get_read_block_size(); - lfs_data->config.prog_size = furi_hal_flash_get_write_block_size(); - lfs_data->config.block_size = furi_hal_flash_get_page_size(); - lfs_data->config.block_count = furi_hal_flash_get_free_page_count(); - lfs_data->config.block_cycles = furi_hal_flash_get_cycles_count(); - lfs_data->config.cache_size = 16; - lfs_data->config.lookahead_size = 16; - - return lfs_data; -} - -// Returns true if fingerprint was invalid and LFS reformatting is needed -static bool storage_int_check_and_set_fingerprint(LFSData* lfs_data) { - bool value = false; - - uint32_t os_fingerprint = 0; - os_fingerprint |= ((lfs_data->start_page & 0xFF) << 0); - os_fingerprint |= ((lfs_data->config.block_count & 0xFF) << 8); - os_fingerprint |= ((LFS_DISK_VERSION_MAJOR & 0xFFFF) << 16); - - uint32_t rtc_fingerprint = furi_hal_rtc_get_register(FuriHalRtcRegisterLfsFingerprint); - if(rtc_fingerprint == LFS_CLEAN_FINGERPRINT) { - FURI_LOG_I(TAG, "Storing LFS fingerprint in RTC"); - furi_hal_rtc_set_register(FuriHalRtcRegisterLfsFingerprint, os_fingerprint); - } else if(rtc_fingerprint != os_fingerprint) { - FURI_LOG_E(TAG, "LFS fingerprint mismatch"); - furi_hal_rtc_set_register(FuriHalRtcRegisterLfsFingerprint, os_fingerprint); - value = true; - } - - return value; -} - -static void storage_int_lfs_mount(LFSData* lfs_data, StorageData* storage) { - int err; - lfs_t* lfs = &lfs_data->lfs; - - bool was_fingerprint_outdated = storage_int_check_and_set_fingerprint(lfs_data); - bool need_format = furi_hal_rtc_is_flag_set(FuriHalRtcFlagStorageFormatInternal) || - was_fingerprint_outdated; - - if(need_format) { - // Format storage - err = lfs_format(lfs, &lfs_data->config); - if(err == 0) { - FURI_LOG_I(TAG, "Factory reset: Format successful, trying to mount"); - furi_hal_rtc_reset_flag(FuriHalRtcFlagStorageFormatInternal); - err = lfs_mount(lfs, &lfs_data->config); - if(err == 0) { - FURI_LOG_I(TAG, "Factory reset: Mounted"); - storage->status = StorageStatusOK; - } else { - FURI_LOG_E(TAG, "Factory reset: Mount after format failed"); - storage->status = StorageStatusNotMounted; - } - } else { - FURI_LOG_E(TAG, "Factory reset: Format failed"); - storage->status = StorageStatusNoFS; - } - } else { - // Normal - err = lfs_mount(lfs, &lfs_data->config); - if(err == 0) { - FURI_LOG_I(TAG, "Mounted"); - storage->status = StorageStatusOK; - } else { - FURI_LOG_E(TAG, "Mount failed, formatting"); - err = lfs_format(lfs, &lfs_data->config); - if(err == 0) { - FURI_LOG_I(TAG, "Format successful, trying to mount"); - err = lfs_mount(lfs, &lfs_data->config); - if(err == 0) { - FURI_LOG_I(TAG, "Mounted"); - storage->status = StorageStatusOK; - } else { - FURI_LOG_E(TAG, "Mount after format failed"); - storage->status = StorageStatusNotMounted; - } - } else { - FURI_LOG_E(TAG, "Format failed"); - storage->status = StorageStatusNoFS; - } - } - } -} - -/****************** Common Functions ******************/ - -static FS_Error storage_int_parse_error(int error) { - FS_Error result; - - if(error >= LFS_ERR_OK) { - result = FSE_OK; - } else { - switch(error) { - case LFS_ERR_NOENT: - result = FSE_NOT_EXIST; - break; - case LFS_ERR_EXIST: - result = FSE_EXIST; - break; - case LFS_ERR_NOTEMPTY: - result = FSE_DENIED; - break; - case LFS_ERR_INVAL: - case LFS_ERR_NOATTR: - result = FSE_INVALID_PARAMETER; - break; - case LFS_ERR_BADF: - case LFS_ERR_ISDIR: - case LFS_ERR_NOTDIR: - case LFS_ERR_NAMETOOLONG: - result = FSE_INVALID_NAME; - break; - case LFS_ERR_IO: - case LFS_ERR_FBIG: - case LFS_ERR_NOSPC: - case LFS_ERR_NOMEM: - case LFS_ERR_CORRUPT: - default: - result = FSE_INTERNAL; - } - } - - return result; -} - -/* Returns false if less than reserved space is left free */ -static bool storage_int_check_for_free_space(StorageData* storage) { - LFSData* lfs_data = lfs_data_get_from_storage(storage); - - lfs_ssize_t result = lfs_fs_size(lfs_get_from_storage(storage)); - if(result >= 0) { - lfs_size_t free_space = - (lfs_data->config.block_count - result) * lfs_data->config.block_size; - - return free_space > LFS_RESERVED_PAGES_COUNT * furi_hal_flash_get_page_size(); - } - - return false; -} -/******************* File Functions *******************/ - -static bool storage_int_file_open( - void* ctx, - File* file, - const char* path, - FS_AccessMode access_mode, - FS_OpenMode open_mode) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - - bool enough_free_space = storage_int_check_for_free_space(storage); - - int flags = 0; - - if(access_mode & FSAM_READ) flags |= LFS_O_RDONLY; - if(access_mode & FSAM_WRITE) flags |= LFS_O_WRONLY; - - if(open_mode & FSOM_OPEN_EXISTING) flags |= 0; - if(open_mode & FSOM_OPEN_ALWAYS) flags |= LFS_O_CREAT; - if(open_mode & FSOM_OPEN_APPEND) flags |= LFS_O_CREAT | LFS_O_APPEND; - if(open_mode & FSOM_CREATE_NEW) flags |= LFS_O_CREAT | LFS_O_EXCL; - if(open_mode & FSOM_CREATE_ALWAYS) flags |= LFS_O_CREAT | LFS_O_TRUNC; - - LFSHandle* handle = lfs_handle_alloc_file(); - storage_set_storage_file_data(file, handle, storage); - - if(!enough_free_space) { - FuriString* filename; - filename = furi_string_alloc(); - path_extract_basename(path, filename); - bool is_dot_file = - (!furi_string_empty(filename) && (furi_string_get_char(filename, 0) == '.')); - furi_string_free(filename); - - /* Restrict write & creation access to all non-dot files */ - if(!is_dot_file && (flags & (LFS_O_CREAT | LFS_O_WRONLY))) { - file->internal_error_id = LFS_ERR_NOSPC; - file->error_id = FSE_DENIED; - FURI_LOG_W(TAG, "Denied access to '%s': no free space", path); - return false; - } - } - - file->internal_error_id = lfs_file_open(lfs, lfs_handle_get_file(handle), path, flags); - - if(file->internal_error_id >= LFS_ERR_OK) { - lfs_handle_set_open(handle); - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - - return file->error_id == FSE_OK; -} - -static bool storage_int_file_close(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_file_close(lfs, lfs_handle_get_file(handle)); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - lfs_handle_free(handle); - return file->error_id == FSE_OK; -} - -static uint16_t - storage_int_file_read(void* ctx, File* file, void* buff, uint16_t const bytes_to_read) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - uint16_t bytes_read = 0; - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = - lfs_file_read(lfs, lfs_handle_get_file(handle), buff, bytes_to_read); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - - if(file->error_id == FSE_OK) { - bytes_read = file->internal_error_id; - file->internal_error_id = 0; - } - return bytes_read; -} - -static uint16_t - storage_int_file_write(void* ctx, File* file, const void* buff, uint16_t const bytes_to_write) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - uint16_t bytes_written = 0; - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = - lfs_file_write(lfs, lfs_handle_get_file(handle), buff, bytes_to_write); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - - if(file->error_id == FSE_OK) { - bytes_written = file->internal_error_id; - file->internal_error_id = 0; - } - return bytes_written; -} - -static bool - storage_int_file_seek(void* ctx, File* file, const uint32_t offset, const bool from_start) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - if(from_start) { - file->internal_error_id = - lfs_file_seek(lfs, lfs_handle_get_file(handle), offset, LFS_SEEK_SET); - } else { - file->internal_error_id = - lfs_file_seek(lfs, lfs_handle_get_file(handle), offset, LFS_SEEK_CUR); - } - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - return file->error_id == FSE_OK; -} - -static uint64_t storage_int_file_tell(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_file_tell(lfs, lfs_handle_get_file(handle)); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - - int32_t position = 0; - if(file->error_id == FSE_OK) { - position = file->internal_error_id; - file->internal_error_id = 0; - } - - return position; -} - -static bool storage_int_file_truncate(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_file_tell(lfs, lfs_handle_get_file(handle)); - file->error_id = storage_int_parse_error(file->internal_error_id); - - if(file->error_id == FSE_OK) { - uint32_t position = file->internal_error_id; - file->internal_error_id = - lfs_file_truncate(lfs, lfs_handle_get_file(handle), position); - file->error_id = storage_int_parse_error(file->internal_error_id); - } - } else { - file->internal_error_id = LFS_ERR_BADF; - file->error_id = storage_int_parse_error(file->internal_error_id); - } - - return file->error_id == FSE_OK; -} - -static bool storage_int_file_sync(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_file_sync(lfs, lfs_handle_get_file(handle)); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - return file->error_id == FSE_OK; -} - -static uint64_t storage_int_file_size(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_file_size(lfs, lfs_handle_get_file(handle)); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - - uint32_t size = 0; - if(file->error_id == FSE_OK) { - size = file->internal_error_id; - file->internal_error_id = 0; - } - - return size; -} - -static bool storage_int_file_eof(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - bool eof = true; - - if(lfs_handle_is_open(handle)) { - int32_t position = lfs_file_tell(lfs, lfs_handle_get_file(handle)); - int32_t size = lfs_file_size(lfs, lfs_handle_get_file(handle)); - - if(position < 0) { - file->internal_error_id = position; - } else if(size < 0) { - file->internal_error_id = size; - } else { - file->internal_error_id = LFS_ERR_OK; - eof = (position >= size); - } - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - return eof; -} - -/******************* Dir Functions *******************/ - -static bool storage_int_dir_open(void* ctx, File* file, const char* path) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - - LFSHandle* handle = lfs_handle_alloc_dir(); - storage_set_storage_file_data(file, handle, storage); - - file->internal_error_id = lfs_dir_open(lfs, lfs_handle_get_dir(handle), path); - if(file->internal_error_id >= LFS_ERR_OK) { - lfs_handle_set_open(handle); - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - return file->error_id == FSE_OK; -} - -static bool storage_int_dir_close(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_dir_close(lfs, lfs_handle_get_dir(handle)); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - lfs_handle_free(handle); - return file->error_id == FSE_OK; -} - -static bool storage_int_dir_read( - void* ctx, - File* file, - FileInfo* fileinfo, - char* name, - const uint16_t name_length) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - struct lfs_info _fileinfo; - - // LFS returns virtual directories "." and "..", so we read until we get something meaningful or an empty string - do { - file->internal_error_id = lfs_dir_read(lfs, lfs_handle_get_dir(handle), &_fileinfo); - file->error_id = storage_int_parse_error(file->internal_error_id); - } while(strcmp(_fileinfo.name, ".") == 0 || strcmp(_fileinfo.name, "..") == 0); - - if(fileinfo != NULL) { - fileinfo->size = _fileinfo.size; - fileinfo->flags = 0; - if(_fileinfo.type & LFS_TYPE_DIR) fileinfo->flags |= FSF_DIRECTORY; - } - - if(name != NULL) { - snprintf(name, name_length, "%s", _fileinfo.name); - } - - // set FSE_NOT_EXIST error on end of directory - if(file->internal_error_id == 0) { - file->error_id = FSE_NOT_EXIST; - } - } else { - file->internal_error_id = LFS_ERR_BADF; - file->error_id = storage_int_parse_error(file->internal_error_id); - } - - return file->error_id == FSE_OK; -} - -static bool storage_int_dir_rewind(void* ctx, File* file) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - LFSHandle* handle = storage_get_storage_file_data(file, storage); - - if(lfs_handle_is_open(handle)) { - file->internal_error_id = lfs_dir_rewind(lfs, lfs_handle_get_dir(handle)); - } else { - file->internal_error_id = LFS_ERR_BADF; - } - - file->error_id = storage_int_parse_error(file->internal_error_id); - return file->error_id == FSE_OK; -} - -/******************* Common FS Functions *******************/ - -static FS_Error storage_int_common_stat(void* ctx, const char* path, FileInfo* fileinfo) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - struct lfs_info _fileinfo; - int result = lfs_stat(lfs, path, &_fileinfo); - - if(fileinfo != NULL) { - fileinfo->size = _fileinfo.size; - fileinfo->flags = 0; - if(_fileinfo.type & LFS_TYPE_DIR) fileinfo->flags |= FSF_DIRECTORY; - } - - return storage_int_parse_error(result); -} - -static FS_Error storage_int_common_remove(void* ctx, const char* path) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - int result = lfs_remove(lfs, path); - return storage_int_parse_error(result); -} - -static FS_Error storage_int_common_mkdir(void* ctx, const char* path) { - StorageData* storage = ctx; - lfs_t* lfs = lfs_get_from_storage(storage); - int result = lfs_mkdir(lfs, path); - return storage_int_parse_error(result); -} - -static FS_Error storage_int_common_fs_info( - void* ctx, - const char* fs_path, - uint64_t* total_space, - uint64_t* free_space) { - UNUSED(fs_path); - StorageData* storage = ctx; - - lfs_t* lfs = lfs_get_from_storage(storage); - LFSData* lfs_data = lfs_data_get_from_storage(storage); - - if(total_space) { - *total_space = lfs_data->config.block_size * lfs_data->config.block_count; - } - - lfs_ssize_t result = lfs_fs_size(lfs); - if(free_space && (result >= 0)) { - *free_space = (lfs_data->config.block_count - result) * lfs_data->config.block_size; - } - - return storage_int_parse_error(result); -} - -static bool storage_int_common_equivalent_path(const char* path1, const char* path2) { - return strcmp(path1, path2) == 0; -} - -/******************* Init Storage *******************/ -static const FS_Api fs_api = { - .file = - { - .open = storage_int_file_open, - .close = storage_int_file_close, - .read = storage_int_file_read, - .write = storage_int_file_write, - .seek = storage_int_file_seek, - .tell = storage_int_file_tell, - .truncate = storage_int_file_truncate, - .size = storage_int_file_size, - .sync = storage_int_file_sync, - .eof = storage_int_file_eof, - }, - .dir = - { - .open = storage_int_dir_open, - .close = storage_int_dir_close, - .read = storage_int_dir_read, - .rewind = storage_int_dir_rewind, - }, - .common = - { - .stat = storage_int_common_stat, - .mkdir = storage_int_common_mkdir, - .remove = storage_int_common_remove, - .fs_info = storage_int_common_fs_info, - .equivalent_path = storage_int_common_equivalent_path, - }, -}; - -void storage_int_init(StorageData* storage) { - FURI_LOG_I(TAG, "Starting"); - LFSData* lfs_data = storage_int_lfs_data_alloc(); - FURI_LOG_I( - TAG, - "Config: start %p, read %lu, write %lu, page size: %lu, page count: %lu, cycles: %ld", - (void*)lfs_data->start_address, - lfs_data->config.read_size, - lfs_data->config.prog_size, - lfs_data->config.block_size, - lfs_data->config.block_count, - lfs_data->config.block_cycles); - - storage_int_lfs_mount(lfs_data, storage); - - storage->data = lfs_data; - storage->api.tick = NULL; - storage->fs_api = &fs_api; -} diff --git a/applications/services/storage/storages/storage_int.h b/applications/services/storage/storages/storage_int.h deleted file mode 100644 index 456d72408f..0000000000 --- a/applications/services/storage/storages/storage_int.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once -#include -#include "../storage_glue.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void storage_int_init(StorageData* storage); - -#ifdef __cplusplus -} -#endif diff --git a/applications/settings/bt_settings_app/bt_settings_app.c b/applications/settings/bt_settings_app/bt_settings_app.c index d86c9df647..8972820644 100644 --- a/applications/settings/bt_settings_app/bt_settings_app.c +++ b/applications/settings/bt_settings_app/bt_settings_app.c @@ -15,8 +15,6 @@ static bool bt_settings_back_event_callback(void* context) { BtSettingsApp* bt_settings_app_alloc(void) { BtSettingsApp* app = malloc(sizeof(BtSettingsApp)); - // Load settings - bt_settings_load(&app->settings); app->gui = furi_record_open(RECORD_GUI); app->bt = furi_record_open(RECORD_BT); @@ -48,6 +46,8 @@ BtSettingsApp* bt_settings_app_alloc(void) { view_dispatcher_add_view( app->view_dispatcher, BtSettingsAppViewPopup, popup_get_view(app->popup)); + bt_get_settings(app->bt, &app->settings); + // Set first scene scene_manager_next_scene(app->scene_manager, BtSettingsAppSceneStart); return app; @@ -55,6 +55,7 @@ BtSettingsApp* bt_settings_app_alloc(void) { void bt_settings_app_free(BtSettingsApp* app) { furi_assert(app); + bt_set_settings(app->bt, &app->settings); // Gui modules view_dispatcher_remove_view(app->view_dispatcher, BtSettingsAppViewVarItemList); variable_item_list_free(app->var_item_list); @@ -79,7 +80,6 @@ extern int32_t bt_settings_app(void* p) { UNUSED(p); BtSettingsApp* app = bt_settings_app_alloc(); view_dispatcher_run(app->view_dispatcher); - bt_settings_save(&app->settings); bt_settings_app_free(app); return 0; } diff --git a/applications/settings/bt_settings_app/bt_settings_app.h b/applications/settings/bt_settings_app/bt_settings_app.h index b79e369511..5255945ff5 100644 --- a/applications/settings/bt_settings_app/bt_settings_app.h +++ b/applications/settings/bt_settings_app/bt_settings_app.h @@ -1,18 +1,21 @@ #pragma once #include -#include + #include #include #include #include -#include #include #include #include -#include +#include +#include + +#include + #include "scenes/bt_settings_scene.h" enum BtSettingsCustomEvent { diff --git a/applications/settings/bt_settings_app/scenes/bt_settings_scene_start.c b/applications/settings/bt_settings_app/scenes/bt_settings_scene_start.c index 1d72a9e6fa..a76740bd1e 100644 --- a/applications/settings/bt_settings_app/scenes/bt_settings_scene_start.c +++ b/applications/settings/bt_settings_app/scenes/bt_settings_scene_start.c @@ -70,18 +70,17 @@ bool bt_settings_scene_start_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == BtSettingOn) { - furi_hal_bt_start_advertising(); app->settings.enabled = true; consumed = true; } else if(event.event == BtSettingOff) { app->settings.enabled = false; - furi_hal_bt_stop_advertising(); consumed = true; } else if(event.event == BtSettingsCustomEventForgetDevices) { scene_manager_next_scene(app->scene_manager, BtSettingsAppSceneForgetDevConfirm); consumed = true; } } + return consumed; } diff --git a/applications/settings/desktop_settings/desktop_settings_app.c b/applications/settings/desktop_settings/desktop_settings_app.c index 35ee2a3f1f..b6f719f009 100644 --- a/applications/settings/desktop_settings/desktop_settings_app.c +++ b/applications/settings/desktop_settings/desktop_settings_app.c @@ -5,9 +5,11 @@ #include #include +#include +#include + #include "desktop_settings_app.h" #include "scenes/desktop_settings_scene.h" -#include static bool desktop_settings_custom_event_callback(void* context, uint32_t event) { furi_assert(context); @@ -131,18 +133,20 @@ void desktop_settings_app_free(DesktopSettingsApp* app) { } extern int32_t desktop_settings_app(void* p) { + UNUSED(p); + DesktopSettingsApp* app = desktop_settings_app_alloc(); - DESKTOP_SETTINGS_LOAD(&app->settings); + Desktop* desktop = furi_record_open(RECORD_DESKTOP); - if(p && (strcmp(p, DESKTOP_SETTINGS_RUN_PIN_SETUP_ARG) == 0)) { - scene_manager_next_scene(app->scene_manager, DesktopSettingsAppScenePinSetupHowto); - } else { - scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneStart); - } + desktop_api_get_settings(desktop, &app->settings); + + scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneStart); view_dispatcher_run(app->view_dispatcher); - DESKTOP_SETTINGS_SAVE(&app->settings); + desktop_api_set_settings(desktop, &app->settings); + furi_record_close(RECORD_DESKTOP); + desktop_settings_app_free(app); return 0; diff --git a/applications/settings/desktop_settings/desktop_settings_app.h b/applications/settings/desktop_settings/desktop_settings_app.h index 48adb9cfb0..c9d765fd46 100644 --- a/applications/settings/desktop_settings/desktop_settings_app.h +++ b/applications/settings/desktop_settings/desktop_settings_app.h @@ -40,7 +40,7 @@ typedef struct { DesktopSettingsViewPinSetupHowto* pin_setup_howto_view; DesktopSettingsViewPinSetupHowto2* pin_setup_howto2_view; - PinCode pincode_buffer; + DesktopPinCode pincode_buffer; bool pincode_buffer_filled; bool save_name; diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c index ee6af0bd9c..9f2dce3fc8 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c @@ -194,19 +194,25 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e strncpy( curr_favorite_app->name_or_path, furi_string_get_cstr(temp_path), - MAX_APP_LENGTH); + sizeof(curr_favorite_app->name_or_path)); consumed = true; } } else { size_t app_index = event.event - MAIN_LIST_APPLICATION_OFFSET; const char* name = favorite_fap_get_app_name(app_index); - if(name) strncpy(curr_favorite_app->name_or_path, name, MAX_APP_LENGTH); + if(name) + strncpy( + curr_favorite_app->name_or_path, + name, + sizeof(curr_favorite_app->name_or_path)); consumed = true; } if(consumed) { scene_manager_previous_scene(app->scene_manager); }; consumed = true; + + desktop_settings_save(&app->settings); } furi_string_free(temp_path); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_auth.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_auth.c index 5af25cd614..1e64165314 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_auth.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_auth.c @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include "../desktop_settings_app.h" #include #include @@ -12,13 +12,14 @@ #define SCENE_EVENT_PINS_EQUAL (1U) #define SCENE_EVENT_PINS_DIFFERENT (2U) -static void pin_auth_done_callback(const PinCode* pin_code, void* context) { +static void pin_auth_done_callback(const DesktopPinCode* pin_code, void* context) { furi_assert(pin_code); furi_assert(context); - DesktopSettingsApp* app = context; + DesktopSettingsApp* app = context; app->pincode_buffer = *pin_code; - if(desktop_pin_compare(&app->settings.pin_code, pin_code)) { + + if(desktop_pin_code_check(pin_code)) { view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EVENT_PINS_EQUAL); } else { view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EVENT_PINS_DIFFERENT); @@ -31,10 +32,9 @@ static void pin_auth_back_callback(void* context) { } void desktop_settings_scene_pin_auth_on_enter(void* context) { - DesktopSettingsApp* app = context; + furi_assert(desktop_pin_code_is_set()); - DESKTOP_SETTINGS_LOAD(&app->settings); - furi_assert(app->settings.pin_code.length > 0); + DesktopSettingsApp* app = context; desktop_view_pin_input_set_context(app->pin_input_view, app); desktop_view_pin_input_set_back_callback(app->pin_input_view, pin_auth_back_callback); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_disable.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_disable.c index f31a968944..abcce66da7 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_disable.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_disable.c @@ -17,9 +17,8 @@ static void pin_disable_back_callback(void* context) { void desktop_settings_scene_pin_disable_on_enter(void* context) { furi_assert(context); DesktopSettingsApp* app = context; - app->settings.pin_code.length = 0; - memset(app->settings.pin_code.data, '0', sizeof(app->settings.pin_code.data)); - DESKTOP_SETTINGS_SAVE(&app->settings); + + desktop_pin_code_reset(); popup_set_context(app->popup, app); popup_set_callback(app->popup, pin_disable_back_callback); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_error.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_error.c index 1ba3c1b2da..711683c3fe 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_error.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_error.c @@ -6,7 +6,7 @@ #include #include "desktop_settings_scene.h" #include "desktop_settings_scene_i.h" -#include +#include #include "../desktop_settings_app.h" #define SCENE_EVENT_EXIT (0U) @@ -17,7 +17,7 @@ static void pin_error_back_callback(void* context) { view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EVENT_EXIT); } -static void pin_error_done_callback(const PinCode* pin_code, void* context) { +static void pin_error_done_callback(const DesktopPinCode* pin_code, void* context) { UNUSED(pin_code); furi_assert(context); DesktopSettingsApp* app = context; diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_menu.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_menu.c index 7375edd3f4..e0c66cb288 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_menu.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_menu.c @@ -19,7 +19,7 @@ void desktop_settings_scene_pin_menu_on_enter(void* context) { Submenu* submenu = app->submenu; submenu_reset(submenu); - if(!app->settings.pin_code.length) { + if(!desktop_pin_code_is_set()) { submenu_add_item( submenu, "Set PIN", diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup.c index 93012330aa..08f5fcb3fc 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup.c @@ -7,14 +7,14 @@ #include #include "desktop_settings_scene.h" #include "desktop_settings_scene_i.h" -#include +#include #define SCENE_EVENT_EXIT (0U) #define SCENE_EVENT_1ST_PIN_ENTERED (1U) #define SCENE_EVENT_PINS_EQUAL (2U) #define SCENE_EVENT_PINS_DIFFERENT (3U) -static void pin_setup_done_callback(const PinCode* pin_code, void* context) { +static void pin_setup_done_callback(const DesktopPinCode* pin_code, void* context) { furi_assert(pin_code); furi_assert(context); DesktopSettingsApp* app = context; @@ -25,7 +25,7 @@ static void pin_setup_done_callback(const PinCode* pin_code, void* context) { view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EVENT_1ST_PIN_ENTERED); } else { app->pincode_buffer_filled = false; - if(desktop_pin_compare(&app->pincode_buffer, pin_code)) { + if(desktop_pin_code_is_equal(&app->pincode_buffer, pin_code)) { view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EVENT_PINS_EQUAL); } else { view_dispatcher_send_custom_event(app->view_dispatcher, SCENE_EVENT_PINS_DIFFERENT); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup_done.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup_done.c index 170e6bca56..aa3d2214e5 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup_done.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_setup_done.c @@ -11,7 +11,7 @@ #define SCENE_EVENT_DONE (0U) -static void pin_setup_done_callback(const PinCode* pin_code, void* context) { +static void pin_setup_done_callback(const DesktopPinCode* pin_code, void* context) { furi_assert(pin_code); furi_assert(context); DesktopSettingsApp* app = context; @@ -22,8 +22,8 @@ static void pin_setup_done_callback(const PinCode* pin_code, void* context) { void desktop_settings_scene_pin_setup_done_on_enter(void* context) { DesktopSettingsApp* app = context; - app->settings.pin_code = app->pincode_buffer; - DESKTOP_SETTINGS_SAVE(&app->settings); + desktop_pin_code_set(&app->pincode_buffer); + NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); notification_message(notification, &sequence_single_vibro); notification_message(notification, &sequence_blink_green_10); @@ -32,7 +32,7 @@ void desktop_settings_scene_pin_setup_done_on_enter(void* context) { desktop_view_pin_input_set_context(app->pin_input_view, app); desktop_view_pin_input_set_back_callback(app->pin_input_view, NULL); desktop_view_pin_input_set_done_callback(app->pin_input_view, pin_setup_done_callback); - desktop_view_pin_input_set_pin(app->pin_input_view, &app->settings.pin_code); + desktop_view_pin_input_set_pin(app->pin_input_view, &app->pincode_buffer); desktop_view_pin_input_set_label_button(app->pin_input_view, "Done"); desktop_view_pin_input_set_label_primary(app->pin_input_view, 29, 8, "PIN Activated!"); desktop_view_pin_input_set_label_secondary( diff --git a/applications/settings/expansion_settings_app/expansion_settings_app.c b/applications/settings/expansion_settings_app/expansion_settings_app.c index fe0e3ca2c0..629c9a0a0f 100644 --- a/applications/settings/expansion_settings_app/expansion_settings_app.c +++ b/applications/settings/expansion_settings_app/expansion_settings_app.c @@ -27,6 +27,8 @@ static uint32_t expansion_settings_app_exit(void* context) { static ExpansionSettingsApp* expansion_settings_app_alloc(void) { ExpansionSettingsApp* app = malloc(sizeof(ExpansionSettingsApp)); + expansion_settings_load(&app->settings); + app->gui = furi_record_open(RECORD_GUI); app->expansion = furi_record_open(RECORD_EXPANSION); app->settings = expansion_get_settings(app->expansion); diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_internal_info.c b/applications/settings/storage_settings/scenes/storage_settings_scene_internal_info.c index b7620b6e82..5a367afcec 100644 --- a/applications/settings/storage_settings/scenes/storage_settings_scene_internal_info.c +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_internal_info.c @@ -27,7 +27,7 @@ void storage_settings_scene_internal_info_on_enter(void* context) { } else { furi_string_printf( app->text_string, - "Name: %s\nType: LittleFS\nTotal: %lu KiB\nFree: %lu KiB", + "Name: %s\nType: Virtual\nTotal: %lu KiB\nFree: %lu KiB", furi_hal_version_get_name_ptr() ? furi_hal_version_get_name_ptr() : "Unknown", (uint32_t)(total_space / 1024), (uint32_t)(free_space / 1024)); diff --git a/applications/system/application.fam b/applications/system/application.fam index 095ca1ab2c..c5f81defa6 100644 --- a/applications/system/application.fam +++ b/applications/system/application.fam @@ -4,7 +4,6 @@ App( apptype=FlipperAppType.METAPACKAGE, provides=[ "updater_app", - "storage_move_to_sd", "js_app", "js_app_start", # "archive", diff --git a/applications/system/storage_move_to_sd/application.fam b/applications/system/storage_move_to_sd/application.fam deleted file mode 100644 index de47de0551..0000000000 --- a/applications/system/storage_move_to_sd/application.fam +++ /dev/null @@ -1,18 +0,0 @@ -App( - appid="storage_move_to_sd", - name="StorageMoveToSd", - apptype=FlipperAppType.SYSTEM, - entry_point="storage_move_to_sd_app", - requires=["gui", "storage"], - provides=["storage_move_to_sd_start"], - stack_size=2 * 1024, - order=30, -) - -App( - appid="storage_move_to_sd_start", - apptype=FlipperAppType.STARTUP, - entry_point="storage_move_to_sd_start", - requires=["storage"], - order=120, -) diff --git a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.c b/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.c deleted file mode 100644 index 011bf47df9..0000000000 --- a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "storage_move_to_sd_scene.h" - -// Generate scene on_enter handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, -void (*const storage_move_to_sd_on_enter_handlers[])(void*) = { -#include "storage_move_to_sd_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_event handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event, -bool (*const storage_move_to_sd_on_event_handlers[])(void* context, SceneManagerEvent event) = { -#include "storage_move_to_sd_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_exit handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit, -void (*const storage_move_to_sd_on_exit_handlers[])(void* context) = { -#include "storage_move_to_sd_scene_config.h" -}; -#undef ADD_SCENE - -// Initialize scene handlers configuration structure -const SceneManagerHandlers storage_move_to_sd_scene_handlers = { - .on_enter_handlers = storage_move_to_sd_on_enter_handlers, - .on_event_handlers = storage_move_to_sd_on_event_handlers, - .on_exit_handlers = storage_move_to_sd_on_exit_handlers, - .scene_num = StorageMoveToSdSceneNum, -}; diff --git a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.h b/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.h deleted file mode 100644 index bdeb4a8433..0000000000 --- a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include - -// Generate scene id and total number -#define ADD_SCENE(prefix, name, id) StorageMoveToSd##id, -typedef enum { -#include "storage_move_to_sd_scene_config.h" - StorageMoveToSdSceneNum, -} StorageMoveToSdScene; -#undef ADD_SCENE - -extern const SceneManagerHandlers storage_move_to_sd_scene_handlers; - -// Generate scene on_enter handlers declaration -#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); -#include "storage_move_to_sd_scene_config.h" -#undef ADD_SCENE - -// Generate scene on_event handlers declaration -#define ADD_SCENE(prefix, name, id) \ - bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event); -#include "storage_move_to_sd_scene_config.h" -#undef ADD_SCENE - -// Generate scene on_exit handlers declaration -#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context); -#include "storage_move_to_sd_scene_config.h" -#undef ADD_SCENE diff --git a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_config.h b/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_config.h deleted file mode 100644 index 1d7b2d25b8..0000000000 --- a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_config.h +++ /dev/null @@ -1,2 +0,0 @@ -ADD_SCENE(storage_move_to_sd, confirm, Confirm) -ADD_SCENE(storage_move_to_sd, progress, Progress) diff --git a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_confirm.c b/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_confirm.c deleted file mode 100644 index 08c9e2d7fc..0000000000 --- a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_confirm.c +++ /dev/null @@ -1,70 +0,0 @@ -#include "../storage_move_to_sd.h" -#include -#include -#include - -static void storage_move_to_sd_scene_confirm_widget_callback( - GuiButtonType result, - InputType type, - void* context) { - StorageMoveToSd* app = context; - furi_assert(app); - if(type == InputTypeShort) { - if(result == GuiButtonTypeRight) { - view_dispatcher_send_custom_event(app->view_dispatcher, MoveToSdCustomEventConfirm); - } else if(result == GuiButtonTypeLeft) { - view_dispatcher_send_custom_event(app->view_dispatcher, MoveToSdCustomEventExit); - } - } -} - -void storage_move_to_sd_scene_confirm_on_enter(void* context) { - StorageMoveToSd* app = context; - - widget_add_button_element( - app->widget, - GuiButtonTypeLeft, - "Cancel", - storage_move_to_sd_scene_confirm_widget_callback, - app); - widget_add_button_element( - app->widget, - GuiButtonTypeRight, - "Confirm", - storage_move_to_sd_scene_confirm_widget_callback, - app); - - widget_add_string_element( - app->widget, 64, 10, AlignCenter, AlignCenter, FontPrimary, "SD card inserted"); - widget_add_string_multiline_element( - app->widget, - 64, - 32, - AlignCenter, - AlignCenter, - FontSecondary, - "Move data from\ninternal storage to SD card?"); - - view_dispatcher_switch_to_view(app->view_dispatcher, StorageMoveToSdViewWidget); -} - -bool storage_move_to_sd_scene_confirm_on_event(void* context, SceneManagerEvent event) { - StorageMoveToSd* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == MoveToSdCustomEventConfirm) { - scene_manager_next_scene(app->scene_manager, StorageMoveToSdProgress); - consumed = true; - } else if(event.event == MoveToSdCustomEventExit) { - view_dispatcher_stop(app->view_dispatcher); - } - } - - return consumed; -} - -void storage_move_to_sd_scene_confirm_on_exit(void* context) { - StorageMoveToSd* app = context; - widget_reset(app->widget); -} diff --git a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_progress.c b/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_progress.c deleted file mode 100644 index 7aa951bd83..0000000000 --- a/applications/system/storage_move_to_sd/scenes/storage_move_to_sd_scene_progress.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "../storage_move_to_sd.h" - -void storage_move_to_sd_scene_progress_on_enter(void* context) { - StorageMoveToSd* app = context; - - widget_add_string_element( - app->widget, 64, 10, AlignCenter, AlignCenter, FontPrimary, "Moving..."); - - view_dispatcher_switch_to_view(app->view_dispatcher, StorageMoveToSdViewWidget); - - storage_move_to_sd_perform(); - view_dispatcher_send_custom_event(app->view_dispatcher, MoveToSdCustomEventExit); -} - -bool storage_move_to_sd_scene_progress_on_event(void* context, SceneManagerEvent event) { - StorageMoveToSd* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - view_dispatcher_stop(app->view_dispatcher); - } else if(event.type == SceneManagerEventTypeBack) { - consumed = true; - } - - return consumed; -} - -void storage_move_to_sd_scene_progress_on_exit(void* context) { - StorageMoveToSd* app = context; - widget_reset(app->widget); -} diff --git a/applications/system/storage_move_to_sd/storage_move_to_sd.c b/applications/system/storage_move_to_sd/storage_move_to_sd.c deleted file mode 100644 index 44e73c6895..0000000000 --- a/applications/system/storage_move_to_sd/storage_move_to_sd.c +++ /dev/null @@ -1,203 +0,0 @@ -#include "storage_move_to_sd.h" - -#include -#include -#include -#include -#include -#include - -#define TAG "MoveToSd" - -#define MOVE_SRC STORAGE_INT_PATH_PREFIX -#define MOVE_DST STORAGE_EXT_PATH_PREFIX - -static bool storage_move_to_sd_check_entry(const char* name, FileInfo* fileinfo, void* ctx) { - UNUSED(ctx); - if(file_info_is_dir(fileinfo)) { - return true; - } - - return name && (*name != '.'); -} - -static void storage_move_to_sd_remove_region() { - if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) return; - Storage* storage = furi_record_open(RECORD_STORAGE); - - if(storage_common_exists(storage, INT_PATH(".region_data"))) { - storage_common_remove(storage, INT_PATH(".region_data")); - } - - furi_record_close(RECORD_STORAGE); -} - -bool storage_move_to_sd_perform(void) { - Storage* storage = furi_record_open(RECORD_STORAGE); - - DirWalk* dir_walk = dir_walk_alloc(storage); - dir_walk_set_recursive(dir_walk, false); - dir_walk_set_filter_cb(dir_walk, storage_move_to_sd_check_entry, NULL); - - FuriString *path_src, *path_dst; - - path_dst = furi_string_alloc(); - path_src = furi_string_alloc(); - - if(dir_walk_open(dir_walk, STORAGE_INT_PATH_PREFIX)) { - while(dir_walk_read(dir_walk, path_src, NULL) == DirWalkOK) { - furi_string_set(path_dst, path_src); - furi_string_replace_at( - path_dst, 0, strlen(STORAGE_INT_PATH_PREFIX), STORAGE_EXT_PATH_PREFIX); - - storage_common_merge( - storage, furi_string_get_cstr(path_src), furi_string_get_cstr(path_dst)); - storage_simply_remove_recursive(storage, furi_string_get_cstr(path_src)); - } - } - - dir_walk_free(dir_walk); - furi_string_free(path_dst); - furi_string_free(path_src); - - furi_record_close(RECORD_STORAGE); - - return false; -} - -static bool storage_move_to_sd_check(void) { - Storage* storage = furi_record_open(RECORD_STORAGE); - - bool should_migrate = false; - - DirWalk* dir_walk = dir_walk_alloc(storage); - dir_walk_set_recursive(dir_walk, false); - dir_walk_set_filter_cb(dir_walk, storage_move_to_sd_check_entry, NULL); - - FuriString* name; - name = furi_string_alloc(); - - if(dir_walk_open(dir_walk, STORAGE_INT_PATH_PREFIX)) { - // if at least 1 entry is present, we should migrate - should_migrate = (dir_walk_read(dir_walk, name, NULL) == DirWalkOK); - } - - dir_walk_free(dir_walk); - furi_string_free(name); - - furi_record_close(RECORD_STORAGE); - - return should_migrate; -} - -static bool storage_move_to_sd_custom_event_callback(void* context, uint32_t event) { - furi_assert(context); - StorageMoveToSd* app = context; - return scene_manager_handle_custom_event(app->scene_manager, event); -} - -static bool storage_move_to_sd_back_event_callback(void* context) { - furi_assert(context); - StorageMoveToSd* app = context; - return scene_manager_handle_back_event(app->scene_manager); -} - -static void storage_move_to_sd_unmount_callback(const void* message, void* context) { - StorageMoveToSd* app = context; - furi_assert(app); - const StorageEvent* storage_event = message; - - if((storage_event->type == StorageEventTypeCardUnmount) || - (storage_event->type == StorageEventTypeCardMountError)) { - view_dispatcher_send_custom_event(app->view_dispatcher, MoveToSdCustomEventExit); - } -} - -static StorageMoveToSd* storage_move_to_sd_alloc(void) { - StorageMoveToSd* app = malloc(sizeof(StorageMoveToSd)); - - app->gui = furi_record_open(RECORD_GUI); - app->notifications = furi_record_open(RECORD_NOTIFICATION); - - app->view_dispatcher = view_dispatcher_alloc(); - app->scene_manager = scene_manager_alloc(&storage_move_to_sd_scene_handlers, app); - - view_dispatcher_enable_queue(app->view_dispatcher); - view_dispatcher_set_event_callback_context(app->view_dispatcher, app); - - view_dispatcher_set_custom_event_callback( - app->view_dispatcher, storage_move_to_sd_custom_event_callback); - view_dispatcher_set_navigation_event_callback( - app->view_dispatcher, storage_move_to_sd_back_event_callback); - - view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); - - app->widget = widget_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, StorageMoveToSdViewWidget, widget_get_view(app->widget)); - - scene_manager_next_scene(app->scene_manager, StorageMoveToSdConfirm); - - Storage* storage = furi_record_open(RECORD_STORAGE); - app->sub = furi_pubsub_subscribe( - storage_get_pubsub(storage), storage_move_to_sd_unmount_callback, app); - furi_record_close(RECORD_STORAGE); - - return app; -} - -static void storage_move_to_sd_free(StorageMoveToSd* app) { - Storage* storage = furi_record_open(RECORD_STORAGE); - furi_pubsub_unsubscribe(storage_get_pubsub(storage), app->sub); - furi_record_close(RECORD_STORAGE); - furi_record_close(RECORD_NOTIFICATION); - - view_dispatcher_remove_view(app->view_dispatcher, StorageMoveToSdViewWidget); - widget_free(app->widget); - view_dispatcher_free(app->view_dispatcher); - scene_manager_free(app->scene_manager); - - furi_record_close(RECORD_GUI); - - free(app); -} - -int32_t storage_move_to_sd_app(void* p) { - UNUSED(p); - - if(storage_move_to_sd_check()) { - StorageMoveToSd* app = storage_move_to_sd_alloc(); - notification_message(app->notifications, &sequence_display_backlight_on); - view_dispatcher_run(app->view_dispatcher); - storage_move_to_sd_free(app); - } else { - FURI_LOG_I(TAG, "Nothing to move"); - } - - // Remove unused region file from int memory - storage_move_to_sd_remove_region(); - - return 0; -} - -static void storage_move_to_sd_mount_callback(const void* message, void* context) { - UNUSED(context); - - const StorageEvent* storage_event = message; - - if(storage_event->type == StorageEventTypeCardMount) { - Loader* loader = furi_record_open(RECORD_LOADER); - loader_start(loader, "StorageMoveToSd", NULL, NULL); - furi_record_close(RECORD_LOADER); - } -} - -int32_t storage_move_to_sd_start(void* p) { - UNUSED(p); - Storage* storage = furi_record_open(RECORD_STORAGE); - - furi_pubsub_subscribe(storage_get_pubsub(storage), storage_move_to_sd_mount_callback, NULL); - - furi_record_close(RECORD_STORAGE); - return 0; -} diff --git a/applications/system/storage_move_to_sd/storage_move_to_sd.h b/applications/system/storage_move_to_sd/storage_move_to_sd.h deleted file mode 100644 index 135f3e9b0b..0000000000 --- a/applications/system/storage_move_to_sd/storage_move_to_sd.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "scenes/storage_move_to_sd_scene.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - MoveToSdCustomEventExit, - MoveToSdCustomEventConfirm, -} MoveToSdCustomEvent; - -typedef struct { - // records - Gui* gui; - Widget* widget; - NotificationApp* notifications; - - // view management - SceneManager* scene_manager; - ViewDispatcher* view_dispatcher; - - FuriPubSubSubscription* sub; - -} StorageMoveToSd; - -typedef enum { - StorageMoveToSdViewWidget, -} StorageMoveToSdView; - -bool storage_move_to_sd_perform(void); - -#ifdef __cplusplus -} -#endif diff --git a/applications/system/updater/util/update_task.c b/applications/system/updater/util/update_task.c index 0eae0eaf52..8f051ff77a 100644 --- a/applications/system/updater/util/update_task.c +++ b/applications/system/updater/util/update_task.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #define TAG "UpdWorker" diff --git a/applications/system/updater/util/update_task_worker_flasher.c b/applications/system/updater/util/update_task_worker_flasher.c index 848cc54942..e7e1bbbedc 100644 --- a/applications/system/updater/util/update_task_worker_flasher.c +++ b/applications/system/updater/util/update_task_worker_flasher.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include diff --git a/documentation/Doxyfile b/documentation/Doxyfile index 5b93cf8b18..f980c42f01 100644 --- a/documentation/Doxyfile +++ b/documentation/Doxyfile @@ -1021,7 +1021,6 @@ RECURSIVE = YES EXCLUDE = $(DOXY_SRC_ROOT)/lib/mlib \ $(DOXY_SRC_ROOT)/lib/STM32CubeWB \ - $(DOXY_SRC_ROOT)/lib/littlefs \ $(DOXY_SRC_ROOT)/lib/nanopb \ $(DOXY_SRC_ROOT)/assets/protobuf \ $(DOXY_SRC_ROOT)/lib/libusb_stm32 \ diff --git a/furi/core/event_loop.c b/furi/core/event_loop.c index 26401c84b2..feed8d6f44 100644 --- a/furi/core/event_loop.c +++ b/furi/core/event_loop.c @@ -107,10 +107,13 @@ void furi_event_loop_run(FuriEventLoop* instance) { furi_check(instance); furi_check(instance->thread_id == furi_thread_get_current_id()); - furi_event_loop_init_tick(instance); + // Set the default signal callback if none was previously set + if(furi_thread_get_signal_callback(instance->thread_id) == NULL) { + furi_thread_set_signal_callback( + instance->thread_id, furi_event_loop_signal_callback, instance); + } - furi_thread_set_signal_callback( - instance->thread_id, furi_event_loop_signal_callback, instance); + furi_event_loop_init_tick(instance); while(true) { instance->state = FuriEventLoopStateIdle; @@ -177,7 +180,10 @@ void furi_event_loop_run(FuriEventLoop* instance) { } } - furi_thread_set_signal_callback(instance->thread_id, NULL, NULL); + // Disable the default signal callback + if(furi_thread_get_signal_callback(instance->thread_id) == furi_event_loop_signal_callback) { + furi_thread_set_signal_callback(instance->thread_id, NULL, NULL); + } } void furi_event_loop_stop(FuriEventLoop* instance) { diff --git a/furi/core/thread.c b/furi/core/thread.c index c47df55e49..69c6b0f04e 100644 --- a/furi/core/thread.c +++ b/furi/core/thread.c @@ -318,6 +318,12 @@ void furi_thread_set_signal_callback( thread->signal_context = context; } +FuriThreadSignalCallback furi_thread_get_signal_callback(const FuriThread* thread) { + furi_check(thread); + + return thread->signal_callback; +} + bool furi_thread_signal(const FuriThread* thread, uint32_t signal, void* arg) { furi_check(thread); diff --git a/furi/core/thread.h b/furi/core/thread.h index be09e040ea..e8cdeaeafb 100644 --- a/furi/core/thread.h +++ b/furi/core/thread.h @@ -270,7 +270,7 @@ FuriThreadState furi_thread_get_state(FuriThread* thread); /** * @brief Set a signal handler callback for a FuriThread instance. * - * The thread MUST be stopped when calling this function. + * The thread MUST be stopped when calling this function if calling it from another thread. * * @param[in,out] thread pointer to the FuriThread instance to be modified * @param[in] callback pointer to a user-specified callback function @@ -281,6 +281,14 @@ void furi_thread_set_signal_callback( FuriThreadSignalCallback callback, void* context); +/** + * @brief Get a signal callback for a FuriThread instance. + * + * @param[in] thread pointer to the FuriThread instance to be queried + * @return pointer to the callback function or NULL if none has been set + */ +FuriThreadSignalCallback furi_thread_get_signal_callback(const FuriThread* thread); + /** * @brief Send a signal to a FuriThread instance. * diff --git a/lib/ReadMe.md b/lib/ReadMe.md index 64da39e358..4656f187b6 100644 --- a/lib/ReadMe.md +++ b/lib/ReadMe.md @@ -18,7 +18,6 @@ - `infrared` - Infrared library, used by Infrared application - `lfrfid` - LF-RFID library, used by LF RFID application - `libusb_stm32` - LibUSB for STM32 series MCU -- `littlefs` - LittleFS file system driver, used by internal storage - `mbedtls` - MbedTLS cryptography library - `microtar` - MicroTAR library - `mjs` - MJs, javascript engine library diff --git a/lib/SConscript b/lib/SConscript index f331198a42..7f13aad445 100644 --- a/lib/SConscript +++ b/lib/SConscript @@ -27,7 +27,6 @@ libs = env.BuildModules( "one_wire", "ibutton", "infrared", - "littlefs", "subghz", "nfc", "digital_signal", diff --git a/lib/ble_profile/extra_profiles/hid_profile.c b/lib/ble_profile/extra_profiles/hid_profile.c index 85fb101b8c..f559a741a6 100644 --- a/lib/ble_profile/extra_profiles/hid_profile.c +++ b/lib/ble_profile/extra_profiles/hid_profile.c @@ -373,6 +373,12 @@ bool ble_profile_hid_mouse_scroll(FuriHalBleProfileBase* profile, int8_t delta) return state; } +// AN5289: 4.7, in order to use flash controller interval must be at least 25ms + advertisement, which is 30 ms +// Since we don't use flash controller anymore interval can be lowered to 7.5ms +#define CONNECTION_INTERVAL_MIN (0x0006) +// Up to 45 ms +#define CONNECTION_INTERVAL_MAX (0x24) + static GapConfig template_config = { .adv_service_uuid = HUMAN_INTERFACE_DEVICE_SERVICE_UUID, .appearance_char = GAP_APPEARANCE_KEYBOARD, @@ -380,8 +386,8 @@ static GapConfig template_config = { .pairing_method = GapPairingPinCodeVerifyYesNo, .conn_param = { - .conn_int_min = 0x18, // AN5289: 4.7, we need at least 25ms + advertisement, which is 30 ms - .conn_int_max = 0x24, // 45 ms + .conn_int_min = CONNECTION_INTERVAL_MIN, + .conn_int_max = CONNECTION_INTERVAL_MAX, .slave_latency = 0, .supervisor_timeout = 0, }, diff --git a/lib/lfs_config.h b/lib/lfs_config.h deleted file mode 100644 index ff8bc4b235..0000000000 --- a/lib/lfs_config.h +++ /dev/null @@ -1,204 +0,0 @@ -#pragma once - -#include - -#ifdef FURI_NDEBUG -#define LFS_NO_ASSERT -#define LFS_ASSERT(x) -#else -#define LFS_ASSERT furi_assert -#endif - -#define LFS_TAG "Lfs" - -#ifdef FURI_LFS_DEBUG -#define LFS_TRACE(...) FURI_LOG_T(LFS_TAG, __VA_ARGS__); - -#define LFS_DEBUG(...) FURI_LOG_D(LFS_TAG, __VA_ARGS__); -#else -#define LFS_TRACE(...) - -#define LFS_DEBUG(...) -#endif // FURI_LFS_DEBUG - -#define LFS_WARN(...) FURI_LOG_W(LFS_TAG, __VA_ARGS__); - -#define LFS_ERROR(...) FURI_LOG_E(LFS_TAG, __VA_ARGS__); - -// Because crc -#undef LFS_CONFIG - -// System includes -#include -#include -#include -#include - -#ifndef LFS_NO_MALLOC -#include -#endif -#ifndef LFS_NO_ASSERT -#include -#endif -#if !defined(LFS_NO_DEBUG) || !defined(LFS_NO_WARN) || !defined(LFS_NO_ERROR) || \ - defined(LFS_YES_TRACE) -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// Builtin functions, these may be replaced by more efficient -// toolchain-specific implementations. LFS_NO_INTRINSICS falls back to a more -// expensive basic C implementation for debugging purposes - -// Min/max functions for unsigned 32-bit numbers -static inline uint32_t lfs_max(uint32_t a, uint32_t b) { - return (a > b) ? a : b; -} - -static inline uint32_t lfs_min(uint32_t a, uint32_t b) { - return (a < b) ? a : b; -} - -// Align to nearest multiple of a size -static inline uint32_t lfs_aligndown(uint32_t a, uint32_t alignment) { - return a - (a % alignment); -} - -static inline uint32_t lfs_alignup(uint32_t a, uint32_t alignment) { - return lfs_aligndown(a + alignment - 1, alignment); -} - -// Find the smallest power of 2 greater than or equal to a -static inline uint32_t lfs_npw2(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) - return 32 - __builtin_clz(a - 1); -#else - uint32_t r = 0; - uint32_t s; - a -= 1; - s = (a > 0xffff) << 4; - a >>= s; - r |= s; - s = (a > 0xff) << 3; - a >>= s; - r |= s; - s = (a > 0xf) << 2; - a >>= s; - r |= s; - s = (a > 0x3) << 1; - a >>= s; - r |= s; - return (r | (a >> 1)) + 1; -#endif -} - -// Count the number of trailing binary zeros in a -// lfs_ctz(0) may be undefined -static inline uint32_t lfs_ctz(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && defined(__GNUC__) - return __builtin_ctz(a); -#else - return lfs_npw2((a & -a) + 1) - 1; -#endif -} - -// Count the number of binary ones in a -static inline uint32_t lfs_popc(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) - return __builtin_popcount(a); -#else - a = a - ((a >> 1) & 0x55555555); - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); - return (((a + (a >> 4)) & 0xf0f0f0f) * 0x1010101) >> 24; -#endif -} - -// Find the sequence comparison of a and b, this is the distance -// between a and b ignoring overflow -static inline int lfs_scmp(uint32_t a, uint32_t b) { - return (int)(unsigned)(a - b); -} - -// Convert between 32-bit little-endian and native order -static inline uint32_t lfs_fromle32(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && \ - ((defined(BYTE_ORDER) && defined(ORDER_LITTLE_ENDIAN) && \ - BYTE_ORDER == ORDER_LITTLE_ENDIAN) || \ - (defined(__BYTE_ORDER) && defined(__ORDER_LITTLE_ENDIAN) && \ - __BYTE_ORDER == __ORDER_LITTLE_ENDIAN) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) - return a; -#elif !defined(LFS_NO_INTRINSICS) && \ - ((defined(BYTE_ORDER) && defined(ORDER_BIG_ENDIAN) && BYTE_ORDER == ORDER_BIG_ENDIAN) || \ - (defined(__BYTE_ORDER) && defined(__ORDER_BIG_ENDIAN) && \ - __BYTE_ORDER == __ORDER_BIG_ENDIAN) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) - return __builtin_bswap32(a); -#else - return (((uint8_t*)&a)[0] << 0) | (((uint8_t*)&a)[1] << 8) | (((uint8_t*)&a)[2] << 16) | - (((uint8_t*)&a)[3] << 24); -#endif -} - -static inline uint32_t lfs_tole32(uint32_t a) { - return lfs_fromle32(a); -} - -// Convert between 32-bit big-endian and native order -static inline uint32_t lfs_frombe32(uint32_t a) { -#if !defined(LFS_NO_INTRINSICS) && \ - ((defined(BYTE_ORDER) && defined(ORDER_LITTLE_ENDIAN) && \ - BYTE_ORDER == ORDER_LITTLE_ENDIAN) || \ - (defined(__BYTE_ORDER) && defined(__ORDER_LITTLE_ENDIAN) && \ - __BYTE_ORDER == __ORDER_LITTLE_ENDIAN) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) - return __builtin_bswap32(a); -#elif !defined(LFS_NO_INTRINSICS) && \ - ((defined(BYTE_ORDER) && defined(ORDER_BIG_ENDIAN) && BYTE_ORDER == ORDER_BIG_ENDIAN) || \ - (defined(__BYTE_ORDER) && defined(__ORDER_BIG_ENDIAN) && \ - __BYTE_ORDER == __ORDER_BIG_ENDIAN) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) - return a; -#else - return (((uint8_t*)&a)[0] << 24) | (((uint8_t*)&a)[1] << 16) | (((uint8_t*)&a)[2] << 8) | - (((uint8_t*)&a)[3] << 0); -#endif -} - -static inline uint32_t lfs_tobe32(uint32_t a) { - return lfs_frombe32(a); -} - -// Calculate CRC-32 with polynomial = 0x04c11db7 -uint32_t lfs_crc(uint32_t crc, const void* buffer, size_t size); - -// Allocate memory, only used if buffers are not provided to littlefs -// Note, memory must be 64-bit aligned -static inline void* lfs_malloc(size_t size) { -#ifndef LFS_NO_MALLOC - return malloc(size); -#else - (void)size; - return NULL; -#endif -} - -// Deallocate memory, only used if buffers are not provided to littlefs -static inline void lfs_free(void* p) { -#ifndef LFS_NO_MALLOC - free(p); -#else - (void)p; -#endif -} - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/lib/littlefs b/lib/littlefs deleted file mode 160000 index 611c9b20db..0000000000 --- a/lib/littlefs +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 611c9b20db2b99faee261daa7cc9bbe175d3eaca diff --git a/lib/littlefs.scons b/lib/littlefs.scons deleted file mode 100644 index 3d68e07bae..0000000000 --- a/lib/littlefs.scons +++ /dev/null @@ -1,22 +0,0 @@ -Import("env") - -env.Append( - CPPPATH=[ - "#/lib/littlefs", - ], -) - - -libenv = env.Clone(FW_LIB_NAME="littlefs") -libenv.ApplyLibFlags() -libenv.Append( - CPPDEFINES=[ - ("LFS_CONFIG", "lfs_config.h"), - ], -) - -sources = Glob("littlefs/*.c", source=True) - -lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources) -libenv.Install("${LIB_DIST_DIR}", lib) -Return("lib") diff --git a/lib/subghz/devices/registry.c b/lib/subghz/devices/registry.c index cf044c98a3..9722c15017 100644 --- a/lib/subghz/devices/registry.c +++ b/lib/subghz/devices/registry.c @@ -23,8 +23,8 @@ void subghz_device_registry_init(void) { firmware_api_interface); //TODO FL-3556: fix path to plugins - //if(plugin_manager_load_all(subghz_device->manager, APP_DATA_PATH("plugins")) != - if(plugin_manager_load_all(subghz_device->manager, "/ext/apps_data/subghz/plugins") != + if(plugin_manager_load_all(subghz_device->manager, EXT_PATH("apps_data/subghz/plugins")) != + //if(plugin_manager_load_all(subghz_device->manager, APP_DATA_PATH("plugins")) != PluginManagerErrorNone) { FURI_LOG_E(TAG, "Failed to load all libs"); } diff --git a/lib/toolbox/crc32_calc.c b/lib/toolbox/crc32_calc.c index 78295167f3..60d709a364 100644 --- a/lib/toolbox/crc32_calc.c +++ b/lib/toolbox/crc32_calc.c @@ -1,11 +1,37 @@ #include "crc32_calc.h" -#include #define CRC_DATA_BUFFER_MAX_LEN 512 uint32_t crc32_calc_buffer(uint32_t crc, const void* buffer, size_t size) { - // TODO FL-3547: consider removing dependency on LFS - return ~lfs_crc(~crc, buffer, size); + crc = ~crc; + + static const uint32_t rtable[16] = { + 0x00000000, + 0x1db71064, + 0x3b6e20c8, + 0x26d930ac, + 0x76dc4190, + 0x6b6b51f4, + 0x4db26158, + 0x5005713c, + 0xedb88320, + 0xf00f9344, + 0xd6d6a3e8, + 0xcb61b38c, + 0x9b64c2b0, + 0x86d3d2d4, + 0xa00ae278, + 0xbdbdf21c, + }; + + const uint8_t* data = buffer; + + for(size_t i = 0; i < size; i++) { + crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 0)) & 0xf]; + crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 4)) & 0xf]; + } + + return ~crc; } uint32_t crc32_calc_file(File* file, const FileCrcProgressCb progress_cb, void* context) { diff --git a/lib/toolbox/stream/file_stream.c b/lib/toolbox/stream/file_stream.c index 80cbb7d5f7..a0dfda3ebe 100644 --- a/lib/toolbox/stream/file_stream.c +++ b/lib/toolbox/stream/file_stream.c @@ -159,8 +159,8 @@ static bool file_stream_delete_and_insert( FuriString* tmp_name; tmp_name = furi_string_alloc(); storage_get_next_filename( - _stream->storage, STORAGE_ANY_PATH_PREFIX, ".scratch", ".pad", tmp_name, 255); - scratch_name = furi_string_alloc_printf(ANY_PATH("%s.pad"), furi_string_get_cstr(tmp_name)); + _stream->storage, STORAGE_EXT_PATH_PREFIX, ".scratch", ".pad", tmp_name, 255); + scratch_name = furi_string_alloc_printf(EXT_PATH("%s.pad"), furi_string_get_cstr(tmp_name)); furi_string_free(tmp_name); do { diff --git a/lib/toolbox/tar/tar_archive.c b/lib/toolbox/tar/tar_archive.c index 80144a0f4f..db1d5177f3 100644 --- a/lib/toolbox/tar/tar_archive.c +++ b/lib/toolbox/tar/tar_archive.c @@ -289,7 +289,7 @@ bool tar_archive_file_finalize(TarArchive* archive) { typedef struct { TarArchive* archive; const char* work_dir; - Storage_name_converter converter; + TarArchiveNameConverter converter; } TarArchiveDirectoryOpParams; static bool archive_extract_current_file(TarArchive* archive, const char* dst_path) { @@ -386,7 +386,7 @@ static int archive_extract_foreach_cb(mtar_t* tar, const mtar_header_t* header, bool tar_archive_unpack_to( TarArchive* archive, const char* destination, - Storage_name_converter converter) { + TarArchiveNameConverter converter) { furi_check(archive); TarArchiveDirectoryOpParams param = { .archive = archive, diff --git a/lib/toolbox/tar/tar_archive.h b/lib/toolbox/tar/tar_archive.h index 3eb97391e8..fd0b28b87f 100644 --- a/lib/toolbox/tar/tar_archive.h +++ b/lib/toolbox/tar/tar_archive.h @@ -54,6 +54,8 @@ bool tar_archive_open(TarArchive* archive, const char* path, TarOpenMode mode); */ void tar_archive_free(TarArchive* archive); +typedef void (*TarArchiveNameConverter)(FuriString*); + /* High-level API - assumes archive is open */ /** Unpack tar archive to destination @@ -67,7 +69,7 @@ void tar_archive_free(TarArchive* archive); bool tar_archive_unpack_to( TarArchive* archive, const char* destination, - Storage_name_converter converter); + TarArchiveNameConverter converter); /** Add file to tar archive * diff --git a/scripts/testops.py b/scripts/testops.py index bf02feaad3..4ae10c7f4a 100644 --- a/scripts/testops.py +++ b/scripts/testops.py @@ -39,7 +39,9 @@ def _get_flipper(self, retry_count: Optional[int] = 1): if port := resolve_port(self.logger, self.args.port): self.logger.info(f"Found flipper at {port}") + time.sleep(1) break + time.sleep(1) if not port: diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index d2a145de5a..9e58a67464 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,70.0,, +Version,+,71.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/cli/cli.h,, @@ -687,6 +687,7 @@ Function,+,bt_forget_bonded_devices,void,Bt* Function,+,bt_keys_storage_alloc,BtKeysStorage*,const char* Function,+,bt_keys_storage_delete,_Bool,BtKeysStorage* Function,+,bt_keys_storage_free,void,BtKeysStorage* +Function,+,bt_keys_storage_is_changed,_Bool,BtKeysStorage* Function,+,bt_keys_storage_load,_Bool,BtKeysStorage* Function,+,bt_keys_storage_set_default_path,void,Bt* Function,+,bt_keys_storage_set_file_path,void,"BtKeysStorage*, const char*" @@ -1372,6 +1373,7 @@ Function,+,furi_hal_rtc_get_log_baud_rate,FuriHalRtcLogBaudRate, Function,+,furi_hal_rtc_get_log_device,FuriHalRtcLogDevice, Function,+,furi_hal_rtc_get_log_level,uint8_t, Function,+,furi_hal_rtc_get_pin_fails,uint32_t, +Function,-,furi_hal_rtc_get_pin_value,uint32_t, Function,+,furi_hal_rtc_get_register,uint32_t,FuriHalRtcRegister Function,+,furi_hal_rtc_get_timestamp,uint32_t, Function,-,furi_hal_rtc_init,void, @@ -1391,6 +1393,7 @@ Function,+,furi_hal_rtc_set_log_baud_rate,void,FuriHalRtcLogBaudRate Function,+,furi_hal_rtc_set_log_device,void,FuriHalRtcLogDevice Function,+,furi_hal_rtc_set_log_level,void,uint8_t Function,+,furi_hal_rtc_set_pin_fails,void,uint32_t +Function,-,furi_hal_rtc_set_pin_value,void,uint32_t Function,+,furi_hal_rtc_set_register,void,"FuriHalRtcRegister, uint32_t" Function,+,furi_hal_rtc_sync_shadow,void, Function,+,furi_hal_sd_get_card_state,FuriStatus, @@ -1626,6 +1629,7 @@ Function,+,furi_thread_get_id,FuriThreadId,FuriThread* Function,+,furi_thread_get_name,const char*,FuriThreadId Function,+,furi_thread_get_priority,FuriThreadPriority,FuriThread* Function,+,furi_thread_get_return_code,int32_t,FuriThread* +Function,+,furi_thread_get_signal_callback,FuriThreadSignalCallback,const FuriThread* Function,+,furi_thread_get_stack_space,uint32_t,FuriThreadId Function,+,furi_thread_get_state,FuriThreadState,FuriThread* Function,+,furi_thread_get_stdout_callback,FuriThreadStdoutWriteCallback, @@ -2509,7 +2513,7 @@ Function,+,storage_file_write,size_t,"File*, const void*, size_t" Function,+,storage_get_next_filename,void,"Storage*, const char*, const char*, const char*, FuriString*, uint8_t" Function,+,storage_get_pubsub,FuriPubSub*,Storage* Function,+,storage_int_backup,FS_Error,"Storage*, const char*" -Function,+,storage_int_restore,FS_Error,"Storage*, const char*, Storage_name_converter" +Function,+,storage_int_restore,FS_Error,"Storage*, const char*, StorageNameConverter" Function,+,storage_sd_format,FS_Error,Storage* Function,+,storage_sd_info,FS_Error,"Storage*, SDInfo*" Function,+,storage_sd_mount,FS_Error,Storage* @@ -2641,7 +2645,7 @@ Function,+,tar_archive_open,_Bool,"TarArchive*, const char*, TarOpenMode" Function,+,tar_archive_set_file_callback,void,"TarArchive*, tar_unpack_file_cb, void*" Function,+,tar_archive_store_data,_Bool,"TarArchive*, const char*, const uint8_t*, const int32_t" Function,+,tar_archive_unpack_file,_Bool,"TarArchive*, const char*, const char*" -Function,+,tar_archive_unpack_to,_Bool,"TarArchive*, const char*, Storage_name_converter" +Function,+,tar_archive_unpack_to,_Bool,"TarArchive*, const char*, TarArchiveNameConverter" Function,-,tempnam,char*,"const char*, const char*" Function,+,text_box_alloc,TextBox*, Function,+,text_box_free,void,TextBox* diff --git a/targets/f18/target.json b/targets/f18/target.json index 229ec0a7ad..9c450aa83e 100644 --- a/targets/f18/target.json +++ b/targets/f18/target.json @@ -17,7 +17,6 @@ "stm32wb", "hwdrivers", "fatfs", - "littlefs", "toolbox", "digital_signal", "signal_reader", diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index a34c3db0cb..3c6a9e4db0 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,70.0,, +Version,+,71.0,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, @@ -768,6 +768,7 @@ Function,+,bt_forget_bonded_devices,void,Bt* Function,+,bt_keys_storage_alloc,BtKeysStorage*,const char* Function,+,bt_keys_storage_delete,_Bool,BtKeysStorage* Function,+,bt_keys_storage_free,void,BtKeysStorage* +Function,+,bt_keys_storage_is_changed,_Bool,BtKeysStorage* Function,+,bt_keys_storage_load,_Bool,BtKeysStorage* Function,+,bt_keys_storage_set_default_path,void,Bt* Function,+,bt_keys_storage_set_file_path,void,"BtKeysStorage*, const char*" @@ -1589,6 +1590,7 @@ Function,+,furi_hal_rtc_get_log_baud_rate,FuriHalRtcLogBaudRate, Function,+,furi_hal_rtc_get_log_device,FuriHalRtcLogDevice, Function,+,furi_hal_rtc_get_log_level,uint8_t, Function,+,furi_hal_rtc_get_pin_fails,uint32_t, +Function,-,furi_hal_rtc_get_pin_value,uint32_t, Function,+,furi_hal_rtc_get_register,uint32_t,FuriHalRtcRegister Function,+,furi_hal_rtc_get_timestamp,uint32_t, Function,-,furi_hal_rtc_init,void, @@ -1608,6 +1610,7 @@ Function,+,furi_hal_rtc_set_log_baud_rate,void,FuriHalRtcLogBaudRate Function,+,furi_hal_rtc_set_log_device,void,FuriHalRtcLogDevice Function,+,furi_hal_rtc_set_log_level,void,uint8_t Function,+,furi_hal_rtc_set_pin_fails,void,uint32_t +Function,-,furi_hal_rtc_set_pin_value,void,uint32_t Function,+,furi_hal_rtc_set_register,void,"FuriHalRtcRegister, uint32_t" Function,+,furi_hal_rtc_sync_shadow,void, Function,+,furi_hal_sd_get_card_state,FuriStatus, @@ -1880,6 +1883,7 @@ Function,+,furi_thread_get_id,FuriThreadId,FuriThread* Function,+,furi_thread_get_name,const char*,FuriThreadId Function,+,furi_thread_get_priority,FuriThreadPriority,FuriThread* Function,+,furi_thread_get_return_code,int32_t,FuriThread* +Function,+,furi_thread_get_signal_callback,FuriThreadSignalCallback,const FuriThread* Function,+,furi_thread_get_stack_space,uint32_t,FuriThreadId Function,+,furi_thread_get_state,FuriThreadState,FuriThread* Function,+,furi_thread_get_stdout_callback,FuriThreadStdoutWriteCallback, @@ -3234,7 +3238,7 @@ Function,+,storage_file_write,size_t,"File*, const void*, size_t" Function,+,storage_get_next_filename,void,"Storage*, const char*, const char*, const char*, FuriString*, uint8_t" Function,+,storage_get_pubsub,FuriPubSub*,Storage* Function,+,storage_int_backup,FS_Error,"Storage*, const char*" -Function,+,storage_int_restore,FS_Error,"Storage*, const char*, Storage_name_converter" +Function,+,storage_int_restore,FS_Error,"Storage*, const char*, StorageNameConverter" Function,+,storage_sd_format,FS_Error,Storage* Function,+,storage_sd_info,FS_Error,"Storage*, SDInfo*" Function,+,storage_sd_mount,FS_Error,Storage* @@ -3550,7 +3554,7 @@ Function,+,tar_archive_open,_Bool,"TarArchive*, const char*, TarOpenMode" Function,+,tar_archive_set_file_callback,void,"TarArchive*, tar_unpack_file_cb, void*" Function,+,tar_archive_store_data,_Bool,"TarArchive*, const char*, const uint8_t*, const int32_t" Function,+,tar_archive_unpack_file,_Bool,"TarArchive*, const char*, const char*" -Function,+,tar_archive_unpack_to,_Bool,"TarArchive*, const char*, Storage_name_converter" +Function,+,tar_archive_unpack_to,_Bool,"TarArchive*, const char*, TarArchiveNameConverter" Function,-,tempnam,char*,"const char*, const char*" Function,+,text_box_alloc,TextBox*, Function,+,text_box_free,void,TextBox* diff --git a/targets/f7/ble_glue/extra_beacon.c b/targets/f7/ble_glue/extra_beacon.c index 0fd452a5a6..f9b9b13ef6 100644 --- a/targets/f7/ble_glue/extra_beacon.c +++ b/targets/f7/ble_glue/extra_beacon.c @@ -8,9 +8,9 @@ #define GAP_MS_TO_SCAN_INTERVAL(x) ((uint16_t)((x) / 0.625)) -// Also used as an indicator of whether the beacon had ever been configured -// AN5289: 4.7, we need at least 25ms + advertisement, which is 30 ms -#define GAP_MIN_ADV_INTERVAL_MS (30u) +// AN5289: 4.7, in order to use flash controller interval must be at least 25ms + advertisement, which is 30 ms +// Since we don't use flash controller anymore interval can be lowered to 20ms +#define GAP_MIN_ADV_INTERVAL_MS (20U) typedef struct { GapExtraBeaconConfig last_config; diff --git a/targets/f7/ble_glue/hw_ipcc.c b/targets/f7/ble_glue/hw_ipcc.c index 4daaa7e49d..43785a1b4b 100644 --- a/targets/f7/ble_glue/hw_ipcc.c +++ b/targets/f7/ble_glue/hw_ipcc.c @@ -15,6 +15,8 @@ (LL_C2_IPCC_IsActiveFlag_CHx(IPCC, channel) && \ LL_C1_IPCC_IsEnabledReceiveChannel(IPCC, channel)) +#define IPCC_SEND_CMD_TIMEOUT_US (33UL * 1000UL * 1000UL) + static void (*FreeBufCb)(void); static void HW_IPCC_BLE_EvtHandler(void); @@ -113,7 +115,7 @@ void HW_IPCC_SYS_Init(void) { void HW_IPCC_SYS_SendCmd(void) { LL_C1_IPCC_SetFlag_CHx(IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL); - FuriHalCortexTimer timer = furi_hal_cortex_timer_get(33000000); + FuriHalCortexTimer timer = furi_hal_cortex_timer_get(IPCC_SEND_CMD_TIMEOUT_US); while(LL_C1_IPCC_IsActiveFlag_CHx(IPCC, HW_IPCC_SYSTEM_CMD_RSP_CHANNEL)) { furi_check(!furi_hal_cortex_timer_is_expired(timer), "HW_IPCC_SYS_SendCmd timeout"); diff --git a/targets/f7/ble_glue/profiles/serial_profile.c b/targets/f7/ble_glue/profiles/serial_profile.c index 118a76e8c3..1d414889f8 100644 --- a/targets/f7/ble_glue/profiles/serial_profile.c +++ b/targets/f7/ble_glue/profiles/serial_profile.c @@ -40,14 +40,20 @@ static void ble_profile_serial_stop(FuriHalBleProfileBase* profile) { ble_svc_serial_stop(serial_profile->serial_svc); } +// AN5289: 4.7, in order to use flash controller interval must be at least 25ms + advertisement, which is 30 ms +// Since we don't use flash controller anymore interval can be lowered to 7.5ms +#define CONNECTION_INTERVAL_MIN (0x06) +// Up to 45 ms +#define CONNECTION_INTERVAL_MAX (0x24) + static GapConfig serial_template_config = { .adv_service_uuid = 0x3080, .appearance_char = 0x8600, .bonding_mode = true, .pairing_method = GapPairingPinCodeShow, .conn_param = { - .conn_int_min = 0x18, // AN5289: 4.7, we need at least 25ms + advertisement, which is 30 ms - .conn_int_max = 0x24, // 45 ms + .conn_int_min = CONNECTION_INTERVAL_MIN, + .conn_int_max = CONNECTION_INTERVAL_MAX, .slave_latency = 0, .supervisor_timeout = 0, }}; diff --git a/targets/f7/furi_hal/furi_hal_bt.c b/targets/f7/furi_hal/furi_hal_bt.c index 30a4ee7ede..05a066630d 100644 --- a/targets/f7/furi_hal/furi_hal_bt.c +++ b/targets/f7/furi_hal/furi_hal_bt.c @@ -87,10 +87,9 @@ static bool furi_hal_bt_radio_stack_is_supported(const BleGlueC2Info* info) { } bool furi_hal_bt_start_radio_stack(void) { - bool res = false; - furi_check(furi_hal_bt.core2_mtx); + furi_hal_bt_lock_core2(); - furi_mutex_acquire(furi_hal_bt.core2_mtx, FuriWaitForever); + bool res = false; // Explicitly tell that we are in charge of CLK48 domain furi_check(LL_HSEM_1StepLock(HSEM, CFG_HW_CLK48_CONFIG_SEMID) == 0); @@ -123,7 +122,8 @@ bool furi_hal_bt_start_radio_stack(void) { } res = true; } while(false); - furi_mutex_release(furi_hal_bt.core2_mtx); + + furi_hal_bt_unlock_core2(); gap_extra_beacon_init(); return res; @@ -198,6 +198,8 @@ FuriHalBleProfileBase* furi_hal_bt_start_app( } void furi_hal_bt_reinit(void) { + furi_hal_bt_lock_core2(); + furi_hal_power_insomnia_enter(); FURI_LOG_I(TAG, "Disconnect and stop advertising"); furi_hal_bt_stop_advertising(); @@ -229,6 +231,7 @@ void furi_hal_bt_reinit(void) { furi_hal_bus_disable(FuriHalBusCRC); furi_hal_bt_init(); + furi_hal_bt_unlock_core2(); furi_hal_bt_start_radio_stack(); furi_hal_power_insomnia_exit(); } diff --git a/targets/f7/furi_hal/furi_hal_crypto.c b/targets/f7/furi_hal/furi_hal_crypto.c index 1879eb2cae..4deda293a2 100644 --- a/targets/f7/furi_hal/furi_hal_crypto.c +++ b/targets/f7/furi_hal/furi_hal_crypto.c @@ -262,36 +262,54 @@ bool furi_hal_crypto_enclave_load_key(uint8_t slot, const uint8_t* iv) { furi_hal_bus_enable(FuriHalBusAES1); - if(!furi_hal_bt_is_alive()) { - return false; - } + bool success = false; - furi_hal_crypto_mode_init_done = false; - crypto_key_init(NULL, (uint32_t*)iv); + furi_hal_bt_lock_core2(); - if(SHCI_C2_FUS_LoadUsrKey(slot) == SHCI_Success) { - return true; - } else { - CLEAR_BIT(AES1->CR, AES_CR_EN); - furi_check(furi_mutex_release(furi_hal_crypto_mutex) == FuriStatusOk); - return false; - } + do { + if(!furi_hal_bt_is_alive()) { + break; + } + + furi_hal_crypto_mode_init_done = false; + crypto_key_init(NULL, (uint32_t*)iv); + + if(SHCI_C2_FUS_LoadUsrKey(slot) == SHCI_Success) { + success = true; + } else { + CLEAR_BIT(AES1->CR, AES_CR_EN); + furi_check(furi_mutex_release(furi_hal_crypto_mutex) == FuriStatusOk); + } + + } while(false); + + furi_hal_bt_unlock_core2(); + return success; } bool furi_hal_crypto_enclave_unload_key(uint8_t slot) { - if(!furi_hal_bt_is_alive()) { - return false; - } + furi_hal_bt_lock_core2(); - CLEAR_BIT(AES1->CR, AES_CR_EN); + bool success = false; + + do { + if(!furi_hal_bt_is_alive()) { + break; + } - SHCI_CmdStatus_t shci_state = SHCI_C2_FUS_UnloadUsrKey(slot); + CLEAR_BIT(AES1->CR, AES_CR_EN); - furi_hal_bus_disable(FuriHalBusAES1); + SHCI_CmdStatus_t shci_state = SHCI_C2_FUS_UnloadUsrKey(slot); - furi_check(furi_mutex_release(furi_hal_crypto_mutex) == FuriStatusOk); + furi_hal_bus_disable(FuriHalBusAES1); - return shci_state == SHCI_Success; + furi_check(furi_mutex_release(furi_hal_crypto_mutex) == FuriStatusOk); + + success = (shci_state == SHCI_Success); + } while(false); + + furi_hal_bt_unlock_core2(); + return success; } bool furi_hal_crypto_load_key(const uint8_t* key, const uint8_t* iv) { diff --git a/targets/f7/furi_hal/furi_hal_region.c b/targets/f7/furi_hal/furi_hal_region.c index c8af57a199..6e138b41bd 100644 --- a/targets/f7/furi_hal/furi_hal_region.c +++ b/targets/f7/furi_hal/furi_hal_region.c @@ -29,10 +29,9 @@ const FuriHalRegionBand* furi_hal_region_get_band(uint32_t frequency) { return NULL; } - for(size_t i = 0; i < furi_hal_region->bands_count; i++) { - if(furi_hal_region->bands[i].start <= frequency && - furi_hal_region->bands[i].end >= frequency) { - return &furi_hal_region->bands[i]; + for(size_t i = 0; i < region->bands_count; i++) { + if(region->bands[i].start <= frequency && region->bands[i].end >= frequency) { + return ®ion->bands[i]; } } diff --git a/targets/f7/furi_hal/furi_hal_rtc.c b/targets/f7/furi_hal/furi_hal_rtc.c index f5f7bdf2d2..d5cda74767 100644 --- a/targets/f7/furi_hal/furi_hal_rtc.c +++ b/targets/f7/furi_hal/furi_hal_rtc.c @@ -411,6 +411,14 @@ uint32_t furi_hal_rtc_get_pin_fails(void) { return furi_hal_rtc_get_register(FuriHalRtcRegisterPinFails); } +void furi_hal_rtc_set_pin_value(uint32_t value) { + furi_hal_rtc_set_register(FuriHalRtcRegisterPinValue, value); +} + +uint32_t furi_hal_rtc_get_pin_value(void) { + return furi_hal_rtc_get_register(FuriHalRtcRegisterPinValue); +} + uint32_t furi_hal_rtc_get_timestamp(void) { DateTime datetime = {0}; furi_hal_rtc_get_datetime(&datetime); diff --git a/targets/f7/furi_hal/furi_hal_rtc.h b/targets/f7/furi_hal/furi_hal_rtc.h index 3bdbb0c729..030b464cf7 100644 --- a/targets/f7/furi_hal/furi_hal_rtc.h +++ b/targets/f7/furi_hal/furi_hal_rtc.h @@ -46,9 +46,10 @@ typedef enum { FuriHalRtcRegisterVersion, /**< Pointer to Version */ FuriHalRtcRegisterLfsFingerprint, /**< LFS geometry fingerprint */ FuriHalRtcRegisterFaultData, /**< Pointer to last fault message */ - FuriHalRtcRegisterPinFails, /**< Failed pins count */ + FuriHalRtcRegisterPinFails, /**< Failed PINs count */ /* Index of FS directory entry corresponding to FW update to be applied */ FuriHalRtcRegisterUpdateFolderFSIndex, + FuriHalRtcRegisterPinValue, /**< Encoded value of the currently set PIN */ FuriHalRtcRegisterMAX, /**< Service value, do not use */ } FuriHalRtcRegister; @@ -257,18 +258,29 @@ void furi_hal_rtc_set_fault_data(uint32_t value); */ uint32_t furi_hal_rtc_get_fault_data(void); -/** Set Pin Fails count +/** Set PIN Fails count * - * @param[in] value The Pin Fails count + * @param[in] value The PIN Fails count */ void furi_hal_rtc_set_pin_fails(uint32_t value); -/** Get Pin Fails count +/** Get PIN Fails count * - * @return Pin Fails Count + * @return PIN Fails Count */ uint32_t furi_hal_rtc_get_pin_fails(void); +/** Set encoded PIN value + * + * @param[in] value new PIN code value to be set + */ +void furi_hal_rtc_set_pin_value(uint32_t value); + +/** Get the current PIN encoded value + * + */ +uint32_t furi_hal_rtc_get_pin_value(void); + /** Get UNIX Timestamp * * @return Unix Timestamp in seconds from UNIX epoch start diff --git a/targets/f7/target.json b/targets/f7/target.json index 665864d7d9..35f1766c19 100644 --- a/targets/f7/target.json +++ b/targets/f7/target.json @@ -25,7 +25,6 @@ "stm32wb", "hwdrivers", "fatfs", - "littlefs", "subghz", "toolbox", "nfc", diff --git a/targets/furi_hal_include/furi_hal_region.h b/targets/furi_hal_include/furi_hal_region.h index b6a6d425e6..f370596494 100644 --- a/targets/furi_hal_include/furi_hal_region.h +++ b/targets/furi_hal_include/furi_hal_region.h @@ -2,7 +2,6 @@ #include #include -#include #ifdef __cplusplus extern "C" { From 1e5dd001fe6a4445eaab13d0d85e0855fa087051 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 10 Aug 2024 14:22:33 +0300 Subject: [PATCH 41/52] after merge fixes --- .../main/archive/helpers/archive_browser.h | 16 +- applications/main/subghz/subghz_cli.c | 2 +- .../services/desktop/desktop_settings.c | 24 +-- .../services/desktop/desktop_settings.h | 36 +---- .../desktop/scenes/desktop_scene_main.c | 8 +- applications/services/expansion/expansion.c | 75 +-------- applications/services/expansion/expansion.h | 9 -- applications/services/expansion/expansion_i.h | 6 - .../services/expansion/expansion_settings.c | 1 - .../services/expansion/expansion_worker.c | 3 +- .../services/expansion/expansion_worker.h | 8 +- .../services/power/power_service/power.c | 10 +- applications/services/region/application.fam | 10 -- applications/services/region/region.c | 147 ------------------ .../desktop_settings/desktop_settings_app.h | 2 + .../scenes/desktop_settings_scene_favorite.c | 1 - .../scenes/desktop_settings_scene_start.c | 10 +- .../expansion_settings_app.c | 8 +- .../expansion_settings_app.h | 3 +- lib/subghz/devices/registry.c | 3 +- targets/f7/api_symbols.csv | 5 +- targets/f7/furi_hal/furi_hal_region.c | 7 +- 22 files changed, 61 insertions(+), 333 deletions(-) delete mode 100644 applications/services/expansion/expansion_i.h delete mode 100644 applications/services/region/application.fam delete mode 100644 applications/services/region/region.c diff --git a/applications/main/archive/helpers/archive_browser.h b/applications/main/archive/helpers/archive_browser.h index 1e1cdc8818..bdfeba035c 100644 --- a/applications/main/archive/helpers/archive_browser.h +++ b/applications/main/archive/helpers/archive_browser.h @@ -9,17 +9,17 @@ static const char* tab_default_paths[] = { [ArchiveTabFavorites] = "/app:favorites", - [ArchiveTabIButton] = ANY_PATH("ibutton"), - [ArchiveTabNFC] = ANY_PATH("nfc"), - [ArchiveTabSubGhz] = ANY_PATH("subghz"), + [ArchiveTabIButton] = EXT_PATH("ibutton"), + [ArchiveTabNFC] = EXT_PATH("nfc"), + [ArchiveTabSubGhz] = EXT_PATH("subghz"), [ArchiveTabSubGhzRemote] = EXT_PATH("subghz_remote"), - [ArchiveTabLFRFID] = ANY_PATH("lfrfid"), - [ArchiveTabInfrared] = ANY_PATH("infrared"), - [ArchiveTabBadUsb] = ANY_PATH("badusb"), + [ArchiveTabLFRFID] = EXT_PATH("lfrfid"), + [ArchiveTabInfrared] = EXT_PATH("infrared"), + [ArchiveTabBadUsb] = EXT_PATH("badusb"), [ArchiveTabU2f] = "/app:u2f", - [ArchiveTabApplications] = ANY_PATH("apps"), + [ArchiveTabApplications] = EXT_PATH("apps"), [ArchiveTabInternal] = STORAGE_INT_PATH_PREFIX, - [ArchiveTabBrowser] = STORAGE_ANY_PATH_PREFIX, + [ArchiveTabBrowser] = STORAGE_EXT_PATH_PREFIX, }; static const char* known_ext[] = { diff --git a/applications/main/subghz/subghz_cli.c b/applications/main/subghz/subghz_cli.c index e8601dc5d9..43ba9c6440 100644 --- a/applications/main/subghz/subghz_cli.c +++ b/applications/main/subghz/subghz_cli.c @@ -478,7 +478,7 @@ void subghz_cli_command_rx_raw(Cli* cli, FuriString* args, void* context) { void subghz_cli_command_decode_raw(Cli* cli, FuriString* args, void* context) { UNUSED(context); FuriString* file_name = furi_string_alloc(); - furi_string_set(file_name, ANY_PATH("subghz/test.sub")); + furi_string_set(file_name, EXT_PATH("subghz/test.sub")); Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* fff_data_file = flipper_format_file_alloc(storage); diff --git a/applications/services/desktop/desktop_settings.c b/applications/services/desktop/desktop_settings.c index f66fdeda71..828ec5f0d6 100644 --- a/applications/services/desktop/desktop_settings.c +++ b/applications/services/desktop/desktop_settings.c @@ -6,8 +6,8 @@ #define TAG "DesktopSettings" -#define DESKTOP_SETTINGS_VER_10 (10) -#define DESKTOP_SETTINGS_VER (11) +#define DESKTOP_SETTINGS_VER_13 (13) +#define DESKTOP_SETTINGS_VER (14) #define DESKTOP_SETTINGS_PATH INT_PATH(DESKTOP_SETTINGS_FILE_NAME) #define DESKTOP_SETTINGS_MAGIC (0x17) @@ -15,10 +15,10 @@ typedef struct { uint8_t reserved[11]; DesktopSettings settings; -} DesktopSettingsV10; +} DesktopSettingsV13; -// Actual size of DesktopSettings v10 -static_assert(sizeof(DesktopSettingsV10) == 1044); +// Actual size of DesktopSettings v13 +//static_assert(sizeof(DesktopSettingsV13) == 1234); void desktop_settings_load(DesktopSettings* settings) { furi_assert(settings); @@ -37,21 +37,21 @@ void desktop_settings_load(DesktopSettings* settings) { DESKTOP_SETTINGS_MAGIC, DESKTOP_SETTINGS_VER); - } else if(version == DESKTOP_SETTINGS_VER_10) { - DesktopSettingsV10* settings_v10 = malloc(sizeof(DesktopSettingsV10)); + } else if(version == DESKTOP_SETTINGS_VER_13) { + DesktopSettingsV13* settings_v13 = malloc(sizeof(DesktopSettingsV13)); success = saved_struct_load( DESKTOP_SETTINGS_PATH, - settings_v10, - sizeof(DesktopSettingsV10), + settings_v13, + sizeof(DesktopSettingsV13), DESKTOP_SETTINGS_MAGIC, - DESKTOP_SETTINGS_VER_10); + DESKTOP_SETTINGS_VER_13); if(success) { - *settings = settings_v10->settings; + *settings = settings_v13->settings; } - free(settings_v10); + free(settings_v13); } } while(false); diff --git a/applications/services/desktop/desktop_settings.h b/applications/services/desktop/desktop_settings.h index 49c2cd20c0..ba5a78840e 100644 --- a/applications/services/desktop/desktop_settings.h +++ b/applications/services/desktop/desktop_settings.h @@ -2,34 +2,6 @@ #include -#define DESKTOP_SETTINGS_VER (13) - -#define DESKTOP_SETTINGS_PATH INT_PATH(DESKTOP_SETTINGS_FILE_NAME) -#define DESKTOP_SETTINGS_MAGIC (0x17) -#define PIN_MAX_LENGTH 12 - -#define DESKTOP_SETTINGS_RUN_PIN_SETUP_ARG "run_pin_setup" - -#define DESKTOP_SETTINGS_SAVE(x) \ - saved_struct_save( \ - DESKTOP_SETTINGS_PATH, \ - (x), \ - sizeof(DesktopSettings), \ - DESKTOP_SETTINGS_MAGIC, \ - DESKTOP_SETTINGS_VER) - -#define DESKTOP_SETTINGS_LOAD(x) \ - saved_struct_load( \ - DESKTOP_SETTINGS_PATH, \ - (x), \ - sizeof(DesktopSettings), \ - DESKTOP_SETTINGS_MAGIC, \ - DESKTOP_SETTINGS_VER) - -#define MAX_PIN_SIZE 10 -#define MIN_PIN_SIZE 4 -#define MAX_APP_LENGTH 128 - #define DISPLAY_BATTERY_BAR 0 #define DISPLAY_BATTERY_PERCENT 1 #define DISPLAY_BATTERY_INVERTED_PERCENT 2 @@ -47,14 +19,14 @@ typedef enum { } FavoriteAppShortcut; typedef enum { - DummyAppLeft = 0, + DummyAppLeftShort, DummyAppLeftLong, - DummyAppRight, + DummyAppRightShort, DummyAppRightLong, DummyAppUpLong, - DummyAppDown, + DummyAppDownShort, DummyAppDownLong, - DummyAppOk, + DummyAppOkShort, DummyAppOkLong, DummyAppNumber, diff --git a/applications/services/desktop/scenes/desktop_scene_main.c b/applications/services/desktop/scenes/desktop_scene_main.c index 25c100ed7c..4fdcc34006 100644 --- a/applications/services/desktop/scenes/desktop_scene_main.c +++ b/applications/services/desktop/scenes/desktop_scene_main.c @@ -190,7 +190,7 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { desktop, &desktop->settings.favorite_apps[FavoriteAppRightShort]); } else { desktop_scene_main_open_app_or_profile( - desktop, &desktop->settings.dummy_apps[DummyAppRight]); + desktop, &desktop->settings.dummy_apps[DummyAppRightShort]); } } consumed = true; @@ -198,15 +198,15 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { case DesktopDummyEventOpenLeft: desktop_scene_main_open_app_or_profile( - desktop, &desktop->settings.dummy_apps[DummyAppLeft]); + desktop, &desktop->settings.dummy_apps[DummyAppLeftShort]); break; case DesktopDummyEventOpenDown: desktop_scene_main_open_app_or_profile( - desktop, &desktop->settings.dummy_apps[DummyAppDown]); + desktop, &desktop->settings.dummy_apps[DummyAppDownShort]); break; case DesktopDummyEventOpenOk: desktop_scene_main_open_app_or_profile( - desktop, &desktop->settings.dummy_apps[DummyAppOk]); + desktop, &desktop->settings.dummy_apps[DummyAppOkShort]); break; case DesktopDummyEventOpenUpLong: if(!desktop_scene_main_check_none( diff --git a/applications/services/expansion/expansion.c b/applications/services/expansion/expansion.c index 4731cb244a..219bf06414 100644 --- a/applications/services/expansion/expansion.c +++ b/applications/services/expansion/expansion.c @@ -1,5 +1,4 @@ #include "expansion.h" -#include "expansion_i.h" #include @@ -19,7 +18,6 @@ typedef enum { ExpansionStateDisabled, ExpansionStateEnabled, ExpansionStateRunning, - ExpansionStateConnectionEstablished, } ExpansionState; typedef enum { @@ -29,15 +27,10 @@ typedef enum { ExpansionMessageTypeReloadSettings, ExpansionMessageTypeModuleConnected, ExpansionMessageTypeModuleDisconnected, - ExpansionMessageTypeConnectionEstablished, - ExpansionMessageTypeIsConnected, } ExpansionMessageType; typedef union { - union { - FuriHalSerialId serial_id; - bool* is_connected; - }; + FuriHalSerialId serial_id; } ExpansionMessageData; typedef struct { @@ -52,8 +45,6 @@ struct Expansion { FuriHalSerialId serial_id; ExpansionWorker* worker; ExpansionState state; - - ExpansionSettings settings; }; static const char* const expansion_uart_names[] = { @@ -76,21 +67,13 @@ static void expansion_detect_callback(void* context) { UNUSED(status); } -static void expansion_worker_callback(void* context, ExpansionWorkerCallbackReason reason) { +static void expansion_worker_callback(void* context) { furi_assert(context); Expansion* instance = context; - ExpansionMessage message; - switch(reason) { - case ExpansionWorkerCallbackReasonExit: - message.type = ExpansionMessageTypeModuleDisconnected; - message.api_lock = NULL; // Not locking the API here to avoid a deadlock - break; - - case ExpansionWorkerCallbackReasonConnected: - message.type = ExpansionMessageTypeConnectionEstablished; - message.api_lock = api_lock_alloc_locked(); - break; + ExpansionMessage message = { + .type = ExpansionMessageTypeModuleDisconnected, + .api_lock = NULL, // Not locking the API here to avoid a deadlock }; const FuriStatus status = furi_message_queue_put(instance->queue, &message, FuriWaitForever); @@ -110,7 +93,7 @@ static void if(settings.uart_index < FuriHalSerialIdMax) { instance->state = ExpansionStateEnabled; - instance->serial_id = instance->settings.uart_index; + instance->serial_id = settings.uart_index; furi_hal_serial_control_set_expansion_callback( instance->serial_id, expansion_detect_callback, instance); @@ -123,9 +106,7 @@ static void UNUSED(data); if(instance->state == ExpansionStateDisabled) { return; - } else if( - instance->state == ExpansionStateRunning || - instance->state == ExpansionStateConnectionEstablished) { + } else if(instance->state == ExpansionStateRunning) { expansion_worker_stop(instance->worker); expansion_worker_free(instance->worker); } else { @@ -201,8 +182,7 @@ static void expansion_control_handler_module_disconnected( Expansion* instance, const ExpansionMessageData* data) { UNUSED(data); - if(instance->state != ExpansionStateRunning && - instance->state != ExpansionStateConnectionEstablished) { + if(instance->state != ExpansionStateRunning) { return; } @@ -212,23 +192,6 @@ static void expansion_control_handler_module_disconnected( instance->serial_id, expansion_detect_callback, instance); } -static void expansion_control_handler_connection_established( - Expansion* instance, - const ExpansionMessageData* data) { - UNUSED(data); - if(instance->state != ExpansionStateRunning && - instance->state != ExpansionStateConnectionEstablished) { - return; - } - - instance->state = ExpansionStateConnectionEstablished; -} - -static void - expansion_control_handler_is_connected(Expansion* instance, const ExpansionMessageData* data) { - *data->is_connected = instance->state == ExpansionStateConnectionEstablished; -} - typedef void (*ExpansionControlHandler)(Expansion*, const ExpansionMessageData*); static const ExpansionControlHandler expansion_control_handlers[] = { @@ -238,8 +201,6 @@ static const ExpansionControlHandler expansion_control_handlers[] = { [ExpansionMessageTypeReloadSettings] = expansion_control_handler_reload_settings, [ExpansionMessageTypeModuleConnected] = expansion_control_handler_module_connected, [ExpansionMessageTypeModuleDisconnected] = expansion_control_handler_module_disconnected, - [ExpansionMessageTypeConnectionEstablished] = expansion_control_handler_connection_established, - [ExpansionMessageTypeIsConnected] = expansion_control_handler_is_connected, }; static int32_t expansion_control(void* context) { @@ -334,22 +295,6 @@ void expansion_disable(Expansion* instance) { api_lock_wait_unlock_and_free(message.api_lock); } -bool expansion_is_connected(Expansion* instance) { - furi_check(instance); - bool is_connected; - - ExpansionMessage message = { - .type = ExpansionMessageTypeIsConnected, - .data.is_connected = &is_connected, - .api_lock = api_lock_alloc_locked(), - }; - - furi_message_queue_put(instance->queue, &message, FuriWaitForever); - api_lock_wait_unlock_and_free(message.api_lock); - - return is_connected; -} - void expansion_set_listen_serial(Expansion* instance, FuriHalSerialId serial_id) { furi_check(instance); furi_check(serial_id < FuriHalSerialIdMax); @@ -363,7 +308,3 @@ void expansion_set_listen_serial(Expansion* instance, FuriHalSerialId serial_id) furi_message_queue_put(instance->queue, &message, FuriWaitForever); api_lock_wait_unlock_and_free(message.api_lock); } - -ExpansionSettings* expansion_get_settings(Expansion* instance) { - return &instance->settings; -} diff --git a/applications/services/expansion/expansion.h b/applications/services/expansion/expansion.h index 1b0879b1ec..e169b3c15d 100644 --- a/applications/services/expansion/expansion.h +++ b/applications/services/expansion/expansion.h @@ -50,15 +50,6 @@ void expansion_enable(Expansion* instance); */ void expansion_disable(Expansion* instance); -/** - * @brief Check if an expansion module is connected. - * - * @param[in,out] instance pointer to the Expansion instance. - * - * @returns true if the module is connected and initialized, false otherwise. - */ -bool expansion_is_connected(Expansion* instance); - /** * @brief Enable support for expansion modules on designated serial port. * diff --git a/applications/services/expansion/expansion_i.h b/applications/services/expansion/expansion_i.h deleted file mode 100644 index 13a4962521..0000000000 --- a/applications/services/expansion/expansion_i.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "expansion_settings.h" -#include "expansion.h" - -ExpansionSettings* expansion_get_settings(Expansion* instance); diff --git a/applications/services/expansion/expansion_settings.c b/applications/services/expansion/expansion_settings.c index 061d630a7a..274ac74304 100644 --- a/applications/services/expansion/expansion_settings.c +++ b/applications/services/expansion/expansion_settings.c @@ -2,7 +2,6 @@ #include #include -#include #include "expansion_settings_filename.h" diff --git a/applications/services/expansion/expansion_worker.c b/applications/services/expansion/expansion_worker.c index edc1d09cce..449d02cffc 100644 --- a/applications/services/expansion/expansion_worker.c +++ b/applications/services/expansion/expansion_worker.c @@ -223,7 +223,6 @@ static bool expansion_worker_handle_state_handshake( if(furi_hal_serial_is_baud_rate_supported(instance->serial_handle, baud_rate)) { instance->state = ExpansionWorkerStateConnected; - instance->callback(instance->cb_context, ExpansionWorkerCallbackReasonConnected); // Send response at previous baud rate if(!expansion_worker_send_status_response(instance, ExpansionFrameErrorNone)) break; furi_hal_serial_set_br(instance->serial_handle, baud_rate); @@ -352,7 +351,7 @@ static int32_t expansion_worker(void* context) { // Do not invoke worker callback on user-requested exit if((instance->exit_reason != ExpansionWorkerExitReasonUser) && (instance->callback != NULL)) { - instance->callback(instance->cb_context, ExpansionWorkerCallbackReasonExit); + instance->callback(instance->cb_context); } return 0; diff --git a/applications/services/expansion/expansion_worker.h b/applications/services/expansion/expansion_worker.h index faab2887f3..761f79c1d9 100644 --- a/applications/services/expansion/expansion_worker.h +++ b/applications/services/expansion/expansion_worker.h @@ -17,20 +17,14 @@ */ typedef struct ExpansionWorker ExpansionWorker; -typedef enum { - ExpansionWorkerCallbackReasonExit, - ExpansionWorkerCallbackReasonConnected, -} ExpansionWorkerCallbackReason; - /** * @brief Worker callback type. * * @see expansion_worker_set_callback() * * @param[in,out] context pointer to a user-defined object. - * @param[in] reason reason for the callback. */ -typedef void (*ExpansionWorkerCallback)(void* context, ExpansionWorkerCallbackReason reason); +typedef void (*ExpansionWorkerCallback)(void* context); /** * @brief Create an expansion worker instance. diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index 636a2bc983..3e884d196e 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -378,12 +378,8 @@ static void power_check_battery_level_change(Power* power) { void power_trigger_ui_update(Power* power) { DesktopSettings* settings = malloc(sizeof(DesktopSettings)); - bool is_loaded = DESKTOP_SETTINGS_LOAD(settings); - if(is_loaded) { - power->displayBatteryPercentage = settings->displayBatteryPercentage; - } else { - power->displayBatteryPercentage = DISPLAY_BATTERY_BAR; - } + desktop_settings_load(settings); + power->displayBatteryPercentage = settings->displayBatteryPercentage; free(settings); view_port_update(power->battery_view_port); } @@ -403,7 +399,7 @@ int32_t power_srv(void* p) { furi_record_create(RECORD_POWER, power); DesktopSettings* settings = malloc(sizeof(DesktopSettings)); - DESKTOP_SETTINGS_LOAD(settings); + desktop_settings_load(settings); power->displayBatteryPercentage = settings->displayBatteryPercentage; free(settings); diff --git a/applications/services/region/application.fam b/applications/services/region/application.fam deleted file mode 100644 index a4cdc94ea5..0000000000 --- a/applications/services/region/application.fam +++ /dev/null @@ -1,10 +0,0 @@ -App( - appid="region", - name="RegionSrv", - apptype=FlipperAppType.STARTUP, - targets=["f7"], - entry_point="region_on_system_start", - cdefines=["SRV_REGION"], - requires=["storage"], - order=170, -) diff --git a/applications/services/region/region.c b/applications/services/region/region.c deleted file mode 100644 index dffcc6b2d5..0000000000 --- a/applications/services/region/region.c +++ /dev/null @@ -1,147 +0,0 @@ -#include - -#include -#include - -#include -#include - -#define TAG "RegionSrv" - -#define SUBGHZ_REGION_FILENAME INT_PATH(".region_data") - -static bool region_istream_read(pb_istream_t* istream, pb_byte_t* buf, size_t count) { - File* file = istream->state; - size_t ret = storage_file_read(file, buf, count); - return count == ret; -} - -static bool region_istream_decode_band(pb_istream_t* stream, const pb_field_t* field, void** arg) { - UNUSED(field); - - FuriHalRegion* region = *arg; - - PB_Region_Band band = {0}; - if(!pb_decode(stream, PB_Region_Band_fields, &band)) { - FURI_LOG_E(TAG, "PB Region band decode error: %s", PB_GET_ERROR(stream)); - return false; - } - - region->bands_count += 1; - region = realloc( //-V701 - region, - sizeof(FuriHalRegion) + sizeof(FuriHalRegionBand) * region->bands_count); - size_t pos = region->bands_count - 1; - region->bands[pos].start = band.start; - region->bands[pos].end = band.end; - region->bands[pos].power_limit = band.power_limit; - region->bands[pos].duty_cycle = band.duty_cycle; - *arg = region; - - FURI_LOG_I( - TAG, - "Add allowed band: start %luHz, stop %luHz, power_limit %ddBm, duty_cycle %u%%", - band.start, - band.end, - band.power_limit, - band.duty_cycle); - return true; -} - -static int32_t region_load_file(void* context) { - UNUSED(context); - - Storage* storage = furi_record_open(RECORD_STORAGE); - File* file = storage_file_alloc(storage); - - PB_Region pb_region = {0}; - pb_region.bands.funcs.decode = region_istream_decode_band; - - do { - FileInfo fileinfo = {0}; - - if(storage_common_stat(storage, SUBGHZ_REGION_FILENAME, &fileinfo) != FSE_OK || - fileinfo.size == 0) { - FURI_LOG_W(TAG, "Region file missing or empty"); - break; - - } else if(!storage_file_open(file, SUBGHZ_REGION_FILENAME, FSAM_READ, FSOM_OPEN_EXISTING)) { - FURI_LOG_E(TAG, "Failed to open region file"); - break; - } - - pb_istream_t istream = { - .callback = region_istream_read, - .state = file, - .errmsg = NULL, - .bytes_left = fileinfo.size, - }; - - pb_region.bands.arg = malloc(sizeof(FuriHalRegion)); - - if(!pb_decode(&istream, PB_Region_fields, &pb_region)) { - FURI_LOG_E(TAG, "Failed to decode region file"); - free(pb_region.bands.arg); - break; - } - - FuriHalRegion* region = pb_region.bands.arg; - - memcpy( - region->country_code, - pb_region.country_code->bytes, - MIN(pb_region.country_code->size, sizeof(region->country_code) - 1)); - - furi_hal_region_set(region); - - FURI_LOG_I(TAG, "Dynamic region set: %s", region->country_code); - } while(0); - - pb_release(PB_Region_fields, &pb_region); - storage_file_free(file); - furi_record_close(RECORD_STORAGE); - - return 0; -} - -static void region_loader_pending_callback(void* context, uint32_t arg) { - UNUSED(arg); - - FuriThread* loader = context; - furi_thread_join(loader); - furi_thread_free(loader); -} - -static void region_loader_state_callback(FuriThreadState state, void* context) { - UNUSED(context); - - if(state == FuriThreadStateStopped) { - furi_timer_pending_callback(region_loader_pending_callback, furi_thread_get_current(), 0); - } -} - -static void region_storage_callback(const void* message, void* context) { - UNUSED(context); - const StorageEvent* event = message; - - if(event->type == StorageEventTypeCardMount) { - FuriThread* loader = furi_thread_alloc_ex(NULL, 2048, region_load_file, NULL); - furi_thread_set_state_callback(loader, region_loader_state_callback); - furi_thread_start(loader); - } -} - -int32_t region_on_system_start(void* p) { - UNUSED(p); - - Storage* storage = furi_record_open(RECORD_STORAGE); - furi_pubsub_subscribe(storage_get_pubsub(storage), region_storage_callback, NULL); - - if(storage_sd_status(storage) != FSE_OK) { - FURI_LOG_D(TAG, "SD Card not ready, skipping dynamic region"); - return 0; - } - - region_load_file(NULL); - return 0; -} diff --git a/applications/settings/desktop_settings/desktop_settings_app.h b/applications/settings/desktop_settings/desktop_settings_app.h index c9d765fd46..2ce57c1186 100644 --- a/applications/settings/desktop_settings/desktop_settings_app.h +++ b/applications/settings/desktop_settings/desktop_settings_app.h @@ -15,6 +15,8 @@ #include "views/desktop_settings_view_pin_setup_howto.h" #include "views/desktop_settings_view_pin_setup_howto2.h" +#include + typedef enum { DesktopSettingsAppViewMenu, DesktopSettingsAppViewVarItemList, diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c index 9f2dce3fc8..ec970a3155 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_favorite.c @@ -221,6 +221,5 @@ bool desktop_settings_scene_favorite_on_event(void* context, SceneManagerEvent e void desktop_settings_scene_favorite_on_exit(void* context) { DesktopSettingsApp* app = context; - DESKTOP_SETTINGS_SAVE(&app->settings); submenu_reset(app->submenu); } diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c index 52e7769599..fec783a35d 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c @@ -215,7 +215,7 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent even scene_manager_set_scene_state( app->scene_manager, DesktopSettingsAppSceneFavorite, - SCENE_STATE_SET_DUMMY_APP | DummyAppLeft); + SCENE_STATE_SET_DUMMY_APP | DummyAppLeftShort); scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); break; case DesktopSettingsDummyLeftLong: @@ -229,7 +229,7 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent even scene_manager_set_scene_state( app->scene_manager, DesktopSettingsAppSceneFavorite, - SCENE_STATE_SET_DUMMY_APP | DummyAppRight); + SCENE_STATE_SET_DUMMY_APP | DummyAppRightShort); scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); break; case DesktopSettingsDummyRightLong: @@ -250,7 +250,7 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent even scene_manager_set_scene_state( app->scene_manager, DesktopSettingsAppSceneFavorite, - SCENE_STATE_SET_DUMMY_APP | DummyAppDown); + SCENE_STATE_SET_DUMMY_APP | DummyAppDownShort); scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); break; case DesktopSettingsDummyDownLong: @@ -264,7 +264,7 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent even scene_manager_set_scene_state( app->scene_manager, DesktopSettingsAppSceneFavorite, - SCENE_STATE_SET_DUMMY_APP | DummyAppOk); + SCENE_STATE_SET_DUMMY_APP | DummyAppOkShort); scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); break; case DesktopSettingsDummyOkLong: @@ -286,7 +286,7 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent even void desktop_settings_scene_start_on_exit(void* context) { DesktopSettingsApp* app = context; variable_item_list_reset(app->variable_item_list); - DESKTOP_SETTINGS_SAVE(&app->settings); + desktop_settings_save(&app->settings); // Trigger UI update in case we changed battery layout Power* power = furi_record_open(RECORD_POWER); diff --git a/applications/settings/expansion_settings_app/expansion_settings_app.c b/applications/settings/expansion_settings_app/expansion_settings_app.c index 629c9a0a0f..639f7f23d5 100644 --- a/applications/settings/expansion_settings_app/expansion_settings_app.c +++ b/applications/settings/expansion_settings_app/expansion_settings_app.c @@ -10,7 +10,7 @@ static void expansion_settings_app_uart_changed(VariableItem* item) { ExpansionSettingsApp* app = variable_item_get_context(item); const uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, expansion_uart_text[index]); - app->settings->uart_index = index; + app->settings.uart_index = index; if(index < FuriHalSerialIdMax) { expansion_set_listen_serial(app->expansion, index); @@ -31,10 +31,8 @@ static ExpansionSettingsApp* expansion_settings_app_alloc(void) { app->gui = furi_record_open(RECORD_GUI); app->expansion = furi_record_open(RECORD_EXPANSION); - app->settings = expansion_get_settings(app->expansion); app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); @@ -50,7 +48,7 @@ static ExpansionSettingsApp* expansion_settings_app_alloc(void) { COUNT_OF(expansion_uart_text), expansion_settings_app_uart_changed, app); - value_index = app->settings->uart_index; + value_index = app->settings.uart_index; variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, expansion_uart_text[value_index]); @@ -69,7 +67,7 @@ static ExpansionSettingsApp* expansion_settings_app_alloc(void) { static void expansion_settings_app_free(ExpansionSettingsApp* app) { furi_assert(app); - expansion_settings_save(app->settings); + expansion_settings_save(&app->settings); view_dispatcher_remove_view(app->view_dispatcher, ExpansionSettingsViewVarItemList); variable_item_list_free(app->var_item_list); diff --git a/applications/settings/expansion_settings_app/expansion_settings_app.h b/applications/settings/expansion_settings_app/expansion_settings_app.h index a404f9c1a5..a43bf853fc 100644 --- a/applications/settings/expansion_settings_app/expansion_settings_app.h +++ b/applications/settings/expansion_settings_app/expansion_settings_app.h @@ -8,7 +8,6 @@ #include #include -#include #include typedef struct { @@ -16,7 +15,7 @@ typedef struct { ViewDispatcher* view_dispatcher; VariableItemList* var_item_list; Expansion* expansion; - ExpansionSettings* settings; + ExpansionSettings settings; } ExpansionSettingsApp; typedef enum { diff --git a/lib/subghz/devices/registry.c b/lib/subghz/devices/registry.c index 9722c15017..a3a535c400 100644 --- a/lib/subghz/devices/registry.c +++ b/lib/subghz/devices/registry.c @@ -23,8 +23,9 @@ void subghz_device_registry_init(void) { firmware_api_interface); //TODO FL-3556: fix path to plugins + //if(plugin_manager_load_all(subghz_device->manager, APP_DATA_PATH("plugins")) != + // if(plugin_manager_load_all(subghz_device->manager, EXT_PATH("apps_data/subghz/plugins")) != - //if(plugin_manager_load_all(subghz_device->manager, APP_DATA_PATH("plugins")) != PluginManagerErrorNone) { FURI_LOG_E(TAG, "Failed to load all libs"); } diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 3c6a9e4db0..51d623e78f 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1030,7 +1030,6 @@ Function,-,exp2f,float,float Function,-,exp2l,long double,long double Function,+,expansion_disable,void,Expansion* Function,+,expansion_enable,void,Expansion* -Function,+,expansion_is_connected,_Bool,Expansion* Function,+,expansion_set_listen_serial,void,"Expansion*, FuriHalSerialId" Function,-,expf,float,float Function,-,expl,long double,long double @@ -1995,8 +1994,8 @@ Function,+,ibutton_protocols_render_data,void,"iButtonProtocols*, const iButtonK Function,+,ibutton_protocols_render_error,void,"iButtonProtocols*, const iButtonKey*, FuriString*" Function,+,ibutton_protocols_render_uid,void,"iButtonProtocols*, const iButtonKey*, FuriString*" Function,+,ibutton_protocols_save,_Bool,"iButtonProtocols*, const iButtonKey*, const char*" -Function,+,ibutton_protocols_write_id,_Bool,"iButtonProtocols*, iButtonKey*" Function,+,ibutton_protocols_write_copy,_Bool,"iButtonProtocols*, iButtonKey*" +Function,+,ibutton_protocols_write_id,_Bool,"iButtonProtocols*, iButtonKey*" Function,+,ibutton_worker_alloc,iButtonWorker*,iButtonProtocols* Function,+,ibutton_worker_emulate_set_callback,void,"iButtonWorker*, iButtonWorkerEmulateCallback, void*" Function,+,ibutton_worker_emulate_start,void,"iButtonWorker*, iButtonKey*" @@ -2006,8 +2005,8 @@ Function,+,ibutton_worker_read_start,void,"iButtonWorker*, iButtonKey*" Function,+,ibutton_worker_start_thread,void,iButtonWorker* Function,+,ibutton_worker_stop,void,iButtonWorker* Function,+,ibutton_worker_stop_thread,void,iButtonWorker* -Function,+,ibutton_worker_write_id_start,void,"iButtonWorker*, iButtonKey*" Function,+,ibutton_worker_write_copy_start,void,"iButtonWorker*, iButtonKey*" +Function,+,ibutton_worker_write_id_start,void,"iButtonWorker*, iButtonKey*" Function,+,ibutton_worker_write_set_callback,void,"iButtonWorker*, iButtonWorkerWriteCallback, void*" Function,+,icon_animation_alloc,IconAnimation*,const Icon* Function,+,icon_animation_free,void,IconAnimation* diff --git a/targets/f7/furi_hal/furi_hal_region.c b/targets/f7/furi_hal/furi_hal_region.c index 6e138b41bd..c8af57a199 100644 --- a/targets/f7/furi_hal/furi_hal_region.c +++ b/targets/f7/furi_hal/furi_hal_region.c @@ -29,9 +29,10 @@ const FuriHalRegionBand* furi_hal_region_get_band(uint32_t frequency) { return NULL; } - for(size_t i = 0; i < region->bands_count; i++) { - if(region->bands[i].start <= frequency && region->bands[i].end >= frequency) { - return ®ion->bands[i]; + for(size_t i = 0; i < furi_hal_region->bands_count; i++) { + if(furi_hal_region->bands[i].start <= frequency && + furi_hal_region->bands[i].end >= frequency) { + return &furi_hal_region->bands[i]; } } From bf6c6c231f6f264475a3a7398b4280f92ac2928d Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 10 Aug 2024 14:32:27 +0300 Subject: [PATCH 42/52] [FL-3841] FuriEventLoop Pt.2 (#3703) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Abstract primitive type from main logic in FuriEventLoop * Remove message_queue_i.h * Add stream buffer support for event loop * Add semaphore support for event loop * Add temporary unit test workaround * Make the linter happy * Add mutex support for event loop * Implement event subscription and unsubscription while the event loop is running * Implement edge events * Fix leftover logical errors * Add event loop timer example application * Implement flag-based edge trigger and one-shot mode * Add event loop mutex example application * Only notify the event loop if stream buffer is at or above its trigger level * Reformat comments * Add event loop stream buffer example application * Add event loop multiple elements example application * Improve event loop flag names * Remove redundant signal handler as it is already handled by the event loop * Refactor Power service, improve ViewHolder * Use ViewHolder instead of ViewDispatcher in About app * Enable ViewDispatcher queue on construction, deprecate view_dispatcher_enable_queue() * Remove all invocations of view_dispatcher_enable_queue() * Remove app-scened-template * Remove missing library from target.json * Port Accessor app to ViewHolder * Make the linter happy * Add example_view_holder application, update ViewHolder docs * Add example_view_dispatcher application, update ViewDispatcher docs * Replace FuriSemaphore with FuriApiLock, remove workaround delay * Fix logical error * Fix another logical error * Use the sources directive to speed up compilation * Use constant define macro * Improve FuriEventLoop documentation * Improve FuriEventLoop documentation once more * Bump API Version * Gui: remove redundant checks from ViewDispatcher * Gui: remove dead ifs from ViewDispatcher Co-authored-by: Silent Co-authored-by: hedger Co-authored-by: あく --- .../debug/accessor/accessor_view_manager.cpp | 54 ++- .../debug/accessor/accessor_view_manager.h | 8 +- .../debug/battery_test_app/battery_test_app.c | 1 - .../debug/bt_debug_app/bt_debug_app.c | 1 - applications/debug/crash_test/crash_test.c | 1 - .../debug/display_test/display_test.c | 1 - .../event_loop_blink_test.c | 7 +- .../file_browser_test/file_browser_app.c | 2 - .../debug/lfrfid_debug/lfrfid_debug.c | 1 - applications/debug/locale_test/locale_test.c | 1 - .../debug/rpc_debug_app/rpc_debug_app.c | 1 - .../debug/subghz_test/subghz_test_app.c | 1 - .../text_box_view_test/text_box_view_test.c | 1 - applications/debug/uart_echo/uart_echo.c | 1 - .../unit_tests/tests/furi/furi_event_loop.c | 62 ++-- .../debug/unit_tests/tests/rpc/rpc_test.c | 47 ++- .../debug/unit_tests/unit_test_api_table_i.h | 10 +- applications/debug/usb_test/usb_test.c | 1 - .../example_ble_beacon/ble_beacon_app.c | 1 - .../example_event_loop/application.fam | 36 ++ .../example_event_loop_multi.c | 342 ++++++++++++++++++ .../example_event_loop_mutex.c | 140 +++++++ .../example_event_loop_stream_buffer.c | 131 +++++++ .../example_event_loop_timer.c | 87 +++++ .../example_view_dispatcher/application.fam | 8 + .../example_view_dispatcher.c | 173 +++++++++ .../example_view_holder/application.fam | 8 + .../example_view_holder/example_view_holder.c | 78 ++++ applications/main/archive/archive.c | 1 - applications/main/bad_usb/bad_usb_app.c | 2 - applications/main/gpio/gpio_app.c | 1 - applications/main/ibutton/ibutton.c | 1 - applications/main/infrared/infrared_app.c | 1 - applications/main/lfrfid/lfrfid.c | 1 - applications/main/nfc/nfc_app.c | 1 - applications/main/subghz/subghz.c | 1 - applications/main/u2f/u2f_app.c | 1 - applications/services/desktop/desktop.c | 1 - .../dialogs/dialogs_module_file_browser.c | 3 +- .../services/dialogs/dialogs_module_message.c | 3 +- applications/services/dolphin/dolphin.c | 6 +- applications/services/gui/view_dispatcher.c | 89 ++--- applications/services/gui/view_dispatcher.h | 31 +- applications/services/gui/view_dispatcher_i.h | 4 +- applications/services/gui/view_holder.c | 65 ++-- applications/services/gui/view_holder.h | 52 ++- .../services/loader/loader_applications.c | 5 +- applications/services/loader/loader_menu.c | 2 - applications/services/power/power_cli.c | 6 +- .../services/power/power_service/power.c | 300 ++++++++------- .../services/power/power_service/power.h | 5 +- .../services/power/power_service/power_api.c | 78 ++-- .../services/power/power_service/power_i.h | 46 ++- applications/services/rpc/rpc_system.c | 13 +- applications/services/storage/storage_cli.c | 5 +- applications/settings/about/about.c | 20 +- .../bt_settings_app/bt_settings_app.c | 1 - .../desktop_settings/desktop_settings_app.c | 1 - .../notification_settings_app.c | 1 - .../power_settings_app/power_settings_app.c | 1 - .../power_settings_scene_reboot_confirm.c | 6 +- .../storage_settings_scene_factory_reset.c | 4 +- .../storage_settings/storage_settings.c | 1 - .../settings/system/system_settings.c | 1 - applications/system/hid_app/hid.c | 1 - applications/system/js_app/js_app.c | 1 - .../system/js_app/modules/js_submenu.c | 3 +- .../system/js_app/modules/js_textbox.c | 9 +- applications/system/updater/updater.c | 2 - furi/core/event_loop.c | 287 ++++++++++----- furi/core/event_loop.h | 166 ++++++++- furi/core/event_loop_i.h | 11 +- furi/core/event_loop_link_i.h | 7 +- furi/core/message_queue.c | 12 +- furi/core/message_queue_i.h | 6 - furi/core/mutex.c | 42 ++- furi/core/semaphore.c | 67 +++- furi/core/semaphore.h | 8 + furi/core/stream_buffer.c | 65 +++- lib/SConscript | 1 - lib/app-scened-template/generic_scene.hpp | 10 - lib/app-scened-template/record_controller.hpp | 47 --- lib/app-scened-template/scene_controller.hpp | 246 ------------- lib/app-scened-template/text_store.cpp | 18 - lib/app-scened-template/text_store.h | 12 - lib/app-scened-template/typeindex_no_rtti.hpp | 129 ------- lib/app-scened-template/view_controller.hpp | 170 --------- .../view_modules/byte_input_vm.cpp | 32 -- .../view_modules/byte_input_vm.h | 37 -- .../view_modules/dialog_ex_vm.cpp | 61 ---- .../view_modules/dialog_ex_vm.h | 73 ---- .../view_modules/generic_view_module.h | 10 - .../view_modules/popup_vm.cpp | 56 --- .../view_modules/popup_vm.h | 68 ---- .../view_modules/submenu_vm.cpp | 33 -- .../view_modules/submenu_vm.h | 42 --- .../view_modules/text_input_vm.cpp | 39 -- .../view_modules/text_input_vm.h | 41 --- lib/appframe.scons | 29 -- lib/toolbox/api_lock.h | 4 + targets/f18/api_symbols.csv | 16 +- targets/f18/target.json | 1 - targets/f7/api_symbols.csv | 16 +- targets/f7/target.json | 1 - 104 files changed, 2093 insertions(+), 1751 deletions(-) create mode 100644 applications/examples/example_event_loop/application.fam create mode 100644 applications/examples/example_event_loop/example_event_loop_multi.c create mode 100644 applications/examples/example_event_loop/example_event_loop_mutex.c create mode 100644 applications/examples/example_event_loop/example_event_loop_stream_buffer.c create mode 100644 applications/examples/example_event_loop/example_event_loop_timer.c create mode 100644 applications/examples/example_view_dispatcher/application.fam create mode 100644 applications/examples/example_view_dispatcher/example_view_dispatcher.c create mode 100644 applications/examples/example_view_holder/application.fam create mode 100644 applications/examples/example_view_holder/example_view_holder.c delete mode 100644 furi/core/message_queue_i.h delete mode 100644 lib/app-scened-template/generic_scene.hpp delete mode 100644 lib/app-scened-template/record_controller.hpp delete mode 100644 lib/app-scened-template/scene_controller.hpp delete mode 100644 lib/app-scened-template/text_store.cpp delete mode 100644 lib/app-scened-template/text_store.h delete mode 100644 lib/app-scened-template/typeindex_no_rtti.hpp delete mode 100644 lib/app-scened-template/view_controller.hpp delete mode 100644 lib/app-scened-template/view_modules/byte_input_vm.cpp delete mode 100644 lib/app-scened-template/view_modules/byte_input_vm.h delete mode 100644 lib/app-scened-template/view_modules/dialog_ex_vm.cpp delete mode 100644 lib/app-scened-template/view_modules/dialog_ex_vm.h delete mode 100644 lib/app-scened-template/view_modules/generic_view_module.h delete mode 100644 lib/app-scened-template/view_modules/popup_vm.cpp delete mode 100644 lib/app-scened-template/view_modules/popup_vm.h delete mode 100644 lib/app-scened-template/view_modules/submenu_vm.cpp delete mode 100644 lib/app-scened-template/view_modules/submenu_vm.h delete mode 100644 lib/app-scened-template/view_modules/text_input_vm.cpp delete mode 100644 lib/app-scened-template/view_modules/text_input_vm.h delete mode 100644 lib/appframe.scons diff --git a/applications/debug/accessor/accessor_view_manager.cpp b/applications/debug/accessor/accessor_view_manager.cpp index 955c0b2867..aeb90c2974 100644 --- a/applications/debug/accessor/accessor_view_manager.cpp +++ b/applications/debug/accessor/accessor_view_manager.cpp @@ -5,45 +5,49 @@ AccessorAppViewManager::AccessorAppViewManager() { event_queue = furi_message_queue_alloc(10, sizeof(AccessorEvent)); - view_dispatcher = view_dispatcher_alloc(); - auto callback = cbc::obtain_connector(this, &AccessorAppViewManager::previous_view_callback); + view_holder = view_holder_alloc(); + auto callback = + cbc::obtain_connector(this, &AccessorAppViewManager::view_holder_back_callback); // allocate views submenu = submenu_alloc(); - add_view(ViewType::Submenu, submenu_get_view(submenu)); - popup = popup_alloc(); - add_view(ViewType::Popup, popup_get_view(popup)); - gui = static_cast(furi_record_open(RECORD_GUI)); - view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen); + // set back callback + view_holder_set_back_callback(view_holder, callback, NULL); - // set previous view callback for all views - view_set_previous_callback(submenu_get_view(submenu), callback); - view_set_previous_callback(popup_get_view(popup), callback); + gui = static_cast(furi_record_open(RECORD_GUI)); + view_holder_attach_to_gui(view_holder, gui); } AccessorAppViewManager::~AccessorAppViewManager() { - // remove views - view_dispatcher_remove_view( - view_dispatcher, static_cast(AccessorAppViewManager::ViewType::Submenu)); - view_dispatcher_remove_view( - view_dispatcher, static_cast(AccessorAppViewManager::ViewType::Popup)); - + // remove current view + view_holder_set_view(view_holder, NULL); // free view modules furi_record_close(RECORD_GUI); submenu_free(submenu); popup_free(popup); - - // free dispatcher - view_dispatcher_free(view_dispatcher); - + // free view holder + view_holder_free(view_holder); // free event queue furi_message_queue_free(event_queue); } void AccessorAppViewManager::switch_to(ViewType type) { - view_dispatcher_switch_to_view(view_dispatcher, static_cast(type)); + View* view; + + switch(type) { + case ViewType::Submenu: + view = submenu_get_view(submenu); + break; + case ViewType::Popup: + view = popup_get_view(popup); + break; + default: + furi_crash(); + } + + view_holder_set_view(view_holder, view); } Submenu* AccessorAppViewManager::get_submenu() { @@ -65,16 +69,10 @@ void AccessorAppViewManager::send_event(AccessorEvent* event) { furi_check(result == FuriStatusOk); } -uint32_t AccessorAppViewManager::previous_view_callback(void*) { +void AccessorAppViewManager::view_holder_back_callback(void*) { if(event_queue != NULL) { AccessorEvent event; event.type = AccessorEvent::Type::Back; send_event(&event); } - - return VIEW_IGNORE; -} - -void AccessorAppViewManager::add_view(ViewType view_type, View* view) { - view_dispatcher_add_view(view_dispatcher, static_cast(view_type), view); } diff --git a/applications/debug/accessor/accessor_view_manager.h b/applications/debug/accessor/accessor_view_manager.h index 66e54e41ce..c0a12cbe8e 100644 --- a/applications/debug/accessor/accessor_view_manager.h +++ b/applications/debug/accessor/accessor_view_manager.h @@ -1,6 +1,6 @@ #pragma once #include -#include +#include #include #include #include "accessor_event.h" @@ -10,7 +10,6 @@ class AccessorAppViewManager { enum class ViewType : uint8_t { Submenu, Popup, - Tune, }; FuriMessageQueue* event_queue; @@ -27,11 +26,10 @@ class AccessorAppViewManager { Popup* get_popup(void); private: - ViewDispatcher* view_dispatcher; Gui* gui; + ViewHolder* view_holder; - uint32_t previous_view_callback(void* context); - void add_view(ViewType view_type, View* view); + void view_holder_back_callback(void* context); // view elements Submenu* submenu; diff --git a/applications/debug/battery_test_app/battery_test_app.c b/applications/debug/battery_test_app/battery_test_app.c index 5f9934e777..363c8f4d52 100644 --- a/applications/debug/battery_test_app/battery_test_app.c +++ b/applications/debug/battery_test_app/battery_test_app.c @@ -42,7 +42,6 @@ BatteryTestApp* battery_test_alloc(void) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_tick_event_callback( app->view_dispatcher, battery_test_battery_info_update_model, 500); diff --git a/applications/debug/bt_debug_app/bt_debug_app.c b/applications/debug/bt_debug_app/bt_debug_app.c index 109feee602..56c67e3e66 100644 --- a/applications/debug/bt_debug_app/bt_debug_app.c +++ b/applications/debug/bt_debug_app/bt_debug_app.c @@ -36,7 +36,6 @@ BtDebugApp* bt_debug_app_alloc(void) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views diff --git a/applications/debug/crash_test/crash_test.c b/applications/debug/crash_test/crash_test.c index ae0074fe1c..2b2be13d62 100644 --- a/applications/debug/crash_test/crash_test.c +++ b/applications/debug/crash_test/crash_test.c @@ -66,7 +66,6 @@ CrashTest* crash_test_alloc(void) { instance->gui = furi_record_open(RECORD_GUI); instance->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(instance->view_dispatcher); view_dispatcher_attach_to_gui( instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen); diff --git a/applications/debug/display_test/display_test.c b/applications/debug/display_test/display_test.c index 3028a13b90..3b742906d6 100644 --- a/applications/debug/display_test/display_test.c +++ b/applications/debug/display_test/display_test.c @@ -126,7 +126,6 @@ DisplayTest* display_test_alloc(void) { instance->gui = furi_record_open(RECORD_GUI); instance->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(instance->view_dispatcher); view_dispatcher_attach_to_gui( instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen); diff --git a/applications/debug/event_loop_blink_test/event_loop_blink_test.c b/applications/debug/event_loop_blink_test/event_loop_blink_test.c index 5c7e0ce558..7f00e63f2e 100644 --- a/applications/debug/event_loop_blink_test/event_loop_blink_test.c +++ b/applications/debug/event_loop_blink_test/event_loop_blink_test.c @@ -82,7 +82,8 @@ static void view_port_input_callback(InputEvent* input_event, void* context) { furi_message_queue_put(app->input_queue, input_event, 0); } -static bool input_queue_callback(FuriMessageQueue* queue, void* context) { +static bool input_queue_callback(FuriEventLoopObject* object, void* context) { + FuriMessageQueue* queue = object; EventLoopBlinkTestApp* app = context; InputEvent event; @@ -144,7 +145,7 @@ int32_t event_loop_blink_test_app(void* arg) { gui_add_view_port(gui, view_port, GuiLayerFullscreen); furi_event_loop_tick_set(app.event_loop, 500, event_loop_tick_callback, &app); - furi_event_loop_message_queue_subscribe( + furi_event_loop_subscribe_message_queue( app.event_loop, app.input_queue, FuriEventLoopEventIn, input_queue_callback, &app); furi_event_loop_run(app.event_loop); @@ -154,7 +155,7 @@ int32_t event_loop_blink_test_app(void* arg) { furi_record_close(RECORD_GUI); - furi_event_loop_message_queue_unsubscribe(app.event_loop, app.input_queue); + furi_event_loop_unsubscribe(app.event_loop, app.input_queue); furi_message_queue_free(app.input_queue); for(size_t i = 0; i < TIMER_COUNT; ++i) { diff --git a/applications/debug/file_browser_test/file_browser_app.c b/applications/debug/file_browser_test/file_browser_app.c index c3e7c898bf..a502a8a90b 100644 --- a/applications/debug/file_browser_test/file_browser_app.c +++ b/applications/debug/file_browser_test/file_browser_app.c @@ -33,8 +33,6 @@ FileBrowserApp* file_browser_app_alloc(char* arg) { app->dialogs = furi_record_open(RECORD_DIALOGS); app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); - app->scene_manager = scene_manager_alloc(&file_browser_scene_handlers, app); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); diff --git a/applications/debug/lfrfid_debug/lfrfid_debug.c b/applications/debug/lfrfid_debug/lfrfid_debug.c index 13c0b299fa..962afd1c30 100644 --- a/applications/debug/lfrfid_debug/lfrfid_debug.c +++ b/applications/debug/lfrfid_debug/lfrfid_debug.c @@ -17,7 +17,6 @@ static LfRfidDebug* lfrfid_debug_alloc(void) { app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&lfrfid_debug_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( app->view_dispatcher, lfrfid_debug_custom_event_callback); diff --git a/applications/debug/locale_test/locale_test.c b/applications/debug/locale_test/locale_test.c index 1ca077db1f..51d45a6b05 100644 --- a/applications/debug/locale_test/locale_test.c +++ b/applications/debug/locale_test/locale_test.c @@ -61,7 +61,6 @@ static LocaleTestApp* locale_test_alloc(void) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views diff --git a/applications/debug/rpc_debug_app/rpc_debug_app.c b/applications/debug/rpc_debug_app/rpc_debug_app.c index 5e53c221e1..1536b8918e 100644 --- a/applications/debug/rpc_debug_app/rpc_debug_app.c +++ b/applications/debug/rpc_debug_app/rpc_debug_app.c @@ -99,7 +99,6 @@ static RpcDebugApp* rpc_debug_app_alloc(void) { view_dispatcher_set_tick_event_callback( app->view_dispatcher, rpc_debug_app_tick_event_callback, 100); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); - view_dispatcher_enable_queue(app->view_dispatcher); app->widget = widget_alloc(); view_dispatcher_add_view( diff --git a/applications/debug/subghz_test/subghz_test_app.c b/applications/debug/subghz_test/subghz_test_app.c index 6eba864f6e..dccdac213d 100644 --- a/applications/debug/subghz_test/subghz_test_app.c +++ b/applications/debug/subghz_test/subghz_test_app.c @@ -30,7 +30,6 @@ SubGhzTestApp* subghz_test_app_alloc(void) { // View Dispatcher app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&subghz_test_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( diff --git a/applications/debug/text_box_view_test/text_box_view_test.c b/applications/debug/text_box_view_test/text_box_view_test.c index 7bbcb285b8..4d63e37793 100644 --- a/applications/debug/text_box_view_test/text_box_view_test.c +++ b/applications/debug/text_box_view_test/text_box_view_test.c @@ -126,7 +126,6 @@ int32_t text_box_view_test_app(void* p) { Gui* gui = furi_record_open(RECORD_GUI); ViewDispatcher* view_dispatcher = view_dispatcher_alloc(); view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen); - view_dispatcher_enable_queue(view_dispatcher); TextBoxViewTest instance = { .text_box = text_box_alloc(), diff --git a/applications/debug/uart_echo/uart_echo.c b/applications/debug/uart_echo/uart_echo.c index 8e1884e9a2..bf38ba4c27 100644 --- a/applications/debug/uart_echo/uart_echo.c +++ b/applications/debug/uart_echo/uart_echo.c @@ -242,7 +242,6 @@ static UartEchoApp* uart_echo_app_alloc(uint32_t baudrate) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views diff --git a/applications/debug/unit_tests/tests/furi/furi_event_loop.c b/applications/debug/unit_tests/tests/furi/furi_event_loop.c index 4eeecb2b83..291181c77f 100644 --- a/applications/debug/unit_tests/tests/furi/furi_event_loop.c +++ b/applications/debug/unit_tests/tests/furi/furi_event_loop.c @@ -19,25 +19,24 @@ typedef struct { uint32_t consumer_counter; } TestFuriData; -bool test_furi_event_loop_producer_mq_callback(FuriMessageQueue* queue, void* context) { +bool test_furi_event_loop_producer_mq_callback(FuriEventLoopObject* object, void* context) { furi_check(context); TestFuriData* data = context; - furi_check(data->mq == queue, "Invalid queue"); + furi_check(data->mq == object, "Invalid queue"); FURI_LOG_I( TAG, "producer_mq_callback: %lu %lu", data->producer_counter, data->consumer_counter); - // Remove and add should not cause crash - // if(data->producer_counter == EVENT_LOOP_EVENT_COUNT/2) { - // furi_event_loop_message_queue_remove(data->producer_event_loop, data->mq); - // furi_event_loop_message_queue_add( - // data->producer_event_loop, - // data->mq, - // FuriEventLoopEventOut, - // test_furi_event_loop_producer_mq_callback, - // data); - // } + if(data->producer_counter == EVENT_LOOP_EVENT_COUNT / 2) { + furi_event_loop_unsubscribe(data->producer_event_loop, data->mq); + furi_event_loop_subscribe_message_queue( + data->producer_event_loop, + data->mq, + FuriEventLoopEventOut, + test_furi_event_loop_producer_mq_callback, + data); + } if(data->producer_counter == EVENT_LOOP_EVENT_COUNT) { furi_event_loop_stop(data->producer_event_loop); @@ -61,7 +60,7 @@ int32_t test_furi_event_loop_producer(void* p) { FURI_LOG_I(TAG, "producer start 1st run"); data->producer_event_loop = furi_event_loop_alloc(); - furi_event_loop_message_queue_subscribe( + furi_event_loop_subscribe_message_queue( data->producer_event_loop, data->mq, FuriEventLoopEventOut, @@ -73,7 +72,7 @@ int32_t test_furi_event_loop_producer(void* p) { // 2 EventLoop index, 0xFFFFFFFF - all possible flags, emulate uncleared flags xTaskNotifyIndexed(xTaskGetCurrentTaskHandle(), 2, 0xFFFFFFFF, eSetBits); - furi_event_loop_message_queue_unsubscribe(data->producer_event_loop, data->mq); + furi_event_loop_unsubscribe(data->producer_event_loop, data->mq); furi_event_loop_free(data->producer_event_loop); FURI_LOG_I(TAG, "producer start 2nd run"); @@ -81,7 +80,7 @@ int32_t test_furi_event_loop_producer(void* p) { data->producer_counter = 0; data->producer_event_loop = furi_event_loop_alloc(); - furi_event_loop_message_queue_subscribe( + furi_event_loop_subscribe_message_queue( data->producer_event_loop, data->mq, FuriEventLoopEventOut, @@ -90,7 +89,7 @@ int32_t test_furi_event_loop_producer(void* p) { furi_event_loop_run(data->producer_event_loop); - furi_event_loop_message_queue_unsubscribe(data->producer_event_loop, data->mq); + furi_event_loop_unsubscribe(data->producer_event_loop, data->mq); furi_event_loop_free(data->producer_event_loop); FURI_LOG_I(TAG, "producer end"); @@ -98,11 +97,11 @@ int32_t test_furi_event_loop_producer(void* p) { return 0; } -bool test_furi_event_loop_consumer_mq_callback(FuriMessageQueue* queue, void* context) { +bool test_furi_event_loop_consumer_mq_callback(FuriEventLoopObject* object, void* context) { furi_check(context); TestFuriData* data = context; - furi_check(data->mq == queue); + furi_check(data->mq == object); furi_delay_us(furi_hal_random_get() % 1000); furi_check(furi_message_queue_get(data->mq, &data->consumer_counter, 0) == FuriStatusOk); @@ -110,16 +109,15 @@ bool test_furi_event_loop_consumer_mq_callback(FuriMessageQueue* queue, void* co FURI_LOG_I( TAG, "consumer_mq_callback: %lu %lu", data->producer_counter, data->consumer_counter); - // Remove and add should not cause crash - // if(data->producer_counter == EVENT_LOOP_EVENT_COUNT/2) { - // furi_event_loop_message_queue_remove(data->consumer_event_loop, data->mq); - // furi_event_loop_message_queue_add( - // data->consumer_event_loop, - // data->mq, - // FuriEventLoopEventIn, - // test_furi_event_loop_producer_mq_callback, - // data); - // } + if(data->consumer_counter == EVENT_LOOP_EVENT_COUNT / 2) { + furi_event_loop_unsubscribe(data->consumer_event_loop, data->mq); + furi_event_loop_subscribe_message_queue( + data->consumer_event_loop, + data->mq, + FuriEventLoopEventIn, + test_furi_event_loop_consumer_mq_callback, + data); + } if(data->consumer_counter == EVENT_LOOP_EVENT_COUNT) { furi_event_loop_stop(data->consumer_event_loop); @@ -137,7 +135,7 @@ int32_t test_furi_event_loop_consumer(void* p) { FURI_LOG_I(TAG, "consumer start 1st run"); data->consumer_event_loop = furi_event_loop_alloc(); - furi_event_loop_message_queue_subscribe( + furi_event_loop_subscribe_message_queue( data->consumer_event_loop, data->mq, FuriEventLoopEventIn, @@ -149,14 +147,14 @@ int32_t test_furi_event_loop_consumer(void* p) { // 2 EventLoop index, 0xFFFFFFFF - all possible flags, emulate uncleared flags xTaskNotifyIndexed(xTaskGetCurrentTaskHandle(), 2, 0xFFFFFFFF, eSetBits); - furi_event_loop_message_queue_unsubscribe(data->consumer_event_loop, data->mq); + furi_event_loop_unsubscribe(data->consumer_event_loop, data->mq); furi_event_loop_free(data->consumer_event_loop); FURI_LOG_I(TAG, "consumer start 2nd run"); data->consumer_counter = 0; data->consumer_event_loop = furi_event_loop_alloc(); - furi_event_loop_message_queue_subscribe( + furi_event_loop_subscribe_message_queue( data->consumer_event_loop, data->mq, FuriEventLoopEventIn, @@ -165,7 +163,7 @@ int32_t test_furi_event_loop_consumer(void* p) { furi_event_loop_run(data->consumer_event_loop); - furi_event_loop_message_queue_unsubscribe(data->consumer_event_loop, data->mq); + furi_event_loop_unsubscribe(data->consumer_event_loop, data->mq); furi_event_loop_free(data->consumer_event_loop); FURI_LOG_I(TAG, "consumer end"); diff --git a/applications/debug/unit_tests/tests/rpc/rpc_test.c b/applications/debug/unit_tests/tests/rpc/rpc_test.c index 63ea706ed6..5d26bdb306 100644 --- a/applications/debug/unit_tests/tests/rpc/rpc_test.c +++ b/applications/debug/unit_tests/tests/rpc/rpc_test.c @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -35,8 +36,8 @@ static uint32_t command_id = 0; typedef struct { RpcSession* session; FuriStreamBuffer* output_stream; - FuriSemaphore* close_session_semaphore; - FuriSemaphore* terminate_semaphore; + FuriApiLock session_close_lock; + FuriApiLock session_terminate_lock; uint32_t timeout; } RpcSessionContext; @@ -92,8 +93,8 @@ static void test_rpc_setup(void) { rpc_session[0].output_stream = furi_stream_buffer_alloc(4096, 1); rpc_session_set_send_bytes_callback(rpc_session[0].session, output_bytes_callback); - rpc_session[0].close_session_semaphore = furi_semaphore_alloc(1, 0); - rpc_session[0].terminate_semaphore = furi_semaphore_alloc(1, 0); + rpc_session[0].session_close_lock = api_lock_alloc_locked(); + rpc_session[0].session_terminate_lock = api_lock_alloc_locked(); rpc_session_set_close_callback(rpc_session[0].session, test_rpc_session_close_callback); rpc_session_set_terminated_callback( rpc_session[0].session, test_rpc_session_terminated_callback); @@ -112,8 +113,8 @@ static void test_rpc_setup_second_session(void) { rpc_session[1].output_stream = furi_stream_buffer_alloc(1000, 1); rpc_session_set_send_bytes_callback(rpc_session[1].session, output_bytes_callback); - rpc_session[1].close_session_semaphore = furi_semaphore_alloc(1, 0); - rpc_session[1].terminate_semaphore = furi_semaphore_alloc(1, 0); + rpc_session[1].session_close_lock = api_lock_alloc_locked(); + rpc_session[1].session_terminate_lock = api_lock_alloc_locked(); rpc_session_set_close_callback(rpc_session[1].session, test_rpc_session_close_callback); rpc_session_set_terminated_callback( rpc_session[1].session, test_rpc_session_terminated_callback); @@ -121,36 +122,32 @@ static void test_rpc_setup_second_session(void) { } static void test_rpc_teardown(void) { - furi_check(rpc_session[0].close_session_semaphore); - furi_semaphore_acquire(rpc_session[0].terminate_semaphore, 0); + furi_check(rpc_session[0].session_close_lock); + api_lock_relock(rpc_session[0].session_terminate_lock); rpc_session_close(rpc_session[0].session); - furi_check( - furi_semaphore_acquire(rpc_session[0].terminate_semaphore, FuriWaitForever) == - FuriStatusOk); + api_lock_wait_unlock(rpc_session[0].session_terminate_lock); furi_record_close(RECORD_RPC); furi_stream_buffer_free(rpc_session[0].output_stream); - furi_semaphore_free(rpc_session[0].close_session_semaphore); - furi_semaphore_free(rpc_session[0].terminate_semaphore); + api_lock_free(rpc_session[0].session_close_lock); + api_lock_free(rpc_session[0].session_terminate_lock); ++command_id; rpc_session[0].output_stream = NULL; - rpc_session[0].close_session_semaphore = NULL; + rpc_session[0].session_close_lock = NULL; rpc = NULL; rpc_session[0].session = NULL; } static void test_rpc_teardown_second_session(void) { - furi_check(rpc_session[1].close_session_semaphore); - furi_semaphore_acquire(rpc_session[1].terminate_semaphore, 0); + furi_check(rpc_session[1].session_close_lock); + api_lock_relock(rpc_session[1].session_terminate_lock); rpc_session_close(rpc_session[1].session); - furi_check( - furi_semaphore_acquire(rpc_session[1].terminate_semaphore, FuriWaitForever) == - FuriStatusOk); + api_lock_wait_unlock(rpc_session[1].session_terminate_lock); furi_stream_buffer_free(rpc_session[1].output_stream); - furi_semaphore_free(rpc_session[1].close_session_semaphore); - furi_semaphore_free(rpc_session[1].terminate_semaphore); + api_lock_free(rpc_session[1].session_close_lock); + api_lock_free(rpc_session[1].session_terminate_lock); ++command_id; rpc_session[1].output_stream = NULL; - rpc_session[1].close_session_semaphore = NULL; + rpc_session[1].session_close_lock = NULL; rpc_session[1].session = NULL; } @@ -204,14 +201,14 @@ static void test_rpc_session_close_callback(void* context) { furi_check(context); RpcSessionContext* callbacks_context = context; - furi_check(furi_semaphore_release(callbacks_context->close_session_semaphore) == FuriStatusOk); + api_lock_unlock(callbacks_context->session_close_lock); } static void test_rpc_session_terminated_callback(void* context) { furi_check(context); RpcSessionContext* callbacks_context = context; - furi_check(furi_semaphore_release(callbacks_context->terminate_semaphore) == FuriStatusOk); + api_lock_unlock(callbacks_context->session_terminate_lock); } static void test_rpc_print_message_list(MsgList_t msg_list) { @@ -1645,7 +1642,7 @@ static void test_rpc_feed_rubbish_run( test_rpc_add_empty_to_list(expected, PB_CommandStatus_ERROR_DECODE, 0); - furi_check(furi_semaphore_acquire(rpc_session[0].close_session_semaphore, 0) != FuriStatusOk); + furi_check(api_lock_is_locked(rpc_session[0].session_close_lock)); test_rpc_encode_and_feed(input_before, 0); test_send_rubbish(rpc_session[0].session, pattern, pattern_size, size); test_rpc_encode_and_feed(input_after, 0); diff --git a/applications/debug/unit_tests/unit_test_api_table_i.h b/applications/debug/unit_tests/unit_test_api_table_i.h index 1adec4db26..50524e5b7d 100644 --- a/applications/debug/unit_tests/unit_test_api_table_i.h +++ b/applications/debug/unit_tests/unit_test_api_table_i.h @@ -36,14 +36,10 @@ static constexpr auto unit_tests_api_table = sort(create_array_t( API_METHOD(furi_event_loop_alloc, FuriEventLoop*, (void)), API_METHOD(furi_event_loop_free, void, (FuriEventLoop*)), API_METHOD( - furi_event_loop_message_queue_subscribe, + furi_event_loop_subscribe_message_queue, void, - (FuriEventLoop*, - FuriMessageQueue*, - FuriEventLoopEvent, - FuriEventLoopMessageQueueCallback, - void*)), - API_METHOD(furi_event_loop_message_queue_unsubscribe, void, (FuriEventLoop*, FuriMessageQueue*)), + (FuriEventLoop*, FuriMessageQueue*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*)), + API_METHOD(furi_event_loop_unsubscribe, void, (FuriEventLoop*, FuriEventLoopObject*)), API_METHOD(furi_event_loop_run, void, (FuriEventLoop*)), API_METHOD(furi_event_loop_stop, void, (FuriEventLoop*)), API_VARIABLE(PB_Main_msg, PB_Main_msg_t))); diff --git a/applications/debug/usb_test/usb_test.c b/applications/debug/usb_test/usb_test.c index ddec9d9b05..a71ac3c6e4 100644 --- a/applications/debug/usb_test/usb_test.c +++ b/applications/debug/usb_test/usb_test.c @@ -63,7 +63,6 @@ UsbTestApp* usb_test_app_alloc(void) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views diff --git a/applications/examples/example_ble_beacon/ble_beacon_app.c b/applications/examples/example_ble_beacon/ble_beacon_app.c index faa3feb915..16979543c8 100644 --- a/applications/examples/example_ble_beacon/ble_beacon_app.c +++ b/applications/examples/example_ble_beacon/ble_beacon_app.c @@ -75,7 +75,6 @@ static BleBeaconApp* ble_beacon_app_alloc(void) { view_dispatcher_set_tick_event_callback( app->view_dispatcher, ble_beacon_app_tick_event_callback, 100); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); - view_dispatcher_enable_queue(app->view_dispatcher); app->submenu = submenu_alloc(); view_dispatcher_add_view( diff --git a/applications/examples/example_event_loop/application.fam b/applications/examples/example_event_loop/application.fam new file mode 100644 index 0000000000..a37ffb1a04 --- /dev/null +++ b/applications/examples/example_event_loop/application.fam @@ -0,0 +1,36 @@ +App( + appid="example_event_loop_timer", + name="Example: Event Loop Timer", + apptype=FlipperAppType.EXTERNAL, + sources=["example_event_loop_timer.c"], + entry_point="example_event_loop_timer_app", + fap_category="Examples", +) + +App( + appid="example_event_loop_mutex", + name="Example: Event Loop Mutex", + apptype=FlipperAppType.EXTERNAL, + sources=["example_event_loop_mutex.c"], + entry_point="example_event_loop_mutex_app", + fap_category="Examples", +) + +App( + appid="example_event_loop_stream_buffer", + name="Example: Event Loop Stream Buffer", + apptype=FlipperAppType.EXTERNAL, + sources=["example_event_loop_stream_buffer.c"], + entry_point="example_event_loop_stream_buffer_app", + fap_category="Examples", +) + +App( + appid="example_event_loop_multi", + name="Example: Event Loop Multi", + apptype=FlipperAppType.EXTERNAL, + sources=["example_event_loop_multi.c"], + entry_point="example_event_loop_multi_app", + requires=["gui"], + fap_category="Examples", +) diff --git a/applications/examples/example_event_loop/example_event_loop_multi.c b/applications/examples/example_event_loop/example_event_loop_multi.c new file mode 100644 index 0000000000..ebfb009118 --- /dev/null +++ b/applications/examples/example_event_loop/example_event_loop_multi.c @@ -0,0 +1,342 @@ +/** + * @file example_event_loop_multi.c + * @brief Example application that demonstrates multiple primitives used with two FuriEventLoop instances. + * + * This application simulates a complex use case of having two concurrent event loops (each one executing in + * its own thread) using a stream buffer for communication and additional timers and message passing to handle + * the keypad input. Additionally, it shows how to use thread signals to stop an event loop in another thread. + * The GUI functionality is there only for the purpose of exclusive access to the input events. + * + * The application's functionality consists of the following: + * - Print keypad key names and types when pressed, + * - If the Back key is long-pressed, a countdown starts upon completion of which the app exits, + * - The countdown can be cancelled by long-pressing the Ok button, it also resets the counter, + * - Blocks of random data are periodically generated in a separate thread, + * - When ready, the main application thread gets notified and prints the data. + */ + +#include +#include +#include + +#include + +#define TAG "ExampleEventLoopMulti" + +#define COUNTDOWN_START_VALUE (5UL) +#define COUNTDOWN_INTERVAL_MS (1000UL) +#define WORKER_DATA_INTERVAL_MS (1500UL) + +#define INPUT_QUEUE_SIZE (8) +#define STREAM_BUFFER_SIZE (16) + +typedef struct { + FuriEventLoop* event_loop; + FuriEventLoopTimer* timer; + FuriStreamBuffer* stream_buffer; +} EventLoopMultiAppWorker; + +typedef struct { + Gui* gui; + ViewPort* view_port; + FuriThread* worker_thread; + FuriEventLoop* event_loop; + FuriMessageQueue* input_queue; + FuriEventLoopTimer* exit_timer; + FuriStreamBuffer* stream_buffer; + uint32_t exit_countdown_value; +} EventLoopMultiApp; + +/* + * Worker functions + */ + +// This function is executed each time the data is taken out of the stream buffer. It is used to restart the worker timer. +static bool + event_loop_multi_app_stream_buffer_worker_callback(FuriEventLoopObject* object, void* context) { + furi_assert(context); + EventLoopMultiAppWorker* worker = context; + + furi_assert(object == worker->stream_buffer); + + FURI_LOG_I(TAG, "Data was removed from buffer"); + // Restart the timer to generate another block of random data. + furi_event_loop_timer_start(worker->timer, WORKER_DATA_INTERVAL_MS); + + return true; +} + +// This function is executed when the worker timer expires. The timer will NOT restart automatically +// since it is of one-shot type. +static void event_loop_multi_app_worker_timer_callback(void* context) { + furi_assert(context); + EventLoopMultiAppWorker* worker = context; + + // Generate a block of random data. + uint8_t data[STREAM_BUFFER_SIZE]; + furi_hal_random_fill_buf(data, sizeof(data)); + // Put the generated data in the stream buffer. + // IMPORTANT: No waiting in the event handlers! + furi_check( + furi_stream_buffer_send(worker->stream_buffer, &data, sizeof(data), 0) == sizeof(data)); +} + +static EventLoopMultiAppWorker* + event_loop_multi_app_worker_alloc(FuriStreamBuffer* stream_buffer) { + EventLoopMultiAppWorker* worker = malloc(sizeof(EventLoopMultiAppWorker)); + // Create the worker event loop. + worker->event_loop = furi_event_loop_alloc(); + // Create the timer governing the data generation. + // It is of one-shot type, i.e. it will not restart automatically upon expiration. + worker->timer = furi_event_loop_timer_alloc( + worker->event_loop, + event_loop_multi_app_worker_timer_callback, + FuriEventLoopTimerTypeOnce, + worker); + + // Using the same stream buffer as the main thread (it was already created beforehand). + worker->stream_buffer = stream_buffer; + // Notify the worker event loop about data being taken out of the stream buffer. + furi_event_loop_subscribe_stream_buffer( + worker->event_loop, + worker->stream_buffer, + FuriEventLoopEventOut | FuriEventLoopEventFlagEdge, + event_loop_multi_app_stream_buffer_worker_callback, + worker); + + return worker; +} + +static void event_loop_multi_app_worker_free(EventLoopMultiAppWorker* worker) { + // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. + // Failure to do so will result in a crash. + furi_event_loop_unsubscribe(worker->event_loop, worker->stream_buffer); + // IMPORTANT: All timers MUST be deleted before deleting the associated event loop. + // Failure to do so will result in a crash. + furi_event_loop_timer_free(worker->timer); + // Now it is okay to delete the event loop. + furi_event_loop_free(worker->event_loop); + + free(worker); +} + +static void event_loop_multi_app_worker_run(EventLoopMultiAppWorker* worker) { + furi_event_loop_timer_start(worker->timer, WORKER_DATA_INTERVAL_MS); + furi_event_loop_run(worker->event_loop); +} + +// This function is the worker thread body and (obviously) is executed in the worker thread. +static int32_t event_loop_multi_app_worker_thread(void* context) { + furi_assert(context); + EventLoopMultiApp* app = context; + + // Because an event loop is used, it MUST be created in the thread it will be run in. + // Therefore, the worker creation and deletion is handled in the worker thread. + EventLoopMultiAppWorker* worker = event_loop_multi_app_worker_alloc(app->stream_buffer); + event_loop_multi_app_worker_run(worker); + event_loop_multi_app_worker_free(worker); + + return 0; +} + +/* + * Main application functions + */ + +// This function is executed in the GUI context each time an input event occurs (e.g. the user pressed a key) +static void event_loop_multi_app_input_callback(InputEvent* event, void* context) { + furi_assert(context); + EventLoopMultiApp* app = context; + // Pass the event to the the application's input queue + furi_check(furi_message_queue_put(app->input_queue, event, FuriWaitForever) == FuriStatusOk); +} + +// This function is executed each time new data is available in the stream buffer. +static bool + event_loop_multi_app_stream_buffer_callback(FuriEventLoopObject* object, void* context) { + furi_assert(context); + EventLoopMultiApp* app = context; + + furi_assert(object == app->stream_buffer); + // Get the data from the stream buffer + uint8_t data[STREAM_BUFFER_SIZE]; + // IMPORTANT: No waiting in the event handlers! + furi_check( + furi_stream_buffer_receive(app->stream_buffer, &data, sizeof(data), 0) == sizeof(data)); + + // Format the data for printing and print it to the debug output. + FuriString* tmp_str = furi_string_alloc(); + for(uint32_t i = 0; i < sizeof(data); ++i) { + furi_string_cat_printf(tmp_str, "%02X ", data[i]); + } + + FURI_LOG_I(TAG, "Received data: %s", furi_string_get_cstr(tmp_str)); + furi_string_free(tmp_str); + + return true; +} + +// This function is executed each time a new message is inserted in the input queue. +static bool event_loop_multi_app_input_queue_callback(FuriEventLoopObject* object, void* context) { + furi_assert(context); + EventLoopMultiApp* app = context; + + furi_assert(object == app->input_queue); + + InputEvent event; + // IMPORTANT: No waiting in the event handlers! + furi_check(furi_message_queue_get(app->input_queue, &event, 0) == FuriStatusOk); + + if(event.type == InputTypeLong) { + // The user has long-pressed the Back key, try starting the countdown. + if(event.key == InputKeyBack) { + if(!furi_event_loop_timer_is_running(app->exit_timer)) { + // Actually start the countdown + FURI_LOG_I(TAG, "Starting exit countdown!"); + furi_event_loop_timer_start(app->exit_timer, COUNTDOWN_INTERVAL_MS); + + } else { + // The countdown is already in progress, print a warning message + FURI_LOG_W(TAG, "Countdown has already been started"); + } + + // The user has long-pressed the Ok key, try stopping the countdown. + } else if(event.key == InputKeyOk) { + if(furi_event_loop_timer_is_running(app->exit_timer)) { + // Actually cancel the countdown + FURI_LOG_I(TAG, "Exit countdown cancelled!"); + app->exit_countdown_value = COUNTDOWN_START_VALUE; + furi_event_loop_timer_stop(app->exit_timer); + + } else { + // The countdown is not running, print a warning message + FURI_LOG_W(TAG, "Countdown has not been started yet"); + } + + } else { + // Not a Back or Ok key, just print its name. + FURI_LOG_I(TAG, "Long press: %s", input_get_key_name(event.key)); + } + + } else if(event.type == InputTypeShort) { + // Not a long press, just print the key's name. + FURI_LOG_I(TAG, "Short press: %s", input_get_key_name(event.key)); + } + + return true; +} + +// This function is executed each time the countdown timer expires. +static void event_loop_multi_app_exit_timer_callback(void* context) { + furi_assert(context); + EventLoopMultiApp* app = context; + + FURI_LOG_I(TAG, "Exiting in %lu ...", app->exit_countdown_value); + + // If the coundown value has reached 0, exit the application + if(app->exit_countdown_value == 0) { + FURI_LOG_I(TAG, "Exiting NOW!"); + + // Send a signal to the worker thread to exit. + // A signal handler that handles FuriSignalExit is already set by default. + furi_thread_signal(app->worker_thread, FuriSignalExit, NULL); + // Request the application event loop to stop. + furi_event_loop_stop(app->event_loop); + + // Otherwise just decrement it and wait for the next time the timer expires. + } else { + app->exit_countdown_value -= 1; + } +} + +static EventLoopMultiApp* event_loop_multi_app_alloc(void) { + EventLoopMultiApp* app = malloc(sizeof(EventLoopMultiApp)); + // Create event loop instances. + app->event_loop = furi_event_loop_alloc(); + + // Create a worker thread instance. The worker event loop will execute inside it. + app->worker_thread = furi_thread_alloc_ex( + "EventLoopMultiWorker", 1024, event_loop_multi_app_worker_thread, app); + // Create a message queue to receive the input events. + app->input_queue = furi_message_queue_alloc(INPUT_QUEUE_SIZE, sizeof(InputEvent)); + // Create a stream buffer to receive the generated data. + app->stream_buffer = furi_stream_buffer_alloc(STREAM_BUFFER_SIZE, STREAM_BUFFER_SIZE); + // Create a timer to run the countdown. + app->exit_timer = furi_event_loop_timer_alloc( + app->event_loop, + event_loop_multi_app_exit_timer_callback, + FuriEventLoopTimerTypePeriodic, + app); + + app->gui = furi_record_open(RECORD_GUI); + app->view_port = view_port_alloc(); + // Start the countdown from this value + app->exit_countdown_value = COUNTDOWN_START_VALUE; + // Gain exclusive access to the input events + view_port_input_callback_set(app->view_port, event_loop_multi_app_input_callback, app); + gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen); + // Notify the event loop about incoming messages in the queue + furi_event_loop_subscribe_message_queue( + app->event_loop, + app->input_queue, + FuriEventLoopEventIn, + event_loop_multi_app_input_queue_callback, + app); + // Notify the event loop about new data in the stream buffer + furi_event_loop_subscribe_stream_buffer( + app->event_loop, + app->stream_buffer, + FuriEventLoopEventIn | FuriEventLoopEventFlagEdge, + event_loop_multi_app_stream_buffer_callback, + app); + + return app; +} + +static void event_loop_multi_app_free(EventLoopMultiApp* app) { + gui_remove_view_port(app->gui, app->view_port); + furi_record_close(RECORD_GUI); + // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. + // Failure to do so will result in a crash. + furi_event_loop_unsubscribe(app->event_loop, app->input_queue); + furi_event_loop_unsubscribe(app->event_loop, app->stream_buffer); + // Delete all instances + view_port_free(app->view_port); + furi_message_queue_free(app->input_queue); + furi_stream_buffer_free(app->stream_buffer); + // IMPORTANT: All timers MUST be deleted before deleting the associated event loop. + // Failure to do so will result in a crash. + furi_event_loop_timer_free(app->exit_timer); + furi_thread_free(app->worker_thread); + furi_event_loop_free(app->event_loop); + + free(app); +} + +static void event_loop_multi_app_run(EventLoopMultiApp* app) { + FURI_LOG_I(TAG, "Press keys to see them printed here."); + FURI_LOG_I(TAG, "Long press \"Back\" to exit after %lu seconds.", COUNTDOWN_START_VALUE); + FURI_LOG_I(TAG, "Long press \"Ok\" to cancel the countdown."); + + // Start the worker thread + furi_thread_start(app->worker_thread); + // Run the application event loop. This call will block until the application is about to exit. + furi_event_loop_run(app->event_loop); + // Wait for the worker thread to finish. + furi_thread_join(app->worker_thread); +} + +/******************************************************************* + * vvv START HERE vvv + * + * The application's entry point - referenced in application.fam + *******************************************************************/ +int32_t example_event_loop_multi_app(void* arg) { + UNUSED(arg); + + EventLoopMultiApp* app = event_loop_multi_app_alloc(); + event_loop_multi_app_run(app); + event_loop_multi_app_free(app); + + return 0; +} diff --git a/applications/examples/example_event_loop/example_event_loop_mutex.c b/applications/examples/example_event_loop/example_event_loop_mutex.c new file mode 100644 index 0000000000..d043f3f899 --- /dev/null +++ b/applications/examples/example_event_loop/example_event_loop_mutex.c @@ -0,0 +1,140 @@ +/** + * @file example_event_loop_mutex.c + * @brief Example application that demonstrates the FuriEventLoop and FuriMutex integration. + * + * This application simulates a use case where a time-consuming blocking operation is executed + * in a separate thread and a mutex is being used for synchronization. The application runs 10 iterations + * of the above mentioned simulated work and prints the results to the debug output each time, then exits. + */ + +#include +#include + +#define TAG "ExampleEventLoopMutex" + +#define WORKER_ITERATION_COUNT (10) +// We are interested in IN events (for the mutex, that means that the mutex has been released), +// using edge trigger mode (reacting only to changes in mutex state) and +// employing one-shot mode to automatically unsubscribe before the event is processed. +#define MUTEX_EVENT_AND_FLAGS \ + (FuriEventLoopEventIn | FuriEventLoopEventFlagEdge | FuriEventLoopEventFlagOnce) + +typedef struct { + FuriEventLoop* event_loop; + FuriThread* worker_thread; + FuriMutex* worker_mutex; + uint8_t worker_result; +} EventLoopMutexApp; + +// This funciton is being run in a separate thread to simulate lenghty blocking operations +static int32_t event_loop_mutex_app_worker_thread(void* context) { + furi_assert(context); + EventLoopMutexApp* app = context; + + FURI_LOG_I(TAG, "Worker thread started"); + + // Run 10 iterations of simulated work + for(uint32_t i = 0; i < WORKER_ITERATION_COUNT; ++i) { + FURI_LOG_I(TAG, "Doing work ..."); + // Take the mutex so that no-one can access the worker_result variable + furi_check(furi_mutex_acquire(app->worker_mutex, FuriWaitForever) == FuriStatusOk); + // Simulate a blocking operation with a random delay between 900 and 1100 ms + const uint32_t work_time_ms = 900 + furi_hal_random_get() % 200; + furi_delay_ms(work_time_ms); + // Simulate a result with a random number between 0 and 255 + app->worker_result = furi_hal_random_get() % 0xFF; + + FURI_LOG_I(TAG, "Work done in %lu ms", work_time_ms); + // Release the mutex, which will notify the event loop that the result is ready + furi_check(furi_mutex_release(app->worker_mutex) == FuriStatusOk); + // Return control to the scheduler so that the event loop can take the mutex in its turn + furi_thread_yield(); + } + + FURI_LOG_I(TAG, "All work done, worker thread out!"); + // Request the event loop to stop + furi_event_loop_stop(app->event_loop); + + return 0; +} + +// This function is being run each time when the mutex gets released +static bool event_loop_mutex_app_event_callback(FuriEventLoopObject* object, void* context) { + furi_assert(context); + + EventLoopMutexApp* app = context; + furi_assert(object == app->worker_mutex); + + // Take the mutex so that no-one can access the worker_result variable + // IMPORTANT: the wait time MUST be 0, i.e. the event loop event callbacks + // must NOT ever block. If it is possible that the mutex will be taken by + // others, then the event callback code must take it into account. + furi_check(furi_mutex_acquire(app->worker_mutex, 0) == FuriStatusOk); + // Access the worker_result variable and print it. + FURI_LOG_I(TAG, "Result available! Value: %u", app->worker_result); + // Release the mutex, enabling the worker thread to continue when it's ready + furi_check(furi_mutex_release(app->worker_mutex) == FuriStatusOk); + // Subscribe for the mutex release events again, since we were unsubscribed automatically + // before processing the event. + furi_event_loop_subscribe_mutex( + app->event_loop, + app->worker_mutex, + MUTEX_EVENT_AND_FLAGS, + event_loop_mutex_app_event_callback, + app); + + return true; +} + +static EventLoopMutexApp* event_loop_mutex_app_alloc(void) { + EventLoopMutexApp* app = malloc(sizeof(EventLoopMutexApp)); + + // Create an event loop instance. + app->event_loop = furi_event_loop_alloc(); + // Create a worker thread instance. + app->worker_thread = furi_thread_alloc_ex( + "EventLoopMutexWorker", 1024, event_loop_mutex_app_worker_thread, app); + // Create a mutex instance. + app->worker_mutex = furi_mutex_alloc(FuriMutexTypeNormal); + // Subscribe for the mutex release events. + // Note that since FuriEventLoopEventFlagOneShot is used, we will be automatically unsubscribed + // from events before entering the event processing callback. This is necessary in order to not + // trigger on events caused by releasing the mutex in the callback. + furi_event_loop_subscribe_mutex( + app->event_loop, + app->worker_mutex, + MUTEX_EVENT_AND_FLAGS, + event_loop_mutex_app_event_callback, + app); + + return app; +} + +static void event_loop_mutex_app_free(EventLoopMutexApp* app) { + // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. + // Failure to do so will result in a crash. + furi_event_loop_unsubscribe(app->event_loop, app->worker_mutex); + // Delete all instances + furi_thread_free(app->worker_thread); + furi_mutex_free(app->worker_mutex); + furi_event_loop_free(app->event_loop); + + free(app); +} + +static void event_loop_mutex_app_run(EventLoopMutexApp* app) { + furi_thread_start(app->worker_thread); + furi_event_loop_run(app->event_loop); + furi_thread_join(app->worker_thread); +} + +// The application's entry point - referenced in application.fam +int32_t example_event_loop_mutex_app(void* arg) { + UNUSED(arg); + + EventLoopMutexApp* app = event_loop_mutex_app_alloc(); + event_loop_mutex_app_run(app); + event_loop_mutex_app_free(app); + + return 0; +} diff --git a/applications/examples/example_event_loop/example_event_loop_stream_buffer.c b/applications/examples/example_event_loop/example_event_loop_stream_buffer.c new file mode 100644 index 0000000000..65dbd83cf5 --- /dev/null +++ b/applications/examples/example_event_loop/example_event_loop_stream_buffer.c @@ -0,0 +1,131 @@ +/** + * @file example_event_loop_stream_buffer.c + * @brief Example application that demonstrates the FuriEventLoop and FuriStreamBuffer integration. + * + * This application simulates a use case where some data data stream comes from a separate thread (or hardware) + * and a stream buffer is used to act as an intermediate buffer. The worker thread produces 10 iterations of 32 + * bytes of simulated data, and each time when the buffer is half-filled, the data is taken out of it and printed + * to the debug output. After completing all iterations, the application exits. + */ + +#include +#include + +#define TAG "ExampleEventLoopStreamBuffer" + +#define WORKER_ITERATION_COUNT (10) + +#define STREAM_BUFFER_SIZE (32) +#define STREAM_BUFFER_TRIG_LEVEL (STREAM_BUFFER_SIZE / 2) +#define STREAM_BUFFER_EVENT_AND_FLAGS (FuriEventLoopEventIn | FuriEventLoopEventFlagEdge) + +typedef struct { + FuriEventLoop* event_loop; + FuriThread* worker_thread; + FuriStreamBuffer* stream_buffer; +} EventLoopStreamBufferApp; + +// This funciton is being run in a separate thread to simulate data coming from a producer thread or some device. +static int32_t event_loop_stream_buffer_app_worker_thread(void* context) { + furi_assert(context); + EventLoopStreamBufferApp* app = context; + + FURI_LOG_I(TAG, "Worker thread started"); + + for(uint32_t i = 0; i < WORKER_ITERATION_COUNT; ++i) { + // Produce 32 bytes of simulated data. + for(uint32_t j = 0; j < STREAM_BUFFER_SIZE; ++j) { + // Simulate incoming data by generating a random byte. + uint8_t data = furi_hal_random_get() % 0xFF; + // Put the byte in the buffer. Depending on the use case, it may or may be not acceptable + // to wait for free space to become available. + furi_check( + furi_stream_buffer_send(app->stream_buffer, &data, 1, FuriWaitForever) == 1); + // Delay between 30 and 50 ms to slow down the output for clarity. + furi_delay_ms(30 + furi_hal_random_get() % 20); + } + } + + FURI_LOG_I(TAG, "All work done, worker thread out!"); + // Request the event loop to stop + furi_event_loop_stop(app->event_loop); + + return 0; +} + +// This function is being run each time when the number of bytes in the buffer is above its trigger level. +static bool + event_loop_stream_buffer_app_event_callback(FuriEventLoopObject* object, void* context) { + furi_assert(context); + EventLoopStreamBufferApp* app = context; + + furi_assert(object == app->stream_buffer); + + // Temporary buffer that can hold at most half of the stream buffer's capacity. + uint8_t data[STREAM_BUFFER_TRIG_LEVEL]; + // Receive the data. It is guaranteed that the amount of data in the buffer will be equal to + // or greater than the trigger level, therefore, no waiting delay is necessary. + furi_check( + furi_stream_buffer_receive(app->stream_buffer, data, sizeof(data), 0) == sizeof(data)); + + // Format the data for printing and print it to the debug output. + FuriString* tmp_str = furi_string_alloc(); + for(uint32_t i = 0; i < sizeof(data); ++i) { + furi_string_cat_printf(tmp_str, "%02X ", data[i]); + } + + FURI_LOG_I(TAG, "Received data: %s", furi_string_get_cstr(tmp_str)); + furi_string_free(tmp_str); + + return true; +} + +static EventLoopStreamBufferApp* event_loop_stream_buffer_app_alloc(void) { + EventLoopStreamBufferApp* app = malloc(sizeof(EventLoopStreamBufferApp)); + + // Create an event loop instance. + app->event_loop = furi_event_loop_alloc(); + // Create a worker thread instance. + app->worker_thread = furi_thread_alloc_ex( + "EventLoopStreamBufferWorker", 1024, event_loop_stream_buffer_app_worker_thread, app); + // Create a stream_buffer instance. + app->stream_buffer = furi_stream_buffer_alloc(STREAM_BUFFER_SIZE, STREAM_BUFFER_TRIG_LEVEL); + // Subscribe for the stream buffer IN events in edge triggered mode. + furi_event_loop_subscribe_stream_buffer( + app->event_loop, + app->stream_buffer, + STREAM_BUFFER_EVENT_AND_FLAGS, + event_loop_stream_buffer_app_event_callback, + app); + + return app; +} + +static void event_loop_stream_buffer_app_free(EventLoopStreamBufferApp* app) { + // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. + // Failure to do so will result in a crash. + furi_event_loop_unsubscribe(app->event_loop, app->stream_buffer); + // Delete all instances + furi_thread_free(app->worker_thread); + furi_stream_buffer_free(app->stream_buffer); + furi_event_loop_free(app->event_loop); + + free(app); +} + +static void event_loop_stream_buffer_app_run(EventLoopStreamBufferApp* app) { + furi_thread_start(app->worker_thread); + furi_event_loop_run(app->event_loop); + furi_thread_join(app->worker_thread); +} + +// The application's entry point - referenced in application.fam +int32_t example_event_loop_stream_buffer_app(void* arg) { + UNUSED(arg); + + EventLoopStreamBufferApp* app = event_loop_stream_buffer_app_alloc(); + event_loop_stream_buffer_app_run(app); + event_loop_stream_buffer_app_free(app); + + return 0; +} diff --git a/applications/examples/example_event_loop/example_event_loop_timer.c b/applications/examples/example_event_loop/example_event_loop_timer.c new file mode 100644 index 0000000000..e255f6b61b --- /dev/null +++ b/applications/examples/example_event_loop/example_event_loop_timer.c @@ -0,0 +1,87 @@ +/** + * @file example_event_loop_timer.c + * @brief Example application that demonstrates FuriEventLoop's software timer capability. + * + * This application prints a countdown from 10 to 0 to the debug output and then exits. + * Despite only one timer being used in this example for clarity, an event loop instance can have + * an arbitrary number of independent timers of any type (periodic or one-shot). + * + */ +#include + +#define TAG "ExampleEventLoopTimer" + +#define COUNTDOWN_START_VALUE (10) +#define COUNTDOWN_INTERVAL_MS (1000) + +typedef struct { + FuriEventLoop* event_loop; + FuriEventLoopTimer* timer; + uint32_t countdown_value; +} EventLoopTimerApp; + +// This function is called each time the timer expires (i.e. once per 1000 ms (1s) in this example) +static void event_loop_timer_callback(void* context) { + furi_assert(context); + EventLoopTimerApp* app = context; + + // Print the countdown value + FURI_LOG_I(TAG, "T-00:00:%02lu", app->countdown_value); + + if(app->countdown_value == 0) { + // If the countdown reached 0, print the final line and stop the event loop + FURI_LOG_I(TAG, "Blast off to adventure!"); + // After this call, the control will be returned back to event_loop_timers_app_run() + furi_event_loop_stop(app->event_loop); + + } else { + // Decrement the countdown value + app->countdown_value -= 1; + } +} + +static EventLoopTimerApp* event_loop_timer_app_alloc(void) { + EventLoopTimerApp* app = malloc(sizeof(EventLoopTimerApp)); + + // Create an event loop instance. + app->event_loop = furi_event_loop_alloc(); + // Create a software timer instance. + // The timer is bound to the event loop instance and will execute in its context. + // Here, the timer type is periodic, i.e. it will restart automatically after expiring. + app->timer = furi_event_loop_timer_alloc( + app->event_loop, event_loop_timer_callback, FuriEventLoopTimerTypePeriodic, app); + // The countdown value will be tracked in this variable. + app->countdown_value = COUNTDOWN_START_VALUE; + + return app; +} + +static void event_loop_timer_app_free(EventLoopTimerApp* app) { + // IMPORTANT: All event loop timers MUST be deleted BEFORE deleting the event loop itself. + // Failure to do so will result in a crash. + furi_event_loop_timer_free(app->timer); + // With all timers deleted, it's safe to delete the event loop. + furi_event_loop_free(app->event_loop); + free(app); +} + +static void event_loop_timer_app_run(EventLoopTimerApp* app) { + FURI_LOG_I(TAG, "All systems go! Prepare for countdown!"); + + // Timers can be started either before the event loop is run, or in any + // callback function called by a running event loop. + furi_event_loop_timer_start(app->timer, COUNTDOWN_INTERVAL_MS); + // This call will block until furi_event_loop_stop() is called. + furi_event_loop_run(app->event_loop); +} + +// The application's entry point - referenced in application.fam +int32_t example_event_loop_timer_app(void* arg) { + UNUSED(arg); + + EventLoopTimerApp* app = event_loop_timer_app_alloc(); + event_loop_timer_app_run(app); + event_loop_timer_app_free(app); + + return 0; +} diff --git a/applications/examples/example_view_dispatcher/application.fam b/applications/examples/example_view_dispatcher/application.fam new file mode 100644 index 0000000000..f7b743bcf5 --- /dev/null +++ b/applications/examples/example_view_dispatcher/application.fam @@ -0,0 +1,8 @@ +App( + appid="example_view_dispatcher", + name="Example: ViewDispatcher", + apptype=FlipperAppType.EXTERNAL, + entry_point="example_view_dispatcher_app", + requires=["gui"], + fap_category="Examples", +) diff --git a/applications/examples/example_view_dispatcher/example_view_dispatcher.c b/applications/examples/example_view_dispatcher/example_view_dispatcher.c new file mode 100644 index 0000000000..71d29edfd9 --- /dev/null +++ b/applications/examples/example_view_dispatcher/example_view_dispatcher.c @@ -0,0 +1,173 @@ +/** + * @file example_view_dispatcher.c + * @brief Example application demonstrating the usage of the ViewDispatcher library. + * + * This application can display one of two views: either a Widget or a Submenu. + * Each view has its own way of switching to another one: + * + * - A center button in the Widget view. + * - A submenu item in the Submenu view + * + * Press either to switch to a different view. Press Back to exit the application. + * + */ + +#include +#include + +#include +#include + +// Enumeration of the view indexes. +typedef enum { + ViewIndexWidget, + ViewIndexSubmenu, + ViewIndexCount, +} ViewIndex; + +// Enumeration of submenu items. +typedef enum { + SubmenuIndexNothing, + SubmenuIndexSwitchView, +} SubmenuIndex; + +// Main application structure. +typedef struct { + ViewDispatcher* view_dispatcher; + Widget* widget; + Submenu* submenu; +} ExampleViewDispatcherApp; + +// This function is called when the user has pressed the Back key. +static bool example_view_dispatcher_app_navigation_callback(void* context) { + furi_assert(context); + ExampleViewDispatcherApp* app = context; + // Back means exit the application, which can be done by stopping the ViewDispatcher. + view_dispatcher_stop(app->view_dispatcher); + return true; +} + +// This function is called when there are custom events to process. +static bool example_view_dispatcher_app_custom_event_callback(void* context, uint32_t event) { + furi_assert(context); + ExampleViewDispatcherApp* app = context; + // The event numerical value can mean different things (the application is responsible to uphold its chosen convention) + // In this example, the only possible meaning is the view index to switch to. + furi_assert(event < ViewIndexCount); + // Switch to the requested view. + view_dispatcher_switch_to_view(app->view_dispatcher, event); + + return true; +} + +// This function is called when the user presses the "Switch View" button on the Widget view. +static void example_view_dispatcher_app_button_callback( + GuiButtonType button_type, + InputType input_type, + void* context) { + furi_assert(context); + ExampleViewDispatcherApp* app = context; + // Only request the view switch if the user short-presses the Center button. + if(button_type == GuiButtonTypeCenter && input_type == InputTypeShort) { + // Request switch to the Submenu view via the custom event queue. + view_dispatcher_send_custom_event(app->view_dispatcher, ViewIndexSubmenu); + } +} + +// This function is called when the user activates the "Switch View" submenu item. +static void example_view_dispatcher_app_submenu_callback(void* context, uint32_t index) { + furi_assert(context); + ExampleViewDispatcherApp* app = context; + // Only request the view switch if the user activates the "Switch View" item. + if(index == SubmenuIndexSwitchView) { + // Request switch to the Widget view via the custom event queue. + view_dispatcher_send_custom_event(app->view_dispatcher, ViewIndexWidget); + } +} + +// Application constructor function. +static ExampleViewDispatcherApp* example_view_dispatcher_app_alloc() { + ExampleViewDispatcherApp* app = malloc(sizeof(ExampleViewDispatcherApp)); + // Access the GUI API instance. + Gui* gui = furi_record_open(RECORD_GUI); + // Create and initialize the Widget view. + app->widget = widget_alloc(); + widget_add_string_multiline_element( + app->widget, 64, 32, AlignCenter, AlignCenter, FontSecondary, "Press the Button below"); + widget_add_button_element( + app->widget, + GuiButtonTypeCenter, + "Switch View", + example_view_dispatcher_app_button_callback, + app); + // Create and initialize the Submenu view. + app->submenu = submenu_alloc(); + submenu_add_item(app->submenu, "Do Nothing", SubmenuIndexNothing, NULL, NULL); + submenu_add_item( + app->submenu, + "Switch View", + SubmenuIndexSwitchView, + example_view_dispatcher_app_submenu_callback, + app); + // Create the ViewDispatcher instance. + app->view_dispatcher = view_dispatcher_alloc(); + // Let the GUI know about this ViewDispatcher instance. + view_dispatcher_attach_to_gui(app->view_dispatcher, gui, ViewDispatcherTypeFullscreen); + // Register the views within the ViewDispatcher instance. This alone will not show any of them on the screen. + // Each view must have its own index to refer to it later (it is best done via an enumeration as shown here). + view_dispatcher_add_view(app->view_dispatcher, ViewIndexWidget, widget_get_view(app->widget)); + view_dispatcher_add_view( + app->view_dispatcher, ViewIndexSubmenu, submenu_get_view(app->submenu)); + // Set the custom event callback. It will be called each time a custom event is scheduled + // using the view_dispatcher_send_custom_callback() function. + view_dispatcher_set_custom_event_callback( + app->view_dispatcher, example_view_dispatcher_app_custom_event_callback); + // Set the navigation, or back button callback. It will be called if the user pressed the Back button + // and the event was not handled in the currently displayed view. + view_dispatcher_set_navigation_event_callback( + app->view_dispatcher, example_view_dispatcher_app_navigation_callback); + // The context will be passed to the callbacks as a parameter, so we have access to our application object. + view_dispatcher_set_event_callback_context(app->view_dispatcher, app); + + return app; +} + +// Application destructor function. +static void example_view_dispatcher_app_free(ExampleViewDispatcherApp* app) { + // All views must be un-registered (removed) from a ViewDispatcher instance + // before deleting it. Failure to do so will result in a crash. + view_dispatcher_remove_view(app->view_dispatcher, ViewIndexWidget); + view_dispatcher_remove_view(app->view_dispatcher, ViewIndexSubmenu); + // Now it is safe to delete the ViewDispatcher instance. + view_dispatcher_free(app->view_dispatcher); + // Delete the views + widget_free(app->widget); + submenu_free(app->submenu); + // End access to hte the GUI API. + furi_record_close(RECORD_GUI); + // Free the remaining memory. + free(app); +} + +static void example_view_dispatcher_app_run(ExampleViewDispatcherApp* app) { + // Display the Widget view on the screen. + view_dispatcher_switch_to_view(app->view_dispatcher, ViewIndexWidget); + // This function will block until view_dispatcher_stop() is called. + // Internally, it uses a FuriEventLoop (see FuriEventLoop examples for more info on this). + view_dispatcher_run(app->view_dispatcher); +} + +/******************************************************************* + * vvv START HERE vvv + * + * The application's entry point - referenced in application.fam + *******************************************************************/ +int32_t example_view_dispatcher_app(void* arg) { + UNUSED(arg); + + ExampleViewDispatcherApp* app = example_view_dispatcher_app_alloc(); + example_view_dispatcher_app_run(app); + example_view_dispatcher_app_free(app); + + return 0; +} diff --git a/applications/examples/example_view_holder/application.fam b/applications/examples/example_view_holder/application.fam new file mode 100644 index 0000000000..19ad8d2ac4 --- /dev/null +++ b/applications/examples/example_view_holder/application.fam @@ -0,0 +1,8 @@ +App( + appid="example_view_holder", + name="Example: ViewHolder", + apptype=FlipperAppType.EXTERNAL, + entry_point="example_view_holder_app", + requires=["gui"], + fap_category="Examples", +) diff --git a/applications/examples/example_view_holder/example_view_holder.c b/applications/examples/example_view_holder/example_view_holder.c new file mode 100644 index 0000000000..24907dbc26 --- /dev/null +++ b/applications/examples/example_view_holder/example_view_holder.c @@ -0,0 +1,78 @@ +/** + * @file example_view_holder.c + * @brief Example application demonstrating the usage of the ViewHolder library. + * + * This application will display a text box with some scrollable text in it. + * Press the Back key to exit the application. + */ + +#include +#include +#include + +#include + +// This function will be called when the user presses the Back button. +static void example_view_holder_back_callback(void* context) { + FuriApiLock exit_lock = context; + // Unlock the exit lock, thus enabling the app to exit. + api_lock_unlock(exit_lock); +} + +int32_t example_view_holder_app(void* arg) { + UNUSED(arg); + + // Access the GUI API instance. + Gui* gui = furi_record_open(RECORD_GUI); + // Create a TextBox view. The Gui object only accepts + // ViewPort instances, so we will need to address that later. + TextBox* text_box = text_box_alloc(); + // Set some text so that the text box is not empty. + text_box_set_text( + text_box, + "ViewHolder is being used\n" + "to show this TextBox view.\n\n" + "Scroll down to see more.\n\n\n" + "Press \"Back\" to exit."); + + // Create a ViewHolder instance. It will serve as an adapter to convert + // between the View type provided by the TextBox view and the ViewPort type + // that the GUI can actually display. + ViewHolder* view_holder = view_holder_alloc(); + // Let the GUI know about this ViewHolder instance. + view_holder_attach_to_gui(view_holder, gui); + // Set the view that we want to display. + view_holder_set_view(view_holder, text_box_get_view(text_box)); + + // The part below is not really related to this example, but is necessary for it to function. + // We need to somehow stall the application thread so that the view stays on the screen (otherwise + // the app will just exit and won't display anything) and at the same time we need a way to quit out + // of the application. + + // In this example, a simple FuriApiLock instance is used. A real-world application is likely to have some + // kind of event handling loop here instead. (see the ViewDispatcher example or one of FuriEventLoop + // examples for that). + + // Create a pre-locked FuriApiLock instance. + FuriApiLock exit_lock = api_lock_alloc_locked(); + // Set a Back event callback for the ViewHolder instance. It will be called when the user + // presses the Back button. We pass the exit lock instance as the context to be able to access + // it inside the callback function. + view_holder_set_back_callback(view_holder, example_view_holder_back_callback, exit_lock); + + // This call will block the application thread from running until the exit lock gets unlocked somehow + // (the only way it can happen in this example is via the back callback). + api_lock_wait_unlock_and_free(exit_lock); + + // The back key has been pressed, which unlocked the exit lock. The application is about to exit. + + // The view must be removed from a ViewHolder instance before deleting it. + view_holder_set_view(view_holder, NULL); + // Delete everything to prevent memory leaks. + view_holder_free(view_holder); + text_box_free(text_box); + // End access to the GUI API. + furi_record_close(RECORD_GUI); + + return 0; +} diff --git a/applications/main/archive/archive.c b/applications/main/archive/archive.c index 2345d3f7d4..7c23ee3154 100644 --- a/applications/main/archive/archive.c +++ b/applications/main/archive/archive.c @@ -30,7 +30,6 @@ ArchiveApp* archive_alloc(void) { archive->view_dispatcher = view_dispatcher_alloc(); ViewDispatcher* view_dispatcher = archive->view_dispatcher; - view_dispatcher_enable_queue(view_dispatcher); view_dispatcher_set_event_callback_context(view_dispatcher, archive); view_dispatcher_set_custom_event_callback(view_dispatcher, archive_custom_event_callback); view_dispatcher_set_navigation_event_callback(view_dispatcher, archive_back_event_callback); diff --git a/applications/main/bad_usb/bad_usb_app.c b/applications/main/bad_usb/bad_usb_app.c index 0f10d60d8f..2d2d4be86c 100644 --- a/applications/main/bad_usb/bad_usb_app.c +++ b/applications/main/bad_usb/bad_usb_app.c @@ -112,8 +112,6 @@ BadUsbApp* bad_usb_app_alloc(char* arg) { app->dialogs = furi_record_open(RECORD_DIALOGS); app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); - app->scene_manager = scene_manager_alloc(&bad_usb_scene_handlers, app); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); diff --git a/applications/main/gpio/gpio_app.c b/applications/main/gpio/gpio_app.c index 217423ecc3..234cc793a8 100644 --- a/applications/main/gpio/gpio_app.c +++ b/applications/main/gpio/gpio_app.c @@ -32,7 +32,6 @@ GpioApp* gpio_app_alloc(void) { app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&gpio_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( diff --git a/applications/main/ibutton/ibutton.c b/applications/main/ibutton/ibutton.c index b6e8a20cf9..765d536125 100644 --- a/applications/main/ibutton/ibutton.c +++ b/applications/main/ibutton/ibutton.c @@ -85,7 +85,6 @@ iButton* ibutton_alloc(void) { ibutton->scene_manager = scene_manager_alloc(&ibutton_scene_handlers, ibutton); ibutton->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(ibutton->view_dispatcher); view_dispatcher_set_event_callback_context(ibutton->view_dispatcher, ibutton); view_dispatcher_set_custom_event_callback( ibutton->view_dispatcher, ibutton_custom_event_callback); diff --git a/applications/main/infrared/infrared_app.c b/applications/main/infrared/infrared_app.c index d860aa3b23..db178fb42b 100644 --- a/applications/main/infrared/infrared_app.c +++ b/applications/main/infrared/infrared_app.c @@ -150,7 +150,6 @@ static InfraredApp* infrared_alloc(void) { infrared->gui = furi_record_open(RECORD_GUI); ViewDispatcher* view_dispatcher = infrared->view_dispatcher; - view_dispatcher_enable_queue(view_dispatcher); view_dispatcher_set_event_callback_context(view_dispatcher, infrared); view_dispatcher_set_custom_event_callback(view_dispatcher, infrared_custom_event_callback); view_dispatcher_set_navigation_event_callback(view_dispatcher, infrared_back_event_callback); diff --git a/applications/main/lfrfid/lfrfid.c b/applications/main/lfrfid/lfrfid.c index a405c0f853..b51a0da260 100644 --- a/applications/main/lfrfid/lfrfid.c +++ b/applications/main/lfrfid/lfrfid.c @@ -77,7 +77,6 @@ static LfRfid* lfrfid_alloc(void) { lfrfid->view_dispatcher = view_dispatcher_alloc(); lfrfid->scene_manager = scene_manager_alloc(&lfrfid_scene_handlers, lfrfid); - view_dispatcher_enable_queue(lfrfid->view_dispatcher); view_dispatcher_set_event_callback_context(lfrfid->view_dispatcher, lfrfid); view_dispatcher_set_custom_event_callback( lfrfid->view_dispatcher, lfrfid_debug_custom_event_callback); diff --git a/applications/main/nfc/nfc_app.c b/applications/main/nfc/nfc_app.c index 68b5d0c6fc..9f855f9e9f 100644 --- a/applications/main/nfc/nfc_app.c +++ b/applications/main/nfc/nfc_app.c @@ -41,7 +41,6 @@ NfcApp* nfc_app_alloc(void) { instance->view_dispatcher = view_dispatcher_alloc(); instance->scene_manager = scene_manager_alloc(&nfc_scene_handlers, instance); - view_dispatcher_enable_queue(instance->view_dispatcher); view_dispatcher_set_event_callback_context(instance->view_dispatcher, instance); view_dispatcher_set_custom_event_callback( instance->view_dispatcher, nfc_custom_event_callback); diff --git a/applications/main/subghz/subghz.c b/applications/main/subghz/subghz.c index 7a5fad74c9..30480054ec 100644 --- a/applications/main/subghz/subghz.c +++ b/applications/main/subghz/subghz.c @@ -97,7 +97,6 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { // View Dispatcher subghz->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(subghz->view_dispatcher); subghz->scene_manager = scene_manager_alloc(&subghz_scene_handlers, subghz); view_dispatcher_set_event_callback_context(subghz->view_dispatcher, subghz); diff --git a/applications/main/u2f/u2f_app.c b/applications/main/u2f/u2f_app.c index 68966390a9..58af40e7bb 100644 --- a/applications/main/u2f/u2f_app.c +++ b/applications/main/u2f/u2f_app.c @@ -29,7 +29,6 @@ U2fApp* u2f_app_alloc(void) { app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&u2f_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_tick_event_callback( app->view_dispatcher, u2f_app_tick_event_callback, 500); diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 66e503e967..e57e1eb00f 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -265,7 +265,6 @@ static Desktop* desktop_alloc(void) { desktop->view_dispatcher = view_dispatcher_alloc(); desktop->scene_manager = scene_manager_alloc(&desktop_scene_handlers, desktop); - view_dispatcher_enable_queue(desktop->view_dispatcher); view_dispatcher_attach_to_gui( desktop->view_dispatcher, desktop->gui, ViewDispatcherTypeDesktop); view_dispatcher_set_tick_event_callback( diff --git a/applications/services/dialogs/dialogs_module_file_browser.c b/applications/services/dialogs/dialogs_module_file_browser.c index b1558f1e95..12a7439e60 100644 --- a/applications/services/dialogs/dialogs_module_file_browser.c +++ b/applications/services/dialogs/dialogs_module_file_browser.c @@ -49,12 +49,11 @@ bool dialogs_app_process_module_file_browser(const DialogsAppMessageDataFileBrow file_browser_start(file_browser, data->preselected_filename); view_holder_set_view(view_holder, file_browser_get_view(file_browser)); - view_holder_start(view_holder); api_lock_wait_unlock(file_browser_context->lock); ret = file_browser_context->result; - view_holder_stop(view_holder); + view_holder_set_view(view_holder, NULL); view_holder_free(view_holder); file_browser_stop(file_browser); file_browser_free(file_browser); diff --git a/applications/services/dialogs/dialogs_module_message.c b/applications/services/dialogs/dialogs_module_message.c index a71f403c54..9dc9ff9cb9 100644 --- a/applications/services/dialogs/dialogs_module_message.c +++ b/applications/services/dialogs/dialogs_module_message.c @@ -88,12 +88,11 @@ DialogMessageButton dialogs_app_process_module_message(const DialogsAppMessageDa dialog_ex_set_right_button_text(dialog_ex, message->right_button_text); view_holder_set_view(view_holder, dialog_ex_get_view(dialog_ex)); - view_holder_start(view_holder); api_lock_wait_unlock(message_context->lock); ret = message_context->result; - view_holder_stop(view_holder); + view_holder_set_view(view_holder, NULL); view_holder_free(view_holder); dialog_ex_free(dialog_ex); api_lock_free(message_context->lock); diff --git a/applications/services/dolphin/dolphin.c b/applications/services/dolphin/dolphin.c index 198c1483a3..dd2ecd2ba1 100644 --- a/applications/services/dolphin/dolphin.c +++ b/applications/services/dolphin/dolphin.c @@ -192,8 +192,8 @@ static void dolphin_update_clear_limits_timer_period(void* context) { FURI_LOG_D(TAG, "Daily limits reset in %lu ms", time_to_clear_limits); } -static bool dolphin_process_event(FuriMessageQueue* queue, void* context) { - UNUSED(queue); +static bool dolphin_process_event(FuriEventLoopObject* object, void* context) { + UNUSED(object); Dolphin* dolphin = context; DolphinEvent event; @@ -280,7 +280,7 @@ int32_t dolphin_srv(void* p) { dolphin_init_state(dolphin); - furi_event_loop_message_queue_subscribe( + furi_event_loop_subscribe_message_queue( dolphin->event_loop, dolphin->event_queue, FuriEventLoopEventIn, diff --git a/applications/services/gui/view_dispatcher.c b/applications/services/gui/view_dispatcher.c index b4c534932f..63878fc190 100644 --- a/applications/services/gui/view_dispatcher.c +++ b/applications/services/gui/view_dispatcher.c @@ -2,6 +2,8 @@ #define TAG "ViewDispatcher" +#define VIEW_DISPATCHER_QUEUE_LEN (16U) + ViewDispatcher* view_dispatcher_alloc(void) { ViewDispatcher* view_dispatcher = malloc(sizeof(ViewDispatcher)); @@ -14,6 +16,26 @@ ViewDispatcher* view_dispatcher_alloc(void) { ViewDict_init(view_dispatcher->views); + view_dispatcher->event_loop = furi_event_loop_alloc(); + + view_dispatcher->input_queue = + furi_message_queue_alloc(VIEW_DISPATCHER_QUEUE_LEN, sizeof(InputEvent)); + furi_event_loop_subscribe_message_queue( + view_dispatcher->event_loop, + view_dispatcher->input_queue, + FuriEventLoopEventIn, + view_dispatcher_run_input_callback, + view_dispatcher); + + view_dispatcher->event_queue = + furi_message_queue_alloc(VIEW_DISPATCHER_QUEUE_LEN, sizeof(uint32_t)); + furi_event_loop_subscribe_message_queue( + view_dispatcher->event_loop, + view_dispatcher->event_queue, + FuriEventLoopEventIn, + view_dispatcher_run_event_callback, + view_dispatcher); + return view_dispatcher; } @@ -29,44 +51,19 @@ void view_dispatcher_free(ViewDispatcher* view_dispatcher) { // Free ViewPort view_port_free(view_dispatcher->view_port); // Free internal queue - if(view_dispatcher->input_queue) { - furi_event_loop_message_queue_unsubscribe( - view_dispatcher->event_loop, view_dispatcher->input_queue); - furi_message_queue_free(view_dispatcher->input_queue); - } - if(view_dispatcher->event_queue) { - furi_event_loop_message_queue_unsubscribe( - view_dispatcher->event_loop, view_dispatcher->event_queue); - furi_message_queue_free(view_dispatcher->event_queue); - } - if(view_dispatcher->event_loop) { - furi_event_loop_free(view_dispatcher->event_loop); - } + furi_event_loop_unsubscribe(view_dispatcher->event_loop, view_dispatcher->input_queue); + furi_event_loop_unsubscribe(view_dispatcher->event_loop, view_dispatcher->event_queue); + + furi_message_queue_free(view_dispatcher->input_queue); + furi_message_queue_free(view_dispatcher->event_queue); + + furi_event_loop_free(view_dispatcher->event_loop); // Free dispatcher free(view_dispatcher); } void view_dispatcher_enable_queue(ViewDispatcher* view_dispatcher) { - furi_check(view_dispatcher); - furi_check(view_dispatcher->event_loop == NULL); - - view_dispatcher->event_loop = furi_event_loop_alloc(); - - view_dispatcher->input_queue = furi_message_queue_alloc(16, sizeof(InputEvent)); - furi_event_loop_message_queue_subscribe( - view_dispatcher->event_loop, - view_dispatcher->input_queue, - FuriEventLoopEventIn, - view_dispatcher_run_input_callback, - view_dispatcher); - - view_dispatcher->event_queue = furi_message_queue_alloc(16, sizeof(uint32_t)); - furi_event_loop_message_queue_subscribe( - view_dispatcher->event_loop, - view_dispatcher->event_queue, - FuriEventLoopEventIn, - view_dispatcher_run_event_callback, - view_dispatcher); + UNUSED(view_dispatcher); } void view_dispatcher_set_navigation_event_callback( @@ -99,14 +96,12 @@ void view_dispatcher_set_event_callback_context(ViewDispatcher* view_dispatcher, FuriEventLoop* view_dispatcher_get_event_loop(ViewDispatcher* view_dispatcher) { furi_check(view_dispatcher); - furi_check(view_dispatcher->event_loop); return view_dispatcher->event_loop; } void view_dispatcher_run(ViewDispatcher* view_dispatcher) { furi_check(view_dispatcher); - furi_check(view_dispatcher->event_loop); uint32_t tick_period = view_dispatcher->tick_period == 0 ? FuriWaitForever : view_dispatcher->tick_period; @@ -134,7 +129,6 @@ void view_dispatcher_run(ViewDispatcher* view_dispatcher) { void view_dispatcher_stop(ViewDispatcher* view_dispatcher) { furi_check(view_dispatcher); - furi_check(view_dispatcher->event_loop); furi_event_loop_stop(view_dispatcher->event_loop); } @@ -242,13 +236,9 @@ void view_dispatcher_draw_callback(Canvas* canvas, void* context) { void view_dispatcher_input_callback(InputEvent* event, void* context) { ViewDispatcher* view_dispatcher = context; - if(view_dispatcher->input_queue) { - furi_check( - furi_message_queue_put(view_dispatcher->input_queue, event, FuriWaitForever) == - FuriStatusOk); - } else { - view_dispatcher_handle_input(view_dispatcher, event); - } + furi_check( + furi_message_queue_put(view_dispatcher->input_queue, event, FuriWaitForever) == + FuriStatusOk); } void view_dispatcher_handle_input(ViewDispatcher* view_dispatcher, InputEvent* event) { @@ -328,7 +318,6 @@ void view_dispatcher_handle_custom_event(ViewDispatcher* view_dispatcher, uint32 void view_dispatcher_send_custom_event(ViewDispatcher* view_dispatcher, uint32_t event) { furi_check(view_dispatcher); - furi_check(view_dispatcher->event_loop); furi_check( furi_message_queue_put(view_dispatcher->event_queue, &event, FuriWaitForever) == @@ -364,9 +353,7 @@ void view_dispatcher_set_current_view(ViewDispatcher* view_dispatcher, View* vie view_port_update(view_dispatcher->view_port); } else { view_port_enabled_set(view_dispatcher->view_port, false); - if(view_dispatcher->event_loop) { - view_dispatcher_stop(view_dispatcher); - } + view_dispatcher_stop(view_dispatcher); } } @@ -381,10 +368,10 @@ void view_dispatcher_update(View* view, void* context) { } } -bool view_dispatcher_run_event_callback(FuriMessageQueue* queue, void* context) { +bool view_dispatcher_run_event_callback(FuriEventLoopObject* object, void* context) { furi_assert(context); ViewDispatcher* instance = context; - furi_assert(instance->event_queue == queue); + furi_assert(instance->event_queue == object); uint32_t event; furi_check(furi_message_queue_get(instance->event_queue, &event, 0) == FuriStatusOk); @@ -393,10 +380,10 @@ bool view_dispatcher_run_event_callback(FuriMessageQueue* queue, void* context) return true; } -bool view_dispatcher_run_input_callback(FuriMessageQueue* queue, void* context) { +bool view_dispatcher_run_input_callback(FuriEventLoopObject* object, void* context) { furi_assert(context); ViewDispatcher* instance = context; - furi_assert(instance->input_queue == queue); + furi_assert(instance->input_queue == object); InputEvent input; furi_check(furi_message_queue_get(instance->input_queue, &input, 0) == FuriStatusOk); diff --git a/applications/services/gui/view_dispatcher.h b/applications/services/gui/view_dispatcher.h index 905c60975b..9fbf897918 100644 --- a/applications/services/gui/view_dispatcher.h +++ b/applications/services/gui/view_dispatcher.h @@ -2,6 +2,14 @@ * @file view_dispatcher.h * @brief GUI: ViewDispatcher API * + * ViewDispatcher is used to connect several Views to a Gui instance, switch between them and handle various events. + * This is useful in applications featuring an advanced graphical user interface. + * + * Internally, ViewDispatcher employs a FuriEventLoop instance together with two separate + * message queues for input and custom event handling. See FuriEventLoop for more information. + * + * If no multi-view or complex event handling capabilities are required, consider using ViewHolder instead. + * * @warning Views added to a ViewDispatcher MUST NOT be in a ViewStack at the same time. */ @@ -40,6 +48,9 @@ typedef void (*ViewDispatcherTickEventCallback)(void* context); ViewDispatcher* view_dispatcher_alloc(void); /** Free ViewDispatcher instance + * + * @warning All added views MUST be removed using view_dispatcher_remove_view() + * before calling this function. * * @param view_dispatcher pointer to ViewDispatcher */ @@ -47,12 +58,13 @@ void view_dispatcher_free(ViewDispatcher* view_dispatcher); /** Enable queue support * - * Allocates event_loop, input and event message queues. Must be used with - * `view_dispatcher_run` + * @deprecated Do NOT use in new code and remove all calls to it from existing code. + * The queue support is now always enabled during construction. If no queue support + * is required, consider using ViewHolder instead. * * @param view_dispatcher ViewDispatcher instance */ -void view_dispatcher_enable_queue(ViewDispatcher* view_dispatcher); +FURI_DEPRECATED void view_dispatcher_enable_queue(ViewDispatcher* view_dispatcher); /** Send custom event * @@ -103,11 +115,11 @@ void view_dispatcher_set_event_callback_context(ViewDispatcher* view_dispatcher, /** Get event_loop instance * - * event_loop instance is allocated on `view_dispatcher_enable_queue` and used - * in view_dispatcher_run. + * Use the return value to connect additional supported primitives (message queues, timers, etc) + * to this ViewDispatcher instance's event loop. * - * You can add your objects into event_loop instance, but don't run the loop on - * your side as it will cause issues with input processing on dispatcher stop. + * @warning Do NOT call furi_event_loop_run() on the returned instance, it is done internally + * in the view_dispatcher_run() call. * * @param view_dispatcher ViewDispatcher instance * @@ -117,15 +129,14 @@ FuriEventLoop* view_dispatcher_get_event_loop(ViewDispatcher* view_dispatcher); /** Run ViewDispatcher * - * Use only after queue enabled + * This function will start the event loop and block until view_dispatcher_stop() is called + * or the current thread receives a FuriSignalExit signal. * * @param view_dispatcher ViewDispatcher instance */ void view_dispatcher_run(ViewDispatcher* view_dispatcher); /** Stop ViewDispatcher - * - * Use only after queue enabled * * @param view_dispatcher ViewDispatcher instance */ diff --git a/applications/services/gui/view_dispatcher_i.h b/applications/services/gui/view_dispatcher_i.h index 46a4ac7fa7..c6c8dc665c 100644 --- a/applications/services/gui/view_dispatcher_i.h +++ b/applications/services/gui/view_dispatcher_i.h @@ -56,7 +56,7 @@ void view_dispatcher_set_current_view(ViewDispatcher* view_dispatcher, View* vie void view_dispatcher_update(View* view, void* context); /** ViewDispatcher run event loop event callback */ -bool view_dispatcher_run_event_callback(FuriMessageQueue* queue, void* context); +bool view_dispatcher_run_event_callback(FuriEventLoopObject* object, void* context); /** ViewDispatcher run event loop input callback */ -bool view_dispatcher_run_input_callback(FuriMessageQueue* queue, void* context); +bool view_dispatcher_run_input_callback(FuriEventLoopObject* object, void* context); diff --git a/applications/services/gui/view_holder.c b/applications/services/gui/view_holder.c index ca2f9b04e1..7d8b5e17c3 100644 --- a/applications/services/gui/view_holder.c +++ b/applications/services/gui/view_holder.c @@ -32,7 +32,8 @@ ViewHolder* view_holder_alloc(void) { } void view_holder_free(ViewHolder* view_holder) { - furi_assert(view_holder); + furi_check(view_holder); + furi_check(view_holder->view == NULL); if(view_holder->gui) { gui_remove_view_port(view_holder->gui, view_holder->view_port); @@ -48,12 +49,14 @@ void view_holder_free(ViewHolder* view_holder) { } void view_holder_set_view(ViewHolder* view_holder, View* view) { - furi_assert(view_holder); + furi_check(view_holder); + if(view_holder->view) { - if(view_holder->view->exit_callback) { - view_holder->view->exit_callback(view_holder->view->context); + while(view_holder->ongoing_input) { + furi_delay_tick(1); } + view_exit(view_holder->view); view_set_update_callback(view_holder->view, NULL); view_set_update_callback_context(view_holder->view, NULL); } @@ -61,12 +64,23 @@ void view_holder_set_view(ViewHolder* view_holder, View* view) { view_holder->view = view; if(view_holder->view) { + const ViewPortOrientation orientation = (ViewPortOrientation)view->orientation; + furi_assert(orientation < ViewPortOrientationMAX); + if(view_port_get_orientation(view_holder->view_port) != orientation) { + view_port_set_orientation(view_holder->view_port, orientation); + // we just rotated input keys, now it's time to sacrifice some input + view_holder->ongoing_input = 0; + } + view_set_update_callback(view_holder->view, view_holder_update); view_set_update_callback_context(view_holder->view, view_holder); - if(view_holder->view->enter_callback) { - view_holder->view->enter_callback(view_holder->view->context); - } + view_enter(view_holder->view); + view_port_enabled_set(view_holder->view_port, true); + view_port_update(view_holder->view_port); + + } else { + view_port_enabled_set(view_holder->view_port, false); } } @@ -74,7 +88,7 @@ void view_holder_set_free_callback( ViewHolder* view_holder, FreeCallback free_callback, void* free_context) { - furi_assert(view_holder); + furi_check(view_holder); view_holder->free_callback = free_callback; view_holder->free_context = free_context; } @@ -87,31 +101,22 @@ void view_holder_set_back_callback( ViewHolder* view_holder, BackCallback back_callback, void* back_context) { - furi_assert(view_holder); + furi_check(view_holder); view_holder->back_callback = back_callback; view_holder->back_context = back_context; } void view_holder_attach_to_gui(ViewHolder* view_holder, Gui* gui) { - furi_assert(gui); - furi_assert(view_holder); - view_holder->gui = gui; + furi_check(view_holder); + furi_check(view_holder->gui == NULL); + furi_check(gui); gui_add_view_port(gui, view_holder->view_port, GuiLayerFullscreen); -} - -void view_holder_start(ViewHolder* view_holder) { - view_port_enabled_set(view_holder->view_port, true); -} - -void view_holder_stop(ViewHolder* view_holder) { - while(view_holder->ongoing_input) - furi_delay_tick(1); - view_port_enabled_set(view_holder->view_port, false); + view_holder->gui = gui; } void view_holder_update(View* view, void* context) { - furi_assert(view); - furi_assert(context); + furi_check(view); + furi_check(context); ViewHolder* view_holder = context; if(view == view_holder->view) { @@ -119,6 +124,18 @@ void view_holder_update(View* view, void* context) { } } +void view_holder_send_to_front(ViewHolder* view_holder) { + furi_check(view_holder); + furi_check(view_holder->gui); + gui_view_port_send_to_front(view_holder->gui, view_holder->view_port); +} + +void view_holder_send_to_back(ViewHolder* view_holder) { + furi_check(view_holder); + furi_check(view_holder->gui); + gui_view_port_send_to_back(view_holder->gui, view_holder->view_port); +} + static void view_holder_draw_callback(Canvas* canvas, void* context) { ViewHolder* view_holder = context; if(view_holder->view) { diff --git a/applications/services/gui/view_holder.h b/applications/services/gui/view_holder.h index 90ce82b377..78dbfda0ec 100644 --- a/applications/services/gui/view_holder.h +++ b/applications/services/gui/view_holder.h @@ -2,7 +2,10 @@ * @file view_holder.h * @brief GUI: ViewHolder API * - * @warning View added to a ViewHolder MUST NOT be in a ViewStack at the same time. + * ViewHolder is used to connect a single View to a Gui instance. This is useful in smaller applications + * with a simple user interface. If advanced view switching capabilites are required, consider using ViewDispatcher instead. + * + * @warning Views added to a ViewHolder MUST NOT be in a ViewStack at the same time. */ #pragma once @@ -22,7 +25,8 @@ typedef void (*FreeCallback)(void* free_context); /** * @brief Back callback type - * @warning comes from GUI thread + * + * @warning Will be called from the GUI thread */ typedef void (*BackCallback)(void* back_context); @@ -34,12 +38,17 @@ ViewHolder* view_holder_alloc(void); /** * @brief Free ViewHolder and call Free callback + * + * @warning The current view must be unset prior to freeing a ViewHolder instance. + * * @param view_holder pointer to ViewHolder */ void view_holder_free(ViewHolder* view_holder); /** * @brief Set view for ViewHolder + * + * Pass NULL as the view parameter to unset the current view. * * @param view_holder ViewHolder instance * @param view View instance @@ -59,13 +68,25 @@ void view_holder_set_free_callback( void* free_context); /** - * @brief Free callback context getter. Useful if your Free callback is a module destructor, so you can get an instance of the module using this method. + * @brief Free callback context getter. + * + * Useful if your Free callback is a module destructor, so you can get an instance of the module using this method. * * @param view_holder ViewHolder instance * @return void* free callback context */ void* view_holder_get_free_context(ViewHolder* view_holder); +/** + * @brief Set the back key callback. + * + * The callback function will be called if the user has pressed the Back key + * and the current view did not handle this event. + * + * @param view_holder ViewHolder instance + * @param back_callback pointer to the callback function + * @param back_context pointer to a user-specific object, can be NULL + */ void view_holder_set_back_callback( ViewHolder* view_holder, BackCallback back_callback, @@ -80,25 +101,26 @@ void view_holder_set_back_callback( void view_holder_attach_to_gui(ViewHolder* view_holder, Gui* gui); /** - * @brief Enable view processing - * - * @param view_holder + * @brief View Update Handler + * + * @param view View Instance + * @param context ViewHolder instance */ -void view_holder_start(ViewHolder* view_holder); +void view_holder_update(View* view, void* context); /** - * @brief Disable view processing - * - * @param view_holder + * @brief Send ViewPort of this ViewHolder instance to front + * + * @param view_holder ViewHolder instance */ -void view_holder_stop(ViewHolder* view_holder); +void view_holder_send_to_front(ViewHolder* view_holder); -/** View Update Handler +/** + * @brief Send ViewPort of this ViewHolder instance to back * - * @param view View Instance - * @param context ViewHolder instance + * @param view_holder ViewHolder instance */ -void view_holder_update(View* view, void* context); +void view_holder_send_to_back(ViewHolder* view_holder); #ifdef __cplusplus } diff --git a/applications/services/loader/loader_applications.c b/applications/services/loader/loader_applications.c index 232e5314e9..5399ba26fc 100644 --- a/applications/services/loader/loader_applications.c +++ b/applications/services/loader/loader_applications.c @@ -61,7 +61,6 @@ static LoaderApplicationsApp* loader_applications_app_alloc(void) { app->loading = loading_alloc(); view_holder_attach_to_gui(app->view_holder, app->gui); - view_holder_set_view(app->view_holder, loading_get_view(app->loading)); return app; } //-V773 @@ -149,7 +148,7 @@ static int32_t loader_applications_thread(void* p) { LoaderApplicationsApp* app = loader_applications_app_alloc(); // start loading animation - view_holder_start(app->view_holder); + view_holder_set_view(app->view_holder, loading_get_view(app->loading)); while(loader_applications_select_app(app)) { if(!furi_string_end_with(app->file_path, ".js")) { @@ -161,7 +160,7 @@ static int32_t loader_applications_thread(void* p) { } // stop loading animation - view_holder_stop(app->view_holder); + view_holder_set_view(app->view_holder, NULL); loader_applications_app_free(app); diff --git a/applications/services/loader/loader_menu.c b/applications/services/loader/loader_menu.c index 0ee3cada2d..ad4a4c7d59 100644 --- a/applications/services/loader/loader_menu.c +++ b/applications/services/loader/loader_menu.c @@ -160,8 +160,6 @@ static LoaderMenuApp* loader_menu_app_alloc(LoaderMenu* loader_menu) { view_set_context(settings_view, app->settings_menu); view_set_previous_callback(settings_view, loader_menu_switch_to_primary); view_dispatcher_add_view(app->view_dispatcher, LoaderMenuViewSettings, settings_view); - - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_switch_to_view(app->view_dispatcher, LoaderMenuViewPrimary); return app; diff --git a/applications/services/power/power_cli.c b/applications/services/power/power_cli.c index 6e1e34e67e..93d0f232ac 100644 --- a/applications/services/power/power_cli.c +++ b/applications/services/power/power_cli.c @@ -17,13 +17,15 @@ void power_cli_off(Cli* cli, FuriString* args) { void power_cli_reboot(Cli* cli, FuriString* args) { UNUSED(cli); UNUSED(args); - power_reboot(PowerBootModeNormal); + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeNormal); } void power_cli_reboot2dfu(Cli* cli, FuriString* args) { UNUSED(cli); UNUSED(args); - power_reboot(PowerBootModeDfu); + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeDfu); } void power_cli_5v(Cli* cli, FuriString* args) { diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index 3e884d196e..e6f8ccf787 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -4,10 +4,18 @@ #include #include -#define POWER_OFF_TIMEOUT 90 -#define TAG "Power" +#include +#include -void power_draw_battery_callback(Canvas* canvas, void* context) { +#define TAG "Power" + +#define POWER_OFF_TIMEOUT_S (90U) +#define POWER_POLL_PERIOD_MS (1000UL) + +#define POWER_VBUS_LOW_THRESHOLD (4.0f) +#define POWER_HEALTH_LOW_THRESHOLD (70U) + +static void power_draw_battery_callback(Canvas* canvas, void* context) { furi_assert(context); Power* power = context; canvas_draw_icon(canvas, 0, 0, &I_Battery_26x8); @@ -219,6 +227,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { } canvas_set_bitmap_mode(canvas, 0); } + } else { canvas_draw_box(canvas, 8, 3, 8, 2); } @@ -228,99 +237,61 @@ static ViewPort* power_battery_view_port_alloc(Power* power) { ViewPort* battery_view_port = view_port_alloc(); view_port_set_width(battery_view_port, icon_get_width(&I_Battery_26x8)); view_port_draw_callback_set(battery_view_port, power_draw_battery_callback, power); - gui_add_view_port(power->gui, battery_view_port, GuiLayerStatusBarRight); return battery_view_port; } -Power* power_alloc(void) { - Power* power = malloc(sizeof(Power)); - - // Records - power->notification = furi_record_open(RECORD_NOTIFICATION); - power->gui = furi_record_open(RECORD_GUI); - - // Pubsub - power->event_pubsub = furi_pubsub_alloc(); - - // State initialization - power->state = PowerStateNotCharging; - power->battery_low = false; - power->power_off_timeout = POWER_OFF_TIMEOUT; - power->api_mtx = furi_mutex_alloc(FuriMutexTypeNormal); - - // Gui - power->view_dispatcher = view_dispatcher_alloc(); - power->power_off = power_off_alloc(); - view_dispatcher_add_view( - power->view_dispatcher, PowerViewOff, power_off_get_view(power->power_off)); - power->power_unplug_usb = power_unplug_usb_alloc(); - view_dispatcher_add_view( - power->view_dispatcher, - PowerViewUnplugUsb, - power_unplug_usb_get_view(power->power_unplug_usb)); - view_dispatcher_attach_to_gui( - power->view_dispatcher, power->gui, ViewDispatcherTypeFullscreen); - - // Battery view port - power->battery_view_port = power_battery_view_port_alloc(power); - power->show_low_bat_level_message = true; - - return power; +static bool power_update_info(Power* power) { + const PowerInfo info = { + .is_charging = furi_hal_power_is_charging(), + .gauge_is_ok = furi_hal_power_gauge_is_ok(), + .is_shutdown_requested = furi_hal_power_is_shutdown_requested(), + .charge = furi_hal_power_get_pct(), + .health = furi_hal_power_get_bat_health_pct(), + .capacity_remaining = furi_hal_power_get_battery_remaining_capacity(), + .capacity_full = furi_hal_power_get_battery_full_capacity(), + .current_charger = furi_hal_power_get_battery_current(FuriHalPowerICCharger), + .current_gauge = furi_hal_power_get_battery_current(FuriHalPowerICFuelGauge), + .voltage_battery_charge_limit = furi_hal_power_get_battery_charge_voltage_limit(), + .voltage_charger = furi_hal_power_get_battery_voltage(FuriHalPowerICCharger), + .voltage_gauge = furi_hal_power_get_battery_voltage(FuriHalPowerICFuelGauge), + .voltage_vbus = furi_hal_power_get_usb_voltage(), + .temperature_charger = furi_hal_power_get_battery_temperature(FuriHalPowerICCharger), + .temperature_gauge = furi_hal_power_get_battery_temperature(FuriHalPowerICFuelGauge), + }; + + const bool need_refresh = (power->info.charge != info.charge) || + (power->info.is_charging != info.is_charging); + power->info = info; + return need_refresh; } static void power_check_charging_state(Power* power) { + NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); + if(furi_hal_power_is_charging()) { if((power->info.charge == 100) || (furi_hal_power_is_charging_done())) { if(power->state != PowerStateCharged) { - notification_internal_message(power->notification, &sequence_charged); + notification_internal_message(notification, &sequence_charged); power->state = PowerStateCharged; power->event.type = PowerEventTypeFullyCharged; furi_pubsub_publish(power->event_pubsub, &power->event); } - } else { - if(power->state != PowerStateCharging) { - notification_internal_message(power->notification, &sequence_charging); - power->state = PowerStateCharging; - power->event.type = PowerEventTypeStartCharging; - furi_pubsub_publish(power->event_pubsub, &power->event); - } - } - } else { - if(power->state != PowerStateNotCharging) { - notification_internal_message(power->notification, &sequence_not_charging); - power->state = PowerStateNotCharging; - power->event.type = PowerEventTypeStopCharging; + + } else if(power->state != PowerStateCharging) { + notification_internal_message(notification, &sequence_charging); + power->state = PowerStateCharging; + power->event.type = PowerEventTypeStartCharging; furi_pubsub_publish(power->event_pubsub, &power->event); } - } -} -static bool power_update_info(Power* power) { - PowerInfo info; - - info.is_charging = furi_hal_power_is_charging(); - info.gauge_is_ok = furi_hal_power_gauge_is_ok(); - info.is_shutdown_requested = furi_hal_power_is_shutdown_requested(); - info.charge = furi_hal_power_get_pct(); - info.health = furi_hal_power_get_bat_health_pct(); - info.capacity_remaining = furi_hal_power_get_battery_remaining_capacity(); - info.capacity_full = furi_hal_power_get_battery_full_capacity(); - info.current_charger = furi_hal_power_get_battery_current(FuriHalPowerICCharger); - info.current_gauge = furi_hal_power_get_battery_current(FuriHalPowerICFuelGauge); - info.voltage_battery_charge_limit = furi_hal_power_get_battery_charge_voltage_limit(); - info.voltage_charger = furi_hal_power_get_battery_voltage(FuriHalPowerICCharger); - info.voltage_gauge = furi_hal_power_get_battery_voltage(FuriHalPowerICFuelGauge); - info.voltage_vbus = furi_hal_power_get_usb_voltage(); - info.temperature_charger = furi_hal_power_get_battery_temperature(FuriHalPowerICCharger); - info.temperature_gauge = furi_hal_power_get_battery_temperature(FuriHalPowerICFuelGauge); - - furi_mutex_acquire(power->api_mtx, FuriWaitForever); - bool need_refresh = power->info.charge != info.charge; - need_refresh |= power->info.is_charging != info.is_charging; - power->info = info; - furi_mutex_release(power->api_mtx); + } else if(power->state != PowerStateNotCharging) { + notification_internal_message(notification, &sequence_not_charging); + power->state = PowerStateNotCharging; + power->event.type = PowerEventTypeStopCharging; + furi_pubsub_publish(power->event_pubsub, &power->event); + } - return need_refresh; + furi_record_close(RECORD_NOTIFICATION); } static void power_check_low_battery(Power* power) { @@ -329,40 +300,41 @@ static void power_check_low_battery(Power* power) { } // Check battery charge and vbus voltage - if((power->info.is_shutdown_requested) && (power->info.voltage_vbus < 4.0f) && - power->show_low_bat_level_message) { + if((power->info.is_shutdown_requested) && + (power->info.voltage_vbus < POWER_VBUS_LOW_THRESHOLD) && power->show_battery_low_warning) { if(!power->battery_low) { - view_dispatcher_send_to_front(power->view_dispatcher); - view_dispatcher_switch_to_view(power->view_dispatcher, PowerViewOff); + view_holder_send_to_front(power->view_holder); + view_holder_set_view(power->view_holder, power_off_get_view(power->view_power_off)); } power->battery_low = true; } else { if(power->battery_low) { - view_dispatcher_switch_to_view(power->view_dispatcher, VIEW_NONE); - power->power_off_timeout = POWER_OFF_TIMEOUT; + // view_dispatcher_switch_to_view(power->view_dispatcher, VIEW_NONE); + view_holder_set_view(power->view_holder, NULL); + power->power_off_timeout = POWER_OFF_TIMEOUT_S; } power->battery_low = false; } // If battery low, update view and switch off power after timeout if(power->battery_low) { - PowerOffResponse response = power_off_get_response(power->power_off); + PowerOffResponse response = power_off_get_response(power->view_power_off); if(response == PowerOffResponseDefault) { if(power->power_off_timeout) { - power_off_set_time_left(power->power_off, power->power_off_timeout--); + power_off_set_time_left(power->view_power_off, power->power_off_timeout--); } else { power_off(power); } } else if(response == PowerOffResponseOk) { power_off(power); } else if(response == PowerOffResponseHide) { - view_dispatcher_switch_to_view(power->view_dispatcher, VIEW_NONE); + view_holder_set_view(power->view_holder, NULL); if(power->power_off_timeout) { - power_off_set_time_left(power->power_off, power->power_off_timeout--); + power_off_set_time_left(power->view_power_off, power->power_off_timeout--); } else { power_off(power); } } else if(response == PowerOffResponseCancel) { - view_dispatcher_switch_to_view(power->view_dispatcher, VIEW_NONE); + view_holder_set_view(power->view_holder, NULL); } } } @@ -384,52 +356,136 @@ void power_trigger_ui_update(Power* power) { view_port_update(power->battery_view_port); } -int32_t power_srv(void* p) { - UNUSED(p); +static void power_handle_shutdown(Power* power) { + furi_hal_power_off(); + // Notify user if USB is plugged + view_holder_send_to_front(power->view_holder); + view_holder_set_view( + power->view_holder, power_unplug_usb_get_view(power->view_power_unplug_usb)); + furi_delay_ms(100); + furi_halt("Disconnect USB for safe shutdown"); +} - if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { - FURI_LOG_W(TAG, "Skipping start in special boot mode"); +static void power_handle_reboot(PowerBootMode mode) { + if(mode == PowerBootModeNormal) { + update_operation_disarm(); + } else if(mode == PowerBootModeDfu) { + furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeDfu); + } else if(mode == PowerBootModeUpdateStart) { + furi_hal_rtc_set_boot_mode(FuriHalRtcBootModePreUpdate); + } else { + furi_crash(); + } - furi_thread_suspend(furi_thread_get_current_id()); - return 0; + furi_hal_power_reset(); +} + +static bool power_message_callback(FuriEventLoopObject* object, void* context) { + furi_assert(context); + Power* power = context; + + furi_assert(object == power->message_queue); + + PowerMessage msg; + furi_check(furi_message_queue_get(power->message_queue, &msg, 0) == FuriStatusOk); + + switch(msg.type) { + case PowerMessageTypeShutdown: + power_handle_shutdown(power); + break; + case PowerMessageTypeReboot: + power_handle_reboot(msg.boot_mode); + break; + case PowerMessageTypeGetInfo: + *msg.power_info = power->info; + break; + case PowerMessageTypeIsBatteryHealthy: + *msg.bool_param = power->info.health > POWER_HEALTH_LOW_THRESHOLD; + break; + case PowerMessageTypeShowBatteryLowWarning: + power->show_battery_low_warning = *msg.bool_param; + break; + default: + furi_crash(); } - Power* power = power_alloc(); - power_update_info(power); - furi_record_create(RECORD_POWER, power); + if(msg.lock) { + api_lock_unlock(msg.lock); + } - DesktopSettings* settings = malloc(sizeof(DesktopSettings)); - desktop_settings_load(settings); - power->displayBatteryPercentage = settings->displayBatteryPercentage; - free(settings); + return true; +} + +static void power_tick_callback(void* context) { + furi_assert(context); + Power* power = context; + + // Update data from gauge and charger + const bool need_refresh = power_update_info(power); + // Check low battery level + power_check_low_battery(power); + // Check and notify about charging state + power_check_charging_state(power); + // Check and notify about battery level change + power_check_battery_level_change(power); + // Update battery view port + if(need_refresh) { + view_port_update(power->battery_view_port); + } + // Check OTG status and disable it in case of fault + if(furi_hal_power_is_otg_enabled()) { + furi_hal_power_check_otg_status(); + } +} - while(1) { - // Update data from gauge and charger - bool need_refresh = power_update_info(power); +static Power* power_alloc(void) { + Power* power = malloc(sizeof(Power)); + // Pubsub + power->event_pubsub = furi_pubsub_alloc(); + // State initialization + power->power_off_timeout = POWER_OFF_TIMEOUT_S; + power->show_battery_low_warning = true; + // Gui + Gui* gui = furi_record_open(RECORD_GUI); - // Check low battery level - power_check_low_battery(power); + power->view_holder = view_holder_alloc(); + power->view_power_off = power_off_alloc(); + power->view_power_unplug_usb = power_unplug_usb_alloc(); - // Check and notify about charging state - power_check_charging_state(power); + view_holder_attach_to_gui(power->view_holder, gui); + // Battery view port + power->battery_view_port = power_battery_view_port_alloc(power); + gui_add_view_port(gui, power->battery_view_port, GuiLayerStatusBarRight); + // Event loop + power->event_loop = furi_event_loop_alloc(); + power->message_queue = furi_message_queue_alloc(4, sizeof(PowerMessage)); + + furi_event_loop_subscribe_message_queue( + power->event_loop, + power->message_queue, + FuriEventLoopEventIn, + power_message_callback, + power); + furi_event_loop_tick_set(power->event_loop, 1000, power_tick_callback, power); - // Check and notify about battery level change - power_check_battery_level_change(power); + return power; +} - // Update battery view port - if(need_refresh) { - view_port_update(power->battery_view_port); - } +int32_t power_srv(void* p) { + UNUSED(p); - // Check OTG status and disable it in case of fault - if(furi_hal_power_is_otg_enabled()) { - furi_hal_power_check_otg_status(); - } + if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { + FURI_LOG_W(TAG, "Skipping start in special boot mode"); - furi_delay_ms(1000); + furi_thread_suspend(furi_thread_get_current_id()); + return 0; } - furi_crash("That was unexpected"); + Power* power = power_alloc(); + power_update_info(power); + + furi_record_create(RECORD_POWER, power); + furi_event_loop_run(power->event_loop); return 0; } diff --git a/applications/services/power/power_service/power.h b/applications/services/power/power_service/power.h index e43651ea28..34d58353a2 100644 --- a/applications/services/power/power_service/power.h +++ b/applications/services/power/power_service/power.h @@ -1,9 +1,10 @@ #pragma once #include -#include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -65,7 +66,7 @@ void power_off(Power* power); * * @param mode PowerBootMode */ -void power_reboot(PowerBootMode mode); +void power_reboot(Power* power, PowerBootMode mode); /** Get power info * diff --git a/applications/services/power/power_service/power_api.c b/applications/services/power/power_service/power_api.c index 1bb482bf52..6f7515f5e4 100644 --- a/applications/services/power/power_service/power_api.c +++ b/applications/services/power/power_service/power_api.c @@ -1,41 +1,39 @@ #include "power_i.h" -#include -#include -#include - void power_off(Power* power) { furi_check(power); - furi_hal_power_off(); - // Notify user if USB is plugged - view_dispatcher_send_to_front(power->view_dispatcher); - view_dispatcher_switch_to_view(power->view_dispatcher, PowerViewUnplugUsb); - furi_delay_ms(100); - furi_halt("Disconnect USB for safe shutdown"); + PowerMessage msg = { + .type = PowerMessageTypeShutdown, + }; + + furi_check( + furi_message_queue_put(power->message_queue, &msg, FuriWaitForever) == FuriStatusOk); } -void power_reboot(PowerBootMode mode) { - if(mode == PowerBootModeNormal) { - update_operation_disarm(); - } else if(mode == PowerBootModeDfu) { - furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeDfu); - } else if(mode == PowerBootModeUpdateStart) { - furi_hal_rtc_set_boot_mode(FuriHalRtcBootModePreUpdate); - } else { - furi_crash(); - } - - furi_hal_power_reset(); +void power_reboot(Power* power, PowerBootMode mode) { + PowerMessage msg = { + .type = PowerMessageTypeReboot, + .boot_mode = mode, + }; + + furi_check( + furi_message_queue_put(power->message_queue, &msg, FuriWaitForever) == FuriStatusOk); } void power_get_info(Power* power, PowerInfo* info) { furi_check(power); furi_check(info); - furi_mutex_acquire(power->api_mtx, FuriWaitForever); - memcpy(info, &power->info, sizeof(power->info)); - furi_mutex_release(power->api_mtx); + PowerMessage msg = { + .type = PowerMessageTypeGetInfo, + .power_info = info, + .lock = api_lock_alloc_locked(), + }; + + furi_check( + furi_message_queue_put(power->message_queue, &msg, FuriWaitForever) == FuriStatusOk); + api_lock_wait_unlock_and_free(msg.lock); } FuriPubSub* power_get_pubsub(Power* power) { @@ -45,16 +43,30 @@ FuriPubSub* power_get_pubsub(Power* power) { bool power_is_battery_healthy(Power* power) { furi_check(power); - bool is_healthy = false; - furi_mutex_acquire(power->api_mtx, FuriWaitForever); - is_healthy = power->info.health > POWER_BATTERY_HEALTHY_LEVEL; - furi_mutex_release(power->api_mtx); - return is_healthy; + + bool ret = false; + + PowerMessage msg = { + .type = PowerMessageTypeIsBatteryHealthy, + .lock = api_lock_alloc_locked(), + .bool_param = &ret, + }; + + furi_check( + furi_message_queue_put(power->message_queue, &msg, FuriWaitForever) == FuriStatusOk); + api_lock_wait_unlock_and_free(msg.lock); + + return ret; } void power_enable_low_battery_level_notification(Power* power, bool enable) { furi_check(power); - furi_mutex_acquire(power->api_mtx, FuriWaitForever); - power->show_low_bat_level_message = enable; - furi_mutex_release(power->api_mtx); + + PowerMessage msg = { + .type = PowerMessageTypeShowBatteryLowWarning, + .bool_param = &enable, + }; + + furi_check( + furi_message_queue_put(power->message_queue, &msg, FuriWaitForever) == FuriStatusOk); } diff --git a/applications/services/power/power_service/power_i.h b/applications/services/power/power_service/power_i.h index a09a6f072f..d75071f8f6 100644 --- a/applications/services/power/power_service/power_i.h +++ b/applications/services/power/power_service/power_i.h @@ -2,19 +2,15 @@ #include "power.h" -#include -#include #include +#include + +#include #include -#include #include "views/power_off.h" #include "views/power_unplug_usb.h" -#include - -#define POWER_BATTERY_HEALTHY_LEVEL 70 - typedef enum { PowerStateNotCharging, PowerStateCharging, @@ -22,29 +18,45 @@ typedef enum { } PowerState; struct Power { - ViewDispatcher* view_dispatcher; - PowerOff* power_off; - PowerUnplugUsb* power_unplug_usb; + ViewHolder* view_holder; + FuriPubSub* event_pubsub; + FuriEventLoop* event_loop; + FuriMessageQueue* message_queue; ViewPort* battery_view_port; - Gui* gui; - NotificationApp* notification; - FuriPubSub* event_pubsub; - PowerEvent event; + PowerOff* view_power_off; + PowerUnplugUsb* view_power_unplug_usb; + PowerEvent event; PowerState state; PowerInfo info; bool battery_low; - bool show_low_bat_level_message; + bool show_battery_low_warning; uint8_t displayBatteryPercentage; uint8_t battery_level; uint8_t power_off_timeout; - - FuriMutex* api_mtx; }; typedef enum { PowerViewOff, PowerViewUnplugUsb, } PowerView; + +typedef enum { + PowerMessageTypeShutdown, + PowerMessageTypeReboot, + PowerMessageTypeGetInfo, + PowerMessageTypeIsBatteryHealthy, + PowerMessageTypeShowBatteryLowWarning, +} PowerMessageType; + +typedef struct { + PowerMessageType type; + union { + PowerBootMode boot_mode; + PowerInfo* power_info; + bool* bool_param; + }; + FuriApiLock lock; +} PowerMessage; diff --git a/applications/services/rpc/rpc_system.c b/applications/services/rpc/rpc_system.c index 0b9fd33f95..1cc0f90eb2 100644 --- a/applications/services/rpc/rpc_system.c +++ b/applications/services/rpc/rpc_system.c @@ -54,18 +54,21 @@ static void rpc_system_system_reboot_process(const PB_Main* request, void* conte RpcSession* session = (RpcSession*)context; furi_assert(session); + Power* power = furi_record_open(RECORD_POWER); const int mode = request->content.system_reboot_request.mode; if(mode == PB_System_RebootRequest_RebootMode_OS) { - power_reboot(PowerBootModeNormal); + power_reboot(power, PowerBootModeNormal); } else if(mode == PB_System_RebootRequest_RebootMode_DFU) { - power_reboot(PowerBootModeDfu); + power_reboot(power, PowerBootModeDfu); } else if(mode == PB_System_RebootRequest_RebootMode_UPDATE) { - power_reboot(PowerBootModeUpdateStart); + power_reboot(power, PowerBootModeUpdateStart); } else { rpc_send_and_release_empty( session, request->command_id, PB_CommandStatus_ERROR_INVALID_PARAMETERS); } + + furi_record_close(RECORD_POWER); } static void rpc_system_system_device_info_callback( @@ -181,9 +184,9 @@ static void rpc_system_system_factory_reset_process(const PB_Main* request, void furi_hal_rtc_reset_registers(); furi_hal_rtc_set_flag(FuriHalRtcFlagStorageFormatInternal); - power_reboot(PowerBootModeNormal); - (void)session; + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeNormal); } static void diff --git a/applications/services/storage/storage_cli.c b/applications/services/storage/storage_cli.c index 17fd4eae4d..a18b289408 100644 --- a/applications/services/storage/storage_cli.c +++ b/applications/services/storage/storage_cli.c @@ -675,9 +675,12 @@ static void storage_cli_factory_reset(Cli* cli, FuriString* args, void* context) char c = cli_getc(cli); if(c == 'y' || c == 'Y') { printf("Data will be wiped after reboot.\r\n"); + furi_hal_rtc_reset_registers(); furi_hal_rtc_set_flag(FuriHalRtcFlagStorageFormatInternal); - power_reboot(PowerBootModeNormal); + + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeNormal); } else { printf("Safe choice.\r\n"); } diff --git a/applications/settings/about/about.c b/applications/settings/about/about.c index a4c2e5b9ef..d9fbca87ad 100644 --- a/applications/settings/about/about.c +++ b/applications/settings/about/about.c @@ -1,9 +1,12 @@ #include -#include + #include -#include +#include #include + +#include #include + #include #include #include @@ -202,18 +205,15 @@ int32_t about_settings_app(void* p) { DialogMessage* message = dialog_message_alloc(); Gui* gui = furi_record_open(RECORD_GUI); - ViewDispatcher* view_dispatcher = view_dispatcher_alloc(); + ViewHolder* view_holder = view_holder_alloc(); EmptyScreen* empty_screen = empty_screen_alloc(); - const uint32_t empty_screen_index = 0; size_t screen_index = 0; DialogMessageButton screen_result; // draw empty screen to prevent menu flickering - view_dispatcher_add_view( - view_dispatcher, empty_screen_index, empty_screen_get_view(empty_screen)); - view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen); - view_dispatcher_switch_to_view(view_dispatcher, empty_screen_index); + view_holder_attach_to_gui(view_holder, gui); + view_holder_set_view(view_holder, empty_screen_get_view(empty_screen)); while(1) { if(screen_index >= COUNT_OF(about_screens) - 1) { @@ -244,8 +244,8 @@ int32_t about_settings_app(void* p) { dialog_message_free(message); furi_record_close(RECORD_DIALOGS); - view_dispatcher_remove_view(view_dispatcher, empty_screen_index); - view_dispatcher_free(view_dispatcher); + view_holder_set_view(view_holder, NULL); + view_holder_free(view_holder); empty_screen_free(empty_screen); furi_record_close(RECORD_GUI); diff --git a/applications/settings/bt_settings_app/bt_settings_app.c b/applications/settings/bt_settings_app/bt_settings_app.c index 8972820644..174d0bcbb2 100644 --- a/applications/settings/bt_settings_app/bt_settings_app.c +++ b/applications/settings/bt_settings_app/bt_settings_app.c @@ -21,7 +21,6 @@ BtSettingsApp* bt_settings_app_alloc(void) { // View Dispatcher and Scene Manager app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&bt_settings_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( diff --git a/applications/settings/desktop_settings/desktop_settings_app.c b/applications/settings/desktop_settings/desktop_settings_app.c index b6f719f009..b6ecfa0791 100644 --- a/applications/settings/desktop_settings/desktop_settings_app.c +++ b/applications/settings/desktop_settings/desktop_settings_app.c @@ -30,7 +30,6 @@ DesktopSettingsApp* desktop_settings_app_alloc(void) { app->dialogs = furi_record_open(RECORD_DIALOGS); app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&desktop_settings_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( diff --git a/applications/settings/notification_settings/notification_settings_app.c b/applications/settings/notification_settings/notification_settings_app.c index 7576dcf3c2..2462b32bde 100644 --- a/applications/settings/notification_settings/notification_settings_app.c +++ b/applications/settings/notification_settings/notification_settings_app.c @@ -242,7 +242,6 @@ static NotificationAppSettings* alloc_settings(void) { } app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); view_dispatcher_add_view(app->view_dispatcher, 0, view); view_dispatcher_switch_to_view(app->view_dispatcher, 0); diff --git a/applications/settings/power_settings_app/power_settings_app.c b/applications/settings/power_settings_app/power_settings_app.c index d2eaec0a5a..57df1344f3 100644 --- a/applications/settings/power_settings_app/power_settings_app.c +++ b/applications/settings/power_settings_app/power_settings_app.c @@ -28,7 +28,6 @@ PowerSettingsApp* power_settings_app_alloc(uint32_t first_scene) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&power_settings_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( app->view_dispatcher, power_settings_custom_event_callback); diff --git a/applications/settings/power_settings_app/scenes/power_settings_scene_reboot_confirm.c b/applications/settings/power_settings_app/scenes/power_settings_scene_reboot_confirm.c index 62e06de927..25e7b2bc42 100644 --- a/applications/settings/power_settings_app/scenes/power_settings_scene_reboot_confirm.c +++ b/applications/settings/power_settings_app/scenes/power_settings_scene_reboot_confirm.c @@ -49,10 +49,12 @@ bool power_settings_scene_reboot_confirm_on_event(void* context, SceneManagerEve if(event.event == DialogExResultLeft) { scene_manager_previous_scene(app->scene_manager); } else if(event.event == DialogExResultRight) { + Power* power = furi_record_open(RECORD_POWER); + if(reboot_type == RebootTypeDFU) { - power_reboot(PowerBootModeDfu); + power_reboot(power, PowerBootModeDfu); } else { - power_reboot(PowerBootModeNormal); + power_reboot(power, PowerBootModeNormal); } } consumed = true; diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_factory_reset.c b/applications/settings/storage_settings/scenes/storage_settings_scene_factory_reset.c index 2d977176a0..0f8e1aa965 100644 --- a/applications/settings/storage_settings/scenes/storage_settings_scene_factory_reset.c +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_factory_reset.c @@ -65,7 +65,9 @@ bool storage_settings_scene_factory_reset_on_event(void* context, SceneManagerEv } else { furi_hal_rtc_reset_registers(); furi_hal_rtc_set_flag(FuriHalRtcFlagStorageFormatInternal); - power_reboot(PowerBootModeNormal); + + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeNormal); } consumed = true; diff --git a/applications/settings/storage_settings/storage_settings.c b/applications/settings/storage_settings/storage_settings.c index 0508e8e0fa..3546328904 100644 --- a/applications/settings/storage_settings/storage_settings.c +++ b/applications/settings/storage_settings/storage_settings.c @@ -23,7 +23,6 @@ static StorageSettings* storage_settings_alloc(void) { app->scene_manager = scene_manager_alloc(&storage_settings_scene_handlers, app); app->text_string = furi_string_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( diff --git a/applications/settings/system/system_settings.c b/applications/settings/system/system_settings.c index 8adb3f4181..1c2654c5e5 100644 --- a/applications/settings/system/system_settings.c +++ b/applications/settings/system/system_settings.c @@ -220,7 +220,6 @@ SystemSettings* system_settings_alloc(void) { app->gui = furi_record_open(RECORD_GUI); app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); diff --git a/applications/system/hid_app/hid.c b/applications/system/hid_app/hid.c index 586d198a9b..e297e07387 100644 --- a/applications/system/hid_app/hid.c +++ b/applications/system/hid_app/hid.c @@ -72,7 +72,6 @@ Hid* hid_alloc() { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback(app->view_dispatcher, hid_custom_event_callback); view_dispatcher_set_navigation_event_callback(app->view_dispatcher, hid_back_event_callback); diff --git a/applications/system/js_app/js_app.c b/applications/system/js_app/js_app.c index 24cb545891..20c4ce7336 100644 --- a/applications/system/js_app/js_app.c +++ b/applications/system/js_app/js_app.c @@ -69,7 +69,6 @@ static JsApp* js_app_alloc(void) { app->loading = loading_alloc(); app->gui = furi_record_open("gui"); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); view_dispatcher_add_view( app->view_dispatcher, JsAppViewLoading, loading_get_view(app->loading)); diff --git a/applications/system/js_app/modules/js_submenu.c b/applications/system/js_app/modules/js_submenu.c index 058b32fd09..5ab9bef77c 100644 --- a/applications/system/js_app/modules/js_submenu.c +++ b/applications/system/js_app/modules/js_submenu.c @@ -97,10 +97,9 @@ static void js_submenu_show(struct mjs* mjs) { view_holder_set_back_callback(submenu->view_holder, submenu_exit, submenu); view_holder_set_view(submenu->view_holder, submenu_get_view(submenu->submenu)); - view_holder_start(submenu->view_holder); api_lock_wait_unlock(submenu->lock); - view_holder_stop(submenu->view_holder); + view_holder_set_view(submenu->view_holder, NULL); view_holder_free(submenu->view_holder); furi_record_close(RECORD_GUI); api_lock_free(submenu->lock); diff --git a/applications/system/js_app/modules/js_textbox.c b/applications/system/js_app/modules/js_textbox.c index 33798b2965..b90dbc153a 100644 --- a/applications/system/js_app/modules/js_textbox.c +++ b/applications/system/js_app/modules/js_textbox.c @@ -125,7 +125,7 @@ static void js_textbox_is_open(struct mjs* mjs) { static void textbox_callback(void* context, uint32_t arg) { UNUSED(arg); JsTextboxInst* textbox = context; - view_holder_stop(textbox->view_holder); + view_holder_set_view(textbox->view_holder, NULL); textbox->is_shown = false; } @@ -145,7 +145,7 @@ static void js_textbox_show(struct mjs* mjs) { return; } - view_holder_start(textbox->view_holder); + view_holder_set_view(textbox->view_holder, text_box_get_view(textbox->text_box)); textbox->is_shown = true; mjs_return(mjs, MJS_UNDEFINED); @@ -155,7 +155,7 @@ static void js_textbox_close(struct mjs* mjs) { JsTextboxInst* textbox = get_this_ctx(mjs); if(!check_arg_count(mjs, 0)) return; - view_holder_stop(textbox->view_holder); + view_holder_set_view(textbox->view_holder, NULL); textbox->is_shown = false; mjs_return(mjs, MJS_UNDEFINED); @@ -180,7 +180,6 @@ static void* js_textbox_create(struct mjs* mjs, mjs_val_t* object) { textbox->view_holder = view_holder_alloc(); view_holder_attach_to_gui(textbox->view_holder, gui); view_holder_set_back_callback(textbox->view_holder, textbox_exit, textbox); - view_holder_set_view(textbox->view_holder, text_box_get_view(textbox->text_box)); *object = textbox_obj; return textbox; @@ -189,7 +188,7 @@ static void* js_textbox_create(struct mjs* mjs, mjs_val_t* object) { static void js_textbox_destroy(void* inst) { JsTextboxInst* textbox = inst; - view_holder_stop(textbox->view_holder); + view_holder_set_view(textbox->view_holder, NULL); view_holder_free(textbox->view_holder); textbox->view_holder = NULL; diff --git a/applications/system/updater/updater.c b/applications/system/updater/updater.c index 4c7fd29e9c..15d7dd3a94 100644 --- a/applications/system/updater/updater.c +++ b/applications/system/updater/updater.c @@ -47,8 +47,6 @@ Updater* updater_alloc(const char* arg) { updater->view_dispatcher = view_dispatcher_alloc(); updater->scene_manager = scene_manager_alloc(&updater_scene_handlers, updater); - view_dispatcher_enable_queue(updater->view_dispatcher); - view_dispatcher_set_event_callback_context(updater->view_dispatcher, updater); view_dispatcher_set_custom_event_callback( updater->view_dispatcher, updater_custom_event_callback); diff --git a/furi/core/event_loop.c b/furi/core/event_loop.c index feed8d6f44..2a6cd51d32 100644 --- a/furi/core/event_loop.c +++ b/furi/core/event_loop.c @@ -1,5 +1,4 @@ #include "event_loop_i.h" -#include "message_queue_i.h" #include "log.h" #include "check.h" @@ -22,13 +21,17 @@ static FuriEventLoopItem* furi_event_loop_item_alloc( static void furi_event_loop_item_free(FuriEventLoopItem* instance); +static void furi_event_loop_item_free_later(FuriEventLoopItem* instance); + static void furi_event_loop_item_set_callback( FuriEventLoopItem* instance, - FuriEventLoopMessageQueueCallback callback, + FuriEventLoopEventCallback callback, void* callback_context); static void furi_event_loop_item_notify(FuriEventLoopItem* instance); +static bool furi_event_loop_item_is_waiting(FuriEventLoopItem* instance); + static void furi_event_loop_process_pending_callbacks(FuriEventLoop* instance) { for(; !PendingQueue_empty_p(instance->pending_queue); PendingQueue_pop_back(NULL, instance->pending_queue)) { @@ -37,6 +40,21 @@ static void furi_event_loop_process_pending_callbacks(FuriEventLoop* instance) { } } +static bool furi_event_loop_signal_callback(uint32_t signal, void* arg, void* context) { + furi_assert(context); + FuriEventLoop* instance = context; + UNUSED(arg); + + switch(signal) { + case FuriSignalExit: + furi_event_loop_stop(instance); + return true; + // Room for possible other standard signal handlers + default: + return false; + } +} + /* * Main public API */ @@ -67,6 +85,7 @@ void furi_event_loop_free(FuriEventLoop* instance) { furi_event_loop_process_timer_queue(instance); furi_check(TimerList_empty_p(instance->timer_list)); + furi_check(WaitingList_empty_p(instance->waiting_list)); FuriEventLoopTree_clear(instance->tree); PendingQueue_clear(instance->pending_queue); @@ -81,21 +100,81 @@ void furi_event_loop_free(FuriEventLoop* instance) { free(instance); } -static FuriEventLoopProcessStatus - furi_event_loop_poll_process_event(FuriEventLoop* instance, FuriEventLoopItem* item) { - UNUSED(instance); - +static inline FuriEventLoopProcessStatus + furi_event_loop_poll_process_level_event(FuriEventLoopItem* item) { if(!item->contract->get_level(item->object, item->event)) { return FuriEventLoopProcessStatusComplete; + } else if(item->callback(item->object, item->callback_context)) { + return FuriEventLoopProcessStatusIncomplete; + } else { + return FuriEventLoopProcessStatusAgain; } +} +static inline FuriEventLoopProcessStatus + furi_event_loop_poll_process_edge_event(FuriEventLoopItem* item) { if(item->callback(item->object, item->callback_context)) { - return FuriEventLoopProcessStatusIncomplete; + return FuriEventLoopProcessStatusComplete; } else { return FuriEventLoopProcessStatusAgain; } } +static inline FuriEventLoopProcessStatus + furi_event_loop_poll_process_event(FuriEventLoop* instance, FuriEventLoopItem* item) { + FuriEventLoopProcessStatus status; + if(item->event & FuriEventLoopEventFlagOnce) { + furi_event_loop_unsubscribe(instance, item->object); + } + + if(item->event & FuriEventLoopEventFlagEdge) { + status = furi_event_loop_poll_process_edge_event(item); + } else { + status = furi_event_loop_poll_process_level_event(item); + } + + if(item->owner == NULL) { + status = FuriEventLoopProcessStatusFreeLater; + } + + return status; +} + +static void furi_event_loop_process_waiting_list(FuriEventLoop* instance) { + FuriEventLoopItem* item = NULL; + + FURI_CRITICAL_ENTER(); + + if(!WaitingList_empty_p(instance->waiting_list)) { + item = WaitingList_pop_front(instance->waiting_list); + WaitingList_init_field(item); + } + + FURI_CRITICAL_EXIT(); + + if(!item) return; + + while(true) { + FuriEventLoopProcessStatus ret = furi_event_loop_poll_process_event(instance, item); + + if(ret == FuriEventLoopProcessStatusComplete) { + // Event processing complete, break from loop + break; + } else if(ret == FuriEventLoopProcessStatusIncomplete) { + // Event processing incomplete more processing needed + } else if(ret == FuriEventLoopProcessStatusAgain) { //-V547 + furi_event_loop_item_notify(item); + break; + // Unsubscribed from inside the callback, delete item + } else if(ret == FuriEventLoopProcessStatusFreeLater) { //-V547 + furi_event_loop_item_free(item); + break; + } else { + furi_crash(); + } + } +} + static void furi_event_loop_restore_flags(FuriEventLoop* instance, uint32_t flags) { if(flags) { xTaskNotifyIndexed( @@ -134,34 +213,7 @@ void furi_event_loop_run(FuriEventLoop* instance) { break; } else if(flags & FuriEventLoopFlagEvent) { - FuriEventLoopItem* item = NULL; - FURI_CRITICAL_ENTER(); - - if(!WaitingList_empty_p(instance->waiting_list)) { - item = WaitingList_pop_front(instance->waiting_list); - WaitingList_init_field(item); - } - - FURI_CRITICAL_EXIT(); - - if(item) { - while(true) { - FuriEventLoopProcessStatus ret = - furi_event_loop_poll_process_event(instance, item); - if(ret == FuriEventLoopProcessStatusComplete) { - // Event processing complete, break from loop - break; - } else if(ret == FuriEventLoopProcessStatusIncomplete) { - // Event processing incomplete more processing needed - } else if(ret == FuriEventLoopProcessStatusAgain) { //-V547 - furi_event_loop_item_notify(item); - break; - } else { - furi_crash(); - } - } - } - + furi_event_loop_process_waiting_list(instance); furi_event_loop_restore_flags(instance, flags & ~FuriEventLoopFlagEvent); } else if(flags & FuriEventLoopFlagTimer) { @@ -217,87 +269,150 @@ void furi_event_loop_pend_callback( } /* - * Message queue API + * Private generic susbscription API */ -void furi_event_loop_message_queue_subscribe( +static void furi_event_loop_object_subscribe( FuriEventLoop* instance, - FuriMessageQueue* message_queue, + FuriEventLoopObject* object, + const FuriEventLoopContract* contract, FuriEventLoopEvent event, - FuriEventLoopMessageQueueCallback callback, + FuriEventLoopEventCallback callback, void* context) { furi_check(instance); furi_check(instance->thread_id == furi_thread_get_current_id()); - furi_check(instance->state == FuriEventLoopStateStopped); - furi_check(message_queue); + furi_check(object); + furi_assert(contract); + furi_check(callback); FURI_CRITICAL_ENTER(); - furi_check(FuriEventLoopTree_get(instance->tree, message_queue) == NULL); + furi_check(FuriEventLoopTree_get(instance->tree, object) == NULL); // Allocate and setup item - FuriEventLoopItem* item = furi_event_loop_item_alloc( - instance, &furi_message_queue_event_loop_contract, message_queue, event); + FuriEventLoopItem* item = furi_event_loop_item_alloc(instance, contract, object, event); furi_event_loop_item_set_callback(item, callback, context); - FuriEventLoopTree_set_at(instance->tree, message_queue, item); + FuriEventLoopTree_set_at(instance->tree, object, item); - FuriEventLoopLink* link = item->contract->get_link(message_queue); + FuriEventLoopLink* link = item->contract->get_link(object); + FuriEventLoopEvent event_noflags = item->event & FuriEventLoopEventMask; - if(item->event == FuriEventLoopEventIn) { + if(event_noflags == FuriEventLoopEventIn) { furi_check(link->item_in == NULL); link->item_in = item; - } else if(item->event == FuriEventLoopEventOut) { + } else if(event_noflags == FuriEventLoopEventOut) { furi_check(link->item_out == NULL); link->item_out = item; } else { furi_crash(); } - if(item->contract->get_level(item->object, item->event)) { - furi_event_loop_item_notify(item); + if(!(item->event & FuriEventLoopEventFlagEdge)) { + if(item->contract->get_level(item->object, event_noflags)) { + furi_event_loop_item_notify(item); + } } FURI_CRITICAL_EXIT(); } -void furi_event_loop_message_queue_unsubscribe( +/** + * Public specialized subscription API + */ + +void furi_event_loop_subscribe_message_queue( FuriEventLoop* instance, - FuriMessageQueue* message_queue) { + FuriMessageQueue* message_queue, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, + void* context) { + extern const FuriEventLoopContract furi_message_queue_event_loop_contract; + + furi_event_loop_object_subscribe( + instance, message_queue, &furi_message_queue_event_loop_contract, event, callback, context); +} + +void furi_event_loop_subscribe_stream_buffer( + FuriEventLoop* instance, + FuriStreamBuffer* stream_buffer, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, + void* context) { + extern const FuriEventLoopContract furi_stream_buffer_event_loop_contract; + + furi_event_loop_object_subscribe( + instance, stream_buffer, &furi_stream_buffer_event_loop_contract, event, callback, context); +} + +void furi_event_loop_subscribe_semaphore( + FuriEventLoop* instance, + FuriSemaphore* semaphore, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, + void* context) { + extern const FuriEventLoopContract furi_semaphore_event_loop_contract; + + furi_event_loop_object_subscribe( + instance, semaphore, &furi_semaphore_event_loop_contract, event, callback, context); +} + +void furi_event_loop_subscribe_mutex( + FuriEventLoop* instance, + FuriMutex* mutex, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, + void* context) { + extern const FuriEventLoopContract furi_mutex_event_loop_contract; + + furi_event_loop_object_subscribe( + instance, mutex, &furi_mutex_event_loop_contract, event, callback, context); +} + +/** + * Public generic unsubscription API + */ + +void furi_event_loop_unsubscribe(FuriEventLoop* instance, FuriEventLoopObject* object) { furi_check(instance); - furi_check(instance->state == FuriEventLoopStateStopped); furi_check(instance->thread_id == furi_thread_get_current_id()); FURI_CRITICAL_ENTER(); - FuriEventLoopItem** item_ptr = FuriEventLoopTree_get(instance->tree, message_queue); - furi_check(item_ptr); + FuriEventLoopItem* item = NULL; + furi_check(FuriEventLoopTree_pop_at(&item, instance->tree, object)); - FuriEventLoopItem* item = *item_ptr; furi_check(item); furi_check(item->owner == instance); - FuriEventLoopLink* link = item->contract->get_link(message_queue); + FuriEventLoopLink* link = item->contract->get_link(object); + FuriEventLoopEvent event_noflags = item->event & FuriEventLoopEventMask; - if(item->event == FuriEventLoopEventIn) { + if(event_noflags == FuriEventLoopEventIn) { furi_check(link->item_in == item); link->item_in = NULL; - } else if(item->event == FuriEventLoopEventOut) { + } else if(event_noflags == FuriEventLoopEventOut) { furi_check(link->item_out == item); link->item_out = NULL; } else { furi_crash(); } - furi_event_loop_item_free(item); + if(furi_event_loop_item_is_waiting(item)) { + WaitingList_unlink(item); + } - FuriEventLoopTree_erase(instance->tree, message_queue); + if(instance->state == FuriEventLoopStateProcessing) { + furi_event_loop_item_free_later(item); + } else { + furi_event_loop_item_free(item); + } FURI_CRITICAL_EXIT(); } /* - * Event Loop Item API, used internally + * Private Event Loop Item functions */ static FuriEventLoopItem* furi_event_loop_item_alloc( @@ -322,12 +437,19 @@ static FuriEventLoopItem* furi_event_loop_item_alloc( static void furi_event_loop_item_free(FuriEventLoopItem* instance) { furi_assert(instance); + furi_assert(!furi_event_loop_item_is_waiting(instance)); free(instance); } +static void furi_event_loop_item_free_later(FuriEventLoopItem* instance) { + furi_assert(instance); + furi_assert(!furi_event_loop_item_is_waiting(instance)); + instance->owner = NULL; +} + static void furi_event_loop_item_set_callback( FuriEventLoopItem* instance, - FuriEventLoopMessageQueueCallback callback, + FuriEventLoopEventCallback callback, void* callback_context) { furi_assert(instance); furi_assert(!instance->callback); @@ -341,27 +463,35 @@ static void furi_event_loop_item_notify(FuriEventLoopItem* instance) { FURI_CRITICAL_ENTER(); - if(!instance->WaitingList.prev && !instance->WaitingList.next) { - WaitingList_push_back(instance->owner->waiting_list, instance); + FuriEventLoop* owner = instance->owner; + furi_assert(owner); + + if(!furi_event_loop_item_is_waiting(instance)) { + WaitingList_push_back(owner->waiting_list, instance); } FURI_CRITICAL_EXIT(); xTaskNotifyIndexed( - instance->owner->thread_id, - FURI_EVENT_LOOP_FLAG_NOTIFY_INDEX, - FuriEventLoopFlagEvent, - eSetBits); + owner->thread_id, FURI_EVENT_LOOP_FLAG_NOTIFY_INDEX, FuriEventLoopFlagEvent, eSetBits); +} + +static bool furi_event_loop_item_is_waiting(FuriEventLoopItem* instance) { + return instance->WaitingList.prev || instance->WaitingList.next; } +/* + * Internal event loop link API, used by supported primitives + */ + void furi_event_loop_link_notify(FuriEventLoopLink* instance, FuriEventLoopEvent event) { furi_assert(instance); FURI_CRITICAL_ENTER(); - if(event == FuriEventLoopEventIn) { + if(event & FuriEventLoopEventIn) { if(instance->item_in) furi_event_loop_item_notify(instance->item_in); - } else if(event == FuriEventLoopEventOut) { + } else if(event & FuriEventLoopEventOut) { if(instance->item_out) furi_event_loop_item_notify(instance->item_out); } else { furi_crash(); @@ -369,18 +499,3 @@ void furi_event_loop_link_notify(FuriEventLoopLink* instance, FuriEventLoopEvent FURI_CRITICAL_EXIT(); } - -bool furi_event_loop_signal_callback(uint32_t signal, void* arg, void* context) { - furi_assert(context); - FuriEventLoop* instance = context; - UNUSED(arg); - - switch(signal) { - case FuriSignalExit: - furi_event_loop_stop(instance); - return true; - // Room for possible other standard signal handlers - default: - return false; - } -} diff --git a/furi/core/event_loop.h b/furi/core/event_loop.h index 9ae9f6c4dd..af5987101d 100644 --- a/furi/core/event_loop.h +++ b/furi/core/event_loop.h @@ -20,10 +20,83 @@ extern "C" { #endif -/** Event Loop events */ +/** + * @brief Enumeration of event types, flags and masks. + * + * Only one event direction (In or Out) can be used per subscription. + * An object can have no more than one subscription for each direction. + * + * Additional flags that modify the behaviour can be + * set using the bitwise OR operation (see flag description). + */ typedef enum { - FuriEventLoopEventOut, /**< On departure: item was retrieved from container, flag reset, etc... */ - FuriEventLoopEventIn, /**< On arrival: item was inserted into container, flag set, etc... */ + /** + * @brief Subscribe to In events. + * + * In events occur on the following conditions: + * - One or more items were inserted into a FuriMessageQueue, + * - Enough data has been written to a FuriStreamBuffer, + * - A FuriSemaphore has been released at least once, + * - A FuriMutex has been released. + */ + FuriEventLoopEventIn = 0x00000001U, + /** + * @brief Subscribe to Out events. + * + * Out events occur on the following conditions: + * - One or more items were removed from a FuriMessageQueue, + * - Any amount of data has been read out of a FuriStreamBuffer, + * - A FuriSemaphore has been acquired at least once, + * - A FuriMutex has been acquired. + */ + FuriEventLoopEventOut = 0x00000002U, + /** + * @brief Special value containing the event direction bits, used internally. + */ + FuriEventLoopEventMask = 0x00000003U, + /** + * @brief Use edge triggered events. + * + * By default, level triggered events are used. A level above zero + * is reported based on the following conditions: + * + * In events: + * - a FuriMessageQueue contains one or more items, + * - a FuriStreamBuffer contains one or more bytes, + * - a FuriSemaphore can be acquired at least once, + * - a FuriMutex can be acquired. + * + * Out events: + * - a FuriMessageQueue has at least one item of free space, + * - a FuriStreamBuffer has at least one byte of free space, + * - a FuriSemaphore has been acquired at least once, + * - a FuriMutex has been acquired. + * + * If this flag is NOT set, the event will be generated repeatedly until + * the level becomes zero (e.g. all items have been removed from + * a FuriMessageQueue in case of the "In" event, etc.) + * + * If this flag IS set, then the above check is skipped and the event + * is generated ONLY when a change occurs, with the event direction + * (In or Out) taken into account. + */ + FuriEventLoopEventFlagEdge = 0x00000004U, + /** + * @brief Automatically unsubscribe from events after one time. + * + * By default, events will be generated each time the specified conditions + * have been met. If this flag IS set, the event subscription will be cancelled + * upon the first occurred event and no further events will be generated. + */ + FuriEventLoopEventFlagOnce = 0x00000008U, + /** + * @brief Special value containing the event flag bits, used internally. + */ + FuriEventLoopEventFlagMask = 0xFFFFFFFCU, + /** + * @brief Special value to force the enum to 32-bit values. + */ + FuriEventLoopEventReserved = UINT32_MAX, } FuriEventLoopEvent; /** Anonymous message queue type */ @@ -115,21 +188,22 @@ void furi_event_loop_pend_callback( void* context); /* - * Message queue related APIs + * Event subscription/notification APIs */ -/** Anonymous message queue type */ -typedef struct FuriMessageQueue FuriMessageQueue; +typedef void FuriEventLoopObject; -/** Callback type for message queue +/** Callback type for event loop events * - * @param queue The queue that triggered event - * @param context The context that was provided on - * furi_event_loop_message_queue_subscribe call + * @param object The object that triggered the event + * @param context The context that was provided upon subscription * * @return true if event was processed, false if we need to delay processing */ -typedef bool (*FuriEventLoopMessageQueueCallback)(FuriMessageQueue* queue, void* context); +typedef bool (*FuriEventLoopEventCallback)(FuriEventLoopObject* object, void* context); + +/** Opaque message queue type */ +typedef struct FuriMessageQueue FuriMessageQueue; /** Subscribe to message queue events * @@ -141,21 +215,79 @@ typedef bool (*FuriEventLoopMessageQueueCallback)(FuriMessageQueue* queue, void* * @param[in] callback The callback to call on event * @param context The context for callback */ -void furi_event_loop_message_queue_subscribe( +void furi_event_loop_subscribe_message_queue( FuriEventLoop* instance, FuriMessageQueue* message_queue, FuriEventLoopEvent event, - FuriEventLoopMessageQueueCallback callback, + FuriEventLoopEventCallback callback, + void* context); + +/** Opaque stream buffer type */ +typedef struct FuriStreamBuffer FuriStreamBuffer; + +/** Subscribe to stream buffer events + * + * @warning you can only have one subscription for one event type. + * + * @param instance The Event Loop instance + * @param stream_buffer The stream buffer to add + * @param[in] event The Event Loop event to trigger on + * @param[in] callback The callback to call on event + * @param context The context for callback + */ +void furi_event_loop_subscribe_stream_buffer( + FuriEventLoop* instance, + FuriStreamBuffer* stream_buffer, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, + void* context); + +/** Opaque semaphore type */ +typedef struct FuriSemaphore FuriSemaphore; + +/** Subscribe to semaphore events + * + * @warning you can only have one subscription for one event type. + * + * @param instance The Event Loop instance + * @param semaphore The semaphore to add + * @param[in] event The Event Loop event to trigger on + * @param[in] callback The callback to call on event + * @param context The context for callback + */ +void furi_event_loop_subscribe_semaphore( + FuriEventLoop* instance, + FuriSemaphore* semaphore, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, void* context); -/** Unsubscribe from message queue +/** Opaque mutex type */ +typedef struct FuriMutex FuriMutex; + +/** Subscribe to mutex events + * + * @warning you can only have one subscription for one event type. * * @param instance The Event Loop instance - * @param message_queue The message queue + * @param mutex The mutex to add + * @param[in] event The Event Loop event to trigger on + * @param[in] callback The callback to call on event + * @param context The context for callback */ -void furi_event_loop_message_queue_unsubscribe( +void furi_event_loop_subscribe_mutex( FuriEventLoop* instance, - FuriMessageQueue* message_queue); + FuriMutex* mutex, + FuriEventLoopEvent event, + FuriEventLoopEventCallback callback, + void* context); + +/** Unsubscribe from events (common) + * + * @param instance The Event Loop instance + * @param object The object to unsubscribe from + */ +void furi_event_loop_unsubscribe(FuriEventLoop* instance, FuriEventLoopObject* object); #ifdef __cplusplus } diff --git a/furi/core/event_loop_i.h b/furi/core/event_loop_i.h index cd10148673..15efa8f864 100644 --- a/furi/core/event_loop_i.h +++ b/furi/core/event_loop_i.h @@ -16,16 +16,16 @@ struct FuriEventLoopItem { FuriEventLoop* owner; // Tracking item - const FuriEventLoopContract* contract; - void* object; FuriEventLoopEvent event; + FuriEventLoopObject* object; + const FuriEventLoopContract* contract; // Callback and context - FuriEventLoopMessageQueueCallback callback; + FuriEventLoopEventCallback callback; void* callback_context; // Waiting list - ILIST_INTERFACE(WaitingList, struct FuriEventLoopItem); + ILIST_INTERFACE(WaitingList, FuriEventLoopItem); }; ILIST_DEF(WaitingList, FuriEventLoopItem, M_POD_OPLIST) @@ -36,7 +36,7 @@ ILIST_DEF(WaitingList, FuriEventLoopItem, M_POD_OPLIST) BPTREE_DEF2( // NOLINT FuriEventLoopTree, FURI_EVENT_LOOP_TREE_RANK, - void*, /* pointer to object we track */ + FuriEventLoopObject*, /* pointer to object we track */ M_PTR_OPLIST, FuriEventLoopItem*, /* pointer to the FuriEventLoopItem */ M_PTR_OPLIST) @@ -60,6 +60,7 @@ typedef enum { FuriEventLoopProcessStatusComplete, FuriEventLoopProcessStatusIncomplete, FuriEventLoopProcessStatusAgain, + FuriEventLoopProcessStatusFreeLater, } FuriEventLoopProcessStatus; typedef enum { diff --git a/furi/core/event_loop_link_i.h b/furi/core/event_loop_link_i.h index 5c0b144a1b..992ca65555 100644 --- a/furi/core/event_loop_link_i.h +++ b/furi/core/event_loop_link_i.h @@ -19,17 +19,16 @@ void furi_event_loop_link_notify(FuriEventLoopLink* instance, FuriEventLoopEvent /* Contract between event loop and an object */ -typedef FuriEventLoopLink* (*FuriEventLoopContractGetLink)(void* object); +typedef FuriEventLoopLink* (*FuriEventLoopContractGetLink)(FuriEventLoopObject* object); -typedef uint32_t (*FuriEventLoopContractGetLevel)(void* object, FuriEventLoopEvent event); +typedef uint32_t ( + *FuriEventLoopContractGetLevel)(FuriEventLoopObject* object, FuriEventLoopEvent event); typedef struct { const FuriEventLoopContractGetLink get_link; const FuriEventLoopContractGetLevel get_level; } FuriEventLoopContract; -bool furi_event_loop_signal_callback(uint32_t signal, void* arg, void* context); - #ifdef __cplusplus } #endif diff --git a/furi/core/message_queue.c b/furi/core/message_queue.c index 3521ceb30b..bd0cec0214 100644 --- a/furi/core/message_queue.c +++ b/furi/core/message_queue.c @@ -1,4 +1,4 @@ -#include "message_queue_i.h" +#include "message_queue.h" #include #include @@ -6,6 +6,8 @@ #include "kernel.h" #include "check.h" +#include "event_loop_link_i.h" + // Internal FreeRTOS member names #define uxMessagesWaiting uxDummy4[0] #define uxLength uxDummy4[1] @@ -13,10 +15,7 @@ struct FuriMessageQueue { StaticQueue_t container; - - // Event Loop Link FuriEventLoopLink event_loop_link; - uint8_t buffer[]; }; @@ -208,13 +207,14 @@ FuriStatus furi_message_queue_reset(FuriMessageQueue* instance) { return stat; } -static FuriEventLoopLink* furi_message_queue_event_loop_get_link(void* object) { +static FuriEventLoopLink* furi_message_queue_event_loop_get_link(FuriEventLoopObject* object) { FuriMessageQueue* instance = object; furi_assert(instance); return &instance->event_loop_link; } -static uint32_t furi_message_queue_event_loop_get_level(void* object, FuriEventLoopEvent event) { +static uint32_t + furi_message_queue_event_loop_get_level(FuriEventLoopObject* object, FuriEventLoopEvent event) { FuriMessageQueue* instance = object; furi_assert(instance); diff --git a/furi/core/message_queue_i.h b/furi/core/message_queue_i.h deleted file mode 100644 index a88d04131a..0000000000 --- a/furi/core/message_queue_i.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "message_queue.h" -#include "event_loop_link_i.h" - -extern const FuriEventLoopContract furi_message_queue_event_loop_contract; diff --git a/furi/core/mutex.c b/furi/core/mutex.c index f59ae83ada..f9848e1baa 100644 --- a/furi/core/mutex.c +++ b/furi/core/mutex.c @@ -1,15 +1,18 @@ #include "mutex.h" -#include "check.h" -#include "common_defines.h" #include #include +#include "check.h" + +#include "event_loop_link_i.h" + // Internal FreeRTOS member names #define ucQueueType ucDummy9 struct FuriMutex { StaticSemaphore_t container; + FuriEventLoopLink event_loop_link; }; // IMPORTANT: container MUST be the FIRST struct member @@ -39,6 +42,10 @@ void furi_mutex_free(FuriMutex* instance) { furi_check(!FURI_IS_IRQ_MODE()); furi_check(instance); + // Event Loop must be disconnected + furi_check(!instance->event_loop_link.item_in); + furi_check(!instance->event_loop_link.item_out); + vSemaphoreDelete((SemaphoreHandle_t)instance); free(instance); } @@ -76,6 +83,10 @@ FuriStatus furi_mutex_acquire(FuriMutex* instance, uint32_t timeout) { furi_crash(); } + if(stat == FuriStatusOk) { + furi_event_loop_link_notify(&instance->event_loop_link, FuriEventLoopEventOut); + } + return stat; } @@ -104,6 +115,10 @@ FuriStatus furi_mutex_release(FuriMutex* instance) { furi_crash(); } + if(stat == FuriStatusOk) { + furi_event_loop_link_notify(&instance->event_loop_link, FuriEventLoopEventIn); + } + return stat; } @@ -122,3 +137,26 @@ FuriThreadId furi_mutex_get_owner(FuriMutex* instance) { return owner; } + +static FuriEventLoopLink* furi_mutex_event_loop_get_link(FuriEventLoopObject* object) { + FuriMutex* instance = object; + furi_assert(instance); + return &instance->event_loop_link; +} + +static uint32_t + furi_mutex_event_loop_get_level(FuriEventLoopObject* object, FuriEventLoopEvent event) { + FuriMutex* instance = object; + furi_assert(instance); + + if(event == FuriEventLoopEventIn || event == FuriEventLoopEventOut) { + return furi_mutex_get_owner(instance) ? 0 : 1; + } else { + furi_crash(); + } +} + +const FuriEventLoopContract furi_mutex_event_loop_contract = { + .get_link = furi_mutex_event_loop_get_link, + .get_level = furi_mutex_event_loop_get_level, +}; diff --git a/furi/core/semaphore.c b/furi/core/semaphore.c index 6413eb65f5..850169ad6e 100644 --- a/furi/core/semaphore.c +++ b/furi/core/semaphore.c @@ -1,12 +1,20 @@ #include "semaphore.h" -#include "check.h" -#include "common_defines.h" #include #include +#include "check.h" +#include "kernel.h" + +#include "event_loop_link_i.h" + +// Internal FreeRTOS member names +#define uxMessagesWaiting uxDummy4[0] +#define uxLength uxDummy4[1] + struct FuriSemaphore { StaticSemaphore_t container; + FuriEventLoopLink event_loop_link; }; // IMPORTANT: container MUST be the FIRST struct member @@ -40,6 +48,10 @@ void furi_semaphore_free(FuriSemaphore* instance) { furi_check(instance); furi_check(!FURI_IS_IRQ_MODE()); + // Event Loop must be disconnected + furi_check(!instance->event_loop_link.item_in); + furi_check(!instance->event_loop_link.item_out); + vSemaphoreDelete((SemaphoreHandle_t)instance); free(instance); } @@ -76,6 +88,10 @@ FuriStatus furi_semaphore_acquire(FuriSemaphore* instance, uint32_t timeout) { } } + if(stat == FuriStatusOk) { + furi_event_loop_link_notify(&instance->event_loop_link, FuriEventLoopEventOut); + } + return stat; } @@ -103,6 +119,10 @@ FuriStatus furi_semaphore_release(FuriSemaphore* instance) { } } + if(stat == FuriStatusOk) { + furi_event_loop_link_notify(&instance->event_loop_link, FuriEventLoopEventIn); + } + return stat; } @@ -120,3 +140,46 @@ uint32_t furi_semaphore_get_count(FuriSemaphore* instance) { return count; } + +uint32_t furi_semaphore_get_space(FuriSemaphore* instance) { + furi_assert(instance); + + uint32_t space; + + if(furi_kernel_is_irq_or_masked() != 0U) { + uint32_t isrm = taskENTER_CRITICAL_FROM_ISR(); + + space = instance->container.uxLength - instance->container.uxMessagesWaiting; + + taskEXIT_CRITICAL_FROM_ISR(isrm); + } else { + space = uxQueueSpacesAvailable((QueueHandle_t)instance); + } + + return space; +} + +static FuriEventLoopLink* furi_semaphore_event_loop_get_link(FuriEventLoopObject* object) { + FuriSemaphore* instance = object; + furi_assert(instance); + return &instance->event_loop_link; +} + +static uint32_t + furi_semaphore_event_loop_get_level(FuriEventLoopObject* object, FuriEventLoopEvent event) { + FuriSemaphore* instance = object; + furi_assert(instance); + + if(event == FuriEventLoopEventIn) { + return furi_semaphore_get_count(instance); + } else if(event == FuriEventLoopEventOut) { + return furi_semaphore_get_space(instance); + } else { + furi_crash(); + } +} + +const FuriEventLoopContract furi_semaphore_event_loop_contract = { + .get_link = furi_semaphore_event_loop_get_link, + .get_level = furi_semaphore_event_loop_get_level, +}; diff --git a/furi/core/semaphore.h b/furi/core/semaphore.h index c6b9a1176a..47a77ed558 100644 --- a/furi/core/semaphore.h +++ b/furi/core/semaphore.h @@ -53,6 +53,14 @@ FuriStatus furi_semaphore_release(FuriSemaphore* instance); */ uint32_t furi_semaphore_get_count(FuriSemaphore* instance); +/** Get available space + * + * @param instance The pointer to FuriSemaphore instance + * + * @return Semaphore available space + */ +uint32_t furi_semaphore_get_space(FuriSemaphore* instance); + #ifdef __cplusplus } #endif diff --git a/furi/core/stream_buffer.c b/furi/core/stream_buffer.c index ef8869dea0..f35abec647 100644 --- a/furi/core/stream_buffer.c +++ b/furi/core/stream_buffer.c @@ -1,13 +1,19 @@ #include "stream_buffer.h" +#include +#include + #include "check.h" #include "common_defines.h" -#include -#include +#include "event_loop_link_i.h" + +// Internal FreeRTOS member names +#define xTriggerLevelBytes uxDummy1[3] struct FuriStreamBuffer { StaticStreamBuffer_t container; + FuriEventLoopLink event_loop_link; uint8_t buffer[]; }; @@ -34,6 +40,10 @@ FuriStreamBuffer* furi_stream_buffer_alloc(size_t size, size_t trigger_level) { void furi_stream_buffer_free(FuriStreamBuffer* stream_buffer) { furi_check(stream_buffer); + // Event Loop must be disconnected + furi_check(!stream_buffer->event_loop_link.item_in); + furi_check(!stream_buffer->event_loop_link.item_out); + vStreamBufferDelete((StreamBufferHandle_t)stream_buffer); free(stream_buffer); } @@ -61,6 +71,16 @@ size_t furi_stream_buffer_send( ret = xStreamBufferSend((StreamBufferHandle_t)stream_buffer, data, length, timeout); } + if(ret > 0) { + const size_t bytes_available = + xStreamBufferBytesAvailable((StreamBufferHandle_t)stream_buffer); + const size_t trigger_level = ((StaticStreamBuffer_t*)stream_buffer)->xTriggerLevelBytes; + + if(bytes_available >= trigger_level) { + furi_event_loop_link_notify(&stream_buffer->event_loop_link, FuriEventLoopEventIn); + } + } + return ret; } @@ -82,6 +102,10 @@ size_t furi_stream_buffer_receive( ret = xStreamBufferReceive((StreamBufferHandle_t)stream_buffer, data, length, timeout); } + if(ret > 0) { + furi_event_loop_link_notify(&stream_buffer->event_loop_link, FuriEventLoopEventOut); + } + return ret; } @@ -112,9 +136,42 @@ bool furi_stream_buffer_is_empty(FuriStreamBuffer* stream_buffer) { FuriStatus furi_stream_buffer_reset(FuriStreamBuffer* stream_buffer) { furi_check(stream_buffer); + FuriStatus status; + if(xStreamBufferReset((StreamBufferHandle_t)stream_buffer) == pdPASS) { - return FuriStatusOk; + status = FuriStatusOk; } else { - return FuriStatusError; + status = FuriStatusError; + } + + if(status == FuriStatusOk) { + furi_event_loop_link_notify(&stream_buffer->event_loop_link, FuriEventLoopEventOut); + } + + return status; +} + +static FuriEventLoopLink* furi_stream_buffer_event_loop_get_link(FuriEventLoopObject* object) { + FuriStreamBuffer* stream_buffer = object; + furi_assert(stream_buffer); + return &stream_buffer->event_loop_link; +} + +static uint32_t + furi_stream_buffer_event_loop_get_level(FuriEventLoopObject* object, FuriEventLoopEvent event) { + FuriStreamBuffer* stream_buffer = object; + furi_assert(stream_buffer); + + if(event == FuriEventLoopEventIn) { + return xStreamBufferBytesAvailable((StreamBufferHandle_t)stream_buffer); + } else if(event == FuriEventLoopEventOut) { + return xStreamBufferSpacesAvailable((StreamBufferHandle_t)stream_buffer); + } else { + furi_crash(); } } + +const FuriEventLoopContract furi_stream_buffer_event_loop_contract = { + .get_link = furi_stream_buffer_event_loop_get_link, + .get_level = furi_stream_buffer_event_loop_get_level, +}; diff --git a/lib/SConscript b/lib/SConscript index 7f13aad445..fb0473f8d4 100644 --- a/lib/SConscript +++ b/lib/SConscript @@ -32,7 +32,6 @@ libs = env.BuildModules( "digital_signal", "pulse_reader", "signal_reader", - "appframe", "u8g2", "lfrfid", "flipper_application", diff --git a/lib/app-scened-template/generic_scene.hpp b/lib/app-scened-template/generic_scene.hpp deleted file mode 100644 index 580346c8c0..0000000000 --- a/lib/app-scened-template/generic_scene.hpp +++ /dev/null @@ -1,10 +0,0 @@ -template -class GenericScene { -public: - virtual void on_enter(TApp* app, bool need_restore) = 0; - virtual bool on_event(TApp* app, typename TApp::Event* event) = 0; - virtual void on_exit(TApp* app) = 0; - virtual ~GenericScene() {}; - -private: -}; diff --git a/lib/app-scened-template/record_controller.hpp b/lib/app-scened-template/record_controller.hpp deleted file mode 100644 index 3453c12f3a..0000000000 --- a/lib/app-scened-template/record_controller.hpp +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#include - -/** - * @brief Class for opening, casting, holding and closing records - * - * @tparam TRecordClass record class - */ -template -class RecordController { -public: - /** - * @brief Construct a new Record Controller object for record with record name - * - * @param record_name record name - */ - RecordController(const char* record_name) { - name = record_name; - value = static_cast(furi_record_open(name)); - } - - ~RecordController() { - furi_record_close(name); - } - - /** - * @brief Record getter - * - * @return TRecordClass* record value - */ - TRecordClass* get() { - return value; - } - - /** - * @brief Record getter (by cast) - * - * @return TRecordClass* record value - */ - operator TRecordClass*() const { - return value; - } - -private: - const char* name; - TRecordClass* value; -}; diff --git a/lib/app-scened-template/scene_controller.hpp b/lib/app-scened-template/scene_controller.hpp deleted file mode 100644 index eb43109584..0000000000 --- a/lib/app-scened-template/scene_controller.hpp +++ /dev/null @@ -1,246 +0,0 @@ -#include -#include -#include - -#define GENERIC_SCENE_ENUM_VALUES Exit, Start -#define GENERIC_EVENT_ENUM_VALUES Tick, Back - -/** - * @brief Controller for scene navigation in application - * - * @tparam TScene generic scene class - * @tparam TApp application class - */ -template -class SceneController { -public: - /** - * @brief Add scene to scene container - * - * @param scene_index scene index - * @param scene_pointer scene object pointer - */ - void add_scene(typename TApp::SceneType scene_index, TScene* scene_pointer) { - furi_check(scenes.count(scene_index) == 0); - scenes[scene_index] = scene_pointer; - } - - /** - * @brief Switch to next scene and store current scene in previous scenes list - * - * @param scene_index next scene index - * @param need_restore true, if we want the scene to restore its parameters - */ - void switch_to_next_scene(typename TApp::SceneType scene_index, bool need_restore = false) { - previous_scenes_list.push_front(current_scene_index); - switch_to_scene(scene_index, need_restore); - } - - /** - * @brief Switch to next scene without ability to return to current scene - * - * @param scene_index next scene index - * @param need_restore true, if we want the scene to restore its parameters - */ - void switch_to_scene(typename TApp::SceneType scene_index, bool need_restore = false) { - if(scene_index != TApp::SceneType::Exit) { - scenes[current_scene_index]->on_exit(app); - current_scene_index = scene_index; - scenes[current_scene_index]->on_enter(app, need_restore); - } - } - - /** - * @brief Search the scene in the list of previous scenes and switch to it - * - * @param scene_index_list list of scene indexes to which you want to switch - */ - bool search_and_switch_to_previous_scene( - const std::initializer_list& scene_index_list) { - auto previous_scene_index = TApp::SceneType::Exit; - bool scene_found = false; - bool result = false; - - while(!scene_found) { - previous_scene_index = get_previous_scene_index(); - for(const auto& element : scene_index_list) { - if(previous_scene_index == element) { - scene_found = true; - result = true; - break; - } - - if(previous_scene_index == TApp::SceneType::Exit) { - scene_found = true; - break; - } - } - } - - if(result) { - switch_to_scene(previous_scene_index, true); - } - - return result; - } - - bool search_and_switch_to_another_scene( - const std::initializer_list& scene_index_list, - typename TApp::SceneType scene_index) { - auto previous_scene_index = TApp::SceneType::Exit; - bool scene_found = false; - bool result = false; - - while(!scene_found) { - previous_scene_index = get_previous_scene_index(); - for(const auto& element : scene_index_list) { - if(previous_scene_index == element) { - scene_found = true; - result = true; - break; - } - - if(previous_scene_index == TApp::SceneType::Exit) { - scene_found = true; - break; - } - } - } - - if(result) { - switch_to_scene(scene_index, true); - } - - return result; - } - - bool has_previous_scene( - const std::initializer_list& scene_index_list) { - bool result = false; - - for(auto const& previous_element : previous_scenes_list) { - for(const auto& element : scene_index_list) { - if(previous_element == element) { - result = true; - break; - } - - if(previous_element == TApp::SceneType::Exit) { - break; - } - } - - if(result) break; - } - - return result; - } - - /** - * @brief Start application main cycle - * - * @param tick_length_ms tick event length in milliseconds - */ - void process( - uint32_t /* tick_length_ms */ = 100, - typename TApp::SceneType start_scene_index = TApp::SceneType::Start) { - typename TApp::Event event; - bool consumed; - bool exit = false; - - current_scene_index = start_scene_index; - scenes[current_scene_index]->on_enter(app, false); - - while(!exit) { - app->view_controller.receive_event(&event); - - consumed = scenes[current_scene_index]->on_event(app, &event); - - if(!consumed) { - if(event.type == TApp::EventType::Back) { - exit = switch_to_previous_scene(); - } - } - }; - - scenes[current_scene_index]->on_exit(app); - } - - /** - * @brief Switch to previous scene - * - * @param count how many steps back - * @return true if app need to exit - */ - bool switch_to_previous_scene(uint8_t count = 1) { - auto previous_scene_index = TApp::SceneType::Start; - - for(uint8_t i = 0; i < count; i++) - previous_scene_index = get_previous_scene_index(); - - if(previous_scene_index == TApp::SceneType::Exit) return true; - - switch_to_scene(previous_scene_index, true); - return false; - } - - /** - * @brief Construct a new Scene Controller object - * - * @param app_pointer pointer to application class - */ - SceneController(TApp* app_pointer) { - app = app_pointer; - current_scene_index = TApp::SceneType::Exit; - } - - /** - * @brief Destroy the Scene Controller object - * - */ - ~SceneController() { - for(auto& it : scenes) - delete it.second; - } - -private: - /** - * @brief Scenes pointers container - * - */ - std::map scenes; - - /** - * @brief List of indexes of previous scenes - * - */ - std::forward_list previous_scenes_list; - - /** - * @brief Current scene index holder - * - */ - typename TApp::SceneType current_scene_index; - - /** - * @brief Application pointer holder - * - */ - TApp* app; - - /** - * @brief Get the previous scene index - * - * @return previous scene index - */ - typename TApp::SceneType get_previous_scene_index() { - auto scene_index = TApp::SceneType::Exit; - - if(!previous_scenes_list.empty()) { - scene_index = previous_scenes_list.front(); - previous_scenes_list.pop_front(); - } - - return scene_index; - } -}; diff --git a/lib/app-scened-template/text_store.cpp b/lib/app-scened-template/text_store.cpp deleted file mode 100644 index c81a2c4e78..0000000000 --- a/lib/app-scened-template/text_store.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "text_store.h" -#include - -TextStore::TextStore(uint8_t _text_size) - : text_size(_text_size) { - text = static_cast(malloc(text_size + 1)); -} - -TextStore::~TextStore() { - free(text); -} - -void TextStore::set(const char* _text...) { - va_list args; - va_start(args, _text); - vsnprintf(text, text_size, _text, args); - va_end(args); -} diff --git a/lib/app-scened-template/text_store.h b/lib/app-scened-template/text_store.h deleted file mode 100644 index 3fe58ed1df..0000000000 --- a/lib/app-scened-template/text_store.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include - -class TextStore { -public: - TextStore(uint8_t text_size); - ~TextStore(void); - - void set(const char* text...); - const uint8_t text_size; - char* text; -}; diff --git a/lib/app-scened-template/typeindex_no_rtti.hpp b/lib/app-scened-template/typeindex_no_rtti.hpp deleted file mode 100644 index 579a0189d9..0000000000 --- a/lib/app-scened-template/typeindex_no_rtti.hpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - * type_index without RTTI - * - * Copyright frickiericker 2016. - * Distributed under the Boost Software License, Version 1.0. - * - * Permission is hereby granted, free of charge, to any person or organization - * obtaining a copy of the software and accompanying documentation covered by - * this license (the "Software") to use, reproduce, display, distribute, - * execute, and transmit the Software, and to prepare derivative works of the - * Software, and to permit third-parties to whom the Software is furnished to - * do so, all subject to the following: - * - * The copyright notices in the Software and this entire statement, including - * the above license grant, this restriction and the following disclaimer, - * must be included in all copies of the Software, in whole or in part, and - * all derivative works of the Software, unless such copies or derivative - * works are solely in the form of machine-executable object code generated by - * a source language processor. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT - * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE - * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#include - -namespace ext { -/** - * Dummy type for tag-dispatching. - */ -template -struct tag_type {}; - -/** - * A value of tag_type. - */ -template -constexpr tag_type tag{}; - -/** - * A type_index implementation without RTTI. - */ -struct type_index { - /** - * Creates a type_index object for the specified type. - */ - template - type_index(tag_type) noexcept - : hash_code_{index} { - } - - /** - * Returns the hash code. - */ - std::size_t hash_code() const noexcept { - return hash_code_; - } - -private: - /** - * Unique integral index associated to template type argument. - */ - template - static std::size_t const index; - - /** - * Global counter for generating index values. - */ - static std::size_t& counter() noexcept { - static std::size_t counter_; - return counter_; - } - -private: - std::size_t hash_code_; -}; - -template -std::size_t const type_index::index = type_index::counter()++; - -/** - * Creates a type_index object for the specified type. - * - * Equivalent to `ext::type_index{ext::tag}`. - */ -template -type_index make_type_index() noexcept { - return tag; -} - -inline bool operator==(type_index const& a, type_index const& b) noexcept { - return a.hash_code() == b.hash_code(); -} - -inline bool operator!=(type_index const& a, type_index const& b) noexcept { - return !(a == b); -} - -inline bool operator<(type_index const& a, type_index const& b) noexcept { - return a.hash_code() < b.hash_code(); -} - -inline bool operator<=(type_index const& a, type_index const& b) noexcept { - return a.hash_code() <= b.hash_code(); -} - -inline bool operator>(type_index const& a, type_index const& b) noexcept { - return !(a <= b); -} - -inline bool operator>=(type_index const& a, type_index const& b) noexcept { - return !(a < b); -} -} - -template <> -struct std::hash { - using argument_type = ext::type_index; - using result_type = std::size_t; - - result_type operator()(argument_type const& t) const noexcept { - return t.hash_code(); - } -}; diff --git a/lib/app-scened-template/view_controller.hpp b/lib/app-scened-template/view_controller.hpp deleted file mode 100644 index ccd3c0fd39..0000000000 --- a/lib/app-scened-template/view_controller.hpp +++ /dev/null @@ -1,170 +0,0 @@ -#pragma once -#include "view_modules/generic_view_module.h" -#include -#include -#include -#include -#include "typeindex_no_rtti.hpp" - -/** - * @brief Controller for switching application views and handling inputs and events - * - * @tparam TApp application class - * @tparam TViewModules variadic list of ViewModules - */ -template -class ViewController { -public: - ViewController() { - event_queue = furi_message_queue_alloc(10, sizeof(typename TApp::Event)); - - view_dispatcher = view_dispatcher_alloc(); - previous_view_callback_pointer = cbc::obtain_connector( - this, &ViewController::previous_view_callback); - - [](...) { - }((this->add_view(ext::make_type_index().hash_code(), new TViewModules()), - 0)...); - - gui = static_cast(furi_record_open("gui")); - } - - ~ViewController() { - for(auto& it : holder) { - view_dispatcher_remove_view(view_dispatcher, static_cast(it.first)); - delete it.second; - } - - view_dispatcher_free(view_dispatcher); - furi_message_queue_free(event_queue); - } - - /** - * @brief Get ViewModule pointer - * - * @tparam T Concrete ViewModule class - * @return T* ViewModule pointer - */ - template - T* get() { - uint32_t view_index = ext::make_type_index().hash_code(); - furi_check(holder.count(view_index) != 0); - return static_cast(holder[view_index]); - } - - /** - * @brief Get ViewModule pointer by cast - * - * @tparam T Concrete ViewModule class - * @return T* ViewModule pointer - */ - template - operator T*() { - uint32_t view_index = ext::make_type_index().hash_code(); - furi_check(holder.count(view_index) != 0); - return static_cast(holder[view_index]); - } - - /** - * @brief Switch view to ViewModule - * - * @tparam T Concrete ViewModule class - * @return T* ViewModule pointer - */ - template - void switch_to() { - uint32_t view_index = ext::make_type_index().hash_code(); - furi_check(holder.count(view_index) != 0); - view_dispatcher_switch_to_view(view_dispatcher, view_index); - } - - /** - * @brief Receive event from app event queue - * - * @param event event pointer - */ - void receive_event(typename TApp::Event* event) { - if(furi_message_queue_get(event_queue, event, 100) != FuriStatusOk) { - event->type = TApp::EventType::Tick; - } - } - - /** - * @brief Send event to app event queue - * - * @param event event pointer - */ - void send_event(typename TApp::Event* event) { - FuriStatus result = furi_message_queue_put(event_queue, event, FuriWaitForever); - furi_check(result == FuriStatusOk); - } - - void attach_to_gui(ViewDispatcherType type) { - view_dispatcher_attach_to_gui(view_dispatcher, gui, type); - } - -private: - /** - * @brief ViewModulesHolder - * - */ - std::map holder; - - /** - * @brief App event queue - * - */ - FuriMessageQueue* event_queue; - - /** - * @brief Main ViewDispatcher pointer - * - */ - ViewDispatcher* view_dispatcher; - - /** - * @brief Gui record pointer - * - */ - Gui* gui; - - /** - * @brief Previous view callback fn pointer - * - */ - ViewNavigationCallback previous_view_callback_pointer; - - /** - * @brief Previous view callback fn - * - * @param context not used - * @return uint32_t VIEW_IGNORE - */ - uint32_t previous_view_callback(void* context) { - (void)context; - - typename TApp::Event event; - event.type = TApp::EventType::Back; - - if(event_queue != NULL) { - send_event(&event); - } - - return VIEW_IGNORE; - } - - /** - * @brief Add ViewModule to holder - * - * @param view_index view index in holder - * @param view_module view module pointer - */ - void add_view(size_t view_index, GenericViewModule* view_module) { - furi_check(holder.count(view_index) == 0); - holder[view_index] = view_module; - - View* view = view_module->get_view(); - view_dispatcher_add_view(view_dispatcher, static_cast(view_index), view); - view_set_previous_callback(view, previous_view_callback_pointer); - } -}; diff --git a/lib/app-scened-template/view_modules/byte_input_vm.cpp b/lib/app-scened-template/view_modules/byte_input_vm.cpp deleted file mode 100644 index 754de9111e..0000000000 --- a/lib/app-scened-template/view_modules/byte_input_vm.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "byte_input_vm.h" - -ByteInputVM::ByteInputVM() { - byte_input = byte_input_alloc(); -} - -ByteInputVM::~ByteInputVM() { - byte_input_free(byte_input); -} - -View* ByteInputVM::get_view() { - return byte_input_get_view(byte_input); -} - -void ByteInputVM::clean() { - byte_input_set_header_text(byte_input, ""); - byte_input_set_result_callback(byte_input, NULL, NULL, NULL, NULL, 0); -} - -void ByteInputVM::set_result_callback( - ByteInputCallback input_callback, - ByteChangedCallback changed_callback, - void* callback_context, - uint8_t* bytes, - uint8_t bytes_count) { - byte_input_set_result_callback( - byte_input, input_callback, changed_callback, callback_context, bytes, bytes_count); -} - -void ByteInputVM::set_header_text(const char* text) { - byte_input_set_header_text(byte_input, text); -} diff --git a/lib/app-scened-template/view_modules/byte_input_vm.h b/lib/app-scened-template/view_modules/byte_input_vm.h deleted file mode 100644 index 69031fbee6..0000000000 --- a/lib/app-scened-template/view_modules/byte_input_vm.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once -#include "generic_view_module.h" -#include - -class ByteInputVM : public GenericViewModule { -public: - ByteInputVM(void); - ~ByteInputVM() final; - View* get_view() final; - void clean() final; - - /** - * @brief Set byte input result callback - * - * @param input_callback input callback fn - * @param changed_callback changed callback fn - * @param callback_context callback context - * @param bytes buffer to use - * @param bytes_count buffer length - */ - void set_result_callback( - ByteInputCallback input_callback, - ByteChangedCallback changed_callback, - void* callback_context, - uint8_t* bytes, - uint8_t bytes_count); - - /** - * @brief Set byte input header text - * - * @param text text to be shown - */ - void set_header_text(const char* text); - -private: - ByteInput* byte_input; -}; diff --git a/lib/app-scened-template/view_modules/dialog_ex_vm.cpp b/lib/app-scened-template/view_modules/dialog_ex_vm.cpp deleted file mode 100644 index 34f4d0336c..0000000000 --- a/lib/app-scened-template/view_modules/dialog_ex_vm.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "dialog_ex_vm.h" - -DialogExVM::DialogExVM() { - dialog_ex = dialog_ex_alloc(); -} - -DialogExVM::~DialogExVM() { - dialog_ex_free(dialog_ex); -} - -View* DialogExVM::get_view() { - return dialog_ex_get_view(dialog_ex); -} - -void DialogExVM::clean() { - set_result_callback(NULL); - set_context(NULL); - set_header(NULL, 0, 0, AlignLeft, AlignBottom); - set_text(NULL, 0, 0, AlignLeft, AlignBottom); - set_icon(0, 0, NULL); - set_left_button_text(NULL); - set_center_button_text(NULL); - set_right_button_text(NULL); -} - -void DialogExVM::set_result_callback(DialogExResultCallback callback) { - dialog_ex_set_result_callback(dialog_ex, callback); -} - -void DialogExVM::set_context(void* context) { - dialog_ex_set_context(dialog_ex, context); -} - -void DialogExVM::set_header( - const char* text, - uint8_t x, - uint8_t y, - Align horizontal, - Align vertical) { - dialog_ex_set_header(dialog_ex, text, x, y, horizontal, vertical); -} - -void DialogExVM::set_text(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical) { - dialog_ex_set_text(dialog_ex, text, x, y, horizontal, vertical); -} - -void DialogExVM::set_icon(uint8_t x, uint8_t y, const Icon* icon) { - dialog_ex_set_icon(dialog_ex, x, y, icon); -} - -void DialogExVM::set_left_button_text(const char* text) { - dialog_ex_set_left_button_text(dialog_ex, text); -} - -void DialogExVM::set_center_button_text(const char* text) { - dialog_ex_set_center_button_text(dialog_ex, text); -} - -void DialogExVM::set_right_button_text(const char* text) { - dialog_ex_set_right_button_text(dialog_ex, text); -} diff --git a/lib/app-scened-template/view_modules/dialog_ex_vm.h b/lib/app-scened-template/view_modules/dialog_ex_vm.h deleted file mode 100644 index cb63ccdbc2..0000000000 --- a/lib/app-scened-template/view_modules/dialog_ex_vm.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once -#include "generic_view_module.h" -#include - -class DialogExVM : public GenericViewModule { -public: - DialogExVM(void); - ~DialogExVM() final; - View* get_view() final; - void clean() final; - - /** - * Set dialog result callback - * @param callback - result callback function - */ - void set_result_callback(DialogExResultCallback callback); - - /** - * Set dialog context - * @param context - context pointer, will be passed to result callback - */ - void set_context(void* context); - - /** - * Set dialog header text - * If text is null, dialog header will not be rendered - * @param text - text to be shown, can be multiline - * @param x, y - text position - * @param horizontal, vertical - text aligment - */ - void set_header(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical); - - /** - * Set dialog text - * If text is null, dialog text will not be rendered - * @param text - text to be shown, can be multiline - * @param x, y - text position - * @param horizontal, vertical - text aligment - */ - void set_text(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical); - - /** - * Set dialog icon - * If x or y is negative, dialog icon will not be rendered - * @param x, y - icon position - * @param name - icon to be shown - */ - void set_icon(uint8_t x, uint8_t y, const Icon* icon); - - /** - * Set left button text - * If text is null, left button will not be rendered and processed - * @param text - text to be shown - */ - void set_left_button_text(const char* text); - - /** - * Set center button text - * If text is null, center button will not be rendered and processed - * @param text - text to be shown - */ - void set_center_button_text(const char* text); - - /** - * Set right button text - * If text is null, right button will not be rendered and processed - * @param text - text to be shown - */ - void set_right_button_text(const char* text); - -private: - DialogEx* dialog_ex; -}; diff --git a/lib/app-scened-template/view_modules/generic_view_module.h b/lib/app-scened-template/view_modules/generic_view_module.h deleted file mode 100644 index f6c56a9110..0000000000 --- a/lib/app-scened-template/view_modules/generic_view_module.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -#include - -class GenericViewModule { -public: - GenericViewModule() {}; - virtual ~GenericViewModule() {}; - virtual View* get_view() = 0; - virtual void clean() = 0; -}; diff --git a/lib/app-scened-template/view_modules/popup_vm.cpp b/lib/app-scened-template/view_modules/popup_vm.cpp deleted file mode 100644 index 330aa44ca9..0000000000 --- a/lib/app-scened-template/view_modules/popup_vm.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "popup_vm.h" -#include - -PopupVM::PopupVM() { - popup = popup_alloc(); -} - -PopupVM::~PopupVM() { - popup_free(popup); -} - -View* PopupVM::get_view() { - return popup_get_view(popup); -} - -void PopupVM::clean() { - set_callback(NULL); - set_context(NULL); - set_header(NULL, 0, 0, AlignLeft, AlignBottom); - set_text(NULL, 0, 0, AlignLeft, AlignBottom); - set_icon(0, 0, NULL); - disable_timeout(); - set_timeout(1000); -} - -void PopupVM::set_callback(PopupCallback callback) { - popup_set_callback(popup, callback); -} - -void PopupVM::set_context(void* context) { - popup_set_context(popup, context); -} - -void PopupVM::set_header(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical) { - popup_set_header(popup, text, x, y, horizontal, vertical); -} - -void PopupVM::set_text(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical) { - popup_set_text(popup, text, x, y, horizontal, vertical); -} - -void PopupVM::set_icon(int8_t x, int8_t y, const Icon* icon) { - popup_set_icon(popup, x, y, icon); -} - -void PopupVM::set_timeout(uint32_t timeout_in_ms) { - popup_set_timeout(popup, timeout_in_ms); -} - -void PopupVM::enable_timeout() { - popup_enable_timeout(popup); -} - -void PopupVM::disable_timeout() { - popup_disable_timeout(popup); -} diff --git a/lib/app-scened-template/view_modules/popup_vm.h b/lib/app-scened-template/view_modules/popup_vm.h deleted file mode 100644 index 234f337746..0000000000 --- a/lib/app-scened-template/view_modules/popup_vm.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once -#include "generic_view_module.h" -#include - -class PopupVM : public GenericViewModule { -public: - PopupVM(void); - ~PopupVM() final; - View* get_view() final; - void clean() final; - - /** - * Set popup header text - * @param text - text to be shown - */ - void set_callback(PopupCallback callback); - - /** - * Set popup context - * @param context - context pointer, will be passed to result callback - */ - void set_context(void* context); - - /** - * Set popup header text - * If text is null, popup header will not be rendered - * @param text - text to be shown, can be multiline - * @param x, y - text position - * @param horizontal, vertical - text aligment - */ - void set_header(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical); - - /** - * Set popup text - * If text is null, popup text will not be rendered - * @param text - text to be shown, can be multiline - * @param x, y - text position - * @param horizontal, vertical - text aligment - */ - void set_text(const char* text, uint8_t x, uint8_t y, Align horizontal, Align vertical); - - /** - * Set popup icon - * If icon position is negative, popup icon will not be rendered - * @param x, y - icon position - * @param name - icon to be shown - */ - void set_icon(int8_t x, int8_t y, const Icon* icon); - - /** - * Set popup timeout - * @param timeout_in_ms - popup timeout value in milliseconds - */ - void set_timeout(uint32_t timeout_in_ms); - - /** - * Enable popup timeout - */ - void enable_timeout(void); - - /** - * Disable popup timeout - */ - void disable_timeout(void); - -private: - Popup* popup; -}; diff --git a/lib/app-scened-template/view_modules/submenu_vm.cpp b/lib/app-scened-template/view_modules/submenu_vm.cpp deleted file mode 100644 index 939bb6b1ce..0000000000 --- a/lib/app-scened-template/view_modules/submenu_vm.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "submenu_vm.h" - -SubmenuVM::SubmenuVM() { - submenu = submenu_alloc(); -} - -SubmenuVM::~SubmenuVM() { - submenu_free(submenu); -} - -View* SubmenuVM::get_view() { - return submenu_get_view(submenu); -} - -void SubmenuVM::clean() { - submenu_reset(submenu); -} - -void SubmenuVM::add_item( - const char* label, - uint32_t index, - SubmenuItemCallback callback, - void* callback_context) { - submenu_add_item(submenu, label, index, callback, callback_context); -} - -void SubmenuVM::set_selected_item(uint32_t index) { - submenu_set_selected_item(submenu, index); -} - -void SubmenuVM::set_header(const char* header) { - submenu_set_header(submenu, header); -} diff --git a/lib/app-scened-template/view_modules/submenu_vm.h b/lib/app-scened-template/view_modules/submenu_vm.h deleted file mode 100644 index 223fbd531e..0000000000 --- a/lib/app-scened-template/view_modules/submenu_vm.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once -#include "generic_view_module.h" -#include - -class SubmenuVM : public GenericViewModule { -public: - SubmenuVM(void); - ~SubmenuVM() final; - View* get_view() final; - void clean() final; - - /** - * @brief Add item to submenu - * - * @param label - menu item label - * @param index - menu item index, used for callback, may be the same with other items - * @param callback - menu item callback - * @param callback_context - menu item callback context - */ - void add_item( - const char* label, - uint32_t index, - SubmenuItemCallback callback, - void* callback_context); - - /** - * @brief Set submenu item selector - * - * @param index index of the item to be selected - */ - void set_selected_item(uint32_t index); - - /** - * @brief Set optional header for submenu - * - * @param header header to set - */ - void set_header(const char* header); - -private: - Submenu* submenu; -}; diff --git a/lib/app-scened-template/view_modules/text_input_vm.cpp b/lib/app-scened-template/view_modules/text_input_vm.cpp deleted file mode 100644 index 05e5ed1d69..0000000000 --- a/lib/app-scened-template/view_modules/text_input_vm.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "text_input_vm.h" - -TextInputVM::TextInputVM() { - text_input = text_input_alloc(); -} - -TextInputVM::~TextInputVM() { - text_input_free(text_input); -} - -View* TextInputVM::get_view() { - return text_input_get_view(text_input); -} - -void TextInputVM::clean() { - text_input_reset(text_input); -} - -void TextInputVM::set_result_callback( - TextInputCallback callback, - void* callback_context, - char* text, - uint8_t max_text_length, - bool clear_default_text) { - text_input_set_result_callback( - text_input, callback, callback_context, text, max_text_length, clear_default_text); -} - -void TextInputVM::set_header_text(const char* text) { - text_input_set_header_text(text_input, text); -} - -void TextInputVM::set_validator(TextInputValidatorCallback callback, void* callback_context) { - text_input_set_validator(text_input, callback, callback_context); -} - -void* TextInputVM::get_validator_callback_context() { - return text_input_get_validator_callback_context(text_input); -} diff --git a/lib/app-scened-template/view_modules/text_input_vm.h b/lib/app-scened-template/view_modules/text_input_vm.h deleted file mode 100644 index 5c71c4318f..0000000000 --- a/lib/app-scened-template/view_modules/text_input_vm.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#include "generic_view_module.h" -#include - -class TextInputVM : public GenericViewModule { -public: - TextInputVM(void); - ~TextInputVM() final; - View* get_view() final; - void clean() final; - - /** - * @brief Set text input result callback - * - * @param callback - callback fn - * @param callback_context - callback context - * @param text - text buffer to use - * @param max_text_length - text buffer length - * @param clear_default_text - clears given buffer on OK event - */ - void set_result_callback( - TextInputCallback callback, - void* callback_context, - char* text, - uint8_t max_text_length, - bool clear_default_text); - - /** - * @brief Set text input header text - * - * @param text - text to be shown - */ - void set_header_text(const char* text); - - void set_validator(TextInputValidatorCallback callback, void* callback_context); - - void* get_validator_callback_context(void); - -private: - TextInput* text_input; -}; diff --git a/lib/appframe.scons b/lib/appframe.scons deleted file mode 100644 index fb268579d6..0000000000 --- a/lib/appframe.scons +++ /dev/null @@ -1,29 +0,0 @@ -Import("env") - -env.Append( - CPPPATH=[ - "#/lib/app-scened-template", - "#/lib/callback-connector", - ], - LINT_SOURCES=[ - Dir("app-scened-template"), - ], -) - - -libenv = env.Clone(FW_LIB_NAME="appframe") -libenv.ApplyLibFlags() - -sources = [] - -recurse_dirs = [ - "app-scened-template", - "callback-connector", -] - -for recurse_dir in recurse_dirs: - sources += libenv.GlobRecursive("*.c*", recurse_dir) - -lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources) -libenv.Install("${LIB_DIST_DIR}", lib) -Return("lib") diff --git a/lib/toolbox/api_lock.h b/lib/toolbox/api_lock.h index 5902a4922a..a370514dad 100644 --- a/lib/toolbox/api_lock.h +++ b/lib/toolbox/api_lock.h @@ -41,3 +41,7 @@ typedef FuriEventFlag* FuriApiLock; #define api_lock_wait_unlock_and_free(_lock) \ api_lock_wait_unlock(_lock); \ api_lock_free(_lock); + +#define api_lock_is_locked(_lock) (!(furi_event_flag_get(_lock) & API_LOCK_EVENT)) + +#define api_lock_relock(_lock) furi_event_flag_clear(_lock, API_LOCK_EVENT) diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index 9e58a67464..baf1f8a802 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,71.0,, +Version,+,72.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/cli/cli.h,, @@ -1108,11 +1108,13 @@ Function,+,furi_event_flag_set,uint32_t,"FuriEventFlag*, uint32_t" Function,+,furi_event_flag_wait,uint32_t,"FuriEventFlag*, uint32_t, uint32_t, uint32_t" Function,+,furi_event_loop_alloc,FuriEventLoop*, Function,+,furi_event_loop_free,void,FuriEventLoop* -Function,+,furi_event_loop_message_queue_subscribe,void,"FuriEventLoop*, FuriMessageQueue*, FuriEventLoopEvent, FuriEventLoopMessageQueueCallback, void*" -Function,+,furi_event_loop_message_queue_unsubscribe,void,"FuriEventLoop*, FuriMessageQueue*" Function,+,furi_event_loop_pend_callback,void,"FuriEventLoop*, FuriEventLoopPendingCallback, void*" Function,+,furi_event_loop_run,void,FuriEventLoop* Function,+,furi_event_loop_stop,void,FuriEventLoop* +Function,+,furi_event_loop_subscribe_message_queue,void,"FuriEventLoop*, FuriMessageQueue*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" +Function,+,furi_event_loop_subscribe_mutex,void,"FuriEventLoop*, FuriMutex*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" +Function,+,furi_event_loop_subscribe_semaphore,void,"FuriEventLoop*, FuriSemaphore*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" +Function,+,furi_event_loop_subscribe_stream_buffer,void,"FuriEventLoop*, FuriStreamBuffer*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" Function,+,furi_event_loop_tick_set,void,"FuriEventLoop*, uint32_t, FuriEventLoopTickCallback, void*" Function,+,furi_event_loop_timer_alloc,FuriEventLoopTimer*,"FuriEventLoop*, FuriEventLoopTimerCallback, FuriEventLoopTimerType, void*" Function,+,furi_event_loop_timer_free,void,FuriEventLoopTimer* @@ -1122,6 +1124,7 @@ Function,+,furi_event_loop_timer_is_running,_Bool,const FuriEventLoopTimer* Function,+,furi_event_loop_timer_restart,void,FuriEventLoopTimer* Function,+,furi_event_loop_timer_start,void,"FuriEventLoopTimer*, uint32_t" Function,+,furi_event_loop_timer_stop,void,FuriEventLoopTimer* +Function,+,furi_event_loop_unsubscribe,void,"FuriEventLoop*, FuriEventLoopObject*" Function,+,furi_get_tick,uint32_t, Function,+,furi_hal_adc_acquire,FuriHalAdcHandle*, Function,+,furi_hal_adc_configure,void,FuriHalAdcHandle* @@ -1544,6 +1547,7 @@ Function,+,furi_semaphore_acquire,FuriStatus,"FuriSemaphore*, uint32_t" Function,+,furi_semaphore_alloc,FuriSemaphore*,"uint32_t, uint32_t" Function,+,furi_semaphore_free,void,FuriSemaphore* Function,+,furi_semaphore_get_count,uint32_t,FuriSemaphore* +Function,+,furi_semaphore_get_space,uint32_t,FuriSemaphore* Function,+,furi_semaphore_release,FuriStatus,FuriSemaphore* Function,+,furi_stream_buffer_alloc,FuriStreamBuffer*,"size_t, size_t" Function,+,furi_stream_buffer_bytes_available,size_t,FuriStreamBuffer* @@ -2282,7 +2286,7 @@ Function,+,power_get_info,void,"Power*, PowerInfo*" Function,+,power_get_pubsub,FuriPubSub*,Power* Function,+,power_is_battery_healthy,_Bool,Power* Function,+,power_off,void,Power* -Function,+,power_reboot,void,PowerBootMode +Function,+,power_reboot,void,"Power*, PowerBootMode" Function,+,powf,float,"float, float" Function,-,powl,long double,"long double, long double" Function,+,pretty_format_bytes_hex_canonical,void,"FuriString*, size_t, const char*, const uint8_t*, size_t" @@ -2757,11 +2761,11 @@ Function,+,view_holder_alloc,ViewHolder*, Function,+,view_holder_attach_to_gui,void,"ViewHolder*, Gui*" Function,+,view_holder_free,void,ViewHolder* Function,+,view_holder_get_free_context,void*,ViewHolder* +Function,+,view_holder_send_to_back,void,ViewHolder* +Function,+,view_holder_send_to_front,void,ViewHolder* Function,+,view_holder_set_back_callback,void,"ViewHolder*, BackCallback, void*" Function,+,view_holder_set_free_callback,void,"ViewHolder*, FreeCallback, void*" Function,+,view_holder_set_view,void,"ViewHolder*, View*" -Function,+,view_holder_start,void,ViewHolder* -Function,+,view_holder_stop,void,ViewHolder* Function,+,view_holder_update,void,"View*, void*" Function,+,view_port_alloc,ViewPort*, Function,+,view_port_draw_callback_set,void,"ViewPort*, ViewPortDrawCallback, void*" diff --git a/targets/f18/target.json b/targets/f18/target.json index 9c450aa83e..3452c6707a 100644 --- a/targets/f18/target.json +++ b/targets/f18/target.json @@ -22,7 +22,6 @@ "signal_reader", "microtar", "usb_stm32", - "appframe", "assets", "one_wire", "music_worker", diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 51d623e78f..dd0fb9f06a 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,71.0,, +Version,+,72.0,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, @@ -1243,11 +1243,13 @@ Function,+,furi_event_flag_set,uint32_t,"FuriEventFlag*, uint32_t" Function,+,furi_event_flag_wait,uint32_t,"FuriEventFlag*, uint32_t, uint32_t, uint32_t" Function,+,furi_event_loop_alloc,FuriEventLoop*, Function,+,furi_event_loop_free,void,FuriEventLoop* -Function,+,furi_event_loop_message_queue_subscribe,void,"FuriEventLoop*, FuriMessageQueue*, FuriEventLoopEvent, FuriEventLoopMessageQueueCallback, void*" -Function,+,furi_event_loop_message_queue_unsubscribe,void,"FuriEventLoop*, FuriMessageQueue*" Function,+,furi_event_loop_pend_callback,void,"FuriEventLoop*, FuriEventLoopPendingCallback, void*" Function,+,furi_event_loop_run,void,FuriEventLoop* Function,+,furi_event_loop_stop,void,FuriEventLoop* +Function,+,furi_event_loop_subscribe_message_queue,void,"FuriEventLoop*, FuriMessageQueue*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" +Function,+,furi_event_loop_subscribe_mutex,void,"FuriEventLoop*, FuriMutex*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" +Function,+,furi_event_loop_subscribe_semaphore,void,"FuriEventLoop*, FuriSemaphore*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" +Function,+,furi_event_loop_subscribe_stream_buffer,void,"FuriEventLoop*, FuriStreamBuffer*, FuriEventLoopEvent, FuriEventLoopEventCallback, void*" Function,+,furi_event_loop_tick_set,void,"FuriEventLoop*, uint32_t, FuriEventLoopTickCallback, void*" Function,+,furi_event_loop_timer_alloc,FuriEventLoopTimer*,"FuriEventLoop*, FuriEventLoopTimerCallback, FuriEventLoopTimerType, void*" Function,+,furi_event_loop_timer_free,void,FuriEventLoopTimer* @@ -1257,6 +1259,7 @@ Function,+,furi_event_loop_timer_is_running,_Bool,const FuriEventLoopTimer* Function,+,furi_event_loop_timer_restart,void,FuriEventLoopTimer* Function,+,furi_event_loop_timer_start,void,"FuriEventLoopTimer*, uint32_t" Function,+,furi_event_loop_timer_stop,void,FuriEventLoopTimer* +Function,+,furi_event_loop_unsubscribe,void,"FuriEventLoop*, FuriEventLoopObject*" Function,+,furi_get_tick,uint32_t, Function,+,furi_hal_adc_acquire,FuriHalAdcHandle*, Function,+,furi_hal_adc_configure,void,FuriHalAdcHandle* @@ -1797,6 +1800,7 @@ Function,+,furi_semaphore_acquire,FuriStatus,"FuriSemaphore*, uint32_t" Function,+,furi_semaphore_alloc,FuriSemaphore*,"uint32_t, uint32_t" Function,+,furi_semaphore_free,void,FuriSemaphore* Function,+,furi_semaphore_get_count,uint32_t,FuriSemaphore* +Function,+,furi_semaphore_get_space,uint32_t,FuriSemaphore* Function,+,furi_semaphore_release,FuriStatus,FuriSemaphore* Function,+,furi_stream_buffer_alloc,FuriStreamBuffer*,"size_t, size_t" Function,+,furi_stream_buffer_bytes_available,size_t,FuriStreamBuffer* @@ -2954,7 +2958,7 @@ Function,+,power_get_info,void,"Power*, PowerInfo*" Function,+,power_get_pubsub,FuriPubSub*,Power* Function,+,power_is_battery_healthy,_Bool,Power* Function,+,power_off,void,Power* -Function,+,power_reboot,void,PowerBootMode +Function,+,power_reboot,void,"Power*, PowerBootMode" Function,-,power_trigger_ui_update,void,Power* Function,+,powf,float,"float, float" Function,-,powl,long double,"long double, long double" @@ -3671,11 +3675,11 @@ Function,+,view_holder_alloc,ViewHolder*, Function,+,view_holder_attach_to_gui,void,"ViewHolder*, Gui*" Function,+,view_holder_free,void,ViewHolder* Function,+,view_holder_get_free_context,void*,ViewHolder* +Function,+,view_holder_send_to_back,void,ViewHolder* +Function,+,view_holder_send_to_front,void,ViewHolder* Function,+,view_holder_set_back_callback,void,"ViewHolder*, BackCallback, void*" Function,+,view_holder_set_free_callback,void,"ViewHolder*, FreeCallback, void*" Function,+,view_holder_set_view,void,"ViewHolder*, View*" -Function,+,view_holder_start,void,ViewHolder* -Function,+,view_holder_stop,void,ViewHolder* Function,+,view_holder_update,void,"View*, void*" Function,+,view_port_alloc,ViewPort*, Function,+,view_port_draw_callback_set,void,"ViewPort*, ViewPortDrawCallback, void*" diff --git a/targets/f7/target.json b/targets/f7/target.json index 35f1766c19..f5b3cf3b6b 100644 --- a/targets/f7/target.json +++ b/targets/f7/target.json @@ -34,7 +34,6 @@ "microtar", "usb_stm32", "infrared", - "appframe", "assets", "one_wire", "ibutton", From 6c0dadad3f56f8a9f6c67d5674e1f0461b0d5791 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 10 Aug 2024 14:42:11 +0300 Subject: [PATCH 43/52] after merge fixes --- applications/services/power/power_service/power.c | 6 ++++++ .../settings/desktop_settings/desktop_settings_app.c | 3 ++- applications/system/js_app/modules/js_keyboard.c | 6 ++---- applications/system/js_app/modules/js_widget.c | 8 ++++---- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index e6f8ccf787..2773e9fe80 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -445,6 +445,12 @@ static Power* power_alloc(void) { // State initialization power->power_off_timeout = POWER_OFF_TIMEOUT_S; power->show_battery_low_warning = true; + + // Load UI settings + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + desktop_settings_load(settings); + power->displayBatteryPercentage = settings->displayBatteryPercentage; + free(settings); // Gui Gui* gui = furi_record_open(RECORD_GUI); diff --git a/applications/settings/desktop_settings/desktop_settings_app.c b/applications/settings/desktop_settings/desktop_settings_app.c index b6ecfa0791..bddbbd0f6a 100644 --- a/applications/settings/desktop_settings/desktop_settings_app.c +++ b/applications/settings/desktop_settings/desktop_settings_app.c @@ -127,7 +127,8 @@ void desktop_settings_app_free(DesktopSettingsApp* app) { free(app); if(temp_save_name) { - power_reboot(PowerBootModeNormal); + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeNormal); } } diff --git a/applications/system/js_app/modules/js_keyboard.c b/applications/system/js_app/modules/js_keyboard.c index 65373db785..53f48d01de 100644 --- a/applications/system/js_app/modules/js_keyboard.c +++ b/applications/system/js_app/modules/js_keyboard.c @@ -92,10 +92,9 @@ static void js_keyboard_text(struct mjs* mjs) { view_holder_set_back_callback(keyboard->view_holder, keyboard_exit, keyboard); view_holder_set_view(keyboard->view_holder, text_input_get_view(keyboard->text_input)); - view_holder_start(keyboard->view_holder); api_lock_wait_unlock(keyboard->lock); - view_holder_stop(keyboard->view_holder); + view_holder_set_view(keyboard->view_holder, NULL); view_holder_free(keyboard->view_holder); furi_record_close(RECORD_GUI); @@ -148,10 +147,9 @@ static void js_keyboard_byte(struct mjs* mjs) { view_holder_set_back_callback(keyboard->view_holder, keyboard_exit, keyboard); view_holder_set_view(keyboard->view_holder, byte_input_get_view(keyboard->byte_input)); - view_holder_start(keyboard->view_holder); api_lock_wait_unlock(keyboard->lock); - view_holder_stop(keyboard->view_holder); + view_holder_set_view(keyboard->view_holder, NULL); view_holder_free(keyboard->view_holder); furi_record_close(RECORD_GUI); diff --git a/applications/system/js_app/modules/js_widget.c b/applications/system/js_app/modules/js_widget.c index 0d6aeb1dba..6c8e79b2ec 100644 --- a/applications/system/js_app/modules/js_widget.c +++ b/applications/system/js_app/modules/js_widget.c @@ -759,7 +759,7 @@ static void js_widget_is_open(struct mjs* mjs) { static void widget_callback(void* context, uint32_t arg) { UNUSED(arg); JsWidgetInst* widget = context; - view_holder_stop(widget->view_holder); + view_holder_set_view(widget->view_holder, NULL); widget->is_shown = false; } @@ -779,7 +779,7 @@ static void js_widget_show(struct mjs* mjs) { return; } - view_holder_start(widget->view_holder); + view_holder_set_view(widget->view_holder, widget->view); widget->is_shown = true; mjs_return(mjs, MJS_UNDEFINED); @@ -789,7 +789,7 @@ static void js_widget_close(struct mjs* mjs) { JsWidgetInst* widget = get_this_ctx(mjs); if(!check_arg_count(mjs, 0)) return; - view_holder_stop(widget->view_holder); + view_holder_set_view(widget->view_holder, NULL); widget->is_shown = false; mjs_return(mjs, MJS_UNDEFINED); @@ -874,7 +874,7 @@ static void* js_widget_create(struct mjs* mjs, mjs_val_t* object) { static void js_widget_destroy(void* inst) { JsWidgetInst* widget = inst; - view_holder_stop(widget->view_holder); + view_holder_set_view(widget->view_holder, NULL); view_holder_free(widget->view_holder); widget->view_holder = NULL; From 7b5694553887ecb6c3ae7aa400e6cf976c126558 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 10 Aug 2024 14:50:48 +0300 Subject: [PATCH 44/52] oops --- targets/f7/furi_hal/furi_hal_region.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/targets/f7/furi_hal/furi_hal_region.c b/targets/f7/furi_hal/furi_hal_region.c index 6e138b41bd..c8af57a199 100644 --- a/targets/f7/furi_hal/furi_hal_region.c +++ b/targets/f7/furi_hal/furi_hal_region.c @@ -29,9 +29,10 @@ const FuriHalRegionBand* furi_hal_region_get_band(uint32_t frequency) { return NULL; } - for(size_t i = 0; i < region->bands_count; i++) { - if(region->bands[i].start <= frequency && region->bands[i].end >= frequency) { - return ®ion->bands[i]; + for(size_t i = 0; i < furi_hal_region->bands_count; i++) { + if(furi_hal_region->bands[i].start <= frequency && + furi_hal_region->bands[i].end >= frequency) { + return &furi_hal_region->bands[i]; } } From 19c13baa480cf00299aef2edb50b915c6d9a5d9b Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 10 Aug 2024 14:59:48 +0300 Subject: [PATCH 45/52] fix rgb patch [ci skip] --- .ci_files/rgb.patch | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.ci_files/rgb.patch b/.ci_files/rgb.patch index 7108901093..51a305aec3 100644 --- a/.ci_files/rgb.patch +++ b/.ci_files/rgb.patch @@ -1,5 +1,5 @@ diff --git a/applications/services/notification/notification_app.c b/applications/services/notification/notification_app.c -index d4c5b91..8b43599 100644 +index 35d2fe6..1af97e2 100644 --- a/applications/services/notification/notification_app.c +++ b/applications/services/notification/notification_app.c @@ -9,6 +9,7 @@ @@ -10,16 +10,16 @@ index d4c5b91..8b43599 100644 #define TAG "NotificationSrv" -@@ -588,6 +589,7 @@ int32_t notification_srv(void* p) { +@@ -616,6 +617,7 @@ int32_t notification_srv(void* p) { break; case SaveSettingsMessage: notification_save_settings(app); + rgb_backlight_save_settings(); break; - } - + case LoadSettingsMessage: + notification_load_settings(app); diff --git a/applications/settings/notification_settings/notification_settings_app.c b/applications/settings/notification_settings/notification_settings_app.c -index 7576dcf..ae022e2 100644 +index 2462b32..8e045ce 100644 --- a/applications/settings/notification_settings/notification_settings_app.c +++ b/applications/settings/notification_settings/notification_settings_app.c @@ -3,6 +3,7 @@ From c2118030764b33efd0ffc952a6ef6c1806393cb4 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 10 Aug 2024 15:33:50 +0300 Subject: [PATCH 46/52] upd subremote [ci skip] --- applications/main/subghz_remote | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/subghz_remote b/applications/main/subghz_remote index 45395bc2b0..b631376798 160000 --- a/applications/main/subghz_remote +++ b/applications/main/subghz_remote @@ -1 +1 @@ -Subproject commit 45395bc2b0d8a7d7bafa16702d65696b9d5dc653 +Subproject commit b63137679870602ac5ba02cba4eb0f4b0efce6fa From 98af4f4a71febec099d763bde62450c9e4cc82b3 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 10 Aug 2024 20:55:44 +0300 Subject: [PATCH 47/52] upd changelog --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ddb64ba574..95b749b7ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,33 @@ ## Main changes - SubGHz: + - OFW: Added protocol for Dickert MAHS garage door remote control - Fix rare crash when opening Read mode via Frequency analyzer - Refactor frequency analyzer code for better readability (by @derskythe | PR #782) +- 125kHz RFID: + - OFW: Add lfrfid GProxII support +- NFC: + - OFW: Fix plantain balance string + - OFW: Now fifo size in ST25 chip is calculated properly * Docs: Remove not printable symbols and update docs (by @derskythe | PR #783) +* OFW: Fix cumulative error in infrared signals +* OFW: iButton ID writing (Enable ID writing for ds1971 and ds1996) * Apps: **Check out more Apps updates and fixes by following** [this link](https://github.com/xMasterX/all-the-plugins/commits/dev) ## Other changes * Misc: Fix typo in comment in QueueTools.py (by @eltociear | PR #785) +* OFW: Make file extensions case-insensitive +* OFW: Remove internal storage folder if corresponding flag set +* OFW: **Added a text input that only accepts full numbers (int)** +* OFW: FuriEventLoop Pt.2 +* OFW: Images linting: ensure that all images conform specification +* OFW: **Storage: remove LFS** +* OFW: NFC: Change the plantain last number display from "?" to "X" +* OFW: CCID App: Refactor +* OFW: Refactor detected protocols list +* OFW: fix: Ensure proper closure of variadic function in `mjs_array` +* OFW: **Added** `-Wundef` **to compiler options** +* OFW: toolchain: v39 +* OFW: Furi: update string documentation +* OFW: Fix typo in "charge me" screen. * OFW: Reordered VS-Code Tasks to follow the `Release` > `Debug` schema * OFW: Remove unused entries from .editorconfig

    From 702db8925f86ecc9acc76f14c9a18140e599861c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Mon, 12 Aug 2024 09:51:43 +0900 Subject: [PATCH 48/52] Desktop: seaprate callbacks for dolphin and storage subscriptions (#3836) * Desktop: seaprate callbacks for dolphin and storage subscriptions * dolphin: renamed local variable to prevent unintended overrides Co-authored-by: hedger --- .../desktop/animations/animation_manager.c | 22 ++++++++++++++++--- applications/services/dolphin/dolphin.c | 4 ++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/applications/services/desktop/animations/animation_manager.c b/applications/services/desktop/animations/animation_manager.c index dd2ae76a1c..858efb9fe7 100644 --- a/applications/services/desktop/animations/animation_manager.c +++ b/applications/services/desktop/animations/animation_manager.c @@ -104,7 +104,7 @@ void animation_manager_set_dummy_mode_state(AnimationManager* animation_manager, } } -static void animation_manager_check_blocking_callback(const void* message, void* context) { +static void animation_manager_storage_callback(const void* message, void* context) { const StorageEvent* storage_event = message; switch(storage_event->type) { @@ -123,6 +123,22 @@ static void animation_manager_check_blocking_callback(const void* message, void* } } +static void animation_manager_dolphin_callback(const void* message, void* context) { + const DolphinPubsubEvent* dolphin_event = message; + + switch(*dolphin_event) { + case DolphinPubsubEventUpdate: + furi_assert(context); + AnimationManager* animation_manager = context; + if(animation_manager->check_blocking_callback) { + animation_manager->check_blocking_callback(animation_manager->context); + } + break; + default: + break; + } +} + static void animation_manager_timer_callback(void* context) { furi_assert(context); AnimationManager* animation_manager = context; @@ -300,12 +316,12 @@ AnimationManager* animation_manager_alloc(void) { Storage* storage = furi_record_open(RECORD_STORAGE); animation_manager->pubsub_subscription_storage = furi_pubsub_subscribe( - storage_get_pubsub(storage), animation_manager_check_blocking_callback, animation_manager); + storage_get_pubsub(storage), animation_manager_storage_callback, animation_manager); furi_record_close(RECORD_STORAGE); Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); animation_manager->pubsub_subscription_dolphin = furi_pubsub_subscribe( - dolphin_get_pubsub(dolphin), animation_manager_check_blocking_callback, animation_manager); + dolphin_get_pubsub(dolphin), animation_manager_dolphin_callback, animation_manager); furi_record_close(RECORD_DOLPHIN); animation_manager->blocking_shown_sd_ok = true; diff --git a/applications/services/dolphin/dolphin.c b/applications/services/dolphin/dolphin.c index dd2ecd2ba1..501e37c3c8 100644 --- a/applications/services/dolphin/dolphin.c +++ b/applications/services/dolphin/dolphin.c @@ -204,8 +204,8 @@ static bool dolphin_process_event(FuriEventLoopObject* object, void* context) { if(event.type == DolphinEventTypeDeed) { dolphin_state_on_deed(dolphin->state, event.deed); - DolphinPubsubEvent event = DolphinPubsubEventUpdate; - furi_pubsub_publish(dolphin->pubsub, &event); + DolphinPubsubEvent pubsub_event = DolphinPubsubEventUpdate; + furi_pubsub_publish(dolphin->pubsub, &pubsub_event); furi_event_loop_timer_start(dolphin->butthurt_timer, BUTTHURT_INCREASE_PERIOD_TICKS); furi_event_loop_timer_start(dolphin->flush_timer, FLUSH_TIMEOUT_TICKS); From 99655c15e454ffdbd4bada76bd45fa41fd28f7c1 Mon Sep 17 00:00:00 2001 From: hedger Date: Mon, 12 Aug 2024 04:09:41 +0300 Subject: [PATCH 49/52] scripts: improved size validator for updater image (#3834) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * scripts: update.py: reduced reservation size for flash memory; improved error messages; added checks for updater images * scripts: update: fixed imports Co-authored-by: あく --- scripts/imglint.py | 2 +- scripts/update.py | 44 ++++++++++++++++++++++++++++++-------------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/scripts/imglint.py b/scripts/imglint.py index fc63f33555..f25fea4f5e 100644 --- a/scripts/imglint.py +++ b/scripts/imglint.py @@ -4,7 +4,7 @@ from pathlib import Path from flipper.app import App -from PIL import Image, ImageOps +from PIL import Image _logger = logging.getLogger(__name__) diff --git a/scripts/update.py b/scripts/update.py index e880bced84..47a5eeb27b 100755 --- a/scripts/update.py +++ b/scripts/update.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 -import io import math import os import shutil @@ -8,7 +7,6 @@ import zlib from os.path import exists, join -import heatshrink2 from flipper.app import App from flipper.assets.coprobin import CoproBinary, get_stack_type from flipper.assets.heatshrink_stream import HeatshrinkDataStreamHeader @@ -35,7 +33,12 @@ class Main(App): ) FLASH_BASE = 0x8000000 - MIN_LFS_PAGES = 6 + FLASH_PAGE_SIZE = 4 * 1024 + MIN_GAP_PAGES = 2 + + # Update stage file larger than that is not loadable without fix + # https://github.com/flipperdevices/flipperzero-firmware/pull/3676 + UPDATER_SIZE_THRESHOLD = 128 * 1024 HEATSHRINK_WINDOW_SIZE = 13 HEATSHRINK_LOOKAHEAD_SIZE = 6 @@ -117,7 +120,7 @@ def generate(self): self.logger.error( f"You are trying to bundle a non-standard stack type '{self.args.radiotype}'." ) - self.disclaimer() + self.show_disclaimer() return 1 if radio_addr == 0: @@ -130,7 +133,9 @@ def generate(self): if not exists(self.args.directory): os.makedirs(self.args.directory) + updater_stage_size = os.stat(self.args.stage).st_size shutil.copyfile(self.args.stage, join(self.args.directory, stage_basename)) + dfu_size = 0 if self.args.dfu: dfu_size = os.stat(self.args.dfu).st_size @@ -146,10 +151,10 @@ def generate(self): ): return 3 - if not self.layout_check(dfu_size, radio_addr): + if not self.layout_check(updater_stage_size, dfu_size, radio_addr): self.logger.warn("Memory layout looks suspicious") - if not self.args.disclaimer == "yes": - self.disclaimer() + if self.args.disclaimer != "yes": + self.show_disclaimer() return 2 if self.args.splash: @@ -198,22 +203,33 @@ def generate(self): return 0 - def layout_check(self, fw_size, radio_addr): + def layout_check(self, stage_size, fw_size, radio_addr): + if stage_size > self.UPDATER_SIZE_THRESHOLD: + self.logger.warn( + f"Updater size {stage_size}b > {self.UPDATER_SIZE_THRESHOLD}b and is not loadable on older firmwares!" + ) + if fw_size == 0 or radio_addr == 0: self.logger.info("Cannot validate layout for partial package") return True - lfs_span = radio_addr - self.FLASH_BASE - fw_size - self.logger.debug(f"Expected LFS size: {lfs_span}") - lfs_span_pages = lfs_span / (4 * 1024) - if lfs_span_pages < self.MIN_LFS_PAGES: + fw2stack_gap = radio_addr - self.FLASH_BASE - fw_size + self.logger.debug(f"Expected reserved space size: {fw2stack_gap}") + fw2stack_gap_pages = fw2stack_gap / self.FLASH_PAGE_SIZE + if fw2stack_gap_pages < 0: + self.logger.warn( + f"Firmware image overlaps C2 region and is not programmable!" + ) + return False + + elif fw2stack_gap_pages < self.MIN_GAP_PAGES: self.logger.warn( - f"Expected LFS size is too small (~{int(lfs_span_pages)} pages)" + f"Expected reserved flash size is too small (~{int(fw2stack_gap_pages)} page(s), need >={self.MIN_GAP_PAGES} page(s))" ) return False return True - def disclaimer(self): + def show_disclaimer(self): self.logger.error( "You might brick your device into a state in which you'd need an SWD programmer to fix it." ) From e15a56c988a64645ad18125d3a5dc0477a57c95a Mon Sep 17 00:00:00 2001 From: SkorP Date: Mon, 12 Aug 2024 15:47:45 +0400 Subject: [PATCH 50/52] SubGhz: Fix RPC status for ButtonRelease event --- applications/main/subghz/scenes/subghz_scene_rpc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_rpc.c b/applications/main/subghz/scenes/subghz_scene_rpc.c index f8bf066d54..42ec98a396 100644 --- a/applications/main/subghz/scenes/subghz_scene_rpc.c +++ b/applications/main/subghz/scenes/subghz_scene_rpc.c @@ -57,7 +57,8 @@ bool subghz_scene_rpc_on_event(void* context, SceneManagerEvent event) { default: //if(SubGhzTxRxStartTxStateOk) result = true; subghz_blink_start(subghz); - state = SubGhzRpcStateTx; + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateTx); break; } } @@ -69,7 +70,8 @@ bool subghz_scene_rpc_on_event(void* context, SceneManagerEvent event) { subghz_blink_stop(subghz); result = true; } - state = SubGhzRpcStateIdle; + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateIdle); rpc_system_app_confirm(subghz->rpc_ctx, result); } else if(event.event == SubGhzCustomEventSceneRpcLoad) { bool result = false; From 67dae229a9f2150ab440343bc6f3f4504421fd28 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 17 Aug 2024 17:53:50 +0300 Subject: [PATCH 51/52] merge ofw PR 3840 [ci skip] GUI: NumberInput small improvements by Willy-JL --- applications/services/gui/modules/number_input.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/applications/services/gui/modules/number_input.c b/applications/services/gui/modules/number_input.c index 777e557472..317f22f547 100644 --- a/applications/services/gui/modules/number_input.c +++ b/applications/services/gui/modules/number_input.c @@ -93,7 +93,7 @@ static void number_input_draw_input(Canvas* canvas, NumberInputModel* model) { const size_t text_x = 8; const size_t text_y = 25; - elements_slightly_rounded_frame(canvas, 6, 14, 116, 15); + elements_slightly_rounded_frame(canvas, 4, 14, 120, 15); canvas_draw_str(canvas, text_x, text_y, furi_string_get_cstr(model->text_buffer)); } @@ -206,7 +206,7 @@ static void number_input_add_digit(NumberInputModel* model, char* newChar) { } model->current_number = strtol(furi_string_get_cstr(model->text_buffer), NULL, 10); if(model->current_number == 0) { - furi_string_reset(model->text_buffer); + furi_string_set(model->text_buffer, "0"); } } @@ -417,7 +417,9 @@ void number_input_set_result_callback( int32_t max_value) { furi_check(number_input); - current_number = CLAMP(current_number, max_value, min_value); + if(current_number != 0) { + current_number = CLAMP(current_number, max_value, min_value); + } with_view_model( number_input->view, @@ -426,7 +428,11 @@ void number_input_set_result_callback( model->callback = callback; model->callback_context = callback_context; model->current_number = current_number; - furi_string_printf(model->text_buffer, "%ld", current_number); + if(current_number != 0) { + furi_string_printf(model->text_buffer, "%ld", current_number); + } else { + furi_string_set(model->text_buffer, ""); + } model->min_value = min_value; model->max_value = max_value; }, From 02553d0c6b93b779f276ccd58950251404439a3d Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 17 Aug 2024 18:02:56 +0300 Subject: [PATCH 52/52] upd changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95b749b7ca..b51403f7c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ * Apps: **Check out more Apps updates and fixes by following** [this link](https://github.com/xMasterX/all-the-plugins/commits/dev) ## Other changes * Misc: Fix typo in comment in QueueTools.py (by @eltociear | PR #785) +* OFW PR 3840: GUI: NumberInput small improvements (by @Willy-JL) +* OFW PR 3838: SubGhz: Fix RPC status for ButtonRelease event (by @Skorpionm) +* OFW: scripts: improved size validator for updater image +* OFW: Desktop: seaprate callbacks for dolphin and storage subscriptions * OFW: Make file extensions case-insensitive * OFW: Remove internal storage folder if corresponding flag set * OFW: **Added a text input that only accepts full numbers (int)**

    v_>NZW%*F+k#reUTh#p91#GP+tYT;L#a)0sXqNsQu{u%8#jxIj4GQaZ8 zzdfFfGr6bdcopp?hinY*ab2P!$@hNJNQR<=Ghw+jQC3dJrO35gfbYBr%*`uCW;#(Z zjg)*mc5;B7uY(XEUCa~Oa03Cz1b>;Mjo_0yv~?B+&HP71x5!$Qc0crN{iTW+Xfmb>-DF1$RX*^yb=dz>%L}yx zM}Y4Qb=w{96h#dp`2;qr4BRhnT(qH(kfwU{uC`mFoEE={CE=3kh95O%GeT5=DAo07 zAXp!qxWw+gr1|#9L84Rc@8vdMp0Fb^#|Lcvb%ZkUA_V|;c&dBuK~TbK>J{AX2k#i N002ovPDHLkV1hmXUM2tl literal 4775 zcmaJ_c{o(<`#-iCM3xYeF_sp_EDUC{4l;`Dj7p3#WSONgmXS1+rR>SRWXsm5w2^F; zLPRPODp`_{E&KMH-uLbOegF7g-*cUFp69vm`*Uy4eP7pe&K2tuW?=euKB>)H*dm9^Dn;RR0X>_Wmw;u@rg8Osrg77KJlKNkkNxL1feX~{R ze&GN_kqv4UaV`|O1`sZbh#9_!j1h3$BO#iDb7+p}5y0if4Cf!L@iMv^b28T9w9ZfY z!P18pLT09?*FUV+jpvMSbTYekvqZ&IlD`%D0BGAtT}+>Rq7|;Wt)9g#fg9oli+pQ; z=Ee5{0A_iZ!C{QM1{+*=r~o%W>rqz{Yx%l;sn%M>2>>SpLlCiXL9QfQpjF+zbq~d;+*Rgxjid zH$4OL*@h5x-lp4JEayi^Gj3Kr9}t*;Pugwh2Cy=*Y8?PrhZ`{7FaDYbY{8Qcf7>`z z?n;ZS!Epgi?WwQRkH6K}Q&_hqXtj+++{Ing!K?>aWt%R_77x*O2w zTYd`YcLdIUS#{AE;LkrP@Frw6mZ`I0xIeGJx>Z+hpMap?w6c3aJ$xiqe_P`#btpD$ ziNoC*2$==WWf^8xHWgjkJV&4e-nLB`Z|B7#D9huDTP=|nHxmwZ4{KJPR+G3ohrd!| z4Y6!tKDJFZQD{pY7Mr+;oRd%6S6!w#gJ60I~HV`ljTY$#N z2qps}UYbbeG61ABt|l6)asjW?i$?&U?)%=;W!I%FUV;F?BtQJ{U89}5p6+2c3FkbO zt80?tChRaV+@;i{D}voI%GxJTus6*}+P(?X$NTUuk4(O3)>n}SPZ2so<3nPn!zXD{ zJKXl>J=!^%~tL{gF&-U4r2raYziK&%$z#DD2B;@JU6N}1IIRm`4u*=%k$oYDq=7< zPMVYR1Fd0p(dFWr0a?ngvn7q&i=jn5Z?e3-yqC|yCK$E+pDyh;O@EXA*7y6)iSda` zzk+rNMG0MM!MPul_LV*_UAnhg8kT8M!uKvcv(+B{0V$j5m9aa6>VQAIbU0KZ`IT5I zCe<-DEOorX-of9&podu@Xn)IL_pLLI7fOyg+_xSn=YKDGtEXJf;YqpH?M~Yu+eGUw z8`q)+*UgAEqR_pl$fNmDxFUOE^-Jk^1<994(i|S!OLyd%RP)WSbU$@(b;=@;Z(TMJ zcHY9y*uTP)?V0SE`|aFoF5#C|L$m0QImbE`I)ysVLwTSE(5haaO3%u$O6~rT{)T?{ zY5KI}^kn}`04>)rS1orDL&huz@Yib9+SEqY4g_@l(0@mqWKQrezFHKX_|$E-Nd8r{ zDD`8eccxoj8?Fh`N|N?N=n!W+l8E1ZGrViMXD@#(6Ky|Ro7{Z1sN1~gK#j`JXs;1e zu#~+ zM`-w1H?R>OdDArK#j#ke*p{^Zw9t0GG|RMQc7~(ABhzuw@dMku_w=ONB)Qkg&sx?g zdsj9lyZupFWp-tAU^e;7p5Z--hu$7qw4?MRrZ%Porn07XOrw_wOUg^+r7pRSePVLG zM;J#!>5PDmKtEdDWbs$c=jF}i&nKL`WW5Ufa~DujCC8K6#nJ=QrR>P1S4$~3LfTWu zWPaAZefVy%DEmqFVC6^h`%fKuFD~3#w^YxTZF709H)Hf`b{Ri>u45#(G`sZKLeeu0 z%M9DOk+*(it$j0brSU6sUUKdPpBvXxt}(9qaGCJ?Jia{gyqUZ=ccS>>`JU{6?b4UP z?&246mZzsso22GtSBV;fUTRt060bnH5+`NX;2kO!`+G$bqPjp|M8c>gs}>U-k3ca) zW_~d>^4`*!QmYsC96F4wQ2$}`z>aZ_v8>k19(7*#s!y0pERTD9WWeVUJiOdj7zh^LZ35>Od?X?;!rC7>|&tJ}tv@&fdj4!mQs;)Vvd+l4UW9pL5 zrz01P*Um;+9SwM?!Ea@&%1oBN_E>Sj($S>%GrQ~KxsOov^_=TDMYclTX%AFCz^e~d zTY0LgrU;EPzmZ?brbNG59#vfRUl@?^i?rx2dSH9oT3FHoR;C(!YVWDw8eBc@=T zo?Aaw6$K+CL+g|7TG!mY-&YgtJU0YsG<_ne7;7gLq>ga0t@Q}@o_%|v{cQWav`y<_ zysg8$4|8xn!S>SIn>USBBb+o-%dfY!Q*Qq{`Ism{NcC`-@k#GF<#_S1RH`eR#xA?P za`$M>w_&Ffu05fPOmct!=VR5crYCWe#gi2FvUB5|WA#2pJ#V6Bg(_v|;>ToN$;Uo3 z3POAq6J9@f{pvLjih!Cv)$xcuFkhfmv=owi(WTvSv+`DT!$+0=-o{Ts=NE)8$w?gf zJac`j?xAY1lW)E0g+J&wP(7%9T4KXVy@?9X5j)AqKRd5}oq$a}Vmxt&T>djFftm=H;F+ z(0iXb$XvGA$n#efwSX*SBUJ zW<82W72^|g<>h6CWa{TVI#a%u-YXUFdKKol&7AbVHU4FDc>Q=6exq+za5c88@iw!3 zfj)Dq{0^o?u|>YFlc_gXvQgPNaABrqruIuqy?o}u4Z|(#h3++COX(Y{W&QEctqs`n z<%M+?T3M8Hs+4A!;u&^SPeu@dP6CWPsO}`NIho)^vLz8bnCIF^x&XivI$l5d!x1(1SRkEa8?kW71h~TnL?H z7jnX$7~)Grdq52I!Med1jsh}?K>!Dn{V4vJU_HoRdNG{&Z!!!5{!4`6s|WepDZHgM z*qBNufwk3QMIte91m_0-b3r%;=^maK zTa%;znB%PUAZHm28U_Xn3JOvW(om<;yOJ0dyi~OFR|-fH~>=--dn*a=gJ<(K!bQ3c=5WN(>;AC=7EG zJqU-R?&0l$fupoNJl)-iP)#C%0M#UEct8mr?mAGoCxW0u)b`Xup>+P}`EPivmWB~Z za5`jUb z+f%82e+t3+ER{j^KTD;7ks9hK@Igxg(VOy{a_ILi{T;LkiS8Xp@;FMTlEHta8RPw5 zT+k$;&}b5Z043@W;80C%ga;I@i9|sWo*G0ni2(N`Y9k^4;645$eScRfhr$Vi_Qx9x zN{fWnLTVDBo;oB1R2!wqNhXn?3H3x1w2{9#C@mcbjN>Bgcjf#?CH*0B%JcX1-`3zP z{%tN2h0{@VPV0=?$UNn=9o5>x-jp+LZ*Q-!uUAx5OiWC~#l>}Zcl-MKa&vR9t*r?Q z3s+ZH3kdxFn%vmf;N#=NVzE3tJe!-FGBPsq^74X$f}ADSU)Ro^JNfzfMMXvD=jT^f zS2>Wat*zzd<>~3^9Xoc6jg4`1jvl$dVem|wn;6*#_fI*0qzu4CM#~=YppV)rc_*D2 zSlDi?>NTQU9lMvZbkhVlp4K6)zC5hdZLojBAbgv*x9)PIaZ@yx))4X2tv(z$>Qb=J zPuEDpW7SYGyenS*L5E%E(I2x>*0 z|KM%^%hIJV3T4oSyZ2zStc_zdRYe>b$BfRmk!j_U@;B)6$w6LmQIW)K34AE=i0*D0 zO3wqe)$9b3RjI}>QO!t!2~ZWUj(+#dLZ4woJ!ZqU`R?re{6mE%ZMV;v?-aEXTND#> zj(X$5E>~P%n+qNUwibhRlXtb(z?Dx8ALgR0kFVQZT)umGlNPkhxJX?nOc==k{JB~( zZ}eWy--<#%r5}I!e5KHk7B*6HPmupK@{y=@&v*bo`y4h6@|neI@yKkl{MaYg9aa~t z-LRnVD*vs^g{hhF3BxTXTU2yH>W*c;@t4HpH${_c4U_l7uT?ac$x%(*U}{=oI(wR< z_)N4Syuwe5NvYkv(O8qr8|W4V*S8*@8O8D12}y+xLAcdEylPH2xs$PeB#+-LXMjru z0*`yX%jwY&SVMsbd5*mDIbbUi{`4WQiAY~C4!LqQ^>YMEt?jYAwXDbUp*a7e`hyAb z@drVnhBvvsKS&u|P|pxQZN|bamDe787NrnR&^djvjkjdue(7=0#=!zhqrF$B&GdzP z^=3ie;d?S^UP1XMd_onjtoy9h?sO6@E3Ms~q@JXZlCROCiuiF$%my!r7lZ3(JaMnQ z*I|UWpb2rMMf${;3zTatW{5UD#_q@tfaVtwYfLI&D2M`ZvC38_h;XdK%3$`u=HnkWhTG&jjZpA zVFez^vx&Co<2#@mxF|MqepilkPIr9fn^d#-{$^#2axP|9>y4&|*m=i0)8l3HBG}_A zS5Jp~MJ53cZ=%HnORQDhPSjuv4>`X%WfhY+D-ogMX0Bv+rDAEH27FD|)JOSU%qv&p z;;h)@DlXLAv=jyd3Lq8m{V0e@dyyg0ADb!LV0a+FI&>`e;wO*12M!;OlP%j@}7vNJ5dtc?AL(XcSljqt2cv1Gl UKRHPJ{uKq7o1QSajdhFoKO)g$r7=Hl(0002`twPcO00NdtL_t(|oSl=uZxmM)g}--a@Qj36PXUSv z!X8(oiLyu(NCEFNP^@U!KY(I8XdQ%)5~WK@3sF#|N|7Rx-vR|R#1a$~;2rZL zDS$8-3(v~4b18P0P1@Y*zVp6wq<5qT|8pW$)!`}t90$lIK!2>NAGI72DLl?_8OuOC zv~1(;x*x23%ea?#ih0+Zgc=6{b7R5$^e6tVE@OEgPEuTGk+5DCSEb&>KZF$|3INk*caz6m<|dmG=SI;${nkfrk`e z1^pc$JnacowS*HXgs6pq8FpEY`}pq!e!QIkgy>&)wUMP$o5`|G^#GzDu6zT`GgXn9 z6`(#F0D4x8oSbd~eamXs@>&a#em)7^veUBGyGY>Rkbi4nUN&|`e)uaL13xb<8#z3< zJ+ZveT<+_6f_CKJx-NXroTR0l5DV?kAs0{nGu0Zt_UfSx74zLgpl=6lkRyK+R$o3% zEN31g2a`{?w$}j~-NKrq(yZ1e#2sEp3gPG|zzzf#{uo!c@e2sT@<<5tU5~Jz448L- zr-KmD1%KLYi0j33gjI3}E`h{RA;ywg3^AmZU6|rXlo4cC;abgNiHU-o$S=a62C3|* z--wC*CZ_7lYfo;Nj)o*_9VaDACJ={>mr3n$8x|xeaCy3+mA+Q()jA+dAsI>n8370f zwl{Msrci(Bv`5&I>^DjRcHN?SgbSwiqnSlajXdcxN4RU!8Oq7-P&d#xg1mrBv3+zGN#YgcQkI z$}*OyBosoDWvGz-H$BhO^LzhzKkxmy@B5r{UEgax*L6PUs_ii|5g~aY002ZR%uVdM zBa8bP2!go(3Bh=401z@J85`SL7#l-qbgDPWp9lb<16jvITy8GQ>JKjy#hi@#=gU+4 zBLJvMv0$sXYo7QG0Dnnb(%@xOw2+guj6|lnV{_y?A@i*0&pG?5eGIQfpSbRLN_S3a zsPOUmFwX4k+WWQI$;`?1E@rnFOF~jD@k^c`fU%F#!}cr1+n6`E)vhazKCHt|CDomIp}NXSRpe;2GfI7-4^q zxA8fUQ)~d$;A<@9VYxm*nenpf_<`U!mjp2b4}g_sbg%<}=<))_yQMlo5Gzm)qPJnB z$ek8dZO#KUvXeSfj`nIwS0}xe5BWYn@>%)wbN_N9yxe|qZ}2!YGbKYs%6t-J)wLY} zZ<9Pvh3YFW3~$!P@bUrT$GSNK?h_MzAX*DgSx^JH z=p-=U1o#fGxM>c8b501o4qLg-)Ll2&otE#q=3m@6gAWKUwU3)*^BExnmM2vLK=Eap#$!(e9<%)$!{>N-uZz0$1_K7+KVUKP z!ij*mj~0r#3;;J9R^koRd4SH8f-wN7{kr4Sy<2ituLJ?WBq!oPnW4b;Ch6iv(aa{r z+D18E{5BJV?Ry&a#ErI%vvvvP?npM=>ClMn=X+cRlFyMy9~G}`Lh6c4j!2%0n5M~X z^VpI7d`InNFrQ(opcGyi8!h1(*AMLyluL`_gW}D#ZmWEJ9q27@kipY?O7hoUK$me^ZH}Bb0s)k9fG>3X(%M)CV z6syfC?^e!MJ-t^{%KfJK9?`ZNmSA&Zt?k8ll{EHc^k*w@-X8mcTauP&;^7ItJGW6rX*u`pI*YR33f_;# z-acVL$qBZFAHPy0r4^K}+LE#{v4c9M6V-C4M!Y9~C+>MsAAl(bd{#Cw!Nnop`&D%H{Dz|w(pGKuYy zN!TQ(r0}H4`wotQj)&hd?+ZITa1?uR+Ufk=BaV-3$BMvjWgomNQgnP)q+Qx&A7USG z+imBbU+=yVxk?bJxEysP=dyXe1EK2G&RAvHS196wi%}ol2{e6>oNDcPvSMY%Dwuyw zAsBwv>bP;>eeYuLMDMIGXF7RAUzLx{V?JbBb}4s>be)BPV25GleSRh0CE+DH17QR8 z1D><=S=rg?0ZtGt%OLAu)*_aIT@C`*XxG@)MAZxib$`=;Lzrexffw5sMW;UYm@QI% z<}b>9}XRHtLRP=1a@#+Sgl>2a?aR`ID`amy1)K^qrVai%##0E&5JPADpK2Is4lx zIA?6nz-F+Y+$+f_X%5by3`>8Oj^E$AfAM(00CHx1MrbB|X4@=g3BRPeL|N)q?ARr# z*msC==p3C9)Di4YtDP867V|TnWek;kpuGLqfqQxW!J4&3hC-X$3mnJr=lrtE=QAB+S%n#e&wnIL z!cPaEc0IjTx7+4XrdoC%g3>zJd~&3Yebxi3k0Y*jO@Z`Z>GR$WyM3kpZas7uSFaM@ z7oHX_u%5kkXqCMY|Epn?`CWG57{3Qk6VC)sU4(qZBM=#+#Fxf*M*z(q%l~W}e7nAk z(RQ$is}lVtwNdW7!U{oi$md{sk4(E@mdpu-RYZrH)$TrtxXayw!{Xu8yDL^x9Zv+K zN6h@AtCdJQ)8tmpOYc8`y07uguJSnJ3}g9VU-7u>nonKaLVQuo(?f%PPw2ru#eV+w z{)Cx~YF73A>WI)Qzf2cWBpFhBz_VA!oBNw_SH}W*C;ihkGsn{%k{N{3iJ`owa$lyp z*x4a^u4vbUbGlKfk|`C3CoV#aY~ed>CJFhBR% z`>Jfb)zxo`j5EJb+7)hIX8p9qPI;0&OsTCaZG&xLk+^(#^icE0i?fd!Fsfu1Man z{p@1z_}z~=^gYi0V(*+Smc5KTkX*$l#N_965d|?@l^hI3SngUQ8># zSNf~$NcES`&d1!}om*s51_nM^R<+Mgn@<-^2NW;6HaxVf^D}(+`trO;iNZqcgn~Q8 z@)ILB%x^KSv$C_j6NJX2XHRxKDIWZutDV0TmUY36?X*$ypsN0Z+CX2!$B?r>L@z4J z9Qwq$HBAIAvQ0wI}DV>UhHG3~?w(dUK}O?!v$o;y2c`!%=g#n6k+;j{}?i-ObU zO!Z!DLr^g+pOS;it>b)+$njJvZB%Q5Dxs@#{`etepYcbl)J{e&)i4ysliEy0!I%))6K zqvj7!Qm2W_>{(~MQpQi~=|er7Hy2j@8s7!J|MgzO?KZQH^J+$+DnRYyu4>hq#b3co zvvMIqb5=ucVez34*Xsv1z6q>~eY;S(Sx#)EjQsLw^yq%!D#j57U&-FQwe{x8Xs=m^ z**ldZDzWidN=gbM@^#<6x^9jZRuoEgw}(4zF{c9`Ob%~+UOU?Dvfe*0ymGy}p_Ezl zgU)$S^bp&k(xOz`#l$V#T`%bxJkP1-)C{-ODW&aOH`uiO(X&cuDSU0StUq~fa~-~X z>Bkxiqbk9@RqkY%x-gDYy%`~RIuS7RqIwb`78JY>(VmF+VxDOu>Hz@gGReV(;bLut zB~U3E_}>_fPzsGJ4FGzFLuq&dnaF^65`9PkI4I{?0~A8?!a<$U)(C5wG0~S~9!4h~ z4?E^S2qP0PUeLq(5WP?=R{@2{z(YbQ{sDp5P#p9xy;$!2HyI9v`~_iivdMnE7C5FLyL(o-9a*THyd9fY6|C=?u_4M%FiP$(<{$$cUJJW#Gdx|cWB z-sH$X=C~^y)R)1aVd3zQkPwX!O${pD2ad#GFmMD4jzYn>2v{I9fPoK%1q7=6(O^Oh zB+yAT28kK~`K=M}NeyD)pj>DFj)Fq7w*FUfK;S>Q;${sVil@Pm8VERr@;kJ@(18ql z;{UtxU(taMOd1hxPYk36(Fxow@mBdG%uV0_HuM|F^#*H0=UyNJ@ct%LLJ)-*z_2jE zLAe|aFOnA)f!6Wz_VgscvcSA-NW3mV$6FhX*8QXBzsVb+Q5a(# zLzK3zF%pS1H8H|qw2VxRP-r7fBpRt}_(#?vAdrC%AQ1o9CUI^5Ba8f>vRGp}5znB~ z9jH|QKZRiHOJz_4eW^4EN>c+3*=LO>kOF>F_W$0czk@a*(n-NYuOoCS1@c##v84av zf)){t!4Q#n7(o}0fNAL zwTT#QlokQztxH70bkJJdWD@XNFmDWA2lbnS*4Bl>xh}$gSI&P_(jOAHJbzFBZ4K_? z-{v9)a65|5ZJqj_QZH`X1=(6Tm~zLht*y1SH6tUVjEsz`swy&>+|$#;%gejEx+)|j zBq}Nz6BEPF&(B4IK%n*Y^^J`U9v&VgC8epUscqY~$;-=g!CV%XI59CHEG*0=uB@zV zZf)@>O; z@PHH0Kl}a6BY`7wa_VXVnPz-8J`%{`%GB-N$WgJLP z48Z}14CKOJCwB2+cNG~uyokheC2Onq~|9UbY-N(LiE_5t+s6#-+iDL1~iD>jH z)#NONXsFC8Pp!Lh?N)^HUUA_pzxUG}k7&B?=lYf;4ur8h-q&Mf&UoJGn8X}Z5rYNX|jbzE=aN33G-#}@?l(%6d^Z$=xF>#m`+K|nqWxi*y^5R;hm@y3Ggi3gmC zrWFq8o@@!&Lln#epHgByCMh(woO{eOclo*)XjK2s^z5&vZB>`c(*z(DNbyB_xi%}h zQ~{c69OEYUOiTTqWlW~%DIf&;Z5uG?f95#|s?em-La->11%g#T{o;X_*gRj=_KM&4 zGw1LdFx2v4T@f>p>7eDhoni)upN!3{3q6rEP?;l=)`uVg@XNJh(R_}=boFHdeCdnN?FbTG-ajJz9^1>Rd8`yrMF zK+R}&jfStKz2oU}H+apmz>g6valOMC?T?Y8jufM^s61i74g%@kt0sYWW?oUgOB3D( zyz(q(w^ebJ&AT~DNA2E6zD;}AJNsumbqC8fP zt%*JM+gETRJ@q-@BA6%4(gDZ1TV!G^(;K&6Rr4_{B57T?la>zU@u-m9)7$C}vBJMi z@_RsyE>GNEzR#gSj5ycVG_qxBT7UH3y2>w05-B~ReNi*KF(VbCVB8sHyJ%j_dZ;DD z(zS~_+VX`bRbBQOFh1I{uf;a)*8#p{hl4S^*(Z*bRaQjh)hQ-aD2QwPQfUO*=iD-{ U`qrQ19t(hl=`oX1Bag`c1AMVsMF0Q* diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_14.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_14.png index f4f6ccd661ebca010fcfe407427402ee65958efc..741e4b58fabe01b3a8808d2bcb10f53f66631a19 100644 GIT binary patch delta 718 zcmV;<0x|vaB-#a#7=Hl(0002`twPcO00N;&L_t(|oVAcai(6$BhM(`;Ozs6GiFLq? z4($yHy39%nmgW{+6j$Rya3M6i5k$<=h11+=LEW`GUCH1N5J3?aL+1-qtRQGW7cO)r zmSO@{y<^n5Gv3_SMJBcWfS%Pk?>X<`<$(uP(f_6xh5*(1%6|YdIKv7JU@mOIR;szv z00?uE-E?muxVTyMt<&o>XkcV4-Qbvr=9A=vXcjrG|-@xg8QZ2FXv%2`W6S#n&bgG%04P; z5Vi6%1rTU6zke8J5DlicBuVADybTZq<4ls2l^ZD-GauDrfcKm}2dF&vjdmp!9i58- zf~)(=0Vi#*LgggF{ZNB_ozym9g!k=g3xrH2o5{R0{rcv;1NWU|R=+-v{VGP|i)066#< zc$^O`E|PrllU6b{Oq=YJQy7j5Y7k literal 4722 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 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_15.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_15.png index 5dc1a652563722b09ff28efbf1ba62efb97e79a8..c725d6a71f303bb6552e52eb7be118fddab382fc 100644 GIT binary patch delta 743 zcmV% zUi+pXxHL$WKx<}dTx4h5xeyv~nu4*Qsf-c1T2`&`65?l!GdLI?hjg7c))xH^1 zF#f2Sl+eyI^XA*d%MaJRtHa@Y&OP7HIq-xpl%#2B0hk9UkADS`q#d;fiWGh-DN5FX zXj-y|&o}*Kr zHh?;zvww7~A1GYiBFprI`vu^c0;&WnD@M(r0V}b&21O#1=CNdrAzkbY5v2L9G1lVG zp0l>PPUw@80tkbe&@aGb7O;}P8xi@tm~POQtT6*QlAG@rw&hBMg*;j(&F6F1kcPon@0(vt zTw4=1-~Ux(`O>7Z?mMG~RLfX4J(NKUzUtKtmZdvGPMZRJf4jT^arJZC; z3fZD4TPTt&L$>U{>3!ec-}jI2^?k1AIm>-M_j>O8T<3Z&I~=r@5K|Nb06@ZqU`gcn zT>fVY0rT4tNSqx2h*|hrSUA{NSU{O92Guu!0sx^s8IB=t35)W^1B(4LPZ>FdZ#VlJDv$fOgT>&|tG5i%})$13V$rac_7!-s`e`~7s z7J3Z;(_l_$1p9%>DyW132ms7Z9Szy~p^fw94w|k2^cpY-lN}WY#S?)B9jAuPK*Ltx zf#YK@F(45D0yyF3FyNj9FfnIiEChTiNa#}lK4ot&fB;uPK#G>NhJfh{z{B}0QCpy< z7RV|zh3N>^6oa^jpP{V%1556@y`ou1#NLH1MRN>RO;s{)J2V(7Zx<66pWNYjyAt^|+IT~Eh%p!)vA|zl z?+u#5J^x8T5?mjWyAP5DB0#%D(2{Gm)oF0W}d*Ac1H}w~k=IG-4JWqbPn2 zkoLx)Ig0?0P`wmqx(5WbBl1Uwse)1A!ATc^9d+h8uQ$g5c zYi8}%iYQS*vj&J9NezEV#xwR4tQDe=5-SKJ5ir-exzMpon-9TWH?VRA3e5ekxf9fX z!daVfSC5%4$M-fs(N|WlR9K@D&ptW?{vZ%!`uwh{;*~d9f$eOJlsorEwtu_g6BQ%w zv+Vr#1K)$#!09WoWNtf3k{Z)ZIu>)$%Hy(|qGr83dBhFt5{D%#yXgmSQL4!#@gN!k z(OkI+$ngu(wE^ei&C?XRyiz8WswjDLOUi>+w31~E5Lc0ZP4G9q~A7TP=|>)xT3g3J$)dzbLH zj@Zz$f*lZ!7YpPtL8&`h(&R0ga^X3h?^1oeeHVQYW9)L#{_`qU$?uXo{J)EgjgFn4 z3)v(QC2_u<;HkCEf7_{T`CCi3AyRDfgx)8oG&mtYqLos-Z%W-{IJ@m$*d4y*+FRKq ze3DC2MAGOzC+9$ClTOY(ai{yvQumL$oX*?l{Mg}Zf#?VM`<(^K&Myk|id%^x#5jkx zLnm^oPOP0cl!QTwN{DNQ*bcc1pctguZUU{QKa7!)>GBv zImw!opB(Su1u-*BGqf}2@ihEmkZ8GH`JwX2^4_4fAI9&=&d%-b&uL12bl^3V8?On`D!NlNB6k`B(Dkx5Ao| zMii&YJD$Fu&q;fc)>qU``_SKP^!oJu6+4|YrAGHxMm)2*=|#6MC!4=!P`M6g0vgUlD(+iRXBWj#k(?gCaxgn`QBc?XRKiFLcaiF z0C^&}=@8Usf~8vTQjG(aFohb)V{tE`JRa7!63(O&?Bmy1^zFkMw0fSNJy8 z+LRe$co=&)KHMPkrfl*flacdKa|gs$`;mOQowD4|3u%$|R#n+ovkyHiE!%H+{ac1h z(t<(%-qRM#K2i4jg5Kzg+7tJ1u5G*iTz%Hg#j@*jVO#gfZa6M6Juy9pDB*kK$)1nM zQms;Z>YhCb62qKtw6{tL7vC-pt1ku4_HGG?v~ACMLM(QWl($9P-4l9r>(S6MLM7qI z2i*bc`i~`b@pJOwmGKW8${sxaR2F)8W)N0w^+H}f+EF1y2jxyI_X_o$?l|4#)AZ=Z zn!^`2qVrEbPT$X1;`xp{cP#dtbHyYTBsMnDi|39!CvPDoc{%g^k~@#OoY}3AbfS=1 zc(?f1gMDS+zPKJd(HTC^q4o59-e3B5a-1-pJ5DcLJX~F}ztYdF^Ig=mM3K_W)e)r= zwEdsix5NDAV_TlIylnwvN!ZDw&Cd#Zf8N&1SqRHG9#s#~+CtGYkr)U4!r z% z83#>_KBV+<7HwBk{M`?^S9)8tWtu3kr)*14EH=)59*uLKu3*l=7Cn1+lpZKDDmJo? zV6F`jN{%wdDT_^$u7<_zIlJ+_?Y#GAmi=lv13&)ysN;T%Q^|WXp;SuO?B8CtqkR5X z@WP}*h}e{EpLWvL%$o~%El)X)ZhdDM8cy*ez#lN7y}xt_T3{^C%F zb+dJ+`abomaT%(rN)n2dKfPKLhVmcf%eB3YaM|FD2i_kYSo^Yapv`Ud)3o?fbX#>X zr(l-FyI)X(uUD^Et!U*K&E%~Xwf3IomGR04>MK=Kv{p^m9cJ5?$@Tf~>=%tk!`D|4 zix*~BxVRlM{9ENVwv`*(kwImLkXRJJ%!}bkf!feW-V`E*EpIV_Hyrd>n!mQdCIF!RIrzZLxk@~y$!v-lSXIw`=CK@Or(=xiHH zBN%^0$II6XkHqSGQ9V7$a15D5f@3JUUT~6^rvV&EMUf21`cyqE*5Hqv|Hf~QMdK{= zab|i37AO?T%F-N%!<_OEJ&;YJlPQ06`|@?0WAxEhmKNy$$&0sO zQAlhC%Zb4V_>%|@J`6S^(1*cX z8SndFOu$gEI2;8bP8cHG0#DTe4^yD+HpkH)=%d`S> z`}5xW38P*P4tpZ*NVK_LqOQ_il)N@nzeeW0R^{!4MtxB5$0FMW|+{J3XBEIN-6iDVSl4|aFfVfIrsip7`%#z%RiGz-YSg90@1`)!&xtY&;b#}EU0p!hW#mE+j-mKuJrB?Q4q z=O#f;0!)E8P*!YW>U$b+x8@`KNZ1M%wG$K*ym=1@qMweA(kKOgsA?t+PX5AN7iPZ* zkdv8=DiwB!v46A^Lo(=~w*aQMudX2r_saSllKy47M<$^iDr0sV7|(OjaJZIm1N7@i zL4!!yCXa3vj8>VN;c37b0UAH=lbwb4lQWHECck1pxIJcRT7xhAHElA|-Z}%Opa+Wy zJ0U15pJ?iZr6lF}m@u>K=J}VSBahGQ`vJN4`Qy0gHm;7)+P9QvPhSDK(j9&sYe#3I z)VQfmo~aO1oO1cwhkFOLin8p^9aM?ml=xoX+I)P9bnq>qflG5Tow7e>Em->2dM>n< ze>Q0P%`&@(_syUHf63PjA5DTRhvDE9D&_ti@v}1mX{Uw;ZS*IU)4fR*@hr?6j zPe2U?A3FILLudDuK<^lw?eVx&O;n4DdlY1q57q3ChH`I541$l7xdEG=A~YUjsX`Tq zeG*sd&4=Qw?%hiiZo=Pn7Qw?xRl;=zcxh3Xends4hK6RRA8s<*zb&T95UtU(f@->Q hQndT}l?^c@K&bqFU8l#0|6>UNY^)Ai7MpvV`#+0QPaXgO diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_16.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_16.png index bec472921c88739c9ca5d1290680fe4b1d0f1cf6..4bc14bdc94e41c1e91707d424f707fd7186e14c2 100644 GIT binary patch delta 705 zcmV;y0zUnpB+Uho7=Hl(0002`twPcO00NXrL_t(|oSl-ti&R$}#XtAHxBD(AGh?t= zQJk?#APG(pRB)Ub*=8y+g`I_!8%Q9giiE^@D%ScZh&EQKQiuq9hd@LG6%@1x?px8s z5VG^sjd^R{dnd)bnKiAa`hG9xeDC@GfcHcsNt4h5Z~!3LB!4(bW91d21-BF8gmZwK zNY?TF`@Xm|t8uO2$(r$Cv#5z7VE6RF?7fHoYWdO3fF&WSZ7rIBL2HMzY zyf!%eyvRUOmSQ)y?QC5-UPc?`&}?^$!n^JDf0D@LCXn8 zd4K_TRQg#`-hWg2V_pNdCu`xrZmX_BtdZAPh0Eks)9f&gUqM{SSh10#uiQnz#6w@CZPsaf1R$fX7=nA zbxg3y=zL;8FE%%LXgm~sx9FQHqt#WZfDo3h&LoGPbbqkHM{6zW^1T=i9=;WayG}tK z8W;i3ij-u_g#@ax7Ss&y;Pfwc^zPm8_r;-*B&8TB=FPqU=I4G(r;In>;aQk_G;PML z-Jop;<$a>+B)P(`VGF{I$zS#ZSchQg=46qx+cn)v5Z(P^MV1{W6QCIbp3jXXVg#Hx z0j`}rhJT^T`otT}?$;8ArLo6U+Xd$NFiP|~`5w;H`gkM-DUt66QVA{ljd4#L&aW1B zWQ|tB25p5jmQTGrzyHirV{J^|ouk!1&<`^jOuMQu6qfmKYfTk;EiKp94Y2deab5q; zY=peB$xq}i58lq-e0wLhESaO9ngy(>u{BSDg*vbPUzitrds>mCW&M8nIw6CVZ8Uh< n06sqEVdG&nzf$^RxugF8v{gSi_X+%w00000NkvXXu0mjfRufdU literal 4639 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 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_17.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_17.png index 82e5176c89130ca2f5def41a7b5888fcfe921d8d..4e4fa0e52b5f9885282673872922fff352fbeda2 100644 GIT binary patch delta 188 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 YnPB0-mm!6Y0yuz;)gj9wbI)`C0T05Vk^lez diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_18.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_18.png index 3b5e60dfdb933468706d6c1749f1cc2e862b544a..f7302372b42ebd07daf497482018bf95eff865e0 100644 GIT binary patch delta 235 zcmV07=Hl(0002`twPcO006>CL_t(|oZXT!5`!QVM3+#crBUoA(UkV&Wz!{S=Tk)5_`xoX*{|yT>7Pk3CmJ2jn%z$N{e8ej8L6 zTC$I^b1e-daq@vd@~ewsTLY#_*oK9y_a?oc(yQIu#ftJN{yjI5XO_+O<#Lq$>`rn#olNm10YFesx!e(>q;3L)OH$G%HQ^EB&N8xF)38p}7dphT=@CPjd%2#b*CLKaIvv;l zrqY-9^lUJ1YHI1jQrTGA*m4WIbxYV*Y4zCAEN=jX3pYS_sYKghtLw|d1ZA-U!XT;9 z##f#qH2^Rz#10B&Ju+Svct{5X0Y-<`Zt2>=wTq?p>Mj5%78n3ak8Ki&!2xwzj&(9X z-FD!S!xIm2ARYjG*&!G(a9;wL{9$Dz0(9la^~nQWSv&GYfg1uq@?Oi`f+jD3Q%>h` znu1lYfJ}}FSWCF7P$10p8NyO9tXu>Lh{DHgF*yZc!D&gUs@t$*Le?#t z0YGuF?d7Vzam?80@ZczU%$N70CTrDanhrMFHPgRZc3n^ykg{#%^_(0T=@eqr3Ow?! z^vOR4^f&`v{flney<(Y1#oq=mMzZynO?GD7v9B{w-XXqe)0CR~opRXcNTW6FLHa;s z=sbUSwKsSgIGtjWTu_yLapg3D7Ep+b8fz5Bz-bF(s;jl(=T@RL+JhNQ>OA!bw(SH$81B>>K4yDHmf8=p4%R)u~O5R8<>w+8?wp|gbNjaYZpzO=`1_OfO+QmeUD5xZhk4lsgg{4 zsa#eiFG$#6ZnAlIm4Osy!*JLR@jKfSO%)ug&|Sh$9|_`nmT5VU_Qn> z)(xxr9m14B-8gRYE2g&>)eRt;`Z0fBx|iq4$FRCeQDwC|-M$>DR{6+2R(KnB~)^ zSiI9P>{(V`+u<+%Ea2?5C}LO}T#|gfn{fR46^m0>@rvrTa>Nll(m5JQRL1KC$SPH3 z5O|`y1tY_@O^TklB=ySoLQIS$-WqRqPi<1QSh`fyMeO1w_^UnOxO;ZRYQfTr)j{s) zq8R)^j{3JQ6IE({IiYN zj*pFB{1LcW;d^!AJ=4EWQBeCR-!i`;WZxEyzJf@TBEHt6%bIZp4*yF`X z>j04@r2yy|YX>vG`(zF|mYhC%x>-Q-P0_$Ksyppa%dQrQmNO6`h%uz7)4PCN5L%$u z6WmkL<37cllAD_7;rTPtP0}^f=g?I2g1=a)Zt0QI@X}uY)~`nIh!gB_vAKph$?=bE zmUGk}*>mz=d7ZpA6+M`asBVmcFI=BE-4sLo;&Y3_ZJWL{cyDW?S7~guS9Y6K_8zYK zw=15XkwNlCWDb3YJ4fdesn5rN;7&pG=2Yj@3|DA0$NQv^OWTUyv6`CdH2XMRochTq zR7aXm2BD(6tatfFc&632LW{ zuf38>>gH5*YU8te1*rwq0jbn}nIV~IjdqPW2U-t&a(PmGGG%hZ6l$I@uQpGeZ&hyE zA+6kbfOQ~*$?|Us@MV-uJ@OJR+D;0Mu!2O05 zs-c~s$)OvUGnNkgYFvr_Svko5E;nNT;`Szf>sw?xOX0 z(=*YC0ZZQqt_npVS$^@XjK)61eXXxYiXB*|Sqqw-oMG1`&+@35==|%?5A=FJV+MF~ zynS)L#K}}{823K+e9)Dj7BflGtZlo+rmhZGcU2o+{p=?==9{9OHk{&^$RZYw^kqGl zA02OL%m_4aMY_g>=!f5uPI_!SauI~FhiCOrB`X3LRHT>+3ukK8*MQ=+``iiQrwk>g<;i2zu8_{-*D@;>|$J@y`-Eq^xpoUW804fak1st zqwlr*$*W%%RX1Ib3n`CzWY2x{q>CHmIx_&Sw0I$>8tEV(s0DY!m3jnGrrXapdNn>y zT(KX*97;NiscPU<-3d~Tn7!buK; zbFc8{ql4VhAs5?|9U*gUYERFnLnRGU6WEEI2^wd?wesPia&Oa)x0k0S3Y2DUj3}L? z9{R+(6YM<~)m+@%&@6-`Ag7KsJ>&F#zoVNyADn*9t1J%k}JZ9)p(@00u33)aiYK5j?c%010mGmPa~->gecF4WI{8jE(DE@S)vFSz%rl^iZGEHtzX zWvmQhA0DGmkQN%JTnq|XKWrurwDI1Z`{iBL;rHR^2Q9bT>~h|lNu?5+`o|qywbHqt z0rOMxf#Tn+``m(~gB~td^sIc{_-o78bH%Ggq$=vb&r?;WT3@?v;Yo^J$ykkFdv|59 z-LlEDL-nBQjp%e06(tG9^6wrkaf5k}^R~4%ggURWC;T3a^{)&q9d5-hcTI0vjBKqe zWarN^c@Od*qH9%aRmxh}hBJ4U3tD>5^0>Ux{@QYtPzlgPYZ|xS0#zIz? zp$nI0m%>nLTlu$21(pS#KReBFY17Yy>h0Lh}t!Nh|^=i0Vu8LkAgx|FVnb&)3CJFz7E8mX9I$Z&G+0 zdypBONdoCVxXbWz`#JQKy58L(-R6up-@m50*XLD_!QFdoW!IAkUS1D=~U2PX+~52g@O(V zi9(U!1PD=|0E6i0!95@-9Rv~rCusY^oX zB6NrlvOWn8(L?I+lSw4#K*%V99%6k5sjCl$@+m^sE9ZYI>5qtCp6k zNPN);UZk1`z9fZVxFhjJG(DT>+m;yBA7Ag(xNY|9;y#~NmL{)pBlalaUvE5On|0S_ z`ubtqRyUjWkfSbPx!lgJCm!Z@YhcSIMY6sCB9ARxd3 zuEPc_5QcySm@^F+AfP`mQ2xfPdG4?e_<%XnTzaYX%46G~5^h;K_Pd#>I9m3@*QZH= z(0gw*-IJ_9QJrY;?;~3vDUGn*;m2z!1H}`s^-LI?5{+OV-ukm`hR`l8L&Fkb2KOF$>u8dR#x`GgLgitaQPPsM@n~WPOsq|`;hLhKVm=W zh7g!WAszwXkOT0Ed}owVBBCzvNqh%T@~!}kNs_X@t|YKb171#v={=90l$X+y=K8F@ zcYo-BO8{$Z@I?9i1*P4@)Bx10uePrqw%+xz-3AO{n12~8KlhuplLy{%k%5x{W#1Za zetu%irNn-G>P6+nwRP!t@R8IAs|MYz2Jald*Zj=s* zcQJVP?U|uPN!oVh{_U&5SmVuGM@Og`3&6+0@Z8d0*IIlnUjX+8o0qt4cG<)TefHDn z3+=Dg&wm`f5raKw_APMz`DFa;0Om<^+@9v?#QW%KV|ZeODCM>vacNPpAn6dn4jA&R z+Lj~@SU(MPKbOX1u~RbA!MR&&STvp)sy?hhW4EcZxaHj1iir~ReF@-ivhKn`5i0Y=U~ zx|pqFHRV-(Th~A1b60>$c}-cp18~CCz$^nOuea4Z=qC9WdF@@Ei{UUb00000NkvXX It^-0~g4l_TT>t<8 literal 4664 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 U-yOBsn5_<&7@apP)^`d2KOwkMcK`qY diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_2.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_2.png index 84d6aaf3533941c61a9f82147f1bd62f5b17b52b..ffc82fd6f234de70c7c0f46b0e224ca08ddb5536 100644 GIT binary patch delta 813 zcmV+|1JeAlCAbEV7=Hl(0002`twPcO00RF>L_t(|oUM}2YaL}6g`e-8ulG)qYclZ% zO(EJ5L`7111)(V>W}qTjNtS|QVwD&-5{f%(Gg=DmLWo&)V@**+QAiaRDN^niQ$>Zs zMM^EDG!s(1HN=~Vf#$}{%4)=i!{ifdl`a29y6fpMR${tKM@VQJsUT=fTHE zfH>tAoF@nX0hlokD)`(520AXrOJ4kl1uS5O7Z=`Wj_=<1lHj(G%8#c8qOfj*wu(ka4mnOEhOzYZ z6xv>M7_-uydw&CTF52gK=0iW3Wq;E25+{Ew5IxKiFeYVQSzfpRs{ZE11c?0Lz zy7CM1#a19-V%86s&f$dnW&kXqtu1LrJK@fJ2c5=(cV-7nKnn2gT~H9hvKH{cy~>== zp%d*XaTO4hKxR(9x3RB6w3E024}0Yc&Wr+RK6$e_a(_hRnLXbxs;Y>$`#?wt*ZK9_ zqhe4U*_`bytD4!_NmV7X(cxEnkBLd2xN3>4xOW=Qjh*(P=lL;pS%wz}T$}cV6GPVt zy;%0fFUgS?D9EQvah9iY$?GY-@?CkYX1*Cu8u3}Mw(Iks`u4fymwN*uW0Y-k(z~2g z?;L%+3x5!Kzg+2iF&eCIK48RHV@m(Xhkx}9>4i_HdQTHOxu3Q=mqwCCYE*vwE*??-xxBAf@!*FG3<`0R93NW<*3IbFB0(A5!JPD|!#A?WPtk7BVKzOJH ztYBg+haJM-BoVg&{6HPTo3!9(G=?}!5kAAkOtAnZ-y24#yA%z{V{of2EJKUmQbf#$ rcqTS+u=RU$URzpBu4%rv*028pc1k@6Z);Id00000NkvXXu0mjf*u;U! literal 4785 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 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_20.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_20.png index 2f8394fd5185736cbc37b773ae64a7b76fef5f1e..99dbc3e084e685b84223ad9760ef8d8a7af33d6c 100644 GIT binary patch delta 827 zcmV-B1H}BRCB_Dj7=Hl(0002`twPcO00Rw4L_t(|oUM}2YaC@9#y{^n)7?qCn28>` zV$vNiDy5|>2#uI#r|2OUwRb_|4{E*GwJ08}?%PN(9t7 zEi49*hsSkA2&->y*)uPHps3=Co^{qJsu!Jf^^LE9N#K$kbk(#*^)lmdFGaM)!$G zV`g<`C8O|agnv?Zi>Wi0kNr1tKj#i#13Zi~GhBAa`;@OhEQF%0HKvLz49&BzQ=)mM_qzUfQ(_PqN3bgdx=D2a${4wr1>g+o4} zQo^>Hbbqcz<;^pX3;Qn`EjlfMSX;kEJJzzh+?ZaJE!4 zsWfDy`2hs_6t0XG9Xl(FXB8ycrySRjmzNbMLXoevA4Wnl@(*RcaT$8kJ1PJG002ovPDHLk FV1fb*h5i5l literal 4779 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 literal 4793 zcmaJ@c|25Y`#)yvTe3?rjncv}GYn?3FBxSWds4<2ON^Nq%P1O=N?A(Cnl%)njbxdM zkPt<-vXkuV*y1-m&(rgJ|9C&|`J8hv*ZRG#`?}8OzG-Q0EWo>u7XSbO6RaVQHPcz2 zE;pDpj&sME0RXRomw|z$iGcxx;zxG(@*x61a9@UXkV67fTzim7++(NTvrwMw6AnP- zin*JF9CL*30{BQFVcmvnH+bzt#rCFSZR@Xg@nSP>jAR|H^w5jGapsooS&cc_fr1yI zA@j4dTVJ=TC(|dl+i2~3=zE3b?@Z)e0MNK=nwTEhI16lja}6CNh8<#u2u-xS_26g# zfCVruIE-4Rv(5H|41fSim(n5O#^K$FDoc5L0CEQyf(lRavBl$nCMBCDQJ_f@D6@X% z#tYm703X_AeJJoq0GL@Z(dGbpiV_ASfS#QFMchCP8<29;_z+0q2M6clh0%ING_vpF+^b~!?j{rmi1Q^JOw1Od~;4FA&-B8ha%C$-? z8^CBuY)wAhsUljL_-S9z(!$Wl!I8H<<@$JuV?ypcW6<>EG&vFMB-pf#9{~1kbiCQo z(21X%7#p5&pY)kuX~@~}ULZrY4=xVwRNn@%148EQ^L^*X$GgFlMz*qmI`1MUpwABQ z9NchL>F3Eh!}}>@;}%V0TURDC+pyYegcSjUKJ`B_D==tYN{m6lMmM%pXf z9m9joi6g>OSCEUcNxyg!f&_r#C<})9ORg6!K8&zAHqb3Wht5DiH*6VpdmrB&K*&QC zNn-*)LfuB3t^ym-nw&QZ0M$Pv&lcX3Fn!Mr0ESuN$IJA%_}_>YGX&G$9H?eUfbg7# zy8MS2nnL=VWAy#J*^)_mQZ@`s5BrNU@V>0Qsl!6g-yk#uCWnO2hEG!@I9((&-%3_T z@v!SPaf{#&Vs7kpjqQQ9aZ9AcvP1D$)w}dO$kYu{D`-QLUmmDP|H2(-tlSdJPZS+< zR(CVLzX^hj-j1#|M%)X3Y6boR3ebI3D7!EEeU^U*RdtUuJt@b#W8ZTbE&9uxf{xQa z0;oV}bS#11fe>`R-HSha`?`_KO^1E*jpBrH2b5hLig3U|Jy1-Vk%^z@J_Nc&7n$Kc z7b*1C=W2Ysv4g3DLE+&Ux#z-F-1a;Xk%+fPpb3Q*&ku(PZ`237V#?zkP8Q409h5nk zdHCEBL6P$b*h7NNcgM_m4<3$3n(&!;WBakNJnKB|P9d*!Q~Bw5QuFsQ?x*x(Nb;SE z_&xC!cek3~ja7(Z8g7i3^5h)C<=qoLg(B*Vv*$lR>ZfEqvT7~L{KEa{2Ij#T6H->7 zrLy()A`#Vq)WfZ5;sz~wu-vXssa_slOi$%0Y8B772pOZ~PsyF$Ke(nQry^E@_ywW_ zA{w!-N2R=_E=d(gR!AwQm_FqAoSf2R1OJMYPVu$e#P4IpB&;q(Q{Z!k*Hi5QFFfdF9R^EM~#Jwb}M7=MhueQ&1)^ApP zcDipqfRdq`p_s9XAz_#SJXLB{R#n%k`UBd3YJVn7)24VN6&+hLM>q*8wFy2mIgSVG&q zn7rS$SoJ$`z*`gV>V@pjtIul~t3B3w&pXwc@{wiUY+x#mzIZ=&p3{Onhx` zb^mtEwS1%WhEuoHZZ#(LC0%aeNHR-e7T>qiwxijt+I=lH={`HHI8Exd_py|=PvcL+ zq_w;(EJ-V=4@@HsijIiJ9qT-{YVF&HnAx7;ok^YHoJFtU*AB0d*4htz+%J5f`vmpG zWj|`b$3P!S^>p5_>bs))qIXmF9?~A!{u#?CiHE1-TZEGXlO?Q416r>frU5=krJ{Ne- z@!VF8jK#Bb`OI!Osj0u-X{e^vhAlCGkab4i~mJY~yS-;rqg$fxW@9>?!Q|Tquqhj@O*Z{Musr{5%4V zvVI9-OLou~O>;rd(*cs_f_(yqDneM%@QSID=LSf{G8>UkqUvl3VGWNMq zDeEPbBC!!Fdh9szk65CGK9*{eL?x7t59GX(n3!s7$qdqT zL^;M^*0^?GIQgm0cmzb>Qd!bsyujD&fXGs0+BFNK+MJjitMZD_xIxV-iy63^u6?Z>A5%oucYS+U*Q!;D=gd< z6cPl+XcMFl(h1i;FvsLJ{FnR1e6E>x{3&~whc2|x|B%Uv(6c?7Rmz}Jf z7_m1$-*tJFM(XSPeyZZb>@;>dZ`!w*=~(yVRLupwu1`@50wvOmG2_zbNvFP3vqLVd z#&)=J= zexVR-?_FaQy6W3GclBG`K3D0gx{0uFmBv994ViJ5@-K0%8O={$pptzCp48Pn%b&OS3MRZ1o6(9 z4mgLz1wYxY?fdnUYje-fE6;bzi44-vx(mal{hi~Uc|o4*nLGD(KVKj2H2!GZC3jLT zCN4u(R$5?R&5~PN!f?UU0+IF)VRpN;Y5&KQgTF?$PPaR3_bl*j+-k2Yr4=pv%|9-B zf@zd%l&x-~X)Qk7E@|rzov)m)8f>hQO*y))yJNZBu}Nqw_+-J@Ih`9|R z#G8P2gX(BQG=niL10*694+$pu`1)glwV;35#jw`D$;wd3Um{d*E$H8%9Ly{s24p`X zL|q99Bf#Nsh&oyc;i`thtD{|26(LAC5~&PVQ%0!3kVp(1!FnP8JW!THKR0&_&hX?v z?pQl5s3(<5!6+*S1qCSusVI^CJd_b=G+G&sR7N6UED4xD&6kP~hWYx-{jp$3^e6av zQK(*IU&wEZcvo@&RSU`j`*##1ikaEJhJF42$rUSW%E5SwGC~QiOd|ab?JsG6DvtR7 zF#fBwzYUE-RK^kg$pL-@){(f&{ZVG6?|(b`EyzNHvG8MEAbjyYhGaqjiReo;G1P*x zI7)6_ZWuU9-Ob(Al>k#E;PEh3qKX>~@8+rjgS#W}8U%HBH55wYkDdRfudiWbgfM^` zsc9G>5C|hfeKcBC-$);c(pN#C5E^=abWMEysd!%k@sDpWmhXRb4gaSu#=wt=r;`0_ z$Yh^Cg<$DPrjq?V$rK1uMF|BtYKA9x`TnLH`+Z7(2W?37^9m%oo%ADW%LMNPc9Zc8Vy2~ zrD^!pcPzN4ZjV3y#kH^p%&6Sa1T@|#IwQ7a?%Lgys%U%}#&&M|W;Q3iA=D{TMaMpB zX!PqkB(G-#2Fy)=wXz1)x-9db0OHvyzl3gw5){g+9dc&Q)v?j3C(Jjuhfb6)oZVO% zK7-e_jA(6MJx7N;sMCpTeHQ&eHe~M_&-d(?&0;`Ml1a3l?$QyCENkOkh9Ge1^v}?X zl$)u*=C-NugGg(T;Y-^r1%4MSjX#_$e^Q&vRPPMJ%K^qA}6tmu;Y zcdyn%3Ll4?0ouXCFEta`0pVLcMBwTrAd{oK7u1x~_efsxC^xW4(=tlm&FIPwEF=N! z-+G2lFD;I6Yv{z--Kg-%%5o6}<={dd(!F~lb6!6UWz&6g9ys?pXylDF!@EWr2x7-h zPhi$QF`tl1)xl?u$he^39nOGEoc4E3!Lqo?F4?%zj>+kD*X1MEOA7Ed@M}TJ4_0&e z*WVt(SM|cX-_(2i%3vUTW#L$q%3}#^ahrMJeoZHAc-h{w?ck^Mcs|J#p{oI@MrGm4 zEO2_Vi9?zNEAf1j(WcGsBD?KhD{!2IhLI8J{cmRaZ!%$avCR%zI7oMGF}a49;I8=!M~+3F>jp0hS?MZ?hu7NP9C$Q*b4sHD2|2xy z`tF%sSHh=g)Zii}|H;_$vg5O}=Ggcz{jSh9X}~3CddEgKh-D#Z2r^se>TSNtU zN0pn#yL7fpGOEAGBK`XMtJBC@E^^Y-Psp`=2%{_frrO(iu0>TP@p<6r5&g#u_%R1C zRv#gD=`@GpcDw=7{zz}TEX-zz$)1jOSu`WI(kstxU0|AO$kP?z(^y5p$qhp!Ej z0HJrPJvp$}{ne&hrG!9s?B-@hCcb-;Is)E6LJP*Jy-o}+Xu?~5e66dNBRJ$JRSSdl z7wgdUyu+B4Vt?jMH74OJg&ztBegOikccycsQoTyhnzs7j!O7DlKK_-$zUCVOnez@# zuzBes^7&>6fpLYngGRT9y%xYH@~zR7W}=7+ZM1`1AM)mOEi2#aogX+>0&xS0V z41_a%mx(+}J45osLI9^PS8O}O{@nfTg=fEQtd35%u?f($#_#Mrc=P^lBvxCMqh?O9WuUfN0wMreS)3BWa4)F~8A zR_j^UTx;DaC4>N005BC;z*lmT?TcEYAYux6xqp(QaMKtu(g2Ltm6S`JppF3VmZ_#a z%i2{v3Xu%qYvC@&CUy251F0WUN&;U`>@oDWERFvmmN*A99YRis3P6Ysybcco>Qi7f zV#_M*E_fi^od7Esi_cRI;V&vN*8qZ09m2~bZ~?Vo(>lVZILjEbPzbz!gtDun5t#+I znlIqfxA+Zt%uIymR~&54*Jd=)d}K|td#1beU+INCoT(*wt^fc407*qoM6N<$g4XSj A&;S4c literal 4815 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 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_5.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_5.png index 7f980f57f8a6c7e10c63406770e7abfad0f3d1a7..61e2d1981b38b12cf98250d43cd908e9d8a91ef1 100644 GIT binary patch delta 814 zcmV+}1JV4?4Y>x87=Hl(0002`twPcO00RI?L_t(|oVAkAYaL}2hM(`umphXtnn|g& zg~W{DLb|ZGRcMgvog&x>f&n+;rnjYFLBv$u6x;gM;zCrAF0|0nq$nt;B#4W;2!7F^ zU5H7cVzK!#X~A1+N$yR++?cs@TqO7(cy{mMftME^_`fcKN`LlWN=T>Kqj?!3A_Q=C zN(7EL1_WTl9EER**mxMYKZOqWpxq=U2Fv4af$EcWVhnMkZSTREqh0Mg8=szx>kxCk zC%-U%>E@chLm2@RHS%-u@U->MPzU0Gw#KfdC%(=pQAK<+bOoIlFIcL`X=<<>V9tOn zcrbqj1h(VUK8WOJbL|Dlq-a7r&ju)yh+4ztv3k2`-K!hTW|lic;JZ0n1(Ee;93H-rNhaVCn zh5kNOZGX4bT5)@IzEDz|9{eOZDW<;rc}r@=zggQqY9i=qhU)X2z{TdzZzAFBEBi?T zCp+DXW_gZ+*6c->x9Tz(^puVagjt1iQC4%8z}oJQKj`mr3-3P{lNzh6n=i|gweLj_sj3j)Na(lve_wOKHWEBiWUQtzDSZ^AP&<1}~2Om1rtFYB*P6WR6gJlRv zOlz*PqJ=K?=0sSfpxAKQ83hqjDz0xh+b~9qw0{9(S%E@7s3#&=O}m=9ra#tBLn6np zdf-mc2j24wIze63d(|<(#dVO!d(m6VMFn~)y zRXOWW3gM27bw)-(Q+ffzWW zVQM?$1X-ETPKU@x)@88O0rX*5hL=FHfu^&XKkE>^gN-7QiT+6MY|oaiQ`t7dHV4pk z5mhduLuxx~FqWSwE9}1SjQ-;|jxWaBkUl`Cy{acyuYZNzMrul4RR`8_vj#N7E2@9Y z^+xkd8p6`YldVfZ1&EAkXG7NaN@S;TJdfZ9AzocX@3I}`GKaJdrgB^8@MjJ%d9Cz@ zQ61x7*A+W}%LHbIPAx_ospzmIZx*T9wJhuCs~Oai6P+7cVv(7|d7k?QL6hkbDN{(Q zjDXA~GJid$dyh;H{aMnYj|ZrzWNIhnpLTD%NAdEFtAg>4Sd;bH4t zH~KZu=(A`#M$_jsQRg$zC4i~xlhKGy@+KpYkuy~Sq|tX8eqrm&Annb}hN7t+vfkpY z8l`gh)-B0{)y&;taE-V6LC7?oI8X~{Lv}~X*MBHE0OPSbD(>3cgyT)=n#pOv!{oARdQ zpnuSPLG@a@V3ntiEvh_e20&h-Xb+CAJyFV>8Zl>jXu9b6KeO}Vq%PYx68%#Rvc&n9 zh9A|kQ6Hse-LZQ!eqQzU^eMxf+*S|y}a}~ z0d`muMKhZ5*#4+O|NZ%JUIwAHN%OFtXn!e&lnM5JKTT()?@V87uP8ca8}a?P23CwN z`I!4`R0l17uQXIK&F}p=+aEhi@z#sXOX8c}JhAS+GL{(mwoTY56SCxMH&3M7qs3P#TsZ`M&GhZrGqfQ%;V zdk|fi>{Er7abDMT?KHfkv49>(_0Y2Q8Ci%Eb!nLWjM(icTmz+$&Y>~U@N~C~0M&WI z36}h>6O{gXxUTb)kTt8qy92F3%O;(c{C0nE5E+0?J#6$xb)HG%li7li$A9QQl?AkX zmXG>}B6oW9q~WG??CKOXt<$JxPUKZ$e)x1Apk0r4{cS;?Brp zO2AGXymLeOswi* zdR2ty0H~*V8)G_uc0?j~hZC?;qVx{{YB1Bc{%Al|KLg002ovPDHLkV1nXpQ8EAk diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_6.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_6.png index 497136000858840374438aa4481a4f3fd1a9a368..1c6402ceccb10802d72a865fa504a5a0150029ae 100644 GIT binary patch delta 763 zcmV1x4T%t%p0;H>OBtpC=QY1~dlF|h=xD1lTeMXUDgoIrNP<(p? zWJiR%O$_+Vt#>HShWr4gntA5cNb}CX{}s|PYdld0<-QdUM}N5z5pP10j#?;?WRut9 z&Z8t8DS*`oAPy=cAP`rOdNk!9D>jy{HIT14mk|P?lxGiZrE`#WuZ;koh1ILp-x9aS z3|hwCbi*5L5Qfs6GjyX4Mgn|O*p=fnlaiWV1SnC&|j0kwQ(_{rq! zrHSRsbMt0~aJ@R~-S+*AG>uzUnKa555$=Opk>buDlRQ*@? zZ-pxx-dDW}bx{_In?(?wuYJ5;^jJ5Q$QHIDNn0#8hwOq`@x>pFm)f(_g*r2HcWQ-g*_BIag>gTk)n2=3QaNn?81^^-q4+fQEE_A{90)*} zqGM)e_R#<;Amx!VL`(nOauzIBg&Y!q z=>$?eu-lf9f+Lrjb+jpsK}?207{4VRu)J5ZJ9L(tO|~0|0)qtQFIWOhDRUprFoYK) z50vKz<1rGif%3LPdCWG9H+Mi<=1?w?gp}sr#}e`k<#UU`k8c5s-V(~TivzrkRgCE2 t0H4Jjd~j_F^-~A39gO_4U3-w6(fTxJm1X`6XUVhJQb+~oE=j$<5e{963EdjW6Ui?;#% za=Z=Tm*a8w0(LOQXZmuU=hOEpNV?~Fmh-q1FXsUeC5|zUF@MIBGUWFPXv&|we+pm& z*x9rc-`mXx|#0tP!N<98De|W09=; zzoRl>d1p^^Ms6ts7$374#YS##wS06lk!#fi-jV%lh=2G*Yh{(W8X4Lf$>t6Z&!Tq} zx6_-~_-abHsz=YtX7^sgs*Ef{+u6Gt0<7`}t!2^0Wfgg62tcsAFU{!Dgc{}JCV@!u z63u5zEC$&Ua)$>yH=BqeNheaZX!O@HZB;u81b;^6tsdYw-iE-SBhE*l?*bUt{#HH*P4V5bYrhP-BNzA%STCB^vi9o3(*921 zTlt?r8bntcLCOHo^6swFU%|6O302+JO0;_bwyl}DZDe^Ozh^t6S+K41Dx?hnT`Y1M zGl}Io*BX~;ELramw15PB!_(u0DpO2aZgco7g2E)oW-MB5Z*ZLE z)Q=AXV3Qtcu~AN-U1C_4zay}!WHW2Xa*VYv%M+q}S1{g8j(@C+L1B%Llw#d;w!I<4{l-w4_Ps$9$By=PjeU@bliHjH?udj0H;xf&04lNQ(- z*0S)O%o^oiJ#Ipd_4df_wJQgBDg!gg&N>e<0?XQwWYYSL1sm?Pd7g)2*2f+&W}YT% zIq#7@ajampg~@qx(H5OdUjQvty=R%yRevf$+gp_UX4Yaolk?mVAhGM7y?N_%%?Ki+ zK-XA7>%JF$jfttB(h?E_>OJP{{LJ8gm5?;byoe)c)Sd!=C|#E3jrdOL=W z&UN1h7{mS>z6h%zkhralL*2UtL?G2X_ zlp4YTQ~@3lCPS8p;=MMWSz88-0)H4RaBl$u|g#}7_$ceooQL5yD?kfwl ztn@&=7S5K1jO)*!$^g6hSxK=4MlNjGCqezA$V@+=6BRBH#je42uQS^_2tz=%yMLn> zY*+|8f!R~fX8t?4;&fHSakRlSpYQNN*Q^@A8tc1pXBX@$R2n-2q^$j70Ds-FzFOhm z#dx%JzQQ3>UklF&HPf-HG=?ru(m@xc$@EANX!9R)LAyW_546jdMYXc3PbYIvBF9v( zXY&11seBaGA*Lh7X72_pT3;?7=*V+Ahfb{OZn?|;?HuxqW7U%C}Mzpp_1`EpEGCXaf9j#D22BR(TjRo&dfKk_=a%bu7ZG>QdB5FBJ*ru4d2V zjf}VUvf~BdH-b>NuZ_!83>^xwaHsOMIjll=ask%>w9}6)<}TNNH+FLfDPu;l*$(Sp XQXco+Y$c>T00000NkvXXu0mjfM{)#M diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_7.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_7.png index 03d67134aacbae8d562009acb4482172150a1019..37ea651abd782a61b7f62c86a427bd6bc12fec22 100644 GIT binary patch delta 727 zcmV;|0x13RB;y5;7=Hl(0002`twPcO00OE>L_t(|oSl{= z*~$Zay6dOgM;td|Pub1}$D}TUfaOELJ^vm4h2?4rF-F0{2LP1cW|TnOSn9o8>o@KB zU+G{_4=&shPh@#|kphDg$@b-%aJa*m6nu25b&!XuTq(;u^rD;ni6m*H(b){#U!7sy zm!wen_c(}Fq<=3YRecp7S51h{mhB1%v{??q0-{k7N|I{I4j5c4CIH;$ofR;q9uk0U z^eI5&k|&TpbHowKs@U;=POs{Dgv1PSr1+Uv{T}K zkZ{2XKkK!9_gM!Tzv2(iyf_}pE}Z@YLKV=i_0(v={C}&f^vg-yWq-r{TvY_u-_3!b z2G-j_W~Z;d2Tq?Gz@2GfU+OY!?56;n;e80dI&#W-FLh{qrZ@y1ULOi~?dv1pzjFaB zF5Eo^-o~@EaBCfamNxHwM#l#AE&#(~l<^@ySpp4!O_v&QU>QE`&$TF?q&AGLo5LKS zQ9SZ8PJfY4qNJSxo;8e+5ffHdA?lPrV%np~Ad4Z+S_d+7Bq@#vlJsA5Eb>g4^Jabp zZ8TFn5n)ge`X0;ECM5Pc{1OrQeQwulP+3ez4dR`(%qmv7YZ+;@MUtLR8znIU-a6S= zt=rOGa}A6|EJwtU6M*sbgZ+Y zv{c|!k_0OlyMF$|9{w&d27CF;QJzMA117ibwe-8BTKaRRtH;sLGdJeNKiL2P002ov JPDHLkV1nBBQf2@E literal 4722 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 LY)vbTPsRQpgF-@k diff --git a/assets/dolphin/external/L2_Wake_up_128x64/frame_8.png b/assets/dolphin/external/L2_Wake_up_128x64/frame_8.png index 9f523caceed6287320d581b76312d2036b6ad27e..5fdf6365dfd9759f95b169dc201b84d35ffd461d 100644 GIT binary patch delta 716 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 JNdM~1{{w%hGqC^w diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_0.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_0.png old mode 100755 new mode 100644 index 7d42cb57db999d20125d8ff2d5061a40c975d5a9..c727bd3f0431800881e6de35e22ab7dd0fa45fde GIT binary patch delta 580 zcmV-K0=xaA2+;(P7=Hl(0002`twPcO00J0EL_t(|oL!MUXj4%bhM#kCd()QKpP^8( zAYBx6i4Oe{igi#bRH|r|4%)Ox5$PZ*R8YBh_6G++9E4^NibbfKW8$U=#zC#%qF||@ zLrPmn(loC_o8;zv%Q-x}-}ip+ISfkDhn!S=7p_WTUXsd^@_!H80!ij%2cT~u#am*S zNcsNG`8FeIdr10qAQ;O?_C*@lz6?z#G8fX|o$>*D6f`>UYz8Pxl2)bl)48%FDuE=e zONHNal|b@L7QhFuuh(S3k^+c<-8W4NEJ=V;0W)!gBv{fRuyGp(o`>Dwsedof@*Zpl z39#mI2qb3VVt)Z2P%#TYJb$ex*toAqxbz+UJthyjhJnp1H>ZBmJdIhbSb!h7MCR%} zJ}1q%48Z2(_qk>Ovsfvl0KCjlby~Y5Y0ZyIDheqNK+B`vE$QEusp?uQqrDGUp7*N2 zgr$Dyd|BJe8(A5X^rQx2;lP5V)f(ua?VP0b8fZ4LLw}Nr^_EZOYao@QpE*4*?IeQ& z!15a~QAJ`wl8u0^*EE)SRa5i;pu>)W>w)A&!N*pp4^6|$q|>tJOweFUal%o=&O1XZ zOrgJc|M>`Oo!NUGL0BgWz)@kvUgbgFWAFJCQ z4*|R6>^%{?Y0i{FE zzzEbfQFq&Hn{oK(oFhd7ZXBLtc~R?FZFDr}1JH>VfUnKPF_aKmw$)JM@E*%`GxCj) zq4wfoGv#b=JdChJx??QIfE`@l*_z}qf(S$bcuwe3R+Y4^Gl7-} zsP|GI*0whVu-hI%gz~WT(aI5?TpPev1l>uX^gbdpZGYqvJ*r=v{EgaWIUZ2}S_7g) z0Slz9Tdutn5xM#5ae-7};CABmAPhS%8J}TM?LQ$DyhMwA2}J#Mj=o)cClZ zh>Hx^F{92e?QuU(D~#UshSKL|jS85`A#)v1Ga}YVn6B0tMkM4Zp=YO6}>T2iq z*xTE-o_}0SkHe#49sy23BLZzyh>m#@XdT+T(X6GTk->|e`414BB<^9uzwX&0KZs-XH7()+IoRSkU2m_Z(_z} z*i;pP6SP(PCOARN2*B`XtzgdTl_E$1EI`T)aGRN=02abk37#U@N&vl^Gdr+a1X~H0H-ZAtIzyEQFCuKrpn+fz?i8Mu1>wBZ1XfLPmg~cqN7@fWSy1us{^RE_>~#GFt@4 zMSv3pt9>MGgyRHoBGRMi)Uyj(VLYk=aE-j`S+~>S5Brp@Z*ieyRgp2@hT0)PwY*{^G zo&wkut6U&Y12^U47rqacfs6nXnOzmNj)=8U;A^<|g|tFmr1g5XE!1xfdm}+cfX(3! zid@bDk{IBGu>7qd1+Y2X4^FkD01jd#2S@=NL`Hyr47W2_Lq&!Zz+tqUPksIkQWHk1 Up|t1M7XSbN07*qoM6N<$f&pgZ3jhEB diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_1.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_1.png old mode 100755 new mode 100644 index 25b4609c37949e1dac85ed4d8246a39d4329b66c..38e775d813fb3121f046e1ca9811ada1f3713ab8 GIT binary patch delta 611 zcmV-p0-XKY2=D}u7=Hl(0002`twPcO00K8jL_t(|oL!MmNK{c2#(($DYer@KM+r)y zxv6kvEp!YdTNDb0MNQ$NG>K@@ssdXW@2x9q5lD-`Sp<>=wre@MD_Tqo%b<-#qF{>& z4Q6zFUyGS}zL~qZ_x$eneVoIgPm(@mr2LY%E{R!5DoDycX@77fnR88mzIo*DivdC> z8ZF)*(vtT2rJu*#k+fuArGUNbaNunEN(!9wQNW%84JT%90|iOay0kTvDM-S1C232_ z{hst)$uWxnQE+-X%_3OF0U}@zPcROaZh)N}X7nW8U`ctv_5(<~^jg7DZyQki5o{B2 zux8o=;&Jh z(ruD50RP6mPu2jKc|SJ};H3M@X^oPkztNbaypXa0)IROpmHzCSvaZe_?tIM3tWyTY z+v$bo*Fj&-;M$0!=K(nACFUfp2cV|8;gY1S0K}d}x_>0)L#s1iU8!LAfu@gw4FOi( zg9+8d=Ol#{yYGT$u9*5pQrNf#MF2V=KU$@TT$Us62Feuq}XlXBlwke!nuo);ahXC9{0Gj&*prrzhs{pODf<`Hj)Q<@y$u9wC zK}00^UR()8M+8QaO2jURq9<1x=9-{G(rU?Kjtg*0|6O2S2r&B!-pT=mX5PTUiE@>I xo{HgP9?9aO&IB1lm79ZP<>sIzTLpGD{saGK5rl3x^l$(G002ovPDHLkV1hgrA@cwL delta 1105 zcmV-X1g`t=1lkCY7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000CGNkl?6Mgf6h5tB;dvoIhGf-kM%}pb3Oo_cmc%P+#Ev*L9(rf8b|b4j+2pZ zh75I-2%9NqbAMaGm5e`X{#gM;8nKc{5#WBfRg2qX5`idyC?i%AErJFY6|gOtMDWrY z+^M8#MA(cSLOGw>(_34sZQf&11rTAxO0*TTatzqP{mQl^hZ#hm3LtVqud=J8mCght z5m4W?K33Z<3gB+<2r`t1tq&57*UIsz0+f=W2!V|3U~>vi6BP%l=7CpnYL|j@1J`G&PacyuZ*gJvCnLKQj@)Vo| zH!1=UNKVsMci%>;EF$6T1tr zN&p{xgh?gjOV6;pfQshLCMW^8A!XlLL{I_n zO#~%?4QROmZsSRM0dViKpFkfCc8MUp0G`fn5!6}0W~BE7{qJ6s01~iM1SNnZ%!pux zFn>w_i5L;Vs%vxs(S@h1tcY^Iw%1oMiapbN&pwJti&r0 z^AHsgpZn7gAN=B7n@v*td#=stRUB@FR7y z8;=(sPod4r)j7J917r{hz;{N1RaeX}CxKZ+(DMy~Sd|N~TY%K*F22FBR`3bo>^89N zJ%Gd=9nFPg?>+(OBVu#;4UX>tN*MlJ%>{rNslWdN XDg^t8<#f--00000NkvXXu0mjfBkb=m diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_10.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_10.png old mode 100755 new mode 100644 index 575df3b9f5bd672203836637106fa68fba69af7a..81be06a77fdc317961ac7e2e21cf55bf50159b74 GIT binary patch delta 757 zcmV>QhsiE_`5kZu$vJw(eP*TwDT**8^YKx0h zkhb7vDoTcKI_((qW_)?a#ov_vn;#D6-gECghuxBNenlGn0_;i9i>-yDKrTsI zm4?r+p z)z!D8vqw9tl7H#xX(G0q1FKO1bDw!DQ8@;)86_~z?v-=yNcs8;-|^o`%q3?47)`bg z`Sl-(VTmFCQ-hfl+*t6L>VE`WJz+Qxr@;BgpMiV6HgM1? z7^SZ-K>dBA3^eXVt(gPB0b>$inyvogGEjl4q(PhV_GpKsk@d1*n3jvv9wJC2^-_Sj zMX4~Ffcr%mTsi}eXkF54;X&$v1|}*IRuOj0%=u}dL%$JBf(SvoCo)92n%sC)qB5pbhuUV_)4K@0Bt3WiSwEz?GjN(q@w;)E8x883r+zVJ*e#0q8*v z>n~&N0HoU}z?Lw7Q=ox^yuEoEs=rZ$**ifcOKxx;_wcPF_j3S_L0X-XBp(q0r)6n2 z0OS>jfF+W0N+iH}fmPLu`fME}zcz)!=8#air=sNYtj>BPCw89L+DgXL?4;QExt(YKj_7gnGN zo2@f;|D16&Pr!|%ax5=uAM2Ig&G-Ox-~~{tb2AJ@1WC6Z)Htfgay<-v zcZg8EsL+`*Hh;Gjj70oZ^Uo5XQi)7dk^sx$RxNI`6A45DR4I`yx0(bEoL9iQ>_mc> z)*vgT!NHBzmddlOs7S-GK`7%>dwOeY)ou1zR03ou;W6lF%A>8A%!$MX?sc~WhdYo! zCBW!}VuN}H?j^&jlvX+ukVrs%*JNbtE)rnHgtq=7o_}D6^sv{TdN$fOKrRW~L7?`X zdcV55Macq~6G(A^9wir#IjUFYcvJ#d6wnyS5nxwnrCYAO<`KEAVsx7uSzu|0L0ZM@ zAHf?FKm!-?TMXac7%7jO*amfy)^0>s^HlU zLTMltHbMYNJU98)y*RQuwbd_q1S|Pw)j+iDfPZRtuXJJBBt%?&*2GG(twH5zisk|C zx7R_EKa>XIG-n2Ia99b;_ zFVm7)R6+{K-30IsW`?WN^vVEb*hu?bNYLx`p({8D5K+8>09h$n28k>lfofX?OafO7 z5PyxTPk}^M{JRw4Q&|KK{ASlOIN-(dkp@~7T4~go9su`8$@R#RqVHMRfE8~7Kp+TQ zy@&NUp(4lC6IRCt*LB$mfZf>&Sj(}a`prtyaQ|D702l&PSFx<%TyfT(YArF3_P+}W zj@kk+EG613c+)~pUn@y)mq_^nSPp)y#DD0GER~TfNRWObs0zCTea%=AeWc1^|9mEn zCBQD*&?r`u;OH2D!Y-bHf@D;#Xf!(}2%QD&3Qsz?BT>90$cPiBp9NH6w34|4DXb*O zsw9#(f~1MqnFOOpz*&8b!b5`odjxL+oNx}HVa8d&Dk4H`-5P}ShCLUiSimX@own~`nc_3g&DV#Yj7 zJHlmd7e{dHg^(!vdIwIQGH(}GY&qO@G7o-Y3&7AODeEw3c4oj;2tD@vDGy-1yLVC{ z2_G1>KU;BoUy=f)T|LPPgI3f9dZS0Tfp;a)BQ)}C1){fg`}a>lGzNH$Tz_XCJ&2fz z%-ccL??>fDwt@7&7*Z8EQ*tscOi+^<)v*Gj+rYGl8s{Qn-V35qC4Dluulmio;q`_33sR0pak zMBNqWarX~fXR}L~JDk^N86Jq5%>6 zr`CF)co_<_!tmfLX);i$#z7q$EH1%Na)-1q>!Ir|o zK3-)^mkhw~{qK950LlhI*fA#k7&DW)skN;g=XrP2 zodm`oT?x}~HGH|7ziyXwxdCSQ+1rwa8lY)GYKNq91Aio6I*TP$W3MxBJSnn&fiBGl z8w0$12qsq3a$8bdF?OGS!`zuvWa?9wG#0DpBc22#eJ~|};@9?$$93c7X jrOel;tO0Od!RYWGiU2Y7LmVm^00000NkvXXu0mjfdjC_| delta 1293 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 Y19D1T!`1j=PXGV_07*qoM6N<$g6Y?s2LJ#7 delta 1661 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 N002ovPDHLkV1h8%)|>zU delta 1926 zcmV;12YL9l2Z;}m7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000L&Nkl zx7+R4ly7CSvPbW~u_k+8!6MdeBvU{Yit?w>>@cg!&w6Mz{Cn%DA-U_R?(b~|prBjv zXx<8UP!zX2&(4||US^+LDS+i6`&2PQzy0ZyF*BwTdUxf_hIb|Wk1?R~OB}#@6B5)C zB)dWMde{A3G-w4X~UwG14MZzYFFR8Fb|{}{-gYw$-j0?^*x$TU0aR- z$n%+}N7m}Scj3CO=T9Y-DBd^G83F9t=zW!u^+)?bePshs1++#{32oiT&U+%2GV z{|pC^Q$RMXSCriq0qoqBdDXDLgX-C-{k{F9I6$Y8J%5}qfD@eJ1Wqd79W#m%z!Ru~ z4n-juzR3U-sAs(P^CIqj5~V2wBM=H9I+eo}ATs$W%4g)w{?2#?;#HY`Z2mF+kw81Z zDijUuRC-4)weQtAnNeq-Ru)9wB1iJ(jGk(0ex?AXNEAL8DaxXYL{&*2N@E>3Rnc_L zJLh^-ynp2+gU_ySjUbZ4^TG1|(& zt1qLA2!u>H_U87OZWok&o#H~>^FEz^jBz10jDLs~BY%vAqten-PV|kTqWsEQ-{##4 z9`^7i5FcP3A3;61ETczbI?B=iQPB*~2mn74@3kI|jL7rGtdcD{>i6pSPq|&}!tJ`Q z%Tp8siv&C5Pry29q4jOQYD)WrZx3&fw^{4)h(nx!cMqXJy*11z`kV1k$e9JZ zNq;*T9;+-LdAyhN|5rsb+?Crugw^v=?(amUv|CB*YUI`+K2h24l<8qTnE~AtD&uy6 zDg)(aka_$kDtwIGA7FLj$3>9hX^i!+#ega)8w6qnLAUSW&57YcD>&s zh2H&xXS_#9phqaG%2k!IzO!*GzoU83SXHKXpgV-`Mu8U+nDuOydn4}Pff*jl&41B6 zQNIj!m^aJ$=o`|5qU3TF&{@*ikd2akgRRL90 znYWk!Y(Lb-3~6nv@|nuKiq}P{&GYgo0-&nQlV!y{b5IfN9RYhXZ;iZv_FGBZx^XqV zAS1HGaP7B~V-<30D5!A8kVWPC=G z;iiC{Dj=G7cWmX72N6P*EgnPb13bQyweh zgu+QO@b(QOz{!xqpjf|J(shPT=JCqh9zkYRP^Fqd6@&_!0@y^Sj3X2JJbxK1DeRPO z{=O1N)OVE=eM9#F2uc}PiQenjtunA13R#TCM~7+GQlJn;+ZP$LjbNv0dkNp39ljHZP8$JID)T}nk5{5r zh;R0+kX#RDF>DZeXF?){Dm5Of@EpAtlTdV0C^*8 zdzs7$>Fe(qKJc5!lxpt)BigGB*^1%iFNLB-J#x1$bfUIp>wlk!02TSFvM6VY#<2CO z4)ln^iuKa@JMv^@Gg(1*h~l^4WTc7C=suOHC?5%=D1VndN6Mey?ekMnHCl9zR)6ag z>DA)LzYew+7GA053ALhI8EB){2<&^tFg`t^tmnN(<@qze*><+~KND5V9xmRs82|tP M07*qoM6N<$f`u@`J^%m! diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_15.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_15.png old mode 100755 new mode 100644 index 7ec1216e30ab22210d5e3738aaa3da771d6738ef..173de44e87882832bbfe8c5df4ab7743de3e7220 GIT binary patch delta 945 zcmV;i15W&j54#7D7=Hl(0002`twPcO00V+aL_t(|oF&a$Y*Td{!13?@*VFY_E-gr9 zAeS>l(4jI#!bHu^2)vM(48uSS!KsnxgUKF9XpC%!#KeV|j6~usQ5&KGxrM-kBbzz!X9 zDM-FwYpQt-K)?4A6Y)s3q?*@2l555pk!5gwmNA_sE`QIy_4~IBKc-V1s;a6S`gLme zB>C|DdsgeObEDtHE&uuY?ex86D0T{Ltu#`7VNfd-7r=hQR`)C(6MJeRLPF z*9GZ~zJj*!hzF+d2}tga3)^eQ0QDXLYM0WO-4lyy!%WMc2lViMq;%z4HPu(k|4=H3 ze|$gc{eQyXFy*eZAjN;d^d7rYh1eS&NI7!2wz4DRN4{Y@i^_Zf{MvuF$tst(ztbc2ISeKG!vaQFmfced#%imXL^N%?r zV!^l-z`Vz8%8UrWs8z>QKK1}4KLE?a=`ekoi!cu_8Z%HzO3%{+$t4v2638>?e9a);-3lM*Ot!z_dARDhzHi&!Q zfq&*I%?b0)Y#Tx_ug|N_)jndGs;y^cf@xZlOhxL)28s#Df;>FFIv#1=T!5eIfb4#7 z?Y>ZzodCqJCT=e5+@o5g8Bz-nRyJkL6R?2MA~WV7*0R9t=r$&<{SNvilI|@xIIa30 z{h>GRV6JDk-fH@Kt=F)KWW*ju&h(tmB`S|L9b--|G(^gS!ET{4GluMY*(c`b|i$vt?`*Nw=u>w61c8w+-^5|&z`N% zuj_Tm%JZz=nYnDA(N&dq8j+pm{a;q_FB(4!@9?a#72~UGc7NVmtY^8}BJBWHsPZgp z{M+sJG2>gEtnShMC)Q;5D_F+5jbsU^LNWeSnjL1<_}K`prhji8H6?dl)&0HA0Tgr_ z9?7k62gPu^a(33t@G^VdDgmqx*{h0~`t7Gv$IP5c>fO~do8Fc5KgNK@FL3}HO-NBo zkn9H0^&L>1DSw-4?X{{~Ce4rGmkox($DrlXelG?hFm3t!HM>=$- z{|pC^OF%ZQSB%}20j%tbTs7_Qpn7)dcyB)`4$x_24}T{d-~^{Qfs@8}=ZsKU)&yo~!diPBVp5eS74ovPsq5SjcI<1_MRe`Y)b@v6)?CVz~7NuZrz z4T>gq8oi^I+WV?Z=G57%)di8aD3Cmv(N!(Yj}pKPiP8rnMOk!_s4D40Wvm0II+{+o zQ`Wr_Eq^B&e0F{71d$$IM1C_)>G<>>U_Cr`kgTqZ5vQzOFpk1>V|v-T+j+3R;7lw2 zSZ!dDq0~4ut_s!YsP9Gk{US~}>3u#}uU(6bQ6pqgCt}x##%B1<4t~+m?)HIYjJ7lI z`pf7=1VSbqd$K*I+XZD`r?^nJ+(*!lF)qZ05r45_RZE%p}XfvodYf>goNiy+k#z1FeQ87k>sP4!iv{Y8Oeb*Qw{tn=E@WeoBr z5KTl2pRE1agJP{^wcTWgyW0g+A{b@g4u4(7SpF>_n&@3urMi$Ie9RHEMA6ENo@L=h zEUWQs-7XIE$N-r%^lsMg>4zL~)fJ6L^VxkjSn$~OPmw;0rxH+Uug2*46)YGata~zps(2xR*~pH(n15Y8 zFvnxHIg%5N%OGOjjJzUP-6{@>N@Ys-Ygx6D);lspc7DVUyxO|Ldlngu$xt(yHsXO@hjIT@$Qloc-nWOxYTI2|=Tn*shh>k!%)y0VBthhp!q>%af? zyULr6p_CWoM61kI-a4mp4)!@(bANs+#^1Hy%kKlIW#9z!&(59mS>093LbONZZ0dNV zvxjUa=5-Vb+!C-OIFh?Nx7x1SXPtYq24Nh!QMxBW4*mp4cL+Hk=|QvU^iG7keT0cP!o(?&hPBHs3YmtsT=fn z0ucc`SsGT^6@s_UJ6XOw-A*}yD#O}LIgdN@@^|xqof?PaOzgCrnRzQWIOzoQXS8-D zSfAblcoW{?5S4>E?W`G{ynlBFl?>;tgLJE$1of(O9HQlnK~8?|C;e=XlRVBr`sHmaS1cU4WHib+dCKARTrMh=`!-glapR&YolN zzZ4pIIy1hfY?PjMjqi=kz+?QZ#APyRRj){1Rwi`-ulBP@W!Yj?QmIjDCa99e9Ya++ zoM?><(d#TDk^?9$&wn}&IRcV_oWN_ho)m9-XOJler<~vuc(3cJ@JXB^m{l;Mz3Py4x|jbRju!RE-MY|;mm6&T6Mq??qF+@P{LH1EjkQan>1;K8;Q6~*-udrL0aPc*O03~=s~athI^3nrxf*ULJ}2$hY+s(lPFYBY(J%f zBI*=p(u3V8n)}yw=N;Z}{_cLC9{BM6?DgOc@ef)G@6#ilIe#0Z-C$y?M%KrB{&4C= zfr_Ah_m4h=2eVYxyqvax!p9}zayF23e>h+PS9{*1+gsyb|K|%j3})#pP)hd&*W<&y zYZ3cIZn~5j{kz*|&ubc@TbommHGO^3Zrhf{vU{ID%tmapf45XNL=r+})!B>SL_Wn% z@7pzN@$@U1wSN~aud&%HEIkuR!`6N+5(A*~^k~}R-V8-j(*WuIre~~MM>>I()4-O4 zm%*C2^bH=He@*1V$c@3L_R%}k8)Amc3Jp{jv>|Tnn9$Ud$N`i<=KYfnt)*QabpSY^ zV-5uwKdLp=aScF!a%1z+P<26dTmwn0n`25k;C8byn}1AHUVZ1<_vByF#a>laRnGjm zc=#dXjgKC;T7O@i{yJ)T8~t*M^!=a8X6eRb+fq~jNAha_s)Fx7x!}H5)d7}3x9njGe$il73 zYH~QJ{D1OoLA>)PQ1>@R^6=fkt*9=$bZ>P*y0E@PwFU;--d@+z;mq)2bgMA z7ZD5QtN`E<3IZ@~`NZ5N1=@Ho1*^inKzECVH;|3M6h4p#lSMA1AZ|(kpP>%qGIhGt z0Zf-Rs;+pM1XDPJU?9Y^?7IOzjssQ^u*KU_E5#|syyWA7#ChUmYn9eTr(E`tx{G=H z*?($_4g(QaedA%8)+LgmdPI(S5OI;`=hj9;^?`0!g0QnI`k@kgOsy8N=I<}tbVRiX z#QthS=xQ1=tDy~8+_4m~Is$W`-I#p-@0000yGm}2z08v|10PGIj$(nz<_bmej}~2No_;SZSY=>F~&6#xUOp)#{uurGx_|w z{)((T&+46-i{3N3vg_?eWT$!m$}aqi#?QjrJZ)^o_^iy%dw&hNm(mt#2hfW$&$7lp zj^i=oYn`<2(ft!L(Y*x9SjR|~fGQZ{Po>djR*j#H&}#bk&m|0Z4SVo+wj)9 z74EeMkar;>VC^~|PsCjE~wOyie0fQ}|hQB9Ea z3tHDZz&cYl)qm=1Rkuu?|?HtnyVx_9h&?|o7npwq}6c7Hg)4o)2b3M6mM=*pJncL_j-w9*G6MOk!_s4D5R%2)?>bu^vp z&b7`;w14bm@LBoV2_ikbi2P>k((&UQKyDt|NK{wGh*Q=o5Jy3}A-#0n?cCU3a3+Zt zstqVIm>Oq|tAaJU)%RNZ{UUZc={XVY_Z{?OjLTxf7Jsoq&WNRpWc*%o=CO*W;=sZDr59TWE?rKBoN1tww4Ld(%JQv<_iFy#tsL9==<|>+Jzvb}p9LBDR_*UZrL~i!RXVwL zh^GkOYP;IC&!>)L1nZ=*QxOEKGhm1kiui9~_^5PRK+e)}=J9b5#4LzdzntHNO1fuL zeHGUGMS-J%vJXp8t+g$OVstT20WmrIpPB)oiP#A!D(6KW%L5{g@Uo!iqzjo}iUTXVbR4NApm9x7M-dvVS`5 z1XI_exjQoM9}<|2Y*c$A?%)BvFsjYbI?=ccvR#1ILqih3d5^|;9S)<5srw~Xt)%si z43V85@dIl!Sz;GOTcr!gu=A*cLF+M@5Ox7oRGIh6=E`WP7?9B?yDlq>DMySWvoe^^ z+#d#I!K8jKTD>un0n6v83qWAIfPWQ3Be^W+nLy>hTCc3vP`?krmVq72KRb8MkDNxz zVU68|Yze4>2?R3(WESnhY9x(OJLIuy>Q3X&^*txZWG_~RERzvl6$9^z8odG6b$xtE zF!JYyNWGQ>RY>! zIVWJ-oo_I_g$}3e;toq~U^irYSDoLnDV1_#&0jen+5w9c!#2=LSvwhXg$$uHh>qyW zBEvJfoYXoD%eJwnm3HrFkC1Y!oAXrKe?o3Y2l3KgG+{;8?w8EUSWVS;K$6<-l;06F zW(Hspk+JMrch|(-*cmkJUVlY8P)EV&%%ACNS!B8ZRu4Hw%DDsIV0<|i=~Dg=A>JI_ zhqGA8M2tRnfjx%36KIdl$U~w|zmD>f5UN#j$8Hh0L*%Ap*< zIwh3%mT<2ecut_7d+EKamj25qae$2REdh~($hp-_u;b9^Tb#iocU~7#DLLU!10w@! z=q#X(n?1quuHAUDW`9dmI7PL@{K)|9sUOSmJ?_9{fhX}4!9+krTk4QKr}*>d;g(R3 z+(|*%<4Fcc{*DY#(XXltv!~V^B(EAkXOvcSl+N$1NM>FptLO?*{1xoXG|?WtrZE}g zTM9A8Uu}URt002ovPDHLkV1jrPpO^pu diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_17.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_17.png old mode 100755 new mode 100644 index f50cd0b88d3425d41723b1193a28d6b294081881..9857478f8837f1c05cda362c9ab52a2bb8a79b5e GIT binary patch delta 920 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 Hu0mjfwgRGJ diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_18.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_18.png old mode 100755 new mode 100644 index b5a85de1df6730ba2978509bd7b4f7445632de5d..233f6aed6401118c91495c7bc30e4e2204b1a286 GIT binary patch delta 870 zcmV-s1DX7@4e*hoA-{3WO8=*$K`y^fdjFRn}15D=+#}tH0XAPigupg z8|(eetlApN8gYAmav?a8qrB^tlmV2^ImGmsr&HNr&;V}rzD`@&U8LAbvm2{|<|pxe`F!(jWP&mZSPY4z3-U4A_j*OWWQ z#=#7IMmlxu@PC5AGq1Mo9yct1zg23y6iPvVR&1gGbX^=x89bWDCOHR?%0`|w?w{@g zcFX|>PTTyMEc$^@t()heFIviQ0X{ZJF>jTZqN&`a(GlV<0z zMHK*!%Y;cuPo9yA$fS56KNq4);Xq_rWKujG-?PZ9?tg#>4NC1(Vg1^BfBeAIOR}C3 z5fS0i@9QTYGwFY_@fPFWt+{W*hSle;BsY|a&~=DOxtbXEy~=V)-<&@Lu4;)+ZG6zV zpa?I@3m>o<t1;tep1}j&nRpo9Hb#m$X%4QE_bOgP8e`c+wSXW1o!mpgK zDfYjh@_$!W*J@3jAk9p7KG;$+X2@T@Xbo&BH#wWV-F<4Nrsy`jYu``z;b%4!{#FU^ zOXs_pk7{$gqf$q^Cf=CZ+9jbD#;4y*26eSS3aqon!3{QoHZ?TN$S45$C$=_#=bC*J zpl*b;)&?vZ9uTDhXn;Ax1=jHaJ$Vi~{h9%~4}X}&h5F6lS`uQ)fwBWOb=p)_nxP&^ zCfps?f7)t`GmE(jtTb&iMW?lgi^ZEgdrGK{XJ1t@ZBwEmP zM_-22%g_SwbR*j6@YM0FQei28e1%Ttohmm(o^Zx5ET&NphK|lhzS&!-8U%VaHiiB% wce@xL6HmmGvXLP*XdNul-(3;$#4VTp2cW)dG{Js*f&c&j07*qoM6N<$f_2iRkpKVy delta 1711 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 M07*qoM6N<$f`h@c00000 diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_2.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_2.png old mode 100755 new mode 100644 index ca4bf322ba1a693b44b6ddf283a5576467b04d05..61880587fad41fff9c136aac2f254cf1b907e82a GIT binary patch delta 791 zcmV+y1L*v?459{*7=Hl(0002`twPcO00QYrL_t(|oK2EJXk29ggunmamwk!ZZFg@~ zgPVeQDw0%a(_&~8Emg!8+SL>ySv?dfy=kb2%KK4oT5=FXp_)YmwJq3_f`@&(H%q~K z(6my}jU*<}#@(=~*_XHZ$3xoUT!w*}%g1m)lCEBtl7?HB#DAP5^(3`F+!0AK&ldpA zJCe7=1piYuyX`;3lD5XBg(sq;v1Bh)fvwk|@0s{S6@tTA!0rXTH1^3UpeIRMmO3w7 z?@7W(lGKs9i)Vc#1*Q&=g<#)qQwK{0AOrT%H>iMR1Yom^IXTJ*SgH#jtyi1C5_YrVf)RYX#HIQVd@=_t-hn%2LQAx9(&F9T~1NZiBcfOuIFr8>aKj0oa2N#FsB2V}1@ z2*AKB5T1hZ*hf+Yb^!Tl*&3z}k3pvi8^^GA7=H)m3Yr32#To~YoPlf5tAOSdtJ@C2 z)XBUm%dywKtnr#C6 zfD%LGxHl=wx)vQa=>w)<9h#vtK2j4*6UrjfXu?hpguv;R-P->}g*D3rqrm3Mf6sz~ VB@pOGhe-ec002ovPDHLkV1f>6e3t+K delta 1587 zcmV-32F&@Q2Dl867=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000H*Nklg0J zqkO#95psurA>bE&SgzgU`cJ_ZXSLKNanE*R@Fcm>6+F|^L+M)vA+4$H1CLpOn=&v6 zN(`O=%oBIoR`X2VzoZk-WN zgbX!`4xTw>OMjstlks=SUo?PDCMwZs1eA_+YU!Ahj6gMjE+(qcZ3F|7SD?I{WCXW0 z;FC(4fexOjLOA7fF@22n^0s;}rU7&?Q3>nBRPKQ)7@urUa(IFfmpeG@j<-5vbWRp4 z6Df^fsbtLZRku~(xA52qH+>8t)9Z2^I8m_-%W5U!d(F;#9XqBEb{6@!O zdK4CapMcj_!a9}zBJNPKwEjvVdyK#`j!!{J5?E~jo^nYVljX}3OJ_Yp7b0ciR2hf~ zai_&QmxGqQYD(8K?Fg*XuXzNoXRK`GNb6etnSa+fNO%BA=+@>e*YC{@B26VPv`~jX z*XGbMoad@Gg4q(Wv<#%#GABUFARX&1VY~v&2-%ZKV}9`~u9{{`v?#Ayo+8P&)B|wP znBqK$=X7&cuB{&xxTZAgbmK8vWzh*WRKlbI%qCcp`{M+z#V<*qlH0T3QLHte8-I!s zV1K?a{qjy=2K4k&!BZE@39_mp(ZZNC9}Ae<3+IwM!Fj}^3_ueKCtPXVioV34t-T*> za8(2~f>pVI1!@FSA)rFQnp@=Jr#IiIC$>(C0R5eNZ$0A+4;5HbMH_3x@&gkj1~8c7 zp5xCujo>F50Dx@-6>$H92`!-N zA!z^r{;zYb!f6VQz~e2Y>>f zOU%^zv*4OUGZ6nxT-SZ{3P?9+k^7De&6RYDX@T?(}cdwF3S+o%|iOYF)h;h%mU>Tyfq0$8!8Y+!|tJ0Qv0F4O@O))cMRvTP*l32|HJ(x3LJ7oZG zi!E|z3NZkc!gx(gIyo|~A6)Iw9cAZn`X2QT7aY>e^h|HgDm{f%+tIb;py4O{7 zXTrd@B+xstss(B(vAPk}9X7gJ#TgGEh5!%qJ9^<6kJW|l5aVqMaV$pR`a%drr2eN2 lo`{M{U}u8r=?6$g@dup<55*m+5hwrv002ovPDHLkV1f(t@2~&> diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_20.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_20.png old mode 100755 new mode 100644 index fe95a716c1563deb66426c14b04283fbf5646ed7..e9fd6041f22446e3ae29db03ffa30f7c6c06a5a5 GIT binary patch delta 1082 zcmV-A1jYN$62l0P7=Hl(0002`twPcO00at2L_t(|oCU!ROq6vT2k`InzXv!F;pAp$ zP*8*-8X_K(P30ab*rP@r#UbjNTJB_J#478Q5fGTC#Uj_1%{Gt41nwXSBQG1=gEXNu zc~M>x*`4!+k^x8Za(CYI{Q7*L6$VmAf0|rX6M70YmFYTu;eUXuXuKg=jM$v_+t>9I zX$q`N_Q{ENaT893+FN zJy$HOZOV0W$$Ad^t=md9CG5d7vwd5*0@a(BT%p0*7u!OPTDH7U!mVqCa$Pr2dQiB3 zeZ%o%32epf+Od|gM)9SAybfJpZ5h|(>)A$}uc~6U2!C`KsVw-6IZ$iFgF7@{;!FFGGRaDOU$i51j81uyO?gpgPU0g}2dPl5F`;jnz;v#0-tYaA4G2$72DUJDN2z z8&GSo{9PFcM}T>`ADvs{PZ%M)?q5w^~*kVIQKGs2i0LVZ*_i;vt zcJ`wfrkYd3tDXr*Y5uq~Wa19qUnH8LapL#iaI;@gADRaMSO98#oi4A6-vu*KAN3Ji z>6auXpD&bp1VAnUO!vy;<~70yQ8)Ep2Pldh)Gs Aa{vGU literal 2383 zcmV-V39$BwP)I1G%W9#DXVygC4&Xm3+ zABiu_2Nl<|Ds+j%WGiPAecifs?E=BXC?9Z-TI1qDn<^&Mo!nOqtzvf1F;_`FpQ!kX zVDT`pE@7;D-HB2OV}7w~<`Zj1)s%PaXE}1Hr5ZRn0IUh#8X!f1uIn5Gsr~6ECW0l5 zB|s%GDW3YQ_8B52`xw-#CUAK`9qYTRDMf&eLzysG>zcrEr%D?075!9e@Y=<^(~Jy} z5+q}J#F!EaRdmAQTWcf*unnmEDqJ#dot~KUJf)v3847w+KU_1`m@)nY8JT_-lWK-! zALdFnfP+e1|5LqA)Vg(_K|DKb0())fv?}=(I|ja%z$=W?#u22%z*#noGrt`khQ@Cs~h8p<;hl#S8%y*EwTp z$9GN8?N8vDB~Cq4aV1p9?6an3u}q5TY`DXS@h*LK22hDixGw2V_uZN< zF6RRx#3Y^_+Hv>Pcjo_B1MG6$WPkD;9ZdE!u48)CnvRBCKA2z5Zi-|{o)UjM|DS3z zOOoSH)Z?T(S?vAD&<+>zkY=6@6Y#&SJ zly*7)SUj!>6X_0&^R4Pg^Y8M4d44Ha>5L{$U~rBr723Guq$ihA zh)W9dS?yI)btQ#mdy;1D^4~S^i#a{z80G{9SM@rWcl@XB-;DrO@3i<6#8CNRdJ;tL z4k2sw7v5k2?;rs?g(#C^CvfKUr3k>9Ac631c9@Df!8>&9n*Q4ipaR?BZk9-<+XcTP zUGt;}P}g=volwJc51UJNnn2a-Sqryw;$0AokLu5|i9ae~>j&>ITQ1q`y58&J!DQmz zPl}omTs;yxKMwehLCkPcd^F~g+!cDQ#h*k}F?J9jnNys-J7_@JMBD0-EOF;4-S;KzK-9z~vq#m>ipC0(s|l-Qx<9g^yFv)yqV?|&kQ8S17?T=xkCP$z_)BFFiY#_Sro`s3F9 z^kHDA&endT09HJNe}@WpA^<{ecS7Be(;)yGsF?o5Uv+?xI*#MMLHTN)pRD-ZiC3_= zg8-9aGjaS@{jckl9_M3{XhsVOLfz2_tihbDwJ%qEHV7%l6WFQF-X(}YEQZcDi`h|} zl5S4w{J1J?9%8oMhQLYjmI4>h-JHkhhxx-OAbAT&cs!AgZ|h+~+jk4jCz!+a?1{-^ zik6c4iGtiVO{OZc8|bQ!YVuA`o}v;OG?<+P zJG&hMxJJ3V36}jkdB5sS*Vm??ZvlxScH-}P3t&#;HCv;GQ}=y|8robF><*Myi{JU= z&=hUcw*WNcIMTgEOkj##*L&UYrTk0Y0vv+4CSXZ-r~4Db@A9ANSIzK^2L9~pf7j0j z2sY5L;_uKxBF;WO@4oL&_&+Tw2KNSnQrBAqU>mDaHhKR>l3epm5a4eYS7i3)!wxOx z>FxIbbt5|+753a|s%!5G9>viQ2ClxVd(PHx$i%jybC#!8C*Rz9*pYkohar^Y7tD%q$P)q9Ir{GQbHAR5GS(4(r=Uu+ueiO)yCrwbVv3an7 zl|t%|3kZv=K3$@c?|+l*7GJHW2vC(M_)ch|D+CssHIUkOrAVq#-Jtk4$d%%|LxRZg z#2bt|6PiGW7)mHuayroQsbI0)y1!j&J`%+1X!08cIHQUNmLg@i+wW|%#+(*u%J;Qd z@bfps(Q7AchGGa#|3{HY(UO8p^|09i6ET&Yq0jmEQw>pLpA=vDs3`jBl>f$b@0cBelHz{%Cw;R^Kb3eG>f zk`CB!|6oMY1XT$uUfKj~&`FBMl7ssu#YdR@>7p;WLN&NIIZWqy`oA2y7Nt}Bjxdg| z*NNU~^Em249lzBKyE3JZ$9bM7OSmg)+5l{(m;~X(4Tp$2j>dKnXWF2NT;=`U{onp? z;i!luXXo^P;?-@@1{*LL9jO^6fqaGv>*tOkb4T#?ZkM`Vcc08EJMYi#t%K=Pvq_2o zbMjoP1uxNf!gg z`9%TA#vOyzsA`6v9-`R$@(%J`^?w(UlHY@*@(;3@XXB)9ug(Af002ovPDHLkV1m^y Bx1#_6 diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_21.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_21.png old mode 100755 new mode 100644 index 6a40d4148f0134314776a5f1ced7826695ac5bf3..db36ad5fa3884479519259d5807528c7b95c8ad8 GIT binary patch delta 1081 zcmV-91jhT{62b_O7=Hl(0002`twPcO00aq1L_t(|oCU!NOjBn72k`&<`nXSFWH@2e zNe~M%9!>g;bh1~LJ^wr9J zByh25?$^0?{*#HUKAAnDikyMNtTZ3jKedAzQhz$m%73mrTN69K<|9wP$mpO(8QZGZ z8o#=#`YJv?azGjN@CJ$u$3!3Dv(gEJd{Ew-8O}5Y?*u0tKGksLKOcvLNvc4GW1lS`SVMhl(22kleUIWTF6+4k4lNLZ}eS$zQ!(T(#@f`g+ z5`Xk$OSXeRjxmrwq9R!SHD17S)(rUqm zsEE?B2DD9<_aM+0z*(ZrK8Nu#S^X*i0G>p7M+rTq%N4M+0aReM60JL$BGb2K7$d~l zW@s;H^TtGNktsp9O3f?n%abew0h$4k zcK*Z0nZi?5C(_>50}w@zX;N$$(-lh@E`zhczGMD?aN696%T1_e>YIVrwreC)ftAk% zaMD92urD1IP%BbsO9C|(Q%dcvy#XXi$$#KxJ_08J5TjW}wsna>Bv^w6uxUI%hUMn! z1JNL6DX;-|uL3IF^Rs04 zjv&}Ln4R|np!#oFA%)TG1#C^H04%8-#H*H*a)2l-NkLPmXJIW5Ndds*x){OOeKOJs z9V$-I0Q8VGkBWc2e-ifUMKcHBQvqoj#)|&|qol~;`K@)>00000NkvXXu0mjf6G950 literal 2399 zcmV-l3840gP)U8KeNH?a zTbK>XuRAKt0*Ap?#ya|{dGkJV1OuaNz%^=4<`3?vd_vvMa|LMSb2g5#a`Jhj;vK={ zp<`9R7<#i4r2@w6V)x7@21W(S6YE)wGS*T6b`Ago!5aWv7N}5{QIJ~iUNI0XU@QPC zfKKw%HSW(C$yvv!UV$Ks1L~Ncvz$@}sA?z^Mr#!avf8PF#%x79)f~Lfd|m+~VskQ28!hvfA1`G0*czJ6SLk^}2RsV2nPa{|+-U{mdr?24@|{ zN&+CGN~NrWcsEGZiBYz&y|VF68AAKJdNWb;=5t2z>_EnK+5DSLj+-fmnZn)Ly>nu+ z;ARZaEkhZ=9Di6WD<);JQ+{L&%;fDg5S5^zD?w8MW3rQcXFpZW9K9KsS+aJMuhwN? zVRo{7&HFnVqmY9}tDq^PIss$*D>=acN>2w|%3suto~sOhw*C|YuzekW7#Nv< zl|L(GCwrzoGy8u7V71nD);r^9V6}di0dSuR+!zmLSGKRqWKNtMdn@~IwU`AdtDjM^ zLL9D9Nn_7DG|BX_`}o-jD$aN9$l}rUN3k%ow>lKh^Ze-n+*(%!4Grxeo~>iSJk0=V ztU3&tAIu*Xi%L(H2ltRqnLU+WwB0=ns}c{LTeB;BJ9@?tJwTj{&(UaR1T(gC z#r@SatCdk422kM3l7Mqj*jlG%cgha#)6p}=7 z6Y9i2(-UL)!UrsQ9jDc4+D*1YXPG_)O64EZKlfNkepe6kCj*NDfr`ruasw^@+>UkEU&OQnRDqk<8x{i|-{i=F|0dRyRCO*$}tulb} zr8_jB}(DJhn#$G?xJ~U!0_`fLk3z^lhaat8#Rs z5#3FhGg(Pt^YLp%vUPFHu^AH@pR*GhgNS=kIX{j_9M%;qQtP~w996Ve3%6UNl>p8iIVq6???H^e!;owBrAW6`FQ{zrW)c4f`r&AL|y1UP>+Si7Q5 zG_snSUp29;?0xI>GjYqY(*IThG6jyo-I{b-R1bilX7lkGOY}~{BM|X$1Vu6^-3p#Au6k$lF{mk9su`u?5|FBXWz`8tSmWn&scDd-wG+{oC@xoo1Jvk z7ci=v5>d^ZagrbXP@mC`suVDB!O~^JE@+%y1n0f|bucr)0YSWHwUyP!Ifg-Z8!e~S zWj#RD&HOnnon)>sMs*nCym|fcOQDMX9HsHJGQniK0cWh_UYT$6J_CXp|CX$lsp_z@ z`1~jVagf!~tW2O{#uAFgGab>ft~kkLx)BJSy?24L)1x@O0D|JKf?Fw7Ck#)aL)XmF z6ClWZtJXSTz_Ru!$&w%EsQ5B4(0?d$rPfx4XLOzQ4$<*dsgmOOqQHQ?%&sU~oaD#3 ztXyLruItMGfrt(W*olvyPsl0@WHunfIQm&Hb5hV2H~E-c#Q^d8RsyQppEZKaiAu8G z1E24TN?5evUuXiSEn|4!rJPdHKf9*?XHb>=tZ_Rjs+ru?7bPbBZvz2Ki!0qjI>s2+ z|LgMaSaljf1`>yU<7ad#TeBn8+rcOHbnNNw(~0rh_y7P@3YFrl;aGXKQD7(?GHajP z$SQE22E*1UkalcMN@qqHoq8hvH^9-z^s%hvxNUBj%iZhw^9A|AoX? zrM6r`|5mqMo&0P~_V)7)$v|0wT8+Q`LI}QsWP$3ua#UUFH$_pVyGFet zexfmS^sBcrHjdZp?G<3WmjU%EhLX`uX4K!3su$?^na$s^Pl;<=_Et2;$N{iwOhuL5 zSFukD3r-Z*wr_opptHXdX9@t^aHU7cPSwi$_$Q?T!5E+Yfz+z*iiw=K{s-Xk#uehx RG8_N^002ovPDHLkV1ghXm$m=^ diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_22.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_22.png old mode 100755 new mode 100644 index 67189811d89055dff6660f1f2c4286d65e890f68..72a78cde2d402c9388161e48d234844615cb216a GIT binary patch delta 1099 zcmV-R1ho6y64VHg7=Hl(0002`twPcO00bLJL_t(|oCU!POcQ4S2k`&*^$JCKR4UqK zu;Q$S6~+)tB*DnR7^_ZPs~oRQt&stnlaMV&v@%bD&1ZsB6BkXan^B~&pw7^2QHr3T zLoEu#fsUFfGghDsYTtMJ{h(k6(jH%SE*}hxT5gf{M$+vGDt2$b z=DgajGqp-vzOIXYLnP_k+tOgDzJaDbO#LA|o|#u=y?L-UOm|rItUuym>=QzJpS=@n zn`deeLs1>t$bZd*(=~ICQf-RL2H(E@UKv9q%Xb`sxWl9^ZI|Q){+UZ-Ct8GZQLj^+ zt!9%i6?76!Hi6NcW0Kd<7YWl3R+1vg#*VRwFva^86x(zuW--s<{L{~z z<)-b8&Z^HcGV$O2#;%`GF|4yPEXh z3o_=)+RFe=^{!R}3%Ou8E({KpAnfnSDRHWEW~gGAx!0WwV0ZK`xeL;`$``c4)dHaU zpaVvbll)D_US^#@=834doS@yF0&Q18Ohw z6PdR0*>IqIKKRM?kjtxRl@Je@AMOlcGJ*lVWXvTau-EkEPy~7)Lp0Sl55tPbyqo%U zUO*tlwk##$Yt9Mv~7F>=x*hKh+pw+-7i${D#LVLArDBO$m}E6v7zu$s)XC*nd)qa39K5D z(#=KR9)GSe*E$jcE|HBhVSKn+tn3t~dLN0RSL6z5<R ziI=j4=++lBx&1~eAb$Ka zy`m?H$i}N$$uDp4iP%cI%7l`a+#4dNEkwWR!WDnr>)0B9wmxJ7fx_&?hj#9T>n RW0C*>002ovPDHLkV1ibaAN&9S literal 2396 zcmV-i38VIjP)Us8+6VEd=o;ySl946lj`PSz3bj}QI|YD};3ENC6sWRJK@dCder87?ham?r z2RgxHpHV(SB6pn4~B8qziE$@b)HW%EojB1CeK z4EZtJUmoR?Kx>R8Qm#2EDExDjB2A*?tEZ5r1S8O9tm$ z_7zP41(l3hC*xfwRTaZ@L9*2IP8-Vlcljz}`|foF@u(opo1-vhFk-mcyH_ek zIaeV-w+*QTbL>IBtdJD>j@h9Q7}3XTU}lmPopBm-7^0QnJMvgNbNH%cM!{MQK0Bw9 z1?h?6bzh%R8J0O&Y34MhRL5aRKBFB7!1#2Mi`kp`E9$fzXMau#X8Rc#BLrZ*P6=}} zzDk1XyaUh3aqJnh%V~v3K1yn2ODC90hAPHv@6Aun0L+n2uX8d!J44Av=ba4C>uOJB zm(n34M8}?)wxibAJ<|U-0cLw$=e+YgE9jg@y$3_1r z$VsYyW0b-Z_+n)kbUD1UVAVJM9Bt=i&sU4Lf)x7RsNL+720N9T|; zyKSdJ0QRgZ24x4br&IAx9NZ#N==FvG%t1;ar`L7hj>+i4Wh8|FXw3~m4t9ku*_QZ; z)-%O`GJPF?#AhcGu6kWIh$+g>cQe0xUg=Zu&AL~6cao}b=EuCJ)BA6NGeF$T;LUZK z8+0X~eX3r`oXZe^C7*I$Md++btcsU|n3Z3$pUmt}hQ9bS(<>`v z$vVf+)#_)3g5;~V<0gUPbJL3{SP4a+xkqJ(A%|vC{g18hM1YJiv%yzL7Wt^6LN>bo zSA3!`UwHu;+<|XaO{>9n;7svTfn;r{nk^WqHX7~e_UvvED!<&%U-3pcuiLwkBblR+ za1Youx9!`>E zKWDzmo|Pm}d|u2cu27_O)yFF8LT;9!63s;bWJ~_+w6(n7K}4qwBfU^NX6@*eh0XMS zq_i9G*1&mcyLlA^@Up zi&2S|bx=_4RD6e661@FFNZ#00qDqP<$U&MIToh`BPSxoZvM+;C490MyjdYae_z=l$?8_X<#P_*dR3%{8gkt{VnRND!vNTjE)E`BcIAY zGp!TJLo*PPd9vUm#<905$2wDK%~qL?g)M)Hwm7YpK|fuKWBCxQ-(S8rtH{m60jg6SVKCZB#57J zuS2szKrJ96(rkgOoQ*tUGQb%i5^^YeMVuV~bC73;9j5<`E{>z!`JqCvcy4#~D_LU< z{uZF98XQ;O0+6ixn(blF(VA;xb;dzWr2A?W?@W|a1uZL&6t9xNp(v9DQ5meNcK1Aj z^qNV`Oe?7A?nQorZvk-=>t|@7nF;<)D{lo#Zk1fSsj_{gdKsETq;cAF)Kww?GA=8E zlHl8k%G?1gFpH-SnClz}^gUkz4BAC&~(Mx`jfJAkS;nfp1SY6eqn0lo!9 zVTyS)w1QSOWHM(|@>$SV5MU-*RCRXw&lFU55Py4qUDw3~I!;Fhqv~UdL}EkEuAynB z|1&+1y}O7Nqob3X1UJ3?QYaJXv)a`r`k)W^6&jFGDe zY!b{6Lab`m*-0}p)GUOak1_B+6xkWP6m|Jz`EHwV9P{LUMIGH8*w2(J+}R&V{sR#+ z!Rwrx3CwCTAaY^1qjQ`UIy$T-pPIoCeY5}vz8yu~;8&CSE)@6{rW*?hunb_otx3MI}5m|7WG2+&a87kf91v4)0|3i6rbt0Pf+z%(ixr@|C?4Sy5f%# zwtDMgdcHaacLURb=%<2?5+d(xG zWS%QjCDTmBSNo0&XdR7LZ9plDcy$c_231MW)om8`)%oe^-n>7?`18MqS4MXNSoJ7} z$G6CFW<@KyyUA8nvWoy8x{se0P#Lk}h~1U8o1DR^IzLNF-fEB?JN^TP4Vbp$QX}mE O00003aGA diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_23.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_23.png old mode 100755 new mode 100644 index b770f32088c543b70ba617ffa71b3a1bb7a7fb2b..2a042e23e9ec6d8bcb844378e6b0d03e138b564c GIT binary patch delta 1085 zcmV-D1j75?62=IS7=Hl(0002`twPcO00a$5L_t(|oCU!ROq68+2k`&%+zTEDcqfK~ z&4bGi0*=ZQlKH{iDY7>U2LYEKGw|ymNxIx<0@c09ny#ebqRpf&5DIutCc(^`Zh1@! zjgkX7aq@M^1dG6dKU4Zh!H}c+qHcBENEb_N|Le zQ=2K^OIgTP+3HMnrpOle7H)a->2y^E0jZ~^x|7K)Ck!|KgcJ7M!ffrOGRxAJCqik&j3^xk_=x-x zy|y*;Hc8YG6x16kRA%~AJ=eE`7-ffVjE4lTez{{s+4&tC%p|ED((lRr702~1hoQ85 zJs0)(r#IS^E&T5LH=lgw*Orpjr5*z#OI5;LkymEMCV!gPdDkkwW9O6VNxXl$*N4+$ zU9mf@H?FbZlc}qZ>yqibw)3mlvjYFRrYjxzwZ1Dd=_146I z((dKsqsuBC*0wpW?IdaR_SFBk?e4SoqkX#9xUQhJ(vp57pAZq%{^~YMC>;@eki%sg z2m&@Z^MB$vjnuFXsCkf11bD1mI^8WT0I=I!&?DmH<$LtVpcOuI`<=Z?0GDE^nuT5ddU58XBU8SCB-No__}Z-HMvCqCFgc(Y#R_N zQ0h3i21uXDvBdwZbmBAE=iBM}Me+GdAskmnlp+fBvl*FMek8#zzBRPT?8WCE?^}U4~THIaOD6$f+l#VvDpZl0(~0IgbiTVsVEbH zEcO-xL*`h$#|rV3nBV92r#+XsbtB6P5xKwm^Vwox);`YIUjh9Kbbq)2kdMol3!o^U zrGIUc0l*P<-VPuP+tbk6+L`a(DorvAW1fK6!imJvw>lSc0PqG|{pb)gx~3|mrxNR7 z;{nl%$*~evc#G|k+&XqU;LJhh?VaNNVRpi=WXvLoi=_JBwKqMnwKp>TV1x}t;IZ%W zY@L?<%$P@Fk~l>h4mExV6FFo^YBqMv0svYM8II|uJ2~i%sr7KhUVTVAKs57!d1H1()08-#1m?kVr0OX;WG0(ZuRW!UxBLHCieT0N~PDNwsjPg4HKsL@D z#@JkUI#PAA7y&@M8w&B7LPO;kV|D=lsIV+HWVrqZ5=_;k7k#Bo00000NkvXXu0mjf DO}!%* literal 2398 zcmV-k38D6hP)lAW5=Djln9iw!>J!*}!2W2Xokay*|N@!)Xdyl@V#PflScL;-r zhGh<8+3PAwIgIJW?wL+38C6oA*w1|AP)j9nr2tqGyd*#s1+uJj5Ty23ujmNoFy;W| zz)JAcHOgm*RN2R%UL}F^1M--kT}&wgWIdD-gS9LPT<=s)W4fZAY7O2yo0WVQ1cpcz zB#V?KwrioPoiO|68rcHa24ubqm#nvTE9Sm$sV8%Wf?lOZWe>hn6`LU=OLk_HN`}fl z^p#8i2bGFhC*!M5$|^?b!eqJkSzTtOs_2&-Occs-1Pn1;ix* z+gqJI;=XFzb@7__kEqOU?^a569H!*#kgFV&9qnRQBxkSVpYh4~RuHp-kPl_7%h+g? z%Rsds6=F#c4ORQArTN`b3*Q_NfeKS8Y zeVt#J9#6J8F0MG8K@BR~xuSe^b-glD1p$~nE(p=SDpitUrR|{qonO$;PX#NP(25dh zyy|)J8fD{t=PXybtc5tIFrA}}u5M^khKz1)*Z)}pKPw8ZBmr{*20QE5OgHxYBmzvH z4%I3;utHEl$tss6@JbP~M1SG~7Q7WCU{%N*uN+!gTj_Di7R4vNQ-Nm*oax~9Gx%n_ zR@<>k`Y~VzV3Y~P{p^|RN6tYjlqFAw0Iu3um7`4N7iEt^PPC_5d@c!8yyy&&1zR~% z8K@w?6KIA~@wwyGMS!lX3JNL0pfR~|-D*2l_CA$UP^cp`KI>x{Wj)vJV^zG009nOn ze5<6AV6_dicFg#U5q=n?;JRyA1xj%}eyxz($9grs&w?Kb;q?SLpRWWz^1){@#t$Vl zqnI#ke>PX_1RLeB`_39w=@r>0lVA+}eU9q2qHA3L*Dr+N!fY^9&sY253Uyi(-m5ho zI++A4QL`Bgugv!t_;~+N0~&5%En=nmPZJu-5+Xx@D)c*w{y~K6`U26hQk0Gt3;evN zzY(P1!u9uT(ta1Aqp|?MBQeo#_EnY3`nH03R-8;9mjo{}KsO28!14)li53IG)^`TK zjxG!Zc6`G8UhVyA|8EOm{iTuwxV|%xoFs)t3Nlp?rrs+9szN`k{z?+y{;UX9JH{9& zo-Z?inh7d{U)CnxL23rTq*m+aGX~$4gs8N>ZW1_KPx$$z1vq9|ra9$KQVdKaHUqex z-*FhqbP18!+^v4K4-?xVa%S6gU4On6%&xI2s)OH&BZzYGOrxCy2EcH+xk5$z*hG?!+fO z1uz4Z@~drt$-?*O6s3=oQPDvK0q>Qb%I0q3RfCW6I>EoLYh3^Dsm}oTtTJhzM1(4& zs$i?6ltNl0&j6qHT zaUpX+Rxxb<2~wwoI3wWD#dOF};hVIIlx{G`_i^1A1OXhm0N|Qcr(!T;P~8y4DxiW6 zl^*-AB#0t6I%d^Ypc0G)dQv5rEA%f1b0yijQ$PCni9zi$ueOeurBMNt z$DYS$y8~r)-a-8Q2cO%1#TbJa_i5 zBET3wEnq4U4Z-SlRml>^RX>|X6_04(4y{1zys}w@%^fSWo7|B{wf9G#zx;7%S3%VZ zvKb_;OY!FoIRuidPg;mEX{W2I` zJ$-a&Hv!^(XAr#apYH@ZC02spB^)55jEt)56znT!ofr_Sw3}orNHF)Me;m3>*rPiE zeTU-}-%9X5kqliKYL;=qXQzYGABUn~Twk5^T_(OO@Jg3S)$02sB4ku)smw0+{8=$R zGU!mnY2R=vCNZm+c=Et?kxtGADjA*33KHP+xR0I!q7ZlNV@_kFrgvuCr%45WQpdJ; z>ZoM9Qxg09ate4k0*u!-&)XjJdNMOhMz;j8eIR5=QFW}0h^|Nr;!>|EUq9-HRX zar4^=FouWCNT-J5ovYKQd#d?u0hwWyj91Dq9-Z^*r|47qRD)gBYe(<@04_JN`SGUv Q9{>OV07*qoM6N<$f)^Krl>h($ diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_24.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_24.png old mode 100755 new mode 100644 index 4a899faf2fa41977236c1259548e27ee6723c612..f26aece8c152342ba3aec5fbc3279ba76438c495 GIT binary patch delta 1098 zcmV-Q1hxCx64MBf7=Hl(0002`twPcO00bIIL_t(|oCU!NP*i0A2k`&*?ORxsICd#; zM7c~6kO5p~EF@MedTBP0?4p(}jtp)MG8AKx4DK`WOdPsqYHUWDG~lf$V2+yyJY)t@ z8M%T4l0)$*6yBy>d%UmT4?074!rg|6GPb*Bmq zv9+6;NlY3+Zq>TdfFk;EiKBBZF{!p+8u9Vct!niC^2pj{MI^2sN{7C?G|w>Jk$7-# z6b%`y9I6|t;n#O(UDLZ`%Si3~jdhI79}pZCumU8|n12iHHZe!y+!`+(R4+hsr8?InfAXfhZwZeThpn*CVKp( zIez7q{QIidx_`Mk*VMH_Y)d@ucbuZG3l< zwBtv67YGxgHos37#q5O)Yx|4=kp?2IB*io7=bwiE=hwgSi@QFGJV^!ww|cTkiZ1n6 zFS}DH*OS@>_Q@4Zp}sn=LvQc&PgQZY!cPtyo_{@;KEBHN5J*!~)9F_*hg&7#tXvXW zmhfENqZi&lUXbjI_??}akEulo1uA<=#sOoq06&<&>oa#I^iQ2ol>TA&6yq|FhrsR| zVr_7+2iundTn!Z$ATx2m2hTr}u6z!h+bx{t_#m5|Q2ZrZx?^nQ03%xgFg0HVTB?X_k%NQ6Wg zV^-%0RLnPx$N;F8G1lw~ql=tUeI-Ea1_S`EB2G#rf&*YRJsKc9SWAkZzb1bQKtnXm zX#i(3J)|uP5CGT^%ow|sz@>S=C~5%E$Ho>`0VAA--Ae|5iOdGI2>0v%1Coj1Z$dyc QCjbBd07*qoM6N<$f>E6fFaQ7m literal 2394 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 UNu{kpg8%>k07*qoM6N<$f}lzoxBvhE literal 2418 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 O0000^Sgdd3NlGPoGv+F7KFsGX~pBc>CD@m zhYl(y@UP;Q_@jL3iYq}fCdU=s3z?PC%uzJnIl}_RXeap&7MZ=3relcNgSJ&!OfK_f zQUqNb7&2GhD(h8+cS&S3Djfr9z@~7SoOhj5bvrv;F*{UIXOs=;m{EsB;ODsdz9xr#D5iE{>hO&Yo)j zOBut0#HuKrl}uJAQ|V8fMS1MHe(sQLTFgqn@-_8Gq43UFysqmV0niy{doS zg7#f!+4UlYKuI$wJD5L7@pSP~epP!Xa$Xp`Zq_jeP`TsZDS{oi#K5rYE|Bb+`BlH` z#wEr`@w+&x5mc|!e7vT!P8o*^6#ujcQhvpQ_qzgNiAPy!9M+kx02R6JR}EONyL=u8 zL4b7Dbw*St(oRDZ|@txl>h=1>Rm9kSqk^wHUhNmVxEJyr$2^U~H71ESbvAvU}3`iU3d9kj!93m`rA8S_CW>ZwTNzG#vxgNi{FiASAO@@v$UM z5I~)C-#O^MgJx_LspdnS3Ez2^{}6&uvD^7cC*gT~?NHje3c^`}amT3NF+$jVf>>f% z(krQP%--MrH4qi=%zoro22PUApp4nQdqx$r>h#3kCyU@X^ix(!76Dk5IVM+mZVXI} zMSD8LaWp{y*ZmWEvIr8t(O$Kqd?0{Y(5eyzJF5HBTH$#I}2c!G(3;z+#<^CQpM|h z?qs^AVDfk4)}3dC{V@WZa#uaf;S>Q>XDhxsH&G6raq^zn0niqQ5Ui-CXsHTW?LSE& zE&jJ(0x>BG{C2xS=a@1sC8pOEs`{LEe`0Uq*Arv1>grHP+4HdjFc@XVqoDOZ-2rMh zu@3JjwZEQMc1+2kW}>tE&grOn*m$Y$Zg+WM@K~Z9e4#QnbC}^f$yT!5_(^tvMNf33 zvJvIG&P|Eg>l%s`!k0>ZrdRzttAq%Wj$K3sxdS*w%AlPcpz6SD=K$VQ zHg*Nujf?K7A(`QLwl3J~^OLBP(6WX84$zUR-kouh>QXavGVj%5_+;>zJ@x5?op(zf z`~HdjVbRA9z?M5#sR@5aY1OR_u0w3 zd**K_%O&`zE!X|&Tiof7Hyg=brV~NUs7y8k!Ypo?$b@ZR>kn~$Dv4R@;asN zT{%%@?IJ<~{bnAq_s_wA2E)$E=o50!WP-Qsz-8+Pb#>gcD4>3=B*KaMQ< zj9)F2$zswukn&Xh>owuoEu1Q=zW&DKAII_jQ}A)*@ck_yD46pq>RQHbcc~{S$q{Qy;r+~_IcXp@SJL5-k zXs|=m@$)C22<|-ju$a=P0Azk*ajRz?Y&)2$-HzvX0#QFtil9sKpYC!;EOr==FW0Fo zp;d6we;kU&Oo%-R>{2&EI#QkgwvAD`;-cZbr&c0x}k=PBxt9O-KkfZuv<|EZwjQ^d|rP-WE}r_$4V zfh$y{n>{+yN9=<<1)!kG)~^h_3*$dQcZ*=jK>AIelDOhHemi#&39NdQ@XnazvF%S3 zLHD$CNA7Qvv%hQ5mvdGvOAGqetDeVAy&Az}t?z%Eej@oxZjHm_eag39UGgg*+WP7a zCBzB=jc{A|Q;#}RdU7FD@|_;_XnOZN`secV4+hmdIGrEGQUCw|07*qoM6N<$f=Ct5 AeE5&&pC{XJcW|)?f42#9!7EO~|=y(AJnm<=H`>6gy=SGiB)bsJu1b zV{l1)_<(|#f=1>JhK+Wp7VZ4KZPjl*BszYhxb4f0EwPFH5rf0QGg#T%YtOZBjqFIz zC@j!7tR=ORw^NlaWuw+#vjJ~hbkaJtH&(*?sog_lb= z((cA4dzsOhnjU#?4`zn#Wl6l+o*1V6*{`y1r&VZbNtmPyYrf$gAL_Qn{FVD3mwqOV z7Z!v&RjyKled%)@Em&KF!mO?wb~7=u=hm>q7QffaHy^npPYV%-yU&t7ZGQQ?X6lWoQCnmT>&Y zUv6hyZ{^>&_6i6UkY7TBO-C^dbK8W173ju@U<&UJH_U5%LCR==DnK4#1 zd4Gad`-=d~E(S0t*hy;alYkcHlo@8ACmLEGuoN#2ZP^cC6p&+R=4D-1P)x>gkBnqE zV8o`rRo91&ALQNh;*)O6p~^&%rKD_@n+H9URnbvjS$1S4L9q$r_3 zAhfcW_)WkupP%uf>#mT_E)f@1J2A?^U!S?>=s3D)=dEc!1OWXJ~V5Y&e0677RCmaJwbl1yqu|_0q+4gPeLm_ z>MIM4&!Dl$L5z7W4e;hW%l_C5JQdj$BVprL`6!>mL|>1QY%#?OIJW-}+Aq?9i=zmf P00000NkvXXu0mjfeiRvL literal 2434 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 delta 1832 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 A%>V!Z delta 1849 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 delta 1548 zcmV+n2J`u@29XSq7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000HUNkl;>6J)h6D@pwEI{M~Jw zoG^Z!oVoc=?C-Jfpba%{H6G9B^EuJs5^iyZ&O8Nqex{s%+kfE@ACT-OHT~zt4bE$Q zInCqzbF2~jzW!eUf6zk;?V8X(1)rE|VMxM$cN?1%6-FyK!_x!jmjpqL$*tqGslW#$ zuqUJlPQb|tJ8jjRVfd$W^h!GyqZJAtjEdo7PA zA>RoZsudlaF@I-MS3xA>@7jM-0G%W<(J2Br4|Qsx%_I@90_Y-1lIG#ee9p+hj|V|V(t)pDy|izt8&5}A-rOy(M(gU^$#Ne(B7KomgdhDLF#q~+cT za3a7yOLJs%X9e)ndIS^7!#xL=BSgktD^~>OBvAT15r35&sYDN(7bbsRUYY9=1)wD` zB?@FfYTZ)yQbeTo%i;p5!hm+-c> zJ8P&rk$))yt1ZUoMP&x*&i}L^^S|8ZB0FYDz_}uhNY-PAedQD0$CypzYFC!BU=b+4mF?e74Vg5a676 zmVYu_5;hqpXIL%V&JA8=;&MiS2wCWSu315Cjz&PIZ8oeCNShmUM}ySY!B%kLFB%?q z?VIg<*krNt*<FDl+jcgjN{>OX?$*@yY6GF2r{lplK`j_84&?C2WKOFkJ(Um+cr8zCbS~R>LjWKpgASc zND#4s_G{^yK~g@W5nMJbBEUFW@J#?zSk~M}9!FIseU{KK+3oSVTG3rOfhz)V1b?QK za8d$iapbKUT@pbCOl4q3NUg@%N3aNyvcD;2sYJ|x`EB6oV2Vsia$*R8T|bnNP2&CVNHX(skA$ zcnMtof$hE42c{$t9RN|}q$Ci7c7HAVcb4R@GHPJqpDTG=1OO-1PF#g(*AI?0;q-4v z*MO@Jvyuex8t{@3JbiylW9zo_H@MPpgaBRx7r(@S^H@OTJX9W&;e5@tV;L)}L?i`} z)phDf2)*EvUn){ehy++G*y}4*D>&-FjGll7UI%g9EbkRMft`HMKEL$=GJnHVCbTua zrvtd34!H-A7=Hl(0002`twPcO00V$YL_t(|oK4eTOj~sr#_{j@okOXVfrySm z_|q(!Mc4{8T+l(s8E7;t(FHj}V(LY`QP3NNWigB$jk+Z+ELpOf#Tc@g)G!!30>7t(9RR0y%@W$BV)Ay?dU#c|TV#Jf80PWPjK_wwo4VPw%W>o23zK zAn9;)WGvxGlD)XQbbR5|hBhl6x^|0=N#FXNnE3B#&UjhR!6*PybQNftPlnxN0`6h! zZ~}#w;)DCk6nKHH@q%2~^v2HZD-jT9PyLgC!xPPIc}D=mqQ`cWnV1A*+pS*@faVH( zwtfKMq`A_zqkmM636S&8m#aHU)pH^b??&PawegV>l0>C+=H)WQkaQdeqq!}OAP(0Z z8g3g_IXW_ys9b=orC(;j^saij23 ze6Y$8a(<;Z)~Ehuu;GoJ3n9FTZ#+@O$UGotIGWpnIDfOZcG4#zMGNZY>%R3rks6Ba z&Om!`U+>d1488SLKi8*1+sR?gOwjbX@w3z~mDSmufws=h`z4x`C>TvCe*`bAc zch-Fyz;-b?GJb$~Lt16lH$c4wgN-S?n0bw5`ArnDR^mUCC0uK{eu@AtHe ziRLa(RQXP&pRJ`H5VhfplfG76m1Tg^ImvJ03V+n3(#nV8%eySTMri8t_5)MLar%e} ze2ZVxdgr%QaxAq%hXs}|TpRf@t&(F6A}_KaCYrlEKLOi7aUHs-4PTs8CAAJ9d%|f~ zx=maGh{K`m5!2|-cr(fRT@&zt^`eP1@^qMIodPRd5XI;E1H&$Um}gYXGdZINxUDm=Ob(k7&29!gRL zE=T6dq)6vclm^5Cw;Yz*kd@J?&YXw45h(GD0XF~}tS#a~paM3@*aBQw`oFn9Z0n{s R%t8PF002ovPDHLkV1kJS)pq~@ delta 1826 zcmV+-2i^F&2c-^>7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000KpNkl11azNo5I;fCV+3ZmqSWeKCdOcpu@mZRgmw zZRa!VvqWaRk6HR~jy3)o-Sq#0<2cUODs02!Cz{V;%a zK%U}J$irBPEA`A~Vs;$$qAfI&G^GSw84P~`n1QQkUyify*1B`NeS3guJb?keJ-`Dn zRg073mfk*B8&~aY4`u+ZyVjmb+)<{OTKv>oz&^O=UmKNz<=Ch*EXR8RA?MuHt9Z3o zy9LaY16Hr~{C^y8g$z*Lb!$;?J(F{;4uU820B8%#JktyyQE})Q+JD-u#5#PY7H7vX z8Ah3>Gyq1B$#O5+@5p?_YTCEi2ljYihJOxv=cwpSp+nV1y$ni@8AY03s z#*b-^u7-E`)#U*7vJ8Opmjys&mLt4uxDzwA_^Mk#|9|-$Z*U8U4&U3nL`9ZsoAcy( zy?}LiRgLRYZvoL>PX-uq{E95cOwn{|2NT(8&8cJ%mi8;k0ecIG67dXx>>)71y)0*% zJ0=LC?%$$Cc6|mc?N^ioPp`FK4MRPE<(y2GGn-}|%i4)fV6r7!2H9F%F>dKac;__T z1bQssF@Hdo_B6dr5HRq9A;S)Rp2s*dwD0L1Wiu)OEXPK*xT^6%Ff3tFphcnHI`&XK z2B@HYD+r<)>v57b0KQv%U`BwSdWv99x(glnhFL%Jyu4}>>tNbucn`Y zdJ8}$7?DiINL11u%MuYRX6ZUc;5ogz9C$rICVvQCqggJ6M|4>=jvJP95nA@3{Sgaf zYpQnmn$uRDm;9N>coGdeg==8?r&5$@BJ?$$q&ma=O*qc=odAlEJoZZTD(DTZ`noMsJKspvkvvvVtjNi-)rZ$k4D?>%8?d{;Eq`|lxWazvXj$szYxioCWuVv9M(an%H5=Gc z!5nf$o%PN|dp--cU-6#rXskx(5d&n_kBn;@idaJHQ9M*MSzgAkK!xlb57Me(sFZ02o;B^mBpuHZ;hvI{CPF)d(P(5tNaU5oYpnUcs%L<`yoO1G7X;O%V+0;E zxAyaGpw?h98)GwCA{v*Uy@U69iz>{@?%lrZ`djBPddJ@@2{6e+h~*}FmifEZZ+Lz9j^5z zjQna;mmW-jKGt8C-2x)HcYkMQ=HRink+{37M`-2vg8`&axd_KmXy)CMtI5A3Adsc9 zy#-UsG@4)Cc=o+$x|iJoymBDrXh61D4b9%DL7 z_9|E_Ss9)^RgSL?pyl5M$oX;uvkvQWXJvUZwG6h_Roi3fn$>}cU4Qx)LE3oMI3{yE zcA5o4`PsEk0I7_?*PLHtM!j2T5E4RcNFB&w_F@i(MT|?JUp%Q zo{{72dqy^vqSe@1d;hE0i1yJyuW5^#qDqW7cXUnE7tCa3HfcusfscJ3$NTRA*joV8 zv1@(BiXhPBuF&P34}W5IznSchbVPxEUIQcA&tm3UH>+c1z%hHOs?W2ql0)MB7cs1{ zRgSeHlci?Q4$lFjjq1vvS^?{JhuCpK5xUM2`F-LnlE8~EPuP$VjtHj?Gp z{p%k^N`qJYvct<8 diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_31.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_31.png old mode 100755 new mode 100644 index 2502b3f21c45aa3078d74bd8c73e2cebb2a570c6..9cf2edd6f315e92f44072f5eb50424317b643d3c GIT binary patch delta 951 zcmV;o14#VZ4#5YI7=Hl(0002`twPcO00W3gL_t(|oK4ezNZfTC$MNUq^ZoiG?{b>3 zoz8Q|pbXvaJTUN*%Wpc148~YGlQ6~^(Uc%Atwl}0)M)!7Y(yhi5n_MbCbJ)lEM(@l zT_v;wPdCxwAWhlM^g6ZE&UrujL(9GYdcR-1;qlM=4gZ&SI)5@`A5?dOPZdv3v2|zW z*)IndOcA*gn4ErdUFg1GZPXpTHFsZ-HDYZ)=-=v$jDXLCJ=) z>%$^#TPb~5f`4mm;WLdbWk5*8nWwF)Q3a-hesf)wM7-V6FAbrycEcT=FwoOxf0?x3 z?AHn#IwqTs4)a=CQDvmR;fgmW($*?^4y8rP|r$(7A??R}j)DX()(_fgwj@9eo z-(E61_P0yd!eyslHU9j`$m;i->yT%5myf!ok^JZQ`hRoo=xx-u^1T*Mqi^*#CSTu+ z!NcNO_MO`3j~9F29GA~LmaI7?tQDCSPkn34$|nS%x2}Lx=GA*9^6H7W+?#>mxAQpZ3iaA{3 z0MhecZEuu;nl`6j{SG?0H`@+sx$pd_yJjzn0)N1i^!ocotXUyMLWgW%AlSRP6w@(v zX+npuL~{(=%eLCs_}Y^OSVm;G`WyLZY~OOlZpPH6f^keyo1ypa0Ha3l*S-W+QxH-x|u$QuoE!GiMbebFD z?2B(bk>f8NdH9J8eO86S2P~)nd&c7$oP^vcg+kw@e*A6eaRW0Hq_db5%hIU}D#SX( zm5L1^_F-#F_8=21?@0jicY>yrMq2W{t1ynFZb1&qy`bm@i9^7AHpm1d^rwUYpsuF$ Ze*siOXoo>2P9FdO002ovPDHLkV1gqm+gktt delta 1879 zcmV-d2dMbL2igvh7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000LJNkltts#NsufMpau1=x3$)e_Qe#A`qmIdaHTkahm7+|t_`|BpgL3E%}Vny;U+y52~ax52yMIlsCbXuT{0==nnl zkPZ6mDM$LP({LwdYH?Q1>eb`@`zdclw}2I={4~$rdc_SCj)! zuhoMf>?01af|EJr%%+*ZMGc_mkZj3_SSM49E99154bM;e2%YN1r6J7N2<;)gndV4; zXIUiUn}0s;CEN_{dwNIvpPkv571$_wsu~{+mL*tt&daRrF+c_FGl}jo5Q5nQM1l3j zs%cN^U|GVdfozaRSTPDhrC*T!Y|tgn1jx|0SI;Zx&D#Xa5_&IIA|R(m-z}gZtttmz z50FWMmo!Aax?GQSg>rF3ZxU5y?3xc(hg+6c=i_W26A9FwSY%t+w% zvmWh74O}Idy}bHFZLBs@f0y%^=PTrTV{+~j;4x#SU(pzOR>npqf_%01?-n49mkPBU z8MKo2nIw2h@LS8>0;U~P^`5SGd9x*`X`4KtVP{a}_DLqs)S>B1i0+HVkcI`;3hDl^lg_YzVgbDB{5}lqvkl=)Ib!kO-U52yWm$@#^?%7` z$xEbcpOKl1{7{t;$8r4sw}1=-SkG2cxjZ!N+H#LGeT7WuzRs>48PU1i1fsK5_)TCSd=~+0FMD@bVSUDFrw#iw}92BuIuo| zMiR`^!BRcj`(y$g?PJ#qGmRL_0L;3h&i2a8)4;8ry zt^_(X*1VbWC!g=H(%%S*%71~k?rPePfO-=T)eW3nx6&8V|2h$lqxfe5-Yphho1*C2bA-U3)==r)W7oN=}nP~EHOT7StP6Z|N-SUnZ^ z_^se>ARDacUCx&qnAr&GE7)f;Yob%`t;^aox_8u6Yh;tF^f!W#JOj2l^w?<@4CQB^ zy%IW+r3_*E{{={8Gl8+16mR~WU>ISwe(#_SF+fD$a&eZ5GR8b9sG}4+)BK@p^J;9Z zz5i5fMElx6uW7roBY)O5tkQ*gA&t@Ur`O9|K{L8Oe03b}-v?lC0Zhk^`id2SLF=y2 z<@rZrcE6d^&)$Bl`R6q-qWvtg*Se9CVd+?zaLk@iea`H!%5Lj$NbJ%;rtZz$*FB8h z7?2%NgQVv&cFZQ#)%}fiyVLmbXX3niK3daOoJJ-IqdEG002ovPDHLkV1g{5y7B-3 diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_32.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_32.png old mode 100755 new mode 100644 index 417419f8582eb96a70806fa7b111f5709d768291..1737a82cfb027327d6c136b09cd5f8b3555ffce4 GIT binary patch delta 956 zcmV;t14I1a4#o$N7=Hl(0002`twPcO00WIlL_t(|oJG@JOq+ES$MNs;@3YcCp%4~V z7GBC?90Fz3aIrcX9^isyOOzlTBZfJ9<=zqkV;W_w;>#{vFqt7)7B7gJ)Jz#9i(Ftj zo>>$U$yx{4DJFC_nMJ_DY{|n*_jm!!b9c_~>h)9i|41 zAbH{V?a_sdIBAjHr4#d)lkTusx9tv+L096psQCYA`b5D+djJ3_umaT0#r+kd0v=;* zwF0>}V*>{ZWO#{=zIt^GG(3;Ru+Iy(IvmfyNzWHYx#WCjF;!aN9f| zC&~fd(UzNclz-Au0S3#bh02anRv>3RaV8U=+iUJ^E2W}Ty4p}6tCE)td%%3`O?gth zw;?*!3!jmkb|rq*Vb7xC7Mz4LR2iijXuD?0MC^7Yck3!Qkh4MFW;?|@N;CEpS={G!sZBFkJ^4Xa6X1a3{_V>r5ytI}Q``-PFv7jysA%#fy^W+;J0_GwI?8CYjivVxIS(dTkI zhkrPY?kzVD1M*b;SzEYsC0kb`&jYY{U5z#9+h6p?pCET=_L42OLo~8PYqxq*HtdD8 z2pC8T--jsK;wa=)VuF--#pNX;7gdw-kenAloL4A8Gc~AHW+t}0h?!wPT6HO!k;(Ol zg?yoh5GjR28%VGsroa$1NLf@G&{e5OSTz_(T|jyQSWq5?gyCL@aU&QBtwyj#1hqLQ e0XB$X1O5Z&cy{gRhtj+N0000QM1 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 TTQFoV00000NkvXXu0mjf+^OI- delta 1875 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 diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_35.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_35.png old mode 100755 new mode 100644 index b6d50705731b167f35fac882783d74efedb5089d..4f009f28cf2006c04b9110ae9eb358bb5f009479 GIT binary patch delta 1016 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 diff --git a/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_36.png b/assets/dolphin/external/L3_Freedom_2_dolphins_128x64/frame_36.png old mode 100755 new mode 100644 index 7bd425e1d105c77f4efcca2ed6d34050bc3305db..414041750db01c07adaf1606bd4e7248049af585 GIT binary patch delta 996 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 Wz`w9e%*a;&0000C$%P+{(0EbLH;Q!5=xBRCoOv zn1I?uOpQCH8wQGJDtCC#^L%=}6!;ed-sa7VPS$;YR}|mm0e=L#3uc{rclXb86b-li zfVY2oNphgMctK z^#Y62fVV07(Wc70gQBz}00dUH4i;-W=kHgB@6`z4Z94qy%+~t(JCyeL`H?sTCZ0J} zdtzOOQia1~Yk$Dk^1jQI=19ubr^OcnWxOcyVD`J z<>S3GbwmBIraqrQ_o3GoHdfvm&@HWkLJRN41)0%`oPYAIDylEVJx1X2yhpAUdzydJ ztnWZoS&^!^lhmkRq#GWojql%gtuK@UDIdjH;UwgPnpJ<_T;1Y2H_z+)dfZZ;TzmJ@ zr^`Aa_kva!*C8_{GWT?>6xUOQw24S?toPf8+lK53*85`mSa)Z-E+eB=4 zT5nHJVt?$tB4@c~#ldlJMS8zreEtjU)r>Iy`?fEfT?(_j>XdFBKbWx{H_|`j>Y=Po zxo*_hdF{3N;RE%>NQg%@%cMD(EQ@%43}APmbfac`8{1~SGBL+XPDYuUmGptRJ(4xk zp&T3Z<>-jY5BIILfA^(1i^N2nc>b!Ufz@`n$bWrVivw=;8{r34$WziyF-k z$gLrfw6jTj5&SiFCe=;>*MWoA^u6M2#RzTHMtlo3EC|Q z(m|1vBf~D0yAekcS_=^O?NN;E+77^IP~0u|Vy@}iBa)Q_qd~Eqal;7Z)QDu|oc=2S z>r-RDbpiaVJ(0wLFOO9_n@n&z^s+FZuWL_TT6|u8XcFtDJl4B_P|F^55vtLBuO}+o@_blBI>$bkl8B8OAI|T#G-QHodA)ehG2U gU@YFZrZltce|9j~ZZmVN^Z)<=07*qoM6N<$f~OS(S^xk5 delta 2061 zcmV+o2=e#*2aXVs7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000NTNklaNt5^MTwG~%Mw^*Cb4B*X*t{WJdR@=n=r;W&hw=A-*C0C z_om+VJI+TNaW2}5a-uQzS+qX$x1zVF&xeQew?gPVypKkC_kW)by5~fDKXRg#!;*$2 z82Tj(KJ%OBSEjf9j=I|WX#zw>M2o)Z>N(ij$DA0+t1w5V7tZ&B6)~9?2fUBE&igb0 zlnTb@QF6SQ0lL9M$1<9)%3;A`!HjIOc6oAX0<2bc#R*R`fM>629|pm5x>~_3aGoET z?s$)lv2sHOsDA{r

    4=yz`#B=+%2_uemhJb`WES2M?LaNITP-4OAo9Vsw>ZXgUBXnd}wg!-^u&5I41}TT`@eF|kBT0aaTP4FjGt-1+`n86tE#t_024&r%qUN^?5^4!&Y zX}N#IH-L-37Sjf>B)+A0L1NYbZ-4D@YnU{Ei@y(Z25|BB zV#)w6{(j6Dz{S_WgaKT9J=6{0;_ISn02f~$H3OU|{)z8ALd5`Y?8sC3-t{0C-6l&7 zkc-|csBm-WvBUsL&|LJM$mu#a!hWCzD21mAS~Cpg|IR!yfNBDt=OK^y?h93>in6U3 zqt^z4fJA^?e1D`ct+vwhJQB<^y$s}v-y1=_2ohub{c&)pZv|5*MNgw&!wheWI#UKf zj{dS;?mdo-?Gd156kiJJAT|Iu1WS@OAN}irM1Ya7rT8sjIXj2G3c#>s3K$9NV(K9> zfHVWA-s9&6`+)2NP-w03ee~^xY<5w z8erFaStg0)bJPFwvjP_pN7VpY;`d0xBaVXIK>zt;fSs9gKH@3G9(goCm7v|uhXJ%Y zQDOvcB!4KU7q2k-;kPJsW|L=CvPL~+%&(Ocl}h&r-e8`u5Nw9ee9q_I*P|x(&57lg z74cgmS7LIe*CWfLfB5N0?iaK+^_Dw2aVO`?uPu zZ2+ZqZj1oaNni-NA#}FfthOO^QzCdo1n5CY8hZ(2ZI9rl>0mkuT-i~ab$|YO@4nhK zH?Jm4t^z`+Pb)2Y!0wJ(5t>_5$Su==$s9nMRL*=`sVqZ76rP-b z*na?8^CnW1(b>ZdERO)(lRW9@=g!}w=SYf9PDEq?&gkbH>7qyW=<}OKdJAX-=yiNq z-P^ktAxv*i0QC%HJ6f=pfwRk{QAkC1D5XT~X5cvh#T31HcLvV--}ympBSS$`%|E$SlUg4^8x0cx00006peRxznmApMC~|~7#+Fm2+Z-TLjD!GDzyw9gWaF8i0><_jTz-E4 z^LsNk0L(&KAucLZx~a(u>MRC2 zi-88-WniMr7;MS;IK{R+h=?>nvBQ(`$O}3<0tZc3$HV{mK%f@uel8+yRFwVa)I%BP z-;blO9?!Ba*P9e*T=UbW3VUf*siNQl7sF^?Ni~jcRDCbECL%Ag_HHhINbW@z5A|#S zT7%TzX@kcU1b>&9761kxK#A2|^8a-O-1WS)fA5txz}0^FCIk_GD$=#bH+`%RYPu?u z`oJU{JY3PMVgyvItD)u-uuK(V>)AyLoN>PnRO(TkFOO2i3ERzK06jE({pg~ivkoTL z0r*K((C{IYYZpJ}H*48D4GNxCwB76I;ijhE_%kzrmM~`)*##R$0KO#U8dz4(Blrfu h+eFbKW@d+{{u_?(lp^m$$glta002ovPDHLkV1fd5#R>ob delta 878 zcmV-!1Cjj21NjD!7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0009kNklwkcw0cijie;jZIaPh|i zWdIj{JTL}u@#g?x02hBA(+%L_&t<9sT>SY=Gr)@Cuh{1rQw*@V}q#y?)z2?Nkt4dLVwH*kc!_bTpC5(1bs27 z0xZQ3;X4BCdVd-hg=Pat#FvP9UDxM&Bopiwk)}TjpxAAYk!dnOuh~!C4=D=l#E^}k zh-79{f_tfGkJgh+{6! zHM#Qd`TwT@u>@FT=Unlq4IplgK=o~PAPi80Q-AWsYjTG~I3;5=;z^NU`V#OQ?3R3j z`f-Z%-%IVK?VhwTq&7g0S<-UPr+_&qlbj+pMYknD`mkkm*ez`oowNj~48Z--r}!r^ zLd#6l2$#ztPRRv^B!Q_BQaCSxa__I@Sq-F1#0e%48=y5w%l+zy)fy}<2dTDC$_LCM zfM+DcOU2i`hsb#mwbXW63G5sNL{)%QwmkY>gV<(|sI$63RAu0bU)bVE`Hq+-fj##I zID7py&|We{fE@u=UJqULJmy=$mb+@2$F!DhpRgtT4^FpGa>9plDgXcg07*qoM6N<$ Ef-WVZTl5#8Jt&#$X6ak#X@ugTio{Y<* zbKkpfBm=-uQVIYTfEf2(gCqoL01N@JUd#eSq0tFJF9dN2ynh-17)esr7?vOsh2VN? z?0{JY#_ce2e;sU{s5_FByB0&epEbZ@UeWcBA<}qo@QnkFj{B1Sw~2t!X6E-gHA`OD$sw7+b=t1$9*{K@}ZzN_&ZueZ3x!|M*)|6Cx zLv0U^A#)&t@_$?G868-g=j0Cb;8yz4Gh%3+-!-pm5GBC0efFXTMyoC>`+fU#7uC0* z0|sAGcU&9u>|Vc_s91DXGwnm!%KN zCuhIvS5YA?%db~^VE#_U#DS$Wzfjq)ye$jT-Dh`80ZznhVh7kTHQDN>>v36~3}?g1 z?`Fp7C}uHrZ^|V$VSQfzs}{02B~2OwhUBgEj{~1_po?!n_Q-*Mp>e)d2%l&@00000 LNkvXXu0mjf70cH6 delta 923 zcmV;M17!T;1EmL$7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000A5NkluxI{41^)-`@b^hN3|)3aIuZS4$LP-t=jCRJA*OCX$&Ex@Fk>VbE`2%lk4u_ zWqkuwti(T^uP^|_Ux#}GK>W41HUPw5k6QzH65rFkXyeiVCx1V1Z@4o6#NUf613>)! zxG@04x50%0Aif8#7riI)^FA2CmT3c&!czsU8HVz6pi2xBEnz7o@`&%=L}jWd&lO`dH^GUm zVd4moi?1n6>wjF&^{h>B8lq(&SNz_{=|zwj1Rs>XgxSA1?^!OfE$7(Nt@Tve=6b#FcP*Dza=cEa)?!cKFg+nk+2Zc2V?_C zGjQrL*f+32TnC`gTH|B%`(fD>z$p<^q6AE{h9&&~qkrliXU#uTYk*JrrfPuI z^IVxEme+fJmhTln#5H^vV7K@^9^o~%f?=RK{~2IMhMSLgO0!2E4YXR&z#ne|?0%RM zBXA=@Ie)#N!|0P&2(}|BPyQq(==Bhm-*c{Y3olP$G@tXi$MvYy5oS!_>6y)9+7sAn z2bUP3R&sv6jyjERhP@Y1X67^WLb>DvBIPl+i%TIUfr{F_eB8{QYCi4vmB*Zbi?;Au zrd~rU@_;`~|3yp=Cwyy|03FG{xQGBbn)?B@B!4fDFh~L&8sK5nPrxY#)e1m)ZQy36 zdIEQhp1gR|TI%%}ee(GBkDR%U06i#4V=rN>)d;vII3;q3lE9Uth5L^oDD{Hcd$5}L z#my=pgnDM)5=yc&SX*iAoX$MLo&t71s1@^bYYMqB7jTmUNY~{vpH?c9%Nr9ymI18h zO@B>MMtcvpu_OX;ck-m8pF4k3dI)Zd0%QYlMn7juS9@fSet+voZ!sMKdJlfoeWTsq z*Q*I=UE?%J%fQ*?(kP^A3p1+zX>r0-p^^ho9s;FzPXcHC4?fvi2$BjRS$#;Zl_!9= xm}VFOsNvsBDAe3ez5!RI;2PA?2+?Ky0~A7`qd=ki5l#RA002ovPDHLkV1lhZqra0h992Fm`E`fgOnp0C!{T$mmXVikui^ha`R(lAOP@`8n^;=c97~ zU?iyk00TgZU3-wlAdf&&M8FV%VGK^a922$f!Gvf@l1isY{C`aowPK=H%(2x6X$-Om zBxMB7bttKW=m zhMMI@pSbjZT7QikFaSF^?qldV{e#Oi01qACEYVV;yJ!rP@32N zV5@}wy|36&{Y{5f@sY>kY4yx1s`LDT^%wUqbuuUC#wP*FbWSmGpyVX?-uB^%U9dTT Y|EAxpy3>(<0{{R307*qoM6N<$g5`eCF8}}l delta 862 zcmV-k1EKu91L+2k7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0009UNkl!V@;)dDag%#<={PtN3R< z00|c2pUyT0fcSIR!T=C|9zW{=)PV5waT@_3{u*2w0OGI1oqqv5itlkuTDUU6$rsuy zE|Ne9Z-;pVfcUnU8UW(kV`cz|?*kJ9Kzu(eHvq)<#Zm)6e19x60L1sn)H(n}_m8>( zsOX$d8koeE7?fJVULmRI9C4-FTXJG+m`VhAo~K*LT*UBhgp(LH02O~!I2uJ@f;9}S z0yM=B;Tr)?41c#C={A5we2JJb#=q@hg87&~4WuCKucylZvu1zpc!&aXS<(<9nb|qP zcUmg$hS&ho**_wFZeOerbP?SGq+&{{g49&+uQUeS7W806fSwu06<@N9gz)+_4KSLN zwZxYQpPCA{f^n(_s9j)0iownG{ERZAIaRk3V(lM{*g6+wfNqIKbemKwCee} zN5h=`xMOJ53MepBoj(I;i!a$na{f|6s5z#a_=RBm-JPC7k+kawCMfgMyfECxkdX>u z?|5N?JX3oDbBvaUfiA8d2UBQYfaWp5mu>^}UQAAekQ^IfeGC`h2MB?0DCsREU6SI_ z@)vUhw10%>Jc}q*=;*%hHh7-!#oPc|0<_AsIk9u5xDB^SV2PU0rD#zT`NaCZ1hE0U z&z7{AL|a_%|6j^>5r7LdLQAxpqrjF1xLGi5h77Q~2s4UJyRl^ic;UW&o^D5lzdf34 zZGaGD1*CMwb901~+13D5yizEyh4@@S=*CE3UVjMEpwxj>TMkmuQ#0KZ5yS@YHcL_g zOXN&)o7g$Fy#@4AD-?M%_XlYV^E9`ZfNg*k z_sjPj@2{t=oU>i2A(i|8PRbjGBS5LhqVW!4j|n(0qQ1w@L01AdL;=<+Kr;JF307@? z?N?X9((`h@J8&zaWuSCMXmsC>{t8X#O*WU@s=v#f89(lkcsC#WdHyG07*qoM6N<$g5j%@HUIzs diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_35.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_35.png index 56e05f8f9afb2d484a8202de21a675bf8678802e..8558d74f72107e62bc7b352d735ce74bed459d6f 100644 GIT binary patch delta 437 zcmV;m0ZRUh2g3u97=Hl(0002`twPcO00D|gL_t(|oL$kqP8C5I#_|8mEVw5D&&I?+ zW7rT1%R^lJunqaBAp0+ntsLC6{AwK(q1$5fMF zo|)&}9RS!65f)1WP&2Fr*Z>MZ`F{65p~;REIg~j}a(0DkxP z-1ndXHT@jdUW>Hj`E8tFg8m-2u(Gc90<3`f;>S&#VD;{o9iRiui}#`BQbgu*xjVEh zHmh}Vhv)B;cmkq41}TT`@b^#F;P(p#wG?k7}rp6ezf96hJ z)(zldA^sD%g#jS`I^Na|pn&k}aT@_3{vKQ!0OIe%odF>JUVq%=01(~=7ZJd-_@3LQ zfw=)r?_lqkO#u+z2PP2!;`?E{0U*9Fwi*E9`(v8{AihtQB!Lk7KByU>6rI{bhdF$4 z*#KG4Qglk>d>xG7gJ}aug{R)f`8ila3=>DfQc5a9wWf;tJ~2jf6P$c3OdJ7f@wLS1 z-6wyZwFyo|w0{hgicgIk>OL{X&lgzBbRA&Th^$4=qaS8i1KR*n5xCcKmyci#QxSkW z`g_;iZ7Fz{cFw>uz|82Eb{a;%4dMvEN&GlrT~ay3DqtPzn?WOCA*L^e2AIvjx$nWg zfi2xaP^+Vpi4$ zz{InGA?!(p%HmCLsYfw7l!8aj{&5!pC^$(Yl`yty1Wz}CC<*k`QJi`~>l&;kzA;|~ zNSWCgY^^kQPG_EBPXQ-%RBsA-@-%R(9H8XN(@J%6`Q(I@041R>A(k+fpar-?P(VjQSHh8mRDu=|B7Y!~a3CR(kO~O20EK{l z8Tk;;O6@^%7A79tjX8B8Fq*=JPHlN~p^JYt6>kg!7sdpX0$;>o(uuWZ(Sr-I2sOo64d zx{5W)v-1@ZKyo?=3%8^Wr_r?wVTHc;N{Ek7+C%~{^2fq%vjbajHdRppu<=W(;L``g zp%1;woz#P1Zdlx_1E=Mq3`C(P|NqPGLyl8QSR@cgGIJkWyd*OW0u#p&!WEowT{^cKV^q2B4t}(6 zfQpv*Pv@n513e)8T1+PZ#9xnD13>&em>U8h{9a5Y0L0&qiGKuu@Or2x0L0ft)c_D* zAC(~h!rNhc0ziCQY)b$LZ<8$v0P*dz+yD^YHp_+p2=9X>2>|i^AesOW-XCHK0P%ey zVgQKmm#HBD!uw}90U-V}U?%`Yc*-tX7{~@J1GGd-Mdz9XX3&FdfSO37LZ)r+bHE7u z=^B92>t}_#kAIIb!UUUX7J)m&&(HPbU*TA!Xn^awM8xNa8DspkhY9xaWdMx`M(peH z&j6h2U9$I=&W9A(!z+Y!J&<$WlHiysuIDu(5~cUgh+jGuGlVsW?+3_*>P2~Ks#fu- zIYW4|@x*roQN`y>BT)~mgKPk<2tDyf3r-9LvMhfXRDWtuok2k8^@tAvvz0q~_+CT} zFe5&Cy$&JYX_XWP${_Eh8sOO5Gwt)%SOdFuI zK-1bhGP*)IDkMzMMkE2K>6UwL=KuUn#W8#w7B~zS=xgxMeOXyl! zv_!@ZLk93J!ivQvueeHp8|u%`^LDB5 zNRu}%4G;ov0V(hC)EeOg+!-JhuNLL4h%YS&oqwDJ>Px{hYK9Y_w#cHDcYz9eZ0w<+Fa~8nq{b`hHrA96^b+_`#`~rGT W(h;V4n!E!50000g`tRe##E0DXG$Vz746O~j} zGFZ$^$2P;YJ0fBgyNx}N`M56iU5LgyDN;|{!yA#d14~)XIuPK+4NUZZg4ER@fIQlc zaoT_13{CWAG*xg*q0QQH?)K~rlm-!8i7 z$s7`6nxRK1Q1*1t?cVWO2NJnXqRT6*2w!)F2BCeuHKx%hKPi<*8$FzVs4^Qwq`Z)3 a_x}s+-GcMgKl~m500005ju741}TT`@eGbS0u`E7_bME%qOk1N8408!`R_y3?W?MAg&Alc4Lh2Yohq< zegh-y5dZ0XcfSD%6y6T^2|)2}ahm`X9)mjrP+*;-7JzvTT5wfVc2Hfm4If40xsuuqu4%bw-~{))_W{mhi3Djxo{%AcmSiOY!sTJbebv z3nBwt*98+ly?-W6U{BWok`AA7eJ)i4v_?G&rhq;Fnn0=O9R1JWCjmT)$rP~V8-h>a z35L&%_%rb@8O0pwc+B?$#2AN!Ej^ZHzz(zh0J&f@X~EKDkE;zK6dcd?a{-=tL)lp} zK>81={j)TBfHw%S3$+r^YSc!eoedurwGvQU!tJdkq<>$v=dd@hLp1?P-%Fo!a~p}G zV^B$ed-Q5-AJ!`d`& zYwDQgzz&nU0LkNeYXuzr7={fnBTQ-3OANzNZ_jiOFgm*zLMTr9lwjoJfPF+v9{nv7 zP<$Nl)qlX=EFZS>Eabn1htsfM*vTKOwFjNAxZp~_qAaDKfxZ4p#6JQY=K&uAN z3e2ft8@7~ymFv(1x`+($#t!@~Mw{vZYCCxluoUQ`)&wGjp$YWp8ek;;CBnR|lz7L@ zZD2k{T-!06t}HSI)@d3b9sQC+AR)}9Ky8`$Hf{yQwqxsBKrU*&Z=iHmAphMP?@%-` zDFKoZnFHx7OT?}7hh&aw3Ft+uBzj9916%vMlv-ax n=IHhSy=mE%V_>sTcs>3AHaV+}r9W*_00000NkvXXu0mjf*tbw! diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_38.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_38.png index 39e62095499cb68d06e5ea366358812372128e79..2c2968c9f6752bdb23b837dc3ad21b9e29dabec1 100644 GIT binary patch delta 435 zcmV;k0Zjgl2f+i77=Hl(0002`twPcO00D?eL_t(|oL!Q!Zqz^!hQBpiSm;Dt1_U`1 zA?lPAh_evSl4k$~5tr#eJi$FlZlR(JlvG*igmgs;(>apQKZWt_*jsr%|MTz6&H#YZ zZ~|o5Q_ev#2l*T@2YwE+IdCHoAP3Y&u~h|?0oQz)+@i<}D1Q&3_R?NzlA;F(c>*0! z;}dAX1+oMhAkKTKaS6mhRZkQZR0j|S<8uB$#aL;t{!&}1NkGrEmD+5)5YBl7-gtcM zfGo8ScLJ9bHS2s@`rj++3CPcU3NH0YQn!+0^If*k0~}_qzoA{i`*Z86~S*;E(C0?JJzC z#^361ns%k5+mv$rOKaX22jD)uZHvhm%0-jYJv4Qk0dMRWV(jc(L_+j1o#2t_e9|NqP8C02DYqM%@FyVv6+N6lf&Md_YIM41jH=VO;{CZ!ZI?oY_5 zz?~?uLjVU6Ap!{CFuX+o0bC9Qa3G#u00KA^FA+ch2jd}vM1KdL0}#D?7NDukSFCU5 zjNqT+IzA8oqBX`XpNSMg&Ush_5P*UiBbLvs5W)xu0SzLI7Ab@gF8~1uq?E$NwSx#y z1yqPOKG9sfI zV3ubc&yDt0S=WOL{`k89qVXikEB@DvJ+r3SF)Z`oI@kfLp>{|-%UuLQKm%_#UP6V| z_|ah`=L`Y#@GycUSzPTI5CWX(8G5&H0T1AeWUQRC+JBHMy};ETpd>=AFMOsC(2Gbf z01qJWcBZ~+ZU{i&?J|w80q+OcjFQ=}Jn@T|>v{q7nlo!ZE8)SC*o}%M+7n$bfEJR$ zMoT%5PGD~@00GedUcmEmhbNOBRfVSrt}X*P(zAb~6@f=3AsO4NN`VLXgYVLvjj#Q= z26zC*4u9nzQC&b%LP|8g?oW6C&#oM=%b%IJEqM>A>L}|TS^FmhunW?4uhlTU-CP@g zw8}sTU})|KEahR;dM)L)^Rfj0_Y&MbXyI+lNWdb0XVS3 z?jIEw1fam{@$nU2z}m|8ncG03_x>A}(MQF+kV;0)E#YU%KyNf1K;?I=2KBuApFJ=5 Y1rpLvV#cGnsQ>@~07*qoM6N<$f`Q$PA^-pY diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_39.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_39.png index febe3bf0b05c0a7cdca2ed5c65d45e2c32ed1192..2326527f328d6636ca32d525e08548f39f121a01 100644 GIT binary patch delta 457 zcmV;)0XF`V2iF6T7=Hl(0002`twPcO00Ev!L_t(|oL!PVZqz^+h9CbVa)EX&L9qpr zEpdUAG-!R493d47R94P`ltoIxF(w5qxd1|zLV-kqQHu43v0n0T_xlBa zNaHaO6P|Jn@-@iTfCczllFs)?lD3Z;LSSX3*+sySq@oTqzJJ3dRRCJJSVS?fqnuyT zAn8f1w-9hnw$3#5U;q;0z+wREAc~FN5)=6-M{OU5z3Kp{P$A=7I!+}uWf1mDMN95n z{>VrVYJ)uX(2-4G5-&-89^)r=;29t%a^U4Krtd}HvmBKDG&aS7>;gy^Jyk_GhBN*h zh(l4nl@N+@4S$$Gqc;!*7Tpn`S2z<3`Jqo|Nmv?WvDzB5QDEF%RN#bS~Y;e!R*N?rIH>>DUU7sG&$#xbpM2; zO5jAvP5~Z7gaj1eVW1_T03YY)bOGMRXt0KAy`>b`ppXJM(SH>&s$}`UUKvml4!bMAvReWQ@Iq!Jpa2a{wf+iXP-rbb1z2R)h&?(V z3ZSsI{<;)fe}Clj2oMp-k_H8EAYX75q4(0YC^JNM1zZVKp! z5um|JtGa6Kcj-Pf6hJXs`FB`1@N@$dV39jiJfdr%00K)(xKh&afJsQ8p(4z23+brh(-Tk?MVso)Co z+?{6)K(gb+@+fah6r%tQ%&lj`2ccwM*6$DL{D=1y5(Q{78o*u6y-!UMS0tbS26`{{ z^kA=rMcn_yNEE=u>6^qFiq>;!Kl+jydDk&B}`=N<~M>~MpP8| zya3)8+q*zwd2VKDH;T^-aA!Q<6&j@}p#Tf)nDgsAqP|=78UapU){H=J=15l8EadY! zXMe5(%+lIni>-aQZUD9T+!&zOk4Asvuf^|<+(DT>6#?{(T}kWrof|X}T|qC+S55=3uvFS;+BHhY fBZDQ+Nd5v@&{uUwhISVK000072LB?6b~Zg(9(jH{iPHtBD7RbqFAs8rJ$99wj%7wvk@p$%mKMt*<#aSjJI=yxIum^J1+tZLz{cI*4teR^op0>2X~m!qu>PRemXc$x;Md0ZItTm zP3O}~7P#lZD}N5)vuDmPmL?_Jx^l=GV@}<%?l0_1X2`-|mlHe>zF0gBI3BZrdAIaA zQN#t7EbW#!^2nrlNcOO zZGSX=FENyG(O6@QA34BZV2g;E!~zAI_ve_SIC@yX6MvJ%z%i&SG(0v;Apye5a!Uio zFM7bGa0JtMwy))7)zm6#3MSkql(6*O<#WWgSN^fXo;~}qpKlr+$SRCNcUxn9&I73xb>cPKQdYLY5RD%-2F{5jVH@D+dqwOhv}DX64j zYe~*0u><(r0EE~$jbeC{g=AwfH@zjdu)@?60KLct(1#$o{|u}F3^n{#mD)=mNMo%J zWh?C89>Vb_efjgUnSWr zE+T+BFKqrAuxXStOTxW=BF_Lz*b5DiM4gdfE07*qoM6N<$f(WHu A$^ZZW delta 1436 zcmV;N1!MZ!1)>X(7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000G4NklIF94;ZwmVC zI1bT=WaD|RA!2(MyjBn3!CE{7_;P$a0d|+@(fD`*WP|TLMt|F7`fRm-2=L|Do&b-; z$FMyCMo8;7VS55R3J}Bg1b7r6hV2RPC_oI`6W~#R7`7+CqX0kfE`;p~uu=g&fqdH& zU}X?KA^p5p51^F46KT0-Z3UtJcAn?ZE8Cvm)_Z06&BRgyXm|K%;A)Vi-)AcX9ZTdp zgQyP_O9&u+)PKQ&1W@xadh%KysATlXKak1t+ro4Lw1Tg_aBl**0z~t&WZ&wa_N}QI z0`2{%pKKybB>=keseISJR~xPhS;0pGiG051k?@`kox4mDOd|jqe2Uh0f5>mvaUqk+ z1E3Mn6ChOfv-dVr6#xyC_Q9tn`7<_rQvaEK_hdgxdVh-dj7jSSN!rCDh)#xQHSx4G z`k2`oV-^XP9s|+9a{|$q&sqsq5@xQ#9<-DbRiovFAT6gM6Kn~DcJh$=M@W#7lhM9v zo8JF*;I?AhGT}dlXhCYp9CAwF?T`tP`m)%1+i0*>KCS&|;~TyQ(1Mg9p{N3Q-xDFq z>U4nElz-BW#nQ_lUPwV#Qp*N~H&DI4yd=<$li8^ICz`sJ?*T?5vr0G`-usV8-C_B4 zuvG;rgArs0e1r;k3S`u-+R|gG1zRXU)^RNBqGrV{qXcPR1uv4a_!Pj~m4emSk@g6@ zwwhh`PTeyObPUrffqdn(2B?ulYEL&c-bud$GJk6d)L+lnk`y2fOxq1-UW{mU0Tj_x zkXc5S78Wwb_nlS&g+zwP#Eq`qSM(-cD~fqGgPL;m#xngBka77^{m^H<$)o8a3rK}C z(`OGJyWs@Ln(&Apw9dW)k(SS^6^@ zTz|%;(?RBrIvXSIL?rYUgh~KwuxZd~&gFixUaVC|x8`|o1uYv{d0+A)Er{bh&l3r% zCHPtZqJ@`MA5y>Ccv?rn-q?}xS#3Dr3Lfyz$Wi+E`F&3C=^&#o+IuFo(I%)OLQs#L zrGLviBRO=u=GDen*W9?XG@jDZqpw1!!@6#LnQn0bUYJWrY z#i&w9g%@o@atBBo%$^Op3BCi+c)mszK6W9&EITWrs~?5wF5ozh%c`&cmT-3xl#*A1 zy%S8S?F3u*iV!2u*CP=v$BuZH8M(jWg)kYB`(2fwj;*R1RW@&RZ6&N@deh)p%a6Qc zt?kGSREEMxN8lB^|CzX?0I&319Df?pLB^zNRWeH-txKX+MDWDHn~pAgac|ZJh!# z@~oSc4F~K;h3K^VIUCrJSC6y62D+pcgokb6_$nypxzQ`BuMLFn^F-&D(ia za8`Q0qyYY6k#x`_(#ozpK@~Z%mLJ!hj@)1o187dVy{?@h?k%CS3 z2?@cwc8nByteYsWkD1WMWvPKs8%uj?vtn+3KL~*u8*?N2e6tv4pilSdobnH+d9Q!5xhHPcf52(kE+`3gN8bC54^LDT$QR4OvFW)(m zmxqjWRZCDVL9qnPfpPf^9952$k)+@Hr$HfrM_%L7BLRaQ3V%sa(t}SF0&JCl2vlVP zdY~zi9_>l0`$W+Rx-12m^Ccp)fDB?+go%X49420xKZ84%|#Kqw>rBXjx;Nv$vSDqDS2e32oi)xy2)4%9L)4$ r{VxlaegG%;5qRU{05~~3s00000NkvXXu0mjfI2X)@ delta 908 zcmV;719SY(1C|Gn7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0009>NkllApi$T<9~3BD}6pcXCZfMX&YJ*TrGeQ&Jclx;ahF45CM`vCD~BcLX?DfP2UiJ0*RN-V43VuKme0?8$ZJp z!R%NdfC*L^KjSF^2tdecir%Gob}280uUlKK#b8$ z2xXgAKmbf;UVnO7AIL)RUe?w9k3c1mNo}~D6-di+F(QC7T(9?x3_YPB0(2M|MY_|c zZL8I;HYvq+a0AZE&7M6n0H=tvYC36+1p=txF7@h+y!W48_P%>J6H`Eerpo8BCG6E_ zDa7j|fM;n|;<2Td@Am2uuSTDGH;L2M1P(bBbI?JxXZScMI8@PN)UjS z+l2rD7_mzT+Wi3t;GZ%v(w^$QDI!1s1llC;79l_Y1$Cv&;-1Q$ z*)!9}^@Si0T16e{ORhz8Y7{^O=r9uvJT8fN0s#!j2Ib@iHyJ(y0WcXwgVEOUsp5bD z1W?i71b=1|K?q=iRy3eE+51C)0H!IU!S1^P8a^R_(_U&uy2WhSFBjASDyWxtau{#H zjZB}202YkqbgB35^8R`ZBOrjlH%|TBOoDgXwesf$;B|p>wfFa?F5C<<pfNq~w?4uyfm*UY9Ral7Tzl54qEGo{GJnbDQ!5fYEdVXq5Y#m>ujzu?h-&?g zB+wY{%indKTzXd#0#HCDS0{Z-phY=uB!L1bL!P)YC}~YkSpyTd(&y6= zptUrj!n!2EvN%cX(Qd1~Cj}ra=}MMaT6$yAUSDth_c;MjFXDucH*ka~`GCb!n?c&s zIe+zhJ$lKlspCdIBY+XJpMF_|wP#a()I1{q2~zLBnI{A=Yp{{0Sw)G_`0D)zZC@o% z2*8qE-am866i31)p~}0I@x29M-9GjL0{`R9rQvs;@$0QPX2$Z=UO>HmZXMcaW&bNf iJ!fj6E~IFRLw`KNT&^U;RC@pb002ovP6b4+LSTaJZj;CW diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_41.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_41.png index 63106c87ae76b2c9bbb94e3e127fe11cef0ea97f..1d8c4257d11c56abf4177a99db9d42e5848afed8 100644 GIT binary patch delta 427 zcmV;c0aX6;2Dt-}7=Hl(0002`twPcO00DqWL_t(|oL$npZq+~(h2ei3LrxJ9mmneG zyg@2Ng{PpPY==a4ZEW4HD)e;Unx>6vm!yyPMBz&vgTU)AU6s zuwT7}Y74t9u!V93DkxU)YxHgg0eo?<2uoa2qgzD-NjfN+Ie!HAs0}1=p)xQ4erKQu z+R{w={jao7CegV-he_VB&3`I?Jnx{-aMOfpY-Lat8OZj;q6s(XYnM?MF3|((_q{r&`~~+@a=e*FRd4 zTbINheh@J|mQbkOlDPT&jm|?q!-p5wo|fE&kB0WBJtVJKn(plG0(ux{cn$Cv_y!u7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0009eNklZdz-FLDKmi;M1+XDVFYpU%iM%n2+&zZOIe$am3@89FwNXX})_nI4 zgb1#*aULM0b#ej45SHnSE_+DF<_N*dc5a{5#u9S0ziLh=fD)ZMu0T?O9 zkDv%aBLeGKC;$VI#;=(n0t!IMEaMlVML+>4m~H&FZz-BFQUC#<12}7rKmr9IL^Jz~ z+b(~|F`%IUf`6#Rf)In{^-v;Mrh)}n*Zxl@smd6hL_-gtU{-Rbhc!v`Bt!}z5OfUS zp(g_F1q?vv=iAu8(l%=2DJ8}LVo=+)BT>wTOMn2+zWZpi$YXrVnA-lfUjkB!ok8tG zULmqi$-fO~Jl+FnXU~iiyIx8hBk7;1-~eWBAl(VF{7)iQ z3cx_mz_WJ_C6`c*zH{^vfGF)+{j~6CIXGGXyV5i0T?u-9+sNH-xCAI!Avx3=!>IiH z&TCKr4p5ghBH;}ofvhn5wX|8tRt#JtpLMlcxuKm2X z+hOK4e#`8j^T=Dm?katsE?w;92oP7iJ&o}bd50qeQ0N)3{TyAZWBQig}?ogyb=z(qJaWo z3mQt7NLbjs0lb056HrjY6e-fhZvYjqKq?qTNGZu9tQ9v%QRGMw9w(bU6gy+@dYaXK zy64ROnF|1snqwiReTMs>*auk`Y*M=5cyrhRI!T_l!TrN2?|%ajpe1Bx8!oM#bZ1)< zmzq`F@i3Gcw!r17C7!n>3mjQHj}^n{cN@4_LEJ5F*-BgGyX4PT4M+p}Rx-4hMF28c zojI5Wj~ZYMLk~7%DrL`D6&`2~n0(hU_mUXfH)I~H9+(OeL+XKL8d2^Px-i?SA5)ASbF+VNwt?mQ@{x*mMK7_ z*<o9%#zNYQ_NScoec}{dDNh+Hr*T4vX#oo?w>Jw+6wIr#h zZiM_>R{(Xf=W)|oAO~ogHw!K-+$9y|GuwTQ24;j0^FDx zQ8G?DhJ^^O0ECRb{IVu1Ht0ui-qM)N3t+z$*YD&-48Jvl>rxkJJlX0T8L5{?=I7zVA`Tw+c3|0GN!7 zX%+lw#loHQ3V*;5jqxO68F?hmSXThXjEu3m{7W6{3Lpq|wa=^f-{T6PqK@n}Q9joT zSmgE67~~2705vo<|DVBa09lQT{r=Me;5^~wTB;C6Pb4;)vjSMT&tiCV`LH>D z=7NOHAn(EqCs5;T9nx5UQw(b7NOvG)*tdDA_biQziU5U0PUXXjbzxhYq+ix&1ZzIk4qowu^`i3H_|zxe`+$g) z$#cNkt0h=vt_q~U_St~I-6L{xXL{T${0M`r;PdU?86K_+VM-xG29 z9#RWnmH}A4(1CdgYr%2fHkz$1er5qT}PQar2x25_$Wx^8qeZ%FK7JGJe~nx0D%8RP<}SUGl%EknL?&J6+EMt z9%@_5r!o6nsXaiU7ZheSb_*7?ruP5^u1k&B)#F0RSi%Xw^DspQqf()!tKkIT&F+HD z3OKcj&k3NARS4YJ=CcAQ^n`G#FeJ5ukZS_iaj5cik031^g%rSrho)+nMgU*Q>sz!X z<1_;JA{PCEumafia>XfFHH$t`3eJS}Ru|R->>#q&nKiLAYYr`d$Oc)7XMh`802iG4 geFce7t^hvHKYgLWkBsD1>Hq)$07*qoM6N<$g4SN(#sB~S diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_43.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_43.png index 09309607ca2a80cb2a3dc81400c0d81d00ca3deb..8d1a63ce49af79a954e8c261037ca92c8f6a585f 100644 GIT binary patch delta 445 zcmV;u0Yd(i2FnAG7=Hl(0002`twPcO00ELoL_t(|oPCo$kJCUDMbA7>q-eKEK_nU^ zQ&6SZmMU(jXpmq^eoOKvsFA3aOixP+Bs!o;jVY0kh!9ATob{!!J^omh>E`Oreea!T zyaYhWaaE2S@TGkcZ~|_+B==$(+GeDI6z^~Vke86f zCNyET>xnR16k|YD%Og>Ct9VD1q7~{m-R&VD9oO1-!o4NZ=Z`8=cW;o^mCBZ)dlH=F zYU{AuH6A&aD1WP|;<~=jAs96<@03;aoc&oc2iVTGd=l~9290Y)Iz5-ySHGg9o*h75oAp|&p6{zUm z`)B*feF)q|DmvY6cK`(497-Ag>Hy#lYNBTyU}q-61?1=v9}aLCz2ZL(fDAmJ5%EB4se!A%a*BJR{a03DQb1HIn?e_Zi4aOZSz1Kc+7umfxHEFvksb8emklth(W_E}s)N{YX&6G(#t z+2038bn4{ItAJTcKL|etH{+MS3s_;#76XZs@k={_wK>}294;R+opR=8r z%ya>*4nsvww<4WDu4uU+I4#@h!_o$K74U3B=6~)a*65`sP#OeM4|i5@oia_e7J?~X z0g!%qlsBPk9YU!wL7l0Mpj-zq9s@e~R|B+IMh~gbA@u)%6v#shMvsa6eeb*jE3T$hntw{+K>d%<3dpCQbL+fGvFmX2!uG1O&&d1_~2ANx{wQ?|ZIlARkvz9^vky#qxoO3R32y?yL zHfUq}!uGwH@PBm04!4F|{?N}Epx0~t`*~|i$2wK*%!K5~P@I1!;jfgDg|D?hJPMNl zmz0}KPOzK!QJ@kI=bJ<3200*%Rqh+D&RReylZ=?8B)Y5d2BpAaN%d9%LU9h@Crp-# z6a+@UQlSKA%LD|Z_x>?}Gqnbxe`PWCHd&`YV4+BTBY%UuND&yVTRc~eV^sm1M|uVxbLf;=y(0?y9dFv0|Nqj?^KiJL+da8O(5LB z7!BdxfN$1nsAEX|qnQ{(?c59JiUu)8)rvA{TxO#cTv;fI+DRUlO-}172K<|-ENF!I zB|r|5F+xTitv-3Ep8bg-m27 XZxy;xc>hc{00000NkvXXu0mjf%zF>H delta 987 zcmV<110?*`1my>i7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000A*Nklu&5I41}RN@Bhl_FIPT@i;XYX37=FUZ8j`nhQVyNmQtRw;CYsB*`n5J((i@N z&*=eN&ayOs)#|tI`$FR;z{i;yz+;8p6wn3cbJYSj0TR;_w|~}3YT^Au1KgDv8;;ns zHbeqkv(eaD>8rMDfGbEmG(``W0GByd;!kS;Z*J=Ju@t|X09Ob;R&!=8ey9W}C8zn? zqm@O!ZV8Z4fYac~)WS>ra0!r=tm6Nd08v)I=QyG~GsaW=&nG~{-yM32^wiMT|_6 z%{-cWIzYbf2|QbGh;=TSNkHi@bOHqSrWxKz5ZVA7Jj~+t8J;Exy#)YY+X}Q}f7b77 z5+Ex0Xf|sx67hTY!{?-{0U{tdY3#%`up9U6`!j3-rGMnx2E3~HSrSmja}&UTBj@=+ z60G{U24J8a`xG(p%GNMJ+fNz;MA)e)+mM#{oI;Lcg7#Vd$)=<~DG|gv0X(;r2{dYo zmhB=CIvrJ@qia&K6@#Vt|Hy-52KE+EYyInNBrsgdD3%l)*FXf(d)rAVOarWh?@h+n zOrTZBd4IKJ15k^L7HtzqwiS=s#G8DLVG5~ktPK(`xQW0Bx zR`f(rPk`A3;|GPm9d=i-r!jX5vz`0gY5)$cKzQPDAsJz7uw=&s-ifd@04M(Odwary z=5@RB+p8&a`wKN|g+BmfqZBD^#i zvZP9zjM78^G|Zr802s_nR4w5%(Obo(=p=$lt?(?A;1q$gKH33W^dA*Up=(|3k6Q7+ zgJ-OSA6f~EnPWZwq7zYJn00NlL8=-ygoKM}LU+fX4A09XG# zQK%+Zi3-=DNR*h%3eWL)i!Z7HR$}36?Ns|(;kC)S4S0*+O#plmzs7wKpeKgcu`nB{ z5&#bv(-WU+D7^JZ$!M_S3D8^p_}XmX?R!=N^o)~HG)+zJw&7=Hl(0002`twPcO00KctL_t(|oL!VXYZOrwhMzNgH;hS<0e1^g z$TUJo8U@Rkj79ngInmbAkKd3C`485n5oAY5tQ8$>Q&=sCAZ)-w*hnUr#91?Quf?6j z-P~rlXP)z(PcFXxP7RwiRTyfZBM4%3RO@tZEs8xlD@pGetBJ zrQLr#KZs=|2LzyVywsT>PU*?n9qs41ZwgtJPqf7-lXTbFrN2;(|DU;|MTSdu`aAAZk5(HfC_NGI#DpLjXx@ z-Kf3BC8pWzMdZ7DEju4(27X2jaYOAl6)WV4-_&k$-o{9pzRUfzx_UN^0XKKYyWGqU zI~cGQ2X|}JIe^~IbgxIfviZXL2SVwpnwpP$TiXC+oGSkSX~EsY|F{M+00000NkvXX Hu0mjf;tCiT delta 1052 zcmV+%1mpYq1f>X&7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000BmNkl%IKT{JLtC`~Km{ghWj9?yDMcmj#T-B0 z1Gw-7TL4Ld~DZi4*=HzG6}IA>nSNx zakfqY(H1@HX@4LK`L)(70BP)!I*X$vo|gckk&nnEf*Gk)J1G%-R1J_39P*#-o`oS| z#{sr$fT+74k;Mf#i~l2?PN}S$_Z9?^iIE@=(|4?RviGqUj!)}Ad5&> z9ROf#*R%H}L{P#P0Ds6*2LQ;`0;{>7`uy|`0FcK8B!APu4*6}oc06Paa6IFSH|(T= zw%@MZ@5Z|VP(UUTq!PdI8xx7qtr*jdz5 zGIrr50)JM2t^ihvJ*|Yf7H^$Ig$0(foS_8#kV- z18_rGAyGgsJHSpIz#*O6Hanzpz9i{pH9!li;xAGf zIL-afI2up(KaAL2)KbdVR{kgUkI*Dvtp;epsRJ}VGXk`2A0Wuj0=SD2g%}H*kkt0q zb_nyo3&06R$=~l-sHIIphNv|4v{#AuY7KUJ{-{k|2kIqyw;T0(%q0_h$>y##)J?Aqq?E zl5R!*&;e#jeH!9sAc5~8r+zQuA2{{UMH&0wS02-X%h!m`gIWhymbA=m_QLEL8T7SK)iKqHSURVG1kxHXCq7GOYDgg|!GA?toK!TO8nT+94IZUz z#etz!DPp@cWz7XprdzilC}<$I^b=}8DhqK-(bWPb0?6}9QHvqN9L)O)6wQGIkJj;3 zFiE9YaVkV95N;gX?$Fl9{&h^9$xh_BoOwlBCY`1A9BPY2;uQ%%yyXsKP*v4Akgg6k z`3u zZ2(bPJ1GM6BPbT4D)R&Zxhpd9wk)ku4tO7=Pf&&2s>SW8^TP+3wvGV3^-Z zFi^aG;Dd}DAUaPLMRJe;Q9q3RIl1IlR5obd9(yp%Jvg6*R!l=r7v<~y2u+@pdoG-x zvUjbl?&?cKXX!yBfVk~{IRgTD9=!rYXQ_&Bw{$qI$&7cl@m(&v-je%|>xwT|Cco-k whxGGqk0(~8cyZ%HFSrIp^8CV{@3IB{18w84;ws|~iU0rr07*qoM6N<$g0|)WMF0Q* delta 939 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 diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_48.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_48.png index fb2c54aa933fe9b6a0b441aeb2615861ceb2f82f..0ba0ccf906a98b4ff5fce63f213038b8d0b55c71 100644 GIT binary patch delta 571 zcmV-B0>u6J2gn4F7=Hl(0002`twPcO00Iw5L_t(|oOP2uYZOrwhMzOJ>kcvCwU{WF zVmf0ClG4tx5G)0E>;wyIE5#~swG(XZEhSf*`~f$Dm7Nd}VzEMs;2_);6F2V1v6!z- z&|ALqocG@Io-=^zg!V+7I{y&lqV^U z9)lE-8E_l}(j(Z4FaVkZm^L!;EdhY;x>1aDM}S6PLz4BgxsU@%{$w|&tE#F1y(I4> zxoHA>zItu--G3|OTmTU0+?klSJxtk`b9C}qbal(M*Pit%<2`She3Bey+j&J~P4OcZj62OLH!-I-}LF$~n7?S%j94(sajsuEq zsY?3SfxzKC=c@3+=PZV?Z{`wjJ_4rsCnZ;pa zFto7d05s9Vu7m|Uv~4fZ_~}dH*5lWU$4gX^m4y7f9;~Um{R<3Ay6Q}=+nN9X002ov JPDHLkV1ldC2$}!@ delta 1006 zcmVb_)?*q~N+#-Mf@hT*iI* zoSk_hk#@C37+5WklQ%LaIYASa0spPK+a0e&-);@38X0nk%tXMPCc zmr~XYfG$J?l1h8jC%R3M07SUv;|nSQLG-NzKotOitm3Cifb1ZM-D(R7eh+}O`=z@L ziTe=|E&7`P2Y*2pUsMAi?f#4)i=Q$9vKmq=77@9aU}%7>i;Y5EKMS!ck52%iJjS#Z zi^%>M=^7x*A|qoh7SWpksjwD}kL#KM8Fqif95v6h+WB=JZvq5R#n{1X=l4E0c?&=X zC8_w%=0KIXvlto3Mw;qx>zW3kRu`Mj$4u4W7zzJF+?8f-cjvdX*q!u9d zWl+}LuQ{7nu`0k;$Mc%kn*a+~R^OG~1i7+U~=rTE&jd&c7u;DmXt#kWcj z?R>vH7qC}AWduR=)fz$4ul)PpY(=RPYK=R(X7yZaW`!7v_|nfmY5+?iN-5t1_r|T) zyu|XLRey->6mp)&!ETLVRs+n0zY}2sjoBrOKe{g}8D{sH7(iN>+_5&nXbvj{)U5xk zFhdYsI`8nefKy2@E0|XLOXGN@pY?IT=i!=k1q89p z62N1JoM0!yt&S%IvE37(4s6-CzAi?Y%V+Aj2x6Ng0I&XAiz79`Ow@XvzcHXE%m@Ur zkJSJ(vG}$7eRttK<`w~h*y;q}9r@dar6$Gl=cjx zlR6~;eBgGR#tNh*Sl^%Y0a*?kVUTuX1>UbVE1YcihsH?OB1!&Hrxt|+oCneFz#j!y zVw280GL5KK7=M+fdcM~<6cC)+{I5kW3mZ989hr7U6p>+FZt*UsYKHyNm|03jYAf4z z9>SC*GZ-3a3uAGb+B~&0WX!}&kBquG0yqtjVs3*>&m0w{nfge;pY;R{oyyrl@ZiTQ zKvUw(!=aIoXYYXw2bP}oaEa{UgNqm%Vq|A%C@?T;-Kc&V3j>UKrH%ep*F< z0l5XC^1MRO8KZ+o29zu0UZR}`Yx;1jMuJQOtOdOlP_F2F%|hp)w)lM=1k{&NsK6P% z-Kmj52%s!)HvpHr$~hO|t;7p)919-q^8>)^#a&w?<<2osnX2C`!oLJUI<}BTsGI^i zX6gfiLVy3f0hBh=je}cL0_MzU*#|*IJ3hd?CDXN|18B}Sy;0C02|)Kv=QwPHWq`?t z*C(c3?eU^dH#|r!2oChgeVCZD?*@bl$bj5hV?ih)T(T;Zo7Moz<>%M7_oWn|ejXPK m#cJ~@)WX=ms0wL1ga0{E>lW?%n2G=Z002ovP6b4+LSTa994GVu delta 1083 zcmV-B1jPH81;hxD7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000B_Nklv6n9*KSOB}Se|PL?z$B)WL?ezj!gByeXp+tqgGc}t8Gm}K3+yDlCx#l&0UY2# zJ|zOS0B+69-S8y8RThqLfLp{Cf&6-83E&n&ED?e1)_8;iM8_y0yh&Df01rfVo!&Q= z5lB{bfXGDbM%_TwW9$A1BwyhG0KVc|?XCfSodJ&#NM}31f6ac*=4!=x4iEs`&Bcg7 zc56&9`S0LJ*?-?_x^|%6H0nBa-|YR|=cqYAB$A_`N9w4y*WfsaSr5=#_fuKjj46M$*IqT8Nna1r~x` zb%1(abSHSnzyVer0H9CO=yP)?fQ|!1&VB&flBLxPtbb-a_59}mU?)&c8PFsj$HVK< z7)b#{&wfjA$^f3nwR^32*E#@zoltKTK~n%P`~QM_8UTnbg5w>)3S0-M=WB{U5_i}G zoP_9Q06^BbmHDG}sW`y1e;PBHNkPlDwc}sm09F_s)mG+n$AXp^#13$B_McD&@O)`G zpvuE@0Dl8`il8?iV7=G)`6^f|gD88n%+TGSY*`wIQwGFk1(XC(7DmMxeXfNbAyUG2 z#FC0Y8Yg|vmDyQY!0i1yMPT6o1>Pc1a{w+O(jyW6yWS89o(Sg0Pmj)jbfnRAiIHVW zq0tM}aV$snDL{)Pubx1=7tnYQ4-uFg1MAJ+-G2~Tx|)^)wBm(z01d_WP79|AqqpXA zy&h-cUEu&YGe()OUHf}$(FE1g^fsSbBVKD*2Ux|7MefY}ooJE2N&(rneW;IU{KAFHnhsXZt?*R`d@%#Q&UQ24iyoHPCXz|Ln%uuA3$<-z@D;T}TZVt<$2ug1T^0csQxXf|uw7?H@a`vMR0LpZ=H zsNP`~61VBqcIxvP@&OL~O<-BHCVJ!);!DZ!a0-o0r{LuP>|>xM0XW;d!6iK+`D_QM z8<$)8MR002ovPDHLkV1fus B{}uoM diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_5.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_5.png index 70ed4f55900322b30ba524f45b48dc81abd88ea6..2da8166018ae358d68d3f3d8bf390af11a5bcce8 100644 GIT binary patch delta 706 zcmV;z0zLh$3(f_Q7=Hl(0002`twPcO00NasL_t(|oV}7yXcT7{hoA4uXLee)$wZN+ zElsBOpa}k)%W=Dyu5z_IQOU)$E74mmVZt0T;QKII;4o~c`5#d zg7kmDY&NtR7`+v+A@)7Eb%TkufxQ22XaTdzInW&{^>w3v?a|HomEVJ3Yg0p^0jj6+ zKMviBcUR{3JqRsOwZmsPyK{ke+?0is`CsV&8|88zFQaf0Ko=f0m=z;W>DERHZ_4qmf>xm=I}bd2wN zdY6PCVBAixm;Ja3IDmTq)ZdMpii@rmbY51{$kNI6eGOx9z|n8IQMYa=;F@s;-u`DS zx&*cxGQP_KLEo2jFc)!TSYVQYPtpkZ8cGWdPecNBAb%(wFE>8L8lQqoU=q{#tfJNz z8dbA5s>-1G9vumm3IE!kjt(ua?r~Rne1!WqZ-3jtblUxqYp~=v{o%D9A-&$8xT~z4 zDZbn5egHntCdX{!*qo_+z~NVc@b-0RRBlMp{W6w*`l^&W_HYECY7!Xk$uPE%NK&o^ zschw9rhk1PmQ<)Mm94I9+V@)mhyavzKzTVTsZ=2qi)~q!FJu7TK$&Ks#paYGA*tJJ z$@(-p0GF7lZ@gucggsbc$235OJ?eu9D)l{AU=^?x+#Td+^WCtW1naOZAgCVl#ouqv zVhhZ?hpoZ(uzh7`g3Y}S0$WOR_l@3rz+$ueZ#zw~&TA_FPm)ce-qsYTabnlQNiUIib!9eA)84*~u--ktz=m+0AedjeF0*MAQJA?2J>F2fEfh?}90Ngj!*OjEc1OcRlLKopYPjO-CXDb)9V&0X$ZzX{BB@UDX z+Ah<+I8q7e3x6sV0pnkgsj@3!3jxsJAS93!AhTGSPm)bKw?$?I+Wj*KMzNd#Qt&Ot zBVXx?T+_ym0*QQmEh6Egd(idpVkrU8o!@uXd7i&^I9~vIosUC(LY0Qj&+p0RZB+JA ze^D$WKqMzi(yrzFRo#F@$o_fd9F}dZ@QvWLqC%!Y(tjjV+fA)Cb;nD8OZSX?^R7Xk zb9RAd$$k|HF3|>N3c0Evcu7>b3rDb0PF9V!5&&IvzTpjmNnu7pR14Y z6vpP*w&*{GSW=Bt({y~lhO}XlJvt}aWn{;U{F<4vEdQq00Mvb^>@+pfh(DR_1#IRMz?V1cKMfhsns5bqzUMu7p*H zRUg%Q{qVjsSkeV_Xk9@6omcnPc*$PIx80~bQ-7fLMz*FO1Zh3D)fP(7#&gmj;Atjv z9GvO>sSg=w>x%feGzGLae$&OrN!RFSnZVD&$S-ZpqeY~p93x+r7lEDw7%dHC`t8c# zTLFvClPNMU*#&5_?X|%JuN~`3K+oBC!21%adfpNO(4516R`%c#%&y3<*cOgJ*ThW# zEq}|X(#p~MuZE~kku-uLyZb$WzY-=nf#k)R3zbEL z#OSqM@cQ(EdPP9)Q4-83qB8ZysDB8)daaPfunRx~HX=d9CIah}tot>BrUX6JQJYsK zLUc`Et=TPJWH(9otV{)?HdVXFYH?Q)VWv`w^YI=KY4L_e2fMPPq7wI<=pm_2@=H7G zs0fg?E@&(=r2IvItU+o+QkKf|0dEkpFHrck)WQq4EalR!cZ4^qrU25UZhzy09n~@G zEW+y-YS#)zL}enWu_`_MXao6!Wm17fq}{C{LU2!O>j@@WpR77b{ZfGFVxZ%vNmzkO zWxAg}wj*;~>$OvXAFqSWfdwtz3=&inV^-1XwT&oS)m#;Dy$tf^#?kewsDNf;MPOF7 zdm3Et0<7GPJcyM$yNw7cY9I>9#_YiC4t{H`{R8j@(Kx(=6OaG^002ovPDHLkV1jG) BvKasX diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_50.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_50.png index 32221d3476f1a0a5ffd3dd05c7656a0c4409b709..94d6d3087760915755d5bae2c2c37da86629bd98 100644 GIT binary patch delta 569 zcmV-90>=H^2gU@D7=Hl(0002`twPcO00Iq3L_t(|oNbY@ixWWtd(N>C6; z6k)|MXl2{Et^`p@2t42;*fFPqjtV6r#QCxygv%4nN&+%yH-?dM(TQif)(=%R7#ZGb z5N8$uLxl$XP=B2uaAPgDvYe>jgH_=?3EPe@H_DQx<@m>)SO$YJ%r#x}pu zN@E@uk!?kV(_*lnMGqH&fSP4l4}|}g^`NdCIX?i_!V-d&TF6G}zH@tn;Rio&jI%v}-}KhP&$;tncp+!Ygai ztFNBo_A-S9B&!!k>s8RH0g2=K?JEZn&<@0+*_vN8p4|ICbQY|~c@?sG00000NkvXX Hu0mjfa4Q; zIKr~yC1Q|3Er3XCu5=A#kbWY9>i~wxBwc$gs02`{Bcp&oy2cU8H~_Nf5J=XFpo{=e zfk5tw2*d)&>_jvdKp^#01lIwSKp@jX1R?>Tbzl|{NVF0`IS0rVAp&_8k+3a*?1M)E z0(t+n17rh%Jbz0OYzY9Z`?J=AK$>;D4j@1_Sst;h05V)4o2(QEK(qfWAdqz(AQ1>; zg*yOx_eZV|fvoEQNw7Zj)_@$PE&eeCz56-nP(9%x0*}1c0UY3Q_=IdnxB}RK*Wu6V zc-Gr?fJ*k?n*Vw|N#N_}Q8G(Vybj=m^g->z3_&n+fPZS;ABF6@dPcs~F{ZH%?*b|d zVAdJd$R_=5J<@ev0SFM$(L1EC)}>l!V*;p5KB2k@qStqaKq0(l0SWlsKSpWY?=fi< zR;sV!LMV6sY5aQyL>)YBZdGqK2RH?S6CjY~;s6ncmI3R!2xOIV z0BiEIT>ycsat`p*KmyDr4c-AVt)Ihd4c?@*7ALk;2jG_eX78Ey&k;dB)#3G8^AUr& z0Hobdo1+EMhZQ{L5U-9ON#~JZUH^N!(_nBBXn(#RfrySTKLbd+e|+uiNf< zCHa>5ARR!9-uvqvZ8;A}VAb(_4`|Uu02=!r35_6G;{uT#udSEr09w*$5wio!==K$& zI)7eT&niA$(-wa)F8n0N`25TvEZ`xo)7juOPl^MKYCpxy4Q8L8LYr&c>*?J-%bzg= zK>Q$xABcskc);S0=6N`>$nU-Du7GhQxl7sW$6T`~_HAbS>n0e(B~)S{8^ssI2007*qoM6N<$g1VN+ AivR!s diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_51.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_51.png index a81457ddc24d2fe1497619616898667439bf4aa5..626692b0b15b735f2ea5ae5d624a4c33eec67817 100644 GIT binary patch delta 670 zcmV;P0%84!391E<7=Hl(0002`twPcO00MDIL_t(|oK=&*Yt&Ex$3HLk+NP~&3Ozhr z8gOZQh&L#R2$#V>;7WNX2*q0z!O1}ogc?^xbm@N5txu~OJjON9P6Y{2RKS5iB+!+J`S(|Wj_ef>^;HEV zve%}djRs6^I;74`w_Fg6#DHK@RGi2eAoi>UJGMclDZ$=bk@jnr-h=0HXne9o;CimQ&a5<*UgBr-*V8h47#(k9&4u5ICt!fY$fL+H*#+nC@ z{r*=9Nk@0ux+mCl>8fO1Aw@RY<)Jikv`D$@UY53n0f?MePCEM!i7*t;MYTd5#4F8mbC2OI|G(^exS_)+fc3F} z01L5$bgv^o1dy>aSK}o48WE&(fDB@bK)zH2ZUJNSCQ#b?>fO1?Bdf(Xn4cyjk6&eqc;ORqbv z1FQn-Y}M8w+J7$^BBDZuUk69({?>NA=#esef3)68iZ|c#d9MRBn32!lpE-fomUlXU zS^$x{AB`FL6+1+*^B73)07yaJ4R(B8luq`<^a4Oa;s6!VI@ugaF$6}oe<^Wy(1@U2 zpEbS$XrLvZ=ka*=zINTw86YzGC`f03QJ!@ckghxG0Dl<-aOxP~dD;$_);Zuf;$IV>HwL$A9d}X zS)c+r6Mw9DT6i5`0%<2|>UfTWktpB}kh%LSQ1{?<0A2?bi7*4<>i_~o6#*iCJO(1W ze`KAz9L8(i6`H}!QcpV&j$WH0Ef7GxxKXXU_mPMu0(1v^>;4H~2l2i2t3`kk0FnR8 zAzo)U*;5Db5@98i=kX0jTo)42MBuGg{^#Nb9Di$Wdn2g2z4{285`i^u`BQ*~q}j&p z8VXw93&pVOPZV<1G=wshnO=^X%J(WCqwL!uU(R7(eQcpN~J-*tes z+x2;){O6416Z!xAi^C!UeqG0A01YGq)C%$uE``|i(REoxmFkH~C^=CoMnfx#gz|q=ykLZzgBSg`wXNjZhj6ix=2Y2XU zM5t60URcRT)>|4cP|MUCpIJDfPVc>0j^;CG@Q|*lvpd3m7tr3|Y>oB(x&}>tTVpj& zlfA?NB;@zj_BKb7+s+5lTnSc-AOzW+==vh4B}HnZp3mVwdur~)X_9C09{{CMnHPPG Q-T(jq07*qoM6N<$f?XaXa{vGU diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_52.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_52.png index 3fc75d8706b1527f1a4259675a4e5a93b18f55f6..261c424e2a21cd27811348a0939885d3a8c12012 100644 GIT binary patch delta 573 zcmV-D0>b^@2g(GH7=Hl(0002`twPcO00I$7L_t(|oNbdmYg9oLhM&26R<21P7i1we z;T8#qOCXJ{%s((fj);iA!NyL)&0=LG_ybJssBB~HMeI$pB1CWzgg{VY;j*&3_gLJo zjW{q-=SxDQFv$fxC3hvj zY`LVTz|eugLI4E_(q66r{kFsffHT2CxfNj25}g1rlg4~k0SZTF4jg9md_~knze}R+ zu^IrZ5`1NpLaL|3*##o438aaye}Mo-Sw#Sl)C59W5y~`fi5LQN0R-O=#UNuT!hoHG zMi5ZAQw%bP0e>t61!i4ZVdV%WD>zpGSVYgmtNo>>J>|f(795-fKD&T4^YBCIKdp$t z0niD|Rs$kn3!i7%V&@w7N@KIbF%UiX01`t%0&ESMJf?AsXD2j5dDe*~aGpTgCI;g) zS|aKMIcbU9Lqb=Xtblmn%jP9m4V)i)BCzaNModrj`+p-nB9}xz9Zaj5n^XfrXdFNT;zghI`+B?s7O{)+P4>u>K&2w@06@b0fvzfR!A0v?8eYgcFY*z&C-Q~v#)ujFf=-9D7Zk+N{00000 LNkvXXu0mjfr0xMs delta 981 zcmV;`11kK=1m6dc7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000A#Nkl}9|1Yzrtg>uD0dXEsSQ_Qf-3f&qCu;TNlu}7Rlmbon4|2|Gxxb1Z z?*m-;0xAH_?zhPQMO+7P010_DA^{VCRd?>{0-VI0vncX>Qh!_rFaUydEiqgHC;{2= zGh&zpL;%*d9CZwMkS-O$bpQ}NNtcWTu>hiWqa`AczUm0uIzSZRMIc!sf^7v50TIZR zia;a)?=JMLAAwYa2(AMxAOe{v5iAS9yZgNmfkdPTws!zaAx0n%5jmCw@YU{*K;Cr# zM?@eGErKHiV1MCA5lGV*1JeSy_J2ks9N_>d+58&Gn=}m(ObOtt-5-H0tub(n185=w zSs@%CI1WCJiRRmH|w-z^V@>CokIy{`fn9e>;oFx&n0d!I&vhxKb-zIOg0 z2Qa_U4qAe#I|fl_B%e1qTRQ+6TpU*R?@f+HR1v_e{g1+WUqR0L2xNzMfSmDLe+zG7 zLXwZnw}k_&qLlJFpV9k33#g9gXO0-*0$8#Cnoui}-_B{-@sfIB9AK3+I?U4rT8)I> zxqq}fezqQutDpND%WS(gP(O$yNB#LHhd@CpFzId}%_9{P!~tqGBJ#Bag(QD8U;S*- z&U?!5wR42~B8XoQ!c`DJ%vzp@1KIg5J3vp_E2xPs<^2bwmb=0%*}Ze2$d@>h*)M`d z37R32@{&kaMKJ3wEs|&IBgvOU(Fow`qfUovJ?zu_>s(JcTA%6ViVknm;XA;n@@vcD zpB*7nb000000NkvXXu0mjf DjtaJr diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_53.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_53.png index 2e4528c7318962bf3865e4e534c20a09923e85d5..fd893efb91b8966b38c0a543e04538bc45dffb57 100644 GIT binary patch delta 389 zcmV;00eb$529yJk7=Hl(0002`twPcO00CP`L_t(|oPCn9O2beThQE80Vuflm*ulvR zK7o^4@(3;kUq;A-I5;Q>;_g^Q=xfAD!KFpewpM?KG|9;oJxjuu|D1dN{|3NG-_+%S zU2p}aGD)QclC&@_4j?wb*R!xM&VWi?w4e__9<-3QAh9dp>wj-a3kVfe^;?kJQ(Hyc z1#3G-l2%Pb8%5*326JXzaM{@PIAD2anw%s_&*2_}zgPD_VlpJsf|=LUS2pHg9fvZ*w&V3KLr0n*#N?5;l8p#hZ%mxSgB!Al5!1z{Ym}r8h3xQ#{Lbbo1H*2aLw=6M#sP jRKT7)G3IjE(<#6YS0jeM6eK5g00000NkvXXu0mjf?0LAN delta 766 zcmVrMnA426sF{a<& z_U&OB_&)jPTYm#o%T%nsoYV~(ITFAvJOzjv6H@>dSy-NGfe=7}H+R`S70fkIreU1FQ^g8E`H^JkR4o1grws8PHn};05+6pj>9PL@}Fzalh~k_9CzhY!2W%kgeb4 zpEr~NvL1YZO$Wfpx{(vSg;Hw|bHk?Aj)&j_ToeGn+<$aH9sE|iUbrd%fO_`z{tmnS z+VeeeeJgl&_wA(U#CVQXt~&rWBS+~uiANW>?f}?~#97uHlEuuyvIAHjFmEmpUj{iR z1n^;YHDZkrz=yo?p zfYH~#8GkR?$-(qaAjip@**3V>?3P_Xj03C$vs|u)BkZHP2+T*sEN3V+ss)gF@8Sh( zh?xRTiD_YvDFNKR1swGO9aF1-n}c||{KHs2TAo_O3m}6X$dzYU7J$kcVAtMvkDyyd zjROGCZxLG$c8#F`qy#_HyGzK`mL=5f1N4r2V|VTa%s!{Q$0#jfMyL}2z}zjO6EVzQ zQpp=owa=M;N}yW=YIuPWD|N%{b@W!yd!JJ2)&SB4z&)_L!Ivxol~X{5Q=q58mzqpX w2awv~8eG}6n$a4ZK(zy8IK;XWL=8^x1GpRh8abclxBvhE07*qoM6N<$g1l!{jsO4v diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_54.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_54.png index abab31964359435749bdb0c6a4579e9cd469cbcb..08f6455706815daa12d6fb112c6c73b262a1d7d2 100644 GIT binary patch delta 415 zcmV;Q0bu^V2CV~-7=Hl(0002`twPcO00DGKL_t(|oOP1DPTWusg}-~(VVA^cUC^&< zl=O6Kq)4=sJPJ)DBVK?9pr8N=5z(h~(xlBJxJx7&^CR)Qds5hYJ=ch7uKe9IGiSyZ zU@ED^#9UHsfh0YyK0G*p!~ox&0RWw>1FgF3!32O}kV4*r%zs+IukNxQFjTZL=|N$; z_KGA1ueOXNJ!=^&!t^U}Llc9uFs{b|Pd`kOlO*Zy&`0{dbq{1_hm7<{qhJh1s+q>% z!6V5OP0qJV6cl4EetnZp3|Q7L_VI>wNlt4Zui}nwiS2%ToiUV$uv-g2!)SL-~W}Te`yy08&coeeObn zk^ojXzT^nuKjH$g;P{dwgb!bmjazg+V0TMz7Js4!y^>n5MV0pEql!nJ=d0w2jivVZ!_u)zarSp4NaYXUB5I{=lkMp>~cZ4+X zJ@e&N2CA)8u79!2)D1f_C4f~#a*#AGQUDiOSdnUhBY=Wv(Pj8lu$G}_D|@bfy|SbR z=rL~Ta4kVx*A+qpssb1>=&A@11@#nAK4v|Mg1Q2w1>rpks272yW3vPAj(qxE{<$OR zAn(ox1|tB+s(XtBccIk!R^%KGQz(N54v~(ct{C}r@qp(x}Kz;SK{*JrF;0|u0w)4I5=8_ii$KX^-#tVq3{453 zWo+q}L4Q#prvQzUH`G4Ln?RCy7aMsiSlbXY2S>T_oCeGmfu&QQj)Vce9VCs}2#|S8 z4I1zJJqyfi1jxKq;$>9OtPeauiU1m`pR&>^iMnaH3h6R5cL^< zZfQ8BQT;9kcklqZsJ3AMn<}C$qw|Q@S#`#u7 x;4Df2fb9PV?seu4BG^s<8SQP}Q72j#!4Kf=L<-0hF3SJ_002ovPDHLkV1fVvX7T_4 diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_55.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_55.png index dfa5312f556181f8d76903b4bba769986fa465ad..8c6d81c0f07002eedff37df13f299467fe8f8f79 100644 GIT binary patch delta 346 zcmV-g0j2)X1?d8i7=Hl(0002`twPcO00A&bL_t(|oSl=gQNutGMW0RvJAfGt4agnP z0aic(lt2k|U=b1000E^aASQqY%uoO}FoOmpeF8Du?imQUM5Cv_xBvd0;6JO>+5>4Y zZ-FUfjjxcc37i6Z5o8EZh>C2)rUZaGf{|1aOaPdtB}D`?Z-1LGev3GeD#phof;m95 zr3fClJSu=D^NKF*($=j9clNlFx>7H-RphH}r@OyfN798IRiMu{wM|)TrjiW!IAn+a07*qoM6N<$f=aKK5&!@I delta 708 zcmV;#0z3Wb0?-AJ7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0007lNkl*>b}m3`IpI|NqPGLx7+67J&46*8i?p3@K|2f4FI-4fQR$e ze6#BsA5B6C3M~O#0u9aqG(s-{8RpX^z|7D~K!!Pp1h5D`1%D#w!V*o7u#%&O03hc`0Z;|_d<5`()3EJ3k0UDpk#C_r;Z^|j`Zc_WeD{_RLU;Q- ze=aY$tN`f!>wj=3KpMWZ7egKyZUhJ+e1)e~zA+5cd0X9}Tu;?%%gDUpX{a6xmw(PON>Xrp;A|mK1wk1rfX^Q{D#2Zp++{R3Y;xB@ z_-%#+AmR-Nv%@c47ql4`fGFSlYOmwGcBCDEkIFs(clWI~bgUxgp;7^~X;qY3B|#OC zVfHYnM$5@`&f(DEZP@-f0V2q;#;I2l%A4drgH=Zyr;B%A!L^u#4H@SL|3=U|eW3a*K(hQ=y=F%h$Yb{Z z0@CFgDuNB>lfZaH3_a8aa{(gvT|BT3SC4}+EUag`06k$sgmo-A5j48|(^x)YXvwqm zNSJnzlJ|fBdCcYjz2&|42s+5K{7~rZEnpKLJYXIZ# q1#klzT{(a7NahU)Ud9jeWpgadSBJL%0000URo|1Yz^e-7Uccy^#lMj%T;0MJ?qA8zCh zqBoVU0RS2Ym4nj3%z*ph!!aG1;X?l>?*H=vL%01thtXNpUMT3W~k%0?cJnl5EY8GaLsot^f`xSi=Hy zsjP-4{SN^%&zJ-o2#B6BnA{27=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_0005&5g|9S zQvf35M1BlJf?R~m0gxaMVS^w_LJqv5L1HJwreK`iPkK0KUIo*%NE~K7y~K+cSb{uYb3KKs?fYfVH{f3eQ7|2Skt& z;z+#_1pP@P09hc0Gy*^j9|ElZ2&$VjP6u&3%<2J928EMB9ETf0DiIJM25;R5Q_Sj- zKu>cMs7TZF0D4ZH0;tvZj07o~1*4|G^7?a%$upJAxihu-T@dN}e^FHLWC`14N002ovPDHLkV1fi% BF{+{gQkCVaSX~Y zUS435aI|k1KfqCCxs}1~!ts|tDLFme2Ei-km5e9IFK)8bQBXNOc%YUOT*N^#bP z#S8@^41G)o0vRm07~B~jXfVhOjG(uR%i7=e$G@JNe{5P{<>tq6Z?9M9mHoYG<#t5q zpSi%+kpOt;v-(y?1$6+Vj)v zj&C>H@UF6Z(%dg^T<3>gzdL=V>~nSblPiwy*%h%^?fW*C#lO$j@#pGny%y!wdA@SK z&;0zqx2l&;x%=1W-|o`bvm39KnU-5GS9a?)ZAy*)P*o$6y>|I`+}|JyM)Q&I~USqz@8 KelF{r5}E*`z{1!7 diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_59.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_59.png index 4ab56d31ed0c210026f3eb0bf636e5e530d9a94d..95542d4a27ced64dd17cd074525067594d8ee2d1 100644 GIT binary patch delta 456 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 FV1gB3MV|lw delta 1363 zcmV-Z1+4n31=ra^o8uI~<~RkgIZgp=j(<}Co8uI~<~RkgIZgp= zjz9Q3`ET*TgWYs;<>NC0UdC4K&$>qe(x(YvLa8QTLS zb{(2O(gJ!>W3!%;BivbOa@Tc^!bV-TBa_0%KMbPP&wtnC zBSEeJx|i|VY|ZZ@-~3Yc@nFd*0BsYa_Mz?eky8LimPS{{VIWAe8L&}eAJ z-%{XdGNsE5P2Qq;ZG2ul-uYN_LjKO`OSY_b#r2o8fY$6g{Si2GbbIt2VpF5p)onoP z;Td1(yhcnZVfiT_GC^sTN|Q!fNM*|#jTs#$a(|NOi0Dl(fU1CJ>{vyY33?XRiD&k> zB?Z8bBK*c_2BaWqH+(Y#`egA)@Lp@X3qVV<_N)e{ajoZ7?x?HbIsIf|Er?+Oc$3X{ zope`E?Nm*SPbSjmwNu7wRQ3JQsYqNb_kG_;Qa#D9zAvYG(io%Nz2=W}ny`FF{PXH? zpno=yIdl7B9RB}*P4cOe*@;^3G?`I=I;xL^mY!#P&zupPWek8g&zkt3GelR(>4gk`#3wrI3d zjc0%3l4%15pg?;&$FCNFS2pVtZ*|hU(SQFeyQ&OlfDUiPRc@$eqiPdci4m1s1)U}HuN1*5JukAWABF3)fa|iqNI~)KMbKK^73?>`)!J@Q+PZ|8dA^>B>~-vnxqqza z{T(l)k`cQ9RVL`ZbylOy7QJ125?-I)G2H@DscLmH21@QR?|H z=x7HOK^@(adB%`FBzme4B6*0mqmNCXbi}KKc85?6iOvxnu1|Hn_M)KiUx7FOhehQU zH2oP9Lj2UOSP`52zJT6&R4tIvCVzC+(eFc7It5hF-RORsj*%J1n}qBKDEwU}PLi!r z%dyxq97A3JR^nX7fnat-gIE!Kuia5HkY3H@A}hG6J%6+SKCw(YunOtPYgMGcJtrDZ zGSQ9Ys=Jdv2FP6WAo7}xY%8c>sm$@W%XVZgY^qO42;O~QEyT8+CR*= VLqYHZ1J(cl002ovPDHLkV1gFXpNIee diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_61.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_61.png index 7da7d1adffe617a05f7d1d7b6ed4b88597556a0a..ef4d9db7ee2ce8a3bc994fa613e928c3bb8b37b1 100644 GIT binary patch delta 725 zcmV;`0xJEg4B-Wk7=Hl(0002`twPcO00O8E7|B40k??OzX%U7J2y@o#b{rroQ2xvyv40Fdm1}?rTf~$ zPiXn^4WdIcrE8yil)e4=C=sX3920K!%kX;=@X zZ?ln=^j`OjfUn_*otIVtRL0$70iNozjPJ8#Pq${o@(?_LD_B4;zsUVq56rt*W6bxLru$NW z1q?`9ucPBl)J*C>wSQ; z>FI}$_!|V&^-rNUXpWn9w>VYCZWU z-*&K2<9~R+JTR0rRwOl}scg~uAq85T2B<;frZ1^cDNVD9ELYbG0O!xkSC+gZNu8-Q zNlIClhX(<^GynxQOoI?kv9Si=!?w!H(gFRLNRwnF+X11Y@dLqJY2#I}wlqEmJAiGl zxr1ZfhhQ%$?5J6d8jWxKF|0Q?BiXT24D4#}4Nl5)52n~6W-&L;ICJ^F`XG4F0Ptk1 z|My>S0ZCSF_mpT;Mdz#}n+BDEkh@&3$^naC_!R-WK@Ru_|L11OFLmr#00000NkvXX Hu0mjflnh#V delta 1573 zcmV+=2HN@I1*!~?7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000HtNklu&2X2qx3s|CMuo9C@OYJNVKqpHyW{Y`_L{%X$I84G;b-zIF@nU@sm6_~SUj z0Pg#CUFrBNov!OHzMa<#o*dv$n^@o{@nN@4B)!1|9|f2y57FyD*(KV8{hH$ z=vCuqjgRn+^6^}w>*mHE5dtEch{tE?bX|Ax&GP5QKOR8g_jrIs7{UR(ZY~9WMm>Nu z$AZSsBZGHtl+O&B-1uWWfaglb1H2p0%Ihw^S^nJkV?016hGpqIIRLs3hZw*>Gz8EX z7sYQ00Ur9thJOHnxLfm%o9RYrg1186cKUFD2jIY2^Wy<(vT$R*TO|rYbM@X0<8py6 zdfS)>)`3zWYZqSkLN8NPCm97KV-`*>wF(Z8a$P0@@09VIzO0--( zU6ePGq@ZJ^Q_8toDI`()9%$ZBdj4@CKvEtzZU~D{#DAEJ7ePxL?}k%o8!geryfsf0 z;ZNsS23E!L5FjZ?isja3Quiy-)4p3uQMzYtMhTfJfu7RYRfZMzD)?Sea(J?K z?zuFdo`1ZK&4?OdrxGl1w zHi@2MsXD-))2e|;^;3m)Ai@T~DVxS%nt%0630(!8ayd8e;d#Od&dR{$M%MV3Jp<)m z!X)KJu9g5^P~+lC#%NcpGyY~@1ZDYq*6g8w-S>T0mF&&Jv5?h;TF(fr0e#_|9d*5ZDH5#TY_xK5d9sNOj>U|n&079xsWX#^banaT%1 z9v~xF#3OvN5oE@9AZq{-S-)nLJbzYJx*O4T-*@c4kgKSiegOaaLapHI;(rnA72-4_ z0Eo+UnkS=(uE+h$Aj{oHI#VZYVzzS0cK$qA5&H+eJQm||_n+zshHS&DVb5l*>7;c4 z%1R1nZdgbEL8^qTHJyg2OkZOXr=U#Y;Z<^%F<|2zpK;&I1AniP<~Apu z^iI4afq1bqW86S>V;a*2`Qlaj{#H~J)SwAWCWg* zt(A=$v{Nq8w`8ec%CCc0R1jU@l3pD5Jw1Sk2f*XC1F>rVUj89O9q3eQ#FKP1a3Zor zXk_DiwB)St>Okmqu&3uAecqPL9ApF)o~sdh8>p2go`rZyn`}wbQ68F68Y>!MyF=wa Xf7|iX0Os<500000NkvXXu0mjf9>fEg diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_62.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_62.png index 1bfd8d3030188d296f4f45b76ca11fe5326cf279..c6d519fb4213bad5732a8cf9668a6f20acebebd6 100644 GIT binary patch delta 741 zcmVNor#eP&p9oG=)1vi?fg@ zHWugZL?prFyq!z%W;Q!JkHxL=5UqU65ARbv?`r_sgC8Pf0DtfRW)45MgU%*c{xKfF z(gRm^x}96}$ZDw0hWaWs`1eRJ+28B+w$YPG|108dME*Y{Tfl7Dcozry8_Wg{jPCL$ zFjeDC2iLSdf$D3~5!S<=c{1AUQnxQWwA_FHWi8h>VOonbPo?*r;KA{4SRgG9zKW|H zWoltk|KuO_H-F-XBg~^!;*xfCEI{RTMt=@l1k6U(7&FH$&#qzK!Xuqr zy+z&v7H<5-`UymUUs`xRq5fqIcrhGc>HiR;gdPu}aFC!i?4YkBSRfT`BgeFbnZovV0DSI?RPruPHE&*$cC z`==&A{eLzBqAu8vzE1%Bs)OkQ$BArrN77KCR1U_nY2}+3sIUl7fQDsLQmITD_eZk) zKA!?OA0P+yyKhTUZ7hwtnXF4%djLK+04cT=2Q66O{5*gUYsxN2yY+2X8g&Pbdyt*EC&s1` zGl_A=nG1Iod%%MdfX6D$E0>Q0-F~*#P**ETYo{gIILHmOxYafC1hDw2pA)bRti!U{gF;00000NkvXXu0mjf*TG_5m7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000G+Nkl1NgPRk%FJWfxDR@*X@Ix(*Ab-HHX6=f{TjccK&GNlh zul^@qzdi(L@VarVgLUqTa51C%z!4tchdLZX0L{&FZlCiAr+vn#*5?%l+AjqBLcpDI z_cE*+wa&$(nmkHJI9Ag$V)fGV$i`LzSPx}bb?^Q4-}n_T9!ss`ftP4_ZR*fGx^Q!> zh7iRz0z@p5I#^F!wXS6iHCQJ1ZX$9>n$<_%KUlEU1All91VXZS>IWa5wYVI@GM@7Q zvyiMFddCcuRsjQ?d-cqXRs)fTiNn&W_{>?om$VX|J2GS~;e+6kEqI@^LQRfUM~jTi zL(o83eb)Nr9zb$wmJMcDp|rk*1Q{;bx)u%(RM>OFlcPy7fQFEU=J83J{ic}RI(pa+Z>Tp1ffshEgJO|LqBV6y}7|+SHjH3|s z7}~t3Ts$Yc%p1B5+4#Hi9H0U_Tf-iByi%m^KqcViZv(w`^{{*|GF-IgaiSinHNSrN zFkxA0o!@)EhXw{b|YpMo_J58)C1rie}8MAUVvlz&g2zCB3(s7h`;mbu%!xs zj5ybdhJpu zseeGmi>w*kh5#6zgIrm*Rg#B-=bb`pNd$mN2d6~VL!wGUE>FnJsx#rKerBN=gqr}= zVdEH#vwkk2n*nvWl$*D#d4dH;b)a%1ZT#CaYmNW^18|4yxoQenfyqUcjNYzTX8eu5 z2#T(6*|SCd)qC%=hiuKlp^~#3)$U1SG=D3ZA!uZtXMN9}Epo5F?{f}cQw%HV*(euY ztZPANWT^H6oDP!wD5=99AhMW8X|BOBb2!}mED}TsfcNS-d@U3Vumorh4Z#zct_iB8quD!ktMF8J~eD0X(`s zR+T(jR$2}3zI%`T3OR}y>u+t*Pr|P2{XP2lY*pek613*m=`>G<;oXnn z=^;idmuTnDf*rAc;9+5m#ogc46MqcdhF620P21B+`)DopT%TGS*UBg@DO~x$GWri( zC8X`?GuNvL`%=aTM`I2yE4WN%syDob47@N zNq{}0hfo!Wp4Ueept*7loW;QEAro3|0*PP&4h7i5tR@09z#U-Az!?QF34bCj5Bj}jULOKJCVR**;3gkL9%jAzNX6zmi+VZ9Th|t zsH7LheM=9(;{o7!$sl$;zgM>(gop!;hwAYp84VndZXOxY`0gz^XV%Jq>vgcD=kL9r zmdqSPf|)gU!}T^$DordKv6ME^k|v`x!!mX>!m2~%KZ&)xEwQRp{r~^~07*qoM6N<$ Ef;!O2$p8QV diff --git a/assets/dolphin/external/L1_Sad_song_128x64/frame_7.png b/assets/dolphin/external/L1_Sad_song_128x64/frame_7.png index 0ff0f5a3f07e452930faea438a187d446ff3d3c5..4e363367e80eab14f1b91a5bbe4dbcbae2a25783 100644 GIT binary patch delta 709 zcmV;$0y_Q33(*CT7=Hl(0002`twPcO00NjvL_t(|oW0ROh*fnI$MNs~|Nisd%^tps zAWpe>uYo99r07By%Da}7wTKoCw8|lD5kUwE3XZ=2s33^sgs!uNP%#T_XR~=1YcVZE zp-th`yG97rICDqQd!KXP{kfPIO5xVC{O~)6!#MyPTxfSXrGF$zmjBcf!T&#zlOWP3 zwfLtB$zxz1OPt1o9)Y=!2cs8)A&k^G;^D5Ahfw`2I>>VSck^Zh4yfDrx6bvx_*iqb zRT$Ou*jwqQGi(|Bg$2@L->3M>Ax2KDCOCVqemLG4VO|3(>GS%zHk78T_{D}qh(T9L_jG9weW6Te8gJ}QiC?YoPZV>r^`)m!AP;WJjj1_?w!P+E8|p@05;47eDM!kTX~EiCA~dPP&U zZJ6=#Oh12lw4tT4QQT>`Zy9lXvTHU6lV{b?&G6uz!P!@XYXlU<)s`DC_nK-w-BSSj z(#eXOxif1D82tbUf4eee$A4)8)He{Yy9@T~>j^+m_23FTXR_@bNqx1Y*`s zDolf;0Dtw%rleAt^lNWLmfKS)fDgctgL>VQl2jW=H@cauPg*+wzB2$RwiSmhIKj0k zfB+Vi-ITWLr>=CPyCho!p*NxzLkLN+Ra_2J6a5QN1#F2;JnX5z0_%z4zRJmVss7zt zonn5zE!+2sfRXC@FuU+lj7=lP661|GH#ZhLz&=3?0y(ffZDj^lXy3<0kl z$HC6Q-4nSkA#?9p@Yt=ujlH-D@a6b;0$e>r&&J0Spc**$n16j=<($;`n*d*q%M;)Z z@i|tl~Gvf8qepF*A0jx$DUfp|t{Tt>7c(bf; z2TAY}4a=sC=Fx?_$La`CEF(a~BPqjr&Q+@{>rsQ}SwX}e#H#K(rkV3zDVLqa^SHR@<%ung+^ z))wRdT7P*&d9=2n)^QY~S+qBbMKCLhNTurb9AF1lwuUuC`Xf{+?2!fKZGRf*t*f>3 zk3+@rqeYzR%0Sa)VB{cP67}A%5dpI0Sfx>_8!=gU&U*@5BLMF4xAr#*a7zPxM5zQ+i4J0U= zBeh2dIFGli+@1t-7@kdSP&R78#?7pnv>q4WalqC9p!4mgL}a z@qcVpfT#M&LURZ=0VrcrSw0-kC3G23#-+l%MP|j*#EQhU;yz1L>}}6lt8R7KBEI-BEzkL4TS%O6qU~hzRp2%{4f(HL^89T@?l3cuhx7 z6twP}D*{N9ReRD5cyoeGt`Z&3RW;uH#ym!g01(>3K7j;qj5e-PCyoSGLU8l8Ca>Ya z86B2X<3|eFXKIE>uxuPGC3mb#Bd3Rys?&}LV7`H1E55Jl+@1wb!s<I9Kfp(CGhGbz}1c= zx}9kqt;P2B2^ZpRKSEGhD|LMaDu4P9TqUHf>1^=o^cXi$28x89)gcs;7uWAr8TeR( z_ny(yEAf^CP$k|>WH*+JToEEjxy_0)FiW(kz5XPDS}51RErjbCWTE9I-i{tV3UGv( zNd)YGE5KF(83m}imNV3fg?h_YiUbr9DnL~rUKy##(UE1e2NABxmE;m4B7Y~UpG7ar zwM?6snoDZ2bJqvL4LwKzYC|)dED>oZ0kr!y!%D``^sziUv7qWGeGxzl(~+`DE2qv% z0*hx$WupYi%enbAT{4*R=iw_Vh$>J?FFf}xJpfMxfa4{HShas|FNBB#jYjoEl8Oe7 zM>o$L(evF~a%N;z;PpzFX*;m8(UI$A$;^pJkde6>uBU-gX<}K3rL>8bG!>;8o?}HL cZ1++5557TsLBim+oZ5k!L^ zUc~M!Mxq$q4bkpwc4i(AsUVeJeNHbwp659{F91i^>&<2*Nq>^%DqR!!|2lFqMDJP= z|G$FlU%*`L(Dr2jMt*(lA&vz$=yxIun9D4B*wn_A$Y{VK=n_E!4j6kOImyPs@QeD= zcF*LI6MHrLO|Iq3?JmI7;Tzsp>#t=Ew%T0_^onQS0e6hiwKOT&?v10?81u$0TmJmPWS%Sxrkvm@@WtvW!1163%v+_; zi6YL!o`2r30FWC$VgVi<7la}6cInC<3;s47z$(@l(|PV0lVTm1S8;-m?j6Pgn8e_K zYR?1l+lirs3&t8_{K#Sc09!=NCl)B!F_&YGQy zzu*Cv!b_OO6Me0(tEN^_Q!wE^q=dDvE}bQ|z4EvH_RN_N9M5+?Jpd-}kHxOR&$fK? z9`h{`Me#K>=7MTuLMt70b*Mevw2k{dGewWdn}N9>FT#`cOp-RMrnK^6B|E#60fZ)n zsX|ceAAe{{8fZnTx&zVND(aF7^`)vi6dF`DNtGm(?M+#JU+e++3c!Kdt&@@zRMHQv zHCdm<(*U0shzYTA8pZGmD+y$Po86gP*kI;ifL>$+=tGd)bsBC07;5;XDz(?%mBw1{ z$yV4uJ%rK|#;AXKUy2=g%|`&EmFe7COatxKuw7GAFYEQePm*jF z7ZE_6r+0h~*fh#nAmL6wk!OG@zMw@$#rhm)i*&F{Dz?Wlt19)6~ z4BH#P2-o^e*xmph4-mul2Jm=*7`8Wn#{qTDmpS_0{B&-~ zn<0?aNBLwM!c+r5Pd;_u_4i8CdW9_Iql!d6U-P(djfU=BrV>095%Dz3={zXI8n8 zO>Gq*8KOr)sN2uZZKiqvR8i6gpOVX;k??WzXU?s;{eP&@Q=Bt4O;Zw=#UqGrhUYZ3 zVQF-k*^@EL2$q(CsN!1#qKnTu305P_JcSyhkQ4Pr%Ns#bOhY!QAf}W%v4GOQKw7I-SAeEEZsQD8OUCVQT(a7u)j)wRCBhq(R zejRM}0@Z>MWGj4x7w|O5C|#wcWvK;Qcz~>OEbF3X#VsQTF0Xyq1IjPB1AO&b%0r`T{7T zp&+x3%pEL5#`8|6fPyoI$i|KC-B)NEFEzzH$)MypG+Cxs0U4Jsl@EQVZ5|C5SwK3R znLIUk=!P3W)`my;pndigh}?u`%$s5W?FB^}gGNAdcNC*bww1=y1F}}SCuRfSl+69i zMt|$Zx#}P@qt3>NI}r}rfe;PAs%)xs8gpAdSqtm+(XDab+d<1lR@~?Ka0lYJuIoaS zYEizVfN0~THwQPbBu}pt)MQ8Gv(mJHJ9xmFky85jc|J$^RLJN;wRhYYX@e>v2I`@+ z%x_sU!ZXbSAi}poS``U@<~ZZ+}7JSBldEXvk1Zdt$A;xw$MS$D_;$jppqv zUJyMfum_-!1kuK=1RAD1UZ&DTJqK6SSn?awm?C%p3N*I2*wqNEW22BxGV+Y$sTzCh z0V=E(mzhwFMphC!16-+VrDMkx@;!iuu~e2>_|Ak!sVfX2qWn@YSzmP^x-jY~xPQir zl#tv3T!N|5ph@r@fa>!#s`0Ul5zL~qB6|8!nC=2-JF%Vyq?GdtHv?Xo?zol;Q)s)u z(OMH?WPLpn(ROUsTBK5NMC`A4A(o7|`&~Ujm92U;>e;;AwTK+E`J7aF*7jpNu{3sM z0+r!mxDt3)_MhoZEI3QyKaR8tWq&b(tOZM5vO1@R_7KqDkv8oe;N8!+Byfa+D7YR% zHhS(Hp=s$Ut(Big=2FVr{?EXl&%(7+tbwB+u^>cFsmHGI?45oqKV-fPncegEs(=i4 zhg@(}jOs=7#%uFw`4D{<*{2>aDfiI4r+W`u1JD#_Vh(I(g?AG(Hs8uuQh$af57IhE zkQJWaLO{E)NI1|8X=Pg#F>p&oV^JnrVa)2C{Ca>$qX!w!@rZ_k3@;Taf9u$aNW&&0 zELw5aiIGN+HHq@_m|tGxinV}@c@9}3fDkQBGk ml5A8B9p&5O@u}TEihpc{mk}{*!Agw)0000_92T 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 diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_0.png b/assets/dolphin/external/L1_Senpai_128x64/frame_0.png index ed37723ac245322aa254e648ab48da409e7e35d8..7390c84e82bb25fe6300e1a60a15d35740436efa 100644 GIT binary patch delta 794 zcmV+#1LgeO4W$N<7=Hl(0002`twPcO00QhuL_t(|oL!PnXk1ksg}-~}W#%QKnY2Mn z49r+VbXh@Bq-I{QYH{Vhh*?-fgjB`SVkPf|7D_>BaAmQ!5f|>T>v8Nu)g)wpi|l7FJ@H<%JK#Elx3t_VTbq1%|I|uMm97nQJlL=wuE+7&*CD=T zN>mTLZSx2G#eZKWQPh~Y#4Aff_OZ1;4j$=?#8M8j|Li7x?Yr~ma%yU}q_8VAG>BQrC?&JIk?^Phy}1BOeVE8Sj~!lT^{UW;k0{!@j%z z+yDU81YFQzfAuK?xPX}TDdX+QHQq{_xcX4NxzN&(cYo&KXYdK`2fg_`dh`gVm8f*xTOK$(x+t8ZL&M|f!gh-UcT=;SPzKW z3IG$tt@l>Z6>MKb0B)O7l_YHx3v!YKKT494H*&4QrmO$MO$6A^>DDp}1d!P5<`xS8 zk$X^*Hh;$}r=+6P^j>oSwSanSMtSv^r1|T$6H-k&V|}~P0_>sW!90z1Cn+q~uBej8 z)wo-Bl2h&I532kww`L#h1*O1$6~6~EyfE$5aB6NC)heMfHn?0TF_BHx@cckkD|0y8 z5dpmpAZ2IJvJC>GzaqT+$(+6F3ZBX5%|wT>uz&g!nVC#e2P?Xmj3-ICQL}WOhJD}| znSh&k@AvK9&!A5pFlMrjJNrdVcbfX!%?^*R@3?9&7Z-QnTh73!2^UsuXn6*s?h=68 z8QX$R_Cy`w(kPhNJN>0SivJ{*2Lkd{;@b<>4dVp_DL;t<){dOAk9gr;%q}7a*z)kd Yb`xr$@<7GnbpQYW07*qoM6N<$g8F}v!~g&Q delta 1752 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 diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_10.png b/assets/dolphin/external/L1_Senpai_128x64/frame_10.png index e385018bf6531534e1d809b371b0172361c657af..db0766f668ff189606dc51ad6a1524a05369f46a 100644 GIT binary patch delta 838 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 LNkvXXu0mjfU7&LK diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_12.png b/assets/dolphin/external/L1_Senpai_128x64/frame_12.png index 9f8ca7e9b8b6ad3606ecf7c2e24962a2a60d1fbb..02b5c78ff339d0988c55f409182cc10fce603302 100644 GIT binary patch delta 824 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 LNkvXXu0mjfH)pHo delta 1852 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 diff --git a/assets/dolphin/external/L1_Senpai_128x64/frame_17.png b/assets/dolphin/external/L1_Senpai_128x64/frame_17.png index 11b247eca27efdf52b168912f14183521e1c1b63..e92acac9ce2298c4d5e1e328af16205099c64957 100644 GIT binary patch delta 869 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 It^-0~f?XMc9RL6T delta 1682 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 Z{tJ^g&NNy2D|G+>002ovPDHLkV1o6ZnzH}^ delta 1876 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 diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_5.png b/assets/dolphin/external/L1_Mods_128x64/frame_5.png index 7c293b4859a18b634ef661c0b206a41cc03ab31d..0162f0da0a8c8389817698959ba9d14c16aed015 100644 GIT binary patch delta 668 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 literal 4334 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 T11a*?C&S+Qh*g=zsSE!Hfg_nh diff --git a/assets/dolphin/external/L1_Mods_128x64/frame_7.png b/assets/dolphin/external/L1_Mods_128x64/frame_7.png index 5c840d6f642fdb36967d4646a3d3695ec2a12da5..344f02fd161284f6447fcea44ecaf2e04566c4b6 100644 GIT binary patch delta 642 zcmV-|0)74KA&&)+7=Hl(0002`twPcO00LG?L_t(|oUN0wPg7wO#eetq0Y%h47B}rP z!CC$QW2@lifDWwS=H_S|q^}#B8Z|Kv%3w@%VldI*KpSJCPP(XxiY*Qj64RncTUvS? zUQy81JN|}q&v)*3Oza-#|AI9$vtS2k2td85zwSV%Neuv`N*lVm*UnY}#g(KO4?U{G)FJr%C-t9xzq*wQDVh?)g2_pt;QwWO49YnLO~hZw|-?Ku833ZhWE+ zI95#AC}16`W`=5#8j=dCB_Xc@_W+nLnwhf%oP`jg7=LgcTY7mAt(3#Wd-s#tOYK6p z0lAu_KoL~$p0o^90K5x4Isq3#CR%3Z9bnTU`Xgpjl6)h{LdVhsY~_<|`qyKd&Esee zci{9w%rqFC5KqUDjgv#tOv{54Hk9gzT1+tp+z+dDXfHU-Q4i!60vcgIgaEGMfyv3S zCjfOS-g^zU7H$GBp-DErk?XJyz!%+VbS|$*8E^O6VwVOsQc(9dW@a{C{;r>`gJx!* zBY>-G!&klzs{Z@VVR1jL5P%W@$KCHXlb@EW0I5>n?J4E6l9J{)L*IMA$w(@(6{39A c%>JqRFF)iUX?-wiQ~&?~07*qoM6N<$f|^(?0RR91 literal 4331 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 literal 4352 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 Ef^IS|s{jB1 literal 4360 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 diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_0.png b/assets/dolphin/external/L1_My_dude_128x64/frame_0.png index bf07d03d6e633a1cd9725d181b4970b96d216058..4706786b7612da132164025aa6b6bbde592235b8 100644 GIT binary patch delta 800 zcmV+*1K<45466o^7=Hl(0002`twPcO00Qz!L_t(|oNbd`XdG1-hM#lhgq@Y(PGTtj zgzQ8VgYhC#iUn&krOCBQyBHBk@Q;cY7DU=Y(;f6C-Ze;X6bXokBm}*YiXq9S6|EF) zS}Ojux>K4`Q*E;etutw6&gaFZVS~PR=X;;;J%^9)V28(~QGY61!J|QXr>7gwsBf85y$02u}ER#mfz-SYVKQIYraF2v)`+!inDc~rn@J9xDdbn z-153VMp@*|8*8(&OGHG9Wi<}md@+igxsZ|9Z9#vzbx*0NP2Zf)@=bBH8VBwPuABU| z4)5;;d_6g_?SH2VO)YLV+yfmK%^ps7pT$fq@7;EpKRO;V6Wld?R+;|HZh;d|X*F*3 zYVz{Q>*@K?FFK1;H8YVpw@3BPIac-s7o)(K(%OBCMWH)vS}0F{JupCjsr0N!T0QVx zcIeu~ZL2iz^J5p4yR8aS7FRTcV1ORFT9RO7P74S*H)A{oL6rU>_Ao90kNk*aR)0d3;sTnshb0iJ#HIikR9+S2pg>Z8 zDbDWROU>;-4e)_Nb+*2;;4*}!tDe1DtgN@_R)FO~t%A!C&~XHyAOap0G>e_HB2q&D zRRPr1jZhEJNLxL$9aK&O>`)>pxdd9D9=$VbCn`o@#=fsl)=5$L{8uJuVe_|6<~I{M ew;9?0fBg#@!ee63lEAD00000%P|R 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 FV1h~rms0=$ delta 1632 zcmV-m2A}!H2IUNp7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000ITNklLQ0%oWS%_q%NR?8O>fGC-8*Wr(47cToZARBx6!xr$Z`m3AWaTu%*Z(ZqZ82J`ebXn#Sysg zR0)ZDNX7>^^M43!2P4VnVNg?Cv5OwVpmB z#4!`yk<6!!=NapRjXzTJt@hG&1{u>h2K_GW5->QfVSi-?+6Hr*3_JmW$8iTAkPIM2 zx^%S^oE6CqW5xH&Z`ibaj?P1VvfDP?CID3W!& z@MMhs4C_&`)|!l;KD`7)6t0SF$=H&NNV$kOfH&%CAFG{rO(M_&QqoVe=a&k`4Ybsx zU4KW@H&>D(?IVbc!}ay{v7FZv7`Q!cXU#*(4qyDx8c-Xc+S|Pg+sEY`)an-L!)I4MCJ0bB2{GHSFBMIUrS83oooTZP8ku{>ld#w4* z4jN7`nkfO019(|F#R@}uh~-n#ekC}r6n}N*&mCzjI$nj2objt7uyPGoW&{9I0-_$p z?KLfACpe4g-&KZYjT^BU0K)-RVAKh`+=RBRUUcrvB!V5X&xZ<$ZoeX^nlN?*?_ts| zHGc(Xitsrz1MIZb!RU^lok`%ft8|hUe#bQgAm;!b(K_ORXIoT-JBOH^I7US#L3Q6b479s~EqgyiWD0F4o#pCas@+rR31I{4Y!fK^t#X%7@ z{tl;%6g!q9(E&KjX8jq5k&J&w1kzxkS>aB7B&cr#xqU8|5h~$z0_(*GCvWDJ(~W-C z=3(9Qz|)Ve&*?veunow4?Ys7JM1NC)Lqvv0_nAhw)+U10*(+260PM+H3+9b*@0Kw` zU?trmSC0ce0l(h_dZ3-SNu@#BL5z|^&!T%HX=LXi_0LA}>I~p^02;*?L53q}ax?Jq zgo<(_VaCDM)(-INq%3SS9cI&~)i1J$)v0^LfZKBbfc(#oG(;RhD#-scjcWkX`*ci>LrXER5L1onYgK}K14B17gd+sGM1j%+*C48Wy&$(R;Nd=j*U ztl%6w!F(5>-LFdfD=}kdQf2(r(GM^{0`Z_8BDhP0?8NwYz{vqL52W{7yZ(~|%@KCY z2BWy!_@mJepkx5+Tpt_#34f`-3RYRXTbC%*65x5cBRRs8oxno^cc}YWJ@A+(2jC1& z4_zeSc023{Mo;6ivLgny+H%jiGRw8`*y=bA{v5!w1JE$)p%s|nc+y~~;=Ag971Bq+GZFFp5xFC6xw2U43{pAvAX%cvmJUF%Q-n!; zXhtUB$h1_Ntv2Eq5PTPq#SXk+H;nE8Ix;ePpJfg}74Tw(vsC_~=V`db0q(+Idy!Lt e|H=VgT=5UvI9v2Q-}UfX0te2%Q1q-6itD?#q(+ zu)eSiPDrUvvanBl87ChEptRcn;Qb`zR||+HvY~5x$j9n5;H#f~&@0*!cY8;FL?lS(>%zl@a> zHV_}mHInJ957-gPz>Fc9#2_i2Cq8xrdna8VE1^_ZhD;mcn;4vs4;xC84WJDZ=Msyt zGs;k{!0kzFqhg#;Y5A?Ox1c`ngs4~3B{?lU*5bcCu-MO&6xZc~Gioq^EI{b6A3fVxWj)s5_n-e7{d{j47 z+{)8%|5R;_Ty7{swC3_6Ui5MXt7v+AneBeFqeOC7l4#8}V3z;_SsF=!c7;q8vH|K9 z)d~QSA!E}fmIrwN*1b%Xat&0o34q~{Db5&DS#o;BT`#IbOLDltv*Q8D91!<>*d>~+ z?!jEm3Zym2xxg-xdFntihqc^2d6BVbil{DSfV8vn7s}A*m8w@b4*&oF07*qoM6N<$ Ef_+;gRsaA1 delta 1035 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 DSF%2M delta 1091 zcmV-J1ibsH1Zz03^e@zKf4d9TUGdwt<%(+VHN`D*p-!pB;}lQN+}=wpO_*faqt(*zFFJ| zMISs9;NY162R$%FNaEm`00*5gMM&b{nE(f!Fhxir8sg0|K7Y)?B(62NyP-!D7}w{Y zL^Q;!(GqbE>gZ8qWQ0QC*WQRpql3MR+PRLh?>+(W7KtRQ2|&Gm#8YHU5t4|4H6g9@ z;KqeMNN8Ey4(Pd}iy7DZEZUQVNaC;7zZIV$k_doM9Qc}L9t?@??dtO*cR{8lqC>$eN$g?NLnFnCx5`m`Et-;SoU|14}DSbF#)i7 zi=#amV4WUKfO9c#f?Tl(;z(m{!!<|9)0`Jbz+15FSfW@9uv1nlVa#tNFrwMs@V^ z;^0krTz{x7dW~G}W8#)Dv$pa$m%<}eOzcmBABd0N0wkQSu6T*~m{{z4)>h(Ent@Yi z&o6rdSg&~Lrjs^qGva2zd0Oz^<5~6Bz?SHm#bf{8O@Q+%Je1e0`LE@b^XIGzV$+O= z_oX%sKD2qK;^SMu$jWsT#Af+6BenWh>YkklR)4(Iu=y>Zg^|X6ujz8m)jYh#ANe(J z3OoU%inA8K5ZBAWy9r<(6do;j6Z=n~r}&gSa85I#OEdvheDfxdm;e#PhaySZjA&Bg zTO#{8Km_seijg)?@ztA#GXbKBkI9xW?#h*FA}wCop8-6?ht?8Wq7kt8*sPmdg6k;Ue=(^rLt+?>KMH8q`07_9k(mce+Vo-&p`l80&X#)Jo`wbJIC*Z14W4&qu zyhZ$;SR-4Bv#a>8o&Z*+DLOU{9`AC%6=U|k8gj_7w33HKlXLWG@ecF9aWS*OASp8< z)^O#1Ytx=^nq$9~|CY}IqP#8aBz|+z=70S83?NYyHc3&VHp6b>W4vK->6Iuku4et< z`ygtV)L3r$3XHl|K7SzSA$Yk-kZcP7JX5` zJRjczdShyN%rvn0<@k>#eyIbC69ls)q%%#7JDbk@uZK19y?qbQ$H)62Npq?GP&b7J`1)Hf%z5uJW9_myx1_4eRb%(5Z(S{eBUL& z1gjC~$Du@*KfL~Ff|)!Y0f#Fe{j~Dt3}B9~MSnOu|9Ahv{GU<4duG zys5{*%=eDpdWFgXLhLBOdzH$~kgdhVAn-mrG(JY%Pj34(BJ1!*;xY{VR(a$x76ZU* ze#r#2PS2^n&e|*q-Y5)E@`e)gEgTHnfB03PrN=G?%o1D65-;|%5d h;T-nsQ%C&-;9v6Wt`Y!2{I~!B002ovPDHLkV1ia4eC_}M delta 1488 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 diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_16.png b/assets/dolphin/external/L1_My_dude_128x64/frame_16.png index 4940aef672f140208fe297416ee0b00f57fba0c7..8e906e4f4d5a78261fc0d3f4d30a15ce9bdbea12 100644 GIT binary patch delta 727 zcmV;|0x12u3F8Hj7=Hl(0002`twPcO00OE>L_t(|oUM{iXcT7{#((elt&9oUp=67P zRz~!&&3fpif`3ZJQXxbSE95gGEv|x)-h!YPl?>7z6pDfd0=+DOk~pIn{6|EH6AUQr zr4?7VCFo+K)@)i=lw{*hXFO~YH+%NGeee7Gp6B8HUh!CZM1R*^R0v9cKq5Nf){6c@ zyX2!nkcAwvG-yO$2TKWw8wsPqW%i`Il&B^eh?!Fj#H)`Q2o-`=t|Mkw%r_PaPu750 z0nrya7oR{~(*HgNvy#m%YD|6#Fx|4KVOF4G*11fquh}X+Kdrl8Z3*5d9nN5tQw6JB z=Q7d`cJaMN>3^4=QnEg2;j^LWKu{x^j<|5O(g|C~L1{8p4xW!|i1IGVH$K_n6K@^& z!72GDO-Bx*yX0Moe`*h;Yc2s)&)6CW*B4dS8xvZl;IErwz3vak)SWXKa8HcztZz@+ zf8ndc*K}gbXaJ@3I?b21{Qe`UhZmN=1^I3kkO5QLu776-|8!x)XaKU^G9o{D;CmZZ z{*wi1bz7$Pp5K{J-c0xPX%LP5Te7L&B-muPMVR8@^rv*ibT zo=Urh(sDn!PYf8-wwKg`?s9b88}&wU+?UW=E3NLOr(LY-^0@DKcYyNE$%n1y-2JO6 zlD_@Ah<|t#K5xrAKq)AsK>fUWDASR1fPek+>tZM#Mcdk@pjxgGzB!a>-FP~GquY2i z+*1t2Q}#?|QSq99=U{z*r_Odg&ECzMOh`>~p ziEHVLMnov5Y(V}##O5AUh|K@K_s18B3^2S)22f0ZnJmT-z@#K`;xPvw=>!PHtF7z< zw<%X!+;6O95tM=&@Dge2UlGG@sG&0=E!Bg?>M&?hh4}wV?*PEX6i0S{DN6tV002ov JPDHLkV1lTgW>5eC delta 1202 zcmV;j1Wo(n1-c247=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000DRNklyJ0VvDl9T#;yrmjwdtR)0mnknB7!gn2PX$>Gh{Tetf2 zL#eeE4dSS^ew^#Evc3hv{8Fyo{2?Dn9p?Gp(y2SVU{IVT#|fU0leVtib-;Rha#>BM z_~BZzm~T-ZJP&KsU~R3n(RlYBM=P(L(fyDoyni(~9uhvIdS>H)h8#c1^Zz~ra1U`} zc$uydgMZ=+#a<0fbK=;k>u3`|_q}$!RHPNNy~BEPSvG-a0`vwrz2jFz*fFK&h>V#I zyW`&ipH778q+N1w9a!+pbd7OT9(YYMo=*i;FTQ4>^A0|z#yuy(s_EEluG#Q&k&RFa zT_5HYJ^^+~;G%X+=ggLvK3Y@T3=|IzC4uX=o`1X=T>hItZpU+`k3`ny;l#Dx?bt{XzB+02_cgSl+%o-Luw#VrS0P{RJiR59rMxuS@``?yCs- zntTSpu}VrKKF-J8FCDvZE$t4(*CqKi`hRKGQ%#!I&ioc|q6xU2kDr&^E14vt$z$<4 zi!dMOeOAYnWK8e84yZB91-x(eOuydR{EML#lR9d4qGVkQ)3ILno!HsN!d0jP8f$EsORJOVdy2p!EaBADMSfJkRd} Q+5i9m07*qoM6N<$g7Rud-v9sr diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_17.png b/assets/dolphin/external/L1_My_dude_128x64/frame_17.png index fd910ce5a61c659c7caf0486f2eef29eed874edf..56765ecb87aa952a5ae450d76334336099c8fb7d 100644 GIT binary patch delta 802 zcmV+-1Ks@h3ati^7=Hl(0002`twPcO00Q($L_t(|oMqEZXk1ko#_|8TIg`wX!YyQq zt9JZ|4wHfj1?@t~6cPlh=I}DYhFhP7XWJ^oazYKIgHVEyD}=d9^EC9&x%a;P&{pMX_o(&(URTb&hP0X zI~33Cfc8hNqZuwerJ!4g^K!@bj|g#-06HSP@I7!|?nHyb7Ha|K9t3c>9Mzis0^U8*L@IGCM<+&{A* zRHPYB2k_^y=gI?HAa#0EM`j87I&1Kni>95RSAo-y%+?KYcFr%QFN)!!@$ZPS) z-H)LK2a_R$a#6W7bo+P5#^KBcRG)W2xarN;t`PqHy3ghICP>#Q4}c(m{C-ik zq+YF_8iL$gF!AC`$3vmA_gn*e_lMX!@vSg&eoz6#Y*>4ut%lGe_twpl@Bq>KgKSBa zQJ3C6A%HeUTcMmxx^MEZ2WSy`Nm;iO z=WcniVRA;e8{ho$Bl&Hm{3s)cu%vWD$<P_EUTsoGBu`dc gryKKJ?THWg4|3v49GJOyyZ`_I07*qoM6N<$g6vU}GXMYp delta 1392 zcmV-$1&{iz2KNe(7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000FkNkldC{421dre`X&NQi>vhZfvi+YD+aSprb{@c#}597_GJO1UqqR{vB<*LJ$#l zLOKrPbo?;BZ(?fvULonz&4F<`-d6z(b|Oj{UIn<3g@vPjE`P=8JWkmD{h{^V+moyp zC*$tDxAsL$y1&mA$ciZ16Ud*$SCQX)Z;w%cXuJw=Gy4ScUj=v-;Kz4W6Ffozo$3()S0MYqW z)$jIqfGnKap?`DjvL+Z~jMF6Er3s|XVQrG^=A!I-2Ur06<9?2xTS=@Y|EK~;i++lH zh)M;RwRyY(%p|eBEBR3hpsmAg6~Njw6e(4Z#^uScS^-qw0wzw9Uq$rHlX{jxex&6< zjaR(~;1)TVR5Yef%5TM{;QUy4!j>9eeh1J5cd7|Etbdd#QsFB3NPQDHlYw>?3)?F+ z0YwJ&JcG2Tb+p#~CQw?`$Q_ae=xevbsW}n;Tf2b*%ph^#nw`Cx2iHGAJ_QZ=yZoqp zA^F&5Hi7sK0E5CwNaT%5dIjq|4{%NxoFd>gyz7n6pMQ(Tr2sg2?GBf~BXd`QwCT0-uib1KC1&pc(>WD%2I(Hz$^y(^(r8>$Qq3)e zmrRoaXq>}w5@eiR(cqL%lOO!Nid)khQ9B&_|DyoA#bFSV;4?_Cl7FusDd|?_@H7KA zkNg$@opHfSp5KXlFC=I51U_!H$|0F2wqtyK3xD9S>ZsLo52+{QKf;G4f6A|iRE*vD z4>xHyS+cl>e2KhW8BzJS=2KK|U2gp6&kVsN59wIOG=3rxy{2WSN{?S}ong+{@2>{n zCY>fdL;k58y|C<5OOr%3!x-p2faMIiBk5Vki6*}pL!`o5cp={ePDGtS+TgMX!ntLv ziGO80y1tRk&|2fa1yqp^=TI?Z0Pn;|KV0)t@=pD{+J0~_+Mu}NYR(atH7R z2a8aB-eOsmAoC8Qxl>i#3DgSUAs-{V8F16B;-H9%ih(0r;u9aQc)Xi0jRHiHze+k2 zT+yo(N>dN7yi3;kr2sGpFZrv^89KoQQSjQ{-sKmyEL%IupIqZ#Xscy^1RupQ!+nb+p(u&J~ov zLwvUUmlnPXl5B){t zvx-}*$h+sFI{-{>l{6mDJ?ENc+J7;0uYloL?0>Ec|LtH^BFT=W>a&U)+g07>d<*%% zo=*j!7R@>aJc{7GJ5YtPV%GrGcPq2Cs~lEMjE5pe`@YvFZwO`cIN&HUEd`VMfS z304L6kcC0XuXR2KbvNOBRFTj5+kOk6lG!5NxQPK#a3d7T=)$J&rDmv>f(>?p zih(Q?aY~U!Ub8XGG@YS#hH2)_JuY6f$ypx0^Yi^j1^hqimVX9io-7;-xZ4)!GPvQk zlOrLhZ5g||?9AwE@66CkvV(B!?#*q4{%K5>A3Y(w18YOkfe26mYP52H|MBnAx)lFM zc$XY|VWyB?PYCqSIi$RC`tENerYmbX)Qwr&3Ac!JGY7=(VttFi%Kl# zCLyNnbPj-el7FG3z3KzV{W9R1iDy549{{O++Xl5+`s|%V-(Ce!xsvHS>;uGStamBz zKKB~#J^(uTj=pw9Wi)t2fR@vLyz;UNfD9UFJU(1(olDyKS>VCC4;>Y_F_}gVxce(x zT>>Hi_lTc#$v~6^qFU0$D^4&AKnP@Ale=kblm!+8nSTe)R$kWwA|mqMq)5{s!CYa_ zl!(~&pj0Jr2=W6l0PRDCTHzJ!949;xk#4l!8!QNuS`C^h5$WEmz@(^eejo1XWHiK5 z;`XNv_lm7}U(9HTZ3qt|RlkX;RW!8!DT95>O`kqzo+@i-r$XQbH&hoxr2%>j&{75* z8vxOvJbxgrf&Ci*QTEk%>mS84;{cqx?SpI5&E^Qmm>%7D#(*+IYnhcYam@0;I?)genJ@2VqWhnGs zci!f!Tbo3qA|lrBUkC%tq?E@Q6zO)Enrfb6Hjwty^ol&TPPJAIoRu)Ydqc^zXWesX$vd>$pJH(Cn5f8dM_ z7BgD~>ZrY+_rV16<)0(D610?hbnqpaN1ZHXG}2x87iHLO<=9pkSpWb407*qoM6N<$ Ef;;w%(EtDd delta 1448 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 diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_2.png b/assets/dolphin/external/L1_My_dude_128x64/frame_2.png index b680b4ae056531ee8bd175189eab581c3d301064..007419deca462a5e35ad4f512c89bdd1e94b38ea 100644 GIT binary patch delta 796 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 delta 1427 zcmV;E1#J472AKvHTM2sW9%|0{cbwCrJ6KyDhdn{TG$dWoVRAewD^^xk`$gyT4x)V)?0Y47dt z!7t8P9aj_5dvC{agzF#hn4$n9A|7kq2S3#v0{K@E3|`<-E`J@^K&Nd1+Tc-w9ygx{ zHqhRCtq0hFoW~3Bpq?4>95%Ew~rT{y*f55jZ37)$Y zltY^(TL4y$h@yNekzR0CKU%vI1)!wTe3n2?X-1bq-v*1-vu!h1!PP`pfm4oMWSap> zzURt3a{?0>OC_o)SeQR}^WAtkw^Rb$s&x zw4=-|;C~%)g~#zk`_W^n)c&**TVWAV!B;5XYKsTVyyO{;+gfX<<*0!3c%f!Q>+n+z zPFAb?oCUAtn~rtP+fOwJ)biDU$>Tk4#+X+Jl>jUGoCnmn@$y!75mbR)cd*Dc@Xwj!z5Rfg%;3hr+<%K+;#;d^1U~rTCCvd$9xLFn7Kb+ z8I;Y2X8D;pM>%W_odUGzvC{o}j&%`5!zYPZCyEF%Mq|A>#qGJzIRE0Edl{4!$l3=M z#9Egb3vjpd{^-qKMzLO7z$m4kvjA7mS#0$-fVUPr<|9bgWw9l6ZpcgPW^$2t~V2>~ZS@&%1TbqMu`G4t2H3;XeN^y70Py&v8 zk3w*k&5j7w^h@1H|WEG@h{Uj2tDVBrv0Gg(JyAsTZk+fSo+=pb@SgsLY zQvEs76#VdmF+8r{TQ=IBCDOTi)dOhC@PAG4Dt&a{r{h>j_PTp6eO&~Njw_#}1RSvy zbE{f2&vT<~dXztDCsO`SIF9$rCHw=xmqQg}dM(}3=P0#$04aa8*1APwcJTm~Mf6&a zXKb#0)b(e^sLG#Kjk$t+&3ZAgB}ZJR6_w=Uaiv(xW69C{+smLzZC-`Q7KM*kR)1op zu_a5(co=Uy;jM@K56+ANid_+vQJY_ue6L&_`76>_3~+ZPh+w6KMrDbXTT|0Lz^4J? z326bPyeGck@-)Tu*1g|aUg80~6W5@+XAY5i79mddl~&rX&34z6$jTvr}%6}dqpW9xq zwtPsZ{@XZi5oQC%@mP|Te1N4NEKl$MgW8B3milNa{(*=p(8bLX&7&|KgUSuqzM5bqNrup5{kNUrX)OBZ+fb#^F?LFpTeS4 h&<<~TxNO(-AFZEaoRJLH2@C)L002ovPDHLkV1g}qx=jE8 diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_21.png b/assets/dolphin/external/L1_My_dude_128x64/frame_21.png index 272064d90de9f3269e52bc97e3391698c7d37e6f..20a22b06e603e9cd511f80eb1689ded06ddf1f5a 100644 GIT binary patch delta 586 zcmV-Q0=4~!2-gIV7=Hl(0002`twPcO00JIKL_t(|oL!T>YZO5k#(%S!^UjDQND4ob zfG8pylVeF$YbE^0OGi zL|rriu<7~~RzI5&0CQi0Qk1k2%qp@7Z0U6z~?wZVHpK^KeDj6YS z&R=sg#(w+O;@mZ7+@&S`zbgBJe3X(B8gGy(sBQGvSRx`DY-X*0;Ry$5faDp_cyj5D!IRUt@gsuTGg~Ps0rW3AKpNpi6L=g@=Y+xNB1U9?6tMFsy&QkBCgZ6B&A*8IFrR5#| Y1IhAqqr^&VF#rGn07*qoM6N<$f~jT}cK`qY delta 1022 zcmVn6fpW>tSg3Ftp@qPcNGxz^j***ABZyWI%tv)L=|uqw8;m;0j|Lg@_}%GE3k`v z;M)PLOPa8IOT7_Z`7-D&c7^=*x@)5f@QK|gzuX%dz#&eN@1hkP_=%I`1Dz_sTKwz~ zQyMt2UX}JPQGZmXltKd(co2PB7+$en(Mts@>*kJ+6fnT9(?5F#*8x^iL8JgB)D51~rQJ#taq9rqX@k>| zd+G>!Nk7w{6U<);yA4z#xM8%{6spH@oT!%uIL;(V1+UcrJ%VQUmocNwqd13!6G$B3 zb#DW?#1~N8vy@G}DPj&afQLLxvE{nX#Vcsv+<(>2I87?YnR;SyR2KhofK~)~xAj`J z$!Q&dlTJLH{&wGhe?0$60rmT9uC;K2dJVfk&FAfUyg0&W|E?5)r-<)8TPo_f_xBur z1g;RgP6S$?s!>jED+ww_AgbxKBRUg svCY~3-^ZVVrrM@HkGc<>HE8btUxr;nxd%3$8~^|S07*qoM6N<$f0kws=G4JLkz6|@!Q|e@ z;c~g;-QI_Le%$x@z9>6Romd{(5s_mOaD+pA2vWdo($D*J$A5sgX-h>WL_1EcDbYwU zB^o*`la$uLX^LWp0@KWZ>d8T8k`k-ko2DdTrjqxkfFU*lBN+Wo?!j&$8UeszWA63i zrEt=v9Xn0Agie58OU&MYz2$pk8puTX{G_c{Jh%e*={?q4y8swz2Y`$B+AGiQr=oM) z-80TLW}lbwtA79sW__E*jl274u;1EmDgI?TX|N$TfJ=;Rx9}`xAizItfGh^gD_(xb zUv0t=3}Ed0W+M7WQcLtb!ybN$o-X zsIrs>`X0Ay!j}@JirYco>N{Hhw00Sg29i@BB2FbC^`ux4#eywJO52YpghYTJkgE{y zb~&FsBwQn+BLAM8*qf!%CaEnA)S!^;Vp{f0c%1HaOMfY!m7Ya;*v002ovPDHLkV1fwWBTxVU delta 1045 zcmV+w1nT?n1fB?x7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000BfNklkuh3w;}YOtXhexi0Apm#`xKwD*d1-g9plf+$9i4K{%#dugzTPQ za8tm4j!OUooZ|h!C4f3kGCpt!0WyfW)iJy1tH&z>e-YK=pRLn-tu|f)=)fZMTZMg! zBT_(ioN9ak_vv-{({t+Nrfj1Q@ z@p^4|M1q;XTP-n1Yl_b~qXw|@%7}aQv_PE(W|hKh&0VBQ0T$tY2J1-BivpAcGt8oZ z1ZfCh8Gr62D5Ru6nrlmY9MTk!q804z^))#4I3RBrX+qowfKexK7173*?1M9Bqy^~j z-df;8Yg5f}1zC*GMctLtSSt!?G{6iNId~V5%_MDv5rFIcR3LuK;b%Yy0VJWHk|2r* z*;1FJ5^yJg#^KTV+GW|OeOvb_vJgR{*WCX**ni@{G=y0Fu&5?O>wRejP}YsA007`e zyZqBC4`*og#I@F+MVJg;uLZYf0iNE^@l4M3yT}{?Tr_}XuIzQ{Mu*7_;SywR02P>P z0FQ&FqNbP2YY|81L{t+s38G-00z3#Hxrb#M7=`{-Sb9HToC30xNh{Fy!V`=S7(NY* z%zv?*xvkfdefQSLXnep(19)Rso6OeZ?xEHfJL~o4Q>~(T&L4|<-`o2w`Vljd)YtV4 zw`#1>{NCp%*N8?75tu#vYkH7HsPDaJ0d)d=v+-9-#@?Pdk-!rvz7pmI4bR^-P}XWl zT?Bf1zo$4=&AW+4)fC`K0D%96NC{f4+kdYZwFuy4{GEGQioVlvoCeS$TJIs!>^e`P zdq9N%nGdBl>S&)UpMld$H~~u{FbgE1ztw2jMbr~S3oLa4fq3Q5g>^$^MuH3qe`%D6 zKyTx7?nf&HOJsF`RUGw?A=!-o4cI0?R_1%>=F|1SF%e(|QHD5~1b+ZKo+hXBI}XRW P00000NkvXXu0mjfUJ3La diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_23.png b/assets/dolphin/external/L1_My_dude_128x64/frame_23.png index 83d02ef88a821a79d41cb68c803f6c295e2935fb..f47a3d597ae9f6c3f19725bb49e47b41afb4870d 100644 GIT binary patch delta 597 zcmV-b0;>I*2;u~g7=Hl(0002`twPcO00JpVL_t(|oL!PnYZFlv#eZ)yX@?><{wWB8 z&B}%S0CriiTcL|gHpRV5aUlxoj2rz1ZiHI8l13#UxHQp%x)21xoi+gx6qQV9A+ecx z$HkjW)68bzymQYz_uOj)0M?6%0Zb00B@6%_Q=eZ4;KH2(2!Elx2I&|WYYb=QO=$E3 zbc9j)6+OTkH31(WOQ>SKbpRx3PwHhONs?3g3W3cvJb(m>#vVXB*BW<`ft2*+q4jO> zvR93Qk@{c{hLx#lll(7fV5RgTi;^UB(4>6ja@+32TOR=Ya!69Dk}b1-hJ2Q!5@1$W zH{KqKekR?b?|(wxhJ}^;x-~p8{}_NU3?sdn@Acx@mLwr5(oS=6&@6Rwz)Ig+tzD!SPH{R*966Gy{EwGVz=8x5ECI! z0SOQkG$XoIhPw2AaO}@D=c6SJMxQ2p0GR8P#~O_`?0=Wq9C(QXLib|#$7`^X{z{{^ z3&@TC^CW3Ic>M?Tymku}o4Y(gt_)3$j3WMZ4yvGhmtLVLy2X;LmLW3;gS=vE+R8Bt?{@iL+$l==}QJCVYYV7*R*kJ<=?rs6`Zt#`c`a5_Hk1@imKaD@^3(b=4SVki&IbVa(KcWd zl#b7`u=1GuEKZmvU*g0wg16vatNjimn=F+K5?cjRSBytJHn_ z|2NE307=IuP$!X-9NdG60Pu9dJ=scuItko;K~ojDctbS+PRS+C#Z7(FF4Wp018t8*DTIuO9GblwZCid7$DUOV4?5lpOIqi zwe@j+Ov-MewSq3s!K&QK0cJ9~BrTkFU_2lPg*4XI&n8Ho6%sh>z#8*jHJPF_f1X-_ zT0vkLE=XYRjIvzM=*pdv>&!75tfdaA_Qi!4fbE$-&wtd?@tpji6$GpLa~&3Cc-v_I zYhX1;jAm}n7Ahy`!BZ;`=KxXxkn61V^cpC3)a<3|$Btz+2t@Y)oF`2!$D`Z5)^SRn zP?AOKy`2gdB+v?S0@@3x9-pw#{{aL8K(geOdVAGjl+5)A;VQS;KIF=03xB}Mh(`8PE_{sNKN;U`gNN(~AO=8h z1UwC`@}Gj~gv?J^B7s^_t>uJN@p|x*{Q!=pfL(nTBYzZ7ov+URlZ3&qg!N8L3Rqc| zJ_Z$@GCyH@473mcTz0fZM5^wTNg-D1OUKUWD|L@>tnG4?184;Rm-B1j z;1DL9IU$DvK-2ly>of4uqov_y55S4*{11k{5~g|Kssx6i1y~?rs*>6Qv;qJ-?rH$s zN^t1y;2x6W^XcNLAO*ll*`MpXfk6EK0Dq?d+a{iNo0p0%2hb#cs}+EIJ$xcua)6%m zSDcr(g(n1oi#-6PCDnHHE67{I$r5b=9?HM8eWzCf7ZsodZpYLr%<1H?830xzKiRd@ zwv&UvRRz!t%2R{DRRBnWI#yaBZk)2Y2(niGC2bnXZ0-B^-0~N`<;+#f34MJ4015yA LNkvXXu0mjf{BP-1 diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_24.png b/assets/dolphin/external/L1_My_dude_128x64/frame_24.png index f3ac441781941a1119a8174f190ab3f3241c973c..6ca6b4017373ce90000f32ebff487c888e912185 100644 GIT binary patch delta 561 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 diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_26.png b/assets/dolphin/external/L1_My_dude_128x64/frame_26.png index 3836a3b01b8fe8582c0881e2d5ba8c6ece11d03b..06cd12d2cd5efa09917d62706c1def0a4ed0c674 100644 GIT binary patch delta 787 zcmV+u1MK|e3!Vm$7=Hl(0002`twPcO00QMnL_t(|oL!MmXdGo2#(y(Ax~U4CBBkKL zoj?zZAO>nc(3%bPAbKg3!HA&Mi-Lz#MO#ptkqCtz1W~IOwFjZ#f*y3;pshQWphAsS zREo4A(;N(_`zI!wZ_@emc-Yx3^gDgL-}8LG_kACv)Z}ZDl7CqlNj509-UVU+uptE- zC>x25!MU#JMT`fKhc_sqk)pWugOMV{t-)e&gQY*R3_ep(JV?iY zDdpcwMiNq4(#OhvRWY270T09K(6TK_+e(^4MJKZ?`=)?}AtinjH14HCycU>}cy?=L zNIASyQg~~pD1X@UCID|sg~M(IwZS?DGp58yQe<6j4Y8KSz_p{WusCQFJZFU6vXVr3 zwDT27Mq06Vz)4`D$jP&V^XXZ1Ff6b+*@m%{zLPIYGHTAD#8^uA{EhiV8-K>kruS8hlA|b5SDCpqoBYr< zn#=K@my{dxR3c;AZJ$;mNk=;?M#ki=Yxb#8xLnNTJwYqcy3}a5dhz|{?@zzRe@Smm zsd;6pTTV>o`_AJTFHEmuMZ~#2dk^Q#aoAh`vsCN38z+uGliU99u;VJQmrA8^$hVfS zRkH)F?SJ#7nxnt&nDLyYtZFYRKbIX4OE`5ozL0x2)Xk`R>gH;wX*v9!UeGFr{OjaymSBlSo!VIy6xAX6si-a;aU6c zhL2yCr2Yjx+3tMT_kG9z4Sq*7tGh)qg>zSWhp$_C7fNBmh_FhI(W7L#b1r z1lauOt}zn+IfL`uV13gsF9l=lu3?{wLLh3sShix?^|~{I3zYXyGe>ZH4IXQ)N&30{ z$BOiA-}jxv+yaC@9h`(x!^ipHNEvWn4H~EUG6L&!cmI6AogellJ-+J0{~jsEfG7@* R=_K;=(o`6P$XLBSJ%+HOl085MV11br!7QP2 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 It^-0~f_z+V%>V!Z delta 1523 zcmV1m@cvUUg#je= zF3@geQ=B44B}xror5Efnj3;?Nz(NMNJMOGx3uOjiEzs!VY2Lnz1)k#l0KW_n!rhf@ z;i~B5$qU4RjB`p&VieOEpvpLQg#k%^sW^34{Dy!8&={WL{Qw09@MQXb^4t(5IRFQz z#Y&poMY%NgKYwKh08p3&QmkH-)>^qTwAhbh;r-n)WB{iu1ocRIUj;7_yfeBC;1tDk zR2hQDCa2AN1Stc^EbNL{t;tcz2v3Xo9AN|SO1(Sa#9Yy;-H2*#(wQ6TzW5qF9V?8^!FM;#kO(QIGJSW z6k`C0D}P&?pEj2-1E3F8GJ$kLSh2WKio8=1C@M!rR_)oBr(iA1%y`WV2H=X<7Of{s zw)&d|JY}Q_c*VMDPK<3=RFRot&`OLXnkQ8HJO=A6@Mzy;;QM%0cLCNx%V|cyF{;QF z#t=4^)T>OOBibO1R6`4QEc1DlnQSTRx z30iqHVRP5uOU1vl@#5CdSxy~>Y* z*Qg`L5#17L$sc`xMuxot(XljriVWa+{>;g7L$Jo1X^<#G&syDP@_cz#t#m|bfDu)pc} zs04C>w4%`LJ?jdO&CH>SdPjiklJ$P8KfL~B0Q$1T08;xbRMC15GBt+iI%tXI>~*AL zOS=1Dfb14=bo(_rn#c~%UdGeCqHGS1Yy)>?l(2GxF^vlBm$4NhPS z$%ART7Sc2&W$GiDerVgsT%_kchLNDw0Wvsg#}Hkxs1iqvAgX-p|B<|*NAU>ti=ZrM zcDdUKC^Gavs@&dOD$BeU{cLB}zqR(A1B`%L@n|xWfi;$t{dRKs8T*PCjN*0 Z{{gL&B&aV_Q$qj%002ovPDHLkV1idD=7|6R diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_29.png b/assets/dolphin/external/L1_My_dude_128x64/frame_29.png index 1ce384b165cb3b83bcffcc872254ad52ea846971..dffa2d7c5bacd111d9496c702f550ab0bb620f89 100644 GIT binary patch delta 824 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 diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_3.png b/assets/dolphin/external/L1_My_dude_128x64/frame_3.png index a5056eb4bcff8bade1d5e6097b88150e797537ab..314efc632141ca672f2fc4ffe64e0ab81cfe6e4c 100644 GIT binary patch delta 791 zcmV+y1L*v}459{*7=Hl(0002`twPcO00QYrL_t(|oTZabXdHDE$3MR}ztG(hGLu^W zwlov}kU$RxiXf=XXj?BL1d}NXUV_w4t-C>kQbRf$8#8fd=6T4fd-r>Lk1y|izmM-De|b_{VSlo9JX#=DRRd2LTv9s}o_DU;bb93zYO{4C=Tdq`SvkP*f{U63ycCEVBn8})iSoTjZU5&ZD z4loXr@VT)uyL=h%VhT`+2FvkuV%eIZ=J-x$OA$ zslRgbZUI6XALWle-~G#*!Zpj}xWQJg&^d!C+&o#?Y{Sm}T0*Tvh!KV1PHP63TNhJKSbg3Agdfr)_KebSZy zWq%#huU}&B5HBjH_^gxx%s3K2ipOGv58z30Y$V54Cx9GmDnLTrFh<|I?2ns%cyqZ&k&HobQQ9bGLyD{ed1nw?KaOM6Tk!Fdu=hNG z}j3&c(FZgp-ukWj!!=q&)S)l~)p z1la{pcjGdJ?T0x9;HrX08IgtVIaQ6(<~?ZIW*snPu3foURZ@giASPl@t#Nhe_P#b9aOZY$d8(N1~ VN)QF_zU=@2002ovPDHLkV1lTagh~Ja delta 1594 zcmV-A2F3ZJ2EPoD7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000H?NklR%tu<0`T^A7%NlmWn`o3?q zdvP`{%>hOOTlXT*Uz~@Fh#Jw)=$$cSX9GUwi!*Vz)~K~c*MD_=e>k;k*AB_(d`#Zw z#TkH8Kn1;PW4txQbGV7*i0%=rea~FSG5Y;JHh=bF4?Y+mTIgj8Lu7Y>I0M2Me4LkM ze&X(bNKqskKe~O{crwVt1WmvGk)HBm7vW^1ujt&!KY6!HC)efyy z{_2*MJO7={?SCE8;5A90d`dXk#^bL zMMj}WZ9)`dgqht(RwrC8BJ&=NzqR6!o8vQnDmnusAjY}E zDTEjUXpyd6y$M?PJF<~n#R3Q{XW<66^fx1GhDEem?1KTcNJra^ijnSXxvMJI^1sLV z@b3|3ibNmpH|vxrQ&|}M|8NXa7$AGK7QuyUZ8FH_Om8k;5oO8GLW|aDf2d|?t+kA? zJ2L%NP=B<#Kt|J%^v36FF+;`LqRhkB!M`Kd6a(~$NysE?r zF3V$8P5wuoSD3A}Mz=-J8hvYmG7O+87JVkotKup-mzMghwOI~^=$K!n{$0*^)#m*X z>@@r+6s7A*qieJ*A(AdUhOzov4jKj5ACd}3BUP}hCG&e57@2S;vd8hIg>oP?thGn` zWPjw0{k-<5P9m@ZQk$P;&o4eO&mAId0Q6b0Py{@uj`Q&PMP+HS5qOTC2@J`|nkPdK~=t)3XaOLM*X z4W#nl4WzEvMf+T)Cfn1Mm0qh-sO0Q??0?(p(C=HwOgI`f6_F+xKgwFCf$Jrsr+YVz zWfeX%PbAIF;G|TbL7U@kHS!h~Exx3F5sbSNWIW#Xlt^F6IuV-@2{phZM!5zc%_8u&sKKMtlT*J6^@ zktiAe!~?4n@ufY`yefjI@iPvi8UG1m@Dsh0i_s2f8)zL3Tb~Rf$GVcUc<(b-UHROk zb?pWs^ZN%O=wO^;r8iQ@*}Xflz<(GT?Q3(Zx+1!X9;H{;VII^JpuuwlPhlv{qgzI_ zenE^Gxgrj@8yP2n8Gy*9J4qq^K38~lvYuS6jfa_?ht?lmUljvn`-W10w_yGZF~G{j zMvRcbu7jlZOVHFeJzfAz2&Uf_SlNk*TIet)7#2k6MW1UVT<5hxvZ??#18(E-r6dRo5|b_BDhagnjJ z`pP1D+-|`<2bft@1wGARh2we5uw$*(dzcK|gP^DAZ3lCB>xww>Nk(3czpJr%)R zZk0ns)^kF^hdNd^4V4suJFwCiv*~IVORkU+eiu-Q>U{Qu%pJz}95Zyrfgg1M2`hiV s@!}K5Ilzm(*!thWFV4g30Dm0+0Ao?mEfm7Lb^rhX07*qoM6N<$f@(_o@Bjb+ diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_30.png b/assets/dolphin/external/L1_My_dude_128x64/frame_30.png index 8d42b8b482bade89f498e5ed1cae3a82bf89ee26..52b8d35f03c656242bab9843b86bda4b791dff63 100644 GIT binary patch delta 815 zcmV+~1JL}Z47vu87=Hl(0002`twPcO00RL@L_t(|oK2EXh#PenhM(UrquFjH8~no- z4`#ZcNKpxhQ1p->f}-{qRJ`O;DpkmWNcYsFQ1Rf!gDeWl?mP3$Q4HNdc0Stx4+30)HpmE;5KO?h zbN7o+xeh*q`t5roeZP3(F>t^KKp)PAweS{53qVczW%ZS}gjAHYq-;w;dvr<`EdZ~; z6=X{LKqE;SDSug0O&ST^Ou^*sq?JqBl_fq2+V7?$z!#u(Y7$3={j{yLCF_4XDVs9WFG*2;ca^qz#P{+5d4xpZWk8-Y+Mg;Al!1^%D7#k&b$jg z4?JSOsekfi9s0|psKei^c+zj%YrSWrajxX3=?$OaKkxG4f=gyilG%-muxDG>nsh?J zD#zYXTFav|?Y>5tMm^`*D)zik2lCw74ST4H$?oUJ9L12X+SN_yI62o-gC#m-y=7=l zSzIS1++6Zl`A7;Y!=0$D{zf>xLZc|9wc(DWXn!Moy5Tg&Q1FN0gI9U<>Jw*u$14L6 zGe;WVci^B|dCmoffAmfD+_67@{>OTgb!>k9()8-9HuCH{fe$eAu{U@f1`TKNy)qE) zydQr*RWf^*oj2JBI7=T0USrU(-!TnPIpFqaXKCJ tvM2|8k{bt?on~0^Ve@PUcyabf<9{D6!sENC%x3@q002ovPDHLkV1g4#kct2R delta 1570 zcmV+-2Hp9(2B!>=7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000HqNklvF%daCk0U*Yz12 z_kHJ>tazHn@&PouRY_Q(`2F38IP$4zbAYKNY&46Pa*o2u+<$@7R(}+ChtR2ri18ub z_x*F;-?J*?^iuOBV2L;G7Tsz8Y15 zaESw)5~QuboPX;{HHi$CR01oMv}+rvmW{WM32PtKZ1X<|bO0JJlmB}&0PfuiXGlB1 zH`BkwIFT(t($y{;W4Tlp`+&C!G9*44A1;s4&V{IVz1T$stQN# zsQGuoJ7=>4R8m+KwAdr!2o*+K&5)UYO_>~k`)7^^orN0eJJq+>FxeyQPDkMWYUjl> zU$h+LSUOlud6uzZWl6`eRR>zT&k7{KxjbX=M#FV)3A+PA>o~2^a^?PQi6NqyK$eZ! zE#Nm9zkdRq$Jtoc7}L_T%8*_8?Ga7xR;*qr015JY(q_uC4<;I2Y}JDCCQ%PXO6Ki75r6oRxX zC$I|~dqfp!4PLvM%Cb5&M07ye^|J-QiE~%{eHS7J9uN}!??hxAo+>W1C#*=`_}JHT z61Wqm27DceG9G7F=maVQoD9hcEJ|BZ27k7|o04jQueA5O89>SoP6nkMN}1OEv})d+ z%w>r$L5O>uCTY!r-+Vc)@!5=Q6 zcJ#Gd4wQwjk7RtwDLmlbp`1ahURmT;p?bbm^0mIXxPfE<>Ltr|Pz_v>v^a;wX@4YW zL11T1U_~s2=S11{h7GAefx7Qpc`$vMA1>n6#=*rdP$ujn0*@iRZ7b;?%7ph1x6<)_ zH3MjLZkfEMB&z~5l3?rWbOma< zuZcsAoB@6dI0H*TA2bA3 zs&{pBDHq;KDf#oc77SaQ(9Hmvk~pjm6eFONM$zVc?zv)lT1?fYFVEgjGQbq#UHy>K zc0$`*DQCwk20pi5HTjlB=6?m{(B5&gF+g-cW1PVT5&Exk2FWQX2Ep{7(O;SYDxKg2 zN0_kEztxD+%GQ2|S3DkV%+`5^8K45x>RW+GpjT;RO%5C*<&4z0B05Mh0OttaLG5w^ z49Y1WOI6Xj=ZeR}>6~&}>UW5C1~}CTq}5OLpEY9UipPVQ1wMoA@f!y_a&%sQ0G3J- UD6x+hWB>pF07*qoM6N<$f~JK32mk;8 diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_31.png b/assets/dolphin/external/L1_My_dude_128x64/frame_31.png index ac926d7be3120cd6322739b62a89f67b326563c0..6c282c0afcaac6f862f153466d8c2b9ca91ce90b 100644 GIT binary patch delta 813 zcmV+|1JeA-47di67=Hl(0002`twPcO00RF>L_t(|oK2BWXdHDIhM)QE$ZndDE?Th% zty^m`6vcptf(Lg51rY@=sh8qmD=pMN#TYY6K%taW zYzeYmog_j8jWbP5X0kK$dp&F;zQ^Z#;CtakDpI>Dspv_HWq&}K^B&+_1HeE51}NA8 zBzSf;a>MknKoXmHk6eXZx%Sc>vrD*O4>67qnV{ zV>@L}O=(+(?0*Dke}iiZVSwS6peZf=Xvu+(K&{=9!qI%H=%|>IQDYKlY!y@-#|38T zNQ#`TSaDdH%E^$V$ocy>t;DLz;HU<5Be3u}#zp@?!%ZSgGPnyfz`ltt*DUO5Wlm&9 z;9Kw}qmZ9M>J1ZoUxe6pSU}1+mU1I?RNSI3rOuqTWPeNzz~ut!goK!IX9dUuRtoZ7 z`i6?bc1@~EAI_mX&t+F>+sO9F3CYNeTYLJ>smof8_ z&JmQL^St(qL?xYR#!7SLee=Lm5V+vg$soT(x+q1v)2~a}xK#YSd%m2YUbo*Iyxk>P zo_W&ku0P9I!_XihI`H~q#`mBSLKf6(aEFgym4BqIHA!iAW6gK{^&30<%D(KTdrsoN zC`p@FB^3wqFMQX36o72TnVf&zZ2P9005E>~kzMDY+BGi$U>Dx%Za#st>ATZ!191J- z?6d0ojDF&D_u#?rKW_@|oj8LzLmhBW9qL}ZGS6t&ZLt?%>FNs!XIJj?-4EKkfaq`+ rMke09?Ul%FQ3YzV0XP@)zrue3$o;;>@wyfv00000NkvXXu0mjfRwIUV delta 1604 zcmV-K2D|yV2FVPN7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000I1NklbUr5@?o5?8F0)oUNHtBjkpU=^N>$=7mV_@;ub-kRE zWWaklnLB`Wfx3F;Sgn(H+`ChejPb|#ySQ_q=Wl#&Cr&bc6o2IeSg`=RNpK1QE70Nr zC`5^|+t?gFVfT+Q#-mc$$_1FjSiRs?WTfQmAWta)ehRX?pSxEgR~I?T2p}y$cBgW? zeYF?p9!rvq$x)@puLlTXb?nbpR2)i@z;{f3yf|%+RmpLC6;QQs+=O>j33I&bx{f1; z7r!CE04e|Au769i;1SC6JYR)00p5KFcroV-TfttVcq;(z*$OhWcmS+eC2M!M`znG< zvUY8v5(0FUD4y|Gcp}Q>@AiP%@lymi{~Yp;+cA%FVagqZ-946cHfdsKOZ>Yjfm zymK`XfcrAXgRX^ux^Q}ViI6qi>JW)Pn(;s-0A|02)r`03h8HNhi>=RP6Gf|Da6Ej@ z3XuS~=^LSbyOEnhbb7)d;dAQ<3MQ@bu-o6G08tZ%J{;NmT(AuUJ>?rYUQ}D$^VLJIIjv zzyo^`OahNLc_F}jFhhchvaxF%YZI$u_j9||su#T9I~F&m7XrYWDm?-9hOjfHVo29l z$No&+&OzJt-1&#K48q(n2T zZv`1FGO9L6Bnf7}3G}*>li<-Y+UNJm=B`(fEQ&iT;8W3A213JES3@`?O81WOj{ugK z9VH2+L|2CGMR%K&z(K77qL2(? zt$)QW&qVtTs~SI<7H<^Rmtxzp!V!t=iIn?LU8QP47Y7G4sZ>K!H`#PhstqwM+>0;q(6 zN+3>K#EMom#OhdWMP!cH<3M}DuIY_isDISX|0GE6e;2$7DU}=HXSj3F-X;%F4OkCX zfb#;U61duHL0Bp;w+E1_1CL_334)s>)v%VD*5t3#Xe&xi&I3F!BRHnuqgOHQJXhLL zlhEW!&s(~l6n2D(E^@%*LozZ)h7RCITIaSo!-1QYXinh70>-zsyFt_9J?<&PLcfM-}d3ESQwfmn(Y}c>X z!P1WJaQ~Ex@+5_p1=8d|?-E_`Xi_{zFTrqv3(vvd*IzyOx>(8$suYdDQ#VVszsDFA zbGH&VGmd8sZtKqPid&J1b|g+K#((V&S$GVKUB7)0Ld6K`d^NZvkGr=D(wr*Dp7Czc z&;sXUsp`Ic5=JqFI^P9L_G|@L+Hpqr^ccE&2a;SVH^SF65ANy%tTO%tc3=3sS5C+M zp8UfKZGE|Q;qJBCRqX?;G(MgL{96S)SI^vc*8i5oo$LdgX#6T@**|5lNPj;f3(iGL zkgk_{0Bx|J0?jj6J%_fbJfQ&pVRBoJw{{aA_+7y5{;Ix%_cy)<4Hwl1hR2BU%{hQ| zVyDAe0Z>(tbU*i;be=LEJTDQ0yUvw*B_1G?;hq92{!^X-8^*c`w34fP{iJbC9zdGh zJHhJysU0)VdydpNQchKoSbt0N3FiP)$S3S}3@)5enYVWl;q#iDd7jcKTXlK$W^(|` z;^FHjK#QC69w}kM_e2&|a>JaS_*{exX%7&MRWPeP0a5pFHKMe$wd+{FIR?}{x{hfN zkOACPr@`v}Ge*|r%4s%l=M?b(U*7}Ffg&LQ-wPLc6}WLJmpu>vUwyKzbA)B;FZ4*q8-(g6=FL~Rfg9euuSgt#7LA^q-uNB#^u zOWO@Q0a!4w{l2p=X!Aa>a7Hi=t|=jNG0^UXJqV9q4yluORk8Pse*=1!X`RP1f_$2b%7@FO`Lt9> zJBhirfSHx_JwXhb;Nk+V8L?%vTG!ZQq-ILSg6#fT5s5iVi4CY ze>&7}8CsZr8ULu14=3+REzQLb`^NX6D}*#~?|;DoAHO0=TlXcYv2owG{`x;T{J~y! zJuzk*RRG=He-P;UV%+*K0+3ESL*Xy4Zu_PY1F-k27j|EQO2Zrjpq&4(vH23trf<)F z1i*t6>9>{7*fZ`l9>s&(*Ea=E4PL-pzy<92CmUC9%(ACpN9Y4s{{79Eiz|nH`+0pg u5Gg&|fSyktdnd9ZRDkZw0XSE))$nhF;IgoP#cAFE00005fHG~ecyL0z;#`%wbm&4>$-l7 zX*9-nC7L@xWf^7l%rRRgFW*O{ATx{K+F#{%MfZC;wi72Uet#6{2CzZ_yN%!!1I$24 z1mF-gjNOYZ;TycawPXWWseoOEaiTHKU|9tCCVY$cx7OM-i;$*(S><$Zr!=JTD$Med zqQ_3dNi%@o2Cw&94$|7YAy8wfGLjSn_|)*{!OR@3Z%0F-V;TH4l;;3hf=fx?j%2X& zyRIvBVS1l~qkmU5&;Lmv04e_%pMNT*4d6F~{}Fw@JKEBnZ>GVOB!N`GOo4ZV`<({P zC4guXN9#SHyrdIN4qmx4<{L7A zQx=}0$`CqDEfGX9E0fhT@J0rg0eBR{}jhn&s1h(v-Ytg}fe_B+%rK8i6O#{b2z8!xyKzpfz=NJ6SVS zkA6H64(VU~r~<~9GL#@O&N2%0cvP!WBHkZ$5P!6cjL?nr7#`8`&ZDr32*B0AlAPY~ zT5*`f=_JCd&nN3l;eobych~t6v_vyQN!ED)YTUG^QlZaC5-c`?tb>-55%u_}M_Nj! zkzhypC_!ul{dRbaK{5g)8_&#zMxN-Q)uVr82^AI8lRwNLLUU)QFSDJ?L9345p4|Zn z5Pz$ldG3*eL&iZ*L`JRRp$9hAh6ncns;qGK*b_ZPi}o8Oe{soFMh9~S+MZ7%03EM@RFaRndvyXiWk!V5JT+r+q8U3H?yK{HOb?IH zqVs+=f~+h3KZ2^Tx|+AeXH^vPu0Rj-+QHE) z0*o(mp8rkA$o3Ib8iCag*2?&Cy`cz@jb8s|DMwQD2?jhiWmW*Gyl4b?Qj3tT2oppw ziB?5l9FYr6{-TkB%l<2yKUOb-UZ2upTSnm(%o;~B+u0IIDvJ=zE*jdItAezSW`6|W zKCTk5HQo@cCd!NgY5tQ{rdf2n#*adZ0HGi>Y6WmUv3f=`$;WyZQjD7Qcfl1IKYMor?E8`3FkR>P1L;(dZ%9$4QG%Cx0>itpe8z zK!H{zh{t<@B<|exRRwq!|KwzdCP7;Ef66>Om6leuaPymv01~s`1}ickkt4(N#|5T; z-o?Kz@_PWy3O~&VB=3(ZpU&TVKaOSSl5UTY#fNhMYhs@Qv;wg9YAqZ0(vx(o8LISL zD)mw#z)5>%6x{yLMF#3ssDBe!C0Awy(D-wFp$JeZ+)AL~pYxbL?zwV&w45p<``6|Z z&H*}+Z}4^sE7V59C*tW^1mNp7LL^B851>Tx;(%wY7Y(}0HmnMJnf^jGKORg#U;Lgy5T z0B@bZK0$<;1ZvHzAo1lw{`mjuE0tN3RfCjAY>NO?Fk})HkPMjK?^t{q0q9~=N7Vkt cdCbh~4=L1x*WU8tEC2ui07*qoM6N<$f{*166#xJL diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_33.png b/assets/dolphin/external/L1_My_dude_128x64/frame_33.png index a6c973f6794629e603e943bb407db67e994287a9..4376fe29f51ac8b0a69bd2d195f33f7675de3785 100644 GIT binary patch delta 831 zcmV-F1Hk-*4ax?P7=Hl(0002`twPcO00R+8L_t(|oK2EJXdGo2hM)N}WjBc?i$?UI zxGfe#sTlCkL&e>K;zdP-Q9KkDK@`2Dwipp1BPa-pEhtr}kX}S&BMr3LVyrvVpodZu zu@YomciI$MXww-RlbOxT{I7?t(C_&0yzqT|FH)Y^%aZc8q<=^TlscaR&R;zrFpz@* zat_w}fS5X9zD~=1kb(oG^2cr({TXQRQXj-2TYX4_qUGOeh(sT%Bi~K;}2&mK{ zYsG1LYvf|)&&6OM=!4B?6o!EG7EqH8%=9!J$-qHL4TyqY6#%l+k}k_$iE3##66#4( zPxjAiS{aRGxPM+aj@jbNB+Om{L;4+vae8jXZ#N{ZigG zufYv?41ZvEm3TYeetlfi$&GGTnUr|$iv|1kTqLdcdvllhY8)Oo9WY4_xL1vL9tJNE z&ENv^=qxL**`)KZR7jhNIk$vakTi!MgN`%xg2X^FUyEd=tYaQ|7JL`#6@cs<$+8rV zCf^sbnpU*eJzk7csn{R3-|I55H2*Z-lTuzw-hY%L{Sx2q8Ltil0i=HAD%|Jcl_Y6n zRg#)(tDfuKxLNJL8DYzVhumfrKv(YA1`HfI>UvKAkj^_3!I|fJo@vGajC}d{&Tv1zb-~W@S-({d{r=2zNDM@RPgW2;BxHpnTc~=WKQ@_z#gH*uf%@`KJH?002ov JPDHLkV1h delta 1663 zcmV-_27vj>280ce7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000IyNkl0Cp$`4P!S@fzjt@ zSg{&Q7=S}|k*Ad{LGpfj#Amg!=sP>tT51406?MumB=4_~X6_v08eYu z!m4nA6sgT!S$1jv^rFqd8EtkyD~!N20L$Vz!FIwU8+uw~s^d5aaGsg_xLm25Z=Z#*!3l+xTsT@u=w_co3mX}a` zlk%-Zw}PrUHl1ZpI%ZU7Q;i@`qLg_riwGs2?7vrz&lzQ8Y}NoOVvEO{Dlk(@d1YE* z3{uGT!0JLqnCim-#)~sXP*FCnnrGJs7_E)W$$uPGz6G31TGK}rfaS?7ta`a(e6Qj& z9**}sj-h4!Ty;U7V^%nVH9%YgFYMS-fTk_*Qroqj{ag z5`We4e~gK9de~iU1Xxh5PPCkq1M(<rV*44+-2+8u%oty{$5aWA?ur$dpu{v`hJ>C*1MdFq`d1A>~-yGtn_6 zNbPt|zi*2HszEoRVh+hzZ!=)c=%l1J3afQJj?@TV_|Zbk0l0IoVA%bVnj=;4mVcVw zR67-}$5Yk)`j;@yQn>4@U@146^^c<#;_!LTT$Q~8Zoj2DrTci#Vt?>ZA7GdA z2avw-dUTu>&qwkP?|4=(LfRK?JkQbW1ME~jE`t7c0oNK?ySFOwczhI|#GO0-Q~?p? z-<%9#5~OASx2z*lX=zmpx4vlxkS6=rU@?P-IVwD#Dj0uJ<@XL>12rrB+l)Z+{_N)C z`lILcTE$*sc+4o@odZ}4`+r;DtpKc8t!3lU@uWT03{|=>m3k!%a8u08f{XtgGoV*_ zoxm!&Dj7hVpPSdk04s&t2`~L~9y6{-j@&$2PF0cpYwJnp0ArAE@OFenwHf;Kc)G>_ zT%I+XAeQ6+p3TGiH^7RU;~6bs!e=s@s?o3{Ctk}K!!!eEMxbH5cX*2-Wa;0lM9s6U z`zYU-gUX)W$7u$b0rjfe;HCc=C0pZ+`}8QuhGTixlwp8hoxrg`&twwNns-5(m!o|8 z_wFOgtjVfD$|H_301D<=#0p3TjOQnmj|_myMn}|sbR9G6`UBRt+X<^<_}Kse002ov JPDHLkV1f+WF**PM diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_34.png b/assets/dolphin/external/L1_My_dude_128x64/frame_34.png index 3f9407f385c88ff977aeae0d36a3c0309bc35171..d431b90905d5d4185742d39acb7525e8821c073a 100644 GIT binary patch delta 813 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 diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_35.png b/assets/dolphin/external/L1_My_dude_128x64/frame_35.png index 6059e00d545ed6c1b681cd796a78e0518aef8aec..e4ce5da4d8c1a4560aa6a607f5b3706f689d945a 100644 GIT binary patch delta 800 zcmV+*1K<3Q466o^7=Hl(0002`twPcO00Qz!L_t(|oK2BWXdGo2#((o=>LzKddnxwR zZmTUhSQ6<)McAPzf}Y1e7ZE)Ofi!_a{R8bzq#gv7ocseKITVC$Zj~f7wV6tw2Mw)K z>A`GvO+8i8nYi7|Zf53tJZyIDb9;Y0&-;A5AL?sTQY8Abt$#_1Wa!HRV1SMbp!GiZ ztmOe2J)qW^S->pyK>E@1mw@)(Dk+I{UeZoIJF?dj;{k1S!vh0tZ~!$pa>;^6G->xI1=s`$f=J2DDC~TKwFwo8F(*Ov1juLFM9i-m> z5gFthI0VWrNPo#a<%=py9T^f2=#(r9VHXpw4+8J4vXlbfWvJY)C{~_KWff&pGI>~V zoF_rSfaAD8+Wmz5L0wTeFr^+yx9YkVsZck25BWT9VByD-nehO4Xu-t0$1J)jNj6`u zC@F7m$ndNOSTgu6qzEe+73mYZAgxFbQqo!oJf<^JWq(CGD=1GrIH5^dThW53kC`59qHTLynP)YAjUZW=41ER;S4|)K7@B2^ZIoE%pPQS-H8{oi%_!bPg4XP$4}E# zwy?Y?B~hpShnXNB$-NEQKrHt-{@LV~n#tl=T}gdOzIp4p!4kvZm7sAmJ7|6wrHF&3 z$y|v4F@OFYzzLShxP*)xG^fUy1DF96@VHsK&1vwWS%N6QZSuhzvSlsQ#v)}_yEXUJ zIL_=Qnk#}F)=2J3&F{}GpOo$7>eS4Y+c5MOoX#9;F>Cm*C@b5YtC6B8RpJ}p!>mfz z2#OdIAHN_m&^#AO(blameB*l%xGwR=292ZVeSiG-rN$FGTXiW}i%&+~Mjxw-+bMEx^Z5&)XRHGe~$=lRj*N=8Kj_%3J- zfMF==JU(0Ked)J$Z#TYS_8&)60BFwQ2J)QydcEFlt`Z2}H2aUEApkP7AoBbbW?RMV zmjY?Wc$OuBS%*;;*o`VZG&vT#bdA3>09HC`cVKj^{g#ZbqzVfZg=C5@W1%I~oZ9${rM`{i=hl zJqM^vkhGcD8Gs$KqdNetZACErlE47y?9J=|tY>#I=yVS7&Gc`r{W}vtidh!;3IzlE&uaHI`O(?G`p7yuu0Lb) z-U`kPrt@u{D%sYFob>`rreM<%2$K8^c@g5|5+XNS_DQFL;4vqs3E0n zc;)sELC0AE-R&Uq$MX-ZqQr{}QsXP2YI*4x6W>bHKwY)X)cpFf3$WJrt2nz7E16++ zO@DzhpO?423qjtMfByjkQk1EN)Su+n_Yy!OUc2(|C^89U1`(N6N4^o=c2rcQdIR%8)qiU79(J-wrf<$T8Us9dL}-yh8+#o`{+}IK zmCTA~vWV_Tq=~`Xa7cdsU;xe8()|pow^p-3(3Sjo%U>6pc=?4C1R?`y!O&5`ngL== z&&gIoHIoRVs0=(S!B!bSYUurrV#gK;g*B$#f!1$mNbef&)!THTvf==-4V8pvhQ~Ory;H&H-p6t9Z~2 zDPPd`yp`E=L^f&%&H2_Io<1`JD}Uel!vMSJ-=lNH0JDb5w%6Kt@;Z_}uMf|!ZXKX& z=4<${QqGq0A0d0y~XRNx?HR z5k{H$jr4Cp%8fL(j4bQoS%5^H-9doLkJ7i5{YPYZISP`)tk^}-eo7c1lYg953?g$s z3n@^fE59$vi9B!hkJy5Kr29w^oc}%RJAXw6OX2Mjtagb0Gi(s)U(&}))&?TWk<=!| z0A9x{;YD~AxMMO`E(^)2B0C-l+%_5Kf8+q8@#@*W8q)aqB#0Q1w)f-=XwIX_o(AiF zL~k_*Kn%w3UkT{)B{@s`zkebqH0G!tcbWmLAh19w?Jls^Vb6)0y^#C#Is=IXGQs+h z1I#FN9DCUS>D!|J87F&ksD2XDP}wu%pJIU7K%haeGY~xbr~g&ZdgRLWqdM_1L~Xd0 w0jLt%pmt;ElW~64mFmIu8oFiemeJ=Qtj;RCXX))?00000NkvXXt^-0~f)^R=WB>pF diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_36.png b/assets/dolphin/external/L1_My_dude_128x64/frame_36.png index d2cd0c970c61dea42452df834901ad2a0501a55c..f9d8b6ebf21cbc2d7f66924b55a23585c4d01a2d 100644 GIT binary patch delta 836 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 delta 1539 zcmV+e2K@Q528j%i7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000HMNkl!z{=>~9T;zz z{bMX-fVbdHvwsX=09euAof+C}-^BuNnf+t@XMhx*>SPO$0C=NeJiKA{kFkIOP{!H4 z3_RJ%7QVX`cp|QVL{9OTZF;BPeQUKh= z@f_$tu-5*&+8~Qm0AvQeVy)Knn865IFjVBwV^$X0uHgXiO1(Sa8L<-x9=&!;+fsko zwg|h20)QK%((&wdng5pht}+5@&9~a_T1wmi;Dh(DdVe4h-RQkY@^qKXKZ35VW&rR# zuZ7(Pi|Uyz-k>vnLYpMOeFW`kixwGhRwzXE^`7RdzC8$witZVZ3m$Rbb#D<%N#%lk$_eFc36M;fJ> z%&hDfS$Z8S1zLsfXT9t}27*`Iit7E1KA0&6tpqyJoSnF>$_u=L*LClc-J3pP+lQR7 zv(|6^S4DRRXC{IF0#?7J3jQw|s;YT$1c2wHRXbe&*j&K=K{W@4xbCG ztwa@1E}+I%m4nWWteI~zfH(6|vwRwPoZl1S88B6$(_>yQ5nh%x{QmP~Y#=iRS5A<}MD*6&SJGY60aXbB=( z=~-l4-qM?pF?QC+F{kR11ir8yHA?Yc&sb7w|^sTlB9vMJk}I z0Lso*!K=goV>~1Koehr}I?RDW*7+d@xbU=|lmS-M0cJy5|0QOS>L8LFNxmj88Wf(LsZP?CS=#D_8NeFc zlMtnUX{&Ty&m5(Gv>>o_h(ZgfsMA#jxP-i6wsTlC$?s>4NZV^cb)9n>=jhlytGAj1 zM2yGp-vO2$9{r<&K?@41pL|B&-Wd3JA`Dc{0W#3&Z5OKaADP*fy(0HD9q9e49or1h zL09>ih|+(@$)23+K0R_BCEY6HEHgki5NHsr4g>`KSJwLMk?JGqF7+A3RtBI-NCR7i p$hz8fV&};9(QNMpfz+;|&mXmx&>7wuRiXd@002ovPDHLkV1k3T=pFz7 diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_38.png b/assets/dolphin/external/L1_My_dude_128x64/frame_38.png index 70e56b168bf780745f329c7eabd85a4f48c5ae39..b9271ca8d5b5d2a75b4d95f615c59ba1c9b6563c 100644 GIT binary patch delta 810 zcmV+_1J(TU47CQ37=Hl(0002`twPcO00R6;L_t(|oJEpBXdGn#g}?vLRFhb{(~^S+ zrPHe5MF@l_MQ8`byHLhNJT#YrD3XAO3W_^|M6o%x@KMEZ^&@A2N@A(gpXlT%&i2#LJ1ZqVHc1Q z0(LHh8WsvLKmqXl5zGJTn*#PtTgXxl#ZV9cHy%5b0;Cqw9gyLJVhberA@mXt#N)`F zWB?o%k{!^E`~00@ozKnw7!p{uB^IV7O~7VCt%^aeE@@5fz9gL&>PS*Y?xrLy39Xf2 zT)k>aQcafP3xCj|fLlOy7R$}}n6&zb1IPhQ)FdTO^(G}PP0CX+3-HVu#2;p>Iu`D$TI)I$jFEtc?)6>LVuRt;^Ncf*QK3=zWJYunl>^L~2I2fQe}*761SM delta 1645 zcmV-z29o);2J#G$7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000IgNklgC~Emodx&RQ~@NAc+&BpMxb^2?Lz0fGTvcSSLI( zx9(Coy-gGA=YWpZvo33VZsjwpjl-Vx^Dja~bdH32Fq|CEe`z zQ2#y%lC}@rI}M&loq@D1vLI#9^m+GEz@btmI`5m_{7EJKe|GR$M4jL?qjJ!kG}9N> z5m&xmuW{3)O)BaCC*Zdwf?BqZ+hiOcmw(tfZp%|D5V@)A#;S`d-2ZBD+ddlkKaxO= z0V*IJBUg+eZ98{IGsuwr&f5EPNi}y5z}XkqKeUll&Q6L7OZ%!eR_1`D^6Y{#YX;UH z9@=p4y>@*hV_P3rK=WP>vkW3Jg$EhqXXTOVBs)p{dhB^i#??OV0H!uN2Gl_t+JAP2 zJ*wCZ_u*v~FXL!-kk)wI9@o?ImOMlH*b;me)VSF2Tw5=stk=A~T5h8Yk=Nk_wMSKVSbCbq@7CZ{K`k`5M)_|1u zv+_voExPwIH}`yvFuGZWd=Uefy?KM3L02(G>wQj#aNt%5eEh_lb?#)^2&E}r*VfA1Us zH`3OcPFPBeCS_1+R7l%<#-fo`<&>O}aJ?rN@VDDjT|mV6D-9BbmQ7ok zc9$Hu4#ShBM~s;%T_=Gj8+;WkX5frVBVS@QkCCPN+0x7bu<+jmO{p2s`CHFWXDtEU z5kAcTo{4@7B-)pvnU+#}>3=%_bp&kqO5?*=P?j=4_nNr^Qo===4Rkz@I;cQ-E2Ra z%#rV_mw}HQAPXE-r@>4AGqh{<1Mg`W{l3!p*F|!GSx3N5u-XwS=zj(6VtJ~Kxs?H^ rvMr-@ftv@FW2e%wJiCp5UDx;nY9%fa!&{oR00000NkvXXu0mjfpJ~4Gcdq2;l z_P=c!M0PM%w_^f_a(;Zx@MsgD%r4GKYemdSZFOlkV@}$8%JVzs9Q|<^NaP_dkl9Qg zAKWyEl-0?HCV!E5Rr)+M36a*H`F36OG=+6O)pCAJD7mjEDeA%G?JSqZ*CUVWdJ|c& z)LgFaMJZl&^rdU1uNYkj%cPq?u@$AL%Y(EJtohN#bh_}}1^Vt}QnddgKjT4rW4>v0 zfnH;=7I*2K#y&CA7J46o4fD%kho@d1BBFIfL@MaJQ-8q|fc*>pRH$?u?2E76Ix`;e zlRPZ^pQw5uF1ksi>Lw}iREL4^@lz0Z4_>HppsrCS)8FN6ay_qO%ga zm{2f!U!DkoY+0$%%$0W}l$nw|f6{D{J@^}aqyo;}8?t2~I=<2so8l3Zma<|T|00=Z lmI>^MEF6qh4~{x~^ADjB!AB`;9l-zq002ovPDHLkV1o0y0NMZm delta 1018 zcmV9$ z$O&zcY9YR~w&q?BeL2bjN@6GxES+45_>u$E0!_+J{6U}m8bSQud&y5JndW#PWhefi zldzJx>i*jNwp)W@{faXM7PJNAZZJ_&clmlp-KA zft%+595n>xpR+i6NIseTlv0Q(;r=RkR0LMyxqH+EP>PlHA^Qw}4j`cvR^s!zd1%(A zxT-#QpS?POmT1W>B$ueoqt`w3VbV!8W!Ik|EGR8v|`kVlO2uZ~ur z>s?8HjE+AAjEaDZp;rXxI&yi>RgGBb$}ibSnfsFwF|d70B!yX z5ok}dMg(Y5Ug-dofED7hL~UM-&wm1F<|X~HlHP!t2qApUKq65&zJ^>{Wc*xHqR=*9*!C&*>^F~k`J#PqS=J_TJXa!ybql+Xi z!hbM$NaEskfMc;WHtdfpPCL*fp>Wlp`*i z8d65!o`43;vx`TBr#XfF7oh>WUOgg z4sdbBfo?v!FJISHH+7Pq!$a{GtD;!5cykU9MP3vRdGX>!b2DpWXFfSB^B(zs1Fg6! zcGjT{b6;wT_Nv&6V@_4L-X?vgC@yXm13HCeW( oXn%xhkzTw1ie>MKuU(hMFYI5F{y}dgzW@LL07*qoM6N<$g5Y)ExBvhE diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_4.png b/assets/dolphin/external/L1_My_dude_128x64/frame_4.png index 2d9f4e96334efe359ebb9beb1b84d16e01039b31..4b7361a4291868aecd4e4b257ad5b4a0b677ea34 100644 GIT binary patch delta 832 zcmV-G1Hb&&49fh3Sh{91 zr7~KEb2zPA60wMFwI?lGPL^}t$BT3$;{WRT_&?A8eV^ySynj6|DO~!7-EK(A7w0qjkwmNvgSC6YJT9 z1ul8b_2Vm1AAde~>FMGVmkoDz+R-r=x_`4?F4G^La2}g&Hte z<#E)w>DdJaL zok@JMKNeK7y4YwX4;;kuCuqTIp>7wUl3K$?EQt04Wi0D50I@o;eZm zk*xtqbf9Hzc%Vw)jWTkD`sV?0K^3t1$10v0SyId3os4-kADGM5qbk$E-KIf0000< KMNUMnLSTX;^NY3s delta 1618 zcmV-Y2Ceza2GCrTQ-nm{;(%r=Xuh3o_};4$LAwcyLD~Qj4sEN zeSX*ja0#eL@75SU4sjn|M0!NG2)4fWT=^L7ej8gp`(X{fGC-E-^$~k1ADuu3*Q>X- zM;t->E|svjhks>!qAQQ^b}-iX+Bkn5a((!xI|F2ddj{3odH1qyQT;S$Sd}40cuI8c z60J*j20*Xc;#%!c#iQu;B42*z+~g}dCY)c$vk^5agSlCKt&D1oL&P}13ih9A+q=8S zMlI53ggEv@cP8_B@(@`sZv2s&AGNoxGsu|7G30k^mw&*aag8W5$TpnY^Z*G6E(Z=i z5*fgXbn6-^I4hDzqNE3&vslCv*#c)|Wx0X3duo4wWdJME(RO?hy!)f|)vJ{#2Z*jx zo_0@W27bQ^Xr}VO`(GS`j116wjV9qm4YFI%#^hsIlg=Wl`*J==+l=h&T3EV;ne;r* zv&YyC)qhUX3$GmXmN(A{G{cXUpI#^Knb#+CQAY-7ipjq#oS+&N^0Ya(?^W`msPEwr zNWhsK05LwVflUy?dT$S93*q)W45`;(qlP^H&4zTBI8=}5dPw|xnuw?tcnvL zWyG5>0wi@>i)^J&ZR|`2^PM@G$}D(zc(ppHEf5YgI6IhMZe7{q=Qig;0^Sk~xhsd^kwUU%+pFu{B))(y)IWH0zyuEA}&BMwLZ~ib6=n1Iyc64EzT+KnFepy-7 z=vgzX+*!^L$$EJU;SmdK@YRbcCxxcw8M5z$#V7c8P1lz-kT$tW1K;5+O)f{T5hLCc z&2M(lXnM&^NyHogW$6+t42clSr=&&k^(pXkrg^rr>t0J&+4OeCaB2fae z9;NLyBlJ#i7Sq4049$|8u^ExV0ajqt2~ch#+g2~Sc4m^n4%z1=2gz=~GN_s`cLek> zX_uP6f-`0KT$llN+UjsLNAS)hc-vJvSqs188WM?ffQD=xL4a(Fs&I$#pNeoBh<^ax z^Ug*ODIGSN(+8z|u|D&LA}pI)WWV_nTzq8D1T zu2MItr?xgbl#0uL2=SD%QmpKUOn(YJF+|6((!Qlz)fHWvY9L!*6rZ1jWrcc^^%ksx z7ocpv$CxNG4wxNxspAmn0OkP7OZ>#Rw0!EkO^Ck;Eme@ z#DP#J8!^_5F}HPqPp2U5%J!}To!hpkUuF@j8TyC;S35vz8`$7wgI)rZaeoA_l-zj^ zz~w&$T@FBGGhg(%g>2cd82KG|n(>K}B#_8YxjoOGhS^3Q*_HJ4b2EUJ>Z7xK-u9{R z7P5kKRAXel!*>DR{i?LT5;JxtRmQ*LWDw>6+PQXy2<}oJcVhe%7(I2oI6&lql5Axh zVaIGRio1sdaa7zGkR&F`Mlbrw|fjdNhg$`faK+WLj zq*omSBN#o6%Z#nP?CO=Py+`r%vt*%qsOJF44q$imyr9V%p7*P80A$SQJq+SNm%fxd z2wH`z?6CUarosU-#&59NN4j($1<%Irna2Aa#FMbC1MCWm56v<@Crjc;3CrrR%mK0l zaaTm!;#o4iAKZ-Sa0>^>)b|z6Qu&LXDtOU6eHZXovEz%JyYXK+zz^T}2Un(D-DW)} QB>(^b07*qoM6N<$g4Qnz&;S4c diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_40.png b/assets/dolphin/external/L1_My_dude_128x64/frame_40.png index 369200345db3985d5b105b40ed3ba37e3a0ea311..ac0c428349ae84f4af9761d50ead0c97255591a1 100644 GIT binary patch delta 661 zcmV;G0&4xq384j$7=Hl(0002`twPcO00L-9L_t(|oaK_uOB8V!$G^|d-|8@JG|?^v z8cjqc8-gAb52k~(gp{~c)7!-*=+MhKf+VL93JNMB@({HcRLo?qltKwP9-@N>A$-{& zYM_&=u~Vdu?)aMyE4Ayt&~tenzI^!b@bHj{(jt9bz}E-=Cx4L-l@j7gg|QY`h5qLK z+CYVyQq}iThv*STiG!3fz1X3CZQ5X|&Ob+D@Nk)H7dy%ymE&ZwqusB7Uc5&;BjZxC zi0}eAc&8T;aWYzZiyVpz(9tugzeM$JM-%-^R$&k7Nb@=ef$Iwfa0{{1iC7&}=Q)Bg z4P?^(RwJqcPJhlvrW&MUJ|Zy#a2k^E!yeZ)?Hu2%0P3<1^mOt5J^L)kckv6GEMV56 zSHC4dccqM?&e{09mw!xY>{+t+c9SaZXW)P0^+P)EPd{9?Yx8wA04Nbc^-Sf>3i4=s z(gFApiCTs`eE|5;HV;r-VdACmxzV+}@wfnZT;(f60Dr(_n(PKA9qM>Ac3IL!NguNf z2Gh*4fnZ5|b5~3`YnsfmvRl%QcTatixAM0vi%eR*{y-Z$=&6pCX>>txB_C2{Lz?Zd zr!Q7{K0iwfa^eHt?r<^HDFdXlY$SC)1z^$X3VR?Eo}?@!0F2ZQ%MkoRYc?VW2>?$k z2g6>D`hO%(3bpV0a-;EQ;7I^~%~m*Ta~tlQY8LJ`FVE|Dt}@t56Kd{+pG>=gkB@g> zgXH6JbYkYvh!aqsq}kw;S7S74L$e)cAh7_x4E|D-O@F00000NkvXXu0mjfE(J4a delta 1217 zcmV;y1U~zr1<47J7=H)`0002e)_;Eh000SaNLh0L01FcU01FcV0GgZ_000DgNklwDT+xDfn*36eJcG zzn+u3pI`f}_>~HP6uEc(*I)_~8x)|P*REyYdjg-oZ|Hd*%8b>J@$?fENwcnb{Lk{s zgs%)F(B#(Qd4I;sxjobTAx(EWPb2usKmtuJlH>@pnh$A)kHS()IZh%_A$pBa8wqI^ z#8-y+zg_{NcRW{?nQ>eZ`1nu4k9Y>Ku(cyK!?YR$ZGx=L@G%OYB_A-&qYuGDL*fZ z==F{ATd4%q&}RJiDZm=co$e~?>^yl6NzjPz-dL;QcHR~=eDO)Ui!W~{Egr4ws8uO1 zrTlkrsh{21t#z$9h}J5o$A9yC0BI|BytkA2oPS>Oy}Q(7D2JAzn_^{is0yGZJ)#q3 zVtPey@sO`I)0#Mgp-NkEM-#j>5-VgLExJs`DjR8*-W*g_(B|K!0FjGYL83*^ypt_% zE#>R^=qW;U(YfDO>*TCcD=4JsS~3trcc7f(HH4dN2CKPuHUak=@@rr(2yf9_Nn2rc zJ%3N5Jx~9OBILH$ifeZhJWs%{fe3j|5LQxq&0r;#bMTsH{>+Z#YmD4hhp?3Ke+65l zkf6}wBj%BD&sww1Q+;G@f;R=Q7LV>|Z*Ze#-G0#Vy*Vh4EKTs{KUx8hAbQ0;sSva4 zXlt+BJYfoux%d%Hu)`vDY_%P?f#FX9R)4S>dCLzvFQZxfwev`PXx?Y)_YhI>l8jUU zuOhUrowQzFv~edCK>8)39|e#ncPc<{hjV^1@fGWVT5G4tL$0B%ZRLfJk0}1E0!Y6^ z6#EP?Dtm|$SOw&!HOjw$1wX{69M64@&xxo%5dJ#n}Et}edx*Ze;~WD`Uc z-&$|h5XEWbhZj%IM~mPoR)nHTztE?E-t}y#6=v2}E8H&sJRT}PtCep+#Q2<o^@RT0e!aFFKfPL3@+)t;HYB!`m}}v{JBVfY$h*_4fbE6}k6C fS(bQ^dT90sAA)%(Wh!_*00000NkvXXu0mjfMzBbE diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_41.png b/assets/dolphin/external/L1_My_dude_128x64/frame_41.png index e0f882268275af59257326019b77b30c145070ac..18fa9c0a16eecf070140bee87f4502789bb6d9c9 100644 GIT binary patch delta 777 zcmV+k1NQvr36utq7=Hl(0002`twPcO00P@dL_t(|oL!MYXdG1>#()3UH|}I3&02Ot z4@x%|O%o3yjTB1BB1S=|Y;d0q1kDz2UIo3yNj)ePL6C@0!Kp=9W~4?h9@@hMiU$`& zl*B!#EO<$~NnD}3Y_gMi9%grI`)=>!_kaKI`hxJ>X_k{Ef1hSp8615b^vIR+W;|YwWd6PZq=`XHd0vI z1fXLa13FYQpMR~*% zYjS9coy}Tcumh_EY{R-%tb$^*%!vk=N%Vk&3t&f>PN{qer z{4`R&Eu}Oqy=2)zd{;5}n=rqdD3J=vn+9O}a$>&|?~0$_tE7Zj8j^EL#cG=6jh^TA zrFMC(q;mi^+J!_Gb+%hm07sX4fPCfV_vTIk9Gvh0S;*Cvo?Znw8Y@$5N+9#MO`L{% z*2}eZsDIAf(5bPw6}mkMocO|1O#tpZ`Gt|FfZJUl9Ok5YM!+LWz1=xv0JZ(zRWHI+i74R|gn-rSWM^|2Q+hA4Z z6}7KF?wH4-z6&H|jMK+-%nEA4wlh7R=v-XXbAKHpQ}5^aC5CH1U5s_T)#RfO4m?R> z^F#B)clCvnZ5o*!|B}tVHXltrr{8wZlHJ!kAioCG|Iq6?rhAXW(y^nzjm$^#!U;<& zf_raXbB)?V|MAVI8x`Qa za`6@$R@8?77ML+be*V)YkRv^{neGce2uMTLXBVB9Wbqo1A~V0#K4iW480N z=etq?C^@?zo1d=&9EcMXVC%mEP6l=&ZoT~Ac7z|^E9L*zAdvRAl4q%1UIW~A9ITM> zt`;C(16ViZC4cEuM0v8#vy}pPjc)b71*3V)Zo@SIg;(BN^PPy%JdS9?e+76pZz1b+ z^f)1Fp6LpJ+ule&9W*3!BZB5+a7s4YnNt;DWRRSQ9ppUHZu1;~%b=4$?QiX8 zHP2rKNCbDxwSsvy&)X`%ZA#GUx4Z?|@2%id;kAD?&woo5AdAG^a9R*dsR2rPekDpt zpk$ng)105G0NzbT`+W+g1p$D+2FNm+8(;AW&L7RMr8PeZEakUTuxwk6!~HpM^WO?9 zPh3(=s{!z$)F_X$IcG`^)@p@Y5OG!=$Bi!~9u$unAYyD37P-3-l(Q*ky+r}2fjx3g zK^3JHJb$+;fTV_&OdrwyC;(?nZ>IMYgw&o}kil<{)2SVAytpOPx!Qml7csK6*;}CT zL+|4jqbK9(c=kDfX1vxfLzZrbRq;H@l2!vqlXHu-?t7hnv-7#kqt`1ed|LX^_0$?b zGJIqK!jW{d67-(cQMu>vPyo$n+Gb{YtM<4BJ%7#{p{%&yo0A_285vKVuFZP`B&W;@ zf>!dqIiomaEh?>ZV@+V)Zz~8!9>45&0oX{7vAr_SjXM?GzUlo;r$&?W@oiv5Z)90E zDUpV8q7rDqyVB`g`|CMC#7K<<>v)N<6P;f%I|%T)uJKd>MrJ%`tVYtUkd$sk5TyS) zSbw_yb^c$pYM|*s5K#baQ`X~w!_AH_#rDo)mz)QJz^wqoTfsfXeDNRj2-N!F|9=lX20RMT6N#21z(S5Dqq_#2WnUCoyi4PM z?iKVtz$p2bg23y1%eb9_AmaE^#yKC)U#~yD4U`7;7=tquuNNf>+qo-taDJT+U#I<> z&jGlNMT0<-?+8)c*j@#Q9z)(aTJ!euul2|4ncfQaF5XfCYD5%Vv`1kr&}!c-aDR$e zKWltR8EsJzJnqe1)FLJ$2)KDY&a-47{?|gpq0$&hhNYHs8lFc=9?37%j%G3f*xv{6 zOx|0#Na(2@q`>LPXe}5c$6>~?%FT!EebfNbO>S_nvC++Nn~Q?3Gb#Y;+?mdfocXGv zQw7LgEP5BlB7uPy0&y%UMd6$UN$I0h*C`L!+EO16+W4jzbQSV9H2BI-lk9 z diff --git a/assets/dolphin/external/L1_My_dude_128x64/frame_42.png b/assets/dolphin/external/L1_My_dude_128x64/frame_42.png index a8a23536a433ccddf56e4a82df39dd65f9cece70..86a79df74a988b0d3682bb8588aafb8922393146 100644 GIT binary patch delta 689 zcmV;i0#5y(2)zZ67=Hl(0002`twPcO00M+bL_t(|oQ0B2XcJKsg}*yYWSADoVuHoh zC@9t1r6Tx~DX1VS4eCS@#DYsVy6Hx!qoQD3s2dRk3A)iYf+;EpLLKo3p__uXRtqu< z6)~k|V;Gxs#>K>#xbbZs9KLtX<(?;s?j!C$g8r}2CcJW(3V$sRNt~dI(Bl7k{5Qq( z{s^rUXR6kE;-~kXJ5iTM=I7CFLfiFXwu_L=w!vcy zdXUWdh_YVxgMa7^03t)&n`<1}TW@4U&GrLn0x%-)h8+G9)a0&4ClSk#MJJKyyX`Il z$vG{e)r=?#70CxelB>2iW<+SQ=cytfO7hnInf1cbk$d?7#6=rB5xD2Z8kNk+5Of!7 zIxtYR`pQtM zq-1`Py39>cszYgc3!?<*0DqLYZii_EGpK3 zFDDyUZGRXkqx+{XXmK+BI(hDp^bB~q+c$kSVQ*=)2=V*r1CnzB2P5(`1v_jmi)(V* z2yLu+VDp=(w~7AH4ks~3J#--w;SNNALV;PC~wX{(l6Yb~YJ!+UbcAmVT!rx0;C zj7tU)k=)=l?{S<$#7TY_Z`%PHqIHCG3K56Hc-sze_;i57JAZV5hG-pWIfaNMMZlf+ zCf=q4G@K&XpaW1i$=|30Q1I#$ui+FTk`+O;?$ZGrnZil_1|48l40qX!_Iv9Nz)e1N z{wc-w>JH!)M2NeR@4db!U;huvbzLPhH(2k3Sfz8d9XGwv706)-uN`S!_YM5G4j|o8 zvktI(CwN2$pnrC>^?r!E_1|q5;}V_B-IAY- zb@xocHBOR>ff!Zps*2U=md3wml1`0i=Ox_x^EMXcWyzw+86sLwWHJ0j|QFM^+g1b?FLV2Efv!9}oF@?jBp&3h_e zwbmN-MNQPYvk!~7*Pr|$Q{#`!Hwap>=-IJ^if9e`Wu9y^0VR0o(L zLxYSiHD#k@EjF>yqbaYG~{|jWKZJF^W^a zmJ3^)lO*3&^h4PzZk%#qq~&2MUs>Evk`UA8gVnXxg1Aoo@{?rn|R`>EY