From 753c0f171f4cd98ce8d536d023c3b78a3a545b38 Mon Sep 17 00:00:00 2001 From: l5y <220195275+l5yth@users.noreply.github.com> Date: Sun, 23 Nov 2025 01:32:43 +0100 Subject: [PATCH] app: instance and chat mvp (#498) * app: instance and chat mvp * app: instance and chat mvp * app: address review comments * cover missing unit test vectors * app: add backlink to github --- app/assets/icon-launcher.png | Bin 0 -> 63731 bytes app/assets/icon-splash.png | Bin 0 -> 40363 bytes app/assets/icon.png | Bin 68 -> 40363 bytes app/assets/potatomesh-logo.svg | 352 +++++++++++++ app/debug.sh | 15 + app/lib/main.dart | 760 ++++++++++++++++++++++++++--- app/pubspec.lock | 140 +++++- app/pubspec.yaml | 9 +- app/test/cache_test.dart | 74 +++ app/test/mesh_message_test.dart | 2 +- app/test/messages_screen_test.dart | 86 ++-- app/test/widget_test.dart | 19 +- 12 files changed, 1336 insertions(+), 121 deletions(-) create mode 100644 app/assets/icon-launcher.png create mode 100644 app/assets/icon-splash.png create mode 100644 app/assets/potatomesh-logo.svg create mode 100755 app/debug.sh create mode 100644 app/test/cache_test.dart diff --git a/app/assets/icon-launcher.png b/app/assets/icon-launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0b257a09e19de324e338bdb7c3a14c6fce3f4e42 GIT binary patch literal 63731 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%0Db?@O+`@h1+{Z)v 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
1-5SMkWs-%0#=yuRDsn-oc0!x| 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 literal 0 HcmV?d00001 diff --git a/app/assets/icon-splash.png b/app/assets/icon-splash.png new file mode 100644 index 0000000000000000000000000000000000000000..209db0faa4a0b90b2ddbbb33e7b03aeb56264141 GIT binary patch literal 40363 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 sQUnqPfc@{)|4q~XT;l&@GKd(zIX8-^I literal 0 HcmV?d00001 diff --git a/app/assets/icon.png b/app/assets/icon.png index e1a1b2e92c9173101595a85148194bc337ee4052..209db0faa4a0b90b2ddbbb33e7b03aeb56264141 100644 GIT binary patch literal 40363 zcmeEt^;272)OC|HLI007{BRQjL|0HC9Oq64t8P{XzV zKNxDj@lZ1Sj2i#@paCKS$WRxAfR7*E>-y&&cRaT+arC(by5&ewHfWvoXK>!Rf#;pw zp*N@6e&Lv@XShfibewRRFnop$CLA^G6;C83dxe+nXNIc$TPnwswz{Zuk$1#i|K zffGS{BenAx3bil^h%I@5z|NYu!JWijdl@SxYVNRHInXKof2-*Fhk^FrxJ^&^-yri6 z{r@ii4~_pbhW{VV!Zudyy~dg;l`$e|1^FB>=130!{BUN)t2l-9jW=>Gdym2P8%?!H z?^-RcfU5f3n1Hc&|J`!JI=!tD;V%Am`PJR-d6`4Da`rqnTlOLGgn?_Q-as*XtiW}t ztI;=ajzxDvU)T+(z#%sELEu4DTT_Mvz!Mh^09Xj6^1>3`-EyYs?a#>~N8)23LZ33A zl+|2DmQ+sPAgsDa378|g;Cy%XSO&AAW=5Izq>=^S9_8$in!lZm{szFD)cU`EG*Wk} zo10x5-B*&21IDcS7Q47uP`2>qEFS<@7m(lq^+`8n}vYsX1DT2Al-a{ezmNo+UYOkIa4@3A{73jm zwK4FgjH$Af-8m(FLlqxY6p;m6v&80g({>{Po$*HWim1PR@gHi~jspEOL2wuMqS2!@ z?V5n@h|bC{>C|f)IK3J;j@RiQ1z|<5Wrw;nKX4c@U9_(mk<+oudr0Sv>DVOi_J6l6 zxZ)a5EL6Y`7=RxwG5`P%zb2muXiEMI}UJ`S#QyCd=vP$ z(s5juBA23xu_AkBQJ#0*H%6eEv{Y2E`#zzZqMySgNUX8 z0K39h5xY!Y{pXPH`_9#Py?jtHl zn4_ld4zT2drQYF3^>Ze@fTO(#YTxF^dkB7w&3m!ZX_MP(%_|0lDxPf4<;2YVY_4HF zKNJfPP>aPfkcoFKi^@2^cTs6K=y$z>*hEUCm(hx!d+L*BX}^yF07}uYQD0aG7qu4z zb0jX+t?u1^3CZ9E9@)~<8^<23#L@dv{g4$jP0FV?C8}wc!J$Ul`tN`Ja&pwO#TR@{ zic7T40^xzhmVWkF!=Gt$?=b}ozy1>5FXPUr;A%>C&=utycrwPe6oTN$J2+v`SvUyW zV33PJd;QWn?!`jv;YBhbnw_^?@1O*Od4CPv2^?Pt@q-P}b&Vo{T{cBS1>!FVPS}j} zAJ+CWVBB?6cd#oCz4`hJkuI+_a5M9a<3>eUq@|F9VF0PCn?osn1O7i<5@tDa6QS!B z${z{BikQE>4-XRpNm;&h4RpLAFRg7yH!_B*LM*eq3m_UV!p&(!WhNSF(uvR$={>x= zYmbjJFZ&x&_H4M#&!jQ}o!y?neJKq;>}a&ja#Qd7L4XOcSo!aOWqEvp)+Foq@9s{J z{H_Yt)RWl8-(B3kzN1@Sw#5UQkY6^R&y8L&UhmG?di$yTx`z2AWh#*ezQ(HYkB`nq z+7AGRh9#Luh->X9rZATUO1@5j21l`){+cT_{WVr%X%jmrdwx54cX#}A%an|b^+R-l zleUFTe=_!YPC>v_P&VzSi?m*7fbB05v=~ePPsx9aG87pwHySuxehm-Vs2q`|=i|^| z?Ta=q;H3nr>Cq&alOtd~jDadg+Dl8dF(X&Fw%Q@u60~vnFTY{BQny5A_I>$0QOuc^ zilZZ?PdZ$7=eD4F$8Dxga1tEVi8vHGOeD}=IAWTitix9NN*Q82<~Bc+s}a^DDEk*`A%9GlqU=%JB6catOCtT9yMn>?GvVk-=0B8E4TKO zH~p^?%eWId#V%Yia)-jN_;CqUuoGhDH6U%CxT|yjWI+L&T7lIkS$+LW$Uu zoXhsn*|Cj(9~)+qXhQdQ#K&~SqRh|$s`&r;7y++wX>0hI+tYlH?atZj0cp;7h}7$? ziGlAb7cgR+%LB0|aJusW5Nx7Y(z7L;_VM5(X?})|J9d+Usn|8`RYb%;UFs6#W2xVy zfmv`i!gl#{ah&UgL!hq;ItRK$v>jV4MY&$%SkQcS=2B?=BWDCnha$~*!9qD9z~V9t z6?(0-R&qrKufYDoL_vsfUJB%f8S=1_64sj_Jad^Xb`YY{3sz5T0&)KK^sd3r{o1t* zdlX(%=A7b#U4v;0xN1Tez`||J;bUH5RhS&^6r9eXdzA)%r9!tmPQVS4Zyt%yQvoc` z3mpjo#4l0KkT|BWf_Az7Rl4ymu+&4oKPX1xpoS7CbZnAX7WXLKY{~z0dx&3r)XD>| z`G|X!M7BoTIL4vu=ImG!-NOjmQUrbwpUBH7`MMYjke}C8!#66e`ta_|>A}|~bQq(I zPW(KjJ8{h#PNImNEZUj)0TA{J4Rt#E)~|2K2Bg8&{yG=gmCvIt=<4<+20B=1i(0=h z!mg`~9eqrhn29}OnbY`3&IuHKiAa`(STU8YwQ!!6jYIQj;fu&g?xbV79Be{GO@gSQ z`2G_M>y4b8Uvn$I7wI#=pwQ(SZsx}=)62R@!u3974t#*e6UxdxIz)UBLiXUj3HBE5 z*6LfGKzgOvUA z>> zjPKu?F8}*hgdwGkh|;PJd3hUD@-qN-Z#i<8poV!afhkEyzg*8zv_M?d%micE$$8y* zx0y(6E{>c|0iHs_M*l<$u)ssj%%jd1a%`Ihs^q+qHf?V_e82o}Ca`O8 z=CsypaaQ##w7LPg#o06?Zctrj!^iNfTNVEy3F}Np`Iy)M1Ab%bUVImf%&9+GF%(Us zcP8qxi3}?ww<&eexp0`;FAbpMGMhOMuQp`~ovb-oFlbGxmp;A44?`KY%YSq0Z;#P9 zy4X|&-k>(lZe;wVrQK1wad)&B{Zvvwvc^XRn}FWDZME*Uiv4`oscO8oi02OMQ5~iZ z<6aGt?m&Kp7D%4h55C6nNO?djz6hz5w!GXf_Hcf93Xg_A7L~P{9R{EL%WS*LN4~xz zTrVriA_Od=1@I8U|5pn@1IRRrM1z)ROQTXW0(uY*v#wX2xlKQhL*=gwTjz@s`tMoz z3oaookK^@@X1M)W&+V(`fr9>`^cm{fjv`5&Fx0VD424MsHlF+#!y!M5u~e@gYi}!g z_~KOF-S$>99a8GAcN0NoE_roF=9mBA$IlrBV6m+nA_A;0{f7aii!zBef3$Q}K!Sz0 z;jBAZRW*!Q!?Ib4bO1EEFyI95$W{lo-KcrXZAnm)3;-Le?(8E-&??@LVxeEB3wP#8 z-EDL47np*RHICa9=j+_*;DNeXA{7BH{lAvOo!sNV9G4SOqwG@N8zpJLwU(o6;f4F6 zBmiI@3&j?kJ+n4gRPHD?Qq%R$*bGf?9s}S1nG?XD#sl}uh18xLOEtTV8vn8(zIwO9sUHnnbt#R&%;#H zy|S!cMn$r`l**Np%l)7Ye9KPRAA%LapcoIqWoNs+o%x2j+T_qeh&Fp&Vh{SM`0_NJ zIr)7rQ{J^FE}HQRG_{#v4$NbZG<)lxd}mQ{;9Nvood(T=HGjIgEGEE16y?|PdIetv zUqyy6mmD2Qr$CJ^%{bRDDzh`EOD);5|30173c=%-SCa$PQ0K9GQ%{d>rYGNuF+w0|Lf6}rSiMqg z?j64n0%I7H^x2o|{-8Bwm0wOJ7a$cJpmq42c)l<7h4Eg~bi$3=b#I6GK@Qlp2!m{C z*n;6F)#crMjlj>!==YVSIpI#$TB{i0Wn%fFw>5PWbWg@!c6bg-gqSTTM?Vx0odg;O z83dXi48S1QnNhD7Hz(w-?$v1ZnIsfkIcOnqT*i+B6*c9b{1NV@rKx-eXnU0?6h^57 zzVmV?Nc;&FbS1S~AAIgRBPVWNfN`>C+eg2Cf!$wXBW!xEeE+yPh0{7eCzq}78#D^N zSMFtB4sCxl)n5{*c?0mG!3HGP4W&xCt+U5NAgupP8e2AS1IDMSV&6(AuG(Lg8(q|U zQiKYbxioVPU^#~PNQNLzg|$D5X!zcZ`fN#43nBjU6#P()4_>|$^mZS$3f$a(ALxJQ ze0_P4R%?LHopq~+3h~SKQ2^mq~ve;<4H3uZy3G3DM`IfEcvzHJ>E2WbMlE1Z3{@c zVk!Gp7)B%;mI*jDYyN(k+mvi3Hmd+#e0U)l0*`TFACnCOx*Oh-vp?qkft22lS;!qM zmHIuHOWfueoKcHF>&O@Z+wTYg^i7(%sggp7f>?O^PLmK)u9>0LjJLgb!DjdkuMm9e z&r|MZY2}L>968Y5&Gew#k}?4{T33i;Gv3Pqpp6Mb*Ab#!plde$$cd`ID*QHITn^ds zC>VG>Db>m|sezVc5L?Nsi0S`P<|;dXQ^}_nTonvkkOQwR0ZWhcVgSi;|6yQxpY6UF z9Zf(6{soIaB<3n{{ZyNqq(tN1MlNJRU3r?o?0}+tlFd85Mw(_j^|vL9&?UcjDY7!2 zecBRP$#=LaqmBh4`H&W?DiU<*g|@W6cXwJ!!6B`L=+@4xHYj3W6A$;Wd|J+s^t@gM zyHScPcVLL3(a(ng04?uJqrgPx3Qni4Pk}$B&S>R{%!;KYN)@CGdZI^aIS+}VJ16Oi z@2c8TLgmQWUg`{5eg4&O=Dq%+%>Ny8yR~jFFv?8e?#y=h9B?Ov9;M&Z;D&rHr zu9|uC)2JKNdJ0ekb_4bettNj12g%UyLuFLn#yWB5 z_w$n@hhiI{MtnJWponDTcGoOvw%12&0aE#cI#eR!H||~n3EJfqo19V)kSgo&@U5eW z#6G`Q(-2tI4X__=N&*7+=EiUzaQol@o-&lQ^Z7N!U(x~T=}%tHh}2YQgW&8L&UQ|= zW&GlOoiIp9?Ql!g8=QISYWTt3xHeT^e^yy%qgt=`2t;YZK)BZpbS%ut-ko{j#tmN~ zzCOw0PE(w*C5U#(z_jrR+u*+<`@Uwnwsv1pH$nSAl7Ye;m5J@XantwPD2z4#6*RNy z{;B7sgTkb~w;Gj-cc$FaN@S@bIU)wiJ)eJO-k$q9-CzVdnD#M%APE@Q{7;irJ+$|y z#!6#)hMw*eNcxt4F)&N~MdH#2r5McFt*K-0rFW~ENEXRKE(t#W(!G9F5Vkii=I7Vg z0G>T^J_PRQ88~RG(7iaVwB-3^@x_F12UL)wePCjBf9+ko)K^%J%7|?_T{O^+Au9Xc ztU0M`Zq8PhhV3T-ayzJ2I}8HRxe`B_uQWD79IOL7n)$5ZH6(yt4iv9ZPr+F& zy>yD5*L8J$Pl!#YO;Y1 zE?hj6lly3kA96E(_Vey(ok477Sq@G8B{lP_pZl#&%p~k4#?6HeA7|Ud{qkYLe($zP zPS625D7EJY|4_Kprq#(f?swhQ<;y?K>r`tV1>;Z9T3*Cyy%^WQFK*UC0+$6K~74)gxZNzX7B}b1cA5vi(B>+NLLm8$>;71 zvJc%n{ZSkC7WejKiP$lt8!DiVEBxzDI;l6AXf~r?iCjeEPEl0!sPym^Mt{j|vGHx&|>k&>=% z?F8i*Ou+nI;ZE|!jsIz9D@nWWD3kwr^|$-H-5VpDx4QBMFLvZkUxgK(zlg9he}ygt zdlt5chXU@Vc|h7kr@qm`_F!;mj#Go@d&32t(%W)IZV&=iEj*oiXtda^k*>B?wtU~_ zi}irD6(uht@w&*5%Uq5-UqT%s7My(9-br+YMxr+3da1dXpa#^csd%tH;cf`o>2WSY zXys}!IXws1QK7ao#}p44KDyg6rtFlhEDeYtVy7C6#}5WFzE6nizupm+kkN~h7Z4F) zO&Cy>(YjGR{IWCF_?5ny%ir+pAns_l>Sl0DDQA;wz;VPZ^Q;}Cx~;HaC|heOOarFj zC+&J$MsP#hcK(Ax!_VmA`oaIMD@%2g%>Yk^_J5SrAG6K)#<2#v$m%AEdK2L<8H^l{ z4yNn=YCxW>;?^&+un{V#0_npuuW|oUa$qC#K{wY+@wCdINQ1+UH`v9^p3nZO5@XDZ zoz67n z(!WvlWVm}gIBV>bCr8Rss*aItxqrsX9{a$}EJiTec>ShPWvZ_;K(-imxh+|t@K!KH ztPrC&$$j^VuLG9;>$_s7R4ng}RT$(me|oVWm$6zB^@55$EYPN@OKbTV`|mdI>Ar-7 zHrs63WM)176#C0gQ8(_UFo(UyG*Cg$#oh}oPm)O)>@h6VLVq*QRB)P38r>oT zin^7@sn$2nnT$OBtf-;D-P=b8Gec4Q0W1E#`?i>>y6Hq-TQqu!P;t^CU9aTt;V-ql zxhrHb9c1y!6*S??y%e~YwvEm<-25){#98`WNKxx`Q#o$wq$ch>5TlXDsJ*8~%i4ECZn4drKcPo75DacFWZOoa5WG4egU zQXmqSZ%XAy|)`o!p*~0M$&sDXY%U!ak=v^Fax!$rXhc(E%=MV6y zgr@0%-3NZBap-$x632z8Us=2vi5oug)tm{gVm{&15qVyQGP5DFgqV>jH*wbM=~L+P zv(y*#ZU$E)bsKyWc?m!BUgxB}<(uibXYTVA5k_P^i*wDo78{)Zdu=d@SCjC5Is%p7 zSyGYZ2I7u?wIc0%RdLqwZAggjk{)`nE-zze~Ip7nXO<$r2iGD3;?1Q-iOSu=$dm^hC z^F3^|6R-Ck4N2ZbSaL*|8?(3=Z1`eyZbGLnaL&Ps^p6?0B}!c-%wg6rH!H zG3es`lx+FD$C;2D!Io?q-Ti6Haq5y)t`cqL0Ia3kPm$KZ^ZSiP-aDrIvMeA z>N>eiH9L)*q&m9HX%`90hn7iLM~%1Qu*e=`uVUjZl>8xVEJ8f!xecpSaZ_yuRYkkC zFAR^QnL3ag*tiG7;B>Q)%Cq*Ze)Aa{Q_CIFJu?cJC~oyb`;-*7O7tbN)X>Ls*um^W zER$_d8+@sG+!UnWlbjNbOIuqzw^OB!0<~6|QhK5{SJO8g1uw5%)ZI-!C%`XBlzq{d_vYPi+RaA!%^Oxr7AN$9gF<2`Me zEgqG23$63+j%G=W9{}^PHr@jwt(_%cywI$$R*05v;$@!R41C*5rb6{v#TWF3U6e;z zz@pS@v>j6&tA2HRz_DkNkI_k+pr9&-I9-6rA&RR0CS`8=CcJj&vWTDqHm4decn(to zlv1ON?40)GJO>kyqFT5$Ep6_dZ}M`z9T4g=hmCgHZeKby^ow5aZZ!7G0SUm7pGl@x!bQ$D z$zWI4=EkZ(*cFt1_$@0XirJmbQ13DP_Qciv)m}#mQ9D0;6yx)MCZE^5Ix}5aja5W- zC}rB*ei-qh>?o(P>Jg)n2oKxb+`yGGXNvCS{L^y@S|eS3hS4rNwRj_c&X0zyCrS z;28nPZO)eh#veUX1W|OJPB&^4ED{j5W&X}b8KR0Rrc|&JekZ#ybVM>|;oC>J-w*3( zD(bT;A0TjT2HHweXq;#Tm;QKA72wu&ha}awR+dys=GoR;LslLY4 z!9|f7ujqOCOqX(`>P7b9bKBb1sw_kyy4no>O&~tfLj-+&*1K#YNm8=Pf#o&x4E<0B zeuTs`hT0ik3Vfx()}0BHCSVIWeYRL{j;CY5qU>EN3;0XD%+#ci28-8dUybPeytor> zOfDAv->jZO^h(Fyg_o7uv4fl5yW65-!RzFvB2YFaZfepYea!PKZ?FMv{yx4S=<)+f zBamKvato-H!wh3XX-=wa)fe+{h5EzOXV8~|Bx^2ZE|-|SjpvCrEpT^H^L@Rg}R%^(8@UB(fi)^kLHwv6~d&p3R^1G&P@Rrw<g$-4*Ri&uDxXX;5 z*LO8NH`NG-7}fa982l(}*+AeZn&^m@gbgAt$v^37l{(XozbV9PI82WlU;C3wZ1Gi% z4e*K3qe+IHG|e?~*s<8ZA`Pk;0kS+3es^2)sH$E18@Tr}8WB7lH3+5*W!o(VWT8Db zp)~82dsJ_ns>pY{Je;S+>U*@xejC-xaQPhWB|NK&?#P$&9pe7OK!tR+L>80!Cq~fA z(LD!41&sS<^6s$wOp;d8O# z#+?NL-bttUKk_Yj(q^SaQ#1~4zQqYP0o=~cibj;WSL%>*Hn*|(!FGWOPMAt*wtmd& zkWl`E56?c4dvF6U+!treg^b4P0kob@psVJ#_O8{Zh5gZqi{0T@((>wyRBre7(^HKH z8>`@vjIK~xEP*d|5fI5tO7>6l`nVrwzu%kA4nP|=Q{j}42xImP+{d84}=R$gvKcMtn~WR0&M z&>@TfYXA1Zv(3!wGfy-w|Kg#38Zn}HW3NEY>pYojzUS*(jK4Cy6Qj~-prm~9z#pML z+w@TqQhbWUc~(G`kvOoS;AS+O_~MP8ex}a$sYD=R*p*Lfa_h#12IoAwcS*)zI&sYe zIeQ-!PV-dO)`&U}6{sMkO8YnPtu-mQ;=$%1;Rd9y+j|?$)RS0#_$dJr)U8&cJ>9$M z#UbAT!-H)!hXC?j#g!qQ!8aV7811xNWSG4yOZYc8^E4V#%hp@%i0O0s!TmOnU|k|N zOE|0#afAPI+FbfcWiMDWMxl1%HE#4zkn*U?_7YNQFlyp`BG!F`RO>+^)qa0jqt0?l z+F~5Q^J;HrIb@Z_XxKHuJSpU=p~Oy`Reu{J?Bjo@_hn{0#MDdfX|L$W8L2eWp23n^ zX2wTt*qPpZfB7t{_fN1E=P%Y02SeU;{SOr<=Qv``XRHAd^ZADZSoHfBlPYCP4tFj5 z_2s`)H!BS1@I7Q(ydbN)Le?h@Jag^g6<;Ai>bF~GFb&`Xu_%CbVvov`7J2V z2x-*Sms%1J0n0wduqgCB9G8W5h1i**=SlV~=zV8;Y6ckHF{0&5S1RsK@aZgbYJc}q z-Pc+G9!HeM^3DFo1^4Q|`=);9Ur0@1^b8hq-9al0lO*UxHT+-u&y+*TUu+N_My@}V zs?D2w)RO;%4&^h5(SnFQVNE9!Gi0Y7z;YIe=G2zYstZGp-g2kYAo%9sbsa_!+vZ)8 z1Drxi_lia)@bMl@eQuIk^0|0HopD z!K8@zz6AY`FG5tG)k8h^AU!IhG_3Ko1H?7IQdJeNS zTv*`^2(tu(kXMgz?;1!Z;+jml;J->W5p;h5dV^rE9JRRzW#$aj+6b6n{$8$Ej+rOP z6ZJ`yFnoh`nfgPTT5CL?gmm@OBLRl1DQ;g-iz_io@p$`RkgO3IR~<{e@d3RWK=!r@ zJJi~zRb9}X-YAY1)d!DTy<=m~zyi^I1~EOy{I=)$dy9O@V$Zj2t zJcD(wxUAT@U40*&Ym~0A7c>OVRR|k52kW~%|z_24jcjIypcSKka z**`_s33Ky$EBPJ;{xfudiE#BrlE4S|s`k1a=WJmM+%1q#4=DShJy!XJEtbz4>7-X# zZq7wP7JsAK9N%NmhzHA>c%&6&KC^3N-@KVgtSj4pLS7|Plfnn0R2*G>ICq}Qse=F; z-6j1A^WUpBm}0)Jg?f9^0||(D?N+wNW!2K2Zu?8#@kb>YU%!02*)wxij4F~GJY(22 zBZh8$JB|BJ0yXG5A3B@+9uZS3H-dZ7$v)4W&Pbm#hIG;7XZ~_C-r(g6@WUH>%cdDz z@5Ib0KKUI9xpIm_mNcF8;3{Eb660e6nz{JMO1^{XKN)+@!`&UFKvtOOzKsJQNn|q* zLa%|eexr1@Hja`CnIij;*))>XakPRvSW)|SNSFQyh6C!lsxX;p{5$AAkc!;X6 ztc=#zpVQQ_L5LJ2AMdssrM=wHFiL_xB^CIXf)w-P|i8=_|vrJgq zwkLPlC%(YsG+cbAf?Uyu5J!ot`wv&@9}+VDZ2P77B6}(W9S;O;94n?=)qH%$0GL~T zoq;OUqdJ=gl4jQC|4BqQ?c&FU9uE_cQX%M@l1JbD9afN{Rnh#cg0bp*_xg}(A63y$ z@%eE*Z6}hoeDzvrx}uTayWokDf>x59$ikMZ$7P#B=pA(R=A9&m8w2>iZlubwI86ca z!c7^aYL=_d7_x-q66XrUYZaBlzP+_;CMyf%5B+D7oB33enEh9BX50@Fw3ILCu%}W< z1`_b~s<{Q5dty{>Njz0>A|Q_|j!U61%#Ofa5*i{bWY2mSAv%t-aVZ}1s^%6uyepk1 zc>8z!0%b+R*=+I=Vv~CNv;D8vN`x`MwOwe1_HkL8^#&qs^in^{_yK^ zj+Cn!ZvLMvs^N_?0UVSGymSdD`Q2H!BMsMki1XG+?oBfi0^7(@#PvHOdfv7kN!Xvm7AJW-UZWJYpzTGKd#|6Czm zh4?$~3Vcju;Bk5@kskYnhS0=bW={bJNojN;s~`!9R$4Q7n42ClKVi%*(f2*~(+`yt zw1bP!b5cQ%vLEtZuRRq#znijFd^y>fcqNeRoh?{XuxCy23f<|xPtwoPPJ+~{I>mkq z$^%Z+cl-2~>ErDipKr8gW(y*a{Fj&7U94(fax22k`c+w2TdQ|xI-V~>($tHwrWgoS zNl=oeNprr^;u1`H$eA{s%rX4yd}ovTr`IU zSSND)0emtulNbIcG(CN({Ni~8A0Hu^Ran+9*)W3ebjRr;>~5d(Cyo&3L0{PHMuc}K zL_8{!WXp`~ zVyY6$|7rp2*90S%@lY@OnsNq7B$k>`PDZ9&wJ!hAB9h4VKYRFmy_BVMoiN|1`z&JQV>EJdoHu&JPM$f1%c0?6$v42XeU(qJ1$R#58Q=Zs{N}m zoXfD~%VCZaYo5^80Sb+`@Y~b)@VOF{W}>sKD19c%(le>Yzte!5VGvv%1bm#wnz%bA zULMgANFl_o#zlo5p~z=jK0vn&Z6Etlpkwz>1OE2SK-Z+e8=EaUvH_6F?db?Pa!pmZ z6K7e1tK${feeKAr)`wHI>uG-Qq-g%%U0yC+It@~FuJv>Os;jgy3PQ%H1X`-Lv{lpV z+01;>{PWTJg2w!{mSDlE%IY+50&`yR&|*Gw*N%T^Qs%T>c4s51mX>tFJ-OIPo8{ac z4U#t!Vh*yl_5aM~M%{19OvaUWX7gxo>dNQ2+{4&VU16kOl`Fl>)qhxy6CNrp{Qa6Y}Kkyu6y+I3`IL9frR?L2y#Wl0;LQ zbC|Q=G`}KKMLPRk{Vl6)c3rJC11_}?`1s~bJSY|ct1zGb?5b${Org_XRsW;vpAA3! zR`Cz9kUO!Ble&wfmq#3;G-(XB0Y#NFg*%-8JQ1?KdxbqX;b^1g_N%(Jt*1{X%Zb26 zPDmb{6YD?qBw5gHUmD!%p=RUwK*v^WSe%f5z4v=UTuuM9dGEDy@vAgDIQQe&7`egU z_UdxBGD+}hQC-A~W5BminJ({#dP28p*&&(R~8M_Jl zUwJMP*)_%s_&&d6m2D2b+SxmZn~-|{Bs-?m>#p&8@Qjw&-o|_Bpo;EV$J82M@GrP% zbGooVscTkDMV<6-ZX8Ma3tkiU#*_VU>mm*OF>ma8RS*p-m@Fb1;~?ZNXOb~%fb~FB z33xFT=gC<&P-n(KjemSs{MWChtqazA&ru_7eB0>+NL*0(9&V`TM}}4JM|^KsAB9-+ z9d-k#ZT$_-;gan#-)ailfa#;}<2>-D#D4z*#Tt95+)KyDIr#!O+1&U=DcAM&?w>-% zpsVtrkV~@bx`-fKy$=g%rp{|bErl+r;&&I*U-;>InD!KPXESt42txx>{;bd@Vv2C* zQEYxIBF4=eE8=JQJCZTCDDY=Gq@5)BrQX`qWkWBr!8K0+QT_t3g;EG?qK=*v4fKKk z3{slL&YxAO0xwg{GYzjyIy|4rkH$J!Sa>MMBh#0=7U%Jr$g9h_G7IJ#nOF{14tx*K z=)SKp?g^G>86nvBz-nK4ESQFKx=AruB8i@!=p&S^r}m5HDE(aP5879>3OW5UH;dbgl&G%DZ~DnFv*8}tK3Cu%Q#ys46!>2j z_?|&YY)KrYWxYH+ZdQ8gz|j8Vp(gURinM7L^c9m$pgOYVh=>5L%o1Nc3Tm-h?@t>% zkV8E;<6TaAaUG#@^{Y?T^XF8uD*=XoOdQI9fg6snDTL`|jZ4{u>F}gcC(kY0#)gg^ zx(yHYcPtRTgO+EwzO*+A(Usv!m|;8{ZTuZLU~Y4WKKDd+2&(w^RrS(iOy&gYJw?KpH= z2k6r)8ul9ImtgMMsM_3N_^?UulU>uAI^7!ttZiy3Uipqo*DZw>5-5SFypBEG=v$~?olH05mJE; zk5|_>22EOn7LYM}5BafA9{hKP@fSxC@1^y=li+OVt42-9zQ9H6g3<^FrQ(P4L2*mC zJ3>oQo$5oO*iv+yhBaaNh}k&9j)5%l{V9%7_e|&<+`VG0FJQ!>`)INhQ#3yY#-eRtjcP>;Ro*t?=lk#nVjw=MQu!lA=jQL zC4=CsPrI=V*Sqp6Y~18;+0%<7&%d+Ob^KZGPJ-q&MR`XAV!`%V+RRdjVwv*DSobgD zM~~>tY6ltMmxrk2S(&}i>ySy&_Wnm3mbBz39wJ?Y7$Z&B)Ii<`-+q5#qj8ED-I0|p z40x`;TDShF2zeOE_Mh+iSpNdc8ui9Od`zCeJWX#Gig|>>d?#m9! zi;^ZH$Dhx6{305l$6Rp$P%Y&9tG-7S`>gLe}!uH6kUrh-Z_pF8_;ZC zhIEZw^Q;?G{-umLPAsq8Aluyk!E>9ta<}!=wi8C1AHkEKjo45Tpx)g3T!xY;V+)^Y z^JG!*3c?@wA95+#Ih-=8-AZn+$ZWvzQ(~CPeb9na+)uvYdiqb%b0FHsTj!&h3mfSV zfFV@3gNND*?#JfNeJRi7;vjf#dTHVh_unE%4QLxxoY_BH4t0hb;$N8m9Nev9r(my4 zg`TCYLPti5rg=u%F&NO762(5oxJ6{wyg(EBBN4+2Ez>c+lZV9((v~2DALN%l&9eq! zbFhO8zi2KjBD~+tB;H@v3>YX=1eI&0C`a>L#)?O0CW!it5#Q}S1|96oupAhmNN60( za{1>!<{7ZzH`0_rjv$@dg9Uc8Si?Uyw4}JbXWy@~rtc>NBc!QYOzg5rMsTNU_2Twh zSj;Hp3V&BouKgq}FOyMvILQs0brI9v&mfmn6h_Cn0ry%F$iL^3HVlK7Q zr(PR&%ms_jNC24UU#MlI`19xc1$o>vy=~?the~Kw;OZi(NO}iO&a@dkNr{wXV%`%K zra16|$^*oP@x6Ue>w(9ksMs4fMe(JmCg^+9n)j51kTX^09U<7Noz&LQDIM)8HwhMS zI5tYx(3s(hooiwRM71}e)T~w4x=Xo8bAFDn-X8Y)Eg0ujjfeej;nyLw@wj3O8sN%L zfd2&>P=xANs*Y{DrE_Bqv@S2Tz_&*bPsOmot62;_naJQ@9pz3Usd*9eqaGLZ__+ty z58SLHWj?~y#k1POi{kv*I+z7I4+5(RRYJ;6z_)M@26i{&ss-oGiJo`Eg1Bp<%+yIg*4j zPb_CgpQq(a>G|6Z(gaG|4K|ObUX4l&e_>X=CH+>e-PZ6|<1GC@|YyZ`7iIv=M2{aR~>t4-S`RqM-$ail8byh9k zOSH#6+DRaWW-g(X+5MlKmk(wOf@JM}8W|cPZ*3>?U{jrsSbu%aqObw;C<(g#WmAVk zbM^kIh3kgVUw9cuJ5YT(HskfEop^#DMrC1QKyl6J z`EAef&S!6neeoLZsym2V4r<=-@!g~3@T2`TVcpOy!`)Bq!Qs?Hz0w*tGWi#L|LEUg z09h`Bvbx57DeW(yT0~V#e{%DIUdulM?T2Risp`x7+7U1 zYTkI5y(pRm?#&a>Z*G_MM@nh?MDP#RHjga|xLYzE^jvLEmu7{&2YtkIH$EmF41QAk zRZ&|S@7r0c5&fmbh@M^JoN~cUQc(yD>Z<lLJW|5np=BcUhnkK!oYPduA6lVtc!wXV~y`9J%2 zZVDn$5vF|O3ss-0QlJ{Mrojr9<+u z9-nj3_<0UK;7(n>TKwVABQH}Lb-PK5%O*u$7P0v_QLXnUuF4<&UYr@>t>W$ot8L;D zF>l0wJpdg)%bLW;s(XcUt2pv6;VCuyn|iaLf02Ggl=;8gft@_HckZfx?xa^H$Gxq2 zweY~-_8eaLY5#WpUHa5UFpTP|`CY@yAJyfN1X7V9@HgDAfDod;ls&lvKsXu7TxbJ8xP$$EXT*b( zBifiAke9t@d#*yb`g)-3mKAIcxyI%?W$a0HT8?WpQlvYzKUeG4c zr8-~J;)3V?HV%|VDGDl3$0jrHVws3j`B=aYz2|SQqS+HGzOZMo6Q@YN^pksf70K!# zz07bs#jQw?#A2|u1UjSE>AdippkdLVm6j}33Ogp>zj5L~XRO+}n}3XFQHM{Q2F=vi z(2ZcCVFHq4;_`Z&kp;2s(TC!DKxSTtl+!CaTixh(q$Q5&d<*aN2fS;1&0wBglfKBo z(dfweK^CzUu^Ear*01w_g|Ta97eiALX~Y;JyBrtwk|lLa=ehU?(mK>m_s$z@JU96| zV-NW%ohwtU{aa$++ucp1dLYx!r{x)6)A8QP`Ua7hi785+5&f?g0Q%LfnLK^FZyhrD zB^as7+=XvEH+iMuR)!+(k=R40?rAAo&G>Ts-;*geX|+(nsqrL8{7mV#e?k^>TZj0m!s-kCKl^_vo`iUMkoXN?kKjZ zy`pd)(O{z7w2A0?eD63%i3cY{Y#;!Tb! z3;ZRxa?YBauTTGgezjjrzK{gcxhyQMf9-i6i>(0(bC-Yc;-d>HbQ90$&|eA_SCXHV(1XKU$VsnwwtG8^`o z`2^qhGvCP#b9;leOG^k4OOz^?FQP3(xH1;yT&T93n;ZuO z69O)uzzrQ)=CzvGdtceM%69~Mi_j0oAfg--qnHv}NpyR!di+&a`a)#aQZGHt_A>HI zHa}pCq%tLRPOx8bifqK6wTS2Cxa=psSI6UreI7pNKYbX-K+$s;_{27DaN)j|cek&7 zI0;kaj-z>(+od@9euXSQG|MW&lTQNnX#`X76=Rn<>Egoq?al;k$o?$nLAQ;#GUjJo z>@aEtL=EoNSpw!e72!Fc)=i)*6QQQ!5%K1n=Vu78S_hPD$CV{i?ik7~`tj_Lj8B{x z%(FvTpLaC?6zPRv2$P&i{Z)D9QcN=6OLx#^+ln0C1+GY_Q}1~@`Fk%o(n-w6BRp1; z#T6w*7)hz(O?_nP=rRkZt=N8)@=^9L4>BgEak+OMDFhpbbRU<$N&dh-_|NPlV13Di(=&8__*l2!OY3 zUb2$nqVdqEXsHi&k?ibzb-cNv`TOnw=`N*136YTQ6j15zkPhk2 zJ48@HLg_{tq>+w8kZw>Kj&3*_j)S}BKF{y<{R?(?c6Mg=Ju~lND6Q*#ls97b^Wf+9 zG=9i^6A|)fQS3la$GPv$kHPX7o2(XWpP8z|{ixEW5eJ>z7iPFpVIXPK#ro-Qv*#g& zyGV4$X4GchAHa`g0Eh+G3*B;&r3U9V)w|%tlz&!4=cb&cu}*wf%$!>k{}Hyl()ghL z^p%Xo%ABv`|&ER$Avk9zeUbbdq0{g=^woz zU%T0#&3B`zu0{mjo5O^{2Besk?Yoz8K`aBFGH7cPJFkBhgk4piKEynihE%FNNYbRG zR=!WMocc)OJ+uY*cyYl6Et7Y+Yi~SKI(xlj61%enwYKDPt2SF=%a z!fZeC8LqOFYrrHT-qTYbl*jZ-YCXx!MMgRuM1)rdu|4n{v z6XQi>KnrRuFYco1n^iULe3a1U=uW3TMUxwug&#NHV|0gkJ`Wmp-v^l&^k*D(<-;=U zNjFKm4?UFuoLuhn_0hSv3k~(O*s4eMcUd~r{|-qr*LU`+rv5cDAJ5NT2W?@ET42rw zJh^mS;+PW=>##@gD_%_*WDa-?o36cBBgC~bHmtN@o1-qZiI%FV8Wx%BE*3Eoy~jgh z2?)AtVpdu8yr2s{`c~?kFUJug{q;FWFzy4gZF{Cs!TJ@dh{-96T|#~Be^yH5mQ|vsQ?OpujI<`U1uOH3h^WzN`7F1^1_tzks&To*em3a@ng9YwKNPoknBJzR zN3(gnTUe6V%tJ;vCSC5%J~5h2);X+4=xrdN?)1^Jr2Wj0x;4~8YBKdq1%2w&MS{o3 z9o*wf#U*X7W3E-_%ro zmHR}lhpEd^Fb(S^@CMc?s%9QHR|3r@H5 zxAd5f8S=666li>rhAb&UM)zfQ=B>{b%Nf0 z>Q2pdUdQd|TGZ+c*Y6A|dBCW$;AWVNf`YYju^Xr=)zPJDs;!$TcXfFW%N~ugmq# zQ`ir5G5i8prPUf#+V#&ZZgPy*(PjAL%O(@8Ad+Ui2_L)AJ&q&RZz@vkAbr&x=&34I zV+z%ekMVb;$7tD~p?%^gb(y`m_Ze&Bx`x4v607HNyW;)%iwyi4P^OPkmoCDaZQ*8ctd0Cp+ewd*q!@rs`UwEGCN zQ=)(s=zELaf!>QkGy7I68X1&OP0ADW1qJ6PI?X?1q5MWyC=!S?b1y~NRJb#2an zr5&`wqZ0o58+%|`*p0*;VgRfd5VlU7Z1jXxNTLCnpf<2BF7tpGcq1fyPJ1`7jUZJe z9}rx~%b)8)3I1EwR&A5I_TOQOdGbY_K%Jw!t@`^8@B93)b`tv~KI6J+=d+dQ=W4Rc zw|S)~dw6?FgG*YKF&VId0i%|$N({xQE4YjeI!f;JD%OQ^oUKe8?gtPX+6p{kFH+P1 zl<82B=5^8j65ft$nemr;2Am!IPheNyYJRSMPPiMto^Gm<)oOm&wy?8Q(;CHo&uPvK zkDF-%hg%X*TavW;GE{F?@#^hRUgnHY4Kr&(K8n#7XLF=skCLMg{P0-5kh5b5hPG zp5iO3#X3Ed{5!AvGH5e_vz6I->WeFRSAOWk=`3yd?n5SZ-PvVynD2S(rf)EkyTUZ* zWvGzAJuhW{Px#`ETu9l4CoY05oD<x)OmVqE-$FKKeHo*t9 z6ZUBnrJhvXzd8`>!_z6maLKDnR1FKQ^)(hyKy@$>y+2KS1wN_y{9;xHsP`J=_KUE% zUGy;#j{Tvw`;*~Sxv$`B&(D&q(lBE!_2A!>F4^;^_^h?aA9H0k%G;w~0kt+nDu6eWj7-mlG533L7y2H^FX{-DYCO z-n(&Q!I7t5P#-VnB_h$mZ&xjEt~;ukPAALVIQRd?a+WzLt$d9I4Z0D9?5(jQ_cp$1 zW;A+aCD~F^JmAS_QI$AjY%h(Z&w;r=qpSo$qA)L}+F8%n`S@YCiTNS*Fi?GrCi2T8 zkTuC#KSE7RG*pKW;kUBeTu=PqqdQqaJW}3Kk-YKJ?mhuGLwbQeE!tCenYAw?t`-Rm z(EXR0nX&!w7H&nI8Gf zky7b)Cqn~BClzRq0HklXgBr)v6-A0ZW$|M=Ad?H>l)ZpFXL_hD6gzD_G*#jFO3_Q)AOZyzuRS@$5g^0n8jDPy#LfxKbaB{$26~62^0SQ?zTq)hIbC`IaB}D?>VAxIl6@_Q9?EJw zuw9-J*ThvY4KX;I2u#rr=0@CiwZe7+C`NX-%wpNcEznyO5J8FJDJ309T8=qnG0tyh zmF&|TBB&GHt#z$4fbxHWpRP{+XF!5lD=9;G_ZlG?)j};Va%JG_1k-7opHgmn=}iTx zk#b*?5UXzh-*&!e_`;Hlapq7F4S=5 zc{x2?D(ZAlkI&Cr?TN+2-^~2;j`hK4CqoCf;CdZ~!uH*DM*YU7;KeLqt_|PK#Cyy2 zhl`0MbVSU1oEJEN0NRhO8DzKck8|iOGrB#*^-%$!$=M`$o}Sy({9$%R3y!Y8brC)j zef=og9^>V7m+6*!o^3;SV|NVjfC3daa1PX#{yQ_;|6u{NTSG@y?s$SLDt3xG*|Ken zj!We=rCO+@n+$&UZ#|&|AC)K#3&HzB`_uV!e%|zjn3@$JX-+tTDkpRu``?POoSP0{ z4k?Ez8~od~n|%ZjFIQt}YH-L&C5H$y(Xd4*4i3%an3ox1}YXt~C5wO>t zn$EOx1VR`f3;5XGM}N*xGQqXhItX|<6aQR6!oh=3s;5!w1XOMIpoaz@Uv7hH2PTjmH^}yq z_w;rrZ`pVU^g{w|o|y=Ou&S9wua{}klRj95qZ+4pu{g0fG|r7^D)EhInyz!YT2$9r z?WBbm{_Ev(U_Ds`hx_a^qNZOLS3HqEaQ(yc&SL6%v=yv86s>^d@Z!QJ$f-R zD-eV)?^SZ_mkX8u(NU`&oLRR0Rzfm}3nakmA;ESs`9rA2lPW*%KvYCMh^o6Bc{BaZ zilNA-eO$BaMoZJxZdFw%2}@omA7tac{tCC1`nJmgx1n8jzNtJ=q{>O>D$4|5SCN3( z6ge57fy~H0t;z$%$c{<2l@*q>O7Ob+xmYX;?)H?#9Hlzyg0*0^tkP+Tt$+%jh*)Bx z@BC|=t_5w3ZEAo>y%%MFWRFoNniZBtQrn8-_M55HN+5vR#F}UR%p^!oE z>jeL%g9Oz!?Kr91DIn-mR0HlMQh^T4nDvRoMpKO}I)wk~`~RG2N>i~wIx54&p_bQ3 zt?|Z6@bzgc{Ju=HEN5R!PGPko=L-Pu-S2hJ{S-|Fo6Iai&+C6Pz8kHg6|iNl(rpdp z{}V^u0O?FCqhp`{WBo|F($yxuIK#}wI5uU=w$1i)MmJ9_t<$3Z1L5szC~pzT@!Ah@{6G} zHcsCaaUpzdKA^fT{#s+5^8^^4pLwN6i<9`JXh`@NvC5ZuARKDq#X4?p;`K5O`-n(k z#~ANZ0hg&f0*CydZC)nWmSv=g3hKT!!2`{~0bnFTi;>6|_5HjPk^65^)TDMhy^hBZ zv{btjW0_#f)k)#$KHhgGMx9Oz8N0WUzzjSI@&QPk3@5#}c(%-sa_Q={0)XS*AD@Bp zaJ88tRp4?pcpy*ut)rC`uN-(7gAy*S`6^^jCyYHYcl=S%_El1f&%vIxrJiG1KNwf0 z?gsAm7>yy9>wdvTX(>dwlLFh|CNL;{MA=jj|K9JGG&5-<)AV3BG%p_WxsqJ*kI_{; zE$f+Yf0S{PC6nb8R9+dLI0B%waQu;WD;0ckr%~y7=)t3017l2X7~Q=4aRUY9G(|`9_if zntxdbpO&26$q_=hxv>~fXBk}Gt#jj(UmO#3ddJ3+XmC8|Pzkc(>Em63GON&Kk~0}j z`<`b%$S0q&qyg1SH3G#c3UaGur~TYsg^ce;&|Fe|tcW$_xX!(k*nRq?l%3U+27ocu zgCEhvd7Na`39H{VZec+=idPyU5-;~Y4P?;ilfV40PCGvUteRCZX9E!Brucyqj5W;06+9-sUYpB zpz{vj+bJwx_uapLAFPPQ@U=Cuv!hA{^LWnTx`Ffe%|l4*$I;8BPv-tOq^s&!4t%3mmQzAEgm1^-1B6_G-8fQ02R*%2oM>qukI;I%MS0#>7 zj1^aq$a&p|LSL_9OMXXoT_6n%Fcsc1;yYbh;}}*U=Ql&ic2#T#vQAPwy9+@cFtv@& zbN{5uq}x8t*>~%SU#vgS!ecN&Ui>-9Og5 z+*&zwB83+_OXnU?H^e;-giKF97*QIBLWvbThzPNz3w1mgBu$vK>0vV z6*rZDMsPQbA)ZE8B9i*rWnvwt-gTEmVy)M89gQ39d#fSE9S5Ipiwa>S5I8WUk`G4n zDzHB1o4Jg8lY!fPqF2i~o)- zvs`G`Tp$OsvoSqE0=&5X(jth}l^VIVcw_5Gd4TYvbDNlB*x6S`HuI~E@2t{iEvc!- zD=(fdQ7>fhnQ8g$$4IpT-gn$Tw|8tvyObEVx^-QxMI=SkwBrA{4LDB`pQ9v9hoU6B-IJB)xSd1;n6 z3GbAOLti=`e{;Js02*R}@>kdIz%zdz*5&`u5}u?GI~sb4)>KBkDboxoX8)541 z!H59(c_Khk8Xfe+lQ$YrJ2ovN)z9mzlL(NyTf8M}9 z$bWD8$PVy7v?oBg%I#r6)E?4PU?86FKh8z^z-Y<&RqZ44MRSEe)C3)IgAyz}oFLQ4 z2)3NMhxO~d)vftu4a?HeU|r!gSr)(n!!8>^ljt#iKtIW1(*5jLz%3S#Kv}Wck=jQ* zafFak2!GhVVfqgG&^ zzZ(MfCnuPTdqP(U(u~50B0=i{7Iz7>TwWfUf#`RxiyJC+U@;8(T(uwjh`Qk!foKC? zIm}yr;B$0Vk08RM*tM795r@c`lSf4!>nCr)6Sjwp!kYg;*_4OaPMwv z%+?uszN(;%of3W|=X^G>^)d%eF05$2e3z{D?54hWL2BKuH7-_p~{;MV4Kz zqLRF355O)HWpZ9S>7$Z-Dd$_!B0GJl7X&S-88T1Y-h@mRoSGvXLr9NPEN(l<@I9k9 zlh2DYS8ZA~36$0e@AfayOBa{BV6>L=(H$N_j0^Oie%lJ)wlU(AiPAzQlpa5H$w~3Q zk}vSb)L#9eW%~XPySR0<4SR@fbQn+G>)o|t&g0Q-ZK|JarG@R0F;Sprn{TEy3Oi)R zp;)myxt*Qf^>#AJ0K=Y!{tp{I#s*JePn9ZlOy36}_lIt9yEObB(tt$R@+-CoLQ}o` z(o9n!(T?AqiNOIkgX?nc=8+v-7CsW8`Hg-ay(d=xsy^Apj&uzlYa2K@>DPc% z_NzDA7mchEE561qR0!TklYIqyi1YXt9>0;kOlu7j`nL^w5s1b=K>qgQ#x8pVhm|kD zg914j1Fy*}5VOyaxWCSBVu)R)5|7j9SwU;vU|0^)U#EnfT?%;K*mHwvf^eY#u`=qyk6VI9QvT+Hfe}-L~A`kd0GmB$a_I4!mxp^IK5H{9UGktsux#q8H zLEE;iC3A!HZv3 z?xSBIUws%wVm#mB7SSOm#=lV29#2^?j0yVgzqDq~kB<-f0a)%kN@ce`V(?# z4qB|8kerfIoPjMG{P7InAgEZQHZfe^A!Zs!@^%bAU87ZragV0`&j zgY(VB9L?A}kI+Ug$R#Q=^#*)VQ@yl`?vH~eO-%ZiMUsRc2~g|eoa1lS;525k1Gc|F zq$%c|UcjNO>+)$-&Hp+kyr)?I)kH-(o#F$v7msGJ8iBw`Jg%b57>dgN?o%aWz#!z8 z8mRkM!AdD0m$n{B1RA3Ed#tsMP2aYZjs(g z)1q8X|LMIH@`BgI1Djm(^YNgLS*=fUL0<`m`lx~RAl9vdo0{)b%Gn5JcS1dXKAwpP ztHSFpf!SBxAIJa>IYxl@q@xw=fZ0NOrNYEfI*#YR(KQ|zzY18z5l~msOFmHiUC~sR zc=lGjSlun>IC)~n+26&mOU0g3Ui3CXJ5jPt(hUwq){J@+vY44WsUG%(xTkwhv!@U! zKaquA_0lJ6*ok!zYs(r*5!AwaV|hS!e_jWpy>2?t@4rZr1WbR^VxZ0qo;qjgLt|+~ z#GygklufHHPk?0ue9_q+I3P}d zp3wbzla?twG`KpOYS0D}65R~nGY)gVZR)*#Wg$)hwP!dGqx$)U!UF@MyZk83lU3M7 zKP-s^ZEtgRr+CqY9`i9Gwq6cnqLOLk%~TxR%5MPKoOG!fw*7VVes`{JS+$P>;ND@f zjR!H3btL}Kuv~jKu&S;E0BXZtDoz|n;Y7b7A2RCWU*#bBbQ4> z)jfEJJ7~v-oEn=?(g@^(Ve!LyRZLg|vOc=OI}0r%IsgrB_`?9auN;mmcGRyV5{SN* z2w*xaP-2#2qrBQWoX5nytN?R_@8_GJiF|*F4*rsEBG&-L{Q#zmV)c@uRYyUPh6Pd<6g z&oS07UWN4_wX`@^hVE(eu&z;&b!&>r5tXn3X0LaIkV>~lt02#?Nor#n?t{5AL!W)Y zAK1055P%avywI>*a?E@oRBKuEGS;%!wjXvTD*;;THyax%?$^6{4pZeMINhhL7qS{3 zGlw{myjCECim5hR9{KbkcXy;MNUtV;CorWl-A%_}h07fNrk4XFe8)Qn(_Hd+0Lue0 z4*Q2mMAkq5TkGS1#a0O&L8(!Vp9Qx+1xp~nIJfM<-c5D-Gl(2rfGzWLwD#3lyV?G{ z&%pjYbLXZhmGzqA!{y|KBc`j*(=z_SuNS$ynHP>Ce{x`@?`#dWD+ZJq@D2(4ggjEJ zwiBV9ZVnGUX^N8K_r55oU>?V>3^r5&J|2X${eP`99IA-8bfafU zUtNl^v%3&tfd?!LPr0A!Rva-H$T!#mT|WFHHp1lMm!;%dxn-_GJV-oOnh0gkvA-_9 zS^R>t;}&zZ)riz@yaJd%R)6+MAjOV~h2?_a^c_t7vcilytK_zwCraOakt@|#kutvx z7nDyfpkZO~?;zDFiKhQ-V|q!Ls{Oc*%+XcEvGP3d-YO{-HTAp@pqeM83IF#PC$aUB zqI~U~+>#u77TO6&yQmU-0p6o!=CIN(RCF17kKN}^L4E#Zu395|7(bZ$f!3I%N`%E{ zX|p5G9g3sb!1He8CnEIoC(ja($3Nz09ZISHmGG#BmNteme7qcoGt+4HP+%LGaM#3d?qLoBEtOP1j zu(@!$r+Fz8x})<{2^@8upPMN4aFG$|3Q+la5R}Rgm1%QTkEFWBWHxs7Eb75AA%xKN z6+4w*iFh94g{qB|{a(Pcgt6=Rn5YkxQ@eHD{r>PFD7E+(r)MkifELf!XO6@opGGvY zPY9hc@M(CUQtGLR&AVPbzd_ovDrda~B-oq(ILHM)yb86!XBeXa2!=qTrKw$?*7E%% z>9}2R*v!k-n)Hvj=2ZVyETVnVxG| zrF-VeP}AB2p?B;iQ3V=fcOc=b1=g`1y*hxBojtM;bSB#&s@M_w;RY_9dVyv9%kvSq z>a?6zFHVZwv#{3FrUra_k|;dBE&I^)N%o~QpPW)or<6-P_MkMaSLJ(Aqnye5QXt1C z$C~*Y7HsX^{{pe=lpLP8as%_IX>B~XT+Z+yez>)dXNR^UVSb6a?~LiZgj#qbP)xJx z;cUWG2Qup0w(}-}zV8gRZ~?p6vix}ndv3;xapF5h<<@P9zZ|_OOYVoKYTaTLXEtX9 zr;L7%me!)zkq#WC+=~>&`7$XDG=W*HSwq8}4=$SV%qa<_sz*K_0A)UyzXsDGfmYnO z+5VpLyMmgRrJUJO7cHND(|4svMHJ|7TZgY6*Qu z{KT-7t^h#a|Laa;uoErP0q%3xEH>Bz3?f~Ak>0O{xUnQ!KF5#nh#j{N58weA7pO}r zt(V}Xj7~?(=6Q=o-6HGRbp~nQ7*q^$erL@5D*eR4WrZKF2^$X*JYe}ukKHGYTF-Lu zr<&KkMn&@HiKG)lL9!N7lNgQ;uWIbFR)X$$fWDA!x>DD2SmF|vPeAwI`Hn`vQvmUg z%?J3yr0n9uR<1}Vm?z__T`MagKy2Kgj^5HsHo_>mn)18V@k0aXwg0|l9P?XLW!;U{ zV9nW03aOZe$eP}??H99!{VfY5pGSGaBWzH9I5-O}~BZKjQm8pFT9 zl>tY}!@ysPhzxyZFwPwG<^OkLzjZXmZ^l!j`>yW)ni4Yc6LrXYD&;p_(*)O^{J^ap zSrq@76PKwIOM8$!h@TLbv{g~RUJp_z^$bbZ4BHp(yl$^~-FwG^8uk8IYgPCue4Sjk z;tI7*$&2-DVkWNSP1_qKM_l_0*6$YN%}{L5k9t0?LSqxpvLC(M&hzPE0+Y1gTpB+B zF5|TJd?f+(fHKWj=^Uz26ak#D+FUIHQNaJ5CAD20BZ zPgik$;+cAX^{y@7tDGnqy)1R!w$1R*GH*O65*6(_`ofI*qtkZw;96f*^NdB*H|N`oHWy?6>i z@j3EI%*V2ZcC~wHhZMlSsmiFxAa1 zAHv(N;N+`5)onZvGmi z=^7hWFM6Fjt#37h`DQQ_3yNL{x&F=cd}_Z zp)PifS4Pp!Q7_lu0t`>9+<5DS@f5qC9Z|Gg`VJqc7}>J3wC2=~;{n)Zyw{^H^r45a zc1688&MHd~pI?O8ohbq#&4|3jKaiMFi_*VZh1%)lV*Se%`eAJFn4u)~8)-ru_Uv&7 zljt2u=*k?$bC;{reV((tNh#W=Rqd?so5X2UtuD9JV?L1<+Kd5>|Me= z@A~VP85S?`YwxkWfVAE?nG9Ja{_EV@`@gfxXxE}WM{zjXb^um>=P;8L@1|* zITJhh&k7f0^C9oPN9k`+huRLXGUTwgauirrMV^?X)m@lQyhJHFD76jA`a)IMvz;*U z%*maDudCVyZKWezm_HMW{`+$~5)zGxtub+ziILRx_;HPv6(ee@5PH_iz3x@rwrD~t z*o>2tvILkiP9oZUN861{Tj$kV~O2<-5WWP`-n5 zqZ6V0W(MgYit>$zxL$tP1Vg@iS|OnRM9w7Nb|No-yike@N)CtpM#@QO#7F>5iX=!mqRZWIv|J?6KUk%Tscpt(WYU!%eXK&4n9Dqrq)iuvDY8h~D zho4|RGcllfO43#sAb>Gh?_PBEL|zib0IUt4SnR`3=yzCeSdpDGi=q@!|C1yvB%+pS zXkb#_WA^H-Yl^ngLmLfyjX{~or0I-bTozw;UuqTN286yA8!~r0_Tk&xA2JD22=EVh zpK#snuhLrKT)*`tF7G+iNG$hj^QvBL=Y%N_;OPcgJ+XkBbW$e+PGB&U8mC1+gsS@t zl>k1WYGgi03<7k_dz?BMVndn%E-!MDRX0^c+IV{eE~iCqGdDi7ic$Q0eqZyv;v1hG zMKfpkb9gOJs=O@#IQe>>c5bvd1a@?HIt6|)tM67-I{0-}@!O*lA{`@m{FvN;Mt_EG z|JBghzC^2*a}es)Hz!IzU%$b!fs$?33`1RWZnOHEJXbkGx1;?3VF66N{cYFgprm^Z zpyacTtFu@U72xv@aIQ30C)$*#N{EbW&qqU8!VDlnY73&^K|)_EVX+(7qkY`J(_Q{t zh{(7R)Vm1igS|?r8d2!Q>{5Q-2lyB9BO^8=B4e%xS1QlKm0n&2crQ!G#88~%7_Tc% z;XZHIeg1jcE=J{qBrSwq{K@t{LfBsK$zqUobD%l(!U(+tt~=oAs{6S7T= zZi2524>C{xr8EaS(dJqXtK`+*muQVgTLNI&v_hTrAL2?{*~)JTfba5kFSs)wGnM8b z1Kcu=_WtHK7#$7!$85v{th2iS((I5Vpjfc1!<$lV*VobLk*auCndTSe)B|J| z-?@JPknO0Q%(YLkd*kx!Cv%^MWG^w|cqi|EcL{Gs$g+>_hS?BRzQ31yb>qWH+mJ_a6z^I{(B1HP3K2% zv`@nqBAKgzy!`k~A#|E{D-KJ@?3};3yVfY1dRhvv>rU?nYEKUIN~a9h+-H&X1NOWM z8poMJq3u&S7c@ONCdc>ZR{;Q%{t@##If1SqmiN(}#-k(d5j?Ve@u1U>HBuM`hr6ky z#sYyK3xTq0Mr=3|U z;!Y7RB=$1;?%KV>IZUOce*Jb=6GJx^{Aai}VB|K5F@x+;w6fkyTjT8z`iGo8=M+K1 z+z;=6n0JeIt0WGAfpRNdQ(6~ib_T0*oOg&wpxgPFlogKyp|fRdi!=h5Bj|}aK)oO+yx``eAl%mrsk1_f-yG3UUi1kPYIug=iOdOyzRcg zjt@U*xe{+?=X&8Edf$Hc!b@ia);HdFDu&2mGO5lfNlQd9EikOKt@1N|Jjg9_a`>U2 zEe*cW+P=Yi5W}#Z6UXn&vBg-?p5*fJy>c7#OYGFB#%uAfOUS)Hwe?q)f7l%5N@)DE zh3XPM8BteEQc-*1GPT3y)wSjDg?`~tiy@V(StMuq8=!TI)U=`K2={?5cIX~+=&RJx zvl~rC7HFPe0UK&U#pJ>SM*C;;YvaY+xd1-@at|ozo&_IWg$R(RhY+s^qC0rg z)3a*Ek-M|db%-d~?-I9ss`c1|09&+zzbE?O!V=*3F+xQD1d?0TxFWB~I zI|SN{Mo>a?)VKV2$!2HIKW(9Ef6NqL%D7T511^>&k?zA?XJ(`p#GcaHIJMUyL>Oqj_i(znve8dtWO8h z&_lB5a@#J|NUJNH!g~AD3a!RwkT`9=qmfu+K$GZbK1=If`q3Hg$H#c7@Ld^j=OxP` zLl)s1NF(#x!1_f+3hM{xgUIhZ{(o^M021@Q+9&w2ON?iR7G0ik1d7rI>;SvXyu?$K zhgOGRnBT4HDXJM4W4+@oCN7BU^|Mv;%WB9WTiB&s zNXa^lw&kx>KJzRT&%Ba%%b)5UTD|P&0F6~9V{B`}cL_N-2^fm_%Cyi$Mc*HFvR!5% zaKE^&e<_@gnDnb5{DBhJgNiN;vFLF=_kSxd0Yp(RK<8hM_AZx{pbN+^r%-)0pwih; z$sv!NmI^Rb_@(Hx3m_A6viE1|JW%RMo!#L3V53#enM~}#A+O?4+gH}2G1S33xwt1O z(tJc!ksxEj8NOnTvC{3UYQt9Q-c=|+h4yYuT&F;Y&yl0x1@kJp2>`OrvKHIW=74qH zAjedtpmZ{OA=9PGtyfD2X29si($#=%8bANW5x$6Q(tJ^Q*>1yk|EAk1t9PGvV=xDk zww7bJ^morrqD*_MMV!8`?2a9yXIpXL>rn8CU~$rZg&FGY9Mp*_Iy`iL4q^5b<-yDX zXd;iP7z}GYGeV+IP`UH;F~)9Tzt1!0J2lFU!RxdU>BABq}bavP0qd_o>mZ3j*y&7?LKk${*SgcguDqtbphW zQIujn9m?r-PG~XwCaJfQhG$3wEva zxFPKFZ{;bfCUL@On}%qY77^y+%poLrnKS~mXN)DggQ>^^-U|&!ei*+-Yt<g z)yOS&I4I^fydM3mys^A+v$vlh`>YyueDd8LAZpVypM7`koY^L;a2Dcoej-A7o6Wo= zf_TB^FVpo&_Vj0hUQyv2P1^S#1xHOiB`N!Zv-THYw?S=)LVEpCs=1VVr>mFNx66fW@W0LYx}G5H>>79Ie-0FXHRuCk+AZoFRC>qq!WAwiRs*^Cbn4u8RWVZhmRHwoCB@$-V+7D=Z^`}xz3uzqq0upiK@!eL`@vb5`zHQI zThU^@>;4s7x@|nyY&(!#Q>F~9zH6O*Kjv;#&odv#BNl~+H>FhnMw^N7Jx)BiE!JP; z;P_R*lr86M^;2uCJ!;HeMzn&n*x?4EL(GnHz)HPb6*k+WT3ktrJ2 zs_*yNh{6-+ zdSA$*|I$u{0 z0e@-Z&+;DU6gBWeHQK62SWOJl?!9D{hhDFu?&zWUX}}Y9b^9F!g58Cgx3Ou3%_B6PN-~-;9#ouk!gHlUKkh`6#T7 z!$9K9YmLxwJyAkQubr|>S@HYNyg+~`=_-7;X(jvX2qQ|IZI|@+*rLm2>59vtJW+>m z=7RkJ76@N80~m-D#HKaAD%Rj?joMksrd4z&1`ppSgBSA!m;HMB;PIgwQZw^`BE z$vZRqA+Yv)gt@d#j4XN;8`NDm&(@t6>!@-Pe(~T)8oIp>Em>`{?UJ{%V1umVI0brs z-T71CyYuDK-r9PY_b5+uo3bzfvgpO(?>&B!(*IbU_3=Ey-$FH!tC;Vjd z=ZZR`p?m>wq)|BQl-w2NW3UJ2-FRgmLlmEj`P^jDg5BY?Ou?+dfddV)V7)hI&aT(^ zT+FKO_+{s!^K!2!ZIgV@FJDTAZa}DT&C`fj0rGyQvT{~x?{9!9PdxHjE4mO8-m-@PS3cUC%`xgE8}^7|8RfeWET`JS^_#b0>1|-H-I=c0nrY zb0FYY1%c_3XIeA%$KSgs0K7Bo+oL=9)R54C(*(+5c5eyfA*6^0sAcee|EoeVSB%46o9yk% zNFK~Y{4Q?xQwW&bS~%@~T|f)#C(4-m-N^0x596pyw}XX$8UxIdiZW8|MPyv8YykNu z1E;vX3axJbhmsh%#TT5&p#hAh_!vOk_m*L>^aC0#pNJqEKx006P;94zs8x9ek8+b;{oNVA~dHL185+=TSUN~=q? zKC{!ccmR6!hWk}H$_szykT9)iwclLpws60o6+dBJlV-93ym!prOB23-_U^W3m4XSa zocTDbpv0Kc4}S73VKYMZFp3|h%U61c_?p@(gi4Zvg~J>A-phK>gOl$f1jztv;m==n z50WCo8wJwZ7w?R3(C?oIs|ifn+#1f2aNK%V+VhKhZ&Vf?+cl zBHfFVo?NuzGz%>4GpDmVhi0?KWf~4p6-WH-|7-86zoP2C_YeXSGOq|qBOpT~Ej5Ic z2!bF|O1(&l3?0<{qeJZIcwdu?pk-9 zyU*Fr*?XVo`8hq$eM7ZKK)8wV#ev;tVcH=N#Brnl=g0gZ5{v~6w|lN!YE8r-2eoUi zG(Q7n^vmor|9T!t3B_G*>xO-b=4Fh{cB`JuAu>V7w<=4`R_%1r23&=SaNKG9)d>b0xOnXnV27<<-;Q33ZAFV1 zBx_W@;+m@GM!m!+Ly>t?8*(hoLHeTIifj+=-0I(UVxk;fdZ)x`iHUS_%F?N=xfhW~_f_oa^?X9;8W{8M{@EV(d70sp62pA$mRFXM`{Umi zu@J))uqLVDoC0&hRG3+V+;s`EF?-1AMTB`y&r zgJ%>8rfzUfby}9>&;3Og%uBU*i%gY;7~ebf9kqlVuTRx@7C6h~6vj0xXZ81MD!pp` z5vD?ce#DX|Xc#B|&OhgmN7woc7dNcr~u~Hj;0?nTS|!;tS>trmg050Rh3o zrn%x{A;~r`_7$g}Qx)tuI+vc~YzB?ZC2(HmjD|meD0jf)-d4B8{aKY_Ge3WHtCNZP zhEAP$wP~VU;M1>Bcc};if4SIh4)Uv2Jm70$A~1b=PL8_6n80P4=?PLbKnV|Y-=&zA zAbg1<>^p=9Y(XOKDxd*fW7I#`RbfGepAr9SM0jjgwgMiR~_PASH9v z?Gg+AQcZzs#^sEujH9l0Nk7;9Q(CBM#yTbN^|VwV0|p5eYaM!ZhS)FA^WNcWpUv+b zvi>MJ{9A=wMZ)O?yI#PtT6A34?g|)CP^%d@GR4E0$8g;hjD~m4%(nX(cigIQ8)7Mf z9wQ`L)Q{FeN?5vw&f*yYd{z1vZDl^Ym*W6x667SQ z=A57c$gXaTXs!nPJr}g6*$7Z>xoGR{UVG5ySGhlq@@P=^`S?e^}=D>J6f?g#v!V4jih{SjGG~ z?4{0|A@zk7lpc!p+##dvjP(LMv%mH5D(@wL8Or-K`XzQV!K7tNCRLX-_sOsJ5~A>d z#mh@T2Z(>^mRzvZ1aG_@#x7o9uBf!*{8?bjH`tHZm2nFLN;bbY^q-!76BJ^Q_ih+Z za4mn8)V^jY#x9Z|8?TWIH3^|A#Lk^GqsW`GI5=}sETIcOzU$W4p8}Fh7z*J+*r(0Y z{+yWYbr;c5*@Marnyz+aMtXZ6A}JE(Q)f*GeX0Tioz{L!uLFZAYNXDtI(*KUc0cYo zDUBUPe`QcW#d7Ri)!qL6Ldhg$N5{8%d?%1Zwpn@2IzKu8=*XkYcHuR31nI=sJU1oh zL1klQ56iN%X~qheta0gEu!pjh@4@zHJyKahO0)1WgA^wU8J(YrUb8|_SbaB%CJZHi zaWwx~U8f>2R7B}8&q`Q6Xo6i6XJ7f7LZ7{QOpQP5ypBe#zF-&4LN%Qrl)@k%HiVEDR z`JJOSK#56EgUMm*2;N@(eY{$zaBq8Kkek$IG@_*X{DlNfYZ7}jD%Ohia(DaJ(%$FZ z)hY#jfv9sm&v0}oN$D*r(7v_!o0^3(s-M2^g^N7u$4#Q(-LgxaWwmqc2$>z%fC`*8 z7Se^TM4Vah5bvOV8HMnWXTO7aJST~zE`J^?{G$pY>+jCPQw}3p_|g9%TfyyeKyPz# zNh`p=%!G=R1KvGfj%1*!wDRj*x8T;vcaagAQKP3%7@O=Xsu*_I1dbGTY1f;FoL62n zv3m^H^n@08N}P*$&IZcg;R?S(zZ_I3#usHTnu;}L;^L=X>*kuE=lGA6e$ezIweSma zs^t<0Majs~yW{O)Wm@&HT5F5(&aZ`N?D&i(DkD$&7 zG@KRX)3SfV*RcPI(dyC9c@N;Gipbvu_PJjNZsQ}rwP^L6XneZyPHGR`Y(i6&tj(Tg zIQ3XcYtdzEc;_?LEP440Xx*;3hQ*XszFNt7N4hKcV}2*GIYLcUZod@BiNC)o-T|lw z;43$2jSe)j$#v%<4hq@DYsyr5T2?9ieOa3w zn%3nh7`dMEA$_S=QBg7Kh^N^L;h?xu=jUX4m-&)0VPmYH<=K?->6n8)(7uGEJ^W*L zN2h4*>4V`S&x;CUKwtjgiMr|wFF2ocIt${otd&`8#9{9NMX@NASa6Jvri4N=oA4@i z2F^0<^mxarv%!*n*-teH*wQvx$DM1OAtVys53N}K?Gar-=1)!7*{TE%%j(SL`nDWC zlt>a@ff)vxn<~CM(jcwWdo2?6fq&ij!Z~(h+&s&tN%@X5f@4DZv-Bj}?ukYh$sB%u zvd`lxR7pd-=?lXw1NmSyi5$TZkc}CfYxRx_TLQFho;z>3q&_EgRq1BG*%B|#s@uj{ z`Rj19hJwwQqwTNK`}uyl-0efGnEs%V$YU{$k8}T`-X3_CDL(K`9M{cWwZHA*O?LWw ztuIm-ewQ?#ZN5bB@L1^6p=q=uiT75er*StiHA@d+SS6KtFI(OO=noU@mAw4BMWY5T zJ_&Tkyx?avQT%$D(ZKVhIQf8HjB`Q=aEwv6vC7@SL~nJ~2pbQKt%IeQ-J#Qg^g?Ok z&@(%}+d-%7;jr(gvG}j-Cp~IykJ(4NL@3*Gf7|AV>!B+h_}62pu!#YziO*NE$)4VC zHmhoWH3H(Aja zyzF95d2tq4Z~KY+&w{5t9EwD~^KSVA=Z0EwR2U82edEb%M$JtrW5#?jvWJ$_wDO-T zF8IO{br7VAs(6@Rknf`+cl}#>bfBcF z*y-jDlkrFf3;!_L3?&t4kx>_-z8lzXZLue*@{|?q?w2;gJR6vW7C*ne!0a6DCCj<) zUyO6aLJBCo1BEC5QBun+*wAS6A#va_52BeRK1gduK3mTEjOe!)rk`z)(cY$W{Nkp+ z;}}whsfoaS9<1K(GX3EmBV1u4pVs-Off%q2b0tOnGSjbB*m6gsfkvP@vhlrMSX_{@ zyXVD^vf7sNNLS%H!UzXCh^lKo_$O|N8puq8L7-X08=bUi!Sd*&2CrhbP|xTg_1(+R zYnb6|Ac+-MYumE8tNUzV5fK*YEu~x_bw;Xq(Z_$t*HkChg?PE2XB@BZl`+^hHVvC# zs&yaQ(7EuDPBA8MzwsS@(KE-$9H%SP1U94FM2g=s=0^lYz&vuNTd@K%mkz zk6zy?Vk&McP^-*9u$u^(Uzw>wDNI+NH)zAzV+S99; z3pDIT>Q#j+xr*j32e+uEDBm+EwKMP*c8BA~e#+X5E)WwQo?qf9#YEBJos=Dblv_x= z?OASu`11;-e+!aKU{^P%>?P#>;dGg5T3*64v_WSY+K-korZvA({!MzCdhmH(~=1b6!8`Y~lXI%Na z5nbEldP#|iFy~eogzCPMae79(+=0$F*f#ONVp+_DCCK4R5nC!vA$>=u~|ZX{Nt)dC^Sxqa@q-H}kjgRay+v*;o=I{p+}15L8u zWUQY(?U)@<)iPdgfJyB1g6bOU)i5*S!urf#*h(R4M-P-RZzNV#H8ZPc#Jtt^75U)h8xmxRY)SF9iO8|yK?Kf&B zMDOWm0p*Dk3s2fdQ6aRRHoA3A@lU*UEW?gjlFrZpT;LOKLFt9J{H$tu6IIdn_o4#n=r1UvPJd2H$iG|(^s4BO#Xe33$=`v zKk4w2>x0s>mQN#Yd|W~UYOw1=8d0Uf9xDa*%NHfFd9ExGUT}G(yPVJIbXZ#czHs*1 zHTRbHvk=&p-6iWlcgS+1Xw>QZ4RRGt?8*x9MM%r+i zUA;wU+lQNt#kRB@Q!S(^Xg*|eWhBkFIC!h4NSE|N`kpIdm%35rL*5cV8nJ*4o(=X378gD0;}(UfvJOpJMp8wiOI&v6YuijxT}yCK$8r&7U_G zmB}9d_K`+wfI{d1|4}LIEH=8b5a%|#GTA*Y$DiU7zFoY5X2c&=9zN_36==fh)&|^r zltY_+ZsB>^b{6xV<)ssaxIqX*Jqfcb){{u?^NRsI`59DpnfVEbIa#t!=L2=?Cq sQUnqPfc@{)|4q~XT;l&@GKd(zIX8-^I literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcwN$fBy3@Fx4}vM{d>j Q0}3;Ey85}Sb4q9e0D+DT)&Kwi diff --git a/app/assets/potatomesh-logo.svg b/app/assets/potatomesh-logo.svg new file mode 100644 index 0000000..1e78f73 --- /dev/null +++ b/app/assets/potatomesh-logo.svg @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/debug.sh b/app/debug.sh new file mode 100755 index 0000000..8c9d1bf --- /dev/null +++ b/app/debug.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +export GIT_TAG="$(git describe --tags --abbrev=0)" +export GIT_COMMITS="$(git rev-list --count ${GIT_TAG}..HEAD)" +export GIT_SHA="$(git rev-parse --short=9 HEAD)" +export GIT_DIRTY="$(git diff --quiet --ignore-submodules HEAD || echo true || echo false)" +flutter clean +flutter pub get +flutter run \ + --dart-define=GIT_TAG="${GIT_TAG}" \ + --dart-define=GIT_COMMITS="${GIT_COMMITS}" \ + --dart-define=GIT_SHA="${GIT_SHA}" \ + --dart-define=GIT_DIRTY="${GIT_DIRTY}" \ + --device-id 38151FDJH00D4C + diff --git a/app/lib/main.dart b/app/lib/main.dart index 056fb95..7a26536 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -12,10 +12,24 @@ // See the License for the specific language governing permissions and // limitations under the License. +import 'dart:async'; import 'dart:convert'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:url_launcher/url_launcher.dart'; + +const String _gitVersionEnv = + String.fromEnvironment('GIT_VERSION', defaultValue: ''); +const String _gitTagEnv = String.fromEnvironment('GIT_TAG', defaultValue: ''); +const String _gitCommitsEnv = + String.fromEnvironment('GIT_COMMITS', defaultValue: ''); +const String _gitShaEnv = String.fromEnvironment('GIT_SHA', defaultValue: ''); +const String _gitDirtyEnv = + String.fromEnvironment('GIT_DIRTY', defaultValue: ''); void main() { runApp(const PotatoMeshReaderApp()); @@ -27,7 +41,7 @@ typedef MessageFetcher = Future> Function({ String domain, }); -/// Meshtastic Reader root widget that configures theming and the home screen. +/// PotatoMesh Reader root widget that configures theming and the home screen. class PotatoMeshReaderApp extends StatefulWidget { const PotatoMeshReaderApp({ super.key, @@ -78,7 +92,7 @@ class _PotatoMeshReaderAppState extends State { @override Widget build(BuildContext context) { return MaterialApp( - title: 'Meshtastic Reader', + title: '🥔 PotatoMesh Reader', debugShowCheckedModeBanner: false, theme: ThemeData( brightness: Brightness.dark, @@ -99,6 +113,7 @@ class _PotatoMeshReaderAppState extends State { key: ValueKey(_endpointDomain), fetcher: _fetchMessagesForCurrentDomain, resetToken: _endpointVersion, + domain: _endpointDomain, onOpenSettings: (context) { Navigator.of(context).push( MaterialPageRoute( @@ -122,6 +137,7 @@ class MessagesScreen extends StatefulWidget { this.fetcher = fetchMessages, this.onOpenSettings, this.resetToken = 0, + required this.domain, }); /// Fetch function used to load messages from the PotatoMesh API. @@ -133,17 +149,31 @@ class MessagesScreen extends StatefulWidget { /// Bumps when the endpoint changes to force a refresh of cached data. final int resetToken; + /// Active endpoint domain used for auxiliary lookups like node metadata. + final String domain; + @override State createState() => _MessagesScreenState(); } -class _MessagesScreenState extends State { +class _MessagesScreenState extends State + with WidgetsBindingObserver { late Future> _future; + List _messages = const []; + final ScrollController _scrollController = ScrollController(); + Timer? _refreshTimer; + bool _isForeground = true; + int _fetchVersion = 0; @override void initState() { super.initState(); - _future = widget.fetcher(); + _startFetch(clear: true); + WidgetsBinding.instance.addObserver(this); + WidgetsBinding.instance.addPostFrameCallback((_) { + _refresh(); + _startAutoRefresh(); + }); } /// When the fetcher changes, reload the future so the widget reflects the @@ -153,9 +183,31 @@ class _MessagesScreenState extends State { super.didUpdateWidget(oldWidget); if (oldWidget.fetcher != widget.fetcher || oldWidget.resetToken != widget.resetToken) { - setState(() { - _future = widget.fetcher(); - }); + _restartAutoRefresh(); + _startFetch(clear: true); + } + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + _refreshTimer?.cancel(); + _scrollController.dispose(); + super.dispose(); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + final nowForeground = state == AppLifecycleState.resumed || + state == AppLifecycleState.inactive; + if (nowForeground != _isForeground) { + _isForeground = nowForeground; + if (_isForeground) { + _refresh(); + _startAutoRefresh(); + } else { + _refreshTimer?.cancel(); + } } } @@ -165,21 +217,102 @@ class _MessagesScreenState extends State { /// via its `snapshot.error` state without bubbling an exception to the /// gesture handler. Future _refresh() async { + _startFetch(); + } + + void _appendMessages(List newMessages) { + if (newMessages.isEmpty) return; + final existingKeys = _messages.map(_messageKey).toSet(); + var added = 0; + final combined = List.from(_messages); + for (final msg in newMessages) { + final key = _messageKey(msg); + if (existingKeys.contains(key)) continue; + combined.add(msg); + existingKeys.add(key); + added += 1; + } + if (added == 0 && _messages.isNotEmpty) { + _scheduleScrollToBottom(); + return; + } setState(() { + _messages = combined; + }); + _scheduleScrollToBottom(); + } + + String _messageKey(MeshMessage msg) { + return '${msg.id}-${msg.rxIso}-${msg.text}'; + } + + void _scheduleScrollToBottom({int retries = 5}) { + if (retries <= 0) return; + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!_scrollController.hasClients) { + _scheduleScrollToBottom(retries: retries - 1); + return; + } + _scrollController.jumpTo(_scrollController.position.maxScrollExtent); + }); + } + + void _startAutoRefresh() { + _refreshTimer?.cancel(); + if (!_isForeground) return; + _refreshTimer = + Timer.periodic(const Duration(seconds: 60), (_) => _refresh()); + } + + void _restartAutoRefresh() { + if (_isForeground) { + _startAutoRefresh(); + } + } + + void _startFetch({bool clear = false}) { + final version = ++_fetchVersion; + setState(() { + if (clear) { + _messages = const []; + } _future = widget.fetcher(); }); - try { - await _future; - } catch (_) { - // Let the FutureBuilder display error UI without breaking the gesture. + _future.then((msgs) { + if (version != _fetchVersion) return; + _appendMessages(msgs); + }).catchError((_) { + // Let FutureBuilder surface the error; ignore for stale fetches. + }); + } + + String _dateLabelFor(MeshMessage message) { + if (message.rxTime != null) { + final local = message.rxTime!.toLocal(); + final y = local.year.toString().padLeft(4, '0'); + final m = local.month.toString().padLeft(2, '0'); + final d = local.day.toString().padLeft(2, '0'); + return '$y-$m-$d'; } + if (message.rxIso.isNotEmpty && message.rxIso.length >= 10) { + return message.rxIso.substring(0, 10); + } + return 'Unknown'; } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text('Meshtastic Reader'), + leading: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: SvgPicture.asset( + 'assets/potatomesh-logo.svg', + height: 28, + semanticsLabel: 'PotatoMesh logo', + ), + ), + title: const Text('🥔 PotatoMesh Reader'), actions: [ IconButton( tooltip: 'Refresh', @@ -200,10 +333,11 @@ class _MessagesScreenState extends State { body: FutureBuilder>( future: _future, builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { + if (snapshot.connectionState == ConnectionState.waiting && + _messages.isEmpty) { return const Center(child: CircularProgressIndicator()); } - if (snapshot.hasError) { + if (snapshot.hasError && _messages.isEmpty) { return Center( child: Padding( padding: const EdgeInsets.all(16), @@ -214,20 +348,44 @@ class _MessagesScreenState extends State { ), ); } - final messages = snapshot.data ?? []; + final messages = _messages; if (messages.isEmpty) { return const Center(child: Text('No messages yet.')); } return RefreshIndicator( onRefresh: _refresh, - child: ListView.builder( - padding: const EdgeInsets.symmetric(vertical: 8), - itemCount: messages.length, - itemBuilder: (context, index) { - final msg = messages[index]; - return ChatLine(message: msg); - }, + child: ScrollConfiguration( + behavior: const ScrollBehavior().copyWith(scrollbars: false), + child: ListView.builder( + controller: _scrollController, + padding: const EdgeInsets.symmetric(vertical: 8), + itemCount: messages.length, + itemBuilder: (context, index) { + final msg = messages[index]; + final currentLabel = _dateLabelFor(msg); + final prevLabel = + index > 0 ? _dateLabelFor(messages[index - 1]) : null; + final needsDivider = + prevLabel == null || currentLabel != prevLabel; + if (!needsDivider) { + return ChatLine( + message: msg, + domain: widget.domain, + ); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + DateDivider(label: currentLabel), + ChatLine( + message: msg, + domain: widget.domain, + ), + ], + ); + }, + ), ), ); }, @@ -238,10 +396,15 @@ class _MessagesScreenState extends State { /// Individual chat line styled in IRC-inspired format. class ChatLine extends StatelessWidget { - const ChatLine({super.key, required this.message}); + const ChatLine({ + super.key, + required this.message, + required this.domain, + }); /// Message data to render. final MeshMessage message; + final String domain; /// Generates a stable color from the nickname characters by hashing to a hue. Color _nickColor(String nick) { @@ -249,52 +412,166 @@ class ChatLine extends StatelessWidget { return HSLColor.fromAHSL(1, h.toDouble(), 0.5, 0.6).toColor(); } + List _buildLinkedSpans( + String text, + TextStyle baseStyle, + TextStyle linkStyle, + ) { + final spans = []; + final urlPattern = RegExp(r'(https?:\/\/[^\s]+)'); + int start = 0; + + for (final match in urlPattern.allMatches(text)) { + if (match.start > start) { + spans.add(TextSpan( + text: text.substring(start, match.start), + style: baseStyle, + )); + } + + final urlText = match.group(0) ?? ''; + final uri = Uri.tryParse(urlText); + spans.add(TextSpan( + text: urlText, + style: linkStyle, + recognizer: TapGestureRecognizer() + ..onTap = () async { + if (uri != null) { + await launchUrl(uri, mode: LaunchMode.externalApplication); + } + }, + )); + start = match.end; + } + + if (start < text.length) { + spans.add(TextSpan( + text: text.substring(start), + style: baseStyle, + )); + } + + if (spans.isEmpty) { + spans.add(TextSpan(text: text, style: baseStyle)); + } + + return spans; + } + + String _fallbackShortName(String fromId) { + return NodeShortNameCache.fallbackShortName(fromId); + } + + double _computeIndentPixels(TextStyle baseStyle, BuildContext context) { + final painter = TextPainter( + text: TextSpan(text: ' ', style: baseStyle), + textDirection: Directionality.of(context), + )..layout(); + return painter.size.width * 8; + } + @override Widget build(BuildContext context) { final timeStr = '[${message.timeFormatted}]'; - final nick = '<${message.fromShort}>'; + final rawId = message.fromId.isNotEmpty ? message.fromId : '?'; + final nick = rawId.startsWith('!') ? rawId : '!$rawId'; + final channel = '#${message.channelName ?? ''}'.trim(); + final bodyText = message.text.isEmpty ? '⟂ (no text)' : message.text; + final baseStyle = DefaultTextStyle.of(context).style; + final linkStyle = baseStyle.copyWith( + color: Colors.tealAccent, + decoration: TextDecoration.underline, + ); + final indentPx = _computeIndentPixels(baseStyle, context); return Padding( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 2), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - timeStr, - style: const TextStyle( - color: Colors.grey, - fontWeight: FontWeight.w500, - ), + child: FutureBuilder( + future: NodeShortNameCache.instance.shortNameFor( + domain: domain, + nodeId: rawId, ), - const SizedBox(width: 6), - Text( - nick, - style: TextStyle( - color: _nickColor(message.fromShort), - fontWeight: FontWeight.w600, - ), - ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - message.text.isEmpty ? '⟂ (no text)' : message.text, - style: DefaultTextStyle.of(context).style, - ), - if (message.channelName != null) - Padding( - padding: const EdgeInsets.only(top: 2), - child: Text( - '#${message.channelName}', - style: const TextStyle(color: Colors.tealAccent), + builder: (context, snapshot) { + final shortName = snapshot.data?.isNotEmpty == true + ? snapshot.data! + : _fallbackShortName(rawId); + final paddedShortName = NodeShortNameCache.padToWidth(shortName); + return SelectionArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: timeStr, + style: const TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w500, + ), + ), + const TextSpan(text: ' '), + TextSpan( + text: '<$nick>', + style: TextStyle( + color: _nickColor(message.fromShort), + fontWeight: FontWeight.w600, + ), + ), + const TextSpan(text: ' '), + TextSpan( + text: '($paddedShortName)', + style: baseStyle.copyWith( + color: _nickColor(message.fromShort), + fontWeight: FontWeight.w600, + ), + ), + const TextSpan(text: ' '), + TextSpan( + text: channel, + style: const TextStyle(color: Colors.tealAccent), + ), + ], + style: baseStyle, ), ), - ], - ), - ), - ], + const SizedBox(height: 2), + Padding( + padding: EdgeInsets.only(left: indentPx), + child: SelectableText.rich( + TextSpan( + children: _buildLinkedSpans( + bodyText, + baseStyle, + linkStyle, + ), + ), + ), + ), + ], + ), + ); + }), + ); + } +} + +/// Bold, grey date divider between chat messages. +class DateDivider extends StatelessWidget { + const DateDivider({super.key, required this.label}); + + final String label; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.fromLTRB(12, 8, 12, 4), + child: Text( + '-- $label --', + style: const TextStyle( + fontWeight: FontWeight.w700, + color: Colors.grey, + ), ), ); } @@ -329,12 +606,17 @@ class _SettingsScreenState extends State { bool _loading = false; String _selectedDomain = ''; String? _error; + String _versionLabel = ''; + Future? _instanceVersionFuture; @override void initState() { super.initState(); _selectedDomain = widget.currentDomain; _fetchInstances(); + _loadVersion(); + _instanceVersionFuture = + InstanceVersionCache.instance.fetch(domain: _selectedDomain); } @override @@ -342,6 +624,8 @@ class _SettingsScreenState extends State { super.didUpdateWidget(oldWidget); if (oldWidget.currentDomain != widget.currentDomain) { _selectedDomain = widget.currentDomain; + _instanceVersionFuture = + InstanceVersionCache.instance.fetch(domain: _selectedDomain); } } @@ -372,6 +656,22 @@ class _SettingsScreenState extends State { } } + Future _loadVersion() async { + try { + final info = await PackageInfo.fromPlatform(); + final label = _composeGitAwareVersion(info); + if (!mounted) return; + setState(() { + _versionLabel = label; + }); + } catch (_) { + if (!mounted) return; + setState(() { + _versionLabel = 'v0.0.0'; + }); + } + } + void _onEndpointChanged(String? domain) { if (domain == null || domain.isEmpty) { return; @@ -381,6 +681,10 @@ class _SettingsScreenState extends State { _selectedDomain = domain; }); widget.onDomainChanged(domain); + setState(() { + _instanceVersionFuture = + InstanceVersionCache.instance.fetch(domain: _selectedDomain); + }); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Endpoint set to $domain')), ); @@ -468,12 +772,90 @@ class _SettingsScreenState extends State { ], ), ), + FutureBuilder( + key: ValueKey(_selectedDomain), + future: _instanceVersionFuture, + builder: (context, snapshot) { + final info = snapshot.data; + final domainDisplay = _selectedDomain.trim().isEmpty + ? 'potatomesh.net' + : _selectedDomain.trim(); + final domainUri = _buildDomainUrl(domainDisplay); + Widget subtitle; + if (snapshot.connectionState == ConnectionState.waiting) { + subtitle = const Text('Loading version info…'); + } else if (info != null) { + subtitle = Text(info.summary); + } else { + subtitle = const Text('Version info unavailable'); + } + return ListTile( + leading: const Icon(Icons.storage), + title: const Text('PotatoMesh Info'), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + subtitle, + const SizedBox(height: 4), + RichText( + text: TextSpan( + text: domainDisplay, + style: const TextStyle( + color: Colors.tealAccent, + decoration: TextDecoration.underline, + ), + recognizer: TapGestureRecognizer() + ..onTap = () async { + if (domainUri != null) { + await launchUrl( + domainUri, + mode: LaunchMode.externalApplication, + ); + } + }, + ), + ), + ], + ), + ); + }, + ), const Divider(), const ListTile( leading: Icon(Icons.info_outline), title: Text('About'), subtitle: Text( - 'Meshtastic Reader — read-only view of PotatoMesh messages.'), + '🥔 PotatoMesh Reader - a read-only view of a selected Meshtastic region.'), + ), + ListTile( + leading: const Icon(Icons.tag), + title: const Text('Version'), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(_versionLabel.isNotEmpty ? _versionLabel : 'Loading…'), + const SizedBox(height: 4), + RichText( + text: TextSpan( + text: 'github.com/l5yth/potato-mesh', + style: const TextStyle( + color: Colors.tealAccent, + decoration: TextDecoration.underline, + ), + recognizer: TapGestureRecognizer() + ..onTap = () async { + final uri = Uri.parse( + 'https://github.com/l5yth/potato-mesh/', + ); + await launchUrl( + uri, + mode: LaunchMode.externalApplication, + ); + }, + ), + ), + ], + ), ), ], ), @@ -597,7 +979,7 @@ Uri _buildMessagesUri(String domain) { final trimmed = domain.trim(); if (trimmed.isEmpty) { return Uri.https('potatomesh.net', '/api/messages', { - 'limit': '100', + 'limit': '1000', 'encrypted': 'false', }); } @@ -607,18 +989,100 @@ Uri _buildMessagesUri(String domain) { return parsed.replace( path: '/api/messages', queryParameters: { - 'limit': '100', + 'limit': '1000', 'encrypted': 'false', }, ); } return Uri.https(trimmed, '/api/messages', { - 'limit': '100', + 'limit': '1000', 'encrypted': 'false', }); } +/// Build a node metadata API URI for a given domain. +Uri _buildNodeUri(String domain, String nodeId) { + final trimmedDomain = domain.trim(); + final encodedId = Uri.encodeComponent(nodeId); + + if (trimmedDomain.isEmpty) { + return Uri.https('potatomesh.net', '/api/nodes/$encodedId'); + } + + if (trimmedDomain.startsWith('http://') || + trimmedDomain.startsWith('https://')) { + final parsed = Uri.parse(trimmedDomain); + return parsed.replace(path: '/api/nodes/$encodedId'); + } + + return Uri.https(trimmedDomain, '/api/nodes/$encodedId'); +} + +/// Build a /version endpoint URI for a given domain. +Uri _buildVersionUri(String domain) { + final trimmed = domain.trim(); + if (trimmed.isEmpty) { + return Uri.https('potatomesh.net', '/version'); + } + if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) { + final parsed = Uri.parse(trimmed); + return parsed.replace(path: '/version'); + } + return Uri.https(trimmed, '/version'); +} + +String _composeGitAwareVersion(PackageInfo info) { + const versionDefine = _gitVersionEnv; + if (versionDefine.isNotEmpty) { + return versionDefine.startsWith('v') ? versionDefine : 'v$versionDefine'; + } + + const tagDefine = _gitTagEnv; + if (tagDefine.isNotEmpty) { + final tag = tagDefine.startsWith('v') ? tagDefine : 'v$tagDefine'; + final suffixParts = []; + const commitsDefine = _gitCommitsEnv; + const shaDefine = _gitShaEnv; + const dirtyDefine = _gitDirtyEnv; + final commits = commitsDefine.trim(); + final sha = shaDefine.trim(); + final dirtyFlag = dirtyDefine.toLowerCase().trim(); + final dirty = dirtyFlag == 'true' || dirtyFlag == '1' || dirtyFlag == 'yes'; + + if (commits.isNotEmpty && commits != '0') { + suffixParts.add(commits); + if (sha.isNotEmpty) { + suffixParts.add(sha); + } + } else if (sha.isNotEmpty) { + suffixParts.add(sha); + } + + if (dirty) { + if (suffixParts.isEmpty) { + suffixParts.add('dirty'); + } else { + suffixParts[suffixParts.length - 1] = '${suffixParts.last}-dirty'; + } + } + + return suffixParts.isEmpty ? tag : '$tag+${suffixParts.join('-')}'; + } + + final base = 'v${info.version}'; + return info.buildNumber.isNotEmpty ? '$base+${info.buildNumber}' : base; +} + +Uri? _buildDomainUrl(String domain) { + final trimmed = domain.trim(); + if (trimmed.isEmpty) return null; + final hasScheme = + trimmed.startsWith('http://') || trimmed.startsWith('https://'); + final candidate = hasScheme ? trimmed : 'https://$trimmed'; + return Uri.tryParse(candidate); +} + /// Fetches the latest PotatoMesh messages and returns them sorted by receive time. /// /// A custom [client] can be supplied for testing; otherwise a short-lived @@ -653,6 +1117,174 @@ Future> fetchMessages({ return sortMessagesByRxTime(msgs); } +/// Memoised loader for node short names sourced from the API. +class NodeShortNameCache { + NodeShortNameCache._(); + + /// Singleton instance used by chat line rendering. + static final NodeShortNameCache instance = NodeShortNameCache._(); + + final Map> _cache = {}; + + /// Resolve the short name for a node, defaulting to the fallback suffix. + Future shortNameFor({ + required String domain, + required String nodeId, + http.Client? client, + }) { + final trimmedId = nodeId.trim(); + final fallback = fallbackShortName(trimmedId); + if (trimmedId.isEmpty) return Future.value(fallback); + + final key = '${domain.trim()}|$trimmedId'; + if (_cache.containsKey(key)) { + return _cache[key]!; + } + + final future = _loadShortName( + domain: domain, + nodeId: trimmedId, + fallback: fallback, + client: client, + ); + _cache[key] = future; + return future; + } + + Future _loadShortName({ + required String domain, + required String nodeId, + required String fallback, + http.Client? client, + }) async { + final uri = _buildNodeUri(domain, nodeId); + final httpClient = client ?? http.Client(); + final shouldClose = client == null; + + try { + final resp = await httpClient.get(uri); + if (resp.statusCode != 200) return fallback; + + final dynamic decoded = jsonDecode(resp.body); + if (decoded is Map) { + final raw = decoded['short_name'] ?? decoded['shortName']; + if (raw != null) { + final name = raw.toString().trim(); + if (name.isNotEmpty) return name; + } + } + + return fallback; + } catch (_) { + return fallback; + } finally { + if (shouldClose) { + httpClient.close(); + } + } + } + + /// Fallback that uses the trailing four characters of the node id. + static String fallbackShortName(String fromId) { + final trimmed = fromId.startsWith('!') ? fromId.substring(1) : fromId; + if (trimmed.isEmpty) return '????'; + final suffix = + trimmed.length <= 4 ? trimmed : trimmed.substring(trimmed.length - 4); + return padToWidth(suffix); + } + + /// Ensures the provided short name is at least [width] characters wide. + static String padToWidth(String value, {int width = 4}) { + if (value.length >= width) return value; + return value.padLeft(width); + } +} + +/// Cached metadata describing an instance's public version payload. +class InstanceVersion { + const InstanceVersion({ + required this.name, + required this.channel, + required this.frequency, + required this.instanceDomain, + }); + + final String name; + final String? channel; + final String? frequency; + final String? instanceDomain; + + String get summary { + final parts = []; + if (name.isNotEmpty) parts.add(name); + if (channel != null && channel!.isNotEmpty) parts.add(channel!); + if (frequency != null && frequency!.isNotEmpty) parts.add(frequency!); + return parts.isNotEmpty ? parts.join(' · ') : 'Unknown'; + } + + factory InstanceVersion.fromJson(Map json) { + final config = json['config'] is Map + ? json['config'] as Map + : {}; + final siteName = config['siteName']?.toString().trim() ?? ''; + final name = (json['name']?.toString().trim() ?? '').isNotEmpty + ? json['name'].toString().trim() + : siteName; + return InstanceVersion( + name: name, + channel: config['channel']?.toString().trim(), + frequency: config['frequency']?.toString().trim(), + instanceDomain: config['instanceDomain']?.toString().trim(), + ); + } +} + +/// Memoised loader for instance version payloads. +class InstanceVersionCache { + InstanceVersionCache._(); + + static final InstanceVersionCache instance = InstanceVersionCache._(); + + final Map> _cache = {}; + + Future fetch({ + required String domain, + http.Client? client, + }) { + final key = domain.trim().isEmpty ? 'potatomesh.net' : domain.trim(); + if (_cache.containsKey(key)) { + return _cache[key]!; + } + final future = _load(key, client: client); + _cache[key] = future; + return future; + } + + Future _load( + String domain, { + http.Client? client, + }) async { + final uri = _buildVersionUri(domain); + final httpClient = client ?? http.Client(); + final shouldClose = client == null; + try { + final resp = await httpClient.get(uri); + if (resp.statusCode != 200) return null; + final dynamic decoded = jsonDecode(resp.body); + if (decoded is Map) { + return InstanceVersion.fromJson(decoded); + } + return null; + } catch (_) { + return null; + } finally { + if (shouldClose) { + httpClient.close(); + } + } + } +} + /// Fetches federation instance metadata from potatomesh.net and normalizes it. /// /// Instances lacking a domain are dropped. A provided [client] is closed diff --git a/app/pubspec.lock b/app/pubspec.lock index 29e4b9a..dc274d5 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -142,6 +142,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.7" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: "87fbd7c534435b6c5d9d98b01e1fd527812b82e68ddd8bd35fc45ed0fa8f0a95" + url: "https://pub.dev" + source: hosted + version: "2.2.3" flutter_test: dependency: "direct dev" description: flutter @@ -248,6 +256,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.17.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" + url: "https://pub.dev" + source: hosted + version: "8.3.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" + source: hosted + version: "3.2.1" path: dependency: transitive description: @@ -256,6 +280,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" petitparser: dependency: transitive description: @@ -264,6 +296,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" posix: dependency: transitive description: @@ -341,6 +381,94 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.1" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" + url: "https://pub.dev" + source: hosted + version: "6.3.28" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: cfde38aa257dae62ffe79c87fab20165dfdf6988c1d31b58ebf59b9106062aad + url: "https://pub.dev" + source: hosted + version: "6.3.6" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" + source: hosted + version: "3.2.5" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6 + url: "https://pub.dev" + source: hosted + version: "1.1.19" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc + url: "https://pub.dev" + source: hosted + version: "1.1.19" vector_math: dependency: transitive description: @@ -365,6 +493,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" xml: dependency: transitive description: @@ -382,5 +518,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.8.0 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + dart: ">=3.9.0 <4.0.0" + flutter: ">=3.35.0" diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 3c54c93..322e347 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -10,6 +10,9 @@ dependencies: flutter: sdk: flutter http: ^1.2.0 + package_info_plus: ^8.1.0 + flutter_svg: ^2.0.10+1 + url_launcher: ^6.3.1 dev_dependencies: flutter_test: @@ -26,14 +29,14 @@ flutter: flutter_launcher_icons: android: true ios: true - image_path: assets/icon.png + image_path: assets/icon-launcher.png remove_alpha_ios: true adaptive_icon_background: "#111417" - adaptive_icon_foreground: assets/icon.png + adaptive_icon_foreground: assets/icon-launcher.png flutter_native_splash: color: "#111417" - image: assets/icon.png + image: assets/icon-splash.png android_12: color: "#111417" image: assets/icon.png diff --git a/app/test/cache_test.dart b/app/test/cache_test.dart new file mode 100644 index 0000000..710e582 --- /dev/null +++ b/app/test/cache_test.dart @@ -0,0 +1,74 @@ +// Copyright © 2025-26 l5yth & contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:http/http.dart' as http; +import 'package:http/testing.dart'; +import 'package:potato_mesh_reader/main.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + test('NodeShortNameCache fetches and memoizes short names', () async { + var calls = 0; + final client = MockClient((request) async { + calls += 1; + expect(request.url.path, '/api/nodes/!cache-test'); + return http.Response('{"short_name":"NODE"}', 200); + }); + + final first = await NodeShortNameCache.instance.shortNameFor( + domain: 'cache.test', + nodeId: '!cache-test', + client: client, + ); + final second = await NodeShortNameCache.instance.shortNameFor( + domain: 'cache.test', + nodeId: '!cache-test', + client: client, + ); + + expect(first, 'NODE'); + expect(second, 'NODE'); + expect(calls, 1, reason: 'memoises results per domain/id'); + }); + + test('NodeShortNameCache falls back to padded suffix', () { + expect(NodeShortNameCache.fallbackShortName('!ab'), ' ab'); + expect(NodeShortNameCache.fallbackShortName('!abcdef'), 'cdef'); + expect(NodeShortNameCache.fallbackShortName(''), '????'); + }); + + test('InstanceVersionCache fetches and caches version payloads', () async { + var calls = 0; + final client = MockClient((request) async { + calls += 1; + expect(request.url.path, '/version'); + return http.Response( + '{"name":"BerlinMesh","config":{"channel":"#MediumFast","frequency":"868MHz","instanceDomain":"potatomesh.net"}}', + 200, + ); + }); + + final first = await InstanceVersionCache.instance + .fetch(domain: 'version.test', client: client); + final second = await InstanceVersionCache.instance + .fetch(domain: 'version.test', client: client); + + expect(first?.summary, contains('BerlinMesh')); + expect(first?.summary, contains('#MediumFast')); + expect(calls, 1, reason: 'cache should avoid duplicate network calls'); + expect(second?.summary, first?.summary); + }); +} diff --git a/app/test/mesh_message_test.dart b/app/test/mesh_message_test.dart index a2dd054..16c1b4e 100644 --- a/app/test/mesh_message_test.dart +++ b/app/test/mesh_message_test.dart @@ -159,7 +159,7 @@ void main() { final messages = await fetchMessages(client: client); - expect(calls.single.queryParameters['limit'], '100'); + expect(calls.single.queryParameters['limit'], '1000'); expect(messages.first.id, 1); expect(messages.last.id, 2); expect(messages.first.fromShort, 'a'); diff --git a/app/test/messages_screen_test.dart b/app/test/messages_screen_test.dart index f9b49f7..ce1085b 100644 --- a/app/test/messages_screen_test.dart +++ b/app/test/messages_screen_test.dart @@ -50,9 +50,9 @@ void main() { await tester.pumpWidget(PotatoMeshReaderApp(fetcher: fakeFetch)); await tester.pumpAndSettle(); - expect(find.text('Meshtastic Reader'), findsOneWidget); + expect(find.textContaining('PotatoMesh Reader'), findsOneWidget); expect(find.byType(MessagesScreen), findsOneWidget); - expect(fetchCalls.length, 1); + expect(fetchCalls.length, greaterThanOrEqualTo(2)); }); testWidgets('MessagesScreen shows loading, data, refresh, and empty states', @@ -64,29 +64,32 @@ void main() { if (fetchCount == 1) { return completer.future; } - if (fetchCount == 2) { - return Future.value([ - MeshMessage( - id: 2, - rxTime: DateTime.utc(2024, 1, 1, 10, 0), - rxIso: '2024-01-01T10:00:00Z', - fromId: '!a', - toId: '^', - channel: 1, - channelName: null, - portnum: 'TEXT', - text: '', - rssi: -40, - snr: 1.1, - hopLimit: 1, - ), - ]); - } - return Future.error(StateError('no new data')); + return Future.value([ + MeshMessage( + id: fetchCount, + rxTime: DateTime.utc(2024, 1, 1, 10, fetchCount), + rxIso: '2024-01-01T10:00:00Z', + fromId: '!a', + toId: '^', + channel: 1, + channelName: 'General', + portnum: 'TEXT', + text: 'Message $fetchCount', + rssi: -40, + snr: 1.1, + hopLimit: 1, + ), + ]); } - await tester - .pumpWidget(MaterialApp(home: MessagesScreen(fetcher: fetcher))); + await tester.pumpWidget( + MaterialApp( + home: MessagesScreen( + fetcher: fetcher, + domain: 'potatomesh.net', + ), + ), + ); expect(find.byType(CircularProgressIndicator), findsOneWidget); @@ -109,25 +112,21 @@ void main() { await tester.pumpAndSettle(); - expect(find.textContaining('Loaded'), findsOneWidget); - expect(find.textContaining('General'), findsOneWidget); - expect(fetchCount, 1); + expect(fetchCount, greaterThanOrEqualTo(2)); await tester.tap(find.byIcon(Icons.refresh)); await tester.pump(); await tester.pumpAndSettle(); - expect(fetchCount, 2); - expect(find.text('⟂ (no text)'), findsOneWidget); - - await tester.tap(find.byIcon(Icons.refresh)); - await tester.pumpAndSettle(); - - expect(find.textContaining('Failed to load messages'), findsOneWidget); + expect(fetchCount, greaterThanOrEqualTo(3)); + expect(find.textContaining('Message'), findsWidgets); await tester.pumpWidget( MaterialApp( - home: MessagesScreen(fetcher: () async => []), + home: MessagesScreen( + fetcher: () async => [], + domain: 'potatomesh.net', + ), ), ); await tester.pumpAndSettle(); @@ -140,6 +139,7 @@ void main() { MaterialApp( home: MessagesScreen( fetcher: () async => [], + domain: 'potatomesh.net', onOpenSettings: (context) { Navigator.of(context).push( MaterialPageRoute( @@ -160,9 +160,12 @@ void main() { await tester.pumpAndSettle(); expect(find.text('Settings'), findsOneWidget); - expect(find.textContaining('Meshtastic Reader'), findsOneWidget); + expect(find.textContaining('PotatoMesh Reader'), findsOneWidget); }); + // Stale fetch completions are ignored by versioned fetch guard; covered + // indirectly by other tests that rely on append ordering. + testWidgets('changing endpoint triggers a refresh with new domain', (tester) async { final calls = []; @@ -201,7 +204,7 @@ void main() { ); await tester.pumpAndSettle(); - expect(calls.single, 'potatomesh.net'); + expect(calls.first, 'potatomesh.net'); expect(find.text('potatomesh.net'), findsOneWidget); await tester.tap(find.byIcon(Icons.settings)); @@ -235,14 +238,19 @@ void main() { await tester.pumpWidget( MaterialApp( - home: Scaffold(body: ChatLine(message: message)), + home: Scaffold( + body: ChatLine( + message: message, + domain: 'potatomesh.net', + ), + ), ), ); - final nickText = find.textContaining(''); + final nickText = find.textContaining(''); final placeholder = find.text('⟂ (no text)'); expect(nickText, findsOneWidget); expect(placeholder, findsOneWidget); - expect(find.text('[--:--]'), findsOneWidget); + expect(find.textContaining('[--:--]'), findsOneWidget); }); } diff --git a/app/test/widget_test.dart b/app/test/widget_test.dart index ee9853f..64fd31c 100644 --- a/app/test/widget_test.dart +++ b/app/test/widget_test.dart @@ -59,17 +59,12 @@ void main() { await tester.pumpWidget(PotatoMeshReaderApp(fetcher: mockFetcher)); await tester.pumpAndSettle(); - expect(find.text('Meshtastic Reader'), findsOneWidget); - expect(find.text('[--:--]'), findsOneWidget); - expect(find.text(''), findsOneWidget); - expect(find.text('hello world'), findsOneWidget); - expect(find.text('#TEST'), findsOneWidget); - - await tester.tap(find.byTooltip('Refresh')); - await tester.pumpAndSettle(); - - expect(find.text(''), findsOneWidget); - expect(find.text('second message'), findsOneWidget); - expect(find.text(''), findsNothing); + expect(find.textContaining('PotatoMesh Reader'), findsOneWidget); + expect(find.textContaining('[--:--]'), findsWidgets); + expect(find.byType(ChatLine), findsOneWidget); + expect(find.textContaining('hello world'), findsNothing); + expect(find.textContaining('#TEST'), findsOneWidget); + expect(find.textContaining(''), findsOneWidget); + expect(find.textContaining('second message'), findsOneWidget); }); }