From 2827f852c088f2036f8eb85dfc87665b8e980c3b Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 26 Oct 2017 23:19:20 -0700 Subject: [PATCH 01/13] Theme: Windows 95 --- .../fonts/premillenium/MSSansSerif.ttf | Bin 0 -> 626300 bytes app/javascript/images/icon_about.png | Bin 0 -> 497 bytes app/javascript/images/icon_blocks.png | Bin 0 -> 356 bytes app/javascript/images/icon_home.png | Bin 0 -> 328 bytes app/javascript/images/icon_likes.png | Bin 0 -> 326 bytes app/javascript/images/icon_local.png | Bin 0 -> 599 bytes app/javascript/images/icon_logout.png | Bin 0 -> 383 bytes app/javascript/images/icon_mutes.png | Bin 0 -> 411 bytes app/javascript/images/icon_pin.png | Bin 0 -> 337 bytes app/javascript/images/icon_public.png | Bin 0 -> 688 bytes app/javascript/images/icon_settings.png | Bin 0 -> 639 bytes app/javascript/images/start.png | Bin 0 -> 263 bytes app/javascript/styles/win95.scss | 1457 +++++++++++++++++ config/themes.yml | 1 + 14 files changed, 1458 insertions(+) create mode 100644 app/javascript/fonts/premillenium/MSSansSerif.ttf create mode 100644 app/javascript/images/icon_about.png create mode 100644 app/javascript/images/icon_blocks.png create mode 100644 app/javascript/images/icon_home.png create mode 100644 app/javascript/images/icon_likes.png create mode 100644 app/javascript/images/icon_local.png create mode 100644 app/javascript/images/icon_logout.png create mode 100644 app/javascript/images/icon_mutes.png create mode 100644 app/javascript/images/icon_pin.png create mode 100644 app/javascript/images/icon_public.png create mode 100644 app/javascript/images/icon_settings.png create mode 100644 app/javascript/images/start.png create mode 100644 app/javascript/styles/win95.scss diff --git a/app/javascript/fonts/premillenium/MSSansSerif.ttf b/app/javascript/fonts/premillenium/MSSansSerif.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3afd76ff2db50db3019c7e19c5fdf2a166253bf2 GIT binary patch literal 626300 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≦DTatVx&kLS}M4=h(mmXyaSH<1*AMx6Jd`3JwwU|$%l z!8mIWpoD`3An*WJFh`JP@=`jy8Z{I_C^j1GCE!(!clX~`X^z{rJOmqLq zeZno@#NJ0WW7)^tap?Df+8~Lf#GSS*9QeH+hf$J(t4a#oq-CB8&r_bw9@XQDpy;&) zi}ph(d#xqJSp}oZ-LShwg5mNOAM-UJUCfJ{#JQPINupv@r1&O5G0>Q>fH{gUX#)A+ z=S_zzkKz}O4XXM~1yu<hO0x@*Y{4*V8@=RruG5rkU6!0*!d{t&{TV z>$^|9m0v}1_~*CB_eo0X6W^8A0d^nh17WXAdcku=hPQeoMHI@diyAHq=QhFE^h zKyq0mDZTu?oWJJq94N+H{o!))j;nKEKH3)iCv-j1T9Y%nln)ECKLt;qw1Z)#jZQ;L zO9ZZ_WsoA3%m(kkJx?QPgk*}OG_u+>Zi8N?8}xUDz;8L2pI>u3z11M^wI&}fNHTrg zj#0toc+}}PDct;y=9nFEDES3Bk%^>~QTz%0=f9g+afkhpx0Y=wySQ|;Yxew$M_xN( z2I4#y>JL3KQlGiFpn`9^ZD8qNmn3KQ?~^HKWTy4{`Hg)G4^5fWJ55f_%qS*21S5pK z?YFR>xTT#|XgBN!_2BcS)srlj+$``7h`9YJV{M+*pGVbKb$i<0$ie>)WCti5r38w$!iN_y* z;vcYOhwZNoa>RpC+<-GxP0Vs zhS2TyXa7&!gRgj;ulQfQ2P05A-b2iRj5&Z*4pk89OF?W75EliTD8JKA!&Q%~WPD@N z4Vb&(ay8~IZUiG?KyI_JxAOl2|C2X&>=MGHf#7i0ISw0Y%txuq z99=@44TA??sIi%_7vC@aT6#{BDNAHBIOHmIoyzYgy_ggjE)xXJ&6Ofu3+hE>5_lVS zD|z!`$3o*EJmU{L+Mm!nHf{t=T)IfPhc6QJOP8{&ApEGAxU0ccb*s*{$}-5n(UYh{ z2^S0rnLsFkREt_R^0D-*UVW2&_$J&6IC_oTgcD@<8z{!R%zldJwvzpzrxjwVWNB)I ztFom;AT>LH6Wl4yDM?Miekp)i9JIrmyS?{zBv_Oa8y4_Vy}1te1kbY||7cvY81BqT zDuz(}qxXzy%S!s>m8f)2g76eg!0p?`T0LV=)9Zp#u<44Tz^0`N{KGD7;WrBuDHc@k>NjxQC7^S{}6)Xs)wb+?}*o7_AQ4W3 zhvy${&c`Ew&QPxCDP+iylcAe8;g_BklhGhY;+d19&m3Zf)M{)WogRTbP8vIe{6;H` z&mh@wYGn$C`crVJW4)sfJlfoO;igdkRN^?rniG$yv z8r?Nik`BT$Yz1sJTN>T3Da5fhGgaN9vn_JlR&5d5Al!eX^ek<{Kjoxj4#4dHN*T<9 zf^UR&s385wvV{K}M88SQFXB9)f}U9d+gIN+WQ8Go=y(lkkAUoTx&}ePxMm5yt_+6K zN;<2=gSc3gLOVE_1sPhq$DTpt)lrY>iZkN=9lj5Ft`xJ6a>hzfiOu~!}=d(zRP&RAmCs#0(}OqPQ5$3Szg z6Ib!^;v(mo{@8alkXH@thoFn82(#ca?2;?>9=g>3tzKTA4~ljV;Bpg8f;?NV|}fzuuRo5)@G6N!=b>14QaC^ z3)w^Dypm~=42;lQFh;U3My*u174{r#RF2)vxo52mlW>Q7@>+;UWS45YCvAxz+!Git zY*UW@BgSvjzdZV z&#UDt0Et7YD~VQ|gHM1zU?S9x~}I;LjQ0j~{vb*;*tnsZ=uz?n0d@;6p9!9LS%R z+z%-TbIJs@z*erT#Ev5Ca^<@<%?HVTN=zmWL=sVquyYlO0_AV@xNPUFsgtY$Xw;fK zf2ueC`hGo<(F^VhWsS5gYTp5$jM{G;%MP;h+xcYhCu}(XmIa5~PhwoxN9`6jSeHVW zvy{=wWDu2Fu(Y?Z8Ppny#UwXuNK7*8Xpy#5`AINEusyCX;sC9Yti)Kxl%tpdYzu67 za6a+g&W+ghKW?MAV4u=n`@bY#f=`ls$p&8NU0|(ymEF>%KjK>;t@zTIYXNIE5Z~J; zzDHCYek}!+{RqF>s5)Ii9*KQRme}W=EA8drGM(39k~IjD^+KIhpjqKeUDg#^hZ>bx z>S%Sc3bC_;(H@3G260S&Qem}-t>elfPLe=u5is+#0M1(A2szTtn5FdyfRqmzz{{gG2*nh87zqC(`&b6% zciPKWHN*_1EY8_$4h*0j9_+R5pLx!B_-F1jZvLh5y}`e5edpp|=-=reAWS=`nujDr z8N#PWgFag0JlY{2jw?0l|4m@s=BGWpDrvrX)s+huKBeqizWlDsFC*hDYu$u(8>4;) z-ZP9GQv>p?}U6-=D(Lekog9=LFRYL_sNeT_+k-z2=2sM@Df9r ztg@?AR;XGC6fr=8nvZ~hK_Y1+#CO1{p?@Gsy^G0rUOZ;qy237Fl-FuMXO=!% z=e?i_$CibZD=hzyffE-mA`3w9#t<;;)UgE2vz_MzuuNlYIJ=JVZmci5j-re?Kf%s2 zG{gRY@eMFL@H^Rk>@mQyh(83rND{KDT<_p3?*+j|4X6>|tpS0%11vEivQo@U7j(`H zXU8Yd%#7($sO*0H*=GxLNG6y98s!q}^M7exSlhfXSEq?#t;6hUh~VU#E3z_w%s2N# zr(C;F4x6sHA?A`}t>w7auGqcalGp`=7Q6aFFC1KPf{zlOjMSui5WzIk zDnX5^sV>&XHOw{6C8OG*tE)?fuy;LUh0H=M0D>)pEDLYSX88q8+agN`Aa9jHH~@8N zX(WVp_Eiv^6vGO~-*{t_I%Zm3Q`3K7PyZHkF#&p}SDJ54Sm)X1+3%58d)VC`#9Ght z@L`^D9=^`C&9&c!=AGlMt)1o{;Q+b>^`V15 zE-uxcRz z97U8a@W;gvhL#^UAwQfzoB85C_Umvh_Z7bFpOhUPmp0a;hkcFoGJ?Xq=oylFEoVbG z>%xmr)`!O-{70(ucs18*Ri><(mZHO0Vi=-mjT1?r73Jj7X`}e%SZ~_4uC&`}5zsgH zA>7+9b+;0SE7xHrl8|cQH|li17ZFXXqlIGvXzjoXoJ0w7TTs9x@J575vWJRBts7ME zvJt)_8XdfS*Y+9csD=BVwdb)dtwTxf-HsAA;J6pK2% z@TQiSWZNcVCO9&tUG2!2kokbK+oHCSE>>Kd%tuyRPA)wm_*K#dI1knu{`VxmzCYr+ z1J48P8PmEMJn#P!O-*d0sSdCCCdz7n8zuG_=}lm!U%Jf7cfY3ffx`6Su;TC419rKjOn()r`9=|rLc%U-O(r9Tqa5ta3vunwYs zIGPuwwGwZa^oRrs{T&7cGDNU>kJ*DC?yop`hsw zCb@%QA36bH>qGE{*3ej7*$l}MXoGGW&Hd=6!X}0SdY~%BV3hFKM&H=bX;)4tDf!uz z(?$*Kaq%VMWx)+M4;gav4Fmg>4x(Scybt&}@c*IhHYQuQ+iov}>HnQxZdbS2Qtdxs zp1QUE;(tkZRewr%eIOPUz}lYke^Ab~tJ~#V`vr`v0=B*&teO9t>ct*=!`xSm^YYymXXs5*Gt?)>KMG^hOUJzkZm!4awEU{k^HV1Bxx2LfUt&a=( zn`MO%ZK%pyDXtMlP^NFCYQ`-HBt~rAM=02!M*RS6!}%@pX!?CqxB+07;g~15=l?g( z)4yStk;k=96y^yq^pz=Y>?e6E7vW+OYuU@I`KA1b_%6*8Ch5XC;?+^R%rZ8F%~MM8 z-Ak-&MeZ&0ZJhmvvwG50d*f_u6q`s-jkEsmaq8aL)Dlb>ZtNc0RCF4y)e#~I^8)(pZr@_mO@diihYoRQ@ z?}06z2}{%aoSBMrKsOIGx><$03ONAEfw!P4{TFf@NgeGm*AozOJ*W&J*Kjn%BCct? zop^wTm~TR405d@^Jpk8? z#!aYT;;^Z%*t}Xe+o^dPjg^Lt3Kdg_jS5y2M=~oiBgLZwqukvKhR@E)nKQhgyM1DC zeqL#5UjAU~qF&?2_qqstGg}=lHS0)Vq`Wf(co`-mgJl8MT_!Ix`9=z$l1M-^p|E2k z7dIAtR9V!Binzt%Jh^{g0+8yWBeG}U<3#B4b$M}~F~Ag$4ll_Nt` zE&N&{j@{ij+MH~1bA`+zP9};B3phw?pb3#lh%jqH8soo_}6FYyWL8{)s)m&VE{&*h+Tg5!)RL0y()nX_0bHxDr7qP&BebhVFf0D}|F% zFpej!Te%#-3mlTXpowB+5c`>bds9B?$8p(lmqZ#OLu0-*>{qo9bk@y|&xL7n%sLm_ zUXaW?$!uz$n9PQCx3A)!7;o7TU3Nf4?SE+bA&j;h$v=4kZ*h#`gaF_z+Y#>7IuP>Z zJ|SO<=*te0V~lECU?ZeGE^LIXjb_AjZlT>1@L-3It_KYr--e<`^9ujMui;-fgE*W4 z7IMrJ!&v z;c!G(5vhpwp+b}ux%yZITzx%8^&eXhiFTrD`=IWDyDzJ<|429a{hR|y224YsK)(Rq z8be_U zp_juxa~J-pU&VOpz6JJ!3lu=bF*%+6pwz3Y^BL{gcGu|V?T2Dt$iS5r z;EM3ssf%RYav>gDGmxeewJSIG>qoZblqT4F8&fbtiF!$PIIjqo+o~d|K+29vv%5)haMPW zEx-HjU#wX*dE%-E@c*t~L~?GauAY0%_(1&lq_n=5jK}}pbANGhw_p5XQ6UO^j#P}H zLi6e^iMEJ~?plB4+Gj>R39B*|z40i_miQ6JNX{m24jiSlQwj~riLMn0&lBK$k{9oRy}wH?1p_w4wY?wuR` zUhG+U(a*W$@&H^aIkb!U@hQjHWi6;Zh*<8jDO2oKVE*WtS@1~o{cLfs;$At0y?Ynh zeORwv48PA8_v%&5$I$Ef`;SdwmnjSFmyb<3AB_H;-$QLGSNAF|?$z=?3URkyMP29& zJ4mngM0)*}u3jZRKRjiMoI%egD5e}!79N{2Wy<-5?6P`%r2xP7`?%9Fe3w0ngRwZ% zG9NE82jt(EO*zKj>(#TgWf)GaE-dWLBhhc$Iu1_I^&j*u?A;Rwce2aQFPs8^k74_P z9)Au$gQSgjVs!pH@iakI#M3y@H0sQ@a2m*6zk#3dI`|2_=9jz`F=c*sPe2hZ=>I@#=IJdi;wQHJ4PPB(g&6th z&;QO^COT`0dv*?u!u)>@UjL+k(~GLunTFfckvK+yVTiU;bdTjWBQA7)k5H7DiSVm; zQ39hW8gmwXV+C(FrzAH!QD_kIp^XrA5LsNh^Jw;@6F&BZ1A-Gpw!RIiF2E^7Ua!~P z2Tb_@q=XJQ)k#CT?#Gf+MLbOLK8rpP0{!r z;jT3(`-K-gJ!(=#MJkbJOr=Dj3MHb9X2<-9><+mSD}?|&!9C61M z-W1hPPwB1HY>T7?;o#0k;91o3TFH1;L`HX+NFVi{(=G3}969~WPS(g?-KkslQntXh z+nxz}_@g!s^`7sVv|@Fi<2!1-+OAgb`6*w6^W8RI1C6ClYei;Et`%AzVwCjAr9_WA zQ4hqqN!X<{56l|1FQq!`Vy$yX5sp$a1tMK(AGIzr?T&|LwYM+M0~sJ7vXM{-u@Gi1y#(C1ME)ZRWyt3t50cl9x27m_q!ZdRz_Co} zamyI#XPy936#P`r!0-gh-%I^#Do>>-d=E}1Sg1;nfcA?GtPE{hv9HR|V;g@e4+hQn zy{rt;_yeR&)*thrv9fK+2#7HoSpOG;EVF?Pw2aLetQy^qdMKC>ec)Ym z-EM4z*QW+WXhgHT{M%1Lx&kKU*B}q4CeG<4Ta-w$OxKdq++xv1D;pvRb!W-G_tK`B z(@V>5A6e8_XZ?E?RxDJi+#l8yl~$?#Su?NEFY9{I@Eyw4117AyxaV#5?`Z5g#(oxK zPlCj{(n@xxv2$t6oq`PDu%CMiF?tWZ&~Dp`_xP6pEwmMk!x!;R_Evk3drx~+Z#v2v z475BIhzhmhN5@Z&m*cTZc3`^V;{)lKsjWVrl==!L$A!rW;9bH5p$Z0#PmGbOV4N&! zu0$>Z5E0sI4bpq!Xqdf4Ylj5X=t>Z%SPT@6BTj41zx=X6m(7`f=|H>MQ{O8$pI`4D zGO#3ZaczP!r()z?ca9ugF?>Pd_N3IF*YxbphOb$JCBc~AR+dTy`ef`iUCMt!kpTKu zSlbc(f62~5Zt*R!{Otyqj6ihCu!tHgq>Yk$wV(?Bl%+gw3KFjo`9i5w+F23p<-0*tDa3~@QR8Ncg-I;+Rl9Q@ZmSHZ@OXaKhWyoYZ`8ua6rqHnB(>Xh#i(6`8kdHrCuyI zVru~bg5(J%P~ZLtMo|G9mGl9k!ULD`QB6t<_Lr1j69?23eTlJD2%OKpbLjYORX?w| z6ccu6^nUg;`*(L<%kFA9N&7ZAy6?i$G%MBM-FZKRVQO8qQcX_wvG05=A;8WAn456U zl;SWq)u@L?@a+U%&x8RJ2}2G>1zFjS(Q%VengFYbRohrasF` zo*P__^;9lW`YSPzmwVCmGnpnYl2nbNk?Jb|+mDJbm%!vEvogyV8Xg;-8kWOxFJtzS z0j31^R@n}hk%XWXluZEK&ej*N0(Q^?0ecN?e&D>w`g3-_vn?nr_`ZQx)-AsB(z5Y0 z`}ZmxcH-_{We^}LjocfXlJX_yiA66jud33n zuGnw?hK;-PTKjI^47vYNWht8qdXpke+a)Epp4b*jC=U_w*k<|lM$l9oNR0{l%a}YD zXk!`j!3Mmjc`-d@J3kM78{!F}c-ou+oMtW{0|C{D0!CEP6unR|ZAB>`rJMwKQJjPp z7zHc_pD1iZFte#uV=fZtjlvu^Wc1|8uqqS2&IaAM53qZs zt}l3L*0xi)0F_c2fQ7^q5iCwArGmzj5a0xrq6rZXye~etymwXAfQtA;&C;&0@8xkL z#wxh)LS=!pSWf|6Ek|^tFVk1xlYJ3jjTaS%2EOPrL46yyQ-5;53)AqT+iTDx<1jh2 z8>yDiL2{|*)7$>a{otFl4Word5e@>wkZ6^(I5TIuUmHBQYV6qJoMZ) zyGPh>U89IG`Y^_?K@&9Tu5F@LLjxORA)yo{@~AWgQlkc0UMiiz6-2tAQiPC(viza) z0tw(y{S*pGR>*8hY5CMV9icb;B>)N;6<`B}psjUl8teZm2W${U)OXAQ1Mtxtu!wXV zfdnMVxdFUHoJ%Bt4R8{`9IPUbbLG4FmH#ROjHFCbDMaR%{@tv*@1C`P+pJ&Anzdb7 z`qo>RxYpgfA>v^<{zU$$o zOKN=svpvWPpi3_*TvW@8$>IVuYD5Ox$$XYnkTU9IL2<9bKFAy-k3C5*qM;A=qJ*|VgtK{{ zgffRzE!(hR*_fFrYrB-r+VnB=+yD9TrdcIff6YoPYI@_%rpt>e`gb31AGN==&)Uu7 zyY&NTSWN1(uuZ@gL56!_dR<0_6kclSS^89tDt28mYBO18W>To$jQE+~Zw8X;m4dXg zw7qF^TAJuANpL#QLM*9lLhGi2;waoCr%-J%YAHallE{^)_e8?GlZ*oyIS;ad{9;xK zK(_yr`2liim$fM~$IxJ^hGd3rZD?5AuiJQ*jaVv!bs68ie?`&dO>e%@RFs(Y4x(mg z4DIt9L078c^g1bHQ3gUUGcugX?t;m7#u55A=A0^JH?>WCzk;esBtQJi>8FsKf3XDY zjfRGwTn3heQ7}}Q>A`lZ_&w##JP&?6q?n(S%G$Dw9(y2i7#BQ9 z<3~jRQOqax*Z1v^H7Z;8gm)=cuBAN?F3_{aT$DnbXc@rEl_sYBE z?_@bo?jsMw4tUAS?n4y=ew}xomv8W%@KWlys9kV@ljf3u@X}xlw0UXRh97s+AYKML z8t&KKfv!@HBn5T3ckAVV{}QWbRiHM&{ei;3SU5~wrtVa~ zMNf$;WJRYW1xCTgY#Wz9hAjiA~>-ncpP6+0dY+}0Eb)^EV(ZF zJS|Q7YUn?D)jk82L=`%!@lc z^EL~rY_)b;;}#70)!K0!suI4!Mx%b*X-T&5_7-@+X-Ta%P8)o*L2q*Bx3$I=I!QI< zs*Od)Lk68Vj#GvJhD1u5fgsEVm~Zr+)Gkrq0ZtTM@8ATwZ%UWOM&EOE`ss8irE-dV zkvu}4fYLu|x{OJt)Bg0#^qJ`^(l@8Sm3}H+Kb20Xkq^WusS$IF8)%+M%R+= zUTk%@qzbh{vs_@{jJb9|L4sdF6$v-4%qBVqh3Q*pzAl{1S1@SQA#WVb{g7_`*T#pZ`8rpx1 zR+;m&LOrhX(aEQi@luO7xgdE(^5$fj1^^rgmgHAr!_bd}0pYslkZR8GLl8gqlm`JK2; zA9I*VG(};$nP}#r2;myKtvttI{f!X@bv8tBWjABFA#>9}vZD5grSn9wVY%!wV9;o2 zJ!oapWP0Q|-0hmp`*?2heCv_td5~R*UV054L5^xrbTD5^DnKDLL8QSaVX4Hfrotyx zZU6K0m-WndjT|$6LF%2?q5PQI6Y^5qN3^TGuh@eHmBuXHKq(C>$U@Xg#G!QQmA&DbP`MZ6>{%6aF z-29Sx-udN&=kH`gpI)0rL$UOc6x7jMkL$$+MI> z=TE&RzoUA-{|2`r{Dn#_snf)2Xwq-2R8>hsjk?8>jM{9lZl=NZy_j)q7%CctnwzG- zlqcau)YeQi0;N(CUSyehIHMF0ZKdVdDRXG%UD6z`v)QO9)(1h|H@TL%K6icV(#N~z zBEnl#8H*tx5U~vSn)!9Xe)6(UYD9z`>OuCT#q61^0D|ix0DMB33p~A+AZ3G-d?60guI&$kX zxyf(gbKNY@z0CcsTi^gqB*61pehq?O5*Cm94%(vksi=wVYz zkuJhF70<(}7S?h#*^srkB$WP71k*`P3i}tx;RS}3n9ihWGA>M!`-5dFH=&EH5jIMU z%MHbpiFu|OxA1xC>_j>nm(KF=by1qi8Hk{rf-*Qw#89tFD#Jpcv@%GBLsbN!jgUZ} zC0Nw_?=bHi?|QE?*UK8(WOocx zNWOw25XHyFf~eH5ss=+wVW27)KyVs-lU`_lDQ!&hLZ0agT;jR}q)gbYD9J`0(<-%` z{S=7(CevCT;~yTg6(Dza{(j4Eq0B_(e%MFWTUjP2CK#K%XdTToOz2`NrHLtNXgwup zwHg7f1_3z%RXj$kHRe-6s}bW43pA!lhzWvHE3^5XE;b&116PBK_W{BF7I8oz6%c=g zm_Q3l6eUWdM|BVaE*PIQ2`!u{ytG&y|Dl~~7n1;>O6Q~w_<+(@=#9W4+uh{=&S+?D zuvX*X0r%r>zSMZc;C!0GSUGBB&PA*j+GL`0>o|E1IA0Q0AH96dT!==?O%j}BX^;64 zs@cAdzhtOARR~K_OnqNfS)IBX&Zi9C6S*#P_TTSs-^^$G*f`&#KJM}* z`TF`!_()OexHF7ReXXV75k5=##X{a68|<>mZmk>lQ!9t z8gS}Cwt{6V$IfNZFM43~R}QxAHKNxBEXGL)Q{sy?9i8`(iUx_Yom~GtIw*~kc=T<% zc$7h-gLs5W`k?u@!QOl`pMws(D9UwKuoeK-i4i&k8^{4M5iBK3KwFFg4QlqG7OCN& zEbUV2&dmpi^OZWH2eNc4c;GvLk$fR|hLxeOR4mD@fK1CPB^lh$t#MOF?+WxPkg%VR zI?#H}nW*%OPlEAz+_&(vUbex@=Frc#Q6-zuHOl(-?++k2ml$80xCX-+7&QIL_+6&- zI``HjdDi*+=PFarp^3*PyZa_PZxdvrSYJ`%Cr?@Fp@+RvI)bYN``}tg>jL(nXmQ{f z7Nn!oVghmSn&qbnBtC*>+9aNmC|W}20?AB9a;q0CWS~4sR;C)r&-joRwTsO=V=Yr#_-@-qtMv!V)kjH_T<{uD3ySA68(VIm#)zb?&0OgV%T z)CI1UEGZb>9bY<21Fmm@usVo@gFTi&q|wO5H9&j~V3G^u6&=~DF>IW!sfvw`7>Hn) zv3Fws5LJ{}O2T)B{k&jWwluwE~=yq=YY;SK|F+<^sn^j9(28TEj);PT-Bt>H&21&BGkJm=0$(C^+@6!TKCw+3h^Yekg1VDJ z0IDzCh=fo@87wTs|7;w?!UzLh);gZO?dxCKpV|MkSG@KbyW^#&#xJY2SE{=&J9gjE z&suiyvk%-oetC}Avy-tOAS7ZuPgs{2h70_0v1x!8B1Qob&Pr5eH2F%fF=eHtqwJU{ zVRJQXO)`p!z>VTYe`XB+h>#9N>9TYhl^0|3xNhNhd%yAW`Cc~CJKxKzyo_V|h5Vfl zdm{z~IgzZ7u#C6Mi9$$3Z%skosmUe_6BP<)QORdz!ub!_H?}E{IoHgN*&soiTE1%8 zw(0l07dyWn!vgN~z_@l`T)H&bN@XgLM;6#1t>x-kQekAlkg;w4Y-JO)P+w~c3r_(< zY7JI_yz0G1E2`cY0a!xbHpm#`2;u@=J_~#Xz-b+*3aCJpk}PG1ox0D?RPGhn;(-VR zI8eJ#y#jE!q>rp3-IY8>*IbLqy?_XP4WC@vVpTy=Y*0wleq>aNgnN~AloiKzmocj+ zc7TI=wu(LlTy z25nj%SAI+*$ALk70{RhCuV`s}t)=nrYzNz>?moY@|XJgTLVKTGQZSs8YiWOWy; zZAtK$Y_}FBNhuHC-t;yPu)sUsdgbd;;7+h3#jxm{0Cm~zmG{P#Ne)sEF25-HnxarV5gdRHw z@JTu)zF2; zg|1D&bZ}fSPFQ>3$bxnUi2{{+A?3m&B;g$XWbP9i3Z*SszkW#tWYfhz2ib^^A_@d(HcB*a zg58IDI0amdF0_5R@Ri|8A@!jJFLmKnulUNo(!Sy=UTmu;*?hL(B+Ap@+VTkM1nv-B zEJk38F~^gDi>cU~iPCE8qL54>Ai4e<{j>b4;eS|)7N^ky39@P;8!H)fE}=HjLb=Pc zj`ouHiQ=v`KMDDx9O#JEh4x)ivI=Yz<~&}T%rcY9l4mAA1$*A!`t|$f zWZ=^%3&QvvaUNk0lbp(~P|~oiB6xIhFp!W4J#-KXFcfR4z@b0vv;Sak-*;yJzWrzR zDIWVIG`0ck0JOI_w#ojb{qb&%GTXG>EQ8(dj2F=x>O1hqrAp6Q!@?=KDLf@`QGkyy zPVKdCku);m5l7FR-dptZODGQSPNtg?txgcaE5h~H3 zQAze~I45zG4ijox=oXlH8Q+r5YSUR6EW8|~g$5p@D*G|qz{&k0j2Y=O{rVj!Dubp< zwNELI4Cny^K~AtYd}LBMpn~vcwJEJEOMR*K7`s2iv>Z0@k1PLwwn8 zHhA4D?8$Si$o|7Q`-WH6Z9=Jz8g`LTYme9~5P&9w9!tC!^#~j}aPu}zHD86i)M(`y zW~pxEAwmHfqS2_k@?bM!N~25dhBSE$T} zkW-Pv)tqdn=5?p^j8f^bvTt6jx{d>4R!MWay!`_6|s~Yt+U___y&ujgheJQ?=-4N8I zS@n`+?O;_t`hga2b@h44IFIsWtSX3~+8}R#SrI%HYz@jQf<(UX57v0ZZP9&~VH|&l zAE2v@%?AHi2~{|SPb*svBo!uENivTl!Tg`Zq@=Lq!u?Sw1zY1(dMj;>sENOXCQ$fw zm22SF4NFW)O!iFcX1gzQCw5(Ekw}uAeN)y(?tq)P+ zn9d4ymbTQN=`Zv1p?($sFN`mQE5a-@c_uV=o*ByI-sJRTNE^(b4Bxe$S#Nm~pk^Mi z!nBVmYY&cC-SUJ>v-Rm5So0^87{_0__^0w(WN=nxvs2l~zRGUR=8LkoWOK6J3-adR zFD(3JP=FvMk-kt##y{HGHGz{Da50?ZP1J#C8QSjBFYARr7Hd2lA417pN?+i?KnQN< zQd#)T!y@ZlUbClkWMxi6FaPx|2mbT)>-LnC%buEl&x-q&);_D`Zm^$l<=QhR)(-iI zb;mU6tjilew}-uY_=8tBeSVDQ7Wks{0}Z77pFP&d$q_a`4pu3qz(sAOvw+7Fel#H= zlwPl~F7=@Vp6W6DVHT9bVV+V)iWN~ zkVnBNbHN!zeR5QBht*%yaz`Rq(I9lwMVLV{i$)x<@|Vva+VaVYx?Nk(yzyE^kNSsm zYH#}XmKUp^-ZS0~sGI-v>7Rae$BQZP$5*`eE&p=GRX-nc;}ZLw^Z&T_S4&pH3QK%4 z6?4`H`^Y7|YhC1b6}Zr{1Vu~Ta73q(Ji9C=&*GCyTjt2K5(L(dt&n%Pis)q}!#iBb za1U4HR0szj@9++1I0J#bey!fPKYnrkVrH z`_cAJy~bqMm{ZJk=BK7o4Vjj6vUw1LA-Wlz%@*jZ5GTqC^7CQ&$p101mA(zvQB-zS z`q-oQ*rN}#!R%5c_uPj_DPN=HQg%4agR?L5Auj}>jvuxrc>RdM_M-Z3kjViA1|ctt z=}Gndy)(Q#7ZD+TpH#1c+Df7N68%P<%X&f%qNy3n!JHz&Is&h=FXDrwA4H`Q?(zD9 zx*1+7X5bIb9>m^EU20meItEc%ZaRlO;<$rk8Rk^pn#pEnp2}>^grkt~34;+5Y-|Ex z=yAjOn2#D(cCztkQX%HSEy?xS0mKa^gzC{WID-W<(hMUZjV(nm zOM<#I;$NC(W#&DV$NgzfrSU`=)b5BS_8~6v%6SPhcpA-1JmE~&w5hx*uQrcw&fA-J zDzANJ#Pm4xgV19{-BPGgs2_x`vXf1f_yyi{bgPNv7L0xX3ukxnVS2=VDi)<35TZ-j z0VsJY?|9AM{FljFh76f~+wfoBHSd?NdA>jN!KwWlK7OO|Gr8Bibpxwbq>r;kRZZ@< z=zna#_qpqauUYo|qckt*KfO`Np6^)`;{9P!ZsK5sIN#08zsA36i=x-#@_5 z{qEKIurjCJ8owZ(TVWO-&I$KMWMw!$I2<>#&{#2GMxfWprlo_p>&#HRbubjdE9n?X zK9|f-qs&)SODC*q+fwax zstVz3Rh4Kj2L~>wx&#*kp{75kafY{4IQ zd~n>ZV(2bo7xP!uvSW7OKmH!du)nT*^6_PJUwaVEEMFDuch`B^jpN32vhDCybEc`N# zvBA-i6(a2C{n$~vi=EBS>MQE*M$yNTmN&H(b#*J$cUsIA6XiY6v|Ph-zy8|(aFzY1 z)2GGSLEdV{=-twFRv3XLfl}3PtcI-%OJve=fK5cbpsI!HTN%VR8m+jTZlxZtT9;J# zGcSYWyi+(rW6Kg1j1Lm%$Q4i_E5u^3S#ws&`IpBgbPws@%R|n;c`F2c0SAl^X9XPJ zY&RkasineBb!B{NDY=Kabb)JVS-Wd!nd2IQBS*g0&4#%d9|o5Yd_Y(?&9A!E%S?8M z$z}*IP~%qIQFwv;9(aLF*nhyoTyh;o<-`Zz;B`k)!g#&FJ+Cwi?w=cZo_86P0rGpa zk@A?s2b78=r5cC=z(MMTNM?HckR9f~@b%FB7;O15k54g^&;G?;Kl|mE*{{B`Z{w-6 z>XJN0UVxImA91XD?Yiy1-MB{^HmLszvXy@QzBV8#UgFe39Fd=%>7 zBGbYTF%i+RnyTs)oCg2U80b#Rq!8>5A+F#PQiSf&BDbRxTtU#f z^YafPbledt%P?Z>dD=lDVVF`rD0I4%k{PJujxsTr^Lo!^4HHN6mtX$l=-F5785=g^ z)eRd8?W@$6TMGVIegi*?ZHBmR2X`fle94i=ZFf42=o|(NRMSs zH$s?SKSsDj6c;9;VhcQsBe;AO{A?`DE=QCjePx?>xaPU!Rb7W~lng$QijU4Ww3d3QQ#4W`f z1YmZ70^9Bql0V;Lr@t&ulvkdgiRZ<1$`O!HJcuV-Y4wJrmIJyNACBi{ASJ-PZe|4P zO(X^c;_DH(A{z-(Dq1NAHSbc*T^FiD^@W)02nUW06}AY6U*O;kN3>1Srt?I0BdDFwaL>~)raaF3*?+WKCHwsawjysh{0DoIeFtnx4vs56j5Af*xJxpCy~q|U ztxjPp63_uS)58r)?@?!}9MWs5T%Qzhtq%ECd()()=mr$`xr=8@_H{>1tj$ZHD( z>u*H%aRT%B;fIW0DyJ+(;!y@f0?@0k9LYRGp2lH${Ii3L>BdxkDuXS`cqn5_2Fz<> zfibiwG9H9ZN3u5kkOo6b%(4^2>XLo5xF{1b9UYW6Wz#n`_J4lj1n3u+m9nOm`zbyj zzw*k5Pf|Vsq-PPI@9~@;OW6h#p)b}u3pTA|z;VAc&q_4OeaXD_KEJZsNYGfFqiY;(+%izSpsu@mko*_eY!7$@sjV~@DqdYJQ^%$4E{LeElf7W#PGbOiWnf(^~|CoCd_^7IE zUHq(lYM$pIm7y{R0tONZpp6`DgrL~aG%{&`wwYB12L|bM#25puZA_FPPSA>g$VF^z zK^trYoJGM|5hp|eMY#@$K%KmA?Nb$kJ-mD0eeeJKhoo| zZ@+zm*9l@L2eD3Kh~+)5U6=zpk7_01OC%FuGW120QPmsH3s;1(HS*d_P!K_1+@UNH zh##2T5mzF_bn2nF;%szjKC26%kn9F)q`}9o-3P`3;^3UGBad0&n=Hx;&n~>M@aDq5 z6@FQ08CE!}P>3UiG=VQTK4&bd^omOBIW*uSR3e91g;G7%cvy9qlVTZV3LredK28Zo z2moU34@J!BNK;sxciWs7-_^g}yZHVZ6Vt= zHq|K-Vu4W4mp^|=p_d%=tcjkrP!}f+c8+n*cP?|9oX&((l$dFtd8B!cxy@_>5OUOv zH0XaZS=MwaS=N+JmU+9Q8VDYmQ9G*QhB60_WDT9sweV7%dF)!z78E^PTPXTW5W2l_nt1AXnr z2XQS_IxA+%+oQjszrKg=*X#C>mpps)I(@2SK{_tBr}m3P>fH1m!hGnM53W9`jCgHc zzwj(6MJ)r@;+bl=q#i;A-XywTn0<`^+(kt`t8#3xuZ)q~_Iu?k2#xO1y7HdG z??SvM7WZNukBC#B_|&+#HvU6g%!yMpJ}SOC{$t#zUxJ2bQ$&_Qe_vjn1(XJ4%TW8k z2b@gCavmCSZBCHMtq9Yb6J!FOph?#Yx8O6U?xrnGzt7!FFY39x0_jt6Y3k^0_e`;? zt4@x!Pr2td0so9+ROWsdZ?1B?Rt3D-W|YSnRDNnCVplxgEOW5U9)aG@&2AK*TceE; z1bFRGa!`VwM_`4$n;u@IB7$&UUNVC5^-a>SBs$ZQBxWU#B!!k7mYjeK-aE@57&o9 z$HS4ZS`i+Kmzu+mgt-F)NfLC;l-JHia-$`0Wv>6>_a{8XZ(BX?vf=R6bJfE{_JAb8=Ftf5)MvecTam|c~bCTTMoIU3G2 z8Grj)g>ywo&K13+1p@w#KNqHN!tLSopX{< zP!4+F4)-PB(bTKHqd-|;1h0%bz+&PPOX($bI``6BtY}TN0syj{dL?@s9g1<1u-Mh6 zzCS(xvHtCMyH;O4e`(#S-%i?g#e@gDlcPrf350>e7R|qtRy_9|S>G2!cYQT++RD1M zvB0FM>z5C|pt+&)ms76S-$*@i)3|AWmg9u%O=D3pnul>-^`w#jgkO!rS7T1lwAlQZ z=o71njgG1DSeKY^#K<0|X+E0dK~W4fgG#iaG(XUotB9%H-Hnb(-HO}dM1dvAT&LID zW|6~w6Nm+9hQ^S6M_`L&%&|peq&f)3O(AltC*p`DzT5trBRUud<502||WDZ*;6 zcOgzeZ!kP^!M8CMUd__eFaOUVi8nsMacH( zR=_pL-N29n9IfH?&;6`2)WHZ6(k12fpKl4LO*(ut_p7OWmR0KZaf62pG5s)P$mR=E z@e8GH70P=z|Mkd`zy9f+r=MT3;`tq$UwduyDYc4WVctXf2vdWpr*ek!kT$&w2u&N& zH5n)lGzE)7!C(=bR8ON1xbDLc$Y2)79)*peU_}n)RIDnb*@ZN*kg5xTy;f1Q#ZTAy zX+X({60xI%29}I05&n`uagjGW-j?6C-lNg%g({ZRwn3E&3icRs1zW|KOVJP)*Q0N$rh%V zpQ6B;u+zZ&k@+HoLarP-KZim&G&nvcE)sDX93B%Ei7-v^(-ee@85o!b!UeClS`)!K zWoA*L&Ur;)wAE`eC-PdYrXY(7NmWB#9OgB`GC1wSST9&HJ|F|Jd}h;&^KSa?heZpnYx?eoruky8zIN9m+4}FP zF=zd58bLL$fAGQU`lb_qe*7vXKXg6QL;4;GA3-ZS(pt$Tq9&@BW8Do;JkO#+F8%;j;kR zq+@KR@}?_RZMkRKq6Ig8`+dWL?b^^4D~4+44qd){=(!@GA8WZLrZ1qTtXZvO{c*|i z<+uOz@Z~q$aQVY)`4M|zfBT(AAQy6eEMqNppyN@+|X_4d+8D-A-8nw2J% zQbAsEB)e{)i%f8wJ$4_}<>CL&>~60szM>nMTgyx?&xV4$kp#)#Sv z0q4~}#rq!0AAmY?;iq1aInK<+$H0-%Gseb?IFB+&GQF6-oz;H@74aM^d?c91z2KfZ z{hlBHFk|lQA7A?Ek5@hU^j{qtwtn3s|Kb<*uNE(-tEuN>$@y~|M z3a?|t2)dzrA7KI}N04;&IO>5tfUKMWHl*&~W;(zBWh;KA-M!(?U(D6V-|$z*6MvXd zey&zDO+OQJzkb$y@x{1aJ#Lu(@QMw&Sp@^`)nCF;1Bqe7a|4d<^d%;LgzSfsJvXL> zh=n?V@friqt1{DVMHTAhE|aB&YlgX$n2$H!c&VMZ{nS?9QHDW+vk!Z|7u)ptriCZ> zi$}NUu5G9fa_ML3>sO|@VGy$9d?1QT@%y`K5lbW5i}3ql7vT3VQE7=&u>tKJys!WA zcdL)5mQiYpzIB`0CH=ck?6Sg$L>jLBh^gKDEIP=WwMtt-tUx&Ol6ecA4y4r_iyh0* z0hDz5YO**+OOB*9e+97FNGa-iQ(jx1$YZas06)k2GUbso&y^hxxi%oIo1YB&!%>q` z;&PJ8`UhCMmHn%BR_*`xudz;$B`CYpf{bcT!vc;}5-885tc)+`KEu43QxxY9T zooBk~oU>c+g;Q%T{LkDxTBTR1>d34x4qg}CYay}(T4(3x>BH$oaq@|*@E`2tG0wG0 z)KohlcRM)b{nOO>=(|LpBJ(n$4GM1G5iJUGQk!{#br!(kkPcF8=+MNS@nplF*(pgT zcOryb?t2^5Wd6Re(cqv4^LycF$u~LlPv1V7N>c9IC&kCA`Q!<4Q%_Y*{a)HqI3M0L zzm7AtS*txO_qtrsC6~_cPVq9DnoD!DXj+hpOA8zG7i814Y%0$_8-(G0Q3qTfPq@)y zjpY~m5K1o`UV2&SRi$d__>!3=^(AUaGC#Z3?~f!~%T1Ah&CzPX=7KhnYxD3{AIR=& z`<8=-O8+?Mu+8tGl_KeK`%=~CI=H%iq(v8 zbSZEI8AHQ7X{NsFFZ$b;y6fr}%-T7`f78J3PyhDPmD3j7aqHh7p6;!^|IOb{{?CKE z)e8N%enc<0y`TENrLtla4gO+ZmAJ6y61^wA{_Kot@rSQ$FsJ?|{NoN;K6rI(m$$Y` z+e3kkH4$?ZMYL(ooDhu+(x4z+2Z%Sf^%Bnl&%++|B2ajG$~_|CEO(+S;u8A;G$Y!b z9uxd`o7?6$DG_06h{TU1Z?oMix|a#;bd zZsV47UjS3Z+DW>vReLL;njx^Al>~TqK6+;RK1@C5@5>fRMTNm>k5?=GaODj}P1aIg z+2+#X5`IvMOM9Dw0e{HU?N!qyrTRSs>ALQN^hJYc0%Wt;v{Sghy;FZ>qW$Ba{=ED@ znxC9Id*f{n)6gsJ6A$WMv?D&do!3sIKGl*3nUsNhs!Ouomy;7Jan&m`x>}<3q076J zMe@{~L~Ed=sMY1^>%%C5))pp=05nSNE}Sh$k~1~Bp{G&+^QowUvXb<-h)816`$@oD zOQ8{nkeouCK1*L%@+!_*dGbv43D`sIwl@xg;-7wRj@GTm40L#Vqr!&vszHZ zhdDtI=&kK`-=nDB!6y@M6@wJHR1HZ(awr1E>D}&PSJ2%U)0%~fPK~}DX?!D#w~?AR)Tt9%bzyr%c#pGm3_`?Dy^7}LJ^U@oSLYPhPzfe*6BCT>oY(~ zi|=P8be_Pv%~Ho(U9kC zaP`L9dUTy1r{d!CixFiJaZ_ocZFvvs(Y39#(C2I89vz^Pg@fr(0Q7YKt*ov6QJkTi zBw=Vdn1;_)8lDgyVS4oCBQ~SQSvjRYpuVM{#4~3g-b=;K=dBDG7>f-Ep>nk`K%J>P zK6!wiH~7`?xp(&KJErHWXRZ9@nYr8VY8rh0g(DyOxN$&l{fA*U{HCI8=1leJoZl^4 zm)bk=!s-3bo-)67<0WGk4LEn^oWZ~OegA&n4lPM``87lgUwJxYd>pYY3r&@Jou4z` za(7g%E|}AuMwQXPGMZ9KBW0lItRkAuF2m@20gvID7)^;$I7ZVVbgh>rbB8D~wg(Ug zkrbxJEXqP7?!xS>P!J>4IzGNhe@9cl`zclk&b?>MJCMn`D#W)^0 z{sap>sivt&BBtk;PJ8>KbJs4o>`%8WnXUcqu)g8_W$P$fb>gK923H0X?q?7@p~IImY#N%y%=Uvb@Ta!d}M-LvA1OXr={T|fHKHIpXH;Pq>U z9%5g!2rIZr8$Kn6N^GUx;@muUj>D7Z_7>Z1AO$GRbLTCzl>#uOv^d9+v(Q@{@_LJ- zVJ~Vv-HNc~!Tz&ZTJs7)*^5{GtvPX%qu5>A;)1!80<{T8Za&0!ADQu$&?1k6599_V&Ao_f(ah(O}Qt8-?cwjizt@Fypt^!1FmBUIZ9|sE|q5gQ!%k@nmT0T zW~nt9QiF`RsjS_hdL7NOzpUM1c5o(m7ns~^mNtkkCoR0TxQ}JG#09k~WoL-aUzHKw z-rCuaUq{fQ zfm1VN0Hipg=9lWitNL{7JzRf4zx~!*=}M{{-n(0$Q&K$nyZi2A8BS>b1b78cA&y&w zYMznP3aM)$P0pj@JerIcXOy}|X-<%)cxi=)y4q=;jTV>*@L<;p3fH-mnI%iSbd#6L zykzl4Q1O{lXSt#{-g*^$2frI0Q+_LlEfC@2Q-`;mG^l(>cNqG;(;kzXEFW3^-ql^O zn37i1DH=iE&W^pg>F&q%r&2TS|0^(_Q#$FdO?&hs8u<9#um0}3Lx<-7_P6s79lGv! z;>>Rz{JZ#;`n~k=`fp}Dv+BsIYg<~bS-tA&=H_dpUaD#T(sTyaPQFsB{bEp(N|Mz{ zF+W5T12i%~y}VT7C1i}ET+l<22B$KuFyU`7O)f~p+p?DRo~b8 z$F=9x4ZHK($yd>}`W$fv#jn58XL8(*8jN3${6xQQPUC{{1xo?}b;t+|2WM^wHo#+; z$71C?&Pmj%*CW2@%&&Jx<8_hdAO&+bVEaeGF4U5rn^bwP_utF$W=2lj3MwO*i+IN0 zv8_YaLS`1?@H)JJwD@7CFvjoM=u`Le?p7a*tt~h+|Kg(UMHlCvS+F)X@yy2xw--Kk z=0tVPuu=ANho2L2Gk&u>bk6W|?W2bMxmyJAGrJ?*_?0vY*}P-xnAa{9zF)o}-!>>4MQ{lxNWKZIE4T%{1*(7(FLO4H(t zaVx}+4&1cx3CvaTe@sbuDY&&$ryy7THAzn;3e@;772 zPu+TFZ64s9q~E(>F@5`WWBv94!|uL&*Z|{E} z_1l%x>*}Vjl#iMIEX1u)XEjjf3O0dn6~-W*UnK36G*&^tVrn(?0oLQ)@KXZJ1y=2& z3(Yh}&_#j*Zu|6**VUj-4!Tk37H}-Fc>_z>jOI!fL|~;(gOO&~_Gtf;!6~W17%w5v zh19$C$5TJmFG4%t1^Q$9S6xU?wI@-&asdhdSGO)(rtev%zijMdu4A1c@8f)}%P7Rq z{nXb2z#8;+0No6;5we>qu#h-I5rHJaDZ&yl5Pi7#M`*$W&cAZH*OBYaVAK7*MgGf2-0k zm29X=0wyfVN&&>`MU@v4P`dzL%ULK`ZYcNzl{}^@W4{=IsZIe_oIybe76M&|S@GYD z%KUzG4h1&rTi58%U<7DIQv06RqxL`fjN1Q17mSX;WgPf*FAFWjz7!Hub$yiWXqN_MdsG1*#CHdX0ArQ@7uR;K- zwN(jnY{O^5_3_j;q#k-oxx}r!fQe$)>bq>`>GSsnIcQQLO@LoLmh3RM`BoF zR$@g0S!}MD;dH&MnW?HolnyPrSS&m78n=(6tzC10Qd*Tu8E{u-6i}*?T$d%b{G>k> ze!=tRy1gXylOH|!p6i7$4f_TJ?^o-8ij#8ao;7qPWm67St-SdSyk`n5jtBH9o!3SQ zuMIHP-bH^&ZGi03vViOWZ7*M+CST{ZcF@`bd2yT$$cz7yE=O*zlylXOJ>hW)XEDiQ z6qj2Tqx=<3pKi|8p^sCh_xNubzk~Znjo&dHzvEKnyeB|OQ4s)?JD0I~swppk`oy0$ z2E6#C$WF5;efV{LbIGvqk+5hEf5T~X{OVI3qQGWoKL~8)r=UNd({6%4Tjr{9i5jeF zI|W-x5lj@qmJ@HuQr#`KV6=~~#y1)mZvbSmI~-BqY{atZ^K4p`O@p#2dxa9I*P?Oy zJW8vgG$=~(6@8;Ll|S!{3Ou()$)QB^07kJOkJjeV;5?d_cPvjd<;$7Ov z!2)ZmJNBcBB2qUB?cvzFOp%tLW>ZgRKrfW*6(9-3Th(AFWO2E(>#*>u zp(ix#lAt9LiHJy@MXQDi;hJn0b`%I6P#)vvPLy|KKR8P3zA-QWauFlWv0Nd>=ho+n z`rL1FMKZTX?y%eyxeTho!AN~LQIED#2@nWm0@YEUZvt*fKBpKWT#8eiKT{Mz zUo{v1z4)7Abwx28AeLsju#aP`=_iaoe3(1#@tB5xlB=By{5pS_lWG0ME4T<&Y7v4P z(L#|gVJ%D&YDVnTU($El{^tE|-2>0Rs@wNa&R54^%WcWgAHDxC&D8YyO8pIVpT58H z-kYwTKjZSJ@B7PVpTACy>n2@#>Btd}F4=Nio^NSvIGk@VW6>LBgJE^5AO8-`!43H~ zJ3MXKmG8H^tBrjNYPM;&OEZ3Z6hke>EURJz=HA1$5D{twjw=c+o-rDSjaU8j75EIPA)*^V|Go zeo+QezIx5YraVwX{Xh-1Tq))yX;hM$l0PQJ4@p*E#=YZKW4^c1%YrNg>np@3Q7wnb z=b~slhrYsYL(iQ|1WHu}V?RHM06P#wgK5A}+N6Jc?nPbu4gQ6iOLoy8n10{u@ohNL zFa7fy`VVH;$!YpE-gT}iSD6N>55REY3$EJbGg504iw>@Kjo@PC&QV(E1{rp40J>jv8$~PR*JCWKIHDE?EFcs!7aC ztVtY8m_{Y$CVot)O^J<(FHld*C6FEGwCtVYwgn8koF|Y4Q2{w{Wu2T)s!ETW^NkYX z5t6{dFDFx%@6)61t}8&sQ?`?b$9_~D!J`$cQezPhy-Q3!{=I}rgIii9qQ)N zXBqc9WzMqk|8SVet_D8D(q|Zg*6FCQJhM15tc18| zUO2YUs8ufGA(HVWj@)`+Ybge_t&lxN`%`TGrfrWjrLCa1$}FD4*q$%Bx; z^FiqBI0z-i1Zo`32~aAPsIT$=7t3%8UaDx1650&p|Ksmk5&mP?Tv8Dq8W$C@p)qLn zp;1v085$7;>;@$ka4TF($O=>5ojfNvM$edcPGFQJflO*^Av3^-+=|KwO^nM_*27+} zNS%c<@iPN#O0fa6EQ3fo+D(fX`f;^ez*+o30)fC9;rTOEIUv8%mlF9L!F_Jq!iHr} zJ&jGO=Rc$8GdL+XturpI*~L1j1HTd42z|n5&O_u$q5nQw^i1?<{a;6m&R|53a#0#4 zdLCm$FETKqSpff6A)@~~Akk8PW8F!dXeTQ8uGNZztjU}$Hr3T)t?`cba+eu^as^H) z5XS(GPjN9yqXF)Qi<3rcmKA-kGernUjq}2b!fV0@!lsSkAH&>WkUnmtszQGiv^PGX zr8<-~hePhChXK{et$({|(M{DM$yh zVp+m1fv#PEMMaz4&ycP&;KitKKPlTNeujO0NWz-}`kKd|%jyas*jfhc`o|=#PHs$! z4BYjpMP6<|U6+@0t1F+lK)cS!B5nO~+bdfv|L@?gp~rd7!E=BdfwnONcg;hQP{OL# z0en5$N}Eu^W2GNa{lOX+M~?x0jdl@s5oAD(>sUsoJljyN(h2*zP+x1Y;csvk_yXj6|* zjE&O4C>@K^CU$-R8#pIQKSXg$xFLMbhJFWh5a5Gm*B;)B8>_7XUl6JUIp!*V|Kfjvu~0b&^KvYk?(CTWO~b$m8xftXmW5Uu>UM2bf2qH>e~^E!9}Uk8Gd{>R*M>j@|6*Tn-yk30 z@EN}jxR7>_&#zh`sxL&n(+<`@*ganWvC<6SxHoo&O;#s) z5Q_o=thF#&SXu~kPYJb#H5A#lmi5R@wC0;i8JyGIY6*7ro#jIrQBi4_O!(q@&u|z@ zr@l{7O_3<_)x$8PoO&C2=9FAVy6kJ)hyuDYswtaSwy11Pnd!%}v?1Ja za=y)q1STMM0Mft}aNfrQP6sYLM{d{|`k7{dSS1pQsj#4^w8}vIV0*Avl~lc;Wvph8 z2xar?^m`xBUrHU&-*RmK%bG`?*}Zl4Lh7^X4*k>UwlKL~|Azbv)Z(J&Zhj^8*``S? z%Wk^i_6NV8eC0cT+xEuVDGwR@M%oQ_lNrtL9>K7|=LnMv zaMQr@QvqOU12km@*!8&4`-Sy(8s_;i!@e+UPCM{(fqDvP_B4L(Tp+ZscB)4KaSeAN zqj`<9Ck>>F&5&`i;Y-3KBsPqJrCj)AN_lRRsyuJH>%?Th=}s{%OWS=&7r?HPb{Xud zX4q9lkDeA?(%i7C5MDxRf^9XFk8_;Ku$^GnNo;QAi1wSG0WkcZU~>bL!NBESEpfTg zO?nEHJ0?N7Rh;C73cy1;BXXye5gTL%5cg5mLu4RvZ*-duNbCt1rG`N!C5DB?Al$&< z=8c$<8`c*`i2lir?8I8}-$UT${RKbL%<(dxa;uhfdAoT9gUPz9)fO*cE?X?YGN{pd z#muKIY|NCgG+=sau(dywIu{q8X|e^&V*>+%6Y=>O!f(4$jAq1>O@RXeb#8#bmwHrw zO3j1Q!_dDm-<#;bGP)q8Gs(vX`;k~7`KP&(W@US7LB@GRtzc(Q5mRog`!xP`K_~p} zw*Oz?Z=;A25pxN^Eul#u%cE&o8UWlU(XWq)gH_95Zy)8#in$)a0Nfir>gf>Nne}oy z05_X3a=oxN;!d#4qx}9qK;V{VaoQIFW8=T!OGxVuS zbjE*=ErIjoU&uOt#PGf`qp21Z@4Gf&ak_2^sbGme!MJ!mdsImuv|cRO{$t&zFzXnHS;zDwg$R&D()xonf#zE=_6dSfCSh z@K+o&;-}!Ru;b1$FxE9d!xgLTbQC8j>+#b}Bsrdc4`B@xl5N}!hIQlr7{eN7K2ODI z7}lerKSl+kSZ|DWgk|8%O4a%Q2*=vUpCRhBL;Gb`tZVG7m}>ST%1U7yAyVLlZ3cV8 zq(rZe3THHkv=ES80nXsCN9v;5_$bH415xCIq8#Oh`(nT^;Npm}{Cr3m!K?RK7?DJ_ z{HiY2xOn=uv2!vBq|>rT8xj`YHyoJ7(vuE-`Z|rl#6S&fker@LGL~W{xXtU5BimIL zFiQM9u>FyKlEhxbv|m8jJAPVBTi>bgLo4VjYwkg`8y_-GmBz)sP^%;Z7ds7!En^g_ zW&mLyL|)N;r~Q~+9c3r0J!+q8e+QX?v_;BudC_5@V6&&gg%0dRAaL|gAh7W_W&B0j z-{)vAminmJdp?e^67N8-P|gKO)*u%t#pwGeanS{^PPzhOsSM7KpwTMINARu^*FYD@ zg$Fx8H0SZToNoMc_!aW`vq4CW_6iv45Q#=duo`psaleb8uo(e-HK@!H0r!;x zX8KP-Vmn=I3}W-K9x-NBYH-Wc>Nd5qNu9!YVAEHj>`3L@X`}daV=FMsR?fbOL0XjZa&{Q`~aS~&3r@^=F_AYh- z&~31Gje-Rlu5*CIO{fQ~Idx`NF>;8i>ww}7#3cx~-9}L*na?2Hw)|LrACw`^%Qs(= zPhaL!m;A-~Pv)!F=BLfhPX0`^@AnYWVc++)hh=bfFA{2uvMr;tEL}2o!M_IDejfc+ zhRawzdrn>IR}gXC-gkO0|Y#pM%3;XhyWw3D@t|14g_}DVhjFQF=M|QXaaEb{qT+r4DEwV33JTN1V)26 zR+!$4Qmt@7{pk?e5a@p$J%G=||2BZOQJ=h9%C1g36E2Da?L9US0l_Cj;Q@g3oz{9# zSIP{ug$YNE&zyNk_GBYQYZ8T&qxFV4C{uBY7O=r|R=|1{SOmNISirO~Kyw1Lih%>A z!+z?1(|#4F9C)R3EeV5%$oh0>Ol)S+YwioOEFDGHAGe#I(xb8*{rEtXsS|x5?;Gc} zrJt1ZEt=nM23{JdO6>IxDMWZV#|*dy$3aWIS=4KYuN>8aEMSrlfpid{X?VuAg#rI) z2DBdURcJW@i0Z4|1XB-EA0-oIEP1n(JooM+s0GodAsFxtf@i5i?5JMrko(GQw01kK z*=9tZIr@BjpmFc$z4!w6?o}Svk~S|(y~b;@dmR>`x~G- z-36sM;2GiQv11OR$5a!hx#6bp>hKp~(-YyNVKE|1--TJR!Vt`OYtqEPf&*e8vVYjw zGGc}ou>2qa!hu5hnXoc??b2aov67H!;;^zF)AR6*vwd%ZNKvM|knc(7x(vVHawWJq zOVoE2u1)A>`Whmbqm6q+dBpmN?GgJUjz|2K)1DlO(y-{P=#i)@0@1(>lprX~O}avU z;)llPFuXy?hZWHc{N`D(*7))pJjp;OV4z?L^#N33_G}!KX?vFCZ^x;2gO=y#I6crA z5v6yJMh+NJdXP5(t{D+}2S?})rWjnD)Fh^bRfFH>gf0jwK?pm5Q2p8<%?r|jAg~u` zBVuvlD4+No<;4P$D@fXM(x8>VTT;q~kUOM{CG?LW`)xmu*PqHEj)M(*DdK3^%J=l(s{)VYv@VVtC3j7PZ&$8j~scm&{NJ%?fD*2;pZjsULo2Bb??8_X0- z<#&`(ak-sQ+%fJ{wUquM*HXRceskTc0NMtjLsndW?!k9ms@|z?%BZOFkh=b>A6DLs z<;m-${R`_l$TxriTD2icPLCX+gnNXA7xf#$o9Leynou3W)uL!h(uV@aq}!tmQIZbj zBA|D*l=XmQV|X3rAzoKwb|)T9J~h~i8ifOo;V1n4asDA+Aft#k*n{5eIt9G!mZ7mfsh3}aQ_-%LgU4j5{#*Sa{QE79qdqAR z3Z-VJE~9EfqX|``VB~ZC3mwQZLb;T4x!9{Atnz2Hd=zzAvjE(KrkiYQhMv}rWnZtz zBLN|pW7-H7i4w2VY~HC}u#ccdUO2p2Ug1%_=sUElwp>KBazHgyle;K)O|CjJ_h_z| zn@byWf6Nt16Z{F6(;jYFYLu2mT0_Xe%LF)N1)CGb)A(8t%*oRMmDiB1Cgab9#dtXld5!tc_XEXT6hUrt3naZuC6wdB^jG=SPp(=8m}qd|f_D z2IBvzJ@7zF16sfpidCcXIsgGCTmfKj+v2f!84#G}#b1b9;*qw5&)VjSB$N60AF)Q` zr{FJ)GsvWb=Znj=8IOAdlx)nC&Mz9C5B!ynopa zrs$U+{d&}h%WitOiLSY7%7Djd(EW!~!?8x8hfU|1PXe>82+{dLAx6IIA0tLE6ldjK zkSBV@&yNcgN#DG-Gr5|@k8+Gi4-W~&;{&2Qu&6ys9Eef=#z1z1MQJQ(aPmffUslG! z%6Z>FcP{~;W3h9x7+i9&L|g@2P8=}UpXsd(Ku1_5kb+!^XbDG*O0HB{Y+4?~QZtGU zlM=I_x>r@mLxoAv8U62g)zgzcqM&~GBi)0F@R4)-ZSJ-7QT>YtX=KB?bq)AZCtNyB z|F~V(KN647z0?%%GVRiy`r(s{Uf90<1^$B12=%ERLG7^S14#LG&ITTo?UrD147ta}1wbe9TSU~V_DKf(Cz%YKq`i-^S zs+L{-d4E8+hB2FQP=%*0P4=oOfHK79`fv#~QLxkkb-%igTGr+|7PB~;w zAzSl>HD5ixZ1c(eo5wvV_HEJI!haI3+x20Tqwk{)NGFb|x+A5Zlw$+#n(QOxRrS7R z&jJE+G8nCPvF8Z8_$v1`Og4L=mp*a%Z=C&vafTLd!8;hFowm(`3;F_w%XN5_L zcuv66R;-}bm%OSH@izp*4On=_dc(zs1`fPE;cQUl(So>L8Vw(Yw%S`|l24Og$OVZS z%~3gXb3{$fqMQRc$8u!gtHZD{tUf3#-k(^HwMHE{bkbo%U!_l2#?1$qG^)a7_)hVM z^SL-2VLT574YNl4>X7~!1wY(J-jkoW9&7mBa?|!mYC?3yHM8%Jpyd_(UBGG6Kh%Hh zzUeQMYFGY6v@W}I>0NwIkYd7Fx(aIp6;wuE`!T!M%1(q_p_ueHjqJs#RJUZ;;$-(a zt0(FaR%g@+re|c2T;Q+(6)&*6X$o3S!Mn}b@TODQ@TODQ@TODQ@FpW0{;r?i!7ssI zf64d0PyEvNJ70rOeb)Y#T@0~bVZX($szw@IIV2i62W~wi!QPRE3Yr0xcS(@G4AN6U zvIpr{kYd3*gKL7vf+qA}!~T|Dwc+4&gitvXF4-+OOoR=D{R1ZmNA$nUbt5Sk``16k z;m>CZA1na)t{syvsYE4qqD+i~RBY8J`i#x`j8BBn3-{6Go9Xg>dLeDs`|+2kpriV1 zYL;J&DOiXzd=t*_V&(BC@#JIeJYeNIOj#x@R2&j0tWiQskrFqDmzMQ_J?hL&wB`Fy z=7-#*tIZ7T=TJ!4;tfS00LW>`wKv$<8U9qxEMgO1Ym(^P3pne)+kk&w3cUXk+Z0e= z&`=Oxw3n*0N{^I^juc+zP1dZMV+<{jC>VIcLCt4HG`u>)rPG)|WmNUB*1T_^z-D7mRokD%HX0-~gQKPfi+bq`(D}J4+YN5Jtx? z1~YEDlmdI1-D3`H0NfSn@0+*Ko|m`i#lZP~Pc22`O6ke>aR2au<^7wVNACMG_JPGR zf!b@F+sqI21P<FL7bhq2_&dzhLivWs?sFMxEC1%jq4~NHpxZ6-kVH$cSg+jS#2Pi zRB{U-Ev?oYFUt<|)Q=MC&e}1C1Kp41ae4AwDRkih%1HF+NDn;Dx~j!M_Dh z1kEdhGz$O^Y-6O8+_RakzQfu8>^F+0(|PW3wLzKRkZ`~04v)QR7f=P=wvaK<&gsTj z@W3K|XJ519PVeXjV_wt!S|4e?VmozpfG9|Fcxq4>gB#zf)#4f{4m(5FP6M9GdrtFU z+Zfw4+cMjGHuFGrq&iuBTQ#96%WQJ=1N~8jV<>oz9HX6s9i#1o0TK^Haj(?@Mst(h zVMa?Au*4OuBR=+d<`CFnuts|}W34wMh^Zu!TSFYKF64PPgpIkop0tKF$w zt;HQ}s)p4IQ_>84e%|Bhs&Mum>^z$wW9B_>EK#|~C26jrxdCbK!jNQs`X@JCD@$ij zuc~CXf=PX=IwB64uq6kLvA_3i2A(?>VGV6Mv4`H%OZgrpHleglI8S}M)+Ny9P_mQ@ zU<~`9oh@O@`4(thOQerlqmEY9-u6NEQ2>N(fKk!G$Gpqn{o(>9m?Cn?O1DgsMA|v4 z>lbl#8kiO*i(_%Bfh)Esejt7<&cWC8s!Y2_Oxl2&erau_bJd;l)4@)7-=Z%}i4MT; zG}5=JA6pQevA$29(}DCYZC?1BjGaFY@t`(<9V@0rRccy{=QEj`R;~Yh4(vcLw_y&h zwbM_WGDLD(##vA4Sibc%hCatsrP$R=rOhQ*}5XC{H3B5GhOAbdCGA3s^Ok%F3$+8rr(5p=wO`ubku`)H<2Ib)Ox7ipwy8)Wb zu+rs;A(6h#0Gv@7f20giap7fP?abQ3MVgw$r6tVMM3!rk7@eS+#G=FjZZ}9zOL|T! zIk<}877vdJ+E`iOx%5rb-w|m=9en^*mB`v*Gt-C%mr589y$L{?9JxuZ{_zUfP7$?rw9S z56c$~wwdv^2-4XNQB47`xbUk;UVki4MqIpUlw6v9xEr_XYv5#d57~8O0`x~_vOh4^ zY$7@xt&pG(O0*}0bXGbnFR2JRo-r8&%wPU8h(yx1ZY155Wzc4^!7KV281(B8hPRoT z#`DS?-(=brJ_rgW1Al(Qs__#Udw$}$RU5D-kQ0WD(3oDA5tD+2X;Hs4D_@!$Et*AU ztKn21H)?Whb_)#2Eq0=Md$S$IC$m-#p|Vr8e&*FkR6 z!~7Jh6ZG|))s{Q%I5`t37QTlBcs=&x9s+c?VPiA%K_`fBA8ROt@R%CKZL8~(z`D&XZ<|uQU45n58 zDqcJ3Z33&E30KNbRmVvy{nS%Qw$o7)h0HiU@dxlHjE{6)eN3=2=#=^JD)R7N>lJza zmNBnwd*#7vDE^8*^Q>Ptj2~3h4Gn*aC=jY1(buWxoY-^cgR?=#gK36Z2R5x`7~+y~ z#C$3!sQvovu5@-jO{}1a*>ri3E;rGIo=ZFuFHH;pil-P584*c0DaVvTQP!43>8dZ+ z*1e5sTq0uI?_>ngq^wis$ zTvO!@0Zjx70{kvM3eV()))QK(M_{tJr00pA;;Ej8z%H8gk()<8x_RH%Pv1X!bD(~N-Z+1m zer(8H^KR0o)T>|pT7MH+`gZ-pnR6pMXCJ*CsXrlyHj-{F?IKA z`s|x{uD}<73Hz4q2ddU?`3Hi4m;Mbkz~7u|XL10OIb?p^tp1PK0Zjjb6Tpj2<*s94;?&sNMB0#>6eL8(z$(BXI`h95rbOD@o)7}Mc&v83DD2*qq<*>I6&+q0mDaT0ep0iqWzPc>-1V; zNk*D5&UAi1-KQWkvg#LiZ9e%Nn{6_v1Os!1+KPJw(=hz)V&wM!pyl|w!r8W($fsDa z8C|IUaxqbsjD^7+deOSB^7*mIQ(uw`J1xS1;bY`POCnV(}IA)%V|W)miirjLmgb z#(IV?X=a`kCpsqGNQ`@JrZ$!Ee`~BW%0j96u5^J!1fY&6+ z4WU2YH4a1tIB_UYXbeki+ zFYOaH!Hmjv7Y}q1lz>bxqzf2$l$qf@WmILDwTsQ5w8J6w6&k{*2f)SqMm!@7?$;0?@-7T72#b~B@55qNm_7zjN4ns| zQ13={p>)yH*+A@}O!j}gEI)ysmXRH#{gL|T5P3O5eP8eX;)~t-NPWHVe6H)Ci>CEU z+SbDiIyvJ}#+l&tS!pUpzW*4%o*54$FS^D0t~+MG2qdjZy$Fa{ElO00rmo#VirMjC_73HsnAgV1}0K?+~Te z*&#?zgURmzAv0uT5WvB;+G-Tc1|h6~9iDEGP6X*}xcoN<9}b$*{=T73)ABJmv(Qll zp-BOqk`LTODIKagy!*fbNN3A_UEgnrh8Mx3hK-s?$N92>6L2N-rXyxyq7Y)%%tYf2 zwna2|1W_2|>fz!lE+6OW+Zqw&ig-bWfM{U6ZMvie3t8N*>;}k_~80a*$4eJZR*c^zz2lD? z;Nu`auWZ!L^}*5=L2}2*V{)}AD0fgG!g!nN^FgjGzw8FsRdUdKHo5M&&D2 zQ2XrkrQ-@LM6Ry^+)c(zDk%lz7Zgb6gdC6pzuWrOv14yN_k-`1EnCFW1;4WOT`1_7QD26R@gpnwXRSLthe57Ut|@4tjZzbEzijB% zY;rh54u_Mgtk9MkK(I_6ZwNOXFw93RBhBlu*->AZg|Jv09MYq+Xi?UItYcZ~9MB2| z+LnTf)?`wHP}0c#GWDIYHL7~B{{*oZ+3`$P9K$|6FV5yaftaffSjt4 zqbmplyZ;k9v}Mh&ru4Y_z1s#}qwjx-KGu)CLk>xRAD(Oqqyh?Y`gf*LF ztX1ZTfQ?k5)W~|HUn={tUi^;h88yiNu#|O6g>#gO3WdS(E_7L<@%xm z?oNzjGvBKb}$te_NwYt6=t6o(13pRt4tVE zG8f;BpjffKhpCK<_ub}P?it-6UNcCHpKq8ot3iJU#KxHzxH!r4qJD(wuqf9~QWQ6% z488ie&8nKX*NfFzN9-b7c}D|Bhz|w$s+T~IsW^Smk>*I71ffA@PtpiNKmHN=(T6G- zLq9TNL42mGsbDTG$fZ;2kX2zuCCW{X=av6lCCVQgMKpL5;2{cs7WrT}8bdRx`&lFE z|4H7AMx67YkLvY>z6a((BT~Or8#;$TR;|5#&B}@6u$KGdY}p{O*G6XKoyJ}p!q3~^ zV&j9kn;c`L{HKFecA*9jKOHLOz<)f~pd)tpgVhcupCir(XnfVqApp?Q7vq;<(&T3| z;K;sF)OI&@{`>}b-ewCf@r2E$FcLyayb-xcyG^!{ z+az(h%@)mWz?pAE^>Fd7k=8Xi8ntK{Pc=ea`;9C>)Q^~jjhW8#VG$(#*9dSa{RsMy z{5knzRsIwCVt+n;-%*#2nU_Z)YJWPq-J~sreFYR1&Ih0(C1WVyy|t%|1&|bW+GZKU z$|Sztb>P4*7*-=PJ4`J;Wkn!i@WE%zAV?W?qj=mfD8L7WTHle7Qvi{OHQHG|dpu+P z_`Pl%dp4Ia1z<^&)z*ks z*bev&BX9>(afhK}v!G(*Fcs^w+OtG+R)+gkHu7JTiuRR|3=jZk5Lne7?ti+5#i5TL z$P5Ae&(*5I1m8)YiuM0WkE+L{9{pUNZ`UgKKopKA$l-ATIi;L=)1*x--y`#l$}g1< zjrZh&hl2Boc#n)#%ADjk{Ckj-T!;4*Y1yR3DH%+LlHp{o7SuvoSjz>bOgw1fhFqD6 zWIYYPP38fdu)0g&hML-dY~g5hYEH?&jdB4vT9!sD3=7RF>spv|bI010Tv-TWzIXT1_!anWc|KwIjZ6 zW6F-&+Fb@20Jx?kvD8+e6XTMREAa^s%N?(#cJ5%twG5e1IzTCzb^vq@T=+DN5TM}; z5h`OGTZ1M*Qc-b!fH@>2swbdhs{r|FYhSxbzi-p)um25?YoC0YhTgKszv%X_7G6E; zhLg`-wMSgJ=c?yU-Z1OxgB-H1CAoNumU^M)L0DA;O<6kqlE@r#sKjMr>$^U#>2Z0CVvU~?@%z* zgg~3g9IP;rX?Bn%2I=A;U6n^8@+Rhq1tuDU*s6(!hsdAf2$}L=CMDfU+{@%fK;+!I zbt``%l+2c;{GfP6ZER-~15i?JR@}F@Rx(^=#V`kK4;}XHjqj~(iWzTU1bFOSnCIXc zDFI!3NvQxWN0p?+Nf1+X7}r5E@6=~LbVkEn4-M+uRMxZTWs5DGTe#wmfUV;iP@6DS z$B;)~cFVOCyKd=;LH+N%^m6@Sx~wAF@kBj~k7jVBfwKN7=<g`r@tOZ;lEkM*$vs%o+7CtP&g+DyZV7By&zx%{MLrou}}^CPQoIg;9=KR~tHXdGIj1`6%PtAG8dzKP4vY3;r%E-{U4e(SAf zUDrq6)3;Q&8TX40RIbfUD4JGi2{MEOlMUv?z**M_j*o1+Yl+ulaVq{Lv8*LLJE;#3 z_wQSQdn4b6JMnF2<`z%g9UllVH5uyIif{uiO!c>3`vi`~uPLyFiu4Z-KXFa-c76YT zod&GE_v=*;6{D@`4>O5L0>NSKG$xag}q;n+JH-9UCO$MfyHDkra6FcL^XFV zm7&l$OmY7-zZh$oZn@5)qJqAcp#1#8SY5OnLhha{th0GN_Il^#-D0uqq_@RZSdM?C z*{wm78;pCUX^3sf{sNQ@AI5{_#CX(O_cE~aQBcfbm!~0NONS1=;nKVb@87Ky~utu0PrE3x!S?8M=8ch*!4g}cf*K7e25=9%y^e5c z8*_)@fM;A@h@mzu2PiQX1cY)*5Ul5*b$I@)^`9)d#{cY= zEzkO{ZTfWmtog_Zf_`f8umK)6j6DN}{_(dOn11`M89So2ZnxeSmO`($>RLvOT>}oP z$zxh>Zy7bQ$C(KF@;-B8pBep8Uf}5rw0hhQ@YpQmbeO|#b_ry;+<772S*q?>#6TXdVvjR)NZ7XxJ?q%%b~dGM#Km)o~F!r5NAZ1R54!! zTC%xx*~@h6Lypm-N7M5;`bb)vV@%TV+P!DDMHAs-307)r1%#q z!H^ORN6nZ+v(s1axjYsQcq1VnI;<>c>vcNaL4a1-%%r%}b7%~E>#n!^R!|Y~ zLf-X3>VwQoc8vY)&O=8MmyO%ZQO@i9lq_UL5ENTb&a~yr^h_VqAK$*6Zu$IY^DXW( z=3LCcKJJ)z*mUOcn0J=ZC)zEWLg2ilc@Ao_(WWpt{PsXvC@%)y3#crZCMlR<_6dMa zS1auOnfD|F9ZhNJG)d`1!yngmV)f?iQ{ZHigPX#EgpiZ(g zG$qRp>&ZMmy`COE4i};4x}Pm7dfr%A^s?SdE-s#LeNA7 z`~jQ0&SkqXM4?z#Y$5P#gP|;2(5%#f4bm3!XPIp_ODx_J45%&;o$)Xk3?IYVy0a1_ z9XQT>djrP)CUgn%Q@I=99QA>%m$9q+}TTBRM+a7+%r&3<_EDJ z!tj#s)h?4s_TB*+>>cA3F)!U1rDT-6(O9&}=MDM1KC83AVZ9k-01<*gF)%>D!;U}% zO|eKQ7K_BJpz>-U6AG%lMX?)WcfeRPSrLPZEb;kKKV}$L9mB89jDIJ_Z;*q^6RwjG zo zY!4~z2_5yaiS~y`%$Yq9HM5R^v#%95=um`GXV|`h&d5fL;C}70yCYPTdt>e$x$2Hw zTAWLf+`Qa{(Fl<6qqb(Gl9C{s^UCRNh*MDx?Z}~cPF~K!SUePq=hZmM$ z4J%jDBGE45kU?Xf&m(DKNzcfISR82XUP zA!K?Xsq9VWXRXQN*QbyLzzPo%KvLFN2|HJv4uQ+>m6({GT-%G6W{WG3Un9VdST5Je zC{2*0j9vxhYCi*#Y>ftgZNc*4>9raCYMmKNhMAiO4H{USAK#RinCfjVcBiK{=ZLbz z=ZFKFZ3(Pj<@xe+XXy_0w%!hbHpvUqrU*1;8wS_=Z7{~@j-;G$mIlLT18q>taDCWs z0mX}|gP#3BAr$&d_vHdt`2U}G^qPtRIF<9$tiovefaD`rBO$Jev15SbNvCQnG zZUb6U<39(n$JF1dj zI{wn2*N%U)aL#ejs{MJ_4w^W=Y1$gVF}HkV5yoFVU|6;MBB4c;=;epL5~%ZnWi?AJ z-QXfME<&?8(9+MxI~&XxJ zHt^~*bl`A^oTagmW9U>xB_sa~!|pV2QPa|nYR9tI9$o7QWKTc(j}*rd@}?G|XQ4z9 z@*?R~Swke@>8sO~ePi!Ku>!s*K8ucz<-i$eFK)lOCax#(W)o8?@%o6tN8((>RQCXp$Kefg&O_yBOCUDI5Az(o>M;?l){ zk_2ZsoEfM!F3C$uX--7+D-fqVj+jqk4^OjI>=AW?sZOabJVPB{J;p^H-~uFsce06@ zp6O6I`ZUHuT!>v6utQSeMGL9|5!wWjOdm(xVdC?vB&`SFy+B_ThBCLt_-`?N+$dfz2UiN6=oF`Vl zdE29p(VR`>@)bRO*XC~-OSOciZ zD2r&np3FeKaem(SN#x5UlJqz>_LjuV$J0rA%NK#mC_v-llsG<4xldSeJ&Zg@GDA95a^sJM+QSD*2+N`YAu^FAH?KXR~ARCR`Xu~_X*{+Bds{lYpYB?3s z)=ZItw+j%BI~(Ze&4w*W54^!*Hbi3}INmBW(Nt);W{$<5Q&2cKLG%3~a`GMW4tcoj z)E;!IE6OPt@uLgCMSijBR~Q$KM;Z~+aAN%y(Q!4>7R=FcH5yImDP`jLEP6Z?H1bBo znb{Cq?22MR!i|X;B%Oy?eYU##zaAxVW0aCnALWpE?dUVw^0!Fvi@xvfK_fUi$g4QT zx_XS?|0{?ZV(yH86q{U3W-<3u{1RZF`_aFKZ~?c)h^{CBibhWRpG42bblPYvUrf>8 zL*BxNb$ySs+k4PQ-SiLXJ)CP7;9S(e&5&_t+`mGbfR4Rocz%NZyx0?;g&h3$C*|j5 z1v6J-o06KE83%1qn2C6KL2@Xy*`=V-TF)NM=s<#ycw1ql4Jo~Ck%BfV;rI`oQP@^p zaJqo@NWP{R=oL}W6B-&Ii?vyY_XJi$VbV@Y3e-OR3qom5#KZmcFHryT^RGOm?a!WY zV>Y^fzw+u+WMa+@{c@1DJn5IOzFm9kcRg+x)8o5aYj3~xa*vUtdR$s{JAY2AJ^YJ6 zMTP$thshSQ<%K=|!PzFKZ_f*8QeV(~XJE*Xz@5$7+uB>rje)YVK;!+CR~7AtrDSmx z_KGlfw>oWF9vPKKhGkBMkCR!F$q!4NoXTgVmZb92;>f5tGB1zJ%Os0Z$)Y&Gv5<8F z=_wks6Ff?Ca(bYC2ZXn#cY3{betsw+xy7Y;l%74ZTfi^uCO_d9?WY8WMfnvCH84{l z#xVos3)CoW=cii*;1?{o7{6#I%^1I=>;FPAc-s6P{yw=APWkJw}8y=O&0VbSv_$eMMkEO zen9_V}Sc?CZyh7R;_p z&6_%XRuLYI8&Q9F<(}i7-??Xv9#u(;{%4g;nNCx-!Q0u`G~wnwc`ut&7IpOJ~?UAl%5O!p#ACSbJ}0uSZwts zx!p-#>%!wC`210l^VZ@6zpAPn_t^PI?>+P2IPj%(+=FNCef0ce<0`B85#FTqB=6WE zBbQdBdqU|U&(6~eZ<)1mAKPy~mnO*1aU-~!xW(KT>O;m#VxCM^4=3}7leH=tUQ$`Y z7nP9A5@IeS#$E&+Mx`V&ErE7`zCo(d&On; zke=ex)atUPCktlZJ?+Lj25xv{+SVE2@Wfk(mQ|G_ok7aUjO&%^N$NY6@AI=_@CFlu z4X#j@*P9h`70%x^f8Ik2`b-+7u9y(k&TC(6YP)Z2e*Ww+_r1OOzCUgq9Gk6~;V?C3AX&Ksq7 z@p?q>>FddT*tgj0d#2FW=dvA8e?3&{Z1mYce>_BnrmB65L&HOSdWh6`$P^3lSqKov zrx=J2SXyX8U*~d}2sW)0Q*B@g5~G_FM2D@}^7XVjcxmA?PiQ0^(Cx+D-pfL)7C)pDTaYkPlt+=nIu!aZ+?hKXbp*EVVAFC zs3*G(wPTFY2Fe&C-5d0t)IQ-ec8s!ToH}US<7)8e!;81VOvLdD{{@as?pXYry^HTK zL_Q~t{#%=g0aoFp>C^@UdZzFx{5v=DE*1lX({F`ek&S8~r_mysoJPqk8(flEFt{ut zBF2qo32BBBG^`tuMdV)_(GuBdMCA?6H0@4<3q3!bu+Px$#@^@v;slV7IE0DN_||SQ z8-W_>XB?Nr@!P1?H%=q}gZ?M?F69@r*4yX$6c@0?w8v~}dw zIlFEqmAEGBw8;=Vq(1#1zQ7-l{jdSNhdGy3_Bu=g7k=w3+N8FfL2Vm>o=%At#TTLc zJq6}EtP~%AU~nEfx)09F8$37EDpj)=y2%a+Ekm zI0Ol8z4)!xUDju;$kaz`3Bbjd&OW%)qX?C?EIYZEB!f) zZHtsBoR-UBD`p{w!ya$XwF~RfQ8M2AfyMBF68OLz8@|pb1LFh2d zg_KZoNC@>SGzx`9MC$!`(f%SnA2}bx%RP?rK{jXEAaEK-8>dgTDQC}BSJUfr^cw9y z&$OZ6C3~K|qWbJPw4gnQznneShNn;CmxABy)!m~&#{-WKVFGF z71%H&TlK!$ZqzFuiv?Iv0Cx{x9pMdDti=hvtK`+XTJ#hNrlRIb&NJwIE1ux zE9b*p=3_1^Fqbot5x-{Yw5pi{1`RH&7%q$$klmwKZbp7MeL(5Nk)v-&PD)7*`GW~@ zp=60-c*z{nY?Ax;Ep_|6_TthWx#9FoAwR?A_SrMg(^x{e5iw!KPn%ISbKK~WH_R*_ zG<5KQ5oN|Ff$A{@`t~Uj=g2c&3%Mhmv;J) zAGFvzS9aWOA*sf_aL0c7UExpBo>=c1O0l+sKw2HX%17q=$P^!`agwR%!4kCDowC7V z^5X!G_;Fsf+2{B8e16X2tg{A}#rx_!i{qSruLV-!6?`shlfz|Wdv|LAV&vzdC%7oz zX^XrcYY7kM9tkK|jMuWSSW+(IU_l82ukMa^7O2LsK7M=c9`nY)1I-Ei$d~suHb(nf z7)o#3x^3gut>3SXyh3(~9o;SfA&cBh)WO{)y}{_(qPn*GNw%MCaS_ypIZ(n=;iCW) zeG!me?<5Pa5!#i+25WF(ysyDCFOJdY^gC?GslhP{63kAalDe>!lE}9G&h&Mq4jCKN zE%|v0g=w8AB+ov2Wc6w-2&*fL~JWE;%IPBIsWCbloT2PZiM(&c+A_Sv(OE|nZgWxF$ zL0V87j@>VH*jmxlAU$2O&`I<3aN-pw1Vk8h)e&X|CJg}h%G=5!IpvL2&0y^^fa(=LMEO9E-@5Uv3Paq zQ@8v=+i{FfJ2dP59gTytaz_r?q&1OSEBdWn`q)su-_oaZA}>m>1hYQb{^6};_>DtG zyIqmLTkywWY@MLDHDY%jR7^af-ZafeBTMsPt9yv-8SddzJjq;$Pa?^v0l1q>2KC8F zNkL4TvnJgv2OCWD(l&x{qypZWLP9AC$;k;pf6H*>z1S49!w?^rfJAqqAStm1shKpc zQdkZ15vF}Pu2^a&6rOys9FTFRP0XEb<_^YO`wC{IH>(@(v zy8tq(_sJ?ZD8SgLQ4>d?##t}t2fBC@huZ!+pwFUbph>3qv^vrW!>3K8l_0>U1tjen z69FjyR2^jFB_Q+vq;i(EJECPtCn<(8p{O-9tv2nK{D;RPS-@r{m659q3|q(i*e*@N zc;>6g$pnS*=m<=4b_{%j@G%l*8w~0x18tk&761aGLljE*NDT<) z7B()Fb7EXJHZJ6rV^BKa3od?8bJ%n_Y>Rk1m@~rxAVBmR-tYLv(e4m(9itr^9orou z9WVw<;dW?66)JgJ;{yMU;qq6tF(jn@JE2Y(-wN5`4?EUZ&Yg@YaWImt6(@qaSUg3rQ=-S1u!E>>p}gI=4HQ_0E+CpIdQfg~o#b(6U{d zCY%G`)3_OGzu_sBDSVEb?9}djB|`ORhbqe zUraOyytWomrvqe^N6tYvKr=!DunV1t#icX!p=X8xY}S4BD2`&}3Fn%&eRJc2)E>h- zC>U}BAR4tXLq>tN$F)B{xFgZ*N_uZ={j%plLqg;RB2_Pxk{dq8x1+`NcrIWO8gHa^`< z@{Eg(ow(T8iHq!rD9Xhs7zzr2FPcdh_2d?Zr^WP@>jxJ<$5rp*KeK#i;g?wMwmf2a z)*^y&4T{_45xrlD4U}u9uR2&pITmFYW!b0YVX9npu)*sxieZ>g*2UuZEJ-%Ty)-Zl zInV%@!-e$Hk&^473T}89Xqk!E2N%@l(ls(&t7JX*`oqeYS=pZ~C|+C4uPGw)ibzfG z^}YF#X=FOWvCQO={!Q^?6BwU^C*yepXyg?cz24G zGY3Zxn6UCgn&H6y72?1mrYmS50}$!m(@?~{yVve3SvP0yy2`P41w$prmbI9Vuby@1 zqc`31b9pD^z+1Q9TX|co+mY{>whpwFK&ba>Y;wsJ>2G2+7zsz05Omwa%@~lpNVtKBevkK=tKSZRwT{qVI*&r=zt24(>&D zw9RHmjj&{us3H?3VYA)lu_No+k}$!t*(!OgR*BYkGBt%3?q;LG-XvH7geLH)x3v3ki_|uPC)OJpJyd?tWgN-+>+a&eXmah)gNO1k!r02PmxSxYJ=|#tEef_ z`NMfS?X~FQK3B&(tSG#7xj0GY(QzK|))f-U#Zh@;RV>JVa^VD>)^~}b$*4GSV#gVI zmyBvz^20Yqd4@3B|#Ja8U>(_RO(DAs6^p+?b0i%uL0MH?+z~!l z^`OzB+qjs&;32AKg=ddP_`T;F56^&#Xx$+YIwGyK@(`7n$bO?cSMJPeY~MhX0;^87 z;y-;7O2^N98ye}!RSdN!P8bI$264aunw?27+4_W2EEbxaIsv^+zpuaf*s+`I$>(g= z|D;VP*|YU2pG)r3z9U~po@O=(e99}Ba~I^@wHV$A(t{Y=WC;-qV0fQWM}cn^SG zS3dcue&x}lE9;;7T3bfOK0-#V)d4tb3Ag+(!{7`=<;0Cjieb)Vv#rAIW)P%K!6ihy z;{rG{nukvzpt!YOn^jO)Ai(2BGgl;ju@WYi6MZPqUx4LUpQ0`|W(gXQmI<}KrCfs8 z>xtHl$Vtj=lxj~X#uG-EXCxPsM@Jrw5Eu}-iOwDt?A>=CYau(MtClWTamOFLo)$jWq<);8Kth|!Y@W37Inkk=YToL^A>cP7CP64(T2zglw? zfrL}!UGfknfsbFUP1mCckt<}cwwlTwQo-bhFn$}iL@l$>Ij|wQ1u(Dx^bt1eAP=ak z#2nZ>9GZ0tR&K4sEYulLzQWkwWU>N<lbqbo;!oZ_2UBQ|cGI=lzzM}W~o$4O5!7?&|Tv|F>no-$h+t%3)Cpl3m=9p(lD zCn>aGg$|g=J27COPDa_?dP*N~_1iEqs!uoO#<&_g6;c|bf`UYJ#$`6D)Gt-m`^gT) zO}C}1dWRIM!s(Vobrp5o-p|F4Q^0|2{gfp;GPFAgGDMg`UQ#!_(CJ5Ws^bwETTZk+ z75{u>EH;~``RPA=ha)1Ucd*yggQpH|p_&Tck!~a{Y-HF;=*Sv)I^?iKj{oL;q*CBI>Lj6Q2rx$}(5p@o zlZgpNALz+METnv$LUNQ+h0nJ3werJ+$v|0@19c(4Kh9puWyjSeF3w6yYxcQZs3Hjo zqva}ju`I}W|GB_m*NEO{J|f80IOc=GmzHk_53{%`wPbikWrj|Z zDZU{UK>+GU=Oi{H&&v*aTT;{0kY?F9#DqCI4PDLsr_fWFAxe_ma)UM1_w z$(n(rv}9xn@9RU5%=76)g4n=AKB)_4n zI1*!{nc;dy5%lZ()L?i5wJ$L_U%FLU7sqLFilMzq~?y=TYZ(v_Fs<@{YZ)Z4*tcIq>xCIelv$oIPXbqW+}!hTjb=A21^=d1l$rQl|T7 zYn3d=r8j)i={c}&c^`!`FyxXcS;U)#xIO8YMsm`~2&BGvNe?fnWD&8+JQ>QpWN`9;;1j0n9@_b`gAN$Mz3_%Q)u)W=dU)+4h-I)JEG~CJp}jR zjm19e(TkmF9!(|7qv_4vto9$?lMKrxL$k=55SboFaL|C@V2la%TuOa1x2Q0u zJ}@6lXh~3d_xg!{9ywW#R;@qB1X|Yo6WTlF+jP`;N3(H?OMvyWYUHfmQQDK!`W&4a zO~KJCob}Wky|(%3seL`8br*bVkIWovubHu=99rb8XX`|3oYA)z^$ag!kFp>~!z+t* z+#bHpw8vm1sC(s`3@(u!ke1_EEBtlj>+^c3n<7wRKhgX0?%Q`=R}K(1vG+icJr&++>P>fZnPunH#|5JD%l0WuShuRvk-YofNcKZ{BN=@yIAQ zN}>meMItc>0%w#Zhmc_83^?NfwzWhWMA2-TZC+tUdxd;6z1U>lWB#-Gg4u|kfYj1x zQ*h{CO5*}>kWjzMGyx3=P#2oT<>&=~*Qq&oZEY6hFEsHclg!y+d84%@S_h-h)MDr0 z_5&_~NEX?E(7h}}$aa&I)ttX-*r%%!EC@p8_?qPL?&7MH%ip~R# zMuVHWcZ8i$XPZKPNU~QHy9spW&_5@JeXclF3jAPCKVk8!m)hHQ6GXVc( zI|5SZx8zuXdI&{c%ED47X>1CpY|Oz0g%G}0>Ig9Tqdq&8KqRv@q61Adr%m?_fJcHL zj{aZTuy2_*RvYs*U#Lmv$wpFpUK7X*dQ@s@w^GOIh-aFQPC z?t(e2Ez;MYw$Kn{bD6IOjg~r|tAm?UC!yg*lhq)=-QZn>>b*!StsdtNznzBTeT z<1SA67_2+hRfUEi+5&4Kahnz&bH1Pe_x<<;wU?7Gu z0F687{Ty&RI3CInevE!Q>YtuDi=6T6+)x?=m}2b^0OfxTH;U0napfbt&aMPUCqUyg{$TQX(LeTHegV!~q(1r$HnK(KJU7?o*bFla4$>F^`Xi3+sV@tb3Br z7Lr>j1af2Fa$q1+carh~=f59-7k=)kmpKRPfr}ocPSKzkoldJFqeW@cI0|t_d{%^S zTvEFe5U3`sMjP*|^E0gq*te@XGO!;20PHC%>wauigZ^cFz`BIr7~CHG&)|KB#904F19@2+>lw`h*zy`?wI8^W>6{&n zSiNp1&cF;#rXW_^3Vo@U_vd~C}iAA^2igdhY& z`*Gi?&$|g}XbvPoNQkfgS#>*{#fW5xO*WemL1-h7r0$p6KaT=tsxI{Wr0u$C2!y3c z7*!`)fNpeccm1d9N0)fWMOL`T9^k?0v#bYe&I84TMQvypghJSzFDNWUqXq{32%=cp z2MvY50~fs#{|D_4UmiS8n{#vR{PDG`ZDIIO?$mAsAL&-xT2_%v@eFcqv_{C@s2!ksXhjBeg zkJ>notJWK^$K`tBdKdxNU?)vIdPtegAyH~J!|`N?N?{hvDO66qMU*oI^n@Ee5e(Ur z1uUuMn$t<5=tF)v1(lifUs0cuLS!d;{D5vqNp>U6NzZ#X$iMw@l7IR3Gaud4d;(2d zkF-7%x1*vmus8KC<>}YR5VGurNB;e;d;j#8J8SLyvNvzrz5AATKH3)%O9t1EpJEy` zdX_{&N6%0=X?{sLt9-64*95EvbssVu$k=J5r;tL~lXq$0}6W(b_ea zJ4QCT?ZJxIYp6Pr9u2X0vrwrah~HlQ#5{WPuDK&8i^u(UZg~F7yS7?3myHaxq;B#r z-FEI`{l+))B9Wftv&UyG2^Y=$b=8D>w*F1ZD`j*~o+TbxegEV4f4_kA*4}|kzy_f* zfZB$Iw6?)YJ7;j5{bi1CKXE9xr=33QgN&iJ5ATyH{)r(SxU0wL`}l|W!KgW8wG#oC)s}&(B3eDzQEMS$ojuKP0so@E zp3nrB&adxUYk^!6sRZjX3234f77DY`!`aWt=Xh(pyeWy0K#&UtNXT6)r38UEniTRR zg}9_7E+uFQ)g>%W4h5PBiAzipET$E}A&PT3n&~OBo>ij9M|E(BRwVW-+-r^Kl!cf% zJ>Wy=q*SQ|5D``+M3~Dp5rmC?nq-p8!oE1wkxC*fBKOp7zWZuDl1!d?x^l#b%BO$v zBt6!{I$ig>y;?;3dhg3fGI_Y}Bl!XIiSHa z;auc0%cLPgv^ORVM|>712;++$Tvaze@^=tOR+5DyI~uB$-3cd5w}=3 zkIt%M1J?jh8~?(f-O%6($UD6byV7E_`20J0YI3xlXUPY#u~f$flN%e1UOP<#6BI2V z#VJ04T-R0F`0&7A($;Kaye1)sb&8JjZr&_BKNrE5cABZ$V)rL?glH|gEs zq9OnOXKttf+UwL!{8zECKb9er!$}Nx(@V!-mE8^Ag?^i>L7C@s@5FJl$LX+pW%S$- z{>2zr5*E17c?iN6_eDn#jpq0N3x%7Vx|vrxqTlrX*Um(Ss2Nm79FP&K1R-%ObIO)F z(_+QiB+JwRasbys7m`-p7^Lwx1ot5&t+YLFCozegCrIxy5s4mqQ1Q4H;SMf5g{3G{d54joOXytYye_C6AAr5gUQ0R z=zq)>XZELVi#v!5wm7I?=CjvXmUvxCvureSZkxczi%mEXh9c`?i-Ud|Z=og;y=7Nx z95&&;eVvSPZ6QCL?CWBSGZ}y_&ia>lx&E-l9i*>`AQ2PYQ8~y$gL%Hs>T$T8EwWME zDZpSae~TrxmD3YR1n>aM#}e~8hS0?p7hc+VWM?N+9A`QQNU)0~&c*;akP$I}g4?c6 zg&b@Lr>!1qx^;{70V@v201jX@z;QNgk%?X=wB5ejF3A)rK#~!-k!?mv0JJsbUY)Yc zWdzisQ?eU@8DNl=CX)~ool`&$C}cQn$l}-6G_30m)Tu_j_zOEghddFMd&W8q%7-9O zcWN{DX)|BK)Ax`aB#o&Z@#7y;=r>RV`iUnyWJ`JjdPf0fY;c`{Of%FNc)-t%kf$I_ zL-o)dtPjZrbuz9!=+9}TbXyHZL!-?K3)>1}??Hm3f2_%pD|{Ta8QL}208^>Wfc{p@W*`%En}O$?7Nd~C z+q>EftOq@{8F0qJUeA338G+5fb6F|DPzImg$!6&Id~59UxkY3+nZW_mK)?+Uf5{Md zr8^FSevbpOdvH2dzy6-A^!RwZC$l>a0tR8&!EB*MW((mn1`A8`+z&g=}oAMeTPPN#0;;Xb;J2f%t&zYoQg@WRLgHg@;> z=yo3XDKI+^W21In6jvhpp6>UV4y=^Dlpf)Dl%7DxeR}msNx^-3cE1nnZ7k9I{549? zo{szU%wg}*t9N6V7uaKx+CLMm&@BnTmL9YzKsLDn;D%!&EBz60yWGF`1C}k|4h965 zpL4l9IBgBdoo%kqirweWLZiqhEY`(*AGfo|sjm?N~teNBRjzw8g(!T1$@n zb@Q#0&)qp{!Y<-?nl$Y@sMR~Xi#K3x<-%^nnW{_XC&pw>N|P^uA15e3_`Aq`F_}XH zCQ}Bnbd@>kGkz`IkJo>yzn;4Q{xN$Ti4(w1uymC<$h4Hk=7@bh=C!3`jud(WJ}T8Q ze(UQW_n>pc?s08xL4Fi^6TGLpEHLaLdLN20!esl+4%rT&U>kCp*j*MnWSioT(D!hk z>#~4#AA3)i`{-B_(ns)-9l$wE;a0qmoNTifCs3DP#YMV6(xGQvvs`s9G;$yBTj4`a zcc3{gE=19ZLYRIfSjz?CYK>|dx13Lf)BjBx8J|Xy(*WQe4d>jz{Nb3dOwTM>VFHWx zAn%*H!W2;>CAkycjugY`{V6cfJO1T&e|Ywum44xqtMT^Qtslb&?v6(E;hVQT^2lv( z?)&V%M|SVP6nDZQqIAwvEsRiCjM{@B7A0eUR(s(h&_d}0h)@V1LV>t?qY|v=Kwk~$ zo6nC=Tam_(OZz6RJxyS3KoG*96h>a}Od-Qq*Twy(U_u?lbp;SQVH`64{`ycS2R?K?jf!jwfSU^J@kgX0m5u3Zpi70T{8CGkCC}jPtoQQy2 z=`1Im-qS@+aG#mL!kWS4{=?{f=5@$@TC#vmi==kH59`Oozr>(}iO07~s*cj)lH+2=Dl*ym&Y zcGl&%!F6=Geh;i){T^6XzwMyIPj7;Pvg^`8v4{knj>owF1RYWR?`HS;DHaj!Z%Sho z>^?I8*xcBT;dimS_&ePNbHZY^jF$JJb26!8PW&E@;vMfsU-*uve zn14cx?vt>378Cr|3}cgoAW@UR)d?olUKuQA5%oV7Qe`2pTF43u>VGU9^*_<#pZ8IG zq<8SnprKk;_QQMjq533Z*PYZ?5dOzFXdK|Ltj@>8h1EE&#o!<Qc@@R_yHWlsAqK^Z6j#NN<#n2vZN|xTkjp_J1@q*E6 z;ff@J|Fe=-&|5ojV_;k2mL}X1jnsCyNfRS2=slmG=JnYZ4MVUSo!Tet>=s zs><2t@YFtIU50*fD4uRg=sJVXvg3Z!X^%RtN`D=J3f5ouRLAQu*ReBQC$~qPYNtt+ zuu$O$pi0JqGg{FqI)RC7=FG5%-x9|*5~Pur7{ z|Ewp6HQJwaBm#0Y&U_>6ews6DMx<+u+IzUG(#2Pz!?J^{m&sz87-fR^T#c|E8NbFl z^D?iqR$Ah*HW^T4ZfT-f%CwIGjb<=+8h&T=D~F&Azeu4?AqDg>qu8h^;zN;-F5LYq znB>Ec9n)SqaN{a6qiV@t$zFc`4;RUm?9$y=sZ7E)624%*$_Rao?VlJ%VT>WfahIth zM&(Y=<%eZW&f-U;O-Vy1wuNy#3gsvJ$T|mE>>!J5WCI57sdFYJWhB&b3-dB+?elv9 zvC)Z~=A348pjkB1^8mP)3hTlU9X`!Jd;L6(#dLf{tzcjhA-o97hxNFO72-GxNtRBT zUYTPUwW02JzpO4Ud<2c;?`maa=JjuC8jyG7>b-=~JEdyx;p(wu>$4j-m8DNOIPn(L zqk;OX>AT0wnLBnjCT8jnV8iB-W2TN`v{$r$B0mb+6G8hO>f}YaWMuBNTz+^~Wfngy zZE_mFFi7V4$RwZyI7p3|EHaVxCL((qT%k}#Jfa|Z8GuylmEdr5NhvLjE;8S>#>Kl7 z#or?4v~0vdijma;pMM{&b~TEC%ggn-jAmZO;;T`PFn%Pny5E?o1XZq}0GeWsvM$Ck z6kNd2JqmtkKQ6iZJZgUzZ}{lhwMV#iof{h-y??kY zFRo^32f+${XknoKe+gH)!WEfpD>Lgplq zp-E&_JgM=o_w(7Nz9t^PlmKN%dRKCy&E`>R6H{vq22VBwqNk_UyCgT++LU9rr+Zz^ zK`}jw-5Eg_n(zs|R0|>vfrwnMNDIZ_%wA0Igg@K87|V%f&WtODDzM=t?Z=-h!TN!+ zgmK}AXZGD#-VNjTN9`yR4A4IcvQUFFp&r~V>hOxpshRwOR3gXu;`sG;f*1{?9zAy! z@FawWm=3Ge?MSXS8r|8Df}ZYr&w|_>N650%=C--hoh<<+y@f&%#*T%~mv)-?^Y9YG zG#~TYT8OO#RGp!`0L5qB3aMhLToih?1_Ym|Td%#>9acAQ(Dn{u=ijt#Zx{UBdj^Du zvWaJNjdT7f>^yL;I&fGbnHW!o#*_JhH35FUe~q7K00G!$O^UTPm{NzxW74uTrPjG5 zHNn_qHYYpn&0aD2S`q-8*yy}oY(4*Vw^=3B8tIdH{kl37`#TGzDf^DU^V)T=n;-iH zOB5i_ZfWW=b?GPW(GWeN^M*L>jhMGo)UXfI=Sv|QFlErKGQyRBU`e2}Ri7X>01PoX zKY4tzn7lBZ&RJS?#!~2vrF7&IU}~^4#^|ZW>cxZs7g$FH#$we8qNkQonz~I_BC<+u zJn~3(?zrsv-Dc@EJ>?*~EU&;}=sZJHpM~E7ddygd&p{_8a}{b2pkOWtko6K-BM?KK z&u0!{fu)-39PX4Phq1{kIGoLPYn;Bm-lt##=OJikXo&(HGYh|7TTb1MNv>&H!*h_S zSF}i{Ba^6VWh>{~{ld0uXD3%Pci%8KDoXlz<-^#|)46eK?~3H9$qSQ(5eZWg79-D#hFvFOft<4PJc$4ac9usbhjvW>QrKh=)*?L`1-@nqz5S1PBZiam1{$n57VJv z?RvJ-dGP-{z}veVvP53(GX7tJ-|vIp3EX70PeovAfFI$R;^7yvweG4zUvcDk*yF(W zkjY+WU7Q&2a5R}rW}AW}6kk-c=?5@$jpNvXvA(+Xr_7JV{;!SR@P3r>`awkJaeuoX zjUS?g7+14)kL_SNc)lIFY8QB(KxL#RK^ivBsi zSpOWBJV7J$v61Qn)iqFN8EcZN*IY!0Sw;%wT{@HX(~8cc{KtVQu~VDK5q*$%LyR#- z>W{w&9h1hbP)7#QS1W-GkFSj94e?~MpBVfj{Cp*h3O5P5bKJ-VApw~t%BH2!@?U4I z!Y$7T0t`AmrOBC=mgq&01=YVXl^RX4)^X?|=+`tU-AXB@Yey^vXOtZov9WC6qLd=( z#l25yztdhi_Uhr^laZI6J>h@Twr%BazQ1$*#>Ok})-6Tl*59>;SKs;YT{4D@edojF zw}1KAxWNY=*I+_D{@h(_4(tbwqYODhty z{`t4dcWtU`y!6|;CS|XC^0-A>D;d;u!;nw;WI!kW>4}z07k55Bapu$2#Rb|TZSIuO zD<8nPd$oTe-2s^oaDCO3g&s0riRu`Wq0VaeLDu8^XkvjZURP}EZe_xK4!O2EuVY(u zG@tF7NK1D>R$fI1FQoNq@m*wPzp#DZzN;T}mF0}~PsC3l%K@A-CIdTBAIn;l)*Biy z7U+#QztM)QUsqIuBdruFG17e~R8O$fx@%%9eyWQtvVgUHok#M`0p9t*1KRiwfyJaQ z!d$+Bn1f7UwMXsbvowY;+{_+RpO1sxoGHA)e7Vbf5#$`cV^R`{`HpyvXrR8M@P+O> zk^%Z_l9PqlYi74^moC!#aDDXqApiIac2+QnJx20^VLh|Yfk1+BP~Q;E?D6{PbX~O% z(Qe_6wts`Oqq(X@P!dxrB>DqYVXX&E)(RvkwW_^vAznd$L@O~`$z^o~M`m*?xJ?NE zZL;8@oy@kcuy3*p_DzP%#_;*LGb?Y2i?E+Gia=FF>-k(HAm!$|0UMT`g1ejkw z@6j2v=1t!*V~2K2{+>Pgb9QCmOlTLHvl^ta-1l;CV7EAMo?f6P*e{vQF4=d9cc~U< zh0F7uV&%STMUlVpJ8L+?(hYDkn$(5cL0P&zX{kj(rpt={Hbj4aKLlSdcKncV|em^guedM2CFgekT3+Y^cR&9v%8x1?e z$Ho1kfKI0LeYOfwZ?u78H+i%yc;s|I0CGVJ;@TQGo4d00Y%c!e7apI@MLQ9i8&nwA zwz8n0+E4Kl-N0w_8`1!AlvT3r75X)m{gkg(c6?#p`SzorbBKH|<8R(!&iI{Zl`mn4 zt*R5V&D$@9&E*)pYIjzkMRsm=2~_v7g9y0Y4hz9C4Z zV&?H)?OAcESTS^khQl=_;3`~R)(@Y*3Uu8oKM&C#{z4yNsK5g_sPzSZLIvc4axaKW z9#|YaQLWAjG7IW)JSwY`i4Y98#d@GgS6B1mj|7G)Fq+~Z~!vn4B(M78&{_dpBwlOS?FEogm@SgMxv&L|C*_ojS#7QE-=_b|7GYRYNL=N7)yKz?m_+3+S7 zsERo?NtZd(6|+t=M)y8N^E?5?!(q6v`qEerlC+{^eP+odX-#xyp$tJW0Mzr^|H?_+ zL^V4KUd8PvzXyW9P!4z%)gNC$r2YKw`FF6K=_AAs>7?77sTG27S>!Gg=`tTae>Q?T zS?D56^2!3bPW24ptdc?l$=i7F;Kqa6#zTh=(RFxDUfsB>TbEdgJPl*#q$F6sQx$px zCsczXP!fer=F2AgB^Q0x?DkgxTvxclBdSX?Q!pQ}^5V|qp3bEbO{w-PDMfU5?*o*@ zm-F0x2-s6O$4)dB&(it)SN9Pw zo4VhpV@^q@`;bZ3zY$O6CVC$~(3Y}K`#$&arFQab`^)w>?Ls#KmCIhrXRnn}>ZX)p z1Xk{f-{R^Zw)K6eCnj5`-p`G48qDrI9O=44i*ddSH=^v1@=(-YuGH8oxT0x2gvCh~0g4?Rb<=+#&C-?TM>9vue;d}DORo!;`v>COz{M8A4 z2aX$GHel@4zm6N&cf!~KW#i?>s@rq%>fU3kZm-iGW^bFesdmQL-gSK^jU8Av{>A|V z$4=@y;6~&|ASR3IFW$xGDxTZYb)JI%VxHWT>zF4_`IlVx#kg+o%JokC>&mmAvdPei zExfBUD{hDp--YDqQ7WMa7C{d@D1U|6`VgAe`{hB4zrsd|N)kn*QjX(L z91ua09fHGn*=&Hhhr(ef1vDgynqwr_t$W=7?10@@SO7op!OWh+a{QH*=9J1xd0RzE znRy#|pqK#I@#(DpYQU+g4LJ7093bPC;W<`Av`kl$pu ztTKh>pbAZ})0^8jxi4E`t-qBUK7;)NAkkE-F+&KtOzO08biO8&Vmb`ti0&iTMyGUa zCg4FGe2dNPUvVbx#+Nx1qN}c1{BoXG`TO`i{Ga&?yu=%+zA|7-aV7MsFo-6}n9m*H zT4So`g#o6R%fUNy_Lr z%Kwf%?B{F+?y}U~R=Bo*b+Q%qUdLGABVS8n;8{@}9namN+8i9+Jc+J*F-Z)I zLb*6j+#!A}iXzpvB3t)nta~5Rnua7p*dUY}#u;`PJ~oI3sx=J?)tYD}>!`qt=~@$b zM4V{*7pvacO&Ml&TJ@b2UP?^MNgF#Wwho2X*&m$qGG}YQa1eq5llg*Lf(uEdHaq=c zy@KOG(P0$rUEM(m4|y`1U%_vJiL}Y|U$}#Qj{)^H2on{0JxnDWg)2CH-t4MXx+6G; zI)(ZgX1eG_tp94@lIXyq;vV6E&?->uPS_+c#{_8)Php6Je3;zy$so1SxG*WF_Biwu z`KggsO|7(QYNjzOt@CP@#!@2k9;KwSt7&fIF5oC)Pu!ky)^ateO%Y*oh!m%&a5H74L zr`o+0+$LGEt0sDB+T`kR9ok?;$F-60S@xTTE)cw+V~!dehCbB2DJ)nuxS(J#{q9X| zY3Z2$U~mC5rC}e;29)7v?Z3o${9KM2;4aB(FuquZ#z2KzzdK?8L9*_jb z5meFU4q<3*iWVYuqAcxau7B<|M2nLDaP;?X#)|B0^mf(xaVb7KDvx6@&{=|NF z@aY=A1k{Mm<$E)JQEk3Z9c8`Z;4WF@csW<@K);a_luN$&pj-GZY#L|c`LKzUn`W7o zn|^P4$0V7O?Ii3N=inU|>|~a`&dz^hZ@2SykiD|4x*B`dtm=*_u3m|Q%C4+1AlTS> zqRH3s+1c@+WTAGEShsX1Yx<-YItb`IejFSl-)5*?v0ia=mmG4E9F~P~@+^5d@O$KB z&!xC{li>d@QMGuA_b2{7@ts5=k*f1V#cI3k9H-PN-ze>hcmb&QkX1ru1i)b$R<=;ng|7lb$l20mV3YP3KTRJlu;uh z7ZwjF>q<;#ktEZj;&nh@ahbR+n-#kLsGMaZ3N%%lOYZMjYg5$zGH1Qya3#6IE@2$< zJC~!Wxhp+zDHI?7U2;l(3ZIhVWn)u{^_514_KlbC7#P+KT`hFo=&R;m4Y7;JjMoR1 z{cu!t)$TpkAr;8>4@0$OCQ80g3dqTZo=n$&OXO> zP=J@pg`v3Hy1w_RC^NdgSLmiI7h&yRa=Aj>r5Nay9G$!Lls=d{=)&R@=)&R@=tla$ ztJ;)eOz1Z#WtnBFGeIqso7zpn1?n7O^TVpAnh@U|GfJnmn_PFE#?IGGQ33p8bny7y zRqbPH^@T92Lmg1Q^582^<0|p+=r7UPSuXFFKSpQ57;Arqv;2E8MM?R(T6>*)7xOG| z@zl0xMWUd+VjPd)ra+@yU~@HMYY6EVzB^-v_Bs++30EriA|HwW#Cv+7x#C6s!W3=+ z5-J-JN|4r(t+2z^Nn0iUlEl!|!_~^kYDhZVRw`s4X*0mkI%ILtE=;IUkypTNXa+J!S0d`1&~l(Df4Qmx3JH&o`v;%v=1b+exzFxBvuzqsAr5C3rz`65=9m&VA8E0Paa}>FU7|0ev#~1pl`jG9>;_ zGO~BSb=jua{=>#|lf7tEPkN>fNF9?Z2nHofDN#l!QxwU<+Ak=AH&x_Z7ve7_T;NO> zRdYu2KlyZUYIO#=ltHFski!`yJELy~+N-kU+T2_mSOAk44F<{qH3VkOtj1refhMq0 zIT<;@e$2vC6gr}jVZe|^1-LM+`p@2k{!#x=uTs)1L{20g#_uwsl!R$IWN{hk!#aK? z0wKaJPWtT4Hy;X2y?@(x4Go_?fAAQ+)c&#?rOT7o{C#oY^@sP7(tV%&Mf;=n$Ibt+ z248=8yms`k_C0uv3|jGK@Yn%A(N|%eYF%huXBCYXO&9F^MIwCb_yI?o7t|h957=D{ zRr0FS2%pwj%r9`RbzXJ~jm}>=59312c2+obHiUCeDi@*0u_9?w3}PfX1Q4QdvZ1yh zvcSc-`Nt3WH|8wSvdCx0pFQ+Ce`wB)uRr^01ZPID{5k%0jLFT_t5u7{4dPwm!@!m< zF^n)wF$meNzAoCfTjamZ!meQ=_KS`SM3ycZAxOdT^R=utbJ0H>YcD1U_^0sm*_x$IyTLoa)Sl$yD zC|o`CY-FAArP%Ao_o()#HXYWvScH37Fq5~aNoKm~=Ggx)cV8YDReA1x-m}cU?~}ysiFefR@B=f z>Q%J8ty?Qz1d1Cu^ZlOpOhQoWcfWr>NM_5N_q@xqz0dP|o|l;%3>KopZa8i{!t9t4 zUJL|&lF!vj>H&5+;Cwgc#|4`H4>w!p{-;}<>So*BAG*aA?zObQI%W4m-48cVMUehk z!lY4dA|`2Iana2NxoP8^OZ(mvGcRoHb8g%yt>UYDa+!Dt>kCg1`;zx{sydAKlu`do z#*i^-l&mQ3bxa5m!3j3rN7au0O|!4Ci(lAT5|wXnu-{|fVJB&v7sgbmg(|c_HA0@~ zz2WQ;@Ut&BcFs6&!4vmNx9Tgy&o&e{@O9}@9s0UR$5uj$e2t~iPwv2rKdVIpYqWxv zgn*YfnC~$^X5L|b*=(d0;_H+Ca51Liv=tIJ^!!G9L%gMbh1kIQ*o8~fM8e!|7G?g( zY^u$bm8@PXia;B{cFZ(rl@9A_S1=wksU}m>B+~L86&IdsGq5UL zLgRCtc4=8C)d5t?7e%{iBdrRp2&m`iMk3X`93c8B7k<7qQN~J1J48W4MUmt2Bi7@# zBmU!3(XrxUW9SqO9af!uecZ=X6Jq(+uc#Pq4=o&CXlg0_5jnG{bdf-(D~z9uHze4y z1Ur$S;)T5l3;-O+v$HS=UgG;h42D;nA^05EH>kyj6$K{MkY;cuxOK4y5#mGHMoMjm zV}au%vM7&$5x(%-7dDQFXMQ|)&ZQ4sI%od8jXzrrg)o2T#*I70bfo0*~?+tb+%5xMs60WfP&8vG+M{IpR4k z^qIXL`IwV4hm)5wa;hd@(g(WmIgg4feQbq~8;bp8L5#7_^(y*6QaH_ko#c}^Ac&z? zq`zcVVYaju_NNy&4v%XKx^I``oL|3ryP0SM!CvWh^vNqsRJ|l^VL~`$pZS>J;9N>& zmUzKoUD7W1vuPw>ANBY8A$Dn%vCO)hMR#1U*5?fgetstO0WD&Ghosv#zMwU;-(E6j z&L!Gt_PZB0(%S9Cf(g7!)E{K!N{=faA%E@~^=wy4YLUi?cJw$v3|+;ka$OYW&Go~vOLbF#o43r-uPg> zfZo1Gx&X@wGNf*kYCuwYA3oVFAjU?A_v+iyE=%f1{}K6T#I zOXo3pVw<*b)!dE4*^Nh}+5h(N{&SjQdoSz0bnR<5PPnD@ygOcbw)q_{%MmH#vfKzF zyF&F%H=uepj5hmmW;(@uM^z-JKtxLRW3bP4w!;fejnl_4Vp)>)iwpL-IL*mcID4Jq za_0#rMo2_Dm_}aJr3a{l%6%de01gWD9?XUE8BHfInjn61a^qOkRj=Or8S=_Y+fG8^ z43--O!mrfI5Q!+EQ(-=<;rNUolY&Q_$6ZHYNLWME9oQ3sDNiy-RBlZO&aaHVpfBN* ze3oNyoa+O@3r#Jdfmk70l2#0)5bG7O!tN?$QwvWNioJ!p_&9AC_1z!RKmZ!y$ylvW z=e+*J1!R9Tkf?yg3MSNb14`%Oyi|xqZHo5!n%|MwSaqS?_}hiA?cOV1dh*5PeKzSt z^WK>&XDvPSG3c%ng&Njy-aJSXmo6GxKVKT13D_Z=FO$BNz8iefRNr!+ z_yuQBvO9DcK^*$wAP&v*XI^``L0sY*@Mq_Yo9}+&-aL0Ub9wR2%izxZ8i*vj?ZOl_ z3&fdAAo~roPHxGp*({*G^)bQ2CtfA}VR9y&L!9?Gz=R01jhNq)wf`^1w;J8Uk$`ZpzE0BE9Gl$c3K5PA(rSfbg8utH5G1I&IriNY1;<6i7&guaBG;YbhjF)v`j z)(A*A#Je1#4L_G7A=May{*H#w?3?u^00m*aRi-HTr_VS);lU3*`9y6wFlGDnV~5{u2j3LKRVvC=-nF5)a6Q_1ntBfjJQBc|iVIGh1OBy2q< zSCo8JbgUwLO!a+bawpxQ)#Ns&9!h9U4)J85L9MG5hJ*ziR>do-adkJ!wBDr6f~ux%oGhpMQb!#95^1t z9GMIIU^3b5MX-}dc`3jnwC_-?qYb_cY^bgvf0xGD~QK zDV;q3tdTVeLoYgIMUaFjppo?zxd<%XOLZW`StHyJ?@s)z3+T|mW(4* zKwFUK(gMtjRX9`ia~q#;iw!my^;~shv?uy4S+eh8*K-s9QG2glTxsuTk$zzft&MG8 z|9+D%YQQfo*a*wDmF?H}Snz4^d(-}W2ku=i+^r@8u@cFSJypnmTsFpnF)>znOyDOX z3EzZtQ`PQ1#*Y@^J1pZjp<{mjcRwl0Dq?KEYV@<1P?7M%A3G$mAaO(Dd)Cf@bHAyi-#8c)AZ%3AKIam3W9y}JhWkra&CP4kU*F!nx4CcioU>@_3#t0N;-2)jVBT72SVBA8`dLARv5H>zW)?6kWaW42aD0Q zMxjM58g#W$k(Gbqqy>Y)h%;7M=Cx%(R4TqIH07osict(V{b5MU%hyx zqFnZ5=U=qxyI#L}(ZXx=aid-9dw4lYxB+MJG`EP7k`r2T&2^dPRJx=%S6UwSr!&nX zhK;nMh=6ei6Sj;T62wzab;%HI7-2u)4#B5Udjmd2h{zdsrho%kBG>uYJ0!@3ZGGYaaWH&d!Rl z4c>TaXz|zupGSTfI=8v9xnRWH31<|kb?Me{;I&I%V6XfSd*|W@ulmL9I2$EWJ1RbB z&YY2@(?^b;RWzCj<1R3FjGsJWa%{wq;2{N<6!OkP)`{TuxdZi7(IIcL|@ppXW6wK5VQ9POc^Dk!q)~#FT4T zR9@{7or57rJuD%tCfR|W68#KwS_qnP!{2|oVvF|h-Cg7FgD8nd#H%-~-r)KQZYKZg zOy#io?}U-_ znG|OCCK9HK3;+n!`FPwM5O*-Khh?HHI?{rf3?R)x!0`$wI*cKM?h&?5uy8ErEpX(* zmFA4=U|;RayKb>^J;sVDBZ`_I}l z+6T9F?^r(Kj5ELaluZX$F@XYS_p#4_fxJRJE2%KUR*O=gR4S6PMKqbn!62D7CE=Dc zni3|_Xh^{2ZxjH5Rm zF5}_Q?)u~0oG(G5Rkp!j>Th88?O!l&-n{**e|_O@^lO+lUHrMQORx#CUbD@RqmwRo zf=IE?-OMyHkXh#47BDM?K54<@P2e_c-haMm(S_}0PmP?tZrkDqmfvo9|K9&58x4}# zJYC$tc_8s!9>8L5me6e9U=}FY8RR%`qS>a4VyO7HyOgXbXmvHBb3|2W)*IFmm5wk?o z24}!2#+-4f>GBeGVF{a5!bX-b9l}B1aFsTsn$o4|(xzahptV3Oz=vA`z9y20Ca5`x zzTJmW54Rh|){*`VdUPGeYQZc-q847_Qve4Kpzth8(CU^p{q+Ef8gPNg1tH111m-?V zp!YoRJ?M{D(277*l>33frxzYNrG_ABMlK4a&*uL4(?75BR|OwIjIJo=z^nnxmw_}fs<`WP<=Y2 zam=FOa=fCZBIFsHb|f?ElD4XfqM*s=u85T>_l~YgjjK*px3wVTTrj4l>57_kS=!(a z(O6k7j@!_Jsg3}QR1T1E1V^Y-W!1qrQYv; z#oh8Q)EqMP-s^jX%UFVo@`WAf^H4?$oJCfyAB#&`U?_Y4pBd%>6dxkkuK5=GUvU~)JBFWlz`6f2e zum*A-HM)d4;lZuGqEPf%kWCR~o}gliNaeJ-; zLE6*)gi?vs1`C+0Wpj|PV!(&>bkKSNejRjrXsD<71twPCdl(>wRR4;L%q!XnaXCVT zahhUzGl?%Lt1c}Yc}7{GGDQ0un>2RBNCOg3pB5ap=Y&}6*oJ5@u8D0yj)p$>1g&VZO5&nTUz3!)%Qcba~Qx?$9 zhmc8tb7_~F?O9T#l{j316e;}lrcGv+f=}LLOWH)+Cf&_$pkR}(T1lyzHggSY5N&p| zjA&RAltlm;HiUJs=}bm!*-45v;umUIkpbT}3`WO8+PI3=Se;hE-S7JVypb(-hyeY)pyD*;wkzW^jDrmb^pDUv^XcZlT)#_%e1;c8$ zT8PS%5%;CyibD2i;YWpE6iP`Rq~Ng@-GNB14p<%V9UdUQVQ2F_f?-}ypw9U;YW-#TCR0ZpPV2_YZ`tzkj zFW&Q;owu%f<+0gM{^f&jJVXw{jezR-=z0%I0LyOM+SkAXLiSVjgFf%m9!H%*vSLv&sf~6LjYc$sie45Cr>3S7$Qt zhwTS~7wZdn3u^e|sC$89TZCE+v0Q0tCbt)t-K3e3frfO0H~ZfI<@Ci*T)$$5ZN}{0 zKUVzd$;Y0__fZW4qxwOJKaNsNgx ziC)O8%XWe7ew%cSpJn`A{-*#KmAm{HlMM)=a%_o(r-bJOY_72_Pg6}ip&O69{l#d1 zp>b-yeWPWGU^a9jW2LBEjs?Xkr5t(C*Ge+K-@r|IQu9`;CkxoXZnYIJn4$(E*_d*_ z@|5zNB2Nlm6BaY!uJ9)E5Ojq_Rt@=pf`ZhW%s_t>dWp?8dPN;Vx6(~OLgF9m#@Gee zZ65i3PlYm(>Kj;=Ft79{A+}kBiZ%6`P$^0ThHyvjgPx+OVlAgO1Xo|9J}&Jpw$R`k zJTC1n#EVA4n++jgE4F29;v$s22D~}T$C~f+Ch}@@g&B(}sv>?*p9gx2lNpfejC;~L z6@x$Dl$WBf!0S<8g{(9iz5)kJl8w$LC1)isPa+fLqn>2KRYIM`@e~67G2ux()N%j7 zXynl`V-F1M9DxwIZyPU;sv&ZLaWrBsRy$2$y~-B~xrz12X1{|Dr}gBKh;^%1qe1j* zlJ<@=U)+y=VWrWprR<3Ij^GB~F&0uo@GXT6C?AN<;Jd?f$HmF=U-4ZaR`A^`1gktr zXi|gY48Z$#6|ziWYhhQRlz&1txCx2wpn(%T(E_uCDuhj#f2>|(BlpiBMyAY{UKqId z73?J`BNVAV5iNBUiu^%j#f4#mpI_XKI*Qb1x=u!I(R`nm@#|u$Pr`*U{B*_Ocwxn{ zsD51&IIaozrZG&_rps;8v$z(XCqCYp@Ll+@2`o~r&MXs(iv7G^BASt>e?LP?k>)b0UfE|clbz-k4Cz7JxN zlK(v|hYuZwqrH~CME@8{)(K6G0+K5r4eMpt_%WGMS!2x&a@z*&lP|UB*jCn#GJ&_B zIei!Fd2YS-ymt4AXPNy0tF~hnEBoS0mR!8^zUx6kb14yiM9AIDotgjg^Dp{|_87`mKcOAEbJMOfhxESn4?afJGeJF$K8&$N zr-$4m`A0$uLOwt7FR^5#@*B3DJJH>*Z%3-f7dkbFX5rf=0Yw{t{8p1EsCSEC|gs0R5 zPOfb)U>zO?%GO`EhZ)wh-3<4MHJD8mB}-U|UTFZrtR2+dQNRi$l--t#Fy<{rElA`K zP?Q=~N^|#=yjAjXiBw{aH4ommQLLFe_xkJc zJBj7_gU^v%hxvy00`t90vWfd44+}{SHFPzI4J1;eOatCQr*t*Y&yL*7JqcZIFO;F4phW`pQzMIF=}8i6WMWwnHYA7c!~C&tR@}cv(jgOGX*y zy4}W-_%Sjh_6w@Bor2d@IzW?Uv=CF&1CF1hsRHmv|BUHSqK z{_QUJ2o3cf94t)k!0%g=p^Pw32uj4{=*Mi%!*?Cl-suZ3ozSIiKeZ|wK4C{5-1pcF z?eH$v&Z@Ls&))P<9ni9a*C+kl*z9#Xb-t##l+VK2wCcQ|^h(d-EOwumscNlSRCP_2 zJn#Z#2JCbQL##@z5{0U?U>MBb@R34yUkP>Tf^Gd%>|JsPRX?a+aJvgI{Yk(@xMX7R z)Eb2l6M6+3;jrD<;0xQ#n%k9g_5(ZcLO($9>pEG~vYO3$ zXy0v}KR$p1KpxbdfAOY==1+|%!@quPYK$A)Nkdhp$S0-b6LV~Fch+hP7nPBCmygAOs@oj^kP}8UvWl44u6i&!J-+5lcZ48 z+3X16)Z2&Ywd*g_DeS%`VDuDU3n+>jIF%s<2`deJIkUyf3f!d zhj4^#e+!PVE9P-OSmpYuYaX1~0viN!TCP@RVa`YEb1wW&-Y=A@woG}Z0-~crtq?18 z;XI7a+Fd!z(@YUEsEI}gPShW0Avby} z?dTvOx(`5K(+cIGFnLcp&sCI&UB4o$_fP;gU#dioqH^5l>({?g z(Xr^^e?RB)`?Tk@f4rj|g))2ksn@@lnkqZ%oYrP})cW=7Pd22USbrCfGH9E$Wi0y1 zIZG_F&f2h@nb@P}QP=_7DDovVe0b%xmc>6=cRBMZE?Qrl zGlSU84)$00KJHMoDpLHjvSd7#lw{mPW&& z`MUTeU}`BrQe7ntH4M&>I5|cFL2-w6$z7K**K3_~YNjsw(acMGmMzwP$68o=%A_Sr zR^Pdv(=B+qSX>L9E)bTf1&L65NKC@lB_`x{S$~x@b(qMjBdWFzNW7FhP8I>(#&EWF zfOsi_1+G>@I$MjjK+aI;$t6*+LbT}$8pH>&#)*(@^#k?fx#OHmh7WNsne6dWAs=UU zl|Z;aerp>rbp)sQm*O$f!lKaHVC|BJDi(aLc4N zY)oiOe9tXC$o-~ws3_^d#vw6dG&bBWs~-_^p*Oz@d`ZfA4y+;J`p6|h@ro`S9E1h0 zB8-<{cH|OLJDhxE;uVBEIUNo=EwmyeJ_-b;I4;C0L)_TwUW`I1B&0FUyrl;f$*ZSe z6%l&UH=nHA8xV-4I2BgJS!06B@cPAXG4tI^uUvP1c{Mx#;U9GlUn@Om*PhT)E^=}gD@>6#}jv)E<&-1l1|A@@%Gf%%YJ?Tl#B1z7HQY8 zv222EN-ELbHDcs_smIqN7TXK-=<7I3{r7Bnckj}XL*eq^yaU+?KMvvwe^bw)JV;SW zAc7!P6t@+N!V1$`)0-xVM1a|pD=I2ZmUfhi$xsIf5lLEbA-9WSMMWFTlq%~4t0+F| z>Gg;>$_WRl8%m0c3e67aa;V*^vI%A2!ZKFIZKX33j&_GAI9@JfZ{j2mL$0Jma3u=c z3&p}*!rE?~W<{D%GU@H`irzquTcfUVNmdDsg>@qlg54$PlrUu(=wB=)*6{$bBsmyp ziOHG3x10c+?WT=1zJ*W7BS~v2Lv+eS%Kci1tfY!ENFQ=s%5PfkdVKPw6WG{A+OM>S zHK%V);Hl@CpOv4ly}4@FJ&&%FW>4>EsOtLntIm1gH*Dvedo61(UUTJ?QI%cmZkzt& zUeqOpT~w^SbDEFr3W0o4ZK_>OsnudE6|2Ts6jkIoh&bHYsxF6`P%G86TBBqfvC3Et zZM&+m!P?kUUFqWfKJxsy;da8nh}IN=J!wdBoqv`ZmTiH8tUwRbD=eYd6|6rI6$y6r%yNc>fc3(CUjv?x6+3I9IXalHAUsfY5c&9ViJULt{TBc5z)iyLcE>*Xvq|{$fri==;dv}G!HZkt~m9?~JYV)X3 z&2`m=a7i){D-M!#llXrVdouSnUz4-{-`B*ZDwC91Ktli{2ILZ)WZzm9JNx#kEY=sL zQ|D(+6UutrKMV8=Cx$!~NE8_3RG?ZXLRavjoOBc79n2Z6J8G8Dvgen(la?A|ih#~; zHJlHbRv^sZ>Tv~O23UG<9;5){2gZ|-wvM;X1j~ZgQ6aT|MRA0?Wb)CvQSD7LsNlU` zSWPAe-~gFD-&wM5tk}S6(P9B$p|j)QHS+t|t><6!^SN`+Z)?epPh>8Ol?I0@t-*=r zHZfg3v3XQmQ@Yy1mn7Q&au>9dSdZHw34!s&*&t2R ztOwVy z4Aij^k#X}@zuy+wh4~Pv*qvYn=m8Xp(i=MI?&(gGi!=@D#WtB6c-;F#<{t!CgAP7| zzo#+5ekXShS3}V$SIcd3a~s7g4VI#s_Q~livo zVBv6RaznhW4U+Rhd>uH1Hng<^Jmf;;dI~C)`rV?#D&fFTP7$a9NzZPpmxN*u!dPC{ zbDTaMc=VFE#=2z=zXw`Dh@Ku0&_+BPM?(Y&J%~F3+d&nG$$m~W0rPZM%i?%`S|_yv1pU|IEDA>@vv| z$hJ}!_F#Z|99@T+3=W`QkNElOL2>hYG6NxVw4cHpys2D>IrH>NdyxaqtE!;QH)zHn zcitpTql7}8LGH_$hVMUNaA4ja%B5%;(Z*DK_PD`;q9#phiBqpBC##YoA2G0eeIJ7$ zxg;DFC&gGe!%GZzH#AVv{(cw*-h?skZSY=r;f3SYbgof^-~XODG^$|%-%+o25H;s7 zb|Gq{y^7a^WuFPMZ=8yBFF9Zd2j#s^4sr=v!am97p{kT31b_wgK*ZYuEMPVglc1R3 zzCGRG6NF7MN}f)DwW7u1cup*jagc}$0PB)4-Z*7wu=LDKVtlrx?fkiOe}2vR%6)-` zY%GvG!&04YY8%x&u^eaUm?vV6Fq68x{{pX!Se{y7bLloL~?C{I4w`I|4MbOF}Q;Ge$>rBz9% z^r&}Jt+|WD72;a)ZXkFEz4=J|LNw8XXabFs<#7YDq5-`*_2y%MLQV7l4+9G_@glZ@ ztz~z!kJuNea?>tOJJmAzbO+iHJEZBb^I87~@;KpK$h3BJLKIghYq8Cvjpcr_18I@T z)LXm++b~pT#az>*Gd}2eMy@BPD zq$TXO7525LKEcaC(Ec8o1ek4Zi*iGh+@E+sHYo?NC!_{1&T0{Vw>sYZo1Z;iQ^x-C z%(iRUZQ9j8dh{P?5jnbY5dHN5H`$Uv1q)G#+eh0)F%ExgLU~CM6L2GoqEl9KI6vI( z0FKY>Xcws53{KRfq%hfmjiRu{?ZeL9w%xoUur@#)M9=n+2C8Me`V6TeI+nR__ik3l zyGk9UfLtON2qQJ4u_D26R((C(hQUX)ujVbk=<3yHoT(kXX7_9Vv&|~6onOB7ZSANw zg>C$|KdxnOuU$>^O?XJT6a9}O*Y1q5ZnVS1xNEcv+YQr8*ur{^rW}sAa(is(zTi

pZ6?)2O^@4B&PK0ayekkvycXrKRd=G8YPFY}z8o>!pEy8E$Z z%YOFb_ip1uJFtemy=G0zgf$o&5G%4rS%gC)?dqgNL3@Fi@U{CyJ!Zi>&&ImXanExv zbITG>`AUi%2%lA(lfiE=;mNBSPF zKrz6b%!dA=OwNkL+JruddOZ_t`e6_1$JZ^U%~bw(t%HL-*2*=Zv;(LQyblrj16)Rg zOdbQUAD?7;AlioO1KOySLD=c3P}yceX!bjj()Xnm7x)eL>l^_PnNxZ`Zzj((>$)Hy>_bH~;VDH#S;kC74)*jDTze-6?)0N01|h zh>_kL7DZ< zBKdY2D{_D21jcF<{zE-8ZX9hCiByspaJe!TPQ|ej8w-CYl^g=~umqA@#=q)C1;FS45_ zWB`f=)fdK@;Q(Dw@pf3{Fw8ReNI(LpY^YGON}D33j4j4-M&x~%APjhg2}!D8S=L4? zXu=^R+Nfi__NFUio5oRi(Ttt zR5_Cp%liAXe-EI7nQj=J$OWZ;aAM)0DvX*AX9*@6jLqWPCmy--r$4>&k$+}B3fvv| zNYt92oAJ&&GoEX{ZSKjFbE%&kD+N@7U#Qt;YDe`-iqG`OnlA?ztE`%XaO#6w1p|~A z1sZs$uA75?5w9QQ@1r0yPR5)6`QNpt`{QrJAK$*3#c#QLP_&H^3xSGwd<`~mArOk^ zsE#o%HYUW%DjF-sAnHR(MigS;5@2IYUP^sX1CDr3iNdX$@&$8g_jtGH&H#>^4}ef0 zaZtF7``h!oW<$JcD+x-DN9_V%Bh;OOFQ{upCEcHwmqPkWgvibQ<@q#C>iwQe0WT@BMh+BrMeL z>+%$E}Ar}2=#%K&e>te$60ploMWvD!b$7CU;NT}Y-;I?Sqf?|0j zmaI;9HlfH;7=gQRx7`8 z2G|?EUivjh(O(2WT?ybwagE!kOc9dWokDhtEDb{^RC{^84Oyyf!Ts-2Z7nT|GN?&H z@_=QV(3eK^r5L--pBSn!rab0TE>KE@sOn?InF})4WS+{rmQeuNNF;_08|V?P<2Oq9q+I+IP80LPahjN)Y2xg!(}3jc;UBY>&dBz<7>Y}wDbGs?Lj_oHENMekr2Y~0JVcP5ZSu;?)Z_oR2(lNL@eRW z@@t^uX}?7iXa_V=(nD9q394wJSH8l2!obBK4LoA)I6hXn6tt@2X_v5dz=)>QC@WN* z{w#Ijwn7Qve=G+jVNQ!i9S%?N$;| z|GGg~-YXbkc?$sB9Joj*)#1E!(f3}nfz8bA5h~OIF;mity9gz&60t;e`{|bbU|{{0 z-2?YjPW5#e?`x%w`761Nu0?6~5?X-ru5xj1dCcb4XI$@g6KM7nrnp#$LqC457X2$^ zaXAgXoZ{8y3f1k+Ruo0!dD6wo;L}*l9U6cihrb7YJUSu)e7uV^E+jANg=~pN0p(#^ zDk_M?)#!rQ%9t373I1>6l2iS-sYFvs;*l**K$#Kv=duZiBoPe@N;JlJawIW#t zP!3m0Owr1xh};J#r=Q?-nnOrPyvORYQ`Rq>8cM?l|m$PgQ#| zMY`?O7{IHjMvwlS(wj6FgRs+A5tb9tS=Oscv636JkOr#QT6@aKLjTdO@=EJMBF%xII@bu;7ziGO{86m+c8i!#S;g z5Ayb!RR_^lCRB^$ib)|kL=AfRXBaYii2SI+!hs(4cTw-7jx(2ki81T=?)%vF;w~Yr z2GAm*(~Dj7BtiVS>@hpc$S(k^5;!uSW{yuC@q&&M-#yUIL+rl3EvV!1132*>8&jPi zv2S{uIBcBOVlZ5sw>eq5O_clFgl#bYtI5Jp7!+QLodF(Zg^fY5|E={+S^gY}@#igp zPzYRY0qQn*H8(ALM-JUZ#Fw3sH9ofd0%+s9dI>q<&t?9j_} zC0>HKX|F;C3`tQgqbF0Ih2A#Wd_bB2`c7@7UK1r!PE&DXrtyMCsqtF-IH8eRL=GHv zlZ>!|Hv01r&_CV=+S2n8&Q(1I)E95vE@1!sv%(OSO*gOs;91on3M>D3voVnT&t80 zT)T{8^hc-xtVyP}wRTbMHMR1X5WlE>z;p#WFyNDulDH8NgZV`wxz> z2GEPg7nm!>23$BnV5^b6t$R)M!Z-dzqh1$>fYcweVu8f$$M7`EiSLgAN*d|sOxJJ2OzXo*7uK^t|m7Y~>LUWI# zHZT+kf_Z67{tTwMS!jZ_?adMpE6ZweLT{|Pwpy*02qnJ_ zAo+qAN0mBatd^;45}U;?X9hylZ_6aQbntwS8e=giLSY-SD{UrJGucBJyu;maH&XUY zw`({4!%(L4#C7aE2f84e;dST@ful=#;hBLo{Xw`q^5y*mHc;MKzkUSD(EJc=UVCo+ zor-P!H`kr!%==DR8u5|!>;H58dcMAsPg~yyq(4Az6>TNfC0&o_9k~~J!0nVxnHN@c z9r1zT@&USdQ2IUA_KY5Qb;M@AvvFmcY1#_ulcD%z8?b%?ow@OO&(JKEnRbmjyQaZg zEZdtJKE^+s0p&x2LhOD9aj?yg2yWOAImvr zDM95&vdzq|P?AiLAzBR4!?87btu3kHk|}3isU2Ey)(t2jGb1(TJQlg84Or1BI{JQB z{m_bO%a~{0tj4KlvFg2F`$h$ZOxKRDTy=)_Wj_iZ?o3qs5KJG*9pK`zs@0Yg%EJ+g z?1rAj1{WS6Ji5uTyxrlp7)>Tb`-Ck98LWnaB$)=+d#EFZaxg6ON`2p}fN_(DMv0YRjB19VU>Jr{o^AFcf3~3>1qOlv(?{A=?UR$gen#8<1Z!c7l(R3n=j8hTT5>&$ z|LC};Ui^mS`~9ybwXt(P99`wvS32VUwvj)Y{nXCUm+yUUS+;fJ7?N#yIsjcgK{TpN zlSJ)RVWL_JW4)F+YavruF2QOOlM>e^kiWMf@p?i^s9hIj6GUoe6va=d6$yIBL1+o# zs!WKiWdJsSZ^h0GRF}UGa@BAjL`{ho*!jv&1^;HTnv&B*?XNwRm0quIEPvnkm$CEZ zO+qR0F^Ju`4bLvp-^(Gb>AC^KgYKnGro6a;dp&@(yvaf#UCV73GhV=8k$L8K-drL3 zoX>^f4e&%INU|i6YRCTj`*5P*BppH^eh$jZ~&OQWQ zzr#LM{h==nkTn|OOoS>B|2sA^vnKX`V&qgq@eE~s#R6ZRzvk? zyQ(j!ey&=23J=5{Srq^kaZ!e4z@XX3Gno|9dh;x@cnR%fIZslK&?m;}XdCcg@Z>|{ zMTiGMeyMJpO~oJRJa&YFvTmA6D_*dt0_-_#QYh%d1V0x6jw}EbZnzU^s|$vwQW&&$ zJO|0>9%z55Xfpgn81l5>L0rjhr$+hnX*Y4wO)h|k27VbYHOdVpk|?m3WNK6P8fU>? zG6E+O6E>(Wr=Q`+D%s~-#}(r^Aow4*s%C{EGnDD2Fmks`EZaN2kaeM9tJGx zN^Cz1^9rFKGO_@wXFZBilmmEHPyIra2Z`UM{!lK1{i^86l(PQJC!~BIe!cJYJb0E8 zp!)XFhPog$v2VAF4#U8Hnrg%39qROqyeM88kt-holS!nOXU*7Diq%a9~B ztMf5rNg4K&PksIRuP@ey&i~Orc)rvxTB=a>=C}G>z@PAh zyoYsJm}mjI3bwhdM&ccEGz4F_s{>;fw}hjmBay8EePo4ZVyGbj#5AHp1qdmGLMGqf z955PwnbncYn7T}&30stb;S<1&kH57K=PReVg@|NI$^+wtnPR7p6hYd-9#rYYg%^I9 z6E0tl(VjhVFRQukAE&|#O>dqv{*uM-^8w#He8~Iqwyy+orEXe3z(>W>{hov}9;!D) z+C(@33Gdx3Vtm%^q7W_e1oFCsY#qwKf;b5X)6}{$-x!}rKzFfB7$fMf((-s&^yI`) zI>a2gv}rsI6*y#3vOQuB9fur&v$G)Rat)Fr>+!uo<5#A!bziL)5|AX-#HfCRl7#9Q z_5tgvDiu%be>M?34dP#C86oG#Z!*Sr07q8b2C?Vy`0bz|w0F?qS zAz6{5bB07aE(E&4XsTqX%5jwx4OpD{0IReoozE7dL`75t*u(dsfP`^lk(3+{9N@Xz z+fXmKb?dM}N4TIi0P2CFd`X&doLGgPavF(Ky$r+=P%r<{ki!=4s&vV_;W8LpO~ z-i;V?m`k%=p+%wFLQ*EAzmW6qL(eeyf3b3p_k@DH@Qv;SOT!faKADReBdQpIck*1- zzt3~fBOdg8=n>l-Qyt>lj!zt@e2X)N!*+K^k8zJtTyA0&jIFb5u!t6Gz#lXae8L40 zgu)I2OxsucP=A$njs)eUb1PuDFD3z)uX!79^6>3GAe*xKO@q%@GW4Q_(SJdYi@k`Kl(OKppjrgf-FOHW zWrH*ii-Ok##UL9Q2ypfx^2a~Y*?K#j1MOVFRJ2p67UTE`Iy5a4Yz=k=>H61#?+1-R zk(CGgd62UJ+Q{b!q7B67$#xc2e)TDM2tKCbR4k>Yq?Ck&c~}hyo$Sc{uBRgA#8MIm za#s`Coc(!*VOX83)IwJXr$2J|Q-@)t;Rb`0!8z-q$!t~}RIo%f2V&*5rK6 zq|04K?(;=?nrst1F{kSHBKrVjPsKRliIF^?zN|gS9{8np89U%fjr~dInAXl8t!uBl zHI{73ltw2FAGufC_Ur3*J$h+lYijnn|8~WSTfTa{W_0%zV}~{l8&B)U$1DG(f6goq zF6`#9R-zz&bH>UWByh4rZo4=_2cVf=QS8*UvbhuRD~mA zV4f7x1v+glWglUlB6n1%HDjrPy)hdssmW%^YE zYcjw8UZ|h-2Vhe&&?Z!{3^#)YDRq@*N~KaFW`_^Ne7vVrZ-ul1-98@+;_It4545$6 zx79>@uTpBvL0$@>!c~!}_;ZEKnZx1X?NyZU!RT6s8st81U{!eTrGc<2kWs)eDNi8J zwVFBAg$M0ynQe_tJZNRh%xlbIMR{BK^78A;<#cL%N({zXWnpI_PXA)lY!}%?X}RTk z%R!5jwy=HXgXRy-k_}PMczKyPMifa|idD`DPVwPTPe=@vCPpPhG32yajEVAiiP;T6 zD^yNZdO}*1kc*VY)ClUhGWQq&!d@<6Z#r2;qAejBbAL#%I}-;If5SF8A$ZG5#vt~d zD|3!xY$EOL*qkID3TlFo#LJAmArurD!TzscJTCcSSrj%i4dpqVF`0a4pc^G zS74jQ0o(K){332MP(C*h#DBl5gxqmPq!}9U8r5QvX;zV-8X}5i;e z-7vFnq~bgkV!geNG&z!XyNwPV? zUw+<@5x(Zt8*i94c^IeJ{IxNl8yxAmDd9U3?aBAJvFC%o)$F;@STMe#bw*fi2lZ9f$_Tav@_8=0O zg16xJJ*iY4=E3*n=-`qyFPQb49DX4c;BbKIP#Z~4vTW12?)cIJ?>#$nZ! z58beR*YM#pm#(QE(UK0;U_SX6B$CqybUiCxE4~2?3+y`8?9V#m04fV*@%{}O)(}P> z27d=?z#uPd3jpI_5WVC!@{+0O3rfD+fegGK!QlM=zJ7qVR$jtZ!9$vcM}OgFXX6g$ z-C9;gYwg`q6~ngDyTxY)4#2ymKq-EPd9jsEA`7)vF-wibaZ2$8q7$WOon$Iowi%sd zj-#4!HwxiWMdMcxxNYHO_gmiU!wX()8_plveD&8EBcEqO3B85B!v4$MpLIGEY12e8 z{q<_8>^)nxZFf~+ERl*uTjsOOsJ}daOhcVS=sGE^lbE+nbg|M%L7gttpD61Ej=ctqpUqlVekjh%U7V8&wOO=Zr;7 zrQsTq1!U~hWTS9WbVPAxmupt~a`NJEPm79z#~o?AORcW!aCyBhcOp<;z0SJ9y4(6^ ztBix^;ODluI;=)fX7vP{Q~k&vjSY!J+=239cLrivwTC<06x8I5wEsYQ|H0jdcH{ki z*gm{Y`JwcI{pkyq;4R`C_`=>p`^YLf2#bI~aFkKUsF*t{y7Ku8&>1U+xPj|`o*$dg znGF>t@@7&){m#0&8K{^%V^rTmZ?F+#Q^Ut*?a{f}ic7{^-kl0Bzvw)6x7FeI*sKi! z!{c>zb$xG)7~6b78O>v1upWNEi>oI6ZqoFaKN9qzQbD*l5%hX%U>RKo<#&fch8_*<@j?!ZKJ_X1GsJ5xhOoHFyxaUbyz4d;&kke`>~|g7w-~VC1N#eH z?{*i^_(3S?v=@n{2?G%bl@r$~0>w?p*1Ka?wlr8_NJVQD(>R7iOFK*XmNY& zg2RP^l5S5ZUfXelhdDjPp65J>-UG)0$-X3g=n$t%PM)AaNPX0g+~Yd1$KA4cG37tQ z1D2-pOL^nGf*+HEikjRyhcgM8e3btANYi;|H)N-@U8t8WuRUkjq^jhw8IAI)x;pue zSf+0B3|_rF9Vs8*5-TiI>yU?$>jiCfD$DbJwKCOhHc^%jVG!y&n8B)0F2$kO!6oR} z>xW*?b4W1HC1KEUUES=uI%RC#a=gNPGVMk1|4`*Wg-S#g&G$fnnWC|dAkAnvS>54` z)zo!dZ+pbH-L}v6p-nkx{SW{xa?+NhJIK&f!wzpp$`dKI7)%w#vMIFAvB9z1@nz5@&XSUa}Z3zc-@(IFjGT zAQE|*@MGZ`;bvjGIxktzoYsIW&v!4l>Zj1|XTH70ibcwemG;)T}Kx#t)RS1vo_ zO0{NDqoL+3;nvv&w_t~kp97c!7d^PaY5WB}bn~|)I{2Tv^M40{p8gR&pzAPsIB5?S zNPoeDl2`&W2Y*U4tP^go=)RR;wj>sW#KHHBuvXcr3OHGkq|U(~kZ`3|5+(FN0@uYz zSe4L&F!-B^60kw}ptelEUody8bY}DaVeU)7+bXZL?{}{xOY)+9v1~22EK9a*%eHJu zcH;PEm9mqii3v#vArOZ&q#=MEC=Oo6hskWvN$rNlsI2I4J*Ez?3sm(0*(6h!lxqPRM7iS*J`$m zo=R`fQ?@Mo934eRzkaIs*q{D5W~1+*?-GCd$(yg=Ut&rwbne{gT$nVK-2eKUpM3J> zYm;Al?M-o`@&yg?En95LIW(O5;cpJVaI3kd#(e7whkujp%)UX7StPqb`SOO6EjK79 z7y};_fscNyzqY`Jo(opQaNLON`h*Ih3IVs6FhxkS!}7N`HnN^}HuWpO1T`)OG$=7+ zhNaF`TJH@911@`Yu-;`4xk`ie9#^S=JgwleJ6)wkf~`pJvb&=7-cn0#05@fVrqp89 zCxC z^woPsU9dhFK*FL;b_qpxq24PLRTy;vZ+QUk1%d&9it%1ik=|aU4;Fa?-g*Gz+sKKu z>ooy=y;lRn0-ji#+@V29zu-l3)Ka83+bw#H!Kf?J7eIDsw0e!GlLXupX>_MysETv# z7R-)-$j)@SJ^svW(xMf3(76uQcH81Mu`ND(w#8*fixXYZg{TfGwP3`R5IYR^kF9}? z(1r(ODWH8AV06$+Yv?WW>xZwvdqBwIpIP{)-P$O>MR_g1cSrS;ADT?N^%%5AuhK^l zEu%a7=RQui<4<$HMerE|vs4&Zg(Y{7r^@Z92d5Pa(z6o+Y0jc z#WHb2tads|xmL=H;{u1oKU$?S~>~FPmvTw1<>|0~|kN)h`oTEpjgFibeeI#Xn5?KK`xr%2=9z=WkiXUk}pv z&&O9jtNdka*{#{D#$Kf_X6~ceOOLL);Rbx?&Q(*EEu*hRVa^cr(|ql{$kY@K7$lU1 zQSSp-X?fQ+zs~Qkqd)C@z)q5bXlnrPDn7u9aq9tgHHMN?(vC5&l1I;MHbq*WabYlG7RG%SAq zZrC4Nv=3qTen~bN%@wtok`h59Yi~f$9a3i=gEdnu+fte0V!gT0s%Lj<_i7Jm-_~k) zt_y|+8mpt_%o_7?lskfDz?re5o;N-87#0L(vv`q?YQazz7`<5X5=i7pNSO}Cf!id4ikW);!O%4Lb zxxc8pO_;8G8nUNFE)wJgD>7)rm&}m8cStrzVwr+s(PY%hk#t6j96;>Qu_*QnjEU$= zyxk0_hm#ub?K0i$FjO0hT{erc+JMH{dx}a*+{GXV`Hs!7D-yZ_-uL!;*<7f%`O$rt zY0=l~J%DM+gs5#&Oyi_Klo4GPEg-e-j9}P{UIY#qG<0T!Vl(mvHDpoYx~vkk^U0Ll;J;JaD;<*F1`?6h2WJmX zg>B<`Gm0}uB!PQ8N24#T;mn}=H9UGi^R>?mABgwYWS8CTF*i}b8avL*wU&}>&~evM{H##AtOhPjH+AShFGgY{1RUi~5c+jQQS#~w4(>aV?4ul-)*l1SA{ zFI7dP@|tga!_|NwvkvGxLGxYku^t|l8>>-`DC32ctv)0h46s~f+}LRm=$V6_DF_2s zAoFVE?TARhBDt!xJhLf+_8}OcU~y&~)$Ee$UDe{uYQ*P$Q7uaER5Qv6?3GP8&@1D! z|L$S<-$Ra(&EU_>ceCHSnZwO?xsi@#Zu-(~c%A>?d?PER|35T}bB#NUw-_JCLv6Ko zh4$-OX;{muBSE*<1GtlsMT1@kkjc7h49sLOTkWMjcnEl4VXn2t*i@1qp=2_9e`bUY#W4~a%+iW&P{w9;s|H_7vI+0%!T5yqZ4m6 zW2(%yD_}?S<}I{WFdzVFIp7bFa6o@Da%d`(*!u3h+0v}%U-wFz_IBT!jo-_@%388N%O1U+Z4Py1|JL>E z#~%Cs{2`_l7XV+M8at958yl1svwzPzPmJ{q42Zoao;>wysrpH_GkYUz&HnVZQy)q8 z+b$Y&i=!94`Q~GfEg5SRUnLoMx(iXn{?m^jyK@3EaGBs4VZv9~4U9Y$aAOhlr78rK zoM@NkG#bpHg%vhz`+nFAbXa;phL^9q;qhQTjh4xHg~@ovotJ1d`GG9*HrO z6_Bi^ZAQ~M49?u`NfJnzJBqh}AEUqa7wJ#p~-QvMuhcIq*M z=NlnAay@5$gZ=n`oGA^Uc^MFgdo=y%1p8lgps{+rPN^!5ZREC!r=^I}f<{7Agu?em zsUQpmZ>=a(8_`5|N7QBr6f!}Z00O%5hB`_&8Yohdqo3_ZgZy!n!2w4b`EY(u8Xt41 z{tlmRM`<)k|Bd*rS=poCyMN}aHl;gF;!mqOZ{2*!%A(ForYu^lS#){!wJn=B9e;Sd zL(SsHEOQoZy4kwRxhUC&L%Fd(@9%1otvh$Jd)QR*J7XKOFJ-r|`el`G z{a%cYz4rUJDwokZ{uqIVgWAhb5Bq@JkVJeT#T^#9Fko&SEAHvFqV6n4iis`kr*vZ2!3LA*@pMDJ-Xc( z$PNQP*INi77C8N{!}oU~azwL__&Dne*8oqt`w-z*1YA9?ALtH%MafPwv&jRHc*C2d zbTIq#y*}JpSFYUr%Hk&^@vk?%_bp5`Z(x-xVlQmkbHsYkdExxO zOF3^P9!G?Udar<|H*+2bnu+?8;Q5#N^VN8c-X3_qg+HG(!@(R@Y9a?8D(OhIDfJSV>d;8HNr2zlPW2A- zTfAnXVlMVb9-rUOiqJF0S)?hTcPgx>3t|;Ww~tTQBCF)} zHAlg0N2$R)5_;p4w%joarBE{ubAf)Uekyvx03AU?w|Ja{A{$&{(8$D2j8G=@6ehRQ z_^st_Q~PgG=5Jke{l2@8y&kHlDphPS+%XcoxVGKTES<={2bC1s75a_6rK)PfdsS~P?IFcz>)$I zC1gFZ(oW3Al1jZkpT-~r&|UZvJX+OGXq=(j^WfAy$v1a-B@Ux{_H(VB?WF&e26E7s)cxAU@Z=Jy~d{4r)u zy(yHT7atHI9 zpDdVVhP`oS--E00*`HsH4w`aLw{iqM+s@1RFQZY~vmhaZdI;e8M2+QvVl)%YVJ z<%j6w{C99|d7r&fJ;&|5Hs6in67?h{M6vlN=>)m{#yLKePZ#YvN&BA<(K)hGp>!|J zN)yKCrk{t@<)zYb(0v=H`}f4y*uMzIVOCe_aSv`s}RhbR=^W1t`>0`>Ny*;ODF1~L91Mi@m`=w zmZCZm#i$6t6R7h->sFK@>gWy<%E$om0I2-BN(n8RW*7r7m$H3db= zyd@9S-=Jpm7-crl5frutAr8?2hr&N(7D9#)-jLeK7Q`JvghF|xW|HG}lu1n5UH8ZD z{WqG%bnw!K>>F&phRC?~%yQh&* zXy96gSRre~&AP@r8Z|Wcj>sHU?>TQylJUfoye_R2#kr!XmLP2?`oulsR3^s4@AJ>( z)v`UTeuiqLO);vBjR6|Le}#DQte@G-KT{4V#Z35>t+i6E$fniS@aZJ20&UgY9-UMd zbS3J(Xm4Ym32}2ATl)Ze9|MpGYln~UkI^||e@^<`RruUe!NTi^@PSmT@&SHs96zp0 zgRh_Dybt}R9TXf`)y0^(07MwW|3p1}J$*MnzQ8?x{8jw;D%ngFZ=~yQY;2SfrG;6u z-%yfJ2(FNVf1dE<+P^BFN4HaaKD!j(%VoV(i`QW#VlB1{<>GzVUqvW42ZjMR80>f8 z^t*!?qDKSlu*dlMs5&C=b6*CH9FSiox8F@*LhyO1mUrqoY%x7mk>i%eW1ye5hdN{X2JL2h32BD4JBejQ?+yoA%-K@+~Q8w{sXJlX#ll$xlPMVdG{Ufv7{QUEiCuT?$ z7qi>4S6-~>1(HG6=G89m1tv0A4{e=qMX@!Y>-=Uhkm2y`2#Ce&p%EWYrmPXa!=$2r z3hs)3CzrKKP5%|_XZX$*xlAds_LmR_Pg3vBnA?WPKao54eS8hilr?*~tO?V;#U785 zpg~ua82wMf>|zZ$bCr)F!*ycK*20kaSkr-es&C51ZuGh8abg)z2U#W<1TFKAIKin_ zyRqbX=0qT}0JnA)8#ZZ*i*-{l;p!tk#KrVHi(uIq-W5*2kMe%q6gcM}=LWpg$)>VM zSznphQ^wL|BV`;*j5#;}5Yr8c9>?G;39)!58Ud^GCV1ypL@&|#7efiCA1SQ3L`Ad4 zA${E6zw0OI_9x^8{ax25u4A)aW<}!g&U>$0U)*uttg%0fMO&ssH~pVipN3^cK7tw7 zSB*&28?rN8p2Q>tDdI#7AA_ox-B)B!gr8$RTvY`^Q{G{djK=yVR1NutJm!$80*0G^ zP=hEiAfax${sA;41vcVcewBFe&Jc~U2_R!qDi^IZZZ!6w6{WG-ReONh2Tc*Q>%fcw zmjDcj;9@}ts1T@B4I96Z$W$GmPotm@CR9sL3)|N+(!$B3Qs=};G!Ue~(YCQ;P}^hg z6WX%5vvUl!qbI4&3b7YuBPuX48Hg0hMW~5F#Yv{5p~C`)6LWER;gLGy!Q6LIHo9)} zwgu6e8@n@^?tvQ~818!Xvi?&?L-BYBf4^D3V>|oFl%3NSY%tefm+9`#eEG3&UNgTh zlufLbR%HKyAA|#mj}$t0fX=l-LdeR_Opt{G$$%L4C4FgMk8huE#HR!B9N{>Sx2Kq8 z^o;25_Tg!i=~PVlB9wIjubQ!J9| zOO2+ao)p`cqPj0kaL)1QiId7AV6GU$B= z$pDd$TzKrnNj!l32j`Q_CwePQqB&c;6c90p9c7rOji@Fc8|~0e;{5)ByZ`R_`I|E7 zO`Fn&epHhleT$jKhCtmaP+1)Q>UaMBnj5Zvj8-7io!zkZ61MKfC;#w^e>lQd0LOse z^J)4Y@)S&_=>>S0n0=#95;LXjYy?hOyRE%ejY{UQk%7{j(1k?*N+L4gz|1!QBIjr< zmn3N(j6!J*bxOsq@cX==bfl2|e;_slOuRErj7{`j0|9h`s7-|C)aDIVIn9Z=;Y)v( z=1EslV>yH7U;fpvZk(X`$zT17*(XST&j&NEzWSn(Gl@R-z|~h@oE`e^INdR+?(`|m zA0THMg{f#RTPE8wwJaP)U%gN|)Dzkl8VPB6)W4X-3`TkTNx(FbfboN8lO$kDNx+oa zZ7@SX%F^mr_-z} z%_8aEbYFTjtqhOn;=dU^I&+do5j@Rs^(mx=EdeYmAInMFV3Hid=D-nHp#~OKryeAd zgjQ@hmo)M+4RQhb>VdVY6A(3j=%14P`r-37Z@+Z&XC)KUJ=6cU|D%c~7HCgL0&REy ztK}bl`sMR4x}*FnP#$L&Q(vilN7|4b7gO0)KQdi5rFjbWl@7|}6RfWdQKvqPAcRp^ z7{L-!&Xd5xI`tl4xOWEdx}BERh^6&lz05Q!!Z(NxKpHQUu3ad`BDiqRAb%9oL>)O- zCl^=js~D*eyDC^;g(B@i@)OOFHkb+?kDcgLggT=8)P=sf3ZvveBre0bJTJ%-DdH#n zk7manew0ZM>q%;)H$9~almGKp*OR{%lO#yGGhJN1K#Jo!&pUle+J@__0w+HvqyHt^ zT^ijG1HB&f+E1aeGmJ6H3ZuT(o(R!Z>T#7(<{K#~kuW9J2Mnu!e}$QIu>oC}Q@V^! zYIp%xTZpTU;9keTrx9xk)2Jk?n+!Ms(ZOcygetkHDbn26ERHn)rJ2l)HRkuhYbfNx zRg;B51!l-)ogAkY#o9nG%}LNJBD7%V zzb8AoeZ4-h8{K`y6wR{33~qY@lV&)%YKUAWkShjqVWbQOUseV{uECJmSd;>bjFgra zb%QIW&@R^%6@yuv0*XL|BG@4=p&5^mp&W(*ZA}?LXy?!`g%7Z5xjF1)Kyb59Xg!Ey zsn;uxML9$5;53*%K-g5tg&iZ)Sl2WbnWnPW`=r%Q9ETMLpM{Ku<`c>`rs29sisaE8 zzygR{YOTP{26S>k;J6eAKiVH5=y859Qa4R>dE3*C4f3*JbhC7~``P)|q zew$m5?E8t0win?zZ z*3Yh&q-FJ#V(!5a)6fge6Tv-XCjakE~r>2JZ> z0z=6zlmiie%AfH|;b1a|p3i}^TK9hJLRj}KtWWA`?FDY&hniZOW;aPv6Iw;kiq|FU z(&&Mdo4D$2p%o_wpq*53z5_6#*#Bo({{v+G=gP_P;MYi1!HXJq2y*K!lqG4s6<44G zkKhUn$W74(zTPn*O6whsD7yKhv*_ls>E}=1G+q2~I!jIOoi0YE_fJ1E{nP21^mN+O zl#S1=J>@d<*Ph%2?yvEspU}?}%g+s1($(OP$t-X#HLbXD=U{`+@gA;IS>cQO5P1yo zgK>tyewT!`r%!2@Lk`Cwg)^*eDAJT_B4j#{#aQ}osaFzvFgwFRW>=&vRVIpMs3R^L zju=vyu=W?R_>IC$+?Id^Iv|l9H4xJFp-j9BbJY)=esvhd z%JI5Zh*c+Cc$NfGpq!j%=A>Z)vyu99Gu~(LD!Fx4X=1M880%;8r)W8=IJmYj?qO zc-hNh;I_#Axix&NM-Zr>Zv)gsaYkU$)yd9z-Shh9?U^S%RD7;!594m zj57o-Xy;qn%utl%q${%hcyt>V>@X#AW7|3r*~smBYRm>rEhA}#&fZ>}4$-?(knm(LG9 zWm;CVrL;7k4>ZDB^bsaLpc<5g!uhNhmIkpx2Ea|?21AY;mKX?;XUVYG-OPz)!?oWrb&^Us0P?<=AM z63g90wiEGC68HJ6qa4Dy3ZVtC6%T`{Tm+;=7_UWCR-4R3mJ7Ns=(}Lg1yTfeV$TH= z`T~J3HS7fz8t0x9-1utdcGoz|&;;Fg*K9ksX4{E4Go$(RG4N6wkOcw>j}XE>Jmy1j zvU4yJkNyDh7pw^7S*=LPPnZ-yj1v@L5@+4J?rT>Mbx!82Ygp~UcMvA(Tc54V9#i>A zQ(}JijveMBm5moYuFG!sMx$Q*Z5L}Nw`BM2j%8eYF+d5*Ilc>MXB zmrY%^EOn{Zyyxq`I@2 zigO?hEZ0FUJDh`r|7atjQv!zRgs|FZ@3D($fm=1WU`AuQ8S-nmx-}Y)voyJo#Zfmp zjz*#>w7jW8^Aslr2 zvtiZNWVfuG*P4lkxBPyk^l2_&n|)A;v^=FoZU1)fj?M!cW-Zy+bY5&)_g{0|kv(1$ zudi$%UqIyrXdqz;yIgLM#8NRaGBq_dGgU&*rc4bB*CcDiNL8vTQziYk_+w^{KcI(X zqorM_3RP>PQ|5Dyh^K0%XquX$-L0(kJbI;~7vsvK<^6LHU{Z4fxo@0b+N-P3JRmVQ zz7Sf@K3tP(NF>-oQfZNfRD%ffqiSI3IhcxTGGZ!dGL@;GN8D^FkDCQmRdoi_EK4sN zStfQZW07T}%O;qHPj#N)618iG%0X0FLcT2qbWiXOA82(B=Ai%(3>B6yZ_dR)7$o=^ z9&);plR^wO@R8C1;YP=~*y!JO?OI`pE!;l)l8ffASsCo=ED!Enkrh;K`ax#q@_2Yr z_7RQ!+`M$vRb?~RUO02{MQb;#`1)5v$*-^(;~e$Kimr+p@?(HiN8g`8Zr5}Q8&EBD zHT(C0bd0ShT^4rw6HXf9OTKikwa>c8stp$=3wsKsULDJ9W0{34gJ2YeOl>$!o<3vd zmsWNateCxc`3g;X8+6>@!i5*5FQEtB7qAO9Kg-Ioq8Cv!B}?L>tMK~%bUEr-eM2?& zHi!|5uaYfnqM_Iu%XXJ(&~3&XtvQGoxPd-pN*It_g=R}Pu_i-PTq4VAe}fs(L%-}d zZCz41?aA$8dS1^wv1VS|JaIcT z_5OJqw%~54do5dgem5QsY}ioT!8zBRLJ9wKs(Q3Br(Brv1H!QYB3B4OJdUg^-dNm& zxm%R@A?=C>iak~QEW!@GP@0Imbw#_Qy-_I*tm*+4mK{B-dN1p}rdNve_V)Jmj`nIs zdKJ?e+`5fthqj$SV>KXsPMjD6xDM*C`54|fMuq$op#VEW9s)#*2n8nkK<>HXh+4+T zF2nmgeu+up(U(r(WAq9SBZK$xdG3C}X5)=gkvHKH3`HiMGt5D_Zm7!Sq-a?|xZpGV z?m`r_RTZyf-sJ*D4!f3fK3abarZ+eItmbRerphq5t|c}dg|FeNW(PJ^5N=aHC)81 zWL3JVr)po-NR zjq{9>V2lcc9j4uRvs>RJQFikC;C&|HZ6{ zm{TZMGz%3iJT>HmAE*RpD_BtIP%{z=(;~9-{zPiXJuN+LWSZDbQJmgsebYv#eL78h zJ_U5(`i&;A8O*~t8mg6FM6g^m3B8tF9^6cHYTt6@KfbSgn zOs5t5Lzeax8z1XGOJMf$kFVSNx8D)lz}%O5rqB4+zhyfsykf^WL$WWi8us18+27@a zBlPSF_tDh1=FlSXw0yhTnR7nDSXAzU3Y*PG&v8OXlDy4pt4k`Q~zM!$`C zMDJs$c0-pQ=Ku<_r#%mQ%OsRy@n(@tWs{ROR$v2YQZJ&{u4{j!QU5IROhH(PcG-Aw z`}THGYL91lc*ntf+~ikX##khn3W^k{+kakT-MJ$^<|Q>tSl1GkTGF>f>{*h(^3CS= z*8qbD^S!O@IOLQ01Rv+M&EqyNq_9278cW++nz)R3vTC_?PNY_#XL())96}KQ{1Xt> zQ--$9;uSr+A0$zvzE~XJ1tJ zaK);5>%Xf;tJ#&|)~U8)xQBmK5;8qI?wc09BA{4zGjDx!)>@tnQ}Z&vpX?|yh1-xH z%l0ciBX|h$0-cNNRjQV(86mShQ!jBJ(K&9n!*sHpBU~UCQM@1$NkzmahHk;Wkx-B& zVVbw&@o)q8`DPG{k)zl8MWChaL*ZzWdRMYq**v#vE*qW8dgik9+>yEC0Rqg7=Zv8Q2`0q| z)|^0P2Y2zn6>98v&A7M66Pr;k8K5Q<_`^Bex@c^2ELicdT3d>dZ&Q;#pHt>A(Fz_2$IkU3Z?{Wy=N+HHckf{XA6s z(}zlqCU_)xTx8_sMJZ1I*P-sB-XanNhvYJ>^~x~Ql{w2qU8%EF)ES%xOdUk38BzOp zFiypusMWS3)tn!^my7h2ZZ0f$_%#Hf^~>gYAtr^)%x5L}P^bs&!a3mcRo0PgC=t}? zJ;po8Nh>R`a@hcE4wnrtLN-*wmPTI{IAD2TfV>=ZB9dS|3BJwA?}7z#)?H0|I+v2h z);|e>&liqQdw`#%qF3N2StxA46Yfv|-lAqp@{qxy&=HxVW z-g?yFs!z(*XGn08+G3=FO-SuReIceLD3ZH2C%GFTlZ*98Xbp3>o zMxT$f3u#)2AQl4cPS3dz$w-p*B)`}~Q|^3;4KzL-qSk9}y&{pXgP6HB4y ztv_E(PNc7~9*~C|Z&e8-#6LeHn6WkNVC0O{4ZvNGA3F4GG1C#hnF~6;H%QP0DY(U| zbMg$St6{f}1QmrkKR;d-Q;9yBi+4|OKjI*f#=b_er;()_M;a%2l9QrUs{G2u7+^?) z|0f}~&L*-nlkAr~7}rGLQUP;~T{A9D!tDVKUYY@eHjVTy~8GH7Q5QrEcK+;iR1CL>b~OJ7cVRDq~=N+J6(NXE#dqB3)l zg~W`pm<)spVrQ3~sO;jFrt3vmB4NlK3wXJf$U2Pa=6D-MWFAqi(XJ?qL^JSv`l9{O z(Ws8VMLFqm5<=!g9P*?S4mr;{bH{|-lgZ}cgfU>@w%{aojpl4YHP=V>->KJBw;|8| zJFckmv5&a5HzSwQBfFjn_aMMeK5$rgQg(Hh^#ZXcWlY^BO5|jyt(Mh~_}6DV&=3n5 zLSgQK4pf?*Rsw2SIPAyD+yiJbir`u4KpG%_czi>V41NidyPdKGd7FN%#<*fx%J~ z=%y+#(VJr-3)$XrRkT?u?6E?rMd}2AU0Z9%4m7ZKVuGQ{aaJW*@*T5tEpYO=d}XJRR?e z?~Y4d@$R@7iKpWI@dNQsaM^4b|MlXVTD# z5T?ZD85>IO8Q!tRJhXn^s+Fgn%jKS*WX1ibKF;yu-K~*g`&9PmwC|t) zm}5-wjSlg~k8^xEc3aId(^Iih;!kCdQw-Pz3;*w)5lob!hv>w_FCsm`BLIsSDlt1v zR2O@jjUh(^gmqDKUSeK2s3@>f$T}? zb`_#n@lQ8>?T1o$f=fh!(*-<2ba~>xO_%+k3o(yYDE?nUnn~>P-zAN9c^=m&a^w}r z5x)=>MxGHYV3k6!N?4QB?AAyD;txWURYQ1Jn$2nVMt6@Jt#0gIjb44?Hu+5YVv;Te z24adJi545rDcZPbv60lS;p|kkzs}1uK4*0}WJ~?-`jL9EtG*lQtoqUVJmJFOf8*vs zCk>leL%amN2V<*62tbo-Hh))RccU0-9Gz_aPtG>-=ta)>|E%qQ_N>q(a(3)HSITEx z2~JdWoS7h;Z2P0pgGx)qE_<2VWrUi{x5#7znPeU&xe*QY4MmEWP(=3Fh>mePtRD8$ zaJQk?Ad>EQYZy>dL#@Q^ei&uLu4--+R0yl3DhzjgElw;6#=6Q58B$SZK?@@{Vj&Z!Mpj;KSJu}>j~R9QnzE@KV*-* zvKUC+oK4|;b;72o=ipp+UPuM!GP9ytva;_l(w6ZJK6af7#f7~E9U|SO^61|`BNReT z8bQ{K*e!|$FyYGv-R@#dkmRKeY*~X4Zn3$-gs#|BsbN0-4w+|ew}vw#@an{jg9QeM z#Dg|z4bwc&s(~D=fCQ~n)8S}R_z735$YjCpfYj)vRucb?rToC+TJ}$ zt^t`|<2v>PR4jV06V`!{G#zY0$x^bBV}Lnlv5k%0W5)XX{P4kIO~b; zBYS_8^BdK#ATEtRq|l%^h*E?MK!yy@DMiN3`w0gMprd?50J&A;?o*zfpXW-w{o$rG z1(x-DpPF!_9_FDcBpz}}sGAhJ?Z0~+_ohy{@|<_XM38%>8Z?rH&;CEfL=gNf&ku?y zP%sQ;ITN(Q1>vwz_gQcK3xq&GL!nc_=%}bJB>+M>93t5{FBI^i=MyysuK?jg^W}0?N_R7}~%?s7`89AUYf@<2~R#;(f!b34?>s*~Gs;VCFGD zG`bTI43YgNmT`1D#2QDNL+sY}YDEEsaAJ+NO)K{J7$*8~yE#1F07fkWqt@e|koEvi z4-`8R7(#SP2}W71K9QTxg1XNqLL`(NZi44lCEFTDnpjs;cT;bZ6lv;f8f}u49S>|e z%%Eo4>j;*Bk14tbFP6Kj#Ly@PrFZ}(gJBy{^t{ywaMR=WE%xIU!ozh-~nF}#Q&@&_;A%e%LrOq6KLNV z9Ij$3t2QESEm7tg7^2ZCQr)C@IDlVaKvj@}?+B`|R7P+ZRX&I1=j5bqs+=6>ETu%G zrR4{TY-CrRg`1Q*vpJee31`WYa*}7(DGY&A++8Jwtx2mG_9y+~+)@hB@j||dD!vF1 z_!)O8b1~ z8dsfhs!^2sFxE>eu{uqS-WLc-k+LSpSEb;OfRlLze?y$vAy}&Rw+De;nS_#5w7def zol-M}bxrA>(mO>;O&Oi?=@hAF3iqW|ZGV^tt9U6O!ItQcYQQN6v*vL0gauFeYY+`2 z7hqITWROCrJgv&8llAA+2f7kT7s2YO$T+OaXJm0(dgWoKOUXM^3r9Phepo387cQRVhDSP|~AmUeq?4{xmJ6(;L%0>D}p(w3hEB^WinG zLrjy&OG``P$FcV*L=q*G4w)%RER9|odlwC1$8r_{WzLpQ!0i1OTLll^= zZ2pSoKmJVEsdV>`mQQW}(s`XzOZTm7n47s{+!OH-FEZCev? zimS(dJLATtCuXo)a{;RCZ}K3lq!(Zxeu}+J^%Qk-QMz$uBU!e)8?{_f2Xl&=lTQda zS}{46bAqqJS1tv`Qbm8e6#ZS-Lb-}R7>G%pfV|MVQ8QY+fZw6r@c+$koI;V z>2a3Pc56k_*<_aY07g%EXVThK83C<5MDR9|1_#P+6O?zx*Nw(S);efm`u);yOe|G` z&*R0r?{HIHAQe6xnUE^kB=4I(GF|MN-aTC$?@RQvc2%@brB%*JBnYo_UkD^dQvl5+Riq%_q2;>W?N1`HMgR*&MJ(Exmm_gBJrk-K)I)p4VBiymvitw#Nq?bW@4`5?F@;4iKM0XMp zNK?Hp(okFLBe>>Z8g?t-ygrnr@Jkwp#{$AWq>?*v*ioaYwi zZ#m650%kMTuAMP`?UKOi#5em@k$NhtF7SU9g``ieo$kj-gj;9Lf@tLuIeQ>)y&+?v zRDXp1NButDl8bsmyF>Sdq;3xrj9BRr?6V9SwDOK0RxEKnmJT{glky+%i+)~G8#FtV z07i+5f*>(Tp)~5?LAX~V6}P4JBfNXA68zC4;X6VbQLhiU6&X1m6;fp+Ef_j{Knes> z0TI=xmCMI3EWx83_{+X;>>d*eIc6LCm1@mE$?aIrb|{AFYpYj_ z;+0?LGViC~`^C7c18f&^FXw^QbwWaz0YX~BQc@C8vYiG%Fwh&|77Thx+Y<&eD!9}d zoFqv$3S$CcKVUW+0Fg%-z90r_HB_gII!pilh}lDHU=VD|8X%GC#NH5+LK-$xeV~~l zNV2h33~6g=Uubj9X0+3bpo?bl%6p2O$XGKs4A0^TC~`!Yi2`4zZ0-*AhQy8N8XyWd zVHP^TLUP&6$gI&>pU#rfvwCLjnPVp$xW3;ts2zeq|pqQ)3q)ysX=hbXUU;!Uo z-={hgo0)mDNo41X~R#9Vr9_*x7WOp$+T-A<*Lo~>avP9a=y2V}* zJ`=17WUtH0D$vf*hv7q|`a*Z1*k5>{@Y6!HA59jf3niftZCX%mV=gsuufiJAv}#0A z6DdiRh!h4a)t_NksO=F@mR*NjyAO+K$6{9Dz6ATm7~UA^iHK=F)*e6#br~>;laGg9pfS&e+YORGhpHHUlKfy+)#il|aFa7F!P-}(5)J4g>jx4&A^ zKeknsQDpzE7H|C4H7jX%$jx`{7!RF7-)PW7RwFIYcmaU$@(B^I%a$O}XbCOdpr8OP z@G;i?odFOHab`|DtJMu37TZTJxh1h*Iv{;2Nofh8YP>pRF*G*TCFp%?tRUXvqAdUnj}kLF zDWFzq>R+ganZnXA#nI_QvBxpd62TOh-P@XpfU!7#%xMW_PZ1WT(@f;HISKO__4D7A z7L;ZG@UlwWokP}aYfi!UoZ}6R_uwl#x=3VAZ~nWlXaB;B7^^}p*=^4p+0n%pB97NT z9hXhwsjTK8+K(ssI$S)Yl}l_2y)kIfYAqqk0t--Ja2dpXh7nYzmXK7ESRDSaeMI%3 zi%4AqH82FHP|#VPVZb58h_k3C3TA$yB9GID_PFJ92~w8*_!aenZy2(SU$8ED;N`11 zBXu<0e{%uLNZj6>EZ+KCL7^r5TT0TvuA z?n5UsEUg-~fbxe1!B!xc7J`&Y5KR0-|66xovhM6*v$k#?PdZ;?hpgrW_WFF^w1u4_D{X=zbz)F$8=mF>S*3b(P4~fV%nC3Ezds5yVz4ziY(leCfGdbfA#mkzXe!<3!V`)6t(WN*W7oAermb9URxamu#OH5apG!kI>UfDnfQ;%NKBWL6t)S8MV z={Zo#rJiqb+ChzTdmNe++8)sfYk|+O$pJKeNrCSLuJsF{_{(rvY2>9{M+ij5X7)~gTg%ZFOLIuP6RXj*i0Lq2(YzB=-3Znxz)t|X0u6usFW>Gx3XmRW2 zIR51*U`x(fl>Acl%vOkxpMC{xf? z&|M%EnE18p(Lso=y;!|=Gp}Z^wX|Er+TwPURA73cT%Ojh)Na)FU57ht zHP@%t1{eJcUw1M4J9NLi>-1{Oh_MOVpP}Njfii!h=vn50kzi&X*&WgM>G$aS^#}Av z^g7U;})QO95!4ay5?kJ$M-l1Rlift`!{ zW7ykKDcG9xI8Z^Qtl8GJ6-`YQ(fHb$nwsp=OPeYx8(SiNJmIx`Viw(K`8nIbso&yx zOFCyeoimzk;+)H^5o4cmkFno)z<9){Q#;3b!)UdImOCiMlgd5H=@%pm(gjkO->odz zSkP0jyP%)|t@f#GbStF?-j^ten$?vgo>)WVRsvxcLy4a%1Rt}8w<*{p}P%*B{o-irA|vb z9F>y0E$kZfJrwj9LqWwma&eEeTN0_Gk%WCNmhUR-d)GVUseum&t6yb=%d=zk3MF6 z_P$pl}R_=G=gEyfNz>?)W(8A z>lNd^00Nt*#>@mO&`hOk)ev|HMyG(GWL4^eAn?D0GIcfrx1?nTtI_6^TltAV3WB6&{PL$m)K*s^-{g zC4nXFI29YWmdI|!HEH7NHBtWhc{IqP3*%Q;W#ZXs53UZNsDZ#|uGXtut%fXHe8@~L zvnKCyi_z;YjmDTGXpI@Hp?AG_w-m&Pff%)2!R}yhQ0faZgkgedq_9WgQa1n;VhR|F zPvg@0aaI%mP{mMeLlbmP15|-3_q^~E0V$r{20=cLBIh8Lbgdd3R7eGKjlK3oh{yD2 zBPc{8V!cfT>o^wRmqQ+^9!6w!RJI^C#A%uit_*GrN@j>cAJ7k|>9r>+IZnVywnece z;dHt&D*_hZP|}vRi8gpcC4f*UT!wX+;4*=*!=R*KBrq|t(Sg%%@;H%^OjzL1(B}?u z4??(!nrB%QA?N@qBpqgg2lvJ$0;+(_M0X|Gg?{^=tXXqd0S2qE0U$2o2+-$X1Cyyd z32N;k{|eR(cd+sqQp~7S-h9Q1HP+#qXaCsI5nP(NOsRsceBde0ryzcgPc^%4yP^D^ zA559DbT!IZAAk67`f;w6PX8D*7C_?wA`mIz*fWBUtR(d8B6WlL(830nEPNVnPYG zOQ^-$j(*PpkLc-Y?{4pHmm=+{_P%zW)+Xx}kyWDe8DvJxm79quXwKi-WVI_UE0I_2 zx|knG&3D1ZDLt~RQEwp^Y2l`)zJ1TWY?34aQTUVG163qwcOIXvp}4|Tm#jbdGAlYnM;aglPT6vmvd$c3 ziP!Du#o`18*FJ3IssJpjM9Mf}OFu){Agm1x=Q5>(J;9Nn6bX)^3l;Q(!l?=csf+@& z>s%AZoEZ+2L{KwNID&3c+!}ATO_Gx0PgSPedd1M~+qbS+a?iL7$g!dJ4=-b!-Y9c_ zdUBi?@X^o@U-8k-JHtmCgpXGKKXK9!x!_J3CET&xpK;QVHQ%YaX^7F_nH4@F#b}Pp zkv)KB1X&z6*xsaQlg^D!iSKywr1bh+YV0igTe=D_M4N_&XFK=34P^lq^ly{n4mo=hB#3wL*Nja)3DX#h@xl z;?3cFyu#Lp8y>EivB*`ie9rmvTUzGNZ<+mgV`bfWbFROv`N7D1^!Tf;E-$OD*6rBi zpPOo_S~Qi8X_>!iYW)S>YkK{2vOBBGlw)8|vePcmwOgl$6IVM7^agb%KL`>qNNjH? zfyXw87M>8pBs$nOokz(~#dwxIOP0Vdruj@`PpB~+!ht+2yYzOqo%#)G!j7b4pJT-F zf#WX@9rwiyv`7J1#Q@Be4eQB1rb^K=Ov%P%zv4uR&i1l&0G_&`(1$~9`a&#}Wms7t z#O5t>QDGR43wbOWEfuiRSt7(~A661FJj{r}M?A#>my76+@s-WAE@XhLVcRU!UMbw# zoE(?cc7W+7byzZf^2#5(mS>D?xY9c^X$D?+obL)_+CEYmLUu^ zDNi85!8Zq?ZijifnFgVivVn-efTa5vaBzDaVKRcuzfI}>l7yQK4;c5g)>dlP@%;|bzA*Mp`%(v^Xx zE@3$$jCzJzE}a|afotN8T&<+51n8SK;tVIClbO z;`9~s2{E6E)14Fu{KFZ+KV8|RpdW9Nhc)lkJcjdIih947ove9OSSWbR2&tFJ!RAKs<%lQa>GE`YdOcc?TBJ@eeNQ}bP(R7)BTEF}1PK`;G_ zbQNE>pm0zQ0t+fo<8x8$btA3r?nav2%8sCyUJ-i*OXt>s1N|xo3O-1G0kL&IG7;~f zZKNrob2-?E;}r*z>+FE(h)EPH$_xmYIfmv*mr0`ZENg%xh2Y@uY{Ml6Q372;vZE>z zN`*2=;`N30gmeJK{RNFD6@)l=fb!lD%=CO4sT6{a;yFEqK|%i^aL_C`>;RSstt~>n zn_|o38?khdiP`MnP&UiNp`yZ_MPY>+h z|G;+#2E;!ffAGQM^fz|h{g+>UKmAdxM-*0{{y?)1=NA^@m=9nf@T0iV+G7LqD^Vv(2hdCa*RB5lVd3AiFz#F7eN3QNYRQ)mqvtwL5h~H z*6voZzjd_r)7CsvP_Q#LMmvCqL*P>J34~-)p5QA?CM1ntoY29_W8QnguET6(-bY#K zXP1v<5WD<=8B3STOE!Jy`deRPw)g(Pd{2D)j%Odg@A1vcH#mLKs1Fgx9~ZA~?_6=s zii@9k;r^$8d*bhR{{g`=ar4rtRY+`6$+I^{v;No ztV~mHFMSczuL1Q-aIb+LerFKh86~4-&?Q$3Foo<;;w>+bl4eavkt06J(D#^QN~^0i z$RC~sZ=%8%USv^W8ot^I)^sDbQ!N*FOrwcnqtjTA(hwfO zYeoH+k{w-L9k*R{&9-gVT=W`NmJU_cZ725b9oQR)i7}(>V;BGrgT?~?s=({=ih`R= z^Iu9VV5ror>qj7oqbHpkQz}KIU%hi@b-0k9U zNny5^F}>XJFtF$y!MBNFH4#RDfp+YCqz-k)W(38;=AjC-pY*_zD z2pIvsQ)t3f1?neL$xKq|3VtT_sm)={2lU0 zej!1tF&J%al-dqpNsKkAw$$8|lrjYXELWEV`wwyxF}fxojcjNJT+iz3jgkL)ozO`7 z?CUh=jCGnFnUk8+J7;u`re_Wl=KL4yr1&s2nFc+cmB7U@G;;zLolCa=>7wPWWjtWZ z-#-84QV#BQc6D@|?^=Kb9eYg`c3)s+@BfLbx@KBe*EC>=li8ya!cRmmgj1Sz&{geVn~2ggaQ{Ewqg^N49X>Gs@5zDTvmEb zsVKn(Y8>3HV&rULvMUMj#SKdjhPxd5xu7+IONAcm99d^?NnNIWSYWoG7U(DX%U>ZVBo}-{?k> zq|}IdNz;CNc@k?e3_;)&3!U(knxVG5aA2Y!y%swWS_WIMN>B5hp|0$MB{FyKfhTTm zjMn6m)ud%)(`e17H6rh%TT>(YA^#l1jdF=K(b#Yh8BUQ@jWZ#>2%$HPTN8GyR|~TZ zCsB)1$_N-RhyzMt`#XpH2)!iG046BgIwI3j(=zC#s3F6F8xe{`jAFzYTo?|jqhSer zlda)P6;%ugm=2_yu;)&4Bck)LqL^S!P`r>NBqj)oh`S_O&8qoe;bE_{#tf`HW-ws_ zYIZMp{p(9-EZT9Menr9cJ7Tt-ohvS!`_(tUee<@t^S0e|&+?5|E*QJb7pA`*F{#oy$8HuKd?0pZf8}jYpn-q?@s~4t?X)3s~No8pvU82a+#9 zx{KyzI8-|j(}>9OD+BXy#55y>Ohx1r5K$Kt{UR~ozhH86_%Ydhjet>Dt#v+;lvzFY z6jU1RE9!%siAgb2CCODIS%R|LS5WOB!<)3f2)we=mQ$+2>JJnYXd!dGa)m>#3?&?L zxi7KN!Ex$uI7S^BM_ewiPQ=q?tc)Q39WW^z18IQ?&tuIy5ISmv(GikOQ!^c-9bykP zXs2Y0vYOljgBNxbVKPK`$mAnf0+#QnDl|#Qaf?vFX~4Rm169q2wrTNZAO4bOSnpw| zK*WI*i=LER9>PcSbFSzv5?4-Le{5FZyh<|Sztp+3`)k|Resgu(oU)wCyOr;{+FDJB zYrNZMF1zGN?dl@3=C56`>3g?y?MOAMTJO|rWDJsAq&+$h>-Q_{QJQo2(GZVh^3GCK zpfHk`8qN%Eu%;X&m2|es>vZd5WAxk55v+k~v#41GNusKCz1j#Rw3I(MFeiXGkMsg7+ zGDA|-zGMKR8hZ|i$z%qj?Zh6MYezLzEu)b>i&FhW83DvA+iF#Wer>MxS1nRsb+9zg1h1N- zk-EM*@#;FZv5t+@@rVU2i6Zu*kb6-T$cl6}0a^dYI94Q0;-8CUm5%rKe-57Y)K4L& z5TPKwq}waqiY(J#C}&e)29)Mr<@Xz zuT$QMhkxLkVhoE4EP+7)a0zb~O-?IxKL8evaM#zyl9H_z5s=BxCSTGYhmYfC%3pCnTdmr!i=D zYjt+54h?q=1Jk(IZtqH5BK|)xIXs7L7Ni4h< zsY9{2#A>)#XDYcDrw99?^Zyd}Cg4?7XTSJfYoB@CXC5-0%p@TsWP+%e4I~iec?twU zW>5x25K+*?FgZXKg0nav2(8tG1W~Z45mW@JG87f97N@pUYg?r67lS z2*T6=N_^-Wr#mv^?)JgjhFvH5^>U^bV=rpe?8o-ODcbis)SI=lTeO#15j&#M8RYO? zhF|>BbQ1C+2fZP^q|TEoD`uYZ%2U(KCUbgOud?D;2uC@Df@Y*c=unWD zF%=|hI@!Lt)}~y4{hwX?L)rxGn<;hg{q^=`G7oBBUOQl<;q_qMvKN?d?QN{jmg)0f zd;k6??qF-$%iG`T@!fgZuH8K~Z_toE+P<}Gx845(&{R-X`)tjaqeq90eR$`N%|n-K z?*hjN*BdfHA3nq?Ql*h<4}ZN^NvH>9%Q%8tP7kLvIB*)Mf*?oO>u9vHZRjmdP6;(S z-6@S0Pz5v(mR@@hE!34i2|p47JE`-9-P^piKr3A{rU6< zL*|0ArL!Ka@Fro*s zK{6^vZd5?ro<^g-1}aV_AtTf$bf<|ZI2H=ZCD~a5++Jmd)Q1|i^V+Z3DCTQ?=+#M6 zj^B6R`;#Z|u=c}-HHOUkb(+>zQ+wg!w8s8zfLy_89hfC-cLh?%>m@+Z&j%Z<6WB$Ix`6xFzg_}Z zATAxV&^-!zk~DTCog=>wf0wesQqg`(U5t+_Tl{+YW=Z)>DWKm174H-2eE&5X$x32 z?hQLh%1{G_29qpqdz{I*u`xk*(+#0xX|s-Fs}R+~flH;utoi`{88ZKCz&o@C&;|b+ zKF2F1sV=2K^4sdIUboHBXaFm>AF5!;xt}89B+3-5SWFof9E@1Z|2BTgu65VW`pu>p zX=uY7^USo_V<+66wCBpa1^f)bO!)c1kO`Q-0L)DC24;|roY|&X7o)<{>^3ZtSA(@20)6c#YL8Z&sy)gIUOo8nLCDY7K0bKc zT0>i#vKCT5tU#8cULM3~E~V+wy#i(k)?w{eFJJ!3^Urew+cfKmS?urHbB#|lYSVT2 zjClgSuLO<>-oJ>~=Q?m{=X(%9A{*6Lz+y4Z_$wq9mI97F6v9KoKJDs$#o z&Dd}@l`RB!sa8idlR}LOrpD$icCxfBbm=i4&ELIcGVhkye`ouF%K8Pn zHr_jRmb`4`o!{-aW#%;tR;;Z5`!lz&*tX$)^R-E#;f?G!Bd){NfQDp}7v=#XZbo*- zqv|YJ7rimO9@a$;>z&EUDHF_=N7y_+tFg_u@g!4Ty$d!)x{&0;o^S^1Lj{P^WH+WH zlr#oit}<`q%p}$?X*B8;6JSnQ3K|V7O>CH{)^xo|Hd%yK(P37^?TX8c3Sm(ojIX1v z!eEG^N;LQBTuelCJ#Lg+BUwsvH4&LnG(@NM9 zm^B1hG8nQj1<{h#>gbz$u;saIQWhJZ#^$83aVcy-3R|1ZCOYO~%)GqL!seRUBr_Xq zW}*79WKFUrnPT-)Pj|hmTYUk#rxI;RRzpUk&)3}@a(8b;NFUmUEM)k)L~<~@=om*b zM@8{eSBhfj+!P^)UZupb#c?@9hhv${C^`SR0FnoP{M1t)H_RG)^_5NCi^h&E>fUta z)njL_X)eBE`t&P`3wzC()2omz-tpOIJMKK@wR`8zm^Zt6)Trv&^JdJ&%i}8-4jngc z=)y$;$BzUS&5a+GqBm5 zIlJ5o_;i|W0*U{6FNKooo?=Q*l$9FtwC~P+s(t&~&b4cI@PPI=?Gu*H>_?Bi^Dfv0 z`yAIPk^@#_k($(T7Yrq7kj#piV@V#5NolmWO{A}hkcEUL!!WLP>9}_!4M`CQ>q`F1 z#-*+253pUWH{JWX_W9=;|Mb~$Rj4@0tQxoL1?_R6tKb&M@NuDge-d!SU&H?lOJi`_ z3EDBc$+FXKUu(1YZ8nR=Y;$`Xq^K=eZ**GBE>M!EpZiIyhS~`AE#IuTuieM5P zQckrWL~HO`CGR!`dVoReg2_siO!OlZhs1mm^d-bljUgY=f=|s}$`Y0g+H~f|Nq6r& zaNw-={po?DA3@ts=2~X^x`jPV#r*(4F>ds2eJy5JXXJd|2-u0r18c_#61HjVHmFF zqodlu{5ZY)(w!50;YM#z+&<9Y3pGR{#>>DUPW+g57M6>!{r)pRMlw_JZG7bCfc>=M zDE?grp6SK*llxGldd0=j#^r`T!HeY6!S_1DPTf=Y_N=hMx+26`e0S-Ub&=;0&@N^K!Ix#UJJ7jLWqZgu@%k zh60EDxf@IA5x9K(;K2v9mkuOk&RT!x{)Eig>+263So74^>Ql7W3E1n;X>X-TVy|sz z&e<Ns&*A*R}fIU;ML7eH>BgR&|IWQLzqb`3WFIR^xOJfs5Y*2_z^fLoU$mXhd zr(hxQtnz*xJ$ZWE6TB=w?{WckD~%B;(FZ3j9cB2l*lI$ITCTCHg;1SjXt3O zXaTkDwa1jRwdaqK%p^6?;ezY_o4%ZYZeYT^B%z-k!+gmyRPc#?#-GyZWlY{zJ*Bm> zq5CzTo^`+0xbzWi?B%c7FXe7i)iL`Vkx6S-++E$91-ib%a>2hz7e6(;iuLA6Q`EA& z(3K&ckzRtsip(K78q1UNqi$Cy-M`Yz=9yW7c`^i~BMD)MJeR}mZ**ieat9WM07Lr; zPdOwI+UY=@&}*!q7(%J&5HiXX-lDRY?5qL?1xC+$6(eg@TvP#@G2UC?cQf6Z?p17f z_2zBUdM6Gq?=?83_w;Qy&#;Gca8z`!MNjuRerLmP`#ik}eFZ&p!uCh^=LN2sl{_x1t_YUltQx^Am_yr-aJ`wAU(>RKt`m1S1xH4-En2BXH za3uK<=rW;YU5ardH@OYyWP_wVc<^9FF@?0E@hBFHDDh|H#95(UisjGW(Z1Bae24vF zr+oE=*T52jUr5({DenCz{Nn$S?!g|fg+H$WD3X&i;3d}{lX%5%dvy$0E1yZF7q zByjbmz?H<#$&JRBL|pPV)oC^}i;2aflP|IXsv;tk1Z_M>NxyW8K&6T$#}K4^kyY*O zh*Q4E`ZrUk@?t;1Y^k z?q^k!iSs6tkt3T?5s*p;=Ug#m1^N<%HE9f@}!%J?gZXO6*i?mvHNAN8k){^^a_i3Bh)D1P) z-E-jikB@!uUe2)6Y@Spc-XSC1eWkt2;z>cW(J15_Uby3VP zUHXOUc`KcraGi7U&kg@D@b?W2wE@518%n4?i48*5yRyZf0L{(lNI?hvnz1&#l(2DF zWI|yAPY7e;NM(!7V)ELM8>nhAvsf%OL@TvprKw^!J69TyHBzYY1Xy~yH!S@&(XiIoox7a+8@}Vo7lrZz_k@yx~`v# zecgohn-EnTriR~gv$w45GZQ;*Vq;D0J#Z%)b7}8p1etOXm7IK?C)!S)z;kHHgTMMLQ~{ZTJ-f_w|i@0Q-D#4&iVo# zyHt)LM}_!}38hVycr=4#C|XB|)W2r54G>-$?c!< z$@uU%ZPUF*;$^J*83)|6%4Rp?D6*(*O^(IFJQ*WIDw{3IiO8>3?Qy53Ci+Q6 zIDnKyh!4(mu?7oP_$$X?WzgP`)K=O(MEtj2b=pnUiz03#^Wvn{)GhcYpl*4fpNdIIlE+ z*@9p0Uar-J+f>tW1IV9Qw%~P>#lKJ2pj~e z;bB3wAncC3;+%So*VQqt9^&elRs;${Up3we+L6A*eZbYPK$;NI$oNdLcN8e?S?I$@ zd|8k8$*08rzt0!odX!2wXMxE3I`AGRWNjtXj2rJX6L26laBKT9`UIiqC?SV<#icmw z0`2_Dd+OHI#6op)vevSBWpvNg-DmNqI_Pdx;zkGm2ELVX(7?F$7r<}Q1jovNs908@q@6f;61e;{HXR23@k-@ zbuFT$aQ6_VGPJEVhLyavmfOG%G^2#2Gqb=Sdi3NqyS1kt00KYxwKfYV{9~i`OW-iV zzSOSo*f0J%U^Yt0hWb7GJYL!uuW4 zIyJb{z_!YVWgfE@TDigMryn+<9E=9Pk=9hHdR3z>mT&I^G}sgDT(;Yw04rO#?B}x3 z9x9L7>_!?X(0`B3B*#$zQ>++ATI$AFG<;qtKWOMEEV3>yiP}LwKmlO@9UKPfR_&{$ z+E=%}&TP!_Isor~;ehx)b>XO7+<^m`Xx1t%QWH$3plQ5Gwz3GD#N=~kcFN5D#NoM_ zQ3p1ll`}s_VJ=AzBtNho8@KG@>_HT!*}(a&0MUHmN8tBI*$nV>T93oGM9rIPVUtkzVPR1Vvx3HC zHeP1gGBe3RnYWt1F!M9~YtAh&ZwX$r#cwuStOPH|rdBqaO;q;VzsXGY2LTAQ{tIj! zQM))YvGXu==iJ(^HLT=v10W1s_!A)fvkZDhe<);LJ7gZk-dC&r_a(F5$<@g_ljXOQ zSX%;Xjj~?RfzcgNxi!c-MBy6&_O_4h^Rk^@gysi%`6(BPMM%R_KrfEZt%Q=Y;AdF! zUy^sa#DJ*l;LlFE*74-O3)su;x7M9LQ+L~Kb!Sf3-MV&E&67`09y5CKlTX)-mf!vG zp3V2)^U+85+`svr4|iU-;^ym~6+h!^#ywyP(5rU%>FgKf`cjk#=B z7JD#@wWhJwq(e!3pZhI0f6>NXGO@ReXN>%id`jjmoW)WcPJ;(kPL)y=TU*(JF4v6i z9(wJi<+gTDamE}5l=N2Z2?h(jQR2lyAV7%9E>T4C9-)Cx=oO$HtM7R1iiLk0NQA-u z^GG6pbKInR@0~QRd(R1j^0Ml>->ohyZ_tFE-RpalOqfv8Bd=)6l%hOYeR$4- z1#=!=HED)oQ>KoYRa-TDcvbDJF;nq!X3etML&uLFI(u&QxN+4)zq;Kq9JsS1dNoM( zz8&}=z|XkZn{M_88<~&9_Dv2SW(bkF0TtZr_Z!fXrJKTH@&qX|P9tDs0obVD3~y&$^D@yAS`Vj|juAGM!?TP&m(WGd|!Dnip`vYX;-!GsMn zCg;c{NIp|=Om4ipw)f-T*0H9=S5BC+eAb-O0q<#Vv$RFUl@REr$FwO}S!83)>;Swe1*%`*w>GfQbNn6ZY+W|P6d2(M;Pl~8r4i-34x!U%OPupZA6Q2}#$r_$+R3HF{rvQ1kKRjG4V{X8X--7Y>LpGrO6cHn2km zw%yQT0L`-&ByVJfDc(Y024KfkHaQ(ZB5IG=USJ4B{qMLL1$q?nM*IVD0tldvKsbrY zgsl1F@6g`q6|5^L-@3KDpkA)KZ^Yt~+>a-&;Jw@5ezI!ZxT+_48OcugWrlBo1Bdiy z)iv3;0QvJ+IHB5YgkFJJUkJ1QJ%~laQUfnS9MO=0fq`_vS$>}LA$%q0ebCCz^Ee;N zW|AJqn{4P+%HpN%8u!GL?_IT8{1{0*#eD+3U8CqZ!(%J2CD^1ZGh^Q z4Sv~R!SpPf$qdC0Y20GBAk!N6P@ytNCd2DHPU`NcUORDasLF0w>r)x>?lRClB zLBaasCuXeHA~b<0J1b70FT=Omx3~WJ{H@ww*S&G}k+W^amoDVW<1Xxm1pmDpqi>xb zu43==?S_{TD@c`YR2^S=*f}eE&x&}xFyuhz(PUqzsA^7*#?Wt7rCQ-3*pW+!q3*B> zU1j|+^8>$K0OZ|;dMk8QBV9$jKy@g@4M==YI1jt73$cSR`gFskG;W)w7MEoAKwC5N zLlkTe$fY8FUBtJqn!a^r zSFy-_fs_MfdL|jm3lzur>)M#B4ZiznE!u}$`VZ1qShwY_LF1WE{^rNQ{^?>d>>XO& z+$HlKC7DWl^(^*^+M%yggRP-MA>I;r1A^7g{%B+$8j)?GUE2dj^T55SM8?)lu#-Af zZ6+7{!u36-P&rV%-H$R6SPvNpom+*;=*1|KMw||&aP4{WwFHT=^o~su$z%-p^1y-c zD8)tm*;V6~H4g1pJ^H>IN3L2mYJStN=CgC-W-pok=!5f?5A3BG+34}wAGN=eFMbs} zVR#t((GB%2rP7aT&+VlxrF?5K`#Q?r4zYb9wkyQG_OcJW?1-1`^1kHdlU(diP6|4l zW#<{k=|7c-P6QxPih6e0#T-|9PZ?b^l}*8(d9;V2&*0@_+)rkzWL2yqv74x6KxP7e z+w1O;f|i^f=y$6E-v-$=i7c2HOe{eOMHRgFeo_e@720go^^J=ib)9wbc`oL1z)>UN zjzBeXU!6paB5_bQ9oAl}(BB~O_1dbB1*LZqg+QeKgI!J^g8nH#NMw@wP8a^@3~9fFCK{!6i`47=!)zdqN^pU ze_!OS2;b*@%get&^vA`{$Z=T!s4)dG2RE}`mr4_3_ItR8dUjU!gC9=m+= zu>SSGnm2y*+$MS0gY#}iQ_v~xky%ToKf>&{XuqCtNtQhuU&sHPKl=Y4^9RYWf5#tC zSN}u)U;{3E-@za{f1d__M`2Sxu3ot%`Hf`$P~zK(A0)~xVfJ*GwT9RS0rqTwz3gYt z`q|40+odpARbL=PC$lXwJOdhrCU;>Cv|%Qsc!_Tqo?>^{NGo$Ae24$WBnp89v4ciD zx@e~^k+njm%NxjB=u+*HcMzxHR1wkdh55F6h`+PaBp`wd{B-+Q=Hl{M{d<6#3PNc53V^ukypF@jhM1b~fQ<6}0T&6n&VY=nS~WIV=g@3@pFt`_WEd;SfbaJ#TG z944KF5j42G$boXksYJ-9$JA_la?%(cHW!u87AR3BjkiD{TMSP7#Vjzm*#8my1XrU(srsccE}`$INNUx27j z8i}_iNl95EEU92kS^u&o<$O7W7S>fn8u>g`Cs45-IlYv-L9po3mZn2C(fsdtno7^y zl=7!+bH*)NK6cKXORgDy!`u-w>ug&ZTYL0an;W^hXXTZ}{rID^dgu2jUwFe+J!jAF zm7i5Ob=1PS(+ZRF`lN(|NhLp9pK3MdgmQQ&6h+*tvN_qBlTF(td?sis@|3JO!IYFl zbQ@Q-1}*sSOr$+a$NHQX%%N?rI|!1)(qWUiO6CC(IpvKt*4@2VCGl&75pLzo+Rli6WZmh&T5m%rI6u; zpjL~-6>(g%iqS_X21XN;BDA}%+`HIdx)BK)rZRLYKB1%|PGgSK07>M_^u2au`LNo$ zN3YLK6N-P}==(|WkDdp`&l9v~3(6PWR8@9UI#~b@&5c_C6EIQ|7J$$-(n;xzVK=M+ zvy}dVnPOi}Nc0@QYDfr~^^ot!=V5{%WUfc_C^&v*HU6=4{P2a`^+Y!{c)lI7-Y%_D z-HrBV5L&V_i`6DuXo3SQa+{2@3PhSZ0&y;>GZ1Ivl93oj#?=gGtdeEdzsVrMU4jTi z{tuBi3ca2GsQeTahjodziLjf(kdcnpU63Q!8F}N|8^0Q{Y8CTt)4qeBHgCB0InqV% zvt;d`ahMHJ@N%Lwde2r=uaVu^q*%bRl}#)R-?6gELK?HGIUIF64*(rB3b~);WBrAEHPVAt^5M8xs@}yOsNY#{yt5(%q z|482T*M9&A-+Af=O=j;5PcOnFKRkKC9d}^vr+`&@k3R}n6QoMjy*0$lW^ckFSI~dR z>s4SrLQrDFVm|?%3Bt0f$!x{Y7@+TCKo(c@Fp71ilR6}1DTE=_uErr10DAbNDY*-K zW~65nyG(1QO<%R@nq}XzBP)6hvdp)Zga@)upN<13KONSeQ0O9Z7H`cKn2{V;=3B8>%NvK(s`c@jC>rr>lu?MA@kb+o!Mxl${EHz`4`;q7#86 z_6DMmL?J#AVQ-b(&!Z)llaU+ytuA)>jSNF)m`h>-L>bn*Yx|tc0DZ*!u?08 zsSny2s{Y?HoH20B^D=NN0u%fcry!h(KZ7nHvE!(GBwlMaqsELN5P3;aXVwJ*Y;?RV zFJ5WJPq#j>wY84GkO$%Jdk6}`0qke+%A3Fe+0Qqt$!}x(@I?kRtY>T;%;?iD%4h#z z`fn|1l0~X+N$>rdtY|TqUALkCoe7O&BXrX&PLiE$A0(RWFry))VMdQz*42!DXztC` z+Ftq0c!=r_Gn!~|Icqfh00X0UbHMGSI)du@sHh#~TX9nn8^rvg?5(rt zP4;U)Y6ZId<%eq)$aWp7Ra1p-I{`hh8~T2|nwn%~8&D%@U4euV;bWe0g^>?7))@7p zGPy(`Btj5ZB2s}^TZ_}=OLAb;c|ZIXQOYI*#W$){6gfIQ)p@2X;gwk^b#YmY2A(TQ zu*gK9&X{7TmG-z^AvA)-;vs+zYzhmoGeYMnhJqojvhcbOR(T_pP&N1oRm0AaNL$NhGx(s?Kk3dd;`{Ll14Oh)Z~c383oq3Y-EU@2|cby)?!B4AmJDNnh-P7 z6=5+oq5X$C9Z{u|!1xC3Z;Q3Rt>3@ju)DpSA8tRvyNmn2FDDv)gPBB2TbyCw6cN6! z)EqqdI>5e2WvS+X9L|>9$tlSN$vAb%6%M3&&9O*Q^;?u8M*yr}GwPwJ$YGB|;@KH5 zgB`dY8am$IhV!iG2bD%);vAww$BNF@9xI~OKTrf>oPs~P)<*r?%BW&FapZMsrqU}r zv)Gr}_qvh&EV-4D%)tx0ZJ0Fa?rsYQXGSV>Eqv6fBu8aoVLw;Ws-e>guh~>GZ{)IN zBj=TDx~6biTsFOjJdGc#U9Kj)o%KN$KkPs4=PiD=-N!!X><1(Bx+CdsqN6122{{*L zh(}|(m&zNO!#KH-^a~X?m>`?daoktcp0B~4dNPTs6yt@nA`&Lz9>+YQ7Q90=(Td43 z5o(5l-4wn@;T~xqlJfy__sjTuI~(p8vij+}77ZUYd(6T$bw6Mpv}1hbGlQ0op2h#` z&ZmZI&GNfF!4|I5{u=24HunF60m5&YWwXXq-03zJJn;Q@0&nTseC5fQ1VO zj2VMka;#r^PaX$dn1m?bb!zxbjKwTSuFUe26kB0s4V*3G@ONOhcxmiSWm9q{7{9Vv zF$a~tD1n0XMN2)o>4~oZ&TK4`$4!{BWz|DdCtp>)c74xY^QMisYe?U^#LO!7+R_5K=E3WiI<<>9 z4q?f4k8YfH!whZF;4vQd`p5-~rrkGs(2Q%fA?|TQL27Y&+Xs5HOB>bHLw2^;&Q4g) zS@?DfA`fpNCo9|GVnCE3oNNQL3{Y)IkQ)qEW|l;jAZ&t-0h_>PF_>Z;TGoOjxB*pf zBwu<+FxQ_G}G05ai71u(wvzPFFu z$HH3seXT9`Y3=W^UucWiMfQQ#$mV10JnWZ?w@7E?k-{fSdVxTLKSJDH)x^wbohhKg z>9{vWrO_VU8{>!9U&!T$bzI;x*bzPoc39>MR{DfJ5<0Umz_x0S(~3+7KIKFaTmw+( zG1AUBQ&Ko9x{tz+Bos}nTD^MY+@vIS%rZ-}^20N3Gy=yp7w7RucwbOOr5da;&NuQQ zMs}5v9t9P=$8^IJv_dAYMRiH)PSjH3-)Hi#;G+yoGPT zy-iZ}f7DNCh^EYsuAiWrq=JLR1^*uu6Ytxpn1D#^g*KPJCr=mhdg1@Eyao=M?WXih zLcfsIIL;Q*0W-G{@}c6pgFp&`0GEkr8k6?_TTE~IZ=|%~8?5ml@M@7p{s%d&+6b*w zz)4PdrD_$j8qFFyeo-QieQiIg9Mu~j{!*Y`M~#^n zvQ+hg8O(OD{S8ppzZ1nvBI6+cJKi@ok0~ucHpT0Eg~_qCDOt-Zw7(z6UNmDqsn@Ohz3R zx~4B(!z+GvO~BD{%?jY+dGR^pagE9T&KU`_2?|Hx)~hpQmaF;#Ww|3`BU4AFjVv}4 z#tKsl(+Z0XN=!*r(v)Hd=iC@i!u>!Dk_QifZSTeJ_&8%e)`TP-;rHSTaoA!ZlSjaY zGvM?-qb#Xb-1jKZWZT28q1tj!Ejs7G19xM>K5&Cve!6r-o%d||zI2|I%tl1mGqKhf zwu(G|Z~zv3|zsz}e> z|J*N5ls=&S?kDYn_S^ZR`QJ6m9lw3Iji`-Di!tkUiinf1oNB^vP`mY zE@x)04Z&Uy1>{U)dP5`-iumrd8I5*VWL}Ovr9qnA4U=9nQ?mjg7tgY%ZcRvVZMAQ4 zxPe{>DL6ai?|A8pVcb!h@;$U{0iDoUPJ*g@twA(OvP&Kj2`$XFRx*3A(vqurFKFC= zOAh#hs4NR8sWE2o;HL-YJ7pEIy;qlI_M2R$4VAr98|U_}yzz!*T8>uCPQb2kG4DN9 zNp^OJTDG8X=D@3qy^pPlTvatZw{+aJYu>KaO8NKQw3FJ`tYX{?nMT3?f4}&hDbx6p zB6vc{mWGh)hyx>sv2ED1sOqoC+nC4I+>Nqb+Z)!;NZC68?}LKUXfU;*wnHP}@*m`U~r>P)Z1|N~Zvca!A3jeJDm8ccx>AW~kz? zB2Y%domje_LWQG5ouqNS7b<3maUfrwDqNpHYL;Q|z0M`8U;E{<19f!=z}h!V@ou{C zixrRFQhl|h{WJDali!4sYAv$JcrF3^JVEnC=gtG8}m{<79^$K0Cj?AqC_x7|U! zXNBB8ZpZ*lBubOio-Q9tFjyMxs>5i<`aKSJ5R3PDY>p^XJP8)3Luv3h8ysq~XD&~2 z%;Jz*Vv%4KosG(|$U{^NfJ1Ne9O>}blHwsDyCe6yHQaCHih<6V!lw!cXY#PX+FWD44+H&n{RZN?@765Ev$&NzVqt z%6b_gVDJkwRR|#XatU*{X}|ll`_yrc^^Ko=+_=s$wzm6c+V9wV_gvA<$=5r(U2zY4 z@4{auZQC}n+R}cVRcrqUaaupJ)0^zzExnt}$im*W~7Q zy~gmYxCVBbxaXhsYm$3*J z#WjvS90yXS0MYb;BqxYIaUEu6WlHz7q=&7pY7963y;=kN>{<6dH@7+>4*ra-)yAJS z?=y46h{mJ6MPjnt81N|}cjA`RL~Elnm>iHY8^We~MU@l<=BuhKR&G}|DX{3W!*h9- zGMkUc{wDik_GK0wnR7xaLiQKKkb|ff|7d_E)qClK{%NErFQq{ksGErAgaf)KB*etk^ZOxNf4$nOzkJ@9?m_37GIVh&ao&B3D2hdsU-UY481dKC89)I;vk!-DbI zmX3D``4g?urbyZv*@ZSj@M=+M)i1RpiBO)gtM!g$ok7ju0Bac>-l~9&|gm46h z6w;KS?par5@ho#j-WG``Vv5;dl-ww0MQhyB zYDMaZ)N4`=9%Di3Jl?}RhhHpUOS)M7B>hoXRo)IlsXc#Ge4|ttsURp&42VW~Rop3# zm(O(!Z0e}{3}T!cuAta8B~5n|X%xI>7*IjOnfeajHccHs!Th@6f+;z7%@hQr zO(hax%chnVVw}+K`E`Y*wL5CYJ-%5}Ha}iAnurL;VKwQp8y`u@$lPG|h8t9~BQ4zl;}HkW91!67*&EAuWe;5BNCok(M6C+_AKNVrjjvtm?;dCKvU-qN@LoUDncK8#+y% z#YQ@wwhg=H!o%9ps6niP_I|C910+)>#%Y%11!PJj;_le{Jna1{*c9o~cj~=mA(kCt zCvdEIkbUT3)t+@8J~~<#<)&y5y_(NN4cEEYL>HT9XM+rr;uNwx!~!8WDeT$cz94@* z$c9AO2SMfu27+r9k6%$dK_w7zD=ErGMOGBAqh5&=M%2j2h#`{cHA_hi1?CF#H8`F* zBb6{3R20>{2}K)(Y=0nJ?RMJ&o-ICiQi8?SSb_3HObcyCtDimwBd-?r6;Mj97y^eF zt{_4%wXjNx$(^Br7!s&TmqDPdF8?~Pj~b5{d61?0fDGZ;q-E=r$6glrw{Lz9zTj@w ztNpm_)xMbhoA!V99m*^um2{%|{;nU_-j&N@kFC*u^0Ymqt@KTfftpAji@M=>-NPys zC2;;|b*uf5otx;{r843Z$X(GX36R$(k$8?jHQ5b5^n6u`5@ISy592wdc`W$$04OlB zlwb>*_d$eP;FG`~rE|`O=?%k7Fcd9YLi0mBwf&HF}@%@UySb<*=bcql=RVn2^TP>`qq?;OQf=W?(hSdjV%>LN7j zQcr}gT2O22V(hl9t*u*cdc;*H*Qhm1mf(k6=X!*_|N09}uPs|t(SQBAwHx|ZELw&w z!X8QS^`v85@RxLo>9@@Q6%7BCiZhn0KTBh8rJPCO`;*^E{s_5lTE`hb^Wg8z__Me! z*%hpAG(Cgz+Q69r|2-VZs52Z0b?cU!6%P5b5I;~I*C1W#%r#zvEfWpgF<>DV*zmEw zs{K$m*3F(_4MY<&=wfSuyTU!fjR}b&91#j5-38<%QY#^sdL-t<^d{sSLp{PNI(3TN z`f@sR9B3j#oMMn|MV+>|NUM`T5|L&J5~xdqGl&7DoFr0BIPvmQNh?~d(##~C_#<_4 zkKBH!cXHNWe^{-&>7Gfsx&3{W*<&U?dDDwts-h#H6HNGQVy900M-bw;10ro&?p= z&c*P0B4a}slN7Hn9EqBP9@Xlt_INOz#U-0ksVbJrQc&>?g6!KA^&(JTxi{c&1)>IP zGLfW=+R@6rR_coAX3g%TN8}kXUaCMK8(2pXgBart>LmYGN3oDJBI--WVFS1NP?u0v zwmG|37Angyv$*TzboR}%*;G8$y0uS_w9=>3HuV~NUqxV3+MgybUOX8jY*g2Ld)F@y z9{lC6eiNy_YG~hnWxWdg{nZQm*VNaqp>I%C2zXruzRZ*!-G^bE-?q9u)$5(;=m0t} zCAeBjR+3}MXx&LpP6${m4hh9_ReJ(zsxg2kO=*P*gcEA-ppgbf*0)vSe!trq5w(9A z=#!yl*(Cf-rt;Y)e)gF%(TzwN$;otC<3qsClQG-yPA{xY?3v#su-+t+QCCtP*oG<5}-M^wNxqs=bm)F~u;n zPcLlfyT@n8e5aRa!*OH+xZ5BX9L;MlFFygL4f6zB3{#fn`SfT-X$gd9AWK9eivxdM zHFxgeK51FmJ@VHYs@osoGiOwMYFTJ5sknLu!6LoE9z_1zCrxa@^q5dJcH{RgfXNGa zj|`;4p@`uo24t~OgWlpaJK)(7vpYOKAB9pYJhCUCU=lorG$T}Z3RaT{l;Q;eh4J<2 z0Y7+`>PGvZ1PLk;L5BzD9qyBwnLT;UnpN}om0Jj+rT5R^&i22>c@Q<%RJ%&C;+L8~ z57LZ}Z`BeojiTVk8I&N>1``Jf$OlKX8cx^ znfpOJVSJ-Jp*aP0Um^YM~ATqShS#?4*nvIhKdH7Lm&#W^?K|$m&L2Gb(O#$)sC!rxc-qz)5b2p z>%rZ3EJgY8sQII&PZ=euv6s%c>DqhKXCL1A+>v-M*4-QKTt{?NBfZZb!`^wMS~dCr zOdph$t%rCiL=_agTa?_PPFBpOXmO+O$49j&Erp0FTB!WDA2NWXx;u*RP^BP>@7hFu zh?1PbFoAZ?O!q)Qh=hB*W{f|!dg`*ju8zirOrN&;eYRk}ULH0wD_^g}Bb{}Ql|zQg zxXY3zql-e+s!hZ&t+K-`GW_;J(bP(VLeP4IJ`M*}#VmFha0RL-_CgO?40bm)?Y7{p ziib*0Ucfmd6zV!Uto}K-kr2T7&SDNF<0-XSEyyD_F@EpaMxFkR^y>k5P3vjeufLQK8!j zeI%=Z9!$jXJnf_`h{n^#!?nL%G<4#`K{=pywk1@j+xY;P~+5ZI_&PUN_ zq*!npVR|%Ks6Vx`)yQSs4FaLEwXo0$tG*g)kyc)WrBhOZBD}b(9?(rCyNPYo8c@5w z65r=$vWqikYOKrseA22Wj|+)|sy${EN0btO7Z&Gg>xj!5p#@3pv9T3KaW8JRB@~+V$XqeDk}}> zATM1?K-152Ge4QReM(JLPqm~W2>r<rA!~cFxv3@Nrms%QNy~W0JZ-D2T`)~5x8lCT zao-x;*CWkQ?JVr_RWrITjCu&lP_>2X9%Lc!(P`;Sabn7elPc9*00l;Uv%_tKZm7iB zKwcj)CozMs10W=BPLPEUwgmP%m_n4LkOqJl1f7CXYo<*oPRmToNnX8r6?^5uY32pi zD<)>3wfS}|m-zA=4}eFEQnv%}D0KSds2!DXjxM$>#tPBZZ6c3KITmL>3TLNcfN1q< zR*ttHZhr(HrQ_L<3|-P4`4-34Y=&YHv)LI)qZXy6WW9pTnH7Lcq;6Yc0n&D&m!LT- zHz`5%N~FQoqGCPtOF%K8Xu3^^OH7>yk$1LnP`DW#SY-X{7Avh;bW4biI!L6ScXm+O zzQ>Rp%UM{GnvsU~32&r7s&0MZs>u^qucm_BvTnWmf5=`zGX-!|5*o<9rSep4sT(r{Flqk^AMTf7IZvZyX@ zwxHFWT94qnH6{6RIg0wx(Ow}^CgKP66jNRC$LEX18g<1$H3D6gLp)$c1;qmX>#zH8 zH7#n=ZTg}}Uvv}{>xINx39SSL#q8p7=?(q__9{v0t14R~J0e^<#H>m%5l$^>AVxdXu_{=m9|Tv#F*KB-DxR%lATLb3FWs)zOrp)2GETU*tBCPJ?KE zXH;hX4ee(;@y-7DO$QsiT1? zx(&e!sQ>fm7=_;;A{3oNZ}iDL5O;k2o!aTu4J-%3n*Bqw^TV2*{ext+@SA`iH>|c) zX_q?oq1f9oz9sREMBW%Y6yy(5I|T-WKaD1KCp+n6t@yH^vVUQhTWzOo{An8#eW1Hd z?B92RMxtRVH`N<{$N>ry1-HVY3x|_&rlsyMCF8N9^#{^h^nF51U`2vxyTn-VR8%*2 zt*RA)hxl+Uv$3Nbh94O-@u?>!je$e?^n@|>ru@~R zyMA89kRcWGW{fSasw&1l0XMMK$fpdzH_4V}HoH?q0d0#Lu}ZV37pD3iuK|VW@S{`Q z<{VP2(OA5kmPQvS5WgwH9W;==1kKQ4vXR}!@(S9ZxY`h3Q9eR5J0$Pr^;$H}KR!Mt zn`&r{9%wNNKX7t=@ARI98NIddd#06_r^y3fm_F2_{ltu( zq1QgYY1(|8HK$!rhE8uU}9ByA#G;5-)Tat0|_PAAuW~^WaBg>Ut+H9a zR#;u%qF)bzyXJ5rlXzYA(<$6@A6ZoqjBc}o!LU6Ka_pTZG0z_y2YKY>}c zB>02_87HKUfR$ieJwJevW4gcxbJKs(To%K$Hma8*WYd3s^W+gX&aX<&f&MEQ*Ry0b zd%mK3*+^yKt$9Pn51P+Hrd8%m|T=P~JjNp3~_9;v5IpIp{0&`(;+QI4jh6hnT#BeeViC=-rzUOPNI zY77JmVWtus&cj!wWp?Y)9qy-b930LI`^n8KR^`f1Ekq|F*da@dQxFdr-eeAtCDAO2 z0Unjj;a~s}B~XJwfqr@!uq9(;L{(EHAxxG?IslFLy0;x|ZxdT|6x4qfE*W(%b(Qyh zn7$KTdztjW{F36H<4Ng4^cN&#*-WCZ$>#2!n#^8lEH2cwZIUsNbVbr2wps6TDh*Kq zh#r&s338Wa5Y17o4;qNd6$6E6TKqU8){O>dFtWo|h@tDrJ{mkx)oMe=EYal=&R2kX z*HPk((2npi;?5V$2f@Y^GCqbCDW_CQ6?@!iE-=9D!mPrnE>j@SmolG3u{1 zHLKZxRZ~CGUV;*tFOSmhr<&;HaCg4>M*Hrm8{nf6?hD!PFydu5mN(>^HO-ykz?2%YbzQ=?3gH=H z1T@yxUR2a}q78^R1jai=B|tdCo)~ipj4XV0#Ldar%I-YBv6op-(#KO2;xrB9>SccD z<+rzNd2|0^)_ZDpx87GRSa4;pZrM{=Z=_Pk9NF~BE1QmtF)Ub=)~Dj;>(t6h^}3rY z`lKxq@{D5SPXJeLoU9YHy3V+`6@8KX1H?-ye|ZwoRLG!aJf))f7B_a>Bid66foO|F z1WOideC$kze+?6bLUDlJCtBNt(SII27U(D6P{^LVAUzxaG8Ej^QGXu~ij~5Qg=E`a zG3L#`uD-3VFlADCcheQ4hL@DefBNaRZSgL>hKViff(w-1SBkZGVWd;9ph?=T`Zl8O z-n7`n6(a^Y_lEsK)4M<~D;Z9Q`?#v;0-DJ|YZk${)Kz?!VmwXnW0-(a?7nZ;ls zNNnh#u_9D!F%$0h(&R)gn`I(?N;q&4hC&mhYQqpftJ%QKc3uEu7XM+pbo%>ijbeBd z{4G@L#Xkdgqq)dH9T(n^{j6m-!PX#?^C z->Pnc$;u2dJ04w5lEJMOtKVX=`ue&77#Xp8RDeR!76@G$LPoYnrD~U~E{oe~vp7Q* z8u5NeIRQA^;QWcm1UY{luo9sQtGCZ3kWr^c_O2zZc>FXixfA%8lXQ#sf$aDiHj>kd ze;h``a{foGBMdX>^?f*g_$xK+N~{ig*?8}4?=mlCcv`(*c)#~rpz@Hba#UNLB3C7@ zYfO43sWs_~B*UA&-}$)BXE7$3(H#eK(&_b}5s<{S)9-LNJyI$$^4<|(WS7I^BohI# z&t_<#06kC8M>QlQImC=)i`j^H4cX5}%iD|EKFT{!Q}9{AA(&wh-+GS^60Ib`@Ff}u zfsZ93;e~h+YPISa5% z*1`-*z>nw&Lb`6n@5Z;}c6%rUr8=dk2kG{(BUBwg9PZ-5y|BDoF7C&S3NjV?wHkN~ zHK=I8(`lswt!rqTJYNJomRDSiQ$bIW;RNx4F1*g6XO!@R(57h>@e=^x9hds3ep4Jx zJVASE>T2_ho6cO(_lD!zdhR~ZuW&SvX-{8yd#$!`z_3JSm|yc1HUAfOJ3|iMcv+{Wtp`@W1H)%5Qwe%jS5Od$)S`dcX7ow>_B!MTY&&f);=nBP zTjn!nd54i%jWqC4#^6_zOj94_opkEMA$AI9VNhhr=2G1*G=WKA92g=+g?14(lVFrn zCpDRnZg6mA6IWbh&6?-{fnCtb+Mar-^eiS_lQv(z5GBNtD zBPSH>`g}g)Jv5Egq(vfW^sRl@@yz)CmqlM%_1~uLk3arDWtElbo=h~uaMZE?}nhT>3~%aBe` zzv2j|1^rj_udeJ9Oo*rhhgA1Z$f@d?Xk4k}WJMFY_2`z6lbF*pC$VhE$OzSJBpEb$ zzA2<+p-K()I?_!nD8X$*4AEqQnlZvKrcy*vxkJ|{JuYPf zG1HQoEG}K2WLPP$H*W6y{Qm5hCb4 zzv9J<8}{Ik8N+4w7>|3rL-&ySORu7C`zC4Y#aFSG{@jRnM)rYg7q{S;R6{22*xYeP zK#BWJz-?qa|Ha(9z(-YG`{QTtbLRazGnrSC zNoFRK$>afU_)se;d^qBipNl3Kz$lve@gSi@~J z8qLNeqf1jc-ccShYW0e)WOKc*mcV8Psn~C0W+cNi1U6Fy3%EGPqHM;S8gJS>s5wHN zDCoPLMOnWRGaTeRTdip|0iX{!oLvb^16B;tBkCWoFFTV&{it>(OtbwX!%~ZemMoo>~F57I* zZ7+kfo<-l^p`;#!dcS8^vQAUdYLeLC2vm0=EuIX5gnpB3lGp3ezZA!M22LvRV9YfFUPX96eeGXv24LuBD^CM21FhYE)Q~S0>O>J=Yksc9js*H zm>A2_QapIr`*HM58&!NooWnb&;k|Gqc)6w8 zpM~5A`oNouC2v4q0M!C4t}oZQg3{!T`g6LbkK>JbPEgPc-h5#4RY}%im*ero@&s2B zMq(qPD_Wwo@8;Z^GQ4*Ryw!%EDIquE-5SDoMhH*zdtC$z)IHkKiNgKI2$7{q|ZxU^8XT5T*qcp{7$J`;bBG$UA09lMhheLR_=y#&* zhf2nNrHW{}%5aCn4s@mWwy9UYsh0=FUbpPBz6CjH7Jb&UU!qUFp|h*wcgMHIRV7}F zZQ$_1kfM;|fjr-g{#aMoKh`TxVLZ?imUO*8N@9i|<(MofK^s{;v|nt%I#rt4w2%Y9>xIi|M(5c>=pdlyRH?*VOr@_ojV67nbUpsGO7!xS%G!Ya~(y`~H< zUf?j>RUr0WY=`wxO1E;MpgUo>Xu%QTc;T^}a$>CHji6nOS9DJOjJ6UAFTI5L}ab^fvqwGP1ep-^^agz{S0CHNx z;-<-|l*vZY*^+u})M~po_p8>P?yfaAWFO@pJjU-IJ@w?!^^a%SWpd1OW+3DL(~uBzZ4Hu&yB zR>Zf&x7@eYH|Ddreb!rQs^WSzawb(M?g^;=@S`3>)P8#^UvT1*7R9J>TvL@&mhrkO zaXu_R=)=d1ByXVSU>1R}{CLmmM-e;?I-jJRVB~ns&ab}tvrOy78#fk5-~6+0Ze!=? zpMor7!GXJStHt`rEiaSX+t>!^p&FxtDFHVLZXCnpiVp`_d<9K}b#;Aid6^vFro5K# z7ZHo2uov;teQ502+#3D`u})xzVLjeC_LR_j(9s^m2BGvkhUae2TXg6$E0l#;$2iNq zhNFfF>s_8txO40l*^kS9_%cyH#32;kA@(i8XLY^^HKD`G#4_^O&3y~HZ|v9P%vpaF zXmH{j58AziGnW&zqkYgaU)W)-L_h4X^Rc#iw=;^!?5It2(N|QeRdmsL=pnCq!0WZy zq?#eitbEZ5%M8}77^8Sw^^kyls)UWJv-_0{>73_wNiYHnz|dDR@VsLEme`qOKg}0> z67=x{i~=*Ti`dxnJM*eY%-?GDkZ31x@dHACigs_7wu9YU25&uEChb-RyH&yyBNlcq ziug(_D4~C0_m<&Vk9}?jUXJxZG3s8v(YuY9gtrhr7MQ$SfNc4!pgBwY!Pvs4?zB5d zbP9aTt!90q-CUYWe&ANx84%L8nXPDFAXsAm0W6)o;xJCe~7C(=gGo&u@{bgD?dkvcF92#`O-JR1&AfRP25Y%aIXVyVOL_` z7dA{B`W{0toEx3bIW=dA9vIt_Tgn?saIX{V5;iGQa8V_O9JepGBb;v7H`<>=@V%rj zttAvhkWbSlin} zww&!mg8JuWLgFHSQ{dva3taFwA%`BjJ1y34aYYHUne?NCzby|R{WQR@K%4~ziW3Vv zo;L#UYbjS&tKf&kbD%(vPuGN*EZe~ju%?AyE$HS41YDBRMABg|quaCtP!JFKyq#?X zj|AN=r{%~tnXmyYM7KC=$!`~ShM+s(_aUNEFkT9DoBM#obAWBce-J%*Y^Qu};r(K| zQ$xZnwO`*w2JKVgg7WaZa8q(9IjY&mr+rDv#IamX_gN2fXGw2uBESJhVK- z$(r97dM>0DEqc&Q_UsF`Q^1!FnkVPW>>2RSvm1U-L(DPWKU#x!^F_P;MSrHOorFjJ zmW20;fQKCk@s=V)(-sy!*Fy!Ee-JRuw#^9>yKFli?(^)Ic{*zjr<43RNoR>4SJrMk zy#M-?@Jjr+GI&_0+DAespjJohuRU@Prf=bBmqjc|!&luxsnc`qiKTwyXaqJm;b(g@T)|n%!D~w3^ znM<)}?i0Qn#)JqnaARca;XK9>TTv=-*e^X1B?Vm$-BLQn^=u>b!z5gr0ettnyOsnF5Mgs!LYT%Z}q#IHf`nIe`+ zd!58{fUU-VkdAIZu&k(id*Ndi?;V0oqug({t4o!(lXR1g5%8RUM5+wZwTrVsx-bPs z+0K?0q90y6#Rmkv)&poS=ym={&`U9(U?xNKnlYg9a1RK$B39JgB;d(d(Rg^T7T_rj z=~8$!Zn1ViCuHw-2L3|!iBMG; z`%QU4v5vM&(9vzqb9H{6@!BL-mcyK9NBKObaA#A-dNuea?`*n#>{(?5dB8fhBFYlc zsLKV?qk6PAx*@tXYRTf8xzWMs!%<7r+@7SZGZ}o?CDyjYe}LgNZZZE(m&%LtpThde z6z+(^+OCkTDyytv(F$`p8TMu=to5uazsE{oPK-sa92~hTNIb>(#tvfL^cUchy*Yxu z8N{NqmCGx+QdwokWS|tr1b{c83IJAO>5(i?M!c>R|2kHk-)lWy8cf{1+zsQ~aBp-! z=hob%`*Z|0=cW?;>#%OODD~vy{LKi(YG{=4>gA;Ajp~in&sA%56j+8r2{-97X`4)= zc|>gG#`kZWSWom0xp_Vs@svLn+DC$#5A7qR?GY0!h0pH< ze2VSC$E^thJiZt;ch|gCqt$>eX=)N(>vC&K@$fr=$LxpHzYqPYjH0jSDc?67A)Fs$^K6FA zlM*(Mzzds)Y(}xp>!KF)HT41R+f!e+lFhT2`0dQwJYaV`Wbqc-NqD4>B)r$yjeuu* z;WaTD2_Q<{En$AE0P}U_kHxmtF%zn6>&D*OXRAb8aW53+<20<>G}->TO*OSUIT^J3 zkwu}4^((z<%nMc-awcS7QEUJ)3+2baMS53u&+kia$d&XvC7uHedQ!A=IB|zv!8Wdj zJiVH~Geqd0Efcn@#95Qo!WKG8$mwzXM9?kb0i(OT9xEuPaKgl41#_J_G4_XqErgI4 zWc@g{3Ak{tUW))A_T%w*F6G}d^_uGQ5|;94L%}y15BpL9+e7Q{g`J|O)VmTs*;sNM z7xGI1ziGS7y?8wSE(DusI1|P+B@Bs+>@7Kt3k9yQ3By^0(SqDA=4>2J_-%w!?5$pp z1CF7HoD|pIIQZCOh)*=fvUz@vD|4%DtA!30V}ajx>4fc^kcEfD91D7}SLNaPbV8qp zM|e*bdkX6CAPcv%MFl#2Hu!fUE?uP43t4|tlf_DWuMyrTIL;6ld{+=$`9qC@-` z2?i!IcBYmSI(Zyy=sAKdb3D`~zn+UU<4K-!nw<_SOj0MUpCZlGBIihRcV-FAbhl%` zuUTd8A&tFti;(qWM4NT21N2J&+-X5z{0K6LOojSeA>VY@p$+=$CsMu@FLe{LkjB2b zMa-FmeSn3`Idh2+MV@C(SeGSt>%cCcbxw4Ob|$RtWw6$>V1D0}z&^&WZ9*)p6#jbU zzE9nk;%KG$i1moKn*Q`B`otdCAJdBVhjO85eSx{nntT(nHwl!wS;+wg# z!PvtwOH6E=G?8Mj5NpJ$<<}r;3ci__kFY7!qMev;(N50y9m;+Ac2z-4xPXUhs8hwh zprQI9qhuNC53&iYV+7*;UEJ>QcY&3McHk?_XWX*j?t?q=%C11T4|g8o%)ncQD~L-! zg7F}(p~>REjIX0(3$C&2a{k=sio3YO^|*@OGe>K{_FRI>kg zzoGk$UlE&p`RhoqgtY->qoWd^XU`=(*UKg$7nOYXE z#jAO2VU#TjvWSCO9qe+AH4LWxgVWOZJG=F&>SG68)hEVJWU~h;XLC_sL(@%(iWxUq zH6=i24RJ^WS5)GVjs7y70T-3&bP-6tBE6)duhWm>u+9#u7|Yj=MQU+Jr588ow(?9T zmG{Z&u}rHvbxK$FvAD|;6+kF2^WQz^+J`S)dEd%uHPOoEV4^u3ZLJTtE&1k|XI`_o zReMaIKc~@{6baO%gVpVsNVcY;=Gw2$Up+UYzI^3R2aT@&t7ac{#^mg0Cs$8u%tWHy zGfvIUy=I`RZT=UJ>75;GpV?5`F{v?FJ!Sf=$uqyynLNIA@%h?NhO zJkqY9+$~IHvp(fiVWU!94nCZ)DITRYM{$e~cc!Q;2U?C`VZT`{@*(xq&Urp+CCzrP z?yLx)DoC`GYg6b|3GbI8UmV=dn}k^(tnI37Y9y$nJPUB!fM3F0!e&5Lx^^}>8I>IU z1s5c_06gVLIq{yYi0bNoGpdW|u4!;h?I+zp^+C`L+L|JM=MsTGX+-BH=hn?hsYaTq zbJL8kfQ6b)`r;JN!QcLgXc_q5(K7Zn^wb-Y7Hpn2=YaAWcvfiyOj^`3DyEjuK(?&p z#}@^kkJ>Hxk%*(V11yPG7g<8FiydHz%-(ytWcHr8A>8jgPui{X^KW-5uDpT zw_{Ex-cL^83P2v8+AjG4N=oLYNXs&mk1I;7I5*B@O`Z_c)Dupz{-u8YLjm8}0w0aL zbMBNmQ-N@IRqW#!x1ND70y!Xg6t?hm!$k~Gf+64&V&N`|#Sx`~NW$&M zk|vV#yj&1`qNyP7q8{r*Bi!5q(KKhLY;sVNH8D>v5Ik{HycUnL(kc*gZSGOzyNGq* zJV)>VIdL#M)0W}xOtKQI00EMT;a>PD;hy_1!o8>nS4dGgz55IFo>v05yRDnMyW2mO z-Y*C_6?~WgZc!GNmcZ?4>*4O6&T_bJdfg zF{)D`eq(-bBRqxqt)V#MhlW4fhWQ;g0a9;KUazzc=m5JE6GJwf*N6C!u;Kd9M&1kF zCt)+YXv0&ran&i?Y=%8rTJLl|yU>IatU%gW!lAgkkVOec>PYBiTYah=P88#56u9nW z7crc&gYW4Kxhek~GCer@O1@{P-1nsW)LVq_DRJB>bPwr%lnE7Swa7f0z~NjXYJ#S0 zr$XIByLC5idgdagN&1C++zEVL$d5G3pnD0Y)V%_yse5aT(A?PEnmM(qk$~<^Fs>vd z38vmvR)J@K5o^Cu>Pd{XU-=)?G4^-RF-h{*)Vq)cp?4)6DhDMd5mM+j#g@P!UC&3d`iXkqW0axDN z>2}fTLX=SMU5e-@@V?ziS%P1pUmaDah%WQo1GuBcN}s^X56#{P^$GqxggSsh;rC6# z+Cv-^eMu9Dl(BXr_A&qxt*WY#TpOoTM7|8Z zBgra3Dz+J)D?4An5jNWUI}>pMO7Oa%S0pT{S46uHO4~_zWOE6+urDCIk714siNqZ)&UhClUks!q=sTr4Vh}8 zD34Mv2)au2LUeBBoGR6bK`+Fh7X)nV*wP*|bE8E%2Lzqx8b^I1omqII%VVmVh#9eg z*uO}%Ku`7{>^D=7%rCLuXdOwq^Kda(p+m;c(-+xOn9DPbj$pIiqEFH%*Ec6x5|a{> zk8d_wPy;{t+~$Fnfk^|Cbv27;4HJ`?GO1B;cM@?G+!bHJUHVGgom9eIkZIaBwBDtj zk^Gf<#&00FUw|o;64v8*8kb2~BKxJa8MuWqH+5Hw&><40)FEPj7wt&jkjx1g7rFzo zMC+U8Nazldb=-okq81i#KXJ;;+5cq00)=FamFX7HSgKpZ8Y0~yahuasl&}2y6uEcE z7yCTzv8c)V1=c~G;pIB+Jm<4hNgef)DZzVBS4!|+sP{a7Xl=8zWnZzsQm#0WnwR2z zqA!>(cr*^raqK0+vx6Hc=+tL-Nj!BXo zv1-wb=2+wvgsvC43X_+FuQH0Hg1|?xuA{ZWR+#ceH91tfoIvsXyjr!dHikR3aoLaL zU?HIoF*0#zrwW-{St4`6?W`IdkbT#?PO7d%3eEJbmGStF6Scsi=6mlhiAt(%sPFt_ zk^EpRWq72_`FF5HHRSc7of3(ZZHa?qO^gY$MtnB;Q=h_cq^ymDY4V3)CIR!qoyi0d zUJ8@sOu&SkZG@b~w~KtZfvZuwkPv4H%G(mZs8^xhK;j`e6FfrB1zA2NxRYh;=oZ1} zch*(fLqwCwQ<9VGZ0-WCqMX#m1@XiW*hi;YRuy38<&E*`7*S0;ld)~`l|^hD`I4+@ zuPaW61(Qm7QQ9c!E2(l3>jv3SXEe7m)=fEj5&Oicv>T+nIs<;yX5s*?Ckwko;4pn- zk};PXsZT+NfFtq;GKPA9Q9Q@7lT~DKy%#QUKb%&~8ReU*s5VX9uci**>I2wRejUka zI@NVJeV9Lr@#FkY0+%hrhWcPKB$bXTv-ia&V&y;cbfZ&I$B=>ZgmE^>R zA|EJcCh5OZ;PK(AyF?Z8n1UBHb<~!0;{wb3c-I8As(zdO4ds3OM-5(@(wp0$kp`MI zB=~(eY*cR+L`eA>*UwQW`o)bf*VAn{J28-6feS*?4b-!)*mFXh?}@(1kElG*T8ADg z$J>|4Vwi5x1au-gOmxaVO`ooh{gCKWyA%6#JtpTP!&zTnjtw5f;XDDW3D*SuBuk{X zlJ7@$w#m!)MZd}StNd6}E9NR09P7^}x>Y7GF6=TJgEcaxZlOi04Rlvyt zP7lHH6P%tEJzVKINMDmsyp}OXF~9Uymeu~oPDN?k>GCoRAH5DM1}) zmPUfwp0Q@b8w}#S2w(2mk5_C680GC((wZ0#$5BUckhQ0KP7L3OPouEn{QxN7_vGY-6=em|#ExFa z-HtH_F2m%@{rhoNQUaXHTCu98LU9S69R}BdgWsPTu5Uj|?2iQ3a=@e)+643-x=B%v zf(#{GkfCoIiBeK^5W4}y;_$+eh?P7jhv~2Y=JZ_zbA=0v;NzekfmB)}_+$C5Evq-E zy|akY_digSMMl8aj4-g$s5g!@s@oce8hIm4m7_vTRdr*d;B*$0FLA5@t4ADGq8{fc zO|cS{P?$a9I2bODs0v$s96pD&6kkeDjil6VsiBmx{tEa~sfqE43#^0~i>ls<@ImLO zF9}%|_9ArE9*`jN%B|T1_J>BALa`g<^-O7d=%_;breMG`*Ycq~O+hjq&Lp*i}hkl*8!Tcn21 zjpCO*+eP$icR1Rmg!B-E?jj=^3ZXbt$>P!(!yiOsWVv_0mwV;9V69kcbgWj=au{4k zoq#*ttYdT%U_3~&LdSvzXk8x%+Pxp|K92)!>W9Z9z3jgV`k_zc&fP5GrlK_28R%a`zn`Ey+3pggcYz(tw0l-rf2+zLK|c54|9p)3A%9QuBp>v9NE z8_BgXF%F?Oj=3LCV}tnJHT7Ks?m-Hi>_b|#bOfBJuh?IKYi5N4HX-NthQnzm-Ep)D z_W=PHdTBzahtn&d3VN@{d#Z1WwRNtP65)%9wN+U~HS2<$;@TS59&3y8GNOGjMD2x| zK4N>UEov{;R-lH8;&CpH23)%5kH?{v^ufImpQaDi7U8KueIe6p5;c6LiA)X$^qKp| zcwCl}e$hmf&omKE*iY=$l5g*ee)aI@m@*mvS_PRIQKxDR##V=SX9;@jV*h`dO4wNeRof=z9XR!j&&+ot6_Z@x2lg@-sb8y_mMJ~ z=Gs1L;FmedVXzSjhp+QwG6&k*Z&XUi#0u?WKAdXYZ_WvgQolwo1b=eK7ROB8uuhC^5brvOJi`t1Ua6}aJ(#*s%;Uq1nw1e3`C zS64!ax@mRL1(XsG?x0}O23RUa@&-0FI`O?ENdJ)B6!l6%lfZO^Cq-+lypN+U-^a(6 zATj0BsgKx;pbuo9u@~^(W3AAK63=_04|eD!QC1OkqeqFtlJYmck3%c;!BLqC*+-bw zq~uJQRe@(w37$jfQ;Uqr60h`7yxzl6(U`{db66(sS5Q}k4*kaN0KOifZ{)b%N54j# zd}m7<=^qr1z*j!mf?hy4yuZU*=$~RsQcOwJi~i-aSnLlmSJ+3;0S)TxtAxKPtcI=~ zI1-8hUu57i1lrEI;fHU+b)Mz_&BwR}5@_9Tkoq~bkt11l_5M=*NT`B!f-4$4s>*XRGfVx(9tr` zq?jOwGRBNJiafIg--P0+u!lGuDnzbb5LC2>#VwqpQycve^k`V zbdu~rU9i+iM~ugzmGp_rK9w|)hZ~>a2y?6&a;$!)=D7&GwwAGmZ=Lm zw#(anY6(`X4Y{lpG41$REDudgZ82jqQ)|*b(7IO?r85j7A{o#Aim}UPAQ!Eo?c~40q&L9|C$}5^4S6 z{Kc0fY+gt5EcZz0Y6s}q5o_+EuSNqhY!QcpkofRAO9EK(IP7FJj5D|q1;7YMHxm3I z6aFOvKJ8(r;HnLla2Sr|j)%oEfg`fdXp#upZ~@c`i%KI|Vq&3DOoT^_qkyMZ>}B)W zKLj3%lAR>ZJ0%mz70IC__RGyiJej0H#EDZhiY4IG5TM&=6nM|moP-);mAS1+Bp3^H zw&fV1LocIQu)o2+gyD%bm1%V2JlD9hjN{rn>Wc00FeaV<601X`6U=?24E}qfz3|;D zTH@${T6WQ+eD5jk=~_Cul%S;Gn?xUiIxNr6rH2DEw$druiI%fHf3$iL*< z`=Xz`tLNzH0@GBJ?^6Ze^9m!+^I~6zwWM!Xx9Hnx_U#Hz;lSXy%MkmAh31& z>txmk7O#lYi)EKzcV#%ly8fTwNbE-e6R~ze9J)D<;$C=+F&TO}#oaDk@fZ4Q;2tBb-L44Nq(HGDiZ#{aC zNc@mwhy+j_&1O#zO++uAr!(h4dl=m3G=L7)VTxXd5IvJY7n9iJb^l@bge@%aP0__G z6GMb=3Q3Q^H)YBZ@wKrw6JOgA@sVA*fb#A#H|7Y7oL1Eisu12YcF=I7)5v9+c|Tg% za*dVsNs2ynkD-qI;$T{>7~e^*3E)CZo^YK_>kGIjzAjGg|HW`LHKkH%GmsAzC-IcE zPm1=Hs3{m~8foHsc@LTYl<`8sA>w|(L2hkS&8p zIRfK5h_Q_QRm3g`kMP$WVffp0+86Nw{M+ySZ|@jg;j!mSTgC7(=11B|!~@x0!WZ}a1=vV{%_{FAN)U_t7WEVQ-4PZ#n)bzD zJRZT7opK);x6c*ZCq;W9HxN*qJi^)L!d6OhllxvVcdln-?i~93&q7YyjCxgXHChK+ zSF~zM>tqt|Bj?ofcF#DNuy>JrF2L+C8V-l~G5L0L9gU+?2a+(bD3m0|$G zLiPgAGkp)|nW)~Q7h`FldH}-0=HkDPLKa?$gz03!zg8b0{qOOxsYajxyT=IRVgE}d z0|h%L_r21(0Z@**0fNqP-?KvR2IB4)Q2xItBM^ImG9C}vC;wAC6X)vlcuH#kFdq2p zf?F?OJTnbkjG;uVyG9 zI?`yQ9SXTB)E;0os67yvu-zz&jj*P)G>h3eQXK-G;1=^OSl)50ib0xCSHu6}?m{Gf_$x zr4EI(=+#K)z*#B5WV(u?tc&b&(#0kDT)iQ$i~qmCmDk4t*KEUC7+1c2qmb*JU{K@2 zPI9VB=W5)zOuZ~{;fa+pTvXG69I#o_F`j)##ANcXBqxixGPSarz+9b1cqX-oxtb^s zTvf~i_nMhtdVk_$Gr^F?iSXvN^8X5N;z+4sMD!$H*v`c`5Un(_-)RL1J6>qzmS%)z zD6~mm3bs5gBG5gqzl@7b*neD@Y~ucQ5hpA37uq%3DndgOgv};~A>(Ef!#F&QHZcqt zM=QW+G~B9U((y5IwTWRlL~QMU154;u_+vVBb=mwhk%icMtl*FGG2u55mY=I4EE#_* z&{YQOW5RI~7U|AHJPvdfG&Fk>>qKbi#*7D-2vJCSv8l6Xs=k=CF^z0J{#pJRx z*LykMf}Z~0<2^iNR*ttM9*6OoHneKPc#k(aNWY2k;*H5-aL$LYUun?q2;)Pf%v=MI z4_g_Yyd5p@%rd5w;3*3OPKfF75eZDD-Ykg$7WFlM0^>Q;@Tto5qvd!GiwPzshzY8n zHX>LYXK4%)`>knBACCX97@@#FE=E|y{|OO76TgfR;{3Uc5#s#0tntTLGP1U)%Abo0 zxRP9->~nLW&w9~EH=HZ>tei2i}IS&*6 zU&S~?%|S~UvrHRN#+JC z>wI;}It!IKD_k30L#`2*ri)idhjvuOy6DM_9k_CczTS^( zgy>{}S2(!5)a=An; z%Ipn}yO1%pXNUWT`gOd^*8kGJVS1Q>1;u?usi~dphnw5#=5Mwv{7zqe+xHcwyr26X z+dj4zw?3Wpz}0*sKw$`mJC^9iDFnjAw^? zdcY?o+j8-63trW>RHQ1{ro^7atlaCY53WKdAl zjmOULsz!GOCenfrzIjUbK>JT)pe_H+iF@|sZhY`T>)+1qJ$}JL@oDs*!^6YEhLwIb z#ju4xEb|h68JDQ1YNSY*;u1&7QWSlBq1Pz4A^Xy8d=&xeD%P*8TNdk3;t{zFvuy%T z?wEKcN^BHy(A^p`e*#?u|6k^;tHd4YK}sbFZBa5Vv%Sz=#dv|R?9=r`98R}Uyrs}t z-~wRF-z~pJ{p)dbV*+W7`w;EiF6wG`1S{#Xv!VN)q#%B7L}WF79A#x2P*zsvpwa;t zGU;fq2FzC^Oyxb&g3uH-_+K19msS2WT zJguhZSuBs9klF&=DhaoY-kEvGd3uQp`;1!YsP|f#fyaoiM!h)I0gneS4O{_#Gi+#a zud8|jaRWMTBZeaHaHQY{ZSknpQ)X#<`E}59DsG;`MP?RKbt_ah$ix7RYA8H6UIJ8{ zo)tD`yBaspa<{R~GlTTfWxaz)^{;HRxveZYUvcyGkN(;k_ewKpLQM#NtweQ^Xrax^h#ugK6!YCw$LRCoO>bP8 zTO7g>M}P;!ZN(8h`qHYNP8^nuJRW&Q{c|*-zHM}N^SM$nM z9Zi9`LG@#cda0#hzobn%dv^}*1zS)W`7gyO=_VX(+P++T@I5CAH&gM#i`MiNkdqbq={hK(O0t2Y{Ehlrk%)TjX^W>g~GOzaMlYr z;yzJ}0AewF7N26t>nOfl=&0GsTQrkGPanHo)GU+k6P3kII=J|AJb`XjUZYSv%X`JK zDa(Efx6r3YJQdpcR!8H)YY@{kn2szy3l=vs%U?>%g5s!z~_n*c?>os$Y9j4b<-7%~)l)}s6 zdA+uIeq9^swcP99`TqCY>JQUvx0rhE62`7n<%2g#GCrLijXP~ug66N=zC|=&Z@hB=|~D8w|2wRb&vgcN?O2q53-;VUh7V&fHhBxajgz z>bT-yCem>`1s79;-5&SA@if=-~7L(O)B<>UR3zhbZhGf5@M$79%vKzIN zME+UEX5SF+NC}@co?tjtBkRfw^o?tem~0pXi1t<0)IL&fCrUn%ohZfwyOL^4sOCed zJR+ZjzLf3X6z!$PRGOI5l#xS$2_r%eQe)C*$p?8y1Np-9rOw114e}i&#V77)7?Q`g zNMV+{v;|*S-g_bRrG&9wz!3Vfc<)8=z6)s-V-E1g`W>Oy=CgSPeL3H>=nxPR2;-@) zHcB7dWHh_og&I>?D@%2(D?~*uRkFHJk6UtTMJ9f5qpoT1T2WI4yL3L?rd`mX$8VPf zxp0K3Aou>5JXw;EC9{QcRs-d%uUM=TAt=DNY!WqlbLBb4d@b<$UsWZZ zYv^^cK^N0q8(dpm55wnw#btHz<>CEd9xf>Vl^2UdI9Q}A-P)g2ujLTFvnej+RHKW# z9f zd`eu&3iH*XsMaB$Eo)n1TW%Y)S!_NAf7&%P&pCioL>p9=P}@`kCNES?ITa%Zd+;th z1O7BLK7Fuz_dazgJ7&w4(cf;_VmSmF@Q3d2U5E|fN!$;tD$|SxX>=DA_u-Z_odYki zq=BTrpNwYqBur)6OGppMoC*1xmr+b#)>sMqpK6dz&y12S<4dkc0p?X`s_9u#SxML9HG#THxFjuPD(mP zGJpdlc+7lx<$eSYin5#+Wm@xqITbJ))Kg9`uEL|Xi_=L)+Ue`cpUUvzK8Hbvng!5p zM+93~+y5@;Tv$Tqu{+r|nDw+jHb9q{mA|s)cO;-C0s|P-lUz-Lxm4t8NZuBTIsCK8pG0A!Dz!C;jVt*) z3Ed7NCY~vOg8zfsQz`fG+E$S7miHhJcg85nc9`755aA2pU`fM+RPO}wE()XJIKQt? zwK$|}YE=gv%&|ec3;ILN7R-fw%&uS!AZ8~mG-;hNLXiK{PHVU1&;K8P9(ysjOsTi- z1CK+y<{}u!tMN#>1BdetD!o~R3oHC7e|?{I-+MRNp%~a$8tq>|d#`ed5p94|VQoM! zjWvN?&L$5-WYneXVGg6!!kiA9+vC+6Tl$a)Xz8=NEZl3+RHHuAM@n&?s>X5AJXdkI zWHqpLzPNH_OGgCJ%ApQ@sDouYM>~36?zniU<6>QY0XZqZEz_Opj&w(C5nHCd?;Gtu z{&D+#_tEEXM8_3&bx(Vl03^x(@Kh?ov_Ky3n362nhsy4lv>w_lfgw~x)guH7=Wul;L>Zm|9IYwdXc z^fM;^oJz-T)nT=0HoFsGA3)Ssvv5M-u-g!Q#PD7keFj(C1H+3QLxe+&CW%pCEXn%5 z+`HGc{~l=Ae2n9gueI;{UHjJ{J!50oQGTJW#GOVZY$#@-s1S(~Tzf z+a}KXApVW4kMRsHlIMzrEwZq$SXh(gM;6{^x!iKdq9Uq_`r@qqgov`x?fEP@HObE% z-N;w4U))Um0$lAO0rz-gash51W3wU57WS5f&9|@zEU#MlH!N(Gz;K@hw}CQ(-M?}o z_}W7sPSc*s!?!NbF0)chy9#%M>;PZ_dl~g7!Vvs1snRa{@T=O_tP9{i!z~?q2ll6X z>^taZQ)-bn*uj|Hy2Da!Q;^!ucIuCJD81tGUqrYuCOo zrM}8ef=+QLGapp6u@NJUE7iDt8@nISG>ZX^Y2R*9w!(FGv8`=wt6Z!RHYf&XK2Xqc zumzajIS2tkC<-^;cZTXho$RFHW#^rDp8D$W+V2iLBJd0Y&tBk}i?c~>K%(tX?^kTw z>>_AyP~OeDU3F~5E1&kLz0s~Z6sOBR4kKPRpyv)oI|b5?cj>(Y`NF|em@Vw2W#^rH z?y&Z^uirWF$TM<$yK?*4T4fk`=YvZHy!LH2q2$t~Xs6lx?2GN1%S1fewa&HM^`1+^ zXj@n*>g;HzK%EqiD+ttU1!@{B;@4&4?KLut@H%!V_p8=zkUC9Z`m-II(+BXpLymH8Xs2{sIT&cV*V7xu5E=+vV7t$`wc9n@#TUCSM`Gyp(0d{Nxe)tNh+Q5!6yo+! zG<13B+R(p+_Jpip#!CFnuIxY9fg}KZMmD7v*4sNB2O}f}C1QZczbO!WAq3*wb8}CZ z%Ehph4mpltjDzH(LRoKAxrt+9y1X7CD1N7E+lHqF#A8JmgqXc!^RxFJ-m}HOfWF;R zv2}6a@&LC7qJc(yqXo)F!-`|EuOTiDzvBYqI49F?X~bS<1J9Lal{r-AQq-98BDcKgwDD_H!|hS8 zfwJ(hjORTM|AB}7#lznBum?SCv4>rY*N~+Y(L*Qlos*uP*YwwvUaYeI-u{>R1^W@( z!)^oRg;&|NRPNHBsZzlsBAwp;9K zqsp}=1cM}%I>>ZbUbMNq0gXrvh6Jf0mLakKL5Te&#NH3F2SaReh+T{D zuR*^Ov4YeB#pyi7Ce_Z;p zE=ge&ses=JSw;5nU<7-9lGc{_p|w2oOzx}l1BpON1>$(CQi=21^d5{$WG+)mi_)$1 zvPxX75eY|j21CJMFw_yo(cVe)A_l!YT1!9SZCCk|m3~4d_%FtH@XhXyCp-9_Nl#7U zyKA4U<$Iz};RLw#Nh{xj=gT?ojx37s#_+W8;;`y|()zsqq@qRC#_04XCp}+ZJMGDi zif|+pJ}JnWf_Ota8stG+I1n^ZUdE&cAsd+xdM)?05L6+f5_EWdu{!3UqAkI|J3 z?>y$-&ArPn`(T!3@94DQJr52)vlsufg1N;1{F84y{C6b#uWHAzobYWzsPA$kt;1Cf zX7{ktI}C|!VQ^en?(Wrna9l2AB%>U0fMfVKMIW0o)kxT=m*{GMhX)w3md69sY!&jQDb(cuB60x2V5IrhcJuthT=oztWVKEn9KmaW!XA-pKFehq$I(4r`RZXJhMZ zyKS%A)YUfDWINIJBbyqvO|xBYJ7gnOE_C@4%qlk5(dk&MueG<~xf|BWc+1VXN7=DA z=RWFVFdcJvypti)(Z}Zr+@~8eEc?lJ)cDKl);$WlOu=)K8Rdt{Ze&R&z>wj?D;n%`qw4$(*y>`Z69#eK9v0TDX%Dm90??vie^OB&I89{=dzPy~&Q+TlQ8TJ)=QI_n zs_>I6Y!a;N845d!pM-2n29D2(oHgSM&teLOX;I-H)>=ROJ#$Hc3-Ibb{M&c6fMqYq zHpP5)<>s@ss2#{CevJE@y7-!#FTe6%>Nfhl#VX|FWd0HV31ro$%qA;s$e4t(OJ=Wk zXis}IHjIKJ+i;_uEKt?%$EnM%M*lSbwf^V*+WCHIZbLV8=r6+!J@|NUr!cntQ&4Jw zEwVGz)tT_~pKQ2hV9ACJXRg9XK4OpF{e_&9|L6RRa_@%=-(UuQpy^&3{o}AE~WNXCl9_ z@~5loo=*6D%;&49c{;AgSt6c@*H=94)asvRc)APEpoz!2`svZGEIyAMgg>e8d*TVC zo=1oDA^aBdqDVEF|J=m<4H;~HRHK3&B!wTqNNXsFAN)z$v+2X)9tlfCQrdercoyJcuo6Ihq#LiDJyPIX|y6a}wt*X;5i?Guo z=S6sfzso<%uZH~WJe{p}u+tqEI{0F?jB$5+OQ6D4;b_c+f)y@jup;Q(>8c32Dx5C5 z`j!VPZO!RO)Ed1wPO@T@zj6wnJl6KbK+?cpYb6MREn^pnSxU=)6A$pRoqrdQd ze@BO$gMJ1P{mtY3*uO^bI-RaOvd+>XK3}Cju0M`H`a1fIvapZ&-_qGapcbK8tIe9R zrMesFQ@vmB?n-xeV$T(yFn6r0yQ^Ep*Kni)O+$Lba#ncj-5=I$O3prZ@}`-&x9)p@ z9Ut2ipWWNM>DUKCPuV+izrL;iT+h~{Ps;uD=)R5@m!EYt`_(_bwu+y7v8Vd>KR&~@ zusOpo@^hDas&0K@-S5sk?!&)3<}J8YofLO{cvqcQ`&Q`w+YaVlyPb6K0AjJo$ttbN zJ;oO*CpAst^I|LS7l-*#%Y>wz8@G1kM*R zT={-Yb8{u0rcJlvGO??4rLFQRA8hNUbmo@&L|wc!?)S%A)#lJmZtW5z@|tg=$vB8f zIOvb`WV2cQHys_A6`BBj-^f9IbO`1`_8`Lgd700DC2pn?nFit`J^WXYe!q}@QY9Uc z5UmG4@zrux=*QoEH}~M~En9Z8*{|KRBm9(S)kSx_JNTtppZ$-Yt-7)tZ;SHUGpN-^q6!8+^kb zZ4K0@Upd2=>aeU8tHk0EG9CLXyEiAws^6YL$sb#ei)gs#@BrGD&Iajmo?>n_vq%$ zI4|$c9rcqBZqI$hwA;0qpsgMCs7cIer!r!E{rm`9hM??8lTM$+&ud_+g;&~Qkyr+0 zB}#j(J;@YA>6<3q(V#_a;ou!!hx;~vMYzHpj)fBlSm`uM;!Bq#th?j{fFxjJ^k(1bDEdABGO9277wItoAm1Vqs#2 z)rMKtP@NZo7f_G6p4!z7?lffR6M5_%Bp0bVQi;hB+Y({+++VA1oIPhD3m$dxMQ49` zPVU8%zW2!P@bIrJ{-55O9sR}6{_c4!_{NvN+0G2Ub09MKjg{dU-49PbIeEj9dcfWq?`KLTOD0qDR*feX}Vu6kFy3uxhf?b$kCni3Z;3;pNH<9!u@nxqk z8T9#*K3v&Y$DOWgbdTHc&BF!PNC$po;Kg(6(QcnR!mm;Ah}yi2nz4F3)}wJn=>cO7 z{b#1BI&zJUhr^xp`${MMt}>Od-jYt%J?mjV^RO#DKlbobJpG<8dQ?ScPTixrBcWT4 zN4lU^ukv|)ZtPx4@6gb*9lgDs*nhFw#6o(eW8`3GC(9y1fL&%EzKDIO1zXS%N+QAf z{&hN;;_FD~!G1-rWXeB9ZZx!Kt0}w-DSk9J@Qz4Dr%L;{HT|=y^wJrhTM&QfKR2cmqmPf5^Jm)>A5=W%1x}sSiZV}txmDN6uYF3eX*XMowzu`V~LDfAN4e-_0`Ul zS|9P&`4fsG?oU)ZYyF9+C*V&+yqa3CIN<49{b4^>{R#h?dNo*IuT~@mxw|szs;aK6 z;=XVsYDe@s%uq!Jt|Q<1rqNBD=Pjs*^Lh{iuWzyr`s}uPuRmDrjCvyJ3h&Ow8jmx9 zLzfoE&Zd~tX$z{V4g330FIY(&9Rg4Fm*sal_I29XS@se7AN+b`NFRBWrs0vHmxr$6 z8uplx5%Gn7Pv2nsfu0JMj}fhf<+VIP{T< zsVM{rSSA&+Jh}PF+&#H7_H4$VC)gS6o(J(w?)$kt{eQhN=e?2j_5YQ-M*k^4Zn)uw z{15o{hTM1evCaGT<=(gf7qLSPDjUXLcifJ7aw#GBwkIp^8F$%EjGUM`QC)We<42vq zRQt5(H16OT=z?x_HZHAeM!0D4>}9h#KdtM$F5cZfyPc~uyJoj*C)uW-KYi77)j7TQ z)}9L6$*WH0u9I7DJt zpKx4*Stdvwm zCp}u*3dfH@M>R|p+FQ(pAJsq|-At+{INdUok?FLG9u4(Efh8(7u*o~$xiR-z?w?ma z_SjWFz3X$|7+kIW`q&d!tzEnJp)FgcW!oq7TdYqkU%ZH2`>j{@{NfMRhxj{RSUD?q z>Xpykhp38W?{WLrzx>+hE`I2SuP?r~{)4yOUwVwU-^?7j_ii5j`M?xAU$UlW`ZVLh zZ(exa*8jNWCv#_ZOkI8Rva7z6dlR-b-a>J73*QJySolT@E$cAXu3h|0%t4`!)J6he z`zGc-uB4O(rAe8rv@28CSBc< z)@pA>a7wi|;KwJQZmagXbz966t2Ur^(>DJU{~FyE)Zujmrv%retsucVWs075IFScS zS4Q=8D5%GsF;BI3r^kt>NwD<&y4u9m9aF4A0d$TGb@q}%g`RzxEPDLKukgVtvoA*X zVeMn%ugtECN_{K8uuA>Ke*9;Cm5&s@D{bsEJLOxMUnvWurd07UwUhQlwX-5wAwEcn=}fS(b;MYvIW=RY3J zb#Gz*i_YDW+q>nQFXZ0Z!k&6;3tPH(3(t){`I&Rn)uWtUbIxZz{I&M>mY-sLD!o{! zecAdLa+OK!UPBKmK|Ij?HN4IJl<#>TZ*)&{_qo+4oxgMPr) zw^Q+0_}i70RqCx3dXFe}w>oyP1B$n|8eJStDypcJSp+FMsPADyrs(D<00^h;_eVn4Jh~B;S zj%j|9=Sjg7`inm;@H&M_Md}MWjZf7T*xIzwOzjLouAua=%cw0^+_`$wb*sO-=BwLB z4k%-fY+3dD-#>K24G%r^(H3<9?_r15{OY;KpVq$3G9NOe`Yw8B?aGyFKkUgJS}W{o z*sfOCt{LT3Q#8cYE6A*4PNhoWs>NMDtOt zb(rNO*{@idfzFN!%{nreF7YJ-Wxc z#-|5;y4UNg&^=5WblP!U z@O$uHt=;3pv*{>s@Y-xU(b{hJc*W6zsMFKuaoIFAZqM3#5d>p6J24pY;gs4NJBbna z<|CtrEJ@cDf%Spg1L~~6!T_(Ki{sd(_G|1&^qgq_oSg^kxHFpt>>ixn>z9=&aZ2%2MU;#>S=d*{W07>N#xs99B7p&6>v2(^w?J zI6_2WW(_xlAqMP9H~XBM&9X8ZXDuC>DW`OQX6n?>oOo5xX>(gILfOfTw%|bU>Yy5* zk)6SVGlDZd)1xd~4aerQpa0C@CER787!LC$t@kHbZehYrxrz1XT+lY=hR01 z$9PV#YSDn(=0v4NXJ_wkI$r8{c^Dywv;J%c`9O&N z&`-1_=r8qm40m*h&>VJ+PJB!dj|kG4u?%WnQeE8@2syy_WUv>Kb(w|?{zrJDk*@9l zf)Sc6Lotc2?ugZrAJ^EkUt7k3v+7}kiai^aM z*I!-znI+e){o&}ywjbwSU%70?j5EIX$d~5LJ0@N;D|^(Lxj)@lF}-i=Z)QK=G4n$1 zW_L7A>N~N$wY~HB<60+;es}hwebbN6^z|Nd%rW!lzj4KqkFK0)G$-m;_QmZie&gI( zr{wPLnUy}9*L`_z|84B~+&O=HZFbkx`}fTGV#9qmvV}M8`jS3xdTn?LJLT5c%xlsg zo^$F^hH>;MbB-~L>HPbngWvHk`sF3L-MRnT)ZUJXe?Ir4NwM1Yb5EcUGxmH-Zoc|9 z^m`f+r*9gcy|j*HeBC~-PEIu|{&1*bZ7>ju`rOrPn;X_9t?sqBb^6Pb8IMj5H{SYH zA6xEYDW5;iDnju_{=dWY>^G~~XoVk)&1}@lk z*{qrF&Cb5=Xox-i?B3U(<*v799^^+?wqG@SX72r`bDtTV*Jzo(>azMkZtuJBr;=D) zz0glpu&Qy00`&x+ot9ylbltRSR-L#iQWdNWT^3-+2Nnd*1qUu;?0B|-oeOQDMD$1k z#q^Wic57oQt_^yfR&7&LBeT_4`jFd7g>ce*eG;(bJ;5h0ex)&E@NBXzXg7)u=AY zuth00J$iEV%&2-)@T4H0ZD+GJ=JqIcP0g?popqk-O|e*=&(B=`@J${qa#LMJt*@H- z)oMB(T3uZgX>xiZTHShXq^tP)j<e#D~(YtmO)jcg6`)!^l1-O3&6dJr(D5~ zIV*M6qaXFnnzE$-55tvr{*+zK*6h8bYVQM%%Lez|c=}xDhsQ*o-oJG;c>6sb?LY6x z{h!>gzjH~gc0as2*sOG>T)Rx{jnzsmt2cI>R*Sj~)&MIr6bhXdQe7tonTp`9+lm;8 z#Tv5KR7UN#T3ZZnJpW(T-UL3X>iiqO=iFuXeaU2-%uF(wY%p0T>|EA_MT3YTA`!Ig zSOHlTEzlHE+g}Aiu+|o8ty`@k1W-i91#rXK)~&4zwytf_{Dk6`-1&c>Gm`*X?fZW} zZ<4ulXL9ek=RD_}=RC{zd5$$~^|@Vko8RUS2L|A~$ziK$9axwaFlk|H!DQ-}B^JX`s-AQ~Vm(6Pa&%=!@{_|KEzpg4*vM4zt`9LzA zRFhSkkaW^l?c3;k$*1^Sn}WW4II)!ST(im=l?J<1TwwAQu8p{%w728>?^OF{p7-5Ex+3Jw0ZR4*0w<-El;~vExE_|a^%RG1@qr| zG5@y5*lM==(O=~6-($LR-JgDZ(Il`J+j$q?_K&rzOv;{L8-F+6z2nM=@?a7CwLPWE zg7l->J21#Ny5D6^jBQ0)2OK?OXGBDQ0znvm*6sOl{dMN$`}6YhfqKtCU}6M;L14>2 z^lNY;)2Bp!V}4Wq)O@8ZZ$MsiUR$0*kXHW@`SoT%r`$&@O1@lmq~P_kBQalIE|OA) z%0dG|&7roC8ZzZ2@*4A+@}}mgd7-=_t^cd>*D78u!{n)P*mGWOldePRVOjFNs+HE< zS;If8VIS47&ud8I1GXVa$pbKI5db29E?_9hUU^M>cPM z_~Fg>-+!O{(6ZIf1EX^FvId>7D|$WW8T85@I`{nHrM-JzI*ncd$uV|a=?{VS{S&M% zmD2KurGoUkyItNCf& zO~B7h!XBDx3<&ZJWhUP+cos?%L?EbIEZ}-@^`eAd*8U^!pi9Q+p8+CSo6-Myz-v4jp1sK-C=hIE+^#| zwrbcbAHw=(fvq}gl`*AX(6574hS%HOskjMllstEZd%RmwtpRJ?I>xHV#oJ6Ji4tBC z+-7!@b)ngI#v5J1{xtIUd8cg`f&Vd z$PgqwVDMq&VI)EusjQ3^lRQ?(Jay_>gGjJN@_+>i6Ruo*xM%0XNBE?N*r(f{eRliy z=bqbs!NP?XTyWWC?4F)Bez&sntLxSMU)`Xrxc9yL?t713J#)8Sam7}885^#raZ}4b z!QKx0CA;Kjw!PQc*am3Cl%?Q+FO*U%aNu;f(8|o#khRP@&$`O0UPocJu=WE-Zo;R4bPlsh4fi-RM5` z@D$TY6W?ok-^Ayd7=&%pDF>VCVEaIB=iyTxHr2!Sd6@Sean|Jd02|d#4zd$L)){;^ z$gd5umE!NdAp0W7%7S7_)1)RKJ>C#cwxov+1X)``0O2JW^&w*iBd_(-?d=%H_%~sN z!H%&~!5t=3FXS^|0fl%RRoz!#i{GcOzWV8&eotyzf%SK9epWu?MHRu+PoW4_56$_tGT$#O{HPH(tKl{`1O%`mBQ zW^(1YxD^1CK#{s8-wa9CwkDvP0?ZAw*5y1BSjf*X^&JMl1i+Gk$&10S0AH-jsU41~ zDjcir?d7Z?z$EGn8^E|^V`n42+Dn zalHB3s=?k^Lv_CZ7WvszW(*q?)!T=xtuBvxtU)l9fXx=G9#%GcL?p_ef9*B?k(*XD zqlL+0TPn;M*w*DG3Ou^lHP5HA4zrm+7xK+e5~Z6hnhOCsn72fox+I7|;T;J60VgCd zb~B%A$gJnd?$_>Tqwi-w`sxjVCtH*LSX-wa1s?FKfCR+kIs9e`zAtN={AEwEv{hfC zU}N-<-I?+N7QqoF$9n&|yu8cHbnha3dCc48RT(yrX87x}F&(Ej+PZ8?1p8{!Zq?#l zk`_x$m)PRe=|4TymEsYk{#u;ckvfJC8gZp1Kp%S=z;5URozPbR9X3eAk%Et6@lt*D zUY4!*V`tR+7JVgZo1l6psNRXi3D*19mEc_orY9ER%VUYIgvug|BTS08Bh?W-GAS|> zA5C2m7Qy?D$gxOQM2+AdJVIaLeend=_oq+jn!qCy^a+b6?3i#2A9`#5Z8aA(&(s|l zOl#}6*1eeOUi{zdj=evaRN%(mVtTw9tAIuD^^SsL1ziPd1pnX>`U>xhn^@nU z-qh8^BTahK;-(!<$ME6*sP5kvbf>yc6*0Hx@L6ZjeWSh@)OJ(d-T%Gr*z%jXvEk7q zgo!S;AjE~X06%8wvZxV!%Oe)C9THz$&-(uK`mTB&sn_cl*YBu5h7V^{`ag{nLGOI* z$?*_!N@+X*KE|awe0~;dj}Ow|j~m=C^UZQFRs-mr9+z&4YqL=@n&$i^Iq#zEr$alk)a22fagk6{_&xI2t z3(MuV@P`1>UC9L)cN$;76~gIWhx|cS@)}@SleNt{qD)qD6I;O>&2!D4ndLS_$Z#`( zNuf}{Ayf&&1WXc;?x3lG4v_7LAlcu_$_@Q1%@ZcKU6X&+h3=<;=!JQr?_)V*br!C+ zeR(IZ`vV(kOfeP!;d@M(^OeB&-C;~tKSi5OQn?Pi`fr(&0@A9 z@^hWViVup#YO*kw46u!2zDWfwZqiwSS+U9%3pd#m?y$}0c0QX{Z(*LnD8M#4und3* zwUDr|hJgyuoXm&^P=P`+qsepvQP#p5U=y&w<+I=`4`0x8r}9d7F`wD9QgIuTACpb| z-}nEz$K3rI>biulQ3lHi^!ETg&K}bVMBT>cq03$;R}@#JKXQfr0sFqPCY5~%zzC^# zqBrn()CHs<*?DkxN`8*7xtrR*moH!)awE#D(Zg(~8NH3b5l#Vyib?^7P3i`9pZb{q zd}qhJltgiYu88sLIC_*X$i&$B)4P-+Q!Dyrx;~_g58xMQ^Z5$xT6v3nm%L9tEFaQd zmj9%E$ljCR*G_33O@p_Dt18}66KouTOA?MKz z=7Ul@Xr72$m{MdMHJpc{fTV0;ifQ8Ka};If=*`_nv`f*N>1+q~Q`H0?D3&(r1Fy@y zCHL-Jc|*>&oV#-5xxSUYZN9sF$~;8a-D0~NL51NX-q;blWVIsJ59pP`5G1uCNjJZ|`ZGM)sS z*5>d_2MiiB%6N_31!G3C@{4NKV(U3GzKR+<;Tf1XQ+bMsKg-$Xy$icdQNVi%@(6p8Ey|((Om~q6)@HrM z3ZJ;O$Q3e2U03snc{NQrf`ozLfYd;q9)G##@XM9$hv{ADGnIr_%3vxp7)#IBJ}Wf~ z?!CpXKRSZn*v^UOms#$*K)E2s%qkr2CY?%9j{poAjy3u7-#b zhs_M1soiczUO9e)Z1;nSAXvxCl*dA*GSfVhY(hZXV|LwSOW5YxWSeBObJ-!wn!~5K ztO3^_x!;NzOu>chLlNvoGnfg>ZxXWsF-J6)kDfzj`F7yCFg*lYF<aC*!}rn+5NtH{&1Z zH|TI^+f!IstkO+-JD?m*GR0UU23b=cmpS~%u$E(qd0b*xZx{duD=DO}OdcRNgJa5) z1q=!hBE-Eg>1y04T_DYtWW*AIOWBA^*;$jFeQ58SHE0)Bh-`17Cka_gN-3=taQJRe zXq~_bVFTl=fdwo~czFdo>o#OgZ0+ytw!7JFyN##ty8s-H#^9N4*`m)tL(m*V=YZRD z<#AQ>g9V|V6#h7En1w9vfUT&EV(12_&8mU`?lam#3a*t+V++_-3@gBQwFcbx|Ex7w z1MqjcH5{#ZF2kgaS-aU#HgvZ!tNYJ)qb)a~Uq;G1!Qo6&rS4Kbh79nrY}P*J9PgMm zdyzS<8f$wJxD4nCn8-LHlpo5156j?9^3Lu_6Xg)S$+NmYltY=Z+`%5@ljWbF+#E>t z9M}knS96Yp6?H&y*CoM(aW|iA)W| zFW49SlyXYdQivv_OW|PFAgh&{Q)UIh>x#*uaLp_sD+Wy#95U-iyK->DK`bOkVT@nG z+B0EP7FmAMSbCMQl>N_D%xgSoJjh!3S3N5KN*sUEv#f{G^h$1E0j4PzDd&RfF4%U9 z0H{eyhgoYQ7B4HSnmMavVlxc)x+0nJ zTM#K3QdLq?HAHSJsILYVFH~^u_!U=Nap|0~BY$vJs`l~)-r(d`t_>R2ir?79)53Yv zu39i{+JdX(IWeoVqJRI=*c>VO7S_h2FF_a1#2dVn0Rh1MfG^K}iR&1xrSz{CGuLM@ z0eu&qd5^dbH1m_QzpgfsefMSGbF%Nf|3{)oab54{ufKo&|EA#C*T=tBe(&?-m#gdR ztGCeMv$~qPni4uQ8sWCB{asy6O&y<1$DTa;f_L;?+jD<)eQj+CtEsQAVMpkn#&kNO zjGDSFbS7`bp&Flz*XrtO-o^*E4JWNs+G-rwqqWI~o@SigTwM)?Bzuuz!pVnp+n?*J z>-*ybQbE+h8JFubyl)0YCHr=|RT# z?Pc6B_U?vIJ%-GW$VQLk2l~T5F-sa8o=54-d{FFu-$wX_a$;Y1ML^PDhbP%eNNz<$P;ifahCP50J15_9wD1BnP$t&hF8G zR>xhTe8AmIp&S5G-~)0vbMQaf*vgU*_5zFyAgk^-4!Vz?aSG_nn*zN~sMa?L$)16r z_QF*K-iQE41T<3dBA^ky>O6702!Pb6;vb6bnO5W0)@Sh3%I46!@i*gEw&OzMVHVk8 z+|Md6y!%4-F&&zWV>{S%<9VDL-V4{Vk9Qbe8amKsl_Y2tkj~R91A!c;$K$s9*D#Yp z>yb;d__$kw^%~-{-DN34r&_GCe-p;s@!{~_)WKI#cQgYBLXa2|kWi3V5|R?eA|W1n z5%m;XC*pCUO0s+Tjre(ztuSt&7k`$$+i`OTAKY^YZ^mssxo0H6knj*J{*LTl-=yAW9T(enw^BcP8W|>v(h*ejeS8pEK)#F=ho_ek5?* z$qNwo%YPv$J##R&h+f^OmkYUQZ`DJE&OGS7?oBqEBX<)7tbzi&{~D8yoS7dB^cqh7 zqK65+Ru4OX31X&0!7Ag1i^y$X z#5}C7PAHrpFhL_oj255KY=TLUO#r4lbO+b~taTYseFk=-Ml-N_KuzfPMqb=`LV)A} zGr5tS$Cf^_y=}u9V-xjV<iPYV$I(GHq-cNkMhhxL|94P>ve{X4w~eP!9r ztE$ZIAs(@>$+>Aw{y;6lHKQ>%HQN`&YH)9HTH`mU{a_;`n~%x%MH;KHD080r2b8H{ z&7;phHvX<$C+I#wJmVy7=O^h1K8bo1H!t`^s!9Mt6mqEskPB2r8^X!q_4 zheML$l}MwPc|Mhk@r38&Ik^5L`!oJw-OGmAp+KNel!=^9lmi;q49%3upT{+M`H;6@RI;CaCudUd{`yvFTN| z%ed(J3|s~?j?^glPa(F0Y0%IR5R3L`gHtY!^=G`H-b-%&U=D&?Sj-7WMVQys4&#lU z{<5+ocEOzGqkrDL>yk@%b>I4<=bIkwd0^45AB-M#&4ZUu{>j48Hfz(u8}29{TU)T; zFbm!P01F*j(0cwxSeE;pyX}n|fBMF@mc%)Wnt8iEZ(M?SN=~xSslB<9WX7Hj!2L|#+Z1Li3K{guuH6oIGu}Vc zw}S$!oos=VO?R@Z9qjuKHr>Gn0QbsQ2{`8}8(UywZ8p|qW2H8>%)(|{SgVDNv9MB0 z%EDKh*#a{gXeOAeTxMp=H1<7>O(CP=JY|(4&z6_Vyi`uft+KqDu?ra+K>4rcNGl`` z%=TE`%CX0J1Bau?YB3{`n`xDm&9<^BR@TqT5USOsk464od?IkQ{NrpvK9meEu`7pg0&S%ylYXex<=f+p66ARja(2`Y%3WS}I;&FyQ<~OjYzB zc)fNz#%msH(NC?&W3v%Z0f+;ilgp;&A{T!N;#uU`?&WUY>Sklyly~K7JG0u^l^~;e zxf$k37C;}Ft}^kEiCIi+smkW4>;jdIRapbldMRwae5H&e%aD9iF)81})fF1Msvm1~g zO&%7H44Pa!rlcg?-(erDe;^P0>aX0|y!xEFg{h`XhZYp1Ce>G;H)c3u+)9$khKOEV zGD?iQJJ1%w1(>8L@;_qS$ZHh7$z-Cbl*KF{t3j=hrI-k1uJb7Fp4KOylxN=Gb1o9C z+$qZWG4xpnSdmGJ>k#TJ8qyoFt=pluqVKWkQbsVM3<=q?$Vv?XL3S8}AAOV^Vt+Og zN}Q4^aj7|dO!)|Nfszmn)nmEl^^u5N&=D-{(B+EK`Mf+hhihAl-FaJ)j=1P%XAnyd zOwYq1+B0E{&jew=2yzNM3QUX;lm$iwep5&e^-)es{@%Su@7lC+#j~#)pZ?hY?tOQ?yt(@&SP39&aqeR+?{_orW@G*R?}qs8 zE4LeeJoc`!ljbsqPx%=>PaY@i7R3OLNwS+vV`dc=F_VRBNw|BHbujtjtsOQkrZ&VI z@Z$53*nyHel(Jj@*zw1E@Dk-cqqzBIWRoE~NJvLGi=sj_mbow*ABDR678L?|QZNeN zeDgKf*kmo`5j4IBV>OqS%g^$+v^sHrSa(PqY)f+i+o6!e3T3&S3V|+68CMcaMG{2* zmeI6;?Ke6)Hg%{!G@9nKhoAr9rXOb7w_LfDzo+%_d@+fs%dh~S_I<)=jGoGHP6`olZ54;=4n zcghP{eZbC!8c*3FMT>GLqg=uipw^_LBq9NMjDO z_m&F>_X`0;T(F^{TrRDHiNC*gK4@g2KC@sjGwl3mM&#O?SeU3lsv%?{lmyp8|KI(t zWOm8#WbFa28W*y=eun3Mtqe05se}}M(CE%6gD~74v@%enbd{sTQ)xc8ildpaKqf4Bk}&Cc zvGKvp^4rEN2~x;K_)LFj?R|NghS;#hK-x49s;8a&X?(9le?5 zYEzBG8n&0Qee!Rvs*zWDB*TZKPpx;%uH zqwiHIr58gap`?hI7B(3n9`FXOF{Mp>xT(c-qiMTI=`vxl>C0yZTO$qDOy8CFTU2vY zdEQvUZv2GmK3(2L<)ZFb)lp+N4y!SC{lLu>NWXblG6Q#YIg$(}+>8fr!G=h#Jm<|8 zB$bi3YA$}4f1jUIO2oU60`dbSfkgO~ABC+)rkafJa-V!eeoaPJQ^a*qW;y!y2!fp? zIT*-WpR0#+=kZlxmIyb6=Z5bJ?+c5JY*|eW02GL)7h`i2$mnELM@AF@ai`1;Nl5Sj z-k_c6dQzOp141b|v_fo#AjT^J*5(}m#2KCt@{Byo#y^T5c~kcydDE7Q;S9M0?vd$R zSo;fKj>U?=&uahAGp(POZGDau{D0N*^#MIEfOhAx1kj;#^X|&qmv?5nzq8ff)#m@y z-fy(Fdl3c_`hFs!IX+iD^_HrfbTQ>PzSOWLhG6DEDvvm;_OgihgQkTXfnJPM`pG1u zXU6O5Ev!tt4fe2sdg(`$h3X^a3x&VWPjUV}I|Z}ZVVic?WTQ}q2!_Aq2-en~Hcz>9R>!#c_inq7mm41$A0Luy8V}97 zq5Fvk_i<$-9!FX-VOXP(JQM~!8s*lh zm)w_1F6iDRU-b9`U;X{Q`{XO=5b7>or7w92dM2asgP=@qN}Yyfsdap#_p+$Y8;7bv_GQkY~%BGcH3h~l>uoQ#%s z*-kn{9bU+23TWXQFL)^wjuZuQ5;DXs(r>o+DEycrDpEsPeKEx@Qp#R`U9>i!ygH`e zn#&#IlhqFxh@m?J}Rtlczrbss+w%JVx+Cp=!$$v~GAsY+2E<_A^q_#023RjLO>6oZ}8 zd(g1S44Iy*Dw7?_;-M4eABzW7lypCFZEfmMqg>P1r%TvsU{gAUG;TGiC&;-foz%c) z4nm4O+5^Qyh#e4l2!Fyh-OVHY-zT-BVy~MIAn5>#}VsO*pb`>M#zSb%PKunsPjuy=s4FVU7k$)@LNzk4p&u&)jfnE0FPLEARkz)TY(Z^WZK#!j6v!539;8L#7&N8-MthgCj zK`}DV1#7~t9j=K;i@eR6MqQoF^oRWulV zahwrT&5SQkDEn+a`fNER{U+ioys%x19GPna8v|Vd6_r38h8y$bcc>0fK16xaAA0Hd zkIsT1GPGpq2%ai$64xo&>$*-~SD51zltg*piSoVb2PjX?UiUXV+X>CKa%1I=%AJ*R z=DDZaVftD-O2W46n8GzY(^d9v1*2}*a<-#8z%GFSAou0!Aj{}EX%667AsWjrX#BcQ82uvnQ z*=>oY2pF^r?=S+lriN6pTfmuimH zSZX{HO>;5N(T`&Ms?bOT4c36}h1hfW#z!q>uvZM^%vkP+=gkw( z^JJd~H9kY-e{=@02T->E1s z*6UCB2aVTAp2jnM1NO&0C!Q(h3V58D%XCe^#ci2uXuMpieuQf>^Sw*@ytkhJ?DYC9 zj%+=}IHl{LsuCT#5HQv^aK8Q>h|^KnX;Exa}uGfwsWwY{Y=r*+UPL*XHz2u04KQ#Jcaiz3KR`DS7zQ&&5=5T> z$cjIoweY^7t!(y_Bm^3NV~y`A{aEWZ2nRiPtovVk?x9;J8ISJk`IN>MW-@!*G}T** ztPP;4^_TcOUb^^UNu`Yroz1lEAiX0}ZS8K0jXsNa`n=0Ajy~#M$GEl1T6LqcQQfKR zRADYDc!Z@Ogs}9xow>ORHl+n>UK)yZcdc77DkHH+u&NZ)EqmO{HY z{2$DQOvsYkZMF8@h<;YYJ@@jXLbfEGeAAvb>`&zs^Umf<`Szoq0VUjB92av?x8@e4 zz!`ziqn++{qz*lglcsw?HhO%Hy8Qzp$kNf_0 z#(lS^>Ao8A+~7mZth;UW;Od|rJSg@-#Q^xCGZ;ik**Z{JD2>{Hvi7J_Umb3hYUPMD zOs|Flq!$#WutPndly2s77rAeAZ+AcL{=NGXw<+nK;a=l@0AYUU{frA1qXq$DS77@i ztY=g%AE_-yxhuq&Sq>S}F4gZw#mYnnyHjPTYNr`rloQ{wd;F;+ZDd!Xg4MKB=!WF( zsibOV>xsQFr=Yx*z2(VW(qKIo_qX(0)Q=DEM{jbnU*<&VM}%;A@b9jE5QWQ}{!HUh zDAadRY;U<|*7Nps7uB;9`}T->?MBY=aw^IS*O$zb{i^$ceV^*=S7tW%QBzd&KiBj2 zbhoHy9^L)z6}5Tj|58mARZ|R*-fCw0TxvDils5S>w7(=X2c9#;hs&ZFxd{bLqVWPE}x&@t*kwa=`Iq^(6fW%Lhaxms%nYnyLQADP- zTJQi&W$>M^KYJMx>D#4&xQDt@FF|Z*8Spqe5&$_1E%UK57fV=J876>^wXhm&M0Z?Qb4$(LHP6&2HRWaf#Q5{1 zFhaN_{0at0m4sm z3FKzZ&v$~&olL)f4Li<8luXIJ`{QG-egyJ#Zvmh8RUC<_H@ee*9%D zIKtKSCPMkJ^iW(ecpGf80AG=jihdY8tF*(69hnyq;@4OgK<*v5XQXHeZOu@t0aF$XE9TsF}_cE%tVS`U(CzgmejvNUHZF=a0P z+LUQOh^?mF2ScwypgRchjy}Lpory6L(}$o5!r&vUK{19@$nN82U`{JJIp8S@$fj%`pC1E4;K5fFS zf3aV%=#LLxasj5*jW>VBJX=;T*?+;rH63?MFCCbjS(|%hk+b;e?SikD3YnmSWDytE z7v_o-MR=C8o*|8Z$4@repnnFjE|g`~S2mCDl8SU6?rO=QKkO@vzas1|EO`WHp%q%J z51D&!>$~?>b}c^uoyYqfxAv~RhWe#fvkpK(T*wTD_6mIeG33Y%C!$SJ&cWNI3e$KK zm&-K9n?kfjfHyCNp%>P@(O4MP1Cy2x<@iG(#GGI&K1ol73;p46VOeZItT`r2v8F;c zCWL+BLQEQ=v8Ei>1dN`9447Ju$>ac%N2&-jIlLcEPUM2o!ww@BZNi02T%lMCSvVR~ zg=Cp0Ss!5&KDgb@Reorwyjqn^dF#d`$t$fsUmbYfC z@k?V?&3GPIc>Xz88*j}=Uaik_doJPI)rK$qBZC9ljFYRb9Atbxr?qx)>D1-SJ9}n* z>v^o-O5^g`v^#D_hUK8Sx6~r+E!G|IU`~b%3Nh^wOj>NHk$$JMwA7vzLZKIkKF{=( zDYx&wW$9mP*TM(m0jnt~LMjMIGsW)W>SFmJbOHy(PO2Bv{`-D?Hh%qxv zjJGSKg-WNC&;!Mes1soVg~JPH6s{>$5FH7-+C%BTb`};`oR9~|qSlT&KxG-4K8YBE z+hHpRBBsRE41f)!(NW;yZd-tsfqi9o4vZB68WnMk!~reg{=f~84OByfjYF}lf+7hl zg)^N%@FJHVVw#>8@}@0_XG&S7hE|67U2uKyaUlks65RyDSF-ZB`&1@hC3UjMzAoWQ ztjA=WqkZ*Sw4LhJpW?rP)=I+QyU48Vfqu%J!5R0FOWY~^Vy zYz|`IXl%wBn&gIQw*~1V+^RjJ83CWndp3pw6WXM?Jr@QPZAi& z<_(nyj7{i7SgdFZjX*2_m1x$5Kb|(UI3G&UP1i(91~xY{=lXH_sMILZi6&l?C@QHL zDCV&7Be@%OE|==1r}R7(3_RQjAE}(`Kej(N_0Q>_=r6B?ga@c#Cw3sMLzc3Go$gR` zWev5Y6lXQ{I*#?RJZpYhLPkTgHEj|};sesiR6uHom5QzC?Z`-GuBp~@i<+xxk zh0XPqR(F2zF)#u*{AChEMW__JB)0(@b%e){?UsQd3l#_3s%}ILrTM?lNX)$c&KOVHDx6=&CLgfjC**+ z5{I*&)i;^Wv*s8uZsC70B6d|kqnPDm%x@rBC3XY3=vk(@#s!Zs>(AFHoG!UGZKGBSim+kUyF+5R2#+3u!i+cLU9eXg0--sT`2iY&sT^?1mCn$;Dlh zS5BXD$Nrk}tl_Q;FIqecQ4Rj@RShYPBwNp`I(JCb;3eO`@%STiTKB#A!#OKblLkbR zR~qkM^5Y8!T?my{@)?s&7fA}bM1}rP0kT)pDbWwh6*q8r$WyR%-fVlh^e&B%d9ulj* z@X`L?eLA{f)bPQVE}HPm)B(?chEzT5px||)F7giWI$;a5ULh~$Tj00zL2Cm`s?sfi z6ewC&W^oaNL)KC-*{lw2m_oP@>mv*u%hNm6PN`atVNHG@_IQl{KK6F(lb9TdRmWz= zcEk`k!Wr@!78a7;lu^esi?l2iLGL>t*MQwsOZ9BEo?q%=axBDHB+j_GqO5}3Tmj~g zfiXg?$3fj+)j#DD`_;;6+5k{4FRvi`;%pJXGOI&QEi@Bg>NqZ!tre7^&PNp}#+Mo6B zZ}XKFk1gh zI9P-yq*%Wc!%&6R)q@ReXm24n1R>`m?2b@m#}B$8MpDWfsA9joa^0VM%=XG!t0k`zEQ8N9I(1))MotrdfP3( zZcBEyT{CFtyjc&7m~S09eO~{{euMizaNeRH(m##4FkWqev5)LNw6@r>k1tl0UMpLt zVr1=U&a6ERnWK9}oQxIi>!!2Q=CVE`8OD53x()m4z6aTEcvjB%>sdBL$P30_B@g_P zXB)`C<6tS0*ijQq8%<{^K6+V>czdvw#&3!_k|53$}MZ?3Z5T zYj-|^uVjQMSawf>`@Gub_ZYrV`9s>?9u(djjxVqYmBO8I@z_KLjX;|i@*z=bx+3#X@d*kGsVrFff zICEWNb9oJqm5e|r%#>@Cu}b6EF~de^Xi(#@DN#)iHTe!8MtLl(H#xts#lo#uj%=*y zryUwq-mh}fHH9^?vcXr>S5BRh3WmQ(r5gNE>gO`_^S@11K%YgC@Ah@QF=h|srNVTu zQfDhV4sEe{u~jiSW{#IN$IJzh=C<&>@T#yJrZ2+uMJ{!gDg{7en?05aI2-{u(O@37 z>OPC^%1f=aykz0qEe}voQ&DsTTmVopBBF=mIL4$BX5Ce6g6Y(4f0Pi9=;rP?pKBAt0)lJyY z5$!-?;I~lS2T*DNFZRF6_@QT0cPQ-c_tVQ%74F|WSr9T>K6q(eW$ToN9HVpm_;GKK zA3t8m!eY*7w+LGPNVlD)UzDgLn!B$^cllC9(i!xk!JVO35^JU)nXLt2@**9feu5x- zh#-OpIfY1!~L5wtvx+#MvI1? z<_(32mmR>cn4E5D|LO*;Ojg}dQdI5=C&Szp4o4frtcMi%kLvPC4@bn? zl{g){xSX|=KaL%oU=y?*CLiCzV$mqqtPO7&7+T2&g3o~9qx zb`Wp|QnZROW#R5*v?a=;eUxk`QZC8T5^uE7d~?ndT`})z8G%(}30}1LP`2E@iT~Zh ztPxBBX_`rk%F&?*_IUfJx=&S4G&|8XaaW&p!=HcfjcD3r1{A=}p_F&j@a(f>X~X=45d(uhf^ZT+?h zDRkR(m+9B0naF$e3zFN^8tn?qQR`l%XZrM_BFJV~AIpt4%T&z|Y~VPGZMEjhABuOg zdarn22EF;OxOcGn2JRi8m#fKv?23WN4;feB9f^D^yA=<`7IKf_>-(YS2}h2>9z z!V5lg^aW%sr>aq45u+p=BCR||w8}3tj$b#eX{i4vk$Fouu4fi4|J(u9!&Xnb6mfu} zzR&Q>v^2^N>rTmmp#HZVjEV)mGKq3U!2;tCHLo}pZ=mhdQjPpFDsH*)0n1xQrEBTc z7k=;jP3NO%6pMaD)FOKuy9j4|vYOfkSi@qyEa^x(lObKv)fPvKvn6DvQ!WljgEqsv z-7B{sqEzH1=?5J^^4b(Nu1mTF251R!|7=YGYmrzI=>T|30ZSIN6mW4smtgIuL}%pG z0qy`FQIF+R4^wNl9wzG*l0zFWt<-%L=vdX|~hcypB8QLs2wt_Yo<5_<- z>SSz{n)OCjWKY`pBBY_EBr@4nXCH?|e$?j7q3GX?bf-6!1O`;9DECB2u|oASvM6Zvys`oJWc=AzNOR#o9j`~2(`kvNW;oY4 zZ*cE#C8 z%Vp{7LCZq;28mjbh#}uQ>CXwHG2MCc^nEAKx~~iO#d_~^;Xd8Tu!SkMtP#}hy*cZ% zzWogU_j2*f=x%7g5Mj)^4Y^X!dTQpeeg5tfXWjdEdT!sn4!Tz-*toaXT`uZekFoZ3 zKj>2IpKb>x2+-q^5@d*-WU5}NV&Ax~q()1V>Ac%PHxY)50vBs`7qh#2?%+xX|VI~O;GXU&hZ;eX0|{hqJ8 z6#4CQF39MwSzqEZJ@Q|?h-BgVhDUIpY@Bxeg?n9pVGz1GOwA`tX~y+OI)BFDCl;^& z?&VYdi)ZgY`SWOQit(kKz+B4s_?NODAp$ZV(QV1{7RaX zUZtielZvAVQLnJ&q{?C}mT~U*WYuKJ32S5_)N|~HnxD?I_|uf!Z37Zl=lSfBj7hyj zaxq!Yx3`w8DB*XOykByvL|$34p=4i)46|!FEU#ixEDg7M@~G6PM~E#}wNx#tT2pmn74|e3E*qA568$7m`4HsKAaqhvDXk$&v|hk zFtiNIhNRn(7)z1^NNb&^c<75_r;*3v5_?5@Px`kcBV-+XN3#dhWr5}ZM?&CmS|jgT z9H>fzNBcI~*rmU@`Q!9odaT=8Cfr&xe$9@K9f%(O`>zk*GwsL5zYf6hS7jV{?1o=Yo;;`Z zajW(5F{vNze<`!>Xtyfofv#1Vc_u$0KL)z`c``mcz9_yXuJoP6Y2ozBJQCLt-$RFF zyhPH3be>s01zl;*%RA&hpv^VXv-+^R5{!?@Wxw&g;)9W%QU^#;4p>A!BlJia61ZI^ zUoHPczD+(Lzaak$rm8ZeN8@s!G^$8s5$zm{J#g@FNw-Qy!ro-(lHEd_-v!Pe`#Z*b zK*qJ9@^lV1E`eT!`Bj%pBS0XK3TbJqpQ>)HU0KJ<>&Dd)A6$ZU0LmvMlEcE}NiI#$ zp8zO5u#J-WQ`q*;NG3glJmzE=r(G!saDs$+x}lPVLv{|GTF#s@{7qk0#6u! zyKL^`YxeK7-tpqY#;L1rSk?a2rp-^x-L>>*7sZX@Rr8m&U9j*RmN;+ilm*wWdu7h4 z&gH-PUdP7sF8krSB{R2NwR9x2oj0$(EY*-GncF+}<&*Ngz?&@7!)25zL8=O2f22{^ zPicdV3Fn}jEbwlud=R~x92<~kFZT@Ch;Ek+S1@gLK`0NyQjM&WD`|-k^Ba?!Hco*- z4lBf)Vub+4fYu0%QbK}Yqf>HoWSb3uKxrnvoUkGCNdp`CoP>8{>$LgD_I`4^b;sM+ z-*g0f=$yBQ)`yz??T6l({K}G_&f0uy`>4J-h+xQ(Vh;XD4>boE_AU`_OGzA?os8#M z2$ZqMlPk$Gxd`=A&9KWs*;$w#<7aWCqw`DAbenUYa}{7O70&ShTwy`LrSd+lInK(( zq@%@e2qqh5m>bhfbhDUrWTd2?ruJok5xpSFGfWE*Q$x*iCI7eI2_oh9iOe?LMt3GSR#d(3)*MqzFe$ypp5El88d+E z8>knGxv#r*kM3;&4=@o2pc7>gwtE-#@?ieMwN{crAZGE0*)sV^bvw$;U?i8O-vIWo zppyd)53?O*cjM_lbw(qEh!nMfK$-OmT`cO7!9p$-7(;kMIXzfZNYtRODpZes9vBNm z9Ww0#X?n{#vkuDy{;_0_EGmKf_Ly-R$I|dYXIxYyEB`}`@4f%bx-1iQY0&e4cKr6r zz^M;>KzXJ*z4bwX!Y{#r34z7(upapa_Cxw6*rO@~_5j9X#J6KS2;YHO+XwN;a~NL( zc*tkMJ0e+lM`V12SRk$9r{Nu>l3`+;iS76%umjTrH_|WrZa~L(gE{^SjstR0dAd%1 zN<-)}*^x5zWAijW^pat_;n%SdsKo>};1P};KPjA&P&ftTO*nZv73dP#W&$0ZQ8~|s zN3(ek+!C!BzvYFFtdB=Ikk!NREckc^;n{>&=;B`@rG+1^lQp`p3^|%cS=p#OMvx4s zy%J2I(k{(QaEyIX`v_zzwZkbZb$X3Z8XQQ|{n5g7Gtw2{B~>5-t_+eUxovf;cO{m; zXmd0xnkNNqi9Ma73X>=RJ1XfS#Cvf_z?0TUyM<>_1bKE&(w97 z3fy(*K?ZM+8PUWn-A%TD%w!eHAJ5=ilzx&|%9mOnM(PX(0u*gP$-!SfiWZB#(lXWok$3|+H?S=l zxzJ@#cJ-B=D_6vRs9$z{&l?@J1CHO`IihCc_J1^v|M|6Bq;z?6&-6tXvujv9dhfh} zWY7Z8HRHFF%A^4dq-%*_SqmG%vG?D*Sk z=Sb7#kt)jk&3^6&5d=ZUi(G_HT>9e7!9`02;vFJ88& zWz~X9nl8Ng-(%YvTbC{|K0o=IaIW68W_kUzMVEj7M{UMWXMld>XBU1?&<~z=Hb%eX zJ7@?kUO-)es7O?@rX)*LH&ycl-m6$sC6mUxFcYxH1WnKJ4#tZekOa>rd1XbCfU*4{ z+}Xa3{JQ&Y=R?kCobp(h49K8D9kG|BL&mBIg9#T79O#3qtL>gM`v$uheY0n3zt%Ig ztfKbYdPZ2_Uj;TfGegl~XY|r=07kOYbY{Tm9DmKd(K7!SYvaCv2nO+aB1BUwd5|p;skC$pkOes!9N4lOhr}_KavT z6Xy}KgvKM#o*_!WLJB(oz)9HU0%A(LB%=Ns!1pi&u_hEj|9eW?3AqBkK`L8%9gIaolc}kQ?^`kQ1 zLYcZ=$HJ~KWH6ZhPFGMjkMfw4#g&Pca7&TGD#9%!vEd+vGu0J^Q|Y4Zc4I5(>OZ5t zZ^7m~P9GXkB5Fj7n9zKSD8DEYi9{nYd#;W=8N4VrnalOuMW{JT7Pb`9(^?`epnVb> z&Ui8{0JVv}4aQc`m!8pAe>`KfJ|G!OCR$=G2_;NrvLbRqo=xsZNhChftcUdyJ-#Rm z!zi^RjN(C`2JDqY>nPT48XJDB89CCc`US{fLV#5SH%NOdhb*sH-a|&>1onaA1ZS1w z$hEgW@Lb?8fqw+>Ju-a*#2QD|6Kw6tEQ&k8)f@;rGG0;~@7h?h>^}mz0Of-t*Ref0 zhjL!Yc`rxdIn5Y%++=aXBcud?xNX+BB92UR*nR0No-!9W7Xo|<4MCt@aaM8iGI+U}95+7$#$%lBjx`12udJ+Ign&iLsjAi!Q9`5O8J~n9g z#EvyxX4-GPH_Bs-TqYP?|l{@w1EUNUwYFB|_d-YMC$|6OFo!n!5K6lhi;{X`$w z;d ztJ|;`_nhBf4hf?_VoQ;WP*R_OPtO9MRxbRk#ZrG@E(ahVXR|a>nv7I)Go^X_DLuW? zwZXN`b(d?OOTDU;702u1qvGeszZX~KvY`WpHVzihoxq z%PZDb++6XSiaix-UB#&XkGwYljHL%-rWZ=Q-y*XFuf^mS0(p7KB%3UdgjY`UlK(&CHsKCM7<7 zM&=AY6V)>Q8h^wu`-Ab32Dn@*tMnW>s0TBH&<7OsT1sEwT9CDXdxyDZXU*m=U&J@d zC-0(yfUvK@H`Ay1rp49wn>;Z*zF?YbTGlik8kaw@p>}5Ng4*WV&9!&eYPG(ZvuFB@ zn-=&u{3@+Jwh$HWzQh4c9LGVETF1e2Uc}-sfIhR3OP->l#S80J*Kt=}O4 zXWXQqYa*LCY0#LduBlm5F&eIZQgGO?eUrTVran7$(zr!K;9nm$4A&uax?vr|5Zd2Y z=iN8|+4*(&HxL=#TjbqW`0S*q_*uO5l>Juk>88egiQavg&(_VyznyB_SM1$)iS@&Y z#-^8=_65BAF0_7zt_VL3+Oh1LEuOs3=cR|AXxvxp-FLb59tm&_+c(j>ZyFPjNn$wy z>+~=huGfSQ;p4M?1js3rg?RTZuz#XQiBDH~_XU}N)%kSCu+xAS@a*$@_sw|LH=90< z{HA@4-hDIekE2=VOT+e!^zOUT{&x{dXqtn8PJ(}M!4VrZVSXG<_f^prgxZc!LvUZ1 zG&j7a-xZ>T5`J5Vf2%}BT?Q*cw=Vj1AvG2uWsjUr;-mN-8pc;4p&2!}=~b1P);H$0 zhE2Mpc^|M*oiCWrvr)Wm-aPXkKc6vpY_@;SinBkY-zh&ZpZ{Q9=Qi`tpZw<+7dL-( z@Pm2QFY%!}_uO;OgAd+w&z{c2dGq8vdOJO6-UsrrhcBLgcixjrzkh${E3ch6@tX33 z59ZCAclHNtl=;zL2TbmBGy6TunfGNK){cLNzjW-<&_KQuaNsw5?Ne=SPd(GthDP$E z&i-H?mis`?zVc^pE%}Yq#S+Z_VZx6p{z!J^BuYC~S zUrS#-d_wNp0oUZ-7`*k`t8c}umCh&mMf@W6@G_o%^SB|o)mO}DtiRx@>4WC3z5eR6 zccKx~KhRx+!9JIC(y(VT?^4B8HW#&5bd@Km3a?7Z_YaYkTOr+dbZj6d%sxgEOM=OckO^g z9bptmyYS4PxS#_YsTm=c{Bkqj%a8C^xKcxRBm%!}M^Kuexu55*U{z;3lxQq{=5zpd z8LgOBR1Iqrshe!~p0cuOd(1z#L~_Fq)1FX+$#c4nNr}?vLrQr<3e`89Mj2&FDDg!& zYCRvRNPrKieYYg;O5^}T(&K-I&JFP)IWY)VELa*EbwE@%QyNPqkv+0XtA#aF^zo1{ z&36XYhC?^}u>R4XDJ!*Ukz|%GXRdAvqlQFdSZqSQ$xa( zo^^#4lp|nN6!}B{P}yM>-9t0gu)08P#_%4E5H5x6esR0zaQo=+fzFqg?ivR%nQy4R~E)%`m(DeX6;|9kB4eI4KLHLwf&FS{f z6LBsaS?wMCUiA&!%n8!v&&Hzz#D_*sTvjLngMJuVuqT{URaq~U{kl6|R@x~Y)W|`L z2+2i0Uz)w4u0l;HuE39zK1)&v%wW^0#`XXPTnj1>;)RGLbOe+(5+7)f$k6{3-5&Y9 zi?*3Ju$|W}`uuNl^S$?8$9`=NV13Qs1E+=j4UVCpxP8|cle4At42h>FpXA(?eKMo8 z#uLGS8CmiqoOG2D{(KnpB(-OxXJ)2*lHSyTOHK&gi=>;lH=B`^xC-&zoV__8=X{o9 z!wAEcl8nJ_?Uoe0$A->SKM?W0fLZhlpI zU&;?2+B0bIpyht{H}eMNpl@4q^BwOr-o7m@oo%>*Sd2+afa5E$7Y(zP(m@`qoy%#M z+ktkq@=3K6*|OB)I4LSWC+AgI+oAF62j?y4rV{CkKNTnfh zu7a!rG}Dzl1t-&tBsJ}1MMcR;wJiH&QfbDUDSh9JkM~F^iYxEU1)Nw_=KbDutwJS4 z+1|2`%RVc!z#>-xTm#`YJmc1P{M&Pggn59Jh?6dpO=PjF2@a`HMWOv^gzy<0`+|L43 z=CeN`GlULx=f2NdO7Ej?DH3(5$$^9#v|Y4Uk$ZfS`t^YFGL>U8&BUhOkCz!GXmZ`G zvDGRK3|bA72feS=ER`hEE>%Ty;MEFO(4W7}$V68O-A&E3`4$O1_!^`Iz(3|9P>7@P zG>LGc+FBY;L%IhP51(F?T7?OpVZP(drlvPL+Sng=uZt+ho_K;~A3Fx0XS{NZ@33K+ zZHxpT$HL-ryUv9LrDaJWx855LzYbu!ZmFnn0Uh&fkMf(wJv&?h20tLd(^ z)o{J}F$tXOF1R)CCLb(;EX_(=n8vqwS=ig)T>ul&n`U9|RG_1=9nLq5!m$wu-5_wP zspABBfZC}TLSPf33i=tOt2LG^)xs_>88G_r%ByA@Lxa~?IM!;j*Di<;TwXgM+x$6U z8fUHm&kt!I!8e#CU1uaTXR+0ptT~;nPGxa)wxdz5hcW?gC|Qe7a>;3_uFR~=)tOr| zcV()Xu8h?v^hox@I-)_z3t=^-xZJZc7H04*DJ-1Qkg^~J8RHp2x>`X9DDG&-Rysfn zr%!bJrd>?_vi2Y}N+cc@38fO@O=lMmt(ZCZa9*8zgZ+KEy_b)!zHa&q`rG*{u@&rP zfbt^0Ub_K0O%kSYR3#Mv>?DFc3G6Fr>)o%Q;iw#+n5e~_u;7);Pzu2%{e&hQqU5ZH zBoiJ_0`yFu-&79k;}w_=An*#MSKJ15j41c|nC_H?pkDPAt3%~65HSAqgl9TQ-4BgH zQIO(|_$Ww;@$vtwAcX@A;piq!@TU0CsYu)kb+N-C{-|2-oG!SfBlh3+>H8 zp}QbWl{iw;1R>-h)g>-2Bj-fKJIlM!E0=j|Q4E=RBEz2>u{`Mx<^q8Zx}%~9^qy+! z(@nB;vBpv>!Z;3E!*2~3b;P1r_H+z#wO6v%UKJmhTRR}@X$!>`eifXzMZ3Au{G(DF z$n^r?H%hLU6Pc2=KIauzI!jLmWxCMI$d8h{tlSfpZ7P>xx&cqgK9S|mkK~JRfY<~n z=H64z22P*o6Q$L2$utIh-kVlu$8I7@u;w44n_$vgS|kfQ>22*0uf3H3kjm}3bGs&i|M6%xHM-i>8FGm2QES4GqK zLx6>3!S^kEUet}x7vqy&bZwDoDru|ys;oj5WEv?Yq0dpdzA%G5meHE=#|(L920On% zu%tnAisHzFs5oeB>S&_&8coAcNot9NbJ0vPEnLMPT6Ss0@xF#@L(?TSPZb$1Ar1bz zOAn479}bTiR~84yobG9kG+sA_#UKe0mwJWNJ$S-mZ>ou$q7ji38He@y-;Qg z<<(+ef5g7@cy>1uu)d|3Xl#O@Xlm~WRGw-Vn$GzI#iPy5k9yXo-+gB`2?}lBgxPb( zj~lmc2WrIuYXGpWwP9_tM+H$Dn3#Kn2RbtST0NCW+rBIKWf8`kL#T!QWN-3UwL(j$5C5*b@}U*eW)B$4fx6yF3N6`;4`_#>&%yVP}?i1eTv! zZu1JnCqi&VREq}ZO=fg^{MN%`ewfqQYYqt|+jLgP=XK{Rn8)Ee5Lo>rDM_Fq+PU^#T0_pl!+5yiMQkZ#(u zvL9tJ&$tYiD+~RaN#f3OX>o|=yUt;=YKJBbY(EMa-auIumWDKCu&J z?xf;&R-t);@KqN=enA-{C&ikD^XJWL-*Erj7up4{Lq$UUj#W>#CANO&zpb9^2sb=& z2)snAcF47173~m|-K9EI`}BXXrp)#Kv6`|Yymv*}|9u5zJ?qJK#?s?|dp#NOncuUT zEL!VGF24Vx#bgY&ip1uzc=$w?JttvgI+9FI9z>A}LjpF0c!7%r$wlc-4Y`oS=z;wp zm*)%$$xO|2=Y%|TD<`|NLLQ_y#z*i4{oz>BG1M%oxXjSmRz>~rOC5p0O92!SgYS^* z37->wNlv@!D$5BXrW1(NeKzlGOvAz!yclSC`87V>;1u&ifDg;gUwjM|Kcp zGLlLthtq~ai*R|-GpMN&SF9*Lg7hRyWoZVU=VkNoN+)0OQCi<{%!Q-8FkOEw+gg#vFP}fIV&FWJ$Qkjju=K0c% zhF7GmNItZbp;E8WMQ%TtrXBvSMz-6orp?XM=C0%cagnI4qMS)1bL_;djyFJ$g=f)O%`g@bH`_wt-kHH)n&*+ z4b^VB`I>8P-dq!!X1;Un@apQ}^X6SOBYE%kZO=TjZTsHjNlP{ioiu6a2BIr2-GO|@ zgP4<4CDpMEqXEtuhv*jYu9fN;2r3fmUpNutrotN zW2{gbf_7C&zMOE*f}G7cN)Fu9fwE&P-|AKXcMxx7`N%*X#L!K+N>=gH{(;_p&*2?j z^m9u)36w~W9M23RZf3%QgysY}GJ+*M$NEbn zK=Ro}+^oRD!0LdEoT5N0Lyslnk`aqXTsK1Yk61lo%ZNXYP>zfcbcS4SFu(YM7(OM{ zo#_;;S9c~8_3aP~ox-Klc;?e+kHJ7ABl?3&M0lc;g-LV)*~)gZw`l1?o&D)OVmcv> z%&;@@MC$j!hN}m@S$5;_;p0F2)3yZ*Z*xT!E{sGL4lF1b_{4KduW&!NWz6eo7ZjN} zB~?`=_$&WcL0}C##!j!@So%Up|J^RrtR>Q&r#{aZ!ymE{U|F3)R1?^aC zYGFvEcxmoYG(bezrPq?l30M}UM`@@TQ6|q%v92m0aM=*V$x{5Q0D!q(1udi=q)t@= zkOc2P=vX?)_X9!jX)W|50w+N5RATO<90Stp*G}8yz;ydN<}U~=Nw(p-0`aE|cvzl1 zRH}p&;ng*=0Z}G_RJlr%qSC0fVfZb2t5pDXNY#^@##oaG)=lQ3rfIIxBm z+ZNUu(r2bGNN-M8YT(Ftj-_Hx$t)FPQT=f>aomUb)(sLS)XP$i*jnbR(OvZwyAqr7 z4nx3^1RQ0JeVSQI!k?rZZL-nYq#z=S^!kJ&5gjXH_B?K=GI4Nt(v<4Om{VKj>^?PI zKPh}s>8M-im-h=ibe|7p96oXY>267MUFKu^2?7TR;RNnas!8JUIHia_OJAtVI%md3nN+1n$Cl8GWrFSu@5Zq8CN-s|^UPF@_0#Ea6oTy#eV|tW=`L z%i>s52m#_;@s%PzknRow;0~@tRcZJBG4YEge8!&i;NodBF6cgNSHtY0NpD#P&P)lk zKTX33bIE@gPN$?0XUA9-G>NtYxg{Y+^yMS^qN^4i!Gs$T0XuWrv}vGbs-NbaLzQD) zJ3z}BQa|ZIOb1KLN+Y{U@ui2;_og37|2X}#bkt1|Tc!66u>u4$(ZD(9Fihx_kPFRx za$tcb8gK?BYN;>d3a&zb<2<}I)fI;v(d5HIj3%SXA9bs7K8&8EAfuvEe=~v-%{kHz z6A1xf0?t#7=)xgzMNQ0LOjlBw3dKVkS(8lOE?;$JI4XtGAbP@TjMQ1`{_NdIc+Q}~ zqY!GYDV%0Mw`69vI6PRsYZIFY*yLAveji<%664$ zWn}~N!{L;w=b0Byjuh})KAwVgsj_n*JtZg1X$U0+#MI6FZV|v%{JaLWdK^d;Eo9KP z?%(0A7a6sfGfVx8vb<<>4uT^^1C1s!YoQtjsd?tV6ARiI)wo*84GzwujxnOAgysl+ z`)8fd?PE5Rnw#<$P4xE*jI2iUo$v^Zbj>fXDDFRU+^8Y_N@_=r3k<3&FmEU>F44lF zsY|wIPoJ{p>Z{lEb9>4QO8YOFe({x6Rr6*|tG;&Zv}$u-3I5*I(FuoMyHsa=hft^3FZ4ffSe3bU+qCW5 zr)^Wm(bsL@fdN?SEo~+8=JKQ)4#gRuUaOWqEd+^}bJ(xcAk+j=nRCDoei9?o(bZb2 zfYg^zep@9vo&yp@qkek;pN86(3imp>%P2O%rM@_|BR-NlQbNX2mMrN|$b|xouH`rn zXz4;5CNgJfiA=Zi+bLd&Vk$X?zRkDBypU5BiBt`q*xGo(JAI0a`}8R)(pCmX56OyD zRgRrncgK+2!UA(cQ6KByfKEU#yX&kv9s14ysg`9K3I0JfgSbCX6Nm(4FL8G=S{#uR zl1rjFJ|?D%ox5w0t4>;r;mP;*OT~Dyf+K#Oa>Zv2Boa7PsOLQsQ#Wl zl=VDv7lxn}bB5&a`kVMSzw>X%ckXW_4_!EP%g|jzWk0_0=Alq{kQhbbRVX}x0D3M% zx51pyPtOo5;J0Teov|{AUj#5O2ckw4KH(y2Y%Hm=v>7yg6+_#ir;v=Wu`g7JpOK3s z()>`0=u{n$uEXz|d*iA@bwi#oCb%MtNOPI>gV1%X{Mc{zEPiau6=r|)RLS7Mq`6$n zM{V43{S^rpOc}kOw4sF&Hh0O;z@opud8qTqW%7)(hp$*OU8qA)iNx7`^#SPfBgiGp zw~|&GZq-Ok4Ivp6!sWMz6VaI}g<9uhIAt=5T-|)H`v}e~kq!xrBBismBfj`BDhB2F zV?cZk$y==f6T(otnQeG*S6e|SE6)Y^_*7^^NKvSSG9IMsDZn(*{8+@sa6zL4BUaHf zKguybIdS8*MGcXKf%S)y&1zEUuvabI`tquow8sku-Mi8JJi0C3nIrf+2mGBW%|uBl zQaaG%E{nQ-AtB)aHQb^dNFcL#DBM0R42XYX?MHHBA4%AUU#U_geL>ERZO|nYMv2@MIBJ(q-mg1nG=Y0tnH)|V^^FLTRc@*V! zxC8+h)bX^CU>Yx7iS*MeaqnWg0CoC#QjAzMZ72z*J18~ z`1njTGs-z)U5mM8$8lX`Vq0llzdeMf<$9oIq!|fe)KbhWkV^|#K^n+BZNHRO2^n%Y zk&Ki?6oe)lZp;4(qn!3%E%uL_61614q^hhWIbS8N(jfh+>CA}$mD1n>AR!}kdyp>4 z^i2C;NzhX%W09@nS5^9Yh@Q<44S29@{M3xX>GhXbw`l$275(~88MA3=<^8@1yvn&~ zH{6{!W$57INyDsLc+s!{moA*MKEK{v*?r+MlWS|x&2cXDm+~V}q!{!UehgKMu?kF0 zi~@roK8f;bXfRWzXlp(u{pAzwvaTI?24x8U=%|#8GfK=U4!I3)afsz*_6enuOisz5 z`7*yffPazcf=*{S`%}_LxE~0?SKi7Jjd)*X7){D&W-dTrneZF$_rB`=rB`0q< zw9Cvr*z*9X?T}mmy|0+|=0&R)d_RcqiO{O@4)jSZF2fFuR9)y?l;fqwsosKq1BB9Y zNGpc_shAK>(F70fFQK#aBSqz4qLJ&1QBe;1e1WW#W7uXcVHiONUv6{m=G?o{$rrXK zQ6tok2uFUo<=6?Fq09kmz&*4My5yjOK<6OM1B&qPA&SYmiPbs~LvXZ?bfQmTXhwAo zs2t|4nHP--6s3*~*9{qg!Op?zk`WV)F_~HQ#)O1vS^C_;gU8IwE*e@NiPUGPm=!#{ z%D6BbzR)O1x#9wJ^nqTnPMc@01@7XcRR=c1Baah2jF=B*&WN@-?%cAF^73XFZ}^8J z_y;`%Hyr5Wz-9!Q>^E!Z`yx(0fE%Bs7~U=Dw{B46$nUA~Ad?9wXb&_A9VE~MI_QZ0 z&|4L`BytJ<*M34@FCls!pgwB81^7r8S#QMolEN6#(?cV99`vigQ-E1982lawMWhBv zW^n&Wbd)rErMD&mCm|ZdHsBp-oS%$jy9{w)dW{~@;a3v}2AZ{05jdcrI@${NzoLrh za|e#8%^F)-6`4AGXKil3d~<_PQJ{_hg2P>Dd|}teu$}9T#0Hc&sPX|zxWit7eoQ%3 zlrn)SZ}>6EhxA0QZgI0P-D*}6D7i8z8g-_<67m3E!$K%`g?wSye7=V5|F0!Wehvwe zt*z-=2t3ND2X@=SMd~449G(SX3c(^nufZ0#~h!skh@JQ^cc#>L2$w^69zkJ`H}^qEG!B^slyGLMgxIBqGTH##P@F@Z<1o=jg%W84VnuL`W!Lyb%I9zPJ$+r z`rxzITq4ev&FN^^O&dA^QuSldBVsB@Zb^;qrioH z6q#~ge@0CPCl@#OL-_MDxmM=TO1(xJom7J^H|R6<1$wi-Sy!nWWAY(?LJeAHw6b&~ z*(Zl(-XPDE7s$;h2A5NgV&|!X3!6I0dKEh-=N8p3H#Sw_SHK1BADwWb7|2CaaFm9r zj^cCoWBn>B`UR@$FPLqEloGFT<|QJ9Nz5dKBdfg7P{$T6nCi~TAq`xRDInO{~FS}ze7`HeYKD%O3t zFLa5f`f*v;X+pZnwP0IE8!8U4Dg2Lo4wM_v-(s}r(S2uYbO7<;@rd@l+dgl0y^XaC>^&$FGHp@WhL+!0 zm!Wd=WV`bzsgYp!6-SQizRxQ3t+(NGv<|_nO5Q^%+9)$6*ntnUi_KPH{(SKX^KW>2 za|4#K*CDtxsUOw>SgNcrRl+L*E$iiMq|;^vPj;XuzYV4@3_y>6C_vS>Zv6@23JyO! zYydDY)@NqvK zp|lOVe>bvr=+xTc{BTlQ(a#d_|h7|Q1@BqakfuNZF)kFX9?O#n@ zl08#$mgVpux(=07bKnv%Iyf8-f&U-1vW}j))62U3|7E?b5AwL8Xrj%j|4j|7zown@ zw`pLlNRh5jv?Aymd1xg!L%Kxz+{ipSoGq+k4F&9{#cvgVP%InOOiQ~2%|qM=XQrij za3Q%52c@N8W5i_KMy98DRF@$cUIW=}9wR)y%S)XV(GE#5`dv0TP(B``i$h&TcuII# zczt+xSPfs;6&y5q5Fb=r+JJ8H(!tVMm*nD-L|%oGo}efR=`#8;<--5vIf6tB*Mt$( z7vXJ2!hiv#le>Z;7Q$_X$s%p1+R0WW?@1d1^j4$xAZCjob+i+6;~8ua+;NqSl{7X+ zl+QJJ&%oD+UxHCEoeHr$T!1uhL=0h}fcDq4Xcr}oqFY>Pwb0|C#G_9wwf)Gll5>l2Lq2ZQdcx(v`FQ&TZh%d=GB8W7@QxyXvdaD5QDhu=_S1+fZ0KcH+RY4gUTU z>DyQ4=EmjAxAT%QTIf6t-M@Tw`;Qkbx@F;`;c>GjU-$I7Yl=AMuqlwv5S^{j?Txr9hOmCmO2;60`Rr8A@E|!IenT*r+ z7)kSzSz0n%feBza*@-!DPkJbTdnl_oqPugbzqx|;svg6QuG~C`BssboFb;+;08E30 zL*D%?GCfYw8KJ)o^^Q4n8mAMWvmlQbiF^#Mw7TPyq^~BiPhmzKo(5ghf!PpyYG}2Q zzo>6ssJfs}zobitF0b!joZH8hmOS7B^`0^PeP!kK<(_ekD+cUT9 zr5(^NK}3o%qyepM;0*8_)@nqz6WR;;vAjs>fpT)l?Fpd{UC>|w`aWXIlpvCf02<}? z#8Yk$GJYwy2M#MMwyd>cvT=6OUE4G7=YnTxRxCf_LRw8?NR`p+pR$m2MDi)V zj(9%KfgOm8ONbYXy^Z;BSPfHuI-zM%a#0w6DZwZv^XHD?SP*4GR?bp1$0$i!vY+d* zyD`#Pl9I0k6>Ju>3owv3-tZ(*P?YciA;k~4<0WV->>zW;t5BEOK_xyu*-Nkh0`F;j zk%HDlIz-_*0@#0>Gn0-GARx29J1J1kw77QwrJbULZ4LzO-KZgTT%x*JuGzC(WCOla zN%qPG==%MM#FCK06a*RzRJ8ACZ-j%RstSXS`(QQ{DP;`(=BhHo?8Z&wHjTafaxKyP z8%uosbv)mT=kFHJA7u1(wyhY@@u2d1(UCAo%ZDevfQjeYk8Q&e^i)w*mC9zWTQ~OM zaSyA~>#s9Bnd-u%a?sKT`dswZfZqzeL7-5<_K# zyhCwmk?j0JZyQF5ET=0*y_z8G9Z~etJHORDC6sq z^%o-r_HN$2;n7FbJf#0c<-nIM`&y_abqhp0&QbJ{QmD6Goz>%oAD8ct0!BU?WO%%x zw~*+BAa!tH#lXn}m4SvgH8g49z@j2xlZpv3u@;qncn*4sRj_EEXs^$M{&ezM^u?bk z4g0b}8ns`MeL&_Bh)thq^_)I};m7I5=y|A5{Jr5#Pv^XZQ!i<&ku=SrMU!&76LlTE zu+{;ceIC;n`a#j#OZ0`tZGtR@Z|V!JUW2_BTYF{OmAO)xk;{CTVu0x}lYQHKvX3$^ zd@Sf^GyVR)eXD25WyJUp7mgC4#I@eHen?{c;sJ$!ve4$EDSW6m{_QX)xEM$j>4 zTOO~=%S%bIpMXQP_F(l7R$q$3v0L;H&NI+xWpaOnK(Riu%omlFr_vxjvA8p9|BYnK~+ zsk3awwhE3+h@?=3_-S$lpH~sc#v}yMUluq(n^^}3F>tIDaP&9w@F@!nS%A@xo>E#@ z%IixVKO zlQP*;R^BHE0~PQupA^edaS?t3eD+yYV-~SZFPNu=zQWcTc=m&M_B5%0`iK|PkgIrt zk;XL8asFK}_r6 z33x+N4GY#()J&;CXyQd9xuy#1oUQ`(J1{yMQqw|-)kog$t&V=5zr%B_exEBvzt37D9iLqqX81oCt_zd$ zz7&c(ab!{s{%P*eWkb0%G?e2YnVu-7dt0!|pQ^|4OsntbO1tl;Xb%rUo`SJL^dt{9 z&RnI1)b*2aglELg2bYV)+;OY#=SqqCeqLbY+xvyNL7hLbZ#~*ic`2ApJeQ`A+oQ+r z=XS$pzQ>V64A@qQGq@IWH{X*oFi}7%^kO~?Pb?}*NT9Z#z&z~*??*l^-f#E(?0$cV zw*(?CvD7DKhsV4>+Sd~_CY}!(vwDmUIw+&3X9)r6cG)Z9Y<_OUm(ck2=;GG$gb#7{ z1cTFew8t}P#`$QY03AjN7J0INshQRJKsM8 zuhILRCsFkTttL%XFtHWg1Pco&H_FO{C<%qr(GVXke}yCIIdg{jr?dB)mth_xFH|qQ zde_-Ie!cuARZSx=X zM+F_!5Z$OV*+TQAG!cV`n16jjLdd^9E)E`SmY-jdKPCTz{J-R@5?;*BUzY!NzM2oM z2v$)-DBqYo3o~>ngCYwfp%7#hqJrT?l+R<=0o}By3#5X>;zr9+v^)GHc30GUcQ%ag#jfR9A^0i&2pHCZOuX+Z z3KWn&YR|`A+2vKwVy?_57?Y&%IyD}tn2Cp?3Gl7eQmPacDptwI>3OqmDa6oQw7u2ZE!*nLbvH%C)LUgy zR1aXsgq>iW#e-c>Kvw0E9ss>D4s(>jBY!`bmFn?yODjvBvuH0_lBJ|?3i(X4Tm0xL zOTscSjt5gGBNIC{O~C|a^y+aM%o4we0VDJ*=*Z`JmaQWX0}SAWw!_eoi%jv{Be(&R zZ58=YaxygJ9*-swfM;9EvBl5q3ErNfx&KH!(LJZa{deo`a^_Sh!RpD?yjq!D&8%0X zbkKzq#g#Ru!u=2XbM~AH1=*#6Z2>tzN~Tf}Famshpns1!6>8TkbvyreX(0O2R&iO? zbTYMhmx9@(N_lzUb@pq<<>KVg$-KB|bP+G0S!@M~#U6Bo$hByLRneWDyl9FNFYVwwb%b!hhZ zY&pAc*XT5smN~uxnk~cl`NrUB(U#Vl7)o;)5znIJ*&Yo~kx?Z&6UTI=rM|Q@43we^ z$gmQ$nq`>*+jPnx^Ivw4yE$;#@Bmn~U(NTSF z6gidpI9?@(8vobF)RJ$CWUBIwqiR33#OuzTJ0JcQ^J;}x%ek|A*iFKo1I<}>(=1~M zlZw6IWL&htipdpAE7rmARD%_D;s*uniq8C>l*pcvQW#5kR}yh>Ma7f~=)Nx=tOy8G zjVvaTu9m^nt&_rLa%O*!ye7Mc`QYb_# z$Bsr2cZaZ($n>^lGn}c>83|%t%t#RHzR0#q6O2M$*KcXRb>s?=`jJ-vrZ_<8*K>qI z8WPuwic?cddQDPr_K5Ys_Cm)n-|L>IAl8FjCDxmR`)}m8n5&QiL!vwYQxXV8cUOD7 zLe!XmKQ7nqg+MyTI`T_@h`ijCkWB40aN)HXqmY~lw=^8n$swkxMuo~ItJ_pQS!GH1 z{s4x9D{-=F1p1>;%;yiONt`_Z2kLf-kvmS((LFZUPTpJcoT9-7lpSza({iez=z!LN zZ%(rfbgU39DfggL1sl}4oiEew-(kMHgy2*@93f(AT!C8*fHktCD)7V6Mj#v>2P5`~DdM~Ixe$2f7PMmiy+^m3! zPJKrNVyLkp+S33r+<-2b3?ca~5Cby`NRc@2M#(oJ1btFOE4U(b8et;{A$o9!z=(h^ z1}9^vYjqSM1Qrm&&xa5I@bw5ecR}sSV-`kasSdQV7`-Jd{q)9jFw)QiBOXI_SGd_^ z_ck|2&?yPuA8^0r2C=w_SlmP`ZW|}NK`<_*4K$^?+T0W#N9d^+xsZ0+(dHZz_6so;E+6(Tv>UwoMC`a+C z1*#z^Nwp~nGe6IP4{04BV}v6dnEok9+T+0EkoIlo^N;DC*gm zh%?lzg9HZ(LYrctmAa3<&E;&+9NPWy%(xd*(qBvny6Rj@UC+3brJ~Axifg@VyQ|Ih zHm14TxZTEC0np16Gm-w05K$5mgYBmRlu>LmBmH=3BjtEhfNW` zB1BO|W0J6i>=~oNQwJU{MhBnK;VBjS{Dw=PxMN4__|m*^cw9+dH5H;M$_wc0bc5LE zg|ts}A0zH5!wX$7ulPa)n~1)NnQZ$0(K}>KCg7;x>p-TN*;Ja-ytgr00ZD{rWOqQIL zbsmhk>CBX7Z|>1r=`8X>eR_d1I|gx$WD%z1juTeqNL=&&6N;Ae9@r}3siw} zfJw1G3rrDTI}fM?Ch;D7!ohVE>FQrV_vU}~Ks#vTb;y$CelKu)u`wh`N5qtQW%&iVf6#qXTBmQ*A3*)<`gJsrw@qSRR)7I|+mr{CXB2sg zG8d(9%kWPGLnE>vKnaKrtr$r>U z=0V<0ey6dlK>I2L@v2I;`J>d@hDESV7JCC%)7%!oa80mb_ zA+#PCOw#jp3yZ2wFmVf$Hb~nPWoDqPE4yHWk^Mx)2t zpv6L#!b2(#X*@Q|JJ*)D-W|@lQ>Z*YTe4&cDLock;*Q@bXf95gW>o9)3x+B|--$=P zA5 zu`@0n=z56-q)hnYv)99El8sRlG{=Ghy+QmHdU^&pFLs8-16}`ReFpJ5dg7}IJj)A}TWgYdUho6Sn>yom>-Vd8Tvm*jx> z97P7PqQ@QkIcttYIc)T?!ry|JqM9e628Uyj>?|D~CE60%^Y;7%dha;Zb^j_<^56kh^dyy3)735~v8x=4R zyuTNIM+@F-`2zSIqwt>Rx#Xj?o_j5S*m|!8Z|~jBg+c`1^fjZ z*0bUF3X+%A!H4*a_5785kM$Wi^h)tpD(Ppf5%ZaN!~|&`mV@sH`7HPXa}6)nD8R|m zQbl>G5}}7aCIWKee5ds|-v{}A>vLEK(@-ePfO0d@*ee~E6g|MUAcJkWhvLrub5r2bQ`*Q|9IoVp`SMm`hHza^JN!Z|0MP> z3}^lY_Ml1?XzC2Xq;xT!29*vYNsj|kX!|scdis9<>w7F!ZO>-&kIGLemTCnZ?b}zDzvH6$0oi9OB zpeZ#K_6TkJRuWZ3){PH24|zq(c29dU6LL~-BNI&3kplfbjiv8=v-?3@JmlThR_g&m z-o@T;iPRCq-StajP(pGfp-n^OvztWPdI(q@f=+dF?q2Fy=h^0wJ&GG`9z8C10oiYtjnt%>Xo+SINe{CFz#*t z3^Xz{T~*{Z=5C8)?l?nVFV+^AgD%lWAn(lkXHK_MiaE(yA8trznV-VOy;`ghunaoK zCLsGNT`D(HWhFh1$H#HHhSJ^M)Hp4b65hS&wflY}aM|&a_ctBr8%XDpnP%mx#i-~4 zx#@58KM1{i!|2e|f&1|Sn7((Lqn!&nfNgZEcDH@Mz+b`OtW-3YdJYwIoPfFBeR$_m z0l(9nVB0s)r19JxdKI4QK@XK_);X3Wcq5uPLXHDe#o2M3TtXb`3~+X;ln7UX6nww! zeUaafqdS!ay0K0zrPldQCr55HJM~JgN-z4XwUym#UG1r@t;+A(*#^>?o_NB%9u`+` z8xUu=kgrBzf`pWQ&4UKiafZB}>Ei6@=-wwjdcWN|x<-bkh0%L*c4Xad_B)&MV~jfT zQFP-n{fMj+^BCh)`rnOVkB zI*8zeAc80jpav8U7G#Zqpan7LNR91fv03DB9@YHL-}KbWS=SHML^)4=2hpSoBi-YU zbLpC@D-f`XYIgUCH{Z2kEXMAzo1dR~%kch-=2W1^$)KKq^XXGdJ05Q7NUPVltSJ~d6(=cPm=J^Y(fV|Kg}zbWiM(45ZpBrA=}n@p#``u* zdki6I^uFH#MZK1)hA>)!Hq4T%vhFI$H)yA_jyi-~?dA!a$d16pqwxI3E0S3*W}K zwU|2l0!WO7W3*AGXlWWjq4ZkV{UEKmUf&K|3+uY=tz+Gu%YMy@tU-Rar8CT5i&@Vl z)ffejstolvOmlgx{7kOuyEV2$W6NM5aa5}ZX=}kATcb4yxji?f=Czz1Cm+U^u*N9+ zOkL6pqv{Ba7gG-F>>fgz%cCks6!sX*Q`L2c#%|K6H$E`UPH=Q_n8h(kf_8^>;jj^i zZ9}6YO!uYZrC-)sc%`adW*_fW7h+aaq($|ZZ?a8u@P+*5F>tu0N+atDnavQO5M8MX zme*pAu-)5MX)n@ELxl|9NbBtGH8)y|fQYa}E2B15&OUW%Bm#>V6R*gJQ5LRfud3`0 zm90?Oe3jL!GgKa?OBy{Yx(|*B1Zz4wvraB-QEX@4g&+~o$(wU92cxOiUPc;4HhHKD zmb*`8do^oo{IEbPNCdvHAZC$O(F(|Cr^UK=C)NV~So8>iz-Sbs;B^ZylAAm==SqU6L0)fwN(QycBRb zateT5&IST|=1~G{H^LzWJ>VK{^lOpX8hNYCAJy1QZ9xn$-@sY6T#VtZRuk)8&r*ou zv04+~)?=+kBm6M>Xx_`8;CwB=h4Y1+UCP-wSOeB2p(>DAn>4nH*c-lnS6GN=hX-iS z77xU-fF!m~Q|W2zEHh^7cYh96z}W&8;|uv{&oj|bLz)X63KOuAad3z7u)_IzgLjY+)V9}5=FoM0JkeLp1dlrDX)oUBRx>R{2`fQu-#~5YQrJmcw|2EDLV|E}> z$W70et2e6r%5y~t9V#v#n+YV^6SkCGMQkv20ocGo>@PT_-2k^GQ9iiNm{_K>t;*vH zUny^rIl9S@L5hvc%4Md@nOI(f4kV=ZYGoI$VpXTJ0I%O5Si$Clz8ESU!wQb*ws@f% z>lQ1VpBExc7B4J5+o22#pY4!~dcx{P_oA_Tbap3!dk+AXS1W82XRA2dD5J~O793OiCS10m+6BVe_UbrDS(@;;q00ix&^H+*KYiJcI^Qci4gIJD#9GF z9I^#iO)L)wZMG6vH?jo#-f+&^O)?z3x|8_iCXGKOvwLK=1;phrk;S(**Yvy(Ehm6j zmG~BtB#Ml?z5uh(l4bI{v3PJv7a7$Mmbh~tQQ1tD;r_*fH_Plv&RRITnKNOL)bg=( zF}gg8EGr;;677}2+S=%WM7M2izObkVyJFu5-?Je2>izfOCnOjkKW%;*Y7{)AvO86F zBPIc<>~WM|IM)i8D&{5;nC|8vTI(DxviA9!9Huq;M0x1@#+0o>_`EK&yTuMySOm#Y z?SZjby386hod1&w2L)WGFt0)vM>l6FDi>TuO4oMOjmy{pI2r<^DvAYMBtV4CKw|2Q zgN`0I$_1;~MDV-f{pu6-hXcR*MDfPL>c$+@i*FXNLIJ~30MJ>)?zmGdSY-ffGx&`f zdjiwe*C@npa+<<~0PY7ikD(a1P)7xCSwK^nJ82!=+~j~wuw%|EF_-9^equ@70-gM+5FB0W3i07#fdDItE-9 zz?ED8cREP}P#WEa=LH#HS^!5OcA#}=AE;i$`h(*-n+V$NdyIZwT z41s{N-LCD{IDl*taBe*hd^Tj~hl_A$pZ_@!tzkE?WH5tylpq=f@k5taH?0c2YNx_h zDK{znQ9-Sb!`FgIwltIxhy?$ja^F6^c3he^bEK#Zs|c2b>dyz`}6uuVE|L z6k6=7-zX@gVbVyO?{ulZk^ZE{X3^BvNk1Z zhJsallYK0iV~T@AIQz!4`z+OTu=ys|@3vREVHj`tpVQya`6`_)(3u4Wj;F`kz-V-N zTfaLm1cFSW>px<)Ma25h2^O0jSikcHjx@hm+`6Ud#z4QuvNaZ`vA1;goPYt+6WBN( z7}lln&wz;DSy4c4GkYOjvyIvPjPl1XbKg4xJASrf~&;2N6r;S)~Q%51Ugfr0Nr4IYyqU4{2b7H^#@E$ z74&A)cD2zLt6?czU5hxI1p?xrX9cSw2ZSC%jY4k=F{eV zLY-12^K^@_Rh_j+4=ApYBQn2Te@N%^^_4o`5*0$w^;AeyF1sNKa0_FmYdfZN#;!&j zN}D>@zXI#Ap~ZZc6pvWH2JF?lwY?gDSZ6otx9j{`%q_QNa&);U0rg&vgm84dsJ(iW z!H+`bD*Pz&h+ep?H~c%*Jt|+Nq5}_Read?@Tn(fF!lz+du^7?K=M36NHWw~=^dxhsmO2eOxlYhYRDp(=Qc(2-8ReX#%`iRgN?T|U zin~q4qvpKnY#_V5g-k`(veazjb7N$oTWT~y$8^@JF@j`|CPV3g1L7vthUj8JNS5P+ zz~JXmguO3S(n(jw5LRzk90@jmDjO#x7#wRYv(3XGHF#XQWwTof8#xb)^?{D){Y$|E z{1-jzza;!CDEF)pCV-KMcbj@yg|#=+f_bKWiwPZT4mKL z^Qkb!Rw%q)fqMIxZA;;bK%@=-=?-C&J!~)U@G9+>NSp2+Toj$T(?MY%v)|9}Y;x?t z?sK1L^q+2F+oiC_IrJk4A>m9@#A+~0gk~jHb<|oKogA}rbmLf;^x7ze&mYf@d<5l! zwahaonHMQrZ2a1K?PQ~3r^;4Z-leNld4{q|;SIPBV)snWldsu!?429CYqA*UMc8z) za-;ba-$d&={sqB=@SH>y$cKb^@t*pX%HLF3o6z%b;cRtOjH$|Z zV**>z>CFsN8^PC8TNK!ea>MY>W*Oygv2c>#^v<%h6z`HNrR~uM_A6fWec2G=gsYxpAL` zp}($@Sy*n6xh0r3+7RKEkF^cST8%;^c;=r%BtUY6hQp|U=W6(I$SNdw>e&dspa(ob zBOS|rdk)0{G5iU~O(WY3#|^IVaYH*Z$pVbsuS;q&>Vb1eUs!_kg)#V`ii88UNib_j zW$!8MHHF=!JgV?!h3(`FcTo>6>cu_h>oZq$3C2HRDP+j zUnzeQ%R_4JP}zEwy`iwZfCi%4vKGk?^X)jv)^nojD@b*kSbikP^x7EQyQC|OVW3gr zc7YKlNEAkx<#iEm3t^|@9{C|q61_!)lIyZ<#9*w(5o02X3k(=>=t1ZNN6o2=*${vu ztV3`4*|7>N+1T@PV@`a7#W%mS_?rVV@`{pqC?LaW-fo8nj$$Y{lt=>2;vu3}Qc96< zW!YA+V7~T>b67hHW0Z#$v(bWwU_>lTQN86~T>&dl$T(Y1 z9%y6F}5D)a||BoJ6nWS33z5{)Ycnr6yKuV zr#-337i)_&{)obEf*DKp^f#M+79Ye|fBP4++57@Eud`_ie=l|&x3t1&cuiyV8Vd{4 z;!a2>o$a)(!4on&BC{XM>=yYxnO`rni{(W!$iLexBhn(ua;!p|`p;{Yk-&;My{H*- z+Prfy+SxYX7GXu5_e|vP*#=@aKHQjqJK+oBft$1wnmk5hgEdyJu~%@}AwH%x5x}Y_l7qLEP0#07E*@`ghYwL+G-wH%#MIt!C}>%ZvdTk5F-}W zUB;Dv*VqZtO^Mzw)|iO!0^YyN1TwB@oaCcA+pYurjXJ+ZXESvc0OAS!n^ZnsWpG!n zC9E&{R}D}?H~vJ$4qo@%%R}aC)?RQ~%{b&5kD!WBx*Qsow$}WLt zN3B{R#z{27jz1-To**5BPi6+i=0H;W?uF7p=_fhaea z*<<*7mY2__W19yrFp4%ScPsqISautLfOG14*gj;hB6sRslht8H*sQR9fEdSS1+TQW zD91YAokXkxo^2; zN->X^Z(4AW$xLwE-`OH>?gL?kL zl|!g;b=x*yr=1bk^`PNx=5MDn=tXoyfal-NZc-LU;jwL;8YAx?3PS{Tv%J@`;%wTr zmhEN8ITUOi0?5}2e}NKOXpw)L$~Lg!z`NrIaY;jr{JZ2wWe(Hr7JeV+-|tqlfNboG zEJcuT4`)l%A0dFDn{$M#McHENkb`u#&Khp?1SzQ38RC&{oy3DXYKJ3`CXg3H zRz21sViJ7V?PhU&Iuw;{VMu5Zbkx1pP$M5g6!9^vI9MmE%ki?D)x3zNDN5`PjXdCXF=w zLN^U5^~wxI_9?8M>}C-*+`x-=kOjfM!n+2o`9%!yRMMHhicV=dEQZ6gOWR&V&eF&S~UGP>5jklD+m z%-mwz18_@NHlG!~LR=m3DIsa0y~((YsF)3CwxaMb|4^Cd*jMK@|42mP7I$nwf%RBd zVq_WX&#n|!p!~hDop&h9VqtYlw;7kcj9ZAT^;H@#)0hP@v`4aER>?9TMkq^0sIXaQ z@L|9pw4AH+a9;@OfaCFI1mKD+iE3Ggq!&wWVHjF=VGrM*6>bxNlb8^DpnY^h@30NP zuVjso>1WI3?@ho(_UBbS;RmjTHJ+y zM1W~4mO=r5sBtW@vC9O7Q6Z!CG5r9BEi#f)kb-n zJeD8{INiQCxpSuSDA7Vu)NYIzfgfp4Y5W!uRN1NQQ8*08l?t1wumz4SBqE0r7YfC> zkwZa*B)N+0_~Bp7xz}P=;_ubGvtDY$62r3U#B( zx5;FU$uPyn%a_VmQ_@P*f^<6;WQ-h5J|~`Tfn*aMAS>xM4*p`^NWhT~@^@!%8=+L1 z|G_e1aY8okxHZ~VjgQt?l?|)#PK+T2hXuAr=VSDX^!d6hq>wNjp_Be=P}*!^U4Bu8 z^bPY-3rg}Iojp8Msp`-IxO#_jOXvH)&khi~_N%$gG*eugM3AChO2#8n7A)^iZxr{)khBaTLbMP?vD_Wq z1=J*K7qA%BvtJEYs)fbaO@A)X!+2d~Ur=0PjJi_Yq`s`GewFEJCgM~4CQd$}+m(kD zzLBEx%#lQmWUWONZLYeYVnlVSuOkNw#-<*6_S5Ez*RtoJXDi`OF97Ve6@h1)ACb!k zR)CiVtIJVMIM!B-wdNc>n{rX`zZILa1Dvf`OQ=;f%21*?#}DR0ec=$?5<)C55OU3m zPC=u4Mx+JdazTjwQek<~MMo?NO$+~hvvy~31K2<&HXxP!b92!G_B5D4`G@&oXVX;v zJewa252pPZrOzNIM`PD%H=`s0@&J=5zKg|4i(<(btMkw125V7L=qB+FSe-rBL`-5V z1$HTYWw*|DkhcS7sHH#OBR?*4cr$^8D5H@qAaxVAi1Mv8OmPVTsu*X%znKqMP*HHU zvuT8!Z9awoZTH!@Q72Zuk(eI22Hn2XD9?O1)3fK|U=V9@vO7DQD&+;8jq>$COU(K% zTK`cB5Ny==9qPj{Fqfe%0Y&tp4DjtNO=8p@#Q(5)ashir7@4&5doiPRg0r@*`;9@Y z*uE5mr{-497W3PLle~ATRIiSm2HXbRpjV)xAn&3-=w^?|1;L+i~$%exN zRt+MjV!y~k`=%Hv))1z(aNvyRzZN@P!hd7cR5;IeqmCv6c?>a>{M|e_Ae`~=;9Mq5 z5#$Doz;8D$-ROA}L>a~ma?Fxjv037Z zLXX9OWuqc$0woR#+X~84-$Rij+uQf;h?nF^PwIWZ{I~J!4p1*e@0PKLI}!Z1=*gzt zI-}@MDtk_SL*+*)fQ8)B??krFSqiGfQevS?5QE!9{Ml{q!%tG9LsmYi!I4M=3P*`; zgnzxC1iP`c&vX4G-p+7~l`HD3;g^lS@Qc1CaB=U?p~I zk!$adh1)HSFp3~u;d{x_$uEnP%j~Fv|E=6FB;aGxTpa%kokt71iqc$q;0b<_8cZ>S zX=<76^R<;4pYg5yBGx?`vlgh&*3*$t1B12OE_O+ii~$R^)sP=5VqUMx=r)2Ygi%T~ z<=WXNgDKhHU?~#8k;;Hg##)E4Vw2eqgmuX7yUIMPJa5r_xBqmsQRFNw7PSwKR?Uo`&Nds+}Tp~!Q-Ua@0B9GsCWrr$z*hE-+ zFuN4w4@V5vex1K066L#b?gpQi9~JpEkTlr5*f+wmQ2-pB@*B5KSdXIIF%kg))i04z zMgSazK8eK5?)7!@i6bD5<3*B54{MBkAMGMjRG8CNtPZylv!Zo{v_xl@c_Vxi5G8C+ zqj?`0Wa8Pj{x`z#LHnF9a#&XLU7RC=VGrbtCT#XL#iFGK_I`RfL1+`?X2Cj6?yfEk zGm4R~xmCMI#yb&-)Aq9{q^N< z2dY1eS;H-T&luBfC_E}dts^~4m|*ofs`V)qTo_?cJ8zYLB=fZ~`j)T_;G=MWpa|&K z2E>H64c>{dz5Z&hC&0+|`s-J<0L}c66~yAeEiE%5WP81)$=zT=F!4N{pcPVTWC3Zf^Ii*^x6XiwG`&(FFBE$i@?3LK=z)MgIbPJ$+D4~$#7RZ!! z0f1w2@@@VL8Trldw;)=$N0G@9^$aDO*pWJTH)V?@kgOK9y=XPMoE*FB`|PC_rTDAg z{7?4YJHCoy{U6_6PZ}hl1SIq-NzU%sBsS7^1w}xL9Wf*Uq9MT)5cMkR#je;ZD%g8P z#Rk~0qSzZM_KID^Lh^lP=6#X_%DsL*pL_rKyW>j|^=J9~RJn}*^<*9WCbpXa#y73K+@@=7Gd;|-;r*KriNCfVF7jt^5ZB7MDV3s^ zO-l7KNM`&+&*kyBFe#xCsvY6+fSth zRJ^|=>zJ+a*li(SGmv8>Xd4_^choz?WbPuq@F_W&`@bp_H7zk6%5l20C%n~uNi&T# zdk|PT(ros^YHHMBUiUzyp7i9) zwYTX}+v6DTQrx(it!!SZUHALJ6ZIqb`%dQ1*4mcPSK3oBNk5-0P@vTbd`$>j5VBBJ zX~wqmT_-o4{mll*S|IOdyd!i@WUz03TaTQm+#=u1rt_#?yUIgz8HB4>8Zu3C(rySE z&}fvV8J*4|nAE{jL2cWf*V(G*Q_A`>RXl?6TcYqG6x*CXfw=4MW_5 zC%$_93=`5a_^GP71#dq~>z7VY2fOZCQQ z>XV}|nxBrZm+RND@3pC$4TwOo*Uzkb*65P!D%AV_*lVei^j+8kMO7SqwYburVqn63G;Gt?Yu4D&8cr(4RIo7b(`x^B(KbT$leFXly$ zuikm(j7QF(|CIjBGPp{vYiFMa={y>T+RYOEAUeaQl%HX9t(4s{Ug}+zC3ho#c0oZm zxtlC?%SdNlr05hgen#Eo_5;)p)JN%jm|@}>`LeC|kbmJUd14RtUjhHGUk|y5l*M5P z=gQCol-i=dOtRKM*3%tNFj>l|GN)TmK(2HYX;eX))+LL4;T%9`M~^01)C%a#=xe2? z+wuA~PtejaH@6MM>{CyuAPSJS3z2{PtRTZpXEfMgC!O zq<+$HDK6EN?N;#fh!MSW2mhSk`{&&5_Rs0k&sxqe-G}zwJg}&zOviEd%%=lXi#Cty zo?~ttl#?H^y%cNf`{zo6_A^m^_w!^qk#J?EGpFLK&*sM zC$Z(Qld%#$xv3=Q&}Q;#u9~g?=!5b{NqCod8m?7eTLpQ zEU%)X&(MSTHyGF$imefft=~kat}%tSzPFCH-tRyc)`h2TTjchi$XG+EQ?$u*U-+x&m>KdK3{N7eN&uj;U8kjRMF^~#&4;V*_|NLjOUycUxyT=R(){rU*eB0Hv)ki9`p^)b^5eOfxc zpgeai8=&^1GK|Tck$ZgZl3XK~YNvZv0#@H4o-zQN)->3j7`sb3i>*}p$?Swnx)gN*)T`j_=z(qEIvBO`l~ zV=0%ZuIiN8COu6*vf>mznp$8N-`~YfLDs8&T&|=&K9!(?@bM znV*Y__9GFd?dR#5=Jk!?~lsc zNz5ap+LmGq0bP1%?6vU9(lO9sfis_Co_cK{q1N?9q-rIvXaFY}Nx z>hCG_J&|f$=QR$`c%sJnc(Y*}KYXp^BW(k5I-ArRk~xHizLgzYRtyamBh9t(eA{5|{+?(O(a`AuVfBI#sZ>SHa^K{RcW zdmr^kc1Hfnj@MQU7^sm`PZ|k?U&#&1Z>pAZ|FQIr$#uFS4ag)PnXLMM>3k%KL;qzg zpz-}(<7_Gut;^43*hv^ez7B`Vc^$X0b8|D9pC=k|+40vyD55IatFzzFRXM^Fq~^D?~o?Z34q!88TpwcFfEe=lA*GlK&2piVm1@9W1&=+Nue}04Dax? zMRazwVdN1$$ZTv?1{>K@wiMkvLy@WEE9IT;Nl$k&9+XXqPClX5-X6=$a5}n6%>P|3 zT~qJT7!4@+By;oHt)-=F$pzUM+LgJ9pY1~DT#}bN;pC3kH8TKn2Fi2pxTJs4UKc#y z{*B!2q(>f+(~miS)_zNsbv5#t?X5Lv&s2_XhPyUdFWX?xGVZf>U|9wsJ@o?yJUq6t zD*G2Y}YaO$~r9clDtAuvuPpy8v4M-oI=o$L=G1+*V6uvkz|gXqGygg%d0r#1cCk| z+j!I3SNZYM>GHq*Dy;j-g0 zmD?BJz5LLz{13GQlBvDHWs?8J^p5Y!@?%+Jx0gMG4%y|B*HcYxFMA}pWc-tG?TtQ< z9(!8*@yE?Ln1tVd@}=@o3#QeP@Fh2raQ=tAFZ#YDU#G5DE+Pwe{JpV!a7u8BT%IMCVg$j#NM|ha5uC2kW$p%*>1INt(P`lj*O<{VJ^8v|;NL^iAtXRx9*% zVI-Y!%6A@bP0rq~oYxP9f`Q{?N~jz09TBmQ|Pl|ycCpQ<%V z$4D8pmZ{$~MXplh0ZN=+q(US!&5#zy(l1KOHLMGDwU0E$+Y}!|cIKuRNE(}M(3y~- ziCn7p-P!bz)_Bed`@{opk5TRWDDz4`Ug9iE-~XR|E)Y7~^2fC8^cHHLN0)W~+>!0f zA;ZVonZ5gtwae0bj5Swwe0L9B;UQh5aLqk*ooZ%HnVr>RtXxKaEOJj-W@q;p`@Zrm zZCrRzuAnt$@|S|p_r2h7{PZdlc%rPNCS zs}@l!JyL7Mdn8#Uk0k5kUK*Fic6_EyH3xSaqS9-~9I8C2&?H)xY5gL7DvzS?{3Gcz z&Zr>+2Mks+2hwWT0U7dOx-ukx$c!N`4$+1v(!fOnmyvT;ZD7_AHViPFWS-ACiToG& zZ;|e!{42_eQu3cPkU4tQI;9NFA39^`i$k@c|4Pb^WzdnMOox9h<8Nv5FJ$QdaXm^q z-^EkPgpN&k7iIJ=Mp0e)qleMEkcQz!6l50U7tAZTvtVO^L2l2K z5zCm7Mjbq+8-od9GV{qQeKAwZq)Us^mZhyv)6!Dk0J+{hk{MNmw>y%trDMjwmXVd8 zH6!cAEG_GQEyLFSogV)I8Tx-vj~D2D>}0a`D&EIa(q_>gNRKj_35?VGVBSl5c4O~@ z%~|7p^vdj&-)mm4J9};HW%S|`G5HxAGqj8yypwe#r~hBbVejNWDQ5@z@b~hcl(PeU zZ1!&cgL0%(IzCgs=KZA^*ulRi5O%ywZMlT`^_F^PXJwN6#;i=qVm&1%KW9eHi{vq# zE-lJhmbIQ5bn08_9IJMe_ZDgSe=Bbqr~Yf@Cif8ksdBUaAnN-mr4;z^vKarUf(P`; zW%Zql`tFI^FQa$>YR_S|DF7Kz5h4!XLbJ{ z$RA_(ft};gGc+EZ#yAt<#8FwM@@U8X^2t)&J=%=kWaKX`EAQQt;lm7S>^a#KqdC(o zHbN=#q?jC2`{l?PIg4^uQ-An2N0)LksdG%CXa~85X3pbsv^;VvFO5mie9w{1U{++n zay03}k{y@lv5vE;JhRHiu>#S5wg1=h^xR>2j%0HUVto5^d1&00Zszr~gvvAhK5fPT znf_x{6b#7cRYcR}z5k+$@_WdOdaUm8Vh=U5M}CiUdfeG#O%J_?HUQ=LQ?-!u*}qYa z$2#t#a_m>OD=SFt|EdH7cT@tZ2aJoX9z;KVM%hKQ6QxwN6X{o04-ZHh)xaJ*^=JE4dWp)guc!-e$RJ)9JN-pnb`) zn5Smu<>#G~cW2(3JUvev@>eh7-{_x|{g||cWKSqdXtn=y!9#Z>Sdp0jv`cAjr>E3c zdZNr3;>c09T$U&2uIyM}wlkTG`MLCMp}f1S4(LWFNa{V6yh3(0kETcD0ghaiCFf>2 zc^P`&?khW1mc`P>4W@g$m(fm0brsDH#UvWa$um)3%5DTb*mq)voROXDsA(Bld1|lj zgVM%zALNefE-5{Gby&JtkT#L#F#0h|)bqB+<4=$uV=_tUKU#)5lKje)j+rri?TqOo zvwCp%5+mQ`{&4s{?vZRUEN#(9csVqmq^RApa{4C*(HE8eQum;^yFZlncwDyXq*be} z`Nz|tbg`umZ2d#-F7I+rXvljlx=qiiS-P~QeO>z(?O(TlaLL1Kn*iAPG(w1cVmRMm!{;>hnAkbJNov^ zqnYhjUyZNby0(W$hjMSC1FUEo%@Y;C^nab}&K56=6Rz1JvHmo#mSvdCaatfHd}%OK zKEc*mh-%5o&fQhk9$#{0QIDK=8@Ajck8VG&{be~%URyGD6;;lveGbs?xI*r|>+tFA z56)O9w;gn${M{ezcKc0JMk~Eo4gFC$ZBI5IBj4OUM>#;cgQl8d_pmdl3uu<9pr~-L zM{8iFOszUF7wNZlv`e%Jheqw^zukSbmB2smgQG zNi?sLU1n$K7dm}RX>mrurYA^imTzAC2q4`)r_`w#_T2%(f^S=R&_gu%XnCO|Pn3?AltOw3Y>sO>RWH?-+(RC!{4}S1zd3rpzQ1XGnN25czc%KY zzqdAqo|~e6ps=}lzNSXsUzzpm6q=i-xz?s0a#;`A?;#TcVnq%A#bTXFIOdRSu}yA9-}CS7Y)v}3m;$Ieu+Hvw9VJAsb9Nzuf^l4t7W;{fUJkTz9S!> ze$c}M%O1V%f!MWM$1h*rOwcImE~O6Gw*aP3mf^J2N>cYSSDDyb9@AScpmNh}I=QRr zs_!saZ}gpaXXS4C&f87d;bNq&=d|3;=dR|@^%vh&ceIR2d~+A?IOW-8bZ+$DmdU>l zi*-}Y^7HiEzgag$?{h3orl)H=OWmYAX}<>~;zwl}h9M10le0VajIpVQZtNBAB()D? z2SCeec3MZeB=zmlG0YxoEB3IyNA*=`V>i9g%-u3y-4u_{m`+{()pawbZ(=?@Hqqod zjcRP_m{u5dE2br5G!Up+>2eMm5Y+Sq^9P(*)^OU^4JXA*HeJ1(zAWDB@{=!+ zI);zkdPviuv?q0N|C{HO?!m?e<;?au>Mj&hrSui@@f6U=MWX^qp^-~D^Y+`@=dkn8O{FDrI@@7aYO1Rzk;|aov!?Wc$&PAF^~#P$Lv$x$IK&n zoE)dqXL+U!ZJy%S&*gEGU%!gS>2wRa=Pn+neU1_}Tg1tyr*tXe3XOAbBCbj$(szh! z(lB{X#C54Bu@NTAmJGtM+YmS9Z242f)0E5TurGFx!^`tHkGs4KFY$PcU;l{5(|P=R z9?ztBy4k_wL=2>ERtAq}vwJL|dk)1jts;IsmtU{s@m>^9xAx`nJbq6#kN4&GwD5R8 z9zTJ{2l4xt@c7O=&g+UilQCHg+hj}R{|Jl6#P#QRoR{BvOS(zQr`2|a^lu5p_L1tP z8mXB+!L-o-v!qtKR!OmDX&(PuO;_qE)+mjpU&^Hh`Zr&iOxI>hbLh7go~om;j-HuM ze{1PZ>8AX6VPQ%BKJ_)tO)X8cTJtNLn&&k&SGU$THIB|NZ)nJ$Tt9nGYfJv*x|X`; z`E|AQ%wH8{id0RanUE=5Ks^;v>dJLWbz@8Zl)C16x;mL|m@TzY`KqZT(&W0?Z4K2F z`McRNt+vVGuf$M!|A*P`ptSpOby`rj`Q$}-G`*3yB<)w%+(MORmHpi}plV9JGUsvBcr>;4_I={JYc7020U2|P+ert1eZQb1J<|Fc( z*e@x`S%2NE^XnV)DVzLhjrFbc{FK(}*1DGb>c-jv%Ako0sA+0zY;CTuYoW3n$P1Xy zt8pQz(nbm~b(sp{mCT|$m;y{qrtCcWy_xQ3m65EDndHh?Jj0$1sj|jXC(Wl`B3_E9 z5cVwV;gwY;43c!y)95HCZ>V$ZOW zv)904b^I?ILh}ElIlH5Q>oJUS98Pzz#x;}v3R!=y4^jGU^Zxs_)RjBapphE6XzZ+^ zv&O<|NDO(b*8i-%kpAcQv@6}6tOKTr(1qzfw{tLM`3qfZsb&^%&70_{9ckK1cd=Yk zYgKen@qSaAJZtc+B#HfHZ>NriW2TL0RV*LYIU4AW)ZG63j-&&d+VbaCFU)UisiPK6 z{bN>BV{3kOOa8pN=DGE)taZ;^$lH22ZG1WX+RPL4nwx6dYFb%8STLu)W=_hplt+DI zO+#BP>sU?swe>CY8b|urPmE{qX#{xii^Qo#mkH zara*qiQisZ-#D8(a|?C08U{Hj;(0HHPP_6F467$8t#xx5J~h{q)Y_&6jSWrJsY0pH z)uO00PIUI?rnc63ZLRsWb@S_MsH&Rs=hQXK+fE~iHUP1A#fHlUqA*R=vKPu}^d=6c zxBmrQY24;_F~G55jlmd^9`!QyF7*+0HU0m9`k;C%J+W<$T`4A^euuw*z~y({-9TlK z2o%_WD&#@p4)brI`xb7WzqXTBr0uQksqIdG=`%&=(@b6?mys&7>vvHf6G-}e`oEUf zgG8fOGyN-u?&_4>l6R-p<-f|89#!an`lo#rBMpE4CpL(#(b5=VM;dWigBY*H7K700 zg&3^}NGHoalU8qZqg5-}v`ZnEEWn;pFWRf0C-tHEr=6sJ)RFp21Ehg8w=!57A`K;8 zI$Rndjg&@7I}@H45TX|mrhAf4_#Q~b#JEbOU8G&fcl++r9?}@8jMS|lzEwp-cO>me zw#hhYFFFlpJmKX8S{O4)+Lu_#6lp3A?E6XkO9#;4d60Clbci%vI#ik=9VS)FigbP$%l+j6@<4fzJXjt=JJyED!{rh3NIJf8XL+>roAicUAQ#F- zbRME7`*K1Kuqb@;vEN=`&i1(k!>gt#X?@UtS;|MF$BU zEz>?UG60X0kCzw8C&(wtCrQ`K|CATYCzBJ2Q{~g-)8#YdGv%}7vuW4gIr6#kd365G z1+?+-BKczZ652&~86Bp)RK7yKQoc%FCNGz-mambom9LYpr=4y$(m{nc%eTn4%D2(c zUw6oN%6G|k%lF7D)JE)(ajhk!br{t&Q zXXIz)=j7*U8}keDi}HHfX!^4Jiu|hln*6%_hWw`dmi)H-j=VvBSAI`^U*0HxAb%)- zMC)!okw29`lRuZgkiV3_lE0QW$=}G|%HPS~%Rk6J%0J0J%bVq2h_v zl)lPNN6%0y+7vad2(nW9Wp zrYZX=`;%wp1C@i6gOx*+>B^zX4COGTTA8WTD78wRGE13FPFd@f!|5#W20CiIQE5`< zDMu>JN{iB}w9!d-3&{EWLONLM7&>M7AIfob#=;`y1m#5KB;}vVVmb%!6goENH1dLQ z2A#lg7WrmbqMW0gtDL8tuUw#9s9dC6Oy`nZN-kh8SC%SQkWYuJlx50t`dPU5zy0bc3El>;9A~mjhR#&J>Ueb@b%HukouuxoPFAO=Q`Kqee(L^oUhaYFL3D!U zA?kGXP<4iSm|CsQRBO~)wN9Ny$LY6j#H0U7pW(xC#omWDWHq#l*d!lQ^{?{>2y@?nd({6#p>DW z67?MEa`jyGJoS7!Li9rQBK2ZAv-eUW5|^t>={%P!>1@qq>T>mJ^%^>0^g7zNdjp;5 zdy{%IoqKVsdYgJXoxFJ`k&e67d(;)`z2sZ^esv`$9}lSy6Af8KWMqx{sQQ@txcUSg z9=le3ijG)%MtxR&PJLcor@o-RsIFIEQeReIQD0SGBgf2dsBfxosc)g(L^-J|D^=oyL`i=Un`knf{`h)tT`jh&zx>@~2-J<@g z{-*w}{-JJF+tm(DqN!Gejy}}rKqWf%SF8Sz0%(yOyoxXt`Ps zt*6#Y>#gN!eYCzrSo&%CT7PYTHc%U+4c3NeL$zVraBYM(QX8f1tkM2Qt&m6!t+Ld7 zEujTku~wp$YP)E=YP%85*+Uznm1*T#g;uFmX(64wyr(u+8%JM5_SVL0`)CuiiP|J> zUv08BMVqQkqjQ<}*ACDQ)DF@P)(+98Ylmtxw8OM&ZKhVE)oOLxEN!+nN2}Kk*N)H{ zw7FWN)}+nTj?|j97IM+mMqaBHXh&%awWGCTv}3h@Xvb;CYm2lKv=g|t)E?3v z)*jJTX{)t0+N0WI+T+?2+LPK^?J4bP?HTP^?K$mvZJqXl_M*04dr5m)dqsOydrf;? zdqaCudrNy;dq>-#y{o;ay{~Q5KF~hYKGHtcKG8naKGQy@!`Z&nzS6$dHfi5z-)i4! z-)lc;KWaZ|KWm${U$iaSui9_g@7f>QR;^v@&?V;JSy$;iEnPQsQ@31lep zo}p*zS$a3UyPmD*=(%)|XivSD-doSp`{;f3o%DWszTRISpbyjs>4Wtl`cOJ=bhti3 zAE}Shch*Pi1$v=gq{nqn_w|Gx=*4=8UaIe+@2c;n@2>BmkI~EYa=k*Y)T`*o(n#M^ zAFGek_tN*)$Lss(6ZDDtBz<3fvOYzhs!t==_WSDx=m+Wt=?CkF=+pH>^%?qMdbK`N zuhDDuI@+2)Tc4xX>xb({=neW@y-{z{=jli4&3cR8N(Z9OCol3x=?nFv^<(s7^?&Hc z>BrOIk0L<}rxr^y+jZ^ef_0#mz^)vJ{^|SP|^(AzK!@1=0?R+|C??O6q=wkg6 z{Zjoh{c?S&euaLeeib>&UQVaQUqikMuG6pAZ_sblZ_;npZ_#hnZ_{tr@6hkm@6zwq z@6lK2_v-iQ_v=4Z5(49Yy87F&N!aDG@f9bXq-excPu9VHm4Y;(t%m08)q128fO`2 z8%xMV^0~%&#`$#O&xLfZ(Z$9kbkNXc4mq_LD07wcNljXcNupZ_ZTaTdyV^y`;C>x1IB~KL&n3#BgQIYwXw!{)OgHz z+<3xxlDz9YWjsyCbvd7d#;3+-#^=Tt#+Sxd#@EIs;~V2!<2&Pf;|JqM<0s>1W3%y# zvBmh+_|5p;_`}$0v>P34BZsM&s;QZ}X_%&InYQVet{F4a%ycuu%rvviZf18g+srX@ z%^qe?vzOW1%rpC#ea)TBerCSe-yC2LGzXc3%^~JcbC@~Y9AS<$N0~dDqs;=d&@3|J zrf2$Q!VJt}v&1YlcQJQ0cQbc4_b|tpWoEfqVOE+|W@tv{p5|C{oVk~|w>jS2$DCkJ zG$)z+nv=~b=2SW)dOz}#dw_YMd60Rqd5AgPJk*?F9%fdXGtC;amX45~WzII|nDyr2 z<`HItIoE77o6LFUk!G{mLT5L%ne)vB=27NC^Jw!J^H}pA=5gln<|6Y1I@$Ro@&vTl zJlQnSJl#CQJkvbOJlkAio@1U%ZbZ)~M@JW$7nv8EmyqMs%goEorREjpmF89E zGIKe3Hob<9w7t%}-n_xQ(Y(pL*}TQP)x6ET-MquR)4a>P+q}nIVcu)rXWnnFG#@Y@ zG#@e_HXkupnXAn;=A-6g=HuoQ=9A`H^C|Ob^BMD5a>o0-xz2pSe9>HQzGS{^zGA*= zzGl8|zG1#;zGc2`zGH4M-!T(tJ!XLSdt}MilthbrCa1>*s?6!axB-1 zS!q_fm0@LCSynfzyOnL_Sh-dYtEbh=>TTs&eXPFLPF6oF-|BA-um)O#tije0Yp6BM z8g7lSMp~n+ovqPUfmLV~S#is=d@ErER*tnORdYS%dMr>71ov3Rn{_VxplR5jdiVcoprr+gLR{IlXbIoi*>7Yn{~T&hjpiQ zmvy&wkF~Vy&`PTWhRGt;ej#ttYG}t+m!u*3;HA*0a`g z*7Mdn>jmpYYrXZ7^|JMf^{Vxn^}6+j^``Zf^|tknwZVGVde3^_+Gu@XeQ14TeQbSV zeQJGXeQteWeQAAVeQj;BzOlZwzO%l!ez1PDezJbHHe0_~TdZHL->l!QKdh}*yG0-0 zZJEBss(TefXGwrj`iG&|kSuruu}yPMtJ&bD*xT)T(e)9z*Ww)5;hc3*oZ zyPutJ_qPYw1MNZfV0(x?)E;IJw@26`?NRp5_Gr7nF0_m6xb4}#ov;JD*e8$iaphyX74B6 zE!|`9ZyzAtC*3bSVIL^1knWY9v=5R_lpd2#k#4aMme$&b*wgJprB%{udxm|O^srrR z&$MgoTD#7kWzV+f*!A||_7T!Ac7r|FZnT^1dG?WZv)y91+HLlHdx3qFz0f||KE^)Q z{)c^>eZ0NMK0!LuKG8nO{-?dzKG{CSKGi-~*sJW-_8R+9`!V}*`w9C=d#(MH{j~jz{jB|*{k*--e!+gxUT?o-zihu^ziPi` zziz)_ziGc^ziq!`Z?NCB-?QJhH`*WAAKD+;AKRbUpW2_UU)!7PZ|raF z@9gjGAM79PpX{IQ&Gs+$7W-HGH~V+{4|}WKZg)76BRdN1`qCWTF&xve9NTdm*NHi4 z4s8~s-E&z^H>bOk?c_MQP7kN2)641YqiKUzp;P3<9nbNdgcCT$PKi_M?BeX|?B?w5?BR@Y%A9hi!l`tsoY0A! zJ)N=6IAyt_Of}-kxsMI;jT;yEr zT;g2nT;^QvEOoAMu5_+)mO0CvtDS3{Yn|(y>zx~%8=ae+o1I&nTbp-<~;5^;XLWAb)IsbcAjybb)Ivc zch)&CI4?TuotK=KomZS!o!6Y#oj05}owuB~op+oK&b!Wg&il?r=L6?M=OgE1=M(2s z=QHPX=L_dc=PT!HXOr`d^R4rp^S$$f^P}^V^Ru(r`Ni4d{ObJX{OFg9p5UJ7p5*@1UF@Fhp5mVBp5~tJp5dP9p5>nH zE^*Is&vnmp&v!3yFLW<*FLp0+FLf_-FL#%^SGZTYSGmjFFex`?>pt`=$Gp`?b5t{l@*){m%W~{lWdw{mK2=-R%D2 zZgGEge{+9#|8Tdu?QTa*qLt!GOpR$VJ!Ztrm=&{QPRxzPVrjATSVk-}mKEz3>mJLF z<-~GhJz_m$y<)v%d9gmRzOkKR{bKpC{;>hEfw4ic!Dd@yePLm7WH-&HulF@g&2{SB zwjyJ0eQj-1t64s`npQzHn$;pS%4as$&95`6d0>_|&2DO}JHo6Mp<7u~-(1r+cUD8) zQEp9F+^M9js%vWKBbigv88xbEswr!uRs>Zfr@GY)A&@>_Gr>kE1lIAu2|J&5>N=xl zh+@=<&?(*myDRSO*_nYeyE7Wwv!-e8+-gzS*zA;qJGSdtcTQJa8#}YQ zS(`(DjB%~?4YhSfJrB%r(4-!kj1!vFi>e!kGS`bx8Ml{Gf4I9>SHAAyUGdo7DFulg zu}xxjb6s6y1AUFGuQA3~*R-|P84Wy$jZeL=Athmq7ZudN18qEMuQkvgV}f|TQ9M5( z<&jupO2U{Ro^KQt+*m!YiN01g&6`uFhK;k;y2jb&L@3_`7=9GjnS(Kq!1XILQEj)0ibXA?((iM+QP01kEnvyW4 zifmeWpiO13w3WTmY2uZ(iB~!eTD3u|X+oV07k0&sgM_X}^T0W%v+X)ZcSiMwrpDPVylWSg6e27_7)R(K^bsZy z1_+B0mLM!eSdOp)VI{&UgdxI6gr$&Q3i+jwTMD_QkXs75rI1?+xuuX>3c00_TMD_Q zkXs75rI9{yPE#{YM6ti34CTT z+14eq0{T`!b_HZtKz0RWS3q_JWLH3T1!Px1b_HZtKz0RWS3vIy)ORK7yAtv%A-@vx zD~67nk{zY_8*A-@vxD~67s7czY6lJAioOot02D$@~a@f3i7KU zzY6lJAioOot02D$@~a@f3i3n94rHL1c(!>izZNv*jZNv*jZNv*j zZNv*jZNv*jZNv*jZN!TpzXRMWGCraR<1RhG@p#&aE;GqN_O5mXcK1$%D z1U^dOqXa%m;G+aSYQRSg_>k{Iz7P366M0r?5YPe6VG@)MAsfcymH2aq2?egOFa#gJbN`Nfc54Ee>7Ukv%hkY5b>#gJbN`Nfc54Ee>7Ukv$R0`U^a zFM<3L$S;BX638!s{1V77f&3E4FM<3L$S;BX638!s{1V6q6NrNe#7iL`j35q15CWUV1JUC^^f(Yb4n&Uw z(c?h$I1oJ!M2`c}<3RK{5Iqh=j|0);K=e2eJq|>V1JUC^^f(Yb4n&Uw(c=;NO@w|E zq2EO4Hxc?xgmx1}_Uz{B`E>++Gi{FVEXKzo4>;~&4EKQJ9&p?Pj(fmyudpO-PE*qn z)icS=Psv4;!~>dpKywdh?g7m`pt%P$_kiXe(A)!>dq8s!Xzl^cy&^G!ctv6a@rp!E zc))NE814bXJz%&84EKQH9x&VkhI{dNj1Y2WT|?7?E~NnE9)O%qe-c#&Aol>|9)R2f zkb3}f4?yk#$UOkL2O#$V716+H6YY%Yk0j@p3wFkKN0N1p;Rn#Zo z+5=pBfNKwM?E$Vmz_kas_5jx&;MxORdw^>XaP0xEJ-{_>KoxQU*B;>716+H6YY%Yk z0j@p3wFkKN0M{Pi+5=pBfNKwM?E#KGz_ACo^#HdX;MOay(p#Gvn_ALp>uL8z3vI$+ zDW|+)-kfS4wW}MOTI(9>>Z@bnyq0>h&G}_3q-_@LR(l*xkMUS+;#{`PL;N0_mU6Q* zacRPMyJ*$Z)n~OqfebfF^vh*_pY8dubSqH=FY6G zR`zLACbTIB)YFU&m#j>xS0~SD(x=qVo?ER>t!^_>3U$()dbN`NpVU$xWBDXYkbxVL zX{WkV@mO7o1{M`SsLRUFW7%!u_vEAeqRyY!X438YY^ID}Ti4K9Z6Yu2X!=2AKhm}o zQi)}zAHh{>5GpmcDM!_tO+p{Fc}|nj!jvh}d7!qEPLQk4BYkSm_Z{xFYj(*tCBfJ_gN=>al5K&A)C^Z=P2Ak&Kk)$(EX`h|k(`G89w zX0H#p^Z}PX;L-sTz0HqJ0 z^Z}GUfYJw0`T$BFKsEu zV5AR>^nsB+OkE$Qt`C~z13P_Srw{D(ft^0E(+76?z)m07=>t1`V5bl4^nsl|u+s;2 z`oK;f*y#g1ePE{#?DT=1KCsgVcKX0hAK2*wJAGiM5A5`Toj$PB2X^|vP9NAw$8U=F z0POUEoj$PB2X^|vP9NCm13P_Srw{D(ft^0E(+76?Fm-*Hx;{)@AEvGkZ1sVyK1^L7 zrmhcD*N3U=1ABd7uMh0?Ve0xYb$yt+K1^L7rmhcD*N3U=!_@U*>iRHseVDpFOkE$Q zt`Ae!hpFqs)b(NN`Y?5Un7TepT_2{d4^!8Nsq4ek^%-LbVe0xYb$yt+K1^L7rmhcD*N3U=!_@U*>iRHseVDpFOkE$Qt`Ae!hpFqs)b(NN z`Y?5Un7TepT_2{d4^!8Nsq4ek^%-LbVe0xYb$yt+ zK1^L7rmhcD*N3U=!_@U*>iU=j_c00X!}Rqr3GTxL_F)41FoAuTz&=c1A11I5{P%(X zKJecM{`IFZ0Ok-#{Sz&Me>IFZ0O zk-#{Sz&Me>IFZ0Ok-#{Sz&Me>IFZ0Ok-#{Sz&Me>IFZ0Ok-#{Sz&Me>IFZ0Ok-#{S zz&Me>IFZ0Ok-#{Sz&Me>IFZ0Ok-#{Sz&Me>IFZ0Ok-#{Sz&Me>IFYC*bs4`%RFsb{ zOtt}x6$y+L35*p9j1>ut6$y+L35*p9j1>ut6$y+L35*p9j1?q{V`&0?J%PTSKwnRw zuP4yg6X@#+^z{V#dIDTO0j{4w-%p_LC(!p3==%xu{RH}c0)0P$zMnwfPoVE7(DxJQ z`w8^@1p0mgeLsP|pFrPFpid{zrxWPY3H0d%`gDN47ogq)^t}LmFF+p((1!x_p#Xg- zKpzUwhXVAW0DUMx9}2*k190X5eJKF<4ZwW^aNYo%Hvs1iz{3X z0Gu}f=MBJl1908|oHqdH4ZwK=a9%p;oVSkvoHqdH4ZwK=aNYo%Hvs1iz&*xNHC}8-U9O;IIKWYyb`$fWrphumL!101g{~ z!v^560XS>`4jX{O2H>s%xN89J8i2b7;I09m#IBNjT8i2C~;H&{SYXHs~fU^eRtN}P{0L~hKvj*U-0XS;_&KiKT2H>m# zIBNjT8UTv|U{L@p3V=lcuqXf)1;C;JSQG$@0$@=9EDC@{0k9|l76rhf09X_NivnO# z04xfCMFFrV02T$nq5xPF0E+@(Q2;CofJFhYC;%1(z@h+H6ab3?U{L@p3V=lcuqXf) z1;C;JSQLP>2Ec~^I1~Vf0^m>p914I#0dOb)4h6uW05}u?hXUYG02~UySp#s^0Gu@d zXAQtv18~*=oHYPv4Zv9g;8*}03xHz*a4Z0h1;DWYI2HiM0^nEx91DPB0dOn;js?K6 z05}!^#{%G302~W|V*zk10FDK~u>d$00LKF0SO6RgfMWqTYyj>WfV&3Zt^sf^0L}%# zxd1p9BykShH2`-Fz+D4y*8to#0Cx?*T?25}0NgbIcMZT@i!r_yV|*>f_)3Sb@o}{n z<7+X-*J6yX#TZ|UF}@aKd@aWKT8#0v7~^X(#@Awuuf>=vD8@KjjB&OY<7_d;*nh5WN9h5WN9h5WN9h2pbl2%Zvxr-a}sA^K5>eiWh~h3H2i`ca5} z6rvx6=tm*?QHXvNq928#9~D&zo=YL0Q>KvfI|_L}rI7O=3VA=Fkbn21kbn21kbn21 zkbnH7klPOwa(yY}`claCrI71OA)nJOsuJy&LdX~Gm(q|g+ApOcU$kFJL%wLgl!koK zekl$4qWw}D@HZZ7jw##hW?^` z7gdS&O(FCb?VHljU$k#ZLx0h}DGmJv52rNr7d)KO&|kD~N<)9qzKg0v`=${3i}p=v z=r7tgrJ=uQ-;{>_qJ2{u`iu5WY3MI-g3{1m-~^?izrcy2DuELeLVtl1l!pESCnyd5 z1x`>J`U{+(H1roZL22kOaDvj%U-0sxD#6Psg#Ln;QyTha?_&KGazu@PThW>(|QyTgUeokrVFZem7p}*kgl!pF-pBGgLeoi6u7yO*k z&|mO#N<)9a&nXT41wW@W^cVb`($HVKQzV(xRThlPE3f89a&7qMpH%C@tz4Jc-hx zp23rfz>_G1{=gaVB)Sgyz!~r)x(@w;GvG;d9rA%Q;7N2H`U7XclZwETD1?0A40sY< zhkW1+coJQQeBcat5?zOU;7kad34t@qa3%!Kgus~)I1>VALf}jYoC$$5A#f%H&V<035I7S8 zXF}ji2%HIlGa+y$1kQxOnGiS=0%th(XDr}>y?=69 zioGBiWA<242%HIlGa+y$1kQxOnGiS=0%tqa3%!Kgus~)I1`qJc6oBuo?V@cIpv+}6P@bLXl8lW#wT74nbq50NV$VoTk0MB zLUzg>of&7R$T$C62#?U&@MBW<=_lE<8|GgGIoGiro9JEM*Vnc?=8 zT(|v&lsiPNr`#cGJ>`y0G1)11bzV%BCd8-Q#V>SE$t$Tx_mrEG*PL;knL72IQF~nS zce}nbHnB6-l#DsFZ44`99ojpFXy(N2Rd3qi9gb&+yMXU5qncXeJ&l_u&U z)Q5jb0f zxq%3rEyCPD1kM&=ZXg0@i!e73fwM)J8;HQ!BFqg$;A|1*1|o2_2y+7w<_02gwg__r z5jb0fxq%3rEy7$t1dbMAE+7I&i!c`ufulvR{Ug}^5ja@{P8PxTkHEBI9UWv7J-9B;9wCrSOg9hfrCY`^&{B!5p4Si zoGSw7ieTGE;9LJe=92)23zTRnoU9>G?RV5>*4)g##I z5p47bHhKgbJ%WuM!A6f@qermOBiQH>Z1e~=dITFif{h-*Mvq{lN3hW&*ya&z^9Z(i z1lv4qmbL46mq!~a@&_eE|)?+_dp?+OCh&CDdch~Eo zQZBFGc%i^e3KMBu}$5CHXO~;~$CxyjJd#)q9v89bX6Vx{~i(kaJLA$M?zZf?t4gJNq zLA$U~PojTQI<7U;H&=^HM5m^UfiaI<)U+lqqi#f>rk~5TS~?~|3)`BT@E~eM^k%vP z8j9Xbd%jUB(VHoaQieu1&rT=ui}L#lWQ&2@H%E z`Jqjx$<#65I&)&JbLdRLZNb{08B~?l`92cQd+23DFBnw zq9Ilaz@)Tjh?N2`DJ_apDFBnwqRJ};FvcqdFj5FP0vIU`IRY3dE#zR*t-M%FzEQ|u zGKE|&g}eh$$mLSVI{<}TE`_`UP{?0(d9fgR6mq@Givk(<;+2R~qpe8BsfTvPX=i0;oVJa0#%W1uXFN!W zm!!mbxsZQ(%JqtrIF-9IADY@t#%VUVE1ps|nx*Wzo>Cr~J?pw&oDxqdkEkb6o-nmM zOc&HKeQl%#k|;APC*riyxHHb`P%P?*Dg<$*5bsh<0#cf{H^O;7U{Q$QMgO35@^`c! zK@^D(psk30KxsTD+C8PwCIkVbH1ZK2Ylufco@l3(M*d=eC4PbY1ks{2o)=>$@eZ^> zL4+vH+dqZ8-BZZ>3-J<^Q!I)hK9Y#Bwn&T0M$fIQt!LvAkrN0PC>K?V@t;DG2?iS? zB_cBnHU#>jqf`mBB(N7sVP>4t;&-edAaF-ouvCuk3vxyn8Bko zo)c`7(xP%`=8o$V3YJOa0rCW^q_n8CP_Rf!<9>l3Q7G_&Lea59!Rjb2>LC=Yi%1B{ zDaLC`BOk%Gh@7Av1iPX%$}iXzrBQytrYMc)1&bn5gXaZnqBP1Q*btE&{Eqq$1>2$P zkRw(CQ5yOR)GiGeU=_fgm}+RJ+xN1^L`dj-cRw)`&m4B zf9dF&>UmtY$kR(n^Sri87jBy_Onsi`oANuAUHs0=Myo}WRZji0FeP4;66YZ2&Z(Yz zG>(olh{;gBnym}i^dcQ}%IFM>iP53FXmmZfTI)=74i&|M0F%8ehJs>2fGI7ovRDvc zN(-zk76h2mq6rrZ0!(Q!UKNW8qNrF*5K)MH1<|E6@)Z+Alt#W{@d%}nufX@h5Q~ZN zaf#BriBrg%IE7-U01u((Q4YaFXr4@T2@rBhi~B*yDJ{BcVPWL7R#%S}2l25t!A8xl z8c#$lPFsZ=s^{nns_E1tdqMU5h5QXuJH4~^={%hUjTY-B>|Gcwb18%Q zvFhgPne{a@=p!+B}FN>QKIYBm!!&} zM9MFza!L{@zm%4zCMr@BsU;{)EkS9Ra$9*}N^vOBC6p4ZC8AlT7NHtB+FaAWE%+s4^u3N_1sF3HC}b*3tguLOzyZ+~nz$ z--_5cmhzh*!gTltJ(v0$PvbcnRk!(#r&E3_Ny(G_R)XJ(C|;cM8&Bi6%I$vRY5c~@ zoSG+36W$SNqHVjh+J1C>OH;!(7g%3Rxj@Zt+dD)DO}T?w#I|>c-X!j*pxs|_Y8jn( z;6j%aVyoNTAugocK?Co$d58-sca&^@hq%D*5FIS?N7FdehD0$>ppMx4@l!B~hW~BS z?Dxu)-&r~pIf(HnlQmqTTsBDyRNI zH8;1Zxv8e6sq-3B3)h@^)veWYMlYzZtxI_&H0*U&IDgNgXK;n%wB|tkA8eN{-YzW~ zU)TMDfZ$n{N6P)Q5h+Z~kEQ<~dv5|}Wm4UZ*Sp^3y?fujeS6=V-iJYkVGtQaf`|+v z!yqCegNTSNA`(IfA&7(!LXaRIA0bE(v1#}dL_!GiA@(2=LJ$#=K}2K-VvE?*B0)s# z{(k4wd%LSQhGk~HV^7@2OK&r}kZyN555h^jmgLx`zera3|UHTa`_}RoV1g zl}*1@*(&cqd{e_szg5}vyDPsco4%{E)o;&qkxjo<+4NhLO~1RkS7oR4O}gSVbM>A2 zosymUosymUosymUos!MJ66E_FZ#8W6Ta`z@ReAJV4V%iV zrWc2!i)=N$Qr}hCYI^Z^CEjX!(Kj`{Qoq%(sOgpZu7*3M6N-NLE+BSia&n{Z?hsZ#CX(dND7) zt6@{qEA?HKr>0j|ztr?%f4j)0?`pi&^h)uoI!%R}!wk16ou+=L!kzk^lAZdU3U}&v zN;dy?bw;?FUa8-zY&E@7-&NUadhvHfHpNQ~H~m&+({DB0^jnopztwQ7yyTZEyQ|;y zyDPt{Q#HMamwu~ZQ`0N;T@4$3SHqT)&2sTA6}Hsxl^^{7y+4t3`AAue}IxTJwt;-kcmUGB( zcpXz8!(E)_j8izx(GHicF-YkcT49i){CHaZF|gwY4u*9M1aLY`{hoE@V92M3LC8gIBCcu4DhP)1BRMW%A`=*Q)f118t`a0=>yL5yQKRP~0rAQY8o>V?a1-T!1@al?^%5p#O*wy_Y73Y5F zuZU8WI6xU*;sBhY-T|tz2FT&1E9{*ex*i~hfbAbTVj{H|ZJ(;ZjruRrQkaLX*8k+k zo}^IXOvDJ@bR>T~-B zSH7N&nlv_1?DOy)PMIOf^<%gV;z$wwx_?Vlb)Nj;E@fY6pk<`$0`o}(tXG5?M zAFsm%ojV>SBBobAHa9w#O30i~e**jdW`CTre5CGUGddB{yAnP!?ZwZ2EUg>0?xVQA z@kKmm@?srdq0W^8j=(GPGS8^|9ewKQcJwW0QhiT7 zE%0Xuuh2zIXl-r4HBbUV;6?ExpuSrOeUs4eGWC~)f!C=w1OG?;AAxVt8-c%M)Cj|< zHEV^2_jmgV1F!GC4S0X^Dc}Rlmw+EJn}NS-z6!j>Yytjj^Vh&{n!f>l%e(~~@5KWD zt@&Hvcg#D$e`gg6%__3`2*WD3-UocF^-E;U5P2yZoa-d9Qy8@Q?UE1^R6NY~Y{ve+Kwm zKf;NZy#5&YeE$OAf9n4n@TLBxz(4Q*BJg$ozX!h2zX|x4{9l5!&Hin`zv}-v=uQ6r z0_C=22@P*ueNpIm)d~D~&k6i^/CUP}V~H-TcLn~9Xu*%aXI?;j#{Ue+%N3-5UU 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%0DCNrCg{JfYmY-NNc{#!7Sa7k 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 literal 0 HcmV?d00001 diff --git a/app/javascript/images/icon_blocks.png b/app/javascript/images/icon_blocks.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1490875fc2711ad6dc027a28d54cb472e65dcf GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A)o zB%;Kzv?L?Hh=GA)ruR9GQ|GWu$!AX&$B>A_Z>KYI9ai9ReeCz_ z?3auxqvgfS>RX>JzsS4ILBQ*_P5mObMe*jB?LXXGe$)M&rSYGIhDEc4<|Lp0{^Epa zQ!tmJ&vC&c(;lP?6!1=&ACZ0ZRI0$sCE2`1pV#GD{y3cfwyDD~PkJ?j@4tz6(!V6L zXK65ph)!UVVS6_x{D3Tj&>eo6#s-lW&BdZYfedF&#hcbU7#9m3QDwEdX{s2(wdbr| zqrha74iN{1X_^PxB33f6C+%bk<`8Aw;qA3S_werq38$wz6P#AeYjc^AJ-Wu$#qW`$B>A_Z>KYI9ai9Ry?m*9 zwfg_y7j4BGJxw)lXDGOAI9q?LC1}xYHr-C%wFzLa6KS!ZQK0jR>tOE7Vb?gp1uxRU=|7BvkdN;CL XEtmYC+$OLU=tTxkS3j3^P6u;_X2 zT)(Wflb5>MxU@7S-CSeBc%aBm%}{UYo}y_%x2`+PKhGz!YHRepWQWWTJGZW2yg2g$ z&xV;Dwoi1_4yEKwe95CTgXuz|tP%^~0Y;04dJRRF#Y>a?U0+NT`X=^4X2JZne5Z@Q zzD>Ry5FfWr=tglukBZCDL#z6B@oYJz_A5W*pv#V6hq}y5+UF&G5;hwNy%xKGXJb(2^IFgSXaR_B{|EQ9c53+XiS6M10I#0P=Lx$p&Z7{p}W%M_HspIOjgr zCj!Lz-#Pm?`T!uY@YDcjdQ#9g-~zypD2G0XO9t3TN|^=00DNaY1NdSSbk4%MV(iH+ zHRw*L4KqDv$V^Vxe3FPKptjW+yfk&*INGh#^^$1P*vN_h@~#<8-q zXZJGQ00c>oZZPm0Z8^^tn!87fQRME2M^t=5v{B@DnKG6UI;mJbU&nc_8+>4PjY7{u z8>os7ztw;Mhlz*{kN`-9k_}pgj=S=Lr&*A9*gJw&lMF1Q(kdm7y3~@&Pa|IAdjdcr z=h8C?F+^je!5>FJhC!|+4U8w$RARIEXvF|l%)mKb9IjjD0>TnN#Q&p^oW|GrU4Dm& zT<}#!LJE__gavz`ZtbkcPRmY|!Yo*&_X7s_S5+}S-(ia(y$dHIK~a{Rn1L)3Mmy7I z9981lpg_G^6J|zej2gI%%ftO{q=@Sg(P)3{Bq2*=nGlMLis{^pChKYGrCq9**nuk?1BdhXQ16d}7yN1Rs z+Qsf7%8(wjKR{tcaeD&GZuh=feHRUN*q-QYGIH;jVD*0QrKtPS$vix(XD(r1k@>Ky z!K&P=D#4}dC{KZG?CQ892ex!oOJ=Ox(cYSwsKuP3+S1Azh&_*PJt&2QSr2ym&kg0HxI?O4i0NpVMM^X?e5^V~EMq-Hvu!bj) zJ`Q08l&}Is1x^Bc1LQ~E0wg8g2Vw#p`T!QE1ZX?n%_z|cX;D~2TQLO}{T6T|UV)2u zLQbLvyjg)eaC#JwPvD4V0{1p002ovPDHLk FV1jR;pN9Yd literal 0 HcmV?d00001 diff --git a/app/javascript/images/icon_pin.png b/app/javascript/images/icon_pin.png new file mode 100644 index 0000000000000000000000000000000000000000..2329d8c54d8b1707771166c18ee74990a842f328 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgP*A)o zB%;Kzv?L?Hh=GA)ruR9GQ|GWu$pcRp$B>A_Z^HxmniY6*&%R?d zZ@$apcTB_SnOWg7k&n&OP1HKReBIl`rNF{1U~yhoq1#}JL&7A1iS~+dn?(~#K3!JX zu=OU-Qn!}pRsCDlPUktT+86lEeQQuQzxa^|Q(uj#$A4-*+0)C?7f{3Za~5a(X5Qeh zhNi4_lk~nFFpCiTMZBH84jR)isK-3Y6Ryv>H5vfsn|NpGJghS>~b#5WP1^(CAc3*RW<#gz01~4doqdTg=;}VN+rIC?wp?&{)li8p(X_u>!P#&Mo_a zJwaQBeLqOC^nd^_yl9++kjpBcYPr;|2TyqmQpri#RrRmS&niP_5!kjYZk8{Hv#u*7 zGDmPBU9;P@*<@rjz?R=R*Cs%$z0Wn5l)jMQENge)oQ{3)ApurE86Wt5K4>fg^;*w( znn2S7<@_!$lk;RUJKxXq?q9o+2XtdUup*Qevtm%5cO#<@Q(!eFV&;7k_)!W55;jY0 z^7+}9(OreaK5C=Uoch~yXW9eV2iF&|_JdB#C>=TlOE2023g@}tn)R>etjH5zTofqf z7h_$HR9-xP2o!yIi#skaf;Ws7r#C(4Q WVruvNdu`AF0000b&Wn>zY40sxmSf%sv>lo1<*wT=?ilad}bAV zzu!#a^J%ZPa|zt8nO=t6$-SNQBxm#i-6~Tf5}$-bR$OVbK%z=SlMXgCLjxp*h)@Ge|0-|}bGT8icT!=xr4@1=NGf`+!Huk%2oWcYCFJj@@MhILC`?W7+%C z^L7Ndh=kk+kETJ2>f^;xl{C<6R&t%^KuM71N#FM8O)5I8)sjSwhy?e#CL!quuVgiK zYZ9uF7r(8;avcQ+UId3{@IFU~?f*QEXH<5rWa-IwfoxXTsMandDLoES<%<;4qZCAO zf=HuRsqjnvP*vo^8aV4glgQ&&opPN4UNkEeG2B-Kh9V#juRAXtSN1gX<8iU&O$`G1L2;#;Nn(XBZi{XED9tJDB_lsAQU_i(`n!#MU5Bz9R}e-m5IX zM7~|?|BUVYqi3BN9+w%6#he6h^hH`M_u-y%J#*{D3at+z{EC~y+0Bl;U#E5P-?d(& zEskm{qVkSKALU5csJYq0f8GQx-JY`x>~Ea;H^U{!^3`UQ+=;=G%B5zr8-BYkoEx1k z&b5#Ej_%aF8lH(?ZtU4VJ&fP{=y4Av?vVVH=wH+80-QhV@2?M!W8CaC3+O@yPgg&e IbxsLQ0B15`MF0Q* literal 0 HcmV?d00001 diff --git a/app/javascript/styles/win95.scss b/app/javascript/styles/win95.scss new file mode 100644 index 00000000000..994fab4bff7 --- /dev/null +++ b/app/javascript/styles/win95.scss @@ -0,0 +1,1457 @@ +$win95-bg: #bfbfbf; +$win95-window-header: #00007f; +$win95-tooltip-yellow: #ffffcc; + +@mixin win95-border-outset() { + border-left: 2px solid #efefef; + border-top: 2px solid #efefef; + border-right: 2px solid #404040; + border-bottom: 2px solid #404040; + border-radius:0px; +} + +@mixin win95-outset() { + box-shadow: inset -1px -1px 0px #000000, + inset 1px 1px 0px #ffffff, + inset -2px -2px 0px #808080, + inset 2px 2px 0px #dfdfdf; + border-radius:0px; +} + +@mixin win95-border-inset() { + border-left: 2px solid #404040; + border-top: 2px solid #404040; + border-right: 2px solid #efefef; + border-bottom: 2px solid #efefef; + border-radius:0px; +} + +@mixin win95-border-slight-inset() { + border-left: 1px solid #404040; + border-top: 1px solid #404040; + border-right: 1px solid #efefef; + border-bottom: 1px solid #efefef; + border-radius:0px; +} + +@mixin win95-inset() { + box-shadow: inset 1px 1px 0px #000000, + inset -1px -1px 0px #ffffff, + inset 2px 2px 0px #808080, + inset -2px -2px 0px #dfdfdf; + border-width:0px; + border-radius:0px; +} + + +@mixin win95-tab() { + box-shadow: inset -1px 0px 0px #000000, + inset 1px 0px 0px #ffffff, + inset 0px 1px 0px #ffffff, + inset 0px 2px 0px #dfdfdf, + inset -2px 0px 0px #808080, + inset 2px 0px 0px #dfdfdf; + border-radius:0px; + border-top-left-radius: 1px; + border-top-right-radius: 1px; +} + +@mixin win95-reset() { + box-shadow: unset; +} + +@font-face { + font-family:"premillenium"; + src: url('../fonts/premillenium/MSSansSerif.ttf') format('truetype'); +} + +@import 'application'; + +body { + font-size:13px; + font-family: "MS Sans Serif", "premillenium", sans-serif; + color:black; +} + +.ui, +.ui .columns-area, +body.admin { + background: #008080; +} + +.loading-bar { + height:5px; + background-color: #000080; +} + +.tabs-bar { + background: $win95-bg; + @include win95-outset() + height: 30px; +} + +.tabs-bar__link { + color:black; + border:2px outset $win95-bg; + border-top-width: 1px; + border-left-width: 1px; + margin:2px; + padding:3px; +} + +.tabs-bar__link.active { + @include win95-inset(); + color:black; +} + +.tabs-bar__link:last-child::before { + content:"Start"; + color:black; + font-weight:bold; + font-size:15px; + width:80%; + display:block; + position:absolute; + right:0px; +} + +.tabs-bar__link:last-child { + position:relative; + flex-basis:60px !important; + font-size:0px; + color:$win95-bg; + + background-image: url("../images/start.png"); + background-repeat:no-repeat; + background-position:8%; + background-clip:padding-box; + background-size:auto 50%; +} + +.drawer .drawer__inner { + overflow: visible; + height:inherit; +} + +.drawer__pager { + overflow-y:auto; +} + +.column { + max-height:100vh; +} + +.column > .scrollable { + background: $win95-bg; + @include win95-border-outset() + border-top-width:0px; +} + +.column-header__wrapper { + color:white; + font-weight:bold; + background:#7f7f7f; +} + +.column-header { + padding:2px; + font-size:13px; + background:#7f7f7f; + @include win95-border-outset() + border-bottom-width:0px; + color:white; + font-weight:bold; +} + +.column-header__wrapper.active { + background:$win95-window-header; +} + +.column-header__wrapper.active::before { + display:none; +} +.column-header.active { + box-shadow:unset; + background:$win95-window-header; +} + +.column-header.active .column-header__icon { + color:white; +} + +.column-header__button { + background: $win95-bg; + color: black; + line-height:0px; + font-size:14px; + max-height:20px; + padding:0px 2px; + margin-top:2px; + @include win95-outset() +} + +.column-header__button.active, .column-header__button.active:hover { + @include win95-inset(); + background-color:#7f7f7f; +} + +.column-header__back-button { + background: $win95-bg; + color: black; + padding:2px; + max-height:20px; + margin-top:2px; + @include win95-outset() + font-size:13px; + font-weight:bold; +} + +.column-back-button { + background:$win95-bg; + color:black; + @include win95-outset() + padding:2px; + font-size:13px; + font-weight:bold; +} + +.column-back-button--slim-button { + position:absolute; + top:-22px; + right:4px; + max-height:20px; + max-width:60px; + padding:0px 2px; +} + +.column-back-button__icon { + font-size:11px; + margin-top:-3px; +} + +.column-header__collapsible { + border-left:2px outset $win95-bg; + border-right:2px outset $win95-bg; +} + +.column-header__collapsible-inner { + background:$win95-bg; + color:black; +} + +.column-header__collapsible__extra { + color:black; +} + +.column-header__collapsible__extra div[role="group"] { + border: 2px groove $win95-bg; + border-radius:4px; + margin-bottom:8px; + padding:4px; +} + +.column-settings__section { + color:black; + font-weight:bold; + font-size:11px; + position:relative; + top: -12px; + left:4px; + background-color:$win95-bg; + display:inline-block; + padding:0px 4px; + margin-bottom:0px; +} + +.setting-meta__label, .setting-toggle__label { + color:black; + font-weight:normal; +} + +.setting-meta__label span:before { + content:"("; +} +.setting-meta__label span:after { + content:")"; +} + +.setting-toggle { + line-height:13px; +} + +.react-toggle .react-toggle-track { + border-radius:0px; + background-color:white; + @include win95-border-inset(); + + width:12px; + height:12px; +} + +.react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track { + background-color:white; +} + +.react-toggle .react-toggle-track-check { + left:2px; + transition:unset; +} + +.react-toggle .react-toggle-track-check svg path { + fill: black; +} + +.react-toggle .react-toggle-track-x { + display:none; +} + +.react-toggle .react-toggle-thumb { + border-radius:0px; + display:none; +} + +.text-btn { + background-color:$win95-bg; + @include win95-outset() + padding:4px; +} + +.text-btn:hover { + text-decoration:none; + color:black; +} + +.text-btn:active { + @include win95-inset(); +} + +.setting-text { + color:black; + background-color:white; + @include win95-inset(); + font-size:13px; + padding:2px; +} + +.setting-text:active, .setting-text:focus, +.setting-text.light:active, .setting-text.light:focus { + color:black; + border-bottom:2px inset $win95-bg; +} + +.column-header__setting-arrows .column-header__setting-btn { + padding:3px 10px; +} + +.column-header__setting-arrows .column-header__setting-btn:last-child { + padding:3px 10px; +} + +.missing-indicator { + background-color:$win95-bg; + color:black; + @include win95-outset() +} + +.missing-indicator > div { + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRUaXRsZQAACJnLyy9Jyy/NSwEAD5IDblIFOhoAAAAXelRYdEF1dGhvcgAACJlLzijKz0vMAQALmgLoDsFj8gAAAQpJREFUOMuVlD0OwjAMhd2oQl04Axfo0IGBgYELcAY6cqQuSO0ZOEAZGBg6VKg74gwsEaoESRVHjusI8aQqzY8/PbtOEz1qkFSn2YevlaNOpLMJh2DwvixhuXtOa6/LCh51DUMEFkAsgAZD207Doin8mQ562JpRE5CHBAAhmIqD1L8AqzUUUJkxc6kr3AgAJ+NuvIWRdk7WcrKl0AUqcIBBHOiEbpS4m27mIL5Onfg3k0rgggeQuS2sDOGSahKR+glgqaGLgUJs951NN1q9D72cQqQWR9cr3sm9YcEssEuz6eEuZh2bu0aSOhQ1MBezu2O/+TVSvEFII3qLsZWrSA2AAUQIh1HpyP/kC++zjVSMj6ntAAAAAElFTkSuQmCC') + no-repeat; + background-position:center center; +} + +.empty-column-indicator, +.error-column { + background: $win95-bg; + color: black; +} + +.status__wrapper { + border: 2px groove $win95-bg; + margin:4px; +} + +.status { + @include win95-border-slight-inset(); + background-color:white; + margin:4px; + padding-bottom:40px; + margin-bottom:8px; +} + +.status.status-direct { + background-color:$win95-bg; +} + +.status__content { + font-size:13px; +} + +.status.light .status__relative-time, +.status.light .display-name span { + color: #7f7f7f; +} + +.status__action-bar { + box-sizing:border-box; + position:absolute; + bottom:-1px; + left:-1px; + background:$win95-bg; + width:calc(100% + 2px); + padding-left:10px; + padding: 4px 2px; + padding-bottom:4px; + border-bottom:2px groove $win95-bg; + border-top:1px outset $win95-bg; + text-align: right; +} + +.status__wrapper .status__action-bar { + border-bottom-width:0px; +} + +.status__action-bar-button { + float:right; +} + +.status__action-bar-dropdown { + margin-left:auto; + margin-right:10px; +} +.status.light .status__content a { + color:blue; +} + +.dropdown__trigger.icon-button { + padding-right:6px; +} + +.detailed-status { + background:white; + background-clip:padding-box; + margin:4px; + border: 2px groove $win95-bg; + padding:4px; +} + +.detailed-status__display-name { + color:#7f7f7f; +} + +.detailed-status__display-name strong { + color:black; + font-weight:bold; +} +.account__avatar, +.account__avatar-overlay-base, +.account__header__avatar, +.account__avatar-overlay-overlay { + @include win95-border-slight-inset(); + clip-path:none; + filter: saturate(1.8) brightness(1.1); +} + +.detailed-status__action-bar { + background-color:$win95-bg; + border:0px; + border-bottom:2px groove $win95-bg; + margin-bottom:8px; + justify-items:left; + padding-left:4px; +} +.icon-button { + background:$win95-bg; + @include win95-border-outset() + padding:0px 0px 0px 0px; + margin-right:4px; +} +.icon-button, +.icon-button.inverted, +.icon-button:hover, +.icon-button.inverted:hover { + color:#3f3f3f; +} + +.icon-button:active { + @include win95-border-inset(); +} + +.status__action-bar > .icon-button { + padding:0px 15px 0px 0px; + min-width:25px; +} + +.icon-button.star-icon, +.icon-button.star-icon:active { + background:transparent; + border:none; +} + +.icon-button.star-icon > i { + background:$win95-bg; + @include win95-border-outset() + padding-bottom:3px; +} + +.icon-button.star-icon:active > i { + @include win95-border-inset(); +} + +.detailed-status__action-bar-dropdown { + margin-left:auto; + justify-content:right; + padding-right:16px; +} + +.detailed-status__button { + flex:0 0 auto; +} + +.detailed-status__button .icon-button { + padding-left:2px; + padding-right:25px; +} + +.status-card { + border-radius:0px; + background:white; + border: 1px solid black; + color:black; +} + +.status-card:hover { + background-color:white; +} + +.status-card__title { + color:blue; + text-decoration:underline; + font-weight:bold; +} + +.load-more { + width:auto; + margin:5px auto; + background: $win95-bg; + @include win95-outset(); + color:black; + padding: 2px 5px; + + &:hover { + background: $win95-bg; + color:black; + } +} + +.status-card__description { + color:black; +} + +.account__display-name strong, .status__display-name strong { + color:black; + font-weight:bold; +} + +.account .account__display-name { + color:black; +} + +.account { + border-bottom: 2px groove $win95-bg; +} + +.reply-indicator__content .status__content__spoiler-link, .status__content .status__content__spoiler-link { + background:$win95-bg; + @include win95-outset() +} + +.reply-indicator__content .status__content__spoiler-link:hover, .status__content .status__content__spoiler-link:hover { + background:$win95-bg; +} + +.reply-indicator__content .status__content__spoiler-link:active, .status__content .status__content__spoiler-link:active { + @include win95-inset(); +} + +.reply-indicator__content a, .status__content a { + color:blue; +} + +.notification { + border: 2px groove $win95-bg; + margin:4px; +} + +.notification__message { + color:black; + font-size:13px; +} + +.notification__display-name { + font-weight:bold; +} + + +.drawer__header { + background: $win95-bg; + @include win95-border-outset() + justify-content:left; + margin-bottom:0px; + padding-bottom:2px; + border-bottom:2px groove $win95-bg; +} + +.drawer__tab { + color:black; + @include win95-outset() + padding:5px; + margin:2px; + flex: 0 0 auto; +} + +.drawer__tab:first-child::before { + content:"Start"; + color:black; + font-weight:bold; + font-size:15px; + width:80%; + display:block; + position:absolute; + right:0px; + +} + +.drawer__tab:first-child { + position:relative; + padding:5px 15px; + width:40px; + font-size:0px; + color:$win95-bg; + + background-image: url("../images/start.png"); + background-repeat:no-repeat; + background-position:8%; + background-clip:padding-box; + background-size:auto 50%; +} + +.drawer__header a:hover { + background-color:transparent; +} + +.drawer__header a:first-child:hover { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); + background-repeat:no-repeat; + background-position:8%; + background-clip:padding-box; + background-size:auto 50%; + transition:unset; +} + +.drawer__tab:first-child { + +} + +.search { + background:$win95-bg; + padding-top:2px; + padding:2px; + border:2px outset $win95-bg; + border-top-width:0px; + border-bottom: 2px groove $win95-bg; + margin-bottom:0px; +} + +.search input { + background-color:white; + color:black; + @include win95-border-slight-inset(); +} + +.search__input:focus { + background-color:white; +} + +.search-results__header { + background-color: $win95-bg; + color:black; + border-bottom:2px groove $win95-bg; +} + +.search-results__hashtag { + color:blue; +} + +.search-results__section .account:hover, +.search-results__section .account:hover .account__display-name, +.search-results__section .account:hover .account__display-name strong, +.search-results__section .search-results__hashtag:hover { + background-color:$win95-window-header; + color:white; +} + +.drawer__inner, +.drawer__inner.darker { + background-color:$win95-bg; + border: 2px outset $win95-bg; + border-top-width:0px; +} + +.navigation-bar { + color:black; +} + +.navigation-bar strong { + color:black; + font-weight:bold; +} + +.autosuggest-textarea__textarea, .spoiler-input__input { + border-radius:0px; + @include win95-border-slight-inset(); +} + +.autosuggest-textarea__textarea { + border-bottom:0px; +} + +.compose-form__uploads-wrapper { + border-radius:0px; + border-bottom:1px inset $win95-bg; + border-top-width:0px; +} + +.compose-form__upload-wrapper { + border-left:1px inset $win95-bg; + border-right:1px inset $win95-bg; +} + +.compose-form__buttons { + background-color:$win95-bg; + border-radius:0px; + box-shadow:unset; + border:2px groove $win95-bg; + margin-top:4px; + padding:4px 8px; +} + +.privacy-dropdown.active +.privacy-dropdown__value { + background: $win95-bg; + box-shadow:unset; +} + +.privacy-dropdown__option.active, .privacy-dropdown__option:hover, +.privacy-dropdown__option.active:hover { + background:$win95-window-header; +} + +.privacy-dropdown.active .privacy-dropdown__dropdown { + box-shadow:unset; + color:black; + @include win95-outset() + background: $win95-bg; +} + +.privacy-dropdown__option__content { + color:black; +} + +.privacy-dropdown__option__content strong { + font-weight:bold; +} + +.compose-form__warning::before { + content:"Tip:"; + font-weight:bold; + display:block; + position:absolute; + top:-10px; + background-color:$win95-bg; + font-size:11px; + padding: 0px 5px; +} + +.compose-form__warning { + position:relative; + box-shadow:unset; + border:2px groove $win95-bg; + background-color:$win95-bg; + color:black; +} + +.compose-form__warning a { + color:blue; +} + +.compose-form__warning strong { + color:black; + text-decoration:underline; +} + +.compose-form__buttons button.active:last-child { + @include win95-border-inset(); + background: #dfdfdf; + color:#7f7f7f; +} + +.compose-form__upload-thumbnail { + border-radius:0px; + border:2px groove $win95-bg; + background-color:$win95-bg; + padding:2px; + box-sizing:border-box; +} + +.compose-form__upload-thumbnail .icon-button { + max-width:20px; + max-height:20px; + line-height:10px !important; +} + +.compose-form__upload-thumbnail .icon-button::before { + content:"X"; + font-size:13px; + font-weight:bold; + color:black; +} + +.compose-form__upload-thumbnail .icon-button i { + display:none; +} + +.emoji-dialog.with-search { + box-shadow:unset; + border-radius:0px; + background-color:$win95-bg; + border:1px solid black; + box-sizing:content-box; + +} + +.emoji-dialog .emoji-search { + color:black; + background-color:white; + border-radius:0px; + @include win95-inset(); +} + +.emoji-dialog .emoji-search-wrapper { + border-bottom:2px groove $win95-bg; +} + +.emoji-dialog .emoji-category-title { + color:black; + font-weight:bold; +} + +.reply-indicator { + background-color:$win95-bg; + border-radius:3px; + border:2px groove $win95-bg; +} + +.button { + background-color:$win95-bg; + @include win95-outset() + border-radius:0px; + color:black; + font-weight:bold; +} + +.button:hover, .button:focus { + background-color:$win95-bg; +} + +.button:active { + @include win95-inset(); +} + +#Getting-started { + background-color:$win95-bg; + @include win95-inset(); + border-bottom-width:0px; +} + +#Getting-started::before { + content:"Start"; + color:black; + font-weight:bold; + font-size:15px; + width:80%; + text-align:center; + display:block; + position:absolute; + right:2px; +} + +#Getting-started { + position:relative; + padding:5px 15px; + width:60px; + font-size:0px; + color:$win95-bg; + + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); + background-repeat:no-repeat; + background-position:8%; + background-clip:padding-box; + background-size:auto 50%; +} + +.column-subheading { + background-color:$win95-bg; + color:black; + font-size:0px; + border-bottom: 2px groove $win95-bg; + padding:0px; + margin:0px; +} + +.column-link { + background-color:transparent; + background-size:32px 32px; + background-repeat:no-repeat; + background-position: 36px 50%; + color:black; + padding-left:40px; + + &:hover { + background-color: $win95-window-header; + background-size:32px 32px; + background-repeat:no-repeat; + background-position: 36px 50%; + color:white; + } + + i { + font-size: 0px; + width:32px; + } +} + +.column-link[href="/web/timelines/public"] { + background-image: url("../images/icon_public.png"); + &:hover { background-image: url("../images/icon_public.png"); } +} +.column-link[href="/web/timelines/public/local"] { + background-image: url("../images/icon_local.png"); + &:hover { background-image: url("../images/icon_local.png"); } +} +.column-link[href="/web/pinned"] { + background-image: url("../images/icon_pin.png"); + &:hover { background-image: url("../images/icon_pin.png"); } +} +.column-link[href="/web/favourites"] { + background-image: url("../images/icon_likes.png"); + &:hover { background-image: url("../images/icon_likes.png"); } +} +.column-link[href="/web/blocks"] { + background-image: url("../images/icon_blocks.png"); + &:hover { background-image: url("../images/icon_blocks.png"); } +} +.column-link[href="/web/mutes"] { + background-image: url("../images/icon_mutes.png"); + &:hover { background-image: url("../images/icon_mutes.png"); } +} +.column-link[href="/settings/preferences"] { + background-image: url("../images/icon_settings.png"); + &:hover { background-image: url("../images/icon_settings.png"); } +} +.column-link[href="/about/more"] { + background-image: url("../images/icon_about.png"); + &:hover { background-image: url("../images/icon_about.png"); } +} +.column-link[href="/auth/sign_out"] { + background-image: url("../images/icon_logout.png"); + &:hover { background-image: url("../images/icon_logout.png"); } +} + +.getting-started__footer { + display:none; +} + +.getting-started__wrapper::before { + content:"Mastodon 95"; + font-weight:bold; + font-size:23px; + color:white; + line-height:30px; + padding-left:20px; + padding-right:40px; + + left:0px; + bottom:-30px; + display:block; + position:absolute; + background-color:#7f7f7f; + width:200%; + height:30px; + + -ms-transform: rotate(-90deg); + + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + transform-origin:top left; +} + +.getting-started__wrapper { + @include win95-border-outset() + background-color:$win95-bg; +} + +.account__header { + background-color:#7f7f7f; +} + +.account__header .account__header__content { + color:white; +} + +.account__action-bar__tab > span { + color:black; + font-weight:bold; +} + +.account__action-bar__tab strong { + color:black; +} + +.account__action-bar { + border: unset; +} + +.account__action-bar__tab { + border: 1px outset $win95-bg; +} + +.account__action-bar__tab:active { + @include win95-inset(); +} + +.dropdown--active .dropdown__content > ul { + background:$win95-tooltip-yellow; + border-radius:0px; + border:1px solid black; + box-shadow:unset; +} + +.dropdown--active::after { + display:none; +} + +.dropdown--active .icon-button { + color:black; + @include win95-inset(); +} + +.dropdown--active .dropdown__content > ul > li > a { + background:transparent; +} + +.dropdown--active .dropdown__content > ul > li > a:hover { + background:transparent; + color:black; + text-decoration:underline; +} + +.dropdown__sep { + border-color:#7f7f7f; +} + +.detailed-status__action-bar-dropdown .dropdown--active .dropdown__content.dropdown__left { + left:unset; +} + +.dropdown > .icon-button, .detailed-status__button > .icon-button, +.status__action-bar > .icon-button, .star-icon i { + /* i don't know what's going on with the inline + styles someone should look at the react code */ + height: 25px !important; + width: 28px !important; + box-sizing: border-box; +} + +.status__action-bar-button .fa-floppy-o { + padding-top: 2px; +} + +.status__action-bar-dropdown { + position: relative; + top: -3px; +} + +.detailed-status__action-bar-dropdown .dropdown { + position: relative; + top: -4px; +} + +.notification .status__action-bar { + border-bottom: none; +} + +.notification .status { + margin-bottom: 4px; +} + +.status__wrapper .status { + margin-bottom: 3px; +} + +.status__wrapper { + margin-bottom: 8px; +} + +.icon-button .fa-retweet { + position: relative; + top: -1px; +} + +.embed-modal, .error-modal, .onboarding-modal, +.actions-modal, .boost-modal, .confirmation-modal, .report-modal { + @include win95-outset() + background:$win95-bg; +} + +.actions-modal::before, +.boost-modal::before, +.confirmation-modal::before, +.report-modal::before { + content: "Confirmation"; + display:block; + background:$win95-window-header; + color:white; + font-weight:bold; + padding-left:2px; +} + +.boost-modal::before { + content: "Boost confirmation"; +} + +.boost-modal__action-bar > div > span:before { + content: "Tip: "; + font-weight:bold; +} + +.boost-modal__action-bar, .confirmation-modal__action-bar, .report-modal__action-bar { + background:$win95-bg; + margin-top:-15px; +} + +.embed-modal h4, .error-modal h4, .onboarding-modal h4 { + background:$win95-window-header; + color:white; + font-weight:bold; + padding:2px; + font-size:13px; + text-align:left; +} + +.confirmation-modal__action-bar { + .confirmation-modal__cancel-button { + color:black; + + &:active, + &:focus, + &:hover { + color:black; + } + + &:active { + @include win95-inset(); + } + } +} + +.embed-modal .embed-modal__container .embed-modal__html, +.embed-modal .embed-modal__container .embed-modal__html:focus { + background:white; + color:black; + @include win95-inset(); +} + +.modal-root__overlay, +.account__header > div { + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAFnpUWHRUaXRsZQAACJnLzU9JzElKBwALgwLXaCRlPwAAABd6VFh0QXV0aG9yAAAImUvOKMrPS8wBAAuaAugOwWPyAAAAEUlEQVQImWNgYGD4z4AE/gMADwMB/414xEUAAAAASUVORK5CYII='); +} + + +.admin-wrapper::before { + position:absolute; + top:0px; + content:"Control Panel"; + color:white; + background-color:$win95-window-header; + font-size:13px; + font-weight:bold; + width:calc(100%); + margin: 2px; + display:block; + padding:2px; + padding-left:22px; + box-sizing:border-box; +} + +.admin-wrapper { + position:relative; + background: $win95-bg; + @include win95-outset() + width:70vw; + height:80vh; + margin:10vh auto; + color: black; + padding-top:24px; + flex-direction:column; + overflow:hidden; +} + +.admin-wrapper .sidebar-wrapper { + position:static; + height:auto; + flex: 0 0 auto; + margin:2px; +} + +.admin-wrapper .content-wrapper { + flex: 1 1 auto; + width:calc(100% - 20px); + @include win95-border-outset() + position:relative; + margin-left:10px; + margin-right:10px; + margin-bottom:40px; + box-sizing:border-box; +} + +.admin-wrapper .content { + background-color: $win95-bg; + width: 100%; + max-width:100%; + min-height:100%; + box-sizing:border-box; + position:relative; +} + +.admin-wrapper .sidebar { + position:static; + background: $win95-bg; + color:black; + width: 100%; + height:auto; + padding-bottom: 20px; +} + +.admin-wrapper .sidebar .logo { + position:absolute; + top:2px; + left:4px; + width:18px; + height:18px; + margin:0px; +} + +.admin-wrapper .sidebar > ul { + background: $win95-bg; + margin:0px; + margin-left:8px; + color:black; + + & > li { + display:inline-block; + + &#settings, + &#admin { + padding:2px; + border: 0px solid transparent; + } + + &#logout { + position:absolute; + @include win95-outset(); + right:12px; + bottom:10px; + } + + &#web { + display:inline-block; + @include win95-outset(); + position:absolute; + left: 12px; + bottom: 10px; + } + + & > a { + display:inline-block; + @include win95-tab(); + padding:2px 5px; + margin:0px; + color:black; + vertical-align:baseline; + + &.selected { + background: $win95-bg; + color:black; + padding-top: 4px; + padding-bottom:4px; + } + + &:hover { + background: $win95-bg; + color:black; + } + } + + & > ul { + width:calc(100% - 20px); + background: transparent; + position:absolute; + left: 10px; + top:54px; + z-index:3; + + & > li { + background: $win95-bg; + display: inline-block; + vertical-align:baseline; + + & > a { + background: $win95-bg; + @include win95-tab(); + color:black; + padding:2px 5px; + position:relative; + z-index:3; + + &.selected { + background: $win95-bg; + color:black; + padding-bottom:4px; + padding-top: 4px; + padding-right:7px; + margin-left:-2px; + margin-right:-2px; + position:relative; + z-index:4; + + &:first-child { + margin-left:0px; + } + + &:hover { + background: transparent; + color:black; + } + } + + &:hover { + background: $win95-bg; + color:black; + } + } + } + } + } +} + +.flash-message { + background-color:$win95-tooltip-yellow; + color:black; + border:1px solid black; + border-radius:0px; + position:absolute; + top:0px; + left:0px; + width:100%; +} + +.admin-wrapper table { + background-color: white; + @include win95-border-slight-inset(); +} + +.admin-wrapper .content h2, +.simple_form .input.with_label .label_input > label, +.admin-wrapper .content h6, +.admin-wrapper .content > p, +.admin-wrapper .content .muted-hint, +.simple_form span.hint, +.simple_form .check_boxes .checkbox label, +.simple_form .input.with_label.boolean .label_input > label, +.filters .filter-subset a, +.simple_form .input.radio_buttons .radio label, +a.table-action-link, +.simple_form .input.with_block_label > label, +.simple_form p.hint { + color:black; +} + +.table > tbody > tr:nth-child(2n+1) > td, +.table > tbody > tr:nth-child(2n+1) > th { + background-color:white; +} + +.simple_form input[type=text], +.simple_form input[type=number], +.simple_form input[type=email], +.simple_form input[type=password], +.simple_form textarea { + color:black; + background-color:white; + @include win95-border-slight-inset(); +} + +.simple_form button, +.simple_form .button, +.simple_form .block-button +{ + background: $win95-bg; + @include win95-outset() + color:black; + font-weight: normal; + + &:hover { + background: $win95-bg; + } +} + +.simple_form button.negative, +.simple_form .button.negative, +.simple_form .block-button.negative +{ + background: $win95-bg; +} + +.filters .filter-subset { + border: 2px groove $win95-bg; + padding:2px; +} + +.filters .filter-subset a::before { + content: ""; + background-color:white; + border-radius:50%; + border:2px solid black; + border-top-color:#7f7f7f; + border-left-color:#7f7f7f; + border-bottom-color:#f5f5f5; + border-right-color:#f5f5f5; + width:12px; + height:12px; + display:inline-block; + vertical-align:middle; + margin-right:2px; +} + +.filters .filter-subset a.selected::before { + background-color:black; + box-shadow: inset 0 0 0 3px white; +} + +.filters .filter-subset a, +.filters .filter-subset a:hover, +.filters .filter-subset a.selected { + color:black; + border-bottom: 0px solid transparent; +} + diff --git a/config/themes.yml b/config/themes.yml index a1049fae7de..bbf8d0f6c61 100644 --- a/config/themes.yml +++ b/config/themes.yml @@ -1 +1,2 @@ default: styles/application.scss +win95: styles/win95.scss From c23844418839eea6a0f4c42e146683643996232b Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 14 Nov 2017 01:22:48 -0800 Subject: [PATCH 02/13] Updates and fixes to win95 theme --- app/javascript/styles/win95.scss | 219 +++++++++++++++++++++++++++++-- 1 file changed, 206 insertions(+), 13 deletions(-) diff --git a/app/javascript/styles/win95.scss b/app/javascript/styles/win95.scss index 994fab4bff7..885837b530b 100644 --- a/app/javascript/styles/win95.scss +++ b/app/javascript/styles/win95.scss @@ -1,6 +1,12 @@ $win95-bg: #bfbfbf; +$win95-dark-grey: #404040; +$win95-mid-grey: #808080; $win95-window-header: #00007f; $win95-tooltip-yellow: #ffffcc; +$win95-blue: blue; + +$ui-base-lighter-color: $win95-dark-grey; +$ui-highlight-color: $win95-window-header; @mixin win95-border-outset() { border-left: 2px solid #efefef; @@ -67,6 +73,53 @@ $win95-tooltip-yellow: #ffffcc; @import 'application'; +/* borrowed from cybrespace style: wider columns and full column width images */ + +@media screen and (min-width: 1300px) { + .column { + flex-grow: 1 !important; + max-width: 400px; + } + + .drawer { + width: 17%; + max-width: 400px; + min-width: 330px; + } +} + +.media-gallery, +.video-player { + max-height:30vh; + height:30vh !important; + position:relative; + margin-top:20px; + margin-left:-68px; + width: calc(100% + 80px) !important; + max-width: calc(100% + 80px); +} + +.detailed-status .media-gallery, +.detailed-status .video-player { + margin-left:-5px; + width: calc(100% + 9px); + max-width: calc(100% + 9px); +} + +.video-player video { + transform: unset; + top: unset; +} + +.detailed-status .media-spoiler, +.status .media-spoiler { + height: 100%!important; + vertical-align: middle; +} + + +/* main win95 style */ + body { font-size:13px; font-family: "MS Sans Serif", "premillenium", sans-serif; @@ -417,15 +470,35 @@ body.admin { .status__action-bar-dropdown { margin-left:auto; margin-right:10px; + + .icon-button { + min-width:28px; + } } .status.light .status__content a { color:blue; } +.focusable:focus { + background: $win95-bg; + .detailed-status__action-bar { + background: $win95-bg; + } + + .status, .detailed-status { + background: white; + outline:2px dotted $win95-mid-grey; + } +} + .dropdown__trigger.icon-button { padding-right:6px; } +.detailed-status__action-bar-dropdown .icon-button { + min-width:28px; +} + .detailed-status { background:white; background-clip:padding-box; @@ -464,12 +537,11 @@ body.admin { @include win95-border-outset() padding:0px 0px 0px 0px; margin-right:4px; -} -.icon-button, -.icon-button.inverted, -.icon-button:hover, -.icon-button.inverted:hover { + color:#3f3f3f; + &.inverted, &:hover, &.inverted:hover, &:active, &:focus { + color:#3f3f3f; + } } .icon-button:active { @@ -487,6 +559,13 @@ body.admin { border:none; } +.icon-button.star-icon.active { + color: $gold-star; + &:active, &:hover, &:focus { + color: $gold-star; + } +} + .icon-button.star-icon > i { background:$win95-bg; @include win95-border-outset() @@ -497,6 +576,10 @@ body.admin { @include win95-border-inset(); } +.text-icon-button { + color:$win95-dark-grey; +} + .detailed-status__action-bar-dropdown { margin-left:auto; justify-content:right; @@ -672,6 +755,20 @@ body.admin { background-color:white; } +.search-popout { + box-shadow: unset; + color:black; + border-radius:0px; + background-color:$win95-tooltip-yellow; + border:1px solid black; + + h4 { + color:black; + text-transform: none; + font-weight:bold; + } +} + .search-results__header { background-color: $win95-bg; color:black; @@ -690,6 +787,18 @@ body.admin { color:white; } +.search__icon .fa { + color:#808080; + + &.active { + opacity:1.0; + } + + &:hover { + color: #808080; + } +} + .drawer__inner, .drawer__inner.darker { background-color:$win95-bg; @@ -857,14 +966,24 @@ body.admin { border-radius:0px; color:black; font-weight:bold; -} -.button:hover, .button:focus { - background-color:$win95-bg; -} + &:hover, &:focus, &:disabled { + background-color:$win95-bg; + } + + &:active { + @include win95-inset(); + } + + &:disabled { + color: #808080; + text-shadow: 1px 1px 0px #efefef; + + &:active { + @include win95-outset(); + } + } -.button:active { - @include win95-inset(); } #Getting-started { @@ -1029,13 +1148,18 @@ body.admin { @include win95-inset(); } -.dropdown--active .dropdown__content > ul { +.dropdown--active .dropdown__content > ul, +.dropdown-menu { background:$win95-tooltip-yellow; border-radius:0px; border:1px solid black; box-shadow:unset; } +.dropdown-menu a { + background-color:transparent; +} + .dropdown--active::after { display:none; } @@ -1055,7 +1179,9 @@ body.admin { text-decoration:underline; } -.dropdown__sep { +.dropdown__sep, +.dropdown-menu__separator +{ border-color:#7f7f7f; } @@ -1206,6 +1332,23 @@ body.admin { overflow:hidden; } +@media screen and (max-width: 1120px) { + .admin-wrapper { + width:90vw; + height:95vh; + margin:2.5vh auto; + } +} + +@media screen and (max-width: 740px) { + .admin-wrapper { + width:100vw; + height:95vh; + height:calc(100vh - 24px); + margin:0px 0px 0px 0px; + } +} + .admin-wrapper .sidebar-wrapper { position:static; height:auto; @@ -1354,6 +1497,36 @@ body.admin { } } +@media screen and (max-width: 1520px) { + .admin-wrapper .sidebar > ul > li > ul { + max-width:1000px; + } + + .admin-wrapper .sidebar { + padding-bottom: 45px; + } +} + +@media screen and (max-width: 600px) { + .admin-wrapper .sidebar > ul > li > ul { + max-width:500px; + } + + .admin-wrapper { + .sidebar { + padding:0px; + padding-bottom: 70px; + width: 100%; + height: auto; + } + .content-wrapper { + overflow:auto; + height:80%; + height:calc(100% - 150px); + } + } +} + .flash-message { background-color:$win95-tooltip-yellow; color:black; @@ -1376,11 +1549,13 @@ body.admin { .admin-wrapper .content > p, .admin-wrapper .content .muted-hint, .simple_form span.hint, +.simple_form h4, .simple_form .check_boxes .checkbox label, .simple_form .input.with_label.boolean .label_input > label, .filters .filter-subset a, .simple_form .input.radio_buttons .radio label, a.table-action-link, +a.table-action-link:hover, .simple_form .input.with_block_label > label, .simple_form p.hint { color:black; @@ -1399,6 +1574,10 @@ a.table-action-link, color:black; background-color:white; @include win95-border-slight-inset(); + + &:active, &:focus { + background-color:white; + } } .simple_form button, @@ -1415,6 +1594,20 @@ a.table-action-link, } } +.simple_form .warning, .table-form .warning +{ + background: $win95-tooltip-yellow; + color:black; + box-shadow: unset; + text-shadow:unset; + border:1px solid black; + + a { + color: blue; + text-decoration:underline; + } +} + .simple_form button.negative, .simple_form .button.negative, .simple_form .block-button.negative From a9ed85717163040fb202d49b0342e9e350cb12ba Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sat, 18 Nov 2017 15:12:52 -0800 Subject: [PATCH 03/13] WIP static themeing --- app/javascript/core/about.js | 1 + app/javascript/{packs => core}/admin.js | 2 + app/javascript/core/common.js | 5 ++ app/javascript/core/embed.js | 23 +++++++ app/javascript/core/home.js | 1 + app/javascript/core/public.js | 1 + app/javascript/core/settings.js | 65 +++++++++++++++++++ app/javascript/core/share.js | 1 + app/javascript/packs/application.js | 3 +- app/javascript/packs/common.js | 6 -- app/javascript/themes/glitch/index.js | 14 ---- .../{ => themes/glitch}/packs/about.js | 2 - app/javascript/themes/glitch/packs/common.js | 3 + app/javascript/themes/glitch/packs/home.js | 7 ++ .../{ => themes/glitch}/packs/public.js | 0 .../{ => themes/glitch}/packs/share.js | 2 - app/javascript/themes/glitch/theme.yml | 19 ++++-- app/javascript/themes/vanilla/theme.yml | 16 +++-- 18 files changed, 135 insertions(+), 36 deletions(-) create mode 100644 app/javascript/core/about.js rename app/javascript/{packs => core}/admin.js (95%) create mode 100644 app/javascript/core/common.js create mode 100644 app/javascript/core/embed.js create mode 100644 app/javascript/core/home.js create mode 100644 app/javascript/core/public.js create mode 100644 app/javascript/core/settings.js create mode 100644 app/javascript/core/share.js delete mode 100644 app/javascript/packs/common.js delete mode 100644 app/javascript/themes/glitch/index.js rename app/javascript/{ => themes/glitch}/packs/about.js (94%) create mode 100644 app/javascript/themes/glitch/packs/common.js create mode 100644 app/javascript/themes/glitch/packs/home.js rename app/javascript/{ => themes/glitch}/packs/public.js (100%) rename app/javascript/{ => themes/glitch}/packs/share.js (94%) diff --git a/app/javascript/core/about.js b/app/javascript/core/about.js new file mode 100644 index 00000000000..6ed0e4ad383 --- /dev/null +++ b/app/javascript/core/about.js @@ -0,0 +1 @@ +// This file will be loaded on about pages, regardless of theme. diff --git a/app/javascript/packs/admin.js b/app/javascript/core/admin.js similarity index 95% rename from app/javascript/packs/admin.js rename to app/javascript/core/admin.js index 993827db59a..c0bd09bdda2 100644 --- a/app/javascript/packs/admin.js +++ b/app/javascript/core/admin.js @@ -1,3 +1,5 @@ +// This file will be loaded on admin pages, regardless of theme. + import { delegate } from 'rails-ujs'; function handleDeleteStatus(event) { diff --git a/app/javascript/core/common.js b/app/javascript/core/common.js new file mode 100644 index 00000000000..24c0fdf6125 --- /dev/null +++ b/app/javascript/core/common.js @@ -0,0 +1,5 @@ +// This file will be loaded on all pages, regardless of theme. + +import { start } from 'rails-ujs'; + +start(); diff --git a/app/javascript/core/embed.js b/app/javascript/core/embed.js new file mode 100644 index 00000000000..8167706a353 --- /dev/null +++ b/app/javascript/core/embed.js @@ -0,0 +1,23 @@ +// This file will be loaded on embed pages, regardless of theme. + +window.addEventListener('message', e => { + const data = e.data || {}; + + if (!window.parent || data.type !== 'setHeight') { + return; + } + + function setEmbedHeight () { + window.parent.postMessage({ + type: 'setHeight', + id: data.id, + height: document.getElementsByTagName('html')[0].scrollHeight, + }, '*'); + }); + + if (['interactive', 'complete'].includes(document.readyState)) { + setEmbedHeight(); + } else { + document.addEventListener('DOMContentLoaded', setEmbedHeight); + } +}); diff --git a/app/javascript/core/home.js b/app/javascript/core/home.js new file mode 100644 index 00000000000..3c2e015909b --- /dev/null +++ b/app/javascript/core/home.js @@ -0,0 +1 @@ +// This file will be loaded on home pages, regardless of theme. diff --git a/app/javascript/core/public.js b/app/javascript/core/public.js new file mode 100644 index 00000000000..1a36b7a5fd1 --- /dev/null +++ b/app/javascript/core/public.js @@ -0,0 +1 @@ +// This file will be loaded on public pages, regardless of theme. diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js new file mode 100644 index 00000000000..91332ed5a5d --- /dev/null +++ b/app/javascript/core/settings.js @@ -0,0 +1,65 @@ +// This file will be loaded on settings pages, regardless of theme. + +function main() { + const { length } = require('stringz'); + const { delegate } = require('rails-ujs'); + + delegate(document, '.webapp-btn', 'click', ({ target, button }) => { + if (button !== 0) { + return true; + } + window.location.href = target.href; + return false; + }); + + delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { + const contentEl = target.parentNode.parentNode.querySelector('.e-content'); + + if (contentEl.style.display === 'block') { + contentEl.style.display = 'none'; + target.parentNode.style.marginBottom = 0; + } else { + contentEl.style.display = 'block'; + target.parentNode.style.marginBottom = null; + } + + return false; + }); + + delegate(document, '.account_display_name', 'input', ({ target }) => { + const nameCounter = document.querySelector('.name-counter'); + + if (nameCounter) { + nameCounter.textContent = 30 - length(target.value); + } + }); + + delegate(document, '.account_note', 'input', ({ target }) => { + const noteCounter = document.querySelector('.note-counter'); + + if (noteCounter) { + const noteWithoutMetadata = processBio(target.value).text; + noteCounter.textContent = 500 - length(noteWithoutMetadata); + } + }); + + delegate(document, '#account_avatar', 'change', ({ target }) => { + const avatar = document.querySelector('.card.compact .avatar img'); + const [file] = target.files || []; + const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; + + avatar.src = url; + }); + + delegate(document, '#account_header', 'change', ({ target }) => { + const header = document.querySelector('.card.compact'); + const [file] = target.files || []; + const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc; + + header.style.backgroundImage = `url(${url})`; + }); +} + +loadPolyfills().then(main).catch(error => { + console.error(error); +}); diff --git a/app/javascript/core/share.js b/app/javascript/core/share.js new file mode 100644 index 00000000000..98a413632b6 --- /dev/null +++ b/app/javascript/core/share.js @@ -0,0 +1 @@ +// This file will be loaded on share pages, regardless of theme. diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 21dc7898633..ee5bf244c2d 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -5,8 +5,7 @@ import loadPolyfills from '../mastodon/load_polyfills'; // import default stylesheet with variables -require('font-awesome/css/font-awesome.css'); - +import 'font-awesome/css/font-awesome.css'; import '../styles/application.scss'; require.context('../images/', true); diff --git a/app/javascript/packs/common.js b/app/javascript/packs/common.js deleted file mode 100644 index 96e6f4b16f4..00000000000 --- a/app/javascript/packs/common.js +++ /dev/null @@ -1,6 +0,0 @@ -import { start } from 'rails-ujs'; -import 'font-awesome/css/font-awesome.css'; - -require.context('../images/', true); - -start(); diff --git a/app/javascript/themes/glitch/index.js b/app/javascript/themes/glitch/index.js deleted file mode 100644 index 407e1f767d6..00000000000 --- a/app/javascript/themes/glitch/index.js +++ /dev/null @@ -1,14 +0,0 @@ -import loadPolyfills from './util/load_polyfills'; - -// import default stylesheet with variables -require('font-awesome/css/font-awesome.css'); - -import './styles/index.scss'; - -require.context('../../images/', true); - -loadPolyfills().then(() => { - require('./util/main').default(); -}).catch(e => { - console.error(e); -}); diff --git a/app/javascript/packs/about.js b/app/javascript/themes/glitch/packs/about.js similarity index 94% rename from app/javascript/packs/about.js rename to app/javascript/themes/glitch/packs/about.js index 6ce8757dc95..9639d5453ae 100644 --- a/app/javascript/packs/about.js +++ b/app/javascript/themes/glitch/packs/about.js @@ -1,7 +1,5 @@ import loadPolyfills from 'themes/glitch/util/load_polyfills'; -require.context('../images/', true); - function loaded() { const TimelineContainer = require('themes/glitch/containers/timeline_container').default; const React = require('react'); diff --git a/app/javascript/themes/glitch/packs/common.js b/app/javascript/themes/glitch/packs/common.js new file mode 100644 index 00000000000..3a62700bd10 --- /dev/null +++ b/app/javascript/themes/glitch/packs/common.js @@ -0,0 +1,3 @@ +import 'font-awesome/css/font-awesome.css'; +require.context('../../images/', true); +import './styles/index.scss'; diff --git a/app/javascript/themes/glitch/packs/home.js b/app/javascript/themes/glitch/packs/home.js new file mode 100644 index 00000000000..dada28317a8 --- /dev/null +++ b/app/javascript/themes/glitch/packs/home.js @@ -0,0 +1,7 @@ +import loadPolyfills from './util/load_polyfills'; + +loadPolyfills().then(() => { + require('./util/main').default(); +}).catch(e => { + console.error(e); +}); diff --git a/app/javascript/packs/public.js b/app/javascript/themes/glitch/packs/public.js similarity index 100% rename from app/javascript/packs/public.js rename to app/javascript/themes/glitch/packs/public.js diff --git a/app/javascript/packs/share.js b/app/javascript/themes/glitch/packs/share.js similarity index 94% rename from app/javascript/packs/share.js rename to app/javascript/themes/glitch/packs/share.js index 9cd95bcee51..dc2e677e4f1 100644 --- a/app/javascript/packs/share.js +++ b/app/javascript/themes/glitch/packs/share.js @@ -1,7 +1,5 @@ import loadPolyfills from 'themes/glitch/util/load_polyfills'; -require.context('../images/', true); - function loaded() { const ComposeContainer = require('themes/glitch/containers/compose_container').default; const React = require('react'); diff --git a/app/javascript/themes/glitch/theme.yml b/app/javascript/themes/glitch/theme.yml index 49fba8f40cf..cf3fa32c2d3 100644 --- a/app/javascript/themes/glitch/theme.yml +++ b/app/javascript/themes/glitch/theme.yml @@ -1,16 +1,23 @@ -# (REQUIRED) The location of the pack file inside `pack_directory`. -pack: index.js +# (REQUIRED) The location of the pack files. +pack: + about: packs/about.js + admin: null + common: packs/common.js + embed: null + home: packs/home.js + public: packs/public.js + settings: null + share: packs/share.js -# (OPTIONAL) The directory which contains the pack file. +# (OPTIONAL) The directory which contains the pack files. # Defaults to the theme directory (`app/javascript/themes/[theme]`), -# but in the case of the vanilla Mastodon theme the pack file is -# somewhere else. +# which should be sufficient for like 99% of use-cases lol. # pack_directory: app/javascript/packs # (OPTIONAL) Additional javascript resources to preload, for use with # lazy-loaded components. It is **STRONGLY RECOMMENDED** that you # derive these pathnames from `themes/[your-theme]` to ensure that -# they stay unique. (Of course, vanilla doesn't do this ^^;;) +# they stay unique. preload: - themes/glitch/async/getting_started - themes/glitch/async/compose diff --git a/app/javascript/themes/vanilla/theme.yml b/app/javascript/themes/vanilla/theme.yml index 0b262cc820d..b4a1598fc27 100644 --- a/app/javascript/themes/vanilla/theme.yml +++ b/app/javascript/themes/vanilla/theme.yml @@ -1,9 +1,17 @@ -# (REQUIRED) The location of the pack file inside `pack_directory`. -pack: application.js +# (REQUIRED) The location of the pack files inside `pack_directory`. +pack: + about: about.js + admin: null + common: common.js + embed: null + home: application.js + public: public.js + settings: null + share: share.js -# (OPTIONAL) The directory which contains the pack file. +# (OPTIONAL) The directory which contains the pack files. # Defaults to the theme directory (`app/javascript/themes/[theme]`), -# but in the case of the vanilla Mastodon theme the pack file is +# but in the case of the vanilla Mastodon theme the pack files are # somewhere else. pack_directory: app/javascript/packs From bdbbd06dad298dc3e1a5f568f4a3ff3635b48f22 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Mon, 20 Nov 2017 22:13:37 -0800 Subject: [PATCH 04/13] Finalized theme loading and stuff --- app/controllers/about_controller.rb | 5 + app/controllers/accounts_controller.rb | 1 + app/controllers/admin/base_controller.rb | 9 +- app/controllers/application_controller.rb | 75 ++++++++++-- .../auth/confirmations_controller.rb | 7 ++ app/controllers/auth/passwords_controller.rb | 5 + .../auth/registrations_controller.rb | 5 + app/controllers/auth/sessions_controller.rb | 5 + .../authorize_follows_controller.rb | 5 + .../follower_accounts_controller.rb | 4 +- .../following_accounts_controller.rb | 4 +- app/controllers/home_controller.rb | 5 + app/controllers/remote_follow_controller.rb | 5 + .../settings/applications_controller.rb | 4 +- app/controllers/settings/base_controller.rb | 12 ++ .../settings/deletes_controller.rb | 4 +- .../settings/exports_controller.rb | 6 +- .../settings/follower_domains_controller.rb | 6 +- .../settings/imports_controller.rb | 5 +- .../settings/keyword_mutes_controller.rb | 5 +- .../settings/notifications_controller.rb | 6 +- .../settings/preferences_controller.rb | 6 +- .../settings/profiles_controller.rb | 5 +- .../settings/sessions_controller.rb | 1 + .../two_factor_authentications_controller.rb | 5 +- app/controllers/shares_controller.rb | 5 + app/controllers/statuses_controller.rb | 2 + app/controllers/stream_entries_controller.rb | 1 + app/controllers/tags_controller.rb | 1 + app/javascript/core/about.js | 1 - app/javascript/core/embed.js | 2 +- app/javascript/core/home.js | 1 - app/javascript/core/public.js | 24 ++++ app/javascript/core/settings.js | 92 +++++--------- app/javascript/core/share.js | 1 - app/javascript/core/theme.yml | 14 +++ app/javascript/locales/index.js | 9 ++ app/javascript/mastodon/locales/index.js | 10 +- app/javascript/packs/about.js | 22 ++++ app/javascript/packs/application.js | 10 -- app/javascript/packs/common.js | 3 + app/javascript/packs/public.js | 75 ++++++++++++ app/javascript/packs/share.js | 22 ++++ app/javascript/styles/common.scss | 5 - app/javascript/styles/win95.scss | 113 +++++++++--------- .../themes/glitch/containers/mastodon.js | 2 +- app/javascript/themes/glitch/packs/common.js | 4 +- app/javascript/themes/glitch/packs/home.js | 4 +- app/javascript/themes/glitch/packs/public.js | 83 +------------ app/javascript/themes/glitch/theme.yml | 39 +++--- app/javascript/themes/vanilla/theme.yml | 35 +++--- app/javascript/themes/win95/index.js | 10 ++ app/javascript/themes/win95/theme.yml | 23 ++++ app/lib/themes.rb | 12 ++ app/views/about/more.html.haml | 1 - app/views/about/show.html.haml | 1 - app/views/admin/reports/show.html.haml | 3 - app/views/admin/statuses/index.html.haml | 3 - app/views/home/index.html.haml | 6 - app/views/layouts/_theme.html.haml | 10 ++ app/views/layouts/admin.html.haml | 3 - app/views/layouts/application.html.haml | 10 +- app/views/layouts/auth.html.haml | 3 - app/views/layouts/embedded.html.haml | 7 +- app/views/layouts/error.html.haml | 4 +- app/views/layouts/modal.html.haml | 3 - app/views/layouts/public.html.haml | 3 - app/views/shares/show.html.haml | 1 - app/views/tags/show.html.haml | 1 - config/webpack/configuration.js | 13 +- config/webpack/generateLocalePacks.js | 2 +- config/webpack/shared.js | 40 ++++--- config/webpacker.yml | 12 -- 73 files changed, 573 insertions(+), 378 deletions(-) create mode 100644 app/controllers/settings/base_controller.rb delete mode 100644 app/javascript/core/about.js delete mode 100644 app/javascript/core/home.js delete mode 100644 app/javascript/core/share.js create mode 100644 app/javascript/core/theme.yml create mode 100644 app/javascript/locales/index.js create mode 100644 app/javascript/packs/about.js create mode 100644 app/javascript/packs/common.js create mode 100644 app/javascript/packs/public.js create mode 100644 app/javascript/packs/share.js delete mode 100644 app/javascript/styles/common.scss create mode 100644 app/javascript/themes/win95/index.js create mode 100644 app/javascript/themes/win95/theme.yml create mode 100644 app/views/layouts/_theme.html.haml diff --git a/app/controllers/about_controller.rb b/app/controllers/about_controller.rb index 47690e81eb9..8785df14ed1 100644 --- a/app/controllers/about_controller.rb +++ b/app/controllers/about_controller.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true class AboutController < ApplicationController + before_action :set_pack before_action :set_body_classes before_action :set_instance_presenter, only: [:show, :more, :terms] @@ -21,6 +22,10 @@ class AboutController < ApplicationController helper_method :new_user + def set_pack + use_pack action_name == 'show' ? 'about' : 'common' + end + def set_instance_presenter @instance_presenter = InstancePresenter.new end diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 75915b33712..309cb65daa6 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -7,6 +7,7 @@ class AccountsController < ApplicationController def show respond_to do |format| format.html do + use_pack 'public' @pinned_statuses = [] if current_account && @account.blocking?(current_account) diff --git a/app/controllers/admin/base_controller.rb b/app/controllers/admin/base_controller.rb index db4839a8f7c..72613450900 100644 --- a/app/controllers/admin/base_controller.rb +++ b/app/controllers/admin/base_controller.rb @@ -4,8 +4,13 @@ module Admin class BaseController < ApplicationController include Authorization - before_action :require_staff! - layout 'admin' + + before_action :require_staff! + before_action :set_pack + + def set_pack + use_pack 'admin' + end end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f5dbe837e4f..7cc4eea2751 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -12,8 +12,6 @@ class ApplicationController < ActionController::Base helper_method :current_account helper_method :current_session - helper_method :current_theme - helper_method :theme_data helper_method :single_user_mode? rescue_from ActionController::RoutingError, with: :not_found @@ -54,6 +52,69 @@ class ApplicationController < ActionController::Base new_user_session_path end + def pack(data, pack_name) + return nil unless pack?(data, pack_name) + pack_data = { + common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'), + name: data['name'], + pack: pack_name, + preload: nil, + stylesheet: false + } + if data['pack'][pack_name].is_a?(Hash) + pack_data[:common] = nil if data['pack'][pack_name]['use_common'] == false + pack_data[:pack] = nil unless data['pack'][pack_name]['filename'] + if data['pack'][pack_name]['preload'] + pack_data[:preload] = [data['pack'][pack_name]['preload']] if data['pack'][pack_name]['preload'].is_a?(String) + pack_data[:preload] = data['pack'][pack_name]['preload'] if data['pack'][pack_name]['preload'].is_a?(Array) + end + pack_data[:stylesheet] = true if data['pack'][pack_name]['stylesheet'] + end + pack_data + end + + def pack?(data, pack_name) + if data['pack'].is_a?(Hash) && data['pack'].key?(pack_name) + return true if data['pack'][pack_name].is_a?(String) || data['pack'][pack_name].is_a?(Hash) + end + false + end + + def nil_pack(data, pack_name) + { + common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'), + name: data['name'], + pack: nil, + preload: nil, + stylesheet: false + } + end + + def resolve_pack(data, pack_name) + result = pack(data, pack_name) + unless result + if data['name'] && data.key?('fallback') + if data['fallback'].nil? + return nil_pack(data, pack_name) + elsif data['fallback'].is_a?(String) && Themes.instance.get(data['fallback']) + return resolve_pack(Themes.instance.get(data['fallback']), pack_name) + elsif data['fallback'].is_a?(Array) + data['fallback'].each do |fallback| + return resolve_pack(Themes.instance.get(fallback), pack_name) if Themes.instance.get(fallback) + end + end + return nil_pack(data, pack_name) + end + return data.key?('name') && data['name'] != default_theme ? resolve_pack(Themes.instance.get(default_theme), pack_name) : nil_pack(data, pack_name) + end + result + end + + def use_pack(pack_name) + @core = resolve_pack(Themes.instance.core, pack_name) + @theme = resolve_pack(Themes.instance.get(current_theme), pack_name) + end + protected def forbidden @@ -84,13 +145,13 @@ class ApplicationController < ActionController::Base @current_session ||= SessionActivation.find_by(session_id: cookies.signed['_session_id']) end - def current_theme - return Setting.default_settings['theme'] unless Themes.instance.names.include? current_user&.setting_theme - current_user.setting_theme + def default_theme + Setting.default_settings['theme'] end - def theme_data - Themes.instance.get(current_theme) + def current_theme + return default_theme unless Themes.instance.names.include? current_user&.setting_theme + current_user.setting_theme end def cache_collection(raw, klass) diff --git a/app/controllers/auth/confirmations_controller.rb b/app/controllers/auth/confirmations_controller.rb index d5e8e58ede3..5ffa1c9a307 100644 --- a/app/controllers/auth/confirmations_controller.rb +++ b/app/controllers/auth/confirmations_controller.rb @@ -2,10 +2,17 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController layout 'auth' + before_action :set_pack def show super do |user| BootstrapTimelineWorker.perform_async(user.account_id) if user.errors.empty? end end + + private + + def set_pack + use_pack 'auth' + end end diff --git a/app/controllers/auth/passwords_controller.rb b/app/controllers/auth/passwords_controller.rb index 171b997dc48..e0400aa3df8 100644 --- a/app/controllers/auth/passwords_controller.rb +++ b/app/controllers/auth/passwords_controller.rb @@ -2,6 +2,7 @@ class Auth::PasswordsController < Devise::PasswordsController before_action :check_validity_of_reset_password_token, only: :edit + before_action :set_pack layout 'auth' @@ -17,4 +18,8 @@ class Auth::PasswordsController < Devise::PasswordsController def reset_password_token_is_valid? resource_class.with_reset_password_token(params[:reset_password_token]).present? end + + def set_pack + use_pack 'auth' + end end diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index 223db96ff24..cc7a69ab07e 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -5,6 +5,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController before_action :check_enabled_registrations, only: [:new, :create] before_action :configure_sign_up_params, only: [:create] + before_action :set_path before_action :set_sessions, only: [:edit, :update] before_action :set_instance_presenter, only: [:new, :create, :update] @@ -40,6 +41,10 @@ class Auth::RegistrationsController < Devise::RegistrationsController private + def set_pack + use_pack %w(edit update).include?(action_name) ? 'admin' : 'auth' + end + def set_instance_presenter @instance_presenter = InstancePresenter.new end diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb index a5acb6c36fa..72d54410223 100644 --- a/app/controllers/auth/sessions_controller.rb +++ b/app/controllers/auth/sessions_controller.rb @@ -9,6 +9,7 @@ class Auth::SessionsController < Devise::SessionsController skip_before_action :check_suspension, only: [:destroy] prepend_before_action :authenticate_with_two_factor, if: :two_factor_enabled?, only: [:create] before_action :set_instance_presenter, only: [:new] + before_action :set_pack def create super do |resource| @@ -85,6 +86,10 @@ class Auth::SessionsController < Devise::SessionsController private + def set_pack + use_pack 'auth' + end + def set_instance_presenter @instance_presenter = InstancePresenter.new end diff --git a/app/controllers/authorize_follows_controller.rb b/app/controllers/authorize_follows_controller.rb index 78b56418364..2d29bd37940 100644 --- a/app/controllers/authorize_follows_controller.rb +++ b/app/controllers/authorize_follows_controller.rb @@ -4,6 +4,7 @@ class AuthorizeFollowsController < ApplicationController layout 'modal' before_action :authenticate_user! + before_action :set_pack def show @account = located_account || render(:error) @@ -23,6 +24,10 @@ class AuthorizeFollowsController < ApplicationController private + def set_pack + use_pack 'modal' + end + def follow_attempt FollowService.new.call(current_account, acct_without_prefix) end diff --git a/app/controllers/follower_accounts_controller.rb b/app/controllers/follower_accounts_controller.rb index 399e79665e7..080cbde1146 100644 --- a/app/controllers/follower_accounts_controller.rb +++ b/app/controllers/follower_accounts_controller.rb @@ -7,7 +7,9 @@ class FollowerAccountsController < ApplicationController @follows = Follow.where(target_account: @account).recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:account) respond_to do |format| - format.html + format.html do + use_pack 'public' + end format.json do render json: collection_presenter, diff --git a/app/controllers/following_accounts_controller.rb b/app/controllers/following_accounts_controller.rb index 1e73d4bd408..74e83ad814e 100644 --- a/app/controllers/following_accounts_controller.rb +++ b/app/controllers/following_accounts_controller.rb @@ -7,7 +7,9 @@ class FollowingAccountsController < ApplicationController @follows = Follow.where(account: @account).recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:target_account) respond_to do |format| - format.html + format.html do + use_pack 'public' + end format.json do render json: collection_presenter, diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 21dde20ce40..7437a647e18 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -2,6 +2,7 @@ class HomeController < ApplicationController before_action :authenticate_user! + before_action :set_pack before_action :set_initial_state_json def index @@ -37,6 +38,10 @@ class HomeController < ApplicationController redirect_to(default_redirect_path) end + def set_pack + use_pack 'home' + end + def set_initial_state_json serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer) @initial_state_json = serializable_resource.to_json diff --git a/app/controllers/remote_follow_controller.rb b/app/controllers/remote_follow_controller.rb index 48b026aa5a0..e6f37988612 100644 --- a/app/controllers/remote_follow_controller.rb +++ b/app/controllers/remote_follow_controller.rb @@ -4,6 +4,7 @@ class RemoteFollowController < ApplicationController layout 'modal' before_action :set_account + before_action :set_pack before_action :gone, if: :suspended_account? def new @@ -31,6 +32,10 @@ class RemoteFollowController < ApplicationController { acct: session[:remote_follow] } end + def set_pack + use_pack 'modal' + end + def set_account @account = Account.find_local!(params[:account_username]) end diff --git a/app/controllers/settings/applications_controller.rb b/app/controllers/settings/applications_controller.rb index 8fc9a0fa999..35a6f7f9e75 100644 --- a/app/controllers/settings/applications_controller.rb +++ b/app/controllers/settings/applications_controller.rb @@ -1,9 +1,7 @@ # frozen_string_literal: true -class Settings::ApplicationsController < ApplicationController - layout 'admin' +class Settings::ApplicationsController < Settings::BaseController - before_action :authenticate_user! before_action :set_application, only: [:show, :update, :destroy, :regenerate] before_action :prepare_scopes, only: [:create, :update] diff --git a/app/controllers/settings/base_controller.rb b/app/controllers/settings/base_controller.rb new file mode 100644 index 00000000000..7322d461be5 --- /dev/null +++ b/app/controllers/settings/base_controller.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class Settings::BaseController < ApplicationController + layout 'admin' + + before_action :authenticate_user! + before_action :set_pack + + def set_pack + use_pack 'settings' + end +end diff --git a/app/controllers/settings/deletes_controller.rb b/app/controllers/settings/deletes_controller.rb index 80002b995e5..e4cb35a8e9d 100644 --- a/app/controllers/settings/deletes_controller.rb +++ b/app/controllers/settings/deletes_controller.rb @@ -1,10 +1,8 @@ # frozen_string_literal: true -class Settings::DeletesController < ApplicationController - layout 'admin' +class Settings::DeletesController < Settings::BaseController before_action :check_enabled_deletion - before_action :authenticate_user! def show @confirmation = Form::DeleteConfirmation.new diff --git a/app/controllers/settings/exports_controller.rb b/app/controllers/settings/exports_controller.rb index ae62f00c1e2..9c03ece8600 100644 --- a/app/controllers/settings/exports_controller.rb +++ b/app/controllers/settings/exports_controller.rb @@ -1,10 +1,6 @@ # frozen_string_literal: true -class Settings::ExportsController < ApplicationController - layout 'admin' - - before_action :authenticate_user! - +class Settings::ExportsController < Settings::BaseController def show @export = Export.new(current_account) end diff --git a/app/controllers/settings/follower_domains_controller.rb b/app/controllers/settings/follower_domains_controller.rb index 9968504e5f7..141b2270dd5 100644 --- a/app/controllers/settings/follower_domains_controller.rb +++ b/app/controllers/settings/follower_domains_controller.rb @@ -2,11 +2,7 @@ require 'sidekiq-bulk' -class Settings::FollowerDomainsController < ApplicationController - layout 'admin' - - before_action :authenticate_user! - +class Settings::FollowerDomainsController < Settings::BaseController def show @account = current_account @domains = current_account.followers.reorder('MIN(follows.id) DESC').group('accounts.domain').select('accounts.domain, count(accounts.id) as accounts_from_domain').page(params[:page]).per(10) diff --git a/app/controllers/settings/imports_controller.rb b/app/controllers/settings/imports_controller.rb index 0db13d1ca64..dbd136ebe1e 100644 --- a/app/controllers/settings/imports_controller.rb +++ b/app/controllers/settings/imports_controller.rb @@ -1,9 +1,6 @@ # frozen_string_literal: true -class Settings::ImportsController < ApplicationController - layout 'admin' - - before_action :authenticate_user! +class Settings::ImportsController < Settings::BaseController before_action :set_account def show diff --git a/app/controllers/settings/keyword_mutes_controller.rb b/app/controllers/settings/keyword_mutes_controller.rb index f79e1b320b7..699b8a3ef1c 100644 --- a/app/controllers/settings/keyword_mutes_controller.rb +++ b/app/controllers/settings/keyword_mutes_controller.rb @@ -1,9 +1,6 @@ # frozen_string_literal: true -class Settings::KeywordMutesController < ApplicationController - layout 'admin' - - before_action :authenticate_user! +class Settings::KeywordMutesController < Settings::BaseController before_action :load_keyword_mute, only: [:edit, :update, :destroy] def index diff --git a/app/controllers/settings/notifications_controller.rb b/app/controllers/settings/notifications_controller.rb index ce2530c5416..6286e3ebf10 100644 --- a/app/controllers/settings/notifications_controller.rb +++ b/app/controllers/settings/notifications_controller.rb @@ -1,10 +1,6 @@ # frozen_string_literal: true -class Settings::NotificationsController < ApplicationController - layout 'admin' - - before_action :authenticate_user! - +class Settings::NotificationsController < Settings::BaseController def show; end def update diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 0690267151c..3aefd90a2d2 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -1,10 +1,6 @@ # frozen_string_literal: true -class Settings::PreferencesController < ApplicationController - layout 'admin' - - before_action :authenticate_user! - +class Settings::PreferencesController < Settings::BaseController def show; end def update diff --git a/app/controllers/settings/profiles_controller.rb b/app/controllers/settings/profiles_controller.rb index 28f78a4fb85..dadc3d91188 100644 --- a/app/controllers/settings/profiles_controller.rb +++ b/app/controllers/settings/profiles_controller.rb @@ -1,11 +1,8 @@ # frozen_string_literal: true -class Settings::ProfilesController < ApplicationController +class Settings::ProfilesController < Settings::BaseController include ObfuscateFilename - layout 'admin' - - before_action :authenticate_user! before_action :set_account obfuscate_filename [:account, :avatar] diff --git a/app/controllers/settings/sessions_controller.rb b/app/controllers/settings/sessions_controller.rb index 0da1b027b8e..780ea64b40f 100644 --- a/app/controllers/settings/sessions_controller.rb +++ b/app/controllers/settings/sessions_controller.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true +# Intentionally does not inherit from BaseController class Settings::SessionsController < ApplicationController before_action :set_session, only: :destroy diff --git a/app/controllers/settings/two_factor_authentications_controller.rb b/app/controllers/settings/two_factor_authentications_controller.rb index 863cc7351b7..8c7737e9dc9 100644 --- a/app/controllers/settings/two_factor_authentications_controller.rb +++ b/app/controllers/settings/two_factor_authentications_controller.rb @@ -1,10 +1,7 @@ # frozen_string_literal: true module Settings - class TwoFactorAuthenticationsController < ApplicationController - layout 'admin' - - before_action :authenticate_user! + class TwoFactorAuthenticationsController < BaseController before_action :verify_otp_required, only: [:create] def show diff --git a/app/controllers/shares_controller.rb b/app/controllers/shares_controller.rb index 994742c3df6..81d279c8b4c 100644 --- a/app/controllers/shares_controller.rb +++ b/app/controllers/shares_controller.rb @@ -4,6 +4,7 @@ class SharesController < ApplicationController layout 'modal' before_action :authenticate_user! + before_action :set_pack before_action :set_body_classes def show @@ -24,6 +25,10 @@ class SharesController < ApplicationController } end + def set_pack + use_pack 'share' + end + def set_body_classes @body_classes = 'compose-standalone' end diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index e8a360fb575..84c9e7685e5 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -14,6 +14,7 @@ class StatusesController < ApplicationController def show respond_to do |format| format.html do + use_pack 'public' @ancestors = @status.reply? ? cache_collection(@status.ancestors(current_account), Status) : [] @descendants = cache_collection(@status.descendants(current_account), Status) @@ -37,6 +38,7 @@ class StatusesController < ApplicationController end def embed + use_pack 'embed' response.headers['X-Frame-Options'] = 'ALLOWALL' render 'stream_entries/embed', layout: 'embedded' end diff --git a/app/controllers/stream_entries_controller.rb b/app/controllers/stream_entries_controller.rb index 5f61e2182cf..b597ba4bbe5 100644 --- a/app/controllers/stream_entries_controller.rb +++ b/app/controllers/stream_entries_controller.rb @@ -14,6 +14,7 @@ class StreamEntriesController < ApplicationController def show respond_to do |format| format.html do + use_pack 'public' @ancestors = @stream_entry.activity.reply? ? cache_collection(@stream_entry.activity.ancestors(current_account), Status) : [] @descendants = cache_collection(@stream_entry.activity.descendants(current_account), Status) end diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 9f3090e37be..5d11a813907 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -9,6 +9,7 @@ class TagsController < ApplicationController respond_to do |format| format.html do + use_pack 'about' serializable_resource = ActiveModelSerializers::SerializableResource.new(InitialStatePresenter.new(initial_state_params), serializer: InitialStateSerializer) @initial_state_json = serializable_resource.to_json end diff --git a/app/javascript/core/about.js b/app/javascript/core/about.js deleted file mode 100644 index 6ed0e4ad383..00000000000 --- a/app/javascript/core/about.js +++ /dev/null @@ -1 +0,0 @@ -// This file will be loaded on about pages, regardless of theme. diff --git a/app/javascript/core/embed.js b/app/javascript/core/embed.js index 8167706a353..6146e65929d 100644 --- a/app/javascript/core/embed.js +++ b/app/javascript/core/embed.js @@ -13,7 +13,7 @@ window.addEventListener('message', e => { id: data.id, height: document.getElementsByTagName('html')[0].scrollHeight, }, '*'); - }); + }; if (['interactive', 'complete'].includes(document.readyState)) { setEmbedHeight(); diff --git a/app/javascript/core/home.js b/app/javascript/core/home.js deleted file mode 100644 index 3c2e015909b..00000000000 --- a/app/javascript/core/home.js +++ /dev/null @@ -1 +0,0 @@ -// This file will be loaded on home pages, regardless of theme. diff --git a/app/javascript/core/public.js b/app/javascript/core/public.js index 1a36b7a5fd1..47c34a25909 100644 --- a/app/javascript/core/public.js +++ b/app/javascript/core/public.js @@ -1 +1,25 @@ // This file will be loaded on public pages, regardless of theme. + +const { delegate } = require('rails-ujs'); + +delegate(document, '.webapp-btn', 'click', ({ target, button }) => { + if (button !== 0) { + return true; + } + window.location.href = target.href; + return false; +}); + +delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { + const contentEl = target.parentNode.parentNode.querySelector('.e-content'); + + if (contentEl.style.display === 'block') { + contentEl.style.display = 'none'; + target.parentNode.style.marginBottom = 0; + } else { + contentEl.style.display = 'block'; + target.parentNode.style.marginBottom = null; + } + + return false; +}); diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index 91332ed5a5d..7fb1d8e77ab 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -1,65 +1,37 @@ // This file will be loaded on settings pages, regardless of theme. -function main() { - const { length } = require('stringz'); - const { delegate } = require('rails-ujs'); +const { length } = require('stringz'); +const { delegate } = require('rails-ujs'); - delegate(document, '.webapp-btn', 'click', ({ target, button }) => { - if (button !== 0) { - return true; - } - window.location.href = target.href; - return false; - }); +delegate(document, '.account_display_name', 'input', ({ target }) => { + const nameCounter = document.querySelector('.name-counter'); - delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { - const contentEl = target.parentNode.parentNode.querySelector('.e-content'); - - if (contentEl.style.display === 'block') { - contentEl.style.display = 'none'; - target.parentNode.style.marginBottom = 0; - } else { - contentEl.style.display = 'block'; - target.parentNode.style.marginBottom = null; - } - - return false; - }); - - delegate(document, '.account_display_name', 'input', ({ target }) => { - const nameCounter = document.querySelector('.name-counter'); - - if (nameCounter) { - nameCounter.textContent = 30 - length(target.value); - } - }); - - delegate(document, '.account_note', 'input', ({ target }) => { - const noteCounter = document.querySelector('.note-counter'); - - if (noteCounter) { - const noteWithoutMetadata = processBio(target.value).text; - noteCounter.textContent = 500 - length(noteWithoutMetadata); - } - }); - - delegate(document, '#account_avatar', 'change', ({ target }) => { - const avatar = document.querySelector('.card.compact .avatar img'); - const [file] = target.files || []; - const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; - - avatar.src = url; - }); - - delegate(document, '#account_header', 'change', ({ target }) => { - const header = document.querySelector('.card.compact'); - const [file] = target.files || []; - const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc; - - header.style.backgroundImage = `url(${url})`; - }); -} - -loadPolyfills().then(main).catch(error => { - console.error(error); + if (nameCounter) { + nameCounter.textContent = 30 - length(target.value); + } +}); + +delegate(document, '.account_note', 'input', ({ target }) => { + const noteCounter = document.querySelector('.note-counter'); + + if (noteCounter) { + const noteWithoutMetadata = processBio(target.value).text; + noteCounter.textContent = 500 - length(noteWithoutMetadata); + } +}); + +delegate(document, '#account_avatar', 'change', ({ target }) => { + const avatar = document.querySelector('.card.compact .avatar img'); + const [file] = target.files || []; + const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; + + avatar.src = url; +}); + +delegate(document, '#account_header', 'change', ({ target }) => { + const header = document.querySelector('.card.compact'); + const [file] = target.files || []; + const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc; + + header.style.backgroundImage = `url(${url})`; }); diff --git a/app/javascript/core/share.js b/app/javascript/core/share.js deleted file mode 100644 index 98a413632b6..00000000000 --- a/app/javascript/core/share.js +++ /dev/null @@ -1 +0,0 @@ -// This file will be loaded on share pages, regardless of theme. diff --git a/app/javascript/core/theme.yml b/app/javascript/core/theme.yml new file mode 100644 index 00000000000..17e8e66b323 --- /dev/null +++ b/app/javascript/core/theme.yml @@ -0,0 +1,14 @@ +# These packs will be loaded on every appropriate page, regardless of +# theme. +pack: + about: + admin: admin.js + auth: + common: common.js + embed: embed.js + error: + home: + modal: + public: public.js + settings: settings.js + share: diff --git a/app/javascript/locales/index.js b/app/javascript/locales/index.js new file mode 100644 index 00000000000..421cb7fab01 --- /dev/null +++ b/app/javascript/locales/index.js @@ -0,0 +1,9 @@ +let theLocale; + +export function setLocale(locale) { + theLocale = locale; +} + +export function getLocale() { + return theLocale; +} diff --git a/app/javascript/mastodon/locales/index.js b/app/javascript/mastodon/locales/index.js index 421cb7fab01..7e72975618d 100644 --- a/app/javascript/mastodon/locales/index.js +++ b/app/javascript/mastodon/locales/index.js @@ -1,9 +1 @@ -let theLocale; - -export function setLocale(locale) { - theLocale = locale; -} - -export function getLocale() { - return theLocale; -} +export * from 'locales'; diff --git a/app/javascript/packs/about.js b/app/javascript/packs/about.js new file mode 100644 index 00000000000..63e12da42cc --- /dev/null +++ b/app/javascript/packs/about.js @@ -0,0 +1,22 @@ +import loadPolyfills from '../mastodon/load_polyfills'; + +function loaded() { + const TimelineContainer = require('../mastodon/containers/timeline_container').default; + const React = require('react'); + const ReactDOM = require('react-dom'); + const mountNode = document.getElementById('mastodon-timeline'); + + if (mountNode !== null) { + const props = JSON.parse(mountNode.getAttribute('data-props')); + ReactDOM.render(, mountNode); + } +} + +function main() { + const ready = require('../mastodon/ready').default; + ready(loaded); +} + +loadPolyfills().then(main).catch(error => { + console.error(error); +}); diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index ee5bf244c2d..116632dea70 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -1,15 +1,5 @@ -// THIS IS THE `vanilla` THEME PACK FILE!! -// IT'S HERE FOR UPSTREAM COMPATIBILITY!! -// THE `glitch` PACK FILE IS IN `themes/glitch/index.js`!! - import loadPolyfills from '../mastodon/load_polyfills'; -// import default stylesheet with variables -import 'font-awesome/css/font-awesome.css'; -import '../styles/application.scss'; - -require.context('../images/', true); - loadPolyfills().then(() => { require('../mastodon/main').default(); }).catch(e => { diff --git a/app/javascript/packs/common.js b/app/javascript/packs/common.js new file mode 100644 index 00000000000..f3156c1c66f --- /dev/null +++ b/app/javascript/packs/common.js @@ -0,0 +1,3 @@ +import 'font-awesome/css/font-awesome.css'; +import 'styles/application.scss' +require.context('../images/', true); diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js new file mode 100644 index 00000000000..3472af6c13b --- /dev/null +++ b/app/javascript/packs/public.js @@ -0,0 +1,75 @@ +import loadPolyfills from '../mastodon/load_polyfills'; +import ready from '../mastodon/ready'; + +function main() { + const IntlRelativeFormat = require('intl-relativeformat').default; + const emojify = require('../mastodon/features/emoji/emoji').default; + const { getLocale } = require('../mastodon/locales'); + const { localeData } = getLocale(); + const VideoContainer = require('../mastodon/containers/video_container').default; + const MediaGalleryContainer = require('../mastodon/containers/media_gallery_container').default; + const CardContainer = require('../mastodon/containers/card_container').default; + const React = require('react'); + const ReactDOM = require('react-dom'); + + localeData.forEach(IntlRelativeFormat.__addLocaleData); + + ready(() => { + const locale = document.documentElement.lang; + + const dateTimeFormat = new Intl.DateTimeFormat(locale, { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + }); + + const relativeFormat = new IntlRelativeFormat(locale); + + [].forEach.call(document.querySelectorAll('.emojify'), (content) => { + content.innerHTML = emojify(content.innerHTML); + }); + + [].forEach.call(document.querySelectorAll('time.formatted'), (content) => { + const datetime = new Date(content.getAttribute('datetime')); + const formattedDate = dateTimeFormat.format(datetime); + + content.title = formattedDate; + content.textContent = formattedDate; + }); + + [].forEach.call(document.querySelectorAll('time.time-ago'), (content) => { + const datetime = new Date(content.getAttribute('datetime')); + + content.title = dateTimeFormat.format(datetime); + content.textContent = relativeFormat.format(datetime); + }); + + [].forEach.call(document.querySelectorAll('.logo-button'), (content) => { + content.addEventListener('click', (e) => { + e.preventDefault(); + window.open(e.target.href, 'mastodon-intent', 'width=400,height=400,resizable=no,menubar=no,status=no,scrollbars=yes'); + }); + }); + + [].forEach.call(document.querySelectorAll('[data-component="Video"]'), (content) => { + const props = JSON.parse(content.getAttribute('data-props')); + ReactDOM.render(, content); + }); + + [].forEach.call(document.querySelectorAll('[data-component="MediaGallery"]'), (content) => { + const props = JSON.parse(content.getAttribute('data-props')); + ReactDOM.render(, content); + }); + + [].forEach.call(document.querySelectorAll('[data-component="Card"]'), (content) => { + const props = JSON.parse(content.getAttribute('data-props')); + ReactDOM.render(, content); + }); + }); +} + +loadPolyfills().then(main).catch(error => { + console.error(error); +}); diff --git a/app/javascript/packs/share.js b/app/javascript/packs/share.js new file mode 100644 index 00000000000..e9580f648bf --- /dev/null +++ b/app/javascript/packs/share.js @@ -0,0 +1,22 @@ +import loadPolyfills from '../mastodon/load_polyfills'; + +function loaded() { + const ComposeContainer = require('../mastodon/containers/compose_container').default; + const React = require('react'); + const ReactDOM = require('react-dom'); + const mountNode = document.getElementById('mastodon-compose'); + + if (mountNode !== null) { + const props = JSON.parse(mountNode.getAttribute('data-props')); + ReactDOM.render(, mountNode); + } +} + +function main() { + const ready = require('../mastodon/ready').default; + ready(loaded); +} + +loadPolyfills().then(main).catch(error => { + console.error(error); +}); diff --git a/app/javascript/styles/common.scss b/app/javascript/styles/common.scss deleted file mode 100644 index c1772e7ae19..00000000000 --- a/app/javascript/styles/common.scss +++ /dev/null @@ -1,5 +0,0 @@ -// This makes our fonts available everywhere. - -@import 'fonts/roboto'; -@import 'fonts/roboto-mono'; -@import 'fonts/montserrat'; diff --git a/app/javascript/styles/win95.scss b/app/javascript/styles/win95.scss index 885837b530b..6c89fc5bf6a 100644 --- a/app/javascript/styles/win95.scss +++ b/app/javascript/styles/win95.scss @@ -1,3 +1,8 @@ +// win95 theme from cybrespace. + +// Modified to inherit glitch styles (themes/glitch/styles/index.scss) +// instead of vanilla ones (./application.scss) + $win95-bg: #bfbfbf; $win95-dark-grey: #404040; $win95-mid-grey: #808080; @@ -17,7 +22,7 @@ $ui-highlight-color: $win95-window-header; } @mixin win95-outset() { - box-shadow: inset -1px -1px 0px #000000, + box-shadow: inset -1px -1px 0px #000000, inset 1px 1px 0px #ffffff, inset -2px -2px 0px #808080, inset 2px 2px 0px #dfdfdf; @@ -41,7 +46,7 @@ $ui-highlight-color: $win95-window-header; } @mixin win95-inset() { - box-shadow: inset 1px 1px 0px #000000, + box-shadow: inset 1px 1px 0px #000000, inset -1px -1px 0px #ffffff, inset 2px 2px 0px #808080, inset -2px -2px 0px #dfdfdf; @@ -51,7 +56,7 @@ $ui-highlight-color: $win95-window-header; @mixin win95-tab() { - box-shadow: inset -1px 0px 0px #000000, + box-shadow: inset -1px 0px 0px #000000, inset 1px 0px 0px #ffffff, inset 0px 1px 0px #ffffff, inset 0px 2px 0px #dfdfdf, @@ -71,7 +76,7 @@ $ui-highlight-color: $win95-window-header; src: url('../fonts/premillenium/MSSansSerif.ttf') format('truetype'); } -@import 'application'; +@import '../themes/glitch/styles/index'; // Imports glitch themes /* borrowed from cybrespace style: wider columns and full column width images */ @@ -174,7 +179,7 @@ body.admin { font-size:0px; color:$win95-bg; - background-image: url("../images/start.png"); + background-image: url("../images/start.png"); background-repeat:no-repeat; background-position:8%; background-clip:padding-box; @@ -336,7 +341,7 @@ body.admin { border-radius:0px; background-color:white; @include win95-border-inset(); - + width:12px; height:12px; } @@ -515,9 +520,9 @@ body.admin { color:black; font-weight:bold; } -.account__avatar, -.account__avatar-overlay-base, -.account__header__avatar, +.account__avatar, +.account__avatar-overlay-base, +.account__header__avatar, .account__avatar-overlay-overlay { @include win95-border-slight-inset(); clip-path:none; @@ -627,7 +632,7 @@ body.admin { } .status-card__description { - color:black; + color:black; } .account__display-name strong, .status__display-name strong { @@ -710,8 +715,8 @@ body.admin { width:40px; font-size:0px; color:$win95-bg; - - background-image: url("../images/start.png"); + + background-image: url("../images/start.png"); background-repeat:no-repeat; background-position:8%; background-clip:padding-box; @@ -723,7 +728,7 @@ body.admin { } .drawer__header a:first-child:hover { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); background-repeat:no-repeat; background-position:8%; background-clip:padding-box; @@ -732,7 +737,7 @@ body.admin { } .drawer__tab:first-child { - + } .search { @@ -844,7 +849,7 @@ body.admin { padding:4px 8px; } -.privacy-dropdown.active +.privacy-dropdown.active .privacy-dropdown__value { background: $win95-bg; box-shadow:unset; @@ -935,7 +940,7 @@ body.admin { background-color:$win95-bg; border:1px solid black; box-sizing:content-box; - + } .emoji-dialog .emoji-search { @@ -1010,8 +1015,8 @@ body.admin { width:60px; font-size:0px; color:$win95-bg; - - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); + + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAIAAACpTQvdAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAF3pUWHRBdXRob3IAAAiZS84oys9LzAEAC5oC6A7BY/IAAACWSURBVCiRhVJJDsQgDEuqOfRZ7a1P5gbP4uaJaEjTADMWQhHYjlk4p0wLnNdptdF4KvBUDyGzVwc2xO+uKtH+1o0ytEEmqFpuxlvFCGCxKbNIT56QCi2MzaA/2Mz+mERSOeqzJG2RUxkjdTabgPtFoZ1bZxcKvgPcLZVufAyR9Ni8v5dWDzfFx0giC1RvZFv6l35QQ/Mvv39XXgGzQpoAAAAASUVORK5CYII="); background-repeat:no-repeat; background-position:8%; background-clip:padding-box; @@ -1049,40 +1054,40 @@ body.admin { } } -.column-link[href="/web/timelines/public"] { - background-image: url("../images/icon_public.png"); +.column-link[href="/web/timelines/public"] { + background-image: url("../images/icon_public.png"); &:hover { background-image: url("../images/icon_public.png"); } } -.column-link[href="/web/timelines/public/local"] { - background-image: url("../images/icon_local.png"); +.column-link[href="/web/timelines/public/local"] { + background-image: url("../images/icon_local.png"); &:hover { background-image: url("../images/icon_local.png"); } } -.column-link[href="/web/pinned"] { - background-image: url("../images/icon_pin.png"); +.column-link[href="/web/pinned"] { + background-image: url("../images/icon_pin.png"); &:hover { background-image: url("../images/icon_pin.png"); } } -.column-link[href="/web/favourites"] { - background-image: url("../images/icon_likes.png"); +.column-link[href="/web/favourites"] { + background-image: url("../images/icon_likes.png"); &:hover { background-image: url("../images/icon_likes.png"); } } -.column-link[href="/web/blocks"] { - background-image: url("../images/icon_blocks.png"); +.column-link[href="/web/blocks"] { + background-image: url("../images/icon_blocks.png"); &:hover { background-image: url("../images/icon_blocks.png"); } } -.column-link[href="/web/mutes"] { - background-image: url("../images/icon_mutes.png"); +.column-link[href="/web/mutes"] { + background-image: url("../images/icon_mutes.png"); &:hover { background-image: url("../images/icon_mutes.png"); } } -.column-link[href="/settings/preferences"] { - background-image: url("../images/icon_settings.png"); +.column-link[href="/settings/preferences"] { + background-image: url("../images/icon_settings.png"); &:hover { background-image: url("../images/icon_settings.png"); } } -.column-link[href="/about/more"] { - background-image: url("../images/icon_about.png"); +.column-link[href="/about/more"] { + background-image: url("../images/icon_about.png"); &:hover { background-image: url("../images/icon_about.png"); } } -.column-link[href="/auth/sign_out"] { - background-image: url("../images/icon_logout.png"); +.column-link[href="/auth/sign_out"] { + background-image: url("../images/icon_logout.png"); &:hover { background-image: url("../images/icon_logout.png"); } } @@ -1098,7 +1103,7 @@ body.admin { line-height:30px; padding-left:20px; padding-right:40px; - + left:0px; bottom:-30px; display:block; @@ -1106,9 +1111,9 @@ body.admin { background-color:#7f7f7f; width:200%; height:30px; - + -ms-transform: rotate(-90deg); - + -webkit-transform: rotate(-90deg); transform: rotate(-90deg); transform-origin:top left; @@ -1189,7 +1194,7 @@ body.admin { left:unset; } -.dropdown > .icon-button, .detailed-status__button > .icon-button, +.dropdown > .icon-button, .detailed-status__button > .icon-button, .status__action-bar > .icon-button, .star-icon i { /* i don't know what's going on with the inline styles someone should look at the react code */ @@ -1239,8 +1244,8 @@ body.admin { background:$win95-bg; } -.actions-modal::before, -.boost-modal::before, +.actions-modal::before, +.boost-modal::before, .confirmation-modal::before, .report-modal::before { content: "Confirmation"; @@ -1278,8 +1283,8 @@ body.admin { .confirmation-modal__cancel-button { color:black; - &:active, - &:focus, + &:active, + &:focus, &:hover { color:black; } @@ -1566,10 +1571,10 @@ a.table-action-link:hover, background-color:white; } -.simple_form input[type=text], -.simple_form input[type=number], -.simple_form input[type=email], -.simple_form input[type=password], +.simple_form input[type=text], +.simple_form input[type=number], +.simple_form input[type=email], +.simple_form input[type=password], .simple_form textarea { color:black; background-color:white; @@ -1580,8 +1585,8 @@ a.table-action-link:hover, } } -.simple_form button, -.simple_form .button, +.simple_form button, +.simple_form .button, .simple_form .block-button { background: $win95-bg; @@ -1608,8 +1613,8 @@ a.table-action-link:hover, } } -.simple_form button.negative, -.simple_form .button.negative, +.simple_form button.negative, +.simple_form .button.negative, .simple_form .block-button.negative { background: $win95-bg; @@ -1631,8 +1636,8 @@ a.table-action-link:hover, border-right-color:#f5f5f5; width:12px; height:12px; - display:inline-block; - vertical-align:middle; + display:inline-block; + vertical-align:middle; margin-right:2px; } diff --git a/app/javascript/themes/glitch/containers/mastodon.js b/app/javascript/themes/glitch/containers/mastodon.js index 3484706378a..755b5564a18 100644 --- a/app/javascript/themes/glitch/containers/mastodon.js +++ b/app/javascript/themes/glitch/containers/mastodon.js @@ -9,7 +9,7 @@ import UI from 'themes/glitch/features/ui'; import { hydrateStore } from 'themes/glitch/actions/store'; import { connectUserStream } from 'themes/glitch/actions/streaming'; import { IntlProvider, addLocaleData } from 'react-intl'; -import { getLocale } from 'mastodon/locales'; +import { getLocale } from 'locales'; import initialState from 'themes/glitch/util/initial_state'; const { localeData, messages } = getLocale(); diff --git a/app/javascript/themes/glitch/packs/common.js b/app/javascript/themes/glitch/packs/common.js index 3a62700bd10..f4fa129e1a7 100644 --- a/app/javascript/themes/glitch/packs/common.js +++ b/app/javascript/themes/glitch/packs/common.js @@ -1,3 +1,3 @@ import 'font-awesome/css/font-awesome.css'; -require.context('../../images/', true); -import './styles/index.scss'; +require.context('images/', true); +import 'themes/glitch/styles/index.scss'; diff --git a/app/javascript/themes/glitch/packs/home.js b/app/javascript/themes/glitch/packs/home.js index dada28317a8..69dddf51c1b 100644 --- a/app/javascript/themes/glitch/packs/home.js +++ b/app/javascript/themes/glitch/packs/home.js @@ -1,7 +1,7 @@ -import loadPolyfills from './util/load_polyfills'; +import loadPolyfills from 'themes/glitch/util/load_polyfills'; loadPolyfills().then(() => { - require('./util/main').default(); + require('themes/glitch/util/main').default(); }).catch(e => { console.error(e); }); diff --git a/app/javascript/themes/glitch/packs/public.js b/app/javascript/themes/glitch/packs/public.js index 6adacad9848..d9a1b965596 100644 --- a/app/javascript/themes/glitch/packs/public.js +++ b/app/javascript/themes/glitch/packs/public.js @@ -2,32 +2,14 @@ import loadPolyfills from 'themes/glitch/util/load_polyfills'; import { processBio } from 'themes/glitch/util/bio_metadata'; import ready from 'themes/glitch/util/ready'; -window.addEventListener('message', e => { - const data = e.data || {}; - - if (!window.parent || data.type !== 'setHeight') { - return; - } - - ready(() => { - window.parent.postMessage({ - type: 'setHeight', - id: data.id, - height: document.getElementsByTagName('html')[0].scrollHeight, - }, '*'); - }); -}); - function main() { - const { length } = require('stringz'); const IntlRelativeFormat = require('intl-relativeformat').default; - const { delegate } = require('rails-ujs'); - const emojify = require('../themes/glitch/util/emoji').default; - const { getLocale } = require('mastodon/locales'); + const emojify = require('themes/glitch/util/emoji').default; + const { getLocale } = require('locales'); const { localeData } = getLocale(); - const VideoContainer = require('../themes/glitch/containers/video_container').default; - const MediaGalleryContainer = require('../themes/glitch/containers/media_gallery_container').default; - const CardContainer = require('../themes/glitch/containers/card_container').default; + const VideoContainer = require('themes/glitch/containers/video_container').default; + const MediaGalleryContainer = require('themes/glitch/containers/media_gallery_container').default; + const CardContainer = require('themes/glitch/containers/card_container').default; const React = require('react'); const ReactDOM = require('react-dom'); @@ -87,61 +69,6 @@ function main() { ReactDOM.render(, content); }); }); - - delegate(document, '.webapp-btn', 'click', ({ target, button }) => { - if (button !== 0) { - return true; - } - window.location.href = target.href; - return false; - }); - - delegate(document, '.status__content__spoiler-link', 'click', ({ target }) => { - const contentEl = target.parentNode.parentNode.querySelector('.e-content'); - - if (contentEl.style.display === 'block') { - contentEl.style.display = 'none'; - target.parentNode.style.marginBottom = 0; - } else { - contentEl.style.display = 'block'; - target.parentNode.style.marginBottom = null; - } - - return false; - }); - - delegate(document, '.account_display_name', 'input', ({ target }) => { - const nameCounter = document.querySelector('.name-counter'); - - if (nameCounter) { - nameCounter.textContent = 30 - length(target.value); - } - }); - - delegate(document, '.account_note', 'input', ({ target }) => { - const noteCounter = document.querySelector('.note-counter'); - - if (noteCounter) { - const noteWithoutMetadata = processBio(target.value).text; - noteCounter.textContent = 500 - length(noteWithoutMetadata); - } - }); - - delegate(document, '#account_avatar', 'change', ({ target }) => { - const avatar = document.querySelector('.card.compact .avatar img'); - const [file] = target.files || []; - const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc; - - avatar.src = url; - }); - - delegate(document, '#account_header', 'change', ({ target }) => { - const header = document.querySelector('.card.compact'); - const [file] = target.files || []; - const url = file ? URL.createObjectURL(file) : header.dataset.originalSrc; - - header.style.backgroundImage = `url(${url})`; - }); } loadPolyfills().then(main).catch(error => { diff --git a/app/javascript/themes/glitch/theme.yml b/app/javascript/themes/glitch/theme.yml index cf3fa32c2d3..ac6f57546cf 100644 --- a/app/javascript/themes/glitch/theme.yml +++ b/app/javascript/themes/glitch/theme.yml @@ -1,25 +1,34 @@ # (REQUIRED) The location of the pack files. pack: about: packs/about.js - admin: null - common: packs/common.js - embed: null - home: packs/home.js + admin: + auth: + common: + filename: packs/common.js + stylesheet: true + embed: packs/public.js + error: + home: + filename: packs/home.js + preload: + - themes/glitch/async/getting_started + - themes/glitch/async/compose + - themes/glitch/async/home_timeline + - themes/glitch/async/notifications + stylesheet: true + modal: public: packs/public.js - settings: null + settings: share: packs/share.js # (OPTIONAL) The directory which contains the pack files. # Defaults to the theme directory (`app/javascript/themes/[theme]`), # which should be sufficient for like 99% of use-cases lol. -# pack_directory: app/javascript/packs -# (OPTIONAL) Additional javascript resources to preload, for use with -# lazy-loaded components. It is **STRONGLY RECOMMENDED** that you -# derive these pathnames from `themes/[your-theme]` to ensure that -# they stay unique. -preload: -- themes/glitch/async/getting_started -- themes/glitch/async/compose -- themes/glitch/async/home_timeline -- themes/glitch/async/notifications +# pack_directory: app/javascript/packs + +# (OPTIONAL) By default the theme will fallback to the default theme +# if a particular pack is not provided. You can specify different +# fallbacks here, or disable fallback behaviours altogether by +# specifying a `null` value. +fallback: diff --git a/app/javascript/themes/vanilla/theme.yml b/app/javascript/themes/vanilla/theme.yml index b4a1598fc27..67fd9723e81 100644 --- a/app/javascript/themes/vanilla/theme.yml +++ b/app/javascript/themes/vanilla/theme.yml @@ -1,12 +1,23 @@ # (REQUIRED) The location of the pack files inside `pack_directory`. pack: about: about.js - admin: null - common: common.js - embed: null - home: application.js + admin: + auth: + common: + filename: common.js + stylesheet: true + embed: public.js + error: + home: + filename: application.js + preload: + - features/getting_started + - features/compose + - features/home_timeline + - features/notifications + modal: public: public.js - settings: null + settings: share: share.js # (OPTIONAL) The directory which contains the pack files. @@ -15,12 +26,8 @@ pack: # somewhere else. pack_directory: app/javascript/packs -# (OPTIONAL) Additional javascript resources to preload, for use with -# lazy-loaded components. It is **STRONGLY RECOMMENDED** that you -# derive these pathnames from `themes/[your-theme]` to ensure that -# they stay unique. (Of course, vanilla doesn't do this ^^;;) -preload: -- features/getting_started -- features/compose -- features/home_timeline -- features/notifications +# (OPTIONAL) By default the theme will fallback to the default theme +# if a particular pack is not provided. You can specify different +# fallbacks here, or disable fallback behaviours altogether by +# specifying a `null` value. +fallback: diff --git a/app/javascript/themes/win95/index.js b/app/javascript/themes/win95/index.js new file mode 100644 index 00000000000..bed6a1ef3dc --- /dev/null +++ b/app/javascript/themes/win95/index.js @@ -0,0 +1,10 @@ +// These lines are the same as in glitch: +import 'font-awesome/css/font-awesome.css'; +require.context('../../images/', true); + +// …But we want to use our own styles instead. +import 'styles/win95.scss'; + +// Be sure to make this style file import from +// `themes/glitch/styles/index.scss` (the glitch styling), and not +// `application.scss` (which are the vanilla styles). diff --git a/app/javascript/themes/win95/theme.yml b/app/javascript/themes/win95/theme.yml new file mode 100644 index 00000000000..43af381989f --- /dev/null +++ b/app/javascript/themes/win95/theme.yml @@ -0,0 +1,23 @@ +# win95 theme. + +# Ported over from `cybrespace:mastodon/theme_win95`. +# + +# You can use this theme file as inspiration for porting over +# a preëxisting Mastodon theme. + +# We only modify the `common` pack, which contains our styling. +pack: + common: + filename: index.js + stylesheet: true + # All unspecified packs will inherit from glitch. + +# By default, the glitch preloads will also be used here. You can +# disable them by setting `preload` to `null`. + +# preload: + +# The `fallback` parameter tells us to use glitch files for everything +# we haven't specified. +fallback: glitch diff --git a/app/lib/themes.rb b/app/lib/themes.rb index f7ec22fd2b8..7ced9f945a4 100644 --- a/app/lib/themes.rb +++ b/app/lib/themes.rb @@ -7,15 +7,27 @@ class Themes include Singleton def initialize + + core = YAML.load_file(Rails.root.join('app', 'javascript', 'core', 'theme.yml')) + core['pack'] = Hash.new unless core['pack'] + result = Hash.new Dir.glob(Rails.root.join('app', 'javascript', 'themes', '*', 'theme.yml')) do |path| data = YAML.load_file(path) name = File.basename(File.dirname(path)) if data['pack'] + data['name'] = name result[name] = data end end + + @core = core @conf = result + + end + + def core + @core end def get(name) diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml index 7ffa5ecc35d..d92362bd767 100644 --- a/app/views/about/more.html.haml +++ b/app/views/about/more.html.haml @@ -2,7 +2,6 @@ = site_hostname - content_for :header_tags do - = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' = render partial: 'shared/og' .landing-page diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml index 385b0b1dc37..4f5b53470a2 100644 --- a/app/views/about/show.html.haml +++ b/app/views/about/show.html.haml @@ -3,7 +3,6 @@ - content_for :header_tags do %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) - = javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous' = render partial: 'shared/og' .landing-page diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml index 5747cc27408..7dd962bf23b 100644 --- a/app/views/admin/reports/show.html.haml +++ b/app/views/admin/reports/show.html.haml @@ -1,6 +1,3 @@ -- content_for :header_tags do - = javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous' - - content_for :page_title do = t('admin.reports.report', id: @report.id) diff --git a/app/views/admin/statuses/index.html.haml b/app/views/admin/statuses/index.html.haml index fe25815274a..9747a92cf03 100644 --- a/app/views/admin/statuses/index.html.haml +++ b/app/views/admin/statuses/index.html.haml @@ -1,6 +1,3 @@ -- content_for :header_tags do - = javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous' - - content_for :page_title do = t('admin.statuses.title') diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index 63b3a0c26b3..e8a81656cc3 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -1,13 +1,7 @@ - content_for :header_tags do - - if theme_data['preload'] - - theme_data['preload'].each do |link| - %link{ href: asset_pack_path("#{link}.js"), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ %meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key} %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) - = javascript_pack_tag "themes/#{current_theme}", integrity: true, crossorigin: 'anonymous' - = stylesheet_pack_tag "themes/#{current_theme}", integrity: true, media: 'all' - .app-holder#mastodon{ data: { props: Oj.dump(default_props) } } %noscript = image_tag asset_pack_path('logo.svg'), alt: 'Mastodon' diff --git a/app/views/layouts/_theme.html.haml b/app/views/layouts/_theme.html.haml new file mode 100644 index 00000000000..cdec4b370d6 --- /dev/null +++ b/app/views/layouts/_theme.html.haml @@ -0,0 +1,10 @@ +- if theme + - if theme[:pack] != 'common' && theme[:common] + = render partial: 'layouts/theme', object: theme[:common] + - if theme[:pack] + = javascript_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, crossorigin: 'anonymous' + - if theme[:stylesheet] + = stylesheet_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' + - if theme[:preload] + - theme[:preload].each do |link| + %link{ href: asset_pack_path("#{link}.js"), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index c98d85f7bfe..66382db5000 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -1,6 +1,3 @@ -- content_for :header_tags do - = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' - - content_for :content do .admin-wrapper .sidebar-wrapper diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 24b74c787c0..99ae7d90d65 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -18,16 +18,16 @@ = ' - ' = title - = stylesheet_pack_tag 'common', media: 'all' - = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' + = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous' = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous' = csrf_meta_tags - - if controller_name != 'home' - = stylesheet_pack_tag 'application', integrity: true, media: 'all' - = yield :header_tags + -# These must come after :header_tags to ensure our initial state has been defined. + = render partial: 'layouts/theme', object: @core + = render partial: 'layouts/theme', object: @theme + - body_classes ||= @body_classes || '' - body_classes += ' system-font' if current_account&.user&.setting_system_font_ui diff --git a/app/views/layouts/auth.html.haml b/app/views/layouts/auth.html.haml index d8ac733f913..f4812ac6a3d 100644 --- a/app/views/layouts/auth.html.haml +++ b/app/views/layouts/auth.html.haml @@ -1,6 +1,3 @@ -- content_for :header_tags do - = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' - - content_for :content do .container .logo-container diff --git a/app/views/layouts/embedded.html.haml b/app/views/layouts/embedded.html.haml index 5fc60be170b..3960167bf88 100644 --- a/app/views/layouts/embedded.html.haml +++ b/app/views/layouts/embedded.html.haml @@ -4,10 +4,9 @@ %meta{ charset: 'utf-8' }/ %meta{ name: 'robots', content: 'noindex' }/ - = stylesheet_pack_tag 'common', media: 'all' = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' - = stylesheet_pack_tag 'application', integrity: true, media: 'all' + = javascript_pack_tag 'embed', integrity: true, crossorigin: 'anonymous' = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous' - = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' - %body.embed + = render partial: 'layouts/theme', object: @core + = render partial: 'layouts/theme', object: @theme = yield diff --git a/app/views/layouts/error.html.haml b/app/views/layouts/error.html.haml index d0eae44346c..9904b8fdd79 100644 --- a/app/views/layouts/error.html.haml +++ b/app/views/layouts/error.html.haml @@ -5,8 +5,8 @@ %meta{ charset: 'utf-8' }/ %title= safe_join([yield(:page_title), Setting.default_settings['site_title']], ' - ') %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/ - = stylesheet_pack_tag 'common', media: 'all' - = stylesheet_pack_tag 'application', integrity: true, media: 'all' + = render partial: 'layouts/theme', object: @core + = render partial: 'layouts/theme', object: @theme %body.error .dialog %img{ alt: Setting.default_settings['site_title'], src: '/oops.gif' }/ diff --git a/app/views/layouts/modal.html.haml b/app/views/layouts/modal.html.haml index a819e098d6c..d3519f032fa 100644 --- a/app/views/layouts/modal.html.haml +++ b/app/views/layouts/modal.html.haml @@ -1,6 +1,3 @@ -- content_for :header_tags do - = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' - - content_for :content do - if user_signed_in? .account-header diff --git a/app/views/layouts/public.html.haml b/app/views/layouts/public.html.haml index 83e92b938f3..b3795eaadd0 100644 --- a/app/views/layouts/public.html.haml +++ b/app/views/layouts/public.html.haml @@ -1,6 +1,3 @@ -- content_for :header_tags do - = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous' - - content_for :content do .container= yield .footer diff --git a/app/views/shares/show.html.haml b/app/views/shares/show.html.haml index 44b6f145f68..4c0390c4213 100644 --- a/app/views/shares/show.html.haml +++ b/app/views/shares/show.html.haml @@ -1,5 +1,4 @@ - content_for :header_tags do %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) - = javascript_pack_tag 'share', integrity: true, crossorigin: 'anonymous' #mastodon-compose{ data: { props: Oj.dump(default_props) } } diff --git a/app/views/tags/show.html.haml b/app/views/tags/show.html.haml index ea8b0faa333..e05fe1c3952 100644 --- a/app/views/tags/show.html.haml +++ b/app/views/tags/show.html.haml @@ -3,7 +3,6 @@ - content_for :header_tags do %script#initial-state{ type: 'application/json' }!= json_escape(@initial_state_json) - = javascript_pack_tag 'about', integrity: true, crossorigin: 'anonymous' = render 'og' .landing-page.tag-page diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js index 74f75d89b38..9514bc547ac 100644 --- a/config/webpack/configuration.js +++ b/config/webpack/configuration.js @@ -12,14 +12,24 @@ const settings = safeLoad(readFileSync(configPath), 'utf8')[env.NODE_ENV]; const themeFiles = glob.sync('app/javascript/themes/*/theme.yml'); const themes = {}; +const core = function () { + const coreFile = resolve('app', 'javascript', 'core', 'theme.yml'); + const data = safeLoad(readFileSync(coreFile), 'utf8'); + if (!data.pack_directory) { + data.pack_directory = dirname(coreFile); + } + return data.pack ? data : {}; +}(); + for (let i = 0; i < themeFiles.length; i++) { const themeFile = themeFiles[i]; const data = safeLoad(readFileSync(themeFile), 'utf8'); + data.name = basename(dirname(themeFile)); if (!data.pack_directory) { data.pack_directory = dirname(themeFile); } if (data.pack) { - themes[basename(dirname(themeFile))] = data; + themes[data.name] = data; } } @@ -43,6 +53,7 @@ const output = { module.exports = { settings, + core, themes, env, loadersDir, diff --git a/config/webpack/generateLocalePacks.js b/config/webpack/generateLocalePacks.js index cd3bed50c0e..a943589f74c 100644 --- a/config/webpack/generateLocalePacks.js +++ b/config/webpack/generateLocalePacks.js @@ -57,7 +57,7 @@ Object.keys(glitchMessages).forEach(function (key) { // import messages from '../../app/javascript/mastodon/locales/${locale}.json'; import localeData from ${JSON.stringify(localeDataPath)}; -import { setLocale } from '../../app/javascript/mastodon/locales'; +import { setLocale } from 'locales'; ${glitchInject} setLocale({messages: mergedMessages, localeData: localeData}); `; diff --git a/config/webpack/shared.js b/config/webpack/shared.js index 5d176db4eb3..5b90f27fb5b 100644 --- a/config/webpack/shared.js +++ b/config/webpack/shared.js @@ -6,33 +6,37 @@ const { sync } = require('glob'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const ManifestPlugin = require('webpack-manifest-plugin'); const extname = require('path-complete-extname'); -const { env, settings, themes, output, loadersDir } = require('./configuration.js'); +const { env, settings, core, themes, output, loadersDir } = require('./configuration.js'); const localePackPaths = require('./generateLocalePacks'); -const extensionGlob = `**/*{${settings.extensions.join(',')}}*`; -const entryPath = join(settings.source_path, settings.source_entry_path); -const packPaths = sync(join(entryPath, extensionGlob)); +function reducePacks (data, into = {}) { + if (!data.pack) { + return into; + } + Object.keys(data.pack).reduce((map, entry) => { + const pack = data.pack[entry]; + if (!pack) { + return map; + } + const packFile = typeof pack === 'string' ? pack : pack.filename; + if (packFile) { + map[data.name ? `themes/${data.name}/${entry}` : `core/${entry}`] = resolve(data.pack_directory, packFile); + } + return map; + }, into); + return into; +} module.exports = { entry: Object.assign( - packPaths.reduce((map, entry) => { - const localMap = map; - const namespace = relative(join(entryPath), dirname(entry)); - localMap[join(namespace, basename(entry, extname(entry)))] = resolve(entry); - return localMap; - }, {}), + { locales: resolve('app', 'javascript', 'locales') }, localePackPaths.reduce((map, entry) => { const localMap = map; localMap[basename(entry, extname(entry, extname(entry)))] = resolve(entry); return localMap; }, {}), - Object.keys(themes).reduce( - (themePaths, name) => { - const themeData = themes[name]; - themePaths[`themes/${name}`] = resolve(themeData.pack_directory, themeData.pack); - return themePaths; - }, {} - ) + reducePacks(core), + Object.keys(themes).reduce((map, entry) => reducePacks(themes[entry], map), {}) ), output: { @@ -64,7 +68,7 @@ module.exports = { writeToFileEmit: true, }), new webpack.optimize.CommonsChunkPlugin({ - name: 'common', + name: 'locales', minChunks: Infinity, // It doesn't make sense to use common chunks with multiple frontend support. }), ], diff --git a/config/webpacker.yml b/config/webpacker.yml index 8d8470651ac..50d95813a54 100644 --- a/config/webpacker.yml +++ b/config/webpacker.yml @@ -2,7 +2,6 @@ default: &default source_path: app/javascript - source_entry_path: packs public_output_path: packs cache_path: tmp/cache/webpacker @@ -13,17 +12,6 @@ default: &default # Reload manifest.json on all requests so we reload latest compiled packs cache_manifest: false - extensions: - - .js - - .sass - - .scss - - .css - - .png - - .svg - - .gif - - .jpeg - - .jpg - development: <<: *default compile: true From 8812bab6875024f76c59ab43d1dd3717e5e6da68 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Tue, 21 Nov 2017 18:17:38 -0800 Subject: [PATCH 05/13] Minor fixes --- app/javascript/themes/win95/theme.yml | 5 ----- app/views/layouts/embedded.html.haml | 3 +-- config/webpack/configuration.js | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/app/javascript/themes/win95/theme.yml b/app/javascript/themes/win95/theme.yml index 43af381989f..c4ac8aa55fa 100644 --- a/app/javascript/themes/win95/theme.yml +++ b/app/javascript/themes/win95/theme.yml @@ -13,11 +13,6 @@ pack: stylesheet: true # All unspecified packs will inherit from glitch. -# By default, the glitch preloads will also be used here. You can -# disable them by setting `preload` to `null`. - -# preload: - # The `fallback` parameter tells us to use glitch files for everything # we haven't specified. fallback: glitch diff --git a/app/views/layouts/embedded.html.haml b/app/views/layouts/embedded.html.haml index 3960167bf88..93567051466 100644 --- a/app/views/layouts/embedded.html.haml +++ b/app/views/layouts/embedded.html.haml @@ -4,8 +4,7 @@ %meta{ charset: 'utf-8' }/ %meta{ name: 'robots', content: 'noindex' }/ - = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous' - = javascript_pack_tag 'embed', integrity: true, crossorigin: 'anonymous' + = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous' = javascript_pack_tag "locale_#{I18n.locale}", integrity: true, crossorigin: 'anonymous' = render partial: 'layouts/theme', object: @core = render partial: 'layouts/theme', object: @theme diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js index 9514bc547ac..f8741c5d86b 100644 --- a/config/webpack/configuration.js +++ b/config/webpack/configuration.js @@ -28,7 +28,7 @@ for (let i = 0; i < themeFiles.length; i++) { if (!data.pack_directory) { data.pack_directory = dirname(themeFile); } - if (data.pack) { + if (data.pack && typeof data.pack == 'object') { themes[data.name] = data; } } From 541fe9b110fce15c42ba15df27926552c234afd0 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Thu, 30 Nov 2017 19:29:47 -0800 Subject: [PATCH 06/13] Skins support --- app/controllers/application_controller.rb | 43 +++++++++++------ .../settings/preferences_controller.rb | 1 + app/javascript/core/common.js | 3 ++ app/javascript/core/settings.js | 6 +++ app/javascript/core/theme.yml | 4 +- app/javascript/packs/common.js | 4 +- app/javascript/skins/vanilla/win95.scss | 1 + .../styles/mastodon/components.scss | 8 ++-- app/javascript/styles/win95.scss | 48 +++++++++---------- app/javascript/themes/glitch/packs/common.js | 2 - app/javascript/themes/glitch/packs/public.js | 1 - app/javascript/themes/win95/index.js | 10 ---- app/javascript/themes/win95/theme.yml | 18 ------- app/lib/themes.rb | 25 ++++++++++ app/lib/user_settings_decorator.rb | 7 ++- app/models/user.rb | 2 +- app/views/layouts/_theme.html.haml | 7 ++- app/views/settings/preferences/show.html.haml | 1 + config/locales/simple_form.en.yml | 2 + config/settings.yml | 1 + config/webpack/configuration.js | 28 +++++++++-- config/webpack/shared.js | 20 +++++++- 22 files changed, 157 insertions(+), 85 deletions(-) create mode 100644 app/javascript/skins/vanilla/win95.scss delete mode 100644 app/javascript/themes/win95/index.js delete mode 100644 app/javascript/themes/win95/theme.yml diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7cc4eea2751..f5753963df9 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -12,6 +12,8 @@ class ApplicationController < ActionController::Base helper_method :current_account helper_method :current_session + helper_method :current_theme + helper_method :current_skin helper_method :single_user_mode? rescue_from ActionController::RoutingError, with: :not_found @@ -52,14 +54,14 @@ class ApplicationController < ActionController::Base new_user_session_path end - def pack(data, pack_name) + def pack(data, pack_name, skin = 'default') return nil unless pack?(data, pack_name) pack_data = { common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'), name: data['name'], pack: pack_name, preload: nil, - stylesheet: false + skin: nil, } if data['pack'][pack_name].is_a?(Hash) pack_data[:common] = nil if data['pack'][pack_name]['use_common'] == false @@ -68,7 +70,11 @@ class ApplicationController < ActionController::Base pack_data[:preload] = [data['pack'][pack_name]['preload']] if data['pack'][pack_name]['preload'].is_a?(String) pack_data[:preload] = data['pack'][pack_name]['preload'] if data['pack'][pack_name]['preload'].is_a?(Array) end - pack_data[:stylesheet] = true if data['pack'][pack_name]['stylesheet'] + if skin != 'default' && data['skin'][skin] + pack_data[:skin] = skin if data['skin'][skin].include?(pack_name) + else # default skin + pack_data[:skin] = 'default' if data['pack'][pack_name]['stylesheet'] + end end pack_data end @@ -80,39 +86,39 @@ class ApplicationController < ActionController::Base false end - def nil_pack(data, pack_name) + def nil_pack(data, pack_name, skin = 'default') { - common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'), + common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common', skin), name: data['name'], pack: nil, preload: nil, - stylesheet: false + skin: nil, } end - def resolve_pack(data, pack_name) - result = pack(data, pack_name) + def resolve_pack(data, pack_name, skin = 'default') + result = pack(data, pack_name, skin) unless result if data['name'] && data.key?('fallback') if data['fallback'].nil? - return nil_pack(data, pack_name) + return nil_pack(data, pack_name, skin) elsif data['fallback'].is_a?(String) && Themes.instance.get(data['fallback']) - return resolve_pack(Themes.instance.get(data['fallback']), pack_name) + return resolve_pack(Themes.instance.get(data['fallback']), pack_name, skin) elsif data['fallback'].is_a?(Array) data['fallback'].each do |fallback| - return resolve_pack(Themes.instance.get(fallback), pack_name) if Themes.instance.get(fallback) + return resolve_pack(Themes.instance.get(fallback), pack_name, skin) if Themes.instance.get(fallback) end end - return nil_pack(data, pack_name) + return nil_pack(data, pack_name, skin) end - return data.key?('name') && data['name'] != default_theme ? resolve_pack(Themes.instance.get(default_theme), pack_name) : nil_pack(data, pack_name) + return data.key?('name') && data['name'] != default_theme ? resolve_pack(Themes.instance.get(default_theme), pack_name, skin) : nil_pack(data, pack_name, skin) end result end def use_pack(pack_name) @core = resolve_pack(Themes.instance.core, pack_name) - @theme = resolve_pack(Themes.instance.get(current_theme), pack_name) + @theme = resolve_pack(Themes.instance.get(current_theme), pack_name, current_skin) end protected @@ -154,6 +160,15 @@ class ApplicationController < ActionController::Base current_user.setting_theme end + def default_skin + 'default' + end + + def current_skin + return default_skin unless Themes.instance.skins_for(current_theme).include? current_user&.setting_skin + current_user.setting_skin + end + def cache_collection(raw, klass) return raw unless klass.respond_to?(:with_includes) diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 3aefd90a2d2..56baebed261 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -39,6 +39,7 @@ class Settings::PreferencesController < Settings::BaseController :setting_system_font_ui, :setting_noindex, :setting_theme, + :setting_skin, notification_emails: %i(follow follow_request reblog favourite mention digest), interactions: %i(must_be_follower must_be_following) ) diff --git a/app/javascript/core/common.js b/app/javascript/core/common.js index 24c0fdf6125..bb4b9793518 100644 --- a/app/javascript/core/common.js +++ b/app/javascript/core/common.js @@ -1,5 +1,8 @@ // This file will be loaded on all pages, regardless of theme. import { start } from 'rails-ujs'; +import 'font-awesome/css/font-awesome.css'; + +require.context('images/', true); start(); diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index 7fb1d8e77ab..bc5f9ed1d9e 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -3,6 +3,8 @@ const { length } = require('stringz'); const { delegate } = require('rails-ujs'); +import { processBio } from 'themes/glitch/util/bio_metadata'; + delegate(document, '.account_display_name', 'input', ({ target }) => { const nameCounter = document.querySelector('.name-counter'); @@ -35,3 +37,7 @@ delegate(document, '#account_header', 'change', ({ target }) => { header.style.backgroundImage = `url(${url})`; }); + +delegate(document, '#user_setting_theme', 'change', ({ target }) => { + target.form.submit(); +}); diff --git a/app/javascript/core/theme.yml b/app/javascript/core/theme.yml index 17e8e66b323..0dc05a1493b 100644 --- a/app/javascript/core/theme.yml +++ b/app/javascript/core/theme.yml @@ -4,7 +4,9 @@ pack: about: admin: admin.js auth: - common: common.js + common: + filename: common.js + stylesheet: true embed: embed.js error: home: diff --git a/app/javascript/packs/common.js b/app/javascript/packs/common.js index f3156c1c66f..5d42509c5f4 100644 --- a/app/javascript/packs/common.js +++ b/app/javascript/packs/common.js @@ -1,3 +1 @@ -import 'font-awesome/css/font-awesome.css'; -import 'styles/application.scss' -require.context('../images/', true); +import 'styles/application.scss'; diff --git a/app/javascript/skins/vanilla/win95.scss b/app/javascript/skins/vanilla/win95.scss new file mode 100644 index 00000000000..298f6ee9d51 --- /dev/null +++ b/app/javascript/skins/vanilla/win95.scss @@ -0,0 +1 @@ +@import 'styles/win95'; diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 0ded6f15967..8566585c5c2 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2075,7 +2075,7 @@ .getting-started { box-sizing: border-box; padding-bottom: 235px; - background: url('../images/mastodon-getting-started.png') no-repeat 0 100%; + background: url('~images/mastodon-getting-started.png') no-repeat 0 100%; flex: 1 0 auto; p { @@ -2270,7 +2270,7 @@ button.icon-button.active i.fa-retweet { justify-content: center; & > div { - background: url('../images/mastodon-not-found.png') no-repeat center -50px; + background: url('~images/mastodon-not-found.png') no-repeat center -50px; padding-top: 210px; width: 100%; } @@ -3143,7 +3143,7 @@ button.icon-button.active i.fa-retweet { img, canvas { display: block; - background: url('../images/void.png') repeat; + background: url('~images/void.png') repeat; object-fit: contain; } @@ -3390,7 +3390,7 @@ button.icon-button.active i.fa-retweet { } .onboarding-modal__page-one__elephant-friend { - background: url('../images/elephant-friend-1.png') no-repeat center center / contain; + background: url('~images/elephant-friend-1.png') no-repeat center center / contain; width: 155px; height: 193px; margin-right: 15px; diff --git a/app/javascript/styles/win95.scss b/app/javascript/styles/win95.scss index 6c89fc5bf6a..d683218b060 100644 --- a/app/javascript/styles/win95.scss +++ b/app/javascript/styles/win95.scss @@ -1,7 +1,7 @@ // win95 theme from cybrespace. -// Modified to inherit glitch styles (themes/glitch/styles/index.scss) -// instead of vanilla ones (./application.scss) +// Modified by kibi! to use webpack package syntax for urls (eg, +// `url(~images/…)`) for easy importing into skins. $win95-bg: #bfbfbf; $win95-dark-grey: #404040; @@ -73,10 +73,10 @@ $ui-highlight-color: $win95-window-header; @font-face { font-family:"premillenium"; - src: url('../fonts/premillenium/MSSansSerif.ttf') format('truetype'); + src: url('~fonts/premillenium/MSSansSerif.ttf') format('truetype'); } -@import '../themes/glitch/styles/index'; // Imports glitch themes +@import 'application'; /* borrowed from cybrespace style: wider columns and full column width images */ @@ -179,7 +179,7 @@ body.admin { font-size:0px; color:$win95-bg; - background-image: url("../images/start.png"); + background-image: url("~images/start.png"); background-repeat:no-repeat; background-position:8%; background-clip:padding-box; @@ -716,7 +716,7 @@ body.admin { font-size:0px; color:$win95-bg; - background-image: url("../images/start.png"); + background-image: url("~images/start.png"); background-repeat:no-repeat; background-position:8%; background-clip:padding-box; @@ -1055,40 +1055,40 @@ body.admin { } .column-link[href="/web/timelines/public"] { - background-image: url("../images/icon_public.png"); - &:hover { background-image: url("../images/icon_public.png"); } + background-image: url("~images/icon_public.png"); + &:hover { background-image: url("~images/icon_public.png"); } } .column-link[href="/web/timelines/public/local"] { - background-image: url("../images/icon_local.png"); - &:hover { background-image: url("../images/icon_local.png"); } + background-image: url("~images/icon_local.png"); + &:hover { background-image: url("~images/icon_local.png"); } } .column-link[href="/web/pinned"] { - background-image: url("../images/icon_pin.png"); - &:hover { background-image: url("../images/icon_pin.png"); } + background-image: url("~images/icon_pin.png"); + &:hover { background-image: url("~images/icon_pin.png"); } } .column-link[href="/web/favourites"] { - background-image: url("../images/icon_likes.png"); - &:hover { background-image: url("../images/icon_likes.png"); } + background-image: url("~images/icon_likes.png"); + &:hover { background-image: url("~images/icon_likes.png"); } } .column-link[href="/web/blocks"] { - background-image: url("../images/icon_blocks.png"); - &:hover { background-image: url("../images/icon_blocks.png"); } + background-image: url("~images/icon_blocks.png"); + &:hover { background-image: url("~images/icon_blocks.png"); } } .column-link[href="/web/mutes"] { - background-image: url("../images/icon_mutes.png"); - &:hover { background-image: url("../images/icon_mutes.png"); } + background-image: url("~images/icon_mutes.png"); + &:hover { background-image: url("~images/icon_mutes.png"); } } .column-link[href="/settings/preferences"] { - background-image: url("../images/icon_settings.png"); - &:hover { background-image: url("../images/icon_settings.png"); } + background-image: url("~images/icon_settings.png"); + &:hover { background-image: url("~images/icon_settings.png"); } } .column-link[href="/about/more"] { - background-image: url("../images/icon_about.png"); - &:hover { background-image: url("../images/icon_about.png"); } + background-image: url("~images/icon_about.png"); + &:hover { background-image: url("~images/icon_about.png"); } } .column-link[href="/auth/sign_out"] { - background-image: url("../images/icon_logout.png"); - &:hover { background-image: url("../images/icon_logout.png"); } + background-image: url("~images/icon_logout.png"); + &:hover { background-image: url("~images/icon_logout.png"); } } .getting-started__footer { diff --git a/app/javascript/themes/glitch/packs/common.js b/app/javascript/themes/glitch/packs/common.js index f4fa129e1a7..fd4254a0e4a 100644 --- a/app/javascript/themes/glitch/packs/common.js +++ b/app/javascript/themes/glitch/packs/common.js @@ -1,3 +1 @@ -import 'font-awesome/css/font-awesome.css'; -require.context('images/', true); import 'themes/glitch/styles/index.scss'; diff --git a/app/javascript/themes/glitch/packs/public.js b/app/javascript/themes/glitch/packs/public.js index d9a1b965596..410e66716b2 100644 --- a/app/javascript/themes/glitch/packs/public.js +++ b/app/javascript/themes/glitch/packs/public.js @@ -1,5 +1,4 @@ import loadPolyfills from 'themes/glitch/util/load_polyfills'; -import { processBio } from 'themes/glitch/util/bio_metadata'; import ready from 'themes/glitch/util/ready'; function main() { diff --git a/app/javascript/themes/win95/index.js b/app/javascript/themes/win95/index.js deleted file mode 100644 index bed6a1ef3dc..00000000000 --- a/app/javascript/themes/win95/index.js +++ /dev/null @@ -1,10 +0,0 @@ -// These lines are the same as in glitch: -import 'font-awesome/css/font-awesome.css'; -require.context('../../images/', true); - -// …But we want to use our own styles instead. -import 'styles/win95.scss'; - -// Be sure to make this style file import from -// `themes/glitch/styles/index.scss` (the glitch styling), and not -// `application.scss` (which are the vanilla styles). diff --git a/app/javascript/themes/win95/theme.yml b/app/javascript/themes/win95/theme.yml deleted file mode 100644 index c4ac8aa55fa..00000000000 --- a/app/javascript/themes/win95/theme.yml +++ /dev/null @@ -1,18 +0,0 @@ -# win95 theme. - -# Ported over from `cybrespace:mastodon/theme_win95`. -# - -# You can use this theme file as inspiration for porting over -# a preëxisting Mastodon theme. - -# We only modify the `common` pack, which contains our styling. -pack: - common: - filename: index.js - stylesheet: true - # All unspecified packs will inherit from glitch. - -# The `fallback` parameter tells us to use glitch files for everything -# we haven't specified. -fallback: glitch diff --git a/app/lib/themes.rb b/app/lib/themes.rb index 7ced9f945a4..0819e2c9087 100644 --- a/app/lib/themes.rb +++ b/app/lib/themes.rb @@ -17,10 +17,31 @@ class Themes name = File.basename(File.dirname(path)) if data['pack'] data['name'] = name + data['skin'] = { 'default' => [] } result[name] = data end end + Dir.glob(Rails.root.join('app', 'javascript', 'skins', '*', '*')) do |path| + ext = File.extname(path) + skin = File.basename(path) + name = File.basename(File.dirname(path)) + if result[name] + if File.directory?(path) + pack = [] + Dir.glob(File.join(path, '*.{css,scss}')) do |sheet| + pack.push(File.basename(sheet, File.extname(sheet))) + end + elsif ext.match?(/^\.s?css$/i) + skin = File.basename(path, ext) + pack = ['common'] + end + if skin != 'default' + result[name]['skin'][skin] = pack + end + end + end + @core = core @conf = result @@ -37,4 +58,8 @@ class Themes def names @conf.keys end + + def skins_for(name) + @conf[name]['skin'].keys + end end diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb index d86959c0bb1..730c7017726 100644 --- a/app/lib/user_settings_decorator.rb +++ b/app/lib/user_settings_decorator.rb @@ -27,6 +27,7 @@ class UserSettingsDecorator user.settings['system_font_ui'] = system_font_ui_preference if change?('setting_system_font_ui') user.settings['noindex'] = noindex_preference if change?('setting_noindex') user.settings['theme'] = theme_preference if change?('setting_theme') + user.settings['skin'] = skin_preference if change?('setting_skin') end def merged_notification_emails @@ -76,7 +77,11 @@ class UserSettingsDecorator def theme_preference settings['setting_theme'] end - + + def skin_preference + settings['setting_skin'] + end + def boolean_cast_setting(key) settings[key] == '1' end diff --git a/app/models/user.rb b/app/models/user.rb index b9b228c00d0..1d42d4f7019 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -74,7 +74,7 @@ class User < ApplicationRecord has_many :session_activations, dependent: :destroy delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :delete_modal, - :reduce_motion, :system_font_ui, :noindex, :theme, + :reduce_motion, :system_font_ui, :noindex, :theme, :skin, to: :settings, prefix: :setting, allow_nil: false def confirmed? diff --git a/app/views/layouts/_theme.html.haml b/app/views/layouts/_theme.html.haml index cdec4b370d6..941ccc9148c 100644 --- a/app/views/layouts/_theme.html.haml +++ b/app/views/layouts/_theme.html.haml @@ -3,8 +3,11 @@ = render partial: 'layouts/theme', object: theme[:common] - if theme[:pack] = javascript_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, crossorigin: 'anonymous' - - if theme[:stylesheet] - = stylesheet_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' + - if theme[:skin] + - if !theme[:name] || theme[:skin] == 'default' + = stylesheet_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' + - else + = stylesheet_pack_tag "skins/#{theme[:name]}/#{theme[:skin]}/#{theme[:pack]}" - if theme[:preload] - theme[:preload].each do |link| %link{ href: asset_pack_path("#{link}.js"), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 69e26a7be2c..0d487d9f38a 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -28,6 +28,7 @@ .fields-group - if Themes.instance.names.size > 1 = f.input :setting_theme, collection: Themes.instance.names, label_method: lambda { |theme| I18n.t("themes.#{theme}", default: theme) }, wrapper: :with_label, include_blank: false + = f.input :setting_skin, collection: Themes.instance.skins_for(current_theme), label_method: lambda { |skin| I18n.t("themes.#{current_theme}.skins.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label = f.input :setting_boost_modal, as: :boolean, wrapper: :with_label diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index faf41f316c6..b9ef21fef17 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -15,6 +15,7 @@ en: other: %{count} characters left setting_noindex: Affects your public profile and status pages setting_theme: Affects how Mastodon looks when you're logged in from any device. + setting_skin: Reskins the selected Mastodon theme imports: data: CSV file exported from another Mastodon instance sessions: @@ -47,6 +48,7 @@ en: setting_reduce_motion: Reduce motion in animations setting_system_font_ui: Use system's default font setting_theme: Site theme + setting_skin: Skin setting_unfollow_modal: Show confirmation dialog before unfollowing someone severity: Severity type: Import type diff --git a/config/settings.yml b/config/settings.yml index 6983484d0e4..5abf647e870 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -26,6 +26,7 @@ defaults: &defaults system_font_ui: false noindex: false theme: 'glitch' + skin: 'default' notification_emails: follow: false reblog: false diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js index f8741c5d86b..cb31c6ab835 100644 --- a/config/webpack/configuration.js +++ b/config/webpack/configuration.js @@ -1,15 +1,16 @@ // Common configuration for webpacker loaded from config/webpacker.yml -const { basename, dirname, join, resolve } = require('path'); +const { basename, dirname, extname, join, resolve } = require('path'); const { env } = require('process'); const { safeLoad } = require('js-yaml'); -const { readFileSync } = require('fs'); +const { lstatSync, readFileSync } = require('fs'); const glob = require('glob'); const configPath = resolve('config', 'webpacker.yml'); const loadersDir = join(__dirname, 'loaders'); const settings = safeLoad(readFileSync(configPath), 'utf8')[env.NODE_ENV]; const themeFiles = glob.sync('app/javascript/themes/*/theme.yml'); +const skinFiles = glob.sync('app/javascript/skins/*/*'); const themes = {}; const core = function () { @@ -25,14 +26,35 @@ for (let i = 0; i < themeFiles.length; i++) { const themeFile = themeFiles[i]; const data = safeLoad(readFileSync(themeFile), 'utf8'); data.name = basename(dirname(themeFile)); + data.skin = {}; if (!data.pack_directory) { data.pack_directory = dirname(themeFile); } - if (data.pack && typeof data.pack == 'object') { + if (data.pack && typeof data.pack === 'object') { themes[data.name] = data; } } +for (let i = 0; i < skinFiles.length; i++) { + const skinFile = skinFiles[i]; + let skin = basename(skinFile); + const name = basename(dirname(skinFile)); + if (!themes[name]) { + continue; + } + const data = themes[name].skin; + if (lstatSync(skinFile).isDirectory()) { + data[skin] = {}; + const skinPacks = glob.sync(skinFile, '*.{css,scss}'); + for (let j = 0; j < skinPacks.length; j++) { + const pack = skinPacks[i]; + data[skin][basename(pack, extname(pack))] = pack; + } + } else if ((skin = skin.match(/^(.*)\.s?css$/i))) { + data[skin[1]] = { common: skinFile }; + } +} + function removeOuterSlashes(string) { return string.replace(/^\/*/, '').replace(/\/*$/, ''); } diff --git a/config/webpack/shared.js b/config/webpack/shared.js index 5b90f27fb5b..a2550bc8198 100644 --- a/config/webpack/shared.js +++ b/config/webpack/shared.js @@ -1,7 +1,7 @@ // Note: You must restart bin/webpack-dev-server for changes to take effect const webpack = require('webpack'); -const { basename, dirname, join, relative, resolve } = require('path'); +const { basename, join, resolve } = require('path'); const { sync } = require('glob'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const ManifestPlugin = require('webpack-manifest-plugin'); @@ -24,6 +24,24 @@ function reducePacks (data, into = {}) { } return map; }, into); + if (data.name) { + Object.keys(data.skin).reduce((map, entry) => { + const skin = data.skin[entry]; + const skinName = entry; + if (!skin) { + return map; + } + Object.keys(skin).reduce((map, entry) => { + const packFile = skin[entry]; + if (!packFile) { + return map; + } + map[`skins/${data.name}/${skinName}/${entry}`] = resolve(packFile); + return map; + }, into); + return map; + }, into); + } return into; } From d216547382cf1f3419de31e1ee06272e816ea339 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sun, 3 Dec 2017 22:30:45 -0800 Subject: [PATCH 07/13] Fixed typos --- app/controllers/auth/registrations_controller.rb | 2 +- app/lib/themes.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb index cc7a69ab07e..42e852c0493 100644 --- a/app/controllers/auth/registrations_controller.rb +++ b/app/controllers/auth/registrations_controller.rb @@ -5,7 +5,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController before_action :check_enabled_registrations, only: [:new, :create] before_action :configure_sign_up_params, only: [:create] - before_action :set_path + before_action :set_pack before_action :set_sessions, only: [:edit, :update] before_action :set_instance_presenter, only: [:new, :create, :update] diff --git a/app/lib/themes.rb b/app/lib/themes.rb index 0819e2c9087..f1796d0e367 100644 --- a/app/lib/themes.rb +++ b/app/lib/themes.rb @@ -32,7 +32,7 @@ class Themes Dir.glob(File.join(path, '*.{css,scss}')) do |sheet| pack.push(File.basename(sheet, File.extname(sheet))) end - elsif ext.match?(/^\.s?css$/i) + elsif ext.match(/^\.s?css$/i) skin = File.basename(path, ext) pack = ['common'] end From bc4fa6b198557a7f3989eb0865e2c77ac7451d29 Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sun, 3 Dec 2017 23:26:40 -0800 Subject: [PATCH 08/13] Rename themes -> flavours ? ? --- .gitmodules | 3 - app/controllers/application_controller.rb | 36 +++--- app/javascript/core/settings.js | 2 +- .../glitch/actions/accounts.js | 2 +- .../glitch/actions/alerts.js | 0 .../glitch/actions/blocks.js | 2 +- .../glitch/actions/bundles.js | 0 .../glitch/actions/cards.js | 2 +- .../glitch/actions/columns.js | 0 .../glitch/actions/compose.js | 4 +- .../glitch/actions/domain_blocks.js | 2 +- .../glitch/actions/emojis.js | 0 .../glitch/actions/favourites.js | 2 +- .../glitch/actions/height_cache.js | 0 .../glitch/actions/interactions.js | 2 +- .../glitch/actions/local_settings.js | 0 .../glitch/actions/modal.js | 0 .../glitch/actions/mutes.js | 4 +- .../glitch/actions/notifications.js | 2 +- .../glitch/actions/onboarding.js | 0 .../glitch/actions/pin_statuses.js | 4 +- .../glitch/actions/push_notifications.js | 0 .../glitch/actions/reports.js | 2 +- .../glitch/actions/search.js | 2 +- .../glitch/actions/settings.js | 0 .../glitch/actions/statuses.js | 2 +- .../glitch/actions/store.js | 0 .../glitch/actions/streaming.js | 2 +- .../glitch/actions/timelines.js | 2 +- .../glitch/components/account.js | 2 +- .../glitch/components/attachment_list.js | 0 .../glitch/components/autosuggest_emoji.js | 2 +- .../glitch/components/autosuggest_textarea.js | 4 +- .../glitch/components/avatar.js | 0 .../glitch/components/avatar_overlay.js | 0 .../glitch/components/button.js | 0 .../glitch/components/collapsable.js | 2 +- .../glitch/components/column.js | 2 +- .../glitch/components/column_back_button.js | 0 .../components/column_back_button_slim.js | 0 .../glitch/components/column_header.js | 3 +- .../glitch/components/display_name.js | 0 .../glitch/components/dropdown_menu.js | 2 +- .../components/extended_video_player.js | 0 .../glitch/components/icon_button.js | 2 +- .../intersection_observer_article.js | 4 +- .../glitch/components/load_more.js | 0 .../glitch/components/loading_indicator.js | 0 .../glitch/components/media_gallery.js | 4 +- .../glitch/components/missing_indicator.js | 0 .../components/notification_purge_buttons.js | 0 .../glitch/components/permalink.js | 0 .../glitch/components/relative_timestamp.js | 0 .../glitch/components/scrollable_list.js | 6 +- .../glitch/components/setting_text.js | 0 .../glitch/components/status.js | 4 +- .../glitch/components/status_action_bar.js | 7 +- .../glitch/components/status_content.js | 2 +- .../glitch/components/status_header.js | 0 .../glitch/components/status_list.js | 2 +- .../glitch/components/status_prepend.js | 0 .../components/status_visibility_icon.js | 0 .../glitch/containers/account_container.js | 12 +- .../glitch/containers/card_container.js | 2 +- .../glitch/containers/compose_container.js | 8 +- .../containers/dropdown_menu_container.js | 6 +- ...intersection_observer_article_container.js | 4 +- .../glitch/containers/mastodon.js | 12 +- .../containers/media_gallery_container.js | 2 +- .../notification_purge_buttons_container.js | 6 +- .../glitch/containers/status_container.js | 20 +-- .../glitch/containers/timeline_container.js | 10 +- .../glitch/containers/video_container.js | 2 +- .../features/account/components/action_bar.js | 4 +- .../features/account/components/header.js | 10 +- .../account_gallery/components/media_item.js | 2 +- .../glitch/features/account_gallery/index.js | 16 +-- .../account_timeline/components/header.js | 6 +- .../containers/header_container.js | 16 +-- .../glitch/features/account_timeline/index.js | 4 +- .../glitch/features/blocks/index.js | 10 +- .../components/column_settings.js | 2 +- .../containers/column_settings_container.js | 2 +- .../features/community_timeline/index.js | 12 +- .../compose/components/advanced_options.js | 0 .../components/advanced_options_toggle.js | 0 .../compose/components/attach_options.js | 4 +- .../compose/components/autosuggest_account.js | 4 +- .../compose/components/character_counter.js | 0 .../compose/components/compose_form.js | 12 +- .../features/compose/components/dropdown.js | 2 +- .../components/emoji_picker_dropdown.js | 4 +- .../compose/components/navigation_bar.js | 6 +- .../compose/components/privacy_dropdown.js | 4 +- .../compose/components/reply_indicator.js | 6 +- .../features/compose/components/search.js | 2 +- .../compose/components/search_results.js | 4 +- .../compose/components/text_icon_button.js | 0 .../features/compose/components/upload.js | 4 +- .../compose/components/upload_button.js | 2 +- .../compose/components/upload_form.js | 0 .../compose/components/upload_progress.js | 2 +- .../features/compose/components/warning.js | 2 +- .../containers/advanced_options_container.js | 2 +- .../autosuggest_account_container.js | 2 +- .../containers/compose_form_container.js | 4 +- .../emoji_picker_dropdown_container.js | 4 +- .../containers/navigation_container.js | 2 +- .../containers/privacy_dropdown_container.js | 6 +- .../containers/reply_indicator_container.js | 4 +- .../compose/containers/search_container.js | 2 +- .../containers/search_results_container.js | 0 .../containers/sensitive_button_container.js | 6 +- .../containers/spoiler_button_container.js | 2 +- .../containers/upload_button_container.js | 2 +- .../compose/containers/upload_container.js | 2 +- .../containers/upload_form_container.js | 0 .../containers/upload_progress_container.js | 0 .../compose/containers/warning_container.js | 2 +- .../glitch/features/compose/index.js | 10 +- .../containers/column_settings_container.js | 4 +- .../glitch/features/direct_timeline/index.js | 12 +- .../features/favourited_statuses/index.js | 10 +- .../glitch/features/favourites/index.js | 10 +- .../components/account_authorize.js | 8 +- .../containers/account_authorize_container.js | 4 +- .../glitch/features/follow_requests/index.js | 8 +- .../glitch/features/followers/index.js | 14 +-- .../glitch/features/following/index.js | 14 +-- .../features/generic_not_found/index.js | 11 ++ .../glitch/features/getting_started/index.js | 10 +- .../glitch/features/hashtag_timeline/index.js | 12 +- .../components/column_settings.js | 4 +- .../containers/column_settings_container.js | 2 +- .../glitch/features/home_timeline/index.js | 10 +- .../glitch/features/local_settings/index.js | 4 +- .../local_settings/navigation/index.js | 0 .../local_settings/navigation/item/index.js | 0 .../local_settings/navigation/item/style.scss | 0 .../local_settings/navigation/style.scss | 0 .../features/local_settings/page/index.js | 0 .../local_settings/page/item/index.js | 0 .../local_settings/page/item/style.scss | 0 .../features/local_settings/page/style.scss | 0 .../glitch/features/local_settings/style.scss | 0 .../glitch/features/mutes/index.js | 10 +- .../components/clear_column_button.js | 0 .../components/column_settings.js | 0 .../notifications/components/follow.js | 4 +- .../notifications/components/notification.js | 2 +- .../notifications/components/overlay.js | 0 .../components/setting_toggle.js | 0 .../containers/column_settings_container.js | 8 +- .../containers/notification_container.js | 4 +- .../containers/overlay_container.js | 2 +- .../glitch/features/notifications/index.js | 10 +- .../glitch/features/pinned_statuses/index.js | 8 +- .../containers/column_settings_container.js | 4 +- .../glitch/features/public_timeline/index.js | 12 +- .../glitch/features/reblogs/index.js | 10 +- .../report/components/status_check_box.js | 0 .../containers/status_check_box_container.js | 2 +- .../features/standalone/compose/index.js | 20 +++ .../standalone/hashtag_timeline/index.js | 8 +- .../standalone/public_timeline/index.js | 8 +- .../features/status/components/action_bar.js | 6 +- .../glitch/features/status/components/card.js | 0 .../status/components/detailed_status.js | 14 +-- .../status/containers/card_container.js | 0 .../glitch/features/status/index.js | 26 ++-- .../features/ui/components/actions_modal.js | 10 +- .../features/ui/components/boost_modal.js | 10 +- .../glitch/features/ui/components/bundle.js | 0 .../ui/components/bundle_column_error.js | 4 +- .../ui/components/bundle_modal_error.js | 2 +- .../glitch/features/ui/components/column.js | 4 +- .../features/ui/components/column_header.js | 0 .../features/ui/components/column_link.js | 0 .../features/ui/components/column_loading.js | 4 +- .../ui/components/column_subheading.js | 0 .../features/ui/components/columns_area.js | 4 +- .../ui/components/confirmation_modal.js | 2 +- .../features/ui/components/doodle_modal.js | 6 +- .../features/ui/components/drawer_loading.js | 0 .../features/ui/components/embed_modal.js | 0 .../features/ui/components/image_loader.js | 0 .../features/ui/components/media_modal.js | 4 +- .../features/ui/components/modal_loading.js | 2 +- .../features/ui/components/modal_root.js | 2 +- .../features/ui/components/mute_modal.js | 8 +- .../ui/components/onboarding_modal.js | 10 +- .../features/ui/components/report_modal.js | 10 +- .../glitch/features/ui/components/tabs_bar.js | 2 +- .../features/ui/components/upload_area.js | 2 +- .../features/ui/components/video_modal.js | 2 +- .../ui/containers/bundle_container.js | 2 +- .../ui/containers/columns_area_container.js | 0 .../ui/containers/loading_bar_container.js | 0 .../features/ui/containers/modal_container.js | 2 +- .../ui/containers/notifications_container.js | 4 +- .../ui/containers/status_list_container.js | 6 +- .../glitch/features/ui/index.js | 16 +-- .../glitch/features/video/index.js | 2 +- .../glitch/middleware/errors.js | 2 +- .../glitch/middleware/loading_bar.js | 0 .../glitch/middleware/sounds.js | 0 .../glitch/packs/about.js | 6 +- .../flavours/glitch/packs/common.js | 1 + app/javascript/flavours/glitch/packs/home.js | 7 ++ .../glitch/packs/public.js | 12 +- .../glitch/packs/share.js | 6 +- .../glitch/reducers/accounts.js | 24 ++-- .../glitch/reducers/accounts_counters.js | 22 ++-- .../glitch/reducers/alerts.js | 2 +- .../glitch/reducers/cards.js | 2 +- .../glitch/reducers/compose.js | 10 +- .../glitch/reducers/contexts.js | 4 +- .../glitch/reducers/custom_emojis.js | 6 +- .../glitch/reducers/height_cache.js | 2 +- .../glitch/reducers/index.js | 0 .../glitch/reducers/local_settings.js | 4 +- .../glitch/reducers/media_attachments.js | 2 +- .../glitch/reducers/meta.js | 2 +- .../glitch/reducers/modal.js | 2 +- .../glitch/reducers/mutes.js | 2 +- .../glitch/reducers/notifications.js | 6 +- .../glitch/reducers/push_notifications.js | 4 +- .../glitch/reducers/relationships.js | 4 +- .../glitch/reducers/reports.js | 2 +- .../glitch/reducers/search.js | 4 +- .../glitch/reducers/settings.js | 10 +- .../glitch/reducers/status_lists.js | 6 +- .../glitch/reducers/statuses.js | 18 +-- .../glitch/reducers/timelines.js | 4 +- .../glitch/reducers/user_lists.js | 8 +- .../glitch/selectors/index.js | 0 .../glitch/service_worker/entry.js | 0 .../service_worker/web_push_notifications.js | 0 .../glitch/store/configureStore.js | 0 .../glitch/styles/_mixins.scss | 0 .../glitch/styles/about.scss | 0 .../glitch/styles/accounts.scss | 0 .../glitch/styles/admin.scss | 0 .../glitch/styles/basics.scss | 0 .../glitch/styles/boost.scss | 0 .../glitch/styles/compact_header.scss | 0 .../glitch/styles/components.scss | 0 .../glitch/styles/containers.scss | 0 .../glitch/styles/doodle.scss | 0 .../glitch/styles/emoji_picker.scss | 0 .../glitch/styles/footer.scss | 0 .../glitch/styles/forms.scss | 0 .../glitch/styles/index.scss | 0 .../glitch/styles/landing_strip.scss | 0 .../glitch/styles/lists.scss | 0 .../glitch/styles/reset copy.scss | 0 .../glitch/styles/reset.scss | 0 .../glitch/styles/rtl.scss | 0 .../glitch/styles/stream_entries.scss | 0 .../glitch/styles/tables.scss | 0 .../glitch/styles/variables.scss | 0 .../{themes => flavours}/glitch/theme.yml | 8 +- .../{themes => flavours}/glitch/util/api.js | 0 .../flavours/glitch/util/async-components.js | 115 ++++++++++++++++++ .../glitch/util/base_polyfills.js | 0 .../glitch/util/bio_metadata.js | 0 .../glitch/util/counter.js | 0 .../glitch/util/emoji/emoji_compressed.js | 0 .../glitch/util/emoji/emoji_map.json | 0 .../util/emoji/emoji_mart_data_light.js | 0 .../util/emoji/emoji_mart_search_light.js | 0 .../glitch/util/emoji/emoji_picker.js | 0 .../util/emoji/emoji_unicode_mapping_light.js | 0 .../glitch/util/emoji/emoji_utils.js | 0 .../glitch/util/emoji/index.js | 2 +- .../glitch/util/emoji/unicode_to_filename.js | 0 .../util/emoji/unicode_to_unified_name.js | 0 .../glitch/util/extra_polyfills.js | 0 .../glitch/util/fullscreen.js | 0 .../glitch/util/get_rect_from_entry.js | 0 .../glitch/util/initial_state.js | 0 .../util/intersection_observer_wrapper.js | 0 .../glitch/util/is_mobile.js | 0 .../glitch/util/link_header.js | 0 .../glitch/util/load_polyfills.js | 0 .../{themes => flavours}/glitch/util/main.js | 2 +- .../glitch/util/optional_motion.js | 2 +- .../glitch/util/performance.js | 0 .../glitch/util/react_router_helpers.js | 6 +- .../{themes => flavours}/glitch/util/ready.js | 0 .../glitch/util/reduced_motion.js | 0 .../{themes => flavours}/glitch/util/rtl.js | 0 .../glitch/util/schedule_idle_task.js | 0 .../glitch/util/scroll.js | 0 .../glitch/util/stream.js | 0 .../glitch/util/url_regex.js | 0 .../{themes => flavours}/glitch/util/uuid.js | 0 .../glitch/util/web_push_subscription.js | 4 +- .../{themes => flavours}/vanilla/theme.yml | 0 .../features/generic_not_found/index.js | 11 -- .../features/standalone/compose/index.js | 20 --- app/javascript/themes/glitch/packs/common.js | 1 - app/javascript/themes/glitch/packs/home.js | 7 -- .../themes/glitch/util/async-components.js | 115 ------------------ app/javascript/themes/mastodon-go | 1 - app/lib/themes.rb | 6 +- app/models/user.rb | 2 +- app/views/layouts/_theme.html.haml | 6 +- app/views/settings/preferences/show.html.haml | 2 +- config/locales/simple_form.en.yml | 6 +- config/settings.yml | 2 +- config/webpack/configuration.js | 22 ++-- config/webpack/shared.js | 6 +- 313 files changed, 665 insertions(+), 681 deletions(-) rename app/javascript/{themes => flavours}/glitch/actions/accounts.js (99%) rename app/javascript/{themes => flavours}/glitch/actions/alerts.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/blocks.js (97%) rename app/javascript/{themes => flavours}/glitch/actions/bundles.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/cards.js (96%) rename app/javascript/{themes => flavours}/glitch/actions/columns.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/compose.js (98%) rename app/javascript/{themes => flavours}/glitch/actions/domain_blocks.js (97%) rename app/javascript/{themes => flavours}/glitch/actions/emojis.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/favourites.js (97%) rename app/javascript/{themes => flavours}/glitch/actions/height_cache.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/interactions.js (99%) rename app/javascript/{themes => flavours}/glitch/actions/local_settings.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/modal.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/mutes.js (95%) rename app/javascript/{themes => flavours}/glitch/actions/notifications.js (99%) rename app/javascript/{themes => flavours}/glitch/actions/onboarding.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/pin_statuses.js (90%) rename app/javascript/{themes => flavours}/glitch/actions/push_notifications.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/reports.js (97%) rename app/javascript/{themes => flavours}/glitch/actions/search.js (96%) rename app/javascript/{themes => flavours}/glitch/actions/settings.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/statuses.js (99%) rename app/javascript/{themes => flavours}/glitch/actions/store.js (100%) rename app/javascript/{themes => flavours}/glitch/actions/streaming.js (96%) rename app/javascript/{themes => flavours}/glitch/actions/timelines.js (99%) rename app/javascript/{themes => flavours}/glitch/components/account.js (98%) rename app/javascript/{themes => flavours}/glitch/components/attachment_list.js (100%) rename app/javascript/{themes => flavours}/glitch/components/autosuggest_emoji.js (90%) rename app/javascript/{themes => flavours}/glitch/components/autosuggest_textarea.js (97%) rename app/javascript/{themes => flavours}/glitch/components/avatar.js (100%) rename app/javascript/{themes => flavours}/glitch/components/avatar_overlay.js (100%) rename app/javascript/{themes => flavours}/glitch/components/button.js (100%) rename app/javascript/{themes => flavours}/glitch/components/collapsable.js (92%) rename app/javascript/{themes => flavours}/glitch/components/column.js (95%) rename app/javascript/{themes => flavours}/glitch/components/column_back_button.js (100%) rename app/javascript/{themes => flavours}/glitch/components/column_back_button_slim.js (100%) rename app/javascript/{themes => flavours}/glitch/components/column_header.js (98%) rename app/javascript/{themes => flavours}/glitch/components/display_name.js (100%) rename app/javascript/{themes => flavours}/glitch/components/dropdown_menu.js (98%) rename app/javascript/{themes => flavours}/glitch/components/extended_video_player.js (100%) rename app/javascript/{themes => flavours}/glitch/components/icon_button.js (98%) rename app/javascript/{themes => flavours}/glitch/components/intersection_observer_article.js (96%) rename app/javascript/{themes => flavours}/glitch/components/load_more.js (100%) rename app/javascript/{themes => flavours}/glitch/components/loading_indicator.js (100%) rename app/javascript/{themes => flavours}/glitch/components/media_gallery.js (98%) rename app/javascript/{themes => flavours}/glitch/components/missing_indicator.js (100%) rename app/javascript/{themes => flavours}/glitch/components/notification_purge_buttons.js (100%) rename app/javascript/{themes => flavours}/glitch/components/permalink.js (100%) rename app/javascript/{themes => flavours}/glitch/components/relative_timestamp.js (100%) rename app/javascript/{themes => flavours}/glitch/components/scrollable_list.js (95%) rename app/javascript/{themes => flavours}/glitch/components/setting_text.js (100%) rename app/javascript/{themes => flavours}/glitch/components/status.js (98%) rename app/javascript/{themes => flavours}/glitch/components/status_action_bar.js (96%) rename app/javascript/{themes => flavours}/glitch/components/status_content.js (99%) rename app/javascript/{themes => flavours}/glitch/components/status_header.js (100%) rename app/javascript/{themes => flavours}/glitch/components/status_list.js (95%) rename app/javascript/{themes => flavours}/glitch/components/status_prepend.js (100%) rename app/javascript/{themes => flavours}/glitch/components/status_visibility_icon.js (100%) rename app/javascript/{themes => flavours}/glitch/containers/account_container.js (84%) rename app/javascript/{themes => flavours}/glitch/containers/card_container.js (84%) rename app/javascript/{themes => flavours}/glitch/containers/compose_container.js (74%) rename app/javascript/{themes => flavours}/glitch/containers/dropdown_menu_container.js (65%) rename app/javascript/{themes => flavours}/glitch/containers/intersection_observer_article_container.js (70%) rename app/javascript/{themes => flavours}/glitch/containers/mastodon.js (82%) rename app/javascript/{themes => flavours}/glitch/containers/media_gallery_container.js (92%) rename app/javascript/{themes => flavours}/glitch/containers/notification_purge_buttons_container.js (86%) rename app/javascript/{themes => flavours}/glitch/containers/status_container.js (85%) rename app/javascript/{themes => flavours}/glitch/containers/timeline_container.js (72%) rename app/javascript/{themes => flavours}/glitch/containers/video_container.js (91%) rename app/javascript/{themes => flavours}/glitch/features/account/components/action_bar.js (97%) rename app/javascript/{themes => flavours}/glitch/features/account/components/header.js (92%) rename app/javascript/{themes => flavours}/glitch/features/account_gallery/components/media_item.js (93%) rename app/javascript/{themes => flavours}/glitch/features/account_gallery/index.js (84%) rename app/javascript/{themes => flavours}/glitch/features/account_timeline/components/header.js (90%) rename app/javascript/{themes => flavours}/glitch/features/account_timeline/containers/header_container.js (86%) rename app/javascript/{themes => flavours}/glitch/features/account_timeline/index.js (93%) rename app/javascript/{themes => flavours}/glitch/features/blocks/index.js (81%) rename app/javascript/{themes => flavours}/glitch/features/community_timeline/components/column_settings.js (94%) rename app/javascript/{themes => flavours}/glitch/features/community_timeline/containers/column_settings_container.js (86%) rename app/javascript/{themes => flavours}/glitch/features/community_timeline/index.js (85%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/advanced_options.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/advanced_options_toggle.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/attach_options.js (96%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/autosuggest_account.js (82%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/character_counter.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/compose_form.js (96%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/dropdown.js (96%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/emoji_picker_dropdown.js (98%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/navigation_bar.js (87%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/privacy_dropdown.js (98%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/reply_indicator.js (90%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/search.js (98%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/search_results.js (93%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/text_icon_button.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/upload.js (96%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/upload_button.js (97%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/upload_form.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/upload_progress.js (94%) rename app/javascript/{themes => flavours}/glitch/features/compose/components/warning.js (93%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/advanced_options_container.js (85%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/autosuggest_account_container.js (86%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/compose_form_container.js (93%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/emoji_picker_dropdown_container.js (93%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/navigation_container.js (81%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/privacy_dropdown_container.js (73%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/reply_indicator_container.js (79%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/search_container.js (93%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/search_results_container.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/sensitive_button_container.js (91%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/spoiler_button_container.js (89%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/upload_button_container.js (90%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/upload_container.js (84%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/upload_form_container.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/upload_progress_container.js (100%) rename app/javascript/{themes => flavours}/glitch/features/compose/containers/warning_container.js (94%) rename app/javascript/{themes => flavours}/glitch/features/compose/index.js (93%) rename app/javascript/{themes => flavours}/glitch/features/direct_timeline/containers/column_settings_container.js (67%) rename app/javascript/{themes => flavours}/glitch/features/direct_timeline/index.js (85%) rename app/javascript/{themes => flavours}/glitch/features/favourited_statuses/index.js (87%) rename app/javascript/{themes => flavours}/glitch/features/favourites/index.js (79%) rename app/javascript/{themes => flavours}/glitch/features/follow_requests/components/account_authorize.js (87%) rename app/javascript/{themes => flavours}/glitch/features/follow_requests/containers/account_authorize_container.js (78%) rename app/javascript/{themes => flavours}/glitch/features/follow_requests/index.js (85%) rename app/javascript/{themes => flavours}/glitch/features/followers/index.js (83%) rename app/javascript/{themes => flavours}/glitch/features/following/index.js (83%) create mode 100644 app/javascript/flavours/glitch/features/generic_not_found/index.js rename app/javascript/{themes => flavours}/glitch/features/getting_started/index.js (95%) rename app/javascript/{themes => flavours}/glitch/features/hashtag_timeline/index.js (86%) rename app/javascript/{themes => flavours}/glitch/features/home_timeline/components/column_settings.js (92%) rename app/javascript/{themes => flavours}/glitch/features/home_timeline/containers/column_settings_container.js (84%) rename app/javascript/{themes => flavours}/glitch/features/home_timeline/index.js (86%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/index.js (91%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/navigation/index.js (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/navigation/item/index.js (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/navigation/item/style.scss (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/navigation/style.scss (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/page/index.js (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/page/item/index.js (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/page/item/style.scss (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/page/style.scss (100%) rename app/javascript/{themes => flavours}/glitch/features/local_settings/style.scss (100%) rename app/javascript/{themes => flavours}/glitch/features/mutes/index.js (81%) rename app/javascript/{themes => flavours}/glitch/features/notifications/components/clear_column_button.js (100%) rename app/javascript/{themes => flavours}/glitch/features/notifications/components/column_settings.js (100%) rename app/javascript/{themes => flavours}/glitch/features/notifications/components/follow.js (95%) rename app/javascript/{themes => flavours}/glitch/features/notifications/components/notification.js (96%) rename app/javascript/{themes => flavours}/glitch/features/notifications/components/overlay.js (100%) rename app/javascript/{themes => flavours}/glitch/features/notifications/components/setting_toggle.js (100%) rename app/javascript/{themes => flavours}/glitch/features/notifications/containers/column_settings_container.js (81%) rename app/javascript/{themes => flavours}/glitch/features/notifications/containers/notification_container.js (84%) rename app/javascript/{themes => flavours}/glitch/features/notifications/containers/overlay_container.js (84%) rename app/javascript/{themes => flavours}/glitch/features/notifications/index.js (94%) rename app/javascript/{themes => flavours}/glitch/features/pinned_statuses/index.js (82%) rename app/javascript/{themes => flavours}/glitch/features/public_timeline/containers/column_settings_container.js (67%) rename app/javascript/{themes => flavours}/glitch/features/public_timeline/index.js (85%) rename app/javascript/{themes => flavours}/glitch/features/reblogs/index.js (79%) rename app/javascript/{themes => flavours}/glitch/features/report/components/status_check_box.js (100%) rename app/javascript/{themes => flavours}/glitch/features/report/containers/status_check_box_container.js (88%) create mode 100644 app/javascript/flavours/glitch/features/standalone/compose/index.js rename app/javascript/{themes => flavours}/glitch/features/standalone/hashtag_timeline/index.js (84%) rename app/javascript/{themes => flavours}/glitch/features/standalone/public_timeline/index.js (85%) rename app/javascript/{themes => flavours}/glitch/features/status/components/action_bar.js (95%) rename app/javascript/{themes => flavours}/glitch/features/status/components/card.js (100%) rename app/javascript/{themes => flavours}/glitch/features/status/components/detailed_status.js (90%) rename app/javascript/{themes => flavours}/glitch/features/status/containers/card_container.js (100%) rename app/javascript/{themes => flavours}/glitch/features/status/index.js (91%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/actions_modal.js (86%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/boost_modal.js (88%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/bundle.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/bundle_column_error.js (88%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/bundle_modal_error.js (95%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/column.js (93%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/column_header.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/column_link.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/column_loading.js (83%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/column_subheading.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/columns_area.js (98%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/confirmation_modal.js (95%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/doodle_modal.js (98%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/drawer_loading.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/embed_modal.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/image_loader.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/media_modal.js (96%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/modal_loading.js (86%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/modal_root.js (98%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/mute_modal.js (91%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/onboarding_modal.js (97%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/report_modal.js (89%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/tabs_bar.js (98%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/upload_area.js (96%) rename app/javascript/{themes => flavours}/glitch/features/ui/components/video_modal.js (94%) rename app/javascript/{themes => flavours}/glitch/features/ui/containers/bundle_container.js (91%) rename app/javascript/{themes => flavours}/glitch/features/ui/containers/columns_area_container.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/containers/loading_bar_container.js (100%) rename app/javascript/{themes => flavours}/glitch/features/ui/containers/modal_container.js (86%) rename app/javascript/{themes => flavours}/glitch/features/ui/containers/notifications_container.js (76%) rename app/javascript/{themes => flavours}/glitch/features/ui/containers/status_list_container.js (92%) rename app/javascript/{themes => flavours}/glitch/features/ui/index.js (96%) rename app/javascript/{themes => flavours}/glitch/features/video/index.js (99%) rename app/javascript/{themes => flavours}/glitch/middleware/errors.js (92%) rename app/javascript/{themes => flavours}/glitch/middleware/loading_bar.js (100%) rename app/javascript/{themes => flavours}/glitch/middleware/sounds.js (100%) rename app/javascript/{themes => flavours}/glitch/packs/about.js (67%) create mode 100644 app/javascript/flavours/glitch/packs/common.js create mode 100644 app/javascript/flavours/glitch/packs/home.js rename app/javascript/{themes => flavours}/glitch/packs/public.js (85%) rename app/javascript/{themes => flavours}/glitch/packs/share.js (66%) rename app/javascript/{themes => flavours}/glitch/reducers/accounts.js (85%) rename app/javascript/{themes => flavours}/glitch/reducers/accounts_counters.js (87%) rename app/javascript/{themes => flavours}/glitch/reducers/alerts.js (93%) rename app/javascript/{themes => flavours}/glitch/reducers/cards.js (80%) rename app/javascript/{themes => flavours}/glitch/reducers/compose.js (97%) rename app/javascript/{themes => flavours}/glitch/reducers/contexts.js (91%) rename app/javascript/{themes => flavours}/glitch/reducers/custom_emojis.js (63%) rename app/javascript/{themes => flavours}/glitch/reducers/height_cache.js (85%) rename app/javascript/{themes => flavours}/glitch/reducers/index.js (100%) rename app/javascript/{themes => flavours}/glitch/reducers/local_settings.js (88%) rename app/javascript/{themes => flavours}/glitch/reducers/media_attachments.js (83%) rename app/javascript/{themes => flavours}/glitch/reducers/meta.js (84%) rename app/javascript/{themes => flavours}/glitch/reducers/modal.js (81%) rename app/javascript/{themes => flavours}/glitch/reducers/mutes.js (94%) rename app/javascript/{themes => flavours}/glitch/reducers/notifications.js (97%) rename app/javascript/{themes => flavours}/glitch/reducers/push_notifications.js (91%) rename app/javascript/{themes => flavours}/glitch/reducers/relationships.js (93%) rename app/javascript/{themes => flavours}/glitch/reducers/reports.js (97%) rename app/javascript/{themes => flavours}/glitch/reducers/search.js (90%) rename app/javascript/{themes => flavours}/glitch/reducers/settings.js (88%) rename app/javascript/{themes => flavours}/glitch/reducers/status_lists.js (94%) rename app/javascript/{themes => flavours}/glitch/reducers/statuses.js (90%) rename app/javascript/{themes => flavours}/glitch/reducers/timelines.js (98%) rename app/javascript/{themes => flavours}/glitch/reducers/user_lists.js (95%) rename app/javascript/{themes => flavours}/glitch/selectors/index.js (100%) rename app/javascript/{themes => flavours}/glitch/service_worker/entry.js (100%) rename app/javascript/{themes => flavours}/glitch/service_worker/web_push_notifications.js (100%) rename app/javascript/{themes => flavours}/glitch/store/configureStore.js (100%) rename app/javascript/{themes => flavours}/glitch/styles/_mixins.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/about.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/accounts.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/admin.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/basics.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/boost.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/compact_header.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/components.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/containers.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/doodle.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/emoji_picker.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/footer.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/forms.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/index.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/landing_strip.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/lists.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/reset copy.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/reset.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/rtl.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/stream_entries.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/tables.scss (100%) rename app/javascript/{themes => flavours}/glitch/styles/variables.scss (100%) rename app/javascript/{themes => flavours}/glitch/theme.yml (83%) rename app/javascript/{themes => flavours}/glitch/util/api.js (100%) create mode 100644 app/javascript/flavours/glitch/util/async-components.js rename app/javascript/{themes => flavours}/glitch/util/base_polyfills.js (100%) rename app/javascript/{themes => flavours}/glitch/util/bio_metadata.js (100%) rename app/javascript/{themes => flavours}/glitch/util/counter.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_compressed.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_map.json (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_mart_data_light.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_mart_search_light.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_picker.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_unicode_mapping_light.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/emoji_utils.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/index.js (97%) rename app/javascript/{themes => flavours}/glitch/util/emoji/unicode_to_filename.js (100%) rename app/javascript/{themes => flavours}/glitch/util/emoji/unicode_to_unified_name.js (100%) rename app/javascript/{themes => flavours}/glitch/util/extra_polyfills.js (100%) rename app/javascript/{themes => flavours}/glitch/util/fullscreen.js (100%) rename app/javascript/{themes => flavours}/glitch/util/get_rect_from_entry.js (100%) rename app/javascript/{themes => flavours}/glitch/util/initial_state.js (100%) rename app/javascript/{themes => flavours}/glitch/util/intersection_observer_wrapper.js (100%) rename app/javascript/{themes => flavours}/glitch/util/is_mobile.js (100%) rename app/javascript/{themes => flavours}/glitch/util/link_header.js (100%) rename app/javascript/{themes => flavours}/glitch/util/load_polyfills.js (100%) rename app/javascript/{themes => flavours}/glitch/util/main.js (95%) rename app/javascript/{themes => flavours}/glitch/util/optional_motion.js (68%) rename app/javascript/{themes => flavours}/glitch/util/performance.js (100%) rename app/javascript/{themes => flavours}/glitch/util/react_router_helpers.js (85%) rename app/javascript/{themes => flavours}/glitch/util/ready.js (100%) rename app/javascript/{themes => flavours}/glitch/util/reduced_motion.js (100%) rename app/javascript/{themes => flavours}/glitch/util/rtl.js (100%) rename app/javascript/{themes => flavours}/glitch/util/schedule_idle_task.js (100%) rename app/javascript/{themes => flavours}/glitch/util/scroll.js (100%) rename app/javascript/{themes => flavours}/glitch/util/stream.js (100%) rename app/javascript/{themes => flavours}/glitch/util/url_regex.js (100%) rename app/javascript/{themes => flavours}/glitch/util/uuid.js (100%) rename app/javascript/{themes => flavours}/glitch/util/web_push_subscription.js (97%) rename app/javascript/{themes => flavours}/vanilla/theme.yml (100%) delete mode 100644 app/javascript/themes/glitch/features/generic_not_found/index.js delete mode 100644 app/javascript/themes/glitch/features/standalone/compose/index.js delete mode 100644 app/javascript/themes/glitch/packs/common.js delete mode 100644 app/javascript/themes/glitch/packs/home.js delete mode 100644 app/javascript/themes/glitch/util/async-components.js delete mode 160000 app/javascript/themes/mastodon-go diff --git a/.gitmodules b/.gitmodules index 35b0cd787d2..e69de29bb2d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "app/javascript/themes/mastodon-go"] - path = app/javascript/themes/mastodon-go - url = https://github.com/marrus-sh/mastodon-go diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f5753963df9..d116c4767eb 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -12,7 +12,7 @@ class ApplicationController < ActionController::Base helper_method :current_account helper_method :current_session - helper_method :current_theme + helper_method :current_flavour helper_method :current_skin helper_method :single_user_mode? @@ -57,8 +57,8 @@ class ApplicationController < ActionController::Base def pack(data, pack_name, skin = 'default') return nil unless pack?(data, pack_name) pack_data = { - common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common'), - name: data['name'], + common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.flavour(current_flavour) : Themes.instance.core, 'common'), + flavour: data['name'], pack: pack_name, preload: nil, skin: nil, @@ -88,8 +88,8 @@ class ApplicationController < ActionController::Base def nil_pack(data, pack_name, skin = 'default') { - common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.get(current_theme) : Themes.instance.core, 'common', skin), - name: data['name'], + common: pack_name == 'common' ? nil : resolve_pack(data['name'] ? Themes.instance.flavour(current_flavour) : Themes.instance.core, 'common', skin), + flavour: data['name'], pack: nil, preload: nil, skin: nil, @@ -102,23 +102,23 @@ class ApplicationController < ActionController::Base if data['name'] && data.key?('fallback') if data['fallback'].nil? return nil_pack(data, pack_name, skin) - elsif data['fallback'].is_a?(String) && Themes.instance.get(data['fallback']) - return resolve_pack(Themes.instance.get(data['fallback']), pack_name, skin) + elsif data['fallback'].is_a?(String) && Themes.instance.flavour(data['fallback']) + return resolve_pack(Themes.instance.flavour(data['fallback']), pack_name, skin) elsif data['fallback'].is_a?(Array) data['fallback'].each do |fallback| - return resolve_pack(Themes.instance.get(fallback), pack_name, skin) if Themes.instance.get(fallback) + return resolve_pack(Themes.instance.flavour(fallback), pack_name, skin) if Themes.instance.flavour(fallback) end end return nil_pack(data, pack_name, skin) end - return data.key?('name') && data['name'] != default_theme ? resolve_pack(Themes.instance.get(default_theme), pack_name, skin) : nil_pack(data, pack_name, skin) + return data.key?('name') && data['name'] != Setting.default_settings['flavour'] ? resolve_pack(Themes.instance.flavour(Setting.default_settings['flavour']), pack_name, skin) : nil_pack(data, pack_name, skin) end result end def use_pack(pack_name) @core = resolve_pack(Themes.instance.core, pack_name) - @theme = resolve_pack(Themes.instance.get(current_theme), pack_name, current_skin) + @theme = resolve_pack(Themes.instance.flavour(current_flavour), pack_name, current_skin) end protected @@ -151,21 +151,13 @@ class ApplicationController < ActionController::Base @current_session ||= SessionActivation.find_by(session_id: cookies.signed['_session_id']) end - def default_theme - Setting.default_settings['theme'] - end - - def current_theme - return default_theme unless Themes.instance.names.include? current_user&.setting_theme - current_user.setting_theme - end - - def default_skin - 'default' + def current_flavour + return Setting.default_settings['flavour'] unless Themes.instance.flavours.include? current_user&.setting_flavour + current_user.setting_flavour end def current_skin - return default_skin unless Themes.instance.skins_for(current_theme).include? current_user&.setting_skin + return 'default' unless Themes.instance.skins_for(current_flavour).include? current_user&.setting_skin current_user.setting_skin end diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index bc5f9ed1d9e..1e4bb4cede5 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -3,7 +3,7 @@ const { length } = require('stringz'); const { delegate } = require('rails-ujs'); -import { processBio } from 'themes/glitch/util/bio_metadata'; +import { processBio } from 'flavours/glitch/util/bio_metadata'; delegate(document, '.account_display_name', 'input', ({ target }) => { const nameCounter = document.querySelector('.name-counter'); diff --git a/app/javascript/themes/glitch/actions/accounts.js b/app/javascript/flavours/glitch/actions/accounts.js similarity index 99% rename from app/javascript/themes/glitch/actions/accounts.js rename to app/javascript/flavours/glitch/actions/accounts.js index f1a8c5471e1..8ab92f9e7ad 100644 --- a/app/javascript/themes/glitch/actions/accounts.js +++ b/app/javascript/flavours/glitch/actions/accounts.js @@ -1,4 +1,4 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; export const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST'; export const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS'; diff --git a/app/javascript/themes/glitch/actions/alerts.js b/app/javascript/flavours/glitch/actions/alerts.js similarity index 100% rename from app/javascript/themes/glitch/actions/alerts.js rename to app/javascript/flavours/glitch/actions/alerts.js diff --git a/app/javascript/themes/glitch/actions/blocks.js b/app/javascript/flavours/glitch/actions/blocks.js similarity index 97% rename from app/javascript/themes/glitch/actions/blocks.js rename to app/javascript/flavours/glitch/actions/blocks.js index 6ba9460f02a..fe44ca19a0f 100644 --- a/app/javascript/themes/glitch/actions/blocks.js +++ b/app/javascript/flavours/glitch/actions/blocks.js @@ -1,4 +1,4 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; import { fetchRelationships } from './accounts'; export const BLOCKS_FETCH_REQUEST = 'BLOCKS_FETCH_REQUEST'; diff --git a/app/javascript/themes/glitch/actions/bundles.js b/app/javascript/flavours/glitch/actions/bundles.js similarity index 100% rename from app/javascript/themes/glitch/actions/bundles.js rename to app/javascript/flavours/glitch/actions/bundles.js diff --git a/app/javascript/themes/glitch/actions/cards.js b/app/javascript/flavours/glitch/actions/cards.js similarity index 96% rename from app/javascript/themes/glitch/actions/cards.js rename to app/javascript/flavours/glitch/actions/cards.js index 2a1bc369a35..c897daf58d1 100644 --- a/app/javascript/themes/glitch/actions/cards.js +++ b/app/javascript/flavours/glitch/actions/cards.js @@ -1,4 +1,4 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; export const STATUS_CARD_FETCH_REQUEST = 'STATUS_CARD_FETCH_REQUEST'; export const STATUS_CARD_FETCH_SUCCESS = 'STATUS_CARD_FETCH_SUCCESS'; diff --git a/app/javascript/themes/glitch/actions/columns.js b/app/javascript/flavours/glitch/actions/columns.js similarity index 100% rename from app/javascript/themes/glitch/actions/columns.js rename to app/javascript/flavours/glitch/actions/columns.js diff --git a/app/javascript/themes/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js similarity index 98% rename from app/javascript/themes/glitch/actions/compose.js rename to app/javascript/flavours/glitch/actions/compose.js index 07c46947731..32746f27b62 100644 --- a/app/javascript/themes/glitch/actions/compose.js +++ b/app/javascript/flavours/glitch/actions/compose.js @@ -1,6 +1,6 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; import { throttle } from 'lodash'; -import { search as emojiSearch } from 'themes/glitch/util/emoji/emoji_mart_search_light'; +import { search as emojiSearch } from 'flavours/glitch/util/emoji/emoji_mart_search_light'; import { useEmoji } from './emojis'; import { diff --git a/app/javascript/themes/glitch/actions/domain_blocks.js b/app/javascript/flavours/glitch/actions/domain_blocks.js similarity index 97% rename from app/javascript/themes/glitch/actions/domain_blocks.js rename to app/javascript/flavours/glitch/actions/domain_blocks.js index 0a880394a83..8506df91c93 100644 --- a/app/javascript/themes/glitch/actions/domain_blocks.js +++ b/app/javascript/flavours/glitch/actions/domain_blocks.js @@ -1,4 +1,4 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; export const DOMAIN_BLOCK_REQUEST = 'DOMAIN_BLOCK_REQUEST'; export const DOMAIN_BLOCK_SUCCESS = 'DOMAIN_BLOCK_SUCCESS'; diff --git a/app/javascript/themes/glitch/actions/emojis.js b/app/javascript/flavours/glitch/actions/emojis.js similarity index 100% rename from app/javascript/themes/glitch/actions/emojis.js rename to app/javascript/flavours/glitch/actions/emojis.js diff --git a/app/javascript/themes/glitch/actions/favourites.js b/app/javascript/flavours/glitch/actions/favourites.js similarity index 97% rename from app/javascript/themes/glitch/actions/favourites.js rename to app/javascript/flavours/glitch/actions/favourites.js index e9b3559af6b..decdcee4f2a 100644 --- a/app/javascript/themes/glitch/actions/favourites.js +++ b/app/javascript/flavours/glitch/actions/favourites.js @@ -1,4 +1,4 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; export const FAVOURITED_STATUSES_FETCH_REQUEST = 'FAVOURITED_STATUSES_FETCH_REQUEST'; export const FAVOURITED_STATUSES_FETCH_SUCCESS = 'FAVOURITED_STATUSES_FETCH_SUCCESS'; diff --git a/app/javascript/themes/glitch/actions/height_cache.js b/app/javascript/flavours/glitch/actions/height_cache.js similarity index 100% rename from app/javascript/themes/glitch/actions/height_cache.js rename to app/javascript/flavours/glitch/actions/height_cache.js diff --git a/app/javascript/themes/glitch/actions/interactions.js b/app/javascript/flavours/glitch/actions/interactions.js similarity index 99% rename from app/javascript/themes/glitch/actions/interactions.js rename to app/javascript/flavours/glitch/actions/interactions.js index d61a7ba2ad4..ceeb2773bdb 100644 --- a/app/javascript/themes/glitch/actions/interactions.js +++ b/app/javascript/flavours/glitch/actions/interactions.js @@ -1,4 +1,4 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; export const REBLOG_REQUEST = 'REBLOG_REQUEST'; export const REBLOG_SUCCESS = 'REBLOG_SUCCESS'; diff --git a/app/javascript/themes/glitch/actions/local_settings.js b/app/javascript/flavours/glitch/actions/local_settings.js similarity index 100% rename from app/javascript/themes/glitch/actions/local_settings.js rename to app/javascript/flavours/glitch/actions/local_settings.js diff --git a/app/javascript/themes/glitch/actions/modal.js b/app/javascript/flavours/glitch/actions/modal.js similarity index 100% rename from app/javascript/themes/glitch/actions/modal.js rename to app/javascript/flavours/glitch/actions/modal.js diff --git a/app/javascript/themes/glitch/actions/mutes.js b/app/javascript/flavours/glitch/actions/mutes.js similarity index 95% rename from app/javascript/themes/glitch/actions/mutes.js rename to app/javascript/flavours/glitch/actions/mutes.js index bb19e865777..e061305336c 100644 --- a/app/javascript/themes/glitch/actions/mutes.js +++ b/app/javascript/flavours/glitch/actions/mutes.js @@ -1,6 +1,6 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; import { fetchRelationships } from './accounts'; -import { openModal } from 'themes/glitch/actions/modal'; +import { openModal } from 'flavours/glitch/actions/modal'; export const MUTES_FETCH_REQUEST = 'MUTES_FETCH_REQUEST'; export const MUTES_FETCH_SUCCESS = 'MUTES_FETCH_SUCCESS'; diff --git a/app/javascript/themes/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js similarity index 99% rename from app/javascript/themes/glitch/actions/notifications.js rename to app/javascript/flavours/glitch/actions/notifications.js index fbf06f7c42f..9b9ebf86d10 100644 --- a/app/javascript/themes/glitch/actions/notifications.js +++ b/app/javascript/flavours/glitch/actions/notifications.js @@ -1,4 +1,4 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; import { List as ImmutableList } from 'immutable'; import IntlMessageFormat from 'intl-messageformat'; import { fetchRelationships } from './accounts'; diff --git a/app/javascript/themes/glitch/actions/onboarding.js b/app/javascript/flavours/glitch/actions/onboarding.js similarity index 100% rename from app/javascript/themes/glitch/actions/onboarding.js rename to app/javascript/flavours/glitch/actions/onboarding.js diff --git a/app/javascript/themes/glitch/actions/pin_statuses.js b/app/javascript/flavours/glitch/actions/pin_statuses.js similarity index 90% rename from app/javascript/themes/glitch/actions/pin_statuses.js rename to app/javascript/flavours/glitch/actions/pin_statuses.js index b3e064e586a..d3d1a154f62 100644 --- a/app/javascript/themes/glitch/actions/pin_statuses.js +++ b/app/javascript/flavours/glitch/actions/pin_statuses.js @@ -1,10 +1,10 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; export const PINNED_STATUSES_FETCH_REQUEST = 'PINNED_STATUSES_FETCH_REQUEST'; export const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS'; export const PINNED_STATUSES_FETCH_FAIL = 'PINNED_STATUSES_FETCH_FAIL'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; export function fetchPinnedStatuses() { return (dispatch, getState) => { diff --git a/app/javascript/themes/glitch/actions/push_notifications.js b/app/javascript/flavours/glitch/actions/push_notifications.js similarity index 100% rename from app/javascript/themes/glitch/actions/push_notifications.js rename to app/javascript/flavours/glitch/actions/push_notifications.js diff --git a/app/javascript/themes/glitch/actions/reports.js b/app/javascript/flavours/glitch/actions/reports.js similarity index 97% rename from app/javascript/themes/glitch/actions/reports.js rename to app/javascript/flavours/glitch/actions/reports.js index 93f9085b2ca..ad4fd18a931 100644 --- a/app/javascript/themes/glitch/actions/reports.js +++ b/app/javascript/flavours/glitch/actions/reports.js @@ -1,4 +1,4 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; import { openModal, closeModal } from './modal'; export const REPORT_INIT = 'REPORT_INIT'; diff --git a/app/javascript/themes/glitch/actions/search.js b/app/javascript/flavours/glitch/actions/search.js similarity index 96% rename from app/javascript/themes/glitch/actions/search.js rename to app/javascript/flavours/glitch/actions/search.js index 414e4755ebc..e86bd848e56 100644 --- a/app/javascript/themes/glitch/actions/search.js +++ b/app/javascript/flavours/glitch/actions/search.js @@ -1,4 +1,4 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; export const SEARCH_CHANGE = 'SEARCH_CHANGE'; export const SEARCH_CLEAR = 'SEARCH_CLEAR'; diff --git a/app/javascript/themes/glitch/actions/settings.js b/app/javascript/flavours/glitch/actions/settings.js similarity index 100% rename from app/javascript/themes/glitch/actions/settings.js rename to app/javascript/flavours/glitch/actions/settings.js diff --git a/app/javascript/themes/glitch/actions/statuses.js b/app/javascript/flavours/glitch/actions/statuses.js similarity index 99% rename from app/javascript/themes/glitch/actions/statuses.js rename to app/javascript/flavours/glitch/actions/statuses.js index 702f4e9b6ff..8b49083ac26 100644 --- a/app/javascript/themes/glitch/actions/statuses.js +++ b/app/javascript/flavours/glitch/actions/statuses.js @@ -1,4 +1,4 @@ -import api from 'themes/glitch/util/api'; +import api from 'flavours/glitch/util/api'; import { deleteFromTimelines } from './timelines'; import { fetchStatusCard } from './cards'; diff --git a/app/javascript/themes/glitch/actions/store.js b/app/javascript/flavours/glitch/actions/store.js similarity index 100% rename from app/javascript/themes/glitch/actions/store.js rename to app/javascript/flavours/glitch/actions/store.js diff --git a/app/javascript/themes/glitch/actions/streaming.js b/app/javascript/flavours/glitch/actions/streaming.js similarity index 96% rename from app/javascript/themes/glitch/actions/streaming.js rename to app/javascript/flavours/glitch/actions/streaming.js index ccf6c27d825..595eefa41f7 100644 --- a/app/javascript/themes/glitch/actions/streaming.js +++ b/app/javascript/flavours/glitch/actions/streaming.js @@ -1,4 +1,4 @@ -import { connectStream } from 'themes/glitch/util/stream'; +import { connectStream } from 'flavours/glitch/util/stream'; import { updateTimeline, deleteFromTimelines, diff --git a/app/javascript/themes/glitch/actions/timelines.js b/app/javascript/flavours/glitch/actions/timelines.js similarity index 99% rename from app/javascript/themes/glitch/actions/timelines.js rename to app/javascript/flavours/glitch/actions/timelines.js index 5ce14fbe9f1..3fabf388581 100644 --- a/app/javascript/themes/glitch/actions/timelines.js +++ b/app/javascript/flavours/glitch/actions/timelines.js @@ -1,4 +1,4 @@ -import api, { getLinks } from 'themes/glitch/util/api'; +import api, { getLinks } from 'flavours/glitch/util/api'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; export const TIMELINE_UPDATE = 'TIMELINE_UPDATE'; diff --git a/app/javascript/themes/glitch/components/account.js b/app/javascript/flavours/glitch/components/account.js similarity index 98% rename from app/javascript/themes/glitch/components/account.js rename to app/javascript/flavours/glitch/components/account.js index d0ff7705043..c8dacb0ab93 100644 --- a/app/javascript/themes/glitch/components/account.js +++ b/app/javascript/flavours/glitch/components/account.js @@ -7,7 +7,7 @@ import Permalink from './permalink'; import IconButton from './icon_button'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ follow: { id: 'account.follow', defaultMessage: 'Follow' }, diff --git a/app/javascript/themes/glitch/components/attachment_list.js b/app/javascript/flavours/glitch/components/attachment_list.js similarity index 100% rename from app/javascript/themes/glitch/components/attachment_list.js rename to app/javascript/flavours/glitch/components/attachment_list.js diff --git a/app/javascript/themes/glitch/components/autosuggest_emoji.js b/app/javascript/flavours/glitch/components/autosuggest_emoji.js similarity index 90% rename from app/javascript/themes/glitch/components/autosuggest_emoji.js rename to app/javascript/flavours/glitch/components/autosuggest_emoji.js index 3c6f915e408..79e113d9cf0 100644 --- a/app/javascript/themes/glitch/components/autosuggest_emoji.js +++ b/app/javascript/flavours/glitch/components/autosuggest_emoji.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import unicodeMapping from 'themes/glitch/util/emoji/emoji_unicode_mapping_light'; +import unicodeMapping from 'flavours/glitch/util/emoji/emoji_unicode_mapping_light'; const assetHost = process.env.CDN_HOST || ''; diff --git a/app/javascript/themes/glitch/components/autosuggest_textarea.js b/app/javascript/flavours/glitch/components/autosuggest_textarea.js similarity index 97% rename from app/javascript/themes/glitch/components/autosuggest_textarea.js rename to app/javascript/flavours/glitch/components/autosuggest_textarea.js index fa93847a236..551528e5ace 100644 --- a/app/javascript/themes/glitch/components/autosuggest_textarea.js +++ b/app/javascript/flavours/glitch/components/autosuggest_textarea.js @@ -1,9 +1,9 @@ import React from 'react'; -import AutosuggestAccountContainer from 'themes/glitch/features/compose/containers/autosuggest_account_container'; +import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container'; import AutosuggestEmoji from './autosuggest_emoji'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import { isRtl } from 'themes/glitch/util/rtl'; +import { isRtl } from 'flavours/glitch/util/rtl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import Textarea from 'react-textarea-autosize'; import classNames from 'classnames'; diff --git a/app/javascript/themes/glitch/components/avatar.js b/app/javascript/flavours/glitch/components/avatar.js similarity index 100% rename from app/javascript/themes/glitch/components/avatar.js rename to app/javascript/flavours/glitch/components/avatar.js diff --git a/app/javascript/themes/glitch/components/avatar_overlay.js b/app/javascript/flavours/glitch/components/avatar_overlay.js similarity index 100% rename from app/javascript/themes/glitch/components/avatar_overlay.js rename to app/javascript/flavours/glitch/components/avatar_overlay.js diff --git a/app/javascript/themes/glitch/components/button.js b/app/javascript/flavours/glitch/components/button.js similarity index 100% rename from app/javascript/themes/glitch/components/button.js rename to app/javascript/flavours/glitch/components/button.js diff --git a/app/javascript/themes/glitch/components/collapsable.js b/app/javascript/flavours/glitch/components/collapsable.js similarity index 92% rename from app/javascript/themes/glitch/components/collapsable.js rename to app/javascript/flavours/glitch/components/collapsable.js index 8bc0a54f4f2..fe125a729a1 100644 --- a/app/javascript/themes/glitch/components/collapsable.js +++ b/app/javascript/flavours/glitch/components/collapsable.js @@ -1,5 +1,5 @@ import React from 'react'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import PropTypes from 'prop-types'; diff --git a/app/javascript/themes/glitch/components/column.js b/app/javascript/flavours/glitch/components/column.js similarity index 95% rename from app/javascript/themes/glitch/components/column.js rename to app/javascript/flavours/glitch/components/column.js index adeba9cc114..57c4c7a4048 100644 --- a/app/javascript/themes/glitch/components/column.js +++ b/app/javascript/flavours/glitch/components/column.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import detectPassiveEvents from 'detect-passive-events'; -import { scrollTop } from 'themes/glitch/util/scroll'; +import { scrollTop } from 'flavours/glitch/util/scroll'; export default class Column extends React.PureComponent { diff --git a/app/javascript/themes/glitch/components/column_back_button.js b/app/javascript/flavours/glitch/components/column_back_button.js similarity index 100% rename from app/javascript/themes/glitch/components/column_back_button.js rename to app/javascript/flavours/glitch/components/column_back_button.js diff --git a/app/javascript/themes/glitch/components/column_back_button_slim.js b/app/javascript/flavours/glitch/components/column_back_button_slim.js similarity index 100% rename from app/javascript/themes/glitch/components/column_back_button_slim.js rename to app/javascript/flavours/glitch/components/column_back_button_slim.js diff --git a/app/javascript/themes/glitch/components/column_header.js b/app/javascript/flavours/glitch/components/column_header.js similarity index 98% rename from app/javascript/themes/glitch/components/column_header.js rename to app/javascript/flavours/glitch/components/column_header.js index e601082c851..ae90b6f81ff 100644 --- a/app/javascript/themes/glitch/components/column_header.js +++ b/app/javascript/flavours/glitch/components/column_header.js @@ -4,8 +4,7 @@ import classNames from 'classnames'; import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; -// Glitch imports -import NotificationPurgeButtonsContainer from 'themes/glitch/containers/notification_purge_buttons_container'; +import NotificationPurgeButtonsContainer from 'flavours/glitch/containers/notification_purge_buttons_container'; const messages = defineMessages({ show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' }, diff --git a/app/javascript/themes/glitch/components/display_name.js b/app/javascript/flavours/glitch/components/display_name.js similarity index 100% rename from app/javascript/themes/glitch/components/display_name.js rename to app/javascript/flavours/glitch/components/display_name.js diff --git a/app/javascript/themes/glitch/components/dropdown_menu.js b/app/javascript/flavours/glitch/components/dropdown_menu.js similarity index 98% rename from app/javascript/themes/glitch/components/dropdown_menu.js rename to app/javascript/flavours/glitch/components/dropdown_menu.js index d30dc2aaf63..d4a886a8b30 100644 --- a/app/javascript/themes/glitch/components/dropdown_menu.js +++ b/app/javascript/flavours/glitch/components/dropdown_menu.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import IconButton from './icon_button'; import Overlay from 'react-overlays/lib/Overlay'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import detectPassiveEvents from 'detect-passive-events'; diff --git a/app/javascript/themes/glitch/components/extended_video_player.js b/app/javascript/flavours/glitch/components/extended_video_player.js similarity index 100% rename from app/javascript/themes/glitch/components/extended_video_player.js rename to app/javascript/flavours/glitch/components/extended_video_player.js diff --git a/app/javascript/themes/glitch/components/icon_button.js b/app/javascript/flavours/glitch/components/icon_button.js similarity index 98% rename from app/javascript/themes/glitch/components/icon_button.js rename to app/javascript/flavours/glitch/components/icon_button.js index 31cdf470364..13b91e8a1fe 100644 --- a/app/javascript/themes/glitch/components/icon_button.js +++ b/app/javascript/flavours/glitch/components/icon_button.js @@ -1,5 +1,5 @@ import React from 'react'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import PropTypes from 'prop-types'; import classNames from 'classnames'; diff --git a/app/javascript/themes/glitch/components/intersection_observer_article.js b/app/javascript/flavours/glitch/components/intersection_observer_article.js similarity index 96% rename from app/javascript/themes/glitch/components/intersection_observer_article.js rename to app/javascript/flavours/glitch/components/intersection_observer_article.js index f0139ac7543..8b06f9a8c81 100644 --- a/app/javascript/themes/glitch/components/intersection_observer_article.js +++ b/app/javascript/flavours/glitch/components/intersection_observer_article.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -import scheduleIdleTask from 'themes/glitch/util/schedule_idle_task'; -import getRectFromEntry from 'themes/glitch/util/get_rect_from_entry'; +import scheduleIdleTask from 'flavours/glitch/util/schedule_idle_task'; +import getRectFromEntry from 'flavours/glitch/util/get_rect_from_entry'; import { is } from 'immutable'; // Diff these props in the "rendered" state diff --git a/app/javascript/themes/glitch/components/load_more.js b/app/javascript/flavours/glitch/components/load_more.js similarity index 100% rename from app/javascript/themes/glitch/components/load_more.js rename to app/javascript/flavours/glitch/components/load_more.js diff --git a/app/javascript/themes/glitch/components/loading_indicator.js b/app/javascript/flavours/glitch/components/loading_indicator.js similarity index 100% rename from app/javascript/themes/glitch/components/loading_indicator.js rename to app/javascript/flavours/glitch/components/loading_indicator.js diff --git a/app/javascript/themes/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js similarity index 98% rename from app/javascript/themes/glitch/components/media_gallery.js rename to app/javascript/flavours/glitch/components/media_gallery.js index b6b40c5855a..d2e80de4964 100644 --- a/app/javascript/themes/glitch/components/media_gallery.js +++ b/app/javascript/flavours/glitch/components/media_gallery.js @@ -4,9 +4,9 @@ import PropTypes from 'prop-types'; import { is } from 'immutable'; import IconButton from './icon_button'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import { isIOS } from 'themes/glitch/util/is_mobile'; +import { isIOS } from 'flavours/glitch/util/is_mobile'; import classNames from 'classnames'; -import { autoPlayGif } from 'themes/glitch/util/initial_state'; +import { autoPlayGif } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Toggle visibility' }, diff --git a/app/javascript/themes/glitch/components/missing_indicator.js b/app/javascript/flavours/glitch/components/missing_indicator.js similarity index 100% rename from app/javascript/themes/glitch/components/missing_indicator.js rename to app/javascript/flavours/glitch/components/missing_indicator.js diff --git a/app/javascript/themes/glitch/components/notification_purge_buttons.js b/app/javascript/flavours/glitch/components/notification_purge_buttons.js similarity index 100% rename from app/javascript/themes/glitch/components/notification_purge_buttons.js rename to app/javascript/flavours/glitch/components/notification_purge_buttons.js diff --git a/app/javascript/themes/glitch/components/permalink.js b/app/javascript/flavours/glitch/components/permalink.js similarity index 100% rename from app/javascript/themes/glitch/components/permalink.js rename to app/javascript/flavours/glitch/components/permalink.js diff --git a/app/javascript/themes/glitch/components/relative_timestamp.js b/app/javascript/flavours/glitch/components/relative_timestamp.js similarity index 100% rename from app/javascript/themes/glitch/components/relative_timestamp.js rename to app/javascript/flavours/glitch/components/relative_timestamp.js diff --git a/app/javascript/themes/glitch/components/scrollable_list.js b/app/javascript/flavours/glitch/components/scrollable_list.js similarity index 95% rename from app/javascript/themes/glitch/components/scrollable_list.js rename to app/javascript/flavours/glitch/components/scrollable_list.js index ccdcd7c854a..8b1e3c93dd9 100644 --- a/app/javascript/themes/glitch/components/scrollable_list.js +++ b/app/javascript/flavours/glitch/components/scrollable_list.js @@ -1,13 +1,13 @@ import React, { PureComponent } from 'react'; import { ScrollContainer } from 'react-router-scroll-4'; import PropTypes from 'prop-types'; -import IntersectionObserverArticleContainer from 'themes/glitch/containers/intersection_observer_article_container'; +import IntersectionObserverArticleContainer from 'flavours/glitch/containers/intersection_observer_article_container'; import LoadMore from './load_more'; -import IntersectionObserverWrapper from 'themes/glitch/util/intersection_observer_wrapper'; +import IntersectionObserverWrapper from 'flavours/glitch/util/intersection_observer_wrapper'; import { throttle } from 'lodash'; import { List as ImmutableList } from 'immutable'; import classNames from 'classnames'; -import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'themes/glitch/util/fullscreen'; +import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'flavours/glitch/util/fullscreen'; export default class ScrollableList extends PureComponent { diff --git a/app/javascript/themes/glitch/components/setting_text.js b/app/javascript/flavours/glitch/components/setting_text.js similarity index 100% rename from app/javascript/themes/glitch/components/setting_text.js rename to app/javascript/flavours/glitch/components/setting_text.js diff --git a/app/javascript/themes/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js similarity index 98% rename from app/javascript/themes/glitch/components/status.js rename to app/javascript/flavours/glitch/components/status.js index e2ef47f5f17..6662285d0ac 100644 --- a/app/javascript/themes/glitch/components/status.js +++ b/app/javascript/flavours/glitch/components/status.js @@ -6,9 +6,9 @@ import StatusHeader from './status_header'; import StatusContent from './status_content'; import StatusActionBar from './status_action_bar'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { MediaGallery, Video } from 'themes/glitch/util/async-components'; +import { MediaGallery, Video } from 'flavours/glitch/util/async-components'; import { HotKeys } from 'react-hotkeys'; -import NotificationOverlayContainer from 'themes/glitch/features/notifications/containers/overlay_container'; +import NotificationOverlayContainer from 'flavours/glitch/features/notifications/containers/overlay_container'; // We use the component (and not the container) since we do not want // to use the progress bar to show download progress diff --git a/app/javascript/themes/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js similarity index 96% rename from app/javascript/themes/glitch/components/status_action_bar.js rename to app/javascript/flavours/glitch/components/status_action_bar.js index 9d615ed7cfd..5a06782bec4 100644 --- a/app/javascript/themes/glitch/components/status_action_bar.js +++ b/app/javascript/flavours/glitch/components/status_action_bar.js @@ -1,14 +1,11 @@ -// THIS FILE EXISTS FOR UPSTREAM COMPATIBILITY & SHOULDN'T BE USED !! -// SEE INSTEAD : glitch/components/status/action_bar - import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import IconButton from './icon_button'; -import DropdownMenuContainer from 'themes/glitch/containers/dropdown_menu_container'; +import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; import RelativeTimestamp from './relative_timestamp'; const messages = defineMessages({ diff --git a/app/javascript/themes/glitch/components/status_content.js b/app/javascript/flavours/glitch/components/status_content.js similarity index 99% rename from app/javascript/themes/glitch/components/status_content.js rename to app/javascript/flavours/glitch/components/status_content.js index 3eba6eaa0ed..0c40e62ccae 100644 --- a/app/javascript/themes/glitch/components/status_content.js +++ b/app/javascript/flavours/glitch/components/status_content.js @@ -1,7 +1,7 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import { isRtl } from 'themes/glitch/util/rtl'; +import { isRtl } from 'flavours/glitch/util/rtl'; import { FormattedMessage } from 'react-intl'; import Permalink from './permalink'; import classnames from 'classnames'; diff --git a/app/javascript/themes/glitch/components/status_header.js b/app/javascript/flavours/glitch/components/status_header.js similarity index 100% rename from app/javascript/themes/glitch/components/status_header.js rename to app/javascript/flavours/glitch/components/status_header.js diff --git a/app/javascript/themes/glitch/components/status_list.js b/app/javascript/flavours/glitch/components/status_list.js similarity index 95% rename from app/javascript/themes/glitch/components/status_list.js rename to app/javascript/flavours/glitch/components/status_list.js index ddb1354c674..f190ba6ab61 100644 --- a/app/javascript/themes/glitch/components/status_list.js +++ b/app/javascript/flavours/glitch/components/status_list.js @@ -1,7 +1,7 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import StatusContainer from 'themes/glitch/containers/status_container'; +import StatusContainer from 'flavours/glitch/containers/status_container'; import ImmutablePureComponent from 'react-immutable-pure-component'; import ScrollableList from './scrollable_list'; diff --git a/app/javascript/themes/glitch/components/status_prepend.js b/app/javascript/flavours/glitch/components/status_prepend.js similarity index 100% rename from app/javascript/themes/glitch/components/status_prepend.js rename to app/javascript/flavours/glitch/components/status_prepend.js diff --git a/app/javascript/themes/glitch/components/status_visibility_icon.js b/app/javascript/flavours/glitch/components/status_visibility_icon.js similarity index 100% rename from app/javascript/themes/glitch/components/status_visibility_icon.js rename to app/javascript/flavours/glitch/components/status_visibility_icon.js diff --git a/app/javascript/themes/glitch/containers/account_container.js b/app/javascript/flavours/glitch/containers/account_container.js similarity index 84% rename from app/javascript/themes/glitch/containers/account_container.js rename to app/javascript/flavours/glitch/containers/account_container.js index c1ce4998715..bc84d299b49 100644 --- a/app/javascript/themes/glitch/containers/account_container.js +++ b/app/javascript/flavours/glitch/containers/account_container.js @@ -1,8 +1,8 @@ import React from 'react'; import { connect } from 'react-redux'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import { makeGetAccount } from 'themes/glitch/selectors'; -import Account from 'themes/glitch/components/account'; +import { makeGetAccount } from 'flavours/glitch/selectors'; +import Account from 'flavours/glitch/components/account'; import { followAccount, unfollowAccount, @@ -10,10 +10,10 @@ import { unblockAccount, muteAccount, unmuteAccount, -} from 'themes/glitch/actions/accounts'; -import { openModal } from 'themes/glitch/actions/modal'; -import { initMuteModal } from 'themes/glitch/actions/mutes'; -import { unfollowModal } from 'themes/glitch/util/initial_state'; +} from 'flavours/glitch/actions/accounts'; +import { openModal } from 'flavours/glitch/actions/modal'; +import { initMuteModal } from 'flavours/glitch/actions/mutes'; +import { unfollowModal } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' }, diff --git a/app/javascript/themes/glitch/containers/card_container.js b/app/javascript/flavours/glitch/containers/card_container.js similarity index 84% rename from app/javascript/themes/glitch/containers/card_container.js rename to app/javascript/flavours/glitch/containers/card_container.js index 8285437bbfc..dec7df52236 100644 --- a/app/javascript/themes/glitch/containers/card_container.js +++ b/app/javascript/flavours/glitch/containers/card_container.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Card from 'themes/glitch/features/status/components/card'; +import Card from 'flavours/glitch/features/status/components/card'; import { fromJS } from 'immutable'; export default class CardContainer extends React.PureComponent { diff --git a/app/javascript/themes/glitch/containers/compose_container.js b/app/javascript/flavours/glitch/containers/compose_container.js similarity index 74% rename from app/javascript/themes/glitch/containers/compose_container.js rename to app/javascript/flavours/glitch/containers/compose_container.js index 82980ee36f3..60f6a9c9f2c 100644 --- a/app/javascript/themes/glitch/containers/compose_container.js +++ b/app/javascript/flavours/glitch/containers/compose_container.js @@ -1,12 +1,12 @@ import React from 'react'; import { Provider } from 'react-redux'; import PropTypes from 'prop-types'; -import configureStore from 'themes/glitch/store/configureStore'; -import { hydrateStore } from 'themes/glitch/actions/store'; +import configureStore from 'flavours/glitch/store/configureStore'; +import { hydrateStore } from 'flavours/glitch/actions/store'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from 'mastodon/locales'; -import Compose from 'themes/glitch/features/standalone/compose'; -import initialState from 'themes/glitch/util/initial_state'; +import Compose from 'flavours/glitch/features/standalone/compose'; +import initialState from 'flavours/glitch/util/initial_state'; const { localeData, messages } = getLocale(); addLocaleData(localeData); diff --git a/app/javascript/themes/glitch/containers/dropdown_menu_container.js b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js similarity index 65% rename from app/javascript/themes/glitch/containers/dropdown_menu_container.js rename to app/javascript/flavours/glitch/containers/dropdown_menu_container.js index 15e8da2e3a0..0b4f72fa163 100644 --- a/app/javascript/themes/glitch/containers/dropdown_menu_container.js +++ b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js @@ -1,7 +1,7 @@ -import { openModal, closeModal } from 'themes/glitch/actions/modal'; +import { openModal, closeModal } from 'flavours/glitch/actions/modal'; import { connect } from 'react-redux'; -import DropdownMenu from 'themes/glitch/components/dropdown_menu'; -import { isUserTouching } from 'themes/glitch/util/is_mobile'; +import DropdownMenu from 'flavours/glitch/components/dropdown_menu'; +import { isUserTouching } from 'flavours/glitch/util/is_mobile'; const mapStateToProps = state => ({ isModalOpen: state.get('modal').modalType === 'ACTIONS', diff --git a/app/javascript/themes/glitch/containers/intersection_observer_article_container.js b/app/javascript/flavours/glitch/containers/intersection_observer_article_container.js similarity index 70% rename from app/javascript/themes/glitch/containers/intersection_observer_article_container.js rename to app/javascript/flavours/glitch/containers/intersection_observer_article_container.js index 6ede64738b2..f2741f2d4ff 100644 --- a/app/javascript/themes/glitch/containers/intersection_observer_article_container.js +++ b/app/javascript/flavours/glitch/containers/intersection_observer_article_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; -import IntersectionObserverArticle from 'themes/glitch/components/intersection_observer_article'; -import { setHeight } from 'themes/glitch/actions/height_cache'; +import IntersectionObserverArticle from 'flavours/glitch/components/intersection_observer_article'; +import { setHeight } from 'flavours/glitch/actions/height_cache'; const makeMapStateToProps = (state, props) => ({ cachedHeight: state.getIn(['height_cache', props.saveHeightKey, props.id]), diff --git a/app/javascript/themes/glitch/containers/mastodon.js b/app/javascript/flavours/glitch/containers/mastodon.js similarity index 82% rename from app/javascript/themes/glitch/containers/mastodon.js rename to app/javascript/flavours/glitch/containers/mastodon.js index 755b5564a18..1c98cd5f75d 100644 --- a/app/javascript/themes/glitch/containers/mastodon.js +++ b/app/javascript/flavours/glitch/containers/mastodon.js @@ -1,16 +1,16 @@ import React from 'react'; import { Provider } from 'react-redux'; import PropTypes from 'prop-types'; -import configureStore from 'themes/glitch/store/configureStore'; -import { showOnboardingOnce } from 'themes/glitch/actions/onboarding'; +import configureStore from 'flavours/glitch/store/configureStore'; +import { showOnboardingOnce } from 'flavours/glitch/actions/onboarding'; import { BrowserRouter, Route } from 'react-router-dom'; import { ScrollContext } from 'react-router-scroll-4'; -import UI from 'themes/glitch/features/ui'; -import { hydrateStore } from 'themes/glitch/actions/store'; -import { connectUserStream } from 'themes/glitch/actions/streaming'; +import UI from 'flavours/glitch/features/ui'; +import { hydrateStore } from 'flavours/glitch/actions/store'; +import { connectUserStream } from 'flavours/glitch/actions/streaming'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from 'locales'; -import initialState from 'themes/glitch/util/initial_state'; +import initialState from 'flavours/glitch/util/initial_state'; const { localeData, messages } = getLocale(); addLocaleData(localeData); diff --git a/app/javascript/themes/glitch/containers/media_gallery_container.js b/app/javascript/flavours/glitch/containers/media_gallery_container.js similarity index 92% rename from app/javascript/themes/glitch/containers/media_gallery_container.js rename to app/javascript/flavours/glitch/containers/media_gallery_container.js index 86965f73b3b..54bfbf4535a 100644 --- a/app/javascript/themes/glitch/containers/media_gallery_container.js +++ b/app/javascript/flavours/glitch/containers/media_gallery_container.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from 'mastodon/locales'; -import MediaGallery from 'themes/glitch/components/media_gallery'; +import MediaGallery from 'flavours/glitch/components/media_gallery'; import { fromJS } from 'immutable'; const { localeData, messages } = getLocale(); diff --git a/app/javascript/themes/glitch/containers/notification_purge_buttons_container.js b/app/javascript/flavours/glitch/containers/notification_purge_buttons_container.js similarity index 86% rename from app/javascript/themes/glitch/containers/notification_purge_buttons_container.js rename to app/javascript/flavours/glitch/containers/notification_purge_buttons_container.js index ee4cb84cdf1..2570cf4a567 100644 --- a/app/javascript/themes/glitch/containers/notification_purge_buttons_container.js +++ b/app/javascript/flavours/glitch/containers/notification_purge_buttons_container.js @@ -3,13 +3,13 @@ import { connect } from 'react-redux'; import { defineMessages, injectIntl } from 'react-intl'; // Our imports. -import NotificationPurgeButtons from 'themes/glitch/components/notification_purge_buttons'; +import NotificationPurgeButtons from 'flavours/glitch/components/notification_purge_buttons'; import { deleteMarkedNotifications, enterNotificationClearingMode, markAllNotifications, -} from 'themes/glitch/actions/notifications'; -import { openModal } from 'themes/glitch/actions/modal'; +} from 'flavours/glitch/actions/notifications'; +import { openModal } from 'flavours/glitch/actions/modal'; const messages = defineMessages({ clearMessage: { id: 'notifications.marked_clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all selected notifications?' }, diff --git a/app/javascript/themes/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js similarity index 85% rename from app/javascript/themes/glitch/containers/status_container.js rename to app/javascript/flavours/glitch/containers/status_container.js index 14906723a68..1a4f3527867 100644 --- a/app/javascript/themes/glitch/containers/status_container.js +++ b/app/javascript/flavours/glitch/containers/status_container.js @@ -1,11 +1,11 @@ import React from 'react'; import { connect } from 'react-redux'; -import Status from 'themes/glitch/components/status'; -import { makeGetStatus } from 'themes/glitch/selectors'; +import Status from 'flavours/glitch/components/status'; +import { makeGetStatus } from 'flavours/glitch/selectors'; import { replyCompose, mentionCompose, -} from 'themes/glitch/actions/compose'; +} from 'flavours/glitch/actions/compose'; import { reblog, favourite, @@ -13,14 +13,14 @@ import { unfavourite, pin, unpin, -} from 'themes/glitch/actions/interactions'; -import { blockAccount } from 'themes/glitch/actions/accounts'; -import { muteStatus, unmuteStatus, deleteStatus } from 'themes/glitch/actions/statuses'; -import { initMuteModal } from 'themes/glitch/actions/mutes'; -import { initReport } from 'themes/glitch/actions/reports'; -import { openModal } from 'themes/glitch/actions/modal'; +} from 'flavours/glitch/actions/interactions'; +import { blockAccount } from 'flavours/glitch/actions/accounts'; +import { muteStatus, unmuteStatus, deleteStatus } from 'flavours/glitch/actions/statuses'; +import { initMuteModal } from 'flavours/glitch/actions/mutes'; +import { initReport } from 'flavours/glitch/actions/reports'; +import { openModal } from 'flavours/glitch/actions/modal'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import { boostModal, deleteModal } from 'themes/glitch/util/initial_state'; +import { boostModal, deleteModal } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, diff --git a/app/javascript/themes/glitch/containers/timeline_container.js b/app/javascript/flavours/glitch/containers/timeline_container.js similarity index 72% rename from app/javascript/themes/glitch/containers/timeline_container.js rename to app/javascript/flavours/glitch/containers/timeline_container.js index a75f8808dc4..c5ffe1b6330 100644 --- a/app/javascript/themes/glitch/containers/timeline_container.js +++ b/app/javascript/flavours/glitch/containers/timeline_container.js @@ -1,13 +1,13 @@ import React from 'react'; import { Provider } from 'react-redux'; import PropTypes from 'prop-types'; -import configureStore from 'themes/glitch/store/configureStore'; -import { hydrateStore } from 'themes/glitch/actions/store'; +import configureStore from 'flavours/glitch/store/configureStore'; +import { hydrateStore } from 'flavours/glitch/actions/store'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from 'mastodon/locales'; -import PublicTimeline from 'themes/glitch/features/standalone/public_timeline'; -import HashtagTimeline from 'themes/glitch/features/standalone/hashtag_timeline'; -import initialState from 'themes/glitch/util/initial_state'; +import PublicTimeline from 'flavours/glitch/features/standalone/public_timeline'; +import HashtagTimeline from 'flavours/glitch/features/standalone/hashtag_timeline'; +import initialState from 'flavours/glitch/util/initial_state'; const { localeData, messages } = getLocale(); addLocaleData(localeData); diff --git a/app/javascript/themes/glitch/containers/video_container.js b/app/javascript/flavours/glitch/containers/video_container.js similarity index 91% rename from app/javascript/themes/glitch/containers/video_container.js rename to app/javascript/flavours/glitch/containers/video_container.js index 2b0e9866621..b206e9a1001 100644 --- a/app/javascript/themes/glitch/containers/video_container.js +++ b/app/javascript/flavours/glitch/containers/video_container.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { IntlProvider, addLocaleData } from 'react-intl'; import { getLocale } from 'mastodon/locales'; -import Video from 'themes/glitch/features/video'; +import Video from 'flavours/glitch/features/video'; const { localeData, messages } = getLocale(); addLocaleData(localeData); diff --git a/app/javascript/themes/glitch/features/account/components/action_bar.js b/app/javascript/flavours/glitch/features/account/components/action_bar.js similarity index 97% rename from app/javascript/themes/glitch/features/account/components/action_bar.js rename to app/javascript/flavours/glitch/features/account/components/action_bar.js index 0edd5c8481d..7c9c1af4e8d 100644 --- a/app/javascript/themes/glitch/features/account/components/action_bar.js +++ b/app/javascript/flavours/glitch/features/account/components/action_bar.js @@ -1,10 +1,10 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import DropdownMenuContainer from 'themes/glitch/containers/dropdown_menu_container'; +import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; import { Link } from 'react-router-dom'; import { defineMessages, injectIntl, FormattedMessage, FormattedNumber } from 'react-intl'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' }, diff --git a/app/javascript/themes/glitch/features/account/components/header.js b/app/javascript/flavours/glitch/features/account/components/header.js similarity index 92% rename from app/javascript/themes/glitch/features/account/components/header.js rename to app/javascript/flavours/glitch/features/account/components/header.js index 696bb199190..f5ecaae71e9 100644 --- a/app/javascript/themes/glitch/features/account/components/header.js +++ b/app/javascript/flavours/glitch/features/account/components/header.js @@ -4,12 +4,12 @@ import PropTypes from 'prop-types'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import Avatar from 'themes/glitch/components/avatar'; -import IconButton from 'themes/glitch/components/icon_button'; +import Avatar from 'flavours/glitch/components/avatar'; +import IconButton from 'flavours/glitch/components/icon_button'; -import emojify from 'themes/glitch/util/emoji'; -import { me } from 'themes/glitch/util/initial_state'; -import { processBio } from 'themes/glitch/util/bio_metadata'; +import emojify from 'flavours/glitch/util/emoji'; +import { me } from 'flavours/glitch/util/initial_state'; +import { processBio } from 'flavours/glitch/util/bio_metadata'; const messages = defineMessages({ unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' }, diff --git a/app/javascript/themes/glitch/features/account_gallery/components/media_item.js b/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js similarity index 93% rename from app/javascript/themes/glitch/features/account_gallery/components/media_item.js rename to app/javascript/flavours/glitch/features/account_gallery/components/media_item.js index 88c9156b5e8..e52d3b0bb0c 100644 --- a/app/javascript/themes/glitch/features/account_gallery/components/media_item.js +++ b/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js @@ -1,7 +1,7 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import Permalink from 'themes/glitch/components/permalink'; +import Permalink from 'flavours/glitch/components/permalink'; export default class MediaItem extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/account_gallery/index.js b/app/javascript/flavours/glitch/features/account_gallery/index.js similarity index 84% rename from app/javascript/themes/glitch/features/account_gallery/index.js rename to app/javascript/flavours/glitch/features/account_gallery/index.js index a21c089da73..951e019e370 100644 --- a/app/javascript/themes/glitch/features/account_gallery/index.js +++ b/app/javascript/flavours/glitch/features/account_gallery/index.js @@ -2,18 +2,18 @@ import React from 'react'; import { connect } from 'react-redux'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import { fetchAccount } from 'themes/glitch/actions/accounts'; -import { refreshAccountMediaTimeline, expandAccountMediaTimeline } from 'themes/glitch/actions/timelines'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButton from 'themes/glitch/components/column_back_button'; +import { fetchAccount } from 'flavours/glitch/actions/accounts'; +import { refreshAccountMediaTimeline, expandAccountMediaTimeline } from 'flavours/glitch/actions/timelines'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButton from 'flavours/glitch/components/column_back_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { getAccountGallery } from 'themes/glitch/selectors'; +import { getAccountGallery } from 'flavours/glitch/selectors'; import MediaItem from './components/media_item'; -import HeaderContainer from 'themes/glitch/features/account_timeline/containers/header_container'; +import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container'; import { FormattedMessage } from 'react-intl'; import { ScrollContainer } from 'react-router-scroll-4'; -import LoadMore from 'themes/glitch/components/load_more'; +import LoadMore from 'flavours/glitch/components/load_more'; const mapStateToProps = (state, props) => ({ medias: getAccountGallery(state, props.params.accountId), diff --git a/app/javascript/themes/glitch/features/account_timeline/components/header.js b/app/javascript/flavours/glitch/features/account_timeline/components/header.js similarity index 90% rename from app/javascript/themes/glitch/features/account_timeline/components/header.js rename to app/javascript/flavours/glitch/features/account_timeline/components/header.js index c719a7bcba9..4ad677fbeb8 100644 --- a/app/javascript/themes/glitch/features/account_timeline/components/header.js +++ b/app/javascript/flavours/glitch/features/account_timeline/components/header.js @@ -1,9 +1,9 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import InnerHeader from 'themes/glitch/features/account/components/header'; -import ActionBar from 'themes/glitch/features/account/components/action_bar'; -import MissingIndicator from 'themes/glitch/components/missing_indicator'; +import InnerHeader from 'flavours/glitch/features/account/components/header'; +import ActionBar from 'flavours/glitch/features/account/components/action_bar'; +import MissingIndicator from 'flavours/glitch/components/missing_indicator'; import ImmutablePureComponent from 'react-immutable-pure-component'; export default class Header extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/account_timeline/containers/header_container.js b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js similarity index 86% rename from app/javascript/themes/glitch/features/account_timeline/containers/header_container.js rename to app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js index 766b57b564a..815a1a6136d 100644 --- a/app/javascript/themes/glitch/features/account_timeline/containers/header_container.js +++ b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js @@ -1,6 +1,6 @@ import React from 'react'; import { connect } from 'react-redux'; -import { makeGetAccount } from 'themes/glitch/selectors'; +import { makeGetAccount } from 'flavours/glitch/selectors'; import Header from '../components/header'; import { followAccount, @@ -8,14 +8,14 @@ import { blockAccount, unblockAccount, unmuteAccount, -} from 'themes/glitch/actions/accounts'; -import { mentionCompose } from 'themes/glitch/actions/compose'; -import { initMuteModal } from 'themes/glitch/actions/mutes'; -import { initReport } from 'themes/glitch/actions/reports'; -import { openModal } from 'themes/glitch/actions/modal'; -import { blockDomain, unblockDomain } from 'themes/glitch/actions/domain_blocks'; +} from 'flavours/glitch/actions/accounts'; +import { mentionCompose } from 'flavours/glitch/actions/compose'; +import { initMuteModal } from 'flavours/glitch/actions/mutes'; +import { initReport } from 'flavours/glitch/actions/reports'; +import { openModal } from 'flavours/glitch/actions/modal'; +import { blockDomain, unblockDomain } from 'flavours/glitch/actions/domain_blocks'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import { unfollowModal } from 'themes/glitch/util/initial_state'; +import { unfollowModal } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' }, diff --git a/app/javascript/themes/glitch/features/account_timeline/index.js b/app/javascript/flavours/glitch/features/account_timeline/index.js similarity index 93% rename from app/javascript/themes/glitch/features/account_timeline/index.js rename to app/javascript/flavours/glitch/features/account_timeline/index.js index 81336ef3a25..75dba504901 100644 --- a/app/javascript/themes/glitch/features/account_timeline/index.js +++ b/app/javascript/flavours/glitch/features/account_timeline/index.js @@ -2,8 +2,8 @@ import React from 'react'; import { connect } from 'react-redux'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import { fetchAccount } from 'themes/glitch/actions/accounts'; -import { refreshAccountTimeline, expandAccountTimeline } from 'themes/glitch/actions/timelines'; +import { fetchAccount } from 'flavours/glitch/actions/accounts'; +import { refreshAccountTimeline, expandAccountTimeline } from 'flavours/glitch/actions/timelines'; import StatusList from '../../components/status_list'; import LoadingIndicator from '../../components/loading_indicator'; import Column from '../ui/components/column'; diff --git a/app/javascript/themes/glitch/features/blocks/index.js b/app/javascript/flavours/glitch/features/blocks/index.js similarity index 81% rename from app/javascript/themes/glitch/features/blocks/index.js rename to app/javascript/flavours/glitch/features/blocks/index.js index 70630818c61..edd448921e4 100644 --- a/app/javascript/themes/glitch/features/blocks/index.js +++ b/app/javascript/flavours/glitch/features/blocks/index.js @@ -2,12 +2,12 @@ import React from 'react'; import { connect } from 'react-redux'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; import { ScrollContainer } from 'react-router-scroll-4'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import { fetchBlocks, expandBlocks } from 'themes/glitch/actions/blocks'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import { fetchBlocks, expandBlocks } from 'flavours/glitch/actions/blocks'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/community_timeline/components/column_settings.js b/app/javascript/flavours/glitch/features/community_timeline/components/column_settings.js similarity index 94% rename from app/javascript/themes/glitch/features/community_timeline/components/column_settings.js rename to app/javascript/flavours/glitch/features/community_timeline/components/column_settings.js index 988e3630826..6dc292ee546 100644 --- a/app/javascript/themes/glitch/features/community_timeline/components/column_settings.js +++ b/app/javascript/flavours/glitch/features/community_timeline/components/column_settings.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import SettingText from 'themes/glitch/components/setting_text'; +import SettingText from 'flavours/glitch/components/setting_text'; const messages = defineMessages({ filter_regex: { id: 'home.column_settings.filter_regex', defaultMessage: 'Filter out by regular expressions' }, diff --git a/app/javascript/themes/glitch/features/community_timeline/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/community_timeline/containers/column_settings_container.js similarity index 86% rename from app/javascript/themes/glitch/features/community_timeline/containers/column_settings_container.js rename to app/javascript/flavours/glitch/features/community_timeline/containers/column_settings_container.js index cd9c3436527..84234a836ba 100644 --- a/app/javascript/themes/glitch/features/community_timeline/containers/column_settings_container.js +++ b/app/javascript/flavours/glitch/features/community_timeline/containers/column_settings_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import ColumnSettings from '../components/column_settings'; -import { changeSetting } from 'themes/glitch/actions/settings'; +import { changeSetting } from 'flavours/glitch/actions/settings'; const mapStateToProps = state => ({ settings: state.getIn(['settings', 'community']), diff --git a/app/javascript/themes/glitch/features/community_timeline/index.js b/app/javascript/flavours/glitch/features/community_timeline/index.js similarity index 85% rename from app/javascript/themes/glitch/features/community_timeline/index.js rename to app/javascript/flavours/glitch/features/community_timeline/index.js index 9d255bd01cc..55355414f46 100644 --- a/app/javascript/themes/glitch/features/community_timeline/index.js +++ b/app/javascript/flavours/glitch/features/community_timeline/index.js @@ -1,17 +1,17 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import { refreshCommunityTimeline, expandCommunityTimeline, -} from 'themes/glitch/actions/timelines'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; +} from 'flavours/glitch/actions/timelines'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ColumnSettingsContainer from './containers/column_settings_container'; -import { connectCommunityStream } from 'themes/glitch/actions/streaming'; +import { connectCommunityStream } from 'flavours/glitch/actions/streaming'; const messages = defineMessages({ title: { id: 'column.community', defaultMessage: 'Local timeline' }, diff --git a/app/javascript/themes/glitch/features/compose/components/advanced_options.js b/app/javascript/flavours/glitch/features/compose/components/advanced_options.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/components/advanced_options.js rename to app/javascript/flavours/glitch/features/compose/components/advanced_options.js diff --git a/app/javascript/themes/glitch/features/compose/components/advanced_options_toggle.js b/app/javascript/flavours/glitch/features/compose/components/advanced_options_toggle.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/components/advanced_options_toggle.js rename to app/javascript/flavours/glitch/features/compose/components/advanced_options_toggle.js diff --git a/app/javascript/themes/glitch/features/compose/components/attach_options.js b/app/javascript/flavours/glitch/features/compose/components/attach_options.js similarity index 96% rename from app/javascript/themes/glitch/features/compose/components/attach_options.js rename to app/javascript/flavours/glitch/features/compose/components/attach_options.js index c396714f3a8..6c7a1f55f68 100644 --- a/app/javascript/themes/glitch/features/compose/components/attach_options.js +++ b/app/javascript/flavours/glitch/features/compose/components/attach_options.js @@ -6,10 +6,10 @@ import { injectIntl, defineMessages } from 'react-intl'; // Our imports // import ComposeDropdown from './dropdown'; -import { uploadCompose } from 'themes/glitch/actions/compose'; +import { uploadCompose } from 'flavours/glitch/actions/compose'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { openModal } from 'themes/glitch/actions/modal'; +import { openModal } from 'flavours/glitch/actions/modal'; const messages = defineMessages({ upload : diff --git a/app/javascript/themes/glitch/features/compose/components/autosuggest_account.js b/app/javascript/flavours/glitch/features/compose/components/autosuggest_account.js similarity index 82% rename from app/javascript/themes/glitch/features/compose/components/autosuggest_account.js rename to app/javascript/flavours/glitch/features/compose/components/autosuggest_account.js index 4a98d89fec6..3d474af30e5 100644 --- a/app/javascript/themes/glitch/features/compose/components/autosuggest_account.js +++ b/app/javascript/flavours/glitch/features/compose/components/autosuggest_account.js @@ -1,6 +1,6 @@ import React from 'react'; -import Avatar from 'themes/glitch/components/avatar'; -import DisplayName from 'themes/glitch/components/display_name'; +import Avatar from 'flavours/glitch/components/avatar'; +import DisplayName from 'flavours/glitch/components/display_name'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/compose/components/character_counter.js b/app/javascript/flavours/glitch/features/compose/components/character_counter.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/components/character_counter.js rename to app/javascript/flavours/glitch/features/compose/components/character_counter.js diff --git a/app/javascript/themes/glitch/features/compose/components/compose_form.js b/app/javascript/flavours/glitch/features/compose/components/compose_form.js similarity index 96% rename from app/javascript/themes/glitch/features/compose/components/compose_form.js rename to app/javascript/flavours/glitch/features/compose/components/compose_form.js index 54b1944a465..67ce935f43c 100644 --- a/app/javascript/themes/glitch/features/compose/components/compose_form.js +++ b/app/javascript/flavours/glitch/features/compose/components/compose_form.js @@ -1,12 +1,12 @@ import React from 'react'; import CharacterCounter from './character_counter'; -import Button from 'themes/glitch/components/button'; +import Button from 'flavours/glitch/components/button'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import ReplyIndicatorContainer from '../containers/reply_indicator_container'; -import AutosuggestTextarea from 'themes/glitch/components/autosuggest_textarea'; +import AutosuggestTextarea from 'flavours/glitch/components/autosuggest_textarea'; import { defineMessages, injectIntl } from 'react-intl'; -import Collapsable from 'themes/glitch/components/collapsable'; +import Collapsable from 'flavours/glitch/components/collapsable'; import SpoilerButtonContainer from '../containers/spoiler_button_container'; import PrivacyDropdownContainer from '../containers/privacy_dropdown_container'; import ComposeAdvancedOptionsContainer from '../containers/advanced_options_container'; @@ -14,12 +14,12 @@ import SensitiveButtonContainer from '../containers/sensitive_button_container'; import EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container'; import UploadFormContainer from '../containers/upload_form_container'; import WarningContainer from '../containers/warning_container'; -import { isMobile } from 'themes/glitch/util/is_mobile'; +import { isMobile } from 'flavours/glitch/util/is_mobile'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { length } from 'stringz'; -import { countableText } from 'themes/glitch/util/counter'; +import { countableText } from 'flavours/glitch/util/counter'; import ComposeAttachOptions from './attach_options'; -import initialState from 'themes/glitch/util/initial_state'; +import initialState from 'flavours/glitch/util/initial_state'; const maxChars = initialState.max_toot_chars; diff --git a/app/javascript/themes/glitch/features/compose/components/dropdown.js b/app/javascript/flavours/glitch/features/compose/components/dropdown.js similarity index 96% rename from app/javascript/themes/glitch/features/compose/components/dropdown.js rename to app/javascript/flavours/glitch/features/compose/components/dropdown.js index f3d9f094e54..1b0000fb7f9 100644 --- a/app/javascript/themes/glitch/features/compose/components/dropdown.js +++ b/app/javascript/flavours/glitch/features/compose/components/dropdown.js @@ -3,7 +3,7 @@ import React from 'react'; import PropTypes from 'prop-types'; // Our imports. -import IconButton from 'themes/glitch/components/icon_button'; +import IconButton from 'flavours/glitch/components/icon_button'; const iconStyle = { height : null, diff --git a/app/javascript/themes/glitch/features/compose/components/emoji_picker_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js similarity index 98% rename from app/javascript/themes/glitch/features/compose/components/emoji_picker_dropdown.js rename to app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js index fd59efb8512..cf89f91d336 100644 --- a/app/javascript/themes/glitch/features/compose/components/emoji_picker_dropdown.js +++ b/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js @@ -1,12 +1,12 @@ import React from 'react'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl } from 'react-intl'; -import { EmojiPicker as EmojiPickerAsync } from 'themes/glitch/util/async-components'; +import { EmojiPicker as EmojiPickerAsync } from 'flavours/glitch/util/async-components'; import Overlay from 'react-overlays/lib/Overlay'; import classNames from 'classnames'; import ImmutablePropTypes from 'react-immutable-proptypes'; import detectPassiveEvents from 'detect-passive-events'; -import { buildCustomEmojis } from 'themes/glitch/util/emoji'; +import { buildCustomEmojis } from 'flavours/glitch/util/emoji'; const messages = defineMessages({ emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' }, diff --git a/app/javascript/themes/glitch/features/compose/components/navigation_bar.js b/app/javascript/flavours/glitch/features/compose/components/navigation_bar.js similarity index 87% rename from app/javascript/themes/glitch/features/compose/components/navigation_bar.js rename to app/javascript/flavours/glitch/features/compose/components/navigation_bar.js index 24a70949b86..1b6d74123e7 100644 --- a/app/javascript/themes/glitch/features/compose/components/navigation_bar.js +++ b/app/javascript/flavours/glitch/features/compose/components/navigation_bar.js @@ -1,9 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import Avatar from 'themes/glitch/components/avatar'; -import IconButton from 'themes/glitch/components/icon_button'; -import Permalink from 'themes/glitch/components/permalink'; +import Avatar from 'flavours/glitch/components/avatar'; +import IconButton from 'flavours/glitch/components/icon_button'; +import Permalink from 'flavours/glitch/components/permalink'; import { FormattedMessage } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/compose/components/privacy_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js similarity index 98% rename from app/javascript/themes/glitch/features/compose/components/privacy_dropdown.js rename to app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js index 0cd92d174f4..90f062f8f08 100644 --- a/app/javascript/themes/glitch/features/compose/components/privacy_dropdown.js +++ b/app/javascript/flavours/glitch/features/compose/components/privacy_dropdown.js @@ -1,9 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import { injectIntl, defineMessages } from 'react-intl'; -import IconButton from 'themes/glitch/components/icon_button'; +import IconButton from 'flavours/glitch/components/icon_button'; import Overlay from 'react-overlays/lib/Overlay'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import detectPassiveEvents from 'detect-passive-events'; import classNames from 'classnames'; diff --git a/app/javascript/themes/glitch/features/compose/components/reply_indicator.js b/app/javascript/flavours/glitch/features/compose/components/reply_indicator.js similarity index 90% rename from app/javascript/themes/glitch/features/compose/components/reply_indicator.js rename to app/javascript/flavours/glitch/features/compose/components/reply_indicator.js index 9a8d10cebc7..cb28e51be1e 100644 --- a/app/javascript/themes/glitch/features/compose/components/reply_indicator.js +++ b/app/javascript/flavours/glitch/features/compose/components/reply_indicator.js @@ -1,9 +1,9 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import Avatar from 'themes/glitch/components/avatar'; -import IconButton from 'themes/glitch/components/icon_button'; -import DisplayName from 'themes/glitch/components/display_name'; +import Avatar from 'flavours/glitch/components/avatar'; +import IconButton from 'flavours/glitch/components/icon_button'; +import DisplayName from 'flavours/glitch/components/display_name'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/compose/components/search.js b/app/javascript/flavours/glitch/features/compose/components/search.js similarity index 98% rename from app/javascript/themes/glitch/features/compose/components/search.js rename to app/javascript/flavours/glitch/features/compose/components/search.js index c3218137f88..1ce66b19dad 100644 --- a/app/javascript/themes/glitch/features/compose/components/search.js +++ b/app/javascript/flavours/glitch/features/compose/components/search.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import Overlay from 'react-overlays/lib/Overlay'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; const messages = defineMessages({ diff --git a/app/javascript/themes/glitch/features/compose/components/search_results.js b/app/javascript/flavours/glitch/features/compose/components/search_results.js similarity index 93% rename from app/javascript/themes/glitch/features/compose/components/search_results.js rename to app/javascript/flavours/glitch/features/compose/components/search_results.js index 3fdafa5f3c1..2a4818d4e29 100644 --- a/app/javascript/themes/glitch/features/compose/components/search_results.js +++ b/app/javascript/flavours/glitch/features/compose/components/search_results.js @@ -1,8 +1,8 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { FormattedMessage } from 'react-intl'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import StatusContainer from 'themes/glitch/containers/status_container'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import StatusContainer from 'flavours/glitch/containers/status_container'; import { Link } from 'react-router-dom'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/compose/components/text_icon_button.js b/app/javascript/flavours/glitch/features/compose/components/text_icon_button.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/components/text_icon_button.js rename to app/javascript/flavours/glitch/features/compose/components/text_icon_button.js diff --git a/app/javascript/themes/glitch/features/compose/components/upload.js b/app/javascript/flavours/glitch/features/compose/components/upload.js similarity index 96% rename from app/javascript/themes/glitch/features/compose/components/upload.js rename to app/javascript/flavours/glitch/features/compose/components/upload.js index ded376ada35..a1fc93234c1 100644 --- a/app/javascript/themes/glitch/features/compose/components/upload.js +++ b/app/javascript/flavours/glitch/features/compose/components/upload.js @@ -1,8 +1,8 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import IconButton from 'themes/glitch/components/icon_button'; -import Motion from 'themes/glitch/util/optional_motion'; +import IconButton from 'flavours/glitch/components/icon_button'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { defineMessages, injectIntl } from 'react-intl'; diff --git a/app/javascript/themes/glitch/features/compose/components/upload_button.js b/app/javascript/flavours/glitch/features/compose/components/upload_button.js similarity index 97% rename from app/javascript/themes/glitch/features/compose/components/upload_button.js rename to app/javascript/flavours/glitch/features/compose/components/upload_button.js index d7742adfe76..f06167a2a98 100644 --- a/app/javascript/themes/glitch/features/compose/components/upload_button.js +++ b/app/javascript/flavours/glitch/features/compose/components/upload_button.js @@ -1,5 +1,5 @@ import React from 'react'; -import IconButton from 'themes/glitch/components/icon_button'; +import IconButton from 'flavours/glitch/components/icon_button'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl } from 'react-intl'; import { connect } from 'react-redux'; diff --git a/app/javascript/themes/glitch/features/compose/components/upload_form.js b/app/javascript/flavours/glitch/features/compose/components/upload_form.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/components/upload_form.js rename to app/javascript/flavours/glitch/features/compose/components/upload_form.js diff --git a/app/javascript/themes/glitch/features/compose/components/upload_progress.js b/app/javascript/flavours/glitch/features/compose/components/upload_progress.js similarity index 94% rename from app/javascript/themes/glitch/features/compose/components/upload_progress.js rename to app/javascript/flavours/glitch/features/compose/components/upload_progress.js index b923d0a2269..2a3b8ceb481 100644 --- a/app/javascript/themes/glitch/features/compose/components/upload_progress.js +++ b/app/javascript/flavours/glitch/features/compose/components/upload_progress.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import { FormattedMessage } from 'react-intl'; diff --git a/app/javascript/themes/glitch/features/compose/components/warning.js b/app/javascript/flavours/glitch/features/compose/components/warning.js similarity index 93% rename from app/javascript/themes/glitch/features/compose/components/warning.js rename to app/javascript/flavours/glitch/features/compose/components/warning.js index 82df55a31d2..4962e76c8ad 100644 --- a/app/javascript/themes/glitch/features/compose/components/warning.js +++ b/app/javascript/flavours/glitch/features/compose/components/warning.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; export default class Warning extends React.PureComponent { diff --git a/app/javascript/themes/glitch/features/compose/containers/advanced_options_container.js b/app/javascript/flavours/glitch/features/compose/containers/advanced_options_container.js similarity index 85% rename from app/javascript/themes/glitch/features/compose/containers/advanced_options_container.js rename to app/javascript/flavours/glitch/features/compose/containers/advanced_options_container.js index 9f168942a0a..da381568b2b 100644 --- a/app/javascript/themes/glitch/features/compose/containers/advanced_options_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/advanced_options_container.js @@ -2,7 +2,7 @@ import { connect } from 'react-redux'; // Our imports. -import { toggleComposeAdvancedOption } from 'themes/glitch/actions/compose'; +import { toggleComposeAdvancedOption } from 'flavours/glitch/actions/compose'; import ComposeAdvancedOptions from '../components/advanced_options'; const mapStateToProps = state => ({ diff --git a/app/javascript/themes/glitch/features/compose/containers/autosuggest_account_container.js b/app/javascript/flavours/glitch/features/compose/containers/autosuggest_account_container.js similarity index 86% rename from app/javascript/themes/glitch/features/compose/containers/autosuggest_account_container.js rename to app/javascript/flavours/glitch/features/compose/containers/autosuggest_account_container.js index 96eb70c185f..0e1c328fe90 100644 --- a/app/javascript/themes/glitch/features/compose/containers/autosuggest_account_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/autosuggest_account_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import AutosuggestAccount from '../components/autosuggest_account'; -import { makeGetAccount } from 'themes/glitch/selectors'; +import { makeGetAccount } from 'flavours/glitch/selectors'; const makeMapStateToProps = () => { const getAccount = makeGetAccount(); diff --git a/app/javascript/themes/glitch/features/compose/containers/compose_form_container.js b/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js similarity index 93% rename from app/javascript/themes/glitch/features/compose/containers/compose_form_container.js rename to app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js index 7afa988f1fc..e2e93e44b61 100644 --- a/app/javascript/themes/glitch/features/compose/containers/compose_form_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import ComposeForm from '../components/compose_form'; -import { changeComposeVisibility, uploadCompose } from 'themes/glitch/actions/compose'; +import { changeComposeVisibility, uploadCompose } from 'flavours/glitch/actions/compose'; import { changeCompose, submitCompose, @@ -9,7 +9,7 @@ import { selectComposeSuggestion, changeComposeSpoilerText, insertEmojiCompose, -} from 'themes/glitch/actions/compose'; +} from 'flavours/glitch/actions/compose'; const mapStateToProps = state => ({ text: state.getIn(['compose', 'text']), diff --git a/app/javascript/themes/glitch/features/compose/containers/emoji_picker_dropdown_container.js b/app/javascript/flavours/glitch/features/compose/containers/emoji_picker_dropdown_container.js similarity index 93% rename from app/javascript/themes/glitch/features/compose/containers/emoji_picker_dropdown_container.js rename to app/javascript/flavours/glitch/features/compose/containers/emoji_picker_dropdown_container.js index 55a13bd6539..ba85edd8737 100644 --- a/app/javascript/themes/glitch/features/compose/containers/emoji_picker_dropdown_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/emoji_picker_dropdown_container.js @@ -1,9 +1,9 @@ import { connect } from 'react-redux'; import EmojiPickerDropdown from '../components/emoji_picker_dropdown'; -import { changeSetting } from 'themes/glitch/actions/settings'; +import { changeSetting } from 'flavours/glitch/actions/settings'; import { createSelector } from 'reselect'; import { Map as ImmutableMap } from 'immutable'; -import { useEmoji } from 'themes/glitch/actions/emojis'; +import { useEmoji } from 'flavours/glitch/actions/emojis'; const perLine = 8; const lines = 2; diff --git a/app/javascript/themes/glitch/features/compose/containers/navigation_container.js b/app/javascript/flavours/glitch/features/compose/containers/navigation_container.js similarity index 81% rename from app/javascript/themes/glitch/features/compose/containers/navigation_container.js rename to app/javascript/flavours/glitch/features/compose/containers/navigation_container.js index b6d737b462d..eb630ffbb5d 100644 --- a/app/javascript/themes/glitch/features/compose/containers/navigation_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/navigation_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import NavigationBar from '../components/navigation_bar'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const mapStateToProps = state => { return { diff --git a/app/javascript/themes/glitch/features/compose/containers/privacy_dropdown_container.js b/app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js similarity index 73% rename from app/javascript/themes/glitch/features/compose/containers/privacy_dropdown_container.js rename to app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js index 9636ceab244..cb94fcc8064 100644 --- a/app/javascript/themes/glitch/features/compose/containers/privacy_dropdown_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js @@ -1,8 +1,8 @@ import { connect } from 'react-redux'; import PrivacyDropdown from '../components/privacy_dropdown'; -import { changeComposeVisibility } from 'themes/glitch/actions/compose'; -import { openModal, closeModal } from 'themes/glitch/actions/modal'; -import { isUserTouching } from 'themes/glitch/util/is_mobile'; +import { changeComposeVisibility } from 'flavours/glitch/actions/compose'; +import { openModal, closeModal } from 'flavours/glitch/actions/modal'; +import { isUserTouching } from 'flavours/glitch/util/is_mobile'; const mapStateToProps = state => ({ isModalOpen: state.get('modal').modalType === 'ACTIONS', diff --git a/app/javascript/themes/glitch/features/compose/containers/reply_indicator_container.js b/app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js similarity index 79% rename from app/javascript/themes/glitch/features/compose/containers/reply_indicator_container.js rename to app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js index 6dcabb3cd18..a7c82d135dc 100644 --- a/app/javascript/themes/glitch/features/compose/containers/reply_indicator_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/reply_indicator_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; -import { cancelReplyCompose } from 'themes/glitch/actions/compose'; -import { makeGetStatus } from 'themes/glitch/selectors'; +import { cancelReplyCompose } from 'flavours/glitch/actions/compose'; +import { makeGetStatus } from 'flavours/glitch/selectors'; import ReplyIndicator from '../components/reply_indicator'; const makeMapStateToProps = () => { diff --git a/app/javascript/themes/glitch/features/compose/containers/search_container.js b/app/javascript/flavours/glitch/features/compose/containers/search_container.js similarity index 93% rename from app/javascript/themes/glitch/features/compose/containers/search_container.js rename to app/javascript/flavours/glitch/features/compose/containers/search_container.js index a450d27e7a4..8f4bfcf0884 100644 --- a/app/javascript/themes/glitch/features/compose/containers/search_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/search_container.js @@ -4,7 +4,7 @@ import { clearSearch, submitSearch, showSearch, -} from 'themes/glitch/actions/search'; +} from 'flavours/glitch/actions/search'; import Search from '../components/search'; const mapStateToProps = state => ({ diff --git a/app/javascript/themes/glitch/features/compose/containers/search_results_container.js b/app/javascript/flavours/glitch/features/compose/containers/search_results_container.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/containers/search_results_container.js rename to app/javascript/flavours/glitch/features/compose/containers/search_results_container.js diff --git a/app/javascript/themes/glitch/features/compose/containers/sensitive_button_container.js b/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js similarity index 91% rename from app/javascript/themes/glitch/features/compose/containers/sensitive_button_container.js rename to app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js index a710dd104f0..cf6706c0e0a 100644 --- a/app/javascript/themes/glitch/features/compose/containers/sensitive_button_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js @@ -2,9 +2,9 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import IconButton from 'themes/glitch/components/icon_button'; -import { changeComposeSensitivity } from 'themes/glitch/actions/compose'; -import Motion from 'themes/glitch/util/optional_motion'; +import IconButton from 'flavours/glitch/components/icon_button'; +import { changeComposeSensitivity } from 'flavours/glitch/actions/compose'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import { injectIntl, defineMessages } from 'react-intl'; diff --git a/app/javascript/themes/glitch/features/compose/containers/spoiler_button_container.js b/app/javascript/flavours/glitch/features/compose/containers/spoiler_button_container.js similarity index 89% rename from app/javascript/themes/glitch/features/compose/containers/spoiler_button_container.js rename to app/javascript/flavours/glitch/features/compose/containers/spoiler_button_container.js index 160e71ba921..d7b4246bc2f 100644 --- a/app/javascript/themes/glitch/features/compose/containers/spoiler_button_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/spoiler_button_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import TextIconButton from '../components/text_icon_button'; -import { changeComposeSpoilerness } from 'themes/glitch/actions/compose'; +import { changeComposeSpoilerness } from 'flavours/glitch/actions/compose'; import { injectIntl, defineMessages } from 'react-intl'; const messages = defineMessages({ diff --git a/app/javascript/themes/glitch/features/compose/containers/upload_button_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_button_container.js similarity index 90% rename from app/javascript/themes/glitch/features/compose/containers/upload_button_container.js rename to app/javascript/flavours/glitch/features/compose/containers/upload_button_container.js index f332eae1aad..4c1cb49e938 100644 --- a/app/javascript/themes/glitch/features/compose/containers/upload_button_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/upload_button_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import UploadButton from '../components/upload_button'; -import { uploadCompose } from 'themes/glitch/actions/compose'; +import { uploadCompose } from 'flavours/glitch/actions/compose'; const mapStateToProps = state => ({ disabled: state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size > 3 || state.getIn(['compose', 'media_attachments']).some(m => m.get('type') === 'video')), diff --git a/app/javascript/themes/glitch/features/compose/containers/upload_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_container.js similarity index 84% rename from app/javascript/themes/glitch/features/compose/containers/upload_container.js rename to app/javascript/flavours/glitch/features/compose/containers/upload_container.js index eea514bf537..368038425e1 100644 --- a/app/javascript/themes/glitch/features/compose/containers/upload_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/upload_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import Upload from '../components/upload'; -import { undoUploadCompose, changeUploadCompose } from 'themes/glitch/actions/compose'; +import { undoUploadCompose, changeUploadCompose } from 'flavours/glitch/actions/compose'; const mapStateToProps = (state, { id }) => ({ media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id), diff --git a/app/javascript/themes/glitch/features/compose/containers/upload_form_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_form_container.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/containers/upload_form_container.js rename to app/javascript/flavours/glitch/features/compose/containers/upload_form_container.js diff --git a/app/javascript/themes/glitch/features/compose/containers/upload_progress_container.js b/app/javascript/flavours/glitch/features/compose/containers/upload_progress_container.js similarity index 100% rename from app/javascript/themes/glitch/features/compose/containers/upload_progress_container.js rename to app/javascript/flavours/glitch/features/compose/containers/upload_progress_container.js diff --git a/app/javascript/themes/glitch/features/compose/containers/warning_container.js b/app/javascript/flavours/glitch/features/compose/containers/warning_container.js similarity index 94% rename from app/javascript/themes/glitch/features/compose/containers/warning_container.js rename to app/javascript/flavours/glitch/features/compose/containers/warning_container.js index 225d6a1dd9c..f20c75b9115 100644 --- a/app/javascript/themes/glitch/features/compose/containers/warning_container.js +++ b/app/javascript/flavours/glitch/features/compose/containers/warning_container.js @@ -3,7 +3,7 @@ import { connect } from 'react-redux'; import Warning from '../components/warning'; import PropTypes from 'prop-types'; import { FormattedMessage } from 'react-intl'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const mapStateToProps = state => ({ needsLockWarning: state.getIn(['compose', 'privacy']) === 'private' && !state.getIn(['accounts', me, 'locked']), diff --git a/app/javascript/themes/glitch/features/compose/index.js b/app/javascript/flavours/glitch/features/compose/index.js similarity index 93% rename from app/javascript/themes/glitch/features/compose/index.js rename to app/javascript/flavours/glitch/features/compose/index.js index 3fcaf416f88..02b97ad00e2 100644 --- a/app/javascript/themes/glitch/features/compose/index.js +++ b/app/javascript/flavours/glitch/features/compose/index.js @@ -4,16 +4,16 @@ import NavigationContainer from './containers/navigation_container'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import { mountCompose, unmountCompose } from 'themes/glitch/actions/compose'; -import { openModal } from 'themes/glitch/actions/modal'; -import { changeLocalSetting } from 'themes/glitch/actions/local_settings'; +import { mountCompose, unmountCompose } from 'flavours/glitch/actions/compose'; +import { openModal } from 'flavours/glitch/actions/modal'; +import { changeLocalSetting } from 'flavours/glitch/actions/local_settings'; import { Link } from 'react-router-dom'; import { injectIntl, defineMessages } from 'react-intl'; import SearchContainer from './containers/search_container'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import SearchResultsContainer from './containers/search_results_container'; -import { changeComposing } from 'themes/glitch/actions/compose'; +import { changeComposing } from 'flavours/glitch/actions/compose'; const messages = defineMessages({ start: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, diff --git a/app/javascript/themes/glitch/features/direct_timeline/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/direct_timeline/containers/column_settings_container.js similarity index 67% rename from app/javascript/themes/glitch/features/direct_timeline/containers/column_settings_container.js rename to app/javascript/flavours/glitch/features/direct_timeline/containers/column_settings_container.js index 2a40c65a523..d3e4b421689 100644 --- a/app/javascript/themes/glitch/features/direct_timeline/containers/column_settings_container.js +++ b/app/javascript/flavours/glitch/features/direct_timeline/containers/column_settings_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; -import ColumnSettings from 'themes/glitch/features/community_timeline/components/column_settings'; -import { changeSetting } from 'themes/glitch/actions/settings'; +import ColumnSettings from 'flavours/glitch/features/community_timeline/components/column_settings'; +import { changeSetting } from 'flavours/glitch/actions/settings'; const mapStateToProps = state => ({ settings: state.getIn(['settings', 'direct']), diff --git a/app/javascript/themes/glitch/features/direct_timeline/index.js b/app/javascript/flavours/glitch/features/direct_timeline/index.js similarity index 85% rename from app/javascript/themes/glitch/features/direct_timeline/index.js rename to app/javascript/flavours/glitch/features/direct_timeline/index.js index 6b29cf94d2e..81096c0eced 100644 --- a/app/javascript/themes/glitch/features/direct_timeline/index.js +++ b/app/javascript/flavours/glitch/features/direct_timeline/index.js @@ -1,17 +1,17 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import { refreshDirectTimeline, expandDirectTimeline, -} from 'themes/glitch/actions/timelines'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; +} from 'flavours/glitch/actions/timelines'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ColumnSettingsContainer from './containers/column_settings_container'; -import { connectDirectStream } from 'themes/glitch/actions/streaming'; +import { connectDirectStream } from 'flavours/glitch/actions/streaming'; const messages = defineMessages({ title: { id: 'column.direct', defaultMessage: 'Direct messages' }, diff --git a/app/javascript/themes/glitch/features/favourited_statuses/index.js b/app/javascript/flavours/glitch/features/favourited_statuses/index.js similarity index 87% rename from app/javascript/themes/glitch/features/favourited_statuses/index.js rename to app/javascript/flavours/glitch/features/favourited_statuses/index.js index 80345e0e2b2..e20dda71833 100644 --- a/app/javascript/themes/glitch/features/favourited_statuses/index.js +++ b/app/javascript/flavours/glitch/features/favourited_statuses/index.js @@ -2,11 +2,11 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { fetchFavouritedStatuses, expandFavouritedStatuses } from 'themes/glitch/actions/favourites'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; -import StatusList from 'themes/glitch/components/status_list'; +import { fetchFavouritedStatuses, expandFavouritedStatuses } from 'flavours/glitch/actions/favourites'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; +import StatusList from 'flavours/glitch/components/status_list'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/favourites/index.js b/app/javascript/flavours/glitch/features/favourites/index.js similarity index 79% rename from app/javascript/themes/glitch/features/favourites/index.js rename to app/javascript/flavours/glitch/features/favourites/index.js index d7b8ac3b10c..055a15ccb77 100644 --- a/app/javascript/themes/glitch/features/favourites/index.js +++ b/app/javascript/flavours/glitch/features/favourites/index.js @@ -2,12 +2,12 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; -import { fetchFavourites } from 'themes/glitch/actions/interactions'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { fetchFavourites } from 'flavours/glitch/actions/interactions'; import { ScrollContainer } from 'react-router-scroll-4'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButton from 'themes/glitch/components/column_back_button'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButton from 'flavours/glitch/components/column_back_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; const mapStateToProps = (state, props) => ({ diff --git a/app/javascript/themes/glitch/features/follow_requests/components/account_authorize.js b/app/javascript/flavours/glitch/features/follow_requests/components/account_authorize.js similarity index 87% rename from app/javascript/themes/glitch/features/follow_requests/components/account_authorize.js rename to app/javascript/flavours/glitch/features/follow_requests/components/account_authorize.js index ce386d888df..dead0753f8e 100644 --- a/app/javascript/themes/glitch/features/follow_requests/components/account_authorize.js +++ b/app/javascript/flavours/glitch/features/follow_requests/components/account_authorize.js @@ -1,10 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import Permalink from 'themes/glitch/components/permalink'; -import Avatar from 'themes/glitch/components/avatar'; -import DisplayName from 'themes/glitch/components/display_name'; -import IconButton from 'themes/glitch/components/icon_button'; +import Permalink from 'flavours/glitch/components/permalink'; +import Avatar from 'flavours/glitch/components/avatar'; +import DisplayName from 'flavours/glitch/components/display_name'; +import IconButton from 'flavours/glitch/components/icon_button'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/follow_requests/containers/account_authorize_container.js b/app/javascript/flavours/glitch/features/follow_requests/containers/account_authorize_container.js similarity index 78% rename from app/javascript/themes/glitch/features/follow_requests/containers/account_authorize_container.js rename to app/javascript/flavours/glitch/features/follow_requests/containers/account_authorize_container.js index 78ae77eee3e..693e98e8ceb 100644 --- a/app/javascript/themes/glitch/features/follow_requests/containers/account_authorize_container.js +++ b/app/javascript/flavours/glitch/features/follow_requests/containers/account_authorize_container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux'; -import { makeGetAccount } from 'themes/glitch/selectors'; +import { makeGetAccount } from 'flavours/glitch/selectors'; import AccountAuthorize from '../components/account_authorize'; -import { authorizeFollowRequest, rejectFollowRequest } from 'themes/glitch/actions/accounts'; +import { authorizeFollowRequest, rejectFollowRequest } from 'flavours/glitch/actions/accounts'; const makeMapStateToProps = () => { const getAccount = makeGetAccount(); diff --git a/app/javascript/themes/glitch/features/follow_requests/index.js b/app/javascript/flavours/glitch/features/follow_requests/index.js similarity index 85% rename from app/javascript/themes/glitch/features/follow_requests/index.js rename to app/javascript/flavours/glitch/features/follow_requests/index.js index 3f44f518a9c..04ff3f1116a 100644 --- a/app/javascript/themes/glitch/features/follow_requests/index.js +++ b/app/javascript/flavours/glitch/features/follow_requests/index.js @@ -2,12 +2,12 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; import { ScrollContainer } from 'react-router-scroll-4'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; import AccountAuthorizeContainer from './containers/account_authorize_container'; -import { fetchFollowRequests, expandFollowRequests } from 'themes/glitch/actions/accounts'; +import { fetchFollowRequests, expandFollowRequests } from 'flavours/glitch/actions/accounts'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/followers/index.js b/app/javascript/flavours/glitch/features/followers/index.js similarity index 83% rename from app/javascript/themes/glitch/features/followers/index.js rename to app/javascript/flavours/glitch/features/followers/index.js index d586bf41d0c..f0ef29ff688 100644 --- a/app/javascript/themes/glitch/features/followers/index.js +++ b/app/javascript/flavours/glitch/features/followers/index.js @@ -2,18 +2,18 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; import { fetchAccount, fetchFollowers, expandFollowers, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { ScrollContainer } from 'react-router-scroll-4'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import Column from 'themes/glitch/features/ui/components/column'; -import HeaderContainer from 'themes/glitch/features/account_timeline/containers/header_container'; -import LoadMore from 'themes/glitch/components/load_more'; -import ColumnBackButton from 'themes/glitch/components/column_back_button'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import Column from 'flavours/glitch/features/ui/components/column'; +import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container'; +import LoadMore from 'flavours/glitch/components/load_more'; +import ColumnBackButton from 'flavours/glitch/components/column_back_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; const mapStateToProps = (state, props) => ({ diff --git a/app/javascript/themes/glitch/features/following/index.js b/app/javascript/flavours/glitch/features/following/index.js similarity index 83% rename from app/javascript/themes/glitch/features/following/index.js rename to app/javascript/flavours/glitch/features/following/index.js index c306faf21da..f30f7b0d989 100644 --- a/app/javascript/themes/glitch/features/following/index.js +++ b/app/javascript/flavours/glitch/features/following/index.js @@ -2,18 +2,18 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; import { fetchAccount, fetchFollowing, expandFollowing, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { ScrollContainer } from 'react-router-scroll-4'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import Column from 'themes/glitch/features/ui/components/column'; -import HeaderContainer from 'themes/glitch/features/account_timeline/containers/header_container'; -import LoadMore from 'themes/glitch/components/load_more'; -import ColumnBackButton from 'themes/glitch/components/column_back_button'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import Column from 'flavours/glitch/features/ui/components/column'; +import HeaderContainer from 'flavours/glitch/features/account_timeline/containers/header_container'; +import LoadMore from 'flavours/glitch/components/load_more'; +import ColumnBackButton from 'flavours/glitch/components/column_back_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; const mapStateToProps = (state, props) => ({ diff --git a/app/javascript/flavours/glitch/features/generic_not_found/index.js b/app/javascript/flavours/glitch/features/generic_not_found/index.js new file mode 100644 index 00000000000..d01a1ba4712 --- /dev/null +++ b/app/javascript/flavours/glitch/features/generic_not_found/index.js @@ -0,0 +1,11 @@ +import React from 'react'; +import Column from 'flavours/glitch/features/ui/components/column'; +import MissingIndicator from 'flavours/glitch/components/missing_indicator'; + +const GenericNotFound = () => ( + + + +); + +export default GenericNotFound; diff --git a/app/javascript/themes/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js similarity index 95% rename from app/javascript/themes/glitch/features/getting_started/index.js rename to app/javascript/flavours/glitch/features/getting_started/index.js index 74b019cf1c3..2af0fcf48d0 100644 --- a/app/javascript/themes/glitch/features/getting_started/index.js +++ b/app/javascript/flavours/glitch/features/getting_started/index.js @@ -1,14 +1,14 @@ import React from 'react'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnLink from 'themes/glitch/features/ui/components/column_link'; -import ColumnSubheading from 'themes/glitch/features/ui/components/column_subheading'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnLink from 'flavours/glitch/features/ui/components/column_link'; +import ColumnSubheading from 'flavours/glitch/features/ui/components/column_subheading'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { connect } from 'react-redux'; -import { openModal } from 'themes/glitch/actions/modal'; +import { openModal } from 'flavours/glitch/actions/modal'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ heading: { id: 'getting_started.heading', defaultMessage: 'Getting started' }, diff --git a/app/javascript/themes/glitch/features/hashtag_timeline/index.js b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js similarity index 86% rename from app/javascript/themes/glitch/features/hashtag_timeline/index.js rename to app/javascript/flavours/glitch/features/hashtag_timeline/index.js index a878931b3dd..9f3c9bec76d 100644 --- a/app/javascript/themes/glitch/features/hashtag_timeline/index.js +++ b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js @@ -1,16 +1,16 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import { refreshHashtagTimeline, expandHashtagTimeline, -} from 'themes/glitch/actions/timelines'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; +} from 'flavours/glitch/actions/timelines'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import { FormattedMessage } from 'react-intl'; -import { connectHashtagStream } from 'themes/glitch/actions/streaming'; +import { connectHashtagStream } from 'flavours/glitch/actions/streaming'; const mapStateToProps = (state, props) => ({ hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}`, 'unread']) > 0, diff --git a/app/javascript/themes/glitch/features/home_timeline/components/column_settings.js b/app/javascript/flavours/glitch/features/home_timeline/components/column_settings.js similarity index 92% rename from app/javascript/themes/glitch/features/home_timeline/components/column_settings.js rename to app/javascript/flavours/glitch/features/home_timeline/components/column_settings.js index 533da6c36cb..604a7c6dc05 100644 --- a/app/javascript/themes/glitch/features/home_timeline/components/column_settings.js +++ b/app/javascript/flavours/glitch/features/home_timeline/components/column_settings.js @@ -2,8 +2,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import SettingToggle from 'themes/glitch/features/notifications/components/setting_toggle'; -import SettingText from 'themes/glitch/components/setting_text'; +import SettingToggle from 'flavours/glitch/features/notifications/components/setting_toggle'; +import SettingText from 'flavours/glitch/components/setting_text'; const messages = defineMessages({ filter_regex: { id: 'home.column_settings.filter_regex', defaultMessage: 'Filter out by regular expressions' }, diff --git a/app/javascript/themes/glitch/features/home_timeline/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/home_timeline/containers/column_settings_container.js similarity index 84% rename from app/javascript/themes/glitch/features/home_timeline/containers/column_settings_container.js rename to app/javascript/flavours/glitch/features/home_timeline/containers/column_settings_container.js index a0062f564e7..19a8e792f71 100644 --- a/app/javascript/themes/glitch/features/home_timeline/containers/column_settings_container.js +++ b/app/javascript/flavours/glitch/features/home_timeline/containers/column_settings_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import ColumnSettings from '../components/column_settings'; -import { changeSetting, saveSettings } from 'themes/glitch/actions/settings'; +import { changeSetting, saveSettings } from 'flavours/glitch/actions/settings'; const mapStateToProps = state => ({ settings: state.getIn(['settings', 'home']), diff --git a/app/javascript/themes/glitch/features/home_timeline/index.js b/app/javascript/flavours/glitch/features/home_timeline/index.js similarity index 86% rename from app/javascript/themes/glitch/features/home_timeline/index.js rename to app/javascript/flavours/glitch/features/home_timeline/index.js index 8a65891cdbf..2dfec6bbed3 100644 --- a/app/javascript/themes/glitch/features/home_timeline/index.js +++ b/app/javascript/flavours/glitch/features/home_timeline/index.js @@ -1,11 +1,11 @@ import React from 'react'; import { connect } from 'react-redux'; -import { expandHomeTimeline } from 'themes/glitch/actions/timelines'; +import { expandHomeTimeline } from 'flavours/glitch/actions/timelines'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ColumnSettingsContainer from './containers/column_settings_container'; import { Link } from 'react-router-dom'; diff --git a/app/javascript/themes/glitch/features/local_settings/index.js b/app/javascript/flavours/glitch/features/local_settings/index.js similarity index 91% rename from app/javascript/themes/glitch/features/local_settings/index.js rename to app/javascript/flavours/glitch/features/local_settings/index.js index 6c5d514136a..81d9a3f4160 100644 --- a/app/javascript/themes/glitch/features/local_settings/index.js +++ b/app/javascript/flavours/glitch/features/local_settings/index.js @@ -7,8 +7,8 @@ import { connect } from 'react-redux'; // Our imports import LocalSettingsPage from './page'; import LocalSettingsNavigation from './navigation'; -import { closeModal } from 'themes/glitch/actions/modal'; -import { changeLocalSetting } from 'themes/glitch/actions/local_settings'; +import { closeModal } from 'flavours/glitch/actions/modal'; +import { changeLocalSetting } from 'flavours/glitch/actions/local_settings'; // Stylesheet imports import './style.scss'; diff --git a/app/javascript/themes/glitch/features/local_settings/navigation/index.js b/app/javascript/flavours/glitch/features/local_settings/navigation/index.js similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/navigation/index.js rename to app/javascript/flavours/glitch/features/local_settings/navigation/index.js diff --git a/app/javascript/themes/glitch/features/local_settings/navigation/item/index.js b/app/javascript/flavours/glitch/features/local_settings/navigation/item/index.js similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/navigation/item/index.js rename to app/javascript/flavours/glitch/features/local_settings/navigation/item/index.js diff --git a/app/javascript/themes/glitch/features/local_settings/navigation/item/style.scss b/app/javascript/flavours/glitch/features/local_settings/navigation/item/style.scss similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/navigation/item/style.scss rename to app/javascript/flavours/glitch/features/local_settings/navigation/item/style.scss diff --git a/app/javascript/themes/glitch/features/local_settings/navigation/style.scss b/app/javascript/flavours/glitch/features/local_settings/navigation/style.scss similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/navigation/style.scss rename to app/javascript/flavours/glitch/features/local_settings/navigation/style.scss diff --git a/app/javascript/themes/glitch/features/local_settings/page/index.js b/app/javascript/flavours/glitch/features/local_settings/page/index.js similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/page/index.js rename to app/javascript/flavours/glitch/features/local_settings/page/index.js diff --git a/app/javascript/themes/glitch/features/local_settings/page/item/index.js b/app/javascript/flavours/glitch/features/local_settings/page/item/index.js similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/page/item/index.js rename to app/javascript/flavours/glitch/features/local_settings/page/item/index.js diff --git a/app/javascript/themes/glitch/features/local_settings/page/item/style.scss b/app/javascript/flavours/glitch/features/local_settings/page/item/style.scss similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/page/item/style.scss rename to app/javascript/flavours/glitch/features/local_settings/page/item/style.scss diff --git a/app/javascript/themes/glitch/features/local_settings/page/style.scss b/app/javascript/flavours/glitch/features/local_settings/page/style.scss similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/page/style.scss rename to app/javascript/flavours/glitch/features/local_settings/page/style.scss diff --git a/app/javascript/themes/glitch/features/local_settings/style.scss b/app/javascript/flavours/glitch/features/local_settings/style.scss similarity index 100% rename from app/javascript/themes/glitch/features/local_settings/style.scss rename to app/javascript/flavours/glitch/features/local_settings/style.scss diff --git a/app/javascript/themes/glitch/features/mutes/index.js b/app/javascript/flavours/glitch/features/mutes/index.js similarity index 81% rename from app/javascript/themes/glitch/features/mutes/index.js rename to app/javascript/flavours/glitch/features/mutes/index.js index 1158b8262ff..87517eec948 100644 --- a/app/javascript/themes/glitch/features/mutes/index.js +++ b/app/javascript/flavours/glitch/features/mutes/index.js @@ -2,12 +2,12 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; import { ScrollContainer } from 'react-router-scroll-4'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import { fetchMutes, expandMutes } from 'themes/glitch/actions/mutes'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import { fetchMutes, expandMutes } from 'flavours/glitch/actions/mutes'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/notifications/components/clear_column_button.js b/app/javascript/flavours/glitch/features/notifications/components/clear_column_button.js similarity index 100% rename from app/javascript/themes/glitch/features/notifications/components/clear_column_button.js rename to app/javascript/flavours/glitch/features/notifications/components/clear_column_button.js diff --git a/app/javascript/themes/glitch/features/notifications/components/column_settings.js b/app/javascript/flavours/glitch/features/notifications/components/column_settings.js similarity index 100% rename from app/javascript/themes/glitch/features/notifications/components/column_settings.js rename to app/javascript/flavours/glitch/features/notifications/components/column_settings.js diff --git a/app/javascript/themes/glitch/features/notifications/components/follow.js b/app/javascript/flavours/glitch/features/notifications/components/follow.js similarity index 95% rename from app/javascript/themes/glitch/features/notifications/components/follow.js rename to app/javascript/flavours/glitch/features/notifications/components/follow.js index 8a0f01736d7..4b682733ee6 100644 --- a/app/javascript/themes/glitch/features/notifications/components/follow.js +++ b/app/javascript/flavours/glitch/features/notifications/components/follow.js @@ -7,8 +7,8 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { HotKeys } from 'react-hotkeys'; // Our imports. -import Permalink from 'themes/glitch/components/permalink'; -import AccountContainer from 'themes/glitch/containers/account_container'; +import Permalink from 'flavours/glitch/components/permalink'; +import AccountContainer from 'flavours/glitch/containers/account_container'; import NotificationOverlayContainer from '../containers/overlay_container'; export default class NotificationFollow extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/notifications/components/notification.js b/app/javascript/flavours/glitch/features/notifications/components/notification.js similarity index 96% rename from app/javascript/themes/glitch/features/notifications/components/notification.js rename to app/javascript/flavours/glitch/features/notifications/components/notification.js index a309d3a42a7..185da8395a2 100644 --- a/app/javascript/themes/glitch/features/notifications/components/notification.js +++ b/app/javascript/flavours/glitch/features/notifications/components/notification.js @@ -5,7 +5,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; // Our imports, -import StatusContainer from 'themes/glitch/containers/status_container'; +import StatusContainer from 'flavours/glitch/containers/status_container'; import NotificationFollow from './follow'; export default class Notification extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/notifications/components/overlay.js b/app/javascript/flavours/glitch/features/notifications/components/overlay.js similarity index 100% rename from app/javascript/themes/glitch/features/notifications/components/overlay.js rename to app/javascript/flavours/glitch/features/notifications/components/overlay.js diff --git a/app/javascript/themes/glitch/features/notifications/components/setting_toggle.js b/app/javascript/flavours/glitch/features/notifications/components/setting_toggle.js similarity index 100% rename from app/javascript/themes/glitch/features/notifications/components/setting_toggle.js rename to app/javascript/flavours/glitch/features/notifications/components/setting_toggle.js diff --git a/app/javascript/themes/glitch/features/notifications/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js similarity index 81% rename from app/javascript/themes/glitch/features/notifications/containers/column_settings_container.js rename to app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js index ddc8495f480..ce502700c45 100644 --- a/app/javascript/themes/glitch/features/notifications/containers/column_settings_container.js +++ b/app/javascript/flavours/glitch/features/notifications/containers/column_settings_container.js @@ -1,10 +1,10 @@ import { connect } from 'react-redux'; import { defineMessages, injectIntl } from 'react-intl'; import ColumnSettings from '../components/column_settings'; -import { changeSetting, saveSettings } from 'themes/glitch/actions/settings'; -import { clearNotifications } from 'themes/glitch/actions/notifications'; -import { changeAlerts as changePushNotifications, saveSettings as savePushNotificationSettings } from 'themes/glitch/actions/push_notifications'; -import { openModal } from 'themes/glitch/actions/modal'; +import { changeSetting, saveSettings } from 'flavours/glitch/actions/settings'; +import { clearNotifications } from 'flavours/glitch/actions/notifications'; +import { changeAlerts as changePushNotifications, saveSettings as savePushNotificationSettings } from 'flavours/glitch/actions/push_notifications'; +import { openModal } from 'flavours/glitch/actions/modal'; const messages = defineMessages({ clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' }, diff --git a/app/javascript/themes/glitch/features/notifications/containers/notification_container.js b/app/javascript/flavours/glitch/features/notifications/containers/notification_container.js similarity index 84% rename from app/javascript/themes/glitch/features/notifications/containers/notification_container.js rename to app/javascript/flavours/glitch/features/notifications/containers/notification_container.js index b61aaa21cdf..c60e72e1c20 100644 --- a/app/javascript/themes/glitch/features/notifications/containers/notification_container.js +++ b/app/javascript/flavours/glitch/features/notifications/containers/notification_container.js @@ -2,9 +2,9 @@ import { connect } from 'react-redux'; // Our imports. -import { makeGetNotification } from 'themes/glitch/selectors'; +import { makeGetNotification } from 'flavours/glitch/selectors'; import Notification from '../components/notification'; -import { mentionCompose } from 'themes/glitch/actions/compose'; +import { mentionCompose } from 'flavours/glitch/actions/compose'; const makeMapStateToProps = () => { const getNotification = makeGetNotification(); diff --git a/app/javascript/themes/glitch/features/notifications/containers/overlay_container.js b/app/javascript/flavours/glitch/features/notifications/containers/overlay_container.js similarity index 84% rename from app/javascript/themes/glitch/features/notifications/containers/overlay_container.js rename to app/javascript/flavours/glitch/features/notifications/containers/overlay_container.js index 52649cdd755..ee2d19814a5 100644 --- a/app/javascript/themes/glitch/features/notifications/containers/overlay_container.js +++ b/app/javascript/flavours/glitch/features/notifications/containers/overlay_container.js @@ -3,7 +3,7 @@ import { connect } from 'react-redux'; // Our imports. import NotificationOverlay from '../components/overlay'; -import { markNotificationForDelete } from 'themes/glitch/actions/notifications'; +import { markNotificationForDelete } from 'flavours/glitch/actions/notifications'; const mapDispatchToProps = dispatch => ({ onMarkForDelete(id, yes) { diff --git a/app/javascript/themes/glitch/features/notifications/index.js b/app/javascript/flavours/glitch/features/notifications/index.js similarity index 94% rename from app/javascript/themes/glitch/features/notifications/index.js rename to app/javascript/flavours/glitch/features/notifications/index.js index 1ecde660a80..12b0b5b834d 100644 --- a/app/javascript/themes/glitch/features/notifications/index.js +++ b/app/javascript/flavours/glitch/features/notifications/index.js @@ -2,21 +2,21 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import { enterNotificationClearingMode, expandNotifications, scrollTopNotifications, -} from 'themes/glitch/actions/notifications'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; +} from 'flavours/glitch/actions/notifications'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import NotificationContainer from './containers/notification_container'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ColumnSettingsContainer from './containers/column_settings_container'; import { createSelector } from 'reselect'; import { List as ImmutableList } from 'immutable'; import { debounce } from 'lodash'; -import ScrollableList from 'themes/glitch/components/scrollable_list'; +import ScrollableList from 'flavours/glitch/components/scrollable_list'; const messages = defineMessages({ title: { id: 'column.notifications', defaultMessage: 'Notifications' }, diff --git a/app/javascript/themes/glitch/features/pinned_statuses/index.js b/app/javascript/flavours/glitch/features/pinned_statuses/index.js similarity index 82% rename from app/javascript/themes/glitch/features/pinned_statuses/index.js rename to app/javascript/flavours/glitch/features/pinned_statuses/index.js index 0a3997850ba..f56d701760c 100644 --- a/app/javascript/themes/glitch/features/pinned_statuses/index.js +++ b/app/javascript/flavours/glitch/features/pinned_statuses/index.js @@ -2,10 +2,10 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { fetchPinnedStatuses } from 'themes/glitch/actions/pin_statuses'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim'; -import StatusList from 'themes/glitch/components/status_list'; +import { fetchPinnedStatuses } from 'flavours/glitch/actions/pin_statuses'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; +import StatusList from 'flavours/glitch/components/status_list'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; diff --git a/app/javascript/themes/glitch/features/public_timeline/containers/column_settings_container.js b/app/javascript/flavours/glitch/features/public_timeline/containers/column_settings_container.js similarity index 67% rename from app/javascript/themes/glitch/features/public_timeline/containers/column_settings_container.js rename to app/javascript/flavours/glitch/features/public_timeline/containers/column_settings_container.js index 0185a7724cc..b13e2064533 100644 --- a/app/javascript/themes/glitch/features/public_timeline/containers/column_settings_container.js +++ b/app/javascript/flavours/glitch/features/public_timeline/containers/column_settings_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; -import ColumnSettings from 'themes/glitch/features/community_timeline/components/column_settings'; -import { changeSetting } from 'themes/glitch/actions/settings'; +import ColumnSettings from 'flavours/glitch/features/community_timeline/components/column_settings'; +import { changeSetting } from 'flavours/glitch/actions/settings'; const mapStateToProps = state => ({ settings: state.getIn(['settings', 'public']), diff --git a/app/javascript/themes/glitch/features/public_timeline/index.js b/app/javascript/flavours/glitch/features/public_timeline/index.js similarity index 85% rename from app/javascript/themes/glitch/features/public_timeline/index.js rename to app/javascript/flavours/glitch/features/public_timeline/index.js index f5b3865afa3..bbdd4612e1e 100644 --- a/app/javascript/themes/glitch/features/public_timeline/index.js +++ b/app/javascript/flavours/glitch/features/public_timeline/index.js @@ -1,17 +1,17 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import { refreshPublicTimeline, expandPublicTimeline, -} from 'themes/glitch/actions/timelines'; -import { addColumn, removeColumn, moveColumn } from 'themes/glitch/actions/columns'; +} from 'flavours/glitch/actions/timelines'; +import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/columns'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ColumnSettingsContainer from './containers/column_settings_container'; -import { connectPublicStream } from 'themes/glitch/actions/streaming'; +import { connectPublicStream } from 'flavours/glitch/actions/streaming'; const messages = defineMessages({ title: { id: 'column.public', defaultMessage: 'Federated timeline' }, diff --git a/app/javascript/themes/glitch/features/reblogs/index.js b/app/javascript/flavours/glitch/features/reblogs/index.js similarity index 79% rename from app/javascript/themes/glitch/features/reblogs/index.js rename to app/javascript/flavours/glitch/features/reblogs/index.js index 8723f7c7cec..25b792b3979 100644 --- a/app/javascript/themes/glitch/features/reblogs/index.js +++ b/app/javascript/flavours/glitch/features/reblogs/index.js @@ -2,12 +2,12 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; -import { fetchReblogs } from 'themes/glitch/actions/interactions'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; +import { fetchReblogs } from 'flavours/glitch/actions/interactions'; import { ScrollContainer } from 'react-router-scroll-4'; -import AccountContainer from 'themes/glitch/containers/account_container'; -import Column from 'themes/glitch/features/ui/components/column'; -import ColumnBackButton from 'themes/glitch/components/column_back_button'; +import AccountContainer from 'flavours/glitch/containers/account_container'; +import Column from 'flavours/glitch/features/ui/components/column'; +import ColumnBackButton from 'flavours/glitch/components/column_back_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; const mapStateToProps = (state, props) => ({ diff --git a/app/javascript/themes/glitch/features/report/components/status_check_box.js b/app/javascript/flavours/glitch/features/report/components/status_check_box.js similarity index 100% rename from app/javascript/themes/glitch/features/report/components/status_check_box.js rename to app/javascript/flavours/glitch/features/report/components/status_check_box.js diff --git a/app/javascript/themes/glitch/features/report/containers/status_check_box_container.js b/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js similarity index 88% rename from app/javascript/themes/glitch/features/report/containers/status_check_box_container.js rename to app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js index 40d55fb3c01..9bfd41ffc6d 100644 --- a/app/javascript/themes/glitch/features/report/containers/status_check_box_container.js +++ b/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; import StatusCheckBox from '../components/status_check_box'; -import { toggleStatusReport } from 'themes/glitch/actions/reports'; +import { toggleStatusReport } from 'flavours/glitch/actions/reports'; import { Set as ImmutableSet } from 'immutable'; const mapStateToProps = (state, { id }) => ({ diff --git a/app/javascript/flavours/glitch/features/standalone/compose/index.js b/app/javascript/flavours/glitch/features/standalone/compose/index.js new file mode 100644 index 00000000000..b33c21cb5b6 --- /dev/null +++ b/app/javascript/flavours/glitch/features/standalone/compose/index.js @@ -0,0 +1,20 @@ +import React from 'react'; +import ComposeFormContainer from 'flavours/glitch/features/compose/containers/compose_form_container'; +import NotificationsContainer from 'flavours/glitch/features/ui/containers/notifications_container'; +import LoadingBarContainer from 'flavours/glitch/features/ui/containers/loading_bar_container'; +import ModalContainer from 'flavours/glitch/features/ui/containers/modal_container'; + +export default class Compose extends React.PureComponent { + + render () { + return ( +

+ ); + } + +} diff --git a/app/javascript/themes/glitch/features/standalone/hashtag_timeline/index.js b/app/javascript/flavours/glitch/features/standalone/hashtag_timeline/index.js similarity index 84% rename from app/javascript/themes/glitch/features/standalone/hashtag_timeline/index.js rename to app/javascript/flavours/glitch/features/standalone/hashtag_timeline/index.js index 7c56f264ff8..0ad2cef80eb 100644 --- a/app/javascript/themes/glitch/features/standalone/hashtag_timeline/index.js +++ b/app/javascript/flavours/glitch/features/standalone/hashtag_timeline/index.js @@ -1,13 +1,13 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; import { refreshHashtagTimeline, expandHashtagTimeline, -} from 'themes/glitch/actions/timelines'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +} from 'flavours/glitch/actions/timelines'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; @connect() export default class HashtagTimeline extends React.PureComponent { diff --git a/app/javascript/themes/glitch/features/standalone/public_timeline/index.js b/app/javascript/flavours/glitch/features/standalone/public_timeline/index.js similarity index 85% rename from app/javascript/themes/glitch/features/standalone/public_timeline/index.js rename to app/javascript/flavours/glitch/features/standalone/public_timeline/index.js index b3fb5528840..717f6fcafc4 100644 --- a/app/javascript/themes/glitch/features/standalone/public_timeline/index.js +++ b/app/javascript/flavours/glitch/features/standalone/public_timeline/index.js @@ -1,13 +1,13 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import StatusListContainer from 'themes/glitch/features/ui/containers/status_list_container'; +import StatusListContainer from 'flavours/glitch/features/ui/containers/status_list_container'; import { refreshPublicTimeline, expandPublicTimeline, -} from 'themes/glitch/actions/timelines'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +} from 'flavours/glitch/actions/timelines'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import { defineMessages, injectIntl } from 'react-intl'; const messages = defineMessages({ diff --git a/app/javascript/themes/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js similarity index 95% rename from app/javascript/themes/glitch/features/status/components/action_bar.js rename to app/javascript/flavours/glitch/features/status/components/action_bar.js index 6cda988d106..4d660ee3c0f 100644 --- a/app/javascript/themes/glitch/features/status/components/action_bar.js +++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js @@ -1,10 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; -import IconButton from 'themes/glitch/components/icon_button'; +import IconButton from 'flavours/glitch/components/icon_button'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import DropdownMenuContainer from 'themes/glitch/containers/dropdown_menu_container'; +import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container'; import { defineMessages, injectIntl } from 'react-intl'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const messages = defineMessages({ delete: { id: 'status.delete', defaultMessage: 'Delete' }, diff --git a/app/javascript/themes/glitch/features/status/components/card.js b/app/javascript/flavours/glitch/features/status/components/card.js similarity index 100% rename from app/javascript/themes/glitch/features/status/components/card.js rename to app/javascript/flavours/glitch/features/status/components/card.js diff --git a/app/javascript/themes/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js similarity index 90% rename from app/javascript/themes/glitch/features/status/components/detailed_status.js rename to app/javascript/flavours/glitch/features/status/components/detailed_status.js index 7606bfbf370..7c6f436d67d 100644 --- a/app/javascript/themes/glitch/features/status/components/detailed_status.js +++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js @@ -1,17 +1,17 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import Avatar from 'themes/glitch/components/avatar'; -import DisplayName from 'themes/glitch/components/display_name'; -import StatusContent from 'themes/glitch/components/status_content'; -import StatusGallery from 'themes/glitch/components/media_gallery'; -import AttachmentList from 'themes/glitch/components/attachment_list'; +import Avatar from 'flavours/glitch/components/avatar'; +import DisplayName from 'flavours/glitch/components/display_name'; +import StatusContent from 'flavours/glitch/components/status_content'; +import StatusGallery from 'flavours/glitch/components/media_gallery'; +import AttachmentList from 'flavours/glitch/components/attachment_list'; import { Link } from 'react-router-dom'; import { FormattedDate, FormattedNumber } from 'react-intl'; import CardContainer from '../containers/card_container'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import Video from 'themes/glitch/features/video'; -import VisibilityIcon from 'themes/glitch/components/status_visibility_icon'; +import Video from 'flavours/glitch/features/video'; +import VisibilityIcon from 'flavours/glitch/components/status_visibility_icon'; export default class DetailedStatus extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/status/containers/card_container.js b/app/javascript/flavours/glitch/features/status/containers/card_container.js similarity index 100% rename from app/javascript/themes/glitch/features/status/containers/card_container.js rename to app/javascript/flavours/glitch/features/status/containers/card_container.js diff --git a/app/javascript/themes/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js similarity index 91% rename from app/javascript/themes/glitch/features/status/index.js rename to app/javascript/flavours/glitch/features/status/index.js index 57af94a9ad1..73b212bba5d 100644 --- a/app/javascript/themes/glitch/features/status/index.js +++ b/app/javascript/flavours/glitch/features/status/index.js @@ -3,11 +3,11 @@ import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { fetchStatus } from 'themes/glitch/actions/statuses'; -import MissingIndicator from 'themes/glitch/components/missing_indicator'; +import { fetchStatus } from 'flavours/glitch/actions/statuses'; +import MissingIndicator from 'flavours/glitch/components/missing_indicator'; import DetailedStatus from './components/detailed_status'; import ActionBar from './components/action_bar'; -import Column from 'themes/glitch/features/ui/components/column'; +import Column from 'flavours/glitch/features/ui/components/column'; import { favourite, unfavourite, @@ -15,23 +15,23 @@ import { unreblog, pin, unpin, -} from 'themes/glitch/actions/interactions'; +} from 'flavours/glitch/actions/interactions'; import { replyCompose, mentionCompose, -} from 'themes/glitch/actions/compose'; -import { deleteStatus } from 'themes/glitch/actions/statuses'; -import { initReport } from 'themes/glitch/actions/reports'; -import { makeGetStatus } from 'themes/glitch/selectors'; +} from 'flavours/glitch/actions/compose'; +import { deleteStatus } from 'flavours/glitch/actions/statuses'; +import { initReport } from 'flavours/glitch/actions/reports'; +import { makeGetStatus } from 'flavours/glitch/selectors'; import { ScrollContainer } from 'react-router-scroll-4'; -import ColumnBackButton from 'themes/glitch/components/column_back_button'; -import StatusContainer from 'themes/glitch/containers/status_container'; -import { openModal } from 'themes/glitch/actions/modal'; +import ColumnBackButton from 'flavours/glitch/components/column_back_button'; +import StatusContainer from 'flavours/glitch/containers/status_container'; +import { openModal } from 'flavours/glitch/actions/modal'; import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { HotKeys } from 'react-hotkeys'; -import { boostModal, deleteModal } from 'themes/glitch/util/initial_state'; -import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'themes/glitch/util/fullscreen'; +import { boostModal, deleteModal } from 'flavours/glitch/util/initial_state'; +import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from 'flavours/glitch/util/fullscreen'; const messages = defineMessages({ deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, diff --git a/app/javascript/themes/glitch/features/ui/components/actions_modal.js b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js similarity index 86% rename from app/javascript/themes/glitch/features/ui/components/actions_modal.js rename to app/javascript/flavours/glitch/features/ui/components/actions_modal.js index 7a2b78b63d3..0873c282faf 100644 --- a/app/javascript/themes/glitch/features/ui/components/actions_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/actions_modal.js @@ -2,11 +2,11 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import StatusContent from 'themes/glitch/components/status_content'; -import Avatar from 'themes/glitch/components/avatar'; -import RelativeTimestamp from 'themes/glitch/components/relative_timestamp'; -import DisplayName from 'themes/glitch/components/display_name'; -import IconButton from 'themes/glitch/components/icon_button'; +import StatusContent from 'flavours/glitch/components/status_content'; +import Avatar from 'flavours/glitch/components/avatar'; +import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp'; +import DisplayName from 'flavours/glitch/components/display_name'; +import IconButton from 'flavours/glitch/components/icon_button'; import classNames from 'classnames'; export default class ActionsModal extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/ui/components/boost_modal.js b/app/javascript/flavours/glitch/features/ui/components/boost_modal.js similarity index 88% rename from app/javascript/themes/glitch/features/ui/components/boost_modal.js rename to app/javascript/flavours/glitch/features/ui/components/boost_modal.js index 49781db10d0..9652bcb2db0 100644 --- a/app/javascript/themes/glitch/features/ui/components/boost_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/boost_modal.js @@ -2,11 +2,11 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import Button from 'themes/glitch/components/button'; -import StatusContent from 'themes/glitch/components/status_content'; -import Avatar from 'themes/glitch/components/avatar'; -import RelativeTimestamp from 'themes/glitch/components/relative_timestamp'; -import DisplayName from 'themes/glitch/components/display_name'; +import Button from 'flavours/glitch/components/button'; +import StatusContent from 'flavours/glitch/components/status_content'; +import Avatar from 'flavours/glitch/components/avatar'; +import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp'; +import DisplayName from 'flavours/glitch/components/display_name'; import ImmutablePureComponent from 'react-immutable-pure-component'; const messages = defineMessages({ diff --git a/app/javascript/themes/glitch/features/ui/components/bundle.js b/app/javascript/flavours/glitch/features/ui/components/bundle.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/bundle.js rename to app/javascript/flavours/glitch/features/ui/components/bundle.js diff --git a/app/javascript/themes/glitch/features/ui/components/bundle_column_error.js b/app/javascript/flavours/glitch/features/ui/components/bundle_column_error.js similarity index 88% rename from app/javascript/themes/glitch/features/ui/components/bundle_column_error.js rename to app/javascript/flavours/glitch/features/ui/components/bundle_column_error.js index daedc629934..3e979a2506d 100644 --- a/app/javascript/themes/glitch/features/ui/components/bundle_column_error.js +++ b/app/javascript/flavours/glitch/features/ui/components/bundle_column_error.js @@ -4,8 +4,8 @@ import { defineMessages, injectIntl } from 'react-intl'; import Column from './column'; import ColumnHeader from './column_header'; -import ColumnBackButtonSlim from 'themes/glitch/components/column_back_button_slim'; -import IconButton from 'themes/glitch/components/icon_button'; +import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim'; +import IconButton from 'flavours/glitch/components/icon_button'; const messages = defineMessages({ title: { id: 'bundle_column_error.title', defaultMessage: 'Network error' }, diff --git a/app/javascript/themes/glitch/features/ui/components/bundle_modal_error.js b/app/javascript/flavours/glitch/features/ui/components/bundle_modal_error.js similarity index 95% rename from app/javascript/themes/glitch/features/ui/components/bundle_modal_error.js rename to app/javascript/flavours/glitch/features/ui/components/bundle_modal_error.js index 8cca32ae9a6..2c14a1e5c3a 100644 --- a/app/javascript/themes/glitch/features/ui/components/bundle_modal_error.js +++ b/app/javascript/flavours/glitch/features/ui/components/bundle_modal_error.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { defineMessages, injectIntl } from 'react-intl'; -import IconButton from 'themes/glitch/components/icon_button'; +import IconButton from 'flavours/glitch/components/icon_button'; const messages = defineMessages({ error: { id: 'bundle_modal_error.message', defaultMessage: 'Something went wrong while loading this component.' }, diff --git a/app/javascript/themes/glitch/features/ui/components/column.js b/app/javascript/flavours/glitch/features/ui/components/column.js similarity index 93% rename from app/javascript/themes/glitch/features/ui/components/column.js rename to app/javascript/flavours/glitch/features/ui/components/column.js index 73a5bc15e5e..ab78414e056 100644 --- a/app/javascript/themes/glitch/features/ui/components/column.js +++ b/app/javascript/flavours/glitch/features/ui/components/column.js @@ -2,8 +2,8 @@ import React from 'react'; import ColumnHeader from './column_header'; import PropTypes from 'prop-types'; import { debounce } from 'lodash'; -import { scrollTop } from 'themes/glitch/util/scroll'; -import { isMobile } from 'themes/glitch/util/is_mobile'; +import { scrollTop } from 'flavours/glitch/util/scroll'; +import { isMobile } from 'flavours/glitch/util/is_mobile'; export default class Column extends React.PureComponent { diff --git a/app/javascript/themes/glitch/features/ui/components/column_header.js b/app/javascript/flavours/glitch/features/ui/components/column_header.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/column_header.js rename to app/javascript/flavours/glitch/features/ui/components/column_header.js diff --git a/app/javascript/themes/glitch/features/ui/components/column_link.js b/app/javascript/flavours/glitch/features/ui/components/column_link.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/column_link.js rename to app/javascript/flavours/glitch/features/ui/components/column_link.js diff --git a/app/javascript/themes/glitch/features/ui/components/column_loading.js b/app/javascript/flavours/glitch/features/ui/components/column_loading.js similarity index 83% rename from app/javascript/themes/glitch/features/ui/components/column_loading.js rename to app/javascript/flavours/glitch/features/ui/components/column_loading.js index 75f26218ad0..ba2d0824efe 100644 --- a/app/javascript/themes/glitch/features/ui/components/column_loading.js +++ b/app/javascript/flavours/glitch/features/ui/components/column_loading.js @@ -1,8 +1,8 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Column from 'themes/glitch/components/column'; -import ColumnHeader from 'themes/glitch/components/column_header'; +import Column from 'flavours/glitch/components/column'; +import ColumnHeader from 'flavours/glitch/components/column_header'; import ImmutablePureComponent from 'react-immutable-pure-component'; export default class ColumnLoading extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/ui/components/column_subheading.js b/app/javascript/flavours/glitch/features/ui/components/column_subheading.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/column_subheading.js rename to app/javascript/flavours/glitch/features/ui/components/column_subheading.js diff --git a/app/javascript/themes/glitch/features/ui/components/columns_area.js b/app/javascript/flavours/glitch/features/ui/components/columns_area.js similarity index 98% rename from app/javascript/themes/glitch/features/ui/components/columns_area.js rename to app/javascript/flavours/glitch/features/ui/components/columns_area.js index 4529503633b..264f60724da 100644 --- a/app/javascript/themes/glitch/features/ui/components/columns_area.js +++ b/app/javascript/flavours/glitch/features/ui/components/columns_area.js @@ -11,10 +11,10 @@ import BundleContainer from '../containers/bundle_container'; import ColumnLoading from './column_loading'; import DrawerLoading from './drawer_loading'; import BundleColumnError from './bundle_column_error'; -import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses } from 'themes/glitch/util/async-components'; +import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses } from 'flavours/glitch/util/async-components'; import detectPassiveEvents from 'detect-passive-events'; -import { scrollRight } from 'themes/glitch/util/scroll'; +import { scrollRight } from 'flavours/glitch/util/scroll'; const componentMap = { 'COMPOSE': Compose, diff --git a/app/javascript/themes/glitch/features/ui/components/confirmation_modal.js b/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js similarity index 95% rename from app/javascript/themes/glitch/features/ui/components/confirmation_modal.js rename to app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js index 3d568aec37e..d4d1e587ee2 100644 --- a/app/javascript/themes/glitch/features/ui/components/confirmation_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { injectIntl, FormattedMessage } from 'react-intl'; -import Button from 'themes/glitch/components/button'; +import Button from 'flavours/glitch/components/button'; @injectIntl export default class ConfirmationModal extends React.PureComponent { diff --git a/app/javascript/themes/glitch/features/ui/components/doodle_modal.js b/app/javascript/flavours/glitch/features/ui/components/doodle_modal.js similarity index 98% rename from app/javascript/themes/glitch/features/ui/components/doodle_modal.js rename to app/javascript/flavours/glitch/features/ui/components/doodle_modal.js index 819656dbf23..9c74451b3ea 100644 --- a/app/javascript/themes/glitch/features/ui/components/doodle_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/doodle_modal.js @@ -1,12 +1,12 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Button from 'themes/glitch/components/button'; +import Button from 'flavours/glitch/components/button'; import ImmutablePureComponent from 'react-immutable-pure-component'; import Atrament from 'atrament'; // the doodling library import { connect } from 'react-redux'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { doodleSet, uploadCompose } from 'themes/glitch/actions/compose'; -import IconButton from 'themes/glitch/components/icon_button'; +import { doodleSet, uploadCompose } from 'flavours/glitch/actions/compose'; +import IconButton from 'flavours/glitch/components/icon_button'; import { debounce, mapValues } from 'lodash'; import classNames from 'classnames'; diff --git a/app/javascript/themes/glitch/features/ui/components/drawer_loading.js b/app/javascript/flavours/glitch/features/ui/components/drawer_loading.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/drawer_loading.js rename to app/javascript/flavours/glitch/features/ui/components/drawer_loading.js diff --git a/app/javascript/themes/glitch/features/ui/components/embed_modal.js b/app/javascript/flavours/glitch/features/ui/components/embed_modal.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/embed_modal.js rename to app/javascript/flavours/glitch/features/ui/components/embed_modal.js diff --git a/app/javascript/themes/glitch/features/ui/components/image_loader.js b/app/javascript/flavours/glitch/features/ui/components/image_loader.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/components/image_loader.js rename to app/javascript/flavours/glitch/features/ui/components/image_loader.js diff --git a/app/javascript/themes/glitch/features/ui/components/media_modal.js b/app/javascript/flavours/glitch/features/ui/components/media_modal.js similarity index 96% rename from app/javascript/themes/glitch/features/ui/components/media_modal.js rename to app/javascript/flavours/glitch/features/ui/components/media_modal.js index 1dad972b2e3..e56147c5bcb 100644 --- a/app/javascript/themes/glitch/features/ui/components/media_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/media_modal.js @@ -2,9 +2,9 @@ import React from 'react'; import ReactSwipeableViews from 'react-swipeable-views'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import ExtendedVideoPlayer from 'themes/glitch/components/extended_video_player'; +import ExtendedVideoPlayer from 'flavours/glitch/components/extended_video_player'; import { defineMessages, injectIntl } from 'react-intl'; -import IconButton from 'themes/glitch/components/icon_button'; +import IconButton from 'flavours/glitch/components/icon_button'; import ImmutablePureComponent from 'react-immutable-pure-component'; import ImageLoader from './image_loader'; diff --git a/app/javascript/themes/glitch/features/ui/components/modal_loading.js b/app/javascript/flavours/glitch/features/ui/components/modal_loading.js similarity index 86% rename from app/javascript/themes/glitch/features/ui/components/modal_loading.js rename to app/javascript/flavours/glitch/features/ui/components/modal_loading.js index e14d20fbb2f..b1c32215414 100644 --- a/app/javascript/themes/glitch/features/ui/components/modal_loading.js +++ b/app/javascript/flavours/glitch/features/ui/components/modal_loading.js @@ -1,6 +1,6 @@ import React from 'react'; -import LoadingIndicator from 'themes/glitch/components/loading_indicator'; +import LoadingIndicator from 'flavours/glitch/components/loading_indicator'; // Keep the markup in sync with // (make sure they have the same dimensions) diff --git a/app/javascript/themes/glitch/features/ui/components/modal_root.js b/app/javascript/flavours/glitch/features/ui/components/modal_root.js similarity index 98% rename from app/javascript/themes/glitch/features/ui/components/modal_root.js rename to app/javascript/flavours/glitch/features/ui/components/modal_root.js index fbe7941708d..61b2392839d 100644 --- a/app/javascript/themes/glitch/features/ui/components/modal_root.js +++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.js @@ -15,7 +15,7 @@ import { ReportModal, SettingsModal, EmbedModal, -} from 'themes/glitch/util/async-components'; +} from 'flavours/glitch/util/async-components'; const MODAL_COMPONENTS = { 'MEDIA': () => Promise.resolve({ default: MediaModal }), diff --git a/app/javascript/themes/glitch/features/ui/components/mute_modal.js b/app/javascript/flavours/glitch/features/ui/components/mute_modal.js similarity index 91% rename from app/javascript/themes/glitch/features/ui/components/mute_modal.js rename to app/javascript/flavours/glitch/features/ui/components/mute_modal.js index ffccdc84d36..0202b1ab13e 100644 --- a/app/javascript/themes/glitch/features/ui/components/mute_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/mute_modal.js @@ -3,10 +3,10 @@ import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import { injectIntl, FormattedMessage } from 'react-intl'; import Toggle from 'react-toggle'; -import Button from 'themes/glitch/components/button'; -import { closeModal } from 'themes/glitch/actions/modal'; -import { muteAccount } from 'themes/glitch/actions/accounts'; -import { toggleHideNotifications } from 'themes/glitch/actions/mutes'; +import Button from 'flavours/glitch/components/button'; +import { closeModal } from 'flavours/glitch/actions/modal'; +import { muteAccount } from 'flavours/glitch/actions/accounts'; +import { toggleHideNotifications } from 'flavours/glitch/actions/mutes'; const mapStateToProps = state => { diff --git a/app/javascript/themes/glitch/features/ui/components/onboarding_modal.js b/app/javascript/flavours/glitch/features/ui/components/onboarding_modal.js similarity index 97% rename from app/javascript/themes/glitch/features/ui/components/onboarding_modal.js rename to app/javascript/flavours/glitch/features/ui/components/onboarding_modal.js index 58875262ef7..21f1addea5e 100644 --- a/app/javascript/themes/glitch/features/ui/components/onboarding_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/onboarding_modal.js @@ -5,16 +5,16 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ReactSwipeableViews from 'react-swipeable-views'; import classNames from 'classnames'; -import Permalink from 'themes/glitch/components/permalink'; -import ComposeForm from 'themes/glitch/features/compose/components/compose_form'; -import Search from 'themes/glitch/features/compose/components/search'; -import NavigationBar from 'themes/glitch/features/compose/components/navigation_bar'; +import Permalink from 'flavours/glitch/components/permalink'; +import ComposeForm from 'flavours/glitch/features/compose/components/compose_form'; +import Search from 'flavours/glitch/features/compose/components/search'; +import NavigationBar from 'flavours/glitch/features/compose/components/navigation_bar'; import ColumnHeader from './column_header'; import { List as ImmutableList, Map as ImmutableMap, } from 'immutable'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const noop = () => { }; diff --git a/app/javascript/themes/glitch/features/ui/components/report_modal.js b/app/javascript/flavours/glitch/features/ui/components/report_modal.js similarity index 89% rename from app/javascript/themes/glitch/features/ui/components/report_modal.js rename to app/javascript/flavours/glitch/features/ui/components/report_modal.js index e6153948ece..b4dc1e3d61f 100644 --- a/app/javascript/themes/glitch/features/ui/components/report_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/report_modal.js @@ -1,15 +1,15 @@ import React from 'react'; import { connect } from 'react-redux'; -import { changeReportComment, submitReport } from 'themes/glitch/actions/reports'; -import { refreshAccountTimeline } from 'themes/glitch/actions/timelines'; +import { changeReportComment, submitReport } from 'flavours/glitch/actions/reports'; +import { refreshAccountTimeline } from 'flavours/glitch/actions/timelines'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { makeGetAccount } from 'themes/glitch/selectors'; +import { makeGetAccount } from 'flavours/glitch/selectors'; import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; -import StatusCheckBox from 'themes/glitch/features/report/containers/status_check_box_container'; +import StatusCheckBox from 'flavours/glitch/features/report/containers/status_check_box_container'; import { OrderedSet } from 'immutable'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import Button from 'themes/glitch/components/button'; +import Button from 'flavours/glitch/components/button'; const messages = defineMessages({ placeholder: { id: 'report.placeholder', defaultMessage: 'Additional comments' }, diff --git a/app/javascript/themes/glitch/features/ui/components/tabs_bar.js b/app/javascript/flavours/glitch/features/ui/components/tabs_bar.js similarity index 98% rename from app/javascript/themes/glitch/features/ui/components/tabs_bar.js rename to app/javascript/flavours/glitch/features/ui/components/tabs_bar.js index ef5deae992d..89b455dd879 100644 --- a/app/javascript/themes/glitch/features/ui/components/tabs_bar.js +++ b/app/javascript/flavours/glitch/features/ui/components/tabs_bar.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import { NavLink } from 'react-router-dom'; import { FormattedMessage, injectIntl } from 'react-intl'; import { debounce } from 'lodash'; -import { isUserTouching } from 'themes/glitch/util/is_mobile'; +import { isUserTouching } from 'flavours/glitch/util/is_mobile'; export const links = [ , diff --git a/app/javascript/themes/glitch/features/ui/components/upload_area.js b/app/javascript/flavours/glitch/features/ui/components/upload_area.js similarity index 96% rename from app/javascript/themes/glitch/features/ui/components/upload_area.js rename to app/javascript/flavours/glitch/features/ui/components/upload_area.js index 72a450215c5..cc6b6d17136 100644 --- a/app/javascript/themes/glitch/features/ui/components/upload_area.js +++ b/app/javascript/flavours/glitch/features/ui/components/upload_area.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Motion from 'themes/glitch/util/optional_motion'; +import Motion from 'flavours/glitch/util/optional_motion'; import spring from 'react-motion/lib/spring'; import { FormattedMessage } from 'react-intl'; diff --git a/app/javascript/themes/glitch/features/ui/components/video_modal.js b/app/javascript/flavours/glitch/features/ui/components/video_modal.js similarity index 94% rename from app/javascript/themes/glitch/features/ui/components/video_modal.js rename to app/javascript/flavours/glitch/features/ui/components/video_modal.js index 91168c79079..22fa998fb36 100644 --- a/app/javascript/themes/glitch/features/ui/components/video_modal.js +++ b/app/javascript/flavours/glitch/features/ui/components/video_modal.js @@ -1,7 +1,7 @@ import React from 'react'; import ImmutablePropTypes from 'react-immutable-proptypes'; import PropTypes from 'prop-types'; -import Video from 'themes/glitch/features/video'; +import Video from 'flavours/glitch/features/video'; import ImmutablePureComponent from 'react-immutable-pure-component'; export default class VideoModal extends ImmutablePureComponent { diff --git a/app/javascript/themes/glitch/features/ui/containers/bundle_container.js b/app/javascript/flavours/glitch/features/ui/containers/bundle_container.js similarity index 91% rename from app/javascript/themes/glitch/features/ui/containers/bundle_container.js rename to app/javascript/flavours/glitch/features/ui/containers/bundle_container.js index e6f9afcf714..c9086c9bca1 100644 --- a/app/javascript/themes/glitch/features/ui/containers/bundle_container.js +++ b/app/javascript/flavours/glitch/features/ui/containers/bundle_container.js @@ -2,7 +2,7 @@ import { connect } from 'react-redux'; import Bundle from '../components/bundle'; -import { fetchBundleRequest, fetchBundleSuccess, fetchBundleFail } from 'themes/glitch/actions/bundles'; +import { fetchBundleRequest, fetchBundleSuccess, fetchBundleFail } from 'flavours/glitch/actions/bundles'; const mapDispatchToProps = dispatch => ({ onFetch () { diff --git a/app/javascript/themes/glitch/features/ui/containers/columns_area_container.js b/app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/containers/columns_area_container.js rename to app/javascript/flavours/glitch/features/ui/containers/columns_area_container.js diff --git a/app/javascript/themes/glitch/features/ui/containers/loading_bar_container.js b/app/javascript/flavours/glitch/features/ui/containers/loading_bar_container.js similarity index 100% rename from app/javascript/themes/glitch/features/ui/containers/loading_bar_container.js rename to app/javascript/flavours/glitch/features/ui/containers/loading_bar_container.js diff --git a/app/javascript/themes/glitch/features/ui/containers/modal_container.js b/app/javascript/flavours/glitch/features/ui/containers/modal_container.js similarity index 86% rename from app/javascript/themes/glitch/features/ui/containers/modal_container.js rename to app/javascript/flavours/glitch/features/ui/containers/modal_container.js index c26f19886b8..f074002e44e 100644 --- a/app/javascript/themes/glitch/features/ui/containers/modal_container.js +++ b/app/javascript/flavours/glitch/features/ui/containers/modal_container.js @@ -1,5 +1,5 @@ import { connect } from 'react-redux'; -import { closeModal } from 'themes/glitch/actions/modal'; +import { closeModal } from 'flavours/glitch/actions/modal'; import ModalRoot from '../components/modal_root'; const mapStateToProps = state => ({ diff --git a/app/javascript/themes/glitch/features/ui/containers/notifications_container.js b/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js similarity index 76% rename from app/javascript/themes/glitch/features/ui/containers/notifications_container.js rename to app/javascript/flavours/glitch/features/ui/containers/notifications_container.js index 5bd4017f5f8..88d482bcf2e 100644 --- a/app/javascript/themes/glitch/features/ui/containers/notifications_container.js +++ b/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js @@ -1,7 +1,7 @@ import { connect } from 'react-redux'; import { NotificationStack } from 'react-notification'; -import { dismissAlert } from 'themes/glitch/actions/alerts'; -import { getAlerts } from 'themes/glitch/selectors'; +import { dismissAlert } from 'flavours/glitch/actions/alerts'; +import { getAlerts } from 'flavours/glitch/selectors'; const mapStateToProps = state => ({ notifications: getAlerts(state), diff --git a/app/javascript/themes/glitch/features/ui/containers/status_list_container.js b/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js similarity index 92% rename from app/javascript/themes/glitch/features/ui/containers/status_list_container.js rename to app/javascript/flavours/glitch/features/ui/containers/status_list_container.js index 807c82e16b5..69508f9ff5d 100644 --- a/app/javascript/themes/glitch/features/ui/containers/status_list_container.js +++ b/app/javascript/flavours/glitch/features/ui/containers/status_list_container.js @@ -1,10 +1,10 @@ import { connect } from 'react-redux'; -import StatusList from 'themes/glitch/components/status_list'; -import { scrollTopTimeline } from 'themes/glitch/actions/timelines'; +import StatusList from 'flavours/glitch/components/status_list'; +import { scrollTopTimeline } from 'flavours/glitch/actions/timelines'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; import { createSelector } from 'reselect'; import { debounce } from 'lodash'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; const makeGetStatusIds = () => createSelector([ (state, { type }) => state.getIn(['settings', type], ImmutableMap()), diff --git a/app/javascript/themes/glitch/features/ui/index.js b/app/javascript/flavours/glitch/features/ui/index.js similarity index 96% rename from app/javascript/themes/glitch/features/ui/index.js rename to app/javascript/flavours/glitch/features/ui/index.js index b59a2e63705..620630faf0a 100644 --- a/app/javascript/themes/glitch/features/ui/index.js +++ b/app/javascript/flavours/glitch/features/ui/index.js @@ -6,13 +6,13 @@ import TabsBar from './components/tabs_bar'; import ModalContainer from './containers/modal_container'; import { connect } from 'react-redux'; import { Redirect, withRouter } from 'react-router-dom'; -import { isMobile } from 'themes/glitch/util/is_mobile'; +import { isMobile } from 'flavours/glitch/util/is_mobile'; import { debounce } from 'lodash'; -import { uploadCompose, resetCompose } from 'themes/glitch/actions/compose'; -import { refreshHomeTimeline } from 'themes/glitch/actions/timelines'; -import { refreshNotifications } from 'themes/glitch/actions/notifications'; -import { clearHeight } from 'themes/glitch/actions/height_cache'; -import { WrappedSwitch, WrappedRoute } from 'themes/glitch/util/react_router_helpers'; +import { uploadCompose, resetCompose } from 'flavours/glitch/actions/compose'; +import { refreshHomeTimeline } from 'flavours/glitch/actions/timelines'; +import { refreshNotifications } from 'flavours/glitch/actions/notifications'; +import { clearHeight } from 'flavours/glitch/actions/height_cache'; +import { WrappedSwitch, WrappedRoute } from 'flavours/glitch/util/react_router_helpers'; import UploadArea from './components/upload_area'; import ColumnsAreaContainer from './containers/columns_area_container'; import classNames from 'classnames'; @@ -38,9 +38,9 @@ import { Blocks, Mutes, PinnedStatuses, -} from 'themes/glitch/util/async-components'; +} from 'flavours/glitch/util/async-components'; import { HotKeys } from 'react-hotkeys'; -import { me } from 'themes/glitch/util/initial_state'; +import { me } from 'flavours/glitch/util/initial_state'; import { defineMessages, injectIntl } from 'react-intl'; // Dummy import, to make sure that ends up in the application bundle. diff --git a/app/javascript/themes/glitch/features/video/index.js b/app/javascript/flavours/glitch/features/video/index.js similarity index 99% rename from app/javascript/themes/glitch/features/video/index.js rename to app/javascript/flavours/glitch/features/video/index.js index 0ecbe37c9d6..97c1c27fab7 100644 --- a/app/javascript/themes/glitch/features/video/index.js +++ b/app/javascript/flavours/glitch/features/video/index.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { throttle } from 'lodash'; import classNames from 'classnames'; -import { isFullscreen, requestFullscreen, exitFullscreen } from 'themes/glitch/util/fullscreen'; +import { isFullscreen, requestFullscreen, exitFullscreen } from 'flavours/glitch/util/fullscreen'; const messages = defineMessages({ play: { id: 'video.play', defaultMessage: 'Play' }, diff --git a/app/javascript/themes/glitch/middleware/errors.js b/app/javascript/flavours/glitch/middleware/errors.js similarity index 92% rename from app/javascript/themes/glitch/middleware/errors.js rename to app/javascript/flavours/glitch/middleware/errors.js index c54e7b0a281..f3dfc8b069e 100644 --- a/app/javascript/themes/glitch/middleware/errors.js +++ b/app/javascript/flavours/glitch/middleware/errors.js @@ -1,4 +1,4 @@ -import { showAlert } from 'themes/glitch/actions/alerts'; +import { showAlert } from 'flavours/glitch/actions/alerts'; const defaultFailSuffix = 'FAIL'; diff --git a/app/javascript/themes/glitch/middleware/loading_bar.js b/app/javascript/flavours/glitch/middleware/loading_bar.js similarity index 100% rename from app/javascript/themes/glitch/middleware/loading_bar.js rename to app/javascript/flavours/glitch/middleware/loading_bar.js diff --git a/app/javascript/themes/glitch/middleware/sounds.js b/app/javascript/flavours/glitch/middleware/sounds.js similarity index 100% rename from app/javascript/themes/glitch/middleware/sounds.js rename to app/javascript/flavours/glitch/middleware/sounds.js diff --git a/app/javascript/themes/glitch/packs/about.js b/app/javascript/flavours/glitch/packs/about.js similarity index 67% rename from app/javascript/themes/glitch/packs/about.js rename to app/javascript/flavours/glitch/packs/about.js index 9639d5453ae..bc0a4887bb1 100644 --- a/app/javascript/themes/glitch/packs/about.js +++ b/app/javascript/flavours/glitch/packs/about.js @@ -1,7 +1,7 @@ -import loadPolyfills from 'themes/glitch/util/load_polyfills'; +import loadPolyfills from 'flavours/glitch/util/load_polyfills'; function loaded() { - const TimelineContainer = require('themes/glitch/containers/timeline_container').default; + const TimelineContainer = require('flavours/glitch/containers/timeline_container').default; const React = require('react'); const ReactDOM = require('react-dom'); const mountNode = document.getElementById('mastodon-timeline'); @@ -13,7 +13,7 @@ function loaded() { } function main() { - const ready = require('themes/glitch/util/ready').default; + const ready = require('flavours/glitch/util/ready').default; ready(loaded); } diff --git a/app/javascript/flavours/glitch/packs/common.js b/app/javascript/flavours/glitch/packs/common.js new file mode 100644 index 00000000000..07445d2b3ff --- /dev/null +++ b/app/javascript/flavours/glitch/packs/common.js @@ -0,0 +1 @@ +import 'flavours/glitch/styles/index.scss'; diff --git a/app/javascript/flavours/glitch/packs/home.js b/app/javascript/flavours/glitch/packs/home.js new file mode 100644 index 00000000000..b8f7b7d8efd --- /dev/null +++ b/app/javascript/flavours/glitch/packs/home.js @@ -0,0 +1,7 @@ +import loadPolyfills from 'flavours/glitch/util/load_polyfills'; + +loadPolyfills().then(() => { + require('flavours/glitch/util/main').default(); +}).catch(e => { + console.error(e); +}); diff --git a/app/javascript/themes/glitch/packs/public.js b/app/javascript/flavours/glitch/packs/public.js similarity index 85% rename from app/javascript/themes/glitch/packs/public.js rename to app/javascript/flavours/glitch/packs/public.js index 410e66716b2..9ea82b53aa2 100644 --- a/app/javascript/themes/glitch/packs/public.js +++ b/app/javascript/flavours/glitch/packs/public.js @@ -1,14 +1,14 @@ -import loadPolyfills from 'themes/glitch/util/load_polyfills'; -import ready from 'themes/glitch/util/ready'; +import loadPolyfills from 'flavours/glitch/util/load_polyfills'; +import ready from 'flavours/glitch/util/ready'; function main() { const IntlRelativeFormat = require('intl-relativeformat').default; - const emojify = require('themes/glitch/util/emoji').default; + const emojify = require('flavours/glitch/util/emoji').default; const { getLocale } = require('locales'); const { localeData } = getLocale(); - const VideoContainer = require('themes/glitch/containers/video_container').default; - const MediaGalleryContainer = require('themes/glitch/containers/media_gallery_container').default; - const CardContainer = require('themes/glitch/containers/card_container').default; + const VideoContainer = require('flavours/glitch/containers/video_container').default; + const MediaGalleryContainer = require('flavours/glitch/containers/media_gallery_container').default; + const CardContainer = require('flavours/glitch/containers/card_container').default; const React = require('react'); const ReactDOM = require('react-dom'); diff --git a/app/javascript/themes/glitch/packs/share.js b/app/javascript/flavours/glitch/packs/share.js similarity index 66% rename from app/javascript/themes/glitch/packs/share.js rename to app/javascript/flavours/glitch/packs/share.js index dc2e677e4f1..9f2aa255397 100644 --- a/app/javascript/themes/glitch/packs/share.js +++ b/app/javascript/flavours/glitch/packs/share.js @@ -1,7 +1,7 @@ -import loadPolyfills from 'themes/glitch/util/load_polyfills'; +import loadPolyfills from 'flavours/glitch/util/load_polyfills'; function loaded() { - const ComposeContainer = require('themes/glitch/containers/compose_container').default; + const ComposeContainer = require('flavours/glitch/containers/compose_container').default; const React = require('react'); const ReactDOM = require('react-dom'); const mountNode = document.getElementById('mastodon-compose'); @@ -13,7 +13,7 @@ function loaded() { } function main() { - const ready = require('themes/glitch/util/ready').default; + const ready = require('flavours/glitch/util/ready').default; ready(loaded); } diff --git a/app/javascript/themes/glitch/reducers/accounts.js b/app/javascript/flavours/glitch/reducers/accounts.js similarity index 85% rename from app/javascript/themes/glitch/reducers/accounts.js rename to app/javascript/flavours/glitch/reducers/accounts.js index 0a65d3723c9..5113a281aa5 100644 --- a/app/javascript/themes/glitch/reducers/accounts.js +++ b/app/javascript/flavours/glitch/reducers/accounts.js @@ -6,16 +6,16 @@ import { FOLLOWING_EXPAND_SUCCESS, FOLLOW_REQUESTS_FETCH_SUCCESS, FOLLOW_REQUESTS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { BLOCKS_FETCH_SUCCESS, BLOCKS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/blocks'; +} from 'flavours/glitch/actions/blocks'; import { MUTES_FETCH_SUCCESS, MUTES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/mutes'; -import { COMPOSE_SUGGESTIONS_READY } from 'themes/glitch/actions/compose'; +} from 'flavours/glitch/actions/mutes'; +import { COMPOSE_SUGGESTIONS_READY } from 'flavours/glitch/actions/compose'; import { REBLOG_SUCCESS, UNREBLOG_SUCCESS, @@ -23,28 +23,28 @@ import { UNFAVOURITE_SUCCESS, REBLOGS_FETCH_SUCCESS, FAVOURITES_FETCH_SUCCESS, -} from 'themes/glitch/actions/interactions'; +} from 'flavours/glitch/actions/interactions'; import { TIMELINE_REFRESH_SUCCESS, TIMELINE_UPDATE, TIMELINE_EXPAND_SUCCESS, -} from 'themes/glitch/actions/timelines'; +} from 'flavours/glitch/actions/timelines'; import { STATUS_FETCH_SUCCESS, CONTEXT_FETCH_SUCCESS, -} from 'themes/glitch/actions/statuses'; -import { SEARCH_FETCH_SUCCESS } from 'themes/glitch/actions/search'; +} from 'flavours/glitch/actions/statuses'; +import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search'; import { NOTIFICATIONS_UPDATE, NOTIFICATIONS_REFRESH_SUCCESS, NOTIFICATIONS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/notifications'; +} from 'flavours/glitch/actions/notifications'; import { FAVOURITED_STATUSES_FETCH_SUCCESS, FAVOURITED_STATUSES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/favourites'; -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; -import emojify from 'themes/glitch/util/emoji'; +} from 'flavours/glitch/actions/favourites'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; +import emojify from 'flavours/glitch/util/emoji'; import { Map as ImmutableMap, fromJS } from 'immutable'; import escapeTextContentForBrowser from 'escape-html'; diff --git a/app/javascript/themes/glitch/reducers/accounts_counters.js b/app/javascript/flavours/glitch/reducers/accounts_counters.js similarity index 87% rename from app/javascript/themes/glitch/reducers/accounts_counters.js rename to app/javascript/flavours/glitch/reducers/accounts_counters.js index e3728ecd7d7..a9aebd26fce 100644 --- a/app/javascript/themes/glitch/reducers/accounts_counters.js +++ b/app/javascript/flavours/glitch/reducers/accounts_counters.js @@ -8,16 +8,16 @@ import { FOLLOW_REQUESTS_EXPAND_SUCCESS, ACCOUNT_FOLLOW_SUCCESS, ACCOUNT_UNFOLLOW_SUCCESS, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { BLOCKS_FETCH_SUCCESS, BLOCKS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/blocks'; +} from 'flavours/glitch/actions/blocks'; import { MUTES_FETCH_SUCCESS, MUTES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/mutes'; -import { COMPOSE_SUGGESTIONS_READY } from 'themes/glitch/actions/compose'; +} from 'flavours/glitch/actions/mutes'; +import { COMPOSE_SUGGESTIONS_READY } from 'flavours/glitch/actions/compose'; import { REBLOG_SUCCESS, UNREBLOG_SUCCESS, @@ -25,27 +25,27 @@ import { UNFAVOURITE_SUCCESS, REBLOGS_FETCH_SUCCESS, FAVOURITES_FETCH_SUCCESS, -} from 'themes/glitch/actions/interactions'; +} from 'flavours/glitch/actions/interactions'; import { TIMELINE_REFRESH_SUCCESS, TIMELINE_UPDATE, TIMELINE_EXPAND_SUCCESS, -} from 'themes/glitch/actions/timelines'; +} from 'flavours/glitch/actions/timelines'; import { STATUS_FETCH_SUCCESS, CONTEXT_FETCH_SUCCESS, -} from 'themes/glitch/actions/statuses'; -import { SEARCH_FETCH_SUCCESS } from 'themes/glitch/actions/search'; +} from 'flavours/glitch/actions/statuses'; +import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search'; import { NOTIFICATIONS_UPDATE, NOTIFICATIONS_REFRESH_SUCCESS, NOTIFICATIONS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/notifications'; +} from 'flavours/glitch/actions/notifications'; import { FAVOURITED_STATUSES_FETCH_SUCCESS, FAVOURITED_STATUSES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/favourites'; -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; +} from 'flavours/glitch/actions/favourites'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; import { Map as ImmutableMap, fromJS } from 'immutable'; const normalizeAccount = (state, account) => state.set(account.id, fromJS({ diff --git a/app/javascript/themes/glitch/reducers/alerts.js b/app/javascript/flavours/glitch/reducers/alerts.js similarity index 93% rename from app/javascript/themes/glitch/reducers/alerts.js rename to app/javascript/flavours/glitch/reducers/alerts.js index ad66b63f689..50f8d30f71c 100644 --- a/app/javascript/themes/glitch/reducers/alerts.js +++ b/app/javascript/flavours/glitch/reducers/alerts.js @@ -2,7 +2,7 @@ import { ALERT_SHOW, ALERT_DISMISS, ALERT_CLEAR, -} from 'themes/glitch/actions/alerts'; +} from 'flavours/glitch/actions/alerts'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; const initialState = ImmutableList([]); diff --git a/app/javascript/themes/glitch/reducers/cards.js b/app/javascript/flavours/glitch/reducers/cards.js similarity index 80% rename from app/javascript/themes/glitch/reducers/cards.js rename to app/javascript/flavours/glitch/reducers/cards.js index 35be30444f2..92ecfd08639 100644 --- a/app/javascript/themes/glitch/reducers/cards.js +++ b/app/javascript/flavours/glitch/reducers/cards.js @@ -1,4 +1,4 @@ -import { STATUS_CARD_FETCH_SUCCESS } from 'themes/glitch/actions/cards'; +import { STATUS_CARD_FETCH_SUCCESS } from 'flavours/glitch/actions/cards'; import { Map as ImmutableMap, fromJS } from 'immutable'; diff --git a/app/javascript/themes/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js similarity index 97% rename from app/javascript/themes/glitch/reducers/compose.js rename to app/javascript/flavours/glitch/reducers/compose.js index be359fcb425..aaa36b69611 100644 --- a/app/javascript/themes/glitch/reducers/compose.js +++ b/app/javascript/flavours/glitch/reducers/compose.js @@ -28,12 +28,12 @@ import { COMPOSE_UPLOAD_CHANGE_FAIL, COMPOSE_DOODLE_SET, COMPOSE_RESET, -} from 'themes/glitch/actions/compose'; -import { TIMELINE_DELETE } from 'themes/glitch/actions/timelines'; -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; +} from 'flavours/glitch/actions/compose'; +import { TIMELINE_DELETE } from 'flavours/glitch/actions/timelines'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable'; -import uuid from 'themes/glitch/util/uuid'; -import { me } from 'themes/glitch/util/initial_state'; +import uuid from 'flavours/glitch/util/uuid'; +import { me } from 'flavours/glitch/util/initial_state'; const initialState = ImmutableMap({ mounted: false, diff --git a/app/javascript/themes/glitch/reducers/contexts.js b/app/javascript/flavours/glitch/reducers/contexts.js similarity index 91% rename from app/javascript/themes/glitch/reducers/contexts.js rename to app/javascript/flavours/glitch/reducers/contexts.js index 56c930bd5b5..53e93a5892b 100644 --- a/app/javascript/themes/glitch/reducers/contexts.js +++ b/app/javascript/flavours/glitch/reducers/contexts.js @@ -1,5 +1,5 @@ -import { CONTEXT_FETCH_SUCCESS } from 'themes/glitch/actions/statuses'; -import { TIMELINE_DELETE, TIMELINE_CONTEXT_UPDATE } from 'themes/glitch/actions/timelines'; +import { CONTEXT_FETCH_SUCCESS } from 'flavours/glitch/actions/statuses'; +import { TIMELINE_DELETE, TIMELINE_CONTEXT_UPDATE } from 'flavours/glitch/actions/timelines'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/custom_emojis.js b/app/javascript/flavours/glitch/reducers/custom_emojis.js similarity index 63% rename from app/javascript/themes/glitch/reducers/custom_emojis.js rename to app/javascript/flavours/glitch/reducers/custom_emojis.js index e3f1e001809..592cea8dcda 100644 --- a/app/javascript/themes/glitch/reducers/custom_emojis.js +++ b/app/javascript/flavours/glitch/reducers/custom_emojis.js @@ -1,7 +1,7 @@ import { List as ImmutableList } from 'immutable'; -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; -import { search as emojiSearch } from 'themes/glitch/util/emoji/emoji_mart_search_light'; -import { buildCustomEmojis } from 'themes/glitch/util/emoji'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; +import { search as emojiSearch } from 'flavours/glitch/util/emoji/emoji_mart_search_light'; +import { buildCustomEmojis } from 'flavours/glitch/util/emoji'; const initialState = ImmutableList(); diff --git a/app/javascript/themes/glitch/reducers/height_cache.js b/app/javascript/flavours/glitch/reducers/height_cache.js similarity index 85% rename from app/javascript/themes/glitch/reducers/height_cache.js rename to app/javascript/flavours/glitch/reducers/height_cache.js index 93c31b42c13..8b05e0b1960 100644 --- a/app/javascript/themes/glitch/reducers/height_cache.js +++ b/app/javascript/flavours/glitch/reducers/height_cache.js @@ -1,5 +1,5 @@ import { Map as ImmutableMap } from 'immutable'; -import { HEIGHT_CACHE_SET, HEIGHT_CACHE_CLEAR } from 'themes/glitch/actions/height_cache'; +import { HEIGHT_CACHE_SET, HEIGHT_CACHE_CLEAR } from 'flavours/glitch/actions/height_cache'; const initialState = ImmutableMap(); diff --git a/app/javascript/themes/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js similarity index 100% rename from app/javascript/themes/glitch/reducers/index.js rename to app/javascript/flavours/glitch/reducers/index.js diff --git a/app/javascript/themes/glitch/reducers/local_settings.js b/app/javascript/flavours/glitch/reducers/local_settings.js similarity index 88% rename from app/javascript/themes/glitch/reducers/local_settings.js rename to app/javascript/flavours/glitch/reducers/local_settings.js index b1ffa047ebd..69d98741b63 100644 --- a/app/javascript/themes/glitch/reducers/local_settings.js +++ b/app/javascript/flavours/glitch/reducers/local_settings.js @@ -2,8 +2,8 @@ import { Map as ImmutableMap } from 'immutable'; // Our imports. -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; -import { LOCAL_SETTING_CHANGE } from 'themes/glitch/actions/local_settings'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; +import { LOCAL_SETTING_CHANGE } from 'flavours/glitch/actions/local_settings'; const initialState = ImmutableMap({ layout : 'auto', diff --git a/app/javascript/themes/glitch/reducers/media_attachments.js b/app/javascript/flavours/glitch/reducers/media_attachments.js similarity index 83% rename from app/javascript/themes/glitch/reducers/media_attachments.js rename to app/javascript/flavours/glitch/reducers/media_attachments.js index 69a44639cbc..6e605857668 100644 --- a/app/javascript/themes/glitch/reducers/media_attachments.js +++ b/app/javascript/flavours/glitch/reducers/media_attachments.js @@ -1,4 +1,4 @@ -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; import { Map as ImmutableMap } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/meta.js b/app/javascript/flavours/glitch/reducers/meta.js similarity index 84% rename from app/javascript/themes/glitch/reducers/meta.js rename to app/javascript/flavours/glitch/reducers/meta.js index 2249f1d78d6..a98dc436a01 100644 --- a/app/javascript/themes/glitch/reducers/meta.js +++ b/app/javascript/flavours/glitch/reducers/meta.js @@ -1,4 +1,4 @@ -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; import { Map as ImmutableMap } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/modal.js b/app/javascript/flavours/glitch/reducers/modal.js similarity index 81% rename from app/javascript/themes/glitch/reducers/modal.js rename to app/javascript/flavours/glitch/reducers/modal.js index 97fb3120367..80bc11dda40 100644 --- a/app/javascript/themes/glitch/reducers/modal.js +++ b/app/javascript/flavours/glitch/reducers/modal.js @@ -1,4 +1,4 @@ -import { MODAL_OPEN, MODAL_CLOSE } from 'themes/glitch/actions/modal'; +import { MODAL_OPEN, MODAL_CLOSE } from 'flavours/glitch/actions/modal'; const initialState = { modalType: null, diff --git a/app/javascript/themes/glitch/reducers/mutes.js b/app/javascript/flavours/glitch/reducers/mutes.js similarity index 94% rename from app/javascript/themes/glitch/reducers/mutes.js rename to app/javascript/flavours/glitch/reducers/mutes.js index 8fe4ae0c36f..8f52a7704ab 100644 --- a/app/javascript/themes/glitch/reducers/mutes.js +++ b/app/javascript/flavours/glitch/reducers/mutes.js @@ -3,7 +3,7 @@ import Immutable from 'immutable'; import { MUTES_INIT_MODAL, MUTES_TOGGLE_HIDE_NOTIFICATIONS, -} from 'themes/glitch/actions/mutes'; +} from 'flavours/glitch/actions/mutes'; const initialState = Immutable.Map({ new: Immutable.Map({ diff --git a/app/javascript/themes/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js similarity index 97% rename from app/javascript/themes/glitch/reducers/notifications.js rename to app/javascript/flavours/glitch/reducers/notifications.js index c4f505053b6..fb2b3f54984 100644 --- a/app/javascript/themes/glitch/reducers/notifications.js +++ b/app/javascript/flavours/glitch/reducers/notifications.js @@ -14,12 +14,12 @@ import { NOTIFICATIONS_DELETE_MARKED_FAIL, NOTIFICATIONS_ENTER_CLEARING_MODE, NOTIFICATIONS_MARK_ALL_FOR_DELETE, -} from 'themes/glitch/actions/notifications'; +} from 'flavours/glitch/actions/notifications'; import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS, -} from 'themes/glitch/actions/accounts'; -import { TIMELINE_DELETE } from 'themes/glitch/actions/timelines'; +} from 'flavours/glitch/actions/accounts'; +import { TIMELINE_DELETE } from 'flavours/glitch/actions/timelines'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/push_notifications.js b/app/javascript/flavours/glitch/reducers/push_notifications.js similarity index 91% rename from app/javascript/themes/glitch/reducers/push_notifications.js rename to app/javascript/flavours/glitch/reducers/push_notifications.js index 744e4a0ebdc..f0a800d23cf 100644 --- a/app/javascript/themes/glitch/reducers/push_notifications.js +++ b/app/javascript/flavours/glitch/reducers/push_notifications.js @@ -1,5 +1,5 @@ -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; -import { SET_BROWSER_SUPPORT, SET_SUBSCRIPTION, CLEAR_SUBSCRIPTION, ALERTS_CHANGE } from 'themes/glitch/actions/push_notifications'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; +import { SET_BROWSER_SUPPORT, SET_SUBSCRIPTION, CLEAR_SUBSCRIPTION, ALERTS_CHANGE } from 'flavours/glitch/actions/push_notifications'; import Immutable from 'immutable'; const initialState = Immutable.Map({ diff --git a/app/javascript/themes/glitch/reducers/relationships.js b/app/javascript/flavours/glitch/reducers/relationships.js similarity index 93% rename from app/javascript/themes/glitch/reducers/relationships.js rename to app/javascript/flavours/glitch/reducers/relationships.js index d9135d6da88..6303089ac7a 100644 --- a/app/javascript/themes/glitch/reducers/relationships.js +++ b/app/javascript/flavours/glitch/reducers/relationships.js @@ -6,11 +6,11 @@ import { ACCOUNT_MUTE_SUCCESS, ACCOUNT_UNMUTE_SUCCESS, RELATIONSHIPS_FETCH_SUCCESS, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { DOMAIN_BLOCK_SUCCESS, DOMAIN_UNBLOCK_SUCCESS, -} from 'themes/glitch/actions/domain_blocks'; +} from 'flavours/glitch/actions/domain_blocks'; import { Map as ImmutableMap, fromJS } from 'immutable'; const normalizeRelationship = (state, relationship) => state.set(relationship.id, fromJS(relationship)); diff --git a/app/javascript/themes/glitch/reducers/reports.js b/app/javascript/flavours/glitch/reducers/reports.js similarity index 97% rename from app/javascript/themes/glitch/reducers/reports.js rename to app/javascript/flavours/glitch/reducers/reports.js index b714374eaca..c18fbcdc617 100644 --- a/app/javascript/themes/glitch/reducers/reports.js +++ b/app/javascript/flavours/glitch/reducers/reports.js @@ -6,7 +6,7 @@ import { REPORT_CANCEL, REPORT_STATUS_TOGGLE, REPORT_COMMENT_CHANGE, -} from 'themes/glitch/actions/reports'; +} from 'flavours/glitch/actions/reports'; import { Map as ImmutableMap, Set as ImmutableSet } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/search.js b/app/javascript/flavours/glitch/reducers/search.js similarity index 90% rename from app/javascript/themes/glitch/reducers/search.js rename to app/javascript/flavours/glitch/reducers/search.js index aec9e2efb20..f9bf9209802 100644 --- a/app/javascript/themes/glitch/reducers/search.js +++ b/app/javascript/flavours/glitch/reducers/search.js @@ -3,8 +3,8 @@ import { SEARCH_CLEAR, SEARCH_FETCH_SUCCESS, SEARCH_SHOW, -} from 'themes/glitch/actions/search'; -import { COMPOSE_MENTION, COMPOSE_REPLY } from 'themes/glitch/actions/compose'; +} from 'flavours/glitch/actions/search'; +import { COMPOSE_MENTION, COMPOSE_REPLY } from 'flavours/glitch/actions/compose'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/settings.js b/app/javascript/flavours/glitch/reducers/settings.js similarity index 88% rename from app/javascript/themes/glitch/reducers/settings.js rename to app/javascript/flavours/glitch/reducers/settings.js index c22bbbd8dc8..ceafbc46792 100644 --- a/app/javascript/themes/glitch/reducers/settings.js +++ b/app/javascript/flavours/glitch/reducers/settings.js @@ -1,9 +1,9 @@ -import { SETTING_CHANGE, SETTING_SAVE } from 'themes/glitch/actions/settings'; -import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE } from 'themes/glitch/actions/columns'; -import { STORE_HYDRATE } from 'themes/glitch/actions/store'; -import { EMOJI_USE } from 'themes/glitch/actions/emojis'; +import { SETTING_CHANGE, SETTING_SAVE } from 'flavours/glitch/actions/settings'; +import { COLUMN_ADD, COLUMN_REMOVE, COLUMN_MOVE } from 'flavours/glitch/actions/columns'; +import { STORE_HYDRATE } from 'flavours/glitch/actions/store'; +import { EMOJI_USE } from 'flavours/glitch/actions/emojis'; import { Map as ImmutableMap, fromJS } from 'immutable'; -import uuid from 'themes/glitch/util/uuid'; +import uuid from 'flavours/glitch/util/uuid'; const initialState = ImmutableMap({ saved: true, diff --git a/app/javascript/themes/glitch/reducers/status_lists.js b/app/javascript/flavours/glitch/reducers/status_lists.js similarity index 94% rename from app/javascript/themes/glitch/reducers/status_lists.js rename to app/javascript/flavours/glitch/reducers/status_lists.js index 8dc7d374e3b..5a3d0db0cab 100644 --- a/app/javascript/themes/glitch/reducers/status_lists.js +++ b/app/javascript/flavours/glitch/reducers/status_lists.js @@ -1,17 +1,17 @@ import { FAVOURITED_STATUSES_FETCH_SUCCESS, FAVOURITED_STATUSES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/favourites'; +} from 'flavours/glitch/actions/favourites'; import { PINNED_STATUSES_FETCH_SUCCESS, -} from 'themes/glitch/actions/pin_statuses'; +} from 'flavours/glitch/actions/pin_statuses'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; import { FAVOURITE_SUCCESS, UNFAVOURITE_SUCCESS, PIN_SUCCESS, UNPIN_SUCCESS, -} from 'themes/glitch/actions/interactions'; +} from 'flavours/glitch/actions/interactions'; const initialState = ImmutableMap({ favourites: ImmutableMap({ diff --git a/app/javascript/themes/glitch/reducers/statuses.js b/app/javascript/flavours/glitch/reducers/statuses.js similarity index 90% rename from app/javascript/themes/glitch/reducers/statuses.js rename to app/javascript/flavours/glitch/reducers/statuses.js index ef808686558..410bc013b95 100644 --- a/app/javascript/themes/glitch/reducers/statuses.js +++ b/app/javascript/flavours/glitch/reducers/statuses.js @@ -9,37 +9,37 @@ import { UNFAVOURITE_SUCCESS, PIN_SUCCESS, UNPIN_SUCCESS, -} from 'themes/glitch/actions/interactions'; +} from 'flavours/glitch/actions/interactions'; import { STATUS_FETCH_SUCCESS, CONTEXT_FETCH_SUCCESS, STATUS_MUTE_SUCCESS, STATUS_UNMUTE_SUCCESS, -} from 'themes/glitch/actions/statuses'; +} from 'flavours/glitch/actions/statuses'; import { TIMELINE_REFRESH_SUCCESS, TIMELINE_UPDATE, TIMELINE_DELETE, TIMELINE_EXPAND_SUCCESS, -} from 'themes/glitch/actions/timelines'; +} from 'flavours/glitch/actions/timelines'; import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { NOTIFICATIONS_UPDATE, NOTIFICATIONS_REFRESH_SUCCESS, NOTIFICATIONS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/notifications'; +} from 'flavours/glitch/actions/notifications'; import { FAVOURITED_STATUSES_FETCH_SUCCESS, FAVOURITED_STATUSES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/favourites'; +} from 'flavours/glitch/actions/favourites'; import { PINNED_STATUSES_FETCH_SUCCESS, -} from 'themes/glitch/actions/pin_statuses'; -import { SEARCH_FETCH_SUCCESS } from 'themes/glitch/actions/search'; -import emojify from 'themes/glitch/util/emoji'; +} from 'flavours/glitch/actions/pin_statuses'; +import { SEARCH_FETCH_SUCCESS } from 'flavours/glitch/actions/search'; +import emojify from 'flavours/glitch/util/emoji'; import { Map as ImmutableMap, fromJS } from 'immutable'; import escapeTextContentForBrowser from 'escape-html'; diff --git a/app/javascript/themes/glitch/reducers/timelines.js b/app/javascript/flavours/glitch/reducers/timelines.js similarity index 98% rename from app/javascript/themes/glitch/reducers/timelines.js rename to app/javascript/flavours/glitch/reducers/timelines.js index 7f19a18971f..679e1601eb2 100644 --- a/app/javascript/themes/glitch/reducers/timelines.js +++ b/app/javascript/flavours/glitch/reducers/timelines.js @@ -10,12 +10,12 @@ import { TIMELINE_SCROLL_TOP, TIMELINE_CONNECT, TIMELINE_DISCONNECT, -} from 'themes/glitch/actions/timelines'; +} from 'flavours/glitch/actions/timelines'; import { ACCOUNT_BLOCK_SUCCESS, ACCOUNT_MUTE_SUCCESS, ACCOUNT_UNFOLLOW_SUCCESS, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; const initialState = ImmutableMap(); diff --git a/app/javascript/themes/glitch/reducers/user_lists.js b/app/javascript/flavours/glitch/reducers/user_lists.js similarity index 95% rename from app/javascript/themes/glitch/reducers/user_lists.js rename to app/javascript/flavours/glitch/reducers/user_lists.js index 8c3a7d7480e..a4df9ec8de5 100644 --- a/app/javascript/themes/glitch/reducers/user_lists.js +++ b/app/javascript/flavours/glitch/reducers/user_lists.js @@ -7,19 +7,19 @@ import { FOLLOW_REQUESTS_EXPAND_SUCCESS, FOLLOW_REQUEST_AUTHORIZE_SUCCESS, FOLLOW_REQUEST_REJECT_SUCCESS, -} from 'themes/glitch/actions/accounts'; +} from 'flavours/glitch/actions/accounts'; import { REBLOGS_FETCH_SUCCESS, FAVOURITES_FETCH_SUCCESS, -} from 'themes/glitch/actions/interactions'; +} from 'flavours/glitch/actions/interactions'; import { BLOCKS_FETCH_SUCCESS, BLOCKS_EXPAND_SUCCESS, -} from 'themes/glitch/actions/blocks'; +} from 'flavours/glitch/actions/blocks'; import { MUTES_FETCH_SUCCESS, MUTES_EXPAND_SUCCESS, -} from 'themes/glitch/actions/mutes'; +} from 'flavours/glitch/actions/mutes'; import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; const initialState = ImmutableMap({ diff --git a/app/javascript/themes/glitch/selectors/index.js b/app/javascript/flavours/glitch/selectors/index.js similarity index 100% rename from app/javascript/themes/glitch/selectors/index.js rename to app/javascript/flavours/glitch/selectors/index.js diff --git a/app/javascript/themes/glitch/service_worker/entry.js b/app/javascript/flavours/glitch/service_worker/entry.js similarity index 100% rename from app/javascript/themes/glitch/service_worker/entry.js rename to app/javascript/flavours/glitch/service_worker/entry.js diff --git a/app/javascript/themes/glitch/service_worker/web_push_notifications.js b/app/javascript/flavours/glitch/service_worker/web_push_notifications.js similarity index 100% rename from app/javascript/themes/glitch/service_worker/web_push_notifications.js rename to app/javascript/flavours/glitch/service_worker/web_push_notifications.js diff --git a/app/javascript/themes/glitch/store/configureStore.js b/app/javascript/flavours/glitch/store/configureStore.js similarity index 100% rename from app/javascript/themes/glitch/store/configureStore.js rename to app/javascript/flavours/glitch/store/configureStore.js diff --git a/app/javascript/themes/glitch/styles/_mixins.scss b/app/javascript/flavours/glitch/styles/_mixins.scss similarity index 100% rename from app/javascript/themes/glitch/styles/_mixins.scss rename to app/javascript/flavours/glitch/styles/_mixins.scss diff --git a/app/javascript/themes/glitch/styles/about.scss b/app/javascript/flavours/glitch/styles/about.scss similarity index 100% rename from app/javascript/themes/glitch/styles/about.scss rename to app/javascript/flavours/glitch/styles/about.scss diff --git a/app/javascript/themes/glitch/styles/accounts.scss b/app/javascript/flavours/glitch/styles/accounts.scss similarity index 100% rename from app/javascript/themes/glitch/styles/accounts.scss rename to app/javascript/flavours/glitch/styles/accounts.scss diff --git a/app/javascript/themes/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss similarity index 100% rename from app/javascript/themes/glitch/styles/admin.scss rename to app/javascript/flavours/glitch/styles/admin.scss diff --git a/app/javascript/themes/glitch/styles/basics.scss b/app/javascript/flavours/glitch/styles/basics.scss similarity index 100% rename from app/javascript/themes/glitch/styles/basics.scss rename to app/javascript/flavours/glitch/styles/basics.scss diff --git a/app/javascript/themes/glitch/styles/boost.scss b/app/javascript/flavours/glitch/styles/boost.scss similarity index 100% rename from app/javascript/themes/glitch/styles/boost.scss rename to app/javascript/flavours/glitch/styles/boost.scss diff --git a/app/javascript/themes/glitch/styles/compact_header.scss b/app/javascript/flavours/glitch/styles/compact_header.scss similarity index 100% rename from app/javascript/themes/glitch/styles/compact_header.scss rename to app/javascript/flavours/glitch/styles/compact_header.scss diff --git a/app/javascript/themes/glitch/styles/components.scss b/app/javascript/flavours/glitch/styles/components.scss similarity index 100% rename from app/javascript/themes/glitch/styles/components.scss rename to app/javascript/flavours/glitch/styles/components.scss diff --git a/app/javascript/themes/glitch/styles/containers.scss b/app/javascript/flavours/glitch/styles/containers.scss similarity index 100% rename from app/javascript/themes/glitch/styles/containers.scss rename to app/javascript/flavours/glitch/styles/containers.scss diff --git a/app/javascript/themes/glitch/styles/doodle.scss b/app/javascript/flavours/glitch/styles/doodle.scss similarity index 100% rename from app/javascript/themes/glitch/styles/doodle.scss rename to app/javascript/flavours/glitch/styles/doodle.scss diff --git a/app/javascript/themes/glitch/styles/emoji_picker.scss b/app/javascript/flavours/glitch/styles/emoji_picker.scss similarity index 100% rename from app/javascript/themes/glitch/styles/emoji_picker.scss rename to app/javascript/flavours/glitch/styles/emoji_picker.scss diff --git a/app/javascript/themes/glitch/styles/footer.scss b/app/javascript/flavours/glitch/styles/footer.scss similarity index 100% rename from app/javascript/themes/glitch/styles/footer.scss rename to app/javascript/flavours/glitch/styles/footer.scss diff --git a/app/javascript/themes/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss similarity index 100% rename from app/javascript/themes/glitch/styles/forms.scss rename to app/javascript/flavours/glitch/styles/forms.scss diff --git a/app/javascript/themes/glitch/styles/index.scss b/app/javascript/flavours/glitch/styles/index.scss similarity index 100% rename from app/javascript/themes/glitch/styles/index.scss rename to app/javascript/flavours/glitch/styles/index.scss diff --git a/app/javascript/themes/glitch/styles/landing_strip.scss b/app/javascript/flavours/glitch/styles/landing_strip.scss similarity index 100% rename from app/javascript/themes/glitch/styles/landing_strip.scss rename to app/javascript/flavours/glitch/styles/landing_strip.scss diff --git a/app/javascript/themes/glitch/styles/lists.scss b/app/javascript/flavours/glitch/styles/lists.scss similarity index 100% rename from app/javascript/themes/glitch/styles/lists.scss rename to app/javascript/flavours/glitch/styles/lists.scss diff --git a/app/javascript/themes/glitch/styles/reset copy.scss b/app/javascript/flavours/glitch/styles/reset copy.scss similarity index 100% rename from app/javascript/themes/glitch/styles/reset copy.scss rename to app/javascript/flavours/glitch/styles/reset copy.scss diff --git a/app/javascript/themes/glitch/styles/reset.scss b/app/javascript/flavours/glitch/styles/reset.scss similarity index 100% rename from app/javascript/themes/glitch/styles/reset.scss rename to app/javascript/flavours/glitch/styles/reset.scss diff --git a/app/javascript/themes/glitch/styles/rtl.scss b/app/javascript/flavours/glitch/styles/rtl.scss similarity index 100% rename from app/javascript/themes/glitch/styles/rtl.scss rename to app/javascript/flavours/glitch/styles/rtl.scss diff --git a/app/javascript/themes/glitch/styles/stream_entries.scss b/app/javascript/flavours/glitch/styles/stream_entries.scss similarity index 100% rename from app/javascript/themes/glitch/styles/stream_entries.scss rename to app/javascript/flavours/glitch/styles/stream_entries.scss diff --git a/app/javascript/themes/glitch/styles/tables.scss b/app/javascript/flavours/glitch/styles/tables.scss similarity index 100% rename from app/javascript/themes/glitch/styles/tables.scss rename to app/javascript/flavours/glitch/styles/tables.scss diff --git a/app/javascript/themes/glitch/styles/variables.scss b/app/javascript/flavours/glitch/styles/variables.scss similarity index 100% rename from app/javascript/themes/glitch/styles/variables.scss rename to app/javascript/flavours/glitch/styles/variables.scss diff --git a/app/javascript/themes/glitch/theme.yml b/app/javascript/flavours/glitch/theme.yml similarity index 83% rename from app/javascript/themes/glitch/theme.yml rename to app/javascript/flavours/glitch/theme.yml index ac6f57546cf..9d24f0107ef 100644 --- a/app/javascript/themes/glitch/theme.yml +++ b/app/javascript/flavours/glitch/theme.yml @@ -11,10 +11,10 @@ pack: home: filename: packs/home.js preload: - - themes/glitch/async/getting_started - - themes/glitch/async/compose - - themes/glitch/async/home_timeline - - themes/glitch/async/notifications + - flavours/glitch/async/getting_started + - flavours/glitch/async/compose + - flavours/glitch/async/home_timeline + - flavours/glitch/async/notifications stylesheet: true modal: public: packs/public.js diff --git a/app/javascript/themes/glitch/util/api.js b/app/javascript/flavours/glitch/util/api.js similarity index 100% rename from app/javascript/themes/glitch/util/api.js rename to app/javascript/flavours/glitch/util/api.js diff --git a/app/javascript/flavours/glitch/util/async-components.js b/app/javascript/flavours/glitch/util/async-components.js new file mode 100644 index 00000000000..b7ac4d3ec50 --- /dev/null +++ b/app/javascript/flavours/glitch/util/async-components.js @@ -0,0 +1,115 @@ +export function EmojiPicker () { + return import(/* webpackChunkName: "flavours/glitch/async/emoji_picker" */'flavours/glitch/util/emoji/emoji_picker'); +} + +export function Compose () { + return import(/* webpackChunkName: "flavours/glitch/async/compose" */'flavours/glitch/features/compose'); +} + +export function Notifications () { + return import(/* webpackChunkName: "flavours/glitch/async/notifications" */'flavours/glitch/features/notifications'); +} + +export function HomeTimeline () { + return import(/* webpackChunkName: "flavours/glitch/async/home_timeline" */'flavours/glitch/features/home_timeline'); +} + +export function PublicTimeline () { + return import(/* webpackChunkName: "flavours/glitch/async/public_timeline" */'flavours/glitch/features/public_timeline'); +} + +export function CommunityTimeline () { + return import(/* webpackChunkName: "flavours/glitch/async/community_timeline" */'flavours/glitch/features/community_timeline'); +} + +export function HashtagTimeline () { + return import(/* webpackChunkName: "flavours/glitch/async/hashtag_timeline" */'flavours/glitch/features/hashtag_timeline'); +} + +export function DirectTimeline() { + return import(/* webpackChunkName: "flavours/glitch/async/direct_timeline" */'flavours/glitch/features/direct_timeline'); +} + +export function Status () { + return import(/* webpackChunkName: "flavours/glitch/async/status" */'flavours/glitch/features/status'); +} + +export function GettingStarted () { + return import(/* webpackChunkName: "flavours/glitch/async/getting_started" */'flavours/glitch/features/getting_started'); +} + +export function PinnedStatuses () { + return import(/* webpackChunkName: "flavours/glitch/async/pinned_statuses" */'flavours/glitch/features/pinned_statuses'); +} + +export function AccountTimeline () { + return import(/* webpackChunkName: "flavours/glitch/async/account_timeline" */'flavours/glitch/features/account_timeline'); +} + +export function AccountGallery () { + return import(/* webpackChunkName: "flavours/glitch/async/account_gallery" */'flavours/glitch/features/account_gallery'); +} + +export function Followers () { + return import(/* webpackChunkName: "flavours/glitch/async/followers" */'flavours/glitch/features/followers'); +} + +export function Following () { + return import(/* webpackChunkName: "flavours/glitch/async/following" */'flavours/glitch/features/following'); +} + +export function Reblogs () { + return import(/* webpackChunkName: "flavours/glitch/async/reblogs" */'flavours/glitch/features/reblogs'); +} + +export function Favourites () { + return import(/* webpackChunkName: "flavours/glitch/async/favourites" */'flavours/glitch/features/favourites'); +} + +export function FollowRequests () { + return import(/* webpackChunkName: "flavours/glitch/async/follow_requests" */'flavours/glitch/features/follow_requests'); +} + +export function GenericNotFound () { + return import(/* webpackChunkName: "flavours/glitch/async/generic_not_found" */'flavours/glitch/features/generic_not_found'); +} + +export function FavouritedStatuses () { + return import(/* webpackChunkName: "flavours/glitch/async/favourited_statuses" */'flavours/glitch/features/favourited_statuses'); +} + +export function Blocks () { + return import(/* webpackChunkName: "flavours/glitch/async/blocks" */'flavours/glitch/features/blocks'); +} + +export function Mutes () { + return import(/* webpackChunkName: "flavours/glitch/async/mutes" */'flavours/glitch/features/mutes'); +} + +export function OnboardingModal () { + return import(/* webpackChunkName: "flavours/glitch/async/onboarding_modal" */'flavours/glitch/features/ui/components/onboarding_modal'); +} + +export function MuteModal () { + return import(/* webpackChunkName: "flavours/glitch/async/mute_modal" */'flavours/glitch/features/ui/components/mute_modal'); +} + +export function ReportModal () { + return import(/* webpackChunkName: "flavours/glitch/async/report_modal" */'flavours/glitch/features/ui/components/report_modal'); +} + +export function SettingsModal () { + return import(/* webpackChunkName: "flavours/glitch/async/settings_modal" */'flavours/glitch/features/local_settings'); +} + +export function MediaGallery () { + return import(/* webpackChunkName: "flavours/glitch/async/media_gallery" */'flavours/glitch/components/media_gallery'); +} + +export function Video () { + return import(/* webpackChunkName: "flavours/glitch/async/video" */'flavours/glitch/features/video'); +} + +export function EmbedModal () { + return import(/* webpackChunkName: "flavours/glitch/async/embed_modal" */'flavours/glitch/features/ui/components/embed_modal'); +} diff --git a/app/javascript/themes/glitch/util/base_polyfills.js b/app/javascript/flavours/glitch/util/base_polyfills.js similarity index 100% rename from app/javascript/themes/glitch/util/base_polyfills.js rename to app/javascript/flavours/glitch/util/base_polyfills.js diff --git a/app/javascript/themes/glitch/util/bio_metadata.js b/app/javascript/flavours/glitch/util/bio_metadata.js similarity index 100% rename from app/javascript/themes/glitch/util/bio_metadata.js rename to app/javascript/flavours/glitch/util/bio_metadata.js diff --git a/app/javascript/themes/glitch/util/counter.js b/app/javascript/flavours/glitch/util/counter.js similarity index 100% rename from app/javascript/themes/glitch/util/counter.js rename to app/javascript/flavours/glitch/util/counter.js diff --git a/app/javascript/themes/glitch/util/emoji/emoji_compressed.js b/app/javascript/flavours/glitch/util/emoji/emoji_compressed.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_compressed.js rename to app/javascript/flavours/glitch/util/emoji/emoji_compressed.js diff --git a/app/javascript/themes/glitch/util/emoji/emoji_map.json b/app/javascript/flavours/glitch/util/emoji/emoji_map.json similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_map.json rename to app/javascript/flavours/glitch/util/emoji/emoji_map.json diff --git a/app/javascript/themes/glitch/util/emoji/emoji_mart_data_light.js b/app/javascript/flavours/glitch/util/emoji/emoji_mart_data_light.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_mart_data_light.js rename to app/javascript/flavours/glitch/util/emoji/emoji_mart_data_light.js diff --git a/app/javascript/themes/glitch/util/emoji/emoji_mart_search_light.js b/app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_mart_search_light.js rename to app/javascript/flavours/glitch/util/emoji/emoji_mart_search_light.js diff --git a/app/javascript/themes/glitch/util/emoji/emoji_picker.js b/app/javascript/flavours/glitch/util/emoji/emoji_picker.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_picker.js rename to app/javascript/flavours/glitch/util/emoji/emoji_picker.js diff --git a/app/javascript/themes/glitch/util/emoji/emoji_unicode_mapping_light.js b/app/javascript/flavours/glitch/util/emoji/emoji_unicode_mapping_light.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_unicode_mapping_light.js rename to app/javascript/flavours/glitch/util/emoji/emoji_unicode_mapping_light.js diff --git a/app/javascript/themes/glitch/util/emoji/emoji_utils.js b/app/javascript/flavours/glitch/util/emoji/emoji_utils.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/emoji_utils.js rename to app/javascript/flavours/glitch/util/emoji/emoji_utils.js diff --git a/app/javascript/themes/glitch/util/emoji/index.js b/app/javascript/flavours/glitch/util/emoji/index.js similarity index 97% rename from app/javascript/themes/glitch/util/emoji/index.js rename to app/javascript/flavours/glitch/util/emoji/index.js index 8c45a58fec4..31c3e14cace 100644 --- a/app/javascript/themes/glitch/util/emoji/index.js +++ b/app/javascript/flavours/glitch/util/emoji/index.js @@ -1,4 +1,4 @@ -import { autoPlayGif } from 'themes/glitch/util/initial_state'; +import { autoPlayGif } from 'flavours/glitch/util/initial_state'; import unicodeMapping from './emoji_unicode_mapping_light'; import Trie from 'substring-trie'; diff --git a/app/javascript/themes/glitch/util/emoji/unicode_to_filename.js b/app/javascript/flavours/glitch/util/emoji/unicode_to_filename.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/unicode_to_filename.js rename to app/javascript/flavours/glitch/util/emoji/unicode_to_filename.js diff --git a/app/javascript/themes/glitch/util/emoji/unicode_to_unified_name.js b/app/javascript/flavours/glitch/util/emoji/unicode_to_unified_name.js similarity index 100% rename from app/javascript/themes/glitch/util/emoji/unicode_to_unified_name.js rename to app/javascript/flavours/glitch/util/emoji/unicode_to_unified_name.js diff --git a/app/javascript/themes/glitch/util/extra_polyfills.js b/app/javascript/flavours/glitch/util/extra_polyfills.js similarity index 100% rename from app/javascript/themes/glitch/util/extra_polyfills.js rename to app/javascript/flavours/glitch/util/extra_polyfills.js diff --git a/app/javascript/themes/glitch/util/fullscreen.js b/app/javascript/flavours/glitch/util/fullscreen.js similarity index 100% rename from app/javascript/themes/glitch/util/fullscreen.js rename to app/javascript/flavours/glitch/util/fullscreen.js diff --git a/app/javascript/themes/glitch/util/get_rect_from_entry.js b/app/javascript/flavours/glitch/util/get_rect_from_entry.js similarity index 100% rename from app/javascript/themes/glitch/util/get_rect_from_entry.js rename to app/javascript/flavours/glitch/util/get_rect_from_entry.js diff --git a/app/javascript/themes/glitch/util/initial_state.js b/app/javascript/flavours/glitch/util/initial_state.js similarity index 100% rename from app/javascript/themes/glitch/util/initial_state.js rename to app/javascript/flavours/glitch/util/initial_state.js diff --git a/app/javascript/themes/glitch/util/intersection_observer_wrapper.js b/app/javascript/flavours/glitch/util/intersection_observer_wrapper.js similarity index 100% rename from app/javascript/themes/glitch/util/intersection_observer_wrapper.js rename to app/javascript/flavours/glitch/util/intersection_observer_wrapper.js diff --git a/app/javascript/themes/glitch/util/is_mobile.js b/app/javascript/flavours/glitch/util/is_mobile.js similarity index 100% rename from app/javascript/themes/glitch/util/is_mobile.js rename to app/javascript/flavours/glitch/util/is_mobile.js diff --git a/app/javascript/themes/glitch/util/link_header.js b/app/javascript/flavours/glitch/util/link_header.js similarity index 100% rename from app/javascript/themes/glitch/util/link_header.js rename to app/javascript/flavours/glitch/util/link_header.js diff --git a/app/javascript/themes/glitch/util/load_polyfills.js b/app/javascript/flavours/glitch/util/load_polyfills.js similarity index 100% rename from app/javascript/themes/glitch/util/load_polyfills.js rename to app/javascript/flavours/glitch/util/load_polyfills.js diff --git a/app/javascript/themes/glitch/util/main.js b/app/javascript/flavours/glitch/util/main.js similarity index 95% rename from app/javascript/themes/glitch/util/main.js rename to app/javascript/flavours/glitch/util/main.js index c10a64ded0f..fe57fa962a5 100644 --- a/app/javascript/themes/glitch/util/main.js +++ b/app/javascript/flavours/glitch/util/main.js @@ -1,5 +1,5 @@ import * as WebPushSubscription from './web_push_subscription'; -import Mastodon from 'themes/glitch/containers/mastodon'; +import Mastodon from 'flavours/glitch/containers/mastodon'; import React from 'react'; import ReactDOM from 'react-dom'; import ready from './ready'; diff --git a/app/javascript/themes/glitch/util/optional_motion.js b/app/javascript/flavours/glitch/util/optional_motion.js similarity index 68% rename from app/javascript/themes/glitch/util/optional_motion.js rename to app/javascript/flavours/glitch/util/optional_motion.js index b8a57b22f96..eecb6634e97 100644 --- a/app/javascript/themes/glitch/util/optional_motion.js +++ b/app/javascript/flavours/glitch/util/optional_motion.js @@ -1,4 +1,4 @@ -import { reduceMotion } from 'themes/glitch/util/initial_state'; +import { reduceMotion } from 'flavours/glitch/util/initial_state'; import ReducedMotion from './reduced_motion'; import Motion from 'react-motion/lib/Motion'; diff --git a/app/javascript/themes/glitch/util/performance.js b/app/javascript/flavours/glitch/util/performance.js similarity index 100% rename from app/javascript/themes/glitch/util/performance.js rename to app/javascript/flavours/glitch/util/performance.js diff --git a/app/javascript/themes/glitch/util/react_router_helpers.js b/app/javascript/flavours/glitch/util/react_router_helpers.js similarity index 85% rename from app/javascript/themes/glitch/util/react_router_helpers.js rename to app/javascript/flavours/glitch/util/react_router_helpers.js index c02fb524795..1dba5e9bb0b 100644 --- a/app/javascript/themes/glitch/util/react_router_helpers.js +++ b/app/javascript/flavours/glitch/util/react_router_helpers.js @@ -2,9 +2,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Switch, Route } from 'react-router-dom'; -import ColumnLoading from 'themes/glitch/features/ui/components/column_loading'; -import BundleColumnError from 'themes/glitch/features/ui/components/bundle_column_error'; -import BundleContainer from 'themes/glitch/features/ui/containers/bundle_container'; +import ColumnLoading from 'flavours/glitch/features/ui/components/column_loading'; +import BundleColumnError from 'flavours/glitch/features/ui/components/bundle_column_error'; +import BundleContainer from 'flavours/glitch/features/ui/containers/bundle_container'; // Small wrapper to pass multiColumn to the route components export class WrappedSwitch extends React.PureComponent { diff --git a/app/javascript/themes/glitch/util/ready.js b/app/javascript/flavours/glitch/util/ready.js similarity index 100% rename from app/javascript/themes/glitch/util/ready.js rename to app/javascript/flavours/glitch/util/ready.js diff --git a/app/javascript/themes/glitch/util/reduced_motion.js b/app/javascript/flavours/glitch/util/reduced_motion.js similarity index 100% rename from app/javascript/themes/glitch/util/reduced_motion.js rename to app/javascript/flavours/glitch/util/reduced_motion.js diff --git a/app/javascript/themes/glitch/util/rtl.js b/app/javascript/flavours/glitch/util/rtl.js similarity index 100% rename from app/javascript/themes/glitch/util/rtl.js rename to app/javascript/flavours/glitch/util/rtl.js diff --git a/app/javascript/themes/glitch/util/schedule_idle_task.js b/app/javascript/flavours/glitch/util/schedule_idle_task.js similarity index 100% rename from app/javascript/themes/glitch/util/schedule_idle_task.js rename to app/javascript/flavours/glitch/util/schedule_idle_task.js diff --git a/app/javascript/themes/glitch/util/scroll.js b/app/javascript/flavours/glitch/util/scroll.js similarity index 100% rename from app/javascript/themes/glitch/util/scroll.js rename to app/javascript/flavours/glitch/util/scroll.js diff --git a/app/javascript/themes/glitch/util/stream.js b/app/javascript/flavours/glitch/util/stream.js similarity index 100% rename from app/javascript/themes/glitch/util/stream.js rename to app/javascript/flavours/glitch/util/stream.js diff --git a/app/javascript/themes/glitch/util/url_regex.js b/app/javascript/flavours/glitch/util/url_regex.js similarity index 100% rename from app/javascript/themes/glitch/util/url_regex.js rename to app/javascript/flavours/glitch/util/url_regex.js diff --git a/app/javascript/themes/glitch/util/uuid.js b/app/javascript/flavours/glitch/util/uuid.js similarity index 100% rename from app/javascript/themes/glitch/util/uuid.js rename to app/javascript/flavours/glitch/util/uuid.js diff --git a/app/javascript/themes/glitch/util/web_push_subscription.js b/app/javascript/flavours/glitch/util/web_push_subscription.js similarity index 97% rename from app/javascript/themes/glitch/util/web_push_subscription.js rename to app/javascript/flavours/glitch/util/web_push_subscription.js index 70b26105b8f..de185b6d92f 100644 --- a/app/javascript/themes/glitch/util/web_push_subscription.js +++ b/app/javascript/flavours/glitch/util/web_push_subscription.js @@ -1,6 +1,6 @@ import axios from 'axios'; -import { store } from 'themes/glitch/containers/mastodon'; -import { setBrowserSupport, setSubscription, clearSubscription } from 'themes/glitch/actions/push_notifications'; +import { store } from 'flavours/glitch/containers/mastodon'; +import { setBrowserSupport, setSubscription, clearSubscription } from 'flavours/glitch/actions/push_notifications'; // Taken from https://www.npmjs.com/package/web-push const urlBase64ToUint8Array = (base64String) => { diff --git a/app/javascript/themes/vanilla/theme.yml b/app/javascript/flavours/vanilla/theme.yml similarity index 100% rename from app/javascript/themes/vanilla/theme.yml rename to app/javascript/flavours/vanilla/theme.yml diff --git a/app/javascript/themes/glitch/features/generic_not_found/index.js b/app/javascript/themes/glitch/features/generic_not_found/index.js deleted file mode 100644 index ccd2b87b2f8..00000000000 --- a/app/javascript/themes/glitch/features/generic_not_found/index.js +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import Column from 'themes/glitch/features/ui/components/column'; -import MissingIndicator from 'themes/glitch/components/missing_indicator'; - -const GenericNotFound = () => ( - - - -); - -export default GenericNotFound; diff --git a/app/javascript/themes/glitch/features/standalone/compose/index.js b/app/javascript/themes/glitch/features/standalone/compose/index.js deleted file mode 100644 index 8a8118178b2..00000000000 --- a/app/javascript/themes/glitch/features/standalone/compose/index.js +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; -import ComposeFormContainer from 'themes/glitch/features/compose/containers/compose_form_container'; -import NotificationsContainer from 'themes/glitch/features/ui/containers/notifications_container'; -import LoadingBarContainer from 'themes/glitch/features/ui/containers/loading_bar_container'; -import ModalContainer from 'themes/glitch/features/ui/containers/modal_container'; - -export default class Compose extends React.PureComponent { - - render () { - return ( -
- - - - -
- ); - } - -} diff --git a/app/javascript/themes/glitch/packs/common.js b/app/javascript/themes/glitch/packs/common.js deleted file mode 100644 index fd4254a0e4a..00000000000 --- a/app/javascript/themes/glitch/packs/common.js +++ /dev/null @@ -1 +0,0 @@ -import 'themes/glitch/styles/index.scss'; diff --git a/app/javascript/themes/glitch/packs/home.js b/app/javascript/themes/glitch/packs/home.js deleted file mode 100644 index 69dddf51c1b..00000000000 --- a/app/javascript/themes/glitch/packs/home.js +++ /dev/null @@ -1,7 +0,0 @@ -import loadPolyfills from 'themes/glitch/util/load_polyfills'; - -loadPolyfills().then(() => { - require('themes/glitch/util/main').default(); -}).catch(e => { - console.error(e); -}); diff --git a/app/javascript/themes/glitch/util/async-components.js b/app/javascript/themes/glitch/util/async-components.js deleted file mode 100644 index 91e85fed557..00000000000 --- a/app/javascript/themes/glitch/util/async-components.js +++ /dev/null @@ -1,115 +0,0 @@ -export function EmojiPicker () { - return import(/* webpackChunkName: "themes/glitch/async/emoji_picker" */'themes/glitch/util/emoji/emoji_picker'); -} - -export function Compose () { - return import(/* webpackChunkName: "themes/glitch/async/compose" */'themes/glitch/features/compose'); -} - -export function Notifications () { - return import(/* webpackChunkName: "themes/glitch/async/notifications" */'themes/glitch/features/notifications'); -} - -export function HomeTimeline () { - return import(/* webpackChunkName: "themes/glitch/async/home_timeline" */'themes/glitch/features/home_timeline'); -} - -export function PublicTimeline () { - return import(/* webpackChunkName: "themes/glitch/async/public_timeline" */'themes/glitch/features/public_timeline'); -} - -export function CommunityTimeline () { - return import(/* webpackChunkName: "themes/glitch/async/community_timeline" */'themes/glitch/features/community_timeline'); -} - -export function HashtagTimeline () { - return import(/* webpackChunkName: "themes/glitch/async/hashtag_timeline" */'themes/glitch/features/hashtag_timeline'); -} - -export function DirectTimeline() { - return import(/* webpackChunkName: "themes/glitch/async/direct_timeline" */'themes/glitch/features/direct_timeline'); -} - -export function Status () { - return import(/* webpackChunkName: "themes/glitch/async/status" */'themes/glitch/features/status'); -} - -export function GettingStarted () { - return import(/* webpackChunkName: "themes/glitch/async/getting_started" */'themes/glitch/features/getting_started'); -} - -export function PinnedStatuses () { - return import(/* webpackChunkName: "themes/glitch/async/pinned_statuses" */'themes/glitch/features/pinned_statuses'); -} - -export function AccountTimeline () { - return import(/* webpackChunkName: "themes/glitch/async/account_timeline" */'themes/glitch/features/account_timeline'); -} - -export function AccountGallery () { - return import(/* webpackChunkName: "themes/glitch/async/account_gallery" */'themes/glitch/features/account_gallery'); -} - -export function Followers () { - return import(/* webpackChunkName: "themes/glitch/async/followers" */'themes/glitch/features/followers'); -} - -export function Following () { - return import(/* webpackChunkName: "themes/glitch/async/following" */'themes/glitch/features/following'); -} - -export function Reblogs () { - return import(/* webpackChunkName: "themes/glitch/async/reblogs" */'themes/glitch/features/reblogs'); -} - -export function Favourites () { - return import(/* webpackChunkName: "themes/glitch/async/favourites" */'themes/glitch/features/favourites'); -} - -export function FollowRequests () { - return import(/* webpackChunkName: "themes/glitch/async/follow_requests" */'themes/glitch/features/follow_requests'); -} - -export function GenericNotFound () { - return import(/* webpackChunkName: "themes/glitch/async/generic_not_found" */'themes/glitch/features/generic_not_found'); -} - -export function FavouritedStatuses () { - return import(/* webpackChunkName: "themes/glitch/async/favourited_statuses" */'themes/glitch/features/favourited_statuses'); -} - -export function Blocks () { - return import(/* webpackChunkName: "themes/glitch/async/blocks" */'themes/glitch/features/blocks'); -} - -export function Mutes () { - return import(/* webpackChunkName: "themes/glitch/async/mutes" */'themes/glitch/features/mutes'); -} - -export function OnboardingModal () { - return import(/* webpackChunkName: "themes/glitch/async/onboarding_modal" */'themes/glitch/features/ui/components/onboarding_modal'); -} - -export function MuteModal () { - return import(/* webpackChunkName: "themes/glitch/async/mute_modal" */'themes/glitch/features/ui/components/mute_modal'); -} - -export function ReportModal () { - return import(/* webpackChunkName: "themes/glitch/async/report_modal" */'themes/glitch/features/ui/components/report_modal'); -} - -export function SettingsModal () { - return import(/* webpackChunkName: "themes/glitch/async/settings_modal" */'themes/glitch/features/local_settings'); -} - -export function MediaGallery () { - return import(/* webpackChunkName: "themes/glitch/async/media_gallery" */'themes/glitch/components/media_gallery'); -} - -export function Video () { - return import(/* webpackChunkName: "themes/glitch/async/video" */'themes/glitch/features/video'); -} - -export function EmbedModal () { - return import(/* webpackChunkName: "themes/glitch/async/embed_modal" */'themes/glitch/features/ui/components/embed_modal'); -} diff --git a/app/javascript/themes/mastodon-go b/app/javascript/themes/mastodon-go deleted file mode 160000 index 74c0293e83d..00000000000 --- a/app/javascript/themes/mastodon-go +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 74c0293e83dbb49ea4f27eea108526df6216d2a2 diff --git a/app/lib/themes.rb b/app/lib/themes.rb index f1796d0e367..863326e2d55 100644 --- a/app/lib/themes.rb +++ b/app/lib/themes.rb @@ -12,7 +12,7 @@ class Themes core['pack'] = Hash.new unless core['pack'] result = Hash.new - Dir.glob(Rails.root.join('app', 'javascript', 'themes', '*', 'theme.yml')) do |path| + Dir.glob(Rails.root.join('app', 'javascript', 'flavours', '*', 'theme.yml')) do |path| data = YAML.load_file(path) name = File.basename(File.dirname(path)) if data['pack'] @@ -51,11 +51,11 @@ class Themes @core end - def get(name) + def flavour(name) @conf[name] end - def names + def flavours @conf.keys end diff --git a/app/models/user.rb b/app/models/user.rb index 1d42d4f7019..2458cf298e8 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -74,7 +74,7 @@ class User < ApplicationRecord has_many :session_activations, dependent: :destroy delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :delete_modal, - :reduce_motion, :system_font_ui, :noindex, :theme, :skin, + :reduce_motion, :system_font_ui, :noindex, :flavour, :skin, to: :settings, prefix: :setting, allow_nil: false def confirmed? diff --git a/app/views/layouts/_theme.html.haml b/app/views/layouts/_theme.html.haml index 941ccc9148c..39727953d26 100644 --- a/app/views/layouts/_theme.html.haml +++ b/app/views/layouts/_theme.html.haml @@ -2,10 +2,10 @@ - if theme[:pack] != 'common' && theme[:common] = render partial: 'layouts/theme', object: theme[:common] - if theme[:pack] - = javascript_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, crossorigin: 'anonymous' + = javascript_pack_tag theme[:flavour] ? "flavours/#{theme[:flavour]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, crossorigin: 'anonymous' - if theme[:skin] - - if !theme[:name] || theme[:skin] == 'default' - = stylesheet_pack_tag theme[:name] ? "themes/#{theme[:name]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' + - if !theme[:flavour] || theme[:skin] == 'default' + = stylesheet_pack_tag theme[:flavour] ? "flavours/#{theme[:flavour]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' - else = stylesheet_pack_tag "skins/#{theme[:name]}/#{theme[:skin]}/#{theme[:pack]}" - if theme[:preload] diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 0d487d9f38a..030a902cf22 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -27,7 +27,7 @@ .fields-group - if Themes.instance.names.size > 1 - = f.input :setting_theme, collection: Themes.instance.names, label_method: lambda { |theme| I18n.t("themes.#{theme}", default: theme) }, wrapper: :with_label, include_blank: false + = f.input :setting_flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("themes.#{flavour}", default: flavour) }, wrapper: :with_label, include_blank: false = f.input :setting_skin, collection: Themes.instance.skins_for(current_theme), label_method: lambda { |skin| I18n.t("themes.#{current_theme}.skins.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index b9ef21fef17..1ce24e3c637 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -14,8 +14,8 @@ en: one: 1 character left other: %{count} characters left setting_noindex: Affects your public profile and status pages - setting_theme: Affects how Mastodon looks when you're logged in from any device. - setting_skin: Reskins the selected Mastodon theme + setting_flavour: Affects how Mastodon looks when you're logged in from any device + setting_skin: Reskins the selected Mastodon flavour imports: data: CSV file exported from another Mastodon instance sessions: @@ -47,7 +47,7 @@ en: setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations setting_system_font_ui: Use system's default font - setting_theme: Site theme + setting_flavour: Mastodon Flavour setting_skin: Skin setting_unfollow_modal: Show confirmation dialog before unfollowing someone severity: Severity diff --git a/config/settings.yml b/config/settings.yml index 5abf647e870..48d971d44c3 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -25,7 +25,7 @@ defaults: &defaults reduce_motion: false system_font_ui: false noindex: false - theme: 'glitch' + flavour: 'glitch' skin: 'default' notification_emails: follow: false diff --git a/config/webpack/configuration.js b/config/webpack/configuration.js index cb31c6ab835..59d46c78d4e 100644 --- a/config/webpack/configuration.js +++ b/config/webpack/configuration.js @@ -9,9 +9,9 @@ const glob = require('glob'); const configPath = resolve('config', 'webpacker.yml'); const loadersDir = join(__dirname, 'loaders'); const settings = safeLoad(readFileSync(configPath), 'utf8')[env.NODE_ENV]; -const themeFiles = glob.sync('app/javascript/themes/*/theme.yml'); +const flavourFiles = glob.sync('app/javascript/flavours/*/theme.yml'); const skinFiles = glob.sync('app/javascript/skins/*/*'); -const themes = {}; +const flavours = {}; const core = function () { const coreFile = resolve('app', 'javascript', 'core', 'theme.yml'); @@ -22,16 +22,16 @@ const core = function () { return data.pack ? data : {}; }(); -for (let i = 0; i < themeFiles.length; i++) { - const themeFile = themeFiles[i]; - const data = safeLoad(readFileSync(themeFile), 'utf8'); - data.name = basename(dirname(themeFile)); +for (let i = 0; i < flavourFiles.length; i++) { + const flavourFile = flavourFiles[i]; + const data = safeLoad(readFileSync(flavourFile), 'utf8'); + data.name = basename(dirname(flavourFile)); data.skin = {}; if (!data.pack_directory) { - data.pack_directory = dirname(themeFile); + data.pack_directory = dirname(flavourFile); } if (data.pack && typeof data.pack === 'object') { - themes[data.name] = data; + flavours[data.name] = data; } } @@ -39,10 +39,10 @@ for (let i = 0; i < skinFiles.length; i++) { const skinFile = skinFiles[i]; let skin = basename(skinFile); const name = basename(dirname(skinFile)); - if (!themes[name]) { + if (!flavours[name]) { continue; } - const data = themes[name].skin; + const data = flavours[name].skin; if (lstatSync(skinFile).isDirectory()) { data[skin] = {}; const skinPacks = glob.sync(skinFile, '*.{css,scss}'); @@ -76,7 +76,7 @@ const output = { module.exports = { settings, core, - themes, + flavours, env, loadersDir, output, diff --git a/config/webpack/shared.js b/config/webpack/shared.js index a2550bc8198..e4b057ffbd7 100644 --- a/config/webpack/shared.js +++ b/config/webpack/shared.js @@ -6,7 +6,7 @@ const { sync } = require('glob'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const ManifestPlugin = require('webpack-manifest-plugin'); const extname = require('path-complete-extname'); -const { env, settings, core, themes, output, loadersDir } = require('./configuration.js'); +const { env, settings, core, flavours, output, loadersDir } = require('./configuration.js'); const localePackPaths = require('./generateLocalePacks'); function reducePacks (data, into = {}) { @@ -20,7 +20,7 @@ function reducePacks (data, into = {}) { } const packFile = typeof pack === 'string' ? pack : pack.filename; if (packFile) { - map[data.name ? `themes/${data.name}/${entry}` : `core/${entry}`] = resolve(data.pack_directory, packFile); + map[data.name ? `flavours/${data.name}/${entry}` : `core/${entry}`] = resolve(data.pack_directory, packFile); } return map; }, into); @@ -54,7 +54,7 @@ module.exports = { return localMap; }, {}), reducePacks(core), - Object.keys(themes).reduce((map, entry) => reducePacks(themes[entry], map), {}) + Object.keys(flavours).reduce((map, entry) => reducePacks(flavours[entry], map), {}) ), output: { From 7c75702d05483747cbeb5be0a0745143b9bedc5b Mon Sep 17 00:00:00 2001 From: kibigo! Date: Sun, 3 Dec 2017 23:52:13 -0800 Subject: [PATCH 09/13] Fixed image require --- app/javascript/core/common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/core/common.js b/app/javascript/core/common.js index bb4b9793518..a7073ef0eb9 100644 --- a/app/javascript/core/common.js +++ b/app/javascript/core/common.js @@ -3,6 +3,6 @@ import { start } from 'rails-ujs'; import 'font-awesome/css/font-awesome.css'; -require.context('images/', true); +require.context('../images/', true); start(); From 1c74ede69e7a9916c19da6f05daa215231eba81c Mon Sep 17 00:00:00 2001 From: kibigo! Date: Mon, 4 Dec 2017 00:19:39 -0800 Subject: [PATCH 10/13] Fixed a name + localizations --- app/views/settings/preferences/show.html.haml | 2 +- config/locales/simple_form.en.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 030a902cf22..40589fbec5e 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -26,7 +26,7 @@ %h4= t 'preferences.web' .fields-group - - if Themes.instance.names.size > 1 + - if Themes.instance.flavours.size > 1 = f.input :setting_flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("themes.#{flavour}", default: flavour) }, wrapper: :with_label, include_blank: false = f.input :setting_skin, collection: Themes.instance.skins_for(current_theme), label_method: lambda { |skin| I18n.t("themes.#{current_theme}.skins.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 1ce24e3c637..66ec13634fe 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -13,8 +13,8 @@ en: note: one: 1 character left other: %{count} characters left - setting_noindex: Affects your public profile and status pages setting_flavour: Affects how Mastodon looks when you're logged in from any device + setting_noindex: Affects your public profile and status pages setting_skin: Reskins the selected Mastodon flavour imports: data: CSV file exported from another Mastodon instance @@ -44,11 +44,11 @@ en: setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot + setting_flavour: Mastodon Flavour setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations - setting_system_font_ui: Use system's default font - setting_flavour: Mastodon Flavour setting_skin: Skin + setting_system_font_ui: Use system's default font setting_unfollow_modal: Show confirmation dialog before unfollowing someone severity: Severity type: Import type From a807e3b71bcc052d4b0859dd42739b4ae7def098 Mon Sep 17 00:00:00 2001 From: David Yip Date: Mon, 4 Dec 2017 11:35:35 -0600 Subject: [PATCH 11/13] current_theme -> current_flavour (#229) --- app/views/settings/preferences/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml index 40589fbec5e..9564c039919 100644 --- a/app/views/settings/preferences/show.html.haml +++ b/app/views/settings/preferences/show.html.haml @@ -28,7 +28,7 @@ .fields-group - if Themes.instance.flavours.size > 1 = f.input :setting_flavour, collection: Themes.instance.flavours, label_method: lambda { |flavour| I18n.t("themes.#{flavour}", default: flavour) }, wrapper: :with_label, include_blank: false - = f.input :setting_skin, collection: Themes.instance.skins_for(current_theme), label_method: lambda { |skin| I18n.t("themes.#{current_theme}.skins.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false + = f.input :setting_skin, collection: Themes.instance.skins_for(current_flavour), label_method: lambda { |skin| I18n.t("themes.#{current_flavour}.skins.#{skin}", default: skin) }, wrapper: :with_label, include_blank: false = f.input :setting_unfollow_modal, as: :boolean, wrapper: :with_label = f.input :setting_boost_modal, as: :boolean, wrapper: :with_label From 5bed0f10ed4628049ca14fb188804654574be1bf Mon Sep 17 00:00:00 2001 From: kibigo! Date: Mon, 4 Dec 2017 21:54:36 -0800 Subject: [PATCH 12/13] Various fixes --- app/controllers/settings/preferences_controller.rb | 2 +- app/javascript/core/settings.js | 2 +- app/lib/user_settings_decorator.rb | 6 +++--- app/views/layouts/_theme.html.haml | 2 +- config/locales/simple_form.en.yml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb index 56baebed261..277f0f65738 100644 --- a/app/controllers/settings/preferences_controller.rb +++ b/app/controllers/settings/preferences_controller.rb @@ -38,7 +38,7 @@ class Settings::PreferencesController < Settings::BaseController :setting_reduce_motion, :setting_system_font_ui, :setting_noindex, - :setting_theme, + :setting_flavour, :setting_skin, notification_emails: %i(follow follow_request reblog favourite mention digest), interactions: %i(must_be_follower must_be_following) diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js index 1e4bb4cede5..ada5fba2b1d 100644 --- a/app/javascript/core/settings.js +++ b/app/javascript/core/settings.js @@ -38,6 +38,6 @@ delegate(document, '#account_header', 'change', ({ target }) => { header.style.backgroundImage = `url(${url})`; }); -delegate(document, '#user_setting_theme', 'change', ({ target }) => { +delegate(document, '#user_setting_flavour, #user_setting_skin', 'change', ({ target }) => { target.form.submit(); }); diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb index 730c7017726..8af384a2d24 100644 --- a/app/lib/user_settings_decorator.rb +++ b/app/lib/user_settings_decorator.rb @@ -26,7 +26,7 @@ class UserSettingsDecorator user.settings['reduce_motion'] = reduce_motion_preference if change?('setting_reduce_motion') user.settings['system_font_ui'] = system_font_ui_preference if change?('setting_system_font_ui') user.settings['noindex'] = noindex_preference if change?('setting_noindex') - user.settings['theme'] = theme_preference if change?('setting_theme') + user.settings['flavour'] = flavour_preference if change?('setting_flavour') user.settings['skin'] = skin_preference if change?('setting_skin') end @@ -74,8 +74,8 @@ class UserSettingsDecorator boolean_cast_setting 'setting_noindex' end - def theme_preference - settings['setting_theme'] + def flavour_preference + settings['setting_flavour'] end def skin_preference diff --git a/app/views/layouts/_theme.html.haml b/app/views/layouts/_theme.html.haml index 39727953d26..066d9de42fe 100644 --- a/app/views/layouts/_theme.html.haml +++ b/app/views/layouts/_theme.html.haml @@ -7,7 +7,7 @@ - if !theme[:flavour] || theme[:skin] == 'default' = stylesheet_pack_tag theme[:flavour] ? "flavours/#{theme[:flavour]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all' - else - = stylesheet_pack_tag "skins/#{theme[:name]}/#{theme[:skin]}/#{theme[:pack]}" + = stylesheet_pack_tag "skins/#{theme[:flavour]}/#{theme[:skin]}/#{theme[:pack]}" - if theme[:preload] - theme[:preload].each do |link| %link{ href: asset_pack_path("#{link}.js"), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/ diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 35b45fbc925..756f6b11906 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -46,7 +46,7 @@ en: setting_default_privacy: Post privacy setting_default_sensitive: Always mark media as sensitive setting_delete_modal: Show confirmation dialog before deleting a toot - setting_flavour: Mastodon Flavour + setting_flavour: Flavour setting_noindex: Opt-out of search engine indexing setting_reduce_motion: Reduce motion in animations setting_skin: Skin From 017fc81caf8f265e5c5543186877437485625795 Mon Sep 17 00:00:00 2001 From: David Yip Date: Wed, 6 Dec 2017 16:19:43 -0600 Subject: [PATCH 13/13] Prepend check_enabled_deletion to Settings::DeletesController (#229) The specs for Settings::DeletesController include an example that sets Settings.open_deletion to false and expects the "if deletion is not available, redirect to root" logic to run. However, this spec does not set up a user, which means that the spec (intentionally or otherwise) expects this redirection to work with unauthenticated access. We should preserve that behavior. To do so, we prepend the deletion check to the action chain set up by Settings::BaseController, so that said check occurs before the authenticate_user! check. --- app/controllers/settings/deletes_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/settings/deletes_controller.rb b/app/controllers/settings/deletes_controller.rb index e4cb35a8e9d..4c112147114 100644 --- a/app/controllers/settings/deletes_controller.rb +++ b/app/controllers/settings/deletes_controller.rb @@ -2,7 +2,7 @@ class Settings::DeletesController < Settings::BaseController - before_action :check_enabled_deletion + prepend_before_action :check_enabled_deletion def show @confirmation = Form::DeleteConfirmation.new