From 6ae8c789594e6925060401f8ac09cdfa5034632a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20Groniewsky?= Date: Mon, 13 Oct 2025 09:36:46 +0200 Subject: [PATCH] Switched the variable type of user defined flatpak packages to match the type of the user systemd services --- dist/decman-0.3.4-py3-none-any.whl | Bin 0 -> 51701 bytes example/my_module.py | 4 +- example/source.py | 7 +- src/decman/__init__.py | 6 +- src/decman/app.py | 66 ++++++++++++---- src/decman/config.py | 14 +++- src/decman/lib/__init__.py | 117 ++++++++++++++++++----------- 7 files changed, 144 insertions(+), 70 deletions(-) create mode 100644 dist/decman-0.3.4-py3-none-any.whl diff --git a/dist/decman-0.3.4-py3-none-any.whl b/dist/decman-0.3.4-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..4d1174ff6fda7b07e05497d0a79214487125411f GIT binary patch literal 51701 zcmY(qQ;;r96Rp{{ZQHiF+qP}nwr$(C&9`l9x2@go`OaL-Kj$K&BI+U|@}}xpxiS@H zK*7*}fPkQYR-0vY*iyAnWMF`Re6NKKT_LgYCaCm6|1{+S2)q4aVH~p@ObIRR9)>&%Puzlo7BE( z42_EU(sV46)OWr^pK)8yt9GkS;H}0v((qG{+H2}eq;`f7if~;EMFEBxGgfR{nR>!G zHEN?Rqy8N^uOZk^s}*5g*8vNHc^MM$LWP{2yptDozOAk^>Z8;gq`I$aD;ZsEZ=;4r zJC(f~jwejtZDI5HA~-eQYZlI}-+Y&;S=V9|ObU*kl*CudR>z0-w`mKdYE(k-T==Q3 zjrmjjN;Zd+=_~z2JDk|$Ms$d9@VwjDS=wN=Y*-4{^lME4KkN4jm{0Rnx*@G4FIc(O z%8)zZV1p*ce5FT|t?KXOqbC>TogiKA_Duz6>>#iyx`P@&077nHoc4jXNZ6mY9*)InFcH-mUw2u$su=88T z>yjH?m~H-YxzQ@^(@ZE@TIiUuTcY@4woz(-AvxEsn3Y(=ceAe@rua5QkV*$q<>E)8 z#a$dUVSW;Rop6#ZHnVn0-hrfXaTfbyvcpF=NX4-E?5nI>MLK~7l~3#0qbbv^SBkw*;E)f&;x%LdPhEzKrX zx*PDj9z49}#pWl1J6lEiUbg#aGrUiTqb+E@MeVw^lbT%Lmb|xPY600dCyrJj!K*gY zL@QFdb~j@OQ!NgirN998a6fJ=Ncmk@@2{4U9KB#hf~9L`p;4{4Uy+tU+5+H-aG|bH z4FfpYvf;l;P-ZZrm_o?MqaI=+;!$bza6vKDs@1YmKuz@!`?U4D^_77Y1nlK$MU22r zV$TDv;#x#cl0t;~it@B;)so8lt954n6JDSrj8wMqa)C7D4S{hC>_(oOHM{G-n%*G( z)`Vfxo)=hNWb`XT6WY?Y(CvZ#Fi`!60l%+0qR0mXp^67&kZxd4iEd+PKfZsyBRKe3 zfm^@wO+q1iMF`04bm|Qmt<*Q2`#KAOmCIWl=N(F;LK9)ohZd%Wt-L15C|q`&CpZZZ zb`suB1IA1ld;`aK$H5r<0|);*AZ!<@AD;RG2zaz3wtHzo(~&8ztfYVtLjkiwScqy1 zO1|RYBS_lnrk$9RiV8XwK8M&OK!(GNXdQV)L(t3XMvn~_dQWd86dULW`S;%Oie&5v zn{DZ#cL$sshKjUc)ZbJxEFi~_c}qFdh@Uu+j3eEZ)$gt*u|Wj+sdEO6tttw@uD!d4+46|*%HGMDj$V1mZD7K*^tSu}d3^K( z)fEP#j4ZaS6tn|u^3sE}$B2Sby~4P>X;9$_ABRzrG9>%l%}#gBQsM9kX6Bo4Is*ha zpbQQyrMi+Op|leS>omv>8;QCFpn?Syj)Y??*6S}oBk;ta=0O)K?KMUtU9cX9h-(B{ z3qn&o*6SzX{rCZR#frEM+e?xLvs>WeRbhW*Tz@PJb9JoqHCIRM@(ztWl;SamBBA$P zG9JqtRV^SZ&&qooBsW{QXOW8^f|`m;+M=bVY(_(`nWuqX!9zwb>o&ZYp_dKL`mRm{ znxdpBZN}Uy^>mHe&Z3v2Vt)l$rYIekg%p`Su{am!fRzuXw3%>hm+As)$u-qMrP?jdcE$}Zda**1qP=DjniNwYrYeAmOQL7q@GY9{ox(-bSrb%H%c zaHM^X%VHD`B7Av{$Uqs6ym5m&7R5NwsKhqkEpzx;mdCkGxi@f<_yd{Nx^LQHy1fLR zl>FWsO@55GK?q>1ilvMTidJEDI^^-BRY5~V6N~bnTI?y*YND)Mou2LUw;|I6Ywf9j zTWCHXaJGAO6^OPVyPnxG6948 zVbX*niy(2H#_7e2zzl!jtV(u^L;~egDzL;~6DXN^>CffxI)m8s7}CAk;#H|u^0kI5 zHUr#I>>DCRjb#F^UfqdvkE_~E9#LLCDK?&bgjZ?S4&q?INd;7&Oy1FA&XY!KZ^h^0 z`#Iu=ERH)nwNKR>a<-Y=OX$kp?p;#}0VpAAXKqOax@d&R!fIq>38s|ijj%Ff_97dS zljL8M1a00S!X?Hmh@fRDNpHkAl&XKoEia#$6>cc3pp&wpf=#tM=`a_Qa zR=)4|9P=3VKWH`V&j!ki>K>f%{n2cYJYnPc#aLxJHBl5VS2>c^ajR?K^MU54CS^{r z%WQ>Y^&At%b#{lC{kE*06iU<&iW!k^H;P^7RgBx9A?{PDViF*!q7Wie*v(9*0?sQU zf5{Em}a(iZWqA%`#TonN(6Cw(jmL`mJn<(sQV*t^jw{1X9Jb0;^?Q}^Wx z_sV_+{-jsmt?iD3uuI1DBv;&Virr{Rg{T|tdP4?yL7pEH+8h((0>|zea{<}QOyl?6&U}7m~ zGn0~W(zCB0Adl(}uZG_@(1o3TM=IL{$^Ck4_o*Aufk1juzG6KowJE2 z67FQF_N;ihYpX@CQk)fE=i)X2NVj7G&ag9`0IbSY^W*fYNTR>5R7E}QQjE;{`I{WPB*t>FVJ~y+ znypz(+euqsvI?7c;+#B-T~US^F0OLj(w=^S6#qZ;^bq6I(JGh7BKQwE$^VQ03q9?O ztnB|^^qiTcpJb#_`XePbCpWt+Lq~ORB+~fejLQ1N#@6-!%cjUHr_*xRP^*Ce1QaI- z1O)#-kTr62{67qftLJds`M^IAtQIICfp6EKAP&^QW$O_HeoMO1CrVfkDV$`P6GvB# zfn9dI|BnEFS$IWPBLQ3OOxn^-SN zuS)%@*7jWuODx61_*exrL&Pfris7vN45)70VJ9G})n7$IhH`Bpahue=aZwsC*bt!9?5+EZKt4jHDOtC5yW|>Y`jc83bc<9igy9Wcw0 z`<-OP?GA5+;aP9kNqpLG_elRKue#e3lC)ktS|{K%=iYp1J2R7QW~if6cKLb>$caoTAFoazenBOYj3u3CZN|!xB1Wk{~WsOJf4n>t_yRh zC*V!myvx10lu(^ELJN;Rb=-EX=i^saUUl6;edQThekM>@X0n|Wf3_U}90+cvfo}%` z?qTGZLrkJ35~tWhZX)A^49}Pp?<4F{qh}Vd7R)WJJDle&u~YJ@d0$Yx)E?KclzfnZ z(VM%KYHK*<)E(2+AZ<$MW5m-k^n#p$drpj1UR+`@qo6D~p!z9ph~pS3nr2n=`2EqB z*e=&oAS&wolHxAD#aC&dI7`*zj?F%UdDVP1cHGkxGg4t2nj?}2sKsImW^G4y?B>dm z@d)rXkCIPC`_UW-u8oRE{D z2uXd}gH)#&{(K-LI#6xlwjV;n+Z(en>@}svRhG*V(q^on zU(~41chqJ0PR}8#eWZ}T@e9yBj9zQb%2n>S->R+W$VOX(1!2(x%sJA3cEr-sF8UXs zN5gA;4K%Zf5V0$Xl7LmSe1{#N#n8WE*}Z>qpR|ocQorEf`sbaA?($M7r_AGtKLmwE zW!GEjcH44-EN9WBm7KW#iV|cDo-=^L&3pC!(VoOdA8xJR*vX@U8-sEd!x4j$lu87b zofKMwNy}{4Ez`qK0ZK330={AYe1K+xW--`cUmZe3&&>c)GNd5W=JOUGfH6mw6Or*H zph|mEtlLm9>@q2AuOY^@-Cn^v2G(a~OMIKBCxhg%!a{8`Me7!COQm@F+rHT|hT zCCbjS+b{0I$|@qmgwDMBt^bBQU9uT*G+OdEJu#sWD&{8@`>SNXmIQIC#?T|}v|}_d z#OCQV2sI$qQmSWF7BEf34w;}0EHVpE3lG_4JY$;gAt%}$;TkzYVFbV& z;$w*Ch-m4T+TYIiAW`s~?N@Gfp%N!xdXWUWLJjdvK*PuKh^te!%Y=KBQaRC&WtV_J zJI;ePvac^BvT={U&+n)w6=LIy(rhyml5&3z9}h8=|DaE2=r9Uf1&N~2r2sgTg(rIi z(npGR>8e@PRQ{|LcI3Jt=tAmCQm*E45U|lTu(zf96=gf!BzX+`F#(rV<^`(+|3GXG zNm*>O7D6O0X6QQlOKc?g5|YW8TGzS@1AP!DU&TMw^8iF1v_e!uy*dG4h`)U~4M0Tw zckmn+YL^&~?2o4k{hHxWHu)}feMU3M>IxdvhgMOO%-{NkeYF_|3%xf89J*g^J7EGD z7lfd|ntu;$NwQm*LR1v*kwmYxLS={t3dUnNnZEk*+OP-$09%Y7ZVnCs^*PiHhOWL# z4ESQ>IyABhak81#`b=++-?Ip8HhJ4pP?$XSoiY@Hky@0M7dv^`V}q=O@l zx4ArB;6;G@6Z_7l>n1k_K@wqW_UC-j*s3?VO75t_LaxpaW?FTHwZ+rByh2tuQ(2e` z-WayIY(9xPQJE$&n7dk4IeOj?+&L{nYg-xO)B|t-a!*|*9#|*2HWfF?#LuKTlOVTW z5eig+RyBK^o^f3ULxM&6214c$9wLJbWk&^vs;uDpl0?N<mVSzW=ps({ccx;3mHOziw!RJz`ccgPv^U8iUS>17D@56Y7rUe=~11t1G* z@eQ?)lO)&_DR~rfj&`|^imK*PMV@C8w7(=i^n9rp42n2S!WQrnYDSO6Ad1n$u_*a%66Go7O zvSe!c4g{?gEU*`NwTMNn$&w&q;6XgYJ96pccLe`>_hJ@YM}_Y@gA9ln@-YHLEhA*C zVIR#)ri1`KMS6z$3rH=PiHBEmf#8uC&5;vXvqcg`Bg4FEuZdgI6d<0VXs&Q88nMx| z|Dryv`2avNS*?Nf=@5_S&BqSC*QFo~{Utf0iT(bhIT>Jp$eur83VH}bk`*2K9m&bu zBs>&BC5B3xm^T<4JZWq!5WS}Bws?#;Xb(5KKt`Y8#Y$W5f%+>cq7Kwe=M zm9EHC)k|Kr!EWY*y8q<<%?r-9p%cq1iZf#$N=pHHOUKKlAiv?`QI{+P%R^Xx5E|-i zq!zC!%q0C|&EE-l;++hDOu|QX(hb3_Vz;?wU!RRN}W! zvxF%i%FAk8+H0fiU(kL0R6C&%We!u$4bDO%_wotU$GH__?-M2o9NrvRN=%IUmVA&JsGxUK1*D|80egq~vg#H8tkIZ-(Q%;F6Q+Tv#xbSccyEdUVcDt?~~F z=$0a15nYkKC`l98^Bx$h5_^l>MBokWer<2eEDz2NS^!90wq1 zhnrlFPkKZ@*Qc*cg2xc&!DHgF@N#S%t-}*orRBu%-vrWRTH8o?&^lh{nQ#B zAAo61kXZbS=^Q|#VTyeTO#q#}9v&AC{p)H+9>;@Id{_oxG_BSzVDcMK?7u1Y-4^wJN5eXh z_#`+qKjZwAane8G;<2>E9Fd^^kNy3#^?BSerYTjP^6IJHf{7Ut7+bOs^!(t7Ln7_Q+~~ z5Wb%^inHy$u>a|8$~cm>r|{o?A>ycdM>u~`*6_&f}VrM4B3`{xLPF)z5|C+GsL?wI#xslB^kJqVxEuo zq7D34)+XA(1~=v-(-+TU;VuJS(E9YgKP0^#40tZLP6LEAId($E!ClWQ=; zsePKOcNC1G$VT$;=1(L~VWYs}uhuupBH7*Hyc*Ix{{~83*~U8qobdz)Gfnq;qgBW(0LKwdaTfw@w^8FRt&wIhjdW5F1Oi^b6ThT ze_YpNTO}^DG&gKq*c;A`u*3G#)G~e{8j#@U56Pl{hp}-EVk2Cu*hLZijD`+GB3w{s zeBTw~Mkg zCfuQbfYiu!-j zC~r$zKnzkAJzl6u}7o*cm3MlOLLuwX%oeG^1DxgKsJWE<~6_rTevY zNYco8%Q!nt8?1-xY0`Cw-qfS{QFs(k6v+QD{X-#(T3TlPW7ScfZiii)37BjUHf7Kt z@`t8{6*X@mduR7A%0@OxGY7Y4$kL<5`kTDLPU^Huhq(f@B7=n+NKBb@3#}xxF%}f9 zfzKDT*2$JWo%_DY3^-9v@|F7=-E|R6U)6Y;dXf!{BobxHt2rnxyc2K5Ggw6wuEn_; zoyumc&5j14TF*bl{jOIf2L`CO)EbHpwqc4`@;L)-wvrCz*L@4WYARn30|*>Xe%+pynQX%SJnvo zUP?iV=QG96y`V)Gx~xFPwflJ)Xi-^FXHhQZ8f}LTbbsy4v?!Hmeu|a`j+eo33v#Cz z?g&Y{2*#J_X_$>}VJJg)ghTT34ksUO7uWf*xaIg|44Qd*rl{1#wLck4w8N$W+YvUH z?!qbnD~uo>U`}-JiL{!D(jQAh4#yUSYVJTsJApf>>_!c6EG~(gTbWD+LNer0F*mdU zozZ%DyXARR!n{VR*5zCY;e!aTa+88@sgW7oGaG_RW5GMh+Mk)4(edM(Tyt~q<#R}T z7^{XZjhm68?Kf*4`*qa4>uIdq2uk=wp3)qOen#~=O^hv)7kdVJY!dBV1p9IU9(Ys9{|reSd@Jeuqd^2`!ZjQ7%vI(~vEC=pHl2mHScG{Pj=L z1I5(YBjL?4MN$zonjJYWqc04~!XDzoaz3>-YJCC*%5W1L&TM8S%H87xlan+d)S-!< zhLUJ(qJi+kGrTPeg~cdGNLX!`h+DrKiw8!)Rn@Fm#gKZfdyHE(|ARrh``S7}&#Cb@ zew!T*J=PbJoUvON>?Zy=eU~}eOlj~U2E{`;K(CICeq&^AKxnk0o#^Hq@zw`VEznAgGB$;*HR{H@EVCqXe#f5qawH zlTE}kWZd-tMwwn1a%HZY=WAXqo*con0culVzK zjLgwj-3NHi-H5#h0dLO`Ka9%(_n!j;JB!}Gkk6uPzG&ASnfNEw2Y;eFKA`%zw~s?b z{h~cy_9jCbep~MR;3E>ZgGm|(z2&2VizF%yLge1v!#X&9S4ag8p9&QFTaJG2;5 zW643&V}Uu*tY3`+@r`UffHK;#c8}k~I<-B7)OEYlXMsb7pzE%vD)e<3FMw2rGG>6F zX^-H-H8l>{gvQPbRr; zf^diohR|0POuznoSJ&SI;|jVS!yQ?-=Lt7rYj}UXK8}g=AZb*p(cUI)4GE94v)h>W zt1c2{&NCFePcqQ_WkkR^&XRo%LArD36eyQ=A}Aya|Xi1m{bsEau^%Rntcb1LNMQ zhcv%_cP_;3CM9bNakmL_nG4N72>>KTHp%E+)=CrNa{?=;=x9e_aM~6?YGe_FYz`5OxCQx5)A2KK& zpWKk{ocs`a43zmCWUKvq`qwYfqfPeBA#91#HphLFoYxvDbtpB`SP`qYxG1TD%q!@I ze>7XY@qA@Dwa6m^5*L3l7qa!1#z|ebj5Mabq~ZivI7Ne&%V{6lMIP7}wW|#87$de| z#Of!w0+*Yy-tw=s7{Kj1Rs0m3VB5uagP7S3$U{&i^m(NUa5ViI8DZW463=CkWF#6_ z<`ZQ$Z&)5r$G;pplgPRM_V9h$?FEJ8dw7^yE;WqtPJ1uu-A9uWSjUrYouXFJKtK7D z0{%FnmeFl4)m#>gd0u;6?V%wW$FsT2EjvfQN{r98e^zs~xN!6lvAD77x#{+l-;R&E zZp~Ld;WPH4fND}wG++qUdRM|FG|yo>pwgW=4lM(3*UkBcZXI`jgBuG5${_O~Nuy5P zShABsPLtiKoM@u%{e5bunSWb3PG$RAA!}2%-JoowgCXWB#d$T;bz0Ll=%0_R3EKzx zT|R}w1X_wwy-_h$d|E6=&*fr1b2* zDbn#ExSl!SCb(C0L>d{l_4&|4)+&&$wu#9Z|7pHC$Zw{{kU6)~%+12`Yk~vC!Fb3m zRwRxv74Sbs`9D2(1i1u|^8eW6_rE~=AETH#J3Bc4hbVgS%rGNNaN-^XBA!+-MZA}OwQbm0F)=j3`FjNp7R_WzmOiDaGissuz~7DZ zO8*8%c)4im(7EQJU0>QZJcZlexKIJp3D34UwyX%@s6%m-?~W!%yh>E+VzgtQ=&hYx zEDfStC#mE88YGOH0GW`Cna>hs4%bzfp~nBAm|?kr_<~(tEqWLo{Pr#D|6fU1d~!N5 znf-gsxIjQGSwKJ-|0~JX%J~19V&S)O+5Y3a|3ZuO5i+HdO?yXCCB|(hZZm^hW;;W^ z-QjehN)?F}&6NTa5@8xP_Vw!eua^)=n7{X`uW=e9>LTmn;!IXy-jE6Fx^IqQrnEOM zU3`m9lZ|$o%52#zS>Y8zu{VQWLtINTpe9<^pONO>PHlg>VYRoaCG2BWw|?4qng(3k zLZ-ZbzrOiPn%z02+TL^hwPC7t(qdCBRTbIa1x8B?WLgoz;Pv$=V}fxHuP<)D_m}*~ z@maw3&$g7MhHVxmF*2Nw9^eL%oKWT@hJy+I-1 zW!itV8MC0!uj8bk=_I4&*ks@wQs4D?igwcg1>r71aP&^FpCzX8;Jc>;lhVNo3fZ^u zY`KF_e$Sup!_nE=l@+%(Psw4e`4OV}Ca>4e4aRZ)-(G<4)9Lv&s_(Cng9D>ki=~>m z7e1)k6`eye5AEY&b2m?9bvK?QtUCY$5?M$HUdh9?QF1cS^kCmZb09j|5;|ADUeh&Y z^{Ke(aH`t0<$7imWZt}Y@m!G|3-~FqCM8vmLxXumPuR^f6O*0s?T*5vjq0H9ID(1r zXaiJrv(^YLXJ`_K9C|wOC*d!VPI!u>ZuLp!B}w%eoi&a6CGgFrB^O=fTDYrS{QR8! z{2E3BC*-0w@$r#&N-DSIq$6y8QeY2haC)kPKR=HTEXlD6_F#i`x(pMJ&I79BKeEyy zCtPBVzD8YBHU84IG{t2`Bx^dJ2uRE?Xq`rK(9~me+9K^agwVL`+A%>&zmwrK*a^Anj7fCBz2?ZvL zu)3_r(t!q`EAVD-3x1xD5tW|FKCpMNXJSsR2t8KICFgg~=?-?k$jjApwh&XTb z;M9=)J5};^gMi1Tu_wvdnec#pFaRtKboUl)A{TrTMa_Y2tB%2Jk&57*xgk7^6g9@| zJA`%+n7({o)BQr5{dFE%1PVFLrloCSS7%_3tn-G-%?qG&o0v?0dvT($9sCu5WmEX_ z&0ruNEN}kyoO?Z=i59Hto3KCAyeEY4Rv78V7J~blldunC*tJ`p1m>uxNacG&5o(%p z_QdpyIuOKb>$=%I7N)I)TuWK;0(8e%7*?De9tznrNK5isz6&Z+U-VvlaXmLfHoEKo(;} z=eV1b-|zig5J9oirDXcBWyjMx6@$~1CW}v~l@8Z;VQOs4<+ak1>`=+*;2=Uul~6%s zmHcOs{AGDMN;m}qyL65?-ForPVphZRA=7NR!7Lweqg_*4jaM>wb`z5F#iM0PP5CgI zhNexDE@SetL<7zBH@Ubmge;O^@_@@_Jvh7G5P>y>9Fbuoykq~2w2Tdy03XcLQiWvU zoN|>)X^Hhnm~Ss0EZsoZyreBI813l1<_~jgiX6rmyk;zNcjn;%#@Fyc`onL{5Y+~P za%oKxUd@@f%#8+gqftZ0(D7#w`19q- z%fogF=LGR&HG?$A&?H==r$aZ;Zq(i}t4{8P5_%CK+9T}K>_>Q$?xR`$HFg)AZtQS#XxjQ_Dz|m;B~A!$c$Yk1?S`?r zB3giabuo1X9EE7i;0G+G%~GIFo8gh}&Zt?+u{0NkT_l&-EFeVN!pUB1HLN10X1m&a zhRq&mU|N&ti0^f{9%Y8d63@Mg>gqug7pP)0HE<%SvT1LFy_{UekY0#wbLs8!Y1J%+ ze#sMNhuKUx92zRRJAK1$MBa2)Q* z=5pKO!s&&np+X2i|HB2VmW|fNgKk{a`&tYfl2Ts-J!Fg(%A3FvVwz$cY)|d5NYBKU zgTJ`~OnKodIL1q8Y$6%_2(vx-zBG_|)~S2vN-4Y8p)FMng7-wh7*2yF^P_|T7|0{- z1d+CAw`%FN5#{Wf;uOa5+_Eo>K`t?zDhTzuPTtV;!hjDV00edPIbF1Z zS)+~1UQHUQSqNR%>^<}~br8+9Au$ohm&#$xAB{6f`=d;#ZY%?U^`?qy1E+;L35_xM z$Q)RQ`q&z_gdv}?vP4OJdJ%0$$Ay`|5V{+zp3AcgF5_I9iDYfo@lrhj4&BKicWeCL zY_6%2DGp~%u1Jd$a}0MO-JbB#ilff#HgAzcZl8-|kWFl0Ot>VjxYc?qwh$I;u@FhZ z9dW<%y78?$b-3&dqK}AmAq$sYY3Zz*Ysye9Ox!LxYId%C?o@0Szj(5CYObcqatynS zdhmmCGqQv!{EKUgE=e$H#O!cCX)Bk>8w0=DpRDL0N_01 zldS-4TQ~b^R+kUn;Z%y%4wxI=7VkPLBxtEpuiqS0yS9kkMPgFJwp`(`eG8e}VMu~b zd4>fQ7FL#ST7I9fW;UHeW%gLMam(nIAP#ofxZdEw5BLT+YRqq9dju|m!$trdprW|p zenm2pQD$~+>Uy|ZrVh|uS-q>E#kVdCA^k+Mdu8h3GOK!G zFP{!M31!q~+~fQr#J9|q%RoHl;y4L_5GZ>Z2~~4h#*mP;4iCmF7qzYkaN@T5D7xTu z(BTs7g%Zhcg(7hXlO91LRSgq2SlUk>KuQE7bnIvA)PhwF_1S09c%)LZ`H^YFkVr-7 zR`LnV9{x$rFyChXt7pZMypq!)P48Nl+o&JX59S?xpdYZOIAH2d+&qPBSL8i6 z9(L7t5OGBq%k6ZYi5SjLG5r)yI1%!3KsU~mpTF;Ruw}b$6tt*86nFg{~N#riZ9y|De&c``uh%s6| zm_Y~irJTBl!@hD_%Y4uIJbR7L=91=ni`NqBbiT<=BQ;}p)1z~Sux<73z~3|^hYY0o zQ~_^!7>_G(>VUg~4jN0(m2eGH58C8$JX|QvBkTFHP){bu{oNJ=S0$uV9k6M*RTAkS z4~dY{$atpI87#AU@WkW>>er5rjk_sFfZ64^PxAI>{4!ACXUn}Nr#D)aUz%{h{G$>H zyDkTel$CRLyBUiWCG8}kzUNGYEV8z9xfcm4J~RZ>|MA@FEPqRiz% z8C|&{ht4bfOkg_Xb zYFbB9IFs^kqumyjYlY8(1%a4s`LHT`SV7%f7Q_qxOU&oQMrL*0YB~g=9)NL! z|G`rP7$ddvl-ZB|^~E6^0g0PG0pE}Db;4aXO|*!-s6}{gH4^p|mV1yzxHWPFE0br` zlrKgkN!N;sSDCKrmt_j7KY#{bjh1WCqA0#pa~w8aC@0T8sMnrjj4dQSy*^Q^gS1m> zIQxPYT$josCZrLhotLL>ndb!`1qbhypQhchI|WY3C1sf!Ow$+%bk!0~{q*RK6CwjD z`OdByB2R#lU>$H~GEN}mJ#Ze5ie|>d0j&jJ!z+sGfiy(PK@b~rV@?HAG<~^x-U407 zbh`sRsPGd<1*6Q3Yy0nuAM^}ay(z@?mo+LKELB4+c+Sl`K65%zq9M2eCy}^e>FOyw zANTnaL;rX!6GyT?O}XmY6PT6Gu=BTrG?+g1nmVFgcx5Iu2~t@3k^w{F72y$7PT#f^ zjO~|Mc`j2#GP-0WNx>A>MQLWRuZ4a!GxAlF#FFd*iq1sdgA=oP*CzWtVJGq)Vi1Rs zv8C5eq_onwLa2H|nVXH2vS720zZlXqb-e*VJK!KJr#4?+it^VdX<0FHk4+r;K}uR; zzO<5tCj@5bw4g-3RmA}STmFJ%O zq67$}1$2`0*E9k_vgZ27=p4b^kLcOEWdcWsnFc*-OfI7J%X5B{?&@KeeJ0BT>MSrv|*Hzca@#{Ia8zzj4aGnUmBIXeEc@b9|@_X6b ze`_)cm)R1;u8wlNIPxYgi6{wpF{?;<8)DxKQ;}l3&MRyw4q7o(`&2m#-}vNnT8Hh)4DaChe6V}%p)sre z@y_$Q_C=uBEEaPjc7@D=m+tcLtr99tH&w#G@chC2}`#Oi|bo>@Lef}!WZSk`PGx=VYf z{E5kIue%cTw1D|}3BPmQ$pFe<;&lNuZbNm$-q8Dk2t;9sH-VVZT`Y;E^11P*GOZ3AY#olSTM-WismHoPb?Vw_~7hA9)}PjZ6Me) z3Va$}>k_#Trq*>HtsnQG&Ruic;saDo5KDz2r;uiU?67a&lLZ|kn#7@w#sRoGjdyfa=<21NCJ(6w` z`AyB?gEqi45wgeUUsNPhE?9Q?^292>M0A|!2Z)k$w8>PWkw&|50Z4jHcS+5w44j32 zNSuX-etn$_Chur>!c%o`L4!N0j2-;l@-Af=rx3&-G;pukIiF@8_XG9qQ?ef7@W&8@RYMrgs zOwfU8YeGx~79a8rt+S%zxF)D{z-C%N7)%fY79+ zmnOC4wem>{*`&hQ!(cR!^P8N>*T0Rz@7Izd`yCvdmqGkU4>k~@776fU&L4DNBZUs) zihQD<4t&69yt&73fIMcrD#1ei&*PuDL3e)6+TBAl)82F#Y~J7E^0ZK64yT+g^(8OV zbn8()(i>p~jXrW?RJwH-9j!K{Pc z1hlkyV(LGOp0CjELHzkEh%YhUgD~%X*N5ux6_YPM4+{N7pT>h!h>3r>j@ga}yBR#| z;g^IB2SWK&ASReW_a56~zQV^srJ1%L9>^((be2M!D&(I~oH#+F%@M;hvQGPF+`G=e zcw2;8I}TnJZSa(FmlcxFTc#mlnO91A?qUzoj>@1{AWDoCty*rnX56=^I{xADpKv7c zLf*Mcx%_%DGWFYxysC|w>j+a(bdToymJsZu-(4nK!zl!=z6?ih8AQwzi2>TOSbJ5z z0Y?jV-%$tydAauS`TGyzZ)Fyp_uH)^&;GvG}F$?x?J+AC!)p3yho5z z8HdIT{YKacMTRfVvgS#Y!h1XL{=grTNMfI@tx`^bBhFc7CVjl(_gF^yBQO!oUizzW zh83M%A#^o2Q@7Z}lvTMM(+jR-!TM&`(pM>ihvyW~F<74#RHw$ffp&w&V+W_(RDsn1 z!BkkR3_5-rS#_>7GzZ`q{cKv#?!(fli&Li`?@30_%JJzQc19z_IqCN~36-i^{c7Oo zs2S#NPV&g+jyg zo{mPk2QZ>xLBv3w5x;sik_lj~Natnd6sSTas}%liP$L_~s6rtQpSPp=vOzt>WHP7de3 zBA5t(Ax#j!bgsK2pK;em`aChpHcy!G5WWU3TuQWi*0=p~G)#4~%X&XuoDhqg&i~MV zDV&7IOX_aTdY(js7M8ig!{$@EILiYo4-o>>KgXH!a=89;+Z_LXMr z>GZG#x!q3T=2U~{IO`Hg%+L_AF?+}SI!+>F+zoQ18=&Ue6XnwrNx;!Zo^PG)>bF5- zyR!}FLs+tBw9pgl6(DLqz#M*kY!V*K?{uSi&pY{6^W#VdD0l=nwjNq`rtg@zqag#q zr6vdA?8LJ$p9o zk1g9R3|KJ0mb^61rmr7Ag?{8c&WNM@w1c@kJ4)eqZem9%7D=6->)O-%(8wc9jqZl;0_S&XD|+tnu9!70+KhfV-LG(X+4R*{*wr-Ye*yGdKkm9bmGYzTSB} z5zi(QV@Npj7`EzJ@@bEeU{Gt*H~sBl4EB=vesx^TD<(7`m37-1@l}`4mUf$l*Du}= zuQa|c(6JX`zNd=GRPqmVo}=aCGi83T@OKWZb^BZ(KQuZ`RFL>v@P97f|1mCwO`W{a zNq~Slih+QT|8JMi+|lm;toZPMC*XF(58N3rpMi9|#;{r;b{b$f7%SMKT)#els#6_uYeN8u@di+a`_DRE~#cC$(yRA!meN~mc-So3Fd@jE;dcZ+- znd5a#mN@F$;JsBFAXA8R)RYZLsHQifILP@%`qoO-a6fW%a$;J3s2sk z$Q2TFMQTVozb+Py0_si|Mbl*OG^jVLdF2!H12EE}oR=_{O85x#1cyBeo90Pcbf@!YW=?y?5zQIE8-@S6wXY$Xp$)sGB?PM~veQDHU?g$40 z0Qrpgz6byv=C`Y+0+y?}3*?xQas5(SpUt(xpD1wEbK?k@%`HQCgQ z5J3{MP$7Ruf9Wq`bde%C69Sl&|B5~%Mf7L<%l~Yq^tmBYP@8Fl)%j1q0Ami{`L7fI zJ8+DGrN|?}gv8GpcmO8WWx9Ms-a{(I)b6XL$?FyGE*0U^T{Ol*m$ij)e&ZTOlUs0x zH*59uM%fLbkJs0%O zW_7aKX?p`2gQqEkkaPTU3e!P}H48-M(&%V*Us-9nNJ33~|O` zNnD+xlK9du$;9+a^2-1wFIfRle(RT&T-(a0enRzpb;{rZWYL<7Oc@*oHji1feoe`p#Pmp*lP{j zkEU#-aK|biX?mGe??R1-)ty+^nSc1{$lbepAzS zoV^Gv3w%m6LP*lCrfNtP#@y_Ls5qIV74KN)iC&!RrgN_|=0Ov5U&o?K7UZFoM&WE` z%fJx|%<3B^6%nRfwP#@^+o#-?_lRAqbuD3dGCGi+Bs$Ns?RI;bo#ww)9EJkTEp~xfj6u)ig%ePpFb0lDrX#{EP6)BoFm}61NJN3=1Nx{Q zLTXbJx3mM09#Yh3X_e<{2t?8@FI%;2hNDQWHFD9|wE#y~$@fu!KPD94&;=si`EC%y zFrh;UG|YzjUS!w!9kj>x9vzLrs@Ck`w8(fjleHp8#6kQqA%0pYSaGnLp6K!VhEj~3 ztxG_i`Ge|CJm(3M*S%y>W_-(gMOlH)$Q3M{=twYxY40oH{vowmYtl;N;Cykw+HE$g zRI@s5Gxbn5ZSD-CpDo`ZBML#H9lqSbCWf2lO5J@V8xbrVfgFUSzg&Ctvcod;#l+An zHF68;sAse%^x|iLx85&h|dE^YhUcS8RM#P zola_A_&_gH4N{l(O>7_U0I8yE6nebL9(r9&fy=%_M|iAu%?Gdj*($Zw>Em>PFIwPZ z@^#)-i#z1l)2-M1?lk-L1Q)u~t>3-fX`Xe$H@h+*Y$~?}^6SZLQ)3&Zytf?!EDd%o zK#b6AvT3neRV_@m>;{T1z`h=M-5n)I$?{Gw@5OV)$n0=HX_>Ond--YA!uof#CSYV$KU>b;l%xG7M0QvJRBw<*QWqnXLCFl2X5A|AfCXn}zpPbJx zq)@PQbunod2BDgzo3nb>cMmO6bjH)~gDUE2pme=lEUNnkT8B?45;c#pOW}p_?bN&h z$y?&M$$76}wie{FKtKB&cWbkz+SF6p@kZG12^%evrv+_C;dJ$C*tW0`dKh7i0Xch! zDdBnILX~gAd*|m|GX6?a4>#K;gqu_gg`+L08q$nl${b(&c2(W4Z2cw%V7IQ4)ukiK z>~jT8nr#rHpz12O*GxO}^Gu@Jr+UUV3z*V0j4s9@RXKsMnFEw?aMD+nfn{u(XlMzq0v^N*0NZOzRw3meSL9xzFqGIuA3KUsU|P|Nh0WK z>!qrl1^ScTL7xw9+IHQXy?9Y<>Ks=@V5QANUe(tx>h<)+-M_!U0r+}*`mgL2b-ftv zd;=gP>wE6($M=6j(G3mm27yKZ(=6pVF+{Q~g^~of7>G+j$3DkUq#RJ50Fo1anNW)y zjQqEzS`CBdnSW*%gZ6Q)2A9Y?0}5#xq?Mm;%Wpn#^8mRGrY8Y9%eJ$NQ~LAtGU`7* zD4SW+#@+dgf&S49F4H);;0s;wV(=sU99+hbxqFd8lvwYRb@2g0x4;o94IOcpE1GM= zUzj_=1A3`_I^m4#u8U8|b6_D`n|WSsR%lfRi}N7n6Zxc9UiQuQ*1W1!ahohb``B6b z1^F7akn`w6(zb_4D9q2hcRa(#?11|GG2T~)_Cie^ZtNR)x38+%95q#c(ZBaq^L8QG zG{AX2_?A921Jn*i{V?L)PzmTQd_4kKVslhNdxf8m0B3iCC6IUg@(=)Kv$an~Z<*+) zV!S}k`MB zZS?YLNtiVoprDA_)V}x*11gmD->a7V`y?KPsZMTE`fGRUDR3@)_3*VYvA`JEZh_I} zPQYDqlR9aBup7{i$U1s8?OQ=*Y{k)?+Pi8Vw^A}WWFgn{qm;!EGDaESVJsLFJtnskI}^i*}|lU1P4p!PgT)%pDD&0duz;GP3?7iQX0 z1|xo=Zn9r5Ic|UPNPVPN9f?&D&w<2xhzYP2n-rg-le~r|a7W*|sSsUxx<_avZ;MAP zw*>m5enD##bRFzi>@K!EFa0fy-{=qS2CFG6%uw2sPjk@LqYK}W_j3;C|`n2Y`2x7QP1;STV+C%QyZ z_>)!5L||!}@sr`tQDutWO8{UeNz`>;SjEaoRKee2@m1v5i5yiYZ}L}uJ33Y_&EpXO z&_#SMEE>S1B_M*md$>Cx@;?BxpqKdoG37)Cp(Zvj$Ww-LZ0`ol;Zp{;P-K0cC3a_} zpVWT|DeVcg=}lEN$}L5QFyc67h;cUX44cjv7HyLF%^YB$(BARQi{xm0ef4;5rh;pC z)FCs1mW4$l_M!VmK5614n*D!U=WtsmP3ouFJx-j{hM3q9f)3Qy2Jvj0QQQ}tO+DfY zpK!~d2~DK9vmM^A<3*2QLzXz&H=l5VMQ_+_OAFd)mp7m`DeQ*}lcel$5(Cf|1N*;K z|JR~NEBmPtIZpBK7P#67Fvs`D*}7_)@@nCVdIyd%=|Zi2mM6NUgN=k`xteIrULP0! z%6%ywyf3r^9H9|Q)@HL@7WHE&TVE5WZabjt0)e}Qt}`*W)VW@!li$PhZx3Cc82))j zZK>|{ik67(7mhN|v#*3ghjHWxs?$*ERG{D$DombV!4q8^wDz8pihLWL%5?_?$OTr- zWmqWXBH19u`+~<3rvvyrH*l&slM_XTdPi_E(%{gtCVcYH@)VtXa4lWBs)5cz1f`G7 zvl{FI&4TFMRJ0j;|C&i#F+Q%k!K|yIsYC$0iW)_zV@C+X)VQd(|KlH_5P2v1;?+`H zJ@+@Ia1~vtMYX!7GdIBpfS-1qV27+78j^*yMRSf;kJHGjsbfVu0<{8Q7yN?li)IgH zFZ_ru%06M~N^@Pm>^i%2&^c~NA3s&mp0j4X7)N+E6U?wOnO4hXwc3mL!RO~h)Ink5 zxu8=Gu0USTibSwuCp&P)k9~dYB1wA8#gteqY_TA${=i;y<=zn@MLdmD5cA(uOJ$A& zxFK;9@*rM9ApXfW8WKTtrt3}dWV|gcN2v6tPhY<+R`CBI1Cu_4trLe73!4ZmJbku5 zI=N{pQ~($G2mB+BRvxqFdX^5+j)Iv99z7c@XF+Nua2s2e(A2~G|uNu*5H?el05)ozHkwgAbBcr)GJsM#Z)Kdfk>7!O& z3GZkhKA{3R_*S))$BpCUJuE09TBGT?GI0`1t-;9)omT`W7H^p;cND_L-;O*$>S4Vo zr)4VrX^xo?pHB(N zDfKBi^lUnFmwnwf^jt(WB>WH|vedoirrLmNX#@cS7#d2CsY^B^h%Yb_eriYeh?CP{ zfPx7`uzT$ONN3Dp2>Ni6sC}5{5zoWUD?A#Loa^@`$RP|#*L|MBJh3Sh1lprr(nu!i z@+_6b#|GiC7OZ0VHKjX*wQrUrGM~k^NGOlJGbc_UbLF&@?~vASG_q2YiYUk@FU#6L zyg9t8+8bWTUH~7DIwI@KdDNx!58a$!TzSH3e zJ?AiQ>qMgzs`Zj$Vx~&XzNSQ@+FOMQA`U)ZK6vA@>Vhp_bL4EdmL|#vRQ6?!$gnH- zFg$&VN$OA59&!p-lGJCS?ItoSOn?uPKDoOml#H=71jcCz;{hNy{FMeBua5f6PPz}$ zqm*1$!OGGZd(Zbn$k)|+_+=tG8Xspur{PH7g=sV$mTlB8b6&O=UfRcyge$w7EYQ_6 zcS7l+6L2RB=@U(n{~&x=?=^08j|Ry~9p`13OL*9<>TbPR=8aWLOhvOR9DC<1rAtsOZa=prxz_59!!tryI*gWy=v8sS9A6$8X#>qd;Q zEbEh#7LSRD*3j}oS}3s&&EXlYZdZ`T1X-a)UxF>`eeddz)xV)~GBiD=KvlEWndFuO zM12&!ofPZTZXzModsJ}l}p22SDI}nyazk2!iG8@Pj*u9a1 zkMA6$l8qh3Ftu5~&nMCa$O<25sQdH)$ta?IsK9?zC;;sF7|Iv&V(6%+sn_70lzV<+C3Rhx;cs7r14D zOcKFz^-P9~;p3@8bM(Yq*ErX+ZBTXhf&#%j2{PIx-7H$Qk~?AA_|n$?AQCa?>xpuL zz%0P4EJ(KYXOm0Eergb1DZ6x1f@pl$h|+aC_a|6ByXoGO&7ot}p}iPumQE~XQXse; zSyCkSNeg;WPdW?oD65Yy=p_cjS9CQ|dUL14P>`pv#RjkOH%`(wzwi|_9bdiuqI0>c za9loJckh($liZi--aYVICue_n_0cG8iv^~EIAc~e!Cgn$n>K}0`Un#x&Fyv=TI&FC zNO%gJ1E$`r(kmoIucOZkI@{0{QAMrH*fhgvFvsEeb);^fWrJM0>F-TD!{B*=;=4ER zzKhF_a$Pc?sVU}u^{EsX^B(uw81L-Qps>qwdykd8vD*gbhMp3|V?>Nyp1m{&>qJp7 z3w;_vxet2888-mtBfIN6d}1Pmyc&_a?HA1O$iB5+*V~A1DXZ#zUN`*X6GF0u^2Lm0 zh=ln8Q6|FA>2lo>fsH`JE3&?ku4^;@KjJcnvfO5Hwe}(ID+4dqRn-RJImP0>c*NUV zri%?_PZPe`0cu;%Y1$6P*#OVjiU6#Amt*zD@Q7l5Fp#v&t*;2UE@k(p@1lx=dV;S# z!9re}fulT#Gt|VK+{3rBhN2bvrrR66%T3aRwUZL~aG*;7;2%c!>U(ln4OFYUvaVKSfsUdT9?N^pJ&1TT5FHadcBKE}TQ%^05p@MU4Y7g# zbl}5ES|>jG){5B;aXwNn4eWREXcrx%Fi;o)yHnRWJ>Kpu4HPR1<@JfzR`sk^e;H0J(K zOU9Jzejn$>?U-CSJ{@E?zQ{hP7FKHa*>iB3?MZu1*q`TKcy4%31>PHC>=T{V=8yUu zh`t~!+=B2bLR07hfY*8l&kjjgO7o;&#CLt^WEDx5W8~yXc%x#9MM1>Lt_Ns*k$uDY zIg=Nm*wx%=+V)mjPWw(GhIm`tyQo1|^W?Ido6Z}k9ASa3s@wy?n`a)ay7teaOB}Ux zF1pbXpD6KDsgp`_QXfsX-6^(px@8Ev)8w8PekGB>X7*jF?k8s4-7YT!2^DR;T^D$z zx?g#`qLT>gBeBSD@Qseqcg{v3T%5R)GhH%ntQ>f=R$r8xegEUfci;c@r?=l}HF9~2 ztVvQ($cOB%s7qAafkR+2AFe$ zU{8RTs272E(2-Fwq(I1Pgn)uG$b>Tkr|gJeMG)9iXpvj&IccEwF}(ZxTh|-*rUY=??QRW6a*~>XpZJc zZ+eTaywL0-{^pQ2r3%G!74IityGKW@^7}R49qNufpblU@+DId7ZMi}B6{xg2B&LCr zn)_6n-nj2qT6SWiB_#|Aq}lFtY*FJQGxXEX3w$%?dKrY<&PKTF{$4cx582MM2d<9j?$*}Qqs6HBIPKa7N3hezi&#I zS3NZ8ixmvQRB+eE%vK#*aC?m}-ELKn(J<3VRE*w;>JZjtVqm{@?zy-oemibI`Jc~B zuzl<@5!^lTrl>h!(`Oze77^Zx61(8z%z-W&aXw4pJU}G9AvtTR3Qb=v$Ri z(9+w5!R-y6a@&ziUlj{`TUTl?-_rMh9Ub%dqRIpSQd9P*uBVZ&56KGNv!!E^JaB8r zJl!d^d-r~Vf_1s>D3E?@N8RkK%0URs-91zfDNQCrxXMQ4wg_}(BJCjclh#2^hc5l@ zb-5~=8=+jD9i-`zM>(bN+Ed^ihDTyASH?3(GfOWHU_I53{UOYWt#O!HAr-7;h3YJijufnbIpyBTk&ci=ciyXnNbDWfB_ zsX2WEO^h@%Yr~mxIc?Spbs-WyxiIKGSs8RyHiq%oeqz1D@z=+|Y}_&`-P(?_rn9zU z-D0?so-4j4$;|TH?;Z?)QOgV%+OX=n%hk{g7eg-;%}+x>}|^*(6o ziYekX9b-i|#v~)FbhxFzD0gnnrPt@K&YEz_Sfe&_%<+!T@W+V=S@oYnLPXNRFVr>C zGG;Q0SR5S>BaU5+1N7|O=2}V}f8k|>_8-V!pNYo=pUL3$G_UpYii?Cki06)i)ysQd7*9zPdQy3Faams9v`qaB7C!~c zqdw|87C^2xlp^PmFQh}+PXUJV;4`v~^F+6F(+Hlt&5spX6bP9cS3!d76Uj0XQ^Q;% z9P2-EY3n4s2<`?EWe!4SpXw-TCQrdx-O(`FIANq|Hz}Xco^dFwS)0Avip_=8dO82~ zgx6)A{a~ZN*>uIu-P~(>PsYYalTb^$NNa2#{1L~F=p)Tti{EJ630B$%p0B7Ydz*0^ zb!3eCBKzyhS3jIt$#k!n<1wkR&O>&4O|eh+NGtpTbD-JaHXahcl$$XeBP)QT+f@~y z-a+l(Hcg8gbb4NbQT1Gly{c*F<%7M$79W$lJjfmKq{9zg>!$gRSKyWpoF_3igr4Zv z;Snt21I!iBH zqNGuWmmNBlX_nf+D>bMED4zfyP+W3tu8)s))riyeuzQF>kv}L*w*9oEv)*ZA-^C`b z5+zAX1LSUzx3XfEXYV-YChPSDh6rvM*(gXfoUmMu(wpIHZRPZC^v4O??4EyLKE+oY zOti8=GA0hnL~V)iCtK@hb5RAbxK0S6NvDyb>J}V@Ea_|!IA${0pi@0afTj(UXp{Xo zFOH?!kf|}w2KnG0;Htp~c{a?Tk>JJmnv9l&Fe!ml_b?RmIp2K35h7vQ4Zrb3`fm&= zYnge#Y(m^A30K+$DVJF*dD1Yv6q)fnP9##Gk)gVia+W^&L^vGiDvgJIQC*7$hCN=< zLp-9#ctg{2>>w{_uLm@5){C+o4t`xF&YPrff=v^wgAdrLmaGD7*HMcta(_Hy^wP^g z$2x~|wD*qH#8O8a@~P#n9~eHz_~Y>jJ;fx82^F`NjRjlv0z4+?+0$nO3XfrW1oxwQ zfE;73xy38JS-|f}3Z(I5hWP{LKe+`B{7;?!!4lA2_>Y+TT{jgTCYfbmsilW+RwenZ zCpU`?BuS-g;uy5vvnw4(SI~jnv$*cN5_RyCE|!pvrXVYly`2WSK=i87jqM9*?5{uhWoBKv0nmvrug-+i}k*B5p3 z_}#C@&YxVfuW8kywL8~ri>`CI?P|NCt~l=m{aHF|85(XZI`9PQx6*_ zXmgcoveMr6OWMs|>5jB+X4iD?DMMVkbr+yn*NtgCHgJ@>+qlMlE2_K&=+AZYt-bJ@ z=vysbv)j7u?2&hOO}6Ta6~VzTTl_V5ZSh#S+z{5f>>EA)obBzt?i&UyueZQwyYVYA zS{xzHDFoKO+Y|Iv*JN!sHQk?{xTrc;<#JDteb!|3vm5Vd4t6Bu;|f7feEy7%Q$IG@ z_VsI8XbaHWo?fBrYTPy}=qW50aR|&{k)msD-_lA1`WM1HAU;id^dz1zFPtf$oS?!f z{Elw{OSapUL~XQlTjN|=wb$DK`Uuq0Wi5~aN(AbcdxkLUyG_k7eyw}E$|_z7f5R$_ zEj@orN2qJ2gfAOc*=It;&Sl>K4loelnc`14U*p!UX+YbAImP)D6mE76or(6mq2-UC zc1SgLfckEeb+|~g$)1En5)w){Q5f(5K6|Fu-8>5U(+XQ#tg)nhF51ocG;BdgIb4sx!tZeCln}rod`8C12U^Shk!^P+t@{!LZNJ(?jwjS@99A*( zQ&%uXn7i%T>0!4$@#8LQ>2DQaVZ^vqK?_!dLOxNpbw=T84+tw)&f|qfBu;Pdndzqf zX_JtiU@K51turHX2|%?QA{VA?B^1(It!){^yxG6S}_3Q{{TAn2{EQ{3d1WH8w-b>Gslpcw=bkUPXd zL4OGQG2ZU$EhDX19g)J27IH3|t>^*fK*Cc8l}G1p`pO(0W5nEep~#uGh{>{&0O}t% z{Kz(|`Zbvk!~~5|N!QjaWuVgu+0dCVpJ+q6>S|SQcf_280VPFRBr6~RjK5!^B)y45 zPaKiVBFk*MCsN+hnkz#q6W>%(G%Udq^=j2OFfe2@vcm+Kb>6Q!F^$N2A`;GfQpdnK zy#--X&=N2qAt72v;6DppvE|3Ay{~}PU6;{$hNAV^iMorI0fZ=qJ%T|}EavMCiAa$V zYK=Li*P7VNgGxIr^kjjEvW7sT-!17%tFBNit1Use15+?G_Gz59;-)k0qOWghKs|A1;3;wFMbMG44{MF~^GI@*3UL^GQ+uXla3 z!@)tH#D+~P<~|cm-KvDoYgW%NI+!(|>LM4CB#lP6w>gNkk%v7%V(Kx5#HtSmU*QOb zwFq6lBiTwf{{%v#C&=blEtGap( zSc0dZM6P;=Ev}lFqGNdgQiKpE)=cC$2nMoJ8&@Bsyjy<|*H==b|42ADy(qWuf3!PQ>8ex{OX0^xf;S zperb|XO-(>Qqx95-^#FOGgZ+-Bj{m zs8esLXpM*7+IdEs=_BG9<~dz?%PPiBNaarGsfoVe+6iCDBpNjnf@}|JNM#(sOTKbe z75|e(d=r^XL?zQA0-GSpd(Lcs!l25t9kU&N*kw)U?*Z=^Vi}_Itli*>L}5atN9!UQ z2UEo`VZBmy!Uin-xXO?TxDu;GB|V+HFIhh@a0O_+EP)9HJW*m3g~`A^D7;_A)*%0D zvSj}X4`So=DMrT3PF6LoMbF@O6Geq96ky`6D(tD3oh;9*8?~eK&jHEc?(C7+^$^cF zlL>nXq90i+WaOvdr@ALLPq6pQGLQv`*vNG45S#=@>p+^M9q7lhU}}T!R8(u+hGUT^ z1jq7e#ZSaLB4!{l{Rea#{f}GqoyI)C^TrEF8;m&o6^3~6l!=9oJG<3$f)Ggampv)N zAVPB zSmxQ4Ww;5#(UTjKJNOhluU0}h0?P(hVS8QLfcVv|;ah-3r5>nwDTIYjY%^4Zu8fUW zxz~*KA`~BNDU$`oLkhJ6FmmItU^}v3TiD$k-VkG2Lr(%fVMb`Siu*h{*?@mR7Mg?H zCL4KALSwcQ{er8yVtf6%hRM-RjQT`u9SG%#yQ`O%$&OXwH7YH%Eh@+A8a4z1Tx(M0 z!6|}&5q6evMc6x%TgCeaKf`o%N#c$vmR>gMRg#`5!76Q}htL-aHIdokA+yDY4!nSE zSy&2Ic@17S3TCfX1X6a{NF5dKSuZ9852FBItU34mMOD}htWYP-7Nphu>{BRk+)!b$j-(unhgZ+JxtZC z$?d`;Exw*0Qut8>a>0Ki_q2c=CdMvS$YE0u^khnAV9olGbRPZeA0U^l&i9C3Og$=B znOKQoqgKp2mh^%oX8ToNW+B?P1sY1S{`%|@!H`P8Gla-s3G%|G+uDQh4NMw z7_^t?h>IfI3b&CE=;C`= z)5mO>LNDt^;(R&46G1Z&C&h40CMrczS(;H`EO98sH|r1tl!%2A&syM&XJs*c&VXUH zbTf|0);`n}k17Pu_#|1mW5>~OzM?MG<%@O$UH!-U8D8rY>M*aJ5W43%zwE2ljMN1Qe%oX$UKHxi@7| zA*|N+%YYhh6$Ed|Zfd+bMK*<)atkXY&pKv~ZC`mOmfc+;g*9ReOESrv z(@=m(VMwxQgxz+4Ue6%M@G2qxl!k)Y??bsw%K^2l6w+{OIIl#;1waR6_`cjXH%a zy28ydZAcKaZ$peF1#)z0Mvp3~DGuomFhMNA7qoPntXxl(zxh`ZgCN`)jUfV*DKj#k zO+uqdz zR{a)!04)4Lr3h#Q7CYWBf}BXBEMVy5h;mwc&*mcC5*zV@dXTq>!LT}c^F0T7Ti6bS za^#U)M0Nq-j~9?5KJW2a@*d)p-wDHh0D5MmtzKU;$cO`D)hlJk>w0i`P^Cm7OXz8` zb@QP1VKMm-GhN1NQ`Ket2xUUPWyWdDh@&JZL~L)@eM#E9WV)dPKPq?V^Kgd92z&F! ztDrB7+nYpibO`R#nmM_(9CNcjd~e?q8n#P%{mnoA@e_E;v?O@pQgI;GlZYo(4e4_v zaexNR_4qTivEo4(jHSX*R!T1TIRheaSj}0|rLjjr#J?;^hm5xw;LQ5{>@Z})7RKOJ z_<(|V5vXLgHmiaOMn&=w^~gjVGUc@yv#6*-O^mNfWYBODE~4pFWw9djjssgY!%%(d zX0cx=HaY#;RgkXiM3P8{@tvBuY@1Al-6f~m2$d1nzEWiB$pSVHF3lXrCg0xQE)u@| z-PdPbN(&BQp=VZ%O&Y@fa9ARr_f6 zI2s-qvb<+wXQYgkBQ^g|T=b)`Tz!e@}_+ zleg{EGX6bHw2!DRjr1QFs%mYF17pGGF4R&Syri)g9~4We){6*df{Ea-_HV~1R?}Qg z(=>dcZK}wAkqljS&c>@m{h;hugs^=QWIRfgp~{C)#mf{L*U>_dj0@PFP+~>imD6nC z@_)4#XWRMxP!xB}oe<7QHMQ`AJgd0kWq$UivU-IaJJQog&@=r593qcsTp(7MoM4=Z z9&~jcYlOTF%PN9|UlTmxBodco{_ws(l;jK%OQh#uD~cOVd{MWpYkeg_7IS2y1-Qbb z^F;|F0;VZHj#Pb+7D5}jppwKh6W!EH4~9BbAL^KC6(xJ4Q@ygstjSB%oxs+XBBs5B z;5nqo1yuvb1%d^36u&?8!BSj$Z#5~L%=VhIj}aOn&Wc={0)(iw6LC>3F5^m#))C+$ z&wa6%4|7?YpQH35Y`n?Z7g8;RDVA4aJxlU~S2>w@c?;ZVd}*M(#yjbOLS$OY64>t4 zolfr}I-8f^Q-l}CG;bh_n6ZxT<&%#IH)?GFdv4Y*!6|g zUP+pW4W~if(ZJAQ`955M09$fY-)BgDSVzo_Eix<6Cm}jNg~JGE7pdu|y6m^2)kxCR z4G|&!Hb_T$Qy@t(S7wquK7yc;w=F!R5k-9Xu1&JkQROS-#)nYFG-D+zRapeUz;LP$ z)_gb$Z2-LF%bum+jc~ah9I`&z~s9G*_9F5hg4NIh0xtG4~m5 z1-}r}&QGaMy(VKt)#(SioD;fq7$`XsFb*0}gpr9FuqDY1?#9GO0-Zv6I^Q+5(qQOXV)my0^V4CF^Z7c^QtVls# zRPFy?&zy-+Yv8|EVg*huOMS8SNDq_g0DeLJ)!t=|gl>~ZL~|zbCvQydL|ZjdVl9|S zj7$kENl+skh0F=0caXzSC(~&nN1Y5l zPLI=r9E1`6*Xd#EGo);}s}|qZQVpO{BVxU_uC(Ap65xJM_)=+3L+zOu{R(C=Qx!^* zV_B=Z2QN`SOzzBASV#tvsiUgZ1&J1%(sLqRhu&p+bz0GpT-YH!YK7#JMy-wlnA&hz ziBi^#&5NS-K_v+k*Q-_5vSlXjC{pUkU?8v{6_)T(v5Jo?rzPyi!51AGm?!v=auRuB z=?%o6meDRc!T3w{#+aSujuicpnc+A+Q)!8$(%HCXU+&{vOiRIFj8Z4J{^EtJMC!QG+^)URBLs8lu z(C+jkDGB3A<)5&30UUCOO3409B10k%Sl$8cF`BbK=QUV(sIY6(E6_r&B=Vi;UvbFc zA{F9waiM;U4x?`Pk1iM#$tl~6SCvw07<7fC3{PU0P<4$r-&vC(>bIt3nevSW?@~=?x z=P}Id0P>=ec!4AW9T$}d?v7-_hq*y4p%glZ1=7n)C(?G!3PZ0+v(>&vB65v}Z`9XL z#6+&Hgm?(7U5Jd5;9~+H`~)N^(y&LN85kTm#7mB|7?@*_d?zUw7Z(n*-?6P&OBEfFS12PQB3+eP+a@g^(@|K$=Z*W&+c4VP z$|0CRGH$Pk1vjHd4SHcblyXJx4+Qa9voSgEBojb@bDN1&*)d?KFbZbmQM8XB_m`Ed z!2yG$9mGVt07^aYVNDCF5Je6f2)KR4OS3J2-_U+quE-e(wkAMh9MqJsnbQJBk0E~+ zu7qDm-HtfO3zk&;Z(kmivRG0fxTRy&c{>GdtXz)7z*PIdv|`_c!&y_wnwR=8><;jHg-kTLm2cG z%TYCaV?Y@!&O*z0DT#*ET1pqSRYb&qgo@-`Qkui5&81^Ef0z#f>J z(W(PcnTBG$&{vNS+eun4t;$(zH?6pVDRyIRP-5*%=N9>9A&DvKF!Ng_oTwEe>ohtV zn|{~^7~CexTC}n{(Q(1F)B38N>-wVG2fNgW2hF7_XGg=ELkL?|j`R~*!vCWM$Icv8 zVRG(aeA^?HLy1e5`n^VceS3<>(1PD<0x6AXhe!{{bPPEMl`1yebyZ6OII#oi?T(wl zBq;=AZ=dqkh$gk^S}gAY#<_4Wl$)i&RKs+q3ySWzyZLk;%9c|26F=(I(GM&1GBaAj zb6L8acj;j}ayh!s9x*}pJA{y>HbQeh%(Ibg0v?*=D0)kQuBJ*#<^Vl`nu|YM6pA7^ zK$-DAftvfdm2s@9%T`U@w&_AzqVWPRh*UUv&)yp5fLxmQJjy)MnZz%Ln26Z2 z#0P%N2Vsr}4rqSFj%tQa7Yv(m;hg%eyu0@tNl5!%LA0Si17JcFX)~sYzCv1r6YmI6 zYVm`5T8yoqFYGMlWgeUls7{jK#sml2!5WvA-hjrnUiu)s>D$ggvs#ZM9Tn09$n}Pm zlct}>d9@c)ZWrb_5VCWo87R#)`LYSgiTQK~n~@|9q-I2#++w>ina$EnlNPI|fviC- zM(72Xgp8c}G z@RLd&VUkGuf;lJ;LGhd@Ab;%RCpcLUBf+X;r7<{0rgH8rIoSmQ&MV^nE#kyV17uC-S2E7L-PG?q#|MBb(II8r%IFHE&4zZXM z;6qNRP@HP+SmPq>F%5H4!@4_8ANo-b9Pd3^_Yrr~x~&e^$ek#@^vw_C@%`B2yn_st z@kMZ`V;&)1dr13bOGTOzxMfyf?`;v#D9v(kM~-T#NMPYzd(Kq zIWKOLDZCL8Vp6`G*#~OIMGmcf^LG}eZ+;rX@D?_vPeR;PsI}qy+8y{Od$hPt#nsN0xSwX#|=U{nc;%paPgno4n_7630L@B}d z8t7oU$;YA!&TXVw1wVG&o|sYLha-fu#Gw@$t4lES%x!yZ5;og=$mAH5x!vHW*#cr4Rn;}*%;0!Z z$EfZHrxCVFYj{GSn8wG&xl~J#@zchA*D0kT;k~T}Wp(i+$p907Wg40F$lniZJRqIh z!Ex=G@3I|TqgLLW3m3|)Esj3$T!5{rZ3ZW?+DFFd+T*&~r_ZV8l#-#N>xO1yGLUMn zVApUlemIJN&>bLBZdAlJt~Ozvjqn87caUon4b7WS3d-gU&aRw@_<_$6h05C)VE4*( zSOA!F?UFh@Ub`1kYA;?-rUK$vSyG~)?Wvl#Oq@k;aAx+%L88D`Ju4UBxa$nI$-y+b z0G|m9+GIhtETj+s-e0Uyme!U*O>}DdCHnuEVu?gKJb99oPy1<;*?GgvJl;44HT*WN zVQ+h4yeBQ#IR$?jqhN5w%sl}51>b_}IPd(j!HI6_^gW>&;3wBV7O5zb|-3Rxhg^rOp3u<(8+R)7~KpD1V zOb1FjECb}BS}OI>*a=BR-GQe4W?-M)_{cL)9M8l zC0q_31~86Wp`1im5ZKD-Z@bMvY`u}t$H$~7jE#5HKg!5McE69Bh@D!(jR`X&CGVPq zs>cSPIU%eUxe^!) zOorgEPUL_!#eP{pg)iR-8}LDKnnP~B@OmXY%xiH(F6^Ca=|z`bbwUBtr0vcAH`!0@ zm)2oINadb~16qAmf(cr7P`wOm1~~i21xNpO+`0r$Lyb{QAAXdMwo$u;uboVjBQm>e zNDN#knM=8f2b2URcliw}l4AGctXh%W%%qe%OiMW|Ipk6VDg;?f06(< z30MjbhBvX057gnq23f#T(!dS#g0rQA(L-qgG9e#^2}>KeMF7v z_w_STG{zSbq4~lWeu;-u1<7-w*J_wm8E988r`p88J@hYwGcnah+-a~DB;u^MB7B}q_Ys)kj!jdJ}km-!ES!E}P;=y@}`Jahc{Aorg z9ovUl0=;hxislnA%v4FPQ`~*nxHs0Jb=0#uxOO$zTZG{Es|{C zzv79EId@S?7>1La&c#8%Ts@A&MRO|*&kPn9na^bpxU@@g+*ffjQI{Sekn0JU zV9uEF-?^y28x1DbmcO9t-Fl6Zs{^xH{cT8|BQ8|yGjG~v7;>MZmVBsu?t4FFNDoFs zs8eXt{UgU>x^7eNvr;oOaB@q3|%WbkAhhLfUQvs938gI^m`JT6bBaU}WF zWZ`KnS}J9}X|_@$hi(UoR7`#U+o{(S7@o&z!Q{r-;3i|Pg1H-7!p&jH^m8i3fm<3?@6H^(!eVpC=PR(>P6P&Bo2Iw zg%v)$s&hu6cY>T|9uuTV$gbr_Lc!}GRKTf*k@lQRduN0?F~TyAYlQIwn0nZhIi_j_ zsqP%V*ifp_vETf8aer64ZX(w<%x9m^$lVt z&Pr!M%n{R(b@N!Lie%uUI35nOLd8enf)qv3(p4moLTq(J5MhLS5`_tq%g%lbJ4{oF zWd4FgIxHgy^RfNtX;Y?dQ}BplD*z@Q{%cGuesE!k%xESh4Ck>j-4%+#hX6*TWpxTl zQnG9g!rNl=G-7}Gn2P`=jf2N}E6wmt(LTXpO-nrrv~!Z0krHklG_6TdqYK#3bEk0^ zSh7M6W#OJ&EW%K(n<5R^_L&r9iP=oYtlVHsDwJzEEUF_trWY-;Etv+8I>_w1p@Ovc zz7{>9p78X*b>{YU&L19=Lu?kL)xoY+=k?eConWAa(L%o3H^AlN~xPY zcg7wYktcaN8TLn~OR9&YGJF~)zO-ZaMQrOf4)u!j7Q`}$j?Sn&DOfMD1Zh}~dfE%Q z7&={J(j3pxG1Fs@Ue4OrpJAB}E z%56z0`HTfVPbWQ;3d2skfk+EQv|7A#CiQa#kM_+&cu7Y6kh9)xLZ-gY3@A%tlLbH%kV zg=AYWkx{ywR!)Yndz$I=2i3t=Z+^JIaI5?986&#y8?4yA;xBXM_14>Oqj`T4qR4el znLYFVA&;}`c`}ToGZOnT0()+?iVcMid9ey*`F@LIDYw0!Z%2rPy2ZXBHgx*ki)enz zXB)hr8LIfU*6{|uwX7|+ec5IHJ26tJcQBc25EAesQhcWvA{Bh}_?oJhgSdPe{!sw& z4Kp5oG7c4anF!Q!059gmeRrLFy9%~0dGr{e;{7-_fkF#ruy_)lrMF1HY!j7lMx~hA zrJ|p!lUQIt8-M0UR|+4x7+@*5;GAe!H(+9^&h#~E!{)Jcn$epdFHq4PtxSBEVg?Vg ze(CcR|Eog4U{H=nq*UKjB4I?vL4Lw(qrsOav_AFdXEj~~-)cLV*k~rs<%qLh)8PxF z4>)LV%<&RrPQ|B1`hy7+T&NRT=njOe@pZMn*80%g{|l#^nvi(=k?Vn0u9336WSD>O zx`K-(MFa`7iWjXPm+mT|m%m-uJ4ZK6aR2VoZ!e9)BS6!sZxKpms}3M*bT$3J7BY-! z!I(exsV^2XpCO$C!0CT^z#-vyunx|L3T;2G4-=AhMN@=sUaeXTQ7?9G0HqWW;)NU? zB_)4DM?Po5TZE4qiA@Z2CwV4Mo`f5jjLOCXsHvx;<6is|Rgb}fq4LXw;&QD4_10i0 zA(j`09bF?_nGvog8rDSh1f{K%yYhE!5>>@JD%ocQF9I^4dX%0p-Zgz`Cv zF$A6xVxV+DHzv}}VPRab*#%Fqc83`Crrv21isfUgP3^N3ei4p81^CP{_!7GIsy&79 z-~x$a{@BYG7U?f=Ggv0bC#%ep8-CC11=7b7TDb4)`LXn?R)ZW8vV-l)ZX9DFBkX+{hjEM2;fRkb$w4~#nsX;bP+qFJH`qiPPs?( znHT{Cczvw51Pg!Hwfi$nkWMQpuRw>+ZyOfj&8<>RdSpuLv zM!1OoF9xcvls&7@j&V$@vX)LzG`9S~-$-Z;Vp_|#F3~^FgOkPlfQ?=}6=eeZk(fzh zgT+G9L2poOEEpmpwmVA(^q~CA@<)qF+mFY(9{G>xlJEJ%7YO5jALYAFGe(h=b3ORd z@~=>N*JP|J0Bw>%((n4PFYp|{O6;{A0~@Rx-GbfC@Hg-@3pjpFJc}M+unZq8@oS~VAD+CENfWA?rL`GB);IM=dAlM+m%0M3)@tQ>z_a;zwc+fCFg(D zayyYOy=)4%Mg}Dd!-+INe(|eLCGu9*+2y(YC#KW=N;~ipwQt}1RrY<*@3s1}jlp&Q z623P+xa6Yq{-CBDq;KeWM)5@}Ico?0g*N=0w&ADVjX4M{#5xLTKRO$>o1PzfHW$Yc z5YHLDU9~}a!8hr!H!hYvU8hW?g+J=eHE0lTvb_y`wV0s6Yx&@36jsu9HMYD6xu*;- z8x5~}C!Qcyc*zgq@=2u@+SLQ8Ws@|vV_C%romp}Rb{OTeuH)iOl zJ6M>z68lJGa=_obg0OSwiVmTKx9N7PS1BNbe1w)Z`yJwqoG-NDGlU*Kh9SJI1n56k zpSC&=C&Hcxcv^e2W=kYwwxiJWTbnIk0Y+JP$M&tN_uoD*;`n3zjspYKbFjfq$YLV8 zSk`|`LgA!>%*Cdtwd7qLF?PL2NrMKg<7W{3C;eP=&P82ta7l8=_trS=g%LqeA+qruB4b~_=URFfxGePZQ@e%=UghW!xv;t2>M8^ zTRJX`#6)^QGCOP+zfA4_&?emyiDb@DBG%N%WIFw@*IwK0WbiL{c7jP68zP{&wn!jB zC|f$YNF6kU(M0QeMCzb>DgB!JZpggKHlvsSAdW!6oNIU;(MqQa#?;PUxT4K z+;fBaVQ$Dm5zU|6#q(zWny~!3eB6~6n{Hdu<@`TTO9KQH0000802(|^TU>t9=aw-5 z06L!l03QGV0AyujZDDRLFfKDLG%jRmb960fZf0*UO+{2eL_t(R&3)Z++(?e@eLn?5 z7spmaS>5iQ>Dh5lbVOMyw`)h1w36Ij-yN!$C2`FnYe|;m+NVGG0AwbTMarJNI*OQ> zwnQe8022Q|esFzW8HPi*W&x9&350G_YZyc^7NP=%HFlkWjD>bf67~z zy=!)L!JC_9%X)Q^{o|qUx80i`e_VI#lcv4@@%Ome;?cGHhQ3yI+19n2vhQ7y^$lTZ zyU+5v$cnP-+wyMLyNsT_qlGv4W9hoMO0&-T2U?*LdO_u$BSk7 zYvH=`zIH`ekFek8U+A@`e4p)`UCV$M%?5wz9{h@oR!4|;3R#xD-GjUPHt+gbT<)8g zDeKlaQ!~|=Ae;H3XZL_&=^UbSQwBQC?>2~xAk-v4DyrieF z>>H<3XakJwu$c!~o2nn_afbYhDq5v#T*y6+azqt!YL%>eGX(vnN8_ z*5zLSE-)70o#9WwL+jSAZE>~;(@LuuPFPrK+tS_%rc3(lI95_F%o39I4|xxe!*UP# zqp+M|Nh2XdFdV>}y;OE-@6+Q(D{ZoJjZb7xW%qDA3!kLDtsEqGM;KdS>B411KOpwr z^(;)*32aZqxAbeX1fDg=B!EN9fNKcWl|YNd>a2E8VKIh3(h2Z~Wxv$TQ&_)fur~7` z(P2V9G+3&4t6u2O^1EXy)=qG~ZQUbDOyM*f5W;QY>OE*{H!0te1+b62`=XDqbl9~m zj&jTUm8VWvJ`txhU>rOMB8CN5uI=ee61uxB9pLh=tjZolRI-dx*J5)9Fv_*%a5`i~ zxd!XMIb4^(#P5I%%Sbqqy!TNIzN2rrulZ(M(f6K%tlNIl z)%h6P(n0MXvi^yE+MIL@N?q!nY8lDvTnX z$nH|UuG~EdEw)ZNHj>mlnOP2?Wq)Mpu8cRyMS!LVyMDp&sOWy-x668k(Lg9zk-Tq7 zj=Qhh3d+kIMWJZx#H=9!)IxXenYDOVi4;5$0Pcv*MZNLIqn`0Vbi_09^R4^uUD-ON z5AUxekr5Q`og*e|ztFGp2$~4JVkTT6V3w?R$b8y>grsI+h|$}5uQ)6+(j{aIHoK0t zYc-%ihT{b>Rni0D`=fZiX*P`Hay6n|Ak}35S-zqNSRxQ!d#HZGPrIwbQit0e2p_yy z7R*vNtlQI(+0fdnxDuh?wRIF-cQ}I0YPD-&n90Y`Dg|W~@L-i$0cKSTG2F1uVJVfhz)2MHw9SM7-3oZuZ()#Na?-iIF-g zY04V#&oT!G%c~H2 z2<9Vyx_=30VbYr#UpRy(j>M7LxSX&P?15KRNhGfFC)H=-BGHFaUpw0L@N8!)8tDkQ zO$nrv2!XOE<9Bj@F1r%K+U>!Y3$WxY;o;M%?@p&hxuT3R!S6Q97C8Z-k4i+LD2U}c zR=wE~nJP#0)RDg6x}${jN70x(BFOjPMk~W`5b>OstDP=J~l}tNUi*y#Lpp}3T8w07RA0`t(lYG zihngbBfbpwpIG*@fE3?{*a?b*;OrcZ1ZhwDXH_y+TOYfu*PyCnl^_hx@_5BhMq1OM zBz5%_HUa&gTkU#{*+GUy14@-d7L08?1&6DA%*7J}?XPtIU@WqzsvQ{-K|Y4X5;^&j zkwMEU8WLf7Jo5~fKjvk{po^0hvBlC!91LRY4mK#Mmzur+*N}+~yW~;aP&%?tuBs*} zNH~3T!(#^d0U4#%SlA-VGFJmE{glx`t#^Bwda!UcvLRk8Ve13iW;LNTXXiusB4_&o z1_Nx`sB$9>YS#le;T(7%J^3FU{3;H^iIb!uSJ@9?aQuwa@%xWXKFq%$3)+EBl8C9-kN@B}|If5HYhI&688+2})AUSV`B z^o0t^TKt`;c)Y@q9k8oUYPobzO3)B&kBVs-^(6q0bR&zU69bIEkgz9jo*0O{qe7I< zmeozvvGJ^v#MsRwm?9J+LLy!#B9K?yILE;e2=eVharV;HX#;*2aMCY4^ zo{y0fMh|NY6^DMQX zFY{x`a_}mJM^;UQCHbZFHS!vXLQ!fT^8X@aoszh1>X6O~&NZZJG_B}E{CHT%yvDNV z?wB-n`v?V5i_I$vLtV7E0S!7B)E~eB5k;(waHx2C*&zcmp#@lDp@nx;H+KgLRTZh| z&=`6Lo)C$Q2JHZnqVJov^&l-$hiowG#uB}}KRaO@y^dwXw zs3SLmEPxRD5l&uZV7r`+6nQwVRf3K7$FN)k0iuvnu4;FXdVClFPFcCuyN82tMNG2E z^K@#X_>et0Qe#p6LD9j-(V(HWL8xo?JbRBz(Rcc9>H>n ztSJ+&1^$SOL=7D?;8@juoO2(I53NR2$bn+~lkDI2NgRsvkWHl_glKmW3%zfi5EYrh zEGQZ$2g#ptzx<2nfepn36JZ#<=$l5IDE$MSu*ld+y3r?f{Ml$VDqx%d!ang9kj|;K z!4@C|BHF?tsW^~boD4D-V{|vtT1_Nlcm+Q`TbC7EtzEN%#Z!owQ0mJc2bnb`lccWP z@Gwgrw;(mHXq9aLzRovDP**XNP?a^p%iZoSpw3%Q!K?F!k`ZsCy&ArbHorGBkToS? zuz~f4`VKZqcC`ui3(jphN*)%Mh{8JS)L5;nop6m zCeoh6bN0s#q4I_Uyo?C(#t&giJ{$R*KmV`6nu?5}yq0*QQ6$Jy{{%ZI}M*&Ee}omp*rkSMzHi962Az&fX0KQ`j5dfQs~8Bx)~ z3LGDc!)qJY`w+i}2MHXqwcuyuWOX5k$7!uyU6q^Cu9fDRyi7cd5@?WvoK^D2gxd6Q z&BlWPEXE!<0HXiC+o$MatDqDHkrijif;niCE|IHj0&wuS?03ETRPiIjeUm{`H&2x- z?w#y7Eaub5>ujBuk`sqVzzmCX`6roeih5fI#*1Bq)-A zYci-slhiJVvlQYYmc(QdRIopDrJ=9oVc4G#rPWds8|xw_R9u27I&w_VJNJ-R>zT?G{*}bM2)8j5A~AS?He&(8dzRFLNl0zvX!-z> z#DJwh$$bNs^_5?M0+Q{Y!_;%Gd^e zIf0z>dCrfL=ait&wFr)PKY;9`<{nDb#3phstBANYK}`}%*?L!zRa7xw5`ymaRO<6^evR?_`n6ZhpO#mb zM!@w**3sHUv+X(Noc;V0>Pp?_j+S}-_rL#&GadCSDH6EUoZ#>*=#Pe`=s3cjpi6VV z!@Z5`Uakz2gU`|{mHkr7@{|K{K#JB*5HqmHNQdvPG&*w#MuO`A#~`G~7F_bGjS&dp zL{X5N(XL8nOjR`_W&$6gP!ZG&xZZ9p*D9Ez>{b;r^4K94FZQacS&@6kkgdq^)SGp; zIbI;X75&=P&=MSEAXNqDY0M>I8*nB z{ORj)PbHB2oF-Oo8I z$A0PQ#%Gbfm6ZyNAXS+7JlBSTf9pp78_GG7!4eaOSfY3Lx}MZ=b-V4hf$(l)AUzgS z#ag>j(Ee(f`h&Nz)x-Joxk94>ciW8JfkUCz+%O<~5bG(`l22aNn4u2_+f(92nltBF zO)t+fe;GR=njUwWrey}{tfGH2wqrv6F*_X+6^9YEB82Zvkbd+KgsRNa_&N9~H9n~Y zcR3e0KcbYDyz+5+W!c^T3I?t|O4bR*)MM_WoYcgz<8vv`b^}`wKY#PCk47ChHmbXp z6nmEWu69`!y$C^*?i?GThVc&*GjEPK-R2tyNZ(eE@5QC@ZVdG0! zh|X!#b*}RjSb5B~Pb|che!Va5645oYa${gR1u2*ETp=VN^~B6Q^U{xZW7VlT?pnpq zQIFYx}A$fwxvm`j`#Zq<%CpEEBz!u0(*|aTd;3YWVP_m~|Uu zR-sQr7A-DTau5^66WL=^?KYzINg_5a8qu0IEr0N)lqr#k!tE%(zsJErJxS?z5K+j; z={r+x6HO-Fi8Wn|XezT&B2~BqP-3_?2j6+o4T7I{jzkntrqSS7&!oW=acq&IuGz&O zBez8u3_riqm>XE-QkHH+0_3B$!VYULqRr(O9OcDdt?h9^#-N%V?})hHX>+6jzLCUD zunaqsEH@`CN`d#ZY4raEZt_$}w}>y*Vy(|I)^=i* zlf6PF7|t*1a`!H8C6!_xNi7Q#clE~qR9@)U^ z*)&oOrBPBk`dw3NA)gfZco^VY+Z^V=K8#V|;Lb32qBSSBWvCnYJ*NyVQ|>F$q|$-8 zt8UcgoVJ|xycq3~Mkg%kwKC2SdYaF*a{p1Ix1)fM+0J=|mJI0|FFPMhl>|+*TIC&E z!V=a%00Egx1iGZ+-^M!d4&})^Z>axzH*J4T2%SewqhAht=Y+1uV)6^dW7f!U(RVSBdf1Yo%mH*8T6y@F0t9nZvf6sr zN>p9AOcZpmN7dm=TKWDJz8*wa3>u|{g$rgFvVjNbKar|{?%<5fCRsB*_);-0;-&6hfdpUoUCYe$3}P2PDImr$$?{NUdKjfJ zg(R#Fg9?oGHXTleRL68llwsV4%rZB5I(Hl|-#XX6>YG>ie<|w?rQn_-$$HpXSxbCM z3Jx3>U)?jSqjAtH;OM zl-Sb*>&*t>?;-hU!*Hc$TrFZk9B=$+<1i-0MI^n0;J7;|%qi0B>46A;raTnMGx+7O zDUKLaW5IB(dAHk$6UmQwhc;BE#@HfeX)tz(yd02$r|#&C+rmUtHd;HwKTNhoz99=F zTKx?U5Iy(MRE1A+chM5?l`o;BhmDr1&=y3}PDG_V%>mWi=2f7&9_8k6{^)&pA7!oQ zpEsWeE34G9@B|5_O`zG`_3K^5^{rjZ8WKsH>QU&j&L0~tduK~6zxUm?w$gPF>g}UC z<{Dd55(_tXmK`OCO!|l-J@#9+$s4JvCUyE4bI19E15dl5Vws=bu|NuO3wpxeUwat9eLuK zwKx!E+B#$UG1yHoc8VRm8bKwpGT}o4{;uXvu#JS@(08@GJ;@ldwFO?~Aisovoff_a z-0B|34(riU>Ln$xvSf+M|Lw~&?NK(B;~Uy`QBODmaM5_)7o2#9 zGQv$h(S)#EC&~5tK*ZZrg;!?k*#nHU9KcpZu662&xc!zYu}0H)Wzqp|eD6>kA?85t zKW!v|R?@9)mLN6(CpJ>T6(|$b&LN}QgUPJ*uv^#f%6=d0|EOj;!osC}FGs`sDa0Kc z1@tfSK>kM?Wg=jss#@@p=7~J=Ib?q4Z2ThzD8;;*I@1`Lw9^E!%?yReBgYt{{9BWG zAc`A2Qa4g~V(e^MrROGdN%q2s-jAK-0nZC}X~Ht03>R#N@?o1yFhN+92+9XU7hYd} zIG!vcwfi*w@f3;Z)}pBpa4N6p*=2 zicwiBv-*mqDT?1B>|YtNiL zky4X<;=Ph2pls_WMh~rYAoC(2)+WA$Id^`X9ATOVNon44*vm5A$Pxwepg>w<7YvP$ z6p*sL-yrj zlKb}QNH*Jz)RNjdX`YW`TgZ)(W?0*-Wdp8BEt)y$I$eojk=XS?uQRHZS;Oa}dx=Mr zGfTcp%l34HdJr9N(e_>vu&WjG!-h>nVZmKB-;#9n2$uYWynC2((*9>QIVhV$QM4#r zkCySBeRmI$(kCzkN zrpWeD-q>HF`QGMf02aLur(I{9iU0WIH$LcSIysKXJr3y^Sv?93j}H~$KGWJ1jlZ!6 zJf34t>#Vt~z>ogo{KshBTm0%oU2P9`;LcEA;_L@b`Z+kmyq`A7YLT<8^P`=NY#?v} zch{*y6P0j;6_EtjCdJh22(@DrPEd=GLf-gHm9viuBZf7mM5f);m zzAa}MFdPkziztc^cR{#}PL8tk67k3pTs7F?6Ik(7HV6HH4h1kGVW z7enRUx>%py`q=qF)kd0!C$5}Yaf>D{f4A*Mo2GjU|_!4sQ>IOD#o zLl7jMk-_%j#F2^FW_~DE*lQeiHi$tRj6U&rfX+n8Ll{s1%fq8%#WL~Lauyt&iq zp<+^ip?s_iK-T$2{zJ-;cvjjNB}2@|Z)h3-cg*99g(yglg1HA()Gax&K!?=3t9!}m zyv=~O@uWaGi?2x#LM?N~Yc~zg+Hy7uaW-{QP91k{2I_eh7-TX$G52YW8?;cDpeK9j zr;H5PB3ZEPk40L@>|2g{@jR%FnmG)f@x}&D!+J=odT*as%R)*sN7oO-SjZr4xRYy; zZow}{5j5FdC(?URoII?;V_OGdGP1iNr;juhW>lcI9I*Ka9I2#0+{)*ELx)IAXnA8~ zya2r5no)Iry>(PdOPYAUxeB!B%0G>PlTFn$=Mq%#jzOM1v%#pK)E*JSIqq7A&37=J zI>2iJVm_H@7G_IL3Yickh`lz_qMG#hjG5lXei~D(k=av>j1&vmc_L=Uc3LrnH^+7X zKR&v#4crGh_>WrfIJK|mVr0A>aYqg|^^ET~OL$7guEN?1Mb@DJ*)})NxO9$C#grQa zvkneMI$KN*pf1B924zoF9ITi_!%_#y$;7dl^x5VI1+wPcHp7!V^MZzG zaO!Q|Dpa1d{`I^wPF?IpkQfw>g3U)NS~QMD%5ro+|8~L-YFSI1Z0r$lDs$g^=fgqL165!r=E|E3}iypbg;W^vw1l5xcL)Lv`;>Q7=1bsFRmb>l_9e zHR*fxY$E(&#=X>cm{ifwV9z)P%JDA=v>d18@kK8o6T^XJa$c)Z`# z78QWy#vRTF4@zHUCVgs>1O0rFy-pJee!ofTq}zy1eXE@oD#XBFKvEGJr#8&%73qUq zT9(2Tzvr@{$F-_iGt!ktL%2(H41p{T6X0@wMlRvxfv2Ip8aj;k}0 z(VVt%1{z5uMA|O%oaU6CtHC%4rxS1_0wDt>&0+Qv`O~QZBScFlO(Q5BW=P6t1R=)c z0F9XzIXU@WGH7l^cdcz-l05F4R9RYF zK)Dzev0_as^w1;{9zcC0M8%=L@_l=fW0m5e{R^HHU+^>t2`6%K1$mF8dq6-;usw{5KJPsUZWKD zn{JNAcOW50TDK0SPxH>7`V-(ZT5Mk8TQ7M zM$18tuuZ`=HH&m_F@dRMkT56{zE2APlcp6;Jin504Z=s<>A?Ty=433+Wp=K zi=t~E9W8w+Dxe}}HD{uINz6&r;Vf3TC)a!BmEKpg;p$S2?%JWx_+BhLo#^g-{rV)k z8jk6=B93c1C2HTaN4|1yV8Y`}hfE6h);$wO8W=HVKy@c2<2tR3+smgm(=V3lDi$$cB-2afT z)L1mshM^%Yod4_0YeWpw=JEr>N$e<*Fml=TI9+DWXc~QpylA^2 zs;Gv!udESNOoGS>>106fzyS3!X>8QV2rMFDqSas$8obdsd~l|W&{RipN?|NG^XUl_ z>CizjcR}y)Sr_C=$hzZ4LSsb|qDoSS->@bYGOi--&KSKp$KAqsDNIpss{&JOgOq%g z&W21vI!48%%ss)|Gus0qqtCdm7CfN>NxHsR3W*4cV+&{+90*xYSiqXacw|
aNbjm2T9IbQ~2) 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 IJdS~Q0B6I;_5c6? literal 0 HcmV?d00001 diff --git a/example/my_module.py b/example/my_module.py index fa889f6..ce8a223 100644 --- a/example/my_module.py +++ b/example/my_module.py @@ -116,8 +116,8 @@ class MyModule(Module): def flatpak_packages(self) -> list[str]: return ["org.mozilla.firefox"] - def flatpak_user_packages(self) -> list[tuple[str,str]]: - return [("username", "io.github.kolunmi.Bazaar")] + def flatpak_user_packages(self) -> dict[str, list[str]]: + return {"username": ["io.github.kolunmi.Bazaar"]} def systemd_units(self) -> list[str]: return ["reflector.timer"] diff --git a/example/source.py b/example/source.py index e2742af..473dc9d 100644 --- a/example/source.py +++ b/example/source.py @@ -38,9 +38,10 @@ decman.flatpak_packages += ["dev.qwery.AddWater"] decman.ignored_flatpak_packages += ["org.signal.Signal"] # You can also install them to your user installation instead of the system installation -decman.flatpak_user_packages += [ - ("username", "dev.zed.Zed") -] +# Ensure that previous user installed flatpak declarations aren't overwritten and they are initialized. +decman.flatpak_user_packages["kk"] = decman.flatpak_user_packages.get("kk", []) +# Now add the package. +decman.flatpak_user_packages["kk"].append("dev.zed.Zed") # To import GPG keys, set the GNUPGHOME environment variable. # It can easily be done with python as well. diff --git a/src/decman/__init__.py b/src/decman/__init__.py index ede1412..7c818cd 100644 --- a/src/decman/__init__.py +++ b/src/decman/__init__.py @@ -387,12 +387,12 @@ class Module: """ return [] - def flatpak_user_packages(self) -> list[tuple[str, str]]: + def flatpak_user_packages(self) -> dict[str, list[str]]: """ Override this method to return flatpak packages that should be installed to the user installation as a part of this Module. """ - return [] + return {} def systemd_units(self) -> list[str]: """ @@ -427,5 +427,5 @@ files: dict[str, File] = {} directories: dict[str, Directory] = {} modules: list[Module] = [] flatpak_packages: list[str] = [] -flatpak_user_packages: list[tuple[str, str]] = [] +flatpak_user_packages: dict[str, list[str]] = {} ignored_flatpak_packages: list[str] = [] diff --git a/src/decman/app.py b/src/decman/app.py index 7a5271f..3edd658 100644 --- a/src/decman/app.py +++ b/src/decman/app.py @@ -238,6 +238,7 @@ class Core: """ Run the main logic of decman. """ + if self.update_units: self._disable_units() @@ -305,16 +306,33 @@ class Core: self._remove_user_flatpaks() def _remove_user_flatpaks(self, only_print: bool = False): + """ # get all users through a command instead of pwd because pwd also lists all 'virtual' users. add root since they can also have user installed packages - users = subprocess.run(["users"], check=True, stdout=subprocess.PIPE).stdout.decode().strip().split('\n') - users.append("root") + users = ( + subprocess.run(["users"], check=True, stdout=subprocess.PIPE) + .stdout.decode() + .strip() + .split("\n") + ) + print() + users.append("root")""" + users = pwd.getpwall() for user in users: - currently_installed_flatpak = self.flatpak.get_installed(as_user=True, which_user=user) - to_remove_flatpak = self.source.flatpak_packages_to_remove(currently_installed_flatpak, as_user=True, which_user=user) - l.print_list(f"Removing flatpak packages from user installation for user {user}", to_remove_flatpak) + user = user.pw_name + currently_installed_flatpak = self.flatpak.get_installed( + as_user=True, which_user=user + ) + to_remove_flatpak = self.source.flatpak_packages_to_remove( + currently_installed_flatpak, as_user=True, which_user=user + ) + l.print_list( + f"Removing flatpak packages from user installation for user {user}", + to_remove_flatpak, + ) - if only_print: continue + if only_print: + continue self.flatpak.remove(to_remove_flatpak, True, user) @@ -373,16 +391,32 @@ class Core: self._install_user_flatpaks() def _install_user_flatpaks(self, only_print: bool = False): - # get all users through a command instead of pwd because pwd also lists all 'virtual' users. add root since they can also have user installed packages - users = subprocess.run(["users"], check=True, stdout=subprocess.PIPE).stdout.decode().strip().split('\n') - users.append("root") + """# get all users through a command instead of pwd because pwd also lists all 'virtual' users. add root since they can also have user installed packages + users = ( + subprocess.run(["users"], check=True, stdout=subprocess.PIPE) + .stdout.decode() + .strip() + .split("\n") + ) + users.append("root")""" + + users = pwd.getpwall() for user in users: - currently_installed_flatpak = self.flatpak.get_installed(as_user=True, which_user=user) - to_install_flatpak = self.source.flatpak_packages_to_install(currently_installed_flatpak, as_user=True, which_user=user) - l.print_list(f"Installing flatpak packages to user installation for user {user}", to_install_flatpak) + user = user.pw_name + currently_installed_flatpak = self.flatpak.get_installed( + as_user=True, which_user=user + ) + to_install_flatpak = self.source.flatpak_packages_to_install( + currently_installed_flatpak, as_user=True, which_user=user + ) - if only_print: continue + if only_print: + l.print_list( + f"Installing flatpak packages to user installation for user {user}", + to_install_flatpak, + ) + continue self.flatpak.install(to_install_flatpak, True, user) @@ -444,6 +478,10 @@ def _resolve_source() -> l.Source: for user, units in decman.enabled_systemd_user_units.items(): enabled_systemd_user_units[user] = set(units) + flatpak_user_packages = {} + for user, pkgs in decman.flatpak_user_packages.items(): + flatpak_user_packages[user] = set(pkgs) + return l.Source( pacman_packages=set(decman.packages), aur_packages=set(decman.aur_packages), @@ -455,7 +493,7 @@ def _resolve_source() -> l.Source: directories=decman.directories, modules=set(decman.modules), flatpak_packages=set(decman.flatpak_packages), - flatpak_user_packages=set(decman.flatpak_user_packages), + flatpak_user_packages=flatpak_user_packages, ignored_flatpak_packages=set(decman.ignored_flatpak_packages), ) diff --git a/src/decman/config.py b/src/decman/config.py index 5bd2ca8..78719db 100644 --- a/src/decman/config.py +++ b/src/decman/config.py @@ -65,7 +65,7 @@ class Commands: """ Running this command installs all listed packages, and their dependencies/runtimes automatically. """ - return ["flatpak", "install", "--user" if as_user else "--system"] + pkgs + return ["flatpak", "install", "-y", "--user" if as_user else "--system"] + pkgs def install_files(self, pkg_files: list[str]) -> list[str]: """ @@ -102,7 +102,7 @@ class Commands: """ Updates all installed flatpak REFs including runtimes and dependencies. """ - return ["flatpak", "update", "--user" if as_user else "--system"] + return ["flatpak", "update", "-y", "--user" if as_user else "--system"] def remove(self, pkgs: list[str]) -> list[str]: """ @@ -115,13 +115,19 @@ class Commands: """ Running this command will remove the listed REFs. Unused dependencies might be kept, but to remove them another command needs to be run. """ - return ["flatpak", "remove", "--user" if as_user else "--system"] + pkgs + return ["flatpak", "remove", "-y", "--user" if as_user else "--system"] + pkgs def remove_unused_flatpak(self, as_user: bool = False) -> list[str]: """ This will remove all unused flatpak dependencies and runtimes. """ - return ["flatpak", "remove", "--unused", "--user" if as_user else "--system"] + return [ + "flatpak", + "remove", + "-y", + "--unused", + "--user" if as_user else "--system", + ] def enable_units(self, units: list[str]) -> list[str]: """ diff --git a/src/decman/lib/__init__.py b/src/decman/lib/__init__.py index 6b8c6d3..8e1b1e7 100644 --- a/src/decman/lib/__init__.py +++ b/src/decman/lib/__init__.py @@ -36,6 +36,7 @@ def print_continuation(msg: str, level: int = SUMMARY): if level == SUMMARY or conf.debug_output or not conf.quiet_output: print(f"{_CONTINUATION_PREFIX}{msg}") + def print_error(error_msg: str): """ Prints an error message to the user. @@ -43,6 +44,7 @@ def print_error(error_msg: str): print(f"{_DECMAN_MSG_TAG} {_RED_PREFIX}ERROR{_RESET_SUFFIX}: {error_msg}") + def print_warning(msg: str): """ Prints a warning to the user. @@ -50,6 +52,7 @@ def print_warning(msg: str): print(f"{_DECMAN_MSG_TAG} {_YELLOW_PREFIX}WARNING{_RESET_SUFFIX}: {msg}") + def print_summary(msg: str): """ Prints a summary message to the user. @@ -57,6 +60,7 @@ def print_summary(msg: str): print(f"{_DECMAN_MSG_TAG} {_CYAN_PREFIX}SUMMARY{_RESET_SUFFIX}: {msg}") + def print_list( msg: str, l: list[str], @@ -116,6 +120,7 @@ def print_list( print_continuation("", level=level) + def print_info(msg: str): """ Prints a detailed message to the user if verbose output is not disabled. @@ -123,6 +128,7 @@ def print_info(msg: str): if conf.debug_output or not conf.quiet_output: print(f"{_DECMAN_MSG_TAG} INFO: {msg}") + def print_debug(msg: str): """ Prints a detailed message to the user if debug messages are enabled. @@ -130,6 +136,7 @@ def print_debug(msg: str): if conf.debug_output: print(f"{_DECMAN_MSG_TAG} {_GRAY_PREFIX}DEBUG{_RESET_SUFFIX}: {msg}") + def prompt_number( msg: str, min_num: int, max_num: int, default: typing.Optional[int] = None ) -> int: @@ -412,7 +419,7 @@ class Source: directories: dict[str, decman.Directory], modules: set[decman.Module], flatpak_packages: set[str], - flatpak_user_packages: set[tuple[str,str]], + flatpak_user_packages: dict[str, set[str]], ignored_flatpak_packages: set[str], ): self.pacman_packages = pacman_packages @@ -638,7 +645,10 @@ class Source: return result def flatpak_packages_to_install( - self, currently_installed_packages: list[str], as_user: bool = False, which_user: str = "" + self, + currently_installed_packages: list[str], + as_user: bool = False, + which_user: str = "", ) -> list[str]: """ Returns all flatpak packages, that are not installed or ignored @@ -653,7 +663,10 @@ class Source: return result def flatpak_packages_to_remove( - self, currently_installed_packages: list[str], as_user: bool = False, which_user: str = "" + self, + currently_installed_packages: list[str], + as_user: bool = False, + which_user: str = "", ) -> list[str]: """ This returns a list of flatpak app ids, that need to be removed since they are installed but not found in either the list of ignored packages, @@ -697,29 +710,24 @@ class Source: result.update(module.pacman_packages()) return result - def _all_flatpak_packages(self, as_user: bool = False, which_user: str = "") -> set[str]: + def _all_flatpak_packages( + self, as_user: bool = False, which_user: str = "" + ) -> set[str]: # loop through all the user packages and save which ones are owned by the currently selected user - current_user_flatpak_packages = [] - for pkg in self.flatpak_user_packages: - if not pkg[0] == which_user: continue - current_user_flatpak_packages.append(pkg[1]) + current_user_flatpak_packages = self.flatpak_user_packages.get(which_user, []) result = set() result.update( self.flatpak_packages if not as_user else current_user_flatpak_packages ) for module in self.modules: - if module.enabled: - module_current_user_flatpak_packages = [] - for pkg in module.flatpak_user_packages(): - if not pkg[0] == which_user: continue - module_current_user_flatpak_packages.append(pkg[1]) - - result.update( - module.flatpak_packages() - if not as_user - else module_current_user_flatpak_packages - ) + if not module.enabled: + continue + result.update( + module.flatpak_packages() + if not as_user + else module.flatpak_user_packages().get(which_user, []) + ) return result @@ -956,6 +964,7 @@ def print_highlighted_pacman_messages(output: str): # Break, as to not print the same line again if it contains multiple keywords break + def echo_and_capture_command(program: list[str]) -> tuple[int, str]: """ Runs the given CLI program and arguments. @@ -975,10 +984,12 @@ def echo_and_capture_command(program: list[str]) -> tuple[int, str]: return (returncode, output) + def get_user_info(username: str) -> tuple[int, int]: info = pwd.getpwnam(username) return (info.pw_uid, info.pw_gid) + class Flatpak: def __init__(self) -> None: pass @@ -988,19 +999,28 @@ class Flatpak: Return all of the installed applications. Dependencies and runtimes are exluded since they will not be explicitly installed and thus flatpak will manage them. """ try: - uinfo = get_user_info(which_user) - packages = ( - subprocess.run( - conf.commands.list_flatpak_pkgs(as_user), - check=True, - stdout=subprocess.PIPE, - user=uinfo[0] if as_user else 0, - group=uinfo[1] if as_user else 0, - ) - .stdout.decode() - .strip() - .split("\n") + uinfo: tuple[int, int] = (0, 0) + + env = os.environ.copy() + user_env = env.copy() + user_env["HOME"] = os.path.expanduser(f"~{which_user}") + + if as_user: + uinfo = get_user_info(which_user) + + proc = subprocess.run( + conf.commands.list_flatpak_pkgs(as_user), + check=True, + stdout=subprocess.PIPE, + user=uinfo[0], + group=uinfo[1], + env=user_env if as_user else env, ) + packages = proc.stdout.decode().strip().split("\n") + + # print( + # f"as_user: {as_user}, which_user: {which_user}, uinfo: {uinfo}, stdout: {proc.stdout.decode()}, packages: {packages}" + # ) # The header might be included. It might also not. This will make sure that it is not present. if "Application ID" in packages: @@ -1015,14 +1035,17 @@ class Flatpak: user_facing_msg=f"Failed to get installed flatpak packages using '{error.cmd}'. Output: {error.stdout}." ) from error - def install(self, packages: list[str], as_user: bool = False, which_user: str = ""): + def install(self, packages: list[str], as_user: bool = False, which_user: str = ""): """ Install the listed flatpak packages. """ if not packages: return - uinfo = get_user_info(which_user) + uinfo: tuple[int, int] = (0, 0) + if as_user: + uinfo = get_user_info(which_user) + env = os.environ.copy() user_env = env.copy() user_env["HOME"] = os.path.expanduser(f"~{which_user}") @@ -1031,9 +1054,9 @@ class Flatpak: conf.commands.install_flatpak_pkgs(packages, as_user), check=True, stdout=subprocess.PIPE, - user=uinfo[0] if as_user else 0, - group=uinfo[1] if as_user else 0, - env=user_env if as_user else env + user=uinfo[0], + group=uinfo[1], + env=user_env if as_user else env, ) if proc.returncode != 0: @@ -1045,10 +1068,12 @@ class Flatpak: """ Upgrade all flatpak packages. """ - returncode, _output = echo_and_capture_command(conf.commands.upgrade_flatpak()) - if not returncode == 0: + proc = subprocess.run( + conf.commands.upgrade_flatpak(), check=True, stdout=subprocess.PIPE + ) + if not proc.returncode == 0: raise err.UserFacingError( - f"Failed to upgrade flatpak packages. Process exited with code {returncode}." + f"Failed to upgrade flatpak packages. Process exited with code {proc.returncode}." ) def remove(self, packages: list[str], as_user: bool = False, which_user: str = ""): @@ -1058,7 +1083,10 @@ class Flatpak: if not packages: return - uinfo = get_user_info(which_user) + uinfo: tuple[int, int] = (0, 0) + if as_user: + uinfo = get_user_info(which_user) + env = os.environ.copy() user_env = env.copy() user_env["HOME"] = os.path.expanduser(f"~{which_user}") @@ -1067,9 +1095,9 @@ class Flatpak: conf.commands.remove_flatpak(packages, as_user), check=True, stdout=subprocess.PIPE, - user=uinfo[0] if as_user else 0, - group=uinfo[1] if as_user else 0, - env=user_env if as_user else env + user=uinfo[0], + group=uinfo[1], + env=user_env if as_user else env, ) if not proc.returncode == 0: @@ -1083,7 +1111,7 @@ class Flatpak: stdout=subprocess.PIPE, user=uinfo[0] if as_user else 0, group=uinfo[1] if as_user else 0, - env=user_env if as_user else env + env=user_env if as_user else env, ) if not proc.returncode == 0: @@ -1091,6 +1119,7 @@ class Flatpak: f"Failed to remove unused flatpak packages. Process exited with code {proc.returncode}." ) + class Systemd: """ Interface for interacting with systemd.