From 766b9e0122536ef8d77b0557217cdef7355eac56 Mon Sep 17 00:00:00 2001 From: frankiefab100 <46662771+frankiefab100@users.noreply.github.com> Date: Wed, 29 Jun 2022 12:39:57 +0100 Subject: [PATCH 01/39] create react-play PWA --- package.json | 1 + public/index.html | 31 ++++++- public/logo.png | Bin 0 -> 22459 bytes public/manifest.json | 20 ++--- public/worker.js | 45 ++++++++++ src/ServiceWorkerRegistration.js | 141 +++++++++++++++++++++++++++++++ src/index.js | 3 + src/serviceWorker.js | 71 ++++++++++++++++ 8 files changed, 294 insertions(+), 18 deletions(-) create mode 100644 public/logo.png create mode 100644 public/worker.js create mode 100644 src/ServiceWorkerRegistration.js create mode 100644 src/serviceWorker.js diff --git a/package.json b/package.json index 3c222d764..f841e5dc8 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "@types/lodash": "^4.14.182", "@types/react": "^18.0.6", "@types/react-dom": "^18.0.2", + "cra-template-pwa": "^2.0.0", "date-fns": "^2.28.0", "firebase": "^9.8.2", "graphql": "^16.5.0", diff --git a/public/index.html b/public/index.html index 634bf5205..a18c69e76 100644 --- a/public/index.html +++ b/public/index.html @@ -2,9 +2,9 @@
- + - + @@ -14,7 +14,7 @@ manifest.json provides metadata used when your web app is installed on a user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ --> - + + + diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..60ca2c73c3074477031e81a8c9d95502ad551dc6 GIT binary patch literal 22459 zcmeFZ^LJ%Y(=8mF*tXqC$F@4QZFFqgwr$%+cWiX*?%1~O$@{#|9p4}D{dhA*a>h>f z-fQi>s^+SiH7gMca^eWExUe7~APABYqDmkjpz&Yd(2&62`1i3-0zUvw!jdY`z%OrT zlW-6aVh~ADAr*JMb6u!(j2}yU`xl>enoQ=2=@^X0qJlrr!N0+h3ZW>V4*|lt4#TMr zKp+Fl(^0_Fhx}1g61j{KyI!?FD}3P*2PRcq`c8ZaF5Y`r9Xv4P@4Nq~x?FZhy&Ll( zFbN4FBLe`SLd4`?Qqbh&MoK#Wdn_mjElLRZ&z}P%prHdq17*L#fCc&!69W%MS%5#k z4v=9$N#Z5yB`N;*MkL4{kigr0-IbJt7=Q}HUP1n!Gl>DDGyiijSfC&|AXt#}7iG%- zo*68-hx0$P5JV0S_D7Z=Unx%f8U{E3ayT#ef5rq$Kt=|O0A#74e$5v+09b#&>#oMj-ooRuiQ`x~%0R(0y02 z?FvlO9+sSEXU+A6b9^0qV@1M~_@n6S4q~>;GIpjSW`y}9DEz6YUMV&=-2yIrLHc)w zW*^qH70$6IzopUucQED_9TG^d4U}2)Y~(_)sGD@DdmbG3r!o8c!sJrSq^+d6IRaOR zrRyh(F%Aot4V;DT7sm1OZ~EpzX0z(K7-t*Z8Ct~u>H9@GsP^BZ
#&KdwlU_iz zTke)A`@#bmis3T|nL#+8sr|@&ZEzP#$iO<%2V;1sd`?sPF|#_{-cK(TzI$v~EaVI^ z2LRs{Wh%`E@x7@xxIi>BX02H)(gQa-<0DK8D;l!7PK;ZzQZ*9GHCfo)1l76Yt~2j! zn+~G2Scf;!!v?KFnl2LWZD8EexTT1EH`GdFh!-9&w<@?2Y27aW$?sHju(9=d v1oz+-d?%(uqdo!hl zv+hz__H=qg&%|ZQ{1K?f+nd$14aK5x`W+}kH*5>l<^G`37p7FEQ4Q|M7?nRBEngbt z`9ZWeKqhNjWkq$^v&(_)6TZ)`%eWLAsw 0<9mi|CpwoDCd;jw80mZM2utiH#F|&S*JM89w4v zEuh~hb+P`1Ja{u3;kf9Zpr9(9p~N8+sfcro&Xqp-Z8dIDFx}~i?4%EWAkXD`UZYT! z$m?kIqIn?Y=Ag-b0+!W0Jyw0og+LO|TWwYKy@1HUNm N%dNr+dY+xc zR8nDL3(W}T;etA@neQ*G-HsZ7h Isk+{~S+&4C^+ZTAp `0`u+ 6w*sM@IO2=i!#*2y8peMn8ozi07zqu>KhY6a`7r5T|l~tw (Nr6?O8{HJBG+LMx_F^27}H1Y;ccqpJtJ4L9c# cPPI)>P;Eq#lEBPBiLcldG>yBgSexbvbC&ivj!sD27vXCPZ_3r|7l*vMh((7X_ z&(SOZDt1?nBHF; %&vWV-V-M%`x$h&s_$+~0qe%X!A;>W@$mp%B?Le^}XcLEIG;Wv{6s z@E#R#-IIs>CI)6BkTuOIC8PPdj(va1_mJWlnFz_kC&G=Q-_!_>m0pIHOV$o@_kXPy zU0O$Wl2r%vd>G*hiX&%L=srMgc`vKU@XLQeLon#$S`G?M_xNAymAx=VeP1IX9kIP~ z`%26zzAgyr6Q~NF1M0B` VeP#uBkL!Y4(g(m{cFK>Bl<-@Xm;rX($WKkVXQ51<3SCy1>s*Qg}=Kwk?3a$ zWNf6kV&wbmsWrPvU!u|ccVq3d+DVW^NDXaPzM~6wb6VFJB_kD()+`xV>JWlPmOugD z&RzA7_5|zM=n5;Ul~e5J#1^f!35*WWwD #TR1@y2mZ<^-(eh^ z3btEEbh!Vt^pJ+%vTZm=VFnv*m#vHi7J;_Ox$dgUN-#7rQnY_FXF eQDTgd z!YgCa0mJWok5FbCrAK{5UMyZPWx`=DLj61wBA7U`As_edso>)p-tzsrzfri^9#qQe z2nu_ m#vkwQa=`O`n~Zo?F2r! z#xSvE(&a-7f~9^vQ?kv|OKOJv+d+}NWOWdjRlCF8^mf&KAAu*s)$wt1-{4jBC{J)_ zocCiC%(={1?wA=Z219{~FG4}G??ooKD8anIM{*6#5cPb0rkzeARmHhdTO_CD?QrD_ z2bqBF^hrel#X-1#!cJe7rzv~V1~Gdu>ZcAgxx?tYbNOWt;Yv+Q3sVcN6a8pf21Z$a zzt|~L6In|}s`hY=w<^tUfvGF4YOGeMC^zA^dAwR`+g_TxVy1_AG%697QsY1kOJIa7 zIi(bgCvgQeBEXvkfqIebh}A@FaKTSl!Z8aw5fU^WAJ$=AXCd&RlgL+qT$BzG(30`% zx~A-mQ4x-Ib`Vt>;mb%hBkjRqK6akM%vlyq@C>%%T8)N2x+O&bwZ*hG$b?W$ry9`$ zEg=!!pJXawwf)f 0CB)xRN1{C{7SQ6zsT`gwb)qS2n zMo%*b7;@MQ8doLsf1@4xv+8!6zvc$YpNS^_%4MNClXbz0rkLUyNYfxJOdKI}-bQ8) zmcR?^0={i8djW)pR!f;Z#l_pSZNYOP)P$lz?qy-z8|eZ-u>$zo!5cjKm^ga0dOQlHDRUO%fIGQZ9&(ug zXQ_dztjK7JIeJw6z*12LoXK*|fZDBcZbb3IFYy-(TJf4AB>j3GrYm~+3?9CQ1t7L1 zW|ly6AoIPZ^s!}~RDR=$|FP{{XJFQqi-DQe{cKx~#)a4b0ez(Dor_1OEkIgGm(xil z22JiF{g0g(I3hcR8}Z^5Zza{8N6;onY==rbQLu;bpcFLcz8D8-%BeL;d lqJCcm;U=6IDTih30>1f240($^S#~BHt&-w!s|r zXW~3PM3A|&`K1U8)Dv};?kQ-ONUy+V0&^DaQj!8-$ OTIJH6YzSR{oKQ>&U9DkD>?_HT*=5xlVi12t*+Gt^6bdoDR z=_nt}ajq|F&G=Or0ra3!asezbNmQFSpJSw4C^fygwL;4+$fqYKs}3E^a*ic3%fMUa zgi2Z1-XkVbt6IqSX%<(5p{m(f#oxdU78P 32@w~h(tPh|%4@|{ zJ<-P=?UZ2TacwRiTiWv1uG{75*uJ(-Gn(HBqH*|;XOb1JQ5Cl0;79@%w5fG7P ))+p~B3=3qVPbmL;g zRE!4am=|i1Mm%kSy`M`mGwh>3pWw-wqKx3r7AX7wn7Ks (JE0j(Dmux_sI z$>?N g)~Oc!@!rCVho} z>(QEl>r7}5e!Cb|0tqy&1-c)j0at;X?bNL}mjZ!a@!8rrZo(KhO9)7A-@$XP04i=_ z9Jg0FC6%GQL67_dZcVY01nkJzpXDvt=n`Kv#$Nryx^mTb>5MyT_Ip{#%GFCL>#5?G zTVup9{?}p^B&L&{1uk`vG-W={5zJz=t+ii8_H`Hix9Ga)|AnY{aEJRG4k63$YoXS> zB12C07PcZhmuV-ce@wi<=3hIIB|Mi)KN6Up<>Ju>&1Ce7mwp=3rcBM;Is#7=I7~YU zK*YSSw=T`J2A_PL`-&KlffED#de}@!3Z&st&1#0^f1P)GOtGn}m3Ery0+`+jH`=nX z%HMca^o~o-vgA5x(J7_^!D{XctbU)jvAoX@^uNf~#2j2h53 zga7Wmb<$vkn0m=fo)_FjLEy^-48KeOa>Ly1WntGJ4gaIu79YaphKs+eR!1AJ8t(m{ zNXn@I1YcFo1NfG&00bG0AM{HgiC`b$LuhRW&dHth*?zI;7wJF_+jcn3eTl#qSfOb1 za25sJGaFN+J`X9cXZKzMN)i4DsMV2GqmUW#p0=*jVhM$Mp2-TX6IB1KFb)MH8_}GQ z3^4i1k}&Q1dRkVnUo64|Drfov*WAtfeAM&Ve7?uob-Gpx&d{7WZVV{&$V>d~|BWCi z?**%2j$lPGw(&EhoD?Eh@EcfHnOvG4>Pymc4(^1v<@)=Be{YD8ixC{Mf;b}N#ot)E zfrB&2c1&;tzjwX?mZ`&8AVl@nzMPkV4vVbFv~YnK%ooaN4X_pH@AQO;R0~obV!6yN zjKN-rG-e{YHO1uT^~~_U*7b(0_4`hm+DS+~i2*4gjzXBWvXN`}j+pm2>3cpLY}t}E z_{`kjZD+FVqdTK$*f)1b1zIjL`9;{BoCXX>cnmEZy!)o*Jp}Y?=ien^W`M8I9g_9< z;4Y*L#HRwqq=`<#kfoEbst&fgRqEJ0Mz!G42Fbd!z{Yjx!+S7CA*ezniwTZ=gJ$2h zCF>%P``Frwi6)*GXbfY<7i}X0or3zVp*>SjL}4cm)jc}+6d(6}{h3vuRjCrc;)C>T z_E9yfr~OzyZGD${3z<>&DI0lVstCIYoi)#iCjCC{mwy+P6H*hR*HFChg-7P;*Ni7r zc8a8EMc-Dbu^qX6cvme~*?ru;DzwF!qE;RTF!Vz9{)>BlKkQ2qq<18GS)v8K4K!d% zY2&0^4`#Uox=<)))lxyH*bOsR!rE{83|&n8s#*Z6#b93OY|JvEFBE-S%yZME(%-BH ziXpvqtnOOUVED0Il>`e$lSKKeEaJuC27yo5$=r!ol#j_wxFHGKTfC-&c!OSqK1`;C zS!JT#+h2!6V#LD`IkiVd$09&}(#HzbR@AULcxj#R>7dL0e3{NB+~7|Pm=SP98kArX zSP@j|Rfua+7rh@Ks`|+X6MdFY_35i6^@|2=M!oV?C?cWlB&hU@wBL!bP^D|4m1^p* z&6xL$phEyfW-PY_B$;j7;PBVvh7 @|Hz8Qas-p7QSfBP6`+S;&+toX*Fwu z8f*z61=QcGxO7mg+vxsRbj^&jj%y@(sUFy1;Mu^?yLNATo1GGh6@Vg`oNQ6r4|Q z7H<0Cw+s UhC>6W)q=NakznvyG-G-l*`!ZuLwd&MWpgm$5xh%7+`BAN=l^r#TQD)@`H zCG6_i@nHcsf!;S$`W81!h@Jtp{)fq?ehoN3cE7Ux!%Ot>HO8k-=xdIyjTUr4-aG~C z5q;Gp4spFn#PVF@(0;7+G)j|B5ObKMKh%pXXQ>-PxoI#k0eglN9NX}o^G7e{M!kc6 z@8H-x0l^I}&z?%EZpdcpDDKqPZknQs6IZ5(iXCMv{aX%UMq)UL3W2XkTR|%_ pRADxQ^J)Lbed%x+`{km}@f1$`j4V71a2 zKC0p^oNw*AvbUIi`*bF|$A?_F$34$!%f!%x$2;lTwGkP-v&Qe$5+A^h~5m!^?} zLE3r8#82?ECET3{fzA?>G{t3r_omk!9>C=id={?;X+sR=$xOCTgpzGSgg9J?iGlWS zmLlG*$LHI`6-J4e(HE*ix`fAmJR{|^N$v_(R$r{vc0*tGOOI!(haL5i{@}~iC2$~J zSW#Nj?s@9-hok0Pz0HrDl;W-l6->thh;SxXjSNJCGku#E8{g~uq_QuC2U-#9_tDhv z61Xy|YZc)2^RT{RsTk@SBgP0+3Y91ls?R&Qqb966xpVhMDL?X0(yO*?Bx9idtzUvB zg*dQo&g%PBHSVTuVF901={U@AQ;a;O2efIO5iEFXYB#Irv7zA?XQ(<{0H7;DwF1N% z-9Xz0WkjZUsva6JqUD0`u-K;kmmm#Sgp`R%)`=fsy(;-J9GG{BGv;J5cdA02D{~hX zI!iQ69WEL3C%Pa@T)CL`rpI2w!58oj3%ILLry>FhdnLMG#4OaAKNNxGjN^3a05K9k z;(`%g$r|FhRPirqhjg#lLhW>xYetPl5n|P;qwiVZ9QtxS40)*ZhLAL-J){N~;<>)H zqLguRiEqbxziPUeNaEWA*vFDPT?6?msrq*-2dg`K74HYdA`trL6|)fy5do-YVyRlF z?V%ZO59?%h8?i+4RZBd)i)qA}+MFfw{%W`zX~^GqfX1=+LehXzqmD&h{YD{JCcz z1QB>IEKVNJku%D86NYDKD2xR(8gMvX@%ID6M(M%i8S;jR!;+%%Lru1WnGKGUVa0w~ zG8)NGWxamMMc!aRZw4reS(ncNe~|} XS~U*`|jh~7Fy-n z4Gx+0auHMse@!xO#*Ojx1k9`zt+bh4v3@i^I_y%(d^ShA1^WxBXx5%|4j^WE3t8yc z$DJXbHF>?IH8J!+-ZR4N3Y7wC_K}3+%nEaLGlpu$|8-hjh2&hik|Ik8l77BX*{=!i zVE2L~Q^4(d33J)j9ZZO3Ghls=cqKv+hIO8lDizW-Gy+2j8Z6=i$$% zqyQC$WQm|I1gp^Y-pv9AldBCdFsAL;eK}T S-}KU?A+Vul%Pu29z?#P%hr_nOo G4w zEShpW^$%w;?-R1Ni{Ru2z0Gm%zgmFPfp?!FmQ0z}Zva%+)#!Y~w)cWCLcAHgljUu& z1qUU!SP1@X0#|3a@l&^48dHMmM$R}$(m3YQNJ3~6P;2p7n19(q*FEHe03pgOQ~WTk zw#7n`Z3Eq(A5#S^;I tHLfBcHz8d76KI!~wnPXn z8^`xZ@oV;-cy1KuH1sFyTN#LK>5d#Si?jz{R0o`#!=}?@ao-EUhQ)@HfPpI^zs;j= z{$ zn}PyXfsjs^Q!ryXeNaN nEcXmBAc;R-89>jJ(}UBC a2<13kt4pfwTcP&v&o9U(AAr^*t zao^smn6)buH`|T=B#_6W-6ZHAHk9Q<&T@tLts7AQt)MbD`28`sH+iptm#uo7>9*C# z6;J*4@KIpgVoX|>?=NCMU>KrmDvuO^PANeQsfJ=ocdO|0>{9-qJ7Ha%dt!#=Xl-{? z 9d5{i>(|~9_~Gmv!rE;rD0=wL~?g`;%l%f3$cnK&kOfdutFL$ zv=zXr3FQgz;_%c(SG3*E9f0&FI>VF=O?n@4LTJX5E45U4{bvX?`ASSUweiu2a7|y3 zAIHOsSc4(Uk+eJdP gj~AF2L|49=4%n(c(p>QR1P@-xULf~5>dx3$g|9c} z!|=C$E;R@ka$*#x3g2%ju#k6{iel^fp&rj`QI3Ks^}24M{9%M@ryMa`JYymRgYapW zKFB>W@XK_R0qNm4ipyXV-_dN2qwju&3{Zdi$Tz=8E;H+ys^{i7*QK1+{RSwpIRKYQ z0PGjj?3CL&+_2_v{98nR?oJulxCRwB&s|xX6}dbsC0?-AHXoW^vPzJD?{Pv1#T&w@ z)BI7c(J824Fs@{z;~KkFet!w-Eq@yqvyyumfpPlmbM }f+A$!XDB=y6~x t&eMpQ{wVQp!iiap z5)-sZoo<0$nO9AM5t79T>6T0SYixDa-2KZ_OZCien>QMYcz@Ao>RpeGh^vjBqtwjZ zDsD_t_rH5l=0A(byHAEDQ mDB&p5CmWRtJEeJ^7yIWk z47WeQMdu!K;Fo@y+^h-Y@Q6{+TKw?y+LW _2SDWFYI;MF zXd0eXCWJn;6Zk4=+`ZF>AFC6AFWDq-ubL%)nHrEv(3y4*EJ+>T#>IIr|4s&ZS^^DZ z7f{7=csk=o0k{{y7!Aq1Yk5p?Yy)Lf_-3CT&Y%(Skl&`7P(4#1!>S5tsHSDJ+^U8{ z1w`q_hs;S9;mbT=Kw_44F=KVWClK=uc_5vJ1*-JYsCtCZX2V>#0 G1}KI)ef1 z7+4C^vb^uYRi1#v()qz+>3_^sci^_fMGQ2x$&wcZy;`CPX;+aoE=FJyw)0Bl$cQHQ zYomo xvVGko z1SS_rd}Rx?D2`n>x`s`PHG@3iC5~)tLfLWb o268yzboP+01T?)E zmhNIIPaNyPr9Dnx95auth& fxND*w_2#G8@PLwVSu8ZEikfIqd6fBqr!dzCYa# z4&zE%`@GC@7NX{Kej`LI)^*TAmEHCnu(N9OcyPgm$V0++UU7xeYRFR|`ize{8n`+7 z_s)P>iCPoQ)Ff4|MJU@SH^qIn@_w}p?-E1a1uqyyccYPy(W+Ma89i+rDggcr+~?)m zmJ#cItBBqC_s&76Ew|Kux?tdDIErcaKCFMny^<9h!wf?{P*w4aiM=o*0Bzlz`zNuy ziDt} vytm*$qfY*1MqU~^ass0Ddh zb}d?Ms KSUr%fp!H9P-4 P>AFkyj&L3m-rdfhVcy;Eyhp7`!*JTBW{LBN=7~8Y=JTo9xwV3))l5IMS z{|Nx#j}WrQ^H-#znAHyBzBsUU5E?)w-|n=hras +*?8?Fpp&fLSw7u2vaK(iYB`4i{+ z_o50_$=BVP#8djuk4Q7m2U?KZ@D&-Cz3W#ehV{sjhg)m3@G9pq5wrrtm~ gM+!xL}4|A<0bZ>_*W{?~%g>v#sH9LUBNV00Ebp0}O(3{hR`?mjKtKYU7 zG>1)P8)b=+HbJfB3%H^nP{)&%Fq??$e>fdc9ZGkbINzd7*7pOHuBGpu<22&o-cmRs zU#XVOppG0kRu4blXcfF%+R~&gBEAMsO@WrZM* zSLwL+z2RCgBe^jN*4?H{F58Iqy(W2;5TI0>YKl^Ag&A~#nlHe+`ls@0Bn5M%P6(RG zHpY$$K^DINf$DpM14C{yzHBYv5EYwCMYiTGuqxvUEc*R>-BA6ldtVYZ_Y*cJVll2i z(EC`Ezwg@;iW+yZ45p7>WA0=3SsiR?Ds*q2HKp5sE?I<=&Y8&1ov4koBj&Quq@QbQ zia*9s&X%YAA%mg&evPw0 8?jH@>j~8T4m~TB$9cAbfvJq|Q&-0raP~PVc(`^mwy)-Mk(M)rmVGnql z5s)6Cr>*;`U(JM;|8n(R8(6EW97JdFb?Y@S;vz%t0XNQx)_Jw8Dn31Sao1A;9YO~u z`2qV)>%7ZD0WZK~U~_^gkrYj$ zvB#w0-r67AmI|)hFKeZVtf}X{n@rm +;EPccVV&b1EF^bYw zij%Ag6?jEtI`#;@r8l(&;W5} zlKE$u@I52DUbvR1&7SF!ipexh7mB0f$)j|R3F?5Ol2kx#!Rw)~*PhJ}Df4%I-=r=N z)x3CL2e5h}mNG80O`kT)#Ajk;y+WwNr*0KDCblPUgW#Y^e`#Y)dM9uFqd$ Wkn}jVHvCNxM_@$lzq?lI`b28_2>Q1*+q{v(pFi-N zSsBv>=pSB*6uce*rM<^W+-;`KMRlGBAfw0u0MhV-#0{NPb?!8eY`C05jcS`Ve_!Wh z9#5P&{yP4-4P Q8QM?q~cb0^}9`i681q? 5yy|;nxZ@F1)qDE&O$L_mvb0NxSxf;{j7wa>i#_{7>??@h2hZXkM* NxgAX7HMRz~8jKOI#w7BMWu!;vQ&^Y5b N0;5gqy`$XHVonU7kc5w=hDp1VQ2mH(AOq{oN$t<6PGH zz5u^KGl?MVFxIWf4>S1FWRnLhzg(00^#clk NYodAZ-WCp*14OYwLB|Av|9^%7b3av~DYFVGff7C#|QrKFOSG*4^Lj zqinpJyY9eCyYXxF#H3EEra?RZywcU<6Y6JJlmrWcp$uj*K)J7GYO>f4Q$7ro#o$7@ zuu=##n$)xf^}cfVZy1I&xS0#OaFVyVRX @@_g5+6aOWvPEs;3^0GbPPo>t9mYmR-tqdYL#{H# z4vYz|S5^85%KdN4;6KAO0nR4)Y5H5E1&w(!`soSllU#8K7*P(btOf%0Jz>DyM3B-5 zr8>a?!RV-iUT1g>$_4u!R}hGkAI6eQ{Y~vc=RZX9nN&Y8rmD8b3-6#EqI;v^6!PM! zbQl-xeg3106qi4b_Hc6dn;Y68(4s_xAPuzBdlORAZtnbq`DM95Yk54)&6y}--611! zvUnjxfA#%@?*F+#-u^z^j1(d^!x(_3Uurx#k%8ROby0TBgX&~EjnkjFcp8Z2H3S=L zf;Pfl8Aw%?Z3R7e$8Obn+n47>^`wp?Ceza6tF;U&;sh9(ZQJ-A(au1AT*v*48>Y3p zn)=7Nb6Z!qSZ7jGo0DHx5? K _%GQ^)9*z>ai7x&wo|+dB0C(aCc<;sAn~2=65lE zsdzcm&_9%L(19nXZ7w=z##v!b{!iG5VEP743Asi8Mz|(Dhfm{i`ov;-9494*ZCg zK?MGF-^zcq0m%Z|X|UE+-WOI6(gH*-ScBSvLQN)^!RkhbYl4Y3#}NRd3qST9x#Hnf zApcZgbo49qKY>UiCR7QMAILqt94%eO5M9q%7dP`F 9xO }jQp+%EZv8+;yPmAt#kPVDa;b|`{25OL|HAx%P`%y!)(7UaZOF@X zoIs;?M^>FF??3m%q2Ky?d3?CasJ&6;-h98J?7J2<8<{J(uTV6mLVhbqOd6QJ18%&r z>lQ~M0DB8|4BDMXeHhry4WG=eM0GQC6_$qzpxV?OLo9B+CkX(E3JYHw5lsf-4ts_3 zWV|p-vf%tNL!YQ&^ly^^8w-IpN}SP5?>$LmUoCDCm?{TScdsmcadq9a ELH zW}7F}v_PgXoOc{Hw%NUTe`=Co48cvQAVrT#Qm6Z#3;m@qx+3=lgoiXBSrplW*KkWq zHd`EpE}@8)C;o)hvN %20rLm>63)yHyz6(f zmq8YVqNA35ZTBgOHb1rZLI#SuOnUb;ZA$Whqad0<_vZ}KKn?l}( $oOya<=^ zTZ84C@v{~&7ZJ>Z+FhMtS0?ESjdx(x2&f^F0lY#?Qe2!W)p~AEhK4gCrH<~MKMq7! zJ~VnY2lQIGKcAa4K!}5(pbScVw>@WIse}TGZh9nurT@+e-+oYn0dolFjFX8v5rhK0 z4ZO?t ug|6=s>YCk z0-MujXE24+F_(Sy+^Y%pn0V+(dI*>!FwT$Vv-z7U!^}CpcUnsxTfh24cf=%HXF7k) z6{3eiH!QQ&QJ7d!eb4VROn+9lK>h@YQGq<02#(e=}7?{<8j Cb2<)%6dRL*vgqZ-|Ti&aYJeN4{9?Dq;ft$xem@%g`xRSOP z7v%78V${DX0&wJy;< 8v3pzXe(&HZm68$jUQ#X=}tWd+X~~<-P+7pT*#kkW8QV|DCXb zpO+rtvv3OUx;H<+s~@{<
zAe#H)NxY!82gCie$7rettO)}s4|7f$40VKS*h)e_? dNbi>B9D=y*c??f2*Pe zJ%|>ckj11qC$rEVQNJ0&f5mT%23xF$iu0+XE|ajF!jS!0II{GI;VL$&*bra*#L4_| zv8-8{3TO}(o}4nwv?s4Wlgc_Q2B68%hQmQJRVv8AYTcYEAD{Rh!4JYJmyC|T+O7yr z>yN0}SM!@$3aHd~RQJjG5(YS?n``5uX?+2Det0L>Wye2;h=^Y7ujAV7ft@5KhGVk6 z;Jc{ZP-7 N)8@IjbVzzo77}F9ADVFlfyKltEA8`lI4fT>sYP@gmO^%5;@gr{%&he}= zCZ24{r>$Vo!EqXvUy7ddc}{q1rjI$Bxo%O)92$q7C0xXm11y;7T(rb^d!m$NIxNs- zo)E{^2%S9gYrA2~bbw8&vF74Fwc=<@v=cK1P^9~d>p}0%pmGASkhy-*vV*FE6m2y} zV@}#FAbBewLwC^XPyU4;y!#248M4W^K~mF(+1K{OPVqRT6a_4)Tc%NN^xwH3B-!%m z!*=yn(%Y2_Q~&Lk7qJ*1h{^?1H8T--|6MH84MHUU<0!0RMl9nYWODCM$Gz0+N;LYI z-a;~(^mpJQRp@5gga6T&0gtxNA6k$!7pYrDUvaQ9cz3B8fi5{fRgr0t737!40t;>T zH51(CVUY^VEh5rMX0(iTxA~^t_rvE~*82z40`7O~lD%74pcY(7=&HwMO2+1e%Z#BJ zCk{0*YV4bppvCPJ$3EY<+3bOv^apkv167qP4TGMZT= kNo zedj&Yq(#$Bq?&}v>3e|1r4~?0HU3o`$Juy)@YKLMnn?e>WTrx)s_Vg|na5NI!%kI@ zzJi7dmwEd*FTJE+Ha; %VIaE^ zp;G9O`5EojE&RVykanTtQwG=@v2~do5sTXi@s-H$ZyncnmP_u2N=!nrlqGdjmEG3S zZ^6pM#Wh0Dysm&~*3nlYVZJGX-|b-mkNn|f69GQ?@&a3159u%pK5~s|NvIe?g3!gJ z^{?kD@;)1qFQVsv(9++Oo^w8Li3A5)q+yztYydVU>Pr-3>7RCc8rCK#08ZG7 d8(ioT@n{4a41H3+|28!OCQ9CW@oYBYqPea z#kf2?pf_DqeQILv-=IEd(@RNvsB&0t#QmIld$oLXBeUxx&Rj#D@a9Ub6x=7(UsE?- zs;2U(@cN*f7L?zD3XQO>rRc9;?q-tATS9w`GuQZQXO~0|M&P z5X `&N{=O-zUNytGWR*&%v^V(sZ#CpI!z7JBVf6TU`=bJ5;7ZhgKJ4k4wn2& zw0x89b*`A_Lduxm)-zRQ8_0dD w4R-@zB>|Y6 E}VSmWn6G2(A&JAEB7evs**HqsKAglb##r z=-(3zf>CIW5LU$&Rz|Le|7y@&j3mwcBj8Mz(`Z!t=tks+xY#W_4#_aU1Y94JH?G;+ zQl2TnnnlznwjjF-)h3?oUx{hl0BP=mgg9Z#QHcI~#M*j`9QvGZcT{yeF>-8lV?RAX zK(MsF{x5*RS%SvNmo$GfF&KNc6i-;bG&y*x_YKl=fWW3i>9eEv(G%DQTR~(_3hw>z z16atUm{-ltIda3 9?K%NFdCpa{_1@Y+c5Woat#JH&w53{6T$~VH`yYj zhWIAH)(zjcjSgq;Sb7oa{+P{|!n3aZHeb0-yrT!z)7C7@c({uKHg*MeS}+1eMQD-t zE2b!4j( )wukpkIN zPkV{23W)8}%z_&YB2UEn6BG*xd0R%UrfZX?WfoAXsW*9Vdzv7r5Y|pEGXclAnjVHM z!M;?nq<8{kgqrlwPT{*P3^cu@YW+{=#2v|`@~JMk12@HUt;H>k_>Oj<;~^ i8l z& *8_d|H9+DuzG?@tjzlF_qlV0S>Lv-j;%9iJi5`^HSZ*2;b88A3@j;L<;^D<41W zWcZaZiJrZzv`k55t{AL7ea%(gU|2?*>Hmtet<<&Kf_>j?y^>Uz5Ef*dtUX6TcJ`v7 ze}w9Wb?as>Gk^A1#csK 0qde$h@rYJTI-dxu$|&rwPnAVajigAnoe-O$yLxhYylmihoH?)I1-|Lo>}%m&3Z zw3bYF!L}zy_WWRUVz@hdm&0nT2n||&RKb&S^B&zG{87If>(9Rnc$HzmL3Hu$z3e(8 zF0Kkjmgrm>@L+vO{1dRHTeH8&6n#e^DPK~E-O?DiTMeJZ9Y4P>FE@P!FO1kT;X6A( z18>o^ei4F89hk|Up7;jrevxeEdnmE%LR}fjEmR|L2lPdkx}R}@%Mxs3y|Ct{na>7t z0L#l*<7;Oid>53j$;T0x?!^)R6{5EX9Eqp@ZeC1XlCl(s%+bfSM)Fp%>t+;dTe$Dm<=3^d@0k`b zUC%kZM3jF2-^QYM!kJNZ{h_rgEk7tA7g@9KsM$Z-Cyzfs+!A`6yG1qGzMM&@{v)PQ z&jRABL8J~PZ+FK7^S|15VEfHo5dMu(xfuNH%k`ms%wfeHw^cH0lbW?crfPg-Ya$wJ zj{1c8>wtVR4HwAHx{IOB|7qtezoL5EJuW3B2$CZ;gecueN=Sp!NJyvDI0HyYOZNZ* z!T=*RfP{2|w9?%rIFxiLA -jTC_#Pcz zxw8nA1 zMcH&=d(fvBVHIL~3c}2|Wn}{dNDQycPjkQI&a9{y{D;J1*dNc(fA)gw`h-~TX;TTL zKC8;qINM)}KOx8`rP{Ji7V!r9KslkY^@sQKMYtG=3PBfP!3ouvn;Bl3UXfW6PeAEG zebjk(<+fBMQCwLUwY= a}k02S|9 zL5-?Vj;4xtUL?aPm^Oc}LG)qahbsM%bti~i&02oL3=4tSuIxJSt4XYwsbMHx!k-fo z3l3lQCk;47IGSq`5>R*8b_+YfQ2oxB%L|~9k+~;JYXkD4iuw=B9bR^a0lL5<{OL)9 z0$;u)n252HKN9B2;<1pH@fPi?^$XtC?Wo-Tl{i`-xW#D-He7hw>1)Q=V^SL)M$7Aq zCby %n8oCd4LO^Cb=L%_n94_U!Jq+ zCAkE8%h K)+p`CD72yASj(UCl64fA+jd+-5aXy*vvcCY zL-mVoW6I=%9FI-0?CL10z$4Y 3y?R5YJJa02mQ0(*ug21gb zjW(m5B=yER4)t=di_=|-((BlC`o50q@S73V@L4FW2 UmApFX3E{Ge395Pi|`C%d?QE~gV zxj#;g=G~PLqhJ&(whw<5Kj}7vr! 9P& zTlZr&F-9iRI|Ouw`=a+O?zK2!6|K3Bc)r{Xw25Uo^|l)1D{ee4bL^m4o#)je*#LLA zoKx0qCQH-EgE>qR_&cG0I_IrC3p5aP1zX>f^I7Fr63DvgQ#2>=*b1Y=mA9C0JT%A( z38Osty~$y>I96HY!Gt(_Rg%}jb$@v1YyZH1yK2vHD1iDJ_gkZf9~3o}_GX7kWHzWM z7}#0Hym2D& YWRuWZ>?u_YlqzI5Hxi7)UwXOO@+K(@ BeGVgX&=#SCT3O4a1jP| zkwTjpaEU7C#nvNRfBK-@7_jfIF}NO;W?Yg|EPpmja`0Q0X52 uxmlu0UY(0fzMW< P0Qfsns!=#Hn`OCaxdFk`otIClVx(b5Zqwq);nHb)>c=2@ 3rfplzTCi zMGrEI0YP>^dB+GPtk_l?wX-}*_1wd0zOk&nkm4NAh2W-fK8E`po2oW(Z=CB7@ou_b zY3;aj9SS8f7W~5OWIXhz^yUsPF6o<*CPC!~gT_C`>H57+GQaXIwGMQXPo{aPdx%$F zG05WV1!`n|of=SPn#5?fBouGEZHpJm*usTU5g#Igl>CD46+Og-6ATD=j)i?DS))x| zv1pJYopES^zo!}>Q>q;W`r=B>ov2)0>6neP@Z`kcl!l3r-0J3r@;BRBI#{nOz&Ol8 z e_k&WG~!5L)yX}m#Ba3dZvzTaRTL$kquIqnylV_`-Xo{ z{}C&^pWZ=`VX4 0nM7;)-vo; sO$*tt2uYE6OFM}7Bo{Pqtqg)>8^wzcL8L!nK%X2gctR=tI z(wOmdzj*scfA*R8t3W8{#e1&6-CE8z@tznIg%^`Td8yvqhY~qWZ?YWUswCCDyARXG zv{VS#NJ>`R?wHgDW_iW?Ml+4-yVJl4_>y(4dw9;pmNe-%drdSDJ(3}o%>gR8r@5(9 zpc58rdiB{J2N#bAA+*bvIX?@UMJ(QNKa9njf^0A3IeKcHA@DNoGj@aJ!Lw#<#>(Z& z2gFs!OM61ru0$TPkn o)U+QMu9)X^OSNeJ;hL*t(#I-Mvl^G;eOu@x zGw&4&sMi{kWLqQa)K^aL^$Z|X+LD4EW)bRg85>bhK)qgUvNmF|NkPugO {O!ljB-XQ6HK*BlG7c2LIz&XRR9V9QxzwX-Zw-SFNOB2TSIJ7~ahO z3e)jW-mxj1_(NiQ%Jyjc@*YDfw@l<9c}lr;aWU2hzOPlhIC~AtI|*D G{kTHv3Bnk^$j;Uq z@-z*3@8rtU@p|iM*b5t6a>@Np1e-3Nf^=}Ecq(Bot#BVhg<&o5)_k4v31#A8&BozN zqoR9PZld3*@TrZT>epFQJBh*I8qM(Z@_T=3b9zHp(4P@Sx8JroBu1e44D^Cam&?_6 z-4KxG;o%1KTyORa=nnfB-+8+r6x1%kx*&!a!WXi~kvXW}QT8v&ur6QzedkjnET^u3 z?m*EZRv)C@%2KgQ{R8jK2kY@EJ^0Y&eS 08TX|t?q?g#Nsw;?u~Uzfi3dw| zRmS3^mo;OY@IF9=B-50&s|B(8j%7T#VoRz>?6e)8rMHgpC5XCEPP8KX#wd$*->{Cn zdQ?#|up?RT@$(5Fh#{ gNfh?gp}q5>N@ogyXv;ftN@ykjS ^&RTv%~#s6itxF96)`u+=hSB+m>#EXi(6oz9`RM{-(g& zCf$-e9`t* ={ z$75N4shN0~!a10jXPgqVwEdqLkaG5yn)!$T@PT+n4(SDdm$m|JnZsCA^+OD7Q&tXm z=p23W{la({Fya9~mWqHV { + // Perform install steps + event.waitUntil( + caches.open(CACHE_NAME).then(function (cache) { + console.log("Opened cache"); + return cache.addAll(urlsToCache); + }) + ); +}); + +// Cache and return requests +self.addEventListener("fetch", (event) => { + event.respondWith( + caches.match(event.request).then(function (response) { + // Cache hit - return response + if (response) { + return response; + } + return fetch(event.request); + }) + ); +}); + +// Update a service worker +self.addEventListener("activate", (event) => { + var cacheWhitelist = ["react-play"]; + event.waitUntil( + caches.keys().then((cacheNames) => { + return Promise.all( + cacheNames.map((cacheName) => { + if (cacheWhitelist.indexOf(cacheName) === -1) { + return caches.delete(cacheName); + } + }) + ); + }) + ); +}); diff --git a/src/ServiceWorkerRegistration.js b/src/ServiceWorkerRegistration.js new file mode 100644 index 000000000..fd0e8c5a6 --- /dev/null +++ b/src/ServiceWorkerRegistration.js @@ -0,0 +1,141 @@ +// This optional code is used to register a service worker. +// register() is not called by default. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on subsequent visits to a page, after all the +// existing tabs open on the page have been closed, since previously cached +// resources are updated in the background. + +// To learn more about the benefits of this model and instructions on how to +// opt-in, read https://cra.link/PWA + +const isLocalhost = Boolean( + window.location.hostname === "localhost" || + // [::1] is the IPv6 localhost address. + window.location.hostname === "[::1]" || + // 127.0.0.0/8 are considered localhost for IPv4. + window.location.hostname.match( + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ + ) +); + +export function register(config) { + if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return; + } + + window.addEventListener("load", () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config); + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + "This web app is being served cache-first by a service " + + "worker. To learn more, visit https://cra.link/PWA" + ); + }); + } else { + // Is not localhost. Just register service worker + registerValidSW(swUrl, config); + } + }); + } +} + +function registerValidSW(swUrl, config) { + navigator.serviceWorker + .register(swUrl) + .then((registration) => { + registration.onupdatefound = () => { + const installingWorker = registration.installing; + if (installingWorker == null) { + return; + } + installingWorker.onstatechange = () => { + if (installingWorker.state === "installed") { + if (navigator.serviceWorker.controller) { + // At this point, the updated precached content has been fetched, + // but the previous service worker will still serve the older + // content until all client tabs are closed. + console.log( + "New content is available and will be used when all " + + "tabs for this page are closed. See https://cra.link/PWA." + ); + + // Execute callback + if (config && config.onUpdate) { + config.onUpdate(registration); + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log("Content is cached for offline use."); + + // Execute callback + if (config && config.onSuccess) { + config.onSuccess(registration); + } + } + } + }; + }; + }) + .catch((error) => { + console.error("Error during service worker registration:", error); + }); +} + +function checkValidServiceWorker(swUrl, config) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl, { + headers: { "Service-Worker": "script" }, + }) + .then((response) => { + // Ensure service worker exists, and that we really are getting a JS file. + const contentType = response.headers.get("content-type"); + if ( + response.status === 404 || + (contentType != null && contentType.indexOf("javascript") === -1) + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then((registration) => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log( + "No internet connection found. App is running in offline mode." + ); + }); +} + +export function unregister() { + if ("serviceWorker" in navigator) { + navigator.serviceWorker.ready + .then((registration) => { + registration.unregister(); + }) + .catch((error) => { + console.error(error.message); + }); + } +} diff --git a/src/index.js b/src/index.js index 5ff033731..1d67371ff 100644 --- a/src/index.js +++ b/src/index.js @@ -4,6 +4,7 @@ import "index.css"; import React, { useState } from "react"; import { createRoot } from "react-dom/client"; import reportWebVitals from "reportWebVitals"; +import * as ServiceWorkerRegistration from "./ServiceWorkerRegistration"; /** removing console statement in react prod build */ if (process.env.NODE_ENV !== "development") { @@ -34,6 +35,8 @@ const Index = () => { const container = document.getElementById("root"); createRoot(container).render( ); +ServiceWorkerRegistration.register(); + // If you want to start measuring performance in your app, pass a function // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals diff --git a/src/serviceWorker.js b/src/serviceWorker.js new file mode 100644 index 000000000..dbbf1776d --- /dev/null +++ b/src/serviceWorker.js @@ -0,0 +1,71 @@ +/* eslint-disable no-restricted-globals */ + +// This service worker can be customized! +// See https://developers.google.com/web/tools/workbox/modules +// for the list of available Workbox modules, or add any other +// code you'd like. +// You can also remove this file if you'd prefer not to use a +// service worker, and the Workbox build step will be skipped. + +import { clientsClaim } from "workbox-core"; +import { ExpirationPlugin } from "workbox-expiration"; +import { precacheAndRoute, createHandlerBoundToURL } from "workbox-precaching"; +import { registerRoute } from "workbox-routing"; +import { StaleWhileRevalidate } from "workbox-strategies"; + +clientsClaim(); + +// Precache all of the assets generated by your build process. +// Their URLs are injected into the manifest variable below. +// This variable must be present somewhere in your service worker file, +// even if you decide not to use precaching. See https://cra.link/PWA +precacheAndRoute(self.__WB_MANIFEST); + +// Set up App Shell-style routing, so that all navigation requests +// are fulfilled with your index.html shell. Learn more at +// https://developers.google.com/web/fundamentals/architecture/app-shell +const fileExtensionRegexp = new RegExp("/[^/?]+\\.[^/]+$"); +registerRoute( + // Return false to exempt requests from being fulfilled by index.html. + ({ request, url }) => { + // If this isn't a navigation, skip. + if (request.mode !== "navigate") { + return false; + } // If this is a URL that starts with /_, skip. + + if (url.pathname.startsWith("/_")) { + return false; + } // If this looks like a URL for a resource, because it contains // a file extension, skip. + + if (url.pathname.match(fileExtensionRegexp)) { + return false; + } // Return true to signal that we want to use the handler. + + return true; + }, + createHandlerBoundToURL(process.env.PUBLIC_URL + "/index.html") +); + +// An example runtime caching route for requests that aren't handled by the +// precache, in this case same-origin .png requests like those from in public/ +registerRoute( + // Add in any other file extensions or routing criteria as needed. + ({ url }) => + url.origin === self.location.origin && url.pathname.endsWith(".png"), // Customize this strategy as needed, e.g., by changing to CacheFirst. + new StaleWhileRevalidate({ + cacheName: "images", + plugins: [ + // Ensure that once this runtime cache reaches a maximum size the + // least-recently used images are removed. + new ExpirationPlugin({ maxEntries: 50 }), + ], + }) +); + +// This allows the web app to trigger skipWaiting via +// registration.waiting.postMessage({type: 'SKIP_WAITING'}) +self.addEventListener("message", (event) => { + if (event.data && event.data.type === "SKIP_WAITING") { + self.skipWaiting(); + } +}); From f2b62e2e8c7ea26849b4cd15ed9d151eba8350ae Mon Sep 17 00:00:00 2001 From: "Franklin U.O. Ohaegbulam" <46662771+frankiefab100@users.noreply.github.com> Date: Thu, 30 Jun 2022 10:09:09 +0100 Subject: [PATCH 02/39] Update cache name --- public/worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/worker.js b/public/worker.js index 75b51edf5..74f18a509 100644 --- a/public/worker.js +++ b/public/worker.js @@ -1,4 +1,4 @@ -const CACHE_NAME = "react play"; +const CACHE_NAME = "reactplay"; const urlsToCache = ["/", "/completed"]; From a2928d69c430ff28938b78fa1a4f9ff1f1647248 Mon Sep 17 00:00:00 2001 From: "Franklin U.O. Ohaegbulam" <46662771+frankiefab100@users.noreply.github.com> Date: Thu, 30 Jun 2022 10:10:22 +0100 Subject: [PATCH 03/39] Update manifest short name and name --- public/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/manifest.json b/public/manifest.json index 79b792b01..1e8b0660e 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,6 +1,6 @@ { - "short_name": "React Play", - "name": "React Play PWA", + "short_name": "ReactPlay", + "name": "ReactPlay", "icons": [ { "src": "./logo.png", From 491b5f66b693ae55174b56b301f7d859e71f32cb Mon Sep 17 00:00:00 2001 From: frankiefab100 <46662771+frankiefab100@users.noreply.github.com> Date: Mon, 4 Jul 2022 11:49:57 +0100 Subject: [PATCH 04/39] optimize pwa --- package.json | 1 - public/logo512x512.png | Bin 0 -> 30830 bytes public/manifest.json | 22 +++++++++++++++++++--- public/maskable_icon.png | Bin 0 -> 30738 bytes 4 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 public/logo512x512.png create mode 100644 public/maskable_icon.png diff --git a/package.json b/package.json index f841e5dc8..3c222d764 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,6 @@ "@types/lodash": "^4.14.182", "@types/react": "^18.0.6", "@types/react-dom": "^18.0.2", - "cra-template-pwa": "^2.0.0", "date-fns": "^2.28.0", "firebase": "^9.8.2", "graphql": "^16.5.0", diff --git a/public/logo512x512.png b/public/logo512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..8d1fa803b2fdaeedd679b1acf06dbf434e365adf GIT binary patch literal 30830 zcmeFYby!v3);7HMrW@%7r39oKi4BN!r;;K9g0ysPLJ^Se2I*G1*&+=B64Kq>UGL(Y z-#PE|J^y|Gzg+8L?`vOk%{AwUdyH| Ml(ePqQ20|i+(K6n42U2;#hR>l;qm*TJ+p;cCUGGZe4iYec(VpBjWtb zw^Ypg++k3}vt07=aD_EHY)qPQheN_OND9ZYI!Vc0^RhBnV}fURWPL>rjtpJ|$}np$ zW~>|SyBlb(uYad3+y}4tpzNHmPvQ$JK%5plHbJ6iC!sZb-4p5~;a3--VfAaHKZ5r$ zgn;hh5`>!4-Ee&VX?=8f#iLW2%vov-6~FjfnqXgr^#S-$&CRO2%W8ZsMm*}X_$;b9 z8o-DIFW5(POUt+DGZAsV;V9zQm1?|fkr1^;2y0>GyFZ4jWWLK%?CHz@8JvY~S?U{) zw;=mnK>~QDAG`0qG6@unV8=NdUrtFpo5xypV}L;)E_`jMBP$m%+Za1y*!?p3Z8|o5 zDk!TWnp7fr)%p!p(8G?wYw0Bn>G-?j>hC4di;ojdc;IZ!jZGJ{k&?LRo{x7j{uvf6 z1;h4B_^xptTMP+iK$n%`0jz9TU2k-IW;; id2*xyltA*JJdgmly=eX# zVtn)HL_wMhu;PzSxEI1$oaW!?sgU@$$Oz;pAr2%49O3?53Kt98l4W9YNU$u8-O!cd zd-KaJW5I6u3eNuw<%J02T*&^NCoPVjdn~c~na&lX8<=pm)+#&s?si`L+goAB@1Nz$ zWj=!vupd0rDHBmoMQ-hhQv*=pLRZ>t*uqEU>Dy)#>Hi&Q3Uy>WNHV~vieZDu3+@;@ z@&Q)W><# V%cY^P`)__Xt ze<>5xCtLz*ihRRf?KIHd`;PwRWML2}(7MKUKg2uarJH`x_`fb>S=ie#486;r*=1r^ zTmVC{F{2UzQfBnF$td$b_C$al4^QAU87tygBIKIPwU9;1)N!gm_I+t|r)_|m#qpmf z!rYKoL>4$pG|&{;{d8?)9Y9%+N#`mYGj{qCP7f5y{$~@Bv`|NagXUCZzJwUK>xY+B z;8t~Ha-B(f`dU9L=a2r!kO{gaAi@}We%kkZsNz>F(;F_Ruw0S1tE=<;`W82y|LB9x zuZ Wlb90Hw-7O$=|6c*qxk0134~Q`Es9vcLzQTr63&`f; zNW_=lhXrKNcryHVuL1B>=nbnjvMWUVzNP7oO#omWqhX=BXAa^PKKrj8@M$22Xk?$X z`#dflEJ` G;*g9&x_c_@jrLH`|t?guwO z66JJ 5YNq`F!a9ydW>$lz*1r`RTu~{;kmy(4qdr5Zp9~DO8m#kVbDcF zd KOTsw3i}4ZeS~D9(h1uCx`@MFW6i r$YW&*h&!W2Q8cos6LC? z@#S2%& 8{CBCBk4+Si*+hUfGy&OvjNGpPpDP^R z36QZp0t~ZxSOx `K?@e3xT9-3&24Zk!6_`-T~gz)~m zT6>Hykb{tVsNNG@pz(j-bO>=X2GQ489tUpo?SDOL3F)Ak8@MxllxZ(n>H5!nUkD)J zZ#qSe)P=Zm|Mf~aLI?%$e#)jS?w_TGpbr5H+5d)n7?gzphD7%%Wq|P?8v$?taisr1 zvJ{jL(5Txq;Q2?6;ElZh@5X;iAoBkS=l`eWM1Fu$+5$UT)DyOpCda?wzXec=dInqX zPj-a$dvTH(l=fh!u-BjD( zj92r8){hAX{?b!Ya1Lvtkw&dH{+i qHB0KNPQ>19Bx^-{$r zX%OzQMZVCX>!)1|-H0^|RLShUf=!bQ1yw_Ft&tMfpJp62k|D+9OV8fY9qbKzh4=rE z%Txj yTD$Na9MjBQzx{|Fzn&KP0S8Q!c zOBBM{%6q;kh+wYHM79Koh$PTzndn?Au8NL%THCW(JA>^*Qn8hiaTBlSeec4ylw!m< zm$9B0UtGz#Z`Rt8?^ff|B02Bg15P5a$9|%OprkAos0O0ohc)7dmK)ogC`GnQ6Ls*d zCG0%Z2xJ;}s*BZHs0xFOv|TO#iMyB|VR-OBLJQ8_U`wFLx`N4oqQKPXV?P9lOX%2) z&oNUGsM?vbGmmBKf{^E&=S288@6lG-_U9g9b7Nz9>>6frZsB|s<0*M`G_sG#QWNYx zRsomskHR{m5GvEs5+Y<1m1S>#eJP^c-~U6{fgh;}=?q1yl)qN&UcWr*;0*T;jv^nF zK5hDv|1x-T$dWS<6;^f5oL2eVP2%#1HdekanveStlBR{!tN^m!jqR{bLdI$0ftb^1 zYx# *KDUB}54T@;)xT^9l(4D>ZJkV`OzfbTD5I)*U#tTDyzd=Tx{`7(EL z-+#V|fX%XwQ!|x5TWv+|cUJRth>qdB*Xl`_hgFMEL}m~Xpa%draIS(1RaYnz%61IB zpR$0XT}tUE`N0N*mK>j0E-}I)3&;EN*7UE{+~0qEtu4IatDifcp~mm}<=>4bAwBzS zoQ9s}t!dU0P9&MnVEuj@FJ=YfT&Bd`6M4^gv%M8xeqW!#n^B4h$K!tfxXV}82}-5# zOc@nGtI;-TJzfe50o9MsrRK680Kb8b4JrdJ69cl#JjqR`G_ht|0YX}DCNXQtteu*g z&i96J&JK>+vfpQ$teH*sO)F+z%{?PWC7q~|%bVk-&MI#tn=lFyTGcdHC|Z}Xv)F<) z-O?QNke+2z(mS4uBq;?j@jIW|>`v?CTuwbH5HLknlcRe;04Qqj9u-DOBkoC#x<-5c zkGH>gMwK;)g;lz)`<(WR>w>H_#J+oP_j5Ye2MkPO_~nr6=*~eCM?(36UwCgw-oiUi zk1Mw_R rw_$|cL{HSg$ERvxPq zQ7?`qz{dS@tiAAPIDzn+S8CPhjPP<(;#+a7v26mA8?zK*jUeO_&>6nBy~tHVm#fzn z+h@tF7&H}klqmKvLhnx}?LDb*nc7s_;8n$ypi)-hYcjr*$DtIhVm$G7oci&q8#PXT zM092Grs<^5!_6b(*}&HX3-6L%?Ta(dg3qP1WmPv3o$)MmAbz8yP>nHeb*=W*X!H7x z@ScBTPDk=OEp0uMteH~uLLCrC5jy)q=V{o;S;&@oHP4t2`4yvSFXwo+eQ${Kai5At z(5ansGjUAK{ZO%Y)?YEZIZHOAay@+dI;Gd<{9OpTx*Q$wpdxrThZnx3cVysA&tVO1 zQY(JZ?V-=>&(r3`?3t?1afP(Y_*Pn_qfqQ%r|}Kwv_2FH=kD8D(H9$UYLN(*NJE}o zb1mZ?eGy7PbuXuFH>;f^@K_V_eF-;<)e7s#UkEJ^NW{3769#h~7GD6f!b|w*Jp67I z6Y*+JKOQ5LXHid` *3JV7&XVCmK8>Q!cN --{{qS6AQ`lG>ZeAVtVTTvKw|8#F#2A}pZk&4Q=^DefiJk{9G{e% zu`FL~tJpEi%7N%$?YYA%mUVLVhcMB=9h?@=aP_BL@oS5G`qGnVbeZa?g!>RxgV!>$ z<3geo*|OOFFqv?FZQ4VwgsQfvcq3-BrK f8(o}k2G@}6#0FB;u#Xw_^_W)7 zh5jrIkw~Cqgb{BwU7=U63qQKtZ4Tg!Ie5eKEuPng8U$qH2DBK3+XX1uzpWU?aYx_s zxNH#6M$2aC T~OV~Sj}nk=ULJky8Ioe-}>6S|LgpKdX{7rcDcrK82{ z#}7u6gZJIEkmb|c^uV1SRc3A(Cz0R;Z;kexy5^H-2(2nCjc+6zmTlL2aV4L9_UikV zO{FBRLrHJAghf yug^NF#s~)7*kc^Rnih~||00~p} z!sqI`XUjo^t=!d;$R90th$~w1*0#w#XYfiZ!6tjtX;1rZFWE9Ba!Dq*{KBi|r>^ zB8e@q?(jwANT~#n$^J>muPZ&7%~eDDoCxo=5f}|82bIS?{e42^ypAL3+5}BKzmNN9 zIlL90`YIx)NIsHJZ+HncPHtm)FiR!+Yw(-=NAX|7Jw|6+q^5dj(2h-?YagK?znWl) zrffOOX^P3LoVhU^y`zRWgyclR*}%!m+6(qW;Z9S=EEC_(J}g?7Ob8O>3yW=BEjXej zev|4 N;=U#!v_`dFpB_ghe;G*TN4OSi+?pBYYp#)ec)UKlFeaArYl;x?c zr@HTJ&U0-|GLM>q8kOA?rL3q(N}*``UP>h-peRk4;6LHM^=PLS)~(kUBbK+@$rX+# zJLe1aaSYU-$QcznNQJO4EPy@-r{^lVrlTW1KKX5{J)~7h@8>#q&aKy$EY|{XhR^*G zE-}D##LOIseY 1YYo4C+2VunL7DXx{>KE0~ z46n*LT`VQF2>{SsS 6c_fbuG6-Yl=gGcj|xfg_aq5a+u{~i%K${$K|r+L@!Ok zZ%!DQnh$?DCgZ>GYGrY-<{=;O`Z=yeFxhR^cVm_{J&YO=*r4Gh`;=h;1}+=vS d>1`Da$IpZyy66m`$`o>Al|NM87BB^M78it$Y&q)U zmL$)$vhj8Vu3XH%JOSjJ*@SNc@SXn>BQ}C1KgRWodoldh7~5isLD40q0M(t9^{$Hs zGT!T(w=_S8Yb^f0V rkF<2%FW1?))%SQgEb%<{2oXk&`h$|EaiWyc zv=x8zpMZJM0xv!*q 7p!&>1Vm$A_!HkKPKHVS z6yi!Ki$&0&OXMmJ^qJR+iSPDfW+~!w#on-vz8W5X8QtJs;ideyIL0ZXs5X#V{7h@$ zHm3|pQ`zBb0Pju(Ue=jShKQ2EcV7^sZYtmQeLz-vt$&R2p6v$3T(Rgw^IH+AdE+zg z7R@fEM}s>0(8isO(H)6i$I*T2%f3Gn9cU0uiRF>;G>RgMYe3?DYxHyPCMZ+7W>4C? zUd{~^?=Yh5A8|ia&5K&pZwM``5{OpF2@KdFt-RdCH(x6=gl@r~hmP~1jk{K}ej*iU zT)J(xEDR
+p+@S2EVia>TNAu+at&TM0Xl?J z=|HcL$bw#B?y5NFB`loNw*~&e n}ZID{tWgjSwr-zL QgW?_+sJy`VkFT_WL69We?RaymYhxNeLsnaz4*IU?`e#Y~&R!f6nn$a!y2jFjBG z&2fIqS;tr=f0{nQF}LF3_Aa@!hE#G{W>`%Q;SX{gSaMp2k_dj3gEqme*RH4B_$hji zp7K_I0F3WCM_P{y;Va+r1Epd2b?t?3^N?NI;;i0L0EKgR_@w(3(2EPAf)P$!2dSMY zv*VEnxnVk%AqH)j )qO6H(KN)P-4X~FDV)D(lx-N0yQRm+1;$6KiXw6{sOdXYpDsS) z;`G&=u=s_;>T^ljdePU&^wfnqGNE;ACg3H^?Ror N1BXYenIcrr*+Kb?iccr0?xsXVNa#&k*lc#wQrt_8w3;E4oPxVBPqct^Oy!vxr zvdEdEyWFn{z77`qoIzWo0Waacb;PwLPrp`{#Mk2aHT-$(3e!6_Z;fIGo#;rPXb?jr z0b)CmEZg(uL$%iN$OsKsoJLFU6F1!`Qb2YikbG{0gB&KRl%Q!~)#w%^mKxM4oyI(l zN<`2t1xE#Fqtwua@*#7#bUu=(&4i8P@tpUv@ZZI#BTh9#KV|k|&QYlVAJl)*a7NLS z1xs`)>)F9bWmfn$;SSY={sV-`t<;eCs9$C4rnQJ@|Mp((I8 aH; zMff1>G5Us}1=4dHJHZn>U)b(Mw@Sk6Re~XUhLhrvtX0C^&571j+scbaZkuV0zj+za zppMDQGGi0Hyi3RvX)5rVy5W*8HaOqD&lhV~9>9#I#3X*&e505X;P|@mquc=ErVDXo zgdNJ8)EZ{3KQ}u|5y0BIsPw|^G=KjDRK9X!T37Wj&`rPd5c;<}MR7NTVug@ARQ#5x z {TLiQZ2i5Zmwg?UgwL) 1nU7nu8}HFW4?fe~lOmW{m=b8*L%TW9WLTp~ zk>4@I^SB}dshq>aqoasi|4cH7DYhCFI+Y{cN&Dg%PPzwbQP<`Fe*VrMs*9y ojovB2Bbh3VLq-|Ng%5G2TAy~WEe!{b6amZ` zQtahK4>eMqd&b>T>>Hk0wV|IL_mw`$fM? = zWk1ff)RD~c*7la^>Air4O%*UZ%8LgfXw=rb4r@Gs5y{|u;BP G}8p! zp +=rg* 3V(RBPQf8=Vn+UtRlat;2tg;&apSIwNHBpTuLY_k4=lqb$Jne91K{*%iZ8#bHaV zP{nuh46fpL&yVbD5FIx4+IO%wS*1>+R0)Z0Y?^jysdkdUqet`_(sGAeROUUA>D>i# zq}`jGpZgrrdD5WcbklF1Z`7t&%0At!ijyx^ehk3^^MYq|>R=8O^JA}1Fpc7 `;hzzZY=;SL|GU^ zmWv_FZ>`r5R&Q!%A;#xY@uSYgA7+g?7ZO{N0fa;;jRZQ@jaBgI%J`VUCportbrKT@ zmGGa? sfGi|`x!<2*G3 } z@Mjq(t?|K%q#(If<*r?dKj`U~80)O|tae3JupEjat<)pX_w)GM_bS>C9whHH-6W zs)GKzMeBzT(JI5{B(h(|DMeGirp0}BiFhqh6XLu&cfVS(cN 9bbttcc{iYv^qN-RCH)*|7&HKLqa62v{9(g5}uSY+<-9Ioh)hiOJL7?$Y?f zAkTwh S z#z!M+aci_Aa?@!(irF9i_>t VEUrD_L=Y7HFt*FDPEQQ z7h84Wh>^-;QAJ!*3uqJc%kf^vn>|@-)LXb$(u6{EF;r(>XYV#2n)1O+F~EcP5tvq4 zJ-!3(&sCoYzaM9XE90WX`^L(V7-$KB5kK%(Tr&xwJv-L3-DnDog*aIf8tY&JPQe&R z#8L!IV;g0(80mJ2ftgAE)^!=#uU7@U2UKVUFC-W^cmiQ~g3!@Isz1NEaMC|*+e#w6 zh)+S9woSXNG+c||xU<{8Z^fZojbd5ES4&exS!*IvS^u 3-UJes2(Y$I;|@| z!fx*S?~Pp3hVt;`x;nBxcA(+R6-o!E|DGqcm|!ckKKVNF_le%DuR7&OjhR;VxM8rL zcCJPr+o5Ys(36+@#`RDxR5-??8-*hI pa#Nxxv=A z@f3@REKp(JUrl%KNg-{y;XAybv^ANJh%qO(Tda bd)(yYbM`z40wi z?7b`nE7EIT5-u7_r(~1&WQi@gy_pv1UTPnx67TQu^%|%ycJa3V{L&chTSrQ CxcmP5`~$=#WDqt<82PU|h_G_U}%%yW{i=g0H7 z ^Q`>y=Tt|qq i*?n`A9G)&ELob3dvRrH^dbK9rS3KbV+1*QX=c`+H#NV^@gRN9H zKUt<5*Sod479TP9$?;>KwwsSatfwgL7wEBGf37zfo*4rYPH$59kwd&O4a)JA@FZ?x zxsm6HvKN%OaaWjizGO&-e?v1uOCA2*lJLE(f5!s$I}t ?ebYa=iZV@2UC`AJ9R0hr!vY-OH2Z$MzIpN(3?|NA=%4! z)brE*eYLm|x8B*IQqpgc$=)JXdo$hUI$ak&U8->^aA3d1H|rZ^e)Z&(87obvG<*lr zPn<7_i6I28dIA0GmiWI;lial?!*pqX1RZ?Z5ndr*e@+-`!7v~0QY;4b_J3R1{YcLS zKhdJ^FmU0x9PVCjrh>kbPnxHvfh&yfv1FgmSiHMs@%7#Rob-bl%2nk!W8NH9F^S=q zptaKhEZ2<2c5@$eB1+`4PB?jSjwBs3%EsIzJ7h?IUy^!ea ic|| z>PIdm>E0i#UIf78Eu{4CAzkY)(;Qg121+f}_!jI*)E|yNFdHKSg+Hj{Yz!&1oUG=~ zF98TLNWH@0t@qRVk4|X@>C@w2K5;21ALSKBMd;dlyg Vr;}u @d_0y~`LQu!5?LrJQU3%JS(-fu7CPW{4dcsaeDnrJ5yeA -%@(?x3=W=3VwUv=V?6gwm0x_tE+_2tKuY(91hKz%Cg>F &Gmt4o8{O@nPmQR<&U^_Tug#?zjb}$JyJz9LY)e9)f^dE3O+Gs z45VT=Jz1<(cTGN34Q6+GPzRb@@Q2rL(KePNpy6?(zAZ)T9n?A7v!xlQIwpWyKBN;y z>4jylXD!iOsT_@wxb- >EE! kYZ=U*ljCra6(;FxD<98X^ zU7H!ckP-7>ZaQ6LCnM;cVG@_6K{yUrSqj8P=Z)kEp9tqe(PRof*SX3j?Tg;l+kT*l zV5fReqMj~xgEc2~U@L0-$z;m{vZL3eMM^6XfrhIX&>tN=8>{tj!X3YB gOi*nuo`<8!)lPn9qrX$so@evVMjWJxLZKzF0S| zP=J6-k)JnPrgBjb+%RH>PTOftj144Wo$gSX^kQ!u{&IV 8MS2 zuv^i$hKiHqUB$7H!kXLF&4}V3yvqXK0nfAm$ikt({W>-`^xBZXOEOQ$DePvZ&uwy@ zeyiP{oAW;EEpI0xVg5xr5%Y!$92Ne&(z3QdAM2_q9ibkCv^F6ze>BIlusNBOa93;> zE8$U@Hxwhg>gjSw&G{gK#n VYToiPPaSJ$W&@~;^o?7kP!5V{ DMeSUOV^&E!~gFRQ+{@mjLLlh%yG@2Mz}aK9fa4EF$YYIMbK z{}1uhivPS-=#A29c`HbwzB9TakWQ^koua-vvmW2;wDXTiWsb=WkQ!t|MnaV6*;Q)i z6%5^l{bK6AOT)N1zcc3Fhd%Q;Zxu_@nCWtf4K&hV;W2(9E)MpJFs`>R!waQh!PKDn z{FvrR`cAa+N6 HtbpZ~%ZTD9eSPp?&a%VyM^ik>`0J=cTqyIu>5EqrNNhSEQV%&7B_ZoY4{8iTi- zCM(IbeD7#Sj!5A2)_nEs1)fPW>?@{7&b#^F_&D&TpU$^p?UDx^g%EYIYp;SRUubln zaT;R_Wz7>G$qf&)PO^fOpcz_Ipn&ZfNl|xVAkqT`Ea5T{lqUQ)@hQ^AOtQC*D|j(& zf=cdY(9!R*ed6ZWZwzLQRd_rU>z?GALfyH5e&myvl)blm$}o#UKt7lV;ym>!I>#cp zRhWMQ>8ffOPM9;Kn`o+mDItWqRdWpxqACURfkKL!qe)72I3YihFd^;Pr-{G0DQ>?O zM|GZ;TiD)jqsZOy(FdDMFts!=z30=7p)T30J;2lSui`o_6lfv7oi818l!B2V+HYwQ zH~PP2Y9=*~0#3TUl(c3U64F_1uNU*xni*N&OQK{U7Q+V8*+Dn_jvVJ&&AKgZJdDQ0 zeH$lzwROLvSdfM1*&}{1P3vy_O)wJ!?dGC-gE7CyB8!&t$Xx*Fk39)@BtD1~a_65I zG5 5xaAqkAt^SSAQRlS%kFF~-&zrEz(jml2K$>#pv;=1!GisMLLkF}lZnI!!-L zb1go_bg1_Fum;bc4j;XgXK;`5fi-<$iQ)x9m~+mpV=+i)bg25Cx-(~ 0% )&g0ghp~u)M(}AKiIcIo joV&LOi1+oFP!X;u-;fIpn@r4{q3M>#C;FV+-W@-8+)wuq+ zMRavAa7wvX$TwzvBQ?68QAyX>F)xQQzG7H11VdQd_$c{6fljVS#rqFn-$tBSv9dc( z-|?&A_s^fsRvM=Yn=1VFa^K0X{Zrmtij~%KoS+?#x1e@+)j5#Uo1(%kkh{|tKlj0n znA<;@-mG1IGg}lj5Ix0WPqD@JezX6T*D{jlEr%AK0}s18t7!M$r0xTuO|*o;9qipX zOS?mz;&$S>DJ0!LMJm85rWcOV=!)x^=ypac3FZ(v;wvzdL<4>sb@ucR^rF_z4iY98 zi5va)LA#md@qsV$_F!s9ozrS*xrwjJgmL|oRYR__Ad&mO;}iA8 qYCvueAa>9Ij<^4;OofygfXB6Iv z*6@x&NObA5aso7I`XyBOB 7MKSq!k zI$O< ^BUz5fCxwOrKi6<%LttieRGb!FjGA-sAwGJnUZMfzU z*^!pW^6NRBEg>~*Z1@uKrkG0%!H*@nIz?E%L3n{_;oW?1YqaRP0*q?)2`2$#rtB99 z&Fp5!j3NW1f@Ma$kPC6Owg s<(E&weLMsdB)& zH9rQMnUl~XA(V9OzWa&hAH5@UIZP_p*T+2$-8uAix8Cw}$+LV_c65IK&JjiQQmIVr zhc^khg*KlT$$XK|@1wwmK1a%)_7h6GSMtS4mQl-Yx9OwAgXjFP(X7sX;Av;!^C~Fn zJVAet?&$f`?n`A~+@h4gxenzOBE)l?ZhluphOhh)eUISbz_kNCe(~infbP^-0}>8p zGk?~%sBM t5cYF|BSMVI=D17>Snp8`4JIj0nJ+urGou}ga!N$oU!JsP*l?>y{VRi{wzsu^#(;0xi_)nK#x8(3jh@v{I+Y)zUTn^tAM7vsEo8bX20 z{-`i?H76Cz<2{W66#|vh-Sfx&95jX=122}eUdV$zY(3tijv}8W1%b3_C(k~*OchbI zL>_wK4>hxxS1b-YrJ5u6$ux1+LzRrI{sd1!knvlJ%^ol?Hozjas4%^~@!lGW1 ZlNX~z;y6WK9zr@2e)q$t1=K9ox~(qL+ftBH_E6%l2{=CSyp=Q2wkCg znS@-1ApnHb%BD0O<)tJ3x~rg2$F09j*Sgy#^Xv6>Ux-rdRCWGDgwq(&)8;?HL;*;u z@uB#vsUk7ljlEh*KKSLHbw|O)40}{dL ghZhRl5ujCDFYfyVJFxw$4RD359AUHN zQDw$w!^uoj_T)}|3;xS*u;rtT{H+EEpU4MtZo+rUoxHl-++}M*p{{qUF}&JcYvPLv z0`6BV+<;C7YAVN%c|ijbxvL#LQS7|B@d0I1?lA<@doQTD1ny|*>fCD8tE6N|Y$_ i+;`J|os1?8>`s_G6g~B#I83X#!dI^B`+cJ0wxf)>1uf_1 zwF2@ZDp?O&(f*5O8~q_M-$ivQysVn0+PCW@{wMz_l6jcxJjenbltG7Scy?86ov|L8 z*N#0Uc8M<|8+}6<{lWy`KKG0;AM>Jt{2@)zT+m$zzfB9EeO8e9{k!P3I3KqLZ@t88 zTFPvUATDi9?lH43ALAH;lp87zvQ&`}Xnf_t^16*DGUwTBniE~4mw7^ux;v~V-e(rD z=Fb3J)8A?*G09x?RUB5-XN;WZ#vI2Mm$8IGLVMn*cyt4q+flY+U< W6{gFk>J%}dVr8@>9vpYV(%k(^EKjW}i{0%Ap2&dfp)hhF^ z*^uvle`Rkgwz0>kndfiSi)nqbWjDT?!vGki7n;(C#tnB~zU?Pe^Y&UZaiC;zm;&2U zK5V{r9ge5=x?s`D7KrcFVvB)s^u#ZP$D$&9UDWKV9@#gJ64;9ggb!6_zE&gyTO#QB zvfET;S_KSQ{q{acJaVdNu-4SUs$#Br9fJzTvwWKL?Qcc1h^A;#S1;+a4hcvPdcl0E z;R^OfYl>b?4n%FQ=Dh>muUP`A+8<=dQSlnMC2MyL@{MwXb#yV$H_0}h=f2Jf;9?kp z=wN750OEDR%y*ZDdzUVj8*do|Sd>kEk16(kgIEGu7ZH;CPjw-`a&6niaZHaRUY^Dc z{ms%i2mzhZsqN~g7a|Zog-M7s8U0!@0u|0CAg`A-pN1uu?qR(smcd_C5~5528zf87 zW_Q2@xdGe4cz=Vs8>$6=BUrA&tJC8mwJ9V1dYH@eNba505B`-AV-ok~WspQd#O9AY z$U>lEtUfKWm`|c6+n7#tV$;=UO-j}TRl2w&$a_HVK4$2eAF8BuS);FC+taudsjilw zs7|RciJXI7r;9ryIm(@n#GC6z){zX-qt;q7A!V;N#V?^nEfM~tWycCJEqJtFCze4^ zsQT2fl?U&kVJU3LerhCiAe$lMU=@`V<0CzM^LOH>hxk?r8~hJp>1m ;| ztp2edhBIysB=R)sX=$di7Q#Q@Zx_>x*n~$n;i7*jE^}4K$PM*mj8u;`l;RjNQOP=- z16lae- iV94` ;*cw#?>mtDv6HkXG3^%Z(0jp9cPBeKZ_!=23@Q~{T)&D NZ$bW$E?hHJI{;Pd|LQ%QYA&&_6H;l`GrzFS}dl+KZ4p<#e z;%XCM)C`P&S^k1Bs+Y~m1BiPN7c>MrvuT%>RdWziW5|)4-{xIFUmTD&FDq0Oj{x1h z-E1UgP50+^soJ%4n8rRh+Nwnq8awD((?lK}(C3EPr^n@L{AWML^O@2B!wkr-6|nOR zSFZJDO$7Ut9b@BC6FzJ8%Bo8*3>Ee%CI5L l zdu>7xj_B+A_@?_>^Yzz|SY6<+Whn7`K *>;Q2GXrMF*>>+cZGR*?Xt?OvNHs?1v(R0#CWA zzaP7d0QN8Pt`#SH<}`e#G)CVELeCYS@i5v$%Yvn#88GqZIUqt66E&+s%UWM(IF_dj z8roA9Kl}A@iLYRU GbI^Rt+NNKRm3l_mD z!`8opD182#pZMULYbLI6uQSn>#p6t7Me)z((GfqXDwB=B%ac+7LqT$fsgIH1rL|wj zZ4<;Xz>>BoLyIFvOAgk`x)@z;rKf2sZ(^-g3`($$$NDdkM@33pVX_MlUuI7oe6{*0 zve8& X{iop4mSW!bwj zP~;LZ83m!~NO?l0c`6!az>DVC^6N@nm(-#ymckNdCFgyPO?DA#OdAz%su$GsEI%z; z7KZ$bK7-IEG5E7#8`dh;^_zUN`JEbC&d$UX-t;q@ldf_|iY=AY;G=yWMpXD*x%yhS z?=)2Rps#EBU X0s9;^u!-816LEDe1PZy%%$})K$i%bc4 zbZu!g=(a7Ly^m~3dndP$EH+;+a`NQdT4PN8oAg?9bc+QuoOlE{z*294of6bLIflun zGk5t=yYH-j_3qluBFz`db(F#Z*w35mu9-}hiAJ5CZf6PNww>ax9aew;qe+X3YhSW< z4)Qo*(|PoyUyeC{@8DPhW)@mypRMzXmcl`Lq-SRU&5=ylTlw^%*Iv%>Q +V$gULlWYpnt>P7N!)t91eU0zgN4pF6dbt0K~gHfDK9)lUE{PT hQ`XOr%c41(o&U<8`@|bGyOkGvud*_P4Zv~E1JiHo$}RkunOnY>j(tIe?O{K( zE%MFJH|OvB23pM}eUhw*JXY{m*h5k6y$*5Ar!6Pp76eWN^xuVCP>u2#&9EigM7}Gq zt4FhfOK(mysPU=zR<5kJ%J83$^(Uh_SCPg1lh7KgFN6II>*5$Ct?8b2V85W1GvC4U zWB&vU)uPtT)#KTErcxQOnw!-ztqM|*>Hl5CWTWe^AK`WD`PlFM(+}?o #6`+UbK z_OS2oBnkrBUCkzg_G~8onSnQ=NLR0WwwzncvXAIP=Ra+Eu^#+V^?A+Q7?x4Dz(5e3 z1<6##oKLxeg30aQ@WiE K!Ip~ua+-gw9TM+ zYLmq*&$6HV{8B&H;l_FxH&PQ&*aJh`%7DExp12iq3IC1myc9KyJiDHVP(X)jMK0Yr zuYz|+H!ze>i#KDR)XMhbDL0-C$12rhG7DG?A We4R5+nh%fq-rt)CtT*}y zeVmX=(mPdKVb0q)O-CMJNoed^`0QGLPM`w;3@w%W{nR*XFbusA`|v2q!L$!~e+1vd ze?{DZCELhD_48N%h9=(^F0AAu;IZn7xB`t6XWps3!$yy!Mg}uN2qURYq9a;o|9 Vt>qW5k2>o|Rh56vWC zt?@<_pHeHzvn&c0Gvk<2ES~Udv|c6mMC6eNBCgQDBPlez0FpUwNLqIVUD(l7(s{I} z3m|JzvhbWueFHo~V5H1cC^i~m>rb#q7022M{aWt^a!G60AKtM0PJ Oz-zpBT8A@z`1Fm$_Z&$wjUm(p7T8xO}qq1p54&RAWH1M~^!2BClU z$?qNFaRlKlGT0Y{jP1gtuMRP^Qr?n3j>GzeIR%m#7$xI2ztgfZi0Kik-$J90c~Ce# z XxS-ra@8DS`|9)H9OoH#@ydRLC-O#-w;qumWx#^)t>z0nVR?^m2B5UAEw z31+f!+nI*#uzneaXH%Y+p^sn~|2~Z<+te B=gwV4UmnQ^u`!AKg^rgqukM&W_enaVJZJ=>8>vx)LyAGre^B8E9V@jX09oR zgOc$QrCGw?5Jn9NFd3*=z$qAE+#F&yUYXI>dOpM{rz1ndR^BWI@|+-(fk5Y$@+N8x z*{UR&bnn=ufVG@8m-}2^4ZdpsGw5_d*d?J*2U=}lpR4jd_~xCMhL5{#z55>h-4W$z z?h*0Xgl7FY@&9S>tKXuEy0&MAAtj`d1_@CqL6jc48%1eJ>6RV_5G5o8>F(~59u=fS zx>G`s?q=pYh|lxB-=FYZ*Y^V#7sH-&_St*wwbx$jzVA~@|D(41>mODN8Eg=dESLaf zhd-{=A01svlBV0>Jd&2+xN1sEbL(T8&i$D}-HVPTYUI=NqxcI{_>&*L+{(UW2m9%5 zJSVLaQa80iJavgGqd$8jw>F;Kdj6+S8A!3r6ob0yqNo~bhz?g)*(?P8IdfoGh`1ki zb2@0T2ALY@cP1G+85Ff~wMynrOf%8@I(!SA59Pxe(If_N&3!2V3 3dt-eq_0YcgEJ#C!|~ W zNyeUWkYx^ShApem Ynu1(&od%vvD zL#%-QU_MfT{Ct1;GLq&!@xg1*>!nG*jZx&D!6J;U!Q}&xbiRlixZ=XC`yMFRy~$aa ztwpg;8-yK?1 T2LW9{THiO2|Hc}wd#t{!Q)* p@%`vmk+``Gao>K zl47&wszD_FaYz&Z9a*HrKxjS%jsSR_@V>6TllSy*Xevf2zWn^2^RxK?T+r09w|f$7 zN%E;eocl6TQ^5Z=U>j+|F`ej)yc~wdkf27a3HdUP{vFnj43=1G%VFiL! yJ&3xlE}@)}eHH7Z)*x^9?;Vl^+Gn zSe<8HfKl1x{p?fq4r|pF@g2_=ES}MGuinDtJJE01KUgl_;aGRcYrc#jYalCLwcY9- z0tHX~rW= !NI&*S!J88@*y^k)+Cl8_b!6dK znMCBzt!4LKtJ%PfYF9P%<*iXP*8 VCpICBB+DE703_0?3FC2G~4f$RjUTf{J11Mr!dpip2Cc+w5Q732sMFovYZ zc(MVoT}~Ycc~0w_G6Kd3-?b^+#-{e&uuQtfAD#-)Q3galyBcd!PKcXqrzzZ<7z38< zJ>w(jq>}iN7mMXB`|H7B7UC|{zPVIk0wNon;a 6S{K4!T;(fQ5CU=D%W3=gn5=M?yyR$FNUzx2se0eZ zjY%8#v!NX*?J#db^pe1cvSd0 ojn%UGRacKtXi(g!#~C#gCcI zAq~t_oQW6TyT##cI#9WqKzdfA!cUvfhu6{Wh-sUiNvUxBL3EcG-s3D-MgRgjnnAw1 zx0?7e=`PCNx!s}lm^H>?uAOYF!Ts%10;Ole;^>~~3fg-fz_Jdo)J>pQ`MLezC&mwM z3>Tp&HC`QP_Dbl2Rs92q?|3+X2U&H=+oO9B2F^$x>CZWsRfs@wgs^6CMF)r&`6YY) z>DBNv?C@DhCh2$*GKgAv;z^ej7 KST*nT+vXPxSI-D;HOoNYCUvx&SGFW zw>-^O&oeP1d-U%6VMy41jTK1R(>)*|dGFTKt*2{q?BHn!Qt3$4`HQ`f6g-i5UYrm0 zyPl$% QzXL<#JB>TF3Nxg2ECbb*}6TYAVP`2v1}3fUZs(@hW* z*mQouw&UI+6l74_ZH20*ebB>!*%1x<2+k TF&hdHf1FzA z&H1sz07#U~xDWJS>OCfvf;sOnG^eMJHPmw)m{lV?Qya?f&(KdP5~Al xvXR~D@65T-+!sSAdL(#nCPmQhLUgXq)HKvcFfq+JE=-)Z|rI(Qj}F}Izx3i z*lq`4?w;$Zlk~jD)nf5`FTJI%sR9^7QGMHoj`31V-vDjAn1_KA*0+WL37%kKFljaS z !cjGJ)0+8@%`GVH6gE!P?4(bd6jBr!&cFny4%u+H)6q7cNFa2)N6q$gHB mIxO2TNP=XW#b+UzTx4HbI zbuc^Kh)s?8F7|$Ki|hn;UP8!B5po#En+12cA!)yu(VZe2v7vC?5?HFE0FPT<5Zg2P zg*ISJb_=^`z*oyS8D}WMrPvcexj-b?BvhMI4WKi(i_EpjcW>& j{9T@h{Cdy zF_L>RAr4ay0RZJ#QdH|P^TOru7W>(CawB($JqYRpuyz*!HpeMr#WhEYg(D;^IEM7i z)LgF2?>HoF_IlO>3?Z_{z3ev?P}CXai#_6zlz9J4A}|A7*9l+%OGX0Fk-Gg=BlRXl z4em35jCE6L(3ofVCq&?@7h?DPsNLT&nR8`o0kmdu0m1G`PZFLysf=SQC-4a{<)eh4 z6+fn`iNE)HDS1He0rgm-iyuQ$jAn@6HvJ-@O;bn)=xMyC&}Q|&4kdg@_9bCNcR;S9 zL-3NnY@yw@b3J=P{t438pV?glMG@!w`R8@VS7l=lAK_5FSqn6Hn?%-FF~YFF(sC(P z5O0W)=EFuBlb*dco`=z-_@XoyU}0mNgjbE^QR9|evz64O3~`>KHJkL|g#?wCxfUNF z9CrA;IIg}2F5D-@fgePF6bCko5P%7yccR*!Jz9u2!YJo{=Vd|2V`G1h$>Y3L4`Htv z`0aTQU!2{v7I!T$-#KqK4n8}IcP5oad^D W zZaV+cZ?i<;KlPZ^ZjWn#%_UR8sM%&PUFAs~P5ILyBo$_}ScNGCW$8&ghKu1R%GQ}L z+#Ym1STLp>L%KCecERu;Z(*vR3-qP0sV70ZxPMPn3NK6^aJS&OO@!1 KEo{~fM>iH1fc^m-a;CD}8s5jd_D466|rnPu?;8c~YTp^h7zh^>yn zit{&fYAsh|iD-eJ@27kFx0e0Nn^Xm>IR&s1x_K(LT>DNAHg-t7(Pi$rIV@NVVJmI% z0BhRy>zce8Eg`LQhTHgD8|9h16cd;dSStFjHO48yfKZ8X t;r)_MCeJ0=;?i~{582emh`?v`P3+>`8%;pkuW|bFV zD``ue{3KT!p~C7A!+M}XOm#M29Ey+8Ph9!7op RvAR!H#d-do5)Zm(yxE}zeO&Y~ z?i}suCD3|H#%Q^tc(-SmB3#4ET!8yv|1}w9=iWINb#@8LLWIa|^A0LOw&7WJONJ%D zm-*G-COJCM39w>r7?o?#DLRPgvDn3{IHjo(w)ayToeI@XzH3&|boMQ7f$2x<+-oFa z*sLlS(cCADDQi`w8Ov02BFpGc0z%K*Cc;o+dg-}n!=8nrtM>Zkd?S55StBFn=ZE== zDQk=$ppFQcXOSQ^&?)0vrG=R^;G|f`u=HnAz4NGYJTm!rBD>T)?Z>96QCTTs>0(mQ z0T=fY05Z&BBD%<$VqlQ}-6EnqI)3|nOHlPC*C?;1^y}ZZTEClQyI%9re){%L7afT{ z0e3Q(iyMAo25nky T*;SmRSL_^P>NP?}JE2KV77?dH-*HwVgU zipI7SvLmrc_}Ja=k_H~B|BI*O2wv--1GR&HKG!beK-gj5uSrV*d9Z`Yo *Kq$4aR?LSsfYMlzU&my?qs~W zH=Rj2gS$!y)@~MrMF?RcVGKxC9F$k8D+h >bKjH?Cwj+mBeV@xC|wvWb*G5x;qxJh^Dj~a=TCvKJ|n^%K2(~SOo zJ>5|2VFC}8b)5gjf0sjECy0zWrDP=xwxh0oG%f`{sIvo$TI{a>ctf0Shsw8%o}qO$ zd#H8(8?RTGX{s&6?a6;DkqP#|vL9+eXO ~*359`j xK_e&Dr|vM^M`9?D3Gvp2ZXj_uE;qN%tJvuEALgR z(oGT%NVHeANGmFg<1+v<;4)PaQ2J_rA0P>tyvB*h2K((q!pccAvGuLykIS$#%3Asi z#W|CXPP%e#%?-3>Xg(bDx$i#CHW|rsm06+!Q;UwN2~5&8eI)?1(Js^h3d!ekjI^Nh zo&!W!f6cbOf#)qAkDOX~5n1FP9A9*4h+$RyZ=InlO_UOH+S?P$R^~di8~x%mP-nW% z8UZY$b~`J6iX3bMq7+-BYJ(%P{CZqM)xg0Q7IPLKmwWt+##xc4-JYg*>irMH Eq= @P?S Uw8S2ZV zVr6h&tcu= 6w+x4*Z2GM%KgiAsWQ1NLkO&!Bo8%ti@Bo zF*uwbwD~euKL!id!+@xWE1&lwoOmU?u?-+Rvd_!2x`~Z1!R_3P(at+K1;tp>&eoL) zBlJxY{V_?m>m&j78}0QYApArT<6tA;tDYC?kG0UV`e5}-(qQWd&|euc4is)MU+Jp0 z%>(}bYp&K#3_*3XJ&i7D*Ej?tUTZ-J1=l-kyL3V!5TtuE%bs&BK7XP-919^@{K*E8 z>j2bG#`cdcqQ~4fI7^%I!N%c5CLIOKI8i*}+%u7Ge_ZBYXc0UAgkHb_;g)K}20-fa zlQ`%Vr;*?8qY9bFH_y~lb_!J7CX=B>Ot|o7Y4PaY_aq>HUm8g@_j}t?7>uB`KWhM> zQ0Q22r+B2-2rN);Em}6!fV o{mGS{#Nx(G|FdB(z~cVI;g z&hpO`LC~sesUkTRGRRMMkTR6)QjF@ZF`y!rtN7)_;CZA8vhc2&h06O3t9mOg4SK09 zZ(k?y$S?NE4K2QZk^DD<&n~ p}Kuot~2kK(%rb4v>_gdjVd)z9+NZh=jq_>FLtTbyTS zv8J<#(5cHk_7P%HM36({kI=?CXoNW4d0Mh zHM#l*s+p+~C2W=C6KD zz$N+%a=*0J>Ptil=1Um)bthST2k~&b(G<$-^qhHlKk>^{Q5)HlTKLMBQQnGd%x#1- zI=*LlmlXx00KCL$@LNgPypNz`-VC;0sL+z8@eGTSUC|k{`Vh`8-chVZX}MYFcd-KP z%FK*wGGFSBjgYOG9Bkeh)A8LEpdF%gD5qAlk)rz_8v5emUwI&3nMZEn9wqalBJH@9 zHj#*>R&8k&Iu{`xEfO&eN!AR8W{kC&IWPR}u>X;KApwnh_j=R6Z9Mm5Qh7I9#>R-5 zbg19`fV(izCHf>@s`leUzcy5w))U(lKpg9w#}O$uNgl>O@ {nv?fv%*cl>YDE`m^D^femKx#A&l%ze=*#S` zgXBd)dKzxYU?V@vV%7h;Kes;wEWUqS2>&QiHiJjYybH7x-Bwj-B!K9`wo1buAdW-1 z&{RcQMDHAb%hrA!JMUyYZb2V#Yad}DE&;BS0MMr@;>G!kyXwArYYX9Z4?!R*@bxQ^V~&1GQT&&!fHlO@zVkhRb5oUf!1`W)G@fd_`j!5_YGjWMgcSgr*PZ)N%%(2dvw z<(B^uC}05Rb5q_4kc&q>)tOi?_?E$d!^|eqJBlE?+GB=Lw9$NJ)|^?% cm_OMp` z!b+qD(dn*WbzfRIDpS42(yo`EngXBv77)<$h93IXgJx-4*W^9~HSP)x{ZBAK1fDgD z1|QX_VZFtcl`_y|HZM(=7@o6eDqU$c+UM9bY^q>UR?u~!X3U3>p`nK*d$8=55@BN! zMjLHy{_jG-A%XU-EKC#ZZIo4a4Zr7%tOF#PtRVYY1E%jkk^WvqY)msC!dZ2V1CQva zV>9p9(g6YtR7_DAGM3^=d30+Z5;1ma9s>lDI=cQ