From 11e6a3c78c9d8593a4c89a17d74d7648b16c5f35 Mon Sep 17 00:00:00 2001 From: sergio Date: Wed, 5 Aug 2026 11:41:16 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A9=20cosmic/metal:=20imagen=20EFI=20c?= =?UTF-8?q?on=20iris=20HW=20=E2=80=94=20el=20viaje=20que=20cierra=20Screen?= =?UTF-8?q?Cast?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hermano de kde/metal-desktop-image-dual.sh, pero con la decisión INVERTIDA y ése es el motivo de existir. La de KDE va por mesa-llvmpipe a propósito (tenía que aguantar también una NVIDIA Pascal, cuya mesa HW sólo existe como binario Alpine ⇒ rompería soberanía). Acá el objetivo es cerrar ScreenCast, y el diagnóstico de hoy midió que lo que falla es el COMPOSITOR en una llamada EGL —8 ms antes del `Paused`— porque en QEMU mesa es kms_swrast: software, SIN exportación dmabuf. El `mesa` del corpus se construye con -Dgallium-drivers=iris y YA está en el rootfs de COSMIC; en QEMU nunca se usaba, en un TigerLake es el driver correcto y trae dmabuf de verdad. O sea que este viaje no es "lo mismo pero en metal": es la única forma de saber si ScreenCast está bien. ⚠ Por eso NO se inyecta llvmpipe: mezclarlos no es aditivo — llvmpipe trae su propio libgbm/libEGL/libgallium y sobrescribirlos DESACTIVA iris. Si la máquina no tuviera Intel, la imagen correcta sería la de KDE, no ésta con un parche. Y lo que NO hace falta inyectar, medido: la de KDE mete libLLVM.so.18 + libgcc_s + libstdc++ porque el JIT de llvmpipe los NEEDea. Acá NO — iris_dri.so pide sólo libglapi/libdrm/libz/libzstd/libc (mesa va con -Dllvm=disabled) y cosmic-comp ocho NEEDED sin C++. CERO binarios ajenos de Alpine. Verificado con clausura ELF completa del rootfs: 472 objetos escaneados, 42 raíces de runtime, 0 con NEEDED sin proveedor (los 3 huecos son llvm-*/perl, herramientas de build que el escritorio no arranca). Se instala EL MISMO cosmic-start validado en QEMU, no una variante: nada de lo que hace es específico del emulador, y que corra el mismo fichero es lo que hace que "validado en QEMU" signifique algo para el metal. VALIDADO EN OVMF CON PANTALLA, que es la regla de oro que costó un USB en el 1er viaje de KDE (-serial null para simular metal sin puerto serie): arje-zero PID 1, las 4 particiones montadas, el motd VISIBLE y el prompt `/ #` en la pantalla — o sea que el getty de tty1 hace su trabajo. El shell responde: iris_dri.so presente, /dev/dri/card0, y cosmic-start/portal-probe/wireplumber en PATH. Falta quemar el USB, que es destructivo y necesita que el usuario confirme el device. Co-Authored-By: Claude Opus 5 (1M context) --- .../cosmic-metal-boot-pantalla-2026-08-05.png | Bin 0 -> 36166 bytes scripts/cosmic/metal-desktop-image.sh | 151 ++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 docs/evidencia/cosmic-metal-boot-pantalla-2026-08-05.png create mode 100755 scripts/cosmic/metal-desktop-image.sh diff --git a/docs/evidencia/cosmic-metal-boot-pantalla-2026-08-05.png b/docs/evidencia/cosmic-metal-boot-pantalla-2026-08-05.png new file mode 100644 index 0000000000000000000000000000000000000000..8c235373e83d23054124443fad01e0b00970d29c GIT binary patch literal 36166 zcmeAS@N?(olHy`uVBq!ia0y~yU}a!nU{>H@VqjqS{3~J&14A#br;B4q#hkZy@6KAR zvzZ~_dF?Z);)%6We=Ah~$!Qc4_&;f@-?HOsu8kQBObcf*K)?^4`g{NX{P}ZccHH{w zGbQ(|Ubo&vcfU{F&()W{JzbymC?rhQJW+JdGu7It-=8%%?OwC{hND&1{)higE!*o=s!o)uc13t#&7<&N0gpR4*<8SHM?pZ>omZoPNd{_0cbjW=8V{66i{x2x;T z9v@kG?fZ?GH-G&8@vQw@)5(8hbGu$?RR8y|o66snzs_C1>Gt&MKezVFGcwG1@V>S5 zef(d)r=3xm)tPno3;&k&Uw>VC!Q}3luaS9M_cvY5&z={)^>uBEY}MSK0aNQ6URcK; zU44Ifxh#W2ueSJswbQfBPG7(ONj!S${QuTjCx6XLTK7(u=bh7ARy+*XN~v)_EGgKYrKc(`^3bUN7r@U-I@lVSL-ZaQCu9ex0|YgZJ%r zwSN6pIy^JHC&((kbpG)>|9Kc{CjH;mZR2wJ)%SEoJ^PwZ;{Ma0&$rHdd+wR#bk0X_ zGLtpy?)+I+R=Rw8Y|HZcs*d`+SO3Fi*B3_o6Dap9`&u0{?_=HhY4gqX>h-pk8~@)@ z|Le_~?WHlfr^@^${HYQ0&i1*yPBMS3J_|#|H0|{a{8y~r&fdOfdH?DEY=zI}fA?XJ zZ`C%qIpgD+FP(Aw^EbzAt@`|4@T*t-4-TPh-nu#E`fJ;~+?V=Gs^9$P_wHj}e`Dc5)tl3&A$L(jj`l>0zfyK7}#9lau@0UqAQM+??sEm|+pTYm! z7j`mU3+NAKGgyVPQ~=d~^6oBz-Lwf3up*Xi|A6)yE* zX;*F6c|8r^zbZdJ^=HnrskwK8^Y8EQioc|FZ@;hloU4AG+asiz89rF%RnP2J`}X+p zjZ_8(_1*7vFUXua^V|4F|M{nzv=|Qj{1-EqVfxM|`^wuk%gZnMy{`n4nV{spvs3#W zqrz-oN$LhajMTZQ)fDh?bM&Ur>o#ne|361fyPf})@lfE;DUW3S_ByVv@~+;a{APkh z|LVUNR2K9uy~w}sH0{rSe)i;kwAXEI z=c_sTxi$yy?)y<5Vi&$O`^w_T;OpzO_0~Yl;VQlJBgZ!W=+n)WY3Gx#?PWNy{bzOJ z-QVH+gDaWBi*3#B1{F{Jk&?C||5u~>Dx1bF^VUak$Jfa*GwkTp7C&&4TekXCxZkH| zN##5GW~m9^@0cC;eC7V9yO-Tln4j~fuO{lT&(pe&&vWXfOI%~}gLh}?IJ5rUP``i6 zs}A`)|M#aK+;;Px#s4?;+N=G{x5p6ZlsHRu-4aopXMqnZQ}fRLHec9d zU$g%X!NK`5H66dcu}OP(pPaSp+{T~Fr(FwhzA}IPrLVbXD>XIpzj8CwboxgynET$% zvwMDf=9v%M?&!{+Epc_-FVWKzlD>v9K3=`pRQtg4o|bE6Tc_ohe*P@VaNzNu?Xgep z%`?@kNv}TQGIO?dUhk2)d)IG`n|svku`t6Aq3^K_-+g7Chu*2e8RxEjtIqjzUbe_)5H(M;uIn4jX>u@vnTI?GI*{$~r>QjS%{ro98 z>B$NU$3NfszxMCn<^TMCfq_i==j7W)~euSIPm8Bc8C4&8fTv6&#Q|{GQUnr zeb{Fa?A?F%=(+b#&R@87e)^9F+vupjd^~k4mcdH2#9|LSbN6<@xi;T!Mi{Rb{zKQQ&YVt0G((^ujQ z3l87sew{b>RqnL?hrjGS_IuswtG3lI*Uny=Eql;(LeK<@e}8VD)y%A#pQu^4^3S=l zt*7GNo_`j3YJc7SlI7ER=e?V9>F>9t(|Jx7OD;*XPdlx%+faA%+I8#yZ+@(DJAdli zRWG;9`nTRvZgxoDWRsc8K7A~l`>(v?%?!?M%URjfm>Fv3X|HGK58YK-JWbbr_VV(j zhnB{FeLC~n?q54gx)W+%Cs_TQeVV24n~#k5$H&jix30F{`$oy;?`7vd#lio#-}=*i z_*46i;!Ug9|E)ZyAOAPz^8C}fOD!@dKmSyC=2zh)U707BuVfx93|Up4Wf^C-cGmu# z_q9(?ue%p=Yv|;>8DZ_`Y>-I3&1X%r!Jlk^b@|udOEq`)f{_^pi zb7OS@t8#?UmHhqt%RfK2^VwY(|ePg}-?2zhBP#S$E1A@0d@V z6(3slvuIMt=gQ68&x^g6n&eH2+najmU`wgT?!G>IgL4kVk4ttP zeD&S#cVSNZo#nCG+kJT$epJ-o`>*p{X}Pc4WzK+_`O(|{Jkv7gkUPTvYHg+GDz%C~ zjaT2WKg?RRlzYg(yZH7Q@h)%&}{OW%=c;k&A&#!E}Swg-tSg?(#v*moK6rTTRHsQ&3&3`M_p8EHH$=xrWxr_|^j@0HiJ_|@&H~(PWo@?gc_n%(Na6tI) zPAf*e;*+)SdD89URq@)7@7ZNK84fu9i;MXF@9O)Ic`vr)+24Hq)hc6F^<=i7mtntOcZ#3N zE9ETT|9$4eoxQ8%oxZNV|1N-mVI{b&Xl-`dKK0kXd3V>nJL{c)_fE0*w^ao)_5X4& zl)il1TKI42C+pi+wW`BY%+3e>`}%vS_1>HhCCjJ0+pfPi#baLW-wAi)Z~mDst$jPX zt1@lx%^!~cugmoNY905S$x0jUI<=4i01nY{v@DO77VYAgqNL@2;pWUv)5L%aoeG-+ovB-FJBNmTOVDFJFA9 z(4FoJ$(>uIv}C99o!Pvp-mL#fRpHNHQ*Yd;I^QpRqHpqoS3y5_bnT7o6PVu~-hR@z zh>hXhOJT7CYggYt&H8hS*sHIC@ABiA{ja{2jre+w$@eJRskm9UO>EA;Ygqg9_|w<@ zuQz_ZCM~-BeC@a27tPi`U;pnB8^eeDWfQA+KNp&Q@AkD? z3sD9JZ*cXv#4Nt_@XyHJpj-Xf=ZqdEBv~zqbw4gI@jPQ{W!%1y6_$0&nZx#fzuBKG zT`|9mk>Sn}NF8~}%gVU>efsHX=l$M4@@HEY7xe4j!n1FKz4uS`ViR0Zfz7l=Pc(;7G^|}zd z9n-&FsM>7$?oE5>PtBXZXHPwbn*AQFYJTe&cKUm3&Syr3A6a_BwQRpXMos-L=OpHA!Yv#YJpB~ECp#H14lqu%fq~G@>&(-Y-3;u6kn_hZ9oF9_; zAf&@;ZTaRcYj(Yt)IF`c`G=u_X}|BOXPbYzEM1nqG-sN8UcLSK+xkBr+`s&poq<8` zd->1#pT*hM#xIyP&3}IW&$x$Ew(b8vJ2!K~5v`|^I;$>ETAiM6SE%~!i~gS4s(%a& z2juFvcgv*xe^oBEJ>z}E-+Onm8t>i;ERUXJZ(Gm6@SrGMui>@+{IF^EFLq8@TWJ;< zE9O_v_wLj^p4tD(OE;Hm)~&3WRh-Iax_!;{7AxKVL4Ow9TNeG1J&&D%LF?}?o)4Gp zZ(D}yZ1I|Z^zNUYch6KGEn|H+MQ6n&i-YU4v~HcT?~9jQVmg08@7i7~tN%apg)hIq zeari;RaLdGGXq1zc2J7mvh&|e`{LQ_IyTMcwR>m0>vVU!`;POMR+OCnwJHDog!K9Q z&NS->&gM?}{XF>>F9U<#m-|;ac?#yM#xH&RZsk7z@G~=)oYdLR_NM7f+bOdRU!QKS zd_3j#eE(PG3=BJtJQhFjJ@QlRJI7eV_21V#-Q@Lm@qGq{g#O=p4ZqiwsW{;C?0pRTtkEc%hYp;m2zQE$wys%gEK zckTVMdRD$@+*7fdl|kEl0$l%eKFyiu_-8@v>b4Lw%iH%(SxkSvUngGJa`yAW+l&kh z3Df=eMlvuk?7LQ*-^j+m(9o#UpqRYx+iN8QNK$~31^XZ=V&A2+$CX3v%$9}Z*Zz4q z?eDfKxuCzn^>SKu|AZMpEvD%SdqFLx!s=7!Umt+<(RbYY^&|iJ_XwT3EuWr$Q(Hh=H>>bl&3uYYbozH`R3- z`s3!_dv)vm#ZB9_m-D^qZCw3&{jF>U28Z6`_nC6Pdao+^|M|=Nbw9KxF)=XcmEC78 zxbLL;dsSoijmgvfPoF=&ZQqBBr}td@^Ze6k@ojadr5G4K-2Aua|H-Myf=O8tkm zS8nEjB6R)o_%b#I2D{s!>Q_*wijkpV`H$jKCYyVz-_J8cqZ2~aY(R?Cqy2|h*5m}O z?0UfIVE+Hd>wk6gw%^~gl!1XEvVQu1%lgF2zgQ1t{`|6Y(|ggV%-_HF-z<$?S+k*p zN9?Nn%jzgD28Nn>`)|AQZLa@nExSJ>e{VsR{A%y5Ykez{CNnZHFoo+iMC;Gbn^ylW zsdPuE{?hFQ=WD0#-Mu@c?&~dOBX$M`ixX41A8ZU;z3Ka#L%L zyYFn;bGEv)yW#`qtKZ)l7#JL0Ig1^**&6wDd&F7p{ipP=?fSXhA#yPj14GK+@=_+| zh)-urSQ!``PCgbtFs;TomXU!$V8?qViytm|uUAjgK0IrKe~jn6ImP$yF)}dhxG?{_ z{q&lX!MmEg>|3R4^vX}whF>=FTN!xpdG+j5?E04Re@;HhnYVgB_mcflQ{(@>imX?F z1Rxgj0Y|tUTV`Zw?b6x(?x+4~N!xRj{y(lT^;hm!n6%5C{oZsr?Dp(WK99d#-Tmk4Ig77!d5 z0h9kvTd%!wz5dg9U7@zu_L}qd>G`brr;K}dF28s6?5nkfX20LQ4Br6C5Fi7h;{LAw zX}0)k>HZymK5c)#zR|tbGB|jG@GQ$!f$#rmuI*xEU`UhS#K5;kEb3*JnZ}2$ey>}a zwKfSeGBjLizr)1KzVqtZ_n_M0dn`k^o{iVhP4o46A6=PZ|KEGkw4Yn{6`a_VYwVY8 zKYz_ud7W}bh6l}mEB|k<+V=o-|*n2pKh*S8?|@ImRYfX&7$pI%yIsm`}OG2 zwVF%sPqVqYHqiU;%(~*xJNY+lw5^Lb-+OR-x%DT0*r+9DWI8-JbzDJr^}6*XpFeuc zKEKU!QBAOL--TZh3xa+=Sa^zofuaA~{ZIDrHs+~ZzdF6iu`GN#_OTa}*FO4l-#&f% z$M5-43=9sF|8IlTcv|Z(Pg{NSP3whIpXB%R_3U1{`0d)=q6`cVWa{`sf_wcN(~ z@1H+9*Z*gpUw%5dnw^1R$69Ui1I(=RkJhe#G;ROipFcUTWv>1-`(ysn(!W37^}cbh z&z`pX=JY!|>lqjt^1mr^KX@8?>J67!bj7MTL$jm%0}8g5eO7(>ZQ0W;SM?bf3W`CI zuto2r&cn2qTfYP`u8wD5c<|4zp7D&|XVLeUeqDPd&cIO7qP?HhN~}JpeDjS@(wn`s zw_Gx}Uq7$?%h~uhTW*$t^=SUv^MB_P?|F~bM|y>aE&a6m?ak>^9!+`oiTBl7p3+UB z<*D;C|7@!|ad}nEhwCjtd&Bl)1~OD6{xwoq-&B{rI=w$Ws46EYSeS28txw3yjcy-} zmu~70UbS-9GGj&t2EC8SA^$7OuP$=g)|x+)zHEQ~Jz}-x-q2Mqziqky>ifB~)}T@` zO1Hs(Tm4t-R__bfKHZ$I6TbhZ>4&vC)3+8j`YxVT`G3D40|P_+qxY?)+t;c0>)Ed_ zeZS`j@0x2fZ|UB}(K-1qt(mA%WWzOMda^m|_PCPoH^pm4ng_N>1;c~N!6sbAx4 z-<|ptv^2E#+vDBuSzo=%XOunb|9{qpdq(BYK0Q}BWHi(LJu3sl1E=tNOtt|ZX5L%& z>HXGge?A+Yj9dJ5*^A$6jJ5wefy$}h6SNQfUV8uMo=W$Rk6E(sp4HwMd|mef0|UeN zM8-d*yWT(Dc88ULLGJCo?GF0y-R{M&+5P9!zuWvfxW9LPFJ~;`{Tz=g+;j zdL?{6X!bfY@28j7N50aYzfX%dH28n{a2tQ?Irj8@XQ}#8PJ%( zpc<@qe=_tqz3R30-5Q&qmxdm9Z!dpt!s{eM;#S*riPXO#8(Rru;#=ihIP$gcN0`Nrl&`_*qt6DAgHS^oY1*~ca2?^j&? zEtuH+qxP}AwAQ_Sm#(i{+`q%N-Yfc9*~yuV3<|GdBmA1T3dK9@JZoQ@o!%3-e*S#< z>ycuZ>aoAm%Gs{nFOvDQXV+DOz4waF zw`Q!24PGeU^!DZYtX1>s-Zur+hdrBocgONr+20#Y{a)_-yI_9#vMn>y?^oQjJm)^w z|B~8~+uDnd{+BhqXBBd+@>(S)!w)%dkL=2lt*>%^&a$k1%~Gi46Zc!~(bChtA6d*J zH1htfI+m86w)pM;HOYHU%;)+WP<3)%)%3S#^?I6@EtNLk9&#*yZ_iEf<)uBQYwLa= zE2!OWzBFWV?zXO+53`;$yXB?@-B(Wwcl&bT z9Xo5zUfmG-r_W}3=AD2G_BWXp@2R`*D7*e-zlZXU2a%f%!+zcNTDkYD)uSsD#2+wsfnQQ4a1SD>CX%m2e(3rGE{?~mu?-7K3Lw$pd@{T;EHd)NNm z9QoeJZv*@9SH8dZZ;f4Q;rn*g$>q!bZ(hCZRNcLu^_zc|KiNF<`KniaAMK~I2ffx* z(v2ye$8#$D+vhZ|yU))D&0}CVAQ{uPOLX_*dHa|cZoJ&L-Qlo97@y7Ed8h9(Fzf-1 zd{~@R{r*#Ub8wREcU_dG*ayjVH9VI#y?U4a%|}#za(3+*f2ow>>R@5Mub)3(p5>YP z|BJ2MvyAfUJznnr?_2tnfA71czxq%6`*+JedtUyz@a5y()xUo3n0WuM&(<%h?aw$F z0^TDJUVgrA`7?CpoBGX9r|;L=n-co_r>)rQAB!GeV(tq6EBw89+w=1uzx>-@Ip^Iw z*{xOfN;v}c=YK8?+41a!#8-{S8^8V0%$+$~KY^X$-Q!co72d}G^^5kt@Jq|YrbKcc}ZlmdK9!`>prkue^M(m1?(hL{}e~cIn(nv&ztYYLkEQ zNt)iv+H~tr{!4ys->ZxaGH*cx|GMfa_TBl>k+Jm^y6-}KxLFFlZd-qf@tcybG55hT znD}$E(BVq`lwfUJ_ZZ|3A>~hs2)H%Y3r= zzvKBB3KnYbXW)_cys-=_RETL00b_V!0sh6%ggGwmo++MT}d_rdTs z?cJ#law^i(^@RC0?aHdW9F@QF&z@S8Ty{O`;wFDRoB2Ib`HNr4hRQJ{?1+zV`dW62 zWu3|4xPN9p_Ph(3aniJQzVFlLjgM6}e_gj`mhhdh@)c(v@ z^4nMMyB9R)Y}NF_Cfgg~`M3Vd{+-!-`O3OkHCeyxcW147^L*}a^V#+8cC#zjt-4n% zx59FM$g|*8<(psatGnm3QnT*mX6C71nHU%j@8BubE_1i7Wo6iKxi-JCt#OS^#V+pr zjcg1*Bu!8s#7>?i;IyHlUfT<|9?Z0-3etIqxX zA763j#QVByQNJcRe`aCu`1?!j1-wcVvQ*z6HDy`vDZANQl+RtcmwYfeFgn+7W%)6E z+Z`6S?U(LqOS$wsZ1bx?+k*KPckfzfeXVo3p-^}HM?e3uQ?UlG1dk_w{d;xszdei$ z1#>_Sum38oq3b(6c;nNSH6i~N*mJ#!_uhUi|5C|QvwQmD>lzco{>!YnFe)1HtlB4dc|wD%zpc})gsHc-fyxfOlNz%JoD>pTb|98emg(z zzsYa^-!6F8y5m~yE_YfU{0XS?{B^(2M~nYn;N!JdpMBiXb;oKRBZJ${Ph1}~PM-|^ z{-#FsmF-zy<@YmJ?5)$^_=`nw)5rVL&$qofQ$O_>=c7O6@7|qaxzuYKZj_z!U&JV- zzVyh-llHqGtm%{&m$sP07wg6Pyj^Xzec;vkbJ?!V?%lch`=;N8Co1_F5~lb^Ft9&* z`e=g1ck}aw%hSyiPyFBVEa%$nIPG^F*7-7<_Ro6s<*EHC;r7&}2~XzKd&pVc`?g<( z;Q>qke%4u1*6;K8+`0TY-xR&-`*8N%ZiaU=He8E2a-#0v+V#8KBet!s>yw`T<_FJ{ zd9%&3Kkd)@zV%wPmVLhb)qBmqbffDY+{z58=er&i_|m3$Q{dy=kiCmfF*B6>{`@c9 z@~1`aqOe(>`t{QF?@Z=yOtn{z+LdV97hk+NDR_VGvz@;}tHNKc+Pj+n`qW44Z&!I% zOg*3WCrDUp_3T4sQ$L-|TmR=nqM6^*bF0>y%NDJDt93LpE8N%4^zZyw)6j39&;6Z! zcE9rcvo_(O;m>CNy*e-0-F@%PRlk2#8ZTY;W9srG28IU(dd_#d?gskDGcttidarw- zfJvKu-n&E5YZw{io}a(UdEltt&j0gg%oTe5F9xL|WbiKp&*5#it5*I!=|`fgZ-01Z zl}(W5eA`{~`7ZtHwXojrsD67p^KPY%{Xc&!diw2D*Q?XvYBqN+_V-%ul7IAE^zHk- z&cBz7?D@Ab>t=q;?fdsm)yaisO4a+%xi&d8D)aTX%nOz4m7Vs)f8)R9y-#rMR&%Rw z;tV`rUPmv8Uw=I`f6i3Z`2S1R>$aW}(?06ieB^2W>y3f^2C~urURbO(UG_Wm-S$fs znw3YUXh;0-FDkLOF|S+sdAhUV?u{k)EVgKe9o*gDedlqJ3gxj&LeCew-|y ztpB@q!@+M}g>x=dc=LBDT+N%k-NKADvhCH0{if#}%emz@>fF44{_9_X@5Qfwt}S_~ zFJ1FvKF_ADUp&k6g7@dT#T~VL_@}t!Kl6d7>-I3+Szg2{>Tgy5kMq=?vzPl$eOmi$ z#^?BV=FhvIXY86J@TGobth3RaQ{k&#e-Gal5&!S&-wT5F)tswM&&8^nnFma6Kh<2c>FRImJ<4xh?a=t@Y_QJl?QzRPt0r6j+MoPeW9d1| z75B3yt?U#&(*N7uZ^ymR-`ot#vez?|cTC^?`FwHXrEjT?^FKsKT>4rTv+wHaM_$iX z`AmLOla%o9^o*r9>#t47o3lJGbIXJ9%(jDBiRo?HQ#b#-l->VB_>9qHWu^C>@%QcT z{^ZXrdikf|#Vhk{YCdt>)GDyg7uog`;t^xS%e2gx>>jC1BX>-?V`catNo zLjLogOe=+x#?f=vHJ)EtdtRQyOu3)8qUg_Z>$UZlF1xFQ}@5+tKOGt_jUf)syU(C_3higajf?KvikhR z(jzPH{NtS#D|M&4F89C8mizmCzyHwxTL1dnWYf3be@ttvo>y=7Ins6C&wor0y#G}G zpS;g?uEM^nSzq;L)K=@=-64^$e|K5*DfJy|x39cEjr(qi+2)!4wSP`c|8n=$G~P*n zS47`g_e;CZ_wVJ4E3WHpcbzghNi^INUIbEd_+W&c`|k!trj|1rM? zTe8l%`rXeCU?Al_Jp-b753NX%Wd9&t0#W5?YgDQPR>3ad-mJ1?{jCRggMUo zwf585rC(MXpSN#JP@fid^yVkuW<~~vzDu=@9csURM*WgUspKJ?2IiQb5=&CAR?AsW z7vu%95sy$*^zu+w$`@0Vc zm1jSGuJ$|igz@1`jNgx2{t}s3`}572zmv*tt@wOClmCHcYQ^Nof(-i(!Upm7e}xnq zYeS|t9V+}2H0N>E8vUHt#x`!YpCA88Z=dq*`knlxg+ZTQtbBfX{@qXK>@Bo5@6YYs z@BV$qEuJ0j?tIpl@7eInuey@S{QdnxuS&bWKUf>mLCb4=-~al^vQ+cR@^fa#*40_B zQ?ak&wLBGU^>CGTY~jyI*I!?)y;1k-sf@Uig%0$8RR5m)o{4 z%dS=Tx4x7edGq&*boGjFBR+0FaN|hW#zj+0k_`Ye6V!gYXO<^ zj~|09`N9ilv0Z(((O@cj@we96w^_37)Az_T9x(r%zx%{lleG)##2#(uuk>URDdOg+9!KSkKuvZye$mp&dFYWdHr#k%IBJF zD}|rN)yi`N<^}(rXD^WBCMR9s|Ht<6lO6VzG1V82u3rCn^RB}u)o=5=&r!epIM4W5 zTH~dykABt6iVKq8x$l7NF+~P}iZe_<7IxqEnmS$ke933N{gqYhJ8xTXezL4*|9bUn zCG*P*bwBpJlk$7caNz9S@5TpKpPym+ciS?DKesYpD=%BD^Z0x0_llNK^M5*a>OVPF zd(S=nXZEw*OCMe_nb%xc^ray8Z2QJt$IqX9H|@N}{9AeqKeRxL4enp@|IJ)hv-(C> z>BPBZQ}S$1pF7bUkooh$v~4>s9Vj{|aOY+Csm*qEPrcjjteSq;*Ys_d{X@wolHdK^ z7e{?R{YrIdi23)&=l({ovXVP9yHYRSuB;|4v~PaSQeXMqx=U{va%i7tnEf|QD*x-_ z0xkZd``WIsytI>>eeB^BYu71$pFaMGJoeHq-gK+>>SwjfH5C{b3KpE-{pV|??yJS1 zBA`yUS7$N7`(3ag z1H=6X`=8dwt-r3i`u?v;>+3IFpBAR(EnE2L)A6r2<}F_(7j9?zJo44~cMa8V^20Ot zFMsPBUwR~5_4;$+>vmZ?=9Mkl@Q#%sVF74hcvJfRec!+K+1VRq zQ?DIhU^u}0ckhOG@3`AOzFl_L?PzDSf9s$0)uy3;eOImhYx$%p*YnoQwcDqxf8|_hw)F0*`b$qQfBNOeei1k+U=XBmnBIp-%@z0ce05y1H+B?r?d~qdKEvq8e|sx zWXigEYtw#a&MBGuVe{|XQ>SIEd$abG3Fo!UtwYcg+ z*S~+SGxf1C-#obuFWndzZoKs5e(+|F#XjlH_f}ZchRT;z{_JR|&6{*ABHT3Vyu8aJ zh2vW_s(a06Uv=bUU^wt)LG%Lq-(3N(YnQ8Q+|Bx3vi9vQofY6F-3u13~I1UuWI;O_8PUe-wVy)h0&oUs-X* zTzdawneVnI4?fPaesm`?Q|8=bMe8Sh@9G&Ce(-?Ws+s%b^i7+uzW=w%`c!;U&f=)~ zKdSu1ZNE!ByP^JK8Yq!EfJS=C<1cjQ|6Wu7)A8wJgpy2@*T37pKE@8|Z_mG6d#zBn?N7n`-8<(0-p;_lu;bL!@P^+ewL3n7 z);;SdhlRiD`}g6=v$faV^@F`z`=Pef9W#ex{jIz}JhbFI<|-0h+DY08W5f8nIiCX*VuDT|VRbc6L^I z=?#}wtY5oJ>z|jwtE^MFn`cOBP;AzsFK&CFfoevp>~%eSPBJ)!*#DRJ?gyHtUn7?d26;?q4(c6}S8T#m8ll z3tnEhU9&9Y{uF2j?0?(U=3iaymMb5cA3Ue8@OD&wtsw)0U-8rA3A57LKL!~`{QdUy zn@e)|{&3rtvMcvR-fjD~;?4PMg}1NA)~>$)hN=4bw^Y}qq3;9>qkiXZzIVx+fnmqg z{o>c|)*jqYGW+%1^f@n|E)M;-`RblMb*@)#&3D$jv2XX^=g-r3npK?MrhPXOG<8*? z6E)3#`QQC(3~yh3d91H&?&6{qHjgTPGCaR8z{qf5nf7{y@0x4tyj#=X>waESQo3|S z-R~Q%XP>Q|5$?PAwf;oi-5K{Hvcfm8%;l=RT{1sQKz-XT%QDfd&)075hz<6x_bYvD z7Pn&hsq+4ZLFfB##l4#E{J2Esy4V&5hW@grq7V3%u6&jCa%&Wu&;PVtA45;Q`Bt)b zZ_obt0@ke|%RI~W+5LI+q-dvTjLzHB3-eE2ENT55yW`8GE&toMXrD`8moYOUQ)bz5 zSKpsMpD%d$`*uUMWU>1fui9UK!}aTz9iF!Axrcby?5)@DueaX1 zzNLTn>GJyBY*|v4OCK-Y?Yekd|Ele#eybn+VP-h+*Y=s%i*~&{?XCA7RX08TyZv`} zVSsz>nL@)=^*kO73{0RBRrsdjZ6(hrr<@WFEFRi@Cd5JUQkK!>Cr$3qZu6l1;ILnSd=KrKMPo2zn zY~Ft5$*&(%^)q$jCDqT_zuWjG-}~=0-TAs3R#izZU-su;nd!@Q=Krp0t$w$#`Up4; zu6#M)_G_QjKIG($%zp3;QjYc=@5-^;zy0w?r?vgwFJEk5EU)zI^XK9t$rWDxw>53u zG%EI7Soz^5D4sQ`@uVE{~mYKKP#1!mDT< zhO__7b>)wo)T?_`1)BA$tv@Ds>D#%pXUr;ZZa=@Oyxy+x?c%oMnTOwmJ+9mpZ}(jL zZ(!P$Z-HOyLjTQv@BZ~CkD$ET+N-spKfRBAKJalf&(ymSv$luKi(;2s?)>fa#jo=o zIR3n&8!GW)|68T@Osg%AK9|<62%7WsX7SbslGd#Iv(Enc{MqfBfoht+J~&xn=D&KI?wu)a$RYuG`PK#_!kX`rr2= zU;AsXed;Z^%;4wM+bNmV-<}6n=52el>hj0TuluV1J-=V;=&W_N?{;eMQlq7!fdc7U zYm4`!I$t$OH}*JgrFd@n;`>=r((k7yRGV#IFu&R2rp^2lXIA=K)h*lg`Iy$BqU5u` zbEdTf}axU|l)5AL#PwTsB!nRK6eenAtj?~YYQbJ1$qj%O{ zUSsxnikV;Q_5;@h=k?ydyUwIB$FBCHcYCGO^3rO}|Cc^WALq2Px6^-nKhDa2%dwe< zWVhS@yZF=mXym^ACUe=F;*S=Z9Z!7i7#{gvuKk$(m)hK)tCf!x8`S+emRJ+C>gUxJ zk29{Udf8HSxz3|{L5ZDyu6|@${++AWpA~U{T*|9-pAms%e#L4 zbt-?|9{qIk-0;K4D=snZ_`-gAhePU|oCC`?+<&}k-Hr|S{tDm8nNYlL7t86RbG^S` zGF@>gwRcvAso#%m@3Q2TvFdY_UY!rGz1@CA`paSEPwzV}XZ_Dw^7x0=O8!gX7cYKf z-<4&vUFuW#@4kb@+rROx{GJ!Q`}dQ}hU?poSDw+mu$b@A`n}(*&(C~y`n}GD=c}qN zNAc}CQ{ngT`mFqAt1{m-^KH!8EjOh;;eW&aZSroi8{B1n%r^CVyL#eZ^~sCBU$=bx zaL3=TFFxLx`{(E5|61kN`S*3@e^h|VF!e{vE|>gSe&I`0nD5Wo(v#Bf{I_ntzu_LY zZE8$zl-ZKBzI~r#_kaDd*3)|T-Ye?@e@>tBN@{Cu$lj$h{7>#TJ@>3HS~TPB_E{UM zuN|1b@z>i8#ru1twy#zH(|j)fE~s4cl9Y>m?|ba|r@v3bejYIY@%f*+?bkU9wwIcI z>uqXJjjG#edwYe&xvadv__|fEw<|3DQd=HcYIgF=o|$F~L$}=vvQH@wp7US%)!OsR zpY@i#y0yRXYT>-##5pX=W^&<$mv{aCzq}^7(*4h+2kR|GzvQkzx!Um%{=ED2`@8qHn&aQDeP6lE!u0dB zW%j#MCf~Vy?@fNch5eSk^H;sk&0Kz0cm9s7hUD0P*LSQI+Og;1_l4T?PVZy>kyCDc z{=TmKj+gP+=sfj_`R$$eYyZYbzWvnCncBbg^k%DrD`E>)%e~GBd0A6>RbXws{LF2W*3`>e zI^Lh0-=}?l)z{j$e`;!KnGZDofzH$HE~-6w-G24;Wrbc(A6qQ_Kkd}~`^g&v@6WL@ z&)QsidXj1E#A)mA=xeWi8m_-mvtAo)pW3wK2i|vb#d$8?T5(B^UoN|H(*qk}^_ySp ziprB`+*M1OCp-rACza}uh*Jr6z8Y@~m*{=Vq6XJL~sS-+`? zkGw2z{p;55Q@LCBUimNkbore+{i7=bFP|^8Te`vb?W-5wdICZUwUES|v(Pw{Z_3o^{kQS^Z+VMH_Ry^~0d(-!) zXa6nx^!wJ`PmB+qfkuKKKA*qxSFd{YOZ{Hq<8M}&YuCPwsV?)JoX4-Ee|yH-j1$pc zv$W>q&0js+Jngsc+w)J?ajx=vyhJ*B_UB*ew_g1}`zbhY)s$u7UBNRyXcgT$zxMI+ zt+BO#12&zpJh$BRe_!1>v3K|4FTcO%@qf2^-CvL+tB-|h{@9cH_4AZ3m3P*i{TOBy z@4HiW;b0y=|_MmxFzp_1k()P1wmO4Yh7VY&6 zzc01_<u<8H*J?dAZ@t#)j{EwL!q3`YfAjb1`d!CAUwrRd9)0(&mi%Xy zhUFDEn09zxj!xd-vFy?cxoF>i%NAa*+g$%leqWSz$%hyVqwvu9+x(faOYK>{tPTJE zf8oN?4!OIr2ek?xD28B^Z)Ur6_nzeYY5WZSA2&oV zcwLztGxK?nddQXUt1fZ#&zfa_*RuL^q}Kan8})z9Z5i8Q`A_XXsroi6_U}Gf+j+C^ zhp83mK^s$!K<&3x61OMI$eE;fs zw)&~*@@l79n$}4a$*p+#YVPLGSC{Uee}De}H{RfabaJ@3`v1zj`rU4Cr(eqMmpi{U zZ_}+iZ?} zSMs=Oy71x!)7@%w^nG)F-Vd_BKBeFOhS_!L7&Fh;Yjdu@zTeL5{nfAcx2hcH!MgQ6 z`?k)1{NwA-k~iy5i7n*}e-F_lqnES)g3^azUO{xbN-kPyCSag z65($Ow|^|&Uc+E<5V5*CKkMJ@E%ttw5B_+_aZI%OPVOI2cp|k^BX)vUTSd=ToU%{l z_nq#kZ-n_?1#``7-Egzz>~i6wQ}d4PkNI17hiB5U%v<+9T6F#W`1qsQl6wiiuiW?_ zes%ZEONGrgb$O?>dKD&n_g(&bFk0SxYOR=G{GZS*ed%6TGi2?*s{efO^z!>>C0ibC zxm+FW`nBJeOYZ%YeP(qz(Y{8@uU4P?Xk=USC&nUw&6Vr+i|@%tXWN^cJ5YJ?nRlP| zeXZa7{!j5V1usGeuYJsi6rs}|>6~7^aFf1HtJdDfVc#OkkJp`7jJl=od;4+WrSSY; zdO=ta zTYmXFC4J|o=moRc;tN*gM$OW5uYVb{+4!p6_j>)#w`cZmiI3WzzwG1Z&%ssYnn%}X zJ`?u&9SsrmT-6Pw4MuU@%#-h4~3UeUi-(EWKL`W)MQ zdD-P(bF(+!yX38Mnx5&Ff)?ys=;ym8{Zq)oTKhi|!Mq?-RkHhXsF#H?-U zVatzhd3Ej6(m$IE?L0Fl)@)jR?lJRgUEV__dvf#6|J&1bb4uv_!l=rcrElMQZ@q1O zcz*r&&RDw{-cA29W!sm2y8GC2cC=Z}hWh4%+j@+1d*{yz{^)pb@ryr-C24!zW%T2X z>a3oLE>&=xzvfYT{0YIVbMtSm{2F4&cfRKS^J<$nmIv(r`}|hh6#Oti=dWVrgM-HV z%hT?+?^+%AZ?1lI(2V6AtM9MdmOpKN(efD!?uQj>NpC8yHt_QbUTWdD;gDwQt>FCQ z-@@Fl-!@V8^`3StJ+sbIc)gqd>-F=HMr{!;bX>n`%NAKI#U-s&!8L#QTS+#}z>F-;0U%spk ziT!Jl32Kr)Ei98;?l|X1!kx;hmz(EYUZ2HZ7usc9`}fPD^*`6&4;TO4v_7u-*2@>6 zJDgv=Sf#(R{L06mPpyyBmxmvn`ZIN=_pw(`zn$;i_4}7_$1e#otx&C#juC< z&G-KHAoTFFLsj49^^cv`DE9YLRx?<9Pu|^kZ=3(aUyr`D?mc{_@@d$~f~oCynRu^Q>Rj&RM?YyJqFIH}dEE^Zv<}{IPtz(`4bOnO#2_c62JFuH$$B4jm3SRpZ@&F-GAm*OA>FM&zHaUKhpHAl<7bJvdVtJ?`2kKP(SzTKsKIqx)X_ zZS&Um^=-DCp!J+{ZQiGOrrY01-}7Jj{rO*it1tc&L7!Blj(N7P0ot{0Dhw-dMZu+PLYm*Vk(%iJ?0(f3K)A|E;)o(bp+e zF4dd&-xc1!{+`;wA1h_%U%vKH$Xr)i<;UB!y$3%Aohtr%Yu1z5CUfPZ%Ja4@ZmN52 z;j!HD@&1r~D^DJ@$gG|J$~xbF_wncj|7zl_M^@Cf9)HuU#mi^t*z`Uj-7n=t*xOl5Uo0kEiazklrZ}p*Z{3Rv&Iwj;{=@{o|K0v@YyaOFU!H&E-|*>m^n&yM{jOZk zcRcy?Z@!-8e9dY5S849o2{^Uf$gj5l>`}MUqRZ10^Yl1>IbF@D`p@^P^48p+oK{9} zB6P2RKNgz5$o>7w2YUi5WBgk`y9L;F%+I@H^FL%-|KlZ(7gqPD`}cqSx#imJD!cVO zTbJKkxzyhL`}+x>g!24??R_DOu-WVtK(i~AO*Zt=GHp3rjq zXLTu4_1l?sx>J>8O6;os*0KHleZDs{I?`)FwH|&NtHLG`{El`grZ9KQZ?+r@mi4weniXU6mcnlh6OY{`lAOQkieP(G}C;=QG+B zYg~^n*4Vqm2=v7RTmK6SgvSN{twzZ@fsH?MiqKI`q;zX7-OP3LaVxl~%;-+pPy ze$QF;8z!9CXS%QMexS`C5wSUv&Cld(?P|AIozTme6n6dMrC*wX?sjV*FUhKLT4;YtCO*Wqr%K^>KQrot?a%v~n%0zTPjZ0Zb}F=|6g;2u_APf@UNXKcQ<{GQ`kN4 zO^0#J8eYin*>PyESWvO9-yPvspxn+@OhILnvR%}ibvUU=Se zuI}y7`247%ov9CeG~Rwo_ucGu_*q_lcrhp_H~slgw#v3N#Tp1S#P-C zU%Pi|#_8{^zcOTX_nzD^XX~@#?T7zp-TeOd8V~!n7yteiuT}ibz3$U%?+y3-_DOFG z$^UgON-KWz-V*)DZ>k4%PdR!O?oajSx_SOksM*5xuV($bBl2d}rDIRMH{JIB8@y^` z=!NsMAFI!<|5f~J)zxXIeiRCaIX;SKZQfJ;d&|}Q)!|1!KK?jAH1d7gjkAxfX1ht* z-?sl)aZakV?zQzg^V?T#>$0-$2-o}XHC6wdaAzIM^X;?VPJMezczN|47RN_d^Pis7 z)r&8FJz?&T95P9>SsOJDRR(zS#7`c&JV9AZrc6BN%n93 zbMRWw{cAqS@7w)2eVvbWU-!P_XG*?&E>zyHy!w(i-&tXX1^3qHH`eWqQ$HUVx1Uw@ zdF88^qOCuClvC!%UK3P5@%fKjcWKS%#FvewtN-16vwh#K@6}cR@7sWujz{g47c}d* zZ}snY-}I39-F93(<>vMvU~~iURiu4e&^jc^SQ4d zFj!sBk@E6cpW^ez_crs-?A!U4;lSCyd#xJtH|{as@NC-SFHxsnJ-@oP?d8{LkDo25 zel-1-spv1o8}t6HTK4MYcRh`->8aqwrB^q~M?aqO?)LhfsoV9Jp0)XX?DM(8eLvM_ z2ObX$o^wf7a`pc{seD5=kd~JLn-Otx5FYnHrim75P*q>D##MYW{tRb??6|o07HZ?wvR*yBFfCqF5wyGO@~r1+ zS5LG4v}OHUe8=V6UG?JodFxKLrwi%4%r-l=DSOERjGYuY+Fr+xet4X^)!$mi{GQjx z=UU&`*%>TAo8Dx7_RLC4Rx4;+Y@I%D@$#*6wz-?V){Xs?#buqZvvs>?@SJ^r+$)bv zG|ie5Utwek+esn!Uo~RR<2g6~y#Bf?E4QpO@U88_`|~!%KQoQ{etLQP`a0(OWi^Zp zOZ1`{^3MgA`=w0(yysW{PhS7WT2nKRZ+^I-{?ZTY^gpK?9K*uj_Fb#;e)|0F;#<`L z`%_Qz$5{8iI=?ve^;?ViGIRg0K-*vuyEWo$i`jm2RSkK6&t?nL_-mUY^UXrcCZE;s z_dMt<>Fu6+LQ?6dn5&!^2hy{fq|PD)GmxVNvJ;|k?tx6{0QKWh6QWneh)5NT`0$@GSw zTtx4z(5vRTbl`Z4PiuOPi7nrfXNLBfZEO1-y&hk;ms=T9ef)5H)~Wn9skr>($?Ni7 zJb%7i^Zd2HLi|VHrEBtDzs3JG@pA9S~^d7oTryRoF;GmH%B; z5WoA?@pPH}TmP)M9QZQ)=G%jla->Y|MO|I<=koNJqAm%gvwyZc1Gl~UzEAX)xsspU zzxe!Xd4;c_oS&w+{(AO_q?M(6!!u1wtFKSG7CP%;>3pT{|07H4C#*U9H}u!xgTL42 zRoI!A-)Y#tGsxKc_H^ZK&+`4(e(VoBwSQ}@=~kXEM;2O?eYO63Pyf2yy!3gB{HtDj zpUc1S#QM3t!IArKm3qGYyZz+ZEVI2!HtXE{JN?iXt*~voyk5q~HEUh!U4Az6nb+p< z*lDVlwasqMpUxQWnDr>V{;G=f@@4kkKXbkvp7OdY=jWCWX+KN$msr0$Z{mNk@NM~z zsqKN&u^IQIF)5Bl(gmX#k*Jt_I4BAM3Q2RXd$4dR% z_s)LbI?ICjzWA&A>DuSdf1Mllvo308y6;tAulJ9aR@rZ@k2;=se@AQj&L3PK&O5~v z+39R<^)8$y9bP{*K6ic3=6b1+SqV$++4b|SUanD7U2X9>sOAUH`YBlfnVI`pqSo`Q zsam{M{+ZG0Pp3_$*|UF)E>A79*W0{`f6}wdxA>QSlKs2k=B~3cX6DNhwa=?NuDJA5 zMSA(;Khtu-gJMNXnOITuxah;yWVgWRL%LHQ=69j^Y#~=3B8l^;^(G5ds}F? z^oMMm^13Z+)NGf|SYKbf=F6R5zy1ntwbkV^I@88G%YMUr?~l#ztjYv26r`_tds7kxQ@>F%dSyZ-+|Yo2SxmRMb` z;e5I?`(h>UvAVU7AKE>B{&@L=0)IZ+caJ}nFPc2_zr*&^Vh3g)&kb1cOm_R%Jq4dC zQ`Twk?W*>ZI{oe1_1V*6@@^Unuae}yd+>aC*15a));$BY5mSGz{*_poX(cy*^`yI< zymP@ml&##M# z%lDk+@7~57UGo3m&TA9?vWEWzt!qm0hc(B%Hiwk*F>ms12SxXm zG)UPo^Mrgn9?S6Vyp%)-sH^^9pWEGf(1I95d(33#8$*we$=+FUK~-+9FT-p5MOW7B z@yh=6+56Rgz5P>ipZ?P_-Ff)p*J<-^e(2y|z;>Qhb87wn4V&#BtACkuzjW>23xfau zI^VBc@c7T$^ONfGN325_9zI6Tlrb(ZF-v>4CVq7^+ zO&6Q_ar3!NlAuE`b3)Y3YfmQbS@&+m_I;ddd)LOFyc6KwCd=LM>)wu6zF%J0hQ4b5 zQgf;5-is9`fAgQN-()uZ!qne;KkbovezS1Znk$Azzklrysoqw<>9)DG;_Ycyk5$Ml zd+P1m-M#c9d*6TQTYscK7WS=MVOn?m_X$p~p7=3_TA1NiNo! zIag!NHhB~K8OhU%PKZTsP4eGc+qX|hdduoB>%M*dT>QWFW5G+kiZ3qPqRS^o?_OO} zH{+0_bxn$#RqdM<-?u1UzyAOD)#`J$nqPghWzQdE9~vF~oJ32_r|RK86;q3gVQ-`RiWzb9?EH23YQlf{zu@7lj?IuB}rdM$mO zy!6M-c+-=|R^IHC-R_n4{r$7GQ@{STdHT(J>BHltuL}kLWTs`woc9g?>VEfA_{`_e zq;}}fFInFI>Oc2ZHR1TW`+F?vn?OBv9p8N8+o!%ye3PKfy8g|gAA6?fzJK;R$`{;I zf4_O^^XI?(R@d0CJ+pb)E48KHKL+icf6IRD;|=+D4sDL9Vf~S=sAnlZ&GF$I>9{}d zBDjL&_lNGeu-0Z{SOpKp9~{_?edt9pccK3~hznR=d$|JT~b4}34@<%WN+OkR$!x_Euy)Ap(F_c7m} zF0Lxms~U3Zf*tX z|M>5VQ>4QS&tIADA3gEe-*Rz&@QN>X)~o(Re3!TUmHsmCr^Ec?^_*cR|K6VzzWkzh&|Ljm zoA3Tr(9Sx0k9N6j-f7&yK*n&{k+ef-~V;JzPskvf-3Fv(qErmj?#L(W!vhs78YyUxW8fZ?mYTrx_sZ4 zv#G1H6AI#Pttl-2A2x5x@>d@Pp4|U#cRQSj+ToujJA>YHU#=A&H_m5dJNAi~`r+n! z4T;}By3Y3Nr|n<0Z{MGir2RktDKaoL%>AeLzxdy;Rr`*WZ2VQnl=%8v=z+68mVP?@ zr}n-A1H*y8fA8vj>WrGcX1adi`}()nO|uvn9z5Gu$Y`T~RcrdzwND>g^}AWEVnw&F+x2}-o%w!~)kYOj zYo58ixE6l(IWq%8LH+;OxeV>r&&!^EH~s9qnt_4g#^X(_AD&fdYHavyynX(XWzx%^ zTzl7N!N9=a{~bKw6RmOVzSf*|QQn@{YB<9_Ts;;1@Z6IJk2g&Xos#9VKPJoAset{f z;C-gKy>FryFfuS$9Qm|rjrJA>1_tY&JfM@O;vb&B$|2!Yst)(G1^OpuJ?x}k5@%;Jo!uF+e`d0t&jJkWi?AL>KZ)S!A z%YQ*m1AM~y_x1J#PxjoK;k|GBmb`e@J3aP)<6bR!z4V$~^^r+0clO83+HJo3{`CE4 z{{`Iq@cbJ;14GSb{aT)&zf5U6f8|Cg$3FeDKdGkY)ZgmQpk>-q{_M4CvOo# zO{v*=5B(Td~qdVhZB*|Lz-_iL}sapYU-n(%AVmRAp2Z(h#}6E|71Y~$3oTD59>G&iQs zOr2oybBDdQGzSC2o%^Zb4VP0-KHILBx;|?e_YzCL0@0Gvxy76R)R}spTKfH#{_N=T zw~=2be*fZ`s=M0WR)&W2-yo6C@TE2~Flxs$?+usSmhR_0mA*f=a&uQu@6GoIyFRbK8Fxzk-?gVf z&oU=B>z_T9b!z{!)4Q5-Hc#F5?#tN+H~(nIgN|<6>>lIG%D}KgdOjl?1H%LD2nPEz zuYUT2(f|V2%sVaDJmoLP>jTGMt*HyGQu2HKcuLds3Nbzgh68i|MlsCa*^<3>}!Av6{YR$BLKX)b<&R%<0Ns@u# z!Ol8c_8)Jzu-?mR-TAZN?yU2F)0$bHKEFS0UT=t`{a;apf6-Vqd$i@7O+@8_uLRn4 z2;2K*{#^a$+k=lDmplJH6FdUSOn+nlJ%92w^!1`Vz5ky^J=wZb7#JAxp6*|*^)BwO-~Q=ym%a`D`RJ|i`o;I`-+rIZv+f)d1H*zB@5?40 zzqQAv`cv)Eo4=P%pT0hPzgPT>+`u{Y1>EHYr_0UeFRNl?fD}Rb_S|3fGjGWqkG%V2 zk55{uc4_v!mDlZq6MdtjHZC_WO?S=>o4dA9borOhX?wr#cjIMXsM*=Qo?*IOarKr< z=E+NcF1f$$>fH1_LAhO#zjBJDjQ3uNnK|jI4gO4E>AS1nftiNjFf7mQ6p7q9i0|P_D?A`B~Dz+|I_4C>DzNz<~ZF>9c z^{!cekjkv*fBnC4clC?auP*pA^Xja(H}fZF{SA9!aei4{wA#$Nn?*8;JDPuWT@H4^s__N1s_WRfwEY7aiKCu4!>pxfXYnLuff5>+J#Myf~R^hv9 zJTt2`&qddMy0>SiDD$SnwR!sQZ`U4NS(KpLzDs2(_xIn^*Zh6-{r)dOZU$4m-K@L5 z*49Sa?Jk%*Y5U1Hzf+GZ-T(d0-1_Hwr#WlB249|EXy(!W)~$K@JZJi{<0n288g=IzzqHo- z_T>I{pRVJT+5gr){e7(RrOKU>Ic0OEhZ$PmGW{U-YhV9|kYkdia`%eme$Pv_X9(Z< z!+S%W*sJ(UTWtG`_n$tOe|v3sOVr;#zjbaFrA^rTK6_^Ruhmz-UD8ciI^X-5(Q1pO zKOBuWKaKvZ^Y_jy|Ll3E@2z+_|5Vqj--+qF&5R>W*Dki-+#3D;aoU`OKUaLFnBO+d zUq5l0OleHXbpP|}g)4GS{*sfJT5lj{=Dc)2SKsB8@Ae2jv1E_`XR{&JH|leK@8w^g zKh$mb#rl9nJf1P`oO+$#pJ@}{?0)lU|M9hr-o-D19+q!kviaMaZx$ip`;y;8CbQiB z{(f1x{JG@!3*uhgh~IeCY2(+{rQxPegFjE7GV5*ozrC3iqA&g4R8)Si&|drH)#`UE zOiZ`gzs`PhV$b_M8~1nn+1>xvySndt_h02QWBJwb41M4BL@)Th-|+sc*s?cUo6fr3 zU2=7{*7r{no}DQ^9>_R*mEF(Q#fQTBZlC>IacAqMSth#{^F}iJpSP3?Z(CklVlPv8 z@5PGmFLp&85B>i8sNm@b?(%{RHm9%KvftSKX8MfhO{QA!rJsB@>75+dW8U}SPT|v9 z$p+)Q<&1k~%}BE^7s+|QI`!TSspolmGq17tom+1G?^CPzIobWW^|4PsmA#e8pZ!y| z`up*-KQ=#J^vQYN&5vT=oonaV{x+QL|JOq1>beCReSaJBZ8iS?pe86dzd$3j?|;yW z9rsNB&*E5ZvGj66>YrtwgSLI!SH}8YdEef7O|dvR5&#ofH8JPZsUT*UPoroX;) ziL0#tQc?NN1#@4Yt#h)7wU?i$&cMLnzPp0)&cZD}?);hbe9MgLg^Uag`;H&4W4rN4 zjDewH>2JM;&GYy4?*C~S@g>dvzH~@z7c&FH0q4I}d>?LSa__&|wdL8vU8~!_v)$f& z`tFezD_8ngH0(gNR7jVjr%);oIlWpZ`7lS`|C{WP4?K&aKs;(_eP&64|eO z;SF$Syhnz_G?u6uXBz; zQs+${-_aCdQ1}{uJiD&0?w;_PpY4r4x6YZ=e1B_r{?>Hwn@^9;dV4w`^YycfQ}woN zD$LsSHtY3zg|BY1vN!8E=FCq&`|s?v-CK;?pJz#(WMGJY`u-}XOF&Q;?&(G; znmb}kU$zU${J*VlvhCJzHp%MB%`fvMmp*=R<}njPgYB&RM!)=dHhEuX>!mjT4!JzF zvaI^$wNsbQ&-OBp4!hTKv#L8k{$Hlr=`Yjl`@7`tAF?_kv#n(HXI1a+UmvHv{h#wt z_{`PNXO?CE(~dv?lK=dg`@hH+erf_wEM+TWSbB@*8#6dePTcO0{ycI0A>O5?+LJHc z*%+Nn?z4K7ytcmi^C;iim)SDdE89OQcc!jrZhG%ics?)YR zA}?l@r?(&RDk$9T{4`s;|8>xZhqCvo?rqzfU%g9^VaKTrtOb9$*7_gcdh~-n5r?>)Nwz^KakVF3Yf^|5@~c z@bU^j{~62VwRV^mo^blBnZ5AgBQ^Q**{_{<|JuQqxFhiR*H32E3=CO!z8fESzT@_$ z#B=F0BMidjrv88WcSF|W%#&ZP-rief`Q^N-`VN)@wU@G$-fT%~}33H9v3neY~dS z`|`!(q~e&=^M^sZ9uFL^I>icV6=G!22K~#QC6+k6PIfvcZm;%yZ|ZsDaK5hnt5m1e za(KO-9B3uCdUN{!cbWMDx&J3DhoO+(;cJNmR zbs3%2pWm)}b-J2?!Qy^BbMo2Xt~ZNa+kNj(2YZAWeni#xbMJkAZQs+q zHA{E@@cRDm?V9qwuwCWr&d>Ytev)&Zf#3VH=e|YnG5mWqV)eJaRofru{kc@NFKt6< z|82#m%{I}$7k*lIYvb``_j$pUbM%8xJ&S*}4o?(@lK`zxlz z8Ql(kzh$fZ@;m2F)$yfH^|`R_^0{h;1D0<0m~4;OJfE>V*y8n?v73n&eHpX*}ng%_4Tb-{03o@~-XsvG^Rr(mb2Q!qP84RkA~RZ~oBlYm$?xYZm@angbN=-1jh7$I-|%Y1$|S${FQ#02_I~~LuX2qW%`V&J_Q&7m z|JrwMv;Mz}?n&-{`X*nRS$}lLDmR9PN!)pj`#x`}p7QiodO@!ml^J-=Eg( z{Y6&lt^WM+swQsbm#Bx=W&bEEBPtLX7HrwYEOy*`NSZJSoSogZt!S=0>b{>7Dy7YG2 z<);CE*%iVKFZ<`O+qQm{_wB7~tfY(6|NLTGR_ePmuIsn%@7uG~uB!+?*)u8jjp zrf2PcY{)b7$gG(1$p7iN^JZC7-E96{ez;|4yjSJ6Z_b*2sq?0WmOP)?8*KHi>4*FF z?OX4iRXAOxJ=uTtiukWf7ydeSUPO-drozX%GshxJLt@^iJv?i}$WXQ86idvzYCo5| zx_{^CF)`R3Ydp`$Rx$1Up1)hy@4bIBoZ-M_-hHf9`>#dMVq`1g;@TlEfylxZGxOIm zG3>kf<2*z9e3inc@4?ggdhNHGzdCncc=OMSc~93z$;+1}+?&6&WRHyPy#C_D{hfS& zBHjmo^EOy_sh9uLlz;3Dd9U|B6x5$NcgKQ@S@YQU`<^^gac|x}ul)X?syQ!eEPr0=a)+K zu9XWhGyG6#p3gidR(9(>p-8R$m8bK*mEAd2^*Fk6^LOFAd*M5)uC9o7Zmyg0-t(St zedNUtlAn$Cp86ZQd9T{ZYjx5>_BZwk^*>LjN&CDe=X%=ZsQkkE>lXKyM_I*PD!cl8 zXYrr>clWP-_PO@qUw&8cFYVC#m1{&&eoi{u?-BAWUMs$G-g?RZ3>-UNWnWDbGYjgfD zf1A~H-_Y*&v#0har!yR_Wb>Z;_>A^UliNXIzLk6@?SDl3ysms^_scCLURS&L`c}0G zq4Eop|1dM$&-tKxL3Qos373}aENv>i^JaO8=KDD{=Vo4=YhS+R{(JVX|L6Tk7H62M z^*QEg@vR@6*A6V5&hr26ojCm$+r7U%4qa#4|91U~e2`IZ662e`R_%>?p5`&WHmUpVRnI?;G3|MMbxFEC6GP3a&Ef~vetx|3&!^UdceaSsZ@!m$Mp*A(Pn0@O zr?AV8EXE7F?(crwU*tFM^he7ht@ULut@*bci+tNX%l`Wt%kwp}Q|-UR`rM1xXKy}_EE&06xuBYmT-U!7(1bT+L$d1_wW4IiV~=U<&pi+Y^0eCpKrsLiL; zS8UNd_w3s#{>ypW%q0Tve$?L1KHtIbx7O|U)$v!itPUx?v+nG4ldsP1^JE|IfB7TV z_WYD7pDcgXNc7x(_xVPe-QvF2KNie5b^NH-|Faeh3_P26X%+p~7VY<#WNi>~?)w+J z`l^2n2ihxdq&Hahd1`H(b-I~>p&(s3zcK9@n~mM!6~Di|{QSlEW*SHxN4x~%}*S%nUeSY<{vj->VFfuUwD4PFGLS=eABLl;UU)E+ZRbNXh z(?7kkT=Y@cXjAL->lNPFvDpa>3=Bca>lu!}zErt$cZ|?}-^XIQb&VBxT{%YqR zf6e)Up7+-7b+_KNm-+kY2^I_t9}fPLmVRf;{eRxhAFsdevTD`3zuA4>QP9!U=f0FD ztog3<=WEqo{aLoDg+CJe-hI3FWB%p$8)t&$0NI zarNg92fn?lto*y9_E%~d1B1o!6VVHnf7sly^k(I*+VkvE&Dy0?f2PQOk34%-_VL%f zCEKItuHQN{_s;qE_orPuZ2EPY*rlnz%QGMBU}a#K#-`u!`0Ig?jR#K0b-f9YTwY{p zn00kxukrecR$7~Q)@@%tKf8&4W%(P3;(BhA+I!Qvmizy)x?lOWoIU*OXZH8;3=9<$ z{G%D<_ui2bt?%2+Be7;;+x6dxX17Cco)5p8{hx{90H@zCu@~Dfv6pPVe`8C{&sW{+ zH`y=0xT&zI>hZFz+ZNgRUH-P?*r_;KY5N!Roq6A!|KYt#>+$wyJAb`BS2+6^XaF2* zqOdsl;JAYBSKGd)x0dgWiTHi~ynpS|d6mX@&i?*iSY7kgL6d=DNArI-)>-Mh)?e5D zU2*T4#q=GkzFph5X`RIDe}D7)nHdh$)vxz!I2cp;n6Jlyfg$h32i6aJzz%1v^>n}<^-+0=e72&*3@{hI8)2parfq3`d_&BaDVsNkj=Sg?rqwre*VqD z8&dKN3~kciBpk_j7kvY_HjO z_VVv~aZ` z-0hA}zC;(8@87c0=)C{eDgW}%F8{q_#hLU|rez89mWChw`CCYbfnmqiSq>x@E_)-2It3KNfFz_Hjb&-+ljPZu_-l>z_^c{w5pcxn}=-y4ve) zR&Ks#-RhwIOK;~}w=q6Qj$mMx$tVr|Fj?mMifg403SS?4u&QW#zYGt<2a)>qehgJh zzKb2(ZZYjt`g*CQg}c<(6z=`{bNZw^I`Lkby7#Z-s~^9alfOZJed+3yV^#M>Yv!94 z^nT}<^FDo@O~kW9r>~b;@4C;>Fhl!*&80nWR_-}!_``CCb>aWo&ZRcq_WAb~?Yw32 zYTET{b+7w^Blm4F?1;bBFaGPz)%S%5qpQ~xneNuH`Lpbc*HW+NHFiZ?7!Iu6!E~m4 z<@|WFv;EQgWmYK9f9f3;zUWnO?bTRD@9pW{Y@2_cs%eU9de6IRe^dFwH&tpGA!WZE zcfJij^>ft^-`cG)%-8o6BzQO1zP-Gkp@5G&Vc*4PYqo!FuD8CfmA}v;P>oZq%UYpC$u%SJA!Nb=f_w;L{{ZIZs zqf&nD(%(-%T5sOI`&&!u(F^POuWwg>UdYWLe}+lo-}6=eY<-(%{@>)V!6y4{d(h9o z!cDAf&+6wCUpwIZsGMcxe#=LEtM3(4J=S(i{9Y`6UB%)e=CEY7X^|M=Uo-yiwf^#3=V=b3LN_iFWwf3^Q3 z14_&8?x?)O`m|j}ztHX@x3>KSITLmUhJVlP!ha_DpPa0pzJQ70{sG+!41esi6Br(B z-pM-4J!==|PbdGA!r-I{A=-XiS- zwmX~;UiwC;eCyum`&uQ-`z)Tds#`3a+`sNo-s2~EKWk=usj;~BNoCHweDCKQujiYJ zN~$v)aORC>Sbq9$;KcncyBYHzz1X|qKflA;dS;__dLr-F|EiAjQhj~=@ZGk9m)E~# zX5csdA@*YF<8}E*q`j}(dX@h@dRzN(%6ns;PbP1z{c5-~E@wv{zx_=2@9dAy#nbW) zZQs_t$?2``TWoRV#*^tEoB#EEe>`DbU-KUO(2bJz8W*NKnIK&d_I2I1C4a@@c#UD?&rIwZdL|waq!)C@ae%fr_cWJ`w;j4&!6ANHvI|=ujDNM zd0Wl*VbLy}h;cf$HO|6MqlKJBc$g%*njL^h53Q z-Ag6^U%b6@q=@}$&&j!~FJE1H?&@>z@5k%AcFITn{;#&qY90UDEopBo7cw&3e|G*x z!Rej(zZS0l@;UAF|2#dRu!GAF@$3#c{p#`b%%ATpmey!(zpQJ$Yu2&Q51q&RK2DQW z@%`BRI8|$l`GrFH3bXld+^0wPFTVD8?^e#6KV+ZJ-)CbU%=J%Z!}It0nG=F0Utab4 z{QRYk`z-UCKY~i-pMCpY?J(Zgy@-K9{!Ds9!QO^Oy8*mt429E9jx{r<$$@Kb`wOOkqDJGwXTlI#Kkw+tydV25KcT?V+n`Q3Ts^@k1+@{~z#nqbg zuX=BiZnp8ZEPpO}J$in6s{Qp0+xaF(ZL0npd3w3m@#l{Dm(_SW??3GL%gS&e_epWX z=E*ZIwdh!P@|+3}i;D6#@m)JhYLoH*m)}_oXV@P9nUlBP=UHb~S=F~+x1YW9UVOFZ z`LDM(Yc}~xl*aVjx;OE8n!UNH%8AYSU#rjkxTzzbFS&33G~eibdmh_tyLlsM-u$XK zCWdz}d$bSu-YZ@_zy7|%W=riXUHKE|3jG6iF&JshUwx~zZ`sYyyH|U^KHvAl`gpp# z-RdfD?#(;yeFGY-H zD(g(O=I`E`y=L)xS>8_jlp3~!*00X)TNU!}!k_hDJ3b0qR9V#Cc*n*tgYU1<8r#!r zzpJkKrLgwt%(L0Ek5^uJ^>o!o%U2e^PCS0?_?VrcA+Rrsq1=DU^w%3_S(ay4+BrXc zwWzw%UhALZ7O&`0tbMAgmJhy+woshd1pUOXfEX~1i=Tzf-#y;EHOP{~|c{tfZZvN4KObqLcK3N`E zJL{eQzJ<%5pHES*o8VoRn!VJ0di@0cJSk|p$3@v(o_|gJ&!0a_q~q65f4l8=-tM>C z>JNV_QO2c#dg3-W=NGT~`Sa(@`ntVw&qH>tDc^i4wQcjy(4`iRf4;Aub~`+D$-&D3 z%)fQdrf21c*VbQCDXz0?2e0O~lLcL}crr!#{rYm#Ih+3bu3jO3ezxl7$Ce$JZ(Ta| zW2*jr$+aR6cRXG?<^KUe=_|W0?VY~+{D1bj_xmn?|5xhr_V@0*6DJGOjWX-+DT**G z{&W4~toifjf48jtxA4;IuU7S6Z-=~mz1`wmQQwYN?OUR!IZo5p%#D8*eEY$sH+fo5 z@9)~HKlAU`ZO@7`=2Y05J-xgzv#&H`@9JBZujZ%zPf;%U(X;be=<)ZTWWJV_)a!k( zzFfIGvpVMemft%p>aQIATb5zxd%VugWI z?xd}*|8Kfk`uUrzl~2FzOZj$v_ssLJ)*HJY&%C>T@vqIH+11+2W>>9yEe!hY7U!J^4Z7%q={fzbet@UExrtm-7;^(uu-YDP8h;R2Sqp*D&s(*)m z&CApGWjx<`+2r(k{b}Dm8|}?m_4)qtP1br>OP+pSm2AJZJTKXR?{&HF2ltk1h4&_= zPYyipeJ#82sKxKqC6b%7u7CJ^*mujj;}3q!owV=Pe z(l4Jcx_=2iCt+RgyX#)H*Wq%mS&@}-b9eoEtGwI1`p>fLJ+^LNZ{PKM7T(*wb_Z+j^40IR2wUw`u6U{Hdwcz=?TcSMe)Q$-{biq++0WkyD4(q- z|M2da-E+12?c%<@ez*O1$tR8HTV8zrm0RX{`5EJ$$lrJU_!y@AF*lvJ_4&-aU(Ag8 zz3S4XuDguR9e;EG^13J6uWd43{dar5PdE1rzbfA^(c6#TjV%70)BpN>ejd1lL})W80=`c>}R|BD~zd^?YL6e{%Kx9KN-jXY}_Rj(Ydvaq5)aU!!}4f2H5lJ^d>0lI7__q1%-)?3{O&Xb0W= zd$pX;|1m>BpS}It`wwmA?|AM1>*baIEUV3@hVIS$wDgnXoU3>AqU*HoE6>{ZGj;Nr ze_Ek4>%WCBt;*hZ{IAUNUCZw!{9aM@`Z3Gz^2h}Ly{3;Vz1Tv(O-@_;R#$a1*NnHl zmjXIh_x(1OR-YTNk1O8nc8SK-IqX@p47B{ru6%f`dSn0Ew^>>FXHOc`zLvDR=cWF0 zR-MMx*}C%b?l*O3|6JZW``G6d-@l*z5xjG6@Vd#(=Es93oca^I^s`%L{n5`WOy-~c z%g4YV|L9!!_HRF~luey;;a>jhAO?%$zbp?h9C#Wd#L}SrXL~G5gJ4^I)F(B&t+A^2 zuf-vkgAau2@BNSYG-HuwaOn6n!jK&+xnAb{`T_bpR6}=?Ruoon`{$%-W_(S>7#XQs1a#xwZcV51`cX8Nz z_ZHqq)6c0NtX%e`e9PJW>viAObiH)^_3u^SD=vlxY1`v<^3}Mv6=hXOKtvMe!J;R4E_%-5BxVi@7q6P(z1h( zqct9TyB$3L`#r1f+0*=U*H6DS_1cb|dreQK_OIQwv95mYwsiA%nc)KIn`5UIdVT-Q z{&$Zt{4S09nAieM^70zp#&olr1@cI38ughN}o=(WfIvNxH(k9qSDXM?UsphIH71>)WZPqDm?@MQB z2-Mrhv}exzzb*IMCi!XC7u|1~?Ds?Kw7&T{`}}G0PtP2ECHU%lvipeOE zId{dt;QYnqOBVaR-hQ^~a`sW##OJ+BznNurU7r45qhI2GZS|6nf0NYYVV7u#-)G`A zExR}Wr^Vu1)lU0uQ}>_A-t%s{|NPwtes6os&F~}bdo06xwKdky*ZT)%J###3pLlI| z@zV`C6%*cu9$vil-r2v_tM;;gjo$X>K%mJg`~Gc_`QM7S9sD-=bB-+Za+?LW=YO|9 zee!r_xMi5}yf??KFaMsf`RV51lh;1IT2sEbt(i1)694t1g<8Vi zkEcAke&x2w(fr)&prL2^w8t#f+t%Mpun)`AKbnd4_KfMF>C@AvKCUz4q@SR= z$-L=)?2kXKzyIp=`Yg+J$D@qy_pV*dI){TJ`H<2Lwashe3+ z|JUyOWAp87E;~cmzqq*v82lq&mE50oz!RmI-?rzdpQn&fo7%dGC%Z=jHfG z@7Niim3MO8`l?@d&pXy%doua%j^(kAbIz899@DJtTkve!-F;KcKKuOMzf8WY@BHOs z^}%xqx)zr@Vm+FVt5tBGHxUfe3B zdva4e#ceV-UUDkg+;!G9HX#4y*4dS5-J##y&aQ82@&0>xSNyjx(E-a=-dnlh{^L@Q z%*W5Bo%-?hdAn_4)bZ%o3AgR%HAC*2s;DlITWxvN^zEr%@O!2TjJAJaZOAYCDEi>( zk*Df^!X}k05}rQ4=<^0mbK$6CoR8k`-?O=A=NiM^wzs=9&3Dh$QrmGeyi`JT`TBdt z>T5pMdHznUXge6so&~ybN}B6f;?h0~)1Tk}Ud`Nm?<%eq7S1|iTO8wcu+DO= zJbb6}8u|9Z55FvGfA)XsSbA|q=$+Qp2c3`K{x_YOA^zzm{e!>!)?e4QzOJA9esz+^ zoY_0RNu4|J_Y((dHs+82%eL?B45JQaJwX@5)j_YWYRq09__uP)n}1wf{!go4 z`di;k-7a5vj~je})enaK`&eGT-Ljfx^~~eXn3jd?OG~>WxcnLO0pGvZLh{SXBtitI z+`pVZyE5(dDjBEMhi=wvx_tSIYIWHD(+aYGr}-{ZYpmEmUFvF7{w-J8$M(|8SH_zD zyz-^~b>T&+{igr>YRo>zgvs{&pY^A?IotUBwa>?1ZMQxS-p$+`{Qd5_E@p;;wl`A+ zrn{e8I6wdByA{jVGc+9E`Cj+JoV3!&GdcGK?l zMO#dGR|P#>UY?U`pTjn@UQf3C=5vNpd%jmDYkzOQGJo+t!B;Onnx)tQp`M^!YP(iG=LZ+Aq0(*}bz*%-`}S1?>*`&w6_H-)}GaWIwrHUj4Xa>!s6j z;>psrN@NZtQ?}lG%doCF2-`QhP6R`Kn2cD_!9@BRxiwDXZ zGuSOtWMG*8wukkDP5Ztlx6U2#DqnXqD*x-79jet|Z}mm*zAV13&M*JsoypJTZvH+$ zUHb9v`x=;BTKG@dPvi<1L3_RQNX6-+>7pXtbS~y;wCC2u(u<1;AY3lofegCCJ zPEX71-Td=b=*B*q**eVA#HP)jEBVEFWo-4Y&6_sL{@uCh=J~aU*Gx$_)C=rI@1L7A&Hwoh)52wI zXa3SU_o4Igih$YE4eu8}+Nt~db+2+seB$d3>J_)Te(f*s3EjLcMl9~1;)2@;{u(Xm zjyli0v}*HPE;G5k_1?d=eNSEzVR#_ZuHW#!^6x^;$-kG}O^;*tch}qVUF7wIy)D0E zR`*#YCYELVxt#Ouw(aqg$G_M!9C-X^d+d|lws~J?&wYJ<`lMDnH9%MAPdTle=}C+pj{Z_U5C?Yg}C-O6d3 z-b(PB9yCAwUb21Z-y0uoBZ3n*_*#Dp&$g>A-1L)~fuW?Rl9z$u9r&8X=7=v$pdB|m ztr&j@sMqwNWDn9fc~8%uKkxrdeEs#;PeK?N7#>)FcE2z%FwA-QpW(;0U>j-S>b)Q% NJzf1=);T3K0RShU$EyGU literal 0 HcmV?d00001 diff --git a/scripts/cosmic/metal-desktop-image.sh b/scripts/cosmic/metal-desktop-image.sh new file mode 100755 index 00000000..de96ce49 --- /dev/null +++ b/scripts/cosmic/metal-desktop-image.sh @@ -0,0 +1,151 @@ +#!/usr/bin/env bash +# metal-desktop-image.sh — imagen de disco EFI del escritorio COSMIC para METAL REAL, con +# **aceleración de hardware Intel (iris)**. Hermano de scripts/kde/metal-desktop-image-dual.sh, pero +# con una diferencia de fondo que es el motivo de existir. +# +# ── POR QUÉ ESTA IMAGEN ES HW-ACCEL Y LA DE KDE ES SOFTWARE ───────────────────────────────────── +# La de KDE va por `mesa-llvmpipe` a propósito: tenía que aguantar DOS máquinas (Intel y una NVIDIA +# Pascal) y la mesa HW de nouveau sólo existe como binario Alpine, o sea rompiendo soberanía. +# +# Acá el objetivo es otro y por eso la decisión se invierte: **cerrar el frente de ScreenCast**. El +# diagnóstico del 2026-08-05 (ver el runbook) midió que la cadena entera del portal funciona —el nodo +# `cosmic-screencast` existe en el grafo de pipewire— y que lo que falla es el COMPOSITOR en una +# llamada EGL, 8 ms antes de que el stream quede en `Paused`, porque en QEMU mesa es `kms_swrast`: +# software, **sin exportación dmabuf**. Un stream de vídeo continuo la necesita; una captura de una +# sola toma no (por eso `cosmic-screenshot` sí anda, va por shm). +# +# El `mesa` del corpus se construye con `-Dgallium-drivers=iris` y **ya está en el rootfs de COSMIC** +# (`usr/lib/dri/iris_dri.so`). En QEMU nunca se usaba; en un TigerLake es el driver correcto y trae +# dmabuf de verdad. O sea que este viaje no es «lo mismo pero en metal»: es la única forma de saber si +# ScreenCast está bien. +# +# ⚠ POR ESO NO SE INYECTA llvmpipe ACÁ. Mezclarlos no es aditivo: llvmpipe trae su propio +# `libgbm`/`libEGL`/`libgallium` y sobrescribirlos DESACTIVA iris. Si esta máquina no tuviera Intel, +# la imagen correcta sería la de KDE, no ésta con un parche. +# +# ── LO QUE **NO** HACE FALTA INYECTAR, Y ES MEDIBLE ───────────────────────────────────────────── +# La imagen de KDE inyecta `libLLVM.so.18`, `libgcc_s.so.1` y `libstdc++.so.6` porque el JIT de +# llvmpipe los NEEDea. Acá NO: `iris_dri.so` pide sólo `libglapi`, `libdrm`, `libz`, `libzstd` y +# `libc` —mesa va con `-Dllvm=disabled`— y `cosmic-comp` sólo `libdisplay-info`, `libgbm`, `libseat`, +# `libudev`, `libinput`, `libpixman`, `libxkbcommon` y `libc`. **Cero C++ y cero libgcc**: la imagen +# COSMIC de metal no arrastra un solo binario ajeno de Alpine. Verificado con clausura ELF completa +# del rootfs: 42 raíces de runtime, 0 con NEEDED sin proveedor. +# +# work/metal-rootfs base: arje-zero PID1 + busybox + firmware i915 (estática ⇒ inyectar musl) +# work/cosmic-rootfs COSMIC runtime-completo (89 recetas: compositor, apps, portal, pipewire, +# wireplumber, portal-probe) — ya trae iris_dri.so +# + kernel linux-metal-dual (i915 builtin) +# → work/hammer-cosmic-metal.img +# +# Uso: scripts/cosmic/metal-desktop-image.sh +set -euo pipefail +ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT" + +BASE="${BASE:-work/metal-rootfs}" +COSMIC="${COSMIC:-work/cosmic-rootfs}" +KERNEL="${KERNEL:-$(ls -dt store/*-linux-metal-dual/boot/bzImage 2>/dev/null | head -1)}" +MERGED="${MERGED:-work/cosmic-metal-rootfs}" +IMG="${IMG:-work/hammer-cosmic-metal.img}" + +for x in "$BASE" "$COSMIC"; do [ -d "$x" ] || { echo "falta $x (corré scripts/cosmic/hydrate-cosmic.sh)" >&2; exit 1; }; done +[ -n "$KERNEL" ] && [ -r "$KERNEL" ] || { echo "falta linux-metal-dual (hammer build recipes/linux-metal-dual.toml)" >&2; exit 1; } + +echo "==> fundiendo rootfs por hardlinks (base metal + COSMIC)" +rm -rf "$MERGED" +cp -al "$BASE" "$MERGED" +cp -al --remove-destination "$COSMIC"/. "$MERGED"/ + +. "$ROOT/scripts/lib/pid1-desde-store.sh" +inyectar_pid1 "$MERGED" "$BASE" + +# El driver HW tiene que estar SÍ O SÍ: si no está, esta imagen no tiene razón de ser y es mejor +# fallar acá que descubrirlo con el USB en la mano frente a una pantalla negra. +[ -r "$MERGED/usr/lib/dri/iris_dri.so" ] || { echo " ✗ falta iris_dri.so — sin GPU Intel esta imagen no sirve" >&2; exit 1; } +echo "==> GL por HARDWARE: $(ls "$MERGED"/usr/lib/dri/ | tr '\n' ' ')" + +echo "==> inyectando musl (loader + libc) — COSMIC es dinámico, la base metal es estática" +MUSL="${MUSL:-/usr/lib/musl/lib/libc.so}" +[ -r "$MUSL" ] || { echo "no encuentro musl libc ($MUSL)" >&2; exit 1; } +mkdir -p "$MERGED/usr/lib/musl/lib" "$MERGED/lib" +cp -a "$MUSL" "$MERGED/usr/lib/musl/lib/libc.so" +ln -sf /usr/lib/musl/lib/libc.so "$MERGED/lib/ld-musl-x86_64.so.1" +ln -sf /usr/lib/musl/lib/libc.so "$MERGED/usr/lib/libc.so" + +# ── el arranque del escritorio ────────────────────────────────────────────────────────────────── +# Se instala EL MISMO script que se validó en QEMU, y no una variante: nada de lo que hace es +# específico del emulador. Levanta XDG_RUNTIME_DIR, seatd, el bus de sistema, el shim de logind, +# pipewire, wireplumber, el compositor y los clientes — todos pasos de escritorio, no de QEMU. Que +# corra el mismo fichero es lo que hace que «validado en QEMU» signifique algo para el metal. +echo "==> instalando /usr/bin/cosmic-start (el MISMO script validado en QEMU)" +install -Dm755 scripts/cosmic/cosmic-start-qemu.sh "$MERGED/usr/bin/cosmic-start" + +# ── getty en tty1: el prompt TIENE que salir por la PANTALLA ──────────────────────────────────── +# Lección del 1er viaje físico de KDE, que costó un USB quemado: el CMDLINE horneado es +# `console=tty0 console=ttyS0,115200 …` y el kernel hace /dev/console = la ÚLTIMA `console=` ⇒ ttyS0. +# La seed card de la base supervisa un solo getty, sobre `console` ⇒ en un metal sin puerto serie el +# shell nace INVISIBLE: la pantalla se congela en el último printk y parece que el arranque murió, +# cuando está vivo. Nunca se vio en QEMU porque siempre se validaba con `-nographic`, donde el serial +# ES la pantalla. +# +# Se arregla acá y no en el cmdline: un getty sobre tty1 no depende del cmdline (en metal siempre hay +# VT) y no obliga a re-sellar el kernel. El getty de `console` se conserva para debug por serie. +echo "==> añadiendo getty en tty1 (el prompt de `console` va al SERIAL, invisible en metal)" +cat > "$MERGED/usr/bin/console-login" <<'LOGIN' +#!/bin/sh +# arje-zero lanza los getty con envp VACÍO ⇒ sin PATH no se resuelve ni `cat` ni `cosmic-start`. +export PATH=/usr/bin:/bin:/usr/sbin:/sbin +export HOME=/root TERM=linux +[ -r /etc/motd ] && /bin/busybox cat /etc/motd +exec /bin/sh +LOGIN +chmod 0755 "$MERGED/usr/bin/console-login" +python3 - "$MERGED/ente/seed.card.json" <<'PY' +# OJO: $MERGED es un árbol de HARDLINKS a la base metal ⇒ escribir in-place mutaría también +# work/metal-rootfs (y toda otra imagen que comparta el inodo). Se escribe a un temporal y se +# os.replace ⇒ se reemplaza la ENTRADA de directorio, el inodo compartido queda intacto. +import json, sys, copy, os +p = sys.argv[1] +card = json.load(open(p)) +gen = card["genesis"] +gen[:] = [g for g in gen if g["label"] != "tty1-getty"] # idempotente +base = next(g for g in gen if g["label"] == "console-getty") +tty1 = copy.deepcopy(base) +tty1["id"] = "01HQAR53D4M2NBV8KZTYXFQA04" +tty1["label"] = "tty1-getty" +tty1["payload"]["Native"]["argv"] = ["getty", "-n", "-l", "/usr/bin/console-login", "38400", "tty1"] +gen.append(tty1) +json.dump(card, open(p + ".new", "w"), indent=2, sort_keys=True) +os.replace(p + ".new", p) +print(" ✓ genesis: " + ", ".join(g["label"] for g in gen)) +PY + +# `rm -f` antes del heredoc para ROMPER EL HARDLINK: `cat >` escribiría el inodo COMPARTIDO con +# work/metal-rootfs y le cambiaría el motd a todas las demás imágenes. +rm -f "$MERGED/etc/motd" +cat > "$MERGED/etc/motd" <<'MOTD' + + #-- hammer :: escritorio COSMIC (metal, Intel i915 + iris HW) --------------- + GL por HARDWARE (iris). Es la diferencia con la imagen de KDE, y el motivo + de este viaje: en QEMU mesa era software y ScreenCast no podía exportar + dmabuf. + + Arrancar el escritorio: cosmic-start + Probar el portal: portal-probe version + portal-probe screencast <-- LO QUE VINIMOS A VER + GPU detectada: ls /dev/dri ; dmesg | grep -iE 'i915|drm' + Logs si algo falla: /tmp/cosmic-session.log /tmp/pipewire.log + --------------------------------------------------------------------------- + +MOTD + +mkdir -p "$MERGED/root/.config" "$MERGED/root/.cache" "$MERGED/run/user/0" "$MERGED/tmp" +chmod 1777 "$MERGED/tmp" + +echo "==> rootfs fundido: $(du -sh "$MERGED" | cut -f1)" +need_mb=$(du -sm "$MERGED" | cut -f1) +ROOT_SIZE="${ROOT_SIZE:-$(( need_mb + 1536 ))}" +echo "==> ROOT_SIZE=${ROOT_SIZE} MiB · kernel: $(basename "$(dirname "$(dirname "$KERNEL")")")" + +export ROOTFS="$MERGED" IMG ROOT_SIZE KERNEL +export ESP_MB="${ESP_MB:-160}" STORE_SIZE="${STORE_SIZE:-512}" STATE_SIZE="${STATE_SIZE:-768}" +exec ./scripts/install-image-efi.sh