From 4c2d5051cda7a405b22671f0ff953597c9e15289 Mon Sep 17 00:00:00 2001 From: Jan Petykiewicz Date: Sun, 29 Mar 2026 01:26:22 -0700 Subject: [PATCH] trim down --- examples/01_simple_route.py | 2 +- examples/02_congestion_resolution.py | 2 +- examples/03_locked_paths.png | Bin 68980 -> 52392 bytes examples/03_locked_paths.py | 2 +- examples/04_sbends_and_radii.py | 1 - examples/05_orientation_stress.png | Bin 103634 -> 94169 bytes examples/05_orientation_stress.py | 2 +- examples/06_bend_collision_models.png | Bin 82104 -> 89875 bytes examples/06_bend_collision_models.py | 6 +- examples/07_large_scale_routing.py | 92 +-- examples/08_custom_bend_geometry.png | Bin 92051 -> 76727 bytes examples/08_custom_bend_geometry.py | 4 +- examples/09_unroutable_best_effort.py | 44 +- inire/geometry/collision.py | 295 +++++++-- inire/geometry/components.py | 800 +++++++---------------- inire/geometry/primitives.py | 183 ++++-- inire/router/astar.py | 830 ++++++++++++------------ inire/router/config.py | 1 - inire/router/cost.py | 256 +++----- inire/router/danger_map.py | 134 ++-- inire/router/pathfinder.py | 474 +++++--------- inire/router/visibility.py | 21 +- inire/tests/test_astar.py | 132 +++- inire/tests/test_clearance_precision.py | 92 +++ inire/tests/test_collision.py | 46 +- inire/tests/test_components.py | 37 +- inire/tests/test_congestion.py | 9 +- inire/tests/test_cost.py | 28 + inire/tests/test_pathfinder.py | 22 + inire/tests/test_primitives.py | 13 +- inire/tests/test_variable_grid.py | 81 +-- inire/utils/validation.py | 18 +- inire/utils/visualization.py | 53 +- 33 files changed, 1791 insertions(+), 1889 deletions(-) create mode 100644 inire/tests/test_clearance_precision.py diff --git a/examples/01_simple_route.py b/examples/01_simple_route.py index fc39399..96fc4f9 100644 --- a/examples/01_simple_route.py +++ b/examples/01_simple_route.py @@ -23,7 +23,7 @@ def main() -> None: # 2. Configure Router evaluator = CostEvaluator(engine, danger_map) - context = AStarContext(evaluator, snap_size=1.0, bend_radii=[10.0]) + context = AStarContext(evaluator, bend_radii=[10.0]) metrics = AStarMetrics() pf = PathFinder(context, metrics) diff --git a/examples/02_congestion_resolution.py b/examples/02_congestion_resolution.py index d38bef9..b33328d 100644 --- a/examples/02_congestion_resolution.py +++ b/examples/02_congestion_resolution.py @@ -18,7 +18,7 @@ def main() -> None: # Configure a router with high congestion penalties evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, bend_penalty=50.0, sbend_penalty=150.0) - context = AStarContext(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[10.0]) + context = AStarContext(evaluator, bend_radii=[10.0], sbend_radii=[10.0]) metrics = AStarMetrics() pf = PathFinder(context, metrics, base_congestion_penalty=1000.0) diff --git a/examples/03_locked_paths.png b/examples/03_locked_paths.png index 19fe444bcdb5176da96b46a3bdb11cd3ffb524d8..fddbc0219327a6b81161c4d5a5b7852c4967aa90 100644 GIT binary patch literal 52392 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 z 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 literal 68980 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 None: danger_map.precompute([]) evaluator = CostEvaluator(engine, danger_map) - context = AStarContext(evaluator, snap_size=1.0, bend_radii=[10.0]) + context = AStarContext(evaluator, bend_radii=[10.0]) metrics = AStarMetrics() pf = PathFinder(context, metrics) diff --git a/examples/04_sbends_and_radii.py b/examples/04_sbends_and_radii.py index cc78fa3..a88159a 100644 --- a/examples/04_sbends_and_radii.py +++ b/examples/04_sbends_and_radii.py @@ -28,7 +28,6 @@ def main() -> None: context = AStarContext( evaluator, node_limit=50000, - snap_size=1.0, bend_radii=[10.0, 30.0], sbend_offsets=[5.0], # Use a simpler offset bend_penalty=10.0, diff --git a/examples/05_orientation_stress.png b/examples/05_orientation_stress.png index e7a6c918cd73c00dc8ccbb25c68b4c358df4697d..94bab94e88f9841f6b633a476ffb59dd051d0e32 100644 GIT binary patch literal 94169 zcmeFZcT|)~w>^wHqN9k;7%%|_6cqs#0m)`W1ylqiG+-oy0u7RN45+9mC`cAXauNyB zBr_s#y2TJz4#3wA$G)v0s#-e;e>yiZMe#5(P& z$8Bs)t*s=))~^%Ww04P!o!v=WS#fd8zkfr_+QwM?sUEcmpYr?3T{^a0Tr&@ozb8Z~ zMVfL=;Nnu*zUAQQppH667yaYI>0gWeU*`y0mbt3#SuJ;KN8H-UrmOeu*c`no4)zo7X4*_kn#^+jGimsOd_a$e6WoHSE@NpWwAQ-Ax2 z!L2)wochfiLn5aLoW5HuXx>?!x_kHTGP&-o@)oa3&5)M1zov_|_U1Vb_tTpkLk!%9 z`xV{ey50?Bhho_mztFgn1zXBTr^MsLK^)3ZEk|NV{bBQA62%^Mi} zJUWn`TUoBIRM+BF&QBg)S3&se*RKne+_J=It;=rv`7xQFQW+U7Aq<}h#pa3GT2uJ# zZbYbu3S?M~3=PJIgr=lyR1Mm+UpUy#JLL4I-v@IV7zOKZWRI{IvLDaS-stk}wOUEQ8cK5TV zaJ^9EPCB#YZbE{Z(&%8ZL-l8hb7!hkYnX=}v(CYMpyR!6lF?aSxsD{o(F>36^ZRM2 zD`--w)P>Sk`k{($#$7aqm_lF4HrnUwa&{liPH7*gv8JEO4`YIIGe1ZB-NN zTOw2g`#zkT*&bwDWZIkh;>C9Ihsf9Tc_+tkzA1CHtZC9^4ae+c2_3*xT90~Q7?svZ8H@PE|RvY@N(;0UgyT{WQ{O$6O)rS z3^$3px82U$glED>N8;B~w7U{T=B+(+_v3SqJ>CNDLth0N)YtMFRaREE-8p)_G|RE~ zpq^fAfmr5Vvfc?TQE;sL&}TuX(P1VPyD-2=?&O(1 zZ|y#P{UC%VzwHnh_i37KlrwI|Od(Aw7oQ>%1Xc}gP>AI+0osW9^GGi{*S zoLZ(L+;&r0V84rtOQX4;p<9N5%hw%}l9K(ej|vM3*|D8j&Vh?0%?`%WD@-GUBUF4= zw#{_^wk`8ql=qxz7aG}aUR4gpI8Sa5>g;P&yR(@FfyYI~#JXHFj<-d?3=U5S0VuVu*o>g67Hyui1u z$RB9VmF7;S^ucG4M@#Dwa0vm=Ra6Sv9 z7&2}{-=vuDlX>+LkE*I(6L9(RG(T*cXp5a`w~PGeJTG!EBGVh(^hhf7_V(U*>eKe& zPHT7b-b0}-J(qFH)~yg0Ht%aKrQuxJVKci+WZYz()JA$kM_XI(dug3G5pm$a0lRmH zJyKD#DedQ7RTsxtff>E)W$tKWCoe)TjQ+A1R>L+j3A>&`Gpy(4L^6}!Oo<;$0{ zy>BHXE#9re@iRrNRh^ru__!|5RNXnzzs5S3f-lI#lHCdpjvr<=-wI$er zJd*a2BlmV*UmV?Atdv{$@rZ|@+hg*;u3umB1*|`M5r1x@S;eY4yK+?pT{o45iY|{M z)PiF)W3^PSgs?jua@oOF+5K8gEiEGJ*Y7966yBLDooX>!Gcby66)EoRtFaw4!PIx$fjn^>gC?yyQMxH4D7?#YBHDRL#getz`!1{^XL3HJ3zU#-F?YDDZU z?RI0z$+XD2UL}uRtiW8Qq-6N|^=ny#d_RszDtp+xDz5a?OV7+KweGCm>spBh@fo%) zX4nCz-a_eAt2&xgdatWtdYygXK&`DhmT9%Lw6?OKt6k$4R*@U8UBB_=idyES<=6Ka z7=-*edvG|46INkqj6FY~zcxMi~i`4R@ z!_Vyo-W$ip#l;me9gH*01|5C9z3(A0>^PB`{q@x%+19(~$dOvD5n=N2*#%1hW9RO( ziMb;*-c294R0<^?=q^kNI{NVV0>z;(+xSryaJ);^-B}uifzs;RJa{b~X1O6412!Dr z9m}{b+rBD$c%WvDsHi1#@Heh^FS+KeJ9FXr;lcpPJ=-qwaF&eU{@r0(ldql~mdvh= zor_}@o0g_U{)wDttm5s~8`#jAQm$6s_}Zr*IKhC=(B+|lW7Ayn^$LpODg|m5_V)IT zvnh3D?Y_rC>v>s)#Z>I+tFb`iV5xG#YJ|=w${w>4xlC$DsoDL8=LCvs0JJ&)1q6b zb{gg5malKb9`WphBxX>!BMe7+{8+Em-Tur_J$m&1iNb&f%z9^aK7-R?BYlxdZK&X3 zS_%5^o2f&n{tQwBYcp)A<*L%rIXMQxA*b(2S=TSlD13EoQUC2kmmSmj#40B9>EA`1 zsrsx`E%P@HiPp2umbA&F(Pa4@8*e({{867y=4&-pV*A%SF+?e+Ue2|w>cj!2S43-2 z^Y|U?Sc}){rS0|P6R-N3Cz#mR*Vn0N3|t~R^yPVf$+nqo&JFAktDM0T$4{Iv16q?C zqTLS99cmJ%wchhgArVgMizHqDJ|KfKkdM3UaE{?{ySD7;P_Lv-)f54Zk5qAuM@SD*7HWBf2g;ZY2qIk5RhWusXJrAhVaUM zW`ldKRqn9;@D~rI3eoi1dqF`#V%gHcZmc%huE(G4+8+4r2lhEaT>`ZXqwMEiu zO2cjH)B@3T6a1zu^3Sq!?7FX550S;Z4w?OUf%pRPT>bJ$b-HDGT?EiJg?uSOsM5^2 zt;?QTdn&K(?m6BvRq49$7cXAqTYNzBY9|P5hIH-SfPjU;c4aCtF)>$MthMVWMI!qW zAnx6VcVAa##Mri9+PXgO{Uc-ZP}hOd`1Jai1rjG(D>T$An+pT`0VC3M>t`&IYQ?#- z?5$M|lu|8{8OCYvsR$MeK?m-?QJf!^{!2&8`QL?0X8NEN?Gd0 zGK4Y!LuGrq@xRq7HVwmF4tjM~{q2=v^Lc0lNyjIQ0^L#c_4NZ8a=Jyx7c_iPMyffT z2Ix`S)Z9!1-c7gftj@P&zBd;1^Yd%r9EdLWQFiF`-zIipN6b@0KEJvKARx*}N(HdM zYi05JnFAf&WZ>Mi2xUk&xJcMgPMvzVXYXD+rID{*%juNUA1@U3$}@2SloM*Q93K_D zer;+S+G(m&v|^9%WAYT0vD%qW4S(JFSa{W z&LN@T?c1ws%dyezLK*IWMK=k4evC>ZqtbNK-QSN!`o>)37`Vn3&qMguD%2XU| z^yzUmY#1zZIC$W|pM%!lzI+UjcT6?_#}%vV2DPH%c$$&i)fVn^DVl6 zbX3$Xu;wzr=i5F$vj=ms2deid^HXnOAfAgX%_y3gILyQ z$@J9HD=J#^mwQzNTIVbn+@2E`w{{o>s1!Wj!KgD+Tts9KFk+pe_MU>h5%I=>RLz2= z9(u*U?NU>_uAdMSb3jGqG6#w*b@aaF@4s4wlu}JSy_&Y8E_gF-H#fJ&2E4rAh7B8* zB~EGyBDzJPzl3s8hE~n1IGsla_wWBh#-$g$pd9B8xmS2cm-vbmJCue#&a9E|f)pdx zQfsgD^H5?6_b|(E;`!tC($xfAzHIT! zH3sxEv#_Xm$!8e1c?l~vPscd;0a(az?kICqw@y)1G`=#<^ZfbW_yIyFZr08yl7zJ( zZ*^uf>j@RHYmbg>f3?Wkf=W)^{)~)_o9+%R*{0Z6R(a@1IM}L=$6}jH^F(#Saah%n zmu}WT4G<#;v=3sEa)OAcXeH`vBH0^DUJB!iMA4>g;#pt*;#C?tNpK~rKhZs&#E_4$ zx|QVeCai_Vy7?75_$U?aY{Ie&Wa#nlEl_mbHTCu5Y>Q+fE5kf{TZ+9b%=Mh1Vx>FZ zIpPU~XMp@?)$fFYksC{XJO0FTMIeeEd39|=S85=;^>yz%|M-TZYu2nmbl!W;E4LS6 zYr&k=Sd?OsTO*)24EC_Y;6C0mUh&I^hj{`Tpbmh)QCi*7E04Q3;*IJ}Z_XGc%;Vz4i}}}qCF{bA z71?`_zPeg^c8Wk0fohcchYf##$%WXzKh9SeqM&zQ+3R}8E(c9*2a|Ly3Pm)!|3e`` z+SaZNy*F>)9^AR}qK&QX@^k#6#igis1cbGN!^U3Z<&V*MbfS$gj!e1G8fSis>J*ix zrY0H`tm+ig_kWnbm(n#5uj$&C&eZLW@ttrp-l0QQW8c2JWI?LKZqJbkk3G(2M2jS5 z9WXUDCG1QR6_(V|8ilJV_bnBdF5N;B=A*rMNUPq(_AS|+1or?P#Q`z219zo^O7*4Z z4#!tY38%Ww?C5glz-UB$I|07ruq^kIPcCEz+gF=9;k}nJhu+=|XUvL+dwU_E*iL5PNzXA2LURtRsl z6;r#jZVQM#Dd4EV2}46J55mJ!7Jk!vc;o^|@_RF*hl#-Uax6$v0y0x{k@wti=yo4S zpOT~-GV04ro=0#Vc_VTR31;q3#coF5ySLTR(b2NrHYPS!Ptw=kA`_cYacBL}YJK5o z)S^G~?a?uYiI zb`}M7vvHD&l}24MnRS)3PYNPw+*DsG4;8CFHPKa-qbaV{DU0_xy@!AFFIwmCna=m_ zwh#wa-(FrS^~+&W82rOq&m4Ai%pj=h__1THfGe7AZaGkc`k>9Uy%9;gD(~fOM<6w5 zi&L||F%Z3Y+dWUQvVOW@BB_=e7VWDZVccy}B*5RiKFhJQ-aavVpnZTwtpsFP6FsK}k8}^k}hOQ9NiYtM-7)^1g(2Gd$jZ)tAcX>cF#&7@x;r&~l^Jh76izAA0_xu!NXh0^(! z`Q&<922mQ363hRZJlzh9Zu<1E$-8&$GGY37>bd!*4DFrF#UsFDG~rTyaj~DR+U%8k zOT;oe%0!q8c(|!Z+2*gVE+7(iABc{SP1FnT6?>{{-Jm`#l(maGprNrsvY2Ml-T1Y$ zP@vT__tkYUp8`K|Yg<=mI#p9wHy|O0Wk$Fi3&lE`WMkgL1^M}{W!IUciq<=}5M@{c z;2i{6X}DQB_cD(Wbs)>q`qg&h;-g!){zb%o8QbQ3rYlIjBMW+8oZ-+XKK`QJi_i-2 z_VHOB%0=g&snB;rzSuM9&qJ# z7g0YSL`H&VBzpqB+%pbw+zGy4V?X6=-nB)MB)$uc zb{BlSttS{$p@AeL3oJ$Lc`Y3K@Zo;ppp$=b1eBQA1c+n@G7E$xm1gSYjx1cXDAlYo zMl8G8;bK>ov`QIpPGU^V8Vb5PwDy=-J4SqZn#>j_z!jn;DuAuC>X|u_c<0E<%cIVF z3Iu0dxpHM0Bl+aVt(uyesR0)%edt>XEd9_OSblxeG8*k%{g|AIbZb9d8o^ zw&uozKZ?xf*~xO)fs;5-Og{?Rj)QDI?NM56SJsrS{Nj)0YI3URG(_Xs`T);bk#{Yb zCB42(c9+XOF0Losyi0$Zb?Vvg!mH-}nU;U#cvfrdZ)?b=NSNe+p1>O3`C1-z`Z;-<9WNoO}VCU)s54Wxbg{5cgV zO!-8NT_xe-q|qWA>SA-uerLhnv+;(Z_yiitfu5`N@#7D+hV6@G5Pfm-#ItICsR~bx z_7UL+N#}C@)ui~;l$+s4ugmNNX7_U0m@NctH;w)Ju4qd~`x{67gpB5eNIW{E?@=A+ zSK(3=Im*r*^<4Y>;*3RoUhYH7d;0gS3MX+h>4=lTwL^yyB7)CUUr$$MYj+bbR+u8=EOqOr2ZR*<&vP*M#J!)LuG$B<@aSY*G z(9v}T)!7gjjdYsyvLoeD`#W=55_BG|+_108fAaKsCZAqhmL<9!&~z%R8)%e++_DEC zn%}ZbsMB%N%Z-p_$&?^GJG1i+9z57O!tQS9Vx<^^5E8Mx4~mMzx6AiyMzV&B9CGfT z+!TkDO}DgKH0{DNM*3Ks+V}O|7s+AQb-(GAC#1aW&2166p~hDbT=t>M3azhe06d9X z>cm(cq*LjXNFqYUYA1dd(d^=NQ+Jc{>-O!rU^^a^QR)hy*Th1nF&<5e&3KFJL{%eb zYl@&tQjvV`UeXdnT7#^8BGyN@7%dZR1IGtB{qfeMY8|k&j3;7ICqB(mZK0fH^+r+s z$NM;$A2OTjopoWAmrb2NT@gtrA<4U9zjE8N>EZ{?%wk3WG|aF95PCbm8U}v;{JHbx}((^$%3;@OHgUSH$Xg4rdm5Ok1I9P-p zB1re~$uKBBlZeK5lRf%$rrTX8HTuxRQ*wHPyG>qRnTxLHmRO(L4#xohyu&@kXuE)| zu5_Fn{V+vopQ&l|^-Z6qUK3EzojiFm4V)nrX~lvm{*lzVe$eQ>w{PE$SF;h7?7oq@ zc&mn?Vd7tZO(eLx3`gi5G^&(^Lxb(wxiJuCiN?)GvAZc>T#m+L#fd3jhzd*uQfuf8 z)yMrP=&GSJIdg~o3mW6%BC8TeU=indWp^0|Q+@4gETwPz`nE#|EPHlgI*JkMf8%S1 z+EX5Ca-ADpLB2`K5rC?l|C*IPfXLz$J63yay7Mw7y3#tKZmeidHvjCUR0S$WA;KQG zOBE>lUF_u!F!oE~&0dM4q%09F`}s_z3Mdl&K>o@nM(p~Jec|_)v5mMmQ!oLk)BIi1 zVOCFpIMHcIrtJKZV{29Rli)E2CJp>qm zoF~GuZ{5CK`H`!Z;CO7NGOzj+E}ms_O^pxZ5R&0Yq%Xr|Ob7war5 zFQ?$uYEWS6uodr{N378ekVdD_@6Mf8NbOxCkeJhSa?vPE9nA0Dx2jPr>&sTZz(5AT zn|!gC(#YdL92cU<{r>y!MD^pyp-=>a6{i%*q@Vh{laG(Dg`8O}dNEd7<;swsxA!Ml zN4nMIziuatJDp|nZ60a(vEOLtd;&nM%fGq2ZmzceAA|3hbOYx?nU-1gpPz}9nfz2A4*F#&iW#K;7y)U8Xn zd-sX!=S2-CA=p~AmV|XFE3s}8wM$nt)V7Ed{%M7sj!n0C-2D5X3+U z?M8upLh}eHiT9B5$RFEL6+Q+AAoUh2%rlnW)&~ib4 zYlc|^^?_=eKK|wx64HgnXk9xy#Ibn+By9A;EW3Jv$)WdypOkeSRST3VM7PAnIksg4 zMu|*-cp50MUrUGVn z>`Zfo@+p<>mMz;-i|}ZJyz&9MNF6e7cfCt*p?!nIO!#S}x{GT_e=sOK-&xOD;Pi(H zh-DVdHz}f*7n~Z=zCKp~l%j7q=Sv_O%O= z81d^g*r#7BI=^+P1A2v-fXmOC8XF%!e!NK5xZvm;C>`K^d}IyBK}=yKtObZa!9 zNmpL?;gOfT?o%gm8GRrw)3o~u2?>?rZ%FL|y}O6PtPX|AMoH}bljIYH3ke2sLX>WF zW%Z31EH;WnH=Yh1!VX=iRA;dVkReAx(b#YirO*!IjfRuXZ?@Qk64VFhiP>OJlO=Dd zwVBxgums|dXhr-mB3Jyz)h7%)tC1Xm_55h&2FOxlq^xSA2ml4(r9%`dYxnuWWn>QV zpI{FHLluVm%2}{=**xV+X>L5vT z-y#L3zU#MPQ{wAB<;TR%c%=lunX|dLlS*>4^E96h6_cs}>Th*fP;TLQ>?YD{i23_sR zkJRF3GhWC({NW$xjs`=`Biaq5h3WG<>`k~B@Nt%m4mXUpK_s(~TqqC!qokBn4Deay z+BjfJGpO`8YqCHp0XM||lvZP`cJ;}e0mrjZ z0yB)L8(qJmTF}vZTA>2Xfa3`wj0p_B1Wg({h`(vF@=4fHQVk8X&ka>TJ88;`u08nJEBwtv538jPqSa&nn<6V|o_Z4JBe?Bhu# zQT`HJ^m3+gpQ~eq;Bj6~<4&^ZbyczvkaU}0^TQgYQ8%8ceD^L2ZA*~)fzM?V6wsjC z=_L@Kl9H0(?sZ|p+6WC!hKMt@4y7|)MPb{3I)K6kf$oD)_xyc9wm6MGXbVF!Zxkzj zQ5~kf^y*wu!S&PhTpF|w9}e4jZQ)BppQ~a25d?Ix>gt__HPtnAOACuz-E89ig$l(w z9DRl#C@U6C?^q~S1(Ob~tp7OQG7T9MQCd!4LjG9hKLHj0D1qnDktK}R&c2ry9LmzE zX>=55k&?KAI2-#4&hJ_tHRQXrVg0d!rRSvva|n@RE!_UYDwfVwSP%Cu(H2^}U$#=; zKH2&f>h$~f@B1V#{qS*%cqlE!p^2mm2({4BUHr-dqGG#?Zw)o#n!diES6-1)w(5sR zz2;h1bYbh#moNS2S8e7yId$m~-)^>UhRq7s8GoOR@5@3ftCWePy*e2>+7eXLm3%rR z5=CRj2w{TekVX0HN1jd*tN@_kXb8La>?sEZzmGLbUvP_nNCO{mdub7@0C-*`o`e9o4Xibsr2y~ilAlElXf$-q69?~jyUNxtT z@K``<6SSr)k+Y-l+Ek}pKK+whV%ame&pE+vB&0$b8s^2E5RV!DYJoz_B@5i;v`Z@t$+xk1s~THPfu!tE0g1Cnl^2k6IDmgG{$G-v2{b8 zyQin3@1F-`hfq^P;|Lq{P61LU^p&HJ0G`O$1OmA2A+Ve{wvhw)ZQri1aeXJ(^>`bh z`?7UJ03k92Je z+qbI$Msg~ESvyfR`%_6@j)2>qo*t4jC?}szrsOoh&eDEML#-4V%|`ovkc-{8* zj|K-L_4KCyDJaef_&Pg$(i%lY1Jan=d3AoNv&ib@5=qD_?&1?!n^EWCpWFy`KKWd> zT$$I%jvr1E^|+z*YQ?+KVxgri1>SQ6<$4XVMRn~BNEp+83-A+P@xbxb0V*{W*^PB# z!Y7|VW99zTZ;fJg9e|SiwX}TQK%&zIt5H966%1<>9r#U=HNi=vU}@X9fxUao`iIcg zh8~YFLeI4E6jDrOyJFff^ZJJMXDWNPUJyOIdGr09*X|{5A(dckT{+LHr%iJTp)))N z`Va2jeFeaF*=Rjfb^Bc78l4l!I@3I!qse^`j1@c=Ej`)ckl>d+Ipd*nyuD(u|Y@z|V97bIX|5FrVgQv|BjZj`6a`sVYq)k@-Ft@`xo2q|OkX!@l&=OS$V zI3gOpCq4lp{{iR@q>~EM7K!PbiKOHLB$PuiNrZe0?x6>YE0^|H&ARnxULu>~$?#sc za=1BB`%ffTPKsv`eU-Ea-n@QY3SVv%yqB>x!y%+uPuzMCDINfss(TZIXDjk(2KGC` zXx+P}=k?rygdf4)Q@&*i|D3@WPdF`lO9I)5-cb$RlL|jm8{TW*kt0VUnQW4}_V|fa z!pORe$tHbqAoHrewsJ|R036iET8S!=^)$--rybl^03d(frpnxffFXav( zV;D}KE(?>kUw_-@O)VRp`b>yHs+0HFKqJ-S2=_ee3MmYOK&1G2-%IDp5y2A_{~(SU zww&W_C5jlk@gV^U(2t_f!660>2#z=f4dzViBV6WpRb#i)&tpRjvhMu6AzHK|e+glm zRn=9a*&uMkxee+=>v9g*ZtiZE9i!1x|+Mw3wJ^-QtkT4rX?y1zzM?a1Yex z0O=~BIyhNUHl3ffzCb1tVF7wN(qqK)!y3I>dOpdlL}2UG%x{~F{!_^&7?AIYkCIM5-8edUK%d80F;I4XT#66qIKH#hmuPozVb~O=Npc2c}iOZ zx-`&X(*8NcN|n&A!**{Ci>JFd_th(m?#Zn)&@#y7o8Y=+K93p7U1#^p&4PD-z%1|R zlke?)`^2WGpSkSr%uOv7B_*2;&;0{Q$otWyXcPCZOvvw#>!AQ7@}7^x_*WO;`ZHl@7y)cGP=##%sC6XKV= zx5JZlN_Ezry*x(i=STzkJ zD^+NyP(%`DK!~U$BRiz?0JiDc=-lAat4c^~HB5@6XFw)%rd`-t=iXy<{jx3j_LVI` zXc!|pg^GJw&ZkN|e^`^Wgbv0<*S4k|D_nEdDtAg8JVjY748>BpA1*FU0IfGgMO8S* zM~C6GA;`HON0_uQ%E6LWsE`Uug^{gIJC}7^$dov~kZ)J00EnC=_&gh|gfQW1zSs*B zUcBImJ1ZOiXE1#87*`kv!bMSFK1(Fba6|zq0-}jqrlHTA1@FA^_~gK%@zi<#!Ol2| z^^-i?lBFh}+oBqZSJxF$29VuF*lI=8VZkI}=A)foAM#Dg;Pa>;}B zKmGw{HVujuQk`zDTQ*!yw{P6Q2qx=r+nJD4MbPC{K}SI9C?krqCml+Ph0O+Hz&Kwm z_xQJo6F{c7pj6|dT;0WaOO}VUkRCG#A!SrR@xs_*yeogNm}sj8{D_IFP+#8GjBnq* zS?~i``c$_MQokS|*{65zcF|_2#t}WqySUi2Z|DCfh zQ+6YrYs26;ZYA)a|Ku-vMFl#IMAg&{`*jbxz0ebI^O?l09#T04T zPn7an0)At{+IP2uf@;TA6ef-TSah7Ywx5B#_L4U*xO`h2hqI@)P6}yRt)LM6Uq|Q* zMe$k30TIgASVHMRck<`tbzcO(!R2Xsn}7)PAIFW-v4UnnfJWX%o%=r|W2ph^*;TV8 zlJ01k`uvK9qPSv7j~uLCS=@`Bmh!k&Zt>PjcQEt|7K6Frk}1FVn*T%|fM|ZTOj=8f zjz}h5+q~p1n!u&w?aUmHS<6n~r5hU?M+|uSCj7*)DOm24VpuzXcwL&^>Tv_bu}FsA zFuhdcZ@ia*)Wk-~DhRS2L;e%p9oPLB@{kwzft7`qwz; z(0mb_wwd$51SO9P$`J1V0~p1L*d$M{YaIRTKj|71c(_;Ax4ATQckkFN_{G(*z*qGC zPc>u__{kF|jH4i(n!1z|avh(#92pG<_{j^ddDicUaDw5&N{u){XOd z>o4J@uPiupNvB9gQ%h^yoHAz;=f?=SUj;TtVw-jDUCZQqcg}LY*U?dC-0%JVSelx1 z$NllY9t(T1wt>lZ{-b0HQm3iu_$PvsIx&1jvefc_7p7mQPe8q2gagti+65K=oAe1P zKmH=)(Z<>nXDExeP9^KTnde9-(eoye42ZCVa5-)U1bLX82@e2ydF6j6CJ>M(KL*41 za9q1KeB3icimr%^Oa|cx=l@*|aSng+XwY27jfR6>Qc=N1)-}{%4kUZEz_=CE*rc}~ z4m7P%H(-5^Is~_p1$7uhHnES2WJP+qF>_}nK7CQDDn3_4Bz8P(OO(_0uUu6f?;qiE zgAU$YMVD`1@R5*+Ho|^^%M%_}_P4dQSz6UlP*kIj%l4riH)radP1SSt{*46^Ejt(! z_scc$TcLBnav$v;Z9`wsqBnJs)#EK>>JyFNSV(X>Vf&(Ln8i^k>?v_HVd2 zEhfBzl*d8?yV4y_gh@bdXQMFBAJ%O#NR~RNtGofC0)b% zXx2fXxH=?_t__B6vxK6(9AyW3 z2cMz+E=mUZ2(?(D0(!J&?b=&HP$89z7HR3~zLA|fFD5RI3_u*jlz{*D#bf8xyN?d% zA0JyTI%*I~;ihD_c~!5EM25s^VB`QZKA6t2{=R@X&@jua>Y1|j`wE+)+YC#)<1vM` zaXv5A6eyAH?Pf#^?{RH-JGQW93rZ#~aZEVA%2B!NMK8zd4Hj$Nn+glg9uEPhC^Aig z9(86pdl22k)I0%a6Ig@EG;&~~^u~=T3v2P{#L#{a6sn`6BmWgY>9E!IT=w9n@OnJw z^wN9-lwYLhEau@}e!r!YVqdg+)>OOG8LxP*i%2ns1CrOQ+bHP-TB&A?-~TWRR% zL}SJFa?G7Bqfh~3i4~UI&5~l%w3}#rG;-$yXnXFSbJ}_}tZ&xu{^0dUbr~F=U$uYb ziG!*@ftAI?b{H3N^nvifDVEV9Kzgb`SObHst^9FZ-Dj`?%|)EPLb= z3tF~4fAV9a?P22d?I_Miv>@zZ-hW&ed}Z6zKOP0yLRvv1Fhb)-vy;t-MRFUru%r<_*ZKl0k- zb@T7cfAVQY%}VHYM_x`Fzx3iY%U5%FTvgH-dHWCehR(=;1K)ndd437sC=~v2fe>LY zx(^7CO-i~kZW;Mo7x>P)s<;HsZ4>^58bd%SchW5E4z3dTS*-a9v#y`S(OGa4z_@Gl zU1h-KHRJvmvJeT=G0r+iV(fdx#UsZBCu5I=Gm*RG5=?>$JnE#;(mc&Em4!B0cTfQ9Cxd$kH633 zOAp#xwoLf14#0nbqdu{mCpb;wK*05?RX_Kv37_U!8=*<0E8GyF@~dT?f1C8^Ve9!7 zyW!Aw7z%z(+j-(nZsI5|v;K?Hfk>J=_0FLg9OM($J_ux1^-Rf z53z;BzqJoH1aXv01A~OOZ{I?>?Ay>1gee)wb59HfezG(Wc>tX);4f(Oeauf>!<>wc zE+raOXf&|6{vCJKuX4l)F}$&ptfAoML-F|2AN00tv zwHcENxXzuu>>&F$2c*NtJZ=L1UU`55&u%{RixS5vJl{Oe{VcJOhTx(!GmfA!G+Ru^Y{Sii~c8SE1@*?PAbgWn6{6WPE_#F3JFjE6npzi8JBJ&|3+1pEvdjQ68tdtpk=V(CO{(s9s998ol2|ZpvWBi5;=}4}z^l5QK z!{gVYB*aq~j(#PclCJ?t=X7Kj^P0oH`>SOVnYHfW!go6{9*+wmf0Zcyc!Za>v9bA8 z79P{oho8tqr=<+qxOj)xyC0pwK8#n~jlu7I>t=QIvz15xwX10wtXIN&c*6UpbM*8{ zXe@M0Nqta8G3-puoPHrVt*$omZ0kFSy-#E9d@zPqSi~ z$hkwLy-x0M!zGe2eDmHa{`0BIVnP|Be%WUlhg#`rBMy6(w^V0a>MyzL=cmQErF>bu1)hf-u|e@YA{r+A&pUd*de65-j$b<9%?Oa zQ}e~%x+a)y>8uys5b}J!Q;tJNn%+p{qT+Pp_Q5U_%F&j=djI0X$7(b;T{L`@rQFvy z*mb&w|8e4bfx4;>&gbciiuds3oN)9q83{<22ZLp6%%CQatCv!7HI*rb zK>{#DFi_`U$ZaP31m&(thTfAHO0c+D^mFFn zF+VeF&;cV`WClY4H=uxxlTW9@(oP*bYJ^z=;$tc+JAhjNna3ncG_FaO2{O$`!laph ztQIr%=(aijRJOAxRVF^-_4P#xTN~tAQ(bMFKgu@V9fol<_qo@(5xxP}xv)o{I-0j8 zUtFZQFLYo=dwcx$dnJc2L!Xb%jx7QJy2uLO`n)TIIw!P+{h*^ z0D#rP!pe|HASA&}IDw@Jy^oBQXT$LlAY~bVk%sg3Q<8|soZX$PWJ3Wsh&>yDIXF<& zUF2FE=%?Z2vL#ql&ftE9n_{Bd3b?c|c8*qsbMnI0=vTUJUhLg&yJY*@nm>PXe(JA8 z+s#zyIh|=(@OBryRC#gC=MzOG9m{7{-dM~nI%SRUcdLfu;vys7fBd-prVSCYZDF4S z#hFH2L_Pv;Qc%dQgq}|RZTw1Ym zU$gK&IP3jz=)$CgnZpNUu+0^Qsj(|DiB<2qO!Itln+PP&+OE$V&Qy9WG*4}P6HRN+ zP%X@R;hb&zEdP^tA*K3(h z(xJ@&(Z#V^LBH}u)i!70Hk;d1u;>@+p+n1y(wa5deY zWY%-cV}?V_+eI!HAhrlHKuj(}BGNIgrr-%0juhycoi?O&rkNS8cnWe41Ile6xx|kQ z_&9yOCcP1=bN=8pxasf0hOX5x8%74`Y_PF~)v>d1Q7?}Efe08GfpF+wVE-9r<-9o`%q@0-gT2W=Dn1J1pm#8h>l_xCB=!fwDb z1e6TQ0|5?$cq>)Nr8jU92@x+hF)Ii~M?~zzTKWp%!%R`Xy#tiXr%#{0LQ*|Zbj=#? z3Ky#+Ji@DQvXyVV!o2J#IWe2v*?B%R=EuCg{LjVPt4#ab|H_w*H=rz0F*CC$3y?Gy zlAL)Z0f)mI*U~O(+pnQ9yKO&OJZ<|Szp1_q6vA~Tb8kuk8bZ$Ysi=+1%F4)#_@sLC zY!$v~XZ4)9b9YqFnKv&6mn3?p;L^zaC7t-xii&p_smP{1sgT{_ULq&)w;E}J8PA(c zo9`kk8E`O-HbrJV!4YN?5T*OJZoLQj@hwMn)rllqPv+G7A91v8yWn=lB66rUFDVgb z%()&m;Z{F`&cOXbRb(0nc6*^R8>0@Tev8nPNrjsx$(9>?%(60XdUKmh^<$iqigBiP za$5>+S=}P4lN?^z3B#&gp(MQ(1EiL=f}Mp=V1nA)DAZN8v*svEeCjnxr~Z4C{(hxI zMwxkd;$HuaTWnA8hrKsc+UwzR-2G+V%U-^W2}x=PdS^0$=<>~}-@`c)sU#xe#$Qi2 zM>3>ud{>^|%@kQYO+<02foQHG&wuEzlHE)4Ugo9h{3F4BL^ObP%^$3@{rhkXPLsSa zC$wbfuyQs{EsT5a(APuPa>E>x9^_udL@~K5nvB8_As=?qN!Fv$9_;f76d*N=(nzd= zCFaS=y%gk@7E(6g|3d%kRBR0hCOK*ke%J->L*qL&&Lr%E!C~S)0T~Y^v z{FO~?M!uz`zi)pxG$4j6WU>~UmOpJelU~_dGsQ1Gy+f;Nb%#f)6(tNaipVVM9;#6? zJgW06B zTGBGD?rhdrvm?khzCO^|Ie6#s7p9%+c`C*^YggEHpTq5Z)!|6dV9Ki$6clgBbcH`lnge^guw1ifF*lFPh~MkP)(*r=AO5R;N7=s7W~ z!6xG)l#RhE&{$mdy)V7XnIX;FA+Pdv!nLC7em%+IkNE|kU<#umd*;O=)*~e$69Dwa6FTn@dlZ& zPZNzDKKxZc2_!d?kx+8cBe_`x1EA!7F;fg{d51@9M79$nE4ey|xNmXgC+)*u(>FSF z)rz@J{8;7man-JlOS#3Jw=*-Cb<^g~lMF4k*lm?{Juu+j=ZFXs)?=ZUQ~361dOmO; z&d?T^K5Whq^)23-?D3Bu+J1L~L2UyWY8!!ozvqg;!qXV0GsQI8Znds@p2VkTTq#Rp z@>-ra;g%Ii+}k6kAuKcBAc2yEnV#J?TMNGKqqPV4tj1Hg=p@qsx z?vfb!mZt>4F@8_MKIAm0Dfu!rtZQ zSc)r(yACX-99k)GSRdmyCydI+Ch_a8;Q zb9f~~8{YazKOs2R!dXu^^5i@1bz*8EH|Z7~@(uj)j3P&`R+pOF+|}KGJREdkHkeD% zI$sqqVq4^_W9+IWN^82#>=Db@4!ab;z`{#am@>WPE_c$qJM7E0 zi=Ryap*+MFS}Sr+yH%0Q3kBQr#^r2;yMbG(m@#nbOC1~u=+eQ7|E=Kak2W!4DmjQb zz00mH8_xZov<+*^zg;5#CvE?qw0%F(63(jsFQx68%x5_o+k6Cv#T#Q!6*MJvH)b~1 zeA5%tu9707Y{Ge~XWf_>5^3~AW66@qlS2OdJaPBchUVPIXC|Ia7!KJ!HsbbuZ0*ck zUJs6c2Q5l+oy706SK^MM0p_Q>d}H0enl9S}#~U#;#kc_07vIsD(fGHE5eb6xJ_TuP z%UAK0@@lNrzx-UB2|;j}E*{ z*TW6b_aao9B$wW{92|Y6#vL;;WZ9z!f2IXU&gJWy^CiGod-BAPfB+ZQteD;2Da9|Y ziatsXa>*TBzb(h}ZN1sl9mZ4{;YvwXjJd@@mE(*&wW~8%$%z{1M4x)I`;_uPZ952V1n}keA3ya&b=*_|a zzH*-p8lP_YbcskW-=brBYT6e$-`_1ViHZMj^(AFB6$Zv$ox3c*JG1j_KDoR{rmA{TXS*SG=u~2yI8QB42zvv*A@s8yNlVhC^W( zaDC8pY|X6Ddl8$H*O)(F6Ki_lXnu6~J%i(tOXF+z#Xi0p8Mff}HwAl3O0NF4;+4d7 zqq|3HFvXNcTF8z?se^JK&k$bl_U&FW{wX2xD3@At6%pMs!Sb3qZEHCh2($IANhx8i) zb;{0iTTrv%>ml`Y zHXGLb-25PtDW@Y2lO#oM@5D*dIqi>g@s_JPQXXb)x$vOBTE9}rQZmHn_QJ^8x4$)= z5L&f-g;nIR*e5x|oQ8g%Tx%~|u^z+STQ|RNYrDxPFyBfdK=t;un7A3ySu4YP0?b@9 z5_Gpo{JC+B@P0>~%flNodFmwIrPV#XIJREj+ra3rz}rG@i}&ZX9Gg}-_rTIo)n^){ zgQGh4pSjsptPzQK zkC%D;qpfYRPv0TU(%CvL{nN*O7HW9~wei$r&8JtBeHghHG+rgIZpij{=5V-(i{1?+=GzaW0ganN(_%*3LH%7wlY7r(*qCU#VQ^Jzhc7o>K5fOu=L&~Q&l z1Z*{J#!)kKNeyYEsri=T#K?)Zm|;sC3`BApwY6OXD4%ZN5dIKLE>Oc;v_d<+k)#?|s1(0xx2qq$P{Sl>GQ8>`^@>tZO zJR51Ub~2cwrrqrOnJlrVQk218rbhkv1*`}#_@Vix3Y!r!b8!3m_HF#=&9LY@8KtvH za(G@JgO-0s#=@1{tyyw?0=D+^tj0<|T@0%|F5E`6YwoG#e%N069u5zCL z4$_Q3Gzzpvd`vM$j0~}%J%a-cc~qLjVEu3+uxl&J5-UeX{_7AlKj;T}NNU)(q!-v? z0~;%%X|!lkD;#J78Dqt}F)@h+F*`6iG*?( znd}Sau?evxW$E{EIGe~B*#88p&3gpx(VFQGk0+dXX~tcF{T@mr_);5wQOT#rL5kwh zz>L2Kh%%E`>VXMN|ygD#*|tnZ-4z%bSJ%<>EKJl(N1)Nb1&g-)tfVrVuv>qqld z59Z4g0wp$GyrBCfBRxH&XN3lf5E*IvZVKJ+Cv+J7iWebe}e;9}~C`8WqZZ^GPFlS_Yb_gi%uDERhQ&mSP7MAaVm_!Y9Jok=G5hYPgJvGY*X%)%Hg&XYVGa z5oDX)VC21*gzC^XV4>ev#pyVwu`M<_aagS3ucVayg)0>-oHQhLQNF~kheee%A>PD! zLwreX;z@mfW*iNLzyk^G=n&XkD0vz{ZmtzIa_h|W%3_8oRonZ$2NfQBq>1@|wjPJw zqLQ`KR9RF^snJRH>YlNC4e#}Rr6&A zgV4xsT_^9bOYxTBvYBF~VY4D&XTUK8bgqIi2xvJ+&4o%t!&yMWPMGP+yQTeyXM^cU zLwL71EZ^!!`sJmH={%y?s`7XWHb7j@5aNIkL(b1o!3TQ$QPq%i0O$+*0N& z^MNxZ#Vod2MxfgYHWx`F!bkFsGjp*Qw_$?}1r{MR*S!*&=V{GO3TL14s}!fWlEt{> zjmYM}VwVQC?gbzKi=AY4Ur3c(ATTDtWG|F(4sN+-q`vpqi;qgqRluQN$x<1$@8w=F zBSY|Bv~D6~_4-x|?`@<(8={L)X#T0ia$NsMY}k>GlQ*eIZJ+!!hpVZ5Ia)!C@qxl( z{C7j}Epm4!5tfLe_GO?wNjRSgdO<41dMq(j4>(QR5lUXt*jT1+GfH!pV}EvLE#*Af z3NzmZP?-K&B*bemQDLoya-I}HXXl+6 z)G<5TYyg$)og!WV6-9SlF|TT!jjQwIuoWfgIMKsi0;{BF+wCl?5 zwX8-7ERgJcf#>-!fIGhw_xM435mhfCEmiu7NbARVwv)5DES)`@t{L6K3W!t0$KgjP zK(N2ei62_T>dK9cccHvA8#(eN;lXz@(m(h6b}#~ol!~O}=Viqsep2S2XW+juv!LdA;FA5?L zg%U;ega4C@xeH?3=mmRA)02uoP5wG8mLyP@9uR`c`Ph?0w@)f^@3xeYjaYw}*TU-~ zxZwyKvp#<9h^(4)Nc996mgAVEo)6fZ+2cN6#wfqR+keFtne0+kRrN2~vv^#(OsA5TkzOLxj82a>d<~(*Ys@0#?s#Qe?f`=@Hzr&5XIt+& z@wX**#IrBUJfGBoQ|)=lSjFu)7uOFgFF;J;Gyy-v27sIqV6iTn-ZjHGJepWyfM%Oe zz6Vw|rg`px<^HkD#9~Sw4xNCN^)_!YicXULe+qp5rIjjcm*!mz_u?t^4#vTr zZ-LtWDklE5BH9;OKpye=Y_rSb59YG-a2W+3NTaWYWF6?tyDOVf)?~{<6hq%#kvW!p zrL09bUtOFFK#mZzNkVdDWO$M*5URrXXnSm_&H@BP0OW=3B#Y`tO!oSlIy(QYjQUsN zt!xRyKJF~ZG+k~2c;4jfKq8GdFgj6RQ{`oTo(O2V>EBLTYGRm11DWt6Ax-Ga6+}VB{BKP! z0l{Sos(mTKy9ejbECyN$+f{ohckwc-skTiHO5a(Aua!M65>hYuBSS|X9G`i!Ddd4z zBEAClm<;Ww-Lerj0F5pRfeEO(13xOBOGYVFzje5Uk&&8i#)3p);e(B|c5a^1o98K4 z6H0}>l=+|MT2@y^-yCz$^O@yLoOC_(8C!Mh2Cgu`o&{DTiz(sZ7~beB4e0zdLvX#8 z9z-JyJ(PdhOJE-8WnP&e6xem3cfgGc4spp>TK%{@m*gR|_wmKD@;uK= z=NcQIU1Uir%fR!;R5Cilr7*4uti~oLA5?U?|54FaD|nzTT_tEI$uQ46CWh8m#?QsA z3N9OHvZpSe20(oLFCqGSnXa@3t=p+z`p^h0EJjHDNgkugsoPRrAOvKdw1eA+n`q~? z1Xb{|Y?jot?yVF}C+oel0ntE)dr_O`}} z^3nlnQEm{ee43J;)_7p&Ry8^ePmaW^Rj4A<_e-~mno%H@S**9 zAyv%>^D*6;9L}%gzy!}d0oCe2@zsFuFNm;9p~IjdBQJ}fwOdY5wUt{A5QcETM#+vW z_78f^%Qkur5sqKT`v~bp#dNhj^F{JpPBm27JX6sSim>f(KS?d`)F?x{LOI=z=i8pG zlYW3(0Q3dKRa2-=v3|RB_`nu$rNGmMblP_%8h(Fb?w@~-DS&d`#LPz!pMvoe#OLiZ zmZaeyV`%e6wr;+u4w6DRu>J5yjM;<0R|CB9UPrgAOV780hp6pO#_jO{iZa&QIZ3k%^ljV|&{m zc^zv9>Hyd(A7k#sfjnY{vwS3yI~hOhFx8kdDC`j zP(Vx=steg!MFwYye^@?I4gk;~r>IR?O-{BtaBV!aY?%89pr9PUXcKTsWm{t5er)>g zY-(&??K=8xJEj{JK};nJ72(-hjHD0~!(woE+@>oBu()I#uO8Q+<`Mjyr$$!cIwb%S z@b4Z%s#6P{?%t(-Ag%9XFBF@dS*isn=2@pc;C&Kc?W~!lC(|=c@PhLPNKZ;PLpG|; zz`+3V;&B?_w0>>QkO;x}xU3*IIv2w#Ux2|mbmjycq^;3Q8 zSaca-01)NrPz@S9GP2Z-PV>f8%kZ-ZcC)CiGUzaxpc(K73qN%AO)T9q@ijWUkDr!-vW50jWS5 z6MT0*Mh3<5_TP6QvXzmwlU--;f;{~Y1zh=EV-^oB6`o7IYDgkFQ%=Eb_iHlNDWuFoFlccXPMjgY|Cy3E;W1fNpd+yO?UATPp(A~97E zL|anI<4T~5M`O~K{I~ud;Gjbt=bGrh1|t8e81e(h2*WuuLHGvn|C>&2@xNM@ruhcB z-iP0!>PfxrYO|o@Uz)m5z$!X1cq(9B!B+Roca)d>MYV={W;&PQmFUYgYpGB0GCwjs-6;dQkAP};vw(0nV5$}B zKoOpOkmRQ=@}sa~mG;3kPDlsuP(*IQYx&HXCW27Bccig!0hH?8%;o_mCV%Md=jW*4 zpfecQm;W{g8`OdW^8oM{0af{*QDupt;fE{yhH1^uaaNzL6jrSUc1tJ$w=6)aR>?dQ zMD_7}A28nf+@2%CkhOA9qly|ZSZ4B{01*gKfI{NS++rwv2+DbEI$enW-HtsayNV@s zHOuogccuK{<4vu|IK#F4A<=Or_DZ6aT6-Q%MNRFyXhdpE`EsIM^UehnNc+X=LRBI>)VFU_f>z{`x<>?WMr1E zeU$f8Wq1)vha>U2KD6EJ8ADDP8zvz1dxrVW8$tn{DF5H$KX@7QLkr3q#E&_|-ZTWd zH{|DHLPS)zS902@<&WK-_EJZbYXTC|Np#!HveVv37x-r!_cIO+)|m@7J-hyoM}wR# zH#eaRyJWUp7H)SB!9EH=e%g1r!dzUplU15Z@WO-5r%^vk71yrfhy^JFa~jug-|anU zEmV#@haHb&kBvVB$FWBu1$=c>JyJ`+C?mSM4EB{78nqYZiawyb#$V$K3?3P9_QgV9 zr0)E=s^<%03$ez!oONi!5d%5-p`KZv!gvfbIC1TPKU7yjSR|urfq8V5m|U`^|In?4 z%I}jW=%EV=kS{y-fXCOerS7J6^6$=++pOgbs-so;7}GJtk1Df4Si^?BD6mn?QfnHRyi13Kgp)vQgv zf^5;*v7h242b>DKqs3Q%*O-k9iym{~A=I1D8L{7H#|w)iR(QAq2!oj>RMdnFHj!AF z-&!hs8@SZu$S(vXW(X7S14VRPDbl-saZX?tT#IbO8I~Kj1R$dJdUWM>!8Yh@$EG^O zOz`}9C(_93Ie9eh!M4gkW8HwCTafpFBS70}`-v_AZ}|9EmtonvY^h*@p(nDS%OK;$ zv%ydt1~!{i0nTnczo6xV;Sb=1O-;5Czav~LVJ#K!Y__41_{*ViQQXH^*Z72f z+$z#%g;oO+C4jU~ps*@GwCTnJh=TO?Dux958p@E4DL?W58zh7)aAlX(iUBAE>;%QH z{8~1?9K(UnUC3{Rm%+EjeyaS+l&zStqfCf@*d3Z}DgqG2YVP-CMX$V7oxg4gqUr;& z7c0e>mpHBBix`OA0d{g^F*kcx-6-22<2&Pn;NgZRY#>_rBaA1F<~oQm1EJ=xL2$j5 z>S*TvXbVia4MX;Y$w=AhL<>n2iA2WPJ2f(G{Th~z_% ziv^gY1Tf92br@7#+Jc7Zh`~~bi7bdLT*N3O(6`&tjtV6GM$S9somPXU!&P6Iz_-wY z&UbyOVi#8@9fVo8Xs|oPUO#iu@GUpv{l?(HpD6cXGtaiRuo#g^m`e1;IEf!~~Jr%>c{N zO3?aF3rtS>(&`Rc$?BFzdIJLjc-Ox*S5Uy7)bu9=FF1^q&Dk^iYUoZ9=fc-En0>!l zWG|eYC{>a$my#6W@`#6Txd z-EIO#Hv}*D_xE#xz7`2AJ~UjWImr6nz#ju%6bPqpkHg0$e2}9}%zAgunx$mC3}F~E zN@3*I-k$n}76^9_5iJCF5+8&A`*pbXe$9_-hzOUMVyMf6-O*FDBBR1G3MO#kAa!d% zIu@?|`t?0f&jW^ZEFJydy)X8K6L@Y--n#C8)zgDkI_}j)@zyAalJn9F@@CS9(%Fub z&Glse7~px(-0z-5k_)#m)st=Wd&)}}u4E@r%>eKxh?RObNgHxX@xQt0@KXoMuhN5T zO2}_$mI+$sgONyCU@m<%qS1whJEE%|qIW%FDh=p(t&W_r{+&SC)=?OA9t52c%y$z( zJM2!n{vFUmI;6UbrTmkggDo$Z5bZq5JN&yiRr*o6fZNN+>Z%ox9}424AWJ!Cj^e!a z0is0)NbGH0y=dP+Hy;P`1j?%2P$7s6^e#Tw%7Af3a~5b~u(b;vP64)7TF&By%MU~< zI)9b4dL6gAYDT^-s1*|FkHr;#m~XOTg?Ndy+O}D>VeE%NyRkj%hxl^OpL@GZP!-1W zRSA67e)|;$Qs6;BL(Sm7G~kGq>xFn|h2T!?fWaUyyLiEL7|py|d&C$?#FQ`4U^or5 z8hwfArw0Zg+jDZ1y5qb%8~ z0TS|ZiwE@=p#M-hkn1Sb^9~b$@c=^tK-%a#v_=&O@~m%@_ztO_8#tb^UOVe92uRvaAIi#!C(YpohY6H|T2<+c9RNV! zac10M-%t3Ua0r;a4T=F!t3tmIYgy(Yn$^z5Jx06;v_V01I}sShRDTZ|-GBkGwjgP= zysFl4!xTK(d3R8m)1dXU^!hyLg*i<5b|o2%7B*`Sqlec10)0g(H+nEk|(wXGv#q20LlNh7Kd4xQp{i13y6MuPo4fm`H2u*&6B;uP8=-ACAxfuj5ik3A-46L< z!00Mo^g3rFG&NM^xZ5vW>q{1dzV~C`t_0Q3uv_i&GH0xqaju4blm1D!CeOSke?J(s zV}8Lws%gcA_nMgjer@RItfHmmBR5d2laiMQ9WB@feS^smQ>fT@dHvGU(+#Pp{J(<& z>)U>!;9nVIqD%~kCJ#0}xz>qZ!>oomBiV5~dwlCuGV1LE0a|;`jGp0PU(j|L->uHQ zVFs<)sOZe(4pjFM%g=_yHfe=r{r%HFk3Z0E^B9|vH+Ob-JI~y7bWlLm8%<1XZ13o(A7}-- z>jntHj#clfV8 zE*CJ8&8K^w5kmG`N#_k$%!dz|0+j1PdQ2hThq!P<@Vw2OIXF0UhVwNsDfgF+(?54H zXw)!%ia@h`z!knw`bjclbM^^&G9NdKu>K;q{63YGjt-Oenv(F|9!KsB;hopa(`=7| zp@WuWh<@JBjlCjci4aqpHo^FW{5|+1RtGoMwl4}(fec{q-}Zb&C>HX#@5m6XCA@bj zw!%(wBv&I^%bvBaL_t~1^|n=NVD+$~P}bp9%nKTCp2=QnTPY06Whta_d$zxa8tQA4g!R2L#6Vv>RG7k%0z08*_D!$o zu%$CzXylgFBc~pjF4+!!?n%3bdA4NETd|#w4lA6`eqI~u3(9%{`&mX<_~`cF)!TR~ zE*Vd0`#E|C2fx=|Ey^=rVSLH1|J1CWm4kheMzUY@?OT4y{xJvFRxc9!NC<6BvAQ2}|| zOvWpcL)B|uPY?c_9`c_7IqA}7(OFZ-KAJ(_o0TN5-kVh@Ze8?b>3>qM?szl)74Hnk zGo+B|E8ma(aFZ#7F|tF^881^3`5s*h0&#Vl8=!v4b7K9aP~uB7Ge$57=&`UTr$Zst z?6ruQ!K0D**!P-iM@lvhRFXznB`SomADZ&jz^mwQCX|_b;7$X%0@{CxkY3_cK@@^g9Dz+b!M3- z>&6$bvZaMJg6>)G%Cd6b$&vb8x#kjAZ_OU4`SuQ1xMHii#Kh~j7LuvOT~YOV>Z2pd zT=ox&{i5pc-@pF_7THOl#c?bkQKu0l=oZG#A*EZNj!(Ylyql+-zO24 zX=zbW8c(nNl(nUL}p935M4O{5l+?)Urm@9WU{wMHfL5dSz&{qlPEldG#X zXQxD9kHXcRK^Rf@@2iQiHI(Q>nch){OiKZ zZ=9pHQ676DX=&!~%L%aqgRMDBiS<`UfaZGeMXkR2mfT=WHJqTW2_Y+3{!)_B>3+@4 z&DVt;z!BgCj=!sP?-&IWyRECSDm2iTB&cKMH!8A^Cxj87TD++e*-ER&VWpZTDNc`t zi(69g1i2Ti4jXHB@SFm|>V5*c!r93Y=BVTHIF{n8n1#x^hTDU6SN#$9XmljJwOKh< zVGvlgzn5!XzNKJ!hMnk_YR~*O^TD5=i}G{{Mz6ZQ7nz-@cd37;OaD!%sfxqv{TcCy z``On8ygz3T{T$DKMTy*&sJBhS0=ic_IHcY;O@VdHQ#x#k67k};STy{sbAtW&KC1Zw z5|o36{7{7Yi~Z1B4`h-)jg^Dr+r>rnvO7sS`F4{j4gbZ1$w78-cQTk?s! z_Cn`dY8ow%I{(|A89n!Z#E{4PvzHoe6Kl`Nh{|GT61xsUN_;By_YImGCmk_Rtjrm_ zM7z9_+c@r%JVLn}uE>hQGfA8f(NLrgbgIENM!z3<0_g|l!wMA!TnUJZ(r!T@@)=x| z%XdaaC3W6_bF%43uCA_jS}SKoeti<`1y=zpVH?oa*HJ{%nN#I0Xnf>04p&=Z&_3JL zKNTQo0Z)H5pUjcO6dsvv15-&|#83x_9w06rCSuVj;ECy-Ayf8TRDT=Co=u zqOToEX&jUSx2~XYTobKH&4hsKV<*Hdz=E30hsz?IaubDBaJBJ?2>I$N^THa7?jb%*2c%I?GX{GHt06En7PCQ@;u>xfs2-h%Zjjg>28TV^>I`(sI1;32JmQzwWBy!-12I;r=jY?^0NNL`=2*yX#y1)OzkBQ|MVf) z{zC$l4k;bp1^oZ${9i0e|20jK5aNY}1rMjb>IN4F6*TaNlKHGpm+gqo-nPzR;;C4m z|MU#~d#UAbWSNrqcs{u+`}e~mt_$m9qY5RSg|%#us<4ACGuZOJ$&_fkI2$R#S{7RL7?b=LB$IV0Z&e$IyLqG&nn zQfU+;%qUs)UvW=|e96f0b-j*M_ALFZg>Pn>W_U!eHO^+}?G`wnN5gsuN<(f9rs_HgdN|akW)gMo*rO6W)viBc-70($Pa8_R& ziTq&d`N5d)7q%E}8ou+}w-;YMCkHUovrM7{_DoJtf9avW|III}(NNE(k{k^kJ-E#P z1z&oO*M5b#na&smpSCK_=d8kHGeX|{7z;BDE6L-iS7#l zitHnO8A#4MhyP3qRl)~s46nq!V20d!jKNXH9KzW8s~$<+t5NR9=hz;Bsk&75Yp^0a zNQSAB!rxSCjFcG5q;Y$-BbTd6828L1W~2-Xrw^LqEHud6Eh3X5RMNg)Lwlli3^QaU zeh*)LA*6j^(?5)IcRp%a`-=G`>W=+Dpn}j2L!{A?J{JNSaXsUfX@EHwW?|kdfZwUx z$WfAtew9ql_~`y9XarTvQJsXec4S^%PE-{`aPgMfVj!+k->wm!qrS<>yBBCkL)?s< z-+m=b{)QN0k-;;Jg)#3EfS;a8A54)6dVv*Wfl@njy;%xBLP<-nRH^(^$31|nOMWpDWC)|1`17uj78Aa%Tr z){9|lxLW-sFu0EVF4zl(aJ>udW7zOK8}@=WR0!OJP{d7806;mR_;WdjM!Kg@eHNZP zOC%<6>stX^m}3=BmcAJ02UoLD$NY=bror_JlOv|2H2SMhiMqtiJ_Q79;y+6^by^90 zS%Tsb@!7b|FH0(x>mIv0Pv^$$vVmgtzsK+zuiD&3;I59j#y|>whOZcl`i6l(fnsI>qW2pv zBrIwuDn5RW{{6GTrIF6xgD2O2!kPFg|-aeeZsBva1#cUnL4`qj=n6boG0%3*f4clFeYyJRKy4 zqMgQn)^9uHe}f?af{;e_e*!A4p=lUJ%Vp=FY-N@iXKJ?+_#6XI9{OCG>e|Z9+_KLF zEAY}G)AJ`G%?2AO4CSSfzCW*z07DU>GWS56 z2L0>hKJ8hAEo((t94I>aB?SxOjX*qYr$08SnX5|xSwSL^PiS4@9jUMvGx0(ddbiU#FH%ckA#pkeL!zCmdA7kiBgH0nY!7zw7t3NpB*toy6G5q zX+QEfL;Pmxp)vxUpW||dn%9aJ8&ehJzoOgKrpaK&eKHR2WON*-RTJroug^{^gZZ3q zhs?dyY#>=xPUVcj7Z{*F4Xgi~Pgj>brOhDiT@CPVc@6+^$b@tTsd&8A8oOa6voW_S^q%p4|>CAUXH*^}NDoJhyWMpI=*s2RcE6hzq5ozGa&%frc8&_#vsqxp7;FZ?W34Q?r)Sz+Op%`sNm|^swvad|k!q(f!gavDiMW`9YF`yVGFQje${$F8ZY2xS|8nRz% zp>Q!J7&X;h*$e7=21%-H@Jc^Q(?&D4#-Q$Rp{pA6m$Bu2%3PXf2!O}`!#QQ5OMJ#7 z$Z6M3|DNtw*5^2hqY)`XCM+pJ+BAFHA%b{EiWo@|$X$*37y3Pi>-*xC>dSu>9>O)< zn!G+H_OZ5C)dahg!?CAtQgiE#ID|a2a_sgv?Bu$6K^WAE+l{pUD- z11=Y6bidgm{@9`dSD1}{;ex(zMt|!pz6&K@yj1P(NKJ9*&xjFazKff44ts-xZ(rE& zN^l-gQ9K9$gRlc30`~j3bjh4Oq+4IIewED5g!L^@MPElTU%gS!VR!FlRZ=M)4=rv-!$LGN<)A zxas@KNqb{bx-qiasHELF zwOwq!A|VQUa&F8GVrT(9_`i!?Vrb$3&4(E)I2ELq+3X+lVx~iWXp;*XLmsAG$z8n$ z6je8cSbZ@^<5O-f7{2!FL18|BNon90F(0eYO(P!ve~4#K&#eozz(kjy-zTnXYcPuh z4B`Rfp_cfCggzOMiGz%EiR*tQ_S(+(A{zAsIYk|1`-J= zI045dIr+d}+L{)D-sS*=ZaA8xhmNZG>=IXNb!R;i{JIAFuZPqG+o_jwFMqL20aNHv2jCWv$cFws`2ag`B*5AH73gB7iYL|JP4{fu^`&d% z@9_>he;Ti`TdE6h^zI-2jsGl zFE-#PqoI0eM)IQeq)ho;J4O zqDmT2bH#r%Y zN`Xxd5o?x=Kuxf#q#y3ZE8aNL9D&Pg?|3}2gb29u;Fu)keD@7}F~Mg6HRORYho2ig z1aAneFJMH*;P8Kr(A8C>^Xm=uwq6<$bTlWF-y{dfZ@bKUQq_oaut9$>%gflD&+d7$ zs5Dd}P4}E4y2+HS2L7(L_Mkd*RubVOVi*xuoYlU?RGt>vYy$S`8eQP{R2BzLK-X22 zy}f~yd$K1>#6Y#6wP0r8Bz#S~LRtPHva!QjPn`ildLwL~FpRkaX-QQgylZQPF7+H5 z8qSpE>Cqz@-gr-NlP61y_(?jZqZ@d@lC*`wXG-;H<9LmLK+#Zbi6~<#_jx z^|ha)7Cbgj!isM(0Ct5E<2h@gpS3lT16 zN3qq$>Lx0kLXktb#k$yhH{^NHH{iw7mVq;evb4-Lf>+Urj|aXcLcl!=cid36a1 zCT^b9mbh6!22KlGXluhNyVX<|>&dU_L~2dWvNTxJxl@qhnN6BlIEN%HaGF>VALY{C za(wLE`*s5b1$eF@rli%q1~|Cn4>h*i*O{SP7$`VcbZmT~p1LUWP|SM@UPMrBNlsWA ztff{|0aH|rDkTar<z2XZg`T}c?7v{CQiixszvN%meXPlj0#825dne6r2 zzy<^R3O5T}b8L2SY7-x=Sq{a+RS+9!>5i{ifwEFi$m#`4#pe0lf!u&y3Xk7m?NWsr zu8iES**LNBKOOCMJHkWR1D?ZZw&4nnRQiUaJ61%W$xSD#wzWR#D+27njhG@gQR?&a z?^daqZU=h#XGN4LP@a=GJfxY~n-u8hWX8gfbm>PPOxAhGcmatyj{E2`L4L8-o3Si}BK!VsCdK(ssT+l&-+u;kuK) zXXrnr46c(#{#b3vCk5cVg1E?qw-K(-b-U$p(75&v+jrWER#gU0;LNH1+;7DC(kAee z1(j&!hVFcGA8j&^lOpN=*gUAJ<34qC=}@at$%gY+7d8egq$4hH+H-a{v75m4hyMN< zMnpKkB44c4){An&UQ8@79lbQZg8hE!Cy%B24ZGSo+#%po5=%_gTirpSD~M>CH$=ob zkl613$Ks`g4Jx*YVs#51_VAfwhr^u%#~m4h&~Ze2gb_P9u+#!rRf&WeXSat9Z8-#! z=U@VmY*?$4^y4Z_K2|)Rz*UresIb_1@BaNe)S;azU-eP-g6TC}S9e>D`YPtR9lFmB z-&*{kIN6~SZrT3e$Mebe&b&B2N2Z&3SAyX6s^hy0<}9m$o)LYH z)^~k2UlF1d8q42O=U-~CY!ekF_^z)7NP7YmoCL3w`=vv#(&R2fCjwyL=ZM|!$^+km z(`#o=@Kw+gaQ>aJ`%I^0VJkQU47w@u=A-T#H3#RZEFZBC7tQt`@rkHOx zrys|HRkqLKQ}PivIMQJDqjZfEPR}a(okIqs*}zjd57;y{HC?_{0}LWQILN5;AAkEu zWs6O#fauZNarkDD`ytL-OxgUR*bYVk;jsEYkAB>>K6$o!>`ZFauy@NPp-<~$my}zl z=E9#ZngI*uTX~E2;?3tLg+R^~ANbdQ-2J~eiplLmly4GM`Jdsdo{*1@GP&t_yCZ{Y z`i=}!fwWXzBlx2A>PKefz$zvPhIq)4UMcXybntn-PPBQ)e*8jskziQ( zPbDx0z_o3odG}N+N|6)+-VCR@N5+bj^p(v5vK(>HgC5+LB3zRt*{QZNau8G#`4v(Z zC`Z~2LbWFMu~C3lc+)k6<~Sb5q)C4+$(!@6fS6)L!7&Ar{Eywp6GU^Yr)g08G`{Fa z2n@^SD@*)d14@=iPr=xC71N*638b_DQvxntbYjg|uc|Mm!+RblnE3x-DgqS&D3V+R z`Ky01A?(AW{0BVoMf{DJLB-Fvti(CRLD)7qN_`Wk zW1lPL>$y#PfqYT4i6TQ+6C)7;v;&(c5P-Yt58N4`fkCsm@LyOAsE7kJ!^Mp0&U?rBh+hxKV=n#{<0BC6-dw%nap?Vl1NilgB>&4=HZHO0J~Gn%Xu~;8&4*< zdc~IOa8m6%1AQ8&4{aZhBa>f^;=z6ijM^if%q!=}S%Lgw36CRMn-K`lW`5iE*}YR% zLSzu*zHy%#HK{)}rZDY{lcZ=#RHw?e``Q~aa8FVI;IxW=J2>-}FQI8$wRPZ(rg}J4Y zs8^br38~b`YBKDkvTcVNJ*Q{_rHG`7Y^$+W#)w57VyS3xt2+KGH*(_4XLqg1)9~*H z-vDV&hu@fyIveJ@e!%~drQlY4r#@}42u<`$n&?uhWGZX<=cMYvAWhAuj^i$YD!BiI2*LEWg^Q>CCqNh|N1Ng3EVA3923#Hk zYmBViXY8Rb??dlJmwkSvj+w8|*>VVPZd*zdu9 z11DfQ51GJ7Kf&ztF-8x>-u<8X35tKCIE2#DdAJe;wDIh`-sV~ja-`w}Lix5+!@Z;6 z#;w~iA5^4q6gzRA9dd)$!#X#d|+MO3jC6~y^|&aoa-=m-H6_~4Tof0OIRC;7n^0}32t1FG;+Jc zOwJ^!0rTN`qbT<8)zCpamAb=D%Z)4nNHURZ&a%u}2NPMs%-W_g>vL2mfk zM}3jE{6ww5@cNnU#4`c=wV%9aQHzU^nzKLaEnuQBPCv(+ektxL?bA7JS#9^D_0wRi zN{#%!*e8aKAfWVUkUfuc8iE--GaUV~^LOx%*`l9pA0YU&88wu67X2PhC&H0eX2Y8S z{NV6dC0oLv;=a<)suSZe3~iieo3bGint-+Y=M~tlFr=}OwoPt0V)Pogoz4K@4^&?5>urGcQT)pv9J zBfOLqDK7L$tG+2O!;xa=v@#N)8bhn)ps;S?xmd&8!wg>-u z4PKDI)(u3{ZIpUrp>2|yX@Y|KiL*Zw`XJlzfhFd-+<}M`pqnn`uGl0mNZS%J)siTtEdql{&xJHnRmDQuS_qB#iC+9X5 zrf*XPm_Y?{!f+=MD*&^OJpdPS*v5!b@jJ#$Cx({NdEs8o9;`rcZrO;P#DG2eaH2(z z4P`GW;kXVG^V}Uu?Cro4c?2_5WtFmN)9!XHz;j=3w+JVWDGLXzXglWY37kLMqu2-xrh zy6{{@VGVSDRH32xRVD)t;Ywi@h;Me}@E2`=Cse!sME6cc8X!!aab1jX__+O5%t?ED z7v8zq6tR*VXACmRJ^>&AzK*&?uvJJ~; zs8-RS1&l9t0A;DSE34E@SmHRj%peSW>6@)nUZ+GFd$m=ePN-L^Ysd(M^H>z@q-1Xp zBFm1CkB`u$CM8Axv>T*y^#1x)JJ~&M!3}iEJe5tcjLS6M4d15iGdl+dR1{h|y7@EV z{pF$}Hc1&7R1|RY!5v3I0a)+Dixd0KNPB<2R1 z7mxMqhbY9)D_vvYL6t-k1ulQ8H;moS>`oRlYJG&yjtf$9jQIyP6<-RKKjV=5b6grD z9Ua#w|25^Hvm~@){*Yt`hwc`?8~2mMXc31J%*e#v_X#@qaJVGLk+tK|rZ1p{k`LE~ z9iTB_@doT9lG4)CSs4k41T$J%+KmBunNG_V(Ecp|s6H?Odveq`@jFo2U`cN#>)mMd z_9hH@PgemYJ*t4_mBJ?A$`hC<%;xh}JL>6rk*ehP$31E(KtQ-GuPU!t)K|ivefWg? zj6P>Np5_#;-r>5mzW&n2X8Yt+3?YF^)iPNM7$qeotWxqngv3@#$6RA#?^55d@3FBA zkMAO4`*fY?P2Jh)@f(C%2G}37tL1cc;uK2kUUb`r%HIu?`YfbH?eKSbtBXT2+tVM;y@H9!MIgVQ_Jegw%6L&2Bq=3JTJ1 z^1+VMkDA1{3Bju~u#Q(5yz z$Y?6;73$MOzr8|SkQf}ZEXXQTm7<%*&-+F|u}R43t2h5MmOaOeHTfd#;W4333TiQ= z_NRgjIinG5Ct=z#-2n0w^TE38Z4|9u0@lJ6|Yty(GW07_+JL_cWi9VQD3%E^*) z-8(sqNDb?@kF`|j<&q#}1qOrt%{X1VPRtbpM?{)R; zSWQoWN3pcLTmqxwAv>#cH3t zjX}GG;oO67o5Hs66vUJ3_ILIovx5eTB(7gX333wZ#cA$=0t}iNBn9F(w7IkoWa#Vryv4E=hTQUO=4V24j%oqg132$#9T|Xn&+IJTUtK%= z6E+lSj^K(fa-8W3DP4D7YuF7cZr7b{_zGj8IJWTr@+@#&H9MFQKGmlQ75nMDocBTW ze#P`hMyvUFhsO2&Zuc(G${kt*MwvDZDr;k3fI5Jhb|5P_Vt6;MAy_q9Z|L^DN`Fwg_&iVcBaoyK-eaF4JGB``z&?a^- z!{Nla1tVv+m?9P8a#SYw`;rLJu04dkXAyR#vpKay;I7!Jf9iD0#<*7{0U;l;DW6bt zy(o84OYJby1%h5)%dcaTAyinlyTb)hKnK;7Azyk__3VXDJGF`im#b;dO>dE&_9%gb ztgA5H&%WuhhF>}nbm^EG*Am9P^&j9I@%H^%d@-HtUsf?kMi9UMg_p;JmWOftu*faL zhgPe6eXemc&r!8~1%}gnC5{^@CiWyXm7CieSDocWwF^XNS@x<@RmBJNRR2VMiXfp@ zNpN!EKz&gshVr}e%^fJ(V0}xn_1YZ0J1pT!91D54;6qosyBtEYXKt&2!HV33bPX2Q z#}gC}IWOKi0R+hU`jSm3IIO815?rC6i&I}XIg>y17G$(}M@QT4Tb7?Xd6PAP_iS(_ z`h?%;WpcJu13_6pP%kL1b$T|4Pdg-SylgabNqm4?0?_e~xp?jJ<;(ptl^@Zrr#ybm zG%dnHs~u03(zTp#&Hbv*pc_OQAZx&TsBSk~!Na7vyn5P&*Id7@*gP`0!jbIb;}cr8 z*?7WrfG%CSG%`6kWNoN}1ON7$WjJ^a2b|y)Q54ds9}`H==kQ6T?MdpcXi6lm$9@I*t&H0=TE3%^*18!N+w6#cG6N4$98n^ z%#1@`rFtJPV!>FItnBZDG@3#YCDSv0nXS+QaFQk{v*nP~;0;Dfw6dUTzK>NrmF5v8 zmHLtbS(pa;2YxPHw^Ce2|6o5L@<*)j<>aIH{Mm6?^Q%kVn~=v~Qe`#(Fq00h`mVFa z0G)(Q8L7?uQW8k}uwl5{UQ*P*DCiEfH6#Lkq0+sZm9`i9V)eJDC|!=+@^>*Z!!{WZ zB3~}T!q`EfOpa(bPH7N5>$e_s2j!`_QroTY;=Y>iT}>U(4U|(SE{W23jdlKPr#vt9 zhC-iA<4Iw}a%1}z-5X2m(4hytSlS=`n}=}3hpf!+Lo_jmeRNKT5}=R{NkTHSxyoo7 z5oeqgn$z==ZpIgu*j(b~ymT8~ruK{75zc0}xLlwKj?gC5xz@#wsXg{l-1k2rr6eRU zl)LbJ(>@*g$cRD6$%J6R++4NcS2Oy=Bd3_y(o)^)zqp`8W*oMl=)2;?(7>$O)kS>r zombIq=B?#R$?*Z5uZnasR8;8jG_MeIr~Ah|hrOxlKUse5b?CUXZ|@B^_Fx%xbf4jF z=xd-#07Z0CJir)fY~T3%a>%6gAhz*@<(EPmoGuzcSGUtNQ*UHJGjYR`%DW0${sC8c z7R-#?tCZUP9OL+)$=o0*LXxtp{M6lXmldzx$I9l{tI|2J+`P@TD-s61sE?c^L=?<; zG$5JEj4KW_9?q~3S}Tv#cF>-7m^~f(bzq%<@{j*P)-<(Cns=@AsqNCHBkp9m>#A_$ z*K6dftd@{&pJvEJAWMhP4F3-4KCGszW&#;Ex-iS(j7Bw%=~&pIKSvz6Sj7vd3a@)c z4j+__#c%7H)duQSi3_Wq)iX@zl0`LZ1d@qqSYAJzZ;hKdNN#j>k3$lE@zu>ZLGO33 z(ZolUxXO8<%lelVmK9@WaE_LF!tYpkHe??{Zch8S$hx0NE+%@=AFCEaLAhN~6hnv+ zJ4PE5Mpl)I(;MNqQm`up6$C{o*Aixyn5gB>Ac$|TXS{rBDBzf9mw4+po|^v!P5pE z0B&%%HLEs$O$2-n-Yvdg7*#Tqje=(KKSs0X&EtgZu$a^)Wi$?}h&j*h+1;&)hflw@ z*<}T*%-m*PoQf^IEk+b()EkvTCS+nG&X%U^v2AJ@5l%;3mX`u?ypc7&)vA=5o%qC) zh$7W_)>tH_LU-*9>ZrGPB?Mwm^Cfn0q~kP=MK>m zT6SmGKgL2$!VX!Lo5PN0IsJ#RV3N|#9DWU=-(J+uoVZ;nN2fl<+VuZwj*-1!+Hte0 zI+?!`KW@OP0D3bOC1t}W-xD@SEw4r(DoBVh4ch929UxLy&Bk5=fy=Hy2LOtdwT02- z0goYl4!MD6FxY-V4mvjSiXon&B9}|rZFPs}BL{yqi}Y^?@poujxyM@k1SFXRg4(%UqIn5Bpt-Z5#UhCOUt5U5UhmwyVY~s#(z@w%aPUcDf zizeM>Pknrh>HhVYLD%pQc~(1e{wxQ^66WS4xVBX%L!+r`c|ws4MpR<^h;GvS1_lN; z0Uhg2KPHQT1IzQYsn6BLncpRm-mdS@(yWp^X6scgO1jS;QA~Z>BL4hpVP< zGuTSdAuq~^mckhzok{lBs>3I{7<-UCGrQj&bL&fv=JcB(65Q_V|7k9Z; zMrB`~#fpAXE84FH3qO&{aNjjP@}6UP2_aj(z5^lbs{M!et#6YSJ9unXHC5V*0#9t7 zx;UC!sL^B9YggIM$WlYoVGFhzR7;xZ^z6uwa3Nv!m(yqWrwgD}Ha0V&IOxKeBDr-I z?qKmbJL3tu@G!L}tminAvMu(}uC102uz%C%#E1=j`ro0ypR`9t|s!n2l zC--wC5mqWfaG2jkCm;|uRW_07h|e%~QbM8b#V;qe9C5Lj-KYnA%QuJB9p@o29%9MQ z$S9yQPiWq;yCIVPnngeEc^n;uJ$Lek+JTjGyvYdVN%E2I9IpULO{3vE8))#TFPOdE z`rS=sT&Pimp_y6AR;JtPYvx_453;IMn>S~2|J3-($mv)X@HS*6X9OgtCDCt1;2p|1 zF|lu(1zGFe4(D#@x0JDah);OD4psov^2771?`r+Cc~!KO&TUN*j%Rc&_54eW5&NbD zn`Yl0UfS=+f)%G7WgZA{xm>V|;|q{M_?{D|BpR+X;}Zl#DGF#T4!EK|Jjq09Qghw3TZV5VuN5^QLTKDXjEKMcrn+RbKn+b0UT=FV)g`n$(#N&BidAe;yj{l5L{uxpw|HB=9gGm~=GT-4HH*<4#f0e` zq55&+wiro@hdbbp7Nbq1i6UFG3$i|}t^roUkpu6xHf5d6>kmmuS*4GFGI)|j&^|&( z{Yy>kck->{a%Pwva)k%nP-X8F#L1ty^8&<6d7-AD%enlX*Q2?%iHON}+v$!lWsnlY zC}L!E6i-dMV&Z@8ECtFib+N1`7u|8c@}fwxHp6*nbrcE)x1jztKgh4^&`&R+={S6` z)z-`lpzh~T%Au0vO;Jg=u())RzP$JWUGeQ2yY7+(;sEN+pl^d|q5TGo@L{CH+I z%-l+UaHd;TwtssJ4GOCRM&nFzg6lg6%0Wa(gSpLYDx`6x*+kD`k8V zhFCukgPzL-s5d7RJnelVe+zpI-rs)yoQuYv@fQKN*<1vN)l7hs=$q(RY*L-w&{lRr zrDXVF-SPgoD?6XB|02zQ6mG(eclJsf(O=cE{)(bC6V187aht7Q@5=Y>FIL%bUdew- z=nFPiA@v!s)Q$&nzkg563=-rdvuD(*$F^rZ=Q3M9 zH8Q5FrK^(mS<(YnVCNKMMDcB{uAVmT?lNuUT>+MrTJ!2dU!d@({gr`P-xcw@2>>p7Q z?iK-i=e?m-C;Lxck=>C7AR4b5KoqB$5NFq`pT`29W#l}tGb zj#^o5tG%If|A}UZN=yE)D)P|KWP3`M%PTw7&kyO0!X)lWn4g{O|HR`Y^qa*qPHg5; zamNSEjm8nX`)Xo5cIthUd127x;U65K)L@K;*N2ue# z@}hyr+|{MAMS1ZGCFDsJ&#_%!lr$#c#LU$!@bz7x%S>6+zjbJ9D6kJgPj(}5kmYi~ zn{9OiPtduoA3{Xkka$|hDI_AoY^-qjaxFeyLR$jce8M_{Y%y-azJza0&<<@*b@lbl zdhwXS_85cE!G3)mwB9N?e53Hk0i;#a2QMb60m1|zDjs3l{)C&afopL8t%(0VBwlbz zx%t293PkGtFUiriAK&2+0RZu4SfLW8-ZAjhswcv#1`_c?G-AWj*ZuL<5BTcpF;AI;6tvl-b%MMW3YFAbLA(~}+V3?M%~ zNBA}GNVgh8tvb6S7=U1a{wktbD*>GdA0IyM{+e5&UG1J)R56r(cXw+A053GeY_|zq z_{B>)@O;B{W6_NTWeG-jF|!86bE3r=NmCWDe<5)-HO04I`@j>fgiUhk`U$H2sD$p< zE~!%>PM;~IaD6&;fMlyB2%Vu6Q)*R&8w0$Dp^f~p)O-}m0$t8H#4^{tSY%(SD*=q5 z)Zb1sS27U04{~xmkKD3Wc)0fs%i5`I^RCD8uCu|{Sc6H{oj2Ck&^7Aa56{(!QA0c_ zxay7Ceq?{Oqg({bm%YUs9mQ+vz@BF+o>wpC-$?)TNyPN$hrY~WI)gZb`49LlJ{G}< z_x(;zs|<8o)m^QQU9Dz!Tc5Nqc3N*0>_!hbnlps#-?px@Z5{IYBER>m_bk%_@hNmK z!E{H@x`3Lxdb<6Trt`1kET!Y)<4Hvlcs~jJOx^m52-8c!MJ*fRS^>EhS50uod-q-Ene-XMRi}r!aH@Bngm5?^|-##8Mn0Toi7+N=vg? zU&Iq~6o}W>*5>NIWB;zOFzUrl0->Rd z@(j_p>4=p}IK#_}LcxL(a>nqYjsPRV&~P6Lq^@Vg#7I%le4;;eXcr3TI=ZH&?}rxI zY5iUm7BWc%GSg%rucseNT3!N^ym}wF1wfR^TH&)7e0y9fz^4reB{$j<0Mv{EZ@g1O zFpQQzkRelEfg*^rCZgD~c$0er1M3|cN^6)>F^=VWB($~N`DHCk?{ySA+!GR3dufBd z*V`yo>zx%6@&RIUpSR@dQO&jADq#I||E%xwvSX*ia5OTWbS^Ti!53JA!#7+wX)oE^ z3+n6Z1D{h!Qq(L$zd@_6Yu++ZOFeXN6JOXW|IHVak~6K`VJ5B%&gohvDLN5D&x*Ni zJM!egDUEv3cjdE-TAj=Ch?L}G*bxJ&UjcusZ)zHN2d|3!pZyY6vAObRfn{~=$YJv1 z4F1Os5_`N04RP5$rpvNIUo`E>qYcApzS!9Mqyj^a*Tkd!I2qo>7-NM|&%8 zE6&00H#9dN+CxkE6-{^XB`?WZbDAs76aetFGMe*?ivvI?B-fmItnxB0ZZF(N$S3jV z6-D1k9*67I!76MKk@Ku~cHmx|!?A7>Kp+^FHxift!+7v_c%j3hDp_+rX)lY3nOVii$SFpWzvlrKY?=4@ zPZc%{q0FmiN^3e@1xScuH>tdKB%)YbqC;N0V(Y3ln=kSj8ceBqLlJvf21XzK=NP%8 zj6FtnNSflQ+1`sWQ=|felh~XrWM{viwdC=3NDXL8xn1T(b4Re`<+EfI6uNNlILaOT zGifC^mg+bPu4K00kD_c4e88=ongo9PE-GsW-4z?&EWSp6|1Mh^j-^1M2RXFv^rgJA z#y3QvBXulh^f|T}O0dIgBqB1me@`g>%*Xn-U{j$K{^tt3vcWa4JaN57DHfN55OYOm zzMZT4kaB+OG?71g;-jxBWL8^Zq0!a3x~i0%ZZ#y0!>32c1F(L;{KEx?TM$F>?NDHj zHii{FHv?Ca|AFiP!{V3`7PJ9Jol+ai+y88L?7$VATi9|QN8v7$O>wcM`CT6i5P#ms=q{h%CxSV++g`e4N z)vD8VWdfpZ6&Uf^z8D(i>inTLP}qY$D9_@b+MrA&EG3ZkwDykSbiPgmVSzcdX4wAN z4(N(q{xWqzx{!|R0*~5n7ejK#2DPaxPLEjB)gHZD^hNhT+2?cPGnUbyQihk(Bs5L0 ztOcmY_1=dB5#cWRicaPd*mqhHflme@3WJ=r?ZGOjr?u>2E_}q&?DSr{Y@IO-C{lvC zVnMR=Cg*u(4Jw#L7gvnY;|d+c{Z+50hZE)&6;i9X=NIp>la=!xUR(svUd7bnDH+Y9 zy6k+1H<-htF0v*ZkYYyhJ~{Zdw+E{%P)#vP%Bef%>M|0(<)v*+9oF)#> z7s0iiz<3OyFW)8C&Nry!-Q!#A%r*a8&t4jzgNwA=gEWtUZ#j%;^`D|#J zO1A^$ZcR%0OAj9ArFS$pXR!vyG#kflte+G16x>+3#EUAJT$Rn8KiTm#>)=NRr58WH zvR_uXBg2;QLgxON=x^F*V=C?+dlY2I5bXPH)h+OFOw7iocpYtZ^#cYL#-EE)d2725 zR>sGlze9cxryj!L6W9bBLKAhC%vOEr^8k!&a(Y}vVX|jl2ZF0*PXHW|V1E^MNsL)a zjM=+x7^q~7%6|%*?vRWo>g4`br=0%Ow`jTgb)c-)O#O5rrHLH7=VdW3G^dxTz$2~> zyZ6S=t`SV<$!7joQU2pF^MKr&&A~Afxw7$aR7j5fK+#<7F-TzhrTeC&$h234zBm=?ye4U8b5xMTPfp z)aMea8=06)_r*DhOgD-%&Giho>E05nm-Jj&W<>_HN$L%H+3?_ooxS9z$g%0!LPpEA zJB;;RcXM7(RbXXZI|efJm&yAdXTc;1t7Gzd13V0s;^k%_{Z@q=#P}jBmoxZ5mcCyp5(<0;k`{NL`_)& z33FiiCt$Tc#2Qtcx4+n}nfysbV{Wk<)#AKtU!R8&scc=pU$O8%JnKUT7HmCdKEeY} zgfkhwpW|N1TEdFt|E}3X?WKyJY;q2Q(G67UHEz3wA0y5vhrvkMSAwCzbH#kMH&Cm_ zFPG%R#BHy#^%FyE8E3=!)YLjYq?5=!>tDbbruYwvyKFL7|nCFQZ3RDy`kQvIIQhZABBw zsZG=sAk&vcuJf%XuN2Lo0%5_F5KVhfIHRC}Cb`m9XSp(wGXS;I{`iChy0xgeT2Tt1 z{v`~%NeW&Fsu`^R@gwu~RP0wZOp5#(L!L8uKM=>=LO*)NP59sjfrK5R96T|0IWdrq)K{1&s!Z?P~P zXYub_2_)?suJb=?Kx5w8r8ZSQ#`E(Z!MnNp$<}9M77!wx-vAcB-a`xSU|@g*>42rs zH~Zkzy}uO6+<;JRUwZm|bA%SS&+(GUXn6hwU#J#b!@zEX*uGk_WP^AE548~z1eJDGg^TZx~GG7p?<7%p~p^&qX({Zy_@?4 zA(h^3auaX?RtzG7Gtt*41X?ndAB1(Igpu&0<9Yu99t~NOf}NJ-MmhDkvonxFuAEoK z5JgB#H2xct(NK*&y`Imf+Z3mHRdHvnaX5^3j;Uw_6<;FLW6!mM@+7xiIFI?1q5yb>=`_iXB!`im_A4=TdFOzXt*Q zO^d+#NdJiA!+nJtP~pA=W8*2-{Rqv-!l9x`_;AFv{_wt2F-!sdqi-4%S+jO)(s8#p zK7lCQd!<9YfpRvsW$~LjvAu-gW1gOK?ynFZ+s_Nxj;nq1`IZ;t=Zsv;l9;#BHWh8k zHX)BIO496};575V&TiH_9jm!arz59m1w_O_oB ztydk^m|y(*YZf!q#nbB~FMBk!mH?G1oI$`+;KA&sSJ+#oC-9t-sj*{}0 zhXO<4!2Zq-LEn`X)|v72k=3mF&Ug>$oSfc4C()Vy=#=Clb7j7ea=OXMDhd`BuSN#f zK$4uhMSCssGKrXDlws{>>SOak;Lp*hBEF&G;{HQJ`bCi^u!(cC-m#ccjk>_Tgt~y< z5<}&s>N|%vKJ`$cyGbN{A~k@}d31uVS2sHxY*g}GFaS%_3xcwsF)0^i+0 zXi*>zH|2v-8U@;;{M4SJjV}k78Kc5CFo&X#77SOYTU7+KoSb@=`@H%xq1#+Aou$Rp z3HLJF90|vPJ3l)Wa^gF{9QU>~et5tD3K&4v)>P2DyGxD}MbaO(?j;jAU>WP$e5MK(74Bwc z9fE+ku{J}3Nfy;SFJcg4#RK`U&ovQ%8H5;RVU7jjsSY_0cwAU*9gqt8PN#go5N*IH z@nAyE)cEw;gY$8GMN7R$BsL`1ZmQ|3ND-_r#Jh07rE`}rX9aA+6We3G2C?m=|9XJqeLvd$(^4?)+y3#%O)e{{4BbKhpi8}%~rv_GsXSQ6uFcCfPK z49IaC)PbK%CwID#T#D~AVjXfo5jr@7-eRGPXsJJ*V_WDpD``NWz!D4I=JxXz zhGGejc&%UIx%vildd&uz1A%EhkK$kEyiJ3kw!TD1H1kL*a5qZRNt14UWVy>SAEU_t z3^N5B)h#Iq=o1JLEH_h8>B}8#gTIQGwBUg}QPE_SZ;ijyP|EB zu*dN(D}0hTrhLr4oY%c0hQ5+zW4P&>o`cn*@qgYQSOr_}|Mk~m?sPXtc5hFQ>#ppq zy^yN+2f9ullvwDgI~r3P@(1p(D>Gl6kTocW+{mKmgzK<+pw8(a_PJ2S#LcaTbDTmb zQ8YEbxSVGuFJW3PJ*sCIAzhjAZH@LnCm6aghY5dk%NZjXbD1yXl8Pc~V|i$oYE{x*b51*I)^;x>hmOY=Rf!=5qor%lQ@{yI@_2hCBdPtg zLHoP^q{gGX3=}Y37UEug*NmAK9)@l;6L6CbglMF{Pq2e4-+IriuKR~iT95S^&5y}s z!qR=zl5K&-p9c26wW-nSFt(9qD#B!wr03<4ziHrOOF#W&Te|`Hn8+J9#XqmiVP^O| z?Ak>U$8Tr%V?Z%Yl88}Sh|3b9+LY_qnZw~R6X`354Vis(h#$Id`%;N~)Srn5&fZ@g8)fog26$Kh~O^|+e31lObgz7s#4 z{P48f`q&{cYcvCQQ;C$O6``hWZKa;11-z3}@yw}!D+)p;y8B|CYWD6!Ym9xUfQ8@e zy}6BXJQ8qk#oHOT-e?!Vh+~E$>nds%&E4bp)|Uf@XF{BaLe~ni30c+$hioW`(bJvj z^y`15>W)~<^fWsDi$Z`E?2{4zqX<7(DVZr%di_X{o+@yLl)nd#pW+@H!?wCHqy7CX z-InBH+|-K;a{VlmBKwGV=5g? z#-b*#t~Q(0KGZ>N%>TUQJXcz(WFZ)`v+uN@v*sh#EC%{qX=!-Z9bj*+EYxJbM^lX< z6;Pjv{VtTm%2?4eZbJFwEfV#A5J;Qt`Y11G0r>5=)jdNTKmX_UeOarxfd_Zkf2BEZ#Pt}baF#bSUCXmR(6ea z1KnEMw7i}vw0(>>U6Xd$9JQ)tuN89G_bz7$97*F_ucH7me>%FM%HE3rgGnZ#vn`&O z>3gPZ-tcv+7m5V|H{T6d=9>q@pjr(Q_UkN!sOij&K*3){RJ?fN>YLHmv2(8{QqXlY z9VnFBMg{?Wz_g>P2_DhIvz3q?v!m~qnq@v_8;Qw}tgXz>KEg_UXm!R-yl{Lz#XRpG z2a*|@wv=ggt&2TxH2KH{2;?EG{ABY)L0Bdctl1VlwVQoM6=Cd(PY{gpvn+YEcKpoh zK%Jjf&sSULLFJOMvH>amX_i3pl(y_2BHKsoFxl;9=(gdkdqdus83?%-JAUsjn@@p& zJ|Rz2T%=@g!?eCAZND3}KHus>A9W*jNuc@k=4SxxcBDUCj$H}C=x*M4m6H>O7sFU* z7d}uY>0arF&sv|XU8~Xjv1U7L-`Ah={mT%IgzL)O7xmReyH8um6aZ(3)J&>0fuiqs z6k6dR1w2fy0v&9Bqm)C~}2Ou!>t;igoJ%rK8uAsu6xD{0-^ z=~1nDS{G-hFOqJj`{<^G{~5iXZQ7yC@%I!$E*X%}sd@YSA|NGr4%`iPv4zfEq_S+5 z+9$jSj-QdKJVzgMJ*91NACVZwkFjFSNRtWHV*? zYzvQw03a{wnU9a5%VBz7@Fc{nt8k}%$hR?bBi|^mqv(Yi@Ks8w_f)qd`$gBfXMrw5 zh6ktCmye^|(+cK}jZgIJ?S+(y5Rr<(t6EPVK1}lparecujHFHcWw@PgsOOkWXvwXv zD~Uog#2ZSM4b0r5D=hgIiu7q>`P8WC#8@VGh1HxK2K-QNGw|L4G{!x@XzaN9oUW;_ zq%rx8at-8pU?04gBJ&!@_JZyA> z9!kF51U@{~3|hZRF*zq=(^uo2csZW4$D${m*Ssi~5j9O=&vaR!_>Ui^#gPTsJ`kLz zgm3>z|DWLjtSJ%?;^#`u1{ zK$o?>k@ZkwLq~37@t0*=_I3OY*zVQ_R7P)ad~{d1Q5qFp+0r5c{k;$Q=l?(ES;inCs;$X^|KixAbAML3EnE87_D#AO*1~E$nMCdI z=(AE{HcwCfE&~hV;~`nFP#0)j#!YG`E=qj~gv>ujyjDq-QPw1X_92JOI ziszkfvs?5cEU@mmiYlRVvw1h7Ya!%xT!fL}g`Bp>9emThuh_--58j!zVh;1o(P$??Vb+gdy7`!AUHaB&(QS#pYO6OM|02!| zCOznom9@?7i)vKXDZJN12ptI_k>E0j5@YEO0V+FwT~7N}bEBHBzCPaBJJs0Gsb)~U z&ng`KYnl&gD$Q9dTTMYt7dbjquT$XRJ89o-GL1*12TQl?|Dn7D5-3nBVq%!_%7CO- z6OenQN#uMW9^+VK=3f4Z^km|7dZC{O#rga47GZV%KXJ3TYab97DS9&CghGGj+KDoJ zFwe?#SE>@KkT9mnf&D0Uu5t3cRWnC3x z#=E5@tF@c&Td^9P6hL|UWzx+-uZjRQ>1=l}@x9W5naxMzQE3zGgw8> z5yg%?-^5r6(Z^p*?W(Jyi}NToWOu#&NINMZl&%>$e69IMSPSjnL&@;w4J>E#xdOnE zc)&pKj~s*c>0}Vb;P&tB#Qw(p=J?SIrP>VNVS;E9ZuXK{X=eg$=iODPhL`7 ziVl7566W-K7BRbnp=!$q{lcau_MpW0c>NPE>uY4!B__r3q+k`4J6OrvM0m|D3(%5) z)PWbec@5=F(h{lpdE`#{WgnhbLLVSyfL260YaYz~{!Z;CIT;Km@H;vwI~%r!N!>W= zW-hJr86HtrhCb`SWWDB=uoj#)6kqOz)C~SDca+S`hEpx(#|Q?lOr1qf9AW~Ah$g*n zpXxse?VNG#pnF7+Gpt|>msbO8)y@u2+)(m2TeS6*{#2u_Snubep@S-MaS0yFatKh^ zA;G--gb<;&v3t(USZ%Gu^objjXVFUm%BT{8HATH1ZnmV#qD+CUMFVjK3hH-uh2xwn z+>d7dG$u6MEqb#THT|WRuQ4x9UJ%NSW3PW7-{N|1ONNz9I=*w+ju<6Af_preRhP~G z>FD^~z&r~gcC@plK2uKpp`mG%{QMkzR5^+R7gOubr&k;P(W(Og75|Y#ki(zO9@cVy}LcO z_+-{fHc%_kvVMqRc+9yx46Q`?2Oz0ECBP88ZKEY3j>Nc4f+;S(K<{d6RtqQEBFj+j z27y=T3dxlrqd68-5*}SzHX!7Ybv|n`t{JD-#zht!O$>C`8w0xkN|B?A2E+1%YS zan`D(@_@UdJjIi%6Fq{Txc0c1f79n8m0@kMWlX-atk zQmgu+N!8Vf>8x2^L}?WJCtJ&nNGER}MfP zTM`p_A2lQ?D4XQVq@OwVGHj zo02b5R_3w+VLuao6=Qw#p-Xl16u#1gConf91vL)zS+2fjM*)+CQ^2f!Pi!3#3fSDG zUXFq&Iqm2#`(2D|w{N`vl&tVUpJWKctKfE23}!w>!1Sj(ShO#x2YHw46pVD9+jUUc zn7!Ngfcv@S#@}1gYvjrx++9B1-S|=p8dMz%1yYiPAxdH` z3J``M_ErNJ2r#DD8VIBOtU=5kI0!S7q#;12f+~nW|*j+|W`J#*YD%|L=o& zzTG&x)0H=>(N0$vg$mWU)2yKNq9o#mkpHWKh&KB7W^`ui4hZ!9~4&(Ku^1GbIA+xsEmi)w7)BZGG0 zneZ>#r-OhA;MP#(Nx+Oc&l#d#_dQwd@3&zwY8<5-Boe@m2XnLiVab`kq}E=kL=m>}NI=F@`Om_Jpq#NMo9oJm? zs`9$9&_&$NlNK_^u;BI<2gi-+VW1caU%!0eHc3a=SFSaN(lPFWdWxs-4^%xx)*L?YX1(Hyyl5CsVT43XP35e6uV-ZHF@;8s)S*p<%V`i6$| z{;ACjYN7*?mIU1UT(brGAff!X=#^X9evJx5np}qeS%klx&)d7|PB1z1yvOZpT{KY=o zG$*D>z^bgxsf0;mKj=9@D&PB%>wALpUASU|H8AlqtztDPEA<^2*0b~xAly3b>rs6o zKKRa)s=9e;T^*Lh^gcpQmlDk+xGg6j!GcV%)1A?xfKo-%;bd4_ z8Ub!i40FG~cuK%y(3WfCh1vjqbHMptz`vN z31HPqQC5|Qkgu?Ui)K?tR!&vW#Za-w z7RNG#;n}ZAHCZnG*4ERPUy3R%z2Ll%5nEv(xq@6$7-Ouej~mifz4HV<33J!Q(9f_rh|&r8#iX8(FR)w!4#oMF@Am{?jv6r5C2*g*bb`eM#rw z-qka})x+AU1$Jc^PzYFbKOtg9Ygg}o56eY{_1wmaDra_Y-7sMe&M%FSv|M$zHB_&Z z@B2wN@x?;9)vTJqhb@lP+X#3jX0gboc=_S=RV>Z2(dD6z_HWE;5kJX-x-vInRs zE5$3ARpa;HJ|B4?L87%HL>k5jb_ZOZ_gN*2>zY5wkIh)r@sT7P{T^-2rGxjQLO%1# zVqGHkGZ(9QpDYdQvm<{Q9jB(Gd2YrB_ChBy?X5*#hyh;g#_BNeD&67E>I%@`(lar6 zwvK@j!ob72(UFl7xajMd)*N*#W=~n)^r{=A?I?F&-~Ff(#Py4fZ5IkuZIFf&qJYqS zgvu9%g36TA|LQIjqyq49C}R6F(ySz{ZHMUT!S;+01*r7#NUl!J{7s@KP50o<8%Ja7 z-oW2c;1J%>(?jvn(mxF$y?7D~m3vbVpumnCqIL0X;xwBb{Yr=BXp4TX2CHavrNpk1(nmxv-Q;L7=FLxF537MjEd_Kl zBDCTZ{a5%Rs|U(9R-|FknADk8Ww$tfE9?wc_uq{QZNw~Gk^&D4^z`x8lHt^D7qvh) zC%92f41ECnyWzGf+H@Rkc8L6)J*@C@-piYu*SzXrjeNWBQ+`d0SYtp%NDe`oiM7r+ z;A7nONmhGT$rU<{e@s&I2;s_UuGFGsW1v@Xs(LmzH9ewmoqmMeYkRw~)elQ6J^bx5 z`CJFQy1e8Aif-FmqS-mkY1OTnoFqBjj$`Zzw6Ws|hYyKbHL0J--^9puE_KqA%l@<% z9ycZJC8IMfORnqkAuKkK&Gz?cQ8{hWmm@K60-l*U-7aTVV=B`22iM*~cZ9Kc5nA@d z798Bglg0#ksAf;->t}z|BpAC4nJLf!(H$M#UL@SPD7fPZ>?C;*+s<7m^20*zKojo$ zSi`M8)2dk|ETks2={nNAWWRhpz-wZ-FCt9q!-&Q{m4TI>jrG^TDz3#WDq1f5_#*2GN6r2kJQUK76mjZ(Rcl{vgR{?yWs-4gn4csVJCXPKX>_e@-3B|KhfmS;sJzt z{I_Ar)M|^}>UiEQ=c&GSKHbwIC^Lu7z3*5D;pg|58#C;EifrE_gMZ9mM`KSGG z>29l*o4CYcUR??Z5`5KIp??L-6S)vlrgO5asqS2PLnE^V12k~8rKN#Q_~>UNunDt| z*k!g3WN$3Zzu4l2Ek zC3lQQWsS7XI>?NhF7y|qFbU=7Q?7g}gAA|LRNXt?U}n&X$Z|O2&CRMxv=8;Oo#FGK zsG8MM0BuxZqE)pbg>(b-cmoT6a~8~9QJ;=;BJZQ)dD5q{QZ)lT3iM!+KV~gC`%PST z&hIoHN*F+2~{ucx+p`%tLi;+&dSM)c~&zm z`p`(AQJFLsoe(8i@MoJIbfV}B<9Sl&wx+K2kxWqI!)PY!S0BTPZz&}TY6FZpoW;9q zc-@`WUvNN6;@vXd3UxxjXG?PD%HQ5=s_9k7)B^J1onBSs2Wm1~y zM1Af=-mK3sg|N{j3nva;*3U30P^kqZ8BEngbUBi}|8BocF{bgu7K9zM`X~GrvXdcG zn{%_1vp;TL^p3GOE17Ik>HXKo@z$7ri)A2YkzF$KA9_j0;!tr2lcHf}l1Fm+_Uk+_ z!HS#tPQ~31*MIqfrN(xvkcxZb95+w4GkAGuFp*(O_(iQ&R?=Zp@26xAEfEV?a%uP1lhMW^&BrH0S4I-7QN-ejR~qi~A2)4D<#sfie52hJ7$ zE;o^IVkxq;-+0Ux3#{Wl#+&q`Lr0MOv*mrz{Q67bYTB%^E|9dX{dAFD{9zzH0?OxrD zwZj3mZ&4^XBWPFC!c5hh*&kodJZqD1U{9(;`+HN3CERu*KgHZ@wwAyo1^d+19=`A~m@Y0_I<-C!bTpmkT2y_Q za+Q&p@R_W$f43a2fpsIqRgFT}TY(tT%5jdT!AO%tFshJJ5))lB9V+eED?rxSA?h1h zj5$*DC-TylJ8=``+1ZZH^BQ!0zt4$0Rbg=3m?MA5s6=0i>3;Az<7wbwOXP%$M@8jmu z6b5> z$3rumnH?7s$6fo-j0cQ9_>EDug$zLw{%^j^Lm>jrVDXf=SOp^d(zA^c$XioaBY zWYDQOyGh%KgI(J6wfuV6*ow_O2*z|pCrfjs?^(pll zB!o(YpzkW9?^8v;e1T5395g zS$f2ei#=+Cnb}uCHXj#bd@6d!X#?oMHSWMFMFiSU^vou6r2yK@oMqP?rY{`+#RY4^ zKuFs)qL)g~M2?;g7mW6v91;Pt6sCSL_VU?at%MX!#;p1rW#L3Fws_^*>n=um|CwcM zU;ZXn*8C?~=T#-AnS~lh6bfPI17oeQM(!Sei^EKvg%}+u9}d&|4{YR59Qt)5H(7`O zU0hMtRb%y-3#v!5c+yiIjN>kp#)BYzeL4#??^@a;;yo4%AF!=YFGG1eCE@(`?e+KY zl&j?yu>`i3A3LeFV3TwqWj^I35?-@X{%6Dsy6bWNC1NeWrgq(2 zKGD*h%DX<4wW7^HxW1C8i^S|!9cg(ju7wmDIb-$T&OGw`nZk)YDOlbq!r#Q*@eV!E zyu5Iiy-9=FX`*gTkJ-{S3o^`H=UaxSCV55!yh3i*xWw70sn<%UJlQ!bR|#-Fo>

z?J+a?n9s{)7UWzj!a!c7)^wS?YDl))78p}u$fq&+{ce`p6i4_Eh!ilrKZ-uX#ml&x z%R$pT-A{82df8rHgb21k60GXB`myXpi^?QZ36R}17Hp7l`&syESHo>`Agnfh8A_hp zOSbYAR!p3njBszG^;p>s`&I-}1u-x%yb-j4wqX6CEV|AwXE#d1VR#or={tXBByvdH zoSND|2{nU|uYj1?s(Vi5i3>LA`ro^2Q$d8&GMhL-e$@v_aG3(bMvqxt?~-o%>%b{v z(%v-9LOMXPhjpc9GKR0V8c9o672zBtao(4k*xU}iayuwbku)sK)Z_xl7|J(hetm4s zacl@s?zDE$8Eon4%44CP`Q~V9T>Vpp8nRb*rle`+OfTZ!A{T@i?)S&wnnm7EUosjJ)$Z(W_B-XZXh66@xe- zy~3h4F{ejt27=Qh8G#yH$Kuz=GIiS3g#+S^l!X{IVB{++3DZ6DOzH_-8qCFNcUd6qGP8U=@j9|+zPFzHL1 zd>5d&zYRNnkc^SHMSt9pjKPTl_j+Nuk~JUeTU!w&rJ2=K(LE0Cj_!wGbGfn7mvL=4 zblu51oN&G0>m0Psr+@a6PC94L+Mm3yh0QCM?m}0xcW12M&)IY^o$&z`)~%re!o8tr z$QNz2J}uGJdqTWa<@d!N^@V2%d)D!hA<+lKcjbMFC)Ot>*I`AOrZ(zqiRc6ORYmWxirnI$E zv^q?06!w#%O6*xA95pu4Ff@+?43q{~*T*vnC0wiKUVP^+{P=ZDU|dO{(!vySUHo;! zF#%aa4OQC^9Car!nX_jM2-UfL?I69AUEggn6D0Y&P+FMpuO7cIdj?~S zlPcLv^M2atf$$TFkyxUp#OKGIGauMT z#C2$t-5O}r2g@Kz{P+0$FX67E*#U^^A0V6jVoI)+n_oPl+v9kh;-Q3~V-*!9_R+vt zrYG3OhyBPFd-P$el1CB;z>q}A5e7@Ns67Ia<%>W>kt}c(MD=D@d7n9aoonf*Wi*kX z)@@bKc_65&wJNE?2SI-2XvU$*l2fu{H3bkR8H4K*ceX|}LI!?j#s#SYs7!ADNw+Av ze+~*PM4qy4TXg&=M5?#haoy$a2@LH~Kf;u8H%k3i{Tmab9;ih!20{&OLr0*Y@MFZ$ z^THZ%oQqrE*T^Q*)~b$b37u2m82I<*4@(xyNlo|)7ZdyhOaTEo6AXYb#@*9EEN!&9 zBJTZIVu6g#{Gky&8m-OX%}O=)(FHq3|KqHTlNOh9KMa;!GOWn;nG>V=^Cvx(R1p!4 zNA<5~fgL~TOQh|xcB6_mM(RJAf}{QBA$i~aYweC9+T3tkEbN#fP$HqLQw0pkoL5Rq zfoe8zC2|)^(m{Vu!|l}Zj!N7?k+$Suc=JE;4dIjyTI;l?Y9N6))gP&ZUxKaH*+{s3 zdf3AJbHIWl+&8tc29&iNKje^Amy`K-LV>$!bc+;cGB7TyGd@asG*TsZ!Z(gB9?nQc zp5KJ1&hxnq2B;M`mVW+Udv6{O_4@vg zD~C>tbSf!pr_iF(LS#)P$yUVJha_9bGSd_;w*ZsQhYkgkN>$FtuRjsLA9 zzX)%Gj7`o!MHc_{aGkWh!2RbIRv)Vki!xXM#?gGTg^xGlP}f3MCIfQ(KjO$=nKQJM zBBM--36keL4H{b@-T(3?PFc2o@T5I-crx9U@|B)(%3gbx^@@hN*o%M3(LdR5h8`ka zT^pIce|!_Cuxd0alr=LRc~>hj&UpdBawD^Y+baGchW}u{b>+FV&75}asqHhnjYjQe z^AsN#myVL!b+ncMU!#GfX)#V3^zB`jtAAYj%;+)xPl4RfBca!<5ttz3gk4N;OR+&_ zUv@EGtQ;9OkS+f&F}cVLK^Pp#_9qCJQJ=3P>Z*jyH}MSzd}L>Qcr%#p(&>pcIlOCT zrs(B=qc{JUN*hvLsUHrcJ%s4jNS+D|CFUDdAAr6XPChyrDtBILOLFUf!_ z`F>E|LKGWEs|tI-anOAt_&)C>Unf-^XZm_?B@gXgxu%4n1h~`p-yVbOR}T?1pdwVU zqtTqx2d8P;5LB`e8fqV*(WGc;qMi_-RB!?ZPj;|LaLa(Znpa1KGO=vOgaR5dOEHTg7>}@S#zLqqrq(y{f|- zQeAVdDmA2;#Ukd2&%xmPn`4t-KYr{Jr+KB^o@Yed$A5(tCo%Zi->d%V{Zr`^k2fE# z@jt73D<$`AexrcRs|2N2GKGbOqf0B797SSOU&SlUlt!0C1#Dn%84^8HjcQPxInd{L z?7GU9EMt@ek3aR8u}`D(M0)D(5_$Rpa~yl3cEg_TnFMB=AR;?CPxxggakf`G5;n)1 zwsVvB!_rm1P_FtLA6q#G&+B)MZ8jDnB zPpG<&p`we_^4LtnkL?STRT|yhqm7@h#DMSyYc;bRG8LF1Qsqw|GQo;5_P zbI2{~)vH%y*4u27+V2nCGGozfZQ*aSepGa^+g4%mD>lnn-1%el`%sfOcxd+mC3LH^ z^HzT2(pim)mxo`{uRG=D`4I_C9FI?&c)OnI{T~L3!Z+EsCK+)JpL|yntHNTS*b}pk zcVd%Y0q?VPBe}4NF$-TJ2zbUNf$hul0`(BkG96cd4bsuJ44N!DeCSY2rhIOs`}wrA z1^=A&!eU=j_sN|Pyw=lw$`Tz;bQaX_iYae>`}Qs{VT`DrXv4^C4&6_gtb+RJr@S^c zahWzwEZ0>c*p8&-ew>$X>*#3d*xRXAx~Slld0eNZS%&7UX!InDCeh`$0Xuz}KsfJ} zQt$74#(xKP`?lN66JKR@6qN`_$57`*bl2FX_hGw@%kizPt*)f?iGSK8X`5Y56tL{G z*Ve9+%Q3{v53ywl(DXu7Y#!nFZuw)qUeO(IXkHJDS5OW;BrGLW#7lkaqm)S8&5t~f z>6HBC5*Oo>S?SF}9T+VG10GV(+nukcTed z*4nL!$r2v7^FCTo^HY!T@EErd)OuyI#;j2}d6X)Nu;2fxs+Pgz)VV{PJux0znQ z%Tj#u8c>R8oyC`y2bM77$O14` z5-+(Xo!kF&V$vPI9oaNot&Iq_`%W|Vt#Nuqbj5BVv9E_kOuwz@)EVx#6Xyd(`O@i+ zIVSeRmpw@D*H&Ca!A>yM_M?)7&iKbgMDRdkW!L!CJ2&oPO3GUsU#DSS$alClBKulv zY<1@!y09hdSr$+ARZmY@WdFzqKXH|mX(@Mn2;FvBqiJ_Ow=k{KEH5Lw;^px)ti1l@ zm^HWIz1=&QkE|(>m6a7kffTPgv9#N>>YVRVZQgW*)){=urYF0X+1kowzoo!Gb-ix?kDGc9@WOqp%Nf3^z|@RCh` zAIMYnA3P{7F5X*w@6g$<@#j&J-=%z3?ls{YLw8B!7~XL3tWZQ32WA{~OqucrqQD`ZJ!W?~c6VLQ$Yxj|=k($;?aFK!%D?N=?TvqL4;hrGsjv5^ z+8S?abaszVVvV(X#JaD7RWFlM+9Ac{ptKwHZEU9M$L4l9huPPo$}zWZ9p~nHoQ!*` ziI#|c+&xwuhGx4QLfkFK&{D=1?KW1}7c?Kg`HA56Cl-A~tX`J!z4iCr&aSQxWCfx0 znM{5olHPbXNeoRNw9hZ2dM_7^4+N=ypKJz!ufn1eMWG`5E?wA+1}o3_|&(k2)BlI5;@SVvh+err*S!D{$7Mima`D z2EqpfRV@`9A7YOP9zRpokJ!#u0`4t0A*bf~3k{tU-wE8iS58zvA&!-+gs5Oo$o^(U z5&I4Y3&81*gFPiBXEVuptc^^Bs@7AwE#NeD~PMiUawI7F1&9AF0X z8A9+M{17VAfe|gg(OVCM1N(mATQ8xBU^&%n5AcE#Z4%dgJZiIMF*<2fb5ECW+SsviAxSqA4GKNyzq zzh7=#;=-(Xm(XH;*pT!5MvKlq zeG>f{9E_&G_9nQ1Y#i}+>Q0z89af$GkGl61Kuc0=EVeMG$HW{J&SDkRL_cN!^iJws~c%~!W&=Mu%!C04i)AIu(8F5>( z9GW#>xDQ?Ic;s=h*EXFY5;o&ol>+al;B%TU8X2}Vixn8!?_xf3$c=V=={F}(X~%O5 zL|QrI2*U}>dY>20@|V6Ux2pql?U|VCp8lBn=L};Qe8lDvD?vfG{HmR&RPOq;gW=)) z${$-e2NfYqVHn4HRsm7ZL1Rvvr0VpD@&hAB4dXJ?4@)}i>9-KhtMY=gJ`ZP2QmEF| z70WgJTR1B=Fh)e^A)GYlTNUH$cPp6*s!^jUsi{7QeW7iUIbkPTZ=Cx5!=@Ki{=^+C zufRI#cAmy;U6JDB`s#mUOrv7o%ss(>e-X!@-zMaDv8-Qr6isBrOSCN+>5{z(_ktB( z2FAY%iTe2@ZT>|U>HOo4t<$fhHf$(=F!G^na8W@QgrSMkpJ*YkAYYX`g^E@FWw+L%i);u6 z8s@KQYMw{zFxH_(GcNS6na?h_KeNj}zjOi0PJ!_(m0s%P1EzNoK~0z@j+Arg%=;=D z-P3Zs5gyq6`echnqFLE?!<_$CIONL>i(W8nG#gtIfh6-97%xhJ=VG2gt0w-6#kb~n zi;4uxi9b_3UIgoz%EKFCY|POTwAAq6xb(N3;t#d-PN|+GSH5pV;*I~P@**)4CN45m zSxhv-iucl0-0D|BO;|Gg=jP@X_%O3ovPnw^&S_7lHa{G*@PXv1uOEcdtX}OgF1`9c z9_bd91Y&>Md8`PYwAIk0O@z-r2J-&m|FwDUHqxt5|i>f?w__KG4`Wk@k1mVb;}>QvC7* zA|DvDhXg7AB|0ySDjhg6wkf>{opM`9=^-&}H^a%mVX1s!nuPmw+sBil@ep1Fzj!eg zsC?{6uZP(OnA3Qm+Wz4(bzB|i-i<~~9qbQ`iDZ0CUc9Jc;I*#KxEJKlRzZJl(Al7N zi*c4Q)5?k~%lN2Mb4+Qa2hy1zc?c>gUv_}Q43z(Ue{R;W>ZnW4J^&hjym>TMn_Y(d z>|KA>v4XGbF)r+7`88r4264a<9K+>zJJc4G0b;94B&EScaEycJxS3$7CjU@i{A~Vy zrOV37+ypM=KyAJ~5Ed>ZXC&d?p#wl4-Md2Y&$bdMHTLmAin{m2a%-}34r;o+OxbTM z-Xh?RR^j<+5)-E|ar}3_m7Cy*Fu>`WhDPjBeZm;r?CD38J9SFa%*^ZnInSWueeg3^ z<_=8W?f##!VPC3`G_OQ=T4{z!MuWPH6(v|;*epI3UL$r?rqiecFD~*@EG84ge0%A1 zqp_8V{X(+%?LNNJPseeR&cc@eSq0*R6Q^%k*zqr!WM^gF{!AwoO&;Um=l?>YHLy4eW*8XC~ypW!v3dkei^bZWYmoYEa^-b{;4R8!apUh0)Z}Tret1C zX5q6b@?MJE>bx8cMw^`+7~SZ7Zena~_d>MjcZYB1(dJ`XTo*k&#^jCT^Y=ghkZeaM z;##``FJe8$CIiR|I#jF>Z_ucl%v1LMO*<+z^`RWq9Q0&ek4)=JYJ_YuZ7;$XJ$ zA=gkR-p6Bj=2>WHQlaDMmY%)wl)Qn z7X<$3$Ve{{PBf%3rE(oaEFEU39#Be6P1OL?Qfj;~^(7A2zOXPEkA)BO(rjC{STsb* z1jetdtc($<6pAIpeSz`70MSCBlmlVZXC7|VQ^_l>d17KhK*`3&CN(oNR3MK)NX^c+ zuj1DYa5Cj!Pl zc`Nu_V9iZR(NyKd?vPx|;nF)h^(6O5B?9x1#Y?^rAAY-D9l564!U_pfa|WnrO)iY>%j|2PW! zjel<&{H`h8T)NO{4WsCmFRRNg#_u|!b9{mTsWimW?OyD%$$s48e3aQM2jj0C+_~(i zsQ754J~9o?lw;@43rTJGNq^cxqcER8*;!!w^U0$9#G`C#@6oHyd$&DSYY3n$G>Qj5 z@8z2$HpH89Sw#c|?da*dA-A?MfllAQnGBDPD(0&%m|lLU*3mm3YxKDzwZTRwR=6GI z@2bLIw(K@7@i~UOFWZ1K^B6z%1cZ99CBq{l{_c02E)z{*YN(Z+9ZFtao-F?EiGzw9 zHb#4Ou8}WNQUslEXy5s`+Nr}akJcOKfoYH3haH{MR7J#4DZ6?^oXg$JZ+Qf>wx^|N8D&RG18X8a@9>orhjx3*UXgcq3 z>7!zLFdgF{ogIS#a-QA&!2$qzss>&&GV=Tsu)#~7#j8B7SB`wXqtOc@bKXDy5F!%> zCH50#as&34%IMN<$B|co(7-bT7S9CDhWS$$RL+3+Ztdye>| zJXO!Bl2-Fqz<7ku%2rGAMGiZpfLIp97c)OkXtn3N?j z9#L7@)PPGjb$7Q@b}HV{L%lF9+LVu8{d{XU46Fy3h{>X+YBS;L8`&)v0+gDws&8&y z`?KX3=S3z_Oz1Y-&RivzUbmzfBHea)Xec=*Mjl4)O~6e=q6J&#C()}#gj-)?Cnl_x zX&q(ligL88ksdRJdZq4^0%H55y3^=?gYpoc?3p6XnVm>W!|64md|*O_qnxcG>5Lr)Am9f{BB}+yPQRjc&88EO`> z>!$Rnzw$k1^0XDC(eu7JqDgxlxv0m_2w0&bBz|-2)?<3T;w#kb0IW)&sLPCj%RGWB_TLnOd&FaU31Y`Lcwg>7T9&HfyRq?r%2MxBSId7b_NcVaoTT{0{&xoA3ErBIM(<35gEApYdq=$~2iG zQ#V)goRo6ADYblEyQW8YTN5W=N5|_-!zZ5!8A<2{zC9{zY(@c<^LJ!4#lELrJMU$% zCG;`&#F=05`@k(@2zVf91|A3a{nMUmX`fKq#}(=f{|2uoJK*fA?2ua^px^&ENfB+s z_2c0SF(@vvuZw!xA#vVu2C@Zt3t4)_^x(*-Sj~|U^}ek_&wsA|C+P8+V{3rj@P@z* zHiP@awm0gB24C_qbQTNr)eiBqEH;gSCATk>^Lm9A8s*M?&NP-DqAC))Zfm4yFfV;S z6?kFN_v24Ab9M($?O_{8IY1nchG(0THNn-ij9}xjpZ7$iout#Ckp>t z8i>RwL>g9hg$`Nh>iWO?OTDaDTYSLTe{d{kf1180ZFJekb;Vvz9Ae-X1m?eBl=l2O z@S1<{nh$Adm33<;t!wB|8ZL|@!gRkR5ur5{1OcHCR2#6b5|?$F4+yi=a*UT(O0>b`V|mCgg?N_HGMCV>_ z_SzmJlF0fqp8XG8+}73vaIw%saY4tj#YM^p0=Ihu`li>U&DU?ko8q=mE37h@`f0A;EOW^Y;pnV#G<)R zm(4b4UhG~N_L@fGK_LWP7Ep4L(LXgo z2#r3W4o8w|Io`x?WV_p5iq^?NB9!$ty@t#~>)Fdh_VjT0XD)K$(5f*ld|4}kH^RS1 z*?o4#HwDqyH3MMI3@SS(tqylHB|%!HdIXi8`9fg1fB2%7xJy8Rq4RMCRMeS*Y23=V zm^bUb>TZ9cbLATww8ZvOYFn_m*5Ok&Lv1LJ@S@nzB2U-lvCuvH9y)d$`)Q8h*!>pf zzFaZ_80o-)M~LWVM_h|aa}2Ey9HrATlZ?1AU9ix&fvMLMTd5aO1touBr+v)3q@pvf zVm+cSJ9xRTb~d5V%VQ}WL-gjZkWdRt%X-milexj}Jl~&C(mxPin}NmF!p(w8?4`}g zrK*PeZ9`v%#5P2g=>$5_TiUFq#-yycVXra?8@k*v)u-A5;~OH&u8pVcFPr;1Q>7*| zXBEVwNE-_0RBPeud|PM@9NiycW$$GktD88*j|ELixPK46xLjC7L0*#R znu}e?+a*Jse6}7R$K6Z3)tb3nQ@&NEkp2t|t5`abOT6B&_@^zYVA{N~)}9Aqxn@K= z5-SD2bb>h-7?)xvJtxuk+ZN}FDw3o!&IOWJ`MOhxx2GP?1oh-62*(#y$aHG;#TZg} zt!B2Q%-kl$-?4ofFetI9Sf2ORWMl|m>GEGab6?eznm4r9@4+YpljyYi{l$Vx-0H{L zmIl%feK}C;dW-Pu)Pz`d)(SgFB#bzWCzGc}k7`)GZQIt8f0=5~!F|LT*`Y57{qbxx)(}D4B>e z*SZ{N3-p<+U@f~Bq0dvxaMcb<%`y!g6P2A6fr&|Wm*2k6&x{|G@b}rYiBgrL*)-VD zmO&ejrYZ-n^hXN62#S&%Ajm8;7g74l>Dh*u_B+9&W-7FmPk%_C?o#-rgAGg)DK-u~ zieJ8bVeGYLHDBO-==yx1m`C-+AL{VneJ6hcy7{r*;XVw^vWO!WR@saPr^Vmf5P zn&>|W*scRv*ih9u0N;3*xbjvwFdi&Q%$r>tenrdE>Zr6r;dr0>TMXT9F!|07W`Frz zKNa@v&)jx)4kG%_ViysH&?&34jm>k1TnbzZC<_f)@u~v=Hdo{0L^NMc@#V|r>Qkn%uOg#k8i+O@le^jpQc2~TyLX{R9LJ?nYFjT zIHx}QSd-x+p*%aE$r|bg)Z&8;(%u`SSv2=(y!V}@7ivND> zqM`5$4wXIj`j9o$@;e{qnRQx--B;?SG#fu%t@7UVjp0wbe!~7VQqQZlfARb|f-;1E z=K+-y(MbdwU8i-FMnP}&FIpa--;5c4=@n|b+y~c3JhZiIrqv7Aw8jSB;xOBgmoAN} zt#NeoE|jq6QB*ePw6eFX2dt>8H33KKNehe*h%7y8Exh?+&kCphB*eYi2?+(XcPzE8 zDre;XAs38_)Xpata-q{52`-0@mq`fItZY|ljkch0ycl{zME)gs6jJ0hC*4ttEHxN0 zue%miY#6g{xo4FaPrQ90N#tN_lK*_F7hT_j+@rX`uG@23pVQjbWF(%{qEhkuxBsd} z=i~$;mfG#k_or@pG6&Ey%YR{)@1cg=_M5Rept$6FF_}eTw1*_mUrGT&bG|K+5edS%Too*aUPULVLwe`Kp3B<{fulu zoKe1vk)Tph|Fm*m&OW==Y3garL?1tQ_X=nZRJl!?7t9j>rD|&tP@YB8KE`o6j$1l9 zRoy=aG2qG!Eg zr@>3NCRmR?Ey6;X8BOb(ZbI?iX*l%efSKI!$G=&&iZ6E`R523_b5)Pwq0q@0oeqvR zRlkVh*GH6`Sk72~@2;%N%Jxzlw4ot|lQ=VYjs%DNx>iNtrV@$=Fmy~TGAeRYchYzM)=!y|lhyl5i{ zX)gvO-G|yP_R!z0nA(cBc0A972jplsd_gwImeqfc((w0k3j@^4+ z?)wM5;E}{?^HKYALWA8h5brj0=V?)FN?)NP5>|_>A_3A@T$a+e+B(@;oPT&=k=C_2 zbaJ`6uyxyxU&@r1pD!#YhlX)RHFb4<)EOpwv+FForUt~fI)heWZ}%7&-gZb~l}3xN zTrYm*pPf2E!Oox5q}cJxsyc2udCjE&6-{*9ESwE@_(T+E@*CA1`p{U0{oXpbHIu88 zPR7mj;UAAq@}|{b#w|H^tk5K6e>;iY#A0D1(dEf$GVY#}!w_1OpRs;|*dMqP?7 zb_tiHziSHMPqTySzAgQO-a{RwnG5wj;#)I4Zx8DQ4?QJr&x{jEZ|I@NLiU&kStib< z$w8Y_vIx=iT2X`t_ea2vN>or5o$&oE#qPd~@4n zdtRA>IQe{;tC((LLg6^AKX@`XUQ|D$XPHKh)F*%H9kJ|nRC({(&?7f}CLV-E;gJU| zFa3z3T!}-E{UcN$*)CwZ4YJ_FVqYg#OL2LSxkZfOO}G3m!UpI5WRfr`Tdb8wK1e{R zqtqrFFKxYIzp4hwDvnwvGQNn-*i_)ZG7~%O-f*blTybjSiYSo&gP@%#g;$>x6tv-(%0j&F$5>H(98}4RPl3phP`^!Feas2OQmtPzUO@8-!?_oX)~U9?Leox zaL$R zN=D5C(@NV|aCXbqxNlg1whfVhjes3c-R#sxEBDaFlA1~(KERqy*li^E z=Woikh53lU5vYB%wq5|kY8_6Z7g?BGiM})cb?*S7I*ptmH>Gi7i&rvBrEbySL`xpL z9Lx(6C>Xksd?CjUpXjODT{7F9VMl7qquxS-xVXoo)`K6-XtUL79VM}!20iij9w*t! z7Mv>53+UHcn*Dt1SLRdjU>nnMGi3ewvL*UNk;r1F5TgCZ%iy8?>C`)Y9SsDYMi8I4 zE1xwXW9%ryru60&8Tb#XR79DI5=oOCxHHN6{Jn8AjdzlmSb0c6Po94do>Dlncybp{Nj9^YLT<#x$s& zPy1o{-SV!Y7u#w#DN1Lge`qPYW9+vnr@4w;Xr=E?&I6sF#!LssiyuAI?#CG!uY0CE zMf#7YZ>dS?H+HGJ$)B^kvOdRL<{f=WjX|Hk&4Nx7)B72p=>r%&H$T6}c-_GEa{|X9t^`aSoVtEj?`P^#&}GW9u$rdr#Z>3k zyvZGMZt`MBdrWBt^FAjj6~Y}>E&7~5g_{7BuxRR0IHqAfZtUjp#ouC%D0HFy#zpIwiq?CZtW^=Rg&74PCAc#$}3blVfPuHU~;JOngM#{?v zeZCaZ=8Cl~0BSvf^Y19DxuGEckm&d&#k2^ui;3yf9)=NNK632u+>cZ&;^#y}0)`u_ z8rum?G=h^i%z3fv@XfPi762u4_Hzl{4WRFJ?Sxl>xG%;*euJUagE?r`t@Q7hA+QlpD{O3j@$>zDhe zc#ZzuBKs@JzfuSg&d2?53h6PEi{sWn_2AC1yXt&pb)mln5c|tY&5;f5W1Yq5YmO)j zm1wE2lJ2AwNAi3_L7vf2)($jo6BVzTvAhlP{I*gz;6{TQZpx*^JU_yoy9(4 zco3JpOwO!t4IfFgPHzak8N$~?9o1X5>XN6hZ`q1h3rD?HFExvS z-?#PH9I3&@0 z#@83~rKnKSRQ_)&s~c}0mC{Yr?xDW(lqtEQ-skm=c0WJ72q; z>^C2PmoC5hes=q8`Ok9#jw=FtO1xaRchLrK)g5U|6J5HIvo=H@z`K9_m;o` zd-e~3R{?rTS`eM2N^#{Drs^{He$8J=H}(NjeCJcB9$(sY^a4+FK7S{#A%=o)dxOx) z4j#acY~2{d@zZfuZ91}7NU&Fm>8TLU)@l#V;|dnmT^Hyh@ktYDkUiud6KN91m1%C+ zN}Zt53FE5DKA7c)34_Fd=8{+yto@(^mUh&a{8pJln^vZD_Iyq`;KJV=RLp)zN=Cs> zUpqGcNO%G!*gNqUW^$arF*=QX@=4Dl^5=RX;OoWm>qFhbCF59!6sken`Su;TOtsi8P?(h;3Pfppt6N`h45o}82n}SQ`B8Sy#!u?5h(@iZN z;gr_in^36Og%y-nI$W#VQ596{)L(NF#9F35v#E=}DImHxsW>`KOJd*<*zviR(TPDj zz1QjXTPv8D-j2D}11WR2vHixFwfc>2Wo6}&N2h@frRv;=t?QwU%FQ%yrt1kR2^Pv@ zmm*l)sjt3VW>Z<3_lU~mr1H1#&pbUoURsxGN8(gz%$)s}=7mYJhG^QP~v%s)AtM`1Ja zcN=-P58Hn~A@xX&WQ?i&^@xe)Otf`Bcu>BP>?Rs25bEoRwSs# zAum}#f3r`{HQg5}5T8K7CZZW7PR62DBmV|Zl~$CX-v)#cz(*q4csF^Mnsg-=_^U;t zUL(@2>g%he`@-!VeV4y0t!KdHOI~h?yNgTt4 zLC$;n&c1H}IUG||pZ4v2T?(Qd5P1q68le%ByVJ9lo$2kh!80NVmAg{#!D)z{;iApp zkdPdnP9QLy=Ec(A{k43jcHMHr2p8|n9-bR@^$m?1+UuGst#7K+gdqjbeAUiZ>X3E5 z?PyPDM|Z}n5L*NfeJs9U7guNKMeVLpQrEi8!~7c3;fVVxTD#1wJnchv?KHPkaKn#q z+>B~8yI0-Z#Mz!n;B9SKEs=9qx(@Xg#7iC1)x;CpZ`K>e{mNjD{r$&vkfDu7#ezdk z@_j(gF@5CLyRr^96Tr7AI6cE;WuW@pTmz6moLsLpTr@?7O|XMnS?<>lU&knbJpeq_ z+Sr>kGP6?7am{d9QTwWQD>t8kVH<9!EM{H%+4q_Xo)4Qf3;-n#l>P$%0r4%=90KRU>jc*ihPiB-4 z82m(*T`d+&VP9ylsr|#OJ@h3{E#3(q;%d5rLXm6Ttx`*+?E8my;D+CQoQqj?)oz%! zZqnWC>(n7;?mtP|iY<=%*F?Zf7uT3CcHtB-N;uVZ@q zq@Qu5EWkUe?)y`zn$gja2CW}!0hB9Q6>wLXq-$dXVs9v;uPTa2-pjO>sPml$ZLt78 z)~KmBE!HZ7C7RpeDMoY!bP?vgX;@jM&dtq1gq-x^#Vn4SDvj2+W=CAW535R=9+vd4 zH`Gh7Rf|q)85!nxyi!#NtpY!gFb1D?-L9#c4<8;gI$GKZt`rQ9B9ts!5uEeu?Eo+$ zulc&0URU|cBK{xwA25>1ci?zxn{_2qq+ObAmt=uttqsqia-jI?5oC8l@NWWwDy{pOpco1nhFAx1x}{ z53HPqB-|)q>K506)qOZjNsp`9Kv0N3#mRBVCD3kVF2*-hp{BOSKVio~XvUkCg7Fz7M{EPLe117}e25Jv6z7Qy-W z1O#tT)nCh4wXR*uVrX561=g^m3H(Jy#*xOpTLy`Ur|n0Dle>w#@+c1|#nTkTKo$DO z1#`GbVvLB8RkQ#_ZrD6gm9`?0BA;NEnEd*+aW_t!XKPwon)PRTb93{H=x7lU!Sfzc zGCgJ1(MIVq>AV=;IU}l6>J)irWMS4NJGqo=<|4;lHOiE4&p0Z?`OkA}ztP*c>q!Na zbB2Z*p`6nh@&W60Xk8>uBc&dG5Xb?L|G2xWzlln*y4n_VtkmhXDp);VTen!uQR zqzfgiYq}9`@6vMDkAJC&(u()q%n1jmjY6?+&C>9);=iPY%}kTQEW3}N%>bJwV?~FG zk)-+T*G+GMzTEhDF*V6~o&5s>{z>Bt#R68lC ztgo`=AKT|)%qx2*Y=ey#@UB;u>0&?@2|3RV#nE)K4T)_M*mWlD{$9LbK*gp;M)!ZL zy`**3`PJO1=A9~-;9a+aLk125W#W9MXfi$n1;AZyfBZ=(k^-a!K4B;HIFyQ~kKjEq zB{QB{`wx9&0}3QTTYJdLOd$$>Q(crPNzbj!Zu(I!g*^A#l`C&$vY4{hZ{GOHo(HI2 zj5EENU}tnOwcf}e{S7ClVqXU@*A>o8_VG zHrugQDK0F|TJjUNQSaqfj@qpoa^{eAX*Vi)-OfT`Lhkc~In(mfOn| zJyGFak5ghdt-4;`C$51(ML|J92H5gryM8O)u^zgg%o;FMT6p`D_Ylvr0Gkq~5+ih|UqfDT#{BBL{kNqetlzNCmVF77dV7%d1)lGs(qR;j|c>;XWD@I09 z{{%Pyg929Xpg23^0zXe=4TwST;J58V_==_s_}a{L?JNKDF-)iKJyDcwm`7U8 z)<=z60)g{?o>7J1gG)L@QtiBSA->kZ!t~!;j|31Z>2L2FE>)E?cIiKRy2c&(2crGo zr?Mk-TTaAwhyj_5+5QD{UOC7>%zpa2-;er7S7B=_L(BeokodE(b3p51VtRI$5zp(~ z3x0n};^{jo76_e4<@{eKzgE0oBU4~7nEz`VkS8(;?EOE0#DB{+qgGGF0%IOwvi#Q@ z|GC60uo`fZ7$>Ly{XJ_C;xC};A36dpp8%mS7PoyHvV+>jf13aa8AzWDRO{dW*yOJF zgJC)mSh-014e%ovs`d->Wni!Hv`c3h7+(6@xnH#*;0piGAAxSa&Cam3Rckrt@8<eBom zjgAlB_UN9{ND&^OiT}Aup&9cEEVU+79`O1L^Yr8T8RfLzC=z`8K`-s2#{4eZtFm!pJ{|K0)eOv!nKZnJ= z&&T$KA_QZZc5Ji~!eEDc@Ztvsu0u1*4hB`#ACN#XQBio6D9tT!d5!f9d`d`J>RyQ{ zA3AhMh`~DNX@N#xXivVTt)2MyPr9$s>Svxm|4`vsBLqV?99%^Ky%-nd&^i3b-^nCi z5{N~TpWtAHhT$~|v%3l}FK?hgAC={klRdAoUk5PL(=)Nt){3RL^7}0IpSc-(m}mqu zmmxGBDCItDP>H!KmYb6ZRPoRBN1k5aF2Y3mIGAPoa4fnD{I0HU3NXLbZhA>dN+O(5 zguV{F;IqBFD*OJWcNwLnhVvtJnkFVDB`z$Fiwm}9K^&LsJgp})_hEn0P@u8^+p*F+ zL(dhRrt>=Z^03EuUxU85iDhV`k=Ef32@h9B$NfuW2{FnX_g)^E3EkEUbLERBQqyv6 zdn6-axOx$#UB3+)tkW`ylD);Oj1Rl}$2RJ^b{KJdAWabfhL4;L4gQ_Z2IvGNW4 z(i2rPYa$f(5~M9K9-2ZI!a}$3sUP3nstPjusdm%zrQh}Wht{I^R?WJ}sIC31!10+s zHmtquK^4>HwZGixw+=91M{xO<(JjfJ7|XZlRM}qF04%&p|NI~{9QhLI zJ){Y^lHgvH$IKb%{;>qx2DeK3+B#NppvHzn(e3BiW#VCe{#m4NL6(xDuG;ap@gH${ z)8pe!?HT%%VG*3Je!guRa?`;n#70u_f*^Skh+88H;a_q z)+q+My7}koGcG$?W;=;QOF)K^YY~8>X6QbiP(c{%R+Tn&TX8Ije!l@>9B#&DC-T~Zs+V-2_aOS!tBFaoDmyBom-~S#-9W|Gcij;BShl)CkHalUH;4!e&zDg$>=gPs+S^B<|6moi zZx-7}MY|1ipaWN7^DpEtE|YL1DgVKawl>u+qN$VJEsrA&a;qgGA2Sh$k(razyxM_V z?nvo56Om;~DFr*QL@gPW*}uYD-!pVP#E~jPatl}`k6>Vx6m z#K|I07{2cm-ep@{*HBkSIUmzV=3_eU7wEvEjl-28O#*D(r!Vx47U996ysiruueNWv z9oyN}C8*@>?OoA}>o9alDJal^R;X4#@!sU9s3_MdJ|SZW>R!os5Oy6iNEXHyoCE0& zjE5GngFIW=r2;}l(0I4`5qrJ^FIQGPd!TiW_Ptu}ShamDX|yEI1bTR^EG%|A<41;v zEthGOCPxg|PKaVViZGM0UAI1G$phh~a5O4>0bBJR>PZMQaded3V^zFtQ5Dkn@m5Xs zwtOPx=rK*DeF1VS1(z>h&b{^JBzELf^i}X{WYdV^)1s$OPvn;^XCT_mLpf33^PXBY zDrdU52Ub>xC^rPuab35%3$B9Wa9*_~%MWAF~3I;^ULEvYySKc|xX8#^KV9Kv{AO`yue`w3Papbdt@Z+!*c*w3IS!hm-R6@Xapx_HHwUNG(<0yz9snXh~XGA*~v58ah3P03!YD zUZAzUSNELT0XCWk!_5ji=913XvBH>`{;kRniN2aoXOaT{Id=lA63x4Zjb};7}I5w&qn_YGyb<>Jtz}xutP2A#<^k!-w z-yJbySSexPxj5XEkIK+XXiGy`H^nNrFU?kCRu)G=fRDdKY{ewBt6gz-r)5zcXM~8) zqgI(D2=OHkvOt>eo&B1Ox(-)DfsfaXSlD!6pwl|DjhS8gbv2)disQ(qJ(w=aWQTGf zB!yDE#SfJLk;zO@4z(inmO?+7Ca4bNXAf;E+#(Dh#3O&JV4n<%UK&d70#}q7GjE?u zDg-O3So*jI!W)RG&O`^jZTyy+n0OHyI~%jwP}MmQU_ySCTvX)l?z}DNX8$|y!^e*K z%kF~3mdP!Tt9RyEci5M)D@PPRxf#E94C(1p|2c+q2(2;)rW!c5d0kKl~N%<>na>p3b;n=4!o9? z)kN03D-88Y&Bz#*R@;}~=UEI|MXq-tLc_F#T~Nn;mdy~Pot`q79vf?PY>?rUK{ZHD z9s$j_tPMHZWP`lNEsB%ZXx|AowoFioxJUe+ItmI3)yq=wV#uEr4c#BUclr8uU0!bP z1%BT%EQi%%OJ9ad$sjK@<3ayXX*^sDWCRz2;I%W2ct=aCXP4^wmi&-w6Vh^WG&ZpFA;D4n z*}bpXv18{U{BJoRJG-$5qA@7UU9+{tO{4sqfv+fm(|3!sgS$Td23Q8M~S zU?eaeAEego&1sa3cy_t(E;4LK z)&LYA#KNYxM7KeP8qo_u$l(JA6v0=uQ##O@0e6P>A3k{SafeC&<0jg!UAra_i*&4% ztO42yjrf;w^n6@er7x#7xc5K_mmObb`9c%Q(Lzf|>`=B;TgF47f=lk0jbgYMxEeQQt zDkLTh^k3|o&hLXDjRgLYhMWUhM`sNDByM(~as_UoQ79`dl_5&`pD3Klsa=|zbC5fF zv@SC_`I|`b)JYsDV^aWiVSxtT5jV}bbLaP$FJG>B^wEvVh(uY45@)|d@9tOSITwgD zrr zMB;b8-FN!FLugWd#MFSKo0Gzdowyx0K~F zc0U8ak){Mc^I8$y)npS zC*;@JbEbD$7=Hqa=>G`ux&Ge+VR!!D9x_Da|B222FEwQuCwVyF9Brs>BeFat1+@$K IbH?}oKiI9^!TNLNt-QBY8jj-pfpNJ0yQG8V>yC2>kXPXXbs!!SB4^xqj!5b6v03j4}q2=eeJK@4eRAYu|J8 zl&#B=gI&gHT* z?y~)bt?rjxvG&eRax!~T8bpKM+7+cWJ$502jNsxY~@VR1nE&Lnnt@=5AGw!9qOcTP*LX`grd zzEEc(i*Y?Uw5lh%*k*^K#|ZllJsSH1TnPMXJY)4(;p>+?{mXdIef?6)afKCJ68zel zwa0%k_bdOrH$3aPU-2{w{r4OHyF4fs{u>nk|Jw?sJarS338Eak#|qZZRla<KTX?y1x$``~Y{ zF9<2SXO5IGvI9ET@;v7`&$E2vk0yeA^V4;H0+Y$OG&g0_`Q_IS3#sDs;Kwr>8ykJ+ z=hQg^dQ7_dd~p|9&v~|AQ{4d@cdg?5$%nrjim$4@9t4&~NORr}N3DCQ{| z0*XfhMcmJgKP$%43yS?*U0w62PNf6Q26`=_dTNqgERQelD{SBv(sdPk*9L9ebNIg2 zk=L(ZM=D~IWATG&0iAhyd(OYSCLf&k>C*)f-!C6$n&Rg6)khUnluh?VMeeb_aV&UC z)}1>mf`k=xZ4k1MG2GlRq70m9ed+mE}z_8w@7=OU`b}vMsXciD(%~H z&MynB*d-&=nrGjH8!cz0r={6HR=5&)uGBrt7oLm#i(eNj&lXgC%*ihLw2adup?=!h zx?6xu;5j&B&9l61@xFcg`q^FcbGmF_in&M37T+)DY1ledbVYqNQ7PMlRi1VEeH$k&f97&1nYAkAb3tWfQecs;rKLjO>!*`T6;g`yCC*D=o?(dhlbfH+VDm^Kzo8 z&SXwVaGDgcOy7}`-6EM1{lt5u*!Ez7ttNhUtkUh(Pnvd|8RpCz1ya27NRfsmXV56$ zYr=-pr$Bzct*iUD?RU}5-97N>HxXBF)jiIgD(ESOOuky9H#zOzc!eh;KK_tIw9Bu3 z?;a)0%;3$vdc#Uso!-o0XFpSj>ypnem%DwuzCmEpW@Ht*gnWtxRhIW$2(H!G*1r2q z&{cfSdY*cZ_<&9x9**qx?Fm#yb4!b)va)xe4|$WEP5*OV!3Sc5VMoiRobwg9rjrT- zvVPOINs~#k!}mrTgkM;ldST^~;@6cG0|6x@fBB)<09u)$_qohK_1QzCWfOM=)V_RJ zL@S6n-&y9h?D}DdKAY0I>xZ`ym>HHB?0Y7~k|^w4cG}32kYB6HGUI#{^lLMYiVTnS z{It~EgXX5hY&Kx_Cj{@>EFhuo(Q?*k;Q9uOQ_|}h5u+kEkKj3IrG-`TxTwnJN4BwP zG>_C3>pJbg|fZWaXw{-^uO6<*d#bh^tN~)9UJKkKb8Ke*8gorub>X z0s16-z#w|=V$;Ln78+hljoR3rPFm-?O4-$!g#RXtVX4%U)lJ?L|9l@ z655h9#RLZj2i*Hh5%w>yExmOt0i}Q|l_DvuE2e;w&`?kQH5)vs?M!`(22Pwh6DS2S5 zQk3%K=JkSChp6%Ck?4n?`=g@=VvE|vkgp4(jhgNRs;&_S&YuHN1Z*&;ivn1LiG&Y z-3xBrzU?;M8{tu;l1d_3EZ-p0{3b}av|QHr^HtH*oSai|bAC}TG7Oti^ql1qh-GDF z06p*C5ERXZ#Ch`3-lKx5lcx&1Qnrhz+Kd!+3k<_&y?y((5gsw_LjZrlqn{eyE9OAC zkU_7&stN6Pcpy{K|HQre^ zu7edGE=YO$^z`)fv=VGpe7USngiOmJev#&n2TiYBxf10^X=xci;r`~XNCv!PRj35R zR-OGQ8f)$wTw5F9hO&EN;*m#>9-(y0d?W0P`@+mH%xZjjeYtm;o^v@f+%WT8{QF#6 z$El(Bcn*`2Z&MTLPMIKB7IyiTPSHFpFI~KtnwqKw!Q|uWMKDt5$Is**aTxHPY|zXo zDmvF-cgB0Pyl{lX9@#Ql*J?<#$m*J#DpZ>L(oJ1yksrCwUcYqHInpSjfa=tw#vV$5 zWnU?(W=4=ikX4$q3Om!$-Dq0Q zzn1kq&15oX2K4;Wp|%-?OoqnI9USta=jC4+B2Ff5J=KMDRl3 zicKM9m*-}uBh?5cZ>y`B0CKd9%&uIA6(JAgR0uGd9@ke0s%OHpfajB(OE5voe z`w=QYd(qUn{H(@}6%CM&m{4IAyka0Fq0mCX;sy)AKnV}Fb7R7xsB9cAZk9>(YxzlY zbNt|-gE_WlKlg&)zCA8Nm~6nqB8O0vVH>%zXdaHOnZ|&6N^!kmMvygfX&)>tqdhvk zlpyTIB)!ztAVq~FLekW>oEwkWfARNKG^i*gV{e4rnon!GdFxM|lTL>HZ^Rx2%vDH- z+I|n4T{CozU)1N6qM~BSr(04u$PEn0hxLMfUo;4G8pC}&a{B=A$Ywso!WkTT!AIaU+7Unfc)bKJrfmEXw}^{nX$I^)xA z+1BC0u5466&>nVzY}msT5)#6_+f&&OMW_Dt2FuJ*!l*aCJ4j(N%bActBb86oDz^iw zz`;_udx=V0l$}F4qDmqzv!kQKX*Bo74L%XLKa{VTVML#!g&nT9A!+XS80i@H?Ks}( z>^mWBjvq*Bhq!Q~VhRV~-CBIv!zq5V-J<5cG*r0EaScaNT5u|78lr1Q34cGPJtJW@{~ z&$-b6^X`(C9%^uGGPaFL3e{E8hB!Lv>N2lBKOLN1K4lVvtyNU|cx_FOS1bwEbg-Bn z>*(>A^G>cVwWOqk_O2p!qq=XIh3|B)0KaEJUvv{)jit!>w1HfYt_KBhq>9(G?2^G< z=2u>?E1x4lh{V+@k8&}LLYGgjfb!5Ugb{2U<8!buiu)JK5L z`s~@WNvPQ*8nafBzS-RU{Urpiok|9FpvQmu*s&XPP^okVsdWK&I|wYA5L^`6sDo%V z+MZe?{Ii3f<=qX}Z}9W|em4d@F+C%5w=neiG+1dRMrQ6L>`t^>F|o4c1PfFam3r=J z;Gi^02?g!2<*kcVHAO(nsch_63*fxrfN=6f33;E};F*{!Z#K2(*@s$qe!MPEEp?(PabRmkpZC8pJ_T+dM z{2mnALz?ZCEiCT5wNA?HmyI~}=_rw=irQx%5(T+!f}lPP*^%k= z>D5h0A9r;u!sFsbQCXBBkHQrxm&x8$8Q1avfU;x0+-KTVqDuAibKa_IZslZUVQUH9 z!d)(aC}g$-drX%X=3lH@Em1{-6gaG=U|YL6A|{45K=B3KqZ?8>J6;_c0VuApv=fK} z9YW5`+S)pb=nW{nv_oE7X7$Y?NTOogrD<{Uu7gNaaP845ywd$f-clVvSwvi1Tt_ls z#2Rf^v~fczX>d!WqomT%9t%L_J-tN0dZlz5%~;h~@lDM3ky`L1>Rm zanEYH+2ED9hzL3q6RHnE&oTvue85o4JQNRJ>p#ypfp-jW`ixKmHom@D* zC63)e@3^*fO}h%kdl1UAj+#@7ZpQ?izstZe8q7R!BsQ z@63SH+Xs@EY!*ali?%Dm-=);H8Q-BH`ax&kaNMMj9AO4m2#+DZ_%fA#OjCwD3z4z= zT+ZW~Uf8ZxmHiNW?PUdJP;_)dydiqpeQGA^)Vun|Nh-uGP||uXLHfppm~CC<;y2Ik z3XLEGhZ^>knVj7J843f2l}~l50OHrwH-6;jk8kd5>ef{r&XbRTbf@kSOE11u9iCt8 zGu)mJPh}uEs+}Onw?J2SN;{aN8EN4RGojM-QI=}ku zC%`fxC|I`8MxIt~$$0YQ=O7VfL-@}0XSun|2=eSv0OI$>0B<7(9jWY*4U{0%l2xVW zs}DpsI+if?ehVRPI3FmWM8vqZKJ2U=da)gSbKY~)bhrNaKnF5sO2@+R+__YuPp?$@ zj76w~o+0`!fP)ZXrYK;cf)w`@tFMr({(~15iW*J=P|8%S9R(fz<05E4!RZCv{jV>SY17}=|r2_Xi2(R6#dQQ zK-1Z?XT!`$(?F~odVar;Xkln!1fV)p>xW6BAkK)>%?d}qwBc8?W8aY+Xg7Y^eyqRR za?W-9nahDp9oh0Tz|`>o|L{2F7)iK(VC|ETVyC`1_SMA^`}%B9d0FZ4d4!pUJg>A6vR6RnXnp?cYyo`??y$*}7 zNa&Tav@gVENz|&bFC&hkG?kq<{F8DVqZpGNUSuOkEiV=&-!0} z%a7%~=m-#Y;Pd89BJZanUP6>sE2e0N?#Q2hT>=jU)Tz_KdaF9{r&u7A^j}+}TMr3r zUC^=6ILl(!B(Z#D;`QcdKgPR#NG5}_l})=u?evo}%5H{G=p4a|n74*W#QEsUmQRL2 zMmS9XRm>1#GU{p~e3DKGXe~`6qN*IT@#BP6i03r1E8G}2Z5MiD9Ox&natvb z8PE4q{v`>Oc)fgq-!2oZC}CkzMh=aM+86;laq$RTzS{iEAhm0*0O|`4YMvv!1hw>b ziTSbi_gJ;nH|+{(?v8~g;VSJtM5p@lhwo_!G{BBYM8Fu3Nfach)Gp452PPJ)&!#-@ zB+1txNEGY&1WKkz3~U#rzK7QB1RBy{3On&qUesXqxuOeCAJ!h|zO!XmM>AP3E*nqZm{ot8>Tdn7}~C~UNcCj#py$?Z1B}qhAs;4-j6Ql0Dzmuu{0bM=>P-P zz!OAOe7EtlBjV!XP^TQ^J{RH!^n--L-yVTV!;Zb5d9wn-k z^SRqj_BV*cl7|8Jo&hm#4%mWrh}zs2YY>yXMbz|6{KAL&19U*T>^5H#aOkpkSFa=W zs$v(b*DDsKQUT}E6p0U@fn5z9J?uGNCBevz<7Dcpb8rMe7v)Mf3!A59Q>n2zrLsz; z^D}$v8)LTLJ@E6i%r&IALRrl~sTvPNd+m}RLvk~mihIN5bIS`_@m+)g9m_@#BeRis zjATc*>fMF?$x%*?270PVAm3>X&iFDI-N`_sm#>$uM=}=L{dKCW=q;Wf7R7k=Ju;8o zTE;BXP!;iMYlrN-Q*yu6Ib-8A0O2SPmw+yT#022f<$y6}fMv#%iHZ*(Y>gNs6bA;7 zqUNLsi*#Y9qC?!0nY$=yM3g_Pa2kl%S#00CfzKszvpo{t<<6@4@bSkT6f5eb<+Eg?g$Un-MbuP$?NS1q`PX(Z}X#m z^P!{cVLk!dy4V;Mk4^-9YN8bMK%x5JzS5xpDJ*DZfCQTX=xGAVj}l*YQ>A@LT6T7; zT%Ah7n>TOVuUdz2r9TNk%mSNI`v>Yml5`@F>f3;r6k;)mZUE$h;%bago85#^)0(Wh zF0|tfl22$`SirXRxl~!xYwaQ2+pU9D-G9gMT|Go|saP4Q zYCO{|I-d$^j6_6EZ*MQN|G77m(m!S5bP%tAdy{>~L*vBwb4p6O zN}~2Ov~V`wJhBhlccLa*(EuRJ%jL4oP;wnPANbY#afaI>=+%6A^f+xf!5bItGk>NM? zXq`w`AO=t;uwNiMHLo)=i+}cPuj)*H0=jr*GkoU^zAH)r`u%OsS0ColPKkEC_3Mkr zKG_!TN~5Pj@f-J3CwfVOq|vN3?Rw<0WaG{tYzXc|ghAi$m&k5=K| z?Baj?`0+`U|7iMa(k?9xY~E{XMHQEZrWBGlA|oS1B9M#=?_UaxC^Ul8HP5jO9Nk!u z)yg}G8Lh^!`F{xLv7{BwbyA_nqy&^NRPHQ(5OhcGRW|7=?^aY!a7%vP8e9i~K!ZjZ zhEz~eVlw7gR&xo(-wy!?BdG27t$s;0&b1kUq;sNn3Dv|=SQ}{_dG5pQJ*G`M`UCb5y3Y)Go=xtN&onL6_4`sG8WI;=*G z{74I@j#9!fqWsWsLvmj=deqq{yOb}o#8*fU)7MWA?0N~{hz}NMV z{`hI0-9cQv8+Ix;WY+ICX&!N}JJ7uXRJ!@5vqt7gR=>3MsT?V1f?Vg}>BX2XHnDY& zae2A)xY+99&ff72U0F$S+4^4x1<7>KpixUg~1kh)&iDTqb!rK%{v)y%e*GI zT|>ygl(dxC_C7LdSAp7AMQMixs#2tUlqP418pLomqvUwk0)fIwP?B(^>LQyIoT9lP zmDPcbA$9i`s5_IPH6(do>#Gvac+)-BGdG+`KkID4tIVEmScC2z3L|MO$k`5vPz(v% z4GSbuH-Q6oGBxAP!^5Wl{SvKRl9Jqx1KPmQv915Arr$K( zJ3S-25$^V=DwJ3yBt=3Iv;$(M1RXv%5EW9PN9NISB@je6YIHLm04XYCS+YJKmzMx2 zKWk}81lnWjJ@izwH1y3DK(AqpvzFs=3PBfrgLkRbP_a!4ejmIfaa}( z1Uvv}>Ga8yL2$VVP_xfMK{*ZC8nF>1gaVFo9G@aj6UlmlV2O@ka z2x#*<^z5ro%6SJC(wp&Koa5 zJPD7jFHqU^ql0?()GX;$f zkqLy%eSvB@3^u1Jb>ESj1d^-|Xc#HUvRy3H#>pF~e_s~>1qoKo#5H*Ubf%Q{b`#W^ zJ`J5AS9eoqnmZL^Lh>m_yFnF#0I9WrrSpL?mNQ#T@leUyr6pB?%eetZ7`P$qRR8PZ z<@+%0`{25FgHVnx!->psN4;ZZrdLZ7(;LA2kdp)$tfF33+e#oDR-G^!XCo` zU}nH28XY=xD23Mr0eMsjd&Y6la=DmNM%m^++&B|HIZ9$XjXzVw_7x2c4Y^Z>`**(( zFLul>PNuoZUv8`a$npjlPJ=#{F{psU@F6t#ya7-Se`dkEv+&BM;;WY$>Fa-jYGtOf z#iLeH0pix9?R;P{w2UG^EdyC%05xm#+3g!FeHu`Y&gH(=E9fS@ha5qy;FuM;#4CUL zZMzxtZ9^aUNHJT7VX3^vOOR-a0ce1Z|x9>*HmFf=b4^D@##680n3$bg#`XW6nTf=uJNH z=#wiJYmU@f&?ZWuBhyZsgU-_+xH*QQ^$AN>(E&TE&YfKdLaw{B*OuT)8WL?`jic#a zRqSafL@t1|u~3+i_6ag)G3?4Zpl)tnq6g?5Gfam0&b6+9fnB1i>F*wOi;2%yzkTbv zX2%JaT$>tK5SWid72a@$FmNu`gN!XBC)Wf#?Ja>}+I5^X%!VTKDH`hpC13>f9CyGq zGTXOTtXsdn1X524fUCmd-P$8hZp%2ZRKeU4=QDe`To8dZVL;={11p?BE*k-qeg#OF za}*=Xthf4+b|PbeFcDmbD*;$d6+fYU;J#?x(@`$eDpj+f*T-2kqe<1>Y$8s zr6L`{@Yh`^e7vX zT{zrb&U{+T>~4XJhrYAIl}|@D1RbLRPUyFQbRu9W7pyY=yF0OtS^^I+Cb7rSR1;vs zAqmOpFLx`uN5V~=t^l)5xqam4?9|lXLEfl9WVnhrFhuvqs?HmOt~C3a0QnjR;M)nz z0O)>PQK!7HE-3p|_Z1dos3LF^wWB9~YG)6qvVBNf^Z-^+bmPVicS|gkg%VzY1JBX@ zq1Ay+UE&Pk;{@6&+=FUeMs2LDNV)tJ2(tqzaqb9bfvXDROTrbbG-U(N=@%DjZ!qd)(|LIOxNbrDZnk0M3TR*H|OTc&hqFK32AHpF0t-Q!O98C?OuVAt^EDC+R> z;SKy_Mo>ExxJ!x~qcuP3zL9}J!poP3QR+kb37_5afB^K!7~mFYg;oe6oMkk+bLp@= z&1a$pD)oRnc_}ZC)n~AQ@su>w*Vp%L=!Kq$J(B*wY(PZn9Z%t97vp?~FjPs)p&6kB zJCqNP^^Zx0<~)*>v?XGiKNdfj>jFIzeQusz!_Pn;7quPUsu~T=DuDdKc^9if+;t{_ ze;|+@GwP!W;q#FPvyI1UD{{Ef+Q5#4gHEeGv3#l#cCcF)fn^V?iHB`LEnBmN=W-Sh zK@$iC`pw-$4FUKL5RnSf;_Xh?$Rz!HgfD_ z8Rs60rQ5>~Qub5Kaw|HYZ1z8i*kH15Ogbq2h&5`(+HF2)8cUaykkCwtagT&n<(BJ* z%j(whJT6yTX@%Y&Dnd%0%g4j;^athQrtd(%FIj%{aU&2EXqZMJ*9c-s15GKA-bNZf zf2;_lpcO=$4{di4ARD3;v541w)>!`4)2kgYLTu~=-68q5Oo+e3RK zJtITMf{q?Gk_M2X39A%|YNvs&qWJXmk)PvHQLm|~nSn4$4%~v*f^_`Y7r?*Myv0|m z?DIP!&#t+E+<=TP=yO2GISi^bh{25z?CA*Mg`m4a4g@?PGA1b(IFhKuDKY zlwv?BY5-h`!L;QBgg*T0VLlj=r_nkH@1z|9ioduvf=m~lo{O5O7y^JLq~K)c%EN$O zV=Kr-R2%J&AeOtmSiGSho)%G!nWmS|R)g*b@Z95bR2BgMm>pD*;m))lxdzu4?-Wx& zpNI5(Jm6s5`csQ+F0**TN7=}KfPvm3O$U((o)TgtIPdM?~>u6HSAYvPxZd}qbd8T9_al@zJYSMcxbS|k%!ykp9fYs0Cpy4IUyBj zlkHbf$bgO?FnK0};s|x6iUAfjWsH+Em;VYIi&6U#9AdNc0 zi$ZEXp5y$ymmg6f{s|+S`wHnO~(}dAs?s9?_*%5g|n6s!T*JdoGu#69t9= z+!gJ*&mdri*$CX=*2R$tGTpzyN zBYUqgWl?5rvaA}=Z`6enOM^7kHQT4a1bM>(A`Q7ykO5Y{n%4+u#d4XVgD3?6(%KKL zSHy0YUB?$Zd&;Z=`q}3$ai{VF^nO9J+Xqe6WDQ{rxG~2K7)%1u9NldJ$lVUV-`gf4 zV5LZ38(bNtCB|pR@FxKdSjKm?d?pf-M$&S=oXgNP_S&-FcO&)iH*er3@88nVkqPPu zG@JxKv@Rmhy+4tdcIzy`z-K`-BawLMn@bTkZ`gpCDAHF0 zI`4?w-E>Y1lCV82?BxF6{*2zQZ;GL=E2)i9HbVVCB-jZ~CO;hOz}Bst+%X9YeXl^J zuA3$v^smcAfp1AY04P^wi_y-D7tZmjg5;FAyNi{7`TgD*p(Ecs5N2WqR(EC1P2c%C zMapo2XKV^s?!@K^s62s08e=gJd!Z3oK}6@jRHAG?O^+k4lQPT`eh>-1>rN=HJ(xKt zCiO_(7#g~a8f@)QsNF#GNdsRVKv5)k*AEvsZJ;Oi&CJacqu8@x8@dWTkdS%612r+q zg*6<&zKF>>LPl%{g~Sa!uJ+L19vyd=C4KoMUnsnSj|qOx;~|LVpd1MqDiWBaAqXh5 zC8*brJd0rw5h=h$EuoQjF@ob={pyr>LZiG_YzmaTh3?+b`W@wdVOirSb-ewoLD;6H zBlXm1@Ohy2ue{C@qs(&+!xRos3<_end#vB|qx250iM2t;&RSSxgG_4)jeJVJYwuf; zk}S+Cp+rmH^m!+8OOmM8eP}Nb5N!rYG*m3hl57F|^&SaKv4a5Jv@Pf$NCGe~PXgAg z1<4hREr$!crofxi45VCA8;^W&GXp6MNGRcABJOSHOQ7ew?&cA&A#E6dn%M%nxb6P^ z`v)Ev=r$lPI^yx<=^AGoK#Bo~6ChNNSFVxE@qAiPHKEem(^F5``fbE!iztK3Di5GG za-ISjP*yfYwj2QF$ZzD(l72QlGjnr)O^5xbu_Er(M`LRnfSR=RVNq`wHTS`^;)oP% z@LhZRlp?DWB*1J)D)t>kS3(j&KSSvYY1rYweP}%a(?Q)pwGBE(4dHtmC^TXKJI#EOfC6&US~apYizdLG{^>f>eSN)KJU_ z5i?p^yKnz~d*q)3k6TDCQEUJj5;swg1_G;kLglQHkp#I8QVg}@O~HJp#SXq46L6o3 zuUcXU?WuomUxv0(-Guv>MiNS@`WhM<<6R62adgVDAm&myxP&3`gE|U(0EjO1<)2m) z-w&t|tCI-INcT-dZ8}7v16kF-{j~jziAm%vtCbFF;o=Quj{*ChMAF;%GmuJ7f6yCQb5vD zKXdBTV`MxGK{F78Ncl&uV9;&5FFBV+BCV~x%qv$wvFBcoGGDCU+%zT|i;6YU&0rb1 zJvb!UKWVUwC}bl$Jz8J{bqm?Zq7FSE3TkSC4B!a+4%4I{6f}ssXvk#>Bn5={gGjh4 z?8;D3p@gzto-hFG+S|H1qf3`Ar6dGxEQ`ig*(Y2bmKE$5`m5M}g%;2kO#&-9)O|_7 zA|cQic&IXJ3^b%UKdqfac~a*K|RZ zKo&g;3}(>IhXOi(QrE>m+9F^q=anK#XY^E=4^Y0^B2PWTB8>YEjzKoYV21GG(v%AN-h|p zOV{k^2WSUb)c-V0dH9QL+qgmiUDA(N4-Er%;4R#NnUz1 z^ko*ju-C76TCJiCZ^n*&2XauYhTDO$A-aWpFrXvhpgN1QUW1tkti%YKBjp!4a{x7l zBqF0PsIqxz4g_RYd(?*l$&k-Q@18E)>z=H}Wa!&~)_C=wQKdRC7;T`^Fh9?xeHjg?!xPjIaq;CNoSY44H0kTRBD+X7wQWYlrtI=eWZ1J${`bYvk3NqlNuIr!^x znR{Z0MU=ou786QzKhWV5enac|euDbS$H+U5t6>qs!owT?5nY%ZckpJR21Udy3p|tg z(A;uTmylG<5!VLX2U`}V%BV|CgK)MN_|`XF!T^{?2#OysS1n38Z^V$+gP{0I7|j=e6Fl#m7a z@dovEGvfzr_|`XuV|5`%|1-HINZkYT6M7j8-^mML`+&9KtGEp2-VOJB@oQ~vIoDPt zAE2KxHrDsSfz`dnjo;#?1Zx^JKo4$xobO0M{yFH6#?n_l z2R_yv-2@^ac+FpabO|QcLh&7Pu(LaL=+KLU&U`bA{+<;_Ou(Lu+9yEhkpJ+p0)PLS zx`}-@?=~*J`XbhE<>=uhXz>ru3=BS`D5iL-WFPr?&p}iEN%I4nM_N9FUA)MLiaT5@ zgcI1{FDm8zgSi=1mSj~E@wq=P-}uh+x`xT^*B2J%->A2ael@PDEaN6l>1}ycuqPuT zzMJv6-_O(b`rDs8k-`1Ru&{=I?B<|sZmnp0ZTgZ+{Qr#~^SCdT-p18(wywPLZh7Lv zhXJqijz{@)8QI$}P!{@^B|hBv{8w{8#sA?AeZ4H$Zjt}oO}NGSkea#q(BJoiS1f2P z0}EC$@oU_>PTY3aD_||;u7`&9sB#s%ivKewe7(dACP^p1M^IrytQP8D+4hsCKDEbd zOVh;#$S7RdyXWXlK(2vK!-Bi&!Udk&r|qKvqF%YOXTb}BjbslH97xQHNt?%_^?xca zf1sJoj2|R{nZp<#s+Ly)S%Xu2A-aPeU*^H*ubixe0}dX9KJfRp@y{6Gjql#Q3+P-i z$@|R?`pWZNWSVw;ADP19c|yyoUbw;NFT9ro9VC7{Hs>l-Fc3nt#9mr%xfB1F%J7xG zLq`K)*7WpUP<&TT_VMuE62FEt0!g7D7$IHw-VsPbAi2n8+xM4`y9H0}e6_%bo;$n* z1?=KdPwKgU6EqOm+3-C3`75cIQ8t&A!9yJT^m@UE_!3DC^k@k9t*fm5xs`==mT)7^ zYQz5<6oq2(+~MDG$5HtD@83MZecmfS?KyyZp_l?*`+xHLhILwd_V|C@gOs;nQvcb8 z;2Ybxx#UB%frbX}f-4D|_G>U_&!2Dk!V$5p{E;+NMdwzRhX z6COZ9fzvRwOluXtm#LQNEa3{$oE-F;-91x7L zXeF=xz0d>G_%^Z-7@j5(TQZCmtZ~QV_;a9@=!PtVpe~2dy=K7i(9t&$OLzOywY#t* zq^uTAju7U+YB0nE{f|PS9Tb{S(JL-4UNC-E4>C5iwzSy8{D%^IDAx^|rg>~1X!l0> zse}7S2?U*eFz+HCVTne@;cr6cYinwTnFXH{kpu-o%y+XlVas!LvH-a38V2Z^&|&TC zf{t(=YFL5RkyXHHGJx=B6|WGiB?RJUlmiYxm#RoFaeME#N`S__9J@4xU4v zXU!uLk;m=`Qs_*L*9aUmh?{u;?%nmTyT>fL)V|7t;I3IPVBhL)dX5Ke0yJT&Q`$%5 zuSGNh*-X#~9a868z>$=t>ztC7rVVKxGZ&iJs-QnfP**%mYpFD~Bqs!~xp^c)RGHpR z=qM41A#}`el-WfoRFc$is2C)8@xrQ?YQ{s&5d1_-_;AHi_FYGtcx$;O1;Pe<@DdeUPE1eVin3 z`X0Sdq6g>eNGf0AVL+3UVniBW2Xnr8#k04hvg^??8hT*o;kvZ|)(^r^;wb|IgTO*8 z^y_x2tE*3U!778N^>aufIP@Lhq=Kqy=%R_`M+ZZ%Mn423DJWLEv>OLoGR_(pY}Yn< zdf_^VI%3)&+!=wJNz8trG0DNnDO?Om`D31DU#kZIKKL4(F5zO(_Hl&o2}y)`P-H99 zubzGhqsrT~kv0KuE3OUV2ke$GF_7(d)Ct3w%nP-!a0f_mFbnYr>{9kN=%%aHU?0Gg ztHktE?t&57J#5l?8MB8S>dV;|pBh+Bp@SBXs|v*Mnj!82OMu4)mPKOzpxybe@3Gq? zPYVpY+9QE~yvZ3;(+s33kw&BbSkEk86CSa;d;xLix**S31Nf@ertL(7$#FhSvaak5+NjUW(E%}*&T&{gvxt~v|fHz ztDGVq8-)^uu9OLKE7=%(;YU~*a-P(u;5 zs-2wa_cgaPpy>k?G0@bYS&+f^33DkbkGNH=&jq0Iq}S5(7)%ygs>RFKYdJi+Pz(b( zStj|rykdaAse)y11{`#)BMfMJV^EtP+yQe*Fx54H-X1I!*+^Pc6)J0QZ)K3rYl3hY zBCfNbJd#u=mt#R-o`vb^d|EHi%LX8oJGIdP9d2+)LRx0#3Aj3#W`j`Rx~gGj9&R%c zhF%6y8xHw-?e?`NVC+PKvNJO;d$2doMq?c=Up{l}*fCf8Z~KmxRM--br!PO%2wx?z z_RoeEf&%X)M-R7k0pLbDE1aFM;N`yli>70-xj)}u(i9)`EkHzA?HV7R*ZoJXyhp60 zYgByrrkoaB$y}a@FtgP6ggV4!zXCQ;To1>u^7H!T#@`DL#(L?tdlx{I7+UtD=Wiyc z&-r({v%_M*r%SZ|$&cDN+S9}5%nZ<*Zw-zq=UFQ!Ms9Qt=28_#-R z1CZI0l9CoIov_&df?i12yXv_@z}%%at)L)$K|c3Ci6=n!{)Pq4|6dX<5R`iua6PX# z+ThZqg&E;5{@j;Oo?N*gJcgJZ z{8uP&6gCGT?f<4wfZCsR6MUdx2m-Hka+3LvO8Xyx=Q}nh?j<78WkLm5&b0-Lz<>OCO4L-6*j}+^p0(=kt9X4};IafpM<#EwXC)!OPh~8#jNzU0Z zdo6soX*SJ0D%EOhQH8T8Z{WYfajNcsaP5PQTANmJrEWeD?iG0kr4mckb1R%=VqNg# z>iJ6U`r$Wh3THp8)M_`^41zR$uq z(rj(`h9y%Y?!6vmCqbNfEzhL770&7f6R8vI90eBZZn>a2anxDXi*}@tGF&rUK+fK0 z#X2uU>!NzlcF#B6W>e+d{5%SX16aS&ckExLJI?+bB$``xY?3)QGFzc zNSR4*Rwk0?N|5M-+RV^y1uN*J1Udn*s;&CDu(O4Kb z0y2$r(ScX2FBmI0Atx*@j`)?iC(4!vkQ}l@eT)671bmNdF-_6<(BzXXcdYN$*B|EF%`YW^#Dr5j#e#cR^wo3ixab~D$x}i5wFKij#;=I- z<-lWrNjB(HQQzgD6FZPsKBa z?dz^l9qH*@8U4#MpY9#y^P}@H)eg%tB zQckWU#acFR-Hp#63f@~iB$z0JfmDJNU#$)Z_xn`b2zg0P8nrH+^Y8qcWCW6$*y%rRw)*dlM3ZvxZOy5k}C^`88I**j@NTUTOrR zBr=p=*EqlCs|E)q9!D?~f_3!pcrf3eIus~(U@5hO6OxuK*4XifS|z=n0`lKJ-&s$u zSld6|5o~hEoDQB+tu59=IfRfiO+Ae1VBy4I%f^GA;2A-39s`XDgAoGva;Zc=HjW*Q z6y(gz%oo_%=1S|At@Hf#Xt)p#(jYfg%aSvroJzFOpaF=__f^OZC2ou}W@a6I zj$ncWr++>e1O=QYz*-MSg!qn=!4Ps>-<2~7jR`bmr;VmK&YnKKO&dZQXmgTS8WJU}M8=q;Pi9vbl#Jf5WcIJolVI7uz7;?emA%4Z+F@a5tK`wK zb}-^9p1&_6^YXyccpnYd$8N}vFAv_eDtWkubRscA45m$XC~B2DwCs8vX&sUXmm1lg z(kzI#TSuON)!-MdynQJS4wy^= zzpWUnj;oGS2q3uWAJ}ZTbya@^;do*L&)fEVNAAG@Fl^BTV;zx~6%X8vn{hu;lu>hl zx1`ZoXGtM4J;NZo9h}sNjzyV-w0{P2{XIB0q+6aM1>+&;Knn21Kc-=D`*se1eom3SAi%vMX$KSkOQ6M=ggA5WDML^A)_ z9kIVvvtka%TaA0vy&!#+`F-e8TW(8jw)e_S5Gm0c+mSWfdo$9-y4tGxAPjZffeFYo zG!UaH;`RW1{rp{H2BN`BAzvT`vVjO|0OxU*qO+h)o?X0&X1mZ~rOjYdAQ$Q#|K#_qOH#T4j`Oi9SI>O7GCNN% zBoALB1jlcaYFL}zahFM5_sh+TmR|BxX&J#FhC|l`{KgKf4w0`fvtU-fFW*aZw5h-B zo}r&d8Ln1GKheXvBM%Pjf&7V#l+a14@>m-OqrSCp@R1C8>hV>9f^t2u^v_-mZD~ftU!igCLtUgDEKm=Hd>9OoA|d7S7`UC^gW6 zapt@Xh>_U7x&Gm{^Jzr~mtp343=Ir&N4$H2hh;?d@1<-qP|tW&DU#NmvL*S~*{r$o zRgP^Vqqk#Zccxt&(vobDPO3Y8W@zib23cB(1enuUtQsV_MBDlpYsP$uX+*YDjbaM& zuMNx8!3isHnqEY-earjA8|Ev)G>E!>4vvm+NKZ%)IRbJHNbKl{TsTbw9q0mh0-}mqb3V~=Mv2Xh&rzX=3G1^qHlsG4!^;k|F4mv%5y*tGq_gnX7>{W*Kn9}#+}S?x zYdwZjPtgDXI`m zv#%-LE$Y3rL_f*NYPwW&W$jY!+WV7~uYbgqbUqpOcpVU#ZI9TV%L2u2+%A z-~4ZD^e^L@vGJzw-_%DJ&;ON60Zuqxa8bddv$zyaApKt%C``)n`@eT-<0{TvBMP|1 z`uY}j-2BZ_1HLivH1B{RDc9bG!{QGc5uDo%=Y=oW{}JC;FPyXetIHv|O6YI28%F0) zH}0=xr98V-z2KW5N6Y^(uLORk^GmlihSR-Z5^Ga`%|UhU$YV9$)UR4tu5iwtGpx|tDAkbZkl9Z@XpAf!w7!I!WU(|&#sO3L_hc(vzin-8lBGQUgjC=y7%fb zeC!X4^a2i6vz9DYIr?(ZQH|Iq9}kX`wRYCKmTz&w8oC#hS&VcQP{O{@q-p2;Mn(qv z9fgT0Tr=Ij=_YUj?8)c@r{RA_0A5h#uO@m!s(j_@ThqEvJ*yv|-nw-$Z|sG!@PJ3B z>U9KmXzPphNQSq$n(Hm&Qzknd*x8~mo$h!%RkAN*PhUpCw)h);*CM+y5!XGBuUvs) zJJX{tnEKM}IZAr5W>LicbNe=*azCcEX`9}r`;T4s{`$6d#qsRk=Q}rF-gNC&ly_*1%*R%(e_cH|Au(tz}=#bx1- z4DR1camneO-yZM(t7%R4GEaSMhy8i`7%}^|ugs=RZS1CNt5``zqib)o9quacujKSp z`feci9j#c@d+El5sCD`lHd=}e{ujnWm9mSkzVP0vG-;p=m z#it7Y}VK#7SmMK{~Y(I0^ zvD{w%z0J)Xd$(WK$TSvCj}n(GR@tLoZFFAuT(R-C#WSCkAu^ZY^Z(O&s11;gRk*=i*cc< z7nk*Oy#IK?JBPQ`%OoYXrydj~)lH47$SNjCc@O=i=xA zEky?H8^Phtz&l=^|v(8c<_P4ytNPb9M*;2EMc-e5+FgHFid{M?W zQ$DZpy;pDD;8mWTOLM%#$O@Ks>#B{!tLnQu!xUG1$HR=SL##OOO8blK*wJV-v|39JJ% z94j+z3H!xD*JgY?^2QO@WMhoASqpRb{BCo~!zzE&uU{U5{q9hZQc_5y|p!E)`jHP7~()Kq~Q?o(3z4k%fiDvm{Uvz|(_Ngo9Sq zdw)_ZNS;t<5 zlATq=v3JOx=b(d($R62_T}E~aq4C^D)bIB^zvr*-b#;9&=lS2Yk=XKIALm7+Q7VjeYhSUqegpud>f zOSPRkn7fjo#6_oLly1PBKucUub0us3N2nkRfv2h7D9tGLGE^}pYP|)b3r4}x(bL7o zrB{<`cH`ic^kT?JdnTcICHO7n zv){^!zLVA2Gx@NK00vsE_fmb{!cBWTHGM5s__k2w&JXd_@k-&a06dPd9txjM68BNge)spS`lExU}Wo(O#W6OJEWrEkI}i!10kDuFS0Les)@Q~^Pxj9t`|-BEq)vZ&td3GV;3NOBT|dKK9f z_=8g-4eVNXTqSQk&~gO5C8Mz#aD?G7InU&ohNC{SJj*R@*p!jabliwb#J6hg`z7)sMFe*6@S?S~gWUdjrkeVr8Ai~wQg@{w>qlrOS2D`hBAc$7n}-_+;FP>&K0jNLY2)=x zA)@kwKGTOAS&jht9JS_M4^+tm?H-z4-Gz&RFI_c_v}BdLR&?}71wXO_1|V==g>vB@ z+HRIJ+G#>>un1h6&T#93<4&PA|18HX$yYykDwA9UF_%v%eOFV{v=Yy-uGv)fyGU%} zJd@wh5x1K7Z| z>V*_Fix9YVcUi>EbIsp-^D9J4whNG+lXlWyFxTMn{&X>ybj=*}2=z0WQtyEXDR48E zmKdGlBh9cp@N5usk&K9fOli(E1FrjWw4$j0<&8C*xo#&eyu!wv4~N*_(aE-@Gjb6f z&rPyI6xispFWcxj$h8t)Sa=ZhXzJE13S4;SIX0|)fz8O`n}oKrJ^jm>_W>LvA(TSO z>;$+y*)TusKPv9Ur9S_p1aV|Am|3L~B6<|Jmbl@JJe`HwFu602F)ZE?DJm?M1>TTT z=tK27B5WUg>8qVMRYdOt(CUw~`dM|r>Px4KETkwKi%GJK@om1NKI7FHfnIa$e@SQY zIC&FG+xL>LuuDhKA;n{_0@%C$;DUtC!lWUZuc(p=#Z}H^3i9eY*vHVT_wUNq)7z5} z5^&N+=UgDX58SGtq{BimQ5;mnZhP6DP)eQl0&rH0+^Ol9vB!Tg2LxiOVF!Ta;EVoF za&k`Wp^nuy7OE;; zBg2Ipi=d+>k~hM(yPs?UPDp8Wo)iM=qR=1@h^y}fWs#tNZmj7qL2y#N$Hj_1LIE~gowQ1FKC{0Dn;%eLEi|4 z+jFK}lB8$9{aj4Z0>jA_ZLO8sNxkxYUDQ;2RKw)6cm~UF%pR)I7bfc%3=D1Dq>~f| zLjLG&9e>&u%FQTX1d1lRX>~VX!qp8OOf9FURuk~*qbs%KSziR``qPw=!6VS~yLRa< zCI3-Sr(qS|80 zF~A>ByuAiZyl^QGLFi}v@uZgrgT|1;LM;yu4}%}WbdqQP7?lqmcXVFf)YHw@ zYlZ?12U1Vo6ZvgL6og6!6(z<1Z4y9%M;d@llk+jG?L*X>Jzdl~L%qU+@dF-pByS!T zl;rEk%OmN`)$r7%AKh!!?GZ336cZ^Z%Hog+w^LBlyUtP(OS!)9m*%RrpwnZZsapyx z(S@_tAi4rzbN5ktKeJI9X8AHuuj_%gJ7<6L*m0c{TK+5Y6X{2!x*BL36ne&Mb0N3l zUS9Z+=h3w~JgdV!2fjV^rk-*3%0Z1kp1MUae0f%JKS?8HJi7^O?7G-c>eR0VaP(tc zg~aIo45m6;opPIO<~hIZ3R#j6d=esbH}|T{SB07dMxt{`v8DHeXaTARkpJ7S54Joo zlXR(lZ_hfOF0sAjgu-qG4d9nHxl2YWcHHYqz75>Imw{r%L+D+TrpU>6J6fmk2%q;2gu+tiB=SGir5h69*xY%V(h_?Ftv>31grj2X%VUjQ>%sXObe^v*e zrr!qlvs>ZrVb^^CP}%7quAQ(`QF~5Q`Xf+_d5(*Lgk4PNRb5dT^IS%4Q(^Cce6tMj z05B^!p>(Tnyws=;RFFl+*W9pVmo`2dTu+a)3F+w2=ax8>ZP?D*t9O~Ex4obDjJ%uE z#}WTxqARJbabc|z`Oc18Z|v!P5&yG8ms}3}rmf}|+NqLrb)MujY#Q$L>4o)kqUR~D zIAnDWsZ$7|c#VFoj!0obt_&UaWezTu*FVuaT8<~K*jtj(` zx44D`33!${(zY&BsciBTe>mvOWs*h$!f4ElcH)6y6cD9k zTk}VUAC*Kz*$%4GG0evCAW%k}6!L!fusD%04b#lYt$7O#c|2iTgnUgl2?03-NFjqT+_zE4VKECXU;}^)ZePP!^4B|J3G&CunE<5ksI&i zIEqtfJ6P$}CSJWOi+BCvsg|?`yy3Bhsk}Ma8fZdKuAKpg&HZ;tM940e&5BhsHTrsd; zRk?#Juy)2gGoEzD=Z9b2=Mi#$Gf44uXJExZN34oll^z$Wck-R`GP z9CT;DeYf0NP7T}~>QB*Vd^zvTRvK_P?y1%_B4UlWn+*oerg=y8>ejFkAR7kn*{xK8 z=oi>b0?)qDvby%OGv^>Q3dh}#`!_e`ETVzceEmA(xSMRp6YHLw{H>{CXm*%MnxU?s zDDv}9_;7)PwZ#3yn;%_-GsP==X5(DddKCfY6wZiH(9j>a5&(sb5BLIzFF|`1e)mq8 zJU+PLU!q;41ZjCw_pEIC2F7{Vyc`j=3k>>3#HXazMOa}$wPx3S@}BUTvFbkXGC~8A z^H0AeAqLdQ<4VcYt#LE7R!Y$wOb`UH>q9apVNr;80* zlb!%Kb@q?}#VWEEAIrv0Q|>@#ti@l0kkCa4hNNb_SkhBl5k{KDvxE*iH4N@}GfqUB zE`kJ{MVggOB6No-KreOPeO&Yae~j{|2A%Bnb^&XB^(%v33CcaEtxkzN9eO%|m%C(O z&X46@%A>mHogKP}$6I8A@Y7_kmfjPpE&KYtLCduct}A1~o$0p(D%V;sHBcc(^0Qc3 z)ipcXxg$Bdmj~7n^(k8~q)CLYu}$`Q<3WDn(klP6Fn#4YTE|_$x2y`jsB{1Et9yWm za|P;oQ^HHcK`)o}c`tHF5l?;l+JfaN07%&{p5^x%z9adymL6cx&{F_Z#G;0ueFe_~ zOx{5I)%y~P%AG49?DDN<6Hw!2>sIV}S75jHn0CIz|F2{o)df<8gArjF=|@e{C>HF9 z*!6FH*LA`U)$X`7PguBlR0lwbXFlVEy`cg(gyKWHeI!@!i%rR(06h4EK)^%lioX+V zY8V^uGr|EJ!nk-!T?Z?LIgQ)Bo=JKs`NXY>F|S1E=}~1>B`u!9lLl92ZA!}}z!Tez-k&yI%SP6hadqt^VgK|l`tT+i+S1TQ-q%PV!Yb{+Py%BI53Hwl1z_KxTr zX}@~m?j1Zrd?o^2dGRHR8JDP{IPhj}MqOk@z@Dv(hywfPj&lh}Xkqy{6!>5;Z2J}V zJr(2?*MIf1gVB9?#~QKz8V$ZRJ-iSXC!W({yoiBY$Nn0( zs@~MesrU0OF1xCSUAKpTx>1sQ{#8M_=;`%+l3nxj zTtak1H(^8#BT&)L*~2JFn{YhH?I(c60{a4Nki~^K8vq6}>@vn@`#Vf?l>D5f+~ln; z1d(jf6W;uonec@``T}soBxF+|4ysz|E%uISL&nVhyTjpMp8~2L!DX8SUd}iMXAQ78 zSVL8kuLY>0rrTZJTtuY@>Thm&hHtan$hZatL=)>s3~K7Fq}lz)a-cs`A?6q6jjoP6 zX7O3cU_B4|+>z4-Ap@yLPz%Fry(9JrYJvq`=i9G}l}{Zt@5v%P9{Mh&AWQ7}LHGv( zp~Hx-ffp$X=?!9!c&E}aclYnBPH#KJfoQ7A*21FNM99o57Z~y|wv=fT-QwWf?`mTo zzP;Q)l=~jjRb1!!%jw7DL2(`!6?~FQ@kL;V7)Jdm0aV!Uj5sCo&`r0R&B&xOU(t?> zZb1@1U__N*G&ryiC@C)*#D+S)#$Nml=p6P)B1#mn`4=jXLhDv8ztO&4f$1{hqn;$@}tTG*>irobc2Gfc6Zz>k;RVM zu0Er*?*L0OAO@i9@z9C5#EuT#;-mRpg<^B|M-b8K z3t}qKhd-aS2rWo*uykA4JfKnOo3a+avLv-Ga6@^2+^p3%@44~9Fw|(;z#53yK z&}3dns7PT^^2;|5?gk`jOjb+ z5!tX2476d+tZ|)xL4`;p)&i8}edAHbP2>BQ1`Ei^V_qq;RK}(bxHNmHr}=j`OxOTg zQEc{M$GGmkzM1Oec5k5as0c_?O)rc_aYhtekt_<_tg0!JY4RI7|FtLW5}-)$ZUSlr zclSq6{@?RJ3JY;m^-7WtxUo*oByB*B)|^&8ZQ*PZJ~E;hBTotD>R*}Iu20dj5^v<& zkQ@Nt{wNK6IQx^XDxxSD3uNq}RFrxTf!uJrSoUCIprHzDlW1R2ZT%B{COQ>EHaA0FcKb7*)qLx4p9i zP#Mh&y5yg{ec2*3fRtaBIGDiA`ofhI0H_}yfA5$&Sb2?Tc9bylUac+AEppV5nu`T7 zW9U_*x2vlU z0A%j_I~E~U>?{|xwYo0rw`Vrn0rc5G>mCT-!e(*H(xj-qi|KRm=1 zW1$LCdBuhH5>Guml}{&IG$3P#m1Ek-y8!iRUAV~tmrwLXRg#Y^IS600t~7K4p)*TJ z7581EDzw@cIqFR%nl0@L_@c?@TzL^;6qx~`RDQ_-l>27QMtCpT2zr_J=pO!8LV9!r z@sarLLJAaSWeghYfphj7+VX!5!e67QSY%NllzWZ~xcBnAw1}JWl;lp^yLkM1=@{TP z2b{2YeN({?IKY>K!JFXvjUM{~QZY!vY`@p$GjbJ(4PX!z?I#;Cm(Kn@#K~j4e0ee? z$reEm(x+kj9q@pds&dv`kav>BQ@<20gsGv-2l>Ou;bP^}l@w!-6wRBT-Ro_nDf;8s zA0e#F2m^T7Y~o)5kgPq}zmK^HesfB`O6n|^t$9H~_;o(@?`k6C&t%@FIF+IA_Wf0h zi_e;VDihv7{#SDV6!h^nKaYQ%do{OsW){?B#Vzo#bu&o|--&iwdTac>VekWw^67ij z@^Pu<>nc2>>(6EeZh@qb7|pkdRMBFfiSs{Rr@YF6?-->eNCPR}@<+O&i^uvC>Ks;8 ziVozTXz+cc?M4hpAHRlU=u^LEQ;njaJQ!>dP(7ASAU{EOSty86MkT1s8@UI$fwD5{ zAi065i~JDA3c`K>;Dk$F|5PdNwtn$e^xTW4ACu%>Y0NUEQ&)!H%_Wi$Nr9{ffP%GM zSQ-$rfD}{#Z*IYxp$MP@6l9MI5Z_L(s}wa&QsI(WxUNVk`tNr~akFw06OY?x5w=GZ zriPVOaFq^hMgo^1IK=UaLH?<~Z3ig6z8p;zm#XZ!D3=dsg$9m839QO)c~%O^Zlm@6 z=*UkCKkmByIcz(ax9t)k6q}J3G#&;mWI3RLz3C{rg3zpm92E-qC z+NSAAWxioGi5UbH#}nK+IBW!Np}ENqSSPo~EVi__6~3!I)V~V&^9dh^)$1@C8mcr* zgCXW=-u*k-onb`7410k0w}>~n<)If0Kp#*pM2VgEbkV10Qx*>WJZx3{RH^@|m${%| z987#X9=idXCpPJE&I1fW<5yh4`6tCuz%QXP;kQizqwXP8fYt?>vWM`O*YYjpbTLmk zmtIAjd7k*xa;`QRkXP999KR)->Ny@ZHxocn=jx4CmdPU$gNARwob1v@T}p}z4w~G} zJxLJ*f9zB1yUM3;MQ((j)0_2EKmn9Nd4GH-y1|GLW@DGHmGlj>B>_QLv_E# zC5%j|D@#FL0eBS`{B`2i^>|uVpF9u8t0Aeq%{U;|@%7VT$<)FnbP8#qy({>3K!t{( zxt)26m%YjWLmlLwHvg>YOC#!kya8APaq{cehCDPlXCHz&>?!zZd4TW%{vD`BHVG!# zcUbU@2Jo96@`vM47arwm{xXnX2Q?ZKsZWeFAA2YOgaS;^PTOu5LAB_kE{jJN?nPZq zCAr^c6Q06zcy55H%D^>k+21z!NQgZe(?oychLa-#gU*8Q4);%%2{xzl{VYU8*jcz& zN-2Iscl(X&g7Esb-}Q^18=HZ~Z&92@J&{6nH`^xS)i}7i#uI2sBwhvF7Z~g@zL@(M zJCfQV3v>H}yo^5+VI`X~9)P=?Zw)`GdTX$INZp+4CA(V9P0TRWvsO3)4{q6J>Fl+> z)gPzuo#eFYj~jx^`j0lO&R>9FtV8U zB{^v8=SM+1EyFE$Op^(NJs2DDJH1}=c`0{cSJ3aG`n|-E?tG=3#d6G}ja(Z``&Wc? ziQ00f_}EESC{y_A8cGf8R_^jG*Y`f!aUq0jYWEY_SXx^zKTBIGP|D%V*XDF}Sp=OK zBZu!5dlfk?a$=NvH>GC!^4_Q~tfj2!^yy1_|L!%g``8}M(ha?0#YO)$uBCQ)eo~X< zaBuUy+(gg_(HAFov$X|nDI?fnLACFf2`B`TBYt3;{9?#6PE%Qp<&@ual@~P@xPZxc0@r;;Zvuqfk9RV>N57+N7x`s8OIsb= z=~+*g$Z>~0K+f{BY`g$b^cD5H=t~^FP>!G%7CaIz1=38nuUWTzUEN&B(Ni*ezcwWj zk1e@R<$U^+rLwX`gWM3AT#CrHAJ5AXx}QIP{{4=x)K;$}n?6@AMRVWE4s*aZ!0U@HCv?Z z!DhRtm>^stTWH57c;wxGA4RWPdr&nssqhGo5O&Pkhq`av|@6 zZe82=>X-zc;XjX(8j4R9qSN^b)iyhO<>Xtoc;ASpcX+ewN{ORoy?yop{S9SF^~8fn z8pQLu-MvF)&pX{vtgwc`doSyhXj9<2*^^&{nK#fi>VR=c2>JMV+$OkKnQ!_m!6{w6TjA*7p@vmG+m2{W zB@VZ~sAhxD4uO#V#G;0!rGwk+sMI!gQ^g)+!JkJ_dpFMV=f<|S_)l)^OfN>fFWxs+ znmpV08cWv`x|H-(D>z3`$*1`vnSN29Auf*%7y=?7+g~1EcgAqlhzL86#}29e(7aB! z&>Q&g8(^Mzt6;EZEB*8q(b@!xREfjqOSnmq^wJyNo8Ozx&4YykcetrqN{ldDy`Bx1 zsCfhK zsVZ(_=&U->?yLpbWw}rem7b{@(_bEuf|RBFMONG#IsNek%5%$AOl46)S6dw%!y~ z${W;B%0!{un?|4f-g|PHk&&?mwB2o$Kldd|TQb_VgXvoM9Ndj>tKepk@_MmP^6uzp z-Kw=p3sN)|=Si{RWsYJ)g5$lBAC%-$uICX4<5S_M+^j)>n*y51Usi*N&Ioeq4;CfL z{{bElsEo{e|2%TRpq2fCRk609oNxBY$LeSlJ*~kRx7Bp+@%dZ7KHiG56x2UF;QKYt zHxD|t7;y8ye}F6GzPTO!e3szy_r{7+E#CO(4oj*Zc#xUW$DBo|5+0Z84vo_TdbNE zrL}mWmIpPN3l}6_*P8-I?#pSb4bo z@aCd?A%EWbc<%mtD-J}`Z#@n|8iMuF>ZY|(toiWXn%hXRFQeZ>l6Gj+4qy-*Veh;=bs$pJqdHEt@~v6b9(b96A(MwCtwW~0fgrA z<}qNETS8k*ZT(@#TE zq`j$fG>IYoGc(VXa^AdtU}ADvsxM%K4lLj7H)#1P^=)Sd55gHoa&UNvrycGAR{auc z81dPgnnEBidaMM5g->PN;6#AG4tb%J!!Ia^4@pQ%Ya1KW8?5GtQ!=x%A_BY5FAcIj zlPJzpZKFvMcg8PS4YPUqE@cGEYC#6}|H>V`0YZy4xmEiO1XAWs+$Z&wEJ7e5F|i4( zdPDhYX(cG;yy%1;x@qXxB6=1J)@f)N@8%@TP$6Ox2IX;Y3;KRTZ3kN=jA)o-OEgYF zQf}P}bjf+t`+lg zS1@7QfAf$$`sF*^BYg(@d-&TzZE*)3WTh$#U5Op{W6F#LbBVVI>%f`?U=oZIYh;#meL6N1gWG=c;l%lss$6tzzYQ=Cel`+(IW-JNO2#l_@$x68Z5$@l-iVu55%T?_!Vc&uOKnqkU`!e)) zw;J<>Bk-a&s|0Qe27VkhhSB@xaFfd0S%xvCF|=Pb<(l-kM%;xqv)W@+YAW}0>Yv^g zRqTF-cvB@x*>zL6;Cb=*Uf$}y*RnRz1Wnzn#>D{*_hR&c0d)9%ZA{yx2SR7YNce7y zkPu#>t3cPOUUW529%Du4ABe|yW#;4%es+7*WY3yqRb@k1R67sWc3#G5tDC!f@xcwy zRh{<*=M-MPd}(cG2XjAEVGTecsa|PvR8>_Os$H_C7tFmuo)7v4AK}TF^W&^9Lv2im z_H^sZ2bE`TQ0=z4ihJ*p8E^ShGgF-98{7S%P5eNfbXnn)bIt!fzBvtV(7b`kDnBU|sQJCGjp}!=Aq3{g((Ma5DLNS#a(!S6 zKYSK8fWh<|nVaF0LHzMuxD`#Px9LCwz^c4c6IkrP;9x*?-2#sn*le|x!{5tCRS+>XXY$MurNsa`zPF3WzT8u=g zDy;imdNfC1^NwABO6D7ndx9%hQkAmx*qKFy0vM&GNzpyMytb*K+;v?U0z{qo;ZX7n z{eu!sk~T=q>t`LW1MCOxB%UA!V>U^K&$rZC$c zolT1NUDhUnLq8t;B(7>(VbP2bJrlxxDm5sGC#zVS^N{@^9a`t@Sh@mq>&HIByxD27 z%Lc#dw!8K4me`b+ZAj-P>YYy!_&8n~Sez5#yFc~jo+)mfG?#7wv@jgEs?7_mVjMmE zNS%;;S*60-s6JcC&dv_uAkooylD$ANZyywuc)-q}(<80U9RrAIub1nPRN-(>rh!(mh z6nJtwqpTZDbJj4>2M?A z(?BU|&J9U4$PMBILPUX`K@Tw@cOd>SVVrB_=I0!_fZ@R<+1hem&gAP@t5%<9uW3Ws zO~1S(O62a6b#&xA!ENkF_nlq^es=0@;F{~}8I?F*4dzdH?7O(f>T=gPT?-SvE#9~% zlWmP|pg%iS<7Ilses?2)i!zV-Dm{tcs-1A>2jLzhqSCCPLI9d|<3jz@7EbsF0}HTP z=fr=<*4qY8@LZt^XTErrCAlXHsBo)nCfe|}Gun@moQK=ARhFsO&W$UyumxT{cTS$$mu zo~H#_SY@^j^H+IOj-1&sZc~vMt2GQd$BMLkc+XZ?TRM-sM6)q0(EiGjX!n^St8R26 z{~s{KmL=u{LIDH2i099ROr9P+cGUJ7{>I!mriivUS~1UT5f1YZ@j;k!1Z}Oorm!H( zl1XMMqf-&uHOisz$HRyw@!yaXDHA?yFjlkNt=~9^EI$L*3u9G|A-Wu1cxY&-XquR} zGZPuNNhoKJnh@D(9z9n=F2Yl_UXmiA*6k(ro&-^Z?@Jmym!`4G#5aZ!i(z$ga&lGs z;z2LaJY5z2Q&aWB7@1^0+!Ze*V8qigdQfDLr84PI-3*5E$(-l}jnks3h3#TP;e&hN z63)9&NL_Z4CT}!$IW)lQvWvji6?%XrJ2n!R2I$3$G+B#9z|_Ko<3KK8DS3jTV0JB( zB3r~tGoMiF4A;h*Xs`WnCuA-owC{bAn$X^qQ@{T$*gKM+z?AH(257xd6Mvw9?H zqOWV{@Vvd#!$n=uJ$}b({#Ql3yb_L8L{M9b+(HFWK%tQ;D=sZvZ%UH6+Ee^A2a-TY z$Y;ylGwn%$CQLYp9gic?yX{+G1`mohz}^KbjgGPG7w(s6l)|-&zxqHwGnqAlk|gZ~ zn;b}g-4yffET_yeJFVn=V9H{**kGqm(&Sg5`g8|cYgNU48xMt=M`Nsd(X{*~%(g@+ zvIdD+V171i(F?b<0AJvGf+h8@825pEUXgU@(FNjYU%h|3$N~qlcFK`UdV$)ksslQ zBM*2ScP|Ft*&MG7aeW(PhPwmWhQ;s-R)&zLFr}{UX>%iunrNV#({9b9Pg>=`AjFbrrpo})s&crf1H7+@hYHR#GA`Gd0uLg zAP|U?=-%v}@);$aa4pv-6BCjbqT0?sle0A;D9A?PqeHdAa@!hUl%(Tj#Vd!B3{?eM zB=yWztic)_uk1`*?FqZ^%`?}3Kjc5UP+T~P{_Qv^Vw#6k?>UZQfK7!FQCm(iKrU_l}q~bHJ zp*R52XiDWT6 zJndG3q-fI-!LrR>o>^mG`{M0Q(<;1J|6vFv_g^V1_q&TlYLa~MN;%fcitf15&ILiG z1;OSye!=k|LT-!hdB<15Ee(=;k4t}f@&F+gAQ!k8edL3VO;N+9;|^~>>z423JoR*| zlL-H_Hc1;zL{t=Wa!>PD^zYQs=#xKD?=*YX06D>D z3fKIjqc2pUsGTAJU1xSsPsJp&3XB^KehH87sJQ2F=jd{~A*g#&5JIMZ zAjE@0Pg540dql#`W*U4?zMF0QgMU<%2U&`AKyL|eRW*twTBUiE+feaCw{NxH7cVHkv7LE9o!Kc zHa~*pa3@EE|N3^jSR^Ey>Eb?qS^du z)q~atXyDJ$a0DcP8)q4Byz?P6#~F@V?wm5$B{e;2Upgra-FcB3aIEnx6YtZ|yo>mF zSXtAcd2K|jF2Ur}^VZY$$%KC>#&WTKbQ=NM@Q5RQ-ymBZ$&#Tnv|MfAQc~Sjqa7-aKyOirDGv3 z50$*-{GtPJIub5{e-$g8$(kbwY;18R$<*i>@kEKTLxqQa;OoKxCM=@L1%rA?_N8*e zUPAmn=W{?vSj(tMxMuR5ByG_4$>jg>wdxF?{#+RDQ)3;+hiht3z}+)v9&oq_j#ro_ zn_eS=>z8q(=4CgrszPvV1nzSK+V+bv_)KL0sb;@@oBsDyCZ`qX0|o{L?rNP;47OUu zq=}X-MK)~v1jyzaG=_z&zNCoZAtlvQV<*bEp~OXDox%~=6Z;SRYMnt~1k{+8Ka8Ox z3rpVE7J3GV;vLym^F_+SBjCN6^_h%|$3rzTJMo}o$qqu4Q2iK&UT%V%IlWHEQfOXI z!|?v;(nAP@Efx}Xllf|)Sy(Oj2_f@_iZ2H7z=NIP9=yVK&dmleyzyPfl1JH1Q4qsDe&9~<*oskZ{Zijz37R`34e zCmh@vp$iBIIFV&#`hbpS&w^>)W#e-}L|95*Wh~{w4@=-Ny-TgGkpMf*6|K_Cl_+!xs4=2o6(I_VAH~;)c;*)4cfTtfl^162|6CBX^2bE~s6|JI@CvkdN z{BbI*z?88k1txC;!0R<8Un4{1?3inxd;z@l=o>lr$S*KYO57O*h+55~Po9g$LgR}t zXIk*;0eh^HlhNB<5z}9svP11jnVWPLFSs6s%bP4H-;^?GK~tE|wNi(p5!t9>awcHs zyxs-FIka(!0NY^uWZFOS1o9dnZu-H4t?tmK+c&~O z4oGYE#%U+_d`Kw!8h6Om%LuK58(?3)WuZzTrZ<-GAqEzBdR>#T8P%R*6_wdli@E1S zJKZL%+R=%Bk`9b{=Rcs~SkbeWZ`S?0q%DyQzBi)J*{~WM@fXN~sD0`Mc;{?Hdip(m z5mc&|PpuFZ?aF~94*4nkb_!C6-@CON`siVrkLQxFVy!?B^by62Gjvq9cH#gX1t@Ag z?lxEzX$uY#3xc@yMYbuK)9L^fNWF-rw&iP{t!8i}jP)-iZ}8+KBy24rd@&7vY4$Lj z+R;$8X*4 zFF)_bO|eaDX_Y&N3`do6oyX z3~PIM9GFVg%-gAqqG69?M?9`ez|0#y90#U4HXtnm2-y=6&)4J5GUUzH<7Q4x(%)jp zD{8+|yJ?F+8kTl`RW0TpPBd)b&q2v>zOC`2ETjLZZQz1_=aYl;@<-yhHY7-E!7n7# za%{5o7sIp?-RRnAK5akzL`qmw0>cLDcU?i@WRYiI`KDN0apNe_z>7#Pul=ByK|;Wq z1HQ?e6m1vrge!kslk&f$@V}iOeB+(OOT{}Nozknup7TO6uiC56I$LoaQ&JjV4`EQ( zfk38snkesG9Lc3+#V19({%or$i%sIu`6F(rq0@~38@15@8f=m4{Ejq^mI0EX z(M|yQKucBjDtf{*vMpxtbXQ4~N zt1L*>q{%my_tSY&Nl_cml>}j*y|d3hPHWJ8tlr?nMT=b(We@t8P7a+FD{BX%-`$uB zxy>FJ)vIQK7;2ehYrGadLN_=#cp?(5G+KPxHj#$Br(2?-%!+H6v{Ex30bi#ZOIdnf z=Eg?C22V@R42`^9aWJY&b$Bsf{O`m-S`|vn%WM9|U<(D>oH#D$*|i;`zEQoBcQ>ST z7WWG_A!nE>0p z(^YBM@lbNy{LNz5(TRS6yzAL zF?Xp8*;8m%h+|mXmWMbSAlqfFa?T7>xHnBmkK54kQu>Fo=kKN56_xi8kK7n`hoy zTI`E@D_H>~HjneQ7oE&|kg#`3EGF}hinM+$ApbzI9f<^@`^Uyl<6yTbv&1+|9M3@M?oo8cf^6a=SE+AKWK-=kW{9ch1DcVGn+TKDU`}H^ z!HS%Pf1lYwd4~JeyL3AGBMaf|?A%#SZBpf$l*te|=@}`o^`mujJTWD_LxoU@gJGzr<;y&v%McZGp0t$zK#87ARrj9B`e!meXX-lv*6lL= zHg#Wn<@=Dj|Kalh=nxiTc$1eGa@xV{C@2K38{FdrWKTLB9};1tz!I-$F{FBx?yDWv zz}A6+D(|9bg*?u8d{Vku6dtBVo!iA8>wAiU^zcm!S3_I73N6U_Q|L(@*g8y@vQU-! zwHhUf<|vd}_h>#BB4B=*~+(H>CBp`^zQ>5IrS=eYNF?OyVgf#~FevS$?hRbe16S zTVG#?)zeoIAAM19MmAvBssy~|26V@e{v$j!{60*Wy|q)2?-R4$d76-#7noDvrBF@& zgrkuH;?kOadE^%_oCZY;m}Jx8+K!8yY4YOM77t*)FcbQB&7$~R6mRKdSRN=Bo_KUQ z$61g#uNtADqci{O(K*-ww?!(GcaRs`XTD{BivezHl8lX_Gs)gHGJ%fTB>%q2pbq5+ z{!NqQp66Yt&vUA-o56Vn*`;UKLx)Jr8b;2D>$XsX8|*=j1Oqh%L<8M#F~RTorP@jy z*Dewtn|CFx^eYKHR_DoxG`Oj#?VF0=)x8GnH#A6V2EY zbS^{se*Md2&D-MEEF-gnL`%Z9=&ECi_&q)q0;a?Pa$P3|54pbz%Newh%NBSw_&Eqm zQ{sPJ27JKGC`zO-LO|U8>bX8K1$oAA9z}IdhuUcW&qbul91N5CjQI0f}dBoTy>Uo#c!Qhb2p^gnJDPi5wQJ zOU-DCsEsflJ!(+*O`k$r9K||0d_h*&5;#l$_2`V0dCLBT@edRKG_vr6AV*IB$Vl5? zkm1t(3S`l*0#B>Wo2i*^|0Qie-tJvPGT$NUzJH=WluKcKGpgv(Xk*he<}k|3GVhzG zd(Twm^N#VtCuV&j6L^Y`NyB5dqr>uqsITZ&J*SeV1zD-K?dwjKZwJ?3)v&rxBu~$t z1Aungt@HpA&03O!U+kdmj@?`H29Srpir&{{Zc`!E5mqpNVXgxa@~ z-ZY_4Vd!n431BR~>c&cN=EiP8c)eJKd>4}UI0k(7UA5=`W_{9pctgOV(kwmh3;^#u zp?uq|`052gHm^V|F4OSJ3`;^_aku+Z;i|Dwz2w>V#t(n@Md{?71+@gbo*@_9>;v(c zZw?yivcQ$&kI{(S546=0C*~#9d-4!C649=uWZHNvDj+Y-2R~Ym?DRP%fA}-;$PE3+ zA!RI0|GhE$nZ4>q z)Yg{(Co`C*eiDQr_Xi0=f_vv2Z~YPrmpA6v`efiQzXD=$OH!r-UJ3{VBiXX-KwR=& zno|AarywavMjlV#bW~_NAvXSl!uW?Apxs9pn2`H1J~ximUSEeFYq#Od&)sV0`FGC< zNoxrF@J1VBGVULgtlHpmxyi7q`s<+tQ_+-f-_rzKs$8|a>o0nC@7;Mfw5Oz)X11mB zYRmthS^9bp>U)UYyKQ%QZ}Mv-&m_wPcjO08t%uZoXBTJpiFnE(QN>n0x_iB(f7;;|Rs#0M=j2cOwfu54;IWFknd+4?Gi46R4nLLBKup-U64->QFnNlS1%X5A~ z)C{)z?gg2aSOM6C_<#Lv06y=8oIRm{s4U2s9)9=6G4)$Jr9Tei?Vj&{E+fMhZz7E@ zTjUEe-H4Mf(M}chYI!;w4h6LpbuaGS*laGRbda8SvtrHj84W{MmH!d&l3Ir*S@Mw6 z_O(au3|Tt;bK$PZ>aD4e1}!!`w-y>;3tDyejQYgbb);yrUvRwfa$tWRmS;Ce1m!Zu zYaIW=%=&?H4B5;RV(=nj%Z+;Mz~07H0GG31j&d_tEuJQvIQ3ryRvPBFuQMJgWaC%o z2a~+EDjnZZnt+Pc?6re-N+W9ml_f(d>4ZD2gP|delU`S9bLWS*w248USVN=6!300G zV-fRlR@2K6iNlt_X#r{c{wx3xlXL%3FADduJkxh;Z!MJMvc z{8#}Jzc@boy})o)u}$&AeyXr>T>8yxdAgMMa1uyQh#_l`T*Xf3`gueF*MKKi+H=jj zEi{c46!zGppW{Ri+DK~njffy?*5q^TCG15aMdco5Zz2X+9M zu+1p%OJk#q`dSxko7xLgxs7>3{{0Zh@H}4O0z6Ti5@D0+3%2a$qnLtB=H6WGz0IJd zS}upZ?*ucas=A5@$J!fUyFL_MAZ8aw6TUb8@o0i3C7IpKy5f`t8K@k14@{kLi}^Z` z>U7SJYkE&vN=N+u{1mR};gSG;_@89AlhaADnjm}5R{bXTEng?KoAFIw)unw1cSA+7 z3jiq5e^O!s%D4~~jNlO8{g9WmAM>28*V5S`3n27I6S6g5ZkzYC7XBJAulH(=h8E5{ z>w`*HTurA|?o;JAi7G@qJUj|{g9@xKVfB(APir2_#q`E=O^#J02>P?p4v(-)p1sl{pMil3=V{7X1(%bJlvuXdOtk%A1Nfkw@v8M#z-w zS)L$7TtP|{)7uMAzE}T_dUDWgB<}OQ-GAxH8sb*e`?N<)n}?Cl=j>-(VO8-}(Y!gp zIB9r@e0WG5R3Se;T!uiIf8jLQ-uiT#>cM-G{`{e)7^&Q|;@A3b~E;F(+iq#-M&l@@iBpYk?52R0p~`f%?%mBCg?i$sUCWViTGo8 zKm{E{#Xk6lO@vJ!(IcA82O+?>Z*s^TwYF+nF+`H{#!Q{74$VnM=yp!clY!_=i|!Sx zP|ZpfgK>Q0amv|nj>7sHIz)Kd2VC8rL&0%@SxBbW-(B||&kSAd!M3nZ0j|%szzG22 z!IlZ?Fo)YWEDttQ^me3K^H~F^{>2swm9Pc^dOe*Vv$>UsfIVz~A)BEE$lE8h- zxiGNqjmw`|jaxqL^tdJm>ZU&|yJAE`7co~?Qkl8XhlEV^qva3ERPK_p5jTWAZ!AM( zxpDOO(AOk1FK}I9AoLA!CdyDIwfCZExFLZ(9Vr_ht$LqAZ+~k$pca9aHMy<_8o&G= zewq-%po<4+Xuj~plJGO|=NOZ&wq31H(&Yzv3ZC_QL*{_Y@UW5ZG@uy0c0rW~_D~Z$ zo$<$HI;aeX`~Uies1YF^1xpm)wPRroK@X%oif#BaGCxr<5fPE#hOuoke)9b;IzL@B zx9Syh2&_EwtFPCEg>$dFgeJ8Se^(=Jvv97%PTyxr%{(ip_Ds|DO;~}xN^%)jaE0OR z2LaEp!wb-cV9AI;9RTQ#+XH)N9UH@(OJRQx(_eMW(2aRwBt8y|LCO)!l-LrYGBh2% z7%9%*b~SvnS%=E!2QjsEBX|Ig$E*n_@S2{TR+zT>2Ethl{X??IWK}i?(IO4=`cOvI z>s_Uxfi^62AxQ$%CW}@C|NV_`RhmG)EETV$s!Aq*h2|mdd@>uE%&NZ|exavbn5iK3 zB?8^=KU07FWfKRr212EpF~Fd)0l0M-FFK7bv4|jOvmUg@kk{yq;m5C>I-6M{uQ~!;)cRVz z!D%Lq>`FpTw7@1#kr#?PR}zeb&NG=FA?>!%AjGxCqV&3}=+3MeEAlI`@OmGLb?o%P z%GsSe1X37W_rID|C#EOQ_6*2@18NC0L*u;kVgJ!aIND2nSiKYOH(||4K>MKsoz1U` zN4$Ur0EfGTsV+ZCp+`Ac%S*>ek zf4PE-zN(s)`Xon(_EjTmLKgZQ6yg3a$Jtk)uKEX8S0xt}x&8gV(c-$}rJh(Z?lLAb zozzjw_1^Q-Q(fpxIdujDLbz^nLai!H((U0Ebu<|f|1}wcf_IpXXvK6f z0Xtj$>^F63p&8MF?%c6Z%qZ1m?+z_de3^;g`)07c7OLaL;(SAhQ3?a3%#p)A!Nf>K z1^Sc|;P9xJd3ruoR0}5))l2GZa}yz=Vn|ng{=OK!qprv@GaZ?Pyfs4lIlS9yg%K(rMxP~dAJCu&J}V#R zT5qb{Rs~M>U(BcF<#U63yK7^pvN?aVo9of+8`Rs2?0aWG>SHDvI&Np{r7^xhS^VTsVv<@6l9r@=4@7naPD&aY5%^=iYix>k0Gn2bYiQ?UfiZ zFVYTwovJ)zebQJWU6pD$-~4bVkFlK&VeAVpTi2Jq*+=a8fuc$>&A#7I{nb6e?Vmnt zQ{lKwWB06Zo4nl$0ZkInhRPQ{hX8;8Gmg89A5X0vE$I|O#h3%P&$0VaN!Y;`+K?yy*6t(qVwN5 zQs4?B+(6Wn-phS+CW+2_H~_NSqDF9(-T zA*zOU28M1oM6#}rGE@c^Rm>vYcQ+;+;L3urks$VZvRe!Ih^oZh?}?)>IUcOL!&JM7 zGS^wXCG3F;5m#m~dPJ*zp zYTYYZwL8;*p#^j??~(tHANHz}PswgtWIJqkqYn`WFt>$Mm=)H4{7By0+Z+2zK{xAK z*p0F8q@-q*t1C&S$r-W_5->;nn}2vEkYVgt|7=3G+MQKW9;^IH%F1x3gxeQv=jYG< zaDNB|mCOQSa1~QD0)prBAjr*jCqlUOJCFc7c#%r>0sCe$yWVo?SI1*t9ZOc%)J_p3 z4Q5X4+TH97jf%dv>nJ5*2(HOR>hCv%C`=Mp=7Xhz<^Q{f`$on9g4P!hzbH3!n4PJ&hzoNcZ%x(h3Sn|(=OW@WwP z=C)W+Zn3+YF+C##55dXFc{xoB;X5*N``>o(d$hJ5 zfqDyJ3m|5y5+Ss z0)$E$O>=@QS(4O%<6rg;1oS&W~!R`gET4 z{0T;6QqmFEbDuM3htlCe7)^!Ghz4Xf{sVlgO2!#UQ6j`oGl*zGCeOd0Ew33w91VEl zUMv)-te$a3_||#Unnu=)t)k6JXX)~F%FPw}L;=TrAVQtaW#RbzU zhQ;=HUsZ^JcXXfYF+U?K8`0SKkIdRk!SlF;`t^5&>N0ztD~s!l>Io8lao;WBfs-ot z&N;?SRepUxb5Bd`S$0Lk*&hD-)2FiLYp?ebBF2s$egE;>8L->f2$GrIC-zUwz9UC3evMqx&8Tnzwa79Jr2IT8TvH&^eoWw%Emzqce` zIXS^Eif`SLAp88q3k464vSO>UcN#|ozk&^AY;0_DYRVtk$I<)CLjR%`PODM)g(T$|mr` zUNv;~D$)E$iAOE{1EZ?WBi?JuC`89nJmz@-D)xBq7@kDu4AX6u4&^hSFfA4lYGPq= zahBs}kF6I}b}3XJU!55sAu#xS=&eFq-P)#8@Vim>4i_ZzS^Or(fX5_vehB7svB&ub z*|Ztj=iSlI(kl$@0SgH==?&$cn@hc=NvsU$#wAf3vdc;VR|XO>rB_hXCMG5+t0Vb8 z_njYJ?5U}#li$DlX{jh4_{Gf59xFtnPsFQp#;N(gjzfN+ttmO$mzS4EMD#W^_Evk0_wMqqMGj6^sSb%@ukIjy}he38S7E5 zxh0r+MbDZL->+AQ>@ZSq)}a9BWxC3Jt&a-+wQ20GCA?3#k7;$2rngW_`d>^V26;{V zWs%SarE@g?rf-P0h`#uIb44CSjH~X>D12XmOO3Km>*&lci=Q<_38+ybz(z6`d%X1V z1;W^yWB(ZT%QY$J>odc_03d=~qOw$s!l@_3PZgTDZavVwKo#A6N#5F9KRd1O+*W$&9u=+Q#p;_R6YQh~w!B8N^eciLWiJvWj z?>=LKpecu8CTi?KPhex8!lW$)2TkF#Z7f;~D4Qrwwy0EwGV8>woM&e`F0G)?w3crA z7%@ZT*wqd&A)SWKUNKW(=)-A&9g%&%4e(JXIVs_gO|JTysI#HRIoZu8IHj(m4#brn zGoV91i-Qke9VNUrooDC48dnFmaruE%08F0@mD^2~;ke?UE}Byryf}EClNZ@*z&LBw zPM(9^v?^ak=hS%&F0pNQ812v*bk%JQuE~|pBJIlll|F)BE)sAJJPNS={6(vxlsNl7IM3v*lRSGrw`v2!LvY3QG=i!Bs@%53)tb3DKDS^Mn4vs_11 zl?|>4dX64VtRj(Hz#Ct>SH4y;e~CAyM%8FjtKVyF;80L4dVXU$Lp}ojgO_{9n_EOp z`3s!#KRDN)K-t)2LHWCXrN} z#|GA`zaKPY&pc^)JHC6=<=;BzWhbiA5vGLBJdNOg1BqoIi=xy$B+=0Twy-4A6SQyX z-*Q|aOR&4!HI(HYHLYXRilHsMak*aM5QzY6!!k%?wUr4e1|-?FumHr7+zx*v0S5hA z_p*LY+oqr)(|+xHk=|j5_W&F;XpIEZ2R#(%s7V3cN*q5sB+i4@ zdcjQn=qpn|?^2?nY^9Y2;49ROT{Yf@=bG}RKzwMRtMZP#5|ER0MPI#h)$j@LxGpqb z*fUUh8|%~alf4vE2@ej&klb3L=|Fy9($!%C=KTPNyYJy4$)b1QH+!R*-?5ZVfq%ZI zgOO3lg#UWQlRPcb0f7rMv!q6=n>P@^0A-ekeSa19{cV{s-nwLT36BS~KaW7{AQj(& zweWM!elx8v8L1$1$EYn@E#k3|q13+4J^~k|MolcsSybP&U;*fP(}6!4Ly)R`GeIu?O#bGT>$kJtS8RU+uIuPnu;r zeBB~`(nAWx{J%fgz9lLENe1UfAs4(5&g^kI&Kb>}|qb=`~X6Ey;c3YW})!>dj4!Y~49v_Xxeb^De%WCQ#f;rMK0 z^M0Ydcupz3i7}3+i{7;8?NrLVwEo4*ih{`7E=J6RHbiDT zgcm7UJhl=FY#KZPCi-m|IC`f3>HjheSeKbuhgZLMKCF@O$wbD`4?nj|B>W}iDWMYg zulJdN7lC3e0%&niL2w)2_HiRDVzsPpGdy!LwVBJ{GUIyh@o{*4Hi|{}7D>CkH$K6*#Q#KwjS`e?CMVtboFF#oaljSN|3W3;iri{Wg3`)tpFT;bi=;vdylmun+t zX48G#nJLrL1(^j66XjfZ&8=F15G;`P-dPWpw7J~9(e`vy(m;nOdC26h67@v*b#|m& zKY6DX^Mz}+!8PCTM_NP!ZWMmXhiMi5zZ5fS_R*{}#(!Q;JmA`30FuX`gSj@^Fi(}2 z>53Vjd!c-Q-y(<1&~bW;>wQjlL+XGzZ+3!i`f*}|qk`aFz1W_kR5n~=E!GT@gyxRO*lk9xPQoy}J?m~bx z$E4Lw{Wj9)@uv)ci%C;iicgo>7~a3l?x6+a;qAC?$wR( z_tH5?XgSzwK9t~?;`uEJmnqucgC7brdSN|I4QQ`QY5zBFITh|Pz_*U7(FYv8w69GW z{&w*nmTqc8w0j!bPsp%@{Q0c^kRTQ3^{uGm*=l5=7X5gkHz6e9PwT4 z8^}y~veTga#fKa4Ldnk(QAK70&`l2HTdcq>%Sx#$!sFezIw-Y+TJMv4brqIxUvafh z$nF~zP01lFU`*o5y%Q&n?eEwwT=}1#d3xpu1p+*I?#@`L*Wm{@7$rr0hKNtANQi3^ zB2K1KqIy{`O60B!`qeXnmTH3efj_-MWZfEXw;R{Nt_h#LZy0+VRupmYNMCzD+JM-S zDqba7Hxuy7p=Y`dy+f};GaNv+B65!bk^4qAJV2T=tP}OQzRIEs1J1b7E$74A;?euB z1n0q(_-vWIFY&O*ZtLo5_@&+x6X{!_&-r1-uJNkT7}U`iTKImoBMBDS?q=bB;$@Y2 zS6yBhbI=Ue4buD`OITtDLh^9GPNvwpOxDi_h04nqC{)J$p71>7mE(AJwOnPwP)7P` zzy!0RzZmdaob)L5V_$l!^4@GQ=F;K6I#tZOYIs1&i>aSDnKcGO*7?o**b|w9$)IGe zzj%&KE*?7`t#kA{sXFBZC^64Y4Zo0e0JWSjG3b~HXQs|wxb@MH=H~~2w9_v*m1Vy) zQ1bDS|GjP|aqC9chY8%>k4#5OMd@<@AjTQBLG-6a3>JHdr&_}G$JrcOX~>S#=ie+Z zRh%hv{Igbo-lfbq$-!X-#w8i=Qvsmbw9y}VxO4bj%^NCmb`~KM`&IP-S>y?p9=c0a zn33)*F*7*2FO%Zxl@Lb1jw(?JJ@5^Fb&UJHAKk&UB(|8|NheREjhv4(a$K~6qd{k_ z{s@^g)M4~FVu&r&fu-iJfE_rwSy+A%pa#q_vrum|N75k>Ab@LQqI$b2yA-CQGaEVb zqT;Y(4Q0k*+vC4qGLGHnc>oNqbDf$wpZmf!AfRXFBLNM)(=i`sR4xTn7SOIQD_+9? z(}(}FUa%TwV#%&z3^2)i|7+F=iuY;NHKgtwd)`ymwdVX#XD4ClNg5Gnj&6Cc%zxe+ zVEYGD^&iuzqoFzmo3jXO4$i}q7Gskr?k~LUd!Vp*6&G(+3~YV?|1IR7sqy<;7iM}Q z7d{%(Ph_a%3IsA!z4dOWb{?#250He7ubsZ;dc_&VuH05>YU=2d<=^&s@;83g_J#PS zI(vHx?^#(6eJJ`^px|(QqTWHz0?yN)`jNH0q5|hrq*1- zr3SF#>H)Lx3#Xp^GSV4Xf9hlmaI912orh}IPm8qSz9}C)*g@=59>kTC^=aYwNng_w z!`!fO9Qn^wz#aYdjBs(@FFg+meP`M_zvwlKv5M2Zh3VXPok|iTW(_$G{gZXe z#>228JEH%LUctrQPPlCQj}YEkP+wLWX}?Qz-Mk@eq3{C7C_ndQ0W*t~2L_E7t1$Ne zo-Q@ce)Gtbb9jN)jPKXr0Sk7}WC(_UTcRrny5$ibogc7Q5+m%#{7yb@``U%&z2PZy zzf{U)VQRp^8T}DrS13|0FkgtQ;sE!ps8E{>M>D15zQz93>C?X)GtWAi03W>km5(e` z2O%tR3m@TJM5qHr$oV}Byk5q_I)X_xL4%18j8%E}CaSalbG|}(by={>1$SWmY=U8o z^lx8SpjRkml zCDmOPTZpLhvdT?*0QC@vRBfn$K_zin5whlh0v1%$QMQ_$rWBI=z&rVRib=mP?bpQEj|Tgb z5%9-%M`=n=4*>y;%*+AvTj-Q8sMXd`?LBA}7hKS-9c)Hc%P}L9Z;*dVb;u=L43CBs zggcAK&VPvap@M3?6k$5bpffQpnv3V4semjxqMiv0r0`j70p}H0e%Z|rj0NK@$=TIE zYf5;$BM13;@PHm3(!b6s`&WU1T#$%hX<6;wON4-(ML>6a$K+@n>3%DjEK>4rlF#%A zdAC8i*UR4p@ct`5uw0|-ffD)kX|IdPM9%4rZ7&?U`=bN@hFjAQxUTdJ+VUZ2Fu0U& zO2#UjE8O0^>1_6&oewk#-j00#g*?Q8VQMNTv@r;a84E-2Wso5?L$*UaIma;n zZu!S9;zeO)BjoAd2k8H$esla9Cir=S^eMiSj&3<@@K54MeW#>usvah?k-!AEA35`T z-1oaf5#<|c{{xY5->rG_EhJq3lQ{i(`w-3RIG+^s7Swp)^{i^o^p>Raikk~6r%Ws%e@gVZ@lI*MLlV(wBoM3N}edCYhR zspjIN0O!0H8Yhh}@+4i&wC$rg3~yoBl0cv5BnM^s65WhtSc+(AZq@t0`#IgJ6r?IR zfMu}1U9n$<>%Vw6sJGDPO6k{hsC+#84KuB0676RC(I3C{#>++>;RJyb#yZNX@oX(4 zBYu`LGQt5Paib}-G5AuZC!9}ToK%0%dW`A>OD;8FuaaWk6HP66h{27N3X2fJkxeGL zp{f;8D2u+Qgk8(iV|mF_{GQfuz1Nsmr}`Qye{uqSDL?`v;+HBtiu(sa{29o>0E>c! zew7Vt?x>~WH#)kA3$ycd8sL3;?om2p_0FHNxrO!!nH1UFk;dN-_fuB%2Ye|oZyBxf zBgmbdU9prkWZU1cOy~Z+$*j%ncfCAYL z1~=LqtIgz?la%xeB1u0J-&`&9HTf0dl?A>>Z;Hfc)`m7#2bQ_W)FRRR(fFf26HOg^ zLxn{YTT&)(=D@-cml783e0ahYYR5kc(W(o#e8Too0y8^WR<@zvgnKTO+H z@=mDWX1(JibJNIBLb0z!YdwXBoD8Hq@WzL!-c*br6koe$l|2us)O-eVsUh@pBq z{Hu9z^!y%j<`vrYSvh?{+Sl=-x(*=o7^*a<-#u0ixPKob1+79-SW{c*>or9bg_{(#) z7GuLA?ft1#5dY%PdmB&A*xUMGN;_%qtc-70=0cUe)UlF3H~Ug?&z&+VQFUa|i3c=b z*!io{bLAKk5~*iK&-mz_?d7i5V-p5u%J6@_?!V{C1BK*2b44}z?Z^f(Xx}KLn;^`9 z=ZmtXp~36V^~dQ;^HcHJq{RcGJU8yWivL)P=$4pQV3@If6E6-C5uF&MzToOjI{nd+7famuCO~J zOzpqT+?*Mz^l3X?!PX#if%v)6sJ2p?N6O*7&X~8m$0R8K zIGTF1e`ki9O-dwULiwz__sM`}#X~t2cS+`o?>G1dPN6#`obDokku~+vDR*^Ku=4zC z(wwb-o;?_{^5M=|sJ|}o#we(&Hr<$~L<;}J{kF$19B@vY+V&1p3V2{jS#?#)t&}Ej zSsUpVv)9B#t!6|EZQvU4<~tP&$>xwKUxLq>iyNGw?HUorme?eU1p*znF;=18pmnps zE3I9`7e$C(F*V&bJ{y&%c6hAk?5TXS^-^ypQNz~=gkFu`CC*nis>yKHS)U8WSRk^a z5xpiCmJ1bg%LM!rVufq0b>CQ3z$w?i^N}07y3OdAW|en_sc>;~`b{dv=By?SVBSJZ=E+#F1 z#WSL2#@f$O(H4AChX)Nym3YCDf*l=e7DxzJiM5E z>=j!}@{C}``Lb#oW&*KL6gX_!m?!`fFfgipDPX_x>+G9pnNfSt+Q(FlUFD9P2_Bn_ zBw;7(vrk;3uiM23APs06#y!DcYKQi9gK4 z^x~DcCTv_-2T`^c|1R|O>HcW27Awhg(@Mw zenHKl+6kzIT0;kxnb2fD>Y8K}qaMcvI1`fvnEYMZE~h=7HkHwSIK2fb){W4hYt?mX z$^O@>FJ)b=zJu~7`_2LL`F*U6+TEt-A7dBCuV$@E#fKb;oC_Z7jwD1)Bdg~y@694| zVaj9ovTXak-;z-+Ym6*KB{VFkQ77&U9>FeuIdm&uI@qmzo9RISWldy+Q#&XhPc(|= zF)@g2P>os3)d3;lu40Z|doAJb1Z=8BMQ17Q5=uBsaZsowN?v+C06uq1PVS@T-`SMp!y{S?>&>NbU|@xqoi4)_R3VA9?13Wr&|uP37{ zLe%q@5Z@RIlu^3-p}UW+dUx*f>@@7H1OI*xXoCxNU@;Mcx9?~h+ zyWU80w#mdAd5EGV%hZ~k?pnbNuf8d@UrM;~t`?7$PY#R}WqLJ-NQ82HwH;-j8b&0? z;oGF$5RjwelT(kHuy^DS!);2oCka||5-~(JWL@*N)lHGkqeNT1f^VKfGi;a0)G)!u zR--mZgy_%Bpp##DyfcZ6IIgprTO|A8`vZ#5gFP4U!H$r1?udP)6_+bin@qINx=8XC zOv`2) zvbjykvEsrJKJM;^F1B}A`sY0g&@t?YkdAaq<)nwymXs4DThb}Q#9`?qC>@F6<17gH ziFOGogq+YCc4PE@P=>%Fn0751E*`S+?Z8f~S z;cpSIQ$PJ}Okwn^vpPpj-B#~WC?C@7Vn2~Q32qS_o!ep($g6r7MO?i0 zh0uFvNu#En7&ls#<=?ndtXYnUzTg=d82}PWJBeQbd$Q>>I>*HDmtn&YXxLPUXoK?=nd62 zz@i-;yweeBv^CAWUHNC~hsSm4*Aia5+u6~6|4bIqp?O_M?u%cSVHcbli`Q?ZZAzi0 zIgY$$U}Hb_ynbj<{wm+2iq+nD_oaw3`#Z}1m);WB9N1HEv<_HdUL+(a>Ff9HpPoZ& zZ4kE&PEQAk!hMGUUqewsoC0=yY|{&ZbqPTA)L-HR<)htf>?}yxPB-5@LaJLlYhk^@ zOz|k#wx5^izN=UI(DrBncZr;BZ(k@?`M2&Dp*pZYcPFR4BqU!1;@NxIk$HcQjLSdmc!ow}9_AT~^BPg3Uvx36E1c4!@ck>GxarGh zC|3PShPc$#kio|C&PPU?7||U~KDIOD!3>%lopE#FsW;B#}KxN3k$2F zo}eE?+q}Ki&RJaPLyAQu%+1b+k2KuMWiFc0$38;8I^B}7z_7M#DrMxS)zPL~xtzs0 zsq#SRy9=-nv+kb`@CTj;;OBxg`XiJP*(Ii7hgK|Ux0j_Q;<{W$#=Sk!>cGGiwD6yf{nL4P{WIe}D0z35rT)Ep# zW3}u3YY&YP1_gW}QQNI9-R;=bGFn@4==_x0(|UY{RGA0F;&X=Q%#{{n%#}19-;m9* z&qa#^+APxXH$8zkEv z*Qu5kdH-LF9=AuwHa}$Lc93x(ak1-36JD#=7qg-!loSJ5rt{~u%)>9B#!cMQeJg#8 zk3dmTs6?<{Wu2pkb|142sN87o(OaAn5MLV|n=eHthv}SmxxET#iv4T8NT|X#LZd>9 zFmj!2WTUf1vvrA;JEzJQ>kZ+QhJAivsB&9ox6iQUwmmOZ(&oIJoY=z{xxVl~mhBoo zs?WZldlkhcDLp!Jnw0Sd_oen!9R zJ9i`|b%oQV@TVPLy%dB1kBkPV_2r8J2w%4f_r0t-zLu`_+MMfQI+586xMfgOX+Li^ z+vG~`%s*olky0e!AK!SyGop97sslRo^+tyI2KLHXrGD33)?P+j_3OP@5H-f9L0N4y zma!u%K zZOMwFkL$PO$hq1CUOjKPYPdslf&?qJzT~lan|$GMZM^%esPv72F8Q5rmNH@zIA3d* z_b{XPOlQRv5t`RrOz+y_53}^eDO#TlR;W{MG^{w(5p!sy%gBqI{r*nJBr@!{_KyYe zA=Y<3J4F-1F9fr{n+M^G4X%B-xE}Y6)z_5Ab7$jB`NTY1wHns3*5?yX1~sR9!O>rgr9xvFP2F`g|^ii|s_)OQsWxbqzwW6IHQS ztSG&!ZPKt7sUOanmkr2~m#6I0f|(yVLLok*U_n41ZFdbTcA1X%Dnd!bjL-(1bfkn9 zhUSAv>Ux86bL#je%<|p#u+uA>`3xyOV% z?rTei>RR798UZ`t=4*eUC%v}NaV;$ z*V?d~_ku90Cq}WZeSO`nWz?;5S>{y!SJ9n*SiOs7c3Ap>MqxnB7PS-I8C%FR#ItTX zANyZ30`4yOH6tL9^b9fCv<~t2Fu})n&6zk@@`cKLzgn{IO_Z6#R2Z#gbszCtr7QB8 zQy@+(uLRyky3$VGcChQA7c0x6h!H<+RW(Y2((QCB8%4_GCijilTd5xqho)$}msWJf z284Q|l1xXwkDT+KUD6oEwm-4nyjOvw-dB;;$`&+t{$# znWz^FrWCB#)-SzFZNJnYaR<==AL`*WLA;^#$mU9pB}fw$1)aXYr62tsRx|`p?twOA zaOW`rpRGLX!am-!xSXHwBkJ43F47K#(vgqa`%`mnd}gB>ao3>Pk~RS>>`{)p{m!P| z%~-8&v^4`uQ%!u=%CM!~?wBS+VuvC}cqe3yRN;j16(8yji@j{zgN!({9%i?~Y3Q6+#2K1+ug9A^ z?TF2f%m8Z$d*q)Lxz6oiWaf&p%vmr6(ID$>}Q@ z#SBSF`kfBa0>Pe9#TfTft?s6}8lju-^YY3BLI-9wp~r#J;rlh>B@Yymr+f_KwJww+ z`4AKYjcxpL3mO{PmPoz^%mQ{^KKvQmoMPS5&3C;D2cQOy7Ahw@0g+p=k0xjm8Sy6nm&H~@w0wF0KyZmBG#d`8f zR{(hZeK|)(N(3f0m;k?q-VIaZPqe7~`O_dlDc|al)+{qN@ObSIhsyFVuGRFe|r5aa2CZwTC z$bN4L?Y@{y2^m!_^O6xh_m{V`QVDESJCsaf%#}?BhAJ_aMl4PLEThHnC=B}VBt6UQ zLb3HA<%bA_yt@~bjrE4~u>=77ciXjn@x52gNRqCtpxg=_zHOpR^#Sc~i#cT4GPA6v z!3@`rRXR6NLlH1ls=K$aaAbF_!hCodO`lhKb*Os8B5RW?3=i#Pb)+tO~L=1lhA1yeD;|_Wa?=)Iw=K+)XO)>?8!1-UfOH zrUK;Kw0YN43KE0u{uQ&D<+Gi#?t6SxoW^`I-hzQcm0ROkm-t~?PUpylRFGY}soiOEpPZp3_w6z$_z_RCw-N$SI*h&F zoZ=yAni0O-pikxkUS0XLG$RP9(G%sffgX$ccIEWZz7ZKg?bf^|bqbWbL((}4$}$fM z;56BsNL1|6-|(3Hu@A5QOgsY?4zgzw5`LvUe%A9^ddFCZ2e6B&vg3yTm*Hz{a5miL z31r9K6Q^{kyX`PF{7_$Gh=RnX9NM1sCAa=?-PZc{T5INz4r;2AJ&%EoU?QZ9ltjP~ zcDkf#z)KJB|MQan$OrV^6Ag0(NkJaTP$C-)%2gXnEyq``hzpTmwUcpvzM5^>;f2 z!gs%NbiTCf4b)#nSFcdWEwpHi^gDYG$S21Btn;Df`Ayw}N#v(`=~*X-&W|IG{NUwa z4uCa->wDL{r!>nKTjpv>_P+CYuJmYnX4v5qSMf!;oEYZ!d8Sb6$=u;)I^j^-WFG+(GKqI1m$rat8vEq?``I^q!^5(%rS@j$$P<>*5T5~-y3)A|Jl|7ye4qEt;YUsYvCJ63GH9RA4M?xwJHBsmMFcLw$aHlAENXchON9!6Dujtx9`}Y(}2j`0C+i z67lu~`-jVawi!SRe$|pkBa|4v9*Z*SeJYntamtAcN_+=I6>EdraTZ-HVinfI0=jwx zC9&%APS7jk`(vc@(Cj}CM>d!MkTdf6qzR`Cj!8;nldT+GLpS(Cr*NIYZ!bf+1u*9N zlJEGWUt^T*+J5}0XBC%;4{dA(SFdFgH|A7%3SH~|%}-L@rn6K?eA8g|*9#8$c+lt&-oFjklgBD8B{wW>SI^8bS7G0 zjGY}a*2-rtpOzX+HY<{sj%!%rJVs~}2mn+8mNi`!(}ugF6fiZjqS70^vkj#S1PyKo z;`K0(O&tR&;PKbWXO54aAi*^d4Nj(Tg+_IzOvX_Z!SA^-kWQDoIzL2}_9aEWa)GQ8 zfhgWt?PHK#bCO?kn%=w#8OsoV2q_ppzvD4B_hCHG|gM@J=495$?h zb(eQVKRl!TdU$L|wrq3_w+r-3~g$MvA4Wg1@yvyzd+k|Qe7(f zZDB|bu=2rzg$@tl4Tk(e%qOtYB@p%DzMx@O3+^7y|Hy>N#ry3Ej5J4ond}Lf)oLSeTguHgu9Za}}tTQEIq14)=HAdHa`8tpjZd+OHBtuaC zK_ru2*r&-d6`pIJhI|r4tYq^ZUvG00d9E#=1UOu8acjQ#KFO+^qUP)M^_jJ-`Q#*I zvYkv*wC=N?309z-!953DY13WeWIo&S47<$5BISH2$Gwivs!uVsji~SBlSY>v{{N}b zIjfkeSw3|=r)GToB9N8S%F$>zq;toj4Z)hPyJW!IBd^EjXPcHm6l#&Z|0T!#iUHg?C=*-i)QKvBf0arsP-nL`82r7 zt;}hJq(2{K93ESX4;1TYGk^(nE!kfo(CxGV#h+PE$7AdTrM@D#5jA$lH9E1Yt3{Qp zxJR(ZU6m&8Jtn@e23KURha|3t&>3YI2y#AYz<(P&;VH-ylnQ^29S$` zB^S3iFPf)Y8@YK!VB4mgYwk8$$|4;N86X^B!OKYP!08MZia`9O&}7pugSV5<=@h41rQt$L|BIaGSq?g>ExGg`S*>LX;;94Up(@VIrni_ z_LCn`q8W$Cq$1pks-_mIq{If-@2l_5(UQ zJM~<8^WW03w+yV2$cMQ}(&-yH2v2mZm3vl%6L`j6o<6;Bdgyh+$GvA=EVXb=>xE<~It6BJ zADKREl-CL^oWk{=w)7U|hwgKx;Dt#Zwr+o~h8OoZ%vYrE6rwIP%4oa)C{S(N?*Mj- z5MQoBMJ7@Kz`X$nLRdQ`_RQIBY-B02Y@7g>l;Ev+w9%7y_DT?<%xgHf?tU7~}}-pSprE)Y7AR&IT>UI;ZEI3(#gZ(ymD zGEb@YElEgfseIy{#O|p6&LI+;?ZrM@#jQ)zW}ntJlpiicMZIc3bspNC(6{qN3b4e1 zxUjpA?UJ?gMwf-sL0S4TE)K#(q{(y@yT^GR=vi;i4($pILgOyLeG76X#@xIo+!iKN zqf8+71MW-Sd+3H;ig({=GQxfv?eKKEZuht@pMQCE^_Pnv_N5*6n5?WUJl-P5eESAz zvj)S$mRsWay7ppdq6RnpW%;n)rIVv$L#zly`9}J!WsDN_u!p&-K?rtwYP0l)(=F&Y za9Ek6m*+Q+i5uIy?B!U9vk4#rZJo4i$>fIn`|4|0a<@T4D(E?@^#%o8X>ZPmviG>MeV3sd2&uU1?p4#k?RX)IzaYUd zvztwV-{dNNf&3sV+5>2S1A-zdIYW&~#@?q;pJmtr%JNeBq=|+HtzAh8Lr5-xbE$-{W4G7}Tn!>8+phIPh!K+g5#nXJy9Lj$q$ zozwXj$@&kNCw0Y9!@ht&k@`SpvAYXWqrnaRd*Hf6)`C8U;LoYVXex853p&0UU2Wf4x^wJ?CA3#g#5rhl*@#MI0+1wEOJ>{JuxY zMP@O=IH1Kg7YB(|vei?Kwu&D(E_6`~F?+qb!@z@?>7Kl9b*3s@>fLyD@^HV#Q?H(f zx1j=uUU@Vv@G{+%(on0M@c~Xf2+RTlKqD9lBfdR_y^hywQEI&gVK?#;a?AZ3bs{s>&c6D==f>wmtp^0)GQE^s`en zQi!oNf6k?H+LV0*fDZp^D1WU3pYmfGVrBQ2R`tl)E1!JHaEZ!8Vw|AqJ|o}RXql~S zP0=6+9{|*iz|iiu^vwv-_`gQ6$7Fx8t-&%2x7wn zd|!b-7)?$dR=BIp%3!x@R&(otaPEQ|cYigBJ^vPYC~;r?5@*yK(%`{{aCSHogClNv zi0QYrs8$)TM#Q{}i${sRxOMdip!B-GcMIhWWQMt@UT@v5l3D~dWMn+qjfKhPGEb9& z;WIEDD43qb`c=%A$Ev5drX$#Gm#>D2ZSf@7hF!kbst&6_{3h~dzvxnJTa7#Qt_b{n zw;u|XxPm~t9hyq7nsKoiimBaBW|*bU`<{ESwK?wMF;S}0Z+e&BFZ^iXVbkLqOy8D)nrF7mqwe$U zxGrrd|KhIOZVMgCl>(6$Y^D7ObqXkc$jW-0@oMNm!^avg=bOziPe3m-@g@A%_S+#+ zbw~W41GpkOmgMXgIiB4P19|!eD0wgny7pN3-zfs$=Q+gc^91q(4Zl`4#a>=$4`qn@ zWoOWIo!42W;Lj@;R@VmipS-@bQ8;8XMHmE54e_+fOf<`VVrIFvDwX&CgjC4F%E*Nj zP#PGDc@q|1p`h{~MPC`mi9JEOY3;&S@{r-A$c>|GTopyEdJO%TX%IhIT`4pK;rVys zfRjzXO^5)YW<$-dKb%(J)Eg(y60%i$VlKe>@4Iy>&=P))jiUR>9}iXXSQLTTn??(4 zV9rxT&dart3%slAtgO;81)tK2d;FR|w+lf97}E%c<$*LjVjhXARZ(7%0EP3(dt?v) zWN|L?jD4R?3Pz0oAif6`RiPlSc1(wZA=Cvv0i~MSsG)l90hInR27E=wNfS6=rW)64 zw$5&@Cl@quLw$wcbM<0&JT?K6~78b3_FJvSh8s17|B=sybJob|8>V#@)Mw}SA z&VSNIM$3l%c=~6YF=`WZt|p&Fp65@vIJcEES5CVAC`{GOx_ABTI~CL2+XJTtP4d6o zkTtnDKs?JtZ!A)ji*EqJVMR3*7KT3J-b#@FR=dDke#4h??+p+fGjuGw#FJ+M>+x+t zf&Q;(`IE;WM26%yg|qv(`YbszyPA<<;eS7GnK-yd9C_@O%<;y;l-)?4wvj5dFpwPj zNUUvuSqI>^KP3w{dXT3upes`8N8aM&KN1U!F=Bw+X9%XZ2c0RxCl9y|g1)_JY+rzf zTS;xGV`fdnod>4#z14V?SxMJBi=bFhE|Au0NAG#@E>=2T;>IZmgU@+nA69#5q8>m8 z56Y&`>t%PKZ)X9+3qHTu37YQsc3p}tVA~ukTw-KqnVHyqn-&5!f_T||aIiFAQUHV+ zsBq-fQT>hNrA2`h#`W_x&=-f){&km=*Og(AM!V{cAG33w@3`f+aB89L$%HAR>+#Q8 z73R__c-ZJcc7B5q-W!EFQMfk3O@qxxnW1aRAGXl%W6=gP|jD!;hc z6k~US*8tdBpm&_1JlVl?+Uqv_ZNL8Rt?75L;#)qXD7Dv0HNR3>F}}B+tJv|`q**_H8=^I z*bE*ROs9Wy9?W0%l6M(w+f=Z*1Cgsjb8pP6`JO3{-WrBb-O5ok*MS}|o0y~MAp3`1 zD)K-UIP~;DWeg}0dGmqD)%bi)(K-XmnI{RF*j5<-8k=vj_F6Kz_YC(r?{INv(SVysF`YO#K7Z^wr8ujt;pZSC^0cZ^ zE1358eURPB?r)e-#$n_OoGApk_X!p9Q&8vf7n4o@CHZ8=&lwxgdJ$@6cbUkQdDI5dxUZ7sSbArq}tj9RMRI;LmWfPbxn z>S`*O82zk$#7Qt^G$AT;sf&iZdL!s^uuDSpLQc|6o|=`5CEh)c0^Ht)9sWDiJ{v8o zCYN<$m+UK#o;AeF+uttXCj66@Ny`f%fyPzZ_Fqh^yH@6h3-zU5zfLB9D{!Z75(ZOr zCu{u-+6>nl8rdi$Aw%V}@jVyw;iOjE)I!3A?%-LT#J($q>3t8L@_Qv*tRB4S-_nFyIAz7A>s-l6Q-WxkuHEA!c)0E4>Gsy~R(fCi)gjuKCtBHI(SlHef(j4Z za8Roj74K2;QV485#UFL(Ds)t)P6zAdW=ReXx+~{T+7a(%V1d)2bY8rs5@kS9N=}%w zw49nAI@%gezqMt_+Ho zVkp~sNpc1fNH{WCcp-+qN!X1D*?MqqRDo#FC=f6gZ$^(xR+wxd$QwlObAB*ig?pOw z#srBSDkoe>-RiobrXFi1w2LDG`K_3|`r!qhnz>9Aj&$yS_e>BI?raUBZ4i16#b(NqY{&L;^V530V9FbvJ5L0^4Zsz@} zFLlS>Cs;5#+*y}8$BD*;wTu;kAEcMFlM|qjRM4}#HPLSKd?uM$DR%v5ByTGgJIdxp zwwp~)+6YY`?d`L%^?9!5S)Mu=d`V?s`@*K@*!hL_gB{lii z>Ic@+;sjxHcZjnVa7u&4ildpAO|ERau7NmCYn8wqv1(1^vLGB0_uFVBN;t#9oU@I( z2!%+nWPtx9OnKeH5% zUu^T+4I6%KHSgD?vK;CA`oe&#Idq-W4_+fe2MS)SthBU83#|fhY0DEKn-fc08VWDL z6xHd;Nkw!=s?^Sa&Brwu!lMi?CI%T&vd*^7$kq^ZIvI#XSBI9wK1Y1&TefYZ){% zY}1hW{4{}U6STsM133v=PE8HHy0Uus5#fH5~y6NBf!z?n3XLrjhO@L`XaR%r$SobCO zY&|xO)w=zXmJhwt-gHj&Z>?zStt@m}YEG0lS*e*iTp@YDbyXq_I%;%t+i=m+P+Qz? z9L2Towi>ST2I6sd^NX7Yp=}FKf;xJx6rO5!TADU*NH66_u2s511gN$tx{iv;Pj?N5HFVIh!rPl>Jf%`{F?wCF2i{-*d#PcCwqc)s5H|{=sB}rTM=JBWUa2FR0IvzX|qVA#n7ou_Jr~I!Jfn|_T=<~{)@{b z?tW~sT=p&T^o!!@@N?O6Q<;4w3YcP{;9;oA_l3aRA~8q)ZsBkdJE-7W*0PkjkQm+Q z5Vl0a@40urB9U~vOiiE2Jl6R(FH)bAIPga8)o-hjmae^Nm8DOZU%Fz?b}Gey!T~Zu z(Lv%JOUwN=i&r>WY_7403kfTP*m%n}#g7R-Drm*a8ACgkjyy2N91;x<;<$e9XxDj% zV)kbp&a}z*->}NC`r%;-Z_?7nmevB?{)*oXgJl%hmXzY2(@&=##2H8+ zTUN@1g>4-T=?_3OCV9QIf24$jPZ5`&T^4i*W57z{=Sg1615 z4)I23sx{d^XmkzFx&R%V+|&C)k;~HD$>i80E^h9Of`3X%BM3fSeR!=I?(kLRh0O++ zar5i97l{rkRK%rI&trz&Hm2oux{V&0i5T1A8@kg9U~u4i_r1DqQDKu$JAFN|vrnE* zx&#^I!WB&TTc_y0CqJtejx%~oGtGU#l`4|5vJpVaRq*Q==XMF1#%ym9XKhyPTc+^a zag0@gq{eTn>Lp-J^mQAt*u3_sU`?Mq8okW{b+8Q6hS(wcb|ao;>eNq zkbRZcoqcwnoU*bm^uD7DH)1v&2aEWquq*3C-Zi}s1ID}tw~t!c$|=+)y_2qu=BkpA z$jU3S4`L|Ur6Z8w8>=`rS^{{0fGQ^tfE)~q}xcowjHC$c&Anux`W!|fRw64LCH$P3G zHZxfEo_ZsYqWZOL{2_Y2fzXj~Kd?!!R(%>X2(OF%K4x7PDrs2D_;oVQCFcEcGOEGJ z2;+f97^&B{5Kp18l7{gtw1RU!csZeLr8NSeBa` zBnFx3`ROQVPj0-i_AiH}7+Ruz|930+!)|!Brme59uf2io`>{q?)-o(?ZBcFN!T@lm7Bw`f>n@W!Xfn1M_Q3LO0y6WW@pI4cQ#js5)Afo@TIK|_&lW8K z;}OgH{}tXiHr<(a!Mf}YZ);ja8VBCv*>0!ghjA}N^G@@gA$?a`83tb43|A#Lh5#s^qO|`>BTbmWZ2CmHa&nqDigoSPr zl5QUK|Ho>NnCOI;bJ(Tv$JRO4PB4!$E%8F%&j3v?w<#laofQ?K&-EH^`9V-w4havE`z$1z!BU4I{RF7=FP&F zHw!HT_tD%EN)|~YAHg}S{7ddMi{+Ip#`pbk`|!r==As;9o}~_aNJxZ`1dpd}i@7rd z$-Dh!k9Hj80`Jlp2Fv1T4QuAjBomU!tnKT$e=ZCi&PaZPgi_D%3!?}sO@QX* z#DNOk=-!VX^Wyu=+pZYuMQi4tjQxFqku33Mq%Zy`5MBN8E>OAO%{e5nN>GH)&~Y?d z!dX9Sx)K&)pHc;EvKI6(Cn`t|7q{VSH}1(&5jPHgAM#1 z+DsGyb9`b~iCq)>FIxw3LMWkC0>y9=?QB17?+++B-j+P|+cl%AC9lPG{Hxd9;u7xl z-C4QIzD!%#IS35ykMlCkctmB%lgP4Yu$-=KM`BTVb|0mBw-;A_mfnob_kUze7Y_Ybu?AQMAusJ$@YpnafZ$0-V*GdQGF*mvQlks%` zhdEu7-<<6ot`7X;qtudHnLEbSt$;Q7?`%Eo3uKPh6g-3hM)5cZlx&07#;C*l#F_tF z7NvD0_rE9D4$#G3@fb?mMSB@E+H6Vg&8?yH;-@Y5Rs7!({C>BZnZ+iocVVv z!EilZVt$z_a&lP!=)1~e@pycI8#{2B@dF@02w2eO%Nc&Vv3dym%EnkR`8lWFnQmnM z@CnN5;O5sciz)q%0V6bS=iR;aN>aet?(Exxs=INpU1@B||Boj`+qV+eVuc${5dcbl zntfW%cO_SZm}dFbLUp>8rg}-$aO^H|?+=5>@Y^G&=fKew*>{1Bjm>GaG2-Lv&SU@W z;uK}wIPhHd%6R!EO={Skv~Gi#39Y8L&q)j2jHr_0Y}IuNUjk=gn>^U}YE=_vB6z4P zUIH@xr;(;jn*M{D5IG)xrsAD@ixP;xh0;$;Dwd!4-7+umrhr{nnvj)|`Q28exgAix zZQr^m*wAtIg{YaPKkC?Zr`x~WW03a5OMJ5ux~uEzZ#%IYasMo`=GIw0rJ;uVW@9Hz zCo}!tzKyEly!D%Bwb7hh|91W6^Z9jBiIYjS0(0x#pJ-$fk>Ul~eP!It3eb4r2VZD) z)@^bd=Civ?{0j59@zcX)gknnc+m-b7^?#XQNCquM#QaG4w9td--Yy=;KG=!qB9(M`Q^H!e}4RmsWB<=aiy zYZqLW@#SZ?K@eNQf%F>yi2#wyA4uf+dc0^_(OOtghskNEZ730?x^X?1=RuN)`4>U& zQbEaXbNPI&JK=k^f4ngsHsA^X@QG>uWwamyG~Q&99M5kka|f^8H&#~v6`Ky!l}lVj z%{Uqt^+*ZdlB>)t-C#!)3}jlW!`$;J*fTM%gSDJTz*vyY~IUNeh=Z zZ=)(X^R5owboviZT{!lL0Wa9&xqiUO9Y<$cCYBhVbNI)xhh$JCVwpL_LRAX_j(;-Bu0*K8c3%=e zZ%MCwU1(yj@0TS%Y6u9V1Ii(yFj!z&earXlOc zSuC4aZKu9Wxh)5aIF;Znt$!^;G@FESEp-trjI&j71mazIOe9@~oP?fDWmol3Fsa zP^OE`P|BBcu*7&{9Dh86mo327T@1elO!(yFnP09`&X}xOk^X5_W`Fx}o(_!ZZX!>V zc;#P|PjB-wr$uo$vo_becm0T6e+3dMk+=5jdGnAtFGYYzv;eSdEN~bzjH8!l^ejcS zCfpkvyv)Spe$`|5Nv`<$bufq||94NymE|V1D^AS3H`;R5ZaV+@^!4eY;okIl4O%%& z4QG9;-CM^g7H`Q1Ht&xI2ZJbodvIOy3Al5lwn4zgT*VIajwx14nTKKExuP=x>EVqo ze_GY62rE?mf#aCPKX8OEEccuLbS=|E{Yq$rosz#HL|N{fS?4>`tAq(BJ=&DpC-pLV zuGCN_{??VI?C{pgYB8N{Dj7K6yL!92UImdYz#o6uqg@E};_ZiqRkS!kHJ`KKRrC!8 zbZ0#jCMo%@eOhSUcfohDsq%=NCPe%{OzL);Su>NxK=ODYk>Jl)Z!8fiQD)46YRT^0@w!oN0{ST$cb zm445}Mt$|IkvXu@K-NQ1Nj6;H)KEfRokaGP2ond*tNqu%xH=8seT6W-5OFE`_b~3~ zQ3D;5egzgd6tLP!BBn>ek>4_=qFAsA`_=6b>pIwC16kkHJO}Y2U5ar-AqZ=Kgsi0> z_RCmS03;?Fm;MXc2CPV!YYG{7R6vDxQLC#*qca`cu6dJa`%`-C9s^+QfOJpIgGW2q z$0+*XegtW%drz{K>H}^Lq;h^Y0$2xf-2yV5;M?5+kK%1PW098w?hdv;6RdJQYAiNI zLhN|dWEi3M8>MxJ7^h&QE#;?k;jsMSnAzF8|HG7!YWlcdXbXpLOH2u?Zv@!*flA$j zTg$>88mebc>QrWH;3jt`oNSN3Cp1iodurDYsD$rvZ#ZyO;Q2B#?*BRs)5J2K2fA+! zHlNE{gPgjuk>W*PK~2A;jO(Lo-hVZ2{JCfKLJu4*!KdJGxIb2@P1Zdy zeObO>Rpid_W+%bJ>@T!;iVn=uo9@8>QSMwu7bYDZ`q9O91I4%15Q9w+0%lZ^oVI zrLCBzW_|60*$P*yDK@yz7{C4h<(8I~{=VF*4~V^4VFn7<=q-kig>*UwNm+f_JzM4U z4{6Wr!#GM6nhe&&AL^rzMcRfb`T(v9hNOVV%l!Jz9UW)wu7cpA*kS*#dtf_5cr4@p zaPG^&K7f-n6gTtkNmXRKbww>i@Mc73Lh$gEMXNo@qx)X{I3A3!ky)IqP{{4aMWzwS zWW!&(##!u!Ih1R}K9+j(c3pq4{Hcjd7kZC1*`JPsQ`ZI7ytZmSQBjAw zobE-#9EJ74>8yb-9~|F*Qa9pg#3;5PUZGpG;LQ3 zc2wNYQ^g=E!@B_Lj1@EgqA`1%S=dtuG3!7KgjUa4QI2kq*1r-w*c|qP4+yBk6VXA> z0Ge`ribdm`rsRWnj(z}S=XR_rKFCC2ObDZf?hm?NN0F?WIXC;E@Io{Y1uO$aKV)k) zYAfevVGa;}n}n<-gkVr86OHiqH$kus#xjsz`^zBMl8_S3O9L!fwr`oi?^Hhz^ zR4WRHZ^erZ6niZE6Dus&bV^sQp?8?aMESUhAw;v;@*=N<2enMNG{4v?MZyE;{1hv4 z^v0{wU6Hm74y9pI1-NUBYKWlO>c(FMk zjVDKin3;b>%y`^=2E^11LRg%#Cl8xnsSDkr_q(KuTd%|C1Ny6$=eIWJ>E9+a3P1qJ z81EQB#X@lm^=WH`j^&M2FddEij&%Wc-7qA*=*0;*I8gwD?uj!Z^RHeQTEZ4!2wh5J z>>61gKcnGaHVs9FsRV(F#LqZ>nA$6x1TZraUdE2I440CZJ0nPi%6@3^~Z|eZSEH=_cJv}Idd;hx< zLg~^AK@fZ%w_K)7&{iT{9M2Vu`(2c(%AU_G<7^2v)|Y-{f!@BW01C%@-{pwVA`S*F z%GBQ~wnBixO`Q(vOUH+N24T^eAcJgDIT9we{Iz~RWuPN?MG1jAyD#BZV3*~av$vE= zuD0uBXsi~gt1O#&OLdL$wkwrplR%2eyL+%GLwk9&0AZl9NtyuEPden9d-9!{C82;i zu{q+G1tpO`-)ijA9lA zLCl3xHFSQeO$5mz{Xk=iatw(2I`nV%f@0M>H&j(> z-^L{;CpQH&i+$C!VJwx>PkFA*ceTQ%Z?=rAzV)G1s>X)WU(gTcV8Tf|%nL0|3oVgb zTNunk;ao4)vibFJ!i+ykwL@jL^`8UpXd68QRa%8XkkX;2@05H=2`OHSh^-Q-)LA^# zdA-D&Vy=@^!}8qIVPo>1?gVNi{F2+HO5_ zn11N{`l3|Of^FqUE;cGEEmz_Fz7)t;&jSxyj*2F|5D`t5a=D4m>%!cN+}_FFNmDAd z;^w9Gu-mgL@&X-8&h-*H1Yw-Bz9ZNK`8-|c3l_Q*l^APsqG^bBc#t7m&s5OXEQnbp zAo%xNDGJ>{y57{&@KIQ2DFI_SARM03?wcA^6L7rywsi|P>?v-`g zd_S&iICpBwiB~PabivPNc6N5}FdB{4){f#+n{9dx2K0hl=EPPWq|6{1K4a-Uu=e4@ z3s4jyr~_tbCcSv^uOQq0{bDiAm!m-q0LXj_={#oV?Ot9k5u5@wV_?i%bSCIgj5W%+ zrd8rQe=Saz76A@3W^c$R6FWQq6$Bx?qhC4wneySohq;a)zmZyG_3(z{9k5d6enc+nW$zZI zEyXKf<~jeg0B!Sm@TQPdFYEAn6{$Kf!QS3pP)Gam;|ZGGJ$|5NPUsyLUmCnq2S8y^or%r66JS$9?g65OLoBI{6TS*GI%aD@*Q!?7re!n~ z&rBfaJ|r0jdf9++?Ms8|K<;CgkwM%zmfEQiTtoN$I)a-O{gPYrmWQ9)#Qt0c2)CZ! zj5i3MF~OLgD>FQ*QfN5SgIU>qK5hb8b;jX&;uS5>Y?TgXT&CYThf%0mYujsXqSLLf zFqFv&3XrXAo&L%U6j1raGs;A^G(LKry}SN zqck!LzAY4phTNiwL{Y=Ds?ZivuSX@Tzcxs9dEG$}tgWpLti8Qk5;|UyjbX%3A6vab z=4BohMS?7SY%}HZ>4ML$S1%-50SBD>cT-b96PdPJ1v2;6{atxDH5`eQ(mhU;Ad!Z0 z2`ic7ga?dUr2~lT1ib4&x}|uZ(bkGMpCPALD$s=h20jBeh;Q3kzc#ggtFUKnj`7fp z-@P-G>nK~9xh`wF5AIrNWcxHAXiy_y>kh)LqrA^YkXqMoli?@pN#d~FraVXYvtz22 zvbWag6e38^(Nx>wTdezs^Wb_T(Nl2sby;7{YG8o;Q4ZVtKt?2Sqg)5^uwbY;UEOL1 zPFM$5f;cdM*(O2dcO(>r%h!USN{wPw3F=0vVEVD8R6tiapvEe$bM)2L-W^_R_no!{ zKGX{F8iNtZ>TzPXzy8pFwu!&nZhr`*ph6kvog$&PD1HA#=ho63S!qn|l>wYs+E2lA zlCuWqf}Z9RR_JT|%F_~X1G}C}yv;}9Usl~+&cyVGE?DVviY8TMEqoM;JV-VH=%@_~ zDZvRdbPWK|5##5~PjcHV8gn)`sHAfMrvxk6nD3~XA~m>ZNJFD*9}RO&)FD`-TJ z8k=8j;>ViqrmhU)C;bP_^>T+^A#5F%isqS_diPGeKHqk!D(36^_s>@5hOms{slEt> z;T%ix?DhE?Xo0^z)v6v$ImLj|s%hXS)F+}42OZqYpCG+}83=0{U8!&D{ zLA{4NG*{u!&HfPev9F?Cy_pjq=|Mw2O?uvgyuO$+x3=gYLe_X7s&X)?cc?Fu(qGz9 zGpvLLF0pRGiY;;iem%&XwaEb-GqGeTO4t3EfSK!BD2r;P;J37rtSU2$mC~u{O?lhW z)3^v*i7+k6;g^x$J)#Yw$?H;zAJNYqpINi%Lyb;Kt-8^cUN5FYuX@a4miwUcwL%u8 z%tt4eeKD{{f7ijvea+LoJs#X*JO2moK{c)pN%h zpsDd?uP@O)dPOO#s1W=5vdd~VW-HgmlRMUq?-D{K*5v}iPf;jdnP}q-f2x_$ z?&ZhO0Aprs(pVts6hW9Aa|#7q$WcOj0Rj0$EA|PUr~!a{WDUtD>T0=p z!8IJ@PQ|5=Md6Tiuy(!N;m*0C`QS43^?{CDOY!M;mHA%Asmd)YqvdI^wu*$tO=WAW z(Z8u>X_{HE>qO7%eBKRxu1XAcs`-#}d+{kNe0ea{gkIzzh8QR&ek{8*ygPxV@f5-O z@KxYdd!wJ2L)AAO=C(}quY!;k;AabMuPe=#w;DE%_9&qjY;=HJDmNsu&5>M)T+I5E zS<@7M@gk(k1O#*!`txD^axR0teMcZ3>-%07j)il8Yd1bW<-28)L0@GK4<6c5{eT|TU@iMxNK8#^X13_O)8doEG%v(bD`J4C^|R;05OBk zmb`7!jO7m;vaoQ`lz1BMBedebJEiCOm1}`oUZlW0d!uHZ-7qnqwz=rS3orQmfKJ zx@a5U1RhfjHB>YEvU4{3DQ-rp(=Gr}MK8qB_C5;ujw^2$Ta}iT$<+P@KR6#+iu@ry z;o|CUjNrCnhrJier}S)Yte1M&_3tcWyP!~0nPbFmy8A+d0Kv22yi7xpXG2(e@I}@} zhuG!>GttK_7Juo#kCipa1-~X|a>gas=&C(F&y|p;S)nY;oha&fEBDppgqzOA(n`5} zBIdL=kdmh8=2YS6WFp(yPm5}XE-Fc-_zWwl^1Oi2QO^U;?m^~N+72a4lO-q~RQH$N zVr7}rMlQD6#tF3Sl2Vl{EPW6@OY-4p4K)UGuJDg0KhSnBB0TOqxCRQD~RDe8GEHEATzwAl$as1JS35#lH5{ zwWQJK(?(*%Ou1S8X*WY>5Fogal4G62Y#*qp%S<4((BT2je%6L;hE7dgBD~E=)p7`s z4KEJI=FhnFc;S7VyezOc56-6#pWv%)k%r_2Z@{C~SBWVBaCc)M6G2Q)6qr#?-Ouqn zFs;@k#ru(fF{$xwy3L5u^@XK|8=24F|Ages0a}caLz+Mm3IHRJbly-ZkrukvQDQ)7dDUAYMj=F_;4lqe zDv~QV^+o4CZWy0kx&L8N@ohD4ptE~~ruKG;%<{KRO_3$~yam0-lH`Y85o~>JiRkf* zrU%K8s|b%fASgCoVbesXXrn=TYH~~6(=v7a^T|sBsLd~C7A`&04XKu+`~;1h5X8(A zQnd8Yx|fBEo}sQS?>s&F_IRP^2){l!Qc@f_e1S3aonK`!4V*x}WEkcl~$1_)Yzx zR@el~HNeB*jkKtaUss;YJL&mS`K+Zr^kqe!#kM8OCs6`1 z#X&PSoz^2ejsRx9SK$6(`eeVaUi4<`UU>?>wTcr_V=K@@-v~iyw(HFMb(vRxUAzNC zh=iB09ZmV(%cT-A%{hQc-Es7U0JAu|J(HL|&8%;+b;s$f-b+e4cAIm?&qbHC(g^B4a{H;#?lh0P3U2y?{ z{z}A{Df`FW*iz?u914FL1BeHdfI^T%Vc?TrV)I={;Dhq`Cx=tJ~LN`C(s0+}Ph@%DA?IK z1_l7~84xaWra+u)Ew@FVmSG()0YZ1feP(VYgb;BwxYF9_J<7^vo%QRDQ6c|MZ(!sL z7&vY^HMD*Fc2xlovP|nMU=)V1Dh1PKO1r4_Xm-b(V?B1PG9)$SjOr#&QlL26Fl7F& zGGwIEe@V3ZD~S0CPH{=2rwJUkhXA1q$t4)_C3dH7HnF$G{{@?MBC1>~@$UK@C%Dm? zae;xP3ZJ02R=UNGU6YXhf74`>3j~|gw?=P$c9rO$u$-H~b*(SCJ6v+U zD?ER)uQoS+@9{jX2MN^Wu?G4$OXacSJ zCnLoI;q%yn&*Z*ypFV8!jk`~7%cqMEFp>r!#_lDPJ7jW?T^I~Uo9>Pii}x0c=?B8+ z08c;Nz^E}eAQDd4td41bL<_LelJl@04g>?-o6V?7s_aYYdH3!~KtRA3sm1#xUIyCd zc5XPj8#C@&!miYi&UIRnO* z+I7ezrCj01=#s!&T7d?Ix?)@l+bDb)Kb5puB1zE~;j<<1KLa^H#>4HO=k5pgZI7lf zditzOeeTif$*}2`JlxR7QD(;@?Ml3;7euwxEgkPMGd-J-)i7+k;_F-hvDPhoCKuB3 z%uC-=%iJn-5KfXOS?;1ozdM_oJL5sNP!t%p>gp8o>Ejm$8?Wa5y+;%6O32g(cLS)h z8FE}g~)U``W^I`A^GGZggq~*1)sr!1}p|Zh~MiGFIIr` zqLaxVv8+D4CP0ZS9868De4P+eH1<6;W4H6@cGZ9wkge?Bk1Z&Oa%*ht!~^keDDVvR zF~y843@kXw8*Z(^+v4o$^Z7hh;&=~n16GNzvF*>-ckvcIiBYaqmRHUt4h>DH)hc(n zV$#7n1N_M4d`gNK&rh+5xZxZE$ksuFSMFYeUy91N?rA*hlE`>wd4$6rAg1T!cwoTV z=t=J>m@@*9sXe}Yn6@ahzd&%RSVJ)p5jL2d{qP`8}vd+X=ZwroG$l z{W{Ctv4al`z!?xow3NRNYc;Mtx~6-7n8FzNZ^@- z^6_>H*Hl5HV}ZnVLDe5sk}H(PIGwx})Jan5te)qE048Dqb4*1#QZ=IO$Pp?+Em$!_ zqslD-2pB0Aa+EFqDGtB~r!LrSOmsv}7Z9qUs7zYTh-mdlrCe(bGt;Yk9_`zeHHCk* zGStA*(rKU-PjK?BeK3pc3OCNgfoO&e1F1A09-Ml{CjiR~UJJh#M!WRkDT&<5-lKFM z?=p$aE4L;_KsjI{-$%LZ$oLn*^X;w6Ux#-yj_{f%mG2tCg4cDZvQ$rsP-HQv;3FEq zr;yRq4DME70LUjgR~q#_cl`&InLT=8iopSH`Cm`foPc|WSl0wL$(IVY2Q5+8Q@OgD z_&*4PNNUMHnc6o2vmRG_!}HzfioLqag__>UhO?1OUHixKxntGh`ys{Z4575h_y>3@ zeroJ9m;RS9<>+P?;0YPk4FdOLxImI@q23DY8P-tOx_=;#o0a4}dj2uq2QBI7-3#nW zw6L15R|4M6CTo`40tgzYtDm3o4Qr(F&!sX>LCAXZtIb*AdR<|=fbsK>ulWr)1KRkG zTx!Epd4njse!OP|16Mvlkune5iwfSJQXd$yE-E{-9PFQ}|lV{tuWrpcQudB)w~p=Zt$^v;eIf7i;K zsE=iOAP^MPsrmZ8l>U&rA4Qb8*Una;s#8;rsGjp*kVokpVQN1FVmL;XQ^K~<25f0B zk=WqrXa}I>Q-oejkLn|0IITm#0w7r<;ZclEmS?qs??Alq!F+ZKIr9ex{{4Dbp#FDizWC*j8)(VIW#ebFg%wL+MuYJhdx z!>s%B^eO#r9?FW+ScU`50Odq{DP7=dfuLo%fuH}X^6?(<9=(SuOHie0CJ9u$$gY%; zs|GCB4FMA)koa12qL(KsSBVcOCp?8!vkyI>Gh#`pC^j7f(g$L?FS$@(&B4P^Wdg}K zoq()i9n;xYz{FI$Q>O5*a3@)&Jk=YMCG#Ji5eRms`)5?MQv`Z)^TTu1v7g4&MAQO% zL}BD!3`mdgkyNtDTO%D`bm%jXG8gaZH+S}>wk1#jnq#~ILv{y{fL(G6Uq#`mCDQ;X z*bb)l70dhN6f2$VSUTo-qoF0?uZSxgrn`|}Dt2P?P7j6fI?g8WKwo zY(xEAFLw<0VhC_g9lQe9!i1DuP>&ajELh&?V;M#mA^a#C!0d~aV(Fu5xNUXQtIjIh;dgwnR`|A6c?UaDZvtIe^)mT9_ zuM3YEh82)M(B+NsD`Tw;U)KrzRKqFM=Bio$Bq#>7`AWF%v>oIzCH!?*?9~e`=DW5) z*u*IK+@RiHhr4^4ODs%&o6ZY0YYSM(HmmeELHD6Xj_*#;1j;i0*0%j6KKl&Cc5wz% zY(R}_-&`!CRuUrS)uqg}cM0#4LcJYwe^d#v>QV(Z#mL3PbZgYRpK_eiF{d@p1V$wOimriJ?d#W9 zK=@|K&M0<(v=a_jMDu<0zQU+-VB|2)#@-txH-f;JI-`$Wp3zUSCJ(%Jr45S2GS4b1 z+wwZ{wzrc7CNF}(9^^lW90*vY(*-mLYC!QHM(Ci*>=;CBN7EfUQPwn2y_NgGpt#}u zL8t?DUSn6v99cTIWAoEX`#l^w-Bgz(D!0_@8RVQatv26|j%B4`EO!%o;ya;)1uYO` zDa~)xb^k~#0szb?ngsCY_POJL3tDRX07Sb!g>-v|)&O^!^w3uC6GBZ0pq662h=aAX ztYr8S*mfs7v^?&P)v`TNuaMV}H>KO8-h{zrur_)H(0%(%O-vzy#+7$q))vcnCokV{ z^U~9?&em25LGCm1@j;k$&rcw@H4z_4rEYvcf^3qJR_aFGN#0{v_4!Yg?e^7c70lM; zX%S+dk9pG-5Lsd7`Ev3dSni zrYMGylWB<2ZI$m4WsKVK9vPNx=bLXknE%DHgd@~wKZZ{0f_f*dd<0K0e(+}-0E>meQON{o8eiD19Wp!!?TOo}sT zsJL&c9UIW$CQnvva2DDQx z|D5qBI!vfS+LbnD-o>iZGA@8Ra0#8TOF={4-ci^55jEY-)1PGF`72lK(N>{j$R6L7 zXB1GBUSLz04ifhBgwb==(~may4qXx#_yvv*Gv|S7J-D*%d|TZiuXd5-HqjIVsljSj zBmV8`Iv^+JQ&Ggs&m8Y5^Wp0;IxW@QtP)JG$(O-6fCw~#nHMC(E6-rH0W6b+bfUVB zGkg}K;8i0Y@=CWAqx{m*EfVlA*!)RYk2i%>3RVhoN)-8C=S+OUy|eHn(bzGhEV2!V zj3<^enE=}dwv(cPI@U+9BkJu05itOV+69#aXo|$%RNGD^G#DTN%7jrxZt~DRXh>ix zp~g)!nh`9`Bc{eGgLxHP+~C_{8$3ubfkH$U%e&9^y;6L!gUMk8*#i3NTW*kOswCcWjVXXtXFw0pG_0Opw(I2>r;|8r&Hs@RZp}eFwbhl z_kj1oKo!iR#f-52L|*V9YJGfG2Z){!Q>S6GcZhwcSQh2v(qOY<7V}c^sp~FTCAJvP zh9Zz&kNXRqUHtmwIubxskR_t8Elu--vd#W!hW`Cm8vE|Gq;sZ?vBA67y4i+UZB}IisRn*AV}!JPeAwu*#olU#+V}- zC$`sjlc6SjUN@cf2=p&-1T5>reEIi_s-V=jZ;iuxFu*u0r9R6>PiR{l-Nb6G#0Da5 zz&VdrM2}0VE?1A%G1Ay%RBvsrJ#5ms3m`&96)`Dt+>3C_QwR@(gSY(FRVVIc z<#Y?}b#ZXt`%WbWgl6^SW$dX`c^Rn>WnMj#qz)s0@b63DRi21#9qaAxP6sL=Qis-Z z1wXGb;mEtCOp9wZS{fmv*0@#m3}ZLO zGR(~Pde2aFIQQ@T_xs~Mf1C&5J)h;hT-)n;g}A%0mW*KH+5H;^J(6rR;vpvu-X^2s zL{6eqjMnMn%w81;fo||0LlI$OXiHcfv)55yj3t8lK(^>&;m6?bU;`|V_TCH? z#L@3RRZP~)>bK@NS_emFrmHPV&@XYTkKFWu8c1$T{%yUBO2u3JMkXU^OFA*_jLrLp zHCH9DqlHTrgl{Qv;lwY*enzs9sR*tKgr}dU7weOiWy%7N#SXt(v>r|tRVd`G)*|LL z?*;ulWUO-@OT~yV>QH|5!eq~qbwv=0?}Rk>wol6R{E!=d7ifGX8{$jNot9ygHb@k1 zqpI%!2?dF&r3^JXREs-t(h6}R2a+mz2sR&rz8jCkLBgqc@F`?=h~jVD^P?gaQtut- z{QwSK0>3mkT>1CFjU?--L$JQP@b*5qA}iL=K^0WZHWI6@VApL07T?uF-fyE%yD;fY zjjq9akGCUJ&N$DKfR=01;LlrLB?P^%Bbn_vY+OGT!$xs=^}PGn+siUQyH(^Na_A|< z9MJvB9W#$-E665wDVr6v$tUMnwcl+zVAvE~0avUlCGN?N^4a|*2Ms$W#9`mY`tU`F zQEMGeeZsBmRR0{FaFzZfBlckhWZg1fSAXJ16@3mEM@ikB-LV~q4?~;`<}=FBSiC-s zk&l1ie7L=AcdN_YV;(N?tcWucqx*1rKSCz|spbxOPs@0@c4CR+C#eUO_!CamLlWeL&n|H55oi~Y{y#$d4A2-JOYt{5rMGkf;-`!_9n_e?6AHR`viwoPPDYE zsOh8bUt$Z}4TS7-8jf{e+VJ7}TXU;LN#$L2*R0)RpTMRz!0+k)=UAkE>)Q0~kKtsj z4)`;EcSnNcT5Z^Fpl%ODzL1@Sg{+gh?&)s6Q&2G;A-dNkGMQr~IusPj2d|feh_S!Y zHsjMDgPk;^V#*yRH!p&+aIyP5vRyFO{_NkqaS+nfq2Wm^0YN#%!~CHiQ7HiA^I|@{ z7irTEdz_QFD+Y>Y!3E4^Jm?Hz?}VbrmeijCUh-}-9&b&Gr58!9ws3^!s34>WSifBZ7g$dwP9AaB*pj3F+|1D@!y(fO*amc`?WK$*P4qRlqJYnnD9L1g z;Q8%Dhg#^zAa0qPywbyvk3k)5w$`E$j5a~R!%=#J|54ZpRA0NN3mC8c>{dMyu;cOC znVqZ@Du{Wx8vhpU`pc^MEZ&Jyp zSbuCu!m7R=ts>v6GJ}!`09`z5(xGQaigv}{g>oE=`)X7B5*#JVt3NC#V=a0>+E zB|TOlE?q#y5f}QP{nj|wA|nn}Ml;HrUr%}(Lae(Ro30K9An!2f2ppfk4!)GmOZ5T7 z0#rwf{ro-B`Xh5hm>JW(@5tznqaWLu1s6tQj)Q@fGs^kw3Hel16u9o0&o3%Pv#M~*aVB$x)QAk?cXJz z7rDQP$tI>5m&m+{CWe*_?t3}elc*Z=SpT%m#Yrb-MZ!c?psg&<9~%~OYK>M^s8w!r ze*LU7-g;!r%xCavGR4jyDfn!o+lLk{sEKlGz82|LY-VNC@$8V=Sk5I-i=cW8l#lH? zkGKU;B*s;0k4_%mM$B-)!PAY=J)3z{)A1<;mXZMr1DT{G1-LDleM$G?ZoIv61dtbu zmh1293I`PE&v!iU7_(2zC%9VHg^tATa9JW#N_%cz9I7_7F6i*-z*Rl<2|ulC=G2wQh2X7lj&(9q|!IIKzl6paO0S)Yy%}wFJuZI2vPFN%+bFrFXc$H8Q|~t z<>VX_&v|?-$tSTvL`T_1Ko4ggX;a2e6szY}C<8Rf@UGJD#>=3W#IyB_BsPNdjU2Py zcMJuJU}?Dy1}V^zvBLM$Q9iw(v^RIv-(OkDr?_>;x)WAv zI3Bf(cQUvSpHB(Mrs$@{VU(7*m+J0#YT@dtT3LCzqU_v`K$V!f3e}jps)mYZ&4Y(J z5t;`9t?qdT$~wQ?aRVycA!|FFtA58z$tLc7S6*vvjjxXTBj@y;#q1>F*)8^G4lVrve{3m*!wA|?wHB|r#=DjTi`KaINKO)>^+TrCM5p6gM9FYhUT%drdM!au+T*sz#OhGoKI5 z!#GUJE|#leqPI*$GAdN)F@Y%Dvb^bm_+qdo19XCR^6R%imlHfiAA*EK1rsd5 zJ__jQPnVSHv{F!PMup-Eo3#taPSV@kN}rI*IaTu#6=TJwy&n3RmfbFmubBf;-ohJ( zs{Pmdg0ml+;h-;?v>QBy-z(R;MC`Sx&C_nQps7`99 zi!3u{MO^GtFnO&sbe0-)bv)F(^HhJ`sq_-2Wjvu_15KO}v({)&RO|)K_Z=9wTZB(% z)gyN~jt<8siFyo82(edY3#mQb{VDMR?bGTMWy*8*yS=@9Vbxk|NQY(O@14OhOk5^YSPc(k#~WRP=U@a({FYi&9N`?xy$1tKe6?N|CiM19jO zn3Q+npPkGsPaLM$33>@baW%Xpf$)dbE$_out?;#|QL~cQ)yX)ib2TFolHAw9qS2Co z^l0-L&%QtVA=ad=CcjUq76=pZrRz4)gZ?}MWpAp7J>Ep$YfGjD{aIrq;bvK2g+5ITfAx(y>F9fZ1(V|_ycRuXxtaR+pY>B znILZ})?Ef=IKWVYTKj#4?53UOYGAQzL3QeFm!QQ$nKFXq8IcgZdv0Z5r)r>+8E-~P?NphK~ z3r9>zAI>O|SsZm5Jbo}apoZzUz%;%P;a>v9tur?K5+-gLy9TAkGqeQkK?4#02S&+L zOI#;B_tNE-H$E8u!4g_(^)We>lA9ksC%lSsINg({D=KP!K4ZHKs$|XfVqmadEg9In zq_t#Hs6!xlRa808XePWnSPh_>f3uY+uM+dfb!#Q?vCjU;BfSfVCVw4~Fo^Fnt{R0( zHaLxcHrUE{YK^S+%M{l%%I}WSS$Ir~@IH>91P+iQ^E4|vJKY0e+6D#&Q2X*!1mdJ7 zqy{O|T5#w)tx0!m6iQD^w1U=KIYHlFX;IBvbuhw%%66}%OB(*77SIYcNjr>JeGU)o zcY#VJ>#e#~4tr0o0V9$Zl>se9NyL!zXKr4ho3^X*Kve?IhiaY^*_w~w(QlGnToSiV zi`^X#MPN6hHt-A8O7D`=wyMkUAgMGwin^cQlrsn&snq;dp4{Rd#OEp7wT6K-;&;v7ike1=% zpS5qFpt$`u@c>64SF%~_QtQa%N~OX|p)LNAtW?~~nUim)*v}Vab^v~1!3#c)Kihp= zcVNXTAN!Ixy**#$mRtbR7mYO+;N$J>{gu?h!Dw&=rJycD11^yGi8G=|iVkZ{QFg*eO0;wx>fd?10LJ0iaVxYQU z)M5F}eK%jId|zdh9O@P*z5vM6vQ8NdwSaF8B=%N{q?DyVrP_sk|1=bc7XJHCzL3;B zx2eW$eaZ?5&cA;B{a48!hZFV1fGNPcD;oEoc(HF9-!t`N$U%USjV|rcLQWc6?>eHR zz+knto8})3x>fwE!DeaPXJ6Su^x+F$h|O~uvqa{z|FQtDw@2q+T}D~in)&bP!oD;A zYOq;iY7WKhi+Z?-mWP;G*C{SgMmG0L{&x0H)urWMyT) zO1Niy>Q4Rsm3qtgs}8tC7VbL}Z81e7o1V^7P#5l})MeTU&G#Jk24#TC$1 zJL{I_md;N93M}GCOi8udwh~fR)%}XD=lf7Ov;!)q{3wIdjCuE`nZ6>>+CyHKvjbQh{ANT&Ebbpx0=JZH&Xq8G#G;Jvx|`hk ztJ5Osdtx+q!^G}}wi!Vn9m#IqEACvd{Ig5b4JFiw#<2uzJyk;qBCk1zMskeR@&ngU z>mG&40f^-gC$z+Z9Sa4V0IDkL++aXv=s=BCDSN!^wxUA`*2lXJ$_1fO(46<)@z_w= zxukw7I5RIhirLFX+=tH5ytp? z_0cP9z6YgcxLlW+iVsLE$2CTWKG{yhJl6ojh}F~9L8SM=o2N-`JW2(Nlz$&|l-{m08+CDK5I7SXQ= z9wcWhgQ>AP6veOkNW93I=*y+QUa!$9#2ysl&10dKVh)rDCu*oQzI+RL>?jl3?h@*&Vk25)b_ zB7@@p0TK!dNx$7*r4o-<-NMHgupP3}FlW>P;BzJR?Yr{6ALVzJELqZFoRNZVxl|F9 zpyyMi*}k8q9uKg9a&mGU2AU7;pL$3;15a(e_n-a=^O5)GakNH|^R!Q}CO!2y&*&l+ zX{cB%);KebGh)9Ykg#MZFiZ&N`Ge?Hyza>9gRcxm+)O}hZCA;gKXyc6tl7IR>vG#; z|6(Yrx3Q_#&1Yygx=eeH#0yb4-8W8+A&qhGwrdt#Z^crVo9arV*ri1eI{(Drxo4 zriQ}(x&jSVUjDPnPVO_pfrSOt0GQQ#4i-tjxKh#u4S{me{OE*L`~ZZ0u5U-jL5-h) zbVN$y?=>8H(@BwogBYpjVH4+;X8^nvnppyOuhh%*+Df#E0v}-d%&u>+4_LS{<*!AF zWL7V^2I;y{|GO%)V8a7!258zrGf8k8r9vmczl@*-fK_$8w(I0zA#{f#s6jxu8kp7g zI#}5)ElvFx=(5c- z4P#`@P7UVgH?Ld4c_0gVAg#ptieplL{YzL$b6PH_ny%;WoAWcFPyh8Yfbur~J*n;t z{8xhs$U4kG3r*V&T$-(XX##@tIY;8Ogy-J4XE`H#p#*IX=H3j41MDm0AbyLmnenMy zv?2iPDK2{gB~ds9N%*I&2~G_6%csnuW`6T-xhPL3C#g9tN_&Ky;=nMIW+JDiuVb3@ za_A&7y??lI&~2nAYQAHCZiLH>!;NEOA(Z8XnKY0aVa4$Tf+4Wi0ZR%&nMZiY_N^?U z$?sTqXFfBT16P6TDD)GU^Ex;`FOks}<~b65%9Ca?zcGjN<;2KlygkHObB|g6Duu%n zy%h!O_!D2bGT%P1a46In^1x1IA?CD6$9%mxR^rzUZhi>m^ft)hDDC)Tdb9Y3#K_}w zWIn%ODzIU1|DQRHP z&#Ieke;HH$)^mbZrn1W7EFXAbOe(F;uMtZ*@ z+rN1Z;C4V<5A* zcFr|5z4->dpKtRuJs(~KQLY<5mEjF@=k)a6VoI{1H_kXXKAN%-I$&PQM&L&~Ozr?x zSvY8ef8ltsHz_^2mF?+6qVNMxQxPzo~f(VaVp@pXOXGU|4W=fR%sF9ue@Q|7FDaf`Idl7#b2X zw@I=@4@Fyi=P^|wRQ4UZ!m?|qBv$V_5ZS{ktEx84c{jguPl+p60_J-`XejQP_i7o3 zCc7_W#Xk+@>KgjrhXORR&OBJy*=sHZJOUC#nUDW1G6e|E+3}lHZcl_+Xx48AOE@bw z_h65HUZUqU$mP5Euv+>0`$lH2&c+B~NPme~oV6YS6 zec2R20-M=SiuPBG@5bkIzf;fcnV!N6kU86XE zugNwmTicpl-~qbY@uAlMVf=%JOZ8$jRs7|L{)TNphs`!g<^nnFIV`C8o3D`sdRz)Jnp*Aa} zL6pkUc-0N))rTEv&n|UrEdl~aNp>YfUw{aQ^BBLB$<(adMG1$EBo>bsJF<1{dTwX{ z%@oh&>v1+xL0AGk;5)anEvke%rH;xt1iD{60VbvV}}?^lc%O9y7w!>J$w zaB+|lsj*RkJvdFL0czpVqerXi>*c)mBy)p3qhRc)27C@*Zy%S?y`UQ^MfwSh7fTiG zE4rm@8}x1`apsH3xUavz2(qpBU(1Q_2KupC@w<2LZjefuOIo@(jld$^`hW%uCD+hm zTtMFWKi;1n0ni2*fY4V+K$DvqRGaRIF>U2T?huM!2mnLrChR`gSPhUh|3b$$UnweU zqMwvtL>E@6jtL$md*wHcWMoDRj~(6`b$ILLitfrT3FE|-*4Eb1$=^7>*7XfBcVEOL z_64tL!jvkwR)#e_0f#;$rzC*K&OQVT09s|v*K z@)nwe9s_@19Qp~P)H9{74>aTM!z`u8>k?GuochiVJmk%5UOXgkSAZomlF0Fu8{5uK zwg|CWRC>koCx^x}d6zA2^cZbKJ+$-<4CtYxyrV$za%?yso&-xaysCyKkA5B?ZL1r) zRLK3LxYu|QqPc--;Kd|)84g^fghP07G%h(=1NzNml09?5IUzLfh1u@fwuSsOBjW(X zWV%J|Tznu1E7oe%thLeFKrEOZIhuEjbQa?a1wByw!^ixPJbBlTU*=h}X*kuHU8%&Z z^vT;L9kgE{H=mJ^@2Z)b+m~ZqU@CoeOJzu1B-Jg2;=&lXtt8LhdYoBHE4+z-U6z8SyR}mYpZ)+`Ldg=E`9-LAtZjr45uOTUPTr5Fo&e zw1Ug?e}xOL4}vE3UFaIniwz&@6=Ia#=JfSqj1?;3(NzNbq8weIa@4Qvhf>5rUk0!P zV<9xEVayr|rZ;=9rlP>8SdCb-#71j5Ik|*mLLORP153Rgp)c4&;_SyzHA6)$kW~Dc z(a?u+aUrdq%o_1Y9hdfo#~a`PExtu9Mq%8m1@$uA=UeOG?5u~K{Jaagju_EGNqe06 z3vJtE!f4q2%)j`*ziu@0EI3X}xXX<^5y|SXV;#k^hH-RQ8OegV-=CGYy@}RRL!%Q} zfz3X&CQH(~CJT0rOh1F0%b~jtb$j+wL1z<|W2qO5)+pCB=*O_xP*OiZW_v>GMN-6& zO~~=LZ_e)>9WV9rWI1Xm(C-I+7If{5@_Bw!PZ;$^Yk*!4hMR7c$iOo^9x(Bem-s82 zeQr|@G>RN;S?%S_a)c3ftosq&RgDa#Ay7lHYkRg3Yv4A`f83uvwwmG+39;H7i+aB| z3WVOcNuZnA2Q)M{H&1p$q_%-QCd4*%ky^#uqvb&!j+M&RB@PAQJcRrjgIX^6HKOnO zGU{y&24vB{ba7`N{3{P-f+*)Y+&O8gIFjn04YOZ&&qndSRSS5_@1DJ`EgUrbZkvDS zNWC4_E24jbL;QkPXVsUB?4!WU+#Z*fhAHS~!wNlQXlR(jpeAsF_i1Tq^ji7w+o*)A zI8+jF{eewmZ>3OSV8D}Of-Z;KuecOkb{}sKwq`Qu{DmUN?_kXJ^!Hhhj<6QylIhYcD#=V`F27)3D5*t+opGmybZF zA&TjxOUDnb*&}VTBM!KOa#wqvR_e4UgF)&9E6ueJgH3>rqOL4@{+LhxQ#ebK&ZHgn zS7K$ME^!u=k_bjHFji%4MN8gJ^9_RyuZG;ZeH-Cf4`w#GCPX^7{>bGUPCf~I5*aB7 z-#k~`@)vC=naxOsJOKl`&Q*_-E;rQeb&`kOrmvwM9$kE2U*BRo|D(~6u=(t4bO=%g z=rcQ4+BtiJi_l@rmdmHfxxU>Wi4@}={chw+SRh6a!tCBAH2%9l=EjR{_}spV1Y@QZ zs)|NU4ZSAp*eAqY-m9UWce~f!vG3sY(`*q4S7%1+)=KccFFo5JIGvqQN_ii6eE^ z=^hhTp+`$6meqy54{mOjnVu?k?DekUfZ)8t)-{PCUIK-pDbMZ~nGr_PlY=noLKC%x z8}oY6!R<9(XPvAqFG#Y3^-hHhoc7jxS+!wzF$2)&)sxk3jn6(xGIC2o6hJ$VZUbQ0 z8EF-YzS3lT-lY_Wb}l%y^aosFw|2^*2`#{7Y!&~xhf3AlzD}kqWE0ouFu*0fyy;wD z-xP}u8b*gyeq6dWNsLk3Tc4>G01!XS-UBPu0MTFwNWIEP1vfBMAW!q;_|CNEy)f^K z0G~)?(UZGLa60jN@E7)ekaUt48&SvvD%g` z2D~f0c7jgCpoiyVn^4gxGf+(7w>CNVv6Q!kg_Qh_m>#@4nh_4jz=DHGuFVuqgjXRY zUL_qDKcmr=m|YsYD;`li7hY}$dpcZTA=TuKk+O5C!f59SJJ-O-@sAg&v0=6q$CMbS zAVY=>Z~SO%3x5OH5sZ%)6{E#H2Yq06(@2+am6lNE3h8NGEd14QMKDn-K_{uA&0h(! zCf$avu()v6$%Kp&1ONTwjbx@FVX|EuI!0atL*X&9tnMD(>iTL+(<8(bhMgvd66sb2 zY(?013CvzQQn3^{@uJeiCwh}Z_|0Ee(4md1svVen8+>bs5%vvuc_3#l*D35J=Nl`r z2K^D15us@#`rUCXAU5k6WZG5(RgAtA&Qtv~b6+DctW*N%rdVxn)}Wa`z!LS#;sf*s&7e9B|I$QVi}Xyn^)K7;j2hn3z1haJ%fddot( zu`BAfU`1{dU5r^F&J2Kp5Nf)Cv~4OeA|e9W*^fwh9g@h5heb^{W_Np4LyH-d2~};a zwYhMSk+VnJD`WtUN+Yk4i(XeNCNMn*@cSd!;l-uzoEk3Q#^(*GGQkdbhRl{OXuHi| zlGz@}tUD{Xte!f#=TF|xUd&{6drh)&f9qgYE;_njtyY4HpqDZM4j+`Tj4E6>rUXp( zGKGGZQVd*|*uCGgfMuISo*(E<&X#^bO7Tz%lAPm@5XMUQQ6FkrIF*A z6q?IueLk}uA07QlQc5ZpJCTjWfF*_OOrK0RgjYCCQ8uKB2^>u(K}g>)IFcQKi2$wLYuFfz{UV ziTRg%^NWR}u#3Ki`An*=Zf|1tIpto-cE2~eBr8jv5^nHzd=uBCw?CxwSz*e&x9>9H z^bLeaz%8JnaDQQ?@4}7TulV>D?cshUA+bb{`_ None: danger_map.precompute([]) evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0) - context = AStarContext(evaluator, snap_size=5.0, bend_radii=[20.0]) + context = AStarContext(evaluator, bend_radii=[20.0]) metrics = AStarMetrics() pf = PathFinder(context, metrics) diff --git a/examples/06_bend_collision_models.png b/examples/06_bend_collision_models.png index 19588aa4290409c8a535291b953107c7e548a2b6..bdb530411998363c894a623318921fd3932c6d25 100644 GIT binary patch literal 89875 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 DG?xb@ literal 82104 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 None: evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0) # Scenario 1: Standard 'arc' model (High fidelity) - context_arc = AStarContext(evaluator, snap_size=1.0, bend_radii=[10.0], bend_collision_type="arc") + context_arc = AStarContext(evaluator, bend_radii=[10.0], bend_collision_type="arc") netlist_arc = {"arc_model": (Port(10, 120, 0), Port(90, 140, 90))} # Scenario 2: 'bbox' model (Conservative axis-aligned box) - context_bbox = AStarContext(evaluator, snap_size=1.0, bend_radii=[10.0], bend_collision_type="bbox") + context_bbox = AStarContext(evaluator, bend_radii=[10.0], bend_collision_type="bbox") netlist_bbox = {"bbox_model": (Port(10, 70, 0), Port(90, 90, 90))} # Scenario 3: 'clipped_bbox' model (Balanced) - context_clipped = AStarContext(evaluator, snap_size=1.0, bend_radii=[10.0], bend_collision_type="clipped_bbox", bend_clip_margin=1.0) + context_clipped = AStarContext(evaluator, bend_radii=[10.0], bend_collision_type="clipped_bbox", bend_clip_margin=1.0) netlist_clipped = {"clipped_model": (Port(10, 20, 0), Port(90, 40, 90))} # 2. Route each scenario diff --git a/examples/07_large_scale_routing.py b/examples/07_large_scale_routing.py index 174fe72..ef92ea2 100644 --- a/examples/07_large_scale_routing.py +++ b/examples/07_large_scale_routing.py @@ -10,7 +10,7 @@ from inire.utils.visualization import plot_routing_results, plot_danger_map, plo from shapely.geometry import box def main() -> None: - print("Running Example 07: Fan-Out (10 Nets, 50um Radius, 5um Grid)...") + print("Running Example 07: Fan-Out (10 Nets, 50um Radius)...") # 1. Setup Environment bounds = (0, 0, 1000, 1000) @@ -29,7 +29,7 @@ def main() -> None: evaluator = CostEvaluator(engine, danger_map, greedy_h_weight=1.5, unit_length_cost=0.1, bend_penalty=100.0, sbend_penalty=400.0, congestion_penalty=100.0) - context = AStarContext(evaluator, node_limit=2000000, snap_size=5.0, bend_radii=[50.0], sbend_radii=[50.0]) + context = AStarContext(evaluator, node_limit=2000000, bend_radii=[50.0], sbend_radii=[50.0]) metrics = AStarMetrics() pf = PathFinder(context, metrics, max_iterations=15, base_congestion_penalty=100.0, congestion_multiplier=1.4) @@ -44,8 +44,8 @@ def main() -> None: end_y_pitch = 800.0 / (num_nets - 1) for i in range(num_nets): - sy = round((start_y_base + i * 10.0) / 5.0) * 5.0 - ey = round((end_y_base + i * end_y_pitch) / 5.0) * 5.0 + sy = int(round(start_y_base + i * 10.0)) + ey = int(round(end_y_base + i * end_y_pitch)) netlist[f"net_{i:02d}"] = (Port(start_x, sy, 0), Port(end_x, ey, 0)) net_widths = {nid: 2.0 for nid in netlist} @@ -60,39 +60,8 @@ def main() -> None: total_collisions = sum(r.collisions for r in current_results.values()) total_nodes = metrics.nodes_expanded - # Identify Hotspots - hotspots = {} - overlap_matrix = {} # (net_a, net_b) -> count - - for nid, res in current_results.items(): - if not res.path: - continue - for comp in res.path: - for poly in comp.geometry: - # Check what it overlaps with - overlaps = engine.dynamic_index.intersection(poly.bounds) - for other_obj_id in overlaps: - if other_obj_id in engine.dynamic_geometries: - other_nid, other_poly = engine.dynamic_geometries[other_obj_id] - if other_nid != nid: - if poly.intersects(other_poly): - # Record hotspot - cx, cy = poly.centroid.x, poly.centroid.y - grid_key = (int(cx/20)*20, int(cy/20)*20) - hotspots[grid_key] = hotspots.get(grid_key, 0) + 1 - - # Record pair - pair = tuple(sorted((nid, other_nid))) - overlap_matrix[pair] = overlap_matrix.get(pair, 0) + 1 - print(f" Iteration {idx} finished. Successes: {successes}/{len(netlist)}, Collisions: {total_collisions}") - if overlap_matrix: - top_pairs = sorted(overlap_matrix.items(), key=lambda x: x[1], reverse=True)[:3] - print(f" Top Conflicts: {top_pairs}") - if hotspots: - top_hotspots = sorted(hotspots.items(), key=lambda x: x[1], reverse=True)[:3] - print(f" Top Hotspots: {top_hotspots}") - + # Adaptive Greediness: Decay from 1.5 to 1.1 over 10 iterations new_greedy = max(1.1, 1.5 - ((idx + 1) / 10.0) * 0.4) evaluator.greedy_h_weight = new_greedy @@ -104,46 +73,12 @@ def main() -> None: 'Congestion': total_collisions, 'Nodes': total_nodes }) - - # Save plots only for certain iterations to save time -# if idx % 20 == 0 or idx == pf.max_iterations - 1: - if True: - # Save a plot of this iteration's result - fig, ax = plot_routing_results(current_results, obstacles, bounds, netlist=netlist) - plot_danger_map(danger_map, ax=ax) - - # Overlay failures: show where they stopped - for nid, res in current_results.items(): - if not res.is_valid and res.path: - last_p = res.path[-1].end_port - target_p = netlist[nid][1] - dist = abs(last_p.x - target_p.x) + abs(last_p.y - target_p.y) - ax.scatter(last_p.x, last_p.y, color='red', marker='x', s=100) - ax.text(last_p.x, last_p.y, f" {nid} (rem: {dist:.0f}um)", color='red', fontsize=8) - - fig.savefig(f"examples/07_iteration_{idx:02d}.png") - import matplotlib.pyplot as plt - plt.close(fig) - - # Plot Expansion Density if data is available - if pf.accumulated_expanded_nodes: - fig_d, ax_d = plot_expansion_density(pf.accumulated_expanded_nodes, bounds) - fig_d.savefig(f"examples/07_iteration_{idx:02d}_density.png") - plt.close(fig_d) - metrics.reset_per_route() - import cProfile, pstats - profiler = cProfile.Profile() - profiler.enable() t0 = time.perf_counter() results = pf.route_all(netlist, net_widths, store_expanded=True, iteration_callback=iteration_callback, shuffle_nets=True, seed=42) t1 = time.perf_counter() - profiler.disable() - # Final stats - stats = pstats.Stats(profiler).sort_stats('tottime') - stats.print_stats(20) print(f"Routing took {t1-t0:.4f}s") # 4. Check Results @@ -157,28 +92,15 @@ def main() -> None: print(f"\nFinal: Routed {success_count}/{len(netlist)} nets successfully.") for nid, res in results.items(): - target_p = netlist[nid][1] if not res.is_valid: - last_p = res.path[-1].end_port if res.path else netlist[nid][0] - dist = abs(last_p.x - target_p.x) + abs(last_p.y - target_p.y) - print(f" FAILED: {nid} (Stopped {dist:.1f}um from target)") + print(f" FAILED: {nid}, collisions={res.collisions}") else: - types = [move.move_type for move in res.path] - from collections import Counter - counts = Counter(types) - print(f" {nid}: {len(res.path)} segments, {dict(counts)}") + print(f" {nid}: SUCCESS") # 5. Visualize fig, ax = plot_routing_results(results, obstacles, bounds, netlist=netlist) - - # Overlay Danger Map plot_danger_map(danger_map, ax=ax) - # Overlay Expanded Nodes from last routed net (as an example) - if metrics.last_expanded_nodes: - print(f"Plotting {len(metrics.last_expanded_nodes)} expanded nodes for the last net...") - plot_expanded_nodes(metrics.last_expanded_nodes, ax=ax, color='blue', alpha=0.1) - fig.savefig("examples/07_large_scale_routing.png") print("Saved plot to examples/07_large_scale_routing.png") diff --git a/examples/08_custom_bend_geometry.png b/examples/08_custom_bend_geometry.png index 7f453d78c53b59152ff820a66cfcdd86faed8c38..72560e38e69db44557316045a6f41363a03b3618 100644 GIT binary patch literal 76727 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 literal 92051 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%0A)?hXlYP~eyl( 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 diff --git a/examples/08_custom_bend_geometry.py b/examples/08_custom_bend_geometry.py index ca4c527..81331be 100644 --- a/examples/08_custom_bend_geometry.py +++ b/examples/08_custom_bend_geometry.py @@ -19,7 +19,7 @@ def main() -> None: danger_map.precompute([]) evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0) - context = AStarContext(evaluator, snap_size=1.0, bend_radii=[10.0], sbend_radii=[]) + context = AStarContext(evaluator, bend_radii=[10.0], sbend_radii=[]) metrics = AStarMetrics() pf = PathFinder(context, metrics) @@ -40,7 +40,7 @@ def main() -> None: print("Routing with custom collision model...") # Override bend_collision_type with a literal Polygon - context_custom = AStarContext(evaluator, snap_size=1.0, bend_radii=[10.0], bend_collision_type=custom_poly, sbend_radii=[]) + context_custom = AStarContext(evaluator, bend_radii=[10.0], bend_collision_type=custom_poly, sbend_radii=[]) metrics_custom = AStarMetrics() results_custom = PathFinder(context_custom, metrics_custom, use_tiered_strategy=False).route_all( {"custom_model": netlist["custom_bend"]}, {"custom_model": 2.0} diff --git a/examples/09_unroutable_best_effort.py b/examples/09_unroutable_best_effort.py index dc68678..659a16c 100644 --- a/examples/09_unroutable_best_effort.py +++ b/examples/09_unroutable_best_effort.py @@ -8,51 +8,49 @@ from inire.utils.visualization import plot_routing_results from shapely.geometry import box def main() -> None: - print("Running Example 09: Best-Effort (Unroutable Net)...") + print("Running Example 09: Best-Effort Under Tight Search Budget...") # 1. Setup Environment bounds = (0, 0, 100, 100) engine = CollisionEngine(clearance=2.0) - - # Create a 'cage' that completely blocks the target - cage = [ - box(70, 30, 75, 70), # Left wall - box(70, 70, 95, 75), # Top wall - box(70, 25, 95, 30), # Bottom wall + + # A small obstacle cluster keeps the partial route visually interesting. + obstacles = [ + box(35, 35, 45, 65), + box(55, 35, 65, 65), ] - for obs in cage: + for obs in obstacles: engine.add_static_obstacle(obs) danger_map = DangerMap(bounds=bounds) - danger_map.precompute(cage) + danger_map.precompute(obstacles) evaluator = CostEvaluator(engine, danger_map, bend_penalty=50.0, sbend_penalty=150.0) - # Use a low node limit to fail faster - context = AStarContext(evaluator, node_limit=2000, snap_size=1.0, bend_radii=[10.0]) + # Keep the search budget intentionally tiny so the router returns a partial path. + context = AStarContext(evaluator, node_limit=3, bend_radii=[10.0]) metrics = AStarMetrics() - - # Enable partial path return (handled internally by PathFinder calling route_astar with return_partial=True) - pf = PathFinder(context, metrics) - # 2. Define Netlist: start outside, target inside the cage + pf = PathFinder(context, metrics, warm_start=None) + + # 2. Define Netlist: reaching the target requires additional turns the search budget cannot afford. netlist = { - "trapped_net": (Port(10, 50, 0), Port(85, 50, 0)), + "budget_limited_net": (Port(10, 50, 0), Port(85, 60, 180)), } - net_widths = {"trapped_net": 2.0} + net_widths = {"budget_limited_net": 2.0} # 3. Route - print("Routing net into a cage (should fail and return partial)...") + print("Routing with a deliberately tiny node budget (should return a partial path)...") results = pf.route_all(netlist, net_widths) # 4. Check Results - res = results["trapped_net"] - if not res.is_valid: - print(f"Net failed to route as expected. Partial path length: {len(res.path)} segments.") + res = results["budget_limited_net"] + if not res.reached_target: + print(f"Target not reached as expected. Partial path length: {len(res.path)} segments.") else: - print("Wait, it found a way in? Check the cage geometry!") + print("The route unexpectedly reached the target. Increase difficulty or reduce the node budget further.") # 5. Visualize - fig, ax = plot_routing_results(results, cage, bounds, netlist=netlist) + fig, ax = plot_routing_results(results, obstacles, bounds, netlist=netlist) fig.savefig("examples/09_unroutable_best_effort.png") print("Saved plot to examples/09_unroutable_best_effort.png") diff --git a/inire/geometry/collision.py b/inire/geometry/collision.py index 0357e77..5f9fbc6 100644 --- a/inire/geometry/collision.py +++ b/inire/geometry/collision.py @@ -23,12 +23,13 @@ class CollisionEngine: 'clearance', 'max_net_width', 'safety_zone_radius', 'static_index', 'static_geometries', 'static_dilated', 'static_prepared', 'static_is_rect', 'static_tree', 'static_obj_ids', 'static_safe_cache', - 'static_grid', 'grid_cell_size', '_static_id_counter', + 'static_grid', 'grid_cell_size', '_static_id_counter', '_net_specific_trees', + '_net_specific_is_rect', '_net_specific_bounds', 'dynamic_index', 'dynamic_geometries', 'dynamic_dilated', 'dynamic_prepared', 'dynamic_tree', 'dynamic_obj_ids', 'dynamic_grid', '_dynamic_id_counter', 'metrics', '_dynamic_tree_dirty', '_dynamic_net_ids_array', '_inv_grid_cell_size', '_static_bounds_array', '_static_is_rect_array', '_locked_nets', - '_static_raw_tree', '_static_raw_obj_ids', '_dynamic_bounds_array' + '_static_raw_tree', '_static_raw_obj_ids', '_dynamic_bounds_array', '_static_version' ) def __init__( @@ -53,6 +54,10 @@ class CollisionEngine: self._static_is_rect_array: numpy.ndarray | None = None self._static_raw_tree: STRtree | None = None self._static_raw_obj_ids: list[int] = [] + self._net_specific_trees: dict[tuple[float, float], STRtree] = {} + self._net_specific_is_rect: dict[tuple[float, float], numpy.ndarray] = {} + self._net_specific_bounds: dict[tuple[float, float], numpy.ndarray] = {} + self._static_version = 0 self.static_safe_cache: set[tuple] = set() self.static_grid: dict[tuple[int, int], list[int]] = {} @@ -96,22 +101,21 @@ class CollisionEngine: f" Congestion: {m['congestion_tree_queries']} checks\n" f" Safety Zone: {m['safety_zone_checks']} full intersections performed") - def add_static_obstacle(self, polygon: Polygon) -> int: + def add_static_obstacle(self, polygon: Polygon, dilated_geometry: Polygon | None = None) -> int: obj_id = self._static_id_counter self._static_id_counter += 1 - # Consistent with Wi/2 + C/2 separation: - # Buffer static obstacles by half clearance. - # Checkers must also buffer waveguide by Wi/2 + C/2. - dilated = polygon.buffer(self.clearance / 2.0, join_style=2) + # Preserve existing dilation if provided, else use default C/2 + if dilated_geometry is not None: + dilated = dilated_geometry + else: + dilated = polygon.buffer(self.clearance / 2.0, join_style=2) self.static_geometries[obj_id] = polygon self.static_dilated[obj_id] = dilated self.static_prepared[obj_id] = prep(dilated) self.static_index.insert(obj_id, dilated.bounds) - self.static_tree = None - self._static_raw_tree = None - self.static_grid = {} + self._invalidate_static_caches() b = dilated.bounds area = (b[2] - b[0]) * (b[3] - b[1]) self.static_is_rect[obj_id] = (abs(dilated.area - area) < 1e-4) @@ -131,10 +135,21 @@ class CollisionEngine: del self.static_dilated[obj_id] del self.static_prepared[obj_id] del self.static_is_rect[obj_id] - + self._invalidate_static_caches() + + def _invalidate_static_caches(self) -> None: self.static_tree = None + self._static_bounds_array = None + self._static_is_rect_array = None + self.static_obj_ids = [] self._static_raw_tree = None + self._static_raw_obj_ids = [] self.static_grid = {} + self._net_specific_trees.clear() + self._net_specific_is_rect.clear() + self._net_specific_bounds.clear() + self.static_safe_cache.clear() + self._static_version += 1 def _ensure_static_tree(self) -> None: if self.static_tree is None and self.static_dilated: @@ -144,6 +159,37 @@ class CollisionEngine: self._static_bounds_array = numpy.array([g.bounds for g in geoms]) self._static_is_rect_array = numpy.array([self.static_is_rect[i] for i in self.static_obj_ids]) + def _ensure_net_static_tree(self, net_width: float) -> STRtree: + """ + Lazily generate a tree where obstacles are dilated by (net_width/2 + clearance). + """ + key = (round(net_width, 4), round(self.clearance, 4)) + if key in self._net_specific_trees: + return self._net_specific_trees[key] + + # Physical separation must be >= clearance. + # Centerline to raw obstacle edge must be >= net_width/2 + clearance. + total_dilation = net_width / 2.0 + self.clearance + geoms = [] + is_rect_list = [] + bounds_list = [] + + for obj_id in sorted(self.static_geometries.keys()): + poly = self.static_geometries[obj_id] + dilated = poly.buffer(total_dilation, join_style=2) + geoms.append(dilated) + + b = dilated.bounds + bounds_list.append(b) + area = (b[2] - b[0]) * (b[3] - b[1]) + is_rect_list.append(abs(dilated.area - area) < 1e-4) + + tree = STRtree(geoms) + self._net_specific_trees[key] = tree + self._net_specific_is_rect[key] = numpy.array(is_rect_list, dtype=bool) + self._net_specific_bounds[key] = numpy.array(bounds_list) + return tree + def _ensure_static_raw_tree(self) -> None: if self._static_raw_tree is None and self.static_geometries: self._static_raw_obj_ids = sorted(self.static_geometries.keys()) @@ -205,7 +251,9 @@ class CollisionEngine: to_move = [obj_id for obj_id, (nid, _) in self.dynamic_geometries.items() if nid == net_id] for obj_id in to_move: poly = self.dynamic_geometries[obj_id][1] - self.add_static_obstacle(poly) + dilated = self.dynamic_dilated[obj_id] + # Preserve dilation for perfect consistency + self.add_static_obstacle(poly, dilated_geometry=dilated) # Remove from dynamic index (without triggering the locked-net guard) self.dynamic_tree = None @@ -219,9 +267,9 @@ class CollisionEngine: def unlock_net(self, net_id: str) -> None: self._locked_nets.discard(net_id) - def check_move_straight_static(self, start_port: Port, length: float) -> bool: + def check_move_straight_static(self, start_port: Port, length: float, net_width: float) -> bool: self.metrics['static_straight_fast'] += 1 - reach = self.ray_cast(start_port, start_port.orientation, max_dist=length + 0.01) + reach = self.ray_cast(start_port, start_port.orientation, max_dist=length + 0.01, net_width=net_width) return reach < length - 0.001 def _is_in_safety_zone_fast(self, idx: int, start_port: Port | None, end_port: Port | None) -> bool: @@ -236,19 +284,19 @@ class CollisionEngine: b[1]-sz <= end_port.y <= b[3]+sz): return True return False - def check_move_static(self, result: ComponentResult, start_port: Port | None = None, end_port: Port | None = None) -> bool: + def check_move_static(self, result: ComponentResult, start_port: Port | None = None, end_port: Port | None = None, net_width: float | None = None) -> bool: if not self.static_dilated: return False self.metrics['static_tree_queries'] += 1 self._ensure_static_tree() - # 1. Fast total bounds check - tb = result.total_bounds + # 1. Fast total bounds check (Use dilated bounds to ensure clearance is caught) + tb = result.total_dilated_bounds if result.total_dilated_bounds else result.total_bounds hits = self.static_tree.query(box(*tb)) if hits.size == 0: return False # 2. Per-hit check s_bounds = self._static_bounds_array - move_poly_bounds = result.bounds + move_poly_bounds = result.dilated_bounds if result.dilated_bounds else result.bounds for hit_idx in hits: obs_b = s_bounds[hit_idx] @@ -266,9 +314,6 @@ class CollisionEngine: if self._is_in_safety_zone_fast(hit_idx, start_port, end_port): # If near port, we must use the high-precision check obj_id = self.static_obj_ids[hit_idx] - # Triggers lazy evaluation of geometry only if needed - poly_move = result.geometry[0] # Simplification: assume 1 poly for now or loop - # Actually, better loop over move polygons for high-fidelity collision_found = False for p_move in result.geometry: if not self._is_in_safety_zone(p_move, obj_id, start_port, end_port): @@ -277,13 +322,14 @@ class CollisionEngine: return True # Not in safety zone and AABBs overlap - check real intersection - # This is the most common path for real collisions or near misses obj_id = self.static_obj_ids[hit_idx] - raw_obstacle = self.static_geometries[obj_id] + # Use dilated geometry (Wi/2 + C/2) against static_dilated (C/2) to get Wi/2 + C. + # Touching means gap is exactly C. Intersection without touches means gap < C. test_geoms = result.dilated_geometry if result.dilated_geometry else result.geometry + static_obs_dilated = self.static_dilated[obj_id] for i, p_test in enumerate(test_geoms): - if p_test.intersects(raw_obstacle): + if p_test.intersects(static_obs_dilated) and not p_test.touches(static_obs_dilated): return True return False @@ -339,11 +385,11 @@ class CollisionEngine: possible_total = (tb[0] < d_bounds[:, 2]) & (tb[2] > d_bounds[:, 0]) & \ (tb[1] < d_bounds[:, 3]) & (tb[3] > d_bounds[:, 1]) - valid_hits = (self._dynamic_net_ids_array != net_id) - if not numpy.any(possible_total & valid_hits): + valid_hits_mask = (self._dynamic_net_ids_array != net_id) + if not numpy.any(possible_total & valid_hits_mask): return 0 - # 2. Per-polygon AABB check using query on geometries (LAZY triggering) + # 2. Per-polygon check using query geoms_to_test = result.dilated_geometry if result.dilated_geometry else result.geometry res_indices, tree_indices = self.dynamic_tree.query(geoms_to_test, predicate='intersects') @@ -351,8 +397,35 @@ class CollisionEngine: return 0 hit_net_ids = numpy.take(self._dynamic_net_ids_array, tree_indices) - valid_geoms_hits = (hit_net_ids != net_id) - return int(numpy.sum(valid_geoms_hits)) + + # Group by other net_id to minimize 'touches' calls + unique_other_nets = numpy.unique(hit_net_ids[hit_net_ids != net_id]) + if unique_other_nets.size == 0: + return 0 + + tree_geoms = self.dynamic_tree.geometries + real_hits_count = 0 + + for other_nid in unique_other_nets: + other_mask = (hit_net_ids == other_nid) + sub_tree_indices = tree_indices[other_mask] + sub_res_indices = res_indices[other_mask] + + # Check if ANY hit for THIS other net is a real collision + found_real = False + for j in range(len(sub_tree_indices)): + p_test = geoms_to_test[sub_res_indices[j]] + p_tree = tree_geoms[sub_tree_indices[j]] + if not p_test.touches(p_tree): + # Add small area tolerance for numerical precision + if p_test.intersection(p_tree).area > 1e-7: + found_real = True + break + + if found_real: + real_hits_count += 1 + + return real_hits_count def _is_in_safety_zone(self, geometry: Polygon, obj_id: int, start_port: Port | None, end_port: Port | None) -> bool: """ @@ -392,17 +465,21 @@ class CollisionEngine: self._ensure_static_tree() if self.static_tree is None: return False - # Separation needed: (Wi + C)/2. - # static_dilated is buffered by C/2. - # So we need geometry buffered by Wi/2. - if dilated_geometry: + # Separation needed: Centerline-to-WallEdge >= Wi/2 + C. + # static_tree has obstacles buffered by C/2. + # geometry is physical waveguide (Wi/2 from centerline). + # So we buffer geometry by C/2 to get Wi/2 + C/2. + # Intersection means separation < (Wi/2 + C/2) + C/2 = Wi/2 + C. + if dilated_geometry is not None: test_geom = dilated_geometry else: - dist = (net_width / 2.0) if net_width is not None else 0.0 - test_geom = geometry.buffer(dist + 1e-7, join_style=2) if dist >= 0 else geometry + dist = self.clearance / 2.0 + test_geom = geometry.buffer(dist + 1e-7, join_style=2) if dist > 0 else geometry hits = self.static_tree.query(test_geom, predicate='intersects') + tree_geoms = self.static_tree.geometries for hit_idx in hits: + if test_geom.touches(tree_geoms[hit_idx]): continue obj_id = self.static_obj_ids[hit_idx] if self._is_in_safety_zone(geometry, obj_id, start_port, end_port): continue return True @@ -412,60 +489,166 @@ class CollisionEngine: if self.dynamic_tree is None: return 0 test_poly = dilated_geometry if dilated_geometry else geometry.buffer(self.clearance / 2.0) hits = self.dynamic_tree.query(test_poly, predicate='intersects') - count = 0 + tree_geoms = self.dynamic_tree.geometries + hit_net_ids = [] for hit_idx in hits: + if test_poly.touches(tree_geoms[hit_idx]): continue obj_id = self.dynamic_obj_ids[hit_idx] - if self.dynamic_geometries[obj_id][0] != net_id: count += 1 - return count + other_id = self.dynamic_geometries[obj_id][0] + if other_id != net_id: + hit_net_ids.append(other_id) + return len(numpy.unique(hit_net_ids)) if hit_net_ids else 0 def is_collision(self, geometry: Polygon, net_id: str = 'default', net_width: float | None = None, start_port: Port | None = None, end_port: Port | None = None) -> bool: """ Unified entry point for static collision checks. """ result = self.check_collision(geometry, net_id, buffer_mode='static', start_port=start_port, end_port=end_port, net_width=net_width) return bool(result) - def ray_cast(self, origin: Port, angle_deg: float, max_dist: float = 2000.0) -> float: + def verify_path(self, net_id: str, components: list[ComponentResult]) -> tuple[bool, int]: + """ + Non-approximated, full-polygon intersection check of a path against all + static obstacles and other nets. + """ + collision_count = 0 + + # 1. Check against static obstacles + self._ensure_static_raw_tree() + if self._static_raw_tree is not None: + raw_geoms = self._static_raw_tree.geometries + for comp in components: + # Use ACTUAL geometry, not dilated/proxy + actual_geoms = comp.actual_geometry if comp.actual_geometry is not None else comp.geometry + for p_actual in actual_geoms: + # Physical separation must be >= clearance. + p_verify = p_actual.buffer(self.clearance, join_style=2) + hits = self._static_raw_tree.query(p_verify, predicate='intersects') + for hit_idx in hits: + p_obs = raw_geoms[hit_idx] + # If they ONLY touch, gap is exactly clearance. Valid. + if p_verify.touches(p_obs): continue + + obj_id = self._static_raw_obj_ids[hit_idx] + if not self._is_in_safety_zone(p_actual, obj_id, None, None): + collision_count += 1 + + # 2. Check against other nets + self._ensure_dynamic_tree() + if self.dynamic_tree is not None: + tree_geoms = self.dynamic_tree.geometries + for comp in components: + # Robust fallback chain to ensure crossings are caught even with zero clearance + d_geoms = comp.dilated_actual_geometry or comp.dilated_geometry or comp.actual_geometry or comp.geometry + if not d_geoms: continue + + # Ensure d_geoms is a list/array for STRtree.query + if not isinstance(d_geoms, (list, tuple, numpy.ndarray)): + d_geoms = [d_geoms] + + res_indices, tree_indices = self.dynamic_tree.query(d_geoms, predicate='intersects') + if tree_indices.size > 0: + hit_net_ids = numpy.take(self._dynamic_net_ids_array, tree_indices) + net_id_str = str(net_id) + + comp_hits = [] + for i in range(len(tree_indices)): + if hit_net_ids[i] == net_id_str: continue + + p_new = d_geoms[res_indices[i]] + p_tree = tree_geoms[tree_indices[i]] + if not p_new.touches(p_tree): + # Numerical tolerance for area overlap + if p_new.intersection(p_tree).area > 1e-7: + comp_hits.append(hit_net_ids[i]) + + if comp_hits: + collision_count += len(numpy.unique(comp_hits)) + + return (collision_count == 0), collision_count + + def ray_cast(self, origin: Port, angle_deg: float, max_dist: float = 2000.0, net_width: float | None = None) -> float: rad = numpy.radians(angle_deg) cos_v, sin_v = numpy.cos(rad), numpy.sin(rad) dx, dy = max_dist * cos_v, max_dist * sin_v min_x, max_x = sorted([origin.x, origin.x + dx]) min_y, max_y = sorted([origin.y, origin.y + dy]) - self._ensure_static_tree() - if self.static_tree is None: return max_dist - candidates = self.static_tree.query(box(min_x, min_y, max_x, max_y)) + + key = None + if net_width is not None: + tree = self._ensure_net_static_tree(net_width) + key = (round(net_width, 4), round(self.clearance, 4)) + is_rect_arr = self._net_specific_is_rect[key] + bounds_arr = self._net_specific_bounds[key] + else: + self._ensure_static_tree() + tree = self.static_tree + is_rect_arr = self._static_is_rect_array + bounds_arr = self._static_bounds_array + + if tree is None: return max_dist + candidates = tree.query(box(min_x, min_y, max_x, max_y)) if candidates.size == 0: return max_dist + min_dist = max_dist inv_dx = 1.0 / dx if abs(dx) > 1e-12 else 1e30 inv_dy = 1.0 / dy if abs(dy) > 1e-12 else 1e30 - b_arr = self._static_bounds_array[candidates] - dist_sq = (b_arr[:, 0] - origin.x)**2 + (b_arr[:, 1] - origin.y)**2 - sorted_indices = numpy.argsort(dist_sq) + + tree_geoms = tree.geometries ray_line = None - for i in sorted_indices: - c = candidates[i]; b = self._static_bounds_array[c] - if abs(dx) < 1e-12: + + # Fast AABB-based pre-sort + candidates_bounds = bounds_arr[candidates] + # Distance to AABB min corner as heuristic + dist_sq = (candidates_bounds[:, 0] - origin.x)**2 + (candidates_bounds[:, 1] - origin.y)**2 + sorted_indices = numpy.argsort(dist_sq) + + for idx in sorted_indices: + c = candidates[idx] + b = bounds_arr[c] + + # Fast axis-aligned ray-AABB intersection + # (Standard Slab method) + if abs(dx) < 1e-12: # Vertical ray if origin.x < b[0] or origin.x > b[2]: tx_min, tx_max = 1e30, -1e30 else: tx_min, tx_max = -1e30, 1e30 else: t1, t2 = (b[0] - origin.x) * inv_dx, (b[2] - origin.x) * inv_dx tx_min, tx_max = min(t1, t2), max(t1, t2) - if abs(dy) < 1e-12: + + if abs(dy) < 1e-12: # Horizontal ray if origin.y < b[1] or origin.y > b[3]: ty_min, ty_max = 1e30, -1e30 else: ty_min, ty_max = -1e30, 1e30 else: t1, t2 = (b[1] - origin.y) * inv_dy, (b[3] - origin.y) * inv_dy ty_min, ty_max = min(t1, t2), max(t1, t2) + t_min, t_max = max(tx_min, ty_min), min(tx_max, ty_max) - if t_max < 0 or t_min > t_max or t_min > 1.0 or t_min >= min_dist / max_dist: continue - if self._static_is_rect_array[c]: - min_dist = max(0.0, t_min * max_dist); continue - if ray_line is None: ray_line = LineString([(origin.x, origin.y), (origin.x + dx, origin.y + dy)]) - obj_id = self.static_obj_ids[c] - if self.static_prepared[obj_id].intersects(ray_line): - intersection = ray_line.intersection(self.static_dilated[obj_id]) + + # Intersection conditions + if t_max < 0 or t_min > t_max or t_min > 1.0: continue + + # If hit is further than current min_dist, skip + if t_min * max_dist >= min_dist: continue + + # HIGH PRECISION CHECK + if is_rect_arr[c]: + # Rectangles are perfectly described by their AABB + min_dist = max(0.0, t_min * max_dist) + continue + + # Fallback to full geometry check for non-rectangles (arcs, etc.) + if ray_line is None: + ray_line = LineString([(origin.x, origin.y), (origin.x + dx, origin.y + dy)]) + + obs_dilated = tree_geoms[c] + if obs_dilated.intersects(ray_line): + intersection = ray_line.intersection(obs_dilated) if intersection.is_empty: continue + def get_dist(geom): if hasattr(geom, 'geoms'): return min(get_dist(g) for g in geom.geoms) return numpy.sqrt((geom.coords[0][0] - origin.x)**2 + (geom.coords[0][1] - origin.y)**2) + d = get_dist(intersection) if d < min_dist: min_dist = d + return min_dist diff --git a/inire/geometry/components.py b/inire/geometry/components.py index 29a5f0b..9e755cf 100644 --- a/inire/geometry/components.py +++ b/inire/geometry/components.py @@ -1,326 +1,105 @@ from __future__ import annotations -import math -from typing import Literal, cast, Any +from typing import Literal + import numpy -import shapely -from shapely.geometry import Polygon, box, MultiPolygon -from shapely.ops import unary_union -from shapely.affinity import translate +from shapely.affinity import translate as shapely_translate +from shapely.geometry import Polygon, box -from inire.constants import DEFAULT_SEARCH_GRID_SNAP_UM, TOLERANCE_LINEAR, TOLERANCE_ANGULAR -from .primitives import Port +from inire.constants import TOLERANCE_ANGULAR, TOLERANCE_LINEAR +from .primitives import Port, rotation_matrix2 -def snap_search_grid(value: float, snap_size: float = DEFAULT_SEARCH_GRID_SNAP_UM) -> float: - """ - Snap a coordinate to the nearest search grid unit. - """ - return round(value / snap_size) * snap_size +def _normalize_length(value: float) -> float: + return float(value) class ComponentResult: - """ - Standard container for generated move geometry and state. - Supports Lazy Evaluation for translation to improve performance. - """ __slots__ = ( - '_geometry', '_dilated_geometry', '_proxy_geometry', '_actual_geometry', '_dilated_actual_geometry', - 'end_port', 'length', 'move_type', '_bounds', '_dilated_bounds', - '_total_bounds', '_total_dilated_bounds', '_bounds_cached', '_total_geom_list', '_offsets', '_coords_cache', - '_base_result', '_offset', 'rel_gx', 'rel_gy', 'rel_go' + "geometry", + "dilated_geometry", + "proxy_geometry", + "actual_geometry", + "dilated_actual_geometry", + "end_port", + "length", + "move_type", + "_bounds", + "_total_bounds", + "_dilated_bounds", + "_total_dilated_bounds", ) def __init__( - self, - geometry: list[Polygon] | None = None, - end_port: Port | None = None, - length: float = 0.0, - dilated_geometry: list[Polygon] | None = None, - proxy_geometry: list[Polygon] | None = None, - actual_geometry: list[Polygon] | None = None, - dilated_actual_geometry: list[Polygon] | None = None, - skip_bounds: bool = False, - move_type: str = 'Unknown', - _total_geom_list: list[Polygon] | None = None, - _offsets: list[int] | None = None, - _coords_cache: numpy.ndarray | None = None, - _base_result: ComponentResult | None = None, - _offset: tuple[float, float] | None = None, - snap_size: float = DEFAULT_SEARCH_GRID_SNAP_UM, - rel_gx: int | None = None, - rel_gy: int | None = None, - rel_go: int | None = None - ) -> None: + self, + geometry: list[Polygon], + end_port: Port, + length: float, + move_type: str, + dilated_geometry: list[Polygon] | None = None, + proxy_geometry: list[Polygon] | None = None, + actual_geometry: list[Polygon] | None = None, + dilated_actual_geometry: list[Polygon] | None = None, + ) -> None: + self.geometry = geometry + self.dilated_geometry = dilated_geometry + self.proxy_geometry = proxy_geometry + self.actual_geometry = actual_geometry + self.dilated_actual_geometry = dilated_actual_geometry self.end_port = end_port - self.length = length + self.length = float(length) self.move_type = move_type - - self._base_result = _base_result - self._offset = _offset - self._bounds_cached = False - - if rel_gx is not None: - self.rel_gx = rel_gx - self.rel_gy = rel_gy - self.rel_go = rel_go - elif end_port: - inv_snap = 1.0 / snap_size - self.rel_gx = int(round(end_port.x * inv_snap)) - self.rel_gy = int(round(end_port.y * inv_snap)) - self.rel_go = int(round(end_port.orientation)) - else: - self.rel_gx = 0; self.rel_gy = 0; self.rel_go = 0 - if _base_result is not None: - # Lazy Mode - self._geometry = None - self._dilated_geometry = None - self._proxy_geometry = None - self._actual_geometry = None - self._dilated_actual_geometry = None - self._bounds = None + self._bounds = [poly.bounds for poly in self.geometry] + self._total_bounds = _combine_bounds(self._bounds) + + if self.dilated_geometry is None: self._dilated_bounds = None - self._total_bounds = None self._total_dilated_bounds = None else: - # Eager Mode (Base Component) - self._geometry = geometry - self._dilated_geometry = dilated_geometry - self._proxy_geometry = proxy_geometry - self._actual_geometry = actual_geometry - self._dilated_actual_geometry = dilated_actual_geometry - - # These are mostly legacy/unused but kept for slot safety - self._total_geom_list = _total_geom_list - self._offsets = _offsets - self._coords_cache = _coords_cache - - if not skip_bounds and geometry: - # Use plain tuples for bounds to avoid NumPy overhead - self._bounds = [p.bounds for p in geometry] - b0 = self._bounds[0] - minx, miny, maxx, maxy = b0 - for i in range(1, len(self._bounds)): - b = self._bounds[i] - if b[0] < minx: minx = b[0] - if b[1] < miny: miny = b[1] - if b[2] > maxx: maxx = b[2] - if b[3] > maxy: maxy = b[3] - self._total_bounds = (minx, miny, maxx, maxy) - - if dilated_geometry is not None: - self._dilated_bounds = [p.bounds for p in dilated_geometry] - b0 = self._dilated_bounds[0] - minx, miny, maxx, maxy = b0 - for i in range(1, len(self._dilated_bounds)): - b = self._dilated_bounds[i] - if b[0] < minx: minx = b[0] - if b[1] < miny: miny = b[1] - if b[2] > maxx: maxx = b[2] - if b[3] > maxy: maxy = b[3] - self._total_dilated_bounds = (minx, miny, maxx, maxy) - else: - self._dilated_bounds = None - self._total_dilated_bounds = None - else: - self._bounds = None - self._total_bounds = None - self._dilated_bounds = None - self._total_dilated_bounds = None - self._bounds_cached = True - - def _ensure_evaluated(self, attr_name: str) -> None: - if self._base_result is None: - return - - # Check if specific attribute is already translated - internal_name = f'_{attr_name}' - if getattr(self, internal_name) is not None: - return - - # Perform Translation for the specific attribute only - base_geoms = getattr(self._base_result, internal_name) - if base_geoms is None: - return - - dx, dy = self._offset - # Use shapely.affinity.translate (imported at top level) - translated_geoms = [translate(p, dx, dy) for p in base_geoms] - setattr(self, internal_name, translated_geoms) - - @property - def geometry(self) -> list[Polygon]: - self._ensure_evaluated('geometry') - return self._geometry - - @property - def dilated_geometry(self) -> list[Polygon] | None: - self._ensure_evaluated('dilated_geometry') - return self._dilated_geometry - - @property - def proxy_geometry(self) -> list[Polygon] | None: - self._ensure_evaluated('proxy_geometry') - return self._proxy_geometry - - @property - def actual_geometry(self) -> list[Polygon] | None: - self._ensure_evaluated('actual_geometry') - return self._actual_geometry - - @property - def dilated_actual_geometry(self) -> list[Polygon] | None: - self._ensure_evaluated('dilated_actual_geometry') - return self._dilated_actual_geometry + self._dilated_bounds = [poly.bounds for poly in self.dilated_geometry] + self._total_dilated_bounds = _combine_bounds(self._dilated_bounds) @property def bounds(self) -> list[tuple[float, float, float, float]]: - if not self._bounds_cached: - self._ensure_bounds_evaluated() return self._bounds @property def total_bounds(self) -> tuple[float, float, float, float]: - if not self._bounds_cached: - self._ensure_bounds_evaluated() return self._total_bounds @property def dilated_bounds(self) -> list[tuple[float, float, float, float]] | None: - if not self._bounds_cached: - self._ensure_bounds_evaluated() return self._dilated_bounds @property def total_dilated_bounds(self) -> tuple[float, float, float, float] | None: - if not self._bounds_cached: - self._ensure_bounds_evaluated() return self._total_dilated_bounds - def _ensure_bounds_evaluated(self) -> None: - if self._bounds_cached: return - base = self._base_result - if base is not None: - dx, dy = self._offset - # Direct tuple creation is much faster than NumPy for single AABBs - if base._bounds is not None: - self._bounds = [(b[0]+dx, b[1]+dy, b[2]+dx, b[3]+dy) for b in base._bounds] - if base._total_bounds is not None: - b = base._total_bounds - self._total_bounds = (b[0]+dx, b[1]+dy, b[2]+dx, b[3]+dy) - if base._dilated_bounds is not None: - self._dilated_bounds = [(b[0]+dx, b[1]+dy, b[2]+dx, b[3]+dy) for b in base._dilated_bounds] - if base._total_dilated_bounds is not None: - b = base._total_dilated_bounds - self._total_dilated_bounds = (b[0]+dx, b[1]+dy, b[2]+dx, b[3]+dy) - self._bounds_cached = True - - def translate(self, dx: float, dy: float, rel_gx: int | None = None, rel_gy: int | None = None, rel_go: int | None = None) -> ComponentResult: - """ - Create a new ComponentResult translated by (dx, dy). - """ - new_port = Port(self.end_port.x + dx, self.end_port.y + dy, self.end_port.orientation, snap=False) - - # LAZY TRANSLATE - if self._base_result: - base = self._base_result - current_offset = self._offset - new_offset = (current_offset[0] + dx, current_offset[1] + dy) - else: - base = self - new_offset = (dx, dy) - + def translate(self, dx: int | float, dy: int | float) -> ComponentResult: return ComponentResult( - end_port=new_port, + geometry=[shapely_translate(poly, dx, dy) for poly in self.geometry], + end_port=self.end_port + [dx, dy, 0], length=self.length, move_type=self.move_type, - _base_result=base, - _offset=new_offset, - rel_gx=rel_gx, - rel_gy=rel_gy, - rel_go=rel_go + dilated_geometry=None if self.dilated_geometry is None else [shapely_translate(poly, dx, dy) for poly in self.dilated_geometry], + proxy_geometry=None if self.proxy_geometry is None else [shapely_translate(poly, dx, dy) for poly in self.proxy_geometry], + actual_geometry=None if self.actual_geometry is None else [shapely_translate(poly, dx, dy) for poly in self.actual_geometry], + dilated_actual_geometry=None if self.dilated_actual_geometry is None else [shapely_translate(poly, dx, dy) for poly in self.dilated_actual_geometry], ) -class Straight: - """ - Move generator for straight waveguide segments. - """ - @staticmethod - def generate( - start_port: Port, - length: float, - width: float, - snap_to_grid: bool = True, - dilation: float = 0.0, - snap_size: float = DEFAULT_SEARCH_GRID_SNAP_UM, - ) -> ComponentResult: - """ - Generate a straight waveguide segment. - """ - rad = numpy.radians(start_port.orientation) - cos_val = numpy.cos(rad) - sin_val = numpy.sin(rad) - - ex = start_port.x + length * cos_val - ey = start_port.y + length * sin_val - - if snap_to_grid: - ex = snap_search_grid(ex, snap_size) - ey = snap_search_grid(ey, snap_size) - - end_port = Port(ex, ey, start_port.orientation) - actual_length = numpy.sqrt((end_port.x - start_port.x)**2 + (end_port.y - start_port.y)**2) - - # Create polygons using vectorized points - half_w = width / 2.0 - pts_raw = numpy.array([ - [0, half_w], - [actual_length, half_w], - [actual_length, -half_w], - [0, -half_w] - ]) - - # Rotation matrix (standard 2D rotation) - rot_matrix = numpy.array([[cos_val, -sin_val], [sin_val, cos_val]]) - - # Transform points: P' = R * P + T - poly_points = (pts_raw @ rot_matrix.T) + [start_port.x, start_port.y] - geom = [Polygon(poly_points)] - - dilated_geom = None - if dilation > 0: - # Direct calculation of dilated rectangle instead of expensive buffer() - half_w_dil = half_w + dilation - pts_dil = numpy.array([ - [-dilation, half_w_dil], - [actual_length + dilation, half_w_dil], - [actual_length + dilation, -half_w_dil], - [-dilation, -half_w_dil] - ]) - poly_points_dil = (pts_dil @ rot_matrix.T) + [start_port.x, start_port.y] - dilated_geom = [Polygon(poly_points_dil)] - - # Pre-calculate grid indices for faster ComponentResult init - inv_snap = 1.0 / snap_size - rgx = int(round(ex * inv_snap)) - rgy = int(round(ey * inv_snap)) - rgo = int(round(start_port.orientation)) - - # For straight segments, geom IS the actual geometry - return ComponentResult( - geometry=geom, end_port=end_port, length=actual_length, - dilated_geometry=dilated_geom, actual_geometry=geom, - dilated_actual_geometry=dilated_geom, move_type='Straight', - snap_size=snap_size, rel_gx=rgx, rel_gy=rgy, rel_go=rgo - ) +def _combine_bounds(bounds_list: list[tuple[float, float, float, float]]) -> tuple[float, float, float, float]: + arr = numpy.asarray(bounds_list, dtype=numpy.float64) + return ( + float(arr[:, 0].min()), + float(arr[:, 1].min()), + float(arr[:, 2].max()), + float(arr[:, 3].max()), + ) def _get_num_segments(radius: float, angle_deg: float, sagitta: float = 0.01) -> int: - """ - Calculate number of segments for an arc to maintain a maximum sagitta. - """ if radius <= 0: return 1 ratio = max(0.0, min(1.0, 1.0 - sagitta / radius)) @@ -332,350 +111,223 @@ def _get_num_segments(radius: float, angle_deg: float, sagitta: float = 0.01) -> def _get_arc_polygons( - cx: float, - cy: float, - radius: float, - width: float, - t_start: float, - t_end: float, - sagitta: float = 0.01, - dilation: float = 0.0, - ) -> list[Polygon]: - """ - Helper to generate arc-shaped polygons using vectorized NumPy operations. - """ - num_segments = _get_num_segments(radius, float(numpy.degrees(abs(t_end - t_start))), sagitta) + cxy: tuple[float, float], + radius: float, + width: float, + ts: tuple[float, float], + sagitta: float = 0.01, + dilation: float = 0.0, +) -> list[Polygon]: + t_start, t_end = numpy.radians(ts[0]), numpy.radians(ts[1]) + num_segments = _get_num_segments(radius, abs(ts[1] - ts[0]), sagitta) angles = numpy.linspace(t_start, t_end, num_segments + 1) - - cos_a = numpy.cos(angles) - sin_a = numpy.sin(angles) - + + cx, cy = cxy inner_radius = radius - width / 2.0 - dilation outer_radius = radius + width / 2.0 + dilation - - inner_points = numpy.stack([cx + inner_radius * cos_a, cy + inner_radius * sin_a], axis=1) - outer_points = numpy.stack([cx + outer_radius * cos_a[::-1], cy + outer_radius * sin_a[::-1]], axis=1) - - # Concatenate inner and outer points to form the polygon ring - poly_points = numpy.concatenate([inner_points, outer_points]) - - return [Polygon(poly_points)] + + cos_a = numpy.cos(angles) + sin_a = numpy.sin(angles) + + inner_points = numpy.column_stack((cx + inner_radius * cos_a, cy + inner_radius * sin_a)) + outer_points = numpy.column_stack((cx + outer_radius * cos_a[::-1], cy + outer_radius * sin_a[::-1])) + return [Polygon(numpy.concatenate((inner_points, outer_points), axis=0))] -def _clip_bbox( - cx: float, - cy: float, - radius: float, - width: float, - t_start: float, - t_end: float, - ) -> Polygon: - """ - Generates a rotationally invariant bounding polygon for an arc. - """ - sweep = abs(t_end - t_start) - if sweep > 2 * numpy.pi: - sweep = sweep % (2 * numpy.pi) - - mid_angle = (t_start + t_end) / 2.0 - # Handle wrap-around for mid_angle - if abs(t_end - t_start) > numpy.pi: - mid_angle += numpy.pi - - r_out = radius + width / 2.0 - r_in = max(0.0, radius - width / 2.0) - - half_sweep = sweep / 2.0 - - # Define vertices in local space (center at 0,0, symmetry axis along +X) - cos_hs = numpy.cos(half_sweep) - cos_hs2 = numpy.cos(half_sweep / 2.0) - - # Distance to peak from center: r_out / cos(hs/2) - peak_r = r_out / cos_hs2 - - local_verts = [ - [r_in * numpy.cos(-half_sweep), r_in * numpy.sin(-half_sweep)], - [r_out * numpy.cos(-half_sweep), r_out * numpy.sin(-half_sweep)], - [peak_r * numpy.cos(-half_sweep/2), peak_r * numpy.sin(-half_sweep/2)], - [peak_r * numpy.cos(half_sweep/2), peak_r * numpy.sin(half_sweep/2)], - [r_out * numpy.cos(half_sweep), r_out * numpy.sin(half_sweep)], - [r_in * numpy.cos(half_sweep), r_in * numpy.sin(half_sweep)], - [r_in, 0.0] - ] - - # Rotate and translate to world space - cos_m = numpy.cos(mid_angle) - sin_m = numpy.sin(mid_angle) - rot = numpy.array([[cos_m, -sin_m], [sin_m, cos_m]]) - - world_verts = (numpy.array(local_verts) @ rot.T) + [cx, cy] - - return Polygon(world_verts) +def _clip_bbox(cxy: tuple[float, float], radius: float, width: float, ts: tuple[float, float], clip_margin: float) -> Polygon: + arc_poly = _get_arc_polygons(cxy, radius, width, ts)[0] + minx, miny, maxx, maxy = arc_poly.bounds + bbox_poly = box(minx, miny, maxx, maxy) + shrink = min(clip_margin, max(radius, width)) + return bbox_poly.buffer(-shrink, join_style=2) if shrink > 0 else bbox_poly def _apply_collision_model( - arc_poly: Polygon, - collision_type: Literal["arc", "bbox", "clipped_bbox"] | Polygon, - radius: float, - width: float, - cx: float = 0.0, - cy: float = 0.0, - clip_margin: float = 10.0, - t_start: float | None = None, - t_end: float | None = None, - ) -> list[Polygon]: - """ - Applies the specified collision model to an arc geometry. - """ + arc_poly: Polygon, + collision_type: Literal["arc", "bbox", "clipped_bbox"] | Polygon, + radius: float, + width: float, + cxy: tuple[float, float], + clip_margin: float, + ts: tuple[float, float], +) -> list[Polygon]: if isinstance(collision_type, Polygon): - # Translate the custom polygon to the bend center (cx, cy) - return [shapely.transform(collision_type, lambda x: x + [cx, cy])] - + return [shapely_translate(collision_type, cxy[0], cxy[1])] if collision_type == "arc": return [arc_poly] - - if collision_type == "clipped_bbox" and t_start is not None and t_end is not None: - return [_clip_bbox(cx, cy, radius, width, t_start, t_end)] + if collision_type == "clipped_bbox": + clipped = _clip_bbox(cxy, radius, width, ts, clip_margin) + return [clipped if not clipped.is_empty else box(*arc_poly.bounds)] + return [box(*arc_poly.bounds)] - # Bounding box of the high-fidelity arc (fallback for bbox or missing angles) - minx, miny, maxx, maxy = arc_poly.bounds - bbox_poly = box(minx, miny, maxx, maxy) - if collision_type == "bbox": - return [bbox_poly] - - return [arc_poly] +class Straight: + @staticmethod + def generate( + start_port: Port, + length: float, + width: float, + dilation: float = 0.0, + ) -> ComponentResult: + rot2 = rotation_matrix2(start_port.r) + length_f = _normalize_length(length) + disp = rot2 @ numpy.array((length_f, 0.0)) + end_port = Port(start_port.x + disp[0], start_port.y + disp[1], start_port.r) + + half_w = width / 2.0 + pts = numpy.array(((0.0, half_w), (length_f, half_w), (length_f, -half_w), (0.0, -half_w))) + poly_points = (pts @ rot2.T) + numpy.array((start_port.x, start_port.y)) + geometry = [Polygon(poly_points)] + + dilated_geometry = None + if dilation > 0: + half_w_d = half_w + dilation + pts_d = numpy.array(((-dilation, half_w_d), (length_f + dilation, half_w_d), (length_f + dilation, -half_w_d), (-dilation, -half_w_d))) + poly_points_d = (pts_d @ rot2.T) + numpy.array((start_port.x, start_port.y)) + dilated_geometry = [Polygon(poly_points_d)] + + return ComponentResult( + geometry=geometry, + end_port=end_port, + length=abs(length_f), + move_type="Straight", + dilated_geometry=dilated_geometry, + actual_geometry=geometry, + dilated_actual_geometry=dilated_geometry, + ) class Bend90: - """ - Move generator for 90-degree waveguide bends. - """ @staticmethod def generate( - start_port: Port, - radius: float, - width: float, - direction: Literal["CW", "CCW"], - sagitta: float = 0.01, - collision_type: Literal["arc", "bbox", "clipped_bbox"] | Polygon = "arc", - clip_margin: float = 10.0, - dilation: float = 0.0, - snap_to_grid: bool = True, - snap_size: float = DEFAULT_SEARCH_GRID_SNAP_UM, - ) -> ComponentResult: - """ - Generate a 90-degree bend. - """ - rad_start = numpy.radians(start_port.orientation) - - # Center of the arc - if direction == "CCW": - cx = start_port.x + radius * numpy.cos(rad_start + numpy.pi / 2) - cy = start_port.y + radius * numpy.sin(rad_start + numpy.pi / 2) - t_start = rad_start - numpy.pi / 2 - t_end = t_start + numpy.pi / 2 - new_ori = (start_port.orientation + 90) % 360 - else: - cx = start_port.x + radius * numpy.cos(rad_start - numpy.pi / 2) - cy = start_port.y + radius * numpy.sin(rad_start - numpy.pi / 2) - t_start = rad_start + numpy.pi / 2 - t_end = t_start - numpy.pi / 2 - new_ori = (start_port.orientation - 90) % 360 + start_port: Port, + radius: float, + width: float, + direction: Literal["CW", "CCW"], + sagitta: float = 0.01, + collision_type: Literal["arc", "bbox", "clipped_bbox"] | Polygon = "arc", + clip_margin: float = 10.0, + dilation: float = 0.0, + ) -> ComponentResult: + rot2 = rotation_matrix2(start_port.r) + sign = 1 if direction == "CCW" else -1 - # Snap the end point to the grid - ex_raw = cx + radius * numpy.cos(t_end) - ey_raw = cy + radius * numpy.sin(t_end) - - if snap_to_grid: - ex = snap_search_grid(ex_raw, snap_size) - ey = snap_search_grid(ey_raw, snap_size) - else: - ex, ey = ex_raw, ey_raw - - # Slightly adjust radius and t_end to hit snapped point exactly - dx, dy = ex - cx, ey - cy - actual_radius = numpy.sqrt(dx**2 + dy**2) - - t_end_snapped = numpy.arctan2(dy, dx) - # Ensure directionality and approx 90 degree sweep - if direction == "CCW": - while t_end_snapped <= t_start: - t_end_snapped += 2 * numpy.pi - while t_end_snapped > t_start + numpy.pi: - t_end_snapped -= 2 * numpy.pi - else: - while t_end_snapped >= t_start: - t_end_snapped -= 2 * numpy.pi - while t_end_snapped < t_start - numpy.pi: - t_end_snapped += 2 * numpy.pi - t_end = t_end_snapped + center_local = numpy.array((0.0, sign * radius)) + end_local = numpy.array((radius, sign * radius)) + center_xy = (rot2 @ center_local) + numpy.array((start_port.x, start_port.y)) + end_xy = (rot2 @ end_local) + numpy.array((start_port.x, start_port.y)) + end_port = Port(end_xy[0], end_xy[1], start_port.r + sign * 90) - end_port = Port(ex, ey, new_ori) + start_theta = start_port.r - sign * 90 + end_theta = start_port.r + ts = (float(start_theta), float(end_theta)) - arc_polys = _get_arc_polygons(cx, cy, actual_radius, width, t_start, t_end, sagitta) + arc_polys = _get_arc_polygons((float(center_xy[0]), float(center_xy[1])), radius, width, ts, sagitta) collision_polys = _apply_collision_model( - arc_polys[0], collision_type, actual_radius, width, cx, cy, clip_margin, t_start, t_end + arc_polys[0], + collision_type, + radius, + width, + (float(center_xy[0]), float(center_xy[1])), + clip_margin, + ts, ) - proxy_geom = None + proxy_geometry = None if collision_type == "arc": - # Auto-generate a clipped_bbox proxy for tiered collision checks - proxy_geom = _apply_collision_model( - arc_polys[0], "clipped_bbox", actual_radius, width, cx, cy, clip_margin, t_start, t_end + proxy_geometry = _apply_collision_model( + arc_polys[0], + "clipped_bbox", + radius, + width, + (float(center_xy[0]), float(center_xy[1])), + clip_margin, + ts, ) - dilated_geom = None - dilated_actual_geom = None + dilated_actual_geometry = None + dilated_geometry = None if dilation > 0: - dilated_actual_geom = _get_arc_polygons(cx, cy, actual_radius, width, t_start, t_end, sagitta, dilation=dilation) - if collision_type == "arc": - dilated_geom = dilated_actual_geom - else: - dilated_geom = [p.buffer(dilation) for p in collision_polys] - - # Pre-calculate grid indices for faster ComponentResult init - inv_snap = 1.0 / snap_size - rgx = int(round(ex * inv_snap)) - rgy = int(round(ey * inv_snap)) - rgo = int(round(new_ori)) + dilated_actual_geometry = _get_arc_polygons((float(center_xy[0]), float(center_xy[1])), radius, width, ts, sagitta, dilation=dilation) + dilated_geometry = dilated_actual_geometry if collision_type == "arc" else [poly.buffer(dilation) for poly in collision_polys] return ComponentResult( - geometry=collision_polys, - end_port=end_port, - length=actual_radius * numpy.abs(t_end - t_start), - dilated_geometry=dilated_geom, - proxy_geometry=proxy_geom, + geometry=collision_polys, + end_port=end_port, + length=abs(radius) * numpy.pi / 2.0, + move_type="Bend90", + dilated_geometry=dilated_geometry, + proxy_geometry=proxy_geometry, actual_geometry=arc_polys, - dilated_actual_geometry=dilated_actual_geom, - move_type='Bend90', - snap_size=snap_size, - rel_gx=rgx, rel_gy=rgy, rel_go=rgo + dilated_actual_geometry=dilated_actual_geometry, ) class SBend: - """ - Move generator for parametric S-bends. - """ @staticmethod def generate( - start_port: Port, - offset: float, - radius: float, - width: float, - sagitta: float = 0.01, - collision_type: Literal["arc", "bbox", "clipped_bbox"] | Polygon = "arc", - clip_margin: float = 10.0, - dilation: float = 0.0, - snap_to_grid: bool = True, - snap_size: float = DEFAULT_SEARCH_GRID_SNAP_UM, - ) -> ComponentResult: - """ - Generate a parametric S-bend (two tangent arcs). - """ + start_port: Port, + offset: float, + radius: float, + width: float, + sagitta: float = 0.01, + collision_type: Literal["arc", "bbox", "clipped_bbox"] | Polygon = "arc", + clip_margin: float = 10.0, + dilation: float = 0.0, + ) -> ComponentResult: if abs(offset) >= 2 * radius: raise ValueError(f"SBend offset {offset} must be less than 2*radius {2 * radius}") - theta_init = numpy.arccos(1 - abs(offset) / (2 * radius)) - dx_init = 2 * radius * numpy.sin(theta_init) - rad_start = numpy.radians(start_port.orientation) - - # Target point - ex_raw = start_port.x + dx_init * numpy.cos(rad_start) - offset * numpy.sin(rad_start) - ey_raw = start_port.y + dx_init * numpy.sin(rad_start) + offset * numpy.cos(rad_start) + sign = 1 if offset >= 0 else -1 + theta = numpy.arccos(1.0 - abs(offset) / (2.0 * radius)) + dx = 2.0 * radius * numpy.sin(theta) + theta_deg = float(numpy.degrees(theta)) - if snap_to_grid: - ex = snap_search_grid(ex_raw, snap_size) - ey = snap_search_grid(ey_raw, snap_size) - else: - ex, ey = ex_raw, ey_raw + rot2 = rotation_matrix2(start_port.r) + end_local = numpy.array((dx, offset)) + end_xy = (rot2 @ end_local) + numpy.array((start_port.x, start_port.y)) + end_port = Port(end_xy[0], end_xy[1], start_port.r) - end_port = Port(ex, ey, start_port.orientation) + c1_local = numpy.array((0.0, sign * radius)) + c2_local = numpy.array((dx, offset - sign * radius)) + c1_xy = (rot2 @ c1_local) + numpy.array((start_port.x, start_port.y)) + c2_xy = (rot2 @ c2_local) + numpy.array((start_port.x, start_port.y)) - # Solve for theta and radius that hit (ex, ey) exactly - local_dx = (ex - start_port.x) * numpy.cos(rad_start) + (ey - start_port.y) * numpy.sin(rad_start) - local_dy = -(ex - start_port.x) * numpy.sin(rad_start) + (ey - start_port.y) * numpy.cos(rad_start) - - # tan(theta / 2) = local_dy / local_dx - theta = 2 * numpy.arctan2(abs(local_dy), local_dx) - - if abs(theta) < TOLERANCE_ANGULAR: - # De-generate to straight - actual_len = numpy.sqrt(local_dx**2 + local_dy**2) - return Straight.generate(start_port, actual_len, width, snap_to_grid=False, dilation=dilation, snap_size=snap_size) + ts1 = (float(start_port.r - sign * 90), float(start_port.r - sign * 90 + sign * theta_deg)) + second_base = start_port.r + (90 if sign > 0 else 270) + ts2 = (float(second_base + sign * theta_deg), float(second_base)) - denom = (2 * (1 - numpy.cos(theta))) - if abs(denom) < TOLERANCE_LINEAR: - raise ValueError("SBend calculation failed: radius denominator zero") - - actual_radius = abs(local_dy) / denom - - # Safety Check: Reject SBends with tiny radii that would cause self-overlap - if actual_radius < width: - raise ValueError(f"SBend actual_radius {actual_radius:.3f} is too small (width={width})") + arc1 = _get_arc_polygons((float(c1_xy[0]), float(c1_xy[1])), radius, width, ts1, sagitta)[0] + arc2 = _get_arc_polygons((float(c2_xy[0]), float(c2_xy[1])), radius, width, ts2, sagitta)[0] + actual_geometry = [arc1, arc2] + geometry = [ + _apply_collision_model(arc1, collision_type, radius, width, (float(c1_xy[0]), float(c1_xy[1])), clip_margin, ts1)[0], + _apply_collision_model(arc2, collision_type, radius, width, (float(c2_xy[0]), float(c2_xy[1])), clip_margin, ts2)[0], + ] - # Limit radius to prevent giant arcs - if actual_radius > 100000.0: - actual_len = numpy.sqrt(local_dx**2 + local_dy**2) - return Straight.generate(start_port, actual_len, width, snap_to_grid=False, dilation=dilation, snap_size=snap_size) - - direction = 1 if local_dy > 0 else -1 - c1_angle = rad_start + direction * numpy.pi / 2 - cx1 = start_port.x + actual_radius * numpy.cos(c1_angle) - cy1 = start_port.y + actual_radius * numpy.sin(c1_angle) - ts1, te1 = c1_angle + numpy.pi, c1_angle + numpy.pi + direction * theta - - c2_angle = rad_start - direction * numpy.pi / 2 - cx2 = ex + actual_radius * numpy.cos(c2_angle) - cy2 = ey + actual_radius * numpy.sin(c2_angle) - te2 = c2_angle + numpy.pi - ts2 = te2 + direction * theta - - arc1 = _get_arc_polygons(cx1, cy1, actual_radius, width, ts1, te1, sagitta)[0] - arc2 = _get_arc_polygons(cx2, cy2, actual_radius, width, ts2, te2, sagitta)[0] - arc_polys = [arc1, arc2] - - # Use the provided collision model for primary geometry - col1 = _apply_collision_model(arc1, collision_type, actual_radius, width, cx1, cy1, clip_margin, ts1, te1)[0] - col2 = _apply_collision_model(arc2, collision_type, actual_radius, width, cx2, cy2, clip_margin, ts2, te2)[0] - collision_polys = [col1, col2] - - proxy_geom = None + proxy_geometry = None if collision_type == "arc": - # Auto-generate proxies - p1 = _apply_collision_model(arc1, "clipped_bbox", actual_radius, width, cx1, cy1, clip_margin, ts1, te1)[0] - p2 = _apply_collision_model(arc2, "clipped_bbox", actual_radius, width, cx2, cy2, clip_margin, ts2, te2)[0] - proxy_geom = [p1, p2] + proxy_geometry = [ + _apply_collision_model(arc1, "clipped_bbox", radius, width, (float(c1_xy[0]), float(c1_xy[1])), clip_margin, ts1)[0], + _apply_collision_model(arc2, "clipped_bbox", radius, width, (float(c2_xy[0]), float(c2_xy[1])), clip_margin, ts2)[0], + ] - dilated_geom = None - dilated_actual_geom = None + dilated_actual_geometry = None + dilated_geometry = None if dilation > 0: - d1 = _get_arc_polygons(cx1, cy1, actual_radius, width, ts1, te1, sagitta, dilation=dilation)[0] - d2 = _get_arc_polygons(cx2, cy2, actual_radius, width, ts2, te2, sagitta, dilation=dilation)[0] - dilated_actual_geom = [d1, d2] - - if collision_type == "arc": - dilated_geom = dilated_actual_geom - else: - dilated_geom = [p.buffer(dilation) for p in collision_polys] - - # Pre-calculate grid indices for faster ComponentResult init - inv_snap = 1.0 / snap_size - rgx = int(round(ex * inv_snap)) - rgy = int(round(ey * inv_snap)) - rgo = int(round(start_port.orientation)) + dilated_actual_geometry = [ + _get_arc_polygons((float(c1_xy[0]), float(c1_xy[1])), radius, width, ts1, sagitta, dilation=dilation)[0], + _get_arc_polygons((float(c2_xy[0]), float(c2_xy[1])), radius, width, ts2, sagitta, dilation=dilation)[0], + ] + dilated_geometry = dilated_actual_geometry if collision_type == "arc" else [poly.buffer(dilation) for poly in geometry] return ComponentResult( - geometry=collision_polys, - end_port=end_port, - length=2 * actual_radius * theta, - dilated_geometry=dilated_geom, - proxy_geometry=proxy_geom, - actual_geometry=arc_polys, - dilated_actual_geometry=dilated_actual_geom, - move_type='SBend', - snap_size=snap_size, - rel_gx=rgx, rel_gy=rgy, rel_go=rgo + geometry=geometry, + end_port=end_port, + length=2.0 * radius * theta, + move_type="SBend", + dilated_geometry=dilated_geometry, + proxy_geometry=proxy_geometry, + actual_geometry=actual_geometry, + dilated_actual_geometry=dilated_actual_geometry, ) diff --git a/inire/geometry/primitives.py b/inire/geometry/primitives.py index 1687fcf..b6d6b9c 100644 --- a/inire/geometry/primitives.py +++ b/inire/geometry/primitives.py @@ -1,77 +1,160 @@ from __future__ import annotations +from collections.abc import Iterator +from typing import Self + import numpy +from numpy.typing import ArrayLike, NDArray -# 1nm snap (0.001 µm) -GRID_SNAP_UM = 0.001 +def _normalize_angle(angle_deg: int | float) -> int: + angle = int(round(angle_deg)) % 360 + if angle % 90 != 0: + raise ValueError(f"Port angle must be Manhattan (multiple of 90), got {angle_deg!r}") + return angle -def snap_nm(value: float) -> float: - """ - Snap a coordinate to the nearest 1nm (0.001 um). - """ - return round(value * 1000) / 1000 +def _as_int32_triplet(value: ArrayLike) -> NDArray[numpy.int32]: + arr = numpy.asarray(value, dtype=numpy.int32) + if arr.shape != (3,): + raise ValueError(f"Port array must have shape (3,), got {arr.shape}") + arr = arr.copy() + arr[2] = _normalize_angle(int(arr[2])) + return arr -from inire.constants import TOLERANCE_LINEAR - class Port: """ - A port defined by (x, y, orientation) in micrometers. + Port represented as an ndarray-backed (x, y, r) triple with int32 storage. """ - __slots__ = ('x', 'y', 'orientation') - def __init__( - self, - x: float, - y: float, - orientation: float, - snap: bool = True - ) -> None: - if snap: - self.x = round(x * 1000) / 1000 - self.y = round(y * 1000) / 1000 - # Faster orientation normalization for common cases - if 0 <= orientation < 360: - self.orientation = float(orientation) - else: - self.orientation = float(orientation % 360) - else: - self.x = x - self.y = y - self.orientation = float(orientation) + __slots__ = ("_xyr",) + + def __init__(self, x: int | float, y: int | float, r: int | float) -> None: + self._xyr = numpy.array( + (int(round(x)), int(round(y)), _normalize_angle(r)), + dtype=numpy.int32, + ) + + @classmethod + def from_array(cls, xyr: ArrayLike) -> Self: + obj = cls.__new__(cls) + obj._xyr = _as_int32_triplet(xyr) + return obj + + @property + def x(self) -> int: + return int(self._xyr[0]) + + @x.setter + def x(self, val: int | float) -> None: + self._xyr[0] = int(round(val)) + + @property + def y(self) -> int: + return int(self._xyr[1]) + + @y.setter + def y(self, val: int | float) -> None: + self._xyr[1] = int(round(val)) + + @property + def r(self) -> int: + return int(self._xyr[2]) + + @r.setter + def r(self, val: int | float) -> None: + self._xyr[2] = _normalize_angle(val) + + @property + def orientation(self) -> int: + return self.r + + @orientation.setter + def orientation(self, val: int | float) -> None: + self.r = val + + @property + def xyr(self) -> NDArray[numpy.int32]: + return self._xyr + + @xyr.setter + def xyr(self, val: ArrayLike) -> None: + self._xyr = _as_int32_triplet(val) def __repr__(self) -> str: - return f'Port(x={self.x}, y={self.y}, orientation={self.orientation})' + return f"Port(x={self.x}, y={self.y}, r={self.r})" + + def __iter__(self) -> Iterator[int]: + return iter((self.x, self.y, self.r)) + + def __len__(self) -> int: + return 3 + + def __getitem__(self, item: int | slice) -> int | NDArray[numpy.int32]: + return self._xyr[item] + + def __array__(self, dtype: numpy.dtype | None = None) -> NDArray[numpy.int32]: + return numpy.asarray(self._xyr, dtype=dtype) def __eq__(self, other: object) -> bool: if not isinstance(other, Port): return False - return (abs(self.x - other.x) < TOLERANCE_LINEAR and - abs(self.y - other.y) < TOLERANCE_LINEAR and - abs(self.orientation - other.orientation) < TOLERANCE_LINEAR) + return bool(numpy.array_equal(self._xyr, other._xyr)) def __hash__(self) -> int: - return hash((round(self.x, 6), round(self.y, 6), round(self.orientation, 6))) + return hash(self.as_tuple()) + + def copy(self) -> Self: + return type(self).from_array(self._xyr.copy()) + + def as_tuple(self) -> tuple[int, int, int]: + return (self.x, self.y, self.r) + + def translate(self, dxy: ArrayLike) -> Self: + dxy_arr = numpy.asarray(dxy, dtype=numpy.int32) + if dxy_arr.shape == (2,): + return type(self)(self.x + int(dxy_arr[0]), self.y + int(dxy_arr[1]), self.r) + if dxy_arr.shape == (3,): + return type(self)(self.x + int(dxy_arr[0]), self.y + int(dxy_arr[1]), self.r + int(dxy_arr[2])) + raise ValueError(f"Translation must have shape (2,) or (3,), got {dxy_arr.shape}") + + def __add__(self, other: ArrayLike) -> Self: + return self.translate(other) + + def __sub__(self, other: ArrayLike | Self) -> NDArray[numpy.int32]: + if isinstance(other, Port): + return self._xyr - other._xyr + return self._xyr - numpy.asarray(other, dtype=numpy.int32) -def translate_port(port: Port, dx: float, dy: float) -> Port: - """ - Translate a port by (dx, dy). - """ - return Port(port.x + dx, port.y + dy, port.orientation) +ROT2_0 = numpy.array(((1, 0), (0, 1)), dtype=numpy.int32) +ROT2_90 = numpy.array(((0, -1), (1, 0)), dtype=numpy.int32) +ROT2_180 = numpy.array(((-1, 0), (0, -1)), dtype=numpy.int32) +ROT2_270 = numpy.array(((0, 1), (-1, 0)), dtype=numpy.int32) -def rotate_port(port: Port, angle: float, origin: tuple[float, float] = (0, 0)) -> Port: - """ - Rotate a port by a multiple of 90 degrees around an origin. - """ - ox, oy = origin - px, py = port.x, port.y +def rotation_matrix2(rotation_deg: int) -> NDArray[numpy.int32]: + quadrant = (_normalize_angle(rotation_deg) // 90) % 4 + return (ROT2_0, ROT2_90, ROT2_180, ROT2_270)[quadrant] - rad = numpy.radians(angle) - qx = snap_nm(ox + numpy.cos(rad) * (px - ox) - numpy.sin(rad) * (py - oy)) - qy = snap_nm(oy + numpy.sin(rad) * (px - ox) + numpy.cos(rad) * (py - oy)) - return Port(qx, qy, port.orientation + angle) +def rotation_matrix3(rotation_deg: int) -> NDArray[numpy.int32]: + rot2 = rotation_matrix2(rotation_deg) + rot3 = numpy.zeros((3, 3), dtype=numpy.int32) + rot3[:2, :2] = rot2 + rot3[2, 2] = 1 + return rot3 + + +def translate_port(port: Port, dx: int | float, dy: int | float) -> Port: + return Port(port.x + dx, port.y + dy, port.r) + + +def rotate_port(port: Port, angle: int | float, origin: tuple[int | float, int | float] = (0, 0)) -> Port: + angle_i = _normalize_angle(angle) + rot = rotation_matrix2(angle_i) + origin_xy = numpy.array((int(round(origin[0])), int(round(origin[1]))), dtype=numpy.int32) + rel = numpy.array((port.x, port.y), dtype=numpy.int32) - origin_xy + rotated = origin_xy + rot @ rel + return Port(int(rotated[0]), int(rotated[1]), port.r + angle_i) diff --git a/inire/router/astar.py b/inire/router/astar.py index 1d4c609..098bf1b 100644 --- a/inire/router/astar.py +++ b/inire/router/astar.py @@ -2,16 +2,15 @@ from __future__ import annotations import heapq import logging -from typing import TYPE_CHECKING, Literal, Any +from typing import TYPE_CHECKING, Any, Literal -import numpy import shapely -from inire.geometry.components import Bend90, SBend, Straight, snap_search_grid +from inire.constants import TOLERANCE_LINEAR +from inire.geometry.components import Bend90, SBend, Straight from inire.geometry.primitives import Port from inire.router.config import RouterConfig from inire.router.visibility import VisibilityManager -from inire.constants import DEFAULT_SEARCH_GRID_SNAP_UM, TOLERANCE_LINEAR, TOLERANCE_ANGULAR if TYPE_CHECKING: from inire.geometry.components import ComponentResult @@ -21,19 +20,16 @@ logger = logging.getLogger(__name__) class AStarNode: - """ - A node in the A* search tree. - """ - __slots__ = ('port', 'g_cost', 'h_cost', 'fh_cost', 'parent', 'component_result') + __slots__ = ("port", "g_cost", "h_cost", "fh_cost", "parent", "component_result") def __init__( - self, - port: Port, - g_cost: float, - h_cost: float, - parent: AStarNode | None = None, - component_result: ComponentResult | None = None, - ) -> None: + self, + port: Port, + g_cost: float, + h_cost: float, + parent: AStarNode | None = None, + component_result: ComponentResult | None = None, + ) -> None: self.port = port self.g_cost = g_cost self.h_cost = h_cost @@ -46,16 +42,20 @@ class AStarNode: class AStarMetrics: - """ - Performance metrics and instrumentation for A* search. - """ - __slots__ = ('total_nodes_expanded', 'last_expanded_nodes', 'nodes_expanded', - 'moves_generated', 'moves_added', 'pruned_closed_set', - 'pruned_hard_collision', 'pruned_cost') + __slots__ = ( + "total_nodes_expanded", + "last_expanded_nodes", + "nodes_expanded", + "moves_generated", + "moves_added", + "pruned_closed_set", + "pruned_hard_collision", + "pruned_cost", + ) def __init__(self) -> None: self.total_nodes_expanded = 0 - self.last_expanded_nodes: list[tuple[float, float, float]] = [] + self.last_expanded_nodes: list[tuple[int, int, int]] = [] self.nodes_expanded = 0 self.moves_generated = 0 self.moves_added = 0 @@ -64,7 +64,6 @@ class AStarMetrics: self.pruned_cost = 0 def reset_per_route(self) -> None: - """ Reset metrics that are specific to a single route() call. """ self.nodes_expanded = 0 self.moves_generated = 0 self.moves_added = 0 @@ -73,453 +72,461 @@ class AStarMetrics: self.pruned_cost = 0 self.last_expanded_nodes = [] - def get_summary_dict(self) -> dict[str, int]: - """ Return a dictionary of current metrics. """ - return { - 'nodes_expanded': self.nodes_expanded, - 'moves_generated': self.moves_generated, - 'moves_added': self.moves_added, - 'pruned_closed_set': self.pruned_closed_set, - 'pruned_hard_collision': self.pruned_hard_collision, - 'pruned_cost': self.pruned_cost - } - class AStarContext: - """ - Persistent state for A* search, decoupled from search logic. - """ - __slots__ = ('cost_evaluator', 'config', 'visibility_manager', - 'move_cache_rel', 'move_cache_abs', 'hard_collision_set', 'static_safe_cache', 'max_cache_size') + __slots__ = ( + "cost_evaluator", + "config", + "visibility_manager", + "move_cache_rel", + "move_cache_abs", + "hard_collision_set", + "static_safe_cache", + "max_cache_size", + ) def __init__( - self, - cost_evaluator: CostEvaluator, - node_limit: int = 1000000, - snap_size: float = DEFAULT_SEARCH_GRID_SNAP_UM, - max_straight_length: float = 2000.0, - min_straight_length: float = 5.0, - bend_radii: list[float] | None = None, - sbend_radii: list[float] | None = None, - sbend_offsets: list[float] | None = None, - bend_penalty: float = 250.0, - sbend_penalty: float = 500.0, - bend_collision_type: Literal["arc", "bbox", "clipped_bbox"] | Any = "arc", - bend_clip_margin: float = 10.0, - max_cache_size: int = 1000000, - ) -> None: + self, + cost_evaluator: CostEvaluator, + node_limit: int = 1000000, + max_straight_length: float = 2000.0, + min_straight_length: float = 5.0, + bend_radii: list[float] | None = None, + sbend_radii: list[float] | None = None, + sbend_offsets: list[float] | None = None, + bend_penalty: float = 250.0, + sbend_penalty: float | None = None, + bend_collision_type: Literal["arc", "bbox", "clipped_bbox"] | Any = "arc", + bend_clip_margin: float = 10.0, + max_cache_size: int = 1000000, + ) -> None: + actual_sbend_penalty = 2.0 * bend_penalty if sbend_penalty is None else sbend_penalty self.cost_evaluator = cost_evaluator self.max_cache_size = max_cache_size - - # Use provided lists or defaults for the configuration - br = bend_radii if bend_radii is not None else [50.0, 100.0] - sr = sbend_radii if sbend_radii is not None else [5.0, 10.0, 50.0, 100.0] - self.config = RouterConfig( node_limit=node_limit, - snap_size=snap_size, max_straight_length=max_straight_length, min_straight_length=min_straight_length, - bend_radii=br, - sbend_radii=sr, + bend_radii=bend_radii if bend_radii is not None else [50.0, 100.0], + sbend_radii=sbend_radii if sbend_radii is not None else [5.0, 10.0, 50.0, 100.0], sbend_offsets=sbend_offsets, bend_penalty=bend_penalty, - sbend_penalty=sbend_penalty, + sbend_penalty=actual_sbend_penalty, bend_collision_type=bend_collision_type, - bend_clip_margin=bend_clip_margin + bend_clip_margin=bend_clip_margin, ) self.cost_evaluator.config = self.config + self.cost_evaluator._refresh_cached_config() self.visibility_manager = VisibilityManager(self.cost_evaluator.collision_engine) - - # Long-lived caches (shared across multiple route calls) self.move_cache_rel: dict[tuple, ComponentResult] = {} self.move_cache_abs: dict[tuple, ComponentResult] = {} self.hard_collision_set: set[tuple] = set() self.static_safe_cache: set[tuple] = set() def clear_static_caches(self) -> None: - """ Clear caches that depend on the state of static obstacles. """ self.hard_collision_set.clear() self.static_safe_cache.clear() - + self.visibility_manager.clear_cache() + def check_cache_eviction(self) -> None: - """ - Trigger FIFO eviction of Absolute moves if cache exceeds max_cache_size. - We preserve Relative move templates. - """ - # Trigger eviction if 20% over limit to reduce frequency - if len(self.move_cache_abs) > self.max_cache_size * 1.2: - num_to_evict = int(len(self.move_cache_abs) * 0.25) - # Efficient FIFO eviction - keys_to_evict = [] - it = iter(self.move_cache_abs) - for _ in range(num_to_evict): - try: keys_to_evict.append(next(it)) - except StopIteration: break - for k in keys_to_evict: - del self.move_cache_abs[k] - - # Decouple collision cache clearing - only clear if truly massive - if len(self.hard_collision_set) > 2000000: - self.hard_collision_set.clear() - self.static_safe_cache.clear() + if len(self.move_cache_abs) <= self.max_cache_size * 1.2: + return + num_to_evict = int(len(self.move_cache_abs) * 0.25) + for idx, key in enumerate(list(self.move_cache_abs.keys())): + if idx >= num_to_evict: + break + del self.move_cache_abs[key] def route_astar( - start: Port, - target: Port, - net_width: float, - context: AStarContext, - metrics: AStarMetrics | None = None, - net_id: str = 'default', - bend_collision_type: Literal['arc', 'bbox', 'clipped_bbox'] | None = None, - return_partial: bool = False, - store_expanded: bool = False, - skip_congestion: bool = False, - max_cost: float | None = None, - self_collision_check: bool = False, - node_limit: int | None = None, - ) -> list[ComponentResult] | None: - """ - Functional implementation of A* routing. - """ + start: Port, + target: Port, + net_width: float, + context: AStarContext, + metrics: AStarMetrics | None = None, + net_id: str = "default", + bend_collision_type: Literal["arc", "bbox", "clipped_bbox"] | None = None, + return_partial: bool = False, + store_expanded: bool = False, + skip_congestion: bool = False, + max_cost: float | None = None, + self_collision_check: bool = False, + node_limit: int | None = None, +) -> list[ComponentResult] | None: if metrics is None: metrics = AStarMetrics() - metrics.reset_per_route() - - # Enforce Grid Alignment for start and target - snap = context.config.snap_size - start_snapped = Port(snap_search_grid(start.x, snap), snap_search_grid(start.y, snap), start.orientation, snap=False) - target_snapped = Port(snap_search_grid(target.x, snap), snap_search_grid(target.y, snap), target.orientation, snap=False) - - # Per-route congestion cache (not shared across different routes) - congestion_cache: dict[tuple, int] = {} if bend_collision_type is not None: context.config.bend_collision_type = bend_collision_type - - context.cost_evaluator.set_target(target_snapped) - + + context.cost_evaluator.set_target(target) open_set: list[AStarNode] = [] - inv_snap = 1.0 / snap - - # (x_grid, y_grid, orientation_grid) -> min_g_cost closed_set: dict[tuple[int, int, int], float] = {} + congestion_cache: dict[tuple, int] = {} - start_node = AStarNode(start_snapped, 0.0, context.cost_evaluator.h_manhattan(start_snapped, target_snapped)) + start_node = AStarNode(start, 0.0, context.cost_evaluator.h_manhattan(start, target)) heapq.heappush(open_set, start_node) - best_node = start_node - nodes_expanded = 0 - effective_node_limit = node_limit if node_limit is not None else context.config.node_limit + nodes_expanded = 0 while open_set: if nodes_expanded >= effective_node_limit: return reconstruct_path(best_node) if return_partial else None current = heapq.heappop(open_set) - - # Cost Pruning (Fail Fast) if max_cost is not None and current.fh_cost[0] > max_cost: - metrics.pruned_cost += 1 - continue - + metrics.pruned_cost += 1 + continue + if current.h_cost < best_node.h_cost: best_node = current - state = (int(round(current.port.x * inv_snap)), int(round(current.port.y * inv_snap)), int(round(current.port.orientation))) + state = current.port.as_tuple() if state in closed_set and closed_set[state] <= current.g_cost + TOLERANCE_LINEAR: continue closed_set[state] = current.g_cost if store_expanded: - metrics.last_expanded_nodes.append((current.port.x, current.port.y, current.port.orientation)) + metrics.last_expanded_nodes.append(state) nodes_expanded += 1 metrics.total_nodes_expanded += 1 metrics.nodes_expanded += 1 - # Check if we reached the target exactly - if (abs(current.port.x - target_snapped.x) < TOLERANCE_LINEAR and - abs(current.port.y - target_snapped.y) < TOLERANCE_LINEAR and - abs(current.port.orientation - target_snapped.orientation) < 0.1): + if current.port == target: return reconstruct_path(current) - # Expansion expand_moves( - current, target_snapped, net_width, net_id, open_set, closed_set, - context, metrics, congestion_cache, - snap=snap, inv_snap=inv_snap, parent_state=state, - max_cost=max_cost, skip_congestion=skip_congestion, - self_collision_check=self_collision_check + current, + target, + net_width, + net_id, + open_set, + closed_set, + context, + metrics, + congestion_cache, + max_cost=max_cost, + skip_congestion=skip_congestion, + self_collision_check=self_collision_check, ) return reconstruct_path(best_node) if return_partial else None +def _quantized_lengths(values: list[float], max_reach: float) -> list[int]: + out = {int(round(v)) for v in values if v > 0 and v <= max_reach + 0.01} + return sorted((v for v in out if v > 0), reverse=True) + + +def _sbend_forward_span(offset: float, radius: float) -> float | None: + abs_offset = abs(offset) + if abs_offset <= TOLERANCE_LINEAR or radius <= 0 or abs_offset >= 2.0 * radius: + return None + theta = __import__("math").acos(1.0 - abs_offset / (2.0 * radius)) + return 2.0 * radius * __import__("math").sin(theta) + + +def _previous_move_metadata(node: AStarNode) -> tuple[str | None, float | None]: + result = node.component_result + if result is None: + return None, None + move_type = result.move_type + if move_type == "Straight": + return move_type, result.length + return move_type, None + + def expand_moves( - current: AStarNode, - target: Port, - net_width: float, - net_id: str, - open_set: list[AStarNode], - closed_set: dict[tuple[int, int, int], float], - context: AStarContext, - metrics: AStarMetrics, - congestion_cache: dict[tuple, int], - snap: float = 1.0, - inv_snap: float | None = None, - parent_state: tuple[int, int, int] | None = None, - max_cost: float | None = None, - skip_congestion: bool = False, - self_collision_check: bool = False, - ) -> None: - """ - Extract moves and add valid successors to the open set. - """ + current: AStarNode, + target: Port, + net_width: float, + net_id: str, + open_set: list[AStarNode], + closed_set: dict[tuple[int, int, int], float], + context: AStarContext, + metrics: AStarMetrics, + congestion_cache: dict[tuple, int], + max_cost: float | None = None, + skip_congestion: bool = False, + self_collision_check: bool = False, +) -> None: cp = current.port - if inv_snap is None: inv_snap = 1.0 / snap - if parent_state is None: - parent_state = (int(round(cp.x * inv_snap)), int(round(cp.y * inv_snap)), int(round(cp.orientation))) - + prev_move_type, prev_straight_length = _previous_move_metadata(current) dx_t = target.x - cp.x dy_t = target.y - cp.y - dist_sq = dx_t*dx_t + dy_t*dy_t - - rad = numpy.radians(cp.orientation) - cos_v, sin_v = numpy.cos(rad), numpy.sin(rad) - - # 1. DIRECT JUMP TO TARGET + dist_sq = dx_t * dx_t + dy_t * dy_t + + if cp.r == 0: + cos_v, sin_v = 1.0, 0.0 + elif cp.r == 90: + cos_v, sin_v = 0.0, 1.0 + elif cp.r == 180: + cos_v, sin_v = -1.0, 0.0 + else: + cos_v, sin_v = 0.0, -1.0 + proj_t = dx_t * cos_v + dy_t * sin_v perp_t = -dx_t * sin_v + dy_t * cos_v + dx_local = proj_t + dy_local = perp_t - # A. Straight Jump (Only if target aligns with grid state or direct jump is enabled) - if proj_t > 0 and abs(perp_t) < 1e-3 and abs(cp.orientation - target.orientation) < 0.1: - max_reach = context.cost_evaluator.collision_engine.ray_cast(cp, cp.orientation, proj_t + 1.0) - if max_reach >= proj_t - 0.01: - process_move( - current, target, net_width, net_id, open_set, closed_set, context, metrics, congestion_cache, - f'S{proj_t}', 'S', (proj_t,), skip_congestion, inv_snap=inv_snap, snap_to_grid=False, - parent_state=parent_state, max_cost=max_cost, snap=snap, self_collision_check=self_collision_check - ) - - # 2. VISIBILITY JUMPS & MAX REACH - max_reach = context.cost_evaluator.collision_engine.ray_cast(cp, cp.orientation, context.config.max_straight_length) - - straight_lengths = set() - if max_reach > context.config.min_straight_length: - straight_lengths.add(snap_search_grid(max_reach, snap)) - for radius in context.config.bend_radii: - if max_reach > radius + context.config.min_straight_length: - straight_lengths.add(snap_search_grid(max_reach - radius, snap)) - - if max_reach > context.config.min_straight_length + 5.0: - straight_lengths.add(snap_search_grid(max_reach - 5.0, snap)) - - straight_lengths.add(context.config.min_straight_length) - if max_reach > context.config.min_straight_length * 4: - straight_lengths.add(snap_search_grid(max_reach / 2.0, snap)) - - if abs(cp.orientation % 180) < 0.1: # Horizontal - target_dist = abs(target.x - cp.x) - if target_dist <= max_reach and target_dist > context.config.min_straight_length: - sl = snap_search_grid(target_dist, snap) - if sl > 0.1: straight_lengths.add(sl) - for radius in context.config.bend_radii: - for l in [target_dist - radius, target_dist - 2*radius]: - if l > context.config.min_straight_length: - s_l = snap_search_grid(l, snap) - if s_l <= max_reach and s_l > 0.1: straight_lengths.add(s_l) - else: # Vertical - target_dist = abs(target.y - cp.y) - if target_dist <= max_reach and target_dist > context.config.min_straight_length: - sl = snap_search_grid(target_dist, snap) - if sl > 0.1: straight_lengths.add(sl) - for radius in context.config.bend_radii: - for l in [target_dist - radius, target_dist - 2*radius]: - if l > context.config.min_straight_length: - s_l = snap_search_grid(l, snap) - if s_l <= max_reach and s_l > 0.1: straight_lengths.add(s_l) - - for length in sorted(straight_lengths, reverse=True): - process_move( - current, target, net_width, net_id, open_set, closed_set, context, metrics, congestion_cache, - f'S{length}', 'S', (length,), skip_congestion, inv_snap=inv_snap, parent_state=parent_state, - max_cost=max_cost, snap=snap, self_collision_check=self_collision_check - ) - - # 3. BENDS & SBENDS - angle_to_target = numpy.degrees(numpy.arctan2(target.y - cp.y, target.x - cp.x)) - allow_backwards = (dist_sq < 150*150) - - for radius in context.config.bend_radii: - for direction in ['CW', 'CCW']: - if not allow_backwards: - turn = 90 if direction == 'CCW' else -90 - new_ori = (cp.orientation + turn) % 360 - new_diff = (angle_to_target - new_ori + 180) % 360 - 180 - if abs(new_diff) > 135: - continue + if proj_t > 0 and abs(perp_t) < 1e-6 and cp.r == target.r: + max_reach = context.cost_evaluator.collision_engine.ray_cast(cp, cp.r, proj_t + 1.0, net_width=net_width) + if max_reach >= proj_t - 0.01 and ( + prev_straight_length is None or proj_t < prev_straight_length - TOLERANCE_LINEAR + ): process_move( - current, target, net_width, net_id, open_set, closed_set, context, metrics, congestion_cache, - f'B{radius}{direction}', 'B', (radius, direction), skip_congestion, inv_snap=inv_snap, - parent_state=parent_state, max_cost=max_cost, snap=snap, self_collision_check=self_collision_check + current, + target, + net_width, + net_id, + open_set, + closed_set, + context, + metrics, + congestion_cache, + "S", + (int(round(proj_t)),), + skip_congestion, + max_cost=max_cost, + self_collision_check=self_collision_check, ) - # 4. SBENDS - max_sbend_r = max(context.config.sbend_radii) if context.config.sbend_radii else 0 - if max_sbend_r > 0: - user_offsets = context.config.sbend_offsets - offsets: set[float] = set(user_offsets) if user_offsets is not None else set() - dx_local = (target.x - cp.x) * cos_v + (target.y - cp.y) * sin_v - dy_local = -(target.x - cp.x) * sin_v + (target.y - cp.y) * cos_v - - if dx_local > 0 and abs(dy_local) < 2 * max_sbend_r: - min_d = numpy.sqrt(max(0, 4 * (abs(dy_local)/2.0) * abs(dy_local) - dy_local**2)) - if dx_local >= min_d: offsets.add(dy_local) - - if user_offsets is None: - for sign in [-1, 1]: - # Adaptive sampling: scale steps by snap_size but ensure enough range - for i in [1, 2, 5, 13, 34, 89]: - o = sign * i * snap - if abs(o) < 2 * max_sbend_r: offsets.add(o) + max_reach = context.cost_evaluator.collision_engine.ray_cast(cp, cp.r, context.config.max_straight_length, net_width=net_width) + candidate_lengths = [ + context.config.min_straight_length, + max_reach, + max_reach / 2.0, + max_reach - 5.0, + ] - for offset in sorted(offsets): - for radius in context.config.sbend_radii: - if abs(offset) >= 2 * radius: continue - process_move( - current, target, net_width, net_id, open_set, closed_set, context, metrics, congestion_cache, - f'SB{offset}R{radius}', 'SB', (offset, radius), skip_congestion, inv_snap=inv_snap, - parent_state=parent_state, max_cost=max_cost, snap=snap, self_collision_check=self_collision_check - ) + axis_target_dist = abs(dx_t) if cp.r in (0, 180) else abs(dy_t) + candidate_lengths.append(axis_target_dist) + for radius in context.config.bend_radii: + candidate_lengths.extend((max_reach - radius, axis_target_dist - radius, axis_target_dist - 2.0 * radius)) + + if cp.r == target.r and dx_local > 0 and abs(dy_local) > TOLERANCE_LINEAR: + for radius in context.config.sbend_radii: + sbend_span = _sbend_forward_span(dy_local, radius) + if sbend_span is None: + continue + candidate_lengths.extend((dx_local - sbend_span, dx_local - 2.0 * sbend_span)) + + for length in _quantized_lengths(candidate_lengths, max_reach): + if length < context.config.min_straight_length: + continue + if prev_straight_length is not None and length >= prev_straight_length - TOLERANCE_LINEAR: + continue + process_move( + current, + target, + net_width, + net_id, + open_set, + closed_set, + context, + metrics, + congestion_cache, + "S", + (length,), + skip_congestion, + max_cost=max_cost, + self_collision_check=self_collision_check, + ) + + angle_to_target = 0.0 + if dx_t != 0 or dy_t != 0: + angle_to_target = float((round((180.0 / 3.141592653589793) * __import__("math").atan2(dy_t, dx_t)) + 360.0) % 360.0) + allow_backwards = dist_sq < 150 * 150 + + for radius in context.config.bend_radii: + for direction in ("CW", "CCW"): + if not allow_backwards: + turn = 90 if direction == "CCW" else -90 + new_ori = (cp.r + turn) % 360 + new_diff = (angle_to_target - new_ori + 180.0) % 360.0 - 180.0 + if abs(new_diff) > 135.0: + continue + process_move( + current, + target, + net_width, + net_id, + open_set, + closed_set, + context, + metrics, + congestion_cache, + "B", + (radius, direction), + skip_congestion, + max_cost=max_cost, + self_collision_check=self_collision_check, + ) + + max_sbend_r = max(context.config.sbend_radii) if context.config.sbend_radii else 0.0 + if max_sbend_r <= 0 or prev_move_type == "SBend": + return + + explicit_offsets = context.config.sbend_offsets + offsets: set[int] = set(int(round(v)) for v in explicit_offsets or []) + + # S-bends preserve orientation, so the implicit search only makes sense + # when the target is ahead in local coordinates and keeps the same + # orientation. Generating generic speculative offsets on the integer lattice + # explodes the search space without contributing useful moves. + if target.r == cp.r and 0 < dx_local <= 4 * max_sbend_r: + if 0 < abs(dy_local) < 2 * max_sbend_r: + offsets.add(int(round(dy_local))) + + if not offsets: + return + + for offset in sorted(offsets): + if offset == 0: + continue + for radius in context.config.sbend_radii: + if abs(offset) >= 2 * radius: + continue + process_move( + current, + target, + net_width, + net_id, + open_set, + closed_set, + context, + metrics, + congestion_cache, + "SB", + (offset, radius), + skip_congestion, + max_cost=max_cost, + self_collision_check=self_collision_check, + ) def process_move( - parent: AStarNode, - target: Port, - net_width: float, - net_id: str, - open_set: list[AStarNode], - closed_set: dict[tuple[int, int, int], float], - context: AStarContext, - metrics: AStarMetrics, - congestion_cache: dict[tuple, int], - move_type: str, - move_class: Literal['S', 'B', 'SB'], - params: tuple, - skip_congestion: bool, - inv_snap: float | None = None, - snap_to_grid: bool = True, - parent_state: tuple[int, int, int] | None = None, - max_cost: float | None = None, - snap: float = 1.0, - self_collision_check: bool = False, - ) -> None: - """ - Generate or retrieve geometry and delegate to add_node. - """ + parent: AStarNode, + target: Port, + net_width: float, + net_id: str, + open_set: list[AStarNode], + closed_set: dict[tuple[int, int, int], float], + context: AStarContext, + metrics: AStarMetrics, + congestion_cache: dict[tuple, int], + move_class: Literal["S", "B", "SB"], + params: tuple, + skip_congestion: bool, + max_cost: float | None = None, + self_collision_check: bool = False, +) -> None: cp = parent.port - if inv_snap is None: inv_snap = 1.0 / snap - base_ori = float(int(cp.orientation + 0.5)) - if parent_state is None: - gx = int(round(cp.x * inv_snap)) - gy = int(round(cp.y * inv_snap)) - go = int(round(cp.orientation)) - parent_state = (gx, gy, go) - else: - gx, gy, go = parent_state - coll_type = context.config.bend_collision_type coll_key = id(coll_type) if isinstance(coll_type, shapely.geometry.Polygon) else coll_type - - abs_key = (parent_state, move_class, params, net_width, coll_key, snap_to_grid) + self_dilation = context.cost_evaluator.collision_engine.clearance / 2.0 + + abs_key = ( + cp.as_tuple(), + move_class, + params, + net_width, + coll_key, + context.config.bend_clip_margin, + self_dilation, + ) if abs_key in context.move_cache_abs: res = context.move_cache_abs[abs_key] - move_radius = params[0] if move_class == 'B' else (params[1] if move_class == 'SB' else None) - add_node( - parent, res, target, net_width, net_id, open_set, closed_set, context, metrics, congestion_cache, - move_type, move_radius=move_radius, snap=snap, skip_congestion=skip_congestion, - inv_snap=inv_snap, parent_state=parent_state, max_cost=max_cost, - self_collision_check=self_collision_check - ) - return - - # Trigger periodic cache eviction check (only on Absolute cache misses) - context.check_cache_eviction() - - # Template Cache Key (Relative to Port 0,0,Ori) - # We snap the parameters to ensure template re-use - snapped_params = params - if move_class == 'SB': - snapped_params = (snap_search_grid(params[0], snap), params[1]) - - self_dilation = context.cost_evaluator.collision_engine.clearance / 2.0 - rel_key = (base_ori, move_class, snapped_params, net_width, coll_key, self_dilation, snap_to_grid) - - cache_key = (gx, gy, go, move_type, net_width) - if cache_key in context.hard_collision_set: - return - - if rel_key in context.move_cache_rel: - res_rel = context.move_cache_rel[rel_key] else: - try: - p0 = Port(0, 0, base_ori) - if move_class == 'S': - res_rel = Straight.generate(p0, params[0], net_width, dilation=self_dilation, snap_to_grid=snap_to_grid, snap_size=snap) - elif move_class == 'B': - res_rel = Bend90.generate(p0, params[0], net_width, params[1], collision_type=context.config.bend_collision_type, clip_margin=context.config.bend_clip_margin, dilation=self_dilation, snap_to_grid=snap_to_grid, snap_size=snap) - elif move_class == 'SB': - res_rel = SBend.generate(p0, snapped_params[0], snapped_params[1], net_width, collision_type=context.config.bend_collision_type, clip_margin=context.config.bend_clip_margin, dilation=self_dilation, snap_to_grid=snap_to_grid, snap_size=snap) - else: + context.check_cache_eviction() + base_port = Port(0, 0, cp.r) + rel_key = ( + cp.r, + move_class, + params, + net_width, + coll_key, + context.config.bend_clip_margin, + self_dilation, + ) + if rel_key in context.move_cache_rel: + res_rel = context.move_cache_rel[rel_key] + else: + try: + if move_class == "S": + res_rel = Straight.generate(base_port, params[0], net_width, dilation=self_dilation) + elif move_class == "B": + res_rel = Bend90.generate( + base_port, + params[0], + net_width, + params[1], + collision_type=context.config.bend_collision_type, + clip_margin=context.config.bend_clip_margin, + dilation=self_dilation, + ) + else: + res_rel = SBend.generate( + base_port, + params[0], + params[1], + net_width, + collision_type=context.config.bend_collision_type, + clip_margin=context.config.bend_clip_margin, + dilation=self_dilation, + ) + except ValueError: return context.move_cache_rel[rel_key] = res_rel - except (ValueError, ZeroDivisionError): - return + res = res_rel.translate(cp.x, cp.y) + context.move_cache_abs[abs_key] = res - res = res_rel.translate(cp.x, cp.y, rel_gx=res_rel.rel_gx + gx, rel_gy=res_rel.rel_gy + gy, rel_go=res_rel.rel_go) - context.move_cache_abs[abs_key] = res - move_radius = params[0] if move_class == 'B' else (params[1] if move_class == 'SB' else None) + move_radius = params[0] if move_class == "B" else (params[1] if move_class == "SB" else None) add_node( - parent, res, target, net_width, net_id, open_set, closed_set, context, metrics, congestion_cache, - move_type, move_radius=move_radius, snap=snap, skip_congestion=skip_congestion, - inv_snap=inv_snap, parent_state=parent_state, max_cost=max_cost, - self_collision_check=self_collision_check + parent, + res, + target, + net_width, + net_id, + open_set, + closed_set, + context, + metrics, + congestion_cache, + move_class, + abs_key, + move_radius=move_radius, + skip_congestion=skip_congestion, + max_cost=max_cost, + self_collision_check=self_collision_check, ) def add_node( - parent: AStarNode, - result: ComponentResult, - target: Port, - net_width: float, - net_id: str, - open_set: list[AStarNode], - closed_set: dict[tuple[int, int, int], float], - context: AStarContext, - metrics: AStarMetrics, - congestion_cache: dict[tuple, int], - move_type: str, - move_radius: float | None = None, - snap: float = 1.0, - skip_congestion: bool = False, - inv_snap: float | None = None, - parent_state: tuple[int, int, int] | None = None, - max_cost: float | None = None, - self_collision_check: bool = False, - ) -> None: - """ - Check collisions and costs, and add node to the open set. - """ + parent: AStarNode, + result: ComponentResult, + target: Port, + net_width: float, + net_id: str, + open_set: list[AStarNode], + closed_set: dict[tuple[int, int, int], float], + context: AStarContext, + metrics: AStarMetrics, + congestion_cache: dict[tuple, int], + move_type: str, + cache_key: tuple, + move_radius: float | None = None, + skip_congestion: bool = False, + max_cost: float | None = None, + self_collision_check: bool = False, +) -> None: metrics.moves_generated += 1 - state = (result.rel_gx, result.rel_gy, result.rel_go) - - # Early pruning using lower-bound total cost - # child.total_g >= parent.total_g + move_length + state = result.end_port.as_tuple() new_lower_bound_g = parent.g_cost + result.length if state in closed_set and closed_set[state] <= new_lower_bound_g + TOLERANCE_LINEAR: metrics.pruned_closed_set += 1 @@ -527,69 +534,71 @@ def add_node( parent_p = parent.port end_p = result.end_port - if parent_state is None: - pgx, pgy, pgo = int(round(parent_p.x * inv_snap)), int(round(parent_p.y * inv_snap)), int(round(parent_p.orientation)) - else: - pgx, pgy, pgo = parent_state - cache_key = (pgx, pgy, pgo, move_type, net_width) - + if cache_key in context.hard_collision_set: metrics.pruned_hard_collision += 1 return - is_static_safe = (cache_key in context.static_safe_cache) + is_static_safe = cache_key in context.static_safe_cache if not is_static_safe: ce = context.cost_evaluator.collision_engine - collision_found = False - if 'S' in move_type and 'SB' not in move_type: - collision_found = ce.check_move_straight_static(parent_p, result.length) + if move_type == "S": + collision_found = ce.check_move_straight_static(parent_p, result.length, net_width=net_width) else: - collision_found = ce.check_move_static(result, start_port=parent_p, end_port=end_p) - + collision_found = ce.check_move_static(result, start_port=parent_p, end_port=end_p, net_width=net_width) if collision_found: - context.hard_collision_set.add(cache_key) - metrics.pruned_hard_collision += 1 - return - else: - context.static_safe_cache.add(cache_key) + context.hard_collision_set.add(cache_key) + metrics.pruned_hard_collision += 1 + return + context.static_safe_cache.add(cache_key) total_overlaps = 0 if not skip_congestion: - if cache_key in congestion_cache: - total_overlaps = congestion_cache[cache_key] + if cache_key in congestion_cache: + total_overlaps = congestion_cache[cache_key] else: total_overlaps = context.cost_evaluator.collision_engine.check_move_congestion(result, net_id) congestion_cache[cache_key] = total_overlaps - # SELF-COLLISION CHECK (Optional for performance) if self_collision_check: curr_p = parent new_tb = result.total_bounds while curr_p and curr_p.parent: - ancestor_res = curr_p.component_result - if ancestor_res: - anc_tb = ancestor_res.total_bounds - if (new_tb[0] < anc_tb[2] and new_tb[2] > anc_tb[0] and - new_tb[1] < anc_tb[3] and new_tb[3] > anc_tb[1]): - for p_anc in ancestor_res.geometry: - for p_new in result.geometry: - if p_new.intersects(p_anc) and not p_new.touches(p_anc): - return - curr_p = curr_p.parent + ancestor_res = curr_p.component_result + if ancestor_res: + anc_tb = ancestor_res.total_bounds + if new_tb[0] < anc_tb[2] and new_tb[2] > anc_tb[0] and new_tb[1] < anc_tb[3] and new_tb[3] > anc_tb[1]: + for p_anc in ancestor_res.geometry: + for p_new in result.geometry: + if p_new.intersects(p_anc) and not p_new.touches(p_anc): + return + curr_p = curr_p.parent penalty = 0.0 - if 'SB' in move_type: penalty = context.config.sbend_penalty - elif 'B' in move_type: penalty = context.config.bend_penalty - if move_radius is not None and move_radius > TOLERANCE_LINEAR: penalty *= (10.0 / move_radius)**0.5 + if move_type == "SB": + penalty = context.config.sbend_penalty + elif move_type == "B": + penalty = context.config.bend_penalty + if move_radius is not None and move_radius > TOLERANCE_LINEAR: + penalty *= (10.0 / move_radius) ** 0.5 move_cost = context.cost_evaluator.evaluate_move( - None, result.end_port, net_width, net_id, - start_port=parent_p, length=result.length, - dilated_geometry=None, penalty=penalty, - skip_static=True, skip_congestion=True # Congestion overlaps already calculated + result.geometry, + result.end_port, + net_width, + net_id, + start_port=parent_p, + length=result.length, + dilated_geometry=result.dilated_geometry, + penalty=penalty, + skip_static=True, + skip_congestion=True, ) move_cost += total_overlaps * context.cost_evaluator.congestion_penalty + if max_cost is not None and parent.g_cost + move_cost > max_cost: + metrics.pruned_cost += 1 + return if move_cost > 1e12: metrics.pruned_cost += 1 return @@ -598,14 +607,13 @@ def add_node( if state in closed_set and closed_set[state] <= g_cost + TOLERANCE_LINEAR: metrics.pruned_closed_set += 1 return - + h_cost = context.cost_evaluator.h_manhattan(result.end_port, target) heapq.heappush(open_set, AStarNode(result.end_port, g_cost, h_cost, parent, result)) metrics.moves_added += 1 def reconstruct_path(end_node: AStarNode) -> list[ComponentResult]: - """ Trace back from end node to start node to get the path. """ path = [] curr: AStarNode | None = end_node while curr and curr.component_result: diff --git a/inire/router/config.py b/inire/router/config.py index a82a30a..5206f36 100644 --- a/inire/router/config.py +++ b/inire/router/config.py @@ -10,7 +10,6 @@ class RouterConfig: """Configuration parameters for the A* Router.""" node_limit: int = 1000000 - snap_size: float = 5.0 # Sparse Sampling Configuration max_straight_length: float = 2000.0 num_straight_samples: int = 5 diff --git a/inire/router/cost.py b/inire/router/cost.py index 83a16f1..b4aa53e 100644 --- a/inire/router/cost.py +++ b/inire/router/cost.py @@ -3,8 +3,9 @@ from __future__ import annotations from typing import TYPE_CHECKING, Any import numpy as np -from inire.router.config import CostConfig + from inire.constants import TOLERANCE_LINEAR +from inire.router.config import CostConfig if TYPE_CHECKING: from shapely.geometry import Polygon @@ -15,50 +16,33 @@ if TYPE_CHECKING: class CostEvaluator: - """ - Calculates total path and proximity costs. - """ - __slots__ = ('collision_engine', 'danger_map', 'config', 'unit_length_cost', 'greedy_h_weight', 'congestion_penalty', - '_target_x', '_target_y', '_target_ori', '_target_cos', '_target_sin', '_min_radius') - - collision_engine: CollisionEngine - """ The engine for intersection checks """ - - danger_map: DangerMap - """ Pre-computed grid for heuristic proximity costs """ - - config: Any - """ Parameter configuration (CostConfig or RouterConfig) """ - - unit_length_cost: float - greedy_h_weight: float - congestion_penalty: float - """ Cached weight values for performance """ + __slots__ = ( + "collision_engine", + "danger_map", + "config", + "unit_length_cost", + "greedy_h_weight", + "congestion_penalty", + "_target_x", + "_target_y", + "_target_r", + "_target_cos", + "_target_sin", + "_min_radius", + ) def __init__( - self, - collision_engine: CollisionEngine, - danger_map: DangerMap | None = None, - unit_length_cost: float = 1.0, - greedy_h_weight: float = 1.5, - congestion_penalty: float = 10000.0, - bend_penalty: float = 250.0, - sbend_penalty: float = 500.0, - min_bend_radius: float = 50.0, - ) -> None: - """ - Initialize the Cost Evaluator. - - Args: - collision_engine: The engine for intersection checks. - danger_map: Pre-computed grid for heuristic proximity costs. - unit_length_cost: Cost multiplier per micrometer of path length. - greedy_h_weight: Heuristic weighting (A* greedy factor). - congestion_penalty: Multiplier for path overlaps in negotiated congestion. - bend_penalty: Base cost for 90-degree bends. - sbend_penalty: Base cost for parametric S-bends. - min_bend_radius: Minimum radius for 90-degree bends (used for alignment heuristic). - """ + self, + collision_engine: CollisionEngine, + danger_map: DangerMap | None = None, + unit_length_cost: float = 1.0, + greedy_h_weight: float = 1.5, + congestion_penalty: float = 10000.0, + bend_penalty: float = 250.0, + sbend_penalty: float | None = None, + min_bend_radius: float = 50.0, + ) -> None: + actual_sbend_penalty = 2.0 * bend_penalty if sbend_penalty is None else sbend_penalty self.collision_engine = collision_engine self.danger_map = danger_map self.config = CostConfig( @@ -66,189 +50,133 @@ class CostEvaluator: greedy_h_weight=greedy_h_weight, congestion_penalty=congestion_penalty, bend_penalty=bend_penalty, - sbend_penalty=sbend_penalty, + sbend_penalty=actual_sbend_penalty, min_bend_radius=min_bend_radius, ) - - # Use config values self.unit_length_cost = self.config.unit_length_cost self.greedy_h_weight = self.config.greedy_h_weight self.congestion_penalty = self.config.congestion_penalty - - # Pre-cache configuration flags for fast path self._refresh_cached_config() - - # Target cache self._target_x = 0.0 self._target_y = 0.0 - self._target_ori = 0.0 + self._target_r = 0 self._target_cos = 1.0 self._target_sin = 0.0 def _refresh_cached_config(self) -> None: - """ Sync internal caches with the current self.config object. """ - if hasattr(self.config, 'min_bend_radius'): + if hasattr(self.config, "min_bend_radius"): self._min_radius = self.config.min_bend_radius - elif hasattr(self.config, 'bend_radii') and self.config.bend_radii: + elif hasattr(self.config, "bend_radii") and self.config.bend_radii: self._min_radius = min(self.config.bend_radii) else: self._min_radius = 50.0 - - if hasattr(self.config, 'unit_length_cost'): + if hasattr(self.config, "unit_length_cost"): self.unit_length_cost = self.config.unit_length_cost - if hasattr(self.config, 'greedy_h_weight'): + if hasattr(self.config, "greedy_h_weight"): self.greedy_h_weight = self.config.greedy_h_weight - if hasattr(self.config, 'congestion_penalty'): + if hasattr(self.config, "congestion_penalty"): self.congestion_penalty = self.config.congestion_penalty def set_target(self, target: Port) -> None: - """ Pre-calculate target-dependent values for faster heuristic. """ self._target_x = target.x self._target_y = target.y - self._target_ori = target.orientation - rad = np.radians(target.orientation) + self._target_r = target.r + rad = np.radians(target.r) self._target_cos = np.cos(rad) self._target_sin = np.sin(rad) def g_proximity(self, x: float, y: float) -> float: - """ - Get proximity cost from the Danger Map. - - Args: - x, y: Coordinate to check. - - Returns: - Proximity cost at location. - """ if self.danger_map is None: return 0.0 return self.danger_map.get_cost(x, y) def h_manhattan(self, current: Port, target: Port) -> float: - """ - Heuristic: weighted Manhattan distance + mandatory turn penalties. - """ tx, ty = target.x, target.y - - # Avoid repeated trig for target orientation - if (abs(tx - self._target_x) > TOLERANCE_LINEAR or - abs(ty - self._target_y) > TOLERANCE_LINEAR or - abs(target.orientation - self._target_ori) > 0.1): - self.set_target(target) - + if abs(tx - self._target_x) > TOLERANCE_LINEAR or abs(ty - self._target_y) > TOLERANCE_LINEAR or target.r != self._target_r: + self.set_target(target) + dx = abs(current.x - tx) dy = abs(current.y - ty) dist = dx + dy - bp = self.config.bend_penalty penalty = 0.0 - # 1. Orientation Difference - curr_ori = current.orientation - diff = abs(curr_ori - self._target_ori) % 360 - if diff > 0.1: - if abs(diff - 180) < 0.1: - penalty += 2 * bp - else: # 90 or 270 degree rotation - penalty += 1 * bp + curr_r = current.r + diff = abs(curr_r - self._target_r) % 360 + if diff > 0: + penalty += 2 * bp if diff == 180 else bp - # 2. Side Check (Entry half-plane) v_dx = tx - current.x v_dy = ty - current.y side_proj = v_dx * self._target_cos + v_dy * self._target_sin perp_dist = abs(v_dx * self._target_sin - v_dy * self._target_cos) - - if side_proj < -0.1 or (side_proj < self._min_radius and perp_dist > 0.1): + if side_proj < 0 or (side_proj < self._min_radius and perp_dist > 0): penalty += 2 * bp - # 3. Traveling Away - # Optimization: avoid np.radians/cos/sin if current_ori is standard 0,90,180,270 - if curr_ori == 0: c_cos, c_sin = 1.0, 0.0 - elif curr_ori == 90: c_cos, c_sin = 0.0, 1.0 - elif curr_ori == 180: c_cos, c_sin = -1.0, 0.0 - elif curr_ori == 270: c_cos, c_sin = 0.0, -1.0 + if curr_r == 0: + c_cos, c_sin = 1.0, 0.0 + elif curr_r == 90: + c_cos, c_sin = 0.0, 1.0 + elif curr_r == 180: + c_cos, c_sin = -1.0, 0.0 else: - curr_rad = np.radians(curr_ori) - c_cos, c_sin = np.cos(curr_rad), np.sin(curr_rad) - - move_proj = v_dx * c_cos + v_dy * c_sin - if move_proj < -0.1: - penalty += 2 * bp + c_cos, c_sin = 0.0, -1.0 - # 4. Jog Alignment - if diff < 0.1: - if perp_dist > 0.1: - penalty += 2 * bp + move_proj = v_dx * c_cos + v_dy * c_sin + if move_proj < 0: + penalty += 2 * bp + if diff == 0 and perp_dist > 0: + penalty += 2 * bp return self.greedy_h_weight * (dist + penalty) - def evaluate_move( - self, - geometry: list[Polygon] | None, - end_port: Port, - net_width: float, - net_id: str, - start_port: Port | None = None, - length: float = 0.0, - dilated_geometry: list[Polygon] | None = None, - skip_static: bool = False, - skip_congestion: bool = False, - penalty: float = 0.0, - ) -> float: - """ - Calculate the cost of a single move (Straight, Bend, SBend). - - Args: - geometry: List of polygons in the move. - end_port: Port at the end of the move. - net_width: Width of the waveguide (unused). - net_id: Identifier for the net. - start_port: Port at the start of the move. - length: Physical path length of the move. - dilated_geometry: Pre-calculated dilated polygons. - skip_static: If True, bypass static collision checks. - skip_congestion: If True, bypass congestion checks. - penalty: Fixed cost penalty for the move type. - - Returns: - Total cost of the move, or 1e15 if invalid. - """ - _ = net_width # Unused - - # 1. Boundary Check + self, + geometry: list[Polygon] | None, + end_port: Port, + net_width: float, + net_id: str, + start_port: Port | None = None, + length: float = 0.0, + dilated_geometry: list[Polygon] | None = None, + skip_static: bool = False, + skip_congestion: bool = False, + penalty: float = 0.0, + ) -> float: + _ = net_width danger_map = self.danger_map - if danger_map is not None: - if not danger_map.is_within_bounds(end_port.x, end_port.y): - return 1e15 + if danger_map is not None and not danger_map.is_within_bounds(end_port.x, end_port.y): + return 1e15 total_cost = length * self.unit_length_cost + penalty - - # 2. Collision Check if not skip_static or not skip_congestion: - collision_engine = self.collision_engine - # Ensure geometry is provided if collision checks are enabled if geometry is None: - return 1e15 + return 1e15 + collision_engine = self.collision_engine for i, poly in enumerate(geometry): dil_poly = dilated_geometry[i] if dilated_geometry else None - # Hard Collision (Static obstacles) - if not skip_static: - if collision_engine.check_collision( - poly, net_id, buffer_mode='static', start_port=start_port, end_port=end_port, - dilated_geometry=dil_poly - ): - return 1e15 - - # Soft Collision (Negotiated Congestion) + if not skip_static and collision_engine.check_collision( + poly, + net_id, + buffer_mode="static", + start_port=start_port, + end_port=end_port, + dilated_geometry=dil_poly, + ): + return 1e15 if not skip_congestion: - overlaps = collision_engine.check_collision( - poly, net_id, buffer_mode='congestion', dilated_geometry=dil_poly - ) + overlaps = collision_engine.check_collision(poly, net_id, buffer_mode="congestion", dilated_geometry=dil_poly) if isinstance(overlaps, int) and overlaps > 0: total_cost += overlaps * self.congestion_penalty - # 3. Proximity cost from Danger Map if danger_map is not None: - total_cost += danger_map.get_cost(end_port.x, end_port.y) + cost_s = danger_map.get_cost(start_port.x, start_port.y) if start_port else 0.0 + cost_e = danger_map.get_cost(end_port.x, end_port.y) + if start_port: + mid_x = (start_port.x + end_port.x) / 2.0 + mid_y = (start_port.y + end_port.y) / 2.0 + cost_m = danger_map.get_cost(mid_x, mid_y) + total_cost += length * (cost_s + cost_m + cost_e) / 3.0 + else: + total_cost += length * cost_e return total_cost diff --git a/inire/router/danger_map.py b/inire/router/danger_map.py index db75eee..4ade2f9 100644 --- a/inire/router/danger_map.py +++ b/inire/router/danger_map.py @@ -3,6 +3,8 @@ from __future__ import annotations from typing import TYPE_CHECKING import numpy import shapely +from scipy.spatial import cKDTree +from functools import lru_cache if TYPE_CHECKING: from shapely.geometry import Polygon @@ -10,36 +12,15 @@ if TYPE_CHECKING: class DangerMap: """ - A pre-computed grid for heuristic proximity costs, vectorized for performance. + A proximity cost evaluator using a KD-Tree of obstacle boundary points. + Scales with obstacle perimeter rather than design area. """ - __slots__ = ('minx', 'miny', 'maxx', 'maxy', 'resolution', 'safety_threshold', 'k', 'width_cells', 'height_cells', 'grid') - - minx: float - miny: float - maxx: float - maxy: float - """ Boundary coordinates of the map """ - - resolution: float - """ Grid cell size in micrometers """ - - safety_threshold: float - """ Distance below which proximity costs are applied """ - - k: float - """ Cost multiplier constant """ - - width_cells: int - height_cells: int - """ Grid dimensions in cells """ - - grid: numpy.ndarray - """ 2D array of pre-computed costs """ + __slots__ = ('minx', 'miny', 'maxx', 'maxy', 'resolution', 'safety_threshold', 'k', 'tree') def __init__( self, bounds: tuple[float, float, float, float], - resolution: float = 1.0, + resolution: float = 5.0, safety_threshold: float = 10.0, k: float = 1.0, ) -> None: @@ -48,7 +29,7 @@ class DangerMap: Args: bounds: (minx, miny, maxx, maxy) in um. - resolution: Cell size (um). + resolution: Sampling resolution for obstacle boundaries (um). safety_threshold: Proximity limit (um). k: Penalty multiplier. """ @@ -56,79 +37,62 @@ class DangerMap: self.resolution = resolution self.safety_threshold = safety_threshold self.k = k - - # Grid dimensions - self.width_cells = int(numpy.ceil((self.maxx - self.minx) / self.resolution)) - self.height_cells = int(numpy.ceil((self.maxy - self.miny) / self.resolution)) - - self.grid = numpy.zeros((self.width_cells, self.height_cells), dtype=numpy.float32) + self.tree: cKDTree | None = None def precompute(self, obstacles: list[Polygon]) -> None: """ - Pre-compute the proximity costs for the entire grid using vectorized operations. - - Args: - obstacles: List of static obstacle geometries. + Pre-compute the proximity tree by sampling obstacle boundaries. """ - from scipy.ndimage import distance_transform_edt - - # 1. Create a binary mask of obstacles - mask = numpy.ones((self.width_cells, self.height_cells), dtype=bool) - - # Create coordinate grids - x_coords = numpy.linspace(self.minx + self.resolution/2, self.maxx - self.resolution/2, self.width_cells) - y_coords = numpy.linspace(self.miny + self.resolution/2, self.maxy - self.resolution/2, self.height_cells) - xv, yv = numpy.meshgrid(x_coords, y_coords, indexing='ij') - + all_points = [] for poly in obstacles: - # Use shapely.contains_xy for fast vectorized point-in-polygon check - in_poly = shapely.contains_xy(poly, xv, yv) - mask[in_poly] = False + # Sample exterior + exterior = poly.exterior + dist = 0 + while dist < exterior.length: + pt = exterior.interpolate(dist) + all_points.append((pt.x, pt.y)) + dist += self.resolution + # Sample interiors (holes) + for interior in poly.interiors: + dist = 0 + while dist < interior.length: + pt = interior.interpolate(dist) + all_points.append((pt.x, pt.y)) + dist += self.resolution - # 2. Distance transform (mask=True for empty space) - distances = distance_transform_edt(mask) * self.resolution - - # 3. Proximity cost: k / d^2 if d < threshold, else 0 - # Cap distances at a small epsilon (e.g. 0.1um) to avoid division by zero - safe_distances = numpy.maximum(distances, 0.1) - self.grid = numpy.where( - distances < self.safety_threshold, - self.k / (safe_distances**2), - 0.0 - ).astype(numpy.float32) + if all_points: + self.tree = cKDTree(numpy.array(all_points)) + else: + self.tree = None + + # Clear cache when tree changes + self._get_cost_quantized.cache_clear() def is_within_bounds(self, x: float, y: float) -> bool: """ Check if a coordinate is within the design bounds. - - Args: - x, y: Coordinate to check. - - Returns: - True if within [min, max] for both axes. """ return self.minx <= x <= self.maxx and self.miny <= y <= self.maxy def get_cost(self, x: float, y: float) -> float: """ - Get the proximity cost at a specific coordinate. - - Args: - x, y: Coordinate to look up. - - Returns: - Pre-computed cost, or 1e15 if out of bounds. + Get the proximity cost at a specific coordinate using the KD-Tree. + Coordinates are quantized to 1nm to improve cache performance. """ - # Clamp to grid range to handle upper boundary exactly - ix = int((x - self.minx) / self.resolution) - iy = int((y - self.miny) / self.resolution) - - # Handle exact upper boundary - if ix == self.width_cells and abs(x - self.maxx) < 1e-9: - ix = self.width_cells - 1 - if iy == self.height_cells and abs(y - self.maxy) < 1e-9: - iy = self.height_cells - 1 + qx_milli = int(round(x * 1000)) + qy_milli = int(round(y * 1000)) + return self._get_cost_quantized(qx_milli, qy_milli) - if 0 <= ix < self.width_cells and 0 <= iy < self.height_cells: - return float(self.grid[ix, iy]) - return 1e15 # Outside bounds + @lru_cache(maxsize=100000) + def _get_cost_quantized(self, qx_milli: int, qy_milli: int) -> float: + qx = qx_milli / 1000.0 + qy = qy_milli / 1000.0 + if not self.is_within_bounds(qx, qy): + return 1e15 + if self.tree is None: + return 0.0 + dist, _ = self.tree.query([qx, qy], distance_upper_bound=self.safety_threshold) + if dist >= self.safety_threshold: + return 0.0 + safe_dist = max(dist, 0.1) + return float(self.k / (safe_dist ** 2)) diff --git a/inire/router/pathfinder.py b/inire/router/pathfinder.py index 51aaab4..5f7d01a 100644 --- a/inire/router/pathfinder.py +++ b/inire/router/pathfinder.py @@ -1,13 +1,14 @@ from __future__ import annotations import logging -import time import random +import time from dataclasses import dataclass -from typing import TYPE_CHECKING, Callable, Literal, Any +from typing import TYPE_CHECKING, Any, Callable, Literal -from inire.router.astar import route_astar, AStarMetrics -from inire.constants import TOLERANCE_LINEAR +import numpy + +from inire.router.astar import AStarMetrics, route_astar if TYPE_CHECKING: from inire.geometry.components import ComponentResult @@ -20,75 +21,35 @@ logger = logging.getLogger(__name__) @dataclass class RoutingResult: - """ - Result of a single net routing operation. - """ net_id: str - """ Identifier for the net """ - path: list[ComponentResult] - """ List of moves forming the path """ - is_valid: bool - """ Whether the path is collision-free and reached the target """ - collisions: int - """ Number of detected collisions/overlaps """ - reached_target: bool = False - """ Whether the final port matches the target port """ class PathFinder: - """ - Multi-net router using Negotiated Congestion. - """ - __slots__ = ('context', 'metrics', 'max_iterations', 'base_congestion_penalty', - 'use_tiered_strategy', 'congestion_multiplier', 'accumulated_expanded_nodes', 'warm_start') - - context: AStarContext - """ The A* persistent state (config, caches, evaluator) """ - - metrics: AStarMetrics - """ Performance metrics for search operations """ - - max_iterations: int - """ Maximum number of rip-up and reroute iterations """ - - base_congestion_penalty: float - """ Starting penalty for overlaps """ - - congestion_multiplier: float - """ Multiplier for congestion penalty per iteration """ - - use_tiered_strategy: bool - """ If True, use simpler collision models in early iterations for speed """ - - warm_start: Literal['shortest', 'longest', 'user'] | None - """ Heuristic sorting for the initial greedy pass """ + __slots__ = ( + "context", + "metrics", + "max_iterations", + "base_congestion_penalty", + "use_tiered_strategy", + "congestion_multiplier", + "accumulated_expanded_nodes", + "warm_start", + ) def __init__( - self, - context: AStarContext, - metrics: AStarMetrics | None = None, - max_iterations: int = 10, - base_congestion_penalty: float = 100.0, - congestion_multiplier: float = 1.5, - use_tiered_strategy: bool = True, - warm_start: Literal['shortest', 'longest', 'user'] | None = 'shortest', - ) -> None: - """ - Initialize the PathFinder. - - Args: - context: The A* search context (evaluator, config, caches). - metrics: Optional metrics container. - max_iterations: Maximum number of rip-up and reroute iterations. - base_congestion_penalty: Starting penalty for overlaps. - congestion_multiplier: Multiplier for congestion penalty per iteration. - use_tiered_strategy: Whether to use simplified collision models in early iterations. - warm_start: Initial ordering strategy for a fast greedy pass. - """ + self, + context: AStarContext, + metrics: AStarMetrics | None = None, + max_iterations: int = 10, + base_congestion_penalty: float = 100.0, + congestion_multiplier: float = 1.5, + use_tiered_strategy: bool = True, + warm_start: Literal["shortest", "longest", "user"] | None = "shortest", + ) -> None: self.context = context self.metrics = metrics if metrics is not None else AStarMetrics() self.max_iterations = max_iterations @@ -96,81 +57,68 @@ class PathFinder: self.congestion_multiplier = congestion_multiplier self.use_tiered_strategy = use_tiered_strategy self.warm_start = warm_start - self.accumulated_expanded_nodes: list[tuple[float, float, float]] = [] + self.accumulated_expanded_nodes: list[tuple[int, int, int]] = [] @property def cost_evaluator(self) -> CostEvaluator: return self.context.cost_evaluator def _perform_greedy_pass( - self, - netlist: dict[str, tuple[Port, Port]], - net_widths: dict[str, float], - order: Literal['shortest', 'longest', 'user'] - ) -> dict[str, list[ComponentResult]]: - """ - Internal greedy pass: route nets sequentially and freeze them as static. - """ + self, + netlist: dict[str, tuple[Port, Port]], + net_widths: dict[str, float], + order: Literal["shortest", "longest", "user"], + ) -> dict[str, list[ComponentResult]]: all_net_ids = list(netlist.keys()) - if order != 'user': - def get_dist(nid): - s, t = netlist[nid] - return abs(t.x - s.x) + abs(t.y - s.y) - all_net_ids.sort(key=get_dist, reverse=(order == 'longest')) - - greedy_paths = {} - temp_obj_ids = [] - - logger.info(f"PathFinder: Starting Greedy Warm-Start ({order} order)...") - + if order != "user": + all_net_ids.sort( + key=lambda nid: abs(netlist[nid][1].x - netlist[nid][0].x) + abs(netlist[nid][1].y - netlist[nid][0].y), + reverse=(order == "longest"), + ) + + greedy_paths: dict[str, list[ComponentResult]] = {} + temp_obj_ids: list[int] = [] + greedy_node_limit = min(self.context.config.node_limit, 2000) for net_id in all_net_ids: start, target = netlist[net_id] width = net_widths.get(net_id, 2.0) - - # Heuristic max cost for fail-fast h_start = self.cost_evaluator.h_manhattan(start, target) - max_cost_limit = max(h_start * 3.0, 2000.0) - + max_cost_limit = max(h_start * 3.0, 2000.0) path = route_astar( - start, target, width, context=self.context, metrics=self.metrics, - net_id=net_id, skip_congestion=True, max_cost=max_cost_limit + start, + target, + width, + context=self.context, + metrics=self.metrics, + net_id=net_id, + skip_congestion=True, + max_cost=max_cost_limit, + self_collision_check=True, + node_limit=greedy_node_limit, ) - - if path: - greedy_paths[net_id] = path - # Freeze as static - for res in path: - geoms = res.actual_geometry if res.actual_geometry is not None else res.geometry - for poly in geoms: - obj_id = self.cost_evaluator.collision_engine.add_static_obstacle(poly) - temp_obj_ids.append(obj_id) - - # Clean up temporary static obstacles + if not path: + continue + greedy_paths[net_id] = path + for res in path: + geoms = res.actual_geometry if res.actual_geometry is not None else res.geometry + dilated_geoms = res.dilated_actual_geometry if res.dilated_actual_geometry else res.dilated_geometry + for i, poly in enumerate(geoms): + dilated = dilated_geoms[i] if dilated_geoms else None + obj_id = self.cost_evaluator.collision_engine.add_static_obstacle(poly, dilated_geometry=dilated) + temp_obj_ids.append(obj_id) + self.context.clear_static_caches() + for obj_id in temp_obj_ids: self.cost_evaluator.collision_engine.remove_static_obstacle(obj_id) - - logger.info(f"PathFinder: Greedy Warm-Start finished. Seeding {len(greedy_paths)}/{len(netlist)} nets.") return greedy_paths def _has_self_collision(self, path: list[ComponentResult]) -> bool: - """ - Quickly check if a path intersects itself. - """ - if not path: - return False - - num_components = len(path) - for i in range(num_components): - comp_i = path[i] + for i, comp_i in enumerate(path): tb_i = comp_i.total_bounds - for j in range(i + 2, num_components): # Skip immediate neighbors + for j in range(i + 2, len(path)): comp_j = path[j] tb_j = comp_j.total_bounds - - # AABB Check - if (tb_i[0] < tb_j[2] and tb_i[2] > tb_j[0] and - tb_i[1] < tb_j[3] and tb_i[3] > tb_j[1]): - # Real geometry check + if tb_i[0] < tb_j[2] and tb_i[2] > tb_j[0] and tb_i[1] < tb_j[3] and tb_i[3] > tb_j[1]: for p_i in comp_i.geometry: for p_j in comp_j.geometry: if p_i.intersects(p_j) and not p_i.touches(p_j): @@ -178,32 +126,16 @@ class PathFinder: return False def route_all( - self, - netlist: dict[str, tuple[Port, Port]], - net_widths: dict[str, float], - store_expanded: bool = False, - iteration_callback: Callable[[int, dict[str, RoutingResult]], None] | None = None, - shuffle_nets: bool = False, - sort_nets: Literal['shortest', 'longest', 'user', None] = None, - initial_paths: dict[str, list[ComponentResult]] | None = None, - seed: int | None = None, - ) -> dict[str, RoutingResult]: - """ - Route all nets in the netlist using Negotiated Congestion. - - Args: - netlist: Mapping of net_id to (start_port, target_port). - net_widths: Mapping of net_id to waveguide width. - store_expanded: Whether to store expanded nodes for ALL iterations and nets. - iteration_callback: Optional callback(iteration_idx, current_results). - shuffle_nets: Whether to randomize the order of nets each iteration. - sort_nets: Heuristic sorting for the initial iteration order (overrides self.warm_start). - initial_paths: Pre-computed paths to use for Iteration 0 (overrides warm_start). - seed: Optional seed for randomization (enables reproducibility). - - Returns: - Mapping of net_id to RoutingResult. - """ + self, + netlist: dict[str, tuple[Port, Port]], + net_widths: dict[str, float], + store_expanded: bool = False, + iteration_callback: Callable[[int, dict[str, RoutingResult]], None] | None = None, + shuffle_nets: bool = False, + sort_nets: Literal["shortest", "longest", "user", None] = None, + initial_paths: dict[str, list[ComponentResult]] | None = None, + seed: int | None = None, + ) -> dict[str, RoutingResult]: results: dict[str, RoutingResult] = {} self.cost_evaluator.congestion_penalty = self.base_congestion_penalty self.accumulated_expanded_nodes = [] @@ -212,63 +144,44 @@ class PathFinder: start_time = time.monotonic() num_nets = len(netlist) session_timeout = max(60.0, 10.0 * num_nets * self.max_iterations) - all_net_ids = list(netlist.keys()) - needs_sc = set() # Nets requiring self-collision avoidance - - # Determine initial paths (Warm Start) - if initial_paths is None: - ws_order = sort_nets if sort_nets is not None else self.warm_start - if ws_order is not None: - initial_paths = self._perform_greedy_pass(netlist, net_widths, ws_order) - self.context.clear_static_caches() + needs_sc: set[str] = set() - # Apply initial sorting heuristic if requested (for the main NC loop) - if sort_nets: - def get_dist(nid): - s, t = netlist[nid] - return abs(t.x - s.x) + abs(t.y - s.y) - - if sort_nets != 'user': - all_net_ids.sort(key=get_dist, reverse=(sort_nets == 'longest')) + if initial_paths is None: + ws_order = sort_nets if sort_nets is not None else self.warm_start + if ws_order is not None: + initial_paths = self._perform_greedy_pass(netlist, net_widths, ws_order) + self.context.clear_static_caches() + + if sort_nets and sort_nets != "user": + all_net_ids.sort( + key=lambda nid: abs(netlist[nid][1].x - netlist[nid][0].x) + abs(netlist[nid][1].y - netlist[nid][0].y), + reverse=(sort_nets == "longest"), + ) for iteration in range(self.max_iterations): any_congestion = False - # Clear accumulation for this iteration so callback gets fresh data self.accumulated_expanded_nodes = [] self.metrics.reset_per_route() - - logger.info(f'PathFinder Iteration {iteration}...') - # 0. Shuffle nets if requested - if shuffle_nets: - # Use a new seed based on iteration for deterministic different orders + if shuffle_nets and (iteration > 0 or initial_paths is None): it_seed = (seed + iteration) if seed is not None else None random.Random(it_seed).shuffle(all_net_ids) - # Sequence through nets for net_id in all_net_ids: start, target = netlist[net_id] - # Timeout check - elapsed = time.monotonic() - start_time - if elapsed > session_timeout: - logger.warning(f'PathFinder TIMEOUT after {elapsed:.2f}s') - return self._finalize_results(results, netlist) + if time.monotonic() - start_time > session_timeout: + self.cost_evaluator.collision_engine.dynamic_tree = None + self.cost_evaluator.collision_engine._ensure_dynamic_tree() + return self.verify_all_nets(results, netlist) width = net_widths.get(net_id, 2.0) - - # 1. Rip-up existing path self.cost_evaluator.collision_engine.remove_path(net_id) + path: list[ComponentResult] | None = None - # 2. Reroute or Use Initial Path - path = None - - # Warm Start Logic: Use provided path for Iteration 0 if iteration == 0 and initial_paths and net_id in initial_paths: path = initial_paths[net_id] - logger.debug(f' Net {net_id} used Warm Start path.') else: - # Standard Routing Logic target_coll_model = self.context.config.bend_collision_type coll_model = target_coll_model skip_cong = False @@ -276,165 +189,84 @@ class PathFinder: skip_cong = True if target_coll_model == "arc": coll_model = "clipped_bbox" - - base_node_limit = self.context.config.node_limit - current_node_limit = base_node_limit - - net_start = time.monotonic() - + path = route_astar( - start, target, width, context=self.context, metrics=self.metrics, - net_id=net_id, bend_collision_type=coll_model, return_partial=True, - store_expanded=store_expanded, skip_congestion=skip_cong, + start, + target, + width, + context=self.context, + metrics=self.metrics, + net_id=net_id, + bend_collision_type=coll_model, + return_partial=True, + store_expanded=store_expanded, + skip_congestion=skip_cong, self_collision_check=(net_id in needs_sc), - node_limit=current_node_limit + node_limit=self.context.config.node_limit, ) - + if store_expanded and self.metrics.last_expanded_nodes: self.accumulated_expanded_nodes.extend(self.metrics.last_expanded_nodes) - logger.debug(f' Net {net_id} routed in {time.monotonic() - net_start:.4f}s using {coll_model}') - - if path: - # Check if reached exactly (relative to snapped target) - last_p = path[-1].end_port - snap = self.context.config.snap_size - from inire.geometry.components import snap_search_grid - reached = (abs(last_p.x - snap_search_grid(target.x, snap)) < TOLERANCE_LINEAR and - abs(last_p.y - snap_search_grid(target.y, snap)) < TOLERANCE_LINEAR and - abs(last_p.orientation - target.orientation) < 0.1) - - # Check for self-collision if not already handled by router - if reached and net_id not in needs_sc: - if self._has_self_collision(path): - logger.info(f' Net {net_id} detected self-collision. Enabling protection for next iteration.') - needs_sc.add(net_id) - any_congestion = True - - # 3. Add to index (even if partial) so other nets negotiate around it - all_geoms = [] - all_dilated = [] - for res in path: - all_geoms.extend(res.geometry) - if res.dilated_geometry: - all_dilated.extend(res.dilated_geometry) - else: - dilation = self.cost_evaluator.collision_engine.clearance / 2.0 - all_dilated.extend([p.buffer(dilation) for p in res.geometry]) - - self.cost_evaluator.collision_engine.add_path(net_id, all_geoms, dilated_geometry=all_dilated) - - # Check if this new path has any congestion - collision_count = 0 - if reached: - verif_geoms = [] - verif_dilated = [] - for res in path: - is_proxy = (res.actual_geometry is not None) - g = res.actual_geometry if is_proxy else res.geometry - verif_geoms.extend(g) - - if is_proxy: - if res.dilated_actual_geometry: - verif_dilated.extend(res.dilated_actual_geometry) - else: - dilation = self.cost_evaluator.collision_engine.clearance / 2.0 - verif_dilated.extend([p.buffer(dilation) for p in g]) - else: - if res.dilated_geometry: - verif_dilated.extend(res.dilated_geometry) - else: - dilation = self.cost_evaluator.collision_engine.clearance / 2.0 - verif_dilated.extend([p.buffer(dilation) for p in g]) - - self.cost_evaluator.collision_engine._ensure_dynamic_tree() - if self.cost_evaluator.collision_engine.dynamic_tree: - # Vectorized query for all polygons in the path - res_indices, tree_indices = self.cost_evaluator.collision_engine.dynamic_tree.query(verif_dilated, predicate='intersects') - for hit_idx in tree_indices: - obj_id = self.cost_evaluator.collision_engine.dynamic_obj_ids[hit_idx] - other_net_id, _ = self.cost_evaluator.collision_engine.dynamic_geometries[obj_id] - if other_net_id != net_id: - collision_count += 1 - - if collision_count > 0: - any_congestion = True - - logger.debug(f' Net {net_id}: reached={reached}, collisions={collision_count}') - results[net_id] = RoutingResult(net_id, path, (collision_count == 0 and reached), collision_count, reached_target=reached) - else: + if not path: results[net_id] = RoutingResult(net_id, [], False, 0, reached_target=False) - any_congestion = True # Total failure might need a retry with different ordering + any_congestion = True + continue + + last_p = path[-1].end_port + reached = last_p == target + + if reached and net_id not in needs_sc and self._has_self_collision(path): + needs_sc.add(net_id) + any_congestion = True + + all_geoms = [] + all_dilated = [] + for res in path: + all_geoms.extend(res.geometry) + if res.dilated_geometry: + all_dilated.extend(res.dilated_geometry) + else: + dilation = self.cost_evaluator.collision_engine.clearance / 2.0 + all_dilated.extend([p.buffer(dilation) for p in res.geometry]) + self.cost_evaluator.collision_engine.add_path(net_id, all_geoms, dilated_geometry=all_dilated) + + collision_count = 0 + if reached: + is_valid, collision_count = self.cost_evaluator.collision_engine.verify_path(net_id, path) + any_congestion = any_congestion or not is_valid + + results[net_id] = RoutingResult(net_id, path, reached and collision_count == 0, collision_count, reached_target=reached) if iteration_callback: iteration_callback(iteration, results) - if not any_congestion: break - self.cost_evaluator.congestion_penalty *= self.congestion_multiplier - return self._finalize_results(results, netlist) + self.cost_evaluator.collision_engine.dynamic_tree = None + self.cost_evaluator.collision_engine._ensure_dynamic_tree() + return self.verify_all_nets(results, netlist) - def _finalize_results( - self, - results: dict[str, RoutingResult], - netlist: dict[str, tuple[Port, Port]], - ) -> dict[str, RoutingResult]: - """ - Final check: re-verify all nets against the final static paths. - """ - logger.debug(f'Finalizing results for nets: {list(results.keys())}') - final_results = {} - for net_id in netlist: + def verify_all_nets( + self, + results: dict[str, RoutingResult], + netlist: dict[str, tuple[Port, Port]], + ) -> dict[str, RoutingResult]: + final_results: dict[str, RoutingResult] = {} + for net_id, (_, target_p) in netlist.items(): res = results.get(net_id) if not res or not res.path: final_results[net_id] = RoutingResult(net_id, [], False, 0) continue - - if not res.reached_target: - # Skip re-verification for partial paths to avoid massive performance hit - final_results[net_id] = res - continue - - collision_count = 0 - verif_geoms = [] - verif_dilated = [] - for comp in res.path: - is_proxy = (comp.actual_geometry is not None) - g = comp.actual_geometry if is_proxy else comp.geometry - verif_geoms.extend(g) - if is_proxy: - if comp.dilated_actual_geometry: - verif_dilated.extend(comp.dilated_actual_geometry) - else: - dilation = self.cost_evaluator.collision_engine.clearance / 2.0 - verif_dilated.extend([p.buffer(dilation) for p in g]) - else: - if comp.dilated_geometry: - verif_dilated.extend(comp.dilated_geometry) - else: - dilation = self.cost_evaluator.collision_engine.clearance / 2.0 - verif_dilated.extend([p.buffer(dilation) for p in g]) - - self.cost_evaluator.collision_engine._ensure_dynamic_tree() - if self.cost_evaluator.collision_engine.dynamic_tree: - # Vectorized query - res_indices, tree_indices = self.cost_evaluator.collision_engine.dynamic_tree.query(verif_dilated, predicate='intersects') - for hit_idx in tree_indices: - obj_id = self.cost_evaluator.collision_engine.dynamic_obj_ids[hit_idx] - other_net_id, _ = self.cost_evaluator.collision_engine.dynamic_geometries[obj_id] - if other_net_id != net_id: - collision_count += 1 - - target_p = netlist[net_id][1] last_p = res.path[-1].end_port - snap = self.context.config.snap_size - from inire.geometry.components import snap_search_grid - reached = (abs(last_p.x - snap_search_grid(target_p.x, snap)) < TOLERANCE_LINEAR and - abs(last_p.y - snap_search_grid(target_p.y, snap)) < TOLERANCE_LINEAR and - abs(last_p.orientation - target_p.orientation) < 0.1) - - final_results[net_id] = RoutingResult(net_id, res.path, (collision_count == 0 and reached), collision_count, reached_target=reached) - + reached = last_p == target_p + is_valid, collisions = self.cost_evaluator.collision_engine.verify_path(net_id, res.path) + final_results[net_id] = RoutingResult( + net_id=net_id, + path=res.path, + is_valid=(is_valid and reached), + collisions=collisions, + reached_target=reached, + ) return final_results diff --git a/inire/router/visibility.py b/inire/router/visibility.py index 9d4fc2f..8acbe90 100644 --- a/inire/router/visibility.py +++ b/inire/router/visibility.py @@ -16,7 +16,7 @@ class VisibilityManager: """ Manages corners of static obstacles for sparse A* / Visibility Graph jumps. """ - __slots__ = ('collision_engine', 'corners', 'corner_index', '_corner_graph', '_static_visibility_cache') + __slots__ = ('collision_engine', 'corners', 'corner_index', '_corner_graph', '_static_visibility_cache', '_built_static_version') def __init__(self, collision_engine: CollisionEngine) -> None: self.collision_engine = collision_engine @@ -24,12 +24,28 @@ class VisibilityManager: self.corner_index = rtree.index.Index() self._corner_graph: dict[int, list[tuple[float, float, float]]] = {} self._static_visibility_cache: dict[tuple[int, int], list[tuple[float, float, float]]] = {} + self._built_static_version = -1 self._build() + def clear_cache(self) -> None: + """ + Reset all static visibility data. + """ + self.corners = [] + self.corner_index = rtree.index.Index() + self._corner_graph = {} + self._static_visibility_cache = {} + self._build() + + def _ensure_current(self) -> None: + if self._built_static_version != self.collision_engine._static_version: + self.clear_cache() + def _build(self) -> None: """ Extract corners and pre-compute corner-to-corner visibility. """ + self._built_static_version = self.collision_engine._static_version raw_corners = [] for obj_id, poly in self.collision_engine.static_dilated.items(): coords = list(poly.exterior.coords) @@ -45,7 +61,7 @@ class VisibilityManager: if not raw_corners: return - # Deduplicate and snap to 1nm + # Deduplicate repeated corner coordinates seen = set() for x, y in raw_corners: sx, sy = round(x, 3), round(y, 3) @@ -81,6 +97,7 @@ class VisibilityManager: Find all corners visible from the origin. Returns list of (x, y, distance). """ + self._ensure_current() if max_dist < 0: return [] diff --git a/inire/tests/test_astar.py b/inire/tests/test_astar.py index 802b9eb..b1521cc 100644 --- a/inire/tests/test_astar.py +++ b/inire/tests/test_astar.py @@ -1,6 +1,8 @@ import pytest from shapely.geometry import Polygon +import inire.router.astar as astar_module +from inire.geometry.components import SBend, Straight from inire.geometry.collision import CollisionEngine from inire.geometry.primitives import Port from inire.router.astar import AStarContext, route_astar @@ -19,7 +21,7 @@ def basic_evaluator() -> CostEvaluator: def test_astar_straight(basic_evaluator: CostEvaluator) -> None: - context = AStarContext(basic_evaluator, snap_size=1.0) + context = AStarContext(basic_evaluator) start = Port(0, 0, 0) target = Port(50, 0, 0) path = route_astar(start, target, net_width=2.0, context=context) @@ -35,7 +37,7 @@ def test_astar_straight(basic_evaluator: CostEvaluator) -> None: def test_astar_bend(basic_evaluator: CostEvaluator) -> None: - context = AStarContext(basic_evaluator, snap_size=1.0, bend_radii=[10.0]) + context = AStarContext(basic_evaluator, bend_radii=[10.0]) start = Port(0, 0, 0) # 20um right, 20um up. Needs a 10um bend and a 10um bend. target = Port(20, 20, 0) @@ -56,7 +58,7 @@ def test_astar_obstacle(basic_evaluator: CostEvaluator) -> None: basic_evaluator.collision_engine.add_static_obstacle(obstacle) basic_evaluator.danger_map.precompute([obstacle]) - context = AStarContext(basic_evaluator, snap_size=1.0, bend_radii=[10.0], node_limit=1000000) + context = AStarContext(basic_evaluator, bend_radii=[10.0], node_limit=1000000) start = Port(0, 0, 0) target = Port(60, 0, 0) path = route_astar(start, target, net_width=2.0, context=context) @@ -70,20 +72,126 @@ def test_astar_obstacle(basic_evaluator: CostEvaluator) -> None: assert validation["total_length"] > 50.0 -def test_astar_snap_to_target_lookahead(basic_evaluator: CostEvaluator) -> None: - context = AStarContext(basic_evaluator, snap_size=1.0) - # Target is NOT on 1um grid +def test_astar_uses_integerized_ports(basic_evaluator: CostEvaluator) -> None: + context = AStarContext(basic_evaluator) start = Port(0, 0, 0) target = Port(10.1, 0, 0) path = route_astar(start, target, net_width=2.0, context=context) assert path is not None result = RoutingResult(net_id="test", path=path, is_valid=True, collisions=0) - - # Under the new Enforce Grid policy, the router snaps the target internally to 10.0. - # We validate against the snapped target. - from inire.geometry.components import snap_search_grid - target_snapped = Port(snap_search_grid(target.x, 1.0), snap_search_grid(target.y, 1.0), target.orientation, snap=False) - validation = validate_routing_result(result, [], clearance=2.0, expected_start=start, expected_end=target_snapped) + assert target.x == 10 + validation = validate_routing_result(result, [], clearance=2.0, expected_start=start, expected_end=target) assert validation["is_valid"], f"Validation failed: {validation.get('reason')}" + + +def test_expand_moves_only_shortens_consecutive_straights( + basic_evaluator: CostEvaluator, + monkeypatch: pytest.MonkeyPatch, +) -> None: + context = AStarContext(basic_evaluator, min_straight_length=5.0, max_straight_length=100.0) + prev_result = Straight.generate(Port(0, 0, 0), 20.0, width=2.0, dilation=1.0) + current = astar_module.AStarNode( + prev_result.end_port, + g_cost=prev_result.length, + h_cost=0.0, + component_result=prev_result, + ) + + emitted: list[tuple[str, tuple]] = [] + + def fake_process_move(*args, **kwargs) -> None: + emitted.append((args[9], args[10])) + + monkeypatch.setattr(astar_module, "process_move", fake_process_move) + + astar_module.expand_moves( + current, + Port(80, 0, 0), + net_width=2.0, + net_id="test", + open_set=[], + closed_set={}, + context=context, + metrics=astar_module.AStarMetrics(), + congestion_cache={}, + ) + + straight_lengths = [params[0] for move_class, params in emitted if move_class == "S"] + assert straight_lengths + assert all(length < prev_result.length for length in straight_lengths) + + +def test_expand_moves_does_not_chain_sbends( + basic_evaluator: CostEvaluator, + monkeypatch: pytest.MonkeyPatch, +) -> None: + context = AStarContext(basic_evaluator, sbend_radii=[10.0], sbend_offsets=[5.0], max_straight_length=100.0) + prev_result = SBend.generate(Port(0, 0, 0), 5.0, 10.0, width=2.0, dilation=1.0) + current = astar_module.AStarNode( + prev_result.end_port, + g_cost=prev_result.length, + h_cost=0.0, + component_result=prev_result, + ) + + emitted: list[str] = [] + + def fake_process_move(*args, **kwargs) -> None: + emitted.append(args[9]) + + monkeypatch.setattr(astar_module, "process_move", fake_process_move) + + astar_module.expand_moves( + current, + Port(60, 10, 0), + net_width=2.0, + net_id="test", + open_set=[], + closed_set={}, + context=context, + metrics=astar_module.AStarMetrics(), + congestion_cache={}, + ) + + assert "SB" not in emitted + assert emitted + + +def test_expand_moves_adds_sbend_aligned_straight_stop_points( + basic_evaluator: CostEvaluator, + monkeypatch: pytest.MonkeyPatch, +) -> None: + context = AStarContext( + basic_evaluator, + bend_radii=[10.0], + sbend_radii=[10.0], + max_straight_length=150.0, + ) + current = astar_module.AStarNode(Port(0, 0, 0), g_cost=0.0, h_cost=0.0) + + emitted: list[tuple[str, tuple]] = [] + + def fake_process_move(*args, **kwargs) -> None: + emitted.append((args[9], args[10])) + + monkeypatch.setattr(astar_module, "process_move", fake_process_move) + + astar_module.expand_moves( + current, + Port(100, 10, 0), + net_width=2.0, + net_id="test", + open_set=[], + closed_set={}, + context=context, + metrics=astar_module.AStarMetrics(), + congestion_cache={}, + ) + + straight_lengths = {params[0] for move_class, params in emitted if move_class == "S"} + sbend_span = astar_module._sbend_forward_span(10.0, 10.0) + assert sbend_span is not None + assert int(round(100.0 - sbend_span)) in straight_lengths + assert int(round(100.0 - 2.0 * sbend_span)) in straight_lengths diff --git a/inire/tests/test_clearance_precision.py b/inire/tests/test_clearance_precision.py new file mode 100644 index 0000000..3f17b1c --- /dev/null +++ b/inire/tests/test_clearance_precision.py @@ -0,0 +1,92 @@ +import pytest +import numpy +from shapely.geometry import Polygon +from inire.geometry.collision import CollisionEngine +from inire.geometry.primitives import Port +from inire.geometry.components import Straight +from inire.router.cost import CostEvaluator +from inire.router.danger_map import DangerMap +from inire.router.astar import AStarContext +from inire.router.pathfinder import PathFinder, RoutingResult + +def test_clearance_thresholds(): + """ + Check that clearance is correctly calculated: + two paths slightly beyond, exactly at, and slightly violating. + """ + # Clearance = 2.0, Width = 2.0 + # Required Centerline-to-Centerline = (2+2)/2 + 2.0 = 4.0 + ce = CollisionEngine(clearance=2.0) + + # Net 1: Centerline at y=0 + p1 = Port(0, 0, 0) + res1 = Straight.generate(p1, 50.0, width=2.0, dilation=1.0) + ce.add_path("net1", res1.geometry, dilated_geometry=res1.dilated_geometry) + + # Net 2: Parallel to Net 1 + # 1. Beyond minimum spacing: y=5. Gap = 5 - 2 = 3 > 2. OK. + p2_ok = Port(0, 5, 0) + res2_ok = Straight.generate(p2_ok, 50.0, width=2.0, dilation=1.0) + is_v, count = ce.verify_path("net2", [res2_ok]) + assert is_v, f"Gap 3 should be valid, but got {count} collisions" + + # 2. Exactly at: y=4.0. Gap = 4.0 - 2.0 = 2.0. OK. + p2_exact = Port(0, 4, 0) + res2_exact = Straight.generate(p2_exact, 50.0, width=2.0, dilation=1.0) + is_v, count = ce.verify_path("net2", [res2_exact]) + assert is_v, f"Gap exactly 2.0 should be valid, but got {count} collisions" + + # 3. Slightly violating: y=3.999. Gap = 3.999 - 2.0 = 1.999 < 2.0. FAIL. + p2_fail = Port(0, 3, 0) + res2_fail = Straight.generate(p2_fail, 50.0, width=2.0, dilation=1.0) + is_v, count = ce.verify_path("net2", [res2_fail]) + assert not is_v, "Gap 1.999 should be invalid" + assert count > 0 + +def test_verify_all_nets_cases(): + """ + Validate that verify_all_nets catches some common cases and doesn't flag reasonable non-failing cases. + """ + engine = CollisionEngine(clearance=2.0) + danger_map = DangerMap(bounds=(0, 0, 100, 100)) + danger_map.precompute([]) + evaluator = CostEvaluator(collision_engine=engine, danger_map=danger_map) + context = AStarContext(cost_evaluator=evaluator) + pf = PathFinder(context, warm_start=None, max_iterations=1) + + # Case 1: Parallel paths exactly at clearance (Should be VALID) + netlist_parallel_ok = { + "net1": (Port(0, 50, 0), Port(100, 50, 0)), + "net2": (Port(0, 54, 0), Port(100, 54, 0)), + } + net_widths = {"net1": 2.0, "net2": 2.0} + + results = pf.route_all(netlist_parallel_ok, net_widths) + assert results["net1"].is_valid, f"Exactly at clearance should be valid, collisions={results['net1'].collisions}" + assert results["net2"].is_valid + + # Case 2: Parallel paths slightly within clearance (Should be INVALID) + netlist_parallel_fail = { + "net3": (Port(0, 20, 0), Port(100, 20, 0)), + "net4": (Port(0, 23, 0), Port(100, 23, 0)), + } + # Reset engine + engine.remove_path("net1") + engine.remove_path("net2") + + results_p = pf.route_all(netlist_parallel_fail, net_widths) + # verify_all_nets should flag both as invalid because they cross-collide + assert not results_p["net3"].is_valid + assert not results_p["net4"].is_valid + + # Case 3: Crossing paths (Should be INVALID) + netlist_cross = { + "net5": (Port(0, 75, 0), Port(100, 75, 0)), + "net6": (Port(50, 0, 90), Port(50, 100, 90)), + } + engine.remove_path("net3") + engine.remove_path("net4") + + results_c = pf.route_all(netlist_cross, net_widths) + assert not results_c["net5"].is_valid + assert not results_c["net6"].is_valid diff --git a/inire/tests/test_collision.py b/inire/tests/test_collision.py index b30855c..f83bb16 100644 --- a/inire/tests/test_collision.py +++ b/inire/tests/test_collision.py @@ -2,6 +2,7 @@ from shapely.geometry import Polygon from inire.geometry.collision import CollisionEngine from inire.geometry.primitives import Port +from inire.geometry.components import Straight def test_collision_detection() -> None: @@ -38,7 +39,7 @@ def test_safety_zone() -> None: engine.add_static_obstacle(obstacle) # Port exactly on the boundary - start_port = Port(10.0, 12.0, 0) + start_port = Port(10, 12, 0) # Move starting from this port that overlaps the obstacle by 1nm # (Inside the 2nm safety zone) @@ -59,3 +60,46 @@ def test_configurable_max_net_width() -> None: # Dilated test_poly bounds: (14, 19, 17, 26). # obstacle: (20, 20, 25, 25). No physical collision. assert not engine.is_collision(test_poly, net_width=2.0) + + +def test_ray_cast_width_clearance() -> None: + # Clearance = 2.0um, Width = 2.0um. + # Centerline to obstacle edge must be >= W/2 + C = 1.0 + 2.0 = 3.0um. + engine = CollisionEngine(clearance=2.0) + + # Obstacle at x=10 to 20 + obstacle = Polygon([(10, 0), (20, 0), (20, 100), (10, 100)]) + engine.add_static_obstacle(obstacle) + + # 1. Parallel move at x=6. Gap = 10 - 6 = 4.0. Clearly OK. + start_ok = Port(6, 50, 90) + reach_ok = engine.ray_cast(start_ok, 90, max_dist=10.0, net_width=2.0) + assert reach_ok >= 10.0 + + # 2. Parallel move at x=8. Gap = 10 - 8 = 2.0. COLLISION. + start_fail = Port(8, 50, 90) + reach_fail = engine.ray_cast(start_fail, 90, max_dist=10.0, net_width=2.0) + assert reach_fail < 10.0 + + +def test_check_move_static_clearance() -> None: + engine = CollisionEngine(clearance=2.0) + obstacle = Polygon([(10, 0), (20, 0), (20, 100), (10, 100)]) + engine.add_static_obstacle(obstacle) + + # Straight move of length 10 at x=8 (Width 2.0) + # Gap = 10 - 8 = 2.0 < 3.0. COLLISION. + start = Port(8, 0, 90) + res = Straight.generate(start, 10.0, width=2.0, dilation=1.0) # dilation = C/2 + + assert engine.check_move_static(res, start_port=start, net_width=2.0) + + # Move at x=7. Gap = 3.0 == minimum. OK. + start_ok = Port(7, 0, 90) + res_ok = Straight.generate(start_ok, 10.0, width=2.0, dilation=1.0) + assert not engine.check_move_static(res_ok, start_port=start_ok, net_width=2.0) + + # 3. Same exact-boundary case. + start_exact = Port(7, 0, 90) + res_exact = Straight.generate(start_exact, 10.0, width=2.0, dilation=1.0) + assert not engine.check_move_static(res_exact, start_port=start_exact, net_width=2.0) diff --git a/inire/tests/test_components.py b/inire/tests/test_components.py index 9a7e2b1..dad6fbf 100644 --- a/inire/tests/test_components.py +++ b/inire/tests/test_components.py @@ -8,7 +8,7 @@ def test_straight_generation() -> None: start = Port(0, 0, 0) length = 10.0 width = 2.0 - result = Straight.generate(start, length, width, snap_size=1.0) + result = Straight.generate(start, length, width) assert result.end_port.x == 10.0 assert result.end_port.y == 0.0 @@ -29,13 +29,13 @@ def test_bend90_generation() -> None: width = 2.0 # CW bend - result_cw = Bend90.generate(start, radius, width, direction="CW", snap_size=1.0) + result_cw = Bend90.generate(start, radius, width, direction="CW") assert result_cw.end_port.x == 10.0 assert result_cw.end_port.y == -10.0 assert result_cw.end_port.orientation == 270.0 # CCW bend - result_ccw = Bend90.generate(start, radius, width, direction="CCW", snap_size=1.0) + result_ccw = Bend90.generate(start, radius, width, direction="CCW") assert result_ccw.end_port.x == 10.0 assert result_ccw.end_port.y == 10.0 assert result_ccw.end_port.orientation == 90.0 @@ -47,7 +47,7 @@ def test_sbend_generation() -> None: radius = 10.0 width = 2.0 - result = SBend.generate(start, offset, radius, width, snap_size=1.0) + result = SBend.generate(start, offset, radius, width) assert result.end_port.y == 5.0 assert result.end_port.orientation == 0.0 assert len(result.geometry) == 2 # Optimization: returns individual arcs @@ -57,13 +57,27 @@ def test_sbend_generation() -> None: SBend.generate(start, 25.0, 10.0, 2.0) +def test_sbend_generation_negative_offset_keeps_second_arc_below_centerline() -> None: + start = Port(0, 0, 0) + offset = -5.0 + radius = 10.0 + width = 2.0 + + result = SBend.generate(start, offset, radius, width) + + assert result.end_port.y == -5.0 + second_arc_minx, second_arc_miny, second_arc_maxx, second_arc_maxy = result.geometry[1].bounds + assert second_arc_maxy <= width / 2.0 + 1e-6 + assert second_arc_miny < -width / 2.0 + + def test_bend_collision_models() -> None: start = Port(0, 0, 0) radius = 10.0 width = 2.0 # 1. BBox model - res_bbox = Bend90.generate(start, radius, width, direction="CCW", collision_type="bbox", snap_size=1.0) + res_bbox = Bend90.generate(start, radius, width, direction="CCW", collision_type="bbox") # Arc CCW R=10 from (0,0,0) ends at (10,10,90). # Waveguide width is 2.0, so bbox will be slightly larger than (0,0,10,10) minx, miny, maxx, maxy = res_bbox.geometry[0].bounds @@ -73,7 +87,7 @@ def test_bend_collision_models() -> None: assert maxy >= 10.0 - 1e-6 # 2. Clipped BBox model - res_clipped = Bend90.generate(start, radius, width, direction="CCW", collision_type="clipped_bbox", clip_margin=1.0, snap_size=1.0) + res_clipped = Bend90.generate(start, radius, width, direction="CCW", collision_type="clipped_bbox", clip_margin=1.0) # Area should be less than full bbox assert res_clipped.geometry[0].area < res_bbox.geometry[0].area @@ -84,11 +98,11 @@ def test_sbend_collision_models() -> None: radius = 10.0 width = 2.0 - res_bbox = SBend.generate(start, offset, radius, width, collision_type="bbox", snap_size=1.0) + res_bbox = SBend.generate(start, offset, radius, width, collision_type="bbox") # Geometry should be a list of individual bbox polygons for each arc assert len(res_bbox.geometry) == 2 - res_arc = SBend.generate(start, offset, radius, width, collision_type="arc", snap_size=1.0) + res_arc = SBend.generate(start, offset, radius, width, collision_type="arc") area_bbox = sum(p.area for p in res_bbox.geometry) area_arc = sum(p.area for p in res_arc.geometry) assert area_bbox > area_arc @@ -101,8 +115,7 @@ def test_sbend_continuity() -> None: radius = 20.0 width = 1.0 - # We use snap_size=1.0 so that (10-offset) = 6.0 is EXACTLY hit. - res = SBend.generate(start, offset, radius, width, snap_size=1.0) + res = SBend.generate(start, offset, radius, width) # Target orientation should be same as start assert abs(res.end_port.orientation - 90.0) < 1e-6 @@ -142,7 +155,7 @@ def test_component_transform_invariance() -> None: radius = 10.0 width = 2.0 - res0 = Bend90.generate(start0, radius, width, direction="CCW", snap_size=1.0) + res0 = Bend90.generate(start0, radius, width, direction="CCW") # Transform: Translate (10, 10) then Rotate 90 dx, dy = 10.0, 5.0 @@ -153,7 +166,7 @@ def test_component_transform_invariance() -> None: # 2. Generate at transformed start start_transformed = rotate_port(translate_port(start0, dx, dy), angle) - res_transformed = Bend90.generate(start_transformed, radius, width, direction="CCW", snap_size=1.0) + res_transformed = Bend90.generate(start_transformed, radius, width, direction="CCW") assert abs(res_transformed.end_port.x - p_end_transformed.x) < 1e-6 assert abs(res_transformed.end_port.y - p_end_transformed.y) < 1e-6 diff --git a/inire/tests/test_congestion.py b/inire/tests/test_congestion.py index 1d3b572..53f5400 100644 --- a/inire/tests/test_congestion.py +++ b/inire/tests/test_congestion.py @@ -19,7 +19,7 @@ def basic_evaluator() -> CostEvaluator: def test_astar_sbend(basic_evaluator: CostEvaluator) -> None: - context = AStarContext(basic_evaluator, snap_size=1.0, sbend_offsets=[2.0, 5.0]) + context = AStarContext(basic_evaluator, sbend_offsets=[2.0, 5.0]) # Start at (0,0), target at (50, 2) -> 2um lateral offset # This matches one of our discretized SBend offsets. start = Port(0, 0, 0) @@ -39,7 +39,7 @@ def test_astar_sbend(basic_evaluator: CostEvaluator) -> None: def test_pathfinder_negotiated_congestion_resolution(basic_evaluator: CostEvaluator) -> None: - context = AStarContext(basic_evaluator, snap_size=1.0, bend_radii=[5.0, 10.0]) + context = AStarContext(basic_evaluator, bend_radii=[5.0, 10.0]) # Increase base penalty to force detour immediately pf = PathFinder(context, max_iterations=10, base_congestion_penalty=1000.0) @@ -59,5 +59,10 @@ def test_pathfinder_negotiated_congestion_resolution(basic_evaluator: CostEvalua results = pf.route_all(netlist, net_widths) + assert len(results) == 2 + assert results["net1"].reached_target + assert results["net2"].reached_target assert results["net1"].is_valid assert results["net2"].is_valid + assert results["net1"].collisions == 0 + assert results["net2"].collisions == 0 diff --git a/inire/tests/test_cost.py b/inire/tests/test_cost.py index 8251e86..e3c5c26 100644 --- a/inire/tests/test_cost.py +++ b/inire/tests/test_cost.py @@ -1,3 +1,4 @@ +from shapely.geometry import Polygon from inire.geometry.collision import CollisionEngine from inire.geometry.primitives import Port from inire.router.cost import CostEvaluator @@ -37,3 +38,30 @@ def test_cost_calculation() -> None: # Side check: 2*bp = 20. # Total = 1.1 * (20 + 40) = 66.0 assert h_away >= h_90 + + +def test_danger_map_kd_tree_and_cache() -> None: + # Test that KD-Tree based danger map works and uses cache + bounds = (0, 0, 1000, 1000) + dm = DangerMap(bounds, resolution=1.0, safety_threshold=10.0) + + # Square obstacle at (100, 100) to (110, 110) + obstacle = Polygon([(100, 100), (110, 100), (110, 110), (100, 110)]) + dm.precompute([obstacle]) + + # 1. High cost near boundary + cost_near = dm.get_cost(100.5, 100.5) + assert cost_near > 1.0 + + # 2. Zero cost far away + cost_far = dm.get_cost(500, 500) + assert cost_far == 0.0 + + # 3. Check cache usage (internal detail check) + # We can check if calling it again is fast or just verify it returns same result + cost_near_2 = dm.get_cost(100.5, 100.5) + assert cost_near_2 == cost_near + + # 4. Out of bounds + assert dm.get_cost(-1, -1) >= 1e12 + diff --git a/inire/tests/test_pathfinder.py b/inire/tests/test_pathfinder.py index 62e57a9..9053e0c 100644 --- a/inire/tests/test_pathfinder.py +++ b/inire/tests/test_pathfinder.py @@ -33,3 +33,25 @@ def test_pathfinder_parallel(basic_evaluator: CostEvaluator) -> None: assert results["net2"].is_valid assert results["net1"].collisions == 0 assert results["net2"].collisions == 0 + + +def test_pathfinder_crossing_detection(basic_evaluator: CostEvaluator) -> None: + context = AStarContext(basic_evaluator) + # Force a crossing by setting low iterations and low penalty + pf = PathFinder(context, max_iterations=1, base_congestion_penalty=1.0, warm_start=None) + + # Net 1: (0, 25) -> (100, 25) Horizontal + # Net 2: (50, 0) -> (50, 50) Vertical + netlist = { + "net1": (Port(0, 25, 0), Port(100, 25, 0)), + "net2": (Port(50, 0, 90), Port(50, 50, 90)), + } + net_widths = {"net1": 2.0, "net2": 2.0} + + results = pf.route_all(netlist, net_widths) + + # Both should be invalid because they cross + assert not results["net1"].is_valid + assert not results["net2"].is_valid + assert results["net1"].collisions > 0 + assert results["net2"].collisions > 0 diff --git a/inire/tests/test_primitives.py b/inire/tests/test_primitives.py index fde05e3..6e62d45 100644 --- a/inire/tests/test_primitives.py +++ b/inire/tests/test_primitives.py @@ -15,8 +15,8 @@ def port_strategy(draw: Any) -> Port: def test_port_snapping() -> None: p = Port(0.123456, 0.654321, 90) - assert p.x == 0.123 - assert p.y == 0.654 + assert p.x == 0 + assert p.y == 1 @given(p=port_strategy()) @@ -38,14 +38,13 @@ def test_port_transform_invariants(p: Port) -> None: ) def test_translate_snapping(p: Port, dx: float, dy: float) -> None: p_trans = translate_port(p, dx, dy) - # Check that snapped result is indeed multiple of GRID_SNAP_UM (0.001 um = 1nm) - assert abs(p_trans.x * 1000 - round(p_trans.x * 1000)) < 1e-6 - assert abs(p_trans.y * 1000 - round(p_trans.y * 1000)) < 1e-6 + assert isinstance(p_trans.x, int) + assert isinstance(p_trans.y, int) def test_orientation_normalization() -> None: p = Port(0, 0, 360) - assert p.orientation == 0.0 + assert p.orientation == 0 p2 = Port(0, 0, -90) - assert p2.orientation == 270.0 + assert p2.orientation == 270 diff --git a/inire/tests/test_variable_grid.py b/inire/tests/test_variable_grid.py index a1b03f3..ea6dee8 100644 --- a/inire/tests/test_variable_grid.py +++ b/inire/tests/test_variable_grid.py @@ -3,64 +3,49 @@ from inire.geometry.primitives import Port from inire.router.astar import route_astar, AStarContext from inire.router.cost import CostEvaluator from inire.geometry.collision import CollisionEngine -from inire.geometry.components import snap_search_grid -class TestVariableGrid(unittest.TestCase): + +class TestIntegerPorts(unittest.TestCase): def setUp(self): self.ce = CollisionEngine(clearance=2.0) self.cost = CostEvaluator(self.ce) - def test_grid_1_0(self): - """ Test routing with a 1.0um grid. """ - context = AStarContext(self.cost, snap_size=1.0) - start = Port(0.0, 0.0, 0.0) - # 12.3 should snap to 12.0 on a 1.0um grid - target = Port(12.3, 0.0, 0.0, snap=False) - - path = route_astar(start, target, net_width=1.0, context=context) - - self.assertIsNotNone(path) - last_port = path[-1].end_port - self.assertEqual(last_port.x, 12.0) - - # Verify component relative grid coordinates - # rel_gx = round(x / snap) - # For x=12.0, snap=1.0 -> rel_gx=12 - self.assertEqual(path[-1].rel_gx, 12) + def test_route_reaches_integer_target(self): + context = AStarContext(self.cost) + start = Port(0, 0, 0) + target = Port(12, 0, 0) - def test_grid_2_5(self): - """ Test routing with a 2.5um grid. """ - context = AStarContext(self.cost, snap_size=2.5) - start = Port(0.0, 0.0, 0.0) - # 7.5 is a multiple of 2.5, should be reached exactly - target = Port(7.5, 0.0, 0.0, snap=False) - path = route_astar(start, target, net_width=1.0, context=context) - - self.assertIsNotNone(path) - last_port = path[-1].end_port - self.assertEqual(last_port.x, 7.5) - - # rel_gx = 7.5 / 2.5 = 3 - self.assertEqual(path[-1].rel_gx, 3) - def test_grid_10_0(self): - """ Test routing with a large 10.0um grid. """ - context = AStarContext(self.cost, snap_size=10.0) - start = Port(0.0, 0.0, 0.0) - # 15.0 should snap to 20.0 (ties usually round to even or nearest, - # but 15.0 is exactly between 10 and 20. - # snap_search_grid uses round(val/snap)*snap. round(1.5) is 2 in Python 3. - target = Port(15.0, 0.0, 0.0, snap=False) - - path = route_astar(start, target, net_width=1.0, context=context) - self.assertIsNotNone(path) last_port = path[-1].end_port - self.assertEqual(last_port.x, 20.0) - - # rel_gx = 20.0 / 10.0 = 2 - self.assertEqual(path[-1].rel_gx, 2) + self.assertEqual(last_port.x, 12) + self.assertEqual(last_port.y, 0) + self.assertEqual(last_port.r, 0) + + def test_port_constructor_rounds_to_integer_lattice(self): + context = AStarContext(self.cost) + start = Port(0.0, 0.0, 0.0) + target = Port(12.3, 0.0, 0.0) + + path = route_astar(start, target, net_width=1.0, context=context) + + self.assertIsNotNone(path) + self.assertEqual(target.x, 12) + last_port = path[-1].end_port + self.assertEqual(last_port.x, 12) + + def test_half_step_inputs_use_integerized_targets(self): + context = AStarContext(self.cost) + start = Port(0.0, 0.0, 0.0) + target = Port(7.5, 0.0, 0.0) + + path = route_astar(start, target, net_width=1.0, context=context) + + self.assertIsNotNone(path) + self.assertEqual(target.x, 8) + last_port = path[-1].end_port + self.assertEqual(last_port.x, 8) if __name__ == '__main__': unittest.main() diff --git a/inire/utils/validation.py b/inire/utils/validation.py index ed0fae0..a044854 100644 --- a/inire/utils/validation.py +++ b/inire/utils/validation.py @@ -12,12 +12,12 @@ if TYPE_CHECKING: def validate_routing_result( - result: RoutingResult, - static_obstacles: list[Polygon], - clearance: float, - expected_start: Port | None = None, - expected_end: Port | None = None, -) -> dict[str, Any]: + result: RoutingResult, + static_obstacles: list[Polygon], + clearance: float, + expected_start: Port | None = None, + expected_end: Port | None = None, + ) -> dict[str, Any]: """ Perform a high-precision validation of a routed path. @@ -47,11 +47,11 @@ def validate_routing_result( # Boundary check if expected_end: last_port = result.path[-1].end_port - dist_to_end = numpy.sqrt((last_port.x - expected_end.x)**2 + (last_port.y - expected_end.y)**2) + dist_to_end = numpy.sqrt(((last_port[:2] - expected_end[:2])**2).sum()) if dist_to_end > 0.005: connectivity_errors.append(f"Final port position mismatch: {dist_to_end*1000:.2f}nm") - if abs(last_port.orientation - expected_end.orientation) > 0.1: - connectivity_errors.append(f"Final port orientation mismatch: {last_port.orientation} vs {expected_end.orientation}") + if abs(last_port[2] - expected_end[2]) > 0.1: + connectivity_errors.append(f"Final port orientation mismatch: {last_port[2]} vs {expected_end[2]}") # 2. Geometry Buffering dilation_half = clearance / 2.0 diff --git a/inire/utils/visualization.py b/inire/utils/visualization.py index f314aa9..8e2a0d8 100644 --- a/inire/utils/visualization.py +++ b/inire/utils/visualization.py @@ -69,7 +69,7 @@ def plot_routing_results( # 2. Plot "Actual" Geometry (The high-fidelity shape used for fabrication) # Use comp.actual_geometry if it exists (should be the arc) actual_geoms_to_plot = comp.actual_geometry if comp.actual_geometry is not None else comp.geometry - + for poly in actual_geoms_to_plot: if isinstance(poly, MultiPolygon): geoms = list(poly.geoms) @@ -87,7 +87,7 @@ def plot_routing_results( # 3. Plot subtle port orientation arrow p = comp.end_port rad = numpy.radians(p.orientation) - ax.quiver(p.x, p.y, numpy.cos(rad), numpy.sin(rad), color="black", + ax.quiver(p.x, p.y, numpy.cos(rad), numpy.sin(rad), color="black", scale=40, width=0.002, alpha=0.2, pivot="tail", zorder=4) if not res.path and not res.is_valid: @@ -99,15 +99,15 @@ def plot_routing_results( if netlist: for net_id, (start_p, target_p) in netlist.items(): for p in [start_p, target_p]: - rad = numpy.radians(p.orientation) - ax.quiver(p.x, p.y, numpy.cos(rad), numpy.sin(rad), color="black", + rad = numpy.radians(p[2]) + ax.quiver(*p[:2], numpy.cos(rad), numpy.sin(rad), color="black", scale=25, width=0.004, pivot="tail", zorder=6) ax.set_xlim(bounds[0], bounds[2]) ax.set_ylim(bounds[1], bounds[3]) ax.set_aspect("equal") ax.set_title("Inire Routing Results (Dashed: Collision Proxy, Solid: Actual Geometry)") - + # Legend handling for many nets if len(results) < 25: handles, labels = ax.get_legend_handles_labels() @@ -117,10 +117,11 @@ def plot_routing_results( plt.grid(True, which='both', linestyle=':', alpha=0.5) return fig, ax - + def plot_danger_map( danger_map: DangerMap, ax: Axes | None = None, + resolution: float | None = None ) -> tuple[Figure, Axes]: """ Plot the pre-computed danger map as a heatmap. @@ -130,10 +131,30 @@ def plot_danger_map( else: fig = ax.get_figure() + # Generate a temporary grid for visualization + res = resolution if resolution is not None else max(1.0, (danger_map.maxx - danger_map.minx) / 200.0) + x_coords = numpy.arange(danger_map.minx + res/2, danger_map.maxx, res) + y_coords = numpy.arange(danger_map.miny + res/2, danger_map.maxy, res) + xv, yv = numpy.meshgrid(x_coords, y_coords, indexing='ij') + + if danger_map.tree is not None: + points = numpy.stack([xv.ravel(), yv.ravel()], axis=1) + dists, _ = danger_map.tree.query(points, distance_upper_bound=danger_map.safety_threshold) + + # Apply cost function + safe_dists = numpy.maximum(dists, 0.1) + grid_flat = numpy.where( + dists < danger_map.safety_threshold, + danger_map.k / (safe_dists**2), + 0.0 + ) + grid = grid_flat.reshape(xv.shape) + else: + grid = numpy.zeros(xv.shape) + # Need to transpose because grid is [x, y] and imshow expects [row, col] (y, x) - # Also origin='lower' to match coordinates im = ax.imshow( - danger_map.grid.T, + grid.T, origin='lower', extent=[danger_map.minx, danger_map.maxx, danger_map.miny, danger_map.maxy], cmap='YlOrRd', @@ -192,27 +213,27 @@ def plot_expansion_density( return fig, ax x, y, _ = zip(*nodes) - + # Create 2D histogram h, xedges, yedges = numpy.histogram2d( - x, y, - bins=bins, + x, y, + bins=bins, range=[[bounds[0], bounds[2]], [bounds[1], bounds[3]]] ) - + # Plot as image im = ax.imshow( - h.T, - origin='lower', + h.T, + origin='lower', extent=[bounds[0], bounds[2], bounds[1], bounds[3]], cmap='plasma', interpolation='nearest', alpha=0.7 ) - + plt.colorbar(im, ax=ax, label='Expansion Count') ax.set_title("Search Expansion Density") ax.set_xlim(bounds[0], bounds[2]) ax.set_ylim(bounds[1], bounds[3]) - + return fig, ax