From 5021afa0edff06cddd51ddc6701f6a7f9a545edc Mon Sep 17 00:00:00 2001 From: ParkerTenBroeck <51721964+ParkerTenBroeck@users.noreply.github.com> Date: Sat, 26 Apr 2025 22:40:25 -0400 Subject: [PATCH] worked on report, fixed distance value being reported incorrectly, cleaned network/pid code up --- doc/doc.pdf | Bin 97363 -> 101225 bytes doc/doc.tex | 28 +++- doc/doc.toc | 25 +-- doc/references.bib | 9 + jdbg/src/Gui.java | 13 +- jdbg/src/PidPanel.java | 4 +- robot/distance.cpp | 2 + robot/pid.cpp | 21 +-- robot/robot.ino | 13 +- robot/webserver.cpp | 368 +++++++++++++---------------------------- 10 files changed, 193 insertions(+), 290 deletions(-) diff --git a/doc/doc.pdf b/doc/doc.pdf index 86b136723cd0c22d17aa5083ea995224a3e78a11..6511a1d855586f3253560c628ebf5060be6a471e 100644 GIT binary patch delta 50956 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

eLFb7Wr@Tx$ffFj%CJ^(_JtWR64% zC9n0~{1xLoGyZ_<;;Y3{r_f2I=8a*r+h_U8K0Z9(kY85rBv<6v`DVrZ(Cyu5T7MiWFW8ebtYrx8mISTgLPx0z z-I!ic@nn`^maIH8CN%MZNTM%raa;l}sJLWvnku^pa_(b257_5lhjqhgwV_(3DjxR( z;wz#v8bLIwvjx%8U$R|4NCn}XmBkNCK;JWu{#5bpH6&5-*nw^z{LZDDF0K!+8w zccYjv+jxUBbw(?$j1%+^b$W{wMJ}^J7*AXp{F}}g2Sv0&4fB*dy{_o8*OtsqK8Lrm z@lX|AGfKDfv{_0m3%oTum9+IA^%}i|37@4)>lqF$?c&q+Dj`SOb+nb8b;mKGwwalm zly%+FU$2yj-07KJ{rdo{nT~Q9zy)Ssw?n!V8SR!7nO!^V`w;oi!(+BMW?B`QqkGy1 zU6UrAJcIfJ_Nb0i4dedZA92dTf79-+;o~+3 z@j;>?=AM`lg+{$%v966sjhtCjTL^PUF(+vcOZ~wj2Y#NIatK9%?-5@=MvJZ$jsfYM zA7#v+sA)0QZOtvnN5_Nyi%3>=nZROkl0Wexop3&LcfKq|%q})`G!{{ih#k7Y+|{5Acd!Z>q0w_z&Z;sk2g%YtkI=_l%n0g{Bw?t?Pxcv zw8PbRTY!%qZO%Z}aT zOC%V!{Y_@@W7sq+vp=1cSw%FUAU!t9SLtYCv!_AnjeP z+yfdQ*0&2pI?t}t4N%JODlHV$B=>$3l_DU6tlfHDY3?1iiNAeLE7YwWM@PrSd_s~@ zXTb{%wLg{`@;cgdMbyF) zzcA9iY;V`tt)#g1u5m4qNL)TOa|@TaMXa*d=Sv78v>iQA4q21#O9SzVmJGWkT6@ZyFO3)dbe<%MDwT6+ z5EM5~+i38?$@Mk5@cbTM>J{6fMVY3PlCng|Z4r}?1X%lT=Q06i36Y#*WD@Rw0{*Pq zxBNv)>(4@Fq{1#VWB+J!pRHPL?JUpCgbJ1yaVGgfW-}6C-qCT&f1o;Xi6unpz27-I z-NvchZul_2I`_#f^Fx=9Cwb$>9o(4zE^?o~Yio7V>N~S_#7LIZma_IUdS2zC+$yPJ zYEIuQ1VnFidS+fIVGa%K#La)DneHks(OAW=oz+ZkT&+p5p7J>@HyV}?A^L#Ygqy9P zGKl^qr)P|LUmRQ({@XCQ5`tXa%fo(KX*k|gm?xE@Kzzs=w|$7)tkK~Zt$F3gw|vrz zC-y|7R!&D{Mf%2vzG`-=$ro7z$Ku=n1fXyT1jPO$^^xQ)6*y!iE(fI#{w|mS!9@k4 ztd2bvB|RVRmR?nDxZLWsz7q*Yg4!0|Ca9Y2lziI*(Q&2$s)!UY)D^)Vh3V$Lf*J3! zyP;`08y{33|HtT$8sRGSan&Szf7!WBYEIeD4YR~8`7m^B((Z8f z0m!*rxmuDJPdA{{dvUEB))f2r3vXPqOs~ru&Q1%?3(bmcrdwj7PJKiJpAr3mSfS3h zuX2kP;vDm6z;d!M{0{Z(`zS6g+kZ?0^FC=3k$?Jgh3F@XvQ=orF}GX9 zrd<1qxY=M!8deCq(*+%* z0%V#~TN8;Mi3Z2AkE(|VR#SbBsaGC))QV9szn;tTIeR$28L*T|79^12+N-3~ZRCQ( z9{pQmRhepyPuCPun_s1YRz)IsV4impbT6LE{ghGZBllN#Gt2d>sfKu}FZT|6mMyn#tGbkQ@~QS<)8)#`Q>jd?9Kcc<=15U?uKv87 zp$p}J__o|uDNV;eE7%fJe>|~^p6Pd=w#)Ewi9Mc?S7)!HI9qnhc+ro(E~Blj`yELN zC=rsbfft((zSUNenyHLKK(<4buXW(>7|=(A(P7z%yCjMCP8q``B+84iKrsliLn9WU zz0dIO34*#yr9JYjf#tW;y}D{@yw4J6GhINo+Yf_ngKVDW*mlP%@Z@S}gn2w6MFOlX z`fznK4mBg?{VXyO0|XRX%YR&#p!4V)t^2jUK#ihpT;nPh-O=tSK%~e=Mjc-em=3+U zd~7N&pMPcxe$`+C1B@_pCe8s$th3|=DIXF+9CeQ$KEoz|gu_T*lG9e!OLV1#5EAk> zxP?gv{OTpP@}ysBMttUF1*$t|yBl^@wj~+vyD+QRGpED^aM8SX*!c9>_Gbzm;Ub2v z#4>!KQB-OBCq*<6wzoNOu=s$HeJQHK{pVV1XeS*>R@!R+RV9NVWInQ5`jEf1OQjdY z0`KG@OQOK<%eMQ9cS!BvYT#UxDlL(jqcIHCAye>6X$r&Po7=c4vVC-|lE^d1CsV}U zJF@0a?;HFFNN3GV%4>Ug6T)mU>QYk=x@nD>m1t5Gpg0%JZ%pL{tBM{^41;*)G$cBK zM)$rd@!MMl9p4J#o73A@$yBqd^EExOgzu-XtOr zD^uEEzc7?9u|9(C`Q2h&aA!YttUT57u9H_08Pk&Xkh@d$?Sm(JnU?F%ImhcwNbmfS zpdebNqoVhxm7wNs%v|ek3$MXN1-$j7mvSe?_nI{}p6mSF8PCjv%9JFkDIFFo)Cn4w zY~xD~Adtv>k zr2mY(Ns4AMcMjj-a5nBp&(iOixK{l>RWn@;pdW$vGJ1qEY7rU;Wz4NJsS0^7an!rG zoY?Oh#P(2c-aNuamECwywdU}`w*st*dSLwr{6pPwBN9B?Q=!a?g9)N?-GBy%u)6>Rs;Vz6dfX_a!) zq0FXBuxp;}hQ{1NWRbL$eh%PIO{soYSx89uj~)QmY%Y&!q0t-oJ`(urzS~uuJ$#q~ zB7>#-L5ul9=p5iL;ToAfm8b#v+rF@d9%~_oafFs?RfNiu1@GO49)b$VIhdV^PdrB8 zgI8)wkyIa;^4>?h(Wc`BDhBjD=T;&YjFMZ(}G~XXT4GnjRhx%uI$4!r81hk*R%__M8lB@+2xO@iF=vNs$}r)lJP8 zY04MIH*3~xL&SW6fNHo1WjgPm-OqQg$JQH_A-MOr zLEt%pj>s#`f4Y^`z095r=?C2a%NkT6BuqOWcRvjW#mp7}FABY5>BNAN zcN?d8c^@10MG;QX$C^aL)e|dUdFV~4_5OMfjQhW|@A31?LIPGc-oy%Ro3mca|2qqmw^2h(8C zU(a&Kx`kUid+K)LXp@hE{B-hNuPd|gUgwR)HK86{gh`-(86(q#7ef1@%u@`rv+8nM zVSHS4-daOxo7yd1Pc0hSQ{Se8mDXG?OzuarFF*7)6)I^fYPcByM|w656xhWmG|_&o z?W)6+c!J0ulKGDaoX1>fl`I%~htvj|J9FkUB!x6hWg~0^C6$UQ-80Pk5baGSk^551 zzxal{g>6F&O8KuXM_0y0{_KFEO=DzX44TC*8_ax#vQo1+95WL_9RI;jW1II-67*9L z{sDJ4_dg}V=`$OE^g_l3M_HJvHMtoc%rUdqWOeJ0sWNt+d)h+U;9V`o#aNq*?@+H9 zZbAFl{^kRZr{6?(?o8a}cKKe9G&Xk`R|*6SmVvc+oz*{?6%>wW*O_0*1qJ-y_$JXS zF3Z!-Vr`Me)q`o5LbA~Bu3Q?FS_F$ zZBo#}85C}|axppQZmNisLAHz_8FBmac+6f20`SX-ml2f+xl4E7ZMnUOO;1-PWKD9` z$C_f727yrt5}O z4p!1dS!3q{{sozS2NDBLhw5CGjNI7W6;a1d%U(GM%(VC?eA(VbiHo-crY7MIfG%p^ zz6lWkCry>|r8c}0>YW9JF|1Gn(k`CHk~g9DwokL z)pJ{s=KSNJ{0@TkH@pb#-2@@{o@0NbT_tlNhIvKiWMNOrY^doUR$0!a`5ib6VoVQa z8+FD}zCn&okDHN?wtc8y9N|=%I56(Q@Yh_xoelq_Z{4gO{bPxCF9%t?A=FJUb5-2T zb@J@fk6P3^5q$L{Yu(}kv4^S0YrENtfO2qq5UKOsd^<3cPQWW4gGI1uW;+HLwT=x- z4^&n;cg}j%>71d08nRgPzTz(w@Yq!V=1NmRyQMjH#~8K8hlKK|Q^sUwTZ3oA%uOjTZ9o!z2HuuHiEhQhOyWs5xQ%8j`>q40^ zi1|m1N=V_`#$5OFVhH`wpV_LcqBsm(b$hDL{=niBq@H?#dsRs1L%i9Bn-q zkqeNYyCG;lt!{5VPbNffQsxS*RWM{5w|^|_Tz)|Ehx6W?;L;&IVmj{{yn+KOadv`B zRnS)yv(rzfW;jTXcT3ACEiaIi%Fqbx-eTb7j1cb?S6 z!#G%t^^Orrxklmp%>9CD(O--hdNR z%EO=N*Zov`GbE_b-oqo0GyPyrFN!Yb@F~gH+1IF6O~UOWMV+j%5UdCVy;_@o3C==;wy! z7fKb|m*Q0Xp?xqqRuPZ?wmf&NxN~YMD)o&Ek;d}(nS&<<&Kzfcl#tkA$oBWhw$y$` z>l;Uy%OLpE(S9IGd|>7`$u6ASC241u9@UXem0NMkJ*&lYhf31d5HCKJFVZNWQ@i z`Z?~lB|D5ELY#7GVLisT2m_*Am)!p(t}!(y|9!!iWPlz9o-@P$HXyiX{p9%jpvG;! z;caZf4KN2m%rMX+opDURv+8vOWRhE9$p?92yj*hFm>e=;pt+QO z01U_k?~ovewMNamyl;2E!!E(2&R((z0EfUQI}jQIg@4>IULP1eovVFE7_&uvF@-F1 zic5x&NOn204az;5N2C07v__{2xPoLQsqkKv#M2AZ38_30UZFSFQV14;CdnK)EwaA` zq0fY_=`^QNAtdmclh>=O@XlM|N;sN+t~g-9l+bRNPfD@H)ANx02z@RjEG|bw`0ne# zTD^>(27gryM`bM$9Vh5!A}oN|$xQF=NsMj2A7QovrQYLz>r~TWq7i0NYea~4S^Yt& zJ43<&ZJr&b8w#IWuVZJb!Kg2uJdx|tJs*SPhzybNWgGpdOR<+Gy;iA2L&_lXUf2zG zm7d-FZuKo`5c(UVxJQ@C;Y#Mj*E8t2h?} zu*H8U%isg|No(*El&N%fL-c$L4>-0(W`Bd$t$x>+X){V;!jpMwlS7exSNT=AMD+px zQ@TiT&>B7BjObfOBnpfpFG1FdbOwym#K_d^UY6O!nu^3xGyXl))2L0D;V(-+2Hba|FfNLrq&popCTv?ABS zcOALV`jycWLzKomx4ueWOBC%5GF=NIo9hcn%klgq?)4*@TakAf=-7K$sc28%?elcV zv&MK#`#ylL1xGE|sxz!I}so7_a%O@HrvdTx$X zL&sM)6*G2MCOK#>_YbMP2Hm~cX=U}JkjF#y_=h?fsaqiIotu)^15tW7WxpRFNY(pZ z_?qEbHASxM+aGagX>D?7Kv|zxG-96MCOjS#s$XCJdHY^%~9Ep zf~tyF@UKe^-3#mZ7xrn&--4WnDUVbjNkF?XHK)0}Min!}9KY@#tuN?hDQ-PoIE>nz zmLF^(1YJv+Y;trs2u7S^)X6JmKjK8d?w0K4uvjD}Q&V2-DGL2ca({8Ipcnn@2|htA zaZRg;1P$CrwYe{I!V1nB8rO|vKru2>Ty=b(r}udYIv(x4AmX=1p1%}KH6$r4(Sp}X zwY#BZ@Frk5xr1Q}i;s_n)8e^z#uClAIK{Io;1QWOWkKeaiQc$qM_BjXEo?%C4V>|6 zBe+UV+#H4G%ik{Y;eRv#ytDT{5D^KxI1KtT@k1INlIixub!2Rby#uuvlL#$Z2a+ul zYvyi6tjC&euU$^wQ}fH(*a1q+jTxJc+1PtxJo?sOH1X`}Jv3XuygQk8Ys~V`1yy8F z_)%I2R!l-k^W6ZRbc#*Lwjj1erqXv!lL^f{P0yg!XtbgWo1W$K@*_qwHz+YQT zf?8I*GDZ0bLoFS2l$Z%0J=sSs!n-A+~a z=`c5wh`!1U<8V_f~hTE~jqF5)z?ChQ+kQ*FMNC57FgbKEK<@3w zg?J9*?h*Zzb!r?sBi!cse5=V}+uAPa?J|}H?RW7ZtuS65C34%UN&0XB5?3BfSU;`m zXO@EebZ)rqFRo7bqGb{+a=w4hSY$fX9~n08Q5|@6!b?PnBezBL55>y;MNsh6dv&GE!L9o*|M09m9 zy==CFY;;^NUDYOP71Huj0Mmx&`Hfh!w$!pUO`uss<)Xy)OxjVpr_Pt{8b`CAdJqa8 zx@1Zn9Dgp)V*aZBz)O1y!U8~qbjL86ZzStedo_LttK6HPka$S;8)SWavqY=)U9yoX zTPf>iZQWG}Hzl-wz2S(SLp}SFVaR%2N?Q6pzkK{;YWv_JtkTalDL=rJ48Q1e)rIc6rG;}k zp}Ko4+)T*8KvRIU4$okTW`|A`x#lf&bo<6>{>soWxgn}L6niV?#Y9I)%L}oTSzcfQ z&419(SK4s(6pqbSoTu5GHZU_J0DA8+r>(bj`-)!Zc~72wzA-9XdN9}-=Ck5{$*((M z$8iT{8)sBBi7oCclZ)I4u7F-xKl(q6;E&?=?l{$Z|r|UIO?>#>A(~o zkz=21vlMH&Gr(?BTE65hx6W;=i&0K=FnS)XCmP0=m!`w;9vQscyJc}qVJ!OiojU`G z+Rf;mY{k#m+ttFRIc``ZO}(wL`VKMmr#K{PP|`~43A%^dBO9HvnCoH9VU%mJY=45_ zbkaWUZT;x8WamULo^rS;6gmRG_eC3mh|H{zBJLY8JhFb};wPu;xpTQtI{Y>&)gwSe zvuhC9s3L5dIa#=7Y7<2~;}7zxlS-DIphWvw5tk_cxM_q4Qa{w;0W;E*?;^;2`69fF zzDSG1J?5y~4jE>={IxnkcfWG3kbm7AlO{fQA{UD(ds4JWsf_-rsaIMh9@v)tB0v)m z_$8hHE+ud&IKn2qe(N!j6J9BYgiB_WO4`AGj5n+bpZkc#lOG^f<|7YPp6@`FZi}ZH zw=f~Edp)m|r#RmokIrzbDd&&xy1K+9i1NwFO_9Eqoa#Lc?5YB`Th4&r!hb>`))*ta zf0c~H(YNBM94(2W8~ww5it`6&GH%0WFi>036`{}RS$1Cj2JE7SZe96lwUBY5Gzs$r zHg0pkz7CD=L*UdWil?|SP_BQ7Aznj!F(yqt;?LBq0)e1&JL2nagM>uQpN%jJPv<7% zNaC$b5QLc->WNq&c(u>5<$n#?VyJrqDwK>HTfY$(8$vc%+XuC3uLToe4Lz+!z0;Mx zPsm#_145S;BV@pIQ|Be(I{~c&s45VLV+J!h+BPWh2+4G4%i`z|wXEeZAzR>Mm%Bfp z6m%<|R{*tz;{*@s=^AW5iVRW4Gu>sjz&qXqt>QPn3y08DvCooxTYpfct#QPn8ZxE? z=a2dQ)^{bfwZ3xe<^|0>W$93tKn-&pmny3c`3w4qIgJ>XZk+)w>A`uhQ}hw})W||n znM4w*&0eT$#cic6 zJ-Tehqtfbg#~@5c_lVWb(eZgK(|Ml$r8ugNMyG-X?Z>pc7M4Aos9&Vn0Z{6FbJj)$ zG)!Ydf#R`HzbF(+)p+eSkVl$j9f8$9r2{5AKd}jsJNVwrD}Qy=$K+`~ZX>O~MS0f> zV8K=V3B#w6y;3yQ;yLzM-=+z2K5d{}`O%W3jsIR1-PRp)Q;TQ(wC&7aSc{RSYqc?lOc;+!!v#X^_O}^D zia;yFEMvNg_kZoFfj=Wqqk(xJ$K5~9?1lzc4h+6CbN_b1oZjUUf#PCHydMsPq!PJ& z?l`Rs$-DscROKf&a8;1!2~t5TLwuBIDh@AFoeTZc%@kH1Fbz-xGT}q>`@4Rkj6xLdpQa}JnU!C3HwveX#_%F0V9>5k8=_cy7F7x}>$l}& zEZs3!h<`3X2h9E%`Uoo&T+etjjJW-0%dGb{)8rxFI7&{v`k3b=ifr;Y@jHR4h)_## zOWfNw>UJ+m-pBHfzeG6t>BjX>YnP9H918|nDqxu3ET(_+Nd#9cL9O$^>G;5gwF7@0 z_=a!2wF&Q<@~XeyEA;P8sv@8dk2^2=_BTsh=rrz;l+D6cXmE*XxAFR&^8RhD5(ETZrVP=+-vMQy=S$c7@YiRiXXNIalA>Y{FoL*R#A(&}r*@Zt!w})q_2KX{Ric zX8R~c&H=1^^R46kZgc~*Tq8T7Ad#kI(#-s5`U3s*ZlJxWeTL=)etd4){ZcraN+C`q-+;} zvS@<~3%m44Hy;LcSFuE3t&|D%^FPGw0P|uhDP+{{RYT0SF3ZZe(+Ga%Ev{3T19& zZ(?c+F*YzDFd%PYY6?6&3NK7$ZfA68F(5KEI4}w?Ol59obZ9alF*!IfF_S>)6$CLd zI5n5CY5^ycfawH(6k6CW3@9Mo4Kj3hcXxL;Lo;-Pba!`ylyrB8grp!PT@n(K5_df3 zd`Hjs|7+d5SPSNP>v?PMJy4J+t1*a}JD36`9YC%OER4*&05Jts7FGZ=GaDl_Gb=m= zg}Sw?9q=D9JcTCE*~Quc#QTSVm^0AC6)Y1saRu8cIDi0uvTk+&7B&D2Coc;ZFEcZM zm6@66e+(U*c>&@k?$+i21xA3Z0|@8>Pa)>u=;dr}Y2^y0`JayfYBL%D3l9$${a@|? z5qqGswV4SBpkU%^1+)h+o8 zgDe3S)^kDd0T$pQfPU5%K=2=U9~TpMAi&kx4e00dr{cc|o`nTqZf)iYFa=s# zgW!Kh2aACge`E0Qovl3qdd%S6V*xP#`uX>h0eHR49YA(ozs>)eFO!C@vW&Pc-QN}e zs}mJ<@C5iUu(1OeSUFe#Jlxy>E)HgZ-+!ZjD4SUSlLhl{R~e9n1Ayo6WWinfpM>52 znLqVEXM+at-&l$c;H3ousDJOcJ~Ici8Tc2=|MRB*2$-*)_eCnV`+XZM$y z`Y-+eM{QznZRhom0eENKT*3RV-~c`ap#N>E1^oNWDge!`-R%FjR>su?d=5lFmUjPt zw$a)}(%KVfu59gUX7%^7{4Lk`b;#_jK|o~(7wccQ3V?xynfZU|z$eSh7JPHKfH(3l z6%c%I{!1wVGIKEhb;4LVH~}Wk&L&>)%-}_0<=_DLuz-)EIneX39R@Hlf*f4IE&yUY`iTo1%jW_{JqQ4P;7l29ZH{u2`iT_4C049ll5f?LnN%A*h0WeAZ zMyvoP>EDPAz$EhI7PO8+8mFrV^o1ZGhEjlc|QzY#ltN&Pnh z^J)A>U_Q;?2+XJT8-c6U{ul9pbteBJHn7gb-VuBVe%)jLb_C31;`-YKY-IX>8-ZJ5 z>TF_W3k1J07Jpc={VV_bp!}-<*K77K;s6ITbFc$1$^S^$*?&pw?SE(WYkQc?|A1gh z;O_|FT7myzU;|Tw7sJlP{tq8;CoO(Ma0H7#Ap0+9{Tu%>{tY?UenI!&lq|mlcE9z% z%pKgE|6l_fSpEUQ@vVLr2p*Mxm6xLx5cG!ySoQ}$Gq@(3KOlHWwtqly&+Pty;D-KD zDGRt+e?5$?ur2t({zDDU-SM{??CS`AG(rCvB|FPM(*F*U9h@Y1RjeKU7|pNF zIQ?FnU&syU^4BHs@BCSR2_0O4=B9T4p#fjx|0@2=#K!ZF=D%W=Uvv9^qw6f-Cc6Bd z$}a?T|D($sU~?Dn)AMfu;I_KhnYdW}5dvJ(Zvyb8&g5$44E$r+zzuTsaQMRk9K-Do z2p*059}t|l#~*72_V)Y(g2Q|L0l|&&{+%2+k~h%#Z>s-XjAm}m;90o-^>l%6&HurF zeGdTwJ%MKM%Zm% z&@}fmE-8#F1JN5=^m9*?h3lJn^!(`;V%bDGc)ycawo)J6P1d;k&)(}F)LC8n@W}CW zafx1CqfgFK`iLH;$>J>el$UNePo{sy?w;DRPhqh;r1suZRK0UPx-_JunC7L%!)1Df zDH9#D(IK5=Uq+ID1jC+tz9zfjDRaryZt6m>lw|#)WXILWp^Ct>*Z+{;=zR!Fjn$w{ z8?I`FmD)%Q8srEkg3NEEM2;xlvmAYl#rdi~YPLSUj@jJCgKR88)ZQJiZJE>H5qPw& zPV#Zhb4+I8Le_gO!u@E6)(-Rhhgr76NbmlXi@80XA!I6lMRRkIz+qiSYQ8uE9YHj9 zV=j@~4Np4(G=3~uYED)`J6p3d!l;o!!`?9hO?K^J=dcI-UBvLW9n4CN$`_H^>H_W@ zv=TUJ*!Z~nR;ci;DK~7XnJr%Nujt`hvJr95)L}(eTGazrQ$1JT4T>3<`57xM)kIMc z741?mbn}#d66C+n7shcA81gg?Vm|Yh$#u{|`<_X{2Zg-&3`PQ0!UHN7CFnQs@_ssX zLE#8?+b|oZdmg7Xs0=?-X%8Nq`X7Zxc3I;ge&oaR(*3A>?b`Nwrw9sL@TLCCn&ZJ+ zmOwSlI!M3xQQr4`Un@-+D#$7z=H2w^)dCGao7yZcQmA=v6_o5C#3GLTTPND+>s|_i&>emcDwYD5z$-&V zarfeum^{=RMya7DHBgtQ?)S5jBy8{b?4OLeYSGCGKZt3am*`QmN8kY-l-9FFH)wl?t0jKI zh%_Px1)iY2zQ^KnTw^(=oVTgwYuvV7Vo;7UcXgCwBm_~VF>Gd6G;m|2&brFHh;#2L{ggDiI*bF!kBC&fPtFZiGmemqN>2Q@1GgN(uD;f8p z#bY|zpGK(tRjJsUje;~yQ%o+yZQJa;ifdWE4`xX4ihU`xS4hjTQiOf)OE#B%vy&DE z-$rPZyqHbZY!n?Le=N6K@ZU=2oU_W}gw}&&UEXM($xnDoth?#1@gr;7u1nc}mx4xf zv<=z*ykn^v0d4=&I%7l2&F%lU!SWyjeMvsKD8X6;kaBrC0-}m#aJq47YdiS(#-PW5UXSdKg z9bpAfRIA%3En^BHd=wRKq8}boY?ed;&wO17=A|%gYj)!fa8vm0tWSu^8e3P_Zhf5F z8Dfjk6!^nB>ep1NKVn9I@onZH@*Nggh!iS8e)7-pbP(ssyh_i_Oq0g9!odgg`SWpm zSP)nr+1uips$}7jLqrjyC&$REbWA?iNn^o@B>G!2W6P+d;9c>5<%3E8>F&#a$_cw5 zwY)3r8tbGT79+UzG2T%Ir<$UU`mOd4_tf!yEuH)&}G z$^EEwSr41_c8NcXII*s%((sOF*w&0~Y1I*1sB0<=@&-{jIaI$e==D=eRG)~*lCZh( zLIY_29CpMp7^A{}69GaTs{Z!B%>bPJr{TDcO$e-dKjWi54G zzF796B#_J`@!-F4BL0qiTGuJbs4$Q0gIlr1mnFgsdN56@5po~G&{6zEC!0R9Q;RXo zNm)RClKnG*AHfU#8<``@?R4EM5Pt9vn>t4I-BbjK>u}tEL&_?&aPGZ@eDC_jR_PWt7E|2O1tCXy!Wkp6avl_bu4a?AZ-1FxXyl4qvsbuV3+vaO{%@xVMrw0|M z$j=k(o2Yt!77UVvKAMwst0F+AWcx>CHPc=czy$X0^6VGjsMQRMn`7918N^RAC9iwX zyci9uG;~d4_p{;vCVrJxjBp;3u9hjKS89djq}nXS+nPqRD{3ST%Z3km2~$-1hPy)M zX#xQ^uB4v#Msts$le(2ewz*Ze$4h$yuDhJXpw@eTX-#;Eu_d759t)AJVDqygP?jbK{7jA`yiLWz&$DFa}UbV)#+5>+2)~vgXpr5j#uDkMqFt^lFsD zG*b?LbBtM9B?&l=1f+Tmb*l%wbvyT7o=yTI8p!(vyh(CLvFxmoVJ}#Mm-q=KuKXg{Q2->zl(}9# zF>C`Z_n9E*R0?9<6&Bf&ZPs`Q^*au3HN8wF4?biW}hs>QDd`cgG z%@LD!=#%G!FAeCvv?O*%iLIh|w_k(Md|n?htDb1o^vYet5YkhA4qQ1RAgT)5#+m|PLVVH=l|@HOl;hHs7bi6-PW@rA zFT+w!D70YXI!N`Ao0o|?MkY_HFn-Qrq&S*d>#a?YiN0G=hb{Gv815-ZBM98TS5ELV`@MA$<3bYCUpuarJMyi>UXA zbAvWRt(!r~*1k%N2NFCUrfN`s9WKM7u-*wL(H z&Kbn*m#c|d_$0 zLAFR@_73+YE=#Cmu#VZQTJyubA8=+f!Db#k9wvEfv7Iz}2;CW_mP4t9<)cZk2vGyG zYV?9siM%;f*36WisbvNqh_uI&{DmXmE0MdAfC;f<5k|9Pr?%|Ja#{P}WnfS)Dy^ZU zA3iae5TY`{eq37s1I*)p_jhUd_Ji+i&Qo%d-blI=YK{PiBjwJ&FrvchQ|T1ljKuxW z4T{Rgh$V`QSoGaT=b?nn=^jS@YT?X7WXT!6*u?}8Rsb9CwUkXl_$|#l+tjSdWd$mc z=(1H+K{3LP4FyBL2ZJzkc~Q4EYLASuVM@SfDOp;S?+ZPDYO&0|n1^DXBM!Z#)`~F! za>9zj88OG08MhX-L%Zwu!K`2FN(QVKoeQ~Up~EN$i!eN+W~bOoxuQ?GCt6QK0_wxZ zia2cFedc}c&K37?B(37Jxu_F){ZI|}$yiNQzeVRYay{dmhvFvAlURMC?VcA#)w{25 z(qu=}+{n{^id>BVca#k#8JxEWmVAfF%nBCxK3|f4O0p5bCC3JGu@ClnY zLK(|sUXY#=q@HMU)9Rit_4dtHpKRLElu_8JwV>T74&fZYf}J!ws97=OPtQ^1m~ve zvU4Il5hK52(PbsUPvG#M@w+Z1@hE03_fKxv$w(6wth?k63Ve3~qSQ@pPrk;v@h@SK z{Zv^&8@p83TOqHP**X;KLThGuE&S!3y{(0Rd$}0*`uHeDNEi|lkGi9-aJ(T}@Z`v= zvXBC6F2~j?)|S*D75S=0u7(oFKBQJ`bKwITRfGN)E1?xV`%p(AvJ=nZbY}Y39{WNL z-i?>pt!r;&w%rs(rBSF(AREu)aE3LtDzRcnv^f`mS=yafO#Xf@cV1JuS*O&iempFH zk*D3veY-Bp84*J;w{Fmp`#*3F>Rd*PrI5TL^hFuAHyyS8e`%q9UUxr>PE85O{eS>zLt@`f1*#3o+FF39m&Ruz%21Ba$ac55% zmjb21!hj-P$u-bFzI|^8*Uq9##1?jcyAWOQ<6?g3Rx`0*i*SU|bZf)T3v|Vm7AECE zISn+~{imgXx~!PRpLB&d-CutOj({Y?L68RyH=><5_tgvp@t6;LrhEgY>;Rq!4)7s zCJf(cr698i-o#jG(${Gx(mVsY@axtmwj=yk^Mf7aTi=+jeCHHYA6glVV+b~D5i9sO z_Z1#|hw}$5-(3dW>Hyp-_3G_^E~y>5mS12N0xj_~?Ici6Jd#`6`WHj!0%H6ff0(Z{ zYTIGPi)*_PV;1E}A+*0WWmSLzRwM02(gK&3?l!DdSG7I4+eHr3B|vKEsrsr|g)jwP z=@Ro>D1q4nuQCUM32dex)p=NOzbhw~IoGx<|1ePZ9h!Ax&h*~YQixK2I}oT#NPcw% zB7j`S51zBlzR!LhihToIh^0S_9r}DnEKgv;|jcZc9gHCS9-KHOI0@t>oWI zdq!>RpmZInH%!e{eS~yLU>I~%i-D=?7i(-NaN>mzdd0)z2{eO$F;JcN@fNFp72YA_ zrPQIe$hc3psZM76XiWMA5C}J7o0wzEDv~X@M@blL*sy+xr|LZ`V1X8Slty!BX(O_p zOywDFDynSGU%OLkI2T7hPl7U7=>B=n{tJRENn$-Me@#7;S_9PB0F;2jB#)mqk>08* z+tz~!E1hDn`7!B#wmXC*C!EA}lHPYll)_K*x{8WH;siuH0|&%bxL7g8zQpL~atDGO zbJ2_()N)%7So4B(uwlV;?44eph0C$NLg&WKh<-lP(;;r_O1XynK*V7Dh!&F?nUZ)h zl}J)r#^76Vt*WWu%n4^sj%E{kTjfy$#Lw@jjy{$U&K;E;fK-JvM05Z_M{VwKLr8=nRjWLpSNv#8w67tP{@ zex47~15Vs^tRG9J(bz7EK3!fe`G3y-Q54J=sFnpoH-;ljiP9aFs6RAo(3fkfwNXe? zr1-VeaT&{hWblkR$s)eXE`A-RM?5f_Qm+Ibb-@f z&Tt%d_a4MUU9J|nA*ZFQ9&%S-k1PC;PCslvFF0U-gE-B!`QBOW8#?I7eIB|fK>Xr_ zCN$R-iqR?{A%P5>c_p~bnI{+MXTf^mVUlQIA}DAh`LVS=^cg-qFTL`~r7N^$2BPf} zE-GmZw&zhZA(|r@s{7|e$q*kcXv&oQQmw}Q)ar49A%NR!Y9gV2v*r2ht-!gp%W7W? zu`_jlE)&vsAPNLGm1acygKnfeGZ%NJJQmU@bwo0)eROZiw zMos8C*Pi5i8Ru{BsC!gP(z~Tec3N9FuzWe_HwsaG6(;;(1P-+sN#{r~tE3#CL)++~ zOymaaC)A-N&j_USbXq1@8WOF#jtdnl<6&ig9Tw^Je6NXog^kAU1x$B0T(}KCC_87V zB~)u56G)>08!4!JS>aZYZZW<~sr>9w5P(nyY1P@1&_fhXemGP8P7Mr0fB19?b^P8? z0Fl{3n>lI-23S_0XnE$5FcW@mq1XBJ(r6X_bM*BQyW2DC8(|8-=ff>vD=wBWK&nRqwNKMM@S?6gUnO9a{yN-?tU+ z8a;tFCd|-2qj&e?lH$(#wAw|y{`e^i`OJv~m0Hbjgb$#rB^EE46xX(|BL6Q*nCBz#t^dgfwDvlBrM4J(~&&$|6Hp3As42RKnJK z`*$AY1_b*A&eL*@FO~W!oG7;(ewyq!Re|phswg(1xQ>#vqn!K&nl@U9MWX|>bc@1i zmaVA(T-+=eJoqZfR{^h>D2&Hl{U5Q*lFiIa&w?{V!qLaM4@jO%e-^)9d~bMvNbmUU zZT&WnTO*)4U5mw34)kC=6+R9YJ0Jh#AJtHkEYcVWO?y#RqYkZF4nLE!3&WY!sAr9(< zd#5QW$p{UF`X$cc4z*nNjobx)!Cs$BzvsdZVB2ae(~6?uPfB3HxE;;d#qyXVt|WT2W@}#fv_-;(OXQX>XU>2}V+{fg0sCi#Nrd z=3b4LfxxCB81>K+iGm9<%08X#$jSr=a5LX42{RPL-S?0|j>kV8D^qB%`oF|{$U<-@FK_$7 z6{RZT<;-no4-W zhU+Rcn355)5xWT)7JH2%4fc&KS!GRDt+4cDXH(z+m0DJ^gE~bl35?OGQa`$`?NaY6 zeb1mDg;wSXY8GkBd&;8uDHhdQ%dj6YrbI5znFYR;bj}d;)6k57s*vJ{EA&WofB|?I z>^V93mnY-CtMF2Pn1o`w#BSWXQ938nUj5E9(qh!Pt&W2N` zF*5j#C#V#&JD^R!EYqxDrrA=dVFsz-qKzNuU{HuHr?%oy4V71#{zUser&a!3-yHd( zkityH3a{Q4jr}$C9{-7dC>Po&7?FZ`G(<`k^TpuaSP=Tr zm3_heI#tJif#(HqBRM@3i{~$W1UrDu)ohthHFqGmBpz+>}KV zYD5uO8eWce5(^0q&h%bNwx2~}uN|f#d4~_or-_(a;j)9im zEXrKDsNGN@SluMLlZ(nnRiF~DrL_gvaqD_Nq6&>&w^0%D=J5G|6osXP*;K~VZq1rNuOgW`3{@CgAeD<@DnKFDhd5I4wy}PdVNi&1n8$?2P zhmc`0xp@@&4!$@vU#mH^w-}N}q{L@mvdxq@rQCCpi<&CathY~#Sp-JYBGayktska& zWLa$_u^y{M7WTq87)-TSTAw`XBF7 zh{xO;XB6Ls)#Z1Z`Zz~BsLp+ZjdC!`wr^1{{A4D>_u8mfpI!n%hsJY(`7yJ9(v3&9 z5OZcE<=E+GkP*{aY%)p-wE}NMLil$46a_J#vFp+GiTPcqVZhC-9sFnS1U9NvT&%ss zNf*}HwtVIDb7dd05Ae%F*|I`qaW_Kepl)Nlr^Zw7A(%Jg-I>nt6bDcOWEDQ%g+$8^ z1X_s}9q1jk)Nw>jYTU@#O^%j--+s(@==5^V3^-OU2(Dv|vg=rrV|C6U*zs9B`qgfh zrQ@t4aaQ{-PJGPY^QfE!u{PULm0e0X+0vl!yYRi53QR1+S{BJz^Aq7_`}l*`eW=fh z+Wz$torNjXp!z&|191`exW4(jlj_9$GLsOtORjh+iZ|GudrZ(>S*7fM-D+;3XcfF1 z7N5U?utM48xi_zG_TW2-$TKc=zAn$7E3OegT9?mxI$WpV5d!#T8T&&h6A)z5_>CB;RF^tccqG2{2a zPO1?&^B}uPzFB3_EKxDujpX6h_mpt6g?sN`yDHAz$3@q%dYyQG$_>JN3;jSs%8tuvRdmJE^8Q61_}E9^qa%W*D*5i-%Sk41mmDV-y)5h9yCqCKIH7 z29b-WCKjxJ*V9^6#;;&H*oO(c@9y7ZIGVdRsF_wYhyJ8*(nXCV6yz~0US+pl88z4S z-M)&{H9v}m*Ky&7ODL7TNw^I?*d@J&Z(KzE28Fg!hYCB7LW>*=|@8x6`6Ewi0?KF#{r?-Sl zSH@g;U4u!2!grZnui~q6{yF0mQRWfvF7Z}>d}=j1dM)pZ97eHm^P8ZcC$n+ncw2|Y zLVWaOTK2D|>@6Ys*U$SzwfqNy!Q+_{@{lU;2pZte6=Kw@gr{=9JhNiVy-{FwY)$N&#L|EU+>Wj!PwS+ zvqvm*tX`xIVfy6FJ5X9+x0Po9s_c^nbReo_H=>Q`x0#rpxR!mpTg4QFdC2yS2IA-} zf8+NwkX$>ZR8!;rmb80tCTDLth$oW+J}4>7D5`a}_>V+xiXXfg9u7z3k*8byaSx9W z@k+CJT%XS zg(o2ab=U*V$@PUEf3*K|n8F~8Wzwdi@ z;o3X%5bNc&oSXH{s}JLvg=~iS$d@#P-7ro^{IvIKCSbn^hN^wiT(d971L?hgLV0_) zJo#>i%1W^@3TX^k9lVPC%m9Zf)Ps*3S)&9BtJ!^&E%!C4+s<9zz=vs-1PV$*c*X16 zN}FdgqH^0u6S&H08+B}*Ltt2K*llAQjT_sxZQEvJ>om3++h$|iwj0|v?)P8J?re|W z*?IOpYsoMp*FdgEpW4iLbC$~8$SV9ddsFpjPZdbt>e{}HcK-IgX)909e;+=xuQeNy zLkY;G`fGNKI2MS(qbf4ZWr z1p^l(tc*kMA57fZq~6tg*H%}Us4n3MRA6vV*#EV~sjT-=1Qu4(_k1Nb&wn@`8m5(^ zVxg2+!Mn&+_JV$$@lR=t_`I9uO6!z2VdV*LhR>)SM{N)w;=JUl$b{#A8T(agjhb;c z1cxNWxq#JtptG@!E@wx{U20dMaytJwpG9y^PM-WXA{xb3baA4Uf8e>mlMJy=dAj@&IQ)Pok81oyY6fW`%u z{#rhN9(CkU>P%Kpdi?-OZ``?um=CEl-WcVe%SR%qIF-iQfW2Ye;sy~UhEl`fi=!EK znXOUPnzserSvHgjoI|zqIR)wMkP;$~%y;!_I;x*Q^CZTWBR)EFmK%rGun-=R4<8(n zXZpnR`Ps`xBoKO2tV-{jY%SbZeb&{GbokWWa5i9`n_rF5_uOx!KV;rT6et?-x>PK! zENi_@N|CUIvFWV+!~Ur-ThsF7+1UB&DsZU(1fQYCB3*waLkH51WaX(fKl=0%GeLa{ zI)((G<~8Q{%>Cv?7E?DuF|(!;SvJJS4GebHYpMTLL-wMj{+lN0&zJ3er{_Uix9zXr z7kDo)-~*j>yZ2I&YZ|K}k(Q40Bn}=P7D-S*0^!%&XQyG!$Jb?7qIcGXv#^d~bxr+A z22th^sAdrEm+Q}lXzkafF}lCs{q?vIQKeCB6TNs`=&!l%P_@)2e_!-|c39@XTW;yq z5OZJ;_qb&0ek+H)s360zCyDYD$c8J9!)@ZDpYg!N7uAFR;Rg z`=ixi)0%h{31w2u&9cw8Y#Lgu!sJR}st7)K8xFBC?dHMPaL4&0B~`v)i6xNe`iA|X z`6|Aow1J=01tqjHk%#Yl=SJQ?p%*kWGb<>Ui|JZM_gjNVDC{*7oG2_c%3|#!FCxp{ z;Y?GuJ&RTgVTNw?MU2kiMY-EgJD`(*X62uPlB=$SPTvUs6eNQ!>>rKp?uxb1F;w}m z4WW?G`@>oiKOF!4-fyHup-@{1CPxtq&SCxNj;T8RA-c1>E$JqoreyR*>ch`XsU`V= z=-5f*VxpBKzSq>jyf(ncj1gTUATUlrfA*jH`}AI%+c&-gqX^PZ08wFqDs@W|kai_~ zSmnGP;l}8}?o!2O!zH5)(a|tKYL zQXZ^?+h)mcsiMDpC%wG?1_{ao7@d&6WbFI|6^@&=S2U6Kt@kwQbsV>5TzJ)kF|AK) z@C(AXHq3oYuH=tymOFFC@@Rs{`02_f#iUe}s$C9f^VUTDms?_xD z9L^jWGx&yZB7Fp(z6~jKRZle7O~xJ?&m>8V`ffz3s0I8PM1Ui#?crT{7w`M&i_7}J z=FP6$ma= z<+K3`@9c?mQ?R<8h7|5Dl9SJpxj55;~l3v^HtBw48F8m~~18OqEu-;7kT% zQ(K336sv2U(^uTboRT1Vi4&Z(dCV!{;p)^>`sv`jyX58Zk<&5o3sFCP3|7#+J6zDDtk zWl`Jq8lc(XXQlx5wF=2Ul*TJ*3ekQix3kHlqjE?4D=NufN2Vy-4j2<26bFb)wdm$I zvOzjU{N3+wzofu!r5dY`OO_4^Y4Tn)>DG}-Tp7p+6BU&ht}9LFQ%W)Xot~>Edz*&sdGs)P6pL)$ z2ywu}(!`r}1~*+NyTb7cwZl>%)aH*FW~po}o_^`^#PM#s#YA3VoD1zONs9wK@w)n6 z{62sAt|S9kS7v$x;drWnsJq2VRZBWC^Oy|ZVn#>v5u76ee1D9w(a)$mFisE9j0}I# za9svlx@u*3`1Jm#ys85qO-P4vvTrnIwg{EjS%)Oles7;=kg_MV_1Tv%)SVc{O5@Ci z~qBEBvJMiugdJCD1-i&77gKs)oj>nHB0LO~3HBCa9BRge_f zH4B30lnB&`1*h`-DUU-9@{n#^9h@t!2iYy~zJogbsN%8^R0W^irgp6d6VKTiKT9NL zsn^YeiMP~HIhxT#8eFJ1)D?&jJ?Qu`>I`NM*~0s;mhh4FfI~@6<#NE_WCatM;DfSF z9oCOD+Qk!b!cs1jVBlQ!sN~H9J5iteQxR8o?M#rBb?LorcN*|#mRmo_ojXhS`+fpI z3U_REhO7kwn%aucyZYm}Ob?7ky2PjLG9Oi2byd#h4FsNwWH3Ohe~8Iiaf7D)C}{nF zM6eL}wQohtG0&!D;e}|;(}dgoe8qAoLsxlw(2XKe7V6VbhhehV-#9zAo{OM9wVwFg zUUXlJaiIy=I5*zvr#ZN8ZT=BO?r8#onF3QiSCk_pn+UG_|Imgx)@>9<*GCA1^MI`Q zWy>p0l1@2kJ|0FmZZ~#Ba!-$D``~^4VrNSjL+~=6DNFGG6BkmdPncyfPZIEtNlf?@ zO}VWQ*6>HNK04f_$je|QwYFLr^$F`zz~UbwlK!~+*cXOdEP{sC7iv|lCkphf%Alj=pVE}&y){Ar~6n5dR+KpFs_m{bfVMnqao&n;`mFL9HAp5 zbK3o;!^u-bTRN^dosmqUz2B%+d8$2gfPCIxAfY|<;C8Vba4cw+Dz_F zN!)!cI?emW8c9LgPQVYx#L-iA>U$0n2_QGXRMg}|m9g++_N$=;W&x7mSvQiEdVXD> z9QvQyIS3QWN-f4#F}e9M8B^u4oF~5?f{ib|+AEfSe1h5Ty$$?Q#TBe_ly$l_9$(0_ zjy+D-Z^R!v-We4+-pW8)9*^|R>g;l zBtLaqOpR$c^{|lD#Bud!hrUwkt#s#PhTS;hWiT$5W%zD;3vm{XZ8mOiPRyU=F|M#% z{Z;zou6((W%5&Q;;%ix6gkO~H7of|TAW*JMM}sI{C35G&F2JMDZjhX!?F$BMW&$NU zma4;e*cozL^fY$7(!7Dt#($d<_17wle^=Piz6D&@yYqF*WZmrD3G2#Z1Lvc?N#Q|K z#J=i3p0Db)R8Y3}ri`3AlV~RLYiGQ!no^Es;1cAI5Dg}WOE3w3grQvES8N3R380^! zPmAnFNZ(jq90sI;t4|NQ5N@-MDaMIMRFziP@gj<|z0?&fgYp`2#w*%?2XmfF3ykX- z#$0Ny!;E;&$_5ZVZC{sqE|nHJzriqSK`V%OmRjqYa?xn#)}IDSN!5zC@774&Nzih# zI)xI0bTQZSGxB26Syl%IGbz-3xD;ac6o#9AWGz~vcmX|?J_SYAxyX9+y;n@P6n;Iv zV`mUM>y23(-^a}KO+_oX8s#Q==~Qh$=U4bxX@5v9TC*QqdkYnMa1dhK#IgA*o&A!p zJdw5|)F%i{#es`w>ycNa)YEtb{;OzrU2*93CrC9E>D1SiX&AM8+5N>ij#+~jh2Af1 zr`$_4-hhRrj$1#-a(1(4$}dh%!pjyI=?m#Au= zmk)Pq0-6}z`D|Fr7M(oUf3m}SjFS2EB`3kgL4`8@OccF zWjkcaPxCGX+n|jfge9qOb$K+%$w?5~*4?n)^#DBQPl*NfT=jE6?+vk0)mked=ey=| zpIL11!9)g1yHBu92XDT8CviuFq%ajQl+W6?n^wZCMmtYstk{EKtTtayM#Qh^7ew2e z-^rsTLn+T7BF=Q7fBtb9aIH{me?Tfxf3#^4hK2nrwRko{oxDYVe!zN?ZxFR+%i`nZ z+YJ!#5$c_>+`4ec4N`$RP zCkg(6Su~ug69ppE{m#~`BsK!rK%*XPjs=Z;a71->5X`qLf9jo(#bG|4NSG{bfDh zAVGYAZXh*EoK|V#a6~CwoYx!s@$#Cz)%dqjSZPxz)=B>rmm$FQP5I<^mYrrUWe_0# zqsjbYu_O=9e5qXI=F^UC*Q%I>uEdLp(`8Vz7>VjMhwXd?K5?%Yg^6k%OqXB3jyHPd z8cw7>>Y}OCkV5B_vtBF$p##4M$e5@%OiOtyT59RqhQ9aL8O{jZMN5`Dwdm+5|2+Q? zm>fDH`$P*OCQqT&sY1uF*>kM$@C2|TBup)wC;$UGu*<0#+aM~8F!L6Y81`Pxt~~e6 z+deglq}SB25wJ9Bcub%Ca8haa9bQvMr#9^r>#VtIEkyx6ui@#AX#F*NAq z!!dMoJEHMYrEag;TBb@{;oaW+_D0#MJ6oHWxTW4;agmo(@15?!`em11M*x#)WY=op zAGgzoU;D=K!>gAXxo4tm|>QKBJN1&@5vwsDCaO z?&=ggPKV@@+3J&}5C%Sj>&-G;lPlsoTdfqG+ZABk^}Z>I8C!C>|0u{dbXiFAjJ_0N zD0X3GPQh1R{-iIKn8TK<8v#fw=4OOxV1@I&6^T_;u@(FSRrn8}GzMG|B9q4Tdl#VU zwc-<=Oc&`4@Cq+4FWNm)N4TCe!wAefwb%?+tM7}>gQUEHjxz0G;nLP7cLeZyr9L;e z#*Hb-;<>R!AE;Lpk~7 z_$togS{|JLSL3$+Mh0XH(tlr8J)-tZP}Y8(_LCT`#LvqLybqPR*J{gs-qZcnE>XQ5 zs<=@JDLP%pkFaKCG8JFk95b|=ZO0M-ltc>IGMCuB9$tp=@j^=Gu7kPmr6`Ce`@B^R ztlri-#q?{?mynx zXkN_g69M&*{SzX%?;*A(JH-b5blz`|k3WH(APsPpy7)%lp2S84)(=oM3d*C56HfkH z+b~9)$}>LG;?d4%lXCTSR27N1)QCU@kWs zNeTuS7i2lao1^=M+(z7Pp-ob20X@7CZ`(V8{1p#byBY204tyxgtA#KjmHcNWwR`oy z{X-fW6rJ#y2NTPw@&3-MAkYgY{)Zr6w$KR_a15(mOu(Uf5CJnc?2W=5);8x)GO7CG zpE~?ZpENe;hPu!H0Qh?=bc>S{+5W3bl5@xAk_XCkOCC3FP8CTpyixx6;7fAt+tlQS zZTafb@Z6LSvbr5!crT={-DDeQ(f*5kkle*(jfeW3rJ7c&=54mMLdTj~xm)`b86Zi% z=Q*9X2tY*W;<^&@F5~#}$z&E9A{_Sua~uoN2S$Ww4O8lzV;)Zt#$Nv-%Cc=B)=h~U z4*bnui&`Wm(t~%SWI}=Vx{7{&S?+&c-9hen3YC__?5Gr68%s0>4=>zqiQo2SK@3M@ zc$C+>2};l|37Z6Cy8JgFFH0ZwVBo3o4u(~*2Eb;D!#f$qdJa|!{~2P6!#eF|r{j+d z@dh|dQygoZgJ~Z!d;wX^li{^>j%c-~QHU)N_&GvE`6(gDE!kKDh@3c2JrbM2N5#m% zS_d<4uAcFIZj%-($=_QJLwq|}=V!_;1pC#Oa##-WEADP74%RSCODg_Y0wZtBav!~! zgg~80RuZTR%ne;+3J%ln5)SSq4iNkON}lq@W&yuf>K6Fg%{IMY4KDs|djY-I27`L5 zSu;BAJ<*yug8QliB`H(3o@4<=WzVN4`sj9G#KuC;JB^%@q_>A98$;pIlUjYbU_7=c4Om@_fJ@T4yDb}#@_j3`s7(ix>}w3|jJmdM zf>}H{kMt{-=3ItwywY>B=So6nf`kPBL9Zp8$zvgy54E&R8OPWbqTE)LXonYXTSQcU z31CcI)^fSm-&Y+@E7!`lHA`Al6+Rp#s7Y_uCHj*XMzV~XA5n{jUeR7rrk*;?0@!D~ zK9RS-er%I@WAa24w99w;>RhhKlRRs;NXW1ELH2UjH6gfa80dDO8rSKw3HqPMiY!WU z1d4Hn1h%9J;3krO0$>`be#^pC*%_BT48Lip|h3Ng7;x3D&N8Z*&Uj&x;$MU5T&TU z`0pl3NLd?2wBm?r?b$?;s(VJKyl(qG{c105cj-m$YMwxQc7Avi{qG1w!1*O^-t|{H z4})49%{~4%eU5}Pp^B4xY9lCA??dYzyyOiLk7j(tnpbp45ehM$A5jobIz$O z9&6%@Y+DL`OuiF-qb?7JNU2-Ty<_n;oR_2xGS3bMtL2A|+m=2=0J?M2SUcW}_Jtyg ztfQh&G6^J~zIG6ay4}Lin$jJI4nX-=v|^ad&UsUFJ7#wUpZ^W@SBD)bcb1-rT(A#H3wlSRWr0 z5&thhxJtoKSMTfqXu3>u#wsoYleBzJ&*iZ$J&M#Zz%ocC?V0)_=lxe5Cqtf{oXkqm z_8kA-K0`88wXYc;DpuwHi1phXyyWP&?w4d$Rfk{+hOcWg1+`VlkNUDPfCBOn@p+>k z>Z{pXW*``ixW@x-MZb9b&T?vi%Upc=L|lrgzh@+Vu(;57t0~tjT}YFvYNm!bppGWU{k}uFOuUuj(?}= zH##T=+f8`fq_ttO)_a+EcT^{>ZtZU>g#Q*_-^^ne-Rg89sS&eUUS|_-M5UfS6;sv2 zHyagwBBj>N4y_QiEWfW-Ji;#ZC+`f}WbPG$J7w|#S_4Nby8~sDB}Qf{%)!M7W0uxT z%OAv950)3ntl6&}2Hw%hu=)swE(dbAKA{=JUtP-oJj-T7X*K<_`uyN$H=tw111zMR{T0T^3?p)Wq z>mnyuf^~v9Q8ct@D@;+-v{i{QetX zWw=F<;*&s^y`EatsqNz3f{}TO^LqEEU71pV9$mik zk|ir`trUw8Fwtc*!!<10r0=;*qLA@}8{vO+hj`&=%zdm&?@RrnHDif!XL_6DDbZM9}mLgVv^!m4byrUcUcVQJA);sGh z{A*8STrIoTyvtNXma^?J19tWYd?1{gO%Lk}Q;BVJ&H;Vts@c?ksD(FjEVd|Ku`FML zsvnTmK3b}LT4Vp9p%mjyr6EY)2i-lcfcqAWM=!{ogx&aZ=TgW52_nz+DMc>Xn-;QT zvzuRmzv08CNT6Zpul*^mD8hF#owHh5r;Mca*5qCR$otch*f5kIa1{( zLypJWTH1*+N7Joy4^LVk%tu`2T+Mkh=Bmvg+X}c&_x|=bz2#?k9KWm$+tX+{0g54T z)bG2m9mE%{^iisOk@gWX)MH+(fZ9B(e(x!4%XV%rTB9!r#+Vh)t=M^9k?hqYOaQ2) z3dj}JqM3|UW_|k+<$&2=_NeThL5O7zyxjnc_7}P#=B$d}ACKHqCGZ4w5Rk_&qnViyI^3uS)C970KA*cFtaeI56j0qs3oDg_0mg15p}HM-5K@;v3h}+^Tl-+$rth zGF3BXkzpwLUy07lBRq2v04FY3+)lPe+t&Jrn>G;}8A+-#jm*8I+l|Uopu_PAv(*7P zX(CV=8U@||n`P6r6h{hA?72>q6mr3@Nk#nd72-hi!j>&RthpE*VRetIR4JGK6rS|Q z6asgl)`lfs{uhFHAl%K?BAa>Pu{rXxhh(=fw{uX8Mc$Jl)+iJ$3}0dLZJjDs@T;mU z&W_{4e{!rzDmHrm04KErU^dK$B>2kqa`jMi3lUiiUn$ZV!C8(&HlYMPaQ-weFQ@vw z)uWAhsc9&}lUeu!y+Y5Kq4Kn&y z1lR-Bx40y#3%^OBI;$uNEFY7gcZ%Wub@5eAm2%G*6Od{^B5ULU?|s^SMG} z?-iy+owpo}i@hRn#hEp` zOU8QyUug=teq;q%=6a2Z-U`ThXS>|oNhpoR+K>L_+bg0N?65TAOgZ0yN@Ao{fm{bk zI@+YjonUW#bPqD6%bb=OJpp_WNZc%xjYPd^GzM;Z4)%fk0D}ImXR+%AvE)TzcM`uA zQ3~t(PD&9>V>!H3d1Ejuui!}r`W}Ub?RA>~&)Q9*8N_gIvMNCW4fIwwoXpW3cr2QzYGxa7J-e1?227`Q`LN6$ceD~r2yMZi}~U@c)?j!8Mhdk zX-a@;5EdZbZ_*GyI!qLN$dlWHhv0{QNlg4$Un8iVT&|2(iyh_m4gFrxaCG|}{I@jt zw_zA4rU0qoYVm1ZX-1-M`ir4X1t!{CWT9eXgH7)Gx8)lqNHZ50_Nq2RYoc+N%8u8K zy*ir;dDk?p(spkHDEsT~!+?sqpBuPX1qOHI-Zv0NEvf85GEP;(5rF)|psY5n4dQSF zlT^u$Cub+E0n3mVM!jk$ZGJcCd)iHN^7KMa+rb=h0+L@1^)ib>8brmjj~xf1s;dp) zaeJ}O4ZYt~ejrD`6n_YALq~b9> zrw>RThR9XIB68hr&(|n#7w%-q^ZDLTb#bUccwgeSm+z=Jkv1JdPVg$LKv;NQ%%-yW z99`3ieTW!l)3$|FuO5SOx_qDukedq=uQ+t_SOq0AzJLZ-4~UKh+stN{?-#mK3r+qe zBZqY2C7D2TC+=89ep{~R$i^W{CYgNx%LgnmZ(qt8#%2+Y`Pr@a3>`3FU?fx;{nUbW zP=HLLDEj4j1*e~uV|na0BcHcn!x`WjEkbl@py_d)Tp&7aTT-oZk3KEo`L@z0&F*Vy z30lr1X&V-;s)PCFKx5@&5*FD{tqB@VZNEcsck}ylQD}<3p&tf9t@4!a5 zZ>Q3N)l*8^`lmwu_fc?D%AQj#Ga+WM@muBPR-igV^%fXgW8Qb5O0 zd^hL;LG5v}jJu_r`U~Q=$RmMWXsW^e-mXVb#aS=LFZwHufTcdXDuLQ_!VZiI=>LFi z9tQ>I}{wLy5w*jbmKiq=!H9h3aPL5&_`5qM2 z4F9KWTDcMn!C~WuX_Sn6*NL&i#DRFz8KE0WxTd*%xKNp+Zd6^Bt( z{qjpNYrBDxn~bgLlhaiX7TH+k4>T`I@hO0 z^SAY5{BwqBv>>}8iATA1p5N&X=e+$AIfSFUcuE{Su4UK9LIOQ`5u6;0tm5=vcdrh=tIF-)V>j!Yx}5zXx-!FW8vQbx08C3X_#sg`dOv`ezJrimc6tT~@eZkFF4S z+QpU6 zn3PvZbJ;F76iWTcB2#Pn3yhftSi3UBUh8`iNxUzcPf%%BW*G+<%NI`=jmCw3>vILT z*B@e>*o+E~x&x=rtagx?3iCt60$1!JU8)F@)m1_H(`Q*CQXjLpGPG~l@zvNBMHScG zYE(Kp^xr1PR1{;Fy#Kvwk669%Bh>ifP;cE~g!IRDc!wYYeS$8hL!%`|0_c1#T5wv_ z1TLYt-L=LT=QZ$~Qd_4tmjbEM{97^bV`RAW-O&izHm$nsme=&pMUSTi0cV_?^*t;H z%@oV?bt1O2pmN)PP=d8)&saUfYQ{&#Rz?q6)LSx`bDyWltAWG1-ly32id`KlgGh3rzf(DyHMj^iNhH&vHq8KH0A+3o8|D?kuREaohTVH4VsP>=@;c^Zs2xOS z86F+k>rX%(pIzq$#WAI%Z>nss2)CP3cf~|v6ze2PdZ&39=xMjRcY>f;UW7c1rdKT9 z*A~$$RZ_|PEANANSLWhvF)L~yUGY(zNP-QC`8VsYlEI^n*%N^_AZl+cKwbVx!JHo` zY7yj$Q3!yur`ovk>&T4dkS>Ed=Z36OAwrABR!M!Jj#1~SBO?i;lu$tGH_{#CSTB{6 z81~iR8G?AL=&$Ba#h@*9=^yhgtfDlV4rp;XnKcS8mDRlUpXRq!g(s=6W;%E&^zQwV z8sjzF#Q;YcfA+6l>9WEbc-6F|sj(#qzbq-BygBkvLGU9yg5^oh z;tzTq6h%Lj+z-5X$jAI z-%byY+&B4je|c!nq-zSP8mYnmqn!dVVz|RkKkIe=zBicQqSAs$rwLx(#@KfaTorLBI=@~egr{QsDsEdL)SC^I`72OOi^|0aa85V10Gg0lU`1jT@0 zV`Aq@HC6(p0%9~^xst9|kYLe?6U4eOv_rK~D8_UAw$W@RJJXn0EtpdzFvw}l$F$y( ztIcXrlBLSjp3I_1#!~nb9sudr=lAaOw{F{-iAld{ziF3gud92#BJygx{{WC=9<%Xc zMbrgJ@z_E$o6|@kQ1Mdc_NuXL<CTk99J>7+8E? z*l+L%HL75R!5|C}9)db{4sg0LqFb!B3oKBiDnw`@>in-F-6#WTF`^nMQzx!Jj5x9g zWGMWg$brZ(TDTe1b6{4EAhLtCD1Qai&@kd2fe|#{x+@gpCRaM6GE+pOe594P!aXVo zmY51L@|UWIa4l)@n6=;GE2OV)fnvCr%__M90bqN1ZO|mk3@e#ZCMZDwDKZ%9_1}4@ z90iG0bXb4aSuG$2Jl*J=Loptzj3hzI&D1mb*nf1FBN#KaeIg5IiN*kuwN(w*24`?p_b0?2A_F9IRbLWQI%NLB|?Z-lEe z6vZ_9${vD~)v5$*`)MurKm>~06B$whJaia+vqO&7REOc;crd`D73reH>!-HCt6)Y1 zedT>^n;0U#ZnJg&Is8s~?V)8UdjC%jVh*5wg%O_1-oWaa3bhw6X~Ehsl^#u6gBzaVSp zE-&b%DNl!A&6eA|V|3m4pHuO?ANx5_q87F2ZjTjNMN3)Uk}4oSgT9ObCDl4ng=(xk zZ;96C#rIC;BwMOx1(QeIrWzgU_Pm=8HaGHTH^%bm^?|RxwXijQ#ilZy7l>GeZDLDH z$zE#%w5}?&aIV)Ujm`WVTe8{9_SkWWO!x*;6@C#Km$m2P0S%}EWS96jyQG=ZC9(Ks zel=T+7T%q(R>@ylzlh#|&-#ngHOXD$`m04vjnoFULB5NU>o|)!`r`fpD)W60L0tBu zqkL!`q^b3_=<<*WpPyYUWrN%1B@_BLdAWfMhuwDM?^5^S1;S>k;Wd_h=e62lPx$#Z z+e}FA6_fRdof8tSj+26^#!ddTt{;<=b*u*GnvrAiw zurWU8JP89AO@hjw zV}_1g#Ir?;tPClPD8JX2by4JWf#`IbqwICXeaz6QT&dVS14J46UcDoQj!AL4%3!$#3m3IBWEuqVMJ?s|e z)jul6F1+gJMH&^4L1>)lrQ{h3FR~Cl_6aSxa>A78cIO9u&Zg1{r32ap-m2{we#SpT1;YB-K<#4~Z8M4%(xkx}~hdw`^W< zW!2`0(lZgoTSD?ED-8+TKgGmmUNl0dGKmdXb~c?R-QyyDZcUjtgM>iB-5{Uj$0<1Nf;^Qq=UO$+<-4}4B&Ndl_(<)6 z;;!-SpWcthV}uqmQ?KLcshxEv6h=hd`$-CV0=ms85_#w2ii0mTAya)HP9qRxGo9^U z#tx7L0$l8m+6@67usN(IW-dM#X;3KmOwJXgu$NEFdm+aXHV0!B;OHU;meeIbsx4Zq zQ~B|@2eW@w*JJ2S5IQ~|B_>r9*o67nBw z7}{5fIE}mh-7ijmNmFCtM%3o;h8NNpag7r^Ht3YW1E4MK;l%|S;G9O)TL%#o5`=t+ zY19jmM?%R;&EaU%?y@ilb2(2MEb9ghI*(g*^albb_^fPQl6ycryfZn_+RM&TcPM7E zZBsfh(lB7QvcuDAGzfCD-f#kb z3E$3vAL}AX$B?OWv6AMsbkI@k0+^BIQTXxLPlaw+fhAX*qQ~wniPv!eXfvm!y-NBf zvJUbYOx^0N>Xgq=WtMTWDO1d0u?d4^80poSb8NIkCojV-or^Af=4>JL7Lm$hP+!Ai zdE7#+CA_yi`{O~6LM{$p*`Jh_GJ@+fUH#9+=8zzyoC04 z^`o>gLhn(3*yHdz88&19!qR{6yUxw1&)uqD(z)EOj4pr9v)?%r4;DY9u2Y3Af$?FP ziBxC1YnMMK?)Ppp+^o9>&xd%HQy*J1?=EL*FR8)PWfN)k?+^MF0$ANyHy@==h0px( z@BlJ#-_YO?6zOB?nCN57yBF)rwaj3h3k+PazW$XPBB|j9cRo8X--gv4H5GTAwA)bK zUle+h03DqWab4c>hdGCZzoJ;O2=6GzFFQY}nS0W&!bvjzC#H$98zTgU%vxXc6uNOv%c<84PIrc>uEM)id=zAJwrQcN2FI^wrU9D|X(|y_fwGSLA;uiSvN-t)roF z=#8|D`u;~&BQ$*<*VFZWW{2nbR#iL(zC}})U3%TIAt(OQeXWurt9#;M&wy9SDLtNb zGZNU5>)Hc&H{32O=DJAb9pAsqdP<+C$=VjcD448H;96?YF}3@GP)<`oot8~7@u z#jlxhFnk_xX+CH?FXrcI+&!13gXyrh{T=>QUl>b}ubNU1lQQOU+*lFK)wOXzFo-c$ zC6&<|#8_}_xuL&5>0!Q{letAoh}*O;EuczygM$ogOt{X`fpg7l-H5A9hrZUC+b=sV zbZ}YUzsjJk2RN7XQY=<0s%?Dx~TO5Zux5j@1W%gFDP z@i5Mw{+Q!T(EMO4k{vynJbIoW*rx{jH{`0>7X_W_y0)gB{c~85;^u=I>j=-s7O8WN z>7fOfdJn}!8Vpa8Lpn@f{WUpFCn4yNzUnN8Vrjyl_BWs3dq0TA&dt`JvC_B18a#-W zRV1@SOq=2&Qb3G>0C~dItGuM+^LM_XlWRk2M+AGR^7YebZh6N)2=pxqS*Ah1CPEw% zrfyjJEGFj6X-W0smEGB%g?SEA7oR4?(^ynMSQg7!L|~;-Y>SK8Ut8&&M7P8);WO%^ z5C`VCu37th`RporG^p{Hh`)T@B)m1ffN2OZuV-qsL$Q(eU< z@h*%(A2vLyz|V=w>pffO4jz9b>h09lh5;Il9$9}D$_ea zr^M6uvvt=rtm-C}E3*`-!g!I@?s^~C>S#>jXHTlqK*jRjH7$tle@=NDN1Bn>R-E>@ z8+rdEt-S0UD$=meYy@YqS@`fkSUo2tGgwiN>lpl(iO&!LzX6HfhFdb5Zs{d7g!IbJ zR*H zk7aRvx|c6~9#Krw+vKPv%Hi_6F<eHUik~8@0byDXg2}Z392+z@ zSkN>LVXXA;V)!UxVrYC?S~(L1XWatW&ngodBx{HPwjq*e3mxkb5*Rf*DAYG7VfcX1 z7!XCO5>j&P_1_4(SS;vZk*t#_dX$cF1Pw?Sph!^6GCHBVs2O-dW^DR-mUNqd$c#+H ztz#T4Dl3w6ya~xDb4r9$!faGwn)Far9Fv6xRlurK82*DUtPr-g@@B7blUS<)i!CIK zTb(N^UA6^BN!jl;*aF089&+gs=2Ce!km_)lG|2iLggbXfrk&JnEb9HRdoKgT7iEL! zg}wEeIJ_@-U@C4dU?me&P*D=V?1DV; z_jKHW-U%zDnK=FkG|cWP`Nr~4Z=(7hdnK#9N*ORpnt7>HQfEI18}dw_y8ra3ReYMM zH%`FV_EImR&LuZb{^7%Dh;;J|K3nV_5J{p$A4FB8*U|f1jMi=^+W!aeWR|u0W1?y= zOn!gi+EOArgwP+qCcFUTy3|QIj|o~0ADn)Q8;9ywPRJ7FLfuN;P z$UusEWzZ>e(g7ip5}e6stv1VDU-lssae*0$5oz_iH4|&mdxR>e^wJfLK$*@hi7;XO z!di8ZwS_#e(>f_;;{`K7yC|^;dnM5`L$MVhWIz9K4gX|hLYX7?f-%xJ0qcM&{p$Gs zQ#&JxDXaKC^4n8v>f9dNLCS=-($R!T($>)s8RC)k5Y`w8y^Q~#e_IA>);bTwxjUD@!Vl~jobQ_vNuBR( zC*l9tLfu&k4p&QwFHu3*?*pdZKhhUqu9f*|6Qn;|bJPNSeYNa3g~^O?1TxAjk4dKOFpmwzn zbiZ^pML0^6SDYRQ{FlA%IJJ%WdO|X!7TA-hI?TA>fN3kCuaCVSHFjB$hOp+w$sj1* zV^;X^aa@S!?Di`dsZQYI+t2}O1(y|VW4sBCg-NZ4?_THKx<<#ODEy3?9BfIioX|RY z9G`>pVBvg^et@;K4j~UkJiV_#%I6YWfX#+Xr=yT6IK&O05aLHSsYQ(uDPk9!mN*!1 zA;pANlQK?|>bEv)S}6>Gj7%xfHl%NE_`x2tU|C3*F!!Toj2g4xivdH4=7PLtj?x;h zCv_Mu%@($KSi-beS8yfN(du%8mj1iSqRjrC_Rc&DL=wuJ=Tnjj^~7+mIME1G-0Hxq z_gX#owWSus%#*e9}SwBf0yDJ83NxqvL(~>Wiv6%3HS57 z&A~VEM|M#EtUG~@$2(|kiw3{5YN_ecS!qI1cp(3|QnyA&y=dmhO zx8=N&@VcbMcEQ=_Pf8()u9}xJV~;~3PEKdr+y3X$nBs^-tN=^|^n#fRi@q&B!QuAm zqX3fQ`~0kM6gCHO^VNWJ@Y!z#8gTzCI)CYgF@kokD<|C0oJ)A`mv)(wwG&5y^b)$k z6vJYmVY|)PGV@N$F#F`_^R~<3e`aK^gT1wr3yb8#(t5C-*+<_&$k|OD2ep@IElLQ?94T#lT|QbEuM+Crr)I zrTbv}`OHX>RS1J?$mCs{(d&xx`ivBblTaAgdiC2h9{0T3qw)^sd2A_bC>g<5_|Gxr zGo<)B(@plCoO{b@%l9?CeUEI!nyx&TG&#aoE<}%HStz(*ld+}otK$ZtC9BXsi=6*x z!J*Kar4VA)aQKt3*ra`Y_}}vo0d{H8M_YPIk<_t2+jhl>jq_tVU{F$A3o6KXPeTA8 zml`x&E{=C=a;_xmDkR?7lMWfaXnw^2$G~mRJc;2%3u5k{>lR8vfuG$H-HeRavaLeh z*4gomO6dmOAzBlhZXLd|)VVnh;}7Q)Jy-$_Zua3Of>S;A!8EyOXNT|4-vVzdiddz` z4#5ZmK7ry*&9x^!sD5mbO?pFkPlW)Y=HJj~2%CQYJY&IG;>f8+oj7rakvkiK@e!^W zgb!_^p-$XlavCjjJY>#|zaC*IMFjM~Y`2t!80)Yn!NfR4gdk zuI6}zYqPsEecO-kz5ko{^*8gM`M-4nNj{+<1nZ;bP4Sdt( zPhJ*spU<;8ByW2h(~-GskR6F4%e5SnJ9Ir>fP}8mn0D-?7l-xgu|$C*q)8WA5Bm9< z6=%_>1^9|`w`gn#*S5>EQ1I4x8x)}u(hB;^-^}Hd>&y+8FlqeuqfEH^V{rNt!G=lK zr>T`-ziF}lcn{^<6(4+^W$fyJPqv+`TLCJrMCYk_Up2R|vFv~@mr+Ju3Vl<#H9puJ zSQO~ZR2MgwQSfXic{o=ytOkxivW8g=r(mvw^OT}^OZS2RPU1NCk z5=t(jX#6ayp@go#L0iHM4;~Y^q3S>GYQ{S8V(w4}!51>AgC%4eXP!`)bwHE9nz{#_ zTQrK9UMxcT>9a-qE1sLW{W&Pb=0HYuGerHKrZ}G*#kq=#6ZpEB{O!@pOarHH11vnj zdOcviQt)+t-J&3_`BX`U%{Kp?s8dgi9^v(LVau2uJgQg zAhJ4W_&y4FF-5HBP{~BW8 zE#eXQadhtkLx8B`A>?M$qNkP!IAwD`Ni~K=-*-kKD_*7*T`I4w(7#MAd}0rZ$)c-7 zscHj)nXT+n^$&+Md&HR0M2{f(B}F3@x1_un1Bm{iTX$~F`a5;Qe(BVlG9R%#4Gx&u zO9Vl|JzuO&D-0+dUVcx+bN08sY++e}P2yu)kt5gvS&ii?j!6QkI-S0MZ~8Ej=W4KL zDZGwS+L*t@5_hLTc)w}GgIsm*Vn}M|inMB&FHf8!)^u)ukP*sGasVrdX&f+Qk|E8s zjgb$CXYexpVs5X4LOfh8fr^vJwON`{tKx8wVyjG;y+U82WwmN<$NdS?6~E;y_8+Oj z)X?P6WMP6Z;oRl{BF&xVjvyk4o`k_nFm+=7@SyrVZ{v_Wtf%p7j1Y+!&T;FSLcM5;Jv delta 47133 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 Ov#`Vb{w*pm2J;`0y%B8y diff --git a/doc/doc.tex b/doc/doc.tex index 412e9d4..e4c35b6 100644 --- a/doc/doc.tex +++ b/doc/doc.tex @@ -44,7 +44,7 @@ \makeatletter \begin{titlepage} - \def \LOGOPATH {brock.jpg} % Path to Brock logo + \def \LOGOPATH {brock.jpg} \def \UNIVERSITY {Brock University} \def \FACULTY {Faculty of Mathematics \& Science} \def \DEPARTMENT {Department of Computer Science} @@ -89,17 +89,34 @@ What if you wanted to make a robot to map out a room but you only had two wheels With only two wheels its purely dynamically stable, will fall over due to its own stupidity but its very cute while it does so! This little guy can wiz around at the speed of a snail your house and (poorly) map out a room to your hearts desire \section{Instructions} - +\begin{itemize} + \item Hold robot in a vertical upright position clear of obsticals + \item Place battery in top compartment + \item Plug battery in and wait for robot to initialize + \item Once robot has booted let go and step away + \item Connect computer to network \texttt{MEOW} + \item launch vidualization and control software +\end{itemize} \section{Problem Set} -\subsection{Keeping Upright} -\subsection{Keeping A Position} +\subsection{Balancing} +We have a vertical two wheeled robot I hope its fairly obvious when I say that it is only dynamically stable. This presents a challance because we need some system which keeps the system upright in a variaty of situations and responds dynamically to changes it cannot predict. +\subsection{Odometry} +Knowing that our system is very dynamic and having the forsight to know that we will need to keep in constant motion to keep upright the odometry system will need to handle that. +\subsection{Target Positions} +The problem of target positions like odometry is made more challenging due to the fact we are almost constantly in motion. We simply cannot "not move" when we are in the location we want to be as we'd fall over. This means the target position will need to be a "best effort" battle to keep in the same place as best as we can. \subsection{Communication} +The only source of computation used is a single \texttt{ESP8266} microcontroller, this in combination with the strict timing requirements on the duration of the control loop means the communication between the robot and the control/mapping software needs to be quick and efficient. \section{Approaches} +\subsection{Balancing} +\subsection{Odometry} +\subsection{Target Positions} +The target position +\subsection{Communication} \section{Challanages} @@ -110,7 +127,7 @@ Keeping track of our position and angle was another challange that required care \subsection{Target Positions} Because the robot is in constant motion keeping itself balanced without a "push" towards a single position it will drift around. To solve this we use the odometry system as a input to the movement system. By setting the desired heading of the robot to the vector from its position to the target position, and by biasing the direction the robot will travel to be the direction to the target position we get a crude way of staying in a single position. -\subsection{Efficient Communication} +\subsection{Communication} Since we have limited processing power and time per loop iteration we need to be smart in how we receive and transmit data to our mapping software. For this reason we designed a stateless UDP based network protocol overtop the esp8266 Wifi \& UDP libraries. \cite{wifi_lib} \section{Resources Used} @@ -121,6 +138,7 @@ Since we have limited processing power and time per loop iteration we need to be \item The AS5600 library was used to interface with the AS5600 magnetic encoders on each wheel. \cite{enc_lib} \item The MPU6050 library was used to interface and interpret the accelerometer and gyroscope data. \cite{gyro_lib}. It required modification to work with our hardware as it was a knockoff and the device ID was different than what it was expecting. \item A blog by the author of the PID library used was very helpful when tuning and configuring the PID controls in the robot. \cite{pid_help} + \item A paper on odometry for robots with differential steering which we based our odometry system off of. \cite{odom_help} \end{itemize} diff --git a/doc/doc.toc b/doc/doc.toc index 3331470..1029d72 100644 --- a/doc/doc.toc +++ b/doc/doc.toc @@ -1,13 +1,18 @@ \contentsline {section}{\numberline {1}Introduction}{2}{section.1}% \contentsline {section}{\numberline {2}Instructions}{2}{section.2}% \contentsline {section}{\numberline {3}Problem Set}{2}{section.3}% -\contentsline {subsection}{\numberline {3.1}Keeping Upright}{2}{subsection.3.1}% -\contentsline {subsection}{\numberline {3.2}Keeping A Position}{2}{subsection.3.2}% -\contentsline {subsection}{\numberline {3.3}Communication}{2}{subsection.3.3}% -\contentsline {section}{\numberline {4}Approaches}{2}{section.4}% -\contentsline {section}{\numberline {5}Challanages}{2}{section.5}% -\contentsline {subsection}{\numberline {5.1}Balancing}{2}{subsection.5.1}% -\contentsline {subsection}{\numberline {5.2}Odometry}{2}{subsection.5.2}% -\contentsline {subsection}{\numberline {5.3}Target Positions}{3}{subsection.5.3}% -\contentsline {subsection}{\numberline {5.4}Efficient Communication}{3}{subsection.5.4}% -\contentsline {section}{\numberline {6}Resources Used}{3}{section.6}% +\contentsline {subsection}{\numberline {3.1}Balancing}{2}{subsection.3.1}% +\contentsline {subsection}{\numberline {3.2}Odometry}{2}{subsection.3.2}% +\contentsline {subsection}{\numberline {3.3}Target Positions}{3}{subsection.3.3}% +\contentsline {subsection}{\numberline {3.4}Communication}{3}{subsection.3.4}% +\contentsline {section}{\numberline {4}Approaches}{3}{section.4}% +\contentsline {subsection}{\numberline {4.1}Balancing}{3}{subsection.4.1}% +\contentsline {subsection}{\numberline {4.2}Odometry}{3}{subsection.4.2}% +\contentsline {subsection}{\numberline {4.3}Target Positions}{3}{subsection.4.3}% +\contentsline {subsection}{\numberline {4.4}Communication}{3}{subsection.4.4}% +\contentsline {section}{\numberline {5}Challanages}{3}{section.5}% +\contentsline {subsection}{\numberline {5.1}Balancing}{3}{subsection.5.1}% +\contentsline {subsection}{\numberline {5.2}Odometry}{4}{subsection.5.2}% +\contentsline {subsection}{\numberline {5.3}Target Positions}{4}{subsection.5.3}% +\contentsline {subsection}{\numberline {5.4}Communication}{4}{subsection.5.4}% +\contentsline {section}{\numberline {6}Resources Used}{4}{section.6}% diff --git a/doc/references.bib b/doc/references.bib index 01e33a1..43f82e6 100644 --- a/doc/references.bib +++ b/doc/references.bib @@ -32,4 +32,13 @@ author = {{Brett Beauregard}}, date = "June 20, 2017", note = "\url{http://brettbeauregard.com/blog/2017/06/introducing-proportional-on-measurement/}", +} + +@misc{odom_help, + key = "odom_help", + title = {{A Tutorial and Elementary Trajectory Model + for the Differential Steering System + of Robot Wheel Actuators}}, + author = {{G.W. Lucas}}, + note = "\url{https://rossum.sourceforge.net/papers/DiffSteer/}", } \ No newline at end of file diff --git a/jdbg/src/Gui.java b/jdbg/src/Gui.java index cebeede..deff08e 100644 --- a/jdbg/src/Gui.java +++ b/jdbg/src/Gui.java @@ -4,6 +4,8 @@ import java.awt.event.*; import java.net.SocketException; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; public class Gui extends JFrame implements KeyListener, MouseWheelListener { private VisualPanel visualPanel; @@ -48,12 +50,11 @@ public class Gui extends JFrame implements KeyListener, MouseWheelListener { new Thread(() -> { while(true){ - try{ - visualPanel.updateData(robot.getDataPlus().await(1000)); - Thread.sleep(20); - }catch (Exception e){ - e.printStackTrace(); - } + try{ + visualPanel.updateData(robot.getDataPlus().await(1000)); + }catch (Exception e){ + e.printStackTrace(); + } } }).start(); diff --git a/jdbg/src/PidPanel.java b/jdbg/src/PidPanel.java index bc90969..4a7834e 100644 --- a/jdbg/src/PidPanel.java +++ b/jdbg/src/PidPanel.java @@ -9,8 +9,8 @@ public class PidPanel extends JPanel { String[] pidNames = {"angle", "pos", "turn"}; JComboBox indexDropdown = new JComboBox<>(pidNames); - JSlider kpSlider = new JSlider(0, (int)(SCALE*10), 0); - JSlider kiSlider = new JSlider(0, (int)(SCALE*150), 0); + JSlider kpSlider = new JSlider(0, (int)(SCALE*1), 0); + JSlider kiSlider = new JSlider(0, (int)(SCALE*1), 0); JSlider kdSlider = new JSlider(0, (int)(SCALE*2), 0); JLabel kpValue = new JLabel("0.00"); diff --git a/robot/distance.cpp b/robot/distance.cpp index bdf77bd..923fe2f 100644 --- a/robot/distance.cpp +++ b/robot/distance.cpp @@ -19,5 +19,7 @@ void updateDistance(){ // if(distanceReading>2000){ // distanceReading = (float)NAN; // } + }else{ + distanceReading = 8000; } } diff --git a/robot/pid.cpp b/robot/pid.cpp index b337233..a756035 100644 --- a/robot/pid.cpp +++ b/robot/pid.cpp @@ -1,14 +1,9 @@ #include "headers.h" #include -//double angKp=3.5, angKi=80, angKd=0.042; -//double posKp=20, posKi=0.0, posKd=0.0; -//double turnKp=2, turnKi=0.0, turnKd=0.0; - - -double angKp=4, angKi=60.0, angKd=0.0958; -double posKp=0.5, posKi=0.0, posKd=0.5; -double turnKp=1.25, turnKi=3.0, turnKd=0.0; +double angKp=0.0444, angKi=0.6666, angKd=0.001; +double posKp=0.8, posKi=0.2, posKd=1; +double turnKp=0.014, turnKi=0.0333, turnKd=0.0; double angleInput, angleOutput, angleSetpoint; @@ -22,20 +17,22 @@ PID turnPID(&turnInput, &turnOutput, &turnSetpoint, turnKp, turnKi, turnKd, P_ON PID* pids[PID_ARR_COUNT] = {&anglePID, &posPID, &turnPID}; +const float MAX_TURN_SPEED = 0.15; + void initPID(){ angleSetpoint = 0; - anglePID.SetOutputLimits(-180, 180); + anglePID.SetOutputLimits(-1, 1); // speed forward/backward anglePID.SetMode(AUTOMATIC); anglePID.SetSampleTime(5); posSetpoint = 0; - posPID.SetOutputLimits(-2, 2); + posPID.SetOutputLimits(-2, 2); // degrees forward/backward posPID.SetMode(AUTOMATIC); posPID.SetSampleTime(5); posPID.SetControllerDirection(DIRECT); turnSetpoint = 0; - turnPID.SetOutputLimits(-15, 15); + turnPID.SetOutputLimits(-MAX_TURN_SPEED, MAX_TURN_SPEED); // speed forward/backward turnPID.SetMode(AUTOMATIC); turnPID.SetSampleTime(5); } @@ -47,7 +44,7 @@ Speeds updatePID(){ anglePID.Compute(); turnSetpoint = 0; - float maxTurn = max(0.0f, 25.0f-abs((float)angleOutput)); + float maxTurn = max(0.0f, MAX_TURN_SPEED-abs((float)angleOutput)/90); turnPID.SetOutputLimits(-maxTurn, maxTurn); turnPID.Compute(); diff --git a/robot/robot.ino b/robot/robot.ino index 77c2554..5ae7c8c 100644 --- a/robot/robot.ino +++ b/robot/robot.ino @@ -1,5 +1,5 @@ #include "headers.h" -#define PWM_FREQ 400 +#define PWM_FREQ 450 void wire1(){ Wire1.begin(SDA, SCL); @@ -54,6 +54,10 @@ void setup() { initGyro(); } +float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} + void loop() { long start = millis(); @@ -81,14 +85,11 @@ void loop() { long pid = millis(); - speeds.left = min(90.0f-10, max(-90.0f+10, speeds.left)); - speeds.right = min(90.0f-10, max(-90.0f+10, speeds.right)); - const int MAX_FOR = (int)(0.0010/(1.0/PWM_FREQ)*255); const int MAX_REV = (int)(0.0020/(1.0/PWM_FREQ)*255); - analogWrite(D3, map((int)speeds.left, 90-10, -90+10, MAX_REV, MAX_FOR)); - analogWrite(D4, map((int)speeds.right, 90-10, -90+10, MAX_REV, MAX_FOR)); + analogWrite(D3, mapfloat(speeds.left, -1, 1, MAX_FOR, MAX_REV)); + analogWrite(D4, mapfloat(speeds.right, -1, 1, MAX_FOR, MAX_REV)); long end = millis(); diff --git a/robot/webserver.cpp b/robot/webserver.cpp index 560c6fc..59721e6 100644 --- a/robot/webserver.cpp +++ b/robot/webserver.cpp @@ -6,233 +6,71 @@ WiFiUDP Udp; unsigned int localUdpPort = 42069; - -#ifdef DO_WEB_SERVER - -#include -#include -#include -#include -#include - -#include "page_html.h" - -AsyncWebServer server(80); - - -void initWebServer(){ - server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ - request->send_P(200, "text/html", index_html); - }); - server.on("/get_stuff_bin", HTTP_GET, [](AsyncWebServerRequest *request){ - static float arr[4]; - arr[0] = odom.angle; - arr[1] = distanceReading; - arr[2] = odom.x; - arr[3] = odom.y; - request->send(200, "application/octet-stream", (uint8_t*)(const char*)arr, sizeof(arr)); - }); - server.on("/fuckyou", HTTP_GET, [](AsyncWebServerRequest *request){ - float arr[] = { - odom.angle, - distanceReading, - odom.x, - odom.y - }; - request->send(200, "application/text", "hello"); - }); - server.on("/zero", HTTP_GET, [](AsyncWebServerRequest *request){ - zeroOdom(); - request->send(200); - }); - server.on("/get_stuff", HTTP_GET, [](AsyncWebServerRequest *request){ - char buff[1024]; - int ret = snprintf(buff, sizeof(buff), - R"({ - "motorTargetAngle": %f, - "distanceReading": %f, - "position": %f, - "anglePID": {"setpoint": %lf, "input": %lf, "output": %lf}, - "posPID": {"setpoint": %lf, "input": %lf, "output": %lf}, - "turnPID": {"setpoint": %lf, "input": %lf, "output": %lf}, - "odom": {"left": %f, "right": %f, "x": %f, "y": %f, "angle": %f}, - "ypr": {"yaw": %f, "pitch": %f, "roll": %f}, - "euler": {"psi": %f, "theta": %f, "phi": %f}, - "gravity": {"x": %f, "y": %f, "z": %f}, - "q": {"w": %f, "x": %f, "y": %f, "z": %f}, - "aa": {"x": %hd, "y": %hd, "z": %hd}, - "gy": {"x": %hd, "y": %hd, "z": %hd}, - "aaReal": {"x": %hd, "y": %hd, "z": %hd}, - "aaWorld": {"x": %hd, "y": %hd, "z": %hd} - })", - (float)dbgState.motorTargetAngle, - (float)distanceReading, - 0.0, //encoder.position(), - angleSetpoint, angleInput, angleOutput, - posSetpoint, posInput, posOutput, - turnSetpoint, turnInput, turnOutput, - odom.left, odom.right, odom.x, odom.y, odom.angle*180/M_PI, - ypr[0]*180/M_PI, ypr[1]*180/M_PI, ypr[2]*180/M_PI, - euler[0]*180/M_PI, euler[1]*180/M_PI, euler[2]*180/M_PI, - gravity.x, gravity.y, gravity.z, - q.w, q.x, q.y, q.z, - aa.x, aa.y, aa.z, - gy.x, gy.y, gy.z, - aaReal.x, aaReal.y, aaReal.z, - aaWorld.x, aaWorld.y, aaWorld.z - ); - request->send(200, "application/json", buff); - }); - server.on("/get_pid", HTTP_POST, [](AsyncWebServerRequest *request){}, NULL, - [](AsyncWebServerRequest *request, uint8_t *bodyData, size_t bodyLen, size_t index, size_t total) { - StaticJsonDocument<256> json; - deserializeJson(json, &bodyData[index], bodyLen); - int idx = json["index"]; - if(idx>3){ - request->send(400); - return; - } - PID& pid = *pids[idx]; - char buff[256]; - int ret = snprintf(buff, sizeof(buff), - R"({"kp": %lf, "ki": %lf, "kd": %lf, "direction": %d})", - pid.GetKp(), pid.GetKi(), pid.GetKd(), pid.GetDirection() - ); - request->send(200, "application/json", buff); - }); - - server.on("/set_desired_pos", HTTP_POST, [](AsyncWebServerRequest *request){}, NULL, - [](AsyncWebServerRequest *request, uint8_t *bodyData, size_t bodyLen, size_t index, size_t total) { - StaticJsonDocument<256> json; - deserializeJson(json, &bodyData[index], bodyLen); - desiredPos.x = json["x"]; - desiredPos.y = json["y"]; - - request->send(200); - }); - - server.on("/set_pid", HTTP_POST, [](AsyncWebServerRequest *request){}, NULL, - [](AsyncWebServerRequest *request, uint8_t *bodyData, size_t bodyLen, size_t index, size_t total) { - StaticJsonDocument<256> json; - deserializeJson(json, &bodyData[index], bodyLen); - int idx = json["index"]; - if(idx>3){ - request->send(400); - return; - } - - PID& pid = *pids[idx]; - if(json.containsKey("kp")) - pid.SetTunings(json["kp"], json["ki"], json["kd"]); - if(json.containsKey("direction")) - pid.SetControllerDirection(json["direction"]); - - request->send(200); - }); - - server.on("/set_desired_yaw", HTTP_POST, [](AsyncWebServerRequest *request){}, NULL, - [](AsyncWebServerRequest *request, uint8_t *bodyData, size_t bodyLen, size_t index, size_t total) { - StaticJsonDocument<256> json; - deserializeJson(json, &bodyData[index], bodyLen); - desiredYaw = json["yaw"]; - Serial.print(desiredYaw); - request->send(200); - }); - server.begin(); -} - -#endif - void initServer(){ - #ifdef DO_WEB_SERVER - initWebServer() - #endif - Udp.begin(localUdpPort); } -struct ZeroPacket{ - static constexpr uint32_t ID = 0; -}; -struct GetDataPacket{ - static constexpr uint32_t ID = 1; -}; -struct SetTargetPacket{ - static constexpr uint32_t ID = 2; - FVec2 pos; -}; -struct EverythingPacket{ - static constexpr uint32_t ID = 3; -}; -struct GetDataPacketPlus{ - static constexpr uint32_t ID = 4; -}; -struct GetPIDPacket{ - static constexpr uint32_t ID = 5; - uint32_t index; -}; -struct SetPIDPacket{ - static constexpr uint32_t ID = 6; - uint32_t index; - float kp,ki,kd; - uint32_t direction; -}; - -struct Packet{ - uint32_t sequence; - uint32_t id; - union{ - ZeroPacket zero; - GetDataPacket get_data; - SetTargetPacket set_target; - EverythingPacket everything; - GetDataPacketPlus get_data_plus; - GetPIDPacket get_pid_packet; - SetPIDPacket set_pid_packet; - } data; -}; - -struct DataPacket{ +// ---------------- response packets +struct DataPacketResponse{ float yaw; float distance; FVec2 position; }; -struct DataPacketPlus{ +struct DataPlusPacketResponse{ float yaw; float desiredYaw; float distance; FVec2 position; FVec2 targetPosition; }; +// ---------------- response packets -void respond_data_packet(){ - DataPacket dp; +struct ZeroPacket{ + static constexpr uint32_t ID = 0; + + void handle(){ + Udp.write((const char*)&ID, sizeof(ID)); + zeroOdom(); + desiredPos.x = 0; + desiredPos.y = 0; + } +}; +struct GetDataPacket{ + static constexpr uint32_t ID = 1; + + void handle(){ + Udp.write((const char*)&ID, sizeof(ID)); + + DataPacketResponse dp; dp.yaw = currentYaw; dp.distance = distanceReading; dp.position.x = odom.x; dp.position.y = odom.y; Udp.write((const char*)&dp, sizeof(dp)); -} + } +}; +struct SetTargetPacket{ + static constexpr uint32_t ID = 2; + FVec2 pos; + + void handle(){ + desiredPos.x = this->pos.x; + desiredPos.y = this->pos.y; + + Udp.write((const char*)&ID, sizeof(ID)); + } +}; +struct EverythingPacket{ + static constexpr uint32_t ID = 3; -void respond_data_packet_plus(){ - DataPacketPlus dp; - dp.yaw = currentYaw; - dp.desiredYaw = desiredYaw; - dp.distance = distanceReading; - dp.position.x = odom.x; - dp.position.y = odom.y; - dp.targetPosition.x = desiredPos.x; - dp.targetPosition.y = desiredPos.y; - - Udp.write((const char*)&dp, sizeof(dp)); -} + void handle(){ + Udp.write((const char*)&ID, sizeof(ID)); -void respond_everything_packet(){ float everything[] = { - (float)dbgState.motorTargetAngle, + (float)dbgState.motorTargetAngle, (float)distanceReading, 0.0, //encoder.position(), angleSetpoint, angleInput, angleOutput, @@ -250,32 +88,82 @@ void respond_everything_packet(){ }; Udp.write((const char*)everything, sizeof(everything)); -} - -void set_pid(SetPIDPacket spid){ - if(spid.index>PID_ARR_COUNT){ - return; } - - PID& pid = *pids[spid.index]; - pid.SetTunings(spid.kp, spid.ki, spid.kd); - pid.SetControllerDirection(spid.direction); -} +}; +struct GetDataPlusPacket{ + static constexpr uint32_t ID = 4; -void get_pid(GetPIDPacket gpid){ - if(gpid.index>PID_ARR_COUNT){ - return; + void handle(){ + Udp.write((const char*)&ID, sizeof(ID)); + + DataPlusPacketResponse dp; + dp.yaw = currentYaw; + dp.desiredYaw = desiredYaw; + dp.distance = distanceReading; + dp.position.x = odom.x; + dp.position.y = odom.y; + dp.targetPosition.x = desiredPos.x; + dp.targetPosition.y = desiredPos.y; + + Udp.write((const char*)&dp, sizeof(dp)); } - PID& pid = *pids[gpid.index]; - struct {float kp,ki,kd; uint32_t direction;} pidData = { - .kp=pid.GetKp(), - .ki=pid.GetKi(), - .kd=pid.GetKd(), - .direction=pid.GetDirection() - }; - - Udp.write((const char*)&pidData, sizeof(pidData)); -} +}; +struct GetPIDPacket{ + static constexpr uint32_t ID = 5; + uint32_t index; + + void handle(){ + if(this->index>PID_ARR_COUNT){ + uint32_t e = -1; + Udp.write((const char*)&e, sizeof(e)); + return; + } + + Udp.write((const char*)&ID, sizeof(ID)); + PID& pid = *pids[this->index]; + struct {float kp,ki,kd; uint32_t direction;} pidData = { + .kp=pid.GetKp(), + .ki=pid.GetKi(), + .kd=pid.GetKd(), + .direction=pid.GetDirection() + }; + + Udp.write((const char*)&pidData, sizeof(pidData)); + } +}; +struct SetPIDPacket{ + static constexpr uint32_t ID = 6; + uint32_t index; + float kp,ki,kd; + uint32_t direction; + + void handle(){ + if(this->index>PID_ARR_COUNT){ + uint32_t e = -1; + Udp.write((const char*)&e, sizeof(e)); + return; + } + Udp.write((const char*)&ID, sizeof(ID)); + + PID& pid = *pids[this->index]; + pid.SetTunings(this->kp, this->ki, this->kd); + pid.SetControllerDirection(this->direction); + } +}; + +struct Packet{ + uint32_t sequence; + uint32_t id; + union{ + ZeroPacket zero; + GetDataPacket get_data; + SetTargetPacket set_target; + EverythingPacket everything; + GetDataPlusPacket get_data_plus; + GetPIDPacket get_pid_packet; + SetPIDPacket set_pid_packet; + } kind; +}; bool handleUDP(){ int size = Udp.parsePacket(); @@ -290,33 +178,15 @@ bool handleUDP(){ Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write((const char*)&packet->sequence, sizeof(packet->sequence)); - Udp.write((const char*)&packet->id, sizeof(packet->id)); switch(packet->id){ - case ZeroPacket::ID: - zeroOdom(); - desiredPos.x = 0; - desiredPos.y = 0; - break; - case GetDataPacket::ID: - respond_data_packet(); - break; - case SetTargetPacket::ID: - desiredPos.x = packet->data.set_target.pos.x; - desiredPos.y = packet->data.set_target.pos.y; - break; - case EverythingPacket::ID: - respond_everything_packet(); - break; - case GetDataPacketPlus::ID: - respond_data_packet_plus(); - break; - case SetPIDPacket::ID: - set_pid(packet->data.set_pid_packet); - break; - case GetPIDPacket::ID: - get_pid(packet->data.get_pid_packet); - break; + case ZeroPacket::ID: packet->kind.zero.handle();break; + case GetDataPacket::ID: packet->kind.get_data.handle();break; + case SetTargetPacket::ID: packet->kind.set_target.handle();break; + case EverythingPacket::ID: packet->kind.everything.handle();break; + case GetDataPlusPacket::ID: packet->kind.get_data_plus.handle();break; + case SetPIDPacket::ID: packet->kind.set_pid_packet.handle();break; + case GetPIDPacket::ID: packet->kind.get_pid_packet.handle();break; } Udp.endPacket(); return true;