From ce9db8691f1d7d444c67e064f1c3bbdfbe6efc53 Mon Sep 17 00:00:00 2001 From: jbohack Date: Fri, 30 Dec 2022 15:33:36 -0500 Subject: [PATCH] rfid / subghz modified for sfw_mode support --- .../lfrfid/scenes/lfrfid_scene_clear_t5577.c | 22 ++++++++++++++++-- .../main/lfrfid/scenes/lfrfid_scene_emulate.c | 11 ++++++++- .../lfrfid/scenes/lfrfid_scene_raw_read.c | 12 ++++++++-- .../main/lfrfid/scenes/lfrfid_scene_rpc.c | 11 ++++++++- .../main/lfrfid/scenes/lfrfid_scene_write.c | 11 ++++++++- .../scenes/lfrfid_scene_write_success.c | 11 ++++++++- .../main/subghz/scenes/subghz_scene_rpc.c | 12 ++++++++-- .../RFID/RFIDDolphinReceive_97x61_sfw.png | Bin 0 -> 1421 bytes .../icons/RFID/RFIDDolphinSend_97x61_sfw.png | Bin 0 -> 1418 bytes .../RFID/RFIDDolphinSuccess_108x57_sfw.png | Bin 0 -> 2681 bytes 10 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 assets/icons/RFID/RFIDDolphinReceive_97x61_sfw.png create mode 100644 assets/icons/RFID/RFIDDolphinSend_97x61_sfw.png create mode 100644 assets/icons/RFID/RFIDDolphinSuccess_108x57_sfw.png diff --git a/applications/main/lfrfid/scenes/lfrfid_scene_clear_t5577.c b/applications/main/lfrfid/scenes/lfrfid_scene_clear_t5577.c index db9718669..a95eed7db 100644 --- a/applications/main/lfrfid/scenes/lfrfid_scene_clear_t5577.c +++ b/applications/main/lfrfid/scenes/lfrfid_scene_clear_t5577.c @@ -1,5 +1,6 @@ #include "../lfrfid_i.h" #include "../helpers/rfid_writer.h" +#include "../../../settings/desktop_settings/desktop_settings_app.h" static void writer_initialize(T55xxTiming* t55xxtiming) { t55xxtiming->wait_time = 400; @@ -14,6 +15,9 @@ static void lfrfid_clear_t5577_password_and_config_to_EM(LfRfid* app) { T55xxTiming* t55xxtiming = malloc(sizeof(T55xxTiming)); Popup* popup = app->popup; char curr_buf[32] = {}; + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); + //TODO: use .txt file in resourses for passwords. const uint32_t default_passwords[] = { 0x51243648, 0x000D8787, 0x19920427, 0x50524F58, 0xF9DCEBA0, 0x65857569, 0x05D73B9F, @@ -41,7 +45,12 @@ static void lfrfid_clear_t5577_password_and_config_to_EM(LfRfid* app) { writer_initialize(t55xxtiming); popup_set_header(popup, "Removing\npassword", 90, 36, AlignCenter, AlignCenter); - popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61); + if (settings->sfw_mode) { + popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61_sfw); + } + else { + popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61); + } popup_set_text(popup, curr_buf, 90, 56, AlignCenter, AlignCenter); notification_message(app->notifications, &sequence_blink_start_magenta); @@ -59,17 +68,25 @@ static void lfrfid_clear_t5577_password_and_config_to_EM(LfRfid* app) { notification_message(app->notifications, &sequence_blink_stop); popup_reset(app->popup); free(t55xxtiming); + free(settings); } void lfrfid_scene_clear_t5577_on_enter(void* context) { LfRfid* app = context; Popup* popup = app->popup; + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); lfrfid_clear_t5577_password_and_config_to_EM(app); notification_message(app->notifications, &sequence_success); popup_set_header(popup, "Done!", 94, 10, AlignCenter, AlignTop); - popup_set_icon(popup, 0, 7, &I_RFIDDolphinSuccess_108x57); + if (settings->sfw_mode) { + popup_set_icon(popup, 0, 7, &I_RFIDDolphinSuccess_108x57_sfw); + } + else { + popup_set_icon(popup, 0, 7, &I_RFIDDolphinSuccess_108x57); + } popup_set_context(popup, app); popup_set_callback(popup, lfrfid_popup_timeout_callback); popup_set_timeout(popup, 1500); @@ -77,6 +94,7 @@ void lfrfid_scene_clear_t5577_on_enter(void* context) { view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidViewPopup); notification_message_block(app->notifications, &sequence_set_green_255); + free(settings); } bool lfrfid_scene_clear_t5577_on_event(void* context, SceneManagerEvent event) { diff --git a/applications/main/lfrfid/scenes/lfrfid_scene_emulate.c b/applications/main/lfrfid/scenes/lfrfid_scene_emulate.c index dc3918994..a0e9b8609 100644 --- a/applications/main/lfrfid/scenes/lfrfid_scene_emulate.c +++ b/applications/main/lfrfid/scenes/lfrfid_scene_emulate.c @@ -1,8 +1,11 @@ #include "../lfrfid_i.h" +#include "../../../settings/desktop_settings/desktop_settings_app.h" void lfrfid_scene_emulate_on_enter(void* context) { LfRfid* app = context; Popup* popup = app->popup; + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); popup_set_header(popup, "Emulating", 89, 30, AlignCenter, AlignTop); if(!furi_string_empty(app->file_name)) { @@ -16,13 +19,19 @@ void lfrfid_scene_emulate_on_enter(void* context) { AlignCenter, AlignTop); } - popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61); + if (settings->sfw_mode) { + popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61_sfw); + } + else { + popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61); + } lfrfid_worker_start_thread(app->lfworker); lfrfid_worker_emulate_start(app->lfworker, (LFRFIDProtocol)app->protocol_id); notification_message(app->notifications, &sequence_blink_start_magenta); view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidViewPopup); + free(settings); } bool lfrfid_scene_emulate_on_event(void* context, SceneManagerEvent event) { diff --git a/applications/main/lfrfid/scenes/lfrfid_scene_raw_read.c b/applications/main/lfrfid/scenes/lfrfid_scene_raw_read.c index b2c7c364e..1d6a63f91 100644 --- a/applications/main/lfrfid/scenes/lfrfid_scene_raw_read.c +++ b/applications/main/lfrfid/scenes/lfrfid_scene_raw_read.c @@ -1,4 +1,5 @@ #include "../lfrfid_i.h" +#include "../../../settings/desktop_settings/desktop_settings_app.h" #define RAW_READ_TIME 5000 @@ -28,12 +29,18 @@ static void timer_callback(void* context) { void lfrfid_scene_raw_read_on_enter(void* context) { LfRfid* app = context; Popup* popup = app->popup; + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); LfRfidReadRawState* state = malloc(sizeof(LfRfidReadRawState)); scene_manager_set_scene_state(app->scene_manager, LfRfidSceneRawRead, (uint32_t)state); state->string_file_name = furi_string_alloc(); - - popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61); + if (settings->sfw_mode) { + popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61_sfw); + } + else { + popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61); + } view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidViewPopup); lfrfid_worker_start_thread(app->lfworker); lfrfid_make_app_folder(app); @@ -58,6 +65,7 @@ void lfrfid_scene_raw_read_on_enter(void* context) { state->is_psk = false; state->error = false; + free(settings); } bool lfrfid_scene_raw_read_on_event(void* context, SceneManagerEvent event) { diff --git a/applications/main/lfrfid/scenes/lfrfid_scene_rpc.c b/applications/main/lfrfid/scenes/lfrfid_scene_rpc.c index 156dd97af..a7161e069 100644 --- a/applications/main/lfrfid/scenes/lfrfid_scene_rpc.c +++ b/applications/main/lfrfid/scenes/lfrfid_scene_rpc.c @@ -1,18 +1,27 @@ #include "../lfrfid_i.h" +#include "../../../settings/desktop_settings/desktop_settings_app.h" void lfrfid_scene_rpc_on_enter(void* context) { LfRfid* app = context; Popup* popup = app->popup; + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); popup_set_header(popup, "LF RFID", 89, 42, AlignCenter, AlignBottom); popup_set_text(popup, "RPC mode", 89, 44, AlignCenter, AlignTop); - popup_set_icon(popup, 0, 12, &I_RFIDDolphinSend_97x61); + if (settings->sfw_mode) { + popup_set_icon(popup, 0, 12, &I_RFIDDolphinSend_97x61_sfw); + } + else { + popup_set_icon(popup, 0, 12, &I_RFIDDolphinSend_97x61); + } view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidViewPopup); notification_message(app->notifications, &sequence_display_backlight_on); app->rpc_state = LfRfidRpcStateIdle; + free(settings); } bool lfrfid_scene_rpc_on_event(void* context, SceneManagerEvent event) { diff --git a/applications/main/lfrfid/scenes/lfrfid_scene_write.c b/applications/main/lfrfid/scenes/lfrfid_scene_write.c index b7faed69f..f4bd8f45a 100644 --- a/applications/main/lfrfid/scenes/lfrfid_scene_write.c +++ b/applications/main/lfrfid/scenes/lfrfid_scene_write.c @@ -1,4 +1,5 @@ #include "../lfrfid_i.h" +#include "../../../settings/desktop_settings/desktop_settings_app.h" static void lfrfid_write_callback(LFRFIDWorkerWriteResult result, void* context) { LfRfid* app = context; @@ -20,6 +21,8 @@ static void lfrfid_write_callback(LFRFIDWorkerWriteResult result, void* context) void lfrfid_scene_write_on_enter(void* context) { LfRfid* app = context; Popup* popup = app->popup; + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); popup_set_header(popup, "Writing", 89, 30, AlignCenter, AlignTop); if(!furi_string_empty(app->file_name)) { @@ -33,7 +36,12 @@ void lfrfid_scene_write_on_enter(void* context) { AlignCenter, AlignTop); } - popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61); + if (settings->sfw_mode) { + popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61_sfw); + } + else { + popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61); + } view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidViewPopup); @@ -44,6 +52,7 @@ void lfrfid_scene_write_on_enter(void* context) { lfrfid_worker_write_start( app->lfworker, (LFRFIDProtocol)app->protocol_id, lfrfid_write_callback, app); notification_message(app->notifications, &sequence_blink_start_magenta); + free(settings); } bool lfrfid_scene_write_on_event(void* context, SceneManagerEvent event) { diff --git a/applications/main/lfrfid/scenes/lfrfid_scene_write_success.c b/applications/main/lfrfid/scenes/lfrfid_scene_write_success.c index 52e30d6b6..6ba138879 100644 --- a/applications/main/lfrfid/scenes/lfrfid_scene_write_success.c +++ b/applications/main/lfrfid/scenes/lfrfid_scene_write_success.c @@ -1,11 +1,19 @@ #include "../lfrfid_i.h" +#include "../../../settings/desktop_settings/desktop_settings_app.h" void lfrfid_scene_write_success_on_enter(void* context) { LfRfid* app = context; Popup* popup = app->popup; + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); popup_set_header(popup, "Successfully\nwritten!", 94, 3, AlignCenter, AlignTop); - popup_set_icon(popup, 0, 6, &I_RFIDDolphinSuccess_108x57); + if (settings->sfw_mode) { + popup_set_icon(popup, 0, 6, &I_RFIDDolphinSuccess_108x57_sfw); + } + else { + popup_set_icon(popup, 0, 6, &I_RFIDDolphinSuccess_108x57); + } popup_set_context(popup, app); popup_set_callback(popup, lfrfid_popup_timeout_callback); popup_set_timeout(popup, 1500); @@ -13,6 +21,7 @@ void lfrfid_scene_write_success_on_enter(void* context) { view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidViewPopup); notification_message_block(app->notifications, &sequence_set_green_255); + free(settings); } bool lfrfid_scene_write_success_on_event(void* context, SceneManagerEvent event) { diff --git a/applications/main/subghz/scenes/subghz_scene_rpc.c b/applications/main/subghz/scenes/subghz_scene_rpc.c index 68f2e0199..e78e7fa71 100644 --- a/applications/main/subghz/scenes/subghz_scene_rpc.c +++ b/applications/main/subghz/scenes/subghz_scene_rpc.c @@ -1,6 +1,7 @@ #include "../subghz_i.h" #include #include +#include "../../../settings/desktop_settings/desktop_settings_app.h" typedef enum { SubGhzRpcStateIdle, @@ -10,17 +11,24 @@ typedef enum { void subghz_scene_rpc_on_enter(void* context) { SubGhz* subghz = context; Popup* popup = subghz->popup; + DesktopSettings* settings = malloc(sizeof(DesktopSettings)); + DESKTOP_SETTINGS_LOAD(settings); popup_set_header(popup, "Sub-GHz", 89, 42, AlignCenter, AlignBottom); popup_set_text(popup, "RPC mode", 89, 44, AlignCenter, AlignTop); - - popup_set_icon(popup, 0, 12, &I_RFIDDolphinSend_97x61); + if (settings->sfw_mode) { + popup_set_icon(popup, 0, 12, &I_RFIDDolphinSend_97x61_sfw); + } + else { + popup_set_icon(popup, 0, 12, &I_RFIDDolphinSend_97x61); + } view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdPopup); scene_manager_set_scene_state(subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateIdle); notification_message(subghz->notifications, &sequence_display_backlight_on); + free(settings); } bool subghz_scene_rpc_on_event(void* context, SceneManagerEvent event) { diff --git a/assets/icons/RFID/RFIDDolphinReceive_97x61_sfw.png b/assets/icons/RFID/RFIDDolphinReceive_97x61_sfw.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f5f9f8017b49ab1ea78a9394ed8ea7684e3083 GIT binary patch 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_ literal 0 HcmV?d00001 diff --git a/assets/icons/RFID/RFIDDolphinSend_97x61_sfw.png b/assets/icons/RFID/RFIDDolphinSend_97x61_sfw.png new file mode 100644 index 0000000000000000000000000000000000000000..380a970d9004cba5520560fd9aa24aa42924e2a1 GIT binary patch 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@~ literal 0 HcmV?d00001 diff --git a/assets/icons/RFID/RFIDDolphinSuccess_108x57_sfw.png b/assets/icons/RFID/RFIDDolphinSuccess_108x57_sfw.png new file mode 100644 index 0000000000000000000000000000000000000000..34199910945376f054daa0c1738d7e64dc410421 GIT binary patch literal 2681 zcmcImeN+=y9!+ao5u{4RRaA5sx(ExC`N$-bj3$_n$VUkvvWQeyCX-2+CCP+jAc4io zTCG?Mt{#hG!Ga&HhzErAqZB!|3a)DvrMRvHWox_DA|h?~cy_C;?gRq5d#vj}n{y`f zW^&*C-FJU?-ehB1N_?RIEPs(m6quNxO&87<;ZXQJFMO|vU*0dACfO5~J4K>^Y2M>G z(a!3bBGF5=Y(^HJrB5bl&MKyioPiO$t#$z|5-p5%+bKGa;Q<3yE5Ey~* zc}h_2EeK@k(||b6!2mKb0?`P90fa(~%5YqU!~htAAuu9^Q4B(5B!ZJD0r)`AD7TI{p4cVOGV+>lxNjq3O z&vG`v%Saix0$vFUN=KJqwU5)CWtj)-|oKapyz6p$$;u$3aUm19L{!RP-!Ry`D_8IeE%PGl^OyD2NiXtdW#63}s*l z1!SZo6hupL8ZyWcDI_5lb-=g@OT!CeUm7-`bPIjoeBAJ$5l8Q5+!d($ki3w0A% zr_j10-}AAQ$@h&cEHDx}lA^s?SAw*+$&3;7-DaQQ-m~c(rFG>p0_jtlKMHelCf-Fk z7`0h&`hSKC{yFhZs_^O3pRMu#N9jIW>0HWYW`vCs2EB`cy<5y^Q{eyZ*Q0)qWkxNe z+1pL0&jt-;9ydhwaaFfD_;RXU5RbgQtag7C2 zhiG(KOrnS*)EX4kX*7sj5~q_a#t}rJi_^#+n>n(QQ9*%bx71r}g zOh?Nr0V%D+vkjR^-L8r$uG*D%=0_JstSCthwRNIZ6UzYqsFat{*<}NghoNb+7R7YN z^|kN%>y`Lk?$*NL`?8^w53Bq;UQ8~MR$yhHIfmNh{(!hK6YktHA^)}ZHQ^PW@~*Xfnv zyN6~6#V@*a?tRU-Y)Q5wKX~|}3?sI6m4^BC_BFJqEC)q%r`~OT$$YnRQ_CMZ2ENIB zSl)B!q*-I%{>kmC9VctbLQkruy?m74mCYagwq{Ri;J}Z7JbcyMg8I~c&%6ipv48H( zZR>5U8+0X?JC_bM#2pJOxZWB#J^jn?bJfX{FIk83{d9;cX7x>YYDnoE^-aUI8}RgZ zIBn9citKF!AINLkL^rrTGK91fqwf0=~Vsi8CK5AM0vh)#dnRC#A`T7`eDX;tPYB~dd1 zep=o%u`*1)tI*R@76D5xM*-QB#zTG=7j%O3(`FIAIS2uN{Aln&F@9)?Dgd} zcc|l&fZy&dy)n6`u6{#l>hr|5n%Cp|4{!DxI2g=S9N<1rj_Ukn(c0 zH*)b`%3H3s_r2=MII*qfW8LLsxV-L~J2pzaJNj2i-vtbLR7>;!-db4@Os~B@@7zkZ zXT=LO^0)h?M_*gE=d1MHA9+sji=XqXuRWFCB`NV>4_bG+XE!Au&4Dh5v>)+5xA%Q< zt!wkCD*1qFcbm2QU-Ns4j%yP)AGv=iHmi5LIIl#~eyjM6MEh_+V&0tvJ5=S=dJOTy~%6^nwZGp5xyf1Iy3Yx}id-~MjWmBzE@l0x=}tLFY`$&$eh z_Sk*5-$8