From ede422b937bec685192a46c8c7d80ea2d8452f4f Mon Sep 17 00:00:00 2001 From: biswassri Date: Sun, 13 Nov 2022 22:58:14 -0500 Subject: [PATCH] Add Twitch OIDC Provider Simplify Twitch configuration Co-Authored-By: Sergey Beryozkin --- .../main/asciidoc/images/oidc-twitch-1.png | Bin 0 -> 64234 bytes .../security-openid-connect-providers.adoc | 21 ++++++++++++ .../io/quarkus/oidc/OidcTenantConfig.java | 1 + .../runtime/providers/KnownOidcProviders.java | 13 +++++++ .../quarkus/oidc/runtime/OidcUtilsTest.java | 32 ++++++++++++++++++ 5 files changed, 67 insertions(+) create mode 100644 docs/src/main/asciidoc/images/oidc-twitch-1.png diff --git a/docs/src/main/asciidoc/images/oidc-twitch-1.png b/docs/src/main/asciidoc/images/oidc-twitch-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e558f0e5438fb288757cbfdba992d5f064c3e6 GIT binary patch literal 64234 zcmeFZWmJ{z*Dty(P!tfQB}J4DkuE_51u5w+5$W!3Q4r|{K|;EvI|ZZ#q`SMDJ(v35 z@4Ls?=gZ#bd^?P1JSr^Ky4Q7I*POqa%TG!|1RaeK4S_(QzkDI|8iBYXhCo~Yh|ltp^MNnF*Vkux74xF)itqvXKJ-^ zrG^h4^bq-=XBN6zR{EwUWU~6kx(L~K)?|;F$V9D;;E%^FWXw;v9<#xJj6(=|1cD6l zQb<77E_QXyUKRc10(EmxKMYql^Vxp!{S$e=%x-P!6N!SB=iePEDhxFWbw7Si`uy>M zIU`QVDy2%|H!1zT97`A1-IaIIoGO&<2WL(^4m`14PV+lQ9kEf&8!QQ3dUj=H_JX$s zuakSh|FonI$I;1+ngMSU5GhMZ9;onCcQB%nYlM5!^o|?icbzr@YNy_)s z$mmvYAB&Wt;&p3l>;7B~%xvXipQtEmBV*&luU};de%<+d39alhiJC8|uV zebl<9n`Ik|Ejt-P5*NZ?XVPW$AFBZ|EIS>m^Et%~ExFYnT+ ze8;|Y=~Ap@^y}BJ%~pq)Ib$UL-Jgk1s)bW!Woy%~64*^i-gd>)TRT5{_H1>m0hX z!a^2__+9PfpRt^GX%%vwYHQz@h~@CBt(Q6r99(-US^v28C{9zU+%Td9jZf~93P9d~MMX%Wj(c=__ir%#{E%*}&1 z4=Mg^v{^k0ORt@cnu~(Vln8v5xBjD&?3I-g_j!3e!*Y_6>JLv>e_L{Ja7_NnRCpW~ z^Z7FZ6;3cSi5V6Ka|yRMrc2klwi(xB`~r+z2e5GQC&MWMvO@^>KhS(_k@*|R+jzm z*5B2i0Q+ZG@6d%A7+u*?+< zzQ}4%R6CctUhq-Sa~)HEBHnqEoSu=9WV>Q&3ee_i9v>QmOR{F0I=ow>WOw`rh6<@JDbuAKbUy z#hxqW<>hv8tYH%tZePE8+0MZsNvGvgQjwcmyZJfW#qb#? z#b3U3Pe>qb4kW!8`(Dx*!KjgEHYJFSgTvg5N2ll(#iI8TgXsU3`NPUQqB@N#A<;g^TZNdv9;=sbSXrQbJ2hOCl~S1gpWj z2+^~<3tb5_-QT9n>S8t4)_EFM{w;$nF?31pkls= zVb(#xWmIo`ktr{ZbN7*in~x9I+n?GJjpoyhH_*cW6pL0yk$Dq4)tRtr98ywJ`RM9u zJ|3P=p*M&={QmvBuBpj8Or3|8_<%c6l!}U~wxPiji|UeFaWT%qs?*YversnZu5*r3 z$nT%)Qw<`UdwV)O>C)2D0176Y++%M!j>xZ;sq70aT~VCz$^O{@#rTvl$AT! z(7Xk`yuDv$wKq0ih2Al%`qtF6D=I!X`2Ml&$ai6X-D}sbnORtPBx>EeMerE=BQAY& z5CzHm4<9@V3hrdc$viJM$dHnk$IX@r8&Q!LYIMzd%w@fNOHGZplb@HDueYyHafAr( zkv$6U-*)1{_83)cZ>6y1;oQPPVR@pQtd}b*qjto$&zMJGTF)&ZM{n0U@%Ft~6>P_^30FDNxN)n_nQLqI%$ z_c<#fIW_f*i}U&;UP?aa<3>>#1%-$*wYgv4q$x%#j~Gu+JMS|w-L_pHoiY+bwgzam zbwl|&)hqiM>2i9`X&D(Ao4Y*CN84&Ip>jV`aQU~wR*ywEpyj{;78Gh!6F%-s>&mlU zVWU$jP)xN*`kF93Tudfko^P(QX~#oFOZ!YiBjFb-{euVC&CS!MtvlP><_GJ%@(z8e z;v5zVe7d^2{)DV|z6u9iMLF^Rt5qd~TZ#+c9-`pBESP9BqZ=T%*bXomiqK8eu@3t2NF4&>8=+p zi(?h+v}$CxHGf81=arCp)Lc~8+UZjxU{iQPgRHNwzhgRHsg} z#l=mXrKnC5Ys9Pu*tBaM1R94&N9ObVj{9`*1h+{@$d4V5cL}1|O`D?<{({Jau+=L8 z=M$fZxw~^UG@MRb2MfE&Va3xmS;2-r=>1!ZO5{Jx*~<%=7oSa@rNy@j-_tPr4t+js8V z7X|b}cj&}7-w}mQOiT=Yu^vh?yUA&TV#)4D!3`>_+wAxPC9s;m}Mb9ZEoZEI?wKKh#c4V}yhQ)*OOX-^9{;K=; z?-&Jz{4A+xjLcSxQUhEQhK?mhzi)}PSNo?a!t>%W9M05VbM;%&UiHu)F)D^XZSqWYpEQHGKUEOUJ#vJwUzJjE#xQ2Ks(we}see!pWZDU+d4bs3A%d z@I)!Kn0w4-I^Gyv`ScF7&!Lf#ndX3d`1~%Fjg=@U+2(7?w}t)jF-QU*6&vwsVESSZ z*TRMAwrMD-szqoueVCJykqL<&Y;MMF2_#*JH8^uLF+JHQzD-2b$T@Wd4-n?nt5;t* zr8E9}U6!(nsjyVIvp4QO)Eq4}FLgd)gN-m#=ZX40AV5G^7zOQS%@>Eg)e25^ITDpN?ThyC@k!nt}f-`(w3IdD8|6RnUa`ik%0e z>dwy2u-B&ntZ={%TOSX2>U63yJ2xjFB7*AV!W$WL(D+5*3eB!;(7%0uiIJUMl8X1< z-*@J9YD#U(&hsA{5+?osK$o!oJp%P#2Zn=w<^Kg1_WwUEP|+Vt^FL#{fBn)q<8|2G zbYu^>eP1|Ny-IPx=;>1gMOUr+6(xJv-3M{Xs>O@t!m#vaGQp2_lAeE@T3Vu(QHKNY z&cGm1sqi5aD{I4I&)4oE{XPrU;8TZ(;ue}?S(n{%HwboDf6FW%FD)%C4i|Gje%wp2 z1nsND)K@@UJiB-Jm^O;T{CFm5L20W#xXeFVM+ z%4>CXgGx(4g-b2GiA(=1tRdLo6QDSz6VKhtC$XohE=`6= z7QD?XdlZ=h3>ipK_Oihb%y;Lf_T9g-+eIhxw0H{&3!8FE41UoJh}U>{Tpq|)QCTuR z4LdwMe6MD+GcW$&;X`>X!$1AZ#mOQ-X*vl`|5Sr-ey^p)_U2@rbEV_Kr(z(mlK!Op z7{()n3Pr~>gIP)}S&I3wVd}Z+XB*wo2{Gm6T;U9AJ`=7NaY5%>I*&(3ZDs=b!}A7i zprb$6oRpJ41|$L%U_GXIPw(Jxi$X|*AE!c^#?p-)xV_)eK8aPrreO7hyU+kPt;Tw(8_` zUgAl~&0VoE=C$FIV~E@dC8opZl7J&_;?g}$lOR@VUmq>oq0fBCe}g2@x8__Kl_ap` zMc2=t4a3D9Ce~>Z_7pTUALN=(k9MTeB;rhmI}?=Pw>#r`8CfTQCvHx-PRVuON0ye) z3D3L}=w3De5-~Ooa6DLN>7ALLrp!5*ZW22@j1@)}O&tw#?h_VSIXM6VJ>QL0ZV|n^ zNlR-;MMKlp|0$3(#C&`92Gr&&jOvv_fR_7zv38f5>nJMj*3JIFI6U0Ca=e@WCM)gR zxA%a zn=I-Wg&b9H=ac=Hqw#>I3ws3x1-p};Tgo4&NhVCr%y@$IVRwE?0AkUXZ{OUaSq2PpDx4MPESYIIM*IwcC?Md<8q3>F;OD|2*0SPsJqgh zB{FKSadWDn8`PG3 z&cDi1ExQa1vcAsKcWd=Gi_`J$4Fr&N)Xa~OSpYxCczFZ{B_ZS$L$e}@BRD)UcI{28OQC5OCJsNK5lWeETr*R z5`?J~F}2STEwSE=6cogPB)pAZMKJRLM00S;sk4VBCEYJAFGnt~AvciJ+jw}sZf*#p z-v!rHN=yWxThL^$_hJxp`2*NTigH=HfTCZ#cu`wyST~fXMIoQ1_$gnfrB&5NR20qU z7C{>)gSdK5P7dhAPbDNiQHfJwYr}5ZJUD2{Q8PK*oT4zSlFO7Ac>dfw>>Svf_ITw{ zYzQu}sr#&~I2UJlpVmf7bcXU06^jjU3kbI zi67BFv%h>n^z`(+|MaODwj+~H^DR1!b+l{V8Brz8U0s;2=VhU+-p-&gfWYMqTZ)`& zkuaQ5;}d9-+ROdv+MYiB{jzi#)kM|RE?K&Oh(QAt27P+S>Y}WwLIc!=^(f)piYj;|i#UvHXnHAA2(7 zGV?X-F3W$Bm6wpfSQyIKwlFuZ0~sROq-CVUl-Xp|?&>wQ%%XDl>8Cn%9@iAht*G_j z!NS5^v2k&8geQd-a~YyHLJ@9VgAE%sU0Nvz8sC%QEDE27-d>NrMhei8 z@fg)<6x2ZP(7Pt8J2yM4+3X*s-NI?1l&|gGub=BJNWQ-|;tMGF{TX>`0mxKz>XrC~ zZ#m7YS2D9!SB;>Cph0n1a55HDRwhKjB=_5)XWMF4!&r++9n72SmEcVVjn$)o4pnYhkfLs@_r35>5 zxqr!Scafad6p*skn>SYh1P>I{*9&$;?QoOuly)g2MJQ+@*-uy6AN@DM?}N#@;eXTm znBy~K`{68tvh-3O^oFI664^&Onw@Lt6z9(bBRq0V?b^Ia{F7K$QJJKHg?6zoS+~D7(ad3?&X4!uz1q zw6vR`sDU1!vpFe{WnJ2-pw!y8zqi8P%EKobZ{g{YqXlHGmqosIAbUh{p@a^|pnDWc zoZ=G8+m6Qe2nnST`|E9|mv^9LO`SXM?;)vg`mKqqd+H`84EOKf&(m%ag);p(oSKG4ds%kgb=Sp3 zZwpTQ62}sgUQ=^)w&b-ThKhQEV&`opRCpLSyTd zfx5{$Pw8BB-sI$Dq^n?ec5Gc%Qk;bpFJr95#l>M);{*i!0Bk_&N~dKNDEdE@%RuR` z!pzM9uj04@tY`9U)|3}lSkm^g6><;t)l^l9K*erWOifSs17S!TfL9V3az7xkPU16P z0{g+-2{-slfd?0Zfq?;1=Q!DKmXf9>aZG`>W6jI(D)Pb{LSrJ1CkI zYwKf<+OE3m{pl1A`%ipRQ&C{)u0f^B(#Ym_I(&caX6)45T$7Tp+!8!Q_!E(Lxpj?% za!>x(*__mAKqPNd(1CFG8|xo#VrAi-j#oS1+uGWC2kTz8{N%|KH*arBE32Zdd2yoC zGse95S~x1;)65KH$2_)8%up%8K*1oo4*S+`VGZuJrk_76#PwW*!9ADCc*VwYgQlL&;G^)D#cee#D|Jq zz|AN(@fhA*{RCRZb#!#^^mKjiT!I2X5%o}El$Mm0mGPgvBa42b@6pjg2WaObi`(xq z%SUwd^eHxR3}Dr~2a@?zK>=z(r4TqA@+9t05t5RUR;#V?FWw{f&^I(xF@P?>Swals zK=A%59`oJ5h}Y4Eh0oByU>Yz=*17{Ion8@xFLyU45_(t{rW#O@o!Q^tAAwltj1vJ# zBXgbnnU7}6r!^_LGp=-x%$3JR!$nG~;-4$qY%U%%z55v{^i({X5O}`7n;UIwYwK-* zXu_8f$Wsc7Qa`hAE8AW>t|^P5UbAa3gNdV{ltV`5SPlD($zG3;Yz z-8Na|5(SYEIT3^K?~kaW`8_l=xjFSL>@ms=$WKVkp4J&UW|Aw&h&KZ6u{VRfEu;^E z$@n;*VrAq>3yL{5Ha2o+b8tz#O|B?sXaI0;e#T|#Bnx1`Wb_af7uPvCoY!bb3i@Dx z`8Wf(WcS#N8lg53*zfG@OfA_HftfaIP(wG6d-3ttUe@8>4Q?b>6n3!Ml|dR#r2LO_ zpP^!s;9e7RcX#*Kh2`L|X!K;3{s_=PIFQ8qkz|tD<|Mf=z+F#G0|VtLLmxU&;LO$t z9j9^sw>m$8+LvpWFR_`7zGu-J5^z$2V%xAa6aQ`?D~gJqY!WS1GNE(16aV(@_r%<@ z6AuB#3q{iq<7DRKd;(;n1tPfcG4w>Gndh+AYdLdnP_6f}*{pKNA0O?UC%I}=G?QHE zPZhscTDGP=YIdoKWuIQD0RIZgtx$WF2kA;7M?&-e^m!}a*MIc+B71~n+@gX7y2PT%oE9Eg@LI1!OiQ9oo! z16x84U(0|C&%yDke)(62`CCd!8OkV5nQi-%lMRVdtEKxCYXH(f|0+zK%e|g6Lxx=KRe~T3A9)*EF>bLMf5}- z$eohDOezOF=-Db)$V2gZ0Ez@^`2d07*f4=Yn!gei8TmynGd#8()JsmsOVImX#LmY; zg`^IoK@WGE=37B0T+}%|%w^9H+gn*YInZ#;o;{u`SWUj8TWmUU$-v;3V#tlwcF-ZA zyXm5PNB}5)_l`>NSOqt6snptVJ*HtBdd3~YEHbIl0BSma=f2#G zjJD-rD^O#jJX63X{os5@wH_o(T6%JUV}EZD7b8kzS1Q5dv%BC!mb7r?>MT)PIl9E$ zTufeGwfq&RrZ1dLaim7AZRgs4UB7kfGneJU0c0dvId@W`2u@C^#pUF1z#h@Iu5;QG z-Nx@Jn86aGTO1m_Ul&Q%3mF< z2t$~mKIRhE+b0Fny`|$R55-87;{8JpDzg^@Np#JLb%uuvs*L1=TU%RzN8azl zzL*d*VK{gdr&~c}xuE5`(Ocf}&(=!Zj&HmRZ?adGLlIfJq@>6e3Sf8Xw1uVvE7MHY z)76~X=i z*mzA*NHs3tvmpTW)kfZ>vl@;>3Eb(n3IzeO}1EYNlD48y4OxlJi)=i4{Vxl z-qZ=S#~Mt@D1s$5llUSveSUV5wIeSrjpg959ncrzlPRVlDCp6+hKuG6gcPMVmhS7z zkkoJLRa_u6=v9q~si>f;d^Zx>7_VV=8RfLwyd6%Tc}j5p2F~p*BsXDY{p0+tHReP_ zLF@~RTalGoDUc!0rSl=u0pS3ev`0b`+Xj8HKrQj!Dhwj;W zNPFgU_}zGQWx#bCb=KQQvJ9~;OFJOJAc9&SRM`GjSKY@F}vOfp@8YLg^Q4e6vyk78<&2|^1 z^H+cuOtxZS`swQH>zkuQRaaNX>O#OqzD*|X!=yvWYy0Oyqt9RY?@mfmVT(EutRm%^ z*;Z+J2e46+!>ddaDjML@)|nu&1}|n3%Qx zt=%`#V`)~y=Dpd)uZt574&{r#GVyfmw{BS!a$Zn$wzbt~$QgqDR|m^?M^a2oY`_7G zelv^chGQIM@FmB}YZO@w!hC`HeInxY0G{M`zQ3;9rJa(UO>gr(t)SGUxZ3HcVCa-m zvOrV?q?~wu*SaXzwPEX0%LV@CYFTONoPMR_>SCZ}X5$?o2Vnrg)lG2)?F>Ax>DcRU z8sF!hfM)7m7!y=c!ENZUcX(*`DxODaI^e9tW}(wHR^R|?_|{Z|qn~SjK6C6{hxhj` zWC!3~Ppz+aigvZW@bzqXBX6sU0EsJ1d3~lOkjatlq>`S723nxu?c29&m0JeBZ|fNt zL4hc@TIvwBh49OdkX1Z_8oRAKH*q-%djtIag%+$t(JDR?4)$%p!BH(GJ9!nit z+2X-TdGP1YZhm(kk<$l^q4y3BVnP*slX8Hx4BjA9cdda*qQ|eba%{5nxkliqg5g1|f4 zQZ^k_E06OrkwVT@Gn7t<24bDXbm{S1Pn4LFa@nj> z5xU|N69+&zsBMpg+#a|g6Em~B_jA&#s2Tto|M%85wxhBg#8e>QAT+;*+!NI$G&jNz zoow<#Lqa^Wvgo80LV&JlHTx3`!OKu+fD$s06?9%O(DV_Hx%?zOGgAj_6*Du4AneIyT1Xdd8RyQt2HH?US#|y(ui=4Aym^v?;Zd@Vj_{!~0UT z#$=3ZsN9;C))^dv&CSh82!2qIek@mVG3DgsjFlucGRjJkNK^-fK_E+W>Ffma@L(cl zv2TGrstp)kN+Uzj)2*X2#{-k7Hrk-*=r+zcCnex{f@{OYb2KXQ4<9~^Hs3s&V%o`PRo#k>0gfH4u73^~e3gD2}LH%jl8xxP?x+WG*m$S=;1c?)` z!>)?$E$1iDU0T(A2_3n@X085sZ$;O^R}xk}-*|)#BsiB~DQ)odhrS!%17=ZEas^?~ z-`xyCUdjM9Evy!3@MW)LC}5SQp%UEjEC#(wds^to#07$Lm>Lr-kEwh2(kKJlL`-elqjK<1wP%&2Z;%4A7K(q}e)C70n!`6LM zrO<_F@|#yY2TE<|uTu!$idYi4@n2zwxpORJu=i-ZdL)w4jn^a{NxASJHyE`uh{@Eah+RUex_mCD2=}M&m5U7$&1Z!3 zii#RRS_I;up%imIwzsr%ufCzdd~5nSBsA^=J{+%+6x5o+1Ah$+@p+^J4!NbC$}*#| z&yXbzbU8bo0vvOCFhN}D7=ggSk$dv48v&7I0I+t8OH0#RGmj?hR)#>p`v~$_VJ`>+ zvo6{Oru^4kFPzH(lF|(a2Pgb{C2#~>hlYpS zM$to&d*p9Gxwr7l6bvf&^mGCWaX4#!eyd8A*N-&zmiivyvw`0znWk?M#t5ill){q|Lf1il94w?;;%+0n?91MEYJvvl z-tsRIPZV@5ZS4;fB0MxHSkUW}91lpKd;~{I0FIIJE)sTR zsT2?xq#1qBpvI-s^Z`doRyOp{YP5&bQ&F{Mn#FmggAA)!<-iK^w{oIIY4ul1G2Djw z`lKZB(Da-SRMqZW^3=M{v>-80LhNrMc@=z43TEa@ettJVHD|)5QzSd)fnFKaPVGqN z+|CxUxxFo1Vxoq03(6{Ihxd;6Xdwb}XJ>)2Hsq0H@}D;gu7H`9RVcNo-0Gv35^>vt zuR7Y%B4qX*)PpQU{P7vMP}q%z5KuRgx*kc!hnB?_w9Iyy<$!{4#2lJ=FCGFaTvm(M zL8Tq7u*F1dg1HPW8$(#w7#fmSndJh+^3{qY6czCy;_wu-DrTc0v(?{)sBi_B5InBu zL||s(%<%#<1%BC`5q8N3lhhqbFc}~*my5GMEvXu!Y zhl@1_z9S9qPoHFZ%8M^SmH_-q!Px~%{<4CS5?`P+Fo%MvqoZ>Rp9uk>ejIv9aCX4d zQ~qw`4TiKfi2X20aU0DWJoRQUEv`^i|1ka4h5(9zoxL(S`F^ZojAMn@eEKTr5IsrH z#Q-k51G4%MzO=kN1<3#{6O&JX6tsFDpn|~GT3P7@$_QxB?f^QQzZbphx#Qy_JXD~2 z^Xg^yM(2m?+{0jIK#zEC9mlie4Z|E?_50oe3lM;yZq$MK4Rh;Dwa`a3b#*;Kn{230 zVvOf?WKgyN;);9^P<92ump7ZN6+k?NkoqlBzRSqM9K&V|`NrFs5;+=;+1bXxyU2za zb(;MJ0FCxkJ3A8b9`C(SvKllot>p7jW4a8KfHpZ{eD;L3_P{Ss0b@|`DmB8a5{DBj9 zPg*(%dAzb!N)XtjeelMSLk%;EcLwJHQZ+O;qkxY1Y%pgGq9MA%&cWZ)vS5&6vV(vW z+AjgHq4)kybZoh>fXBN>=#at$e)#B|L_@L50na2KrSOP3UcbVo);bbweR%PjCJ z#EY8vFru4q_1=)%S{#K#bQ?T>CV0ajnktQ$?=CXmy2qxv`+IDR7(&51e<~`NdWngGBF)<0XhiBt2t?V43v*Imximm?7^fJq~s^l2F?1(cpqD(Om6(!r5L0G#(DhJz(w6t*o#e zb{9Vt>YYhJAX(`7^UH{&Bodva*LdlBxC;SZfULn>yDTQQ-xmOQK2iFs4-&6H0sIIi zac%ob=+N3e^yuG()$n~RH~`2j^~dl4QvOSDTafbwm#h=&`Rnw}RW4CY?kgj_Q)w=TF`6417qpq>Fz z@dgCc(As((w&CJnZf?J`>;NRdx`DGJb4cgs=YUZ}!1yyw|HxCTp(%;0u5H>Try*^PB*x2}>w4&m|_1OA!Z%_l6 zS}j}z^Sf>`Fu4S+LTEEVg?H;(m;tVdaD(pj1?+<)ox`55zEJF+f*z3k{b;7;jXw!5 zu7pJ4?R)n;L0Qy3KfPvmdKlEdHf6D<%w%PK^bT4D2xbqrPR~TIU%U1rf zrCZ-LYDnOKn6C_o3ki9(I~BT4)lZn2D}8{~u7|P+PYchyD$DsNY+$m(Z3f@PH zK}lE`4(#5bxH$ALhbM#m{UG}-UbtciC-C7)NlQ}~R*lXzx3pYAknlOVLAnQY?kk`L z1nHB8Q*Bs>tvF_{>I6ei%zZYmxdc;a5QOFd1M4PCh(N^cl8wziK93y}ViMR7oa4Jz zR#wO<90-^TNp-UVFr0#9ITQ2JB|rfn99u!W^ZR$U*ge_IRFBF^r%I=z%TKrLJd_IG z`WZ(gJ6wYGZ|LllSPg(U3vIqr8Lb@;37~d>?8{_q@=i5pV898=$lL|O0x@R0^HXZX z?6O-~+ix?Qtz%)%mM4-MJP;FoOO%+}=eHnQvoef~_gvt1C+ z<5yo{YnpGBeiIUd(h#jXJdSUEk44c|+$G8lU=!%!&1cW9!25-no2vk;n#wHoQr2~p z0ti@8!1D0<@Bs~`t=!TiKMpFqehn*xhjfMC=;=|=uCNpp8@7(x=p%=71O@L0hsbn; z`N4r4^5c>ZA7~)ok3fu9i3z=a9sJD@Uuu*-SvX+&l-DsDBro>ELuLY4 z=6o0nfFe5$xeNjDa6DBa9;)RQFQhV3>du_yuziA4P% zM+d{!Q!wcU&b11&;ee59nMG8Xq;ge?X>FMk=*290osAHnNYdDbe(qi`xW0uNym?gK zJvi7>{ILXiu2YgxH`xLj^L$@EOrf-ubJL+a{Fdb-@ywiv`Bnm}2} zgJ68rwpc~{ugo-GP(XHK z6I0~MMi@VCt1Gl;bo}kDDWf{!NC6+1DGIP$C_gY3{bar~&Q~&l4_5g)NZOGc`G;?H zVJ;bDGcG78m#NmrxYNC`|N5`!!4M5;}Kr#*?3l5{haND%4RtC@^X7ZSkF*7-H z4x(j2FiVJ}0E^vI9L~o@{m%0H+%$$Ak@-+J9s%vYlqmK7Cf=zz7*_a?-@Fgy?Rc1- zQ}E${643Q$kjO|A`XJS9I7n)3jSfZ34Y;M5gw6!S(VY%AFR`19J_SJu=B^uK*v*p) zVB5iX+lNQ!-Q85xb+4r+U-Gh@AI@L`sl|n97Ua!ON=h19HzFilhL295S$<3N6I8Q& ztps*3^@MmG%yT~IJ5GUE%on7pU2Yxo?lb|u4;;%IB!_3v-BQ^wNqF!t&QCC5 z3=pn#3s^y9WMp_IcQWX_-)^ekaCGGM^7Z|A#{85-H_-39aX@131R_&DTNvgPzzfYc zilT++I<57s&?l-V)J#m*&(9agvC)DeBj1BVNB-b}kP$&}=g*$6BH(WPL?+xo)S8^L zMguRgA%gLFlCd*1Nejy|y$GZ_0pl9x^ZvQ-Y}(;NC-R(6F#IIVlEYM_=YZ0jsnhO6 zg1WVBNPTdzj^y^bx&Z+MgA`nE9IlmXfR2(V&62?rCY z$lwYK?&|i`Y|+wk7TG45^O+~AGP(B4MmLWE3A@4Ue& z_p9oOeyocIq3Zx(Dlk&d=bxiWNkl{hbCs?z+)YkF;mNwGIBchl#`gfr@7V^*g3Qu_fhF)1aq<#WQdU3<8c3o9x<(W5{BB5?Nvi+@@&pc+ zsM|gO-U;?Y$$0+>mlN^jd}h#cgoK3wqg;RcmKP8wF`$?TIesap23l;i9{A;`@e`=9 zo`CJb)pxSFTMO%1tk6`Wre1t13AhFJ~hjiH8+egC7osx%!3v{HeV z1cv_P`q*@O6@1(Ra&+?xlq5N6-hU5k6^GGnnk0apk-Q@}V9dR-!uE!gLhdJENLt{A z{JfjP1M#oXO?pe(MvYh(&9&Dp#B?FP$x) zEstZIEwA5`A>DsyAkCU#ATM2{9P>K!EzCoZ33|MLA+%ra>N;v|Y5Ay3=IhLX3m?hB zv(B>4vYZuFJs0>3Ii#fT%Tp=df#4n%R=!|e@cTbsIB4NQf4;J$@*W@`b6?xrgYwUV zuxPRA{Qf*h5k3v(&x0D#u8IA5(Es^UY02bS&37m{Ig9ndG>5j1X-vz;?;Y;y>XfB{ z>=T{LFMnRKb%I<(G8{s5sfBQy|h#PwS|9=WFaAm(*_CMT6j6r=;Pu%#z(l4-~TQJNd(a~F*qfuFyG)$utQBwjz{_;0mcd~=bgl(9_!kzWRHVu zvOS<;dY8byf#)aesFz}5X>ehxrDpC7YUS|x4`Ls2f8MxxbLQ*-Rp$wzUtnOGSVYb$ zq|hTYT%v%EMbDv)Vzc9J6nx0b^|ac$Ba?Y?#YpHtBeags1hsbN82n z#om;gpdA4Y^9Dv|4htv|&+`&sGlEK~*H^!&;Ou6NGnrcsMhKfFe;~zw_2)ywcCtw}rys^554-oug8`{BCHI`gnJ#VNk>M zXMcJh9Zce&A;*Nhyi^;Tnyx*1^augd>>YhDCU9wTdit_kX68*4&pK^Y2M3g?DFp=B zMI_KZ3aK7JL;1JIc;q=T!VxH#E(uU7%wf=QhvREc>tx+Cm@d%+sx13W3Z~Fb@{C9J zYh;;CO-&I{f}u-NT!K*-N_zUR0^Rnr6rSgQZjRAjga;)=G^$T6xVrc!!XY16i%pl3 zni?D*F9B1g;C$)82NJlJY11n|NdrDg#7ETH7M9r>!_E)q6h(6|huD=<I7o&sIV)3eOU z+1cF(%Mbq^BmqFCM7$2MAouhX8!osS)xMF*+wGI&mq~r4Z!nm1^kDgKHMqbe;=-J>$LVj4t_qR6&|_ZiMe|@WU(wF_nDQRX)CItMyUuFJD3ezfvI{zKU#h+^D)x z-0n0{%2E4R+m*{BARr*Wzz;kUDhjFC*xxJMvY)N%1?;dmw52;-WdEtb_W~*Dfo2e* z7q1_u|8z@Ix4i%x6qqi)6aUvK*th=_zS9VvZB6~5yeXKB4d-)qkohJ>{sDXIZR_W{ zTln1xAPz;RwI@u(y??(lKPCOOnF-7a1Z45>nWyibp0>$UmSPffRU!u*FCjxAknh&2 zb#o7;Q~CgWLOC=6wk$Zy_A>$OFC`^GxaIB7kZaM7hSApolQ9PbgGTkMmQRc_IjZ(F zvfo-uCOW%%3g8n0`U)3ffSg}814&!mZtD35Y--_bWor(L+4s+X2L%OLZJZM}eLRsW zw^9PB4vu^Cv*NNpWtGPv@QGr%#T;5)-NGWA?<@L{kcEglF|eOEFesgRb4>9d?`+pFb4PO|(i zn8T)5Zk&I5LlcT@a#|WP-Us|-le@-Qn`UHeE)K_)SAiu?FF?(Gs+(`r}Fj`n#uC1$c4-I{@ zQ(0o#5`96!WyJxa((K{ZSEHf4co6#aRA4szC#N;ddq^u6YByodZ((43dhqCx$}2}x zrRN{)c77?aa6r-vCZs3Z8Ef9G3}}!lhC7bc(Ah$T1V>fS;drce9U2y{uD6$J(Tf_8 zjG*ECW=QzYZ9Kh#3AUYfTR0g~QBgjCqUfeX}p zvInzCWwBtDAU|IPu|4|(-7PL|%3Zh2VUG|dhfX(KWe%4!qj1|TL|_fzb8)6aB!z<^ z`SdGuF!J%-O-qMg8FE|O+tUr0zQM7v9mR%NMaCoXy6q&lTK|@hjlEXS6gV7(2ERmM z97hrcf(W>*@DV7Umtdk|$Eq*Yxh|TOA9>zEs!Me~v6(LdnT!;Mc0s#^ zQU&#I4?h0p7BCTt`_o)NvtLC$jvB9;NHS95hsdQcT*y!BXb$tsGcB$@fq{%rJs^u) zr9WO-_Dfg4`wKbHfVU7nlg*G_axXwfxdQip=5Xt7D3x^ZLV{^KeU<|#>K+?nTj z4%>b9Iltdp_x^L&y=&cj);epQ(-QXg`x)N%nO>ay3A)99gM;=T*J?EaIzDiEQwakEp7?SEFLfCxxk@Y=Idm|_rI9>_i1s=>at zCGX!iTP@qlG4+h|--~2c@6G>BY4{~kzXoO&h}^4mnEw051ne3}EUSox2g9>Y-kM$D zMQK*WZViS4|MYJJ$IJWojcLzXf0P@v*b#D2=zSAhWnvGx&Z>p|_a$&kzq>ztg$jUO z{5g-m1P41o;}(MA&b_$pK$1a&6Y%55k18Gh|9+sq&BKRZf8`z9eeegR9QgOkZU3j# zo!#&*`JWH+|7F!H=jV~YPmHRo4xne(q}ju^3%fm?dU-HXE>$~kByM)K&;KlnL<=@- zOCi(7D3|wA8_9{P(JE(41BgOXmA={vmoGbh6?S%1P*A9k5RTO??oO~K9TBmlJAFDY zOwf3%by0JZq3f;R443?4sw1uU+?gL%cb6Kz0nb(>q9hOI8tM`}v*ziDSs>^<3 z&&wwU76lH3$X~iHRh=K@{h|btu)h3Hs+&k%KY+N3p4owEue1*;xPt2a zSY1*R*VUH-yJGqUv>?eNn9}s%F4ih{&J)%w~3EEX$#o|oS%P41^89zZ0SEx!<9YV&ar))Smj3@7xu9%X|o3p9$2)` zkJ0llP2`dEXL{S}W28NEEn|Bktr`Dec0BY5x60gjHgBwBG@BP;RAzRgX1!`ozUF^E z=r8FPZe;R8sy$NxVV_r&vg`1-f7aGd_4M?VO%d7uR4{dHO7zL?DX*Hv_W*}4xz*z_ zk{w!7H91Njih?FAIwZ;XwIQ;3Kkukqtc>-a$r#en4HALmpO?pkc}vN$PS3ho-d_dDO-l%(EX zIfK*XD1sdTuL}~$ODOLS;SvMfqJjWA>Xxo?h)y${=0vPWe(`cXCmxRfo_s7K<|yz8 zJU&_!aimhN%nktalW}xms=O;S+oCqMJdsB+!d}TSGX^f_mz_O!0ejk3eo&D3S27j#^I|EG$@`r&Z`xyW_4X3N`nBW9st4%$FJCC5OO z-bcw$s%>5D=dZS%3U`_95MO`kV=9y>NM~d^uDHL+UK^FuAz62nBW}aLrc{89)PJ}^ z+{?;(q4{k$+?1QGr@kpHVy;m@>`^^*@B@H;&s9kclC1zVOhokEnv zWAmd6S|O`V6+WTp^tNlHU-~npcYu>qKBdlnLuPhuE-hQiy>pE6%i#w&klc1YdiBc3 zb#-FtCCk#)L`$0~dwW9h)F+Lu0^znCb6Ji{MgCr1k^rz+hnl?ft*zDatoS4S*&R@& zR3xrTq)aS#Pc*fQ1h-{QyN9!8BS{6I?J@M>1~H2bqO^jxgLiIzTw8hECmz-)$|0|M zOiC)sW{>^6{3l*7o!6}f1t_or#F>}bwH7y!r<;`IPW z$Iqsk8}+#-&Fk#bmzTGoJ8W!@KZhzEZ5O?+W87|ii7DwhWm^%8-{-Gg6U;HY5wD%6 z!QpI+M>m{9CO2VU6{g<%agIPZ6>t{2BopY~2x zmo=In?g0wk`qroXqYkl!NU%m9d=wR&VPn*aX2?Q^wF}^n#;4okp`_SkV9;aHZ82)| z$*PMHEp^Q=J+%ZqqG-6J1EuDIILCYI?$Pf_YIJkn3%aQD%FD`P!p|fLIL{0GOeYzZ zaO}Z_xs9IF&+yCBt9Xd2=P#s@nxSCZ0x8*GO8N=)G%bb@{*8a|lCL~@qI$-vvkKRh zC(;tJPx72f;^jS-`vc3Aqr_gs61qzV>UvO&#m+WLN^54_q0yIcawo572;G|%f>$6x zr_gkHZ7v+k{Z?AtWY_BQ9}nvKhy`&3*0?Tp(LEaZVoqL5fC<~DEn7C}O5BtB$h>Wj zGL5|YCMPR@B*)HR_024$pTF|$9u*|^-Y<*FY64BEz!IN8;t6|f@7iJq8(`wfuio(h zad?KB^n}s_Q@@u!EE9HJK5J4RcG1xAwOnCmifVL3f9=4F=DYp96_n3)HTjxTO3SAG z+}9s%qLE@_W0PT<02ubln!@ zPNR&uu4@UJ(7wJi8{MI_hsoF0Kk+tPVKT}vGdUq!r7e!81Gi_dH}G$bec)!$x(F!=#*Obi>sbRQqN@HgB1m+s3;eQskF zx$6f7Nq*TKiGq@h-Tc``_BRD3W7x&^o+Y|VhYOqU*y<6Te`>TbnrJ(G7sP}ndDJ1Mx0Q*~VORy&A2MV4d#Zqh9ATQ9uxD+cNet|N`+tz7YghY$O| zc=`;^zkInX#^vL2T>fZ`z9Yg3wALNfboHdfmA8xGrV+N2oixBaO|`mXq*w2f$l~a9 ze0+R%Zl+!A8A%%3{4LK~4RWjVsGmkg4q!#lv&SwJ(ooPEiT!7nCKDy?aP<^TpJ%b3 z>Nbr@R0w=Vi42^KiN!avSs1;M;uOq%AlC%9D<&#oWGK zXrEVTh~pPI7-e13vgpCyUh@4w1rW~f{rkJPvrv$hmzPIh@*Oo2V19oiMFRIgFVMuB zW8d-8ag{*;`bH_#Z=A&b2&W~f9zuVeoX6q)l?U1;jSnF|41NRxEBes2& zDrkU|u!=6Ls2rD(dHm*$`gJHWJ<3Y)44f8PnQ9_M>5$;_aQNG^3tpQxZtI07JsvrF zMB`&8dUL2qgl!{@6XpHgUoy`efb`)ssV7F*T&Am_*qCg*psQqPxQ{|4F%ON7D&oI! zw4q{obt-gB`W_!n6RG>u4u2mC;7i_ubz|PO^~24yufH?djZ96cN`K{T!Rh&>yF2ED zN=$Dp(l|VmVm|mpMvm-BL+rLu)t)5f1A2I4ef|Ak(HK&Vce%X6sd*K$$X#1Evr2r5 zllSMl87f|AH#wy7Owf38>nrrpluo|C|4xkahmR}U zaqoboxcl#;*&;PoLz{OA99lTD=`%07eR zhj#}P-&1@rHR&6nr!Y z4}_b7+9Hn_c@MS}E{#2U92TYx!n~^Y){nPxMu-4H!pR$z$dHYKIeXP6-lIpwjcrAX zf=~UrKlam7m#{t=9UFdTXl7-okE+EJh7BL_w6oM|e7Cm=)44c)4&TVl&Mxoj^2K)z z4`E_;^EvOiBg{+Z_T(UXKpC`*FHzK?_QdWmbqSrtRgb{#>flqMPEmOdN9-s5c1gJ= ztsV?3a7akfZkmINuO%U}ZW*l%hymre^D*y|Sa=JB!*1sP^S@dEadA!i-5J?uDn6j^ zk8i$=tV}%gC>d5|qWgvV7NoS$GnuY$v71t7a9CPn_Pqoo5TI2Ad<|J{tE#pI#l@@- z9?Up8O8u5ABM}A9olDApI0E;Z268a{AVr0b?jF3+n@ZcVhnB~)`Kx1P`Kc~(^dm^T z<5Oxo4?+$a`~NOnMsxOspJ?$$r*LSvBaaiPdc94FUNegN^pV_J4RtX|eSwN>K_0|leR=bm+2S$a2tJU!4T%#hu81z_p#T|yO zIEb)<|D>ds965Q?8_3D`IFIC2HT$Za)df1-H+ia3H3K>e7|^O+HEW%%LcB=bIwu0z zpU~{Q6?8S@O_EC8-MX1_#_${k`_*C;Y;ppKie~}eR{s2-zM4>eet4!5t-7@6f=uh& zcZXY7wOOj?PX0oPI5A;MKKIjQY;@Q$Pr0Qf@BH8=DBkw5$LgyRv8YL99@JZCV@=0@ z`wK>&$hN)s@Zm1cog``1&ef%LR9tfC9zR@9zO4V}YI`2LiTZl>>((rt&wIbTJ}$eL zJ@zaBOt2DJVtU;!R*UoV$0Q_vnza`XO}JE%#-_xqhvqwv9(}DYLaP)P*8^Emb?5QX z_MEYotdec68A{5^{aA>zgAGQiMBAZGp+on`lET8i@83s$&L0pZoh*qhba6j=^rL!e z*a%H0Dspfw8F>!+Jzu7fYPp|gCu8Ydq3=meE^R+$Av{IL1&!cc_qR|K+I4oN={b@a zuz61Cl}O?C6T|rgSt*D=!PNs(0kQ=5+MpTZ`C$VQ6@oPxD;MW=PjBy&$Ve9Gff6ww zKxCkAO3!;U?WS#X#4k$x(*9^aIaQ;2=SQ-O$bVC)f_SyT<;Eo8D4?s4y%CXyUk|>E z{jDFuCmq4fK1U`{_Jh9kPv%Rv{bpxpPByX=Zn^hNj<@Z6IC{r9LIWj1WAx5A#o!lI zcn3+2Gqjs&MDy0@T8}9m?{T2~ru@jQ@{;%HZC>kjkEZ^`t}UPZs7Ew74aRZyvA@Ty zz`#DQ;^N}`NQSf5UJta~Hn)6zqZn-n8|At=zciWty?8YxO5D~DK6>>`Lnm98Zi71a z=-?0D#`?#6oJOcC$V*Q}9NV@U5RgP1n?O3$R6XQ;*zWcW6? z0rZ}L5SA5|B`C1VLU=op^@zDn&Misj%E?9AYa9c$!ADRygom_c7`Rb-$Bw){L_XYU z|0F)hXM*zuw|gL9ROnR{6ct69hI)HJb@U)vPpf~ZzyD&ImhkdqAp?PJJ|57X*H(D0hF8xqnxRo=?gsVI-B&2e7Ko(>`h((KqF%s;*c#^W+*G*mr2713J zsL8b~0+Zmy+>KoXdL`3lpb29U zrXRaf@ChhGI`XEz+!fl#>=<=5{)Ei8ftrXY%bkgwJ~)RF2-hZ+>%QJT4%iL7F-U-H zXY|y3Iy7MgCKZ*H59UmSu%z2Q&bcHcC7p4c-UjFgBIU^@AB&crKVLleM&@>*wxGa@ z=!c4CYj@JU+dzjq*r;pFtoR9?zf} zXSkDqIJFTsUbQa$nEdR(UQ;tuUY8;O5{iOMZ{O|>D$7B(I#tD{fYcN=v%4cNvb&)= zT9OH+^36O2?ZvUw{yUMi$~UVlG&D3Y&4dCZ0fGCO+NMAA=}2~8zA)f9(}mI4d^bry z{J!{v_a--m1mm88wgp^L1NJB)7=^2-wNWl;0=PubBesmmiUI+*lazGVN{^TDAfIDf zt89v8Eh8QZ?o>av-ALuq_xZ%DZNHbvRH6yY_Moh7ckY7N3Cd!R;aMlIQloz%pJht; zyI?-MI<*RR^f7p9@MH$x-uPEn3w+NslEgs}mSp+;-4Ugb)IYrybwS(%<7e$ zbL_+*;{`9j6F8hv2e*7mP9`por8_{{aSzKI1&{jdK%tB10xEid1Ggc4Z+d_A0`IJA zpD$m1EHTJ^{aG0CgY8gpoP3;R$4}Swg-zW~rUIy>-#RaRVC3AQEe3P#oocGVrVYR2 zN;hA@j;8CH$(wI8kSnpC-IUw!!*7BnT@HZNaQgxS6_8TJrWhSGM=132xU_!M_3DIb z=sG=KnG5~?PJxR8fAR70fd>eJ297$>hnWH+xh;W*yNKvHb~m9A^q|}~xZ$);%Tmb> zF4NbqensZdEs6pQ(lb7O5eJFm%D|#{Ev+(BpU2kX@**b^#92FDFr2Dgomvtm8C&6D zA^PC7>v9qm#6w}In4J%^)6&vzrJHQZBk@7^6uh77PtBWiQ&JiHo&1~~Pl$x$5MWiT zPWhK&mPH6}%&Rc3hjmGoExk*oHo`SC~%fi zDESeQz<{dVDsc>vt6zWi$)kz+WYHGnFU#hSyE(=!H$gn3CRIhbqh!HZ+a+th*QaT& zLDWaHWR0`4YYr-tA=-j-n?xplY1T}N8T#DLzkNp9gk{%O=f&~bwG~q4-DXU@aIWdC zQN39;w;JAf;52d%B0hcEg$Rjz!q15$6utFCN%repw?Dth_sQqQAx|FqMK4=fQxo9F zs+ZxIwB!!5wSRR=WA3N6v<1rSj_dZ_uGy3u(6Ht;1Gu5bwZXhZp7sm_9hvoc!q=~z zZ*_~?r8d^i41OZaIY}1wg*|_sw#(aFp>mwFE+VIi*liAEAGDt4di}@eYa6e-W{z^o ztUnawFZwnZS3r0nWd^8Ez-cxV*@oR_f4%9GaF&`z7HZ4#fi#HIBkJzw*PVYX6rCq` zQQ3xUpZ2_(#3L^53E|W}28QT?qyf2@r<-ZX`ae^xK?*>>;0p#^z2MWrWO-(0UR%L} zXpH;cvW*tdKx8MI`PlC-p0Clb&9_LP&6SUpk+yJttk?fwb}79cF6RS)0F#rG0T|1t z>vpk+@f|r5aLz*}5p{)-RVw(Xe$t-sD~iP&^idQ$k__dAeUWmA+) zmpBjx0U0V(c0kzi7YvUh2CL zipXGUN-$sCg`XY?QI5AK4pSJ%Sv?c=jG%~!O3v7qMh!eK!I)vWHA=rTi6? zsroTXrH?(NR>y6xf4m*+zP|NU(4CbnBRRixhjM;7Q#r&syZs#zi*Z{N$NSm(sH<@4 z8v-&R?6`=x91h(SE;z=zu21*Q08CWFpJ|r3dWsW~@v<2^Z{u#u;EHl+GoxnCg`0Q| zjziJzSS#_@61cHec07J8&-URzmD~oS2o1$fd>o18cthVIc%NG~YhA<9%7AcH6f^V! zG&k{tP*nIK2OdD(1J#&afOzyHxq)Y$Mqa@^HoVI%jg5SRJ+RIh0hb3eBu*epZKf>= zod}GAj2~*6J&z)_-Kn|>gl!;&5@BD17&{mZWOMQA7{vYHG*n_`+@QkV1#TZ#z3)IB zp*nYxKr zC-W~=y>Vwxt}=w`G-u&IWWRjs+PiI3qE=zuO6{3Ov`A=%Y~CLr!gmN|k^E5(_3rX? zIb9ZS3ieLXOeG5hr_ zGEW1haGd@-mX2en3>K|qoO*W1CFxT*Y$Vvv$+dmq4vVOIwuCGshACA9JF1v=Yd*$^I?%iMsP|EjnRcv$WAw@XWPzv{hECKTz}0$b_Zy+dTL6 zu7ylE`+Yu1QeGMJu0>ELf!nr;eTDoBxU2`Lx9Qa>Vuuis@*%5<;VNaXPZeP|Dp}@;i96VTSRvbpvWMWpTBxFH%N;1nU`dDf3KCZg9@`c z?m**)jPcI5MUpzBP+fodo!Q6ke8gp86cSNd6p<$crnkZG1f+M@Bbd-BLfe%;9&{jn zRWT5(<B@{qxIou0E-wPg*Y$I!LR-Nzp4^a^&t5=lzluT0x<}C z_yo`RKET`wTEYZubp=w%6xDQ}f1>_-+{}z~AP}}b!u=coEl|+Ojd(c7!Iiw&$#fos zEvwH+UFcF@mjemP2TykQWs1XJ=EwQLnm{jj2sQ~oI!cwOy8Z;g4fIGfgR%?svq5)} zHAXOsu(7eB7dV9DqHc;fRdKie4Hly~cQ$?z8$ETe~R!mY&4bcww` zLDq!p^TGX$Dt&>qt{XK$M^2xv`KwhVfAOmw+R#gw=LDkgNnl`0;QL6*E?TRiXo}{C zA0VRp(yx!vmV3giqC}_b?k5o}UOkkh<-99;WZ?0mn!7@;qt^H}pL3$y7-44-X#26- z8j4&r2vHD1a9^Q_>jQ}OC_?bRculql={KEo^&;F~{fXsj30VP|iH)U}W9H-< zOGEXH{rhYv;#vQ~fA8+uji=~8&Y$ONmvX!Hhd6b^#oUg((Y??ZL9mJZ{izk_->CP$ z!hI=0(E8%ebY#-}^$|aUQFO(3BLBtzG*(WV{vXMWdpG1V5Oimv>y!{!@ww7B61Cj2 zXzMUhY2xn`21og%TaOUtP5;$h$2^s1;~8k0QoZG4fl)==s{5srAj952){a^8*rSv=8*}#o)Z;QaDlWc~ z8Jus~VGlom2^)DLj}@okHc8343h;9xu$8TA^Y63$@0SbEEF46je&I5#`|MZKjwQLT zx7rZ!dROweNt>?GmxWO?Xpy^eR?LA@a9w@7O;^{GiUYzXdM2g~2aT}}->Q8)6Wzs; zaJ#_(q=Jh1xsT80H+EyD09~l?v5_=Bln<4waou0)E4iucMwPBR&PIwf!CLuCYEIc4 zEEOiQHEiFuEu)$U*<=v+jb{{%BWy`jjj^&Q$QXDMiyw~c!>Jy0(ss%I3(hT`7@@8Q zf9LPvP_<-hgfe-cP6OSq4%D_6AUX=)9EgDjv)wLJkx43wibo0V4oDTLKz`my-A=Dp zulCxqzF=CS#A>$XHW%Cdt663dHAa*Gr7gLgKdT%|K7KaQ(t(JP9a^96Dg+#@m|jY6 z1j1c^@7G7UZz!hm4dRr;ZNSxS$8W}HOqee7LM!i!2k~I|8)dlLON2dM%eT3K^T*=q z&-Dojd}0Wny&!!>{0Qww-C`3}7{$Z^OuTb^zzzXZQ%ztJ6|=CJkb0tPBhs3x4Kk@Cw1@#%yhM8jBf0nrRT7Ljkf6(U7Lqujt_R$P1TTVk!NUPBDXE zUO{jEP&<`o`ma^D^@ZCI)L1w3g-@`fh}t;O==A2gwAhm5ZJA925l^DayB=zYI=b(l zUq4XLK*KLvw=yvvXTU$4y{~(XjXTFZYk>$c)oq|AexVxYUNFpUJuLF`VOLmy!7-k3 z?kfM-!QYwcP}ZL~Uhz=pbx=@!Px(3M{QAb*_HNqjA?Cmrgp`RV9{e`_)e4PK`Dblr zyUd?fS4VE4i9Rkc-KfsfBHTLBF#`|8*VYt=bS6C8MtqCG(uu|*dHTO#;>6+4~tMA8p$sQx4T~gA-*f%ncFh zGL7V+$q@ho#r>Zs8YFOZm_W}NNXDxuogZEp70?U;xH;bqZrS zJ_{*s-P7&#;!d;ILo6LAr#o&%Pc+i_2;t~k1mUKqq@gz7eW#wJaZ>9O7rd(jrH|cU zXDdBAi~vbypb-7PGdU<~{+nqrm^@~(W$RY7TgR|Rqo!zMqYeo!17z9|6fBu|70*Glxx2EQ&yW5e; z`{%2-5r*`9&o)i>s4yL$uDo{m!rKM;0uyr=!PobcPn4P~v z>Wp?36)M=F?4}bL&I{apdV3Pk1*K}vWml}hglatYvjLi^?!*P>Dhi2~p-*l8i+mn) zSE#q`*;9#H#gHAh(~2nfFXnO9o^jQdCSmrVR6Eh)*1cRe*!|MIILzOuYSgWy5Vr_R ze92MIaG(yd-oxh(B${#wNeMcMI} zm4$O~$?l}16WzfudrU;c@6VsTfW&$xbeG<) zp;2FTASV+g0JFfZBWemO@qxYlF>H&Aa^Yy4L`9)`sc390U73qxeEgf(3P(t{+mg=g zP!o7gPJUu%0PG;*jqw`kqLg<`W!WwzzcT9%E5ddVmmo2rY}^HG8Q1g^WMoml;#6b9 zvsZ~b?^(anNuuHB;@U<>rv}|h$8~>Ek}Ev~FqCQ*FzjHzLPy9z@lyA3skI&DUWBg@ zRXa@;JMbc0j{}1wpq7)PLN%w9V@8IXx;9Y)qvRsMceZ@gkwmSJ92raO>9tpR@CG^0?rZ?PFiyEWv)UjPJ8NMBHOJ410 zt*8ixN24)DnC2m>PHJd2sg#*UfS)87R_uTRz>Z*9Fo`iTGv{uv>TIp0Ix4fYAk_h8}xXL_Mp);>0 z-UuF2*|-$rajI(Lkm=~t$4WBO$=l91u=>PGSUZ7e9{A38N3lNlW(^xmY7Jq8+V>7E$F84Y=2RL=6 z6RqOqc6JmpW0Y3-2H3L`yu1yGD_EWfgodR-i8MgGfB$|)XQ72Q?^{lwR=}+xj&Ec_6L5l66PH#~EWw{$XO0$EYVN@c6l5OWh6ucoM_|2NLP7c9K5g zqWY8FRCxw-DilNclt5KJz}P@4_y#LVA5UG&O^sb)Vr0Zd7ER@=q9k-pbLo@a)@HUv zhOqPGalq<_wh`k=xgmV~RNYb@|Hvsndlu(*GiC!8I86D)>N&}*-RA=74{IPohIoNZ zSn4LibpdDK7kuAah4yK3n)nalq3~9TJv(<+H8o}Foo&l9=6wcJj4`<*WZ~eULy%9b zQ$y=Ol+zu30$afbjg?$nX>90ORC(reDumS^BGRn216!H@m<)G0z2(yy45(u@O0p`mJ3Ke&85#B{F3x5IU_T9o=dsP+kUD6zf zq#es+nXK*Yx7tSZOvZxF=>F_G)50XO|>h|tk=X%DMbu~JGI?$FKgod+-wAUcTvzeI=98f^44PXNL zg9puKT8sbu(TAzUs985R>*vR4Nn$PTA~6_uphs>lT+)7&9NCLEvVD(?5m~3?kRtTJ zse{s(3;~0u0U429d#c@8sgUU7Ao;@IpHoWekhL{GTu?l-@D)9C%4a=vXtHi;GN8Gw zE!Tgsb)tHX_d>;*_HE>B!qK%e<}e@oCT4m=Z7(-rDy3InhX@>Xki# z^jPcV&fUd9BlEeb8jy~B`ND_&8g}G@jDT7wx@h16j(35^s!P*6P7X0H8(Y=y2a$Fjic%@hmsZwUiTQ-*_X@y3Z3ypn%z#T= zdWJ1SO}R1L-4kXY@LrisNWPW1%gRbT{ryM*cSR>XJfqRr-BD4>1JGFg868DX4i9X@ zWZT~~0t;N5>KCTx&a}o~{wLi_YmxAT6Ri!hFEC^*tkAj*YP#Ou^JmXKs!$q+CKgfz zdeDx84XYt=aD6LSID=1%fF5B?)yT-s=Fs5Nuzh!koxKT&38bc**ou^5AnyVZl#BqB z3;gmB*iqtqk&|-b$dSiL+R}cf7A>(GPYF`tr?|inPevFPoH9+DKtT*GcnY=SOvN4x zQb{z!DR<~S(3V|ph{%D@t&&8FMOw*R4JQYTAx9)6B7mRI0b(3jHn;!TZrA#ul`;ns z?LGKdsPu$LHJED1f=h)1SKK2CG7HP~oO2!C=ecv7*%KupT@qBxvg9*w-@ZldVhE!# zGyv|oQ+<#FmUUWMl1kPY*(;c(9JirTK7qsdKhXkC%u;=UZ^bU6a9OLN-2<+SJLFMg zbQkJgKRe>mY*34!+QA^W5ccBv^J6DZhO>xT z*^K@Ww<3|32>m_Yv`S!8U&gv?8SOE|6;FxAbePKHDbPToI)=k_CtVIO1T-7Qa4H1C zJwJbcx{a!CH`^aRb7BqxO;hkORGk=7pIg6 zBB}M?*UVH8y>dzFJ-mf>8*NoVA&H%dvybt)@q+Uj%~F2T&|G)loD)Gt)Onr@XR!ia zeYniJ^v!g?%9fTufJ(p+B~Wt}d43%3@&g78BZ@jU4!Z=Kn(X?1{43ND;Rzu86w=i! zJMA(033}Qfyt21fxRC!XvXjwOYuM7!xa@j6RzY-niJ)>wjAQS15o@w61w+x-r@>h0 zuSv0uNyrN3+P?#fw;C|N<7^FOAlD@VsbQr^Lpx>$zq= zUh0l41Ex3NbR4k{8`~Jh9v8~qZkLZ^V(m963%;=TO5Jp%qNE86na*v;sI2;0c!H5$ zS-Rf2mG*D5$IES%!k5TD-tV9LN>3hMxIY%s(~N-H*f+Pu*>R>;p;c}+%R#io0eN|^ zee4}gO_7Sho0{(mL7^Ln)CwE~&y$8c^0fN-3pY>C%y50OMl$%-lrz5kp6E`cWMn); zS2tKs3Ptb~=kVj+wn$WQ8Ee``r|-x*`|8LA$Hg|81er@1RDj?PNYr;$o*K0-IvtMh zE9gA`K5NH^KQk&CYHHR9*1%~;T;P|joOdpsnLJsV-6SIqGcvPK^_TR);PZ7MJs0J8 zIfR5hDf^#7Oh(w;WFh->B};nSeAjzjIzr}Zx`3fl52?JK5chI&(ex~Zo#@lae*$M?R5|qhiKU39imAD>2A9n{m&)2Vq3{j99yMOecT?$<} z?MaE^AUBdT1CJjeZ%0)jH#g|wG@5MHS?m%DJwnFa=A<9V^lKWlDwJ5{UiPWXD4zA{ z@|$CN`@XzbT~a5H9+nacR;-YmDr&&L>l(Cj|9+v~P^O#R=l=qh&#wjF$@-rN=DjC= z3u)GF1aSWs?@@amgG6V%Zdk@~uXJQ=*bu4&e7;yj@BqUP#tM^efAwz~^K$|v)&FXm z){RJ_US{0nRhof-(+nmF*H)OG_RlPeC3&j^CLlm-dah}sZ@5`3zx=-+r^w66=@l>E zx4bg60h7qi$R+b1qEps(NtXunx7lVk-SD6K`X_ys^7myGcY-9s{dpP^Ej25v$@o2? z|Ni>Rw8*SY(#rXOrsnNe*+Yb(tS5RKY84Ge_Wja{zou^Nc_yjo`**Ns>D`Dyu5LOf zznag@l=Z+1OO98$gWq3Q+`pqjk9B{xMGOyRI3=F``-~ldi=eQ zi&ri|Q7x!#1_;L`*R=*g$!@(PGGvL&%!Eju_2oXqgFS)EMg;kS#)kwug5+XkUbtRQ zX@#hwQBc~XM8eK&?uU9b+bDBK?!+;U3r1_i)UnEP3`B|p90PgMrj3^ci(<|}1M?4Z zFc0O~E~fy6K;6vc;;i?kZ!<#m*cuD$lr;0KPFh)g#N8@`2Ee#6YAJ1U^|S9uwxohN zu^fN7)sU=dfxaNw^7y-_*yL7Ti%j&qw^+G$`7-NIAfmeI@^M%0FOJiIUipLPQP~8@ z71g!?6(*A$708fMle*fScvd-PjSq21Cci!wOU>1{fa?sgCU#Xe$+CR(d+L?<#+szd z6|9KE>w&gzObAA5jQmO$MTd1)=-}IU*`fZL7LY~ z7p=|Sr^5PUmRuAzX>evjTz&Qs@7?vkDu<*T!%#9|VZGc=UrF_B6S-0H3>MfMlLk)k zUjHDQVE>Nngg!R$eTba%LS|jh&$K(ZMJaFxl*&!MEJS+dTQTT}uNFJspfWV{1KlEm z%0KzWsprk{dXzbTHGw4K@!tl}>`*_#Tvp(pEYL2QN}+j>*UYz(rb3FgNzWI}-)#&r zlE_ravKf%Tn8j$=j}C}su$Pqydt+lE((+Nz$0e(VIi&T8fm&%MwLu3Sj(qn+z9UUB+txjt`I z-rnBFkG&I73b|-I{io-=f&1#jujCskTjl-9waC7~=p1ea?k$3bU-gk8j3^0zG;79R zo{Cal8qz3uL;OO%K%ln;9f$w?Lt$3QOVgdU($t^rCr+ej5GpZt1h*k{%%P6G-m_3M zL_#tUekdxUE*n#Of2OWH$;e1F)izq?y3QkVcmmBM4=uXac)j*iKvAmVwdWt$I#~rs zBK?pICfpKF!^6Ny_WSdU`6NjVg|!)8(KbE3DZ?4csi>e@QhqA^S7xF zmF(D>FIhyR5Tb@mS`}RVU+|qv(P7b~Uer8mdk8Ej~ zhy3qPBP>D(cS}1zq?}VAc_JQB5q#Fam&4M_4WZcyUKN!>`<{!J7HM|)pRCUjPEb)- zT2Dx}6-QT+DoGR0;)68a)AznV)OEAlg^P1=b|3{+@e_a97*#8)n6}*V+p(Vw%1yG} z!c>!t#()2E8j4n^l!ACO_Oha)$?uHEo?nm`%Y>Z^=9!ggL)Tu>W8KOSZ$* zkwjIuVCLfh!mxN*@5$_s;$ji&PS#P z%#%T1WjYc%OTIaQvigFhj7UzJKR=SQuP0yI&W|e{CspYqCd>gA$J7+QA7ZRBhpK*O zUO;HO$PUlw8IccZRSjw#L$Om3n6M*tu_{U&=-geE>p!F*Nc@8Tt7&XJf_AwzMO5(K z_ftHYf-JJKr1K7cQ@8Ilugx&njCg4pE{DW$>KBgENf9)*83fH3?tAf_uf>^+a z3N5Q#W{T#brnsI!Ux8n-hGpGic6Ro6u}f@&L3U78;w?qaM?Ze7;&sBMtc=ipgffj` zqnOOi81w>DXowO&Gd(wF0AqgTCB8H27jE7}wt17`kN0r^xiQ%Y`Z967vVyDMsslW3 z6+8cvqQQ?5N8~LuH#oW8OTb|Tlc+tu@5SpsTq#eh(pPUYrmgQUDu#1%>H?Z1tzpO9 zrx3NL)JKW?`pZOAHb%RAwr{vEhhE|?^3rR2E3!x0bEL6vH(iOpbOZFc{MDbcJbIeH zasasnwAa?!QoF*qYL#5Zv~|-%m=D%mbX4=jBpsYXaT-_J=Xb0MYB#v^!jusQ3ybn*JaGe28KYdtqp)gtaH=7*>j##O)k+{91! z%)FCr!_E743Tkiys(?41PS17bI3_8$D%`oFhsZ^qT-L$A7nR(?U_qhivH2#$X0m_( z?t||5_nq5N7eTA7c4x5u9=zq4>wEbRJ{8Q-M_`WL{^p{aPlEmKKPXC`dJ5wOk=dCl z$?3Pk>V4JgC(M(JdAI@p&JJuw3$h2t#HZhWX}9y)Fl#P^FB(VhE{NbgPWW&4TxC|W zI}U9rHV3Xg0q{O&v3#Dt&@xhA$qLTT^xzVY)SKSB?^00tFI^N3;EDlU^2$>e%;rZm%t9HtOgXVamR#zTG>qYB}V=%i1zP4c(6=kyO zQp{cH9Gv}qNNHrtn`t!XSDufql=e*KY*I#Op}xfgoD_=l~dy+LYUjC zq2og9>E9hG7G{*q`Z|iTSFhh2yLWHQ`*`l6k({`g7?ktFUQawI%sCCNxGUVjNOkal z)8v+PqN1@Hsw(7$Tz|i}`ssF~D_r|c>bw({*<}vNcjWfqwm6V*O(9mMtJ!Qf6D?cr zq?VE_g0a@tT;J=-K7}ai#<=8Qd&Kv|9ccyf5*@4nUpN)rdq z=9mR1Yw&NuPrrEaRG^ckU%ne}PN*EJ1WdzZ*}ucHLaGjh^YV=P#Y-~&iU~&#my*Ox zgc9`Gjgmj20)HC9TmI5gcdEOKS!!8UBhSRa88X?ua!LXc zzxxOa%*x7w!t%v~NGubcRE132oV(30A5yyoAr#2Y8{s0{-kB; z?XR7opY-mX4R%bWpIgJSrfv*ljsz=(JbQVd)`4VcH1hrKL7{EO1+(~3gC*|KHavMU zdCQidQ}de048-gk(rC%Zh#6c}FOlf|XKD)Fd7hI(Vozt{-0y3*8WQN44^});(u0oa zo7o(jlhh6y8}5T!U2vybC=NZbi+_(h1OT!E4iqkp##bg1(S9nCB|X&vdPuS=t*fi+ z*Ln5UV!IE_XEWBpipGb|Vj93xe2Kx>&y!e(;pFw$cnIbhn~YC3rJl6Z$^P+R91Ss? zvsaU^qXCdlzW%mlXgP${4Tz-QeKh2*f#q!Q9_Q9==OT0aeKz?l0RKYYkXr+UI4}o-iIA{)OR~XqHy>H7g&CF;HTt~ zFmGsZ?I-jTxZ%}$-+F*Yn^C3pL$I%%ptO!4q*t<-sCqG# z#QlT7Sk#h!h0B7Qgv9Z_I{rKXyHQ#kP%YV}8o2)rbEAeAoU>;{`{i3V^<-CdbO=zn z{w^^0PDxRUvmG3`=i`Q1qm@5}a^Ah0IQaV}C*`ohs40WmAXUH3Vr=rF~^LqT`J+4CYM|7lLXu) z2O>F@%F526iY+6Nnm%`a#Cdl!^_EY1x@cTnnK9%0H*ZEUnkL$L;rt8Bxy3~aH2s2M zHyvdHGfF!z_&9NNK}Ps(H2XB}O#PO`bVwtRuYN;hj}}k#($$Kpec-I&gsGe#2~@F4 z*OLwUyKn)JBdUlPUTycoSgnf2J&&U<1?uz)xHvhzj&d#hW}0VpoPPiOyH+<)D1KgE zEVe@>{^#TVc(Fsk{IFxxeT8Qr^JK_(g|wR;uHA2WDlQ~ne;vAX*f%>%F>lL&!S@5Z z=u&C7EYq{GnXHZX*JOhz_X|HmDnt8wN~2e^K9XL z9TSt@UPI=+A6m_>b2I4b##A0xUBQ|xYiSW+h9vwHJS`plD+Trwmk|Y;@3zW^X-04U zwT^U_T6E}pBacZzfo?06b8!p~xyo}{*OIXY+K@?fzGU5=rP$f-)YU@mc3X3y5YopR z?Td**3-69Ckgv{jhWL$)kAFpwAhW<5Oh#F&tYYVXgJgY(K*D)A6%%SL*1Ed7KD#W% z%>33$3;A)q+~&6V`uF&o-*YPuDy*h2{POxUt3QL@QPv$BgZV^)c*rb|q@-89@@_n<#>Qvc1Jn8rDA^4R zHheul65nc;PmoQ!NS~O+Jhr{#chRmUNEAy;XDML@C|0O|_UvV5Mw--V$7Ap=d!85|}xV^mK)k{f&xEj9|!jtgM&f7mmcfo^b zVbhR}K#OzdT45W_o)Ia|nPXI=qeYD-AhUYCefbt_S9_PHk`DZe0iJ;@m@_r?^?#sj zQ;z;iec(X2n3x#o<1MIepv1|t*4u@X?ek}P;GfpB%K)?1$g8|U5xv&w$vTqHVJ3t@ z$X_>o2*n;!l`8u$OeA980|bG)X>GR7J#w+el+V8*Gf4I4tvY$znQgmxngGS!71E@9 zBg}BV(>XXid|4|Z!e!}Ns&2A-*h3k+Q67kS5Y<_Nafh!XBYkw!o9M*xdjLHw*>HCW z5R+sy+p_$>S^%4g_60+YSw$Acw3~HsF6RScKv96V9zgm8!mRZUIrLZ)`DH=kudz%} zhWu(u7!3uEhVxX)Lsoy)qzmc4YY`4REFtsa#K+@58!c5v zI#}iwzV26AD0%-qL{5o^6>u5Dc)PLV&AQfBnqWoTumakuJQYMFP~fol2kP}uf)!Ct z@ed+%3RW9LweubL2jY6~`6Zy_uU`laX*5pu&AZ77Ana9SB$Qk63Mwk6=Cv%;EopB} z(x>J41LQN@AYZsmbkBZSc`tW?H>5r1b%v1Y$=Yi!_a+Vv&ek_KKSsO-6!#{dwBQ%@ z9`A4{P0Y~#a0+R^#-tMFkGj6{DXp`u8l-H4@=(Ils@&60(~P8NrY%acw;)tW0N1dm z745Gy7G;}RR&+i5*=OyBzirLYYKXLM#9$ZbkSR8n1CKDCRY9e=iN%_^n++80&i0(0 zwEDx}E>jRDgw*#yT!M}ABlX_jp3evh%W_>g*yn6uKE(S$DRd9dZRQGVqK--XCs9RK zcBS!&8%2xlbriet{3pbYx!BHQ1Kdle|L{+3ym}`^QKJ{uuC&T{{X_Q z-rPtL=(@51__POPS)`q}VfpmUkJuLd9R;@@h0^*-q$vBEJM{C# z&;7d3!o&kqdf}S^7zSX1JhAQthjJu5N=vEGmQ$4`D9wDWBr9IL*t2#@A!hx6T>~Ud z=RC;e*t#_h4G91o9UX6#n3>mpi{szNkQ1^nCW@HR+rxgVO8o0y!^68FzdQ*0F$8gu zI~X=m??@<&jr~75dk=W5|NVWOO3G>&QKF?N$qJciDJn%-nMrrbmc5FIkW^MyDx_p) zZ?eZ-QOG7FWbgIA-t{@3-}!yd`JUhR|Lr`^`^5aV8-G7LUI z;fi@$Zy@UDaT#WQ%KjZJ?xZb(*BJez!J z#CyN7`uh)`1r{a;>K-r;0?pfoGMH5|Qw9a!_3HJyBFo6l?U7lrd*~;leH3s8z|A5u znL0_+#?o@4DYc*C@J&heK7|K`7FU!t`sNiB`UNlB(4Zwofi>6doj5n*B6pQULQd3HT;!V>p z@i<8=%2U42PM1Eoi!~jB0hKFKG11xJxCv+nrmD=?4n!M)&@qayfVi%d+jn>UrWB_V z30|nX<0jS#^p_YSbXxxT+;g-2NS-=oci+`;3T*U?0CYFnnOrLE0^e+;9xUl>eBlzi zx$QRz^g-qdwivkLQuJYC6BAr}`?zr|V#;*si!37-l6y+Nyd7)J3*A+aI3a3)H=1qr zHE8n#IfXwg6aV;pXAHcYE1noG*C=UGOUSD%xR0?DkVWtcxENM(@pv zJ~6QUo0-zw`|miYifd>7dva@W03#cB0LZbebR=~tz;JqUi^u78J0C2_oew1D2SHS= z{M3~cocR?!I$mAs61Qy!xE6Esas{i_rY3!ySS7P7-_mrF^vi!KZGX$lREymDj@~lg zHM9;*P^^LBwxIz?1xEJMdyPL_*W^b%2PVw4$SWz0AK$Kz_j8@BeWTvS_?-*m-rSRp zi-&twfJpBZwAceTWs^l-zF%UH9&Eu`_4;CBpkyZ(vbQTi<&Q-9O}wrydwJg5bt*sp zXKR61nn>oJVI#w;^PhTJepdL4!9vVr!kjZEkrI~((9^dc{aTR~dAGAuL#1Rqi6(GR z?qZpO_*wvRz>B@WT=3PKJw2g5>Fu)Ccds{?388Bh)zAn`o* zD+NC_Wj5)>0$$C`Rla-Q)|9B28BM?bT(8tTKM=bD3@iI;BpC=7uGGWMq{2HFA?sE$InNX-)s%P6a?Jlz%(Uy-ZnGy4I=O~l0NP++Ec|k#87c2hd&0}MYUcLvlsI9+O z2z2+D2AX@yk6i41iKrH+M^Hp2H34pIXMTA6W#tE6BnaN>OS5OxK|QXTIzLy zo^n6*XOUtq%Ss{lMk2p;G*7;K4=NP?tfLLe+nba1w*Z>KA&;rfZ4}@!Dsi8H65Y$e z@e4;TJI*(uUyZqT`Y;Fm&=8l{4ahFrYTFU>ZaVqs?ZBcxzEu@1G;@#D%J~ZF#CvFn z{gfX^abiIPM&QH}68J!etpnafQF7T8y&{1OV~ONWe)b0NG%?-6>Hqj~)xGtmpA&UV zfvCzOF%G^|{bjx#>rq#A7A?Kj&U;fidO1P!6YI!sxo%jJvszozU^@05B$QzHW3Sh4 zW$B^!kk9!SDhz#aiv1L+6(azgoI0ocoW1r%a1*6ni)qH#1li+&PgmDL_#JJLkKT-0 z2X!gBeMRKAD4i*hL_88wxQi09`E$J}0y^y8U%J6}4Y}doemD15I;>(Z_$~ z_E;yD!)>lVe)Q;Q?K8#k@#@|1MoSK+KDk|L{s2+);*cbO70*p>>*?q^v7N47y-FO; ztIVcuO1@Qbs>3{uUf7FTc;|*b4`gNF>N2&Zu&MyIeNeuj& zS(mw)2>U${GDza11;9V=uNfOwl?IMGr=4s zO6A=?HlgdRsE12G*J{oa9AsBX0l++rQHn}Rw$gs_g+h43WhH~k_tbH6gd(#z#y3ac z4MB}D5m^-#5vW4Y?;^u6Gvm~lR+=S z^-ckqJ=?`kfWNhQYfz%32Ck0aJVS)GtXs!T_=tG<6%^r$sfme-mR#*)+%Yw{9)ym7 z#rGXBa`M3f3N=l~Y=blMeqO5{da75lHkkLm?u|j|x$nyGN6<$nubZjS3>Py?w1n=8Ab}8Yi`1KCzLJInATwe$VLClwND59%jPhn#`}fzoEe!0rIbAItYkA^8do| zayGMTGV(Xfh+A=Jt^@afEV;-u|MSx^bQ`JqzAxnK6N9V$9>2dkhm54NL43m?Rb=3{ z^ul`h+1>)uAZw-4TqN8pzy*W7*p2@0$=0M9% z?zrQkRqE6R{+52`%Sp9@qU}o(DRXt7mlh1s&DDg??1a@o*L_asK8QsqnvgC|Xa?rS z?ZEawef>J^$8B*6gzNI?NZ;wL?!S;_aT1Nl3nd;L7JE~#=T%2YQPZ}4Q-ll>Bpu!M zt(AYecMV>((M`}WcY=3ZLr29UZoe9hIPkqAvkO7`y;W%xaE_#cq!tpp7`8v4(w+IW1Q*sbpn@<2C6wuSBx1OQUcuFRXclRPuG$iX7aC=Ck5t13egur%1*iQi5FhZx6alRHwFea z!94L|q>~GzaE=XahZ0efEQ}}`wC8Ss<7Cgmh>Ku^W$6Pef(d{9damIO^M}Q`>a%@* zSrehvqRJ55WSMmd0?flnsr1>{e$p1RzI;)Qg9I>97tVx9yj4f9$9N#68$4bqjDFz1 zVQFDOHzg)MZwV(uwf8?5LCrIZm@Ga3qUGCqs4E@y7jTo@nNVvs# zV>s37QvWcAbebyh!HR%>gAWfXL%fm+%{}Is`(X?K2bkvXy}cp4_viMjCU`;vB5>~T zR(i~Eh-kC#ACTtaxfO^j>7lnbBk0w>a2st>eT=E6UxCSC=kx|yh2hMs@#}Bs`Ch*o zHj>qGS(3`nmnL=qw3G-l+rW}TtM_yE>$jJ#bzw&o)zp+7ZG zoT|5a;R!tS1TnPx55E3sWfNWJP_sAcibEjgE4niqltTCnn^R5!ry2fs?tG*)DQxJO zegZl5L#yq~NJU@eH^Y3}eZijpQ5e{obMOCrl z2U@e--Zhs2FqB*{Qbb*X^5%Q#mW3444%yI|4Yaq80e!%{1KfhcI$RXzcb`q~y$d0Y z(Dk!X(7OOy?CI<*e0SxHNMyllAP?{%^g%&CHFzK11{oE<$vCmKbo{LX6H`+$s);6` zCiGhq|1f(j5)oj9VfIb|%Yr~eKy(ccQ>pPa_BCw|M0tsy^&l_r0j8K91>3%DGLMfo zg&ifq)ah2dT-3)bq{4|4V)!IK;FBap*kw1}d81#R4h;0UQXKU1Pm(#x{|#ODrjntw zbxxred?Dl`1P>2t5O?s7zqBBIwH-%n>PFRfQR1U44rb= z_&$9~tSzRS_stj{w*GHpqm*lW$q2 zhorDwxbb0&QoDSWro@#;|CM5_nZDv)Ut!^J3DE%mMDaPV}^AP0++R{^AA0`GC*g@AJUy5o4ccu%ryX#&44I(wK$bL&2JZhwG2UZFTqg(FuQTXn3(jpAq3n(zdhG4bn@jV41{R>5W=8XD*2!l>Tzo7l2>oz z%dW%7VdKk~DsuwJ;R8&;#*-;odG{oDZ z#ZBR`K&?sz4%A%7{g~cjd!7Ri0my^XWG#4m>06Wvsk29U_RTR+yLdxap^@^5?CmwY z__lsUEVAnA>i)sO%RgLXWH^1Ag9H661qM~@ysr47+f zS+r^(laVek%o}MMh0~JY{t%==FZXcqK~NC2HU{6vb6(MCpMfA5Dq{uv?5$vgd&ZC6 zDLm?eHdJ>}rl3oxe}Y`_3eFV5m=c%`$y!YN5SYZ&8lxn2y55yHIx$)wRJ>?=74`85 zJ3Bij@pM13o8T}ejpXH@jlrQ#Rlr1N~6PxV+N@0QX!2jmS3K>?Hcn^us62rTQET`*mjI3;+4X9J{` z3Q9_w;q|oRzyWVUINFvIdd`hYS?`RZYR}M+k9W13F(qYhre*o~oexS8Z3QlzE-M!9 z`6E60KU%T0<29z(Fxp?((Xr*7im8>|2{pCd$a=1%Jv6yjWO@zmujE-Lg@vcD;zOS3 zG}6SxhK7co8%vE|L?UpoQ8~!jcYzs?1sm&F8ggtz;pI;YQ=vQ1CQ3P2r#+)ie=pZp z45V47+uk^?fcFPnxXXHNbu+zV>j!+Cv}L0Y_IxedN)-^J!*k9#7?z+k6uWlIZIzL5 z6ssE=SGiJl`fHU7KnzwX`&|$W8ce&&eUeTc)lzb=UCKPzb&wl6m^*ih?QT|#boW-M zU_F;H%g*7k)A}0Lx@TceP}SFe&ID8va~H2ySo3h&6#W${ zJavprscPF6O{Pjv+1cAGy*zao1*E1?sK&eWY?n_5E@J)|w^{kk+`+~T(auX3AWwvR zk5nDV>FG11psPy(@Z?x*{aBBm1p32TYR=qq7cN-AR_c77{m#AJgR(#)_g`AKW(Ute z`WLhQ-wf)2b(9k%u}06h)vw;-2$Qr6gkzn6WuF9Y1H?#3Dg>Qc?QtN3D)G620ds-S z4O$x;QBc?wH4UuPp?E>I4lQ2`*(IzWL+UhIM6K)_8Sq{+=(5^)z$>3EZHJD`6@AGD zRDRVhfS?j{j)6+;8aBQ$3rE@0^7cuI5a#m?h`=G|hOl4X@Z+ecG&rT|fEN$I*|kkZ zh<75>*pct^W=xA=|3Oa})l4#xFVWz*J^aldCz1s?o9ne2@O)zSmO6g*00anldeHO< zltpzO2mtLxqM<5nceNeSrhySZf_t}Ph_oQJ3u-hr=g+5~8!mRs4m4!{_?t|<9M?^H5NEwO*Y6KCA!eCafozyS9=bz3n36F2znSKH)g11f=bPhke@30UW z6a-f<_ragY1SF#JNj zjVwh(N5fxF_+(-uOylLCF$dcT8Q^)9z}_l|Bt8yKK_=p1*)PAm_8}3nLn2dRBmo`7 z5sN(!?Ir@ZX5d5uO=tzu3WT-!it{sbDRY2lBe_CP5NsV<7ZB!nAArqEe2e|0s!99V z9m4M)mfB(%&keC3J9h78gwG~O3<@d`$GE~R0AgVnd-=vCdi9TQF0&Fa74$!-{0S%r zF_jDy#l_FYdV>HJksgJFRL*p4(diE*gFl1Z$NiLk=7Y@~?XHRW^MTM6lZiSAGNg&{$h)RorJ+|NSrr91q9+#1E_oUnEP%pJD1{TPk0q; z3wOZu>us~D|JQ`=AK;BuS#e<-=Oi>>YXOlQdsmkL67`cp0~47r|tj86Q42GP~rB zxn`=QFcO}nKR#RF85mi^G4KF(I$IOh{QSQN=;CH%Kp{`%1WuzKiUWtI@{`}CSaB+J zrGMr7ZV3~7_-w@Mthj({Hpiif#+Rfir}J!<`C7vE43+i==|v|4VjS;uF~Fik#ts1lZz=f-X8(-h`W`6HLz9PMSDF*f{#p%T8YLt^{Ne5S_(_<>&Gd_ zrklT514n`5NMcYPI)D01$bl7Hl^F1CDXH*3^y$6f?)>?m3-`qpb#-^3ig{i?fZntS z{LBWcT!MP8s36b>vWaKm3jUEOt2NotyiO^S^dK4+ z$;I`7T}Q?~Fe(xZ!H?Vau=a`_tKH?ccIiIMQJ;i{D)iS4Ly+fUVDRJP7M%6f0Kwrh zC&HJ<}HM@D~N*n>J9Vv@{Py~AJqS>*RzN#TLr8&3?gl}H*gT*)HMyAO6RN^!4TR!DP`^}VlmK4aAS zhZf)q8{r?~2yKA)?Hg_y@A_&*Ng%uBK-eK=nC@uod1DOg^I>kR6yXIh@bVx_w-^cL zf~oC+(4HV)O1)*Gv~tYgeT`sH?C60TpI!)Hf>SWd6wy~|nfwnroO5d48^*YlSALbW zedN585Y(vZgg=0Q6cE4JL`;|HLELmOJ+aQ6`brJPZ5)$6KH(df$Z`spQII(yXR1q- zlcon#CP(e^QE}o(66bW}FP~LkK6q21_nVSNfCw*D^RxVu=$!m1S8F4e?Ih|yya`RC zGskUhEn$$tsH8kXH2*-oC_ENfr5$$=l@v@0pFh8ek%80fB|vJ91P|Amxpc)R7Q$Oa@ri`o3ztY4N(AQ%An zMEcCn{Jba&IVZf$4*Rgr?Wd%4CQkKxYpTgUYE?oQ1N`9Cqn374YMY2r8JQfkp79iM ziu-YBLBf6brJN#Bk%OmE&#R#FsGObYSo!ed(}wnsHpAcOVMk$LlxWmku9W#Mjh3pn zF-<^Un}|t*d|El`m~LE;>Z2@ccHW?j7sh5qcln>@J7U%YgWF$m42$A}=eIR;!DZp? zl=x$;`h}FBRqKnfH4{q)7=cLMet~=FLfoY?t|z*|l2gOC<{3;3t8LYN4)aEbM=vI& z(My_j!Zhb3(|k>BZ2)2bzr%AB%vj0?y|ui7D_A&ZaX~^_i&6bwh`I?EG1g$wh|thNd<{ll4!qAz5q{8T_(vsxZnI^NBy;+)#WrTA z+PAijAnyFIps!lSE)(Mo1`V&hcr_-I$M`-?59gd#RNdmRJtx}fgN)z1rC#_5z?<^f z*iB`c+dkf;-w-s?=J0WL`c=6spu0%tc}_wM zAv^%ft(a!&d$q&6m-8STGYR9q+ZD1WgnRu?4ic_?#$)Toeqb;v0!P63RO6N8ROOAh zC#{DyR=yMo&d>Hx;ffW+8}0DhDq^JTHA6(ZFY_5`c z&&I?K?l1X--lOvI4?zb1KXaJfBSV}*>f+$j#>PZJMgPTRFYh#3zW5DfBZ?JY_}|_9 zLUR?PQGjEvjeoacldxvR;57xYdEpE|u#p0G<2iVLcVUC}C?Mb*6yd0zahhEl{&on; zbPUT0wdMrD2ep??pqmSd2FjA~7vO{YmX|Pk__{1f&kc;msdp+u232&>S=O}Y-47O@ zx=g^!csxgJNBO~u2lMOEK?eQf2N?=PVepFB6;HqjQ9$1bv0)%;Lug(VC;EIjWIxmV z882O~Gs;eV`d^{&LnN|x(!d%}CP0egfbvtu#TmjLQnAb!3)T>+{d0BB`HyLbJ0%Cj>`hAFQu?Z3!9*_s=I zImUg&02K!J>eq`~8+pTz6AB%~!Ea);Y{-14o?13LH%IXiDsN%?0!#AB%y;PP9zPjT`^TF9P~cHZ=KYe$DUZt(6PS1$ z7uR|0pC*_GM*pb8{u@slP^)xhnw7UsCB|oJmwC_V*y$>W0L`4E7-k$47Xb3)(cRYtTn9tU!%@o9lB~tAGM!=(Z zE7X|SlJ86Tt+DmpX> z${*=|*60|R({GFwd8~k}lRhNcjs#7@m(Gut8Ib9wOdJ^zFA#wvz2EbD)KVrsPa3ZE#E_ zym>2;Wfv@5o6R_*Lq52Y<;#~@3fqkz%G zW5C^%k0K)Kybm$-ym|ZV<8#^Lzp`REG1NJ(EdeVW{QFIejMasAH(;V{H@tJE(?jv) z@N2x$n#lv@J#sRC@m`q@omtdK`}y&CQ2>bCz-%jh*pu)zYBfGXTphZ@RfXu^&jY(P z{MacEl7&1I0^b%-&(oVaRn-ula1fd9gzBW#LP2$88VUyiQXOxZ-^#{}mfDOC=W1m| z`r;H`4*MUn(7o6Vr)@%RqbOk&mz2~^@svl|1LBSiclJftJ^(P`16IMZe0xSJf^A_w zu3&F3jx(^;lI(#SO}s;NmmUHW4M* z;W$ArATR~zx?~FYi6Oyb5HCCS-G4_b@pN%U*j}VJvUxIt_KILo8EWx{X?^1xj8@$v)J@Gzh+fxc; zn)cfQMLzlM1ANu-pLr!BUqbL%YAjHJUAhu>wH9ahn$K|1H7VV(b!SDoe# zOk5rOT9SLnb7z_NKc&`1kT!-7RwY@zC2>4X)J`hE>tY170&xp?4leWhbHnE1OH~hl z?=lOv(F5DX!WoE>aSrF%iyTgq=F+pelCrXQ?7^;ODr*6$F}PvOu-{0 zMuuP$d#LYt+MfgPlIG_pw;yg-=>B%=O4n`itd(U4bFnbYL&nP^D*aNk@QL%7qvTO|Eyq(7k@?8ce@q; zHh}i@+(4u7`{nME=H~tVj67#MXFhj%dC93~PpV=p;`sUVb?)&Pyu+Ud{IT_CE?v5e ziv3iUg#m4Ln9%sGfzb~iUgCi=!L3@sZS54ihBH~ye*dh~o1TV;*Fun>o;m7ZQjpik zwJms&MnQ<=d~)jNC-^4+xZ3c?89eAN^MTC(NcUko@cdA69KTif`B$3*!j_la6aF}c z^X;bJ+Cajf9hFuY+Z=JZSO`y^|NXkgFCRTx$d$+8s`6J{%b2X*pI7{W+MVmqDZEgJ z?DE`*>lE*~Ffsqp(Z@KdkLa{)mv&s^CpEo>0v@*K5MpDN)7Jl`52DyvoZPvQe(Yyn zsl5A!Uo@8cZK@Z#qON9A*i`INJEV#Bb*jb6NC1i(P?u zVH)^tLMQE=l*EtZIpQzpdi=h-@(Ji@B_%O&t{ka-rUf6(MfdDASpIzhs@i2H8Ih_I zgga94J-@uj-MgwrzuiiNz0l-bpsn_@c4O)FXL}KteO^T+(56L*Oozl|Ybuo|#HwQo zBcef($5>okj3gsIVk^OEZ8Hl?Uz_Sv%|}V^?Iu_l*qg|i=K3Kb!wR@3^A-Ym)sI2F z$p&9#7(^fJEH4h}e@is)=V{(VV$7 zEg@#H=Ti&h{%7)MukOeDkH!t(>f*8@N!deq0~9eTN}d^M&tPO^RKTNw!98c4TBFWL zGHkjq0Un08)^CWYK0kQsbNKrQ*#3-@og9(5vq6S^!%=+HtRh2P-Q5WL`fB z=)E_p1)TVGyZt0jfe}RegIz}pX~azdqb3Ck;AGsWhlX9He|xBB38Vh--+6p(>b1(N zSM>*1Z`^hz65g>;LF7HakhR^UG-}BMf>SoUkK(r zkv=?DCo#fr*69ZS+O2m0QKBX*36WlM!N(Vb<3R{N#V#S^_J9%#-=YUDM9R_S1x|4P z%;`qWA8={IHfu7z>$ z-W@ycbd~7n69$=R$sHitUrK5=LUL7Ds7bazMkeQ`auf2VHDFo49$Cw6Fd~8P=YY>l zQ_Q(rD5X{%?I~0JluFuwN%i%G0B`Gh{A7^RZH1rG>R?(>zbu#E^H73YEBpP-1hP+y z6%Nst@YCV0z?qu4C*scqAzMB3WfU5|lVF}9R-zhZ$PvH&V`)_>No&5CTD0QeAsGo>F9 z!9kB|Sj?<*2X^C{=O?^2w=bb&lDiHZ0nD|lirG)D1Khgv$lRKhIkF2v-YeVnr$;&> zNxxv~d4&fVlN}3A_#a73vsa`J<1&Fj2zy-~v(nU)#@9vR#iF(wz4QxL*yuBfb z3vV~Z&cSbIWK%Cn6dA8(R@Ib65r(bub_V`+Ikq!xE2|>RGHpiMCHsevYwR2o+kv+dvH}sZwmQkA%|0QkPlGsUiS)&ag(KH*ioESS=MDuue2S^ zxZR6w228?GEwB`qzhT2`0qm0U6kfWL!j!XMl!GPh5C)%y7#oIik(8NJUn6`t zq@JN$zpBoHVoo1!t)x7h55X~BhR+tKTP(1XkV}!#vYv)!7otMQyS86QBLBXsX^@R^ z(D2g>Ds(lse>UJqvVDZ|4f79Y5%B~L&OkOOIC1vweXB)`Brk3!&gnvSwVWu9yy=Sy^7fgWHXN zaed&kPF9zP(4mQ8GcixU6(3BY`R%{_04+_~L}vL_awi{wfG(C;A~+JVC9$h4{-8UZcbXk5WD4YZin3(v&D_MACS#t3n`e zS8{m-aUrbSEC|ywIi!(*;04Qx+VBCa14%D(9RF4Qh(Z>BnC!RyRg(Tw_37-+6 zsrfZQ%SG=1aZYUVudYHV>Gj}^M&aeK5FNcZyNT<(nzK>|RQ9~S|EJumQ^5D*pOehG zX21x?Kd(NryFeTEhrzZ_qZM2XP(8wpM)ODZ?_c-I(?T3m;+LcGgPtBxP5=GXC4UOz ziry1%yZ$POpZ`y)=Ks+bb)pNOoV@+{v(lOK=kq^Kd3uHgjgFeZ1vt57xM|p$ouObk z1W{j`j`-@xoW%Ks&4&i1{JJvfsi)?%v-KcvUgEDeZ`EKg;it*ogD>UzuqZE$orYXx z71=W<_zXoteeob3hlTkVsH+8D{>X*5ae8N;&HTj+oBfM-%yjIhB5L9zI`T(%DeZ|P z5g%P$(0^zM{vU7cbiTkj+WH2IHewwJ|1P3=Y>D1p^;L>Yo*07=Z3b0VBKP=fHZ9%ii3Wif_kFzTy3K`E=H|BtC{wf;H2b9486=n$s6W3we%R!OJ=Nv? z_w4F~4jPHxn6m9=H{H6?wR@^l_$52I1&EI{>iH3c zU90X?-`hKN>!ZMa<_yEmbV;e>d_nHj#$6%@&(fZ)-c|md{~Z1k&pwnXz@L0&fL*?- z)0bxNMWRbnV-Yh-(sL0{oj!TB*+?yr zG#eh!!ghNHU3PFKBWUwQHMVAgBn)qTR*4C+i;AWeq*wz_lBo%gLN`GryY zyLzd58hb@{Q>B?mfkjyz+2;BUD(!_e0CF{Q_V`Wmtzui~8)Nz34~u1P~{V+?dfN8_K%iKv~Y zGsTMm+iruu`N`HDT7V3P?Q%xwwrSbFSm@hn(^M=#M30wsWb6mPl5wu zXDU{ixz!d5@se5Y+;zWux7K8%GSyF&+l(xa+ze^U*3fNJ3#3gdOzILmXp~u*+}bp} zHgLdD5g+L*{tM*C6$bll)JL4os5_?BK5PlUdzYj~P0Uzqn z?W1zA>f`uN)@NUJYK1sWdi;Ej4rTJwGX@Q&Es0T3uuY#iA$w_kj9!WGxuoV5$HaHo z8mD(Y*R$Of#1l#{n4(qFcJu1>SiP%-aS>eA6m--gLg8|Wl6Ca8KR-(*FdPq!y;$Ys zdA9y;ZBm7k@#EU-u?h=sZ3q3u*BoifG`7~H2=vkmR%4Br;Z=|AlOhf~rd5Cgf|6Im zYAcZAPRsB(?>Dpkm8^m8%p2tw#_wlF*=e=Lkl4oFZfm%9dP2BL;)$9547MKUT_&l^Z;49F<8)Ng*aZfUT86-Z zfn65;x>;Jmf#IF;t6MLLevr6bcincCa_amS+k}A7=gMxjmi^MhQns$nC8{YaYnu4Y zBWW(gkWw}?l!&KE-XlJct_!dFczs)i?~_y&xpr~;oE+BKA^u)dHfWEi9?H4{;h(7S9*C!#xfufEtVwn>C-w&phDl3RIk|wTDWa4Os-+#xH4u)sk+BvK%rJ}eTso{ z&Dq_B0mtqfaNnUyQ>w}HbREBdk%(YQ3Q^AO+ee+zGR$UO9(jCZdi%WFa^m8L7_IX4 zhd*;)&s--cxcL9G&)>SR>b2^N&77i~ z7w#~7F)^&f**;?EZG9CJu||@zf}f6;L043_vfD{5(7mJ!_F3TosV}~{#6!N2tz0rF z&tfxP=4Mq?QzU-4f=~3coyVwpY<3Lq+4>i^;~sBWIYk^i%kIZG10AWNO%pifPw1+l zpimNPqGyclDmKiNqU>+Dw@dLxivJV+i-`Bc+=XoE17@DfZyF4ZnGSIrTe3gQXVHu8 zuxpEU6o*Ib^F0>Myw#~U+zhc*TP7XT`1uc-iHF0%2V-JfTZM0Q$~mY+Bog1?t{z3N zKqJ4apDcWiw;DJ)*;~JIiN-qA7tS1T=RRR%G<2k;YI||NMV938Ii}#>i|W8ry)&|B z_PDTm`1dRR5-F5W9Y{Pr;z;$p)!0MN?0bbCObw2nI_0s7z&4od-T8QXNf!`Wxm{6u zZVv@ucwwkWD>B4s-y${xDu)VJzT-3%I;$TVJ`)Q+KRwi30;o85fzs5pK_`Q2?_S)g zDyXrc0b#}r(Is7gNdCv(U2u<96|KqDm68wa4XM!nh&B!5o!4MoPNh{bf9?kYg`_imwB!_vGX*QrNOhqgP-5HB&iZc| zyxtk@_TE5Uhzt`9tzbrNTb-H$yaU+aHfK;B2>p8gYF)JTC*~ zTaA49224J%`ffdZ6)U*i34JNrhSjJ5AL1E*E^u*yYKoHkN;)qH6B4o@A;z-LsE$6E zalgVOqsL6lks*2YX+?z+lhiJYtka5$`=q4Wwmn4eGEUdATJe$KIdAmLk0T-&ZUhjS z(L9=b8ft>cv$`!d?c|rDwLSjKjAXW8Y&1MK#$R-Gjq_lb&gI!puSd0M5 zX2c{XCnujcbqcd;yTHS6aM*p{G$Q%1KmwVc5E5L6CLg8>Ibc`h+K;}+oDPPm2^6^q z{WZ}|ps9th`5+xD{~aV$QH)j}DuC_4p~$b($h!hB%f#t4xd}W3aI>3}zuFdjW&-g1 z5NL+MwO1G<_hA$A@ZT**q_s?75|qHl#ch6_wYE;52}8EmID%~_fL$P)`(&bao>`VA zMJxPQ<2BMA0Qv#O#||#B^7sa+HHFZ2W#N@(0d+Zo7mqc!GFsrOY2=}|k%Bd(~@}^Yq*$`ccBHVZ} zK1u@U0>xo_f0lJl_?ahr5p8iCCZ4kJ(ZyBy7r{N-8jbN* z;3H;9{q69PKLzaB&=@+%2-qN_oz=JqXdF!7PH20pyp%1^EY}U(hC|T^xXaZDZ(@_O z7e+rwht@g6W3E3|P%T%RbETC&2o)Y zLB8U{-a1Po*|l60_j||#nt)AW5%Jkh#({wiTt)psc<*{L|UM3Ssnako=5zI$fU`_ z)fpv|B|Ez27}9H1S?Xw79)AAO_nb%DOhn-b<{U0#J)|Z*+qoJO-;4~L(lxL*T>g}H z*Tr$EmE#^x)FEq!2&XKm^~+xm1qA}1L5O2e?ETlsT7^>{fvi0a3Bjxpw@7GhzeLE6 zk+9g0A1~lW!Am1jSg=NQCLM?;QF(|eMOY(A>P}pvw0yt3Z*EK9cD0ikCttGW-n8(i zm!|-zWB?S!F8!cZHq6%sSNC(oOqOhr`Iu!%O2{3TANgSK;_mLg2@pd6JfW#2fJ&#) zvo&O^#aVNJW{Mz9q32~lwqm>8WeNbIyM%UeX)_q zHe3|303UHi^c^XHpEky%-59ou!}q1OUQvd=(}rA!%gPp#62$lHLI5`uh^}}TI0}DB z!RyEz)Pf%%dyp+=NJ&2mG6$_T1|N{EJ}&@*o45KZOygU@*Tcw&ew40dVR>N$SKtm2 z5ti8c5Kg~yG)FI7*oYH-4~i;mP(&%50Ar6^!%n3-wPhH$9G)3b4CPJyLS=G-CTA6` z0)=%+S$XZ+3pE^t`y`yJQWLq?a@_%WjC5Sgph;JMj5-b;QUu7`4n97HQMv#JAY5$H zj$-g?=|tLlwdFG2UoG+^(eYD5euuaN*<3)W?9z@+IYYC}#Ho(N0ca+v(drYx8bSp0 zBBYzNuNns(@f!ekx!cUPQFA&Lf)6P|?zm@3S7+cA6TR;h{_U199x6d@ii}C_ z*eU2B!bk~0Oy`S=ia?D&!KS?WtS|2JFG+8)CL@s{>zwuu0%JP)7~z<9bz34~{t=EZ ziWp3Csa?gPF5tgG@!-Ms6iwsn@9key0Amv+C3GF0=3IG+Ov{zDII@jEL4; zJK9lZv#F1_?7^$>nwv{ZMbq^`wZF;BO<8JuUP(^}zZ@{-YPr2hH|JH=AHJ^oBbVr> zqkuSwKYUa{ntyn_O<7ETQ zD*Si*Y&}c^%?Qpzd58@Fv9Hp_PKH7T5ix+rAJ60hErst3E0{sM-T>9tc!V3ICO1-~ zUauv{b>w7Hppq%ambP7<>tDZNLqFCDhLr6V`(;*+klLUh+6$Lj6hS-$p?mtSlGKI zrb9j5NIfFy=>cwTPwc^DAf}+bHLKSqhO z$6k>D)RLN4}h3B3T}(F{PiP7UVJN)cPs<*=OCeu`eJ*f=sXFfafKWATC=HX`C-pF+!x zk?cpLNaCz7eU-FF=>zf+)`!-Xp%}q<4ELe@*bs_U%cwmgHt5>H8FYTLrFuFtiM$fdAjo)2G+rV(fqO zHUY*D&A&-?C0&3{54cPCUtfO9q9{3bB4XH}>M0z4^xJn@Lq=XGeD3Dg_)65SM6#lX z9wBo=0h+5fkiYN?RDW6Gt$yv@jaX|$DT0GlV$crdTn~;8I=I5#>2O&I|5LFq8JQ;eur6t@~Xt~xZrnd zBi`~69Y{1{tP&2QPE|Ehw=ohAkd$5e*rl|Fl`=Tof7ITFB z-aILe7sm6Hc=n#Ck3MCX>QKO+tD?w_8r8841P9U}?5=m@I}u@LXlyoZ+gAPh;!EP3 z$0Lty+t@Sv zpbsJL1PEuajqx%*Al6>5cnvzG4_NhHAU42kfrO{5P7$*m-9cQx1D&WbvXM#QDM zLEW-v4_qjxDK>7~rhv~B9RSK>;^QN*hDd2Ai2J&cZpnVc;vSYb!PKIz<7=|~jh8b5 zGGy9>z5h}%Qra%P*~rd?bMw}%4-C|K)l=@}{L1zQ-HgyM1)RE}BF4qTP+if}&=d

l5! z>?1g_5dAXR)1@8~aqwG66KJy#t_*$1((c{6w~>*tL{-P>q}OIH2t@D~7m}}@1npm0 zRrLZk@xn$;j}Q}mG3uDRi&Y+uTp`2HdvIcNtEcS2Mw=SUHEu~q?DbBZdicBV1=;Du zp*F{lhx5*I`+NOzYaAqY0zbi}p0=uF&u_}s+z zTV38VJ;ir?cZ3!PKMP0dYd|fUpZ|~)5D32g!z_gADBO>YjeQarC~sjgUi$jXiSIhd z_l0dMQ%>8%Hk0zMk1ryLA3p-cD9T~}bBxs~xh}Zkxw53rc;RNE%-@AHfT5A%dTBi(2Z9}lJ=ke zX2|bwBb*Fko z(*`VZNq8_wTYjSB)oJnba+TGQ_Eh3qJr~ck5zhmE{*P$u|H0Ax{=Qi=+4fwGC=THP zdew%t)vo#ydcBvLGJYP@tbKWL!|9dPB8PI#8i{iiT$^0}4DaPzYuip8J7LwdxZP-R zt^A2&L8?2m=h)5*)~#gw+8=G(R#&i{`07oYD*7Y1O4h#Pbgj7*Jig=AUc2;tXWgYa zi@w+t*F|3#Idx-!bx~yf&$c!9zm~Xex=_IQ!OHECl9|z#ML|jivOPo*N|C5-B?sCS`<#NrG2;CK&m|5Y1RJ2_jIH^BFkh0 z-geHHOD*)}Es{co?iW|S>^C8n4_33$cp52AZ9TcMU~RM}8&9n1g4Hgg`L7dBiOZu4 z(z7P-`zP*NnRQ(9%v$ff)WG-+;@sUjb z{;7v~4HmoRwrccEI@Rq+I#_j#cR; zNfe1I9PGdOPd{LL%X-7|DC=!%hubEkj_Pu^&iRwlvdPr5(lawo7v2b-Wt$E1U3)Fo zq3?j!%yUwaCujQ@UEH7)gKIHav%2{kaZcjO3~~%ly%sWBucqiZAXUd`mXNh_DQW#g zji~sOG#$Hqk*w`im)x2{qsX>oR|b!^)I>G0ORs6qjm%oE(@uyN=GH1reeG6j{`b@1 z>gY&)Z^=_LD?@e&yqQ5&KRjSQZ~cm7@+l-fvY$<(@i}cn=31rAdSmyKruG$%-%C0r z71cwVv_vAazj_?7Ea~z|?8f1Z3Bx1mS|jnpzjudcm>bbzq{qonIL<~EdS9&O>R(n@ zr_yr$y^xt6IlAx=YzXSxi~pmQ4;8n?8qFVqd{RL@e{Ho$C=r>rJ=>D~P@%5Zmi&7^ zjqd~Ntf|;&@TIeEUM$%YtQCl$6F4CM qtWmyw8uWi2-G5LZ{@asgnN!KRbWg1LdshnlIdk&-iG*XiuKyqEc82Ew literal 0 HcmV?d00001 diff --git a/docs/src/main/asciidoc/security-openid-connect-providers.adoc b/docs/src/main/asciidoc/security-openid-connect-providers.adoc index 83f9c3cf081bd..9010a4f53894b 100644 --- a/docs/src/main/asciidoc/security-openid-connect-providers.adoc +++ b/docs/src/main/asciidoc/security-openid-connect-providers.adoc @@ -412,6 +412,23 @@ quarkus.oidc.credentials.secret= `quarkus.oidc.provider=spotiify` will request `Spotify` to add `user-read-private` and `user-read-email` scopes to issued access tokens. For information about overriding these scopes or requesting more scopes, see the <> section. +[[twitch]] +=== Twitch + +Create a https://dev.twitch.tv/console/apps[Twitch application]: + +image::oidc-twitch-1.png[role="thumb"] + +You can now configure your `application.properties`: + +[source,properties] +---- +quarkus.oidc.provider=twitch +quarkus.oidc.client-id= +quarkus.oidc.credentials.client-secret.value= +---- + + [[provider-scope]] == Provider scopes @@ -512,6 +529,10 @@ quarkus.oidc.authentication.extra-params.scope=https://www.googleapis.com/auth/c quarkus.rest-client.google-calendar-api.url=https://www.googleapis.com/calendar/v3 ---- +== HTTPS Redirect URL + +Some providers will only accept HTTPS-based redirect URLs. Tools such as https://ngrok.com/[ngrok] https://linuxhint.com/set-up-use-ngrok/[can be set up] to help testing such providers with Quarkus endpoints running on localhost in devmode. + == References * xref:security-oidc-code-flow-authentication.adoc[OIDC code flow mechanism for protecting web applications] diff --git a/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/OidcTenantConfig.java b/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/OidcTenantConfig.java index eceb91662125a..e97c36d45e9a3 100644 --- a/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/OidcTenantConfig.java +++ b/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/OidcTenantConfig.java @@ -1605,6 +1605,7 @@ public static enum Provider { GOOGLE, MICROSOFT, SPOTIFY, + TWITCH, TWITTER } diff --git a/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/providers/KnownOidcProviders.java b/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/providers/KnownOidcProviders.java index 97578c1078376..ffa89cdd5b1fc 100644 --- a/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/providers/KnownOidcProviders.java +++ b/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/providers/KnownOidcProviders.java @@ -24,6 +24,8 @@ public static OidcTenantConfig provider(OidcTenantConfig.Provider provider) { return spotify(); } else if (OidcTenantConfig.Provider.TWITTER == provider) { return twitter(); + } else if (OidcTenantConfig.Provider.TWITCH == provider) { + return twitch(); } return null; } @@ -126,4 +128,15 @@ private static OidcTenantConfig spotify() { return ret; } + + private static OidcTenantConfig twitch() { + // Ref https://dev.twitch.tv/docs/authentication/getting-tokens-oidc/#oidc-authorization-code-grant-flow + + OidcTenantConfig ret = new OidcTenantConfig(); + ret.setAuthServerUrl("https://id.twitch.tv/oauth2"); + ret.setApplicationType(OidcTenantConfig.ApplicationType.WEB_APP); + ret.getAuthentication().setForceRedirectHttpsScheme(true); + ret.getCredentials().getClientSecret().setMethod(Method.POST); + return ret; + } } diff --git a/extensions/oidc/runtime/src/test/java/io/quarkus/oidc/runtime/OidcUtilsTest.java b/extensions/oidc/runtime/src/test/java/io/quarkus/oidc/runtime/OidcUtilsTest.java index 4a8a8e812768f..13a35d9a75423 100644 --- a/extensions/oidc/runtime/src/test/java/io/quarkus/oidc/runtime/OidcUtilsTest.java +++ b/extensions/oidc/runtime/src/test/java/io/quarkus/oidc/runtime/OidcUtilsTest.java @@ -342,6 +342,38 @@ public void testOverrideSpotifyProperties() { assertFalse(config.token.verifyAccessTokenWithUserInfo.get()); } + @Test + public void testAcceptTwitchProperties() throws Exception { + OidcTenantConfig tenant = new OidcTenantConfig(); + tenant.setTenantId(OidcUtils.DEFAULT_TENANT_ID); + OidcTenantConfig config = OidcUtils.mergeTenantConfig(tenant, KnownOidcProviders.provider(Provider.TWITCH)); + + assertEquals(OidcUtils.DEFAULT_TENANT_ID, config.getTenantId().get()); + assertEquals(ApplicationType.WEB_APP, config.getApplicationType().get()); + assertEquals("https://id.twitch.tv/oauth2", config.getAuthServerUrl().get()); + assertEquals(Method.POST, config.credentials.clientSecret.method.get()); + assertTrue(config.authentication.forceRedirectHttpsScheme.get()); + } + + @Test + public void testOverrideTwitchProperties() throws Exception { + OidcTenantConfig tenant = new OidcTenantConfig(); + tenant.setTenantId(OidcUtils.DEFAULT_TENANT_ID); + + tenant.setApplicationType(ApplicationType.HYBRID); + tenant.setAuthServerUrl("http://localhost/wiremock"); + tenant.credentials.clientSecret.setMethod(Method.BASIC); + tenant.authentication.setForceRedirectHttpsScheme(false); + + OidcTenantConfig config = OidcUtils.mergeTenantConfig(tenant, KnownOidcProviders.provider(Provider.FACEBOOK)); + + assertEquals(OidcUtils.DEFAULT_TENANT_ID, config.getTenantId().get()); + assertEquals(ApplicationType.HYBRID, config.getApplicationType().get()); + assertEquals("http://localhost/wiremock", config.getAuthServerUrl().get()); + assertFalse(config.getAuthentication().isForceRedirectHttpsScheme().get()); + assertEquals(Method.BASIC, config.credentials.clientSecret.method.get()); + } + @Test public void testCorrectTokenType() throws Exception { OidcTenantConfig.Token tokenClaims = new OidcTenantConfig.Token();