chasm@killer.UUCP (Charles Marslett) (05/30/88)
I have a short utility program to read and write Atari MYDOS format double density diskettes on IBM PCs and clones -- the program could be reasonably posted here or in one of the IBM newsgroups. Could someone recommend where? And is there really any interest in such a program? Charles Marslett chasm@killer.UUCP ...!ihnp4!killer!chasm
sullivan@marge.math.binghamton.edu (fred sullivan) (05/31/88)
In article <4235@killer.UUCP> chasm@killer.UUCP (Charles Marslett) writes: > >I have a short utility program to read and write Atari MYDOS format >double density diskettes on IBM PCs and clones -- the program could >be reasonably posted here or in one of the IBM newsgroups. Could >someone recommend where? And is there really any interest in such >a program? > I would like to see this posted. It should probably be in this group. If you don't post it, could you mail me a copy? Thanks, Fred Sullivan Department of Mathematical Sciences State University of New York at Binghamton Binghamton, New York 13903 Email: sullivan@marge.math.binghamton.edu
cfchiesa@bsu-cs.UUCP (Christopher Chiesa) (06/01/88)
In article <4235@killer.UUCP>, chasm@killer.UUCP (Charles Marslett) writes: > > I have a short utility program to read and write Atari MYDOS format > double density diskettes on IBM PCs and clones -- the program could > be reasonably posted here or in one of the IBM newsgroups. Could > someone recommend where? And is there really any interest in such > a program? > Yes, I'd be VERY interested in such a program. Don't know where you'd post it, although if you can look at a list of newsgroups (the file .newsrc in your main directory, usually) you can probably puzzle it out. I'd say it would depend somewhat on the nature and size of the posting: source vs. binary, and how long (a judgement call). Suggested search pattern: Short sources: comp.sys.atari.8bit and comp.sys.ibm-pc (check this name) Long sources: comp.sources.misc (check this name, there should be SOMETHING LIKE this available) Binaries: your guess is as good as mine; depends a lot on how you plan to encode it for posting; if it's short, of course, see "short sources" above! Hope this helps; I'd really like to see this program. If all else fails, e-mail me a copy at the address below, please. Chris Chiesa Ball State University UUCP: <backbones>!{iuvax,pur-ee,uunet}!bsu-cs!cfchiesa cfchiesa@bsu-cs.UUCP -- UUCP: <backbones>!{iuvax,pur-ee,uunet}!bsu-cs!cfchiesa cfchiesa@bsu-cs.UUCP
chasm@killer.UUCP (Charles Marslett) (06/02/88)
In article <3205@bsu-cs.UUCP>, cfchiesa@bsu-cs.UUCP (Christopher Chiesa) writes: > In article <4235@killer.UUCP>, chasm@killer.UUCP (Charles Marslett) writes: > > > > I have a short utility program to read and write Atari MYDOS format > > double density diskettes on IBM PCs and clones -- the program could > > be reasonably posted here or in one of the IBM newsgroups. Could > > someone recommend where? And is there really any interest in such > > a program? > > > > Yes, I'd be VERY interested in such a program. Don't know where you'd post > it, although if you can look at a list of newsgroups (the file .newsrc in your > main directory, usually) you can probably puzzle it out. I'd say it would > depend somewhat on the nature and size of the posting: source vs. binary, and > how long (a judgement call). Suggested search pattern: > > Short sources: comp.sys.atari.8bit and comp.sys.ibm-pc (check this name) OK, I think it's sorta short, and the alternatives may not get read by the people who want it. (Donning my asbestoses in case someone strongly disagrees with my size estimate!) This is a "traditional" shar file with the MSDOS executable uuencoded on the end. This is a utility program that allows you to read, write and format diskettes on an IBM PC or compatible in the MYDOS double density format for the Atari 8-bit computers. The utility does not support any of the 128-byte sector formats, but the source is included (in case you come up with a way to add such support). The program has been compiled with Microsoft C and MASM. I hope you find it useful. Charles Marslett Wordmark Systems chasm@killer.UUCP =========================================================================== Disclaimer: I said it didn*t I??? And I*m honest (-: . . . =========================================================================== #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # # Contents: READ.ME atario.asm util.c util.uue # # Wrapped by chasm@killer on Mon May 30 00:57:28 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f READ.ME -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"READ.ME\" else echo shar: Extracting \"READ.ME\" \(986 characters\) sed "s/^X//" >READ.ME <<'END_OF_READ.ME' XThe UTIL program is used to read and Xwrite Atari double density diskettes Xon an IBM-compatible computer. The Xtwo source files for the utility are XUTIL.C and ATARIO.ASM. X XEnter UTIL with no parameters and a Xhelp message will be displayed. To Xread, write or format a disk, enter Xthe commands /R, /W or /I. The Xcommand for displaying the directory Xis /L. If the command line contains Xa /B, the files will not be translat- Xed to/from ATASCII (i.e., they are Xbinary files). The command line for Xall but the /W function will end with Xa drive identifier (A:, B:, C: or D:) X-- this is the ABSOLUTE drive number, Xnot the one MSDOS uses. An external X3.5" drive will usually be drive C:, Xnot D: or E: or whatever DOS calls Xit. Use the /L command until you are Xsure you know which drive is which! X XTo write to the Atari diskette, the Xdrive identifier is followed by a Xlist of file names to be written to Xthe Atari diskette. X X Good luck, X Charles Marslett END_OF_READ.ME if test 986 -ne `wc -c <READ.ME`; then echo shar: \"READ.ME\" unpacked with wrong size! fi # end of overwriting check fi if test -f atario.asm -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"atario.asm\" else echo shar: Extracting \"atario.asm\" \(7101 characters\) sed "s/^X//" >atario.asm <<'END_OF_atario.asm' X title ATARI Disk I/O Library X X public _savefb X public _restfb X public _aread X public _awrite X public _aformat X public _cd X public _md X public _dmainit X public _getds X public _ffirst X public _fnext X XDGROUP group _DATA X X_DATA segment byte public 'DATA' X extrn _tracks:byte X extrn _track_offset:byte X extrn _sector_offset:byte X_DATA ends X XIGROUP group _TEXT X X_TEXT segment byte public 'CODE' X assume cs:IGROUP,ds:DGROUP X; X; Return first address of a 512-byte buffer in a character array X; X_dmainit proc near X push bp X mov bp,sp X mov ax,4[bp] X mov bx,ds X mov cl,4 X shl bx,cl X add bx,ax X cmp bx,0FE00h X jbe dmax X sub ax,bx Xdmax: pop bp X ret X_dmainit endp X; X; Save Current Disk Format in 10-Byte Save Area X; X; savefb(sectorsize, sectorcount, savearea) X; int sectorsize, sectorcount; X; char savearea[10]; X; X_savefb proc near X push bp X mov bp,sp X push ds X push di X push si X X cld X xor si,si X push ds X pop es ;Segment address of save area X mov ds,si X lds si,dword ptr ds:[4*1Eh] ;Address of ctl block to DS:SI X mov di,8[bp] ;Get address of save area X mov cx,5 ;length in words X rep movsw ;copy block to local memory X sub si,10 ;point back to 1-st of ctl blk X mov al,byte ptr 4[bp] ;ARG1 = sector size code X mov ah,byte ptr 6[bp] ;ARG2 = sectors/track X mov word ptr [si+3],ax ;Store data back into block X mov byte ptr [si+5],28 ;Inter-sector gap length (was 42) X mov byte ptr [si+7],24 ;Leading gap length (was 80) X mov byte ptr cs:secptk,ah X mov ah,0 ;reset the disk system X mov bx,ax X shl bx,1 X mov bx,cs:sec_size[bx] X mov cs:data_ln,bx X int 13H X X pop si X pop di X pop ds X pop bp X ret X_savefb endp X; X; Restore MSDOS Format to Disk Control Block X; X; restfb(savearea) X; char savearea[10]; X; X_restfb proc near X push bp X mov bp,sp X push ds X push di X push si X X xor cx,cx X loop $ X cld X mov si,4[bp] X xor ax,ax X mov es,ax X les di,dword ptr es:[4*1Eh] X mov cl,5 X rep movsw X int 13H X X pop si X pop di X pop ds X pop bp X; xor cx,cx X; loop $ X ret X_restfb endp X; X; Read a MYDOS Sector X; X; aread(sector, drive, bufad) X; int sector, drive; X; char bufad[512]; X; X_aread proc near X push bp X mov bp,sp X push es X push si X push di X X call reg_set X call vread ;Read one sector X jc reterr X xor ax,ax ;Return zero if no error Xreterr: X X pop di X pop si X pop es ;Return it directly X pop bp X ret X_aread endp X; Xvread proc near X call io_setup Xretry: push dx X push cx X push bx X mov ax,0201h ;Command code/Number of sectors X int 13H X pushf ;Save CY flag X push ax X jnc flip X dec cs:errcnt X je flip X pop ax X popf X mov ah,00h ;Recalibrate disk system X int 13H X pop bx X pop cx X pop dx X jmp short retry X; Xflip: pop ax X popf X pop bx X pop cx X pop dx X X pushf X mov cx,128 ;Complement data bits Xfliplp: not word ptr es:[bx] X inc bx X inc bx X loop fliplp X popf ;Restore CY flag X X ret ;and return (CY/AX contain status) Xvread endp X; X; Write a MYDOS Sector X; X; awrite(sector, drive, bufad) X; int sector, drive; X; char bufad[512]; X; X_awrite proc near X push bp X mov bp,sp X push es X push si X push di X X call reg_set X call vwrite ;Write one sector X X pop di X pop si X pop es X pop bp X ret X_awrite endp X; Xvwrite proc near X call io_setup Xwrtry: push dx X push cx X push bx X mov cx,128 Xwrcomp: not word ptr es:[bx] X inc bx X inc bx X loop wrcomp X pop bx X pop cx X push cx X push bx X mov ax,0301h ;Command code/Number of sectors X int 13H X jnc vw_xit X push ax X mov ah,00h ;Recalibrate disk system X int 13H X pop ax X pop bx X pop cx X pop dx X dec cs:errcnt X jne wrtry X push cx X push bx X mov cx,128 Xerrcmp: not word ptr es:[bx] X inc bx X inc bx X loop errcmp X pop cx X pop bx X stc X ret ;and return (CY/AX contain status) X Xvw_xit: pop bx X push bx X mov cx,128 Xwrrcmp: not word ptr es:[bx] X inc bx X inc bx X loop wrrcmp X mov ax,0 ;Indicate no error X pop bx X pop cx X pop dx X ret Xvwrite endp X; X; Format a MYDOS Track X; X; aformat(track, drive, buf, seq) X; int sector, drive; X; char buf[512]; X; char seq[26]; X; X_aformat proc near X push bp X mov bp,sp X push ds X push es X push di X mov di,8[bp] ;Point to the buffer X mov ax,ds X mov es,ax X mov ah,1 X mov bx,10[bp] ;Point to sector sequence table X mov ch,4[bp] ;Get track no. X X cld Xbldft: mov al,ds:[bx] X cmp al,0FFh X je endbft X inc bx X mov es:[di],ch ;Track No. X inc di X mov byte ptr es:[di],0 ;Head No. X inc di X stosw ;Sector No. and Bytes/Sector X jmp short bldft X Xendbft: sub bx,10[bp] X mov ax,bx X mov bx,8[bp] ;368h X mov cl,1 ;Sector number (junk) X mov dh,0 ;Head number X mov dl,byte ptr 6[bp] ;Drive number X mov ah,05h ;Format command X int 13h X mov ax,0 X jnc afex ;Return 0 if OK, -1 if error X dec ax Xafex: pop di X pop es X pop ds X pop bp X ret X_aformat endp X Xio_setup proc near X dec ax ;Make sector number 0-based X xor dx,dx ;and 64-bit long X div word ptr cs:secptk ;convert to track/sector format X inc dl Xfmt_su: mov ch,al ;track number X mov cl,dl ;sector number X mov dh,0 ;Head number X cmp ch,_tracks ;Second side? X jb dord X inc dh X test _track_offset+1,80h ;Same or different directions X jz dorev X add ch,_track_offset ;track = track - [40|80] X jmp short doadj Xdorev: mov ch,_track_offset ;track = [80|160] - track X sub ch,al Xdoadj: test _sector_offset+1,80h X jnz dord ;if < 0, no change X mov cl,_sector_offset X sub cl,dl ;else sector = K - sector X cmp cl,byte ptr cs:secptk X jbe dord ;Where K can be > max sector # X sub cl,byte ptr cs:secptk X dec ch ;presume reversed sequence X test _track_offset+1,80h X jz dord X add ch,2 ;if forward track sequence Xdord: X mov dl,byte ptr 6[bp] ;Drive number X mov cs:errcnt,5 ;Retry 5 times only! X ret Xio_setup endp X Xreg_set proc near X mov bx,8[bp] ;ARG2 = buffer address X mov ax,ds X mov es,ax X mov ax,4[bp] ;Get ATARI FMS sector no. X ret Xreg_set endp X; X; Change to a new current directory X; cd(ptr) X; char *ptr; /* new directory name */ X; returns 0 if successful, 3 if invalid directory X; X_cd proc near X push bp X mov bp,sp X mov dx,4[bp] X mov ah,3Bh X int 21h X jc ret_cd X xor ax,ax Xret_cd: pop bp X ret X_cd endp X X; X; Make a new directory X; md(ptr) X; char *ptr; /* new directory name */ X; returns 0 if successful, 3 if invalid path X; 5 if access denied X; X_md proc near X push bp X mov bp,sp X mov dx,4[bp] X mov ah,39h X int 21h X jc ret_md X xor ax,ax Xret_md: pop bp X ret X_md endp X; X; Parse and search for files with wild card names X; X; ffirst(dta,name) X; X_ffirst proc near X push bp X mov bp,sp X mov dx,6[bp] X mov ah,4Eh X mov cx,7 X jmp short getfile X_ffirst endp X; X; fnext(dta) X; X_fnext proc near X push bp X mov bp,sp X mov ah,2Fh X int 21h X push si X mov si,4[bp] X mov cx,22 ;Size of buffer in words Xrstdata: X lodsw X mov es:[bx],ax X inc bx X inc bx X loop rstdata X pop si X mov ah,4Fh Xgetfile: X int 21h X jc reten X mov ah,2Fh X int 21h X X push di X mov di,4[bp] X mov cx,22 ;Size of buffer in words Xcpydata: X mov ax,es:[bx] X mov ds:[di],ax X inc di X inc di X inc bx X inc bx X loop cpydata X pop di X xor ax,ax X pop bp X ret X Xreten: push ax X mov di,4[bp] X mov cx,22 X mov ax,0FFFFh X rep stosw X pop ax X pop bp X ret X_fnext endp X X_getds proc near X mov ax,ds X ret X_getds endp X Xsec_size dw 128,256,512,1024,2048,4096 X Xdata_ln dw 256 ;size of a sector in bytes Xsecptk dw 0 Xerrcnt db 0 X_TEXT ends X end END_OF_atario.asm if test 7101 -ne `wc -c <atario.asm`; then echo shar: \"atario.asm\" unpacked with wrong size! fi # end of overwriting check fi if test -f util.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"util.c\" else echo shar: Extracting \"util.c\" \(16321 characters\) sed "s/^X//" >util.c <<'END_OF_util.c' X#include <stdio.h> X X#define SECSIZE 256 /* Change this to handle 1050 dbl density disks */ X X#if SECSIZE == 256 X#define SECCODE 1 X#define SECTORS 18 X#else X#define SECCODE 0 X#define SECTORS 26 X#endif X Xint ls_file(); Xint cat_file(); Xint dup_file(); Xchar *dmainit(); XFILE *fopen(), *bopen(); X Xstruct dta { X char reserved[21]; X char attr; X int utime; X int udate; X long len; X char name[13]; X char dummy[3]; X } fdata; X Xint drive, cmd; Xint first; Xint save[5]; Xchar seq[27] = {6,12,18,5,11,17,4,10,16,3,9,15,2,8,14,1,7,13,0xFF}; Xint bitmask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; Xunsigned char *bp; Xint *seccnt; Xint tracks; Xint track_offset, sector_offset; X Xunsigned char buf[1024]; Xunsigned char map[1280]; Xunsigned char dirbuf[1024]; Xchar dirname[100]; X Xunsigned int bpp = 0; Xint bin_flag = 0; Xunsigned char dosbuf[10240]; X Xmain(argc, argv) X int argc; X char *argv[]; X { X int sec, ct; X char *p, *argp; X X X bp = dmainit(buf); X#ifdef DEBUG X if (bp != buf) X printf("Buffer base moved from %x to %x\n", buf, bp); X#endif X seccnt = (int *) &map[3]; X for (ct=0; ct<1280; ct++) X map[ct] = 0; X first = '\t'; X dirname[0] = '\0'; X drive = 0; X track_offset = -40; X tracks = 40; X sector_offset = -1; X while (--argc >= 0) { X argp = *++argv; X if ((argp[0] == '/' || argp[0] == '-')) { X if (argp[2] == '\0') { X if (argp[1] == 'B' || argp[1] == 'b') X bin_flag = 1; X else X cmd = argp[1] & 0xDF; X } X else if (argp[1] == 'T' || argp[1] == 't') { X track_offset = - atoi(&argp[2]); X tracks = (track_offset > -60)? 40: 80; X } X else if (argp[1] == 'P' || argp[1] == 'p') { X track_offset = atoi(&argp[2]); X tracks = (track_offset < 60)? 40: 80; X } X else if (argp[1] == 'S' || argp[1] == 's') { X sector_offset = atoi(&argp[2]); X } X } X else if (argp[1] == ':' && argp[2] == '\0') { X drive = (argp[0]-'A') & 0x1F; X break; X } X else if (argp[1] == '\0') { X cmd = argp[0] & 0xDF; X break; X } X else { X argv--; X argp++; X break; X } X } X#ifdef DEBUG X printf ("Binary flag = %s\n", bin_flag? "on": "off"); X printf ("Tracks = %d, offset = %d, sector offset = %d\n", X tracks, track_offset, sector_offset); X printf("CMD=%c, DRIVE=%c:\n", cmd, drive+'A'); X#endif X savefb(SECCODE,SECTORS,save); X#ifdef DEBUG X printf("SAVE=0x%04X.0x%04X.0x%04X.0x%04X.0x%04X\n", save[0], save[1], X save[2], save[3], save[4]); X#endif X switch (cmd) { X case 'W': /* Write directories or files(from MSDOS) */ X getmap(drive); X msdir(argc,&argv[1]); X putmap(drive); X break; X case 'I': /* Initialize (Format) an Atari Disk */ X fmtdisk(drive); X break; X case 'L': /* List an Atari Directory */ X listdir(361, ls_file); X break; X case 'P': /* Display/Print Atari (printable) files */ X listdir(361, cat_file); X break; X case 'R': /* Read Atari formatted disk files(to MSDOS)*/ X listdir(361, dup_file); X break; X default: X printf ("Invalid switch: only L/istDir, P/rintFiles, R/eadFiles,\n"); X printf (" W/riteFiles or I/nitializeDisk\n"); X printf ("Usage: util /[L|P|R|I] [/T80] [A|B|C|D]: or\n"); X printf (" util /W [A|B|C|D]: file [file ... ]\n"); X } X restfb(save); X } X Xdump() X { X int ct; X char *p; X X for (p=bp, ct=0; ct != 256; p += 16, ct += 16) { X printf ("%03X %02X%02X %02X%02X %02X%02X %02X%02X", X ct, p[0]&0xFF, p[1]&0xFF, p[2]&0xFF, p[3]&0xFF, X p[4]&0xFF, p[5]&0xFF, p[6]&0xFF, p[7]&0xFF); X printf (" %02X%02X %02X%02X %02X%02X %02X%02X\n", X p[8]&0xFF, p[9]&0xFF, p[10]&0xFF, p[11]&0xFF, X p[12]&0xFF, p[13]&0xFF, p[14]&0xFF, p[15]&0xFF); X } X } X Xlistdir(sec, filefunc) X int sec; X int (*filefunc)(); X { X int k, j, i, *num; X unsigned char *p, *tp, *dp; X char text[30]; X X printf("Files in \"%c:%s\"\n", drive+'A', dirname); X for (j=0; j<1024; sec++) { X if (aread(sec, drive, bp)) { X printf("Failure reading directory! Operation aborted!\n"); X return; X } X#ifdef TRACE X dump(); X#endif X for (i=0; i < 128;) X dirbuf[j++] = bp[i++]; X } X#ifdef DEBUG X printf("Directory read:\n"); X#endif X for (p=dirbuf; p < dirbuf+1024; p+=16) { X if (*p == 0) { X#ifdef DEBUG X printf("End of directory at byte %d\n", p-dirbuf); X#endif X break; X } X#ifndef DEBUG X if ((*p & 0x91) != 0x00) X continue; X#endif X for (tp=text, dp=p+5; *dp > ' ' && dp != p+13;) X *tp++ = *dp++; X if (p[13] > ' ') { X *tp++ = '.'; X *tp++ = p[13]; X if (p[14] > ' ') { X *tp++ = p[14]; X if (p[15] > ' ') X *tp++ = p[15]; X } X } X *tp = '\0'; X num = (int *) (p+1); X (*filefunc)(text, num[1], num[0], *p); X } X if (first == '\n') { X putchar('\n'); X first = '\t'; X } X for (p=dirbuf; p < dirbuf+1024; p+=16) { X if (*p == 0) X return; X if ((*p & 0x91) != 0x10) X continue; X for (tp=text, dp=p+5; *dp > ' ' && dp != p+13;) X *tp++ = *dp++; X if (p[13] > ' ') { X *tp++ = '.'; X *tp++ = p[13]; X if (p[14] > ' ') { X *tp++ = p[14]; X if (p[15] > ' ') X *tp++ = p[15]; X } X } X *tp = '\0'; X#ifdef DEBUG X printf("Subdirectory :%s!\n", text); X#endif X num = (int *) (p+1); X k = strlen(dirname); X dirname[k] = '\\'; X dirname[k+1] = '\0'; X strcat(dirname, text); X if (cmd = 'D') X if (cd(text) != 0) X if (md(text) != 0) { X printf("Cannot use or create directory \"%s\"\n", text); X return; X } X listdir(num[1], filefunc); X if (cmd == 'D') X cd(".."); X dirname[k] = '\0'; X } X } X Xls_file(name, at, size, flags) X char *name; X int at, size, flags; X { X printf ("%c%c%c%-12s[%04X] %d secs%c", X flags&0x20?'*':' ', flags&0x10?':':' ', X flags&0x04?'!':flags&0x02?' ':'#', X name, at, size, first); X first ^= '\n' ^ '\t'; X } X Xcat_file(name, at, size, flags) X char *name; X int at, size, flags; X { X int x, ct; X unsigned char *p; X X printf("Print %s(%ld bytes, f=%02X)?", name, size*((long)SECSIZE-3L), X flags); X x = getchar() & 0xDF; X if (x != '\n') X while (getchar() != '\n') X ; X if (x == 'Y') { X for (x = at; x != 0; x = ((bp[SECSIZE-3]<<8)+bp[SECSIZE-2]) & 0x03FF) { X while (aread(x, drive, bp)) X printf ("5 Failures reading sector on Atari disk\n"); X for (ct=bp[SECSIZE-1], p=bp; ct > 0; ct--, p++) { X if (*p == 0x7F) X putchar('\t'); X else if (*p == 0x9B) X putchar('\n'); X else X putchar(*p); X } X } X } X } X Xdup_file(name, at, size, flags) X char *name; X int at, size, flags; X { X int x, ct, mask; X char binary_copy; X unsigned char *p; X FILE *outf; X X binary_copy = bin_flag; X printf("Copy %s(%ld bytes, f=%02X)?", name, size*((long)SECSIZE-3L), X flags); X mask = (flags & 0x04)? 0xFF: 0x03; X x = getchar() & 0xDF; X if (x != '\n') X while (getchar() != '\n') X ; X if (x == 'Y' || x == 'A' || x == 'B') { X if (x == 'A') X binary_copy = 0; X else if (x == 'B') X binary_copy = 1; X outf = bopen(name, "wb"); X if (outf == NULL) { X printf ("Cannot create file \"%s\"", name); X return; X } X for (x = at; x != 0; X x = ((bp[SECSIZE-3]&mask) << 8)+(bp[SECSIZE-2] & 0xFF)) { X while (aread(x, drive, bp)) X printf ("5 Failures reading sector on Atari disk\n"); X#ifdef DEBUG X printf ("Link data = %02x, %02x, %02x\n", bp[SECSIZE-3], X bp[SECSIZE-2], bp[SECSIZE-1]); X#endif X for (ct=bp[SECSIZE-1], p=bp; ct > 0; ct--, p++) { X#ifdef TRACE X putchar(*p); X#endif X if (binary_copy) X bput(*p, outf); X else if (*p == 0x7F) X bput('\t', outf); X else if (*p == 0x9B) { X bput('\r', outf); X bput('\n', outf); X } X else X bput(*p, outf); X } X } X bclose(outf); X } X } X Xgetmap(drive) X int drive; X { X int p, n, k; X char *mp; X X for (mp = map, n=0; n++ < sizeof(map);) X *mp++ = 0; X mp = map; X n = 360; X p = 3; X do { X if (aread (n--, drive, bp)) { X printf ("Unable to read the Atari disk VTOC/Bit Map! Program aborted!\n"); X exit(1); X } X for (k=0; k<256; k++) X *mp++ = bp[k]; X if (map[0] > (sizeof(map)/256 + 2)) { X printf ("Invalid drive, more than %d sectors\n", X (sizeof(map) - 10)*8); X exit(1); X } X } while (++p <= map[0]); X#ifdef DEBUG X printf ("Drive %c: map header: <%02X> %02x%02x %02x%02x ", drive+'A', X map[0], map[2], map[1], map[4], map[3]); X printf ("%02x %02x %02x %02x %02x\n", map[5], map[6], map[7], map[8], X map[9]); X#endif X } X Xputmap(drive) X int drive; X { X int p, n, k; X char *mp; X X mp = map; X n = 360; X p = map[0]; X do { X for (k=0; k<256; k++) X bp[k] = *mp++; X awrite (n--, drive, bp); X } while (--p >= 3); X#ifdef DEBUG X printf ("Drive %c: map header: <%02X> %02x%02x %02x%02x ", drive+'A', X map[0], map[2], map[1], map[4], map[3]); X printf ("%02x %02x %02x %02x %02x\n", map[5], map[6], map[7], map[8], X map[9]); X#endif X } X Xmsdir(argc,argv) X int argc; X char *argv[]; X { X int rc, k, sc, fno, bk, bk0, bkn; X FILE *inf; X X restfb(save); X bkn = -1; X while (--argc >= 0) { X#ifdef DEBUG X printf ("Argument <<%s>>\n", *argv); X#endif X if ((rc = ffirst(&fdata, *argv)) == 0) { X do { X printf ("Copying <<%s>>, Length = %ld\n", fdata.name, fdata.len); X inf = fopen(fdata.name, (bin_flag? "rb": "r")); X savefb(SECCODE,SECTORS,save); X fno = dirfnd(fdata.name); X bk0 = bk = alloc(); X#ifdef DEBUG X printf (" First block = %d (FNO=%d)\n", bk, fno); X#endif X k = (fno<<4) & 0x0070; X bp[k+3] = bk; X bp[k+4] = bk>>8; X k = (fno>>3) + 361; X#ifdef DEBUG X printf(" Writing dir bk. %d, drive %c:\n", k, drive+'A'); X#endif X awrite(k, drive, bp); X restfb(save); X sc = 1; X fno <<= 2; X k = 0; X while ((rc = fgetc(inf)) >= 0) { X if (rc == '\t') X rc = 0x7F; X else if (rc == '\n') X rc = 0x9B; X X if (k >= SECSIZE-3) { X bkn = alloc(); X if (bkn <= 0) { X printf ("No more sectors available\n"); X break; X } X#ifdef DEBUG X printf (" Writing block %d (fno=%04X,link=%d)\n", bk, X fno, bkn); X#endif X bp[SECSIZE-3] = fno + (bkn>>8); X bp[SECSIZE-2] = bkn & 0xFF; X bp[SECSIZE-1] = SECSIZE-3; X savefb(SECCODE,SECTORS,save); X awrite(bk, drive, bp); X restfb(save); X bk = bkn; X k = 0; X sc++; X } X bp[k++] = rc; X } X fclose(inf); X bp[SECSIZE-3] = fno; X bp[SECSIZE-2] = 0; X bp[SECSIZE-1] = k; X#ifdef DEBUG X printf (" Writing last block %d (fno=%04X,size=%d)\n", bk, X fno, k); X#endif X savefb(SECCODE,SECTORS,save); X awrite(bk, drive, bp); X bk = bk0; X dirup(sc, 0x42, fno>>2); X restfb(save); X } while (fnext(&fdata) == 0 && bkn != 0); X } X else X printf ("%s <<%s>>\n", X rc<18? "Invalid path for": "No matching file", *argv); X argv++; X } X savefb(SECCODE,SECTORS,save); X } X Xdirfnd(name) X char *name; X { X char *name0, *cp; X char namev[12]; X int j, k, first; X X k = 0; X for (j=0; j<11; j++) X namev[j] = ' '; X namev[11] = '\0'; X while (*name != '.' && *name != '\0') { X namev[k++] = *name++; X if (k >= 11) X break; X } X if (k < 11 && *name == '.') { X k = 8; X while (*++name != '\0' && k < 11) { X if (*name == '\n') X break; X namev[k++] = *name; X } X } X first = -1; X for (k=361; k<369; k++) { X if (aread(k, drive, bp)) { X printf ("Unable to read ROOT directory for updating! Program aborted!\n"); X exit(1); X } X for (j=0; j<0x80; j += 0x10) { X if (namecomp(&bp[j+5], namev)) { X first = ((k-361)<<3) + (j>>4); X#ifdef DEBUG X printf(" Replaced file no. = %d\n", first); X#endif X return (first); X } X if (bp[j] == 0) { X if (first < 0) X first = ((k-361)<<3) + (j>>4); X goto allcf; X } X if ((bp[j] & 0x80) && first < 0) X first = ((k-361)<<3) + (j>>4); X } X } X allcf: X#ifdef DEBUG X printf ("allocated file no. = %d\n", first); X#endif X if (first < 0) { X printf ("No directory entries free\n"); X exit(1); X } X if ((first>>3) != (k-361)) X while (aread((first>>3)+361, drive, bp)) X ; X cp = &bp[(first & 0x07)<<4]; X *cp = 0x03; X cp += 5; X for (k=0; k<11; k++) X *cp++ = namev[k]; X#ifdef DEBUG X printf ("%s==>%s(FNO=%d)\n", name0, namev, first); X#endif X return (first); X } X Xdirup(cnt, attr, indx) X int cnt, attr, indx; X { X int k; X X while (aread(361+(indx>>3), drive, bp)) X ; X k = (indx<<4) & 0x0070; X bp[k] = attr; X *(int *)(&bp[k+1]) = cnt; X awrite(361+(indx>>3), drive, bp); X } X Xalloc() X { X int p, x, mask; X X for (x=10; map[x] == 0; x++) X if (x >= 1280) X return(0); X p = (x-10)<<3; X mask = 0x80; X while ((map[x] & mask) == 0) { X mask >>= 1; X p++; X } X map[x] &= ~mask; X --*seccnt; X return (p); X } X Xdealloc(sec) X int sec; X { X map[(sec >> 3) + 10] |= bitmask[sec & 0x07]; X } X Xnamecomp(a, b) X char *a, *b; X { X int i; X X for (i=0; i<11; i++) X if (*a++ != *b++) X return(0); X return (1); X } X XFILE *bopen(name, mode) X char *name, *mode; X { X FILE *val; X X restfb(save); X val = fopen(name, mode); X savefb(SECCODE,SECTORS,save); X return (val); X } X Xbput(data, out) X int data; X FILE *out; X { X int len; X X if (bpp >= sizeof(dosbuf)) { X restfb(save); X len = fwrite (dosbuf, 1, sizeof(dosbuf), out); X if (len != sizeof(dosbuf)) X printf ("Error writing to DOS file, %d bytes not written\n", X sizeof(dosbuf) - len); X#ifdef DEBUG X printf("Writing block of %d bytes to DOS file\n", sizeof(dosbuf)); X#endif X bpp = 0; X savefb(SECCODE,SECTORS,save); X } X dosbuf[bpp++] = data; X } X Xbclose(out) X FILE *out; X { X int len; X X restfb(save); X if (bpp != 0) { X len = fwrite(dosbuf, 1, bpp, out); X if (len != bpp) X printf ("Error closing file, %d bytes not written\n", bpp - len); X } X#ifdef DEBUG X printf ("Last file block contains %d bytes\n", bpp); X#endif X bpp = 0; X fclose(out); X savefb(SECCODE,SECTORS,save); X } X Xfmtdisk(drive) X int drive; X { X int ct; X X for (ct=0; ct<40; ct++) { X if (aformat(ct, drive, bp, seq) < 0) X printf ("Error formatting track %d\n", ct); X } X for (ct=0; ct<512; ct++) X map[ct] = 0; X map[0] = 2; X map[1] = map[3] = 0xc4; X map[2] = map[4] = 0x02; X for (ct=4; ct<360; ct++) X dealloc(ct); X for (ct=369; ct<720; ct++) X dealloc(ct); X for (ct=0; ct<1024; ct++) X dirbuf[ct] = 0; X putmap(drive); X for (ct=361; ct < 369; ct++) X awrite(ct, drive, dirbuf); X } X END_OF_util.c if test 16321 -ne `wc -c <util.c`; then echo shar: \"util.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f util.uue -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"util.uue\" else echo shar: Extracting \"util.uue\" \(21398 characters\) sed "s/^X//" >util.uue <<'END_OF_util.uue' Xbegin 644 util.exe XM35J? 1X ! @ #\$__]8!P (TF Z$P '@ $ $ 0I T43 #/$P I 0Ia XM P a XM a XM a XM a XM a XM a XM a XM a XM a XM a XM 58OL@^P*5U:X)CU0a XMZ+L0@\0"HX 'QP:2/),-QT;\ KP+F K^0#1X'\JN 1OT%QP:"!PD Q@:4a XM/ "CA ?'!BI#V/_'!BA!* #'!B9!__^+?@:+=OK_3@1Y ^F^ (/' HLU@#POa XM= B /"UT ^F4 (!\ @!U((!\ 4)T!H!\ 6)U",<&+ $! .O,BD0!)=\ HY Za XMZ\&0@'P!5'0&@'P!='4:C40"4.@G,(/$ O?8HRI#/<3_?B2X* #K(I" ? %0a XM= : ? %P=1R-1 )0Z $P@\0"HRI#/3P ?-RX4 "C*$'I<_^0@'P!4W0)@'P!a XM<W0#Z6/_C40"4.C6+X/$ J,F0>E3_Y" ? $Z=7J ? ( =72*!)@M00 E'P"Ca XMA >)?@:)=OJXA@M0N!( 4+@! %#HL0^#Q :AD#H]20!U ^F! #U, '4#Z8, a XM/5 =0/IBP ]4@!U ^F) #U7 '0^N$( 4.A]&8/$ KA[ %#H<QF#Q *XGP!0a XMZ&D9@\0"N-$ 4.A?&>LXD(!\ 0!U"HH$)=\ HY ZZXB#[P)&ZX+_-H0'Z)T&a XM@\0"BT8&!0( 4/]V!.B7!X/$!/\VA ?H,P>#Q +K)O\VA ?H.P[K\I"X" 50a XMN&D!4.B? (/$!.L,N&8%Z^Z0N+0&Z^B0N(8+4.@^#X/$ EY?B^5=PU6+[(/La XM!%=6BS: !RO_BD0'*N10BD0&4(I$!5"*1 10BD0#4(I$ E"*1 %0B@105[@Na XM 5#HLQB#Q!2*1 \JY%"*1 Y0BD0-4(I$#%"*1 M0BD0*4(I$"5"*1 A0N%<!a XM4.B'&(/$$H/&$(/'$('_ %UG(E^_(EV_EY?B^5=PU6+[(/L+E=6N)0\4*&$a XM!P5! %"X?0%0Z%(8@\0&*_:+?@3_-H '_S:$!U?HJPZ#Q 8+P'07N(\!4.@Pa XM&(/$ HE^!(EVUEY?B^5=PY#'1M@ *& ![E %97C;R&!XOP'@?RI5]>@<: a XM ,=&V( 1X'^ 1\K8E^!(EVUL=&_H8'BW[XBU[^@#\ =26)?OB#/H('"G0#a XMZ;8 _PX:!7D#Z9D L J+'A@%_P88!8@'Z9@ BU[^]@>1=7"-1MJ+^(OS@\8%a XMB\OK#XO!!0T .\9T"XH$B 5&1X \('?LB7;ZBU[^@'\-('8BQ@4N1XI'#8@%a XM1X!_#B!V$HI'#H@%1X!_#R!V!HI'#X@%1\8% (O#0(E&_(H'*N10BU[\_S?_a XM=P*-1MI0_U8&@\0(@T;^$(%^_H8+<@/I5?_I2O^0N!@%4+@* %#H(QB#Q 3'a XM!H('"0#'1OZ&!XM^^(M>_H _ '4#Z1D!B@<DD3P0= /I &-1MJ+^(OS@\8%a XMB\OK#XO!!0T .\9T"XH$B 5&1X \('?LB7;ZBU[^@'\-('8BQ@4N1XI'#8@%a XM1X!_#B!V$HI'#H@%1X!_#R!V!HI'#X@%1\8% (O#0(E&_%>_E#R,V([ N?__a XM,\#RKO?125^)3M2+V<:'E#Q<QH>5/ !7C7[:OI0\C-".P+G__S/ \J[WT2OYa XMB]F'_KG___*N3XO+T>GRI1/)\J1?N$0 HY ZC4;:4.@.#H/$ @O =!Z-1MI0a XMZ! .@\0""\!T$(U&VE"XOP%0Z"T6@\0$ZS;_=@:+7OS_=P+HL/V#Q 2#/I Za XM1'4*N.0!4.C,#8/$ HM>U,:'E#P @T;^$(%^_H8+<P/IW/Z)?OA>7XOE7<.0a XM58OL_S:"!_]V"/]V!O]V!/9&"@1T!K@A .L0D/9&"@)T!K@@ .L$D+@C %#Va XM1@H0= :X.@#K!)"X( !0]D8*('0&N"H ZP20N" 4+CG 5#HE16#Q!" -H('a XM UW#D%6+[(/L!E=6_W8*N/T F5)0BT8(F5)0Z)PL4E#_=@2X P)0Z&05@\0*a XM_PX2!7@/BQX0!?\&$ 6*!RKDZPN0N! %4.B!%8/$ B7? (E&^CT* '0D_PX2a XM!7@/BQX0!?\&$ 6*!RKDZPN0N! %4.A7%8/$ CT* '7<@W[Z670#Z<< BT8&a XMB4;ZBW[\Z:P N" "4.CW%(/$ O\V@ ?_-H0'5NA5"X/$!@O =>.+'H 'BH?_a XM "KDB_B+PXE&_@O_?F*+\( \?W4?_PX:!7@/L F+'A@%_P88!8@'ZSZ0N!@%a XM4+@) .LMD( \FW45_PX:!7@%L KKVI"X& 50N H ZQ.0_PX:!7@$B@3KQ;@8a XM!5"*!"KD4.AR%8/$!$]&"_]UHXEV_HL>@ >*I_T *L"*C_X *NT#P8#D XE&a XM^H-^^@!T!HMV^NE2_XE^_%Y?B^5=PY!5B^R#[ Q75J L 8A&]/]V"KC] )E2a XM4(M&")E24.A(*U)0_W8$N$D"4.@0%(/$"O9&"@1T!;C_ .L#N , B4;X_PX2a XM!7@.BQX0!?\&$ 6*!RKDZPJX$ 50Z!T4@\0")=\ B4;Z/0H ="3_#A(%> ^+a XM'A %_P80!8H'*N3K"Y"X$ 50Z/,3@\0"/0H ==R#?OI9= ^#?OI!= F#?OI"a XM= /I\0"#?OI!=0;&1O0 ZPJ#?OI"=03&1O0!N&4"4/]V!.B,!X/$!(E&]@O a XM=13_=@2X: )0Z&83@\0$7E^+Y5W#D(M&!HE&^NMUN( "4.A-$X/$ O\V@ ?_a XM-H0'5NBK"8/$!@O =>.+'H 'BH?_ "KDB4;\B\.)1OZ#?OP ?B2+?O:+\(!^a XM] !T0%>*!"KD4.A3!X/$!/]._$:#?OP =>2)=OZ+'H 'BH?] "KD(T;XBN@Ja XMR8J'_@ JY /(B4[Z@W[Z '0GBW;ZZXJ /']U!U>X"0#KNI" /)MUKU>X#0!0a XMZ ,'@\0$5[@* .NC_W;VZ&8'@\0"7E^+Y5W#D%6+[(/L"%=6OI -*\GK!9#&a XM! !&B\%!/0 %?/2)=OJ)3OB_D W'1OAH <=&_@, _S: !_]V!/]V^/].^.C0a XM"(/$!@O =!2XJ0)0Z%42@\0"N $ 4.@+#(/$ BO)B_>+%H 'B]D#VHH'B 1&a XM08'Y %\\(O^B4[\@#Z0#0=V&+BP)U"XZ )0Z!D2@\0$N $ 4.C/"X/$ O]&a XM_HM&_HH.D TJ[3O!=HF)?OI>7XOE7<.058OL@^P(5U:_D W'1OAH :"0#2KDa XMB4;^*\F+]XL6@ >+V0/:B@2(!T9!@?D 7SPB_Z)3OS_-H '_W8$_W;X_T[Xa XMZ&((@\0&_T[^@W[^ WW'B7[Z7E^+Y5W#58OL@^P25U:XA@M0Z-0'@\0"QT;Xa XM___I+@*+7@;_-[CX/%#H4PF#Q 2)1OP+P'0#Z?,!BW[X_S84/?\V$CVX%CU0a XMN T#4.A/$8/$"(,^+ $ = 6X*P/K [@N U"X%CU0Z-$/@\0$B4;TN(8+4+@2a XM %"X 0!0Z"('@\0&N!8]4.CF 8/$ HE&_NA)!(E&\(E&\HM&_K$$T^ E< ")a XM1O8#!H 'B4;NB]B*1O"(1P.*1O&(1P2+1OZQ ]/X!6D!B4;V_S: !_\VA =0a XMZ($'@\0&N(8+4.@-!X/$ L=&^@$ L0+39O['1O8 (MV_.D2 8/^"G4#OIL a XM@7[V_0!] ^GR .C1 XOX"_]^ ^F0 +@P U#HA1"#Q *)=OS_=O3H*0Z#Q *+a XM'H 'BD;^B(?] ,:'_@ BD;VB(?_ +B&"U"X$@!0N $ 4.A2!H/$!O\V@ ?_a XM-H0'_W;PZ/0&@\0&BT;RB4;PBT;^T?C1^%"X0@!0_W;ZZ.("@\0&N(8+4.AEa XM!H/$ KCX/%#H_@>#Q (+P'0#Z8X "_]U ^F' .F:_HL>@ >*1OZ+U[$(T_H"a XMPHB'_0"+QXB'_@#&A_\ _;B&"U"X$@!0N $ 4.C1!8/$!O\V@ ?_-H0'_W;Pa XMZ',&@\0&N(8+4.C_!8/$ HE^\,=&]@ _T;ZBU[V QZ !XO&B ?_1O;_=O3Ha XM !Z#Q *+\ OV?0/I!/^#_@ET ^G4_KY_ .G6_HE^^.L?D(M>!O\W@W[\$GT%a XMN$L#ZP.X7 -0N&T#4.A7#X/$!H-&!@+_3@1X ^G*_;B&"U"X$@!0N $ 4.@[a XM!8/$!EY?B^5=PU6+[(/L'%=6QT;J #'1NP +@@(+D% (U^\!8'\JNJ@T;La XM"\9&^P"+=@2+3NJ /"YT$X \ '0.B_F*!(A#\$9!@_D+?.B)=@2)3NJ#^0M]a XM*XO>@#\N=22Y" #K"9"+^8H$B$/P04: / !T"H/Y"WT%@#P*=>B)=@2)3NJ_a XM___'1NII <=&Z$@+BW;L_S: !_\VA ?_=NKH P6#Q 8+P'04N'@#4.B(#H/$a XM K@! %#H/@B#Q (K]HM&Z(E&YHE&Y(U&\%"+'H 'C4 %4.@S H/$! O =!R+a XM_K$$T_\#?N2![T@+B\>)?NZ)=NQ>7XOE7<.0BQZ !X X '43"_]]0XO^L033a XM_P-^YH'O2 OK-(L>@ ?V (!T$0O_?0V+_K$$T_\#?NB![T@+@\80@?Z 'R/a XM@T;H"/]&ZH%^ZG$!?0/I2O^)?NZ)=NP+_WT4N+8#4.C=#8/$ K@! %#HDP>#a XMQ *+1NZQ ]/XBT[J@>EI 3O!=#O_-H '_S:$!XM&[K$#T_@%:0%0Z!4$@\0&a XM"\!T'HMV[K$#T_Z!QFD!_S: !_\VA =6Z/<#@\0&"\!U[8M&[B4' +$$T^ #a XM!H 'B4;\B]C&!P.#1OP%QT;J "+7ORY!0"+^XUV\!X'\J6D@T;J"X-&_ N+a XM1NY>7XOE7<.058OL@^P$5O\V@ ?_-H0'BT8(L0/3^ 5I 5#HD@.#Q 8+P'0>a XMBW8(L0/3_H'&:0'_-H '_S:$!U;H= .#Q 8+P'7MBT8(L033X"5P (E&_HOPa XM S: !XI&!H@$BT8$B40!_S: !_\VA >+1@BQ ]/X!6D!4.B! X/$!EZ+Y5W#a XM58OL@^P(5KX* .L!1H"\D T =1"!_@ %?/(KP(EV_%Z+Y5W#B7;\B\:Q ]/@a XM+5 B4;^QT;Z@ "+WO:'D V =1V*AY -*N2+\(M6_HM.^M'Y0HO!A<9T]XE6a XM_HE.^HM>_(M&^O?0((>0#8L>DCS_#XM&_EZ+Y5W#58OL5HM>!+$#T_N+=@2#a XMY@?1YHJ$&@$(AYH-7EW#58OL@^P"5U8KR8M^!(MV!D>L.$7_=!$KP(E^!(EVa XM!HE._EY?B^5=PT&#^0M\XHE^!(EV!HE._K@! %Y?B^5=PU6+[(/L KB&"U#Ha XM+ *#Q +_=@;_=@3H<0J#Q 2)1OZXA@M0N!( 4+@! %#HP@&+1OZ+Y5W#D%6+a XM[(/L H$^*@$ *')0N(8+4.CN 8/$ O]V!K@ *%"X 0!0N) 24.A2"H/$"(E&a XM_CT *'01N H*T;^4+C1 U#H=0N#Q 3'!BH! "XA@M0N!( 4+@! %#H7P&#a XMQ :+'BH!_P8J 8I&!(B'D!*+Y5W#D%6+[(/L KB&"U#HA &#Q *#/BH! '0Na XM_W8$_S8J ;@! %"XD!)0Z.$)@\0(B4;^H2H!.4;^= XK1OY0N ($4.@$"X/$a XM!,<&*@$ /]V!.BE"(/$ KB&"U"X$@!0N $ 4.CE (OE7<.058OL@^P$5U8Ka XM]HM^!+C^ %#_-H '5U;HV &#Q @+P'T+5K@L!%#HM0J#Q 1&@_XH?-N)=O['a XM1OX "O N0 !OY -'@?RJX!&_P+&!I - K#$HI,-HI$-L *BE VBD@V^! !6a XMZ"S^@\0"1H'^: %\\HEV_KYQ 5;H&/Z#Q )&@?[0 GSRB7;^QT;^ KP+D a XM K^&!QX'\JN 1O\$_W8$Z$KX@\0"OFD!BWX$N(8'4%=6Z-\ @\0&1H'^<0%\a XM[8EV_EY?B^5=PY!5B^R+1@2,V[$$T^,#V('[ /YV BO#7<-5B^P>5U;\,_8>a XM!X[>Q39X (M^"+D% /.E@^X*BD8$BF8&B40#QD0%',9$!Q@NB"8V$[0 B]C1a XMXRZ+GR@3+HD>-!/-$UY?'UW#58OL'E=6,\GB_OR+=@0SP([ )L0^> "Q!?.Ea XMS1->7Q]=PU6+[ 965^A >@) '(",\!?7@==P^C6 %)14[@! LT3G%!S$B[^a XM#C@3= M8G;0 S1-;65KKXEB=6UE:G+F ";W%T-#XOF=PU6+[ 965^CX .@%a XM %]>!UW#Z)( 4E%3N8 )O<70T/B^5M945.X 0/-$W,@4+0 S1-86UE:+OX.a XM.!-UV%%3N8 )O<70T/B^5E;^<-;4[F ";W%T-#XOFX !;65K#58OL'@97a XMBWX(C-B.P+0!BUX*BFX$_(H'//]T#4,FB"U')L8% $>KZ^TK7@J+PXM>"+$!a XMM@"*5@:T!<T3N <P%(7P<?7<-(,](N]S8V$_["BNB*RK8 .BXH07(Z_L;Va XM!BM#@'0& BXJ0^L&BBXJ0RKH]@8G08!U'HH.)D$JRBXZ#C83=A$N*@XV$_[-a XM]@8K0X!T X#% HI6!B[&!C@3!9##BUX(C-B.P(M&!,-5B^R+5@2T.\TA<@(Sa XMP%W#58OLBU8$M#G-(7(",\!=PU6+[(M6!K1.N0< ZQE5B^RT+\TA5HMV!+D6a XM *TFB0=#0^+X7K1/S2%R&[0OS2%7BWX$N18 )HL'B05'1T-#XO5?,\!=PU"+a XM?@2Y%@"X___SJUA=PXS8PX $ @ $ @ $ ! +0PS2$\ G,"S2"_a XM)0.+-@( *_>!_@ 0<@.^ !#ZCM>!Q"Y#^W,0%A_H]P$SP%#H=@2X_TS-(8/Da XM_C:))DX$-HDF2@2+QK$$T^!(-J-(! /WB38" (S#*][WV[1*S2$VC!Z_!!8'a XM_+]0![DP0RO/,\#SJA8?Z#L %A_HD@/H 0(S[?\VX 3_-MX$_S;<!.A&[%#Ha XMX@"X)0..V+@# #;'!DP$L!10Z'L!Z/T#N/\ 4/\63 2T,,TAH\$$N US2&)a XM'JT$C :O! X?N ENLX3S2$6'XL.:@;C+HX&OP0FBS8L ,4&; :,VC/;-O\>a XM: 9S!18?Z4T!-L4&< :,VKL# #;_'F@&%A^.!K\$)HL.+ #C-H[!,_\F@#T a XM="RY# "^H 3SIG0+N?]_,\#RKG49Z^4&'@<?B_>_R 2LF)&L_L!T 4BJXO<6a XM'[L$ ("GR 2_N !$S2%R"O;"@'0%@(_(!$!+>>>^= :_= ;HH@"^= :_= ;Ha XMB@##58OLOG8'OW8'Z'T OG0&OW8&Z'0 ZP-5B^R^=@:_=@;H9@"^=@:_=@;Ha XM; #HN0 +P'0+@WX$ '4%QT8$_P"Y#P"[!0#VA\@$ 70$M#[-(4/B\N@' (M&a XM!+1,S2&+#FH&XP>[ @#_'F@&'L46K02X "7-(1^ /NH$ '0-'J#K!,46[ 2Ta XM)<TA'\,[]W,*3T^+#>/V_]'K\L,[]W,.@^\$BP4+10)T\O\=Z^[# %6+[+C\a XM %#H>P*#/O $ '0$_Q;P!+C_ %#H:0*+Y5W#N ( Z5O^68O<*]AR"CL>\@1Ra XM!(OC_^$SP.E%_E8S]KE" #+D_*PRX.+[@/15= WHKO^X 0!0Z"P"N $ 7L./a XM!O0$N@( .!;!!'0IC@:_!":.!BP C ;D!#/ F;D @#/_\JZN=?M'1XD^X@2Ya XM___RKO?1B]&_ 0"^@0".'K\$K#P@=/L\"73W/ UT;PK =&M'3JP\('3H/ ETa XMY#P-=%P*P'18/")T)#Q<= -"Z^0SR4&L/%QT^CPB= 0#T>O3B\'1Z1/1J %Ua XMRNL!3JP\#70K"L!T)SPB=+H\7'0#0NOL,\E!K#Q<=/H\(G0$ ]'KVXO!T>D3a XMT:@!==+KEQ8?B3[<! /71]'G ]> XOXKXHO$H]X$B]@#^Q8'-HD_0T/%-N($a XMK*H*P'7ZOH$ -HX>OP3K S/ JJP\('3[/ ET]SP-=0/I?P *P'4#ZWF0-HD_a XM0T-.K#P@=-L\"737/ UT8@K =%X\(G0G/%QT ZKKY#/)0:P\7'3Z/")T!K!<a XM\ZKKT;!<T>GSJG,&L"*JZ\5.K#P-="X*P'0J/")TMSQ<= .JZ^PSR4&L/%QTa XM^CPB= :P7/.JZ]FP7-'I\ZISEK BJNO-,\"J%A_'!P _R;T!%6+[%6.'K\$a XM,\F+P8OIB_E)BS8L OV=!".QB: /@ '0&\JY%KG7Z19= )/Z+_='E \46a XM'U>_"0#HA0!?B\^+_0/XB2[@!!X'CMXS]DGC$X$\.T-T!8E^ $5%K*H*P'7Za XMXNV)3@ 6'UV+Y5W#58OL5E<>!XM6!+Y^!JT[PG000)9T#)<SP+G___*NB_?Ka XMZY9?7HOE7<(" %6+[%?_=@3HR_\+P'04DHOZ,\"Y___RKO?12;L" +1 S2%?a XMB^5=P@( B] #!DX$<C4Y!D@$<R4%#P!0T=BQ ]/HC-F+'K\$*\L#P8[#B]BTa XM2LTA6'(0)/!(HT@$E8LN3@0!%DX$PXO'Z9'[<A,SP(OE7<-S^%#H& !8B^5=a XMPW,'Z X N/__F8OE7<,RY.@! ,.BQ 0*Y'4C@#[!! -R#3PB<PT\('(%L 7Ka XM!Y \$W8"L!.[]@37F*.Y!,.*Q.OW58OL@^P05U:+=@2____V1 :#=0/IEP#Va XM1 9 = /IC@!6Z"H'@\0"B_B+WH'K$ 6Q ]/[B\/1XP/8T>.+A[0%B4;\5NA<a XM!(/$ HI$!YA0Z(T0@\0""\!\4X-^_ !T4+@*!5"-1O)0Z(D7@\0$C4;TB4;^a XMB]B ?_Y<=!"X# 50C4;R4.@M%X/$!.L#_T[^N H 4/]V_O]V_.C^%X/$!HU&a XM\E#HRAB#Q (+P'0#O___QD0& (O'7E^+Y5W#58OL@^P$5U:^$ 4K_^L5D/9$a XM!H-T"U;H>@:#Q ) = %'@\8(.38H!G/FB\=>7XOE7<-5B^R#[ )6Z(X/B_ +a XM]G005O]V!O]V!.@V!(/$!NL#D"O 7HOE7<.058OL@^P(5U:+=@2+?@J+1@;Wa XM9@B)1OZ)1OR#?@8 = :#?@@ =08KP.D+ 9#V108,=66+WX'K$ 6Q ]/[B\/1a XMXP/8T>/VA[ % 75,]T;\_P%U(/]V_%:*10>84.B($H/$!HE&^#W__W2]*]+Wa XM=@;IQ0"0_TT"> N*!(L=_P6(!^L,D%>*!)A0Z*X!@\0$]D4&('631O]._/9%a XM!@AU0(O?@>L0!;$#T_N+P]'C ]C1X_:'L 4!=%SK)?]- G@+B@2+'?\%B ?Ka XM#)!7B@284.AH 8/$!/9%!B!U4T;_3OR#?OP =$F#?0( =,^+10(K1OP;R2/!a XM T;\B4;Z4%;_->C.%H/$!HM&^@$% _ I1OPI10+KR_]V_%:*10>84.C($8/$a XM!HE&^#W__W0#*4;\BT;^*T;\Z33_D%Y?B^5=PU6+[(/L"%=6OA@%C48&B4;\a XM5NC/ X/$ HOXC48&4/]V!%;H1P6#Q :)1OA65^@X!(/$!(M&^%Y?B^5=PU6+a XM[(/L E:+=@2+QBT0!;$#T_B+R-'@ \'1X 6P!8E&_O9$!H-T!O9$!D!T![C_a XM_^F( )#V1 8"= : 3 8@Z^V 3 8!BU[^@"?[]D0&#'4BB]Z!ZQ %L0/3^XO#a XMT>,#V-'C]H>P!0%U"5;HUP&#Q +K!8M$!(D$BU[^_W<"_W0$BD0'F%#H"!"#a XMQ :)1 (+P'0%/?__=1F#? ( = 6P(.L#D+ 0"$0&QT0" #I?O^0_TP"BQS_a XM!(H'*N1>B^5=PU6+[(/L"%=6BW8&BD0'F(E&^HO&+1 %L0/3^(O(T> #P='@a XM!; %B4;X]D0&@W0&]D0&0'0+@$P&(+C__^D0 9#V1 8!=>^ 3 8"@&0&[RO a XMB40"B_B)?OSV1 8,=5^+WH'K$ 6Q ]/[B\/1XP/8T>/VA[ % 75&@?X8!70&a XM@?X@!74S_W;ZZ.D4@\0""\!U+?\&#@6!_A@%=0:XD OK!)"X*D&)1 2)!(M>a XM^,=' @ "Q@<!ZPB05NC* (/$ O9$!@AU&8O>@>L0!;$#T_N+P]'C ]C1X_:'a XML 4!=%"+/"M\!(M$!$")!(M>^(M' DB)1 (+_WX35_]T!/]V^NBO#X/$!HE&a XM_.L:D(M>^O:'R 0@= ^X @!0*\!04%/HE R#Q B+7 2*1@2(!^L7D+\! (O'a XM4(U&!%#_=OKH<@^#Q :)1OPY?OQT ^GK_HI&!"KD7E^+Y5W#D%6+[%:+=@3Va XM1 :#=!WV1 8(=!?_= 3H>1"#Q * 9 ;W*\")!(E$!(E$ EY=PY!5B^R#[ )6a XMBT8$+1 %L0/3^(O(T> #P='@!; %B4;^N "4.A0$(/$ HM>!(E'! O = ^ a XM3P8(BU[^QT<" +K%Y"+7@2 3P8$BT;^0(E'!(M>_L=' @$ BUX$B_.+1 2)a XM!\=' @ 7HOE7<-5B^R#[ I75HMV"(M>!HH'F#UA '0H/7( = L]=P!T%"O a XMZ<T D"O_QD;\ ;D! (I6_.L?OP$#QD;\ NOOD+\) >OTD/?' @!U/X'/ @"#a XMY_ZR@/]&!HM>!H _ '0V"\ET,HH'F#TK '3:/6( =!,]= !U%8O'J0# =0Z!a XMSP! Z]*0B\>I ,!T!2O)Z\:0@<\ @.N_B%;\B4[^N*0!4%?_=@3HEPN#Q :)a XM1OH+P'T#Z6[_BD;\B$0&_P8.!8O&+1 %L0/3^(O(T> #P='@!; %B4;X*L"+a XM7OB(!YB)1 +'1P0 "O B02)1 2*1OJ(1 >+QEY?B^5=PU6+[(/L!%:+=@3_a XM!@X%@?X8!74(QT;^D OK#)"!_B %=23'1OXJ0?9$!@QU&8O>@>L0!;$#T_N+a XMP]'C ]C1X_:'L 4!= 0KP.LUB\8M$ 6Q ]/XB\C1X /!T> %L 6)1OR+1OZ)a XM1 2)!(M>_+@ HE' HE$ L8' 8!,!@*X 0!>B^5=PU6+[(/L E:#?@0 =%N!a XM?@88!70'@7X&( 5U=HM>!HI'!YA0Z. 1@\0""\!T9(M&!BT0!;$#T_B+R-'@a XM \'1X 6P!8E&_O]V!NA+ (/$ HM>_L8' ,=' @ BUX&B_,KP(D$B4<$ZRJ0a XMBUX&@7\$D MT!X%_!"I!=1B*1P>84.B%$8/$ @O = G_=@;H" "#Q )>B^5=a XMPU6+[(/L!%=6BW8$*_^*1 8D SP"=4;V1 8(=1F+WH'K$ 6Q ]/[B\/1XP/8a XMT>/VA[ % 70GBP0K1 2)1OP+P'X;4/]T!(I$!YA0Z%\,@\0&.T;\= > 3 8@a XMO___BT0$B03'1 ( (O'7E^+Y5W#58OLN&0!Z!WU5U:+=@:-AI[^HVX'BT8(a XMHUX'BT8$HU('QP9H!P QP9F!P Z7P"@#PE= /I6 +'!FH' 0 KP*-:!Z-6a XM!Z-D!Z-8!Z-B!Z-@!Z-4!Z-0!Z-<!\<&= <@ (!\ 3!U/$;'!G0', #K,X \a XM*W4-_P9:!\<&8 < .LBD( \('4-@SY:!P!U%?\&8 ?K#_\&4 ?K"8 \+771a XM_P9<!T:*!)A0Z/4'@\0""\!UZ%:X< =0Z&8'@\0$B_"#/G ' 'T,_P9<!Z%Pa XM!_?8HW '@#PN=2/_!F('1E:X:@=0Z#P'@\0$B_"#/FH' 'T*QP9J!P$ _PYBa XM!XH$F#U& '0R/4X =#4]: !T(#UL '4&QP98!P( @SY8!P!U!8 \3'4!1H \a XM '4;Z8@!QP98!P$ Z^/'!E@'$ #KV\<&6 <( .O3B@28B8:<_CU% '0*/4< a XM= 4]6 !U"?\&5@>#AIS^((N&G/XM8P ]%0!V ^D4 0/ DR[_IR8CBQY>!XL?a XMH68'B0>#!EX' NEI 9#_!F0'QP90!P N H 4.A_ 8/$ NE1 9"X" #K\)#_a XM!E0'_P96!X,^8@< =0G'!FP' 0#K!Y#'!FP' #_!F('QP9J!P0 @SY8!PAUa XM ^F( "O HU@'B4;\.09P!W0GH7 'B4;\@SY<!P!T"<<&< < .L2D(,N< <%a XMH7 '"\!] BO HW '@P9>!P*X$ !0Z/\ @\0"N#H 4.C/ X/$ H-^_ !T(H,^a XM7 < =!6+1OPM!0"C< <+P'T"*\"C< ?K!Y#'!G ' "#+EX'!+@0 %#HO@"#a XMQ +I'_^X$ #I+_\KP%#HX@'I*O^0N $ Z_.0_[:<_NBY ND9_X,^6 < = .+a XMQDZ+_D> /0!T!8 ])77UB\<KQE >5NCM X/$!HOW@#P = /I?/V#/F8' '59a XMBQY2!_9'!B!T3[C__^M-TB+N(=@BV"+8(N(B[B'B(N(BXB+B(M8A B(((N(Ba XMXB+((N(BZB'B(N(BPB*#/F@' '03@SYF!P!U$(L>4@?V1P8@=;?K!$;KF9"Aa XM9@=>7XOE7<.058OL@^P85U:#?@0*= 3_!F0'@SY8!P)T!X,^6 <0=1:+'EX'a XMBP>+5P*)1OR)5OZ#!EX'!.LJ@SYD!P!T$8L>7@>+!XE&_,=&_@ ZPZ0BQY>a XM!XL'F8E&_(E6_H,&7@<"@SY0!P!T#8M&_ M&_G0%BT8$ZP(KP*-R!XLV;@>#a XM/F0' '4J@W[^ 'TD@WX$"G47Q@0M1HM&_(M6_O?8@]( ]]J)1OR)5O['1O@!a XM .L%QT;X "-1NB+^/]V!%?_=O[_=OSH%0V#Q B#/F(' '0A5^AW#(/$ HL.a XM:@<KR(E.].L%D,8$,$:+P4D+P'_UB4[TBPY6!XH%B 0+R70'/&%\ X L($9'a XM@'W_ '7I@SYD!P!U%*%:!PL&8 =T"X-^^ !U!;@! .L"*\!0Z+("@\0"7E^+a XMY5W#D%6+[(/L$%=6@WX$ '04O@$ H5X'B4;XC%[Z@P9>!P+ID0"#/E@'$'47a XMBQY>!XL'BU<"B4;XB5;Z@P9>!P3K%9"+'EX'BP>)1OR)1OB,7OJ#!EX' H,^a XM6 <0=0V+1O@+1OIU%+@J!NL)@W[\ '4)N#$&B4;XC%[ZBT;XBU;ZB4;RB5;Ta XM*_8Y-F('=!R+#FH'ZPZ0Q%[R_T;R)H _ '051CO.?A#K[9!&Q%[R_T;R)H _a XM '7SBSYP!RO^@SY<!P!U!U?H'@&#Q )6_W;Z_W;XZ&\!@\0&@SY<!P!T!U?Ha XM P&#Q )>7XOE7<-5B^R#[ 2A7@>)1OZ#?@1G= :#?@1'=02P >L"*L"(1OR#a XM/F(' '4&QP9J!P8 @'[\ '0-@SYJ!P!U!L<&:@<! /\V5@?_-FH'_W8$_S9Na XM!_]V_O\65@:#Q J ?OP =!*#/E ' '4+_S9N!_\66 :#Q *#/E ' '02@SYJa XM!P!U"_\V;@?_%EP&@\0"@P9>!PC'!G(' "A6@<+!F '=!/_=O[_%EX&@\0"a XM"\!T!;@! .L"*\!0Z @!B^5=PU6+[%:#/F@' '4OBQY2!_]/ G@.BD8$BS?_a XM!X@$*N3K"Y!3_W8$Z&_U@\0$0'4'_P9H!^L%D/\&9@=>7<.058OL@^P"5U:#a XM/F@' '5)BW8$"_9^0NL5_S92!_\V= ?H-_6#Q 1 =03_!F@'B\9."\!^%HL>a XM4@?_3P)XVZ!T!XL__P>(!2KDZ]R#/F@' '4'BT8$ 09F!UY?B^5=PU6+[(/La XM E=6BW8(@SYH!P!U4.L<_S92!\1>!":*!YA0Z-GT@\0$0'4$_P9H!_]&!(O&a XM3@O =!V+'E('_T\">-3$7@0FB@>+'E('BS__!X@%*N3KTH,^: < =0>+1@@!a XM!F8'7E^+Y5W#58OL@^P*5U:+-FX'*\")1OR)1OJ#/G0','48.09B!W02.094a XM!W0&.09L!W4&QP9T!R BSYP!U;H,0F#Q *)1O@K^"M^!(,^7 < =1B /"UUa XM$X,^= <P=0RLF%#HG?Z#Q +_3OB#/G0','0+"_]^!X,^7 < =!F#?@0 = ;_a XM1OKH7P"#/G(' '0&_T;\Z&H @SY<!P!U)E?HG_Z#Q *#?@0 = F#?OH =0/Ha XM-0"#/G(' '0)@W[\ '4#Z#T _W;X'E;HT_Z#Q :#/EP' '0-QP9T!R 5^AAa XM_H/$ EY?B^5=PX,^6@< = 6X*P#K [@@ %#H!_Z#Q +#D+@P %#H^_V#Q *#a XM/G('$'47@SY6!P!T!KA8 .L$D+AX %#HW?V#Q +#D%6+[(/L!%=6BW8&QT;^a XM 0" /"IU#XL>7@>+/X,&7@<"1NM(D( \+74&QT;^__]&*_^ /#!\-8 \.7\Pa XM.3YB!W4+@#PP=0;'!G0', "*!)B+S]'AT>$#S]'A \B#Z3"+^4: /#!\!8 \a XM.7[ABT;^]^^+^(M>!(D_B\9>7XOE7<.058OL@^P"5KXX!HI.!.L"D$: / !Ta XM"CH,=?:X 0#K Y KP%Z+Y5W#D%6+[(/L E:^$ 6+#B@&]D0&@W46*\")1 *(a XM1 :)1 2)!,9$!_^+QNL,D(O&@\8(.\%UVRO 7HOE7<-5B^Q6BW8$_TP"> J+a XM'/\$B@<JY.L'5NBT\8/$ EY=PU6+[(M>!#L>Q@1R!K@ "?GK"[0^S2%R!<:'a XMR 0 Z:[N58OL@^P$BUX$.Q[&!'(%N )ZRKW1@@ @'1(@WX* '0:,\F+T;@!a XM0LTA<DOW1@H" '4. T8&$U8(>2BX !;YZS:)5OZ)1OR+T;@"0LTA T8&$U8(a XM>0V+3OZ+5ORX $+-(>O8BU8&BTX(BD8*M$+-(7(%@*?(!/WI1^Y5B^R#[ 0Ra XM_XA^_HM&!HO(QD;\ *D @'40J0! =0?V!C\&@'4$QD;\@(M6!"0#"L>T/<TAa XM<Q(] @!U"??! %T ^FA /GI_^V3B\$E 4] 5U";0^S2&X !'KZ,9&_0&Xa XM $3-(?;"@'0$@$[\0/9&_$!T ^G5 (M&!JD G0=J0, = DSR;1 S2'IOP"Ta XM/LTABU8$N !#S2'K9Y#V1OR =0/IIP"I @!U ^F? +G__XO1N )"S2'WV8U6a XM_[0_S2$+P'05@'[_&G4/]]F+T;@"0LTA,\FT0,TA,\F+T;@ 0LTAZVB0QD;]a XM (M.".BD (E."/9&_O]U!_=&!@( =0. X?Z+5@2T/,TA<P/I.>V3]D;^_W4'a XM]T8& @!U,+0^S2&*1@8D PI&_HM6!+0]S2%RVI/V1OT!=13W1@@! '0-@,D!a XMBU8$N %#S2%RO_9&_$!U/8M6!+@ 0\TAB\$RR24! '0"L1#W1@8( '0#@,D@a XM.Q[&!'(*M#[-(;@ &.G%_@I._(#) 8B/R 2+PXOE7<,RR>O<H;L$]] CP3/)a XMJ(!U X#) <-5B^R#[ *+7@0['L8$<@;YN )ZUPSP(M.".-5]H?(! )U3HM.a XM"(M6!K0_S2%S!+0)ZS[VA\@$@'0W@*?(!/M65_R+\HOZB\CC);0-@#P*=06 a XMC\@$!*PZQ'09/!IU!X"/R 0"ZP6(!4?BZXO'*\)?7NDO[(/Y 70'@#P*=.OKa XMYO:'R 1 =!BX $3-(??"( !U"8U6_[0_S2%RU+ *ZRS&1O\ C5;_M#_-(7+#a XM"\!T&8-^" %T'[G__XO1N %"S2&Y 0" ?O\*= >P#8M6!NN6BU8&ZY2 ?O\*a XM==OKO@!5B^R#[ B+7@0['L8$<@>X GYZ:_K]H?(!"!T"[@"0C/)B]'-(7+Ka XM]H?(!(!T;HM6!AX',\")1OZ)1OS\5U:+^HORB6;XBTX(XU2P"O*N=4KHU ]a XMJ !V2(/L HO<N@ "/2@"<P.Z@ KXHO4B_H6!XM."*P\"G0,._MT&:KB].@Ca XM .MAL T[^W4#Z!@ JK *_T;\Z^/H#0#KXEY?ZU7K13/ Z9WF4%-1B\\KRN,0a XMBUX$M$#-(7(- 4;^"\!T!EE;6(OZPX/$"',$M GK'O:'R 1 = N+7@: /QIUa XM _CK#/FX !SK!HM&_BM&_(MF^%Y?Z='JBTX("\EU!8O!Z<7JBU8&M$#-(7,$a XMM GKY O =>#VA\@$0'0*B]J /QIU _CKS_FX !SKR5FA\@0[Q',&*\3WV/_Aa XM,\#K^E6+[(M>! O;= 2 3_X!B^5=PU6+[%97NT &@S\ =2D>![@% .AS 74%a XM,\"9ZR1 )/ZC0 :C0@:6QP0! (/&!,=$_O[_B39&!HM.!(S8CL#H"0!?7HOEa XM7</IS@!!=/J X?Z#^>YS\HMW ORMB_ZH 71"2#O!<Q6+T /PK:@!=#0#P@4"a XM (OWB43^Z^:+_G0, _F)3/XKP4B)!>L% _G^3/Z+QHS:C-$[T70%)HP>3@:)a XM?P+#)L8&5 8"/?[_="6+_@/PK:@!=/*+_D@[P7.]B] #\*VH 73B \(% @"+a XM]XE$_NOFBT<("\!T!([8ZQ0F_@Y4!G01C-B,USO'= 4FCAY*!HLWZ[R+=P8Sa XMP.AJ #O&= TD 4! F.A> '0-_DW^Z!P = 663D[KF8S8C-$[P70$)J-.!HL'a XMB4<",\"9PU&+1?ZH 70#*\A)04&Z_W\F.Q90!G8$T>IU]8O! \9R%0/"<@WWa XMTB/"*\;H# !U"/?2T>IUY3/ 6<-24>@= '085XO^B_ #\L=$_O[_B7<&B]8Ka XMUTJ)5?Y865K#4U STAY24E"X 0!0!A_H#P"#Q B#^O\?6EMT @O2PP!5B^Q6a XM5P:#?@@ =3B_3@2+5@:+1@1(=0?H4P!R)^M(BS:>!$AT$3OW= V+1 *)1@Q6a XMZ#H 7G,P@\8$@?Z>!',$"])U!KC__YGK'8O:@\,/T=NQ ]/KM$C-(7+IDHD$a XMB50"B3:>!#/ !U]>B^5=PXM.#(OW.4P"= R#Q@2!_IX$=?+YZS^+V@,<<CF+a XMTX[!._=U!CD>2 1S)H/##]';T>O1Z]'K._=U"0/9H;\$*]B.P+1*S2%R#3OWa XM=02)%D@$DH<$B]'#58OLB]>+WHS8CL"+?@0SP+G___*NC77_BWX&N?__\J[Wa XMT2OYA_Z+1@3WQ@$ = *D2='I\Z43R?.DB_.+^EW# %6+[(O7B]Z+=@:+_HS8a XMCL SP+G___*N]]&+?@2+QZ@!= *D2='I\Z43R?.DB_.+^EW#58OLB]>,V([ a XMBWX$,\"Y___RKO?129&+^EW# .D! !5B^Q75HMV!#/ F3/;K#P@=/L\"73Wa XM4#PM= 0\*W4!K#PY=Q\L,'(;T>/1THO+B_K1X]'2T>/1T@/9$]<#V(/2 .O<a XM6#PMDW4']]B#T@#WVEY?7<-5B^Q65[,!BTX(BT8$,]*#^0IU 9F+?@;I9P a XM58OL5E>S .E0 %6+[(M>!#L>Q@1]$8/[ 'P,]H?(!$!T!;@! .L",\"+Y5W#a XM %6+[(O7B]Z,V([ BW8&BWX$B\>+3@CC#J@!= *D2='I\Z43R?.DB_.+^EW#a XMBTX*BT8$BU8&BWX(5QX'_),*P'03@_D*=0X+TGD*L"VJ]]N#T@#WVHOWDC/2a XM"\!T O?QD_?QDH?3!# \.78"!">JB\(+PW7BB 5/K(8%B$3_C40!.\=R\EA?a XM7HOE7<, 58OLBU8$M$'-(>DQY@!5B^R+1@:+7@H+V(M>"'4+BT8$]^.+Y5W"a XM" #WXXO(BT8$]V8* \B+1@3WXP/1B^5=P@@ !-4R!2=6XM5&EMa XM92!,:6)R87)Y("T@0V]P>7)I9VAT("AC*2 Q.3@X+"!-:6-R;W-O9G0@0V]Ra XM<!$ 26YV86QI9"!S=VET8V@Z(&]N;'D@3"]I<W1$:7(L(% O<FEN=$9I;&5Sa XM+"!2+V5A9$9I;&5S+ H (" @(%<O<FET949I;&5S(&]R($DO;FET:6%L:7IEa XM1&ES:PH 57-A9V4Z('5T:6P@+UM,?%!\4GQ)72!;+U0X,%T@6T%\0GQ#?$1=a XM.B @(" @(&]R"@ @(" @(" @=71I;" O5R!;07Q"?$-\1%TZ(&9I;&4@6V9Ia XM;&4@+BXN(%T* &#!(%"Q$$"A #"0\"" X!!PW_ @ ! " a XM$ ( 0 @ ! E,#-8("4P,E@E,#)8("4P,E@E,#)8("4P,E@E,#)8a XM("4P,E@E,#)8 " E,#)8)3 R6" E,#)8)3 R6" E,#)8)3 R6" E,#)8)3 Ra XM6 H 1FEL97,@:6X@(B5C.B5S(@H 1F%I;'5R92!R96%D:6YG(&1I<F5C=&]Ra XM>2$@($]P97)A=&EO;B!A8F]R=&5D(0H 0V%N;F]T('5S92!O<B!C<F5A=&4@a XM9&ER96-T;W)Y("(E<R(* "XN "5C)6,E8R4M,3)S6R4P-%A=("5D('-E8W,Ea XM8P!0<FEN=" E<R@E;&0@8GET97,L(&8])3 R6"D_ #4@1F%I;'5R97,@<F5Aa XM9&EN9R!S96-T;W(@;VX@071A<FD@9&ES:PH 0V]P>2 E<R@E;&0@8GET97,La XM(&8])3 R6"D_ '=B $-A;FYO="!C<F5A=&4@9FEL92 B)7,B #4@1F%I;'5Ra XM97,@<F5A9&EN9R!S96-T;W(@;VX@071A<FD@9&ES:PH 56YA8FQE('1O(')Ea XM860@=&AE($%T87)I(&1I<VL@5E1/0R]":70@36%P(2 @4')O9W)A;2!A8F]Ra XM=&5D(0H 26YV86QI9"!D<FEV92P@;6]R92!T:&%N("5D('-E8W1O<G,* $-Oa XM<'EI;F<@/#PE<SX^+"!,96YG=&@@/2 E;&0* ')B '( 3F\@;6]R92!S96-Ta XM;W)S(&%V86EL86)L90H 26YV86QI9"!P871H(&9O<@!.;R!M871C:&EN9R!Fa XM:6QE "5S(#P\)7,^/@H 56YA8FQE('1O(')E860@4D]/5"!D:7)E8W1O<GD@a XM9F]R('5P9&%T:6YG(2!0<F]G<F%M(&%B;W)T960A"@!.;R!D:7)E8W1O<GD@a XM96YT<FEE<R!F<F5E"@!%<G)O<B!W<FET:6YG('1O($1/4R!F:6QE+" E9"!Ba XM>71E<R!N;W0@=W)I='1E;@H 17)R;W(@8VQO<VEN9R!F:6QE+" E9"!B>71Ea XM<R!N;W0@=W)I='1E;@H 17)R;W(@9F]R;6%T=&EN9R!T<F%C:R E9 H a XM #'% )0, a XM 3@0[0U]&a XM24Q%7TE.1D\ !0 @8&! 0$ a XM #F!"4#0P ,$0 6 @(8#0D,a XM# P'"!86_Q(-$@+_7 !< DCH )(Z 0 " 0 (" a XM A , "! a XM a XM $ a XM ( a XM a XM *@%*&YU;&PI "AN=6QL*0 Ka XM+2 C ( !\%7P5?!5\%7P5 a XM !:&3P\3DU31SX^ !2-C P, T*+2!S=&%C:R!O=F5Ra XM9FQO=PT* , 4C8P,#,-"BT@:6YT96=E<B!D:79I9&4@8GD@, T* D 4C8Pa XM,#D-"BT@;F]T(&5N;W5G:"!S<&%C92!F;W(@96YV:7)O;FUE;G0-"@#\ T*a XM /\ <G5N+71I;64@97)R;W(@ ( 4C8P,#(-"BT@9FQO871I;F<@<&]I;G0@a XM;F]T(&QO861E9 T* $ 4C8P,#$-"BT@;G5L;"!P;VEN=&5R(&%S<VEG;FUEa X(;G0-"@#___]Ea X a Xend END_OF_util.uue if test 21398 -ne `wc -c <util.uue`; then echo shar: \"util.uue\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of shell archive. exit 0