From 4293ea320d37969383bb3a17d48fd1ce65641f14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20N=C3=A9grier?= Date: Tue, 3 Aug 2021 10:08:53 +0200 Subject: [PATCH 1/7] Hotfix: if an error occurs while loading the map (because the map is not accessible from the WorkAdventure servers), the application does not prevent users from connecting. --- back/src/Model/GameRoom.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/back/src/Model/GameRoom.ts b/back/src/Model/GameRoom.ts index e907fcb7..5667146a 100644 --- a/back/src/Model/GameRoom.ts +++ b/back/src/Model/GameRoom.ts @@ -473,7 +473,22 @@ export class GameRoom { const variablesManager = new VariablesManager(this.roomUrl, null); return variablesManager.init(); } else { - throw e; + // An error occurred while loading the map + // Right now, let's bypass the error. In the future, we should make sure the user is aware of that + // and that he/she will act on it to fix the problem. + + // Note: we run this message inside a setTimeout so that the room listeners can have time to connect. + setTimeout(() => { + for (const roomListener of this.roomListeners) { + emitErrorOnRoomSocket( + roomListener, + "Your map does not seem accessible from the WorkAdventure servers. Is it behind a firewall or a proxy? Your map should be accessible from the WorkAdventure servers. If you use the scripting API in this map, please be aware that server-side checks and variable persistence is disabled." + ); + } + }, 1000); + + const variablesManager = new VariablesManager(this.roomUrl, null); + return variablesManager.init(); } }); } From d781b2eb91f8d583de5dfff9e72feae3a380292f Mon Sep 17 00:00:00 2001 From: Gregoire Parant Date: Tue, 3 Aug 2021 17:28:27 +0200 Subject: [PATCH 2/7] Update favicon and service worker html --- front/dist/resources/service-worker.html | 24 +++++++- .../images/favicons/apple-icon-114x114.png | Bin 1483 -> 1215 bytes .../images/favicons/apple-icon-120x120.png | Bin 1533 -> 1235 bytes .../images/favicons/apple-icon-144x144.png | Bin 1752 -> 1480 bytes .../images/favicons/apple-icon-152x152.png | Bin 1807 -> 1296 bytes .../images/favicons/apple-icon-180x180.png | Bin 2091 -> 1692 bytes .../images/favicons/apple-icon-57x57.png | Bin 978 -> 950 bytes .../images/favicons/apple-icon-60x60.png | Bin 985 -> 1047 bytes .../images/favicons/apple-icon-72x72.png | Bin 1111 -> 1041 bytes .../images/favicons/apple-icon-76x76.png | Bin 1156 -> 1086 bytes .../static/images/favicons/apple-icon.png | Bin 2203 -> 1653 bytes .../static/images/favicons/icon-512x512.png | Bin 13061 -> 3518 bytes .../dist/static/images/favicons/manifest.json | 56 ++++++------------ 13 files changed, 40 insertions(+), 40 deletions(-) diff --git a/front/dist/resources/service-worker.html b/front/dist/resources/service-worker.html index 45615b1a..9a1f6379 100644 --- a/front/dist/resources/service-worker.html +++ b/front/dist/resources/service-worker.html @@ -48,15 +48,33 @@ width: 307px; font-size: 20px; } + body p:nth-child(2){ + top: calc( 50% + 50px); + left: calc( 50% - 150px); + } + body p:nth-child(3){ + top: calc( 50% + 100px); + left: 0; + font-size: 10px; + width: 100%; + } WorkAdventure logo

Charging your workspace ...

+

\ No newline at end of file diff --git a/front/dist/static/images/favicons/apple-icon-114x114.png b/front/dist/static/images/favicons/apple-icon-114x114.png index 6c994217b46f85b572b845f92231a10087046e5f..fc41aaf41fd7c02ba1fe5575e93eb8697c30f8e9 100644 GIT binary patch literal 1215 zcmeAS@N?(olHy`uVBq!ia0vp^MIg+<1|<9Mw$=hE&H|6fVg?3oArNM~bhqvg0|QH; zr;B4q#hkZu_xcMb${e3B78R$J)VhVUEMwM!$vQkzX)!T{mm(!3kM4Jnkxabq8P0w* z(s#y@83IB=aaTlE@;U_{iay(a!~1>1z1a6V@7jvDZU=DHf*(~ zQ01eL4o24|hlvUSDjXu5OvEuuUhU~wyVdk-S>ip5eW4mF+$RU?K3{Ka`}Vv^GWE3}1bJ8uRIRca@0K6E{VleXo`uV6X*hb(Fcr z^e)%0PaiKTjJfx7ZCTwvqoq5|?bf~Pw=b9y|07y&^`mFY3g4tKe69T0{A=^xT&sO` z%4>yAE-74hli}2?|GzIydc4PRVd)0r31?Te_s^F&{yuJh(ENM*&6i5bNfyqDkBI%Z z>e;;WJF?op%DdjWsIhG7pTzcsqAXo3j@cPo+YbJDYn}D$=o-zlXML^}{${jy}; z&27nf&u;Fld~)Qn=kdu^*>&cX%}%R5w2d4j_ElHTe<329+R+hq`s1YSu@H}Za10mt z(aF-N+bE_yKmJWIOliu@@3%~>pfx{_TT>#7po%{-089?bJpa^lQ+-TnB=48 ztT+km4v?-p?p8C~=FOXT>z`fE<;cwI4<9C8Hc8CfzCL^HtN*QXva&y8d-Xd`WNnq| z+-3w0yB~5<7d5APt%}jxz3)_v-ttX1PrpCA>uCAJO%fOG-_N%yuc=w1HMOfyr<<{i zd6B||qdn`^=`BvnTwMCl=~4^hd8M~{Dsuhv*VaXRKJnAaNP#QqOM3Y7EgN_5zHMP= zVPRojFxlvk!sJ?T>R`9FQ~0~0hk4e>gJqppv#kkUuHg1S zmBbkWNEE3D4i@btxEbYo)R+`DtXub6N$B}9?MKkK6~DCr%j zOp%U=j5O5xnEhYKbsOXEyFaWx#4h>6eyXg)?a&Tsg;yK;L4lhfpLsC%#&qA5-e$?= zC+ZaDR@Z7=Qr@Jvdg{^Mg$ote-d2>1a$Mjcpdr+)LL<7(okM9%n)PLl$n_qK(Qo7}!{*TTt9ufBx zf!Qi%<%O)H?^Zt2(ACYVUB2^9!q&VkS)#JTD delta 1466 zcmZvbc{mdc0LHhOv8YfnN3P8r55kagP0KRPF_B{rMm1Ni84_9)mPTgoTxD!Uj^y}K zj*mG)e2#=kiu&9|BKr9H{`k)4`{R9{_j&(&-{<|cKzl{f;51-@9|mKO!(bFcD8XdE z%a;HEHD)Z+)T$jV$MYoCDLV-n)2ZF|1)B6^VQserWk=z-zY-%ma7nlf(nJcb%wf(bbG>p9$NOzWxK z*XB%BiZ`S6DXQt7D>}qOm~@Sq#>70o{aJH0jF#%5;-lB9DmI`uRZTxm=NM`gteb`A z98pQw%D*yFEFxh}agX?x64vHrJ|HSPKVlM^Iqu&0;XjT^y<%3KEf`a>F^UVN$3mQ=Za&jQJ;0uq< zE40YS=-|CVzptADw_Z`IK?-+)0000QV&xhJ037uCLqM)M$L~idM8(-y3e7>}BsB#% z7Oz_Y0D*DbX$!|Iz~utd^a->Wwx(Ac+HsK|hiSz3smI6{#q;MdX%Z}P%n?iMcq!>d z=2MIH;gX>5R`tI9RN8v8j31UZwDOW1qX+;BqX8hX>j3aSthdCLx6;nXJFB$PXD!$E zdMY_{OA8sZ%iF{cD{Bo~F@c1eGGD|;y*G&V*TG4kV;7vw6%!$X_V}R(XEV*6LndGVIxxT zqqzj-IU>&IQ5E&%&_rqqarQemFn6aUal?+xHkiSFvmvv~ru>53BHZow#~1#LoQX$J(uT8OVSd7vChv=f#ba^ykr}I=B5a7?F{? zoFq63rFhSR2equd+5hhk6rS=!q-Sxdw7U*>lXd*(3D*&pZLVnXaWRws<=Y?b2k2B22NoZT!iya=UloJVnA z_GGCL^4(N4fEQrWgZellfve={gR^tH_&T)$3r<>?a_eUXh`d2#E8iHpcoz9$CW-I+tr$}%}}9Q zuMrn!s(2FfnA+6prj*vw!A;ND3=K+31{cimx`-Y|^uW{!&>z##{@Nyy3AAA$q=L=w zo1$%hD?JZ&OL5tY9UBrF?CX}PH0q9H9>8;zfbal&YFf#b%sff-;mw*cOz&jKg`lbj z0#-(?4E*)EpVYBeBUCM9vB=gn{$aRj6RUVX{17QBD4AI}g&UL%+R=?Tdry~JGy3ba z$FP4Lje&v_hYTwcn2908vd-?TC;J1u*h>7Y2cEl+vTgATEz0<#=og@}PVdsHD(Yv4 zZOxi0)sMy~y`;Q$GuZrKh8zy|@AG}A9^g8av!h$4rS{4d)vFp_$CxQtO$0TJ^C3MN zf;r4gv~2+d&WR{?h-IKE!0Gz`;qFfayWyV>Hq~Y?TC>8>{NNvev$Q>3d5RSOJ9rM6 A0ssI2 diff --git a/front/dist/static/images/favicons/apple-icon-120x120.png b/front/dist/static/images/favicons/apple-icon-120x120.png index b20bf1e23ee031de12a69d04c5a5525c010f1eba..c1a99df6c19dad7de60768dceb5e5276a197b832 100644 GIT binary patch literal 1235 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b&H|6fVg?3oArNM~bhqvg0|QH| zr;B4q#hkZuPv>2B5NT6?Y3i%J)%W(7LyMR~ZwhR)VOXOzk0Fk+Q`d$uXJQ3w1=AH# z8;0&YhuDygb(=Vaa;iMvJ1+NXwl0(Ex1G1~|G)VmE4N+xcqG2~+{ZIFG)s5iU8l5R z%1SY5F1Gfjg9{T1G$dq*X1e9>-)sMN+plk5Pxsc&J|Dj%&$;5yla;HkzIMyat^Fl& zYx~8VRlUy^AIVjD*{;8a``_=~vQ~=Anik&*ur)Me@vgtb;dhBY-oT~V`QU>91B+|L z1tRwKHT-Y)mj7>D6|&mx?Urxfg0?TLa*f&G|Jl2A@tjrP539`It@b%O{E5rH`p;Hd z{$IUaeoXz@)6KrGb63P&Obz0Am0R;;PwEx+=@4Th&L5n6*!k+M-&gNn`y4vS?2^FL z|Gpb9w&|~V{$RzN>{*L9ow6|az9Y76JUv0TnapTMq-kbSeA=aP0z1`Nn0DIvF z2YZ3UB2X}`dGg@z-@m)-?vP+;)I^zq}z&hf>Cg@s>(OFpU0P?Um% zW}(r;{w5wtk+p6clq}9goIH85v)8%u>7PG)3c`7KE`mIN=HRr62K#pJmd*+(`hMcX ziM8yr=gti+Jak^%a<>I_2!Mv<9SP)=O-{fk*_TI@?UeZfA+n^iL89~2m5yH*&|b>!1?oS+3x+e z=H}wrlb)Gr+z>1*+Iod?ZP@E$`?k1>JDXUD@bEcrNmV)XEK^pQHQMco+tb@$zm{&@ zwM(kfKy%HPJK5ZA8Ss?yF)HQc3%`5puYG6Em=TbjoxO1Xs;gOXzaH=Ha@%d{^{j?H z^t4?<2V48~gY!82w3b9F81Qg?a|vUXwmQdh`W3J27AEa}3t^d6s<*s)`4)_11?O$DdgIZq#~$i8Qh z-MabESCw|V6~?BfrJ*6L6K9{#c^vv7*6DwGTtq~H(d#1uynL+9#p>&tA3uq%^bPS9 zcz*4MLeck!PoAV??4OsveED6QjnkNAZCy63Jfq=Ku=wJMWs^BUjt5(lP_*IY0oO@0 zl{61MQG5Gfo6UCR^9~$-Mp{#!&*qdA%J z;2*0M`Uj6|oP2+kB|iVPkakmZ|Ay(4MYg(_X%@0BSM5uXjcnYwXHU-Cy=jb)IACo~ z{%aM%_Ga9g+|Mkhs zMO`dly?vWEzVKQaw8L0aF)F?@(B#M8gAd^O3>dns&@4xo+0zsBO8%GaM86+DZ|MU| ODF#nhKbLh*2~7Zy$w7et delta 1516 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 cE8ltGu26UHH^YBzhaf2BR01_qWx zo-U3d6?5L+eeWd_DAWFN^FP%fmew$n0G4=;o8J0LyP9^jE|`8(_KNqy=oQ)=`YNBN zs%Wg<;i&ELdeQ2*#KNY@)GR`(aF)*M!@IZsJomQt{>zHDM^|5e8_&OW`{%Q{ zd+&ew_ws7`>vwP4`&WMZdG@q;?fq}xrk{Ts|KF=xCh3?zioGFen?2@lzI^$c&xQ2T zzm=QwW#=hl3GZ(ZN>^jC}X{iWT} z^Y`T~zqRdEQNyE4t&fEKbSzw*AbvZQGa>%w{qo*l@B6OjD9m$P99KT|ulzmT8wV`c zF5&c$+P^9^{CDKr*M%LCY0Wj)l>R5_3Mm+fuz~~OXt}6k*L+w2sf2%$?rqz>YuBUr zb?4R8)$blT;ll^QQKv@{*clRy1yn5qCLvvf(*cIP3xOG}&UnHg+UwJd<+n;mY6>|_C_kdvtY^1wMX9;lcO7`c`&)&#sr{>*r?r^bWS`fM9w}|EoyKBj zWOV8Ce>G!s^XIj9`Ci<-8F@T=qkdWY5qm4ES7~W!R&krZhpoTPT0M>b7|e$=T=_Vp zXSb~gv!35?XlM5>Ej|5rodHLVLyL~(O_eo4D@*pI3G=xo%u!N=BpX9E?HLyi*4*P* zR*okMpo)!5(gcF|PMUN`jzwD}gQ@;M#mim3ETbHc==UtVu(n+N8NG@Ju+_t8Sc*B z`rN;zM)`*Gkqv1X&EK|s->$2xTN%GynqzXFQqR;Bv6sJlVg=b(RCa!?T+M$F?y^S5 ztOa(VB8PQ8?Q4Jb^WQ$l`F}k0f?ICgy?eG={K*@G-)ZgNZ2Oy$(`blDa}AGPT@!Um hgsuY%9?$vB{G4IIgIxDb8-PU|gQu&X%Q~loCIF+?M%(}Z literal 1807 zcma)6do+}J82;vKFhl7>!&H;TWo9CBtH>AzLu{xpAz@ao)vilw41<~Jn8qcgu}l#* z78^0Mk&4kbtw}}NZC!IKYAv%C*@#W;wEt}9>^Zyp$NPKU_kGTL&ig*UbDpdNK6}@x zZ&C*UV4bH2%~y${kAYHEzSw(s0{}o|#=5#5@N{*>$0x=`#h!=+fNl9{`4o@usW^F9 zaFZcjjVwrdaNvrWARD#gaHgR@s>!8RlUS7QEaV%@}Uy}B$Q$$;nBh2Li7SEeI3 zcIfD*u-Vd_d9&G*8F`_EXls}RJ+U4U3v30|yUnjGI3|cNgv_@k$vx#7+D?ffrWbNju9)|=`;I>A|@cp`&ns#CPLATy*V`T|JFIwe6<^e$qrSCGoF1h(#*Qv`| z#$o|M0O2dLwI7M03c8V;mc2Nk|K6a(;^IDH06G_^QA5pq`BwJfIkPz`J$%?(UC!;+ z8+wmb<+V^NqK3vgZjRU?z$frmeXj$i;onJ9O@+D?aHW}>qbMZKB8tfHbK#DS7mZY6 zRu)*#S99A;G}aD-l;dB!)I9)UHc~?d#0H|#7q&fR1BWA9U^ENp{ ze90?8ge`GG6L-&gzVzPYyvYOet-JzJF18Xgc+9-g&G472Vf3FUy<^0>V|Ntuy$w-! zcERDYtw=n8Kv4k@;sF1aGNO=e-dAR4!cA4n%b^Gl~Pw!k3$2=D!rzqJ2zie7pI^PJ~JNuK6!n1?{bqVLC0u-ze$p8-yBO zruN@#eD*_ddu#8QX?^?X)9&C(LI~Re!WvoYD|uC$*8krfL>8w7MOBDz|O%*vZ((!E_bQ&W&mf z%xQ~NIPi&O&Dky7bruNVpIW3CKBzwy0dqMQWyREGbEja1v+efY*#m<$$$C}g^ z-z=LI*Or_ajF&6)5J>(8FErlLuhniZBL*%2KpT0^NhDwO(yo{Q2s+Rb4K;GIK7ci)XvM!*ug4!D@QgyPaNZhoWvg zOz}N~F>^0a(2-Ce#*x^8!i%v6^#NL_(KFJvHeIrJ+SNA`6GqsH)m2JNS+QghW=TWU z_BraGcTR0^KO_z%PZ(Puf3D1z7INW~nOtEjBoewW9(JE2-tCWgSW7`nK>_w0H^xlr zZkFmU^1)cmX%z&xRpJz3ZniGvV739t!V#xjL^13 zlSQL*KK@O{Cyi-wE>{!6BgH&9DnXhJfVKBJUSbh% znmwlWd534kkB|_DEX&ens!Wl6-rLzk9?V{BD!v8<+FqZ#Bv|oo+wZk-?a}Ka+l!E3 zC!xyWeTvjHweb`wEhlfoSIr(-Yfoc9l$VN;kFgRA&xB+Gpr1^jlLdgn2aEs%4(x9^ zPBY}d#?}LL6y6e(YnQKtzs9CX%N1$3>x+9E{O^dSXe&JXobxRbUgYkxFIY+~^ex<@ zwW*9tFt&6rz z7Y}KIit9$*ubmm)o1O*lLDe#c>{geBve~Rv0InLxBBDX<0wIStlH5-@ZdF80i9dN(4p$@ zL4uoa|Dn^92NO9Ci74dm#3fSA7OppN3HlF*`rE>~1aOAweUVA~xK+2(I{{BOA6mT& GgZC%iZwRaa diff --git a/front/dist/static/images/favicons/apple-icon-180x180.png b/front/dist/static/images/favicons/apple-icon-180x180.png index 8f18bd51ec5235c414033b019f99cdea839ff5b1..65d4ef68acdbc1b75a7b89c8cb90c89d1a1aad51 100644 GIT binary patch literal 1692 zcmcJQdpHwn9LLu=9i&`JC6_#>lqg3tmxc(VSnl??-z5tVX-sIG7M&2WTv{%xFh>_+ z%v?4+$XPDAo^3|%O=WXt88hSP)YIWS=fCru=lT5J-}C=ZyRKTfBLINi`##%_fw6=&06@&n+QJNWy?{N|Y_Alo z+{x{vi*?^SYC0qVg2A#n91b2Ed8~RkwV~8mCr>j6q%Ye2Fhk)!89P!7fwJ_S#9&Xg zTpTmuC*jcJNjrFiIJg@rUV6Muz**x8j|WwS;!vo-F%*h*ssM+>DVbWxY^Xj?dUPcD z|DiN{HebM@2J%>|aT9!_uI26*Sgb{ERXrt~lDJ5Z-T2gfR}dxeIoegNV!Q%cTo=kT z*K2>iIkO6L+!bm_vC5Td%;7Pfdgxjok(cPdPQjd@j#B-TOl z5b@z!waZx7uxqB0W{|Bw@idJZ9?S^c@L^g0v`u{-O+W%8J|q%}-8>vxhk0>>vd(Nu zSaO{}j$=78_RUh{F^X&G8arf86!~s&sn*vP^%IyFzqD9-Wu7AzzJM1*;Sq2e6loc$ z(OVGLo|_t=)KDJ{j7D&U30G8diY=7d8eRJV3IsaGDSX}K=%-<8_M z@w?3iC$4ZY?hQ(#8cV3th3bQkyu-TvlXuy?Un?R#1HbCCc*j=S>InQR z)K6~G@f2S=jgCxpR8Y3Lq#&Mto8h(57MmD!RlSNQ-;-Ys%|3=4ndfR4F+FcG*}82B z!{a?5DMc&AeC15@zRzG@pGofQ?0gmMJQl;FIH+GYu3%!btrNq%LrP7;b=ImB$G7QI*qjE>g(<5vpBM90X8$X$+0?L#@_1(2ne`*<6=CD%Dym0iFJ+ksj@QH>5TMkH>p>n0b17UPd5vcsW!x z@e*0xZA5*d_b$VMYY}mAt5fP=`FLuo-C(~NqNgt(```f(0)Z5+9sG{IWtR3!+nH;| z8c0x+?cr9`r4u#e5|HeLid*l}uTz z64lmhYx3koi9WY5pu~VtC9ZZL&5|W5bz;q$^%-FJ>Xk0fxXym2MSHjB4J3v-VpR2n zUKO#3#}0QyH~5%#|7K87o?P_4=Tiq{B@9(fCL8GIq;aZp_isqWwtmZOvw$Vl&R`%= zHcrKZz_1ZDwdO1TkT(Qt;oMDTXEG2g(lRn+A5VH#B>%}nkx10rIV%`7^)27&T@Evk zsGC-!r95CyDV3rM*+r7{AbK<=J1c9ij)4K=cUr-je|b?R&$dA-=Jy6Trd85DmQ#wF z2!RkIPs&p-t^BI0sunh~_c=H;1M|Kg$xqzr!CGbPXjB>Qearv58=IOh8O{PQuTE^Q j!as)Lzip!q1+IVJGyIHKPo=kSem4MXOFN4Sb3gQ-*jF-G literal 2091 zcmbVNc{JPE9#7IB2^}HIAVX^3qD8fq;#aEWsh!3a(WHKi)g5|&w%U)?GUvTh;_{pf05h*sN2-)R+JKUJ8iF)-jBgE!l1_KA;)9UtrUM#F6Y zF1K8cSku3+NtZWL!EVm+y4XBR7U_t|*vj_@yoQWDvVXe$yb;w)pd3!Oeu>jD@~pxP zXq;qESY5l;mGj9!79_1Qo*5MOigkDVGhvCfuKl64NZtyz(@x7-F47W0i!E6*g@%fE z)WyPg){SGkj#Y;L#H!acFf;t?89EbzHor9rXcMDgRLG*exnU zv_@9O^#wO7Sua`E744ZWJYMAbS#SJpmaI+5G;A<3INFc2^1ia(vXmxkzx7R@s{G*7tN* z`AH=yQhB=>lQO?r|HL;a3uEE&#er;<=Qa2yx+O(zZ^e|2zOQexP&0>FfdnF zSBy!U$x6l>mm`AtIx3LUTMLJ$cnVq+X+<<=q#Q{u`f~AclN{FE+?+v=x~lHN#>R$c zPpTjzpI=&d24K8y`3qA9O3T-|_rDcm%aA=bHfB&3zCF6RyPFz2Bz)VWz-}`;y7*Lz z%jL>tS5{T!1S?9Ea}+yk7w%I5g$Suja%g@o(KF5+VB{PVH%5T~LbB73J4VAClz|AWcdnf%0I6)y@F%rAv&TJnG zD9vTUSZo6R^A*BtqXZ3fveT+aB=W2hd(3k%*Sq*mLVF#4do}<(^oaDZ0*&S)aedFg z3kf}5mWOd143HTI-qd)#A;A`4Xj7#YWzqbAJr6+!6>x9X#aM}PqTyXxrC zIj7F#IMOu9x6jFYmds=rvXU%7vMj>h=0CiinrgX|ENL?;QoTDRD*tB6;2pKW1{GAG zF7jS_Bn(D;ZB*m}>fU;;*Oa!}-ksJ(xVQiQ{ezPwl$s5j5d0_ai!S_{UiXa%D9u{% zZn6gCv?cb1H6F*QBc3et0vLtIT_)?q;5#ijVTCBljcLP%!O4)S-6C#QmF@OQox|`i zQ9n^J9nitiPas`iRT`R30Sx7)b3c#(23uHwQij97eUtS>2pfOa-Y8jYm6FmhJ>BYB zfIZYgQ!VExhu_Cz;qaZH*%5Kj^9P(;=s!{cRfCgLR4PDbWVgkDHu#Z#Rv8=)9vhMW z4n~rep1YOM$-A|+@;-EU`^_g0p-eHQC`Fi*O*YXJG_%)S_$m(@pOsR9r)S8sDliz& zZp@Sb8gh(}=h}e@QQxs}8B7SJE_x~`vb6U^0GL07>h>6Enk&yITkiA6k4NW+iX8-# z3jqNEUQXSeoy+5kOaIiDvS1Q`_DeRPjlz~+=pzv8D1On3Hjc9wMNAfh(gLBpJ9{86 mRZsLW-x%8e33gf&Ykxhc#8W@1L>v59AddDfryFg9(tigBaEv4X diff --git a/front/dist/static/images/favicons/apple-icon-57x57.png b/front/dist/static/images/favicons/apple-icon-57x57.png index 62c8ab07e1d726df9471939d5c5aefd67fc70811..754d1df814a9a3edcd524e19e342c5d3d1671609 100644 GIT binary patch delta 929 zcmV;S177^n2et>0BYyx1a7bBm000XT000XT0n*)m`~Uz0Xh}ptRA_hf zA^Z~xVVgh#H>5Y>1Mmh`pFkf$lipb`xwGDB;v-m}KzpSR-~~x-@2n*Odf_SvSboaC zITIImx3lce>{7bymu%9Vb7pqFIX`n|sB1o-&%x$!+npddB!6uLhooKLkhBXNl6HY6 zlILfq@a)kZdDP^`?~kZD*e>XxzLNaSiv!b_b|Wn5DV0hkHKjqX2YkH_(Rdu%%_f|m zoxygBgJ3u;ktb3dxIJ#Tytp9k365Kg(d2m;bbAm8g^7Oc`#Izb_ixBUu_*kg*KhP^ z!dwTwoqnA^eSi3XJoq;auMeIR`NyMoR5`W_V=R*^^*4eoEenLJ{N?i}_|s}Z{$7E! zp+)3!L?{|1I@_s~WDJZ$^nlAs1#-K);Pv{b@>b&)wLc3qk^KFWUnG>bAC8yG_Z~kX zj~qxq(Aj@^C~;K~$&ujx;VaV!f>x3kf3%6yjbt6H+z zY)al;E*E(O;2K%EPQhRh0)YV27^);kqmi`3))u(k|F_rKYzC9bglQ7X;Pd&6cm4-W zF}W(BM@*+v$=BrXmXMUY;&?o^j52z})zy`x&Fl3tkGocuqyck6r_&)}Ar2EnI-Q1a zIIKE`Dt}3Fl0hUAiA9{?1XyBH?j=Yf6bca+y}rICZQX8{#nUU{q%SS0B6ptZ52(vc0T z8lLAD??$StwIWGFqtSqNyG@m4G8q!HYH+p?8ZaJMv#OD82df@D=3#A{&1OkkJRaB7 zS2xLZxDwLhqGGHxCglr+)=@(;nIr`P_CE6C-Ho#*K%@LPLk%{O4|im3NOyY zw|@X;gomXhl_sdvE}R*~kl#!gfhtLi2inKAOkU|6C|C)zrTEGdb%mROSS+^qzU3q% zkqDVczu#9KOmAY5lN5usC>O)fKB?6W)o$0tiy-Kk;hu8n{w<_ZslZ?`FnuC^zn`2N zbGe-9V{b%R=lmEX>4Tx04R}tkv&MmKpe$iTeTup2Rn## z$WWauh>8d{8C58B$c+{W^5)dxJaL#cI3T>9v*?Jp%f-fs5;wChq~4JHX(RE*X*|1!(&7 zdEotwz9|a~+yXsoZg0(foIU_)>MD5y92^281UD z056K|WPTZr#czPcEPYRe)?QgS+TSb})WB;C7g zaa`NFQ)Ty|Y|#&sleJq4eK$rQsN z=~cGEqz5vd3IPmORizFWa0CoOdo6`YjK+Ven;4|lr>+pn2#;NTbzt9j)kUs%A$z4? z(|EC^mZ$z5wWRUE3_=y8A}5 zqGb9T?-6x fYy<&8z#jsCyEl|6Awh_200000NkvXXu0mjfDjT`9 diff --git a/front/dist/static/images/favicons/apple-icon-60x60.png b/front/dist/static/images/favicons/apple-icon-60x60.png index 68c5b74b7edca2540aa9bd944acde684df1dfbcc..036c5aa0bf54c84a04ab7aa4e29e645dcf04c9e9 100644 GIT binary patch delta 1026 zcmV+d1pWKj2bTztBYyx1a7bBm000XT000XT0n*)m`~Uz0$w@>(RA_Q~E+7 zrqCAiA2XZX>AnoR%iFTQWCOeV?9BY z!Cq%XR^N}@CptPfpmZif>CED_`;~H;wm#?B_t^9_JzagKTh7OKZ%u8s3qNVQP%x~= zDbgO^%H>#N(HK3B4$AC44%ixDWrOm~>gk$buMo;+vsqa!vky}AduNBfZf-IUi6I$| zMp+mJLqYnov45dFBa)cCM}KyADgXT&m5N1rxcpdSaXXPv>M<(AF47)`xaTikQoUNG z?Oz3Uh>gU39Jk_k*nNz75!_#1S)uZNiP`KIiy8}bn7SUlGMpeiX}w=xV~vX^?^1g4 z`eXu6eOO;(-y=6~utsCz5qb0a6*U_Tx<5C^Jd4Ro4Syy_L=Ue=uZ*q;hFJ7C8UZmP zf9o~H>*+@sT^nF!1CN^3;}mJZPgYk=dptIsP#P$DO^uZe$~TG*HyFB%hoy%rl?pW) z4b8Q&u`$j0)zuYUTwJ){Iu+4ql%}Sp9GBxSE&BnCvdha$O-sb{jtNG%io^W;{Jf*x zg5hy?c7LY1Haa@$O4)tsVLj^gI+e?1b_d=Lg+huIIwKZ~NtI(MI1mV2yB3ef*(W@K zh9C;u3OQcq`1rV{+{42|IypJfwTF0D1&gBjERE~I;Qx6KjkAk5WKibB#DvnJZZa?- zt)|&*YR=Iy`Fx&5#r*ud>9YeVSd1n_1VUeCGJhQy!4Skle{ynCnYH0vabaY}zzBv| z?%6~lLCIv2eaFmQDwU+m@mE^yfL?DWoScwKrD$emrniE72|D`t_?T+7TIU7x*FvXv zNM=B6J7bq)OK`PXWuHzK8@;0MLfWVku`fS8Jyp)d#Rry`Sa?{`SAxxwFBq#MBl^vS z*ng#^C8;|6*OClkIN8N+I*l(O@v5RW_sX^e_eu@uZ_ zK)vjx9-@ueGdvLoZ>sH37k}sS`o-kGU3;W|YSH@zLRPR<706o|t;-h{795LI<1ajn z2#3Q;Sn>R@ELI-I_(TZ9j)yR2m7ckpKVy delta 964 zcmV;#13Ube2-ydaBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iTeTup2Rn## z$WWauh>8d{8C58B$c+{W^5)dxJaL#cI3T>9v*?Jp%f-fs5;wChq~4JHX(RE*X*|1!(&7 zdEotwz9|a~+yXsoZg0(foIU_)>MD5y92^281XB`gs&g_}&U0H)NWn7n7 zMy%TEZifb(}29zzO#;EZC0000-B(fC4b4%c*6n_us{SX5CIEB zzycAlKm;rh0SiRH0uiu41S}B2ufo}J;;RqsNfe5tgLDfnHPL3;3-rt9>pEj)f_K5j8En zd`i3d(h{t#zkd!&k6UPuL4}zaaZsek$9<0xVfYLRZGnDleTSc0ThMN`VCC7Wbw5A- z?*|l7v++@!x7&Yh?RKiq>;F%~!^clZpO2odKsJ{X_K_0k z%TCz7ako`{BC7CiK37&(c@~QTT(l?P2qN%31|1$A-ha9`G&Cd*JMDHG?jkT}XJ-TV z$q_`r0ulI5F{hO2cDs)E@m`oI)@(LK+jhc8G3|Ab3X0&=(Xhcbahw|jMgm2NPNxIA zySrA8P(=F#l1imuZf;Ji*G2+mG8u75YPFg;!_J18Vk09XkW41w>gvjhVEkLJ*FB%Z z)C^6aM1LZ2`{ChX7#$t8uCdc@w*BHHG`5Q(;TO?pG{n8IzL40Ym>rBRCn}ZevdWB) z>H)-AAg4hbBfMNLi*vsM@j8egHW7p=rAAGmP=LwFN$VQNDmjVh5Ze?(af-#Fb&X@s z+1Z)4A5JlXKqKfbR@D-m_S5OKbv-dL5s2Sd34gS>xEQ$K*p5MxgM$OOyu9rD-OWfK zZ1m#d!o)@BoSvQwOEOM7~D&eZ~*>QXr?7VT@+^8lj@vV)6roMHrb7C~MEv6@;=5rn%F_xI#86pxOMpjxdCq@!^2 z;{$vnpPHJ2TrM||HaW!zj3TJjYKdb|;OvG6&R}vDi?l%h1Ds+6ED!+;M8E0Q>EX>4Tx04R}tkv&MmKpe$iTeTup2Rn## z$WWauh>8d{8C58B$c+{W^5)dxJaL#cI3T>9v*?Jp%f-fs5;wChq~4JHX(RE*X*|1!(&7 zdEotwz9|a~+yXsoZg0(foIU_)>MD5y92^281rlST4(V;|(G{%e{zjt6+Ab%P^#^cAg zzsF{?Re!}l5+DH*AOR8}fhQ&KVp-Sc$NR7L`}+QYeQ7_7Pcv?bpPrw!{AzXlFMb3B zo-_dgKrn8^{B=wTgA3b(ynF<1= z2nYZ&ZLwQ!4eMB7-Nj}q2%sV$0s;hRCV@@~xPMb@yBV&7~wk`2R1jcIKmgFiTMYDnm*(8Dt|v?dX(FmjKnjR15|AdM$`2ib z_WQkBPFO67H}bNkN^pg014a&fj>UsltEOhfXM&=002ov JPDHLkV1n`d;!ywq diff --git a/front/dist/static/images/favicons/apple-icon-76x76.png b/front/dist/static/images/favicons/apple-icon-76x76.png index a58cf3ed49ea204313402d753c6001fe905f1a30..3cc85751498225e2de4efca35ccd31f3069ea001 100644 GIT binary patch delta 1066 zcmV+_1l9Y53BCxBBYyx1a7bBm000XT000XT0n*)m`~Uz0@JU2LRCt{2n@dX@Q545d ze8<#a5>P=ANf9?qan~Z<)h;Ui1obNvT-JVq+NIEq?%P$nD{h+Z>rQHS!Ym|3A|#?D z1`{>q4Bp{tX70?Hdozjg{2PfWn`nSo&t5J=W^&TA z{O|lvC?6j?*DG&VwcB7CEy3oWFsKdejAAje1KKE2vzF=AQF`jq?Guf|=;0625Ivl{1Cb1R}bH>~f!f z>?q5>d$VF6(T&zNK6#cy0X9FZJJ)L;H#~m~xecmvreK#O63Qhv*WcU6L^7!i%;i%I&PT zx~g;;6f0v5-B!I!eK}aT( zZK*r3V3(JdP_NfpD;OAnzP?sNZ8RFti{8#INhGj^p|!YKjF;heiD+9`H&QB<;N;{)*|Prrepp;wY@c9W-G@vj14BbY_Bm$8 zv$Hej++-|qs|&Mp;$}JrT{DWV%)PcS`~k6B12^KaU=Aad>#B?E%_?RjXBJ#ynQ>}riqx(!aL^}WWV@4}k*fMuVFEOzPi7kJUDTFkMZQN1hd3gh&dtq5 z`fhefBHAuFK0Xekqoa{F8ndCuj#0z^*g%9`k_Zb%gasqQf)QcCh_GNpSTG_i7$XrD kj0g)xgasqQf>8i~|Lgprj=R5R?EnA(07*qoM6N<$g5hxY5C8xG delta 1136 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 Pkby(q0bZpCqR;;UKik_| literal 13061 zcmeHtXHZjZwC)ZdC`Forh!pt{L;=aI&kejiLIztGuS*LIYSB2HpenhqFYvNm$6?-|ai0kvC(Jq~_U;gG zcGf*}ULrY$%m4|Bn|*NAZHbe{U}EpPa@W3emR<@1+V64K1@3O;e%Rdq|Cj&M?9fkG zZ`ua!yx^wJ9Ga@87CBhUkdE6l#&OO=U--YN(d`ooU_Y0>g@#QwYz+I!6N_! z0O{>Dy1-eR%sbQOlke)ZZ#LWN?|f3?tv2}nzI_q_VeT?;XL4gw%|dX81ePK0Y0|IPxD^iOjEgPB5qy-!~-J3{~R5OyfTf=^#- zL9+k$o^~JiVM-mYx$JB0pmBFdcakiSXf(5OYgkOKaMi~m@`2is-9eAe z<3y#pv<3auqb#aKw#c????34Af~oSuzC%Z)z@E*uSmt|QrWA+6FJEac1e_93rb$Dy z%U)xf>>uo2nmvnrwp-XVh8L=UYiN#yU;aQX|I!P5)qf%PaU8p^z_Q5Uc*nEp6;+eU zaLPjEQr_jCewF?uBJ0Fq_&?hc1V*->YM8iIq4lV#dVLwMHp7id<2M=ZK#g(Z>1n7e zwhU$MifTKKopsdrx^yLB3z1Mv)xu$q8Hpb;Dx$0kL8&21(I@VFg2CG@=dhoG%-?s( z5EFxtra{Ht;V!T?>cORfq=7`E2nl)soa8Z$)xXF*RIcN|q&F|Sg|~DU7sE>n_T|q; zFerhTAXU`D^WDt>_fyR43ySL9v>*|T@VPaOTv}K?_zQ<^_6w-)CZ>Y6rg&ErQLBnJ zIFm>v)cT`rNa(y{_jaX~%bs+VVB)*d@8^2V9t#LynQT>zg44jp01c}z6SK-b-UixRj)`hG+#~R;E`A+foN6{?nyGL zb;YWo2#fXZfMBtPqt~QNTHEW=l~0Wc_pm;?j|~^;2b0v!sF!UMx~Wk%6rj|J1cwmk zAjhQWBaexQ!3gS{r6YNZ3vMpLi`j_-!T{g4EkGsbQ6py^fn~S!U@f|%3`7!3T_*)a z+dVXgIB|xvsf8J5)y_V#(p5#JomweOfp-)F9$d`Q%i7})3avc!dk7Y%;r%?O32#0*tqLSG3L7Vz(J z`Qsp+x`2^L#q3+Ms;Fs2PzRlins(g5H4S*=)aoaX1duPdFp$>UhA^cD4Y~MKJ(c-! z=+^fOhuoB3o_Ke8{J=txQ9JoHG^s6ZBD*rT!Y|jUL%8b(<7V8;J^eSQsA=~Ybev3} z+2ybI<7}DRRcdE0G9pkR8)qisq_J$uw34-a-$n{yhlATxBcP~qm`#Q8kNhZFLLOQL zMGBM~pp9C&n&E^q5Cc4&s#Cy*u0;&`u4|QR-xN4Rxm#ZMvyhM4pmVnM}cC zj^{f4yoDHbdoxA_r?IpLqKMnOnbh_RMsjLnPnU(O+7~WH5OoKhRZbL2I@tGrGxsvz z2Gna-1{tQ5whqPTG&?+)Jg~302?kUnsgsH?P0rPutE~ZIJ0A*tNRk)1=}*dsH1;gF zdpmjJ-g0j`+uXL%BYH|n`gC*d=dnZ1RB)wyGj>G4zi8;_xqAU1=LaKjBi{i_t={4d zOdmA$z9x6)I}Wgds$R#wh=~~XyMn!rB;V+#Ao5HUYMDC3qszo2LOyX8yH{eANa{j8 zUWeGdc3z0**xV8P`hvQ;>vI)O0q%P8n`_GE`iCSHdEq*iqlYE%KW|I*Jxf6gb005w zISKT{>qI8}T)Em5(@K8>f%suZP$KD-y}J&F+Gi}Nue`E7@Fk$umTvb&qxtcU9y6({ zkohP3_sgG7yj9%o3jcZ~IQ5zv2>7bK?bASJY0L30dTic`kG9^lQj{2uyM)bsVE~;W zTXe(c7CADbhc;U_$t4kvE+{8zTSWxI(3TI#S84Zw)}m_vniY~ny-!UEOvM4 zC512Uwzkgw5fXS8rX}VV*6-B?fJDvin%HDoVAX*X`h~;E|G_)VGLXp76Icq9C@^7oSj*5%T?^c(~gK z*2&)~;nyzhw?gMfl~oINli8&vDxC@?ICaao=Hhm=*|q{pUMK1TM9mf8?>f|5;}%wz zxbD4}7%a;N05_}mtT7|Cz>X7pN{+@zEv8m-86AI3QBkT2o(e98 z(evf{*cLW(*7F^bA-(aJ&r9!wabJ7CDL-HgF0@x7c?F%t9`g2NBjmMKJiFhhBe7SieVR2L72d!e!u5NQk=oW6!>tj1*L;-@vW%=+^z5(gGT zjzeD~&04hvLkC^lMC|u*k6;^W#VU%IwA%11gt1}NZ?6aU9dq(9fqYRn=r)s|AJ|B0 z^QPAcVeW~-hxU9OxQ0ZF0nRbb151(PDdx-M#rwxXT}crd=xvwMAVrjS7ok)JJv2eF zXOZZ?^gR($E)`5~>W1v;%{ORFx~Aj{Q~cL`&aHzsz{DDR$>1qnfJ66yvgx8q@$&r} zH;g&j%=n)^v2dT>jo}fG`n4jcSvI? zM0gQ6Yy~APhcvbwe|q}~L9M-O*#-I~!b_i96^#ckB_a%rq6_6*Qy1|j=xAq^s%y7{ z)27=BRd{_pzlaWoLbzEJMZ|sR`d+Ll2?EgP9`T=3r5mfK;fMp0eSKOQFlC_R!m*q6 zQ^Nc{o;!>)m9j_f7};8NwGvYUy(zD=`EA2q#}=W7x#X9XVo zQfKC+aQQ`%Wj%IUW+3n?@8#d{DJFwHDrm3m0(%j$BAMe-^YXw;cV>OQGw{6fjkUXG z@|?7hXa6p=k}k+D#`gnmHt%qWa69qX%v|Q>o!(#gfP=b0m7e@sCI!Bkm1AQxhFR%!&3X-(C-oA%r(OQKyV z<^Ou7t~)|%O(#Dav{fAV0SLHgh{#H#|B#oxziOHtO56|Q|L*d-k|OZ&3rXc+E+bsR z-O{v9`SSCBxNm_Iv|h?f2v6Waj~)BD&BXZU?}Ya&`fUvA62m1*Xq zwPSvRAUEjIyLE~Y^4sTE)?n(v+F~;6IQ14%K92eZKW{qLq%ZDSI_3VwjS!RqNqp~u zIC+*!^3%_;v!<=4Sdoo&ce54J`d22J*?O(5-hJhTxgtMD`BJv1vL74P!n5LjxnwIA zj4U<_8gwDaK~=!~{E4x@;a!P~fd`+I+WI3D{Q|C&a)+lTQ;}FUDHJOI`hGwtb`j6> z8Q$@ze%&oN1?5$nD7qMXEF4a1OY2=J_@D&7g23yYPcbzTGe7y8S~YU5cKPY|$BYQ4 ziAD;mlKnFg#c`Y%P=K?zEQ7xIuJLM5x7Tx!wyIPTsMnvx(t6Eh5$e!NUqV^8cxj~v z3Az|4ry_7*CpQ9qH2UuMo4vqL)f8L5y?>=UgN=%CArvd9;DNasBxv4eN~o~di||3z zJ2(O(dVLR+S(AQ7Lv$06fSbxf_G|1ER2O)pfM;r@@=LzD-|&}dt!aVPKnIm74gXvO zsp2O>SFSIM!P_qPHGqqSHvgPG9BHK;{J1hRq6MahIMw=L@xA>A9iY~^v?t1qI?fXo zOi3C0w&mrLx!GUDw$o96e$d6yX1@WBY^{5w+-Lm-arR5ETg}7r9a`|Mi3ejf_TWn{ z&kO2sv|NTZeet70%9g6In@<)~X`hedXt`IYN0k6Ole|l^K)O*)7HawW{rum4&CO6d zZk#xQUQ-0JKObdpW|MPwl4gFK)mhmm2>_FdfZesxvk;NFK#5lQDRDlaYNg|Ecs~0S z%6-rDJ+54j=H@~)&$a{-2oU6+6p${)wK5>su?0P2T$U=_sve}(J_G=i(|^x$|9NZshu{4k~0qhQ<9w-T%M!yX23PeuZS)*byG65wNHX0Ivz45yoHVDPLDsM*DT-n4!T z8?f>EU7?A|09*1K%K?jm(^E0B)|@yE!w_C)Gc1e~ zF*^bD(Y=4Ovc7gUx#mo{t+{LXP&bWcS`l`Q5@0A*GWxqYt4?q_BiHOu@epnq zggz2m?C?`$-SFrR`eG=QCKJ)M#W!fwaoUPmYa*}j>&6ur;{Qg;*P0p~WF2Xx#SP`Y zl$M7Fuk>Ana>fzfbOn@DUq86)$Wzea^(Ut>5axA48u5PNP~vl`(+WJm&B(tYZqw|+ zYvDB{x^=KGf3jQ-)A~>tZLKA&X@(sN?S`GI7S^`#T;?^-76+W?cZWl45Km$Qn9UK@ zmw^hSrCix5J>YT9YMak(gS~+9>?WwFXWdSC{Wgyu?^VaB4!@E_-bohT!6teL^9S=+ zd5E6jh9gTHsIuBIVSDm$VD1h)P@@<6gsKpOxuZR)1?YqR28;8S=f?p^X-@97*KNLT zI>A+Se8AUDmoetOn>}`Y-0&#F=~3nNTcvS?qom-N-9XiXIG}GQ@!mJ{m2s+))DJGf zx%byx?Z$ahe)D;DNMpG>eGfdJt0TyF~s|4dR zdP(Uygf04Vk-9!nT(<=7&hS*dFe_|MI3t;63;7xrIMmQ+@k3IE`>!2JyzQp!oKTD} z;(wreM29ncZM`qL%tu%kV{&b8LgTdVUNK+)z=10d z?rqmaQ%r$&<97)Gha#*|YJ+)5xIDVXJFJDp7GNvO4R&$*q4fHgNdZ;%m`8lmH8FsX zj9)Ys=c-x{$?AbATG24Vp~5fbdHZCgz{av*p1?2Vd7ap(heR7|p- zXJV1w&it6~&sZtpWf6Y@PX^6@4%XX!vk!I3a6ilCn)=}BA$Doe@^~J9`6;R4YR;{eO!#xOzNyiPhr>_S`3>rgr>4|j<+|AqOV8!>yr}L&} z_@Ko##S<4AncolgK`z|`(x+-xz2~UAP)~>Zck~V91)^3Css?g;Qw()d(bZ%)Td&_6 zB*X)v?%Y#{lm>()5*W>$DU}CY_sa zUiGdl9nMuqd+_qr0B)ONO{FMMBKwyx8J~1Dv2Q7!xAbDwaie5D84N)sLZ%9MvV-Jj z=>(9aZ567u728;F8q0QupxUy$gjv&BNK<*pR|<+%4o)*_!UGlrCqaLab#h1fjw9=? zq+C?dq;;;DV|ie1sA{J_m}5>m(&L!96?h@^*CTBFT^=pf>;k%aID?cT4%-XLo=q)d zFTDX9dL>ALlG}ERs93DFt+{!%>HuEen0uODU&r|+B3NcdPqg599@Xil<4lK%Y%e-z zJOkPt#2)Uth^c)S7F=5=%`XnBdL;(v+Z^8I>tEZ=s)8icpys;hIq+-&)zz^xVUU}} zPx{kB{J?x$RPN7|lup|9@fYfg;BTeLbH>cI!ZmzvL55W=pDId{O0cE|Nazc|D1 z+)L0}CE+LITi61C-7y|Cf85YU&r5yQ!_cb}8?21S>G)X>0e{{d1Sm=caMt__PA+vD9uV&v&Zj&Iga-91fzzTNgEbf{otsB@Kv&SGU|By+>$GP+ z(@hdgyfzVpyY|C@0UXWGsvD3IEvQ*F3AwckDw?1mqW{2iC&PAy6^adG+r1wsq9l5O zAvi6+h*>NWS;iHAWO`>xlz#y?__dJ)eXKMa5`4ovVds*}lz6ISM3xAo37^JPDX6;*`vPxR7dp8;o@ZgX{1tI3N@@0Ka!FNt(j%R6}J7Gu; zBf#K_RMPe13~FdBp9`q>s<|0pqg#pEFfk%|{mSY-K@#K4V<>iKT6<08!NrlU1+U1) zB%jlI0-}|xKiLu+%EaXXA9MXr)|E!hH2ie;*}2ySAPmG7Ub6P)?7odl@0=7=ie6w> zDtUj{UIWtl?y;zYw+5Ej$1!a%?e;)Vl>drW5UAVjA}#VhvC{Arb63$U&Y-zs5r4E( zTiR00X7?uc$V6d0-~D(I7iMWcALoG`MkcKt>yMKs6<$nj|SoXh6aE7ckWc0esznk3j*d{THu1RQaXignt zKx-v&?n+wU%G#y(Bzrc?Sr|>W9`Ngn4h^kFrw9ZenY*%z34*f2@V@cgXusayF8pFo%ZsTBd~#rO+p$w2;*TWp z4U38V%VWkv3u&pM7sk@ZDr&X6z8(yVzuaT5i8-zjKG?Dudo6d2T6=iw?am z9+3s%;35x-+{dv(mR3`XA4I>J@?QAXUHf%u*H^*b*LjM3z~$JXD#oEt<-OJE=lwy_ zO{p)}av2WWp8?vNVnzB*q-RFXbs^+=Vr(}AXy(cnT)xo={MeRl8%F^E^FIuDEBDv` z=Z;b;2xJV~hnakEyqhmCHSE@S?m2NTU=FP(gxS^0dp*!N+$U|mSL~zUf7UDRKNPpy z6W%pEUHf`ti5Q0^D?c5i7hA6dZE=3e{|b7fQxY^Pj|I zwMXUXN@^z-`3gP7$G`yI zcTPskPUY{Ba~bld_DcrY8}B5cC`x@Iq)dw5_tUAeX!65JOq@B*mgbn?mwO=Y^%fbl zEuq_zK)k(XJW=og%dYc>QX!I8or)<%2cg&+J&9y=#y@{i9!THr&^08yVtC617%nTG zgrIiN2WUC$XfUxt`p5!qQojG~c5WEo?+{%ZK(g3r5a}aEGAI_8QjFijR*;~KZD5Y> zuMIzXA^A~ZmVA+^qIftUn!~KB5=}F0<(mBL-77qIB$-7p>8dJ`3xmTFM~)Uz3WT7J zRMVK+WtyX!%bHToX88rA=P;{q@MCrIiEpypMW!|KnWKYSB=zKDX13cM{m-MRx1JgI zXvC+S&3)bzo{UT82|r1nn_Mh+d$eUgcI=)BLD!)>F;x2{B|et(+3Z(#)D0@wjRxXes87!TF7EsmLXq24Idhwt21p0J9UslldmEHL(r;Y9`cw43B;o(P zWTDB+hfcwN-xn}?=a}1mP1z*IK>=>Tr*C{44~zW~*JLCf5596OBC0oEZ2!N74!5;y z(A}By(K8$tbKUk3@N-iobp~JmCidpIO$y1r=kj(QS7&EEF+edwv?F!T@!o;RbKio> z#}`<;ZeuMf&F?%XFZfy71?P{_xJ4S z+fcnCpY}l5!A8sqeDpK^ct|!lzrdR$O6BT};QZ2Sr0hiSMQ%Cqapzx;Me9~)4OuJRE)LzZGbYtTp*%xbrV(4W6A+S=H&GAz{D>a#;Tb#X!W77&HW8>orr@ z4y&Tia&z#o`3RSf@|&P^cjs6$&bOn>?vFzsJXz{mFM%O1OXV=>U7EbME@?Lxe>joS^SsFTRVY8qdUFjoPJV> z%x7Vs$mFkS^oO$Ck*+*G5GQ2H{r8$o^UhQv|6wYU8Cu(BRXhD)bgJ+nkj#^=(+f+D z`&*^oc-xy@)H%Y*gWjSiR))eVh|jVULubLdK*e)1}49iQm z4awE~R>ykJh$dB`^VsjFg78MKt1JzNT>MK(2(>%+APt~WWyfaWLsVzZ?XQro3cC*Wv!4zA?2g-|Hbt{_83@x}Xbg0nphuX%FGnV2X_9zfNzj$_K@picg23Cj9T z=z-mja$zHiK>e(~G|2d(GQBl)mIp|{a%LZ8SB6bCrI|(qP@-LE8zvE~O09dz3n#QK z1UVz^xNda9OL zg&%B}%8jM8as1XCBktTt31+PBP}~G0!8rY2*b0;m0+rZsn-Psb~|l=f=;usV3>K2r(M*z&hdZa1y?sX;HIROlxS(Nk9*y0^(bcz>1s z`s!3Uekp4@S2kcmfHx&FD%+V`{bT{aNb6Q0MMK7##n64F^OU^3n32Yy_mb{mNOu!P ztfEF&{D%e5lka{{K{Ntc>1ME_1|9j8W?jdGaPrp+FqRqzl2{;PwZFm#;Ghntw zj5a#Ih0aJvJzol{p9;m=2eZzp-zH}zu$v9HgMiIk7O4A$^7?+^?q~g#MRup|FvNhW znoTKoAHe~&=Icy|aC%QBorJpAG6Sz_ANCn>q%B``l$RUWm@NfsX_>{a{crZu7ND!{ zbSAR0q;PUJxp5SejXEsW*Z-CBDhE8^9w)cMNNbnDNP}=8bg{@Miw|(#12UG0VirMS z(@G_=N50GL>EG!11jfT;cR7>~r+rH}cH?kRZYa%U;)4^MMUjO@9F>^GC43SEo@U9b zt&Qml>tTeD*CDFbi&*7lmP-wUi zXQCOqE|O+;_;3^SXL4xx5Pv&;Qb*=dfgTja7*3pGRB&#Ph%CkY0yoma<4{D(>1?^A zMIu*~A{J2EUiYntI>luLu1sg#j#cJ5YSX4|-L|T%%9Plak{dY7MU5y{OE-sI4z?t+ zW4&aMp;-NF`guZMkz)&R6k?k${fw={!5yV?WZl2MRS>#0Tk+w$bHJc&-*y$A-4vo~ z@DE&tJAs>xtrhw<(kk*YW@)te<00BETuoJt2d&Eos+yTtu(~~ENPA69%w4x7zHjvXPK7KpC?Vr8#Ve%1 zU18g^BY+p1>HU&&V2hoeIcz{AU^SX(LBx`Y^85)K&0YD3nHJ!*0X?(LYIWl8 zot-FP(*u+1>qPqT5*uV2{3cRNWEs!M_Nlu=_)F8YygoY+SoTFDY1 z;o6>c%Fe8JgHS^uG3U{m(piSF{rz-PsL)5VQ8>=vmgB6qtP zV#BkyIQc$5;Zzx3w7Nh*(QJ>pX_$)at0wpO5!Jl$<0o$HauvK1N#qP+JtJzZmKda%j-JwZ>dq>)dFgdzriD zBCoE~b~ApT&{+yRSRU@w;PXl~srp{-81<*bk>f=_yZpJu(@J>GV)U10@+@sjfzvKk z4<*Aznk<<8U<<(hW)$Gm&Wus5Ual@F+c7KsSkfi!eAClbE%o_#?wmCOF_1AzH)9{~ z8A1%oWJLf^O3CDS>nVrBA7}7?TFvGyz#XuW!Zt^T-j$wsB`p+|^5X-eX2-&TqV^~g zdykyE)D3B9MYyUTcT!ARQ&+#k&-O+(I5hoC-XyB0{<=n&Bb@GmWLhQ1r7)t)G6HV9 z5}YD-(x>CG5wrI4*_SP~Hl7bQ6?j5Q!b!EN12tkY#LT(&>wCZ_+t01_rSx#SJu7Y% zZQPK__2nO#xHR#I!TzO7H&_S9b$FCEQ^|OdQxNZ#3!reCVY15rhT%;N|2k=1c|WW4 z2Pbj>(bG-%9+BAUF)M+2W7vw~B!E#Y=YqWwd%Bu-?>h6Fw*DGU)AV0r*$UjlGD*nb zw00-XtYc5gJh9wgFOQ!Y(kOv3@7Zm*?n+3?UFm)t|HM+EPw_rq(msbeNg1@EDRETU zy1;1a5D~o1=tu59T^pQ<{QVGI^8?Sz;p;a@G@5tt!6!}Ot>=84KAq_)QXZ}>o zWK=4LJ3W)$BxaRtb;on+if(gg+-BLbu`8mjyH>aghHb;iup*4i`&;y`A_mFpBu3ff zd;?NAO2hLx#N*bIpTr)UFl-GxI(P8aV&`%9)-75v_1hi;i3`3}9^FgI#=h`vZJ=aB za(Q6oLNR1wy3XXg4Ek;heur!6Dk+CILZ8$f1E!H<2f4~D%MZE*zB)zD-JgO}Uobs&KC}D@xZx{@GQ_N>0-c9Cq zJ}KK1xUF>hC>S#&2Q_FA;27p)Khml_@QUfujF=Hit3$Aj6fz;k9#hq?k34$M3D2u0LHr`i;M>5Wl_)Gtq#pf-6y~LF%dzF5zwyN z^a&nxLAtv0b*qQQQUNk_%aKFn*Z+*QUeE*by3KYw^vnrx=!wZO11IY><7HrMX@{Jm zk5VPgsi6JLay(Ot&m@aR(|o4jH&iowKB!S+1P^d88^(Xq`BT z3%>Y^uA!mo;VM<<71kBw?Fvn)UCjf!r^28*=L_OvSZ=5L4zwr-3!Hub6V?;Tdq)x! z$a-(^T=RVRH{BbSH_GoOKO9?*Xv{+?zff;I*K|bS8A?wvO|W@IOBSyWCB%pi#2%qr zr_gRjjlrYqxD~#jN<-)O>YYLb?pY3jdEWTghI?O#*!EY?zTs3p+m$@{F^YWun<6$< z%Cwuh`JK`}zk8H8MK2v57fV;@o}Kn@@+w$k{;Og9SJCeGVdw12F6|WIJnGx4e&s5F?t431 zailfii*IWh<&{gr!x`jj4>q9BQz`p(&+n76SD~C#KE)E+XVz5e>F?cCkBO_%?1O@s+1aJ2PcBE4OnwE@Xp#tz~Pm_WmfTe!c6p z(-VzEa^)gfCE@2+A(!scJiye+&7lXk)yKjbCl8I=L%99uzuX>uIUu1U&@F|AIOV=o zP)p!FSpisl{A*{scNK-_f3I)T{iCV5kp6>x~VSr^5_bwRbe$i*9 zmRfY!{A$u&1@IxTUghX@vz}=Q+m$R?_;RXdtM20SKgxzwBB(J+S1Lnno2C^U=Am8@ zRdD7wJosxk*ySd!5l$0-%Gd&L+$sn_IBfHYR~E#?r)byoImd@ z`8E7G0yA)BnKrJXP0&;4#Xn@Zc2~sKPb(BB)AhH zZ+=0YieF9zw+52(9|j&Hy|;c+5mtP)@=sqblDp8aImG{d{%O;H|8Hic{zu*`D^BOw Ylm2mr$%_ Date: Tue, 3 Aug 2021 17:49:25 +0200 Subject: [PATCH 3/7] Add new icon manifest --- front/dist/static/images/favicons/manifest.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/front/dist/static/images/favicons/manifest.json b/front/dist/static/images/favicons/manifest.json index e09fa7d8..f7b83b60 100644 --- a/front/dist/static/images/favicons/manifest.json +++ b/front/dist/static/images/favicons/manifest.json @@ -47,6 +47,12 @@ "sizes": "180x180", "type": "image\/png" }, + { + "src": "/static/images/favicons/apple-icon.png", + "sizes": "192x192", + "type": "image\/png", + "purpose": "any" + }, { "src": "/static/images/favicons/android-icon-36x36.png", From 707040b506a080b029bf8d92c139377d04628ff0 Mon Sep 17 00:00:00 2001 From: Gregoire Parant Date: Wed, 4 Aug 2021 13:33:58 +0200 Subject: [PATCH 4/7] improve PWA and last room strating --- front/dist/resources/service-worker.html | 80 ------------------- front/dist/resources/service-worker.js | 61 -------------- .../dist/static/images/favicons/manifest.json | 4 +- front/src/Connexion/ConnectionManager.ts | 9 +++ front/src/Connexion/LocalUserStore.ts | 15 ++++ front/src/Network/ServiceWorker.ts | 18 ++--- 6 files changed, 34 insertions(+), 153 deletions(-) delete mode 100644 front/dist/resources/service-worker.html delete mode 100644 front/dist/resources/service-worker.js diff --git a/front/dist/resources/service-worker.html b/front/dist/resources/service-worker.html deleted file mode 100644 index 9a1f6379..00000000 --- a/front/dist/resources/service-worker.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - WorkAdventure PWA - - - - - WorkAdventure logo -

Charging your workspace ...

-

- - - \ No newline at end of file diff --git a/front/dist/resources/service-worker.js b/front/dist/resources/service-worker.js deleted file mode 100644 index d9509b6f..00000000 --- a/front/dist/resources/service-worker.js +++ /dev/null @@ -1,61 +0,0 @@ -let CACHE_NAME = 'workavdenture-cache-v1'; -let urlsToCache = [ - '/' -]; - -self.addEventListener('install', function(event) { - // Perform install steps - event.waitUntil( - caches.open(CACHE_NAME) - .then(function(cache) { - console.log('Opened cache'); - return cache.addAll(urlsToCache); - }) - ); -}); - -self.addEventListener('fetch', function(event) { - event.respondWith( - caches.match(event.request) - .then(function(response) { - // Cache hit - return response - if (response) { - return response; - } - - return fetch(event.request).then( - function(response) { - // Check if we received a valid response - if(!response || response.status !== 200 || response.type !== 'basic') { - return response; - } - - // IMPORTANT: Clone the response. A response is a stream - // and because we want the browser to consume the response - // as well as the cache consuming the response, we need - // to clone it so we have two streams. - var responseToCache = response.clone(); - - caches.open(CACHE_NAME) - .then(function(cache) { - cache.put(event.request, responseToCache); - }); - - return response; - } - ); - }) - ); -}); - -self.addEventListener('wait', function(event) { - //TODO wait -}); - -self.addEventListener('update', function(event) { - //TODO update -}); - -self.addEventListener('beforeinstallprompt', (e) => { - //TODO change prompt -}); \ No newline at end of file diff --git a/front/dist/static/images/favicons/manifest.json b/front/dist/static/images/favicons/manifest.json index f7b83b60..1cf2a835 100644 --- a/front/dist/static/images/favicons/manifest.json +++ b/front/dist/static/images/favicons/manifest.json @@ -116,12 +116,12 @@ "type": "image\/png" } ], - "start_url": "/resources/service-worker.html", + "start_url": "/", "background_color": "#000000", "display_override": ["window-control-overlay", "minimal-ui"], "display": "standalone", "orientation": "portrait-primary", - "scope": "/resources/", + "scope": "/", "lang": "en", "theme_color": "#000000", "shortcuts": [ diff --git a/front/src/Connexion/ConnectionManager.ts b/front/src/Connexion/ConnectionManager.ts index 11f03a9e..38272737 100644 --- a/front/src/Connexion/ConnectionManager.ts +++ b/front/src/Connexion/ConnectionManager.ts @@ -105,6 +105,15 @@ class ConnectionManager { let roomPath: string; if (connexionType === GameConnexionTypes.empty) { roomPath = window.location.protocol + "//" + window.location.host + START_ROOM_URL; + //get last room path from cache api + try { + const lastRoomUrl = await localUserStore.getLastRoomUrlCacheApi(); + if (lastRoomUrl != undefined) { + roomPath = lastRoomUrl; + } + } catch (err) { + console.error(err); + } } else { roomPath = window.location.protocol + diff --git a/front/src/Connexion/LocalUserStore.ts b/front/src/Connexion/LocalUserStore.ts index 07c2487e..25b673ac 100644 --- a/front/src/Connexion/LocalUserStore.ts +++ b/front/src/Connexion/LocalUserStore.ts @@ -17,6 +17,8 @@ const authToken = "authToken"; const state = "state"; const nonce = "nonce"; +const cacheAPIIndex = "workavdenture-cache-v1"; + class LocalUserStore { saveUser(localUser: LocalUser) { localStorage.setItem("localUser", JSON.stringify(localUser)); @@ -116,10 +118,23 @@ class LocalUserStore { setLastRoomUrl(roomUrl: string): void { localStorage.setItem(lastRoomUrl, roomUrl.toString()); + caches.open(cacheAPIIndex).then((cache) => { + const stringResponse = new Response(JSON.stringify({ roomUrl })); + cache.put(`/${lastRoomUrl}`, stringResponse); + }); } getLastRoomUrl(): string { return localStorage.getItem(lastRoomUrl) ?? ""; } + getLastRoomUrlCacheApi(): Promise { + return caches.open(cacheAPIIndex).then((cache) => { + return cache.match(`/${lastRoomUrl}`).then((res) => { + return res?.json().then((data) => { + return data.roomUrl; + }); + }); + }); + } setAuthToken(value: string | null) { value ? localStorage.setItem(authToken, value) : localStorage.removeItem(authToken); diff --git a/front/src/Network/ServiceWorker.ts b/front/src/Network/ServiceWorker.ts index 9bbcca85..59f913e2 100644 --- a/front/src/Network/ServiceWorker.ts +++ b/front/src/Network/ServiceWorker.ts @@ -6,15 +6,13 @@ export class _ServiceWorker { } init() { - window.addEventListener("load", () => { - navigator.serviceWorker - .register("/resources/service-worker.js") - .then((serviceWorker) => { - console.info("Service Worker registered: ", serviceWorker); - }) - .catch((error) => { - console.error("Error registering the Service Worker: ", error); - }); - }); + navigator.serviceWorker + .register("/service-worker.js") + .then((serviceWorker) => { + console.info("Service Worker registered: ", serviceWorker); + }) + .catch((error) => { + console.error("Error registering the Service Worker: ", error); + }); } } From 383bbbdafe1617fed87df8a1fbea14a4f604f3cc Mon Sep 17 00:00:00 2001 From: Gregoire Parant Date: Wed, 4 Aug 2021 14:31:12 +0200 Subject: [PATCH 5/7] Force to add service worker js file --- front/dist/service-worker.js | 60 ++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 front/dist/service-worker.js diff --git a/front/dist/service-worker.js b/front/dist/service-worker.js new file mode 100644 index 00000000..2cda9379 --- /dev/null +++ b/front/dist/service-worker.js @@ -0,0 +1,60 @@ +let CACHE_NAME = 'workavdenture-cache-v1'; +let urlsToCache = [ + '/' +]; + +self.addEventListener('install', function(event) { + // Perform install steps + event.waitUntil( + caches.open(CACHE_NAME) + .then(function(cache) { + return cache.addAll(urlsToCache); + }) + ); +}); + +self.addEventListener('fetch', function(event) { + event.respondWith( + caches.match(event.request) + .then(function(response) { + // Cache hit - return response + if (response) { + return response; + } + + return fetch(event.request).then( + function(response) { + // Check if we received a valid response + if(!response || response.status !== 200 || response.type !== 'basic') { + return response; + } + + // IMPORTANT: Clone the response. A response is a stream + // and because we want the browser to consume the response + // as well as the cache consuming the response, we need + // to clone it so we have two streams. + var responseToCache = response.clone(); + + caches.open(CACHE_NAME) + .then(function(cache) { + cache.put(event.request, responseToCache); + }); + + return response; + } + ); + }) + ); +}); + +self.addEventListener('wait', function(event) { + //TODO wait +}); + +self.addEventListener('update', function(event) { + //TODO update +}); + +self.addEventListener('beforeinstallprompt', (e) => { + //TODO change prompt +}); \ No newline at end of file From f9992876df6d71dc85bd883577c09d57d15f4975 Mon Sep 17 00:00:00 2001 From: Gregoire Parant Date: Wed, 4 Aug 2021 15:05:11 +0200 Subject: [PATCH 6/7] Update PWA apple icon --- .../images/favicons/apple-icon-114x114.png | Bin 1215 -> 1654 bytes .../images/favicons/apple-icon-120x120.png | Bin 1235 -> 1720 bytes .../images/favicons/apple-icon-144x144.png | Bin 1480 -> 1800 bytes .../images/favicons/apple-icon-152x152.png | Bin 1296 -> 1817 bytes .../images/favicons/apple-icon-180x180.png | Bin 1692 -> 2090 bytes .../images/favicons/apple-icon-57x57.png | Bin 950 -> 1065 bytes .../images/favicons/apple-icon-60x60.png | Bin 1047 -> 1188 bytes .../images/favicons/apple-icon-72x72.png | Bin 1041 -> 1254 bytes .../images/favicons/apple-icon-76x76.png | Bin 1086 -> 1315 bytes .../static/images/favicons/apple-icon.png | Bin 1653 -> 2395 bytes 10 files changed, 0 insertions(+), 0 deletions(-) diff --git a/front/dist/static/images/favicons/apple-icon-114x114.png b/front/dist/static/images/favicons/apple-icon-114x114.png index fc41aaf41fd7c02ba1fe5575e93eb8697c30f8e9..3de5f8c4346bd901d4cbc3c7463a463f106c44f8 100644 GIT binary patch delta 1617 zcmV-X2Cn(P3HA(-IDZBxNklzi%8x6vyA4f5?Y_5=*uvTZ&^8UE`4a33fpf zQMiW2?vaubD(DEEk!YYHE}%mg38ldZ(~-i$5E?7O*jAc5@ST61WBdFAz0<5Sx4Hdw zyL-3u_WO}m$(}vCv-7=q@6DT;b>`~oike`Eh-QfB9uZBd1AjEnmO9qeu@&@6L4;)S z=7{Ja5#5DovGNBIJyyq_pBwoV@)ITCU}7I#Ci_IRs18>_y@X`bxlBYi)83+OW}ArS ziD=cS8d;b6alzjqVj^G-eo>aOAx=Vafv?lkPR8)D@|&;G$h6Kw#Kg0tbh^eaBuAy+ zr@fU7VL|Vmx_^*EYW#x8)C~4jFj^aP>OOK2A{xbDqaMkbnSavWGKMnC!xF1UI)=3% z@zk{A9tq!QKDV+e`3(`xX3i24n9WR9g|NVIA=yVZH6aO-gFE%&nW#y>uvws^Sqcl7^+En?8skbQC+Z(73 zttL_-S%l9&`tbVv_VgWk@aVIq%UgW$G@yJ>OQ;w-utzqneq=leH8f1 z)M{W_g#aOi03n4CsgJZ%t)9{IXMfgx8Z-c6^lLOzp4lxF>aG(cfZ^arCyD+t*38b6 zZ@;M>I)6a}Aa49H0TlDWyZ2xFEJy%jFCR4cY6UQ@LV%D$h}1{2AA0)p%Jq5qzkh3{ zP-oo5zuC((2jz0zHQdTu{I>EFm5Rmd^BW^0HQ)M%<`encZ~4i5p1QiaJ@4C2A{DY! zEY$hLp#IEW-Xf?^db+aGAR+LM?}UK8JQ4z+Wq&|OAw)X-K+?Q@V1x0)!L- zgcL%o^O2^*L7JEE&SsO*7eWi^6_N7KPft(7-li>_pP$p=;i2oTbGck1>I%~;1PCbv z_s7`VK=^fcSWVv+Xt zUcG`fpU;P?2!xCQ7Lk()ZZsPtIRVou1b+xA1en&4us^g9op?w#FfibF;p5}u$X7%_ z$dIrT5K;(j^O1UhVD~X5!4u1zlhtX*WOE{f zG@1VXewu1xD}2+#(EjkQ0SI=)03T^XpAh!5AdKe}3x$I3YsLkHv=Ow?c_liph;yUSOvl8;1daOK3hxJ) zRv|!0AwWnWz(>Xa`&r%BwqomD>_YMbMY&om46WLhz+-296&)}8a9c4D1u(5bfRI8E z?IZo{rVeXvd7+ipinvxxG>a9|kAFby%fc>8+A%y@Tgv7|gBvgZ z$Uamb1M|6kaG#WyA*L#`6I6H>&TFfAQr>+4(<%fADTL6bRe!~ZA5-KPKPD^a$~3!w z<6XmU*WfzvfZu}u-)nofIlr$p34|7sS6W+eV8DC-qQLKfJ`B7l%xjCd4u8LDW^8OM zlIM#Wm{uV`NFhK-Aw)Wk8acAnAG6L4os^MAfyoRx3PqP9w`I}DFg^91Qv2X?TsJ-7IHo9 zjUa$+2q}Yg7IHQ1tssEqjDH$N^2@acr9Z7;-n63D#k9AC!7On{w0h*E@|Eb7=5dRN zwyYkxgP}FW;l@vxYA=rMYjC!O^6x`Y(ke+@AH=jC!+rWVNF#hDF5BK P00000NkvXXu0mjfS^FPa literal 1215 zcmeAS@N?(olHy`uVBq!ia0vp^MIg+<1|<9Mw$=hE&H|6fVg?3oArNM~bhqvg0|QH; zr;B4q#hkZu_xcMb${e3B78R$J)VhVUEMwM!$vQkzX)!T{mm(!3kM4Jnkxabq8P0w* z(s#y@83IB=aaTlE@;U_{iay(a!~1>1z1a6V@7jvDZU=DHf*(~ zQ01eL4o24|hlvUSDjXu5OvEuuUhU~wyVdk-S>ip5eW4mF+$RU?K3{Ka`}Vv^GWE3}1bJ8uRIRca@0K6E{VleXo`uV6X*hb(Fcr z^e)%0PaiKTjJfx7ZCTwvqoq5|?bf~Pw=b9y|07y&^`mFY3g4tKe69T0{A=^xT&sO` z%4>yAE-74hli}2?|GzIydc4PRVd)0r31?Te_s^F&{yuJh(ENM*&6i5bNfyqDkBI%Z z>e;;WJF?op%DdjWsIhG7pTzcsqAXo3j@cPo+YbJDYn}D$=o-zlXML^}{${jy}; z&27nf&u;Fld~)Qn=kdu^*>&cX%}%R5w2d4j_ElHTe<329+R+hq`s1YSu@H}Za10mt z(aF-N+bE_yKmJWIOliu@@3%~>pfx{_TT>#7po%{-089?bJpa^lQ+-TnB=48 ztT+km4v?-p?p8C~=FOXT>z`fE<;cwI4<9C8Hc8CfzCL^HtN*QXva&y8d-Xd`WNnq| z+-3w0yB~5<7d5APt%}jxz3)_v-ttX1PrpCA>uCAJO%fOG-_N%yuc=w1HMOfyr<<{i zd6B||qdn`^=`BvnTwMCl=~4^hd8M~{Dsuhv*VaXRKJnAaNP#QqOM3Y7EgN_5zHMP= zVPRojFxlvk!sJ?T>R`9FQ~0~0hk4e>gJqppv#kkUuHg1S zmBbkWNEE3D4i@btxEbYo)R+`DtXub6N$B}9?MKkK6~DCr%j zOp%U=j5O5xnEhYKbsOXEyFaWx#4h>6eyXg)?a&Tsg;yK;L4lhfpLsC%#&qA5-e$?= zC+ZaDR@Z7=Qr@Jvdg{^Mg$ote-d2>1a$Mjcpdr+)LL<7(okM9%n)PLl$n_qK(Qo7}!{*TTt9ufBx zf!Qi%<%O)H?^Zt2(ACYVUB2^9!q&VkS)#JTD diff --git a/front/dist/static/images/favicons/apple-icon-120x120.png b/front/dist/static/images/favicons/apple-icon-120x120.png index c1a99df6c19dad7de60768dceb5e5276a197b832..90ff4b18f1f87d6f6586b7379b66bd5befbf77bc 100644 GIT binary patch delta 1684 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 ODF#nhKbLh*2~7Zy$w7et diff --git a/front/dist/static/images/favicons/apple-icon-144x144.png b/front/dist/static/images/favicons/apple-icon-144x144.png index 4480a09ae9264604f2a3731928493456792f435b..1fc655bbee8772b1e4d148be6d7ba7c9a51ccce2 100644 GIT binary patch literal 1800 zcmZ9Nc~lbE7sqij*K#jMP&2YnW3rIU6qO7S(r}4!O-rX-8kI!N-Nf7{_a(=a3KU0Y z&{PzU+cBN8a@@CxLQ``AG=-6HQgrA{^;^#Q-1q(Go_F58_xs+?-8g3eW{H8_U zyLWF- z#32Xt=(V9gJ@1QOtzu}6n>RVj&P-I|Pe=>Fvxdg>u*7{hFwR-3Ox_Apyf@O&2vuja zVxyv~w}QJ#j5!`J10>vPv*CCv04MVU9>%Z`>+9IO;;2ESo18MjyS|ftONOf~lM@K< zor+nlni@o!q{yD)ycN7Q8HSCiW8UK3hW`R1Fn+Y-rOvVirN@wuOSuZMSCL>=29815 zmv^v<50J8HkyCN_ZNAe8Rie6;A2*tYe$Dm2%-*y( zUj%3`zj3d94Khna2t#T`N1l-=WPNRLt#7H=TGnei@{#4ej<}l*A^%5yn0p>s#}($`{=3&0yDsyr~Jq2NMW!It`{RR9f@~Pf)R=rKOcmB9R>I&)(a6-C0S;{9XCWVH;xVV`#W< zSZwvcJAQ7tu18ik-y((4Jj=Kb4rJ@wX&G| zxk!%PIG+ow1set%LkIK3iDPW`ck1fuI$`*)BlFd7>!s7_FSy(rua%NbR2*2bGORam zB5<2kksgYTeOg~yz0m`k`*;pIbNp81;qC41j;Xl&&6<%Y3to-#H%0ko*2yX*t`NV# zKunrR>)9~N+LNU!dY@r5tFC&Q9oy@Ja7_^ty+LaqvyZ+A;(K`Q`F-HhT=;j4`{m`q zuXmij){!45JM)Z)hamkNyjqvDH*>Vl&c$D>hGeAxv^FwVUGKTfFn5#>cY z0u|Lou^XHo^v}Ef-iWUScq}z;C^DgHyp1it*01~P3r&YdsCJ;q>T5B~IkQzDkKP-Z z(z^3ko3J(GEczoT)EE5+q-f}%qM0w7K2vq2BxK}k>%Wq9uu2(BCx z`9OgFV(3qvzKo_&>wv@49zaFjJiKzOqtOPmFiZYkJR_g$nODR1*G^~UZCQm;-5Sduz~uXpivVI9nV%b#auHQY$Fv^qz8tk zIKqlE4$xW1Hk2VHCoRAn5w3drXY=z^U}X7hzT{;DQj86rj<#za(B-=iKJsq91QvL` zvTsOnO`e`i^;dsy#Uqv6ktRbhRgcxi5%a=Mx`A`{vOoF`p8G@XN>!(0Ajl3fAsm6h c37OA#XBS+l8I{pqlCKSbwZ)<8Y_2B%1Ncl$i2wiq literal 1480 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 aaFW<<^4h?YFBH6P5B2Gr)jSM literal 1296 zcmeAS@N?(olHy`uVBq!ia0vp^GeDSw4M<8HQcwg^oCO|{#S9GGLLkg|>2BR01_qWx zo-U3d6?5L+eeWd_DAWFN^FP%fmew$n0G4=;o8J0LyP9^jE|`8(_KNqy=oQ)=`YNBN zs%Wg<;i&ELdeQ2*#KNY@)GR`(aF)*M!@IZsJomQt{>zHDM^|5e8_&OW`{%Q{ zd+&ew_ws7`>vwP4`&WMZdG@q;?fq}xrk{Ts|KF=xCh3?zioGFen?2@lzI^$c&xQ2T zzm=QwW#=hl3GZ(ZN>^jC}X{iWT} z^Y`T~zqRdEQNyE4t&fEKbSzw*AbvZQGa>%w{qo*l@B6OjD9m$P99KT|ulzmT8wV`c zF5&c$+P^9^{CDKr*M%LCY0Wj)l>R5_3Mm+fuz~~OXt}6k*L+w2sf2%$?rqz>YuBUr zb?4R8)$blT;ll^QQKv@{*clRy1yn5qCLvvf(*cIP3xOG}&UnHg+UwJd<+n;mY6>|_C_kdvtY^1wMX9;lcO7`c`&)&#sr{>*r?r^bWS`fM9w}|EoyKBj zWOV8Ce>G!s^XIj9`Ci<-8F@T=qkdWY5qm4ES7~W!R&krZhpoTPT0M>b7|e$=T=_Vp zXSb~gv!35?XlM5>Ej|5rodHLVLyL~(O_eo4D@*pI3G=xo%u!N=BpX9E?HLyi*4*P* zR*okMpo)!5(gcF|PMUN`jzwD}gQ@;M#mim3ETbHc==UtVu(n+N8NG@Ju+_t8Sc*B z`rN;zM)`*Gkqv1X&EK|s->$2xTN%GynqzXFQqR;Bv6sJlVg=b(RCa!?T+M$F?y^S5 ztOa(VB8PQ8?Q4Jb^WQ$l`F}k0f?ICgy?eG={K*@G-)ZgNZ2Oy$(`blDa}AGPT@!Um hgsuY%9?$vB{G4IIgIxDb8-PU|gQu&X%Q~loCIF+?M%(}Z diff --git a/front/dist/static/images/favicons/apple-icon-180x180.png b/front/dist/static/images/favicons/apple-icon-180x180.png index 65d4ef68acdbc1b75a7b89c8cb90c89d1a1aad51..64190d74b8a57202569d4bf190cd988e7ce7d837 100644 GIT binary patch literal 2090 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 diff --git a/front/dist/static/images/favicons/apple-icon-57x57.png b/front/dist/static/images/favicons/apple-icon-57x57.png index 754d1df814a9a3edcd524e19e342c5d3d1671609..747c5c11b4d6edf9fc12740958ee60ff272988f7 100644 GIT binary patch delta 1022 zcmVdY#|>Q`DCVzkd|ln}IHpzklW%3(DIMD_82L zA3bJ|93a4LW?s%qLX|{%5S*ERWf?)zOA`5~G;k&Tcq*l6139;Wy_()i4{~%xS*PjA zVzDTBcez~b;ozrlyATKj$nW>tOY-F8MB1RQkKFG6+v~-}1)ZIp*+$am^Xag<8oF|_ zRX{|XpMRfAeog*v3rTq>o}QlCMi~)taBv`zdA(lK{kD}Sm4G#2e}A8)g*Z)sk&zJ! zg+iKrXp$5!GC(XAYvc(AU?wN!Q34XdV339A(a{l;RVo#>4k)2oty)8}mB56m5i*00 zIfWo%j*pKePd1ySwY4?PwjDtd1kLQlZNKm!-+%eKFgZEdkgu<=>)u|v;?Qi$lbA`n zOJA&>9*@UVAErs#jYJ|r!^6YZNAfzbySq!JQpwN+8zzbBLtc5b5-1XkMo`;$Qtilw zswSV$H{P46uG)&E5(vDeKmY&$ delta 907 zcmV;619beU2(|~1Ie%zLL_t(&f$dt|ZW2KhK0qP-6AEFQKms?UH{t{E23DUyA3>Ae zSueS>-f7|^Sf4<9r4Qf*Np0_}B>{TjDhOD9%D*`i7k9U_?9c2{y6l&1(w%c=cD^}3 zb7rV(KA+FQ=5X7cAUGs#1c#(u;E=Qn9Flf{CX(l8r||629)Ee%3c2fm$toj-l}fIRp&4X+QL6ZyxZ zcT_pH3u7#kD}VJjf-Nlzgsc4J^C$SzYC-;9fwZATD-?Sc;KE6L5Ypn#1yG^<*&*=$PQU4JeYc?94ZS-DQZU=RX<0Mi(% zBuAr>w8PdGxZVG^*V$|algWf>63gK8`HXk|2Td`#DxgP9r&Gz-j76GS?lhHyBnI)*AqagsqK5{X5e-~?D=Qtl;4 zA`}V{7k|CJz9wzmZkOZ%8hX8+IV4vJTu>!KEVwhL5cHVga430dwHlPmW!1iSf+P}T z*^Adc@nF0Qd7)S=F4|8{PBd>X8*yl6vLvpg)uk_HPmjmLGzK$CtHE&`?Ck8^9?9E4 zwOWN%tEFp!b(6&ELtc5T5?CbY^`Nz}q|%WMtA84v=NIors;jjkNkgO2fOfl0m1Qy+ z60>S>wh$UH9$2%gk!=U79z5n@ZJW(zNn1P~*VI=x$#u9A(&D0GtTZO&3xw8DLo%5p z1p)R&eItkHwcjW4e5u!Ra#&81=H5!%1zHL(&cwF>W`u{OB$Xzp)GnME#gN}j7=bED zjDH8($F)pe=^Q9n3A3g6$`f^kn}Jv?w)no~BqNasnMl9iR~<}mVv&;+gS99Z!_Ypd z)eY5d*Tst<=$YZ3a_Igoq*AHCU@$O!B7VQ0oEvkwoatk4L|NzjE2v%IkhBXNl6HYZ h(k^gF+5!OZ7sP0ULOaBelK=n!07*qoL1cdvS2&4&+IDZ6INkl50Ez>9x^ z9^^j|PvVWE9y#I(4|>vY!iyLWY9hBrJdhBYmK2i`K1!h>eAfKNoo08s+nw%iX}8;7 zvf1v=>&*MjdvE5=>~2#&pC+MDXY%!fjKZnF zQEg%L#xs{%)C}(wk0qZXI9L%)*G-7!h?;~`-E^Avwtv%x?bwAh;ZJYpY5mVCJ$~|(9mO58L36KW*zcjcWAyy>8{K-$WLCZ| z)8`NG4coB`&$+aJc6N4FR=96qkp3nT^nGcGR+g9P;p8Jtc}FNjLu2FQ^ZV%A;$q=H zA|R7kTcg;|A1qYv+`F%lfGhKMjOwroX$ylKTr8K(GJn^`Au7q;@OtDXE8pARE~%3&$QIS}l+#*`i!8!M8Vn|aC3 z{lmk|vf=J-P5H0oFU)&*J9>3o31N^$k3$K)!2}~Xw>kzSqXEZE1{N*Vj$KF-elR&% zvd1xvaDN3wtEpiogZhoU!wGmUwKTQx?(Qy~o}Oy%wYIiut}iby>HPfMdF@mPg+kQX z*=f6;Mrv6LK$KlvTxc{AuPa6v?ka})$;nAYy9MEKczCF}*V5ABNZmDQVLjw>IZCI~ ztOVBf`~3webVfKFma4~;a8pxL(Y;6{!p^V+6n}viIOTG@&9=5SO}#riJCw;}bmc+b zQNki=K1$=h&-Z`agK}0Oh79U#Z*MPjsFQGwORI5qcBZ*T$HZbW<`p9&BPIXqO2VQy z!6V@MGJ~mW2!jxJ{Xig47`0(tF)=Cy*ANC-ZrNxwO1-_k>^Da4R4OH1Pb1SR2k7;3 z+<(aq1_uYJr>Cd7gsTa3^#1-n9UUE2o-m&lD!oD~1&}Q#b~!8&&StahY$w^M7HZC= zjXDwQ@`Hne!nK%uAiYH5VTPI_Tx#o6Em>5=l@K-xfx^pT zf^{)9A(O(HZ!kC&Mpd;i2p?u%<%GnbczDPcYW>g`_YL6j-=AHER>YpUhY7N2u@ z`{L%mRY*T-(R%_ROW3Rl>{}V-<)fpcwn?hdNIZm8mXoU8#ot_n$? z@~wkcu;9s00Pse<^y`N%1~?`>`xy@@H(n^FuNQy|I5Dz-w?4%qqJLl_?Tio$`*;8V N002ovPDHLkV1g)tFp2;G delta 1005 zcmVYuG7{?!=uRt{-mP%@3B&4a8rb$io)Kk6q z5%h!Tk+0yfz3WNSQ@x1speFW4#9I^6HdI4X`a&V5&=&I_Gn?J%z6`s|+p@o81H1d| z%>3thW_IR*K&#bi(GU?FCb8rT9s+#9UdI>gb$r2IXGB)tkAK`JIyyL@bS6XT%;L5C zm2#Q3KIho?*z`0#U45oo&c}CeO>MRdKWV#AFs#QZ(jMN*-%IrQ4*cxGF zgYwPl>6&1#5Xxq=Sy?T!4^s4dXNSISZZZ#vAsLQFSr`UGLHe?>p*$m!n7v1Tc6TZN z{Tr2vMS8gWSbt-2JCRW8F)G6@(jJDm=PzDTy;`O1Uj=rEjl_K%x8ir$eT;b#++SW< zq4Iu-+3XjK8Vhuox*okUoFF}Eyq|8(?JvkDArv6luXv zR##1XJT{$B8Yp^Ajg<|`H;N877`lvyrH3n(3N;!H&9$+yG0pka)fHV_T)5vl713yv zrlzJGm*X!j`vHuy%gakmOT_bz2}Zbz!~FdGyrbQM;c<3$rnxpcI_gTh(I6 z%Vl;4-hU2-LW&hSBNmHEm18M55C~km7LUi-Cp>|MAPU?HIbP@Z__(Ir!^1;5IXTg_ zhj>>7i=z1~jqAbS|9KCMvx_)nQ0BzMgwmmIGB6>nrrB(2&e1XXe4a(c{QSJ>vjZtu zj3z_`LSJSw9T>q7#6y2_a#ESK;azcIWX8YA`pt#drKKgQI{ep?3}QIh#cn!{FCp=& zqJK8`%C-deOWqGFu6F7A7}o17tdsTj-D*C(lD&%Fc6wGHpz3inPqK(-zJP`+Ps_jr0f9LZ0 z#pJ(Tq!(@%*qXRvyOqL-d;x<1Hnko0yj4Mdf588wB1d&ENTyP;cnyqBi`%yg1wF}*z5R$y^b%~ b(-6@=ktN(RXT5EE00000NkvXXu0mjfDZcD& diff --git a/front/dist/static/images/favicons/apple-icon-72x72.png b/front/dist/static/images/favicons/apple-icon-72x72.png index 71f1a11a20430a592ced55d89ae6a3aa9288a72a..da043d448a187994972b282b74a4ff50c5b3fd0d 100644 GIT binary patch delta 1214 zcmV;v1VQ_e2<8cpIDZ6~Nkl=tcjR8PHwnLqh2Y@92n1843!0vSI1VUjR(stEF zu>!?_BIbC4YGoNIDtg+1=WLz3naX%<$+9r8vK0i-iKLul^?6*D}{38jHDq>x#5E z-C_A#4i-LrB-?MlEGWhK6^r7$dGeTSPd}Tn{eb*JG}X{>Xn`cSu0iXotMK{#tns|r z7JOadV@1~BW0{3Sv3w0;al_eBn4Wp=hZaH{*PwJ?AAf0n#W^`97Udx74v%AjzURKe zaxMquQVGWIPfFvEa`}I3Pj96Vd~8o|FWkIyR~Sn&arPbAzIAUL;;9sguO^NK+S}fS zUq644?ME+PDaDc47wWNA!WRoiM%?)1WFXn(SRnkw(D#1DIXPxD)@8)ub`Ur&(v61h z<|QawY=2{8qvE;d=4R5&l*?tPMPl~%_xpZKok0?`KoXQKCbG=g*%@gnv3_!NbVO`y zrWzJ=+|BbeLI>zcpnBr;^b}TBR*W;k%rmd3 zgvMfKM4d;WP%vybGBTocoX`q{HW#5{LmoX2k`S5c3O4-bWdOBvc?5`4{|YInJIw70jz;NYMUffn-vUj?e=)B{J&yruji zw0|{-v9`8G29(8O(bfK*1VT$4A0K-;MAg~f-xm%VRq-qkcCTUPN?DA37^1nJc{b1B z>mu&Q=8LL?>T-u@8o`Shi^Y`ZU<^GDl2F$fj&dR z-!AbJ$6uhrOP5aW42TY|I>E&(!CN&}M59s2WHRa}?*d(v-qKYxh{w%`&! zP{iJBs`lqrbEf#7-8_>1(BL9XQ8x_?^b%eFaI{1h&_FCwPwCEKB~Rbukkx=$FB53D cOdtUK1#Y1*ux`&SB>(^b07*qoM6N<$f(@}o0{{R3 delta 999 zcmVZuhm}2qIvC2(;@#)k+0U zjw?{!--oZCHmv*hkZ(2`P~QJ7&Q)8d)Q~tqUYIG? zY&J#PcEU(8?RAg}is01Iu)#KQoErp20!4{VrvtmYyH<}-MEeAiN~K_KZceM$MgnCr z8F5HzwVF7?&W4#{BO@b_OeW##>dJ~>{9CWrJ)gtW3{9X!B60iS;b9mZ9ks5p({8r? z;v_V-i+>{F7tv@m#J#Y-kl3V{9gHp~DwXT9%8ZZd0mNA#r$HPeyj(7ebH4)dI*1@P z5riqFMopnmfXT^8>l()@If>{H+Z01_ip8RJjbqQ**_pNe#6{?wo}L;-wy{8NE7rJh zuTsqGeG8*RzDD?c#t-*WAg7mMjAr>7p`zMi`D1x`S*uN62N6U%f=tpwj*YSe(=SE> zVcv(a_6ef4Bd7IjHVdUvsc%1=Vg!*%F}K|jbs6DRsl+NH)|@3{V`JhhpU)fhEAq3L z-+%Hg3be4W5P18XVgz>{sGnb`8l~k=SLtv&8queZiG<-QsF_Gz-SD@ z6rjo-CJ|&`rK`^bxqIt{(Qg!wj*g&OtzZtMqj2-%1AHT&nwo-KE;o=iImHN!BB<4B ziDOXU?1l%{+a>tia~4 zjBOvhhBcQ|FmU8ylv3$b3nL28dyv1yqGsO`YlY;%fPZcKwC&FB9_Z@nvF$^0;2yNZ zVvepw6h}FXg5hHfq4!^wx%Tf~z0|{KX7(-D_Qlf){XK>zD?E*Tn0Yg6`=hxxdw#xc|q3bt} z1jDcbQhz0Rf*l?F(`_~TRElel!vv!}&lbg^;mx!28Woa~xJvr9i1IK=gmc)@(GeUT z9#(uGiA1!Q8Fbv6a^8l928hSwzO*eY*xA_`oSvRmd|y{rr@hRapPy^5YD0yjB*GrX z3bBie3(Jti@BI!*JcpIn`*~hhb4ehb#@9`N=YPfA8YC(tC2{RxnDFcCubVN3$W2wr zLZJY~V$s%aY-~)rZDGM!!-rTb2Cc2F`e*Dc_)sOS#K#}2t*uRae{gW1RdT;kAt{OL zkh~3)N+ru)rqfp|nmRfV`W&)C(~<=NRi7c2}naGRT(%W{^N z)WooYlFeqdA%vSKa4i^Cq%ee`2spoVJ6&@v*vZLBAal5|psJ)Kw=#!eSXtdUp|Ec6 zn2$*&liJ^y!~&L@O8RDc7%PH!sF0MzlYe{qe&N-aj#lxerY5QIv%JNg2Y zpui~(&8PUxF-TNMO5!>sjZ2+^!n`IeNH8SRY6}KoR->Z(W+^n%QL@>XLX0J~(T6zt zMjt?SW>fIdG&1h)q>?|I4YK=H*>pI}az{2rxi&_@(8H#cJ{3$G_d_&~^cR(AWlWp* zRkNBJDbcQ|5DPeS$wjh_-9`W%3mY5c+AVkN<4wNPq%usCF-WzOCD%I2+QStDcM7J^ lt(CFCM^&Pp+}6qf@E_9Wv3cd)CIDZ51Nkl@BB|FA0Io{D{oh|+h7_k!RDXj zl#MMP7oDgS>mY*pwZSy(l0-sTn4r<9!@>R^=XyT(R9U`YS@toW zcmy-qtZ)6I?thu=V~8gbzHLyIGlkX!BD#g_a-V=jSc=W3ib1xy$wSb%*{WfWg5*NG6kQsXMS>mzS4Nuh&~E7#M)QzE(qR zG#b#0-p(#bB(Q~{wYXV~m+N_zHwnJm&Fb6vUaheta&>iOe>wpQhOsqD*d>W*TUa+z zDwW{m0Q6hhU_{V*ad7=IC?E{XA?Q^O>gcsy=*OxuC+7}gDf zjg5^#Ho&@P7<#^2AyY1w?Jh*6QVCs$wqV!+6hkJr4q`WPczCGo0osC9t5s*lwUg7* zQNdY~$i0kV=vHnsCjzhO9r+nNpPrt!&r_*X;CDZ$pf7`AWKywL&GWf-HmVoVwlECz zVt;^ZdZ25fK6!d)czD>Ea2y#K300pF!MYiFdIuMH7Zw(@T6=F|Shp++cb#Bf!pQek z84_;R8QL{8;-F821tZc?m-LHEehCG$9}dl^_3F@*7Umb@bO>x=xc(;=Y{QKBDH~Y? z@;0iAiwoE1<#kChX&APT6@*Y*Hjj>uNPp$MUg0+;lsP>;Req0|acXLc)UGga&?jPK zyOW=hs`^%80yL#hW*Y5X)RtvMzDEm(I3k|T&CNynZgxo`+AcXhJ`SU!qmecmv!Te2 zQN#b(K!jbA2n$Ap1tY?O5n;iIuwX=3Fd{4%5f+RH3r2(mBf^4F0D%AN{GpD!zYb>Y P00000NkvXXu0mjfPB8L6 diff --git a/front/dist/static/images/favicons/apple-icon.png b/front/dist/static/images/favicons/apple-icon.png index f5bad500c1460abb5cab7b0ad35bcde19c065e20..69d255b12fefd13c8abee1f6d2191da39046a48a 100644 GIT binary patch literal 2395 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 Date: Wed, 4 Aug 2021 18:07:04 +0200 Subject: [PATCH 7/7] Fix joystick postion - Aply new size after open and close iframe and permit to keep the good position of the joystick on the WorkAdventure screen --- front/src/Phaser/Components/MobileJoystick.ts | 48 +++-- front/src/WebRtc/CoWebsiteManager.ts | 185 +++++++++--------- 2 files changed, 130 insertions(+), 103 deletions(-) diff --git a/front/src/Phaser/Components/MobileJoystick.ts b/front/src/Phaser/Components/MobileJoystick.ts index b3fc021b..9c14cb8e 100644 --- a/front/src/Phaser/Components/MobileJoystick.ts +++ b/front/src/Phaser/Components/MobileJoystick.ts @@ -1,12 +1,12 @@ -import VirtualJoystick from 'phaser3-rex-plugins/plugins/virtualjoystick.js'; -import {waScaleManager} from "../Services/WaScaleManager"; -import {DEPTH_INGAME_TEXT_INDEX} from "../Game/DepthIndexes"; +import VirtualJoystick from "phaser3-rex-plugins/plugins/virtualjoystick.js"; +import { waScaleManager } from "../Services/WaScaleManager"; +import { DEPTH_INGAME_TEXT_INDEX } from "../Game/DepthIndexes"; //the assets were found here: https://hannemann.itch.io/virtual-joystick-pack-free -export const joystickBaseKey = 'joystickBase'; -export const joystickBaseImg = 'resources/objects/joystickSplitted.png'; -export const joystickThumbKey = 'joystickThumb'; -export const joystickThumbImg = 'resources/objects/smallHandleFilledGrey.png'; +export const joystickBaseKey = "joystickBase"; +export const joystickBaseImg = "resources/objects/joystickSplitted.png"; +export const joystickThumbKey = "joystickThumb"; +export const joystickThumbImg = "resources/objects/smallHandleFilledGrey.png"; const baseSize = 50; const thumbSize = 25; @@ -20,15 +20,27 @@ export class MobileJoystick extends VirtualJoystick { x: -1000, y: -1000, radius: radius * window.devicePixelRatio, - base: scene.add.image(0, 0, joystickBaseKey).setDisplaySize(baseSize * window.devicePixelRatio, baseSize * window.devicePixelRatio).setDepth(DEPTH_INGAME_TEXT_INDEX), - thumb: scene.add.image(0, 0, joystickThumbKey).setDisplaySize(thumbSize * window.devicePixelRatio, thumbSize * window.devicePixelRatio).setDepth(DEPTH_INGAME_TEXT_INDEX), + base: scene.add + .image(0, 0, joystickBaseKey) + .setDisplaySize( + (baseSize / waScaleManager.zoomModifier) * window.devicePixelRatio, + (baseSize / waScaleManager.zoomModifier) * window.devicePixelRatio + ) + .setDepth(DEPTH_INGAME_TEXT_INDEX), + thumb: scene.add + .image(0, 0, joystickThumbKey) + .setDisplaySize( + (thumbSize / waScaleManager.zoomModifier) * window.devicePixelRatio, + (thumbSize / waScaleManager.zoomModifier) * window.devicePixelRatio + ) + .setDepth(DEPTH_INGAME_TEXT_INDEX), enable: true, dir: "8dir", }); this.visible = false; this.enable = false; - this.scene.input.on('pointerdown', (pointer: Phaser.Input.Pointer) => { + this.scene.input.on("pointerdown", (pointer: Phaser.Input.Pointer) => { if (!pointer.wasTouch) { return; } @@ -44,7 +56,7 @@ export class MobileJoystick extends VirtualJoystick { this.enable = false; } }); - this.scene.input.on('pointerup', () => { + this.scene.input.on("pointerup", () => { this.visible = false; this.enable = false; }); @@ -52,10 +64,16 @@ export class MobileJoystick extends VirtualJoystick { this.scene.scale.on(Phaser.Scale.Events.RESIZE, this.resizeCallback); } - private resize() { - this.base.setDisplaySize(baseSize / waScaleManager.zoomModifier * window.devicePixelRatio, baseSize / waScaleManager.zoomModifier * window.devicePixelRatio); - this.thumb.setDisplaySize(thumbSize / waScaleManager.zoomModifier * window.devicePixelRatio, thumbSize / waScaleManager.zoomModifier * window.devicePixelRatio); - this.setRadius(radius / waScaleManager.zoomModifier * window.devicePixelRatio); + public resize() { + this.base.setDisplaySize(this.getDisplaySizeByElement(baseSize), this.getDisplaySizeByElement(baseSize)); + this.thumb.setDisplaySize(this.getDisplaySizeByElement(thumbSize), this.getDisplaySizeByElement(thumbSize)); + this.setRadius( + (radius / (waScaleManager.zoomModifier * waScaleManager.uiScalingFactor)) * window.devicePixelRatio + ); + } + + private getDisplaySizeByElement(element: integer): integer { + return (element / (waScaleManager.zoomModifier * waScaleManager.uiScalingFactor)) * window.devicePixelRatio; } public destroy() { diff --git a/front/src/WebRtc/CoWebsiteManager.ts b/front/src/WebRtc/CoWebsiteManager.ts index 1fb28487..f2de3580 100644 --- a/front/src/WebRtc/CoWebsiteManager.ts +++ b/front/src/WebRtc/CoWebsiteManager.ts @@ -1,7 +1,8 @@ -import {HtmlUtils} from "./HtmlUtils"; -import {Subject} from "rxjs"; -import {iframeListener} from "../Api/IframeListener"; -import {touchScreenManager} from "../Touch/TouchScreenManager"; +import { HtmlUtils } from "./HtmlUtils"; +import { Subject } from "rxjs"; +import { iframeListener } from "../Api/IframeListener"; +import { touchScreenManager } from "../Touch/TouchScreenManager"; +import { waScaleManager } from "../Phaser/Services/WaScaleManager"; enum iframeStates { closed = 1, @@ -9,13 +10,13 @@ enum iframeStates { opened, } -const cowebsiteDivId = 'cowebsite'; // the id of the whole container. -const cowebsiteMainDomId = 'cowebsite-main'; // the id of the parent div of the iframe. -const cowebsiteAsideDomId = 'cowebsite-aside'; // the id of the parent div of the iframe. -export const cowebsiteCloseButtonId = 'cowebsite-close'; -const cowebsiteFullScreenButtonId = 'cowebsite-fullscreen'; -const cowebsiteOpenFullScreenImageId = 'cowebsite-fullscreen-open'; -const cowebsiteCloseFullScreenImageId = 'cowebsite-fullscreen-close'; +const cowebsiteDivId = "cowebsite"; // the id of the whole container. +const cowebsiteMainDomId = "cowebsite-main"; // the id of the parent div of the iframe. +const cowebsiteAsideDomId = "cowebsite-aside"; // the id of the parent div of the iframe. +export const cowebsiteCloseButtonId = "cowebsite-close"; +const cowebsiteFullScreenButtonId = "cowebsite-fullscreen"; +const cowebsiteOpenFullScreenImageId = "cowebsite-fullscreen-open"; +const cowebsiteCloseFullScreenImageId = "cowebsite-fullscreen-close"; const animationTime = 500; //time used by the css transitions, in ms. interface TouchMoveCoordinates { @@ -24,7 +25,6 @@ interface TouchMoveCoordinates { } class CoWebsiteManager { - private opened: iframeStates = iframeStates.closed; private _onResize: Subject = new Subject(); @@ -38,14 +38,14 @@ class CoWebsiteManager { private resizing: boolean = false; private cowebsiteMainDom: HTMLDivElement; private cowebsiteAsideDom: HTMLDivElement; - private previousTouchMoveCoordinates: TouchMoveCoordinates|null = null; //only use on touchscreens to track touch movement + private previousTouchMoveCoordinates: TouchMoveCoordinates | null = null; //only use on touchscreens to track touch movement get width(): number { return this.cowebsiteDiv.clientWidth; } set width(width: number) { - this.cowebsiteDiv.style.width = width+'px'; + this.cowebsiteDiv.style.width = width + "px"; } get height(): number { @@ -53,7 +53,7 @@ class CoWebsiteManager { } set height(height: number) { - this.cowebsiteDiv.style.height = height+'px'; + this.cowebsiteDiv.style.height = height + "px"; } get verticalMode(): boolean { @@ -75,56 +75,55 @@ class CoWebsiteManager { this.initResizeListeners(false); const buttonCloseFrame = HtmlUtils.getElementByIdOrFail(cowebsiteCloseButtonId); - buttonCloseFrame.addEventListener('click', () => { + buttonCloseFrame.addEventListener("click", () => { buttonCloseFrame.blur(); this.closeCoWebsite(); }); const buttonFullScreenFrame = HtmlUtils.getElementByIdOrFail(cowebsiteFullScreenButtonId); - buttonFullScreenFrame.addEventListener('click', () => { + buttonFullScreenFrame.addEventListener("click", () => { buttonFullScreenFrame.blur(); this.fullscreen(); }); } - private initResizeListeners(touchMode:boolean) { - const movecallback = (event:MouseEvent|TouchEvent) => { + private initResizeListeners(touchMode: boolean) { + const movecallback = (event: MouseEvent | TouchEvent) => { let x, y; - if (event.type === 'mousemove') { + if (event.type === "mousemove") { x = (event as MouseEvent).movementX / this.getDevicePixelRatio(); y = (event as MouseEvent).movementY / this.getDevicePixelRatio(); } else { const touchEvent = (event as TouchEvent).touches[0]; - const last = {x: touchEvent.pageX, y: touchEvent.pageY}; + const last = { x: touchEvent.pageX, y: touchEvent.pageY }; const previous = this.previousTouchMoveCoordinates as TouchMoveCoordinates; this.previousTouchMoveCoordinates = last; x = last.x - previous.x; y = last.y - previous.y; } - - - this.verticalMode ? this.height += y : this.width -= x; - this.fire(); - } - this.cowebsiteAsideDom.addEventListener( touchMode ? 'touchstart' : 'mousedown', (event) => { + this.verticalMode ? (this.height += y) : (this.width -= x); + this.fire(); + }; + + this.cowebsiteAsideDom.addEventListener(touchMode ? "touchstart" : "mousedown", (event) => { this.resizing = true; - this.getIframeDom().style.display = 'none'; + this.getIframeDom().style.display = "none"; if (touchMode) { const touchEvent = (event as TouchEvent).touches[0]; - this.previousTouchMoveCoordinates = {x: touchEvent.pageX, y: touchEvent.pageY}; + this.previousTouchMoveCoordinates = { x: touchEvent.pageX, y: touchEvent.pageY }; } - document.addEventListener(touchMode ? 'touchmove' : 'mousemove', movecallback); + document.addEventListener(touchMode ? "touchmove" : "mousemove", movecallback); }); - document.addEventListener(touchMode ? 'touchend' : 'mouseup', (event) => { + document.addEventListener(touchMode ? "touchend" : "mouseup", (event) => { if (!this.resizing) return; if (touchMode) { this.previousTouchMoveCoordinates = null; } - document.removeEventListener(touchMode ? 'touchmove' : 'mousemove', movecallback); - this.getIframeDom().style.display = 'block'; + document.removeEventListener(touchMode ? "touchmove" : "mousemove", movecallback); + this.getIframeDom().style.display = "block"; this.resizing = false; }); } @@ -132,34 +131,34 @@ class CoWebsiteManager { private getDevicePixelRatio(): number { //on chrome engines, movementX and movementY return global screens coordinates while other browser return pixels //so on chrome-based browser we need to adjust using 'devicePixelRatio' - return window.navigator.userAgent.includes('Firefox') ? 1 : window.devicePixelRatio; + return window.navigator.userAgent.includes("Firefox") ? 1 : window.devicePixelRatio; } private close(): void { - this.cowebsiteDiv.classList.remove('loaded'); //edit the css class to trigger the transition - this.cowebsiteDiv.classList.add('hidden'); + this.cowebsiteDiv.classList.remove("loaded"); //edit the css class to trigger the transition + this.cowebsiteDiv.classList.add("hidden"); this.opened = iframeStates.closed; this.resetStyle(); } private load(): void { - this.cowebsiteDiv.classList.remove('hidden'); //edit the css class to trigger the transition - this.cowebsiteDiv.classList.add('loading'); + this.cowebsiteDiv.classList.remove("hidden"); //edit the css class to trigger the transition + this.cowebsiteDiv.classList.add("loading"); this.opened = iframeStates.loading; } private open(): void { - this.cowebsiteDiv.classList.remove('loading', 'hidden'); //edit the css class to trigger the transition + this.cowebsiteDiv.classList.remove("loading", "hidden"); //edit the css class to trigger the transition this.opened = iframeStates.opened; this.resetStyle(); } public resetStyle() { - this.cowebsiteDiv.style.width = ''; - this.cowebsiteDiv.style.height = ''; + this.cowebsiteDiv.style.width = ""; + this.cowebsiteDiv.style.height = ""; } private getIframeDom(): HTMLIFrameElement { - const iframe = HtmlUtils.getElementByIdOrFail(cowebsiteDivId).querySelector('iframe'); - if (!iframe) throw new Error('Could not find iframe!'); + const iframe = HtmlUtils.getElementByIdOrFail(cowebsiteDivId).querySelector("iframe"); + if (!iframe) throw new Error("Could not find iframe!"); return iframe; } @@ -167,9 +166,9 @@ class CoWebsiteManager { this.load(); this.cowebsiteMainDom.innerHTML = ``; - const iframe = document.createElement('iframe'); - iframe.id = 'cowebsite-iframe'; - iframe.src = (new URL(url, base)).toString(); + const iframe = document.createElement("iframe"); + iframe.id = "cowebsite-iframe"; + iframe.src = new URL(url, base).toString(); if (allowPolicy) { iframe.allow = allowPolicy; } @@ -183,15 +182,18 @@ class CoWebsiteManager { const onTimeoutPromise = new Promise((resolve) => { setTimeout(() => resolve(), 2000); }); - this.currentOperationPromise = this.currentOperationPromise.then(() =>Promise.race([onloadPromise, onTimeoutPromise])).then(() => { - this.open(); - setTimeout(() => { - this.fire(); - }, animationTime) - }).catch((err) => { - console.error('Error loadCoWebsite => ', err); - this.closeCoWebsite() - }); + this.currentOperationPromise = this.currentOperationPromise + .then(() => Promise.race([onloadPromise, onTimeoutPromise])) + .then(() => { + this.open(); + setTimeout(() => { + this.fire(); + }, animationTime); + }) + .catch((err) => { + console.error("Error loadCoWebsite => ", err); + this.closeCoWebsite(); + }); } /** @@ -200,56 +202,63 @@ class CoWebsiteManager { public insertCoWebsite(callback: (cowebsite: HTMLDivElement) => Promise): void { this.load(); this.cowebsiteMainDom.innerHTML = ``; - this.currentOperationPromise = this.currentOperationPromise.then(() => callback(this.cowebsiteMainDom)).then(() => { - this.open(); - setTimeout(() => { - this.fire(); - }, animationTime); - }).catch((err) => { - console.error('Error insertCoWebsite => ', err); - this.closeCoWebsite(); - }); + this.currentOperationPromise = this.currentOperationPromise + .then(() => callback(this.cowebsiteMainDom)) + .then(() => { + this.open(); + setTimeout(() => { + this.fire(); + }, animationTime); + }) + .catch((err) => { + console.error("Error insertCoWebsite => ", err); + this.closeCoWebsite(); + }); } public closeCoWebsite(): Promise { - this.currentOperationPromise = this.currentOperationPromise.then(() => new Promise((resolve, reject) => { - if(this.opened === iframeStates.closed) resolve(); //this method may be called twice, in case of iframe error for example - this.close(); - this.fire(); - const iframe = this.cowebsiteDiv.querySelector('iframe'); - if (iframe) { - iframeListener.unregisterIframe(iframe); - } - setTimeout(() => { - this.cowebsiteMainDom.innerHTML = ``; - resolve(); - }, animationTime) - })); + this.currentOperationPromise = this.currentOperationPromise.then( + () => + new Promise((resolve, reject) => { + if (this.opened === iframeStates.closed) resolve(); //this method may be called twice, in case of iframe error for example + this.close(); + this.fire(); + const iframe = this.cowebsiteDiv.querySelector("iframe"); + if (iframe) { + iframeListener.unregisterIframe(iframe); + } + setTimeout(() => { + this.cowebsiteMainDom.innerHTML = ``; + resolve(); + }, animationTime); + }) + ); return this.currentOperationPromise; } - public getGameSize(): {width: number, height: number} { + public getGameSize(): { width: number; height: number } { if (this.opened !== iframeStates.opened) { return { width: window.innerWidth, - height: window.innerHeight - } + height: window.innerHeight, + }; } if (!this.verticalMode) { return { width: window.innerWidth - this.width, - height: window.innerHeight - } + height: window.innerHeight, + }; } else { return { width: window.innerWidth, height: window.innerHeight - this.height, - } + }; } } private fire(): void { this._onResize.next(); + waScaleManager.applyNewSize(); } private fullscreen(): void { @@ -257,13 +266,13 @@ class CoWebsiteManager { this.resetStyle(); this.fire(); //we don't trigger a resize of the phaser game since it won't be visible anyway. - HtmlUtils.getElementByIdOrFail(cowebsiteOpenFullScreenImageId).style.display = 'inline'; - HtmlUtils.getElementByIdOrFail(cowebsiteCloseFullScreenImageId).style.display = 'none'; + HtmlUtils.getElementByIdOrFail(cowebsiteOpenFullScreenImageId).style.display = "inline"; + HtmlUtils.getElementByIdOrFail(cowebsiteCloseFullScreenImageId).style.display = "none"; } else { - this.verticalMode ? this.height = window.innerHeight : this.width = window.innerWidth; + this.verticalMode ? (this.height = window.innerHeight) : (this.width = window.innerWidth); //we don't trigger a resize of the phaser game since it won't be visible anyway. - HtmlUtils.getElementByIdOrFail(cowebsiteOpenFullScreenImageId).style.display = 'none'; - HtmlUtils.getElementByIdOrFail(cowebsiteCloseFullScreenImageId).style.display = 'inline'; + HtmlUtils.getElementByIdOrFail(cowebsiteOpenFullScreenImageId).style.display = "none"; + HtmlUtils.getElementByIdOrFail(cowebsiteCloseFullScreenImageId).style.display = "inline"; } } }