From 09536a5cf913dab0a5544442bd4577df8e490cd4 Mon Sep 17 00:00:00 2001 From: Corina Date: Fri, 19 Apr 2019 19:35:33 -0700 Subject: [PATCH] Add Reconnect UI to ConnectivityStatus when connection has been interrupted (#1895) * Move HowToQuestions.md to root .github * Minor copy update to English strings * Add Reconnecting component to ConectivityStatus * Add tests and screencaptures * Rewrite ConnectivityStatus * Refactor * More refactoring * Refactor 3 * Add transparency to offlineUI tests * More ConnectivityStatus refactor * Fix 1831: ability to change Spinner and Typing indicator via defaultStyles * Fix offlineUI tests with static spinner * Fix test with static spinner --- .../.github => .github}/HowToQuestions.md | 0 ...-when-connection-is-interrupted-1-snap.png | Bin 0 -> 10156 bytes ...n-connecting-for-the-first-time-1-snap.png | Bin 8075 -> 8069 bytes ...ect-ui-when-connection-is-slow-1-snap.png} | Bin ...ct-ui-when-reconnection-is-slow-1-snap.png | Bin 0 -> 9020 bytes __tests__/offlineUI.js | 122 ++++++++++++- __tests__/setup/assets/staticSpinner.js | 3 + __tests__/setup/setupTestFramework.js | 5 +- package-lock.json | 84 +++++---- .../src/Attachment/Assets/SpinnerAnimation.js | 19 +- .../src/Attachment/Assets/TypingAnimation.js | 17 +- packages/component/src/Localization/en-US.js | 2 +- .../src/SendBox/ConnectivityStatus.js | 168 ++++++++---------- .../src/Styles/StyleSet/SpinnerAnimation.js | 19 ++ .../src/Styles/StyleSet/TypingAnimation.js | 15 ++ .../component/src/Styles/createStyleSet.js | 4 + .../src/Styles/defaultStyleSetOptions.js | 9 + packages/core/src/actions/connect.js | 4 +- .../core/src/reducers/connectivityStatus.js | 59 ++---- packages/core/src/sagas/connectSaga.js | 7 +- .../src/sagas/detectSlowConnectionSaga.js | 10 +- 21 files changed, 338 insertions(+), 209 deletions(-) rename {__tests__/.github => .github}/HowToQuestions.md (100%) create mode 100644 __tests__/__image_snapshots__/chrome-docker/offline-ui-js-offline-ui-should-display-network-interruption-occurred-reconnecting-status-when-connection-is-interrupted-1-snap.png rename __tests__/__image_snapshots__/chrome-docker/{offline-ui-js-offline-ui-should-show-slow-to-connect-ui-when-connection-is-slow-1-snap.png => offline-ui-js-offline-ui-should-show-taking-longer-than-usual-to-connect-ui-when-connection-is-slow-1-snap.png} (100%) create mode 100644 __tests__/__image_snapshots__/chrome-docker/offline-ui-js-offline-ui-should-show-taking-longer-than-usual-to-connect-ui-when-reconnection-is-slow-1-snap.png create mode 100644 __tests__/setup/assets/staticSpinner.js create mode 100644 packages/component/src/Styles/StyleSet/SpinnerAnimation.js create mode 100644 packages/component/src/Styles/StyleSet/TypingAnimation.js diff --git a/__tests__/.github/HowToQuestions.md b/.github/HowToQuestions.md similarity index 100% rename from __tests__/.github/HowToQuestions.md rename to .github/HowToQuestions.md diff --git a/__tests__/__image_snapshots__/chrome-docker/offline-ui-js-offline-ui-should-display-network-interruption-occurred-reconnecting-status-when-connection-is-interrupted-1-snap.png b/__tests__/__image_snapshots__/chrome-docker/offline-ui-js-offline-ui-should-display-network-interruption-occurred-reconnecting-status-when-connection-is-interrupted-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..3ddfe723b3ff908f8974eb684d0a18d3e132579b GIT binary patch literal 10156 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 literal 0 HcmV?d00001 diff --git a/__tests__/__image_snapshots__/chrome-docker/offline-ui-js-offline-ui-should-display-the-connecting-connectivity-status-when-connecting-for-the-first-time-1-snap.png b/__tests__/__image_snapshots__/chrome-docker/offline-ui-js-offline-ui-should-display-the-connecting-connectivity-status-when-connecting-for-the-first-time-1-snap.png index 7bb5bf430f04b01c3e37b73b28ab0643079f928d..2299115761ef34913b98fae0218b0e5f6cd82520 100644 GIT binary patch literal 8069 zcmeHM`9D-|`=3^!cnT?^Per!kQ`W30OC!6nZ%Ntr-7ut*B2CE>+4r$cvP^a@Op(Yo zWiPu))-jfb=Q{tu^ZoVvLtcLHI_@*)zOUuMfi;bB3cP>0ah)C^ImT}~*} z?mGwe!%UE2qI|w%h4I+MaUkxYTl9>uLo$!1Z+lMm zl;~u7b#+YLeBMCC;4EIIVl7pPvF#*54p69aPjeZRDm|y#(RSd>_2)*XqmL$VKD_(T z`*_X4&kO8qzNZ&1Z`uSaZ@Ww>e4bX2ED*}r2yL?UTW5qdp-@wD602+|lBTsDGpXF8N!Rzr*ksB!8LVFCG4siND(T z*AV=_G)i2(qk7-IeJiZ5SL9O;HLIzq;gNAO3uoVj+H)ntp)0J(Ruj)}tgaquVQDFd zPD@L3admy(In6pm!8LVGQwK+OH=}+oZZWn;w!M6PD@MY$+!GQKL}X=6&uBi0@0>Qe zeLF8DB}K|-;#y>6$xM_Ife$*Rbn)9RgKfIi}GF5q`oSxpj zTbnK_EPO4=I^a7q{tz3RiJ6(1?Sto|3zVsjm&W?~nF9kB>S}6E-MMIs*S8*BxpHN5 zb%=4hGhIpR+BJP`?Z+}6Lxpp5F2mkrK5i@t^@n|~=itBsy`4&%TVEQFe*75Y<+bR1 zQp{hyfn*c5aeMw-`BlhKCa~NGc4*LO7*9cqKkDF~7Q6 z#^29xb%UGZP6Rw zWILSh!^6Y1lZlp`M~~*${jR-!J@MSvGV3~wkx>r8s6bRmNRx|;3%fa6Fu4@8I+ltgkN0TYaJZDFYmC9nBs->mEw?961k_czeZPqN zvqZ+uS5Y|m_)1@T)S{)Or6Z275?YgT5An)4wI`nExp?cL!{--S&};^c7~b&Df+R`- zi+j5G@!1)9>}sLBfarq%XZq;BTRC#i85*-KsYGkZgGPdbWls)WQH9J*y z>ZiV>iIE0Nk)l06t20-gQNYtwRHOwp!OmnwRfcZ(%n#K(m&T&vHvcojZ5wJpY*>Sl zOZl?t_$RC>U}1#s;ZV&YwgLLCIBy>?Kal6#lP@AAg<*@j3T+ZSfBukLXIopG0L+xI zfPmVeLx^NSbs5Ptn~gGWkwHCHISt8nb> z9}XPFwNkuZFVW`*3t+vNsHoQ4w{KG}*tcG4lthV}G$>z_3tjh$ynp}WtRktER8>XD z%bQFk$2@w(e18SQ!^0zW>*Ler`BPUP>^*(XKl07Xp4o$+x0}Ml=|y-7weO{8BjN7d z-Dv9q77aDEk5rndqN3uf^xr-;UtIb_UN1G+c;azSo;*<=UqKx^hUJ@~5}Rz|q=FX5 zDz=YDz0YFiIJ?)Oc>1)Up!)gq=LhNniLH;1bG&J4Xt3Ua>8|pdHB{HoSbOnRR$5x* z^y#0eS_~aX69){4ZtN{FvFhwgoX{@ zWo3nJ_;3Lp=^O1!diwM!zhr9#)T`{0@6^mEp^V;wjIbgA2cNv(H8ImNjJF8Qb# zQsNBk?Cgk*&rq+3def@FS92j$RLKHvt8qkIZNx@5Z z#WQS$S7~G7xkUrE>Ier1EyniG6+?>r$~a!7Oz?VQYTq#efsi8Oo{}hGTlV6`F`YDd zV^09~jjjGtOD;Y>J~>k8aIJssj|aS*yu8IOw*qE}lPS6D)aQ(2bMqreL zxVUVE-*2v7jbdx)s@pfVn@SgBwzRY~HZvw5a*Jc!+}y&Il~4zd?MNnJ_cULA z-&DB!f4xWG!dP45vgo@|UPr8umE|9H{jcSS`zp+AR91!d^%HH0pbhGpnqmqHmgeT> zjB-!ZznL`W{kUJ>E+{R1;P9!js+~%4jZaN2k#_Ab%+1YhT4P7;FH!EuWMyIDJbX9{ zn92xtewra%k%Ic1j@uq5OAA))7I+>USKLH#8A8>KOd*|61O^mT|-^r_~Uq2^HN;`Mw zHqR&7hM9w&5nfkR?4h@i$r(wwU0zEcKY#9>>nol_fBYZnpT1IA$)Wj%7WxpUeGSp$lULCRI{?Vr_D*?i{X<0IuaqmS-BxwEcm z9XRZ-)W}t0U1!3?&fnWW9}z=i*MCI$gLckUbSfJK2iE|~vw#u!w~Rob$^0SOfg`~M z05=5aU0wPe$&#Ao<>eM655y30ad70c#BhsUx?~P4(+}g3V_g?OXl%3r`Akv9Vez+f zh>e?C0Py^x;^MyV-w7W+sCA?(Spo?-Ry7a^=#7mHQ3;783Ke8MzN~T6Mdzi=`F~p@ z_Asq(Qi;^XAMa}?;;zR(f1Y#RvRe4mDODJdt3>59W0<@5?nz@;op4Jn+_luQI=?<+ z(^+siqGDo3&dvlG&yf;Pe_;_3k^fK&3k$=Jhg{x=U7q-4Q5R4Oy0e>l&E4I7peej* zsxw1^;ChGwO!0ALmW;# za7xC`pJ^6$b_()%ifyld+8fy6Qu!-zG*BmY27HgDh`^Vt?06 zgW2*2{VC4NQ-_Z>h4~ocweo~c__fCJ78nm z(vNDl@7V}QL`2X~iRB5irIdSiQ=v!H( z0vTiv*98`rmg;2S){={giYkMaZsz6Xi6|@EupT|9@8?$un9!B?fIko;Yh`uf4Y9o3 z0BmLL&uB3L^g`24BglRZAWl?VTo<-!@y06)J_uuA;H^uPl#?^_o%(E`rKR;xYXMf} z=lJ-fpFFtH-hqLlPtS$Kpxvsfs%@V?W9TZ6`n$Wc*;W4h>vhV|&8-C4TuI3}E>6yC zbMg|6;QKg)bTOdVLms4~=gcw@{)c-Vhs4n<)18#px7*`WQi|TZk+b%0;R4a=g|?hU zBfbPg4ahJT;E|V~@ACHUKFA6O>dQt#HJWE{-MaO0)-Qck?f%%D5Ug_hNHw#V5tO)dx5Iyn}K80y-rrv|{a5CsQSk8#scjMxY0Bu#1FE+oj zdyoB-3fu;k0a&~k(5WGwB(|7f6?cLyO5^ddtb0uC={~>2i1n|@o?}paqy#w{v4)zO zQ2=8-xsNIF@d9Z1pv6q_x?is=!qNa`j$FgTrSuguw-R)sZp|dx;LWpV+r=-vGE#bA~n)9^h|mY@7#TTa|w}XTMi03Fx+f_iNmAI_{WOKlgwcDFihzWuPJ;4L> zV1AGsgs|j3)}wnJ=$%S*s~h#8o*W}W=!o$>aahLjU5-ADJIs__+%vhk0-#exKsN6m z95MtBpy z$C_aeK|#T^fDj00Y<%*$wv0Jbo(nhC#%f-sq;PU@oFTZL^?gnGMZ<>taz$tY14-K0 z#3UcMT36EHv)tskyu3Wd#-^;h+b|(9v2A+A`P(bI2--|VvUE7*4r^tvbW9jzC;y3$ z&zjGz)ipwv;wOoTiE*7cQBqhaEGQ(@KD`3Tn!cW5ZEH(}43Qcz1Vd}6uC9)S8^M4b zSs#F`5dY#u;T|To)u2%NfG^#g6GEMQ*q_!b~%U0hu3@mNsSnXPLFmf?aB$6n6_vIxTpH}nW5 zS)C?OOP(y)%=aaA9*|3J2%#5MR2Ts_DB4*$WYZ1)AR#%K02Xa7R(3=mqWg{W zSg1Q72wzq+#RE|d;S(Doz253OCl60iaapaFX9F#9KRbWP#Kf&W3dNPNNrOz;J5L%d zgA6nq$!*g$RO5??F}hnQBlI)`ulV?QNe^~*c2j-*r-)-2Ke=NT#m3j2uk$iKJ-rNG zWI#xtU2c~^7K{XqAL@81t7k(rg>b8sD89LTe3wv#D@8mnH+S#Z!=p+a9y{9%&>`^l z{Z$kjF+91)b6So43L;6FaV;97cWW${vK+! z2NzZ8(80sl=nOXr3VMS)2~v?W>}sj~aEzZ98zP)dCd;`lXC}H@tb_ zki+*!gY#6{oXLUBE1il5y?d3fmr>?QY^WY3(;#kcrI4nq2Hk=v>bcO&qRadpW5|SW?m` zhFgN|1RB6V8K`ota_r{+xy18=)JSi3)$w8sSF=%Z~Y+y2j9)j)m+iY5(eZGmq5`WvbGwz-TzTWKfX{G3i zY(1SX7AA*)b{N4IhdMaJ}EKJ{=e%IW&^!Q%7jv%kL zrglXXZpXw5PsF*{fWu)FRq=48A)$%Il&4+sZK1V8@+upoI(rn#Cs{Cr2ZhSfefeAc z2`)aA?jJ6wlaUv;-89=SjEefJ9d%{@tsSV0ororKFRZ4+P~c_4V~B zFRCbW^eU@eyLLt1zu(dL@Q{UtMb>#{^`Zmw;LR<~nrE8p98ypXK1JE9eoreKn`dtB?yQjq@-57j+0At(b765gt8R@6kqKTb)J&FRXs!UySy zhi?>%@JIa1cPQJ|v&Q1;)vJ~3^HtQq1qa4pjcrd)&okAa*WTXVSUjGblS;A?i_xr_r1D$r_|$Hy5^l7u6-r0EuTJh*>ACF4}Pj| zdzI0|vnxjATsqR`jEvE061k}8(sAQtW#&RlOUwQP2YO^%Z$5U0-If zm%2g zG8A5SP}U}sW*=@BSK>~S3;Xew$EMifu2{(2DJa8qO2A;O1ZOdI3u|l~ZAr#S#WZD1 zriSBvCO*gZGkWO(Lq)sxN&5D;bv?AVw$7`rR#jVS*RrV%t?-{8_$aJ~Lf7nE%C{(3 znkk^<7Z)!ihc_};+}mEL-D*w|pwJ4Mo0}EXomS@Q&rV;Dyr`u$enT1BR1_B%SI@Dw zwvNjLOx^wGpWND7JjQvfDN5)l+PjLb61p?deM4U3P+fSPZnQ{VZte+g9v*in_2gPBsvOH&Jv`i=rgdQN-oJ7dH-v`( zMH3Sfi(>MUl9GE`yYeU$+DpwlTxC3b!u#*N>J}Q2GtN;sxxTfzOtuh*ou3^FMJ6In z#pFQLy?c*nvlfAYfmhV%8pb3l z@8A~+#Cy%}-MhDw&=^RDaw&x@d#J6A#Uq&M85k(kir{x0Z+YSdl%ubI4+b?yKz;QB zkju=}RC^V(Rwky&XVB44NP|=jV{|ZSL2&}T*NcWpc$+R!yo zU&{n^WW0Z`%^4A_d(>Ugy0JPMh2!jFuW5t!&qD^3Ev|1^!CC+nOB1YtfsizckYDvDGg`k!sgc2)}XVd1_qJy)r-b_ zVydeMBR?o?qeytTx|&_RnpV3uaY**^s|&@&#bIkpsCLhdHrxy!io>^+&ilXJBVbJ} zEP6f+@}TOaZluA=4|{q3x8?ucOxzA$-+ti00h>BfO@4mHR*FW}vgmS+cpe_v>D=UBSr6NNt}6YN{+)>5klq6QsOUfUmDrCkInZ|PpCg6YCaGlL%k9Lv zrB1`jjh~-@wnV=k6c-QIT!#O56okdSx3B}aC1YbFluuLz`}FD4md~HD*RG8TsQ9OH zvw@J!92^|%RqbNR>BI{9d_Cj)_bbrD%SUyi%3apCe-9r@I^{U#tD+Rf_C=l_J9ezE z+$-bf;^LF!WRWE6tv$u_@fWrzfg|^i?-vm%%rZ>$@88^5Y%73St>Z8}siAA$mr~X3 zVA!N(Wi1R1A3)s@Z3OZ%#Y{c}QG8LmI-XFsaCg0+py@nE3fo5sjkz(d?w5`8qnt zbA;GFG&asqX?XKXmmWf$N?bbrI(GcH;S8=bcrqoRBxHpMvL+=hZD5{b%qaC(>ant) z{&IE*Yhm$3MMdRtQc|w<8z(6xC06phr-uiYM5=|>jj@6Op;_*f8cXwRqg_!8u%%h} zr42Vk_uiPZ~@Vqv=V)7wF8#+qZ?IjFWTOT^(VT!?E4)>awnT4J9uj5^Me}5kpj^9J0@$|;p*xLGiumA1K^Rp(H zNnv&fvnB`nCyTGXtQRfPQMbvGFS4)08z%f63j_m_;i+`?>}>XPA_fKlXgb^ZMUd{w zfKQBE-NsMz=&I|V4l?@7DE+5Ry}XKbW5kM(mh@2#mjyG-U z1tIeldi)Wi$#_Ro(?_MALu61V*TyIz;geVD(J@{s=VSOlimcDled8S*9jQ)VglpI{ z1qNtzM_c%&&)tZK*{9AgI%X+#x^t%y^CpDPmrgY|vTl-5* zaIRh8ij+tjfneTTw>CM_Qc@iWvbH5&qq;CGQZR&KF*#Pn^Hx@SqeahK9yxM^&M%pe zkYEs}DrRz}|IraG#jEeOgYtrQxprov``$RmK(|=moKy2&zs5W`D2oBtIx;${6uub> zJYJBSJN0-}S5HqyR`ybrKZDo99i$e#BDr!#8r`|htfL^+WiL%fK6qdbB6RTY%P(76 z44xz=rqX7A=jZR8`}XDupyuAf^kB^DYT&sP;~-TrYDtO9$ou<|_wIo`e{}lv>28)u zIs$?Q0gc~r_x2w;RDh0`l#-D#{LiPfJ@9mO?SPXX5Eqw+TCFWk&bFRsVogokt(l3L zL5mZv)16shm@RO)WMpT@Bqe763h@$v8xuUm3dj)a;E;|nH%HEefD~`_Uwr{hV61~$ z_Wc1W^CUJl?U-SL%ZJDVm7~$;A3u8Z^4+_OYV4^Dn+or&!4RezxZ}C%CI;{=Fc+Ky zP$=`t$P|YwJmuKvYrEsm)7SLNQhloE5LFQAt>rA+R^Z6>R^DiDWf9>s9!dOSs)2pQ zlv?%-vF_H&+&3h7JpA+2MFxWb5~4DF*d2q3lb8l-sT_%vXioA}>2zH!UrV9)0%rLuZVJhlg+Vt8t=kc1_z%oH%i!eXu5^ zZQ2DHBf$-u}6>*SQJDi)KTkA$>E)^f%rk`*(^$U(e2w@ zgrQoy=Vu5QEcUTeYjR#;;os*{S``L|1_%GkLZYIg&oshGSNyjIeA>7h-QC<&ro-a) zE2|&QYfAm&#u-6&>J3J~En@=%44?%Nt#qw<4-i7CZ?>L~&!UuP#NE46ii%iGO-(kP zNebxnNp(H<7E;W{>Ox;lNEs9Z8Y?4fQ=*TVlt)E0cwz2U5d*kau(Rz10>L@tV_3So zIQV1l7Nr5QU+JxFJZ|#?6-XLH(lR*AnXE*7TtCASgXt7vdb+!JrD;Vh71(nO8vfsbxnvn-79(Rq8aF$f(PIz)zCASL94;lM=z`C~DdbeKIr3Z!s} zS7KpuZzh;C0k;xVoI99xTeZ<5=k_LjAkh--N#7X$AVe?(h+2$|T|)rI*(BP(nVp$Y zbZLL75FNtmu>v~KM_vT(=d$m&lS|yYZyyWPBp@V|*5^aB-VZoZ@fy)CYXVhD@$cKX5XHc@YhR04yypPXi6jhSVBxo_l_MfLQh~zi9ruckklKur{Ra!Uf3c*KD7?%IVo)M`AFyW%y1BO1=<;b8ErEaFZ+ ze*BnUP|(F@%^naE$~!+_t_2~nYqxy$%X2;xE+EHonUDaqp?;u3&NUjUsyNuGw6t_* zO!$T)at(q2KRCD&h8xPAi)3V25Ip+utYW}C4lXOk$H)C_E2q8yU|QzsRR}95X@{;T zR&C?qZ=PI~I(N<*!gLJ?MQX}Ey8JfLg9o!qN=oW)6)~SHd!<8$PlGD~8~|BZ$?Y)^ z{o%YtnV)d5EHHdEKi=(jBM>YgR5^W4O3O3PdEqw)qzG-E$<&YpfkZAlfKCYm!H6jY z*@PJMMgpCem)G*;OHXf+Ej4J-352DBPNe(y6A&fB;Rb|28Q}hj&{u*6;lhCRCRR>M zifWK>1(rpf<|b-c8XLm`>~C$PY{>p#9>dMS1R;sdZ?>1a7QM8rz*SoS7~!e4A~6d4+v zX%m>rco2jB`k)d^MJ1(aFzFUV;ygMn6auA^-wf6+oWlxJCxai-*jx|*E$5cYtzTOV zt^wC_;cznqQ5nm^_T+Ouz6`L4V>Jy~PBgNeO_e|4yT5^f!FLQ(oZatEacY-KG*nNO z|Dj<3W_5!Ue&tf<0{Kz?M4k>KmgJAaN!A6*Ds%w`dABamuMa5*OAKp_`J@j&n#%4LF zir+e;Z0mdYm2u2LxD^6N?*>#C3r*30h z9?sC7uJeFPud|_{0db!UxU&PpYM*MC$dBTnDO|GXkmb3KXG-q-VWuF9!983-dHH3y zFhp*&lmMxnoq8eWf9fgT{>(sG^oGrowkl?JMQ;2ma6R cq_+f0QY?h(cT8Hsm+UCCj%s$RU3tR`(f*C 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 literal 0 HcmV?d00001 diff --git a/__tests__/offlineUI.js b/__tests__/offlineUI.js index a344021295..1b00a64cb6 100644 --- a/__tests__/offlineUI.js +++ b/__tests__/offlineUI.js @@ -1,6 +1,7 @@ import { By, Condition, Key } from 'selenium-webdriver'; import { imageSnapshotOptions, timeouts } from './constants.json'; +import staticSpinner from './setup/assets/staticSpinner'; import uiConnected from './setup/conditions/uiConnected'; // selenium-webdriver API doc: @@ -18,9 +19,17 @@ const allOutgoingMessagesFailed = new Condition('All outgoing messages to fail s }); describe('offline UI', async () => { - test('should show "slow to connect" UI when connection is slow', async () => { + test('should show "taking longer than usual to connect" UI when connection is slow', async () => { + + const WEB_CHAT_PROPS = { styleOptions: { spinnerAnimationBackgroundImage: staticSpinner } }; + const { driver } = await setupWebDriver({ + props: { WEB_CHAT_PROPS }, createDirectLine: options => { + // This part of code is running in the JavaScript VM in Chromium. + // This variable must be declared within scope + const ONLINE = 2; + const workingDirectLine = window.WebChat.createDirectLine(options); return { @@ -32,7 +41,7 @@ describe('offline UI', async () => { complete: () => observer.complete(), error: err => observer.error(err), next: connectionStatus => { - connectionStatus !== 2 && observer.next(connectionStatus); + connectionStatus !== ONLINE && observer.next(connectionStatus); } }); @@ -177,8 +186,15 @@ describe('offline UI', async () => { }); test('should display the "Connecting..." connectivity status when connecting for the first time', async() => { + const WEB_CHAT_PROPS = { spinnerAnimationBackgroundImage: staticSpinner }; + const { driver } = await setupWebDriver({ + props: WEB_CHAT_PROPS, createDirectline: options => { + // This part of code is running in the JavaScript VM in Chromium. + // This Direct Line Connection Status variable must be declared within scope + const UNINITIALIZED = 0; + const workingDirectLine = window.WebChat.createDirectLine(options); return { @@ -186,15 +202,63 @@ describe('offline UI', async () => { postActivity: workingDirectLine.postActivity.bind(workingDirectLine), connectionStatus$: new Observable(observer => { - const subscription = workingDirectLine.connectionStatus$.subscribe( { + const subscription = workingDirectLine.connectionStatus$.subscribe({ + complete: () => observer.complete(), + error: err => observer.error(err), + next: connectionStatus => { + connectionStatus === UNINITIALIZED && observer.next(connectionStatus); + } + }); + + return () => subscription.unsubscribe(); + }) + }; + }, + pingBotOnLoad: false, + setup: () => new Promise(resolve => { + const scriptElement = document.createElement('script'); + + scriptElement.onload = resolve; + scriptElement.setAttribute('src', 'https://unpkg.com/core-js@2.6.3/client/core.min.js'); + + document.head.appendChild(scriptElement); + + }) + }); + + const base64PNG = await driver.takeScreenshot(); + expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); + }); + + test('should display "Network interruption occurred. Reconnecting…" status when connection is interrupted', async () => { + const WEB_CHAT_PROPS = { styleOptions: { spinnerAnimationBackgroundImage: staticSpinner } }; + + const { driver } = await setupWebDriver({ + props: { WEB_CHAT_PROPS }, + createDirectLine: options => { + // This part of code is running in the JavaScript VM in Chromium. + // These Direct Line Connection Status variables must be declared within scope + const CONNECTING = 1; + + const ONLINE = 2; + + const reconnectingDirectLine = window.WebChat.createDirectLine(options); + + return { + activity$: reconnectingDirectLine.activity$, + postActivity: reconnectingDirectLine.postActivity.bind(reconnectingDirectLine), + + connectionStatus$: new Observable(observer => { + const subscription = reconnectingDirectLine.connectionStatus$.subscribe({ complete: () => observer.complete(), error: err => observer.error(err), next: connectionStatus => { - connectionStatus == 1 && observer.next(connectionStatus); + observer.next(connectionStatus); + connectionStatus === ONLINE && observer.next(CONNECTING); } }); - return subscription.unsubscribe(); + return () => subscription.unsubscribe(); }) }; }, @@ -206,12 +270,58 @@ describe('offline UI', async () => { scriptElement.setAttribute('src', 'https://unpkg.com/core-js@2.6.3/client/core.min.js'); document.head.appendChild(scriptElement); + }) + }); + + await driver.sleep(600); + const base64PNG = await driver.takeScreenshot(); + expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); + }); + + test('should show "Taking longer than usual to connect" UI when reconnection is slow', async () => { + const { driver } = await setupWebDriver({ + createDirectLine: options => { + // This part of code is running in the JavaScript VM in Chromium. + // These Direct Line Connection Status variables must be declared within scope + const CONNECTING = 1; + + const ONLINE = 2; + + const reconnectingDirectLine = window.WebChat.createDirectLine(options); + + return { + activity$: reconnectingDirectLine.activity$, + postActivity: reconnectingDirectLine.postActivity.bind(reconnectingDirectLine), + + connectionStatus$: new Observable(observer => { + const subscription = reconnectingDirectLine.connectionStatus$.subscribe({ + complete: () => observer.complete(), + error: err => observer.error(err), + next: connectionStatus => { + observer.next(connectionStatus); + connectionStatus === ONLINE && observer.next(CONNECTING); + } + }); + return () => subscription.unsubscribe(); + }) + }; + }, + pingBotOnLoad: false, + setup: () => new Promise(resolve => { + const scriptElement = document.createElement('script'); + + scriptElement.onload = resolve; + scriptElement.setAttribute('src', 'https://unpkg.com/core-js@2.6.3/client/core.min.js'); + + document.head.appendChild(scriptElement); }) }); + await driver.sleep(17000); + const base64PNG = await driver.takeScreenshot(); - // Snapshots are intentionally not compared because the spinner will cause the snapshot to fail regularly + expect(base64PNG).toMatchImageSnapshot(imageSnapshotOptions); }); }); diff --git a/__tests__/setup/assets/staticSpinner.js b/__tests__/setup/assets/staticSpinner.js new file mode 100644 index 0000000000..a30654ba22 --- /dev/null +++ b/__tests__/setup/assets/staticSpinner.js @@ -0,0 +1,3 @@ + +export default () => +'url(\'data:image/png;base64,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\')'; diff --git a/__tests__/setup/setupTestFramework.js b/__tests__/setup/setupTestFramework.js index dd9605769a..50db2cde4e 100644 --- a/__tests__/setup/setupTestFramework.js +++ b/__tests__/setup/setupTestFramework.js @@ -66,7 +66,10 @@ global.setupWebDriver = async options => { (coverage, options, callback) => { window.__coverage__ = coverage; - main(options).then(() => callback(), callback); + main(options).then(() => callback(), err => { + console.error(err); + callback(err); + }); }, global.__coverage__, marshal({ diff --git a/package-lock.json b/package-lock.json index fa2f5c3fce..7dd4b0b29e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1767,9 +1767,9 @@ } }, "@octokit/rest": { - "version": "16.24.3", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.24.3.tgz", - "integrity": "sha512-fBr2ziN4WT9G9sYTfnNVI/0wCb68ZI5isNU48lfWXQDyAy4ftlrh0SkIbhL7aigXUjcY0cX5J46ypyRPH0/U0g==", + "version": "16.24.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.24.2.tgz", + "integrity": "sha512-s0q08+1UgX2Kc5SOciE03nPUrWjMQoiYh0YaU1IxGhjPZ0kjmzD1NUPmm7Zo1pQKuo1CBxG2alyFYvtqFwE1NA==", "dev": true, "requires": { "@octokit/request": "3.0.0", @@ -2056,12 +2056,12 @@ "dev": true }, "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.11" } }, "async-each": { @@ -5652,9 +5652,9 @@ "dev": true }, "istanbul-lib-hook": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz", - "integrity": "sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.6.tgz", + "integrity": "sha512-829DKONApZ7UCiPXcOYWSgkFXa4+vNYoNOt3F+4uDJLKL1OotAoVwvThoEj1i8jmOj7odbYcR3rnaHu+QroaXg==", "dev": true, "requires": { "append-transform": "^1.0.0" @@ -5676,16 +5676,44 @@ } }, "istanbul-lib-report": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz", - "integrity": "sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.7.tgz", + "integrity": "sha512-wLH6beJBFbRBLiTlMOBxmb85cnVM1Vyl36N48e4e/aTKSM3WbOx7zbVIH1SQ537fhhsPbX0/C5JB4qsmyRXXyA==", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", + "istanbul-lib-coverage": "^2.0.4", + "make-dir": "^2.1.0", "supports-color": "^6.0.0" }, "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -5734,32 +5762,12 @@ } }, "istanbul-reports": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.1.1.tgz", - "integrity": "sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.3.tgz", + "integrity": "sha512-T6EbPuc8Cb620LWAYyZ4D8SSn06dY9i1+IgUX2lTH8gbwflMc9Obd33zHTyNX653ybjpamAHS9toKS3E6cGhTw==", "dev": true, "requires": { "handlebars": "^4.1.0" - }, - "dependencies": { - "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "jest": { diff --git a/packages/component/src/Attachment/Assets/SpinnerAnimation.js b/packages/component/src/Attachment/Assets/SpinnerAnimation.js index 81f63d9f19..982587901d 100644 --- a/packages/component/src/Attachment/Assets/SpinnerAnimation.js +++ b/packages/component/src/Attachment/Assets/SpinnerAnimation.js @@ -1,14 +1,11 @@ -import { css } from 'glamor'; import React from 'react'; -const ROOT_CSS = css( { - backgroundImage: 'url(\'data:image/gif;base64,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RkZm+fIwYJqbPewc7RRoaQpHW5tketu+1ODasm4d73W+HJRl276NO7fu3bx7+/4NPLjw4cSLGz+OPLny5cybO38OPbr06dSrW7+OPbv27dy7e/8OPrz48eTLmz+PPr369ezbu38PP778+fTr27+PP7/+/fz7+///DyAKMQWIUWwE7vHXgS6spuCCiDQoIGoQroOBOaUFeIsNovlXl2QC9eeaAp/p95WIGd33oFIj2ifhYCvSh4mHnNV3IWTy1agMjRvaCN+Hi73XD4/uPfRje0TmON+RSMan5Iw3UrQkk1Bm1uOUTj6545VYHtTYi1JeiNiGOoIZJpdjtpiXmCya6SKaKLqZJpxvplgUQ/vRmUaJHMaVZ4L8hRhBh3vaBFOGELa5TAnsmHVoIxUy2mikkk5KaaWWXopppppuymmnnn4Kaqiijkpqqaaeimqqqq7KaquuvgprrLLOSmuttt6Ka6667sprr77+Cmywwg5LbLHGHotsssr/YjrZScg1Cykphg5HmCaC4nYtIGn5BighemL7rbYMgsunH3KaFqO354KW7iXtskYmJ/Gyy6a88172IR4UoatmKPmO9q+//WrmJUkBE7yvwANHVnA7DR/2sCkH45uwHBH3dfFHEzNcsRsdU7yxwwuDXK/HITN2ssjvAjyyySuz/LK9dsJbssJ40jyzu+PKlrPO5b62s7rb6hauXNkC7afR1f5GaGEDEjctSo82t+iyVl+NddZab811114rUhuuidnatKtJn/qzqTervXap64Ja86f3yj03pylr+nGneW+aMbN3X3oi3X9b2jfgg1daOOGHI74443HrXbfdj3s6OeU9EpN6OdtDs7p5q0enamCtiTpVAAA7\')', - backgroundRepeat: 'no-repeat', - backgroundSize: 'contain', - height: 16, - paddingRight: 12, - width: 16 -} ); +import connectToWebChat from '../../connectToWebChat'; -export default () => -
+const ConnectSpinnerAnimation = connectToWebChat( + ({ styleSet }) => ({ styleSet }) +)(({ styleSet }) => +
+) + +export default () => diff --git a/packages/component/src/Attachment/Assets/TypingAnimation.js b/packages/component/src/Attachment/Assets/TypingAnimation.js index 66ecfa8f3e..0434574361 100644 --- a/packages/component/src/Attachment/Assets/TypingAnimation.js +++ b/packages/component/src/Attachment/Assets/TypingAnimation.js @@ -1,12 +1,11 @@ -import { css } from 'glamor'; import React from 'react'; -const ROOT_CSS = css({ - backgroundImage: 'url(\'data:image/gif;base64,R0lGODlhQAAYAPYBAOzv8evu8Ort7+fq7Ons7ujr7eXo6uTn6ebp6+Xn6ebo6uzu8OPm6OTm6OPm5+Tn6N/i4+Ll59/i5N7h4+Hk5uDj5evu7+Hk5d/h49PV18PFx7/BwsfJysXHyMLExdja3Nfa28vNz72/wL7Awc/S08TGyMDCw9TW2NbY2t3g4trd39bZ2szO0M7Q0dnb3djb3Nvd39ve4Nnc3dze4Nrc3t7g4tzf4dXX2d3f4d7h4tnc3tve383P0MrMzs7Q0sjKzNLU1s/R08jKy9DT1NfZ293g4efp68bIyby+v9bZ27q8vdHT1c7R0uvt78nLzM/R0tjb3ens7bO0tbS2t7GztK+xsrW3uK6vsLe4utfa3L/Awtzf4MnLzamqq5WWl66wsbm7vNrd3uXo6a2ur6yurp2en6KjpKusrZ+goKeoqers7urt7peXmIGBgYSEhHx8fJmamqipqnZ2doqLi8XHyY2NjpGSkpOUlJiYmZOTlI+QkJqbm4eIiJucnIuMjP///yH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKE1hY2ludG9zaCkiIHhtcE1NOklu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\')', - backgroundRepeat: 'no-repeat', - height: 20, - width: 64 -}); +import connectToWebChat from '../../connectToWebChat'; -export default () => -
+const ConnectTypingAnimation = connectToWebChat( + ({ styleSet }) => ({ styleSet }) +)(({ styleSet }) => +
+) + +export default () => diff --git a/packages/component/src/Localization/en-US.js b/packages/component/src/Localization/en-US.js index fabff4a213..3e329d4ee1 100644 --- a/packages/component/src/Localization/en-US.js +++ b/packages/component/src/Localization/en-US.js @@ -49,7 +49,7 @@ function xMinutesAgo(dateStr) { export default { FAILED_CONNECTION_NOTIFICATION: 'Unable to connect.', - INITIAL_CONNECTION_NOTIFICATION: 'Connecting...', + INITIAL_CONNECTION_NOTIFICATION: 'Connecting…', INTERRUPTED_CONNECTION_NOTIFICATION: 'Network interruption occurred. Reconnecting…', // Do not localize {Retry}; it is a placeholder for "Retry". English translation should be, "Send failed. Retry." SEND_FAILED_KEY: 'Send failed. {Retry}.', diff --git a/packages/component/src/SendBox/ConnectivityStatus.js b/packages/component/src/SendBox/ConnectivityStatus.js index 58e67e8b39..e7370bf56c 100644 --- a/packages/component/src/SendBox/ConnectivityStatus.js +++ b/packages/component/src/SendBox/ConnectivityStatus.js @@ -1,110 +1,100 @@ +import classNames from 'classnames'; import React from 'react'; -import connectToWebChat from '../connectToWebChat'; import { localize } from '../Localization/Localize'; +import connectToWebChat from '../connectToWebChat'; import ErrorNotificationIcon from '../Attachment/Assets/ErrorNotificationIcon'; import SpinnerAnimation from '../Attachment/Assets/SpinnerAnimation'; import WarningNotificationIcon from '../Attachment/Assets/WarningNotificationIcon'; -import classnames from 'classnames'; - -class connectConnectivityAlert extends React.Component { - connectivityStatusText() { - const { connectivityStatus: { status, timeoutCompleted }, language } = this.props; - const { connectingSlow } = this.state; - - if ( this.timerId ) { - clearTimeout( this.timerId ); - } - - if ( status === 'uninitialized' || ( status === 'connected' && timeoutCompleted === false && connectingSlow === false ) ) { - this.timerId = setTimeout( () => { - if ( status === 'connected' ) { - this.props.dispatch( { type: 'DIRECT_LINE/CONNECT_TIMEOUT_COMPLETE' } ); - } - this.timerId = null; - }, 400 ); - return ( - - - {localize( 'INITIAL_CONNECTION_NOTIFICATION', language )} - - ); - } else if ( status === 'reconnecting' ) { - return ( - - - {localize( 'INTERRUPTED_CONNECTION_NOTIFICATION', language )} - - ); - } else if ( status === 'connectingslow' ) { - return ( - - - {localize( 'SLOW_CONNECTION_NOTIFICATION', language )} - - ); - } else if ( status === 'error' ) { - return ( - - - {localize( 'FAILED_CONNECTION_NOTIFICATION', language )} - - ); - } - } - - constructor( props ) { - super( props ); +class DebouncedConnectivityStatus extends React.Component { + constructor(props) { + super(props); this.state = { - connectivityStatus: props.connectivityStatus, - connectingSlow: false, - language: props.language, - styleSet: props.styleSet, - } + children: props.children, + since: Date.now() + }; } - componentDidUpdate( props ) { - const { connectivityStatus: { status } } = props; - const { connectingSlow } = this.state + componentWillReceiveProps(nextProps) { + const { children, interval } = nextProps; - if ( status === 'connectingslow' && connectingSlow === false ) { - this.setState( () => ( { connectingSlow: true } ) ); + if ( + children !== this.props.children + || interval !== this.props.interval + ) { + clearTimeout(this.timeout); + + this.timeout = setTimeout(() => { + this.setState(() => ({ + children, + since: Date.now() + })); + }, Math.max(0, interval - Date.now() + this.state.since)); } } - static getDerivedStateFromProps( props, state ) { - if ( props !== state ) { - state = { - connectivityStatus: props.connectivityStatus, - connectingSlow: false, - language: props.language, - styleSet: props.styleSet, - } - } - return state; + componentWillUnmount() { + clearTimeout(this.timeout); } render() { - const { connectivityStatus, styleSet } = this.state; - const { status } = connectivityStatus; - return ( -
- {this.connectivityStatusText()} -
- ); + return typeof this.state.children === 'function' ? this.state.children() : false; } } -export default connectToWebChat( - ( { connectivityStatus, language, styleSet } ) => ( { connectivityStatus, language, styleSet } ) -)( connectConnectivityAlert ) +const connectConnectivityStatus = (...selectors) => connectToWebChat( + ({ connectivityStatus, language }) => ({ connectivityStatus, language }), + ...selectors +) + +export default connectConnectivityStatus( + ({ styleSet }) => ({ styleSet }) +)( + ({ connectivityStatus, language, styleSet }) => +
+ + { () => + connectivityStatus === 'connectingslow' ? + + + { localize('SLOW_CONNECTION_NOTIFICATION', language) } + + : (connectivityStatus === 'error' || connectivityStatus === 'notconnected') ? + + + { localize('FAILED_CONNECTION_NOTIFICATION', language) } + + : connectivityStatus === 'uninitialized' ? + + + { localize('INITIAL_CONNECTION_NOTIFICATION', language) } + + : connectivityStatus === 'reconnecting' && + + + { localize('INTERRUPTED_CONNECTION_NOTIFICATION', language) } + + } + +
+ ) diff --git a/packages/component/src/Styles/StyleSet/SpinnerAnimation.js b/packages/component/src/Styles/StyleSet/SpinnerAnimation.js new file mode 100644 index 0000000000..8e47fc067c --- /dev/null +++ b/packages/component/src/Styles/StyleSet/SpinnerAnimation.js @@ -0,0 +1,19 @@ +export default function ( { + spinnerAnimationBackgroundImage, + spinnerAnimationHeight, + spinnerAnimationWidth, + spinnerAnimationPaddingRight + +} ) { + + const backgroundImage = spinnerAnimationBackgroundImage ? spinnerAnimationBackgroundImage : 'url(\'data:image/gif;base64,R0lGODlhJQEsAfAAAHp6ev///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCAABACwAAAAAJQEsAQAC/4yPqcvtD6OcdIEAsta1+w+G4kiW5uls6nqh7gvH8kxL7K3W+s73vowL5n7EovHYEyo3yKbzCZ0sp5mo9YotUretrPcLHnG34bL5nBpT0ew2WM11y+dN+JiOz+vsd73/f8LXB0hYWCEYZ6i4yICYyAjJ6PgYWfk3SWmpSYdJtvk51+kJSnomulaaGnY6perqxbr0OmsVq0SL62QrlNtrtIvjK/wDHDx8XFPMgsw8o7zSHA3zzCRtbULNcb0tkt3FDe6RHU7eQV1udlGljvaM/tW6WvyOpSa/Sx8l+Babr+8Ij5U/XZ0CFhxYR5RBgAiP2Fpop2HCfhAzSSSG7x6qi/+/5pWRxRHJuTbsIJUsNTKkOGOfxqk8xGuTt5dSNkby9o1mg1Emcep8MEiSz5+N7PWcSdSCUaFDkx7gc9Sl06cRF+HUNhVDVatNs0JlitTrVkNXq2TVCidqSrFLuYY9O5ZsV7YWC109iyAoWHd4Deh1y7cvVZCWpApGGwTU2sN+WcoMzDiBupyKPUZGZvnyMGCamz3sHO0UaGkKR1ubZHrbvtTg2rJuHe91vhyUZdu+jTu37t28e/v+DTy48OHEixs/jjy58uXMmzt/Dj269OnUq1u/jj279u3cu3v/Dj68+PHky5s/jz69+vXs27t/Dz++/Pn069u/jz+//v38+/v//w8gCjEFiFFsBO7x14EurKbggog0KCBqEK6DgTmlBXiLDaL5V5dkAvXnmgKf6feViBnd96BSI9on4WAr0oeJh5zVdyFk8tWoDI0b2gjfh4u91w+P7j30Y3tE5jjfkUjGp+SMN1K0JJNQZtbjlE4+ueOVWB7U2ItSXojYhjqCGSaXY7aYl5gsmukimii6mSacb6ZYFEP70ZlGiRzGlWeC/IUYQYd72gRThhC2uUwJ7Jh1aCMVMtpopJJOSmmlll6Kaaaabsppp55+Cmqooo5Kaqmmnopqqqquymqrrr4Ka6yyzkprrbbeimuuuu7Ka6++/gpssMIOS2yxxh6LbLLK/2I62UnINQspKYYOR5gmguJ2LSBp+QYoIXpi+622DILLpx9ymhajt+eClu4l7bJGJifxssumvPNe9iEeFKGrZij5jvavv/1q5iVJARO8r8ADR1ZwOw0f9rApB+ObsBwR93XxRxMzXLEbHVO8scMLg1yvxyEzdrLI7wI8sskrs/yyvXbCW7LCeNI8s7vjypazzuW+trO62+oWrlzZAu2n0dX+RmhhAxI3LUqPNrfoslZfjXXWWm/NdddeK1IbronZ2rSrSZ/6s6k3q712qeuCWvOn98o9N6cpa/pxp3lvmjGzd196It1/W9o34INXWjjhhyO+OONx61233Y97OjnlPRKTejnbQ7O6eatHp2pgrYk6VQAAIfkECQgAAQAsAAAAACUBLAEAAv+Mj6nL7Q+jnLTai7PevPsPhuJIluaJpurKtu4Lx/JM1/aN5/rOx0AACAqDwJ7xiPQNl8yk8wnlMKfUqPWKTVC306z32+OKm+CyWTZOD8/stkkNJ7rn9E38/qvr9xB8nA/Y8DM4COZ3F5hIKIZ1iJfI5wfl+AhJR/lEWWl5pimU5PnHaRb6aVQqOuqFusbDqqa6+iqnM5sW22hLi6PLiBvVa8obvPU7SZx3g1xlDLqcs0zWfBS9S1O9NE1drYzdqr3jnXwtPg4+jN3tfe66blNuzl4jrp4uj+4+T3//Xt6fz4/cPn3cAv4DOAOhQSUDCT5bKFAhmmgQHdqrF6xixIv/GG1ptEgRWsaPCRvim0Vy48NwHlOW5CiSlcuDK9uVmqmSmDNNOGnqdIKpp09dVhAJjdkryyJmR5ESLROvqc2WUqv2eWo16wOqWrsqeOU1rKBQYssyCGo27ddNatsaWFosqtu5b4EQkUs3r969fPv6/Qs4sODBhAsbPow4seLFjBs7fgw5MsYikoX6qkwSFuaPqTbzY+tZnqTQokeTPufoNOpDqrWhbW0sNezYr2erkm07Vu3cnHDzHsX6Ny7Twm8bLQ68M3Ljt5bTLubctbTo1Kt3spsNr/U9cLYrAu29Dc/w4seTJ3Xz/Bew6nOxb38MJfz48ucj+Wn/1Mj8U7Hy/6+FzH8s4SfgUFwVmJN/CL6034IMEuggDAVFyBCEFLow4YUY1qThhhZ2qEJIIHrY4IgsfGhiCiimeEKJLK6Q1IskyiTjC/XVOKMnOFa4244t6OhjgmNQFuSDt2hXZI5NIJmkD9gV0mSUUk5JZZVWXollllpuyWWXXn4JZphijklmmWaeiWaaaq7JZptuvglnnHLOSWeddt55G54YcKGnBN31uQB4ffqGJ5B6klUoonbSWOd7ct4Y54FuKjippG3GCCell2qqpotsYvomp2uK2qmln5p6qqOZqhopo3O6Smd6iZoHYxFMatjjG3zWSGgJypl4nIqCjjjkrR3kCiJcUP/CiGyrhi4qa6yo3MlqqNVWeu2oqJa6LZqkpgkqtpCm2u2Z33p7rpnpqlsuutlq+y630zY6L73R2tvsqvk6Gxyg/QJ6QLAAIzDkwH1gR6TBCi/McMMOPwxxxBJPTHHFFl+MccbSTecwI9YoLLC/xA26r7Ulb6qotPc+Cqu+9bIcL7gxuzszu+2WGS7KNZPpKbzjembseusmtuscQx/2JxtHEzasUjcX1qssOw9Gq9AtL7ay0y83lrV7KXN99RVbMza1flWDHbbXI6OddlFRY/00UCE7trTczVWWM1RPrhE0YnU3Alve8v7sc9lh/g2m4IOPLS7jOnf9+Nf8Su7ysyoan335269qju/csybN8N0Qd9G3xqafjrpnBQAAIfkECQgAAQAsAAAAACUBLAEAAv+Mj6nL7Q+jnLTai7PevPsPhuJIluaJpurKtu4LI8BMzwEQ5/rOx/X/u/WGxKJRAkwmj8ymM6eMLp/UqpUjzQav3K53oQ3XvuTyU4y2mddsXfrdjstT7/r8jvfU9/m+n7Jn9zdImBDIV5j4dyio6DjHiPg4uRbZSInZZSnJhWPzmem3CdcZJhQqN0pKxYlqpprGyuj6Cot2tklLZnt7BKvrxSvGJAx8JTxchIxjLLscZfTM3OwkrRT9TF1tPTXErd3EDUQkPg1OXk6D/n2unG6+897unu5dP9/zDg8lj59fvu6ev3jiAgIcSNAaPYEI+UkzeLChm2wLGUp8QRFiwYv/E3n50qeGow9bxECK5PGrpL6THWdtW8kS5SFnFmPC8BTLikmb9rJo6scz2qkyMIMaNQT06NGaSo1GbKp0I1So7KY2VWh16sOsWotxzer1q9WUYr/mKisWZyu0aS+xZZvsrVwFnoTsm4s3aN28fNVe44t2FeCxawfztGTYKeLENskyvujxscSwkgciq2x5GeZ5WzeDw+q5WdXQxkCT1iX1tKvUqjM9be16NGxKr2c/qm3bEevcinDzLiT7d+/gwgkRL268M/JEppcPv+xcd8boz0lSvx35OnZV2jE57i49EvhQ4sejCmSeluD0q29AY+/GrlD4Mv/SB2bq/vm4+r3n/+y/XS8AVvffgMkVZuAdLiUoykwMNojeg30sKKGCDlaIx4UYpqLhhnFE6CEkCIZYS4EkcijgiShqoSKEUrQointbwLiIAXvRiGOOOu7IY48+/ghkkEIOSWSRRh6JZJJKLslkk04+CWWUUk5JZZVWXollllpuyWWXXn4JZphijklmmWaeiSZezNyVph4vtqmHjD7BmYFbdEZA4Z0OlKfnA2f1SdcogILB3aAHZDcoon1Stiijd0IHKKR6Tveoo3BSSqeklVp6qaaZctomqJ1+1yipk5pa6p+G2qjqqqzm6aqcI7oKYqyEpmjrnizmOoE66vAaqn3A6prfsIEOw6attf8Cy2eura5aKK3RQovqp9WOei2anm6a7ZmaRbptsIpaK6q34ab5bardmpnuqeNyO626z8rbbKLxGioor/NS26Gzsyq73rB+vWksseMUjHDCCi/McMMOPwxxxBJPTHHFFl+MccYalxJEsgib4rG/yCq8rMglx7qYybDamy+/LRvn3lDLvbuisL+VS5SJs527y7+e8fxFv6oBzbHQobVbYr2kYRr0y6cRXYV1TyMdjNRT01z0vZhRXfW6iUH9ktVH44wL2YOZHbbXhmGtE9dbq5023IDJrZLYSzudM9prp1yJ22Mb3TTbP5+cNN2M2dmG3pXhKqLhi8sKyiJ20wu4u3whu7wyvkoD7HOkkBf7MeMkExxxXSFvjHrqqq/OeuuuD1IAACH5BAkIAAEALAAAAAAlASwBAAL/jI+py+0Po5w0gnBz3bz7D4biSJYQgKbqarbuC8fyXK32fdH6zvc+jAuycr+i8YjsCZespPMJjUqY1BRGis1qjdUucQsOi0Ne73WMTqsZ5fL6DRe33fG63Tlv3/f8XX7eFyho8gc4eIhYU6iX2OjItkj3OPkYyUiJOWh5mdm5tynpKRoHajZ6+lZqisoaptrVGuv6SiVrK0Vbdbv7lLvEC3zkyxRc7DMcZKzsh4yz/BzTfANN7SJtU51Ncq2i7S3CjfI97hH+RY4+dZ3OPsHdDn/SHE/vgFyPv3Cfz3+Q25/l3KdXAJP84lOKFIZuAlutsrNpzUNRfwbmkWiIYiGE/24aasmwMZOlProwRhIJSpAGcXUSVnJZUJEqR7RiUvCVCKdNeTo19dwJaZjPf0AbSBv6s6iBdyTnKUUQrum+pwuZWhRKteq6q1OLmmN5Z6vSrx7VWPX6lSvWsWnDigVKFiypt3DbunWKluzdrnXtQsTL1u9cvjvjciRcWK/amVkVL4b51PFeglm10p0MmapgzCMrWz6KtLPnz2tVphzt73KgiKiXqiZJGlZrqIBzZpxNOynNibhdE/Uk5EzvoIxRaRhuoTjybKeXa2PtfFzF6Ok4Ua8eu9v1fjnKbv8OPrz48eTLmz+PPr369ezbu38PP778+fTr27+PP7/+/fz7+///D2CAAg5IYIEGHohgggouyGCDDj4IYYQSTkhhhRZeiGGGGm7IYYcefghiiCKOSGKJP3RnIhgHpWiQbCwWcduLNEwnow6L1PgAQxtAh2NqybjDY40l8SQaji4apRyL1ilAmYwxJlDTixcRl1mJNEIZpZJTYpmliSEx+ZuVX/rYpJdX5lammE9md5KWW3KZJolnklmlnGv6lqSZocBZp5288VmklH+iGaSgxCRXqJPBeUfojT02Kg6jgL75aAltVmrNnJhaeuemnA7pqQy1hKqEVsKRimqqqq7KaquuvgprrLLOSmuttt6Ka6667sprr77+Cmywwg5LbLHGHotsssr/Lstss84+C2200k5LbbXWXottttpuy2233n4LbrjijktuueZKi+K0wTE7KLCd9grSksAtdOp5jmq0bnmJNtJudM29JK+//9pGqcADH3IpdXGuFihyYTK872wPS9Uwbro9NuZwE3OWcG8X/7UwaqVhnLHFG4Ocp8Rdktxxax+3tLLJIQ8Ws8gn05yyyzPj3KfNOaPcs88Hs6ypykMTXbDHR3PcssZNU7y00iWbFrXUSYd273fvUv20wv0iXPF28f4I3NTkxVsvvlvruja8RyK7IrTpnks3GmMf1+yoye4pbNFuX81217hGbGvVs/5M686x1py44q++DOvNi0v+OOWuMUJeOeOTax655Zdznjnimwc9uuGdm3562LeiLqvquWbtLuB/f+3r23s7Q62kde9uSwEAIfkECQgAAQAsAAAAACUBLAEAAv+Mj6nL7Q+jnLTai7PevPsPhuJIluaJpurKtu4Lx/JM1/aN5/rO9/4PDNYAAQDxKEwqlx+j8wllSqfUBfSKJVa3XF/2e+2KxzKwOUxOq0vntnMNj3PcdKP8jofU9/m+v7jH9zcIFyhIiChmGJjYWLVo6Ci5BMk4yWX3VDRWGXkpRYfZefgp5Ak6SlrqBTmVarnak8r0qhqLU0tZG3qrs6sV9FvXiytsKtxGfIMM/MOcrEzzHPxsFj1T3cyT/XWNXU3NHeUNww0kjkVebu6MPq6+gt7u/gbfIn5Ob2cfLz/vz0+Fu38AA6IoKGugQYEItzVcSEIhwWkQUzx0mK2ixYv/vjJqPIhPCbiPID0eQ0aSockkxlJuHEkrl0uVzB512jTzJcotlXLeq9mFjzafJX+lOQIGJ9Gfu+4gGbrUhdGoVBO8qorV6s2sXA8sUtqVK6ywZA1AK4vWK6C1adu6fQs3rty5dOvavYs3r969fPsuRRoFqt+AwwYbbGWY3KjE3q4yjtXy8aedkiVRrJxoJWY/ITf34ehZjcTQckaTXqPvdKHUqkXrE9yaymvYsVGxri3qNe6gs3fz1u1bdu/gwocTjwn8OPLkykUyb37yNnSWz6fno2ddF/bszk1znwjz4PcO3kEkHX8BtIbC6Cd0Nm+rvQPN5BHLfxDew9b7+CnD/9/PXwNT/bdYgPPJFEJTBh7Y0wiRLciAfSI8CGGE7DlIYYURApKOTgpqyEqGIBbj34g5XGZiRyWmOARQLJK44ovfiChjDCjWKE2MOK4z4I459ujjjAgGKeQsRNrw4ZE/Aqjkkl81uUyDUMJ44ZRR8mJlQudl6QyHSHAJZphijklmmWaeiWaaaq7JZptuvglnnHLOSWeddt6JZ5567slnn37+CWiggg5KaKGGHopoooouymijegG2j6MRWCMpg5RWikCVmI4l6SmVPtmpp45KyCiTi0pZKqmpgtqoqqey2iqssca3KpaYmmXrrbneims3vG4Y2K/CDktsscYei2yyyv8GFwZtn571K62vclqrqIkWOK2phSZpKJCD0giojn66+K24fd4YLrnpmssnun+6ey688YI7L717qisou+16my+//Tp2rZGKApyttQEbXO0ZYG2ajLOjZrFsxBJPTHHFFl+MccYajwjpwsRCy6umD1NbMMmHYjuwwIhyuy3L/w5JqL37yqwnvuvSfKe89fpLGsS54fyYGzbpy5i04BEcmqvXAc2Xtkej7BnUS7scNNJPO100zFfLKhnVWmpdNc87eJ0Y0VQqHTbZY6uMmc5ro5222Bgh3LXN4ewatd3RXaqa2+d4qYnDlflNiXKE43l4zmbnqffOVr/8+M2RQ47qyZMcl4t1y3B3y3XJCg8rdLGQviH4xqafjnrqqs9UAAAh+QQJCAABACwAAAAAJQEsAQAC/4yPqcvtD6OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofEogWATAICS6PzCXUop9So9TqkaqfYrve2DVe/5HJKjE6a12xQ+o1sy+cUuJ2OzyfsfL1/ztf3N2gWKEiIeGUYmNj4tMjoKJkFeTd5+VN56LXU1IQJpbkZyoQG+ij6phh5GpRqaaTZ6vqahpo621OrWrSby7NrSxn8+WtDHEaErGZ8vKw1vNxc8zxGWz1NU811vZ09s82cGS7+7UJerIuebr5C3o3e/hIO/y7f4g20zn3v/iy0r1w/FP/qxRvoj5jBgwhVBFMWUGBDE74ARowzMWGlXv8XMWZ0CMlJR3YfKbLi2LHkOWGhLqqE0akTEywjSb4cmPLmx5E6S+bsmdEl0KABh+4sapQow6QN9zE9Su+pUmxSoRasOlUhVp/Itr7U6vUrrrA6Y4YkO3QR2qeqbK5NOzOO27d069q9i3eSWZl5jfLqe/MkYIRnB+PcaPje2MTfKjI29vAxZMeSW3WtfOoqZr2XN1/S7LkR1dCipZEuDfq0n9GqB+Vr7To1bDqsZ+uRbRuQ6dyrO/PGs/v3bcrC80Qu3vsV8j/Kl8eW5ZxQ4ehnqswlaIg6djjzuGs3mX1eKWjfwSMu34Y4+i9g13Py7d7K6/i3cNNf2P5+tNr69a3/679fVAD6ENGA4zhlIDBCJZjDTwyCseCDzkQooQw8VUjNhRiC4+CG3VHo4UodhogPiCSyoOGJKI6oIkgFtigiUjCWiOCMNP5n441L5eiiPTzqyN+P280npEbBFWlkfkiuCN+SSS7mJEy1RKkNlFRaON2VGcKiZYPjkddlmGKOSWaZZp6JZppqrslmm26+CWeccs5JZ5123olnnnruyWeffv4JaKCClrXXoBx4Z2gdX7KU6ANZNroAdJDuIcqklDY36XGQKilok516CuiRgdrXZ5B+mloqqXuiuiqrrYr6p6qvgpoqrafaWqt6g3L66ZSWLiqppZj+CqxgvwZL7AHh/yXLAJfMNpDMmmA+66gp1EL717UIGPvsstqq9S241CKb7HnMknusueWqSyy66Yp7Lrvtwjuut/WOci2+4TKq7aVb9FutGtcBTHDBBh+McMIKL8xwww4/DHHEEk9MccUWX4xxxhpvDLASpTCMaMd3DNzoo/PKm2mlJ6v87rCJ8hoqzPXxtRysKIkxk3CyqsMdyZjtrKC9rbkaNL2qEd2glachjYOvQwM9ocuhMb2l00tDXaWmU2PNocyMUd211lt73bTNlZmdNNd4oZ022V+LzTPbb1vtn9yP6Ro3rpJJXbfbe7tLoNqGody333/rGyDdtvUchd1LF+szfoTHariecCAbqnjJSqcM+KZGx4s46PwaHC3Hpp+Oeuqqr8566xQUAAAh+QQJCAABACwAAAAAJQEsAQAC/4yPqcvtD6OctNqLs968+w+G4kiW5omm6sq27gufQDDX8Y3neg70/u/bCYfEYgWIRNKMzKYTl4wqn9Sq9SPNAq/crrdR04p737K5Ok7Pzuy2UJ12y+csOJyOz4vsd73/b8HXB0hYyCA4aKhIiJi4+JjX6AhJySY5WZn5dRmn6bnJ2fk5ihYqRopKZTqW2mq0euoquwObNXvLUyuFy/uiG9UbXPebJGwsQ7x1vEyS/MMMHeJMFl3tMW2dvYGt3X2R7B1OAS5eLvFrng5Rq97usOoevxAqX3+IuGSvbyCYv/+/hNUagAQD0ghio+Cbg8oUNmP4bKCmMLYcXoNoS+IjPv8WM1DEBAhfx0CXFkkaOQFeSE4oH8Dyp8dUSzC6YqqciYAcnpo4+Tnb+bLnNGpy0OEcSrQNsZlIk57RibKpxjJLW0oNorRqx6tOQRkdyXWqF6gOw4rtQlah2bNXfoINa0lr2bVZeW41G9fuXbh5g77l21fmX8BP/Q6+6oadVbxF6TFlnJilUK5AG/XEKLUyx8uYudlUwzknYj9x2EYdzQgzzNAHMrNu1fS1rKGyZ7ut7eo2bthfd+dW7HvWzeC4SpomjsryceS8BTKP9hHh6ufUq1u/jj279u3cu3v/Dj68+PHky5s/jz69+vXs27t/Dz++/Pn069u/jz+//v38+/v//w9ggAIOSGCBBh6IYIIKLshggw4+CGGEEk5IYYWiMTSdhb6UpuGGdnSogmQgjhCdZSnxM+I7wx3SWUIp+gRcAiUW82Ja/XTomYkW0gajSBSudWOEQOoI4ZBBPmikjw0mqSSDTDap4JNHRinllAlW+eGSWGa54JYgGejllwWGKQqVZMbS5ZlaOKjmmmy2CYyWcNIo55xYvWnnnXjaKWGeyyEYm4h9ItWjlUXy2CKaFSLamphCyiWjmzX2xmIYGY5I6YsarKgpB451CsJJoJbA5agmrPmnqQ+pymqrrr4Ka6yyzkprrbbeimuuuu7Ka6++/gpssMIOS2yxxh6LbLLK/y7LbLPOPgtttNJOS2211l6Lbbbabsttt95+C2644o5LblQGpcqcDeiaJOl1M3ZFyR3rhqZovJs95+hnUOJWqiHvOkecoaQJyu+9hRgmG5EDC1awwJox/Jqof2TKmcQLI0yvwg9jfJnF+nI82b5zpNWxyCNDmrHDkVFcssEfx8iayy9zmnKZE6Mcsc0Xw5xwvYyw3PMUG+mFnIuVEJ0r0ruCjCvTukIMbEnGejysysKC9mxG1Kp7sEHT+pzsv0Ijy9G8t2ocNcG/fpo2273ynDTccTtNK9B141wr3rbqPSvJefstq25N8x044bECfrfce9vdt+JnO/43zU9D/bbbbRij7SvVVctcbL5VJ3rpslybXW7ppp++SAEAIfkECQgAAQAsAAAAACUBLAEAAv+Mj6nL7Q+jnLTai7PevPsPhuJIluaJpurKtu4Lx/JM1/aN5/rO9/4PDAqHxKLxiEwqVYBAs7mMSo9PgPWKnWq3Oqz3a+WKxyuw+UtOq0PndnYNj0/c9Kv8jk/U99C8f83H9zc4FhhIiDhlKJjYiLR46Cg5BBk5eclTaYnJaaO52WlUFdYn9ckYSlkXdYqa+jO6mtS69wpUOUsra7tzSqXrxpvpWwS8K+xJK2p8hoxjXMzc7FzDTCRtRl1trYrtpU2D3e1tBx7jfU1ebg6DLqQext4uPu4u70Kenn/foq5Pz6+fvXcAA7LY9w+YQXwD67VayFDaI4UQBRaMRqziwYv/y3BpfMGxo6GP86ApcnKMZERdW56g/FZKJUiKMmvqYWkz5wFlOnu+9OhT56egRBcRPWqgFtKlTn5mick0qtSpVKtavYo1q9atXLt6/Qo2rNixZMuaPYs2rdq1bIO4hNqWl9K4nSDRxZTx7iCeev+Y7CsnJOBCggcr8meYMOLEWuCtY8zKMVzIIuFRjix58mW3mR9vduj4M8bOmkUPI13a9DPU8VTDYp3a9TbWsl/Trn36Nu5esHfnJu2bt+7gN2DHJm4RNfIcw5fP7ux8NfTo0jN3iNWUegXgG1Jqd2A9w8jvEMJfAEqeQWgMedPfbEjhoXv1hcvznf+epoW/+BFw/zvPX39JySfefwL6N1SBBh6IICgKBshgg218AF+EejR1HID1WXgCQhzOtOGHJCwm4kYhlshGhSh2qOKKI57oIoUwxujBjDRyINGNTCyoowkQ9ujjfUCmIOSQLCZopIlGJbnSXEyCSMeT4WSToZRWXollllpuyWWXXn4JZphijklmmWaeiWaaaq7JZptuvglnnHLOSWeddt6JJymk4CmBK3wOuOSf7c2pX5wKVUmmjWF6uCaJakrWKKSPmmcmd2cqd6mliWJaZm+dNgemcZ+C+qVxiD4p6qaejrmqmKaqyimrpJY6q5etuhorrJJWqumo66FJKbC/Tspomo5GquiiP/+2yeORdpwaXZFBRsmhJkpGCS1yge64rYUTZqvBoNVOiSSdhRp6rpvNMrsuscsi+26mOcLZorzJdlmsu+3aOy+b+eqbrrH18huwwPsaXDDA4qqbMLwL00tgnQ/LWS6f3f4JaDAYq+eUZxt/DHLIIo9Mcskmn4xyyiqvzHLLLhOSTcoak+znxg4KenGeOduJ3l2xeJyGtT57x0XFa42nWM9oKX0Y02YZ3fTOY0m7BNRk4dSS0GfFW9nNV3PdtZNl9WuK1GHd24PZYA0c9jRpsf3LzEvDHTcYcf17GErZHY03wQ3rCravBwv+N+GFy0o2u4HzOjjjhzseMcVUQzwxw1YYE2rXx5mDLPbIbr8Meuiij0566aafTlcBACH5BAkIAAEALAAAAAAlASwBAAL/jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjaoA1GpVis2+rNyu9gsmdcfcsPlcIaut6LabsY5T33S0/A6o6794+f4f1XcHSMgkOFiYWHSIqOgIxNj4OJkTKUmJSWPp55S3lom0yankeQkKKfpJyngalBqXlNr686oW+jrLU0t2W5u7sztmFDz3i0NcRoRcbFyzzCz0DN0cI71oTa25rCw9ne2yPdR99S2DfD1eXh2Mnq4Oszs87v2+4ss9T1+fIts+vw8vUq9/ANf1WZWvYLUAowYSVLjFgLAm+chBhFgxz8WN/xk3Yqzo8WLHkAVBklT48CTAlCr3uWu5EhvMkuFm0jxn8+O9nDpx8eTY7ydQgUJJlsJTdKYfjUl5emLYNKrUqVSrWr2KNavWrVy7OvMa8mgZpmDLDSJbNhfRtLNEsT0V9O2keHIdsauriBjeQjj3/qnpl86zwHpkEm5j+LCZbordMG68ODFkLS8n8xlsGczjzJcxc84i+TOU0KI7AS4t5TTqQHdXg27tGgvd2JTj0pbt9nYYS7rtHOxth2FD4FO+skFL/AQs5Mlf/26emjdz6A7XUo8F+zq+7NpRqe7eYzN4XSzHH0tovpLJ9DYy6mMPzj18Z+6nz59S3/59FPn17/830Z9//4kQoIADglDggfYEqCB+/TXID4MQKifhhCUkaCGAD2YoRoUcErjhhyDmJ+IIIZaIIIkojjjSiiHI5yKL5cXIQYs0pljZjTiSpmONPPboY19AyrjTkBcWaaSJwm2SJAvWNcnPksNBCY6UwlGJZZZabslll15+CWaYYo5JZplmnolmmmquyWabbr4JZ5xyzklnndSJ9ZSdE5iiZwKH9KkAk4BK+SSdPuk5m5x6GbponN+1+aiaP5o5KaWVkikem5muuamkl47ZaZqhojkqqZEeaOCLnqGqCoWN/venq9yll1uHSLJ36wezjvfqjoLOd6oGttG6qq+C7FdqkM//wYeeiUjBOiOChM6R6nU2WnotpjBim62YJ4Kqorbfgumht+WSe+6XGII7rrrpermuue3C+26X8cq7rbj1cdttmPua2i++0QqcrL8Dl3mwvkK6WSzDvb65K5yyVMtpoYMuO2ig00KVcccefwxyyCLDayXFiE6Zcawe83ZxrSe7zOihcz7scMSa0lzxwpA2nLPOPeMMMM+iCh10sAoDXTTSCH8aC8eNMe1PMoFBHc20Uu9FtXd8smW0PM9i7TNCx4KdKEUWc52r2CrjVbbZZ6cls2lvv/XraHWTPTZuLCuGMWt78211np3NfZjJbrPSMuGKKr543isfZPjOX4e89eMTGI0MB1SRY855555/Dnrooo9Oeummn05cAQAh+QQJCAABACwAAAAAJQEsAQAC/4yPqcvtD6OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MPgDEYlGITCo/xmZzCY1KF87qc4rNAq1co/YLrnXHxLD5nCKr0ex2SL12y+cTOJyOz1Ptcb1/znf3N9gWKEiI+GV4mNgotdjnKKkEGTl5+VM5hsm5pdnVGarzuSlqakPKdbo6k2rFCvvi6hRbyzJLa6trguu1+0vSWwZMDCJcjMyEm8y8sdwMjTEbTW1BWo1d8ZnNLQHZDe7NFwAQbu7AeK7OUP66/g6PVR5Pv+deD2+Hn0aeuLj/plSeSgA7BKKzraC0f25SKbSmic20hxFcnelFEcJEMP8YM7LrqAikRwTC5mUpOTJByWHyUKYkt9LkI5cvY7KMEvMlzJxTeI60eWQmTY9Aby7xmbGoUUorayoVeuzn055DKSpdigSp1atURSblCnUj0aldxX4li/OZU6BazI4t2taizp02OSaci7YlwbkH2Jr5xrdv3YvjAqtsWoiMYXtR5dCSufiw18iTJlOWpPZyJ4eQNV+669kU4NCn2ukjbUsgamDzOq9+DTu27Nm0a9u+jTu37t28e/v+DTy48OHEixs/jjy58uXMmzt/Dj269OnUq1u/jj279u3cu3v/Dj68+PHky5s/jz69+vXs27t/Dz++/Pn069u/j982qPwnDvL/F7HXfxpcc0E7/bgWn1sf7SefZQqYpth7iDF2GntaCTYaenBhGKCGfhkgl3lgKQjeVa2R6J2JdDlUnolVfefihCXG2BiMNNaY4o0ObqdjZjn2iCJ2QAYp5JAszmgkaD8m2eGSTDKE5JNQ2qgijlQ+ZaWTbO3InYsghkieil8S2CJYYzY5npgcGqKemWum4+FgFKq23odUrJiLhBc2YCCC7skoYEU+BqoRmIRScOShELGpKAf+NWoQnkFBSmmlll6Kaaaabsppp55+Cmqooo5Kaqmmnopqqqquymqrrr4Ka6yyzkprrbbeimuuuu7Ka6++/hplFa0+eiqan5JZWWiD/w7EYGBZAgKnVFwSVlhKcjZkbEF2ooGsQhtKJCmxALn5V6L7eEmtofSgG8a06sRYrrvg0BgvkebQa9ez7+Ib14v78nuSv+vcmK++4ehYsLzZINyvwPcSHJLDBzMcsMETA6yXxfNiXNay/8KbsLrvQNywxx+rGbHII4Pcrskn51WykvWw3HK3+LCbbrbrklsvo2ddm5jPW20LboXS7ln0Jn4+hDRCEFIGaKYKN2qvpTaDqnOo1aoK4RNLAwt22GKPDfWtqsCqtKtGo7p1sUKTmiHcU8o9t9ZZd3r3pjIfm7fecdv9N+Bvixo44YPTHS3iEbJqCdfhfp2qaf2QTXnllghfjnnmmrNQAAAh+QQJCAABACwAAAAAJQEsAQAC/4yPqcvtD6OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofEovGITCqXzKbzCY1KR4Cp9SoDaLdcrPdL5YrH4LLZMk6Lz+z2Qg3vuufluH1Lz2PvfL0fytf3N6gUGEjIVEVWtWd4iHj0OOUoCSnkGMAYRVlp6cOptQl65/kzivd0alf6qaqZ6ArHqhOLClu7NpuDG7rEm6Z78/uaNCwXTGN8q4w8Y0xs9Nzb7MxcLE2dZX29nd0iDR3d7b0CvoxLHmNeOJ6Osu7L6/4CH187T4/tmxmL71JvT5W/f88AnRqYrx07UAgJDrNCqSEMhU4ESUyI7osiPP/hLn6T5zGkhIwiSzogaTKlAlcqWzY46DImAoYyayboZDPnxkU5e770CTSo0KFEixo9ijSp0qVMmzp9CjWq1KlUq1q9ijWr1q1cu3r9+lNRJrDULJJFxOnsIIFq6bBs6wYlXI0g53qhaLeJvrxS9vJNBfDvwsCCI4GbVpgb4cRDDh9jLM4xZMOOO05uVfkykcq2NAfhjNgzZsmiP3MubTozalOnV48+7Jo16dg8VNOuPfv2Dti6X//q3WMxcGF4h9f4bVz2veRAlp8QK5Z5BbYmdqqRPmHUO0PYs+MUob07BOtdLIOgLh43zPS7nbO3Uff98fjy1T2srw05foz697P/8OtfCsIFSAKABFZn4IElDKigBww26GCCEH7w4IQbSGhhhMVlqAGGHHKw4YcZhCgiBv2VGMKJKJ7n3orgveXiguHFuF1ENL7Dj1k3CrjKjhONZZ6PQg5JZJFGHolkkkouyWSTTj4JZZRSTklllVZeiWWWWm7JZZdefglmmGI+wEiQYpK3hplaphXmel22aCV9VZKYpIdL8hZlbk+25iRoUIKmpo+A9gloaEcWaqiRiAZK46KMrujonZHWOSmSjj6K4qVKakrpoptWaqmnnSIqaaFMilqqn6nyWSAwmHpm6os66jYoeDl+RxurGrIJnG0sztibniD2M1yFFMgZm50X/6iYK7LDOpusXLtKexuxsjJLK02t3icdJs8VJB6a0X0L7pTGHqrsqNxKeS665eaZrrrQNvmuufWyuy6V+c45L7zWZgknwG5yObCXvI7Zx6tYujpmww4/DHHEEk9MccVojGXxrQw7fPCbGnv75r8LU4svtnvGq2i7RAp7qq8tu7wqnjHL/GmtNdssr64pk3ozzjvznDPMK3PqLtChovpzrEGzPCTRXwFDmdJckVIEqFvN2pzRWdmYms9Ydayczldp2zXTVQGbtdhWFezbvV+jHTbKTqFXNp1PwXiJ3HeznbbJb5O9md9j81034VoZXjjIZ8EdNddtAR5QHBjn5XgqHyBjrPDfuBqMNcKyZD5yeRmPTnrppp+Oeuqqr85668AVAAAh+QQJCAABACwAAAAAJQEsAQAC/4yPqcvtD6OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+j4C/h8A8IbEIu6HTPqMzKazp4wuhc+q9fqQaoHYrte5DVO/5HJOLDar1y80mg2Pk9xuuf2eodfx/H5Wn+YnOBgE+EaIiGd4mNi4tsjoKOkFGTl5WVUZiMn5pLnVGcr0CSpqykNaerpqkyolOMaa6ZokJxQVJOtJiwRHpzvKy6VmCEwkvEQMaTyE/FjJvCOs/Bmtw2tGa33kSp26fdNdNg3eqvmMXV5znu2sbq7Hhpz8ThMvP18frpXrm6+Pqs+8WAALThhIz6DCP/8WOmyA8KFEBgMnWjwQ8eLFiv8aLTbsOPEjyIUiRzpMZzKktpQqv7H0SOplR3YyNy6rCbIYTpOWdqZ8RdCn0KFEixo9ijSp0qVMmzp9CjWq1KlUq1q9ijWr1q1co9261dVaz7Ci7pENtegsp2pqJcVsm0gcXFhy5/IhZ1cR3ry29vLF5/evN5SCB68s3K4k4i4ZF4/j6JgS5MiMJ1O+0vgyFsuaZ7nrjPkz6NCER3s+bPq0y9Sk37LevPp167SyOYCdsoJmbQtvgoq4ubuCzhO/gvOGhiJMP+MU2Ka4zRxD3ejNUFO/Fvj6OsXaZXDuHgOhb/AtxCck78L8ePTPzbOHoX79+znx57OIL99+CPz6VeD/z99fB/wFSFx9BJbwH4AH5mHgglCo5yCCEEb424QUVijehfRlpuEHGXaIIXcgbvDdiAJmZ6IHKKZom3Us7ufcixICJ6MJaSlY44l75HhfIbjwCGSQQg5JZJFGHolkkkouyWSTTj4JZZRSTklllVZeiWWWWm7JZZe64OglRvyAqeWOYYoJyJlophmma2W6iaWLVZZG5YpQijaliE6WuKeeS3IYJZ9MfigloHf6qaShTwo6KKKJOpokpI/SWSilecpZZ2xZwrmpbl3S2B+ZBRY331ev2JOGqKyZaiZ8tagqG6ukcqnplZhWaumieAaq6J+EHvprkwMKO2yjxU7aILLH/x6Z4HlGNutskdBGO+S0vkKr7H/ZLkvktLCO6O22yT5rbaTYXqstutxK2yyx65L7LrvjqtsrkhYCK2m3Pu6qK7/41jrndFYC3OlwZ7KppgJjJsxwww4/DHHEEk9MccV3fEurKpGBdZdZf8k6jGEezzUWbJ6qNWtlBG+F8GwrY0Wbyy9bFfMujE6FnM03R5VzE/dm1bMR8fJ8cnXzVhX0MenCXLQ0CWqVtNFDPxW1008DDarUS19VcxHlMt2y0udinbLXY5NdstVng61xMGtDfaoVX4eFG8YzeGv3heGK6x7fwcJ7tbmB+51vje0ae7S9U3f7M+L1Kv644P66a2eftxbyOjPmTdvadZthJwxK3haPTnrp6hQAACH5BAkIAAEALAAAAAAlASwBAAL/jI+py+0Po5w0gYtB3bz7D4biSJZQhqLmyrbuC8dbSmfyjef6Ltc+xgsKh0Ti73gpKpfMJgeJdEqn1CUUWs1qt63rlQsOiyfe7/iMFpfN6bZbuma/5/RdXF7P67v36P4PONLnF1hoSDFIeLjIaJH40xgZ+QgpaVlI6XO5GZhZwwma55kSWjo3qmKqioZqs/qq1qoBS7slW4ur1ZrLO4XaC+w0Gkys5FmMXPSYzCyU2AwdFBdNLY1XjX1Tmc3t3P0NHi4+Tl5ufo6err7O3u7+Dh8vP0/PGqAxWw+Df796pL9C0aQyAEMQHLimYIc7jQYprPDMEKWHESYCOkbRAcY9/8MyLujIEaTHA7/07BpJ8iQdWflG3qrDEuW9lytpemTZsg3OnA9x1ox50+cpoUFt6iRKcSfPMztdIj0KtKhKN02lGmX1tGfUN1szZk3TNelVqCVRjiWbSaaBs2DLmnULc6NauHEtql2b9uKyu44iYnLIty/DQ30CMyjc8KDhw142YVl84l8pfEmWQtY4k9/lzZw7e/4MOrTo0aRLmz6NOrXq1axbu34NO7bs2bRr276NO7fu3bx7+/4NPLjw4cSLGz+OPLny5cybO38OPbr06dSrW7+OPbv27dy7e/8OPrz48eTLmz+Pfh7lfuk/8rP8RCD5xwsVi58GET94wBX5d/+3q9Fe2omkgFzY0ZVSXgdOlaCB04WVmYPRVdUggRNSGKGFzymVz1fOcTgLhhuCiBeEzIEYoofLoUiZiSuSmCGCL6IYo4Yn0ihicyy2yOCIMLqo3I4lynjjj2zNyGGFAF6YpJICSkcjAjb6mKOC1TUpmH/UYVkgYtnlKOVg26no5DZjHpklDfcRidl65bHZXmRPxlmflnR6IOadgjSmZ0Bm9glooIIOSmihhh6KaKKKLspoo44+Cmmkkk5KaaWWXopppppuymmnnn4Kaqiijkpqqaaeimqqqq7KaquuvgprrLLOSusJGYLK56VeTjpnoxIm2uOhQAZKJqBcEnqsoFH/hlLZWzA6polYyyIkGUA7JiFJrvVcC98fCenDbbch2SdPuOLW9a164TKyazzmLuIXPOaeO1S777xLmJ3tzEsvVfqyMy+8/wK8br727huwwfq5W7DC5MrbsER5MsxtYg9DXDG7F2MsZLbXlHutJfRZ2/Elf5I8LSeaScQeUyymNrIuz5K2cBbJghYvFUqZZqUvxUIGpzLBeoam0FNu9rPROeMMpjBLM9200+nSPLPNMVNdNRjr9Uv0y8qWbGzIYYvdZ8R34ns22mlnvDbbdCbcNtlvqx0n3HF7fTfeeWfdntlzu7131OnJXTbYY/Md+NB6In540YsnnfjThio+ec++Dvb66MGSbmwpj0BwTU4BACH5BAkIAAEALAAAAAAlASwBAAL/jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2nQH6ruP+DwxCeESi8IhMvopMo/IJjWqaVJ70is0qqlyA9gtGdsfhsrk2Jp/X7FQ63Y7LP2/4/I6v1O35vj+xx/c3mBcoSIjYZqiW2Hi2yOgoCQbJNXmpVWmJyRmlWdUZqvQJKvrlFYB6R8pkirWpyFrk6vkWK7tDOxrIhpurmwT56NsDHKS5Rmx8TGrmuwwkO8wK/YPrTF2N84yNrL3N3W34DR5eJkx+Q1w8bZuuvn7b9V6uHOfVqkpvs86+/7+hnz6ABCkILIhQT7+EDCUsbAiRwcGIFAHFq4gxlb2M/xUvcuxo7mPEayIxSitpMhvKlJVWcvTm8uW4mCL30FyJD9TAmyVz5trJM6jQoUSLGj2KNKnSpUybOn0KNarUqVSrWr2KNavWrVy7Sp0F1KurQ2I72SwbahHaSzDXJvrk9m2zuH9O0i1E8u6qkHqTbewrzy7gdoIHn3toWFzexJQmMj6F+HGmyJKzUK4sxTHmVx43X7ns+Unn0Jn5kha9+HRplapXw21teS5szuhYUJmNobabebgtzNxdp7dvsiR0Cx+iMZ9t48cdGghrgnXzI9KnR6tuvR727DT+cudn+nsM0OKXjC5v/jx6F+TXq9DsvoVA6PGjt69/4j7+4vr3j//o718IAAYIgncE5mfggfYVpiAKqTXooGwQvvfahMu1ZCF7v2VoW3LucAjDhyDK4JMV9I2IYooqrshiiy6+CGOMMs5IY4023ohjjjruyGOPPv4IZJBCDklkkUYeiWSSSi7JZJNOmpScRk82AMeJSPLyJHNHSmgkg0M+CKR6Pg5YI3xjmrnjfFaWqeaPavqT5ptuvrlmjHTW+eKdc8rJ4514uujnmXzGSaeg8+15qKFo5jhoj22GmSikYvY5KaFeSrodpm11WaGSWiap1pQewiKqRSaWeg6qDzSRiqqm3uYqcU6eJSqWWdra5KdbhpqrrkX6SuSmoAL7Ja9MElvshsf/Krsks8uKOGVwqkYybSmubtHDn9duy2233n4LbrjijktuueYy6qGU3ELbK63PIqsovJZyGWSC8Waq46Nx4aNYpVaV2Eps+m6FK2qNXoXhLnpiRe91C1cFpnaFQhweeIFORaZ8fv4SVaQ+bMzxUwNbvPFXB3cHMpxLPUxyySKzjHLKL8M8Q8oqJwUyPDI3tTMaNjvVc8w58xw0iUXj/HPLNCOVtM8uM2WztgteDHXTQk9M9NFGL8101DpjnfXTSmfMk9cfj1y11jWjnbbYX9u78tAOVxy32xI3PDPXbwvbMdXU4Q2V3UIkzLDec7OLMNiuwerVyZ+1yu++i84bMaV0GFPOt5CXap45pwW3Sy2qjJ9Leummn75VAQAh+QQJCAABACwAAAAAJQEsAQAC/4yPqcvtD6OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofEovGITJoAAQCTqYxKlc6qtTrNanvX7nULDsO85K/4jB6V19i0+41hy+H0+kOOh9r39TyeDwjn92enFyg2mOe2dgiWSIio2Bj1KLn1OElVOXe5mXm0yTkV2vYpRMqmhepkerpKlvVq2Ooj6yVly0rLlWs1artb21uaNDwbfGN8bDSMvKO8TKTsrDOtaUyNg025nZ3ci2vtXdN83T0+Ax5ejk4uGyvenv76ey4/H9ppfx9Dqq/Oz12iSAADCoT0D5jBHKII5lr4rIlEOg8hWgxR8aLGDv/vNnrkQO+jyAz+RpqMU+mkyguYVrq0gPClzAm3os28iTOnzp08e/r8CTSo0KFEixo9ijSp0qVMmzp9CjWq1KlUq1q9ijWrVodfbG7dZelrsJRiwZItmwkV2kkd1/Jp67aPwriCMtJdVPAuV7h6w8Trq+ovYHjsBhMubHgd4sTm8jJubPcxEmiS6zmuXEQwZmb7Nktb7Dnz5dBDRpMuPfc0KL6qOattrbglbG5nZ8duaPswo9x7WXnlDZzareCOYhJfPej45NrKg7xu/mMV9Oghp1dLbd2G6ewuQHN/0fk7i/DiV2gur4Iy+u7k15eA9tu9iPPyScCvb749foz094P/6O/fBwAG6IF3BPIX2YFqbKdggdg1aF91EC4h4YQU5mNhChhmmJ8fE3HYIW4gjtdEGSNqd2KKKq7IYosuvghjjDLOSGONNt6IY4467shjjz7+CGSQQg5JZJFGHolkkkouyWSTTj4JZZRSTsnWh1QesJuUxjXpoZMDefnlkp6IyZyRJSF55pFpmrmhmm2yWWaRa8IZZpJjkpkcl3mCGRafJk75BCwHPlGNRPF9JyKTddp5p5tvCskakA/2aGCO+tWoHqUDygjfoS926qmLoIbK4qg6jkrqiqZaiiqroJ7aKo6opnpirLLaaiOuN65666uw3sdjp5pm+uulM256rLGY/yY4bIWSOgvpo3I2ymiffg53pQG0ZutNoCVma221e6L5HJHQ+sjgriVOWiyzuwK7o6+uwvsur7nqSuOs22ao774W9usvDYQGvBTABLOXylcGozauVQtTJ21UBh98wrlNTSyMxRc/zFClSU1M8XzKFoVxx8gOVbI29DqV8kHEbtyvycI+xbHLKxcM8DezQpWzzvYyFbPP+H6sr9BDE/0zPkXznLQMNcN8s9JL0xy11EcrNbPRO0t88nhPs5zuGF8zHal2Y4MtXcZTV1UuDy2zLRvEa2e1pdpbl+VtyGLPHWPQy979t7z3Np1s1r2+PO/IonYNo+KcutvsnM9Kbu5Aeg0XniiX6/rGbeee81QAACH5BAkIAAEALAAAAAAlASwBAAL/jI+py+0Po5y02ouz3rz7D4biSJbmiaYdoLbuC8cxQNc2K+f6zvf3b+sJh8RiBogMGpfMpjAJpTmn1GopirVqt9wJ9ovrisdacJaMTi/NYLX7nWN/4fT6Sd626/cc/JwPGOjldyZoeHhAWIjIGKi42BhZ9xglaTlJmXS56ZapyQk65okUWso1CmSqWoX6s/rq1FoDS7smG1aby3OLq+s7I/srHNc6bAyDeqzckrzsfEf5LA2tOG19hXetTSK37T3y9y0uIjU7fo6ern4VwNK7Dj/4GU/PwFaPn5idD/+46X6DHwiA1RrlEbjBEyKC4RBaaObIj8OHEAH5mxjhlsVo/xgh8NpTsaOCj3aKiVzA690bkycRpCwZrKXLl3RIykwpBQ5Nme1s6tTIE6dKMjh59vSppmhQpGmULgX6k2lHp512trSalOrVmDWlioQaFezNkCu9fiVblqtRAwpBql17tCCft3AvbhwFF6VEQ2jzxoUUMZNfB4APcRz8AGA7TnIRK+s21LEwM5KtMQxYWVzkzJw7e/4MOrTo0aRLmz6NOrXq1axbu34NO7bs2bRr276NO7fu3bx7+/4NPLjw4cSLGz+OPLny5cybO38OPbr06dSrW7+OPbv27dy7e/8OPrz48eTLmz+PPr369ezbu38PP74Khovlm2hov8+9/Pr38f+/YNd/8gT4kHt4VUBKeix5VMl5CzZAWXli6XVQeGb9VSF4Zu1l4YYcfoeVPh92JxSFI3IXIluNoaiVioR0OCGG+4HYoowR0hijjfiR6NWKPOaoY4MaAhnkPDD2JWKGQz5oYmE4tsWgkBIeOGBAmy1JYEZH1bfeYQJW2c2XFM0o5piVXFlmRqSgmWaBbb4JZ5xyzklnnXbeiWeeeu7JZ59+/glooIIOSmihhh6KaKKKLspoo44+Cmmkkk5KaaWWXopppppuymmnnh7BFpeF7sinf3l6SedlJ8bJZJoXGoWDO4wReVWQkQjFJkJh8lUirC8G1utWWXaFa679QAlTscb/rtNqU8qa4xCtYjwLbbR0OUvtspqlKEq2OQkULLbZ6houGt5+mw+uaXnLj7JZnQtusVXBi8+z77LbrrvmnotuPNTe+2+69u7Lr8D6EjyuwfKKG3C9ByPcsMMLQzywxOrOW7HCNU6bcL4XY/yxx+VSvLG/IYPMbT0nA/wqPSWT3KzGMTM8s8zIJluzyDfrcS0rPS2mbSxIYiJYF0p2i6ogSU+xqtHD8rqrFUs7HbUkN25BJVFXgyJrEEH7kHMZRqLWcn4pmz3yfyV+7eDEameM9sP24Rs33PHRKx/eeev9Hr9sY9lx3wXPPTh8fhNeuOF8G3j43nTfvTjjgUP+OOV2Kit+ueUrO+42f3K//bLm0nLes4Cjg77zm1nXOXWqVe+pqit/swq0qB0VAAAh+QQJCAABACwAAAAAJQEsAQAC/4yPqcvtD6OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MqgDEolGITCo9xqZzCY1KF85qc4rNAq3cYgCgDYtp3TJxjE4PzWa1+/1hy+H0ekXOtuv3VHyeD2jnhxdY+DY4Z6g4hvi3+DjVmAhJqSTpWJm5dVmmefjFyNnlidYZKcpFqkUohZqqejoI5WoFG3U5S/tkaynaq+vFm0T7CwwmLKQ7bHyMvOkKmmzsHDS9rEz9w1zsm+3DfIaE7c0D3izdTV4OvpSurmN+Lt74rm1+61f/Hd+Kqb++LQuYK/L+7YhX0KDCCfcWOqTA76HECA0nWmRQ8aJGBP8BN3o00PGjR2AiS5IsKZIYSpPuVn7k5HLlQEQxXc6cVDOmv5w8Z0bjCTSo0KFEixo9ijSp0qVMmzp9CjWqVG8JpzpMVdVqNpxaqdHr6lUSWF4tx2ZSabbSuLSQTrJdZO2topBy+WSsq+cu3jp69x7q61dNxMB8ARMWM/iwG4SK/7Jr7Dgu5DSGJ2OpbLmf5Myh3HLujPZzqdCiR6MqHVks6sUwV8NR7fp1vth5O2Wl7fhLuNu4e/v+DTy48OHEixs/jlxQcjq1liMe5fwy1+jzWFG/Zv36M0K8tdeA7b0HrvDiwZPHUfY8mfHqc7Rub+M9/Pjm589gb389zfw3vvL/p5/df98FKOB9OxU44CsIAjTQgg4+CGGEEk5IYYUWXohhhhpuyGGHHn4IYogijkhiiSaeiGKKKq7IYosuvghjjDLOSGONNt6IY446GvVEdzZOl6MsOtY3Y3ovnkbjWi56tiSTK07jo4h0qYjZiFVKeSWIiaG4ZYpdmsgYi1+C+ZiYZbIQpXFZanBTc9edKYKQ0U0ZB37IbcYEknc6yUGbRgpHWp5KqqlnnXQG5+d+IIR5nJ2CrombLGkyhFA4y80xKaWVZkpbosGQsOmnJIYqaoiklqrlqZamqiqnEba66oewxtrhrK4+OCuWuZq6K6ut8tqrrMHWOqyHxRL7q5XJ/+pKaonLKtuss9GSWamXm1LJqLVwassnt4E++W2Tjso4bo2z7XhAoj+hy2677r4Lb7zyzksvR7qdceuS90KHrqI3ylfkn+BCQ+6gcjWYbzWHdgVkLHha5Z90204FcC6Q8kiwxRcT1e12GwM1sT3VRvWxDNMyNTI62aKcssjXNhVqdS0rdXJ5MbN8s8szH/UsgztjfKrCL9PcMzw1A62qx2MOdax7Qydlq84lswSr0gsLFbXVHXPcNHor85y11AaDXbXQDyNdtM/hkp20zBnD3LXaRBKdttj+OhX3PhGT3LZmBEJVtzj7Kshw36vsu+5YQVP79KiNS/u140tDe/aJIRt7KzCXbxdcbox7B3lgv6A0WG/ppp+OeurhFQAAIfkECQgAAQAsAAAAACUBLAEAAv+Mj6nL7Q+jnLTai7PevPsPhuJIluaJpurKtu4Lx/JM1/aN5/rO9/4PDAqHxKLxiEy2AMqm82kASKdUqPXKo2q32K7XtQ1rv+SySIwem9dsS/rNZLbn9AT8Xs/X73y9v8zX9zd4FRjYJUc4Zyj4lKYIyIindAiJJdlohGlphTmp6cnp6AkHSipKSfpmqoqapLo6BFvlWjT7KHRLWyury5Xrm8gLFKwWVCw1DIws7MOsfPy8XAz9w9zcc11NTD3dvZ31zS0NHu7bS16uE0x0ja1+o2urDW9+Op9en9PKKq6/H+oIvX87GKVCRnAcroPsEhILMAXipYYOK27wZzFjhXP/Gju6kecx5IRbIkuODGgy5YN7Kls2MOgypoNPMmsyiAMRp82dPHv6/Ak0qNChRIsaPYo0qdKlTJs6fQo1qtSpVKtavYo1q9atXLt6/Qo2rNixZMuaPWspDFpRsdYSyuR2T6W4dCTRXWT3LhuUer/w6+uFJWBEggd3Kmx4FN/EijcxPuz4MZS/kp0srsxwLubGcDc3MeS5UOfQnI2RJvFOhdrTIdqytjz6NTrQstvlzFs7GuXcBWfxzgbyN8DgwmtgLA4jH/IXypcvae5cNfToJ9xRBzPwuvTs2qtz727COvgU4sej+G7+DPr0rRGy9378fXuK8lHTr2+fOP78u/eX//Dt33n9BfgfbgRuF9uBAi6kYHI5SZRagxJOSGGFFl6IYYYabshhhx5+CGKIIo5IYokmnohiiiquyGKLLr4II1IRxviSazTaAdONocx4IkkucrSiez1OB6I7PG5o5JEZJpmMiExGFOKTTX4oJZQeVjllh1gqKeGWWWroJZcKhqllmGISSCaHZp7p35plbvmml2qaGWeVV8pZp5R3wrmnnlRiWaSdUfo5aJIkPlmioSaWt6iQKMaXqH7CJcLmfJfxFocYMVyam2Yr0IZcZMzdlkylniHGIoA/+tiipI8CmaKjQ94XqayHEvmnrSMyuut6heoaKK59Qjosrb0KOyewv/8aeyysszrbKLTPqhokq63CQuOA1xqYLag34sjgtzc9aKq45p4rFE6lomsHqeHq6G4pOmr7qrUqMtustE76WiyxyfKaq5H5CrwswQEjejCTCSP8r6ANEwpmmg9DjIS6615FZ2aaVuWmQDlGlXE7qCrV8WycyiixbtQyFbJCK5OMp8uuHpWyM8gCVbM9/g7Fp8z48tyzzQCjTLHON/sEqM/KEuWw0IouxbA1UcM8dG9TJ2WwyllDze9wCkO1s9dPOxW22FVzjW0/W4N9stZnN8Wtx19blem7Fc/NlU4TjV3w0kiuHWzXE+sbOOF9vxytvfUivvjI9zqe6sffeopu3bcMsYt55ppvznnnpBUAACH5BAkIAAEALAAAAAAlASwBAAL/jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNc2CwT5fvf+D7QAhsTiUBdMKpc0o5OIZEqn1M/zaqxqt9wH9gvtisdSsDlHTqt75/P6DW+13fG6XTRv3/d8TF7fFyjo9Wc2eIhYCIjI2KdI1xgZ9wgpaZlGaXi5OZYJxgnK5fkVWko1imWquoR6tfoK1PoES3sj61Sb23R7pOsLwxv2O6wSTHy8Yoy8XHLL/NwsCz0dgkp9DeKJvd2Ryf3NURgFTu63WI5+seOKlu6uweOIFP9eX0Habq+vkLfvf6Donz1vAt2NKkiuFUJw0hZi4+XwGsSI0ILlO8TjIkUK/xYZHZm1cYJFjXwqhWwwkmSdOSchpBT0pyXKkY7EyeT3smbMmwly3iHI04DPn4+CAqS5h5LRo8qSKl2qo6PTokuRTqVqVOpVm1An6twJNWrDkk/Djv3aLyxToDDBqhVbFmPat2u5yjVJd95cSXjzwu3r8W8vvw7wmcpImOO8xIwbO34MObLkyZQrW76MObPmzZw7e/4MOrTo0aRLmz6NOrXq1axbu34NO7bs2bRr276NO7fu3bx7+/4NPLjw4cSLGz+OPLny5cybO38OPbr06dSrW7+OPVQ8ldlNfOLePVxM8OHvCXZDvnwEa+rNKWwvsmn1dVDSW41OnxTOoc7d1v+VzxxWKdXXnDbnaaXcQQMWsdyCCB7noFfGRfjgcBQCKNyFFQKnoYQWdugMcSB6GNyIZ5VoInsipqhihiweVNyLBn4oI1Yr1hhQjDjaReOOLEHo4zk6BgkYikSmkuCRSDaoTYQFzuhkfwIOiN+Brixw33P5paLShtBt+dF6J8LnUotk3qNUemdiaeWSa24g5Jvh6DWOnHbeiWeeeu7JZ59+/glooIIOSmihhh6KaKKKLspoo44+Cmmkkk5KaaWWXopppppuymmnnn4KaqiilqfmooYxOl6iAZV6p5l/jqknhnhm2Sp/di44q4O56koYq2toqBaXgQBbVZxvgBgUj3D/dMhTXGqMeNOMvyJ7kqtimFjte5hAuxGJonBLUYjbUhuRl1VgG66sWqRYrrmngLuQrevCG6+7ZdArkLxb4JsvrfMym6699wLskL7nElyvv/temK26/0YZsLddMBySwgvz2q3AB1Mpk8TXctyxuMta3K61zzocsbR2eFwxjEm1+aNZzpLFVrDi+DpuPzh3C3MWlsTcWJGBfUTPsBhFhfTOlIEZpqNAI2rjoCoDqu2r1ihNqsh7akwmyWeCXKvBXYMtJ8RlY3w22mtSeCvbbas9ttlfu502rnXbfbfY4dGdt9dZk/0m3GsD3jesgfsdt9axsvy2yXlWHajLUkdt6F6KDDItjKSIjcp5598UAAAh+QQJCAABACwAAAAAJQEsAQAC/4yPqcvtD6OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofEovGITCpVgKXz6QRIp1Oo9cqjardNrPfb4oqlgS74jP6M1+S0+21hy83wuj0xZ9/39vycD5jm9xdYeDWYZ6gYhSi3+HjUSAhJGSQ5WZmpc4mp6WnDqfc5ShPqSIoKYzqW2hq2yuoqewIrNvvTRCVYu3W7I4rF2+ubkxgsXEV8M3iMTKcsg+jlDF0j2cxbPcN5KKxdet1d+x3NLW5KXn45jZ6uah5ctu4eE/oFT+/SDsacr97o5s8zf6/CvamSjKA1gwobPmDoMCIDgBIrLpBmMaMCY/8aOxrIFcujyAO2Rpo8iTKlypUsW7p8CTOmzJk0a9q8iTOnzp08e/r8CTTok4FCXa0pmqof0kog/SxlOu9poVVSp1Ktuicb1jreth5E5jUg2LBonBElO9Qs2ntmz65N0vYttrFyGcWtm1Yt3iVt2+xVcvcv4MCCI+ktjIQwYiOHFzOm69iw1siJx1GGC+sy330vurjVHIFzik6gQ0NEQbG0BIyj8amGcGpF5ter5YEsaJk2Lsi6NzXuDarvZ+D6hBMPLnz48dbJlS8v0VzXc9zNpxeP7tc6c+zOtXPgLt27CfAJxZMgX958CPTZ1ath7/48/Pgg2Len/30+/g72u+//N03ef++hJyB/BBaYX4AIJsjdggxG5+CD1UW4AXgUVojdhRIqpuEFE3aIIYcgeijiiCTyZmKIs6U4oGgsGujai/WdJuN6th1VIxMf3eZfjj7+CGSQQg5JZJFGHolkkkouyWSTTj4JZZRSTklllVZeiWWWWm7JZZfi9bgljl6SxFGXqWVpD5YuSpnblG1CiWKT1EQ555O/MVkiknka2RecexLZp5PGyflnkYHiWaiHZSwKJnCJruZIo6o9+hBr5tWJwZrPYXpimtrFCelk1nXVqaibrhjHnctdleqho8Y4wYevntnqoN4plSmEX95YkgYWxtfUojDqaqiCgBo7pH5B/yq7LLM/2nfsgUJCmyy1zUp7LbJAWpvtr9M6+6y23RIbbYbFNqinuUequy657dqqJLxLUvotqPGaSierVGq6L61aNtXrmBsxKnDBBh+McMIKL8xwww4/DHHEEtfW8FGSCsprSGZaqmZUV+rrJsj5olrVxUWQihTAupicBcpB4TqYvTl5XJnMNvErBL0uvTmEqzPjm7OqNXnD8jtCz3R0D/IOnfQvOqe0tA8+05QcEVMjXXXPT5sk626cUu2u1E23FLbYNu9cttJnk512y0DLhK7WPGPNriUi39y22bAy3XXQe4Odt9cc/9y31TDvVHfNGvuUOFy2CZty1vdGfe7WMidS/u7a1X49r+aV3y0oyWx62jGNVQ7OZWwJezZx666/Dnvsss+OUwEAIfkECQgAAQAsAAAAACUBLAEAAv+Mj6nL7Q+jnLTai7PevPsPhuJIluaJpurKtu4Lx/JM1/aN5/rO9/4PDAqHxKLxiEwql8ym8wmNSqfUqvWKzWq3XEDA6+WKxxaA+Ywmq9cJtNvNjovf9LP8fq3r8fyp/t8XyPS3J2iIRFh4uBiUCNjF+OSoaEUYiThJVzl5aZSpSfVp1jkkCidlmkb6k2oX1aq6ygOLCusqO9v6ahuLi5Nay3vr+2sKJfxGnCMajDyqvMx57HwKfZPoR91rbVNXpb3NfY0FHi5+LlE+jM7uoL7eHq/wLl+/8P5sr/+lvu+P708fvYD2BhKsV+6gQHAKF1JrWPAhxIjCJu6raPEirYz//4BxJMjso0JsIjOCGRWmpMqVLFu6fAkzpsyZNGvaHEfpprVPOolt7NkJI9BFEof2YWiUj8GkawAyZYMv39MuUVNO1VIV3tVQWaVu/dbV69ddYa2Obdb1bLayZtUOYqvVLSa4ciXBFVv3yF28eYvsbdvX797ASv4CJtxoMGK9ihcLvuvYU+PIQiZTrgz5cim6momw7fw4LWjPYUdzODyitOkyOVNXXV0hU4mssNMZc720doOfIvrpfsCLRMLf7oSG0Ea8OLLZwZPvLipcl/Pn0KPLnk4dOYqToLADH+7dh+/wucaTj2b+/LXc6ms4bb8+PfwZ7+fTqG9fBv78MNjz/+8v338uBCjggNoVSN+BCOrnzILuNejgg7ZE2M2EFMbH04XoSaOhDo50CEQyII5IYokmnohiiiquyGKLLr4IY4wyzkhjjTbeiGOOOu7IY48+/ghkkEJ2wF0aqA1pG4dIRsDbkgwY5+QBDR4JJFJREvhjVEi+NiRtQYqWpWo+ftYjZzxmtiOaOVp2I5s2/pWmmzTCqSOda8o5o5046tmmmnvimaeZdwo6aFllknmomGcqmiiXVTr6qJZd+heplUuCdyWEUbbR3Kb3SOfpPfwoGao7oyZDZYRFxlVqdo+0qhypsBoA6qyn3jbrcq1q6qmCmVa3paWXYjqpsMUa+yWWjf8Sm6yycVI6prOLSlsospX6KiS0YVp7ra6bctust73y+q24pVpo66rX2UprSOwioG53785zq5Hz3otvvvruy2+/MoLxRcD+tmuJvri+2+S5ne5qrpPYBgtutBFPy+y21P6537IX1wimxRk/CynFkno8ssYf+1WvW4xKRtJUhs4l61Avh+auUSsnlnBPN7OysM4d4wylTj+HCKxNQ4v3sNElA03uTSHzPHFMJ5cXNUza7nC1TBtXuLVLVRfTtddNYxZ2Sw2TXTFQPZNWttUHM9a21B+mynTST3lDN9pfY7x3n33zPXa2dgseOMRr/4ourInnWqvi9baMb8yRa5L3wJYNX4555ppvznnnno9VAAAh+QQJCAABACwAAAAAJQEsAQAC/4yPqcvtD6OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofEovGITCYBAYCzqYxKo86q9TnNan3XbnULDs+8ZLH5nCKrmei2m7NWv+d0Slxez+sRd/z+T9dXBkjoJjhYmBh26KXoqMXY9Tg5FXlFiYlk+ZXZSbTJ6Sn6AzpqymV5qrqzueqaw/gqa3M4a1tzd6tL07jr+wscLDxMXGx8jJysvGwkx8YMvRAZTd1UWp0MeoltrL3NHeyNCK4rPk4uwXT5nGe+hh7R1+7uBy89bUj/bp9w3aYfhx8fbWgABhTo7ozBg/boiVnIEJ2+hxD3kTMIpqLFi/8Yt2ishw2ix48gqYmERLIXuIooU0ripjGLy3MmT1aa+a3aR5k4raxkebNnKJ1Agwr9WZSKUHYhbUpZigWm06dHOS5s2VPi1ZFZtQJchLNhR64u+X0FW9asQzMzBVoT94+kWwPm4sace8Cf3alzUwXairefoD0YmQbOW8ZwHYeKD/ejVNexLYKSfdVqXHmWukaYM3v+DDq06NGkS5s+jTq16tWsW7t+DTu27Nm0a9u+jTu37t28e/v+DTy48OHEixs/jjy58uXMmzt/Dj269OnUq1u/jj279u3cu5Po7F3H5pLhacUqb14v+hYJ17uY6D7N2fgmktJnoA5Kurv3B27/vLdTf28NBqB97rWiQFvxeSNYWuhFRpeC5a01oFwTwtdVeF9lyN1VVXVYWFjdQQXYdiTOp92JKGanInwptkjhizDCBeKMDNZoo3rX5UijiTwiiOOPtXgnJD4jhijhkROJqOGGDl7YXpJNQlghX1DqaOGClCVo4IF+JVhlewKGSR4fZG45JmJl4idmmtJAAV4DVLpZgo501nmmSneyMJ5Pce4JaKCCDkpooYYeimiiii7KaKOOPgpppJJOSmmlll6Kaaaabsppp55+Cmqooo5Kaqmmnopqqqquymqrrr4Ka6yyzkprrbbeiqtZ+rWaC6pGhopmpz1uGmOmK1Y6lqVW/44myZ9KLZsZgWx1Ge15GQX4WbBU8Vettkuk5NmcSjx5mIvjkouXuZqg29exRTCZbrLrgltuic1IiRC0QcDbrr2f4KuWv++yK5a+pBBcsMBDAJywvANn2a/BQNAbGLf3YlsxtQtjnLHDR3AcsbsfSwwPyfsqHHKx54ocr7rbiluZy0bdCJrMM38pWpsU4cwszQUNmZq3CuW5q2o86+GsaX3+Z+qauT7N2tJD+SpPqUACe7WwPhMLs7Iqe/31pB6LPTakJiuqcaMWS5o2o2ub3faiID/6Nt1xy302onejnfehfetdNtw2kx02pYUjO6ymUlv7qZ2cHi2qPEk/3izUlghfjnnmmndSAAAh+QQJCAABACwAAAAAJQEsAQAC/4yPqcvtD6OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofEovGITCqXzKbzCY1Kp9Sq9YrNngDcbgCgDYsz3bJ5jE47wOY2Vw1Xu+fvuNz9ndLp9vC+DfU314clyMdkiEdIlXiY1Ai4GAX590jpJfl0WWm0WZbZ5MlZJAoGqlQ6KlR6ipqqGsTa2vkqSCQ6e1RrO4Sbe7vLu7r5CxwM60NcPHyMnEy5zNzsKO0cvTNtaCx8/Zy9p0vd7f092Pn1aToOVA6+/q7R7g5PTyEvXp/PcG+u79/AT9G/gQcCRiKIEJ1BTAkHLmTY8N9DiBHzTVRX0d/EjP8SH3J0uPAjyIAiO/IrOVIeSpPtVqbM5pJgy5gvd9FMOO0mQja1dEZ8lcfnT19CM14qutIaUpcYlzp9CjWq1KlUq1q9ijWr1q1clzTtWtPLV7DjGpFdB23s2VPE1K5dlOot255yJdmsC/cuXjg599455vcv4MBivhEuDPOwlnKKszBufOUxZEaSJ+sxbJly38yXE2/Bx9kDZhOQQoPwLIKo6XibQwBdTabZiGCwY9NOPbi2vdunW+uWoPfDzN/AXwsfTjxCXNcqkxdX1vue8wnQcJ+cTp0bc5LYgSv89Jl7dx4ex5Mvbx7HxfQ61rO3cdHt+xbx59eob38G/vwx9vP/f+HffyzEJ5+ApLlnoAsbJaggggyusOCDA6InIYQGVdigeBiqcOGG9F3n4YTIhWhhZSRyaOKJKPqmYom8tZghXTD2t9yMNKhmo36l5XgeaDyS92OQQg5JZJFGHolkkkouyWSTTj4JZZRSTklllVZeiWWWWm7JZZdefglmmGKOCQFPQZGJAU8+ogmQWWw+4Mmb++Aop3F1yshmbmjqOSaLYPrp5WhiovYnoYGm2KWgX454KKBbMpqooY06qqWihcpGJqVcarrpi3sG96mdb4qKQoEnylLqPDNCV4JZpkq444GlvVqhUsfR2SIbZ6ZKap+gZsrnpcEuKmmnlhpbbJbS/xELKZYgItuslRpW+qyy01q7LLSIXtkhtdVi25y2xzobrricUpntpOdWWa66njKLqa/DCtvroHiOWqOcBbGqbwLV9TunrQAvoCutAx+McMIKL8xwww4/DHHEEk9MccUWXwyVwQoLDLCbDPPbMch3oqrvvcCaLC/Ka/VjRbxnJdKyy12pCbMUyV7VViA3U5UvIjtLpXI4P2ccNClDP/Wu0EcjtS45Mlf1NC1LFzV1j00LNW4vVfuUdTVJA92110UTfbXVX0e17Ta/8py21mejHbbYuEK9tdlzs1233UfNnLfesW4Vt9F7k1W22zUTXrjaLK88byDf1YFX1PbWOznJIxzfHeq/CA++8eEPq4px6KKPTnrppp+Oeuqqm1YAACH5BAkIAAEALAAAAAAlASwBAAL/jI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuCx9ATNf2jcvAzvPBnAsKh8THrIdMAovMptOljCqf1Kp1I80ir9yuV6ENb7/kclGM3pnX7Fr6vWzL5yT4m47Pd+xwvf8vwWcHSFiIIDhoqKiHmLj4KNfoCEn5JdlXmel1OanpycTZ+TkqFHpHihpkepra6raa5ir7Ahs7e8tSi0Z2pIZrqau1KfXLFSxmHFZsdSxchbnc1EzMzBp9Nh31DH1NlD21Ldp9850ULj5uU95zzp2Os+771PheGl8tWK+63u6u//rtCr1/8LIJRERw37SDfBLmWJisocOCuoD5m0ijokVb/xgfwiqDriMMU2w4ilSIMFKWk6Dy4dEWh6U3k39iynSy0ubNnTx7+vwJNKjQoUSLGj2KNKnSpUybOn1qDCpQZVJPXqw6LiXWd5y2XiPpddnHsLOCkXXV7CwqiGpHGWybqRzcuAHnQrpnd1E8nXnz7O1raC9fwHMEDya8xvBhxCAFM2Zk+PHLyJLpUK7cRjFmlZc3N3bsuSTo0J//kjYz+jQv06pL12298TXs2G9n0zZr2/Wx3KjZ8l69+7fuVcJFjy3emzjyzKGWF5bk3K/L6BqoZaRJ3cIuNz+sZ78Q8jvwq+KHaS1/mzz6eV3XR2zvvh/0+OyV05dW637L/Ppn8v/vb89/AHqk0YAUCWjgdQUmqA5uDAKE4IO0LCjhSBRWCMWFGLag4YYrROghh/aFOGFzJCp4yYkQTqciihK16KI1MK643YwHrmQjNuYslmOPPv4IZJBCDklkkUYeiWSSSi7JZJNOPglllFJOSWWVVl6JZZZabpkgj1xW0As4X4KH3ZgNsGgmGAOlmYCJbBoAVprEeUkliFgG9yWeWfp2J59W+lmlXH0COqWgVxr6p2yBKlooP4cy2mhtiUq6KKV1Wlqpno+mpSWhmdo5KaifujmmqIPCxyapIR7xQ6sqpHgiVSiguaF6e3RX46rhhSAMqySedwKrvrYI65twopqqqqX/xmmmqaEyy2WHmx4XrbTPjtipg1tqeiq122qbrbWXOhupt9+aGy60eWJbLbvrItssvMkCa+yaxra565sy3nsmMXTyC2d3rgJMcMEGH4xwwgovzHDDDj8MccQSP+Lvw7kinK+ctOpr773yLlvsvB+fqyzJJaer7p7ijotut+5O+zLMMbNMbpTcunxyYQM/drNx2hAGrs+y5rXye2WeVbR8R4dVs9JLe9VyFzlvNbPRHSM9stQpk5U1Q1szffV4U0P9InNRg71vcmdjndNkTVONKzv/Wv31qHXTXHW5a0vZs8x36/034GPbHXK7eeNd+Ltdq7w4zhuDTC/Hj9ebscZPEfMbpncNhynwxJ5/DnroRRUAACH5BAUIAAEALAAAAAAlASwBAAL/jI+py+0Po5x0gQCy1rX7D4biSJbm6WzqeqHuC8fyTEvsrdb6zve+jAvmfsSi8dgTKjfIpvMJnSynmaj1ii1St62s9wsecbfhsvmcGlPR7DZYzXXL5034mI7P6+x3vf9/wtcHSFhYIRhnqLjIgJjICMno+BhZ+TdJaalJh0m2+TnX6QlKeia6Vpoadjql6urFuvQ6axWrRIvrZCuU22u0i+Mr/AMcPHxcU8yCzDyjvNIcDfPMJG1tQs1xvS2S3cUN7pEdTt5BXW52UaWO9oz+1bpa/I6lJr9LHyX4Fpuv7wiPlT9dnQIWHFhHlEGACI/YWminYcJ+EDNJJIbvHqqL/7/mlZHFEcm5NuwglSw1MqQ4Y5/GqTzEa5O3l1I2RvL2jWaDUSZx6nwwSJLPn43s9ZxJ1IJRoUOTHuBz1KXTpxEX4dQ2FUNVq02zQmWK1OtWQ1erZNUKJ2pKsUu5hj07lmxXthYLXT2LIChYd3gN6HXLty9VkJakCkYbBNTaw35ZygzMOIG6nIo9RkZm+fIwYJqbPewc7RRoaQpHW5tketu+1ODasm4d73W+HJRl276NO7fu3bx7+/4NPLjw4cSLGz+OPLny5cybO38OPbr06dSrW7+OPbv27dy7e/8OPrz48eTLmz+PPr369ezbu38PP778+fTr27+PP7/+/fz7+///DyAKMQWIUWwE7vHXgS6spuCCiDQoIGoQroOBOaUFeIsNovlXl2QC9eeaAp/p95WIGd33oFIj2ifhYCvSh4mHnNV3IWTy1agMjRvaCN+Hi73XD4/uPfRje0TmON+RSMan5Iw3UrQkk1Bm1uOUTj6545VYHtTYi1JeiNiGOoIZJpdjtpiXmCya6SKaKLqZJpxvplgUQ/vRmUaJHMaVZ4L8hRhBh3vaBFOGELa5TAnsmHVoIxUy2mikkk5KaaWWXopppppuymmnnn4Kaqiijkpqqaaeimqqqq7KaquuvgprrLLOSmuttt6Ka6667sprr77+Cmywwg5LbLHGHotsssr/YjrZScg1Cykphg5HmCaC4nYtIGn5BighemL7rbYMgsunH3KaFqO354KW7iXtskYmJ/Gyy6a88172IR4UoatmKPmO9q+//WrmJUkBE7yvwANHVnA7DR/2sCkH45uwHBH3dfFHEzNcsRsdU7yxwwuDXK/HITN2ssjvAjyyySuz/LK9dsJbssJ40jyzu+PKlrPO5b62s7rb6hauXNkC7afR1f5GaGEDEjctSo82t+iyVl+NddZab811114rUhuuidnatKtJn/qzqTervXap64Ja86f3yj03pylr+nGneW+aMbN3X3oi3X9b2jfgg1daOOGHI74443HrXbfdj3s6OeU9EpN6OdtDs7p5q0enamCtiTpVAAA7\')'; + + return { + backgroundImage: backgroundImage, + backgroundRepeat: 'no-repeat', + backgroundSize: 'contain', + height: spinnerAnimationHeight, + paddingRight: spinnerAnimationPaddingRight, + width: spinnerAnimationWidth + }; +} diff --git a/packages/component/src/Styles/StyleSet/TypingAnimation.js b/packages/component/src/Styles/StyleSet/TypingAnimation.js new file mode 100644 index 0000000000..3e473f9946 --- /dev/null +++ b/packages/component/src/Styles/StyleSet/TypingAnimation.js @@ -0,0 +1,15 @@ +export default function ( { + typingAnimationBackgroundImage, + typingAnimationHeight, + typingAnimationWidth, +} ) { + + const backgroundImage = typingAnimationBackgroundImage ? typingAnimationBackgroundImage : 'url(\'data:image/gif;base64,R0lGODlhQAAYAPYBAOzv8evu8Ort7+fq7Ons7ujr7eXo6uTn6ebp6+Xn6ebo6uzu8OPm6OTm6OPm5+Tn6N/i4+Ll59/i5N7h4+Hk5uDj5evu7+Hk5d/h49PV18PFx7/BwsfJysXHyMLExdja3Nfa28vNz72/wL7Awc/S08TGyMDCw9TW2NbY2t3g4trd39bZ2szO0M7Q0dnb3djb3Nvd39ve4Nnc3dze4Nrc3t7g4tzf4dXX2d3f4d7h4tnc3tve383P0MrMzs7Q0sjKzNLU1s/R08jKy9DT1NfZ293g4efp68bIyby+v9bZ27q8vdHT1c7R0uvt78nLzM/R0tjb3ens7bO0tbS2t7GztK+xsrW3uK6vsLe4utfa3L/Awtzf4MnLzamqq5WWl66wsbm7vNrd3uXo6a2ur6yurp2en6KjpKusrZ+goKeoqers7urt7peXmIGBgYSEhHx8fJmamqipqnZ2doqLi8XHyY2NjpGSkpOUlJiYmZOTlI+QkJqbm4eIiJucnIuMjP///yH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKE1hY2ludG9zaCkiIHhtcE1NOklu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\')' + + return { + backgroundImage: backgroundImage, + backgroundRepeat: 'no-repeat', + height: typingAnimationHeight, + width: typingAnimationWidth + }; +} diff --git a/packages/component/src/Styles/createStyleSet.js b/packages/component/src/Styles/createStyleSet.js index c397104b98..555d292e4a 100644 --- a/packages/component/src/Styles/createStyleSet.js +++ b/packages/component/src/Styles/createStyleSet.js @@ -23,6 +23,7 @@ import createSendBoxTextareaStyle from './StyleSet/SendBoxTextarea'; import createSendBoxTextBoxStyle from './StyleSet/SendBoxTextBox'; import createSendStatusStyle from './StyleSet/SendStatus'; import createSingleAttachmentActivityStyle from './StyleSet/SingleAttachmentActivity'; +import createSpinnerAnimationStyle from './StyleSet/SpinnerAnimation'; import createStackedLayoutStyle from './StyleSet/StackedLayout'; import createSuggestedActionsStyle from './StyleSet/SuggestedActions'; import createSuggestedActionsStyleSet from './StyleSet/SuggestedActionsStyleSet'; @@ -30,6 +31,7 @@ import createSuggestedActionStyle from './StyleSet/SuggestedAction'; import createTextContentStyle from './StyleSet/TextContent'; import createTimestampStyle from './StyleSet/Timestamp'; import createTypingActivityStyle from './StyleSet/TypingActivity'; +import createTypingAnimationStyle from './StyleSet/TypingAnimation'; import createUploadButtonStyle from './StyleSet/UploadButton'; import createVideoAttachmentStyle from './StyleSet/VideoAttachment'; import createVideoContentStyle from './StyleSet/VideoContent'; @@ -74,12 +76,14 @@ export default function createStyleSet(options) { sendBoxTextBox: createSendBoxTextBoxStyle(options), sendStatus: createSendStatusStyle(options), singleAttachmentActivity: createSingleAttachmentActivityStyle(options), + spinnerAnimation: createSpinnerAnimationStyle(options), stackedLayout: createStackedLayoutStyle(options), suggestedAction: createSuggestedActionStyle(options), suggestedActions: createSuggestedActionsStyle(options), textContent: createTextContentStyle(options), timestamp: createTimestampStyle(options), typingActivity: createTypingActivityStyle(options), + typingAnimation: createTypingAnimationStyle(options), uploadButton: createUploadButtonStyle(options), videoAttachment: createVideoAttachmentStyle(options), videoContent: createVideoContentStyle(options), diff --git a/packages/component/src/Styles/defaultStyleSetOptions.js b/packages/component/src/Styles/defaultStyleSetOptions.js index ad42865087..8c1b01458a 100644 --- a/packages/component/src/Styles/defaultStyleSetOptions.js +++ b/packages/component/src/Styles/defaultStyleSetOptions.js @@ -102,6 +102,15 @@ const DEFAULT_OPTIONS = { failedConnectivity: '#C50F1F', slowConnectivity: '#EAA300', notificationText: '#5E5E5E', + + typingAnimationBackgroundImage: null, + typingAnimationHeight: 20, + typingAnimationWidth: 64, + + spinnerAnimationBackgroundImage: null, + spinnerAnimationHeight: 16, + spinnerAnimationWidth: 16, + spinnerAnimationPaddingRight: 12 }; export default DEFAULT_OPTIONS diff --git a/packages/core/src/actions/connect.js b/packages/core/src/actions/connect.js index b650f364c0..a0795c2780 100644 --- a/packages/core/src/actions/connect.js +++ b/packages/core/src/actions/connect.js @@ -4,7 +4,6 @@ const CONNECT_FULFILLING = `${ CONNECT }_FULFILLING`; const CONNECT_PENDING = `${ CONNECT }_PENDING`; const CONNECT_REJECTED = `${ CONNECT }_REJECTED`; const CONNECT_STILL_PENDING = `${ CONNECT }_STILL_PENDING`; -const CONNECT_TIMEOUT_COMPLETE = `${ CONNECT }_TIMEOUT_COMPLETE` export default function ( { directLine, userID, username } ) { return { @@ -23,6 +22,5 @@ export { CONNECT_FULFILLING, CONNECT_PENDING, CONNECT_REJECTED, - CONNECT_STILL_PENDING, - CONNECT_TIMEOUT_COMPLETE + CONNECT_STILL_PENDING } diff --git a/packages/core/src/reducers/connectivityStatus.js b/packages/core/src/reducers/connectivityStatus.js index a3053d587f..8df27e5ceb 100644 --- a/packages/core/src/reducers/connectivityStatus.js +++ b/packages/core/src/reducers/connectivityStatus.js @@ -3,71 +3,44 @@ import { CONNECT_PENDING, CONNECT_REJECTED, CONNECT_STILL_PENDING, - CONNECT_TIMEOUT_COMPLETE } from '../actions/connect'; +import { + RECONNECT_PENDING, + RECONNECT_FULFILLED +} from '../actions/reconnect'; + import { DISCONNECT_FULFILLED } from '../../lib/actions/disconnect'; -const DEFAULT_STATE = { - status: 'uninitialized', - timeoutCompleted: false -}; +const DEFAULT_STATE = 'uninitialized'; export default function (state = DEFAULT_STATE, { type, meta }) { switch (type) { case CONNECT_PENDING: - if (state.status !== 'uninitialized') { - state = { - ...state, - status: 'reconnecting', - timeoutCompleted: false - }; + case RECONNECT_PENDING: + if (state !== 'uninitialized') { + state = 'reconnecting'; } - break; case CONNECT_FULFILLED: - state = { - ...state, - status: 'connected', - timeoutCompleted: false - }; + state = 'connected'; + break; + case RECONNECT_FULFILLED: + state = 'reconnected'; break; case CONNECT_REJECTED: - state = { - ...state, - status: 'error', - timeoutCompleted: false - }; - + state = 'error'; break; case CONNECT_STILL_PENDING: - state = { - ...state, - status: 'connectingslow', - timeoutCompleted: false - }; - + state = 'connectingslow'; break; case DISCONNECT_FULFILLED: - state = { - ...state, - status: meta.error ? 'error' : 'notconnected', - timeoutCompleted: false - }; - - break; - - case CONNECT_TIMEOUT_COMPLETE: - state = { - ...state, - timeoutCompleted: true - }; - + state = meta.error ? 'error' : 'notconnected' break; default: break; diff --git a/packages/core/src/sagas/connectSaga.js b/packages/core/src/sagas/connectSaga.js index 3aa3e4d91b..b59953063e 100644 --- a/packages/core/src/sagas/connectSaga.js +++ b/packages/core/src/sagas/connectSaga.js @@ -1,5 +1,4 @@ import { - all, call, cancel, cancelled, @@ -128,14 +127,14 @@ function* reconnectSaga() { if (connectionStatus === ONLINE) { break; } else if (connectionStatus !== CONNECTING) { - throw new Error(`Failed to reconnect, DirectLineJS returned ${ connectionStatus }.`); + throw new Error(`Failed to reconnect. DirectLineJS returned ${ connectionStatus }.`); } } } // This is similar to behavior of redux-promise-middleware, but using saga instead of Promise. // We guarantee PENDING -> FULFILLING -> FULFILLED, or PENDING -> REJECTED. This will help us simplify logic in other part of code. -// Note that after the saga is cancelled, subsequent call to put() will silently ignored. +// Note that after the saga is cancelled, subsequent call to put() will be ignored silently. function* runAsyncEffect({ type, meta, payload }, callEffectFactory) { try { yield forkPut({ type: `${ type }_PENDING`, meta, payload }); @@ -163,7 +162,7 @@ function* takeDisconnectAsError() { function runAsyncEffectUntilDisconnect(baseAction, callEffectFactory) { // We cannot use saga cancel() here, because cancelling saga will prohibit us from sending *_REJECTED. - // Without REJECTED, it impact our assumptions around PENDING/FULFILLED/REJECTED. + // Without REJECTED, it impacts our assumptions around PENDING/FULFILLED/REJECTED. return runAsyncEffect( baseAction, function* () { diff --git a/packages/core/src/sagas/detectSlowConnectionSaga.js b/packages/core/src/sagas/detectSlowConnectionSaga.js index 41796843b8..d64e026017 100644 --- a/packages/core/src/sagas/detectSlowConnectionSaga.js +++ b/packages/core/src/sagas/detectSlowConnectionSaga.js @@ -1,16 +1,18 @@ -import { call, put, race, take } from "redux-saga/effects"; +import { call, put, race, take } from 'redux-saga/effects'; + import { CONNECT_FULFILLED, CONNECT_PENDING, CONNECT_REJECTED, CONNECT_STILL_PENDING -} from "../actions/connect"; -import sleep from "../utils/sleep"; +} from '../actions/connect'; +import { RECONNECT_PENDING } from '../actions/reconnect'; +import sleep from '../utils/sleep'; export default function* detectSlowConnectionSaga() { for (;;) { - yield take(CONNECT_PENDING); + yield take([CONNECT_PENDING, RECONNECT_PENDING]); const connectivityRace = yield race({ fulfilled: take(CONNECT_FULFILLED),