tes@whuts.UUCP (07/04/87)
[This is part sources and part uuencodes; there's considerable resistance to putting it in comp.sources.misc, so I'll give it to the people who will appreciate it. ++bsa] There has been considerable interest in this program, and this is the most complete version that I know of. All credit belongs to other people as shown below. --terry sterkel (6/5/87) # This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # # Wrapped by sally!nather on Thu Jul 17 13:11:16 CDT 1986 # Contents: readme nansi.doc nansi.mkf nansi.sup demo.uue nansi.uue echo x - readme sed 's/^@//' > "readme" <<'@//E*O*F readme//' This package includes the source code for nansi.sys, an improved console driver for MS-DOS running on IBM PC computers or their clones, a makefile for how to assemble it, a uuencoded copy of the assembled (executable) driver, documentation describing the driver, and a short demo program (uuencoded) to show off its strong point: very rapid screen updates from multi-character write operations. The demo program takes a single argument on the command line; it should be the filename of a text file. It then displays the first 24 text lines from the file on the console screen and quits. Try it first with your current console driver (e.g. ansi.sys), then install the executable copy of nansi.sys in its place and run demo again on the same text file. I think the author of nansi.sys did us all a tremendous favor. Ed Nather Astronomy Dept, U of Texas @ Austin {allegra,ihnp4}!{noao,ut-sally}!utastro!nather nather@astro.AS.UTEXAS.EDU @//E*O*F readme// chmod u=rw,g=r,o=r readme echo x - nansi.doc sed 's/^@//' > "nansi.doc" <<'@//E*O*F nansi.doc//' nansi - enhanced MS-DOS ansi console driver SYNOPSIS Include in \config.sys the line device=nansi.sys DESCRIPTION Nansi.sys is a console driver which understands ANSI control sequences. It has several advantages over ANSI.SYS (the driver supplied with DOS): 1. It supports new escape sequences (see below). 2. It provides MUCH faster output under certain conditions. 3. It supports the 43-line mode of the EGA. 4. The darned bell is now 1/4 second instead of 1/2 second long. What a console driver does: When you, for example, type C:> type foo.txt COMMAND.COM opens the file foo.txt, reads it, and writes it to the console driver, which puts it up on the screen. Both ansi.sys and nansi.sys use IBM Video BIOS to control the screen. However, nansi.sys bypasses BIOS if the screen is in a text mode; this allows much faster operation under certain conditions. While putting text up on the screen, (n)ansi.sys keeps a lookout for the escape character (chr(27), known as ESC); this character signals the start of a terminal control sequence. Terminal control sequences follow the format ESC [ param; param; ...; param cmd where ESC is the escape character chr$(27). [ is the left bracket character. param is an ASCII decimal number, or a string in quotes. cmd is a case-specific letter identifying the command. Usually, zero, one, or two parameters are given. If parameters are omitted, they usually default to 1; however, some commands (KKR and DKOCT) treat the no-parameter case specially. Spaces are not allowed between parameters. For example, both ESC[1;1H and ESC[H send the cursor to the home position (1,1), which is the upper left. Either single or double quotes may be used to quote a string. Each character inside a quoted string is equivalent to one numeric parameter. Quoted strings are normally used only for the Keyboard Key Reassignment command. Control Sequences The following table lists the sequences understood by nansi.sys. Differences between nansi.sys and the standard ansi.sys are marked with a vertical bar (|). Cursor Positioning Short Long name Format Notes CUP cursor position ESC[y;xH Sets cursor position. HVP cursor position ESC[y;xf Same as CUP; not recommended. CUU cursor up ESC[nA n = # of lines to move CUD cursor down ESC[nB CUF cursor forward ESC[nC n = # of columns to move CUB cursor backward ESC[nD DSR Device Status, Report! ESC[6n Find out cursor position. CPR Cursor Position report ESC[y;xR Response to DSR, as if typed. SCP Save Cursor Position ESC[s Not nestable. RCP Restore Cursor Position ESC[u Editing ED Erase in Display ESC[2J Clears screen. EL Erase in Line ESC[K Clears to end of line. IL | Insert Lines ESC[nL Inserts n blank lines at cursor line. DL | Delete Lines ESC[nM Deletes n lines including cursor line. ICH | Insert Characters ESC[n@ Inserts n blank chars at cursor. DCH | Delete Characters ESC[nP Deletes n chars including cursor char. Mode-Setting SGR Set Graphics Rendition ESC[n;n;...nm See character attribute table. SM Set Mode ESC[=nh See screen mode table. RM Reset Mode ESC[=nl See screen mode table. IBMKKR Keyboard Key Reass. ESC["string"p The first char of the string gives the key to redefine; the rest of the string is the key's new value. To specify unprintable chars, give the ASCII value of the char outside of quotes, as a normal parameter. IBM function keys are two byte strings; see the IBM Basic manual. For instance, ESC[0;";dir a:";13;p redefines function key 1 to have the value "dir a:" followed by the ENTER key. | If no parameters given, all keys are reset to their default values. DKOCT | Output char translate ESC[n;ny | When first char is encountered in output request, it is replaced with | the second char. This might be useful for previewing text before | sending it to a printer with a funny print wheel. | If no parameters are given, all chars are reset to normal. Character Attributes The Set Graphics Rendition command is used to select foreground and background colors or attributes. When you use multiple parameters, they are executed in sequence, and the effects are cumulative. Attrib code Value 0 All attributes off (normal white on black) 1 Bold 4 Underline 5 Blink 7 Reverse Video 8 Invisible (but why?) 30-37 foregnd blk/red/grn/yel/blu/magenta/cyan/white 40-47 background Screen Modes The IBM BIOS supports several video modes; the codes given in the BIOS documentation are used as parameters to the Set Mode command. | (In bitmap modes, the cursor is simulated with a small blob (^V).) Mode Code Value 0 text 40x25 Black & White 1 text 40x25 Color 2 text 80x25 Black & White 3 text 80x25 Color 4 bitmap 320x200 4 bits/pixel 5 bitmap 320x200 1 bit/pixel 6 bitmap 640x200 1 bit/pixel 7 (cursor wrap kludge) 13 (EGA) bitmap 320x200 4 bits/pixel ? 14 (EGA) bitmap 640x200 4 bits/pixel 16 (EGA) bitmap 640x350 4 bits/pixel Mode 7 is an unfortunate kludge; Setting mode 7 tells the cursor to wrap around to the next line when it passes the end of a line; Resetting mode 7 tells the cursor to not wrap, but rather stay put. | If your computer has the Enhanced Graphics Adaptor, modes between | 8 and 15 are also supported; see the EGA BIOS for info. | The EGA also lets you use a shorter character cell in text modes | in order to squeeze 43 lines of text out of the 25-line text modes. | To enter 43 line mode, set the desired 25-line text mode (0 to 3), | then Set Mode 43. For instance: ESC[=3h ESC[=43h. | To exit 43 line mode, set the desired 25-line text mode again. | Nansi.sys ignores mode 43 unless there is an EGA on your computer. Faster Output | Any program that sets the console to RAW mode, and buffers its | output properly, can achieve extremely high screen update speeds in | return for giving up the special functions of the keys ^C, ^S, and ^P. | See IOCTL in the MS-DOS 3.x Technical Reference for more info. Also, a small improvement in speed may be noticed with some programs that use the DOS console in normal mode, as this driver efficiently implements the (standard but undocumented) INT 29h most-favored-device putchar used by DOS. EXAMPLES See the file setraw.doc for Macro Assembler, Lattice C, and Microsoft C routines for entering and leaving raw mode. BUGS Insert and delete character do not work in graphics modes. Graphics mode writing is slow. The simulated cursor in graphics mode slows down single-char writes by a factor of 3; it should be disable-able. Does not support erase-to-end-of-screen and other useful functions. Version This version, 2.2, created February 1986. Problems should be reported to Daniel Kegel, 1-60 CIT, Pasadena, CA 91126 (or, after June 1986, 2648 169th Ave SE, Bellevue, Wa. 98008). Your suggestions for improvement would be most welcome. NOTE This program may be distributed for educational and personal use only. Commercial use is verboten; get in touch with the author. FILES nansi.doc - this file nansi.hex - compiled version <Not supported by INFO-IBMPC> Convert nansi.hex into nansi.sys with the following commands (you'll end up with 256 extra bytes at end, but who cares?): debug # Run DOS debugger N nansi.hex # Load the hex file L N nansi.sys # Write it out W Q # Quit- back to DOS. nansi.cat - concatenated sources nansi - makefile- shows how to assemble & link nansi.asm - device driver guts nansi_d.asm - definitions nansi_p.asm - ANSI parameter grabber nansi_f.asm - ANSI function handlers nansi_i.asm - device driver init routine setraw.cat - concatenated examples setraw.asm - for assembly programs setraw.msc - for Microsoft C programs setraw.lc - for Lattice C programs rawtest.lc - example for Lattice C only -- @//E*O*F nansi.doc// chmod u=rw,g=r,o=r nansi.doc echo x - nansi.mkf sed 's/^@//' > "nansi.mkf" <<'@//E*O*F nansi.mkf//' nansi.obj: nansi.asm nansi_d.asm masm nansi,,nansi; nansi_p.obj: nansi_p.asm masm nansi_p,,nansi_p; nansi_f.obj: nansi_f.asm nansi_d.asm masm nansi_f,,nansi_f; nansi_i.obj: nansi_i.asm nansi_d.asm masm nansi_i,,nansi_i; nansi.sys: nansi.obj nansi_p.obj nansi_f.obj nansi_i.obj link /map nansi nansi_p nansi_f nansi_i; exe2bin nansi nansi.sys rm nansi.exe @//E*O*F nansi.mkf// chmod u=rw,g=r,o=r nansi.mkf echo x - nansi.sup sed 's/^@//' > "nansi.sup" <<'@//E*O*F nansi.sup//' Support Routines for nansi.sys The three files setraw.asm, setraw.lc, and setraw.msc contain routines to allow use of RAW mode from assembly, Lattice C, and Microsoft C. Lattice C is a little wierder than most, so rawtest.lc was included to show how to use setraw.lc; the other languages require no special setup to use setraw. ;---- setraw.asm ---------------------------------------------- public getraw, setraw ;----- dos ---------------------- ; Call DOS function # n. dos macro fn mov ah, fn int 21h endm code segment para public 'CODE' assume cs:code ;----- Getraw --------------------------------------------- ; Returns AX=1 if file BX is a device in raw mode; 0 otherwise. ; Returns Carry set & errorcode in AX if DOS error. getraw proc near mov al, 0 DOS 44h ; Get attributes jc gr_exit ; bad file handle? mov ax, 20h and al, dl ; get that bit mov cl, 4 shr ax, cl clc gr_exit: ret getraw endp ;----- Setraw ------------------------------------------- ; Sets Raw state of file BX to (AX != 0) if file is a device. ; Returns Carry set & errorcode in AX if DOS error. setraw proc near mov cx, ax mov al, 0 DOS 44h jc sr_exit test al, 80h ; It it a device? jz sr_exit ; nope- do nothing. ; Current mode in DX; set CX = 20H if CX nonzero. or cx, cx jz sr_ax0 mov cx, 20h sr_ax0: and dx, 00cfh ; clear old raw bit and hi byte, or dx, cx ; set new value. mov al, 1 DOS 44h sr_exit: ret setraw endp code ends end ;---- end of setraw.asm ------------------------------------------ /*--- setraw.msc ------------------------------------------------- Routines to set and reset raw mode on stdin/stdout. For Microsoft C. ------------------------------------------------------------------*/ #include <dos.h> /* Use the IOCTL DOS function call to change stdin and stdout to raw mode. * For stdin, this prevents MSDOS from trapping ^P, ^S, ^C, thus freeing us * of ^P toggling 'echo to printer'. * For stdout, this radically speeds up the output because there is no * checking for these special characters in the input buffer whenever * screen output is occurring. * Note that only the stdin OR stdout ioctl need be changed since * apparently they are handled as the same device. * Thanks to Mark Zbikowski (markz@microsoft.UUCP) for helping me with * this. * --- This stolen from sources to the mighty game HACK --- */ #define DEVICE 0x80 #define RAW 0x20 #define IOCTL 0x44 #define STDIN fileno(stdin) #define STDOUT fileno(stdout) #define GETBITS 0 #define SETBITS 1 static unsigned old_stdin, old_stdout, ioctl(); /*--- set_raw() ---------- Call this to set raw mode; call restore_raw() later to restore console to old rawness state. --------------------------*/ set_raw() { old_stdin = ioctl(STDIN, GETBITS, 0); old_stdout = ioctl(STDOUT, GETBITS, 0); if (old_stdin & DEVICE) ioctl(STDIN, SETBITS, old_stdin | RAW); if (old_stdout & DEVICE) ioctl(STDOUT, SETBITS, old_stdout | RAW); } restore_raw() { if (old_stdin) (void) ioctl(STDIN, SETBITS, old_stdin); if (old_stdout) (void) ioctl(STDOUT, SETBITS, old_stdout); } static unsigned ioctl(handle, mode, setvalue) unsigned setvalue; { union REGS regs; regs.h.ah = IOCTL; regs.h.al = mode; regs.x.bx = handle; regs.h.dl = setvalue; regs.h.dh = 0; /* Zero out dh */ intdos(®s, ®s); return (regs.x.dx); } /*-- end of setraw.msc --*/ /*------ setraw.lc ---------------------------------------------- Lattice C routines which get and set the current raw/cooked state of a file, given its Lattice file descriptor. Useful when trying to obtain high console output speeds. ----------------------------------------------------------------*/ #include "\lc\dos.h" #define CARRY 0x1 #define ERROR (-1) #define TRUE 1 #define FALSE 0 extern _oserr; /*---- getraw -------------------------------------------------- Returns TRUE if file fd is a device in raw mode; FALSE otherwise. Returns ERROR, puts errorcode in _oserr, if DOS error. ----------------------------------------------------------------*/ getraw(fd) int fd; { union REGS inregs; union REGS outregs; int flags; if (fd > 2) fd+=2; /* convert to DOS fd */ inregs.x.bx = fd; inregs.x.ax = 0x4400; /* get file attributes */ flags = intdos(&inregs, &outregs); if (flags & CARRY) { _oserr = outregs.x.ax; return -1; } return (outregs.x.dx & 0x20) ? TRUE : FALSE; } /*---- setraw -------------------------------------------------- Sets Raw state of file fd to raw_on (if file is not a device, does nothing). Returns zero if successful. Returns ERROR & errorcode in _oserr if DOS error. ----------------------------------------------------------------*/ setraw(fd, raw_on) int fd, raw_on; { union REGS inregs; union REGS outregs; int flags; if (fd > 2) fd+=2; /* convert to DOS fd */ inregs.x.ax = 0x4400; /* get file attributes */ inregs.x.bx = fd; flags = intdos(&inregs, &outregs); if (flags & CARRY) { _oserr = outregs.x.ax; return ERROR; } if ((outregs.x.ax & 0x80) == 0) /* return zero if not device */ return 0; outregs.x.ax = 0x4401; /* set file attributes */ outregs.x.bx = fd; outregs.x.dx &= 0xcf; /* clear old raw bit & hi byte */ if (raw_on) outregs.x.dx |= 0x20; /* maybe set new raw bit */ flags = intdos(&outregs, &inregs); if (flags & CARRY) { _oserr = inregs.x.ax; return ERROR; } return 0; } /*-- end of setraw.lc --*/ /*------ rawtest.lc ------------------------------------------------- Lattice C program to demonstrate the difference in speed between DOS's raw and cooked modes when writing to the DOS console. Requires setraw.c; make the demo as follows: lc setraw rawtest link \lc\s\c rawtest setraw,rawtest,,\lc\s\lc and run it by typing rawtest Note- Lattice C's raw mode (i.e. using mode "rb" or "wb" with fopen) is not the same as DOS's raw mode, and does not affect speed. What does affect speed is whether output is performed with single-character DOS calls, which is the default. To get a speed improvement, you must open "con" WITHOUT a trailing colon, and use that file for high-speed output; see section 5.2 (Device I/O) of the Lattice manual. When using MS-DOS raw mode, the console is in totally unbuffered mode- echo is turned off, no printer echoing is done, and no line editing is done, regardless of which file setraw was applied to. This means that the console must be in non-raw ("cooked") mode for line-oriented console input to work properly. Note: no speed difference will be noticed when using the standard console driver ANSI.SYS that comes with DOS; you must be using NANSI.SYS to get massively fast output. To use nansi.sys, insert the following line in \config.sys: device = nansi.sys and put nansi.sys on the top level directory; the system will load it at boot time. (If there was already a line invoking plain old ansi.sys, remove it.) --------------------------------------------------------------------*/ #include "\lc\stdio.h" char response[128]; main(argc, argv) int argc; char **argv; { FILE *fp; int fd; int old_rawness; int i; fp = fopen("con", "w"); if (fp == NULL) fprintf(stderr, "can't open 'con'!"); fd = fileno(fp); /* get Level 1 file descriptor */ old_rawness = getraw(fd); /* Save old raw/cooked state */ setraw(fd, 0); /* make sure we're in cooked mode */ puts("Cooked mode test (hit return):"); gets(response); fprintf(fp, "\033[2J"); /* clear screen */ for (i=0; i<20; i++) fprintf(fp, "This is cooked mode! Why is it so darned slow? %d\n", i); fflush(fp); puts("Raw mode test (hit return):"); gets(response); /* must be in cooked mode to use gets */ setraw(fd, 1); /* enter raw mode */ fprintf(fp, "\033[2J"); /* clear screen */ for (i=0; i<20; i++) fprintf(fp, "-- This is raw mode- it's clearly faster than cooked! %d\n", i); fflush(fp); /* finish writing while in raw mode */ setraw(fd, old_rawness); /* go back to old raw/cooked state */ fclose(fp); } /*--- end of rawtest.lc ---*/ -- @//E*O*F nansi.sup// chmod u=rw,g=r,o=r nansi.sup echo x - demo.uue sed 's/^@//' > "demo.uue" <<'@//E*O*F demo.uue//' begin 644 demo.exe M35HL`!(`!``@`$<!___)`@`(3)N%!P``'@````$`Z`*U`88'``"\&```#AD` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````````````````%6+[+@,`.@!!%8S]HEV],=&^E``QT;X50#' M1ORR";@`@%"@OP"84.AO!H/$!+@`@%"@MP"84.A@!H/$!.CL`8-^!`%U`^G$ M`+@"@%"+7@;_=P+H[P2#Q`2)1O9`=1J+7@;_=P*X60!0N,``4.AD`X/$!N@@ M`NF4`+C0!U"XL@E0_W;VZ(<"@\0&HZ``0'4MN'8`4+C``%#H.0.#Q`3KT[A/ M`%#_=OSH:`"#Q`2)1OR#/J8``'02H:8``4;TH:@`_P:H`#T8`'S7N+@`4/]V M^NA,`X/$!/]V]+BR"5"@OP"84.B-`X/$!HOP0'4*N)@`4.@6!H/$`KBX`%#_ M=OCH'@.#Q`0SP%#H"0B#Q`)>B^5=PU6+[#/`Z/$"5HMV!#/`HZ0`HZ8`@#P` M=#*`/`IT+?\&I@"#/BP%`'4%@#P<<Q'_-J0`5N@T`(/$!`$&I`#K!/\&I`"A MI``Y1@9]%X`\"G4(_P:D`/\&I@"`/`!T`4:+QNL#1NNO7HOE7<-5B^RX`@#H MA@)75HMV!#/_@SXL!0%U$(`\6W4+QP8L!0(`B\?I@P"#/BP%`G4EBAPJ__:' MB0,$=>F`^SMTY/:'B0,#=`C'!BP%``#KU<<&+`4``(H$*N0+P'3J/0<`=.4] M"`!T$3T)`'05/0T`=-8]&P!T&^LQ@WX&`'3)3^O&BSZB`(M&!IF+S_?Y*_KK MMH,^+`4`=06X`0#K`C/`HRP%"\!T`^E[_T?KFUY?B^5=PU6+[#/`Z-<!,\!0 M4*"W`)A0Z)8`@\0&HS`%,\!04*"_`)A0Z(0`@\0&HRX%]P8P!8``=!6A,`4, M(%"X`0!0H+<`F%#H9`"#Q`;W!BX%@`!T%:$N!0P@4+@!`%"@OP"84.A'`(/$ M!HOE7<-5B^PSP.AM`8,^,`4`=!/_-C`%N`$`4*"W`)A0Z"$`@\0&@SXN!0!T M$_\V+@6X`0!0H+\`F%#H!P"#Q`:+Y5W#58OLN`X`Z"P!QD;S1(I&!HA&\HM& M!(E&](I&"(A&^,9&^0"-1O)0C4;R4.@G!H/$!(M&^(OE7<-5B^R+7@3VAZ0$ M`70%,\#IU`F+3@B+5@:T/\TA<P2T">L*]H>X!(!T`^@#`.FW"597_(ORB_J+ MR.,;M`VL.L1T%SP:=0?&AZ0$`>L%B`5'XNN+QRO"7U[#@_D!=`>`/`IT[>OH M]H>X!$!T&;@`1,TA]\(@`'4*C1:J`+0_S2%RU;`*ZR_&!JH``(T6J@"T/\TA M<L(+P'0:@WX(`70@N?__B]&X`4+-(;D!`(`^J@`*=`>P#8M6!NN4BU8&ZY*` M/JH`"G79Z[I5B^R#[`175O]V!.@J"(/$`HOPC48(4/]V!O]V!.BY"H/$!HOX M_W8$5NB."(/$!(O'7E^+Y5W#68O<*]AR"CL>K`!R!(OC_^'IS015B^R#[`97 M5O]V!.A*$8/$`HOX_W8&Z-0'@\0"B_#_=@97N`$`4/]V!.CI"(/$"(E&_/]V M!E;H-@B#Q`0Y?OQU"8M>!(I!_YCK`[C__UY?B^5=PU6+[(M>!/:'N`0@=`ZX M`D(SR8O1S2%S`^EG"/:'N`2`=0/I@0"+3@B+5@8>!S/`_%=6B_"+^N-EN`I` M\JYU,E&+SRO*2>,0S2&<`_"=<P2T">M)"\!T+T:Y`@"ZK@"T0,TA<P2T">LT M"\!T&EF+U^O%48O/*\K-(9P#\)US!+0)ZQH+P'46]H>X!$!T"XM>!H`_&G4# M^.L$^;@('%ER`HO&7E_IW`>+3@B+5@:T0,TA<P2T">OMX^L+P'7G]H>X!$!T M"HO:@#\:=0/XZ];YN`@<Z]!5B^PR_X@^I@&+1@8R[:D(`'0"M2"(+J4!)0,` M/0,`=06!=@8!`+IZ`;0:S2&Y)P"+5@2T3LTA<P/IFP"+1@:+R"4`!3T`!74' MN`41^>E?!\8&IP$!D:D``G0+BU8$N`!#S2'IH`"I`P!T5ZD`@'52]@;7!(!U M2[`""@:F`8M6!+0]S2%RQY.X`$3-(?;"@'4MN?__B]&X`D+-(??9NGH!M#_- M(0O`=!:`/GH!&G4/]]F+T;@"0LTA,\FT0,TAM#[-(8I&!B0#"@:F`8M6!+0] MS2%R.^F#!?=&!@`!=0:X`@#I:/_&!J<!`/]V".B[!5F)3@@R[?8&I@'_=0?W M1@8"`'4#@.'^BU8$M#S-(7,#Z9T&]@:F`?]U!_=&!@(`=3*3M#[-(8I&!B0# M"@:F`8M6!+0]S2%RV/8&IP$!=13W1@@!`'0-@,D!DXM6!+@!0\TAD^D%!56+ M[(/L`E:+=@0+]GP,@_X4?0?VA+@$`741QP:4!`D`QP:B!`8`N/__ZT"*A+@$ M)8``B4;^@7X&`(!U!X"DN`1_ZPR!?@8`0'40@(RX!("#?OX`=!.X`$#K$<<& ME`06`,<&H@0!`.N^N`"`7HOE7<-5B^R#[`)75HMV!+\"``OV="*`/`!T'5;H M4@X#YU!65^A%_8/$!HO'4+C.`E!7Z#?]@\0&H2P#.0:4!'T3@SZ4!`!\#(L> ME`31XXN'X@+K`[C1`HOP5N@4#H/$`E!65^@&_8/$!K@!`%"XWP)05^CW_(/$ M!EY?B^5=P[^P`8LV`@`K]X'^`!!R`[X`$/J.UX'$CA'[<P/I20&!Y/[_-HDF M-@,VB28T`XO&L033X$@VHS(#M##-(3:CF@0\`G,J'C/`4`X?NM<'M`G-(<M$ M3U,@,BXP(&]R(&QA=&5R(')E<75I<F5D#0HD`_>)-@(`C,,KWO?;M$K-(3:, M'I($BS8L`!X6N``US2$VB1XN`S:,!C`##A^X`"6Z!@G-(3:+#B(%XR(VQ08D M!8S:,]LV_QX@!7,#Z<P`-L4&*`6,VKL#`#;_'B`%!Q_\ORP%N9`1*\\SP/.J M%A8''^@-!KL$`+@`1,TA<@KVPH!T!8"/N`1`2WGLZ/\!Z%P!NRP%@?LL!7,( M4_\76T-#Z_*Y!@`KX;Z<!(O\%@?SI.C,`#/MZ%CW4.AF``T*4W1A8VL@;W9E M<F9L;W<-"@T*1&EV:61E(&5R<F]R#0H-"D9L;V%T:6YG('!O:6YT(&YO="!L M;V%D960-"K$2NJX(,NT.'[L"`+1`S2$6'[C_`%#H-0&Q$+K`".OEL1VZT`CK MWE6+[(,^F`0`=`3_%I@$_W8$Z!,!B^5=PU6+[%=6BWX$BP6+70*+302+50:+ M=0B+?0K-(5>+?@:)!8E=`HE-!(E5!HEU"(]%"G($,_;K".B<`[X!`(L%B74, M7E]=PU6+[(/L"%=6BS:@!.L7N`P`4+C8!%#_-.A?#8/$!@O`=`B#Q@*#/`!U MY(,\`'0YBSR#QPS'1OX``(H%1YB)1OKK'(H%F#W_`'4$,L#K`HH%BU[^_T;^ MB(>X!/].^D>#?OH`==['!```7E^+Y5W#CP;F!(X>D@0SR8O!B^F+^4F+-BP` M"_9T"([&\JY%KG7Z19=`)/Z+_='E`\46'^C\^8O/B_P#_8OL%@>.WC/V2>,- MB7X`146LJ@K`=?KB\XE.`!8?B2:@!/\FY@15B^R[+`6!^RP%<PA3_Q=;0T/K M\N@A!`KD=`J`?@0`=03&1@3^'L46+@.X`"7-(1^+#B(%XP>[`@#_'B`%BT8$ MM$S-(8\&Z`2.'I($%@>^@`"LF#/2)H`^F@0#<F50C@8L`#/`B\CWT8OX\JXF M.`5U^8/'`XO(]]&+]R:*!4=!.N!T%#PB=`@\"70$/"!UZU@6![Z!`.LK3RO^ M"_]T\8O/0EN+PP/!!0,`)?[_*^"+_!X&'Q8'\Z2P(*J+RQ^^@0#K#HO(!`0D M_BO@B_RX0R"K\Z2+P:J+]!8?4(O<B_ZLJ@K`=#T\(G4?5O\&G`2L"L!T+CPB M=0>`??]<=01/JNOM1\9%_P#KU>@W`'303E9&_P:<!*RJ"L!T".@E`'7UZ^&J MB_1+2SOS<PBMAP>)1/[K\HO<"])U`O\'B2:>!/\FZ`0\"70"/"##58OLQ@:E M`0#_=@;H7P!9B4X&BU8$,NVT/,TA<DV+V(M6!+@`0\TA]\$!`'4$,LGK`K$0 M]T8&`$!U#O=&!@"`=0KV!M<$@'4#@,F`"@ZE`8#)`;@`1,TAB\/VPH!T`X#) M0(B/N`3&AZ0$`.D%`56+[*&6!/?0BUX$(\.!XP#`J(!U`X#+`8E>!%W#58OL M5HMV!('^N`!U//9$!@QU-HI$!YB+V-'C]H=0`0%U)\=$!&`%BD0'F(O8T>/& MAU`!`<<&F`27%\=$`@`"BT0$B02X`0#K-('^T`!U+/9$!@QU)HI$!YB+V-'C M]H=0`0%U%[@``E#H80N#Q`*)1`0+P'0&@$P&".NY,\!>B^5=PU6+[%:+=@:# M?@0`=$R!_K@`=26*1`>84.@A"H/$`@O`=!96Z'<*@\0"BD0'F(O8T>/&AU`! M`.L:@?[0`'4;5NA;"H/$`O]T!.CQ"H/$`H!D!O<SP(D$B40$7HOE7<-R"#/` MB^5=PW,&Z`T`N/__B^5=PS+DZ`$`PZ*B!`KD=2.`/IH$`W(-/")S#3P@<@6P M!>L'D#P3=@*P$[OJ!->8HY0$PXK$Z_=5B^R#[`975HMV!(M^"HM&!O=F"(E& M^HE&_`O`=#OV108,=3Z*10>8B]C1X_:'4`$!=2__30*#?0(`?`R*!(L=_P6( M!RKDZPM7B@284.A&"(/$!/9%!B!T!3/`Z=H`1O]._/9%!@AU$HI%!YB+V-'C M]H=0`0%U`^FC`(-^_`!U`^F)`(M&_#E%`G(<4%;_->A8"H/$!HM&_"E%`HM& M_`$%QT;\``#KTX-]`@!T(?]U`E;_->@T"H/$!HM%`@$%BT4"*4;\`W4"QT4" M``#KK/]-`H-]`@!\#(H$BQW_!8@'*N3K"U>*!)A0Z*L'@\0$]D4&('481O]. M_.E__U>*!)A0Z),'@\0$]D4&('0-BT;Z*T;\*]+W=@;K'T;_3OR#?OP`=.G_ M30*#?0(`?,^*!(L=_P6(!RKDZ\Y>7XOE7<-5B^Q6,_:Y-0`RY/RL,N#B^X#T M5?X.-0!U!H@F-`#K$0KD=`VZ-@"[`@"Y&0"T0,TA,L"B-0!>B^5=PU6+[+AB M`>A5]5=6BW8&C8:B_J,^!8M&!*,V!8M&"*,Z!3/`HTP%HTH%@#P`=0/I20&` M/"5T`^D*`<<&1`4!`#/`HT(%HS(%HT8%HS@%HSP%HS0%HU`%HU(%QP9`!2`` MZS*`/"UU!O\&4@7K)X`\*W4,_P9"!<<&-`4``.L6@#P@=0V#/D(%`'4*_P8T M!>L$_P90!4:*!)A0Z`<&@\0""\!UOU:X2`50Z)`%@\0$B_"`/"YU$O\&/`5& M5KA$!5#H>06#Q`2+\(`\;'4'QP8X!0(`1H`\`'4#Z:``B@28B8:>_CU%`'0* M/4<`=`4]6`!U"?\&,@6#AI[^((N&GOXM8P`]%0!W/@/`DR[_I_4/_P9&!<<& M4`4``+@*`%#HAP"#Q`+K4+@(`.ORN!``Z^TSP%#HH`'KZ;@!`.OU_[:>_N@> M`NO;B_[K0>,/OP_H#^@/Z`_Q#_$/\0_Q#_$/\0_Q#]$/\0_Q#_$/VP_Q#[L/ M\0_Q#]8/@SY,!0!T!:%*!>L@1NFF_H`])70&1X`]`'7UB\<KQE!6Z!X#@\0$ MB_?IBOY>7XOE7<-5B^RX&`#HL/-75H-^!`IT!/\&1@6#/C@%`'06BQXZ!8L' MBU<"B4;XB5;Z@P8Z!03K*8,^1@4`=!"+'CH%BP>)1OC'1OH``.L-BQXZ!8L' MF8E&^(E6^H,&.@4"@SY0!0!T#8M&^`M&^G0%BT8$ZP(SP*-.!8LV/@6#/D8% M`'4J@W[Z`'TD@WX$"G47Q@0M1HM&^(M6^O?8@](`]]J)1OB)5OK'1O8!`.L% MQT;V``"+_8/O&/]V!%?_=OK_=OCHL`2#Q`B#/CP%`'0@5^A7!(/$`HL.1`4K MR(E._NL$Q@0P1HM&_O]._@O`?_**!8@$@SXR!0!T!SQA?`.`+"!&1X!]_P!U MYH,^1@4`=12A0@4+!C0%=`N#?O8`=06X`0#K`C/`4.A5`H/$`EY?B^5=PU6+ M[+@(`.B"\E=6QP9`!2``@WX$`'00O@$`H3H%@P8Z!0*)1OSK,XL>.@6+!XE& M_(,&.@4""\!U!<=&_/X$_W;\Z+,#@\0"B_"#/CP%`'0*.09$!7,$BS9$!8L^ M2`4K_H,^4@4`=0=7Z`X!@\0"5O]V_.AM`8/$!(,^4@4`=`=7Z/8`@\0"7E^+ MY5W#58OLN`(`Z/;QH3H%B4;^@SX\!0!U!L<&1`4&`/\V,@7_-D0%_W8$_S8^ M!?]V_NA3`X/$"H-^!&=T!H-^!$=U&(,^4`4`=1&#/D0%`'0*_S8^!>@Y`X/$ M`H,^4`4`=!&#/D0%`'4*_S8^!>@K`X/$`H,&.@4(QP9.!0``H4(%"P8T!702 M_W;^Z"(#@\0""\!T!;@!`.L",\!0Z"0!B^5=PU6+[#/`Z%?Q5H,^3`4`=3B+ M'C8%_T\"@W\"`'P1BD8$BQXV!8LW_P>(!"KDZPW_-C8%_W8$Z.8"@\0$0'4& M_P9,!>L$_P9*!5Z+Y5W#58OLN`(`Z`GQ5U:#/DP%`'51BW8$"_9^2NLSBQXV M!?]/`H-_`@!\$:!`!8L>-@6+/_\'B`4JY.L._S8V!?\V0`7HC0*#Q`1`=03_ M!DP%B\9."\!_QH,^3`4`=0>+1@0!!DH%7E^+Y5W#58OLN`(`Z*#P5U:+=@2+ M?@:#/DP%`'5,ZS6+'C8%_T\"@W\"`'P2B@2+'C8%BP__!XO9B`<JY.L._S8V M!8H$F%#H)`*#Q`1`=03_!DP%1HO'3PO`=<2#/DP%`'4'BT8&`09*!5Y?B^5= MPU6+[+@*`.@V\%=6BS8^!3/`B4;\B4;XBSY(!5;HC`&#Q`*)1OHK^"M^!*%. M!;$#T_@K^(,^4@4`=16`/"UU$(,^0`4P=0FLF%#HE/Z#Q`*#/D`%,'0+"_]^ M!X,^4@4`=!F#?@0`=`;_1OCH7@"#/DX%`'0&_T;\Z&\`@SY2!0!U)E?HJ/Z# MQ`*#?@0`=`F#?O@`=0/H-`"#/DX%`'0)@W[\`'4#Z$(`_W;Z5NCH_H/$!(,^ M4@4`=`W'!D`%(`!7Z&O^@\0"7E^+Y5W#58OL,\#H;.^#/D(%`'0$L"OK`K`@ MF%#H^_V+Y5W#58OL,\#H3N^X,`!0Z.C]@\0"@SY.!1!U%8,^,@4`=`2P6.L" ML'B84.C,_8/$`HOE7<-5B^RX`@#H&^]75HMV!H`\*G4.BQXZ!8,&.@4"BS]& MZSHS_X`\,'PS@#PY?RXY/CP%=0N`/#!U!L<&0`4P`*R8B\_1X='A`\_1X0/( M@^DPB_F`/#!\!8`\.7[CBUX$B3^+QEY?B^5=PU6+[+@"`.BS[E:^!07K#8H$ M.$8$=06X`0#K"$:`/`!U[C/`7HOE7<-5B^Q7'@>+?@0SP+G___*NB\%`0/?8 M7UW#58OLZ';SB^5=PU6+[.AL\XOE7<-5B^SH8O.+Y5W#58OLZ%CSB^5=PU6+ M[.A.\XOE7<-5B^RS`.GR`U6+[(/L!%=6BW8&BD0&F*F#`'0&]D0&0'0&N/__ MZ=H`]D0&`70&@$P&(.ON@$P&`H!D!N\SP(E$`HOXB7[^]D0&"'4/BD0'F(O8 MT>/VAU`!`70PBSPK?`0+_WX25_]T!(I$!YA0Z$#N@\0&B4;^BT0$0(D$QT0" M_P&+7`2*1@2(!^MJ]D0&!'5.@?ZX`'4MBD0'F%#H:0"#Q`(+P'4UQP:8!)<7 MQT0$8`6*1`>8B]C1X\:'4`$!QP1A!>NXN``"4.A+`8/$`HE$!`O`=`:`3`8( MZYN`3`8$OP$`5XU&!%"*1`>84.C![8/$!HE&_CE^_G0#Z3'_BD8$*N1>7XOE M7<-5B^R+7@2#^Q1]$8/[`'P,]H>X!$!T!;@!`.L",\!=PU6+[%=6'@>+3@CC M+XO9BWX$B_<SP+G___*N0??9.\MV`HO+B_Z+=@;SIHI$_S/).D7_=P5T!4'K M`O?1B\%>7UW#58OL@^P$5U:+=@0S_U;HW0*#Q`**1`8D`SP"=3SV1`8(=0^* M1`>8B]C1X_:'4`$!=">+!"M$!(E&_`O`?AM0_W0$BD0'F%#H_>R#Q`8[1OQT M!X!,!B"___^+1`2)!,=$`@``B\=>7XOE7<-5B^R#[`175KZP`#/_ZQ>*1`:8 MJ8,`=`M6Z'G_@\0"0'0!1X/&"#DV>`%SXXO'7E^+Y5W#58OLBUX$@$_^`8OE M7<-5B^Q65[L*!8,_`'4I'@>X!0#HL`%U!3/`F>LD0"3^HPH%HPP%EL<$`0"# MQ@3'1/[^_XDV$`6+3@2,V([`Z%H`7UZ+Y5W#58OL5U8>!XM^!(MV!HO7BTX( M._YV%(O&`\$[^',,`_$#^4Y/_?.D_.LAB\<+QM'H<PJ+QS/&T>ARZZ1)B]G1 MZ?.ET>MS!8H$)H@%B\)>7UW#Z<L`@_GN<_A!@.'^BW<"_*V+_J@!=$)(.\%S M%8O0`_"MJ`%T-`/"!0(`B_>)1/[KYHO^=`P#^8E,_BO!2(D%ZP4#^?Y,_HO& MC-J!^K`!=`4FC!X8!8E_`L,FQ@8<!0(]_O]T)8O^`_"MJ`%T\HO^2#O!<[V+ MT`/PK:@!=.(#P@4"`(OWB43^Z^:+1P@+P'0$CMCK$R;^#AP%=!",V#VP`70% M)HX>%`6+-^N]BW<&,\#H60`[QG0-)`%`0)CH30!T#?Y-_N@+`'0%EDY.ZYHS MP)G#48M%_J@!=`,KR$E!0;K_?R8[%AH%=@31ZG7UB\$#QG(5`\)R#??2(\(K MQN@,`'4(]]+1ZG7E,\!9PU)1Z!T`=!A7B_Z+\`/RQT3^_O^)=P:+UBO72HE5 M_EA96L-34#/2'E)24+@!`%`&'^AW`(/$"(/Z_Q]:6W0""]+#5U:+3@J+1@2+ M5@:+?@A7'@?\DPK`=!.#^0IU#@O2>0JP+:KWVX/2`/?:B_>2,](+P'0"]_&3 M]_&2A],$,#PY=@($)ZJ+P@O#=>*(!4^LA@6(1/]/._=R]5A>7UW#58OLBUX$ M@&<&SUW#58OL5E<&@WX(`'4XOS8#BU8&BT8$2'4'Z%,`<B?K2(LVA@-(=!$[ M]W0-BT0"B48,5N@Z`%YS,(/&!('^A@-S!`O2=0:X__^9ZQV+VH/##]';L0/3 MZ[1(S2%RZ9*)!(E4`HDVA@,SP`=?7HOE7<.+3@R+]SE,`G0,@\8$@?Z&`W7R M^>L_B]H#''(YB]..P3OW=08Y'C(#<R:#PP_1V]'KT>O1ZSOW=0D#V:&2!"O8 MCL"T2LTA<@T[]W4$B18R`Y*'!(O1PP`````````````````````````````` M`````````$,@3&EB<F%R>2`M("A#*4-O<'ER:6=H="!-:6-R;W-O9G0@0V]R M<"`Q.3@U``%.=6QL('!O:6YT97(@87-S:6=N;65N=`T*`!M;,DH`&UM!`$-A M;B=T(&]P96X@(B5S(B!T;R!R96%D(&ET+@H`17)R;W(@<F5A9&EN9R!F:6QE M("(E<R(*+"!A<F=V6S%=`&1E;6\Z(``````(````````````)A(-"K('``"R M!P$``````````@$````````&`@```````(0#`````````@0````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````!```````````````````````````````` M````````````````````2`$````````````````````````````````````` M````````````````````````17)R;W(@,```3F\@<W5C:"!F:6QE(&]R(&1I M<F5C=&]R>0``````07)G(&QI<W0@=&]O(&QO;F<`17AE8R!F;W)M870@97)R M;W(`0F%D(&9I;&4@;G5M8F5R````3F]T(&5N;W5G:"!C;W)E`%!E<FUI<W-I M;VX@9&5N:65D`````$9I;&4@97AI<W1S`$-R;W-S+61E=FEC92!L:6YK```` M`$EN=F%L:60@87)G=6UE;G0``%1O;R!M86YY(&]P96X@9FEL97,`````3F\@ M<W!A8V4@;&5F="!O;B!D979I8V4``````$UA=&@@87)G=6UE;G0`4F5S=6QT M('1O;R!L87)G90``4F5S;W5R8V4@9&5A9&QO8VL@=V]U;&0@;V-C=7(`.B`` M56YK;F]W;B!E<G)O<@`*``"H`;`!L0'+`<P!S0'.`<\!X0'S`0,"!`(%`A4" M)P(H`BD"*@(V`D@"20)*`DL"7`)=`G$"<@)S`G0"C`*-`HX"CP*0`IX"KP*P M`B4``````````````+`!```````````````````````````````````````` M```````````````````````````````````````````````````````````` M`#8#`"`@("`@("`@("@H*"@H("`@("`@("`@("`@("`@("`@2!`0$!`0$!`0 M$!`0$!`0$(2$A(2$A(2$A(00$!`0$!`0@8&!@8&!`0$!`0$!`0$!`0$!`0$! M`0$!`0$0$!`0$!""@H*"@H("`@("`@("`@("`@("`@("`@("`A`0$!`@```` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````````````````````````````````````````(&!@0$!```` M````````````````````````````````.T-?1DE,15])3D9/`````````!8" M`A@-"0P,#`<(____$@T2`O\H;G5L;"D`*RT@(P`````````````````````` 2`"`````````````````````` ` end @//E*O*F demo.uue// chmod u=rw,g=r,o=r demo.uue echo x - nansi.uue sed 's/^@//' > "nansi.uue" <<'@//E*O*F nansi.uue//' begin 644 nansi.sys M_____Q.`RP#6`$-/3B`@("`@&ULR2DYA;G-I+G-Y<R!V,BXR.B!.97<@04Y3 M22!D<FEV97(@*$,I($1A;FEE;"!+96=E;"P@4&%S861E;F$L($-!(#$Y.#8- M"AH``````0```QA/```````'```````````````#````````````6QL``'@` M````````=P``````H64`B]BT`)**Q[0`*]!"BL/^P/8F9P`"QX#4``/`E\-P M"2,!(P$?`28!-0%)`50!F`&8`2,!(P$NB1Y<`"Z,!EX`R_M04U%25597'@8N MQ1Y<`(I'`L1W#HM/$CP,=R"3T>.,R([8_Y>S`"[%'EP`#0`!B4<#!Q]?7EU: M65M8R^@*`.OF+L<&BP`!`,^X$PC#,\##XPJ+_E'HXP)9JN+X,\##Z",#=`O% M'EP`B$<-,\#K`[@``L/H#P.X``)T`C/`PS/`HX,`HX<`HXL`HX\`N$``CL`F MH1H`)J,<`#/`PP#['@904U%25597N0$`C,N.PX[;OG(!B`3H"@!?7EU:65M8 M!Q_/C`9O`+A``([8H4D`+J)C`/[,+H@F90"@8@"8`\"3BX=0`"ZC9@"A8P`N MHW,`H4X`T>C1Z-'HT>B`Q+`N@#YC``=T`X#$"`X?HVT`CL#HJ_[H%`%R`^B? M`8L>=0"*)FL`CAYO`/SC(RZ#/F$``'50Z/4`<@/I#`&L/!QR(B[7JTK@]70$ MZP3@YW1HC,B.V*!E`/[`*L*B9@#H+0$SP,,\&W0:/`UT+SP*=&`\"70+/`AT M$#P'=!CIP@#K>9#II`+IE`(N.A9E`'<#3T]"Z[CH(@(*P.NQ+J!E`/[`*L*T M`"OX*_@NBA9E`$(NBB9K``P!ZY1!+O8&8``!=05/3T+KABZ*%F4`0BOZ*_HN MH&0`+C@&9P!R!>@%`>L0+OX&9P`NH&4`M`!``\`#^"Z*)FL`#`'I4O\NH&4` M_L`JPE&U`(K(@.$']MF`P0@KT9RP(.@6`','\ZN=6>DL_P/1Z#P`2N+ZG5GI M'_\N@#YC``1R"BZ`/F,`!W0"^,/YP^CI_W,(Z?G^K#P<<@TNU^@.`$K@\W0& MZ?7^Z0;_Z5?_4E%34"Z@90#^P"K"+J)F`"Z+%F8`,]NT`LT0N0$`6%"*W+<` MM`G-$%A;65K#Z)S_<RJ+W]'KBQ9S`+`.[NL`0HK'[NL`2K`/[NL`0HK#[KA` M`([8+J%F`*-0`,.X%H_HGO_#M`#H9/]S%RZ*)FL`@.1_+H`^8P`'=0>`_`%U M`K0'PU!345+HVO^*_+`!M`:Q`+4`+HH690`NBC9D`,T06EE;6,.+-N`$"L!T M`K0`.S;>!'8.BPP[1/YT"X/N!"OQZ^P+]NL'@^X"*_$ZP,.Y!`"[?P"#PP2+ M-POVX??#Z.W_="G_#TZ+;P(^B@*#[@%R&8'[@P!T$PK`=0__#SZ*(L<&@P`! M`(@F>`#K&[0`S18+P'3XZ(W_=0J)#H\`B3:1`.N[/`!TV</HH_]T"4Z+;P(^ MB@+K&K0!S19T%PO`=0:T`,T6Z_#H6_]U!0/QBD3_@,P!PQ0%`P!04U%25597 ML+:Z0P#N2BZAAP3K`.Z&X.L`[KIA`.L`[%`,`^L`[@:X0`".P":+'FP`N?__ M)J%L`"O#+CL&B01_`N+Q!U@D_.Y?7EU:65M8PP``,#`P,#`NB1YQ`"ZC80#I M-/TNBQYQ`"[_)F$`Z9D`X@6X`@7KX*P\6W7Q+HL>W`0NQ@<`+L8&VP0`X@6X M'07KQ:P\/70'/#]T`T[K!^(%N#`%Z[*L/#!R%CPY=Q(L,"Z(!R[&!ML$`>)B MN*@%ZY<\(G0$/"=U="ZB:@#B!;A>!>N$K"XZ!FH`=!,NB`<N.Q[>!(/3`.+K MN%X%Z6G_+L8'`.(&N(4%Z5W_K#P[=`)!3N*BN#`%Z4[_+L<&80```"Z*)FL` M+HL>=0#I:_VL/#!R&CPY=Q8L,"Z&!U*R"O;B6BX`!^+GN*@%Z1O_/#MU$"X[ M'MX$@],`+L8&VP0`ZYX\0'*U/'IWL3Q:=@8\87*I+`9641X.'RQ`F`/`!44& MB\LNBS;<!"O.+O8&VP0!=`%!DZ!E`$`JPJ)F`+0`K`K`=0%`_Q<?65XNBB9K M`"Z+'G4`+L<&80````O2Z>7[U`H%,#"&X*J&X*K#30@`!_H&YP;M!J\&KP:O M!K`&KP9/!T8'(P@?"*\&KP91"*\&KP:O!J\&KP:O!J\&KP:O!J\&KP:O!J\& MKP:O!K`&KP:2"*\&KP:O!@H)'`=S!Z\&J`>O!J\�>O!A0'KP:O!J\&#@FO M!L,*P'0!2*)G`#/`@_D"<@:L"L!T`4BB9@"A9@`Z!F4`=@:@90"B9@`Z)F0` M=@:@9`"B9P#HK?G#``9F`.O;*`9F`',%Q@9F``#KS@`&9P#KR"@&9P!S!<8& M9P``Z[NA9@"C:`##H6@`HV8`ZZQ."\EU!,8$`$&L4;D6`)"[*PF#PP,Z!^#Y M=0N+1P$@!FL`""9K`%GBX,-2BPYF`(KUZQ0\`G4?QP9F````Z#?Y4C/)BC9D M`.@P_(K\BA9E`+@`!LT06L-74@:,R([`_;^``*!G`/[`Z+/^L#NJH&8`_L#H MJ/ZP4JJP#8D^B0"JN((`*\>CAP#\!UI?PPO)=%G\3DE)K0K`=`)!3E<&45;] M'@?H%OQU%H/!!(LNW@0!#MX$3HO^`_F+SBO-\Z1>68L^W@2#[P2+WRO9@^L0 M.Q[<!'(2B4T#B44!XP:D@\8"XOJ)/MX$!U_\PP8>!_V+/N`$N`$`J[@`<JNP M$*J)/MX$!^ODM`;K`K0'BCYD`"H^9P`ZQW8"L`!0Z%_[BOQ8L0"*+F<`4HH6 M90"*-F0`S1!:P[4!ZP*U`.BI^G,Y.L)V`HK"5Y&+Z;4`B_<#\0/Q]MD"RK4` M_/;$`70,A_[]B\%(`\`#^`/P!A_SI8O-Z`O[L"#SJ_Q?P['_/`=U!H@.8`#K M:SPK=4*T$KL0_\T0]\/\_G5:Z$WZ<U6T`*!C`,T0N!(1LP#-$+@`$K,@S1"T M`;D'!\T0BQ9S`+`*[NL`0K`'[L8&9``JZPFT`,T0Q@9D`!BX0``>CMBA20`? MHF,`_LR()F4`QP9F````Z(KWP[$`ZX:+'G4`XP].K4EU`HK@`MB`UP"()\,S MP(@'0_[`=?GK]```!P'_"`3X`07_@`?X<`B(`![X`!_X!"#X`B'X!B+X`2/X M!23X`R7X!RB/`"F/0"J/("N/8"R/$"V/4"Z/,"^/<#/`CMB[;`#'!Q<!C$\" MNZ0`QP=S`8Q/`@X?#@?\OW`)B3[<!(''``*)/MX$1[`0JK@`<JNX`0")/N`$ 9JXD^=0`SP*K^P'7[,\#%-EP`B7P.C$P0PP*) ` end @//E*O*F nansi.uue// chmod u=rw,g=r,o=r nansi.uue echo Inspecting for damage in transit... temp=/tmp/shar$$; dtemp=/tmp/.shar$$ trap "rm -f $temp $dtemp; exit" 0 1 2 3 15 cat > $temp <<\!!! 20 150 941 readme 196 1285 9811 nansi.doc 17 35 367 nansi.mkf 266 1217 7967 nansi.sup 198 200 12079 demo.uue 59 61 3474 nansi.uue 756 2948 34639 total !!! wc readme nansi.doc nansi.mkf nansi.sup demo.uue nansi.uue | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp if [ -s $dtemp ] then echo "Ouch [diff of wc output]:" ; cat $dtemp else echo "No problems found." fi exit 0 -- ----- Terry Sterkel -====---- AT&T Bell Laboratories --------- {clyde|harvard|cbosgd|allegra|ulysses|ihnp4}!whuts!tes ----- [opinions are obviously only my own]