[comp.binaries.amiga] midi library

ain@j.cc.purdue.edu (Patrick White) (03/24/88)

Program Name:	midi library  (docs)
Submitted By:	Pete Yadlowsky <pmy@vivaldi.acc.virginia.edu>
Summary:	This is a midi library
Poster Boy:  Pat White  (ain@j.cc.purdue.edu)
Untested.

NOTES:
   Not much we could do to test this, so we didn't bother.
   I reshar'ed it to separate docs, etc.


-- Pat White   (co-moderator comp.sources/binaries.amiga)
UUCP: j.cc.purdue.edu!ain  BITNET: PATWHITE@PURCCVM   PHONE: (317) 743-8421
U.S.  Mail:  320 Brown St. apt. 406,    West Lafayette, IN 47906

========================================

format: uuencoded .arc file
summary: shared MIDI utility library
description:
  Mr. Bill Barton (PeopleLink: PEABODY) has written this wonderful PD MIDI
  utility set for Amiga-MIDIots. As Mr. Barton does not have access to
  USENET, I've taken it upon myself to post the library, with his
  encouragement and gratitude. 

  This is a library of MIDI tools which facilitate the design and
  implementation of networked, multi-tasked MIDI processing systems
  on the Amiga. It is shared (midi.library) and ties in with Exec for
  the creation and management of lists of MIDI nodes and data routes,
  and for message passing. The library also starts two processes
  (MidiIn, MidiOut) which manage the serial.device and allow it to be
  accessed by any number of MIDI processes. A given MIDI node may 
  receive from and send to any number of other nodes, with message
  distribution and merging handled automatically. Basically, the
  library frees the MIDI application programmer from a lot of grunge
  work by providing a MIDI extension to Exec, with a small but powerful
  set of analogous system calls. Bill (and I) would like to see this
  become a sort of MIDI standard for the Amiga. Please take a look at
  it if you're even remotely interested doing MIDI on our favorite computer.

  The uuencoded, arc'd file below contains midi.library, midi.lib (one
  for Lattice, one for Manx), documentation, include files, and an
  assortment of small utilities and source examples. Dig in!


#	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:
#	library.doc
#	readme.lib
#	func.doc
# This archive created: Sun Mar 20 16:47:02 1988
# By:	Patrick White (PUCC Land, USA)
echo shar: extracting library.doc '(31122 characters)'
cat << \SHAR_EOF > library.doc
                                MIDI LIBRARY
                                ==== =======

WHAT IS THE MIDI LIBRARY?

     The MIDI library is a standard Amiga disk-based library that 
provides multitasking access to MIDI resources such as the serial port.  
The library is based around a "copying" message system so that a single 
message sent in can cause several messages to be sent back out.  Included 
as part of the library are tasks that convert serial I/O to MIDI messages 
which can be sent to any task that cares to listen.  This provides for 
unlimited sharing of the serial port by MIDI applications.

     The need for such a service seems obvious in a multitasking 
environment.  Without this sort of interface, two tasks trying to receive 
MIDI data from the serial port at the same time will exclude each other 
from working correctly.  Neither of them will get all the data they 
seek.  By using the MIDI library this problem is eliminated because there 
is only one task actually receiving data from the serial port.  Data is 
then distributed to all who are waiting for it.

     A similar problem occurs with transmitting.  MIDI is based around a 
message system.  Each message contains a certain number of bytes and must 
be received intact to make sense to the receiver.  If two tasks try to 
transmit data to the serial port at the same time it is likely that the 
partial messages from each stream will merge producing disastrous 
results.  The MIDI library handles this by keeping messages intact, and 
again only one task is actually sending data to the serial port.

     The MIDI library is intended for developers writing MIDI 
applications to use with their products.  The library takes care of all 
the grunginess of transferring MIDI data between your applications and 
the serial port.  Instead of getting an unformatted stream of bytes your 
programs receive complete messages as asynchronous events.

     The MIDI library is not SoundScape!  It does NOT contain a sequencer 
or sound sampler.  It is merely a message distributor.


     Features:

     *  Unlimited MIDI message merging.

     *  Provides an interface for multiple MIDI applications to access 
        the serial port without conflict.

     *  Versatile MIDI filtering including message, channel, controller, 
        and SysEx ID number filtering.

     *  Exists as a standard disk-based Amiga library less than 10K in 
        size.

     *  Supports the full MIDI message specification including system 
        exclusive.

     *  Transfers MIDI packets using the Amiga Executive message system.

     *  Almost entirely written in Assembly.

OVERVIEW

     Tasks wishing to perform MIDI I/O create source and destination 
nodes.  These points where messages are sent out and received from.  
Sources and destinations are then routed together.  Any number of routes 
can be connected to a source or destination.  In addition to piping 
information along, a route processes MIDI data.  The following operations 
can be performed by a route in any combination:

     Message filtering
     Channel filtering
     Channel offset
     Note offset
     Controller number filtering
     Sys/Ex id number filtering

     In addition to nodes that the applications create there are 
"resident" nodes that launch built-in tasks.  Currently the only built-in 
tasks are for transmitting and receiving MIDI messages to and from the 
serial port.


LIBRARY

     Before using the MIDI library it must be opened like any other Amiga 
library.  The global symbol for the library base is "MidiBase".

          MidiBase = OpenLibrary ("midi.library",1L);

     The current version number is 1.  This will eventually be set to the 
standard value for KickStart 1.2, which is 33, to avoid version number 
confusion.

     When done using the library you should close it:

          CloseLibrary (MidiBase);

SOURCES AND DESTINATIONS

     The MIDI source and destination nodes are the terminals for MIDI 
communication.  Messages are placed at a source to be distributed to 
destinations through whatever routes are in place.

     Nodes can be either public or private.  Private nodes can only be 
accessed by the task that creates them.  Public nodes are available to 
everyone.  This way an application can perform it's own private 
communications or can be made available for routing in a patch bay.

     The MIDI source is defined in "midi/midi.h" is follows:

          struct MSource {
               struct Node Node;
               struct Image *Image;
               struct MinList RPList;
               APTR UserData;
          };

     where

          Node
               is an instance of an Exec Node used for linking public 
               nodes into the library's source list.  The ln_Name field 
               is set for public nodes to the name supplied by the 
               caller.  ln_Type is set to NT_MSOURCE for user MSource's 
               or NT_PERMMSOURCE for resident MSource's.

          Image
               is a pointer to an Intuition Image structure.  The image 
               may be used by graphics-based patch bay applications.  It 
               is only used for public nodes.  A NULL here indicates that 
               the creator of this node does not have an Image for it; 
               patch bay programs may deal with that as they see fit.

          RPList
               is a linked list of MRoutePtr structures.  Each member of 
               the list is attached to an MRoute structure.  Scanning 
               this list allows you to determine what other nodes are 
               connected to this one.

          UserData
               a generic pointer to any user extension data.  For 
               resident nodes this points to an instance of an MTaskInfo 
               structure.

     There are three functions dealing with MSource's:

          CreateMSource (name,image)
               allocates, initializes, and returns a pointer to a new 
               MSource structure.  If name is non-NULL the MSource will 
               be considered public and will be linked into the library's 
               source list.  Otherwise it will be considered private.

          DeleteMSource (source)
               removes and frees a source created by CreateMSource().

          FindMSource (name)
               looks for a public MSource with the specified name.  If it 
               is found a pointer to it is returned.


     The MIDI destination is defined in "midi/midi.h" is follows:

          struct MDest {
               struct Node Node;
               struct Image *Image;
               struct MinList RPList;
               struct MsgPort *DestPort;
               APTR UserData;
          };

     where the fields differ from an MSource

          Node
               is the same as in an MSource except ln_Type is set to 
               NT_MDEST for user MDest's or NT_PERMMDEST for resident 
               MDest's.

          DestPort
               is a pointer to an Exec MsgPort that is automatically 
               created.  This is where MIDI messages will arrive.  The 
               port flags are set to PA_SIGNAL so you can Wait() for 
               something to arrive.  You don't GetMsg() from this port, 
               however.  See the messages section for the proper way to 
               read messages.

     As with MSource there are three functions dealing with MDest's:

          CreateMDest (name,image)
               allocates, initializes, and returns a pointer to a new 
               MDest structure.  If name is non-NULL the MDest will be 
               considered public and will be linked into the library's 
               destination list.  Otherwise it will be considered private.

          DeleteMDest (source)
               removes and frees a source created by CreateMDest().  Also 
               any unread messages will be freed.

          FindMDest (name)
               looks for a public MDest with the specified name.  If it 
               is found a pointer to it is returned.

     Most of the fields within the node structures can be ignored by 
casual users since they are managed by the library.  You are responsible 
for deleting any nodes you create.

ROUTES

     Routes are the cables that connect sources to destinations.  Nodes 
can have any number of routes connected to them and routes may be 
connected in parallel.  Additionally routes process MIDI messages as they 
are transferred along them.

     The route structure and related structures are defined in 
"midi/midi.h" is follows:

     The MRoute structure is the actual route structure managed by the 
library.  You probably need not be concerned with it's contents.

          struct MRoute {
               struct MSource *Source;
               struct MDest *Dest;
               struct MRoutePtr SRoutePtr, DRoutePtr;
               struct MRouteInfo RouteInfo;
          };

     where

          Source
               points to the source end or input to this route.  If is 
               NULL, then the source no longer exists.

          Dest
               points to the destination end or output of this route.  If 
               is NULL, then the destination no longer exists.

          SRoutePtr
               is an instance of an MRoutePtr structure.  This is the 
               node that is linked into the source's RPList.

          DRoutePtr
               is an instance of an MRoutePtr structure.  This is the 
               node that is linked into the destination's RPList.

          RouteInfo
               is an instance of an MRouteInfo structure.  This is a copy 
               of data supplied by the user.


     The MRoutePtr structure is used to link routes to nodes.  It is 
primarily an internal structure.

          struct MRoutePtr {
               struct MinNode node;
               struct MRoute *Route;
          };

     where

          node
               is an instance of an Exec MinNode structure.

          Route
               points to the MRoute structure containing this MRoutePtr 
               structure.


     You initialize an MRouteInfo structure before creating a route to 
indicate what sort of processing the route is to perform.

          struct MRouteInfo {
               UWORD MsgFlags;
               UWORD ChanFlags;
               BYTE  ChanOffset;
               BYTE  NoteOffset;
               struct RIMatch SysExMatch;
               struct RIMatch CtrlMatch;
          };

     where

          MsgFlags
               are flag bits indicating which messages are to be 
               supported by this route.  "midi/midi.h" contains MMF_ 
               constants which may be ored together.  A value of -1 
               indicates all message types.

          ChanFlags
               are flag bits indicating which channels for channel 
               messages are to be supported by this route.  The least 
               significant bit corresponds to MIDI channel 1, the most 
               significant bit corresponds to MIDI channel 16.  A value 
               of -1 indicates all channels.

          ChanOffset
               is a signed offset to be applied to all channel messages 
               passed through this route.  If the resulting channel is 
               invalid the message is not sent.

          NoteOffset
               is a signed offset to be applied to note on and off 
               messages.  It is half steps.  If the resulting note number 
               is invalid the message is not sent.

          SysExMatch
               is an instance of an RIMatch structure.  It allows you to 
               specify up to three System Exclusive ID numbers to pass 
               through this route.  If left unset, all will be passed.  
               To use this the MMF_SYSEX bit must be set in MsgFlags.

          CtrlMatch
               is an instance of an RIMatch structure.  It allows you to 
               specify up to three controller numbers to pass through 
               this route.  If left unset, all will be passed.  To use 
               this the MMF_CTRL bit must be set in MsgFlags.


     The RIMatch structure is used to specify up to three values to match.

          struct RIMatch {
               UBYTE count;
               UBYTE match[3];
          };

     where

          count
               indicates the number of values in the match list.  If it 
               is 0, all values will be passed.

          match
               contains count values to match.


     In order to create a route you need to have a source pointer, a 
destination pointer, and a properly filled out MRouteInfo structure.  The 
contents of your MRouteInfo is copied to the created route so you do not 
need to preserve it after creation.

     There are several routines dealing with route management.  First a 
note about public nodes.  Since public nodes are available to other tasks 
besides the creator there needs to be a way to insure the validity of a 
given node between the time that someone finds it and the time that 
someone attempts to route to it.  There is a pair of routines to lock the 
node lists to prevent a node from being removed while you are dealing 
with it.  Additionally there are some special routing functions for 
dealing with public nodes that lock the lists for you.  Thus, there is 
route creation function for every permutation of public and private nodes.

     source    dest      function

     private   private   CreateMRoute
     private   public    MRouteSource
     public    private   MRouteDest
     public    public    MRoutePublic

          CreateMRoute (source,dest,routeinfo)
               allocates and links a route into the specified source and 
               destination nodes.  The data pointed to by routeinfo is 
               copied to the new route structure.  This is primarily used 
               when both source and destination are private.

          MRouteSource (source,destname,routeinfo)
               routes a source to a named public destination.

          MRouteDest (sourcename,dest,routeinfo)
               routes a named public source to a destination.

          MRoutePublic (sourcename,destname,routeinfo)
               routes a named public source to a named public destination.


     The remaining routines deal with modifying and deleting routes

          ModifyMRoute (route,newrouteinfo)
               copies the contents of the new MRouteInfo structure to the 
               specified route.

          DeleteMRoute (route)
               unlinks and frees a route.


     You are responsible for deleting any routes you create even if the 
nodes it connected have been deleted.  You should not delete or modify 
anyone else's routes.

MESSAGES

     The messages passed between nodes are UBYTE arrays in the form of 
standard MIDI messages.  There is no restriction on alignment since they 
are bytes.  Each message contains a status byte as its first byte and any 
data bytes associated with that message.  With the exception of system 
exclusive, all messages are from 1 to 3 bytes in length.  A given status 
byte always has the same number of data bytes.

     System exclusive messages can be any length.  Also, the last byte in 
a system exclusive message is the EOX status byte used as a terminator 
(like '\0' in a C string).

     When a message arrives at your destination's MsgPort, it is not in a 
form that you can read directly.  Picture the MDest as a mailbox.  The 
message that arrives is in an envelope or packet that can be discarded.  
When you discover that MDest->DestPort has become non-empty you must call 
GetMidiMsg() rather than GetMsg() since this will take care of opening 
the envelope and throwing it away for you and give you a readable 
message.  Likewise, PutMidiMsg() places a message in an envelope and 
posts it.

     These functions deal with receiving messages:

          GetMidiMsg (dest)
               gets the first MIDI message available at a destination and 
               returns a pointer to it.  If none are available NULL is 
               returned.  Any message that you receive from GetMidiMsg() 
               should be freed with FreeMidiMsg().  See below for an 
               example message reader.

          FreeMidiMsg (msg)
               frees a message received from GetMidiMsg().


     These functions deal with sending messages:

          PutMidiMsg (source,msg)
               places a message at a source for distribution.  Upon 
               return you may recycle you msg buffer since its contents 
               has been copied to anyone who's listening.  This routine 
               assumes that you have constructed a valid MIDI message as 
               described above.  Invalid or undefined messages are 
               ignored, however an unterminated system exclusive message 
               cannot be detected and runs the risk of crashing the 
               machine.

          PutMidiStream (source,fillbuffer,buf,bufsize,cursize)
               converts an unformatted data stream into MIDI messages 
               which are then sent by calling PutMidiMsg().  See the 
               function documentation for proper usage.


     These functions give you information about specific messages:

          MidiMsgType (msg)
               returns an MMF_ flag indicating the type message.  It 
               returns 0 for invalid or undefined messages.

          MidiMsgLength (msg)
               returns the number of bytes in a message.  For 
               non-exclusive messages this is the status byte + data 
               bytes.  For system exclusive messages it is status byte + 
               data bytes + EOX.  0 is returned for invalid or undefined 
               messages.


Some additional notes about messages:

     EOX is not considered a valid message and is only used to terminate 
     system exclusive messages.  It will be ignored if sent with 
     PutMidiMsg()

     Trivial messages are ignored.  Trivial messages are those that 
     contain no useful data.  An example is a system exclusive message 
     that contains no data.

     Note on messages with velocity == 0 are considered note off 
     messages.  MidiMsgType() will return MMF_NOTEOFF rather than 
     MMF_NOTEON for these.

     Controller numbers 122-127 are reserved for MIDI mode changes and 
     are treated as such.  MidiMsgType() will return MMF_MODE rather than 
     MMF_CTRL for these.

     As of this writing MIDI Time Code is not supported due to lack of 
     documentation.  As soon as I get proper specs, I'll add it.


     Here is a code fragment showing the recommended MIDI message receive 
technique:

     domidi(dest)
     struct Dest *dest;
     {
          UBYTE *msg;

          for (;;) {
               Wait (1L << dest->DestPort->mp_SigBit);
               while (msg = GetMidiMsg (dest)) {
                    /* process the message */
                    .
                    .
                    .
                    /* then free it */
                    FreeMidiMsg (msg);
               }
          }
     }

     DO NOT WAIT FOR ACTIVITY LIKE THIS:

          while (!(msg = GetMidiMsg(dest))) ;

     unless you really want your Amiga to lock up.


INNER WORKINGS

     This section is for the more adventurous MIDI programmer.  The 
information here is necessary for authors of patch bay or other route 
managing applications.

MidiBase

     The structure of the library base is defined in "midi/midibase.h".

          struct MidiBase {
               struct Library libnode;
               struct List SourceList, DestList;
               struct SignalSemaphore ListSemaphore;
               struct SignalSemaphore RouteSemaphore;
               BPTR SegList;
               APTR SysBase, DosBase;
          };

     where

          libnode
               is the standard Amiga library node

          SourceList
               is an Exec linked list containing all public MSource nodes.

          DestList
               is an Exec linked list containing all public MDest nodes.

          ListSemaphore
               is a SignalSemaphore for locking the source and 
               destination lists.  This is the semaphore used when you 
               call LockMidiBase() or UnlockMidiBase().  Exclusive access 
               to lists is required when managing or scanning either the 
               source or destination list.  It is not required for 
               message propagation.  It is required for route management 
               only when a public node is involved.

          RouteSemaphore
               is a SignalSemaphore for locking the route system.  The 
               routines LockMRoutes() and UnlockMRoutes() will use this 
               semaphore when implemented.  Exclusive access to the 
               routing system is required for message propagation and 
               route management.  It is not needed for managing or 
               scanning the node lists.  If necessary you may call 
               ObtainSemaphore() (and of course ReleaseSemaphore()) with 
               a pointer to this structure to examine the routes.  Use 
               this with care since it blocks message propagation.

          SegList
               is a BPTR to the segment list for the library.

          SysBase & DosBase
               are the the library's pointers to Exec and Dos.


     These routines are useful for examining the base:

          LockMidiBase()
               Gains exclusive access to the source and destination 
               lists.  Use of this will block anyone else from managing 
               nodes or scanning the lists.  Messages propagation is not 
               blocked, however.  Calls may be nested but each call must 
               be matched with a call to UnlockMidiBase().

          UnlockMidiBase()
               Relinquishes exclusive access to the source and 
               destination lists.


     There currently are no routines for locking the route system.  You 
may however Forbid() or ObtainSemaphore(&MidiBase->RouteSemaphore) to 
lock the routes.  You shouldn't be very likely to need to do this, 
however, and if you do it should only be to read the route lists not to 
modify anything.  A patch bay application should not use this approach to 
keep track of its routes.  Instead it must maintain its own list or 
routes.  As long as everyone observes the rule of modifying only their 
own structures there shouldn't be any trouble.


Resident Nodes

     As noted before there are some nodes that are always present.  They 
are created by the library when it is first loaded.  These nodes are 
attached to built-in tasks (actually processes) that are launched when 
the nodes are routed to.  There are currently only two resident nodes:  
one for receiving from the serial port and one for transmitting to the 
serial port.

     MidiIn   source  Launches a task called MidiIn running at +10 
                      priority when it is first routed to.  It receives 
                      data from the serial port and converts it to MIDI 
                      messages which are posted to its MSource node.  
                      Anyone with destinations routed to this node will 
                      receive MIDI messages from it.

     MidiOut  dest    Launches a task called MidiOut which also runs at 
                      +10 priority.  It is responsible for receiving 
                      messages from it's MDest node and sending them to 
                      the serial port.  Any number of MSource's can be 
                      routed to it without fear of mangled data; messages 
                      are merged properly.  Each message sent to it will 
                      be transmitted to the serial port in the order 
                      received.

     NOTE: The "serial.device" has a hard time receiving MIDI data at 
full speed, even with the SERF_RAD_BOOGIE flag set.  It apparently loses 
a byte or two on larger transfers (>4K).  Perhaps someone knowledgeable 
in these matters might write a streamlined MIDI serial device capable of 
handling full speed MIDI data.  For now, it is strongly recommended that 
you make sure that you get what you expect when reading system exclusive 
messages from MidiIn.  Use whatever error detection methods are 
appropriate for the data being transferred (like dump sizes or checksums).

     Resident nodes can be identified by a node type value (in ln_Type) 
of NT_PERMMSOURCE or NT_PERMMDEST.  Resident nodes have an additional 
MTaskInfo structure attached to them that is pointed to by the UserData 
field in the MSource or MDest structure.  The MTaskInfo structure is 
defined in "midi/midibase.h".

          struct MTaskInfo {
               char *Name;
               WORD Pri;
               void (*Entry)();
               UWORD Stack;
               UWORD Sources;
               struct MNodeInfo *SourceList;
               struct Dests;
               struct MNodeInfo *DestList;
               struct SignalSemaphore Semaphore;
               UWORD UsageCount;
               struct MsgPort *TaskPort;
               BPTR Segment;
          };

     where these fields are defined by the task's code:

          Name
               points to the name of the task.

          Pri
               is the task's priority.

          Entry
               is the start of the task's code.

          Stack
               is the size of stack to allocate for the task.

          Sources
               is the the number of MSource nodes defined for this task.

          SourceList
               points to an array of MNodeInfo structures containing the 
               definition of this task's MSource nodes.

          Dests
               is the the number of MDest nodes defined for this task.

          DestList
               points to an array of MNodeInfo structures containing the 
               definition of this task's MDest nodes.

     and these fields are managed by the library (don't mess with them)

          Semaphore
               is a signal semaphore for locking this MTaskInfo 
               structure.  This is only used when launching or shutting 
               down this task.

          UsageCount
               is the number of accessors to this task.  If it is 
               non-zero the task is running otherwise it is dormant.

          TaskPort
               points to the message port used to communicate with the 
               task.

          Segment
               is a BPTR to a fake segment list necessary for 
               CreateProc().  The segment contains a jump instruction to 
               the startup code for the task.  The task's code is 
               actually part of the library's segment list.  This might 
               be considered making use of undocumented features, but as 
               long as no one tries to UnloadSeg() this segment (and no 
               one should) there shouldn't be any trouble.


     The MNodeInfo structure referred to above is used to define the 
resident source or destination nodes attached to this task.  Tasks are 
not restricted to just one resident node, but that is the current usage.  
This structure is also defined in "midi/midibase.h".

          struct MNodeInfo {
               char *Name;
               struct Image *Image;
               APTR Node;
          };

     where

          Name
               points to the name of the node.  This shouldn't ever be 
               NULL.

          Image
               points to an Intuition Image structure for this node.  
               This may be NULL.

          Node
               points to the node allocated for this MNodeInfo structure 
               so that the task can find it easily.

CONCLUSION

     Hopefully this document has provided you with an understanding of 
the MIDI library and will enable you to make use of its features in your 
own MIDI applications.  Our own MIDI applications have now been 
retrofitted to make use of the library.  I was amazed at how simple a 
task this was and how much code I was able to dispose of.

     At this point, I don't consider the library to be a finished 
product.  It is functional though, and I present it now with the hopes 
that it will be used by other MIDI developers with whose help I would 
like to see this library mature into a standard for the Amiga.  This is 
the sort of thing that can make the Amiga a powerful tool for the 
musician.

     In addition to library revisions, the MIDI tools need to be enhanced.

     First, there needs to a graphics-based Patch Bay application for 
creating and managing routes to public nodes.  Unlike SoundScape I 
decided this should be outside the library so that it need not be present 
all the time.  My vision in this area seems to be limited, however.  What 
I picture is a window with the Images provided by public nodes appearing 
on each side of the window.  The user can drag lines from source to 
destination to create routes and edit a requester to modify them.  
Perhaps patch files could be saved, too.  This really needs some 
creativity.  There is also a risk of having it resemble SoundScape too 
much.

     Next, there should probably be a program to bridge this library to 
SoundScape so that no one complains about incompatibility problems 
between this library and what already exists.  I have a number of gripes 
about SoundScape (part of what prompted me to write the MIDI library in 
the first place) but this is not the place to go into them.  I only 
mention this now because SoundScape does some similar functions and might 
be considered by some to be the standard already.  Also SoundScape does 
have a fairly good sequencer and I'd hate to exclude anyone from using 
the library just because they like SoundScape.

     If you have any comments on any of this (and hopefully you will) 
here is how I can be reached.


     Bill Barton
     1111 El Sur Way
     Sacramento, CA  95864
     (916) 487-9472

     BIX:    peabody
     Plink:  peabody
     Delphi: BBARTON

SHAR_EOF
if test 31122 -ne "`wc -c library.doc`"
then
echo shar: error transmitting library.doc '(should have been 31122 characters)'
fi
echo shar: extracting readme.lib '(1846 characters)'
cat << \SHAR_EOF > readme.lib
			    MIDI UTILITIES v2.0

The MIDI utilities and MIDI library are Copyright (C) 1987, Pregnant
Badger Software.  All rights reserved.	These files may be freely
distributed but not for profit, although they may be included with
commercial products that make use of the MIDI library (see the
developer's Arc file for more information).

     Bill Barton
     1111 El Sur Way
     Sacramento, CA  95864
     (916) 487-9472

     Bix:    peabody
     Plink:  peabody
     Delphi: BBARTON


This is a revised set of my MIDI utilities.  They make use of my new MIDI
packet switching library.  All are functional but some are considered
experimental.  In order to use any of the utilities you must install
midi.library in your LIBS: directory.  For more information regarding the
MIDI library see the other Arc files or contact Pregnant Badger Software.

     midi.library  The MIDI library.  Install it in your LIBS: directory.

     ht 	   Hex Transmit.  Transmits MIDI messages enter on its
		   command line in hex.  Type "ht" for usage.

     mm 	   Midi Monitor.  Displays incoming MIDI messages to the
		   console in one of various ways.  Type "mm ?" for usage.

     r		   This is a simple routing utility.  It is considered an
		   example rather than a finished product.  Its source is
		   included in the examples directory.

     rsx	   Receive System Exclusive.  Receives the next SysEx
		   message and saves it to a named file.  Type "rsx" for
		   usage.

     stat	   Is a general system status utility.	It includes a
		   report about the MIDI library's status.  Type "stat ?"
		   for usage.

     tsx	   Transmit System Exclusive.  Sends a named file.  The
		   file does not need to actually contain system
		   exclusive messages.	The program was originally
		   written as the compliment of rsx.  Type "tsx" for
		   usage.


SHAR_EOF
if test 1846 -ne "`wc -c readme.lib`"
then
echo shar: error transmitting readme.lib '(should have been 1846 characters)'
fi
echo shar: extracting func.doc '(19733 characters)'
cat << \SHAR_EOF > func.doc
TABLE OF CONTENTS

midi.library/CreateMDest
midi.library/CreateMRoute
midi.library/CreateMSource
midi.library/DeleteMDest
midi.library/DeleteMRoute
midi.library/DeleteMSource
midi.library/FindMDest
midi.library/FindMSource
midi.library/FreeMidiMsg
midi.library/GetMidiMsg
midi.library/LockMidiBase
midi.library/MidiMsgLength
midi.library/MidiMsgType
midi.library/ModifyMRoute
midi.library/MRouteDest
midi.library/MRoutePublic
midi.library/MRouteSource
midi.library/PutMidiMsg
midi.library/PutMidiStream
midi.library/UnlockMidiBase
midi.library/CreateMDest

NAME
     CreateMDest -- Create a MIDI destination node

SYNOPSIS
     dest = CreateMDest (name,image)
     d0                  a0   a1
     struct MDest *dest;
     char *name;
     struct Image *image;

FUNCTION
     Creates a new MIDI destination node.  A MsgPort is created and 
     linked into the new MDest that will signal you when this MDest gets 
     a message (see msg routines for more info).  If a name is given, 
     this node will be placed in the library's public destination list 
     (so it can be located with FindMDest()).  If name is NULL a private 
     node is created.  The image supplied can be used by graphics-based 
     patch bay applications and will only be used for public nodes.  
     image may be NULL if no image is to be supplied.  You are 
     responsible for deleting any nodes you create when you are done with 
     them.

INPUTS
     name - pointer to a null-terminated string or NULL
     image - pointer to an Intuition Image structure or NULL

RESULTS
     dest - pointer to the new MDest node or NULL on failure.

SEE ALSO
     DeleteMDest, FindMDest

midi.library/CreateMRoute

NAME
     CreateMRoute -- Create an MRoute

SYNOPSIS
     route = CreateMRoute (source,dest,routeinfo)
     d0                    a0     a1   a2
     struct MRoute *route;
     struct MSource *source;
     struct MDest *dest;
     struct MRouteInfo *routeinfo;

FUNCTION
     Creates and links a new MRoute into a MIDI Source node and a MIDI 
     Dest node.  This routine assumes that both source and dest are 
     private nodes that you created.  To route to public nodes use one of 
     the other MRoute creation routines.  The MRouteInfo structure 
     defines the new connection.  You need not preserve the MRouteInfo 
     structure after calling this routine since it is copied into the 
     newly created MRoute structure.  You are responsible for deleting 
     any MRoute's you create.

INPUT
     source - pointer to an MSource node
     dest - pointer to an MDest node
     routeinfo - pointer to an MRouteInfo structure defining this MRoute

RESULTS
     route - a pointer to a new MRoute structure or NULL on failure.

SEE ALSO
     MRouteSource, MRouteDest, MRoutePublic, ModifyMRoute, DeleteMRoute

midi.library/CreateMSource

NAME
     CreateMSource -- Create a MIDI source node

SYNOPSIS
     source = CreateMSource (name,image)
     d0                      a0   a1
     struct MSource *source;
     char *name;
     struct Image *image;

FUNCTION
     Creates a new MIDI source node.  If a name is given, this node will 
     be placed in the library's public source list (so it can be located 
     with FindMSource()).  If name is NULL a private node is created.  
     The image supplied can be used by graphics-based patch bay 
     applications and will only be used for public nodes.  image may be 
     NULL if no image is to be supplied.  You are responsible for 
     deleting any nodes you create when you are done with them.

INPUTS
     name - pointer to a null-terminated string or NULL
     image - pointer to an Intuition Image structure or NULL

RESULTS
     source - pointer to the new MSource node or NULL on failure.

SEE ALSO
     DeleteMSource, FindMSource

midi.library/DeleteMDest

NAME
     DeleteMDest -- Delete a MIDI destination node

SYNOPSIS
     DeleteMDest (dest)
                  a0
     struct MDest *dest;

FUNCTION
     Removes and frees an MDest created by CreateMDest().  Any MRoute's 
     connected to this MDest will be unlinked.  Any messages waiting at 
     this MDest will be freed.  You should only delete nodes that you 
     created.

INPUTS
     dest - pointer to the MDest node to delete

RESULTS
     none

SEE ALSO
     CreateMDest, FindMDest

midi.library/DeleteMRoute

NAME
     DeleteMRoute -- Delete an MRoute

SYNOPSIS
     DeleteMRoute (route)
                   a0
     struct MRoute *route;

FUNCTION
     Unlinks and frees a route previously created with one of the routing 
     functions.  You should only delete routes that you created.  You 
     will still need to do this even if both the source and dest have 
     been deleted in order to free up the memory allocated to the route.

INPUTS
     route - pointer to the MRoute to delete

RESULTS
     none

SEE ALSO
     CreateMRoute, MRouteSource, MRouteDest, MRoutePublic, ModifyMRoute

midi.library/DeleteMSource

NAME
     DeleteMSource -- Delete a MIDI source node

SYNOPSIS
     DeleteMSource (source)
                    a0
     struct MSource *source;

FUNCTION
     Removes and frees an MSource created by CreateMSource().  Any 
     MRoute's connected to this MSource will be unlinked.  You should 
     only delete nodes that you created.

INPUTS
     source - pointer to the MSource node to delete

RESULTS
     none

SEE ALSO
     CreateMSource, FindMSource

midi.library/FindMDest

NAME
     FindMDest -- Find a public MIDI destination node

SYNOPSIS
     dest = FindMDest (name)
     d0                a0
     struct MDest *dest;
     char *name;

FUNCTION
     Finds a public MIDI destination node by name if it exists.  In order 
     to ensure that this node remains valid you should call 
     LockMidiBase() prior to calling this routine.

INPUTS
     name - pointer to the null-terminated name to find

RESULTS
     dest - pointer to the requested MDest node or NULL if not found.

SEE ALSO
     CreateMDest, DeleteMDest, LockMidiBase, UnlockMidiBase

midi.library/FindMSource

NAME
     FindMSource -- Find a public MIDI source node

SYNOPSIS
     source = FindMSource (name)
     d0                    a0
     struct MSource *source;
     char *name;

FUNCTION
     Finds a public MIDI source node by name if it exists.  In order to 
     ensure that this node remains valid you should call LockMidiBase() 
     prior to calling this routine.

INPUTS
     name - pointer to the null-terminated name to find

RESULTS
     source - pointer to the requested MSource node or NULL if not found.

SEE ALSO
     CreateMSource, DeleteMSource, LockMidiBase, UnlockMidiBase

midi.library/FreeMidiMsg

NAME
     FreeMidiMsg -- Free a MIDI message returned by GetMidiMsg

SYNOPSIS
     FreeMidiMsg (msg)
                  a0
     UBYTE *msg;

FUNCTION
     Frees a message returned by GetMidiMsg().

INPUTS
     msg - pointer to a UBYTE array containing one MIDI message

RESULTS
     none

SEE ALSO
     GetMidiMsg()

midi.library/GetMidiMsg

NAME
     GetMidiMsg -- Get the next MIDI message from an MDest

SYNOPSIS
     msg = GetMidiMsg (dest)
     d0                a0
     UBYTE *msg;
     struct MDest *dest;

FUNCTION
     Returns the next message received at a MIDI destination or NULL if 
     no more messages are present.  This is the preferred method of 
     receiving MIDI messages from an MDest since it strips off and frees 
     the packet that carried this message to the MDest's MsgPort 
     (dest->DestPort).  This routine will not wait around for the next 
     message since you might want to do something else between messages.  
     If you want to wait, just Wait for the signal allocated to the 
     MDest's MsgPort:

          Wait (1L << dest->DestPort->mp_SigBit);

     Once you have dealt with the messages you have received you should 
     dispose of them by calling FreeMidiMsg().  Unlike Intuition, 
     midi.library is not halted until you free these messages so you can 
     hang on to them as long as you like.  Just free them when you are 
     done with them.

     Be aware that the more messages you keep without freeing the more 
     fragmented the Amiga's memory will become.  If you plan to keep a 
     large number of messages you are probably better off allocating a 
     buffer and copying the messages to it.

INPUTS
     dest - pointer to the MDest node to receive from

RESULTS
     msg - pointer to a UBYTE array containing one MIDI message or NULL
             if there are no more messages at this MDest

SEE ALSO
     FreeMidiMsg, MidiMsgType, MidiMsgLength, PutMidiMsg

midi.library/LockMidiBase

NAME
     LockMidiBase -- lock the lists in the library base

SYNOPSIS
     LockMidiBase()

FUNCTION
     Gains exclusive access to the Source and Dest lists in the library 
     base.  This will block any other tasks attempts to Create, Delete, 
     or Find MSource and MDest nodes.  Use this if you wish to examine a 
     public node.  The route linkages within the nodes are not protected 
     by this.  Currently you need to Forbid() to prevent them from 
     changing.

     Calls to LockMidiBase() may be nested, but each call must be matched 
     with a call to UnlockMidiBase().

INPUTS
     none

RESULTS
     none

SEE ALSO
     UnlockMidiBase

midi.library/MidiMsgLength

NAME
     MidiMsgLength -- Determine the length of a MIDI message

SYNOPSIS
     length = MidiMsgLength(msg)
     d0                     a0
     ULONG length;
     UBYTE *msg;

FUNCTION
     Returns the length in bytes of a MIDI message.  The message length 
     includes the status byte.  For system exclusive messages the EOX 
     status byte at the end is also included.

INPUTS
     msg - pointer to a UBYTE array containing one MIDI message

RESULTS
     length - length of the message in bytes.  For valid messages this
                will be at least 1.  0 is returned for invalid messages.

SEE ALSO
     MidiMsgType

midi.library/MidiMsgType

NAME
     MidiMsgType -- Determine the type of a MIDI message

SYNOPSIS
     type = MidiMsgType(msg)
     d0                 a0
     UWORD type;
     UBYTE *msg;

FUNCTION
     Returns the type a MIDI message.  The flags are defined in 
     midi/midi.h (or midi/midi.i) and are the same ones used in 
     MRouteInfo.MsgFlags.  Other than the obvious, some special message 
     handling takes place:

          Controller changes for ctrl # 122 - 127 return MMF_MODE.

          Note On messages with velocity == 0 return MMF_NOTEOFF.

          EOX and all invalid messages return 0 (an EOX by itself is not 
          considered a valid message)

INPUTS
     msg - pointer to a UBYTE array containing one MIDI message

RESULTS
     type - message type

SEE ALSO
     MidiMsgLength

midi.library/ModifyMRoute

NAME
     ModifyMRoute -- Modify an existing an MRoute

SYNOPSIS
     ModifyMRoute (route,newrouteinfo)
                   a0    a1
     struct MRoute *route;
     struct MRouteInfo *newrouteinfo;

FUNCTION
     Modifies the MRouteInfo structure in an existing route.  Any 
     messages already delivered to this MRoute's MDest, whether received 
     or not, are not affected.  As with CreateMRoute, the supplied 
     MRouteInfo structure need not be kept after calling this routine:  
     it is merely a template that is copied to the MRoute.

INPUT
     route - pointer to an MRoute to modify
     routeinfo - pointer to the new MRouteInfo for this MRoute

RESULTS
     none

SEE ALSO
     CreateMRoute, MRouteSource, MRouteDest, MRoutePublic, DeleteMRoute

midi.library/MRouteDest

NAME
     MRouteDest -- Create an MRoute from a public MSource to a private 
     MDest

SYNOPSIS
     route = MRouteDest (sourcename,dest,routeinfo)
     d0                  a0         a1   a2
     struct MRoute *route;
     char *sourcename;
     struct MDest *dest;
     struct MRouteInfo *routeinfo;

FUNCTION
     Routes an MDest to a public MSource.  This is shorthand for:

          LockMidiBase();
          if (source = FindMSource(sourcename))
               route = CreateMRoute(source,dest,routeinfo);
          UnlockMidiBase();

INPUT
     sourcename - pointer to null-terminated name of a public MSource
     dest - pointer to an MDest node
     routeinfo - pointer to an MRouteInfo structure defining this MRoute

RESULTS
     route - a pointer to a new MRoute structure or NULL on failure.

SEE ALSO
     CreateMRoute, MRouteSource, MRoutePublic, ModifyMRoute, DeleteMRoute

midi.library/MRoutePublic

NAME
     MRoutePublic -- Create an MRoute from a public MSource to a public 
MDest

SYNOPSIS
     route = MRoutePublic (sourcename,destname,routeinfo)
     d0                    a0         a1       a2
     struct MRoute *route;
     char *sourcename;
     char *destname;
     struct MRouteInfo *routeinfo;

FUNCTION
     Routes a public MSource to a public MDest.  This is shorthand for:

          LockMidiBase();
          if ( (source = FindMSource(sourcename) &&
               (dest = FindMDest(destname)) )
               route = CreateMRoute(source,dest,routeinfo);
          UnlockMidiBase();

INPUT
     sourcename - pointer to null-terminated name of a public MSource
     destname - pointer to null-terminated name of a public MDest
     routeinfo - pointer to an MRouteInfo structure defining this MRoute

RESULTS
     route - a pointer to a new MRoute structure or NULL on failure.

SEE ALSO
     CreateMRoute, MRouteSource, MRouteDest, ModifyMRoute, DeleteMRoute

midi.library/MRouteSource

NAME
     MRouteSource -- Create an MRoute from a private MSource to a public 
     MDest

SYNOPSIS
     route = MRouteSource (source,destname,routeinfo)
     d0                    a0     a1       a2
     struct MRoute *route;
     struct MSource *source;
     char *destname;
     struct MRouteInfo *routeinfo;

FUNCTION
     Routes an MSource to a public MDest.  This is shorthand for:

          LockMidiBase();
          if (dest = FindMDest(destname))
               route = CreateMRoute(source,dest,routeinfo);
          UnlockMidiBase();

INPUT
     source - pointer to an MSource node
     destname - pointer to null-terminated name of a public MDest
     routeinfo - pointer to an MRouteInfo structure defining this MRoute

RESULTS
     route - a pointer to a new MRoute structure or NULL on failure.

SEE ALSO
     CreateMRoute, MRouteDest, MRoutePublic, ModifyMRoute, DeleteMRoute

midi.library/PutMidiMsg

NAME
     PutMidiMsg -- Place a MIDI message at an MSource

SYNOPSIS
     PutMidiMsg (source,msg)
                 a0     a1
     struct MSource *source;
     UBYTE *msg;

FUNCTION
     Sends a MIDI message off to an MSource to be distributed to any 
     MDest's that are routed to this source.  Once sent the message 
     buffer can be recycled since copies are made of it as necessary.  
     This routine assumes that it is getting a valid message.  If you 
     wish to send data that is not necessarily valid (and don't wish to 
     process it yourself) or your message buffer contains more than one 
     message you should consider using PutMidiStream() instead.

INPUTS
     source - pointer to the MSource node to place the message at
     msg - pointer to a UBYTE array containing one MIDI message

RESULTS
     none

SEE ALSO
     PutMidiStream, MidiMsgLength, MidiMsgType, GetMidiMsg

midi.library/PutMidiStream

NAME
     PutMidiStream -- Send an unformatted stream

SYNOPSIS
     PutMidiStream (source,fillbuffer,buf,bufsize,cursize)
                    a0     a1         a2  d0      d1
     struct MSource *source;
     ULONG (*fillbuffer)();
     UBYTE *buf;
     ULONG bufsize,cursize;

FUNCTION
     Converts an unformatted stream into MIDI messages and calls 
     PutMidiMsg() to the specified MSource for each one.

     The user supplied fillbuffer routine is called to place data in the 
     user supplied buffer.  It can be written in C, assembly or whatever 
     as long as it abides by the rules:

          On entry the following registers will be set:

               A0 - points to the user supplied buffer
               D0 - indicates the size of user supplied buffer
               (these are the same values the user supplied in the 
               function call)

          On return D0 should be set to the number of bytes placed in the 
          buffer.  A value of 0 indicates the end of the stream has been 
          reached and that PutMidiStream() should return.

          Any registers that the PutMidiStream() needs are preserved 
          before calling the user's fillbuffer routine so fillbuffer need 
          not preserve any registers.

     In C the routine should be declared something like:

          long fillbuffer()
          {
               long len;

               geta4();            /* necessary for aztec C small data */
                 .
                 .                 /* whatever it takes to fill up */
                 .                 /* buffer and set len */
                 .
               return len;         /* sets D0 accordingly */
          }

     There are two basic ways of using calling PutMidiStream:

     1.  The stream length is unknown or just simply too large to put 
         into a single buffer (like transferring from a file to an 
         MSource).

          Assuming that the buffer is initially empty you would use a 
          call similar to:

          PutMidiStream (source,fillmybuf,mybuf,(long)sizeof mybuf,0L);

          fillmybuf() will be called immediately to put some data into 
          the buffer (mybuf).  Processing will continue until fillmybuf() 
          indicates that it's time to quit by returning a 0.

     2.  The stream length is known and it is small enough to place in 
         the buffer.

          PutMidiStream (source,NULL,mybuf,(long)sizeof mybuf,
                                           (long)sizeof mybuf);

          The NULL fillbuffer routine indicates that the buffer contains 
          all it's ever going to.  The current size is set to the size of 
          the buffer to indicate that the buffer is full of data to be 
          processed.  Once the buffer is exhausted, PutMidiStream will 
          return.

INPUTS
     source - pointer to the MSource to send messages to
     fillbuffer - user supplied routine to fill the user supplied buffer
                    can be NULL if no buffer filling is to be done
     buf - user supplied buffer
     bufsize - size of user supplied buffer
     cursize - amount of data currently in the buffer upon entry to this
                 function.  If non-zero this data will be processed before
                 trying to call (*fillbuffer)()

RESULTS
     none

SEE ALSO
     PutMidiMsg

midi.library/UnlockMidiBase

NAME
     UnlockMidiBase -- unlock the lists in the library base

SYNOPSIS
     UnlockMidiBase()

FUNCTION
     Releases exclusive access to the Source and Dest lists in the 
     library base.  Each call to this must be matched with a call to 
     LockMidiBase().

INPUTS
     none

RESULTS
     none

SEE ALSO
     LockMidiBase

SHAR_EOF
if test 19733 -ne "`wc -c func.doc`"
then
echo shar: error transmitting func.doc '(should have been 19733 characters)'
fi
#	End of shell archive
exit 0

ain@j.cc.purdue.edu (Patrick White) (03/25/88)

Program Name:	midi library  (part 1 of 1)
Submitted By:	Pete Yadlowsky <pmy@vivaldi.acc.virginia.edu>
Summary:	This is a midi library
Poster Boy:  Pat White  (ain@j.cc.purdue.edu)
Untested.

NOTES:
   Not much we could do to test this, so we didn't bother.
   I reshar'ed it to separate docs, etc.
   There are some example code, posted to the sources group (along with
some source :-)


-- Pat White   (co-moderator comp.sources/binaries.amiga)
UUCP: j.cc.purdue.edu!ain  BITNET: PATWHITE@PURCCVM   PHONE: (317) 743-8421
U.S.  Mail:  320 Brown St. apt. 406,    West Lafayette, IN 47906

========================================

#	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:
#	midi.lib.lat.uu
#	midi.lib.mnx.uu
#	midi.library.uu
#	mm.uu
#	stat.uu
# This archive created: Sun Mar 20 16:49:31 1988
# By:	Patrick White (PUCC Land, USA)
echo shar: extracting midi.lib.lat.uu '(3360 characters)'
cat << \SHAR_EOF > midi.lib.lat.uu

begin 600 midi.lib.lat
M```#YP````-L;V-K8F%S92YO``````/H`````71E>'0```/I````!"\.+'D`1
M````3J[_XBQ?3G4```/O@0```U]-:61I0F%S90````````$````$`0``!%],S
M;V-K36ED:4)A<V4``````````````````_(```/G`````FUO9')T92YO```#'
MZ`````%T97AT```#Z0````9,[P,```0O#BQY`````$ZN_ZPL7TYU``````/OK
M@0```U]-:61I0F%S90````````$````*`0``!%]-;V1I9GE-4F]U=&4`````4
M`````````````_(```/G`````FUS9VQE;BYO```#Z`````%T97AT```#Z0``A
M``4@;P`$+PXL>0````!.KO]V+%].=0```^^!```#7TUI9&E"87-E````````,
M`0````@!```$7TUI9&E-<V=,96YG=&@````````````````#\@```^<````#;
M;7-G='EP92YO```````#Z`````%T97AT```#Z0````4@;P`$+PXL>0````!.+
MKO]\+%].=0```^^!```#7TUI9&E"87-E`````````0````@!```#7TUI9&E-&
M<V=4>7!E``````````````/R```#YP````)P=71S='(N;P```^@````!=&5XI
M=````^D````(+PI,[P<```A,[P`#`!0O#BQY`````$ZN_W`L7R1?3G4```/O-
M@0```U]-:61I0F%S90````````$````2`0``!%]0=71-:61I4W1R96%M`````
M`````````````_(```/G`````G)T961S="YO```#Z`````%T97AT```#Z0``Q
M``<O"DSO!P``""\.+'D`````3J[_FBQ?)%].=0`````#[X$```-?36ED:4)A-
M<V4````````!````#`$```-?35)O=71E1&5S=````````````````_(```/G3
M`````G)T97!U8BYO```#Z`````%T97AT```#Z0````<O"DSO!P``""\.+'D`Z
M````3J[_E"Q?)%].=0`````#[X$```-?36ED:4)A<V4````````!````#`$`!
M``1?35)O=71E4'5B;&EC``````````````````/R```#YP````)R=&5S<F,N`
M;P```^@````!=&5X=````^D````'+PI,[P<```@O#BQY`````$ZN_Z`L7R1?A
M3G4``````^^!```#7TUI9&E"87-E`````````0````P!```$7TU2;W5T95-OE
M=7)C90`````````````````#\@```^<````#=6YL;V-K8F$N;P`````#Z```H
M``%T97AT```#Z0````0O#BQY`````$ZN_]PL7TYU```#[X$```-?36ED:4)AX
M<V4````````!````!`$```1?56YL;V-K36ED:4)A<V4```````````````/R@
M```#YP````-F:6YD<W)C+F\```````/H`````71E>'0```/I````!2!O``0O7
M#BQY`````$ZN_\HL7TYU```#[X$```-?36ED:4)A<V4````````!````"`$`C
M``-?1FEN9$U3;W5R8V4``````````````_(```/G`````V9I;F1D<W0N;P``,
M`````^@````!=&5X=````^D````%(&\`!"\.+'D`````3J[_N"Q?3G4```/O*
M@0```U]-:61I0F%S90````````$````(`0```U]&:6YD341E<W0`````````K
M```````#\@```^<````"8W)E9'-T+F\```/H`````71E>'0```/I````!B!OU
M``0B;P`(+PXL>0````!.KO_$+%].=0```^^!```#7TUI9&E"87-E````````?
M`0````P!```#7T-R96%T94U$97-T``````````````/R```#YP````)C<F5RN
M=&4N;P```^@````!=&5X=````^D````'+PHO#DSO!P``#"QY`````$ZN_[(L<
M7R1?3G4``````^^!```#7TUI9&E"87-E`````````0````P!```$7T-R96%T8
M94U2;W5T90`````````````````#\@```^<````"8W)E<W)C+F\```/H````L
M`71E>'0```/I````!DSO`P``!"\.+'D`````3J[_UBQ?3G4``````^^!```#Q
M7TUI9&E"87-E`````````0````H!```$7T-R96%T94U3;W5R8V4`````````>
M```````#\@```^<````"9&5L9'-T+F\```/H`````71E>'0```/I````!2!OO
M``0O#BQY`````$ZN_[XL7TYU```#[X$```-?36ED:4)A<V4````````!````!
M"`$```-?1&5L971E341E<W0``````````````_(```/G`````F1E;')T92YO9
M```#Z`````%T97AT```#Z0````4@;P`$+PXL>0````!.KO^F+%].=0```^^!Y
M```#7TUI9&E"87-E`````````0````@!```$7T1E;&5T94U2;W5T90``````\
M```````````#\@```^<````"9&5L<W)C+F\```/H`````71E>'0```/I````8
M!2!O``0O#BQY`````$ZN_]`L7TYU```#[X$```-?36ED:4)A<V4````````!G
M````"`$```1?1&5L971E35-O=7)C90````````````````/R```#YP````-F%
M<F5E;7-G+F\```````/H`````71E>'0```/I````!DSO`0``!"\.+'D`````E
M3J[_@BQ?3G4``````^^!```#7TUI9&E"87-E`````````0````H!```#7T9R$
M965-:61I37-G``````````````/R```#YP````)G971M<V<N;P```^@````!E
M=&5X=````^D````&3.\!```$+PXL>0````!.KO^.+%].=0`````#[X$```-?%
M36ED:4)A<V4````````!````"@$```-?1V5T36ED:4US9P``````````````V
M`_(```/G`````G!U=&US9RYO```#Z`````%T97AT```#Z0````9,[P,```0OR
M#BQY`````$ZN_X@L7TYU``````/O@0```U]-:61I0F%S90````````$````*B
<`0```U]0=71-:61I37-G```````````````#\F1I(
``
end
size 2368
SHAR_EOF
if test 3360 -ne "`wc -c midi.lib.lat.uu`"
then
echo shar: error transmitting midi.lib.lat.uu '(should have been 3360 characters)'
fi
echo shar: extracting midi.lib.mnx.uu '(6486 characters)'
cat << \SHAR_EOF > midi.lib.mnx.uu

begin 600 midi.lib.mnx
M[&(````"7T-R96%T94U$97-T`!D"7T-R96%T94U2;W5T90`U`E]#<F5A=&5-!
M4V]U<F-E`$\"7T1E;&5T94U$97-T`&@"7T1E;&5T94U2;W5T90"!`E]$96QEE
M=&5-4V]U<F-E`)L"7T9I;F1-1&5S=`"S`E]&:6YD35-O=7)C90#,`E]&<F5ES
M36ED:4US9P#E`E]'971-:61I37-G`/T"7TQO8VM-:61I0F%S90`5`U]-;V1I?
M9GE-4F]U=&4`+P-?36ED:4US9TQE;F=T:`!)`U]-:61I37-G5'EP90!B`U]0C
M=71-:61I37-G`'L#7U!U=$UI9&E3=')E86T`F0-?35)O=71E1&5S=`"T`U]-B
M4F]U=&50=6)L:6,`T`-?35)O=71E4V]U<F-E`.P#7U5N;&]C:TUI9&E"87-EE
M``4$7TQ63TQO8VM-:61I0F%S90`%!%],5D]5;FQO8VM-:61I0F%S90`%!%],7
M5D]#<F5A=&5-4V]U<F-E``4$7TQ63T1E;&5T94U3;W5R8V4`!01?3%9/1FEN7
M9$U3;W5R8V4`!01?3%9/0W)E871E341E<W0`!01?3%9/1&5L971E341E<W0`U
M!01?3%9/1FEN9$U$97-T``4$7TQ63T-R96%T94U2;W5T90`%!%],5D]-;V1IB
M9GE-4F]U=&4`!01?3%9/1&5L971E35)O=71E``4$7TQ63TU2;W5T95-O=7)C$
M90`%!%],5D]-4F]U=&5$97-T``4$7TQ63TU2;W5T95!U8FQI8P`%!%],5D]'>
M971-:61I37-G``4$7TQ63U!U=$UI9&E-<V<`!01?3%9/1G)E94UI9&E-<V<`$
M!01?3%9/36ED:4US9U1Y<&4`!01?3%9/36ED:4US9TQE;F=T:``%!%],5D]0S
M=71-:61I4W1R96%M````````````````````````````````````````````8
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``````````````````````````````!J9V-R961S=`````X``````!X``P!16
M````40!DP``'"```7TUI9&E"87-E``<(``!?3%9/0W)E871E341E<W0``@@`[
M`%]#<F5A=&5-1&5S=``73.\#```$+&W0`G``$4[N<0``:F=C<F5R=&4````4L
M```````>``,`4P```%,`<,``!P@``%]-:61I0F%S90`'"```7TQ63T-R96%TQ
M94U2;W5T90`""```7T-R96%T94U2;W5T90`9+PI,[P<```@L;=`"<``13JYQ/
M`!,D7TYU`````&IG8W)E<W)C````#@``````'@`#`%4```!5`&C```<(``!?;
M36ED:4)A<V4`!P@``%],5D]#<F5A=&5-4V]U<F-E``((``!?0W)E871E35-O[
M=7)C90`73.\#```$+&W0`G``$4[N<0``:F=D96QD<W0````,```````>``,`?
M40```%$`9,``!P@``%]-:61I0F%S90`'"```7TQ63T1E;&5T94U$97-T``((+
M``!?1&5L971E341E<W0`%2!O``0L;=`"<``13NYQ`````&IG9&5L<G1E````A
M#```````'@`#`%,```!3`&3```<(``!?36ED:4)A<V4`!P@``%],5D]$96QE\
M=&5-4F]U=&4``@@``%]$96QE=&5-4F]U=&4`%2!O``0L;=`"<``13NYQ``!JX
M9V1E;'-R8P````P``````!X``P!5````50!HP``'"```7TUI9&E"87-E``<(>
M``!?3%9/1&5L971E35-O=7)C90`""```7T1E;&5T94U3;W5R8V4`%2!O``0LO
M;=`"<``13NYQ`````&IG9FEN9&1S=```#```````'@`#`$T```!-`&#```<(@
M``!?36ED:4)A<V4`!P@``%],5D]&:6YD341E<W0``@@``%]&:6YD341E<W0`A
M%2!O``0L;=`"<``13NYQ`````&IG9FEN9'-R8P``#```````'@`#`%$```!1*
M`&3```<(``!?36ED:4)A<V4`!P@``%],5D]&:6YD35-O=7)C90`""```7T9I&
M;F1-4V]U<F-E`!4@;P`$+&W0`G``$4[N<0````!J9V9R965M<V<```P`````7
M`!X``P!1````40!DP``'"```7TUI9&E"87-E``<(``!?3%9/1G)E94UI9&E-$
M<V<``@@``%]&<F5E36ED:4US9P`5(&\`!"QMT`)P`!%.[G$`````:F=G971MN
M<V<````,```````>``,`3P```$\`8,``!P@``%]-:61I0F%S90`'"```7TQ6!
M3T=E=$UI9&E-<V<``@@``%]'971-:61I37-G`!4@;P`$+&W0`G``$4[N<0``-
M:F=L;V-K8F%S90`(```````>``,`4P```%,`8,``!P@``%]-:61I0F%S90`'W
M"```7TQ63TQO8VM-:61I0F%S90`""```7TQO8VM-:61I0F%S90`1+&W0`G``[
M$4[N<0``:F=M;V1R=&4````.```````>``,`4P```%,`:,``!P@``%]-:61I(
M0F%S90`'"```7TQ63TUO9&EF>4U2;W5T90`""```7TUO9&EF>4U2;W5T90`7B
M3.\#```$+&W0`G``$4[N<0````!J9VUS9VQE;@````P``````!X``P!5````T
M50!HP``'"```7TUI9&E"87-E``<(``!?3%9/36ED:4US9TQE;F=T:``""```>
M7TUI9&E-<V=,96YG=&@`%2!O``0L;=`"<``13NYQ`````&IG;7-G='EP90``&
M#```````'@`#`%$```!1`&3```<(``!?36ED:4)A<V4`!P@``%],5D]-:61I!
M37-G5'EP90`""```7TUI9&E-<V=4>7!E`!4@;P`$+&W0`G``$4[N<0````!JI
M9W!U=&US9P````X``````!X``P!/````3P!DP``'"```7TUI9&E"87-E``<(S
M``!?3%9/4'5T36ED:4US9P`""```7U!U=$UI9&E-<V<`%TSO`P``!"QMT`)PS
M`!%.[G$`````:F=P=71S='(````:```````>``,`50```%4`>,``!P@``%]-9
M:61I0F%S90`'"```7TQ63U!U=$UI9&E3=')E86T``@@``%]0=71-:61I4W1R6
M96%M`!\O"DSO!P``"$SO``,`%"QMT`)P`!%.KG$`$R1?3G4`````:F=R=&5D9
M<W0````4```````>``,`3P```$\`;,``!P@``%]-:61I0F%S90`'"```7TQ6B
M3TU2;W5T941E<W0``@@``%]-4F]U=&5$97-T`!DO"DSO!P``""QMT`)P`!%.F
MKG$`$R1?3G4`````:F=R=&5P=6(````4```````>``,`4P```%,`<,``!P@`U
M`%]-:61I0F%S90`'"```7TQ63TU2;W5T95!U8FQI8P`""```7TU2;W5T95!U!
M8FQI8P`9+PI,[P<```@L;=`"<``13JYQ`!,D7TYU`````&IG<G1E<W)C````,
M%```````'@`#`%,```!3`'#```<(``!?36ED:4)A<V4`!P@``%],5D]-4F]U9
M=&53;W5R8V4``@@``%]-4F]U=&53;W5R8V4`&2\*3.\'```(+&W0`G``$4ZN$
M<0`3)%].=0````!J9W5N;&]C:V)A``@``````!X``P!7````5P!DP``'"```T
M7TUI9&E"87-E``<(``!?3%9/56YL;V-K36ED:4)A<V4``@@``%]5;FQO8VM-(
M:61I0F%S90`1+&W0`G``$4[N<0``:F=M:61I;'9O```````````>`!0!X@``U
M`>(!Y,```1C_XO__7TQ63TQO8VM-:61I0F%S90`!&/_<__]?3%9/56YL;V-K%
M36ED:4)A<V4``1C_UO__7TQ63T-R96%T94U3;W5R8V4``1C_T/__7TQ63T1EK
M;&5T94U3;W5R8V4``1C_RO__7TQ63T9I;F1-4V]U<F-E``$8_\3__U],5D]#$
M<F5A=&5-1&5S=``!&/^^__]?3%9/1&5L971E341E<W0``1C_N/__7TQ63T9I/
M;F1-1&5S=``!&/^R__]?3%9/0W)E871E35)O=71E``$8_ZS__U],5D]-;V1I2
M9GE-4F]U=&4``1C_IO__7TQ63T1E;&5T94U2;W5T90`!&/^@__]?3%9/35)O*
M=71E4V]U<F-E``$8_YK__U],5D]-4F]U=&5$97-T``$8_Y3__U],5D]-4F]UH
M=&50=6)L:6,``1C_CO__7TQ63T=E=$UI9&E-<V<``1C_B/__7TQ63U!U=$UI3
M9&E-<V<``1C_@O__7TQ63T9R965-:61I37-G``$8_WS__U],5D]-:61I37-G4
M5'EP90`!&/]V__]?3%9/36ED:4US9TQE;F=T:``!&/]P__]?3%9/4'5T36EDS
*:5-T<F5A;0```/]?S
``
end
size 4600
SHAR_EOF
if test 6486 -ne "`wc -c midi.lib.mnx.uu`"
then
echo shar: error transmitting midi.lib.mnx.uu '(should have been 6486 characters)'
fi
echo shar: extracting midi.library.uu '(10069 characters)'
cat << \SHAR_EOF > midi.library.uu

begin 600 midi.library
M```#\P`````````#``````````(```9U````/0````$```/I```&=7``3G5*8
M_`````0```)J@`$)`````!X````K````E&UI9&DN;&EB<F%R>0!-:61I('!A-
M8VME="!S=VET8VAI;F<@;&EB<F%R>2`Q+C(@*#`S($IU;"`Q.3@W*0T*0V]PN
M>7)I9VAT(#$Y.#<L(%!R96=N86YT($)A9&=E<B!3;V9T=V%R90T*`&1O<RYLB
M:6)R87)Y``````"F````I````0@```$T```!O````=@```'\```"2````FH`:
M``*"```"F@```Q0```-V```#I@``!$(```34```%-```!?8```8F```&H@``_
M!N0```<F```-J```##P```W.```-Z```#CX```=X_____^````@)`,````H`F
M```>X```#@8`T```%``!T```%@`"P```&````"L`````+PTJ0"M.`)XK2`":L
M<"%#^O]#3J[]V"M``*)F&DCG`08N/``#@`<L>``$3J[_E$S?8(!P`&!.0>T`F
M/DZN_=)![0!L3J[]TD'M`"(@B%B00J@`!"%(``A![0`P((A8D$*H``0A2``(Z
M80`,Z$I`9A!A``"H(FT`HDZN_F)P`&`&80`/J"`-*E].=4CG``8J3BQM`)X(^
MK0`#``Y2;0`@(`U,WV``3G5(YP`&*DXL;0"><`!3;0`@9@P(+0`#``YG!"Q-H
M809,WV``3G5(YR`F*DXL;0">2FT`(&8N83Y*0&<H(DU.KO\$(FT`HDZN_F(D;
M+0":<``B33`M`!"2P-!M`!).KO\N(`)@"`CM``,`#G``3-]D!$YU<`!.=6$`'
M#/IP`$'M`"*QZ``(9@Q![0`PL>@`"&8"<`%.=4CG``8J3BQM`)Y![0`^3J[]]
MS$S?8`!.=4CG``8J3BQM`)Y![0`^3J[]QDS?8`!.=4CG``8J3BQM`)X0/``@'
M809,WV``3G5(YR`@%`!(YP#`<"(B/``!``%.KO\Z3-\#`$J`9T`D0"5(``H5=
M0@`()4D`#D'J`!(@B%B00J@`!"%(``A*J@`*9QI![0`^3J[]S")*0>T`(DZN:
M_PI![0`^3J[]QB`*3-\$!$YU2.<`!BI.+&T`GF$&3-]@`$YU+PHD2$JJ``IGW
M%D'M`#Y.KOW,(DI.KO\$0>T`/DZN_<9![0!L3J[]S$'J`!(B$")!(A%G"")I[
M``A"D6#R0>T`;$ZN_<8B2G`B3J[_+B1?3G5(YP`F*DXL;0">)$A![0`^3J[](
MS$'M`"(B2DZN_NPD0$'M`#Y.KOW&(`I,WV0`3G5(YP`F*DXL;0">2.<`P&$`-
M#2!*@$S?`P!G%"1`$#P`(F$22H!F"")*80`-9'``3-]D`$YU2.<@$!0`2.<`_
MP'`F(CP``0`!3J[_.DS?`P!*@&=$)D`G2``*%T(`""=)``Y!ZP`2((A8D$*H$
M``0A2``()TH`'DJK``IG&D'M`#Y.KOW,(DM![0`P3J[_"D'M`#Y.KOW&(`M,G
MWP@$3G5(YP`F*DXL;0">)$AA,LM.($IA``E22H!G""!`80`);F#NRTXB:@`>R
M80`,R")*85I,WV0`3G4O"&$&(E]A3$YU+PHD2$JJ``IG%D'M`#Y.KOW,(DI.(
MKO\$0>T`/DZN_<9![0!L3J[]S$'J`!(B$")!(A%G"B)I``A"J0`$8/!![0!L=
M3J[]QB1?3G5P)DZN_RY.=4CG`"8J3BQM`)XD2$'M`#Y.KOW,0>T`,")*3J[^L
M["1`0>T`/DZN_<8@"DS?9`!.=4CG``8J3BQM`)Y![0!L3J[]S$S?8`!.=4CGW
M``8J3BQM`)Y![0!L3J[]QDS?8`!.=4CG``XJ3BQM`)Y(YP#`<"XB/``!``%.#
MKO\Z3-\#`$J`9P``FBA`*(@I20`$($I#[``@<`Y.KOV0(%0,*``A``AF#"!HY
M`!YA``I@2D!G*B!L``0,*``C``AF*B!H`")A``I(2D!F'B!4#"@`(0`(9@@@-
M:``>80`*F"),<"Y.KO\N<`!@.$'M`&Q.KOW,0^P`""-,``@@5$'H`!).KO\*'
M0^P`%"-,``@@;``$0>@`$DZN_PI![0!L3J[]QB`,3-]P`$YU2.<`!BI.+&T`S
MGDAH`"`O"4'M`&Q.KOW,3-\#`'`.3J[]D$'M`&Q.KOW&3-]@`$YU2.<`)BI.N
M+&T`GB1(0>T`;$ZN_<P@$F<4($`,*``A``AG`D*20^H`"$ZN_P0@*@`$9Q8@(
M0`PH`",`"&<$0JH`!$/J`!1.KO\$0>T`;$ZN_<8@$F<*($`@:``>80`)P"`JP
M``1G"B!`(&@`(F$`";`B2G`N3J[_+DS?9`!.=4CG``8J3BQM`)XO""\)0>T`?
M/DZN_<PB7T'M`#!.KO[L(%]*@&<*(D#+3F$`_F;+3B\`0>T`/DZN_<8@'TS??
M8`!.=4CG``8J3BQM`)XO"2\(0>T`/DZN_<PB7T'M`").KO[L(E]*@&<*($#+%
M3F$`_B3+3B\`0>T`/DZN_<8@'TS?8`!.=4CG`!XJ3BQM`)XF2"A)0>T`/DZN4
M_<PB2T'M`").KO[L2H!G'"9`(DQ![0`P3J[^[$J`9PP@2R)`RTYA`/W2RTXOL
M`$'M`#Y.KOW&(!],WW@`3G5(YS`*80`*$DCGP`!(YP#@80K>_``43-]0#$YU7
M3E7_X"\$*VT`"/_@*VT`$/_H*VT`$/_P("T`$-"M`!@K0/_L*VT`%/_T*VT`9
M#/_D2&W_X$ZZ`C!83S@`9P``O!M$__E(;?_Y3KH/'%A/.T#__L!\`/]G/$AMH
M__E.N@[\6$]3@#M`__P_+?_\2&W_^DAM_^!.N@)^3^\`"K!M__QF$$AM__DO=
M+?_@3KH.YE!/8-9@8G``,"W__F!*2&W_^4ZZ#KA83SM`__QG+E-M__QG&C\MH
M__Q(;?_Z2&W_X$ZZ`C1/[P`*L&W__&8J2&W_^2\M_^!.N@Z<4$]@&DAM_^!A3
M'EA/8!"0O````0!GKI"\```#`&?F8`#_."@?3EU.=4Y5_>9"K?WJ0JW]YDAMB
M__1.NA"H6$\_/`(`2&W][B\M``A.N@'03^\`"CM`_^YG5D*G,"W_[DC`($!($
M:``*3KH0!E!/*T#_\&=T(&W_\#%M_^X`"#\M_^X@;?_P2&@`"DAM_>Y.N@X:2
M3^\`"B\M__!(;?_T3KH.0%!/,"W_[DC`T:W]ZF"02JW]ZF<R0J<@+?WJ5(`ON
M`$ZZ#ZY03RM`_>9G'$AM__0O+?WF85I03R\M_>8@;0`(+Q!.N@VX4$]*K?WF/
M9Q(@+?WJ5(`O`"\M_>9.N@^X4$](;?_T3KH0!EA/*T#_\&<<(&W_\#`H``A(+
MP")`2&D`"B\M__!.N@^.4$]@U$Y=3G5.5?_\(&T`"%*M``@0O`#P(&T`#"M08
M__Q@,B!M__P_*``(+RT`"")M__Q(:0`*3KH-2D_O``H@;?_\,"@`"$C`T:T`"
M""!M__PK4/_\(&W__$J09L8@;0`($+P`]TY=3G5.50``2.<(("\M``A.N@'`!
M6$]*0&8*<`!,WP003EU.=2!M``@B;0`(("@`#)"I``@_`"QM``@O+@`(3KH!-
M#EQ/)$!*@&<.(&T`""`*4H`A0``(8!`@;0`((FT`""-H``P`"&"D<``0$C@`?
M,`3`?`#XL'P`^&<$,`1@GB\*(&T`""\03KH,B%!/8`#_?F"*3E7__DCG#B`D9
M;0`,2FT`$&<``)PO+0`(3KH!)EA/2D!G``",(&T`"")M``@@*``,D*D`"#H`U
ML&T`$&\$.BT`$#\%(&T`""\H``@O"DZZ`(A/[P`*.``@;0`(,`1(P-&H``@P:
M!$C`U<"9;0`0N$5G.B\M``A.N@"F6$\\`+!\__]G+#`&P'P`^+!\`/AF("\MW
M``AA8%A/&T#__TAM__\@;0`(+Q!.N@O84$]@`/]@(`J0K0`,3-\$<$Y=3G4@Y
M;P`$,B\`"'``8`)*&%O)__QJ!"`(4X!.=4SO`P``!#(O``P@"&`&2A%K!A#9-
M4<G_^)'`(`A.=4Y5```O+0`(84)83TI`9@9P_TY=3G4@;0`((F@`"%*H``AP*
M`!`18.I.50``+RT`"&$:6$]*0&8&</].74YU(&T`"")H``AP`!`18.Y.50``0
M2.<(("1M``@@*@`,D*H`""@`9C1*J@`$9RXO*@`4+RH`$"\J``1A*D_O``Q(G
MP"@`)6H`$``(("H`$-"$)4``#$J$9@1"J@`$(`1,WP003EU.=4Y5``!(YP\\$
M(FT`""!M``P@+0`03I%,WSSP3EU.=4CG.#XJ3BQM`)XD2"9)($MA``&:-@!GD
M"B!+80`!YB@`9@1P`&`F0>T`;$ZN_<Q%Z@`2)!(H0B049P@H;``(81)@\D'M[
M`&Q.KOW&<`%,WWP<3G5*K``$9P``HC`#P&P`(&<``)C`?`#_9B"V?`0`9@X0>
M*P`!0>P`)F$``()F?&$``(Q*@&=T($!@5G``$!/`/``/,BP`(@$!9V"V?``(-
M9@P0*P`!0>P`)F%29DYA7DJ`9T@@0!(L`"1G$A`0P#P`#]`!;2RP/``09";3)
M$#`#P'P``V<,$BP`)6<&TR@``6L0+PAA3"!?2H!G!B)`87!@"BQ-80``GBQM$
M`)Y.=7(`$AAG"&`"L!A7R?_\3G4O"B`$(CP``0`!3J[_.DJ`9PXD0"!+(DH@`
M!$ZN_9`@"B1?3G4O"B1(<!@B/``!``%.KO\Z2H!G#B)`,WP`!``2(TH`%"`)/
M)%].=7`83J[_+DYU(&P`!"!H`!Y.KOZ23G5(YP`&*DXL;0">(&@`'DZN_HQ*9
M@&<*(D`O*0`48<P@'TS?8`!.=4CG``8J3BQM`)XO"&%B(E].KO\N3-]@`$YU/
M<`!R`!(0"`$`!V=(LCP`\&0PZ`G"/``'<`'C:+!\``AF#@PH`'H``64J,#P`Y
M@&`DL'P``F8>2B@``F88,#P``6`2,#P$`,(\``]G".)(44%D`N)(3G5P`'(`D
M$A`(`0`'9SBR/`#P9!)#^0````#H"<(\``<0,1``8"#"/``/9PQ#^0````<0[
M,1``8`X@"!(\`/>R&&;\D<`@"$YU2.<(*#@\``))^0```!A@1"1<<`XB/``!T
M``!.KO\Z2H!G."!`6(#DB"5``$P@O`````XQ?$[Y``@A:@`&``I!Z@`83J[]P
MTD*J`$A":@!&81!*@&<&4<S_NG`!3-\4$$YU2.<("#@J``PH:@`.8`I,W`,`;
M82@HP&?B4<S_]#@J`!(H:@`48`I,W`,`820HP&?*4<S_]'`!3-\0$$YU$#P`R
M(6$`\XI*@&<&($`A2@`>3G40/``C80#TH$J`9P8@0"%*`").=4CG("`T/``".
M1?D````88!X@6B`H`$QG%DIH`$9F$$*H`$SEB%F`(D!P#DZN_RY1RO_@0>T`Z
M(B00($(D$&<<#"@`(0`(9A`B:``>2FD`1F;H80#SC&#B83!@WD'M`#`D$"!"6
M)!!G'`PH`",`"&80(F@`(DII`$9FZ&$`]+9@XF$(8-Y,WP0$3G4B2$*I``I.6
MKO\$3G5(YP`P)$A!Z@`83J[]S$IJ`$9F.F$``(A*@&<X)D`B$C0J``1(PB8J)
M`$QX`#@J``HO#BQM`*).KO]V+%]*@&<4)4``2&$``(@E0`!(9P92:@!&<`$O[
M`$'J`!A.KOW&(!],WPP`3G5(YP`P)$A!Z@`83J[]S`QJ``$`1F8*82!*@&<*W
M)D!A2%-J`$9P`2\`0>H`&$ZN_<8@'TS?#`!.=2\+<!@B/``!``%.KO\Z2H!GU
M&B9`80``1B=```YG!"`+8`HB2W`83J[_+G``)E].=2)+(&H`2$ZN_I(@:P`.6
M3J[^@")K``YA``!R("L`%"\`(DMP&$ZN_RX@'TYU+PIP(B(\``$``4ZN_SI*`
M@&=()$!P_TZN_K:PO/____]F#'`B(DI.KO\N<`!@+!5\``0`"!5\````#A5``
M``^3R4ZN_MHE0``00>H`%""(6)!"J``$(4@`""`*)%].=2\*)$D5?`#_``@EU
M?/____\`''``$"H`#TZN_K`B2G`B3J[_+B1?3G5#^0```-A%^0```-BUR68.`
M,CP`!FL(=``BPE')__PCS0```.@CS@```.PC[0"B````\$YU2?D``'_^3G5-]
M:61I26X``$UI9&E);@``3E7]^$*M_?A.N@,8*T#]_$*L@-I![?X`*4B`YD*G>
M0J=.N@6F4$\K0/WX9W!.N@.J*4"`VF=F+RW]^"\M_?Q.N@,<4$\@;?WX<``0E
M*``/<@'AH2E!@-X@;(#:(F@`#G``$"D`#W(!X:&"K(#>*4&`XDZZ`3Y"ITAXG
M`@!(;?X`2'H`4"\L@"I.NO5D3^\`%"\M_?A.N@*L6$\K0/W\2JR`VF<*+RR`M
MVDZZ!$983TJM_?AG"B\M_?A.N@6<6$].N@:L0J<O+?W\3KH"E%!/3EU.=4Y57
M```O!$ZZ_Q!(>``!+RR`YF%`4$]*0&8(<``H'TY=3G5.N@"8*`!G)+B\```!Q
M_V\&*#P```'_+P0@;(#F4H@O"&$04$]*0&8$<`!@SB`$4H!@R$Y5```@;(#:7
M(6T`"``H(&R`VB%M``P`)"!L@-HQ?``"`!PO+(#:3KH&JEA/+RR`XDZZ!JQ8V
M3\"L@-YG'B\L@-I.N@1*6$]*@&8*+RR`VDZZ!")83W``3EU.=2\L@-I.N@:*_
M6$]P`6#N3E4``"!L@-HQ?``)`!PO+(#:3KH%I%A/(&R`VB`H`"!.74YU3E4`M
M`"!L@-HQ?``%`!PO+(#:3KH%@%A/3EU.=4UI9&E/=70`36ED:4]U=`!.5?_P3
M0JW__$*M__1.N@$X*T#_^"ML@(;_\"\M__!.N@%\6$]*0&=(0J="ITZZ`[Y06
M3RM`__1G.$ZZ`<(K0/_\9RXO+?_T+RW_^$ZZ`3103R\M__0O+?_\+RW_\&%0R
M3^\`#"\M__1.N@#\6$\K0/_X+RW_\$ZZ`4A83TJM__1G"B\M__1.N@/R6$]*!
MK?_\9PHO+?_\3KH"?%A/3KH$\D*G+RW_^$ZZ`-I03TY=3G5.50``2.<,("!M1
M`!!P`!`H``]X`>&D(&T`"")H`!YP`!`I``]R`>&A*@&*A"\%3KH%2%A/P(1F"
M)B\M``A.N@)R6$\D0$J`9Q0O"B\M``QA%E!/+PI.N@).6$]@W&#.3-\$,$Y=Y
M3G5.50``+PHD;0`()6T`#``H+RT`#$ZZ`D!83R5``"0U?``#`!PO"DZZ!"Q8Y
M3R1?3EU.=4Y5``!.NOS`0J=.N@0L6$\@0$AH`%QA!EA/3EU.=4Y5__PO+0`(9
M3KH$T%A/+RT`"$ZZ!$)83TY=3G5.50``(&T`""%M``P`%"\M``A.N@1V6$].+
M74YU3E4``$*G0J=.N@)&4$\@;0`((4``'F<$<`%@`G``3EU.=4Y5__PO"B1M<
M``A*J@`>9R@O"DZZ`8Q83RM`__QG#"\M__Q.N@%P6$]@YB\J`!Y.N@**6$]"H
MJ@`>)%].74YU3E7_]D*M__Q"K?_X0FW_]D*G0J=.N@':4$\K0/_X9P``L$AX2
M`%(O+?_X3KH"KE!/*T#__&<``)H@;?_\$7P`(`!/0J<O+?_\0J=(>@"\3KH#9
MD$_O`!!*@&9V.WP``?_V(&W__'``$"@`3["\````L&8<(FW__`RI```^@``T_
M9@XL;?_\#*X``'H2`#QG.B!M__P1?`"P`$\@;?_\(7P``#Z``#0@;?_\(7P`[
M`'H2`#P@;?_\,7P`"P`<+RW__$ZZ`JQ83TJ`9@@@+?_\3EU.=4IM__9G"B\M_
M__Q.N@$(6$]*K?_\9PY(>`!2+RW__$ZZ`BY03TJM__AG"B\M__A.N@%\6$]PH
M`&#$<V5R:6%L+F1E=FEC90!.5?_\2JT`"&<R(&T`""MH``[__"\M``A.N@"T)
M6$](>`!2+RT`"$ZZ`>!03TJM__QG"B\M__Q.N@$N6$].74YU(&\`!"QL@.I..
M[O^"(&\`!"QL@.I.[O^.(&\`!"QL@.I.[O]V(&\`!"QL@.I.[O]\3.\#```$A
M+&R`ZD[N_XA,[P,```1P`#`O``RSR&8"3G5C$-#`TL!@`A,@4<C__$YU$MA1$
MR/_\3G4B;P`$+&R`[D[N_B!,[P,```0L;(#N3N[_"B)O``0L;(#N3N[^+")O:
M``0L;(#N3N[^/DY5``!(YP@@2'C__TZZ`-!83R@`L+S_____9@IP`$S?!!!.V
M74YU2'D``0`!2'@`(DZZ`3A03R1`2H!F#"\$3KH!@EA/<`!@UB5M``@`"A5MV
M``\`"15\``0`"$(J``X51``/0J=.N@$L6$\E0``02JT`"&<*+PI.N@!:6$]@C
M"DAJ`!1.N@%:6$\@"F"23E4``"\*)&T`"$JJ``IG""\*3KH!<EA/%7P`_P`(+
M)7S_____`!1P`!`J``\O`$ZZ`0983TAX`"(O"DZZ`.903R1?3EU.=2)O``0LI
M;(#N3N[^GB`O``0L;(#N3N[^MDY5```O"DJM``AF"'``)%].74YU2'D``0`!H
M+RT`#$ZZ`&!03R1`2H!F!'``8.`5?``%``@U;0`.`!(E;0`(``X@"F#*3E4`V
M`"\*)&T`""`*9@8D7TY=3G45?`#_``@E?/____\`%"5\_____P`8<``P*@`2S
M+P`O"DZZ`$I03V#23OH``DSO``,`!"QL@.Y.[O\Z2.<#`")O``PL;(#N3J[^A
M.$S?`,!.=4[Z``(B;P`$+&R`[D[N_MI.^@`"+&R`[D[N_WQ.^@`"(F\`!"`O4
M``@L;(#N3N[_+B`O``0L;(#N3N[^L$[Z``(@;P`$+&R`[D[N_HP@;P`$((A8V
MD$*H``0A2``(3G4@;P`$3.\"`0`((B\`$"QL@.Y.[OY$(&\`!"QL@.Y.[O[^!
M(F\`!"QL@.Y.[OZ83OH``B)O``0L;(#N3N[^AB)O``0L;(#N3N[^,B`O``0L8
M;(#N3N[^PB)O``0L;(#N3N[^)D[Z``(@;P`$+&R`[D[N_H```````^P````B_
M``````````8````*````$@```!8````:````F````)P```"@````I````*@`R
M``"L````L````+0```"X````O````,````#$````R````,P```#0````U````
M`-@```#<````X````.0```#H````[````/````#T````^````/P```$````!F
M$@```2P````*`````0``#E(```YJ```.C@``#U(``!%>```19```$7P``!&"C
M```1B@``$9(````````#\@```^H````V`P,#`P("`P```P(```$``0`!`0$`S
M`0$`````+````(@``!&8`````````````!&@``H``!&H#Z```0```"``````C
M`````````````````````````````````````````````````````````````
M````````````````````$W0`````````````$WP`"@``$X0/H``````````!G
M````?```````````````````````````````````````````````````````\
M```````````````````````#[`````0````!````&````!P````Z````G```^
M``8`````````(````"P````R````?````(@```".`````````_(```/K````Y
%`0```_(`V
``
end
size 7160
SHAR_EOF
if test 10069 -ne "`wc -c midi.library.uu`"
then
echo shar: error transmitting midi.library.uu '(should have been 10069 characters)'
fi
echo shar: extracting mm.uu '(15683 characters)'
cat << \SHAR_EOF > mm.uu

begin 600 mm
M```#\P`````````#``````````(```F````!(`````$```/I```)@$[Z%AY.E
M5?_X0JW__$AZ`9I.NA5,6$](;(!B+RT`"C\M``A.NA)H3^\`"CM```@,;0`!:
M``AO<B!M``HB:``$#!$`/V9D2'H!<$ZZ%1183TAZ`7A.NA4*6$](>@&;3KH5#
M`%A/2'H!R$ZZ%/983TAZ`>E.NA3L6$](>@'\3KH4XEA/2'H"($ZZ%-A83TAZK
M`D].NA3.6$](>@*"3KH4Q%A//SP``4ZZ(L!43TAX``%(>@*H3KHDWE!/*4"$[
M;&8.2'H"I4ZZ%)Q83V```-@(+```@%UG&"!L@%Y*$&<&("R`7F`&0_H"FB`)S
M*T#__$*G+RW__$ZZ$3!03RE`A'!F#DAZ`H9.NA1<6$]@``"8""P``(!=9@``W
MA`@L``"`:6<.(&R`:DH09P8@+(!J8`9#^@)K(`DK0/_X""P``(!19P8";/\`#
M@&X(+```@#EG!@BL``"`;@@L``"`16<&"*P``8!N""P``(`M9P8(K``"@&Y(M
M;(!N+RR$<"\M__A.NA#^3^\`#"E`A'1F$"\M__A(>@(23KH3SE!/8`HO+(1P=
M3KH"FEA/3KH"3$Y=3G5-241)($UO;FET;W(*`'5S86=E.B!M;2!;;W!T<UT*U
M`"`@+6-R<W@@("`@+2!D:7-A8FQE('-P96-I9FEC(&US9R!C;&%S<RAE<RD*$
M`"`@("`@("`@("`@("`@("AC:&%N;F5L+"!R96%L=&EM92P@<WES=&5M+"!EB
M>&-L=7-I=F4I"@`@("MX("`@("`@("T@9&ES<&QA>2!F=6QL('-Y<R]E>"!M7
M97-S86=E<PH`("`K:2`@("`@("`M(&EN=&5R<')E="!D871A"@`@("UH("`@,
M("`@("T@9&ES<&QA>2!H97@@<F%T:&5R('1H86X@9&5C:6UA;`H`("`M=#QN=
M86UE/B`M(&%U=&\M<F]U=&4@=&\@82!3;W5R8V4@;W1H97(@=&AA;B`B36EDQ
M:4EN(@H`("`M<%MN86UE72`M(&UA:V4@82!P=6)L:6,@;6ED:2!D97-T:6YAX
M=&EO;B`H;F\@875T;RUR;W5T92D*`"`@("`@("`@("`@("`@(&%N9"!O<'1IV
M;VYA;&QY(&YA;64@:70@*&1E9F%U;'0@:7,@(DUO;FET;W(B*0H`;6ED:2YLR
M:6)R87)Y`&-A;B=T(&]P96X@;6ED:2YL:6)R87)Y"@!-;VYI=&]R`&-A;B=T-
M(&-R96%T92!$97-T"@!-:61I26X`8V%N)W0@8W)E871E(%)O=71E("AC86XGY
M="!F:6YD('-O=7)C92`B)7,B/RD*`$Y5```_//__2&R">$ZZ'.A<3V$./SP`_
M`4ZZ'WY43TY=3G5.50``2JR$>&<*+RR$>$ZZ#DI83TJLA'1G"B\LA'1.N@XN1
M6$]*K(1P9PHO+(1P3KH.$EA/2JR$;&<*+RR$;$ZZ(1183TY=3G5.5?_\(&T`_
M"")H`!YP`!`I``]R`>&A",$`#"M!__PO+?_\3KHA:%A/"```#&8H+RT`"$ZZV
M#>I83RE`A'AG%B\LA'A.N@#B6$\O+(1X3KH-Q%A/8-I@R$Y=3G5.50``/RT`>
M#`@L``"`%6<(0?H`(B`(8`9!^@`=(`@O`"\M``A.NA8`3^\`"B`M``A.74YUK
M)7@`)60`3E4```@L``"`"6<X,"T`#$C`@?P`#%5`/P`R+0`,2,&#_``,2$%(#
MP>6!0>R`?"\P&`!(>@!5+RT`"$ZZ%;!/[P`.8"`_+0`,+RT`"$ZZ_WA<3R\`0
M2'H`."\M``A.NA6.3^\`#"`M``A.74YU0P!#(P!$`$0C`$4`1@!&(P!'`$<C/
M`$$`02,`0@`E<R5D`"5S``!.5?_^+RT`"$ZZ#0983SM`__XP+?_^P'P`_V<.H
M/RW__B\M``AA3%Q/8$1P`#`M__Y@)"\M``A.N@6>6$]@,"\M``A.N@8V6$]@,
M)"\M``A.N@<T6$]@&)"\```!`&?4D+P```$`9]B0O````@!GW$Y=3G5.5?_6U
M(&T`"'``$!#`?``/4D`[0/_^,"T`#$C`8``!AB!M``AP`!`H``(_`$AM_]9.H
MNOZ07$\O`"!M``AP`!`H``$_`$AM_^I.NOZR7$\O`#\M__Y(>@&*3KH4VD_OY
M``Y@``%Z(&T`"'``$"@``C\`2&W_UDZZ_DQ<3R\`(&T`"'``$"@``3\`2&W_.
MZDZZ_FY<3R\`/RW__DAZ`55.NA263^\`#F```38@;0`(<``0*``"/P!(;?_66
M3KK^"%Q/+P`@;0`(<``0*``!/P!(;?_J3KK^*EQ/+P`_+?_^2'H!($ZZ%%)/6
M[P`.8```\B\M``A.N@-B6$]@``#D(&T`"'``$"@``5)`/P!(;?_J3KK]M%Q/<
M+P`_+?_^2'H`\4ZZ%!9/[P`*8```MB!M``AP`!`H``$_`$AM_^I.NOV(7$\O=
M`#\M__Y(>@#/3KH3ZD_O``I@``"*(&T`"'``$"@``L!\`'_O0")M``AR`!(I>
M``'"?`!_@$&0?"``/P!(;?_J3KK]0EQ/+P`_+?_^2'H`DTZZ$Z1/[P`*8$0O!
M+0`(3KH`C%A/8#A3@&<`_KQ3@&<`_G)5@&<`_O19@&<`_S)1@&<`_SJ0O```"
M`!!G`/]>D+P````@9X"0O````$!GO$Y=3G5.=$1N.B5D("5S("5S"@!.=%5P\
M.B5D("5S("5S"@!0<#HE9"`E<R`E<PH`4&<Z)60@)7,*`$UP.B5D("5S"@!0(
M=SHE9"`E<PH``$Y5_^@O!"!M``AP`!`0P'P`#U)`.T#__B!M``AP`!`H``$XI
M`"!M``AP`!`H``([0/_\/RW__DAZ`-!.NA+.7$\(+```@`EG``"<,`1(P&!Z9
M2FW__&<(0?H`R2`(8`9!^@#$(`@O`$AZ`*=.NA*>4$]@<$AZ`+1.NA*26$]@"
M9$AZ`+=.NA*&6$]@6$AZ`+5.NA)Z6$]@3#\M__Q(;?_H3KK[^%Q/+P!(>@"BV
M3KH27E!/8#!(>@"?3KH24EA/8"3_</^2_Y[_JO^V_]*0O````'JPO`````9D'
M"N.`,#L`XD[[``!@'C\M__Q(;?_H3KK[JEQ/+P`_!$AZ`&%.NA(.3^\`"B@?H
M3EU.=4UD.B5D(`!,;V-A;"!#;VYT<F]L("5S"@!/;@!/9F8`06QL($YO=&5S*
M($]F9@H`3VUN:2!/9F8*`$]M;FD@3VX*`$UO;F\@)7,*`%!O;'D*`",E9"`E1
M<PH``$Y5``!@'"!M``H0$+`M``EF#"!M``H@*``"3EU.=5RM``HP+0`.4VT`X
M#DI`9MAP`&#H36]D5P!"<F5A=&@`1F]O=`!0;W)T80!$871A`%9O;`!"86P`S
M4&%N`$UO9%<H3"D`0G)E871H*$PI`$9O;W0H3"D`4&]R=&$H3"D`1&%T82A,L
M*0!6;VPH3"D`0F%L*$PI`%!A;BA,*0!3=7-T86EN`%!O<G1A`%-U<W1E;G5TW
M;P!3;V9T`$AO;&0R`$EN8W(`1&5C<@``3E7_Y"\$(&T`"'``$!#`?``/4D`[$
M0/_^(&T`"'``$"@``3@`(&T`"'``$"@``CM`__P_+?_^2'H`L$ZZ$*1<3P@L>
M``"`"6=\/SP`%TAL@*P_!$ZZ_N103RM`__AG9KA\`$!L(C\M__Q(;?_D3KKZ<
M`%Q/+P`O+?_X2'H`=4ZZ$&)/[P`,8#RX?`!@;"A*;?_\9PA!^@!I(`A@!D'ZZ
M`&0@""\`+RW_^$AZ`$Y.NA`T3^\`#&`.+RW_^$AZ`$I.NA`B4$]@'C\M__Q('
M;?_D3KKYH%Q/+P`_!$AZ`#!.NA`$3^\`"B@?3EU.=4-T.B5D(``E<R`E<PH`-
M)7,@)7,*`&]N`&]F9@`E<PH`(R5D("5S"@!.5?_L(&T`"'``$!!@:B!M``AP$
M`!`H``'`?`!_[T`B;0`(<@`2*0`"PGP`?X!!/P!(;?_L3KKY*%Q/+P!(>@!.9
M3KH/CE!/8$`@;0`(<``0*``!/P!(;?_L3KKY!%Q/+P!(>@`R3KH/:E!/8!Q(X
M>@`O3KH/7EA/8!"0O````/)GCE.`9\17@&?D3EU.=5!O<R`E<PH`4V]N9R`E&
M<PH`5'5N90H``$Y5```@;0`(<``0$)!\`/AR`#(`Y8%#[($V+S$8`$AZ`#E.@
MN@\(4$].74YU0VQK`%5N9"-F.0!3=&%R=`!#;VYT`%-T;W``56YD(V9D`$%CA
M='8`4F5S970`)7,*``!30TD`0FEG($)R:6%R`$]C=&%V92]0;&%T865U`$UOI
M;V<`4&%S<W!O<G0`3&5X:6-O;@!/8F5R:&5I;0!004E!`%-I;6UO;G,`1F%I`
M<FQI9VAT`$)O;B!496UP:0!3245,`%-Y;G1H($%X90!+87=A:0!2;VQA;F0`6
M2V]R9P!986UA:&$`3F]N+4-O;6UE<F-I86P`3F]N+5)E86P@5&EM90!296%L'
M(%1I;64`3E7_]B!M``A2K0`(+PA.N@5P6$]7@"M`__P@;0`(4JT`"'``$!`[B
M0/_Z0JW_]DAZ`)I.N@WN6$\(+```@`EG;#\\`!1(;(%6/RW_^DZZ_"Q03RM`L
M__9G5"\M__9(>@!S3KH-P%!/,"W_^DC`8"XO+?_\+RT`"$ZZ`0I03V`L+RW_J
M_"\M``A.N@-,4$]@'"\M__PO+0`(84903V`.D+P```!`9]I7@&?&8.1@&C\M\
M__I(>@`C3KH-;%Q/+RW__"\M``AA&E!/3EU.=5-Y<T5X(``E<R``:60])3`RR
M>"``3E4```RM````"``,;TX(+```@"%G*"\M``Q(>@!<3KH-)%!/+RT`#"\M+
M``A.N@+F4$](>@!63KH-#%A/8!P_/``(+RT`"$ZZ`WI<3R\M``Q(>@`Z3KH,"
M[E!/8!@_+0`.+RT`"$ZZ`UQ<3TAZ`#9.N@S46$].74YU+2`E;&0@9&%T82!BH
M>71E<PH`"@`N+BX@*"5L9"!D871A(&)Y=&5S*0H`"@!.5?^\2.<,`$JM``QF@
M"$S?`#!.74YU(&T`"%*M``AP`!`0.`!3K0`,,`3`?``/.@!213`$P'P`<#(`C
M<``P`6```8@@;0`(<``0$,!\`'_O0")M``AR`!(I``'"?`!_@$$[0/_^(&T`A
M"'``$"@``C\`2&W_O$ZZ];A<3R\`,"W__L!\`?\_`$AM_]!.NO6B7$\O`#`M?
M__YR">)H/P!(;?_D3KKUC%Q/+P`_!4AZ`3Q.N@OP3^\`$F```2P@;0`(<``0T
M$#\`2&W_Y$ZZ]61<3R\`/P5(>@$G3KH+R$_O``I@``$$(&T`"'``$"@``<!\2
M`'_O0")M``AR`!(I``+"?`!_@$$[0/_^("T`"%:`*T#_^B`M``Q9@#M`__@@]
M;0`(T>T`#'``$"C__S\`/RW__DAM_]!.NO3Z7$\O`"!M``AP`!`0/P!(;?_D=
M3KKTY%Q/+P`_!4AZ`+I.N@M(3^\`$#`M__ZP;?_X9Q0P+?_^D&W_^#\`2'H`;
MNDZZ"RA<3TAZ`,9.N@L>6$\(+```@"%G''``,"W_^"\`+RW_^DZZ`-103TAZ=
M`*1.N@KZ6$]@.#\$2'H`F$ZZ"NQ<3R\M``PO+0`(3KK]FE!/8!Q*@&<`_Q:01
MO````!!G`/YLD+P````09P#^VF#(8`#^*%!A<F%M.B5D("5S.B5S("5S"@!2X
M97%U97-T.B5D(&9M=#TE<PH`1'5M<#HE9"!F;70])7,@<VEZ93TE<R!S=6T]7
M)3`R>``@*&5R<CH@;&]S="`E9"!B>71E<RD`"@`*`%5N9",E,#)X(`!.50``E
M2JT`#&8$3EU.=2\M``PO+0`(3KK\\E!/8.Q.5?_^3KH!*DAZ`)!.N@HB6$\,4
MK0```!``#&P&("T`#&`"<!`[0/_^9VQ.N@$$2D!G#$AZ`&M.N@GX6$]@6#\M,
M__XO+0`(869<3TAZ`%MP$)!M__[!_``#4D`_`$AZ`$5.N@G.3^\`"C\M__XO!
M+0`(87!<3TAZ`#).N@FV6$\P+?_^2,#1K0`(,"W__DC`D:T`#&``_WY.74YUR
M("`@(`!>1`H`)2IS```*("`@(`!.50``,"T`#%-M``Q*0&<:(&T`"%*M``APG
M`!`0/P!(>@`.3KH)7EQ/8-I.74YU)3`R>"``3E4``"\$,"T`#%-M``Q*0&<V"
M(&T`"%*M``AP`!`0.`!(;()X,`120$'L@>`2,```2('"?`#'9P0P!&`"<"X_4
M`$ZZ#:!<3V"^*!].74YU3E4``$AX(`!"ITZZ$Z)03P@```UG!'`!8`)P`$Y=I
M3G5,[P,```0L;(1L3N[_Q"!O``0L;(1L3N[_OB!O``0L;(1L3N[_IB!O``0L;
M;(1L3N[_@B!O``0L;(1L3N[_CB!O``0L;(1L3N[_=B!O``0L;(1L3N[_?"\*4
M3.\'```(+&R$;$ZN_YHD7TYU3E7_]"\*,"T`"%)`Y4`[0/_Z.6T`"(0B#&P`8
M`80B;P`!`C\M__I.N@)*5$\I0(0>*T#__&8(</\D7TY=3G4_+?_Z+RR$'B\MR
M``I.N@;&3^\`"CM\``$`"$ZZ`/0D0$J`9P``K!`2&T#_]4B`/P!.N@"\5$]*,
M0&<``(12BDH29WHO+0`.$!)(@#\`$BW_]4B!/P%.N@#<4$\K0/_V9UH@;?_VY
M".@````'(&W_]C`H``;`?``,,@!P`#`!8#!**@`!9AQ.N@"*(&W_]B%```AF<
M#"!M__9#^@!4(4D`"&`:(&W_]B`*4H`A0``(8`Y9@&?N68!GSEF`9\1@@&`.N
M6*T`"B!M``H@BE)M``A@`/],6*T`"B!M``I"D"\M__Q.N@%H6$\P+0`(8`#_M
M$```3E4``"\$."T`"+A\`"UG!KA\`"MF!'`!8`)P`"@?3EU.=4Y5``!*;(0BA
M9P93;(0B9@9P`$Y=3G58K(0>(&R$'B`08/!.50``+PHD;0`,8&00+0`)2(`_Z
M``@J``0`!V<$<"M@`G`M,A^R0&9&""H``0`'9Q(0*@`$L"T`"V8$<`%@`G``W
M8"H4*@`$2((_`DZZ`<!43S\`$"T`"TB`/P!.N@&P5$\R'[)`9@1P`6`"<`!F#
M!B12(`IFF"`*)%].74YU3E4``$CG`#`D;(0D8!0F4B`J``10@"\`+PI.NA#@C
M4$\D2R`*9NA"K(0D3-\,`$Y=3G5.50``+PI!^O_&*4B$,"\M``P@+0`(4(`O^
M`$ZZ$(Q03R1`2H!F"'``)%].74YU)*R$)"5M``@`!"E*A"0@"E"`8.9.50``4
M0J<O+0`(8;)03TY=3G5.50``<``P+0`(+P!AX%A/3EU.=4Y5``!(YP`PE\LDR
M;(0D8`X@;0`(48BQRF<2)DHD4B`*9NYP_TS?#`!.74YU(`MG!":28`0I4H0DQ
M("H`!%"`+P`O"DZZ$!Y03W``8-A.5?X`+P1![?X`*4B$*$AM``PO+0`(2'H`'
M)$ZZ!C)/[P`,.``@;(0H0A!(;?X`3KH`*%A/,`0H'TY=3G5.50``(&R$*%*L\
MA"@0+0`)$(!(@,!\`/].74YU3E4``$ILA#1G!$ZZ#7).N@]&2H!G("\M``A.6
MN@F<6$](P"\`+RT`"$ZZ#RPO`$ZZ#S)/[P`,3EU.=7``$"\`!;`\`&!C"K`\M
M`'IB!)`\`"!.=7``$"\`!;`\`$!C"K`\`%IB!-`\`"!.=6%P0^R$'D7LA!ZUA
MR68.,CP`&&L(=``BPE')__PI3X0V+'@`!"E.A#I(YX"`""X`!`$I9Q!+^@`()
M3J[_XF`&0J?S7TYS0_H`($ZN_F@I0(0^9@PN/``#@`=.KO^48`1.N@`:4$].1
M=61O<RYL:6)R87)Y`$GY``!__DYU3E4``"\*2'D``0``,"R$&L'\``8O`$ZZR
M#J!03RE`A$)F%$*G2'D``0``3KH.9%!/+FR$-DYU(&R$0D)H``0@;(1",7P`0
M`0`0(FR$0C-\``$`"B!LA#8@+(0VD*@`!%"`*4"$1B!LA$8@O$U!3EA"ITZZ!
M#E183R1`2JH`K&<N+RT`#"\M``@O"DZZ`+)/[P`,.7P``80T(&R$0@!H@```3
M!"!LA$(`:(````I@1$AJ`%Q.N@Z"6$](:@!<3KH.+EA/*4"$2B!LA$I*J``D9
M9Q`@;(1*(F@`)"\13KH-5EA/+RR$2B\*3KH"@E!/*6R$2H1.3KH-5B!LA$(@P
M@$ZZ#7H@;(1"(4``!F<62'@#[4AZ`"Q.N@U24$\@;(1"(4``#"\LA$X_+(126
M3KKH0EQ/0F=.N@N:5$\D7TY=3G4J`$Y5``!(YPPP)&T`$"!M``@@*`"LY8`HV
M`"!$("@`$.6`)D`0$TB`2,#0K0`,5(`Y0(140J<P+(142,`O`$ZZ#3Y03RE`7
MA%9F"$S?##!.74YU$!-(@#\`($M2B"\(+RR$5DZZ`41/[P`*2'H!.A`32(!(]
MP-"LA%8O`$ZZ`:)03S\M``XO"B\LA%9.N@%N3^\`"D)LA%(F;(16)$L0$TB``
M.@"P?``@9QBZ?``)9Q*Z?``,9PRZ?``-9P:Z?``*9@12BV#8#!,`(&UZ#!,`F
M(F8N4HL@2U*+$!!(@#H`9QX@2E**$(6Z?``B9A`,$P`B9@12BV`&0BK__V`"E
M8-9@."!+4HL0$$B`.@!G)KI\`"!G(+I\``EG&KI\``QG%+I\``UG#KI\``IG^
M""!*4HH0A6#.($I2BD(02D5F`E.+4FR$4F``_UI"$D*G,"R$4E)`2,#E@"\`H
M3KH,*%!/*4"$3F8(0FR$4F``_N1Z`"9LA%9@'C`%2,#E@"!LA$XABP@`+PM.J
MN@886$]20$C`U\!21;ILA%)MW#`%2,#E@"!LA$Y"L`@`8`#^IB``3.\#```$L
M(`@R+P`,8`(0V5?)__QG!E)!8`)"&%')__Q.=4SO`P``!'``,"\`#+/(9@).=
M=6,0T,#2P&`"$R!1R/_\3G42V%'(__Q.=3`\?_]@!#`O``P@;P`$2AAF_%-(B
M(F\`"%-`$-E7R/_\9P)"$"`O``1.=2!O``0@"")O``@0V6;\3G5.50``2.<."
M,"1M``A"ITAZ`(Y.N@M^4$\I0(1\9@A,WPQP3EU.=2!M``PB:``D+RD`!$ZZ)
M"[Y83R@`9U)(>@!M($0O*``V3KH+D%!/)D!*@&<T2'@#[2\+3KH*HE!/+`!G.
M)"`&Y8`J`"!%)6@`"`"D)48`G$AX`^U(>@`X3KH*?E!/)4``H"\$3KH+7%A/E
M+RR$?$ZZ"JQ83T*LA'Q@@&EC;VXN;&EB<F%R>0!724Y$3U<`*@!.50``+P0I;
M;0`(A"Q(;0`0+RT`#$AZ`!I.N@#<3^\`##@`(&R$+$(0,`0H'TY=3G5.50``N
M(&R$+%*LA"P0+0`)$(!(@,!\`/].74YU3E4``$AM``PO+0`(2'H$<$ZZ`)A/>
M[P`,3EU.=4Y5``!(YP@@)&T`#@QM``0`$F8((&T`""@08!Q*;0`,;PP@;0`(;
M<``P$"@`8`H@;0`(,!!(P"@`0FT`$DIM``QL$$1M``Q*A&P(1(0[?``!`!(R*
M+0`,2,$@!$ZZ`XY![('.4XH4L```,BT`#$C!(`1.N@.$*`!FVDIM`!)G!E.*^
M%+P`+2`*3-\$$$Y=3G5.5?\B2.<(,"1M``@F;0`,0FW_^BMM`!#__"!+4HL0:
M$$B`.`!G``+LN'P`)68``LI"+?\P.WP``?_X.WP`(/_V.WPG$/_T($M2BQ`02
M2(`X`+!\`"UF#D)M__@@2U*+$!!(@#@`N'P`,&80.WP`,/_V($M2BQ`02(`XY
M`+A\`"IF&"!M__Q4K?_\.U#_\B!+4HL0$$B`.`!@,D)M__)@'#`M__+!_``*'
MT$20?``P.T#_\B!+4HL0$$B`.``P!%)`0>R!X`@P``(``&;4N'P`+F9:($M2+
MBQ`02(`X`+!\`"IF&"!M__Q4K?_\.U#_]"!+4HL0$$B`.`!@,D)M__1@'#`MV
M__3!_``*T$20?``P.T#_]"!+4HL0$$B`.``P!%)`0>R!X`@P``(``&;4.WP`?
M`O_PN'P`;&82($M2BQ`02(`X`#M\``3_\&`0N'P`:&8*($M2BQ`02(`X`#`$S
M2,!@>#M\``C_[F`6.WP`"O_N8`X[?``0_^Y@!CM\__;_[C\M__!(;?\P/RW_[
M[B\M__Q.NOWD3^\`#"M`_^HP+?_P2,#1K?_\8%H@;?_\6*W__"M0_^HO+?_J$
M3KH"#%A/.T#_\&!*(&W__%2M__PX$$'M_R\K2/_J$(1@*)"\````8V?B4X!GC
ME)"\````"V<`_W19@&>T58!G`/]R5X!G`/]T8,Q![?\PD>W_ZCM(__`P+?_P%
ML&W_]&\&.VW_]/_P2FW_^&=H(&W_Z@P0`"UG"B)M_^H,$0`K9BX,;0`P__9F4
M)E-M__(@;?_J4JW_ZA`02(`_`$Z25$^P?/__9@IP_TS?#!!.74YU8!8_+?_VT
M3I)43[!\__]F!'#_8.12;?_Z,"W_\E-M__*P;?_P;MQ";?_N8"`@;?_J4JW_G
MZA`02(`_`$Z25$^P?/__9@1P_V"P4FW_[B!M_^I*$&<*,"W_[K!M__1MSC`M&
M_^[1;?_Z2FW_^&8H8!@_/``@3I)43[!\__]F!G#_8`#_>%)M__HP+?_R4VW_7
M\K!M__!NVF`6/P1.DE1/L'S__V8&</]@`/]24FW_^F``_0HP+?_Z8`#_0DCG]
M2`!"A$J`:@1$@%)$2H%J!D2!"D0``6$^2D1G`D2`3-\`$DJ`3G5(YT@`0H1*:
M@&H$1(!21$J!:@)$@6$:(`%@V"\!81(@`2(?2H!.=2\!808B'TJ`3G5(YS``N
M2$%*068@2$$V`30`0D!(0(##(@!(0#("@L,P`4)!2$%,WP`,3G5(028!(@!")
M04A!2$!"0'0/T(#3@;:!8@22@U)`4<K_\DS?``Q.=2!O``0@"$H89OR1P"`(]
M4X!.=4Y5``!(;()X/RT`"$ZZ``A<3TY=3G5.50``+P0X+0`(+RT`"C\$3KH`X
M,%Q/N'P`"F8D(&T`"A`H``Q(@`@```=G%#\\__\O+0`*3KH`]EQ/*!].74YU-
M8/A.50``+PHD;0`*(%*QZ@`$91@P+0`(P'P`_S\`+PI.N@#*7$\D7TY=3G4@#
M4E*2$"T`"1"`2(#`?`#_8.A.50``+PI![()B)$@@2M7\````%B\(81!83T'L]
MA!JUR&7J)%].74YU3E4``$CG""`D;0`(>``@"F8*</],WP003EU.=4HJ``QG#
M4@@J``(`#&<,/SS__R\*851<3S@`$"H`#4B`/P!.N@/T5$^(0`@J``$`#&<*W
M+RH`"$ZZ]()83P@J``4`#&<4+RH`$DZZ`?!83R\J`!).NO1F6$]"DD*J``1")
MJ@`(0BH`##`$8(Y.5?_^2.<(("1M``A!^O]$*4B$6@@J``0`#&<*</],WP00*
M3EU.=0@J``(`#&<P(!*0J@`(.``_!"\J``@0*@`-2(`_`$ZZ`:Y03[!$9Q`(L
MZ@`$``Q"DD*J``1P_V#`#&W__P`,9A`(J@`"``Q"DD*J``1P`&"H2JH`"&8(L
M+PI.N@":6$\,:@`!`!!F*AMM``W__S\\``%(;?__$"H`#4B`/P!.N@%04$^P1
M?``!9J`P+0`,8`#_:B2J``@P*@`02,#0J@`()4``!`CJ``(`#"!24I(0+0`-(
M$(!(@,!\`/]@`/\^3E4``"\*0>R"8B1(2BH`#&<8U?P````60>R$&K7(90AP4
M`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(/SP$`$ZZ\Q)43RM`I
M__QF&#5\``$`$"`*T+P````.)4``""1?3EU.=35\!```$`CJ``$`#"5M__P`N
M"!`J``U(@#\`3KH`$%1/2D!G!@`J`(``#&#.3E4``"\*,"T`",'\``8D0-7L5
MA$)*;0`(;0XP+0`(L&R$&FP$2I)F#CE\``*$7G#_)%].74YU,"T`",'\``8@@
M;(1"+S`(`$ZZ`G!83TJ`9P1P`6`"<`!@V$Y5```O+0`(3KH".EA/2H!F#DZZB
M`D0Y0(1></].74YU<`!@^$Y5``!(YPP@."T`"$ZZ`'`P!,'\``8D0-7LA$)*5
M1&T*N&R$&FP$2I)F$#E\``*$7G#_3-\$,$Y=3G4P*@`$P'P``V8*.7P`!81>]
M</]@Y'``,"T`#B\`+RT`"B\23KH""$_O``PJ`+"\_____V8,3KH!Q#E`A%YP<
M_V"X(`5@M$Y5__Q(>!``0J=.N@)T4$\K0/_\"```#&<22FR$-&8(("W__$Y=&
M3G5.NN!N<`!@]$Y5``!*K(1:9P8@;(1:3I`_+0`(3KH`"%1/3EU.=4Y5__POK
M!#`M``A(P"M`__Q*K(1"9RAX`&`*/P1.N@#05$]21+ALA!IM\#`LA!K!_``&T
M+P`O+(1"3KH!N%!/2JR$,&<&(&R$,$Z02JR$8&<*+RR$8$ZZ`6Y83TJLA&1G2
M"B\LA&1.N@%>6$]*K(1H9PHO+(1H3KH!3EA/+'@`!`@N``0!*6<4+PU+^@`*%
M3J[_XBI?8`9"I_-?3G-*K(1*9C!*K(169R@P+(142,`O`"\LA%9.N@$^4$\PW
M+(124D!(P.6`+P`O+(1.3KH!*%!/8`Y.N@$8+RR$2DZZ`4A83R`M__PN;(0VY
M3G4H'TY=3G5.50``2.<.(#@M``@P!,'\``8D0-7LA$)*1&T*N&R$&FP$2I)F`
M$#E\``*$7G#_3-\$<$Y=3G4P*@`$P'R``&8(+Q).N@`*6$]"DG``8.`B+P`$`
M+&R$/D[N_]PB+P`$+&R$/D[N_X(B+P`$+&R$/D[N_[@L;(0^3N[_RBQLA#Y.&
M[O]\(B\`!"QLA#Y.[O\H3.\`!@`$+&R$/D[N_^).^@`"+&R$/D[N_\1.^@`"D
M3.\`#@`$+&R$/D[N_]!(YP$$3.\@@``,+&R$.DZN_Y1,WR"`3G5.^@`"(F\`;
M!"QLA#I.[OYB3.\``P`$+&R$.D[N_SHB;P`$+&R$.D[N_MHL;(0Z3N[_?")O@
M``0@+P`(+&R$.D[N_RX@;P`$+&R$.D[N_HQ.^@`"+&R$.B)O``0@+P`(3N[].
MV")O``0L;(0Z3N[^AD[Z``),[P`#``0L;(0Z3N[^SB`O``0L;(0Z3N[^PB!OA
M``0L;(0Z3N[^@$SO`P``!"QLA'Q.[O^@(&\`!"QLA'Q.[O^F(&\`!"QLA'Q..
M[O^R```#[`````$````!```6E`````````/R```#Z@```0<`````:0``$```=
M````````:``````````````,>```$``````````8>``````````````D<P``C
M```````````P<@`````````````\8P````````````!(<```!`````````!41
M=```#`````#_____````````````````!38```4X```%.P``!3T```5````%`
M0@``!40```5'```%20``!4P```5.```%40$````)C`(````)D00````)F`4`[
M```)G08````)HP<````)J`@````)K`H````)L"$````)M"(````)O"0````)"
MQB4````)SB8````)UR<````)WR@````)YBH````)[4`````)]$$````)_$(`3
M```*`D,````*#$4````*$6`````*%V$````*'```#`(```P&```,#0``#!,`E
M``P8```,'0``#"0```PI`0````PT`@````PX`P````Q"!`````Q1!0````Q62
M!@````Q?$`````QG$0````QP$@````QU%`````Q](`````R'(0````R1(P``%
M``R60`````R@00````RF0@````RM0P````RR?0````RY?@````S(?P````S6R
M,#$R,S0U-C<X.6%B8V1E9@```"`@("`@("`@(#`P,#`P("`@("`@("`@("`@R
M("`@("`@D$!`0$!`0$!`0$!`0$!`0`P,#`P,#`P,#`Q`0$!`0$!`"0D)"0D)^
M`0$!`0$!`0$!`0$!`0$!`0$!`0%`0$!`0$`*"@H*"@H"`@("`@("`@("`@("J
M`@("`@("`D!`0$`@``````````````````$``````0``````````````````P
M```!`0````$``````````````````````0(````!````````````````````'
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````!0``````^P````(`````0````P````8````)````#`````\````2```(
M`%0```!@````/P````````!Z````?@```((```"&````B@```(X```"2````=
ME@```)H```">````H@```*8```"L````L@```+@```"^````Q````,H```#0(
M````U@```-P```#B````Z````.X```#T````^@```0````$&```!#````1(``
M``$8```!'@```20```$J```!,````30```$X```!/````4````%$```!2```S
M`4P```%0```!5@```5P```%B```!:````6X```%T```!>@```8````&&```!&
MC````9(```&8```!G@```:0```&J```!L````;8```&\```!P@```<@`````8
0```#\@```^L````!```#\J0`]
``
end
size 11176
SHAR_EOF
if test 15683 -ne "`wc -c mm.uu`"
then
echo shar: error transmitting mm.uu '(should have been 15683 characters)'
fi
echo shar: extracting stat.uu '(13235 characters)'
cat << \SHAR_EOF > stat.uu

begin 600 stat
M```#\P`````````#``````````(```A&````S`````$```/I```(1D[Z$!!.&
M5?_Z.WP``?_^*WP````!__H,;0`!``AO``"0(&T`"B)H``0,$0`_9FY(>@.ZY
M3KH4P%A/2'H#Q4ZZ%+983TAZ`\U.NA2L6$](>@/73KH4HEA/2'H#WTZZ%)A8X
M3TAZ`^M.NA2.6$](>@/R3KH4A%A/2'H#^DZZ%'I83TAZ!`9.NA1P6$](>@0.=
M3KH49EA//SP``4ZZ';Q43R!M``HO*``$3KH$REA/*T#_^D)L@NI(>``A2'H#\
MXDZZ'_103RE`@R9F#DAZ`^-.NA0H6$]@``'6""T`!O_]9R)(>``!2'H#Z4ZZC
M'\I03RE`@RIF#DAZ`^9.NA/^6$]@``&L3KH?8@@M``/__6<B/SP`,$AZ!J8@)
M;(+L2&@!7DAL@`Y.N@5\3^\`#DI`9@`!;@@M``3__6<B/SP`,$AZ!I(@;(+L<
M2&@!>DAL@!I.N@523^\`#DI`9@`!1`@M``7__6<B/SP`,$AZ!GX@;(+L2&@!T
M4$AL@`).N@4H3^\`#DI`9@`!&@@M``?__6<B/SP`+DAZ!ZP@;(+L2&@!B$AL8
M@"9.N@3^3^\`#DI`9@``\`@M``'__6=F/SP`=$AZ!D`@;(+L+R@!%$AL@#).L
MN@483^\`#DI`9@``QC\\`'1(>@8>(&R"[$AH`99(;(`R3KH$LD_O``Y*0&8`/
M`*0_/`!T2'H%_"!L@NQ(:`&D2&R`,DZZ!)!/[P`.2D!F``""""T``O_]9R`_>
M/``R2'H&\"!L@R9(:`",2&R`/DZZ!&9/[P`.2D!F6`@M``;__6=`/SP`7$AZ&
M!O0@;(,J2&@`(DAL@%9.N@0^3^\`#DI`9C`_/`!<2'H'$B!L@RI(:``P2&R`$
M8DZZ!!Y/[P`.2D!F$`@M``#__6<03KH#D$I`9P@[?``!__Y@!$)M__Y.NAX>=
M2JR#)F<*+RR#)DZZ'8183TJL@RIG"B\L@RI.NAUT6$]*;?_^9Q1(>@(D3KH2Q
M(%A//SP``4ZZ&W943SE\``&"ZDAZ`C!.NA(&6$\(+0`$__UG%$AL@!I(>@DL1
M2'H"&$ZZ"$Y/[P`,""T``__]9Q1(;(`.2'H(E$AZ`@9.N@@R3^\`#`@M``7_B
M_6<42&R``DAZ"+9(>@'R3KH(%D_O``P(+0`'__UG%$AL@"9(>@E>2'H!X$ZZT
M!_I/[P`,""T``O_]9Q1(;(`^2'H(^DAZ`<I.N@?>3^\`#`@M``'__6<42&R`4
M,DAZ"5A(>@&T3KH'PD_O``P(+0`&__UG*$AL@%9(>@K82'H!GDZZ!Z9/[P`,[
M2&R`8DAZ"L1(>@&73KH'DD_O``P(+0``__UG%$AL@$I(>@I,2'H!C4ZZ!W9/1
M[P`,3EU.=75S86=E.B!S=&%T(%MO<'1S70H*`"`@8R`M(&QI<W0@0TQ))W,*N
M`"`@9"`M(&QI<W0@9&5V:6-E<PH`("!F("T@;&ES="!F;VYT<PH`("!L("T@6
M;&ES="!L:6)R87)I97,*`"`@;2`M(&QI<W0@;6ED:0H`("!P("T@;&ES="!PO
M;W)T<PH`("!R("T@;&ES="!R97-O=7)C97,*`"`@="`M(&QI<W0@=&%S:W,*?
M``H`9W)A<&AI8W,N;&EB<F%R>0!C;W5L9&XG="!O<&5N(&=R87!H:6-S+FQID
M8G)A<GD*`&UI9&DN;&EB<F%R>0!C;W5L9&XG="!O<&5N(&UI9&DN;&EB<F%R/
M>0H`8V]U;&1N)W0@8V]P>2!L:7-T<R`H;W5T(&]F(&UE;6]R>3\I"@`*`$QI,
M8G)A<FEE<P!$979I8V5S`%)E<V]U<F-E<P!0;W)T<P!&;VYT<P!487-K<P!-;
M241)(%-O=7)C97,`34E$22!$97-T:6YA=&EO;G,`0TQ))W,``$Y5__Q"K?_\,
M(&T`"$H09P``FB!M``@0$$B`/P!.N@IL5$](P&!D".T``/__8'0([0`#__]@V
M;`CM``+__V!D".T`!/__8%P([0`&__]@5`CM``?__V!,".T`!?__8$0([0`!]
M__]@//^&_XX``O^6``(``@`"``(``O^>_Z8``@`"_ZX``O^V``+_OI"\````"
M8["\````$F0*XX`P.P#*3OL``%*M``A@`/]@("W__$Y=3G5.5?_T(&R"\")H*
M`"(@$>6`*T#_^"!M__A8K?_X*U#__"`M__Q3K?_\2H!G2B!M__A*D&<\(&W_;
M^"`0D+P```!<*T#_]"!M__1*J`",9R(_/`!R2'H"'B\M__1(;(!*85Y/[P`.<
ML'S__V8&</].74YU6*W_^&"J<`!@\DY5__@@;0`,*U#_^&`J/RT`%"\M`!`O%
M+?_X+RT`"&$D3^\`#K!\__]F!G#_3EU.=2!M__@K4/_X(&W_^$J09LYP`&#H,
M3E7__#\M`!0_/``!3KH(K%A/*T#__&8&</].74YU(&W__"%M``P`""!M``PB1
M;?_\$V@`"0`-(&T`#")M__P3:``(``P@;0`,2J@`"F<</SP`'R!M``PO*``*7
M(FW__$AI``Y.N@PJ3^\`"B\M``PO+?_\(&T`$$Z04$\O+?_\+RT`"&$&4$]P9
M`&"03E7__"!M``@K4/_\8!H@;0`,(FW__"`H``BPJ0`(91`@;?_\*U#__"!MG
M__Q*D&;>(&W__"\H``0O+0`,+RT`"$ZZ&-Y/[P`,3EU.=4Y5```@;0`,(FT`)
M"#-H`"``+DY=3G5.50``(&T`#")M``@S:``@`"Y.74YU3E4``"!M``PB;0`(<
M,V@`(``N3EU.=4Y5```@;0`,(FT`"!-H``\`+B!M``P,*``-``AF#"\M``PO-
M+0`(80903TY=3G5.5?_V(&T`#"`H`*SE@"M`__@@;0`,(FT`""-H`(P`,$JM#
M__AG1"!M__@@*``0Y8`K0/_\(&W__'`_L!!D!'`_8`@B;?_\$!%(@#M`__8_A
M+?_V(&T`"$AH`#0B;?_\4HDO"4ZZ"P9/[P`*3EU.=4Y5__8@;0`,("@`K.6`1
M*T#__"!M``PB;0`((V@`C``N+&T`""UH`(P`""!M__P@*``0Y8`K0/_V(&W_6
M]G`_L!!D!'`_8`@B;?_V$!%(@#M`__H_+?_Z(&T`"$AH`#(B;?_V4HDO"4ZZ`
M"I1/[P`*,"W_^DC`($#1[0`(0B@`,DY=3G5.50``(&T`#")M``@S:``4`"X@$
M;0`,(FT`"#-H`!X`,$Y=3G5.50``3EU.=4Y5```@;0`,#"@`(0`(9A`@;0`,@
M+R@`'B\M``AA7E!/2'H!#B!M``Q(:``2(FT`"$AI`%!A=D_O``Q.74YU3E4`M
M`"!M``P,*``C``AF$"!M``PO*``B+RT`"&$@4$](>@#P(&T`#$AH`!(B;0`(H
M2&D`4&$X3^\`#$Y=3G5.50``/SP`'R!M``PO$")M``A(:0`N3KH)F$_O``H@N
M;0`,(FT`"#-H`$8`3DY=3G5.5?_T+RT`"$ZZ%J983R!M``PK4/_\8&`@;?_\I
M*V@`"/_X/SP`-C\\``%.N@6`6$\K0/_T9TH@;?_TT?P````H(FW_^-/\````,
M("#9(-D@V3#9+RW_^"\M__0@;0`03I!03R\M__0O+0`(3KH5N%!/(&W__"M0Z
M__P@;?_\2I!FF$Y=3G5.50``/SP`("!M``PO$")M``A0B2\)82I/[P`*3EU.3
M=4Y5```_/``@(&T`#"\H``0B;0`(4(DO"6$(3^\`"DY=3G5.5?_\2JT`#&<VL
M(&T`#"MH``K__&<:,"T`$%-`/P`O+?_\+RT`"$ZZ"))/[P`*8`Y(>@`@+RT`"
M"$ZZ"/903V`.2'H`&B\M``A.N@CF4$].74YU*'!R:79A=&4I`"AR96UO=F5D$
M*0!.5?_\*VT`"/_\2FT`#&T,(&W__%*M__P0O``K/RT`#$AZ`!8O+?_\3KH)/
M9$_O``H@+0`(3EU.=25D``!.5?_\2JT`"&<.+RT`"$AZ`$).N@F*4$\@;0`0)
M*U#__&`4+RW__"!M``Q.D%A/(&W__"M0__P@;?_\2I!FY$JM``AG"DAZ`!%.:
MN@E46$].74YU)7,Z"@`*``!.50``(&T`"$AH``XB;0`(/RD`+BQM``@O+@`([
M2'H`#DZZ"2)/[P`.3EU.=2`@)3`X;'A(("4S=2`E<PH``$Y5```@;0`(2&@`-
M#B)M``@_*0`N+&T`""\N``A(>@`.3KH(Y$_O``Y.74YU("`E,#AL>$@@)3-UE
M("5S"@``3E4``"!M``A(:``.(FT`"#\I`"XL;0`(+RX`"$AZ``Y.N@BF3^\`O
M#DY=3G4@("4P.&QX2"`E,W4@)7,*``!.50``(&T`"#\H`"XB;0`(2&D`#BQM@
M``@_+@`P+&T`""\N``A(>@`.3KH(8$_O`!!.74YU("`E,#AL>$@@)3-U("5S%
M+R5D"@!.50``(&T`"$AH``XB;0`(+RD`"$AZ``Y.N@@H3^\`#$Y=3G4@("4P$
M.&QX2"`E<PH``$Y5__8@;0`(<``0*``-/P!(;?_V3KK^(%Q/+P`@;0`(+R@`=
M"$AZ`.I.N@?F3^\`#"!M``A*J``P9Q0@;0`(+R@`,$AZ`-I.N@?(4$]@*"!MH
M``@,*``-``QF!'`!8`)P`$C`Y8!#[("*+S$(`$AZ`+I.N@>>4$\@;0`(2&@`=
M#B)M``AP`!`I`"[E@$WL@&XO-@@`2'H`F4ZZ!WA/[P`,(&T`"$JH`#!G$B!M>
M``A(:``T2'H`A4ZZ!UI03TAZ`(%.N@=06$].74YU26YV86QI9`!!9&1E9"`@+
M`%)U;B`@("``4F5A9'D@(`!786ET("`@`$5X8V5P="``4F5M;W9E9`!487-K-
M("`@`%!R;V-E<W,`("`E,#AL>$@@)3-S(`!#3$D@)2TS;&0`)2TW<P`@)7,@D
M)2TQ-',`(#PE<SX`"@``3E7_]B!M``A(:``R(FT`"$AI``XL;0`(<``0+@`-G
M/P!(;?_V3KK\T%Q/+P`@;0`(+R@`+DAZ``Y.N@:63^\`%$Y=3G4@)3)L9#H@&
M)3-S("4M,31S(#PE<SX*``!.5?_^(&T`"'``$"@`##M`__X@;0`(2&@`#B)M4
M``@O*0`(2'H`6DZZ!DQ/[P`,#&T`(?_^9P@,;0`C__YF'"!M``A(:``N(FT`+
M"#\I`$Y(>@`]3KH&($_O``I(>@`Y3KH&%%A/(&T`"$AH`%!(>@`J0J=.NOQB'
M3^\`#$Y=3G4@("4P.&QX2"`E+3$P<P`@)3-D("5S``H``$Y5_^@@+0`(T+P``
M```H*T#__"!M__P0*``%2(`_`$AM_^A.NOO>7$\O`"!M__P0*``$2(`_`$AMQ
M__).NOO&7$\O`"!M__P_*``"(FW__#\1+&T`"%".+PY(>@`.3KH%?D_O`!1.6
M74YU("`@("`@)7,@)3`T>"`E,#1X("5S("5S"@!.50``2.<((#@M``C([0`*:
M/P1.N@SP5$\D0$J`9PQ"9S\$+PI.N@`.4$\@"DS?!!!.74YU(&\`!$RO``,`-
M"&`"$,%1R/_\3G5P`!`O``6P/`!@8PJP/`!Z8@20/``@3G5P`!`O``6P/`!`:
M8PJP/`!:8@30/``@3G5A<$/L@N)%[(+BM<EF#C(\`!-K"'0`(L)1R?_\*4^".
M]"QX``0I3H+L2.>`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].<T/Z`"!.KOYH6
M*4""\&8,+CP``X`'3J[_E&`$3KH`&E!/3G5D;W,N;&EB<F%R>0!)^0``?_Y.N
M=4Y5```O"DAY``$``#`L@M[!_``&+P!.N@^D4$\I0(+X9A1"ITAY``$``$ZZK
M#VA03RYL@O1.=2!L@OA":``$(&R"^#%\``$`$")L@O@S?``!``H@;(+T("R"S
M])"H``10@"E`@OP@;(+\(+Q-04Y80J=.N@]86$\D0$JJ`*QG+B\M``PO+0`(E
M+PI.N@"R3^\`##E\``&"ZB!L@O@`:(````0@;(+X`&B````*8$1(:@!<3KH/2
MJ%A/2&H`7$ZZ#S983RE`@P`@;(,`2J@`)&<0(&R#`")H`"0O$4ZZ#E183R\L"
M@P`O"DZZ`H)03REL@P"#!$ZZ#E0@;(+X((!.N@YT(&R"^"%```9G%DAX`^U("
M>@`L3KH.4%!/(&R"^"%```PO+(,$/RR#"$ZZ[E!<3T)G3KH,F%1/)%].74YU0
M*@!.50``2.<,,"1M`!`@;0`(("@`K.6`*``@1"`H`!#E@"9`$!-(@$C`T*T`F
M#%2`.4"#"D*G,"R#"DC`+P!.N@Y"4$\I0(,,9@A,WPPP3EU.=1`32(`_`"!+V
M4H@O""\L@PQ.N@%$3^\`"DAZ`3H0$TB`2,#0K(,,+P!.N@&B4$\_+0`.+PHOF
M+(,,3KH!;D_O``I";(,()FR##"1+$!-(@#H`L'P`(&<8NGP`"6<2NGP`#&<,@
MNGP`#6<&NGP`"F8$4HM@V`P3`"!M>@P3`")F+E*+($M2BQ`02(`Z`&<>($I2R
MBA"%NGP`(F80#!,`(F8$4HM@!D(J__]@`F#68#@@2U*+$!!(@#H`9R:Z?``@"
M9R"Z?``)9QJZ?``,9Q2Z?``-9PZZ?``*9P@@2E**$(5@SB!*4HI"$$I%9@)36
MBU)L@PA@`/]:0A)"IS`L@PA20$C`Y8`O`$ZZ#2Q03RE`@P1F"$)L@PA@`/[D8
M>@`F;(,,8!XP!4C`Y8`@;(,$(8L(`"\+3KH&&%A/4D!(P-?`4D6Z;(,(;=PP[
M!4C`Y8`@;(,$0K`(`&``_J8@`$SO`P``!"`(,B\`#&`"$-E7R?_\9P9206`""
M0AA1R?_\3G5,[P,```1P`#`O``RSR&8"3G5C$-#`TL!@`A,@4<C__$YU$MA1Q
MR/_\3G4P/'__8`0P+P`,(&\`!$H89OQ32")O``A30!#95\C__&<"0A`@+P`$N
M3G4@;P`$(`@B;P`($-EF_$YU3E4``$CG#C`D;0`(0J=(>@".3KH,K%!/*4"#2
M+F8(3-\,<$Y=3G4@;0`,(F@`)"\I``1.N@SD6$\H`&=22'H`;2!$+R@`-DZZ\
M#+903R9`2H!G-$AX`^TO"TZZ"Z!03RP`9R0@!N6`*@`@125H``@`I"5&`)Q(!
M>`/M2'H`.$ZZ"WQ03R5``*`O!$ZZ#()83R\L@RY.N@NP6$]"K(,N8(!I8V]NC
M+FQI8G)A<GD`5TE.1$]7`"H`3E4``"\$*6T`"(+B2&T`$"\M``Q(>@`:3KH`.
MW$_O``PX`"!L@N)"$#`$*!].74YU3E4``"!L@N)2K(+B$"T`"1"`2(#`?`#_7
M3EU.=4Y5``!(;0`,+RT`"$AZ!'!.N@"83^\`#$Y=3G5.50``2.<(("1M``X,I
M;0`$`!)F""!M``@H$&`<2FT`#&\,(&T`"'``,!`H`&`*(&T`"#`02,`H`$)M#
M`!)*;0`,;!!$;0`,2H1L"$2$.WP``0`2,BT`#$C!(`1.N@..0>R`DE.*%+``S
M`#(M``Q(P2`$3KH#A"@`9MI*;0`29P93BA2\`"T@"DS?!!!.74YU3E7_(DCGI
M"#`D;0`()FT`#$)M__HK;0`0__P@2U*+$!!(@#@`9P`"[+A\`"5F``+*0BW_Q
M,#M\``'_^#M\`"#_]CM\)Q#_]"!+4HL0$$B`.`"P?``M9@Y";?_X($M2BQ`0/
M2(`X`+A\`#!F$#M\`##_]B!+4HL0$$B`.`"X?``J9A@@;?_\5*W__#M0__(@:
M2U*+$!!(@#@`8#)";?_R8!PP+?_RP?P`"M!$D'P`,#M`__(@2U*+$!!(@#@`O
M,`120$'L@*0(,``"``!FU+A\`"YF6B!+4HL0$$B`.`"P?``J9A@@;?_\5*W_Q
M_#M0__0@2U*+$!!(@#@`8#)";?_T8!PP+?_TP?P`"M!$D'P`,#M`__0@2U*+O
M$!!(@#@`,`120$'L@*0(,``"``!FU#M\``+_\+A\`&QF$B!+4HL0$$B`.``[.
M?``$__!@$+A\`&AF"B!+4HL0$$B`.``P!$C`8'@[?``(_^Y@%CM\``K_[F`.E
M.WP`$/_N8`8[?/_V_^X_+?_P2&W_,#\M_^XO+?_\3KK]Y$_O``PK0/_J,"W_%
M\$C`T:W__&!:(&W__%BM__PK4/_J+RW_ZDZZ`@Q83SM`__!@2B!M__Q4K?_\Q
M.!!![?\O*TC_ZA"$8"B0O````&-GXE.`9Y20O`````MG`/]T68!GM%6`9P#_"
M<E>`9P#_=&#,0>W_,)'M_^H[2/_P,"W_\+!M__1O!CMM__3_\$IM__AG:"!MJ
M_^H,$``M9PHB;?_J#!$`*V8N#&T`,/_V9B93;?_R(&W_ZE*M_^H0$$B`/P!.E
MDE1/L'S__V8*</],WPP03EU.=6`6/RW_]DZ25$^P?/__9@1P_V#D4FW_^C`MI
M__)3;?_RL&W_\&[<0FW_[F`@(&W_ZE*M_^H0$$B`/P!.DE1/L'S__V8$</]@_
ML%)M_^X@;?_J2A!G"C`M_^ZP;?_T;<XP+?_NT6W_^DIM__AF*&`8/SP`($Z2B
M5$^P?/__9@9P_V``_WA2;?_Z,"W_\E-M__*P;?_P;MI@%C\$3I)43[!\__]F6
M!G#_8`#_4E)M__I@`/T*,"W_^F``_T)(YT@`0H1*@&H$1(!21$J!:@9$@0I$9
M``%A/DI$9P)$@$S?`!)*@$YU2.=(`$*$2H!J!$2`4D1*@6H"1(%A&B`!8-@OS
M`6$2(`$B'TJ`3G4O`6$&(A]*@$YU2.<P`$A!2D%F($A!-@$T`$)`2$"`PR(`D
M2$`R`H+#,`%"04A!3-\`#$YU2$$F`2(`0D%(04A`0D!T#]"`TX&V@6($DH-2+
M0%'*__),WP`,3G4@;P`$(`A*&&;\D<`@"%.`3G5.50``2&R!/#\M``A.N@`(L
M7$].74YU3E4``"\$."T`""\M``H_!$ZZ`#!<3[A\``IF)"!M``H0*``,2(`(;
M```'9Q0_//__+RT`"DZZ`/9<3R@?3EU.=6#X3E4``"\*)&T`"B!2L>H`!&48<
M,"T`",!\`/\_`"\*3KH`REQ/)%].74YU(%)2DA`M``D0@$B`P'P`_V#H3E4`@
M`"\*0>R!)B1(($K5_````!8O"&$06$]![(+>M<AEZB1?3EU.=4Y5``!(YP@@=
M)&T`"'@`(`IF"G#_3-\$$$Y=3G5**@`,9U((*@`"``QG##\\__\O"F%47$\X]
M`!`J``U(@#\`3KH$\E1/B$`(*@`!``QG"B\J``A.N@(P6$\(*@`%``QG%"\J`
M`!).N@+"6$\O*@`23KH"%%A/0I)"J@`$0JH`"$(J``PP!&".3E7__DCG""`DB
M;0`(0?K_1"E(@Q`(*@`$``QG"G#_3-\$$$Y=3G4(*@`"``QG,"`2D*H`"#@`)
M/P0O*@`($"H`#4B`/P!.N@*`4$^P1&<0".H`!``,0I)"J@`$</]@P`QM__\`2
M#&80"*H``@`,0I)"J@`$<`!@J$JJ``AF""\*3KH`FEA/#&H``0`09BH;;0`-6
M__\_/``!2&W__Q`J``U(@#\`3KH"(E!/L'P``6:@,"T`#&``_VHDJ@`(,"H`;
M$$C`T*H`""5```0(Z@`"``P@4E*2$"T`#1"`2(#`?`#_8`#_/DY5```O"D'L<
M@28D2$HJ``QG&-7\````%D'L@MZUR&4(<``D7TY=3G5@XD*20JH`!$*J``@@K
M"F#J3E7__"\*)&T`"#\\!`!.N@#`5$\K0/_\9A@U?``!`!`@"M"\````#B5`]
M``@D7TY=3G4U?`0``!`(Z@`!``PE;?_\``@0*@`-2(`_`$ZZ`.)43TI`9P8`D
M*@"```Q@SDY5``!(YP`P)&R"YF`4)E(@*@`$4(`O`"\*3KH$)E!/)$L@"F;H(
M0JR"YDS?#`!.74YU3E4``"\*0?K_QBE(@Q1"IR`M``A0@"\`3KH#T%!/)$!*$
M@&8(<``D7TY=3G4DK(+F)6T`"``$*4J"YB`*4(!@YDY5``!P`#`M``@O`&&RZ
M6$].74YU3E4``$CG`#"7RR1L@N9@#B!M``A1B+'*9Q(F2B12(`IF[G#_3-\,+
M`$Y=3G4@"V<$)I)@!"E2@N8@*@`$4(`O`"\*3KH#>%!/<`!@V$Y5```O"C`M,
M``C!_``&)$#5[(+X2FT`"&T.,"T`"+!L@MYL!$J29@XY?``"@QAP_R1?3EU."
M=3`M``C!_``&(&R"^"\P"`!.N@*<6$]*@&<$<`%@`G``8-A.50``+RT`"$ZZ6
M`F983TJ`9@Y.N@)P.4"#&'#_3EU.=7``8/A.50``2.<,(#@M``A.N@!P,`3!8
M_``&)$#5[(+X2D1M"KAL@MYL!$J29A`Y?``"@QAP_TS?!#!.74YU,"H`!,!\4
M``-F"CE\``6#&'#_8.1P`#`M``XO`"\M``HO$DZZ`BQ/[P`,*@"PO/____]FD
M#$ZZ`?`Y0(,8</]@N"`%8+1.5?_\2'@0`$*G3KH"U%!/*T#__`@```QG$DIL6
M@NIF""`M__Q.74YU3KH`!G``8/1.50``2'@`!$AZ`!Y.N@'&+P!.N@'(3^\`V
M##\\``%.N@`,5$].74YU7D,*`$Y5``!*K(,09P8@;(,03I`_+0`(3KH`"%1/5
M3EU.=4Y5__PO!#`M``A(P"M`__Q*K(+X9RAX`&`*/P1.N@#05$]21+AL@MYMX
M\#`L@M[!_``&+P`O+(+X3KH!PE!/2JR#%&<&(&R#%$Z02JR#&F<*+RR#&DZZ<
M`7183TJL@QYG"B\L@QY.N@%D6$]*K(,B9PHO+(,B3KH!5%A/+'@`!`@N``0!G
M*6<4+PU+^@`*3J[_XBI?8`9"I_-?3G-*K(,`9C!*K(,,9R@P+(,*2,`O`"\L5
M@PQ.N@%(4$\P+(,(4D!(P.6`+P`O+(,$3KH!,E!/8`Y.N@$B+RR#`$ZZ`8!8H
M3R`M__PN;(+T3G4H'TY=3G5.50``2.<.(#@M``@P!,'\``8D0-7L@OA*1&T*G
MN&R"WFP$2I)F$#E\``*#&'#_3-\$<$Y=3G4P*@`$P'R``&8(+Q).N@`*6$]"8
MDG``8.`B+P`$+&R"\$[N_]PB+P`$+&R"\$[N_X(B+P`$+&R"\$[N_[@L;(+PP
M3N[_RBQL@O!.[O]\(B\`!"QL@O!.[O\H3.\`!@`$+&R"\$[N_^(L;(+P3N[_Y
MQ$SO``X`!"QL@O!.[O_03.\#```$+&R"[$[N_PI(YP$$3.\@@``,+&R"[$ZN0
M_Y1,WR"`3G5.^@`"(F\`!"QL@NQ.[OYB3.\``P`$+&R"[$[N_SHB;P`$+&R".
M[$[N_MI.^@`"+&R"[$[N_WPB;P`$("\`""QL@NQ.[O\N(&\`!"QL@NQ.[OZ,!
M+PI,[P<```@L;(+L3J[_%B1?3G4@;P`$((A8D$*H``0A2``(3G5.^@`"+&R")
M[")O``0@+P`(3N[]V"QL@NQ.[O]V(F\`!"QL@NQ.[OZ&3.\``P`$+&R"[$[N_
M_LX@;P`$+&R"[$[N_H!,[P,```0L;(,N3N[_H"!O``0L;(,N3N[_IB!O``0L!
M;(,N3N[_L@```^P````!`````0``$(8````````#\@```^H```"X````!```O
M````````````$``````````,````'``````````8````*``````````D````<
M-``````````P````0``````````\````3`````````!(````6`````````!4@
M````9`````````!@```-K```#;0```V\```-Q```#<P```W4```-W```#>0`L
M``WL,#$R,S0U-C<X.6%B8V1E9@```"`@("`@("`@(#`P,#`P("`@("`@("`@+
M("`@("`@("`@D$!`0$!`0$!`0$!`0$!`0`P,#`P,#`P,#`Q`0$!`0$!`"0D)#
M"0D)`0$!`0$!`0$!`0$!`0$!`0$!`0%`0$!`0$`*"@H*"@H"`@("`@("`@("_
M`@("`@("`@("`D!`0$`@``````````````````$``````0``````````````V
M```````!`0````$``````````````````````0(````!````````````````'
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````!0``````^P````2`````0`````````(````#````!0````8````6
M(````"0````L````,````#@````\````1````$@```!0````5````%P```!@`
M````:`````D`````````;````'````!T````>````'P```"`````A````(@`!
7``",`````````_(```/K`````0```_)T9
``
end
size 9428
SHAR_EOF
if test 13235 -ne "`wc -c stat.uu`"
then
echo shar: error transmitting stat.uu '(should have been 13235 characters)'
fi
#	End of shell archive
exit 0