[comp.sources.amiga] v89i163: file - display file type

page%swap@Sun.COM (Bob Page) (07/12/89)

Submitted-by: ehoogerbeets@rose.waterloo.edu (Edwin Hoogerbeets)
Posting-number: Volume 89, Issue 163
Archive-name: unix/file.1

"file" is a unix-like utility to determine the type of file you have.

[uuencoded executable included.  ..bob]

# This is a shell archive.
# Remove anything above and including the cut line.
# Then run the rest of the file through 'sh'.
# Unpacked files will be owned by you and have default permissions.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: SHell ARchive
# Run the following text through 'sh' to create:
#	ReadMe
#	makefile
#	file.c
#	file.uu
# This is archive 1 of a 1-part kit.
# This archive created: Tue Jul 11 17:03:20 1989
echo "extracting ReadMe"
sed 's/^X//' << \SHAR_EOF > ReadMe
X             file v1.0 - Unix-like utility to determine
X                       the type of a file
X
X                Copyright 1989 Edwin Hoogerbeets
X
X  This code is freely redistributable as long as no charge other than
X  reasonable copying fees is levied for it.
X
XUsage:
X
X  file filename [filename ...]
X
X  [Options? We don need no steekeen options!]
X
XNotes:
X
X  This silly little hack I wrote for no particular reason other than
X  boredom in CS classes, where it was mostly written. ;-)
X
X  File recognizes the following types of files:
X
X    Amiga .font file - File containing the description of what is in
X                       a subdirectory of the fonts directory.
X                       ex: garnet.font
X
X    Amiga .info file - The silly little files you find hanging around
X                       in any directory you looked at with the WorkBench.
X                       ex: .info
X
X    Amiga icon .info file - A disk, drawer, project or tool icon.
X                            ex: System.info
X
X    Amiga load file - this type includes executables, shared libraries,
X                      devices, and loadable font files.
X                      They all have the format of an executable, so it
X                      is difficult to tell which is which. (anyone have
X                      a way of telling? Please mail me if you do)
X                      ex: c:Type, arp.library, ramdrive.device, garnet/16
X
X    Amiga object file - A file compiled with Lattice C, PDC or A68k.
X                        ex: SetFont.o
X
X    block compressed xx bit code data - a file compressed with the
X                                        compress program.
X                                        ex: constitution.Z
X
X    commands text - this file was not marked as a script file, but
X                    contains commands suitable as a script.
X                    ex: FooScript
X
X    C source code - file contains constructs that look like C. If these
X                    constructs are not found, the file may be mistaken
X                    for a ARexx script if the first two characters are
X                    `/*'
X                    ex: file.c
X
X    data - the file contains binary data of an unknown format.
X
X    directory - file is a directory
X
X
X    empty - the file contains nothing, making it impossible to determine
X            what kind of file it was meant to be in its former life.
X
X    execute script file - a file meant to be run with execute.
X                          ex: s:DPAT
X
X    IFF format file - File recognizes the following forms:
X
X                       8SVX   instrument file format
X                       ANIM   anim file format
X                       ACBM   Amiga compressed bit map format
X                       ILBM   interleave bit map format
X                       SMUS   simple music format
X
X    LaTeX source code - input file suitable for the LaTeX document
X                        preparation system.
X                        ex: resume.tex
X
X    Manx 3.6 run-time library - objects compiled with Manx 3.6 and
X                                stuck into a linkable library.
X                                ex: ed32.lib
X
X    Manx 3.4 object code
X    Manx 3.6 object code - file compiled with Manx 3.4 or 3.6 respectively
X                           ex: file.o
X
X    Modula II source code - file is source code for any Modula II
X                            ex: Primes.mod
X
X    SEA ARC compressed archive - an archive compressed with the ARC program.
X                                 ex: boff.arc
X
X    script file - text file with the script bit set.
X                  ex: s:FindOldFiles
X
X    shell commands - the file was not labeled as a script, but contains
X                     shell commands.
X                     ex: s:.cshrc
X
X    shell script - the file is a script for the Dillon/Drew shell.
X                   It searches for `#!' at the beginning of the file,
X                   so please add these to your Dillon/Drew shell scripts.
X                   ex: BackUpHD.sh
X
X    TeX device independent output file - output of Tex, LaTeX, BibTeX
X                                         or AMSTeX.
X                                         ex: letter.dvi
X
X    TeX source code - a file suitable for input to TeX document formatting
X                      system.
X                      ex: resume.tex
X
X    text - the file contains ascii characters of an unknown format
X           ex: ReadMe
X
X    uuencoded file - a file that is suitable as input for uudecode
X                     ex: file.uue
X
X    yacc input file - a file that is suitable as input to the yacc or
X                      bison parser generator programs.
X                      ex: grammar.y
X
X    yacc or lex input file - a file that is either suitable for yacc
X                             (bison) or lex. The exact format cannot
X                             be determined by file due to its
X                             unsophisticatedness. (how's that for a word?)
X                             ex: lex.l or hiddengrammar.y
X
X    Zoo x.xx archive - an archive made with the zoo program.
X                       ex: file.zoo
X
XWarning:
X
X  This program is a kludge. This program is only a kludge. Had this program
X  been real, it would have been a heck of a lot bigger. As it is, it only
X  checks the first 484 bytes of a file for format clues, and makes guesses
X  as to the probable file type. For binary files, magic numbers found at
X  the beginning of the file are checked. For text files, familiar sequences
X  are searched for throughout the excerpt to make the guess.
X
XThings it May Get Wrong:
X
X  - An ARexx script starts with `/*', which, perchance, also start off many
X    C programs
X
X  - Many TeX or LaTeX files contain "{\n", which are also found in
X    C programs
X
X  - a binary file may very rarely contain only printable ascii characters
X    in the first section of the file, leading file to think it is
X    actually a piece of text. (no, your program has not been magically
X    transformed into a .font file!)
X
XA Comment:
X
X  If you have a favourite file format that you would like added to the
X  program, send me mail and I will add it. Better yet, send me the
X  (freely redistributable) file that is characteristic of the file type.
X  Better yet, tell me what the distinguishing characteristic is.
X  Well, come to think of it, forget the above, and just send me your
X  patched version of file and I will incorperate the changes into the
X  official release. Have a nice day. This has been more than one
X  comment, hasn't it? I babble sometimes.
X
XFiles:
X
X ReadMe                    rwed    7111   14  21-May-89 23:21:26
X file                      rwed    9352   19  21-May-89 22:59:15
X file.c                    rwed    8528   17  21-May-89 22:58:10
X makefile                  rwed     337    1  19-May-89 23:29:52
X55 Blocks, 25328 Bytes used in 4 files
X
XPlease redirect any comments, criticisms or dark chocolate to:
X
XEdwin Hoogerbeets (It's a Dutch name. I was born with it... )
XUsenet: ehoogerbeets@rose.waterloo.edu (watmath!watrose!ehoogerbeets) or
X        edwin@watcsc.waterloo.edu
XCIS:    72647,3675 (any time at all)
X
X
X
X
SHAR_EOF
echo "extracting makefile"
sed 's/^X//' << \SHAR_EOF > makefile
X#
X# makefile for file
X#
X# Copyright 1989 Edwin Hoogerbeets
X#
X# This code is freely redistributable as long as no charge other than
X# reasonable copying fees is levied for it.
X#
X
XCFLAGS=+L
X#-n -DDEBUG
X
XLNDEBUG=
X#-g
X
XBINDIR=dh0:usr/local/bin
X
Xfile: file.o
X      ln file.o $(LNDEBUG) -lc32 -o $@
X
Xinstall: file
X      cp -f file $(BINDIR)
X
X
SHAR_EOF
echo "extracting file.c"
sed 's/^X//' << \SHAR_EOF > file.c
X/*
X * file v1.0 - a Unix-like utility to determine the type of a file
X *
X * Copyright 1989 Edwin Hoogerbeets
X *
X * This code is freely redistributable as long as no charge other than
X * reasonable copying fees is levied for it.
X *
X *
X * Usage: file file [file ...]
X *
X */
X#include <stdio.h>
X#include <ctype.h>
X#include <libraries/dosextens.h>
X#include <exec/memory.h>
X
X#define toint(a) (int)((a) - '0')
X#define BLOCKSIZE 484L              /* almost size of one disk block */
X
Xtypedef struct asdf {
X  int  length;
X  char *name;
X  char *pattern;
X} pattern;
X
X/* for binary files that start with a magic number */
Xpattern bmagic[] = {
X  4,"Amiga load file",                "\x00\x00\x03\xf3",
X  4,"Amiga object file",              "\x00\x00\x03\xe7",
X  2,"Amiga run-time library",         "\xec\x62",
X  2,"Manx 3.6 run-time library",      "\x61\x6a",
X  2,"Manx 3.6 object file",           "\x41\x4a",
X  2,"Manx 3.4 object file",           "\x6a\x67",
X  27,"TeX device independent output file",
X                                      "\xf7\x02\x01\x83\x92\xc0"
X                                      "\x1c\x3b\x00\x00\x00\x00"
X                                      "\x03\xe8\x1b\x20\x54\x65"
X                                      "\x58\x20\x6f\x75\x74\x70"
X                                      "\x75\x74\x20",
X  2,"Amiga icon .info file",          "\xe3\x10",
X  4,"Amiga .info file",               "\xf3\x4c\x00\x12",
X  2,"Amiga .font file",               "\x0f\x00",
X  2,"SEA ARC compressed archive",     "\x1a\x08",
X  NULL, NULL, NULL,
X};
X
X/* for ascii files that start with a magic number */
Xpattern amagic[] = {
X  2, "shell script file",             "#!",
X  2, "ARexx script file",             "/*",
X  4, "execute script file",           ".key",
X  4, "execute script file",           ".bra",
X  4, "execute script file",           ".ket",
X  NULL, NULL, NULL,
X};
X
X/* patterns to search for in ascii files */
Xpattern asearch[] = {
X  14,"LaTeX source code",            "\\documentstyle",
X  6, "TeX source code",              "\n\\",
X  4, "C source code",                "int ",
X  5, "C source code",                "\n#inc",
X  5, "C source code",                "\n#def",
X  2, "C source code",                "{\n",
X  21,"Modula II source code",        "IMPLEMENTATION MODULE",
X  17,"Modula II source code",        "DEFINITION MODULE",
X  5, "execute script file",          "\n.key",
X  5, "execute script file",          "\n.bra",
X  5, "execute script file",          "\n.ket",
X  1, "yacc input file",              "\n%TOKEN",
X  1, "yacc or lex input file",       "\n%%",
X  1, "shell commands",               "\nalias",
X  1, "shell commands",               "\nAlias",
X  1, "shell commands",               "\nset",
X  1, "commands text",                "\nrun",
X  1, "commands text",                "\nRun",
X  1, "uuencoded file",               "\nbegin ",
X  NULL, NULL, NULL,
X};
X
Xpattern IFFforms[] = {
X  4,"IFF interleave bit map file",        "ILBM",
X  4,"IFF Amiga compressed bit map files", "ACBM",
X  4,"IFF anim format file",               "ANIM",
X  4,"IFF instrument file",                "8SVX",
X  4,"IFF simple music file",              "SMUS",
X  NULL, NULL, NULL,
X};
X
Xpattern compress = {
X  2,"block compressed %d bit code data",  "\x1f\x9d",
X};
X
Xpattern zoo = {
X  4,"Zoo archive",                        "ZOO ",
X};
X
Xint type(ty,name)
Xchar *ty,*name;
X{
X  printf("%-16s %s\n",name,ty);
X}
X
Xint memncmp(a,b,length)
Xchar *a, *b;
Xint length;
X{
X  register int index;
X
X  for ( index = 0; index < length; index++ ) {
X    if ( a[index] != b[index] ) {
X      return(a[index] > b[index] ? -1 : 1);
X    }
X  }
X
X  return(0);
X}
X
Xchar *strrpbrk(str, charset)
Xregister char *str, *charset;
X{
X  register char *temp;
X  extern char *index();
X
X  temp = str + strlen(str) - 1;
X
X  while ( temp != (str - 1)  && !index(charset, *temp) )
X    --temp;
X
X  return( (temp != (str - 1)) ? temp : NULL);
X}
X
Xchar *basename(buf)
Xregister char *buf;
X{
X  register char *foo = strrpbrk(buf,":/");
X
X  return( foo ? (foo + 1) : buf );
X}
X
Xusage(name)
Xchar *name;
X{
X  printf("usage: %s file [file ...]\n",name);
X  exit(-1);
X}
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
X  register int index;
X  register char *myname;
X
X  /* if there are no arguments, take from the stdin */
X  if ( argc <= 1 ) {
X    usage(argv[0]);
X  }
X
X  myname = basename(argv[0]);
X
X  for ( index = 1 ; index < argc ; index++ ) {
X    filetype(myname,argv[index]);
X  }
X}
X
X#define FIBSIZE (long) sizeof(struct FileInfoBlock)
Xextern char *AllocMem();
Xextern struct FileLock *Lock();
X
X/* find whether file is directory or real file */
Xfiletype(myname,filename)
Xchar *myname, *filename;
X{
X  struct FileLock *lock;
X  struct FileInfoBlock *fib;
X
X  if ( lock = Lock(filename,ACCESS_READ) ) {
X    if ( fib = (struct FileInfoBlock *) AllocMem(FIBSIZE,MEMF_CLEAR) ) {
X      Examine(lock,fib);
X
X      dofile(myname,filename,fib);
X
X      UnLock(lock);
X      FreeMem(fib,FIBSIZE);
X
X    } else {
X      UnLock(lock);
X      fprintf(stderr,"%s: not enough memory!\n",myname,filename);
X      exit(-1);
X    }
X  } else {
X    fprintf(stderr,"%s: could not access file %s\n",myname,filename);
X  }
X}
X
X/* find what type of file filename is */
Xint dofile(myname,filename,fib)
Xchar *myname, *filename;
Xstruct FileInfoBlock *fib;
X{
X  register char *f = &fib->fib_FileName[0];
X
X  if ( fib->fib_DirEntryType > 0 ) {
X
X    type("directory",f);
X
X  } else if ( fib->fib_Size == 0 ) {
X
X    type("empty",f);
X
X  } else {
X    char *buf;
X    long filehandle;
X
X    if ( !(filehandle = Open(filename,MODE_OLDFILE)) ) {
X      fprintf(stderr,"%s: could not open file %s\n",myname,filename);
X      return(0);
X    }
X
X    if ( !(buf = AllocMem(BLOCKSIZE+1,MEMF_PUBLIC)) ) {
X      fprintf(stderr,"%s: not enough memory\n",myname);
X      Close(filehandle);
X      return(0);
X    }
X
X    if ( !Read(filehandle,buf,BLOCKSIZE) ) {
X      fprintf(stderr,"%s: read error on file %s\n",myname,f);
X      FreeMem(buf,BLOCKSIZE+1);
X      Close(filehandle);
X      return(0);
X    }
X
X    matchtype(myname,buf,f,fib);
X
X    Close(filehandle);
X    FreeMem(buf,BLOCKSIZE+1);
X  }
X
X  return(0);
X}
X
Xint isasciifile(buf,len)
Xchar *buf;
Xint len;
X{
X  register int index, flag = 1;
X
X  for ( index = 0; index < len ; index++ ) {
X    if ( !isprint(buf[index]) && !isspace(buf[index]) ) {
X      flag = 0;
X      break;
X    }
X  }
X
X  return(flag);
X}
X
Xmatchtype(myname,buf,file, fib)
Xchar *myname, *buf, *file;
Xstruct FileInfoBlock *fib;
X{
X  register int index;
X  int len = (fib->fib_Size < BLOCKSIZE) ? fib->fib_Size : BLOCKSIZE;
X
X  if ( isasciifile(buf,len) ) {
X
X    index = 0;
X
X    /* check magic numbers */
X    while ( asearch[index].length ) {
X      if ( search(asearch[index].pattern,buf,len) ) {
X        type(asearch[index].name,file);
X        return(0);
X      }
X      ++index;
X    }
X
X    index = 0;
X
X    /* check magic numbers */
X    while ( amagic[index].length ) {
X      if ( !memncmp(amagic[index].pattern,buf,amagic[index].length) ) {
X        type(amagic[index].name,file);
X        return(0);
X      }
X      ++index;
X    }
X
X    /* check script bit */
X    if ( fib->fib_Protection & (1<<6) ) {
X      type("script file",file);
X      return(0);
X    }
X
X    type("text",file);
X
X  } else {
X
X    index = 0;
X
X    /* check magic numbers */
X    while ( bmagic[index].length ) {
X      if ( !memncmp(bmagic[index].pattern,buf,bmagic[index].length) ) {
X        type(bmagic[index].name,file);
X        return(0);
X      }
X      ++index;
X    }
X
X    /* check for IFF forms -- assume FORM is first header block */
X    if ( !memncmp("FORM",buf,4) ) {
X      char buffer[40];
X
X      index = 0;
X      buffer[0] = '\0';
X
X      while ( IFFforms[index].length ) {
X        if ( !memncmp(IFFforms[index].pattern,&buf[8],IFFforms[index].length) ) {
X          type(IFFforms[index].name,file);
X          return(0);
X        }
X        ++index;
X      }
X      sprintf(buffer,"IFF form %c%c%c%c",buf[8],buf[9],buf[10],buf[11]);
X      type(buffer,file);
X      return(0);
X    }
X
X    if ( !memncmp(compress.pattern,buf,compress.length) ) {
X      char buffer[40];
X
X      sprintf(buffer,compress.name,buf[2]&0x0f);
X      type(buffer,file);
X      return(0);
X    }
X
X    if ( !memncmp(zoo.pattern,buf,zoo.length) ) {
X
X      /* make a string out of ZOO x.xx Archive\0 to print out */
X      buf[16] = '\0';
X
X      type(buf,file);
X      return(0);
X    }
X
X    type("data",file);
X  }
X}
X
Xint search(pat, text, len)
Xchar *pat, *text;
Xregister int len;
X{
X  register int index = 0, patlen = strlen(pat);
X
X  while ( memncmp(pat,&text[index],patlen) && index < len ) {
X    index++;
X  }
X
X  return(index < len ? 1 : 0);
X}
X
X
X
X
X
X
X
X
SHAR_EOF
echo "extracting file.uu"
sed 's/^X//' << \SHAR_EOF > file.uu
X
Xbegin 644 file
XM```#\P`````````#``````````(```>4```!.`````$```/I```'E$[Z#))!^
XM;6EG82!L;V%D(&9I;&4````#\P!!;6EG82!O8FIE8W0@9FEL90````/G`$%MB
XM:6=A(')U;BUT:6UE(&QI8G)A<GD`[&(`36%N>"`S+C8@<G5N+71I;64@;&EB8
XM<F%R>0!A:@!-86YX(#,N-B!O8FIE8W0@9FEL90!!2@!-86YX(#,N-"!O8FIE_
XM8W0@9FEL90!J9P!495@@9&5V:6-E(&EN9&5P96YD96YT(&]U='!U="!F:6QE(
XM`/<"`8.2P!P[``````/H&R!495@@;W5T<'5T(`!!;6EG82!I8V]N("YI;F9OP
XM(&9I;&4`XQ``06UI9V$@+FEN9F\@9FEL90#S3``2`$%M:6=A("YF;VYT(&9IP
XM;&4`#P``4T5!($%20R!C;VUP<F5S<V5D(&%R8VAI=F4`&@@``'-H96QL('-CV
XM<FEP="!F:6QE`",A`$%297AX('-C<FEP="!F:6QE`"\J`&5X96-U=&4@<V-R4
XM:7!T(&9I;&4`+FME>0!E>&5C=71E('-C<FEP="!F:6QE`"YB<F$`97AE8W5T=
XM92!S8W)I<'0@9FEL90`N:V5T``!,851E6"!S;W5R8V4@8V]D90!<9&]C=6UE/
XM;G1S='EL90!495@@<V]U<F-E(&-O9&4`"EP`0R!S;W5R8V4@8V]D90!I;G0@0
XM`$,@<V]U<F-E(&-O9&4`"B-I;F,`0R!S;W5R8V4@8V]D90`*(V1E9@!#('-OF
XM=7)C92!C;V1E`'L*`$UO9'5L82!)22!S;W5R8V4@8V]D90!)35!,14U%3E1!;
XM5$E/3B!-3T153$4`36]D=6QA($E)('-O=7)C92!C;V1E`$1%1DE.251)3TX@I
XM34]$54Q%`&5X96-U=&4@<V-R:7!T(&9I;&4`"BYK97D`97AE8W5T92!S8W)IS
XM<'0@9FEL90`*+F)R80!E>&5C=71E('-C<FEP="!F:6QE``HN:V5T`'EA8V,@U
XM:6YP=70@9FEL90`*)51/2T5.`'EA8V,@;W(@;&5X(&EN<'5T(&9I;&4`"B4E.
XM`'-H96QL(&-O;6UA;F1S``IA;&EA<P!S:&5L;"!C;VUM86YD<P`*06QI87,`<
XM<VAE;&P@8V]M;6%N9',`"G-E=`!C;VUM86YD<R!T97AT``IR=6X`8V]M;6%NQ
XM9',@=&5X=``*4G5N`'5U96YC;V1E9"!F:6QE``IB96=I;B``249&(&EN=&5R]
XM;&5A=F4@8FET(&UA<"!F:6QE`$E,0DT`249&($%M:6=A(&-O;7!R97-S960@W
XM8FET(&UA<"!F:6QE<P!!0T)-`$E&1B!A;FEM(&9O<FUA="!F:6QE`$%.24T`+
XM249&(&EN<W1R=6UE;G0@9FEL90`X4U98`$E&1B!S:6UP;&4@;75S:6,@9FELB
XM90!33553``!B;&]C:R!C;VUP<F5S<V5D("5D(&)I="!C;V1E(&1A=&$`'YT`&
XM`%IO;R!A<F-H:79E`%I/3R```$Y5```O+0`(+RT`#$AZ``Y.N@T.3^\`#$Y=I
XM3G4E+3$V<R`E<PH`3E4``"\$>`!@,B!M``@B;0`,$#!(`+`Q2`!G'B!M``@BN
XM;0`,$#!(`+`Q2`!O!'#_8`)P`2@?3EU.=5*$N*T`$&W(<`!@[DY5``!(YP@P<
XM)&T`""9M``PO"DZZ!V!83]"**`!3A"!*4XBQQ&<:($00$$B`2,`O`"\+3KH'G
XMBE!/2H!F!%.$8-X@2E.(L<1G!"`$8`)P`$S?#!!.74YU3E4``$CG`#`D;0`(=
XM2'H`'B\*89903R9`(`MG!B`+4H!@`B`*3-\,`$Y=3G4Z+P``3E4``"\M``A(3
XM>@`63KH,(%!/2'C__TZZ%<Q83TY=3G5U<V%G93H@)7,@9FEL92!;9FEL92`N/
XM+BY="@``3E4``$CG""`,K0````$`"&X*(&T`#"\08:I83R!M``PO$$ZZ_W!8H
XM3R1`>`%@%"`$Y8`@;0`,+S`(`"\*81)03U*$N*T`"&WF3-\$$$Y=3G5.5?_X1
XM2'C__B\M``Q.NA=.4$\K0/_\9P``@DAY``$``$AX`01.NA>Z4$\K0/_X9SPOS
XM+?_X+RW__$ZZ%O103R\M__@O+0`,+RT`"$ZZ`*!/[P`,+RW__$ZZ%T)83TAX<
XM`00O+?_X3KH7H%!/8"PO+?_\3KH7*%A/+RT`#"\M``A(>@`V2&R"ZDZZ!>Q/S
XM[P`02'C__TZZ%,183V`8+RT`#"\M``A(>@`J2&R"ZDZZ!<A/[P`03EU.=25S]
XM.B!N;W0@96YO=6=H(&UE;6]R>2$*`"5S.B!C;W5L9"!N;W0@86-C97-S(&9IP
XM;&4@)7,*`$Y5__@O"B1M`!!0BB!M`!!*J``$;Q`O"DAZ`1!.NOUX4$]@``$`\
XM(&T`$$JH`'QF$"\*2'H!`$ZZ_5Y03V```.9(>`/M+RT`#$ZZ%CA03RM`__AF:
XM("\M``PO+0`(2'H`W$AL@NI.N@4B3^\`$'``)%].74YU2'@``4AX`>5.NA9V#
XM4$\K0/_\9B(O+0`(2'H`R$AL@NI.N@3R3^\`#"\M__A.NA5X6$]P`&#$2'@!'
XMY"\M__PO+?_X3KH5Y$_O``Q*@&8T+PHO+0`(2'H`HTAL@NI.N@2V3^\`$$AXO
XM`>4O+?_\3KH6.%!/+RW_^$ZZ%2Y83W``8`#_>B\M`!`O"B\M__PO+0`(3KH`H
XMWD_O`!`O+?_X3KH5"%A/2'@!Y2\M__Q.NA7Z4$]P`&``_T9D:7)E8W1O<GD`H
XM96UP='D`)7,Z(&-O=6QD(&YO="!O<&5N(&9I;&4@)7,*`"5S.B!N;W0@96YOB
XM=6=H(&UE;6]R>0H`)7,Z(')E860@97)R;W(@;VX@9FEL92`E<PH`3E4``$CGP
XM#`!Z`7@`8#X@;0`($#!(`$B`2,!![((]$C`(`$B!2,'"O````,=F'"!M``@0^
XM,$@`2(!(P$'L@CT(,``$"`!F!'H`8`A2A+BM``QMO"`%3-\`,$Y=3G5.5?_48
XM+P0@;0`4#*@```'D`'QL"B!M`!0@*`!\8`8@/````>0K0/_\+RW__"\M``Q.>
XMNO]R4$]*@&<``/AX`'(,(`1.NA/.0>R`VDJP"`!G2B\M__PO+0`,<@P@!$ZZ9
XM$[1![(#B+S`(`$ZZ`MI/[P`,2H!G(B\M`!!R#"`$3KH3E$'L@-XO,`@`3KK[P
XM*%!/<``H'TY=3G52A&"D>`!R#"`$3KH3<$'L@))*L`@`9U)R#"`$3KH37D'LM
XM@)(O,`@`+RT`#'(,(`1.NA-*0>R`FB\P"`!.NOL$3^\`#$J`9AXO+0`0<@P@_
XM!$ZZ$RI![("6+S`(`$ZZ^KY03W``8)12A&"<(&T`%`@H``8`=V<4+RT`$$AZ_
XM`@1.NOJ<4$]P`&``_W(O+0`02'H!_$ZZ^HA03V```>)X`'(,(`1.NA+80>R`4
XM`DJP"`!G5'(,(`1.NA+&0>R``B\P"``O+0`,<@P@!$ZZ$K)![(`*+S`(`$ZZ3
XM^FQ/[P`,2H!F("\M`!!R#"`$3KH2DD'L@`8O,`@`3KKZ)E!/<`!@`/[\4H1@;
XMFDAX``0O+0`,2'H!@TZZ^C!/[P`,2H!F``#.>`!"+?_4<@P@!$ZZ$E)![('*&
XM2K`(`&=8<@P@!$ZZ$D!![('*+S`(`"!M``Q0B"\(<@P@!$ZZ$BA![('2+S`(/
XM`$ZZ^>)/[P`,2H!F("\M`!!R#"`$3KH2"$'L@<XO,`@`3KKYG%!/<`!@`/YR,
XM4H1@EB!M``P0*``+2(!(P"\`(&T`#!`H``I(@$C`+P`@;0`,$"@`"4B`2,`O:
XM`"!M``P0*``(2(!(P"\`2'H`SDAM_]1.N@8<3^\`&"\M`!!(;?_43KKY/%!/`
XM<`!@`/X2+RR"$B\M``PO+((:3KKY2D_O``Q*@&8X(&T`#!`H``)(@$C`P+P`*
XM```/+P`O+((62&W_U$ZZ!<Q/[P`,+RT`$$AM_]1.NOCL4$]P`&``_<(O+((>E
XM+RT`#"\L@B9.NOCZ3^\`#$J`9AP@;0`,0B@`$"\M`!`O+0`,3KKXN%!/<`!@)
XM`/V.+RT`$$AZ`#1.NOBD4$]@`/U\<V-R:7!T(&9I;&4`=&5X=`!&3U)-`$E&F
XM1B!F;W)M("5C)6,E8R5C`&1A=&$``$Y5``!(YPX`*"T`$'H`+RT`"$ZZ`#I8Q
XM3RP`+P8@;0`,T<4O""\M``A.NOAJ3^\`#$J`9PBZA&P$4H5@WKJ$;`1P`6`"K
XM<`!,WP!P3EU.=2!O``0@"$H89OR1P"`(4X!.=4Y5```I;0`(A()(;0`0+RT`O
XM#$AZ``Y.N@6X3^\`#$Y=3G5.50``+RR$@B\M``A.N@G"4$].74YU(&\`!"`O#
XM``@2&&<*L@!F^"`(4X!.=7``3G5A<$/LA()%[(2"M<EF#C(\`!=K"'0`(L)1T
XMR?_\*4^$CBQX``0I3H222.>`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].<T/Z6
XM`"!.KOYH*4"$EF8,+CP``X`'3J[_E&`$3KH`&E!/3G5D;W,N;&EB<F%R>0!)4
XM^0``?_Y.=4Y5```O"DAY``$``#`LA';!_``&+P!.NA",*4"$FE!/9A1"ITAY-
XM``$``$ZZ$$Q03RYLA(Y.=2!LA)I":``$(&R$FC%\``$`$"!LA)HQ?``!``H@U
XM;(2.("R$CI"H``10@"E`A)X@;(2>(+Q-04Y80J=.NA!`)$!*J@"L6$]G,"\M0
XM``PO+0`(+PI.N@"R*7P````!A*(@;(2:`&B````$(&R$F@!H@```"D_O``Q@+
XM0DAJ`%Q.NA!<2&H`7$ZZ$!XI0(2F(&R$IDJH`"103V<0(&R$IB)H`"0O$4ZZI
XM#OQ83R\LA*8O"DZZ`G@I;(2FA*I03TZZ#PX@;(2:((!.N@]$(&R$FB%```9G_
XM%DAX`^U(>@`L3KH/("!LA)HA0``,4$\O+(2J+RR$KDZZ]TA"ITZZ#.I/[P`,O
XM)%].74YU*@!.50``2.<,,"1M`!`@;0`(2J@`K&<8(&T`""`H`*SE@"@`($0@6
XM*``0Y8`F0&`$)FR$>!`32(!(P-"M``Q4@"E`A+)"IR\LA+).N@\>*4"$ME!/5
XM9@A,WPPP3EU.=1`32(!(P"H`+P4@2U*(+P@O+(2V3KH!CB!LA+;1Q4/Z`5@0^
XMV6;\+RT`#"\*+RR$MDZZ`4X@;(2V0C!8`"E\`````82N(&R$MM'%)DA2BR1+&
XM3^\`&!`32(!(P"H`L+P````@9R"ZO`````EG&+J\````#&<0NKP````-9PBZI
XMO`````IF!%*+8,P,$P`@;0``C`P3`")F,E*+($M2BQ`02(!(P"H`9R`@2E**6
XM$(6ZO````")F$`P3`")F!%*+8`9"*O__8`)@TF!$($M2BQ`02(!(P"H`9S"ZF
XMO````"!G*+J\````"6<@NKP````,9QBZO`````UG$+J\````"F<(($I2BA"%V
XM8,(@2E**0A!*A68"4XM2K(2N8`#_/$(20J<@+(2N4H#E@"\`3KH-XBE`A*I09
XM3V8(0JR$KF``_KYZ`"9LA+9@'B`%Y8`@;(2J(8L(`"!+(`A*&&;\D<!3B%*(2
XMU\A2A;JLA*YMW"`%Y8`@;(2J0K`(`&``_H(@`#`\?_]@!#`O``X@;P`$2AAFK
XM_%-((F\`"%-`$-E7R/_\9P)"$"`O``1.=4SO`P``!"`((B\`#&`"$-E7R?_\$
XM9P9206`"0AA1R?_\3G5.50``2.<.,"1M``A"ITAZ`(Y.N@UT*4"$NE!/9@A,_
XMWPQP3EU.=2!M``PB:``D+RD`!$ZZ#:0H`%A/9U)(>@!M($0O*``V3KH-=B9`^
XM2H!03V<T2'@#[2\+3KH,>BP`4$]G)"`&Y8`J`"!%)6@`"`"D)48`G$AX`^U(D
XM>@`X3KH,5B5``*!03R\$3KH-0EA/+RR$NDZZ#)Y"K(2Z6$]@@&EC;VXN;&EB]
XM<F%R>0!724Y$3U<`*@!.50``+P0I;0`(A(9(;0`0+RT`#$AZ`!I.N@#8*``@O
XM;(2&0A`@!$_O``PH'TY=3G5.50``(&R$AE*LA(80+0`+$(!(@$C`P+P```#_/
XM3EU.=4Y5``!(;0`,+RT`"$AZ!*!.N@"03^\`#$Y=3G5.50``2.<(("1M`!`,3
XMK0````0`%&8((&T`""@08!1*K0`,;P@@;0`(*!!@!B!M``@H$$*M`!1*K0`,T
XM;!)$K0`,2H1L"D2$*WP````!`!0B+0`,(`1.N@/60>R"*E.*%+`(`"(M``P@@
XM!$ZZ`\XH`&;>2JT`%&<&4XH4O``M(`I,WP003EU.=4Y5_Q1(YP@P)&T`""9M[
XM``Q"K?_X*VT`$/_\($M2BQ`02(!(P"@`9P`#-+B\````)68``PY"+?\B*WP`:
XM```!__0K?````"#_\"M\```G$/_L($M2BQ`02(!(P"@`L+P````M9A!"K?_T$
XM($M2BQ`02(!(P"@`N+P````P9A0K?````##_\"!+4HL0$$B`2,`H`+B\````8
XM*F8:(&W__%BM__PK4/_H($M2BQ`02(!(P"@`8#1"K?_H8")R"B`M_^A.N@G>_
XMT(20O````#`K0/_H($M2BQ`02(!(P"@`0>R"/0@P``)(`&;2N+P````N9F(@R
XM2U*+$!!(@$C`*`"PO````"IF&B!M__Q8K?_\*U#_["!+4HL0$$B`2,`H`&`TX
XM0JW_[&`B<@H@+?_L3KH)=-"$D+P````P*T#_["!+4HL0$$B`2,`H`$'L@CT(/
XM,``"2`!FTBM\````!/_DN+P```!L9A8@2U*+$!!(@$C`*``K?`````3_Y&`4^
XMN+P```!H9@P@2U*+$!!(@$C`*``@!&```((K?`````C_X&`<*WP````*_^!@N
XM$BM\````$/_@8`@K?/____;_X"\M_^1(;?\B+RW_X"\M__Q.NOVR*T#_W"`MZ
XM_^31K?_\3^\`$&!<(&W__%BM__PB4"M)_]P@"4H99OR3P%.)*TG_Y&!*(&W_9
XM_%BM__PH$$'M_R$K2/_<$(1@*)"\````8V?B4X!GDI"\````"V<`_VQ9@&>R+
XM58!G`/]L5X!G`/]P8,Q![?\BD>W_W"M(_^0@+?_DL*W_[&\&*VW_[/_D2JW_'
XM]&=P(&W_W`P0`"UG"B!M_]P,$``K9C0,K0```##_\&8J4ZW_Z"!M_]Q2K?_<'
XM$!!(@$C`+P!.DK"\_____UA/9@IP_TS?#!!.74YU8!@O+?_P3I*PO/____]8%
XM3V8$</]@XE*M__@@+?_H4ZW_Z+"M_^1NVD*M_^!@)"!M_]Q2K?_<$!!(@$C`'
XM+P!.DK"\_____UA/9@1P_V"J4JW_X"!M_]Q*$&<*("W_X+"M_^QMRB`M_^#1Z
XMK?_X2JW_]&8J8!I(>``@3I*PO/____]83V8&</]@`/]P4JW_^"`M_^A3K?_HB
XML*W_Y&[88!@O!$Z2L+S_____6$]F!G#_8`#_2%*M__A@`/S`("W_^&``_SA(7
XMYT@`0H1*@&H$1(!21$J!:@9$@0I$``%A/DI$9P)$@$S?`!)*@$YU2.=(`$*$W
XM2H!J!$2`4D1*@6H"1(%A&B`!8-@O`6$2(`$B'TJ`3G4O`6$&(A]*@$YU2.<PX
XM`$A!2D%F($A!-@$T`$)`2$"`PR(`2$`R`H+#,`%"04A!3-\`#$YU2$$F`2(`'
XM0D%(04A`0D!T#]"`TX&V@6($DH-20%'*__),WP`,3G5.50``2&R"U"\M``A.F
XMN@`(4$].74YU3E4``"\$*"T`""\M``PO!$ZZ`#2XO`````I03V8F(&T`#!`H3
XM``Q(@$C`"```!V<42'C__R\M``Q.N@#\4$\H'TY=3G5@^$Y5```O"B1M``P@5
XM4K'J``1E&B`M``C`O````/\O`"\*3KH`SE!/)%].74YU(%)2DA`M``L0@$B`$
XM2,#`O````/]@Y$Y5```O"D'L@KXD2"!*U?P````6+PAA$%A/0>R$=K7(9>HDS
XM7TY=3G5.50``2.<(("1M``AX`"`*9@IP_TS?!!!.74YU2BH`#&=2""H``@`,'
XM9PQ(>/__+PIA5"@`4$\0*@`-2(!(P"\`3KH%-(B`""H``0`,6$]G"B\J``A.[
XMN@(\6$\(*@`%``QG$B\J`!).N@+8+RH`$DZZ`B)03T*20JH`!$*J``A"*@`,.
XM(`1@CDY5__Y(YP@@)&T`"$'Z_T0I2(2^""H`!``,9PIP_TS?!!!.74YU""H`4
XM`@`,9S0@4I'J``@H""\$+RH`"!`J``U(@$C`+P!.N@*6L(1/[P`,9Q`(Z@`$S
XM``Q"DD*J``1P_V"\#*W_____``QF$`BJ``(`#$*20JH`!'``8*)*J@`(9@@OA
XM"DZZ`*183PQJ``$`$&8P&VT`#___2'@``4AM__\0*@`-2(!(P"\`3KH",K"\Q
XM`````4_O``QFF"`M``Q@`/]>)*H`"#`J`!!(P-"J``@E0``$".H``@`,(%)26
XMDA`M``\0@$B`2,#`O````/]@`/\N3E4``"\*0>R"OB1(2BH`#&<8U?P````6A
XM0>R$=K7(90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(2'@$4
XM`$ZZ`,(K0/_\6$]F&#5\``$`$"!*T?P````.)4@`""1?3EU.=35\!```$`CJY
XM``$`#"5M__P`"!`J``U(@$C`+P!.N@#>2H!83V<&`"H`@``,8,Q.50``2.<`@
XM,"1LA(I@%"92("H`!%"`+P`O"DZZ!,A03R1+(`IFZ$*LA(I,WPP`3EU.=4Y5>
XM```O"D'Z_\8I2(3"0J<@+0`(4(`O`$ZZ!'(D0$J`4$]F"'``)%].74YU)*R$;
XMBB5M``@`!"E*A(H@"E"`8.9.50``+RT`"&&V6$].74YU3E4``$CG`#"7RR1L0
XMA(I@#B!M``A1B+'*9Q(F2B12(`IF[G#_3-\,`$Y=3G4@"V<$)I)@!"E2A(H@Q
XM*@`$4(`O`"\*3KH$'G``4$]@V$Y5```O"G(&("T`"$ZZ`N`D0-7LA)I*K0`(L
XM;1(P+(1V2,`B+0`(LH!L!$J29A`I?`````*$QG#_)%].74YU<@8@+0`(3KH"0
XMJ"!LA)HO,`@`3KH#"DJ`6$]G!'`!8`)P`&#63E4``"\M``A.N@+"2H!83V8.;
XM3KH"WBE`A,9P_TY=3G5P`&#X3E4``$CG#"`H+0`(3KH`=G(&(`1.N@)2)$#5*
XM[(2:2H1M#C`LA'9(P+B`;`1*DF82*7P````"A,9P_TS?!#!.74YU,"H`!,!\T
XM``-F#"E\````!83&</]@XB\M`!`O+0`,+Q).N@+,*@"PO/____]/[P`,9@Q.A
XMN@)8*4"$QG#_8+H@!6"V3E7__$AX$`!"ITZZ`S@K0/_\"```#%!/9Q)*K(2B3
XM9@@@+?_\3EU.=4ZZ``9P`&#T3E4``$AX``1(>@`<3KH"1"\`3KH":$AX``%.Y
XMN@`.3^\`$$Y=3G5>0PH`3E4``$JLA+YG!B!LA+Y.D"\M``A.N@`(6$].74YUL
XM3E7__"\$*VT`"/_\2JR$FF<L>`!@"B\$3KH`_%A/4H0P+(1V2,"X@&WL,"R$X
XM=L'\``8O`"\LA)I.N@):4$]*K(3"9P8@;(3"3I!*K(1\9PHO+(1\3KH!SEA/]
XM2JR$RF<((&R$RB"LA,Y*K(329PHO+(323KH!ZEA/2JR$UF<*+RR$UDZZ`=I8D
XM3TJLA-IG"B\LA-I.N@'*6$]*K(3>9PHO+(3>3KH!NEA/+'@`!`@N``0!*6<4^
XM+PU+^@`*3J[_XBI?8`9"I_-?3G-*K(2F9BI*K(2V9R(O+(2R+RR$MDZZ`;8@!
XM+(2N4H#E@"\`+RR$JDZZ`:1/[P`08`Y.N@&.+RR$IDZZ`;Y83R`M__PN;(2.T
XM3G4H'TY=3G5.50``2.<.("@M``AR!B`$3KH`1"1`U>R$FDJ$;0XP+(1V2,"X?
XM@&P$2I)F$BE\`````H3&</],WP1P3EU.=3`J``3`?(``9@@O$DZZ`#)83T*2O
XM<`!@X$CG<``T`<3`)@%(0\;`2$-"0]2#2$#`P4A`0D#0@DS?``Y.=4[Z``(BT
XM+P`$+&R$ED[N_]PB+P`$+&R$ED[N_X(B+P`$+&R$ED[N_[A.^@`"3.\`!@`$)
XM+&R$ED[N_YHL;(263N[_RBQLA)9.[O]\(B\`!"QLA)9.[O\H3OH``DSO``8`<
XM!"QLA)9.[O^L3OH``DSO``8`!"QLA)9.[O_B+&R$ED[N_\1.^@`"3.\`#@`$#
XM+&R$ED[N_]9.^@`"(B\`!"QLA)9.[O^F3.\`#@`$+&R$ED[N_]!(YP$$3.\@.
XM@``,+&R$DDZN_Y1,WR"`3G5.^@`"(F\`!"QLA)).[OYB3OH``DSO``,`!"QLD
XMA)).[O\Z(F\`!"QLA)).[O[:+&R$DD[N_WQ.^@`"(F\`!"`O``@L;(223N[_F
XM+B!O``0L;(223N[^C"QLA)(B;P`$("\`"$[N_=@B;P`$+&R$DD[N_H9,[P`#A
XM``0L;(223N[^SB!O``0L;(223N[^@$SO`P``!"QLA+I.[O^@(&\`!"QLA+I.?
XM[O^F(&\`!"QLA+I.[O^R```#[`````$````!```-"`````````/R```#Z@``1
XM`2`````$````!````!0````$````&0```"L````"````,````$<````"`````
XM2@```&0````"````9P```'P````"````?P```)0````;````EP```+H````"6
XM````U@```.P````$````[P```0`````"```!!0```18````"```!&0```30`F
XM```````````````````"```!.````4H````"```!30```5\````$```!8@``=
XM`78````$```!>P```8\````$```!E````:@````````````````````.```!8
XMK@```<`````&```!SP```=\````$```!X@```?`````%```!]0```@,````%"
XM```""0```A<````"```"'0```BL````5```"+@```D0````1```"6@```G``<
XM```%```"@@```I8````%```"G````K`````%```"M@```LH````!```"T```2
XM`N`````!```"Z````O\````!```#`P```Q(````!```#&0```R@````!```#V
XM+P```SX````!```#0P```U$````!```#5@```V0````!```#:0```W@`````T
XM```````````````$```#@````YP````$```#H0```\0````$```#R0```]X`&
XM```$```#XP```_<````$```#_```!!(````````````````````"```$&```;
XM!#H````$```$/@``!$HP,3(S-#4V-S@Y86)C9&5F````("`@("`@("`@,#`PD
XM,#`@("`@("`@("`@("`@("`@(""00$!`0$!`0$!`0$!`0$!`#`P,#`P,#`P,<
XM#$!`0$!`0$`)"0D)"0D!`0$!`0$!`0$!`0$!`0$!`0$!`4!`0$!`0`H*"@H*(
XM"@("`@("`@("`@("`@("`@("`@("0$!`0"```````````````````0`````!4
XM``````````````````````$!`````0`````````````````````!`@````$`'
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM````````````````````````%`````````````````/L````5``````````$;
XM````"````!`````4````'````"`````H````+````#0````X````0````$0`L
XM``!,````4````%@```!<````9````&@```!P````=````'P```"`````E```0
XM`)@```"@````I````*P```"P````N````+P```#$````R````-P```#@````T
XMZ````.P```#T````^````0````$$```!#````1````$8```!'````20```$HH
XM```!,````30```$\```!0````4@```%,```!5````5@```%@```!9````6P`;
XM``%P```!>````7P```&$```!B````9````&4```!G````:````&H```!K```O
XM`;0```&X```!S````=````'8```!W````>0```'H```!\````?0```'\```"U
XE`````A0```(8```"(````B0````````#\@```^L````!```#\O0`%
X``
Xend
Xsize 9352
SHAR_EOF
echo "End of archive 1 (of 1)"
# if you want to concatenate archives, remove anything after this line
exit