From e42492971e130b4c03229f6b818a9b1183f1ff36 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Fri, 13 Mar 2020 15:28:40 +0100 Subject: [PATCH] pio_it.c: Permit repeated calls to PIO_ConfigureIt() The original code assumes that calls to PIO_ConfigureIt() are only made once e.g. during board start-up. Hoewever, we call those at USB SetConfiguration time, when we know which particular hardware function we are supposed to perform. This means that after the host has issued SetConfiguration more than a given number of times, the code will assert() due to overflow of the static array. Let's check if we already have allocated an array slot for a given pin and reuse that allocated array bucket rather than allocating new ones for the same pin. Change-Id: I0c46d4b51eeebd58a8786d65e31e7a84e65b6a8e Related: OS#4454 --- .../libchip_sam3s/source/pio_it.c | 26 +++++++++++++----- hardware/board_gpio.gnumeric | Bin 154648 -> 8713 bytes 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/firmware/atmel_softpack_libraries/libchip_sam3s/source/pio_it.c b/firmware/atmel_softpack_libraries/libchip_sam3s/source/pio_it.c index 7feccd17..781b9140 100644 --- a/firmware/atmel_softpack_libraries/libchip_sam3s/source/pio_it.c +++ b/firmware/atmel_softpack_libraries/libchip_sam3s/source/pio_it.c @@ -211,6 +211,16 @@ extern void PIO_InitializeInterrupts( uint32_t dwPriority ) NVIC_EnableIRQ( PIOC_IRQn ) ; } +static InterruptSource *find_intsource4pin(const Pin *pPin) +{ + unsigned int i ; + for (i = 0; i < _dwNumSources; i++) { + if (_aIntSources[i].pPin == pPin) + return &_aIntSources[i]; + } + return NULL; +} + /** * Configures a PIO or a group of PIO to generate an interrupt on status * change. The provided interrupt handler will be called with the triggering @@ -228,15 +238,17 @@ extern void PIO_ConfigureIt( const Pin *pPin, void (*handler)( const Pin* ) ) assert( pPin ) ; pio = pPin->pio ; - assert( _dwNumSources < MAX_INTERRUPT_SOURCES ) ; - /* Define new source */ - TRACE_DEBUG( "PIO_ConfigureIt: Defining new source #%" PRIu32 ".\n\r", _dwNumSources ) ; - - pSource = &(_aIntSources[_dwNumSources]) ; - pSource->pPin = pPin ; + pSource = find_intsource4pin(pPin); + if (!pSource) { + /* Define new source */ + TRACE_DEBUG( "PIO_ConfigureIt: Defining new source #%" PRIu32 ".\n\r", _dwNumSources ) ; + assert( _dwNumSources < MAX_INTERRUPT_SOURCES ) ; + pSource = &(_aIntSources[_dwNumSources]) ; + pSource->pPin = pPin ; + _dwNumSources++ ; + } pSource->handler = handler ; - _dwNumSources++ ; /* PIO3 with additional interrupt support * Configure additional interrupt mode registers */ diff --git a/hardware/board_gpio.gnumeric b/hardware/board_gpio.gnumeric index 1ec9ff6b0159a24e3df0cd72d9decc47399af120..0e4893d823dfbed2b17c390ac306d0e4462287c3 100644 GIT binary patch literal 8713 zcmb2|=3oE==C`rA#kWpu`d3%SdV1xq`$8AAA8h`p$z$yU$eJUGcZ7&~Dbf-`wv*H^dyh zSM+Li*y;xvQ{!y-m&eWd)m9h!`s?$nYpVYAd#RRwuKi{(^`5iE-thjAwJ{a{#ob;_ zT^YxA`pMF_VcN_4KUaP_()KfI@7mm3+aFtS<;f-2PmQ^?cSdY{~s%(@3H?| zzIgG~+8>!k@@@y^9~ymoHu(INBv%fChRr=&g{r{cczP!AAcV+P96aI&T%`Xf8wJQR)*L->A9M4;R_4%sgD)0Ac@4hG7N3~xxk*m8G z6R}dewDkV7Ll$#Zho5ed{CZu>Znc9Y|K5rhXPeIFuX^??*L(+e($#AlizXJAy#M`i z>7mv8=lq;syg2Ezqv}`lIjg5FTbxwzsZ63SC_nc2#yhVHtCmj;ti1f{>9jNUXD6{n z+}gRN^3|1p(e@!4uJKye59;_mTR3gyuAgW4-@SXh=oYn-}24ee<2;WcHWjd6gq)t`{Qr7 zwx4ZH&*z%^DU|>6y*WM274Pb=9{vCGeX_)V?brX`e4YR9{pYDy!?rJ%y%~Q`E3Vqw z%t&Oh^;B-LnvTQmrxZebh3}~?&J_5${r$AYMNg9^_AXodJO7XcpZFTJ;{Rs%OfqJ~ z@3r@GV_kl*)=JD$H_v&h+Jz_^-lnx6lvm_B(kWWu?wKW^1}) zvB@LJ=xae{K38iN@3TvF6>=)e-|_zzZ@Cu7gZaPY|2|dOF}LOP&*>+%{uzA_|8cgv zU}e!S57w|h^CF*Ua$M|xoRTx8rqzo-v~N|B@zvWuVqYE?Hub%iYvZZ(FyY328UI^z z3;);Zb9c8+OI-56exC26>aTZRyV&gBRvo|Km#MTYf1-$coPhn^zkg1a&DJ>=eonOg ze#qpl=W@)xPY!>5Bevj~$zrj+2b;eyu;C5UYTtG}QDN_<+UZ_vFYj5mXxXgHS&yFX zUS3>UcyYH(zuMo^Cm-y&`%=_W&^2+(swIJortiyJ|4FRs@WZPGCYk+ecmH|J{IT|W z?Y4;mcb;>g>&1rhj?0-&TW^ z;OMEFzuD}FPV1Y$_5AOAef9k6>3b7@$DCcb^ZdQ^`Ez4>kB5t2JyrU|w&(Bp!e6zE ztG_D9AA6WNVXu7KN2`8s`;dy|>nB}Fo_Tkn*ctghkygvDep#=#JUo=^p}p^+slxfI zguVxVeV_5!UNmG+#Kgp%rt#`;L)f+K|1Len^*p+Nm*PYz%}5g?p~nwxyxo6g{gh7e zd|~}GZpss(nYXiAKOK}`UHGS>e17aqw}Z~F{(U?Vz3zHz=iRmQ*5>XiGk^4S!{f!T znpSM%>s_@`f0g>%$=~|BS26O39kwu8XB74Q@YR;Wt^B>Kd#?X2C{2h-ExRfcUQuP5 zQg>B4TzFo*@63492LW^S_eqCLR(6LMBacFi-w8FY~2S2MxuKztZuj#Ye zbsLj)MseQ{Uu`NB-RoH#leqV!?T&Z)k4x=i67Sk;8e07ba&OZSkK(oz%R9O8!~5Q> zefj=nTAD@k)lK=Pep$AKf1BL$ZOQAyl0HOFJi+Q&QegUvz4KSSu#jYd#w6$WPRe4v zJ~Q0duisLY%5+s`Up6tt%}JTB_rVnpEshp98L62Cc`B^jAY~8kc)U_>anq49O^`bI zZO4TU=f!Fsiw}FB66!5kG?8`rji4MQlcb9r^R6t}=9+P2;Y8l$H-fyBO_DC2Xv-}5 zAQHW3Vwg!&aE_*kkW^vDl=a@H<_k@{q2L^8Psu44I$V`2vcp!b1KDwK*F=#@ z&fW-+hLxJaQX4a_FlDN!=78K5V{vp^m*qmiZZ|O><-m=tZZc8_wYFVh<^n0-p0@N) zz>F`YYBxQ$F4n!;cYn6aeXdY(m#+`1W9(0;d|n%1`rx3}*M?n>vkvW$s}c7&_PTC| zmBBir-C2FwHhaA|XFuC9>%$){)6`v$xz4W-da~4d9j`?A&Gpx0uB&ytez;Uua((r~ ztb>)4uc*H4)0Syp8sJeJlWUPb>6GlZZQpzgyT^TCaKhf^2xjU#+i#yB>2r_YK;xzsG8d8W_9rdD7wr9r8Z`;_-6&(Rx){X;Y3?-j^fw z$*qf1vyQ*_U6kLtihEJj2itY>DU*JNt&sYVFty6zZlP&n4F5iE6;K9|l?b013(DJZ zOIv)4V|**>rp_|DTiE(MT=UZ<+3RdQtKWoY_hkzo`TF6~w4UpG3${MkTL@e=Qy38_~Jp<7k;6y|J78C9t5bg-vfojOoLv& zbz8knE_J!_`6!?40cFvHD<_5saP(T37(Kk>!6gO`-<=b$xO4PIm}DI=ne?_06u!O_ z+}fv4QI&e>qRj2Lap?^gP|Vn@^vvzP(BZ5s?YD916t|2cizf13e(^wan~U<=43_0L zf;2!esS!VYioL4R&WRwE7Uq+TG(aim!?iUbv7k6?Dpl6}Bm_z%%Wnh)tC=KST)}$D z!|MjfZ95CPbVZ9naj!GOZBY_;uZ2ldXwFJ@5s>oyvtBv7iM%E=+` zUi6`s*H^Y>^kwh6p|amo{qyQ)I}Uwb9a8_IPkYU8Z_BoKI}W`LU)g^_HryhAQWNXl z!raCkUaXDJcI+y+r{eyr^f;n)_T=098l>yAW{K{?T*c#uqKkC?R4<)ie;1pd!=Qex(FEqW0P3UtoPFCIkg1_k<)116KsKng`EPu50IhzpRMFZ7a%IHPX;ls&Y-*prJLSx~_BE|3 z0YPh**lzMLnZ~4acjDHGJYHE)3b~}WxNl=s*51mtOZl~u%uY2)*g8$96!D9&EA)9y4u}fL-A`%DcP8%{~VM4-*0te z6Y6_1V~;?myNa;lrGuswogP(!CmlOfBqs@Ux~izSPMXE6DAettHc8pDvl*mJ#eGs2 zm!eR=2XBkVrb<1RB*B%O!Y@Aj)jPn?hv?bY4lp`(-=YV`E{1dl!ymn1>XlM|N|cy%067TT1lT^i-2 zA~#V$*7MY%77rUG#gp4Y7IIFkaLGF8GHH=H$VqyWa=d%zf}F&yI7#ESlZx0xfz)U% zj#iNJ+1r9PXv8QLoOF4me0J*^71l}jC%WI~i4bS}_F#9s{fU&%XB$j6C~CX5+;YxN zx*%86?&0=!-UTa(Ek>7L@#&gf^?Et`-Gx~78^){_Vo8h8g_x+)l2zD;%ZMJL!?c z-GyhvSLeKcaWZDL^_Ckk+N>(KoV#=RJv`gLT}XNzrMc;X97y3N_O}aj6)$)xHod#B zD?&esz)Mf$&$I(wbh&AR$? zZRzLI$@k9P-D3RuOW0Xo?duh}mu_#Jck3pPc<--gw{w~=zL8|Q?Y3Lxunl7cccE!e zcZYNu)5&w;tE?F>tY!J^_hX08eUU$B%#C6;OpUy^V(ZlvZ^AA!yscjv*qn2J)nWfw z{oK^UwW0s6nB56o#eO+b9Mv(w(U>CLK3l|5mJTUI8Yx|e2s zZ1z zwtCsegdVzmYDH~gXx^Tw_N&kQ=|6ZS-u?Cwp{zSG(%ZR?x&Q69__VC<>Ee&Sj1Nx= z-tc9(AEbzXr+v`Q|=UfwD z%yIjzRI(>szfCggH`}dpk@wOW_Y0$(Yo8n3+P~$!RQ0!5;kVXZ-+i~dw^+My-(nT7 zvy)aF&WwNayZc?MW##fq7f$}xTQ1%mtapC0Qdf+Bl*T*}`zVchbFK-@<8`a%@b{}0 z@PDkjm*e5dk1R(fKkW>3XIyHLbU@pp?6cC6Q-A-d9&Kr~V@UnDF*B})A*}cVw%6`o^x0yw0--TyU8hX>tRo^{1A$gI-j-7rY?d7jr`c3A1Ftxkh z`{+hpqx4bHiAGK*&3lEWHvCpO@T&Er#)bnE^z2^E`F7w@>s2`!`6UvK-CQx;AAVGv zHe~GMpCy1`d3Yvq-wX? z*2K$avDu%k*;m-+#z$=HdaP=Acw>N!{@+_yQwqvTZ$6%(*(bS9x#5|a-({2JOZy*5 zX!S|0({8x&%_zL%sTW$7dY1ys+ z{Ko|>Y$pU+Y@hN@`P8*T$Jn-5C^a^%HhEutIPm|gqDyaktLGZ>CdF*t`KI8OxM!8q zB8_#oBt&i=J5VYu%76BjMQ8i;=5rk`TiH%cFf2S``fpCd4F}Idr77mGtKarK+f}g+o6m+(Fvicm$XK_}4w|;ope@IYx`d1I{dg1F|Gj6k~ zt$Q_blQBr-wbAB~>&m{|YI?6H25|^q|LPIBFjDKy&aEHyw-)~In!-DCDVO}qGo0%_ z{Qa`ddIrxuUW+gX!RDv#g>&NKx9fW*FAjN>Y#AtX_w~LRCC8r2I3G>)dw*G|ws%tX zj2-*jy5^*<-1qFtvE`h;w^e3M93$lpu%wnA=2qw5?BcC-QTqBM zpGp5yqb4O@cWXYU?`h^ei@iWs)9~;{hNa><%nIrr#*Q<)Qf6pv-0NfsiEV>yt?a7SE2RE2My1{hLM2PWF|I-UaQztcBF8Rq2zBr^lYHRoEK>LN-r^6<$ z>y+$kRf^py=CE%P+uY_)U*Ft4=_0t;U1`^#6sO51IfXL|R$NoNQo6HKyEVqW;pn9_!!_;=Y`C>|z z*mCJvT`DaUzP`vOh$(oLtL4^nvpz2==*SN2)a`3kdVas$s^r|`D3R+Em7cTPy6OjU z957XhayT+oe)5zXQ?=~#*4}<8mAT39(6*2ti94B-tE+s4q`a2OPm|`@wB}re;wG`W zuI?qG5j*ZB2Nh{>U#|{1mvBw**JABgF55S4z#`9NrvzG1K$hsu>NZe6Z+esk_4;Rhz)G|5bYI}A5&AOPmyZkp9hAqj= zYENdmp`oalH06lirH#G4txEptUDA&ecV7<9K7DV4?INGa(#86`$!uPRMe`r6()O&` zP;m9CitDAIt6Sq<_tn3>rf1zOnEB(;uI!}tspmg?hreWFr(cffqy-#TrteiP5 z@WH2|?@c?L)23dj4N8&Z7N4OT)S@RmL%OpgVtHPB#EyMyd%^l-l z(mCtyF_A6Dl72S5ZqJE7@cD^Odc)%<_NuOlF76+)5+~hAeYk6<>mto{v-@|8JiK?v zG;3MoB+ol@400Ja2sucQ(!Ad9sV?W6w+OFYM|eKNkFKyk2wph)WIoAtl%On`AlEHCRwC!qn78tHipU;>lEP7zaZ&Z+RKI!pqKe5zR8%}?ld&bRI_sC^g&r1u_rSDfL ztu@W9x!rkPZh_5r!Ed_jH-22JzD@u4wd*&2Z0mRBTwiu`TmQ{9rS6=bB8i^$XSnWv zOPqaUz1=ar+kX|$TAS_rJy}#YCriwu;{DE_$x0N2WgCs{d7Fe(!t#3E#wXYU&TAZDrrW5>@}en#qNE$CI4Nk6bfz zYge1SNq^XF;&ECf{g%OD)92q-PY#dl)j!TR=fOs~wD-UE^{QGNOt#!y-Z;Pa^-;5v zla2P?Sfzfo@@6Faw2jl%Tz4d#$>u*>w1uIm`{?4l*~t%<3P+#3AE(k=ALF}KQ>v|Z z^~zP;S3hm=p5|<}EbbKB9}c7Sf4R@6-rTX~boPFI(FI$jQ-5DRHZ|c=+@xOZgJ!Or z+fGkOFt)uuJ7o6cW2*ncd3T6?6O_t{@qV^zJMw$9pb2j>(W?Ra{8-)|SNrQYvlWVg@o z5xOE9Q>gTJQDg8ji&XWV%T}C0%csmSUbaMrZ=Ko4Th5#ouNhCBmk9pKlI}nAYybjLEx6Cwf==_%L61$T6*Py-Z)iO{PO^=N(Qmx-V1xFo*4=Q|C3; zF6kZDo=#|!T37n_{f@t7R~G*X3Ge?EdxMMaO?k*x_hgESj`faz z&jYUg=Uex`S6`!4iBIpBAuoeqbNT|Cqz^faAcjuT2OUSj<}}9Zzho|*Z<>--JM+x+ ze-A^a8G6X5d4}?>`!+YG_x$=>ckfO3roMAd(B1y0+y{2@W!`yQZ{HAg@xg;j@|m9x z9b9VPzNw(pi!W$WAD6|B2ggkqPX5thu6QxSK)3O@oQIfK9cP;hdrWPyMt22!`282G z|M>LUCTtUziQy^q;Ql%3aiw}&A*7Za*?;EiXT_$6OFo^j`t%F9Q?9rj$tv+~vw7=t{)c^QmB0IQ^TPV+ z|3%;aNk9Jl+Qs0x>1Bzhm2TMO+V1-P_s5;zLUzZd7XB!BcmG)as=0sqFDx%_{oG$S z<=>pIHq~5Lmp5zdnfbf>>~HS(pDiL%{AcWWdAx3k)%v*beEq{um)1`&OEr)1UA)Ed zw;`W1x_teYepWT~&*&xd1+}_Zv zXQ=aHTyu=?&;EJwS=S-m^3>dquMFq0d)H5`+FxhX_g=-PefF>Be>wmA@%>HHpYP35E%dDvQM+He-O?L(g) z`wN{Od;4)_SxSB7>WH^*Z=49|dDm3q5fR@HogTY3>*b42`S*31T~8f-R9TS!Za?Q^ ziHMCK!n9*Zx}}RC#)Luezs<4A1ZBk3DxAzuW&l)p6qm zqaKkz$2WV{te-URzKd>n{6f8X-G2BB7d|~QyRIVGHuQg=+5g~$ zN4rH;r$rZ+UGghk{ONN1uZiaOtFG`)y;5;9Dd>~-cJ+rg-k!fUn)5GvdAj`6UX7FL zM%y22{CLoRHKT6N?(^$>7C%rd{a^7!H(YW8d}{37Q-M2bht2LqI<0;bxAgV>s{YRv zOBOv;;9Of)tnM80LhQZKnd`ji=2O2s|7YTu68h4{ZM8v_lK;27v-4t)*_tYSSo`nH zwqJVJ=kKriEjYQQ`na!#ex7&SpX+D4bx(Hl&k&EEB<>xjQ@QcUQ3&JXGrg1D|D7re x-{t;VuyXzTU$Oe%v?9fSY~EPD*=)kyT3I*wyh9%jf3*K6&--PAT-wN=U}DJihh*Do(G*GtbU%}p)JOxDXUO4lzlG|)>aNl}8Tttie! zQCn^dR%K*hV5lGA>l2)uk(!&Ro0(T!l9-pAs-#d+oM}}I7WBzaPAmbt4X0I>dKJYf zN_Jcd3Sei3K|G`2T9BWdVXI`Qq~M#Fm0x75WN4(M;G3BTVw#vJDY%v9C!!3FFC8?k^6kn2=x>KxO!OgqB?Sm= zg;eYrfy)mC1z3QAOonImlw_-v#FA7yBLhQAT>~RsBa0A2b1Oq5D`V3r8-188IL|65 z*nqTJB^RZFi!EK4Msr;QV_gH&5JL+q6C*2Qizpj?EDFJ9*g)NB1yTTV1Y7_XC*WuV z%Ye!h=fs@k(j2gL3ciVXrHMH~smX~s$+k)cN(!!diAg!Bo+YV8Uclk}(#O(1hT=2A9$9srk97B}J7A;h8BVpnAyC&_YSUBQ-NUqr_GTRP&*S z95}}!hnRv(W^qAIVx?PtQEq8YVlg;EJu*{Lqf(3V;T-p(%oI4sIX}lEH8CZ%2rd$o zUydXKHPOGcBquX36%_eO3Q$gPWo}Y_PO(#JPJTH!nV^aXK^$(Vq!5-_oSBrFlUY(} ztK{zI8z1c9>KYOs<{9kifHv9p8(G?a&?ASl1w&deOH0>njD5tW~xYX>zS%tn?3SqKevP>l?Z zH;@=4!GVOJ4gr;nb^%41c_s0VMX8Ap+rWZQ<3MV`+9CC~a*(T=B19EL09{!@esLzK z?y+-(x(zM>R|(OM>Kw2Ys6xmt1P5k(NM=b+DnvIPC#n^e=9gH5br?d}5G_=6FT_BQ zbK!vu_5e5_J@eA?i*mt*5+b<4(!PmB>6v+OE%2Z%$uCd{$j{6Jl{@aS#t1%eU<4;8=A%pl4RHlI2$)F&Hrn?M63et-*QxtG&Pc2K$i_c7p&(F)Lj4v*!%t zC_gt9x0;lq#IzFJ(j}n0fyauJ{P?{5lK28pR>y4$SUSEaF)tnN5>P=H5aj6>67T37 z;u+=&DHSooGruS$wa6|dz9b_xFCN+_fQTXTJ*bY%FUm~KD}m&Wg8ZVAqQuM+Nc1Ah zpz47X^9nwxX(hHwpsr3zN=_<>1ueQU9ODK_TEuH8NGwP#vdb*ak54p#xCSDE>W<|6 zTyV2ap&%zQ8Qj8y)Dw{4arXE1b@dAgj`#G75AbnxcExa3YEe;sQLzHJlyC*J9gC4o za19Fb4+@TV432m43=Z&djC6HDm;rGXSTB|m2ArmY!O0A*&;bhurKV@*=P4AIBo>u8 z=jVXZJA@MisuICn;}o#CA*h#}0v0ueS8AYKfv`Zq!!ai_JrCk=4@VzQcfWXdS3lPv zM;|4HFeJG!h@6vuNQl3$l0tY69+@dAsd-=pZuvzZmEby9!6`90+g8cV&CSgUPADk^B$kw< z7UiK-*9vanBHC8TJvA@2C@}}ctIz_#EkCbB0a6MZ8Yn3^<>x?JBc3IRIhl|)XlPza zY7wZt0d`ApNl|8YYDh*=erb9JL?pQ=vjFUTyWqq;Xtxk#E+UQ;6d(}`jwXaKk{~4R zkfcD_2&^0;1Bpm*>=`IQINt*CE}@F*3&?y9qQ!1|MvL4#0rz869mJ8lz3d*vny)0dF^r=2vh&f{YcC-hVa0 z-fl869<5)8bh`<(Pz*~y$7I0UO{4jhviyp@-DEQ0;}WCoVT$6_6vrgpX#G00$0ba$ z*RQ4nKJGu7Un$G4*vI`%NBgfsJilV^znTtsyJB68HERPhjyRfMDT`NQ?D=(cylH5+o6JnG$Lr|)>kyAu z?Bo8RT~7nv)fuf~NiB+vkQWdmjW|InTkx{t(O9KVhDC0?IHB#NKx*88_BbejqZzz3 z9%YrgK4Q8DqyuS9Ii`U~k_cT$f+Wlzp(G-t?lMv$8t~ER5zUX!-0?#1+MFiMyJO|+eRd`jgWVLASI*G-5;Z+5hhQVnZe@_j0D-Cio8eQ5j+BPDg zZG^mY2RRuHcoTbc6dP0;z+!T+S866m3to|v(ST3Qj<$`4QZho`mxPpzOb2{@?PzH< zq>>RN?Vt}oj&6e*ZDNCxF|m^&rr4)uM|WL~CL@xP5%#Is(M?{X$%v$6guRJ9x~FV3 z8IhEXkhZWvnn~a}wb3nXqsfSrWQ4q94mlZ(?wA`LeuNEL5iyEwhO|KsIT?+PVvi;x zQj!tUen8}8G~iRSqvJ-PN(B~^gMAd+4EuVc(d~!1R-k)E=y89^(4FKr#*yx0p&qYD zqaeunb-vGhj#qQMj*MMj35F z-YA3=ucI4h@oB% zBW+kf&ab1F;0*14jw#X(0;G5y-9a$K^DFX_e&l!^UD7|a^DFWid*pZ>9d8=q@rtzQ z9XVbHeB6JuJxo!17Z8W++Vl)|%l#GzJV<4AC1HP#c853QpVIRdFy#!}88IhEX zkhZWPRcfPK*hZ5PDai#dy;7dYBd#@C=n~*QTL5kPWZBRozzasBTLXOt~AN(H8uN381wu5@kJhgg#Vhh=6Qp<@ z-E1<%>sRF6AIR}K;N$+I`IWN#3W-ecA|D77GO0e`BLbI#AnFS1oKfGBm#FUn0Uu~l+U%}Xsx%t7%g z)U))8Rj75~%;}V0l#*J69PXeM{@}gXgK(D$N+N=!9B{D@VS*FUfR9FxkWzn`BqHQR z??|a=bkRGVI&s4#86m9!L{3HnKGr^38iDGwLA>!2rAk9y(vO^s27G9LgiP5Cm(mE5 zcF>zfqdN#jD>YDQ2yWejTmM0+>6!U?NViO)lt#!K79c4K+`=B+urQj8NJ>W7+eV}N zBSw=ENy!LlI|g!TG~mk$N83iAXdEg{Y~#8rDTM>F9|6bjqXbtZ5x4-F|lnU?6S87Om${;BUJT*Id3C?IT zA}JXmU4ny@j7GPxjV2>fk`eNbIpkzCx?^s1_z~8=Ct|%3@&-NRWHdU8J(`S2Nk&Nf z0g;o@fKSbi_S8U?3M?iE{q`d4>y1V)!5O^-2RRvIuh-0R>~@5tDM()pWeXsp<2Sn7 zF)=4I8N3-YG%qE!C?_)ywBb@oA-JR{GdndTqbR>LJp(KsoLrPy0N$)=7o3<^3^|Y= zw2KmXKO;mG98CyeBtgg;Xe6ohyj&}=a)=Dl>S&Z$g;XuzfgGe*9q>7>5mLz@MIcht z>7&IRk`$T@u2@Ch4~P`4qx%8r)FY-@ydo_^M~>G4p9LDtuSjJr8Tl1*G6Z@tY&hW4 zG9zSmk7oH5d-XcHg>8tJ!^nHekjmlFJ!L~ZUa{A&qno^jdb~n1DSG{CG~i1@N9$LL z+D*vYpde8U9+Vi}1~tUP4A-YA3=ucI4;__+UQ{Yp{1B5yW9ir3N2CPTb_Mc(~^ z9IpdD?mwDeDa)_e$NfzQeB6Juex)p4v5)(Y?vEJi|yg^b(w*-OoY31P3Wz zM|Thm@%)Osq#rq6N0;;u?fi7ovo(g=IgXmkg` zXr%@Mhz++G+dNT9BjgPWNTt!}hK12&L{c)s-ZmQDA2FJYNJ>VKF+lKk4CK;iz?T({ zjv9fYaS)$vf?BCT(hhnu8r}UdS{i|pF|lnUYCuCc09C6hY{t*rS)=j3y(Jk`dA+ zIFJ+t9>pHr!ZwJLZs+(ddr3(cwo}`<{s5N8}B9$jNAQ6niuok&=v%_5&g( zqXD0q9qp-sDiv5v4)#%OFng4&CM0mN<4h8bODVz|HIdA37Q#Bal=) z=ny4dk%n?m;&s61xkgAuL#ud2-V=xtv7@^J>C`W#S}V}ZpWY+Q@+_`uc62-25HF39_m`pM+0h+lLp^43)w83UzJ_|tBJILL z&9ei(NOZI}OHm67`C1&5m>u03HN^8Q@?Is>m>uvT@zFd>QJzKKK7|d`4ijo~0;ek+-6t#O&y1lp$Wv zBJU1CjoAU85g5(0l;v5ZYjRLycED!@M(bJ1Viwno!00ZDp@I}2Yg0gv~5gL z+ZcJ(I%>?0u3M+ux^>c)LLsRxhAn&p?*n$u&nZ@LNli;E%_#}atV#_iDYjKIL2e1d zlzHZ*6~AhS7NJVq=X)p$a)Onfr+BY7{4YnxZg;y$r42qK1Ug$Its5+ z6BJVwi1M_t0ai_>cs*@Qy!%a1!v~-HL0c@KnE(`&aHWuh0ZIq32nQ#O;MAPdq)vSYQ|c3LxD8BU3XXOaUc`{2W^)tbwlJSDKrYT10{| zh8T_s$jnplOUz9r!4S+i3I#>BTWKCRL6cyTF@|%3Gt=`Db4Ya&W?Yl&B2y~42s7D` z>mqY1xd<~IlItQ%3SDFZ&FiRX+QdM~&X9<-1JjL}lpS5df?VB5Fak5#kZc5IdLh~f zQ=GwIM1&t;x-o;n-Oq&x{bo3AHzq+hrtOX{CM4*`3_j9akC{1$({GN`_r$m!rW>2@ zO^NV5Oh384hv_HR_ZB#PPmJqfy0Q75m?{mXA6xDtML%Zf`MUTT#fJua`o@R35R(UB zF2O9U9bHIq31&Qy>Jm$wF+z+xV7jrzh&d7I5vCtojF6%qYm69@5+g8|V2cq_T!J-5 zNOB2iHztmUIRLZGNva8$ZA~9nm-rx3yn&fNNOc5e4govDm6*~B)WHX*NX*PZsxvUN z2N}-5Y*6~Rx)9TJF~r`f0c9;i17hL>rXOpvA}VjdOu(9~NHPI?vT`TI8(5PSNshpt ztlWcKU5P4aV4;CEVUgqz>e}VZ8&)0?Uvj{n(P0k)eK2go~kmfU`GA zW??2WkTJxh5SVW;6Pc&Je|&(4zn?29#$YBiQXPVs(1Jt2^}Aubr#~r9!AxqTIt4SS zk?9o7#73-BV0|zwiH)do5T+k9v4y#~IQs_?6}h-Oa)!k8ODx4GQ-3_ltLN4RLi2F(fLA zVWwfGRzGJ_f&?>>IuTU{!MciAk|;4fT|=0DY^lS@NIwKr9{L412NRXlV1{9)5Rf^< z1P9Cn>?wrk0ug2mW+EZgA(*Lz#8L?66wCsVRHtAjF*2QknbwGP3amqoCAASVvS0|) zk2SR!>jyh~8|nvy`x4bigqekz*g(b*lh|M;U?w(aA8+DoUzjnNiH%f;;7M%GKHj8w z2{W~k>J~hyjYzk^`ubQB3o(NphA{nD6N`a7Ak5e%uKI%M$1GBuh^an7 zv-IFDFP1by%@zxLV^e3t{0XGU;CNU%?)51-_%p{7TE&=fYp#elBOSmc6@(F3~z|1G%;f{Vp zrA^q-6lPfp3RhCRftkCYVG-{f;zNo-nAwc@Fog{QU}iOalFXa<(#MpStU(~mW| z8SDG{2YZ5&8%btiCO42V#DoXTHJHhbR1>hKH=;5P%ng|7%_Gz)KFBrLm8gUUGX^u6 z5Lb@C^kXIsVuJ!U3W6nR5ET$G{n(O*k%@j#NHDlxNK~l?GYd0m1UMQImF-|AU?z>A z;1Htwg+?%Au%!>u9D7d~@9P=t4{C!D zlS<)cVMZ*-7$PDTZUSb+l4=5GtP+(|;4Z+7(_l|uP}7p6kib^C5H*bgcL!#=fVFfD ziEZh^&BD^0@eC$rM8+8RppX$UgF2Zhqp+m4pa^1`BE~Qiu%tB-O~8`YNHhU&S|iacENP8I6Y!-q5{<%=)`&C#HV}s; ztr3+#VEVD8H49L`2sCFG5=6`rI%Akwn29aGk*KN|W&mbd3l0ZWJ;aoaFf%Yy8;Op< zn%F?CEF%Sd1@I7KKu}0Pc#y7tm}^jwrwdVaA z5LJJ{^kYjh=AhvpaC3>6p(MCdu%#HHx(G10V5S(*=ufbxFEL35W(c+1+0A|FHXaHu!z?uby zM)5?N1sli05*oyegMp4|2KR)VbDU5sDKE%plB!LaI|JPAIS;IxGo= zm;pM_u?IMd0~7s_aA$A*5N986qB0`PEtm;~WFs(>3TSy9kwps39hfPFWOv|6D#Wd5 zg9k8XS|QmncoGYVj=^lVfnu77y3oV`=l(NeV%i08{n!d7BXfP1kRb3dIZ-RY;D%u) zIHH=daQ&F6jWqpO5}Kz!X_(*ZMq>BpK# zEc9K1L5alKho~JlaKkVY2`B>+(>sM5ftgM~r4q3#%;CmhCYJz5q6UfKCSax($VyK5 zLQZ0OP;k>Q!c1ZyvxuoOVJ2WEF-Kh|UC72EQp~{;tj<2(BzXoir9t~AhVjI;BtSQZ zfb%Yv>V{OuU=}~5ItDg!f+f8W6)Z6Q*wTx!0cgtrWCD&P!!Q#JaiuEEF__7PH2s*# zB*2lVfqxU23$UaT7e``JD$D@Pm?h2&umKk=@kvaN6?8xwIB{Z)PyLW^7ot1AaHGhL zO_*26jZK(-%-AF?C^6%bH2suDCAJ<1F%v%~u<;=*X@QvWF1UVdX~76Ip>71)LPk`@ z2y+T%S_pO~s)r1B3}$KoH6)4a-og#ROcJCz12a)TOI{;ls{vS$U{(X9x&T zA*j?iS4aLb6-%WEkSy z0_$aCNh`$k(oJFdv85I8+?xR?tvC`D(J-?x(+W}56x=PC357KMm}w+{G!I~=5YUV< zY_SrteK@#(Fe8~b|KRSLn-J4A2VF%4E=MrqHpGRP<#2EVFe8*i12AKRL<2Bm1gTR^ zqFGq7Eos4l8J{r6#1rWh+`W5KqH-EcKW5B&g*dtgyZR8(z&C{%f*HGH7=jtYWEg@O z%S6_gu--XlDQHT}Sc54{KW2D__!6^F5^exySdwS}W;l{)0A?7%5+`VSnl#^F$tk26 zfG?*IXA-OziX~==>Bxi5?#59D1~?i+1_Z$8K9OV?W-NmYBPP$myn|WAIr)e9_&d6| z2E`L~q5#}umLxm z(hR_i2NDgy5)IG=((y!^1nb9P2~1*o*`_f4n1M}3`+zP(=&zZ#|&E+7h+bo!41F+5#kIm z!#(qCN=(-lt{65< z@-&0B9I-fnn3gA8Kc)jBh&#y_ZUSaON2&?rMj|W>$c;o;I|54>64NX*gXzZ-hD4pm z3^xEv5Rzs9W(Y=*W&maof>(zd8u@xe5tAQrx2MdAX-}EK^kW8PfRmw#et?fp5HY74 z!p*@95aRMR%pI8FL7aYAQwB?tBBm(>y7df4xe(^!65xZSd5nl1_(eOA>wq#+Q%igj zEAvZB6hiU~d{Wa&Y?T}h5%(BDRORQCr51tju*rd3zhj`J5Kxq#l#`kZ=ldpBgk{KR7utCl$;KD9TSS zO3V!cbAnUziZe?x%Q8zU!2-~Ggdn~M2Duq>qYuP&AU??4f}F%kxBQ~q(wxL%urVH) zDXCGZMfq@!dr@Wzoa3CIlG*u zO+iq8Ig$bp4_QG}ets_ODikmqSrTL)Jn2C1Xab2r;sNXo1+Y8v5_41S0*W&8O5z=h zQWGIj1{Q=G2T}`GSq8ez$xb=Q)lCti3L=26tRNqh6!P=zV23!t1>hTIxMz+o95l39`iy@CiV3O5m|6yhSa!qWT_Yp@O@2peJ{L>65S+9 zA~H8zeNui&Nq#O#T5?j;O5hsIjX>oAUMq?~d4d!T8Q{E0ijK7W{F2lnqI5vQ8zcC@ zfeJ2@6iUF?j1^~ArN*aamMAGC=jT9*fTH|zFaug9!NagDIW-StJvdc>3K?_-8H5z1 z7iFd>;MAU4mYNrznHHa)ms1&ETvC~nT8vw9Zhl^Vaz;^pZYpjyDMg8CCAg(aKzRd? z6)E}gdHE&r1)!{s+Z3>Ld{JUvI@~3oaxfss(=R06(K*C3%oS27BBx4lG~^ehq!!tw z#Fu2G=EXxV8-s|!a~xD%W@=suBzF|#7nKwxW|lyrH@^rWgQ^Eo$}2#sJ0%6*%#;*R zHKe2fEx9oq;|57u#A_%>EJ!V~%Ph{1PlQ(K5D`>&B8niomKs_e^4_g4{QXst|DnB=p8fa6=X}@B+S#5_;n!%xq{i z4A(?NdNUyN{z)`vg4&d$?cyQSE{1j>K}{%F>H()rXiIpsT?{FLAdPh7Py&gALkipi z2DfraZxhpzH%69`L1)u!n?9>$S;Fd>bN=j-TSgBin5lAI? zfJ(tBF*(~-$<58p%?eH^DFh^zl%y8rp^RlIxaETeFl?3FQ}a@b5_3?z3ia%0yBK_p zHOjs0qwQkQxGuHEi=llSP}3gVrv