From ee62e61b060ebb847d220accf6a4776f81448c15 Mon Sep 17 00:00:00 2001 From: Zacharias-Brohn Date: Thu, 19 Feb 2026 12:40:00 +0100 Subject: [PATCH] scheme refactor --- Config/DynamicColors.qml | 2 +- Modules/UpdatesWidget.qml | 2 +- cli/dist/zshell-0.1.0-py3-none-any.whl | Bin 1018 -> 33184 bytes .../__pycache__/scheme.cpython-313.pyc | Bin 9057 -> 7504 bytes .../__pycache__/shell.cpython-313.pyc | Bin 2166 -> 2184 bytes cli/src/zshell/subcommands/scheme.py | 150 ++++++------------ .../schemepalettes.cpython-313.pyc | Bin 0 -> 1388 bytes cli/src/zshell/utils/schemepalettes.py | 30 ++++ 8 files changed, 83 insertions(+), 101 deletions(-) create mode 100644 cli/src/zshell/utils/__pycache__/schemepalettes.cpython-313.pyc create mode 100644 cli/src/zshell/utils/schemepalettes.py diff --git a/Config/DynamicColors.qml b/Config/DynamicColors.qml index 03d3bc0..284a2db 100644 --- a/Config/DynamicColors.qml +++ b/Config/DynamicColors.qml @@ -61,7 +61,7 @@ Singleton { if (!isPreview) { root.scheme = scheme.name; - flavour = scheme.flavour; + flavour = scheme.flavor; currentLight = scheme.mode === "light"; } else { previewLight = scheme.mode === "light"; diff --git a/Modules/UpdatesWidget.qml b/Modules/UpdatesWidget.qml index c7bd498..6fce70a 100644 --- a/Modules/UpdatesWidget.qml +++ b/Modules/UpdatesWidget.qml @@ -9,7 +9,7 @@ Item { implicitWidth: textMetrics.width + contentRow.spacing + 30 anchors.top: parent.top anchors.bottom: parent.bottom - property color textColor: DynamicColors.palette.m3secondary + property color textColor: DynamicColors.palette.m3onSurface Rectangle { anchors.left: parent.left diff --git a/cli/dist/zshell-0.1.0-py3-none-any.whl b/cli/dist/zshell-0.1.0-py3-none-any.whl index f7c525e9eda8a6711dfdbe1f5e47761b8c002591..e410d026db65fa953cffdc186dd4b1b0d9e3a7ef 100644 GIT binary patch literal 33184 zcmb5WV|1kZy00Bu-LY+_Vmlq%w(WFm+v?c1ZFg+j=(v-d%(dp)d(FAu^`3n`)TkQu zp=vxe#`Rpk8~>7%1O-C@0s?~idJ9s=do~oHS1{`0#wS|V82~K&R zSj4Z;XVwV|9lJs*mA^-^Nx{Pno@@Gn3CUCxHCO4nNL1c(D3R;8jA&%;4fI?Gn;@dB_ zRA)jI^BQ&s<^CHu^kJv3v9bvJh@C)kf4RKPU&b=5pO?k?`S{D_S?inI{NwT@smG?3 zXB0;!Xh-O&73l0td&Qj_gIlS�fEcj@ryEh4Q{R?-^2BVnCz3GN_hJda54ld_SFFS;K}$`3pl+{~z|w)Y(X^QI z_bS-Zi^}xOgb-m3nfi|9)6)^lInTeMsv?M6^<+fEJUjA)`~fLSJi#!&EvXqk1YQME z{?fE`Z7Kd?b3rHwLuwFbyh%+DTDiIdF$agp>+*2b&sJ?8X3;^1d&r+|W?=~MgktGl z^Cew6t4`;M9tUQ1-O^Ozx)6z6FwQ7~8{YYmmDA&2R^QoRgU~uUIyYmse#3|VW5-YWOLlvgbxu4dgzRrdMa>UK$Yvh3)aYAPra`wCpp4ABww?31 zsV|B95p$@ivNCX2m9WjI?Z(+?%HpT2lUC(sk`V5^w`qeh>(r{z=qpB$% z=1+kTQDdpFx-pAnd+8c*QQT&#DYJkxH%5vbtfd>Rg+OsFv>!vyZZ{s>ARB(aod#2a zn6zM;-4XAkWNr@*eyzRuTY=?k)sd}@d-XT6-!v1^B&)ud=q!Bv^`<}jP+%H=5F)EpVj`eC!L_7EM#w3^l;RfIrzlym;!$7-X>N1{G zTZ_3}CspOcU|HJe67qanGzCANA8DSixTo#rlQlGsB+fKiG!xmMGR8O#5@6CLH407< zkIU;y{?*!v5$$k%zO#!K-$-_^rp3nhWbFyoq~Y)iKrPN4R)8-BM#OJ`_*)kv$`=Ck zU2zQy9>Y$qr5yhi?|pr?Thsj;9Kp;uA+_hY#+=|BylScm1ur`knXrC0eitEW@~TM( z4bLGz%C>$WNW?gQ077a{MnsEodbbI}G9Bdd`rEnOWROLa`IIKx7vR;kK==20_NX8T{Dvin?4@7D{Cct}>7W)8*7n7@s4sRAypx z@zD8AOrDLg&@#qLZ`@olJSei!r2V5($EVH`YzqSW&5Q661Iv*6mNY!JGU>2nyNRr| zddiP;hi{hDA51?{J1dK#cFN-npw}XFA~fPl%+Nau2lg{3wHUL( ztadRRjs)aDFvE{X5aWyhRGR%D(-r|P*Zd7o(;`~G-;{$AC#kPFfI(IuB#;@ppRbDj zHPA1v=3rRE|ILVaEtW*fF~B%$2-BNmKQvmyeX(FOt8K@bq-RXJoIIiYvJiV-q62L`l^ayz%!xoq0Rkj>6|?kWdOpPA5s5=0o#wT zcIIly<}&#{w$S|MD~eXodLFPB{Pk%v0$WMRkiAM6Rb}$;fo0P8e@EZq(#` zxcMW&@Ck1HPhO0+QwNLfd38FFb^P8_uk_n0=p(=p%dyWp+{rE?`ZQB@W24+gb!(U0 z?36Q0958E*Lg3ULKkWUaxU5Ci@<&b8JzG&D2Uce4FA?XG=l_n#bBwBIjJ zNXh4bYv`eS(VB&gVeBpYT^PB(cO~MguNY0B|L7+U&!afub|z2d{ooRc8Ta?uJsMw* zK?dlNK3RzJA?#55p{lT{(X!KSsCqA9T?n&m8>i*?;Mr8xUR-wd&G&wKH|KWG{X~WzUWRhic!f{FzDQI+c{|X*CNkwSOLW3!MyCePn-}on{7}{f*_l$6cRg zab!?cXGpW|Y2SeRmSX?YyOTp;u{$YU%o+0vqroco7fr#sDZj2%@QUEnY3e4v?>TQP zvuW9<-w+N(y?u|NwPaF`N+~SHNi82G=npA9bcJfz_joH?QEWfggMI8IX0eWqtmU-b zNZeun?MNJmvN^w^E8${UudT*y|K@PZ5slVXShczq?|#CvSW3i2+7T*&DjilDIJ^4k z-IxcZm)U8WucFecS84LuVhiWt?YWCYfn4VH8xlct%tfS)FdDO+l{4%PCzGn8?BX;= zKfQQBz!IpRzCR*^!iGARzKj*x_*A@;RcTf!zxEt%B$|(rF}nMX}y#tEZlQrjgo<<-E05Cl$lrIL1%e3FE5- zTFF3oVDHoCe+vvxg|NQ$J^$X6W=4Drwp-JU1#XCb|K75TM4?Xa*@y2nHpQQRT%^&< zcK(wd*EnItlFb$NK%zRJXx8Xcx{TXjlB3a%6QL>H$if@k7RiI%&*pLI`p(&7nAO8e zLAQD23$XOh{C-Hb=B|OccLmtCY*s6`b$dLaOh8~`B`_AV%pH(3Ri(MCroE{Y;#rS8 zpa%fVM<0&LO#CkefqyYiy+*j^5zkzW$fA3ww-5lBC%$Kzy3EkihiomP8xe!0XfUtn zUSgXs2y~(9-*nuvJzBg&{uNo4?-e(?eF zWCQi2nXW2Ec*8<8?uv}b?W5-MP(cC$Jx4Kub3WWrEl=ys!`6y3!}K-04ZRRsq%dGI zvzqK$2)_$uUIVkl1moy4B?oEbb%u;{w_Uoo3qVfVbhXtwzx}3}Yh!J&$oycB?k_|P zgw|@qdJ)>;2L{!aPGRIkRIlq@did3YGxYGpi>z-SB-I7?cD{-?bk$FvY9iGb+q(92Y_UP9G`SvX|VS(u5*SK^W9q=558|Nq4f<$Rli_KCWhz_Bd4DQ`Xeo z$KD$d^NH(Y)MSpJO26?X1EfJ(*rM?hl7)vWuw>DAbvk$SID(2R-&!KjBhAohhm2yd z(8si>-g8yaijGE8)CwI{CAV=fvr9c+0(%xGaQy;t@8PL=|v1EaKwG+>G}h{IR$gL z?4<+v?7&b#)-wBaW?%n6K7Oz_G-NJkz}*#C$9cnjj@|`;MxM!sSSSw96( zU$w5!Nc+=l^)kZ~A_VxOZ`y0E z0aulZ<#fcOp|ZNmF_z0qN@v-3L(T`AKoT~KA?7hR;PC7rpPTH&z?)w+0Kcn+l!|fG zFG-J&PW$_#vYvv0Mz>~bLT*ys`zA-tNDwr2pO9D9ypxfOwwF78_K4RRWC@RpPcvUF zehZMsf$Jh)+WWux8E8!~ylWChd>+qWUY5*b3 zNkQbpmIm6Hw^!2y;o-h+vtNp3D^(V{gc-O(HSbnQR`;sROM#3@>vU$7`V+9m2O1_P zlC;=Yp2bSXa+Rg6JelE8ZLyS?p};)|=*Y(VdQs8Z)bB@}%Y7sFC1xvkvQZ^f350=^!=2~OApDCTJgYFIXqen1aM-IoGxbkyWgC?*?g<8pEGBXHle zN0fDyDOC0_m=|R&Dl$UK6E^3mQfN|~hDj?H!ol7axT0%?J8s81W@M)IDEzZkJRcDI zb#rnYhNYgyhm>Shgdo7V$}6Id0!WgHY71Yi>6ieanpo6$F9%gZbeANNWHg9+wa4NWIG0dEO($)3VQ1IzHBFf{u+20o1fF1Sp zRt6Jt8uv2AjJ8m4wlUw*T_t!|C3FvWX_C$n=0ZY)USx4Z!bTjAeT8qd@L84k>EJ7u zyqz>uQvL0X%a5L>53d{JPySNEL`mYeX1YgFW4~-NeU41W1@Iz-UjCMME!De-g#WMd z{BIzwjg8Emt^W`=r5wyf%s-n zPOP%iXqn@=*_HB2kv+*~22;{T-uz93Y_%3{eW|pxT6q(|$mrat-V%_DTK}->X2(9X z2z(iS2U>3)K4<#KZ*x`_kk@yp`3AdYGr!VR_dfoM{+&-@k14?&rL#fWVr@i0dAKy# zS)6a^0W4^R_Im0e0(AjC15GG$^t(a#bnRBto56h}H6^4?f;TvZAi@S?#am#e1X};F zhS-uZgkeieo~)Fui^(|Mo;6HO)h4;1+DReYgYx*g+~aG4F&rc5M;8LO?zqSayP_a< ztjCReu8U_A?k@q{3C|xK_f;Rjr>DdWP6X-EByKdC#VWK_J|eg=UowK}>LU!LP@XR! z*$1($#-rz{a-HlnL{2-45%9vdQu&;`wqMrXm*0N6!_=7co68QhnwCFVx)j=J*`~5A z{tl2h-j*;Dsbc0;xvU=u_f}ztt#ayyAUHW^tHnHA;Mmo0|4{@g$8EnUzzQ^(FfV=v zspke_Mu^Ejp%`a~22ZdvbwG#jtY8B?(J<_g^4-=R1@%|?lUk&p!mRCSrz&wcyID$$ zr*L?{4RqvA;i37iv5BZr3qJ4SJncKkZp)I6n_gF-qkNV{_IH%c8cBJto5-&tEL{Ef z!QAqA6?*V2bl_K|Qk*YsRqRGO?5lp;yd29oJ+)lPq;F@f*Nc`e7D(mZs(d({f$^Z2 zKx(hfN1xf*2{vWi^e2HV{0oV`y1NJ-_9u^l*eV>Pmf)W}DnG194*}!U3NN81O6%E* zXgVdHCA#!P7&0ii`B&wD6qlJ8*lW}DBO{N&xY@%6OG+CkPIMinsSV<^-?Z;h$mxH0 z8u27@3#D+P*KC_x5KE#b9jZb-v)7MF$ zg3-8}sAbA~8|AyAP zi~*~mYE+=UD638q>Ig$+7)d=pys``!Mv4zYpGv#YLNNRu+mV0!Zkt1^82)DTSZDh^ z3_%$$ejQtVE@F;4WSLyV;~FI)yt@uL{?K?Anw3&~jT|s#_oeC(J1G<9ejiOl9t(Xl zj&-U2oZQ|&sFS?{XY^M@r+qwrgFZ!MAF~9IN{0}84@OE44hf$wN_bf)$yDWeP@WdU zbNPo+zMude3cH)Jh(2a~i8oVjO|(C|=dRDO)fOp$HGx)Um;2sX)wU^QIQgCKmLK8> zqT~K>cW8gag^}iUZ4d&QeBl&J&RJMr#WRY$&)Hwp6NLUCq6BkJ-xaK)ZO=9~NnFs>ljrgmUNSqbu#k~^u1NS2+8CZ}M zXjs57l*Q%0))8ofkJ=l{2ZoP4(NSbCnUlQ6c_|nN>x+NwNZbs_UN8A+gASM<3Cq>#xBMV z23F3FX8)6r@#uU8q>ejOPY~9_xO_qZ>I;c>1<~)??xEzhAY@Erfall7UTY{L6S~q< z7gg7tVd=2s(&27w%a+C8r@YhY}G>_UVb@1kX9B zmaO_6G4dUEJ6wwX;+^6V=2~$?Zl?G56>S39g2Hls2m<60XXT` zE$G%5$|mYCQn>@qdD7PY-$0C3#3uvyPgNgBzvGHBbLJc?GY>Ei-MHw7BHDjF!hR2t zf0daSs=x|^CUq&x&)9J<=uY6t*`D*I-!)Lh0U^B7y7yG>ukH4-uCbemIw71e*SUb= zr+|jnT^^0ZiSiN9r9LYHRcvL`uiJ2Gm2QXDBmZFU6K{L6N>jWEa~w#rn-t1w$ZPM& zY$ml5+6yhtOrHLf*ZPpkE9QeO`IfJ}GvS`dO0)Ec@{UB57!h$AqXwSn@o7}8J9uu( z04WJAbyP%FK+@B0anc#FscSo6G=r1$HK5+;sG27maJAAf;C?%y5fnee?at&-cr#J0 z)FXg|N$Wu*7R5bHsov5S@0QmLW8LtiM+@>n)1#LOezQB?Od?fJ#AG_;KMz*>25oN~TgPIb6X?12FTo5Q?KR&cVW@B3CK{>08#vji zibo?)13hZKDPfA+ibCc&`91HC?g-6&g8-if2HT`kjDwA&uHIN8^bmi7z3Mq39 zV?43kXDeliZI!|DC9p~zmil(eXgjOyq0O!1N)8bCkfkb>{#)E~%gx8TNlz!R^<-pE zXVofVo9n;LA|eXzv?ur#h2k*M?#7&@ePR|8jH#4^jKtr!n;>8$1J@qCHlBR(lf{Ke&^B*X^AXFXOouqnLe z_hXCHs0HSBCPC@j1D#HRax6GraXm`Gcjyon6;!Dw88Bk4u7VwALHYBnZ{OQP^$$() z7YGrMZMO>#5LzU{`!Y;!#5GPs?A3xjS zi;$lX2YyxRhj(Gr$VEUk)e3pq;mwteu$C4+zZEw?YS z&FEchkk^it{$_3w5LACYkM)~os-FfDiZn?M6LQmu)O5k2=Dnj-dC#CnELT@qPCVYt#*V~}JuG#kIutpvH8w|*#^G&0v=Ku%+PzeAp@Yp4Nl0tn0Da+T}3bV3`nEs#(Xu zPS=i2v$ygP#`>71jhbE|fweS}H3aBZ1cq$3bs55rY8XYd-)m`0aLdz0ed$@L!SnNh zg~FZ0dkv|pm^A_aqSofS%tzv`V*~#6sP9a1c?sOe&KE7Vos+^Y2+1Ky?pT8G+#+`b zRfw@9Og~Roc(wNB{M+=Cv2TpnknMFh`CS$W(inRuL*spa&m_D2tPbi(J@W%z!`Zz0 zQh5iIM60#0lL?N^p|7kFPPLR=Pq7W_2bV+fZ>dQ|hqL5`*6nXxs}e;jpyyfAQmeh7 zR>*`sCqdteu;#rm`ifRZUIzFzeXWVWh6KWBS)8YXYf6Wrx@R|MiouCm0$30x8p|%L zqq*l@(A5)7eB*vFo7ZOM!b6@)kp`u^dX)#aFM(a?umCp5nbNR3RmF1huU8ulT()YP z3g?Wf8}rGwo7T76+a2(KM*Y420D+jSJNYLU|9PbTZ(RJ3fHnRH85@7-LoZtrPasL7 zG|6GX`T%Kb0A@Lkv2}85$#>X=z<7`YkiCZ)Gwdn=Nt5k!*+Q-mf3>fEmkrBjSzac% z`HgdG>I%m}2~uQVoQTBBl)j#G1T-d29A^D$;wNw^)X?u9e*-dC8;Xd2_8Xa&c5Sd9 z%PTQhi8*6?6?Iwxrwufn_FsRr5c7u1V-Evib3T0uA3Fw;B0WB!dSjQ&BY~_tlrk6# zed_HVp?JH_K`Xqf;4Ryw;XRk)wbw?TT^KCXTdEP~nsnP(aQsgmalY2m1Dcjw0?dz(X@*iA0eR6SWt%3N0$zY1#bNm^! z$j*nS3SxYra?_t; ztIw&O@c>vfQ;v7L>LLU)mdwx49P)3*Y?X5S&(fuLqC^+bq-QymH@8pumhlb4m`dl!GJu?%N}+QBlb-VaFaHBZ)U+p7m#NaSg`f*9)Bye z=I&Yi0vD-OQ$Qt<6+&21-bf=0R{*}u>Ay3Tw2Y&8WCe9*QFf!c3hkAy4+T)$>xoom z>Gt@oG^~ASpA3rd)-XBtj8Mrg=SoGZ+X(4FUv`h>QrM{1 za9ea_KCY#hbWelUPP=+*Nd86|5Um6;vwvMDj)Bt^`#t`%oH(m(dxIGi*dr*^$vsE-fFeeAR4 zX%zOi(72F5Lu^vGd!)rCs*C!^oym8EA1Q}@K_K}dI=NbGm$mqXkj~RsgMov$I5#|& zhQ034VbLPKI97$Za*u!XZR|67)Kg%Pz4c<@&9=~$W9X4`e)hpT(T=7W3lc9WLE~VXd8TKl)38oYk+sJu|VEuQ*b<*O77Y+vDc$~q?2m0PVqh=^OfjQ z?`t#PD>uGew_OXpz;AaiNtlUOSy@e<2_E_))|&#l8??H^VRHXj2~a;HL{`FL(vNlV z1)Y;`Yh;)dxyO^ljh3Ug%(oAB7>p0ri0e4gMpOnUdEU(p-E*Y5q6ev1}t&yl9;%<3h$P^ary)4nRFNws{3sD20Zxu6y3_cJTzcU2(&0Xx( zemdA3VV?KQVv>->qrKiDDA;a0r|EKrz%mE)E%lC|_bsdT#nA^D>cU=mGG_XwtAKtO z?5(Qc)1C!#Q>(4Ry8C_LW>n$$W=CnVn(%fi%r+vMMq$dBrx&~1?O9u1wrw1!JJKzI z)+{#m4{Bfg-MmSM5t=#sHiCU}fuDtBm$!z%y?Z6LI5R6q(kjs({z@yVv zD2KieIMHf~OCxV#eult0$b>W0#H>pVrY-~Nr|VC6OVD1Kgu$3rj1Gni6V=HZc{Ngx zCBnY;E%Z>UT#%vzPsAe2maiX&0Tq<*YG?rMraA#^< zYJHuKu1^*!HpCCxAAj4uD!B38n)-hUP>!}HPXE>x`_GyPul<)M*hwa-jwTpPO}Oz8 z;~&&`-{Dff6ppywmVhJAPOp}g#j?fAT;Fkp;4BDyaS#6{vb8c^fpFWiXQc489^KK2 zpVOaZtF|Du9Gxw3P(Ra+e0_sXLF)H;KGcH!F|>~LpPGpOLlabcBuzEBo%jdx5e9lx z;`FKq!_x8O@Ue~CFp4t!h&Ljl2VxXd`Tbnw)ruDJPlNlz6uczIK_5j6@8qm&CXFN# zr%qL;W)^OACy%Rmay9?*#Bmg&cV(6UhZa96Cs15U#G6P(;h&23!Pfs{yxwl7s=BLZh!pP)%_k0)6 zMogYm(;j~xAj4h%;fxx5dNM~aVF{jz5N0kKLPS{R8?+4MibX(7kNMu@a8Us5o8(k` z75zH*MUi+@X?cAoI~{DX^<~<{%1fB}C7_+6!9A`O4;`6xixNj|#& znmtiVyM^4o`YsQY;Y(Ep4ShUP7piX>Zb(MwHZfi>brRThnDhf*ziZ$0052&UtLc$H zv3`M~lIdrJidM1?fOK;N10_eVD50B~*AJU?uK)BzBKYT<{R9omICJw>VUr6kd)2F~ zzs!RP&-DU8+g0x04W4pi+9&pCAaP#IGm`FbHSBY)lr&D=*)&;JJIQt~mFwrc`tmo9 zJG($4KRq$}PfzSMEk+0XTDSJOwmaA|2K_xkfn85Vx&PTQrv8tfFm-TtF|c*}Yh7Wj zJRW_<3b*k}{R`SdW47*&0;YiUT^gVJ+>d>q3qVMp+?8w;!ox zs3kS=(_U->b350nAIQUDH$C;+Tk2_cMB%^m42UG?20=d{jSXkV2=Nzp0NI&}Zhq^LWoo{Jcr6tPMozg2xvM?NV{JMv^Qi!^W zEivx;UB(!%#VXhLW;U{xM)FhTD6a_hVS`WA-%;7JYxVO^ZrsFii8dzZ*p1dbT$&Z6 zoeaki%na$aMzNEaedSF0kQ#obw_kZ@a~CGube5J2#X8OTTFay%Za#5Xiw}Nf6v|em z+meWVXv&??3{wN^`l)(Z4re%`w0-tm-|dl=i{d>p+&VUm8ZgpSiaK65bxk zUE(QQjVUG9CF59wY)S(9LeI}ooJnOa6K@_(gqoAe!cpWP3OMtRHUJJ*2NLe~P3OqA z>H}9pGYoga2G~u2V(8|%L(J~6#B4J!X_+d<>cwGAmJy8di(yOZsA)nhnN z3SqRpKC8mNh4SgA59R=-QC)XWg13z_vIT^i)~^apg# z3AqZ}Yt*|7^}@&UAlXqXYXI#8HCn}@bH!aa2Vl&1r3uDd$-KJxo+MSFKu?X)RAEFz zLnCUh=|<)kbOUyHzwxG_It63OCpg64nWm>@yJ@itkQ6A0H!Ql{sVlt|s@wN$+`m-6 z7rx{FwZ&{`Ywl_LC&4uTJA(f!Xhd58KAb~WBu-o`u|$xQ5QSw&1QfJXII zf#1aS{Vfm}R9)T9gPv849mgIsy&nJaL)#N}4$PFV%=U#3JyMV96l8%-IF7 z{&`PQ)ggzpGK8wR?KM+J)5t2en@Pl|t0Get+lnUT>zh61UrTgxoC^r2WmjDnI1x{0 z799wUF>*>OPpg^Y5~JiAskTCn9zS?XJAZBLXCMT3zvwdLIlXtq$FI(VtS5xd;{g4! z+ayYi)JyiHkeu%akxgTAZ#cQbSm={-i^M>{5F=fAJu6PEwcx~tAxgmuh93Fa_ulzj zr7SI=`sQqL12=$?-#}H<63LtHJKFIYNICahJ`{RU=Qp@94bj**0~hmMy{)vT>(!KW z(W2_M)5xtmcv$;JZlVprtQN29DGaGo{=4SaNfy*t>N@#@LzvoEFj%Ii{9C#?6-&xy zZ!(E=4U>%@LF#X4Q5(O+?+GKUK>K|sak%^O@4Ke2DY!KB%1`qe?qu{Py-K$=@36o6 z0j>6drnGy}&Z^9dqybANdK)xDz|0;{(>kla(cgO*9YHZ_sN%!64t=9hxEZjO?`T-J zM%A*qPBzbpF^b+X{wjlC)>fi8#$o*9!;RAS41hay0a-A+k{4^)PxF@384 zj3zV*OC^j%X0_)T4y9HgLOCxC;;d$li2)-7kZhs{U3td`DwfGQ7%cDqSov%)fN|5u zX@Wi=ZiiQ(7EAElipnK!b*mEuPT2>%7iMuR_Hg_ZrS{;UTUDggrF3M7-a(Bf07=frl1gw1X;0#^pv_c`@iod7((}3%hK>g!!)un{ z+JS9%J0X|EfW=$(H4p)_jwwJ@s<}4&uKeEhoWn5bCpcg?6R?ODS^2fYxl2mfDh8!P z798L&3rj?wO4m+MJ!HS;X6gw-OQa5vQ^u)sub)R!*feD9WB>YG6cm34p&r`&OnvLM z*->}(pnMVD9@tgGM)vpKw{7+|z03b~d*WZ}{afq8`g42YUu%g@jRnI~g%mZg4Lx)( z8ggHg7Roeov_?2;Wihx%kS1isdw)R~yu#Sr$HKP{SKg zT@W~^<`>-lkT0$3(`@EtYH=<{hqTlJjFQ^uQCCLJiQUuYN1wd`_chIvDiyMfa2y^9 zS>C<^_qC5aGg&3vEu-2`31-qnc^2dQz4ZR0#CPqn{?J=2m$fm-NIJm5})p!%ygVV8hPaGUrjJVyEw!NS5uSb`r+uWRE_$( z{y8elT{w@=zHsfTygQWxUHz2HrPF%KxoEv9omMhWEW~X%87fA(JK`oyH(%?lTg6U2 z!Pq~OFM)KZADqVJ#C?7@TZb582%wdTz0pupqaTL@2Oqvil zX?hr7eUDA$0K*BAHW113FL5^cK*QX=H{*-he!twJh}n^;Gy}n*%S@-#X}>Ya{TwPU zGSl8)q5B3fWvn`b+wgi;7UJ8bPn7_KR?H~11}V~A8u9iX;Hu*q zPPAc_*dh3*J?CC=K@jQ{A)*m>FMeqPY&%t z-eGB1m4BH!YBu5bm`cc%2zu~m#w5xq*KixA`>C%jm0ZW$bl{XZSN;|K8dNhqc-i3*MV>zyNe}Wugow6GBrJ(pt*1zyH?ZH7>{utULLc1XQKt?DBC}YhXXOL z>nN%PURL5HdTZ`oFa%`q1wxl`D_hy4TjMEqUOjrQr^BGvLVFlXbs|lkEVZSpY(8Hi zV3RCZPeLBDKb#{$aB+6l45vBFHBUBYLk@?|INCT@n8PHJJ^FlZ`%@#OkCfRRnzU*KdjI_B$ab0aj zIIrJQdI^mh%E-}*uW8!kQnO&OBr;B9)5AY5q`&dfnLQMw(Y0yh%tV4UmCnNFOM+cQ7)~m2aPGn0FQbH6DM(ar>YGa^@*_^pQb{FD0y%B zIFmFu!W$oTt&3yh6|Li}g}KX4ZW<-ael3~qt}yoPvX$XzmJ)o6p&_bSp8_%z8XQHZ8`7_*N<0M{rzw+mu+5I~Ju zib#Q(UrYqz!GWVR)&mWqYPz1}u^=+5&;`oi4)pC7$K?tUrmTIiQj6cn zjwIK*8FQFVJ}_;rzM+KBwR<({GU2wCUZLJ^Q^qa1h;W70W;krxuxIb}q@t7|ua?Cmk{!vVN;cav zvlchaT7B`C^;0#*ifXPd8nbStuH7YJHiHId_MnTBVZfYze>fti8qfF;(2 zOYuX?FckeJwu|IgEA{k!)%KW7Nd9vBGc{`zzLp2XxF0qwfWsbQ+h)Ba`R zrF9!@U1gZwEbyFZw`e{kxP3YG`Dll{S7!ddSG|8}2L1anymiWd9K)Lcf@TQN z0;Lma)>CI9S@~>?Qp)EUHLsC(t5&0-Nmh){WNuvFYz;OtNMFPA>bx}JhbF8->qH^F z(0P;A%rg|0LkE{WkJ&Up3o7Ai756qyn=nWePkK5E?X{hVt4I<%YrCV%4Ci*c#MPwR z!zgdzx*&ken3dmflAz~&`y({-F^1%Fbjb>n$QuSxKhL@*SaM=?J$CD5LU9UPbk}{A zNi%#I6>c%=Sx5drHzDS>A3sR>EPL$)ub-9p76IINCtHO)!uFIwYsNt_oKV$eMeV%| zeZ?5mua9V&W)%?mTE%FV1gr~k^&otOSXf~SLYXu(~3Y| zFMlM(`e8e%Uwj`2sSavrw`_N{+$Tp)`3C{F@EXpqu-)ezGebeqArf?9^ zuAj&F34pL}C0&vSG>`5%*0%eOS@wL@hg`)9~E&ukO=(hRZ1!1 zGFGLzIIm*k-xh>lV9+I7&H?&Eyzz;WjU{y3eXr{XD#fRut7zT#IGM`Bz&YcFM<{5! ztIyrdEyyxYE48T>icyyi?zRvFI>ONluMg>t4*2DZ8#xiJYWN-1G8bA|va4KezW6hO zsaO?7HO(egWECu6llHGD9k3C(0r?qN+C2bRrSjH12~F=*U;sbQ2KTS#&&P zneYeQUnO zgpDKZ&wE^E53f?XMqF6`q1*VcBJwF+yh1)7k09{T#P30mDOD#PhnXyWXrRGWQ9oc> z8a2>}9}M5pHlS3g)EnGzznf)GG}SE@OnL@%1-p1Ai^Qkp`Cr?gwp(JWONaMMhn&&==f`)1$VKVcNI)#1O(9sFrc2YAWMG>eGkdH(!q6#5xq- z`mN^W(SoniKedO07kg;bjFo~pj6!>r8q!=t8x9=a!wKcutv(m4%E=l9a3yKzB-t2E zE54>LJ{$f~?ml!HS!P)GZ78fND8@VAaLB;*Vyv&lW0uPYml9zo$Sz!mY3Ol!+!*)K(+4z<3g7vhUgvbdB|MdK;8`v zb(n`t9Sa8cd8CITs}PXxYoe3t(1_7SHYLFVIv!Y9IfTisLiVx)$9*?HTUY$Coh-uxDWjgnXv*s*l;S!#PX#sg%B@_=GX_Io zG*Qfj-p}eR8H{J#@QWE?EyA^kdIqU3ET2lyCu@^2S~*jv70C`G)dQeV{tW&{xjX*w zS?=CeUn*bq^&5Hb*lPW~+~uLP_xaZhhU!1|scdXNj|lv&)^+}DH2-tU>m3a4Fpd~0 zKgp#~+x&COi(?=`4Hz3UKJEA0>Nabj(IK<)hLf}Es!O%V@UJ)BX${`!-=7vPQ^q=Q zN4@OV+m4DKPJwReK}8U)61$D_dRSZIIn9<5U|yTmLB|+GUnN!zZ9x=09@&D{U`JoSoL&x69=0?qb_H&(`#UI zqkPeJ@pN5vRw_4Pl7DV^(d{znEPh>_Vc(@JK5*12>Esz^eT921-{)eeqBH8Cczs84 zP;OZ?NgH2Pv%Wh9)9$2fqC+z!2`&h7#pi;wycvwaULv2e`Nw`2`R9I@30uSgkK?_m zEZ&NE?ufX+qNois-g6WTJG;*wjR!#`1ZAW|r-L)`4L={X6X7~2n%?!aKNO~q8Lznu zW1g|{;Q`o)1$-M=5=rr(Hwa~_wLq|$pzA%H!_yn>a;39f3tFFBWng|IO7xP(a)W$^ zQc7Bnz@o+Wj|n?|&xQ)*+k)*qoe|jITeW9Vpff}4OR3K%N%7uU?3Pnz_=oCf5U!g| zhZXH~vgwYka6KAk7A;Spyfs~Xu#@`9Lf;Rr1Dei<4(vHVQx;v0cr$yjZQTJdbMQ56 zjG^}G+&$&O=&`>CMD-yvkFE#e+k}hAA%;LYNCb0KMJE=W0N)M7?`=Gz#^Jqckos}Y z?T)LJ9eoUzMs3-N*Y*CblUw@hpCr_uiN0;H{#k*lqP)#u?EV-tO6tN$KN z{*gxaS>ZbWn8B=89Hi>_0|EZ|rx5WaHu>5vy)O4sA6~~IF3!rY4`^XT(h^6x9KD}m z6jS4~gbc=y@mfQyfUqP~A|C3J)WwvlTh#w!1fzShiLvMPj}c5~LS^k@u(o$duAfa? zvw3)5Ind38@iD!&!RKE$SS`3BLWaPQu3B`!VG^N@L;OgegTG^7rmsd;lyOgjd0uu! zX2wO>devo@i6oB}^ekioCJOZ=XY`AgbRPZ?`I-9bD~WgMQ>Yhlk!fuW0LcB~;&xEl%Jja*yy}I-ps)1oIM~Z+<8+Hi(8EcK?ag}vjTGwpLyVE()1$N*y-VEiIJ`(rF_&=) zx48lPa~y%88bidJXE7|n%H07QB*V^3fPXXBRs_Vz?X?Xt=#por^#7m{N>S4A*xAPr z{?SX{^EvfsX7>jiF`|)RJUggR$HOs{fl({aECa1nenS@2SzIti3-%t+Wtg1&*W~4K z7LZ7($a_@uJ-_Ii-voI}$KLwFojC**j@vg_zF%I${>65AoWujF!Q5l#<%m|A>CO^! zrrMowp|}w+_YO#A>X~bPRe{ZjZFaLAD^N#wmH;^%Tt7QA`VsCxb;}*xcIKFnD98WP z*jWJ8k!@=jcemh#;O_3ho!}bWor8qn?h@P~xVyUrLU4Caf;%B3*gKg!Gu%0ExHF_q zQK728-e-63+TCld|6j;!OFx_&9J2;&z=f(maC11P^>%U@vrTFp*oeyTb+X#M3}IsC zNXT(#Sx~QKBaDHZtbv%_FM6!!UogE|7rgDLflqq|KXYU=K`v&YK4QF@-(zf&#-8=X3kK7F($OK|5 z`hl4E>m1! zUG-kYaMVMo4!K#&TUxdN9FN^_s&Pj>=)#vmsfBbzjcn-V+Vz_CAcco%dq$B7n@TQg z$D!p)FN>js)Ai)rq~WNDS*l*s+i{)*gxhAr2j)D_z49>4|DxLa-lEb^3;#3K9+O_e zs~-Ms)*ZrproC*gV!b`bCJt1p*l%hx*BSAOt-!qLJr#KzRw(DUD7s~DzB@fR8pIcC z)!(cEL9nCsse0Q4ktFsDahu-zZIF5NPR-laNe8zFP;MkPa^}~G^gPFc-Hgv7c@6FM z(nQz{>lu3#65zD%2@LvWbj;MisFW!`T0!Pwp|P#|lFxZa89|0O?_wVcrg5iQToEus z*pqMkk;fP$yJws9kup6D*k?nM}` zN-u);zHXoo7%52Nzg7|Il!F@Q`QSZvcP$a80RDl>#~pS{Z-L*@;kC!YwR@Tb22!E% zDxRk&g)rH8<&CdlcU`n?D}7rso&otgzZHZt$S^aVrY}bUVp%fPAF{`*?jqeaFGKqr zz_;Y68+*F?Qa+t^1A?w?sb@DCc3vEA5Fnw=6PLYmGGD(b(60fO{mSiiX9rFO8sTn! zs1o1|MGd6up_|N?z-!ZKq=G4PJIA!^wc=JxDeupJlLoL7i?>TUU-YRw3PypheG9A4 zB2cN;-Uai}69x}cUYUY!>%!b_B$Mz;fuxD{xHt)?DxJlmZB?bQB; ziXWoSZ_BeMIfx|?f7K|^loWOU>}<2?2zn8IhSsj^Zd%XsbHE$mz2j~)ek={T=L&yM z>2m&k@jfleak2-PI#}BMGGKDE`-`v3Z?e@Lx^wsz{ntev+P@?RQ;}CL*cd8NY5o{W z94bCt3eSaIIQTQSF_#?)cUT+Eh1MS0u2H_?-3Q(bPau=kGyqi?n1SzO^bwjT!!_6< z0XKoc3udFyLQZxeuD4T<5yqxb)o zGzBv-x}8eO^@AoxKHeYv?M1RJAw(FNznhV+9Z4Bcr{NBH06rX*6zWT5wU2!#!L*Xn ztV1T>2q{s}Ol|iTtMCMe-Pcvg71mLG4rrTXWcp+8#$rx6X#BF_Dfxb0GVa#H2d%J% zv@$QI#U-0pHvWEX^l4&&oW+I(GNyM6UtpfB&J`NhxT2#cM}?z9`_o~A3V4ZYCr za_@~KyK(WQ@Yc{41CE011*avMVb!Awv$BVR*D*HXXlfITgut}v25x}RnGO~$N0w{J zMlGdsXqHeMjRXT(!GJ%W-_o53j{19>x;4Tr57N^djhQ#bm!i&h_XNe~n7fRucN$y<>O zr~{%#I|=`Mcg;EJtz0fA$04ju-!m}|6wKRmfK{*sQjFU455RIZ%$9$2^YzpfNq>NJ z)5Rgsk*N`VZ$gqj!;sa?n=m*_Grh?boMbJmj(7GFMK8pSD6{BohJ>#mGHlxPIZ?DT zQEFLX4Bxwk2Ex)Iea4d`II(Sf7`0VB@WFt&6ptPI2}wCl2TODxXBxf&-M5^q*Wg5f zEgx(UJgkdc2XrB4X^#Be3|TH6&H)hw;X%Uv#~eOtuCDhw2||d(T=CF!7gyj@?xEq?@hc#aJCqHK6H+! zYh0~%mg>Dp8DTn%3Ii=|1t+4Jwpm+vnVw?9ky{t~@SHeOj3@r9D|#rur! zK+_6697j5ob+#UoAU3((sPMLm*xLAAd*sn#^!EqG#sK$Vq0M_v=f2Q{q{&t@2%*c( zf^O={_o;>%%Nnk-xB%cyMuEaIdUR^Z@y`Tv2JKEyu0)RF|~}+Pvkg-ZCaTDK1Q@yf`!OkmA20|+aKhCrID@@ea$;gjW6l1 zxO5VPo&u%d`k_x*X)PRR#$;RJ??~t*9nJK?n_el+1f#5?l9|4yF_icQ-6pmmpsPuU zbll5#>08k7^!>`6T83GY!$tpbTZN`->6OiQk~|-ydAM=Cb)z?NMYpLwDJ3fpQ#~&7 zv~mFti6bnXHr=%52z2{ddl(|x13_bBW4J8uP_XsEM8>4D)8fEK`3wd0z=q+kn<1j* zs(H&%pq$2_H2vgoP}3oUgkf=#EP1R=I>P4YyPuypub4oYud|0@zvG|g{)9cr?noR` z{UX@Y*=E?^;WPclmUu!PGjOR^1BhWVl_%v74_koN5D?E^YI|DVU_#)TU}PVCgZU_% z+>?U86JyK&MaIwz#3vr=GN=l?fESbmD zYWC+<9lC~Ir%ZvTD8os zdFBb0Or<^%wHvnUm+jr}A7;LYN}R7X@Xt?{nDl4CP_SrOFU4{k#$MM)@=q}=71Y3e zB@NB7XPI&J>?9*vxQR^Y_4II@H_bcC)bGslyU*9wP`VhHKFTQdLd|}7eL_%p?dPRx z*w7x2dcpVrV&?J!$*supALF%;OV!@~-!0XkBnr_uj{%_Hp@|G}lgpOJH!H&$v8=(X z&w~d(=IcHDec29Pc&&!y5(N9kY$Aj|FI5eq>L*5+$Bx+A%(WLLE*(;V`z&DIjLYX| z&9}Q-RWnOW&)Z)vE{cKDlqr_M_tk(LUq8#j;gnww$p2;IvKfS362~Mebo0kbeJ|`+ zW3Jx&0+HT_1zkbw>lWeztQpw~U~sdf!UR)B%Ft0`-Ol6MMfRcch;&Md;)1cv)A<#} zQvDrOBqo1%Cf^VYudcZzkIKV)%K zRQ}*`W{1do+C0uS#8{o6bko5aUQ51M*bIQi?C6YNJ2JAxjwC|?jEVg8ZEb?K3ITe# zxc>HlTz|nsmF;}AadM>C-IBald4Q<#A1@c4fdU_crfKy!{I>6hjNWezl9BXVy@$~? zQ_m&u?FwZctYI}sMhr;rWReK=Q4A6hMUhcsoJVsyVm~DsP_^ExI)O(*6@aHJgE3KU zlIi`G(5N9l)|r zf+!oc;E!RdSZYylGEPP-CV=p-jkO<_Jn$=$U}v7J$s)VPF7NF;U?5E#KnSj6E#gVkrAxzML+f`=vccrvff1?jIO^6TP9|^Q9;@<>UvYIvp5!4@4|Nz~ePi44a4@VmKNWEl z$&heM1A?J}ed3qzp@u6#B6G=azK31wcJ)*D%w26IfIcUtY3Ys+%QBB0C5#KBp0X zrna|{y=vdxGDupXr{BVV)U>+ZpYV!w1zD$)6Sk+mL}2+&*VeJdr5gczuNyRbE|z^1{}ZGX_@!q_<>2o!m#2ft0DBulC(E~{|0B-=RMV#n zvhe4E=VphKIdwrQFzWvy%cH13NG)?4MD3HGh{AsKg>ye1bIVq8*;N2*FF9Ck>`N8Kl%EtrT2+G-P>EH!-VUMu z#Y;iA&m)}Tj;={0j`(U=I7>;zAe2)p*KAP78SXNVz@d|2JaLF8z}d=);~UCWFc4^NLDSaY=S1hlO1aV@&)wz{W*$(#*hs80=OB#qKC zI)*J^xLzp1!om+}0R1K`2ptn9HA}MWPIjHaz;B)CwVw^AQCEZtq>UG3#=1#m~he;kZO|BnD(>Vkg*32H$$Lq3)x=ZfJ&B*?P#}?lSVhUQ|0n z^)vM`E108I!Q{)|mX=P%$vqE(WcMFoI;WOYXV*j|tyh2fh9Rgo5t$);&M357M7`EL zdj^*k=o#07vup@oK34K#rJM}>S6qxM_ z_sUAmf#tkji_yez3Es*>@LDQ2lljJ6WLsSie0xpsY+Cv%n8%L5{IDF@YYfuo3qe+P z`1N``M$&pOrZFLH!GV9AkS61ts~6xil6JB4-1`zN7=_kDWK;9w(h$egObMu>pMbqG zj{9s0hudQ9Hqi5Rwl{qq%67}HRk7ZU>#cRPaNkBl*=)7<;C|XS0cYmU=WO6jUy$@y z6PH76Z$U~1hA$ot{%~MExp)1k45R`3x}FQ^}s!QAxNZU5*=o zWJ2lF1+y~XC+AeU@0#3ZvD{(8@GizjVAGj!Pw^);@0v8%7;9H_rXOb}cbAM*S#CJ1 zdA^fL)s}mfS*dT%G&Q_X;HzLKA=XX4cafoIv0sb4gS>Xc(w4_-b#Ywun4SmcaRfl2Odu)iz`8f0y==rdx23^a(1u$!qK4vFM81rtMhQh# z(57T0qCZY;?t#%}U8RA_XB|7OJ%F+)D9UeXb;(pmcO^~$xXiiizM#R@fefS*x_H5m zv3ccthn#;>C09zvMdx4Zq~Mu5@r=ricI*Nu_O$n0%S2(^h;mwrlskf1;3HUQ9);Rq zK!@;u{qdt}Kr5Z7O^J?)yHO59x6TWwp9*24zjX8q%25RR+peP7W}zD>bDCa1=@AiK zmS*oh42gOjlQT|XF+1h4)5fD!!>Z)ltNDCS%ULZmE4&ed0pvC9!#N;S>5)<05Lx5% zBF%Y~z&8VHwD&7lB%QZG11jPh{ND^!r%*RIDdG$1~_rDmw%mRxMOPnpbj^ zco3eitdn+L6}VTvXwa=grn4NYH!GD8;K|G$9UnjZ8Mp5;_H2|8>8O9GZQXja4Ox$c zZq=6~ZrYQowBTb+Fmkt;-c$^(W5hp{QHWhw5tIVE10uS`#o8f*7KBA=d_*DS*TVvDllS&HxQ00dnl z)-?|fG$Oo7bB23!oP|h2@#i?L`p}HpaqQ&pxMWOl$loWQ zTG3EfEFS3ddGtj(r1~>+dEzYK=Vx$*s;@cT-+&#w)2q@tO33@}NCd7A=+r*Q!6bQQ z8H#jPu&m7qp^l%P$wD5JTTFRtk+`1i#m{MuyrJN~aQsjX-@!`yLP;;PwD^PLc0@iQ zhE2)q$;&{QP-HBZgNm~^D9e7*teN=bB|RA2mD8Fu@;JC)HD73CCktS1Cm$&}k%)o(#1(Iyb;_!U_p1CK{d zVa{C8gv+9OOUL!vc}u-zoX`G?aXZ1Q&@cGhSDUtpH|-?aKX94yn>9lZ1f(*}vd?DV z2Y12DW8h_>fyjUD!5sL89iyLqs?%0m4RQ?+Pu$Kxo_*jcAD)|rX7XtC&K7+!KW?%@WG`E>P)%CgdTqD+Vpj$SH}_+3&BVRd&EYA7k%Oc24}+N_y+h*@)1|VTvpJ`E zCeFd#*BZ}?-{K`=5GJ>ok+x~oD#x!c*fAEwLIze@y*Q0`r)pH>X&29G6P;!^$)%kN zZC~jf$c<<}K2?>oLlt$x^}=XB&GeeYUZxR(J8o^Oq_F}hkzWO#ve2^dk~AI_hDm-( z#wS=uqeylvl2S8j9ZI!r060dSP_w4D*wxpumOc9}>X(tTmXDfcIS_3T1#RY?dXVNX zzmb4$F>NX&gs`O7?eyUawvbD2g9NR)$4T#EgedY}Ag-FqQQ;~`a`F}1vGDSSu><)1 zRpmS5$rK*?42Hx{KBqMV%`;bbjXBL)U|2FKRtzL_s7FgV_C6AGs(1xB@M8?Zy=ZSC z87KvWvlesja|9b|HD|34CkwuaKt$Nh2r`F7n97CIL{iP2k43^%a)?G=mxpT3< ziCNo9+or={@h=*oU8WTRcO)}l?j!@3?%NeFqO64h+ik^8_Ow?}&1k*2jMD17msz;F6j3u)^ z1nAh&v&8{Eb>cmkU=&2I5Me3pg-pXvNUk`z5FrOt28o5){^heV>Yf9)1qK+n^YSo`qPTAB@{m?Wol%9v}j;>~s(b@%i zrqYSg-PsON44iy#2k|C2*QJcW0DeDMV9tQhlO>S@kJi(QBmdTz>paV;%fbr6&h+}T?>M8Z2h@GKJam7OZtQu z(%5#FEFE&`;S#u%|Qkis7@>O~AJB2W#TdmJ~wxXE`Du$fcWTWdhGkfS)^*p zxOCUO7aXau$EB=~0zfxGTbQ;odbh(L8w!Ek?mu~@*b~(^O6B7O;Fx#3PWRy zIPb2>yrUm(G)U_wSG%0|h;uzEgcD2&xzz2v$kd^w&8rx!e2rU%=Y|qCuqA}l1XodB z=}$j{-;{+|P+yeAM6h#sWp~h0v72T-x}z~$eP=R$u!KCOe>j7KA1mMo#< zt_}{6c6mX6^$9M@#3RWJ7j*!!LTc&e)9aZA)Dgpt2if-62Cu@z%EWBpAH=R~__?kV zx!M85^I6uAQOB3boMmX)gwMf70v5z7nBiqu=+E#31&L5=8qu`~p@(;OO%^D3Ft)^$aGauF$`J*LW7Ap?FaU$4K-*w*Dr@{x%-Vs1e+hOcy3?_?j_n%K>^qlqcqhpEfT>jy(g9x7OkiMx`0=8;I9uBM@m%U)Xk!X& zz5)PVQ`>j1tOJ;_g4XY_d#Io_TIaOTc)ylU3D(EY3Ph2T4ya9tZMoDR{9I37Sls6% zP4T#O0*td@wu{lg$RX&?*Gsr-If83Q4`aPD%6T#P!H+BOnQo*j)Xe@Vg&!MS2(9@^ zX8S-QEr+~EGdnx^cj-lb9Au6L^_My_({RtQd|UD36e-RzA_A5<)nCfPo9_w7VTuSU z;o1ssY{kTS8u0K39Kg~-J+lq#oCszM|9T{=kT!*Mv?~anB^407)LIN^lSr|{{F0y!ZoJc2s>eg%o6jE@Px0q zI|c;(I!!l=RjhPn_DAx(0*wML{_jiiUpjqFN{Q8r_B&ww$wVy6XSx2@wFcMaPiP6e z9Erfs<62{2W@KSxW;C$`I5Swr!=iKvQP$TLXGNz+TuAj>k)j*X1hDKk&8 zZJq<$XEi7n(~e1v4sH4mu-(pPtK%tJ% z5=K!Xo*KrJ_@iLx2hR`j-E-(v9-bdxc5^8bp-aSdL2e#_0ZC7F;0QHA_Qn7FLe^Oz!Ua+$ zLK(msUydacE~C=&5@Wgo3xPJu<>LH8*#+~0wgqH7m#?I?sexnpB|4%4e*V)*?f;F( z)Xv$-UEjgp(#{$1tC>)Q!q_<7*tm2QlLF%>dTN^JFQvcD*`)l~kZQG>uS2;LCfh|b z$jROmw2jsP-|Hk%z`%%}KAEz(sG_o1VzP8{=|>!ioo_myDLa^p!4VLq5a6}~v4tn3 z=%Ak8|4iojSlUikrQV4b(X*Cutsq87EQ(UL&wvzBC~SCLrlT&3A{Bg>UaV9APoqI; z#HhkpXna7=cmR5_URjz?~9iF?`MVy_Fk2PvfZU*2OfPSF>$2^>|Of-Em znMUsMqgeuWMfPm^I6;sYy09Gg7!xWOJa^MJ6rkC+$pBM)Fu={2)>IFx2fL0jk=!*w zfEsUFHpI6b>kCKeXb|#i%UbV@+^hQ?XHK(#>?`iB zjJhlZKNsm^>jOi`I3p^H`J@dy8j7alD{Lsh@2zVpFW$$JMdQVqXR>R85m9p~+hoclo!3^eg#< zLKrL>{0E&;a23>??`YIk)IW?wycr>@>)ID`^`s*g1=I`rDLWiwARUt;F3@v0Wn66( zP8`EPpPZrShswX}h+{wU_^kNCk`uv4ZVDbiFbL40O*(TL{2;qV>*$?r5fe)CEQ*iX z*L$|dHgUvOzr&45u1C{LpULbBSdGu-asK>S&R6k=cW4-xW-P<$^DGX9Ut|oDTi$)r zD5yuieJ(W1?q+lnlMa?I0h~?axA{SU{`!cf&B_?>8tl%7DB}FZVUI$4*ahs-!D1G! zb--d^bKxsI3~+wsS(Cbqs!v;IuSiXvSz*C7$Z>Xm3cofbc`*Kgo6(uL&#YVTtX-r%; z4RfLlCJ!OmLjT+X&*pUgsv@#$%XCoI=QN2Wm}~7)Gh^E+lrKdAlQ=LP;JLMT`6V-K z$;mQ3W+OXnS67|&)Z6RKGAckIYpUIT>uPKM{Z|W2`0@8vwj-y%9C>1KXwXOZ;;jFYtge zhv}E)%S7Klh#+F++fUKw*d%r|!HTxvjpARO->~Gs((SKn-EtidrZY*c@^qkH@@Mzx zmdrQFlCqEK`VY}YtGnCJ%Nv4uodJ6RRBKnI3Xz&CsS)iOJV5J&sfc`H%@t7Rp6*nk zJLy8;Qb;(3%vwl1{@PUj-2SUkB3;&oPz@Pv={WR}F!Va?_2$9g`Cv!~&(w>&p=AQz z*Krd949qKae)AR^SvNlqO}PxcQZ(pqq(7YM_cPsUC?mnqrPX^)Q)r+;Yh3SWvN4*< z?L{EADMjkJhm{($r5PKZ@V8UbJnpndVi6HqZ5P zhsRmTpqx;Fwv^6&#TP<>j;c7dXvuVAYRaamYOn|kL7iAKcU|f6@ zU0eTtuE#q_+T#>;G}=|G#S*=m|i(Iz67i2I=3N;4eL%K;fWmXddCXXivc(dtm&f zDGewZw4uf$x&-r|(I7fDP&jCFfJZp*vnSzy-zoqU4eG1@h}On`3jNC`_itU+LE)fw z)Q@mq;A7_B-z~r3e`ih&$_BOcePpLR{}=3km~l{7)JJ+9*}td%DJcdWJgCj&Bff|7 zU*P}ZGXTm4HR^k0FVj55{=<6Yf8OGt{$Y>cOki>R-(StYfS;TWP=ljKvO2J`=zo*{ z;X;C1uRNlkar{g4)58Wahj?U9a{m+ie_ldR_4*??jQ?MOpByr%w)T-MF8mbv@07Nn zHyx-t@sX<|`V{v`ts*EKR73R$$B=vy{)D0mlnpBJcw~>uJjMRA4E3*q4^T8{`S~L{ zTHznjeC4*MWK9YHq|C#*XwX>jP(4xLa@}b&Oqan1nIvr7oarItiU5p&;0Lc zzvl=*L7*}5M^LfF--7--LJkT8jm18~ysZ9&JrS7&Wq}3||73w<+5Ex!e}S<-!ik_T z&^X^Cto3QwZ&5!`5@>|(ktAdL1pVH;&Mu|(7+HL7#Jn+-wyCu KInVjm|NajF)Nn}v delta 335 zcmZ3`%=C+Wvq;WHMy^Xgj=ww4z`&rvIQe|8a((HUjYUlc3=9|U=68xPaq!6oarkBn zEc~buyTgp_EUTc;I`==n{PMom9@zbI@{8X~Usv?KmRVxvZCNsXxs34?rM3pU+QS83 zW%Blmd@nwIgUM|=E zg{MMTSet{#js=mPAG+n=&b~Tt#No&2gni^+^}vO$jIWc@}38ALEJFvtRf0|u5bE(R--337Gz4{{0c TW@Q6Ou>hetBLl-)CJ+w*?TC%{ diff --git a/cli/src/zshell/subcommands/__pycache__/scheme.cpython-313.pyc b/cli/src/zshell/subcommands/__pycache__/scheme.cpython-313.pyc index 5e2d3e2b898b5bcfa74e83797b29c7e616b22de4..ce31c6b678befd952f21bda862c725c6d7e845cb 100644 GIT binary patch delta 4019 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 diff --git a/cli/src/zshell/subcommands/__pycache__/shell.cpython-313.pyc b/cli/src/zshell/subcommands/__pycache__/shell.cpython-313.pyc index b5796311b5996d64d197a629d90284ed6403dfa2..af12c926f11d084ecb69ceb0cd57ba02dc91c7c1 100644 GIT binary patch delta 134 zcmew+&>_h8nU|M~0SI*NPRnFx-pKcui7{fb6s!4UMP^|MCVfU-pjFpDLV0z*23 zCaYf+lWyK*4`w4(MW9Rr!xI+1cE2XSDJC;aW~fcHU8lLwX@|-Vv5UeECs;1C_)h-E kBE5MFvm}d%ALE3OFAR)~evF@)8JPG#Faep9AF@vc0K_*WB>(^b delta 139 zcmeAW{3gKnnU|M~0SGeer)B!{F#Co^%-@6 z{9vYFW=kdohI9r^7Qe|M%trFkK+y( str: - # Accepts "6a73ac", "#6a73ac", "B5CCBA" and returns "#B5CCBA" - s = s.strip() - if s.startswith("#"): - s = s[1:] - # If the value contains alpha (8 chars), drop alpha and keep RGB (last 6). - if len(s) == 8: - s = s[2:] # assume AARRGGBB -> drop AA - if len(s) != 6: - raise ValueError( - f"Invalid hex color '{s}' (expected 6 hex digits, optionally prefixed with '#').") - return f"#{s.upper()}" - - def parse_preset_file(file_path: Path) -> dict: - """ - Parse a preset scheme file with lines like: - primary_paletteKeyColor 6a73ac - background 131317 - onBackground e4e1e7 - Returns a dict mapping key -> "#RRGGBB" - """ - mapping = {} - with file_path.open("r", encoding="utf-8") as f: - for line in f: - line = line.strip() - if not line or line.startswith("#"): - continue - parts = line.split() - if len(parts) < 2: - # ignore malformed lines - continue - key = parts[0].strip() - value = parts[1].strip() - try: - mapping[key] = normalize_hex(value) - except ValueError: - # skip invalid hex but log to stdout - print( - f"Warning: skipping invalid color value for '{key}': {value}") - return mapping - def generate_thumbnail(image_path, thumbnail_path, size=(128, 128)): thumbnail_file = Path(thumbnail_path) @@ -103,8 +70,8 @@ def generate( thumbnail_file.parent.mkdir(parents=True, exist_ok=True) image.save(thumbnail_path, "JPEG") - def generate_color_scheme(thumbnail_path, output_path): - image = Image.open(thumbnail_path) + def seed_from_image(image_path: Path) -> Hct: + image = Image.open(image_path) pixel_len = image.width * image.height image_data = image.getdata() @@ -112,11 +79,27 @@ def generate( pixel_array = [image_data[_] for _ in range(0, pixel_len, quality)] result = QuantizeCelebi(pixel_array, 128) - score = Score.score(result)[0] + return Hct.from_int(Score.score(result)[0]) + + def seed_from_preset(name: str) -> Hct: + try: + return PRESETS[name].primary + except KeyError: + raise typer.BadParameter( + f"Preset '{name}' not found. Available presets: {', '.join(PRESETS.keys())}") + + def generate_color_scheme(seed: Hct, mode: str) -> dict[str, str]: + + is_dark = mode.lower() == "dark" + + if is_dark: + seed = Hct.from_hct(seed.hue, seed.chroma, min(seed.tone, 20)) + else: + seed = Hct.from_hct(seed.hue, seed.chroma, max(seed.tone, 70)) scheme = Scheme( - Hct.from_int(score), - True, + seed, + is_dark, 0.0 ) @@ -127,65 +110,34 @@ def generate( color_int = color_name.get_hct(scheme).to_int() color_dict[color] = int_to_hex(color_int) - output_dict = { - "name": "dynamic", - "flavour": "default", - "mode": "dark", - "variant": "tonalspot", - "colors": color_dict - } - - output_file = Path(output_path) - output_file.parent.mkdir(parents=True, exist_ok=True) - - with open(output_file, "w") as f: - json.dump(output_dict, f, indent=4) - - def generate_color_scheme_from_preset(preset_mapping: dict, output_path: Path, preset_name: str, flavour: str): - """ - Build JSON output using keys from the preset file. - Any keys in preset_mapping are included verbatim in the "colors" object. - """ - color_dict = {} - for k, v in preset_mapping.items(): - color_dict[k] = v # v already normalized to "#RRGGBB" - - output_dict = { - "name": preset_name, - "flavour": flavour, - "mode": mode, # could be made configurable / auto-detected - "variant": scheme, - "colors": color_dict - } - - output_path.parent.mkdir(parents=True, exist_ok=True) - with output_path.open("w", encoding="utf-8") as f: - json.dump(output_dict, f, indent=4) + return color_dict def int_to_hex(argb_int): return "#{:06X}".format(argb_int & 0xFFFFFF) try: if preset: - # try local presets directory: presets//.txt or presets/-.txt - base1 = Path(__file__).parent.parent / "assets" / "schemes" / \ - preset / flavour / f"{mode}.txt" - if base1.exists(): - preset_path = base1 - else: - raise FileNotFoundError( - f"Preset file not found. Looked for: {base1.resolve()}. " - "You can also pass --preset-file directly." - ) + seed = seed_from_preset(preset) + colors = generate_color_scheme(seed, mode) + name, flavor = preset.split(":") + else: + generate_thumbnail(image_path, str(thumbnail_path)) + seed = seed_from_image(thumbnail_path) + colors = generate_color_scheme(seed, mode) + name = "dynamic" + flavor = "default" - mapping = parse_preset_file(preset_path) - generate_color_scheme_from_preset( - mapping, output, preset or preset_path.stem, flavour) - typer.echo(f"Wrote preset-based scheme to {output}") - raise typer.Exit() + output_dict = { + "name": name, + "flavor": flavor, + "mode": mode, + "variant": scheme, + "colors": colors + } - generate_thumbnail(image_path, str(thumbnail_path)) - generate_color_scheme(str(thumbnail_path), output) + output.parent.mkdir(parents=True, exist_ok=True) + with open(output, "w") as f: + json.dump(output_dict, f, indent=4) except Exception as e: print(f"Error: {e}") # with open(output, "w") as f: diff --git a/cli/src/zshell/utils/__pycache__/schemepalettes.cpython-313.pyc b/cli/src/zshell/utils/__pycache__/schemepalettes.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f3c04b2c71eaf549300244b60f0c8436376b824 GIT binary patch literal 1388 zcmY*Z%}*Og6rcTGfASGiwvLrz&~HCZ-z)Ag=1JFb8e z5{IU})Q3{}&`LSB|4c<>se(~cRqBbJj2tP~&a90kp0vOB`@J_GJ8#}@H!U+W-P6Y=CtE3sann8{)czrIAm~VMzrUCMUoP8S9oh11z1*NG%J!VX;bIQ<-Zjdrb{pDL8yj z!3j8GB^Csnv=mFT)Pkt6MXeMZ{gnB=8~NM?-y|>4#4aMp@lg~pA+0%tIc*cw>t3+8 z!?^k!hlg(9@Znb`^-0%a0)Jrs~Fs<;@3_;--ksczc=s=2mJleS$8cN;$EY1@9;Kz=_nWZTa@91-6O+#s}V zEc4x26a_&@5b?qwV$mTU9kcC-ha4Lbg1u)A;_}=u%XQfUXvM6CHP<{uPSyO%BilH9 z;W{KT59gjCJol2Aj_;WfcFe=5>iWLfAf6wYkyCYRZoPNmD!*E4=DxrGr#y+ruO?Hu>h9ZA#V%>!!09&} z%L2gH<@eiNV{ihVGVIyoeiL75?q|SL-dC|f;R(osB@v2)cJHry3*@CODlhC;Di^#W zd8t=QowZiY_5wmB26+L0$dVDCG=&X@G|AtRgm%>-c!~x1Qj8J2h8Rz6KrgRjSpFfSW5 zYKZlshx~)E;e>vO=h@ryr*~$R9Plp-^RmVFNTrD2_;fT^D(-A=KPiQ|v9T=aSr$1=!x6@PSS)*mNvoq(J@s{4sOb_C@ xo2~tJ?#^XOHN;bp>x=^BqtnTSjwH^CN7}3L=8fhzrz6vE5;O0BD2VY}{}06FORWF^ literal 0 HcmV?d00001 diff --git a/cli/src/zshell/utils/schemepalettes.py b/cli/src/zshell/utils/schemepalettes.py new file mode 100644 index 0000000..00227be --- /dev/null +++ b/cli/src/zshell/utils/schemepalettes.py @@ -0,0 +1,30 @@ +from dataclasses import dataclass +from materialyoucolor.hct.hct import Hct +from typing import Mapping + + +@dataclass(frozen=True) +class SeedPalette: + primary: Hct + secondary: Hct + tertiary: Hct + neutral: Hct + neutral_variant: Hct + error: Hct | None = None + + +def hex_to_hct(hex_: str) -> Hct: + return Hct.from_int(int(f"0xFF{hex_}", 16)) + + +CATPPUCCIN_MACCHIATO = SeedPalette( + primary=hex_to_hct("C6A0F6"), + secondary=hex_to_hct("7DC4E4"), + tertiary=hex_to_hct("F5BDE6"), + neutral=hex_to_hct("24273A"), + neutral_variant=hex_to_hct("363A4F"), +) + +PRESETS: Mapping[str, SeedPalette] = { + "catppuccin:macchiato": CATPPUCCIN_MACCHIATO, +}