From 7540506c0ea71ef9a534071a333de08dda66a03f Mon Sep 17 00:00:00 2001 From: Carlos Medeiros <104493454+chcmedeiros@users.noreply.github.com> Date: Wed, 6 Nov 2024 09:12:55 -0600 Subject: [PATCH] New Release (#127) * improve buffer checks * update snapshots --- app/Makefile.version | 2 +- app/src/common/parser_common.h | 8 ++++++++ app/src/json/json_parser.c | 8 ++++++++ app/src/tx_validate.c | 21 +++++++++++++-------- tests_zemu/snapshots/fl-mainmenu/00004.png | Bin 9078 -> 9246 bytes tests_zemu/snapshots/s-mainmenu/00004.png | Bin 467 -> 474 bytes tests_zemu/snapshots/s-mainmenu/00010.png | Bin 467 -> 474 bytes tests_zemu/snapshots/sp-mainmenu/00004.png | Bin 401 -> 399 bytes tests_zemu/snapshots/sp-mainmenu/00010.png | Bin 401 -> 399 bytes tests_zemu/snapshots/st-mainmenu/00004.png | Bin 10910 -> 11071 bytes tests_zemu/snapshots/x-mainmenu/00004.png | Bin 401 -> 399 bytes tests_zemu/snapshots/x-mainmenu/00010.png | Bin 401 -> 399 bytes 12 files changed, 30 insertions(+), 9 deletions(-) diff --git a/app/Makefile.version b/app/Makefile.version index 835d0ee0..979a4dde 100644 --- a/app/Makefile.version +++ b/app/Makefile.version @@ -3,4 +3,4 @@ APPVERSION_M=2 # This is the `spec_version` field of `Runtime` APPVERSION_N=35 # This is the patch version of this release -APPVERSION_P=25 +APPVERSION_P=26 diff --git a/app/src/common/parser_common.h b/app/src/common/parser_common.h index 95e8f9be..bd437a66 100644 --- a/app/src/common/parser_common.h +++ b/app/src/common/parser_common.h @@ -22,6 +22,14 @@ extern "C" { #include #include +#if defined(TARGET_NANOS2) || defined(TARGET_STAX) || defined(TARGET_FLEX) +#define TX_BUFFER_SIZE 16384 +#elif defined(TARGET_NANOX) +#define TX_BUFFER_SIZE 16384 +#elif defined(TARGET_NANOS) +#define TX_BUFFER_SIZE 8192 +#endif + #define CHECK_PARSER_ERR(__CALL) { \ parser_error_t __err = __CALL; \ CHECK_APP_CANARY() \ diff --git a/app/src/json/json_parser.c b/app/src/json/json_parser.c index e7adf3f5..cc6741f1 100644 --- a/app/src/json/json_parser.c +++ b/app/src/json/json_parser.c @@ -22,6 +22,14 @@ #define EQUALS(_P, _Q, _LEN) (MEMCMP( (const void*) PIC(_P), (const void*) PIC(_Q), (_LEN))==0) parser_error_t json_parse(parsed_json_t *parsed_json, const char *buffer, uint16_t bufferLen) { + // This check was previously implemented to prevent, here we want to avoid false positives. + // It is especially important in fuzzing environments where this check was omitted. +#if defined(TARGET_NANOS) || defined(TARGET_NANOS2) || defined(TARGET_NANOX) || defined(TARGET_STAX) || defined(TARGET_FLEX) + if (bufferLen > TX_BUFFER_SIZE) { + return parser_context_unexpected_size; + } +#endif + jsmn_parser parser; jsmn_init(&parser); diff --git a/app/src/tx_validate.c b/app/src/tx_validate.c index b3956706..057530d3 100644 --- a/app/src/tx_validate.c +++ b/app/src/tx_validate.c @@ -37,7 +37,7 @@ int8_t is_space(char c) { return 0; } -int8_t contains_whitespace(parsed_json_t *json) { +parser_error_t contains_whitespace(parsed_json_t *json) { int start = 0; const int last_element_index = json->tokens[0].end; @@ -47,21 +47,26 @@ int8_t contains_whitespace(parsed_json_t *json) { const int end = json->tokens[i].start; for (int j = start; j < end; j++) { if (is_space(json->buffer[j]) == 1) { - return 1; + return parser_json_contains_whitespace; } } start = json->tokens[i].end + 1; } else { - return 0; + return parser_ok; } } + + if (start < 0) { + return parser_json_unexpected_error; + } + while (start < last_element_index && json->buffer[start] != '\0') { if (is_space(json->buffer[start])) { - return 1; + return parser_json_contains_whitespace; } start++; } - return 0; + return parser_ok; } int8_t is_sorted(uint16_t first_index, @@ -128,8 +133,9 @@ int8_t dictionaries_sorted(parsed_json_t *json) { } parser_error_t tx_validate(parsed_json_t *json) { - if (contains_whitespace(json) == 1) { - return parser_json_contains_whitespace; + parser_error_t err = contains_whitespace(json); + if (err != parser_ok) { + return err; } if (dictionaries_sorted(json) != 1) { @@ -137,7 +143,6 @@ parser_error_t tx_validate(parsed_json_t *json) { } uint16_t token_index; - parser_error_t err; err = object_get_value(json, 0, "chain_id", &token_index); if (err != parser_ok) diff --git a/tests_zemu/snapshots/fl-mainmenu/00004.png b/tests_zemu/snapshots/fl-mainmenu/00004.png index 1b198c666462a35ca1006723d1a7779d07ca65c5..5f1eb6d590177e54c884a6206fb7874ba7e2a52c 100644 GIT binary patch delta 7217 zcmX9@c|276`yWfFM2kXX+>)i-C}UrSN-m|MB-a+MEnBj0b4YO!%3Nd{TPSOGS!Rga zRG68JWfmG;F&NX(Fk_6F`Hk=I{Q3Dj=XuUKug~*dp2NC^_~V7z@kQIKR(E4d>2vhB zdOLFR_s443`9P5B;byJ z&E4W!tHZ&jDxeqh*lDpxv{JRtT?<2waflMncr)z5;TO60=WT+O16Fq@Zr0)Fjm5Cc zJhkt2`xEg6=|*puwEFs01_kBgAKBM@!nEurmj_#P5DD{Zx4c80nSzYNPz?A>kz)WQ z&zG1K6|P(&@;b1W4_ZIP`fW*7Dzv+V7hK>QUCZH!%5p!oX=hgHLyr<-V1ZO7C(>l4 zC8~@&de^CwOy8VAP&-3Rd+KWg$B6%`N+nXtzjb&Z15Z-eTf|TNOG|%hFoRtR?D5Ns z^jkSAb@vp`t#{_LD~K_$DAvyiz{ z7VOPYm0HU#Mx#CQeO*u((&FQA173fnXhfsD@PkRLfy`M~I%X>T7XV+E0=0~R2HI{3 z!wWeJ zX4tJ6jK@1-v!h-4v}@d(!B_gCA*+r5JS_e=CK9V6`a3*HsgXbX8~0^>{U$)tn9V^~ z!xAwyKQJTvxeFtl0L4;N>(cF%i>E^io;puL#)owjOYnYxisAJgWY|MO)Ep=A8$B8f z2KUYV{H_GPiG6cS|L*SNpf#(yz=y2jBuaO#%|a)kuf`7>ZqetPdT<-ra>Z{3I@-p! zht>69jtnLBU04g*~o}b2N?k`zf=c zS`CLyS>U8JLM?J>%=pf0dY#0rpXLc~29;^{?bTlyL*FtG+h`vhzgkNIRbnmfNU{0n zozYQ~(t}^NNHAR-R^^;7Iv!mCSG$<4(r176M>{lN>+L)KB`TAM{6YFg>?mA8eMt-{ z2rjPG9yP;`D@(U0&)xQ)9$^pQZf{`jAty_Cz_Q`|jXc}DtKg9U@;xx|U3t`nGac-+ z^y`E4gm{9@@wM9~4Q=HUxx4c!o9*cb##)Ew)&e$_UKuAe3Ybx$&9B)P%HY|@^e0j2 z#(+Fs5nWMke)mC6NT{J*HDz$~6v+&$#I4gehgS;fTV4GFeAxeO!z#*6_F_bn>VU6d zm4M|H9yzYm;`qIpt@$aiPd8er-`ef4I0jV;mfd8g?G@!!9O7a=%qr~E=-XFglUB%J zouo=?oSu$yOZ^vZRKOJq`|_24$%IR|%xhwUJ=r>2em_rvo)h^V%8-*Fi4btWR1l;) zUj%ek4fo|?hhCT*2-c+k(@);;PM(^Vf}=kO_j=7LXi^a*?UEt^Qh-;2VTx~{c5ltF z-6|5G!7UrDH@^B@rg!`Ik^YJ$q{D?Br{q z*F1ARMdDqtzD)Q?crem{N2m2-%xGNX3po<_=;bu=`NI2Wa1L@sElj`+>^c_OT`ISO z^qkpRe5{rEf&W@0*R1CY@d&fv9MNPr2EX#oG{Q}8UiN$=fUCi_<_}y z(Kh8-tFGLz=Tk1=BR_jF%zjm=k0?AC+R`P^+3N?&-(N{K`saA(y0g@u~K$~_S)YE;&FDqP`EiWvr{i1edUX=HApVgzjIrT0lA#TYn zL4_wY>$vqr!qo&t|B%8_-=#M@6sH99ZgNv|5cOFqW8Yv{mtzHk-8bM#1g5`5HPJ|M z2DW+MbLDI9GW0&$u0BYlV^fjB=bJVF?&2%K2~L6mKy15n`e0;nt@;&fhn|IP4e2XX zEz?>gqb{)6*QK~NdV}6f)ar0nN~_drGIWmu1`!K+#GSpSy@n0AK}Fo)m3SpoPDuM|NM;+!>veX zI>2#K3cwyuOgdBk0HOYkPeJB_7vJTE5nB5M-E%xo0o{K*HTnRTyMSpxCUR3#5FW$x z?X38natKS@BIhv(cW*!*O*np@_4=TH@zWxXu2JW(g~bEU+ZH{8^Qq{CjYyM2$mk~n zi9lWz@6&uSSEn_7GHR}B2o&pFvXA7}>J51IPN0sCj3Gjcm#V2uW;^P2$fJ)X46gc1 z_n9&*buN^>vC&GV`+Xz@2R)iD<89Bs*=afHDw|9Rp0Xq#%O39tU_LuZ>MR9h-&>m^ zcAg@b51gD#rqhSLb{1Ku$|U4vz|EW=kF~YjRz5&@qVej$-k}p`a!y(dUsYX%detB`x>< zj2|Gyh?i9d7Po0L&0>De%2~ezc)wi?9~7 z%5bMoqz@16-`I#XQ_1a{!&ta(*Wgz=C=A*3E5I|B|KJFwCFxEMlM{@x1Am(Kq$#D1 zffYc6X^WA{YtiR4SdeyYGCkVvZEc_h6k4r0u`Ps@`Tvox6&riOQf8E-Ps~=pPi>KecKY^Siv`_nd0{y%YVPEnS$pK?begF))(g z*+V@B!N$2Zg(AB>Au{105b`SgyGl5~a{=IS2t#{3B%8stI{egYd%eE6_G{1`I}Q?T z{gT1;IT+*aT(CGo`k=dM7WNgSlAtp~>#RRlb9WtEl`XpcyAT0d&W^UhM9i`0Grd>p zNnNKJy%f@pxt8Gh6x2Amm!X!mXk zBdh8a>iisJoJy_Zn@C^befU+5#bSG#xh)f>O?Gb?j8+SlM-F;nE8a;EUApz60|f}W zLi!>Frv^)0{bhSYTnFA8<&@P$3VE&sWssyi%;xnr)6rQ~I9FSIhoD|F^B+eCIdfeY z*@yA(bNb`=(iSS>Lx7>A#Qb=p+%m*o<6Qr8^#{4}x9um;t)VdjtpR+o+UKg5Y;%^! z<}}wH<%%|!pd3l|461Qa-dQXCmQKeD8^(>Iyz}nkJjZe%W5{Vm5(OkKq_7d}g|7)v$j`3ONF-pqR{V zbF8R?*RwBZ_8ICmK)P(zn0kl#fvAjyxvYFR%9&1A9#~p|F7;?qadGf^N1e zy_Q`$R|9+G#Csp=C$DdN)W7YjoHaCRJ!WlSSu(8KmE47aMGE;e@CpcLAk$GKYiPvq z&VktD0Z8@&VJ%apxgNTogz2EhWvN@qo=nj3n?}>4mB?OTvpA{wLb4IAH}9BpVd7`4 zIYQKFmx6s(^Kl+|YApWaJhj@dvbk1D2|DUHztidOwQHJ#;K8hF5u+~Yjw1ctGTQQg zMmY-v#N>A_zv?*22CAa+aU`L&rC4$HjzKm6i=~0SP57l4)RAD1euW9i;$(rf&Sb=r zictK(bo^xFwTJvfqN_v*UGGcgHex5+GwdCKs|sm5mkMeFF;wQR{Hi6?KsHR+S0#Sb zIK=y3+!PTZJ}QZmX7f&uwlQYEguY;Km!_4oJZez)-b z3El4WF0h%h3?Sf7byv{vD{hf`@2wfu;8~nLSoxjGAl#xA)L%b!^JsC=Cnj~*&tJj-?=AsO`CKT8Bab0OzIP3b2zsru0;HM`b z`gjtlOJDxiA_wL9>?!3pKKK|TleV5C^;K`_P1n<_W%T#o{fG_(H}?+_WTy2 zatq(lOdCp*u)00dX^d&WDy{|{BzMuvRZ0~GeJ&JUcaX!l<)}(!Rw?u!(n|LHd1kb& z(86#ks?3(Y+n#8Tk94QTeN#7t3nfeG=O0)%5ry_4&n>=7R&Q`{0{m8l?*Y(_7YToh zfndg>hd`H)1c2bN;ABOiw92P){wJ;Ynl)9Lq<94oNIu;N1P_<+f$JVV2fTsOg4MCi zA+$O6;FCdSe^lB=YV%A3|FpDF_H~~cW9R!4qsknG^sPh5aUrmIs#4Pm;B`}9muLXF za&a43Ub}K&cv~yVy=2JqLSa)nQ*4Z!Q5C@d5U$*!YcM}^H2iNNui#fUIUJXQ#c3ZA zkd}c|M_4O3tk@4l0dh}CizHM0=$7eT_g#Oo6CC8c6pHr=-HHWrKL|Bzr?Fq-sSxwN zZ^T0C=5o+J1wwb=>@)?j7n-uQ|K?X3g_cAf$&f|BNB{<02X=yOW*z?Z< zUp!>zr4IJP@24IKU93H{h%w2E@&N{ z=xSmL{V7ktOjYff3(e}vSIcm*WPE_W%h0)XG^eRvFc*E#X{PheeF{6PN?|u=9K1eH z?na04nJMt6EFH`EK@2&V939UKSI*_#PNv+rT|po4^S{e$B$Pg*du(=l|DtmF!zHg| zHaCI#Jhh_xQv`k(>T8z7T0firVTo3g61{51GN{(Pbjx0Pj8h3hl~!1ixh|~T-%Y{s zmpux61B*%TTVwjvFNe+G5CkE39ZTtQUfcr?mx8ml-U3o+?iY`IMN4ILxU#8vC(v-; zWIjP>*+EXY8G|>o5Yz?A8rdGzm7Gfxmud0c^ly5L6T5sFDu>X`@@& z1L#)p0gy|ILHNZiVuA;+8qR8GE%>2voP45kYiA#8Q2nE*c`MU`)i?mu4|%S0u@<@y zxI_GlMWc(}2=|lAFh}}8EO(<7{Dn}b4LTxUf8(9M+oo(KsqWKQo}E@Z*dJSsYnLzG zr}AxNGa%nF)ke0~SwGfnX6-8N?aACjvHZakilyS0SO#=M@1hmF2tVsmC4}{0ibDzQECvem{s(#j!%AqHnM5A|^s99V5H9*Me-&7(-E1L4~F1Gdk30{C)qwYCRND4RP79DlB5mv?n<( zk$;UVwv9woWxFI2K^#ToyT17 z(9Fb8+jrOpJB3OU$13V(1Xp1jA2wEco=7adNr;iyT@=3C?noOrvRDb-db9m~+eevA zF)`4$l7B2?++$42HfNBG68GN|($=a3>01smb7f{&x~d5+F7{ZGpOgE{3W$hZl`K0O zk}6qCKZ5<8S1&0M9Cj0MBVsM?`ES8xjw_gSlZyl$>__8*Zq|xLHLaJn^{`nl`qkEt zIE&UgR+;_tCOaXuQbJf~Qq6lkS}+!YLR%KY3Qn(qKRA9;gbzjSQE(n^|+a zta~48CF&RPYo#KDa`DudEQH{Si0Xf7 zJeGjYi|dRgO`@*P=c%r?Vb#rP zYNP>a{6O#X4@p$YPVo0J)Nfo4C-5iOJofI%Uynz~r+sfn>v`fKzAigRorib-L{ROtDC|_#`#T?Mg+68@$rClp=24#? z8SHL6vfQREn?786wp#OO{)aa0Ty!-xE`%IvULaWR#Ux&5u(@N-r*hG>EfQcRJv_R2 zxmF}_T1u#+Jo#7(B-`WhvyFa0q^~^=VdDT9NW??9JP!b#?-);Ufi?rzw|95P+SW$5 zK=+*reA!Ja7q*e8Elan;QERQmxNp;9;ly8B1N@t_aJ|XSfz)yufz{I^MidG5ozkUNiHw?NKUGGxJbp6)xLCB^P@VlDs$# zCo5Qrm16zjDvFALun<_xxE$-#Ao{K=L^gcPxJNi?M0q;Mb%u~V?=$v$Tqx{qE_3D} zp{(<}!Wm*FSlmiDuuL}+s(drI5;a?3edjH|Hmth@w)*&e;zr1h4)0vjyVLe}^yB_H zle3_M8ZPEfKlADd&;=pm<>K$Qn z#waIEn{)uQ-{4?JQO^nV2H{ez1%}^d`xh#7Dbe|`IP3ZtqVX6`2h8Z6>L763E>^}^ z7?8TAsyojI%Ji_IKD8^eFGRZscblj)W@FF9i|t$j2Lu?;sNmAt^t>ps#(y zc5jPHbPq*|3a2j?KT#b=awi`>pj`Cz3q40|^)I-bLSxy%LF5nD*sM5s06N?Xy8J~C#);kS&~qdHFthG z`yo2V@40y>(mGY+E?PZG`_%Dd4dMfp4n%N6U9`P+ZC#7~7*x+juhw7W)~i>bI(s)F z0W!W7Z>}sOoMA33EC}b{!UNaxD7eF9ybf=xm9O@B;(Ei@)hji30nrS;>SyMxVzQ!O zm~t8fC<$#kG}h${yX9c{^2&&MaV?P^U0z;}Ubu*jIAw1x_E)?~yM;Pl5UDx4-y&Xn~BI^dP+Pjz0)&GZPzO7Cy|qsR6Tgs6p9>9U=JglAq$q|{-OAroRvo@cF_xHHJ*8P%Z-(Uq6l3f@as9Eg11;K(#TkN#>c(n)!i)bhSf}t zX(jt{GPrj}|N7}j=kkNHmA9Qdv~ZyHhG2n43kZ}7{|Zi5oCMe0MNnO3#X$2r)&FEx z1<<@eAUEazK<(iw$3$P^PACYMzc3U3w+!r=?+|loP;!m_)jN9Z>;1#JIX=9t>yTngv9J$sBl6V9IX1PUi@z>stK$Yu zD=^G~+j}?tdIK;WTP6a8Werw$Ulj&GQY1VSqWChLy|{)d3`L{=tN6)S+euE{AEA4j zvQc~&ZzcPR6!|M<+#SrsCdn!;kwA@*DHM`2u;Gk^(y9U^(9BBk)9+Wu_Vxj-AvUdn(?<{u61r*VU$ zm0z){?=V6xZ29||K)WdFp73!TAUkz`H|=fHs=iV*-tTSeWM2c)*GpGE61`H>eb!4+{D38PZrd8&8*C6^PWydImN8 T_UR-@c-dOtyxM&E!IS?3VIm6c delta 7051 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 BhvfhO diff --git a/tests_zemu/snapshots/s-mainmenu/00004.png b/tests_zemu/snapshots/s-mainmenu/00004.png index e33c90db77e102f713eff66760a07274a15bc24a..b7439f280d00df2af7aaca82e1f9f0f3e4029fd1 100644 GIT binary patch delta 448 zcmV;x0YCoJ1KI>Uz(DuH_82oj_S_r) z;JBwSRbd@ZvuF!SS;*|HZw7M~j-6&1psOP;NE%Na-s&k{_<$W@8|q~qjJ#ExgdZ!% zd`_(Zp)cgVfMtMqyW|nK2>yVH8L<7L3?LF2fyjWk?_(W!2t8lJxmN@9w!j9>Pe*}A z*HZ=4%mAV-wtoTC&q8{teIgkJ#X0JUC@2`B3qjt^!S_tP*esG!kUn*lP#W@v6d+j(@=o1YebZF8D-z6BQhMT49w6lY)AzYorV>{#4IVEo^oLfhMkH52 zT*W*`U=m)g=;2xXbaOU6PZ`$z4|UY!7xVF$u`TFLpCmT4 q;FrrttYyxo{{;a60001h0z3in+3(jKT=0JY00002=JF$1qcZM-&9Q^o1brCKwIdCm>Uz(DuH_82oj_S_r) z;JBwSRbd@ZvuF!SS;*|HZw7M~j-6&1psOP;NE%Na-s&k{_<$W@8|q~qjJ#ExgdZ!% zd`_(Zp)cgVfMtMqyW|nK2>yVH8L<7L3?LF2fyjWk?_(W!2t8lJxmN@9w!j9>Pe*}A z*HZ=4%mAV-wtoTC&q8{teIgkJ#X0JUC@2`B3qjt^!S_tP*esG!kUn*lP#W@v6d+j(@=o1YebZF8D-z6BQhMT49w6lY)AzYorV>{#4IVEo^oLfhMkH52 zT*W*`U=m)g=;2xXbaOU6PZ`$z4|UY!7xVF$u`TFLpCmT4 q;FrrttYyxo{{;a60001h0z3in+3(jKT=0JY00002=JF$1qcZM-&9Q^o1brCKwIdCmfL zQl`F~3<&T?Nl;L*x~6C)_fGfw2aZ3PvpD}@hp+I3cTa^P1y5Q||NPZ~*TYxpRl_$Q z>y6ggd-t#4FT1i}i=o%~NX=I>E^=jsojh3n?$?6)2kHxQPL_pRJ@iXkUG{zb+!se| zZRBT9TVTT7>lIod!+(1n%U-!tfqyru&ow<DD@sal&HG%^^|$+XSm;8Q%*DSR*z?|9_q^mu-d2r$EWI_W zj_<5oZ?cbN>9Xx>?#0cGul)RCxv$WL)cdll%wsNZ@4vg+>?R^`7#^tqWtMVc3JS7+ QSqc*NboFyt=akR{0I^D~ApigX delta 374 zcmeBYp2$2wr9Q&b#WAE}&fA-@eTNlz+ya-)n!Dk@YNdXygDcN5HG5q@tM4|hnoC|Z zPq^mE$$$Vg%7TJ|wKboD%s)xnHf%p>>CXSKqubA6_cZTKN|TE9p1*dyu3&mOKzd91 zt-ix?uWc9YyAkM|Y3x;>zH~+I8tsz3r(|liu9aNpKW;dk>v((dmT&U4mv*N8$X{N^bgh5cvdgk3PHzbRy>e>B59YAh zN2-tCzqmcQ&F9x?o<(YZkIrcJc;hs&g3tZZ$A2w7$zI__bNWkSUqmGHSd=e`-(qpO zV(E|iL$ONX-1#pqKgxDoy6W<^Im=_e#K)wc-n1(}=Z}8G@8)`Qp4IcDqy6;v`TP+} zsSNM^d~NHc(p|f5uY3M#o$>B{NsT|!8(jBWzqwc7d*3eV`b#NhMDR4M|H9&MmxFEV R=4>61sHdx+%Q~loCID04uzCOh diff --git a/tests_zemu/snapshots/sp-mainmenu/00010.png b/tests_zemu/snapshots/sp-mainmenu/00010.png index 8047ea9a1fdcdc1914c2e643c4a85fe05ff75c62..3d07794dffa2e0ecbc24b7c04ffb44d2f8cb88f1 100644 GIT binary patch delta 372 zcmbQp+|N8gr9RBl#WAE}&fA-Tn+_@PI0V)__PgfL zQl`F~3<&T?Nl;L*x~6C)_fGfw2aZ3PvpD}@hp+I3cTa^P1y5Q||NPZ~*TYxpRl_$Q z>y6ggd-t#4FT1i}i=o%~NX=I>E^=jsojh3n?$?6)2kHxQPL_pRJ@iXkUG{zb+!se| zZRBT9TVTT7>lIod!+(1n%U-!tfqyru&ow<DD@sal&HG%^^|$+XSm;8Q%*DSR*z?|9_q^mu-d2r$EWI_W zj_<5oZ?cbN>9Xx>?#0cGul)RCxv$WL)cdll%wsNZ@4vg+>?R^`7#^tqWtMVc3JS7+ QSqc*NboFyt=akR{0I^D~ApigX delta 374 zcmeBYp2$2wr9Q&b#WAE}&fA-@eTNlz+ya-)n!Dk@YNdXygDcN5HG5q@tM4|hnoC|Z zPq^mE$$$Vg%7TJ|wKboD%s)xnHf%p>>CXSKqubA6_cZTKN|TE9p1*dyu3&mOKzd91 zt-ix?uWc9YyAkM|Y3x;>zH~+I8tsz3r(|liu9aNpKW;dk>v((dmT&U4mv*N8$X{N^bgh5cvdgk3PHzbRy>e>B59YAh zN2-tCzqmcQ&F9x?o<(YZkIrcJc;hs&g3tZZ$A2w7$zI__bNWkSUqmGHSd=e`-(qpO zV(E|iL$ONX-1#pqKgxDoy6W<^Im=_e#K)wc-n1(}=Z}8G@8)`Qp4IcDqy6;v`TP+} zsSNM^d~NHc(p|f5uY3M#o$>B{NsT|!8(jBWzqwc7d*3eV`b#NhMDR4M|H9&MmxFEV R=4>61sHdx+%Q~loCID04uzCOh diff --git a/tests_zemu/snapshots/st-mainmenu/00004.png b/tests_zemu/snapshots/st-mainmenu/00004.png index e68baef01fbf7e6d585ad09d715d2fc6efa95d2c..6ced94ac9958d924d1a46a188847b6599bd654ad 100644 GIT binary patch delta 6987 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 E0lVEyi2wiq delta 6756 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 QSqc*NboFyt=akR{0I^D~ApigX delta 374 zcmeBYp2$2wr9Q&b#WAE}&fA-@eTNlz+ya-)n!Dk@YNdXygDcN5HG5q@tM4|hnoC|Z zPq^mE$$$Vg%7TJ|wKboD%s)xnHf%p>>CXSKqubA6_cZTKN|TE9p1*dyu3&mOKzd91 zt-ix?uWc9YyAkM|Y3x;>zH~+I8tsz3r(|liu9aNpKW;dk>v((dmT&U4mv*N8$X{N^bgh5cvdgk3PHzbRy>e>B59YAh zN2-tCzqmcQ&F9x?o<(YZkIrcJc;hs&g3tZZ$A2w7$zI__bNWkSUqmGHSd=e`-(qpO zV(E|iL$ONX-1#pqKgxDoy6W<^Im=_e#K)wc-n1(}=Z}8G@8)`Qp4IcDqy6;v`TP+} zsSNM^d~NHc(p|f5uY3M#o$>B{NsT|!8(jBWzqwc7d*3eV`b#NhMDR4M|H9&MmxFEV R=4>61sHdx+%Q~loCID04uzCOh diff --git a/tests_zemu/snapshots/x-mainmenu/00010.png b/tests_zemu/snapshots/x-mainmenu/00010.png index 8047ea9a1fdcdc1914c2e643c4a85fe05ff75c62..3d07794dffa2e0ecbc24b7c04ffb44d2f8cb88f1 100644 GIT binary patch delta 372 zcmbQp+|N8gr9RBl#WAE}&fA-Tn+_@PI0V)__PgfL zQl`F~3<&T?Nl;L*x~6C)_fGfw2aZ3PvpD}@hp+I3cTa^P1y5Q||NPZ~*TYxpRl_$Q z>y6ggd-t#4FT1i}i=o%~NX=I>E^=jsojh3n?$?6)2kHxQPL_pRJ@iXkUG{zb+!se| zZRBT9TVTT7>lIod!+(1n%U-!tfqyru&ow<DD@sal&HG%^^|$+XSm;8Q%*DSR*z?|9_q^mu-d2r$EWI_W zj_<5oZ?cbN>9Xx>?#0cGul)RCxv$WL)cdll%wsNZ@4vg+>?R^`7#^tqWtMVc3JS7+ QSqc*NboFyt=akR{0I^D~ApigX delta 374 zcmeBYp2$2wr9Q&b#WAE}&fA-@eTNlz+ya-)n!Dk@YNdXygDcN5HG5q@tM4|hnoC|Z zPq^mE$$$Vg%7TJ|wKboD%s)xnHf%p>>CXSKqubA6_cZTKN|TE9p1*dyu3&mOKzd91 zt-ix?uWc9YyAkM|Y3x;>zH~+I8tsz3r(|liu9aNpKW;dk>v((dmT&U4mv*N8$X{N^bgh5cvdgk3PHzbRy>e>B59YAh zN2-tCzqmcQ&F9x?o<(YZkIrcJc;hs&g3tZZ$A2w7$zI__bNWkSUqmGHSd=e`-(qpO zV(E|iL$ONX-1#pqKgxDoy6W<^Im=_e#K)wc-n1(}=Z}8G@8)`Qp4IcDqy6;v`TP+} zsSNM^d~NHc(p|f5uY3M#o$>B{NsT|!8(jBWzqwc7d*3eV`b#NhMDR4M|H9&MmxFEV R=4>61sHdx+%Q~loCID04uzCOh