Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!uunet!seismo!gatech!hao!ames!ucbcad!ucbvax!hplabs!hp-pcd!hpcvlo!everett From: everett@hpcvlo.HP.COM (Everett Kaser) Newsgroups: comp.sys.ibm.pc Subject: CGA320x200 and EGA640x350 graphics routines Message-ID: <1610021@hpcvlo.HP.COM> Date: Wed, 22-Jul-87 13:40:47 EDT Article-I.D.: hpcvlo.1610021 Posted: Wed Jul 22 13:40:47 1987 Date-Received: Sat, 25-Jul-87 07:33:51 EDT Organization: Hewlett-Packard Co., Corvallis, OR, USA Lines: 470 I've received many useful things from the net over the years, so here's something to help balance my debt. This is (very slight) documentation and (very voluminous) assembly code that does graphics in CGA 320x200 mode with 4 colors, and in EGA 640x350 mode with 16 colors. The routines are intended to be called from C (Microsoft 4.0 flavor), but with fairly minor modifica- tion could be callable from assembly, Pascal, Fortran, BASIC, or whatever your favorite language is. The only things that are language specific are: 1) the structure of the GROUPs and SEGMENTS 2) the underscore as the first char of all public/extern labels 3) the way function arguments and return values are passed on the stack All of the functions operate the same on both CGA and EGA (given the differences in number of pixels and colors available) except for the SETCOLOR and BPLOTXY functions. With those functions, the arguments mean slightly different things, as is mentioned in the (brief) reference card. The capabilities supplied are: set the display mode (SETMODE) set the color palette (SETCOLORS) plot a point (PLOTXY) do a bit-plot (a rectangular array of points) (BPLOTXY) draw a line between two points (LINE) draw a horizontal line, same y-coordinates (HORLINE) draw a vertical line, same x-coordinates (VERLINE) clear the entire screen to a specified color (CLRSCREEN) fast label a string to the graphics screen (FLABEL) set the random number generator seed (SETRAND) get the next random number (RAND) turn the beeper on using Timer 2 gate (BEEPON) turn the beeper off check to see if there's a key in the keyboard buffer (ISKEY) get the next scan/ascii code from the keyboard buffer (KEY) The reason for HORLINE and VERLINE is that many of the lines I draw are vertical or horizontal, and the algorithm for doing those is much faster than the general case, hence extra code for faster speed. The random number generator is not the best in the world, but very reasonable (and fast) for most applications (such as games). The word returned by the KEY function is the same as returned by INT 16, function 0; i.e. the upper byte is the scancode, the lower byte is the ASCII code. The code should assemble OK with almost any version of the Microsoft assembler. There's not a lot of documentation included other than the comments in the code. sorry about that (he hangs his head with sheepish look) _____ _--/ @ @ \ / | =_= | | \----/ If you run into any major stumbling blocks trying to understand what a function is supposed to do, or how it works, send me mail or give me a call. cut off the garbage at front and end, uudecode, and you'll have the file GRAPH.ARC which contains GRAPH.DOC and GRAPH.ASM. Everett Kaser Hewlett-Packard Co. Corvallis, OR !hplabs!hp-pcd!everett ----------------------- cut here ---------------------------- begin 644 graph.arc M&@A'4D%02"Y!4TT 2^9CT /8.8DQ/4$*# ,.QHHV 'BB)PP<-"D&3,' M!)DT<^"P"9,'A)PW=>BD<5-FC@L0D @,>0,GCYPT9]#0 1$C!XX;"8K8*2.G M#)V52\+,H2EP1P)(!F;4H &C!H@I<.34&5/F*)V>/PT$82,FC)L\+$ \D0(B MQXT9,F) !8JB!HP9*;K*P-&BAHP:.<86N/-&SAH="37O#; NA-N(.% @G MS)DR"6S 8!$#K$"-=-@@)I)D"A0F0;* 2/+B"0@I3ZI02>*DR!009NJ"&'(D M" BP,/#(@ $#A%4R((JT!F&#*!ZAM<\<3+BP89LW9#KV%)C:#9T8"NBW @"Q6(8:2':7HD>A)@W-]^T:2'9 MS,HW9H!0WQQCU.2="]?Y!$D!,M%D$TXZT91 ##&T<%8+.-@PE@&IR;%:=3:T M( ,-&-X@$&M!Q!1%%=4E0%!-=-0AAQL@V!$&&W5TE)T< NF68A$K3N@B2 /L M1,=X39E1AQMC:/2&&]=]04<9>-"1P$YGM.&=E6+D,24(<-0A!AL+@7#"&,B5 M<8) 4E)II7=DS,$F&6'0$<:5962Y90)TR8%;F&.6>0*==JZIP!>$W@FGG J@ MZ<8<5F*II7-\UO6GF&2.8::CD!K*Z9MNQ,FF&'/,@:>>E/9Y::":GD#J'(9^ M\6ITH3(:D () )II E\8B:1 N6*Z$*]&HLE&78P&RRJO$N&'1Q[ ZCJLK,W2 M\6RTPH[!*YD<8;OL%VC4Q6T9WN[ZQ4QRC%ONM&.P(0>!!D*)J[3:]FK30:&N M6R^^9.C+JQAEE ''D_[*&O# 9IA1L!D3 5A^N$"R&8YW'C)X#CBD N,AND"DEW0ZRFF8 M8?KE CUD1AZKHW&C&;+CX=#F"MC.!NZM5P3[R7:D$6>>J]\J\AQK>-S4Y( O MOX:ID[]E@T,OMP=?@B"@X:!MX=%!ET.MF^&@<]DYYQ$(8\A8DW-L5)3$"6V M4,<<&YTAH/<@[.0H;LVAPT>2H##LY $C(+B#5>CS!OOM9']) @^DLG+ .G0O M##,14 -)9I7#0! $1GB"$Z@0@]RL:#X0[(E]\K01-^0/! #ZH!G2(!D-KM"$ M51B4#6. H).U+GW/$0@'Y6 GN4V.-FA@ 1*5"(,D+O&)362B$YN8@"%9!U=' M+$(28Q!%& S!B3+8XA>56 ,GWL")9016%K?8Q3'"((R,<6,9E0C'HJ!!C7*+ MP1BY*$8V]I&,8$3C';&8QSU&48]^C*,9 TG'0=X-D8PYI"'_"(,@.-&22CPC M'JNS1SC&0(N,J2,-!*E$&PARDY",@2<[2<9&-A*5ATPF)8L) UB:\I5HJ")!N(C*&%Q2EU-U\YSF_V49&?M*)[U1B/F%@ MRGDF$IW&A&0L&3E05-92E93L(BR)Z*4([.T8XI+:DT03 ;5'H2DS%X9DN;2^C2J$Y.:U8P& M-9R'/&H,N!J#.5)HJ0-5XE.AR9AVOO295.WG+%,IR::2E*=L/C:; M4@PM%-$*U](ZT;2BA6L344E6KKK3L)\5[6IG^42QL'[G6EA 4EL5UK&.'>\0]XA23,!#K<[4JQ7.B%K+"!>UHK:M8QA3WN]V= M*A6'1!2KGM:DZ%6B8^'J1N;*K;;89 QB<[M=VBHTOC&8;UX_>\[8CK:4Y]WF M*/NKW4/>U;_\M6^!%PS@!B.1P"55;X !ZM1_NKZUM\6=<7IK M# ,0GY@Q&@[R%C7\X1O/]:[K#:\;I^SDNQ5YR5BV,9*S?.7JTO:;-'8LE%&L MY0]&UZX+C>:0U(,FPT,VOPRV,S$K7.*V;O% MM0)ZC8Q1[H1A>5\O6_F;$QWG%LU:3' >MLJ(WK"F>\MD+E^8KYK6<(:S'-P0 MCYK.J*[PELO\Z5.'FM2BQG0>@5SH+7X3O#QVM$-IG>I;UQK52)SI#2J;Z21O MD:R=5J*)49GL3@^M[4?&6FR]M:L9HUT13_=;+'V%MG0AG&S]_U;7>?1U;%.-:Z#/20<$/N] M ">U=*G;[0DEO*W'?K:_,4QJ0PLYT?UNN)_GS&TJ<[R]>^7WJE_-ZI!+G.25 MC*_&Y3WIEN=ZK%N;@X [_ M=;J5KN2)+U&<,3+7K=,1_.M6)S+:\WCNAVO:R'ONMZ8'/O?J*%K99*ZQW(L^)"XBW>VNYK75 MJ\[,/=[5XQ3&^YF?V-LP5WO(6D1EW4^>[*J[N>=J!KS3[QSTOV>=R)F?Z[F_ M+6YRMQWT;P[]XD,\E;VN/4A+U4?*Y_Y@6]^U6LO\I3O]_FAM7U9 -)R(1"2%M/Z!8L< ,RL(5=R(4LH(5(5P-5&(-6 MJ$J+885G.!M7:%DJ:(5@@80]V(5K.(/G)(<[."(LL(-)^!YWR(-QJ$H_V(4\ MZ(=SE80\F(A)B ,J2(9RB'0\Z(B,*(>*^(@U.$U(UQMS*(=+:(:>V(9'](0S MD(2CV(-)Z(B:>'A/^!ZKN(IWV(B+N!B56(BO&(:(V$Q*N!A'>(1C6(90*(A0 M:(6.F(DZ6(RA9(P&%TIVB(6Z*(4LD -=F(PO"(FGZ(MU&(Q->(A9F(1@V(U= M*(:72%-(=X2H^(G J(;9>#>\:(M>V(Y@*(:;1([6^(G"V(?QR(KEB(WL.(YI M2(_^N(_W^(3HJ(_#N$F:>) J>(YON)"@*#=Z^) J")$L&)$4>8>L^!8UP((U MD)&LB'1Z6(J!J$J;&(AZ2(-#0EF;))$/N9$:F9$JV3;,V(H=V9 )$(,VN85:(A6YI,W28LQ*8LE*9,6Z9<_V9).0 MJ(>>R88J^(8Q2)EWTX*+>8P$>9=NZ)9R&(?"R96SE(^I.9"X.3G&:8:ZB),4 M0IQ]*8M]^(B'&8K2^825&(?CZ)RD2(B+V):@B99Z%I.?*90=:9!E&9?!28?+ M>#?+R9W8Z9O*Z8N3B ,V:89OR)?SJ8_G^(_A21 V8!1!8%/]^(ML.)!+V9AJ MR) '>9ORF4<'^H\(RH:QR: )>: ,^9E..)9+.9:I*&S$2)8BJHF/J8;Z*3<# M>8TIFH[[B9F4F)G;69MM:9L .4M6"(;)Z)1[V)ITR*(H:J$CFJ$E:9 [" ,V MF9@T.I"9:(Z2.8DE^HD**J&?F)P06J!KF(9 :I($87";])Y6Z*1;"9<1:J#& M"(96&*4BZH@T2J43HI>(^*8ORI0V*J6]29,K"H5!"9AWIV= M"(5+&JAQNI=.:)I1*:*?&8Y'YX0Z&JE)**GF>8>:&(C?R9A.*)*<2HB>6JF5 M6: S>:+5 9;8.:0VFI[?.:J%J:9'&8RD.I;V&87\2:&%F898.J*D*J-:^*2P MJD3A:'BMZHL*6:-W*9W^)5Z>),MJ(I$**.E MB*IW,YRF.)26.92EZ)&FZ94XF:V%R45("IGN.HG+NH=%:J50&JS %YWL>*=L MRHH=FH>YFHK#VHZ2")Z%20.U&8/@JIV%^8*:Z*H)^H?)"J?J&:]W^H[0:9WZ MF*M$S5UHBBU$BV& M02X*(!!8>RA34B53LR59F[4$X2MI@@)(D@*W[F9*P6B6P TD "P M(1NTL1J8J[E]*[<+4@.N.QNP6QNA6[N1NR VD!B+&[N]JR"_6P PX;F,Z[CM M<1QN\ 8DRS64A%G\@8:#!%I\"0G@!I+TB0S+"\$@0+M(P?O$QD5(1\Y P<# M0T1H T-N$#_V41$$'+L'G,#$P1#BD29IF0(]="O!8KY^:SJAV3\8U!3]&R9: MK!P5H\6B,B\D$1V,,@9G$ 8B(S'2,P?DBRN2<2'[#,!-7!MOXR'%DQP-) 5!T 0?D1LCXT@?8R6)W(/A" >4'((7 MU! R8!]I0 =S<#0A6 8X3#A(O,G H@9Z<"5MP ;0T<61["&IO#ZQB[AZLP8N M$RKL \-UT4,)@,AL@,M=C!X/-,C.TQ"/W!3W<\3D,3CZ@SK/' -X4X\CA83TCS#S#S!++W,R=3+K2 MK!IE,,M@\@:ED@9CTA0=O1+.$\M&4!0R/WL1UQW1 Q5!]/ M3=&MV\6#O,Z$30='TT!= @)!X 1$\$+U$<=C[;?C# -C\-=HR<&*'<+5HLGJ MS,WUL\XC4E M4P8L@"(SE1P4;N$C_#4<(2!Y@,D>WAJHLQ1,42I*P@;IO1%6PD<@+N+RRQCA MS3+H"RPP(A %WL;IO>#&T^ P$ 8P<)9X%K8V42/&$]L6X<:$C2H,E!LTKKXA M/N*S##8LX",S!3IFP!'/B]5RSW%XLWOPL/(;B19D]W(8A-_'N3U"PJ^_OPCUL'"'SONQP*[<>+.[O4MCVL=+; MC!OT?K9^NQ*!.[@)4+B)_M M;?'(KCTM4%;@JR $4!MCLM)5=#WVD3ANT*8@ M0"8IL1(UT2^U:[WV@2.(D0 W ()I!!3,B$S,/,HH1(C?!C.<=,Y_\O"$3 Q M7Y- G\"T,R$T ()KL%O< =C00!%/P9Y8!55E - 3_-(/R8Y,B%&<0="S]4G M4?-=?_4W7T7R;?8K\?3>T?5&(3)*;R<34D)VSSYAK\,U* 2&B[@8#<@H$ ,] M /96\0)\OR5A\ )L'\Q- 0,]@/=N\ (W_P)B //@F_ &+\=POL5G_L43OS<5 M#_%_?NB,<>95CM'&PQ+ML1.2T21@,L,5R5[N/U#N@S51-H@BZIS](8X=+(WOKL7>BQ/_*S7QLH /+9+_+2 MWOOK#7;"#_&Y;_Q?HB3TGD>E#-BT +PC\,$T[1M3" [;O_# M->RY4NPG0Q#5\BPH,+]8\=)UP_MGRR;5\BS4?C_6WOI+H^U9'$WX4_H/\>=C M,+_G?K_KCL!5C@>M/[_GGN[KCL!5GC'K2P;S>^XK@ /KCL#?+^WE/K_GO@)< MM.X(7.5U@]_K2P:*_#"X\ML:G"N[_##1_Q"DCC^D7N2X,NQHBP=G"05)@ 5% M8+AQ&[D8K=#/SM;\!!=P )D$.]#$LKLS^,"#1$201&$P<)4 M$LS4GL9GC/]/H0!P\"S['MI;\!!=P )D$.]#HAJR']+DD[<4L9Z&]I;\!!=P )D$.]#TB%, ML=!E< >+#=^,GN9ZN\RH7BU4$LS7X;W/'8+\#N_1T<8B P?74L;1I.!A[ND, MGB>E3P:F4^BH']C\2\)9>R5H$._M(N2X8K[QWBZO[_TK<2QGL! W D.8?!#* MSQYZ[BATR.4SB1J@P?E M/L[M0M(9H3;S>R-9JS;&K#9X4.[CC ,DG1%J,[^D[/U>+=C20^E,HC9X0.KR M._W&'.*9'-C\2\(DG1%J,[\WDK6^+^)D,+\S, 8#MNT!+ ,DG1%J,[^D[/TK M(1%6 <8DW!Z,#L@E%-C"#-?.3NE,HC9X4.[CG,_@_OW23M(9H3;S>R-9Z_MT MS@)-LP4/L>XS7R=I3=T=GBBH(4%/L>T!+.AF,.4[#R?PO=!E< >+#2RV/0=B MH$;&K#9ID+6^+^)D,+\S, 8#MNT!+ ,DG1%J,[^D[/TK(1%6 <8DW!Z,K@R-9 MZ_MTS@)-LP4/L>XS7R=I3=T=GBBH(4%/L>T!K*4S_P9GL! MT"%,L=!E< >! M'""!+MR$^1B8#I#LA'HLA(5 M@2:6UW++]GG@:)GE,JD#'F&^]!+A:X8K[Q'N30,23R MF^B]H0(9P\=I<\?R>^9ID.@YI0(5L0*\00,J4!&(:W JD#'V/":O/R3(T<<> M4@8S8=^_32/C\NK-G/ B,S!D@/-^2P9I<\>S(>5#XL> S.C(@1M5X09K($1M M+#(#0P9DL.2_/[]C8#K@7N5XT )H8BG 8KZB/+]B@2OF*\KS"QU#(K^)C@POLW0P9I<\?R>^9ID.A^#,@Q),*.8B<;\4+/'8(W M$RH\4]8S)3$"$]>V009D$-/)8K[QWBY"CBL7X3=DL-_Z^_W2ON<-Q!YM, >! M+*S)P\"Q+_OOSZX."$>MR$^1B8#I#LA'HLA(5 M@2:6 BSF&^]!+A:X8K[Q'N1B@2OF&^]!+A:X8K[Q'N1BL>UW++\IG@:)GE,J MD#'F&^]!+A:X8K[Q'N30,23RF^B]H0(9P\=I<\?RF^)ID.@YI0(5L0*\00,J M4!&(:W JD#'Q.[]C8#K@7N5XT )H8BG 8KZB/+]B@2OF*\KS"QU#(K^)C@@XH-:6[/E>POO 8KZB/+]B@2M\G#9W++\IG@:)[L> '$,B M["AVLA$O]-PA>#.APC/S"Q-#(C$"$]>V009D$-/)LKXDPP)D$.^%COKT[OLB M3@;C;'".=!%^0P;CW"XS%2;##_YND!KP;1%'OQ(2,3))HAK/'8)_WBXL0 93 M[L495#?X/>RY4NPGH]O5\BPH,+]8GQ7><_26G4#&LQU9H_B)B] !\KS7329#[099,0*U\4/&0B9# M+2_4PL+/0NWW8^VMOS3:SC-L@/-9'$WX4_H/T?KS>^[IW@5_/@;S>^[WVP5_ M3@;S>^XK@ -=4.[S>^XKP$5=\.=DH,@/L^WXT^WHKDI=T/I+<^XK $Q=8.JH M_N\N;N*5-=$)W]7+C.K>V]5"U,9=3>WW$TUD8#J%COH*D1(LP,')\>X:S#-M M+#)P<"W13P:F,R34'^(\@2NWP>UB@2NWP;Y+8W!2'MKM*P:F,R3HF^AE,!.; MCQRXD3BH,1%G "QUS.V@O>W2XSQM6.UJ_.>>SN!Y(A#H^RP XCP"@;[/0@8P##9+_OOCO 7X MD[_@7N4S]"Y>[26;[!!1"RSF*\KSVRYGKA#^84-HXL/&[-6"?2,HX0944_J^ MC@<3\12XYS:\PEG,+&0B9#_2BA+3W.T^L/$_V^;L_M:W!2 M/B0=PA0#WLSH^RQF !U#XC98U83[SCN@BG,(O@\D>LAWRH1%: M4NZ*'.]#@B8E@=!/@47&S#-3+N$%4@94P]JM8 M[^D)I";A009/TA2HC>B)8\@E3+=@W@A)N0#6E[^MX,!%/@2NW(=HLT#1;\!#K/K?& M7,(I;"QD,M2/$MK2XSR]_C#1[^OVW+X&)^5#TB%,,>#-C+[/8@:A,R2WCO7C MO>M-LP4/T06]'N\$$'&##?M"QU#$M!G< 8U MA!QD\ )E,!,TPC"& 2SVW+[0,21E,!,TPA%5\NK-C+[/4@8S$?,$<>M8/]Y\ MG#9W/!M2/B0#0?/PA%5(A#H^RQE,!-ND-XY M8T1IP!AF( 941! KX0^I%CBO#?K8"X;U=3>WW$TUD@ ?OKL'1T<8B P?7LNUCP@)D M$.^%COJ!S;\D3.ID8#I#0OTAGLD*D1*4?^7EGD1D,.7=7!()9#S;P?TL0 ;Q M/B1H4A+=8]=P7\;1I.!A[ND,GB=_WBYM:,_M:W!2/B0=PA0#3O!M+ :A,R2W MCO4*'N;M0FOQ+'<@8+ M<2,PA,D'H?SLH>>.0@<7H<$\H=Q,HC9X4.[CW"XDG1%J,[\W(A#>*P;T_.?M MTNM3CL!5SL%DH-@QI,M-(B/XO>LDPP(D4_H/[]6"+3V4SB1J@P?E M/LYC0M(9H3;S>R-9Z_LB3@;S.P-C,&#;'L R0-(9H3;S2\K>OQ(2815@3,+M MP>B 7$*!+R4SB1J@P?E/LY;@#_Y"^Y5SA%5HM:\3._AG!%J,[\WDK6^ M#^3CW#1;\!#Y.R03,>^(3MT=GBBH(4%/L>TBK.8>TC1;\!!=H$2K/B1;SXC9;MOOVX\KRV'.]#LA'H\A2X@A&2,[\WDK6^ M#^3CW#1;\!#Y.R03,>^(3MT=GBBH(4%/L>TBK.8>TC1;\!!= *P$<2QGL! M MT"%,L=!E< >!'""!+ M>Q]W 2R>S#+>*P8S0.IB@ >D_A W0P9I<\<&-U,KX0^I%CBO#GBO%?C($,2XH4#D4% -9(1L4 MU(40#]/EP?MGRR;C0NWW8^VMOS3:_N=6H^8>DCKS"QT$L1&"K3NI4R,WDB-_ M;C5J[B&I@Q7001 ;(=@5D3HUZYL\QN M(#=G@!^Y<^ !(AL@X .(6SG PA&%([]G+8)-$>Z5TP*R 2P<43A6H^8>DCJF M,R1OW!2IHSN(6_("<0;XD3M+'N:YT^M^[IGK_@ M7N5YT )H8BF,'2!P,C \GBSKFSDL0 9X\.=C,+_GO@)ZRDS';+3=G@!^R0SM=?.M8_\L^@+B9 RP<43ACP,6M+H)- M$>Z9TP*@ RP<43A6H^8>DCI53Q!OW!2I4Q&(6_("<0;X(3L<_^>R@Q5CP,5H M.0>H+SL5$08*1#'E/K_GO@*JE+_@_OW2_N?XPP+H&XX; >G9 M3]#<\T.Y P(^@+BR4Q'H8=]3 @>Z8\E-D3H4@\7Q.[^Y$X[AGCNFCNI!/@9< MC);RD3L@X .(*SL5,>!&A-53HCI=?.L++=NX8KZB/+_1C);AGCL@\ (T]>>^ M SRNT^NF4^BH'P8*E#'8/K]DP,5H&>Z9PQQU82Q+'N9C,+^5$X[A7CG+C.KF M6QAHLB0$;>JH[CO XSKNFP8S]4.^ SRN P(^@/C93]#+ M[ 9R\[S6$HX+@AXT0@8TO!)DT$#!'-KMB[[A^.A,PC"&L4, M8QC DC,0G 8LD#OA2 ;06\)HLB0$O<1@^H/@;S*QO+#.MFT"ZQ\R1E0.UI7.2X,NQG&SM8/24EL>2_/[^R M0SM='.ZRDS'F*\KS&\UH&>ZR4Q$O0%-_[CO ,SN];CJ%COIAH$ 9L[YC,+]B MP,5H&>Z5PQQUD3A+'N9B,+^9$X[AGCG+C.KF6Q# =X\>X:G #C0@;X<3-DD#;XPP*Y$XY\C!N"S>AHLB0$;>JH M[CO ,SONFP8S]4.^ SRN P(^@/C93]#+[ 9R\[QK'HX+@AXT0@8TO!)DT$#! M'-KMB[[A^.A,PC"&L)4_EV,R0+@AXT0@8T;/,=4>4,8QC DC,0G 8L(#NTT\5D +TEC"9+ M0M!+#"87@4,8QATL_65+QG\CNIB,+^@L\RP;@;I MLLRH3@9/8K5GRSTA(09XT .)HT(A,09XT/@PK$(AT;[]DP99(0;SRSZZ8[X8 MP0:X\;Q>_3P[?1$)CO.W,BYD@!_4?C_1- 9X4/IB@ >ECS^E7^3;3@;C3.^^ M+^)DD$1U@]^_K<&YLLL/$_U%'OWX0^IB@ >D/@9X<.]/0>R'P3WADBY@@P*5 M0T$QD!6RT>S(#M/EP?MGRR;ADBY@0^WW8^VMOS3:[OLB+@;S>^[WF[_@7N65 M\^>5PP)B@ =_/@;S>^[IGK_@7N69\^>9PP)C@ ?E/K_GO@(XD+_@7N6R\>>R MT>MX\.=D,+_GO@)ZYL\QN(#=H< ;XD3NV_D.R 0(^@+B5 RP<43CR M>]8BV!3A7CDM(!M_3@;S*QM_7CDL0 9X\.>RP0)B@ <"@09G@!^YL^-,8OI= M/ )P30;XT1",?@HGSNVH4 9@^WS.P9 MNW1L2)VK?\U_].X_4=;;K(E$&!<;/P6W$_$&><& M%1]--D;F&6AF:JJ=>7 M8*.5)AA\\M%G'WZW^:=;?V_]""!O AY8X(&^(:0&<&@P6!Q"QR6WG)/0O0'B M6::I<9V&'*:H%%,%6539>2\B*.,8*H4A&!QIX%$&7Z'I>%]^!@+E(HR,G5%-8I@T!DR]_AILC::-M%%''X6$D+2MGI224PFT]%*(U]8D$TXZS<'3 M01:]U%"V!:I+F4DQR&CN=J6=D89"?$D76!ATI/%&8J&QVIX;=*#&4&#I=O>N MD-*2P=$,3:&!:Z15M54''3%QE&0"43H\<6\26XRQPY(JK;,S--'!UD2$?W QQO3BD;+/ MHQIY=$7 M&9\=?9A*9M"1=P)%'S:FX""$/&,+5[(RGF$S MM'+$/++&K[O,PITRWD?'LJ+5(8?0!,_';QAVI2&'TQ,K'BPXOQ'+H00H:A94Q]Q3-0[= G+YLQ+U@Y@Y[=]! 8^<"@ M>GW9&OFTARGNJ0]\G1'?=LAG$;_51D8#*1J*C&>[](7+9W!A7V?M;4V"0-*5D-PB1ET1Q0W M<=VE.):I",$.<9U*P*=<=[*'G*Y#(O+*3!#R(:F0R$0[5)7K_#<'E=4D-P4\ MH(SN((?"!&LO*+P>%*OVKZ:8[WAYLIK-=)>S.B).#(8D"HF^"P\N-$.M"1#3$;WX+3.(2 MS: __MT2B@ 4S!0-B,#!J(2!H7D@^:H'S K:,IAPR> ;-DBSY'GP/LT+8?3D M0T+4@."$GDLA+VFYLQ=.#02[I"%";(B\!NK0E+\TV2V%F9GV\:N(1TRF_>B M/V8VL7]TBZ(TT4-%8EKQ7ED$TQ:[:$!NME!3V*G#WBKGMLYX4VAM4*CC9CC. M^LT-,<$B) CNH!WA=65:):6:WP C&,C)+:*@$]T9]S9(&0D.!'EHVAY/]@8R("T MNQ0KMZ0E6]4*-*1[ZVQD$P") 6 VB=4::@+L< :_>,0,>3#JV?(@ Q#XH =; MK2%/*(,'WOH6!&\R5VFWT]@6,'>U+/CN+2'KL?%ZE6T'(:YQ/Y*'R42IL]:M MRPCDN=+#V(V1CO0=>^-2W=XFSUF# HE>[L"C6U9NL,_DB'B'!QM])N0Z7XC( MLF!%0+&,X2%H)G4,)/(5J[?DHGO M;I*3G3RF3E,9BI*,8H>DB.HIU_E*Q4C'8PSU\L%>,4D&2]=C%?6RR6A1"XM\ MM+'%80R: 6R:#I@;F\Z$I@YP@$-@0" #&/36F(0<'9/# &8Q R5U6TOJ'GM< MF7,C8NFQXS2L #NP.A1C:7W)NU,;UIXGVIR64PMXCR"JUL@ G6 ^/9YV8;"B'0MHRT;UWH:EOPVD3.]K;3NW W3YG2ML4MIC7-:4]Y.MM9 MN@Z[4>UC,*VZ:5>.:#3]O66ORKJ!(!@XR0V^N(3; 6X,O_C#@XWO2DG:,@.4 MR\715 8U+:]-;T*ZG^D$[C+%Z.):W#B@&FBWL8LIVFF8=LDI>'*>,5G;ITXO MU%TNIDEG_74X/O:X9W[N3H.HQS]FW:?QSNBR>K+#(YY5K22"XF?N*I.^ M;- M.OE,9=TS\\\ZK8%5S-Z/N7A;,(:)C&\YKAJ;ZS$)6Q>\8K^P>.$.!/6ZUT+Z MXF9^^0M@B1'8: AF,)443Z*7 /R4 M23D4&$XT3N=3,NHS3+AW4,9D1,A4/TK$4$SD3$^4@1-5)A6%>Q>%16D7@E[D M48 F'WT;FDH;VG85DSE1'#P5$Y15J+! M!OLS!D*S0"BP0HZG %^ )G>8AVZ@5M_BAG7U5G'U%&Q !JE'5Y,%6H>U5WW% M4C;2B%0W/$U#+C;V;:\1=_)V4Q$6!A-&$!6F)&Y@%*S"=6IR$!^FBOKV1!K# M,^YB5T(RBQQQ)+S!$0B&'0I#B^W2B[<(*;IE5PTG!G60!HN(702C/S$5401X M@[98B\ X1KDH6#-(4C&0 QDD-%+A-&\P!W?@;I>XALK!1R-2;V_H2:XX?V*D M==<%>@MX6RM#%=IG?D/F@Y@D@^I#19TA-B" &@S%-)Z!-O*1>_C">_O2+_^" M&!3(@/(H+BS#?.K3?1KT@RFX2>+'>=)W@,Z72/<$26!4D?GXD)]5?Z7D?1>9 M2ORW2O_W2@,82]FCC]L'-(M%B::!CST$3-ZB>N4X/)4C U'36_U8!VT@!F,F M20?'D +C=MOGD3+B@9^132&X32')C=@1'W,@!N[F1B18?B:8?[>W@OZW3B#0 M3B8$@P7X41QY?^5AN,8;SW9AN@H-('D5%!U*E%U*N G!Y6! N92!F1 5I5I3@53 M&2#0 @"(F<[1!B O.UF8Q(F7XX+Z:Y%HUHB,B"B.B(+:RE5UUP$"" 8[H% M7[W9F[.V-:QI-6(V!A^1!IS)FZ1SBMAQ(J@3G)W16RX1+*;2F]BB9,N2 -)9 M%]GE%+T)'PD@ S$ $]T) M2I77.0!TY3!JC9+RD%/>8R!H=A LR)FQU17>?9 M6S'P J(% R0AJCO3&G) 9 MH>?Y%_P2H'H1.4O!!FNP1W08FRC@F:Y9%[$YFG9Q(O"#/P\4FV^ FFY E$8I M!W6A%]N13'*0!U^%!ST@$&U@*CL0H56S(86A59W5 S)*HS:*,"F*G@-P%VV0 M$I*!G@5@HFFP C&0 CT@ S80 RJ@I0.*$9]A S50 ^19F5\0FX3(5O76H#[# M$:PIH0IX'T[SCY5QG\C"$6 :+\*),RG1+_:AG+V$G2G1:OI)%WR:*QR!IFHJ M&[WI$8[*G#=%,E04J _$FCT WG3FVK@G*Q)''9Z5(03GIE"4W+P&4-7IW6Q M+&DA/IJTG H JA 6FW9:,)KS5&$P$ E:!IS9*7+ZG)R9GXU*7<9:JPS&$3# MG)2*:,J*GP?HF!AZ(AJ:JVC0H8>Q%Y79+7)X$%]@E&7P(0;D7FX0*6$J/&." M2&:P+)>4KM$'F9\) D)0!$4 !4_@!*/96P0J/V@T&,#J9@QY!X5A3/ Y9LWU M$ )I-X[&!G5@G8D1!%B@H\JHJR[ IN+Z(8,XF[=9FW#5L4!$0&)@ \*#CS0P M R:Q,?AI6+IY230@ RD+>,YG?<;SLC'K(.A:GL((%_2 M,?8;7?F[MOL+JT;CA*E2&__+O?Y3FP#V40.B" !WK!.12\5//86#AL,SK,PSZ\JT*L5! ED$.'&G

A.!92):O+6ZZK@&&8.Q&% E),2Q@(Q0%4(U1, M!RQ0O?(E3S5R& (KQ;0WP@WW%U(\8/C!P]#F&-:4%B-Z$&>S% 1#PLC*R"-\ M,HUA!FJ;!@T'CS.\'<]KOL)R1LB!M&* '%)W-KKCBEI5G5<[!FN RBWU&0Z6G98C2S+RG5(( M;1C'$ZF\RJ)GRV,PMO!UBKQRO^(>H73$&SB)A9W7?;A%Z !A_'6S2"" !EG3/"O5E?T&QP03RJ6* M2T<5/)4'][;E>0\T\'B.'>0&/BC MQW2''/TFQ7<#/[KR!L L3X3$IGQ]<&-+F[EB MFY/_^"MZ.=5XGEEG,P3AD7F"QK66XY&JK<@T!1 M.0Q]79G3PEZ8<$5)O%2].I<:=R=]<7;# W9!V&H6!CTC-!I1W&^@502AL&F@ M>5Z(MJTY$J/1!FP]KCV3E03.FSE W=,+02?/B(9 *"+2-GHITW;-QZ?%,Q;9@Y M%MN(83-QS!NJ)^6J?5,FY!DY8>!T'-/5[I C04#,D $##VD8#Q\;O).&8T : M(!RS>6,3)UX0'D$4 0W"!HW2,VJ@;J,:!&N.(&+8B V8]ARL6E$>)#Q79.&:EX%=':*,3C&*9LR#D>6!#$$!(HF:<:0U&F&)0T7J,T\_2LG!4XQ M=;!T'!HBA9&&'(P]-!A,Q)&1AAGQA=%"0'/5Q5Q&#HT7FWEA+&:0>B8=EMAB M>> $Q6'EL8&3$;31@9D;. D1Q!1)#($3;<:A(5<9+P64!V$PF1$&?ZT9]-1' M=81Q1G;/9;65074ER)%'($7&$G8@''E&DDOF!$="#\9W%T(Z!!00") ,$$-: M'!DTAXMUC$%''0BU9$9,(!PAQ1-50'%==R!,L5L313A!Q11GIBD#F]+5T1U? MI=@,KFW%W$IJ'J>6F5JA <+)F!8YL!"4K%$$\P\804 M"#LD!!0>4X%%%B)M6Z$;38)P16L$.KJ%G>]/D23&T&1918= M"=J++T)PG40ESI1ZY3-EA=#1^I)7$QDN4/LD+9KM<6K7'I[-$9@WK74)DP<182G8VWPRB_&"CA&%70ZR='776)09Z5[ MTNGX44A<\4230P/FA%(9 YOM^!MKI 5) 5\,G^@/7[30P@L@ -$\"%PDZ@/S M:?(!0@]?] "']);#PD!7+3P_0L!)7'GCW48+@AT(98U_(* M3CX6D!"@ 0ZJFH,/X= ".(R!#"'@4;Y:2"UJ[0!-!6"@M%8"@BVE@2IE4D! M=M #2#1A!UO,RMI(E*6(;$E)!B%)@#QR+(O!9%TO<%=6% :3RV1F,U])T<,^ M1!*3#$%X P"C KCH14$^T2)T:% 94*#(%.P@ 9 X )H,8,@$*/)Z"9A! G!0 M&AG4@#T=^Q@(@L $*" A"$ZH J&D4"-(#F"2E4P #3))&M/ #4<\QC(]!0$ M4]9H"I D "RWF( $Q &:$B ;X C'%#J,D]2Z"42?ND>.3[!"4S(0@J*.$. M;C F:EC*DISN- :PFH,<%59&%X@UB*! 8],.I;&_H"GP)UFV6M M)"0"&TYWD1.1YT2!LEBXG2\@)%YOX@M.Z/@%'!HKGFDB:%86.\(R.+8,D#W5 M0U9\V2 *E%/.GCWK"58H@A2F, 14,F&!!B>C( CEDI R8':A3B4E']ZQ+!Z>= 4YT M QKP]O.? 9WG=@>9 (0 L9V#XYGZSF/>'KA1(3AA*UYP(H,>T 8G,^@!'FCC M2N06,HQB &*ZG M=G)3(=ABE TY80P:.X&1@&,A !H1< M&7)R(2"-;>P>^]$$)IFJR9@PDP? =C0K7";0FLE3E[AXY"OK2@ML>&PPG.$( M!>Y*2U8)?;#N@J"2[GV*0G@U7X/PT[ZTP2\(.)DF- B8-@$5YGIWD-PPNAFZ M,7!PJD%@&@?+8++ZY/!U,:M>L[(WTO"E=(?+4-_[;C@Y/=@O"/K[7]%\NC\% M'G6I!\D3VIP:#ZO.PZI;?=O_[IK6!,7UI.6[ZUYG^M?Z[0Y__2L' !\[H*]4 M]H&9_9)G1SO:KZYVN2N-[5&WEW>2CF_2NGU73,M!T^$FP[B+'> !(SNSZ@8G MLR]G$_GHU WIU"=F)>E4+Y-ZW4_43X<,UF 0//A-5_L(3MSH6>HR!:%?,/FU M/YQN6S]2V_IF";_QZNO\!EO1$94& 1]$R'C' M*3.8_<-HMW>PJJY3<-G)#)"DN,N7_<2U,Q#BCG'4J8X^:A D8.XA\3M?SI6[ MKR\>ISLZRK!^"\HJ&$JV6$&!$YY A2* 5_$P&5XE67,MC7;0+A82O,.84O>V MFQTW(=$C>D*0[+UC'/9K*,-SSY[ME=")97?%S9T6!X+<3^0.!JK.&7!2Z#3Z M'E6**Q5+C)^3\KP516E( ]D,\CWE1A) +#G/D([U+..;+CO.D@Z [E6X8*8] MC,9_.R3C[O($(+\UPL41 :E_&V#]OBMT\!/5%Q$O@'W:=WXN(':VIW#$Q!T. -863Y0T561!4!H0$: ,41 end