From 4e66efeb8453f68155d58bf3ca55b6704810dff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=A8Rene=20Richarz?= <¨rene.richarz@bluewin.ch¨> Date: Fri, 5 Apr 2019 12:07:02 +0200 Subject: [PATCH] dotted and dashed lines added, a few bugs fixed --- pltfiles/das-dot.plt | 1 + pltfiles/ekg.plt | 1 - tek4010 | Bin 29948 -> 34376 bytes tek4010.c | 189 +++++++++++++++++++++++++++---------------- 4 files changed, 121 insertions(+), 70 deletions(-) create mode 100644 pltfiles/das-dot.plt delete mode 100644 pltfiles/ekg.plt mode change 100644 => 100755 tek4010.c diff --git a/pltfiles/das-dot.plt b/pltfiles/das-dot.plt new file mode 100644 index 0000000..2cf5bf8 --- /dev/null +++ b/pltfiles/das-dot.plt @@ -0,0 +1 @@ +5|%[5h'A4t(F4`)L3l*Q2x+W2d,\1p.B0|/G0h0M/t1R/`2X.l3]-x5C-d6H,p7N+|8S+h9Y*t:^*`W=6<6BHBr_q?Ofu7%2?R|m z0jjj6H40j`Rg?O%Ewy%=R@&mKT~v0Mg51koj_%t8Ka1^z#QSPku?>SFYV~Y`B}@ZiSl*r=R&iXp;rn18||j7Xg+ld@7C2we0SEE-uL%;Tvz{jXJXOgt;>V$Kbv~{Eq|sh@dIZbYhCsGudeq$wk_w+9XDP1 zhPWbf`Q3fq=f3>*#Sd)A^FBAF;nIKZyLHjH`yOxo$0K)5dM-S&@Z$F-N5)=rwEUOb zx8*#rFjgykbMp6`96^-m|hHFfgZA0Baiujs^2=3esiWph41>BybmPCfCxpMC1h zD^lP5kI$^ix$|}Rj~30G!lE4V+{{X@9t-eG4*IZz{+)yVIvay}E&+VrL62c0Q4jeI zMtIV#4*50*ovQ-_QvTBp{)-O%afkePM|=&s5i5P24t>`<_%j^*xP$(kBffVW{HGlJ zs~qY5oP)l>k>0;|=v(IC2ORw8k^Z0(x&%GKDBW?W{LTVhQDbM)E3!qOBmBQO^m`oX zb2;oY3VhEccA!hp3q9!2_hkotm%|?G9Q*=D`o=osQ;zuWcck}Q4t*~>==UA^UUKOB zmP22kgZ~u=eT#$sr6a!G4*E5R{AA>}Jz#sXJbvIv-+l*uwbMP~VqhI-aV*ZGs7mZVtYPlg*q(dMK-5DcmyP!vdp6ww%68}cWkhPG%d6b~e$ zaqZO{uM56rX~?>jzd1arY4|N1md+?*$}=nU-hBz zntG-=5nj_2i1=%xO-+cv9}Fb5szfM4pSoxh{vlaPFRhXc!~ul=wzd8hp*7(|G88Y3 z1QLl*LJ3JT4P-SKN+jda^+v*^(nR=Ptuz)0H$mUxs-^y5D6UjiEiH{in?hBAn!!v% zPlFC*SRi3rPQ_3cjzomtzos$T@qnEYsIo)TC)~8g zA3)vp52ka#BFS(P<-t}H9B4J5VyK)^*-#3m75ePPq`imu1kl(9B+zJJM}KX7sJ6i$ zZbE4_u>k}UNycESTNADMG-@JMP9N~KslkRBXiA0yk#HcPQs$3^TWXr?3Z@%rSrd*9 zrESGS{SfUCk65xEh6vgjiU-1p5UN%v9&d{JBgk(u9BmTo0^wvV9F&Qp;7k!}fi*)d zq1v^mdCUB<=47ovBWS8^jEPtnH3vQkQ5TIjh(Jv=o)j_k1x+FrM?0vaWCT>OIW}E1 zqFO{{U_>Uu(b{B0#A+i^q@y_z358+;?Ar^7PgjlrAA-9Rz3R(u~qpF!8f-2G5@`k9}k zx|gEX{_{h}vR>VKto!{JQW`&O;0FzSzk%;H@I40JW#GFEywkvU7{$g{M~bdwmoCuCk(vXzz-Yv zK?C1!;Cl^xkAZg?_$~wQH1Hh;-frMq419xuw-|WL!0QdX+Q3&Cc%^}t8+eI<7aO?G z!1D~;GVp8z_ZoP*feQnF_dUb@27bc8yAAxXfgd#R{RY0*!1ow<7xAvnUeVpz>+wEu ze2mrEK*_eiml{D-~p6E^M|-#@iy8`{5KALe>H zQn{4(&g-5xuCwPGliRvq@^29oZ#}=aAIx-SA@eZ;)P>5Bc-$OMyN? z**uw+b}54%Y~nGbHCv_Uz5f0T>Y0Hwc}reA@hk9lW8YRjNmpT>^hlW=<{hTVNJqHWKCsg` zTsUW3nZ8M>Jm0nyWr=(4+jjb=4e$36A4&Ya_xsv!n9$cg@v=UwF`1qraqa$yxPA@! zC9oGprQRcu(`jcKyvT1B@|!b__T46JhhZ?oi}X)Gm~{GE+fp9IcTeo>{b%YxeL73q zTANao&4lbxNpDLXCS+b9`@E7ppk()I9`gAVc(iwy;r9gmGU2yX`yrl8lmqSghf(5G zQtCmuBVLIkp35e6oW68)$7#2>vxjM!g0v8h1FTYd#y}?1khx09qytj-+cMrssoyib zNZUX;1Gg&)#(LDTEbKky!0iD3IGna+wqeU`)SWDpTNcu`<;o6h`K;{0(4L|FT9hBA zTLXUe%5MbfZ8dD|vg|xEAGaV)m@=Kz;rlaJ_CnumO&1O7`=a)n>~kMW_l-_riXy{# zkrog9SU)iw55#-UveRd#bx{%(P5IS}@HUNQ;gKQ=kFAXHlE;-p!g zmHk580e2@{Hp+1_;BvSXa8+<~xVNafvG07UWX50{!c-{3HQNs3Mp%Z)x0W2s^DQ~1!^Dw3FT!a1BAvY@^h2CUz%0O# z%mdoGuG_zQ-=?$BCK#_5d{<6qFYC!Q#3$MKRlqB~oha)`seiS@^m=?>M!RI6X~P{? zb)8S1Q{M{mX%~>?rG=*4e}M{K)v1yHO8%+}8YV>ZLx^zo)fK z(3J5}24e}*mxglO1efO9)a^#Rthey{zT4ONjZ)}#TXx@1eQ4iLf1EH(+Xu+6X}1-M zcER?nBX@yjS(q}56`hH6ah#*v2KcesOW0QFrI3L5tCA11N@@R8#1;&gMO8LZRcfpcZ#`4%LF*U zOu!9*N3&gGJK#>ZJMXyT4&5j31$_u%jsiNzbuZeTQ1*D|9O6g5{xY?*_YrqmH}lwv zv_0&8se9h|&K_B|zIokl-$q$>L6v7&Ug*vE_4P|oNNWO-VU z(R%H=GdR|~zO=^cLI0D^K4|r|BXmE+v4wTt%)>sFhs{WfGY>Ca^5HyWt8|P&TQJjK z$uz66=HsM4_aoBp#rk{l=T9xqMEc)F`H3C(&(L|`JgI2FK1+_}d+oaLTjWF5H`oZJ zhS_Il?_Q3{NH6P(9*6Uxb5a#b)tGm&zx<&bzelHz1G0Y8){~LPEh;YBM_7+Y8`(Nn z^dO!i!q?r4W$Vd$B`518(n1~gV|-z|lD5IP>GEwlRz^K&2R)4=D2hzHBeh zOZ{g0X^(SoWyr@_Krf&dc}d5-GYQ+YpnO}sqf_^ze~uw;&TYMbEwF=&{RGlXe7s$k zjV!pJx7Y4 zCu~xMebfOYw{xKuwU2-gm@h6+@5`EfV7^Vbqs&u{qn*ELoZP4x8 z+->*Ah!^}3=$pI8+q&;oa?A(piMjQM+bPqu+uf0>g)IAqPXRjRl1K;Z5$96h1;1R) zTN$<$VSjRwy}smpBt{-&BgQ;62$|z5EiRGh#kTCkk1F3>$j?>jnGKi+dY+#nxk(vS6%IAbSkLQz z3crK!qm7O#otuJu2;(e&3RF=VK=<0nfQb~$Ch)WBG8#AOBd=Q%Mx!2 zdLO2ZeD>T4YoH7tnY!GU7x9A)IAT#@H-LyW`yrlw$@>;_=qqq2vdkKH()Q0^&|q?2grJN z4Pdn{H&w1&W9U4=IvH&9m_1@%=GezWdCIjy$wMVJ{KpcOX9PAq1Goi{^R+I(LvUTd zJzWJUfq7dN=56MFA>&}%6bHX_%+vM6aqMgM=yLI@^pRg_r@M#yh%8I3FH`BG&A11G z*E(|DItKU%g--&GxuEpV1ddll6Dz43<;nV8Zs62I8OTrM+?!=inS4XWX_p~sXFY>s zJv@qh>%8ba&-^JJrwg#JcEjk7)7)=4{AcV9Df}_ux-IGQeO$)7EwzJ?{g^esyItdQ zy|n3A`|Oc@zirsl*E--|3cnG3seAVH>2;VJ<7E46Pv7w+d-}?5?&@1GrK@k@q^`b2 zqr3W;j&C7u!hG17Fjv`IuO(zTX_Fe$Y1I&eU=9zoLg(~0q zDz9Ht@x251g3P0B=iLVWjKsI4v`x4^?6hcyjVaqMc9;p!ovrpWnf6W4c^UjBz%L8& zaXuMvuDg#Fw8CXXV*ZHrL&u`~C?ZEQZwxAtoj}k!Eeb$3=;7+@Y zy}9G`#Ym^#XJy)#AblL)h|d5{_zWQSzocIw@S$l_DN}1a3+;h(sT|ncvPR1~eiZpS zd*zZI?#*yqbidv4RlLqU*;42dTj4t4_QUOlV_WAsj!^GGYQHq)hq=p1;*|3!Kh9;+ zm7kWwn0#`i!;fj_dT$fP_;QqG8uoQYjGlB_uK&@ua(=ZPdDJpoFFIv%AoHaU*`a%G z3GA$G?0i?ic}KpQvvF+9MSt*PRX6s$+kfguD2HcJUv?|MKfsT365S5ZV(!5`eS6-6 zHmKU1ZbPhF`w+(C`}#nby(&yP{8)E~3zNmXB5XO}mtn7VhLP=@^Cx=`|3R$N&9v12 zm9((Ve8Z8JqQ8w#Z` z^yDHvS1Z3-_?h~7UFc(qFbBBl{~vb- zY56#gY2N<7oOY&@>Clk)ZlviboaaWD$cL+fYlYhhNB#i?iEFph$j4dmeKTDm0=En9 zIGhF9)o?rDbe}T@?-g3)I@TUze~G@S9`s~Y$6g1$%HY2Sy27B#4BThn{{*>Q(7LYX z7`$`?e;#t@&}XHo`0W1IPD{7!%WVAnkUIn#>uxzuJ7Dnk82Gm!_Y7!{lG|zUWS^`2 zpMczEgV$={cE4-Kvkh{q4PKRjml*gLAZPczcDQ_lmu=wpLoU;xJ;1e%&Y*7!sq_)o z^Hz?_-0z7YEZ4AFe!qe9osJGG-|r|rI&1)8w?jtTnd?}sr^N_M+!^l*gk1%HZTm_i zEZ4C*UgFNMr3lNltS%4szdBxFgeC3_i}l#aZrMNDHs!l>9d;jZ9WQZb*lQ4Wr{T|e zqz=2q2us`kQ1f zRlmzVm}`nNSWD^s?+VQGN-)nW^Nz;*xY4N{Y&)1YaQ|fM)xD>mXPM;uu?9i#2N#`5th zpGd!lvr;SB3J;+AtOtXsZ&PsiyI_dU=j`-1y6o&F@od%mk=JJfy)u9)X|i3vjMv?|nb)^Zw=SJ{;9MBKrjRZEnEY{l4q^c;H>cv^G-h32HZ!>fZt|A=Xwv`-5GSV2X;of%3)*t zE=sn4#;?}i6RBq^bR$1Uh|jXi=2ahbT%p_0 z6UkHWzB03;sOlB3<7a%aICscb8z+36SsIcIuvz|(TXncn;>?erEanrG{@ex2Sb@J1>9 z)k==~vkbf83{6HWc&Bcy>46=3EbpY$Uf1N*@^^410K9#Q z$9EJ##KUzrev5cAHWza*xL}D(JPubi5A!;>qj2e%G;dw>Kkv3L{CGOMKBnCNi!}ak z={$fuCugAks4{0C#4}o(&<}06+OAjag8BPKa%I7kN7E%I`l>4|QL`cPD0^wy=-H8sGG| zh@TQ1nWMrozxl{-F=?bv&V^O_nBROyeudJ-{H}N8m+x}87t8#fkodOLaYCi<0L~CG zzk8G)%jy~B_hXfA-Htiu)$O=T*@EK)#=i`mKbHSi6+UR_T&4V;Lb%ngj?_J8`%iTk zc3G|X9P_l@bCutth8*=<%HLzizN_{)zi7zv%pvn8=e-7SLt7NuYFwEiN8{vt#FNQeG8Qpctg z_aO!5y!JThE#bbYz?jEzj^iHpR4XwS?gu;ow--*2h5LYWjLhYjg8b^Skm>QM@vBJj ziq*J7UWwvyd}R6PJw9E3pM*^hPw6=QACo#x|GS!#_5COMbTzlt@_R@lUOo37ZjX<1 zz@H$jd?$>!SSNM(78QP#(tEz}qfx)8XD(o#3ZwTSIWA+&dey6R@ZBo)(0?@iXo zEz8FC$GG^a>@ScW`F>r=--&!bspg#tr1=Th;7Qov>&oxD@Y8*X&ckk{e>E#Ul4lCJXNdsjsoiW zGuK|NN(a|pN#MHA*#UgI8gDp9i>3&2g`YiY(l(cYw!vx3&S6vugfqw|@LOqC{aI+Mg_& zFt6&pD?g$5AKs_5!|C~VdWoKYv%g?J!TELND?-k-`94|C!8s@AJ7~_s`M!qzjh=V2 zFOqX{5!MSG7Mu^x zB|3ZeVUBrNOioQk-8d@yINRQOjq?uDc}VqroLB3%c|!GlXB6+8=HVtbO+IvORl4>;*H)!tmy%&y>{R>#Kcoxo=GDVW_K+caK*=6ge#`^bco}D7;kMZKMA)m2-LJ^Bb@t@YpYMMapW(lb`BIUhi?3q1jj6|ICn<}3D<1V!DE`CX zua(F~a?*XmnuWLceISkT@bAECi z{yE@L*yt$b&`)#SgOT>tw?ON)4#OmTzyEEqZwX{Ndv5|vSMyWm8)p_WTF^JGN8hv- zeG~ieyg&4xIH{xEJi0H{@x)X-5f%UW;$a{9Ya<@g`#>*79OZ~(k;=j$cgnU7eNM;jPleF^sP13c zKkE1W>_geFa{mIq2B_q8-JuIDrG zA3rtPGj43OC(SD9o@~XBZL~JxSVm`W+S?Bi_Oy*%i8*0sciY@j%cXD^@V1MU|E=&> zxC?mO80CKp{1xs3-j=ES=fGd#F5qpWmH*A~SGWs!TZZzV4S$8ZfVW+w{Aa;m;V$59 z>B_$t{t9;iZyTljZ-T$VUBKH$D*u`ASGWs!+X&@+tQT(boeXW1-#9r{HMWR;V$59C>LpGAN&=Lxrl|s^cW7R=gadrVh&_9-Z|sI z*iIKtT)D{`hjN^3)f}Vzj5N;UwOnOynydSjG*{=d>|a?w{*3c@Zv38*zndJ1-xEF} z+}&>cu914u;Gd52zZ-2P4Zlr1v#8)r5yKgQ>W)--Wk+gc^+VkwD&eXZcDpv9?zeaL z{OC;osfB^Ao-+@=m@Y~>dtD`)k9mBL9={0nKHb}iz2?py{&vwL?(F$ffB!_to!Bwf zCEDQ_Cx2hf-&XT00`emlsKxq2BsI;+WVERu77ry71@dDW_>NU*ysOuWr(}v_d$l|RfQVxk&>oxi&f;C=EL{V;_+yFc2jd>O(nwaar5P&m^#>senxgVU5e57R2kDwwGkpkCP*YTF!|6pfoHpHtk`4Y0lA<6Ps6l@! z3hJ8i?GXHSKh(fTXIsrp4NcK?O#_ix*CaB)FAX#`MU$5Nq6EHaVl{>uqw)0?K0{#z zY7)^%GyGx!eDDU(y83W!y(I+37#jz?L#eHeHZ}&Df>Nu}$*m8)K0WYeER2g;*MGiY8+G&JOYw0lyK_`2!`%s8RRwtr&QfQG6z3DYe}q z>tk&o5wdQaZ6yP1tZ>3&)eu>)^qZg3qSuAzf(0&E;DQA%Sm1&ME?D4#1uj_Nf(0&E z;DQA{(gO9DxkL#ZAO6?wCTz44U!dS>1)CK7TLr(T;LjC2q2Rj;W@5vOdiX6q!V17l zKz@T5=QHHDkFhr?zd4U@s>pA(BcdNEV|-+TCdeEoQl&kJsN8)zF1z$F71krJEAR#4L#YX5Y_cS6n2E?HDs zI@`)y5lF;p!ht4hX5oxNU%|BEDe+i%+LU0ZW>)jG>uq0ax^LP|z8j~_6!Y+{LJ++O>mpZ1+9jUxt}NH3t_kjJ*C$*P({fx_4PQri4+9^!toioc2sUlk zkM;q+tg(W1+~%W^;9(u-Hp#M}MlKzVP4{iMnJ40vCM{fv?K9q?`r`|(P8mxHhEA;eh8*Xd)= zgYQ`lJdBT3eYX+*QG-rH&&c!~H29R)<;5P4wEk{9Z<2Tlw0^YyOjVv*zFw6V<=@o8 zfRsNAsO^uh;Yt06jreIAP3!cXGx$tTx*A6W((i`6rnP*L!Ds%8RQb_946nx_hNq~e zb@-qWJ|Fycga?4jmiFS9VL#)=956KP!tEN=&#}&a#)w*=n%4Sv7<{IWccIwNB_axW zO>^WRpYhvIw)l!x4G-G$QPA7LXG_-UBdz6`o=zjaZ$h3l&c_R;XE*5f3HU}WAnDJi z*FJ40Ij zeW0Wd0cw3)`K?6x*!7d&Dzcxk(!TOriU!|zh31bD89M9W(>}Ccr(qA$#RK#Nkp+3a zuhRCL0GjXgH9ZkD&j)Dwa?tw>+5*jUN1A^%Xr4jR^tGT58Z_^b;2B-b&j)?jpl5*Q z*#ga<2b$*#G`#}!afALOXr6;YvB~lefj(pKG)V) zErxw*zr4wV_I?WT9z*_F(CG%v@WqBa!=Etdmm$yZ8kzB(Gx(G*vj*d%z6ygT-*e?4 z|L4%hZvbh1!+DxNM%J(3^@B9|oi_~9jQ^lPlbd+^-_`?2$vZP4WJ8n|r6=I5|em5-giqqhvw)X%fgCjSiH z9BZ2V{L(?1`cL5OuF2;aVoj6(xIr^~4$kG6{0;0J4=7HAZA8*cB0a}k=q(h*&M&jebjZ;jop8s)$#`vv)`9r4U z=Nj~V46h!pqaJq9f9If|chCnNbjm^h5pQrIp~n*y(;I>pXEY7mMh=vzTss{f^Y4Ef=B zy-(R^G596WSBbFWkiX@Q@Bs&%0L?QbI{poyc^*>R~TV=EHk(wmZV_1kL_BAAII- zH|Qe7&u3iP1o4tX{^y{1&QI%q!@)o6pg#c3Z_a4>kytYE?4YJEwwF*cKHBRl2YnN0 z-G5w?Hb#_z-fe`x%^_chm%MsD&U>5!4*ojOoZr~-PZ0NmHtq8$%0oX)&zBtG9|z5E z<4}y{x68rb;L!IE4*qKnnji4g5950uH1o@O6Z1RLUQ$XC@+Uax>p&M7>6zi+{|X7! z>nE1)Vh6t(H2YUCbYF$|nn2Gn%6F|p{tFKJ2?x!CD*9o1|H(oBJ7~_A_JYUs{021V zD+d(4ax}(6)xYsxthXHD&wH2hqqx=dC+Cm)j44Ua%2D-!u|2LpH zezP4heG!LzGw3oy{0bcaOy6?Q`k}sB2i@$T zA0&7?;L2a+2ZF8K7ZK8`5=}^GW>r!_~#sS zHV=WQ#{w)eXy$K`gI*1q^9R~X)&~cFy@P%PH0QUwl>9CS|5*op(4Z}Z`Hh4AGic6- zxi7%@)6hQj!}N}G(APNV8$ok@u@ABgzYuh}QT`R6Ip429JtALBZBE4HC7)|*Yp3FV zPj%Dhnxg|)bD=eE)n{))vbt8m}W;Kf+}WTPK905##dEx$h)^{ z{DI~cf%927TZDr}h0}a9X5Bcvl)OC(w>-rI>-{)|6km@!fC7!U5vsYdaXo?<6mDh; z<61LAly?Rpfhy*@a6FNuEd*}d;$b^=h7M^{w@Hz~`>7NI_nzSZ8DjOTo4X2coavi2 z9S7JNW4LZBzJ7@R42B*!pQlf`A^H}dSnm@p)5ZGfqNQH6M8x`fu|6VN*5eplkr;AR zO00{AlcB2mc(i#8qtmN(L`~ zvTq;z(Dh;;`%XQ13zn%coR}ZyO?4|{(WI!2gaYxExR4DOPOUL6y)px+8^H!{89vOmTGvQ(dff{_D-`gz7s1 zbtrj<+u*Hc0~ZA1)adQ@SyAJHx1smbsZhh;A;=5nN}J;en1Q$4A*8&b%uKj__n7HZ zUlvU!Dsi_T8iKIz#Jfx0hlmT%ns^169p&K7ggO_sk#KDTY=zz_5%t&Os3>lXeHM1=Ek zz7u+Q51O5Ad1IRyGb&>l4!u_LVmJGuwISTWEBRPr_WgN76TurJKUA>BU4k&A>>lj< z-%RDaBhI8@EI zxVZW*Bv0p-q6;sVH5EMtN=)90rwUdNIev^oJVhMW!&rGSjAkg%1-k&#E8!=|E zfuP=~tM+We>NDztW*)pO(=hYEjgh+CA{;7ID=oKg_teeNzKxUjRT`;L7YmwcMS0=c zLDR>+VbJtZHwV@xn&ogZU@H6eNjuT@ZJyzTEKvIvL{kNv~mG1dR!QfHZF<>VmL9c zFF;jSkUDNzG!yc%?o6WipNAD&Z~zC=gnV?9~`Vv6z1K9HO)A;Ux14*3rXSRdp%|^ z>zkm@hRL|i!7+ROgklKc2QMCqP~Jvjk)$Y;DJqor=@!bOD2zwtos@<1RxB;Vk0pXF zqA*l%Pfl%ddtNG}xW+$S3+>PxXbjgPR?Hm=Z7t};MInE_z)nNz3?!5BFn$n%$@Is5 zcn$^2I>FU2-{Dt*;29PDkjLk0IBpYAj_;0RU|7KQ!?hb9{)R)#@tuD=m){-@>2 zK>kskJ>gjZz60C=<$7z2a&&x`%;gs2MLq(vRnC z_Cb!@1zI2FNN<9p+t-zU9#=|`t4;G-A!1bf!eGnd6&OUR4 zcf2%!dMHQt2%MJV9#spD7rZq~2>~!|e0IQTIqvNRmksjB*YQ579InqCc zgK4E4-wAY`NA7jVFuybz-!<$WMh+}-7>;E@Ilgn)13A8$p&uW{NgMXSX?^ltLpAm= z>7gFV(ft-q%W)6N7Z9Qve)`en@fJLYGhXf$wL|U&Eu?rP--e?;9|=5^<9l`ekVp3y zIOvLL|9y~~stG{K@F6sc6Yp(>D8Z2xo=^K89P_~T#=6Y3>8Ge!h`ZTP)uZ+CG>j?t OoQ!v5PIWVD|I5@4YiOufe*{ z(|x}C$KEG5=bU@aJ@?$-Ki>Df^Wf|Sb6hT$&@Mw13R2}4yF?k_f++rFiXmmf5*LDZ zxwwq{s91>bg}~smfYN6wKNOI0%OFW_L5zNg;=2KBLDwQ(`b$C6Gd_Z)2T+(x?_pGV=#22eG=2Wk5 zr+UlU=+Akz%GG{{So_MuR%TIo;Xhup`ijqF{dC#$@Jx?xG(2s*82%FYG4QOvaqx7P*+7g3yb}H@MHc{G4Sy~Cb@122 zPk=9mFM;>M(@lb(0zVc02KZ_4bkpHyz~2OaGrV>cKxV;L=>Wjl3ZDZwSK-xw^WblV zpAXL_Om{nc4g4MOuOy#XwP-`(6?bPJcUs`y6TR=#-B{Q?WR99oNM}NWKrqp zte^etsuvc%^j>Gj*G9ZN`LUlp`L!P$JpSe%E_(RXldG2e;h$Fep4^oGmyR2*_?@^s z{KBK}T=ekjLeC2mnlAov-_3JJKCpGwj}G2F?uF3Ml8gR2K0M;;L)E|9yea?T`47D{ z;qKFU`)-}Ldcu&G!=IjdZ~uZ9a~3w$PjXc}cGl+-Hk#SaGUy_WwIE{b-eE z%pF6sU+jH+)t`@kb>jH@o;&FJR@u=X-ZJXvx6gcN+`+rPmVEkKKe_kq%ahOi`jboY z?|Reyy}45-6rtz_xEtBPm9qdp=b#Tb=-)f&4eSWYjRM@^px@UW20ZecjQFIR9r7^; zT>u&FD1VQG|4nv4<;ag|0+94*M|w*g_I%!)n~;NaIg=-)fid&|N9vV%X`VQ<7i zU+=KD!=dkX2Y-=+zXSHy-f9bt!f0^D!M`4Z$f-N*OnO9~_??6Q?+*R%I?Ce==mR6Q z{$Zlc5&zQ;`ff-58y)=19rlcH$p6xj{(}ztwm9^C*Fm3i==+XC-&Y;_e&^sn=%7m+ z^d3igUvbd89P%FIx6CO2?>Ow+b0@~d}qEIgQ4Y(v^gGH-r^7Y>LV>J zNWd5HC$y?~FwBsKNDKbKETxyFlJLg>gzwh-e2aq1L-9l~RvGrkJPO*-@Mv|zCbXhRMsx63`bgmwf<%4OhZqTj%1WT+%7qlLPIDV z7Cztd=17Y#4qFpGpRIdP&8U3TXiEU~NR5GDeFT*f3zQ3*HxONyLS(A=DC*QJRs6?~|<| zRAJhDsaUq%l#F6aMW1X9wg!EHnBTSps_fVd3AHTu`O#Q?X**LTk_aVG0qiD$R5t+? zMQe=6o>5#{;5lp(jr#)Ly2f8AdREoR1s`LX$ISZ_4lEv-R_IFCh7%ReM^0FR768) zIS7f1hDfYQ_?Jau2@yr-ZxPWL8h!&M!=M7K(Mh5i%_1TrBQX(*)F;9sS|5(Uj@EcM z7>o+kvm9y~0{)dG*xN)yKq_S72txc|0>weiG{J|FYgxVO4QxE30b`u-1!af#`Ig1w zHWQL5oZUuJ!Ipr;6$B7-7tEVg>6=u-?PbbksNItd(*rFrx8w~B%aD6Sd!K0U7s+R+ z?X*5cfg5+aWf8>xIkY}72mtA!{a#HOl{aF!57gxK(S39-2< zBg6)68X-1hGYNBqC?~{bu8I(wtZG7R{uU5oGgU)~%~LJmEkZ0IyhezngxCny5f%y& zAjG8KNQg~am=GJoC?Pgn2}10M+X%6dTt!$R#A-rpJl7E}5Mn)Ho)8-dZxmu9A!>g! zAvT;_2vL?>2`38CNr=VXHbQLZwiBYncMz5f(M4D+#7@GoI3pmuP>7cZQAxW9^M%+= zh|TF9LTp6$63!N4AK`66>?g!#`2gV}Ar29a6r!7OrVvL6abR$i5F6VQgxDpWBE$yv zG~pFOoFTkQh_i&;Sfjo#slG0DAe!{?y82BLr-*4c14SctOzhvM$4Sa`zZ!_?%2EN(AHyHRj17Bs}2?Gxsc)-Ay z8hEXNFEH>b1D|Q&Wd>ek-~|SrZ{WEGo@3yd27dOeQT_&g!oZIh_#p$|Z{T|ke7AwW zWZ*jue20N=Gw`hjzS+Px82CB^UuED40}mT`z`&Opc&&jiFz_k^pK0J_23};~1qPmP z;JF5#W8j$ve)g|M`5X8N13yB%tFu>hclKs_o<1_%>g>t1(APw9(zB~0nYpVtnIk%q zIo^)s(fu@`C_J&>0#bcG}&2*_lx&!8wZQ$Oe@DbE?MZ^l%y>2%m+4| ze7)&hAMv5YA2`>y@%k}+8^>PK_aB3#_5BY?>$i}<4dsOysQ0&!)3(zF5AvIf{N|Uk zd^gFm!<3ipf&F6M# zuae!RdC2Eiz+-uL8DX6W%R$%%9fovrP!BB6*+a$ggw%t2N4gS6I+u*=IC=4~j+1Ur zXAf;Dfh~l&fVE1`aLD8sGFK~^VSvd+=FR6TZgr&Ff6T7VT~$m2-*6+&f;F^o1y8lw7$>ku<>5^;Vkd4B$iV$o(HyMB8=@5Q*bKXvzBe2Y0C)}MqBoy z{7hRegDqHkq-@dYV7ZeD+o9s4bjEtnZ)gXW4=MgegMX3Y4>S1VVI!6+PwBio2pY?z z&!%XVw*{(hnI|k~vS%uq?SOS!ChJlhGwZXaUx+*5?}Fcj`Wp{;2mB)VTKFSIoqAEH zg=mXK=pU{d?R>m;OJ{Em@>7WVEwaWXGmsYhEY6URmrqXjAuM~cT{G-BZp3ArB5VHP zLht;;I!-I>^B|5cU)b4O$uOk30x%cwLgvAXG*sLEk8?Jii$1}0M}zOm@9bqeDI`A5 z#;*omI;FdKmnU69# z;_66#6=6G#@eE7k>@3t*mbLb9KA>AH>cO)0Ajj5fgjp&KOW=d#XL&1S-(h$)aMm4V z-KCv9?9Y#nezhCzpvP^^>ZV@mL;HJH%LGgrFJ&;7z`hLB<68I(@7iuR(q+3v*tgx@ z&M#F$x7)JEe(FR2e)glpp>6LYzh=4Jsc09sdS)k|~*u{B{a%&OBzRNrb z@0#Q`;LH>8&FovAP05YAkHOaUq9aK?9_U!@=}2CV_IoYpgG#qN@-*P3#dUNY~XZfL?F&@bJv>>DP+HEI2*SxuKnP&&`-Ni9z=`};lxrJ@t z%){#{59?ryGY_wf`d}XNlpRCR7fkzWXtSDYK8pPXA7Z};d-d@T9lv8I?C)eAwmdjl z=Yi{_vQ+uZKV0Oo+rrz(hiq>sBh(sJpPjwCI48qiwiP`O?}xr|wWw8N-No_pIXQn1 zOCAAaA7ELJM;_O!v{*jEdR&%~t#eTi(m5!+-M!eN9&1!`vR%R!>Ua?I3;UHU8_b(7 z@7lvv)PsKDRq_lgP+>)YG7sR({sO(!Z`#lD*am+Bek=U*@E+tP3+v7V%BBtVyUH^x z`5?yUDAMNI)&tmva&U2+fX&25+imIKstY=jaoEf9Y6K+jg3`*v9HUmr_P3^+Yp^9_ z>~j8<${Wk)YbfWc8`AAorh##;4e5OuwzF?I_2el%|7z$#n;x5K=-GIlxce`$ZTOxe z?yjk68`{qkce{%FRY%;-i2G!*y+(?iCvHN;-QtM51aar9xb^3WJ5$B|j3aJ7(=D;n zMROdqtTI*H`yFw+ryyMwclLSW?!DM9t0qU>ZHW6M#w)ISF`o^Z?q(HtsUvP9(^YZN zMF)+$RK;EBh+B=gdVIrC*Pw9=Rot5$adVBhn9l}{%Q@myW=HY|f3@54bAW7r>|bpE zgSAEBeKT2%c8oRaSlM>1O2~4&Sk!ZSfBzd%iDM0@>`6dR0%2+#9=i_dZByxe0g${z z0s6Oi9DZ$br{@bO_(L!@caOGpFI95P2g(y`>ksx*+O*T% zk!*l0#|A&3Q!W8J*p9fC>H@!7ty>v)72>YXviGuFk3`9XY}i<*1|V}p+2RuMUL3)W z{jmBifcz|F&rN`ZpsN%;9WWpCK0sLp(8qBl2VplV886`dil2|VBj)-KjGx%|N*>149MqxP+umJgxn&sJCw1f^ zKHDJM-tqqaAGCp%<&F8DG8{*9uplRzWIkeI0HI_b>_CGo)VekZG`QihZ9uoZ0pC z5u9uG=z8%e`^aBx+ug%+MAoI&m!tHt%yuldIvn^Ag^vS{)+WPqfa9^y*c$3a zeX@O58#wh)2J&OM_GX<^rpSfWevxnEj)c;k$reQz~A-?u6iUWu?FeaU;C z@6-D*H|EKWGcx;*%zwVG>c+0V*%P|@=8Ws=n>(zlk9ItZvx}^?z+zlUq-v_@J-kE2f4PTFZUx$1bs=Pj}(mMmVL*~&g=WPc5fxIKX zJO|^RVuK+!8oG0#d!*9+Fm#SW*l2`#5XST9c7zcg0<1+`U9SraJ?Iyyy_3#wgLH4* z;>xCp`$ph|I{|UlCBvoyA83>6 zcQo!i=kIcURcjNDT?J_O-&SSdg1#=;@D14TO%=v;Irr-Jb_jDU&#vwH9p$asmToI7 z!{LaN>HX(aob4)37Q(oPA1uzt5r=U<5BP{$*XlGI|3;cDms4j3rdjqk(qx=+q(ztj zOsM?sf}S|aAb~RYqzZcvVP+W|kaOvWm%(0#J=;{A4=aOwRR%SHcd4|uLeCwrrxy0y zuEKulu&4SX*t6YXPwq#s=M3VoPKsd9RF!rc!mfrr1+eET74{v6JRPuEID~Z4FEAEwjg3u0?lokAv}sb0GT`VIE*L`V9NmHRxZRN`5P3dCuv! z)^yLhN}ngq>RzvOtW$EU4Y^mZOv{Chw5pkgwquyRZ%gE|Z(^K;4X3PEdM-deDo`@A zFJTUN@1Bm6LmqgzPsV*QGSs~YGDA=< zyOd40fqoe{dGmqiGY!n6tUKn@g1y``W4&`MOW~7HW;`Fy*Xw@BfGN{l`p{Bho#Gb=4m-#j$OQr`9QBsb?Z|!`_3$r`tBYu?ljRtNLO1 zYm;!!jq|kvq+Ms|{}STWC^`#qpBCZ`3+a8|SjTZa#IY?C^S?eDVBWu%DW28&!Mo7M zvXq`7;Ne_e+IAUmuJ^fz(rxD(kflwRD<1bwh04|!z$*Zc`r}AfKTqIU9P&7pJasOY zy#?_yRJ`=w$=;(=&W$*hdx6rg z*KyQeXq4O4$QRe_SxW8-v{^a)iH+qpOpl9t-C~DND(AYKXZ~N^v;4PQqj3y8-g(h6 zu3flZ<#@<7O*hu-T)%9GUk%>|zY2aMJnNlp;%2n-LhtybZWA+5@6$jtuRMf&{}cK7d+Mx4o{yHI zu2dUho$`6~T8uHLuV5XnNoG#cb&2!DEA6mvx$S;W**q1NPdQ@@$64pWnJR82pUpwG z5M$N?hG9)vqj)^mabMBdQ^7eT@0tqsGA07z?|%t1x^! zDaU9%es4rP-B)i?Wx+8T^B3m7bp7)=Ez67VQrLZY?crJ#HWBfbxH^(o{i*+Wkx?#7 z6u-!bW2vw!4LP>2d=)MX+0$xl9An6yQDJhNHOd;VucppS*tWbV>pdJ}(YAK0u~xS& zucNHxo>`UkWsb78_mXRqQKdt--7@G;DE*qJ^_MyHdnu>%4{_+9CUvaEdtZ9I_LK)O zo^p)kxXN+14*mqj-Y8%Kz7bxJy$67?*HUrWk97P( z6+cVy2HPVt{(i(K%t9MGz`lbt^*)qyJl=14W0&evJVT})h7UuyTz5e}Pu7bajyd*? z%}QQAM^N&2A>W@>Yr>gG^D`)e&!P+-QDOHXY>A4e^AJ$>RH<+?51*RfaWZye$H`AY zkKQM9-FGka5Hepe@Kzv=s7mAG2s^F%flfoHG}8S%y_XIkjgKLXMn@X6RT?h>-mP?B z0K5)zKBRZA3adcaI!AgO7g)x6U1jE}dVa^rn~+`&^q6_NPNnx1z%r$e`y$={xi>06 zxE^n+fKO6$4cDPuA8;MY=g8b=&VY^FXR_Y&pfiU$J)7)vY_Tc1PxZ;Y924+NI@98N zIPzVb9;DHu_bGf9X6l#cXewRVzcFs=b=Yd9lkaV??{tFZGb4_-@4DDWjdK>cfXY|v zEAfGSX4ROA+P_|Lsp5ZdziF?(^tvpoT(8U6zuB+3?y7kW@1+yM>$TYe;QQc@!gFlU zYch@->)|{ z{(zB>Gr&L0>$dwHoV6Y?)?`>y96JqqylRtt4^Xbj6wPOFIdV;9w^@vT$G8^Lea;I! zsARF;IaY4SqCLv?jqkbT8i9M!DK0TKV91mz9@h_E@KzhTi;Q?&G95d0bVETowS?-D2noJZ8S$0zSSjq}~f<1tp) zWuy1Fe}SDfGJF%B%YrZ0QM0-OR}o)hhhZ#i(>y$z{5{@3TCeC0O71Z9bg3||p>PJ1 zy`41T?$&WJ_r9d$e*^hF3@^u6rsPg2xwTv)t7n6&@h&9JN$@^fRd-IAZJ*>rS5|>- z;~wbBA`fX5C>f5~`HG(kgIyS3->6Zt5~}=GE7>{~pLxI@KRYUA?J`52j%`rDTW75`E2 z&mc^ngM0>b)|Bz7aXJsUZtrWrD=_F!gDwND&n4~$T?JaViTgmybuaRc_h97N%cp@y zP-cykLs@a}jdO%I+Cc05Hsi#-e|T$}cRpk~dv5^TtmIjac&3+qKjyRtFsHR)PUGBP z|DXNGPn32@oqC>^^E>MBkP2rV@;R~d+???zAwJTR&yY!93L5WW9^?G(SMxjP&Upx5 z=SZiGG}1}@jdbMPYotTE|BwC0=Oc|73^|$K%cE z-gcz#+GTYMkAIfSy5n#ZwD5NI2yY!m%f&rthfigQkv*S8_~?m|o{=LWJsDPc_joII zc#X9Nk1soWGv0ZOu%~^*;vT^6_FF0~m%?4Z+b>e#HzQo(F5vCMRrpN^SGWs!dyWd9 ziExFxfVU4*;Wr{&;V$6q*(!Vn!WHfU-hQD9pN?>ayMVW6sqkqCSGWs!`vofe281iz z1-yNz3ZIH_g}Z>a4^iP$5Uy|+@b*jih)x&YOmLGo67@LVT6UQ7 zlQX!!)N(bw8LsZvGF+YC<+#iC@fWLG3t$06kD89RST)4a4`2L4_G7z4H`hOgK zCj;N`oSIwwwupB2RM&MRt7~vZS@&4?kQ(^9Io+<+=mQ%&d;aiF|M5BguAWnmyqqP< zJ9}N_>+oL66GtvY`_J-p;yFTR55Mur6nFLfxxarbH2LizzdPg?w(`4g zv|{}+{<79YBGOVEjRoWJV)=bJ?rsUL^vMAGgLAQ1eoSr!aIZm29N#_1XINJUtTz11 z7I(`}<_G812AlAqeoLs$D)W|laR*Q=7KzPhX>DE>j9HNe3)csJ-%lRHZjo|R%=UB zOJqe$DlzNocsBTz{+5G&IoKSDt+eoEw&h(62)k3Mt&cP}`&$B1tJ29Y>iJFj{XvVLRa^4A?+@}&$~H^e!mq-u`o>T=U`1n* zdQ=F~sln&?Er}VHiqDU`txyZTBDe5KchKJq5y1i*Ob(Y&3=o`+@6ucO;kw1|#!-ph zlF1ELJXntcskje!P%IBx_N5nAEQk-otU1&oZ&O$pX^F(6yhlRdnud7Lnli&m_?KIuxW#G|<$L{Reo1%IvJ+X|jjkl*W5AHU1b z0pz_z_%=%3e}pxgymJoUV#&MO@Cmu-!Z(gMtCRG*@ApS`Vid=kL9|`y5?Eu1YK)5< z11b=Ry_dWT0N?*fha}ON>>CEWnC|i2n83M}yi;xa2$#e=0r9+3-m!9h&4XsC2TAh>LLYw2}%s5Qx3dV_aL=~Pisg4q6`e_2Sl3V;roDuxcta$V@k&KQ+B z+Li0N*fqwT=epE2HY4A4<>2+myAtW#vUS?`7uvL4hZ|FT*{THFq0L7_hGRRVbIaCg zw@;g9D-}YwAGg5D0*>vA&MjM<5NwAwji;D!Y@c*)byJ|ezsoIKIll8#_j$QxFTz-h zJ0)#-_9nYO*)-m6hFhw>DRK*(SkUo)NjSH+m_m4nc|)PYM{JZ z(smj0zCoRTfzgC~oj;BUQeKsh=IinhC=c?reH1{Fi zl-KpeQHiv^-;K9Dei^iOT7S2yPc6Sh)feU8*1~|4KMknMA17W?f2WZ?i$>GhzTF0& z_UtogH{>;~<$!sE$!SB=I)0IwOUTDLm8@?7)McJ5Z;tD>8!cvn zp=lRxz@&c8N46U->Vaxn>#sBTw2$|d+HRDHKwi@v-O1PO4YzuTf7GfG&hmT$^i1TB zJz3jF+ID%;9)8PbyW!#)prr9GGFIWkF&5yi7JTD}M@Euv%EFx~;N#t8NpHj4#Bcw& zmZkiUAjfY4+46OM*5jK%+YJ}I&#&CDCkeXBpjkfrhEU6&14?>7pw?GAHqB@L`5mI| zM#%i|o&?+3{pHMMX*yeH9Re&L#;-QYgS0nAj}f_$=N?;^-x$!`YipYKGd3FZWuU_b zZGq;qHZ6Y@Xg+t-^fjQ{4Ej3Id=EnNi$Je7=*ghh8FU5c^#;8N^ag|eIOvU_QEjsR zgP^w<{21u12E7V&r$K)X^frTj8uWI9W_^`ko-SXO-zkIsGURs{^4|sBWzdW-#t)3& zWzereey2lzx4~z6IaWG8_2n8g`Fjoe=g{}Op^toiD_}dj{d61hf&>8~?r@~evn^4A+Q`P~LB(>G|z z$Kku}RQ^iSH2J5dq-n-qIyFs`ztNz{=eszzv-@9X>QYx*{~?2B{OViM^3pzoCjYEK zlh5Z*wzKsoaGIrQ^7$-4(~KXTo2JeCH1+({Y4G1h``B*KnA8pTPXADY*73V>CyVWd zi&2B{d1s5}%lzJ&rfDzlcF}z2d`Nk{e&GuLa_HAISNY`Y`I5T;yfcxaIe(gt_D%y| zuiahZVo?EF&riIOauH}fzmN`s=01bYg3nP zL4U#Cjq#)a`YC_h!G9k#=Qjqke6qN~RF36wg@e8s^d3Y0F64*v>26g%^BnRY zbI?to_ZsorK)+p-6ZO~?CwH#p*N1%@n<>YXJ7-b*T=m7_+t)! z1hh95e~efG+AN<3Q2yG{p0$qnn?dhKe2TGtJ01KshraJP_^&(YUpwe`K{LNx$1uO| zJNP5)EuS=z_KgR9$gpREgZ~N))%zLNZ-s-u1T@D}4|H9L^cp}PNtI8YXmQB5JLo4I z^w%Bq%MSXdpt*k8h4g68uRwGCuvgKehNbsAqp;sO;)s75v>qSWK3NgF410OkpLQ&t zs}0%$J>8(mp9}h^5r2_`e-G#r2EQIO*CSy}A+-N~hx`Ty{WNH8FZ7XA1&GloAl7G~}|03uGhJ9ag@V^h5>n|ROFum6u{Cy7kgh5+KGm8g$ z$}xZA9JCiS*8?1{slVL8U+AD4Kyy90UCFO<@E>u|+YH)5obNj5e+SL=C->n@|Ca`z z_8xQ4?~z7%?pE@{&|kQIUVwUMd@->#9+N+8vAn*1B7W0C{kp~SmR25WH8xC~I=ilD#A*U<9!(Ah$ru|z!4+R#u^k6UPOtz6_= zFmG`!uAxm|5baAe`*1OC3$C5^`2rE&@^EAs?y?TxM(w!I-`Xbdj3ycm;x6ZsQt#yH zQwEokmn!4(CGgL==O&v;t7_8 zz|GTq;HI9V!8UctG8w$KSut?`Hy$D(RiC=Sx@5{!@AOG{h}9g$E!44<1HvaWcIp|O ze$s{H+q`0>SF}wMD<_GzM$r})D;veiuxML}M`2|m8jd7tBDiRHVI&X~D`KHUu(mN4 zX`nLzq6 zSfFIuv}u!Z2Qlv8uEmoll4S$P>0W`0!!>jIG~o+`?u&;eqy9^5%olG8MH%YFHS4$~ zI^Gy+z*XUa`{>XRB z%gdong`xPY7;kJ}9E~JIeK_ckEyg|NxQ7{cJ*V!1HY2EuvQxLyv;EzLOSMtC123vq zS3uj>N1GaWL9|ITpYcQh_l~#5aXY%5fV$vb-E?h=tLL!lzVY+l`fcmccjN0=@@n(+ zW#6fb^6}*OHv4(8aqs!SYui<Pn}JJ?W?%WkjAP=B3^^L?a={* zeMS7;^7jC6AGo{`+fFKdGrzXJJ{+oVLK$IHibs5ncub57)Oi88sr^1vdpfIw-|3Hh z&*AfJK-`C4n!01$R5+Lpm>{2Z_(JGG7!TRW&v)hgz}BgLApi-^!n0lI;kDp)w&exp zX3A)URe0cC!+Xx{d&dWG(>K(!rtItF2O7a&O!z>B8dvM1Amy-NUx#ig=auOujZ&T; zTp5?9{I`DHz$_>)D~oFMMek+`>0(Y_L2ujcysn>julonIF*`1bOaFvIv)zs3?8o!? zbYHeLz7Sw0>GR>Y5Y#wkPc@Ys0?;(${P6`~vXYn3n|8_D@y!6|J*b7S?=o)MUsp+fiYhhfpX3e_Oze^kF}Ufy&~&|E4$#OszB0KjvU$ zO8$C;D(S!VLmK>jhS?Y)=fon-b7TG}-h|OV?xB8O!|{UxrXe5sw>JV2H5l7j)T`-~oLWjTtH_{wIy3j~;m*|1S#So#EGQBi^ye}W|yv*zKQ zq2-FgvbkhgD_*@R#?LvFkiyF=jaYoFY=J%-CSo=RZ_4m3r~!lzyjU~ zR3d*CrbL!{Nh~6NX`!TI(ZUkUJb^Y*5^S{BmbSRPtQ1mQU{}58|O2z%}}n7mMBNhXRFx$$aMM4yc&UC z2=T~-wo!)X8h62CTP@}Iu16d8hAAJ)%-|HaG zXYX}*3|2&tR8A?n@+;({e0R=!>pl_(EU{ZGHCJ25EiYw&i4*@(ex; za#{zYYWzjud^3Srw0~L=G%* z0G@S0Ir}#(arTRd45OoNmSGRP)+f*QaTt<%#HHjY`<5ZcGoive2Cv@}kfUCvI}LJW zkb54ucDml)K>*YBDhB2FoLM{a=--2fuBZ-ggxo|;08)mI(5Oy4*TmTc4k`Ff)z{#e i2lh9%W!k1)VE|9c*-@3#`bL5_<;o*`fm%zY)BP{cMxs3c diff --git a/tek4010.c b/tek4010.c old mode 100644 new mode 100755 index bedff76..f4d1c9d --- a/tek4010.c +++ b/tek4010.c @@ -25,7 +25,7 @@ */ #define DEBUG 0 // print debug info -#define DEBUGMAX 100 // maximum number of bytes to process in debug mode +#define DEBUGMAX 0 // exit after DEBUGMAX chars, 0 means no exit #define REFRESH_INTERVAL 30 // time in msec between refresh events @@ -65,6 +65,10 @@ int isBrightSpot = 0; // set if there is currently a bright sp int count = 0; static int x0,y0,x2,y2,xh,xl,yh,yl,xy4014; +enum LineType {SOLID,DOTTED,DOTDASH,SHORTDASH,LONGDASH}; +enum LineType ltype; +double dashset[] = {2,6,2,2,6,3,3,3,6,6}; + static int plotPointMode = 0; // plot point mode static int writeThroughMode = 0; // write through mode static int debugCount = 0; @@ -146,7 +150,7 @@ int isInput() ioctl(getDataPipe[0], FIONREAD, &bytesWaiting); if (DEBUG) { debugCount++; - if (debugCount > DEBUGMAX) return 0; + if (DEBUGMAX && (debugCount > DEBUGMAX)) return 0; } if (bytesWaiting == 0) { // reset the baud rate counter @@ -340,7 +344,7 @@ void tek4010_init(int argc, char* argv[]) setbuf(putKeys,0); mSeconds(); // initialize the timer - u100ResetSeconds(1); + u100ResetSeconds(1); } int tek4010_on_timer_event() @@ -425,6 +429,7 @@ void clearPersistent(cairo_t *cr, cairo_t *cr2) cairo_paint(cr2); isBrightSpot = 1; plotPointMode = 0; + ltype = SOLID; } void clearSecond(cairo_t *cr2) @@ -436,9 +441,40 @@ void clearSecond(cairo_t *cr2) cairo_set_operator(cr2, CAIRO_OPERATOR_OVER); } +void tek4010_line_type(cairo_t *cr, cairo_t *cr2, enum LineType ln) +{ + int ndash,ndx; + double ofs = 0.5; + + switch (ln) { + case SOLID: + ndx = 0; + ndash = 0; + break; + case DOTTED: + ndx = 0; + ndash = 2; + break; + case DOTDASH: + ndx = 2; + ndash = 4; + break; + case LONGDASH: + ndx = 8; + ndash = 2; + break; + case SHORTDASH: + ndx = 6; + ndash = 2; + break; + } + cairo_set_dash (cr,&dashset[ndx],ndash,ofs); + cairo_set_dash (cr2,&dashset[ndx],ndash,ofs); +} + void drawVector(cairo_t *cr, cairo_t *cr2,int x0,int y0,int x2,int y2) { - // printf("write-through-mode=%d\n", writeThroughMode); + if (DEBUG) printf("******************************************** Drawing to (%d,%d)\n",x2,y2); if (writeThroughMode) { cairo_set_line_width (cr2, 1); cairo_set_source_rgb(cr2, 0.0, 1.0, 0.0); @@ -448,6 +484,7 @@ void drawVector(cairo_t *cr, cairo_t *cr2,int x0,int y0,int x2,int y2) } else { + tek4010_line_type(cr, cr2, ltype); cairo_move_to(cr, x0, windowHeight - y0); cairo_line_to(cr, x2, windowHeight - y2); cairo_stroke (cr); @@ -477,6 +514,66 @@ void drawVector(cairo_t *cr, cairo_t *cr2,int x0,int y0,int x2,int y2) isBrightSpot = 1; // also to be set if writeThroughMode } +int escapeCodeHandler(cairo_t *cr, cairo_t *cr2, int todo, int ch) +// handle escape sequencies +// returns todo to allow changes to todo +{ + if (DEBUG) printf("Escape mode, ch=%02X\n",ch); + switch (ch) { + case 12: + if (DEBUG) printf("Form feed, clear screen\n"); + clearPersistent(cr,cr2); + mode = 0; + break; + case '[': + // a second escape code follows, do not reset mode + break; + + // start of ignoring ANSI escape sequencies, could be improved (but the Tek4010 couldn't do this either!) + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': break; + case ';': mode = 31; break; + case ']': break; + case 'm': mode = 0; break; + + // end of ignoring ANSI escape sequencies + + case '`': ltype = SOLID; writeThroughMode = 0; mode = 0; break; + case 'a': ltype = DOTTED; writeThroughMode = 0; mode = 0; break; + case 'b': ltype = DOTDASH; writeThroughMode = 0; mode = 0; break; + case 'c': ltype = SHORTDASH;writeThroughMode = 0; mode = 0; break; + case 'd': ltype = LONGDASH; writeThroughMode = 0; mode = 0; break; + case 'e': ltype = SOLID; writeThroughMode = 0; mode = 0; break; + case 'f': ltype = SOLID; writeThroughMode = 0; mode = 0; break; + case 'h': ltype = SOLID; writeThroughMode = 0; mode = 0; break; + + // todo is set here to zero to achieve some synchronization with screen refresh cycle + case 'p': ltype = SOLID; writeThroughMode = 1; mode = 101; showCursor = 0; todo = 0; break; + case 'q': ltype = DOTTED; writeThroughMode = 1; mode = 101; showCursor = 0; todo = 0; break; + case 'r': ltype = DOTDASH; writeThroughMode = 1; mode = 101; showCursor = 0; todo = 0; break; + case 's': ltype = SHORTDASH;writeThroughMode = 1; mode = 101; showCursor = 0; todo = 0; break; + case 't': ltype = LONGDASH; writeThroughMode = 1; mode = 101; showCursor = 0; todo = 0; break; + case 'u': ltype = SOLID; writeThroughMode = 1; mode = 101; showCursor = 0; todo = 0; break; + case 'v': ltype = SOLID; writeThroughMode = 1; mode = 101; showCursor = 0; todo = 0; break; + case 'w': ltype = SOLID; writeThroughMode = 1; mode = 101; showCursor = 0; todo = 0; break; + + default: + printf("Escape code %02X not implemented\n",ch); + mode = 0; + break; + } + return todo; + +} + void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) // draw onto the main window using cairo // width is the actual width of the main window @@ -500,8 +597,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) first = 0; if (windowWidth == 1024) efactor = 0.0; - else efactor = windowWidth / 1024.0; - + else efactor = windowWidth / 1024.0; } long startPaintTime = mSeconds(); // start to measure time for this draw operation @@ -534,6 +630,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) } if (plotPointMode) todo = 4 * TODO; + else if (writeThroughMode) todo = 8 * todo; else todo = TODO; do { @@ -557,6 +654,10 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) if ((ch>='0') && (ch<='9')) mode = 30; } + if (ch == 27) { // escape code + mode = 30; return; + } + int tag = (ch >> 5) & 3; if ((mode >= 1) && (mode <= 8)) { @@ -623,7 +724,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) } else { if (ch == 29) mode = 1; // group separator - else if (DEBUG) printf("Plot mode, unknown char %d, plotPointMode = %d\n",ch,plotPointMode); + else printf("Plot mode, unknown char %d, plotPointMode = %d\n",ch,plotPointMode); return; } @@ -739,68 +840,18 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) mode = 5; break; - case 30: // handle escape sequencies - if (DEBUG) printf("Escape mode, ch=%02X\n",ch); - switch (ch) { - case 12: - if (DEBUG) printf("Form feed, clear screen\n"); - clearPersistent(cr,cr2); - mode = 0; - break; - case '[': // a second escape code follows, do not reset mode - break; - -// start of ignoring ANSI escape sequencies, could be improved (but the Tek4010 couldn't do this either!) - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': break; - case ';': mode = 31; break; - case ']': break; - case 'm': mode = 0; break; -// end of ignoring ANSI escape sequencies - - case '`': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'h': writeThroughMode = 0; - if (DEBUG) printf("normal-mode activated\n"); - break; - - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': writeThroughMode = 1; - if (DEBUG) printf("write-through-mode activated\n"); - mode = 101; // ignore until group separator, not yet implemented - break; - default: - if (DEBUG) printf("Escape code %d not implemented\n",ch); - mode = 0; - break; - } - break; + case 30: + todo = escapeCodeHandler(cr, cr2, todo, ch); + break; case 40: // used to ignore certain 4014 sequencies if (ch == 31) mode = 0; // leave this mode break; - case 101: if (DEBUG) printf("Ignore until group separator, ch = %02x\n", ch); + case 101: + if (DEBUG) printf("Ignore until group separator, ch = %02x\n", ch); if (ch == 29) mode = 1; break; - default: switch (ch) { + default: + switch (ch) { case 0: break; case 7: // bell function, delay 0.1 sec // cannot delay if bright spot is on, needs to be turned off first @@ -824,7 +875,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) if (y0 < 4) { y0 = windowHeight - vDotsPerChar; if (leftmargin) leftmargin = 0; - else leftmargin = windowHeight / 2; + else leftmargin = windowWidth / 2; } if (!argRaw) x0 = leftmargin; break; @@ -834,10 +885,10 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) case 13: // return mode = 0; x0 = leftmargin; break; - case 27: // escape - mode = 30; - // printf("Starting escape mode\n"); - break; +// case 27: // escape +// mode = 30; +// // printf("Starting escape mode\n"); +// break; case 28: // file separator if (DEBUG) printf("Point plot mode\n"); mode = 5;