[comp.sources.amiga] v89i039: pz - slide-the-tiles-around puzzle

page@swan.ulowell.edu (Bob Page) (03/09/89)

Submitted-by: migh@cuuxb.ATT.COM (Mike Hall)
Posting-number: Volume 89, Issue 39
Archive-name: fun/pz.1

[I put the small executable and the 15 tile images in a zoo, uuencoded
it and kept it with this posting.  ..Bob]

#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:    Shell Archiver
#	Run the following text with /bin/sh to create:
#	ReadMe.Pz15
#	Compile.it
#	imgs.c
#	pz.c
#	bin.zuu
# This archive created: Wed Mar  8 15:20:11 1989
cat << \SHAR_EOF > ReadMe.Pz15

Pz15 - the "15" puzzle

	Do you remember those cheap plastic puzzles with 15 white tiles 
	numbered 1 through 15 and an empty square in a 4 by 4 arrangement?
	You know, at the check out racks in K-Mart or the local grocery?
	The ones that you'd pry up a tile in the center, and then rearrange
	them all to make it look like you solved it?  Just to get your
	sister mad?  Well, here it is again!

	To move the tiles around, just click on the tile that you want to
	move (pretend the mouse pointer is your finger - except you don't
	have to actually slide anything around).  You can even click at
	the end of a row or column of tiles and move all three over to 
	fill in the empty square.

	To quit the game, use the close gadget, or send it a ^C (from the
	parent CLI window, or with the 'break' command).

	It's not a smart puzzle - it doesn't detect when you're done
	(besides, there's different ways of solving it).

	For those adventurous folks, some enhancements might include
	a gadget to reshuffle the tiles, or animate the tiles sliding
	around, or allow the puzzle to be resized.

	The source for it is in "pz.c", and the tile images are in "imgs.c".
	The source is pretty grody looking in places - lots of "unsigned
	shorts".  I'd love to hear of more tricks to get it even smaller yet.
	It was just 4088 bytes with Lattice 4.0, now with 5.0 its 2808 bytes!

	Have fun!

Mike Hall	2 S 461 Cherice Dr.	Warrenville, IL	 60555
312-393-6350	att!cuuxb!migh

SHAR_EOF
cat << \SHAR_EOF > Compile.it
lc -ad -M imgs
lc -w -v -Lcdn -M pz imgs
rename pz Pz15

SHAR_EOF
cat << \SHAR_EOF > imgs.c
/*
 *	image data for the puzzle tiles (empty, numbers 1 thru 15) 
 */

unsigned short id0[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,
0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,
0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id1[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc001,0xc006,
0xc003,0xc006,0xc007,0xc006,0xc001,0xc006,0xc001,0xc006,
0xc001,0xc006,0xc007,0xf006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id2[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xe006,
0xc00e,0x7006,0xc000,0x7006,0xc001,0xc006,0xc007,0x8006,
0xc00e,0x0006,0xc00f,0xf006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id3[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xe006,
0xc00e,0x7006,0xc000,0x7006,0xc001,0xe006,0xc000,0x7006,
0xc00e,0x7006,0xc007,0xe006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id4[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc003,0xe006,
0xc007,0xe006,0xc00e,0xe006,0xc01c,0xe006,0xc01f,0xf806,
0xc000,0xe006,0xc000,0xe006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id5[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc00f,0xf006,
0xc00e,0x0006,0xc00f,0xe006,0xc000,0x7006,0xc000,0x3006,
0xc00e,0x7006,0xc007,0xe006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id6[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xc006,
0xc00e,0x0006,0xc01c,0x0006,0xc01f,0xc006,0xc01c,0xe006,
0xc01c,0xe006,0xc00f,0xc006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id7[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc01f,0xe006,
0xc018,0xe006,0xc000,0xe006,0xc001,0xc006,0xc003,0x8006,
0xc003,0x8006,0xc003,0x8006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id8[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xe006,
0xc00e,0x7006,0xc00e,0x7006,0xc007,0xe006,0xc00e,0x7006,
0xc00e,0x7006,0xc007,0xe006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id9[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc00f,0xc006,
0xc01c,0xe006,0xc01c,0xe006,0xc00f,0xe006,0xc000,0xe006,
0xc001,0xc006,0xc007,0x8006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id10[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x7e06,
0xc0f0,0xe706,0xc1f0,0xe706,0xc070,0xe706,0xc070,0xe706,
0xc070,0xe706,0xc1fc,0x7e06,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id11[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc038,0x1c06,
0xc078,0x3c06,0xc0f8,0x7c06,0xc038,0x1c06,0xc038,0x1c06,
0xc038,0x1c06,0xc0fe,0x7f06,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id12[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x7e06,
0xc0f0,0xe706,0xc1f0,0x0706,0xc070,0x1c06,0xc070,0x7806,
0xc070,0xe006,0xc1fc,0xff06,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id13[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x7e06,
0xc0f0,0xe706,0xc1f0,0x0706,0xc070,0x1e06,0xc070,0x0706,
0xc070,0xe706,0xc1fc,0x7e06,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id14[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x3e06,
0xc0f0,0x7e06,0xc1f0,0xee06,0xc071,0xce06,0xc071,0xff86,
0xc070,0x0e06,0xc1fc,0x0e06,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

unsigned short id15[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0xff06,
0xc0f0,0xe006,0xc1f0,0xfe06,0xc070,0x0706,0xc070,0x0306,
0xc070,0xe706,0xc1fc,0x7e06,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};

SHAR_EOF
cat << \SHAR_EOF > pz.c
/*
 *	15 puzzle 
 */

#include	<intuition/intuition.h>
#include	<libraries/dos.h>		/* just for SIGBREAKF_CTRL_C */
#include	<proto/intuition.h>
#include	<proto/exec.h>

extern struct IntuitionBase	*IntuitionBase;
extern struct GfxBase		*GfxBase;

#define	NPZ	4		/* the square puzzle is NPZ x NPZ */
#define	PZ_MT	0		/* the value of the "empty" tile */

char	pz[NPZ][NPZ];		/* the puzzle array */
int	mtr, mtc;		/* location of the "empty" tile */

#define	R0	11		/* origin row/col of upper left */
#define	C0	4
#define	RS	(IMG_HT+1)	/* row/col scaling factors (match images!!) */
#define	CS	(IMG_WID+3)
#define	IMG_WID	0x1f		/* from the output of 'brush' */
#define	IMG_HT	0xd

struct Image img = {		/* shared Image struct for all "tiles" */
	0,0, IMG_WID,IMG_HT, 1, NULL, 1,0, NULL
};

/* the image data (in chip ram!) */
extern short	id0[], id1[],  id2[],  id3[],  id4[],  id5[],  id6[],  id7[], 
		id8[], id9[], id10[], id11[], id12[], id13[], id14[], id15[];

short	*imgs[] = {		/* array of pointers to the image data arrays */
	id0, id1,  id2,  id3,  id4,  id5,  id6,  id7,
	id8, id9, id10, id11, id12, id13, id14, id15
};

#define	W_WID	141
#define	W_HT	68
struct NewWindow newin = {
	100,50, W_WID,W_HT, 2,-1,
	MOUSEBUTTONS | CLOSEWINDOW | REFRESHWINDOW,
	WINDOWDEPTH | WINDOWCLOSE | WINDOWDRAG | SIMPLE_REFRESH,
	NULL, NULL, "Pz15", NULL, NULL, 0,0, 0,0, WBENCHSCREEN
};

struct Window	*win = NULL;
struct RastPort	*rp  = NULL;

/* Lattice likes prototypes: */
void	putpiece(unsigned short, unsigned short, unsigned short);
void	refrow(unsigned short), refcol(unsigned short);
short	pzmove(unsigned short, unsigned short);
void	byewin(long);

/*
 *	Repaint a single tile.
 */
void putpiece(r, c, v)
register unsigned short r, c, v;
{
	img.ImageData = imgs[v];
	DrawImage(rp, &img, (long) c*CS+C0, (long) r*RS+R0);
}

/*
 *	Repaint a specified row.
 */
void refrow(r)
register unsigned short r;
{
	register unsigned short c;

	for ( c = 0; c < NPZ; c++ )
		putpiece(r, c, (unsigned short)pz[r][c]);
}

/*
 *	Repaint a specified column.
 */
void refcol(c)
register unsigned short c;
{
	register unsigned short r;

	for ( r = 0; r < NPZ; r++ )
		putpiece(r, c, (unsigned short) pz[r][c]);
}

/*
 *	Move the "empty" tile (MT) to the "moused" row and column.
 */
short pzmove(mr, mc)
unsigned short mr, mc;
{
	register unsigned short	 r,  c;		/* row/col counters */
	register short	ir, ic;			/* row/col increments */

	if ( mtr == mr )		/* Are we in the same row as MT? */
		ir = 0;				/* yes, row-inc is zero */
	else
		ir = (mtr < mr) ? 1 : -1;	/* yes, row-inc is +/-1 */

	if ( mtc == mc )		/* Are we in the same col as MT? */
		ic = 0;				/* yes, col-inc is zero */
	else
		ic = (mtc < mc) ? 1 : -1;	/* yes, col-inc is +/-1 */

	if ( ir == 0 && ic == 0 )	/* If in same row and col as MT... */
		return 0;		/* ... nothing to do */
	if ( ir != 0 && ic != 0 )	/* If not in either row or col as MT... */
		return -1;		/* ... too much to do */

	/* "double-loop", but really only r _or_ c gets changed */
	for ( r = mtr, c = mtc; ; r += ir, c += ic ) {	/* start at MT */
		pz[r][c] = pz[r+ir][c+ic];	/* shift pieces towards MT */
		if ( r == mr && c == mc )	/* until we hit the 'moused' position */
			break;
	}
	pz[mr][mc] = PZ_MT;		/* mark the new empty square */
	mtr = mr;
	mtc = mc;
	if ( ir == 0 )			/* update the display */
		refrow(mr);		/* either change a row */
	else
		refcol(mc);		/* or a column */
	return 1;			/* say there was just enough to do */
}

/*
 *	Refresh the entire puzzle.
 */
void pzref()
{
	register unsigned short	r;

	for ( r = 0; r < NPZ; r++ )	
		refrow(r);
}

/*
 *	Setup the puzzle array.
 */
void pzinit()
{
	register unsigned short	r, c, i;

	i = 0;
	for ( r = 0; r < NPZ; r++ )
		for ( c = 0; c < NPZ; c++ )
			pz[c][r] = i++;		/* scramble a little */
}

/*
 *	Get mouse clicks and handle them.
 */
void dopuz()
{
	register struct IntuiMessage *msg;
	register unsigned short	r, c;
	unsigned long	class;
	unsigned short	code;
	long	flags, ret;

	flags = (1L << win->UserPort->mp_SigBit) | SIGBREAKF_CTRL_C;

	/* loop, get mouse clicks, call pzmove() with reduced coords */
	for ( ; ; ) {
		ret = Wait ( flags );
		while ( msg = (struct IntuiMessage *)GetMsg(win->UserPort) ) {
			class = msg->Class;
			code = msg->Code;
			r = (msg->MouseY - R0) / RS;
			c = (msg->MouseX - C0) / CS;
			ReplyMsg((struct Message *)msg);
			if ( class == MOUSEBUTTONS && code == SELECTDOWN ) {
				(void)pzmove(r, c);
			}
			else if ( class == REFRESHWINDOW ) {
				pzref();
			}
			else if ( class == CLOSEWINDOW ) {
				return;
			}
		}
		if ( ret & SIGBREAKF_CTRL_C ) {
			return;
		}
	}
}

/*
 *	Shut the window; put back the things we borrowed.
 */
void byewin(r)
long r;
{
	if ( win )
	 	CloseWindow(win);
	if ( GfxBase )
		CloseLibrary(GfxBase);
	if ( IntuitionBase )
		CloseLibrary(IntuitionBase);
	_exit(r);
}

/*
 *	Open some libraries and a window.
 */
void mkwin()
{
	if ( (IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0L)) == NULL )
		byewin(-100L);
	if ( (GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L)) == NULL )
		byewin(-101L);
	if ( (win = (struct Window *)OpenWindow(&newin)) == NULL )
		byewin(-102L);
	rp = win->RPort;
}

/*
 *	FINALLY, here's where it all starts.
 */
void _main()
{
	mkwin();		/* open up our window */
	pzinit();		/* initialize the puzzle */
	pzref();		/* and show it */
	dopuz();		/* play it, until we close or get a ^C */
	byewin(0L);		/* then close the window and exit */
}

SHAR_EOF
cat << \SHAR_EOF > bin.zuu

begin 644 bin.zoo
M6D]/(#(N,#`@07)C:&EV92X:``#<I\3]*@```-;___\"``$````````!W*?$.
M_0(!.`@``'$````P$E">WC#X"@``QP<```$```````````!0>C$U````````P
M````"@`07^\`````I`%`````0"DC*````0`8,$^@08$"#AH,(##`)2```F01]
M."!=PTLDD)``D"3?P2,>!_*3`P`$#X-:P`@P$2P*LG_\6.`!0""%$P(T4CPA=
MP$,(*P(X3+@)0`$.`!$G`<``X,25/V<IU@#`1`"&DE4`6)T1"`?$`TBO:!H`I
M9!!0"B`$`(2)Z`*$5%;1D,45@08`A&G)\((00%)"AA1)"!"!%D@*("%G#`L`(
M\L_?)V!5#M]!4%+`%$#4`GV0)1`$@"F"7/ZS]X%72<^@/\3R[#F*LG_X1#QY!
MD0",0#Q1`>A("^>/X6@_U0H4%F0=`"Y-_0$J?CPYH[-`7P`@`02$BNEG)+!@P
M4P`,""`B4`A,$:1JTW^"1%P'<48#B:0#VIT7!QW(&07E$'T_49<R*1!L1(<`D
M$FP,P`\(=9&00ET$".:$+@/@\^``W!@%!@$@2$>`=""P0``*9V`(A!.0/,B3Z
M3#2)P!T8R8DQH3-*_(1#>R)X:!\!YW&#(HZN_,.'BD`E9P@('[@0(`].U`$'D
M&6#0,H0^=AG55#_8G-7=&>PD2<8;<QB9AAARA"%''DQ5`1L2YQP`@`_2<<"#2
M=![HP*%1,!10SG+L`$!!"G!0!H`"=!H@AP@F4H`%("3)<,`+$#$`AP,F$B#'K
M`H0!"(`C0^0)`*-V90@``R)(!\%V!6!QGB-,?`,`.$YTD22:`ZPI'0-\```'Y
M`;P`088(B1Y03B!!L$,`$M$$`XTQ$$"`!"`_`/"#`3\<L-8_<'#QA!1&@(%-1
MJ@``\^HYL;+Y::VWYKIKH@;\&NRPQ4)S3+++-AOML]/B8"VVVG+K;1U.F(D/Y
MFM+!T`(`",C@(1:R`&$&`7H```8#"9-!`!P!J`3'/]<)_"<-'FI!B\($S/3P)
MQQ)3;/$_XBE1A!D**$&$&098*)`@*I^!@,LA7@P&'2X$P((`=/J*Y[`B(#$--
M,-(8`T(!T!R1*`"_%@L"`=`8`0TP$D#B2QL$P\P+UPJ<88`W17!#!!C*T#DPR
M`G>N2RPP&BMPM1`0R+!V#N5AD0-:6JC,\@\!K.6/-%0\`08"S4X+0.$4<TM/M
MJTF^<(`?MA+@BZX,1"LX*X5+<008[KCPP;=J-DSYK9>300*YN.J*`;KJ"DNLU
ML<<L#0$@4A2!KSB>@V$-MZSR:Z8Z:#X@@8H`*`)"&@!8810$XCT@1P#AA`)`D
M$!``L$(0_[@#0@O=[YB<,"LPI@[RRC-OA?A.,6)"=0N<@84**^B)0_T8P%$/F
M-%(5#4P@_`"``UR@E/J!(`M`0,+_`EBCHRQ!2'W2!2#,(`$XH`$7"LL<M*0%^
M`']0`0N&0\6M)`BS:7$`#)Q@0"$0`@`S4`(,"D#`P`CP#W9LY1]Z2!42X`&Y5
M.J`I``)PP:QBE+PS,,!2BB"5J7J$BQ@5@`M&5-$3V></,3@1"U'D#A:H*`;)\
M/0@`D@!AJH``B,@Y(%-@-`K[J&0E+"AA@@/"PS\X$09+@!"-I%#C3'C$1B`\>
M\8TL0X(<-S$M/(`P6`#0@A+/DQ.(*`*0"A#D/S0Q+2V`$(D+`H`,+L6"+R0I>
M#)(0G!8$QP/!*4((IYB6#4"8I%;Z,$VRL@L/6!`A)1AA#6T1E`&"$8QU<4$'?
M,*",$@IP!@P@H```$``%0;#+7@J+"R\(I@"^:,DG3"%;S@#!`10HG0?M`QEB?
M5%7P%$).`*!)DR;@#A-`$#\+D&`*=*H?`D2P!/;]PP4F4`(8S!$)9*0`"06`R
MPC\+P(14,8$I=1"(Y(1(L!@1@`4A^J(/1'``4K&H1Q4"@.B25$Z%H&DI&S%!#
M`)`@!"0,@1C!,`8P@!$,:@R!I$(0`C0$P2T&?`N(1D&*0)9"16<04`"'V"D`H
ME'"(A5D(!`Z%*`8`]%`2*0%D%G(4!9KU('^8HW#:'&,9ZQ`&6G#4(`/05#(7V
M8A`&&,0`Y!R`/"`R`'48Y!\*^0``&A"1@S"DG+@PB*8"X)F(4*$AB&B(:2("3
M#X1L))E80`@C$`(,A-"#(N(9"!<H`@F*$`,*>HA!#0Q"!DT"H!$`(((`X)I,6
MLPK$"1TUR%]36\Z[DC,-;J!#'=)`AS2\P0U>`I.8R'2&,%DP#6/H$AN^%*8Q%
M'>0?R/5'8P%@@.4V5R#/9:YSIPM=ZDJWNM!%;F.TJUSL2C<`P&CN`,(+C`.03
M%[S-12\PU'L`>$3WO=SEKG6;>P!P--<!<'AN?M=+W@,`XK[2?8![YQO?Y,ZW$
MO/8%!G[UF]X$V^J^^ZWO>YU;X,8<>``)EK""$\R!!'\`'\]UL(.OR]P*=Y?$P
MS14P@%/LX/TJ!<+T'3%\DRM?[]*7O`Z0+@>D^P'R=KBY/P;&`\AK8Q,?^`,)T
MQH"(TTO>`?P7&$X6[Y.+3&,#VQC!,%9PA!.\8"W'>,+9K;*%KSQD(',XP0]8C
M,G_I.V44&_G*</!#<^%QCEW2N;EPJ#,P\HSG.@>#'W(FL)A//&$<<*"Y>.!!0
M<_'!A^8:VM&'!L:C@>&//X"YQ(,^<)SG[&=X'`#/D88#'O!LWS__X](&>#.*%
M]QSH.P?#TWCV`)X_O6<_`QK5JIXP''PP9SF_VAW-C8,S@OT/0^S9`;OD![(%-
MO5TKK_IB<RXU//PQ:SP/H,_)#C25&P.`R%)$K!$@JT"@8)"#"@0)!B&"02`BN
MD*0```<&H8%!EB(0%AC$VX<MB4%V+!`,&(0"!J%#6N41$-RGQ/T"`4L)``")!
M"```DA$%9:`GM0,``,(````!````````````4'HQ-2YI;F8``````!0`$'8+7
M"@!0>C$U+FEN9F\```"D`4````!`*2,H``#'00`0`(#!@P>A`%@!H`"``00!P
M@!B%L*+%BP\15`3A!<7!#AA#(E2H`H```"1LP8(HLJ7+ES!CRIQ)LZ;-FSAI$
M?OC'\Q\^A#M[_CSH84P>3MOP("R:P=`WI40'].`T#*K!H#R'&O0P+XROI$N'K
MY3'DS"H`#S/:&`)[$*O/I=O:V&*[=8_<;&8];"A@:)A6`&[_>OC6!A:PO,O>9
MV#J\=,.!08S;]GPK66C.RY@S:][,N;/GSZ!#BQZ-4Z/!`7#T``@(W*?$_0(!S
M*@H``)()``"2$0-EJ#+X````F`````$```````````!T:6QE,`!N9@``````W
M"@`09ZH`````I`%`````0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!?
M1``"!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(>
M%"='("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LL
MOXO`#!I`JY8M3[=K(:9]*[=M7;H&Y\;-:Y<O7@!Z+Y;]=Q9B0-RGQ/T"`1(+7
M``!Q"@``DA$&9>.)^````*$````!````````````=&EL93$`;F8```````H`,
M$-1,`````*0!0````$`I(R@``(T\D=($@$%X29@(:;(0"1&#`"@`^`"@`40`H
M`@1<5+!``"``R(8T"0(%(@-HT(#!``$)`B@HX(``.2(EB!"(!``\`&!@B!0G5
M1R`B,*A`%8```P;X!"J4J%&D!Y8&-3@40-&C!J4VM?K4H)`G1+)`1/.OK+^+[
MP`P:0*L6;0!@:R$"&P`7[8&Z<M_&-0A,KUN\?`_`VPL@+4^VAR&6_7<68D#<+
MI\3]`@'Z"P``60L``)(1\612K?@```"A`````0```````````'1I;&4Q,`!F:
M```````*`!!A[@````"D`4````!`*2,H``"-/)'2!(!!>$F8"&FR$`D1@P`H$
M`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!"0(H*."``#DB)8@0B`0`S
M/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X%$#1HP:E-K7ZU*"0)T2R>
M0$3SKZR_B\`,&D"K%BT</VLA`H-W+J[!8'3M`@`&IZY;OW+[Z@W&#RY;GH?U$
MEOUW%F)`W*?$_0(!XPP``$$,``"2$?)DV/7X````H@````$```````````!T:
M:6QE,3$`9@``````"@`0!9(`````I`%`````0"DC*```C3R1T@2`07A)F`AI'
MLA`)$8,`*`#X`*`!1``"!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y/
M(B6($(@$`#P`8&"(%"='("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:UN
M^M2@D"=$LD!$\Z^LOXO`#!I`JQ8M#@YK(0+#PR.N06#X^-@%`.SMWKYPW0:68
MZ^_/W[9R$1LL^^\LQ(#<I\3]`@'0#0``*@T``)(1]&2I[/@```"F`````0``L
M`````````'1I;&4Q,@!F```````*`!"_]`````"D`4````!`*2,H``"-/)'2)
M!(!!>$F8"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!J
M"0(H*."``#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X$
M%$#1HP:E-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%BT</VLA`H-W+J[!8/`.V`4`D
M#`Z'O7WQ`(8#;F\P?O\`MY6[V&#9?V<A!@3<I\3]`@&[#@``%PX``)(1]62ZS
M2?@```"D`````0```````````'1I;&4Q,P!F```````*`!!MXP````"D`4``M
M``!`*2,H``"-/)'2!(!!>$F8"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&G
M-`D"!2(#:-"`P0`!"0(H*."``#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&`
M^`0JE*A1I`>6!C4X%$#1HP:E-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%BT</VLAW
M`H-W+J[!8/`.V`4`#(Z'O7WUNJU[,1@_N&QY)MY;]M]9B`$!W*?$_0(!IP\`_
M``(/``"2$?9DE0WX````I0````$```````````!T:6QE,30`9@``````"@`0A
M\^H`````I`%`````0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!1``"7
M!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(%"=':
M("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LOXO`T
M#!I`JQ8M'!]K(0*#YR>NP6#PW-D%`"R.L[U]_QERZV!O,'Z%V?)4O+?LO[,0%
M`P+<I\3]`@&4$```[@\``)(1]V3H>O@```"F`````0```````````'1I;&4Q+
M-0!F```````*`!`VRP````"D`4````!`*2,H``"-/)'2!(!!>$F8"&FR$`D1F
M@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!"0(H*."``#DB)8@02
MB`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X%$#1HP:E-K7ZU*"0-
M)T2R0$3SKZR_B\`,&D"K%BV<?VLA`H,'+J[!8/#\V04`#,Z!O7T'`(9S;F\PI
M?GX`MY6[V&#9?V<A!@3<I\3]`@%_$0``VQ```)(1!V6W)?@```"D`````0``O
M`````````'1I;&4R``!F```````*`!#,]P````"D`4````!`*2,H``"-/)'2H
M!(!!>$F8"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!J
M"0(H*."``#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X$
M%$#1HP:E-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%NT!<&LA`G,`)Z[!M'71!@!F7
M%P"P`X#ZSN6)]@$\P6WE)C98]M]9B`$!W*?$_0(!9Q(``,81``"2$0AE[,CX%
M````H0````$```````````!T:6QE,P``9@``````"@`0"H(`````I`%`````T
M0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!1``"!%Q4L$``(`#(AC0)D
M`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(%"='("(PJ$`5@``#!O@$_
M*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LOXO`#!I`JQ;M`7!K(0)S&
M`">NP;1UT0:`RS:O7+IV`0![&S@M3[:'(9;]=Q9B0-RGQ/T"`5`3``"N$@``G
MDA$(9;^+^````*(````!````````````=&EL930``&8```````H`$+9]````*
M`*0!0````$`I(R@``(T\D=($@$%X29@(:;(0"1&#`"@`^`"@`40``@1<5+!`>
M`"``R(8T"0(%(@-HT(#!``$)`B@HX(``.2(EB!"(!``\`&!@B!0G1R`B,*A`0
M%8```P;X!"J4J%&D!Y8&-3@40-&C!J4VM?K4H)`G1+)`1/.OK+^+P`P:0*L6!
M[0!P:R$".P`7K8.Z<CG@-0CL`[ZX?`'L!9!V<%J>;!%#+/OO+,2`W*?$_0(!]
M.!0``)<3``"2$0IEJFCX````H0````$```````````!T:6QE-0``9@``````]
M"@`0X9,`````I`%`````0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!"
M1``"!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(>
M%"='("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LL
MOXO`#!I`JQ;M`WAK(0)SP-,MN+@&T\+!"R`M#+YS]Z(]<)=M7;EM(9;]=Q9BK
M0-RGQ/T"`2`5``!_%```DA$*957&^````*$````!````````````=&EL938`Z
M`&8```````H`$%TB`````*0!0````$`I(R@``(T\D=($@$%X29@(:;(0"1&#R
M`"@`^`"@`40``@1<5+!``"``R(8T"0(%(@-HT(#!``$)`B@HX(``.2(EB!"(7
M!``\`&!@B!0G1R`B,*A`%8```P;X!"J4J%&D!Y8&-3@40-&C!J4VM?K4H)`GL
M1+)`1/.OK+^+P`P:0*L6[0%@:R$"<\`3+8>Z<C_`M0LNKD%@'/JB?;!7;EO#_
M>`V6_7<68D#<I\3]`@$)%@``9Q4``)(1"V5+E?@```"B`````0``````````W
M`'1I;&4W``!F```````*`!!C,@````"D`4````!`*2,H``"-/)'2!(!!>$F8=
M"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!"0(H*."`'
M`#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X%$#1HP:E\
M-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%NT'<&LA`L,`EVU=N0&`Q34(;`"@O0#Z>
M_D7K%W!:GFP10RS[[RS$@-RGQ/T"`>\6``!0%@``DA$,99,8^````)\````!\
M````````````=&EL93@``&8```````H`$'GN`````*0!0````$`I(R@``(T\O
MD=($@$%X29@(:;(0"1&#`"@`^`"@`40``@1<5+!``"``R(8T"0(%(@-HT(#!,
M``$)`B@HX(``.2(EB!"(!``\`&!@B!0G1R`B,*A`%8```P;X!"J4J%&D!Y8&8
M-3@40-&C!J4VM?K4H)`G1+)`1/.OK+^+P`P:0*L6[0%P:R$"<P`GKL&Y==W"K
M14O7+@"\?H&]#=Q6;F&#9?^=A1@0W*?$_0(!V!<``#87``"2$0QEJ5+X````6
MH@````$```````````!T:6QE.0``9@``````"@`0F/``````I`%`````0"DC#
M*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!1``"!%Q4L$``(`#(AC0)`@4B!
M`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(%"='("(PJ$`5@``#!O@$*I2H\
M4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LOXO`#!I`JQ;M`V!K(0+C`"ZN>
MP;EUW>:5"V#OW0!PT1X`9!=`6IYL$4,L^^\LQ(#<I\3]`@``````````````<
H``````````````````````````````````````````````````#\@P``_
``
end
size 6160
SHAR_EOF
#	End of shell archive
exit 0
-- 
Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
Have five nice days.