From 787e1c463ca52029c1c9f876073b4fa32e17ff1d Mon Sep 17 00:00:00 2001 From: gparant Date: Thu, 14 May 2020 20:39:30 +0200 Subject: [PATCH] Media webrtcA - Update peerConnexion manage - Add muted microphone logo - Add icon user - Sound when user enter in room webrtc --- back/src/Controller/IoSocketController.ts | 5 +- front/dist/index.html | 7 +- front/dist/resources/objects/webrtc-in.mp3 | Bin 0 -> 77740 bytes front/dist/resources/style/style.css | 53 ++++++++-- front/src/Phaser/Game/GameManager.ts | 1 - front/src/WebRtc/MediaManager.ts | 109 +++++++++++++++++---- front/src/WebRtc/SimplePeer.ts | 83 +++++++++++----- 7 files changed, 202 insertions(+), 56 deletions(-) create mode 100644 front/dist/resources/objects/webrtc-in.mp3 diff --git a/back/src/Controller/IoSocketController.ts b/back/src/Controller/IoSocketController.ts index 60bbe6a..a2ffc81 100644 --- a/back/src/Controller/IoSocketController.ts +++ b/back/src/Controller/IoSocketController.ts @@ -99,7 +99,7 @@ export class IoSocketController { let Client = (socket as ExSocketInterface); - if(Client.roomId === messageUserPosition.roomId){ + if (Client.roomId === messageUserPosition.roomId) { return; } @@ -140,7 +140,7 @@ export class IoSocketController { console.error('An error occurred on "user_position" event'); console.error(e); } - }); + }); socket.on(SockerIoEvent.WEBRTC_SIGNAL, (message: string) => { let data: any = JSON.parse(message); @@ -316,6 +316,7 @@ export class IoSocketController { } tabs.push({ userId: clientId.userId, + name: clientId.name, initiator: index <= indexClientId }); return tabs; diff --git a/front/dist/index.html b/front/dist/index.html index 0815a88..60ced6e 100644 --- a/front/dist/index.html +++ b/front/dist/index.html @@ -13,7 +13,9 @@
- +
+ +
@@ -29,5 +31,8 @@
-->
+ diff --git a/front/dist/resources/objects/webrtc-in.mp3 b/front/dist/resources/objects/webrtc-in.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..34e22003c01b3fde1603e84a942746db309f3e26 GIT binary patch literal 77740 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�fJ4w-8THd0HMeCK3yO?J)c3+i6_O!PClp-)B@ZX-;+Pzy#MphLd*Z8XJ1A?(y z(=V6Onw#qxjfugk+RTOMvh5neBEF2N3){^b=~cQyC>dGPCPF-GGSIa@W6sHnG#RT3 z0P%2O$L!^~AD|jNSzN$Ye-+OmG-@8Memg6ldK+8o%bV*K6Kq-;p(`X!`!eKPi)I^& zX!UUXaMW?$zS4=G&*g`8LV8T53F}7FQ-LZYsRMzfId6)p=ujc@hH zsPN&GFau|T&}1r;Zo;+Vy3yjxvo9!e`+DbpGlfII${>)Re*ezYo@>Bat0lHKnwdO*$1HnQ!zONPa9#cNk?UUN3~@2Cra;b(TX z1-hy7sMV`cp1ql=8B}*dOI&}sgMsFsk@jIu&pMnV6kOKpW`-Np1e7bGZdv(UJ$KGl zMb(A9eZeB;fMt1dYXYb+0XAqz=7f+6_F%X5byMi4$84^$-n+b_1rX9rv zMe)W}6R6d2F%MOHhdUjTa!%gZH80lD!eYTm(Ohmf?_kcr?2bMf!JxC7AjC1$K{H!X z-*00+;xbHORT14H@g*YFOdlIxVkSx>d$fiC{Z4#!kSlG_8QQT)oh!Xqj2qP z#`fXD9gI@&=l2-KgXTgEGkEUvLDExqq1H-W>FjnTq#!4rtJJ7EE0%nh&zle?Fw^GGKh8`E zQ4ga=TTwptYyV7C?8M-8Y|Y@!7tFInNa1P)vkrU8cqyyFS*QZT>Y|Q%Wt4+WD>KCK zmS>qW%h@zl!)Vya*++3D?Y$`aWx{c8&TQIop>1r-vq!HpN`oOp?qP8LhF`E+l2Ygj z`{xBW7$r>YiLI}L(o{5~HmmquYR|X*>Eim_Ew{WFjw8i&`x3me`GfP0Y z*U?4KW<`bvx^lrX%0)O3H3+L|cRj!e)w!3EQzZV_u-1wicdb#ot^X;E)_y4qkB!$k z`yH{7e!XnM{DjZ$slj!U_y1$hRTSEAan>P6|xLNFq^JCCWv7nd{ch z*E|=#Mqzs5lbLm)Yl{{Jmv;NUdbxQI-WtiN=0ikM+w$LsFuh>vA&=N&aFUb7OPR7p z{mWD*t)H;fE#oA0%!0&)`$L3(IQ$Mt%o3fVTR|a~>!3?d#mr)z8|ZZU+CDfd-3 zLk?eUy%bk+t~SgQn=zaJP$*7BPi&kCsLvngt#%JQH3(0}8!G806kC)f9Ie+@5u|3I z!)wMV#8OoY2cp2ZtCM{Zi)aFiP1j;fDGMN~D(_RQ*At@hMWxyJVMadH$Sq%YGMbY& zjLC2t#fUi>IQ)t&m~guZ+?vAm51t> ztX>UrbXYu^bkytrz-RD0qyNNA^Wd4>HJohaO||;oj0cq`E}9u+vunhqb>ejaaAmHs zjDtW5>H_JfHc&15I>6j~fK-kDG|5Z0sLrczwyziMWDuPK5oW24(2*%*YBIq}i2}=| zB2U#MtI3rn5K}ePn*h%{VpEX<7OR51m|E0Ju!3%}F~1-3k^FH8($WiLQ;<>WCCH=B zq5TUY>8C(D9^GDUZmPlTK0zSwYM@-|3x^kskBJwIiA5sb^BS(j4*N9M%?z9d?NjBr zc5BM^R@SPnTKlJ36=z$AqLL{rC?@EU{mxgOuJ)d$fWO@_7h(BKp+5fX$D=IZZwhyG z`1mI>*Q!liArP7KPVX|LtjQ0-sgi}9?2qp9!msDQ%+XGq>hc^9OstDf6YR+N(_B=z z|EfPYb?ie7yze)m^@N2JpeR3dY(n?>#^O^bQOBn9lJTRbwyPNx{G{OY9AWEh8gq%u z7lJb78omL+BvFF8+S_I9OTdx!Iv3<;r3+FUYdenes4LLev26wgo+NKi|Bc#Lt|^Ye44 zp5SsjFDZpq@W{Z7XXu%woULIcK?mp_R-r*o+9V5oq2wBZS8e*m6alT=FrSqBGGkhE z?~J~vAJIe(2vpmvLKS`oX(jg;xx(Hp`N*a&1kNF&pAZm@ECPWnYDNTh^H#vdgk8m0seuuXFRP9r>QK!T~V!O8h+T?U^f>}OvISrK!Sx{>!(E>%Cku#Z#B;aPk1N*18ey+FyrX4=48 zlHE3swMu6l&++6$*()28L;7^^qjl=#1w+p_Lef$#g`wjaL3qfdtw_^HI1ALI^bHMMvF`g*Q>NG9oy)LJV@Orn*O@X^;qZQLcVG0$YL`n$ z#vt#GtU-1FMO;|$?M9t)BagDY+Fdu0$_LdGaqd+Yu1_(dvpkcvhwJN$`0R?pmb*Ih%|@oG1mc?78@Bwi1AtJ>Im zd+4)zfj zb2e_Zrt!MP;aAD-zNM=v`!4f}UqA&dM#DvOr;o-mDdqlu4Nmf#)Z2 zRTJKcj}+5$>5<~phdbwW1A^ zX3^?U)qT!SzrTOs^L{+0A}03 zO(?0L-(246v*Za#`B>pEVh#T5^)5c@>b=p&Rx`d?elty>w~K3%3uG_umyd8|`@OI` z5r}h|oACSOtV9>dm#K9Y$MMw#ZT=y2Ho#j0@VAD`PHCKpg4^g=2{Cjhk9?+TbqGm( zgb_I38W;4p)QO^Xj`91E6tP8YtqH}rOR+xS$C&9~CLp24Zq?O~F1uA4ZtTQ+s-wm~ zhk4?uA!(Ut#3b$nEezl8oxYP*_+HCw);`zT%U#}G>mWTz<%mTQqY38L7_6QdYJ92D z*~ZuGUu4utV*|tJd4~ig3yI?dUnM`A+nqk4?|yypw+Vdo{@nd(`GwSh=nw1vOc=iE zu1N`ug!lVoL9Vb$baF{X+A7vh7t1^C{Nvr9!9KIDk>%>$S$`dKwvpHSbS-@8m0f1o zaeG8Va6pvafWmrh@`aE|?+3zpt{_aaipOWZ4i2%2TZ;nR))};yGJtOR&8W!dqn3S1 z8BsZ`(9%(iD<64gN@llD!`QXU51lH(#MNb|cI6Q0KeSo7r;ZH;DfL`UygtjF#mP4H zgs;sxp@^whK^4VIWg7=r&XB>>c{wd=tlTj9jk2}KS%5~y%}ZjkdaDnzSBh-)yi(H8 z=+TtVC|mz;B(p}V`bqmF{gGkzkUxa>5?hBz^wOh^@Z1d2n!wUB^W+{@>5BvQ$ zs^9ghj~%K*4kD%6{U-O$y-kzRO~lhW{G`_J?mE!|N)0rGB~sn~nv$?MIxX&8hElnyGqagrps0}X)pQG(mM6MGe8Nv>^ibL6wFI&6T)wM01nI16W z^(c;RZ}5SbkpS)L3KD&WH9CB5ZE7j11W<_M=37csLRAjP1?AFw8 zcZZUDtp6L6(xgMccmV6M*ERMgadybUCT6wdRvjgqXlHV$&TW&3fO|BH`R*LF2<^DDE zL23CUY=B9mUh7kHrj3qlkx{X(QB6KO=vqJnt0llW@>5`ZM1GyCw7V+=S28AbYS1b6 z*g~I!s{0=5F8Y%xFhVLb)L&^tG1zu&hI}s*O@l z*1rS2HB0)dbHLZ{?+%!xK2HFcMj`WJ3F%o#e~ZugydS^AO-80bfau@cY>}*x`c!Lu zaWWwJQ>4`*j3L6#$<~NABg|h&IS(}XD8RyLSD-o{tyP;qn{W~2x{EQ5~ z{}a}g@tga8;~zpNEbF6uylowd$ynpf#2)A-K|S}OJL=&=MWHze-Rv#j5UC%ZU(oo& zXI3>?txqsrP7u5syYK<}x$#$Ut6J20EX2?sEkN zzn>0qlaV&O{Pe$AN4u7oAcaid>E&pLZx)NRrm~-+lf41$9rGlix(Q|Iy4Q!CI*%rP*Sa@E*ei2vd|6WT$}A5- zCpXiR_^D9!KZG`!77f^i`RHS;lmTy(9)(XQEj=nc5bIr`u96%<#0ttcuK)L z2T!2p+AGG#8`tg}MDZXGCdRw2Pns`M%#pn@1O+yhy9@n}Ciut+(uKYAi`Mf04lNIL zjJ%s3#pI5uXiY&1o>rxQZS^pFq;)+4%UWJyr=dF_J=ZJM6j<<8uNB5Ox9pkbAbqU z@u=AU1h11@*f%fb zfH4(=N*kRAqhmHL7;b(gP#cM?^wB(7Zdhqq=ES&@Axk)ZC*13k*&7awOg)$B-Wc<% zJ>FXOV*Q{FL|xrf!+DrusyI~9h8sev58#sn-n}sG-=tV#hO`h)-10M1>27aJdAAE4 z{}I8A1~TzN>v<6y{~i42OTCz^AN{r_lPsd@1Ce8ILQC90-_7*sF!a;ot4tl(bp#G5 zRTmwwcNG00w8OH50)X1+6GO!Vn`eX?6MqCCrV+F2Hqv7_!)$|$7*)ng?LE%77cU$a zCQ~Hl5OOi?|ilo#f}9iaqU3 z##G^VeRFX%wRcutPjuOi)UKD+w)XXpyv=o6$s4VKY-hPV`gWw$cMbTWhOV*St6z7s zf7-XOzCWzvYioat@zLI^WKVKT)k~jo+u*9r7gKe)}=TM9OjHvsTF< z{+h)0iGUL1523Au#d;oLUg8i>%|MO!So_Ka_mq-XCxnO2kJg+{v?gfhB@fnL_KEzh z56q14$DD1MbMi5i21wk#ojPqI`aCY2bp78&Tv%vDmGaBq^tWm+axV$()jc{j1Lqq( zGJc%=<^sV)ts z+YE^1iDzWp4L3-fC@>e41KU3shHz|nN=cfMoiOG|0Wnp@c^W|pr?|XImZQku-cOT= z5DJ#hniwNrSM2YqMP@f# z#3zJA?-?5sZA1#n41C``t6vpc`%t$1nr z&c{AvTQb1vy7TMyNs}!jULQu)*WH!K9X;-~=a>zYsKz~%(>Nz(xZK3mbR*5CMu5t) zV);y|1F^JTk@Y`9OpBeI!o2OHQ^6*3g*^)Tl@i&;&HMT7n1lmfIS5)cTSAKyC(-HX zCnc*7N(V6PV6g?BAS)W$S*NB7`CY{l`;)=Gf?wTU3=%@-+gD8lAQM3s(G>HDvOv{u zw>9Ygnxu1LK}CsSxTbP)j`9~$=%&`4NEroLXA#+C9G$5OpD3a!9(Amg^EA8BHPjkd zzcTcC9EAa}U+~K&4&L1O-FiVRQ3?QO+iQJ&S5y~y>d2FNV4Tpucguz_J=R;rOSsQ# z%cF~TWL~vsv1z77ZRf_be0^*;Df(&53J|i_^R%)4yQ8 zn|ofjI|EOoo(=A`Y`t!g7VQ+DofPsYm@bP{gpFS!>s1)_w?}g9tCMWxHB#l$GZW_( z*#tN5McMu#w9mAf#>3x6Uz)5i-g2at97ytS>MfBzQM8z~wu)TB?r;KB{Z~@2@C6Pt zX;ASl79ax1+<|7akLGO-7|qy(GzykdgfhE_Y(StV({i3+FOlWcha^A$Uf=u-u;~In z@w?$_0QcLBLdEn;!%NqZc4&|mo%8@&!SW<<1E2NDFi=qAEVaSMQmllTQb396YZsW(Jsv! zX#OE|lH|$H$KBSUHaIvyb1V|q<9_D`b@Fu0bEvoY>TPH3G{N?tW5dO8!KTh8YQPNH zrc0A@Vp`UuVV7Q7u4QS8AKaM&!kb*+PEfc=26@DZkmxEIlU_B6M24&`wRJraa)``> zUZH)yQ^|rZp#FtaN{&d+Srxa-^}9PKA6MMravUr-^dV*-vm$2up>lz}qbm;H*r3F`u&fd}a zpfH8y2aiQ#I@HL`tF*wp{POgX8nr8ifEkt#%b)NK(e;~>J@$HAY{GC`l{$pXdeWP0 zh`Y67;Vv>T77bboTT(g@W^Eg0nt+{lHSj(gF_W%XWAYI@X1K(- zU?Yrg4B(k#7G+RJD5$ajlO;rzjM$skHzN@zv?EmZloe2Gp!V1&><;p>T@R*!=qGX^ z2p>*p(qNK3hZdZOCRdxlQR~Uf5UrczKeS4Ai;+e{^A8F;7uN%t4}nhAO%LD~o@5y= zQ7p}J+PyS~SR2?DBQ)*^*!Q$fwmzA|J@66EghbtCS=3zyr~1*$G;%h($5i%_Yz9)l zYqHZSp=Y)oF;{yqM+j)WuBuG4H!7)h%Rc#vbmJD3ucc4jzx!k6^@J;l7%C6E60dZ7 z)PUa&{W!_NfQtQ0G1(|*)`#fGc!^)pE!Wl(ZmQX3*p&)jzTi#vtmYSOz;EVLegcGcmZFRGht?OP& z#&Oy^iU3dm!hw9~FKLt1TqB3B-E}vQQ${v_^2oa@)+diEa=Bz}>;^)2K$`y$ddIqU z%E!xl05Kgs%m3>U`-ZX!melY??qzVxMabcmd+^)Asl zsriiAVxMDhQN*&0GR%vdO)w?|JR_vCId=V4=^g7I!BHE}jJPrMx-9Th$nsklO(R* z}#_*bEhwJbP_j@)hL%_q}SEH^A^AoCqxmZ(33juKXT0K9w` z;Z{NeHB0m|y)pS95qmBWxHHvcq(I&`61po098MYGJIYf8Op^6@XhF_QK=qVv^}5!`v36k3rt_xvyZ7$#d*t*@GKTqt+tp4jaC@aV=nNoG;G50|Aho~c-iJ$}NL z=3)wZHj^|BU*yv&ia>g0+vHV`Q5GWAK-&8Ee3*&iP|MF3v>;XmTe%ns$`wODxxUlnF+g#uDxn60#><^E4T$tEhq<8d0;%f3R8w8WCF$dHIOGc*bR^%v==eQCb6~J&S zc(7$u-{F(4Hw!Q91aJ;=7wyJS7^fxnG~0WgiNTtUeqYl>4x7{e5IRd}{Fj}V_Xv_v zc9vb1Re}cJ`erpr*)|Wwe%ib^$}24QxbU*+R9mcg0HsBDgeUlLL`7lC-0Dq-p*Z@6 zFvdJ2d}$V(_vF^~T$72YI`Ny^%E5sVBlps3M$RLNm0xh;_uVFB^lOH(qP5wAzU7TI zFQ3@ctm8qb;^LUh;JBl;L?V}+_<4^E`G=Q4)F?8c!9y0t#=pVqYs)~X02f0(#Tl0@ zu4`qGgxO0ysU3;c)5;U(oDcM79(w~u=3Gn9v+h!@+ErH6!{K+meN;-ai^~dDBvMV7 z+&u|BAbiD7h2j8r*YT?tV&-K#X+61A#an{UC1Ciq#{AL@p&=y?;(Vhv=+d*^kPsw> z>Ssl%Pt~JQd?iMXi$e628SJ+5;nvstN1NlzfF)yjYNc!8REg!AV?IKpabSI06T7w# z=|#l;;_2OKjHpzk^`*e_TizV2ASO#DCefPJLelufhbi)&+CniZSAz0>t5>vC(l!tS za#V}@e6O0cSOqCP+fR{1d1*kCOc$K1z$WTum7TezyWrbHl74%I*LEFQDj^idx&X^K# zvI7yOj{|J^sXgB)BcXcQnRe-;jcxotxMz35L9Am1h@YEm;a>Qn)eL0S>hCuza-k*m z1|`(hGX>As$+#m=dszK-GjXh%vMoMB5nvd?d>ZHg2S->cHu7PxKs9Tt=N+rU)#m#RL)UHdFNQQ_emHB+ugcP~Ty)aVRvdP6a7wR! z!!#-=I4yzr?3WH?=WRg`B_j@&u7~m8CaTg5jtUV5yLL6~A-9khwRq0^FSzEUo=wI; z6m4zf7}aX)+O-TsHg|vDMc3P&Os$oU>*rT1veqrbV>pV5LzYXW#JLChHN^$W*`=md z!t`&AA3uHJtv-7JZuntp_%Tub+AF>O2fPzP*bx&W&A#1&ig28n+JyjF(_+Ucbc-6K zG^Tq7*35yeFzwzH*P?J)9f&5s2N^Rl-pH-6%NRj7K2psvde6f2ct(pk>UiO=`Pjy6 z9^|x_rOgS77zC63t1T0U90Y}ER9hKS#uV`UxV=N($R9#)lU7YR1$ceWtPdtN1NG2H zEL-eknGED*Y#?#)@TliBJ9hF2)j#x=V`aiN2nbP(x9*r(Q0-6=8gvGuFR|^}RHp=T zx{V=<8#0d7z7ur8Xd(x(rrV~!m!)nsLl5^*OtpOLz$TUFo^f;Qy)_YF6I|X8m?dMy z%GEX_e!V0JLbc3~&NF|UH_73sI?1li@p>WXZ~JoGi`V(<5!3cIVshW72Uvt~)SSO< zMSK5(Lae`M*tr;KqF$f3gX%~l6QzrQ0nH{%_@{SM0<^G6?2ZJkX*JS7ie(=>!km7g z@G$dg=JcBsv&URE3f(j}^xaOcoiDBn0rDijd@sa-aNfo^%0cJa!2@-z9fI))aKf=R zq*06AHP+)ZNMp8Ab8J*9DeY;QZ0);%7FqjUhSBW2$2h!jvqekEI<(?WzK%6L)UkV2 zJggEX@njIGaWje7Jm~hu*R-Ud16g!h=W7xUsBUZrXY%3&Q#+J|NS{h_Z4|e)YuPh% zz&*=tvQq$yZ)1;(Bu+6tL%tCw_dT|!iuj>l(kIVmta-z4m{w!X{#Z2?SjGnk%td0~ zOs}2>{L{s`w-+vI)FrVqXf+LfLA=J-s+V>*-XJ*QNu2n)qyPS+-XH~oXHOeA)IS|> zD_V`E*2;BtlkIyZzAY97AAZTHhX0jQVjAKj_WHE%8f>Z!W--vxZMz-XJh;IC=#pR&{h3s7Yr(>FN(I zV}x7u+eecQ{7QR#hRR8%aj`f4fgMUH0bXVi;^$AJMDImb*4^$Ka;*LPUyetXG-j1*mhcz)jfVK3C)QBRqF!Ym>$CtH zCF#!Jv;A9Kn(&D$>Z2x008kEwUzE&GKt&oGkJm^S8~;yN|DI{%4i7i)Q8G*AS)-6r zS_4~*cqceg22Ucy{O~U;k5CnnAQpOmLE|VjJWqk7+fHS=kA}ruXS%wAcgYiO<(P>c z{EBtHo&9Tl6JbK7o04$kinA|4SdO6k&S{$)E1sep`&R1Otie9 zR|rl>uk{;`1O5bJ>az((40!q|<@Qj5dZo+)dN%x@sy* zr#Z~oFULb&?39*6oEVtxhSU`eMVeWXUz^gV(186(<#o1$iM07xX)9euf0=@WmuI|v zCl-}j8N79};gbn1cx`>UdJAgc9mBxp2H3o7uE3tV^4#h01Y=C#&k86cdOA9OSL~eh zEe_z0>T*RtA>I~@aBjCjaJlAxW_nHR@S)XZ=C?Hx0(&jfJRQ1($n!Nu`84{tcQy=z z!pIv>5mUtyCAoxb3u=`S-A0T0!Ygt0Rmr|${~zU?y!MKRmrqkEllQDqXrPx|nJkaJ zWPmj7aWqM3_ikyDg+zR6RZmQHp}^cacA5^Q0`Tno_Sxq|^@97X;@=vrhQN%Q5F!>g zlFJVIv&VoMtA3RIs=Ob%i>Tj@+GUCNzK-E^YX*;Oe0#W`_d@y9v#rAD$u+J3$HVyt zVjwe6H!?O)M@&KIOTUf(=ZB*ByqkBeFE#$?=EU3{QgQuj=Q!p_yvoXAPg*uSHt_Q) zYfJsD&bXL}^2qEh@4(E+on3Bg!46k@FI$hQH+vQe>E}FFrF()Lb{T_0xXsdo0ln#G zGYs?rA@BEO14ee=D(u;nk(nIPCZmtz@806XsN0U_b5B}oKJVqe#_9<>--iEGTZ-49 z#7MSjcqHW~E0lB?7r#|@zMmPG78d2FCwKmFd-sppM=wL7u^V3*DyZu>U7HI|m+qgw zGRyvXuP^zbWbaYlVG8-7Sl}$fs5$zejn{&^xT-o(dX=p6Tx2+XDUPeqTom_SE9*C0 zSWT(v+;@If%XMQI(o|*KHTkEOtL~!RGc)BL*F?~tGPKXS@`I26Oen^hWKv_2t>Go= zqsljsl1IncN)5R_^lJX3en7vYZZGv_!a{~HW#du!W&gHzgjA;i@{zJPYpWUELA23@ zO&B6FI4yUsOK3jK%?eqRo+HUSfo1skK#VQeJcLBj%TEIpb-n*s1WRX@ zfDbzQU@?H<=UIK8S}pe~f@w<=d1>XJ*Ayf@s>u9nWBCiYvy9W3uN1aoAD4Fk4U-D%gPO<6T0Y?+P_A(dY(&! zd&28G^jma^gTd2rqT7PRq(y-G1jXPc9wS6y)=1@nTq7^($)NJRckgCbMmRaC1zxwv zGRM(z{zq@erqi<;^jhIr{z$2y6Kwjw7VUQ5fiuFZl`hC3{c$N_`{VnB@QgV#}lM$%Mn}QU@7D*SXlS* zcz$PDi#76x>EYYw}>)h%8~F zm1B$JSMPL>tjk}3`3Pzuh`i{rp4vgvW?~`CpaZI z#6-!+xQrS+n-fz?yd}U8N=s|!$n$Z#RoXEDRRcat z(Rm80Jxo7J-DtJ?JCEK8$zJV(9V`e8M5^jtqO|B;i4JyKu*W8;qRJ*{`@y+)TlOu&iLB-42laoae~rvEkD$*T}fe%=6xmF}6Ku?YJ5Wnh-^_XOzc zr^)KGOX8?0(Z^p<4&DoWhl{yIMy;3gjrD(JFgXEq&9fF#tE`6t!+se*o=?-hUX}7w zHiK~V3e{1R_%X4yQZYByX?$r&=0|`D_V%P2TCD;4LR(>u`o5JCldLSx<{P5y1%J4q z7_VeUl;%*q)i;y$ggoA0hWE=5c{fdV+-0AwR7s#Xh7Gvd%lmo^=$E;~c$7SS& zW!d4blw6IvAB%5e|CeF_59G>2yNx?O zO+eOV#9dikZAK@WH?v8r#Gxoed^=6AEn=w0+seKxOF4V!##&Z~RA0?xu&&#E=l+1* zr8mv*AH%zUmSyHXKW$YFue+bi1Tbd0(mTtVBN5yFjWlBj2^E z)^&eNo--6GHi&zkYSw8p;}`XUa{UE8T1fH_p`GNVA^?z=K9ZbzHUuwjFa2KDAe$e* z&lnH6FnxD9UIqOV{`)}cKZ)l*;`Q5Z|5QLc>_xwk*pxo?8&kPjA74-zRHR98FMmCx z@b%j5`Zd@~_P)53f1<6xOWCnbpFW%|!HO)Z6eHIY%0Jh9deZPgp>wMH+PL@a;Y21> z{x3Tw(L*jKg!s7(%+N$T;vC!rs|XrfsFRGCC`zi+hSnwBJR!vp_q*@d$g2@X-UrVL zGCPvE=EgbbW?j2ZmwNrb1i)RoJ8vD2j4N*}-MI!xJa{n1IhzCIU&y<83w7y||8c~j zedoZtYG^Ta#S)v!Y!a(I@nIPPLH;Y3xK(D}X!bdI4fj*FTk(RShl?sc{e@~n-LE_X z0mBMM;d)uld-S)j?p3r`no?P+e{HhkG-hg^%}AVb*6xr89Tp=0Q)(}{=@D9lVc%k0 zRL!!zh0Xxz^=YTnb)JQDqjTm8AB9iY*3@L|7alU`!BI=hED21kl!@B9GM?P?EPRR} zd3&9^Ys2{)ztIs8zd;3YN0*Z|qhXtvidPpf|0Be*@Sa_m7dpoC&ZK&vRU=XP{!?6f zXnoPu)f+VNh%8{C`CC8PFaB~aQE$#i^t=`9D**7`QYz!mK8(9QzU3Kgfr}J>Jmc|m zsNKPQ^~DD*?r-lHRQEjPS|RF_pSOPMWHuL()Rw2Sp3>qU1W3jYO}p!?5(~^OL(()C z51e)w!sW-;hbCYX!@(3KE8pikfHI1&`YMpJA7v&))6zavs*5Uu5`>Hw&-6` z-*_ny%5s5bY*|B7)yj6aZdSiVrrJbvm9O+dxh3t1?^^dY5`7l4spTdP7-AJ-qW>Qnowo0}9w1=9pWZr=fk6jbcan+f2%{2eqqhB!Pzl1P@j7$2}lJjJ}Pi!XMqxD4l~Jsl0)^H&c!2Nq)5EM%8s^XUhasM?ozns&O#Lt=TdWWs5#@F8l=4!bk2`3~th~rY(ip(>ZoVmX^0mpV+_C z>VSw&Xu4Zc9k|RHFv?>h`FL>^;oFN!)*_52-1RNYowc65l z?ueCIGj0>6YoGP)f}7R_2CgX@sKDCFTP`&()sNXnP}ojm-ADk#Sc#L%k$OX1Yr@yj zD-l5VFOTX0$Pd;ktLa8d_&*oBxhL4ma#4}2at|189<|EUQS@1G*W#T z0KkZ7%3EvX$_ssIbVkq4VDp)M@8xaxJ}N#6JWz{q`IT{T9Xl2jQn4q2X49J07`<0H zh^-9~@7C7mP-h7R19@aOI_jobx1Bf5(4!hMjIhC~rixmpLc*UNpJk6sZ{nn{N z9wV_*!3)UcdHTUw`$+r5!z{^)zez`t~plttMUXsB{3ItG2P3$C9m8! zQsHM(puTY^xBUnSe`7&L*z0x$;GAjjOpticJumg42z&n=g$d^?8&2Ucbeb^Ob=TYi z#q5*aK1mmX$9CGMlD;c#nU`PwpVa3}wk^T~Y=zDYT^f)pET-2;bvGtDJU6#4^X9MG z`O3TQIb}%(Ai)?^e@TkCjUV1!Oxc>Wb--)1_%*-WtJQv7%0#}H*~2TT^{&@Y$qx_I z(`pmd3Lz_@c#NA0ELxj*Gqt`{SYwg?Ld5~+3_9de9-_-=S;( zl#=YBLdjg^$&@U~;S*zR1UcP5juit3Ph1*wtL6xCc$Vi%+e`@!5D2HkEG?CgETs}S zZ;vYm%4JQFKH~(2ykAa%xpa%IS3L8TAvo`_ZO6Wx1xFh*kAl_Xi1S%zvRcn$B zYYf3_l*uW*sFc$|xZLI*em~~TgS9?W5F*>8rM(u%F%JTzGG-BWjq`O-&!(Zgh6RCo zG<$Y;T&mKh5Si3ZEBtboHTjSitkneaua24+Dd;|+6x~F16;Dw6j1M|jX?T!=gBOEw z&3VU}T6!x>?6xD5xG@uFM*oQilOLV`1QE_JTAJ0P=QCZKoj*#I!I4 zfnR-D4t{H2KOw}O6nFim*8e>2 zj0NjYTMl#gs$D++IW4)2@MApE>DPE&~0)AVel zWC_dm_bb;Woz8JeU1)|{jVZgR3tRE$egN1$9+5}fH-1oJE$^A{v2)bD> z_)92V*{cZLW=C7zi8%g7dU#r_WaCRx{=)adv0ne;*zD|lFPn}*fA~^2$vhL}xaq5s zubz6b#Q~g;j^9Is6q~qXnN&9rn@^J$ixL(d4m+0Vi%SU%wF(wV2C?;{TrO1BRw~k!m(T!D ztQ4x~JmSh98JhKN>E3ktr*XL)`l9j0VktSKLC|vELFa8~P)z;1$!Ywuv^ZZDCG_e~ z>!RRFH+M+RvS*;;2R{_hpP-5fr392bpcTbu7+S{?)gE5hEawSk9%^GpK4Z4!zk4w* z_E*HU2Ir~!e5u9+Fp-4-k_O2k<&G?~rTZ=2tpQlx3ZN2^_g=TP2|lxNyvZKk->z(Y zL9j2n;f=3~$W#+(FgsSjPO#Ob_oq_u`>Wnu6AQ$xg<8L*aOs}(uJxL8Dz~dk7`g^_ zE`Qg%-4KM`my?pxeROE}V@Fqhvf?f2g<3)C^{dZ$>WVU#qWOq{+io3O1zF{KVWr(V zjk7looeZZdpNN09vJ;Y$=?wIE(hF6dr92Aj@cF83;%?z!h1rbebLXSgcn`6Mw?BGm zs965uR5$9GEoId{M--JBvzV%ryCt;;pePv}mhjYl-tj+wih zbC8X%N+e!`zP*_$;TUl8htQcQ*pFG5S7XE~-^AOI+R>Yahp0_dzW&EEULiohP5(*# zFkkTgX(YhpX21xr=-4SV=Z35K`hB@6)k3Phz5Qr zCdgY05IPL3;#0m=D%>!WI;6r)B2TbJDT%O=`DB$>0-_5&DpO`#U4q1wv%`m>?XF!C zp_8iHN~$Vo<{dk8aYZv)t(c)OPNlgR>Aov~w3ZFd)y&sB0?tdA)>t-sgLJV{whF1P zI4yORYxZub;aOR_7)tp?l+p!>wE2rUJqas|g@XCI8~KRENnxaUNP+Mz!TzjI)YV0X zM{B_!^Y;zzh}ALDc89JO+1gtd_Fh*?SWE%zg_g=JOsG z+-K~)Q0V6w>{;(I{off%TuNgHwi*pvMVfec4kNgc>D9MkUB)vIc~cw< z^8+_|?)nZnecsZYVYiFpAT$)q2-byJQi8Gzbjwi`12U0`S-1kMx;3Gjgm=NE zk#ZvOackIK-2aB)y9tZ$0Ybdc(d4LSHI8SULVEFdAhL$8ZrOOSyr68(#-8@kKB}aI zf#%-H23z0DL17DV9XokyimZp`H6cCX1}&QcBH+<{`q?6w0Bn+>(&7^8Fe13xw^X&f z@uzs8M#wPyg~Vn4MF2h-2!#bSEBNw;x9IPgrEH@$28N({RC-Fy4%=Hq?C3bcC!Ma; zXn@h^1}eAdc$toCh?zw?ctaTAsGzRO*6}X`w}Y|z+66X{u2=W~)keJsZLdH&(0Hvm zi;}CWS0+xn=GNBAhi6_+_`cn({vuiw7!foOSpqz5ZFYJy^!Fm|mwRFidbLi5UBJCT zSJPE-oBX(W^*!YryzNVdk~=!~jZSx2kwKkSsc0XiZo$TI`fJ1jYO1M}?>RubqZr=O z5e}%;w~M@a>W?(tDKtJ?87W%HJW<5T6u3#yu$jUibila<@qF~KM{`^$x|2{?{pvjY zc3R`s7M$Hd5CY?G?~u%Z+FoIqEUbQ%7TfM`=^q=B>Rb!unC4zlCIj@JE0}W)FBqt6 z2~04ljllk#p@W1q{#p(i`p&{APa8`zv4MH@Cf(<>aJ zg+$KvP&_-QK%EC8wdfL0{d4&Ia09_k%NmUx-6hKuYOh{rTM=;pMjKqZplJjbkxb*Q z_ODF={Pbf70@fr#_H#--OEh&vLbj6zyWW;Wv`WT07C1hzkKJZq?1uv}c329a)b|it zYX|Y~77yvLJaI&GPii!t;749lV07hM=p|dr=ZGtLe?!(Kx(c0rbOZ+N)Ia+2Brxk& zuS&2cm%}X%lstsqbBxN z3VAB_$BSK|_m+#t>q1k6kN0A^nDW^Z(=>MP16wlx20QC4DX&n~&9Eb3ic>8}BN#|t zHjlf^nk%=t*N8!;Q-DCBp2u^VM3gT_fl@u5ZVLs$81EFw+xbPUNaKOQzu?6gmOC_F zJPrY$F9^ym^LU}%B#*@#J93Lm*jomuD6s~%B7-gRjgpA<4oDp!S;>%l3Luu1e2g<4 zt>pkra$oGPNT^d_7kv0SC8yZ&+x*2^n|)A#T(6`-S)vnpPXibdC1D2+1%EF?HIk}g zs+4dFQ8wl-G&7Q&0#UiXmt)faaowiqjpStbGAv*bSk1(l+2C`cd{$uuJnVC|fi+x| zQe{O|BghpC+nJeh2}#vX*0EKf*SA70@924_jMmb+_v_g{*od0eSut>plJ<+dY%TgI{KaRk6lDN1hG_9Rw z)X(;j1cI=chpnlv*DUN>q_witSN-97WyI}sEWv_XZOEH%edxqj&>I1IuY_vPvw+n- z%>3Bn0kx(W|Ht@nZNK~)1isIAgu7bEs70x>LEW?&lkXaNrY1D2n>ge`+-oeCWn$?z zz>$*N(*?hKMtlbp*KrD=lkkcDIH*|~o4K$AebGcT%gl19U)BK=)l}%<-Tg>oeADW| zlxz3OgG2il{|?QEb~F0R2XCxL&&OU=QGNO2En@g5dv%b{Q^RwjQdt{oxv^IKWXytX zs54*41N6@gOx^3BuSUD-?>r_Jd;Gp_KBxYHay#q0^!&$e?Q-Sd&KA!%g_Vc!!^)`c zt0oBmWpwASR<1bmRsIAQlJ0m{$_IYJg#EBhDO+N=V4iH88%v?;cQJc~@|&#*c_e!+ zMGc$G@zl5yai;E7zO^LB2LSyfEqiZ~L>L*Jkb+V$FtsLk>MmYt8X2TZ(*p9-|0g6l zN?3aj;O5nYPNrXmc&CZ2hWg5*ks49T6mfXA*R3@5WhGL#fh#{U!y*5~pWPchLR10@ zP}Q2x>$1Vi^{?jvZ}&JO`f?RyY)l{+Dimk$sbK4CS5S-1hHG?jm+HceQnD|tM^PYG zws~L~refp6&+UNlKvr@)IcD+F+Xs}HNsrB>PA7x1Kog`@7oP(a7){u8Xr%xJd19`xL^RX(A=ZE}PEu1loP{va4uTy=Gx_!D|!D zwRE$lJ4{;PtWMhv)HErj&g;@(2aXJt;7q0U#KA%1VLpxFu&qGuN%aKle~|u9P}G8J zQSI|AEQHUVVA~7u-ic84(V19yL0RH#p~cf}-BZ>CR+kJrPDdutVrbRV{qe87=(j_k zTs>+dz9q1mPpya{c40HafE)j(mX*sSU{`prT4qyx?Qd`2TJ>*7eRa zox(*09vu_8#4IRD7Ma*kMiGy)uAQb6m0O#2kH)vvu$4aCW_I^HejUb(d4Mf4O+$l^ zx~vvSI(09DkGZlYBI|NTxb?bmS2HGfcg027mR!Me6UFd;&?59>=&O^(>(PGdDzVUw zQ?hix^Jp~0Fk-`3f4CKN0bz-Mw|TnYite)3!6tRd#0YtrCB0S6Jnrxzj}2<>FB$>> z72yV)64cG-U6{;bW^wso$^r+m)NC3}F6y8tpaWBb5y~|#1Kb=QkSJWfu(&}|R1!HId2{r}KX-orgag>ihnUAa=xFZ4wa?q4p|{L_!jycJ10VTf3#&V+4s+i9Jii zrnQTXV^^#qsL|6?ql#)zwYq!G=d0)U`y1Y`=XvhuzOVbbXeGN3Z*hfB(zROp$Cv8H zxZ*$Y*ZU?)Bd6P&KRGD59q;8gPXo?j1~N-Vc7Ub3$B&##rXl4p=xr%c`mCk}`*dZ% zePngbJ|%^P%CVuCU;ow{Hz#elSE@NU@=;(rPeOKyJ5!x=+5K88W|Xnx?0p$^r72e( zEOaiWa4pz{i)hb*m>rkP!&%gGlPBtewiKT}(+QrwG6Q)vbg@73BjLO>{l`0zCZ_V6 zxbcbu*C!us=MN4%08W3M|3zq@YwgTw*GE=shJ>k0&4e#}*fLHouh|#Ry_~qEkq{}7 z)nNqKocTxllG4MQR~-3JZ-nFS>tCS%qbjDcyE|K{6-E8tq5b94AKwq(XFg}d?#T}R zu5zhE?c^`P*LQe751)(s;(aH&XysDm$FsY0k9ECC*VjOjg4c6jzEs||NsO+C{w(uQ zz`|efT~xrDL>EYELF_5A#AI{q2`Yr?%8t}Dhbdvm)Excw_YDQv!c1gf0|T2JfoWD4 zq(Ngi30Wj0S8+uNR6M)Pl0@CTtVM5=3-z`A{3>wy)i zohqoRnV5aFAuJ)k%J2+6G@P5sXT_4_@j^jiaBN0>cp(y{6Y_HD)jJ%vp8`o@IN)7Bxt6yv#*WqAzOY&Jiu z!i1sZmIud^&Ib2pEaG)e%v+6pB6Nb35iZ%iZPr^{>al-Cy{dC?#Z5d*FM1>M2pdh% z+$;fyiH0``_^o%{xFHevG$I=raH{elv@o-g*=s(kBU~4Pi`|{?be;8>D$H)aFKVRl zVuRS{_xF$NZhAydoF88WntMN;@F$Z=epPW6=AeHxYu?zed|G8YijDfYms8gYsm{Fs zN>{3<>u(6L{Cp4zDeqM_xhvD)pLUw%<)X7+bn)?A4LYznXEa53jxzN55sD{gGNikLre(CujdQ#}7HY1&=KX4To* zq&%FYg-o0Kr}yrf$110-y#j?2Fsvvl>$8XgS}ebItXLT1ZQpUSlhG(IZ~yog=&cBi zo7DOn5!GZ>+H$u2wIlUq&NcS)2Xm3;Z?4T?R|^9+E?=p%OA0z@@w&AQ>UwYd;`FAc&*^om+W)p~JtDC%Yo#&2@9K}9 zq#BdLh>GxYa)lNbj6=RmYP^0iSyzXGb8xnVwpms|W12MW4ABailao6~%5@z6ns#wh z&IMbG9N^BN{>%k&njm*%jgX*#o_&{+6~W%qG9M&*Ml=IQ!RYQuLIU?groq95zAqyI z9q>k&vae%u71n0$m!NSkW!?YO@Inhg${T^zewHbhyBeID3MsGT6*4zx8BZ)!;y&WY z?cH%gS^5ExFE-J_{2U9h%7AD$;P~FQmd7$le2!tsg52CCW?6P}}qjMny zJ2jftdNX5><=V+X=Iap8Os}CjAIyDuSz%@r1-~H3jz)y6*1Micj-Cch)t$!Ppgr%! zI$UNKnE9~Q;g09L%SLwVzS*qm#^SRd9a3rP;PgU>)L` z6ytNZjSwfXvsH!bBE}nWdG!r9JQa{r63Rc***#}ukXZQ73kTq{-Kc@nJ@JGKKC#UY z!<(ojKR2$m+R?#DIclJF8`)e^C$4(D6mh&G-R$l;-T6Jup7T|>-g!^oeY=v+-iog5 zz^UM)`)^(`fZVMlUbon&ehFt#5-F|8h`9RqXbT2(*cpWC-#|aG#P^mS; zi1BVEim&%%)^ zYc5Hv6 zHyx2=ctCt-RT9c7$)))-Po`nSXM~+tv1#-ri5x^8)c!|?YyYg%C4XSdu~1>m$=Y@OTeQaaohR^98cWH%yg% ztxhQ(qf;IEcwF6WYYkcnmvQeh*4##lD`U!`EGa-giZO~Pla%oKDclfaj0(v&AGNIk zHV!Cc_aQY4FP8?T&r7f^nN7s9xA$OyIrWN>!s6xqy-CI!lA_CHuC0Auj`b0Bbjc^R z4EPxreTeV&+uJ1g7_23j-$FEKsvGMk?u@%WV;!6@zhcvBU2XDdwFeYLw9B8-RHK_= z^xJz*LdCiCB%5E|*%Jt>cl(zC3{11b*yH_>P|BJ8{AKl>n(OfnU;noA=&dI~wD>*i zWOjEXUKiQ%w?DB{;&?u~06R26{50#*W8VmY2C_RQN@D{oO8$J>74fO8E%*wC@UE{< zXK^9WD*M0_lV!c}yID)|d2SJ*`$&+8%ciCUGa91pmZD=bk>Zv=Wvt}9+}=yvdWNnn z#U(hlz9P(BlzeukhW5e~*W9R%>x$ZzIv4m(XQ|xl&!+NAtImdJqp3C}CT78=FK3zm z$>sj$*hHKb+gp(7&JhN*smx6p^yKyX>!y_6i;&xyC2C-sHOJ&f=I>%YL^q67@=knk zdgYv%`K04asa>Af*}^%wbBaWUcmOfwYlek$MhW57t9#ivr8WLm1?{MZ2hVv)&(5aD z;lZOHHr;-gYrC<_ZaCNZO|!q?K~Phu^(*Y!_ziG&@MXTZ_{H-I=Y8LvfAY#5!&EDf zR8m+roV{8sZsoKTVA*x|H|(U$In68G(#5K2wfqn*L?l;nxyMH*{)mQ8cUos*{|+|{ zxVia%5$T$kNb5W@O)1;;2L-?z$xt=o1>=>3P{GACR^+=w9$hmOu0P zdC7pI)aVZwJ~_V^HlY4fZ;00}^!cbhowMQ^%xpf3MbX14|1o8SBi%7jQ$Tg|^<}x! z)=|D(V4uXRhK_cHhMFW>Id{zsFT)O}Mr)^q72VQ0w&2amVDqp2N84o|p18*g4s)C@ zI8FfTusZQ<@&YYjEQOU;DCbr-rWJQZ8Ea(uNvbmFVK7EG*HW12wWkMCO|(A3^d|l( zp_}&W41GxX%T5$1^e8iJU^JkAv3>5q4DrSMNO7 zZrE$cw!YV8V0P$P-}<_@_9Bv@ezUR*Mz=ZAyc3qD+G^*>XX|k$r$un|&ls_ghs>&_QGt%P|*2s?& z_9c5puxYk)9lY`zv_%Ibch0!^n`87p=flCZ-Oc@r@6_~2(-%;R#K2}N3*BHD$?f{0 z7SYN+@WYs>q-Q8DR}K!f0z#;LWCy57xf&eyb-7P&gjd+e>jE^IwXR23Cv&NYfj$0# zV-$P;U$MR1@(t9~IVt#TDusn6N{hZsS<{>Ef~G98~Y96`nrE*)EuZ7W^C5n>~|AazT%b0knip* z*)+V7sy}3k>Ki1EhFfdoHJ$3`DxHhs&b^8MgOSrK&}@A8PsOoam6K1MBL@>Ain7V% zln6LGHL+^-dnWpD+`;i4$7>rYxYwd7J7i`clsoLKyXJS;O+uAHMX*UmF7^BS=QC!4* z3ND;mb`9!<69O~ZARqj$&*EIhJA-;+aj61PS{*qBS+fw$Y?c7S^yS%tpWMRiY5(9@ z+u4lxx%=Vuk@{2fn)M=shg0}iQkm|Heum!uZT_+b7zu-**6(IC_)wEYISA$)sye+9 zeD1((y*vHL%R4-uVrox)L0`Y@yh-=PLjEBv1fJFXH!q{~^4cG-xc1`Cc?cW77FV9_ zXvHY~BJ?N6N-+QFh;?elVgy=O%2cJ11w&``wrWeKMC@buwbbsbwg~r5Ysolgh^zYA zUl_(QBwxqW(xh#T5S3zAsN$jx%xkI-rLK2V>TnT%{=GskfnF7aQ;9#l9~9r6_i*gH z-8W4eYv02K-*_6cn05W?`zL>eVsBvdVuSj+om2H!h_Vy;K~bvWpt0|ZJkiCr0Ve2g zi*<*x$MN@F(E5Ht{hFG7#vxGiA&Du%G2^htQiscc3pq7eX&>@HJ4p#(!Mw_YL)t2H z5?2MQp^nyKTp_r02k$B6POrr`x_o>e!u0~*?f}#8ofWI}wHJUHo)w}@jyS`mEJ#_o zN+=b{?D3N>b|IWEzg5}B)oygJ;813i+wZ3SwM$ooJAn+ChSzXA6`Q~(Y3c7I%*dse zF=q&v!s~TsPt{du(lFUChDU7NR`Wo13^2_Lrnvx1Q_$IwTM8m*x_wkG1Gj)R&(#Km zm~-gUWv`D@oB1zIi*b`vhfTM0im=P0T(b_{ZWr~$vu7(=hIF&{tre#UrUJ(~O@Cgv z_>0i1lodLkxRA++McwHDuS8iZ`vN%0+{C4vVTsEK7lPYuC?vmoeyO{>Wq4S8VZFty+fF7N` zBNw0W#_)=*hsr;e5(^^Cwru=$-oFZDVn$@RIdVA8)Co=jLew~XkO1l+_{-vn=efCO zQiQ*&xXh!qpxuQ~ikX{Uz;m0kIT6j4LqLX%MxB^3_22}+1H$R%I!`BL?eo(ku`%qx zDiqG3UYW*fnB}by9f)_#Q*`G#Jy*2}a#EC7Q{^hcRSKvxfs~TK0ga&I zcrCY{Q}6L1PGS&mA4_0G-V$eXn^Z%F;85JF3A-zkVdpu9aB(wGv96tUEj6@#L_Kd3%ufi_lie z@~fTG0p1hAY>b~@J6ucd=IWld{X-qr(Z{M2hb*nd!mj+gmYaUCD;*u4g>9iE&$Edy zKDDo;I;+-$&5nVIxYc%1aBx+iY5nKYlFPS>#=b*hA}pW1U4P!a`NLNFuLs~KGuyB4 zSgTTuE=VKZ{I0mA|DtW5;HB56XI~@IjcAnDN>+sjYfwmij%EI@-hPzb;gJa~sfz5$ zI;uL4AX}t4+UJu63m)HHzv9xoG8 z)00GLkcgK_R7c@;F_%iOR6Mv!K~8tXQJk$g>&G?O!h| zxDazpFaopXlEsWtSxGg4d=?kvU-$OMi@oiT(e!)2fBD;|XenKijZh9g4Cd?G=4~;V zb@HKktBK^sl2@6VBH%S|xD&e}SCEZ`!Rd2L6dA*fTuvFaGj8ASDcUGY*rKcqAvxBY zH{@(WLh98kMobe*uQ2KYGjO>MbcvbfL{?1vQ#p@o{L&7+S}SX+;S&3r0yb$|e?^eO zF=-+PA?WNrbg`>=B<7zC6|I)pJH_tsrNBzAm*rO&>jvXHkSR^3C*+}ed3Ljg3!r;w zsq=r2N^Dqj#M%*@?U;Gl_@(dK8+k8EbhJ=`ei5&O2frH*PJ3*Am?PALa$jmMLgioX z(0`0W{+$U+rDXpb<^e&?d!M9fZR*8$F|5$!{p?q9Fd;iDnKi&Jo zFK|zKw@+0Y7|n1BTL~*|4hln05GGH?Q+{iLrZ=z`&svfxb@1E&{_bSKy%Z8HEEswr zYUG0hpckLeM=mibbQ4?cW%=-~*iSwXi>6>)@&7rJyh+(` zlm2i^_I6u>3DVhUlA3mV!lXc{{k*87Zcm?!Mp6s^~elA<*%_ z?;f(F$xa?mO16U>U*%7p*WFx{jO&Q;0Z%TjwL5Bf?acGlua>Gr?SE>>68w7bz0{gO zuW9k1nU_Q{lhhSN8cBipsp9$UKm71- z=$~(M$YQ=?%BtTD+EVnw>%z||nV&R|a!_b^tc=z|I>Y9pTN@ETI=IQ!Ff2{vG}T3I7ZzZOz`p)TUwa++opF=b-9K;zdp*ChkPoF#Z5MUS}kW ztQ9cHQwoqvtaEX&jVQOj6c^`>g9|E#<>wWELw)U71%*$R$X|4|WLN zX9w033i^j?yCpJ18DoGCiYO|0+aKodFC~<(QRgBrgZ(51s_@Mnv4DSE;x z8jWhu-QK$CC*vsG=Pcj(Bcc0>ST%0z&^`8Pg!3!SV)uG%$n02(GZ_*~;Wz?%SU_aQ zoP+?z0?|L}X`+65Wea}$b>ILwU75Sx&YZ9^*G30@qXO>J$sHf@BJodsUu>x3c4xN}C3-AaA5p`jU)DtZ z!_Q2k*hFaJ3=tMX=3;6X8op5+g3j&3- zlxCzyptT>B50J_{Mz}RvU}gN1z>yW<#vmn_KvDVS)|BFqMP`Y1@alw!)_vKH0n6)! zO_#HKN&(Bb;QVH!DXA{f-TUqkzSN7fgqN0yJW`Xo3bKLFm&`^B$*-n79D#kTLD56? zZr`y5D~YOCWjS-;`}AOXsHs*^hzG@p>$Wzn19O4~Y6VJut$l)$BgOh5*bfXABvZ4w?nX9v^Du(4; z)_&G}>df{4E$W-VHr42XhZv%QC8!syXa%_E^&?i$+R+es5`{kd+Sb2mZiDQaGR`PN`PhH>dP`Naxr06=kV)NO0rz>+S-o2v{rqukM^TN zEdq{F2tN5>_ng?f{OBhHg^x>*36je4U|JcWXGp|qv0*|(=M0~N6Tb!Hro|tTx%IEs z9`}mee~3Or&5pi$U3KUEt+3;T6b>m4-Kkb5K9SxX)7;~uV&XyVccbKN6>IV0wbX_p z8oAPuXD^pUM(#*~Dj~g2WbWCp<~&d^bIVf$dLYi2u&?(W-TSnHFN5~ExXt8sWm3Ba zrw!YjDU7|>fZZRBJtV%X}D>attvXV3AY7~<|#7ysyFMe@w)TK7`eYR%pQGz zgON4n+>6rXNaJ|m*%rV@sR;(1JHrFe7F-m}Elf*E(_F1MQjlW9Jf*zKZ&-PlZ6muT z0LtF7RKqEh3doxR2X@88}WP_o+FZ%vB9QcdSYmSRxVZqZ{ZcO%%EhxDn zvALi_CUet5M?7WfeIwtrW?o6?mk)+ZYB3Veep7MA)VQM|TL%JW5C>aV;hCN*xYjlXFy4V-^efyNj`O%A~x7l-#9AcjP?}TIY1~foC2=V-(o=EY3Ck z!QSG4K;x*Bs+dFUT497z&p*YY_ald59CR1Z7f43gt~$CcSel|C>l16G@Ah5tVWYSo zeYbzT85-KS{|P*}FB#CbaJM~Zjl2>`@dTDS41O`TtT${iA^cqLAyXxNR5n^hh%?KM zb`7X#^a&fR|A@mpog?-y0*AI9MI=w-w#$6n3V+7O7AsPNRPuFtVoNQ~KiJ1^1nM7y zRUMR9>-?sl!TcmiimcP4njSt-2}Ld)G9b~nu8RL6^p5K^q5{ya1+(BDsU1mI?lidd zvLZkEduUNA87XC(#sfr5 zVkAMk;x%!a?sxb4!Q+1!(#nN~y^c9|#>DDcW;*V>S3*NOyiDpl)Y;E!&YQX>k$+5P zjj@Pjtsh=EhdnLX0+ws4=(#*8KUvzZcqMkhVOy8|n?CJqP!%%}m=RiJyi2@RjhyC} zRmKLL*i76$(=naQki6EblsZx&02&6nyIg!WG7FTXH zo-%`U3yl%yq1IloE@-3)ToI)NJ6va^SsF_s%7Xfankr2mtXl|+Y1a#4dNJ)b7Y*vE zu0nK1kkm=AASO;w^QjL{khhpdYx%nm3D*$h;@Pez1@S0d^fX(Ol+wVehEG|pm@k-Q#zP{&An>V|X zecj;?sV!rZVnCaoo+XY`< zc~&rr>>OuP>5{ZsT#bJBB6$3HMDE4rf*O+&OOQ25dv@7npjR`VNgVIqTRPH_{z#NJ z2q!ShyQ5X*fR!x|8gzLeuYKPND}L{;aBAb;e$r@Yz4;#YY9*VKs2e9{p3@b=Qm-;+ zp4^7yH8B0r45o1&?3v!OVNXJHGO{--Tkw7k9#zjH?N=RRoO_8Y_eSCkzhFgs{}No- z9@#PKc{U51b-ULa{N_Heb0i?AKAS0sxG5fX*eY?jD#l(_Z)lvbBzpPguBhJNDQ-~5 z-cX8QJGu)iFM01r{j1NW_~ds*8Am&YP9#8MZ{b7czY)9V)tlbVkko2uYO%ILpoyUr z-sU;E^T7F3n15GU`S>oyxkK^+J97CunBrwF56ac0^e7=`!f4n`4XBS=9Xb^&^R|^- zP*q)0ri)M`q22wAN;HmLR{vX0IY@Ko73AP6R~zFQfw<(t#pp3S_C0zzHKu?Y+ShV0 z%y5>xY>553IKsoDv-qq=JE?yM81l^TprOm`0l(%DQZlp!<=s6Wyzc2*G$+=Z=p6ZA zVCO=*?c>NwiCA%SOSUb(5wj<3U?g^^3}ocnw2#KK-!*MD%i0Oqx|W3B*u3npy7=kp zUja_uMW3SuB5Fk{?H}WT%!d!`&!SCF)YUGw1Q}us-w`toW*O25{oiO z?5S;zZea7F3z&o%Xc7AquU4ggZEV`&Txi0i|Ar%BdZ)<`WmnNZ*Cm%z;+B!h(zHgW z^@KMuXEXzy5XIQuF)eB z3{#pJy5QH+zE*9dn7ydpa_?F2Q`B<8ij}DYe^Oz>>(6XIu~a9s^O>NH2U3CX5c5T8 z%Q?yo`;0 z3oNegqcFsChim`YDeR@Yjq?7>_Xr}$H*#kp6HbuSU?VTqYnTnKS{~>IshWV`7Yi$i z#GdaVv+!CL3iH{q=0J^C))qXk7&DqChfpye$Jr<$x4kW3`_J~{f-*`207MCcS+Q!j zI2`p8*|nQSRoAx)+i0r{Eb1@v_j7}(as>qLrYHBe7E^?FgeX(AW~SGC36cNL;0IBT z*$JPxHzAg`nW^9RM1!Yx#s9c;cKEXSuJ)1&Pi-gmO3{QdE|1$GE9KN`A&A4M${t@E zl&HD;czj?i>-?gegYcNvd>kn5R*BF8wu;>$e8K4tNZ_|tb9Q7tL1(TC^fifCO_b>Q zl;;3L^Q~c9HNHf>A9od>!!7gIHN#1}P3nTAyLN{TU(#yJ{tYiS_b~qxCHi-GR+RSn z2odvgvfU6$aHyi&QfSiB^{r=Q@HhNaLx|h=I4)pf;qcDIyWIcm#&IoQ$38Z)<*)eP zmn`P{m7ajxDc>e8X9g{EOD&@{4X{2j2R|`eYj2ieF%6V8bDQCmGIIkC6D^CE_ScIF zf~E!pdLV-1an1kDSP!_}D|mmN63TvnfdEd*InCnqfvC$`1|T&@JY_Aqh*NCqMHHn% zHQUGgA`jiHedHp_4HSxtsFmO%ygV99%UE{P;PlsI@k2q40CM!AgPgwO6)$}Yf=FhD z%KO?#4iD_Wthk1Bh*=0p$~nBiuW--9uUyp6SliGx#E6C#k~h!A5 z3RoYKUP|Ga_roox9ou31CKc&TU$lv=IK`#IftT@5&UkHoW5*Kkp)drRL`p3yCnJ{a z$~u5Ro1QM6w}cMZ{#pCLaxKTp`S9=2m%q+PAJ2Xe`BAxKL`&r2R!;7L>xS}rzo+W< zL=+CkTpsz>p6D}w#imGGxybcqyH0t3;*Y66#nv>(%s-$+pT2)eU-(kAaLWx1>b3Si zwdk~?#8g*P6~!8_<{2{VlK6Yd5(7QZ!JPbZ7$PhlTMSUoks^qn5go^V%E%~04l}>D z<5ZiQ^wJh1w^Ro*AR~&VRKSlm+sB+9-z4b!t%s9h(g?Z}A^PV@`cYvs+N z(deLRGvQy=_HnvGiO^S-F169BVPC+PG7fq7>kw4x$;ZYlADWP@l%!HE@@DGxkh@f| zERJBUYTNIEF#dG>w(w;oj}1mHkO-=`6}Lm4AWKulxRsKc6F-Qx5pEM5w3cb^^j6L8 z9|C)QX-e&eMYDLAc16L|(p0(APGqkt-AdjqC3ok_C>dGgX-bRHp0GNV)J;^tshuZTR)#Jodit6LYsq7Qh6t>JNp5b!LBgzDzp8`b0R}qazC|ta zP@T6mck6kxNSln9SF*HsCgp(vR32QrK2_I%>zx-WgQPN!V8iT5Ncsq~VyeVg*;d>} zmsvxwqhu3lt+p|$+T>X5zE;PfH4TLHd7Cfz|Qo35^EK%s%Or)L?6V{gWjNOhYf8K{Ygew$3T!T#5*KkD)t z-L!W4CfeOf|K9oS@@=`HSvm{NdvpygRC}#e*FUSQ^9vc)Ck?0VQo!rZvt<>?_V)4r z3@<)#d)z&JUb|oxgpo_Q&v0`{zlnAI%reM^%_Dq{Uz`mXA%VtMwyvMi^) zTw>b)${(A)nv*TyiAd5e;y4z_CW+xXn?#1kp{6%C!<3BPx~X@jQHqZA+{n*Ayg6!o z>+me*(sU^v0Iu4!uF4Z<;QGzKtB8S~wBEXgD*i-2M07&fme;qLVwFPbR9ft0t%OWb zWgu6Z%PeAg^+APYxoWJ{nKS0^M^pt>k20&S~2}&(Smm;ZQ-sGH8qU&^>66}AM~JC$bdwy-0+<69~v z%S0U=P!FQ9NbcvaAcOkKsx}8nz2IGnZWjrx8So{M5AWNh^@C zt)UkBcv0U`*A`qX3r<=Nxr){R*Z;n z>#CN1quWI^E$`<0X>MnqQira1?%rW|LfMmb1TdR|qW~y5+!j>cq-3V$=L)J%_|7AXX_~&?jHkWGWyM|Mo3o+!(NRe%LW_{G~vcg{UC!b_SivC1ZOZ=wu?M zpL^b~8A1t-k-={VJYa2r{O9NJf zG*?%dDyBV|26JP@%>A$qN-+^OozYA zIa{fTD0#}j9|VunpN_;a{QItN1D1Xx+0Nk&nM-qGpQ@67YSS*+&u};q#4i21z#0hM*@w7(y{tf`9rVl+$>d zmwUw)kd@}vzH;g{M+48_ZmYnB0%YDNV}{-iEoZRjEOq+hR3gbzk0YSZlkUR$Sfy80 zk`2UyA2~+y5I+RbtXgwdOa4cF<7e;#4@96^z?wC|YluMM} z6q*1>wtL7eI|tz(o#sQb>#+NCEvfgQ*TN};kbgm5Xc9io1a z|3iDeVMgN)Vwd!1kw7=&?3$rXS3m1Et(%5=qo0;Q>eiLckY6(dmY63x@;xR!;+nk! z6YZs5JPmTNX`R?3w9epi-}eMfK`!XBUEI|`GP474?Uv;Xa;<9NzIH;gAH1X@0D7u4 z=23mYu;mtJoemS;4$K}d@nxvnMm1E5qv9s(!ccb|E6^F-=|Nbp*nrZ=q;?hy5noVNxy?7Z_5QEdejLPnvwj)+b2>B5r`DHRDGjiuVU%Q1kC&+yd`Aj7Dg`5-{y7yMYT&^&Ne-HH_Uh7toFlwRI>uv=5 zPhT|~Tr0q$3seR2+JcH=*B_X(!;oht0@FCOR5(aI3q2JDx2T=ff1`|qKYB8R`-(Bl3jf#`;`oNpw>%43m4DbdD<8y@vM*w?16+sAJs?b!x;hwmDu8^^ zU~MM^K}dbc77_uUTnSwcC*Jd~68d1}?4Dk#?2P+TC6yTAvgA;Qai zI4Nm~QfN)B;dcZC)ggZI_K#3~&)W+3d`7p2V#l0yh2`kZLxT&)R~uBCZZzT4 zwQct3=GnY<621i=`Jp#_9mjFoViHebkyhEaDWvZBx~^FjqgGQJ;@_IaAHodr&-0+Rht8lDM$>b798cY$xP-s?>Qc42nG{r*qip|> zg`nnNy;A0sGPKQ7Z_hY3ff<;4$kdJuK7Gt$O`QWr88H^^BHQE5ZyWOTo7?MlwWPc) z{ON=Rzd*nub%J(3N^`h+W_C_ZUmjzvpDKB`UekMG+*%T^{Bl&EXSOqs(F(J~xiiGu zp~~)YLEN|kqT3y_4XfheI;dra3y6y=IyB4F_DDURN5YOGRfw8%qldY~QK%yO)u4foGg3&m zRVwSE$)7gl>iMpy3aJ~+@oRSIzA*Xf{!0qd*rdMkXjFz7IWNzt4szvBJ*f4xlS}jG zFauF`Oy~_Yokxt{W_8|$G2;@i_ILwh$*Bu zI0$m5xs0g2A~$5GlL5I|IpgM=w=MZi#nFmo*UfLH3_1`$Hk60#XuItF%(9w#3gwi- z7*Ws2#ej8!I=nSp;%af0v-qGbi%85(tg(aRmNZ1jq);~l5=&$XSh(A;|E`Vv}VlZv*Fsr z^FFnTm6a6{>L|8Sx!Y0b{okLf3+n@mt~3T)#i?_{Uft6(Ji4)~F0n^LBmwMa(-XKW z(ojpk3!IlG?yczgWABA%rH(iVY(~GQcUoS1A6NN!(e&HjWsx{dWDu2gjwRKV(C>kZ)ZcXQw=G~*tKbUMzMd?-!vhPUjB-|JKVa2zp`83>T^p#XWSm2{uf>#-DEojSYbO z1b*cK^WZ%P!(jAsg{c9UMUhoB9-PC@C^a|aG{dSiUN;vM4vA}r1$G+Rm&>sD4A~Oi z+yWhKECFSfm?s>s=4roZd`@x^qM2pKRPzsHuI1aCsXos^O0xLMbo*@IfHd)lvPHVn znweoHVH7CJV~1=WF((GEWQlWgUBn5=jBwOG?&!5K!}-TL203>6^G^1~#8*a^oS`>6 z;iVw7AXd?UVsN;4GgqH-d)_qbno*q;xi zXO>>yrVWPlHD$fj$v`-4X&A{ZM{O7{N+mM*9B-e*XVk>1%=1}_pAY#tH=s5A=}LT| z=U`(|A^Kqw`Ci&(yWz|;7BscZ+GJb?k8ngs`xL}W5rrnVhlu6%NA{9;{qf@j{uCB$ z$F`poSwhGh=TZ{ZtnKUqIwuCvHVkN}nX5fBG(L5GT0xkbvVLG9|JSe0m4_?Jc&DNX zt6K9(N#_|Su_Dn4=caut%-g4=q<@0Kh32}Y08UO9>O#~d!gW$v3K(p<>(dZjq~xGQ zK;|>(awO0e9dgXce&tX#KI7Zq^m>xT$JL{fh`~7WW=l8QMJS<=CMhaeUb$V3AT6Az z_GzoKFcA#qvT^aj8E44cils1Jy;5F5xoT32ZDH{$+_OL}PI?Sy+(;p=`B_pXd%{>? zfY4<%lo+9~Jjh$q34cdX=zrqa=zsX{l2ywMbEeFwW((o0Zba2mPAQ(Nl4>$Ep1VO- zk@bD3fo9hHBJ?U%@|M8QdYQSIw2{-Wc@>#+aJfe(wOxWCwXUk0FHtVmkwNm}-IG^5 za4kaqcl?FuI>F{7&(g90_m|^8&P~q`4kPEi4{0wn6COj%8Kpe`x{fa%xx?~ZLgK_E z5~wC8H6!`zy5h0kbN&$6L>?%A$8W#U{4*v`V|H|J;{T^f%Zg{p zYs+)lBGtUbeP!Bn#ALbBxhCv+Y=KX$K&5h>%?{ce0|hU)%%w7ug>U2R?JYqp1NBK; z_$1}!$$`7OA0uaeb*+{eH{@ZU_RxGZ$+*0z%FW#}!QJfoxHXDlbhBSr#);Ng|2)Y~ zL?n6Pf8qmug3GP_H$waUBz87(Usm)CLmoF0;crN8AIWt|HPUIhA zO;)$lU$gAtNC~%g?PN8Sm!>^AqJpa!uk9kUILxLwe15_w7`{l&;81WLW|}$J8>M23 z>|NwZ+KcFM!ra|%-L_@y@>?yyYa@MH5v5L5JF1FZ6dbv&m$Lj3-&ffG2;Q{L>|4E5R`iMiugxm>nl?$YFeJ!q12BQxEl_ z;-7q~Xq|b5>;sz_HCS$_?243*eok1>JS5lcFg(dU6-Rhxm_8A3VQfYzw*Vtxtv}JO z6ylaD0ubWUPcBgGuh4RysjvMwM3^S!IAlygD)}%_Eda$+S;a2hIz6wETpX2` zaekZA@Y^~eXsOSSDp(-GKv}^!{oQZxo7U7ljF-cXcAxqF8RJHGM*6kt8lw#6Q7rUo98WynMj`t55hv z=+D%PV8C}kxl#5a=1x&yrRMr>cOy8>4(cMiY+H=Ol2-_SR$RF68ce_0rwgm5`oE4T z3&~BEhs#>%#z@vWzkLMO1C`sCWdtsDA4}d1l^_skc}kbE7jxxw-Sl1LrmNA^KO1P4 zr>i4wAEi=whpC0mHG`T&XN|ZtDn|}4J1q(x1}8=g82Rqz+0-oR6o>&rqMYaUo4fk~ zCb9i>g+$!}hMoBTwRfiBY^HDjw*;|g5j!Q4AV`VSplTu_5?dvfhSFL>tsN9CU4E9( z#MUI%genn)Vr*5q%+#J(I+jv&nO0S4wbRzLW7?T{9-TM;x6kpscwYVQ_xF7r$MreR z`#P`d{C>}?0fGo@C8!sw7NdRW)IL!Q7751S0QkW!x8q6(!+V15kMx)?ueNh5*ci-G z!NqV2f$Aj4s=_(9v-jt=yQ-8Xj zkUm(k-=3&?T!;JW87tB6HlEj>z;5E$<7{(c~2wb zO(N`e^#bFh-@|(S669c`W=y*u8l8VMKM{ddQV&5Y`Dwa&HqcmT_bxTlShrJ)^Rjcd zEk?a&qfln3%{_JBq~P?F#;&NDBHfc6qW)fhR8;mzQ!g!uguJvq{m*$T6c|-65}TVd6roMD8Di zJt4<0RWpbn)06szk|n+cD+0}y&4;Xw@bv|`Vvud2&jp?m{I*G4n4h?FivyA?myas5 zj4Lp{3daH9+^NxDJA4e^>&h8M*dTB>wNx}4#!ZaFP(Wi3czhKsL6nmln*mWEzB-!N zWKWcAzEtsuI_K^YNUqo+&A87D^}d8bYp~>Yf*H-eXn_ARZ=GokFJ5@ln0wd;Y9<&; z_KKsdBqJqN)*c>1q3hW>SbL)iie5KB2ws z7`9Vj-RwI0tVe&G@9I-kk@lv^C_MACvcKFsOBfp!qZ@y@DR$7waW zPwDShMbC=lN&c8H+ekBB`dE8X<*}0v{8Z{g)aBn1B*>poMtYb$mx51I1)1{&P|9B`l(F}X9rzeCc2A!&P zvp;M|{f;kf znFOSz>VdvqcFdE(hd?Y9WkG#YRHxMWdBWD&SbeN+T#i2@W%Z&}V!R!hQ{~TGccz#2 zn+G}D(%)=9*(@4}F*F@IN%e}E=2ZYcYOBIyLI?%cvj)ljl8;+gT8Qa+;65Nlt2R0| zsh=EW?o1|~E9C+O3Sf3NY`~UWGm~MW+_>uWZO^ND6JNt7> z#p~1;us|669Z$;-02fL`S5S`pPuBfw~Bp+*SlZ zXc3nl=!*bh?&hW*(n?;!%gLC^Xn7Q}gb)V3K+gLl{(JIVRj9|`38Hu5&E+P+o>h4c z{pY0Vrq76AYdU?`+y>a3&-^3~FfA`yhMSl=enN zo2V7h3Lq~r1JYQI9kQlwyJq0~@5Yu_Av>F7p}i`i;JWXYbY&$0CCs)H2(~}aXNA~o za>KA(MHm;FjL!Bp^?hgVu$WlA6j+>$nsy*WA}ZV*r>tMMpZ2{mXMV^uz(%3`=qxlw zyMvM#H(eDb4$^9?3%YSN-Uhm9r{(t9S8cohD4zUitCzg-p)ksGhJW5xHC)YwL&4<% z2*j4ghYe-2GDb4w3a%CW94?L#VD667MIdyaUs&`ng3vN+=mAox#1PTE@zRPYJ?2T)&JniGjt74uiH8SZGX|^SFaBK(LifRDChb!W|vj_z}hu#Laik}I51oU z6{L~NtgjnJIv9Su^#R*VRoUyE6s>MM46*9L^@-Gu?4%(=x`mgge^^kYY^=>$zL^Oj z^2IM`pSUSSwsK{jiHt%#*Pvh7+$hfilqt*$&PSyb`DP)D8mwuHIu@y0HuEz7 ztJy!ZY7%publ+O^F=e;ddeCnW%sF}M#zr5X$+~*`a$Qr%b+TXfRgGJxc|ncTh2^T% zAyw*mAh6KDaay%({+Q^+Y|;CtM=sx2OKYi5b&l7UBk^gZvE(BR=@h$25~v-+IOBjE zuTK;?CQxH4*vBJxMD6meGhKck+qt+Gr;IJ(q`^|%27<)_BIm(ONqZdJ9DjgOKv0-( z?>(qhBKEtT=Cf;cB*xo4A-l9c-b@>nR1+kBisPY2OPj*)>U_7e;WwmbNpSCIMFu#@ zkwC0o#vBoUnit;B4@wJy#ozcNzR>$7@?m)qS}bZautJYmnE8;((}EZeO&nH6(E^z6 zcM8AC5M8cW`#73^+}@R<0C{r{ zAR|{rcLHT6#bn3#;l{U#(9_>yXfsFqsoH-bL=Q*FZr8NR&G9}Ti7_Bl>zK|}E3;-T z7v5&@juFx?ot*RrSAS>Hi6~Y!)qGC(%d2CQ2tvurnnJ3^-{I6 zeD+6!ppLaGe}pD_B~f05fUwLv+Wop&hU60NJ!~Yvb^#QGX8wIl z_N6Bb%^mP;!BN}frk01tOvD$?ddv{pEqP?Va*$q}#Na);#BTwfNv`x^x(wU3J)WtB z$6sp`Bjsdd@8!FnQA(=cP(_{n9@%@dvW_vg{vj>ATCqw8VrQxE>xkmX$uJhmy%mU? zs4o7MvoqQ&8H}U+!~cqcxAN#{wJ#$6L3b~=6ZaU+Lo_e!O||8$mUow|s?%s*x9bA- zGP;anBHQX7l>e+2wDup9#{&hMzdDQcr$YKSuGtiiSJd*$HAWqz;ZF=Ha^??TEtb&F zpC>*5zHxe8c$1Fnx;n+B=-Vt+RNu`1;m-7%r@CZ)f-C?8#x(2YnkLdyGxQ?`buIj{ zQnx93Ki*xk$is_If-SJJ9|9w^T=4E)3Mg{tj{8e!qyT}8L1r-x=_8e z%JxJhHeGZAp>}r>kW@jYOl+iqJmuaU-ZuHF_WsXLzU@|P)~I7J6NBOsIPcya36%$C z%%((&Q7n$+S?)(xs8XJ)oqD4`L(w*eE0-{KuWnGI7O`yMzCloz0%;tMW;a!_SMGwZ zmagUo;#~fK=j~Lvc(H@$h9?6IkaxzM3d`Wu@FX5DMn{`}%FYE?^z?SLS7VboVn_ph z@rIuVI`D6^--2i@WDigE{HQ5p>~(N%)iv&gM?0zdQ}pKVSBssviJ(q81y zt`Z3kLfn$IM`w)t1wpxNm0N0%?okgAY}x0G19$Wax#TrG_Hic_nCA~sC}s+EB1p`WBb^kHXFQ{OSufSDii;R|B_WWNRcX}4?8jav#FP&-QprYL z;*vh(P&_&ql5Hy~N-PQoKbxawge&!kiUm7A>eo>%3UI{DhHNXCt7TlvX7KulsHFE_ zUPG%%{8Ny{U?<>T>sose>+A=cZoghi+KKu+OIZ#*6?)FMait?xs91gJt)pG(t2ppi zwgXR8Ib)yEyb#k6SbID|dZ2r3O5&N11^{G1Ye`!t!8(NI1i7@c=$sMxQ_}p=#14IX zCx`3T552B%&ef~Dk0om>J&O}Ri_YbwmBUVVr<`VGk{wgrg5OgEx|>5Q>|#OreuVPG ze|wj0$>^c?vu$OB+~UvIRv3aIOZ{34V76;2AZ?xOa}iR>j03wAK%k}@Uf5g*NgZ zS7lGcclL(3og_vh{v4;QxAk==4LM$HB7>W?nS?{ec-9L)R~WP-8lu_~OVv%!Jf`@? z#u$fiq2GIrZqY)PJn(fN-tfm1%oe%)GH?K66+=|8RKvuVcZZt@3Fb^Gy*upFXhslZOvUoEo_aKX$1}DUOY`ESN z>qirpEu_`sGof}YY{O&2AnFk?F$6R}7C0*6jmEEZ?gk9&16=x`aj)ZT$KFDG+&pUI zry7#DOgIopil^KDscluvKJ30DkDt`j_ z&Z@xSlQsK<@>JvD2-Tisn4u=$D9E$)kg1hw7%lsSVwt{aq}p7o;tT>da+!|qW%0+? z!@0h^I-i45Rd?_96ZM0SvuWor0?j(=PFn;8yJ5! z4v%S4q~`K9!+N%>`WqYqWq8gZ zMBY2LKyY5621%vwJiPEIhBbwV5+06;%CHHfSbx094Y*18svw%8^|4r_qw3p`a@u0^ zT2>T^0k?Dl3%w)_jc17GHoPuH49oH|A2_y+Dx3mJ)-o?LoZ*pSWmCxzEpF;%bYH2( zMF0$ofHjZ9&uSY%%v|^T!=Bd8RpgF!Vp7-eR_NULx;t{suaVd+dy;`9(|RYgg3+i9 z4Vlxs;uLocP)i)aKF|M)IR>6yBGrGMPSaigJW|I`3zF>DhdBH7p%CqF^&w2L<+pXn z{2m=<+dp{mkUuUm5lWsNI|*1`|Kj;(eK;nW4-?gZ09? zD?yEBU8y(t7B3G4uX1ho4Y)jCPIXqf%8C8xMgT*Qad!}bMtrZ+kIl)7^|Y zO!82i!pTyhCG&_SE+f7-4XlHLRAK@L zD#|VHqXa4BwWPc0=#EZI#uGRHnQ3QY83HYoAQl_PZph{YdA2|RcuaCYiyCt*yDu-R_H$YLzJ#QKSd9$DX(H5XiTIDr)L;RFW~v6w{dfNRFB{!Kd7ZD!DcB3Ap6V>Ym%m8YWj?i@W&q{ z0F4hyVc4)i6KY!3YGDNciiDXcB$RlC`5?;!EBlJPuFhS!pqQ_P4`tSiJLm-uyUokh^O~9T)GIL|tlN#&@6Gq$1 zkh?wVyaVA7CLn;APo8Z6b2ym$^`TYNETIXZEs#bsCEnNUvEjj8{Jn)Wn5*L|5~3ql z_&IR(VCvjM6MQnHFF%Gwy>kESAu&KB~l3H@ofL#h^-kD@_(J|DjWeC*1x) z85Z0w_U=nm$BkHuTaY9Kxj*~?RCLDS0rfdo$%rJh*KLUHk;zJPmpERScbV=g ze>%S2_Zy-2GWt;(f6D72M|SQ#LojNc2C0< z5uK~@mM88wmg){#GztSv)y#Cvu|Dyc^NJ9M#=hv;d2pk?2^a$Vg_lrb1Om;T#YigJ zEbowTOwRCw$x+i@ur3>7>i7i_Ja-FGLt?P{D~Y|bzT{wxm-wrp^$VuGR$Rl>Op#hq zY1w@hOo2g~RzAEjC2NM}dmwdR%X6mHBztS>!KJ{Y-Kk!>>6FN#7+eh>esMDv(QO8~ zh`liTxyb5xY}R2XEc+^lJXUOxTd$6IZ^6<=-|R^trnU{f5;Wmz^^pp9hc688op-Li z?;TDV`_nZlaHS`6xfs$h^y^Sg+`j2C-C57@T=?~E%-)#&oL;Bk>C$Ft-8*t^-_C|~ zFIX7gNhhwgoqOe(_E)7mNI|ax^i!e~LY{4PFo;w{^-{3ZIHyRb2LcyTsl4+Ql`y(H zM+?@0d>U$_+!Kw=-+2B!^heoKgC(w_d5fl3lTKN^yp%g*Ke6qVURm3i>vxdr{^9hr zzW+w(HyJ}YjnDFWCVA{(6J18FY^XM;_!Du|Dm3xF*Id)>t3eJWpGJZHPe&EF4R?HN zTv27Erv3Pw8$FOeWTlOWZG8;X zbfl?|y@L9SmyGC5pU~#VQgQ+=C+c`{$D8qnJx=ncL!;aJ36C|0a_s>nQ4UmlpRgIO z(&k?v&3uCVx^}Hu;c?h6y7k?9N*^$U6Q(Ib*PidZ#E$}H7lWlrJU-bV5OUitqk}#kD$I^62;U6m}V{YWg0CJB8Pn?Diam*d7_z{`MtxNSC&G*%xD*2jP-Gq?`kt381;n=)Mk(VoCY_^*aGkHW0MJg!X ziCF(e=yw_2O_je9-A{{?hfnHO_bHESgh1o=ZZ!4^B=O7+=e*=ZeLqTdZq%gmaTJSb z@_aq_Et{qc8AY52A`&c3obO+XQV_;LB2R_Db7mEf9-Z-jPfOe`<>a$kaw%ui*!@o; zt6nLzl-f?g6=%O|sjz+Tpo%xdlo@LE@(OrqNRF*(q__F#I0St7>Gdn|Cf9-*f}eV= z@Y94jK{D^ZJhz6eIVDHl7G5w74k0<4KE;PUh0 zrZiqdSmdDDcU>{M!*c3weHJ4z-k;a@H;Gy%MVjE}GTX8PxxuJ1x6I88HMiq{(?C|% zxkg-RUlf)g{4{Hn{1dJM^;i<3qcPU_ zjnKC2u_EA?2If80xZxA~QXfiuMNx{J;iSRIc-!xNz3*nCf@w*ItONCT;WTnUlTS-7 z#3nR%NsH1y6R1ll`7agHeGfjM>7>N<0#328wRn6LT<|eX%kCm`OedT`hyjJ@zlqY7 zBi(phsZtByWL3={wmd)#mTvlwWONSC>Ip~1$HV26`r8Z0r8S@dsvv3`6rQoM+X_Ls z&Ns3+O4B2ue)M{6zeK~{P!_GqTvqc)yLds(N>QE&3fH6QnVMUyeFWPMkvNxs6Xm9} zegv&5UuBZJ+qP@15^Q*G6U*P}PJZ?{Jz>ZulJ(C&^DMTW!is(%oTEh*D-4Eeg|JTm zI>Kqwl3@zWG!0Mis4BX0s#zXvig)l)r!6Uz;ZG75vGez)6^?$2%~wT5tZNA>K?|xd zYyAE)$w-CgOv7#O>H9?G5*4T|R`fTeEMp(&0ofU2#P#`O!r~f6ZYEKI{jU>zL-wJf z+P;v)C12O=q*g_()7Ws5>6^sEN<1_2o+J#@v9-lQ+Bc--yw&fI;*FJr+#52mthKeZ zt9sr7OfTe9($TYs&>#i^F?ML;VeC7ER%GJ`HxF9T6_XQIwq$}pPFWZIvf%zB#v5#D zG_i-`u);|mdjnnc9UxpMFJYsVD8hbl5s{ z^sFtKB=rJdrA4wWZBbs^r%k5K1l@kI;=Z{DquDZgSvox_L_n(X&5wF`{LF#Yfs$?) z;0=usq3=!NY?VBtjDG*Bja0v(!08MEYOen-x+AjSMhmgGe<;l9`S0w{ems)5k3iAz z{cVRLbNn!(F$Qc$_fXntQXhTEGbw>xh`grnJEVf%x=lhz>E&AwyhqWj*jA@mSxj zYq*gQ^3E1yGfq#Q0ubh0BoACNFhB4^#D-E$_lVeS$66L72=>-N+u@t*rz{7d!MZ~$wj$gO;d<3oEV(5*G{>ZmO9~YJV zTrMY4AS=ABI*;m~Z+5pO>YzKhm73Q~eg?bsg#NJaFcrGb3`Bg1^GMJo1csGn_>|va z5H&McH3$oM_%PBS{5BtBtV2UR_lq;;(Yy!KV zn6%hnFr?Vu<1jx*_x}tvh&yIzjEo;yNNe*{ta3~1(08~j^h zCHvJKaB^ZibSJ8c!`(vk3n{F%q}1}5Ug{CU8c{u^r1Al$Q_j3aK&<=ga3blZ7qGAG zz3_zh$o+u3J*}MbE&~OF45Qv)>W>4thiAMW-YFbg;(reN)p}Qu>6*6o_eBSlAGXBF z=W^x!Bl-ZtmOmmWbH*q!#E{4&v-nLc$&~=EkI(VL0q%XU4~_|;wx|+b-%3LEWdJEQ z_C8YlK0LVHl9Y2T`1|y|(HDRI4Z|~#+B|_#(a}(Aao>GCOHH!R^ML$aPcxT_2TY5} zUnlnscBbyw>s|i%B&PBYLMO0+pPY0SV&#Z(7sGDInr14Ys7Pkb3(-5r97at=&!^>Z znR9HBkd=NZ|2fOyqN1Ts-PG1VL2VwuG3jDIxB6VAYV33qJo&h35N-G^Tt`czK*NYc zw1~S>IA;_WsWRdDw1B2?rL_oHOkIOOqXz+vt?p5-H zVt3F&f9*7o8>ZT1cnAjWgK@TV*TX}D`KM+YJ{ktLYb%iWy$HVr9egb`rf=5M4T9ui zcP;rX6}X4fHjeFh>(VQZy{sTC4Kj}*U$SA`f)=k&=UYhB8!h4?=7$sqEQmDf4Foz~ zJ?zLR*^gMcA;QqNE7pA6d_C+jPEMFZ?f=W?TMWI*(fO?M*O=(x^r8JsAr_VTzx>w! z@HMo2}k^~e8l#3gBfnldDW7pR&T zBDe{N3?X?i1X>houA?eQo}DT$#eApto@2q2mDFYP9Oe+t=5GamGR^n4>!o&T^(aSg#gB$1K9 T<;chY{*T7~|HJ%GX5ha8S)GlL literal 0 HcmV?d00001 diff --git a/front/dist/resources/style/style.css b/front/dist/resources/style/style.css index 8c5975a..3f3c2c6 100644 --- a/front/dist/resources/style/style.css +++ b/front/dist/resources/style/style.css @@ -37,35 +37,74 @@ video{ .webrtc.active{ display: block; } + .webrtc, .activeCam{} -.activeCam video{ +.activeCam .video-container{ position: absolute; height: 25%; top: 10px; margin: 5px; right: -100px; transition: all 0.2s ease; + border-color: black; + border-style: solid; + border-width: 0.2px; +} +.activeCam .video-container i{ + position: absolute; + width: 100px; + height: 65px; + left: calc(50% - 50px); + top: calc(50% - 50px); + background-color: black; + border-radius: 50%; + text-align: center; + padding-top: 35px; + font-size: 28px; + color: white; +} +.activeCam .video-container img.active{ + display: block; +} +.activeCam .video-container img{ + position: absolute; + display: none; + width: 15px; + height: 15px; + background: #d93025; + border-radius: 48px; + left: 5px; + bottom: 5px; + padding: 10px; + z-index: 2; } -.webrtc:hover .activeCam video{ +.activeCam .video-container video{ + height: 100%; +} + +.webrtc:hover .activeCam .video-container{ right: 10px; } -.activeCam video#myCamVideo{ +.activeCam .video-container#div-myCamVideo{ + border: none; +} +.activeCam .video-container video#myCamVideo{ width: 200px; height: 113px; } /*CSS size for 2 - 3 elements*/ -.activeCam video:nth-child(1){ +.activeCam .video-container:nth-child(1){ /*this is for camera of user*/ top: 75%; } -.activeCam video:nth-child(2){ +.activeCam .video-container:nth-child(2){ top: 0%; } -.activeCam video:nth-child(3){ +.activeCam .video-container:nth-child(3){ top: 25%; } -.activeCam video:nth-child(4) { +.activeCam .video-container:nth-child(4) { top: 50%; } diff --git a/front/src/Phaser/Game/GameManager.ts b/front/src/Phaser/Game/GameManager.ts index 7843642..6a4381d 100644 --- a/front/src/Phaser/Game/GameManager.ts +++ b/front/src/Phaser/Game/GameManager.ts @@ -6,7 +6,6 @@ import { } from "../../Connexion"; import {SimplePeerInterface, SimplePeer} from "../../WebRtc/SimplePeer"; import {getMapKeyByUrl} from "../Login/LogincScene"; -import SceneManager = Phaser.Scenes.SceneManager; import ScenePlugin = Phaser.Scenes.ScenePlugin; export enum StatusGameManagerEnum { diff --git a/front/src/WebRtc/MediaManager.ts b/front/src/WebRtc/MediaManager.ts index 1dabf2c..3bfc287 100644 --- a/front/src/WebRtc/MediaManager.ts +++ b/front/src/WebRtc/MediaManager.ts @@ -11,6 +11,7 @@ export class MediaManager { cinema: any = null; microphoneClose: any = null; microphone: any = null; + webrtcInAudio: any; constraintsMedia : {audio : any, video : any} = { audio: true, video: videoConstraint @@ -22,6 +23,8 @@ export class MediaManager { this.updatedLocalStreamCallBack = updatedLocalStreamCallBack; this.myCamVideo = document.getElementById('myCamVideo'); + this.webrtcInAudio = document.getElementById('audio-webrtc-in'); + this.webrtcInAudio.volume = 0.2; this.microphoneClose = document.getElementById('microphone-close'); this.microphoneClose.style.display = "none"; @@ -61,8 +64,6 @@ export class MediaManager { this.cinemaClose.style.display = "none"; this.cinema.style.display = "block"; this.constraintsMedia.video = videoConstraint; - this.localStream = null; - this.myCamVideo.srcObject = null; this.getCamera().then((stream) => { this.updatedLocalStreamCallBack(stream); }); @@ -72,17 +73,12 @@ export class MediaManager { this.cinemaClose.style.display = "block"; this.cinema.style.display = "none"; this.constraintsMedia.video = false; - - this.myCamVideo.pause(); - if(this.localStream) { - this.localStream.getTracks().forEach((MediaStreamTrack: MediaStreamTrack) => { - if (MediaStreamTrack.kind === "video") { - MediaStreamTrack.stop(); - } + this.myCamVideo.srcObject = null; + if (this.localStream) { + this.localStream.getVideoTracks().forEach((MediaStreamTrack: MediaStreamTrack) => { + MediaStreamTrack.stop(); }); } - this.localStream = null; - this.myCamVideo.srcObject = null; this.getCamera().then((stream) => { this.updatedLocalStreamCallBack(stream); }); @@ -102,10 +98,8 @@ export class MediaManager { this.microphone.style.display = "none"; this.constraintsMedia.audio = false; if(this.localStream) { - this.localStream.getTracks().forEach((MediaStreamTrack: MediaStreamTrack) => { - if (MediaStreamTrack.kind === "audio") { - MediaStreamTrack.stop(); - } + this.localStream.getAudioTracks().forEach((MediaStreamTrack: MediaStreamTrack) => { + MediaStreamTrack.stop(); }); } this.getCamera().then((stream) => { @@ -130,9 +124,8 @@ export class MediaManager { return stream; }).catch((err) => { - console.error(err); + console.info(`error get media {video: ${this.constraintsMedia.video}},{audio: ${this.constraintsMedia.audio}}`,err); this.localStream = null; - throw err; }); } catch (e) { promise = Promise.reject(false); @@ -144,12 +137,69 @@ export class MediaManager { * * @param userId */ - addActiveVideo(userId : string){ + addActiveVideo(userId : string, userName: string = ""){ + this.webrtcInAudio.play(); let elementRemoteVideo = document.getElementById("activeCam"); - elementRemoteVideo.insertAdjacentHTML('beforeend', ''); + userName = userName.toUpperCase(); + let color = this.getColorByString(userName); + elementRemoteVideo.insertAdjacentHTML('beforeend', ` +

+ ${userName} + + +
+ `); this.remoteVideo[(userId as any)] = document.getElementById(userId); } + /** + * + * @param userId + */ + disabledMicrophoneByUserId(userId: string){ + let element = document.getElementById(`microphone-${userId}`); + if(!element){ + return; + } + element.classList.add('active') + } + + /** + * + * @param userId + */ + enabledMicrophoneByUserId(userId: string){ + let element = document.getElementById(`microphone-${userId}`); + if(!element){ + return; + } + element.classList.remove('active') + } + + /** + * + * @param userId + */ + disabledVideoByUserId(userId: string){ + let element = document.getElementById(`${userId}`); + if(!element){ + return; + } + element.style.opacity = "0"; + } + + /** + * + * @param userId + */ + enabledVideoByUserId(userId: string){ + let element = document.getElementById(`${userId}`); + if(!element){ + return; + } + element.style.opacity = "1"; + } + /** * * @param userId @@ -164,10 +214,29 @@ export class MediaManager { * @param userId */ removeActiveVideo(userId : string){ - let element = document.getElementById(userId); + let element = document.getElementById(`div-${userId}`); if(!element){ return; } element.remove(); } + + /** + * + * @param str + */ + private getColorByString(str: String) : String|null { + let hash = 0; + if (str.length === 0) return null; + for (let i = 0; i < str.length; i++) { + hash = str.charCodeAt(i) + ((hash << 5) - hash); + hash = hash & hash; + } + let color = '#'; + for (let i = 0; i < 3; i++) { + let value = (hash >> (i * 8)) & 255; + color += ('00' + value.toString(16)).substr(-2); + } + return color; + } } \ No newline at end of file diff --git a/front/src/WebRtc/SimplePeer.ts b/front/src/WebRtc/SimplePeer.ts index 3bff958..a4be6bc 100644 --- a/front/src/WebRtc/SimplePeer.ts +++ b/front/src/WebRtc/SimplePeer.ts @@ -2,17 +2,20 @@ import {ConnexionInterface} from "../Connexion"; import {MediaManager} from "./MediaManager"; let Peer = require('simple-peer'); -export interface SimplePeerInterface { +class UserSimplePear{ + userId: string; + name?: string; + initiator?: boolean; } - -export class SimplePeer { +export class SimplePeerInterface {} +export class SimplePeer implements SimplePeerInterface{ private Connexion: ConnexionInterface; private WebRtcRoomId: string; - private Users: Array; + private Users: Array = new Array(); private MediaManager: MediaManager; - private PeerConnexionArray: Array = new Array(); + private PeerConnexionArray: Map = new Map(); constructor(Connexion: ConnexionInterface, WebRtcRoomId: string = "test-webrtc") { this.Connexion = Connexion; @@ -20,8 +23,6 @@ export class SimplePeer { this.MediaManager = new MediaManager((stream : MediaStream) => { this.updatedLocalStream(); }); - this.PeerConnexionArray = new Array(); - this.initialise(); } @@ -71,7 +72,7 @@ export class SimplePeer { * server has two person connected, start the meet */ private startWebRtc() { - this.Users.forEach((user: any) => { + this.Users.forEach((user: UserSimplePear) => { //if it's not an initiator, peer connexion will be created when gamer will receive offer signal if(!user.initiator){ return; @@ -83,15 +84,23 @@ export class SimplePeer { /** * create peer connexion to bind users */ - private createPeerConnexion(user : any) { - if(this.PeerConnexionArray[user.userId]) { + private createPeerConnexion(user : UserSimplePear) { + if(this.PeerConnexionArray.has(user.userId)) { return; } + let name = user.name; + if(!name){ + let userSearch = this.Users.find((userSearch: UserSimplePear) => userSearch.userId === user.userId); + if(userSearch) { + name = userSearch.name; + } + } this.MediaManager.removeActiveVideo(user.userId); - this.MediaManager.addActiveVideo(user.userId); + console.log("name", name); + this.MediaManager.addActiveVideo(user.userId, name); - this.PeerConnexionArray[user.userId] = new Peer({ + let peer : any = new Peer({ initiator: user.initiator ? user.initiator : false, reconnectTimer: 10000, config: { @@ -107,29 +116,51 @@ export class SimplePeer { ] }, }); + this.PeerConnexionArray.set(user.userId, peer); //start listen signal for the peer connexion - this.PeerConnexionArray[user.userId].on('signal', (data: any) => { + this.PeerConnexionArray.get(user.userId).on('signal', (data: any) => { this.sendWebrtcSignal(data, user.userId); }); - this.PeerConnexionArray[user.userId].on('stream', (stream: MediaStream) => { + this.PeerConnexionArray.get(user.userId).on('stream', (stream: MediaStream) => { + let videoActive = false; + let microphoneActive = false; + stream.getTracks().forEach((track : MediaStreamTrack) => { + if(track.kind === "audio"){ + microphoneActive = true; + } + if(track.kind === "video"){ + videoActive = true; + } + }); + if(microphoneActive){ + this.MediaManager.enabledMicrophoneByUserId(user.userId); + }else{ + this.MediaManager.disabledMicrophoneByUserId(user.userId); + } + + if(videoActive){ + this.MediaManager.enabledVideoByUserId(user.userId); + }else{ + this.MediaManager.disabledVideoByUserId(user.userId); + } this.stream(user.userId, stream); }); - this.PeerConnexionArray[user.userId].on('track', (track: MediaStreamTrack, stream: MediaStream) => { + this.PeerConnexionArray.get(user.userId).on('track', (track: MediaStreamTrack, stream: MediaStream) => { this.stream(user.userId, stream); }); - this.PeerConnexionArray[user.userId].on('close', () => { + this.PeerConnexionArray.get(user.userId).on('close', () => { this.closeConnexion(user.userId); }); - this.PeerConnexionArray[user.userId].on('error', (err: any) => { + this.PeerConnexionArray.get(user.userId).on('error', (err: any) => { console.error(`error => ${user.userId} => ${err.code}`, err); }); - this.PeerConnexionArray[user.userId].on('connect', () => { + this.PeerConnexionArray.get(user.userId).on('connect', () => { console.info(`connect => ${user.userId}`); }); @@ -139,13 +170,12 @@ export class SimplePeer { private closeConnexion(userId : string) { try { this.MediaManager.removeActiveVideo(userId); - if (!this.PeerConnexionArray[(userId as any)]) { + if (!this.PeerConnexionArray.get(userId)) { return; } // @ts-ignore - this.PeerConnexionArray[(userId as any)].destroy(); - this.PeerConnexionArray[(userId as any)] = null; - delete this.PeerConnexionArray[(userId as any)]; + this.PeerConnexionArray.get(userId).destroy(); + this.PeerConnexionArray.delete(userId) } catch (err) { console.error("closeConnexion", err) } @@ -175,7 +205,7 @@ export class SimplePeer { if(data.signal.type === "offer"){ this.createPeerConnexion(data); } - this.PeerConnexionArray[data.userId].signal(data.signal); + this.PeerConnexionArray.get(data.userId).signal(data.signal); } catch (e) { console.error(`receiveWebrtcSignal => ${data.userId}`, e); } @@ -197,8 +227,11 @@ export class SimplePeer { private addMedia (userId : any = null) { try { let transceiver : any = null; + if(!this.MediaManager.localStream){ + return; + } this.MediaManager.localStream.getTracks().forEach( - transceiver = (track: MediaStreamTrack) => this.PeerConnexionArray[userId].addTrack(track, this.MediaManager.localStream) + transceiver = (track: MediaStreamTrack) => this.PeerConnexionArray.get(userId).addTrack(track, this.MediaManager.localStream) ) }catch (e) { console.error(`addMedia => addMedia => ${userId}`, e); @@ -206,7 +239,7 @@ export class SimplePeer { } updatedLocalStream(){ - this.Users.forEach((user) => { + this.Users.forEach((user: UserSimplePear) => { this.addMedia(user.userId); }) } -- 2.25.1