From 73d661c797f807166ce17f4148a5dde46f4c5cca Mon Sep 17 00:00:00 2001 From: dinethmeegoda <35506196+dinethmeegoda@users.noreply.github.com> Date: Sun, 8 Sep 2024 23:53:09 -0400 Subject: [PATCH] finished --- README.md | 64 +++++++- images/blockSize.png | Bin 0 -> 20016 bytes images/boidsNoVis.png | Bin 0 -> 29227 bytes images/boidsVis.png | Bin 0 -> 32594 bytes images/demo.gif | Bin 0 -> 15820542 bytes src/kernel.cu | 353 +++++++++++++++++++++++++++++++++++++++++- src/main.cpp | 6 +- 7 files changed, 410 insertions(+), 13 deletions(-) create mode 100644 images/blockSize.png create mode 100644 images/boidsNoVis.png create mode 100644 images/boidsVis.png create mode 100644 images/demo.gif diff --git a/README.md b/README.md index ee39093..46873dc 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,63 @@ **University of Pennsylvania, CIS 5650: GPU Programming and Architecture, Project 1 - Flocking** -* (TODO) YOUR NAME HERE - * (TODO) [LinkedIn](), [personal website](), [twitter](), etc. -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) +- Dineth Meegoda + - [LinkedIn](https://www.linkedin.com/in/dinethmeegoda/), [personal website](https://www.dinethmeegoda.com). +- Tested on: Windows 10 Pro, Ryzen 9 5900X 12 Core @ 3.7GHz 32GB, RTX 3070 8GB -### (TODO: Your README) +## Summary -Include screenshots, analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) + + +This project implements a flocking simulation based on Craig Reynold's Boids Rules and Algorithm. This project was optimized from the original naive method to include uniform grid based neighbor searching and coherent memory access. + +This was done with the following approaches: + +- **Naive**: Reynold's three rules are followed, and each boid checks every other boid to see how it influences itself (even if it is beyond its search distance). + +- **Uniform**: Each boid is placed into a grid of uniform cell widths. As a result, boids only search the nearest cells that its search distance overlaps. This increases performance by a significant amount. + +- **Coherent**: The memory for each position and velocity for boids is placed contigiously in memory as opposed to scattered. This allows for a considerable margin of performance to be gained. + +## Performance Analysis + +_Notes: The Performance based on FPS was calculated by averaging the reported Frame Count over 12 seconds, taking measurements every second. The first two counts of frames were removed to allow the simulation to stablize._ + +### For each implementation, how does changing the number of boids affect performance? Why do you think this is? + +- **Naive**: Changing the number of boids heavily impacts performance since the algorithm has O(n^2) complexity. Each boid must check every other boid, which causes poor scaling. + +- **Uniform**: This approach has a significant increase in performance over the naive approach since the number of checks is reduced with using the grid. As a result, the falloff of performance as the boids count increases is more linear, rather than exponential. + +- **Coherent** This approach is a bit faster since it performs an additional optimization on top of the existing grid method. The increasing of boids still causes a linear decrease in FPS, however the performance is better and causes a less drastic drop off. The algorithm is still tracking a similar amount of neighbors, so algorithmic effiency has not changed much, but the memory management optimization causes some performance boost. + +
+
+ Performance Graph with Visualization + |
+
+
+ Performance Graph with No Visualization + |
+
#Uk<+9Jss^fvpWt;-}PpPU=Hl)l_wTXnD1U#P~( z8&hdzO=Q0M`Fo5c-w;0SW9|g@4Qyc}DceDt`r~?*s+m1E>@B`xFvt}8^=9eLW^b2q z!ri6H$GW-)S0t53_t;#1tcE6*_P#E32x{Z%8POB225qDTw@tEDX0r(Lu31F!xqp9G z*~r`odZuK1vZ?&I*CWgAQ2VcE&^x&5!NBa7*R%XaFT%FwZM4YEU5&gsV`AfntZ>%! ziR;vFKkDzsOI~V&@uYoSMu<9rDQ<*IW6v+52C5W1tTV6=qW*B!<(^jHb3|?Ks|{E&!LRY%;OD zy`T?mVsc5^cGwB~?%4cMUsiDZ_-G$~@zOv+f5r_%G=xIV9?Kf-%PDEz& SgIqg6iZX4HMg?N);Y~Tr{7>}_Q6vw8E~AK zS-ADh?XivL8^46F7|n-oRM4CH_=*H$f4Na(@6^3t?z98(E>70yQ06fg-i3Q*%Y_Ly zdu&Pq^L35ZHHMhhY0lWMIFkX(@t~i!qkTi*FQTHz0q1JXig}%&S-nv$n_1|~V2I@P z(axnjSh+*DYV;!ydzm-VU@?K3jiIFm+fHsSveq`pL`vzc+W%pyV#Aj)u8mIiqDvkL z`)u~Bfpw37@sa^OUM?Bre|8Kk$ t7`8uBz zov++8#pSD`0Q#+;+H(tOBXR5fj =l2*Acj^8R;?(ha z@$QBRIN;cU#NlFPvAR+AOPEvZ*xdB9nZe^JDfx#no{DHexmm~6(W}+Sz71>8Q{C`W zLASEMrxPx*tY2{YEU7`i#tGR~rOPcZTjMiZ?ETu9e-CJvkL38eF^3v5M!!2K>ZA;h zE~tuq+c!X2&ttS*q?J_H)E077EdE$pP3WAmq|9E>KX;nsUG}4hK{73<&@CJwQG0N8 z-U&u-x5zpA?7rZiVWMV1->6|P;OdwG4Z@wwT``n`KC)22(|pHcVr#GQCkzHcYr^I1 zki2?rJ5kFR#vIek75mn0F{+XP9-G&Q8bBIK#uWUCtPwLQf45i{ 9J#Z3Kwu}(Gz7|*!=hcUB~dhoUsjdC8ts*Ruqd=f*dDOCjTsj z)!Ic9(~CLL)(L2*Y>HBatc_|=TY1-2jW*4W(=Ks{( qB(ENdA zbR5p4i10OB=~oo&_4Ai5yKTOCr0~>1cN;63M$EA 0QT<~=<7!K9eb=gp48p~07N|i5H|J)tV^`nxRorQpAIGZHQBp70jH74 ziQev!Wjr>g7jFE0<6D3?n&{#r)Q;=H-^+;`O}I*ZVf3}0 c!pZ8`Qs^`E_gul^6Wq zO7Ew4idya#KYH5?prm>LZB4Vn>*7B8_2xPNBp;_o@Eps+qXg`d pkjau)^8Z_b~N=myr%~o_pMxY7T-dxaPn$2@m^n z_jmHOVlEov>zM?)0A*IY EJJY}HefQJk%=s9;$e@3UsM58O9 z`3I@jMsHeY2*?#t*SaBN<7@*3sWZB(hDDC`<5B&qqPBp~26N2nuh&8=O&vg>NsOL^ zWzb3V@qz@Nv)Hn>w~yn3eq5^ v+AA_}Z z6)L!wYqQ|fE7P3yC_-_eewlHViH0zn;pLF-+yU*WOw5cKCmv^i0}^UuFRxyX0mp<5 z=J(>jlo{irpa+~_I}0b7_#jVm1l}}RCVPz-s>RiNUZNX5cI17eY}ahUydI5^8a8$z zXeKIKadvWcUI>??^>Tu nf0&S z@*eRbS8K;stPfIZk8*^h8=UaJ{aZ7I^dNSwsO(%r>ui=Vn8b017E0F)qFbw_vwCB& z{HA9f)Pk2newHXOLjSE1rl^p5`~{O@V|@n58>PA$1ND|cZ5rU%nOGgQ*?XD(>J%=) z-_y^qKl~m6tR$RoJ~5lYVab|R*m_XYIRiqKH3+_pcUp-4sn^ezMynxAtNP$sk&H1p zvR5K}lO}AvwmwaQ*YwJPNlo*~Oq04c{|&fXbenSI6p8x9nJy0MT>lsVgeH=1|Jbo5 z{UdA)(QVLxu5^f#QnZ%sLUgV*o29zfz Ch2Uh$Y+BS7s#y@4VzP{$!HoeH zc5BAgCC%gK8nbaX$am8{-7({$?_$|g=;O1f)|82`l%dh54kC5eWV!~#Six1Pd8f1m z&Og+~o_S1ScZJJG%k}^Z>UnEjcldOB^; a4`l5SX*J4mCeld CZdLuyoFXxM~Y$>NJq6G=Dr7?Ui-CqXn7; zXE4JrV#xHlDxv0VB>nEon1Ebntag>LcgC83F7}7bga`;k@6Gjgxw5KvgnluE)U-4f zY7%G`lfTvz-rbs(eWxlQ9}9>$X<=zDfc&*s?Lp1!bn`|vN4ndWJA6}PtJZkc_?Y5r zO>(M@tKMR826K@s)BfI;ULB;CY61p;c5n=%Hs9YZ# *{jMA!z{s^xa^Tj=xh@sw}aWj0D0!>WHfmw &*1wWHH)KG%F;WnhKX`g9i=(j; z>)yePVov(CleE3zh5f;SZO?oXC}F*F3 04u(AMCN0qR_7m^)Z2@l47p3nk>20ASd8$0NH~nNl^M$A?OM-e2ab(zOQ! za+9SuqJi(<&G#pPKo8Cz{GYm>TK(z}SKGW)JCIu>SVflv<_56H?KqvnZ!MwnRjtvyEJ-hVyBgulFhjF12s;3V$o$-w}ec)?+qi6)4rw{iS?M zFPPNym)Ot;d(SIxf8{9iB It%UH~78L~OIZt88i+O^%s=^L@C$Y&JWH5TU3$;6C~Ot%cJhSctym zMJs$g+G)Qy=|WjQtyan`1g3z&v%Y;SL2mqzKs6P>q%pR6>zbTa@-4&GZEvf5rqI?b zcWYDVB+HZ)ga0JBN>l4M>A%Nmljk+{HgK*`8^$+$mXlo7#)G7y8a!PvqCF4Llo?~N;e=sX>@DbZ=!y} zrcS#W2`ApVJm6R>Z!dQ?A9-ADWD@3nS^1qTCQ_O9F0m{uCrCS#>IA-^Q-s~czN2^H zU=nk4R;V53{@(El?^{MoGQ7RVR3RpR^nD(4c0IDhxF}*G;Z2Po@t*;}UOQ6EIC0MM z*>E+^0ZyB?+HA(!WH)V5kuzF=iZOu-K3w~wbW#^Ua1CEEvjtlCFHbb10trctY z?_@Zm{Cs4J=7e6YQR=oHGR2&Fl{wB(@0Y(U{gEZrts4NG0b5Sk@`EIIO=f}A%b{O1 z6|z5GE52RfKk%W2OpB}}R8~KhOlslV_b`a!q-EOh1X$?y-e{*=P5cSpGw&mnlQxPH z{6zK3!mi7_jPXpENEut%umh9Ey}Mt`x1 >ml{RUsG%ejx3SyfcmB(%vKD_ zJiw%0S*1gkS(Vk =pU!gj+o 8Y-#^}`Iy=F>RDrQb$P7+8 zF_!UT0EfCtJLFp+nFKnOaq&jb{lh`JlRu8lW{kZIkFFp6u%vI_I`(%CDhJEIPPdyZ zRtt`fX{CD*yaZXhqA>PsRF01{dh31ma@CiWuPZ7Y$>gX#eEXK(P~8ofeByFW^)muV z+zHHj?MJfgYs5&R94-ve|C?$X?Wvh=IXuG9Fx!j~2P2 zKAQn*@as*rWCQgveQd>EOHmEc3tMG_Z?6xMKDh9XPK?@I`Q))Ko!R$5MMUpu=&xxSF6!3+3&;XE+JZGVD7qUG6ieoN0fL z$!}q+1ZFF2gux7(XCVb%*mZ?#HG_D~nxaV1_Zd-3P(B9x;p5@+vsDjXj7lBWzq#m+ z!5ZBjh}~SZE4on;cwE%iA6So}%a0soZ&PLe4b&SZSS;>%=6v``vUAJB5bV9jMDxX6 z?M{0Z)gvV)-d1I4cc{5c7Q;4)oL4?(psZ7ewrPEQa`AVpUn_A>$FcK%hj!3DNmnF~ zd(fI&L#>b4dZFdFx!D3kcMrORK2IWi8)8>MLNDb~^hGU@#P?zq?BjodiuXJ?YhBV( zb6$N F){pIr;)wK6A@LQ&I~D{7vQB zqhWWk>*t?Fd>BsFRfs>#a412Z;pcdt^i>2 !NCYO`}wh=YqX7=fo7{ zLCQHGHcQUwqOm tj2{r}z^P2Lf55{S&Z6!&}_QKMPr zQXE?Op;OVE6WgSc9d~@#rY04yeN;c`$@5YvQMc2;Xd>?%-@}Qm)7W!X{qXkD*!?n6 zTeAta146u2mYBIrf^G9<#EUkm2NNd`ZS%aPw5MQV&!PAuO>N*>ArA|=$a)cfl6ByF zEMRM?u5ZV5eOB7&D&Ir)wqI(#VKI*!+f};8OZPtc-E$9c!?3ehOZ;(P?R4&mwMW}t z#RDViv959SDY4uCXyUAs=I93BPE&H&3V6B5qy3(qbEa>lME~4oowe6oTHN#gmT@R) zB;Ncd#1&0Rkr%vpeCZcp8tf1I OqB|oNF}$ zAut|?IX@n|EFGy(yhr18`0$-%k&%SVP|U6UE1^0eM;QE=@#Okjmt^#`ZAv13xS1Ih z8ka|4`{Oc@cglVQd{JV*(&Q5Pdo1rh{CNyB{;=Zc(zJ+=*@ISvHgQj>tF(?yUz&a{ z72{Qi*Wa#><+hulmQ3mG*q7Qy)jWBkRm#khi?DeEmRrYiCgW9T%ZCCh;%3#|^ihn2 z-Srm!b$r}4md`VAL-FnTp#of%x<_tKPR@u(e6wvZpbZVKN{sn3eXaS|& JP?rx|K+f52T=Xr1Vy+mPp7WVPdLgZ0je(x0Z)4a%y$>!~0|Z0+S)_WsUT zH$YYQu9sQoz}D2>nn^hKYZq{)wAN$4EfgK#G#+V{qlFH;CaS7Ldhy1Wbtf3QIW3ME z-(Q})*DVHCqp4W;RVWZ{oEBymmOy>`*>gf8x32K;&Ps{rF>NwEax-)hzM;Z+uUwy1 zjf+Ab+RmehO`mo>9V7qU+{1vJmb#Xl$|v~=7k>Nn8=}P3TrU DMUgZQtO-lxfN$Fq{685ZVXcBT zx7D1p>oab@mkbE_G-tS(Re!Me0$#E_t? 2%0H(t2&<(%0oS!BLgo-
%Ye|>$R>IV>vxG77M>-CHIErqC?xS7xv)H`Acp)LGXR24p|nmjV-IPbiWZ3*53Xo zxCoZ&HGe=8by@@JDj5Kw`H(gG+k2txm9TR6c98F^WRmZbQMO}I)=p4oOQfBn3k zCHZs(0s_evIqo=UKwm#jr~rX%#ftZ2y`Vp_J`%pUAJn;eAjwx0iV*{8ZN{HC(#>ex z21+=u{3z9uAYtew4)UdmS~?oi*NfL4>;P!Y!6e_$919Sr`{bds_X9~#BF94OWAl_E z?jsD@Zn&C7(B=EAMB{$&uqB4;Pw={@nN976?STQhhe1^^^8=5w&RzNRoSx{beHyhg zOYO6Q3@;&ueDrvNWt4mE5_Y3QA5pYcO6^qj89$0;n&L)kVv7xzXBG4!tWuv*cY&me z96$Tc?RK*{7T$97S@in%htvhvj&Da}aW;9RwDnob;y{+qW=zCyBr7BpB~-}s1EU%Y zS6&1Ym$|0&ueiYyO%GitX3&J%g~JNj*|;u3dz+YhFLrH$`V-HTX+Hz z+i?OtaK0C49QsFL^Mhe5qjlQ55TV&BM4k^YTR7T8v&4;PqN)wsqw%*NEmKpELhU!` z9fN7YHR`Y3WYW?5U-ss;dlU^X#eEZz+F5EjSIgJa@sOWf>i9Q@5foEb^!rl8MyqkI z3vc6&0Ef7v8wheU1>QZ{9@n=Re)nRv@N2`l-QI$>0G^`4J)d(izc%xbLcR*_g+x2X zl%f7Gs3D(R*J`-jt)OcK5iU}PTPf2^sIPzH3Qt2Co1@t*P4UZ-Q>zGEVaI*jI^h%4 z*wL1CJKR!A(d|@9TyVsCbVm;AF+PR552UJi= I{sBSMc%@yFGZ zAN3CU2}=!sw}j$8=5>q?%9&{8{<}R_!W$h$8Y_GW<}ap!6Ul=003o|@Vrh+Sr9o?; zWs$OlH|lsnX~E)cOEH1a-@m@d66I^g_}tWheIUToc6Biti-Q~>Hhq^g2bhW1&^4iP z=jvFjLh{kIZ;^CiZejZAJeQ89R>Q_wDz&c{GJZ66R+T7gHfX{ nn;M7O_P4x#Pey{!QzEaRnUV^;jcchnzKqJp9bBADo)osh%h= zMDlVvL>NTO+tsPH$I|vaH;QO1NFSR!l93)wnc%)&YW-I_xf=Ji!k=FxTngZ(6Ts*= zPO^@o#3lP; CP94dG96HtKzN4}*;I8ALl2*9Tc>ZgQn=5-Uv9BS0`K@18N z=iL!JFWT92;?UX1!(Nbk^DY %56V{oDLZ^uDEMO_( zxapx5MeGb&vl(_}W3)16C!Wz2k@ssx!=(LEvbposX@#oIf!>Db72^#-C6QbK^jMHP zV7h*wN!jA36=9Pci&irOneDP3_M82z?Q^_`E0588#eS_N#PDY;SV${GFnuQe!CpmE znBmpsZ|Xk5sQdbmbFHi?hdhc|-r=34(61c3<{=e=@mveqQ y>CER50Bm%Yk=+`xVahPWYq=VC~_#|;x)rYb{Bp^#VgMAobxQo6VE z-GQWU!@vkr)WGNZEY}f*D-bEY2Z4fnE(oK^kFeNgL*&^wlg#9Q$6 V`6ySOJj}<{Q#nZL%ZNH?rV|YmahKHY4pe( z7=1YI12-wKo{-Ln`BakCp1SDS&rCG^kh4~ljfvJ8)N^cBUwfEsh7qGDl9v;xzZzI~ zvX#J`K8YXHfJ3JRYeiHZ1r^*)S`^`1*@%BQyT>xbpjzQ(N#7TCv&PTwc|N2(bn3Uj*&GWPbV6WpnFK*5)>!Y|L#x*_zvZvNN~;WN+^9$-&(5)39^& zq({(K*15Ufu!v-KJO2JnSwTeq_bx(P{if3oPjI%TNC1Q_@t=SpV8HZG$KCfpu>YA^ z(*#TB7&D_*I;RgNeRK4Le1>Ni7V55WO#_4Z9{PJzx*= +t_c(?`cGM%TIZ zQmNBp3*kmyaBu|N%bqj17-h)NXfJ5)QAf{~5ze6J%Xm7Nr}!X*AyN~)Jb_7uu(XBV z{dO0_jed|j;2SwEB0j&t3^{4`oOw0gsCIJ`w}dvEByZpRhQX4L3cGmI!8I#!#- Sd0~Tc#_)hv28H0=8U^5Tko_jVhRDGeNFLO60HTWS>A2Ny{rl7_IDK6dpGy4( z?tq^%L9InF^zEMx1?5joHZS(RU=SLKCYV 7AQ2w60|`gC_UvHI=$_*D7796#q1C(47&k=3iy5Z~o}z%C6Ra|DHX@EPwfUR^ zvw$P47d8wSO&;>oOcBwk=EE@7n0#~qmJRe%Wy@xkO6d_O{=!Qjytdp{&=aYFU*`Lt zL!4Rk@Fr=XCKc)FcjJDGu%Hf_rdy#{bAK%}RBq%hdR$pD`~xxVV_R`IE!Ax8{7Z zLvb?U=@ungWn${vBi0Hkb^9c+Tz^K(DO>sbi )h7b}jtfP1)b0ub_yl@{_v;8Uv{n zs3;$c7KYQ*H1}t{sZr1cG WgU66vA9K1Qt%ds@Q zu_(7bjKJ@h; zN?{9Fp>suj1Bv!)Z)U6+#WIvHsO2YdMgq7ALL%3!L5#h&3yzSP1j1iUNxybIn%{u- zC5`0I!~`PFFuxWF>kWZM<11(%Ts UY8Q>>| zp*`Rbkd|EhiOGVxYK3V|*T{Z1<28K^!p X0{QNGWm2txe@KfEo zBEkJSp^~d^tAc=Xn6rx!v!R#8avu_WsQwO0Ug3Se5u{Yh?mP>iWsv&O;}qZh|Q zJ#^~kij&QUnO0_R4S$WQ=1s{$M)F(cT}xDeI`-+}r&nM62fo1V)Kt09RLXh*kOz@x zmbNG;x=VdWF|LCG jyk$?;`nVUUIQi$ zKsi7>;y#*20tqwFrIVlj-@8Wt<=Ad6kZTCasNZG1N67oOyz9UO;L^~-yR_`+v~m#W zm6`bgRcaJbmM{aHKUrp>Fov->Vs1N%GoM_ucN)mwuz`^GhOs0>?m@_UG5rzfK^L%4 z2QWmkFLjH)Z3IXBEK#`4^;&)wz_U2)BUQgu8WeBe djYV&hNY%0^kX_w>?CbA;|3axAK-D5_fF`e`aPH(kgDL ad6R*irr@IJdbw@!~;XCKczohj2qf`W_f)=+=oLGyCDGT7Mha)D~^~ z9-OXm)RNmC=dq |&A*ifMP zJI{-if0XYi!1gw*N@o7L0?*JE)LS3x4+^)>Zv8+NmkUWHtu#=#i0@L&za>&nUa#(B zpqO>JiVCgOhB1Vp#`!&<2NOC?j#uFS(0tSXyF6qJ1!|2Bc^jb0u{n)r&FQCefrPEY za046tM s`FMtL%b(*+7GZbPZ8Q7gxOS z-)N7YHdvp-H?*6P=#KO{y45M%)xlOmw;k==WPvv(GiL&VU(oF6l#&knvGoz8H z?>QCC-aNd01dnCclEX6Csu&cTO3lW{O`GpoXUqv3kZo)RECgtN+1oz$U!|#Jn`vV3 z4aZ_-Q%H01r|{_Km5*IEh4ny>bD{qHda>Rg)guQ&8c!%DNeD}*z*d(L1KKW3k6clv zwGMb QICxIM6R)AervihD}-zE!zpn42$cd$jos*G%IpSxuoq+Io^W$P z+v_FPAYCI^kMT2hP<*-qF~5ypJ#r2J7RBN{*S=OD;wF|z>+w467TKhZE%MfgA@2fU z3Q)oR9*kR`#W4qjAH*)`prT^7@=Ys17;|IApD>U>^9FVKHTS7G $eR><{+x_?xZpEuR ~=>eK}!$DgYYH*o?f zA;X;ID8K{IY6~vjLoEX ^>k$ z_|DmfH V?=ievfVkCa8lDf)7SXpcXeFqTSW&X1q1`N2u8nA?k8*y9N 9t^+F5mT8*JKVJs0sW{x=pe^4dKYI+Fr>L-bE`mkfUH|YlepX>5 z|M!So$wQzR+@=SVrY*J#F~XvPg3v}NX&N|@R)Wl*w{d$E5&6Hjd!#0e8j$u3uzTmN z$&-i5q?Ca|^{%q)+XGqZd(&FGZ AZL4Fd z&hd&+!^yf?4y-mmZrX9j;e{%CKn^}oNpx8NCZ%3=S(zr#aN=dnXbo-U?@NMo$n9=N z=)326sz90i`gNeE@0SZD-1zunziLfL_kmSF>@J@|ebJGECx#OlGjXy2m`v~7YZ-|@ zFrJE}({WowMhw^(0xR4|o|!S=k)U7)<$vGg7>73*-knH33{T{m@+)u^6s8Q|$`AJX z;mn=ZQr?6qb=%y&dEb5}457mg%q{}v3B-f&%}Be5_0_F~@H7YpwqyQQsIXwg`bDq+ zW+pPSB?bS9%zz`^{UK`UsU->#Js%3Vy|U3gP9E_&Q1zD@+u2 GdFn>#_j6nKQsC+yv41I>Rft6bl1!Jg~9stJXC02&JD0GG-&TwjyT zB}pKBWfQ^&7&Gv#c>{9a)o8%-fVxuDK5U$!;EzkI16&JUA5h$<-kiAjI~p1kAdj2^ zcFdLt18i7XAPzj>1la+bUk8i;ROcR74FK OGPvZMaBiq=KQ3!myd zT JPLKc9n(pGJTcVkI9)#!Ehxd?xuEu%zOFB!kmHVi1i;@-*~fZgH_f zbD$GaHpTIC{~%7UuBZ*${*U>m|JAe?l@6W#IM&Jv<(kgd05 !u4Op(Zav)pTLKb+nNE&6=Z=gx63>H$>EbTa6*rBf9xdKzEA8B zfZEWi=dx;m eN-YCnH_!gh_$=XcRARL lW}to1H~1gxgP}i$p*Vj>}$ga58sl z9x)faWckTKdXgb}X3UPm+Ir17G43i5Qy=^fcTN6Jc4+=T@-A8682W!jp)Hml`c)XC z5fBiNi^~IR?)%d`00g?m?wf#Dx8p^C{YmjPAK@~HL`kJ%nZ2S$9*rSE-A=AOD% #K#ojLxN*bN|F zNbKW%mZY)ov -zu{q|}qQ+&r- 8|L>~h)-eUa1k5FN z7&HXTl^febzlD?3d(m%J-+Ne7xHKZ nzH}& z>U%#QuY2^$8mLPP@ihz)i3y@`JB}#Phkyrm?mEk~h@DB~Hc2dSxW%z&ZAh2g8Kduc z6KatnAtjk`1yWxbjO4uD=t>ccU?9-aQH;F`l1_1TP(gBxG-6lnD7@>WxkV2y=X%RP z;V34R1YfAE$yl#DUM3z}b{A;e@y&dHvZ*vfqH*1#CiWN?dAHh9ns?lUX@Ox`G 5#sTbE$y0E%4r9m0lRVJ><*^RWO>~52|2Wq+t^udzO zbR9chyyL0S((2Bamj~|blKQa|q_1DRr|CQG!x*78{q?BSt)5KD5So_D?jv10L2gNo zJF4DEp1TH=EO!=4Mu9-r9s}*prSSz&mi=}cYoE97@6;w*OI&w@nx4m>cnw~vy2!Ez zFD;O^{Yk#czun<7$8VrnSM=MBL7hM}?%LIGxZT*^Uj&qJN%>J^Ig_-QP%yy+?mwse zXm7c=apgqon3yp<8hDkx@}s}sb=!fzj~}1+d}N zxl=;}s7MZrfg?NJ2kwrE8ASFSxCdlXy8wx_OdPEAef&p&o`}6D@Y5dfpQZ;pUjUhK zO4**Hp76yo+)#nB6}~p3?2}#pbuKyM*U1?GLqv;jOK hAk(2ED7QX$qABKDu`FuaRRKvY#cn3Oflkj|Y1KxuYd7X(VMR=)np z8j)1pOwFZ2g!96x|H{kzWw!cO9y!)OJMOvF?P+o9kh g1?Dm{}LiJS-(`FTGnob!x+XYiGs~s{O7r1m& z+LiL8HL|b+>t{u)8%J1sb#SoW(EXoR`XjqlNO>v~-OjYx-f-5op=&5E;IjhYv_C(L z*d |$^?48Lk=|V z7WJlosHSWb&D)S9e!Px5eyd1bAs;x8BJoXGp_VkCV@vs{h%c+Qd0a*o_up`)RG@lS z=gP1&_&a*&3|20Zq^T#L?C- 93q0#z3+~5S!<_`pcl%cR&Gdv}S0j zPIFjqYW2|$8@a%IqhEmvc>TNi?m6TBzyX|RmBKl)$f{~@0(Mioo3?4jp`ghZ)vlS% z)}qSCiy}Gm|2h{vL2~kzN1-DwpRcIGa#wcUyG0cXkb1p&dG!i!(=xvvF09M^(ty*ek@VNXJ53A?ufR9fGax2{b)Lz+}VgJ`~Z8P zefJSfjt5PxjAc*&_c?QDg7|c~)?t!E f3s~o!ccrwPLmeuwEDm7YW}g4W>QXf zxm}s3ntLz>-rV{7p3IuQyu)hj(?2CjIa^$a$tX=;cH&>`b?fKLYIa=Xomuqfgk8+O zjEey_^>>rq1GhQWo_Qzde(A@?{r-AiuU&UoKlSk`+wXUbzu6u*_2p{xHrIHKSt-(m z^RHx^v*?O;{d#5oe|n)&3~ lwZyZh|_rv7Q?j~dm){7w7w?qkiY?acu$+SYZIn>Xy*#XGymK#TY2mFl}Q z5}&?0=JmuO-aPKj?bWN-y?=B4=LDVK#eq`qfob{9j%4@kf|9_c_rX`*>ORf6TeVvE zdPmGV+XG2U`Mhm=SO2#8cJ$%T)BB?3wS(S2oe^;T<&v+~FDs;H2Do@1E__=eZ8q_F zQNgM0dQy6;mD&G)@(o*gdDpzxLG=Lzd9QxGTYWz0yHwY6z0wGI>rdvr@2ledG)w2~ zf4VdCpIN!-)!&7hUkxqicR&64F8v88`vMQw_%18I>Hf8a89Q@b_UCDI?b7qU>mRlM zrXH}~W;h^1w>?LgE!v3ivUhiGf{SWknY}3hS`2SFT>j?9#hkmlw$21LM&;MLEIYYn z=J6unxbVIV$xl0O00*HL9S8U47+!lhT?97fZtZt<^6-l303Hkz%)ar@*R zagBEE!WDc@cLSzuxN?2A@YfAK*Lhuk&W>C8YwIGuMAv7raps3VSzIoy-g?RcczVKh z_JmsC!s&?cUrvFXih=EmY{IKbyc{$iDj)XRaB_og^fr_4cZ$zDX{>sFd1_+mftRbM zFAuYy|Nr#s^t#%I+znrWyPgtaH6JefvZ3U#r)=7;hf7!{@@PL?9yV|Pvsu} %`lYJAk%aIFe=}X`+lH|*qCyP}@R2zVnbLu^= zN_+L(c>TV6i+Uy>2-#oPQ+@Z>&qZ-@4A<;|E740;9g`-_ThuavW%8$*W9!#zYB6e_ zvZ?=ZSYD6IyL89Or#r1)Jjs`v{&VWfS5IHP+E=$XhhdFA*qNLHUo+Fc`f|Mr5aE=o zUA`Q6kV0GPu1_(X>fT>pq{OA(nj%!NsAbVR3r$s(()j&xW(?QF>As_c_&qEemi_$C ZXr#mt^pr#FA8@>c!PC{xWt~$(69B5pxMu(W literal 0 HcmV?d00001 diff --git a/images/boidsNoVis.png b/images/boidsNoVis.png new file mode 100644 index 0000000000000000000000000000000000000000..2d507c067fb0a5c47f1c2dd7dbbfd050bf24c50b GIT binary patch literal 29227 zcmeFYc{r5)|2M3Zx@b~YMU7ColwxQhS%xH3vb5MkLe?Q!n=vz$Pzj|_WZ#!D_Q5cd zgd{sN7-K@#!Pv$aV`lDCUElBTy6)$%`;X^1?&mlj$ARNy&hxXqm)Gm{exEN)jSWD; zU||6P0npVemv0IP2!aI!w#@7l0{#+Wbm1QGYm4tqgG&NM?T4pn2KOS7M@)Z!+-LUz+rP({zNkG8o)78s5w}b5FsDbYf_a!mVysFhARjev!p6AJ! zH$ns|vF73Rj{^UQsefD|_Ucnu T>m(K?$)iD56Op^-&dv|5tDPI+-mX*@C8JwzZP=l_8c&@fPks l@P$O~L?4NJvKKizosQFG ;cKjWniK$(GVAfsdq;Vmb GCS)ozZv zyB`@88WhvDBHcn3S(bdxHc6S+vVjlhe0=!Q7BN>Lh-z|wqBS|Vs! %+ zrdDbo%{Bo3 G{Fqo!f9$yxmM3xu#un z`8rNZ %Eos+t-=fz4M#m%pDYa*-*htE*G(C9V#7WZ8HKZjM^K z?SOLcm2RaHZO%Z)>>Q33fHPYkw|H{7{^x92M c(V5r{18Q>Z?Ta1Ao>@<&SIw zh3-J2_CH&BbgG%0w{_zR!b$(X5BrPw%6mUGXe`oM!g!{!Q>jY*qceA%nPtQ2IT%GR z!h7LQk4l_Z4@36ln`PNV%oF)24em-0Y^*7g5-Q0*%>AkR#NIeOU%|ROm$gR%V-Ho- zb<>O$0rSp7=fgk}v)|;ge&KK2y7~S#$@3XL+h+dg_U$A_Yc4(a_xF#DlOycL1TKy? z&c6m@80{L2^7(l$oUOkCe>~oP-ixgCb22F~+2iX3B5I|en&dMQDqds%jTy9V;pnwQ zQQ_BqgG}0cuXdj73#oh&hnTOPT(48)CQ0XHOe%X1*ABBjDdkM&5#{?lvj$0PhuhG= z1FqrryHRS{6Nv#`dg4rq7ktQ*afy&!E2_QG*_U4#alEfB+bA(?zjCmtl0}Erpt&m5 z?=7W?SFGPP63(Iq+A}W5VGPF7mA#G`Qk+s@8Iu=cSZ&^-ZOgZ^$RYv)O%|p)85m4k zWc>mtcrn~KuRfpwq*~QbAhezpa2j4Tko>2cr)T-O_6rTroDb(*;=CYIcIlI8Vei3p zZ2h$45O8Zv3J=L;lBvjzhj3m_GCW^I-u?B=1vHdT#}WynpZsZGN$@2dU7f2>E_UdK z&$@Emcg<9K_Pcs{Rr+>7$tr#og~<&V-0%$WwD&wU*W~0JFfv+eJy*gK>&Wi2B&~LG z`&@hHln86-9-1DKgK=7(Q?wn@!JX8i&W!PuA?4(w{Gk=~a)=*3885Ax+Du+HEnaK| z4z?x*j$P`w%FtcyRO<@|e}@| ?s<7*SftUW9BXYK^~_%~Sx?zRo*ew~vUX?Z_C0LY0hooegPADjBdsmZFXQ z;4lNQHn*0M9g%6Z-s>AvXAXQ*hTN&@M79eET$}^HO+C~34yF(RK3W5%UA&>IODtS> zZ1t`lk3%_JqMPcrVl9X(Gh|;VVSZBLeMpy5zWc(IR&sJUxF=!7@Bv}(R6K+%r$Fvs zYRxNoFKLn qaOyL2Yb<~)08EXjD zvJyTxc-};doykF@rl$Glohj5WnG{XB)i9j0=VFIZ#~Jk6Ybkq%5f3S!a}!p;+kd-k zV{Br_3lDrQ;WkcC^3UAKywkaqQjjOHjro3HUA`H6i(*W9kh|eXXOB0-roNlOjRs!d zDO!a>o8J(;c}VH` c++n=$;F12q?Z9KJ!k(BP}dkszX}%ZPH2s zcDLH0SKxE*y-pHe)(_a@PWC&Yx0`3!rhSn{ogGSj1A-(cBLb2H7b78<6Vl4PoEYz+ z^(H(?iDxnQFj56$LSF#E>!hfv+F$MHH*-&tU#~ndq7?l}gl_mQcbHKS#bKG~x^ZwJ zyV>mV&5Lb{bo7f3Zx89uOAH$|c)PWtJw?6zI wU{qq;=ITsw|NzD1xS+)pG-y~nikI4020PpZi{Ztx9$5d zhM=qstB2pZj+(=-bA=0p-jhCPzmhcpNpR23HoLhNK1Dqu!PKuesO~{FoZ=XI5N^ng zgKbc1Di@Z+YB0f$hV-uWQk-+j+j#W%haLV$th4U~b qy|cNe`Afu;0DWIoO{jh7buVeefn K@;e2h=H&q&PTh>jx< z&T?-;@^Dw60)!j0(iS>ZcO+-3r_|Wv%Z#^h^ s?HVKR>Ep_3^s6*D9fP~` z;1sJrh9<_Vlf%JQ4jU{HUi^2>JH1Y?Jz)3v@9ury(tU=3`WVLFZpB&zDRb>3FNf~s zE@6bS-g(r nvNS8m#~&*JscAcIk;Q z>4cP=J!z(y_I%{s#oi<2BR_&WZdY1-(++ m%#4_R$sPpDPwuoC|Q{0_7C zHvA4X`w EDrRn0e8LM_7)oLbkW0n< zIy s>;v+nFjcU}THqOTaP#!u9*EglAQQtjDgj{7z^XH5moBORE>-6(W% ze{_u*A8ycn7t@ @?Y$Ho27e!{lv2sP>&HD5`e!6L&pbMe0Xp2m zIUdrdCLoXtt!KIB>SS_$?oe>aD^WI;fwZbRDI1TGi9CNs+7({$DZYF#??L**NY+D; z9Pv(d7}FFNi;mKTJswX _%`2Q-b%E)n2CdtPvVw4&S(VaMAH%9mx8DAmGv`*Qr9<1 zLl#p)H!iLfVr+0V))p5weuRj^1%s-aS4WO=)VYW>mTK#cfTsZ5-lw~uBg2VcmpZq? zMO~Ksf{E=>?_kBd^dnu9^bF{?9lv8uBJWBrW$0TI>dlJMCM8S<%2w9Ko6fneHThMa z+nL9@xaD*Bd1}s`&INie6Ve;BveG|zeo&wH-AwDcT#yq@A{2}kzNNh U&FV2uCHbGiQ dn5CZ#KA+GV)P5c=G%9+dt7gBVCR#spV=l&f|4VPrX$31d%KbHGb6Hnb z6Lzl0+LBLn25-;vl(EDC>1{9yPH-=DNAU)C46YKkU{iCNyAi3)-H(0HI$EI44lPxh zD+#V5cju@qBIyqzmAkn*vuGgevZ}@_yr5x3yKpo^zD|_KJry{*l^+bmX}h Sg z*&FC~w0PryWHzV;4~Du>wehoe{jMZ@#w8Qs#l4iDH1X}8)S@46LAoKf2D+?8iund7 zV>0t``eYu*l`~UL)L0@+Kgx?+LHS4m9K_v*x=YBSK~G$>=gflp4_B!AM_o|TY~#$S z#c;8_CvTyc0_iJ>u(hCZaH#wK>1!0=2Yc#5An{|R;jk&rOyy~qs~Yzn2A0`uCR02V zTi?1JbR$Cz;rsxjOR;;>t{MjgjhZ)@x4PM^$vbdFPTxl}$=FfwuA)!5{xe$eUC=nu zmpo=vdHpGP6ub!4S#3v@vJn4#YfKGoX_ky8elr@(o`IYUyyjddwB4jH#xC(V7oBS% zWO1c44Mr&Pv$u7&qZ}j7-YrkEhfimfT6mCSTU(Q;M$wqz-S+3!Ezpx4!pFyxbBu*k z=PG3wiMu;)UhG5ee_6%^2&H>#t`O*mvid7SkgN9aCKr>@?fmpCL;g)c^W`y-(v2fi zo}vIA6VMM!ee#D3fH~$(Pa1*aQy2dL=cMYw{c=rEpUwgQ4~qu=e|0RtZ&fz3d0}jy zUsK`8tH~__0-rwZ1jwp@Kz>vza3zpB^M7=y4{`MzC~fq@&z(nXEH)eBRz7H>2~;$n zOX}-0t8sQ6MsZ;H#U_b4E{mo_?M{(0?72eLzQbEw;?wrR=TT6U#EgIRd1%whbPq1E zlu}~dVZcZso$KVh&jIk*S1s&prBuXRW^)w))GHC~aN>sVDT~C|2|)pY-hvyVVE4P@ z5|3p-TM6}foXNZ`IblPV%HQhTLn8`3I}aKTda+qwyczC0r0XnnLE!OWU$hO69VN!E zS=Q0%xQg>2xZ;2E+lNnRO9N|9j&$$rRQd#f6uw$prlv2L;jIk$k{GC%wcopm8nlKBMa&9oDl~%-blK3&ewi+LnX&FvN z+VS|jGu(Gb*Z|BjFTS2=L5Sj(@+w?X%7|^=(rv9;Md)ZDgr 9A1PM8CenaPz+-IGp 173w0Tw!y9XJ>SDBMa-n2zFS? zZTHuCT_0dU6Y >_wKuRDcrE7-~-p4zNS1b$N7q^dP^rNzYbH zPNR4hyp5ma56E3c>qM{RQi`t}#Wr%y({|V8Ru46PaA{=VN!Fk&9(lPnmVTpib+vWZ z7wyRnWZAd6iCJIi83bV4rlL)MxjqLw5F8R ;`8Z?36XS2$jW{<}M zQ_8h)6jSc)zm?IU`U)vnd?(~K3jpS8{%%lq^PAaqC|X+O6mraj)uJj@)?q+zQN&*5 zvp|Ehr33udi;>^1(R+i5$+NW&JIu-pX}brQSE}bu@1bIcN`WD@^sD_ncn_Y2k d{o o9gv`Qw!PmD>f-ku>6s(Eu`a657jh)L zd7tC#rwu~2(}+Xrb)FgJcgDI@w;^@UP=eZ2UCSbyX8GKQZ2bvSQXc0gIpYy~{0r8E zby5{wJoh?>6Ki8mX$mLII=TY1I5D1@90CmpP&3l +hz$Zv z_wONL-Vg3eR1ivXgmBqUz%L#Ns;v0o?TKhj;(V~KNu;*6No!vC7ghI)k8!MJdo {_=~Bml_Wb}T>Kn;>mD{cS zu6Zk9P&+cjluZ%Ax`%-&AB1g-{NoalM~@HY7ia;0IGyl+6x{z`{qW2+L&FHkhhL8d zw8+N4^E$aHdsX5g*s`*oO&tmWIEW$c84QqQ0v76b;L&B}lI2jL49;QXN|zU6eQxQ6 zNpSk;`N9)}`tUXs_?oQ~j$$d%(Jb`%Au#Wmm!e?AY>5F;Xw~$oeq9$`+O6|z_j$9< z_g6rcFzLQG=r%&psZbDr8CQ2YWdmH5cIopyp)lo6$#A7~p(N=cbaDdV*h zP6(V%1{Tm{Wa6~iDGzN(ICVqN5LAL2hPSFT1q(tX_WRjXp2?=Du$z)5Ji7U1pnA`c zcB}oKi=e@}})s zjULD0y$bY0F7OtlB4|Xo bZ LP@lt@<`HhZhkY8CNb7SSI_auB z%j?ihu1tR9KAkMsN(fV^Gq1bPha)po@N=bDk5q~tn$!H%J8^@?^N}Sczq#2dr^&Jp z(`@vXx>+;%X{8o9R`<~}$%#+$X!R0pDKcCxqcfMSZEO$>rNQGshG)_l^(1=?Ojw}r zQm4RaFMSQy=iWo^OF9jzLmO!)5|#i;z@J4j16NTArNq(b-XI}R-SHML4I@HVLY-~v z{RUlBviHh0o;SZL#+Dy-5R>`_8TqINDzWVgv2ug{%}cPYgB(RF^BHTJ8{R=pwy*47 zFQ_oul4`wqQf-#oK-_|+%BDZoic^JbDz_98RZP$>62ZIxBVMIvLs5dhjO$Na=o&ef z9EYwO7%z(?J@FFfCe3wy^#WE+IHSmBzUp<|27=}Uzup6N>3hR?vano6QRdf_Qa+Jy z4c}$x4&S9?N$0meb_cBWpsFx99@+;j%!_##sjRZF5>f2^bK0ABp=Zhcw!0m01pc|W zOUuZyHYG-US54`%!8IL6%J`(HNB$RLvgeq22Zi-%7wJ>mdFwJ9hm0jdtZ}rs0e$RG zKB<(48elSZs_HwkeHs$N05)$9rw*LiKR}M93MItPIV{n??hx !QVA!yHG?(6SzNsv7_#xUu!(7Al)p4i=k*ds|RAkT1;2e1Vv6SOHEfi&( zwxb1$PMwRhC3^L!mofejcy(fv^$9%AmvIGt3FNB(-*H(}BLbF`lnnU!#$eD`WA5j1 zu08HiPqvXSj#0bZUKz|@>c-qRGBP^ oqZ2IY|QqJiS!BEj7)>_2P*#3BFhS! 2Tr=r zfgI1ZFQo(cSisbdx&uVh7(vMFKlT?z hJ3P@~V50EbeQfq5=g9l7g zTUd9m01n)s3;aNw{uTKzI{Ql~@84M}NNCPCaBK(ztpYmt=`;WN>RTzl*ZA_LNPu6j zbEj#LoVd`zj3@9cC6ObydzCKfbB{S?*b@E4m4)a&U&EfwJ{%YZEsm*QUPc~iQQFZf z9N@R}5HsTS4dTv2I*#x6@7YjM-gq|$*nM@B(99ni>d#)S>wV3&fA%VMOX{(Iepv9L z-t5$#voqpHGf;ca0*3dpzw4;e-$Mf7=|D+_?ynnx`+;?wx@QpnYZPFxy~+Z&zeMf+ zbt7;;U^BVTB_)5&b@TpC0n@$z|G@t^m;Y~W_13rL*z!zAvuUNfp2h#Pg(okDHNOa- zL-&k28@%_2$x(%0DgM*4WKMUDLNN _T!BKD?cvehEQkZDQ} zzVmb=EcmC4j#91}3iLJp)2g;9xCIZThw_KSFHG>N8yU8qVu7)7Q%b|71L;h9q02y` zSRLPP+C25_zed04V_2rgz?3B8;w)Ja9X70Ud^e~GI$!mHpEl3O10Njd!LCmuZD6>V zMGw4H!#uy1+N upZnRg?N4H0-hm08mG_Sax4;+EvuKr04Y2!E2}8r(siqHH3f+m5 z0hHjuKS;{X9dl0&8h&=*b!!H*?Y(T5CoOCJ4X4|89{Q(Ao$0zfH^0BCYm~~_5!JmP zvPKibuBFL>M6>Jf`A!=PMhx3{Bt>gG*>q@76GXY|tMxKT38LDam3DsF{#wjjjXK58 z4ga*h>rOs7_%-{D_6`V~U1t8C-NmbSobb-Xq1#8za;&@0%G(k)m};e?Br$pd=OYY1 zbIe0+-PEJsm*XR4wBvdugs7RvD6jFkQ={sB;Ga`{q7~W}r>yC;xHNXBL!a20=0;*z zuFU)uK~8pQiPO7(b^P&bKYweMypk0K(t}|>%fKua*bgfPDbEuVVfgiXa1Hl^|9apP zfA4aqu{p0@1|y*ak*%x7zP$c)vZx$L!QQUsmNV3w=q$- W620uo?P6g(NIhAy zH{}0$!k}GN-GsBC1LW+H(Tnomxjl0s%_1q+bz4RhKi)oUnVhy|Y%Y*C==~~u>vN%Z z2GU+~kkG|{Wr4d+G5s-^2ndR`HNuYCDqM#4#{U=*ic``amW)z)_hh{0czDs3qD2YN zTP>Sil8D)Ri6)v&k(^?=Q;_E+P5<2dRP|9WL+c6a+Vyxb$a?yL`@H-7A8#Zrhc(Ma zKRpDU@+NYHJk*0|1iL6f;yswE9n7a8JS*$8`M*~5D#|rc*2u)NcC=ZnZiT-d9@P!3 z1QjJ~BNjJ*TmP^P>#6vV-WCM*b}|poekX0s+Nk!@(wF|%-U0&D-Ink`o7&l(fG;Hi zyYeyGrrZe~LALd3sZ=!#oKf=fEUru}D#;dP&Cti+ubX+`nd%XViPsDrl>Zet4~k!H zJ{3W>_wGszw{)0K@s`%?rlhNi8pl_+gDx>nL}BRc50&gpN9w`d;_9nIedkkFZ_({8 z&?1=^{r{DYbN{$Xxe1VsZ%K-{*+ZBK ogx2ZMh<13Lf89BZ{PEGq^X=#Vsz6_x6WK)Wn1IYI_j9$T4|S*6{zJ(p5S zl9uk0xBxzmZm-;!aiZJRzP5{!{MW&!uFAfVI9((kV}M0veb4jLzSs4+!?JeivZ?^o z8aGsF>;DEn8sx3i>~O1)n@kx}(KsFa&uAd@`R$5j_xjUDkM?5MMKAOBObR!o`8%!L zwJTl$HF=v3Uq9>t Tl;-`&6VEM@%z0p`G89=@2{oY3 z=x? iK;a>>8WP2(=mA#)yR%IUVh-wIU7k^+YZ0tVeqs2U|}4kRSJv?wGI*KKgp zkAA)(b#;w+#m{ofjbD|_N5*;90x6q@`#fvnC9Ns7p-X>s-#da#v(=29-}bKqef4_l zlczf8UB4%)dgJ#T1)j!n_P3Xo3l``?F1I>-^dq=*4SHZWi%K@E24bR!lyu2w5q>A) zlx^gW4?F*PERhaN4xhq9J>@$2$j4uAzJIUopHHve6Dmxjq*0VRSi!E6B-D6{HA_aCF0Hwd=V!tH91}Ni-^XIwjv4w-fZ4x=otj4EI^0UwFZY-9@fB9) z)we@Lw%u#bojR}=syJ&-lBx~81V0e>RvR{F!7X8GCW`<@(VT8^!m4)lPT(6IThC&t ze>tbd5eem`aOla?u0x@s`vw+XgTQR5T~GA|V!qUfx8vG!xV>P&B@;y12+G56Cos$H zCOHl=fqhGA(m2-^o){MYJqG4I)!yj8E$n}rt5js6=YnZ!u6cA5(B?9f*mPT>$D_<; zKx2~k?Y!|oS G zj^k{P{# K>}eTUSC{&k}ol zPj=Oat_ObPl!yA=hi4vS-s&NmlvdKQ DjE9XB$u-e_+TgAB=nq@?FWq^9{9WI{q%lzpOXX!o_|f1%1Pub#Lzz$pQ3 zvZNIzbRDinD8X&QvBpSHR@Tj5IrrY;OKGc-(C>|cDSWKkLAA!1D6_2X&0;{rpT&d* z#`AVO3upWyORv&0I~|icv>Y(aXe>6~vBMU&oTptmA3t#bp>{T=$pB)#R6+Rk#u&i5 z3hafV?mrzvBqg8judrE}z^!X(hy<1d4eS-e65C@Sy~>|Iv3?PwrmN-iwv>Rz?W8Ii zk;!~`xE5Q{0e}`#T=z{`TROz Wc#NJML!h(Djta z;MDFqt)~Ql5FGmM;to~oQf5VW-IKxkzX!1D?sHCx*18KZkS38^-x%9ubH4*<`I=$u zUnLSfd+SgaiBEolEv3*8%B(ciUF0_b>Xegk=m61vBUqC!Ub&G)?~#x(tgM^g8v0ak zWvPggvfa3+kY=Q9VlNlA2Et|Qpz=6FTgF0vZ&dH=&-n)`ndxPP0Qg%Kidsc@DYdmt z5C1H>DAmUIMn-0;Ne4#eI#Cj{Li0DbXis3ymXWIA4&Cx8!|6$xuByU>A*4BP!$KB-8@@avvoz4um`{ z;73~m$gVqD|L1*B0jj4s#`Dp@C<}YF!C<`_G0o2!8B>L8Th#T;YWtC!URWegHC>mT zW4tpLxGhfGq}qbH4gi{wzEITJwfF<-Hs^AH_2z4>6YFF@ao_40z zu50~WX>rpJE=5{BWG3?ph-Cp)s4-&}`vuw7t*g5MV!a^BHPM^PSt-eAMAW=~>siwg z6Qz=MKtQJX_o2Gmf))0kF0GRgJ`(#E#8&}M??g4H8Hn&q1}$rb3OlW>-2v>Mc3k#N zV}Y@e2S=uH-EQp=x$KSVDW*h)O}DxdSJO5Q)xO(ToU+o9K~rX#K;TUI`A0P#qwgM} zKHXj8ZF2mJNBpL4x0cWpSG{JJomC$PU+Fd-0qd?GAgQ9d7t;2`lz&%*C|>|JQH=`n z+7*U%v%O&-4vjr`pD6+J-J*?R9g7&=$ktot8>|m~dlo&(|C~- ODYymoCz_5;O?=%hfBN3XnK`c=&&?t`=dYjn<&KV5K8y2fznPO^D^-BkFy`87)z+StVng& zN9`U{1U0J 0)T`}CA*Nc26QmU+{mRLCz>0Ncp=0saZ z&D_)Vrr%bv)xr`#m_S6BmIOKil+q&`{+Ird!TXEr^dUDNgoMgDv QPeqt*SP|!n5N8h8pYN?vwd!8WZ7eV`(IpYggLwOpDQ({~J*F>vOU<@lm~65& z8+k{{mD~o})Q);XF4Yfu5lG}r&w=ckdX+hf9Z^mL56xvlk6gnjvijB|q;$S>*Qd>615 z!Fdq@xbAu|SZnZ_{6*KD;9pKA6KW=pVJ`^65vnzl9gwy|X}Q! QbF`6K^Q zS?QSsDQMRAC#MW0n!FbL^5)ZJ?WGr$n9N~QLv?b^mc>PloXnKAtLE>Qn?H1TxFxV} zsAkK;>Dogli~R3BPm_X&E$Ve%+%*5BtHMyydG14xen$)O3zZ)qLFMw9Nha6r0+mZHDURv2oi1?sTtKa`XuO7kNezG<=n^i_`IYx<)Bixd-=PHCxgf z@i{4!Xcp3oo2e^fKR5tjbRVbz80+j~;Reb*@b}Kd0k0Ij@fBLsl4e*i685K9hCSj&&^nNQ(>Fh0eH2)aeEYI zl6My7Ssp*Jn|jfHzkAgedDLhTYKUU`VYwMtwb$k5ZpW>Lg6 $B}p6()!a@_Inn%+aR@f2)tz1)$!LlI%Rr zeuOHJnEjRPEECQtA0Wz&da(@4H7?8aTzp~2EA)6j^~(IyMIZnIlnou>e{MNL49ko4 z*k&ODs&KfHKH73bt7>3$yg55%q@(&A(pj7Ab 121sesT7hAwlJdT(>ielI1yN(~xO%1=9#b`~#wptI?l86=D~Jpm zlrvSDh_e{Fusd?HvubxFV}aqqQ0B0xL3f{r9RKD;qn~ALWQ6 zRDq+bv<*m>wG|W{9Uf77*&Yb7^Us$UqEG}rFg50HC(a+{zqhPWwFc5`T}A4-_{fPf zeC6Jz=f?X>oYOQyV%wdv&RI`?H?K>1q}|4@()fN;=ax&;XrX_|Z$bF z%k %%vGguj=S#8Yg-3KDz_8ZukxN2m0UmLHXTuSO> z+aV}0*o~o)qJcDzz^U- H*Zu2SC1u4x1ydLhww1RY#%fGGv$JD9OnuIDk z^@8Wi1Ln213Fp4q@1GfW4gQ`k%VBAMzsI9l*RFa7z6Wh3_uK&&+zR#{b2g}H@N5zW zRR~ Ru<=t;w@=^=c<}873rOAsXcSa$~J^fHDD~*;A&2SO4%B zLgVf+nnrf?)1x(SC!8~nDX(9+UE=cw`qpUhZlneO-e;*xd%=?N_V3weSi{o`?=vyj zcu$2c(*hZ2+dTfLov-;i_jDFNEq=glIH#Mvqsp!;b9!32y!@T{9;x4gznr|6TV>k` zsj<&Z$C+M3!LXV#sqlg=f!^07L?*42`9zk=vHPgrbPLu);Ps13KA@MCHFk1*l%DtD zpHZ#SO3J-6cLGD`i?7Jn4e9e9+zzk!qzP_hLE{>A8RC}w0hIzfiAk;eRn`#vl&YQ* z)UP$fiD(>-WJo!MRumZeHd&8?cc`QAw8qcL{Ac)!sfzobFXqT!_6Uwdcz3f-qWB5j z9~X6XVOwXcy{|Sj6zx!k&lMnD)LV_#x5&Vk_XLvgna;-G=eSsNQ;okXB *yp((eb^rteZn^WD4bqg{)9t8Muw`Pe-W4N%EI#f`exwS-qXtz zd-B!1EO}y&X~V_deF?!qSo(oTF~$c};KmIa>v@V_?!;4cvFr2*Kuo)1+C;h&7z!AN zmERkBQEx!$rR$iGhuSJd(Nh^UzDz=~Fw@4Wifxhxp`=m0`feee$~Su;fF>h71jvrp zNb 8q8uDK3Ve;N+bt~NB=&c9@K$@3=^6+Uo{7b}WtqT^9yNvYhj z0;?hZx^Ca4-?n)G#?pHu6cNRlF9x)7(^=}35QB0;K>M~>PgEC>8Rs=#8QdDQd`{Ck z1=~~HQzT~FhsW(*-LS8jvx@+RYt9_Wn1dOfZ!ZpNjD}dRjF-=&u?&2p$tHl?l$&OE z0t~{Xh1580i?~KVsP^{;yQV4$hepI@h(Z7t %?Y?O|>9{TCsmBARS4ShhZ>2)SH8*Vr5H(@mR<$Ey5%JQKaAT1&R1S^xD)Bxy zPEU#9zDUt7UJH@v;nXG%2L_E%{$ofwKw|43WYi7-!rAclDAE{layK?#MZNr}-6~T4 zJC94y|1?YUg-TzgZ*+fN_xCDW9!SOFSoYdO*#6X70TJ~SD(WOJ;x76Vgb=hs+y>r({!0K H*rwcj+ABsXaHm-<4;~ROIlUXRBwjMBI&BcGXRnz2 z<=)s_R)mchB0TSR@i6@;`o`rq71XoT-x%;0a9=A{E?b>S5M3WHIXyXs)BxZmtSgaL zp6MJHC#QI!OSYu30R6!$CAtchDFtGBK6@GlcE2`cJL`btgH_)TC0%!z@LoagV7skK zSJh8R*j?xa8Ji4RWCu=Y{Nb?KQQ}% O7V>Ad8u}ediX~^4 zxzd2BHa+Psr2`b_WZ3Cf0O%LMJwPg+EK+>nskL}8!Y0Ac*CW2DZm*KI7B!9ULu*G) zcw4Wm6K%Rzo^kxq>77=Ye&%6!_am%17dsiD<>MVH}OzqqQBO1kehL21YThi^kFv) z`AO@5SW~-hp(ClT{AbNl&DJ=(vfXo?%(Is^@#=b?cX?Y(oZ9^Ip}I%U>Hc#p?$4ZR zv{#phy%Dhh 1>6pJ~sUm5&2Bz73cYw4EiOOCbbKJ*yZTjlaW=%Ptsn@kk`qLw!CR#+o$ez|v zb6@*b!oHoL(TxSg2r))7 z=P)40&*g}DQ*S0n>;`@Aef<6Na?01)D(#rC*U+BR4{;*0N4us~{hJ_lQB#e4EA_hj z$Rn;toXiSn^Fpfa3U f8Y^ws(pBUW|&d#;dsJNH~*m033-z5H(EON~wTK0JxB zSB1FCw-t&4B*61F9Y+^51WQ*0F{j1qD!u2!-+ou-dqd!k`Hc)aQ%z>z(OT*7(^{Kl zcrZrkWo8| U)xPnbcn8J*8)`w03{5*$;$PAT`fupT`8QKc};MRl-MEipCAicT`O!zy7k%a-!U( z?3pci9Kf30XuP nTs$J{fhi)hc@}wh~rIu51MoJ#8=A&A_O2`3U-0jvY2J+N%)zP&29o^K!IaA zd8*NShlfE-zuab-AX_@s;g3-9b eoprX^h>%{?}-nMAmKVqf 5HZ*zmAM9 znN(DgR(69u3`)wn=2DO^L6v~m`Njddg+Ed9!Af^Kkfc9v>Nv%4znN>2HRDorHc?LM z7F1^saAv7=)fW&qn+Zh}7$|81gmB6@DTzDm+w(ozs(c{@g5t;lD*oLTl0^?k?3%m| z;H7|_U?pwI-*Yyr%|P6|#quGK 0^$Map)8a4^IUkql@-2x1bZeK!5pHFsWd){{&1=~YG1`;|^z z*b>;gY5SLYvBvudOciosnjMJgwZd6!H2FodzO+W;oEk83 &w7!Hz2c9 z>M6nfU=|mk=n0~U_n@s!{O?8?GMf=e&s!>H{x-V6dq;t;$naVieM{Hb*uN6({lc$Q zbK2P%qh{z6a)51~cc81zS30%IyRE(VS}bMYeI&uOE>6-^&H$0o6ykd4c~kgbu+|<8 zGQYpfbPr&kx8*fzs`Bcs(GPFu{o*Kd&T;$U*L>-wCS@81NPq`1X(jC(4-PfT=;rny~Pq@h--?9x7qE8Bkq%Mgvjz0cQoc zN_P3ySI2)1=wl!b8@juxasvw4WDzM~tj|psvGrqCX6H=N4@t;cI8Wn-ZRC*sWsg;9 z%cYUJERDy%hKah^J7Ju?mxy??DYv@v_)~o3^odZwH}M6jboVI|+skeHua>r#?g0kz ze*wJ}Nt-3Kh&l-x^s8`zdE9*xG1EV}(U3^N#_NXv`4=Ft#y##d1=@~ir(RTMk2uC@ zRO_$k*I?iCaa`T-lnGv*9(Ha{u{=Rpb5^nD<(th&l}ifr>st3GJzPlxEU+b|tkTB6 zaqbVlfGocq`6BkynoRXq0^F`&PrY%w-xG-4zjFznD!i;^rnM=01A9XrRq0W1gMTi> zr n-q@p2bD?q-?{zh#2@vyK)kgP3kh(y-!R|XHm>Ny+gdwYSzZ-p1%#-Fp zBX7qWfNJ@}k;_K`A>mt6tsrG{ZgQEDNuNV60lao>Sut4d+1=6fv@oEHN+lKXRyHzv zGrMorUWGgO&g_LV3@p{{tG`hu&>KT`JlnMy7xxcEDZU&UxuyQ<8`JABGFPKkc;7yd z3eePrxd8;ogHfB}DnM(@-*YCN8^RSogX YO7~pF8%Vab>wQOgLaVxd_p5P zn^YuOR2@dsw#&L8pnprSn_VQEC{-NPmnQ}=7Wwb&w`WJjWW?&$h(Mk)1w^ghq?$V} zE%_FkL34XuhW!4*xpjH!$p^NKrV?5}PE+F-onKFCi1RB9$dQQNETA?bGDpUuD@CQx zX}bd@i$L-gK tHQS6o}oT3?NpifuxBR$AbZ_T7=&MbTL`h@@kZW zGb{E6#*=O&Zidf%oTP1sjbR}>k#hjhTDao$;8}8(TCRa|FW}CBPp{nrDkRQ}VKxeO zsE 9OUIo}>u+LA`B}lBZ#V%86$j^{27NsFgj&8Uw(K^`1akS&8aS>g{!U zd%`4OIZAWs3VmuyBk?g%4@}762v%ed2l`z_;9+$?c8QQofLvP>jId){L|E{YLDGTQoX@e-Nd*#GPeEXU&%DIMKvNBP z#l1iJxU^iUjxL{d^xkmoqq+`VG(CU_yylpK``xo?Du4W2R1sqF(q=Idu%1ojd*W7> z+Rj72+(OUnOVWIK^ #Ry(@k-bEvMUe*W#X zXR^~_apm7j)~FE*fRF*GP^`I-@a$jcA7N8FqihJ4I!lKW%b)UQjsbnBTb7m$S}#Hm z#sDSlUv=$Cj1T1wd?E`ry*9#t>y|<-NPy9LX|cub gne8_R!CP>J=9x3x(~ zqeiQyJ*)_qR-8unp1N+93;Rz8EKsl(1*cPbThCgPyZYw}&vOQ-Nm<0lCG}B7+O|5i z%o7Gorq><6IN79?OQcf(7YAh1(z_x0l|DsRp &r2D|>9 zo0}CY=a!Zs(=(^q^dPB#ZVKEla@JMORL*tnZrTr@(HAFHHE!qG*=}5p7XhobPb*Tl zzS0WtJMh;Ff6WK+D)U@D05Sm$K}-ci*#*(DsNY5ZLa(R#mEjr5ZAko&r%h*6eKjvM z?bfJCdqKjM#W@mfXQ=&smA1$iveXT^)5Dwc#;=CpCj+Dp{qt^}oxLqBIj8meyFj{! zZ8%h%^_Yd0{p^3W)fbBw0r>~mQ!&rZ1(ye4*QJ~|jDZ2IcLc7IY;PwAOcCfEZ4k#G z$ktI8GXI7k+yim@*Zl8lZi?Q3jtaQT@fwNyf%sIP>9@NsH1^*$P`z}+X%1)W4SK6> z0gSdGAYW*0mGGiuQ*8Pr^X}}736v36-d&ea@TVitze+g+sD>Ceeg_cFk0VKgULTT& zuSEZ}O#AOf{%m%=u3QrqR+N=iT;gVUv*y4-= kji&}>#S(|yt#XN$ 4?cd-7Wljg&=NpV z)TRN|o-CktH;bc&@=gCU9UURi{v_@Lz+wXHzE-o()bw{n5|U-HmOZ^lfH)w~UFuR* z@ >#gjHZBH`1|zVnkRfR3iuM!Iif#3#o8sp$S$-?4JOAtUNExs97jjk``yCBb38NT5r+3qy zo1^vvTt*D196yo%=Wh=^`&9pjI^z4PW=>mZBrNG;nh>yLTi8?r_mv6~3E+(;9^PuQ z%;ep~-P8X)HuZ%J%KvKa%EO^ cU#VEo= zNQ@;UWXrydCHq<_YuScD_GDj^br`+((4$}1_5Sm|*Zapi|5&d1-uJoBIrll|KKJLG zuN)w$umD}gkOp+TP{0P8_c?VlH^*6kT5VJFc6Tc|4Xr$s7cn 3ew87tMvt^-BbRd%GqEv2)GvtDEiKz2^C-&oUflXRnc7~_{uk%r ze v+{Yn z;+y&);O{>ofhx~=0|WxL(filPw)Kw0qS1&`rNaKJj6w3aLh?wJDGeh`OXsU~DeNvV zW-UHh2BqYSo _6a G3E$1SocW@X;hOgLLf?OJ zUYce$FZ*XbYY((I0wu!n$jLsqq8s5A~KIw|3Z7X zHBIT%VCSS~Eh(pKo}omn2s~KQ;ol}{8%PU6X~AIi0Q<6g0mx4;`vfrTDid$nYVr}d zM6-KICSa2(c+B^>AMk*rFE$ll^s1cgs$1KZ2$k6Bk7nC&U?H5!uANI{&mQ0cg+!z6 zVkmjPFLi l=`nCcpWW3j %=Q1K`742Rs$>)wVnovz0Q>wP y!!huP5|ud$TuHhBD=TDk}0G_ig#cwb?bA{tMB*q?RyyJ#Dp=$0+U}0 z2ANs6F-3`iXCIt$P#j^Brs*VY@=GBF*f+$;YdtT{U2{?tIDBEVWAiiBnpT*A?ZOzc z@i#@3v9i$>KHY|~Y1aL+@VIL=wMETIj>6jz<&4-a!@TQe)b~ Fe)b)9Z!l9-yx`(Prl7 zcK$V4v7;NX`^7{X(SABM8c5w*WlDPT3VnUXfk=qM`&RmTM>=L4&kjGDPx$o=j2D-J zP=<9xLhNq &V?XgYi9!!J-*I-1AvPW 2#2#zEtLGOSf2Z%#^D_y;i!VHWbR6+a$*}DTlGxdB~nFYe#Yx6^F zr?^3o%-nN1ZO|S1ZOlpy`VDFIa_JVG>d+1>j`KrN^9S5DFIqUCb?S6KGaIeC&H7T8 zZGtgyU0GHu=RQIlC=CbbRY~tQRv19);wV1gT$Kl?s;k}O@QuJr)HQ9he9q|OyNwHe z5dz~cRu^Rqw&jq-8+?HyWlOkc%xOU-?d$znHgE}|8xaIDViMa3b7yV?$So{@$ev{k zHoDHtKY1B)2(xWtULp_X5DZ#nzA~1*6~D0k ~f-H(bljwjA6);y9 zJJsI?AGI5Ywcm5flYhiu;n6ZYO)PU&VKxQUn-uSS(zmGPl%T4gFD68f$3 zHpHTO)&-8#tCEw1@yCgRRfNO%XP4nfn!$({hf*h2z7A{q8ur^@F#(;(yW5MGHnull z<8Ns>!x((d{bB*cVbR`+^WP`1v#K-k!r*izGaQKWZ$JRsN}G;+6zIx9`ubUEF8caa z_9HHkhsR$1OQEHPlC^7$?gjeJrAPx^das>oF3zVM{Gy*ugGsLOUV^M!YB25FW|dCc z;%E~VG$AaC!F_4a0I8Frl$4Xw*M3gf_Pc`;Ry}a;DLj+E8ZCv@n 40U+i>(tx5>j-uKewxf6h`6}p>?K9VPTA#w%OHU?j`!9mx*45(o zPdK &{0fggXy%~Xe;8F-2P5*ez{ z1cRU_?>}^;Yhzlx1$EX2*g+Srs&S=hLHG@2|5`KiS3d83YO&^
2n4${(bl!@`eEK5&EP?)MN*H}I__y^Xhr zUsS*ItCF@>z`VXJrMt>S(Y~Vg?lo~49_r430kRCi%QSsw=R;PVe*igeK7W*9M;-ys z|3KYKAxON}&KCER;uCVksl(2VA~hejKN24%M 5^ta6&;bls`y>QMDWi}y@01}1MGJ>J9+=ekW0 zY@CcC-Lv(0J7mX2Sb;N$MWq>a@C?%b?Gacw`0x$({Dy?p`9*zND!j>uL&Hs;9}ag# z4!F48^fiW#JdW2q;pOdTJ@3=eek--{{A|_Np#`Cc0)3JcqcuppzXvShPKLD0dk|Uq z^;_1xvlSe#jzS#%g6=8wi`V>z< `nk=1{Ti8; zBHw+z>;UJ1og`a5V>a+4hL5Vak XEr6ML81EUX)#MDZY#u!QC1? zeXMt62CRU|a89WIncvgxn}cI_1Tu^mf??CZ){=)Af-^;q;o~jA_dC4&pLx|Bkm0%@ zCcd2uHhPkku{=#*?+K^S)wk8a_|BU#s8}Mt{@W3ER1N=AIIA4%pD2 zg&Bi?psoR*>%|ldD!G7GQllV$zuPY%c07C5kN3eXd%F^phrgfquQf>Csusap3o-_~ z+6dr{k$YflJ#u`tQtN$RhwL!j9GpzQc;%Tf=m7o3^wWf}LEFs_k3y5!!Juc}yf|pk z+ASY*ka*i}?eb3Uc7MK0`rw2TAJV2cd;F*68uZ)et}{JFg#}ViJmVjmluz~8z@@+@ zh{l=|)QVrn{>!9+=`My~?;pU(i~H)b^Pk$pL;hm+Wb`?U`V?55P4XuEEGepyEj!P7 zy%OL`Xt83?)fLuS~Wm^d6KZaStmn#yEWLGazNja-NGf_ zC~yJ+IyMh5nePrILl$$ubw$bm#Ni{uo?y+(t#8>Qi;p=dDur$ZQFcp_oa;&;`R0nY z5DQ>uE#!wMK(N3Fy`!>EBDcmSR-cE52ri2q; W?UCtdh27F7vQJ4~f+*g=@g(#PfPSPQFxsYrto~-N%N7qY`gU>d z7MB%%W(d~hLe2r7G*WFvFzU?)iB5?&I%Y-s>xB=ncgo{1U>%uH6G5>4tKJ@_-4_Pq zH-nwUZ!V>QB~vn;_9MX@Wv)h3_KK#9rP!5bUpDp}rfsK3OCnDDv-11H_3G%I!|Cc* zr)2T_B*adGEj#+Y_Hjg^zLgxk)TJF$4l-BHx1UBI2AcBG3{GFa<+Uf+BQ9(&|7w>t z `1(~zX*%GQ14;-#V+gDSA_oG5lIF7E)qOHX8_We7 zv?S~AN9;0 uPjK8Fy87oIufzEFzyiurjYLc0^XhuAD`RD8j>4CI zm(z9bE0)l2$@DjX^x!PS@e&|4lRvDaT@6`Wa1&ssJ?y6zcZQw)=a-MObHS&d{H`cd zCgGsp>QvZ{AXC^xX}mk>m~4j;H!xB1`XG6eXBeD>wvSiK{@?c%7u{^J$^j0n^dsc& zyDhXCY$2sH74Fa{@sGvd6bj^d5e3=VyC!Y-v+u4a?L;N?TY@VvclC<&K=P&_u$U3~ zmYQq7O2_Ey>$x3?Y#(%oz*4nn<7q)6!LI0zE-a9dd9?bb*ZR9&U;+yiM4r119Uj|@ zyWJ~hJ-lJqZF5+!G|DLZk7{!<8&qjIaK8&yax zNEhKn<)k5zK_rJt_U`VWMGIoYGM7)Wk1AVTr}P!v<|*v1L!(EWQ%(mc>@JQ5)R#1M zQ?r)-G*@J6FwoT`KG`QFM|~{f`q1ec@#Ev~pwfYs>82%3!JZluM4vG@P>N58A6BYU zw1AY_qolp+>i%3>REkonBXj3!&in+7r#zJuWajwgoGn+DzxX%P|6rGLD^l!+O~CA8 zYWb`ce3=jF{+$!Evck0F5ODGj0^d#gJ%dx_CYw>tZ3=v{RrfKz{To_ASQ|4jmBL*s zMXQ2g)*B&zu!-w39jrKg4!`+IYGafdQ#8cO7_7_s2lvbJzE##YyCpTP$X4e>jJ$37 zGE2GD4{B<;L7mZdqH+63PVbajDVJAgB;1`>yaeO#S^`JL+4L^fxi7rjNB;aG7Nc!V zGQ;&kBkqAvzZF!{lkci^k($JHc6U0hQ^(0Ygw6-{ckiV3cTLvXt+m>(74qU%Jyn zO~vYr|B$h|jI3~YGb;Iw&idOtP-ek(X)M*`3G`d &ES|g~?u57V=^Mh|TU%D&V?+)D`eMIok<9 CpQLZKr-@TUQYyLyWAT>)irq;R&U07|A zNx1^c#^hO?hD$WDS2O4j_833u@J|>B(4L=lOs!i^7 $1){D+c3GLZ01 zlJ`$XD3VVGi2E~5>@O fYjRZdRjpI>&F67*|kM*rlH zX8Uz9R|>(Cy0%hfb$`YkEM{g76}^Fb#{z|o|M^|<+yu#@=rPA$Mct)khey=sI9ePa zT~a~*Lvi17KjVB8p{pV_`%WbKk&U>Wxh%*Kx<0TEk|Wrh{gdtX`Pt|4nBdFZA<{tA z;<`Y3ac$~LJw`0|#-Bom-K-QU5{{iK%E5Fvn}?sIx=l#(;`*|A=f2`){lke}3BsWY zD|+u@3|9$GA#$4;ce!$O{*;^KW%>`2Xao9Mr_t}$6WonSisKtXuMGO d#yc3#6HbF4?Cq)nsNR=HygA=kO9H~WuRlAXV}BQz`)4B#PBaPmdyi~ zIgFwiL2%sYcMm429UXt=Ti%Csig~^o@=+f5V?@}xp*$qJhfAMSbUf|cJ?Qo&{&sbk z(`B#EPT$|IB21lCJ1Y)^$ZzSrn{&ylBWlz%JPg8>3P KbG<-oEEb%HJe*AJM zk<+0*eAb44qrus!EboNwMH05SvUP;9sKxMxovFqRH}3Lj-=!xW{g?JU`xPthff;*h z%k=ccc7sFAz$1nHbzuS5+gILUCLd8g*_03EiO9`S2)Ipb%v|HR?Adu$_UZP5)pab+ z4uO(@Y$eIb&3=-2Wp3S=-QwJ GmCT@DaWdbz-7epPb$CzbukdlZkIy220}GJJ zfgi}yb#qrISO@%OfW5)ZtI6Z2SvKVp-@zLjs4*+xeqy$lBsViCiY=CJ5#qaeT0@pI zf~er|0mh4a&l`iQ^}^tKwEJ;t2$XweTHU>>>$(4A3h0-L7ja0RBKK&!JV);R72|G0 zCdhDa)Z~Vunsw8~r?bh|L&_Z}Zmg~|K0W<7V3lzcdd$kmp_rBaY1tWIEU{W+dIB|( zRnL7wfzz-VtgfnYkMaq%sGiGLi<`-h2JJt Mv}cVoedKFXdJf2Jh2k zcTfhv(g5UOtemVjo{;Uw%D}?Zl5$khL{V2y_rcnA#4)auRS`Y_`#s~m&-a{AhhX0$ zX-v@jz)LMBCMmY+eB)aZZ1SN#ue~i~T;yO^%GzDC4Gs49{)&%*Q$zlfFgxM67RH{~ zKCB~~H3gg~$U82ZPvi@Wkk ^5ju%@NrX-z(umM$L ;dY5!%+ zUPJgl9Uu2Qg ZY9=HadZ5*D8bwLi_<6L3>)T6P98RSH&!+s^OQF%e^xDYrR7 zn+sBEh9pobroN6(V_n{J$v9PVR~DDGrV!0YUt&wNRWfxgtq>p+oGKq9Tjp=3qAjZD zEDQD8DH;tpw|q}MMz)iIU9%qDjh=v5GRT#EAJ6$Kr*;vk>!&-iRiZD~cVNKjX+(2b z@^^u$y=|Q%otX}31ee5wTjPn@IZp!1->!rOF|m}qIEh%*`3Smrk*M_5Yl;h2$zo~K zeG{!0yf0O@L@mWyoq108+HxpZ;<&qTHdE&lk-l^a+PEV<&8b$JK_$jOak!14zTgGd zvFo~ZNueTZ>9V9kCt8Dby)+>y<-XB5rSWY-2CI@l2W0HqrKFv21^EGR96Zw3#K< zUR(BpW+k2_fu%3Q%3E`JKqz=>pOUwhhV1?)? m*G zbIHOxo{I;)zd35zrn5F$sNO)&9TPMKhrJPX`9nR%3Duo7!(L2iR%QfesJl~_=z^tr zT3dqhQ^X0&_z7J%YGckqq7MNfYq^xRKZ!BK#j4|`R?QWHpkzizy;h n5Tq4_Ypye^0HANBCME&uB|SCmV7|igkADjA#=yCDl9CUMpw1XmrG1AGtxm zI4kF89yaj02{V-p?nK{c@kcbPq{7T4lMa09NV_4UEuc@pdP_)FIVD_`tnC!k9Wfv{ zE>EPj5x>h?e#jKh88{+2 G4@DnH-H2p6MT1 zErk~cDX+@GQ*+Dfx;fKG#q|$Mt^(UUoeb`LgucO%?U`TYk*|1bPz~_h^=c?lG X~R(-w_s@ zS`eka&mKxMs#tC+rb}|)tNXM=bVN2l-9)SU#kB5y@2k{jMB_;gMeVm8IkPO0Q%>6S zN+T~iy3vU>z9 Skp8)rD-5O;WkECPAkfzLadR6Fk*y~fID+B?_ zFs>V&=31g&2u(}%bj{@2aKtT3>-4td+6aV+Wk9-S3Nn*1>QXiW8`Xi=HbsSUlty)& z`+C^Jk~u>$ZGcm9Ung3}OB1G|VW~=qg)hHP3rROTBq`gurejM$BwB`L*k>qbATlir zGQMXhXVJYu6j=5hai#ha6EYXFd~y(PEtxk41h)0c>lXaVb$UIR1z%bx>nNR*kj_Tz zY4E#@^JCc<7kVezWyUE-Ede9>+jqeqLTF*ZHDop
pMQ#TOy!Q}TxD#nz)Y 3Zlnm!SnNhkt79@?DEY?9g<>H@zaf4^<*7O?ZUn*-w^o$k| zuY{glCf+|jO@I1On)`L7(JD^r;%JqeidMB(HV609Ddob~9(U6Q{k%GRw ipGsS?c+GcLG@yw5ot^d1cS3Xl!|%p%|MfRBU-w zxl>)7%eP+4G@t#+5MNCdwWiN*5oKlbojO@Au;?VySN3Uc; Jkkmx6ZDP2LF6()}_!& z=`J-nt|L8)u&haMI-&MrNn~W*=Zh+NJdPE8rON$>q(s>K?LqWm8!CIjMWYtvi5{2d z@2WVNGK$-5)b;_Ugi*z&YxL)8)Poo;A5Wd^MgO2tr<17O^q?w1s(l%%6p}MoVXXmM z=|8_MJmiV07dmFKQ;sDY?k*Dey@DIV%^t1G!>fFAGtC-5mXCJ%Vt%&FU3g;zp~-^y zD7!&*N~>vu_a08=l)x=MF|Kt)W0Skly`Q2z^UWb0^TvS1Bh&R=;i YIL9YA(uPDB)7p3Y-E!*P4A<&9M-=d4E=ZcD{}a3BzMCO zC#RaaqV8B-ZDL>gMekcAV`lhfMFM&Lw h_`lK zOh80u_$2NecZ#I4nU9A{K3|50hh+|ixWjj(gGLqI%MZ;d4Vl|e0d$7Z=mektFAZJ) zo4&HfpVXtJK7$5UsqUnJL+7sEX99g)9il;>C=g7B+e{{I{OV+-S;hdNd0PlxJTX3@ zK^y;)hLv?r0{=nNFxz eDI+79QQJ&He zdMaWT3WWsFnpPWs3Y%`LXJr1| YTnB)WqG=*{H}yi2T44vCLaPo zZs4^J+~-*Ss;YZ;t*YyG`~b|`+q$*&5ufshpD`R@cF;uv0ttwG6r?PrE_ivu4!rp2 za?_ZX&lb3yUINsh@eLyM5N=n11%LapfeEH**NVO97*L=hz;}An1qvD2nSq8_<$V3{ zqJ$ta>~Lbp?E1oLSHYcz=L2^yPcMNM^8xbPWDBYSxMCRV5%<{n{(44O+pK%!Bq_E0 z+_lLnmV;Y3zMJ4hPP764$8Vwlj0B(m-CHdF@1OlN^OMPtS(^C;i)Aj2t}FkbE)y>q Gd;S-CWg8#> literal 0 HcmV?d00001 diff --git a/images/boidsVis.png b/images/boidsVis.png new file mode 100644 index 0000000000000000000000000000000000000000..d0260c6646f6154a528614f7ac12064952c08dd1 GIT binary patch literal 32594 zcmeFYXHe5?^ev19P*AZzumSc$SDMm-C@KO1A~irLQX~+hON|XV63UU@d+$B;Ac#l} zO^^~IAcW8&Bq5Oc{?K#(bI$wu&Yk<=GQ(s-0@=@gc3Erf%?G{54-WI3=HcMrIIQ{b z-V+Xvec~J(d&md4fS=$33b%lVJswXUsB@GJoFxEH_B-6sxx>Lx8Oh7A<^-M}eDToK zgM;Hp$L{x@F4ux*92`M-&3kvAzO-D!`lOhDOT`DWOmu$@^!a(W%giSRURmv1A6Ome zSdY+={eI=)&u6yJ4#|JIG-YM`_LJ2i5Z6bKfjd7hxj&6N`cVDhf%6BCKDy>JfHkDD z(FN`E>8X#%~tOPKK$pW@tG*s&RR&v y`zU~H z+Y3Bo*c>z2efm^Ks>4i=%#6#gDc{ 8VW; z7WQHvf-v}jRG0{Y;l=_Ss>j T9)lfAt=_;gq5jK3?os%SIcy#VtN>`* P9_r(>;lu?6q zheR- ;v%{FWhcCy-7ctS5TZ@7toA$XX}eudz@OObnGpIr(< z06|D8ENXk=EMj<8s{Y4bNNYd?y qFCKm)4%H|V1G7pJRf0G#(gj%23W$VhAur!1l;PwcqO9n zvuRmC>3#l&a?yU+*(l3+d7%~H+AGS+${3cnoeqvPe1q=PrmHHc)HO8RMt6-_v a<6szc4yobVG4KucstUtK2%{?_YCBsYXd#t$4|PTvYaE z7D&BCihWApOtRtXHqQy3A1qSKa#8U#{>Erq7Un+2hs~t&O&aQyo1$$E^0d2w-vOOc zG3pv56;G?O86@UFEL%J@^)9<1m;Ew>S{V54bkX{An)1^$a#JquIWDS*Nlpnm(?bWc z-nyWuE$dNT<3xe_iWs$3D?wDZs4rKn?r!d*k6(ZvmWD>-#a=41LPUZR(6!~c4 k5BcPezh7G2Qr=rocnNf z`UZKDBJ6ocNLOHhibLRp?s}?vISavtb2RI$KJ87uVf()LZ%`{<4mMUlPK3q}WY6U9 z4YqvC6^cZ-u+DBjs%p<|WD~qqwg~y@-o(NRt&A^f1bJ+Jpl6xvq9(XF;Bao=^6gN= zBrmw^{d>f_cyQp^a9(|5ah1qM={#umjEA4I(d-8E_W11)*f*HbwPCs*wbZ6OckpL- zG 2@R8$DJwV) zB&Y!=$H8&5wTc^LD9ttb)O3T3SG=f%Ak|GnR*7~K?vM#R)!;JG2|m^B3<=Y!XJ2LH z3bS%-uN{3^WKyV}H)VL6ToVbW(rHI$#ccK&PBMam-zEuEk!OZ2uv~MIA60!?FBCjV z6OBuoY2td4|Mq*M*UEH|lm5d<{Xr 5Jq>E$P}nw;{f2uvhakN1`9 z$0rLWr3Y!^!~CjcP3wvZU%rX}c>wjnBnI*E$Vj!2qx@aOj7nahcE%SmufaH43i(vd z-E`vdTONzr)N0G}p7+A(>!92zfeSURl|A0)RZv?(js^vfjSHA05SOC9)|)p^6it@5 z{lZn>If{pEU025Y@l8s#5Y-s4tp)D_a>LBa`EW?AR4V?q$6`Hc{ViV24$8nAoirgQ z@pNSrHWvgxdObk0L)4c8RqiPYa3YiQWrk@xuygzL+Jlkc^DG}KBdfV0! zfid2X^rCE>Z!@+RILGrgap|m+ynOJLU_peo7q=ES2NRl(R}*-~32sqkHc9yL5ndII z7d=`oF|9U_uYSG#$2Xk=>7w5!#}V=@4@vK`fCMqdbm)+WVDe>c6kQUsd;t#;=JL0M zj`6Psh#@1QRl7uGM0 8HEgQL6w3Cg0wm%O~57^Wkzg+nJw0Q8-*9KG(!yx81kIU3D zmx0O9lLf6 *)tW @~%7xhYCATZ