From a3fa96242cecc298e3f3a303ab68cfe8bce9c0c5 Mon Sep 17 00:00:00 2001 From: geese_suck Date: Tue, 29 Nov 2022 20:20:26 +0000 Subject: [PATCH] holiday event manager (actually works now edition) (#22) Co-authored-by: Snakes Co-authored-by: justcool393 Reviewed-on: https://fsdfsd.net/rDrama/rDrama/pulls/22 Co-authored-by: geese_suck Co-committed-by: geese_suck --- .gitignore | 2 +- files/__main__.py | 15 ++-- files/assets/css/event | 1 + files/assets/fonts/event | 1 + files/assets/images/event | 1 + files/assets/js/event | 1 + files/assets/media/event | 1 + files/events/__init__.py | 28 ++++++++ files/events/assets/css/.gitkeep | 0 files/events/assets/css/spooky.css | 0 files/events/assets/fonts/.gitkeep | 0 files/events/assets/images/.gitkeep | 0 files/events/assets/images/sidebar/1.webp | Bin 0 -> 30426 bytes files/events/assets/js/.gitkeep | 0 files/events/assets/media/.gitkeep | 0 files/events/classes/__init__.py | 1 + files/events/classes/eventuser.py | 20 ++++++ files/events/helpers/__init__.py | 2 + files/events/helpers/const.py | 3 + files/events/helpers/get.py | 14 ++++ files/events/helpers/jinja.py | 8 +++ files/events/routes/__init__.py | 2 + files/events/routes/awards.py | 9 +++ files/events/routes/jinja.py | 6 ++ files/events/templates/.gitkeep | 0 files/events/templates/awards.html | 0 files/events/templates/banner_rDrama.html | 3 + files/events/templates/music.html | 24 +++++++ files/events/templates/sidebar_rDrama.html | 78 +++++++++++++++++++++ files/helpers/const.py | 6 ++ files/routes/awards.py | 4 ++ files/templates/default.html | 23 +++--- files/templates/event | 1 + files/templates/util/html_head.html | 4 ++ nginx.conf | 2 +- 35 files changed, 244 insertions(+), 16 deletions(-) create mode 120000 files/assets/css/event create mode 120000 files/assets/fonts/event create mode 120000 files/assets/images/event create mode 120000 files/assets/js/event create mode 120000 files/assets/media/event create mode 100644 files/events/__init__.py create mode 100644 files/events/assets/css/.gitkeep create mode 100644 files/events/assets/css/spooky.css create mode 100644 files/events/assets/fonts/.gitkeep create mode 100644 files/events/assets/images/.gitkeep create mode 100644 files/events/assets/images/sidebar/1.webp create mode 100644 files/events/assets/js/.gitkeep create mode 100644 files/events/assets/media/.gitkeep create mode 100644 files/events/classes/__init__.py create mode 100644 files/events/classes/eventuser.py create mode 100644 files/events/helpers/__init__.py create mode 100644 files/events/helpers/const.py create mode 100644 files/events/helpers/get.py create mode 100644 files/events/helpers/jinja.py create mode 100644 files/events/routes/__init__.py create mode 100644 files/events/routes/awards.py create mode 100644 files/events/routes/jinja.py create mode 100644 files/events/templates/.gitkeep create mode 100644 files/events/templates/awards.html create mode 100644 files/events/templates/banner_rDrama.html create mode 100644 files/events/templates/music.html create mode 100644 files/events/templates/sidebar_rDrama.html create mode 120000 files/templates/event diff --git a/.gitignore b/.gitignore index 0f168e47f..3425ab840 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -.* +.env venv/ __pycache__/ diff --git a/files/__main__.py b/files/__main__.py index 94ec12a2d..265a15b56 100644 --- a/files/__main__.py +++ b/files/__main__.py @@ -7,7 +7,6 @@ from os import environ from sys import argv, stdout import gevent -import redis from flask import Flask from flask_caching import Cache from flask_compress import Compress @@ -44,7 +43,9 @@ app.config['SQLALCHEMY_DATABASE_URL'] = environ.get("DATABASE_URL").strip() app.config["CACHE_TYPE"] = "RedisCache" app.config["CACHE_REDIS_URL"] = environ.get("REDIS_URL").strip() -r=redis.Redis(host=environ.get("REDIS_URL").strip(), decode_responses=True, ssl_cert_reqs=None) +app.config['SERVICE'] = Service.RDRAMA +if "load_chat" in argv: + app.config['SERVICE'] = Service.CHAT def get_CF(): with app.app_context(): @@ -79,9 +80,13 @@ def no_step_on_jc(): if key and key == request.headers.get("X-No-Step", ""): return True return False -if "load_chat" in argv: - from files.routes.chat import * -else: +if app.config['SERVICE'] == Service.RDRAMA: from files.routes import * + if HOLIDAY_EVENT: + from files.events import * + event_init() +elif app.config['SERVICE'] == Service.CHAT: + from files.routes.chat import * + stdout.flush() diff --git a/files/assets/css/event b/files/assets/css/event new file mode 120000 index 000000000..809b0c4bb --- /dev/null +++ b/files/assets/css/event @@ -0,0 +1 @@ +../../events/assets/css \ No newline at end of file diff --git a/files/assets/fonts/event b/files/assets/fonts/event new file mode 120000 index 000000000..fa7ac2ce6 --- /dev/null +++ b/files/assets/fonts/event @@ -0,0 +1 @@ +../../events/assets/fonts \ No newline at end of file diff --git a/files/assets/images/event b/files/assets/images/event new file mode 120000 index 000000000..4ee15241b --- /dev/null +++ b/files/assets/images/event @@ -0,0 +1 @@ +../../events/assets/images \ No newline at end of file diff --git a/files/assets/js/event b/files/assets/js/event new file mode 120000 index 000000000..7e146b4d9 --- /dev/null +++ b/files/assets/js/event @@ -0,0 +1 @@ +../../events/assets/js \ No newline at end of file diff --git a/files/assets/media/event b/files/assets/media/event new file mode 120000 index 000000000..a651b69d4 --- /dev/null +++ b/files/assets/media/event @@ -0,0 +1 @@ +../../events/assets/media \ No newline at end of file diff --git a/files/events/__init__.py b/files/events/__init__.py new file mode 100644 index 000000000..71d2ada39 --- /dev/null +++ b/files/events/__init__.py @@ -0,0 +1,28 @@ +from sqlalchemy import inspect + +from files.helpers.const import AWARDS2, AWARDS_DISABLED +from files.__main__ import engine + +from files.events.classes import * +from files.events.helpers import * +from files.events.routes import * + +def _build_table(): + if not inspect(engine).has_table(EventUser.__table__.name, schema="public"): + print("[EVENT] Building event table...") + EventUser.__table__.create(bind=engine, checkfirst=True) + +def _populate_awards(): + temp = {x: AWARDS2[x] for x in AWARDS2 if x not in EVENT_AWARDS} + AWARDS2.clear() + AWARDS2.update(EVENT_AWARDS) + AWARDS2.update(temp) + + for award in EVENT_AWARDS: + if award in AWARDS_DISABLED: + AWARDS_DISABLED.remove(award) + +def event_init(): + _build_table() + +_populate_awards() diff --git a/files/events/assets/css/.gitkeep b/files/events/assets/css/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/assets/css/spooky.css b/files/events/assets/css/spooky.css new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/assets/fonts/.gitkeep b/files/events/assets/fonts/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/assets/images/.gitkeep b/files/events/assets/images/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/assets/images/sidebar/1.webp b/files/events/assets/images/sidebar/1.webp new file mode 100644 index 0000000000000000000000000000000000000000..9066f22a3b7594773dc02b6b1013cd42ffe2c76c GIT binary patch literal 30426 zcmaI6b95#_`z`v$ww+9D+nU(6Ik9cqwrzWoOgyn|+kWqS-?{7l&L8L8XRYemy=(94 zuBU7Ds?}Y}Qa^vry8!?i;v$Obid>qo004maU-1S3T!8?jL`4+~K>wWrKnrY4Y@NZG z003J%7bj&25n@d(ZDOcn04x9r00Mvqz#5r2I|wT(%Kk_Fe~#znf69NcK>we<{?D5K zD~n)i=4=80fDr#v2$?uIx%|V1|1gKUi^G3##y^a1VrgXh57+#|bWZ0N4{!Xx z@a2E7#eeaC2ZipWsx10%Z0P@ZVvGL`8~<xpg*YW%(}!0xtppKx_kn z599yh{O6as-?MF0TUCIB#C_dkC70sw&P=^vl)KO9*;0Du$%0JIJN4`-YX z0JMh#0N85|Movcmy$;yFBdEDK0B~Op03c`q0BExS0Ibgc%G&R{#Ljf4P$V z3jkzh0RR*h|N7SbzlHuzOYfrq}{vLihz_stIkM-}5?~QNwOQ;FPhn)+9=Uz|#Y<@)l za{p4`#pTU65a|D<@NV$=o#bB*ECY^ykG=p;P2S?44L*qS{fP+!2m=UWcdoy%eEMGu zUIZKZuYKO`-yRJL{Lg&EKe=Bh)3<#eoKLgw`Mv!90F#IP)7NQ$WI(I$p%?cD!S!@6 zET3+m86PjO8A7LE4GbhKeWL$R|N9{$a=0{K4U++Fy0TSg=Z4MJLj z;(&)r-$JTqTyPW1RxkGOx5~Q=xm)SfB-L5s-0~`Bn+Vb#)$<=4_^yZ2r0{s0c%L>{ zU(rLkM9l%m*=cxQC|^R!p#*!aH*x5&xzKH+1|vKih^>0u-WJ5yux=v5;q7!Qbw&Kh^siEFr z#B)VES&XhwGi?9H8zo(hT35BYl_8o_&PxJpEwq_no z9$0u&%=EgHoW;Ogk8<~84$~MKn&hRXh4<25uY-AK)jLBF4}Neziqa|5^@?=zW4C!} z*qK!JB~4wmFLr0ZRnRFQ?G68)(52!EHW);J%dd=n^y|wSc4W%Fh+;__lZSY(KdY>W zf=i(u7!VLYP()c{?H{p+KZn7KsHIZnadmbrXa(=`l<{`NPArM-*^*0))2DOY6leWb zu$PP%!coXO^1!+%JO4!CIGb2I@5B#pc#-AoV4=+o=u<34uWx^>Xt9%Odx-*&9#DZa z8wpf?%CJufYh%;4tt(NJp@if9%5c`^02k-zpg|L-a@342oPUh=az~qm0cy@W%mmDV z38LOQ?{A^eX7hL4W)J&44+p^B+_hLodnOq~RiE(a%-tArh4;Zt_!$G~=AIh)4nCeV zQ0QN6mwJcC;2l#l^1t!HvY8(;g(ZOP3!|-GQStsA0T~ z#+maP#Sui$NDFYP6n+e9A$NH77MO)FYw{bjm0airdGGnW8L6}7wgcDNV0&@GivLBIT$&G_76rLm78-k(u#$ zYUS0$LRQD=14|Lnq$a=^m@v1pI{YxJzVE}(zsG;(lJFb)E+-+vo7#yHU=B@9pKx6e z@SCZo%hcOLTRV2}=j8NBHk1c>C__SD;Eh5>nhIg%1@>YL$vuIX#_86LpLv8m4;Qrf z9SAiHuH+zD{7Fmt%W<-mf!|G4w+IVWO&oI)e~uuk6v_+n9bU8+^I*7E{7!P=#uQwy zvr7G`-6~BzXO)TFxmUK#p~4dqp=cSxBL&ALM|#W4yVAjFNnYxOodGVL+3xR~zy{Nl zS>5JK?2W)nY^TYp_QUMZ_f+05rKwgTL+(iEAcMvcV zr?c1|Jc;7ob0B6KJCQ;#*8#`4Vt_%BpnY1UVEe`iywm5SdLXmHM7uP*aYq>16L4r+ z&6X0r)gm^OCyEtjnu}6YwWJ~4Oo60ig(CQ4aBb`R5#BL%z64xGMmlzZ2OoRc{OLM& zAR`|(MGJwTOI7M{V-2Y9E!I4~PBoA=?Cb->_HgacD4jw`Y|RtnvcbZ}99Uq{DAxML zIQVtnwaPCxtW+KaayRpPe}#kDjpAw{(iutxUoAObc#nG-;+PWm*PZ#$;^5GHntjdoQz)(5H;{h0vBe7P}KgjpJV#en|5zEhZeV7p8^vl+;>+UFnx* z_ekqY)BP};CWLG%&K@a{*ihm4&RtQxq4j@$9}ERLt7${X(3Kzrs3-nDH3a=eQUz+` zX6^H{SPD)j8366wkQ)S&RuNo!w{vN)T8U!ZRucq=Ks7a|1EZtn*{E%*!&Uab@L=;T z9(AT|b$+LM*4#wo-dJ=jRVi;u9}SuK?5tuxr^{vP>Hmo>Eq`h+gFnj7Gt1(r+_Kk`I>FEqy2hE1aF~Pn!V;o z#F9QpUTWvLqvjc3=P;o*Db`$WU_tN|IXXS{`8!FqGCiAvqA(Mo!ll3||4lSS6lUY4 zuWasLDXZO(R4HW`a_@Y}Q#O&WFuvsyyRyx7Du!uB(R%XR(cI_OMICLnIzID!eIoHp z*py1284Tk$TlON( zn)+wkMVDkJ&S%C!=0Ydfb^B zGTc=v$|ZZ`bZ?uUHajtiK|J(8IeNz-lehhpv~}&Bu#%Z!MU^;=1l|n1W*Y2Aa&10M z)iDer8_DRoRs)EuLhIxU1+asNcj~(^nkJQ8P>EI#OZ*=NW6M{_gk)=`Sq&X8DhaNI z8MmlSIUFm6LV)l4ZqoSyw`zWu2|qISg=RmKj6fUB;O{6IE&g94z!J-iIb*)+Yp+F_ zk|UR}u)*}?cZ(LJncU;xJn9nhWLEQn-*)n$+}XO|%ru{Y8&ou{N=a3G37lN{Yjn&W z9r;W`b29Lzof1j$r+2Pn$iwbw1ksDsKS;I%W`m{D=Tg$5<^=u3_1|7pmBS$z2!PMV z!MnyGu2EDGyQ_J~Lf@%B1#mGMj#s@bqUFyM^x2vdbj5R=><|Et+&rCL=}Sg&a>7P} zt*U4&8tJvNG#J-1coUQzSIFG0E_;g^h>63275vz{P7{O|Cf5NdaQQ?;X9e{f^0F;bW7*lsro zA5$|QRufPDF!k{|RgoO`nJWbsy_$l6vo+Nb33&?z;;Rh(90ZEDpBjDs%8GEjB<`v5 zuR4fu?D2bL?OE9BX*cCI;2RgOpO5(PwR{L-<0q|e%kXs`wByvB2D|Q@Li8Q(wtJ-v zKkWa^Pq({w-QL0})6VO(>b!BAUx4v%jfmLA@Gt$y$WPhpmVrs{mLaC)_JdU~TtX>^ z^!v^D%)mj_XY_?tzQ+OI5%I|>tG~r_m!`8RWEVM4L-@5;JZB*|%fT>YG~RZ@qXY*0t;u$v#LQ`2 zF8*Q!FX+DJ(JLCvN=*TPH{Iac$3UKCJ=;-A&EueEd9s&-HX;R9v85tG| zl0V?}V|*rDMHV0$(&JkX-o&Ytu($woiex(Yk*7rZVR-TWjZLKibN)&>A8qkJ5}xKS ze^u(Fn!s#aB8?t3B<@GmI0x&#^7*Ej>;o;9d#$k1_SW87_iM=ei7Pc%32}Ml_)F^7 z1wjS{xKB!a2SC|CWqtZm!2-TGR?uiIfMldt2(9hFl)Jkm8!xQ#J>`WA43=U_9(q0L zJI9H5R}4Zc+_lI}(e-4F7nw=PwOiX&ac!p%sqQ_KsyLCG%<+P`#W1nRs2^AHyUYD1 z444TO&ng@m`_e_}u)!$oxV-hi1B>bFnv^oQ1oxHn^mbFt?o|ZxOavkcR|XSg-^hzk z@eC_ueFsA-QU%>WNeF`%IjI8n7rjC)gmHi2pGnrgrk;oPjd6b|z$jDBEaGRT{9B*KlV4UbAk}k|V9C%wB~}LHQv842iR_Q&YC59Ra^wQzLLAv7Gt^p+uBOW{QU2~hsT%at#9K12 zjS{gpoSaQ2;LRlY4Agf;0(QX&XRIC$1M~0Nl9|-cT>sT5@*#W1$Esf#Vzw<9#o(7M z_)n-(3_D^-g7jdWU}yjv(}mNZ3&sGJA=&$LD8#=O9=slw*qQXZp=q_}9HgISFK10) zV`K48FSlekg8`S0!WDqCh!7cCvp?4&k&L}@U!r-=Yei6I&~O$tb7U(Q&#xxJ5~uch zT$=fq(_C8UFH`9gDPyZ$Z<6eX%B#wQDCPC*JZy&5fm!z#AW-(khITpyJy=?8!Q1R{ zMj^VTJ5fF$dG6F8D8n+#WV`#HDEg5+Cx>=f_ABLG6L*;m4cZ2Z6Rua|Py;Y%adFVs zav3uJ7HaGH)4o|DxCJ_#_M33@Hu7##us?qA(Zrn95AE?)=8Nb@_3NaQ#8tQ5EHdF` zq=r5bAX=E2lp(8X8n5b+~(l`_-BF#8SZE<6P zj4+W(mwadN(A%Otd4DA9Bwe+7ZUSke!&U114$-;7KWfrkOF=K9?pBrA>jt0#jl5({ z$8&19W0~G@8Vsu|%d;vnMqLfQg=O}JLf{GdV}BLnC97+I-t0H{UUw)zKo(CG{`Pg? zN$m*f7Q1hfQLpNr=k~#2&+SkJA9}v7RIlrFN*e1_u`|u)vGHOhfCoRcY>Q?X1u{MP zLmC1LhZ>L^G&E1@TKX+cmB0%UUGwTaoz>3motn?Qqxro969f-d{7+2ivR!_P@?e?- zF)+@MJE+4gQ1uB2FV}Zlbnsew5(^o9=jI)n9ltA^x@O{xRVD1Jf7d=Tw_ zwfkgzy{RnF2eRYt_U6H^hy(l&+%iw;8QAf9V17YSrpz8kwj>-sHVTW43Le3LFpZTg zN&js~i{zf6%p?9lHL@8saI3!LmtplV5;P5`XbOkWGVC1)rXATY zKmMtY_hyC}-JG8Kdo}$sYT}2@hAa=tEt^n7@SLM6ID&JU=HHrKR+uP+;a|x$6sF2U z+{ze_$K&_{WHu!ae@leO%czLEZAXec@7SZ5b?rjBLu<91-|{1KWSt>PYxW>61odGU z{gjv^_NlZ|!#Fun>U`{}-8!s8@w*^~6&>_O9vMiW8=3J~R>++{Rpmg_#{VKnQrlt6StpCixd35coSxql-G ziaC~vGi|XaAs1r`N)mGF#_}&lU9O_XiRUw`=?^EvorbL&uR70;qS6{;x(SatMHzGhW zD1gPGfMSz}!c5>H`4DUTNJ7$u+&1|NFR#p~K^S*Q$Bg};rxjnyRLq-bny@;UjZVj3 z!nR1Z^Xx+U8O<1XXH2?vG-3*k^tK;J_uJgc84*)5edo-nazkKp#tOlhZ{m}@Pf{|_ zku_jabsJM;n}CRh5P^i$g|R!L!!ba+B#(P*=GK7Ok#eZ}bp(yUSiFm)(nGg~f+Yp8 zK)w4EW+!Yg0wN4oTxS?E0H$QHZnAmJ-^b(Lw_%{6@L}7N6_M5{m|Uj$96946Vhk%2 zcR$G<JufRrE07xGAmpj`_$MJ#?Ddn^DUkpknoQ#t^kfW@4}-aostu z-EUe~$T*m>=1ffczW4dOxU5AoA@t*gm0#}1pJnSzdi%cfs;@pw8<%Hj+3i%(N_ELh zlO!GvZ1oLRZ0vG1ZQkA*0rV*_wI>E3HUFZ%4teTX;*r@vzaDwfl*kW8vRIhPLF)*r z7nkn~nyvhFC=fg9_S1$p8nP<|B(RG=0faYyCgD+jC8I?*RC9l6ZRj44BSYOdn%-5x zov}f7zM6@!)7x6WWZy$}O}HF(<}i~9?m26qVZwF<%w&;#*xEiXlAAgrAVl*bu@sX( z{7v7D^XQ3Lq>GFM{h1d)?#IO^{r8}0R;8iVG3f}YQX)lt`b|cY4-C=dsfK7IW75uC zX)_IzvpJERhqPYfsb{hOcRF_~==S#*JX~8=dhKxHfHkR4WB*3{(ZM2-X!>SPwPl0W zL+ebN>O+ewA9Nn1o|oPzLA_!%K6#;_yq!AI{x!Cqi@ zivW@+6eX8nFyOs)yvQw_!;mlaDWR9s*%N(SnOW;R*kbbe2A;>{iXfg(`uU*W=`@U4 zO-4cOIBx8X5z&tAJZR&I%TlY^Ui&^h06mprxYZkXIZKAbuN(4aqL__<)7dm)h@UHu zGeVq4qF#Z>e4Xk@qZ{(`0f7O{#wJ!@vj-CJp5CQ`h_05nbfg^IZ|Pwf1`=SA49Z*t z+n00_XGhf8U^bOKbpAbe>=?(Vs4Dt#1NlOZgD|J6yi8Z{=!1Bs&8T|f-rWOLAE5srW7a&H6%=?_4;>$uoK=J1zG#{Q^j1vEz%8;uLuox>B-+qK*7 zkXmysiuA2y!ytIdBNt4%Z=MHc{*V)WysmXDcW>EB@myO46Mfmq;Obxj8G2)X%cd%y z9Cn$b&#AI-vaN?pQW39F32)9hvHfOd!~eu83!g@&!-*#U6 z3WHEAJ|T*}tG<=T1$D9%{KDXJs;{6> zHOGmyCs^jb_6MqyXzU*Lx*dHyBu77p=VCt3?KcQ9s6?R3YsSXA=&$vc#@#fr*IoR| zH?L;=*wdc^?n!%wkiA0cDoVt&BJTEEbiyd58CzwBR<2?wa*RRkt zbYnGdmlmXx)0UdVPjLJRp6GO!3ryxvXRYx$zH0}_gg;RZJE_>q8?Y}RAzvNO2IXL1g0gnGdC%cG`tSH-&p5xYxUT-BNFOBBf<>z9y8;H z&l)xr-W^`(p-dE7M$5v(CKOqNQy!Pr1glx`;u94} zl=wBfm6I)oqZ$)zTzieL-g1GiSni&pZ6lQl(#y~Qyak8-De_CAJurkih!Z{%E``~3 zD}_+W%XAiWoL@F$m;VT``VYIExeJsKf0&xt+}5-bedB^b2xCI7_D9%F1gNA#+KrDs zt8i6EWVy(6ud}S3HC?uxL{)DRP=d-MhtvJW8>!!LDFI6+??;s*nL4I-M$@ z@*7+w?fgq;a7p?Sls-j+{cQh&@=ubd7(K8imps}_`yyzI8f;vo4~-U4<%ulifa~dN z6cMG8Q9Kk+48SV^C@?e;bwt75SHtePGM2EW|I!JWLWoi>8m!GCl$gOBLLrSIxA*%9 z#1P5rXRH2XlQh_KbBIq#hxh7YiXqOi;_uOQz=$*7+;+`Q$-lt8Mp0;0aI`GQGmRr&OMJG8|Q`Qzt zr^^3i=1*N&m8V}d;gp1c%3{;O8ot1fVv}}`7-hWA|7whnTR(VcMSnouIQRorlT>pm zobo221JB$`8tY06C$ig~iz$!Dico(Ju9EQwx??noz1gh{bay0y+*$Z2I~0lgiy%{^ z&87!0XS=yE$jo(Kk_wipp}+Fb-7@%|b@yHYf5Z^F&7PBD&RLoQH*`{FgCIc(chAx> z2yUhs(Vu*(w1~6&{VVawJREDLMJ3og`OC&{QcvPnFlmSC7??cqFb2Dvf#jJFggb|I z#XD||q_;KKr9|ZG`PhC{<>n~11T0F(k&Thk1gASCnMZo#L8+7NvkYu>W-d}$nol%Q z-wdkGE2FetBodqPtvMLNV8vzwmm;mdHRc1J>QRFjOuE?N^*2rbV_@c!&IxtJGqPqbV#_c83=i2Im#;=2%Y@Z-?prDHz?oD zi0QJI6Wr`KrG@)@=-(>*`cJC_A81Yt zZH2=Kp*GfTf)6&xq(zlz!5|3%gtCL%X}HN|+UQe_Ih#0`=d_58kf+YcH(}iXdO==T zxLVxlv54Yn>&BX~xx(vvt_uj2aejp$Ull8|%qAhBE!>YO&GC^BC&gF+!Msg)9@QTA z%9WDKRpFZ=p-%)W)lHhfaB}mpXzbn%-&HM3`M)8SJ~cGzVL$1L$XK(toLxThD_JS$ zHI~Xt#Gw4b!;AN<{DWg&zG3#AGkVQsAnB@oOK0tuvFD*hiiy2ME_zDpAeU7miD#J=htrG}2iEAN90VHYC;>3j(E^Yix7ZHH%T3tN1~4TDYrG zk3Ie5gjbmFuqPjM*6TTK_Ixu~bF;M<1;bH87_lnPSRuol;%hl;EH>h%O%dhZJO>V?a=Zg4M<_11(^;`|PO_djD)hTG!B-6dsS6KSzJc}_6pXo<0CVkR6v0Qi%VY!# z?Z1`LudtlEE(U;p@2(}|f$_NYhVC#Tpi*0voBCa2o(1iv_H^K_d=JM<={A1JH!a&q zSA2JB#;dTm3|i!%ibQOv-$<5+z0X~@qdwSJFxPXL?&b^GZ0rQY0k=)`51WBaq2~T zS*(N;Gk6vZrGg3_=6f@HERLNp;##*D9&HZHX6@xsIQPL6RpI^gS^TApjm8D-udVjR z-p)2$#6f$ueIIaL+egFkvHngE?u#y@9ru2F5o}W`^Vt4)M7E*ud+V%0-rQz!~*#DWZ;QYA2^mDaXgg7hXE!ePf8QZM8hnKdjzSQ=a-EU#UCqynEj~uN1TvTB z!MGdmK;fO%(&;_MC?d+51$C>DehLB(u(h(C>JPwoT%=M;kY}U6v1Soaie=pXZLI^L zSn(8MUZgnIsJZulIq#_cK(L;iwwVm2%KdTrB=X0xF1%UBgxSo?EqXJtNQi<0Q67TQ z8lgHrcR-N=%Q9vcNsS#!NSfheH;HN+1cu2^#*j<)tNco>i?5fexfM2^tnZafY&l4K zh4L$QGR$j53_F{_gl$Js7v<&GDKxBeQ=TRCDfWKKI)YR@_<%vh8V@>DeHim6j8<{da3NZa1i^q`Q;IZYD>=BW23@e~1kW!|q(JzENb zoBBy~=*qkS!yHmhKaRjo!3ma|A(JGZ`E`5#y$A)jfA@^6)8o|L##I* zTK+4z4LE(pF{S%R`#ePjthq2AM9Lsv-`ae=_;{?)VX>V_#2~!J7rxOc&Yb8UUD5Nv zt3~Du2vU7rCWx9JhLD(`K_NmCX7NMhF?8sGk<5FdxC6d70tUmfU`ilO8)J2U%s25| zbOE*RK~=&dAGf*!XAsHa)Dzl+Swm&p_Q5hC1VgB+-3B3)#5KP|y8^jH0GPCmN6;D= zR~x5ET$D9yT0eb|kShv7_8Vj2#mi1leTI8t!!Zvu^^7nk|gqL4`(W1YsMOiSK`|iOU7tzc65RfaEA0<_BEV z8OtiGE7diY4U%DVi45ibnCpq8%HWpXb_bn6tSP0*PBV!HZAw-itV*PqupEpJWmGS1 z&)!RMrWG+RstfZt2o#@;m}6yP2JyM$s#e<+EQS)h1XU^qKYa?#M{6~~oI<8=otFGn zx+MJV8;Yp6_vvK1))Iyz{&%3rS8YH9aH~WSsuU3-_q>^3Cj@a)1Q?^}8sA3ChM_1S z&*{TT$?&xiLR;iO+D9^)Gy1Wi>;bM|G4hvp=pBXeGQ@V26*EU3;6?|wM8o{O#c9rL)?1w?M~hSVzx;Q3>83J?Y{_mtz{opN^y%Sg8a3XpQ^W{a~*2YeBE zgQSGVKsb#**?%X35o|$&Oq{b=bBUH!sqz(4S5&BrN8F9SoM^6L0vv=yfrs!VyAXvr zgE-#|7z}bpYvyuj0B@~Di`oNMY|LiZb`}av1m(YBXP1_rd;t;M@YLfz^GM>x#U9ms z8J%yQi2T2E!*IzOEOk@x3fEW3sItnNh_7?VE~-db{5ir>h!+wCBDzJhrZMcoK;cgw z>a~7VMNEYM>bR~vO-~H_>uf!{XsJw(F3tnx@!Q(_9z$a%7acM9fD9)HGJCWX1vk@H z?rki#EB4t}&5>)Nk$1G^?nu?cES>~_>SH*jS0b8;3=%((G%u+^`Fy15pd9qrGbjdJ zuyW@LrXou}*2GVd4KU{&w4VsTXj_fKDC1~ofSjA2A6gU)=cRTQRO5;~!gVw0{t9MXKfkYnxTTV>MUayjDC! z?J7}J%CeU$tnQ3ycakX+gUfm)N+b!p8O-fFm;k$SzTQJF%PbrWgVvQ4=M zJXx2nPRTHYhWdG!D_^mlC}zc>c_W*QdPpCq`*^{8ZB#4jC4Z4BNyOIN*-I)=snMuf z5x_B_|2Rn0C%D&9xa!FULLNV+u@*BnP-!aO&XuJjx&|k6B6y)0l!aPDqLi^rrIV#Q zV>^~tLWCaI-+v2%5@$!vx7RgE!(i&BQJMV?rXYC{sd8r~rnjzeolCCaamZ5SqWGqy z0EBQ1)jGaHezEzAaxsRc=&DAE*^&ZU1ER(G!d~4MwZs9dt=Dv?n?^lbZ!aFMiKSHOFCXFOUoIuC7AE8>marV zF5jq}+GeiE^RAR+rxVqwqWEEzk~(5;?-NvK7`PX5!sbma^d_G!zZnBbH#Ldp52^sax@KgmbiSh`{x*|=)9^*)ob3~>A5(0md zA4v?bE6PTtZp+MNE=MVSHOi57=nCunouD_VfJh9|l%>p9B-kCk4@m~WAe%Qs7trhQ~$O!t&|1PqYB5;wnLzW#Uk`=_%wWd3dVnc2e z*46DJUDUeNEtYtv{^Q_EW~7I|)_uX^+{~HWBqwgPn(+y@sE~fcb?@SnERyo#Id9tA zjfFY6)Fp@?PDLU^&DhA-9@KIjr#{Uo1Wd zL}7!351bic&Fy}yA>rq^u!1dm5#*(BJsW)3?e_1c1{)y~uo8oegfgbOZ6h8e{v}qI z_dicqKIwtAcX0`p2a&N}P9f(snu$H6HYCZ!IcF`$R*WlTusuV0tdRqa}c#5g8Xp_?D9TihkxHA7k8jsa_LivFhp-$PfGh*C| ztw$+|TAmMTiDIeb=LPK%ugGD*%Q1s*$|#*G_B4NA7<^z$7{#r3b*fP-yB-h{`cZSa zD!_KuF&{Pp6gPC{sG%$cLE1BFjtnZ6kzFzGxXDgPVo$Ft!-#HB#}qbfs(8+Ij~+K< zRp=<;%wit;4cTK_a6Z@_9hLvK=h2U(CyCZ5?gKj^#G$>%(luSgvt!us30BGS$%WsL zT9n`Bc0A4L%odZl4R!bupUooOovc^LbDUW5TUX>WNI-#Uev^aZ4BSFo&)+IAx<@ z9deg-^$bku5b}fRq-W6m84b86z#&zf`{!py4*R%FF1B;V=glf7oIIo~2bC$Zfd*(;1KSr_Be(vxLXH!*!Z+pT+{ zVfqo-oM`=Rf#sqxM6AUc**4w1-Mh+5_46*yOAg6@0h^&!4EFo4V+#vU*+O+CdhG*; zO^xXxoBZGGJ@vb5W*(DV#GTCEm+bQLcUjwCM-i#VUCz){0dPGRt5cPdpBPWxqAHhr z`lDhHe-O~eSHd{`Gc!f?7=_2A!-6luyre{Mo{sUp7Om(ioAP22dI4?XS6Q|`BNa8l za%im9r!l$=Y0!JxA^l+C0;1`G@|U6wY^X0tz62CKe?CKC8Nlo08<5o*WsK~~xrwO4 z!X?q9N0XyA4qbmYIi5MlIDEOrIaK&ZcdE!6YB?PL6c3c9`hl9prgkwqLM=ZOCwPY$ zr)qQ#964-w>ok%5b47di>zpURYR-c1=RDGPoqiQ5>f=Mph|&vgF8 z%dtxM^v70}k!AN@Bcldo2}}9kQN{>;aPU>(@B3{>0*jk{f}?QjuJE$vuy1YiXte`3+ z=(}D14rTANXu&bX7JC)Y&5_Vlg$sD5R`BR9EAER1dE^{IAXzet;=*!h`8ENk9LdkD znU5R3=^_p6d{Kjx(b1R9vq+=Om|D&pT$0IED3BAD@C(?A3ND+x}pk$0&} zxyXmInoyJ>M$XOB4WA?ddw<9&??=Nirb-b=WC8lztt43%O48;J9C5#bSJP|@Rxpr; z_U+xiYYA2cjk1>qFy|io?<02}cOcDFtG51}9?l-c_REggtW?a#RE#yoy#KvM9s!(- zPO`wYFv8Lb5ycow|LYIGHuj=FqfjcFAuiU=av%u0q472R+@O77Cd{22!i?ab)`nHZINrB&s2pagA@^ zf64dO=ah|gYdiX@gdfXgQZj-(?1@OZ4WUWDJM5aYqwb8vn=hv=wldux66 z0NqgMvknzy&Z{v!C<(h@H(^jg=`_grehLQSG@@b+lg5o18~b{drR({V7$Ec_&fumk z{|52hH?ArU8XW3AnxHDQBMwDe1;Eb;` zFStr*=sjt!gV+4xrK+mfDyQfOa2R~%!E$e`pstS!aeC;U;6V5NzEMLi>}gIsAANeN z=vMY_$kmt^N zy`hA_TT%4#sEjJbpY#@5On0^tJRXsGW&e#}AfkuE_EFFD;s6ue^l)jMvf$5F%97`7 zzOO(O5Y_%f@wd83g1zjX8^Jy8mZK2jjCJi(i7#I!4X0=$k;B%}j^(KQVHRWIf8Tm1 z%SBu&+OZ0+4F~yBFa>E_)GGThF+1WEju!P31nt~#WhVGuUd+t$M|UbxQGG2xDwD&! zKkT$ON2n2QLOz`|(2&NamK8`(g}Lr3&yKZMaMiW@$?@g|~n0Goko$d15IS*diW_2LmgTV3Xn+?ReQ zgy8NUinOg{6HUwYWnT>QT_c$w+pH@6HbkZDF(RsNfdoUiRdk7VmJb~*$hNs z69~piroR(^$VL_T^RLj?AJL%1{E_6|ElUS!3#k69LAZ^`p~;BowW^QhWhP+o;XlPDv{sje13nL7W!0% zs=1g!UYJdTt2+FYjWnPeK0?7p%pq5(HTU-8&Wg??uMe22_v?rF?Ky+p&PsW~rVL;5 zxy^}HS)`$0wN&hrLMtQz> zVVC6<4Z|Q(F>uf$PGkiO&eVFq zbuk=PK{Y7Wn39GruDE{=I|iQ665<4>09jCt>3s_Uww0(-URuKa#`UU}R9X$h4xJjfX71k;K8wt9LEED&gH9xf>db88?J0 zhYmkUe_*H?Nyv(`e-E~JQ$&cslRnai91&~Lyh-bH#i$SR(1DUlbzX~Y8uBzkS9#)} z=evINyD4S2S?;bKe9QBzP%?5G18s!i9?^6s<0sQ{%}APaKoj58nM~IMKk7Rk`lC}e zVH45i^s=b@uE{MAJ0Y6x{Fg0-uZODg5KgG{ct1S?v6BSCG`&J?fk~p3c zo}6K|4ZOeF%dhGpUC}qnuntkyaDGg@7pG%yCP4slyoVad%ZyB(ljQF?J{rscq2;(4 z8%E{noebC@Ek-|-_+3W6W zdr@I^A*T7;->T3FG1I?oHnV7Ml)=EwlIS`G#;3zd1%4N`Z?W=Ag%t~|7^N567eRHL zmFZ)t++R)?e`izv4)>;zrSCk@|8*~|KEiOk=eu`vV)?20Sf^2) zcU05-T57I}=iM8Ixtg_;T1Ww=M3H^0zW4#tC&ySG zQ&?CNO|=_C^^@A1tvC9(6`!EPE8jl-u|UoQQ$hKSd64@n3`RC~&C1b)6lOFeqv~N! zUP(>(2>yTq?4`P(GJOrc{63Ad(CU>Z8yTLoS2q^dC~ZplLpb>#$BgBIZ)Ch7xfN*! z%K7#V;E@`Xy)d}dSGphjD~iB`I1$EDX?uZQRR-lm#(XHZ7^QfLxwV8}J8S!2R!g$t z3sSI|(e^pAZU(=(PP&%%eJw+pMasN>z(v@JL4$4*e;fq}C@~d=L-h)+@@557YLJGT zOX%b0r9$DGO?$QrUO zxTrh{ix_An5avgwj8H43vz$V7HKTwlT|6>;MlRu#Mb3?hG~1Rr%bT+SZem=)KcE;|dUnCT&54`CG=h5BRr{D%ahF!Ua42duT}S8ZT3 zPD8tBex}cxFjnB?kjemBO#rCj0G}kc*do&4b2MAFUKimR9`8 z#2EE=6_IGEghTS5&TH5++ApZ9dP{@Z@4FB#O6;rnG|q}Msb+3}yLga(<*8cm|1C^~%EG&gywYj+`A{2o%SkcMJ~2s{#PV)TJ0d5WH7`3gwYc%fC7s85 zPhCu*_O^cN1B=j|w^8p=%MRj3wnzeGmr7DICupWGNW}_Z8FUSDQ#D?w3*NLoKI&-~ z(l^Clh#H$7pYV70WJk#pSz>nY{2h=5DJbZZo95dL_U=-~dt188?^g(L^JmLrpgk=I zIk6)DT2(O|+CKC04-lCdNiwc#E5h&f-Y3&aj-nUH8T5Kp%o7_|_S7+zAJxx5O5oy~ zJuq$gYlW#1VHtK+^pir*dpy_x&CVXJW&Lv8tUMg(L4?sfAO&3w4S2@{x~m5=F?v)R zGG4sZXX_)7DVCLaC$kCWKZl>4-yX?Hy+7AlcnpqtLr^jD&9AKD(Ursn9(t0Q3De&t zKfKSiytn#XTKARMLOfR1_4>m!b_!aWNXM0yTGVk7|nLKLf z=ykCT3K8y!R=SHg(rQX_7v8?gy?u_rIiLPKXmeB**kIp?FwG5MX92RZ4xu0xhegk5y7L@ZeCz8W-}J!AmF7HOv~r5lgQ_uj-EY zkF|K607~x0crDsYfuCTj?`*k}KrI(}B}Oh&9v$M~CqfOvlFlVEDZT_XKtt-L#p$2d4Nc*r6XW&cG$#2%LgFgY+ zh`KP=CVokw@!V;Nx5NQ)qyV0#@CFmp+C=GR_A6VS&pM{0a!jCpbohcsKK;ZY0!G&Y zl7EaPAzH^6n$(Voh8WX+zt#&`qW2>%U504=OQZb@h|A;5Zw9Oy?6nJp8Pl~4gp!{8 z_m2_tumFrv9)TzS26`B_ZT9LxDsdjG(bB5w0TRjm-u%^@)jHeP4=ZMWsWq6$zDHs6 z1UhCYKS9GHIhPGOWLyW?Cj>Y%BmfXPuC7b{x^nqT)o}jX3}Cbcv~tvg92=a+7s%50 z@8q;%;L@T0M)gQ3YI@gGUp7cL+6F4Y8fLS=aJ!XdZKS}yQzNfSx2f)o=dV^E(HllX z*(Sf4aPGv`fwa_nib_S+C(>y@u8QUEza5rZE2>Pf0RzrEEU{N zDA*VuqVsydrw>)gJ>0_Fl&^M0C|_{t!g?6P%_|b#F6ukyd6sJvrPMLD4YS*}zw*uY zmtqwT6>9R&0A}u0Ty8(S-wi)Yaciu0j@wF^D04@-nv}xIYreo{w`vRQyOrWe;{VHM zAG>U`!L?fIp=N;5K3gstXvPQVO*#_omc4D;z?=2aV56usWT(XcR&cS!sMQZ?v#4vv zi5m&%^jusWT$J3MT6}@HD|L2PLd8;DAfhOdnIbtq^#)jtJ%0_IxrsQpHioeQoqg!GQ8WNk*C6q=K~`6vV-PhvHX>5Io7fiO0|!s*Dz2k~C)ilSQ=QsV`L#7fJ5tP2*HWAh zZGH2;@i0_eS%Z|dGn7r*?ZLe@gMJVtGLLQ3? zV017(uj?aI8;_&Uq~8M2(6+vk&T6hYUXKrpwv z&)2wM1~24YR7oIcX$56Jo-_C1nnOY2d$-0^Qvd*Kqj5o0CvnZ>JxVxvnD z5)Sgi&VJM^KtJ%zD+dus00LAc5YGHIOwm1&qNrBC?^42fJOZ$ZfE$?uX- zUN^M`4h<_^`s0Yq!juLa9#9|Rrak#@e= z3!;m*+MO2Z4F3U?#TWPX9nZe3+(y(mvoPOD+m$>II>K(#lz5#$=C34~J?n;nKUBf9 zMK53%kqE8Dj-~RV&NMHk9+`x)g|5k;2op4SiZ{-l-~B9W*DmBsfF<@3eN5*sB^AU$ z71RC7qUr?O%ZV8kHRmp-$}*o(^s%n2YU)ET`42#9jd;t8w$7_yyDjX6@ z#lP7pJzqq9rb56l;MHidl?JYZw{+KOs8H|g)Fx{UIs=^3w!Iwv-F*2+53k<@5QQn; z>LX67+|hSU&YaZc`ZFvK%0OHu`~Vn*NewM6zvWn@_r-QvJ3Ke+tQGT17JB#v$Q|GE zL5{)jRSxY124_@Z?!(z<7>v2NMzi5p+9v>PRaLuPe@_Q_fekuxT2KGvC6OLz+|rl{ zrW_wsf7dKTs5i*csmUj4es|!ksVxud$mpchlWcr4sbg7d!p#-+Zl<0?eR=OllvTSn zLtN`Vt26{UD1odGZ|Sk9&Z*aSoB;whG}CREITN#6ty;jC?!+ zk62=(`8Z^kLe6LWOpV7gjiLgH+N$wx$DFgT7loykW5WO+TxJR9!$6Ytk%qbNLf<@f7BLv$h5XE9lzP44 z_;DvmrK9^k*C;qbPW?GkMxYnU+|Z<|u$wrzrYGVMyezx*tuYsNouHI57EOG2g1Bsn zw(U}JfuXSQjQ@W67((Dq+|6D|x;OkNUV|`OXKc8CnX(imqPBbth#qtlP$7oz?j4VK zz5*DYwS6F{RO{AWlCX&6*H*e{9^$0?DVOtj1WEYCR&KUPa6vq{&$Azz3v9yAL_FJ* zPe`RIuL5(R1I6pyB&ynOL%FtQvnw|AwV$d}g92 zM?;y5Wx&7XKOu7K7tu)cyxj)Mta;YQzXR5T)s#^l%($X}#^27&mPpH{%O6sd+6!Ll zSoZr3H<>uzEi_Jo#fc`rvi(f_6bSvsndhVaJ@8> z43;D`S`Z`pZ~--pXIKQ7{k-tkh17LM{T6f3HA*MRyAdO17I_zDuO{w7Yd&v^*ACLv zsz|XLuS`+4rZ^cEWpGS{RZd#2BcY%GxOaWAAx|Wo6z9@P1ZLnwch{DV;$?WSRX|-_ zPjMl8-Py4zqt7F$p1}wAuaes=@Z^O=;cx2NV{-bjyVYG3FHkn9DH71BQ2;2@AeG|FQDNY|& zcuOj<7!Dc4~CJ=n>dZ zBeB@SsfX^_O}mco2{^Y+*3i{bXX)`jUW_^Y)kEJCsiAH`%*PG|@7r;yFo`9@v)3b} zdM%cSo=F(i)a=DXzw-{Dx(IgB>EiGo$B?yq=U5_K3QB-(aHTEcrd(hvzp`1?jF$-! zprv#NSAt36v2!WkZ&rU(8VDA+d$g-bsaaI3)vmS;(1jURFRj{u0uPC9b}7^RFMcv$6i*qOy%)$4xs?3~fAfq$;j<-WiXIDU$rNrKUGT zmJ)Wrcrj_lU#`51sk+ht-rDR3G-|nujFlu|BZ)e4BWS8{xYfP#5>m;m^yFMPJriw_ zG|GE5$)h%$yoAIJ+}FF8Fmbi6x1D-b1#-ZSCS}`BMa^;>N$X*`pfOpk4 zJHA<(z5*!wXi9!%5&_R!I!xE;@K(fYD`*iTh4AVVCK^jpU!WDBckHU?0ETC_)Eo6#QK z3iFrM%P_J5S%th8p^jd5bBc?(EZu4}j~d)~ zY@By#ky6VYEe065+HJk$Oli}dHKHzzR2z*mywSY0kiS`YHLQQ-P4jQ`Lu>^E6U$Oc zc5>0J=*@fY;MnR6HG8>LD~UCY=VKh&Ai6a${EYFo=o`vR+ek{sgmtkcV*%BzZ}Syq z$d3VIkzLFQHB~d(PGX! z%OBBOXwl^g!!GVi0d+L`jHIcGvPpeH<#ZVxTNI%4M>92g_`!J=`SfIWTIldil?N5} z9$_!pqS7{*NeoU^V)<%G+muo1QoelA#(5{*KYMfB`fR#V(O%PagSr}(cH=i|t{~S> zH5DUs-}L~e*ScCw?fTh0ZIO_zY@)pzOXEO1BA%-wPqBc1FGaaPg|!Y)?My#MPIQ~6 ze7P4R_bt}Gt(v;Xbl{8{@+$v+45L*wOdHyrENVIP({+)x5bsWmpw*)rG;RZzcIVDU zhfEYXo+a~GuPlqeEe4Qq+0 zi68u3aXak1WuCz%_T=*LUoWaK`(g8(|2(FKhVwIM{bh>~yA4Q{+(ziqG4^C5DF9Pchu(qJYhR3;d_ULj15Fs$k%-g`R( z-AvZB<7gIZ(?5BxYKPCBg$zZEj}5b$8IyY(2>FGIZdoC>R_g_$9k&1}L{RXc$5G{S zC83o^XB}+YLHH?ycf4RMao+8OX7GEw-b<ySsXd3g+AtNWA5TG9L|Nw5`01mAy=UXT zPmY;y;5x-E8xxzE)9thM8jh(f_}d|+)cUTAn{f5%0Y2)l=0F@o35|3T*vw2Oa3bRr zatHDK0FL$ozK8@dh^&+jb$2l603SEeTOikAVbT&}ffdsmg)0y10bpOKpb6I?<)>e5 z$dxz89O|*h%Pi$aT0*0CN(~Uc7oB@*_yU?CFe}*nX(OPhovjqYK2ErbH(0uR4cx;l z*aR-;+H=9~Rlu)~79-*N>$>I*zkeoNZ4Xd)Lr!i3R|Y=sYnzoYbBxB)74UF#fm(;N z4tsJZ?9+86LL{UR%~B5L2H!`4EO!38`AeXu;#Gg&bw&vZe-qK<2jBigu#)b)Rp;rK znBrl9p>$H*9uxTnTGPEChhtgnrP9q{v=cG!0wzuZ?G^YwOKS#W@%qqNGJcIAL|#9N zZe%?3wmgkHtj0+$H%=JZdx!DyhS>6cZ3mnsCY*M9Ue&K9bH97fGm|r}V45d)G1y@} z(T)~oj$X9t>tyaA#Yulnv(9)FpHpHC6#+1|??f|lNy?XVLf+5K%PiJ9WI^>1MDm%A zK>>=Kt4n@<)a(#HZJ^Z=ztoEy9jcwWa;niK0%(`+eEW%V63Dc!`BmF8}F2|Mz5=Vp-1 zltbfh%{C0V^pZqa9ogLKJMdm(U)W%&li@&#ZpS0|Hv%n$te=N0OvHe37f{-5rT>hx zLhej0UyR^npSJr&P|x6n{=VF_Ijxs$mplR@TIsdC)9uZ^hT-^R$P*sF3>ErYUzm8Y z?_;q2hGV7Xy1tz!`70GqMnrivJB6$t6i&xVW9C;9XD(SLDgyQg!plofH&n~q@mqXCgUAoiXOd^6kV{0X zZigf{YaZ<;5AhlwJwcEPFx8d3K?1k)@Vn7I%ju+?F7lQ`;XG4Fd;dP@IPL3|WH-j= zfq&6c4Z8Xshf$m+Y&(cc_?y}&(z@;f-f$jC7JHsQhsm1OVbe+$b%-NvfNG{m`P-6L zKI$G9K30%u-q@ErL(q@+oAdNS87fdPkxaWW~G#8!Z)GLM|V>Oy0O8cTXr70@Iiwjl0N-Zgn2i$73fzJcaaF?X=)- zaGNb`#oJG#f{xZ81c=)g%^Va>1b|{hR&b3V-+^z9YNDWfbG$dep5`(;Sws2)r^-C{ zb^$P{saCPAPChax&R{k5)~hX0`^oNnAy)`5F}ut#1);_zM6G5Dhfwc(_TpPaZA7I} zm&BEs0!+n!S@tzGT)3mi-*NQ5VSf+?bncD3*fk9aI$e0e@2^Ah_Qt zv~D-Q`E=}T`^sfYyl zQ%x^t`0=vu%Ws^CsQWcPK?-$po@m?es%RjFo}dKZk+=#FN*$aHr@v!C`ZB3PfjOc& zqFQLSa<27ppaEsV)1}L1`Rwhh0BC&_j2$wgj$n=5Kp|Kf|DWgxEJ-EKT-VI!Z{k5X z#j!Uo+n8efpJbv0ds4rL6L|b$|1=6ds0Y&2)_1Z@n>V|PAH3v^xoJOJ!dVhGr$^Nr zjl`MiK<)c7I^=^&f(hs6VN8GHFNRfJ30D(ONslEZi3xQ3cB*p2f=WHSzYvefX`3ce z8c4qjjb?^to`FuBvn8NCn1s($xwuDw|Gi)w-c-Z(M^wx#AZpl`usZYH>E}(KMa=}t z>1^>zRLhcbs>1U93NhWH88*%r4o=ZhTia=hrtM^m8?)u>=K)MwsWC*M>aE9=2PIr3R5EN&<}Lk7dZtIk}tA`9G5xpK9$=IacSKdG=L%$766drjNTQ7^x| z5uJnR>(m;MEP$}$W2#BdHK6*deAb_DcaPQ$Fkti@%VcbzfPAX#-#>OLwHdmb{=rWd zzliWV1e574{9R_FxOHXTKb*foVOe`Z<>r(0X1(%mnZZ}vd=tpfDmK!Hg1tvKgCp|C zTd;0Fqsu0Uo5AJT0b?kdv%a?)i#ddhpUu(J^zE9ayS4p(vik%VN+hT675_%mn8 z@W~o@@kZ^XJ&C}CIFN!Y8jNx=B>1tc_8hLmvWR!LL=xeMlWCmqTlJdF!}KE}y2^0m zBl?m4O>$;*7&?(A`W-wW24LlH*~2m{c(pb@dd+^DH){M7?LhfQc z8hryBqz82m>v}tr-jdm+DjU5L8^oi#*k?EXyk|1?F1EMLn!5W@Q(jV3VIY8W?hRKe zH)uV*#bfE>hDT9i4q*7Wq2A!zM_IoJc)a6AVvD8%SgOZslnB?z+e4G znn#nKvT8KTYTXm4JfB$NhY|+YRtXl~enq|z3?bfc64m++<`>n^@9f{l%u1^hpN5=wtccJfAlV!Gc>N=|(>ghELsu8;(1k~3J(+i9ST9=1Y za@a>*{f>X29xhY4dLQ{of1k@SG%8DFnZQ7M@xHTsqL$KFQ1)$_+5Fo56zjf$0NVbDQ1Rn*PpD@1invkZV5o_zsUWb-z(KdhD*%? zBRCC+x3dn&Os)zHB7)cDgy9FeOf=Q^zTGBg8UWOR`Ae8K!;Ft#< zQ?V-^U|4BKjBV+1a^y5ij7_CWJoi4yZK5x~tbaix*3V=IfJXAbFldWvfpdtn1BrEa z$kp%b(Dz73!Ef6L50%@LD*x7O|ahoVHy2JJPvP6!K@k;eY!;rhMXYWIx<5P$}i( zlt3+59}mAk-4|s)w#fs14cmVno#9A7@s-@{?8y`bC*Vf^M|Lx6;p}KM8`Bm@b$@m( z?t`iG8AOwlX+SJ_i)!pH0x*RAhl_54(MmzHV??c}}G*08h_!-OJO0p~Ti^rp&DMrNH(u?>E_O9)JO4kz;|Dr|A-) zZuUSaoLmQ?iMw3F8CL;lsPlxa_%b-=(NFy#-{;puSBQJc{ihOG@)!V21H(b<#AZ|r zgok!{C&SNyfY`|bsxb$*EZ@#svd5ByOdmo*I4m4wXP;)RbL4^YboA=^O(`C%+5#L_ zRr8TT*!ZbL4M^s_RkiltcN9JCW5&Eo;I0Yaj92IFk_3ot%my7ta9_@fclTkm4?kRIJ$y+GC=@Z1`|pwPKzT7V_X{2wm!UHpy_F1@NIPS`}nK`))f%6 zIf4Dg`)=$5!HI)r;z*CB?B|8dcBbihm>Wm)ASUj(#LqTzs=XBlkqf-3e6Dit?jvulv93*gbaY=K~4?wsf_<-RYldF*!|2 zN7iloDCEY900000)ax6j?LS=Z3LdjdfQ}K!n_(edo_(i9Me&$omhMs%vUQ(=2GpN4 z>W9s>IK=xquR3_`2MhrNb<4NpGePUq_(o?lcC~Tp%ugO5HQ*^fL7Kg0jiM}ceqkT~ z7L=zOeW9W!Tc2^hZ0QnnpFO=h%Yu1jG4z#-gRFHO$INc}L6ZDYfsWID+oUmS_Lmm# z;buOc-{DwGf1mW81V+&+aso_@-Ib1tFQ#n{^dLG~Y3Xz?vt3`jenyn&73v}fyj9q> zN4=A7;=4L%r91>#L=KQlnkfhj2JQ>vBn$%0d;D?=kMVB4%F|bzlw{54Dp(?g&W+3S zx9a!bh3foL-a+A23PNxQzsF5Ii2N@?)PzgPmK&vjDS@gzqNzWR6ZguWXHMWsCxQv? zIsjrtO*i=YLLZhCICTZuWj`~aVMjnL1$A6?kXPUUS77BzKqS43D5ksO+ux^c-nMDm8O54gucHhi(4-Ck zI_68I#&5;s7Q4NIOK18*ck$?yTv-e9Y38&it~?an8WJV~aD z*c;k|PjQ9GaU`v*cZ}sY_}8)l8L6eOzT0{G%wn5@ch;iXhO2D&>3Cd+5A5)o7S?;d z$|U1PbY4w^7u&A7Q(Qxzv}EH7h!*9f&Y#sJ#e@OQGMpC~o^KQ%;S*Aczwpg`_1C@o zL&(wDvAd!8xf+5R1$gPGBwJ9cO1T75b#Cw2qy~JSXXUm6<63lFg$;NUx#nx|yi@}7 zdyEJxgNqw`TEeXXLt@QPo-4CXt=K75f%XfdPcH}#+jWFU)6&>GJEapY9!oO{=lCsB z2Db>c5rL_&5A=m^tXBchu?0GroRXDG`8xSwd0&ri8pIm2ArT{sg2&2~svp9yDKWzy zJG&M}6E1W()yDbJKS8z7v5j*V^=mA_3^2sQhk7Lih04@_FU4`n5E!eyyDG}C-*&gg zrodL_YInHpB0vifeme=?jUx)8c?_G&SAEOC|2^z};@q2}iMjr2vUTe%?Qae+F;UI6~AW zy|wbsf0gY&na>hnsm&%dpDF9M#Mx(>{|vzg-`D>4cT~8rpai9rWA6}yu>m#4;y2vH za9O{fNMbdrzhf>GwemZ3xLVcLC(;(q_*_t0Rn3mXs4D5Oqr7AeJK|) zr)5nmgq5F3Chb7lSXvJhD;V~z$(*@Lc-<*$xuXYwd>>50bOqCW!Ai82@&f8S2V#}g zY;Bt_GLv0Ss$EX0Yh0C6bLterH{We2PLL{@iwI;Nr2e^<&(9YjeA+g_lSNGr5L9yW zy?&f(>iZNAwLQy5M}~&=S&uQdNtB`?94Vesia!dUW*~h^A*Q1@Xvp;Tn=AM(3kE|Z z-xaV$k8kXKF`7!YH^lRO_9gayqI1;mzQ_@99dfUd{?I9{HO`zPxc562E`f#IlWg-r z!f|WI2O&x*=SB(kqT8U%8mFyI$gG&xC(K-DTCe;NaSnTFgY7l$Q^uJre_PpV~g))pU%M`#tKK+iic{4V6 zdDy>O<+xy0K$JWT%aAFHM$I6IOCA(TE7FZ;vi|rxFnp@SjU`SqNBOg}{^SlyeN^U( zI&AG5jd`Es{8;avrYT>64mTEfjBpvz$cVFxX=;o2)B=8G93=0s(Nv=0>HmL*BXjM0 zu(KhWSrcVP()L2H3lHRFY&C`=VIQkxn*c0#+-$vT;b6h~MBGHnksf+CaiSF`bvasbN+-Y1!30ccaI^7cd%YUK;Tl8PC zo8&DK<;Ch)-7Ij{b(hbP0Su9mpOnFJ48BKB(eK=0Pv*0#mfN~hM8nFjE4CC9?W?7P2zfHbMr*n!;Y5EH;S#4qErs@iRG_ z!)TN4L$<=6dnJgGrSs)1XK1^6u$zM-OH``&NQzGhmxMd&$81Sy{S&phMr|GPWi%IL zwF0G>9s`+^Gn`M1;~vISbpxC=mt`-ZdlnW#0ZmP_k8AE>hX1h0HYCn@QdQrn?z6Q= zr)5&>o%zd)n|^31rnb(mP;B#O#LsX#o$f8cAEX41f$hT8iRGe04_K%o$KDsbfA7Bv z3gpVwyYu{*5c5=0ycV|(JJCsClD)~tPuYx*!Z zpd3@c*gs{uFr6@zr#c@>{+_VKQ7Cmg%FgWTl1B7)&X@phhaM2U`j4$dg2mRGPK2#_LV=OF*=&(a5NhRJdSI_f1I!)GZpY( z>C|Vn|L;Rt$65kEf;1y%EVxecnl2^r#sfonGg)$u3NaM|mb{6m&0Lkg_eFfvs<0QK z1dP1lXoumOQ;`qkt#|WUPxFY;tk+Z9CCA?Ep8u}{%9=*0C$4RhV>;UguEx0lM+F3? zDdIB~P_>=B0;5XdBgIQDJSr#I({x&s`s*K2s^DcA0$ko504mp)9oQ&IyI;NtDqY@b z!cgv@|6Q>TpBGK#=93Vg3oNzt_hUQ1SP8{^+nmY{L~h}E9W@B-0B#NH*Pd$Am;Qs> zO||^dZU_jarYLA0XN+B0Vklp?+p(&(6|r#HP86!Cl|~=DUm7Z?FA?;e3S=bNkF^v< zCxqu_<)~k~oj=X;Dm1Qk*P)QV90x;5KR0+KQ|=ncEO3TkeSXLXr@#W?v9<&m8xC}PRJ^D6gtN+%IO;# z*UeLJ5Tbde6k>0v+}U9~-_ElwJub=RKTxEzV81p_gD=U@oBrKHbGYMW;Se-N+`sj! z%1$_<%(dM#Kjh!M;>geWJI{{uKMP;-2lZR3xu7YsdgbJ;HrcESq##e34Q#{=Bqk<+ zl~)1;aGoL?v6mYrSauT(kB)MWQ5iFFO{6M^>UPpF~C2le5gHQ1- z;FtX^?_3?ZV!lKm`>vvqRjoOzP&?x}JN^mD6!>EHS=k#A?{ihBIjflsGlgd8AJKol zgjz&~(RI&Uj!Nec0HjL4__Ia#Rl56>#Yj)C3$K$JD%umdt?ouL+EOmL2qkL+Eisl6 zZKw;84yQHm6|T+6kw|JdZf9XciYSq}j^W9a4e$xuE)#*K*@ddMzinS$4Fe=wSML|! z_@PGznZ(mPKeqyjoZKSuUad>AIfMMXsDJ>NY!-QFv-`dVX=q&@bKn)7Sg$tBKZG4T z>DBxwlZK~O3kW;8gDG2EGpKfLBQ9HU+lgSA?6Q@i&BK`;8N?&ezbWX?-$4T)kLcRv z<90I`kg=*}9xI<7$4L!IEG+Tq2zOnX%D>!FX;S5@L%p4;smoHkEQzQy`vBWlTPLyS z25-2WoAvmfE>dm85QWR;bl2tP@Ph^xwHZaZs>g0=?A3b_d2nD3w{*+6uM+R1wV(J` zoK*}0?QG581Yw;kNYi=pAme0>=V^7I8LW%QY_p>G-mD8#EH9-4GMpHFE!>OJAeOE9 zQON76AQa4A3}Ex;)y9M~eGe7I?tDsi2q`W!pn8Z}LI~X!u6k3+EJf|O^?xhkWw9SX z02BvrpQ^z>%vKC?vJK*TPZ#}OPcKIjFVvHByWPz!pZj|9wa0}!5QtdH`MUko8YFL; zFdkdXgshYfeq5=nO`wvHrept#b-q#Mep3(INcEgZGC-+tDBL~g!Dh*CDuYN~On6&5 z5fS}A;^DrVf!XZ9CCgj)16NV=YE%Sde1@_V*wXl&O=r>SSySl1XS%v!d+oI?4<+*! zNC(}1-0=*Y2@$#MS*le_&J(uBgb4{o4=K->_|cm|E&CNRMBiU{U)txG7jT%2+kef_ zE9Jw+>+lgZGkorIj|N}J34f$aTH4GW8NgT{E7W9cHwHm6*##1)L|FNQh%y>JZ8@PP z-&wa1`SPYzcN3vbdB3{!_}7KrU=&d{#6`nl<{(^SRxaRZP`S^sr^ zW1Q{X@EI9azkk!9rEKjIU4ihC1lj2HQh))$33;<*FY*btZml>n7hE&W58{2@=_ODb z>XZ-Zr;Y9vp3{r?o!|k@O|AXuJI&Hrs zFtThSa`p%C<2JoCqb2&NwgpSX2#WB}uB4+6d3j%GB`|u-{pK_uWn+U9&_e|s$=$rX z`8citR~}@5>>0o$hJk#BgUV_e#7s?sJgg`$!5py8)yH&36v1~xnTHdY9GA@9Z=J&9Sq#0(HV!Fu~XF4!@cVP;h+A&dxhaIW7rwxsb z^#E93L0ABF!E#aEfrsyP!QsARe26}9&uedzKx%7HuelA8LQ2N*$n%5bA!T7y+`k){}J-IXI?rv#`F*h zVb&tAp8M8_xp5jUzfGy-&yKlX^hUGBL%EO}#pp!x23HsX3;6)7wf`_`Mt%~@Bu|_X z3CZ)oUk+FGofOg!I1i+XA08|aW$SXcHvc%|CUDfdf`C~>ub3^^7ZP3!jkDhtaPz#o-|~D><1#Qzn#L6e>KRE2l~;MG z1;%1mb*^0au#(2J2z8#%ieo@MgzuVAAN0R5FFEe6R+@!uYJY3*LpDgz_Z&nPjzvjr zGiy3j@1Y6Yv-e^d_$5w$Yovf>za#weg9G~d{5%a#Ej(;mR}$RPGXo5XaprTQ0WLBu~N)8#O6nj?}z&JUEHn!6uLQ6wnh3iL%tqC VaM2!Hbr@*Oi1V literal 0 HcmV?d00001 diff --git a/files/events/assets/js/.gitkeep b/files/events/assets/js/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/assets/media/.gitkeep b/files/events/assets/media/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/classes/__init__.py b/files/events/classes/__init__.py new file mode 100644 index 000000000..b8bfb0664 --- /dev/null +++ b/files/events/classes/__init__.py @@ -0,0 +1 @@ +from .eventuser import EventUser diff --git a/files/events/classes/eventuser.py b/files/events/classes/eventuser.py new file mode 100644 index 000000000..d1d87d209 --- /dev/null +++ b/files/events/classes/eventuser.py @@ -0,0 +1,20 @@ +from sqlalchemy import * +from sqlalchemy.orm import relationship + +from files.classes import Base + +class EventUser(Base): + __tablename__ = "event" + id = Column(Integer, ForeignKey("users.id"), primary_key=True) + user = relationship("User", primaryjoin="EventUser.id == User.id", lazy="joined") + event_music = Column(Boolean, default=True, nullable=False) + + # start event specific columns + + # end event specific columns + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def __repr__(self): + return f"" diff --git a/files/events/helpers/__init__.py b/files/events/helpers/__init__.py new file mode 100644 index 000000000..3651c2473 --- /dev/null +++ b/files/events/helpers/__init__.py @@ -0,0 +1,2 @@ +from .const import * +from .jinja import * diff --git a/files/events/helpers/const.py b/files/events/helpers/const.py new file mode 100644 index 000000000..ddda308de --- /dev/null +++ b/files/events/helpers/const.py @@ -0,0 +1,3 @@ +EVENT_AWARDS = { + +} diff --git a/files/events/helpers/get.py b/files/events/helpers/get.py new file mode 100644 index 000000000..e8db19aca --- /dev/null +++ b/files/events/helpers/get.py @@ -0,0 +1,14 @@ +from typing import Union +from sqlalchemy.orm import scoped_session + +from files.events.classes.eventuser import EventUser +from files.classes.user import User + +def get_or_create_event_user(target:Union[int, User], db:scoped_session) -> EventUser: + if isinstance(target, User): target = target.id # type: ignore + user = db.get(EventUser, target) + if not user: + user = EventUser(id=target) + db.add(target) + db.flush() + return user diff --git a/files/events/helpers/jinja.py b/files/events/helpers/jinja.py new file mode 100644 index 000000000..1ff785df3 --- /dev/null +++ b/files/events/helpers/jinja.py @@ -0,0 +1,8 @@ +EVENT_JINJA_CONST = { + "EVENT_BANNER": "banner_rDrama.html", + "EVENT_SIDEBAR": True, + "EVENT_STYLES": "spooky.css", + "EVENT_AWARDS": True, + "EVENT_MUSIC": "music.html", +} + diff --git a/files/events/routes/__init__.py b/files/events/routes/__init__.py new file mode 100644 index 000000000..d33dc9c13 --- /dev/null +++ b/files/events/routes/__init__.py @@ -0,0 +1,2 @@ +from .awards import * +from .jinja import * diff --git a/files/events/routes/awards.py b/files/events/routes/awards.py new file mode 100644 index 000000000..c04400702 --- /dev/null +++ b/files/events/routes/awards.py @@ -0,0 +1,9 @@ +from flask import g + +from files.events.helpers.get import get_or_create_event_user + +def award_thing_event(v, kind, author): + event_author = get_or_create_event_user(author, g.db) + event_v = get_or_create_event_user(v, g.db) + + g.db.add(event_author) diff --git a/files/events/routes/jinja.py b/files/events/routes/jinja.py new file mode 100644 index 000000000..f8c89a7a5 --- /dev/null +++ b/files/events/routes/jinja.py @@ -0,0 +1,6 @@ +from files.__main__ import app +from files.events import EVENT_JINJA_CONST + +@app.context_processor +def event_constants(): + return EVENT_JINJA_CONST diff --git a/files/events/templates/.gitkeep b/files/events/templates/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/templates/awards.html b/files/events/templates/awards.html new file mode 100644 index 000000000..e69de29bb diff --git a/files/events/templates/banner_rDrama.html b/files/events/templates/banner_rDrama.html new file mode 100644 index 000000000..9c1abdd46 --- /dev/null +++ b/files/events/templates/banner_rDrama.html @@ -0,0 +1,3 @@ + + + diff --git a/files/events/templates/music.html b/files/events/templates/music.html new file mode 100644 index 000000000..afff89ebc --- /dev/null +++ b/files/events/templates/music.html @@ -0,0 +1,24 @@ +{% if not (v and v.poor) and (not event_v or event_v.event_music) and not (sub and sub.name == 'music') %} + {% if not song %} + {% set path = "assets/media/event/music" %} + {% set song = "/" + path + "/" + listdir('files/' + path)|random() + '?v=45' %} + {% endif %} + +{% endif %} diff --git a/files/events/templates/sidebar_rDrama.html b/files/events/templates/sidebar_rDrama.html new file mode 100644 index 000000000..37836a415 --- /dev/null +++ b/files/events/templates/sidebar_rDrama.html @@ -0,0 +1,78 @@ + diff --git a/files/helpers/const.py b/files/helpers/const.py index 5e71ac5e4..26901ec51 100644 --- a/files/helpers/const.py +++ b/files/helpers/const.py @@ -1,4 +1,5 @@ from copy import deepcopy +from enum import Enum, auto from os import environ, path import tldextract @@ -42,6 +43,9 @@ FP = environ.get("FP", "").strip() KOFI_TOKEN = environ.get("KOFI_TOKEN", "").strip() KOFI_LINK = environ.get("KOFI_LINK", "").strip() +class Service(Enum): + RDRAMA = auto() + CHAT = auto() CLOUDFLARE_COOKIE_VALUE = "yes." # remember to change this in CloudFlare too @@ -205,6 +209,8 @@ PAGE_SIZES = {10, 25, 50, 100} ### SITE SPECIFIC CONSTANTS ################################################################################ +HOLIDAY_EVENT = None + PERMS = { # Minimum admin_level to perform action. 'ADMIN_ADD': 3, 'ADMIN_REMOVE': 3, diff --git a/files/routes/awards.py b/files/routes/awards.py index ee584f8c5..5106ef8e7 100644 --- a/files/routes/awards.py +++ b/files/routes/awards.py @@ -390,6 +390,10 @@ def award_thing(v, thing_type, id): if author.spider: author.spider += 86400 else: author.spider = int(time.time()) + 86400 badge_grant(user=author, badge_id=179, notify=False) + elif HOLIDAY_EVENT: + from files.events import EVENT_AWARDS, award_thing_event + if kind in EVENT_AWARDS: + award_thing_event(v, kind, author) if author.received_award_count: author.received_award_count += 1 else: author.received_award_count = 1 diff --git a/files/templates/default.html b/files/templates/default.html index 8ec4489be..2675ccd73 100644 --- a/files/templates/default.html +++ b/files/templates/default.html @@ -5,15 +5,19 @@ {% include "modals/expanded_image.html" %} {% if '@' not in request.path %} - {% if sub and SITE_NAME != WPD %} - {% set src = sub.banner_url %} - {% set alt = ['/h/', sub, 'banner']|join %} - {% set class = 'site-banner-hole' %} - {% elif SITE_NAME == "rDrama" %} - {% set href = "https://secure.transequality.org/site/Donation2?df_id=1480" %} - {% set expand = false %} + {% if EVENT_BANNER and not sub %} + {% include 'event/' + EVENT_BANNER %} + {% else %} + {% if sub and SITE_NAME != WPD %} + {% set src = sub.banner_url %} + {% set alt = ['/h/', sub, 'banner']|join %} + {% set class = 'site-banner-hole' %} + {% elif SITE_NAME == "rDrama" %} + {% set href = "https://secure.transequality.org/site/Donation2?df_id=1480" %} + {% set expand = false %} + {% endif %} + {{macros.banner(src, href, alt, expand, class)}} {% endif %} - {{macros.banner(src, href, alt, expand, class)}} {% endif %} {% endblock %} @@ -31,7 +35,8 @@ {% block sidebar %} {% if has_sidebar and (home or p) %} - {% include "sidebar_" + SITE_NAME + ".html" %} + {% set sidebar = "sidebar_" + SITE_NAME + ".html" %} + {% include sidebar if not EVENT_SIDEBAR else 'event/' + sidebar %} {% endif %} {% endblock %} diff --git a/files/templates/event b/files/templates/event new file mode 120000 index 000000000..bfac8cddf --- /dev/null +++ b/files/templates/event @@ -0,0 +1 @@ +../events/templates \ No newline at end of file diff --git a/files/templates/util/html_head.html b/files/templates/util/html_head.html index d9f9316af..3940a6261 100644 --- a/files/templates/util/html_head.html +++ b/files/templates/util/html_head.html @@ -146,6 +146,10 @@ {% endif %} + {% if EVENT_STYLES %} + + {% endif %} + {% if request.path == '/chat' %} {% if IS_LOCALHOST %} diff --git a/nginx.conf b/nginx.conf index 0674c02b9..d7540c261 100644 --- a/nginx.conf +++ b/nginx.conf @@ -8,7 +8,7 @@ server { add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"; add_header X-Frame-Options "deny"; add_header X-Content-Type-Options "nosniff"; - add_header Content-Security-Policy "script-src 'self' 'unsafe-inline' challenges.cloudflare.com; connect-src 'self' tls-use1.fpapi.io api.fpjs.io 00bb6d59-7b11-4339-b1ae-b1f1259d1316.pushnotifications.pusher.com; object-src 'none';"; + add_header Content-Security-Policy "script-src 'self' 'unsafe-inline' challenges.cloudflare.com rdrama.net; connect-src 'self' tls-use1.fpapi.io api.fpjs.io 00bb6d59-7b11-4339-b1ae-b1f1259d1316.pushnotifications.pusher.com; object-src 'none';"; location / { proxy_pass http://localhost:5000/;