[comp.sources.amiga] v91i076: CASIO - download 16-bit samples from a Casio FZ-1 to an Amiga, Part01/01

amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (03/29/91)

Submitted-by: karl@sugar.hackercorp.com (Karl Lehenbauer)
Posting-number: Volume 91, Issue 076
Archive-name: midi/casio/part01

[ includes uuencoded executables  ...tad ]

Here is my program to download 16-bit samples from a Casio FZ-1 to an Amiga.
You'll need Bill Barton's MIDI library, version 2, to make it work.
Also to do much useful with it, you'll need a Casio FZ-1 (the kicker), and 
FZIFF, a companion program (simultaneously posted) to downconvert the 16-bit 
samples to the 8-bit Amiga IFF 8SVX format.

Audiomaster, or equivalent, is also required to do some tweaking,
see the README in the FZIFF kit for details.  These requirements
limit the potential audience of the program a good deal of course,
but the people that do have the necessary prerequisites will be able
to create Amiga sounds of unparalleled quality.

#!/bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 1)."
# Contents:  Makefile README casio.c casio.h casio.uu cleanup.c
#   dumpvoice.c fz1.h hilo.c hilo.uu prototypes.h timer.c
# Wrapped by tadguy@ab20 on Thu Mar 28 11:19:52 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(205 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
Xall: casio hilo
X
XOFILES= casio.o timer.o 
X
XCFLAGS= -bs
X
XSDBFLAGS= -g
X
Xcasio:	$(OFILES)
X	ln $(SDBFLAGS) $(OFILES) -lhack -lc
X
Xdebug:
X	cc -n casio.c
X	ln +q -g casio.o -lmidi -lc
X
Xhilo:	hilo.o
X	ln hilo.o -lc
END_OF_FILE
if test 205 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(3066 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
XHere is CASIO, a primitive program to download 16-bit voices from the
XCasio FZ-1 synthesizer to the Amiga computer.
X
XThis program only has a limited audience, but for those who have an
XFZ-1 and want the ultimate in sample quality on the Amiga, it will
Xbe a godsend.
X
XYou'll need Bill Barton's MIDI library, version 2.0.  It's around,
Xon Fred Fish disks, archive sites, etc.  Contact me for it as a last
Xresort.
X
XThe program includes the binary, CASIO, and the source code, plus a
XMakefile for Aztec C 5.0 or later.
X
XTo use CASIO, get your Casio FZ-1 MIDI'ed up bidirectionally to the Amiga
X(out-to-in and in-to-out, the Amiga needs a bidirectional link so it can
Xack or nack the packets as it receives them)
X
XVerify the link with some other program that you know works.
X
XFinally, use the Casio front panel to select an output device of
XMIDI, run CASIO with an argument being the filename you want
Xwritten on the Amiga, as in "casio train_whistle", then select
X"voice dump" on the Casio and hit "save".
X
XThe Casio firmware is sensitive to data errors at the wrong point in the
Xprotocol, so if you get one, your Casio will hang and it will have
Xto be power-cycled.  Thus it's probably a good idea to save a killer
Xvoice to disk on the Casio before trying to download it to the Amiga,
Xjust in case.
X
XRemember that MIDI is pretty slow for samples, MIDI goes at 3000 bytes
Xper sample, but the transfer format only sends 4 bits per byte, plus
Xthere are delays for acks, so for example a 100 Kbyte sample would
Xtake at least a couple of minutes to transfer.  You should see the
Xsame indication on the Casio you see when it is saving to disk (a moving
Xblip), but it will move much, much slower when going to MIDI.
X
XTo convert the raw 16-bit data of the Casio FZ-1 over to the Amiga
XIFF 8SVX sample format, use my FZIFF program, a companion release.
X
XNote that the Amiga cannot play back a sample faster than around
X25,000 samples per second.  This pretty much dictates that you use
Xthe 18K sample rate on the Casio when sampling for the Amiga.
X
XMy recently posted SMUS player is particularly useful with
Xthese samples, because you can create multisampled instruments that
Xdo not suffer from the one-sample-per-octave and each-sample-must-be-
Xof-exactly-the-same-length problems that the IFF 8SVX.
X
XThe program HILO, which is included, simply traverses a sample file
Xyou've received from your FZ-1 and prints the highest and lowest
Xsample values found.  The highest possible value is 32767 and the
Xlowest is -32768.  If you run it and the values aren't in this
Xvicinity, you might want to resample at a higher volume.  Of course
Xif they're exactly those values or really really close, the voulme
Xmight be too high, resulting in distortion.  If it's just close, you
Xusually won't notice -- let your ear be the judge.  This distortion
Xusually shows up as a sort of crackling sound when played back, or when
Xplayed back on the Amiga.
X
XShare and Enjoy,
X
XKarl Lehenbauer
X3918 Panorama
XMissouri City, TX  77459
X
XInternet/BITNET: karl@sugar.hackercorp.com
XUsenet: uunet!sugar!karl
X
END_OF_FILE
if test 3066 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'casio.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'casio.c'\"
else
echo shar: Extracting \"'casio.c'\" \(10606 characters\)
sed "s/^X//" >'casio.c' <<'END_OF_FILE'
X/* casio - download sample data from a casio fz-1 */
X
X/* Copyright (C) 1988 Hackercorp.   All Rights Reserved */
X
X#include <libraries/dos.h>
X#include <clib/macros.h>
X#include <midi/midi.h>
X#include <functions.h>
X#include <stdio.h>
X#include <devices/timer.h>
X
X#include "casio.h"
X#include "prototypes.h"
X
Xchar *program_name = "casio fz1 download program";
X
X#define CheckMsg(m) (m->mp_MsgList.lh_Head->ln_Succ != 0)
X
Xextern struct timerequest *timer_request;
X
X/* message ids for fz-1 system exclusive messages */
X#define OPEN_MIDI_MSG 0x70
X#define CLOSE_MIDI_MSG 0x71
X#define OK_MIDI_MSG 0x72
X#define ERR_MIDI_MSG 0x73
X#define DATA_MIDI_MSG 0x74
X#define EFFECT_MIDI_MSG 0x76
X#define REMOTE_MIDI_MSG 0x7f
X
X/* additional messages I define as responses from its_an_fz1_message */
X#define NOT_A_FZ_MESSAGE 0
X#define NOT_THE_REQUESTED_FZ_CHANNEL 1
X#define DATA_ERROR 2
X
X/* states for the i/o loop */
X#define WAITING_FOR_OPEN 0
X#define READING_FZ_DATA 1
X
X#define MAX_RETRIES 10
X
X#define CAPTURE_BUFFER_SIZE 16384
XUBYTE capture_buffer[CAPTURE_BUFFER_SIZE];
X
Xvoid *MidiBase = NULL;
Xvoid *IntuitionBase = NULL;
X
Xstruct MDest *dest = NULL;
Xstruct MSource *source = NULL;
X
Xstruct MRoute *route_a = NULL;
Xstruct MRoute *route_b = NULL;
X
XUBYTE *msg;		    /* buffer this in case we get shut down before freeing the current message */
X
Xint capture_position = 0;
X
Xvoid midi_cleanup(void)
X{
X    /* if (msg) 
X		FreeMidiMsg(msg); */
X
X	if (IntuitionBase)
X		CloseLibrary(IntuitionBase);
X
X    if (dest) 
X		DeleteMDest(dest);
X	if (source)
X		DeleteMSource(source);
X
X	if (route_a)
X		DeleteMRoute(route_a);
X	if (route_b)
X		DeleteMRoute(route_b);
X
X    if (MidiBase) 
X		CloseLibrary(MidiBase);
X}
X
X/* if channel is -1, any channel is ok (within FZ-1 System Exclusive message) */
X
X/* validate the incoming message, including all sorts of stuff about the header
X * and anything we know specifically within the message type as well */
X
XUBYTE its_an_fz1_message(UBYTE *msg, int requested_channel)
X{
X	int channel, length, expected_length;
X	struct FZ1_Message *p;
X
X	p = (struct FZ1_Message *)msg;
X
X	/* compare first bytes of message,
X	   extract channel number and verify,
X	   return function code
X	 */
X    length = MidiMsgLength(msg);
X
X	if ((p->casio_id != 0x44) || (p->fz1_id != 0x200)
X		|| ((p->encoded_channel & 0xf0) != 0x70))
X			return(NOT_A_FZ_MESSAGE);
X
X	channel = (p->encoded_channel & 0x0f);
X	if ((requested_channel != -1) && (channel != requested_channel))
X		return(NOT_THE_REQUESTED_FZ_CHANNEL);
X
X	switch(p->command)
X	{
X		case OPEN_MIDI_MSG:
X			expected_length = 16;
X			break;
X
X		case CLOSE_MIDI_MSG:
X			expected_length = 7;
X			break;
X
X		case DATA_MIDI_MSG:
X			expected_length =  136;
X			if (length == expected_length && (p->body.datamsg.checksum != calc_checksum(p)))
X			{
X				 fprintf(stderr,"checksum error, expected %x, saw %x\n",
X				 	p->body.datamsg.checksum,calc_checksum(p));
X				 return(DATA_ERROR);
X			}
X			break;
X
X		/* haven't seen any of these yet */
X		case OK_MIDI_MSG:
X		case ERR_MIDI_MSG:
X		case EFFECT_MIDI_MSG:
X		case REMOTE_MIDI_MSG:
X			panic("got a message I don't know how to handle");
X
X		/* it wasn't a message we understood yet it had all the makings of
X		 * being one, it must be garbled */
X		default:
X			return(DATA_ERROR);
X	}
X	if (length != expected_length)
X		return(DATA_ERROR);
X
X	return(p->command);
X}
X
Xvoid commune_with_fz1(struct MSource *source, struct MDest *dest, int channel, int outfd)
X{
X	long len;
X	UBYTE *ip;
X	int command, retry_count = 0;
X	int state = WAITING_FOR_OPEN;
X    ULONG waitflags;
X	int packets_received = 0, error_count = 0, done = 0;
X	struct FZ1_Message *p;
X
X	/* wait for a message or control-C or "done" control var to be set */
X	while ((!((waitflags = Wait(-1)) & SIGBREAKF_CTRL_C)) && !done)
X	{ 	
X		/* if ((waitflags & SIGBREAKF_CTRL_D) && (state = READING_FZ_DATA))
X		{
X			printf("saw a ^d\n");
X			goto data_error;
X		} */
X
X		/* while there are messages to process, process messages */
X		while (!done && (msg = GetMidiMsg(dest)))
X		{		
X			/* discard all but system exclusive data - should be done
X			 * by the route, check someday to see if we can find our
X			 * route and change it if it isn't */
X			if (*msg != MS_SYSEX)
X				goto message_done;
X
X			p = (struct FZ1_Message *)msg;
X			command = its_an_fz1_message((UBYTE *)p,channel);
X
X			if (state == WAITING_FOR_OPEN)
X			{
X				if (command != OPEN_MIDI_MSG)
X					panic("out of sync - looking for 'Open' from FZ1");
X
X				/* we need to specify a channel ID in our messages
X				 * if we're not looking for a specific one, reply
X				 * with the one we got in the first message */
X				if (channel == -1)
X					channel = p->encoded_channel & 0x0f;
X				state = READING_FZ_DATA;
X				dump_open(p);
X				send_fz(source,channel,OK_MIDI_MSG);
X				goto message_done;
X			}
X
X			if (state == READING_FZ_DATA)
X			{
X				abort_timeout_timer();
X				switch(command)
X				{
X					case DATA_MIDI_MSG:
X						send_fz(source,channel,OK_MIDI_MSG);
X						start_timeout_timer();
X						packets_received++;
X						if ((packets_received % 10) == 0)
X						{
X							printf("%4d ok \r",packets_received);
X							fflush(stdout);
X						}
X						capture(p,outfd);
X						retry_count = 0;
X						break;
X
X					case DATA_ERROR:
X					data_error:
X						send_fz(source,channel,ERR_MIDI_MSG);
X						start_timeout_timer();
X						printf("%4d err\r",packets_received);
X						fflush(stdout);
X						error_count++;
X						if (++retry_count > MAX_RETRIES)
X							panic("exceeded max retries for a packet - transfer failed");
X						break;
X
X					/* we get this when the fz is done */
X					case CLOSE_MIDI_MSG:
X						fprintf(stderr,"casio is done\n");
X						done = 1;
X						break;
X
X					default:
X						fprintf(stderr,"unknown command = 0x%x\n",command);
X						if (state = READING_FZ_DATA)
X						{
X							fprintf(stderr,"will try treating it as a data error\n");
X							goto data_error;
X						}
X						else
X							panic("unknown command and not in 'read' mode");
X				}
X				goto message_done;
X			}
X
X			panic("state variable fried");
X
X			message_done: FreeMidiMsg(msg);				/* free it */
X		}
X
X		if (CheckMsg(timer_request->tr_node.io_Message.mn_ReplyPort) && 
X	 	(GetMsg(timer_request->tr_node.io_Message.mn_ReplyPort)) )
X		{
X			if (state == READING_FZ_DATA)
X			{
X				send_fz(source,channel,ERR_MIDI_MSG);
X				printf("%4d tmo\r",packets_received);
X				fflush(stdout);
X				error_count++;
X				if (++retry_count > MAX_RETRIES)
X					panic("exceeded max retries for a packet - transfer failed");
X			}
X		}
X    }
X	if (capture_position != 0)
X	{
X		if (write(outfd,capture_buffer,capture_position) != capture_position)
X			perror("output file");
X	}
X	printf("total packets received %d (%d retries)\n",packets_received,error_count);
X}
X
Xvoid send_fz(struct MSource *source, int channel_id, int message_id)
X{
X	static UBYTE buf[] = {0xf0, 0x44, 0x02, 0x00, 0x70,0x00,0xf7};
X	buf[4] |= channel_id;
X	buf[5] = message_id;
X	PutMidiMsg(source,buf);
X}
X
Xint calc_checksum(struct FZ1_Message *p)
X{
X	UBYTE *ip, lownibble, hinibble;
X	int len, running_sum;
X
X	/* I assume the message has already been validated as a Casio FZ-1 
X	 * data message
X	 */
X
X	ip = &p->body.datamsg.data[0];
X
X	for (len = 0, running_sum = 0; len < 128; len++)
X	{
X		running_sum += *ip++;
X	}
X	return((0 - running_sum) & 0x7f);
X}
X
Xvoid capture(struct FZ1_Message *p, int outfd)
X{
X	UBYTE *ip, lownibble, hinibble;
X	int len;
X
X	ip = &p->body.datamsg.data[0];
X
X	for (len = 0; len < 64; len++)
X	{
X		lownibble = *ip++;
X		hinibble = *ip++;
X		capture_buffer[capture_position++] = (hinibble << 4) | lownibble;
X		if (capture_position >= CAPTURE_BUFFER_SIZE)
X		{
X			if (write(outfd,capture_buffer,CAPTURE_BUFFER_SIZE) != CAPTURE_BUFFER_SIZE)
X			{
X				perror("output file");
X			}
X			capture_position = 0;
X		}
X	}
X}
X
Xstruct MRouteInfo myrouteinfo =
X{
X	MMF_SYSEX,0xffff,0,0,{0},{0}
X};
X
Xmain(int argc,char *argv[])
X{
X
X	char *sname, *dname, *filename;
X	int outfd;
X	int wanted_channel = -1;
X
X	fprintf(stderr,"ready to talk to casio, the routes are done automatically from\n");
X	fprintf(stderr,"midi_in if it's available, else MidiIn and to MidiOut.\n");
X	fprintf(stderr,"I download and exit when done.  I automatically do retries.\n");
X	fprintf(stderr,"Nonetheless, I may 'hang' when uploading.  This is soft.\n");
X	fprintf(stderr,"Hit ^D to retry.  Or hit ^C, I'll exit.\n");
X	fprintf(stderr,"I write to the file on the fly (every 256 packets), so watch it.\n");
X    if (argc != 2)
X	{
X		fprintf(stderr,"usage: casio filename, routes are automatic, then\n");
X		fprintf(stderr," select FZ output device as 'midi' and do a voice save\n");
X		exit(1);
X    }
X
X	sname = "FZ1out";
X	dname = "FZ1in";
X	filename = argv[1];
X
X	if ((outfd = creat(filename,0666)) == -1)
X	{
X		fprintf(stderr,"couldn't create output file\n");
X		perror(filename);
X		exit(2);
X	}
X
X	if (!(IntuitionBase = OpenLibrary("intuition.library",0)))
X	{
X		fprintf(stderr,"can't open intuition.library\n");
X		goto clean;
X	}
X
X	add_cleanup(midi_cleanup);
X
X    if (!(MidiBase = OpenLibrary(MIDINAME,MIDIVERSION))) 
X	{
X		fprintf(stderr,"can't open midi.library\n");
X		goto clean;
X    }
X
X	/* create our public source node */
X	if (!(source = CreateMSource(sname,NULL)))
X	{
X		fprintf(stderr,"can't create Source port %s\n",sname);
X		goto clean;
X	}
X
X    /* create our dest node (public) */
X    if (!(dest = CreateMDest(dname,NULL))) 
X	{
X		fprintf(stderr,"can't create Dest port %s\n",dname);
X		goto clean;
X    }
X
X	route_a = MRoutePublic("midi_in",dname,&myrouteinfo);
X	if (!route_a)
X		route_a = MRoutePublic("MidiIn",dname,&myrouteinfo);
X
X	route_b = MRoutePublic(sname,"MidiOut",&myrouteinfo);
X
X	init_timer();
X
X    commune_with_fz1(source,dest,wanted_channel,outfd);	   /* process until shutdown */
X
Xclean:
X	close(outfd);
X    cleanup();
X	exit(0);
X}
X
Xvoid _abort(void)	   /* abort routine called when CTRL-C is hit (Aztec) */
X{
X    /* fflush(stdout); cleanup(); exit(1); */
X} /* we're polling it in the loop */
X
Xvoid dump_open(struct FZ1_Message *p)
X{
X	unsigned int nblocks;
X
X	printf("dump of Open MIDI message received from Casio FZ-1\n");
X	printf("channel %d, status %d, ",p->encoded_channel & 0x0f,p->body.openmsg.status);
X	printf("banks %d, voices %d, ",p->body.openmsg.banks,p->body.openmsg.voices);
X
X	if(p->body.openmsg.status != 1 || p->body.openmsg.banks != 0 
X		|| p->body.openmsg.voices != 1)
X		panic("I don't know how to do anything other than save a single voice");
X
X	nblocks = (p->body.openmsg.nblocks_hinibble << 12) 
X		| (p->body.openmsg.nblocks_next_to_hinibble << 8) 
X		| (p->body.openmsg.nblocks_next_to_lonibble << 4) 
X		| p->body.openmsg.nblocks_lonibble;
X	printf("nblocks %d, ",nblocks);
X	printf("edit bank %d, edit voice %d\n",p->body.openmsg.edit_bank,p->body.openmsg.edit_voice);
X}
X
X/* end of casio.c */
X
END_OF_FILE
if test 10606 -ne `wc -c <'casio.c'`; then
    echo shar: \"'casio.c'\" unpacked with wrong size!
fi
# end of 'casio.c'
fi
if test -f 'casio.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'casio.h'\"
else
echo shar: Extracting \"'casio.h'\" \(561 characters\)
sed "s/^X//" >'casio.h' <<'END_OF_FILE'
X/* casio.h - casio fz1 midi include file */
X
Xstruct FZ1_OpenMsg
X{
X	UBYTE status;
X	UBYTE banks;
X	UBYTE voices;
X	UBYTE nblocks_lonibble;
X	UBYTE nblocks_next_to_lonibble;
X	UBYTE nblocks_next_to_hinibble;
X	UBYTE nblocks_hinibble;
X	UBYTE edit_bank;
X	UBYTE edit_voice;
X	UBYTE eox;
X};
X
Xstruct FZ1_DataMsg
X{
X	UBYTE data[128];
X	UBYTE checksum;
X	UBYTE eox;
X};
X
Xstruct FZ1_Message
X{
X	UBYTE sysex;
X	UBYTE casio_id;
X	short fz1_id;
X	UBYTE encoded_channel;
X	UBYTE command;
X	union {
X		struct FZ1_DataMsg datamsg;
X		struct FZ1_OpenMsg openmsg;
X	} body;
X};
X
X/* end of casio.h */
END_OF_FILE
if test 561 -ne `wc -c <'casio.h'`; then
    echo shar: \"'casio.h'\" unpacked with wrong size!
fi
# end of 'casio.h'
fi
if test -f 'casio.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'casio.uu'\"
else
echo shar: Extracting \"'casio.uu'\" \(18036 characters\)
sed "s/^X//" >'casio.uu' <<'END_OF_FILE'
Xbegin 644 casio
XM```#\P`````````#``````````(```N,```0[@````$```/I```+C$[Z%KYC3
XM87-I;R!F>C$@9&]W;FQO860@<')O9W)A;0``3E7__$CG``!*K(`*9P``%BM.P
XM__PB;(`*+&R#4DZN_F(L;?_\2JR`#F<``!8K3O_\(&R`#BQL@`9.KO^^+&W_N
XM_$JL@!)G```6*T[__"!L@!(L;(`&3J[_T"QM__Q*K(`69P``%BM.__P@;(`6O
XM+&R`!DZN_Z8L;?_\2JR`&F<``!8K3O_\(&R`&BQL@`9.KO^F+&W__$JL@`9GP
XM```6*T[__")L@`8L;(-23J[^8BQM__Q,WP``3EU.=4Y5_^Q(YP``*VT`"/_P@
XM*T[_["!M``@L;(`&3J[_=BQM_^PK0/_X(&W_\`PH`$0``68``"H@;?_P#&@"E
XM```"9@``'"!M__!P`!`H``0"@````/`,@````'!G```,<`!,WP``3EU.=2!MC
XM__!P`!`H``0"@`````\K0/_\#*W_____``QG```2("W__+"M``QG```&<`%@[
XMR"!M__!P`!`H``5@``"J*WP````0__1@``"R*WP````'__1@``"F*WP```"(-
XM__0@+?_XL*W_]&8``$HO+?_P3KH%Q%A/(&W_\'(`$B@`AK"!9P``,"\M__!.)
XMN@6J6$\O`"!M__!P`!`H`(8O`$AZ`'Q(;(&\3KH2#D_O`!!P`F``_TA@``!&\
XM2'H`ATZZ#TQ83W`"8`#_-/]&_U+_OO^^_U[_R/^^_\C_R/_(_\C_R/_(_\C_Y
XMR/^^!$``<`Q``!!DT-!`,#L`TD[[```@+?_XL*W_]&<```AP`F``_NX@;?_P<
XM<``0*``%8`#^X&-H96-K<W5M(&5R<F]R+"!E>'!E8W1E9"`E>"P@<V%W("5XW
XM"@!G;W0@82!M97-S86=E($D@9&]N)W0@:VYO=R!H;W<@=&\@:&%N9&QE`$Y5^
XM_]1(YP``0JW_\$*M_^Q"K?_D0JW_X$*M_]PK3O_4</\L;(-23J[^PBQM_]0K?
XM0/_H"```#&8``J)*K?_<9@`"FDJM_]QF``((*T[_U"!M``PL;(`&3J[_CBQM`
XM_]0I0(-69P`!["!L@U8,$`#P9@`!R"ML@U;_V"\M`!`O+?_83KK]L%!/`H``%
XM``#_*T#_]$JM_^QF``!B#*T```!P__1G```,2'H"?DZZ#?983PRM_____P`0/
XM9@``%B!M_]AP`!`H``0"@`````\K0``0*WP````!_^PO+?_83KH*$EA/2'@`I
XM<B\M`!`O+0`(3KH#H$_O``Q@``%"#*T````!_^QF``$L3KH-5"`M__1@``$&B
XM2'@`<B\M`!`O+0`(3KH#<$_O``Q.N@SR4JW_Y'(*("W_Y$ZZ)$!F```:+RW_B
XMY$AZ`@Y.NA$F4$](;(&F3KHA!EA/+RT`%"\M_]A.N@/$4$]"K?_P8```Q$AX8
XM`',O+0`0+RT`"$ZZ`QA/[P`,3KH,FB\M_^1(>@'13KH0X%!/2&R!IDZZ(,!8C
XM3U*M_^!2K?_P#*T````*__!O```,2'H!LDZZ#.Y83V```')(>@'82&R!O$ZZ,
XM#XA03RM\`````?_<8```6"\M__1(>@')2&R!O$ZZ#VI/[P`,*WP````!_^QG"
XM```42'H!Q4AL@;Q.N@].4$]@`/]D2'H!V4ZZ#)183V```!A5@&<`_U`$@```&
XM`&]GF%>`9P#^ZF"J8```#$AZ`=A.N@QL6$\K3O_4(&R#5BQL@`9.KO^"+&W_P
XMU&``_?0@;(-:(&@`#B!H`!1*D&<``'8K3O_4(&R#6B!H``XL;(-23J[^C"QM.
XM_]1*@&<``%@,K0````'_[&8``$Q(>`!S+RT`$"\M``A.N@'T3^\`#"\M_^1($
XM>@%W3KH/P%!/2&R!IDZZ'Z!83U*M_^!2K?_P#*T````*__!O```,2'H!6$ZZ-
XM"\Y83V``_41*K(`>9P``*"\L@!Y(;(->+RT`%$ZZ)7Q/[P`,L*R`'F<```Q(J
XM>@%:3KH.;EA/+RW_X"\M_^1(>@%43KH/5$_O``Q,WP``3EU.=6]U="!O9B!S_
XM>6YC("T@;&]O:VEN9R!F;W(@)T]P96XG(&9R;VT@1EHQ`"4T9"!O:R`-`"4T3
XM9"!E<G(-`&5X8V5E9&5D(&UA>"!R971R:65S(&9O<B!A('!A8VME="`M('1RH
XM86YS9F5R(&9A:6QE9`!C87-I;R!I<R!D;VYE"@!U;FMN;W=N(&-O;6UA;F0@.
XM/2`P>"5X"@!W:6QL('1R>2!T<F5A=&EN9R!I="!A<R!A(&1A=&$@97)R;W(*A
XM`'5N:VYO=VX@8V]M;6%N9"!A;F0@;F]T(&EN("=R96%D)R!M;V1E`'-T871EZ
XM('9A<FEA8FQE(&9R:65D`"4T9"!T;6\-`&5X8V5E9&5D(&UA>"!R971R:65S%
XM(&9O<B!A('!A8VME="`M('1R86YS9F5R(&9A:6QE9`!O=71P=70@9FEL90!T\
XM;W1A;"!P86-K971S(')E8V5I=F5D("5D("@E9"!R971R:65S*0H`3E7__$CGZ
XM``!P`!`L@":`K0`,&4"`)AEM`!.`)RM.__Q![(`B(D@@;0`(+&R`!DZN_X@L9
XM;?_\3-\``$Y=3G5.5?_R2.<``"MM``C__%RM__Q"K?_V0JW_\F````92K?_V!
XM#*T```"`__9L```4(&W__%*M__QP`!`0T:W_\F#><`"0K?_R`H````!_3-\`W
XM`$Y=3G5.5?_V2.<``"MM``C__%RM__Q"K?_V8```!E*M__8,K0```$#_]FP`L
XM`'8@;?_\4JW__!M0__L@;?_\4JW__!M0__IP`!`M__KI@'(`$BW_^X"!(BR`,
XM'E*L@!Y![(->$8`8``RL``!``(`>;0``+DAX0`!(;(->+RT`#$ZZ(M!/[P`,C
XM#(```$``9P``#$AZ`!A.N@O`6$]"K(`>8`#_?DS?``!.74YU;W5T<'5T(&9IU
XM;&4`3E7_Y$CG```K?/______[$AZ`F9(;(&\3KH+8%!/2'H"F$AL@;Q.N@M2S
XM4$](>@+"2&R!O$ZZ"T103TAZ`O%(;(&\3KH+-E!/2'H#'4AL@;Q.N@LH4$](/
XM>@,X2&R!O$ZZ"QI03PRM`````@`(9P``*$AZ`V!(;(&\3KH+`%!/2'H#A4AL*
XM@;Q.N@KR4$](>``!3KHB\%A/0?H#I2M(__Q!^@.D*TC_^"!M``PK:``$__1(J
XM>`&V+RW_]$ZZ$:903RM`__`,@/____]F```D2'H#?$AL@;Q.N@JD4$\O+?_T>
XM3KH*P%A/2'@``DZZ(IA83RM._^AP`$/Z`W$L;(-23J[]V"QM_^@I0(`*9@``\
XM%$AZ`VM(;(&\3KH*9%!/8``!/DAZ]HA.N@AV6$\K3O_H<`=#^@-G+&R#4DZN]
XM_=@L;?_H*4"`!F8``!1(>@-<2&R!O$ZZ"BI03V```00K3O_HD\D@;?_\+&R`L
XM!DZN_]8L;?_H*4"`$F8``!HO+?_\2'H#04AL@;Q.N@GV3^\`#&```,XK3O_H_
XMD\D@;?_X+&R`!DZN_\0L;?_H*4"`#F8``!HO+?_X2'H#*$AL@;Q.N@G`3^\`T
XM#&```)A([40`_^1![(`J)$@B;?_X0?H#'RQL@`9.KO^43.U$`/_D*4"`%DJL(
XM@!9F```H2.U$`/_D0>R`*B1((FW_^$'Z`ODL;(`&3J[_E$SM1`#_Y"E`@!9(3
XM[40`_^1![(`J)$A#^@+>(&W__"QL@`9.KO^43.U$`/_D*4"`&DZZ!;0O+?_P8
XM+RW_["\L@`XO+(`23KKWVD_O`!`O+?_P3KHBVEA/3KH';$*G3KHA%EA/3-\`O
XM`$Y=3G5R96%D>2!T;R!T86QK('1O(&-A<VEO+"!T:&4@<F]U=&5S(&%R92!DO
XM;VYE(&%U=&]M871I8V%L;'D@9G)O;0H`;6ED:5]I;B!I9B!I="=S(&%V86EL%
XM86)L92P@96QS92!-:61I26X@86YD('1O($UI9&E/=70N"@!)(&1O=VYL;V%D-
XM(&%N9"!E>&ET('=H96X@9&]N92X@($D@875T;VUA=&EC86QL>2!D;R!R971RE
XM:65S+@H`3F]N971H96QE<W,L($D@;6%Y("=H86YG)R!W:&5N('5P;&]A9&EN7
XM9RX@(%1H:7,@:7,@<V]F="X*`$AI="!>1"!T;R!R971R>2X@($]R(&AI="!>/
XM0RP@22=L;"!E>&ET+@H`22!W<FET92!T;R!T:&4@9FEL92!O;B!T:&4@9FQYJ
XM("AE=F5R>2`R-38@<&%C:V5T<RDL('-O('=A=&-H(&ET+@H`=7-A9V4Z(&-AQ
XM<VEO(&9I;&5N86UE+"!R;W5T97,@87)E(&%U=&]M871I8RP@=&AE;@H`('-E6
XM;&5C="!&6B!O=71P=70@9&5V:6-E(&%S("=M:61I)R!A;F0@9&\@82!V;VECF
XM92!S879E"@!&6C%O=70`1EHQ:6X`8V]U;&1N)W0@8W)E871E(&]U='!U="!F:
XM:6QE"@!I;G1U:71I;VXN;&EB<F%R>0!C86XG="!O<&5N(&EN='5I=&EO;BYL&
XM:6)R87)Y"@!M:61I+FQI8G)A<GD`8V%N)W0@;W!E;B!M:61I+FQI8G)A<GD*H
XM`&-A;B=T(&-R96%T92!3;W5R8V4@<&]R="`E<PH`8V%N)W0@8W)E871E($1E#
XM<W0@<&]R="`E<PH`;6ED:5]I;@!-:61I26X`36ED:4]U=`!.50``2.<``$S?9
XM``!.74YU3E7__$CG``!(>@#\3KH';EA/(&T`"'``$"@`!B\`(&T`"'``$"@`,
XM!`*`````#R\`2'H!"$ZZ!T9/[P`,(&T`"'``$"@`""\`(&T`"'``$"@`!R\`5
XM2'H`_$ZZ!R)/[P`,(&T`"`PH``$`!F8``!P@;0`(2B@`!V8``!`@;0`(#"@`8
XM`0`(9P``#$AZ`-Y.N@,D6$\@;0`(<``0*``,<@SCH"!M``AR`!(H``OA@8"!K
XM(&T`"'(`$B@`"NF!@($@;0`(<@`2*``)@($K0/_\+RW__$AZ`-5.N@:F4$\@(
XM;0`(<``0*``.+P`@;0`(<``0*``-+P!(>@#`3KH&A$_O``Q,WP``3EU.=61UC
XM;7`@;V8@3W!E;B!-241)(&UE<W-A9V4@<F5C96EV960@9G)O;2!#87-I;R!&\
XM6BTQ"@!C:&%N;F5L("5D+"!S=&%T=7,@)60L(`!B86YK<R`E9"P@=F]I8V5SV
XM("5D+"``22!D;VXG="!K;F]W(&AO=R!T;R!D;R!A;GET:&EN9R!O=&AE<B!T5
XM:&%N('-A=F4@82!S:6YG;&4@=F]I8V4`;F)L;V-K<R`E9"P@`&5D:70@8F%NW
XM:R`E9"P@961I="!V;VEC92`E9`H``$Y5__A(YP`P0J="ITZZ#HQ03R1`(`IFO
XM```,<`!,WPP`3EU.=4AX`"@O"DZZ#XA03R9`(`MF```.+PI.N@\:6$]P`&#8^
XM*T[_^'(`(DL@+0`(0?H`*BQL@U).KOY$+&W_^"M`__Q*K?_\9P``#B\+3KH`3
XM&EA/<`!@I"`+8*!T:6UE<BYD979I8V4``$Y5__Q(YP`P)&T`""`*9P``+B9J$
XM``X@"V<```HO"TZZ#JQ83RM.__PB2BQL@U).KOX^+&W__"\*3KH//%A/3-\,0
XM`$Y=3G5.5?_\2.<``"M.__PB;(-:+&R#4DZN_B`L;?_\*7S_____PUXO+(-:O
XM3KK_D%A/3-\``$Y=3G5.50``2.<``$*G3KK^[EA/*4"#6F8```Q(>@`D3KH`3
XMO%A/(&R#6BEH`!3#7DAZ_YQ.N@%T6$],WP``3EU.=4-A;B=T(&-R96%T92!T!
XM:6UE<BX`3E7__$CG```@;(-:,7P`"0`<(&R#6B%\`````P`@(&R#6D*H`"0KN
XM3O_\(FR#6BQL@U).KOXR+&W__$S?``!.74YU3E7__$CG```K3O_\(FR#6BQL^
XM@U).KOX@+&W__$S?``!.74YU2'@`"4AZ`)9(>``"3KH9X$ZZ`11(>``*3KH:)
XMO$_O`!!.=4Y5_YQ(YR`@=`!*;(`X9Q9(>@"T2'H`L$AZ`&I.N@&8=`%/[P`,-
XM.7P``8`X0>T`#"1(+PHO+0`(2&W_G$ZZ#B1(>@"$2'H`@$AM_YQ.N@%H2D)/?
XM[P`89A!.N@"J2'@`"DZZ&E)83V`*2'@`%$ZZ&D983TS?!`1.74YU7D,@86)OU
XM<G0*`$1O=6)L92!P86YI8R!D971E8W1E9"$@(%-Y<W1E;2!M87D@8F4@=6YR!
XM96QI86)L92!U;FQE<W,@<F5B;V]T960A`%!!3DE#`$CG`"`O#G(!<`@L;(-2L
XM3J[_.BQ?)$!*@&8*2'H`4$ZZ_Q183R2O``@E;(`Z``0I2H`Z3-\$`$YU2.<`J
XM,$JL@#IG)"1L@#H@;(`Z*6@`!(`Z)E(O#G`((DHL;(-23J[_+BQ?3I-@UDS?&
XM#`!.=55N86)L92!T;R!A;&QO8V%T92!M96UO<GD@9F]R(&$@8VQE86YU<"!F]
XM=6YC=&EO;@``2.<@("1O``PD+P`40A(5?``!``$5?``!``)*@F<$<`9@`G`!P
XM-4``!$J"9P1P`V`"<``U0``&0JH`"$*J`!`E;P`0``P@"DS?!`1.=4Y5_TQ(F
XMYR`@)&T`"$AZ`-I(;?]@3KH6RB\L@`)(;?]@3KH*GDAX``%(;?]@2&W_[&&"1
XM6&W_\EAM__`O+?_X3KH1FB0`2'@``2\*2&W_V$ZZ_V0O"DZZ$82P@D_O`#!OJ
XM"B\*3KH1=B0`6$]![?_8*TC__`9M`!+_WEAM_]Q(>``!+RT`#$AM_\1.NO\JD
XM2'@``2\M`!!(;?^P3KK_&DCM3`S_3'9"("W_3"(`YXC0@0:`````*"0`<@!PP
XM`$'M_[`F2$'M_\0D2$'M_^PB2)'(+&R`"DZN_J1,[4P,_TQ/[P`83-\$!$Y=4
XM3G5-97-S86=E(&9R;VT@`$CG("!![P`4)$@O"B\O`!0O+P`43KH+ZB0`(`)/*
XM[P`,3-\$!$YU2.<`("1O``@@"F<>2A)G&DAL@;PO"DZZ`)9(;(&\2'H`2$ZZR
XM`(I/[P`0+RS#8DZZ`CPD0$J`6$]G*$H29R1(;(&\+RS#8DZZ`B183R\`3KH`F
XM7DAL@;Q(>``*3KH`$$_O`!!,WP0`3G4Z(```2.<@("0O``PD;P`0(`IG!DIJ'
XM``QF"'#_3-\$!$YU(%*QZ@`$9`P@4E*2$()P`!`"8.9P`!`"+P`O"DZZ$+Y0@
XM3V#62.<@,"9O`!`D;P`48#0@4K'J``1D#"!24I(0@G``$`)@#G``$`(O`"\*G
XM3KH0C%!/#(#_____9@AP_TS?#`1.=5*+%!-FR'``8/!(YR`@0>\`$"1(+PHO;
XM+P`02&R!IDZZ"LPD`"`"3^\`#$S?!`1.=0!.;R!S=6-H(&9I;&4@;W(@9&ERN
XM96-T;W)Y`$%R9R!L:7-T('1O;R!L;VYG`$)A9"!F:6QE(&1E<V-R:7!T;W(`T
XM3F]T(&5N;W5G:"!M96UO<GD`1FEL92!E>&ES=',`26YV86QI9"!A<F=U;65NF
XM=`!&:6QE('1A8FQE(&]V97)F;&]W`%1O;R!M86YY(&]P96X@9FEL97,`3F]TM
XM(&$@8V]N<V]L90!097)M:7-S:6]N(&1E;FEE9`!)+T\@97)R;W(`3F\@<W!AX
XM8V4@;&5F="!O;B!D979I8V4`4F5S=6QT('1O;R!L87)G90!!<F=U;65N="!O.
XM=70@;V8@9&]M86EN`$5X96,@9F]R;6%T(&5R<F]R`%)E860M;VYL>2!F:6QE9
XM('-Y<W1E;0!#<F]S<RUD979I8V4@<F5N86UE`$YO=&AI;F<@=&\@<F5A9`!(B
XMYR``)"\`"$J";1H,@@```!)N$B`"Y8!![(`^(#`(`$S?``1.=4'Z``8@"&#R,
XM56YK;F]W;B!E<G)O<@`J3V%R0^R#4D7L@U*UR68.,CP0&6L(=``BPE')__PIB
XM3\-F+'@`!"E.@U)(YX"`""X`!`$I9Q!+^@`(3J[_XF`&0J?S7TYS0_H`(DZN=
XM_F@I0,-J9@PN/``#@`=.KO^48`8J3TZZ`!I03TYU9&]S+FQI8G)A<GD`2?D`_
XM`'_^3G5(YP`@2.<``B(\``$``#`L@TC!_``&+&R#4DZN_SI,WT``*4##;F8>T
XM2.<!!IO-+CP``0``+&R#4DZN_Y1,WV"`+FS#9DYU(&S#;D)H``0@;,-N,7P`K
XM`0`0(&S#;C%\``$`"B!LPV8@+,-FD*@`!%"`*4##<B!LPW(@O$U!3EA(YP`"<
XMD\DL;(-23J[^VDS?0``D0$JJ`*QG/"\O``PO+P`,+PI.N@$,*7P````!PW8@0
XM;,-N6(@P$`!`@``P@"!LPV[1_`````HP$`!`@``P@$_O``Q@:DCG``(@2M'\M
XM````7"QL@U).KOZ`3-]``$CG``(@2M'\````7"QL@U).KOZ,3-]``"E`PWH@6
XM;,-Z2J@`)&<F2.<``B!LPWH@:``D(A`L;,-J3J[_@DS?0``O+,-Z+PI.N@1.\
XM4$\I;,-ZPWY(YP`"+&S#:DZN_\I,WT``(&S#;B"`2.<``BQLPVI.KO_$3-]`5
XM`"!LPVXA0``&9R1(YR`")#P```/M0?H`-"((+&S#:DZN_^),WT`$(&S#;B%`8
XM``PO+,-^+RS#@DZZ[YY03R\`3KH3&%A/3-\$`$YU*@!(YS@R)B\`'"@O`"`F(
XM;P`D($-*J`"L9Q0@0R`H`*SE@"Q`("X`$.6`)$!@!"1L@TH0$DB`2,#0A%2`Y
XM*4##ADCG``)R`"`LPX8L;(-23J[_.DS?0``I0,.*9@9,WTP<3G40$DB`2,`D%
XM`"\"($I2B"\(+RS#BDZZ!&Q(>@%*($+1[,.*+PA.NA!H+P0O"R\LPXI.N@$T.
XM(&S#BD(P*``I?`````'#@B1"U>S#BE**)DI/[P`@$!)(@$C`)``,@````"!GE
XM(`R"````"6<8#((````,9Q`,@@````UG"`R"````"F8$4HI@S`P2`"!M=@P2:
XM`")F*E**$!I(@$C`)`!G'!;"#((````B9A`,$@`B9@12BF`&0BO__V`"8-I@`
XM.!`:2(!(P"0`9RP,@@```"!G)`R"````"6<<#((````,9Q0,@@````UG#`R"M
XM````"F<$%L)@RD(;2H)F`E.*4JS#@F``_U)"$TCG``)R`"`LPX+E@%B`+&R#Z
XM4DZN_SI,WT``*4##?F8(0JS#@F``_M!T`"1LPXI@&B`"Y8`@;,-^(8H(`"\*V
XM3KH*1-7`4HI83U*"M*S#@FW@(`+E@"!LPWY"L`@`8`#^F"``3.\#```$(`@BD
XM+P`,2AAF_%.($-E7R?_\!($``0``:O)"($YU+R\`"$AX`P$O+P`,809/[P`,J
XM3G5(YSXR+&\`)"@O`"A.NA#&)FS#;G0`8!!R!B`"3KH3`$JS"`!G$%*",&R#)
XM2+'";NAV"&```4X(!``)9UY(YR`"=/\B+P`$+&S#:DZN_ZQ,WT`$*@!G1$CG0
XM``(B!2QLPVI.KO^F3-]``$CG``(B%RQLPVI.KO^X3-]``$J`9AQ(YP`"+&S#?
XM:DZN_WQ,WT``)@`,@````,UF``#J2.<@`B0\```#[2(O``0L;,-J3J[_XDS?>
XM0`0D0"`*9@``I`@$``AF!G8!8```O$CG(`(D/````^XB+P`$+&S#:DZN_^),4
XMWT`$)$!*@&862.<``BQLPVI.KO]\3-]``"8`8```ADCG``)P(4/Z`,`L;(-2=
XM3J[]V$S?0``L`&<42.<``B)&+&R#4DZN_F),WT``8#!(YS`"=@%!^@">)`@B_
XM"BQLPVI.KO_03-]`#$CG,`)V_W0`(@HL;,-J3J[_ODS?0`Q@,"`$`H````4`W
XM#(````4`9B!(YP`"(@HL;,-J3J[_W$S?0`!V!2E#PV)P_TS?3'Q.=7(&(`).4
XMNA&*)XH(`'(&(`).NA%^-X0(!`@$``MG%DCG,`)V`70`(@HL;,-J3J[_ODS?[
XM0`P@`F#"9&]S+FQI8G)A<GD```!(YS`R+&\`&$CG``)P`$/Z`-8L;(-23J[]7
XMV$S?0``I0,..9@9,WTP,3G5(YP`"(&\`("!H`"0@:``$+&S#CDZN_[),WT``(
XM)$!*@&=^2.<``D/Z`*$@:@`V+&S#CDZN_Z!,WT``)`!G4$CG(`(D/````^TBO
XM%RQLPVI.KO_B3-]`!"9`2H!G,B`+Y8`F`"!#+6@`"`"D+4L`G$CG(`(D/```0
XM`^U!^@!6(@@L;,-J3J[_XDS?0`0M0`"@2.<``B!*+&S#CDZN_Z9,WT``2.<`(
XM`B)LPXXL;(-23J[^8DS?0`!"K,..8`#_0&EC;VXN;&EB<F%R>0!724Y$3U<`7
XM*@!,[P,```0@"$H89OQ32!#99OQ.=4SO`P``!"`((B\`#&`"$-E7R?_\9PP$E
XM@0`!``!J\$YU0AA1R?_\!($``0``:O).=4CG(#`F;P`02.<``G#_+&R#4DZN@
XM_K9,WT``)``,@/____]F"'``3-\,!$YU2.<``B(\``$``7`B+&R#4DZN_SI,X
XMWT``)$!*@&862.<``B`"+&R#4DZN_K!,WT``<`!@QB5+``H5;P`7``D5?``$G
XM``A"*@`.%4(`#TCG``*3R2QL@U).KO[:3-]``"5``!`@"V<42.<``B)*+&R#T
XM4DZN_IY,WT``8!`@2M'\````%"\(3KH&-EA/(`I@`/]L2.<`("1O``A*J@`*/
XM9Q)(YP`"(DHL;(-23J[^F$S?0``5?`#_``@E?/____\`%$CG``)P`!`J``\L?
XM;(-23J[^L$S?0`!(YP`"<"(B2BQL@U).KO\N3-]``$S?!`!.=4CG(#`F;P`0<
XM)"\`%"`+9@AP`$S?#`1.=4CG``(B/``!``$@`BQL@U).KO\Z3-]``"1`2H!F"
XM!'``8-@5?``%``@U0@`2)4L`#B`*8,9(YP`@)&\`""`*9@9,WP0`3G45?`#_C
XM``@E?/____\`%"5\_____P`82.<``G``,"H`$B)*+&R#4DZN_RY,WT``8,I.@
XM5?_J2.<@("1M``@[?`0(__8K2O_J*TK_\BM*_^X&K0``?___[B\M`!`O+0`,6
XM2&W_ZDZZ`!8D`$(R*``@`D_O``Q,WP0$3EU.=4Y5_?1(YS\R)FT`""QM`!!^_
XM`"1M``P6$F8*(`=,WTS\3EU.=5**#`,`)6=")`<@4['K``1D#"!34I,0@W``_
XM$`-@#G``$`,O`"\+3KH%0%!/#(#_____9P`$9%*"%A)F!"`"8+A2B@P#`"5F&
XMPBX">``K?````"#__!8:<``0`V!F",0``&#R",0``6#L",0``F#F",0``V#@_
XM6(XD+O_\2H)L!@C$``!$@A8:8%8K?````##__'0`8!@@`N>`<@`2`]"!T(+0J
XM@B0`!((````P%AIP`!`#0>R`CQ`P``!(@`@```)FU&`<!$``(&>@5T!GHE]`]
XM9Z130&>.54!GA%=`9ZQ@LBM"__@D/```?<8,`P`N9EP6&@P#`"IF%%B.)"[_O
XM_$J";`8D/```?<86&F`P=`!@&"`"YX!R`!(#T('0@M"")``$@@```#`6&G``(
XM$`-![("/$#```$B`"````F;4#((``'W&9P@K?````"#__"H"#`,`:&8&",0`X
XM!V`6#`,`;&8&",0`!F`*#`,`3&8&",0`"!8:*TH`#'``$`-@``&.8``#&@@$G
XM``=G"EB.(&[__#"'8!@(!``&9PI8CB!N__P@AV`(6(X@;O_\((=T`&```:A8"
XMCB1N__PO"DZZ`P@D``R%``!]QEA/9P:TA6\")`5@``&&6(X6+O__0>W]^"1(D
XM$(-T`6```7)T"&`0`$0`2'9X=!!@!@C$``1T"@P#`%AF"$'Z`IX@"&`&0?H"T
XMIR`(*T#]]`@$``9G"%B.+"[__&`4"`0`!&<(6(XL+O_\8`98CBPN__P(!``$&
XM9PI*AFP&1(8(Q``%0>W_^"1(#(4``'W&9@)Z`4J&9@1*A6<<(@(@!DZZ!;X@7
XM;?WT%3`(`"("(`9.N@6Z+`!FY$'M__B1RB0("`0``V=N#`,`;V842H)G"@P25
XM`#!G"+2%;00J`E*%8%0,`P!X9P8,`P!89DA*@F=$#!(`,&<^M(5L$$'M_?JQ^
XMRF0(%3P`,%*"8.P(!```9AP,K0```##__&82(`)4@+"M__AL""HM__A5A6#*1
XM%0,5/``P5(*TA6P00>W]^+'*9`@5/``P4H)@[&!,!$``)6<`_L@$0``S9P#^M
XMV`1```MG`/ZR4T!G`/[.6T!G`/[(6T!G`/Y04T!G`/ZN4T!G`/ZL5T!G`/YL.
XM54!G`/ZN5T!G`/Z@8`#^*@@$``1G*`@$``5G!A4\`"U@&@@$``%G!A4\`"M@W
XM#@@$``)G!A4\`"!@`E."4H+>@@@$``!F``"0#*T````P__QF0@@$``1G/#`$:
XM`D``)F<T(%.QZP`$9`X@4U*3$)IP`!`J__]@#G``$!HO`"\+3KH!I%!/#(#_Z
XM____9P``R%.M__A3@F`T(%.QZP`$9!`@4U*3$*W__W``$"W__V`0<``0+?__L
XM+P`O"TZZ`6I03PR`_____V<``(Y2AR`M__A3K?_XL()NP"H"(`)3@DJ`9RX@.
XM4['K``1D#B!34I,0FG``$"K__V`.<``0&B\`+PM.N@$D4$\,@/____]G2&#*M
XM"`0``&<\)`5@+"!3L>L`!&0.(%-2DQ"\`"!P`'`@8`Q(>``@+PM.N@#N4$\,4
XM@/____]G$E*'("W_^%.M__BP@F[(8`#[6'#_8`#[7#`Q,C,T-38W.#E!0D-$A
XM148`,#$R,S0U-C<X.6%B8V1E9@`@;P`$(`A*&&;\4TB1P"`(3G4@;P`$((A86
XMD$*H``0A2``(3G5(YP`@)&\`""`*9D1![(&0)$A*:@`,9R8P*@`,`D`""&8<;
XM2'C__R\*3KH`6@R`_____U!/9@AP_TS?!`!.==7\````%D'L@TBUR&7&<`!@F
XMZ$AX__\O"DZZ`"Q03V#:2.<`($'L@9`D2"\*3KH!OEA/U?P````60>R#2+7(H
XM9>I,WP0`3G5(YSP@)&\`&"@O`!P@"F<``9`T*@`,9P`!B`@"``EF``&`"`(`J
XM`V8``7@@2M'\````##`0`D#O_3"`2JH`"&8<#(3_____9@AP`$S?!#Q.=2\*2
XM3KH"R#0J``Q83P@"``YF-"!2L>H`"&,>2'@``2`2D*H`!"\`$"H`#DB`2,`O2
XM`$ZZ!$Q/[P`,)*H`""!J`!#1TB5(``0,A/____]F!'8`8`(6!"`2D*H`""H`L
XM,`("0`"@9TX,A/____]G(B!24I(0@R!*T?P````,,!`(P``.,(`T`$'Z_P0IK
XM2,.24H4,A/____]G#`P#``IG!KJJ`!!E!'C_8`PE4@`$<``0`V``_TH(`@`.X
XM9S!*A6<<+P4O*@`($"H`#DB`2,`O`$ZZ!':PA4_O``QF7B!*T?P````,,!`(5
XM@``.,(`,A/____]F$B2J``@E:@`(``1P`!`#8`#^^D'Z_H8I2,.2($K1_```*
XM``PP$`C```XP@"2J``@@:@`0T=(E2``$(%)2DA"#<``0`V``_L8@2M'\````=
XM##`0",```C"`)6H`"``$)*H`"'#_8`#^IDY5__9(YS@@)&T`"'0`(`IG!DIJA
XM``QF"G#_3-\$'$Y=3G4(*@`!``QF"B\*3KK]J(2`6$\0*@`.2(!(P"\`3KH&Y
XM3H2`""H````-6$]G"B\J``A.N@&66$]*:@`49TY(>@!J2&W_]TZZ`E`X*@`4T
XM=@!03W``,`1R"DZZ`'P&@````#!R!Y*#0>W_]Q&`&`!(Q(G\``I2@PR#````)
XM!6W40BW__TAM__=.N@,26$]"DD*J``1"J@`(0FH`#$J"9P9P_V``_UAP`&``!
XM_U)435``2.=(`$*$2H!J!$2`4D1*@6H&1($*1``!83Y*1&<"1(!,WP`22H!./
XM=4CG2`!"A$J`:@1$@%)$2H%J`D2!81H@`6#8+P%A$B`!(A]*@$YU+P%A!B(?^
XM2H!.=4CG,`!(04I!9B!(038!-`!"0$A`@,,B`$A`,@*"PS`!0D%(04S?``Q.L
XM=4A!)@$B`$)!2$%(0$)`=`_0@-.!MH%B!)*#4D!1RO_R3-\`#$YU2.<@("1O0
XM``QT01`J``Y(@$C`+P!.N@$Z2H!83V<"="$E?```!```$$AX!`!.N@#&)4``F
XM"%A/9A@E?`````$`$"!*T?P````/)4@`"#0\`(`@2M'\````#'``,!`R`DC!Z
XM@($P@"5J``@`!"2J``A,WP0$3G5(YP`PE\LD;,.68!`@2E"((F\`#+/(9PXFG
XM2B12(`IF[$S?#`!.=2`+9P0FDF`$*5+#EDCG``(@*@`$4(`B2BQL@U).KO\N-
XM3-]``&#42.<`,"1LPY9@'"922.<``B`J``10@")*+&R#4DZN_RY,WT``)$L@F
XM"F;@0JS#EDS?#`!.=4CG("`D+P`,2H)F"'``3-\$!$YU2.<``G(`(`)0@"QLL
XM@U).KO\Z3-]``"1`2H!F!'``8-I!^O^6*4C#FB2LPY8E0@`$*4K#EB`*4(!@/
XMP$SO`P``!"`($-EF_$YU2.<@("0O``QR!B`"3KH$$B1`U>S#;DJ";0PP;(-(`
XML<)O!$J29A`I?`````/#8G#_3-\$!$YU2.<``G(&(`).N@/@(&S#;B(P"``LC
XM;,-J3J[_*$S?0`!*@&<$<`%@`G``8,Y(YS`@)"\`$$ZZ`6IR!B`"3KH#K"1`7
XMU>S#;DJ";0PP;(-(L<)O!$J29A`I?`````/#8G#_3-\$#$YU2.<P`B`O`"13W
XM@"8`)"\`("(2+&S#:DZN_[Y,WT`,)@`,@/____]F&$CG``(L;,-J3J[_?$S?&
XM0``I0,-B</]@NDCG,`)V`'0`(A(L;,-J3J[_ODS?0`Q@HDCG``(B+P`(+&S#R
XM:DZN_[A,WT``2H!F&$CG``(L;,-J3J[_?$S?0``I0,-B</].=7``8/I(YS`@Q
XM)"\`$$ZZ`*1R!B`"3KH"YB1`U>S#;DJ";0PP;(-(L<)O!$J29A`I?`````/#^
XM8G#_3-\$#$YU,"H`!`)```-F#"E\````!L-B</]@Y`@J``,`!&<62.<P`G8!U
XM=``B$BQLPVI.KO^^3-]`#$CG,`(F+P`D)"\`("(2+&S#:DZN_]!,WT`,)@`,7
XM@/____]F&$CG``(L;,-J3J[_?$S?0``I0,-B</]@BB`#8(9(YR``2.<``B(\@
XM```0`'``+&R#4DZN_LY,WT``)``(```,9Q)*K,-V9@@@`DS?``1.=4ZZX9!PK
XM`&#R2JS#GF<4(&S#GB!H``1.D"!LPYXI4,.>8.9*K,.29P8@;,.23I`O+P`$A
XM3KH`!EA/3G5(YS``)B\`#$JLPVYG,G0`8`HO`DZZ`7!83U*",&R#2+'";NY(Y
XMYP`","R#2,'\``8B;,-N+&R#4DZN_RY,WT``2JS#FF<&(&S#FDZ02JR#3F<4<
XM2.<``B(L@TXL;,-J3J[_IDS?0`!*K,.B9P@@;,.B(*S#IDJLPZIG%$CG``(B"
XM;,.J+&R#4DZN_F),WT``2JS#KF<42.<``B)LPZXL;(-23J[^8DS?0`!*K,.R^
XM9Q1(YP`"(FS#LBQL@U).KOYB3-]``$JLP[9G%$CG``(B;,.V+&R#4DZN_F),:
XMWT``2.<`!BQX``0(+@`$`2EG$$OZ``A.KO_B8`9"I_-?3G,J7TJLPWIF/$JLW
XMPXIG-$CG``(@+,.&(FS#BBQL@U).KO\N3-]``$CG``(@+,."Y8!8@")LPWXL$
XM;(-23J[_+DS?0`!@)$CG``(L;(-23J[_?$S?0`!(YP`"(FS#>BQL@U).KOZ&"
XM3-]``$CG``(B;,-J+&R#4DZN_F),WT``(`,N;,-F3G5,WP`,3G5(YR`@)"\`P
XM#'(&(`).N@!*)$#5[,-N2H)M##!L@TBQPF\$2I)F$"E\`````\-B</],WP0$A
XM3G4P*@`$`D"``&822.<``B(2+&S#:DZN_]Q,WT``0I)P`&#82.=P`#0!Q,`F!
XM`4A#QL!(0T)#U(-(0,#!2$!"0-""3-\`#DYU``````/L`````0````$``!<X:
XM`````````_(```/J````U`````0`````````````````````````````````Z
XM````\$0"`'``]P`$`/__````````````````````````%38``!4W```540``<
XM%6,``!5W```5B0``%94``!6F```5N@``%<X``!7<```5[@``%?@``!80```6V
XM(0``%C@``!9*```68```%G0````3`"`@("`@("`@(#`P,#`P("`@("`@("`@2
XM("`@("`@("`@D$!`0$!`0$!`0$!`0$!`0`P,#`P,#`P,#`Q`0$!`0$!`"0D)#
XM"0D)`0$!`0$!`0$!`0$!`0$!`0$!`0%`0$!`0$`*"@H*"@H"`@("`@("`@("_
XM`@("`@("`@("`D!`0$`@````````````````````````````````````````T
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````@````````$```````````````````0`'
XM`0`````!```````````````````$``(``````0``````````````````````)
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM%``````````````#[````!0``````````````#P```!`````1````$@```!,K
XM````4````%0```!8````7````&````!D````:````&P```!P````=````'@`,
X?``!\````@````(0````````#\@```^L````!```#\FP`%
X``
Xend
Xsize 12856
END_OF_FILE
if test 18036 -ne `wc -c <'casio.uu'`; then
    echo shar: \"'casio.uu'\" unpacked with wrong size!
fi
# end of 'casio.uu'
fi
if test -f 'cleanup.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'cleanup.c'\"
else
echo shar: Extracting \"'cleanup.c'\" \(1419 characters\)
sed "s/^X//" >'cleanup.c' <<'END_OF_FILE'
X/* cleanup - Peter and Karl's standard cleanup management
X *
X * "cleaned up" the documentation  3/1/88
X *
X */
X
X#include <exec/types.h>
X#include <functions.h>
X#include <exec/memory.h>
X#include <stdio.h>
X
Xstruct _clean 
X{
X	int (*function)();
X	struct _clean *next;
X} *cleanlist = NULL;
X
X/* add_cleanup
X * given a function, add it to a list of functions to call when cleanup
X * is executed
X */
Xadd_cleanup(function)
Xint (*function)();
X{
X	struct _clean *ptr;
X
X	ptr = AllocMem(sizeof(struct _clean), MEMF_PUBLIC);
X	if(!ptr)
X		return 0;
X	ptr->function = function;
X	ptr->next = cleanlist;
X	cleanlist = ptr;
X}
X
X/* cleanup
X * call all the functions that were passed as arguments to add_cleanup
X * this run
X */
Xcleanup()
X{
X	struct _clean *ptr;
X	int (*f)();
X
X	fflush(stdout);
X	fflush(stderr);
X
X	while(cleanlist) 
X	{
X		/* locate the next cleanup function and get the function pointer */
X		ptr = cleanlist;
X		cleanlist = cleanlist->next;
X		f = ptr->function;
X
X		/* cleanup must clean up after itself */
X		FreeMem(ptr, sizeof(struct _clean));
X
X		/* execute the function */
X		(*f)();
X
X		fflush(stdout);
X		fflush(stderr);
X	}
X}
X
X/* panic - abort with an error message */
X
Xshort panic_in_progress = 0;
X
Xpanic(s)
Xchar *s;
X{
X	fflush(stdout);
X	fprintf(stderr,"panic: %s\n",s);
X	fflush(stderr);
X	if (!panic_in_progress)
X	{
X		cleanup();
X		exit(10);
X	}
X	fprintf(stderr,"double panic!\n");
X}
X
X_abort()
X{
X	panic("^C or other C library abort");
X}
END_OF_FILE
if test 1419 -ne `wc -c <'cleanup.c'`; then
    echo shar: \"'cleanup.c'\" unpacked with wrong size!
fi
# end of 'cleanup.c'
fi
if test -f 'dumpvoice.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dumpvoice.c'\"
else
echo shar: Extracting \"'dumpvoice.c'\" \(1885 characters\)
sed "s/^X//" >'dumpvoice.c' <<'END_OF_FILE'
X/* dumpvoice */
X
X#include "casio.h"
X#include "fz1.h"
X#include <stdio.h>
X
Xdumpvoice(p)
Xstruct voicedata *p;
X{
X	printf("wave_start_address %ld, wave_end_address %ld\n",wave_start_address,wave_end_address);
X	printf("generator_start_address %ld, generator_end_address %ld\n",generator_start_address,generator_end_addresss);
X
X	printf("loop_style %d, sustain_loop_number %d, multi_loop_end_number %d\n",loop_style,sustain_loop_number,multi_loop_end_number);
X
X	for (i = 0; i < 8; i++)
X	{
X		printf("loop_start_addresses[%d] %ld, loop_end_address[%d] %ld\n",i,loop_start_addresses[i],i,loop_end_addresses[i]);
X		printf("loop_cross_feed_time[%d] %ld, loop_time[%d] %ld\n",loop_cross_feed_time[i],loop_time[i]);
X	}
X
X	printf("voice_pitch %d, frequency_offset %d, filter_Q_offset %d\n",voice_pitch,frequency_offset,filter_Q_offset);
X
X
X	printf("dca_envelope_sustain_point %d, dca_envelope_end_point %d\n",dca_envelope_sustain_point,dca_envelope_end_point);
X	BYTE	dca_envelope_sustain_point;
X	BYTE	dca_envelope_end_point;
X	BYTE	dca_envelope_rate_values[NLOOPS];
X	UBYTE	dca_envelope_stop_values[NLOOPS];
X
X	BYTE	dcf_envelope_sustain_point;
X	BYTE	dcf_envelope_end_point;
X	BYTE	dcf_rate_envelope_rate_values[NLOOPS];
X	UBYTE	dcf_envelope_stop_values[NLOOPS];
X
X	unsigned short lfo_delay_time;
X	UBYTE	lfo_waveform;
X	UBYTE	lfo_attack_value;
X	BYTE	lfo_rate;
X	BYTE	lfo_pitch_depth;
X	BYTE	lfo_amplitude_depth;
X	BYTE	lfo_filter_depth;
X	BYTE	lfo_filter_Q_depth;
X	BYTE	initial_touch_Q_follow;
X
X	BYTE	dca_keyboard_follow_depth;
X	BYTE	dca_noterate_scaling_depth;
X	BYTE	dcf_keyboard_follow_depth;
X	BYTE	dcf_noterate_scaling_depth;
X
X	BYTE	initial_touch_dca_key_follow;
X	BYTE	initial_touch_dca_rate_scaling;
X	BYTE	initial_touch_dcf_key_follow;
X	BYTE	initial_touch_dca_rate_scaling;
X
X	UBYTE	high_width_MIDI_code;	
X	UBYTE	low_width_MIDI_code;
X	UBYTE	keynote_center;
X
X	UBYTE	sampling_frequency_index;
X
X	char	name[14];
X}
X
X
END_OF_FILE
if test 1885 -ne `wc -c <'dumpvoice.c'`; then
    echo shar: \"'dumpvoice.c'\" unpacked with wrong size!
fi
# end of 'dumpvoice.c'
fi
if test -f 'fz1.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fz1.h'\"
else
echo shar: Extracting \"'fz1.h'\" \(1453 characters\)
sed "s/^X//" >'fz1.h' <<'END_OF_FILE'
X/* Casio FZ-1 data structure definitions */
X
X#define NLOOPS 8
X
Xstruct voicedata
X{
X	long	wave_start_address;
X	long	wave_end_address;
X	long	generator_start_address;
X	long	generator_end_address;
X
X	short	loop_style;
X	BYTE	sustain_loop_number;
X	BYTE	multi_loop_end_number;
X	long	loop_start_addresses[NLOOPS];
X
X	long	loop_end_addresses[NLOOPS];
X
X	short	loop_cross_feed_time[NLOOPS];
X	unsigned short loop_time[NLOOPS];
X
X	short	voice_pitch;	/* voice pitch with detune */
X	BYTE	frequency_offset;
X	BYTE	filter_Q_offset;
X
X	BYTE	dca_envelope_sustain_point;
X	BYTE	dca_envelope_end_point;
X	BYTE	dca_envelope_rate_values[NLOOPS];
X	UBYTE	dca_envelope_stop_values[NLOOPS];
X
X	BYTE	dcf_envelope_sustain_point;
X	BYTE	dcf_envelope_end_point;
X	BYTE	dcf_rate_envelope_rate_values[NLOOPS];
X	UBYTE	dcf_envelope_stop_values[NLOOPS];
X
X	unsigned short lfo_delay_time;
X	UBYTE	lfo_waveform;
X	UBYTE	lfo_attack_value;
X	BYTE	lfo_rate;
X	BYTE	lfo_pitch_depth;
X	BYTE	lfo_amplitude_depth;
X	BYTE	lfo_filter_depth;
X	BYTE	lfo_filter_Q_depth;
X	BYTE	initial_touch_Q_follow;
X
X	BYTE	dca_keyboard_follow_depth;
X	BYTE	dca_noterate_scaling_depth;
X	BYTE	dcf_keyboard_follow_depth;
X	BYTE	dcf_noterate_scaling_depth;
X
X	BYTE	initial_touch_dca_key_follow;
X	BYTE	initial_touch_dca_rate_scaling;
X	BYTE	initial_touch_dcf_key_follow;
X	BYTE	initial_touch_dca_rate_scaling;
X
X	UBYTE	high_width_MIDI_code;	
X	UBYTE	low_width_MIDI_code;
X	UBYTE	keynote_center;
X
X	UBYTE	sampling_frequency_index;
X
X	char	name[14];
X}
X
X
END_OF_FILE
if test 1453 -ne `wc -c <'fz1.h'`; then
    echo shar: \"'fz1.h'\" unpacked with wrong size!
fi
# end of 'fz1.h'
fi
if test -f 'hilo.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'hilo.c'\"
else
echo shar: Extracting \"'hilo.c'\" \(1753 characters\)
sed "s/^X//" >'hilo.c' <<'END_OF_FILE'
X/* hilo - print highest and lowest sample values */
X
X#include <stdio.h>
X
Xshort buffer[512];
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X	FILE *fopen(), *fp;
X	short sample, i, average;
X	short blockhisample, blocklosample;
X	short grandhisample = -32768, grandlosample = 32767;
X	long grandtotal = 0, nsamples = 0;
X	long blocktotal;
X	unsigned long blockvariance, grandvariance = 0;
X	unsigned long sample_squared;
X
X	if (argc != 2)
X	{
X		fprintf(stderr,"usage: hilo casiodumpfilename\n");
X		printf("argc %d\n",argc);
X		exit(1);
X	}
X
X	if ((fp = fopen(argv[1],"r")) == NULL)
X	{
X		perror(argv[1]);
X		exit(2);
X	}
X
X	if (fseek(fp,1024L,1) == -1)
X	{
X		perror(argv[1]);
X		exit(3);
X	}
X
X	while (fread(buffer,1024,1,fp) != 0)
X	{
X		nsamples += 512;
X
X		blockhisample = -32768;
X		blocklosample = 32767;
X		blocktotal = 0;
X		blockvariance = 0;
X
X		for (i = 0; i < 512; i++)
X		{
X			sample = buffer[i];
X			/* printf("%4x ",(sample >> 4) & 0xf); */
X
X			/* compute block values */
X			blocktotal += sample;
X			if (sample < blocklosample)
X				blocklosample = sample;
X			if (sample > blockhisample)
X				blockhisample = sample;
X
X			/* compute grand values */
X			grandtotal += sample;
X			if (sample < grandlosample)
X				grandlosample = sample;
X			if (sample > grandhisample)
X				grandhisample = sample;
X
X			/* compute variance */
X			sample_squared = ((sample / 32) * (sample / 32));
X			blockvariance += sample_squared;
X			grandvariance += sample_squared;
X		}
X		average = blocktotal/512;
X
X			printf("512 samples: avg %d, hi %d, lo %d, variance %ld\n",average,blockhisample,blocklosample,blockvariance * 2);
X	}
X	average = grandtotal/nsamples;
X
X	printf("totals: nsamples %ld, avg %d, hi %d, lo %d, variance %ld\n",nsamples,average,grandhisample,grandlosample,grandvariance * 2);
X	exit(0);
X}
END_OF_FILE
if test 1753 -ne `wc -c <'hilo.c'`; then
    echo shar: \"'hilo.c'\" unpacked with wrong size!
fi
# end of 'hilo.c'
fi
if test -f 'hilo.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'hilo.uu'\"
else
echo shar: Extracting \"'hilo.uu'\" \(12525 characters\)
sed "s/^X//" >'hilo.uu' <<'END_OF_FILE'
Xbegin 644 hilo
XM```#\P`````````#``````````(```?$```!W`````$```/I```'Q$[Z".).;
XM5?_62.<``#M\@`#_\#M\?___[D*M_^I"K?_F0JW_V@RM`````@`(9P``*$AZI
XM`@I(;(&`3KH"F%!/+RT`"$AZ`A=.N@0&4$](>``!3KH<B%A/2'H"#"!M``PO>
XM*``$3KH%R%!/*T#__&8``!H@;0`,+R@`!$ZZ`MQ83TAX``).NAQ66$](>``!K
XM2'@$`"\M__Q.N@/>3^\`#`R`_____V8``!H@;0`,+R@`!$ZZ`J983TAX``-.R
XMNAP@6$\O+?_\2'@``4AX!`!(;(,63KH"*$_O`!!*@&<``1@&K0```@#_YCM\A
XM@`#_]#M\?___\D*M_^)"K?_>0FW_^&````92;?_X#&T"`/_X;```JC`M__A(;
XMP-"`0>R#%CMP"`#_^C!M__H@"-&M_^(P+?_ZL&W_\FP```@[;?_Z__(P+?_Z?
XML&W_]&\```@[;?_Z__0P;?_Z(`C1K?_J,"W_^K!M_^YL```(.VW_^O_N,"W_^
XM^K!M__!O```(.VW_^O_P,&W_^B`(<B!.NA<2+P`P+?_Z2,!R($ZZ%P0B`"`?Q
XM3KH=3BM`_]8@+?_6T:W_WB`M_];1K?_:8`#_3"(\```"`"`M_^).NA;6.T#_0
XM]B`M_][0@"\`,&W_\B\(,&W_]"\(,&W_]B\(2'H`@DZZ`F9/[P`48`#^SB(MU
XM_^8@+?_J3KH6G#M`__8@+?_:T(`O`#!M_^XO"#!M__`O"#!M__8O""\M_^9(`
XM>@!U3KH"*$_O`!A"ITZZ&JI83TS?``!.74YU=7-A9V4Z(&AI;&\@8V%S:6]D:
XM=6UP9FEL96YA;64*`&%R9V,@)60*`'(`-3$R('-A;7!L97,Z(&%V9R`E9"P@9
XM:&D@)60L(&QO("5D+"!V87)I86YC92`E;&0*`'1O=&%L<SH@;G-A;7!L97,@R
XM)6QD+"!A=F<@)60L(&AI("5D+"!L;R`E9"P@=F%R:6%N8V4@)6QD"@``2.<@!
XM($'O`!0D2"\*+R\`%"\O`!1.N@W")``@`D_O``Q,WP0$3G5(YSPP)F\`'"HOO
XM`"`D;P`H2H5F"'``3-\,/$YU=`!@-"8%8"H@4K'J``1D"B!24I)P`!`08`@OW
XM"DZZ`A983R@`#(#_____9Q(6A%*+4X-*@V;24H*TKP`D9<8@`F"X2.<`("1ON
XM``@@"F<>2A)G&DAL@8`O"DZZ`)9(;(&`2'H`2$ZZ`(I/[P`0+RR'%DZZ!2(D*
XM0$J`6$]G*$H29R1(;(&`+RR'%DZZ!0I83R\`3KH`7DAL@8!(>``*3KH`$$_O\
XM`!!,WP0`3G4Z(```2.<@("0O``PD;P`0(`IG!DIJ``QF"'#_3-\$!$YU(%*Q:
XMZ@`$9`P@4E*2$()P`!`"8.9P`!`"+P`O"DZZ$B903V#62.<@,"9O`!`D;P`48
XM8#0@4K'J``1D#"!24I(0@G``$`)@#G``$`(O`"\*3KH1]%!/#(#_____9@API
XM_TS?#`1.=5*+%!-FR'``8/!(YR`@0>\`$"1(+PHO+P`02&R!:DZZ#$8D`"`"P
XM3^\`#$S?!`1.=4CG/B`D;P`<+"\`("@O`"0@"F<``+PZ*@`,9P``M"!*T?P`!
XM```,,!`"0._],(`(!0`.9Q1(>/__+PI.NA%T2H!03V8``(Q@7`R$`````F=4H
XM("H`!)"2)@!O2C`%`D`8@&8X)`9*A&8<2'@``4*G$"H`#DB`2,`O`$ZZ%@209
XM@Y2`3^\`#"`2D*H`"-"";0RT@VX(($+1TB2(8"X,A`````%F`IR#)6H`"``$_
XM)*H`""\$+P80*@`.2(!(P"\`3KH5P$J`3^\`#&T(<`!,WP1\3G5P_V#V2.<PM
XM,"1O`!0@"F<6<``P*@`,)@!G#`@#``IF!@@#``-G"'#_3-\,#$YU(%*QZ@`$Q
XM90``IDJJ``AF""\*3KH3NEA/,"H`#`)``*!G,$'L@50F2'``,"L`#`*```!`2
XM(`R```!`(&8(+PM.N@_N6$_7_````!9![(,,M\AEUB!*T?P````,,!`"0*__R
XM,(`O*@`0+RH`"!`J``Y(@$C`+P!.N@C\)`!/[P`,;B!*@F8$<`)@`G`$($K1"
XM_`````QR`#(0@($P@'#_8`#_7"2J``@@0M'J``@E2``$(%)2DG``$!!@`/]"*
XM2'C__TZZ`.XO`"\O`!`O+P`03KH`"$_O`!!.=4CG/#(L;P`@)&\`)"9O`"@H4
XM+P`L)CP```0`$!)(@$C`*@`,@````')F#B0\```0`"8\```"`&`H#(4```!WS
XM9@@D/```$P%@&`R%````868()#P``!D!8`AP`$S?3#Q.=5**$!)(@`Q``"MFE
XM#!`J``%(@`Q``&)G#!`22(`,0`!B9@I2B@C#``0(@@`,$!)(@`Q``"MF&B`"\
XM"(```"0`",(``2`#`H#___G_)@`(PP`+(`YG#"\"+PY.N@8.*`!03TJ$;90,;
XMA````!1LC!=$``XW0P`,(`M@@DCG`"!![(%4)$A*:@`,9QC5_````!9![(,,K
XMM<AF"'``3-\$`$YU8.)":@`40I)"J@`$0JH`""`*8.8`3F\@<W5C:"!F:6QE'
XM(&]R(&1I<F5C=&]R>0!!<F<@;&ES="!T;V\@;&]N9P!"860@9FEL92!D97-CT
XM<FEP=&]R`$YO="!E;F]U9V@@;65M;W)Y`$9I;&4@97AI<W1S`$EN=F%L:60@7
XM87)G=6UE;G0`1FEL92!T86)L92!O=F5R9FQO=P!4;V\@;6%N>2!O<&5N(&9IG
XM;&5S`$YO="!A(&-O;G-O;&4`4&5R;6ES<VEO;B!D96YI960`22]/(&5R<F]R,
XM`$YO('-P86-E(&QE9G0@;VX@9&5V:6-E`%)E<W5L="!T;V\@;&%R9V4`07)GW
XM=6UE;G0@;W5T(&]F(&1O;6%I;@!%>&5C(&9O<FUA="!E<G)O<@!296%D+6]NL
XM;'D@9FEL92!S>7-T96T`0W)O<W,M9&5V:6-E(')E;F%M90!.;W1H:6YG('1O#
XM(')E860`2.<@`"0O``A*@FT:#((````2;A(@`N6`0>R``B`P"`!,WP`$3G5!:
XM^@`&(`A@\E5N:VYO=VX@97)R;W(`*D]A<D/L@Q9%[(,6M<EF#C(\`19K"'0`P
XM(L)1R?_\*4^'&BQX``0I3H<>2.>`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].Y
XM<T/Z`").KOYH*4"'(F8,+CP``X`'3J[_E&`&*D].N@`:4$].=61O<RYL:6)R[
XM87)Y`$GY``!__DYU2.<`($CG``(B/``!```P+(,,P?P`!BQLAQY.KO\Z3-]`X
XM`"E`AR9F'DCG`0:;S2X\``$``"QLAQY.KO^43-]@@"YLAQI.=2!LAR9":``$?
XM(&R')C%\``$`$"!LAR8Q?``!``H@;(<:("R'&I"H``10@"E`ARH@;(<J(+Q-.
XM04Y82.<``I/)+&R''DZN_MI,WT``)$!*J@"L9SPO+P`,+R\`#"\*3KH!#"E\>
XM`````8<N(&R')EB(,!``0(``,(`@;(<FT?P````*,!``0(``,(!/[P`,8&I(;
XMYP`"($K1_````%PL;(<>3J[^@$S?0`!(YP`"($K1_````%PL;(<>3J[^C$S?0
XM0``I0(<R(&R',DJH`"1G)DCG``(@;(<R(&@`)"(0+&R'(DZN_X),WT``+RR'I
XM,B\*3KH$Z%!/*6R',H<V2.<``BQLAR).KO_*3-]``"!LAR8@@$CG``(L;(<BV
XM3J[_Q$S?0``@;(<F(4``!F<D2.<@`B0\```#[4'Z`#0B""QLAR).KO_B3-]`8
XM!"!LAR8A0``,+RR'-B\LASI.NO4&4$\O`$ZZ$=183TS?!`!.=2H`2.<X,B8O-
XM`!PH+P`@)F\`)"!#2J@`K&<4($,@*`"LY8`L0"`N`!#E@"1`8`0D;(,.$!)(&
XM@$C`T(14@"E`ASY(YP`"<@`@+(<^+&R''DZN_SI,WT``*4"'0F8&3-],'$YUC
XM$!)(@$C`)``O`B!*4H@O""\LAT).N@3R2'H!2B!"T>R'0B\(3KH.ZB\$+PLOL
XM+(="3KH!-"!LAT)","@`*7P````!ASHD0M7LAT)2BB9*3^\`(!`22(!(P"0`X
XM#(`````@9R`,@@````EG&`R"````#&<0#((````-9P@,@@````IF!%**8,P,Z
XM$@`@;78,$@`B9BI2BA`:2(!(P"0`9QP6P@R"````(F80#!(`(F8$4HI@!D(KY
XM__]@`F#:8#@0&DB`2,`D`&<L#((````@9R0,@@````EG'`R"````#&<4#((`9
XM```-9PP,@@````IG!!;"8,I"&TJ"9@)3BE*LASI@`/]20A-(YP`"<@`@+(<ZH
XMY8!8@"QLAQY.KO\Z3-]``"E`AS9F"$*LASI@`/[0=``D;(="8!H@`N6`(&R'L
XM-B&*"``O"DZZ"-C5P%**6$]2@K2LASIMX"`"Y8`@;(<V0K`(`&``_I@@`$SO_
XM`P``!"`((B\`#$H89OQ3B!#95\G__`2!``$``&KR0B!.=2\O``A(>`,!+R\`^
XM#&$&3^\`#$YU2.<^,BQO`"0H+P`H3KH/2"9LAR9T`&`0<@8@`DZZ$;Q*LP@`3
XM9Q!2@C!L@PRQPF[H=@A@``%."`0`"6=>2.<@`G3_(B\`!"QLAR).KO^L3-]`R
XM!"H`9T1(YP`"(@4L;(<B3J[_IDS?0`!(YP`"(A<L;(<B3J[_N$S?0`!*@&8<3
XM2.<``BQLAR).KO]\3-]``"8`#(````#-9@``ZDCG(`(D/````^TB+P`$+&R'X
XM(DZN_^),WT`$)$`@"F8``*0(!``(9@9V`6```+Q(YR`")#P```/N(B\`!"QLH
XMAR).KO_B3-]`!"1`2H!F%DCG``(L;(<B3J[_?$S?0``F`&```(9(YP`"<"%#$
XM^@#`+&R''DZN_=A,WT``+`!G%$CG``(B1BQLAQY.KOYB3-]``&`P2.<P`G8!?
XM0?H`GB0((@HL;(<B3J[_T$S?0`Q(YS`"=O]T`"(*+&R'(DZN_[Y,WT`,8#`@+
XM!`*````%``R````%`&8@2.<``B(*+&R'(DZN_]Q,WT``=@4I0X<6</],WTQ\H
XM3G5R!B`"3KH01B>*"`!R!B`"3KH0.C>$"`0(!``+9Q9(YS`"=@%T`"(*+&R'2
XM(DZN_[Y,WT`,(`)@PF1O<RYL:6)R87)Y````2.<P("0O`!!.N@UX<@8@`DZZ0
XM#_0D0-7LAR9*@FT,,&R##+'";P1*DF80*7P````#AQ9P_TS?!`Q.=3`J``1(5
XMP`*``````PR``````68,*7P````&AQ9P_V#:2.<P`B8O`"0D+P`@(A(L;(<BW
XM3J[_UDS?0`PF``R`_____V882.<``BQLAR).KO]\3-]``"E`AQ9P_V">(`-@^
XMFDCG,#(L;P`82.<``G``0_H`UBQLAQY.KOW83-]``"E`AT9F!DS?3`Q.=4CGB
XM``(@;P`@(&@`)"!H``0L;(=&3J[_LDS?0``D0$J`9WY(YP`"0_H`H2!J`#8LT
XM;(=&3J[_H$S?0``D`&=02.<@`B0\```#[2(7+&R'(DZN_^),WT`$)D!*@&<R*
XM(`OE@"8`($,M:``(`*0M2P"<2.<@`B0\```#[4'Z`%8B""QLAR).KO_B3-]`3
XM!"U``*!(YP`"($HL;(=&3J[_IDS?0`!(YP`"(FR'1BQLAQY.KOYB3-]``$*L;
XMAT9@`/]`:6-O;BYL:6)R87)Y`%=)3D1/5P`J`$SO`P``!"`((B\`#&`"$-E7C
XMR?_\9PP$@0`!``!J\$YU0AA1R?_\!($``0``:O).=4Y5_?1(YS\R)FT`""QM6
XM`!!^`"1M``P6$F8*(`=,WTS\3EU.=5**#`,`)6=")`<@4['K``1D#"!34I,0:
XM@W``$`-@#G``$`,O`"\+3KH%+E!/#(#_____9P`$9%*"%A)F!"`"8+A2B@P#<
XM`"5FPBX">``K?````"#__!8:<``0`V!F",0``&#R",0``6#L",0``F#F",0`'
XM`V#@6(XD+O_\2H)L!@C$``!$@A8:8%8K?````##__'0`8!@@`N>`<@`2`]"!+
XMT(+0@B0`!((````P%AIP`!`#0>R`4Q`P``!(@`@```)FU&`<!$``(&>@5T!GB
XMHE]`9Z130&>.54!GA%=`9ZQ@LBM"__@D/```?<8,`P`N9EP6&@P#`"IF%%B.?
XM)"[__$J";`8D/```?<86&F`P=`!@&"`"YX!R`!(#T('0@M"")``$@@```#`6/
XM&G``$`-![(!3$#```$B`"````F;4#((``'W&9P@K?````"#__"H"#`,`:&8&Z
XM",0`!V`6#`,`;&8&",0`!F`*#`,`3&8&",0`"!8:*TH`#'``$`-@``&.8``#-
XM&@@$``=G"EB.(&[__#"'8!@(!``&9PI8CB!N__P@AV`(6(X@;O_\((=T`&``G
XM`:A8CB1N__PO"DZZ`P@D``R%``!]QEA/9P:TA6\")`5@``&&6(X6+O__0>W]!
XM^"1($(-T`6```7)T"&`0`$0`2'9X=!!@!@C$``1T"@P#`%AF"$'Z`IX@"&`&;
XM0?H"IR`(*T#]]`@$``9G"%B.+"[__&`4"`0`!&<(6(XL+O_\8`98CBPN__P([
XM!``$9PI*AFP&1(8(Q``%0>W_^"1(#(4``'W&9@)Z`4J&9@1*A6<<(@(@!DZZ\
XM!:P@;?WT%3`(`"("(`9.N@6H+`!FY$'M__B1RB0("`0``V=N#`,`;V842H)GL
XM"@P2`#!G"+2%;00J`E*%8%0,`P!X9P8,`P!89DA*@F=$#!(`,&<^M(5L$$'M^
XM_?JQRF0(%3P`,%*"8.P(!```9AP,K0```##__&82(`)4@+"M__AL""HM__A5*
XMA6#*%0,5/``P5(*TA6P00>W]^+'*9`@5/``P4H)@[&!,!$``)6<`_L@$0``SW
XM9P#^V`1```MG`/ZR4T!G`/[.6T!G`/[(6T!G`/Y04T!G`/ZN4T!G`/ZL5T!G)
XM`/YL54!G`/ZN5T!G`/Z@8`#^*@@$``1G*`@$``5G!A4\`"U@&@@$``%G!A4\6
XM`"M@#@@$``)G!A4\`"!@`E."4H+>@@@$``!F``"0#*T````P__QF0@@$``1GU
XM/#`$`D``)F<T(%.QZP`$9`X@4U*3$)IP`!`J__]@#G``$!HO`"\+3KH!DE!/-
XM#(#_____9P``R%.M__A3@F`T(%.QZP`$9!`@4U*3$*W__W``$"W__V`0<``0,
XM+?__+P`O"TZZ`5A03PR`_____V<``(Y2AR`M__A3K?_XL()NP"H"(`)3@DJ`R
XM9RX@4['K``1D#B!34I,0FG``$"K__V`.<``0&B\`+PM.N@$24$\,@/____]G>
XM2&#*"`0``&<\)`5@+"!3L>L`!&0.(%-2DQ"\`"!P`'`@8`Q(>``@+PM.N@#<)
XM4$\,@/____]G$E*'("W_^%.M__BP@F[(8`#[6'#_8`#[7#`Q,C,T-38W.#E!#
XM0D-$148`,#$R,S0U-C<X.6%B8V1E9@`@;P`$(`A*&&;\4TB1P"`(3G5(YP`@;
XM)&\`""`*9D1![(%4)$A*:@`,9R8P*@`,`D`""&8<2'C__R\*3KH`6@R`____`
XM_U!/9@AP_TS?!`!.==7\````%D'L@PRUR&7&<`!@Z$AX__\O"DZZ`"Q03V#:T
XM2.<`($'L@50D2"\*3KH!OEA/U?P````60>R##+7(9>I,WP0`3G5(YSP@)&\`C
XM&"@O`!P@"F<``9`T*@`,9P`!B`@"``EF``&`"`(``V8``7@@2M'\````##`0P
XM`D#O_3"`2JH`"&8<#(3_____9@AP`$S?!#Q.=2\*3KH"R#0J``Q83P@"``YF.
XM-"!2L>H`"&,>2'@``2`2D*H`!"\`$"H`#DB`2,`O`$ZZ!$Q/[P`,)*H`""!JS
XM`!#1TB5(``0,A/____]F!'8`8`(6!"`2D*H`""H`,`("0`"@9TX,A/____]GF
XM(B!24I(0@R!*T?P````,,!`(P``.,(`T`$'Z_P0I2(=*4H4,A/____]G#`P#M
XM``IG!KJJ`!!E!'C_8`PE4@`$<``0`V``_TH(`@`.9S!*A6<<+P4O*@`($"H`N
XM#DB`2,`O`$ZZ!':PA4_O``QF7B!*T?P````,,!`(@``.,(`,A/____]F$B2JM
XM``@E:@`(``1P`!`#8`#^^D'Z_H8I2(=*($K1_`````PP$`C```XP@"2J``@@^
XM:@`0T=(E2``$(%)2DA"#<``0`V``_L8@2M'\````##`0",```C"`)6H`"``$V
XM)*H`"'#_8`#^IDY5__9(YS@@)&T`"'0`(`IG!DIJ``QF"G#_3-\$'$Y=3G4(L
XM*@`!``QF"B\*3KK]J(2`6$\0*@`.2(!(P"\`3KH&B(2`""H````-6$]G"B\J)
XM``A.N@&66$]*:@`49TY(>@!J2&W_]TZZ`E`X*@`4=@!03W``,`1R"DZZ`'P&Q
XM@````#!R!Y*#0>W_]Q&`&`!(Q(G\``I2@PR#````!6W40BW__TAM__=.N@,2%
XM6$]"DD*J``1"J@`(0FH`#$J"9P9P_V``_UAP`&``_U)435``2.=(`$*$2H!JY
XM!$2`4D1*@6H&1($*1``!83Y*1&<"1(!,WP`22H!.=4CG2`!"A$J`:@1$@%)$@
XM2H%J`D2!81H@`6#8+P%A$B`!(A]*@$YU+P%A!B(?2H!.=4CG,`!(04I!9B!((
XM038!-`!"0$A`@,,B`$A`,@*"PS`!0D%(04S?``Q.=4A!)@$B`$)!2$%(0$)`[
XM=`_0@-.!MH%B!)*#4D!1RO_R3-\`#$YU2.<@("1O``QT01`J``Y(@$C`+P!.)
XMN@$Z2H!83V<"="$E?```!```$$AX!`!.N@#&)4``"%A/9A@E?`````$`$"!*9
XMT?P````/)4@`"#0\`(`@2M'\````#'``,!`R`DC!@($P@"5J``@`!"2J``A,?
XMWP0$3G5(YP`PE\LD;(=.8!`@2E"((F\`#+/(9PXF2B12(`IF[$S?#`!.=2`+6
XM9P0FDF`$*5*'3DCG``(@*@`$4(`B2BQLAQY.KO\N3-]``&#42.<`,"1LATY@[
XM'"922.<``B`J``10@")*+&R''DZN_RY,WT``)$L@"F;@0JR'3DS?#`!.=4CGK
XM("`D+P`,2H)F"'``3-\$!$YU2.<``G(`(`)0@"QLAQY.KO\Z3-]``"1`2H!F%
XM!'``8-I!^O^6*4B'4B2LATXE0@`$*4J'3B`*4(!@P$SO`P``!"`($-EF_$YUR
XM2.<@("0O``QR!B`"3KH$3"1`U>R')DJ";0PP;(,,L<)O!$J29A`I?`````.'I
XM%G#_3-\$!$YU2.<``G(&(`).N@0:(&R')B(P"``L;(<B3J[_*$S?0`!*@&<$#
XM<`%@`G``8,Y(YS`@)"\`$$ZZ`6IR!B`"3KH#YB1`U>R')DJ";0PP;(,,L<)OU
XM!$J29A`I?`````.'%G#_3-\$#$YU2.<P`B`O`"13@"8`)"\`("(2+&R'(DZNY
XM_[Y,WT`,)@`,@/____]F&$CG``(L;(<B3J[_?$S?0``I0(<6</]@NDCG,`)V:
XM`'0`(A(L;(<B3J[_ODS?0`Q@HDCG``(B+P`(+&R'(DZN_[A,WT``2H!F&$CG[
XM``(L;(<B3J[_?$S?0``I0(<6</].=7``8/I(YS`@)"\`$$ZZ`*1R!B`"3KH#:
XM("1`U>R')DJ";0PP;(,,L<)O!$J29A`I?`````.'%G#_3-\$#$YU,"H`!`)`L
XM``-F#"E\````!H<6</]@Y`@J``,`!&<62.<P`G8!=``B$BQLAR).KO^^3-]`+
XM#$CG,`(F+P`D)"\`("(2+&R'(DZN_]!,WT`,)@`,@/____]F&$CG``(L;(<BN
XM3J[_?$S?0``I0(<6</]@BB`#8(9(YR``2.<``B(\```0`'``+&R''DZN_LY,Y
XMWT``)``(```,9Q)*K(<N9@@@`DS?``1.=4ZZ``9P`&#R2.<P`G8$0?H`+B0(]
XM+P,O`BQLAR).KO_$(@`D'R8?+&R'(DZN_]!,WT`,2'@``4ZZ``I83TYU7D,*X
XM`$JLAU9G%"!LAU8@:``$3I`@;(=6*5"'5F#F2JR'2F<&(&R'2DZ0+R\`!$ZZ_
XM``983TYU2.<P`"8O``Q*K(<F9S)T`&`*+P).N@%P6$]2@C!L@PRQPF[N2.<`8
XM`C`L@PS!_``&(FR')BQLAQY.KO\N3-]``$JLAU)G!B!LAU).D$JL@Q)G%$CGP
XM``(B+(,2+&R'(DZN_Z9,WT``2JR'6F<((&R'6B"LAUY*K(=B9Q1(YP`"(FR'V
XM8BQLAQY.KOYB3-]``$JLAV9G%$CG``(B;(=F+&R''DZN_F),WT``2JR':F<46
XM2.<``B)LAVHL;(<>3J[^8DS?0`!*K(=N9Q1(YP`"(FR';BQLAQY.KOYB3-]`2
XM`$CG``8L>``$""X`!`$I9Q!+^@`(3J[_XF`&0J?S7TYS*E]*K(<R9CQ*K(="=
XM9S1(YP`"("R'/B)LAT(L;(<>3J[_+DS?0`!(YP`"("R'.N6`6(`B;(<V+&R'J
XM'DZN_RY,WT``8"1(YP`"+&R''DZN_WQ,WT``2.<``B)LAS(L;(<>3J[^ADS?F
XM0`!(YP`"(FR'(BQLAQY.KOYB3-]``"`#+FR'&DYU3-\`#$YU2.<@("0O``QR'
XM!B`"3KH`2B1`U>R')DJ";0PP;(,,L<)O!$J29A`I?`````.'%G#_3-\$!$YU>
XM,"H`!`)`@`!F$DCG``(B$BQLAR).KO_<3-]``$*2<`!@V$CG<``T`<3`)@%(#
XM0\;`2$-"0]2#2$#`P4A`0D#0@DS?``Y.=0`````#[`````$````!```)7```G
XM``````/R```#Z@```,4```=:```'6P``!W4```>'```'FP``!ZT```>Y```'1
XMR@``!]X```?R```(````"!(```@<```(-```"$4```A<```(;@``"(0```B8]
XM````$P`@("`@("`@("`P,#`P,"`@("`@("`@("`@("`@("`@()!`0$!`0$!`S
XM0$!`0$!`0$`,#`P,#`P,#`P,0$!`0$!`0`D)"0D)"0$!`0$!`0$!`0$!`0$!\
XM`0$!`0$!0$!`0$!`"@H*"@H*`@("`@("`@("`@("`@("`@("`@)`0$!`(```*
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM``````(````````!```````````````````$``$``````0``````````````)
XM````!``"``````$`````````````````````````````````````````````'
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````!0``````````````^P````36
XM```````````````$````"`````P````0````%````!@````<````(````"0`T
XM```H````+````#`````T````.````#P```!`````1````$@````````#\@``M
X*`^L````!```#\C``4
X``
Xend
Xsize 8920
END_OF_FILE
if test 12525 -ne `wc -c <'hilo.uu'`; then
    echo shar: \"'hilo.uu'\" unpacked with wrong size!
fi
# end of 'hilo.uu'
fi
if test -f 'prototypes.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'prototypes.h'\"
else
echo shar: Extracting \"'prototypes.h'\" \(649 characters\)
sed "s/^X//" >'prototypes.h' <<'END_OF_FILE'
X
X/* casio.c */
Xvoid midi_cleanup(void);
XUBYTE its_an_fz1_message(UBYTE *msg, int requested_channel);
Xvoid commune_with_fz1(struct MSource *source, struct MDest *dest, int channel, int outfd);
Xvoid send_fz(struct MSource *source, int channel_id, int message_id);
Xint calc_checksum(struct FZ1_Message *p);
Xvoid capture(struct FZ1_Message *p, int outfd);
Xmain(int argc,char *argv[]);
Xvoid _abort(void);
Xvoid dump_open(struct FZ1_Message *p);
X
X/* timer.c */
Xstruct timerequest *CreateTimer(int unit);
Xint DeleteTimer(struct timerequest *tr);
Xvoid trash_timer(void);
Xvoid init_timer(void);
Xvoid start_timeout_timer(void);
Xvoid abort_timeout_timer(void);
END_OF_FILE
if test 649 -ne `wc -c <'prototypes.h'`; then
    echo shar: \"'prototypes.h'\" unpacked with wrong size!
fi
# end of 'prototypes.h'
fi
if test -f 'timer.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'timer.c'\"
else
echo shar: Extracting \"'timer.c'\" \(1620 characters\)
sed "s/^X//" >'timer.c' <<'END_OF_FILE'
X/* casio reader timer stuff */
X
X#include <stdio.h>
X#include <exec/types.h>
X#include <functions.h>
X#include <intuition/intuition.h>
X#include <devices/timer.h>
X#include <devices/audio.h>
X
X#include "prototypes.h"
X
Xstruct timerequest *timer_request;
X
Xstruct Device *TimerBase;
X
Xstruct timerequest *CreateTimer(int unit)
X{
X	long error;
X
X	register struct MsgPort *timerport;
X	register struct timerequest *timermsg;
X
X	timerport = CreatePort(0L, 0L);
X
X	if (!timerport)
X		return 0;
X
X	timermsg =  (struct timerequest *)CreateExtIO(timerport, (long)sizeof(struct timerequest));
X
X	if (!timermsg) 
X	{
X		DeletePort(timerport);
X		return 0;
X	}
X
X	error = OpenDevice(TIMERNAME, (long)unit, timermsg, 0L);
X	if (error)
X	{
X		DeleteTimer(timermsg);
X		return 0;
X	}
X	return timermsg;
X}
X
XDeleteTimer(register struct timerequest *tr)
X{
X	register struct MsgPort *tp;
X
X	if (tr) 
X	{
X		tp = tr->tr_node.io_Message.mn_ReplyPort;
X		if(tp)
X			DeletePort(tp);
X		CloseDevice((struct IORequest *)tr);
X		DeleteExtIO((struct IORequest *)tr);
X	}
X}
X
Xvoid trash_timer(void)
X{
X	AbortIO((struct IORequest *)timer_request);
X	TimerBase = (struct Device *)-1;
X	DeleteTimer(timer_request);
X}
X
Xvoid init_timer(void)
X{
X	if (!(timer_request = CreateTimer(UNIT_MICROHZ)))
X		panic("Can't create timer.");
X
X	TimerBase = timer_request->tr_node.io_Device;
X	add_cleanup(trash_timer);
X}
X
Xvoid start_timeout_timer(void)
X{
X	timer_request->tr_node.io_Command = TR_ADDREQUEST;
X
X	timer_request->tr_time.tv_secs = 3;
X	timer_request->tr_time.tv_micro = 0;
X
X	SendIO((struct IORequest *)timer_request);
X}
X
Xvoid abort_timeout_timer(void)
X{
X	AbortIO((struct IORequest *)timer_request);
X}
END_OF_FILE
if test 1620 -ne `wc -c <'timer.c'`; then
    echo shar: \"'timer.c'\" unpacked with wrong size!
fi
# end of 'timer.c'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.misc.