[comp.sources.amiga] v02i100: qcat - quick disk catalog

page@swan.ulowell.edu (Bob Page) (12/29/88)

Submitted-by: elbaum%REED.BITNET@CUNYVM.CUNY.EDU (Daniel Elbaum)
Posting-number: Volume 2, Issue 100
Archive-name: dos/qcat.1

Qcat prints out the full pathname of each file in a series of disks or
a list of directories.  It's small and speedy, just perfect for 90% of
what one wants from a disk catalogger, but with none of the bells and
whistles which, I find, sometimes get in the way.

[uuencoded executable included.  ..Bob]

#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:    Shell Archiver
#	Run the following text with /bin/sh to create:
#	qcat.c
#	qcat.doc
#	qcat.uu
# This archive created: Wed Dec 28 12:15:22 1988
cat << \SHAR_EOF > qcat.c

/***********************************************************************

    11/88

    QCAT v0.01 -- List files on disks or in directories

                         -----------------

                   Copyright (C) 1988 by Daniel Elbaum

         This software is freely redistributable provided that:
         the three files which comprise it (qcat, qcat.c, qcat.doc)
         remain intact; all copyright notices contained in any of
         the aforementioned files remain intact; and no fee beyond
         reasonable remuneration for collation and distribution be
         charged for use and/or purveyance.

***********************************************************************/

#include <stdio.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <intuition/intuition.h>

/* Error descriptor codes */

#define E_NOLOCK    (-1)
#define E_NOMEM     (-2)
#define E_NOEXAM    (-3)
#define E_USAGE     (-4)
#define E_OUTPUT    (-5)
#define E_LIBRARY   (-6)
#define E_NONODE    (-100)
#define E_NOSTRING  (-101)

/* Manifest constants */

#define NAMSIZ      (108)
#define MEMFLOOR    (64000L)    /* least amt of mem to leave    */

#define IREV    (1)
#define INAM    ("intuition.library")

/* Global data, type and function declarations */
typedef struct IntuitionBase* ib_t;

ib_t IntuitionBase=NULL;
void *OpenLibrary();

FILE *ofp;

struct {
    char filenam[NAMSIZ*10];
    } fs;

struct namlist {
    char *nam;
    struct namlist *next;
    } nlist;

/*
    Acts like a state machine, the state of which
    is determined by the combination of arguments
    supplied.  The while loop sets the state, while
    the if switches select action taken according
    thereto.
*/

main(c, v)
char **v;
{
    register active;
    register err;
    char *cdrive=NULL;
    char *onam=NULL;
    char bu[NAMSIZ*10];
    char *getcd();
    char *realnam();
    void getrspinit(), freelist();


    ++v;
    while (**v == '-'){
        switch(*++*v){
            case 'o':   /* specify output file  */
                if (!*++v) {prerr(NULL, E_USAGE); exit(10);}
                else {onam=*v; ++v;}
                break;
            case 'c':   /* continuous listing of 1 drive    */
                if (!*++v) {prerr(NULL, E_USAGE); exit(10);}
                else {cdrive=*v; ++v;}
                if (!(IntuitionBase=(ib_t)OpenLibrary(INAM, IREV))){
                    prerr(NULL, E_LIBRARY); exit(10);
                }
                break;
            default:
                prerr(NULL, E_USAGE);
                exit(10);
        }
    }

    if (onam){
        if (!(ofp=fopen(onam, "w"))){
            prerr(onam, E_OUTPUT);
            exit(10);
        }
    }
    else ofp=stdout;

    if (cdrive){
        getrspinit();
        if (getresponse()!=FALSE){
            for (active=1; active; ){
                realnam(cdrive, fs.filenam);    /* seed pathname    */
                if (err=getnams(cdrive)) prerr(cdrive, err);
                if (getresponse()==FALSE) active=0;
            }
        }
    }
    else if (!*v){
        getcd(bu);
        strcpy(fs.filenam, bu);
        if (err=getnams(bu)) prerr(bu, err);
    }
    else{
        for (; *v; ++v){
            realnam(*v, fs.filenam);            /* seed pathname    */
            if (err=getnams(*v)) prerr(*v, err);
        }
    }
    prlist(ofp, &nlist);
    freelist(&nlist);
    if (ofp!=stdout) fclose(ofp);
    if (IntuitionBase) CloseLibrary(IntuitionBase);
    exit(0);
}

/*
    If nam is the name of a file, add its size to the global counter.
    If nam is the name of a directory, saunter down a level and
    grab info for its files.
    Return a coded description of any error which occurs, or zero
    if success was the order of the day.
*/

getnams(nam)
char *nam;
{
    register struct FileLock *l=NULL;
    register struct FileInfoBlock *f=NULL;
    register err=0;
    struct FileLock *Lock();
    void addtonam(), truncnam();

    if (!nam) return(E_NOEXAM);
    if (!(l=Lock(nam, ACCESS_READ))){
        return(E_NOLOCK);
    }
    if (!(f=(struct FileInfoBlock *)AllocMem((ULONG)sizeof(*f), MEMF_PUBLIC))) {
        UnLock(l);
        return(E_NOMEM);
    }
    if (!Examine(l, f)) {
        UnLock(l);
        FreeMem(f, (ULONG)sizeof(*f));
        return(E_NOEXAM);
    }
    if (f->fib_DirEntryType<0){     /* file */
        addnam(nam, &nlist);
    }
    else {
        while (ExNext(l, f)){     /* directory    */
            addtonam(fs.filenam, f->fib_FileName);
            if (err=getnams(fs.filenam)) break;
            truncnam(fs.filenam);        /* delete filename from path    */
        }
    }
    UnLock(l);
    FreeMem(f, (ULONG)sizeof(*f));
    return(err);
}

/*
    Assuming p points to a valid pathname and s to a valid filename,
    append the filename to the pathname.
*/

void
addtonam(p, s)
register char *p, *s;
{
    register char *op=p;

    while (*p)
        p++;
    if (p!=op){
        if (*--p!=':')
            *++p='/';
        p++;
    }
    while (*s)
        *p++=*s++;
    *p='\0';
}

/*
    Assuming p points to a valid pathname, clip the filename from it.
*/

void
truncnam(p)
register char *p;
{
    register char *pp;

    if (!p) return;
    for (pp=p; *pp; pp++)
        ;
    while (*pp!='/'&&*pp!=':'&&pp>p)
        --pp;
    if (*pp==':') ++pp;
    *pp='\0';
}

/*
    Build a real pathname from the filename,
    dirname, or drivename specifiecd in nam
    into bu.  Return a pointer to bu on success,
    or NULL if the chore is beyond doing.
*/

char *
realnam(nam, bu)
char *nam, *bu;
{
    register addcol;
    register struct FileLock *l=NULL;
    struct FileLock *Lock();

    if (!nam||!bu) return(NULL);
    if (nam[strlen(nam)-1]==':') addcol=1;
    else addcol=0;
    if (!(l=Lock(nam, ACCESS_READ))){
        return(NULL);
    }
    fullnam(l, bu);
    UnLock(l);
    return(bu);
}


/*
    Put the full name of the current
    directory into the supplied buffer
    and return a pointer to it.
*/

char *
getcd(bu)
char *bu;
{
    struct FileLock *ol;

    if (!bu) return(NULL);
    fullnam(ol=CurrentDir(0L), bu);
    CurrentDir(ol);
    return(bu);
}

/*
    Put the full pathname of a
    locked file in the given buffer
    and return a pointer to it.
*/

char *
fullnam(l, bu)
register struct FileLock *l;
char *bu;
{
    register len;
    struct FileLock *nl, *ParentDir();
    char bu2[NAMSIZ];
    char ebu[NAMSIZ*10];

    if (!l||!bu) return(NULL);
    bu2[0]=0;
    locknam(l, bu);
    while (l=ParentDir(l)){
        if (locknam(l, bu2)){
            sprintf(ebu, "%s/%s", bu2, bu);
            strcpy(bu, ebu);
        }
        else break;
    }
    if (bu2[0]) bu[strlen(bu2)]=':';
    else {bu[len=strlen(bu)]=':'; bu[len+1]='\0';}
    return(bu);
}

/*
    Put the name of the file or directory
    associated with the given lock into
    the given buffer and return a pointer
    to it or NULL if it couldn't be done.
*/

char *
locknam(l, bu)
register struct FileLock *l;
char *bu;
{
    register struct FileInfoBlock *f=NULL;

    if (!l||!bu) return(NULL);
    if (!(f=(struct FileInfoBlock *)AllocMem((ULONG)sizeof(*f), MEMF_PUBLIC))) {
        return(NULL);
    }
    if (!Examine(l, f)) {
        FreeMem(f, (ULONG)sizeof(*f));
        return(NULL);
    }
    strcpy(bu, f->fib_FileName);
    FreeMem(f, (ULONG)sizeof(*f));
    return(bu);
}

/*
    Add a name to the end of the filename list.
    Could be more efficient, but the bottleneck
    is disk speed.  Return a descriptive error
    value on failure.
*/

addnam(s, lp)
char *s;
struct namlist *lp;
{
    struct namlist *newnode();
    char *strsave();
    void freelist(), prlist();

    if (!s||!lp) return(-1);
    if (amtfree()<MEMFLOOR){        /* dump if mem full */
        prlist(ofp, lp);
        freelist(lp);
    }
    while (lp->next)
        lp=lp->next;
    if (!(lp->next=newnode()))
        return(E_NONODE);    /* won't happen.  Better not.   */
    if (!(lp->next->nam=strsave(s)))
        return(E_NOSTRING);
    return(0);
}

/*
    Allocate a new node for the filename list.
    Return a pointer to it or NULL if there's
    not enough memory.
*/

struct namlist *
newnode()
{
    register struct namlist *mp;

    if (mp=(struct namlist *)malloc(sizeof(struct namlist))){
        mp->nam=NULL;
        mp->next=NULL;
    }
    return(mp);
}

/*
    Free the filename list.
*/

void
freelist(lp)
struct namlist *lp;
{
    struct namlist *p;

    if (!lp) return;
    lp=lp->next;    /*  don't free 1st item */
    while (lp){
        p=lp->next;
        free(lp->nam);
        free(lp);
        lp=p;
    }
}

/*
    Print out the filename list.
*/

void
prlist(fp, lp)
FILE *fp;
struct namlist *lp;
{
    if (!lp||!fp) return;
    lp=lp->next;    /* don't print 1st item */
    while (lp){
        fprintf(fp, "%s\n", lp->nam);
        lp=lp->next;
    }
}

/*
    An old favorite.
*/

char *
strsave(s)
char *s;
{
    register len;
    register char *mp;

    if (!s) return(NULL);
    if (mp=malloc(len=strlen(s)+1))
        memcpy(mp, s, len);
    return(mp);
}

/*
    Report amount of free memory in the system.
    Errors not allowed here.
*/

ULONG
amtfree()
{
    ULONG c, f;

    Forbid();
    c=AvailMem(MEMF_CHIP);
    f=AvailMem(MEMF_FAST);
    Permit();
    return(c+f);
}

/*
    Print a message corresponding to the error given,
    prompting with s, if nonnull.
    Return the error given.
*/

prerr(s, err)
char *s;
{
    register char *errp;

    switch (err){
        case E_NOMEM:
            errp="Out of memory"; break;
        case E_NOEXAM:
            errp="Couldn't examine"; break;
        case E_NOLOCK:
            errp="File not found"; break;
        case E_OUTPUT:
            errp="Can't open output file"; break;
        case E_USAGE:
            errp="Usage: qcat [-o outputfile] [-c drivename] or \n\
qcat [-o outputfile] dirname";
            break;
        case E_LIBRARY:
            errp="Couldn't open intuition.library";
            break;
        default:    /* NOTREACHED   */
            errp="grievous error"; break;
    }
    if (s) printf("%s: %s\n", s, errp);
    else printf("%s\n", errp);
    return(err);
}

/*
    Set up the AutoRequest stuff, and use the
    automatic requestor to tell the user when
    to change disks, let them quit, and return
    when they do so.
*/

char *rsp_bod0="Insert a disk";
char *rsp_bod1="Next disk";
char *rsp_no="Quit";
char *rsp_yes="Redo";

struct response {
    struct IntuiText bod;
    struct IntuiText no;
    ULONG yflg;
    struct Window *w;
    } rsp;

/*
    Initialize the autorequestor's data and
    find a window to put it in. Return nonzero
    on failure, zero on success.
*/

getrspinit()
{
    rsp.bod.FrontPen=0;
    rsp.bod.BackPen=1;
    rsp.bod.DrawMode=JAM1;
    rsp.bod.LeftEdge=6;
    rsp.bod.TopEdge=3;
    rsp.bod.ITextFont=NULL;
    rsp.bod.IText=rsp_bod0;
    rsp.bod.NextText=NULL;

    rsp.no=rsp.bod;
    rsp.no.IText=rsp_no;

    rsp.yflg=DISKINSERTED;

    return(!(rsp.w=getCLIwin()));
}

/*
    Return a pointer to a window for
    the requestor.  If there be none,
    return NULL.
*/

struct Window *
getCLIwin()
{
    register struct Screen *sp;
    register struct Window *wp;

    return(IntuitionBase->ActiveWindow);
}

/*
    Post a requestor asking for a new
    disk.  The first time called, just
    ask for the first disk; after that,
    ask for the next.  Return the boolean
    value of the user's response.
*/

getresponse()
{
    register rv=0;

    rv=AutoRequest(rsp.w, &rsp.bod, NULL, &rsp.no, rsp.yflg, 0L, 200, 50);
    rsp.bod.IText=rsp_bod1;
    return(rv);
}


SHAR_EOF
cat << \SHAR_EOF > qcat.doc

    11/88


    QCAT v0.01 -- List files on disks or in directories


                         -----------------

                   Copyright (C) 1988 by Daniel Elbaum

         This software is freely redistributable provided that:
         the three files which comprise it (qcat, qcat.c, qcat.doc)
         remain intact; all copyright notices contained in any of
         the aforementioned files remain intact; and no fee beyond
         reasonable remuneration for collation and distribution be
         charged for use and/or purveyance.

                         -----------------

    Syntax:
        qcat [-o filename] [dirname ...]
    or
        qcat [-o filename] -c drive


    Qcat simply produces a listing of the full pathname of all
    files in a list of directories or in a series of disks.

    With no arguments, a list is produced of the files in the
    current directory and all its sub directories.

    -o redirects the list to a file of the specified name, wiping
    out any file of that name which may already exist.

    -c causes a continuous listing of a single drive.  A requestor
    comes up prompting for a disk to be inserted; the names of the
    files on that disk are read, and the requestor comes back asking
    for the next disk.  When all the disks you want to catalog have
    been fed in, click on the 'Quit' gadget, and the complete file
    list will be output.

    Instead of -c and a drive name, a bunch of directory names can
    be given on the command line.  A single list will be output of
    all the files in all the specified directories and their sub-
    directories.

    Nota Bene:

    The list won't be sorted.  There are plenty of utilities out
    there which sort files by line, so I didn't want to bloat
    this program with the extra functionality.  If enough people
    want a sorting option, I'll add one.

    If the directory trees to be listed are deep (lots of sub-
    directories), the be sure to set the stack size to something
    like 10000 or so, since the recursive routine that does the
    spelunking is pretty stack-hungry.

    The purpose of qcat is to list disks or directories, given a
    simple command line, without involving the user in an interactive
    experience.  One good use for it is to make a listing for a set
    of disks, then use the list to find out where particular files
    are located.  Should come in handy for those Fish disks, eh?

    The way it works is to keep a linked list of filenames in memory
    until all disks or directories have been read, and then to dump
    the list.  If memory gets low, the list will be dumped several
    times during the reading, so even if you have lots of disks to
    look at or not much memory or both, qcat should function smoothly.


    If you want to send me money for qcat, then by all means
    do so--many projects are in progress and I need financing.
    $5.00 is recommended.  Make checks payable to:

    Daniel Elbaum
    Amaranth Software
    4816 SE Bybee Blvd.
    Portland, Ore. 97206


    Send comments, suggestions, and flames to:

    Daniel Elbaum
    Portland bbs: Amigaboard!, NAG, HABIT
    UUCP: ...!tektronix!reed!elbaum
    ARPA: elbaum@reed.EDU





SHAR_EOF
cat << \SHAR_EOF > qcat.uu

begin 644 qcat
M```#\P`````````&``````````4````"```#8P``"CP```!&````)`````T`F
M``/I`````D[Y```````````#[`````$````"`````@````````/R```#Z@``+
M`V,`(0`!``````````````````````````#_________________________U
M______\`````````````````````````````````````````````````````[
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M````````````````````````#(8```Q\```,=@``#'``````````````````8
M`````````````````````````````````````````````````!Z"````````@
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M````````````````````````````;6%T:&EE965D;W5B8F%S+FQI8G)A<GD`%
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M``````````/L````!0````(```9(```&"```!@P```80```&%`````````/R)
M```#Z0``"CPCSP```#`CP````#@CR````#PL>0````0CS@````23R4ZN_MHH,
M0$JL`*QG``$(80`",I'(("P`K.6((#`($.6(2.<`,$7Y````P$?Y````0"!`W
M<``0&$(P"``FR"`Y````."!Y````/$/P"``,(0`@4LC_^D(I``$2&&=<#`$`G
M(&?V#`$`"6?P)LH,`0`B9Q04P1(89T(,`0`@9P04P6#R0AI@U!(89S`,`0`BK
M9_(,`0`J9B`2&`P!`$YG!@P!`&YF!'(*8`X,`0!%9P8,`0!E9@)R&Q3!8,Q"`
M$D*3(#P````\D(M&@.2(3-\,`$AY````0"\`3KD```!,(\`````8(\`````D(
M3KD```!<(\`````<(\`````@(\`````H(\`````L3KD``"&`<``N>0```#!.\
M=6$``2QA``$6(\`````T+P!"IR1`("H`)&<0+'D````(($`B*```3J[_@D'Y!
M```*]`P0``!G4"(()#P```/M+'D````(3J[_X@R``````&=$(\`````8(\``J
M```<(\`````@(\`````D(\`````H(\`````L*4``G"E``*#EB"!`*6@`"`"D8
M3KD``"&`<`!@!"`O``1*N0```#1G$B(Y````&&L*+'D````(3J[_W"YY````2
M,"\`+'D````$(#D````(9P8B0$ZN_F(@.0````QG!B)`3J[^8B`Y````$&<&Z
M(D!.KOYB2KD````T9PY.KO]\(GD````T3J[^AB`?3G5(YP$&+CP``X`'+'@``
M!$ZN_Y1,WV"`<&1@`/]Z0>P`7$ZN_H!![`!<3J[^C$YU0_H`$G``3J[]V"/`3
M````"&?`3G5D;W,N;&EB<F%R>0!.<4Y6^[A(YQ\\)BX`#$7Y```*P$?Y```A$
M_DGY```!Q$OY```$_'H`?`!8@R!#(%`0$`P``"UF``#*($-2D"!0$!!(@$C`;
M3KD``"><```"Y@```&\```,0````8P````````-N6(,@0R`09@``&$AX__Q"Q
MITZ24$](>``*3I-83V````@@0RP06(-@``!R6(,@0R`09@``&$AX__Q"ITZ2<
M4$](>``*3I-83V````@@0RH06(-(>``!2'D```UP3KD```!X4$\CP````<`@R
M.0```<!F```42'C_^D*G3I)03TAX``I.DUA/8```%$AX__Q"ITZ24$](>``*(
M3I-83V``_RQ*AF<``#!(>0``#6XO!DZY```.!%!/*(`@%&8``!1(>/_[+P9.V
MDE!/2'@`"DZ36$]@```20?D```L((`@&@````"`H@$J%9P``5$ZY```+G$ZYW
M```,(DJ`9P``/GX!2H=G```V2'D```'(+P5.N0``!L103R\%3I583R@`9P``%
M"B\$+P5.DE!/3KD```PB2H!F```$?@!@QF```'H@0R`09@``/$AN^[A.N0``\
M!T183TAN^[A(>0```<A.N0``)(A03TAN^[A.E5A/*`!G```,+P1(;ONX3I)01
M3V```#@@0R`09P``,$AY```!R"!#+Q!.N0``!L103R!#+Q!.E5A/*`!G```,T
M+P0@0R\03I)03UB#8,I(>0``!@`O%$ZY```)Z%!/2'D```8`3KD```FB6$\@Z
M%$'Y```+""((!H$````@L(%G```,+Q1.N0``#8183R`Y```!P&<``!`O.0``1
M`<!.N0```&183T*G3I-83TS?//A.7DYU3E;_]$CG'B`J+@`(1?D```"D>`!V&
M`'P`2H5F```,</U,WP1X3EY.=4AX__XO!4ZY````B%!/*`!F```&</]@X$AXB
M``%(>`$$3KD````@4$\F`&8```PO!$Z26$]P_F#`+P,O!$ZY````N%!/2H!F?
M```:+P1.DEA/2'@!!"\#3KD````X4$]P_6"6($,@*``$;```%DAY```&`"\%X
M3KD```C@4$]@``!0+P,O!$ZY````U%!/2H!G```^(`-0@"\`2'D```'(3KD`_
M``8,4$](>0```<A.N0``!/Q83RP`9P``!F```!)(>0```<A.N0``!FA83V"RL
M+P1.DEA/2'@!!"\#3KD````X4$\@!F``_Q).5O_\2.<<`"8N``@H+@`,*@,@;
M0Q`09P``!E*#8/2VA6<``!I3@R!#$!`,```Z9P``"E*#($,0O``O4H,@1!`01
M9P``#B!$4H0B0U*#$I!@["!#0A!,WP`X3EY.=4Y6__Q(YQ@`*"X`"&8```I,>
MWP`83EY.=28$($,0$&<```92@V#T($,0$`P``"]G```8($,0$`P``#IG```,B
MMH1O```&4X-@WB!#$!`,```Z9@``!%*#($-"$&"T3E;_^$CG'@`F+@`(*BX`P
M#'@`2H-G```(2H5F```,<`!,WP!X3EY.=2!#+P@O`TZY```DG%A/4X`@7]'`@
M$!`,```Z9@``"'P!8```!'P`2'C__B\#3KD```"(4$\H`&8```9P`&"Z+P4O/
M!$ZY```'A%!/+P1.N0```*183R`%8*!.5O_\2.<8`"8N``AF```,<`!,WP`8&
M3EY.=2\#0J=.N0```/!83R@`+P1.N0``!X103R\$3KD```#P6$\@`V#23E;[Y
M5$CG'``F+@`,*"X`"&<```A*@V8```QP`$S?`#A.7DYU0B[_C"\#+P1.N0``T
M"%A03R\$3KD```$$6$\H`&<``$A(;O^,+P1.N0``"%A03TJ`9P``+B\#2&[_\
MC$AY```-:$AN^U1.N0``'/;>_``02&[[5"\#3KD``"2(4$]@```&8```!&"JG
M$"[_C&<``!X@0R\(2&[_C$ZY```DG%A/(%_1P!"\`#I@```B($,O""\#3KD`"
M`"2<6$\J`"!?T<40O``Z($/1Q4(H``$@`V``_TI.5O_\2.<<`"@N``PJ+@`((
M=@!*A6<```A*A&8```QP`$S?`#A.7DYU2'@``4AX`01.N0```"!03R8`9@``.
M!G``8-XO`R\%3KD```"X4$]*@&8``!1(>`$$+P-.N0```#A03W``8+H@`U"`.
M+P`O!$ZY```DB%!/2'@!!"\#3KD````X4$\@!&"83E8``$CG&``F+@`,*"X`&
M"&<```A*@V8```QP_TS?`!A.7DYU3KD```J$#(```/H`;```'"\#+SD```'$9
M3KD```GH4$\O`TZY```)HEA/($,@*``$9P``"B!#)B@`!&#N3KD```EX($,A1
M0``$("@`!&8```9PG&"D+P1.N0``"CA83R!#(&@`!""`(!!F```&<)M@B'``]
M8(1.5O_\+P-(>``(3KD```_\6$\F`&<```P@0T*0($-"J``$(`,F'TY>3G5.Z
M5O_\2.<8`"8N``AF```*3-\`&$Y>3G4@0R8H``1*@V<``"(@0R@H``0@0R\0Z
M3KD``">P6$\O`TZY```GL%A/)@1@VF#*3E8``$CG&``F+@`,*"X`"$J#9P``G
M"$J$9@``"DS?`!A.7DYU($,F*``$2H-G```@($,O$$AY```-9"\$3KD``!T<(
MWOP`#"!#)B@`!&#<8,Q.5O_X2.<<`"@N``AF```,<`!,WP`X3EY.=2\$3KD`U
M`"2<6$]2@"H`+P5.N0``#_Q83R8`9P``$B\%+P0O`TZY```H=-[\``P@`V#&:
M3E;_^$CG&`!.N0````!(>``"3KD```!06$\H`$AX``1.N0```%!83R8`3KD``
M```0(`30@TS?`!A.7DYU3E;__$CG'``H+@`(*BX`#"`%#(#____Z;0``@%R`6
M#(`````%;@``=.6`0?D```KV(G`(`$[1```+3@``"S8```M"```+'@``"Q(`X
M``LJ`````$'Y```-5B8(8```1D'Y```-1"8(8```.D'Y```--"8(8```+D'YJ
M```-'"8(8```(D'Y```,T"8(8```%D'Y```,L"8(8```"D'Y```,H"8(2H1GJ
M```:+P,O!$AY```,F$ZY```=9-[\``Q@```2+P-(>0``#)1.N0``'6103R`%C
M3-\`.$Y>3G5.<4Y6```O"D7Y```&&$(2%7P``0`!0BH``C5\``8`!#5\``,`.
M!D*J``@E>0``!@@`#$*J`!!(4D/J`!0@7W`%(MA1R/_\)7D```80`"`E?````
M@```*$ZY```,$"5``"P@*@`L9@``"'`!8```!$*`)%].7DYU3E;_^"!Y```!^
MP"`H`#1.7DYU3E;__$CG$"!%^0``!AAV`$AX`#)(>`#(0J<O*@`H(`H&@```/
M`!0O`$*G+PHO*@`L3KD`````WOP`("8`)7D```8,``P@`TS?!`A.7DYU4F5DQ
M;P``475I=```3F5X="!D:7-K`$EN<V5R="!A(&1I<VL`)7,*`"5S.B`E<PH`S
M9W)I979O=7,@97)R;W(``$-O=6QD;B=T(&]P96X@:6YT=6ET:6]N+FQI8G)A+
M<GD`57-A9V4Z('%C870@6RUO(&]U='!U=&9I;&5=(%LM8R!D<FEV96YA;65=+
M(&]R(`IQ8V%T(%LM;R!O=71P=71F:6QE72!D:7)N86UE`$-A;B=T(&]P96X@8
M;W5T<'5T(&9I;&4``$9I;&4@;F]T(&9O=6YD``!#;W5L9&XG="!E>&%M:6YEE
M``!/=70@;V8@;65M;W)Y`"5S"@`E<R\E<P!W`&EN='5I=&EO;BYL:6)R87)YD
M`$YQ3E8``"\#)BX`"&<``'(,@P``"PAG```J0?D```L((`@&@````""V@&<`U
M`!9!^0``"P@@"`:`````0+:`9@``""8?3EY.=2\#3KD``"5(6$\@0R\03KD`?
M```<6$\@0R\H``P@0R\H`!I.N0```#A03TAX`"`O`TZY```E+%!/8,!.5O_LS
M2.<?,"1N``PF;@`(+#P```$`>``,A@````%L```$?`%V`'H`#(4````4;```:
M,D'Y```+""`((@7K@="!($`@*``:9@``%D'Y```+""`((@7K@="!)@!@```&N
M4H5@QDJ#9P`!`A`2#```<F8``!HN/````^T0*@`!#```*V8```@N/````^T0X
M$@P``'=F```Z+CP```/N$"H``0P``"MF```H2'@#[2\+3KD`````4$\H`&<`O
M`!1(>``!0J<O!$ZY````;-[\``Q*A&8``!`O!R\+3KD`````4$\H`$J$9P``!
M;"!#((0@0R%&``P@0T)H`!X@0T*H``@@0T*H``1"IR\&3KD````@4$\@0R%`"
M`!H@*``:9P``)$*G0J<O!$ZY````;-[\``P@0R%``!0B0R-H`!0`$&```!`OP
M!$ZY````'%A/8```!F```!I(>``@+P-.N0``)2Q03W``3-\,^$Y>3G4@`V#T\
M3E;_\$CG'@!X_W8`#(,````4;```)"`N`!!!^0``"P@B""0#ZX+2@K"!9@``4
M""@#8```!E*#8-0,A/____]G``!(+RX`#"\N``A.N0``#@103RP`+P9.N0``+
M(W!83RH`2'@`@"\%+P1.N0``)+#>_``,0?D```L((`@B!.N!T(%,WP!X3EY.!
M=7``8/1.5O_\2.<8($7Y```-B"@N``A"IR`$!H`````0+P!.N0```"!03R8`N
M(!)G```((%(A0P`$($,@DB!#(4H`!"`$!H`````0($,A0``()(,@`P:`````X
M#$S?!!A.7DYU3E;_^$CG&``O+@`,+RX`"$ZY```E]"`?6$\H`"\$3KD``")XT
M6$\F`"\$+P-.N0``)2Q03R`#3-\`&$Y>3G5.5O_T2.<>`"@N``@O+@`,3KD`P
M`")X6$\F`&<``#0@!`2`````$"P`($8@*``(!(`````0*@`O!2\#+P1.N0``Z
M)&C>_``,+P1.N0``(]183R`#3-\`>$Y>3G5.<4Y6__1(YQ\`)BX`""HN``Q!D
M^0``"DP@"`:`````?R@`($1"$`R#@````&8``%@@!4ZY```GG```$4H````(Y
M```16@````H``!%D````$````````!%N0?D``!YV(`A,WP#X3EY.=4'Y```>9
M:B`(8.Y!^0``'F`@"&#D0?D``!Y8(`A@VDJ#;```"'`!8```!$*`+@!G```(+
M(`-$@"8`+P4O`TZY```G!B`?6$\L`"\%+P-.N0``)F8@'UA/)@`@>0``!DC1V
MQE.$(D02D$J#;LY*AV<```I3A"!$$+P`+2`$8`#_?$Y6_\A(YQ\`*BX`$`R%5
M````(&\```1Z!D'Y```>4$/N``@@*0``(BD`!$ZY```A+DJ`;```"'`!8```Q
M!$*`+@!G```@0>X`""`H```B*``$3KD``"$>0>X`""%````A00`$0>X`""\H:
M``0O*```3KD``!ZH4$]![O_8(4```"%!``1![O_80^X`""`I```B*0`$3KD`R
M`"$&0>[_X"%````A00`$0?D```I,)@A\`+R%;```CD'Y```>2$/N_^`@*0``J
M(BD`!$ZY```@OD'N_^`A0```(4$`!$'N_^`O*``$+R@``$ZY```>J%!/+P$@%
M`"(?3KD``"%F*``&```P($-2@Q"`(`1.N0``(59![O_@+P$O`"`H```B*``$:
M+5__R"U?_\Q![O_(3KD``"$&0>[_X"%````A00`$4H9@`/]P($-2@T(0<#]!$
M^0``"DPB""0%1(+2@M"!)@!(>0``"DPO`TZY```DB%!/4X,@0Q"\`"Y!^0``[
M'D!#[O_8("D``"(I``1.N0``(-8O`2\`3KD``!ZH4$]![O_0(4```"%!``1!,
M^0``'CA#[O_0("D``"(I``1.N0``(+Y![O_8+P$O`"`H```B*``$+5__R"U?F
M_\Q![O_(3KD``"$&+P$@`"(?3KD``"%F*``&```P4X,@0Q"`0>[_T$/N_]@C>
M:``````C:``$``1!^0``'C!#[O_8("D``"(I``1.N0``(2Y*@&X`_TY*AV<`V
M``I3@R!#$+P`+2`#3-\`^$Y>3G5.5O_(2.<?("XN`!`,AP```"!O```$?@9!A
M^0``'BA#[@`(("D``"(I``1.N0``(2Y*@&P```AP`6````1"@"1`(`IG```@0
M0>X`""`H```B*``$3KD``"$>0>X`""%````A00`$>`!!^0``'B!#[@`(("D`#
M`"(I``1.N0``(2Y*@&<``(Y!^0``'AA#[@`(("D``"(I``1.N0``(2Y*@&T`R
M`"I!^0``'A!#[@`(("D``"(I``1.N0``(-9![@`((4```"%!``12A&"Z0?D`(
M`!X(0^X`""`I```B*0`$3KD``"$N2H!L```J0?D``!X`0^X`""`I```B*0`$6
M3KD``""^0>X`""%````A00`$4X1@ND'N``@O*``$+R@``$ZY```>J%!/0>[_7
MV"%````A00`$0>[_V$/N``@@*0``(BD`!$ZY```A!D'N_^`A0```(4$`!$'YS
M```*3"8(>@"ZAVP``(Y!^0``'?A#[O_@("D``"(I``1.N0``(+Y![O_@(4``$
M`"%!``1![O_@+R@`!"\H``!.N0``'JA03R\!(``B'TZY```A9BP`!@``,"!#V
M4H,0@"`&3KD``"%60>[_X"\!+P`@*```(B@`!"U?_\@M7__,0>[_R$ZY```A4
M!D'N_^`A0```(4$`!%*%8`#_<"!#4H,0O`!%2H1M```.($-2@Q"\`"M@```0R
M($-2@Q"\`"T@!$2`*`!Z`DJ%;0``,DAX``HO!$ZY```G!B`?6$\L``8``#`@$
M0]'%$(!(>``*+P1.N0``)F8H'UA/4X5@RB!#0B@``W`Y0?D```I,(@@D!T2"-
MTH+0@28`2'D```I,+P-.N0``)(A03U.#($,0O``N0?D``!WP0^[_V"`I```B3
M*0`$3KD``"#6+P$O`$ZY```>J%!/0>[_T"%````A00`$0?D``!WH0^[_T"`I"
M```B*0`$3KD``""^0>[_V"\!+P`@*```(B@`!"U?_\@M7__,0>[_R$ZY```AW
M!B\!(``B'TZY```A9BP`!@``,%.#($,0@$'N_]!#[O_8(V@`````(V@`!``$T
M0?D``!W@0^[_V"`I```B*0`$3KD``"$N2H!N`/].(`IG```*4X,@0Q"\`"T@?
M`TS?!/A.7DYU3E;_]$CG&``H+@`00?D``!W80^X`""`I```B*0`$3KD``"$NS
M2H!L```80>X`""`H```B*``$3KD``"$>8```#D'N``@@*```(B@`!$'N__0A?
M0```(4$`!$'Y```=T$/N__0@*0``(BD`!$ZY```A+DJ`;@``($'Y```=R$/N'
M__0@*0``(BD`!$ZY```A+DJ`;```(B\$0>X`""\H``0O*```3KD``!06WOP`@
M#$S?`!A.7DYU+P1![@`(+R@`!"\H``!.N0``$=C>_``,)@`O`TAY```*3$ZYF
M```DB%!/2H1O```L0?D```I,)@@@0Q`09P``!E*#8/13@R!#$!`,```P9@``&
M"B!#4X-"$&#L0?D```I,(`A@E$Y6__A(YQP`*BX`"'@`0?D```I,)@A!^0``#
M"DPF""!%$!!G```0($52A2)#4H,2D%*$8.JXK@`,;```$"`N`!`@0U*#$(!2>
MA&#J($-"$$'Y```*3"`(3-\`.$Y>3G5.5O_X2.<<`"@N``@O!$ZY```DG%A/R
M*@!!^0``"DPF""`%4H6PK@`,;```#B`N`!`@0U*#$(!@Z"\$+P-.N0``)(A0>
M3T'Y```*3"`(3-\`.$Y>3G5.5@``2.<<`"8N``@H+@`,*BX`$$J$;P``&"\%W
M+P0O`TZY```8V-[\``PF`&```!Y*A&P``!@O!2`$1(`O`"\#3KD``!AZWOP`H
M#"8`(`-,WP`X3EY.=4Y6_]9(YQ\\)FX`$$OY```0]"@N``PF+@`(($,0$&<`^
M`TH@0Q`02(!(P$ZY```GG```&<(````E````````'-Y2@S1\```L/```!``@U
M0Q`0#```+68```AP`6````1"@"U`__0@+O_T9P``!%*#($,0$$B`2,`H0"`,I
M#(`````P9P``!CA\`"`@0Q`0#```*F8```Y2@R!$)%!8A&```#H@0Q`0#```<
M,&T``"X@0Q`0#```.6X``"(@"M"`(@#E@="!($,2$$B!2,'0@02`````,"1`V
M4H-@R"`N__1G```((`I$@"1`($,0$`P``"YF``!64H,@0Q`0#```*F8```Y2,
M@R!$+!!8A&```#Q\`"!#$!`,```P;0``+B!#$!`,```Y;@``(B`&T(`B`.6!'
MT($@0Q(02(%(P="!!(`````P+`!2@V#(($,0$$B`2,!.N0``)YP``!L^````,
M)0``&U8```!C```;<@```&0``!N&````90``&ZH```!F```;S@```&<``!ORX
M````;```&_@```!O```<#````',``!PD````=0``'#@```!X```<@@```%@``
M```````<EAU\`"7_UD'N_]9"*``!0>[_UBH(8``!2B!$(!`=0/_60>[_UD(H)
M``%![O_6*@A8A&```2Y(>``*($0O$$Z54$\J`%B$8``!&B\&($0O*``$+R@`=
M`$ZY```4%M[\``PJ`%"$+#P```0`8```]B\&($0O*``$+R@``$ZY```1V-[\L
M``PJ`%"$+#P```0`8```TB\&($0O*``$+R@``$ZY```78M[\``PJ`%"$+#P`_
M``0`8```KE*#8`#^TDAX``@@1"\03I503RH`6(1@``"4($0J$%B$2H5F```*W
M0?D``!W`*@A@``!\2'@`"B!$+Q!.E5!/*@!8A&```&A(>``0($0O$$Z54$\J!
M`"X%($<0$&<``"X@1Q`0#```06T``!X@1Q`0#```6FX``!(@1Q`02(!(P`8`X
M`"`@1Q"`4H=@S%B$8```'DAX`!`@1"\03I503RH`6(1@```*0?D``!VX*@@O+
M!4ZY```DG%A/L(9O```(($71QD(0+PPO"B\%3KD``!DLWOP`#"H`($40$&<`>
M``X@15*%(DM22Q*08.Q@```*($,B2U)+$I!2@V``_+)"$TS?//A.7DYU3E8`E
M`"\#)BX`""\#2&X`$"\N``Q.N0``&8+>_``,(`,F'TY>3G5.5O_\+P-!^0``9
M!DPF""\#2&X`$"\N``Q.N0``&8+>_``,+RX`""\#3KD``"2<6$\O`$AX``$O-
M`TZY```?@-[\`!`F'TY>3G5.5O_\+P-!^0``!DPF""\#2&X`#"\N``A.N0``R
M&8+>_``,0?D```L((`@&@````"`O`"\#3KD``"2<6$\O`$AX``$O`TZY```?S
M@-[\`!`F'TY>3G4M3T]04RT``"AN=6QL*0``.\><H0R20BM$%:\=>+6,0```M
M``````````````````!`)````````$`D````````0"0```````!`)```````0
M`#_P````````0"0```````!`)```````````````````````````````````W
M`````$`D````````0"0```````!`)```````````````````+4]/4%,M```X_
M,#`P,#`P,```+3(Q-#<T.#,V-#@`,C`P,#`P,#`P,#``,#$R,S0U-C<X.4%"N
M0T1%1D=(24I+3$U.3U!14E-455976%E:``!.5O_\0>X`""`H```B*``$3KD`/
M`"%F+4#__"`N__Q.N0``(59.7DYU3E;_^$'N``@O*``$+R@``$ZY```>J%!/5
M0>[_^"%````A00`$0>[_^$/N``@@*0``(BD`!$ZY```A+DJ`;```'D'Y```?G
M=D/N__@@*0``(BD`!$ZY```@[DY>3G5![O_X("@``"(H``1@[F#L3E8``$'YN
M```?;D/N``@@*0``(BD`!$ZY```@[B\!+P!.N0``'JA03TZY```A5DY>3G4_J
MX````````#_P````````3G%.5O_T2.<?("8N`!0N+@`()&X`#'P`+PHO+@`0?
M3KD``"7T(!]83RH`($,@*``,($.0J``$L(5L```2($,@*``,($.0J``$8```O
M!"`%*``O!"!#("@`&B!#T*@`!"\`+P=.N0``)&C>_``,W(2:A-Z$($/9J``4>
M($/9J``$($,@*``(($.PJ``$;```#"!#(D,C:``$``@@0P`H``$`&$J%9P``+
M)B\#3KD``"5(6$\H``R$_____V8```P@!$S?!/A.7DYU8```!F````9@`/]:8
M+P-.N0``)4A83R\*+P9.N0``)F8@'UA/8-).<4CGP,`@.0````QF```^0_D`9
M``K,<``L>0````1.KOW8(\`````,9@``(DCG`08N/``#@`4L>``$3J[_E$S?!
M8(!(>`!D3KD``"'^+$!,WP,#3G5(YS`"3KD``"!L3-@`#$ZN_[),WT`,3G5(=
MYS`"3KD``"!L3-@`#$ZN_ZQ,WT`,3G5(YS`"3KD``"!L3-@`#$ZN_[Y,WT`,1
M3G5(YS`"3KD``"!L3-@`#$ZN_[A,WT`,3G4O#DZY```@;$ZN_\0L7TYU2.<P0
M`DZY```@;$S8``Q.KO_63-]`#$J`9@1P`&`(:P1P`6`"</].=2\.3KD``"!L=
M3J[_W"Q?3G4O#DZY```@;$ZN_^(L7TYU0H%.=4*!3G5.<4Y6```O"D7Y```DJ
ML$*Y```-B$AX`H!(>0``"PA.N0``)2Q03TAX`0`O.0```!A"ITZ2WOP`#$AX]
M`0`O.0```!Q(>``!3I+>_``,2'@!`"\Y````($AX``).DM[\``PO+@`,+RX`C
M"$ZY```"A%!/0J=.N0``(?Y83R1?3EY.=4Y6__Q(YQ`P1?D```V(1_D``"-P0
M2'D```L(3I-83T'Y```+""`(!H`````@+P!.DUA/0?D```L((`@&@````$`O8
M`$Z36$\@$F<``!H@4B80(%(O*``(+Q).N0```#A03R2#8.(O+@`(3KD```'$M
M6$],WPP(3EY.=4YQ3E;__$CG&"!%^0``#8@H+@`(0J<@!`:`````$"\`3KD`D
M```@4$\F`"`29P``""!2(4,`!"!#()(@0R%*``0@!`:`````$"!#(4``""2#T
M(`,&@`````Q,WP083EY.=4Y6__A(YQ@`+RX`#"\N``A.N0``)?0@'UA/*``OX
M!$ZY```B>%A/)@`O!"\#3KD``"4L4$\@`TS?`!A.7DYU3E;_]$CG'@`H+@`(E
M+RX`#$ZY```B>%A/)@!G```T(`0$@````!`L`"!&("@`"`2`````$"H`+P4OM
M`R\$3KD``"1HWOP`#"\$3KD``"/46$\@`TS?`'A.7DYU3G%.5O_\2.<8`"8NU
M``@O`TZY```E2%A/0J<@0R`H`!0@0Y"H`!`O`"!#*!`O!$ZY````;-[\``P@>
M0R\H``P@0R\H`!I.N0```#A03TAX`"`O`TZY```E+%!/(`1,WP`83EY.=4YQV
M3E;__$CG&``H+@`(9P``2G#T0?D```KD(@@$@0``"N0D!)2!(@+0@28`($,B[
M0R)I``0BD"!#(!!G```.($,B0R)1(V@`!``$($,O*``(+P-.N0```#A03TS?7
M`!A.7DYU3E;__$CG$"!%^0``#8@@$F<``!H@4B80(%(O*``(+Q).N0```#A04
M3R2#8.),WP0(3EY.=4Y6```O+@`0+RX`""\N``Q.N0``*'3>_``,3EY.=4YQT
M(&\`!")O``@0V6;\("\`!$YU3G$@;P`$2AAF_)'O``13B"`(3G5.<4Y6__Q(3
MYQ@`*"X`$&8```1X`4'Y```+""`((BX`".N!T($F`&<``%)"IR!#(40`#"\H%
M``Q.N0```"!03R!#(4``&B`H`!IG```P0J="IR!#(*X`#"\03KD```!LWOP`$
M#"!#(4``%")#(V@`%``0(`-,WP`83EY.=7``8/1.5@``+RX`#$*G+RX`"$ZYS
M```H1-[\``Q.7DYU3E;_]$CG'B`F+@`(-'P`$'P`($,0*``82(!(P`*`````B
M`6<``'(@0R`H`!0@0Y"H``0J`"`R.`"PA6<``!I"IR`%D+(X`"\`($,O$$ZY"
M````;-[\``P@0R\H``0@0R\H`!H@0R\03KD````PWOP`#"@`($.XJ``$9P``Y
M#'S_2H1L```$>``@!="$)8`X`"!#`BC__@`8($-"J``(($-"J``$(`9,WP1XH
M3EY.=4Y6``!(Y_@`2FX`"&8``!Y*;@`,9@``%C`N``K`[@`.+4``"$S?`!].O
M7DYU>`$D+@`(;```!D2"1(0F+@`,;```!D2#1(1"@#`"P,,R`DA"Q,-(0\+#A
MTH)(04)!T(%*A&P```1$@"U```A,WP`?3EY.=4Y6```O`$IN``QF'"`N``AK[
M%H#N``YI$`*```#__RU```@@'TY>3G5(YWP`>@$@+@`(;`1$@$2%)@`B+@`,I
M;`1$@42%*`$,@0`!``!L%$)`2$"`P30`,`.`P4A`,`)(0&`JXHCBB0R!``$`7
M`&ST@,$"@```__\D`"\`+P1A`/\0(!]83[:`;`)3@B`"2H5L`D2`+4``"$S?Y
M`#X@'TY>3G5.5@``2.?X`$IN``QF'"`N``AK%H#N``YI$$)`2$`M0``(3-\`S
M'TY>3G5X`2`N``AL!$2`1(0D`"(N``QL`D2!#($``0``;!!"0$A`@,$P`H#!4
M0D!(0&`L)@'BB.*)#($``0``;/2`P0*```#__R\`+P-A`/YZ(!]83[2`9`*0+
M@Y""1(!*A&P"1(`M0``(3-\`'TY>3G4@7R)8(@EG!K"89O9.T2!03M!.<4Y6,
M__Q(YQ@`*"X`"&<``$IP]$'Y```*^"((!($```KX)`24@2("T($F`"!#(D,BD
M:0`$(I`@0R`09P``#B!#(D,B42-H``0`!"!#+R@`""\#3KD````X4$],WP`8*
M3EY.=4Y6__Q(YQ`@1?D```V((!)G```:(%(F$"!2+R@`""\23KD````X4$\DO
M@V#B3-\$"$Y>3G5.5O_T2.<>`"HN``@L!2@N``PF+@`02H-O```,($92AA"$`
M4X-@\"`%3-\`>$Y>3G5.5O_T2.<?`"PN`!`N+@`(2H9N```,(`=,WP#X3EY.>
M=2HN``PH![J$;@``."`&4X`B!=*`(`&PA&T``"@@!E.`VH`@!E.`V(`F!DJ#E
M;P``$"!%4X4B1%.$$I!3@V#L8```&"8&2H-O```0($52A2)$4H02D%.#8.P@)
M!V"<```#[````&L````!```H&@``)\0``"?,```DQ```)#X``"/H```C\```F
M(H(``"'0```AO```(:H``"&8```B%```(AX``"(R```AC@``(@@``"!R```@+
MC@``('P``!V(```1!@``$;0``!)^```3(@``$S0``!5J```6;@``%H```!@T<
M```82```&'(``!B*```8D@``&,H``!CR```9'@``'20``!UL```0!@``#C@`_
M``Y0```/C```#^0```V4```-G@``#;(```ND```+Q@``"^(```P6```,+```^
M#&````.Z```$N@```IX```-*```#4````^H```0Z```$;```!)H```2J```$2
MV```!.(```62```%O@``!<P```7D```)&````6`````"````"`````X````:&
M````1@```$P```!>````9````-X```#N````_````0(```$.```!%````1H`>
M``$@```!+@```3X```%0```!=````88```&,```!D@```9@```&>```!I```9
M`<H```'2```!V@```>0```'R```"`````@X```(<```"*````FX```#H````#
M`@``)3P``"1Z```CP@``(X```"->```C4@``(P0``"+H```B]@``(R8``")H;
M```B#@``(>@``"&>```AB```(?(``""R```@Q```(-P``"#T```A#```(2(`J
M`"$T```A6@``(6H``"!@```@*```(%0``!_B```?G@``'R0``!]4```?!@``P
M'L@``!]F```>N@``'N(``!\2```?0@``'UX``!U6```=J@``&.@``!RB```=G
M1@``'9H``!->```4S```%JH``!,\```6B```&#H``!D6```2X```%<P``!+,M
M```3O```%;@``!<(```2H```$XX``!42```5C```%MH``!)L```3`@``$[``<
M`!58```5[@``%OP``!)(```2O@``$V@``!4T```5J@``%K0``!(J```4:@``S
M%YH``!($```3]```%$(``!20```4K@``%/0``!=````7@@``%\X``!?L```1[
MJ```%E@``!&8```6/```$28``!FN```:T@``$2H``!$R```1.@``$48``!%,X
M```17```$68``!%P```1\@``$HX``!-,```3?```$^(``!0P```4?@``%)P`Q
M`!2Z```4X@``%0```!5Z```6F```%L@``!<N```7<```%[P``!?:```8!@``B
M&"8``!E.```9;@``&9```!FR```9O@``&M8``!K>```:Y@``&NX``!KV```:1
M_@``&P8``!L.```;%@``&QX``!LF```;+@``&SH``!N4```;N```&]P``!P:`
M```<F```'+P``!T,```=-@``'7X``!#B```0U@``$(@``!!Z```0J@``$&P`3
M``_:```/R```#UP```^\```-_```#<X```OR```+=```"XH```IX```*)@``=
M"=(```G<```)A```"F0```?N```&]```""````@Z```*5@``!-````1````'3
M_@``",@```.4```"R@```I@```*2```"I````LX```+6```"X@```SP```.,?
M```#T````]8```/R```$#@``!"X```1V```$H@``!+````6:```%Q```!=(`X
M``7J```',```!W````>R```'T```!^0```D&```)'@``"2@```E"```)7```O
M"AX```KL```*]@``"OH```K^```+`@``"P8```L*```+%```"R````LL```+I
M.```"T0```M0```+7```"VX```N$```!)@```;P````6`````P``);```"66>
M```E"```(YX```]&```.R```#R@```ZR```.W```#=H```>\```'9```!WH`0
M``6J```%8@``"*````4L```'&@``!0H```<Z```!"````/8````7````!```Z
M*`(``"@R```DY@``)"8``"16```CM```(I@``")8```0'```#PP```WN```*I
ML```"I@```JF```*C@``!7P```8````(M```"-8```5&```(B@``!.@```-")
M`````0````4```Q4`````````_(```/I````1DCG(`),[P`&``PL>0````A.F
MKO_B3-]`!$YU```O#B(O``@L>0````A.KO_<+%].=4CG,`),[P`.`!`L>0``(
M``A.KO_03-]`#$YU```O#BQY````"$ZN_\HL7TYU+PXL>0````A.KO_$+%].,
M=4CG,`),[P`.`!`L>0````A.KO^^3-]`#$YU``!(YR`"3.\`!@`,+'D````(:
M3J[_K$S?0`1.=0``+PXB+P`(+'D````(3J[_IBQ?3G5(YR`"3.\`!@`,+'D`.
M```(3J[_FDS?0`1.=0``2.<@`DSO``8`#"QY````"$ZN_Y1,WT`$3G4``"\.8
M(B\`""QY````"$ZN_X(L7TYU+PXB+P`(+'D````(3J[_+BQ?3G4```/L````Z
M#`````$```$,````^````.````#$````K````)0```!X````8````%`````\:
M````)`````P````````#\`````-?4&%R96YT1&ER`"4```$$`````U]#=7)RV
M96YT1&ER`````/`````"7T5X3F5X=`````#4`````E]%>&%M:6YE````N```'
M``)?56Y,;V-K`````*0````"7TQO8VL`)>D```"(`````E]3965K`"7I````(
M;`````)?3W5T<'5T`````%P````"7TEN<'5T`"4```!,`````E]7<FET90`EM
M````,`````)?0VQO<V4`)0```!P````"7T]P96X`)>D``````````````_(`^
M``/I````)"\.+'D````$3J[_?"Q?3G4O#BQY````!$ZN_W8L7TYU+PXL>0``"
M``1,[P`#``A.KO\Z+%].=0``+PXL>0````0B;P`(("\`#$ZN_RXL7TYU+PXL'
M>0````0B+P`(3J[_*"Q?3G4O#BQY````!")O``A.KOYB+%].=2\.+'D````$6
M(F\`""`O``Q.KOW8+%].=0```^P````'`````0```'P```!H````5````#P`^
M```D````%`````0````````#\`````-?3W!E;DQI8G)A<GD```!X````!%]#6
M;&]S94QI8G)A<GD`)>D```!D`````U]!=F%I;$UE;0`EZ0```%`````"7T9R?
M965-96T````X`````U]!;&QO8TUE;0`EZ0```"`````"7U!E<FUI=``````0=
M`````E]&;W)B:60```````````````/R```#Z0````U(YS`R+'D```'`(&\`K
M&")O`!PD;P`@)F\`)"`O`"@B+P`L)"\`,"8O`#1.KOZD3-],#$YU```#[```$
M``$````!````!@````````/P`````U]!=71O4F5Q=65S=``````````````#B
!\@$`S
``
end
size 16696
SHAR_EOF
#	End of shell archive
exit 0
-- 
Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
Have five nice days.