From 094a413dcd9ca7cbbc2db4b7c44f84294cd80714 Mon Sep 17 00:00:00 2001 From: Atsushi Sakai Date: Thu, 25 Nov 2021 23:05:25 +0900 Subject: [PATCH] Add how to contribute docs (#573) * clean up SLAM docs * clean up SLAM docs * clean up SLAM docs * clean up SLAM docs * add contribution doc * add contribution doc * add contribution doc * add contribution doc * add contribution doc --- README.md | 20 ++--- docs/README.md | 3 + docs/_static/img/doc_ci.png | Bin 0 -> 51875 bytes docs/getting_started_main.rst | 53 +++++++++--- docs/how_to_contribute_main.rst | 129 +++++++++++++++++++++++++++++ docs/index_main.rst | 1 + docs/modules/introduction_main.rst | 3 +- 7 files changed, 187 insertions(+), 22 deletions(-) create mode 100644 docs/_static/img/doc_ci.png create mode 100644 docs/how_to_contribute_main.rst diff --git a/README.md b/README.md index 024c600c..195eb1bd 100644 --- a/README.md +++ b/README.md @@ -96,17 +96,17 @@ See this paper for more details: For running each sample code: -- Python 3.9.x +- [Python 3.9.x](https://www.python.org/) + +- [NumPy](https://numpy.org/) + +- [SciPy](https://scipy.org/) + +- [Matplotlib](https://matplotlib.org/) + +- [pandas](https://pandas.pydata.org/) -- numpy - -- scipy - -- matplotlib - -- pandas - -- [cvxpy](https://www.cvxpy.org/index.html) +- [cvxpy](https://www.cvxpy.org/) For development: diff --git a/docs/README.md b/docs/README.md index 728a8129..5c4145e8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -24,3 +24,6 @@ if you want to building each time a file is changed: sphinx-autobuild . _build/html ``` +#### Check the generated doc + +Open the index.html file under docs/_build/ diff --git a/docs/_static/img/doc_ci.png b/docs/_static/img/doc_ci.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a73f7e927046bc7a759ae9339c3d7be521e04c GIT binary patch literal 51875 zcmeFZcUY54w>U}@M5HJR0#Z~2sgd3Zh=52Hq*s*|TId}Ds33wM(h0pIz1L8b-a908 z={2+vTEZ`W<$U{`yZ1i#{&}D07oNQDWMS>WNl2#wVx(Tkp%YC*nu_UyI- z3jzNRlb{`rM<4FW%H%FSWDWdq>)kUdCoSc>Mbx)CLUrW14T=Nq+U{ZEudyP8RVP<|3r8vIVo1#DtP8|yWqt*Qw{i0@d(`(eZ2*B%1~(sPxX@#%_wrl# zcb?MR!(*3OJ6P3pfA)+!fS(_$WwLAObLAX;dBu57kdaJ@$4~x?J22T4&xrx= z)Ux@t&UL(3pxRWeC)&R{s2IAlf%8)sz5{ke7yROUH>bOjQzmo?kbhPZ%$ybf>Dw4f zu8f@)tJ;_M2^8gpk^l~cWr2+6?V$_@Q5?5p&t_zjpTs=>Sa4RJX{T?V+1b)0BdrOj zF=k!s1np-$d*xi!0GtL%tH%P1t~EZ4DbrH${BX!o{;2x;hoxIvi1NH=N-w_!TWJ{F zi_13&)5<<0rH9PEOkmEbGL+qU40t(O)S*STwD$UF89w^sgSlI(rxGvtZIC##uh6G! z_o*oKWblQ^`U&b~W=E#RNq_}b5Ai9xWhkf!XunvP%O}|=5Tq%k6J3%gwf z2h^V)zFk=UMB!nDtAb?ct#-$^f_&dLK0z1TJXx5?(lRup9D%ct>-s9!Lt$EyEinR9)Q^E-n}AzJl?oRFbSY>2((9FbWQ+HX za@cEbN`$9$sJ&e;*C`?`E2GvEa3__>ZO>}l_L$hC4~@(3Wv4v+bagi}FSKAMd$xGK zcxo5sU8139lrQO-tUp@M?-Y^$wIle7;u($Z4-dw!L&qaW5}7m8EbN(g$7@UoOFvnf zU5*6)^&3n~Ob!_Huuc3$N1!AYEe*fFn3(HJip!?ZM!*bacg#+|0zj7iLwk`K3-v)cNwW2p+uX>zLY3Yk_?w9 zsXsAo+g(S-*}%p;5=lbLqR_o(R3APJQxU%n*JG*qB=9Tn^g-JTqT6At4>w=1eS80c z>KZ@u*^L63$%oLdj4v1u37zkVg(fSCN6mB-X486wHp%hDe5Oyg%x4s5Ldn6cZzhGS zDY^{9tw|g17>DX)Rd4uL-I5A5d0v_|w;|w)N0=bo+0M;J+fTV{cA!Tb_ob)oqn?<~ z$BDP(dSsWWrEll-m``Zff89*}*x1T=|4ZJYudi@3m1!XO2m05SQ_v+R77y74ylqXS z6(sN=p!KoJgB7YZs^06`ALc$h`XI2+jiNH44t>rxlDa`Q^j4fNUNo{UsP3a@z_h{+ ztMo&PuP<2NeG}mLbVvPH)D0zz>@V4vZ0c-YO-hi4vSHt|J~=K;E;;2)?eE$-)#}@I zI`Na##SbcY;c@q6BG}2gU3v<;8@qW{`c{|@spKQys*`52YB_T#KbeRj?xpKB?&Y$# zx975l?Dinu?sgz15G2(@AmFgS@uYY0-6*TSctg)WD`de(o`LA9o*`Zu zFz(*jmA3ynnBF*A?~3nt3l=>80+|V%daymcRpw^75wr1n^ZsOg(O91HWcAqU#-S_i z*5n4$1gtQ#s5RI45R?7hS55Yym#+sQrnw-I#WJ( zzQL#7H$M@d5F5QWdVk|Rl3e`eIXQ|Pc2kQyjNJBSB%QkeUoK;GU%yq!Tc)@3X3Y%m zgoC9NL@mz}g87W!&ENYXbVKMieJlgx(*}p*!32x@Z<4K=I_r8)Q%N0une)TVBYJeA z1=#%Fk#`bDtVZ%M`&jRk=H?efgEBWI$5L|RRY>~#2QvG!Eg1&X5>bf)19Af{16%`< zP_)5Q?jW9anphfkZmbzy#dMLcj?lJX;lk)RKSJ|O{m+V@&fUH9oE_iCw*n@lY(H10 zxz)JkxHY=9eEB%Q3Oy4>3AZ4=*<cNcVSRtRkEEOWch|C$wxcsdA4HaFU>gYv$n ztx=9rhV>EZ=Gqq77T88_9~}rU3v`y!LEJADMZmSbwZ;w}v#2@thWLisx|Ul|Fj|z=D>kc`4KxM!fO~gmVkMSWM&o>ma zpWA(|V+P$#q}FGKGp{lV0lxDjQ87}(*v{Fe!u!@Ioi5nV)r_7VxZV_EN?u4w9Pj6rSeO3yHLk_PlwBfQyYE$@9swy)Oo)Q}~_= zz1=!5kQ!^si&bspoAdWRI6e|kv0NDv71pw11FtQqJhL=dYwkxkd7AKmS;C;zVufi# zOW;Ky^@kgr*I++bmJF7nchYyN;p#3y&XcRhpPxO~&Xnd;Y*M;>C?f7*xCd=IZIbf( zc?LQoxlwh4pDg0#@nf%VW0n0@cZarO#FhK9=PC&;OVj26VNttrj}A8v*PaocYC@Ej z(oYQz(x24j=UO|eZ6*Kg@b38bOW7r5jW_Kgo3&!4(d$$a+jMdkcNE_bDGPv^bv-kG zGx_60eljeMcT4|%wI}j+@3*GMEinzTB|Mmm!m3h(xFjCqrsI*RSEf_(BYox;A}yqs zmNWdmiJtmh&O@sV@epp>7}I>m!u;=^EkP~6e$?(Q=s+Zz_85wx`^sq6b;at;*V| za;Y;TL2fq$Lm_f$eX+duDE!gtmlw;komjS4S{^RmF6$$qiZg};h7p%5=VPfleUnM= zg1dAW^X{8^`<_1U2@Mnm87}lBM@J&8Y8J$VR>!NyqSZZ;L&aS7*1OZxQ!LV?oOm~k zw$B2N6alBk)(smj-W#fC=?9DRwf^9tW@R6=x%HsW z=*1Rg1hav3r*D&l(Njt8)gI69y7)IalTyfA`=s!ONAb;CeHbjhpY!J5e(nd+ey|UG zgYtXzSQ<~TRrZX22t>HZ@>(KaFuzy#bVVb;+dJaB!U{Z<$%dD+iS!n6NQh}7zKjk2 z;(I$!PwT$@{Sf1)@EN?S0i6Ze*k>O+f_F_`j(2dI+-#;oVU8>5TkZ$)6HXjL!msf0 zl%fQz%_wGZ7mzp$Jta$3RXk2y`8wV;{M&ehxDr0@4-cOn@7h1gcz7@I8UCxRiT~tZ zeF*UILO^&#|LS9ad;k7?#eH$m|9TUC3&tbC{ko0&en=Y|U4s6f+ z#vJ_Cg4fgD@i!hkNl$TH(cZ%K4U4C}or8SJyi`B zIk2+@i!kp~-lq?xZ?LeiNIIKaifcYs_!l_tm()XRS64@I0Kmh;gV#fV7wl{W;1d%Q z13cvi@bmNFdhob-Ik>*@)CVEK*r&0DaWtJK4XzX$rS z&p+pB;R*WBNDeOlA`3?#;CBmvkM}9y&%j(kmVW{EyXBu?|Dfxi!%6-|CawYUw6N2A z4zkCw8aFj*K2d%_$$yOV|7iNpO#cb0?PB392e!vSx=Q~?SpNe4W8?n>{KuI3{~42? z|LGrx{6othAb-;!u4&-{wsZTp z*H*;?n=h^oG(0IZLt!??f~Wazk52VSWrSt%@QJ8o{`3*}={5@<-K+Tby&nwC7Uuml z&9SNpqDoAV!%au#l39!`V->Ffdojbczr=uR$loO(VzIrrn~lADySr~FIz0TQ6_nQ0 zTNUen^*&QIebRO0-Bx)ug+Y~?fyj-&rtdn7#>}3RZV=VT&tx~dW*4QPw0|9(nj1m$i^tfC}DoSf$8c}q~f14@gKYid_jZbWRGr0!$)lyLP(?g?zil0RwXqxcY^l_*6;Q-LPjJ*fbRJI zewCiy-WyX7rU8G)3CCfg>oQD&-W2ya2-zdOv9`0nurn%Z?`(hh+BIgQ<$KIS z`;F?d7lIoJY4HHDda-X%s9~&e1<&8%r5eG>>e2b3Mt#zq;Z~Nmwxm1jdVi^LIEm0+ z`##xbY z5%e45DH&D3G3^`re*^xxuHzGN^2p#-jJn!=`t$YmpLt_(lwjl&6#iP=|CISl+`vVG zj0_L|V#WR&V?YZY{tL*h+*^M&vw!jS|FZBeCG-D*h2^pHhaxp^j%axN-&yr<{=INc zZ`d8Am~*D%(S60&PYC_X@&DBjdy9pT|9SNQRQO{ZTj7JhmHW6-VDrk!M`z<#H{?Uz z{mQz~vIt0voBUe-m9lL8 zlwUwVtD>Uf`-S5U<=-i|=mt({DbF9L6Obsg@CvJK<&Ap~yf+A$EH>=@+D4cIPMaTX z_LBg`r1Fl8bQIsAy?eI@*JiQW8(ZPraRYwXM+1kJ>)yV7o0UgO6;Wf)#Yl-{EjFnA z*53Xc9dm<>%%W>BrNU;yCQ$<1tdb%uH(5NxQovC#=zVdr7u|Fz>EWmFrvm=hp%IAS z#T{QYrm|b69Qfq7b8~aWRf}vE4;l(fziFw_ZB+uu#d!^DR7|`NlqxRsF7HE z^zU`|XIn@0%XCp#p^kQ9??VkCd~#{w7xs%p%tK6G!7BIB?gfj>9+k}kiC_K9Wv;M? zyrvou_TxOU`SFR^7qm46Zt{y^kn?4;c}) z@k-Is`|wEN-S1tK;?^VLpt&c1M%KUUWbA2K@bqU&Sx}{415VEJ^+S^U@&_`!`^F2j zvTfseE6lJ2$Q{l|+p%I@Q@3g(*O8An!)v<|Sp0tA!+681|92u}u8`5x{MO#p5q5Is ziB3Zv!}rRsFzUSbT{7;_(46;|4u*21sYfkeprT@`8XyMLwc={48KVR?vZ`Bd-8 zx&Y$3DkBe+w)8*=b{%*X2f5l_5YkLTZBO+%bun>OuJ=cIqqfAl#@FBCQ!K zD=KWVc>^i<9fw)YmWyjciJMO>&AUHl0lsEtW@;ANq%eE#rYA=^8^f zL#|nj)Oq*M3X3C45Aozj^iP_v0wHzCFm-9HUi0N!1yRbL=36q0BAj36^P^mMbuKM3 zyj(1mE!VK(92qTerUATTwq}k(M@jJMjL&fS}}ROvawUa#v(w`C^vTMveW<%E|+| zmBP}NxM{*fdxN~+SD4@1hk@=@uEB225>te*e)>6{dKmF)@J&WeE$NG*@i#(TrM9&W zdzas(@yJkhd-#Q3&jk*|p=%!Y`ZYW2@0kLc_J4(?EM`qAF$~)f+JP6ZrZm5lf*#Z3Lslxl!NRK+=>R9)DYt2Mig;v$iCH z-#uEpRlgqTzSr{XXy5nODVmjCqVf1;su;{09rY+;XQ%&cDFkUz?)8f5w3rNc8CHmp zDoOiUW;xL-emB5wtS04{+3}m8!)QB3Kh|EF-5+BSM!HuV<>g`}VcLJtLeh{p$#Bl( z7cStl0$=YPQKifGyLs$BkMRX+dd&fU8&+&hKgEiUiv^v^%;7??_=eLNOjX97)Hl)2b^ymrQa zl>)5K^J?!A5no0z)IPx5{5}r5Mex-PndGd1Pjveib#lENF{NvKiE*QjLmigbqk&CP zCsCyaIO|&}d9V___omtb(0rU^ZA__y=e*qc#li6fSB*`_javWtsAUzcikc0P{dj<( zB|DeUO;lYh!i#6lx}G$M0=Rmo_QX~v1eo_UB&@nZlhDT6q5k0uJH#*m=>pKA%1rpkD(Y8B!Y*=Fq@Mxye z)x|WKg#Y36p;96!Kj<0FH%@ad90%>YeXE4zU5ai#fR~wR)^F=tew5B){|j+`>~NV#0N!lcdmckMc#Z|0HsK6yP~GVgkDIbp~kNK?h?9UdMgBiuwU9YIcded$6{ z%SDxQW~f>CLeHLYV^E2qA&u)MVxVV3a`Z^dyKI{&)J=Sv?S6~pHNl_AEnDzDsr1$m zDR~@E0&ohXHc?Zf(c=Hv$Zw8(v_ji9?IkbvfMjGSRH#t5=flBcRiBHZ*L`eN1#?^_ z&6Dfs{x1xZQ0`%|%=JQr8tb)<>Zyel;REn`yhv5aYH^qI9}ThVX)K;BJu(W6h3RaFyuR9T5De%4QCUroQ5ZHm7lKud9FSV8%2Wpa%wR zLU5O@>Sb|xa~>a~`Bw%fww#4|4snl>&)wbQgj>Gn_+7XU?iZK8lds%+#)HV7gfL@E zZ_*3u9UGovspqSB)g<^y=jsSJ9>{QZ=Tv{-OSU!2!4$pqfH}N+#Xm`b~Q0im~HHDJXj0tB;fw z0b;ZP!m|KP&*_C6b}r{#&l9cAeBC#YZv}GIQ4X5hT|;zk%`PS04-w*>%0oay&ZA2G zBN}Jy23ZQ*Xb)kjveEww_I{}W||e^RDEj38=^!X`5=W8k2-mx^n|uv%i*jg+v^P_jGe^Hs3rtC zi0J^oJAdO>O%+3;Or~^e{n4O=Tr;c4oNM&u835wMjCT#80gbksDoJTNKJ2S7@3~Fq zHL0JOXtEkR*XYp~63y15|48xkq-t2Pt=CL&L(_YZL1BE)rJZGx;0(+svOi5^YLoEE z@cUeaHRwt4OqG*+N?IBK=zHZ?@UzNpqIb7ZlXmdL+{s(Fq-0qbG&*iBcE{?)>UyF$ z=7)M^`mdarsl=3wEh-pP!IU9~eG_{YPG=X2G?ce|dtT=`Su;+$i7>hT22 z+9o41?pM_6F*vh8w2;@JuDhNI7eUAoo@kbVVMuu|&aB|z2-=d{?~=p%tY>yX2j~ALQ=+{h`w>r$0WsG}U6p!WD>WV<$jpeH5nwFZrv^Sj( z7q*}Id?JsibE00S?@y8H>Y3#MH*V?8m%T|kmS|49Z<$mzc5~5dO)5vVPbWJ&iS0=3 zzNiL;033qw$UdR1cU%hk3KgK3!Wc)n-^cfi@+^T9tCg> z1b049G+Ts6(q8qLdwv>>oL)GFn4JD)4G7_e6N(VxgWFrpZ}+{e1>oKI{t^Zfol6N{L{aMi&&^ zccys}cbuNcFOY4nolgm1P+M-}X1;E5=WCUc13N8cWv%rs&x+$~DMAu#X&9+_3?Uey z72CBrlkMR`4^xlHc!Av58`4|Pq|mf!kj@_eaZ4psrJO*%h&?w(pnFcA?$Ig?f@&UJ zwqA4z+k|K?C~NcFt)~Z=xZ0V5U_=MwoAk z`AAhLKHUcT*&Oh{IfW@wTT94+-SO%Xarjd$d%{!RD`g9Po!6Lq{G<8kirOFNyy$%p z0&S7aGDl8oe}mRbOn;9}VosZtp%(;do*?zW6~ZFAHq03gF|%cfN~?qGw5UivE${OSW3#F|Z zH@HS!BctsNB_#e3V^PpHETGz|xt-fFIboF-n;<$a8IGBPFbh)-jr!Iwx$V^tzQ4p- zx4jEUSeF&tLf43cJu&?g&w8?(WkJXp`!NzsD+Q{!cq*WKk#UY_gL^Z>});@zIte7 z@ZRU@91Y3NBAxZ><9MXz#wLX4(Z}rIo@7|v=X1Qn0fDWXNN@~EW2$_QGr$r^LK1T4 zb6;EazQ;DlK2xbOlYJ0AUnIoT?k>4vT za%1w{Fm|urpY|v|M%F{Y^>YPdaRX3` zH4)R^>tm1{Vzw$femWGm8T(m)X`@Bq3w>Ygl+k)+ek@3Ol*zXE?BUNwa3o59J`XwK z{39SbxrhxJg!3aNHMD@6S8kt1lI)W0t-Q&rbE}-O8ADKawX73wa2l{1LsrDr#qn<; zF{P&I35RfV{RZ=Lsn_*#Teu{VtMsFOdw5U|37U*2tKZ1o;o^u{dh>@aW_nyT~xec}gj!h!`NM!APUXE~c}{WRJFwgYnm!kg|SPAm9fdwB@vMoW!_Gl?A4uTDIl# z?Ns6+Ja29KU2+dKaq<&nI1d(H2xP`OZZi)0Vk#!8IMU#%*$vW5a9xy{r14*Z8ylG=4OcF2B6^DK~5W21lcDUE=ic+kI5A zo_~=oAGvg!8oD?L;5W4%n67x%>~}yv60Qga!M9zg^2AQaqf752inO zJNG}1R9ZgqOKIlV{e10Atip0q;&3_S>dsNX%%J7HHiC{@k=ILDw8OaZuNIes!L$@ zef@mD4mqOO=K^SYl7z1jHCkx}@Id|cG7vra>1E_IOv3ElP3{l(a=%xyZ2NWTATO2T zp6~cOTZR4&GJqiEurhy*U5e{zch(ixUEgEgss5CB6Tg9;Ow=I2_HxMMO534+*PTw> zE}?0Ev@erRDV8HC)(cAd9c~us!R!s5wN1Kv0&(0k&dcq(dJ`0nZBs0MKR-sOO5J0X zEW~f8J!)Ho?+xDXU{Yc3wKc15I#j1_+VzhC%d|Cqu{@GGpI&Cu`d;o)BfwO0(KsGx zW38aj$&@H`#ISCC-f9HZ8Xq0@1!czf@K0t2=0yU17wFJf4{SnM@?xXN{+oCasTC^f ze%NeJc-7I)u!)4rcsIhsgnMV;AccTqQK**`Nbp?pz3?cRaI0($5M1jVhq{ zw%OF!P{i1vs50(e?qC%walF@9-*cVWZ{)Fbo8nv`lj64c*5wF3IuG6YH991ge{@%{ zwV*F@XST!2(Aa(Ru5Mx)q$>uYwmsfUL?-k!36UN+-M}6SPbp(va$` zUz>GJk&zb&Xk?toim9FVu!s-)q>J1y?EtG~W{%L}uE2z{CV_P|t1I!1Rs zH*o+}-O*xl(#(Uz6tcw|d$|=XX6@+`CVQ(JyUcxIyQrwUi|5l+5gc1jS=D?#UuNNO zy{#QE5bt;#cJti8qPgyt4F@MDMegl@o7&;1KX}XXz3|Bo2TlYn5EZ(c&GZaRliCq2 zYaN<6^|048aM|>jaLL@BzJ1sDq%vwFL9g+Uz}e>~2Sd5WpavU}q_KY73wVVk6j|B`sKbo=;X7Wz$=WdV;#lODYY=pmzoyQ@@b z^O`{(ycKK}Cn+;wS6h?oWnx%04^<`B*3rqWvY#2WN9b-t`gUu>EIorYz0n*L!_#g; zl_*ejx#38rY9JzW{jQZHEb#7tpx^O9*Xp4%FU2%b?pzI9u&%M+7wfT-`AqZ)?v9x( z-F6&kKb9Ly*6xj_vu?5~HR1Q}|0o@HY+$oiO#fZWs|(v_dc}sgEaGXv0CG1cZn`kn zir}l*@2Q8)lc`H$!j0U{EGmY~o#9?fzNQi+V%M+yj!^N=F+C^6x~0t^Y<=;Ocn{Gx z`!chw^|Vk3bq9R{2$a+^kqI{=TOW#!<%(C1&J7WjRT?nR>{AA`yiE03Q_2HPZb=G} z4_l9@v|9kLSZ8W&U6L$B!s`7lguTu>ehtC06MQ4&hg&wLW}WD9g4oKyteofT}D*@^y(fj-WqUQrOhQVY#;uu#g^B zSFUaSgt7tgFberoDIf{wL}KmiX}&(8Y*$*5x>3@dILCaiRU(lzZ4cH2%~bh8?> z%OO@lG2z_0HHAF868Cu#M)@=YEEC*D1Jkw+=fh*%Mlcdo0!DSMz_K1xkY89Cb*BD4 z9buXQix`(-&+rP6DanNWd(M0cE#^#lmDk5<`# zRXc`#g;J)BOlr6jd4WxkmX)1_$Ep&H0I9+ALRMkXcJrW`SQo}xQyU4ioGJJV`yC2dPs^!}iNZ!N} z5{u$B_MyPQT@kHiIKbO^1&AeVgEn2)wOOOF&zcf1kf1&13y zuiVx^c+a8tPbf9c?KD1yk^y*0SvMT~`3BbJ9e0HsTn1@Pe9MiVdaDdSvex-p%kc(A z>rj7YNiE7Xs5#=JxDa2{WA0aK>kd<2Una1pc`ZOw9WIU}Kvya; zV<9cpfkRQ%rHTv*BP=sqZ249T07OhVaak2ef!yYCk~CUv1CptNX*!3{rHFV$sHC0O ztIzc&4R7x*h-93&Yyj2KPM!Kz5{;wwRYM~7^V)ruW2WDQUAzx+bVUbDg!%O=LOga> z1hu~R33-}_on+(<#M_Lp)LVwiLw)*7vf$Bb3t!o;Z}9|fWur3(u8%JU3n$uy5qDM% zwFbTq5giDzWdWnU$GSUp%aO;}RHoEy)MKlvPK{8o48IS9m*-ryaOHv5<7_Hn{Vizr za2IGg7Byv>ytoysYr5{sA&U%LS@CAmFrKXfdqlso?t_-La0+kKIxQ2kC%9q*?c~Yn z;co|A#b4_h>q6BhWRl}bn-d-^3~-*k{VZ;SckDSv^qsg*T@v(_VSgM&LN2CHqLwI% zHBQUTK{eQ6yI;(`gk_JX{=qakSv+KZcRuqjiop0mUv zGC{{8r0mSN<2GTSMcS7j6+L#0es;^dkBvk=S2k3}7rx_}sx&@?m**By@XF>`2324f zeaxg;H8vaoSTuoOuuKRN+J^b}JV?$dOCN^A{MR)8U=GNz1YPS#?!X%%P8D?3aik~) zrNL%KwU0ijK56akkHwdj*?|xHa)ImN+YrQ#P3|V(@KZF{mH)a#WS#sPl;xe%SV42~ z;i}~>-$23n;Fw=_Lau2w-PCNq)ZxS!t+Kz`!2+DFr6i_$0mhXFe7ex{K?Q7B-=dAW zS0lKsb172JwA`rcP*rKs_X|{EwX7+&gosb+?+(tTd`a+?SG_&rxuV@bzFzzF@z}+z zASS2wTNSvPb?XV1@-dPh({ne01XZ(9KJRZ^v@_7{Xd=EKeOb9p z#K1IDnl_XPZszr(VjNudrWD`App~yNyLr_`AO{4;LtJX-oWp9x*;vZj$wjw#PnS-bji?nMbr~7M`UGsFqhelzJFs#ojYmJ7b}$`z z<1*wn(K=O}JEZ2P=kQxMO)Rx~*OQl_q{Wyx1kO&BLl#RopkTETM@5a} zP=73_K0Szq1EW#JFJYb~D^KKV6C3l`KNK-a#Yr7k5=VHn~X0av& zBod2MU0Mef2%m09P1boVII|m8^KNFTZCiv{DxJpzR5T6~^O!tL=zVWiPwzZ221>!A zpar(IQvuVJ>QYNPwft?0e#{^$M2mH+RbWq5RmaTh&3s*y2YD-*u8&8UB^4Ei}AAE{#|Q$p}eE%p{Jt7W2?wRv`(i z$;V4~*VFtp3l``ED~IMy&r`>mZ83em)J9W98axPA*Rsq3KW}?i7^6f@qwL%rbt;i* zY1d|dujlVm434ed)P+roO<(8|&eVhp;oDptjrq7;HiG-UbpXXpiOUkdxkF`s_Rf=_ zBvqRn&=;99>C3MzOqK%K^k7KT_nk=lKjxXS_!9WkaC>-^BnH$7+QB>MCS^0)CLBy{JQu-t z$nz(`{G+hCDLHete0`bF8Z;{vT9OEYgmdGFKB zv6l;EN!kT)^OKAkdrplh$}UW?DyvOp(1gCFO4{wGW}5SSf(iL<ZXtuCq!I4R%XN|yF&OViWoc$c%+fZ#gX9l)Fm&z8J1x5L?)z zfpS7-`E52=nQ47VZ;BF=l$3e~FY;XC9rkSK7b`3}KCh}x=BuUoue}&)rlP$%g>Cr4 ztO#Oz>$d#t49Px4s$chJ+>M7c1xh2OsCJm9ylu2{5ZQL}pV64CDPBEz-5c1u@9qfo zviT#d{1oZyDv&FfN@!So-fQ00bVRxUc0uaaRD>=icebq@3T&QD@0vCnG&IeK`94cB zpPL5*LY|2^$WL)_a$^sJcF8I-XDX%t=#v>wmU(MKjW#;s8FI|m=+Y6f=5R1A>PQePl2_uk0 z1&h#Ev6aD|3OBe4ylnr`8EPGna#eG?YYtGb)6c;{5At5wB_PD;P*~gqU*2L2$8vGUGVIQ~&Y!+M7N^2(PVO z(rTrAC1YWw>mgBw@R`(gighR0df9^)%&EAGUG156u_Al4yrIcR>vDW$_#j&#GI*2(ru=miSuTTmPo@;L?BBvNx z@35OB6CynDk@tqEsg>|?AFDyNjYX?lbpb4ngukW;R&p=mqVXe0yrF^6wdU+c0K0Cd z3OQ4$pe)PG>}nC%ir8qz@-t}RlZC|>@Z5Q!i-S#mU;*YL3`$H|H+Ez2*fK`fam-m4 zO`KN6Eaw-iE%<1JMyd;!Ix!3q)>;SQT}&@W;C9uO5t$^*U)OH@g8LCMG-KAb)fPOr z3S=uw<|3U<8k&hk)(28{%|Be5X)Zc5RMkpt`;1;!A!CPDuY{2x))zl%4LO!n4y2RS zFiV(1H*lBEVg{=5*41>mU~xZ(EvbC`8L>($v4KW}J?F9wQfn>*tLBKHvx3iEyN|O{ z-ZvtOibV38;6!xq@7f19X5zm<(mtrMDZf8FK>2i_R@a}SB{91FD-g<~WWaZp!o|yOT+n4;n9Vbo+oF$M%`X)>|9~I}wIOP*w(fQNO_lm?hkg37O z#cS(bJV+;l22A{(cPgYGd%?AxZ1Yw>ob(A1R}GzvaY-{t<;u#rFx{qo#DrmK-Ki+j zygK|sWSgFrmf5kTZ7Z9L_Rje^&gf+ue!s6L0MsDu!oVhpG~c}qGQE;PJpr4zp|np7 z2iiw2e$ZefN7D7uGXv?_1xAqT!Nk+QGiVfkBVF-oxyS+|=^(TOSINW|OV$b~!u zzXJHJ(g_UQ8ylLHS5*T+R{K6)6m zk&nxndN;os2}Gvc*c&}o(meE^wC8eWHaCy)4dfQ8mX)V8&OixN@;@FRibV;04Ekec zYZO;{oBYhsJ6!nu4$~=twQCWwvMd>sV^}^?Im)eM&pUClpcf^u>(?eX`W;Ot4ZX8s zAtBouG|Npr%)M#QZk6*=#oFxPC`2uaW-df21RMYIXPj}0O!gjU50P49c%8QR%{rA_ z%=%4I_mWsqZs-T4bni6D;DT>EHCqG>mJYG*a!C>rHeS9?7sG8qUx}CreL`*rln>~g zA!V7dak~9krH4ACpn73Sc&;jg)m%)>_}3aziyU5K)X(OXjM<{Zg>yTalI8RJ+2Ns% zj92ldH7{(V@iXP2aSSe4uR+fzS3JfQ(|Jm21F4ri$B*chasqoANM8#Ibo;=jh(RT# zZ+^DU%!Hf=o){;3h0*ZFkSRnuiR{kig!Nw^&bIfWd$&iy`7~2C3qdm0pwBf{Ws&au zIx;oTQsU@jN0>6&FrIr7YaLJ2{p;A0)yC{coa5{Qf+VHcMr$OzOz=qlI(dZcKHD@Q zhD|jLGFb2?eMb@OIOl^!kSw=xGfbAcKpn8BKPk-xQV9Mrs(}2b(lmy9dkh2AT(W*nf)<6#g?|=sJdX(>mAr5ukal! zFGmNtw9TT+iLD59O{3-8!=d=yi-@zx`;$lGTcXL8lym4#`7}|$QGn*CfqOIsyU|0Q z2>Ly9N49Y=D{Rn5#uDc1SIrpB_)#(aGXI5VM4ySRo>`AXp~cVI$CSK+*Wt?*Kb0qf z7TP6^VgPlvkf>T2Re~Tp`Y-GOgs{ z`BPP-=L031SSgxK#g+eP_M@yq1aOJSBb4}^|IiDhAmH)prcQoSZ$q=8aI&lBFw+VVM#hKydczF*hmB2IjzGim%) z)z{LNWhv%X4n(#Nmy75-Y1rTzDzQ7zJF4>JO8i)mQU=zh?D3N`{FKB&ePdw(bYrwp zd0<%TSNHz0cKys4Fxk=7m zDTT5?BR{Sk?r5oZ59KZ>7~*0C){1_?fmCWo0BFu%3{fFLIhs#yKjuSz;`)S_rVh#f32O zq}H?|6Hse{k&}CaftOgWA#LEJ%F4==;wB*Vr8~9b=*;U{Vz2kHYdoAx0pmM*hPXVk zcZ$m7)h((#=l%!&6tM>7NtTyo`74pD%j)+QiDr5c)t09x5*aOHP5W<1whSiEGkC`= z?W;G2j?MH#&R3HI***as_j}Zi1}%0QInjZ8x)*{qt3hM{_e!^2$*ZMLV?&Nm;|LMl z|E>9>n<0Jgx^+v0;!RkORED;|f@_!1yQgRw$k)x{&n>f?yhV#IT*JY_IS%ugGa4QM z?^)Bh!QZJ?KRS0mx4hUc(Mx%>CU#tc0(Q@q*Y@P0DP7UY^EIbr341pc9%|xp1fHA3 z?Z37e>Feve`RukY_YCG_2KmJ0BUee?k7MT7;-B*A#ODK4%Tfewj7H;i%iNwN0wME~ zX%oMLXkz2hZ!+?>e7$ZrH+b@yid+(Sx3wnLHd`=k!own#=7t8*i&C0zSl&? z&+OHW!D#58Vn<3rhKd*%k%JP9Rc9XOgHcMvbCsT$l1gS4n0x4D)bVlSxuXf|O_aXG~vsl?96vzC^| zF>(HP2tf~VBXq4#fC2xnfekw8UsVD40hNj=>*hB%IqYZkM#FQ}knl=F616lNY@kaD zP6?;1lW?ep*a zI90Q#o?X=JImaCGjAz{UH4aaVI40JXOsN-Zwmb1WN0!DJTgm}e#`k*13;QU~;IXTE z?&YnF;of9J5|+JYn_Za7;SpW|tUfnuUS<_iaNWCa#4&v_R95L+kvBJ-1oCEIrm5ug zt~YpyBLf;(3{3o1M5@Ys?OGh5_V5s9{@n|{&5hLBUTFB*qut|ka;Qo1=`=C&y}``* z{3M=%>H#{VNac#RNNp-7JGb`!=QPO%-+_biA)H~k_DEdY_k2cc%z0z2or4Gsm-v4= zsD!srI1bqsij4XV4*kBeVSzZ8Tg{r;bt+Zp_c`_mPbn<;7hSs8x8|a^u8?zBu*?N$e)TEvdor;?g_-tis0#ysY)TD%Xoop?kca6FaYorR7}jpNnc*gL1i&IaP8 z6&ihvWfsN;#sYqn)`t)V%}mu8O>g`T*wN-p1dmN4rZHO0yJ`Z(p7*;~YDft8#kzz? zrL3_We)W83JIHXBMLdF;0BCN6&V+>vf(!Qtlx1NmS}~pSW!Lu1yB|Qq`XOJ-lHH3( zIcC1m(7sg1_e8aPXT^u}a8@~{52vL^e|9)&;Xz&F9#1*vXfwFR2kgXs zTX?C+u7gL5NxZ}VVbEieQQv`b=X==Ru)QDw>&B zAR$ZX^G4!&ooOpIA@1z&LJ`+`%cZXGi=L%y8omac;u#-3UW6=iZ+qfJ#*!+SgJ6;2 zxme+eO*Ivt&Q-MX*sm(5FKJ~Xdbx;~y-)Z8pA_LxU>>+&u| zaS@oU`9KQxlF?m^pz=GJ7`N6{T=UC9x^##4VAwE(<_tJEeFr~+r&Q@WwwU3ht}<#%4Db9NGT+K-&~EQuWVjz-boAaf+}zi&l~xX!wkt^ z?;$gh<1i6Dg+Ys(b6I}Jp?clN&+eNqDAO31rB4C;lxfGoUkcovHw z!QmX`<&4M+%rEL})&!$V z{e8W}gTv!>fz5F~pZ=#45(1wksv^&+v7$#6)zPeAj;m|VG-LYzNU47Q`WpAECT ze@mQSmnX)l-oK|y)8O0>jN7^VMr>3|-j+&JYXQLfI(r~!-x-*|%C6tvahxPH#6B)` zdM#Cm*$dBER+O3pXnkN7dq#r(Ba4W|n|SpS{jR_;gMt01qKn zz0lUg)|@r8w9K5B1ir=&q}SeBldr%+YY^H~hDqnCSMsL<+vU;b;63PD29)*MS~Pk2 zblzFdTc3-GxI$7FXNNP#R8(AdUMz-+&Wd3Jjfa588?onv)+eXN@fN{;u2G1!PleG7_KYOhY1sJRNvnv5pNtpDmtdBEi{B3fpGqMRU>gDkNBcWmmqNx=OVS z^mOyoah)<(CrYzU$3?@8!4^y-v`aT#C7Qz{56!>6Pr?u{bNx*l_$+v5%0!V>jq<0tC0 zA4(tQU^;_sBN~v92$$W}DA~195pNM>cel0gP#-&N&dUnxV(WAFwkZM084ICLrSw|b zOZN?KwKcrTj{7)$n4o417T;5FF3oftt#v2~K3rixgI^YvIg#$Y=KPSBU@Ew)$Ug|~ z@RJd(ZG*?bAUqT>jAe$q<^EhYjX(y!&-RDqG2jes#$i#jCCkk_6&Vb2{O)skv>lfW zYMk-%ZY+08%KW-QzvBQ?SH5?=fIS)xJM#Z)VLF<7p%gGbXlqXp&?be5N4Bo3ieUk&YnHiJowRyD}LWFw@uhPvxb{FQHB>! zGjRQD`6?bmS6SIu%Q1vYZH8;y3eWH6xY2FKLVKluHuGVAaM#}td)D>w+c(i{fwJyX z`=%~aI^WYxGp#A)xon@SSbf*#yByn^^vB^m%;$O2IG-b~@;!qJf@VUL_Khhyd88Q< zcNLNL)A}>_luw`A^zcTTh;B|=Pa3v=EF6{|9xt^j*>^y2!Pabkj}g}rg(8)3&VH-8 zV5tuFmuwhmUN;4Ydw%vE+ql^;q+**%193p+s~amuKaWYguijusve=D2aQYTSG4nrX z_^|r6xVx(w`#F|WTpW+2UOd*0xA?Y#q1FcGDVqlmgL;qS3dsU@J)61ninW)I5hqd) zM4;b`HgKy_iJ%T>Gd;c*Y)g=!=X*PkG&*7v&FW zNfqLhgzg5$oI>tNJPyvE2cv0NO0s2OqM{^o?e?dGVK(Aeq6PF8p!sXJHOYe!@j+Zmrd^qa#_I? zO0o0{c~&mXIuQ80+**h^wt>s&vJ$=;@3jomtTJvFJxo2w!Fvz$LopA07@x9Rd!2os z8&6l1=O8Pp8J+VH<3g18hOad1QjLz?)#3A3Z4QB_cgrYOmtylD$7R`#jC}VIY1!vG zUVAYESxy# zA5fbu|2*bpsCy-F2F*n*Xs|%~b15W9>SuBBk%eY3qUT@6CtDphgLaQcxYY9wm6w6h z4Q@+XC#dPdBhF5y)s9^1%1C7nG9XzzK>0lRvI3yLRh2>OO9jhx4{0wbRa$e5P~ z#~zQm$m41qLZ81BQYw?tah6*RX1)u+;a|}3vXpo1JXpOcyY4(U&X%g$^nUOK4tMp7 zrIBo4F{BB}wYcq5EH&7nOKyw-W;mKZd5z$^x8zdlr0Pt8yt#{_doLO?zp%BoxSui! zc#-Y`?+@pUhL@p}$&D!rpMR%iQ^ zZ4bp!n_f3sljmQFjo2Sx*^G4$+!VoIb)HkgzF&~a9MT)?GHECv0oj83bFaFGaF4yK zG!Ew!e>T@VoY@z3xe9QP3hGq*G+U~LZYSc$^MGqDlxX#~VXL=s$4iaLjWYEN^P3HJ z)0$IL(<9w05Sq=BD`x6zVXpK(MJ<=&0J!H)n5+w^0B4=;2n*C+?RT|3JL)x9o824R z(6aVD%o_nX2^8qzk!YZe)BCW&G9U_P@bYSri^KQHN-~*CrSw!{$;I3gGH1uxsuxOF zSBLp~c&UOn`OsU@1b&e=4`AF$Ld#hnu;*<6PrEca&h+d(S+OfLv(xaN+xiG$gfoJ5 zM%6HrqgLl3d`9R)L)rtEHfWgFuyjxmbP}@0Q)bC>RK{%nX>)NrlPfemIeRyw3_!*? zAqe5;q?fOq;#dMwNE}X1n5Lg_jJ6}8f4DoXtf}y_-{0}FoCHc?Tm`Fgpf|)?;jik)XNTIe>79t?B>phc z2Bf_SQ?lQK1@vVQGMATCv;_*T z8YzcL@O7)lblpw7s*99$l zqL4(rF!k)mG`m}HUv*7idK~2Nb_*SR%qLUUL#XIDrOL@vS1>HCTLB3()uh|B*+!fGsl^5Kik8bX0?5M=FiaI8O$n0er!}rS}!ESsLRdRP%$Qs@aP_iTIe;*Z3H;Z zG$s1eO#5fz?XUNI_9hIH`UNh4m+mKYt4FFoy?s$r4tqLzN<+(tF2^+smaN^1TyAi4hu&stqnf@>oWi2rR{KFm)5H! zf>c!bU(XkBr|ufX{Q4#8{s7>={i$yP7t5(KH9c*1oxzhUruP?KjIklgjX>kzDZ6Fo! ziX6%0R$8pH+GOwGr8xnt``wvdn8Gj&*Wk=Kk^jwQ_22EI0Uo)^q- zo!$uTO%vI`hK;ROaP4+MvQga3%naHw-^9>vmV3oxn{BGTFN8BUHL1a}w#>`6JP@}$ ze(uNL))fE!Rm`}-l&AGjG}UJ`bW;n9;jBmjdz!5Q6}$l$L#_2;QuucXEcrB?#GEWc z>h~cK3BxHlm~E<9h0=4K6!X)P(0NaMTvF0bZ7PXev=t1p0ee6HjBLY0$W@(A!<`Mr zMxE#3=b-5YLqMl^A%|E;H)Nze9M%*G3yS1i zTpS|>nVHA0rkfO#m~<%QMr>dmN{z)hiHx*-Orb)WZ0Kv^e7X6GsS*=ftCYD30m@OA z)tD9na%k1dIBf8XRCOpc2FOmPk>512Mf-G?QF;0kDxpNOa ztLX8(tLQt=-+a=BBfMRzw@HS9`gnZVEA$$>tlrLYMG$&{lEQtSBnHZM@wVj5%?nM< z%!1o6=>N=z{PT+Us@hv(Z}87Nz_2@5C=ZxMH{{?*I<55q87 z4FZRB3Zb2$N^snl5Qu^@3-}eMaEb?+aIuIe1_>@QS}!V{WV+RR297-YGnK$#LYGJ` zO5Pda{P#f|mo7q%<|)Q*SO8;Q&3V_k2(~3+6u~r4^O;>Un#?a7-|Z(IZ_FrSxlnYB zcX&ml*_pMB%taaqPM8@IK!}JnOAO0t%r!jBvU9ur1BJivYxSe0OKkqS>qVSxpMSdR zF9-*z{u?=yh*Jy=%7p#zWGS%;Y>f>|Xzr80Pyiq!EIhorZ$~{g0?2ZZ&^eX=dKTfn zl+Tf<=+-~0fU3sde0z1mB;p+UE)^1#Lp{fuUiT7=bA60B@u}_R&z#F?RdD3WLwaZD zmIo8ip1Uq1(b);teOlKcI+|&rO+$o?cyj)Th`m~{bZ+-TqG-KD-_Y7z4?gy|6{mQ8Nb>jbwm@fu+AH zHKg~Yl)?BV+pufPr*&=qESsI}R9mqXi}SLkk{N#NtLeL5vD%}~IswUmR5v!F(Q9+H zqCMrn?_L$WF5jZftuo9V(yZ)uI0sE#3R7N<*QLN=doadH(ooFyh^x)!O85YYvhbOq zYT>48_U*utvE+iC`VV}%N!$HtG6EqnGs?`4KMwOIEEEShz<@Ho;yUN{6ue zA4#!glmbTWe1W;zDrC|f7D#0rb^k7$}`hzA3Pc!VpsUFGr&yaRqRV@KO7xL z96VW5#xmEIoB4#v*?QKf%wgOzdv(_|%hAZYCax7<6P|AeL|y3H9*F(U<0SqC=%N_T z9Rl0b1XbM60WS7Zp3Er+Rs4iY6M@2J-azz4jhg|pb;LgvG}*+2=_Ta*c)Z^rg}`C2 zj9mP2aq5o_pq#Q-3eNCT(mWX&qa$I>oIyP*VCiWoCCp5&cgo=TVaCr?wKb{D0A zID45%MY4;p*pWw>nY8Ha&Sp`l;!K~g!Wh8tCb6*4i7l@3wX4`4)3$#rBp76NVilFI ze`gT3a!`ob{b_o}I>UC9KE{ebr|@oqLMH>8lKv7~zP1#BNDTCqPeHAW-Fd?-Yd_=S z4Cu3;7{e$KpQpgWW+++Mn|jWlY6BO`&Yq_*4ZM0oPT>dTx7x$RSGKyR!f4}n1vM0aS8_dip7gaN5V;SO7(0@4qp3VFJb#X zD(IUlzWui{`17=sVqyfLM=^3JCVs=Yz)HRjIK-TwLo@BzfEogQYX%psV#=@CJKtK) zrPVryfX^-c?NK>~QVQoJIg1rM#mObB+p{GX`k2YaE~K*~RWLw8KC@jPk>FS%8>aQ; z5;h;J7_|P|aQycQqO66$0rXJU&&o(sC4*PPE|`!9wDZZ)oc@SAy$q+CMxgol8+*ah zO<=r@H_hDPfjZUP;jmv;X_~{PHrIE`*LwxI1!w8snF4^e3}LR{Vmo9~2nF}yoZGVHr^{@v zdxxfork~BB@&qw)#`mG}ahm5m7mkt@BV*s=Urob;H8vRFQnJtWC+5zy+PeUZnEO9+JVV=s)2UPeX#y+r>;%X>qu%v`D*Lc2TUiLsflAezB2 zG!onBjyIH%fdF>+W}Fa6Usb>&*>@V9gmJgXVV^{l9rqz`I^`- z-Q6lEwms^`Fza2^$a9%~%UC3nN$cAgK$w<4;gA2AItbyl#EW>bC6c$>`A;P&14rmX z6q{jEv%jIhWdI!E=<4T|KRfSV{xrz`l38{O703dPYQ2^mYiG>S;HWHA-w(K|JYrGaSI^7R$%Muulro$z(dSu1AjM?&74&PJHx)d2`z`v7-%8u;FxzOk;;>?jL2xr$4VfHL ziXZv7f>OfOf^DkteXzb68};Sj7f4*NYsL#xZBH=IKMnCMos+1A}CZmp8iu z>4o6gUQdoz!u|Qt4!>aYkZWj@g?sza2=fWv1;;eAsh501TO+NKAIp4#A3t>V7rVj> zHvWpE|48+N6{&TAaQ^~7Pi27g{1(C;553mvqJ|}$#`)EqHhP6Y6`gfQjDxxO;27L7 z9^0y^7>!I|3K2mEpH}vaJN*r%69b zSPuh3$qMRSNB&bwqWj77H89?3yC(smD1`K6FfkQ;UK4%PgaZ14Q>hu!oJ49tGe9!U zyv2i2Q{WB~Cx|Cuv?6F`v&tSQ{D%Lr^wu6sf$$eqm#q4q=CCu2FYUZswXGvLU}4=y z?;2BGbKud3e5cGYu%{dTkf2f6Jm*vUy1)wt zBGs&<_5P=^2L&&T)6+rh5J$Qwp9*Z8W(c*d90>7A+lo9J*4#h9Nn_kiFLb?0qjBRz z;Q@-|Mq2)aikc6%dS7hyw|z=mDX+6%$3WdicKgiq50z|2CE&XHu8?O;TP7+h&IXjT_O!o%1nX6*f$Y3~^LS-COJA%n5v9zUE|M2EoVlWF1R(rcC_SKk0 z4kUJEhfav@*ys(fCy*@@eUAGO$jTA^Dce(g3757%$H=Nn*w-^4)mm$&;Fn<)lX#)` zcERrc{*i@UgbmGkyDcPmijzl#i4|N0ao-)XNIkzo)WzV2e>q?+Y>M}9_4UtFWj=(( zv>mPV{{Dg0UvN5c#MFF)en4WpiZq*4jd#>)3VoaHzhF&>OfRY;8`d%BQt{Af2`-b; zb~qWS%fK3X;_X5c6Y9TlY*QWh{x^~R5|o&75SKkfW?&Vfn)XTc%lYWHITK+>nwy);YHDh_ zl14%Q<1msyIl-$)MNOltdBPY&jA;JtA{}>P#~p8{SMK_RfAHf_Qdh}$CpX=1TR7VT z`A~|bfgs=vROCgCs;#X$9>T_#&3r#uUs{&p-T0&=y20<~HNH!l;Hu9c+qHHBG_=y| zm1O+s5D%CDtH5knbE-*3ZE$2P(V&%$ij!L7EjG3pY~z8rj@Pgsi51X_C`I92TWbX>TtKx_#hodau&~y1L9Cn{P>tsRpYXw@vaOiWtp@pM_ zsU}8|f$$1~5vG=&A8DH7!AVCUD=`;*K1r#~&PzT;w%1QP8Lf8x_N~nC$l-Ga+Ngx# z{^No5DWK(d@Y}L!bK()^7#AE;bhyfI)TKNx!(uko(DPN)8(g9yVy8FQ)q_To4PNyU zPNWt&I0`qVG?!uvFKBoO{z~JtB2%LQ=;dtW{YD;_uKOX_IYE2%L-IfWChT^wc;RGz zBj&!*rZzwvu=NrOdF_Hz>6to)dS{~Bo?m>nz|5+B(N^Ixp3tu50MgVu(i;9wbR>r&g577Z9}lBU*tG>%#>>DJ&F zb4@AfvqhGjr)aLj$B!TVlFcOFlD+)TM?fb^PcV+Gsdm%WJKO_(KtQ6|Nt)P;tZLX) zBwx$C;z}kmF^ZL^hN8&dIRxn|sWc5wC9vvGUHmR%XqD6I$4)KpXhuJZ;K zzKe|xr%G?Ybyo3_#C)2oK9>p|2ohHXN*yofGGg{jV97?KV-{@Gm>2)~5H?1@3Voer zJ3&$+gw$72xV>6Vu7zi|HRM=-QD9=*#4)D)k}cXV=E)G5YMc4vPT2**#>Pf?6uD5* zNLAUHEfJ@60???#5GJwkJlFCOhcDNykE6}@QRT8-Aah^!EaF@PP5&joPnKFM=0QAEwVw@SXHg=o2f@y;g?eY%@Lho zRB?{kM^#60GBvn3R=OU}U36m#NyFB-3zSX##a^(a?CHb2_aOvilk*uF6w%VjuW+g+0i7@Ib`9M1 z`h8g#6(sfDN?b=y6hcEohvSu=rK*BJHz#~G_v1nMP1Ig*=RCB1s*R1(w@I7TV0W>fL;qLAT$I7MrJ6UvHxYZO~@< z47D>C%4adu`ehLe(UcjixJR|iA-yIvC7xH!RJzG|_MX_pH{n!=@a$%lW$hDh?d3%` zTtCCuCu}F(nEV%P)4_k+}$7*hRrpxYMTqob4U1r+N_wX1DQLY&t~rCp^sn13xl zOy4v$dF(rG$Y>hDptuwz$ghL87B7({LHCgDrZEX-E5=8=08`Wa2Q}cYOZDxCV!9j9 zFC~umRDZPh58MI3Un~JAI&%G7lmtQb%S6L;_~{GEQ9?H_KhCVR4|jO#)?gmjM!4Yn zlm$si4rf8oO>Y)?+`P>6S?A?^Jc5j$l)WH#fTRz?_v7I_Wh?;$#kq36r&%k4(Qxo! zcJq-K7^+g+lcfobU2eCfk%Qj(954oz{)W7zBm|{`-b3PH>ztoz7Y`+Trk(H0X_0m5z92zod!`3e5lcF+t!L#K$ zwfAA@F_aZ;Q*TKpKfY2oa)ofh5FD6bU;d25c&|*`dE%nLd7O{J8!Z91DBZq)feBhr zVnUZ1O`-+nw)MH}rs{qn4B$fy-B$5h)njsA5G*9}8m|kt3d3;4jE>X-AX9(R)mUcG zMQNhF#Z2OffS0nr3mmF3bT2Pmu4DRMj~eEJ-f4_k&=J`7#*Gl&HToLccD^|LvhINI zaL`wA(h?D(zA#wq21msYMaCqcfid!{v%5TgTW*umZ|xEY$-ovQ9awt375BYMsT!>r zZ&#sabMjUbRk2sR&5iZ$&riM@vi?_%rykWkM4M@|WmM|(hN)+q@NKmUMqGB63)b1AkJz=*t=g(Pbk>6tcRHwo47=hS9V%G?ML4_cnSy;)Mwb@8oV}RLLv& z-S#HPVZi;Q`}+od;OFiTHmfNrp7S1TY6TGb3Wl%E3>6ry`=Grtx1rHt%|1fR(z(0E z)i7PK*?rQO*6r7lb2+BUtj%ZU@32ZxU|FxATSl=LlOuM#31hG3feaJ18thiA4cH~~ z*J|AzGz5vRSCrsBt&M}ua)YGaK{cLh+mBeSHpHW+kTFT#U5*6f!@n7_I-3aTPo6$| zH8e8fLPH!2aUK^kQam)G+QQkw8!&ioy9~RcoRB=^w)`N)&FpoK^eej~D{|d15vX-4 zcu)@3K3n16EFz_EJH$x1)h6@r0gy z+zzI*c&eFm9DB&}N=vkx{IzBp`b4Y@1}ZF>0GUKwpbwQDz)NlLz4pqzbN*@aL0^2o z*dN`v@*N7%hgZo&ICo!W;Mr8ftR+jd^eVh0H1j1S`(>bW0zt#j zhTC+u%Vb)y=;5qM*7OfxkbRb|;hBVI>6va}RVRx>%o8-h>|66}eh&GHa!DbvcHW@_Ggi=n2Ybbsi7VTw_(S2>!&qZU&7 zHK?X2+pk5A)x!dM3V3#wVSiufP*_O=qDZa;UDPlbwadRIl8zl0f~s@fV}W@0g-fah zT7A6})A-F8p>~ZxuhQu!E1{W-Bcm zU#6S)ZkV$iV3-ptq~VU{f!xPQ$`(uAjuGP}BxYTyPLsoVB^&!rwTW!7 z$ltmL2`r*rK&X!rh_8{qQBFnn_RM341+6gOMa!Ta)Oa>J=Yvtj3Owg)zv-UVRFcLM z54R_mN3_QZwLds0A65(u9faT&Ycs0;G*RI}Sv%~tsi$~QOI*xFHr3$OO9WOLNRrTx zdUMD95IRms%+|6$1y*f@iu(DrBlm7b@hP4(ZN83n8CeQzJhm83GxHt$wE1ek_;V+$ zBd1E|va8{zVtrv)q)7bNo(vU)OjzW29gi1strcd&Njj^q6r(fCDq3V$eQylzVAG6a zA8l4&c3)Spj>!85^>_Cj4|4jyeL0u3yU7S2F2^;@>zCyKON{RD8g*nl%)qGY(fse< zFn=H{qpl-{rQ0{H3V>JL1m#$159A^F`NRZpw@>LMpT(@qu=l*J0eo8rCmqj8H)|4M znH1^V?hVU6OPSx!fLQpgF2^)-$qZbr21)%y&Oi{zZ$;M|#9L{cB^_2&uZRWk$7oy*B!D88)eq$NN%axBy=QolShZ?KulWXRa$zB%F}s2Y4Wrp-zcaw#c^jT26D} zRIfy*+zC?>k`-l4X~A}*0rI?B*&Rd6_bn3@dbaT%VLf16>PFK@&)M~xF8ndKoO3r+ z#t^7wyQZd8zk?vLS|FFCy9=M=wSqyyK6ZyN4>U9|w-mhLg#$-Tc>k1&&cdCC!#S9* zFeuw~%bKTKEOFOrdyUrZR));LKet?7$DgTw#SK5ySRI8E$y)8ArKi+{r@I*}j{;$Za($(1%0H(9l#&$3@9q;Y?u}|;j zxpzbbo`SG}JRIGS=u(`6-wmecU$W;{&Uul4rq;SG&Dnj6iSd|&kg_PJ5wFPmJs)%b zC5RlGcWXPoGs7o8q8uZ&h3)t7Eg8!=#i-mbFt=*fs>G_s56XL}+r*@qM_~^dj<*oSi=Hfz6x_gY)X@W}I#aa&xOs+Z}!H z;Fx(8pnf$OfZr0DNvrpu9XWs7mBR8wWPsAqjD>|&h3!he zx_lXqt+qywnfYb?`OFcei66fIh*n9?VBu-<4%{*&I!mnA-=B1>FL0ZF9oOzq=4E%n zphf(I8(uaozVW^;0iI7&)_z9>5P`_KrV@+DYh;;lG&-8>k|~t1BlHq2=Bf6}*cUj( z^EWbQ{=m{X)ovJkcGc7EW^~<6T|MD7kk~BvWu1GHNr7g$?lnr(i za#Eh=bNJ8aalz+roG*45SRZpEfFjw!9nVbB0{3Cg$@ zu8t3Dj+um!T2~Go+ElzUeQH*A%DGplnA;y~jupNUulZj7fY}<>hSajIkB8)RtR{X2 z@ZW66UEjHwgSH!%%pNVW2Wd$GTk;L_lfa)TJrz+M^*hjw zb&)L+1WJeF5j;U}v1tYk8|+sW6|;FvT0&HP#};q)OrmAraW0KLnm4B+LJpy8dMEAk z>^*dbqAafCne2L5eit%jL{F`^adM1VCy~{d^FxP~?G!NlkpP##$UO8bWWa_|34*x_ zP-=JcXc2nc>nOk6FpS-QzsR>c^7*8-?2+rFm+zF0m)WD*?7l7z&*cQ)HyXkZu6Hi- z5xUcBUeArt_*s7FG(!KZ{TbDvN%E01O!v9zNwUkG-ga?@RGrF5+xi@^>YEL16P5Jo zSbON~0J7csdGFs@7z{Pa+fxUIzM4H9^J3b^YD;F&EgnzZXWBQj>kMS3$la4-=s5*> zNBj!o9WIA$L4qcS(Zwz(*ws9221;$OdO@$y*}LpZ3pqHx;8#)-q7r&K1N|g60V$qP zLKP1kxXQP!;E_-TSu&I|v{Ej86rZh1Gu)rP4(m-XmOPW&J_Ma->-4{19wmpRf3hjJ zUhe7)*$r+;6o#$Iu|HFuP_he|6<30Cy2s)+uMp99FX7>~FxA@WYuB*AA+H3~cuD5L z+r8*lfO^Tul*eN#Jo1Y69H~ z_uv-Xab+5mOPf~@?%+tdv4(QZ<(^rs*VixHiY9B zihsOn>4&&026E93-91C6OWkkMc-SnCKD1(tyaBu3ZcYJ*vA%~zR!^hDwrjJS=S_VW zgTO^g6>*-rHH1Vl-meHel*iUsfZU~UEeL>8eLcf6S|A3D#jCoVLXL;a%Nn!kwsEsw z7@@A9gPv|EE>HX|UG3&3)Kk@kkp-R}2b3q^#q41o$pl%kO;E zR`$1dm+=O?Y;A#Fh|Pi?3U_ZPB~xa9GP6!R4B1qAhea2XzY>PFHJo&KmCQe!Y(S(NSBXT}1~Hz6p!enWVgIKOsACzxxXFP6N2$N#YGT)qDp zw)2h<=J{kQD!JVnbX_dq!)B$xZDpwG)ymC)F$MTND~q?5?{(`RjbyKR?ZbJQ7|(=#@cuhx0rTdx%U5Y}cK ze#+ZmY+ui< z?rm^5`-C|7^DH(HQ$uP_fB#^o|s8=V_k0K}qLwnqK>6S}A_+XfJPj zLyq|di?o{b*YphL`}sgc3aufOhKJBrX7^hnJFSYYo|_V5S*ZhM(FD6hp> zV94N{Idt}g*F9eqjZ?T68n6t#EwX$oTm*9>`Y+)hnI}w~y-XLOjzE2vL9--}{jJay zu(^>Ii6kb$79dc;O^u0Chze@L^+)<_QL}kDIEZ1%4OJ*bU);4 zuLkAueeB7qLq36XlKakk7RxGE+u~{bi>&2`cRU5BB~G&gfTpnMfk5aFLhd9$WJ}j( ziUP5I+@I-J;bK&nY6YzX%)l#4XdN~h*I_BP;bD_v6eiYBBSFkxV5yP|v@9mb)!1E@p?uDCj= z4)EFX_eRf!4=!n$kw}aHmkM~F-;mH8a^&wQV)TYIj{P8iH;<#GZ^Z@GO~Wc5h@437 z6J4pWqE!*o`t_B_%E~G(F_F62%O}U0G|(1{^mp%_ z_)*%vY66#h<0toTKHyQ(P@Kd%tVmXO(ZW2ElO#hJRwZVR6QH z0qiGg9r15lQEHn>8n}Z(dTe)9i7SplbQkG|Eh>2zsMSn~Uf?|#2Swkl`A`nt5<5ps z;dZTN@u?$}WbWmCoY0jr3CWkHs0>5nCR{_`O@(9|CiVH7AKYt4PWI;`_s~YfB-)Z% zC43)JuR@34)GE6b>>=K7nQ8q;*Lc^6qcBN}%u3zMWsGV(zB?!P^R~Ij8}2I3^M>z? z1Y$)yo4ty3tn5;IZ>X!t_mJV7k^b#$D7qNAu$i<9+m6hq)En$aC`)kn`EqBh`W`v@ zb5W{b_i$sOZd~{rR`&Ywr>9ya)1wq_hUgE@9UFWoB%x*m{3Mm2ik?fyJ|!XDRSmPm z?kD&DcIs0Qd*5sL@Li^cbI<3@#$&oOHl!X-=coA!9Y$;oqWit>8;+h!p9evq967Ck zn1sIT;}siCfuz0&Qof8!hV;ljY^q8qD)UHEQT{@P2urPt0#SCG`wmZH3zGXKfK+=X0{0EM?Q^8tfY<9QrZ^N^z_jZ zZVSv|X!5;3|AbN9HYnQ-@V&pTormgld2+8-q!R-iZq*w2=MCrW1sLAoK)UI%NYbu?QcuX`ZYpU6k9eol{9l`S;bm0i$z`TaI@L|ev6c(a4s zpt$?!;#CDp5?6majS31959s`H3Axs*EZaT1xn3icvhsLRT#RA`oZ`ik4(||d5RMNx z(D<1d;GskKdhkWjy3_Fidh#j`d+vR0R-S_IE9D*)b{|`(5;o)hnB@8+(0%JHY?B6O zhfbvZp5iZ6ehXv);!HZ-ElNMwlt%$@w1Z7H4DzmLWUU#X_9R6eRuNlS<><77%hmJ4 z8I4kdbHUi)yfW~@WLB3ymyHg@5TMWeyqzQRw&3L-0oRbHuAi# zIVcNVDrL%1p|^4qwd|W)d06^Lr<7KlY+E>n*TSTi_d>O`^wBaHEkOg z!#yJ^D9nYJg7*v8k4HjZe@6OxM;aOU-@pf6RaFtxIPBxsuVf3c<=RQBr$buTvS+Ag6I6e*U zFi|L>P)Aa5Rw6!s$i%+jbMePh{gcJ|=``l?{8X$IbG{gAgu26L$8v#ClASD{1EKK+ z`16$a?|y+v=`|5l?Itc?6L5_bjP1kn=FFh8w#1MJ0`kxmMA>Ax&}!C=p)y;N;+@Kl zr?_;7rd3>ONqx@(eXrCqi-=kt53f&RsGGX@zWu~WpVmUBabLXP6_61ZQ4jHHa{FrZ zWsC*?q`s`8SyC*x-P$hnpxr)kc}Nf`D74M{N~rw$jI@ms)?G4sKlETL#f=Nz^{l!X zfy=*aX1XskA+Kavxj$bj4wsovxyK(Rc{spZ$O z<5sTopp8piuCPNMJ~kL{X3a0T$vS%2U*^83Ko9bBX`BvyRoj8LA~y7;y*H6wOWV+| zN%H=hPXTu%-KOJq-7wktz4I!;QpeiwUW>O8$q&SrUqtHjyI6dlRdz3~FBOm?nqGXC|*ctaSP-sEJ^r-NXkussua}Yi! z$dR;D4aYDa>)SaT@?s$QRF8Xnd&AuDC27!bWyj+$rf_cxPKf`jj$1Z*41o8e3V%mK z$4!JmYK5?VP>KV^m-UvgDeeKKJ=H5VloOEq)i!+F#7i-h&%kbaytx`P*dI-bXUad8 zlE?zk$f}Hj^GEM*uFvoFN)3QxI$0`YB?mYZ$TcJz7zVQO{1KKj6TNK0CHHKwz$-fNfUK{7h?B=eSTbevQ zG%irPLs<<}8(~`p+k1>(L;~}il~1&<13^OX=$i-?qv&Jua=)0`nMc``7EmRW!bfKN-hZcli=Xo%3;jvEausAyGx`M4^5#qUU+sNWR9sz`Z4w9? zJUGEEI0Sch3+^s~KybGtXmEE5cXx;24grF@7H&o1kbBa7yZg)E-CzGN_vtpH9?qz$ zacZB<+Iy|N=3H|fFGlPQb79eVhD6Pilw4(ig1Ft>qKJ==BFl7|r*Md>bH90F;W^

&qcg(mmhr{XNTDy|Pmtf?I74xGVA4JLJGe>|fyy zp4^wY54~@!!J;U+VD?d6B-SOoigK@0$MyzA*JZoxmJa65OU&l=Wv8+zRd4Z50AZm! z3t@+|<1mDyo+}Qq1-G?0nP-I3+5bGQp?-#i#DFD93N{$p2g!yyWvWo zx9QfnSNn8QdmzSHY4&4>J*)T_AnU?KVMMl~+hiOkBqjRG=#(rWjF9^2%%>ut8p9n9GoC9%>=l_udI zeO`^*Jw>RUVAwcrayuoiwPMzM9VRFJVX-bHgLn@KR6Fhze9@#C{vpsd#P_5D=%_)D zxQvM<2di}LeX=C^x%d1IQ-5V7`B=EJ9TvLDNhVIl>6xZ)WK(P>(307yVHFl0}@71a55x0Wf?LC2F~HEZ#hNHvaW z;ioM(dV15N3S-_chdaNS`_|tBe{4DSEcTM?XUW^sYKE(efUH#I&b`K}p*RPlq=%bP z^ipPe^$#fZZ?ID6^{pke3~C_L5Hnq0@uIXcSLifM&0@yXIRRO3RPnPFU8x@Uvk`7pM68{b?GgOsnF4e z-=pEAZ1gXo27RxOCmlu_$QV0G+MrECmL=L!rZzQWacoNi1dynUI#Ud`UF=EcG!#*L>vt1U6Lz?;S6aYm>YU1@WLvXx-SeYxdcAe zZ(66=5F4D`7_bs&rPZNzykbUie^)4s2fo@&Xng3HN+&OV7v*7v?B|46DFpU)U&2R5 zzW$}~-rcx|v<2?Y8}V|{A2+Lds=NJUO8H6>kK?x5IWa0qDLyhI(&?mOHe-{%11lZW z2{dm_1o}iHizaTS21`-e^ws3osJBaxeB`FFvMM$Rv$U|#+R!#N$!R~i=5jdP9V6C$ zSNF-(Z{Mw;bwltwPv409cxTuO#3AjE08~`LNWwMmXoxYI>6~>+kXknp{Ce<9_b|O! zKQ%{P%r-W1Xfp0(fLTQNx1?SDi5dvECV6g{uUr2N-(m{U8LwzLHHTFpak5MON(<&2 zO)2olBhxwm&U57B^6#2gpKkP1OK>RzMn$fDm|N#YV{GL*;yN`aYWP`TDyzMzOnQ*a zKZthJeJiI*t8p@O(BST=OoX9&Ip`={8Y-caxvIvizpTTlxb&8O;GVe6kyzIShr}UW z(T)!6a4+k&i|D+fnSs!UZR6w__kD>qd3Kyk)R!~*ED zjneWgWw|6_a^2kZ$;w9$ONy?l0nefeyH`(wXMVq8 z<2<2`Jd$EUJpmLKB6<2TQ;y{0 zc#Wjixwvh__vk3&2qnFY>Lk1ea)vZ%qYo_F9J;0&Y&vfeWZZ)rWS=6-I{H#3a8FW z=yn`aEGj|&%)ZAy{pm&?^WBke@pM^x@65+f?cA$PK89WJK`d2-U>`a{us68}4;8Z@ zv7*=N@aD`y2P@AMGns6Ty7J>&M$K8Ugq*#vgvZC~yMp(h%R0cbJA;t|t$U1)2r=*P zSoH6nc#|Ga2xs)Yd(Tab2GTefsYbIJAD;4nEW+qVPD7uw)P)K0S5pKVS z37&oaCVRsq^ogyPv}(sK>?*^OMT>6NEoYq3$jroNtoPx;VdqF9jnyP3QC>dzL@I$t zp~@2^h8EqE#(uQ$zkKRXe3MQ+|)8{+$X`~@v_T*=Za5mx7zs%dm!NcM_N7!-MLE7 zQx6p3Vph`1%IoTZakVW#mR@zX<06F9e8z+F+O(s|&Do$mKK?QLxPPOqU_alo)kTos z6dm6OF&*>X8wwMxUr0#USP_O8*n4*OtBnqBcr^E0zP-_geX zF{Dc#^H*zKF$WxBx4c&WK;q0Mi!OxRj*TJ25uYRU5HP+mVKZ0t%`?j=fz3PIC*q?*G7rKG&8!kXILuH++uhaUbp8PDHrpw%peCl zIx(asGJQYaDEC~5ineA^#OmX;dF+;;EG!=MEqQbF5Q*DHL32{Edn^-5}mu0 z`Eu^O)150K!Z)DNOC1m&YV+4-qo)vMv7}|Rf6*ZYf~gFnqGSDH>*OkTC?WxI<2Y4) zO|qDTppDfll};DHcWI&TT+uq!o##QXs*!rH_nEr0QZV^(N1L4A%+aw%{U`oODZdNP zh%+xL+I=kZnupUaubW)aqKj2te1vj6nq6`tV_bP6nl*RV2y=5&yg}26PW=U1Qgr$m z=wX_bIrifTMXh?Pt8FC;m-X`ejQzJ}`a;`@| zWh^`qt-RzN=6U%{(KYNddHYIn`i!5ilnMgrmupHdKImsu&Lr`hxGPV_vdhiB{nupS zSrM|L4nB?3XWh^@25#`Ed4mDxTRVkT)06`3($QYvN3^z}(gw7$*mAvf&N=FenA1Y} z>eE(Y0k2_-U%sQca|nJ2tGg{6kYf+CSMOi!ra?HtdLgN$Y%{)hlfhFm0yS=*O3%)XIbD7 zX%VNhB0}?*`jm#-u0J8^q!l4htm&(Hx8+m}B08|vQ1NL}7hn(fKNR&K(G&hu)Tkb& zUDBw=(pWvIc<|1(Nz-M^dWlgp!ZF~krm5O1MZ_%{LOz<;YFts3Ef(BDljPOvcDlOB z=uHLJItSpxC!RjodaVV$s?Y2uu8-#?C=SOOSLqBD?)vY%&u8XlzgI|6HwFk6rkfNB zhii9ur?f{TDAylONxvn`w)O+s1-h0ZA|h@oREZ@Eze3;Idgax0cD;67qs4RG2GMV* z28fL`3*gN|yN-mDKA0?Gd>_jAT^Dd}h#VViQg#pjFX1MDw8?Y}pte?ad}1xeAc1Q^ z=i}KiiMBdq;{MQ9doS6wj@hsm<8&L@OC4hHmMTAH(THeMdS1N<#K_M;Nq4zg7*|Mw z&iJ*A>$_d?fLo3R;6#IYwNKUzFZy+8D^9z_^fH}*CJ;^Xsoaw|BDuy%y zH>}fxr)^Oxb+^Aaz>mA=i646L1rP4DI*ggo10$P1_{2M=KYrl4`kVB+cTn1+#X=2t zJY7TMrxlx6IsKC*O-Fq){zi=EjKH%RM}@TOFBbslUYqFSmsXvYEjBxcBm&c~~?xmw5|MU;C8p~1Vvn2;}N11`#IX~w90Tjtxgejd{}jCy-2 z&H#Lc05=^Wl7*iG!P*$}^d{}T!@{}b9w72oH17RLSmLViXwE1$^K=^d5f%)Y;aas% zNqPmd$y`c%ewSvao!PibOkZ7Zt-bPS+J|(=`_3o$#^Jz<$}k?C{j}p+@Lo@t#b5(x zaW>w?P*m$_bEML&dk$*{K-jn$x=sspKVcwvvgl#q8hRE7+qb(IO|MmM?HbhMMD=2-{5tZ3@iuIWd@tl zva+#KBwl*!90w!RiVutCxD|oFh2E{u9ajV(7K)jlPSN_H$FDHLgA{p-lU6`Hk_`UF zClkpU<+@8?COl{wZ+bV%uARiZsp(3Ko8~UeSiyiJ(3;ql;H1wo)2~Yco!DU~;e~NG zKOfhpC(OKTb|<6xd=$eaF1k`r7ddZfO_&N^~K?AAZ_q0~ey-_-VR7 zw^_tLSc|-A09C<0s9)fI8FJhSlkUOyW={L0?a<)RNfdXEWEj_wx4Q+-zTNwA2lwJQ zukyHaEGWYz@+aL>YqvH@#g=a&$`9PkHZOBt2waQ7>?7s}pHZbh*eeMc-@UO@a0k16{*jW9mZxMN#CVKPR)WgFu;9R z@ED-lU;##jIAvJ+`}ao(UG(LtAvrfsSk|%f{4!6i`Bo6h)jB>L|C;Z$fXK}cT79m~ zWUG5ZF5}+3R^|+d7H@mCe1~%V#{=e%0Hh4S_Ld%Q#HAZ_#^|A>cgAP<2Jg-i9X#uR zgqF%^`WJNlj&v50AVcSvmB-f8cFj+%Td4H>gyQUlBHrx&N8`?RhjT0TxjsyBadGC! zs76XpC%SgpBl11Gsp@;W{B!$BZ;P~EC65sPaPhxnvP*1N--(UoEd4FL` zetw6E^<{Gli{Uw-b}7?W?_zg#qpsQK-nHxTnb@z+bZ(hwxR`mK;PQm7<4!IEF9iVd zvqHNR`yLR?y=xsd=QZPznY-77w(3@Fyw#5~b+}Fb1&NQ;_3GHI1bWnN-Mho&L4ODr zfGhr-b_|DE2k#QSD8D|~XMxx9U3aws#|25Ew3ABZYK`i|VaqdE9`~skM$o_wpn?^1 z>jc&UB~bs|ts^NI9DL7(0HRv)0)5DU2+ct5e`NbR+O%E~fNBdFF`w>6CYYF$;%9!5 z6#6o2MiH5tizQE}p}4(@L?7IMT8K-AD7`CeeM0Yb8lNvvsK{xQ5lYXW7OV9LOJo!7 z(+tTY~e@hm%t?a{5P_KNj2eX`S~%3d!O*HB7GJG^*oh@m#8c z$o%w;=UDy*Ydh?QWQ6fkfAi_85$EwvEMnB)_twtp?l@PXJ0%(Z1H6UmBY2)VuQ-n2 zO$WpyW3_;wt+5z8Rme6CHpw-P+UTv&@>bF4&f7JO z-CC@i4i88G`&Y`;vbUQQkxrbtG!*Vcz;uN$G#%@kj zRyK6m6Qa;?9ac;~KgY#?(_ph;Q_`4NfA}-T4ExN!bBo8kTcyQ}4%~la=m(`mtOQXL zOmS*mO$L*+Ac!>yIq*w*%ew?jx!7UN-5obBAF;U+p1`v>tb*6SdOf=?n=bIa&KPis za&)QlR%bUG$BqcT{0`KZ-(eSTzUsmP6bwFhTa#B)I(1GW(5;hiXh7S4$Mt$b{bv|1r4f3)XVHx(fJWL@k1oFN z`o#nGW6zeR&p{5ueX1Z!)6`M;^3p&W&tYfA@#!qg_S~Vzb1fUvnR1hGe2k>D=u2?E zzIgcQ2XBSL2I8rtw^BEH$$}ot{(dm*W<#~aV&?01CSwFRfDbtBBYu|-IXbk48@OsP2r;!E?<_VT!t8-Gvr{oV(Pbu(l(i@ z3Z$@!=R2m5L{j74Ury!3Ep-VHnqTQsK)GzcB!owow^w+m!>#aXd+J?-?ZOvl~xuw!Zhx@u{{{&FE3%04F$kjQ=dD?0(0G&oB#s^1UR%gM)cC&DA1J z>4sd2;vfDi2Zo_ zZrOxxbCRLwdtXp-^=??Df+`NtK!<>&FNn2=QhNlTP0cg$4Og>jX1=sLtnJc|7c;c5 zZf(j;-}SYbzg{e@)FKAj!-OfL?Gm-$1|7B=NbR(DWcWB5c0vo%$_^(U@4n()-*l3= zU@R=B@Eu;bmW@AZ{aOoS9?Yxk)QDos(CRX7Zl*GE`LfmKSvtKC{MCET3s#*eSxAYv z?U!H_r!wk2$OS6~0+Cyk^gtMM-*^U*Y9T!M{P}iJ>{l$Jq4!3|Qj6atr?|bPkN}%T z4J>4l8uT5a|bumj}HE)*yPGt`Y(OMj;{3ho$BUVzXbe) z$z9*dY$o>(rMo*h-3KGAX9=+Quf)5?M&*fVU~tdw>f8+1&Jlk*YnSeU4nW7n7Arggs*af>lZa+<_$ zj;s4+57v}NI@m6GfivReg3Fry$?yNfnR|wcq*e_$j2=a%=?!bv}cI0VZtEKB?X13SZ(-P zDn&mhkRgqVXaBZrS*Ut;Rk!Gb1BxZz%iHGIj1EKB@^mtxPRHWWhc){lpo_D@;b<7N zozO4I<8+lW$vH!KPvzpz8U#=1{5stW*6mk!#z z=*xb5b{7^r`wqjV-A5ks?PNps^v91Bbn^Cv5DW^lRh*t1f~sPZYmr5r zSY8=RIN0FL8#cO@8#={H?mgoX#i7_7eg7w3ZlI~enpI!*YVrQp|k!Q~x)Hj&_RUb6sutvlm zuEuJ*|8s?vU*wDc+Bjl&s;C|d82}d%op83v@wpyQ;_vU*81$&LBJZ2eWENfHc95(K zAc|maRzafnYKFIbzcvzrQdWCIYKEQs_7HmaAfzgtPUqy$PVDT0LY_kp=jOo1Ko&}s z@q9tILwNe^%~vpI8_PL7cN;~c?aC&UzzQg$0B8^@rHJlxBJ)W3*aGw)_g(0H1%8Q5 z;yy4s&$XjzsrL|Kd|i)WxyEsssPa+8iRdKwZ(X%B6tnSRpAeNlEO zcl^W-$}=dlbyl3XVtqNqL@m$Tdys5m6Q5TKGn`5A$wfx;%jigGG}I#|R(X!CrN|O>I8`ps2n@ePdz)4@ZEdmkzPd>PA zVXLdu@prCEwv8TUB3==xl)5l#UYBE6!)BS@f~z3hBc(UbfKJ=3bgI|$xR|sF-xV5{ zOPtI=+SZ^c*E{-_Bn|lM7=Vr{oCUjnKAZoMt8`wD`9afBjivl#7HEglycauC))R2^ zK{Q9>dTaOm_jmvDQX_s5opsl5HZthBF_oT z%&XHt%OB6+8Z#og{ekOs8l5uOOL!!7fzz+7Sf8)gh){a)6JjYegLejH5LtPJj2gT>g$v)SC=Cj?ZPT@!a+J3t2&^yCadQ6r zQ4&FplqX}BO_U$18CS$&h4Y4N%ten+hGO|hGdS0Uj<;fBJV~gw+ss2T;0U0Csu+~3 zLzh*60vpT7N7N8u&^Rm38*D}t0?rE^RD-CVV6-IdS_>IK*A{j|thR?#OALt0Od%AxsC_BJ#ixdn zcjt+i1+a%t?Xx>C7I-t(>JH3nTJ8?drZX%=Q`AUG44`Bm3P3_ zI5}UeH*pUQP8CL=^(?!NXk-H=@;0za59`@$w22Zoj4>-kP04oye=3*UQ0~#FT$>6GJbK*L==YR9fj|^| zPRQ!+uNUHR$GCfI+wveh{I+FL}s9-$B8p*5L-M~=>anw{H z*hrOg2X~VSXEk$-P2=#;;7K|L>t40Ty%yiH`~qVEQK6T^grl{{NE{Eg*=8m4$rXq2 zE-6SGtewhNAB4MB?iLbonRL~imo?FeFV0HRVWu+QF^Qr{|KeuV~fyQ!|VI zS+1!`qHjD^CIfT3aX%z=iSWBH%Jpcm6m3paW+9Wj*`ryiPRJ(x52ni>r(nS5zVkgF z3=AX1(PzW%(8-lcocRg^wG>$mV-}iFZN4~wWT;i5_Au+htVg0B zb$ps|fhYI)#J9v5Izgu4(FBk~^Arb@ilS_I0@Hb*qoYP-+0r+0On1c`awLqJi%Fv;eBx75}VFu0Y`nS?9{ z2B(%^?3Wp9wf0#^gPRbn3b#fxwz~6_6hUPgUmO)&v&)82lj?z(ti+tOMg3*i4-j=A zuIwA=ZW*BgX+1?~L!6q7{C6oD$8cmc)${k18c8?e!5df=-KNP@f|7evn8aa$((+Lj z43$;Nj+b%8NM<^|Uyjrwi-VEO3_mr6#!}tN`!bc{05!1chu+nVB9xz_3jx(9l~N7H zZ((7z0bQ?4pX{vw!HqlE(&i)n>Yno59k7g~WRRJK1zf4;>|Z4c{?n49v=2ZK4tY=y z9PHx>oKk!_fMvo4=r1MLMMcDR)ogy>kYBTCI*Uy`So%*P}s-Lk%B$qR zUA$RpFZK`W8@0r0nWo9saqvB+WWZmK(9`o<=A!p)s<&K!f`!lUBRz09P#}zw8@VPX;Y_B^-`HnJ zIns-Rgc))0-Z516y||Ujg}#~cc#Bp%=&n3X>REst7G6xpw&`D01JFbZHp$ztttioH zff0YfH1+*60Q;}Tj1c|Z7n|a`6t7vjZx9b9coBg4Qzc(ZQ(#ja;!ZS&*cUmJT=(IG zeT!*9Wqr@ZC^9Mi1)UsOEi&MH5pT{8nbodlfc-ZQY%((w?bkT!+tH!n!D@O87iMbN z)hwcY{r2?YbOLxV{3)Xb)WD$3$xYz?i9r!R4`5s=GuGjvXeb%SM-<~$|L7};O|#XF zRAyiDJ{2c_38A@!H;+n`oEcVnhL~{!O(OzwiDf3nS|pK6`vw$lq=i|M5h?t^fOx{-M72zqkH}iTZy#AtA4H z6lU6T3dT~^Ar#vie-}9YTM!kmXr#H{+B`=tj3#Y>@b^LKzke!10eoBN{U@!)*@^Vg zzn6pjS3j%FhJErGvH4~LQ%Xz)adK~0pd53=Kufz literal 0 HcmV?d00001 diff --git a/docs/getting_started_main.rst b/docs/getting_started_main.rst index 83565eb8..d907ab86 100644 --- a/docs/getting_started_main.rst +++ b/docs/getting_started_main.rst @@ -1,4 +1,4 @@ -.. _getting_started: +.. _`getting started`: Getting Started =============== @@ -21,27 +21,60 @@ See this paper for more details: - PythonRobotics: a Python code collection of robotics algorithms: https://arxiv.org/abs/1808.10703 +.. _`Requirements`: Requirements ------------- -- Python 3.9.x -- numpy -- scipy -- matplotlib -- pandas +- `Python 3.9.x`_ +- `NumPy`_ +- `SciPy`_ +- `Matplotlib`_ +- `pandas`_ - `cvxpy`_ -.. _cvxpy: http://www.cvxpy.org/en/latest/ +For development: + +- pytest (for unit tests) +- pytest-xdist (for parallel unit tests) +- mypy (for type check) +- sphinx (for document generation) +- pycodestyle (for code style check) + +.. _`Python 3.9.x`: https://www.python.org/ +.. _`NumPy`: https://numpy.org/ +.. _`SciPy`: https://scipy.org/ +.. _`Matplotlib`: https://matplotlib.org/ +.. _`pandas`: https://pandas.pydata.org/ +.. _`cvxpy`: https://www.cvxpy.org/ How to use ---------- -1. Install the required libraries. You can use environment.yml with - conda command. +1. Clone this repo and go into dir. + +.. code-block:: + + >$ git clone https://github.com/AtsushiSakai/PythonRobotics.git + + >$ cd PythonRobotics + + +2. Install the required libraries. + +using conda : + +.. code-block:: + + >$ conda env create -f environment.yml + +using pip : + +.. code-block:: + + >$ pip install -r requirements.txt -2. Clone this repo. 3. Execute python script in each directory. diff --git a/docs/how_to_contribute_main.rst b/docs/how_to_contribute_main.rst new file mode 100644 index 00000000..e0007854 --- /dev/null +++ b/docs/how_to_contribute_main.rst @@ -0,0 +1,129 @@ +How to contribute +================= + +This document describes how to contribute this project. + +Adding a new algorithm example +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This is a step by step manual to add a new algorithm example. + +Step 1: Choose an algorithm to implement +----------------------------------------- + +Before choosing an algorithm, please check the :ref:`getting started` doc to +understand this project's philosophy and setup your development environment. + +If an algorithm is widely used and successful, let's create an issue to +propose it for our community. + +If some people agree by thumbs up or posting positive comments, let go to next step. + +It is OK to just create an issue to propose adding an algorithm, someone might implement it. + +In that case, please share any papers or documentations to implement it. + + +Step 2: Implement the algorithm with matplotlib based animation +---------------------------------------------------------------- + +When you implement an algorithm, please keep the following items in mind. + +1. Use only Python. Other language code is not acceptable. + +2. This project only accept codes for python 3.9 or higher. + +3. Use matplotlib based animation to show how the algorithm works. + +4. Only use current :ref:`Requirements` libraries, not adding new dependencies. + +5. Keep simple your code. The main goal is to make it easy for users to understand the algorithm, not for practical usage. + + +Step 3: Add a unittest +---------------------- +If you add a new algorithm sample code, please add a unit test file under `tests dir`_. + +This sample test code might help you : `test_a_star.py`_. + +At the least, try to run the example code without animation in the unit test. + + +.. _`how to write doc`: + +Step 4: Write a document about the algorithm +---------------------------------------------- +Please add a document to describe the algorithm details, mathematical backgrounds and show graphs and animation gif. + +This project is using `Sphinx`_ as a document builder, all documentations are written by `reStructuredText`_. + +You can add a new rst file under the subdirectory in `doc modules dir`_ and the top rst file can include it. + +Please check other documents for details. + +You can build the doc locally based on `doc README`_. + + +.. _`submit a pull request`: + +Step 5: Submit a pull request and fix codes based on review +------------------------------------------------------------ + +Let's submit a pull request when your code, test, and doc are ready. + +At first, please fix all CI errors before code review. + +You can check your PR doc from the CI panel. + +After the "ci/circleci: build_doc" CI is succeeded, +you can access you PR doc with clicking the [Details] of the "ci/circleci: build_doc artifact" CI. + +.. image:: /_static/img/doc_ci.png + +After that, I will start the review. + +Note that this is my hobby project; I appreciate your patience during the review process. + + +Reporting and fixing a defect +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Reporting and fixing a defect is also great contribution. + +When you report an issue, please provide these information: + +- A clear and concise description of what the bug is. +- A clear and concise description of what you expected to happen. +- Screenshots to help explain your problem if applicable. +- OS version +- Python version +- Each library versions + +If you want to fix any bug, you can find reported issues in `bug labeled issues`_. + +If you fix a bug of existing codes, please add a test function +in the test code to show the issue was solved. + +This doc `submit a pull request`_ can be helpful to submit a pull request. + + +Adding missed documentations for existing examples +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Adding the missed documentations for existing examples is also great contribution. + +If you check the `Python Robotics Docs`_, you can notice that some of the examples +only have a simulation gif or short overview descriptions, +but no detailed algorithm or mathematical description. + +This doc `how to write doc`_ can be helpful to write documents. + +.. _`Python Robotics Docs`: https://pythonrobotics.readthedocs.io/en/latest/ +.. _`bug labeled issues`: https://github.com/AtsushiSakai/PythonRobotics/issues?q=is%3Aissue+is%3Aopen+label%3Abug +.. _`tests dir`: https://github.com/AtsushiSakai/PythonRobotics/tree/master/tests +.. _`test_a_star.py`: https://github.com/AtsushiSakai/PythonRobotics/blob/master/tests/test_a_star.py +.. _`Sphinx`: https://www.sphinx-doc.org/ +.. _`reStructuredText`: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html +.. _`doc modules dir`: https://github.com/AtsushiSakai/PythonRobotics/tree/master/docs/modules +.. _`doc README`: https://github.com/AtsushiSakai/PythonRobotics/blob/master/docs/README.md + diff --git a/docs/index_main.rst b/docs/index_main.rst index 978c216f..7cdbddc7 100644 --- a/docs/index_main.rst +++ b/docs/index_main.rst @@ -43,6 +43,7 @@ See this paper for more details: modules/arm_navigation/arm_navigation modules/aerial_navigation/aerial_navigation modules/appendix/appendix + how_to_contribute Indices and tables diff --git a/docs/modules/introduction_main.rst b/docs/modules/introduction_main.rst index e9fce334..60cb085a 100644 --- a/docs/modules/introduction_main.rst +++ b/docs/modules/introduction_main.rst @@ -2,5 +2,4 @@ Introduction ============ -Ref ---- +TBD \ No newline at end of file