From 0bd96dd219d5db9e84f388e2bae1ea0a933ef07a Mon Sep 17 00:00:00 2001 From: Bausager Date: Mon, 8 Sep 2025 20:24:51 +0200 Subject: [PATCH] Reworking vector class with core funtionality --- bin/abc_lab | Bin 60592 -> 44456 bytes include/utils/Grid1D.h | 39 +++++++ include/utils/matrix.h | 9 +- include/utils/utils.h | 1 + include/utils/vector.h | 241 +++++++++++++++++++++++++++++------------ obj/main.o | Bin 122104 -> 75208 bytes src/main.cpp | 52 ++++----- 7 files changed, 236 insertions(+), 106 deletions(-) create mode 100644 include/utils/Grid1D.h diff --git a/bin/abc_lab b/bin/abc_lab index 2300648bf06e1f72fe27660895478dbc0cad333c..1dcbf55f9358a5ff999b6e295c2b9114dbb86694 100755 GIT binary patch literal 44456 zcmeHweSDPFmH(5FKtP0OL8)4a7P}}A^9BaR8eRq`LNJoV#ut1TCKEE6w@xMy6g3*L zOk@0It+;OMqP4cAt*flnU3^DGg4Wv9mzKI#Q;K#XXj4lyYh7l)=iGCj=b2}o3F7WQ zzt4w9!+GvG=bn4+x#ymH?wx1mxzV?Dab`w_p|4TK*9|Il9#lk;}pG20Z`SoCo>u52!0eG)tf>$9`F=}HZ;^45~ONIf@Pq?$K0q&DcPdN*44McS*Bdi%tVZkQzvSWq=* zT!MOJm(P2NIgRDgUb=B``=9o+vm3*!=9HY>SU0ON+}z$VtD|(ztT`q5Z7umltOBW- zhd=VE3zyXx7>@0P6Ehl_ovN(m5p9ytiN9^^e_sBjC$HXAmfiK;k0)$6Z|(FCo*^F6 zo9Yk`T_jJ2+A5!nJK|CH_($B2HwZ`9SMb*#dZp>-Zxz2W`R?%x8R_xQAaF9plc@ie z2A_!rz4+Ip;Xf-4|Kc?KQ_x8-`80jJ@HJ`pZ%@;EzM}FY8o@TxyUm(_G!u(rmUx1Cgj{8fJNQg;^JhgjR>!qM=B2#lpsx=1_HD zRbxoeyeXGgMT-hdGujYoS!*_inpZ~~%upoK5~*AgG|bEE8Y|Z{0WPa*X>9Y=38YO}h)^i|D)f)E07 zq`f&BZVIVJ78d$cJ4$}#;^kE>Ri+Pp3w8vQQru+WIa8m?B%+^q( zt))587>=$p*A#g6VNszE++@enBqbw}z&f)zq^+uW8rw+0&tbP@=#lQ6a0a^CU}h*Y`Dg(4}=?yrchH; z%NioU2to0wra%}rQsTm7gKI+u$ZgTO;EWlx0L-D{>LB>3R7jp;???U|hJg ze8EDqD8IzIE4FWo@@Fe_Z7rBf@{5a%g|)Tw7nGZY`NjEjlW0YA9kgUhp|eO6BNJ;y z7XHD*{fi=lI?DKt z(96I-DI7+oHP-l{;2!dYC~VO4!p`=6lJ9YPi^a~!GYIfL$p>0ew=0o>~P@WP}bGyz>l}EhOyCsm#qU+ zdmZ?R4*t6xc%5Ss`925!I0ye02VPu_saqX*$_w?i&4HJ#1(UWr@Oq8Zb&kTL7WkqT z`0K<|KlOJV$nke)|DnY&{2R7MGZX#(uAMp0v&h8kOrR5IWZ~b5Q_BqEZy?Ix-b5l% z-^*nR6oaqYWeO03JM1zAhQUYdG6l@R`|UCXh`~GTG6jago9!|Mgu#eira&;b$}Ur& z9b9ggDIg3ku*(z(28--61%ScR?J`aL!Q<^R1?a&{yG#LK@S{Uke`(?m?zPJ_;Rj!} z%84_Yn+>CW;?zY3+beO#E7;9D%e!3VXI$lfca?+s0%2&C{m%7T!T;;_{<-!ljW52%2AKUBi+BZ~L?JL|~_@ck({Fh+W#N=YI z9<0xwIQ143;h;U|2Y~VSWM58T?r?N6T=!JEhwF|_3{0HbNqo->1b-p(&pwO5nTPzb zA^&q9Uf_Rjc$7b5m;cv?qLU!tgGMDFCo!PLN!KU;?mYhtjHl5)qsHHL{vF^n{IPeV zy6i_No5hS`g``2KDAwSNU%`K--zv(+5z~AA4*7 zpw8c&b;fiS?TZ&~_xEfV0=9c{$@w%A%{!ikmml_D@6P`rn0}s zw-rRj_Ehu=<)0O$->O!zRVaf@sR3mJ^+TE&gaII_pQJvm?opvH{%`6YV*BDhUmCju^YMOTxrOre08Q@!t#DlNdPkcLO&FANW3I7K)YZIeqavRFS$x z9@3?Xxl)X(qH@^2cnHPV9)EWY4fZ6SjuUS=8OXuo@DI&k_702^M3n-ye~gV}!+w>J zml3i&wv)VPDY~>Y_Q(A`n~`gO3awLWze~uI9knM&ZMzw(pN}UCusZyG7hd-~=E7?e zeA9*3wzv#6;a>K1sWXRA_wC%nZ;uR_8!og0d^5BzoFalW@yi+%AY$gimNo*LjP24oWb0uAgx zReJzy*B7T#O)@aL{ik87w!+ny0yF_<^f5~b1&{6;l$Rq{s{kD9k5!#XxDVEF6A+#DFR z;$>EY=&C=rD;nsvzL&vZ_`7@q8DJXlpXZB59@~GCW77QYW14cP+84i_6zJMnz}}ha zb;?EICuBrcq74l>Y?U<9urI+QZ|(s5r0=j|HGuqCJQ!2r!^+Xq{z=<>n04w5Cw2cIam{Ores z?9R>&5{7*6)Rh+Py1%ie?Bf|Me*_=A2n^|baGaune&ykPum&254~`=RQhe}mo>j>P zPV%g0y*%p?#9{HQ@3R%iPrM?@|I)J#{*}$>58$%M2&5GAmH*i{FXm&MDDj3{}(rf%t~N zG%)cFik|0djqW2f2esGyXHukPJ^fgnD30K-kt|d9b+`VMn#5NG=De3POmcz?x8Ta;%@Y!m&`Mb?dIEpT=&N?!xlu%t?+NM2v#NWj+fx`5~_hYgXHyqfoR+x(#ZfR59aH*Jx;fX zPvxFSx2_)|Mf>6}0O~5D)ihaC;5W`1OQgnk0OMb$Lf6h(tbg-YI0nRW25U_uUvBWS zI&DU&7d^g*Wrh12+o|SZp!x+ho%+fgeetbuBxSnp8VnTA{~~1zY<;XMQyHa(@*CV0 znh|VoKNo2fS9p!)ZZgO)4oxwhvLW0h>z-}m?D&E|Q^cZBsOJFnu@rsW1JCNG5g|dx zSZ$*-eet(xXQ$VkG21XFjQuwvXNmLOWn2sU1L@a#oIE+!3*b4M;yxdOB+!Un@$$s{ z-4nmN{Rt$>2HpC0ATEgX(~!%=XUp#m}miXlCd56lFU zvh?^5p?{xmnAN=kbnw&+3-OoO%ys8dB|1`|?mqni83|0d&!DEepvqj|u*&;R5c#*; z@*kuMUA|!}k@yAe&!`5)y7t?phH2NhRyC2la^ztc;<5I9%#OA<@OBU(q|Z0Rs?TDI zotWJQ2C{Vh#6NHU>%_Bs`;ZDgCz;?7DKmtCI~;j2DbE)-_xF)Vn33d{!3NenpWyc< zPYe{TSpi#@Sq>Ac+3oMTzTb!zKoSNErsvT{)7=O&DhnS*a!zFo53e8B;_T3=lREwx zAQfUyPv!{oLs$FYu`w}H4P-n;}e z(ci6(L%Mso4$l`>Y${w=PoEQUVCs*lt!1~8h%tGX+KQ<|f}TyRWYUSuCnO=Zp@Y*9>+eJ*VV4B;0Q?w36mZ z$cI1n^o50WlCL?<;#mf|r;wUpi8*SHF5iBc7?3p)olAhGqQIM5lq8S9fJoJPIOJ?b0$ zgt29>71=R$GSS_`V=emiOfH*F&clsOrryLh)GCRU1ZF7toRn=?>1=8fv#D4&pei;f zI)m7TQU^Ci_%m7=cpz9z&!i0)DC!Ecv$M$rQT_v$t0c|)Sdj2eCz&)Ow6IO8&Bs{T zZlx^f_b7!#g(*~voIAs<)M`tPVtvf7lxA^|Q=KG7w_eDL+$OestY#xdjjP3ImBqqI zt8KS$qlEfxY84jmQ6AR4Jl8)%)qn0&%(5OOiU(mF1z_zxs(Z0q8^Lqb0X5UdTJS z9_0>dhGx9v?-{>IjgnFtm~O?=Q_`adJv>+$f5CaleMl0wz*<|O$QD=&WnQbl4UP9B zPq(Ju3%r*SJJcWx*`zE`vmLc}qxN>x-X^t|qBd-=ZOsPiR;?-z|5pllSQDJ-$q&%Y z_(S+dEEV5D{Z2h_yN=O)@#g_)fRlt=MZ}wS4xppS2XJbC1z!781$~OpgHi0E%@X&# zjE-w*^+cB7Oe3=(+0LA>4i;GJAT53r=w~38;~9$dq3ikqBf1EJ5XbxC-{Q@pby$VO zD(y)Xt-#bRat-iR<~UAY&}uGP9Y&@@`r(hZWvup3aiZYlw75ptg;+_iGasBzi3q1s ze7ZwxI`meJ)T%SL0kjJiZnqn#l+&H{`_;&y=U;i3M%umq&Z9dCI~uN^5bvMCq+cVu0u1kPBgsU7E`qFl>GCyXZ3?HXSyk zDm5ZVV+N_TFXvHCmf{#)8aIrvvhwc`Eu5q4@IJQ{dsOZ^mSZDEj>|k$&rrxAr(&mM z)Xxaj0|o6Y{cdUsWpaM&s08q(Pn;b6RoNvpB&u;+x~- zX4bjEX4Fypi{nPIb=_W90F@z4P03}d1(Znv8X62T+0Hpc%q*Qb78RUhpmS-E?R=Rm zGsT)gJk)*h>!GZl_sJ077pIR->6`_J8fRKZEh+o5>6R2SL9BvI!_{A;&mHYvKf%R5 zdth-|0;zAuhl${td7o>>b1Q#NZe@UrNZ-hKB;FtURs8o>3p#+H_j%BJm;)3|pVX;y zg3FBV8r~D`c+|3^FIm}-cHkE6+cA3EoRfg}=d}I6CkiyiY$`4m(pK=y=gIJN1TuGr zI*!UiDQOY;@&HX;TFv_6J@4>6*Z&J`+-z}sxd?;wz<+zlFg&N8XR8?g3?MLKyc6n+ zKSsz?=O+-}IKo75-O0W~l%>o;p#Xl$FCmj`HO{zm?i9jI;|rWXC+RvrD$JJ(*L2XCr*W z(bJSTB>JS}1U+P{zW4>~TG)76nkfu*I5|yQ0gW9EeZJ^2^)TA0Ggy1N@uEboiTnmt z)uAV*TwipK?(>=$l7Qciw6lBc z;dFC5XKMF8f&VzX*&d3aq%K;q23_4FDUk28{j}7?QS^N#=YnxsT;jCowD0S6&fvpq zvN>53bqu)MJ<8i)HoB%FTKA)^-GCJEFgMVyUY;y2q`)!Eg&ue+Z;N^T{3cpbQ8;P; zb;}-?YZN4{S4#G<-;ymKH%NYh^sF9+<`6E{7Mc)udaHRZun%|@$ zEiLdFUW4vUuB=<)X->19SH!flo!FD6*9f8VBOIqYLglw;ob6EAfubEMyP4<=m7nlo zyem|u9h~*a!kf708k`#lnUr^9sNG&QfL(oDcJ)}zt{={rc<*-QRM8?fkG*ORTPL@w zr3?bFGad{1ReawY^cVz7Xg?8nxP0Yj7X7#Jt5_SD+j;uC$Dh$}yP_Itl+~q2cmOhnsunaL;XE<>XOXnY9N<=t%vIL#p#(WOvMp2NDWzgP$#KE zlEec%OZwuy!_GN2g3~;WkMkW)^ALZ!Z*BSRMbUPe2Uxh%X?761$NH*t(pemO`dw6| zz)9AkV2NbQ&XrP}JY^tK&2R;qAw>qP>4@Bij|KOzn54BhX}TSu$DYRCV0kPKp*X{4 z?^yU69P}jRpkETt*&})2VzMkbl2sM{>++n#MX57VyCMUSWcVcW9La1Psc)-aP2ab7 z>GMvnzR8&_eHXxb`X7BbdL6aEQ41Wkz)=evwZKse9JRnv3mmn;Q41Wkz)=evwZKse z{C{tO4Ek(^uK9I!VfuNXyy{R}G;h||^A_V5azb@RRr@OZ(orz##;aOJdo*-Kj5Q)4+6dgIQm6A#)c1}b6!d$rUMoM`T_3&Yy~_B*b7+ji$r28;8lSA zfZqlj0=(_zL}Ch_(fSyWp4D3R%S2)&;I{!g0bd5Z5AYD+cECz}ltbSo{tPe&4>C^p z71{-y3Frr`25bQA0Ne<8Kj0R?vA<3vUI#n{@F1XpBcv&K3~?9WJiv`OF1r$N2#}t7 zKmGMYf*yA)0(=Va7QnXv-+wca$im~q=l*9RF%57lpdau}zy`oWfExjG@xkR5z%_vV zfI9$(0FTG1eJ*{$0I&e?cEC!&ZGf$SrEkMtfCm5{1)TQ|^aflGco6Vzz)9nwCtxXH zCLV661-t}sJzy8$J%HN)p8|a94~fJ8;Mlzwr(+FcCEzr`n*bL9-U(O-_$J^jfF*b| z=mEeQz@31%1MUOd2ADO$Fg^vG23UaStQG+-2CM_T6z~?n4!{QhzYVw(@DG6d08hY! zV_A4sd^+GXz`N){GQiz{4Sb9q|;s{nTc-U}E9><7%j!*qKArvn}Y^aGCm z6Y2vN18xLt1l$661K@7JhXLb&F97D?cPw(^s1G<7&=2?oU<2T^LDUCq1AGwh0l=35 z-vB%Sc>Mc`#CUw`bUxrrz$(C{fX@N80_NfwxjO+L27Hvt2QY4cg@6YER{>7K59DkF zECKu&uom!ZA0!eTfTe(U16~cd4e&<5J%C#QhXHp0PQiCVF2X}ErGVD~)&gz@>;T07 zd}Um_+{oz2%{Y1dn4Dh33BsR(zmBI9iLVjIqA{=r`is93x_J_QNbzJs?&1kkE}D4E z+MG_~f|KT+RXpu; zv7;-X5b#8Q5P!b_9cD2MO)t0UF9ZDy=u@5aOKtiAq0e&C>ufrqGp?;%%9a@Oy<^Y9 zPg`kwP`~N#64+xO;#`&q=h8Y{bla$|tWm$tf+*6n8vVKjdQ8W?#bes-(6{Sv8$r)I zN1&4qWCyAr1k5_$p@*+)RA!B8Cl9pO@wXd%mlNM<4!+Dwn2BW3$Crn|Lu*4;hJ)uq z>Qm-lh>`j<9n0aK=MxFo#O_l-wMBBuP=7DzVcci+Vd84rkWN=9K9bW4In#E+2XSxl zWM0e+MDGRtO3>#y>1}p>`W96O=;_9=AM{&6pXsb0wDpWb&pSZp{+{j7)6rk*PcGy% zz99XX?BH|trwq^TJOsXU{aFe6d!V1^)F)#1rxWzdU5Ug3Cw-kwzYp|jpcgvn4T_!z z96irI2lPvDpLIO~uC{xopP7hfA7s>lhy2E(Q$IG_?c`)(?Ep`@xiua1w?RMEDMNgX z#?245eI_WD_eVRvPhmSyCO@8{%T?GQtb3N#dpcgsmVO#z^px*#GW~Hs?Vw?UH=*^%nchWOe zK%52~+2KCW>ya;IU56w<`-X~FRihz_^vDAJ?SAAFNpddahVpEz_C3w8z1JN5mzZ!JX%hJO+{-8I5?lopq=RW8_@uq`^=yO0%XNOkM z%RuL!tQ$F?ahjtr}f~NraX1YGS4*E*a)2*WiLBACA#jZ9w z&;;o)2@CFe(7)lLi)-^T*M3{13%SiWZ;>Mk@`9fJSE^c%_*bSZetPX zvq49?W$ST~O|JueI_T+q<`&SGfllkR)el*t$tNEGed7r2?*u&tI({(7uHS06zYp~L zK~LwCv@dxO^!d*EV#rA6%MGB{f}T!?ji5J!{xxSCD{LEV0X+)(*-m=BP2UZA7wGBY zUL5p?LHEidNdFuxsoOzMXJh&%`y(UJ{h&WE0=)tByFgEuw`~Od2cW0(;Vqy)HG=%z zpg#n9y8gvMe-`v~KAMBn=`qk3I_-O{ZQtpj?-@b9AM`=cZ*tbpRFjD8+W`7Sc%ty? zB)UqV^MKn3`kkPU6fYkH&$Hl3*T&9}_ESW&X&qoDs4^gt3_1!SVX z4tmM&(#PwApw9+9ogF7l#9Rj5YcA$NehKJHL2q`p?}`Vt;JFJtXFGWu^R)x?AA#;= zOX|bjpx+I8Ivuxx{!`E=JLNC6$8rzo_l{7181$_pv_A!#_WMEK=#-y%qcsMlppV0u zRyzG^K|dMvuR7~rZtK?p`l+CM$)_sVp{=?QIbSGy^H`%RBm35|#`iO_Kg=u zj^k;I6|CgEl+cCyZGP8G#!4F=a3e2`q*$2iL@lof|eOC6S9OKoj?9LqHd)Ze5 z^MldZKg}^-8=Z~&SH?m*TFEKRzQCwe_f#HtY4+P0M&#BErjGvyP|nSsZ(Oc8My68z z<8H~w{wTwEEh8I00e)ZRIn|J$KN z3zfIxT#zm-oP2G?`3_wIi~*rz3&_`rQpR?OuPFjKkCJ-=!e-?0K@Gh@LtR^?qLRM(s7O7BMoc4>DO`T!j_yb-9DeI0;Bo2V*JEQQ;PwsDy$V*6B>p3Ll z-6HtETy$yf{|xB&uek*l$at3ttQ5FXV5`7RfxQCn6S!62c7go@2LuiY#7mI)$`zO= zus~p$K(~HJTF&WAu7OwCoSQejW))sr)Sg#Zj5pI1%$n2A#iAREO7aUz&J=WVJ$H%R z0B>zcxbZZ68KB%I1DhudbhhNhPkxhW_UYp62dcr@0GyFXMv#oR`3TTP)rqm`bsFt*+Ux)TzZ(#LZBl2Gc?e+ zw45shKS=`VEJZff0-uXF_)O^(gn%1_|9}MIvjqQL!GGgig^+IW`-iCA4r$jX{5K;| z=FuC1It3x%tMG5)KLtA>y0n~&1%DPFl;Kwa71`(l{y6HTj4wXg;Oh?IKS36du;A(E z@3lXJ6)lY{{0%`bB))hDRhxg=>-R5&z<5Y(*^%6;ExABOcMbYeRfUPZH!m< z&VOG^ga1V2UnzFbeVm1bmfF2j#!=%lArs4lo z@O$|%+?IbbR%vSY0}-tIvO@3&XDaz2Y4>KqH&Xz|wLk&mhrpkP{^oWn1d4n;C;aYt z@i)OAoTvD7zb?c=Li(5&D7*}VfzuSm7fHMPxinaw6#Qm!z^hd? zXC7zhd`{EG5?&V^a4PVmPekU+SwfqahW|3*|5)P8*}~r<_`Cvz(Bpn@8ab~D{~A~P zd|&WC62ILj^5-KlBt7Sd{KbObEcm@Lj=GPp3jS^JD{%|sGr@l(0b9&%Oc}4_uafz$ z<6ec}XUe!6;GKNtK~aRfc? ze-QjW3HH0h4u=H)6Y-OUf;V$jyVr`N6$$=&!RO0-*YbZN`1d7Gkl{4w88@$f{gLpQ za27!4H7Ig!%~M!<4uh`I$0>c>{aqyZM_u{JwZKz6cjp_o3jcr%h}P|K!Ji=UdAVxV zhzmX_^S4m&lTeYyWxUv@S@3?r-z@gg^L?}6SBn7c=f4Bq>piP~7XC^Z7ZmwA2J0)e z+xit%4hx>1*(3ZpVuz)IUnlqnMNi%Cj|JZ->wAOn_X|Eps;b&%u~W|bmeb#g8x+bb-y}+r~J_96u|;|g#U7JDBZ803I0cduN3}1mUD_x zdsDKUmxcd_vJhP?_%|%59{~`SDIKLNoWY5<7 zDs`O?h5t^m&sjnkeWKFSy}nEpe9F2Eyq7)=!oOGI*d-!=qu@`KcGn30-vnPVMIoRb zUyloZkBp0?FUA{!4;3puxG`T@s84?Dj@w@me2)0D_MdA6zf9r-hL5k?1pm13OPXl> zOz^K4C_dfyLE!bhh+y#FY4B69u6Xg60#Ew8_ji{F{w~O)OULI%!Mpcg8wLNK=&Aer z5b$2@z99VW{FCx;(&s>_YFEe4;*)5+byqElX;7Lx`ImvR~68t?Pn4i%BOE$)v z_&+F8{NIqK$_0PMc?zN1x?Awy5eEqf|C@q8NBDJ|KL_~%$;dOj_ z9C$$~g8aK%_#>jHp6>?)ze~nN_csUg)=SRmz*D~(&sT!AJu3u%Q0#oKwEKwQza##m z=k;rXe^ca0I5y72x=!-%lX0&QIn{!9$CIew8)V(5XBg?)DR_5(eZbqBTAiX-h4V-l?=IX|lRe?sc z4qvcoGXw1%MzE!+wJ{V8)#3fto*eiNPIK4{@cX|*&C$p@qdpSA8_(<7o0`_4ilfBu z8c$-Smu}|=TU+@J-%AVUwuVE&(AqFwPaeeAhoX`8AYS=RZ&Jt0#_K{+d^M>UuWt`G zM?8nZ9L<=#BK| zh0AJ8pI?yvMavCy(Phi#SClU_%nO%ZykP!P^Ww#et9*Dz{QLz=ee{ZWyj`BY!Bk#Z zU+-H}ZB`YU%a`B<@=E_X>U&P*^;LoLdY^Am5x;ny-YQ>YsxMygi`+GRp`t@1z1zHe zd1bxtVq%^X2@%4Kgz7_)P;)SZm(=@8qU%~izKg4h^^58~MdCg56=o1Gw#R$q+u#v_ z)gd2V&3^f^+4ME8wmC`*DA&5ww|oh-H_T97AR6#uSy-r9Xl#lwitWwx>iICgX&tX~ zZ)sguzI0Wg&sSKiX$ncNxaS^(qoGIuYQS7RXzugDR502c6K{@JCiAw8jSa(>l_G3p zNG`z}-_f$k4FrmyL4mJwNj+MqE;J#(s>HO6!8K+4QhD{xcV@&Qevx=3Rnn z-fmL7Iuupv((q6dX0Rh*t_rP2=YxT0u%XO;)%_8SR1w)mk5s9Lzd$1o*C;f_Gi2;o z8AK`eG-W8WD8DFw_K2#SqbC_TjY)0|OQUP#zG>`WS%<1DB5sOrsDeoe+c%a6QMHgl zmWl6HhNEreL7#6qbz)VZEgUpk5b;8RCQMLxo)3=g991zYdj(C%P)9J-O5fZ}wry4P zocfl?+CZePeEAZDfNFEOcND;=N*GWIs;KdKf`)Pj<;#t2=s?TzCCjQzI~;HTcKdo^ zq2p_!4yUJ3pq#!j)Vw;{puF1U(&&6$TZ`EcfE7b(3|!7V!fcdr<6$$K$lX=o#3Wx- z9c;v4I`FuVaoaEqx2|)_XHOktQsg_EcI@Ulny} z=u?qLSr2k&qgrUKJ#P?4b&UTa!g;b-Gu72LrhA9k7QQwl^Iz78R2>h$WQ-hZ(Z?n| zX}#lJd3X)Xir{J*i@uSMRVg2q?C3CCLy@)?nxj!fQ{);n&s@D2VT^gU(L|%s#IjC?_$I zU6t2kF8bC~R-2U&Or1+v3ud=Qkk?od#=|>G_1yP0RW8v%wmuR{7YiscV>`BBmewc7 z5)bPlfsm0i8^f#cjqGS35;ZA;SuwM?1oEn)#ZBSn@+NR&^(~_RKj&!8K{|njQhcxo zIh|v*;{=i>gbD*m3txWGTx!A{Qe@C6zIhB$;o*h|?W?uFd^J+@7NYW16rj3vCt2 zgy2rY-n_QS9Z%eov#3C?_t?i+Kks0TM_ps(nkGl;lFu`oh9W7ur77-iDaC|V&r`=m z<@Gdsk<0TwN?E#?!q##ODElx4$jZe?WU5SGYHMj6JUQEw-I*OTyaIz)5K&=Q6!~14 zrQ|cIOGxOOmU*k9(1d>-1Jjxu%;}j3mZ9drs>YBRt}m}`i;%ZqSKVf|1p|$NNI6X8 zLsG+g8s8e<9K>nbE+RITVuOk;5l;eyPt^d+Pu{*lV(QKc8x_ykLW7>1V`2WGlbrg~ zG8DW9`}}LndTjr#r3fn#Z6A5~+<5}(LQQ4TFEAi>ZEG{FT<7q~5$&hV>WYQ>Okjk~ z!iZts@-0e3^$s5!;|iRDxMF>ZsYeLoDsp+n{t-gI@(!yKbJ9lrFbR;ox;htEY}Unn zir^s0;h4Rt837rK7==Vyd*F&lGjJ|K;TJm=_Pml{OMBEcPobqN^Aic=At?((VUcH0 zLTUpcj;(P$GJCbrva&mjhL^um1V{G3`V|#;b&R`}+$++}9XFHqNt`TWYO&a2B=IR} zS4!8y9qNoGB}%4d&yry^C3^m!%LhCHMN!^4$-JW&UiQ{$I(|I4r>a};iJR|wr+gh z7-)``ui`@}Z=H|8whIf(FQN@N@=7$ds1+M=mgyeu)Axch@E*IA zj;OrfT!lRsZ&FZ=PKX!b7px*J>oCvcFqOo)?G20R#MR|;YSobArlP`dOB){(&}N8_ z_-MIF%0=>viBD)!gVkNG_x(GqYsVe1s$yFgx#r|qFCLN{o zd7hg-EOK>r=ehU#WY;B1nIGm-6UvzteBNUWXzNT@Nh>-UOkKj&847g?PNRZ*ni#m` z$X97CyeZT~xr3D#@Ub4d7Yyrh_~>!ga5x9l1L<}p$FR6b@G_l&Sf_`1AJJ4+pL6imlLj<(Eq0zA(5{9yg7n#&d<@424rv#WG{*pKYXhxv44_T{Ai(Q{ z{|nhVH9#GKdYD<>QP?r3Q&tr@pFlIo+aAirKlcYpD!VXOH?=g&;Txw6>2z26=#NLR zfy0MM*rm6%)Z-)>spxWEiD^=MPiaJD`l!uH?2&kRkro`|N7p$}tJ=ejb+f{Cf||ded=@>7!0Ziywgw}= zZe25)P%s)%lr{J;03U576->|~p~e7Jkh|8#sDWP}#W6rWZu3{S$W2=)Xyivj9Vqf4 zcz&dXKbOuAHOTV_4Rw&FOK2t-ln>N!cuxx+OI435C>i>msuRQFW{T`uma^((mcfMSUdO>Hf=OR0cigN?o?vmxlEBF!lE>!NQl@{@(+dgWI8W+n{WYJ4H-JvxjnrlR{YVY_r9SCTdTRXzZS>%VY^v+)?`vwPzpts=*Y$P( z|4HgE5P|yppBn1#i&A|&5@)rq>wh0OvWb?DN2Jsxko?c^{AB8{j`~CERlT9lS$`tx zlZv|iVW~eX_4PbaQtkPp%cr0+%^h7|e-AUaNpaBcc+y4lpDwMpHtWxTbGEO)ubJ1v z?8bls*1x*GhG)3+H#&v2Rl&pQKLhnime#*a>QB-2Njb+==D4R@n%~4y;KJ+rGhBEr z&Iv8wckue9efn)-y6||VLC<*Ve(QdX1y1XZTk9I=Qn%%K7K(3lyBbU3!mIw74=9eg Jt_rTA@jtQrH_iY6 literal 60592 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

AW=)kR%M`kYD=s0{5Ewthb!_A3k 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 HipKu|5#ocn diff --git a/include/utils/Grid1D.h b/include/utils/Grid1D.h new file mode 100644 index 0000000..bd91615 --- /dev/null +++ b/include/utils/Grid1D.h @@ -0,0 +1,39 @@ +#ifndef _grid1d_n_ +#define _grid1d_n_ + +#include "./utils/matrix.h" + + +namespace utils{ + //####################################### + //# Grid1D TYPE # + //####################################### + template + struct Grid1D{ + utils::Vector grid; + utils::Vector vertices; + utils::Vector vertices_norm; + + void create_vertices_norm(){ + vertices_norm.fill(vertices.size()*2, 0); + uint64_t k = 0; + for (uint64_t i = 0; i < grid.size(); i++){ + for (uint64_t j = 1; j <= 2; j++){ + vertices_norm[k] = grid[i] - vertices[i+j]; + k++; + } + + //vertices_norm[(i*2)+1] = grid[i] - vertices[(i*2)+1]; + } + vertices_norm.print(); + } +}; + + + typedef Grid1D Gridi; + typedef Grid1D Gridf; + typedef Grid1D Gridd; +} + + +#endif // _grid1d_n_ \ No newline at end of file diff --git a/include/utils/matrix.h b/include/utils/matrix.h index 1fe32f0..7fb1abb 100644 --- a/include/utils/matrix.h +++ b/include/utils/matrix.h @@ -1,10 +1,6 @@ #ifndef _matrix_n_ #define _matrix_n_ -#include "iostream" -#include -//#include - #include "./utils/vector.h" @@ -16,6 +12,8 @@ namespace utils{ struct Matrix{ utils::Vector m; + T& operator[](uint64_t idx) { return m[idx]; } // Makes it able to do matr[1][1] + const T& operator[](uint64_t idx) const { return m[idx]; } // Makes it able to do matr[1][1] using vector_type = typename decltype(std::declval().v)::value_type; @@ -26,8 +24,7 @@ namespace utils{ Matrix() = default; // Default constructor - T& operator[](uint64_t idx) { return m[idx]; } // Makes it able to do matr[1][1] - const T& operator[](uint64_t idx) const { return m[idx]; } // Makes it able to do matr[1][1] + void fill(uint64_t rows, uint64_t cols, const vector_type num=0){ diff --git a/include/utils/utils.h b/include/utils/utils.h index cfd11c5..bbef9ab 100644 --- a/include/utils/utils.h +++ b/include/utils/utils.h @@ -3,3 +3,4 @@ #include "./utils/vector.h" #include "./utils/matrix.h" +#include "./utils/Grid1D.h" diff --git a/include/utils/vector.h b/include/utils/vector.h index 80ad505..77a39ec 100644 --- a/include/utils/vector.h +++ b/include/utils/vector.h @@ -7,91 +7,196 @@ namespace utils{ - //####################################### + //###################################### //# VECTOR TYPE # - //####################################### + //# Backed by std::vector # + //###################################### template - struct Vector{ - + class Vector{ +public: using value_type = T; std::vector v; - Vector() = default; + // Default construtor utils::Vd vector; + Vector() = default; - Vector(uint64_t size, T value = T()) { + // Construtor utils::Vd vector(2, 3.15); + // Prevent implicit conversions like Vector v = 5; + explicit Vector(uint64_t size, T value = T()) { v.resize(size, value); } - void clear(){v.clear();} - void push_back(const T& val) { v.push_back(val); } + //########################################################## + //# VECTOR: --- basic properties --- # + //########################################################## + // vector.clear(); + void clear() noexcept {v.clear();} + + // vector.push_back(2); + void push_back(const T& val) { v.push_back(val); } + + // vector[2] = 2; T& operator[](uint64_t idx) { return v[idx]; } + // a = vector[2]; const T& operator[](uint64_t idx) const { return v[idx]; } - uint64_t size() const { return v.size(); } - void fill(const uint64_t size, const T num){ - v.clear(); - for (uint64_t i = 0; i < size; i++) - { - v.push_back(num); - } + // vector.size(); + uint64_t size() const noexcept { return v.size(); } + + + //########################################### + //# VECTOR: == and != # + //########################################### + bool operator==(const Vector& a) const { + if (v.size() != a.size()) { + return false; + } + for (uint64_t i = 0; i < v.size(); ++i) { + if (v[i] != a[i]) { + return false; + } + } + return true; } - void fill_RNG(const uint64_t size, const double min, const double max){ - v.clear(); - - std::mt19937_64 rng{}; - rng.seed( std::random_device{}()); + bool operator!=(const Vector& a) const { return !(*this == a); } - for (uint64_t i = 0; i < size; i++){ + //################################################## + //# VECTOR: Scalar Addition # + //################################################## + template ::value>::type> + void inplace_add(const U a){ + const uint64_t n = v.size(); + for (uint64_t i = 0; i < n; ++i){ + v[i] += a; + } + } + template ::value>::type> + Vector add(const U a) const{ + Vector result = *this; + result.inplace_add(a); + return result; + } + template ::value>::type> + Vector operator+(const U a) const { + return add(a); + } + template ::value>::type> + Vector& operator+=(const U a) { + inplace_add(a); + return *this; + } + //################################################## + //# VECTOR: Vector Addition # + //################################################## + void inplace_add(const Vector& a){ + if (a.size() != v.size()){ + throw std::runtime_error("utill:Vector.inplace_add -> Dimensions does not fit"); + } + const uint64_t n = v.size(); + for (uint64_t i = 0; i < n; ++i){ + v[i] += a[i]; + } + } + Vector add(const Vector& a) const{ + Vector result = *this; + result.inplace_add(a); + return result; + } + Vector operator+(const Vector& a) const { + return add(a); + } + Vector& operator+=(const Vector& a) { + inplace_add(a); + return *this; + } + //################################################## + //# VECTOR: Vector Subtract # + //################################################## + void inplace_vec_subtract(const Vector& a){ + if (a.size() != v.size()){ + throw std::runtime_error("utill:Vector.inplace_vec_subtract -> Dimensions does not fit"); + } - v.push_back(std::uniform_real_distribution<>{min, max}(rng)); - } + uint64_t n = a.size(); + for (uint64_t i = 0; i < n; ++i){ + v[i] -= a[i]; + } + + } + Vector vec_subtract(const Vector& a) const{ + Vector result = *this; + + result.inplace_vec_subtract(a); + + return result; + } + Vector operator-(const Vector& a) const { + return vec_subtract(a); + } + Vector& operator-=(const Vector& a) { + inplace_vec_subtract(a); + return *this; + } + //################################################## + //# VECTOR: Vector Multiply # + //################################################## + void inplace_vec_multiply(const Vector& a){ + if (a.size() != v.size()){ + throw std::runtime_error("utill:Vector.inplace_vec_multiply -> Dimensions does not fit"); + } + + uint64_t n = a.size(); + for (uint64_t i = 0; i < n; ++i){ + v[i] *= a[i]; + } + + } + Vector vec_multiply(const Vector& a) const{ + Vector result = *this; + result.inplace_vec_multiply(a); + return result; + } + Vector operator*(const Vector& a) const { + return vec_multiply(a); + } + Vector& operator*=(const Vector& a) { + inplace_vec_multiply(a); + return *this; + } + //################################################## + //# VECTOR: Vector Divide # + //################################################## + void inplace_vec_divide(const Vector& a){ + if (a.size() != v.size()){ + throw std::runtime_error("utill:Vector.inplace_vec_divide -> Dimensions does not fit"); + } + + uint64_t n = a.size(); + for (uint64_t i = 0; i < n; ++i){ + v[i] /= a[i]; + } + + } + Vector vec_divide(const Vector& a) const{ + Vector result = *this; + result.inplace_vec_divide(a); + return result; + } + Vector operator/(const Vector& a) const { + return vec_divide(a); + } + Vector& operator/=(const Vector& a) { + inplace_vec_divide(a); + return *this; } - void disturbance(const double min, const double max){ + //###################################################### + //# VECTOR: Support Functions # + //###################################################### - uint64_t size = v.size(); - std::mt19937_64 rng{}; - rng.seed(std::random_device{}()); - - for (uint64_t i = 0; i < size; i++){ - v[i] *= std::uniform_real_distribution<>{min, max}(rng); - } - } - - double max(){ - double max_value = v[0]; - - for (uint64_t i = 1; i < v.size(); i++){ - max_value = MAX(max_value, v[i]); - } - return max_value; - } - - double min(){ - double min_value = v[0]; - - for (uint64_t i = 1; i < v.size(); i++){ - min_value = MIN(min_value, v[i]); - } - return min_value; - } - - double sum() const { - double sum_value = 0; - - for (uint64_t i = 0; i < v.size(); i++){ - sum_value += v[i]; - } - return sum_value; - } - - double mean(){ - double mean_value = sum()/v.size(); - return mean_value; - } inline friend std::ostream& operator << (std::ostream& out, const Vector& vec){ out << "["; @@ -108,7 +213,7 @@ namespace utils{ void print() const{ std::cout << *this << std::endl; } - +/* void linspace(const T start, const T stop, const T num){ v.clear(); @@ -121,9 +226,7 @@ namespace utils{ } //v.push_back(static_cast(stop)); } - - - } + }*/ }; typedef Vector Vi; @@ -133,4 +236,4 @@ namespace utils{ } // namespace utils -#endif // _numerics_n_ \ No newline at end of file +#endif // _vector_n_ \ No newline at end of file diff --git a/obj/main.o b/obj/main.o index 64c353800a9c75e19ea74bbad7c762b18b5734cb..d45348fb7ffced070424b1ea20acf421d170c824 100644 GIT binary patch literal 75208 zcmdsg4SZC^)%Q)7Kva~dsHhYdqzVd{1Vm6&z7{tUAQDhS?Glm=#OCWsHW;lwVgr^n zM$=Y&sGn5PQfn2zYHGEON|CnIrY*J9Qk(kKC_FYQ+Ei(I&zU)M@40hlvb$*ezQ1>V zBs2S;bLN~mbLPz4+1%m!Nb#KPtSm>REayDO`=n6E$$i-?PZ!1MPAuz7f^#)|MxL)y z-U9g=DzAn7Mk=p^JW1u7AaAAe&5*ZI`4-4;rE)vuU#IdnApa(nZ-ab2m2Zdqf2h0x z@^4Z34#@AM@?DVMP33zazn97zA^$d&?}Pk)DsO`P0V+QT`FE(i8S?K^`60-^N9Bhh z|2~x;f&5V_Z=w7#$RDTj6O=zm`BRYpfXYup-a+LbQvM9&Kce!pkUvM|A4C2VDtAKu zJe6Od{6)&QLjF@KZ-e|LDsPAUXH@<<m9w?}GdfRDKomKT>%&;LghTjkEHTZ zkRMIup_Cs3`LR?!4)S4CKA!RuC_j<%;gElU$|E2@iOONhM?yY|$|qAkn({9~ehQUO zg?tQ^$3lJ@l~0F!9F@mIK7q<-K%P(K0>}%gJdyHAl%EOtWGbHp`4lQoh5T$Pp9A?c zDxVAac~m|h^66Bb0r^ZS&w_k5l_QYPq4EWkMwqtg0UwGc zBRvJ3(YCd{fVLh3h*LSF_JtpZMBPg`4IHS=JJ4Tke!sOP{npm^SGykNl5)}HE77D< zDAFEnqslhaJequ&Rc?Vwfws+S_t$i}Z1cAGY8FGyTI`2kOqZ`!F5WFG9RtkkOQiBz z#hT84`AxS(ArvG|DQ57u9-L?gh1B^)|Lp*QC-ut6SK#2BpM`1oZJ;{ zU5tZ0R7}SqYcOEGgOL|!a1^~G0-h>~_YCqtaBKoEMX)HjRe4Ww@{K(ak1z%Ii3V;@ zjIWCX!5$gXtJp{ z+8XJ-0yij_W>i#EC93Lb!;9jLiSYRI!gI>1s^b+-Y18sVLs@x3$0e83l&Gq%KKtT$ zd7`diLRD>jby;~lR#s7gEzGW}iPttln~mX$x_D!_wk{E_tV#$@Bj2icd8|>%>!*Rs zoN;023J1tR>e*+<=EW*Oi&#}{W4s{&%RO}1aaN!2INj5s(CO=UYow1^qGfNMum+%N z6xx6GqPrSIRlTs*Vze00d2tm!0`-9dS<5egXcN!5=MbkQE9b^ToNs64yqD|zBrE5Y zTxVC-s2}G#w`S-3evtFs?3@<{Is3Cm0MZf4**nPT37v!G0Xge)o!<<|S)J?LnR6u| z_Ycf@DA)Pzz#J&QdMQ=#VUoEgqiNzs2T zavZrPE9ZkO=eJoo4`e$Vv(Ex!9k{a~YixTKwD5HHr`f%SICl&@&v70a^tG(}4$b;o z?h_#D?!&ITW3baX7-)o{u_gS;RkB@sx9kmrb$h^SJ+N-}N$W}9Z3imJ(@}p!BxIfX(Y>QFG4-6psNzXy?r+6{K3Pz_DdI=7R``K9OC@ zQy>z-=Y_e@GUSIulk=dP;3T4}!dc+6>n!b@mGvHX94&igcBcn zB0GSQb#k=?hun#tX=rm&ZeNF{%UvMK5>GAn`Sh?!9 z$N_0HWf>SR;f${0_|eD9>|~2Z%wzkbZt2bPTK>=bV3+F-pWO#9{~Ubq{|nEO<1M1( zHh0&nqM&$IVUt2z=g=!*ZENaHF5W99plHVR#8yNjecqhHa0UUAd7JcW;lL4GDSI&x zwj&+PBB_NY)6=)LBoEt*wmQ+VFGQ1F(dYZJF?}NRJv*AEPi3$JE-0?O z(Av6Q9)86>%MzIe-4y%~#TWLN^uu>qW;orl3) z7zVG{0KI5e=7AC43>)z8fY{9tHMhX$4yeZ*LuLo$+ad3SysI6OpZ9se3ZsrgO;2{% zm~tMV1|{UU7bSlxKDG|yZQzQ-)G1EB17la5d|PpWUeLnKToeo;T|F^Y?}?-R%zB z0qXKWNI|ni+G;TjlsluL6?oS5voPDqosnyA7%>>dD@>!g-IYS^Ntqzh@KDa@0QPYT z^l=w>Ru_(lYDmh4&QMEg-!lkLWt~0O!=6Q$a?hoL3mynrzu2AyaIu?m`z-e?dGmG* znXrAx9i7kM{uPUn7a%TB>my+=(}U}>r_R(!j|d%2?H$OW&1AL9#hn7ix;8!1g1UHg z>Fl`->Val)A5*tA51H@`$?Yx@sjjzxDpMnUa^H8XrTvyjpMN8P92o1GZn1EHNETbD z2g#;41-X)q``DKvcv9=^882%58#A^jx-%owF9HhkSJ|9Na`(<@r}@o8S@i&s9uLM{@e4JWHU)-7%48C2i}4 zlEEXmFI_Bw>}8oT7J1qxI4cW@0B~QPzmng$8&@u1Sri)y2ubu!ZFlib$~Sq&$jhZ4+Zn9aJI96P8@NM7CIh z+3B)rg6&9cpNdMQMRS36d|a*Th2@ir*TDb_wj{2y zuu;L~wKcMig?ji*-XlG%bzxrgbjknxCos#}WK-TCxa2EEhx0ssp{JZ?OR!F}Bkn%c zRLpw^zvEDw6%lY$gxLj3dS|J|?G2H(JckmUrfRocHCfuEJIEQD_48=k;PrBpc>Sik$`@_>>6x!4E!`xoUGtmkJkQnBG7v0v~@0aW}naaXgnc zKfmEAizft{>PD+GDD~-%ev%i4UclgcU+IalfZgIjjDxu?Q1Bqf72A^*PU5x}j+bzI zD>pHKyTO4yrNOvxZ-8NAL!JbC$*mFQIA+i)K9{$nclcXjqboK~z0AsdbeTNeifwG~ ziX$gJyDkEK=|Zur-DsN_P*B>XLd^olXiQV|lO zzO#woJWS3*(|GK{kRXIwOTOd{ES#1=tFO^U(QkvaX1rYr>`>8o*nBkkD<(k&5a@l_ zH+{@ghnrF7=x@R)F=(GC$N{%#>V(nj;FCZ+pTm;m+6EoO`#APRG&~-GOnpHfM}^^2 zU?l>K`6=TUmiL-VfA^2zn%->ZGgx1QQyN+x18(Q*E^gsF z;29OuNf52OK-PB1G2p@65YZc^54ev@1zTXbe&RN@i^Uung;PI&@#%3CZDNk=taBI)U+D7)wDRji6iGcqHm&X3~VV~Cyi4FQejEyhmwL{-}RllN1)DV{z zFqdf!VlJjumi}gYz^VVUq4M(|oO~_Fcf(VC4?WexYIa>;){uKUrBfveg(~F-%4k64P>HwK0AWy`{HVk_z3OfC0kVc>gwiuXW|5>MjxGQy%t6Hz> zDF#loB?e1~_})4haPqVxcc2XjY%FqTJhe@lWaw;j%jhXam3n2yC?kt6bM%${}lzl86zcgV z)0zEqYn7K5vFqZ@#zt131u&qa>7uD@8w`x3O_!&?27~u zwk5tGh8+KP)kkvy_9^>)B*Z?6FQ6em4Sw7{l}TCH4!&1`sS194?VwJVNjhu?9Rkx5 z{H1J@y+9CPeVFQ}@%l!Oe>&CM#&8+ckK_F1o}N9VXMg?0{^U_Rsru7JbhiHVQvEqx zp9Zf#c{DL*^7^a2`h2P{;PoqIeHgF~YX2fA`|O?_6+}prpf-fxD4XNB+~djFKs2_w z)j{??eU6~hcugs2H%*sj&#ZB)@W?<{L6zl@5fa zP>gD#8k3Z;$$uwrjvyu4Y zQ1lV#LSF*fGvIm^{^HPxH?ih6FO`ZGCywby!wO)NU)!Xdg3_?c7 zxgLMH`mGWTgaHauJ-#RE)?*(Z@MO#;8e1PKsNS}YuA%xlnv7-;5e94%)nB63lWU3f zU^~&6#tYl%q51`S8#BCq490~WlGXpI-ZU0r;47wje6P}HtB*Vx^+YodNL-ri*@7Sp zP&?K4*ViYBW+ZQ8i6>(x)gR64FZAm7QN7J)h8}{9a-H^clxsBlrv*(Kjus%WcCO^XZ+xlrg4E0Y^eJzw-{p9{gtZ>-IE~2sda$gD^ zh8>2D!~3)NOWEKG&jwSd{tRAU>D4cxdRyFUrh3yp0`=cO^)?%Kq^RGOqP~ynZTq%i zgRx_dWAouDRBzL73Dw*B*G%;`AKgIpvrq|T|7$$^cBE*37uDau`LpFDLi_en{gu9Y zxq%J?HtcY$fcJ;-my(ZhpT)~*L}TmY9=5DID z%@d??j=*32_j5GS+>32sua!7@37!^S@3%-_(ltUp9SA!!5_5Xn=SZ57W`og{)h$NV!1yjhuOGAPw*Fqk<{q;7wA&6msxZsbC5@c*9gMg&e$XDwskJ-aHjdA!mjK zpJl=EcB)_sITu)PytyivLJrqirQtH5ug zPo6&C6S((WkKc=9+HRqLQ{dk7zUuEOhho2;k<9S>O)6Cj+154&8=OGtYes!_Hl{ES;5vY;^-|EsYq!NCQVH!vL z{$iA~-K8&~(uV?9y@yLTVcuezH5loCEjh2gmDvfqUl(YFvIV z@GiHVIFmJ@Na4QO<8%yqHRp1^$YQs}*{qz<0TLgi0?9{8bk}jY@k2?wu!G zPx$yFP_FkJr1UQb+~g;BTJQ%%JHc_>CGcQe`dHxJbM9o)Ck%mWl=GUaznXzd1^&8= zA4{d11pbDL&!N&^1^$+cUqYpmpi`rqzq+{U?-c^?aq$IIY7zLmE?!8by9K`2#nrg% z5_q?ZmryBmB+7ly#nlu0IDz-N_&h3IBJdAfTc>5%|Y0uKevvf%mz%iqCfnyvxOv|91-f6Bk!<4+z{lKM~&}0@dZ9 zz$ho^&sPiFJ6BPDez(96xb4rNQn$c^es#i7Y#(oUmPz^5e1UuCB%q#1YXmNzG7uOg zVdqJKche`wQRDt+fveGmTVsgg=wp!AJ8x0r8x^>B-lF{Kn*#UFTa-SJ3fwzysipSc z5V&{VQb>3fbZ`_qZ&B@^A#m@!$owSwL|hdG1j*9hD@Pq>oshXwAPtJ zzQFep73_7XbjES0=f^It{H;vjLI2q(aPOR_fH;pGhV2CXt&4a=r5+)lP%Jz4M|Qi2e?Nd*?zbPWA{q*snn+V*B2Ck!t@-0{6~~ z6#h+td*?;syKa#ExWK*hBIR$}0XL1~UJITx+)RHM;G@{Nld|(tfqUmpYJNQ}aPQnn z+2L)0d*@E~lHKNh0o(V^oyrJr6S#Nor2PNS0{70Hlzk3^4eBU%?xg1F5`oWh$6e{! z0=UUOt%BY=k5cyhi@?3}C}oE*Z0twD+rgx^qx2~jxOW}}VMnAIfqUmsivC*y_s*kK z`@aylcOJEl+8Gr_x!!q{YG=N{z4NG(iT(kBd*@NA9jB(Os&+zoeZ3P~TAC;>m|9;I zFOOeU)fkVJ!$rf1hNkiaRLw6RE1UljZHmsu@+GiwC@>Qp(pjlqdto!nvgdvGkQzvP%BrU7CzJ^wl9I{g>7flo zKRn8G;BOOa>Q=?MxzIXtY-_KoDZ!ZsRAAV~s%zpH9Vk%Lh>F63s=7uo8)MZ~%f+Zx z)mA0MeATDL>_Us8vkPQJfWd;7l|~l0(@X2Ls>2}Y%)VqoL%ebV_(yYdtUlh*SXWzC zU6laO%g4E?%bQg|GhMGJC}8)tdlPQ1PB#&*b?>LTzS^tQS?i0vxTkgQfCCbXb3{m~du}TQ`PV9o>1v6(9 z#}>?)QyN(mTQp;4aYT8hzXckYMMdZ*zP6!N)FiR8q3$Y^DGT$J#URMKH`c3OES(?d zVnJb=gf&(Dv~p&B1GuO3rho_>ouaB$kqGz>1{u+V%7(blj*Dxrs;aGsEsQrd)x^oH zZY1C#*$dQS)p32hz!Xru+H~3?x3?_@vodN8yrAFJ)2r8Jk|##5uuMx}uq>358{!x} zaMiG^q^Y_z75)c<74bxDQN8m1x(3lN+{Mg>|Bs=e?&_kF%E+okF*h=JBgDr|MWKLu zOcE*zTg?r`UtXzC-KypY21D3TX@*i2Is+JrE!r9rjE7qpVD#!r6O%A-7cC4(jVu67 z3c%zdutWTdH^ghp<3)>Nkx7ZG>*EkR&$KMDlfcS?tE>?>ej>_Z@E0M!0ajJ9fh?;{ z6fG}aULbdC0XxS3%k2OtSzgy9cAK&*)s2ybrF9GE&M%F5`#aoP0%g3mqPnOY#1-KF zGY0>qMpdG*s5}B35Pe_>tIA__FwpU`8tBWS{8*%Pvg}74G+QzU8ZM2AZK`fIU-%Xg z0Nf<~x$R8^vq!<=NV`&Rf0fFgCxWFb;qbVvSdo)r&^}m{wvx>ID+< zFqJxZOvI^Eny7BXT|pXiwHyKuL>#ddfgp*Kl@@`tHTTvi^SJ;LM7uN($gH5xik-fSvzLIR-(8 zmC+j|<;UdHv2?+SF&OQI;D5sXJgrQkO=?cUC6uNKJu)nZP32W(4HZ%txq2Zjzu;9E zd!SCO$qVO#Cc<+HC+X8ngsEDXXb=Z+)?gz*4J-w6-W1At6EI)!5l4l};8YjxU%oO9 zTjA<>ZKOsyq$Q{n6u>yT0a`xoOblo)>|Ip}Pn~ivF8W}%z1VV!kQ0N4?edkh32lhe zMq1QEY*n>OQ$-$wNAV4Wh?ulJij_4r7l~yXhQGqwGKoEtnAFw)>rGVgEG%{*DZ|ga zSUIfKi8wrdi04$bN%9)w+cMDFi{UB!(-dxHuPLGxObLeZgAL+5hU4T3_@G?X`Zq^9 zG`5H>)*w8z!EKc~LP#CI3J*4Zc?SzJu9haws;p}eGab)q;CyBwI!bVZ3Cht9(`cvQ zT*XLPpOE|bpk0IXYU>^tf*`5e35o}x@RXXeFURHfmK_d7phi0a!S#w9DHvdBM-b$K zhYyHaYRR7zE1k%fe4vNTMGXp;XO}>(9#u*cC`L3a!ifs35KC~nidY_jNC*)T^pcM^ z;_z04O$?fb7@O~(0W!jh`05X@Vm$~L6l~Qj4t&(k2o8uvh{DjhBC%2)Fvtj6nwSXG zMK$1_&?8V#`KW2Fp5jH+lDYD1X(AfN8yXf%-C=?#rwPd zBo7r~PjJY2o3PYXdt`xhdO=e(* z{;3v?3xkmfABMocz@x=f78@6w!tiilp29F_rYT&|-yHTDysDwB9%d)ZP4V!rCOP<- zoa6;!mh;^J*ezaLw!9k7ZYztHG&V?6!k0FU}n4Mm`Q1Ws+m8GB?^WHL-(eE5eB zO+gux#7QO5r2(~iO-JzMIeL<`grZq(o5Gec$##Hz@?}+Kl z-ZX(A5C+#`({LBkaDz8wGR@3xFcF@Kr5{X=$#WBE)iTzF{f+hH{z5Ru(5hNJhJqyc zicZGe0gFB0z7P(%&{nzVqn1ca7N3sGC12|nwMdW z$%nK4N}M6mrv9MC#ve##FDkFb$m5~q)fI`#`j~vkgY)q~6ooC3W%P~vlbU!9?qq-k zBQiuP*UU6F`6vASCLrWb~06)X)nJlN{ogIIulkFb6N;>5KWP@L5S*OY!5 z>o?-lp=~-Vn%XMp_REi?;oA^5q|J-wa<@LqjbWM#^%J@bLx?J5JcRfiFCRm*XQZ69 zUe9>P8F3cWp?fDq|DEgBa{y4*@TJTbaKf&m$7`~C=O$_Jba)SkLv*33z z{7KgS(+q!#;lE@!*XIum=lb+8oVTA9f<_^s-T1fgXhcYu zas5YI@G}|C+rjtIFzM~AwBV~P_y!BU#e%=Ya6Z2Ho|@92O*1%}UOIM?%1hV%Y%eYUc8<}mu7 zGQ5=G+ZcWl!(U?f1cq;C_)LcL`CCl5n!l6i^CgU)&)+W*uFunztQ|g2)q0KN$mi+x ztbMNMMuz_k%4*zkj4)w4KZhTMzk?to#JT_P6R5+4)ui8l(to)BZzTEX z5C0DTNykt4e&e(F3E!XC`~?0SUL>5qzlI;>C!-`R=EZLqK9+EtzrSU;n)hh8oeVz( z%9s%6^WrRlO8j?FR&udjOi2HG_)++I2tq=97yKyvLIfcp{v-HN_(%jHAXeyx?Tz`LQW z{pTPE3Guh!N8t+* zgoHTnSEWED{x*~q{nZwnkJna4e;cFccn8D(%IMK1m{1?Se?T9`ggEanysjY<;@l6% zF`UQ4r3~l(xr*UDPNFPKdiy6zSX|4Fb>F4Wr%;Yq5Bw;*&0;v0yO`ncF#0lv^L~AW zaJ4_dy$GfoWhV6Ga{q_nyq)h8uG)EoKJ#(m?Wq3hc9_Q6=lc*I$Myn^vIC#L|I6^Z zSv&7B{0WAm52$u9R%1ea{sun^S8wDYzLnuqvfu+G#CzdK(XV0n`wZvL`yVj;0So;$ z3;sujf5_VT8^gJt$KrrMLOu7vkJ2-r;hcUR!@2&;8P5B=p5dJS5r%U;pJDh%OrQ4| z&f8J<@?$mjVGI0VIx!@3#6E@})i3_s`gevmGkV_N?=hU)=cf$k^lve|kF|d|Dgp^J zPCuUEoPHL=Iek6De+q4>er;sq{ zbNWK5j?ia6YoEs@PJb4o=XO}maBhc_8U9b!{uqY;i{a-m`~bsC82%%MU&e6W-w6!I zJ&CgC9ES6LaXWB&n;p(z?cm$Es{P>%=leHqhXIWKbVmO!lvO)?-DfzlPvf=h9A!8M=~7WURUjKdvZL&=!YrBcnf>wR1hgc{{gQ@CO)cS2d=d|xq{(Wm2|c*}umX9jDZ5BYG(~=e;UK14Cm_t_kX;NLAAr}e;&g*J>Jrw=)fznfb^4DmFAIJu0~iQy+Q zT%AiGy_(BdeFdXOeI7>;k~*(IdbNi~{4Pd60s%_TGW;Y3LcW{fVTSK#_(+BiA0R)V z+))gl#_*FF9$`4@{{yO1--Ba2qZ$1=Mz8jwSp6`=Phs?33|D(RtnOv_7)GC$BR`ko5papM@2lsaFmPB*qAC9uJ&w*uVJ`)MnHTM!_P#3(pH8~ zRv_eWGFb(qC&sK=%(PD%8Pe*`KKEr1y5b_d+&t!Ol;jS44Pqy0-5 z{S=0)XFaT5!tjNRzM0`_Z-dnv7_Ocj5bt34VgxAdX86SlgnU24FJbs_+BBg4OBgS}a)vKu__YkbjNx}N{Bnjr%kV20zMJ7+V)%ZB#~41GHaDpMGKNoMcp1YlXZUi4 zU(4`vhTp~T3Wh(+@HoSFGrW@F`x(B1;lpVYhWf8$_;iL>F?<=ruVnaYhJTsic)u$q zY`WF}#`K#SFii;nfVkhT%6e{3{H9nBmtld`(X0>0tuOjzF7=m=nfc!LG5pPJB6 zC##SQQ24WP(`8g}(GxWVG=ZC)#G9l2lcG{3w`!0qURu+H2QG$Tw`2Jm3{bik zW%=m>uc^9Y<{KehKlf@ae`^7$?k!t>I=#7mueS2D21FQdxk|y~UU-#)&b|981)X*c zmY+I3?>4xjjnUw7fnoGr52a>5zII}sXqF3N{2d9HUftm2wjaD9B0v(*R9tP7LXd$b z&<+@ori>faKHGIpew_mH#AQJ8Zjdx@cJenEu%>&-lb=q`70WG8CQ|PfC|}%hFKKc| z%jyl5%a=H#;Z_)9v8h{<<_eafOZZAEl1Zc0UHG8nwH3GWyBUwam>%YDvQ zJq2{Ld6<6dlba9$$S<}^1vlb>Gs(4n!4;VyqWA%0EX`0b>Wgvj@3$DJoMs7W}#3-e|E`IK(1jA z5x7~-wQL$u%)JQ(bccsrPw$jb*X1;@n2=56y$0(e1? z#&2DYq3Phu_i+7!x(Y%QoZ%MqX#tlT!NkReHR(>xMiEY8}L)hqRYaby z=;i!o5u2C$FFJ9(+OZ#|8bDYKiDeBuly|Lm74`6L+4WxOiOHCNCLKKm_8KAjA` zMn_8-KKi?GNeaN{CM-?B|3avGLVy43%7pT|nwoemeBW1FmxxceVE*Fq;(sTh&+z~F zOsH?Dga4`}aW!q2;wxj74Q23uaZFgzP}ju2z~$dDW>Aj8AD8jJ*Hf(1sX%`Q;#>}Y z_j3ne^k-CVZsS*f8^ZbT%z$70Z3cY}FXXpmz_0#xf%9+7fM0#L&-vG6z^}gh=KO0j z;9m{2m^lB9@Ht)k-z>QO{9ns}e}jR4T?YJ{4Ezsdz`w=7pUi;&Sp)xr8Srm6@P8)* z{+$N?Z)d>YZQ$RW0smeD|93Os?=$c}mI1%|J3;Qh__wO*`Y-;CJ|@op1bj}Hf4G7F z$qe|_-(z$6Pi4Tb?pfgcH)X(&f8&pd^S8q1bo;OFqvQN9WWcZPcgRI0AYuI93VFKn zml^bbDFgm$;^*>lPNpkAVc`FH2K?6=^#54~{Ob(-H)p`F{w|;Q|K$w$?=r~$RR;W< z4g6gh@IPtb|4jz`od*8jWx&6K___VsGT`57;J+mU{@n)scV)oeW8nW|2K@UB{I6!f zFa7`#=z09uodN$~{KGd$od2irIone%zC%8$SnxfEW_@zi-0lbomDx`2U#!zk1(|`|oWT@P|o0=Rc4E|2TvG z>oee2@8xm%cppi+_M2|d|Mm>z7aR1?$w0n(e~|0HHv{?04D$ac1AcYyFZVw@Q%Ki- z^#=Rl{Uz!0Uu)1mHv|4P2Kj?C;BPnZ<9#RT>VKC(e|)bzU4C^hG9Q1uCna6}Ee8GZ znLJ(oXAS&#?@GG-+YS79ze&3MI}P?5ngRcAgM7T_BwhJE27bK9BwhY}2L1nJXCXTU$0___amD+B$98Tj#jm2~x2_j7ao@jiug`NtXLik;KzG~(v@Fr;K%!8(&cY9@Z)_l z>GH2J@Q=%Yzumx(_tT^+|1Kir{)6|}q|3j_z>oLNq|2|~ujl@Q_tT`y-$8_&e^Lhg zTMhhp-%Yym)ja@QKHh(mF8^+We7yH2UH%>eKi-d%F8@9QKi-RzF29ol!4?wlKi;2{ zF8^Qy|FjJFhY>&bU%X!@UHM^ye7uJzUH)+f`FLMXy8M$2^6^YQUH<6?`FIacy8Kat ze7vtGUH(M|e!SNwUH)YT{qdfkboo~rGCHG{P%-D>-=HBpjqFYKk(66P5f^v z1_U7?El(%H2PB!!K`4(|BZ25ZnO_c!*FsVG^DqfJr$CNv(sqkbxF3Vw-**8j=<>$_ zj%^++e*y4fn*-^*0E!|h`Nt}Na$WxUfFq`{JF7{5JoDvA^ha4qNNSvL{953%(qG|trf-se3&|gkjj*JNanyIx z>bzEwt~1DA3zfS3M*&0mdb{er1@%3sYFBe-afiD}{~Z+g$0$b1bve%iZnED-gZ}G) zR@WcTWK8n+k^EHS_lZS*he19>G8ew2^r_qzPsE%HAg z`B_lUlP>@37WwTYU)`II^6~s#m%rU2f8P;O>S zCh7BuALVa=vMzsyMSeHQpGN#D)8$XI$gelZ$G<<*<*&5JAD$;Aj#q*y*X5U6KE`|J?Eb==H^6xRo$NzuMH2$kdeyaKRxJ7;!$>;NLqe1=$7WvIb z%8sY<|Nphf&%IUhFO!-0`;+^itdIXGuyHc=|8y}n+)>jTjZZj z8=rGXf0aRZeF^_RJ(K(mhW&%G`7?deg7NRaEb{vd{oibmkLS!L`*)Ch z+@JEK_y1mt{4wp4i_gD@0Mh&aCyV@dN&ZD#IFxnyyDajjlYBn@4;$p?!r+|0vztW<=^L0tj z$L}$Kbp3C&$R9RT@}DX*_qQ(paSQ)+;vemD%7V`SiiN*|_{XN;|26Q#KWDnu@GwLF z@$U!q{(oYTe+$W9fzHK}CdT>5B0rzxuOxn4zn_M7bopO^=VX)resqi!s{4dH{zFdkofp-htInFr55?8gpu33H(GuQ&i}<0`CSJ2KZizi`L|f)-xZb;_2)l* z{v|E)#mg?x1Rwt$2Kf(LxpWnSp{CfP=`40nwnE3Y-f83QU z3p)Qm;5Uu`Fnrj8v`qY#{?`R%-TvoTf2Toyt4035NdB3s zGIM|H_W#r(ztGX5l}N_~$4_%F)+(S_=Fo z|5;+t{|#W&^?%7Ce+|jMgbRbRF8>9K{Bp+L@>QnmUj+On`*j)g?=k3qy+!`HUz8FHm0-$s`PW$F54&43@cI8PK>GM?vdFI^ z`KjXXy%zcT2Kjpp^53<{-$e35T8DN2f6F32O7ih<7BQj!ya&17{}F@D{{}(|2W_`*?)_{{vSgVy8SP;$lpft zm!^=v$RdBcL4Kb>e!E3}c#IUB%Koof_-7FRR84=hHBY~@=-+M7|5ISp?Kcy?Co+xS zH6;HuE)2^0_?-*{6mSqmKz(&y8YWM`fnuto0inlKfQT_mM?@zCk|zEs8FG;*nZ<4>uAb*5G{zVq~OGrL+&zDeFo|-NE zR}z0J|7*19-@8#t;r=($p#KvV`FE0hegB~A|Eh)mG2)-aI}2rY-n?{Dbxony@Q&zm3_7ijXK319luB7cKHKED5<%fHkjKSuIX`Tru|H;sQc z$>;u$?|e`Jy0o~HaCSmgH^`Uv&9@vB*!5{8aM~ z|IWbF|IH-7nUux(hws1W@{c>-Z2#9uK1~C+%XWPH%BL?}67WqdN zNFe)v7XH!1pUQtaEc#C|=pQxc|2K>Li%C8#55A=9f8q&d`+qr2{f`BHll@B! z`p-4!KhGlnE|PzgPy1l}xyi!+2=T8=!N1m`|4P!I&mVl(K=|L2i>oxh&=$K?4N(D|nVzZgG1nbSx1>l`dAFn%sI*bn=o%SMh3vn5~q y2$^32gm*wu$yagt5Wqr`#P@qlx%~KP*ay4zSLl&YF!6UhCMgy`|9C=udHO$_Z_Kz;#R4(Ew8nfy0oZNX=`n2eJ!>wsihSJZM0USV)>mjbLQUfoja4~d8qv@|Ihz^ zAT#$nbLN~mbLPx)?{nvh)TA?e6%+*KDhR$1M0W-af>9L_I!3``g5kY}^Q@jp`dCyBpI;VTkdllcA=epcfBDLg>p2TJ%k2?tPkki-v`@DK_QmH1&49xm}CC@hiqKnhDG zek6s1Bz_cyM@#$|3I|Jk2!+Q={5T4am-q=34wd-lB`l+`T;jth94_$@6rL#YkrbXJ z@lh0xmiWmMomclb6K90ii5>H8ZCWU87JT2h_3D1^rqJ)zu zoGkGv6rLk-?mp*Ad@6<0BtBij84{i+;rSHKl=uY{UMTS|QaDTEvnl+N#4{Amk$9zq zb19rB@hS?dB|e|R1rlFKVU5HuqVUTSucdI2#Ooxir*N^vzd~Vy#2Y1SqOe)wOC-FQ z!WM~NBH^VJepTX2DZEVLms5C!#Ft5UC52Z>e7S@xD7;$Y*GPCRg)1fAO5xWe-bUed z5^tyQ>k|J4g{vg~O$o23@V_K}1BEwA{3Z&&CGph~ew)IZC4LKqw@Umr3U8PA9TcvS z_?;BqCGoo@yobVjCH@@>@00ji3coAy`zidM#2=vW`x5^Fg+G+|Itu?=;tx{zBZ)sm z;g2Q$Foi#n_<9L{D&Zp(J}U9YD12PvKa=q16mF3C6BIrv@uw)tCm( zuiU|Ni`K`F-?eL3y7k8;6jY_#dLK2I&~$5RYx#zB`_*MC@fn^a1aw=0w`~Uq%9-Y; z`_(=9vqD81X1AypBXxUfRl3#WOsxy!VX2&3mHJ3;D)ndlC(P7-wN+L}y8TAQt-W2R zJQwAiL5U*yixHaYh~lw&J*sO3BE>|tILAmWg|%)@x6RmEl|HV&Qfkvzw>Po+)2&aX z+jA;@`<`L`p7^9~MtyX9iF)--+wAUNK4n@z-FjJfy0y70-InT_oj_O3eu{OVuI8qi z+S-#RS2i`&v-QjMwO4TS z9$yH8`}e%I;I6$3Zrhvi8~gUTxo@zcuclLS?JC%BML{1L)_z~m=iXkynqDVq*-!2> zHn@=T(Y5QAg9`dB>~nF!Hw*TrInwu;gXsgI-N&t5^;ov{Rjah!i@p2oxvipDwL@Ew z9`a68zlW4j4C z#;5zR@mbiAG~PG4WXjsy`EI}cD39vQGAulk;#Fj@eSkvSiD6V?dU>k5fbj10DXGqe zSGmJ`di2xjcBSq}ay@QEWm&Y?TmL1=Ya!Y1u}x8cFoX z*-d?*3n~-0>rXxB*y-G6WvU~#Hg`~)ZKC>i{EXEfHiu~}nqsit&F$!?`rWu;#fGL+ zeqKzuWp+Tb5a}3Cr(0i>S%M%>y3(M))+eZZ>aD6PsaaaOHS#0Rq&iuuZQr9m>1R@^ z=4so+Go#fV*kqG#+`# z_*>bORAnf9`sb`4WkT#TR7G_2XrtJ#P>q<(vMAjy>{}~}wwEg2rYYI3XROmuq=$5T z@@$4=YFfpp-5yZL=Jm)mo6;!{X*V*`w9?g9=`^7UQ5__{oXmD~s$2Ki13esM_=~8R zg6+BaIuC_1vB*OH-?K5%4_a0@chBmP*#-xPU4r|8tJONWUu`>qrkSKfcNS%0+jt9w zvXF6F{!H3X`Nyq~aB=Am-buIqF5UX;p7N_Uf2#Q~l_zcpoy~jlhE%Y<&w4J7y!bR{ zN#avNPpa)~bKK5aV~$-Ooj`f`Gwj)Mur&3JjNsgkqi)gxudl%HwJG<5P7L6Uo&dHCvrqt{gc_Q65 znLJ16;I>=)BK45dZ{9%a*$_#l1_B<esH>2KZ`EWvoZ?U}%3+)c_d8;5Zh1VMy`C@%dH%zbb2UzqT7-*~Clu70 z?&&bh6N)3NQ_Hq)5HLQYEu);9Nf{l)nUqcA=y9ZQwVMt8L1rk4Ow?_k@s%FNEnR z;a0uxCs`swz1JyQo>!MBDIz0ky?Q2=bE9GddTPCTj!suW>(!(59g80d*LI^SqrLC{ z@Tik+yHVvW_#MS`rEgrQvdez!)h)UV6&N|&B+raxM5Xs-XRIWf<<3B1V$Qb8aECeD zGfFy^LA4Z3*jL=B1k!pntawjV^k9s?%n044)!O=!DW23iip5>70-AMZEsGVPNZNi} zp{i|{wQbe^g+eKfE$=FzariX5l5ICCTWcjp)^?+=6D{CdQ){UQt)ccIzY`i1wU^eA zw0+yu;`DKvp0_yK+I3OkcoJpT238yaN{Q6T2^qtRZ14XIZdQ8X^e_uHj~JK z^;^O34s7F>5A zoN*~f)u^pq(}Fgj7P2d$T1Ez472nN0d^J;0tC{XJIglY{j}N?64FZ&T276`S;m24Riffd4eMR?jXiJd483PDh6vWuz`Kyv9rg1$=e28%`V=IE!aSPHNCw*PR0}=s(g3T4$nVob zVryUCSW%-eXQVaAAC2_eN5zOon=%I~SXoJ@wh~!Zpt-vyPSUL1VugvFPq4MvEZ1X? z$=!yCs!OkIXrjXAM|WcX%B!e*G0O^_{>&J)T_Slk7UiYJ;7LR=?xx^2o9gUlNMR>{ zyAI5aRm=PFt0=lT_t|ZHmQzMugvxI2!07|eblPFth+9(KhmApv+rezX9i`hzz=VfN z@uVoWFB+G$B=i!kYTJ!g3C1zAc0z_IwX_H-E^M~=K7*d$ldg(MGHy5At72rM7H;)JEFpez`k8+Zh_=Hml`AAIWFsS02fC3 zWQi#>HD_nn8Qlh~ydh@DuogtP$))D@$LX?^$x|Ubm`tYssV==S06tK5Dq_=at{$~~ zGZ_=rsg;(WyaZKyyo4#M&{CpZhUR3}D@o7TI+;5_R4LV>QI%VtiMj~+KdS4idbmxj zXyXF1U@-?xq{>e?dxF^srRr@z2rConnzrj$`TVr1tN9iCX;s+!Da+>g%IZn`0TR{q zQ(bCBJylv9yWju$wU(JhT)Cr@=LxNk4^Y$Z9~Z0O#v%$(;LU2qrSiB}TxCqxcD2eu z{W`w(;TcG)S(Ir;(sf$(+M@l&5~gpzTC)$0fvD6J*c7Z6W|7;ZbT!3plh-(8HhndV zAKD1-8Oo#_rv_|!nyi3hS}Z-&ZPkmi*7k+ERw`&Uyi=+qR^a_nKc*?xq7_Oy-PZwe(h3gz{h)}oQOjH)kM8l{B9HP&E8 zmMiAekwgprvWTBvrndc9P0C|yKQ7Cx*R(qQ1^sUoO1Y+Jy%v)#T!*Zrs_8oMW|C|w zsr7Vdj;oA@+SHZ=J*VgOnpW!X(ocL?n0^GFO4E|QU8lj4MS6&=42z=zRYR!hlNfnc zTh$A>&EW*3--=?|2HCa;{n0BR(f)F^n-VmilY2Md6#}go^h#kJg=nRL}d%d`` zG^wnNA2W%O@QOk`X;P0=H{g6Hs(2Y&U|YMU1x=-*n)ST6<9zZam`nnstLhQy%8i}W zk&RsOIi> z)kM`(Z{z~0s)|PKPe#?nXaBAGT{yE~H=RhoG#I){rMH+XY*EEWauxX%MLU$U}s^6_Db6u zNhAps-}-9k5gi$HM`I@KhZeg^ko~W)kZt^{kWd_>yReGKX?^heO&mDaPO=%ZJ%bi6 zQXied52yucn@QWF){YqQYhE^~_0O;n46~CxwCTYisVPS}BGhCO%4rmp|1Ca3C=$LV2P?M9p3P0dP%!O%I9C=0a#svw*J zsN6=w%GT6APPh)zRLa<-gJ}CPCKqi~nrdTVdM8wN4`uHwOpk5As_g)SB!n`%kZD~7 zRrf?WF{*I1;DJMtwe~o0C}J~us)0j|HhQB^4?IyL7-N%-ULGfeUXLieG`Dx<7P9DS zE~B!xRupfW5sn2kE#TcX(;sLy>{vWWvNd`z$Dp~^h+xW){Wx(01;0v1TiRNZUy-ZR zO+Df_)F;Vm^?a&;p4(1dqXw8(+BxK{DK*f9mgL$uR7I*yMj3Bulu-|9c(mbRDWqOy z1eKk3;R@Z!v65BZP1pM=?df`cBZ`5xvx4|sr+I* ziNaK$%2Hg)vev!4!J^)^Aw29!RxRBv0ot)QViW3{ z%n-G|mDo(xTQ%6)%4F4s&;RH5YFK|WsfUs;ZC)qS|MldYD9$cneR}x@TE&YGQ7Z!D zPk8T;s7w++3EH0u&xF0#sUu*pWc=5Xc#in`>ml7s|5!eF7`3X zZEk7%m23CJq}JENt=HunOVq2f*iyyBL|cT~?lwJyJ2b(?*dkW-pHBU&K)+ziot5{L zS=Ekl)jW-yNvu{=ePZwQsC~oPtBIJ}#R#8TOKo$Xn)pS}B-c^9$yAQoSUsCebhehYgd%OFZa|{Q%hg<%6wbLx2+fHeI;z{Y0a%7sZ79y9)@`(Go7DO@Lq&2?31<{> zQLqJ3yS-ZGhgt&7f{G#S%uwtg zMCNQg8Z&*_YM}1CoO>Bb9eS9Y`m(B~^;EH^m4M5O$GFl;uY>wgC%w|PRbFZ9rspi( z!R1E~+#Nj)rJp$|?S&2|o=ihuK?k(5i!nRYYzl&>V6Nepgy2WfFleZUzNEwu%Kx2C z<>>8UjR)tvjnKD*BHi+<_q$nMq_dvJf3U0Jwso8$d7ZAZ=%pKPMci+#yIV2 z`?%5RSpkjQh8vH~^c>q7x#b6BdnZS3o;t?%-?it64A9m4KgA&&l&$?8_sQKD!2{~` zfwJkIMsU?{)It~d=GL1+0@L+qzaa9FRB-5jxO>a%hpF!E{D6Ne-KM(fH%ICxMMaEo zOEhm;Ma$%{V0(`0p4CPzo{CdbucRtdD79(h_k?-Nl;^nS z=^U>l!gOkC_v$=+577D@7{3cAGjVIOu9>YN8(T|4aJY`bwG^(WaJ^xw=J;qhNozHh zdXkcQQSO#(_X271F}?7uU_wOKb)sd1m79_VPy~}O?EzQbU3!O1<(+7@65I3 zl+`8H(NTMn2J$qC{M^`oPG#JfV)ij}r%jRQI&0jxlS>BAnA=>})Lc?NeCY6@Whabm zR=2}0A2woW*@z(mD;oaX5x=&~zsEmo$_)OL)dt4ssk*xQOIUE})S#fHxZse!dls#t zr>KV#&j0y3kpHAUQ+!RYar^EunKIBVr=7|;U7zJYCjIOveHP<%?azNq`h+NbDdThv z=07Gq6Q$qEI9*5ZACrDwl>QjwbotU>*2&)VomtWkB|Y%vlkZeX_wk>VC4Fg@^jou} zKb9r^qF~&K}ZP&fcOg{sv-9&aQQ&^jDM&~#~sc@$SslZSOJ`M8`L zdMJm}AIc)f3q7Ql5dC|SUPPx7*pn08V^;~`qa=L`XTo~C7}?A$$>Y*F z*JG)qFTpZ;EeiF0tE5-N($5OhACvTvn6AlH9bT4nm(6i|Y!REdh8iQ*9_+uHdxv}m z@qka)G5p8W^-EDb$4few8K!?RO0SZ1pB`37y34KxQ<2w6d+lTUp^0BFZ0~(tpXGb> z`hdByPU)*{>T-=~C6v-7=?`!&Qx|Ug+ar1V@5PBh;OomHB;8lv>5}g2t4)%w#yulL zuX#!UW&e_%Vj)cW(n!9CB;BXa7bN`(r0=yPEdM=8_t{PVy_wKIuNxuhzWPm<^nqN6 zk$+-N38>9@MkLZ+iUp<4q%sdEOK7#vRk?4uPDHxMsis^fWZ?dQ0zF_QPKK0jF-m}$w zVcH&)kK3k6c>3(;21!4b@`k#FdCfzTJ{Hrt;pv{se?iiZ#`M`y`g@Z8c}$-lrT5>L z6N12}vk{U$i8GnD2iu%3=_g`(ZB%}fqAtc2p)B+-NV-pd?@79^fA;?j3$DML zAJ)(6pQ9v?O9v%HJ5$nmP9G~ncVX2|OC`@_%maP&R!R4@!()=}(qjpg`Ld+@`Y7ko zhELz}=D2A~uIs%~dks>ZBM5wbY`ml&h-Jt+xrDGPN$*LHm6GQiEQ9438_Ds2^Ofr2Fh{hot+)mA=JXu-oTxzdByhujEWdSG{z{GCZw}O_>ZwQ%LkW99^T&x^Yn`LpeiKY zHMVjc7E8KMN2?^=rK1v}Unl9!6c72cj0>WAzR*J%EW>+}?$dLBrC@iTVEPe~?wYr9 z`gBQm`PC9iZ<6$${L1PcWZ*K^OZrn3kLlsZS`XZJH%fc+_YM<%_x?yBr z$FzH|n^Xp_&mc*!jHT-Z4X2Nnbfs29ueTl5m{uj}E`65}{R&C%$?n!l9+zFP44WkV zc#4O0&`U}s!&XUWy@ctoMla&W-E{ftFj&&h;!LKFWOtX4mY9E9(tUn>p`^QX!1OC6 z-BrI5N?$AKJ=x5&J(R&bc1ZfE6vsN$Ngetg#0fpjeDkkB9{jf+yd#0{O-Mly;Vg%_3WML7Xe=xYo{!y|o5J7)6ODz1!Hcnbb5j^>HqlsE z82mAIZ*B^MmrXPl76z}z?#)eM&}pKvurPQ%c5iM9gDoZ+3k!q4#qP~bVX)OiV_{+N zX6)YF6b3s?G!_;HZ^iD-O=0kN6ODz1!8@^gb5j`n!$f0YVerq`y}2n2J}}W(SQva5 zyEiw5!N(>V3kw52JuZ0_22OJ(yM?1gfUHoRFb9A{3xhsrmSKj%U{4RuU(iing#qt; zCa=PvuLs}PgZJ~`{2_(pRT%8=!OfGfI89-2peO(5Joo?)ey|5W#DgE^!H@9Z13mbW z9{eZ|evAhn;=zye;3s(S&wKDP4?fI;kMQ6lJ-B&_X}9mmp8ThH@Y6i_7d-gs9(=3^ zALqeS9{fxXp7!7qJowoje4+=R;QV{|yl9{eH?UhBc@Jb1ka|B451^x#b%e2E9Y*n?l|hR9{e^B zeuoFY(}Umb!SC_l-|^sUJ^1||`~eTnZ=fWv!eE^Tf6#+J!D#Dnkh;05v~TwEqv_j&L>9-L2zOS7E@X-6pTXfKR?nUWEalf}6Yw13ncuc@+kOJUE}2 zo4g7GK0P;n9Ywdif7KwcF}#_AtLHQ-t~0a=-lT7dR$uDaHodzohz|6Q4ZXBsU40ed z9u`Vx{wjRW1b&*rixRkAS;z}2kg8`mygL`a^avs^qd=1G>3spwQ9koH2=-0j!xjFS z1U^&Y{Sx?P3g0h*e^23RCpDJ#YlX|hGDz8?aCzte_)&#?Bb)1h&s4Zy;fDaC zqxUJCcX8v_Qwl#U4$|GL3NK0E`>6*V0~7e?6@E+tZ&vu=1g_t?Elc2!tNbGp_}dCs zPX}UYgOmwQh+%v)R^d|;_!SDzB=EZxUX#FouJDTz`2NboP49}5^*gGjcSZQcD*q)B zAhGW%{PG08N#V;9_+J%%bpk&~b**a>_+*7&pTHXwesco9OW}7X@IMn?3j6BDQnx8Q z+E+K0{jS2JeR9(i_Mxs`oG6`s13`Ex?4KKpIZxr*t1y}AflZ$LcPTvDZ$CnKJ*n_$ zKe=3ReqXZ`_UBFhVsbsDus?6`As+k;g-84LCjW&Vyg}j7e!j{7HHAm}*cXbNcYE?b zs_!t)DL-%%cXw!*h2_+I6~ z?^F1jVSe>a1KmBT@V&xzIaPAJO8EZpJd1zx!q;C2AJ}V%8Xfqa%vD{xR5|~UyC9e$ zu|sG`D~0D8>bD(~HcH{q^9a+Ta}~ZTEXU-(PT|pW1hYbZjBr=~{f!5IljL;ee_56P zR>;@b)!sDpmcsLhVUpuCh5tRwf3C!4D?EB0F;(#EJoz6`c(Q-}LgCT#3*)c46+SF% zuVbbBV(L((L2-x=5&Q&&?;qm76}*CQmmV%u`TK|YH%k6XJ^5F8@LzlImsRmS$uzXX_ z!yf#3h4)G1f6Idx(EwT+3=H!dyBe(UBSZXfk#juZ)C7rZwg+$V;NSG%_j&Li5nd{@ zdS*UPBzRWg(Q_yx|6dh8B$VIapC~+f&SmOV(%)UL6A3R3qUTnmMs;1R@UpOcGeSJB z@O?sjnB?zLcyeCx8G1RQG?*IZA1V1qDSSkTFA=;_;n8ytBhR-KJ~GT-A^9Iv_$eXI zzm4JRGc=)cwd0wDmj==EtU)?^FvpYsB9&jSsyOR0lK)zT9~kmAdiagPlk!%6U%VdR54fv7a{-er8zC1CqapmO7<$ zzKz`K-_Fp@D1}c5aigDe6`t(ZS1J7LFu!T9KPh}-h}R0E{pg*R(qK}ErvyJ;;Zs7~ z_<>mpuL$ugB>(LSzdOVY-xm}BL%Nfc=Y^~+`hWj zDg6Af9OJoOQuqZSK1uSwukbI1_?d!FJA~z#9paM(zg*#!A#UpRn8Gt5Zsgpq@aVbQ z`BKj3X=&=R|FItY91or$yfl~}@>TB;5|29+9zCbKR`|Z6@a18CBmW>;5|;+i^CQ!~ zV-$W-nBVm4I)z8i>G=07eEnJB(Q`Wf?FwJztC_H*@X!Q1$!mkYZ5<7K$b|9C3O^DO2y5=jq zHpGoQcPhLt#7+PDSmD=(xanUfm2&y5A#UVfpzyX3KUes^r116-H~s5#M{+sQ^FdRu zixeI`Pc(A=K;hSi<(U4}ha6*Ra6^dyNcf(v@aXyAfr8g7{M%uEQ_g(~za_-ak^H|= z_-!FROz<}pen*I#_9{J!<+&-uO+T8f@H<1?_}eQKp0xA36&^h|yi)l7TH(?2!3BbU zsPOy4^38ZOfDF4dcp$__OaAi|p7a9^3OB2wAXp%j-%xncu3lI8y0Cn@Ro8(uK$ix8 z2=PY2&r$e;A#U3DL4`jQ;>ND_riFZI@NkG5Jug&vvfb}ec=Y_ywEK$+eN`^5N&8u-@Lz=ajbFN)aF;*4%Y#4a!Jkm&KOL5D>h+4kp9yhehZB!u`IB~dk-~o& z<~QZsrtn{dc)953J%uOjaKGcZ{Aa`b)slat!aG9T^t-7Fe=fw0T`gAl^C52Z{6~eq z7~)3Gfz+XBKP|+s6uz?*{!)k=J=~`7KZUsIkH1m)DF__|_==gRp$#Cm&Y$hap}k`Twl&q#jC! zGvANH{D$vM3jZX;pOSL^sPJ7OzFzQSMsPU=z2sK^hJ$XdQ+V`zwo)=Yr|{_c>;Z!R zUE$I5StHLO)S*h@`K+;r8ihyCXZM$K9#DAneAD3XC_H)&dw}FGp@E|mp2MCc_;iIw z&vR**R@YSukDmWhH&@qB6&^jeC396*zmvH9=((+_*C`5*p4%EZzozi$xvgo(HxwQ{ zpFLH|KYSFIA3dKnHbI%4Djln<{H+hnHnCHFZtZ3#uD3P4$_13o9EMGc}Ew=DNn3 z1$EU`6D~@n@+Dc6KglJAq2*Wtn13!imjIHMNZ+H6tqDhkF@Ku}esioYRJ7a+cIzfRSZdlMz09-ncYV zrj=z_X`X6@$)i9+(2yf~z zkBBO%{HYVE*Km=eGnoZ-&6#;EEmYx5U46r%%Gyj#Q+0#VTt!vXFQw(Un-R5X*GN{Y z=|c{V>WB1MxF?kwi8F0@hMmxGazY}~2)C(~kIYQ3UbMKrp|atU%#zC5=IU`LPB?q& zM0Ob!RFCnC&zYVprPq#}j$3O=>zRDT@J01Ys!_Krw=_dkuc(8BT1q4)t28PzjV!%# z0oBb67FMJ8K$ERjROX_vIUN;AHj}E^@LUXRqSwNd$=6-HsDcN-s@jSr)3`ihPj=c^ zb7?h?-!hahQVGM#Yw8=-IGU-gnX8(+rmm)`$FVaqU+!w-hZ*ISyPQarn#-tN9+u_I zJua`(#$_ulOt+dnVq+%=MWTC(TnXHhKhl}SV7!kY6g5)5@*PPt^2{pyk|Gk*5Iy7#RhUCwXFG<|DpS?Cy+p}9Q%8-HT@bfHg`BKp z_tedj){`kNvpbWKT6Vtv;_8OR`nt;6 znkE{^%6RmSE4?Z;Vt!3+ZA#BBCfbQ7E^Z)ysl8H9nR1^Xi+`qFGx=ZDVTc zwEC$NbIzG(PD@SCOdos3q?8_=M^x8U)lQg4sw?Nkb*8DIvZkqV z!n_ofLsKAf^fmJ`^(1+9<)R5hS(Zsn8>uD=)9Q&?#hJuzT1M93R*NRg-LnieojlQg zJrt0KmH12XHmIMZ+_oj^9Bym!mytBE9`gEZ-%nDWn;9kxP zB{qQ^lGQ}1bJ&TGY^YW%H5z!U8>;K(Rg<4ejcB@LaWysIiP~4$l;tDHRV%8>M&3zO zO-*H;q*f>mw5C=&l9hE$6Xs5uTb^b6&*6+@B0)ta=Df7M(PL_PnQN@Fs!qjDrbe!$ zz0=C33^{Qc)zpA+(){{{iz^$dCh&@xR?1V|Dx!`dI@0E06+fIyl$Ds3MC-Z985$0F zyM`8YjnxfJW_i9O`}RaRt^dsmep*v)BimmNBhNf)Qff=F=7|YQFeau3CAC?T%oCcK zW9Uy)!I{n+Wdq@+jd7M-)DBp zjI`pJsgEiLM*9+W>-gEk8q6xth(P8OI(^*HicmEauv1nQ44sL0`WL56<=|svKID_c zVL+icQ%K(t!&n7|^Gq__6!mmQ^6^Vzn1bQ@yxu$e?JqExU8o zJ4UJoGP})GHn&Vr4wJSDtD+gNnp)(v!Q|RsQk672n3f@sBb=6LCO6nnt@e-AAjv)4 z&NrI!)zzzEEy_!>_vrGWJ4ADg$+QZprnOLQbzN#vIKW!`PMll4pr%eYTeNMusD|eM z3E5I9ny!D0Ue#&-Nd`th*VygP?HSIgO0?gebwHH_ne3>@!BkB2%oj(Hm#C_DJBlp+mt+~1$tJFyTC2nvk?6z8p;b;Gf5eMZ%3q$zR902dbf&R>{)A+= zN)gYgM5HoDn?8<=OSE*^x0NKXP9!US)p|pphd1BJj z=;|l+54aARaCU$y+>KHAjLbB(k(QiII+z;G=RYtz3Uk)LIa)i2BS~-o=gv-6abje^ z!*d$K9SpQ#@))8=^^vMrHLAPjX30ms>n9_y{-?XHW7Ufu}z@$4>>aA@q77B~4G>?Ea&9!+E|Iuu9z0(T~uGDYtOk@eaW zCEiw(wLf>~MciEa)kbT2K-GvyPg;$(`WtLrM~*3zp)^C!$~Y|w)Py~8@U zrb)f~Dn696(9ZRe)QRe)CwkY3I*i`NW?NVPl!?7#u2o3iVI$)97v+iGVFI5jV^XxnO{T#_u!pIC zwt2VfMJF1F|ePxCi5a>?k42yv%kF70Dt} zG=7@(O|FBsqZG1d^xaN7NqWW5)scC4R+|aW8`6kNrFM#~;poW;FWJn*jjY_|>B@U@ zb*y;p6E1G3Tue@kTqn(wsF}nU(mX@^!gA#d(e_9d%RR7okV30snqYK#;V&Z1x0PH+?K1Skakt`P-X3b!I527qTV%Aq9q)?in@jAo5uY+a%CS6 z%x0fKfBM(KT$VV+Jmtfx*lvZpD7vM*~oGk*HKT5h#yk~6Qi zs%ie>j9xXT+|wi7*f9ZnnD*?Bb?M76WLc>Ah?7qEI!Pi2s6qHR8LGd}l`ER$#Q$)SMNko3dK9@wLio<=rQ z)>YLn%2dvqN1Jisd)k?%$_2_cftu%GQ$Rg! z^{L2FT$O&tL<%d*j5EIla~R;+JSk4G?eR+l-dFV<92PH@Eup&V2@da@noEOeqBVJW zqx?n^Fw1EUO`sztL})Wa^1A+o9<=+Ofp#qeq7q_gxcq%TV;Z!Q<1)vOb&f z4vu>97g=BRS9U|m;j{T%mMq3!x|$`cf1qWcZc3kL2q$!UaCg;vdL~N?&_*g*sCsqC z=?Kc`<*X{6S!m^r;JH{HT_$ofQzq`lOerEy2*+0F6E4{g%2GKvA@!p&OdzaL;suPe!hfUPAQbr4ET|N zuK@fIz*l+jTRr&Qg4^;u0r>|(`5l1sSEfvT-vaz-z|D7CxL$_?ZoUY}cwfLd4_}O9 zea)B27(Wd1p91+2Kih*}066kBUof)e`8wps@^ALw-}T_;OB;6i=8F+F{sxqD48@I} z{|@+Iz~2KL^Oumm_~P;lApZb`YP`1x=e9F^G5?+(d>_C|p#0AOj^*sf(Mq0`OA7xn3s%PM?EO7uWkF!0Gb}>f-#P07w0t4EO}de=6WJ0O!7M z^oII59dOjo7{F0K-1kj6CqnsS0iOss`sam!qu#y-_!&^nO@O1{c*KMM4sh&`F9DAI z7yT#Z&!rv5ft>laBicWIP0;8Q@$nu!4LE(?NL_3v69K2spoI7&z)$z!*uIk?|7^)` z#wq5*7q;UR$X~CM1Gdw10KY_VE~f(U6@qiQ=K_x7DawC4l*8lrQn~+ugj~*4C}%U^ zsGm0hp9cB&pg3P#4&rPZd@(*9^5b}i<+BWYaekD)0dW4xrfK)<0Y4A$+W<$qE#boH z;_}aj{KFKg@tJ_14fq!UN53=+@F|dgHsFnb@1(eq|0=*SKeo%4pq!16KLa>@PElRP z-iFKl(Gqff=Rp2(fL8*3KHzf!p9lCnz%LWr@HKwTeD}oW`)yA-KeWmjCHLsBP=0Ke z`5+Ja=LLYHe^?0kp%!1GH~PGqx@`H4A29Vb`B5H}^CBn*?YseS)aT8BWB$7U$NWD5 z9Q(xh#*B9HJ=P-Pk`kHp(xd&giet0Z4IP&GO(%>jRw~@gye?8!s ze-+@E|1Q9>Ugk@9cD*)8ep9cLwHU##p&V?-=LJ8O^5J~r708eCjduY@IeRlhx>z2R z(|pOvmeZUVW8^gb>jWqV>hi%f-3+HKw zp9lFDLw@5YxSX#5j`Kzy<4pNep_~H1=L6mdxS1z#`G{W)`Efpfg9l#^coUTWG~lTJ zKLXBUy^$aF+zdGGKcGBwp&VRa;JCa5%0YjNe2qV6J+wf6oY!G~vmP;aZoWT`c0q3vS8vSeq9LN3RDGy&PKjJ)B;frycKk(Scmz{qZ;1^Te@ckCx zsDIoCxD4`}FJ*H1mjnJ6PdWbt9Lq6ZjI+x*9{dT)^98`MoC^WJ0_14{9LxC{;8@Og z0LOA31RV9Y32-d`pMay?>hqd(yWqO}n}w>mRC{q7nRfXr;8_0ttT4Jb!19L!j^&>P zINJFnz^??pGXcK}@Or?poQnZRf4dZL%#VIxIh0?jYNhM70`QrDUk$jKXEGbK|LZ;Z zZv*@qDCb$gKjE@u|ML%kW4-)Q(DH+#yt z6L4IQpg(Mba4};AS4q`BBfPH!Qyq7T ze>LPk8t`ueo(7!P8m4?~_c4Iuyn^?}P5xZw6}Liu)DP-^yvW1D1J9pNlY8thw?R2y zlXTY4?SS78_#J@%3h*_6zYRG0&(kOmUtB)oUjZEbD*H^n?EGxQ21mboH{iEW+~{*7 z;OKAv1URe3_hm7Y2r;CHWkpDcuk?(TAk*_}2 zQI~^!*F%2nFZ#Sko&QSU`%B1=^OH`%v7D`d<2e2n;F$lLsT1{?9t(i`nD6j`s@qV*EQ$KF@{tVjTT5`%=CbzYp@WY<$`IpZ4I`@76*&e~0`i zr};uNm(ObiW9MaHpO_!_8BqSYkRR)NBjA|-2Y{oTj{tr@$ny^1SWdCnIVZCpKA-;c zbqLr$uJ5J;z7)!D0UYc5J-|^vzW^Nb<2?TgD1Tp8FkKvA{u2Pl{Nn(}{EGoEhw|3| zj_ZY8fTKPSWM$FC$=F{G2ORs?v4EpL83#DZc{|`J=MMqL{4WEJ`9A?1>$Tq=O8kWU z2Lg_MrWA1WGot}VJ&Xk$^>7~GnEyyEj*{nl&@Q-7h4b?g$p3xFkMoTm0FLv+9|C?R zl!Nl%e0v?_M|sfyqx=s-ew61Sz;QlV3;4e?KgV)#evbIPP+#Bt9P{J+9OcLPIpVp@ z&v8EK(?8D7aXx_abHq`fKL&lG{vQVXDA2=C0LS?`;y6EF5BahDM*u$+%AXB5?wdUd z_(h)l-vAuvpXPZb`yVVH?Gww#=lG8UU)00T07pF_j(Wg#%0Q6w=THvn2k{i--vIe> zefR|;|4S$b_bYx4_;ASoEa2FV=sy=jeq4`V4fu0V4$cD$07pB-@#rBa=eLmm zDZo1be*y5{0nWVmV!a{Xg8;{N90)j$J0k!;p5mq*CjyS;OamOtnF%=N$A0%blwZQa z)5Y@t9&qdzF943?)c*kP^OM*wUWEK;Cochx_KEg0T1lzp#PJc=<5*uD@6c{>-vIHk zP(I?=@BRpKRziNBlbiNJ|L`*4sE1bop91B)3OJVY8sLK=|Mvht1@KP5D**2W_!j|3 z`@!~o9rF9y7xjtx&xZ1`T~H5yf%4H`{U`k4B9P}9;EVRQ1#t9-h@(G59R1;6p&YdH zHvmU}xD{}0_iY~hO~402y|x36{TFeRe+T5p{(|c!l=E%KkL`&2dpO=9J`LpLwW_PX zbb0W103QhD{EOnI9NdR|7xJUu`v>49P!5j!s0Z`|Xy=HJg>n!_zwsXMt%UqOzroMo zOuYs|{`UbN3-||s&j%dmWBA+w^Dl$^XG1wSKgV`_81nap{Ajn`fSdO+cznTf&<;O@ z{OHd=0=x$Jehl~(faALLdcem({%-+(CE#}heih(90DLgu=&#UkuYmkJAwTYKKLI%E z?GwNULOK5e9Q!rmsLx%HAMKf60y1`03gx4nlmm`-aw_0xC+Ob_pnR-XFThbA>@V2A z_%t>n=UCv2IQB1oC&%Qkg#6gQaJ|N-x|#gAUPB!H6}E3Zl#lI;euhtnGv%Wm_VnOI zfak)O_tH)IB2GX}9t`0>a+OF(S%X4}b1+8YjB}qf*Bps3zNY~xTqbeGizLp$8i_N$ zm&7^PAaTa`mN*BU5@&oLiK{?lX1p)pC4lb>IQM0~IR9r7h zd;{S71KtVvX8~7&&^^o3AMoQCpo;@D=jZz|fJ>C&U;^L=C`A8R2>5}3uLS&afPWKk zF2~690N}<}ne4}abAFT70r)|jQLZk)4>ll$xKDcs;ALWbOlEuqC!6OTj5A-8X7+Cx zH+`0(!E7jp^OrD4m)Y0l{D&(<|GCo2KST?e>XYjDy7fPda(rtn$7&Dh7uI{-Ih7UO;Q;J;da zqhr1=1AI6Ga#a96!hjSm2K+?8F9Dp}ajc}R2HdP2IB7lLW{%4EX23@=AXhiwX3fh< zhl*2XyE1bs#!m&@tN|IH1GpKx8D9qYX$;7<25>Wn=cEmQn>|d%I{_cVfVpIlU^$I$ zIB74yS#K2#(lr?HGc=_BrU4%Z_(H(P1HKaQ6yR$CKNIl(2At(tENL$Qeir0^5AZbL z17z^y`c43R6yRnp%*itWp9uL|0G|Z-YQW9jCMT~4d47iyiadJ1{M)!;lkU^T| zH*;^sM*%*S0l8)ZZssbS)B^Z)lbOO>0iOZ*V}PFr_{)Hw5BN^NX99kxOeR?V3jjYA zaI-e&R|8%J_ul^ zfD|qRyb46# z-U0Y!fOi3YIpD>``iA8zXtdkz}o=d0Qhx)cLLrHc(A{| zVfnufcnRR&0DL^)s{pS8{F{KU0Q`Eu?*aV30N)7s4S;U}{6@fge^%eH{5JtU2=H$K zegfd!j-N={B*0fg{#wAl4fu6{-wgNzfZqc6vw+_U_zu8t1H5m4eZ%#-9q=;1?*P04 z@HK!h2K-LIR{?$(;OhXt8}JUm?*Y6E@OuF-X64ew@_$Fg^q&!c-v{_~z}Eua1o(FW zzX9<30e=Ya?*YCU@CN|z2K@Vg4>(ZYu>3y&d=%h61bimo>i};7{J#Oe74QcEe+=*+ z0p1DtLx67soU6inwR{zQPKPZ2k9Ac29Sr!xfTscf3E&F>Uk~_7z<&z(1AspQ__KgN z3iuAd9|OGa0DZ&qKMwfufd35eNr3+x@LIq(0Dc|dPXPV^;7!C8t@9hp86b%iY zb@^A&UsjKG&WkLrhVWoK2Ln$|hf*Y``=mvG$?p9A^25{r%sIG27tEU{=MvJl_~@g? zR+HyudJX}7gbvxF&$P>jNF90NnuN1>;}&WiT3D3|kI;?hOGxK8fVd6jQd56fj*3N< z&x@=_dx?%1j@Q~~$89yas!AG(G@(x1jI)TU(_=QfIo*ZzEU$IuaTYm3gBQo^cdE$) zfOMk+VdDG$bV?+D1xg+ZsRPhtkG$=@oaJV)ls{2++;kDRaB@FbCzU0w_Tz-RWhE%DzGZ$$dmB> z=JVI#919PjH0BU~?lR%wa`<9DeKs*JXQB}L^lY9-+{OxYA6XvDLY~F)4UV(%>;_8E z$fx|Xmz+4}(J0a(NB$>NW#j)Toq8L}oIJN6G*L4wB(o%KFV;*+$7GK5_SG&)VO*KV zheXZiCyhH4`cSK@(th$}C6f&tJ5M&h;uC6)swCZ33lJ`+%$JmN>*cwen@XQo4`ue2 z>YOyFQ*7gn$)7C_{Y-pPV4olxCrs3v226drlbz2~eo{ipm^fE9QJ7<@6F>7fF?orf z=t-w>)Aw#2hszqB!k4RaJ_Os)X8EQsopodTJU;PV9rj>3U zF0vaSpSePkS5HUbhHf`fn%9AZ2PIOoMNgTNt=hw}jLt_Eb~j1*%jj&}m_4y!=6Q~- zsV4k z6TM_c*V5TF9LvHW+t!oo5GwD9wDC$ry+7$b!W{#9_~OPf^AD<=rM4al%5^20%f5(R{fTKnaWTvqw^YZcR)cH_9%P=nMI_8Q#b<opBQ4TI%F}-mYDE-0avjIZwAW%5pkB zM;nGa(BUE}%d-qut-?a$e$mlY+%hAXqoMx&!+ArkB>ls`e?+ftDgOBa$A(&`f4QOG{>Pbwgu)U1e=e(#S^@|o&*U_&d>gt=Shn_WM#tDs0v}+^x z3+kGOE^eqNqNYn^VpzQ}Grys75xs@JprO8bG5!o=cjHUSgFt=?7%O6o+!aa4-;Lf$ z@!oQ8LLYtFLC?RfGjt~O(N{R=|CI;*Orh^9Ar|2_|T^BY>E ze<2V0l@9s;ClC4?9P}^dLBGa9|A##2A8^ob&VzovgZ`yF=r=m(|Ck4ThlBo4dC0ir(et?62X&&_- z}~Og&xQ6zvUtSItTq5dC;$S z$j{&TH}y85ul^ey{JBpVIurWnpLOsbmIwW22mSCo=(jlNPt1e9OX#uv*r%I%o6uMP zZU_CgJm}RA^(jC4FZM}>uL*tp`|=Nk=|cHW&x5|d&?En`dC-?Q=+DT5-kfiU{Kw@% zKgz*>VjlG49rTm(ps#Syze(+3+RcQ%_M7FPpOFWD^Zi29ACD=9uL*tpn;iW4+vkSP zgg*LZ4*KnR)c-o6NBccL5B@he_|MFPevN~k&rdP+HleTn=DUxm|5Q83Goi2jMmXpf z9n_viZWH?CpCt6yeqYIh|4aw{TY2!Wa?m&C!GE!X{)>6gFBN*UzvevXS2*bTJR75T z6Z-UjorC`EJoI;iqyBu}nc-_fAOAHD`b+bmf51Wi)ja6eJLs3@LBG*Ke|aAC9YT-o ze_0;%n;rbG$b){1gMNM<^j!}6<$2KWbkOsf*4T{+efCo%8PI=Rn+JV=2mLL1(3c23 zwjZyFjoc>m$v@b^e`Ox@BOLUtdC-p$dX&E{5Bju&|KIcQAJZND`J88g!_cR{Sq}c+ z%!7WRga3c!L2u4OMEkoj4|;R1Inwi4oVnJ2rKA4e%7gv}NBvjlL4T`*|F`p?U+dt1 zbsqHV9Q?cTu)oI~{NKrgexrl`ZF$Jw;h?`g5BirK^mpVzztus%CJ*}e9Q1ePL9Y%? zC4Hm+xib%X^F4U%KX>Or-@gwrrwi%drF*GX82bEAiG%(hdC(s(^jQCU^N@dpgFl~t zo2&d|9Q60)K|jes&wIML@}KFT|85@iRStT7CX_4x#X^tzZ_0yzi-SL(r?H#z7(Bzw-4ewl;5BM<)9Iq3Pk*IfCpcF_MW5Bhr?^uN!8ex1-`|KsypbCrL+ zga427px@}Ae<2V04hQ{5d9?q_4thREHrM)Z6?)VkpEsK;eV2njp97mK{Z0q}KjlH+ zdr$WM@%j79dC>P2di4LVEO@j$mU8v$H9MV9`v;i`fYj8w>aqe{MuaQU*VwNo(KIZ2mOvb z=x=q<^EtS=%D>h@&*$IfO8=09p5F<{mEN4+h5i4XJm{Zw@aOY&bLGET=+XcFBM*9W z&KS!7ULN#29PP2#i9QAT-;pw_jk~D=Rtp{(4+i( zUT?1a2RrC@=0QKgLH|h}^kW?L|5qOLX$SvZdC*UH@c$qW`dJSC{7zP``d{ea&*${! zO262_pU?Bnm42y%p3m{km42mzp3nQumHq}t{rQ~VT|XK@aNy(*!+7Da~J=Qa^!D*lV$TS;vcKf zW%SJY=PqgU=Xd&D{129iLpJ@F5V1@DB@X_q5}SY8!~bOAKbR{4m!;-loQMA?2Y>$k zjm@8*DbT+}|DBs-{lDSiU*X`-wr2C^Js}tWt8(Q38xQ}54*s1E{ye6*_}`Tye>0}r z_P5Nz|8)od;U4}^=E#32(Yx$#wS)f_2mjd~{;%iAf2N23ItTy1Irz7G`1jhEGSii< z|M7Y9uKI6s@ZU=1+4lFihkvQ?KS4TKZV{Ne_KAIbMg3&m(8b(0GIsT4*B1rf^7MR(!|5nf9@Cl=OS~8+x&+Ry^DXb z{D81b=-Ges`$IPW3q1UH3jYhU@SpDCKSubcfj__hVe`Mt!~eW~ns7!I{w*H{XOI1KY)L%Nf(aa{QT19 zKY)zKWq$`3EAn8L4#K~-{e70`UG`Td{L%jS`H#*2JP-dR!atk+o$KL0NBE~ja@POH z4*u;P{vE=fb%vK+e|}Gl{ss2{`{Vei~r0V`Jd(CU;LWZ7}md!gMWjE|5d`D-#Nj{*8d_8|G~na_x$)```gpO z|N9>PW&JhXsX7S%+Wh%F6_@@?{;Wx`|L^7C|633LTH!w|ObGZKR7`16Eg^5KWk^{!={si{8-mM$gRu7zh6=J^YUq{zF856WH}%>fvAF;6KE{ z{~izj={fSh!^3}+ga2_3{+m4fFBkrmrs5LX^?%C4ze4z@g^u-qf`k7q5C7MMzwJM% zh}boW_W2pJ$DenFeoHKOa{u5gqIdP5)gnKRe`OB&Z}aef@leg!_Mf)=t3CWzZq@W? zzr!5-H+c95hiUpHS?d3&hyNPkkMq|N4*u_X_%9Lu6k4gYe%V^0WWt zXFWx7Z}jqxhyNF(;j-;t521Z#7SV41TA_bH_?f_#e-P2T+HVo4V@-y!s= zEc9cD-lhNIw>6=$6Sg1z{*G-wmwWgRJ6hA*{nwWN5)c2u4*pXd{J-PjKTG&uk){53 zdiakK{w+e!^{;U7|A&YF%fjCtf9(3d?cu*(_@n-(I`|(+0}R25{*z=kJFU$-S|wlc<5XOuPLq6#my*{O$S=BYKzqyB+)&I`}X1@PA$S zS7hP;RS*Bc?`T4-|3wb|KlSh*cATcq)_)%I@So}6&)<)-_5YEF|3cwU?m2dGTj7+pbzFw`riwQ-qn69MgFz0{;7A!|B8qIrJ{I#K7p5QKbt-L%lKh8T?<(_ zy14)H_ortPaAzw)}5;=)WZNGL7=m|J5V^I*}jy&&3Y;_oL@DF8!|%{+|yy>j>w?YnX@r zM?#;i|D8beF8y~p^v~a~vhAnM!+)Fbx92am{MUH+cRTdQ->patHt84|KQRMZ(|iKQ{j=5B*Z1x1Yb*^ckXewci+r{8u{UU*+L{ zOOEot?xFvI&}ZxauXyC2>5!klpJlgy@6WmQzghSXwA$b9|8qU`9|?W7`TuO9cjmBkx|m?|R$%`_RMx3-aPjMHc?=dH8npDhcw zVOjXU;NibU_+$US&B6a)9{x*(f42Ff!%^@VEUB6%o50_t5Vp3;!!)xs&#@-Xs53kstftJr4Q1Jp8{V{4cWj+x>65 zhyQ?oX+rEj{QWVz{~UR!yZzo1{tGPrw*C$$dRP0+5&m<8p8fAy2me_f{*Z)@@{$0YK z_gwg5{qwt^cKd(e;eYH{O_y!`_^yZlOj)U*{jYQIA9O;#{YXg^oI+*y??r$S$+q=^1#siOO(9{JNEe~V;g|M7E& z{2M&{j~S;4v(0}V_3+;y{IUN&;o!f`!~X)|pRNCF@$ld5;Qy3^|6wI=`}w-?&$jHvfnO8{hx8v{{;{Kk>dk(Ws`sZfo}b!g}z)D6aFO; zV%NSz?~=cWf7nbH+Rv{Dvd6zBqUW6U{`sZCzgm?N{h@9UyXuMF#lJ-O&yn2Rf1Y*l zzsJMBQ~2BCkInxM5C3JtAIIP49Q=Rd;eWhL+$&iu+GP8E;E{i@Y#ieF^#_OiV~%v|?)|`+Ii(z0Sk` z@Ut{ww)Mlc9{wG|AN|Ll9Q>d0@SiCBv#lSV^zh&6;Qxw)|Dl82`d=aZZTq1jV%Ini z{Y^rj&HwUyZm#wVdTUOozfOnzmwWg>BmC|8r!D`z9{N{=eq5}!T2~0|ca&RyC1Uv5 z>fe{>UG*Q}sQ(s6{i{9v&lUdJ_OIr6_?HQP?7x3=@V~>ue~l1ch{~e4?SF3e@NaR{ zf2)K4iyr_f9DAQ)3g}jUtMZ=8x#<|tNtaz zALnoU{Xv_5nTP*%!k^3|cG>)o^YE{5@c+QUf2D{2gTg=C`g6I5|1#mfpDX;IifLcxMd)OrceQ`<9=fI0N@lMA zCl3B!_wes83y1Z{jN-b~2yFH6UoZT-fd4KB|G#G)d`#O(`@fy&UF}~X@?-n&r?|^55l=f2BkILml!L zQ3r9^&sO0-Fbn@eqIcb-06nwTJ&+=W52;`p+B>{|*QL5(ocpdHA0!{ImJL z-+JgPgxaB9K3A$ z1w^m(hnXmz7X2-z_q+LG|Igp5H1tNVTpyb^=igAve}kY)6kAT2cGA5~zZYSJoYA`0 d-KK&1lj8}t{`R9}7ybIfb -#include int main(int argc, char const *argv[]) { - utils::Vd vect1, vect2; - //vect1.linspace(1, 3.14159, 3); - vect1.fill(3, 1); - vect1.print(); - //std::cout << vect[1] << std::endl; + utils::Vf vect1(3,1), vect2(3,1), vect3(3,1), addition_test(3,7), subtract_test(3,-2); + //########################################### + //# VECTOR TYPE TEST # + //# Addition Test # + //########################################### + vect1.inplace_add(vect2); + vect3 = vect1.add(vect2).add(vect1) + vect2; + vect3 += vect2; + if (vect3 != addition_test){ + throw std::runtime_error("Addition Test -> Failed");} - - utils::Md matr1, matr2, matr3; - matr1.fill(4,4, 1); - matr1.print(); - vect2 = matr1.vecmult(vect1); - vect2.print(); - /* - matr2 = matr1.inverse("Gauss-Jordan"); - matr3 = matr1.matmult(matr2); - // - matr1.print(); - std::cout << "======" << std::endl; - matr2.print(); - std::cout << "======" << std::endl; - matr3.print(); - std::cout << "======" << std::endl; - matr1.matmult(matr2).print(); + //########################################### + //# VECTOR TYPE TEST # + //# Subtract Test # + //########################################### + vect1.inplace_vec_subtract(vect2); + vect3 = vect1.vec_subtract(vect2).vec_subtract(vect1) - vect2; + vect3.print(); + vect3 = vect3.add(2); + vect3.print(); + if (vect3 != subtract_test){ + throw std::runtime_error("Subtract Test -> Failed");} - std::cout << "---------" << std::endl; - utils::Md matr4(2,3,2); - vect2 = matr4.vecmult(vect1); - matr4.inplace_transpose(); - matr4.transpose(); - //result.print(); - */ return 0;