From 776952762fb9082622459bd5e49dd1f89da91d6a Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Mon, 28 Jan 2013 16:33:18 +0100 Subject: [PATCH] working on #223: Auto-detection of serial ports. Linux version ready --- app/build.xml | 16 +++--- app/lib/commons-exec-1.1.jar | Bin 0 -> 52543 bytes app/src/processing/app/Editor.java | 8 ++- app/src/processing/app/Platform.java | 33 ++++++++++-- app/src/processing/app/linux/Platform.java | 56 ++++++++++++++++++++- build/build.xml | 1 + core/build.xml | 2 +- hardware/arduino/avr/boards.txt | 4 ++ hardware/arduino/sam/boards.txt | 2 + 9 files changed, 107 insertions(+), 15 deletions(-) create mode 100644 app/lib/commons-exec-1.1.jar diff --git a/app/build.xml b/app/build.xml index 8603d6101..9c00cab6f 100644 --- a/app/build.xml +++ b/app/build.xml @@ -76,13 +76,13 @@ - - + + + +--> + - e%U#a0ZL`a^ZQHilrQ2ub%-r9cd+%BE$IX>HBXX_p zi-?`;-8=Gq;@e8HpkOdS|9COhO7Z{4&Obk(|8C{Q)r9G#6(ksy{uu@Z#PB!Ff`e{r z7Z?ag6buLm?f(pu7gms#5LZ=Wke7&7)puBDLi3GH`gU9@mCq1`0##3c21=4#Z=6oQ5a-?nWRa#=ja&B+qs6nc;4x)SDnb9z3>mv2ul*B6{qqMz?7b_Fns? z(n{;h1=_vRG762lypfurfbd*1n@yBBRpn!3(|f#X`%8T(w3~^OI1y%T5lw>#m;ZwyUjskGsY9ef zI7r`|u8xwy;0@*i8`OynFOLOE_~u+bm8|O#o4MZ%}1}jqe|u(s~;%tl&1tz ztnD|Ayf4O&T}xK#6=P>3YUgEv!zy{x*&Xc47@Rm8SI=2XL-u8)S)9WIU%O5`M)8pn zycLg#*RfjZb9<`{RBg4J*8y-^Y6*;s1mo2(A}uI7Q|PA4P?KBbwXSZuiTxV$I@Uy~ zzu0osLKR=m`nh07z69C;k?5p3-%-EGEEMSFr5#>#Zn}W~OA$aoaQ`BlzoGzgaJKkw z&HO(jVE-9m>}YIaY4&ddQU7P4iG!V;gT2eYNx=GlPcZW^Gx;}JWdA11%>Jj9vxB{z znZ4`3IRf#&IfAXRoBiKzI{%w={C|_~=4xg8->Fdl@oN(zR>6cK0s%eK|I7H3lNJ?M zP!(rz^>E$N*>c$!M)sRAbUKnNRe>nUVza_M39ma0E*JF_E4Qae3?+3Ws)2AE#V3mR zyy)n7f$xvt_5Dq;po3)Z(DTyL(fa3u^_ly^K#3F1a(;MP`WM@QE$kLXxfuM4lPt{z>#7k@>Nc*c}VoyGb@&|0gMJ?;;> ztYBDkgib3hT8|NkI3J{T_9%CBT6N8}#7d2fXbCjANQ2+jbazh3VS5|NY(Xg<$lv{~ z#^?rgG|jwqRaErpjJpt3!=C}Z18VR+QXY!QCbaFwF}%eytF-EV^Ui))X*@qgSdHKi zCiVtjx$u%wzDsyPi`!TS0ubSQtJl&Ozv3Xn4o>jHuUSQ!k_E z2W17%4FWjD@gXV0ICQyqU{OYEVLh!7e;3Yzr>O=l#UZb)`C-~BRUYm_yc*=0d`o4_ zRvzK+z_L+p+YR6ErqQn65lKPsBD%6tp0@#FP<-J|^`v$IQDzABk~&S5!Zls9nXyDhWp@*fEyvxP6N zzN8JAL225I&DaKFW&e?2Y483G0?CaT;7<7t2gk;N#^0nt|53+xi_jXo2f96v?UU*) zSx6cE-ejJoEsoqrg2|?o4h3htBn!tS4#yMlvP(z=%Qr1HVd>H%EW^>Rt1LYY zP!&|~^)437B9A5IBb%nS$;TW>sx=cBre8Pp)2E;sw>fqgqA0wjdPgE;;x23)V+xiLJ zU!^=Up+~qPG9fv8UT9Q?(~#x`zRgwxUm7AbVLbp_djK)DrrfIG0Xq!wnlxqWft`*> zdgKvzL@bMI)D3(NIaq@cn-CRAfFR@SGzey?YxRwbmerp@w@!TniissmPBD z2y$lRZ9Un9oObb;w029OfZ{#X?K>n!ysKhgLr^xW$R|AAoHjV2X}GT3o9VPG=zU zkp*NNW$le5elNiQvn+1*F`u`SU zr2Yx4m7a(#W^kUy(xs=c?JJaU^Mikr+}x&5;nf*S39s+ z>)UgcfNQ%pNv>=#b2$w|hP4-{rQ7=zVRVA3x+_cAhKJp?XKL6!wourzS~_L)0W#1| zR1Pv*;5^hK@XggoU{|zk6ctldeDWVD3T}*}m~f*pJ>5WH#V@PX<){vTg-9LPS9uUE zA2srlPi(ebFQv{!cTY!%{Tj({fr(J7KQ|-zSrE~IpfB*DNKlIYF1khV{7$=MSC|h! zNe=Bm4lP=y{ei~?=Jfm&CZA$VBEEX+mca4QKK+5A;HP)@Fqo`tVSkQ!(K`K*wS@NH z3=o77iH@f}KT+2wbq=m4#*tcn_9MQb;@4sg(c2Sh9Y{}#D)1?Tv0?UOy?KYw)n5ug zjq7F};eH+m$j)~9a-t$XN}HmB1) zVtP6ZiCH&E-l|V)Vi0$(l%^6LHgtKj3z^0KVJX3#*BiaMQ4gH)08*6pBSA1%HdsxZ z?qQhyow}F>=ln3_q1g)h6NDJ{+<7Nzc7n5?A<%~v)nq1FCU)AEy>C}sR$^ywIH(7P zz}p?p3&LwPTZ38Mr^(cvBwLq0JRl|a2SnB}&1mYpNs;uj7X*7k08&`L8!4ISJ)M}u z?Ke&Nspo;caIYkb0dgjTiu}2K71Hu`lXc#AJyf4XtEN?U_in1jF*2WHtPg2sa}BVn zED}bdE=)yY4w~Pz*s+>w$>(@WHQY$1``FaaO0;~QXFD$GT2jjBYH+)V%UM6$6>Am> zCVYrc$qFu!)kN#yV%J}O>6P_8t$_&KU}~y zQqztD4O>f4@r~-*x(s`|wT0pY;EVj=6x>lk-Y=WkKoVVYN;(S= zINJ-;)R{||Vj9k);$(x8#4EYTr0%GBrlF=TyfsD+{e_B=H;rIZZwNQ@u@-=ucK0=N z)UV&7bYe3yJTg2}VjUJp;^q|VR5BfMaKo;$`s(esL+_2mP13$AV>vTkMdqh6rG)lKCMaWu4y06|=(9HypjZ$b zs>WXNby>}@5|*#WstMsY2umcgozBzc%pSB!>VWgN#HOojUK&B6E!_8sgpXM=u)-xc zp%hmh>?)B^Oe;Og<;KMjS!kG~DAgmYKEX+f<0!E=Rg}iE37o+(gJCNVPBfI8nC{y$ zrY_z2Upk>E7~%8Vu+YKy&J`VSvCgb48nj&ju98Xn*<_z*h0!@oMee{>l2LRW3o_{Z z64EEEB9s%IbXm;bPc7-MsBf3g!p8bX^?CTeZ*W8)x5JhOL+FrUqkp%0HlcA?_nH_B zinCjl+R}y@ca=7yz#`UJNKg?gfEC<2T8N_T_hLq@oHJ-+IG!C*#}q#DCte#Vw`vb z>*=qXWPQcqXOAp z&8rFjECx_3Ttrw3r4q`SzJhQM0}p#9W_8Dsu1s#Ga(M@_)M?qRd36}=R5f4NsXe|w zeIm9XzFdBuU)wje8SdDwUFrYn>%YQnUjLZ<>fY7^bximP`xVTppEyoR{jE0U!6|_` z<=!@9L2212ZMGPE))owB-DSAb(?#72k%@URmD%xh{GOR>&+!8Oes+BQgxGs_-tn~Y z^f_~==CJ&dnOXJO`UAbJQ+F!>m~gxLdbK08!@Xq#SGVd4(AXyrEj2eVl+aAo=v2>t zwiwVGqw}Qm15_w*W!LEy<;`?*W-Mz(K{6WHHAH0OkpX@Qq)-Ms!%Y`rGbR0a^ep48 zGdt$%wS}DT;e05_fqZ8SAV8sIa%B!w+#b+c=enybN~*Jq#`9$hcG%*!t0KzNe>&J5 z?|&@gq#eBF7Y|>MSiX2O+!qpp+nQ^67(+zD+&c0mRUdx0g79hw$gcrEJ{UG%uiV|O zrNXI=cWuj5j4St?czF{5nR!Pf-={<^!F;U}ZVn1n0v)y0B!vQ8^5I~{##GLnaAAXO zI~`VEy?};+BnbLAT7@x8nGpTLDUB)RQ(sVpgTyk$Lr zCb=%X;8A9T(Mp*19M@wvRT+1dk1zz1(d0B3PV6dx>hml`cIja`l0C}V0+k%}3z5@- zdpuEDG3#|8>JhPIv3!IQUI$`f@6fGP4AKPtxz)zGF&q-f1)F#W<$&~L%4L+y)u;8c z)g?%(Pt?trQV`(F(`F{>(@~lZNRraKuSU~I+m5l~)9z&xnYGOJAbY5*f{H@oL z^qbESaa}IRcag^)d}|Z;zGW6m%l=U}Yo^nk5>iv8PN6KkY-^Sd5A|El-*T6-{b}kL z$L4->BxEmpsl)wt{ZDSqY#CdV|A)78u3HhI=aJIi=~^^RQo8+k{o z##U}WCz>|eJM5R^n5DIlT|ICb$QN+5*zS-UvGm@|&jl>mV=(qzYPtZcR-<%(TM$Xy zARDgt=FHpSNks=;Kag)xHd|eOklHTB<6m{1sCNql>j;wea0L25k!=1Wm0i6!i4MM7 z79yiGtwnO(3XVLF-X~0K5u%vY6QK6jh2Dec=ZuuEZ^@q`AD}&n{0}vIVJ_J;XN%6I zH1mp1YvA2T-40zJ%P4pFNEGn8KwBccEwJ@2(M;qEyB5%vKb%1Ff3htctU1nga1qWM zy>==7+7ZdEUEA&iS{|rVJcAGbm~XoKq$sff@qNp{X_B155{~@&CY^l&+M#x${R@i_ zK|o}8<%x`12>Y;se+Vg`l^7}jxD_tpC)->-)|M>3{~MG1r*ZEbEerSk>-DStwtujV z|K@87ifVtY`#*fU?<6xqKM@+xY_{r$G9++jYb$$nmwy*fe@k4W4+vph%ZjDmmZ3pz z)DskF73~m6Dy0sy(zx+3Z;%;4J!2P1k&O<`@*|(kUEdgovB~npC=86CCk+ zF%O;6uf;u3OqtW&=J0RKOFkDK+9jRD;{mcG?W~}f3I@;Z=?O&{sDFV ziERFh#QXEoLja^)#qhw+Fg^NqkK;A0-_>G&Yp{gYA-ZS#>6EcrkLkWhNSmCq0u9Ja=LJq}nWf;FX z%rAb zuf+X5!A>^q6L>&P3EyWaIiQi?PcA{Y$r>s|0^nb8%0Pz6a|8$w5DWwm5X=9vpTf=- zZvS9H|JmJaRXfE6CA44moXgc1p2&TiXvU))6k9-sp=9lYmLhBr4T$eQHSL=ds@Ux$ zZ@+J)nd8NX?t%n+3C;Lk?ENRx(KZe@T@+^?vL3R$-yc?92!U)XGo=o?*<|NeDdf-= z4wL2ROvJr@&-2aRNsX8Q^6|INp#XQ$cHIM47%w=_=4h=3g_BI1hua#mofogj;8Osb}7JGViADM80lYTFTq7GK83p=!rV7(1xeJ+DBi`AovDGHQ|);@gaiwmBYA zZd}+;chx4nWMb{Rma-G%^oNp#>d0OGnwBJ(oxLg=M7_2f@Wgr(hy%~r)5Z`?W~~~2 zMX+QHL{VYGl>Ns9?tnzHLgE5zcYD;e&AhSb*1g{k4YH;#?D&dUy-ME>Pjx)>$wzUG zTLo<7Rw>2W##&+F7EEmiVN8=r5rg+68a)=MI9v&+!)9Yz?Np>&d@c(&U@;zN=Og-Lr9Ad@=r<;jqzqF;Wg2ri|Z7n8fLIe-qTDCnWXQqX`~#z9H{ud!R^=U+zfG)ZU(INV=l;{X9s|L>Ij zpMoydg7!dL!vF5NG_R49(vl(*ViF@W<|Ib48U%|IP0~W?6(ZSXUxOR#H|M;ZCb6u7 z%(GisUM7IB?vmH70;h$R61SmmUT$bAwYxHNuxo0zwkhuUzBFynPN})ONOjoh^t|!g zNi5y=eueVqVef-vw0A1p3E~$xG_FBpf9<4e@wx?X>zs<-IBL^O;Wcer2t{w5i0<&k z3hn6RYm-dzKC&13Y52G&`&!?*O*!!i@`Ap`zdNkyOC?KuMcey}Ps_h%FCPT2H;+!# z`KMBfD9Cp$V(6XQ8b8SdvNl0-!^q|<0CCAfPs&dv&Xg)eseF0tN6H?QYlK=rly zGUs_0Ti914<;2Hw@WH-wx9`P=3xCJ`K%Bc>*5DV>1S0=yeA?cK^9L&8FPa(MkO5hO z54jw{mt9PP&dXuOt=D7_w8mr0#W2Rm)9~PUrCYjicS`T*vhv-fEBe?^TF#4&$Mz!Z zn8hYsVpa?Xm0RqMXr=i@UQ!7hk^;$&i}gtlu66ma0^oj+5x zk`gZ3{rjUw;5%zYEG4In8Qr#i>C0I@K_LU$#Z|O8svC*O7EAZ(Ty^qZnQ-8= zSsjBY*Ig6)+J@EO3PL0n>{wEhS@xCSwNT0ivT8tp#gXO%r@To-H# zMl@wEw)P|FG4BC&KQNyi37MD4OepTelD>mhTU{yW!$;iK8;L{}aa0u@*mYIGQ$U?VCJ#nG1vpQgNz)_FL$e>Nd4%XC}U8ZzanN+vYQV=yHes?zr+xP{M>#n zGsSh9(~-BMrS0)gB_#Y11Eg~|2&8^N+qAH?StSmx79AL=a0X{t4nJ9v6l4PIBGlS7 zkM@%m7O%_dw)Ai}epuD<5Wr$XTkk~-?|1RItm4PWM8%mJb9rgdt))j`cb`zo>E|G* z#+90;k&9=tMO(hI$jUTDCk>XSV9RJn$zOPddISON#iVvHsk_23J`go6?qJ~n-HO12o(x4Ob>mWy`qi0Kqvtfr@o{C8g z)F3b2;(lo4e~8UWIOMj84oKcAho}xCMc`ETFX1%j>w9#Hkk@xa0x%k_EeCYqyH=}= z(KR~mc;S06t-Q>vMCAquZzbUghm)gbkx?3T5JeRSaI#K@bJ;$y{hSWe;WO_taQ&8U zIfZ@k9V}mYw-;{_KU4=8E`J`-!#lvX2n>qzss7a4?z0cccu6!VSm|N=z`e14ja{wg z;%y9m@y3Z^PD@tt#A!AO)#YY8QhURx2L2sfF*vtn-rVz8zjG|f~{DYPrYpTu1ZB!ydn+VLcdX!^2g|D#VU<)Y8jLyEgQSR8#+ZS z+Wn=GaqvlZ;}4UhuX2k1XHJZu>Evq+#21z$5{br*%Q_wLhNk*@%k-^ie#3DK3la?J zjA3hie|;4z@y`0m{zkgtBq(VFHt7v&JoWmp!QmD2v^BF>N%=y5`m}jvCT#p!zYpq$ zPD#ba`U0h@vL~!9#0B`}IXhEKv3CYe55t7r2N(a?c%i58taxObi&nF@^j7Ll{mCtJ zM=jKf>w^TsG&%C1$sVwsPc<>#2-LKvR)nHncfFkMm@4tu(YKVH596)z~$CHJ&Njzy|JQ5-H+|ITC~$&2HLhk*=AWbOnfQ z7~(>aeRcA=x^~xZW)wH3G{t^siBgP^U#&@ZL9>7ygR}B{IPPIxel-t`!Nf)-mCN?Lao)tIT%^w`ePb8nJraoabF5E2g=?qf$ zenVZ={Yt{%<+_P-h?p)NUXn3eG)Ft)QjK4%)%|2L%F@vlW%B%H+}Z7P`D`cmZ5b>P zgAY{dq%uyx3}goAfvr%Oi3a>Mj?k`LV&=MpYvCcQ?xw@F>=$Hm1i1?!qEv8r!>v!E zR6PFs{s%zAkRW};uZTwdUyVt{Dfl87EhMhSBydS4iRAKD5h#jokvnV?tkk~%Q!}-1 z@-xRLa(B3cgPU~Tb}7pBQOaH2a48E5bft+$6q#l%Q}^mWc;4j98^{_^oD(d{9sQt& zgufu1R3Kw1@Q0j5Qjxvxf#vq5l0?%g9HEY2=-ES=Tj)_F7LSioBqo~i9vHc zvOjpgt1S1Ejs{VN1w8QRNfpw`dV~Qo@vNyA>P>C(l63r+%nOlx3!y4g8b?VaWdd6Q z(UH~g5r@eddD>6U6sRk1xAgR?i37?-v!<#@E7WzF~&SB#*&bi1nY!A9=cXzgxhWzW#@61+)?LG0lRAK!P-GkrWLH|KD~+{lnrwsoVx>=a)B*cyW7oNnnji+ z+%vV@6ZTrz)91}_?@;t#{JciRHn+%&jXXtz%PchKN43E+%L0J&WMCN1%zzyg-TlMn zYQk=u2wory`Aqe|+%c-Yg)-bERPczq{LL~o0PY3&hXx&TDw zdA^iOhz>Ya2HjYYj8B*eWtr|&XR^g4I>|C7MR03?ox}+_+u?X#kX=<#^aP&dEH>Z%B~MseU*)J8t8!Td zld}4PR09haLPu@f(-jPFq11X3iCU=J)r@vm)6=0sNTJ9TPVDj| z-dapDqWCy~zqJR8nlMmh%=1_@X{d3##K@P9%(jssw<5J0g<%tI(Ib|0UYB@=m3d{< zA;%Zr(#n?$73_L_nvmtsMd(y9_w?MDy^>;D&&5wwh7Vh?e6j&mA3)fFoFE4AWt9rf~R zRoJDcb3C^oYjsYYzJ(Dqfz+!56FBUeVDRb|bLt)*R8FR~H~kWfeTnOPDnC>K`=%ro zcEa3RnLau6LHSp*pb7=``h{ke@sr;yo0GjRsvRmm8ADTr)5f#DfVF+{>}}UdhdP^| z>W&`ge7cpmc>HcTCfU)}ml`jsExqM`m=&)2$eL2Eylf;gG>RYc#|h@|Z?$2+U0(B& z4?Qh0lK1v%_l`ybzCr%0#N$8N1xgROOgktLkTfI^5cj|F5@KfN#%{K*;(tpn++596 z%v}C{k@|}VY|WhiX_nP>9dO0bzJ^n6>uoaz6-2G_x1HTM!Z9-dx(jIg>x07#$ju}X zaTVdLO)WY%IvoeiZ?I5-DNOQqWNP@R>Y=>{WS{)oKKEW@l{%+c_ zGZUUj-RWN9^%gNjp6(H&rH?$j2LcDT;H~=({r>tP`nh`9#>Zl+&m->~W9x-GytbjZ zNyZ!IqKGfxzNsZVMZIhH7xCG{cLr@1_MV|Fegdv@JY3cKgJ3vZMY2w^YNv6|V|=on zfi6%@u)(ff?~Z^S6l1N&4t`B3@bsE8zGFbm_@>hk@PN+OsTnnxgpq{q=zJOT@3*7x z`3&L5+M&ffnMRe1rp(QFGeM)-P~?0-{diBsD*Ksh$d0CrI`+J;A`b&M=f|&E6f;To znUBz8wCV@k&0cCg8zX2%T&{r101HQz0dI&DW9Gx8$Sda>J54>!#&(gEV0=2cCTC+L+&u?64t$e}9vVgY}=)jq_6n=Isx}QWyIkpL>ZX<3>#d*Tz`*8Z-o^hZmT;Xu_ zjfO=VS-noSv}RU4RfEwvMU4EVW1+#NPux7oW2tj4+wF+v;Ytb%8N{}| z1#aN1TI9p*hoe8>_Kj39@;)Cth=(_eN5z6YBjV_OVp`FPk0z#FNFCt0+Lj^e2e+|> zMKUj4i>aXwM0!w5I1HX@+Z+*;p!JO>LUEL@!ln&jWHZJfn}&jEcgo2tgVhibqFxeV zCpVk=#tzy|egR#{nEw$l|3xPHr-OKexeU=FL|{N2B~M^Esn}Tclm;K1{b>s9Tr$`z zL`m>XSFN3axdQ(Pp(0mFl1MdPISRZqwC{J3F9{68@H(T`OWqEkF07Qm==nnMR|jkS z6#V!xMYt0eL@N?#^_*V>T?o{AOg?^nd2aD0DBi@~6>uL3{S{KN^hX#}A?5n1I1P1S2alEJp(hl%GF!mF{=Yv;;?#t8XThD!@hy0D#n@;C{PXdSIl2^yI=GBURMdQ))?Ge1J^1k z6kwWUpZ2wKq;R0F%ME{dw!S!^tlXw^;i;V z+Fe8KdUTSvBYLIQ5H;xAD6S&vT^C=hQ`VK5)oqKC@D-21c`*H+`XgZQb@OydsT{VT zeQGK?kbeH?Vi9;SmZOR!gI+@89&H2taS$x@g(WWyc@0Lg^-r{!e1@{Rm&nHFIqm` za}Bgz>KBfks&-s^39c7lXygHh1%`;W>?fA{zBjX2D_9T^%s=u7K_OJQEOz-AuwIcc zQCqEcaeZudF(M$$nKFB`0&bWX;+w0iJ4aDF$5pF##^p@@#5kPw9V7Zvu+M%j0A(|c4#n}SBL=@b z=h^(p+u3P|iDC2PDZ$?E+O%?|n!WHA1n<6%$y(M!w=OT1)gjn=k3BB%CSm&NbMdVl zDKT1t2n|rfcVIW9A#CIQV$|8597fvN>hftCp@xzP6uAldDsJRJ@I)IUj)hr&S$`!Q zlzbFCwg>#;T>*Yz4o=?^$xPo6nZ(-=*}RN($p2JUa|v$_V(;Y;$Y(G31bXv<`E17? zmO{OAI38+cDB^)RrnuvPZjolYZi%;~vuK_x&uvD$CRzgsGI{BGx8Y;0cVKz?6Ufbo!O}sM8B6Z%&cW*b(&=GU3s0!I;)Gg1DB+S zefUAQ9JNn_T*95MTvRwl$Hp76Cuy2Si8UpGI=Tn5LPp9zhj$0@KZjnY>gu15zg3iM z1VBK4YXJX0$^8Gg7d!m({yU@z>w%|^{&i#j(}Fd<$ZDR)NvyY1e zK9inqOOYr)e|vWFa^-%rl+#9=|^3Z#%7BA6tKO0suRU^oMR~* z;&q%8Cc^#W)~1hkKfk~xt>`fE*EhO-H_e^^0PFB9DVP{K)C}!@TLkXiQSgOylaHtn zC{*j&1|?>cYG?&}7nkor9($+1#glCqEJk`YA?Rke1BKvmj~IKxG3;BA?f}_Garos9 zlz^Y+fZ63ybo);s-Un8!%L5pv;(foOhbfR?a!~1=Dz@MN>$SzTz&%Qhz=U;f;;l>0 zuN?7Qi#fyF9Za$hm0_Ka2#c`M8efn2*gIV8i(6fY_w3*u+1H?8L6}2|$JUZ(do@yh zV|oUq7HXWEYE2XCTFKvt65ig0@nT)eHQ*PzWzy&C8XZ1~LSNgKK8jTHTX+#R!u&Wp zlyNO*B29`_h~gKzqQ=ptKHlp5s|)B?7-bpoJp(AkcJ<4I^DV#kic*jquWU*4YBQo{ z6-e5hb@H6j|G=}!@^NZ^r`ysIz*~olHAsxaT$^O|Hgf6W)i(+%vPwxDYGsHFheJBJyxq%j8X+i1jZgppOUR^t!St!ijsUIEs z+QXh+{1S}9x>l~eQAIJ}6*&~FxKwqfOKE5#dQ=I>agGnCrlO@ef#@%tB4)uqyQt2| z4!!DkL3!?CZ?IN$FdHgKWPg|z+28HtAI{8?1#~dTnSzvO=PaVZnGdP)l!!?QC_4>8 z{m!J}>T#~e6K(Gh5ffw4kLN3K_L4b37Rp&s6Tc$`pMnlZjI}`=GLrREiaaCM!O(K? z$&eeD=0~gEsT_tI;?^l*M2nU1Y6_dqXVMlidUqn3*+)9Dgoc6d;FaMY$zG#yz?j`$ zv^r5x&d+qfo^eeAqS^3RUa7Fh&d`Lhr9FeJ>pMcTr(x2X!>Wf!t+j~m3~LARP|5Vo+oDVQ$aA93 zbW%U%#5v-nE##vzWi*0(y3OF>;Xz6j{17ba(h`2^eS*bxxfzPx%snbOf_Q?Hx=(|9 z#ypwp&BwUs6zFx5kDFzb#ffh{J9 zfe2ZW$-e7<;xD7+Rp|G~!TtJk(K|s;s4Pb?V6fk%saVdjo)}>`4s5}7>!K5eiVA7N zh|70tUU9*t08j;GnYZlo3P%>c&M)@#)w?&ZkmB;5nrgCQG>^{XGy%ez&622lC zj}S8GT$1__-M&yQ5e=~zCA4_jdo(5h}^NJtptbD8H z9*3A~6Jclb66kk01X)ZuM`}b})^sIzs%66r4moZr0S%JkiK0Guzr37s3D_;N)MwXe z9H+jyUZ&oJ6K?319`~hAt+VucMbUW+xMP1{M+@*Cd+9&w?YVie%aw0EHi#QMhfsK1H%xd(y?~Q5gIFt`Hz%XoNcm-XlP&ZsvkNG*rqYNQaNlt= zhZpv+up)Pd?T7O#{K3BJ^|tk*m`iS-yh*^GpIEHHZ&_br-|Da(fm<8A^OabCsUYr3 zW(5N$^g|4$a3*^b5{Vri9Sla@G?}nxS@U6~R_!=Lkv-Gr_5BNL!(<+!@m9PFeQ{Fq z&@EJe*P);ps>gty)Ka2z#!Kf^ql>%!VXN1bwc$k7K zd!hKUMQ;)M(YfHPkh=ZffjyDd8j0L74&j8cgWuzTn}gOvZdEoEkaU@17ts^@#fun( zVBF^;euy0S=mAw{-VAooH9ajpWKcR1>b;ZzcMTsRY?v#0J#^&jWUeGMMizrE4Y~%# z*iKe7TBHUj*~(}`@%@Ob+t-IOCrY>=n@^0F!fccibIukkXr$zTkKb}tuS`34f*|o! zAo0Zx4|X)B_{VPQe9nu4Xs~Y(`i(FbC~`~UsE`CnSC}cu{!f&)gl9c=_;@OAX4;rN z5*^mMO+XS}8HOY?W5`Dk0>{dF?IBxA6cE;Q5Zz|f3?v@uOesUi z8|RNPC>S0|B`MS4$5`>ygVQ&x`Fl4H|D^Nd3q`l9S?FL8BWnK%PhO=O+`}a*B zc^l^0f#1nU49U^;JN;H$0os(G$h}>5LzT*X{e<{%*ErLV$|@QLyw3~}J2$Z@V%zf3 zM5g2mm%!z}d5)HXHzfU7*m(lxmn1~k5Rh8bCwnU(69}ik=nMM+k+4T=O`>W}7&PJ= z2PtVUM)1@;o`&^j2vX)u{_TYofK@(kVHMrrkkw)Se3 zw1=&>t6kaa!WA-Hx*yVLK_@{iAar7uA#ar-|C(nUME50A+i5KLdC*~Ht}znF8)%jd zPKjvzW_g9BP|c2KQa8nHooyhzF-i$gjt>dXjJya=dVI)`emNkQ6%L3kY|3>bnOY6s|K(EW zOO!!B`%5*^pd34>)ci3nKCT|R&3{~<`C~EFm|9;xpxBT9URv-C!k54-Qd~)l+F2a? zINTX6((E=eu~vyrJiV+}MLGJY00y1JpGG-SM>*7M&dAYFmU4`I(&mkQD`Z_FR&e4bUlg%$8r(&XJL=D! z(-aeqUS68z|q*Ap4MM6%BCtK{SMSxUF)k&=1nh5 z+v`q1u(;%)Lm#DVe>`?yqBC&Ku2n2e!5>jzUin42ru1}vFl7G%A_pUm=8(CJ`b8bW z3im>LUvk@w%jI5$>pmCwbeO}}6X4T0${Tzc-XM8a(x5E6 zOrJ-BUrgp!F^A}XaaSxMD6}{D$uDJ`cGxN?($a!Z6UJBXnlpN`eIN6;?%%~C&Z1H> ze$}76Al=@V^vxI+y9wQ9Fx?W(!Z_P~yw))To3C-tZU8`_TPQs1Xqc&Uh- zr^Pgw6RUuv9`?SE&Vd?*%i?PTMe;A+X&Tk>{=GSR4VA<@PulXaLr?&`(_o!*#+FMiR5KstZJNx6Co6dN1!FklzX{jG&rrT zCa;vA`tA1v$8ix&e;|T=Ko5GL23V3YXpcR=PEBTdHosidDCPnWhJhqG{SMULe6GXD z3w9%P_t|_>wxHVRp1jzAo8eh6Vir7-HXIBmfNLB#xsxEPQ?i)1WJekw_TEP)G=H8w z6+3KGJNq)UNX(z-*KB62lnZ+cSDP0wTa7I#wZ~)ip#M~1qH`@mfgBK4Oe5W%fGT%$ z?Qbx#FWQI|o`E(25?$4hNz)j9&_k-{bmM%&PdHaSr{+|%B0bN#WhJoCE53`|4wtfZ zL9uEqr?j89Te%5#KitSaYU1ianr{M}b4m)pK(~8YqTK26q+fj7JjRnkD-U%cr79U~ zb&lff3vis?mkK8MjY?KvrNCNRnqjm=9PDf00#pvKU95ZpCEK%U?8G8Z$Slb-lC~{P zqPHE=85T;FU4B@??{;J3s0TOZlG>y`BS3Qq2HM$ojZAisnCF{Yw~Z*K_7Jv?Fp?@(VuE`4b;UB}c9M@_d!(TXSI zR3{v1ozzCyB}tn8@$1`S%3f0vkp(=7Aa=bLrWO> zdHgjnuG6W*qk}& zBLgfsiFciWJe_%Y7$;^vx&esZTdy&JH~Zq)JBfF`&~M%Ce=;sW*rS&+D>ylA6L#;e z7Jpi8hhf+~L77=_LeXaroee)GMwf2Xe5TWJ6o#OW#ib)<(@KU4 zFw$nis&7O{RSun#Qk5cUk*YeypyW+-K8r4b!a86xlPsYbg@spj z!)i`7L*W&aZzRW29R2}FpUt!>ATHE4ttIu+mWOc5wYJD71x;_PWa;25cR!ONHp7-# zT&lCQOwq=ClK2r6AB7+-t~nx-(ME$Ny;O(7lwdBkgM?vE->o!9kF;s_p)?eGOAIY; z0-dOIS_uam{$WS9z$S+-I4nyO_!_R&{ChQup2pRZMt~?Kci)1h`A25(Sl}E;pJl*S znVOH%X`BfrZAV`WvV!uROD7*4FHXkK`U;J45Ah+!TUlt-P*>RFcdRD9!OO{Hy8Qj` zG86P05d1sZy)eTA&dbSx13S%<2zjWoSNdP2`@SC1!@p^M#R^KL`Sy{S1w^O3mMbAH zmIl|)G2td&F=y)2(~^@ULGQ=1d=>4_yhcWBohsdFe%J}UAzuZ13OE{XmbGUIvgD_UaG$fqnFVR3n5nEUaJI z!AK4r6zscQtY=1L2Gw#(Q3~r#;!36}kxM%>KP?Yo(Cc}D+r`zBB}J8Ndwc zX)>k#%#_z}QE|A+^hJ|h1ra(pFHqiUv=)k8=um0aqJTrz`8~8jm;bi!riHX(l2OhK zZAvYfY-&84!TEbCj%eL&>?m3ith%`6qo zNQEbjmkrOE69?wZy9)C|V!f^Owei6%>(Uqu7RH%#U@atxXNnJ?>q$#=PX#3`N|raX zaxSBYnHjOK&nDyBEN|`b{}kOUqjNeg`eI?e*mqugDa`aG{`>nuRL{Bvcu$C z45*=>V`4mt!$9B1|NGQ_(0*zWKMDs#R=hzOyZXG(>1=!+?qS{|wD#>lhKXc3>Uz!z z@oieJ4keED|}WLpKWjGFemf zW8x_M0dfU@Ka|#;Lq(42MtoYCK(7^G69Zn^&)ZtT0rHoVY)0NGSPr5LPHpOMMvfDP z_+WS*9q~H~LZo*(`=Wz*fJDHeZ&`IOj6rI_V{00tESu0+D}}+QWSw!;BxRK+ZHPUQ z2h*vN$xL7zB+%>fNQyRix@@Oh2?9DB(him1nV3EBJoQJ32NM~yhl>d0p4FxJ&>wqU za8y5zM1=DxrD^HWJM#Xt?;aaA&zQGTMlS|o3yc}g1*P}>VO`Z>_jE&KaNdecPPTAz z5;O<*cDiHMn-5x3|F{s&@41M6p!Ogq9=Q2KGc&6$;!1d|hCF)&7S@&7JoYF@-$nG3 zuteLt@Q8G8BpZ(9m7aC+0sE31?n%b$H=v~n&K=*K5cK+Fd(_CGNU_HJQ0&sxt1;OI zj(#V=Uao;uS^sNq;egZ z$^c!uhX`9?YPU@-2~4uGS<@6Dl#bE9auQ0R4zHrF4-{z+vHKU}KH)>uT0Nj>+Qh7{Hiu&MNSem@D=!T!%W7yIzz% z&kKj3qXWc~!}@8V9cO9Yt2oyKKlplSeB-!X)2cngkoiSM_$E6&!8rG+><64S0}L+z zFV4RCyVE||HnwfscG4Z&wrxAz(Kohj+qP{x>DcHb9p213?>XzvyXMTDb$@vNfqH7~ z+Euk{e+HnPxFr$ZTM1)OUlR{kvD%K9wRx}|1y)@ee6=zG>_vth3nfp*@+~FuE>1Lj zuca;U&Wh6nW~H?TINQc^ZG)*J`hG}%(6e3nHFjk6F*UNsD{gFRfhsRs z+)z0~_{~YIEg;?%Mzw~=y(KYhuV-_m$Kph%AR z>7~K4uUJQj%qfuWClp@gEkKw3BEW_>LcWh3hX;olzciKn(z2_)i7s?bhw_H_&-@dt zeRPcn90*ABi-Yp~hy3&ZYF<>od={MlQYffttD~x;eNaHlpok3-sSHV5H3j_~R= zKxeX|Axk8}sM<$DFmzx+HK#zk=xTc8d|u|%Z_nAPE zQ6cehez+(2$ndc9z^RWwLKk1ww4B+n^V*z?n-LEy4@Z1*MPHZPfZ= z5>B&uaDXl;fV@6wKGK2W0XrdnHB@(YN^*<&S2qou=RKfe_kk9;EX;d~RVJm6G&}1F z&nQ2kAS@2tS5aQoBN=CD;(d#A1+3T(UD?`-%`(5OVUoLx!y0=6WxBSkqdGU`u}Uub zMT-pX@sU?CYN^X^XDKbB0q^_PO6wy;cipFRK&J$S~seR<)$TAagARYbdXyq8jtSLUdfFoDpyqd6eyY z-3Hitwi^z)(lT7Bx-3L>h|PslwnMbHlcVZeKSS({@A-#cv+;qU{@7FXqEW|KHW{;B z-K;s;@7aa~FZqx+x0kfAGZRGX{N0G{Mw3vn=QxsVQZKK2(0xNl`l!5m{kyaDoFx3E zW%Y%}uwZ?z5rjQI;Ajv!p}CP$Gxy3#o5H|jE&(K;Iy-9wWQ4nfr%GdDV4eG zpG3KQAFrk}3GhLZMqtw{Uf*iieyVlGU`^j&fV@1jy2dAX*%hnW1`9RYD9cU${(_Fk*UKngzwuh0jxpDW$|M2-hK zf&lB%a)~zp_iK_`gtK55R~>V&izRgRb#E)|&^&@U`X*dwb&t~^#kJgAn_CRH|ju<&=K5a( zGtze{>InOx&)qw_2ne0S;u$m}egtjBkT(i%;vF5GLc}pEfe%|3hj2(C%>VeA77xY9 z>R!*VR{u8Op3i;vH$+bKKCmUGjo<~ZdjYT0KLt*tsq>&hA+svEtq~T zc@{4{W`Hdui1;!1w@VvK%eA=ov9Oba>erpd`)^7Wjsz_#uE%(`-(In`_Ft%~Q_+ z%fvgOhR~^eO1RDK7uT1}A?(em%LWK*hfSbau6%(W601a!6!${A==mj@@W7l_zN2O;J|z;L#D{=ou54+zX!Or{6j(EH85j{reUxi?x2^(NL}# zy{4ZgFl*^<6fU<{8nYpQL5cE!oztIbe5=IHl&fCvE@*HKY;k|-(Q=C*rSgDJfEjPC z$^{wcb_{=&aMlj0A_}bhS%F!KQ|F-lxPtdk_EYgG!)=RWsn~LbUAYgV+$AwH$QC^3 zrx|;FBblLiU&*TK4O|ZOGafs*{;qWQyHvk3IL;Xe!Q0MlC($6y#)8iRFXaB6V?;z! z!fm0P%L~NzZB@enkE;(fgseBq!Z+AAhL~9}0hja-)!EQkQe;LM=jv-xhqAa+;ANQN0AAZMsu}rfdy5pMfX>_p0|pl0W5j z^mW$uKyQoEk3JXsJpF`Ab;ERmU9@NUpk906F_#;Yh1hwV34EdFI02GW5^glAo#At` zBvQyuf6l<0770S=0QPlJi>&GQpi#oqNmpe0LnlV!D*}?_Z-cWlp$;2}l)ca}z`D%P znjq82Co-{QqHf>^9wDiBE(?b3?!v?BlHDQJ#OLOr5Md>HLhG`Fh|D_Ul)o6n-0q;s zHKxrngCn_R46^0)xW*))3<=Vl^he=jePD2#O@-I*1!(j|vmsc$M&^rjtrPjCVX21xp;*36{7|)7$Z_5wQCo>CY2|COO7^jzPZ6oBP?_PY zlQTkYDeYjM7T_cO^df8td|3{V5~uP)B~%b;ESU!pfJ^m#_}fXQk}-oH;Oit4>Wj}Y z{2MO!m&#Ps!`Rfp#nRsHzYroSVM7j85e@JuJLAfwK~0p45yPsy0Za`E+?KmoxIPNL zIyiA!OD(*fW`+=IzdPWO7nUf3O4u91Qq8|WWC_bGyR6q>R`sL%cggEh4q*?F#j4zQ zxj;c=L0J;U>0?Q>K}{KBI4zh04KzdQFwFeU%b6?jK|1Lu; z`ikC z8eyM_Mj87IL#b|-x@+#@rOiqjSAfNuK;hACy5+6AUq@dSXx>n4*&0OL>7e*bm(e0G zhptwG8LzDD^~o^v3S7q)g-%qCqi}`74Zj{YtH($|QYiJ@QFR3;=ol~r;Ekz1?;Lv5 zB*FV|HqcVDZ5TW(o#rz#bQDH2Zo9>IWVc4PPP{p%fhuvd*e?1-&U5D4 z?<V%H)_*`vg~@f{#C~=tjW? zC4Sb<3O~zi36-$n?O~7yGZa?P1)poU<>p3`xP_IY)RyKwl1rb)7cCkir`1vkErob2 z7R;ZZ=`#Q3RnlkthKd+&4{Awmb0W#gM}Z0vvY`J0cnU%I2H&3j4*t*GNnuNkTk}^Y ze|&xa?#TFm*G&ii_f54in;*v6JT6tKGf+x=E)f;X)kxj#fC&W|>e!l&2M{7T1yKO4 zw<5gi@3TMc-+-W8KpH_Bp?$46%2YE=opCAC@loIQoEj-zdKAeR(_@0h984DyV#8F- zF~*1M*wc0clAxr=@I!+42X!mcRADc(rj&;iB~c-A#*-U#I)d56r%oSe?Bkg}SYHQ_ zywJ%T*(mD-bTr!_{CD$sW+)eTK@V#R6nTPj@8*0!|2YcOIwwDGzao(NwRQRrqM+>J zWNK*pPwH{o7+JXiCZymT>G|(}Xo-+Eb0we%f4b7d(twwtcpHn6tD=ZMg8jCk;{pm1 zk_ngi(F?nA&v%`1JX7<82!vAt9gPZyJ`H+X;GQhxQF;a_xfn}?Q7;(V?8MIE&0^o= z-_-p^4L2WLl11S-@ zuIa?nPcSsBJ?xd{H0HRvsQ5Jb?MJX`jRY8*|4MKjR{X^IR?*X;DFky0O7XPm>@>sO zbI*Ic{dRlJ*aISApeW1>IIBaHY=c{Q!+evxL`NsZQHhiyCwDid89sN=69#3FI0y=N z!KYwnL;p?fX`#hXW2IvLtA9(hvv}W?dM7rSQ&p#YKpV$pvYbi9L`m~v|NE@6$8B=!z=}%`sa@@oVI=|tm8wax<8-em{?85y* zyZJ8`xnyJpn$k8JRq!T&-slk@c$H~%;0j#bNm{h*%CP4`y@;6)zu?xAQYI*AbcXCn zM0*@6^nj)YQE5;sMdY9t!^;W*r|kl78POv1CbuZ_u1RRCgaITPTJu1(cE8O!wVUC1(Wj4$;e)PGH(+ zpl6KRQ&Uix9j6|Q)PHS-b31pNb`^7H!QI<21Q`w(CJ;I^X|9N^*R4(T-w^C)B2d_K zFmBTJA0E!KrqK^yLCzc$H+*O`C+i17&zRPA`)(vpfXrE zI*LtV)F*5*ODW5>u&Q}FAD}a-_;~P?)aJ|>@p9$+@VG1T_P!_hGs>s#Z zpF@$E52fgK6C?#nYs%|SGq04C`T}rNlo1Bi^9C!fbEO!TZXYk9eCxs38zYh6n{IOy zI)b)tI~2^<)fL?#f3q!(sOQobFjOn_TvB?cpBqvDD}iwiZ*h@u$v9@rKanbePQ$9xk};w`FPLW>$DCz5FX+s7M_uqX*`p+;Zysp$pQ zVYe5wZ2U-hzAvWorQY!NoCl|7w7}du>m!D&mehE5(}o|vY-VHD2hxK<45PgBC9xm1 ze8S`cdFQ*u(F-y5bEu#G?7eaQ4Yivy!^SPQue}q%e(qJ8;}`An4g107FQ6@>#0;(w z`*)m!%7WleN{9G3Q)~G-iVSuYt7Rm9uQ#*b%wkD1z0_y%Sz^gpT_fDZ8XGdlPeD(h zmTz^D)5AnI-@XxRJu+PYO@j?m1k|#}4_!;`S@|Ap)ibddRlBIVRIgvWX@egJ-q9mw z%7YEeDOhfYAHGSB^l%~mNC~!r5~Aih&k=a~_Rm0TjmWU``>RSpet|8;|C53Kx3)S< zWy5aaJ6fjgLMjElEL4jVy?Y1-oIKx65RSSA44R?@GGFeHZW}{1=elmeL%}mJ!3(et zSWhn@Q8cG)Vr-+O=dDM~(PZRP<-lS+Jpi0Oawp209T0%Ks4aqDZ3W_8VKs5}^W6+I3N@{<=j#bPvWHcgx7+pF__(ULa*PDm>sWJ7G>LxjGfO^D%{K zn38SnASDGXopQgJgexo$bXhBJK~}XnMn&#WVZ&763gMDJ-OFq6QuOxNNGU8Nh!Egs znaC6nnrfHVIO4DykqeP73D`1;t{v>OVoKYS$_?gian+qg-#JN&KM17t@$*db&|9EQ zaTQVU*pc_(hDV2m?dD$X5)U*axITfHP{?(vcN!0AQC?)SG_(krhhYma@Ar^oZI?8X zv!aLlNS{8P%@ulOPOwzsF;bqQso4AsDv4|PV;TbxZAe8is{Ld;`;Z8n5^R!a0Wmu{ zGtd~Og9&nOOcz9!22ban1`4{T(xfx)+b5aU(h(XmLO-TkcG%tr*J<>CPN8Qw2p_6w zHM`}pi(Qa)qKRLDv0Gcegl^(RwQ?7?ZfrMa-T8$5=ft^oi2sB7HS}=&N}PXp79(lr z;Og>U1V_Qu*5SXe2(| z*LG!osGa?Odh2p9YRvX0(9KuUecvst+)&lW{q3hKUf-*?gQpdHAhb&HS^qqYMq`ao zWa309v0IJMI;df0;z1Lv5B2a}=wdQH+hG^5875LaVs_EGR$(Y-hgW|7&2>e>K zCh1uVoUG;4EZ!Y&yp6TCn9v zmOiW+%zp3D3rx?cIhnxib&+z<2|A|@3N~Sr370Ao{bdoATUtGFu&7AAhq2HDKxD>A zvLh@%ir#4IKxZWQq_jq2T~K7C>4T(3Tpi4ra-$%e${PBD^f}?(nb;c{wX!)%BHKi58mvheG|f09;=wLU;XWmzgd8O0W{zmG#e!+a*9{b1)UpVx2VD69=;u~hjdAfPbR}? zm(VHP0%AB+Jfx)Gs}v{>RS1Yik^zrF;(18DijNe&c;NC(`wmMnCl-M}goa`w`~0a) z_taGt1S zeinNt#xAghSymb(*E&Cl1FkAGQ13No9HXsnkYYkDF{Vz$=O>umlR2Xt`A47`&2y>I z+f|03EQ#d#YWURF#Fwy@2%K*IHdKre&L}zj0_6NJaOU_o!2Cb9+y8A(^_LCzUn`!N z87WX^q~RXRmFnN$7DFr;hhGVX`unB85ryoT5!lIPlP{_t*7%-*1QNOG)beH{xMiMY zS$3YLMvgalfr9VxD7odJv1`_l#vRf3g-*3HFx4n3)%rMTy2@~YFLP+m+e(vPR4b~R zAw|0;|&c?pWQ-)!X%`wz=?t)EfX>+7j8ECRy zxm9%}gA_zabs0Rit~@j7>yYF6n>yah7D< za)6z02KYAd`L=t9-g87vmN!aOSQ}&tI2-M7+4v+GspYOe`&nJC(t~dI-mtQGc5|C} zq*EGol*9z`Wk@iHGr|T|tbfpK>56N+H%kb?>I8r>NiTO0wNR$*WfH5D8ig{h;I9o4 zPVY zC2bvS{`$qr((+%G=z}54?ScyiTo6qkJ$&IVwS2S~0PkNY2~4Vm8Wpi|D%)m4Fy#Vx zsCkCnY@LNi!TbRFk$5}lVi5-ip*hKa?BhJ`uJ`ou@_s-GgnEvng2v7_+z9|rWTV@c zEX1Z6r=g)q#&TjTq78%xL@L^`P-W<8GevS1(z*$kkiT(unxe9--O$-_wlR|O0w?W$ zf5ckG&E8@5OwoqyZ{!=f-OQ$b>1VMeXa{>aqR88{JrD|5;G!v6 z=K3YR2?uJK!P}`#i)fS4fq$QLt(m_uLT0~5AiDK2C8JE7>1CSw;y^Ls zw=3Nu+|yLmP2TQLriMNNcU`^M+nbo(MsMpV$m_YbaWs$cZm}-b^_EREmm-+3K`dA) zH+12hXCD?CWXNGUTY+2`&BumL%cEvkUV7#cZcdXe{+J#O-D#lFF^+>xAr^eygb@7I zx_qXDQTXyiy=*(Qe^P~EkonHI2H~b^lfKi#r`VYY+(1l_`1W!Aa8z>F!ZNH8=8Q#< zRXz_ju#mwuS5NFkiXY(|twu5L1^WrFbj7A~vl3qv3vqyM}C*Y6}(`;;$S4f&s zV9}puSBi3;f$Idcv2Tt9wtj}xeHQ$UU1NHHwU&QjQT!Jc@&12c(bsy&t^S@Lz zbuo)XK2_L;(vu6(fOsUIf$Go{rJQbVt-aC0AEMe04nE&^kzQ_zbgkTr42>VBVkJE9 z#d5-G6z^mTdtp*hQ-l$6$D57dkAROA$MlD4E_-IYXIDDG+}o$V95ybktsaFGDK}n< z#2nR%?(G?2^c+bm$o8#bFM-f>kcv+-iNHIL&6PnRB;^D!4!U&SU(-|h!=6V;19J^MQmbGP-P&rbLo7_@@utCxSkLGkrAuBB+XIBQ3^>-|-{f~Xv?`@2J#aB=GK5i>7bFqm zD(F6~>KB?*^1n2T)jLG(jPD`uJarINUSXC-1T* z*p3MQCO%h5nyNtk0xH+9_d@volN69LbTedT{nyo8`5$c;5`P94J3B=YXYQfaI$B9f zkyUUx#H~^|8X7~s0)fXmPlZcF7cRHlsd=Atna3{ZGu2>a!gl_5TDmn>XTIaftJ{~A zYr=294s_lQjw=KFn@=}D$^-;P>t?JBQVeF;5ZN?U^X71WayzGXZBpA!u*#|F^;-_` z(>gJEk%>v!QNt~?$;Ov;XC>WLBMhs|;vq0)k*}l((z!U=hYtPWJjvG6dxLt=UX46W z1Gk}dYh34Gs8=}vF@5^v(cF!>QnoQB9=xi^KgiR!l(0X9MC+BV660p!KRB54Y?>^- z3q+p76-kdNw=BN8Jslr2dFadBX`T){Co!ST%$PcaiB89&7UWFR8PUpy8m(nO=Ghd7 z1KK@AekWT}<~7;?#=4j3G_eWQnNCP<6o)e-JPBbnTY3LN;z5K(I35+l41EwB6)dZd5;O zJ^E0Hg*Z(R#2_ zx2l&Hnm-EOWPi!zHQOFeINE9LK98%0KmQrE0-iRPklhxyklzQ=bWnpwX#Wa97rWM= zS8>bwp383=j>tHhVJxxJY11_>J0kf^61#njsWhU+ylTmId-HYokG~~b{haco;8(Jd ze^teQXI}C@RZ(7<(~pKolIVG6&HJ z_|nXqQKV(0k%wGYWw+fhmgp?ZCdQ-8B7~CSFQ$Mgm!;q76!y;6@~O!iR&8=4X#9q0 z9M?Q550fyeZ40Fc_ey3Vf)%aseN5U((H>j2moV4#J56QrrR^9k?yZ!n0(4d%*%z^^ zpH0oy!99mq`vs}3penUMLr)SfAy{*L-7QCai1*�#YS^bmj%kqtBHl@EjEsSzaQt$=AEd z97bactXITu*3t`p>B7@q4?@pXCLpOPM?Un@ce$or&o;>dTIwUFcG?Cn{WLgNY? zb_C+%7bScCh!5-I$``9OdO=$>@zMx-!7Zf(D}Ir41k|$}65|xCZ4$4p82BdV6R0eN z5(P%EX=CL&K!^P#59ijQKwu%Pq^_QM;0&8h)qjWP&(J<4eK_RpzeZUnCK07CBG307 zJfo&x5$}vC^WrE1&#gOC-3Je!RUm0GHS&wh@DLKn24~=acr(WIBy$YrE7c5l3kg_b z*P*0@P29;s!{owOVCrH)WW_z&~)OB(Sn^Rh@?*9Gkm+ppWi z&Ac9)NK?l^Qnj}<6 z#^q*yG z)XSYzySNZ~EH_SIJAqggCZNwmb43&ZPA$%5>w~yFfi5|&UX6q$$>(L=5YV(d3{Ab)CrVvSFmZyL2VMV+cv?)gKfW*LCeeAxQM4_M z*H}YMW7BS=Y+fDByXAe4OFH!@2;Q)lAS%1O$mQZyWeH@Fa28c4bfvOA<_~$}(NjNp z(J6)yr%c(rFu6F#BH&JSM&w%SmW{4p@}>z9N>X06;ZDn^6_jsezn~Z=aO#w!{gM(l zQ7;zjZrokeWA~TTo_>a1s9uIkD$&33!k`D+1%oH(tnRh3y?z+k*W@h3X8qn2*3k}J zvY9ZmZ6P;ChvASW=TKGek|(zb^rxJ&CX>$M%AP9SWD9GF!kU-}6VqkmA@Ok{abL|2 zozkuz$!PO7i?^PovFD|xBEugH9H(oE!P^sBcfIQ@oBSGNbYLf3nmo4aFiXxild8Kc zxFKErSyB7rWXM_vVU2Fr;jfeGfpp2U&2-D(N$qniQ#s%ToMEATUQjg|*z9w>d`U5V zK##hEIp%E66kV5@ISgdEFGTbR2?B6^n;nd~X^tk$@PPa_cdLy0Z9o+DdcVuDPT6?~ zrc~c#|JZ1i@h1CXyF@gC!-l9i2pKgcsL9N$RW@=TG}x0BGdhgf$6`OF)n=d6$7WyM z=!g=;FDgPt=so{cGBQb4<#b!ze38rW`W}JU%7-v4~_< zY5oon%cqw%kE_@l4ZQVLnM4;j>kV}su@h+gytUTba8B+K;LfP1_2c+NtD4H=LAHl6 zKpaFN^Q|EXUQWwsU}ITMj1l{QG;cmH`egr$7MP6-;+Y?AjwDu^pG@rK_*<`+E=(|m zoU5xYPlB(rjZ7(HgZNvNlP0F~%~1VB;-0f-a?K+IXD9H*OeJ<)#^$eNW^97dr+yP# zC*Ug=i?vBJ8!W14RA(>33pY-{fVsSSwPme2Sc1AQOTBMvVdvCF#gmtVlO}mC6za8gsWoC1#63ufGQ9m}pO<0qG^@kNrS5HI zy_nDg0(S_Tq81Qft+>?HQpNaXL2V%#QRe~7Di>Bd?KWUZdDj{@U0^&4M0!(0!k}FBVzkBj^FBVuC;u&GRE5p3$Bn>+E3e+wTyMN zm)Ssk+h2Z%Dm9ksqt?om)?_H?tE(|~sM!?1P?h@#H&O%meljMJQY{MEF9+Y5=UETT z((I&Rj6(WU-Gj74S5d6j20x+SNkDIwZ;D21M&1RNB3HEsjW!pfl&ebN2DVwlHMre! zW#~;~3(87qyMbRb;)+%Y(V!tlk&Mf75fBXN1haC{c4VLlh|v{|G@W#!9E~)!3WS4) zqjJeD3K6O{6bAA1{SXYbm&0}xR%q$;pE7QBU4g#qFGcAjTOYBu+qX#W)i5s?Vt?^EkgrX!_pCo-0jl?0RLza> zuZmG)LWFx4ILpq#Z7+BZeF(2VtJepCn|&dJz5$>QXoM<=l9?zH% zxAu4@UGUWSAu8|$>i4%nT9E@Z{*+5JSJ(Z@XL@{9>o<{BBgjplGv!+za+d?lu0SJ6 z5vXTOPvSQLJkbefWO{|_luH#lJN*-W*eRqA`R<9WJ|I zzJ5XYKB<0g^Y($FKcc&(J!^V5B6|sf7KJwV?{OMm4aJNZ`x`yb59+|%rS2Cb?OeUM zCZAp6j0vwy5+x|;LAT2FSJDu>atnb%V1sVP)yDDop;f zSl{3`B(b-yI5y}PzwKYoGLp{?)=+#<9b{dS{$y9Xp$;A5gU-33FFt0?4J_NSlMsd z6*O5{?-2oTx4=IQ-#=lCLC}8Yy*zCpI9Yrv8u#{_oN8vYy=S+7)ICkFDWsQ5%eHnd zvFpCok#5u?Lu$rh2OQR&K+|U$yLueEVm+X)yb@)-z)Ip~@zhAmIuA-}j-4>_CR@D3 zuNrF*|Cq7$PF7$7{3<2YQC5L~(_v-`Q3Vt+!>B&917a<)U54%;2n@G+jnPilb;{!o ze(6f&pHk9iKo<7tI7c`NXs%={!j4Rq#KZT>>0@08@&k%ozfE z9bJ*hN)w&0311Af;EREJfm!kK7v^q*{SNL`IUbXXYZ3Je9k$?bhj}E|$f2l!oI@kg z7=)WT@}|-eB{2vy!dM9n3`bl>TcPw)CSf~L|M7k1NUa^p_XBXV5#$ywp(t$?W`S8} zr8MD+d~KAUE^7sBQR)@wA?Pk8>|ee`c0_WO8^o3ku8QXMHb8Ty(d$|+I2E6W4`asZ z7(tUp`N>gbH3(D>=YHCQX;I|&H%ZQ$b0Kc{R}cRFMMM9cqD02tT;A2?e|A=XDN0m! z{-MSFu&W;v(tshOv+_??qbIf~ct@^Cv=Yh_1Eo@Eba|^Ql$MaJPn&|!+EH1=J}xj|{@jx<$OvznO#lguU&^AeW4D^ckJvKHk31y7oEVet*B#_X9;5QGznm zK_Cv0L{}z$c5KUvqjmCBWU%zyC2zZ}*I~IkX>2t61;EWnTBe=%Qq^*%IZ~yAaw#;& zm>-+ezCSIJ1dhWv$*h$^AEDxo5X-ZA88cAs|eU%=qXZnLb! zz3oJo-*THQw8d>PuaIjyo8)b_L>mE19M|fWc_#P&-lxL}JK3Gec$g&(@^LasA}^!C zDdS%)(`_=X5;0NSWk83C1#Mngsi?tr(fQDoyI*-k3qp!LF+CJjAE(QHpjn|ocHinb zF*(etc109yp|uQcv+5ZF)oqjP^NW!jDZMj^eL^n#l&1P_Rw_?R^YBNrfht)==BZ3Z zQg|FItLr0~Y}w+;ZUAJ1>_UAnQ30Y z<)l}h+XfxZVnJfThv~+6y~en5%fNjR3y4=EgIgcf;l52YwQ;o{xI6FLwXT1+u#?Vm zo@a%X`BYiwV&l_Kvl7#*v+O#9lJKM~-pJ-`e5&p< zRvz#*)>tFt@GB-Zc#{5mpWG7jo94F$T=j%vBFeG~NpUIRXD z>j*yeJCMG$VaK!``{*!!A8PQ(Oji3AqKtLaGZ^ZH1%dW-VPJ#Vy;^glf8KY*kcbav z^nnj%{LZV8(d!H4;Oj3bAFGmCMJCC9h;dp0>M2^t{)>bB*Jdl_#MU0Au)y>EyZZ=a zyYSPj!0eVMA%9&C@*BjS2E6UYNiOC|O&79A`s$!Jj$zg6nkb4CRQ{K-8Fn|Q7>+XME+Is z8eGii_bEZyrGCa$;M1YD%Pud%R& zH!v_{x zUAmy++GGy?+M}?h94}yZMO~+A7TR2o55wbjgf$|qvL&CdF4rBBgKbpM3vQ;aX?B}v zDB6QmF20IH9i3(2Lpebr0Dbe{V}@g8Vlw=h^LFBJB~`yXZU!)9Tlenv?smRvJI;2# z#WO38ttq_GxXU3IX zJM3ik{wXm~Y`B(gSkfdUY96{6Sv(dgSe;ikH#iFoXl@?~^C02RwyKSx6q9Ge$c!Wx z+dqKY!y$-)=j;u=(RNP^m6sce9>R^LTK0u!r{|5&B@ia zDi{L;%?Xtym@3>yh06={B(>ie+TE#RokGImaBi%5tn199q#087@>JqgofYMotW=Y* zKJ4sm8vDtg(t_nRJb7oMLTkCk&7aO5Au6S$qCeX(XA&Mie7}rbmCBfDe6s3jtmZDK zjK<0?R54cI?YWQ( z%B`IO;z=tx{N!cw>oWtn%;@3Rv`a7h&7fI3f;5^$j<28vFZFz>@3*!Rck2n10~HV$c@w=G^~d~PkD zeD9tmdzh7FJFJT(dni9rcvbpV$+HnVzhqMBC{mB(0Yr9N@)I0engnBK_Hy4D(pSXJ zSF`Kv$0yRCoq36Vi@e+!t6&Y!W~D`V-tO2X>E?u!=_48Z>dDCyQ-CdLv17%S_b}73 z_wk8+Mi=+ia)VoqTY)BC4NPv z2S^&NKC833a(`u9l&s|L*vvLbOr`2JyI+-Mow9p?MihMAXv5wJ?*SF|qWl%x27*}t zKId1vX>$9pPM_6aqi7zdxs^?&44-7%j`Q+SB7v~TuX^D_e5Rw7ZxdajX77>`Fp9i^ z$9nwxuGZ`{ihUC=hP^h0Ac>0K{h;LBkW>d&l{M-S{okiGLB)ZT_}Yt&6HYzvZK z2&{9zd#gk2O)Tsy^v-ENaX+Mv28qvX@IX)*xa1Xv=tZRa%CPWsDN+Ojcs&+HV~&`Z zu|gNrWB7qlP`4qDAOM&pJb_GIk}JTSTdQ5v3gHo1{G@dps{?F@Q_VLh^AB|j{|LVv z6n!hEG5f1*G+;IS69uF{y{+<^^r{t-^Q3PIiF2@=tuO(4)&3w%X#jPZ8R=5Iwr<-F{(z26m(+APDh z4l2uLzx$Pr!>w2mmq76Nt9QW9GV0xB>O+9hyVz^Br*Zh>Bb}c=UDf-OxZa*P!S|!@ zrx*I=yE-yS+j{cRT%wF5Blr@;+~ zx29?#K+8%kM?FbF7~e`QMP=x^)H@}Q>KwmrtL&N_^PE5xnj;e|BkQ38#=ex3t-@5* z(sA*12nRp9b%^_b+=bV-C6vQ(tu3I1jsxyiS~ZO8B2~FBI?#1od+hUmm12-V+(qru zO=M(hL&9hJ@W@d$4xe))SPf&Z>!%y>6I(Ehtg03+ucfUTp;}TipuI}7>o*HWc4wq4 zC8JTpd`Cb_#e;hDtU0(gqtV9syE@TR0`(s(ICvy1jbS(7lTG4lEwLP+PSV!U>F8M! zyVF<+@6_*pfNuxKt#`2J%~#C(jRay&A4nA*ViKwn9Nqv&#(42}Y|hN^gh2OHtK} z99xe2bovAHpCt!yNyZc-%@dI)B~tiI_UOIN5vtx8O}TiuvoQI5d%CO6EBW z!vb>&oF|}W5~zTHtgZGxgJ1{ac5r8NbbLQUP&kp0-iG*6u|GP$&0qrgD+Y1($L>zh zk;){vQsYv~-DO5p&4pKGm3RwTw9dn$f@t&My^-l6?`L)63{C9+s+3&OudRyeZb)mY zfePbji^VL9rc11*@of&UuN?f5!}Jklk3e3*Lx#lHcnoQW4!pa1jz!`Gop-%Bu=_WW zA4yXKyYCmjxIp^%BENqq`~JldLz0@dGp;$dpIS1#rXFvdDXrrekv)2^rVV-80^A*;`K^Pv`Eyg*RrD0#P%gvC+M~nQ&=P@u}Cp#uN84 z;WXPu$6_(}z%_l<7+~sY#1sP1g}5VUL=^;8?Jl6M#AMZuOPGZW&*fbaN;0US_V~RW$xwmG~f!R9``0WG57<6L<#b`NO zm9AU8M(Kpk%3qUbZ$<1YkVR7{y_V?w7z|XhR^V)$m>4pvQDecMv0Q!RJFd$g*$63tt?WNPOHdjywk$$tv#9v zndkABw5K;CJcXE?6_lLDeK9~*`A@uOqgo~_E#khBa0)f{OJj6eW3>uDaCmK0 zdRLJ65P!gaA)24+jQiDs@p#12#rpJ~Y^>%4Qp@>+R2I z&CJ=`R=Aqc#{{k-W6ELI%)wKn?y>{z)gt2cLVmVLKC3lHXIH|W*aCIOu!tyhcP?5z z)vMqyLztR<-Y*LnZ!J8@u`|-=(&+2)M{gtZ*C}o3ktb1_=I#i@#px_mf%Ub?Jm+97 zc1nUZZq{mzc~_cl-s%HL57`k!N6nG**2!dV{UCNn$#gl()z0o-9Dw$1Vh&mnnf<7P z=t#_svDriNAC*SAO%X$3>&javGrPXY+7U7BGI^)cx<6VZT(+m?(Z-b`2cD33HnAUO zhyg+QUit(4Rh27W48V0Zv%-|{I2^5!xgE|CLncS(5(x>rcfW0e1@MQf~o~ z>5MY@>MSKt{k$i<$NyT~omqZ3A|FTFp{ItHl%v5AU!J>n;uv9=q?H@%5zz4TjC)!SSXR+{qSwDV2INI*b(1^kY1W zXgrND_~oSa1nU$oQL~uakS~fgrIYdD?g62DxL7HtIPKeFi%cd{Qs>eqdV{qch|6;Y z2>D|?9P~mtSLggZ94`nj)hKs*9J>rWyIiKVsl5v>XV^GDlB?eF$g@i(ClbB<5jrJ~ z^^9)yZk0Zn@V($du&3=Xo}n_n2c+Hvr1mCm$SmjuVlENHHj3C2ktk=;JK%#(+x4!w z@^;u=;iPTIJ@wkFhvrlh_=!W@-~b%bK5uFk@@Tuo;~ofx=2REfYeGrV^vUcd{bQEu zh8)SxxayZ?laX{q9L8^{&O8dEAvX{HPiJ2N6<3yaOOOP2cXxMpcXxM(U?FI5C%8j! z39i9|LvVt-OM<%udDS!BLw8Ll)Bn40S5d4wd!Ku*)RFJo+kUrkk?+Xuz1HC?(>Qex zm|&GF9`xJu27jJ0T9aZ29lS-YFa*bsB>a47reqoLkz5ZFR^A_v>34UiYk4}jVNGJd z&k0c&2O>w;I4$De_ZuJTZ@;;Ks|;3P66(;A9b1$gQz(8=DcrT_xq(pfiNFCI=UI35D&bT@x9fxEgTUm5f#o?t-JJ&c zy@NZ7Z&AJP$0-5}j043$#_ojUQ}x=F?{SMvFO1-Y^(kF7j<}$|ds5&^)!2F#ArmY8)yWCJVurZ3Y~~UeewWj6Pjf z8zx`FHZOgmEv4#}7P@_~f#R!zPfJ6RYcaEY#BUl8@#k~Y~eH!*rG|X*=ytGeb_gzq~C-3bmVD* z$6~)vWc72W$R&(Cw=G^7w2*G|DN!Shq(TyQU}o(SN$n+;A|*-@_Pj{x;Z$gF?Xm#XgJ-)BGVRif zSY!Efb;;SsQL=hI8;_Y#THdBMd55v+#+*S{(k#-M!@E=Mc#qesrh zMP~ydSnvxcicO}wiAR|(o^>e)D@CSdd(lS_pD9o*U5kPT1YHSN!@cVFl9 z*d^lIJbr~TvCrY}KxK#N+8EO!>lAPB5&zyxYyovHhW;Q|Cu5;>3pD){r*wz01X%1@ z1$Z?4DhT&i7uCNfrpnc|G*B!seS%44A@gWK(djUglQ5GSry-{NL;aCe6}2tP;lCun zlCyBKDAoNi#;_^X|1Oq1nbjTDR#lW+U#{7-@5=B)XMum!6cc>{Mu98D!F%=k?aE>L z{p}cF${)EAzw;%j*@c*5pefYMW+-NK_<9QFof)hsV&5sGyrCj&W$5}eGOQ72)s%6Xt<4okiEX*}XWkT}7NWoMl zx_w$$Nw7M?(@I0KRt;?iwRl6V*;;%}r)A&;{fw-oETsz#;w5pX{t22ISJ5TAQ=%&q zwP8YZ+bQZeBl$3QS@oM(GAfhE@YiWGmcn=%Dp+)}%+6esRVWLANz$;UXYvcY4le0C zslBM|w7p@3L~NNemTK5ZggS4#$D@>>dRtsY-dssT_OQcCL%O9|$q8#!+FN?xE`^%o zX-L$ht=Sb$9b{X7Gd{+9nHeenp+NveL7AGQ;FdVBx-R3bypFqOJ_?OCq^>%fI0|2I zo|d}L(!^Ii6e_!=3AsEu_igIQe(U8U#1*$W7`h254+6rnz_dBu2>d4Y*L0rW;;M|H zpn}UlNQ{~&<^*7H>MkSFBEELVGMU%m)udVgVr0i6_9kLP=M&Gr=L`+(vdUbxhQX%1 zr76H07t5dJr;DTO3iOwoqs{Sp{g!Gjw9#LjmC8~)qU+H*cKrOaT2hCr=@wc>_ge@a z#vDTm`hmvcHM&;1oc76Ki%F$!m)xKZF*^j3G@{VRH>j-<*Ql-U5m3ECN1*w;`lmcS z+R+Xqk~{M5$-HvcRJ;n;oS6<#Es{@zB544#y7&+V>mLKd`{PR1(n9CM$-a^p?L&#s z=0;*%*SFGdy3ljmrM=6ugROh!_?MQlBbVXRB#CbvYjpE%@la8v(RUZh2UnQeiuW+EvK+}Aj8troo+o{w)^Jg#@ zua7Tevw5#B4QJPNI-)^05YZoSddknJIfStE(q~n_BLXs4xfSl789i*bGxJv1afJdO zYSc(_Lv6h=s3jiK5uz+?H3;Ac8s zwZIB8Q$CNXC=TgPT>UOL4U2x>;%v`P{EsYK>BSVh({lgziV zkhg=Lr!_@hVPAztM^xeA$q2%%pxHQxSk7pAD_%p7y>+&m94>D!Ox>}f{$eQ@8P1fX zWUF+=aDD|%eFLkpN!`{i9=1;(i#>=mOhT-F82N7P^H`BfB6E&d0%W_j!!jJljq^P~ zPDIhB%BqlEGnsH?kjN>YTV=$lX2QjNpLb|&i1Yu4|Fb!D>><|9jP#jfB5gt$o)rFOBp(mth zZQ#OY!9A)14nrWl-G22F{j4>_|6D~0s*1^RY&Asnh1YR8BA1PbU;N|*q~URKWnd8~W}BkYuI|sF%~mZd8A>YfZ&UomT>c6h0yAFA18rh;F zRAci+UFH+!D)S({XQs-**Nl2w=W&|t;j_?Kny+7zT+hT`Pf_X^8?d}w^5+~cEK|vn z#a0n-HzYroFX@S=7{OxsP?p4hkXSg(JXUoWc47*iU9J#EjC^l4wzEKXscfb!nA|DW zorU_2)-z5K^}JdL7H)WJglg95V5M1)oVMYI^9p#sOYR2^UDiXXPuYalYF{tIs%R{7 z<#CeI-3DD|YH6sW9R&{Dw_8&idbaE7+cU~@^Mc_dEkkoex~r!H> zSO;GjKQYfc+2qJEdZj;pl62y5FA%RW{*{s?fyZt~Prks2dt=@$QE?x;FY+*LyM{w7 zFe19n7>YS21hw_ia5n6b&dWoAP7J=eXeeojoVuGiPFLvG1J(BNlZtzVn(Psa^U9Wz zb-sslXO#llh*;=Fh3{7zsmIV@q{Y|eVYS}9#6mD>j#YN|Nr)`MdxAXb%D!nIXb99N zM5q-VP;6u30%Q1@g^o6rgHuHO9leuUtnR=PN-uR3FM4pjJg#x?J#0XnA@^){5nHJu zY_}FVO$mDg^+l^tTdY|CcYqWgs=K0)b#~zPWV(RI6Owb-VD7I+G?~;w`A+D|(mJ7o9 zQq5SKT#%bky(cWI*BEC0c8MIn5vpAI>P%o4#EyhB4ELH#R&u^G2Mz0ZgLkFqiJ89} zZJ}~ahAQZZ+YE_}${_~*6V^3|z&g=2!f9>7EECPcw2>akHr=8pcIVYDT=)38GbIAebPeytwD}G1&H8-1 zZWOS5qmX8?JOiqoBilyicp}?|=8iFcysH*qyprg9^nXJZMlM+jM(WDp5z02Qtp136 zT1!!Em*-Y})TVg7LIxE?*L63PPe)sB}i-`;LgMY6bG^>9};RnILbe*gvQr|n$eZhPK816tKM?>2IPHSTgiT>#QrslP~2TfkPJQnAhyStSj zF1#ueq5NoYdzC`qN@!q>c^mY`%0)Do30-_>&_}PBP6;BcKgd(XhH5fa` zaSgPzwYB8!$n;4!biVYQ2^+tSBFb3WbZD}F%~M|FHCs1ns)O;yc5Judb0;ADHV>w~ zHZ1k>ZSZ%gN%jY-U_oEgfE?zdgBUAHs|91O^H2B`mcvjuy+_M*GhsRXqjE~cTCZ!jrV?xy+lMHYouB9>^fm6 zR(_Smz}%DSxXcnRCt*-faWjR}$s+n%1&b{pE-_9F&yH$RX}-0P8INSAHi&Y`y=})S zKvH?K%K$m6f0C5-T4E6H4c&ZMv%Gra)v*Re4X^YB<+q1K{VH0~)&KjoCBY5+He#orgQEOr!M9Qr zohDNmNoOuZlKY6;IO2HX#equx?BZB`6H!$D9GU&&+5-Xd)DXAJa@46v*v%MXtZjkf z{H{i9x;QiPif;n%5b_OorL{?uvufybs;Zyc3QZBA>>hWvY7woyl-qFHudtB+=U3K&RA!yAtjEJCtlv{ehqoD#M6l3&AAzIy~xxUpcs4({A&FGbl@D3*tMAU6&@@jQ-r z$SBfKOhmm~&#wb+k~x#>g@dh=O2;R~`9#nMuE{u?%LhEGRTj6wDcEglh`d&-xkBzw ziTp*TGvM^Q)NV|6s!_sHg)oT^58-MuLtt8xvv{=`qd3z)w(7OGQK_dbKzEIsDEd@3 z_dMKc_J^CT6PxuMWxh4ln3e0hQL5TCS>QwJ?nlpZC&87btT@_EQfI|=GSKy#Gd=dA z&( z(C0|q;Iy3V7F+RcGPboqX~ijQ+QUw)8^?Y!NtP{xCB$2S3Ii|CUBd8W&bzlb(K6Ra zO#=Qco{i@0Nl-MyX<{%O-nFAaKY0WAXx3L~JOdM%elS;p!#*B^)y4RRXggljt=MRX zlk(`}6U`7mJUoIm5kHwH8$0lq&7N|OcxWYR#XO&e%&yuk>Kmtp-b~@dMF&*J)8$(? zkfhk4ur3A=)xe*lfZ=?fhPEWjYamC!y|!7{8K%2t^uo+{)&mv$R`$^hT6xa4T)v}N zy`Y{ZCh}ny{`w-dy3Yj0p$U#VF{!X6Dev&2#ut>OdWGAQt;qj$dYB+Tf+ynK%P?0_ zfFN*z=PT2-63RW;0qtNg?Jm>K-Di5r`n-Uy8o zUUw)5dL)OgU7?L$rAEqSKTc-~Ozt559lTC84zD^i|1YEQ*G!!d(*F0vk%>`3zi5nq131PBt_ptidt~wj z1LI|7@X#(<<_S9HFzb3{7xMYrjtKRvk`!MxT#{ zp5EoED;()F+2}9je?4jM4;RV;pHugO<{NPw_(H!A^&a&xx3@Alo^f79L;4AcL+ch+ z?E5FE%(XG-`$)+R4cOfeCd5K!8;V#CR6q2xWE;V_{Jw+w=P&Z|2@4STE4726xDRtf z-=t`ohng)dgK&_zmTR*#?!fnpM5veJdu@n6peBFmK3Xe0RU!nIpnQCbPZs9T4JqiG8yZ|etKR*pL>>O1!uzW^+mX}B5pkUIGW85OVNYiPnL#yEk*ug2S&Xpu@ zAPa)hm(#bpc2=sc>ERTutLxBzl%TPxNh43M#nZ*@D~uOYo6?v=hE$la-C#74m{&)Y?MkM|b(YoBh(#M7=!W*Jho?qUj>G+Dd?h0;c&Y zwBMQeP#xZgOM~UNGWpbcy!2UAv#!i?xl9~4b_dG^Qo^)0WJbT18CEs{ZQj@x9&k_^ zxJgHK823_}2FRPVa#XZYOE%dyKA!PBi{`qlI{L$^IBk!JBqmb5xeKm`U^+yHdS>s- zh3uq*+5PyL4v_NF*^moU?-{1A5Vai6R+CquhjE$n_=`-q%$kKAgWq+QhmRYv7wS6E z7H#Z}wBipBr&*@HttR((?(TsFs4(sC&6iW)olzFDXR8Psjvk`Dje8I!E+{IYnUBLJ z_M+>N9J+{&_54v6NjH&dohCR?rQtKvXJlUw_h6fx zCB4bd{G5HG&1VOT8J!iDn#2+$m;Jq=iKM{y3nwa88Z(yN=V4s5-II#&Ye(_UO4WPp zW0Zn#mc;``vb}G4vo}Eb6`7)0E-b>rSKrl>qXQgd=sz|F*6Hf0pAzvSYbs7n#>ww{ zYkLs;#An!B&J2^uml?3ASn-*kv&)kjQ_&33qdCWSMPr!{o4*Q0a~2-o{?2o#tCBIu zftIA#tT=0%b%3(1vH-dmBzIuSf{8mNXRf)7m-uzW996OgB;7r#vbmt}EvR?0N>X8x zDQfC`%_XOdiAd>WR$i+*I$9&gZ3jyJMuWnXR+P1!aWuXeCMHR z-ca&|mlnw;p2-#kvnbJL9q@aCxh0_5vxAMB_#{(9tyHkFrUNQ*@9(ShdCDERlpIwI z42?$uakI_^TrC5cB-HUEo{$!+BYvmRa2d2X7*}9}vd=}|_D4hbb&l7C>hy#3f|uD$ zx@eDx+ubQ@Xzh__xJTUYv7&O6qzuHg)Hp-Jm2N~$im6@Dw!=OmdM|Q^_c6el*b_6y zCzM7ylg0@&zrn3-hFK9c$H2_p!V=jo@IU=pFG8ZCb)3~lZMOsPWN`P6y}7sDSQ!##7^xX*)>^+v1Zb;DBz=Oe@u#kGfI#o5us~&4!l9^4diQw+8j`Oar2xEfi z@CSD--l*9gXLr5UcN{%RxXzRNASeget#wXZ@%towhO|6be@vlh=L8MyQRJ@I3tz@ zRO)q1D}r6M&6G*JN<0y@Ma~^&=<|hrCqqjMa?Y{O?>u?uxIH!}MK?f?(C%+~>DTxX z=uKWcg`a3h2iy=LuplC}6Mb~VmbnRzq3=J(KysPYtY~N=!!@^hgW`igW_`*jbp2Jd zodTM?f|SmN1i7-<7r|iI$f!5^-pgKldxu=jKJbO^k@^w+ORmaqXx4G;q|jkAJ9>Nq zKBuHRBLaSkdgZbU%{TXEPW&5Ysk(XlX1y{;L`NMGkppO|Yj0AbR%^%Z{cc@@ZZG@O z<%7S>i{x)RB!kBd6E@N;yK)S?oE!>ux71z@j5j9VCViqxy2_nd7}&r~!nL3XQ*~w< z4q^yNo0-6wUCz7dQS!o!)n=f(zE$R$id&C|T3tHl9<%DvLu#TXkjUk!ae=)|{=TIz z*nB{r{{f;wg|afri;6)}iz0Dr{v*X)_&e5<5YiKjzWd5X9N*2#-p{pqzFk>wqu?I{ z!mbtiPPv!wF;E^=TEl%=I371a(S}+gd^n_iG7SBs+_h7nT3}8Nj5@bTX2rC{+3?@Q z5)qz)!cVxr$PIUYf!N#6zU}R)ZNHR~fOFba4hlw}d<&FzK7X?>9tp_#sRi_JekE=Q zEFZh7@|!IRJvh4-dM~B+gmhIlk*2b3d3m<~J7TzO;T%ny7SdVML-XXLm7C3{lY&h7 zRooAmC5l6`i@T3F-ro$Aek_k56RYi;?i?KP?fR@Xt#a+|jQRRJzzO0H_9*ExI!=hf z^r>+AL)p<|rN|l&it-d*UYi}Z=Z-|OYw$2ejMY(LrtEj<594S`Zlr~IH&%?m*`c%D z#D$Gjm#wP9dKn?xPIt(G8DKY(#hlFwV=cuCQO3|O)gRB_ra3L$*U(Z6V4^W5s3iKx zL4|7h1PvM(B$N3pqgoO;^GfI;N}5`{O1@3GkWn^t=sex>DsLtaAoCna#GYqZII6+p zyyMZAEe;o%*@O_F+&y${(Tu&#H7LK+Pf12FW%_JfYFx0DoGP|JpP2MLjJ5{~CS$PO zZNFkpDN`@v4C3XgM}*)T!qP{+TY{AfJPOM)^oV-F{fV?`T>o9}Dbme4jncsm_2^@y zDmqoS>_k<#YQ068-DGONIvH3=%eP@@Q@nn%Dm`inUkHoKX|&RO6chHD3`=)cDQrhb zlHWD$&HCrI9$32ae456Yp+vu9A|9`A>F{`nHFtDCxDo^b$;%l!uUGa6OoWaHBOcl}f;I`a zpWVEu-UrpUpvG-4X*DaIw>EayYPhPnSfo=o6@&KENWfXuloaWe^e&^RN<{f{@5|ln zaE=-)&ya8`h13RA+I1djaC6q8@noC_*kv(VTXwm*pZQtG5X_0&n`6x7xxsaJ>{HY- zP2D*LjD*b3*j-Fp7YLUW+J>)N899i{*z)a;b_1ekOUNS-M94}(f27EDw7Rm4a8>M2 zDfHUVzFu`hy>rLF59(;K+|C@tT8qk1AlDh@u++)~<;$vb+gOYTwqIsGpEx5TwNNg-{~MGuNIo!3(df^# zZLhFoZY&`t(&a-qUardbO35;cOB6T>kTBJ~a1QB;#62bnTPJT+1)~>Rbp%g#=+Fya zAI7XOG2>W)yw0@mV!?4Yk9;HeUOrMI{Pd1(PQe zhe_O=imEMlSKapsCUXLQD?+{HUFE+`~}R>!H(YD&UOTQ(P@$WYT3Z=($+l9R#aQwoMY2$ z{xxosn$0|xjD6bt{1-t|(N6Lg=pbY?JhzqJs|1T+@A4(X6SjJ+HhD$C;YT5M!@=AI zmMECC5s9cQRtc^$^STM{!HyZ)R$d72`M(U5LMHBwO+#@>+W>jQIZxF#78>Uo(+owU z6=@}5$YO?)G#gQCc`|LM*CFQbphJkJ^Iu0&2Ke~yOOQG)k=0OOWmob>)#zQnIC77L8e`zJpMJ^Hj&uPjy!3PgFoJP-xHF-(T~vq=BQ4Znbb zcbVoB&ZN#GHmquJuHiA#6ldew%1BSC#b2Zai{ zYjpObTlWQ&KBBr>=VEE>kFQ*yMKv)L*KtYX+ImA6FOP2aijN=Jn=!k)z^^IerPE)P z#a)P|b;96dW?c~mHxmvEI-H($PlS-{>Ia9kR}(ToL@{q;>;$$-p3ve2^V3q#1Wb@u zk!0x%m*-R~x&(tk1aPU28DA_7PGR%EXZLv`$kMrQh-_4oZw(9~9mN~vh|TMz?VdtuXN(w7PSv9gQnZ>tNXm@JI-Pc=(3wyO8j*NKEYz`GbP8>i zv4(u|85AdQ4Wa?{9h(Sl8dO$F3%wxL8-(o=_$j;wUwG7B10*l=vLw!Td0_Jkh1dv?xJWEUN(u9#?t0Q(3)%rO-6)P^?^eE^8Pc$rA`$+PMh z);{a43*&blB1DQP21rm|bE`I7%Z1sAu}%_(9O$IMLAmW>w}t_@a1SMf(4iBBRefOk z`%)K4FjaLQRT31lrH1z;Y)7UoXPs>VT;0V`&X8(ao<8y47~iU)I0a1G9ne&VqpP|> zF-}Y(dcH=Ny8Qgq_nxjNZ-9^lo}T-COCY8S@(4I7)rHB68#-yB!by3k0aO_XG#HO4 zfj-mAB1lCn%8UYKP4(ph<|XnGvbKn7Q2}Af4j3vfoAAx1a!j{%Z@D=-dBX4xghazD zO?L@RaNJB3B1V<1*qBFI!dc5P=teKrd=hNuFrP4}>82+o#rB|#FB1wGkiF~ya~8yH z`JB-cI&rcu4)yOU;m~#{0`leKg`|q%@W|!2{4=-aQGC=@iU_Ha>62=SJzErCyi;2o zE_Wndt}UH_3|~dyuJzgL{=8q?Zj_TfzVX%K@M4>Ud0f1-Uf&W?SFuJH9HBs+igGaX zN;bFxQErpg->E6bj7OV*6@_j(yFAXB7tbtMONWZqmWYl;$lTHY`+Vd>cyR31O>P4S7jrd}AzweVE8DSHlk6D_?~A-R>B)McL5Y8g!F zMR4fV{>6e^;tH_`I>mNWKb@*|d8$dYmF6n@zRN>4@H)+(!m!5IF zy$*Pv9MP9yju=zztN=p-BbqSvYQ!?^DwM{}hPv+8TQvQoa! z$B67Kdg(xW<|EmoJ6r;!;+NGm5ABB0TB0r@DtT3U30`Fnv`_t-ZlhfU_Va~5oP_3= z0|mhYvo^`BcE%Q@k}U*vLQ9lq7=afTjh_qp8v*7#tKmTr7FH z%QP;9x2M=|S254CerAA7da-rNHJTrPqSIbPH$n+hq($mEQ;csa>%Ds;6D2hQ5$g=! z`CWOnO0csQ|68$<1xtAnZ@190)#p#>t%_Te#4aUZFRY-y5$12i>x5^CT$;Zep3zIE zA>fnb5RS9I+fUE12FTb@3_U@za8T}yQoIs(F+U14_OP%|1{HFdgKp&a05uUC|9UN^ zVr)+;Sl_FM@ImM`NQfH1ttL*LEg#Lxt}s;4z*#WG?h6v#x?5Bw-GRE8coB@e2rJrs zG^309pwq!ctX?aUGtR&#_rqOI*`~&s?y-4~ce@GhS1|oA>)7yBE!aUNbv`wS$)9{s+ETIt7K^Q2_`=%vLI7sL#6~ zLNQU%Z$%7yJbGa}iB^O0MWcP^QLT<~%MKj2AI1{Q1iw@Vt{L7FJDjmuG^1-bETHeO z><4MjKh}o51<$pn->6p&Yxg#pVy|tI|J?lAu&=$*D%!21h;drLXF|YZ+ILB`&6-N-rn=i~s@x3p6+Zfc(DwM$82W%J@x% z`&T6Z5#)a=q4Rr*e-BW8SrFxqav;A^1^%_*^T_78k$~%p`4@otzX$kzNb_?P(!ZeW z{{qF#-p$I%!QRfy-sP7EM)Vg%I>2iE|5P&nRRiPw1KK zXAJt~zumf?fv^4{u#l65>u)FY@9{^8LxLb+0r=P;AXI;V177p}#xed;#s3}_`7@bx zGobOM06`qTiM{@@<@@0RuEw9Whp3skk*lrC@5WimX3l^&e{miIZXJ{qq9S?#jTwOE zw|Rg+wtPQ2%6~}X;PkVmZ&jJQy9eC+toZ+q*?I;q2Atx5bPRuZ(g4@H$e&2@w~VI_ zK;0$(zy-YK`yF%q9Qx09=kHDRd)5B8Zp7xPYgz0NTI3VE-V__u~U( z$o%Yp{weFkn*__l%#b@;~way5<24 z4Qvbb3=O08zo371LjpSnJ!6XM{2cQq{z1SM2DVFi2G7_3Irx8cu>bg$_=|Z8FbA-+ z$TP>X!T+7(FFqr{RKWHY&s5z;|97hAJWXI8V1t5Z9xK!TI}hMV`G;KrFcGi}{xgxS z`9C1~g(yBS6R-yQGt<1~KVbTqB04Y)u%z`f&1;)~K=U(!YhW5+P0eQ-4d;JA^K*qw zU?O0B#Al)l*Pj#pty&^5G_Xq9GxQgapF{tlSq6*-EW`4Q#_s=fG~m?bzyBr$);oE| zrV984_TQ_Y09PD11^XHNJpAY2zsjBcMM5?(IdH1(Gr45c{~!6^w;*tO*E5e-{4aR^ zE7=RU{=oSQ&$#D+w1%JctNu2d0T>!MZ{QhvCiUmg{~9F$XAuBH1IJlEL%+!UAJBh| zx&{UYj@o<%hRyjO!2cD)35*RKHSvtSSMqc0pY`Bp3)%xqby*!|Max|--Q8}!hf%8{v7XlMDrUSS>=CK=5O%+vNZYU*897a&Ohp# z@8|S?2mgKD^UoZAH(T}0f!zFmK7ijip69L packages) { + return null; + } + + public String resolveDeviceByVendorIdProductId(Map packages, String vendorId, String productId) { + for (TargetPackage targetPackage : packages.values()) { + for (TargetPlatform targetPlatform : targetPackage.getPlatforms().values()) { + for (PreferencesMap board : targetPlatform.getBoards().values()) { + if (board.containsKey("vid_pid")) { + String[] vidPids = board.get("vid_pid").split(","); + for (String vidPid : vidPids) { + if (vidPid.toUpperCase().equals(vendorId + "_" + productId)) { + return board.get("name"); + } + } + } + } + } + } + return null; + } + + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary)Native.loadLibrary("c", CLibrary.class); diff --git a/app/src/processing/app/linux/Platform.java b/app/src/processing/app/linux/Platform.java index c084ae70f..5f4a169f4 100644 --- a/app/src/processing/app/linux/Platform.java +++ b/app/src/processing/app/linux/Platform.java @@ -22,11 +22,18 @@ package processing.app.linux; -import java.io.File; +import java.io.*; +import java.util.Map; +import java.util.Properties; import javax.swing.UIManager; +import org.apache.commons.exec.CommandLine; +import org.apache.commons.exec.DefaultExecutor; +import org.apache.commons.exec.ExecuteStreamHandler; +import org.apache.commons.exec.Executor; import processing.app.Preferences; +import processing.app.debug.TargetPackage; import processing.core.PConstants; @@ -124,4 +131,51 @@ public class Platform extends processing.app.Platform { public String getName() { return PConstants.platformNames[PConstants.LINUX]; } + + @Override + public String resolveDeviceAttachedTo(String serial, Map packages) { + Executor executor = new DefaultExecutor(); + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + executor.setStreamHandler(new ExecuteStreamHandler() { + @Override + public void setProcessInputStream(OutputStream outputStream) throws IOException { + } + + @Override + public void setProcessErrorStream(InputStream inputStream) throws IOException { + } + + @Override + public void setProcessOutputStream(InputStream inputStream) throws IOException { + byte[] buf = new byte[4096]; + int bytes = -1; + while ((bytes = inputStream.read(buf)) != -1) { + baos.write(buf, 0, bytes); + } + } + + @Override + public void start() throws IOException { + } + + @Override + public void stop() { + } + }); + + try { + CommandLine toDevicePath = CommandLine.parse("udevadm info -q path -n " + serial); + executor.execute(toDevicePath); + String devicePath = new String(baos.toByteArray()); + baos.reset(); + CommandLine commandLine = CommandLine.parse("udevadm info --query=property -p " + devicePath); + executor.execute(commandLine); + Properties properties = new Properties(); + properties.load(new ByteArrayInputStream(baos.toByteArray())); + return super.resolveDeviceByVendorIdProductId(packages, properties.get("ID_VENDOR_ID").toString().toUpperCase(), properties.get("ID_MODEL_ID").toString().toUpperCase()); + } catch (IOException e) { + return null; + } + } } diff --git a/build/build.xml b/build/build.xml index 35e6fcc7a..22917e80f 100644 --- a/build/build.xml +++ b/build/build.xml @@ -25,6 +25,7 @@ + diff --git a/core/build.xml b/core/build.xml index 307999071..1798a55c1 100644 --- a/core/build.xml +++ b/core/build.xml @@ -13,7 +13,7 @@ - diff --git a/hardware/arduino/avr/boards.txt b/hardware/arduino/avr/boards.txt index 7d740bd26..2150aa637 100644 --- a/hardware/arduino/avr/boards.txt +++ b/hardware/arduino/avr/boards.txt @@ -5,6 +5,7 @@ menu.cpu=Processor ############################################################## uno.name=Arduino Uno +uno.vid_pid=2341_0043 uno.upload.tool=avrdude uno.upload.protocol=arduino uno.upload.maximum_size=32256 @@ -119,6 +120,7 @@ nano.menu.cpu.atmega168.build.mcu=atmega168 ############################################################## mega2560.name=Arduino Mega 2560 or Mega ADK +mega2560.vid_pid=2341_0044,2341_003f mega2560.cpu=2560 or ADK mega2560.upload.tool=avrdude @@ -167,6 +169,7 @@ mega.build.variant=mega ############################################################## leonardo.name=Arduino Leonardo +leonardo.vid_pid=2341_0036,2341_8036 leonardo.upload.tool=avrdude leonardo.upload.protocol=avr109 leonardo.upload.maximum_size=28672 @@ -225,6 +228,7 @@ micro.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} ############################################################## esplora.name=Arduino Esplora +esplora.vid_pid=2341_003c,2341_8036 esplora.upload.tool=avrdude esplora.upload.protocol=avr109 esplora.upload.maximum_size=28672 diff --git a/hardware/arduino/sam/boards.txt b/hardware/arduino/sam/boards.txt index c61b01fac..f563828f0 100644 --- a/hardware/arduino/sam/boards.txt +++ b/hardware/arduino/sam/boards.txt @@ -1,5 +1,6 @@ arduino_due_x_dbg.name=Arduino Due (Programming Port) +arduino_due_x_dbg.vid_pid=2341_003d arduino_due_x_dbg.upload.tool=bossac arduino_due_x_dbg.upload.protocol=sam-ba arduino_due_x_dbg.upload.maximum_size=524288 @@ -18,6 +19,7 @@ arduino_due_x_dbg.build.vid=0x2341 arduino_due_x_dbg.build.pid=0x003e arduino_due_x.name=Arduino Due (Native USB Port) +arduino_due_x.vid_pid=2341_003e arduino_due_x.upload.tool=bossac arduino_due_x.upload.protocol=sam-ba arduino_due_x.upload.maximum_size=524288