[unix-pc.sources] Repost: FaceSaver display for UNIX-pc

gil@limbic.UUCP (Gil Kloepfer Jr.) (06/30/89)

I sent out a cancel message for the last posting of this program,
although some may have leaked by.  The last posting was truncated
by some internet sites.  This one should get through OK.

Those that were at the Summer USENIX conference probably participated
in the FaceSaver project, which digitized lots of our faces and put
them in an archive on uunet.  This is a program for the UNIX-pc which
allows you to display those files.  Enjoy.

COMING SOON:  UNIX-pc utility to simplify the use of on-line manual pages

======
| Gil Kloepfer, Jr.
| ICUS Software Systems/Bowne Management Systems (depending on where I am)
| ...icus!limbic!gil   or    gil@icus.islp.ny.us

-----Cut Here----

#! /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 2)."
# Contents:  122.ft.uue Makefile README facedisp.c raster.c
# Wrapped by gil@limbic on Thu Jun 29 22:33:29 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 122.ft.uue -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"122.ft.uue\"
else
echo shar: Extracting \"122.ft.uue\" \(3049 characters\)
sed "s/^X//" >122.ft.uue <<'END_OF_122.ft.uue'
Xbegin 644 122.ft
XM   !C@ &"@@                                &"P#W!@ "^@$( _@&
XM  ,( P,"^ 8  Q %" 'X!@ ##@0* ?@&  ,6! @!^ 8  R(%" 'X!@ #*@$#
XM _@&  ,R PD"^ 8  S #"0'X!@ #.@4% ?H&  -$!04!^@8  T8"! +^!@ #
XM2 0! ?P&  -( @("_@8  T($" 'X!@ #/@0' ?D&  -& P<!^08  TP$!P'Y
XM!@ #4@0( ?D&  -8!0D!^ 8  V $" 'Y!@ #:@0( ?@&  -R! @!^08  WH$
XM" 'X!@ #@@0( ?D&  .* @8"^@8  Y("" +Z!@ #E@0' ?D&  .>! ,!^P8 
XM Z0$!P'Y!@ #H@0( ?@&  .H!0D!^ 8  [ $" 'X!@ #N@4( ?@&  /"! @!
XM^ 8  \H$" 'X!@ #T@0( ?@&  /:! @!^ 8  ^($" 'X!@ #Z@0( ?@&  /R
XM P@"^ 8  _H$" 'X!@ $ @4( ?@&  0*! @!^ 8 !!(%" 'X!@ $&@4( ?@&
XM  0B! @!^ 8 !"H$" 'X!@ $,@4) ?@&  0Z!0@!^ 8 !$0$" 'X!@ $3 4(
XM ?@&  14! @!^ 8 !%P%" 'X!@ $9 4( ?@&  1L!0@!^ 8 !'0%" 'X!@ $
XM? 0( ?@&  2$ PD"^ 8 !(P$" 'X!@ $E@,) ?@&  2>!0,!^ 8 !*@& 0  
XM!@ $I@,# ?@&  2@! 8!^@8 !)X$" 'X!@ $H@0& ?H&  2J! @!^ 8 !*X$
XM!@'Z!@ $M@4( ?@&  2Z! @!^@8 !,($" 'X!@ $R@0( ?@&  32 PH!^ 8 
XM!-H%" 'X!@ $Y@0( ?@&  3N!08!^@8 !/8$!@'Z!@ $^@0& ?H&  3^! @!
XM^@8 !0($" 'Z!@ %"@0& ?H&  42! 8!^@8 !18$" 'X!@ %&@0& ?H&  4B
XM!08!^@8 !28%!@'Z!@ %*@4& ?H&  4N!0@!^@8 !3($!@'Z!@ %.@0) ?@&
XM  4^ 0L#]P8 !4@$"0'X!@ %5@4# ?L&  5@!@L ]P8 !5X             
XM                  $  0 !  $       $  0 %  4 !0 *  H 'P *  H 
XM'P *  H !  $  X  0 "  0 "  '  (  @ #  , "  $  (  0 ,  P !@ )
XM  D !@ 5  D "0 6  $  0 !  0  @ "  $  0 !  (  @ $  $  @ "  0 
XM!  $  (  @ !  0 %0 . !4 !  $  0 'P $  0  P #  (  0 /  ,  P (
XM  @ !  $  (  @ !  $ #@ )  D "0 )  D !P $  8 !0 $  0 !  $  < 
XM"  (  0  @ !  \ !P (  @ !@ (  @ "  '  (  @ *  H "@ ) !\ "  (
XM  \  0 !  < "  (  0  P ,  (  0 '  D "0 )  8 #P (  @ !  $  ( 
XM @ "  8 "0 )  8 "0 )  D !@ &  D "0 )  X "  $  ,  P #       #
XM  ,  P #       #  ,  @ !  @ !  "  $  @ $  @ #P    \  0 "  0 
XM"  $  (  0 '  @ "  $  (    "  ( #@ 1 !D %0 5 !T  0 !  X !@ )
XM  D "0 /  D "0 )  < "0 )  \ $0 1 !$ #P .  $  0 !  $  0 !  X 
XM!P )  D "0 )  D "0 '  \  0 !  <  0 !  $ #P /  $  0 !  <  0 !
XM  $ #@ !  $  0 -  D "0 .  D "0 )  \ "0 )  D "0 '  (  @ "  ( 
XM @ "  < "  (  @ "  )  D "0 &  D "0 %  4  P %  D $0 !  $  0 !
XM  $  0 !  \ $0 1 !L %0 5 !$ $0 1 !$ $P 5 !D $0 1 !$ $0 &  D 
XM"0 )  D "0 )  8 !P )  D "0 '  $  0 !  8 "0 )  D "0 )  4 "@ 0
XM  < "0 )  D !P %  D $0 .  $  0 "  0 "  (  < 'P $  0 !  $  0 
XM!  $  D "0 )  D "0 )  D !@ 1 !$ $0 1  H "@ $  0 $0 1 !$ %0 5
XM !4 "@ * !$ $0 *  0 !  * !$ $0 1 !$ "@ *  0 !  $  0 #P (  0 
XM!  "  (  0 /  <  0 !  $  0 !  $  0 '  $  0 "  ( !  $  @ "  '
XM  0 !  $  0 !  $  0 !P $  H $0 _  ,  @ $  < "  .  D "0 .  $ 
XM 0 '  D "0 )  D !P .  $  0 !  $ #@ (  @ #@ )  D "0 )  X !@ )
XM  \  0 !  X '  "  ( #P "  (  @ "  X "0 )  D #@ (  @ !P !  $ 
XM!P )  D "0 )  D !@    8 !  $  0 !  /  8    '  0 !  $  0 !  $
XM  ,  0 !  D "0 %  < "0 1  8 !  $  0 !  $  0 #P + !4 %0 5 !4 
XM$0 '  D "0 )  D "0 &  D "0 )  D !@ '  D "0 )  D !P !  $ #@ )
XM  D "0 )  X "  (  T  P !  $  0 !  X  0 "  0 "  '  (  @ /  ( 
XM @ "  ( #  )  D "0 )  D #@ 1 !$ $0 *  H !  1 !4 %0 5  H "@ 1
XM  H !  $  H $0 1 !$ "@ *  0 !  $  , #P $  0  @ "  \ "  $  0 
XM!  #  0 !  $  @  0 !  $  0 !     0 !  $  0 !  $  @ "  ( #  "
XB  (  @ ! !( %0 ) #\ /P _ #\ /P _ #\ /P _ #\ /P$ 
X 
Xend
END_OF_122.ft.uue
if test 3049 -ne `wc -c <122.ft.uue`; then
    echo shar: \"122.ft.uue\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f Makefile -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"Makefile\"
else
echo shar: Extracting \"Makefile\" \(781 characters\)
sed "s/^X//" >Makefile <<'END_OF_Makefile'
X#
X# Makefile for facedisp version 1.0
X# By Gil Kloepfer, Jr.  ICUS Software Systems        6/23/89
X#
X
XCFLAGS=-v -O
XLDFLAGS=-s
XSHAREDLIB=/lib/shlib.ifile /lib/crt0s.o
XDESTDIR=/usr/lbin
XMANDIR=/usr/man/man1
X
Xfacedisp: facedisp.o raster.o
X	$(LD) $(LDFLAGS) -o facedisp facedisp.o raster.o $(SHAREDLIB)
X
Xinstall: facedisp
X	/bin/mv facedisp $(DESTDIR)
X	/bin/chmod 755 $(DESTDIR)/facedisp
X	/bin/chown bin $(DESTDIR)/facedisp
X	/bin/chgrp bin $(DESTDIR)/facedisp
X	/bin/mv facedisp.1 $(MANDIR)
X	/bin/chmod 644 $(MANDIR)/facedisp.1
X	/bin/chown bin $(MANDIR)/facedisp.1
X	/bin/chgrp bin $(MANDIR)/facedisp.1
X	/bin/mv 122.ft /usr/lib/wfont
X	/bin/chmod 644 /usr/lib/wfont/122.ft
X	/bin/chown bin /usr/lib/wfont/122.ft
X	/bin/chgrp bin /usr/lib/wfont/122.ft
X
Xclean:
X	rm -f facedisp.o raster.o core
END_OF_Makefile
if test 781 -ne `wc -c <Makefile`; then
    echo shar: \"Makefile\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f README -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"README\"
else
echo shar: Extracting \"README\" \(3525 characters\)
sed "s/^X//" >README <<'END_OF_README'
X"README" file for facedisp v1.0     Last update: 6/27/1989
X
XThis "shar" file contains a program which allows a FaceSaver file to be
Xdisplayed on the UNIX-pc's single-intensity monochrome bitmapped display.
XMuch of the theory necessary to write the program was obtained from the
X"sunfaced" program by D. Murali Raju.
X
XInstallation is easy.  The makefile is set so that you can "make facedisp"
Xto make the program alone, or "make install" to install it on your system.
XYou should uudecode the font file BEFORE invoking "make install."  The
Xmakefile should execute without modification on your UNIX-pc, but it would
Xbe a good idea to check it first.  Again, if you don't uudecode the font
Xfile before you perform the make, the font file will not be placed in
X/usr/lib/wfont, and you won't get the headers in smaller print.
X
XYou may check your installation by invoking facedisp on file "gil," which
Xis the FaceSaver file for the author of this program (me!).
X
XThe program works by reading the face file in its entirety, then formatting
Xand coding the bitmap intensity data into a format close to what the
XUNIX-pc requires.  This bitmap is then pasted to the screen and the
Xheader information is displayed over a blank section of the bitmapped
Xdisplay.
X
XIntensities are coded by using a 3x3 dither matrix.  The dither matrix
Xis a codification and grouping of pixels which are grouped in such a way
Xthat they appear on the display as "one" multi-intensity pixel.  This
X3x3 matrix gives a total of nine different shades of "grey."  I have chosen
Xthe values so that the grey scales increase in a linear fashion.  I don't
Xsuggest fooling with the values.  It took a good deal of work to find ones
Xthat seemed to look good for a majority of faces.
X
XOne major advantage of this program over sunfaced is that it can be modified
Xfairly easily to work on a wide range of different machines.  One should
Xlook at the file "raster.c" to find the names of all the raster routines,
Xand then write equivalent routines for their favorite monitor.  There is
Xa #define which sets the pixel ratio (width to height) which should be
Xdefined for your particular system.  I used a ruler to measure a NxN pixel
Xarray and computed the value using "bc."  Your mileage may vary.  On the
XUNIX-pc, the pixels are taller than wider, so the "y" values are all 
Xmultiplied by 0.64.  Also note the direct writes to the window will
Xmore than likely need to be changed.  The escape sequences do font
Xchanges and cursor addressing.
X
XThe format of the face files can be obtained by writing sending a request
Xto the FaceSaver daemon at uunet!faceserver ("send format"), while help
Xcan be requested using "send help."  The full index is rather lengthy...
Xbe forewarned.
X
XI would appreciate hearing any comments or improvements that you may have
Xfor this program.  Please mail a copy of all modifications or ports that
Xyou make to the code so I can keep an up-to-date copy here.  I will do
Xmy best to keep an up-to-date version posted as changes come in.
X
XAgain, my thanks to D. Murali Raju for the theory in his program, to Helen
Xand Jeff for discussing with me their ideas at USENIX, and to Lenny for
Xlending a hand and beta testing this beast.  Finally, thanks to Muhammad
XBenten for his 122x28 font that he posted a while ago, and which appeared
Xin some recent postings.
X
XPlease send any correspondence regarding this program to me at icus!limbic!gil.
X
XGil Kloepfer, Jr.
XICUS Software Systems, Western Development Center
XEast Meadow, Long Island, NY
Xicus!limbic!gil
END_OF_README
if test 3525 -ne `wc -c <README`; then
    echo shar: \"README\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f facedisp.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"facedisp.c\"
else
echo shar: Extracting \"facedisp.c\" \(9424 characters\)
sed "s/^X//" >facedisp.c <<'END_OF_facedisp.c'
X/***************************************************************************\
X * File name:		facedisp.c					   *
X *									   *
X * Purpose:		Display a face file that is generated by the folks *
X *			at the FaceSaver project on the UNIX-pc video      *
X *			display.					   *
X *									   *
X * Programmer:		Gil Kloepfer, Jr.  ICUS Software Systems	   *
X *									   *
X * Revision history:    22-Jun-89  1.0    Program created                  *
X *                      28-Jun-89  1.1    Multiple files on argument line  *
X *                                        (Lenny Tropiano <lenny@icus>)    *
X *									   *
X * Restrictions:	This program is specifically written for the       *
X *			UNIX-pc (7300 or 3B1)				   *
X *									   *
X *			This program requires the use of the ICUS raster   *
X *			function library (raster.c).			   *
X *									   *
X * Usage:		This program takes one argument, that is the name  *
X *			of a FaceSaver file to be displayed.  If this arg  *
X *			is missing, it will attempt to read this file from *
X *			stdin.  All errors are displayed on stderr, and    *
X *			all output is displayed on another window.         *
X *									   *
X * Other credits:	Thanks to D. Murali Raju for his insight which I   *
X *			obtained from his sunfaced program.  Thanks also   *
X *			to Lenny, Helen, and Jeff for their encouragement  *
X *			and suggestions.				   *
X *									   *
X * Copyright/		(C) 1989 Gil Kloepfer, Jr., ICUS Software Systems  *
X * Disclaimer:		All Rights Reserved				   *
X *			Permission is granted to use, copy, or redistribute*
X *			this software provided that this header in its     *
X *			entirety is kept in the source code, that all      *
X *			copyright notices are left intact, and that it is  *
X *			not distributed or used for monetary gain of any   *
X *			kind without the express, written permission of    *
X *			the copyright holder(s).  Furthermore, if this     *
X *			software is modified, all changes should be mailed *
X *			to icus!gil.					   *
X *									   *
X *			The user of this program agrees and understands    *
X *			that this software is distributed on an "as-is"    *
X *			basis, and shall not use this program as the basis *
X *			for any claims, now or in the future, against      *
X *			any individual, organization, or entity.	   *
X\***************************************************************************/
X
X#include <stdio.h>
X#include <sys/window.h>
X#include <sys/font.h>
X
X#define	XWLIMIT		700	/* Horiz size so we can add text */
X#define	YWLIMIT		180	/* Vert size so we can add text */
X#define	S_RATIO		0.64	/* Pixel size ratio horizontal/vertical */
X#define	DITHER		3	/* Dither matrix size (do not change!) */
X#define	MAX_INFO	20	/* Maximum header lines in face file */
X
X#ifndef TINYFONT
X# define	TINYFONT	"/usr/lib/wfont/122.ft"
X#endif
X
Xchar *progname;		/* Keep the name of this program global */
X
X/*
X * Variables which originate from the read_face() routine and are used in
X * various places throughout the program
X */
X
Xchar *infoline[MAX_INFO]; /* Up to 20 pointers to header information strings */
Xint xpixels;		/* Number of x pixels as read from the face file */
Xint ypixels;		/* Number of y pixels as read from the face file */
Xint *picdata;		/* Picture data array */
X
X
X/*
X * Subroutine "main" ... we all know what this does...
X */
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X	int	curarg, i;
X
X	/* Initialize some of the variables */
X
X	infoline[0]=NULL;	/* End of headers marker */
X	progname=argv[0];
X
X	/* Read the face file */
X
X	curarg = 1;		/* if nothing there, it's NULL */
X
X	do {
X
X		read_face(argv[curarg]);
X
X		/* Display the picture */
X
X		disp_picture();
X
X		free(picdata);		/* do some memory housekeeping */
X		for (i=0; i<MAX_INFO; i++)
X			if (infoline[i] != NULL)
X				free(infoline[i]);
X		infoline[0]=NULL;	/* End of headers marker */
X
X		curarg++;	/* go to next file */
X
X	} while (curarg < argc);
X
X	/* Done */
X
X	exit(0);
X}
X
X
X/*
X * Read the face file.  Create the values of various global variables
X * which are formatted by other routines later.  If "file" is NULL, then
X * use stdin as the file.
X */
X
Xread_face(file)
X{
X	register int i;
X	char	string[128], *(*infoptr);
X	int	*picptr, found, picsize;
X	FILE	*fp, *fopen();
X
X	/* Open the face file or assign to stdin depending on the file */
X
X	if (file != NULL) {
X		if ((fp=fopen(file,"r")) == NULL) {
X			perror(file);
X			exit(2);
X		}
X	} else
X		fp=stdin;
X
X	/*
X	 * Read all the header information and place pointers to those
X	 * header strings in the infoline array.  When done, position
X	 * the file pointer to the beginning of the data (this is indicated
X	 * by a blank line after the headers).
X	 */
X
X	infoptr=infoline;
X	do {
X		if (fgets(string,128,fp) == NULL) {
X			fprintf(stderr,"%s: bad picture file\n", progname);
X			exit(1);
X		}
X		string[strlen(string)-1]='\0'; /* get rid of the newline */
X		if (string[0] != '\0') {
X			*infoptr=(char *)malloc(strlen(string)+1);
X			strcpy(*infoptr,string);
X			*(++infoptr)=NULL;
X		}
X	} while (string[0] != '\0');
X
X	/* Find the PicData: keyword to get the face dimensions */
X
X	infoptr=infoline; found=0;
X	while ((*infoptr != NULL) && (!found)) {
X		if (strncmp(*infoptr,"PicData:",8) == 0) {
X			found=1;
X			sscanf(*infoptr,"%*s %d %d %*d", &xpixels, &ypixels);
X		}
X		infoptr++;
X	}
X
X	if (!found || xpixels <= 0 || ypixels <= 0) {
X		fprintf(stderr,"%s: PicData is invalid for some reason\n",
X				progname);
X		exit(2);
X	}
X
X	/*
X	 * mallocate memory for the picture data.  We keep picsize as
X	 * a variable so that we can verify that when all the data is
X	 * done being read in the code below
X	 */
X
X	picsize=xpixels*ypixels;
X	if ((picdata=(int *)malloc(picsize*sizeof(int))) == NULL) {
X		fprintf(stderr,"%s: cannot get memory for picture data\n",
X				progname);
X		exit(2);
X	}
X
X
X	/* Read the picture data */
X
X	picptr=picdata;
X	while(fgets(string,128,fp) != NULL && picsize > 0) {
X		for (i=0; i<strlen(string)-1; i+=2) {
X			sscanf(&string[i],"%2x",picptr);
X			picptr++;
X			picsize--;
X		}
X	}
X
X	if (picsize != 0)
X		fprintf(stderr,"%s: picture data may be corrupt\n",progname);
X
X	/* Close the input file if not stdin */
X
X	if (fp != stdin) fclose(fp);
X}
X
X
X/*
X * Display the picture and textual data on the display.  Note that the
X * escape sequences embedded in this routine are used for cursor
X * positioning inside the opened window.
X */
X
Xdisp_picture()
X{
X	int	rast_getwin(), wd, line, dx, dy, xlim, ylim;
X	char	*(*infoptr), junk;
X
X	/*
X	 * The X and Y limits are set so that there is a minimum X and
X	 * Y. This is so we can fit the text into the window...
X	 */
X
X	xlim=xpixels*DITHER;
X	xlim=(xlim<XWLIMIT) ? XWLIMIT : xlim;
X	ylim=(int)(ypixels*DITHER*S_RATIO)+4;
X	ylim=(ylim<YWLIMIT) ? YWLIMIT : ylim;
X	rast_init(xlim,ylim);
X
X	/* Clear the display */
X
X	write(1,"\033[H\033[2J",7);
X
X	/* Setup the rest of the stuff... */
X
X	draw_border();
X	rast_paste();
X
X	wd=rast_getwin();
X	win_write(wd,10,10,0,"Hold on...");
X
X	/* Load the smaller font for the header information */
X
X	load_font(wd,1,TINYFONT);
X
X	/* Draw the picture */
X
X	for (dx=0; dx<xpixels; dx++)
X		for (dy=0; dy<ypixels; dy++)
X			dith_point(dx,(int)(dy*S_RATIO),picdata[dx+(xpixels*dy)]);
X
X	rast_paste();
X
X	win_write(wd,2,40,0,"FaceSaver Picture Display Program");
X
X	infoptr=infoline;
X	line=4;
X	while (*infoptr != NULL) {
X		win_write(wd,line,45,1,*infoptr);
X		line++;
X		infoptr++;
X	}
X
X	win_write(wd,19,45,0,"[Press RETURN to continue]");
X	read(wd,&junk,1);
X
X	rast_close();	/* Finish with window I/O this pass */
X}
X
X
X/*
X * This routine implements a pixel display combined with a 3x3 dither
X * matrix which is used to simulate an intensity on the display where
X * there isn't any.  Don't fool with the numbers unless you can come-up
X * with better ones...
X *
X * x and y are the x & y values from the data, and inten is the integer
X * encoded intensity value for the pixel (0-255).
X */
X
Xdith_point(x,y,inten)
Xint x, y, inten;
X{
X	int	px, py;
X
X	px=x*DITHER;
X	py=y*DITHER;
X
X	if (inten >= 93)  rast_point(px,py+2,1);
X	if (inten >= 31)  rast_point(px+1,py+2,1);
X	if (inten >= 186) rast_point(px+2,py+2,1);
X	if (inten >= 217) rast_point(px,py+1,1);
X	if (inten >= 0)   rast_point(px+1,py+1,1);
X	if (inten >= 248) rast_point(px+2,py+1,1);
X	if (inten >= 124) rast_point(px,py,1);
X	if (inten >= 62)  rast_point(px+1,py,1);
X	if (inten >= 155) rast_point(px+2,py,1);
X}
X
X
X/*
X * This subroutine is called after the size of the window is determined
X * and will make a border around the window and picture
X */
X
Xdraw_border()
X{
X	int	x, y, xedge, xpedge, yedge;
X
X	rast_getlim(&xedge,&yedge);
X	xpedge=(DITHER*xpixels)-1;
X
X	for (x=0; x<=xedge; x++) {
X		rast_point(x,0,1);
X		rast_point(x,yedge,1);
X	}
X
X	for (y=0; y<=yedge; y++) {
X		rast_point(0,y,1);
X		rast_point(xpedge,y,1);
X		rast_point(xedge,y,1);
X	}
X}
X
X
X/*
X * Write some data to the window.  Note that this data doesn't get saved,
X * so if you repaste the display you will lose what you displayed!
X */
X
Xwin_write(wfd,line,col,slot,text)
Xint wfd, line, col, slot;
Xchar *text;
X{
X	char	string[128];
X
X	sprintf(string,"\033[%d;%dH\033[1%1dm%s", line, col, slot, text);
X	write(wfd,string,strlen(string));
X}
X
X
X/*
X * Load a font into a slot number (thanks Lenny)
X */
X
Xload_font(window,slot,font)
Xint window, slot;
Xchar *font;
X{
X	struct ufdata ufd;
X
X	ufd.uf_slot = slot;
X	strcpy(ufd.uf_name,font);
X	ioctl(window,WIOCUFONT,&ufd);	/* unload any previous font */
X
X	if (ioctl(window,WIOCLFONT,&ufd) < 0) {
X		fprintf(stderr,"%s: cannot load font %s -- continuing\n",
X				progname, font);
X	}
X}
END_OF_facedisp.c
if test 9424 -ne `wc -c <facedisp.c`; then
    echo shar: \"facedisp.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f raster.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"raster.c\"
else
echo shar: Extracting \"raster.c\" \(6508 characters\)
sed "s/^X//" >raster.c <<'END_OF_raster.c'
X/***************************************************************************\
X * File name:		raster.c					   *
X *									   *
X * Purpose:		Library of functions used to address individual    *
X *			pixels in the UNIX-pc video display using raster   *
X *			operations.					   *
X *									   *
X *			rast_init() - Startup raster functions and open    *
X *				a window to work with.			   *
X *			rast_clear() - Clear the raster bitmap.  Called    *
X *				automatically when rast_init() is called.  *
X *			rast_point() - Set or reset a point in the bitmap  *
X *			rast_paste() - Paste the bitmap to the display     *
X *			rast_close() - Close and stop the raster functions *
X *			rast_getwin() - Return file descriptor of window   *
X *			rast_getlim() - Return X and Y screen limits       *
X *									   *
X * Programmer:		Gil Kloepfer, Jr.  ICUS Software Systems	   *
X *									   *
X * Revision history:	22-Jun-89  1.0    Program created		   *
X *									   *
X * Restrictions:	This program is specifically written for the       *
X *			UNIX-pc (7300 or 3B1)				   *
X *									   *
X * Copyright/		(C) 1989 Gil Kloepfer, Jr., ICUS Software Systems  *
X * Disclaimer:		All Rights Reserved				   *
X *			Permission is granted to use, copy, or redistribute*
X *			this software provided that this header in its     *
X *			entirety is kept in the source code, that all      *
X *			copyright notices are left intact, and that it is  *
X *			not distributed or used for monetary gain of any   *
X *			kind without the express, written permission of    *
X *			the copyright holder(s).  Furthermore, if this     *
X *			software is modified, all changes should be mailed *
X *			to icus!gil.					   *
X *									   *
X *			The user of this program agrees and understands    *
X *			that this software is distributed on an "as-is"    *
X *			basis, and shall not use this program as the basis *
X *			for any claims, now or in the future, against      *
X *			any individual, organization, or entity.	   *
X\***************************************************************************/
X
X#include <fcntl.h>
X#include <stdio.h>
X#include <sys/window.h>
X
X/*
X * The following 2 defines define some limits of the screen which don't
X * changed, but are defined in lieu of hard coding some cryptic numbers
X */
X
X#define	X_LIMIT		60		/* Max X chunks display can handle */
X#define	Y_LIMIT		288		/* Max Y chunks display can handle */
X
X/*
X * The following variables are control variables for use with the raster
X * display routines only and should not be accessed or modified directly
X * by a user program.
X */
X
Xstatic unsigned short r_image[X_LIMIT][Y_LIMIT];
X
Xstatic unsigned short r_masks[16] = {
X		0x0001,0x0002,0x0004,0x0008,
X		0x0010,0x0020,0x0040,0x0080,
X		0x0100,0x0200,0x0400,0x0800,
X		0x1000,0x2000,0x4000,0x8000 };
X
Xstatic int r_window;	/* Window channel for raster operations */
Xstatic int r_xsize;	/* X-size (in pixels) of the current window */
Xstatic int r_ysize;	/* Y-size (in pixels) of the current window */
Xstatic struct uwdata r_wcntl; /* Window control structure */
Xstatic struct urdata r_rast;  /* Rastop control structure */
Xstatic unsigned short r_data[16];  /* Rastop temp data area */
X
X
X/*
X * Initialize the raster display function package.  This function must
X * be called before the other functions are invoked.
X *
X * xsize and ysize are the size to open the window in pixels
X */
X
Xrast_init(xsize,ysize)
Xint xsize, ysize;
X{
X
X	/* Assign xsize and ysize to their corresponding internal vars */
X
X	r_xsize=xsize;
X	r_ysize=ysize;
X
X	/* Complain if the x or y sizes are outside the legal ranges */
X
X	if (r_xsize > 720 || r_ysize > 288 || r_xsize <1 || r_ysize < 1) {
X		fprintf(stderr,"(rast_init): xs=%d  ys=%d  size out of range\n",
X				r_xsize, r_ysize);
X		exit(2);
X	}
X
X	/* Open the window for raster I/O */
X
X	if ((r_window=open("/dev/window",O_RDWR)) < 0) {
X		perror("window device");
X		exit(2);
X	}
X
X	/* Shut off the cursor so we aren't bothered by the flashing */
X
X	write(r_window,"\033[=1C",5);
X
X	/* Set-up some window parameters, including the size */
X
X	ioctl(r_window,WIOCGETD,&r_wcntl);
X	r_wcntl.uw_x = 0;
X	r_wcntl.uw_y = 0;
X	r_wcntl.uw_width = r_xsize+16;
X	r_wcntl.uw_height = r_ysize+16;
X	r_wcntl.uw_uflags = NBORDER;
X	ioctl(r_window,WIOCSETD,&r_wcntl);
X
X	/* Setup raster operation data structure */
X
X	r_rast.ur_srcbase=NULL;
X	r_rast.ur_srcwidth=0;
X	r_rast.ur_dstbase=NULL;
X	r_rast.ur_dstwidth=0;
X	r_rast.ur_width=16;
X	r_rast.ur_height=16;
X	r_rast.ur_srcop=SRCPAT;
X	r_rast.ur_dstop=DSTSRC;
X	r_rast.ur_pattern=r_data;
X
X	/* Clear out the bitmap */
X
X	rast_clear();
X}
X
X
X/*
X * Clear the raster image arrays
X */
X
Xrast_clear()
X{
X	register int i, j;
X
X	for (i=0; i<X_LIMIT; i++)
X		for (j=0; j<Y_LIMIT; j++)
X			r_image[i][j]=0;
X}
X
X
X/*
X * Set pixel at (x,y) to "val" -- where "val" is either 0 or 1.
X * The x and y values are checked to conform with the size established
X * at initialization time -- and complaints are issued if this boundary
X * is violated
X */
X
Xrast_point(x,y,val)
Xint x, y, val;
X{
X	register int xchnk, ychnk;
X
X	/* Check for inside established boundaries */
X
X	if (x >= r_xsize || x < 0 || y >= r_ysize || y < 0) {
X		fprintf(stderr,"(rast_point): x=%d  y=%d  xm=%d ym=%d  -- out of bounds\n",
X				x, y, r_xsize, r_ysize);
X		exit(2);
X	}
X
X	/* Get the chunk coordinates for this pair */
X
X	xchnk=x>>4;	/* This divides 16 and tosses the remainder */
X	ychnk=r_ysize-y-1;  /* Keep it in cartesian direction */
X
X	/* Set the bit offset within the chunk to the value */
X
X	if (val)
X		r_image[xchnk][ychnk] |= r_masks[x%16];
X	else
X		r_image[xchnk][ychnk] &= ~r_masks[x%16];
X}
X
X
X/*
X * Flush out the raster buffer to the screen.  This will draw the whole
X * raster image that could possibly be stored.  Not the most efficient
X * method in the world, but useful.
X */
X
Xrast_paste()
X{
X	register int i, j, k;
X	int	xchnk;
X
X	xchnk=(r_xsize>>4) + (r_xsize%16 ? 1:0);
X	for (i=0; i<xchnk; i++)
X		for (j=0; j<r_ysize; j+=16) {
X			for (k=0; k<16; k++)
X				r_data[k]=r_image[i][j+k];
X			r_rast.ur_dstx=(unsigned short)(i<<4);
X			r_rast.ur_dsty=(unsigned short)j;
X			ioctl(r_window,WIOCRASTOP,&r_rast);
X		}
X}
X
X
X/*
X * Finish with the raster routines
X */
X
Xrast_close()
X{
X	close(r_window);
X	r_xsize=0;
X	r_ysize=0;
X}
X
X
X/*
X * Return the window channel that is being used for the raster image
X */
X
Xint rast_getwin()
X{
X	return(r_window);
X}
X
X
X/*
X * Return the x and y limits as they were initialized by rast_init, but
X * subtract 1 so they really are the limits.
X */
X
Xrast_getlim(xlim,ylim)
Xint *xlim, *ylim;
X{
X	*xlim=r_xsize-1;
X	*ylim=r_ysize-1;
X}
END_OF_raster.c
if test 6508 -ne `wc -c <raster.c`; then
    echo shar: \"raster.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 1 \(of 2\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 2 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked both archives.
    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

gil@limbic.UUCP (Gil Kloepfer Jr.) (06/30/89)

#! /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 2 (of 2)."
# Contents:  gil
# Wrapped by gil@limbic on Thu Jun 29 22:33:32 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f gil -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"gil\"
else
echo shar: Extracting \"gil\" \(28413 characters\)
sed "s/^X//" >gil <<'END_OF_gil'
XFirstName: Gil 
XLastName: Kloepfer 
XE-mail: icus!limbic!gil 
XTelephone: 516-794-6501 
XCompany: ICUS Software Systems 
XAddress1: 2579 Eighth Street 
XAddress2:  
XCityStateZip: East Meadow, NY  11554 
XDate: Jun 19 1989
XPicData: 108 128 8
XImage: 96 128 8
X
X2C2D2F302F2D2F2F2D2F2F2D2C2C2D29292726262626262729292A
X272C2B2D2C2A2A292A2A29292A2C2B2D2B2F2B2B2C345253362A1D
X4C2F0400000000001A000004161D14122117270C050B1226293034
X48403F47586D707173726C514551483A3A4A5040423B1F1C354663
X73727273727575727576707071706E6E6A6A66676A656666666C6D
X6E706E727270706D6A706D6D6E6C6E7071717373727590BDB15C75
XA05B45191010260F4226164F50553A475C61414434302A4D6E7AA1
X8E86A9BEABE4F8F8F8F8F8CEB2A0BD90808BCFA9A3AC665A738EBF
X7573727878767577757775737273716A6C6A6767676767676C6E6E
X6E70727073706D6E6E686A6E706D6E71757172757271738CAB4D85
X5D462F1C0C101F0000323A53584F6C5A4A56515D3B25272F609389
X90AEAB9795B7F5F8F7F4E7D8A9AC92B19893A7C3A0B68361658886
X7775757276767676787676787571706C686C68676B6A686A6B6E6D
X73707172706E706D6C6E6D6D6E717370717173757371716C4D4547
X4C3B320B0A0C000000104D44656A66575057673B4C31252D4B7387
XA6887B7C9793CEE5ECF4F8F8D4A8ADB0BD9895C7C8A4AE7562788B
X7A787876767775787573757873736E716E6B6B6B6A6A6768686D70
X7070727270716C6B706D6C6D6D6E72737276727373726E66362C4C
X443C320F0206000000003F5360654A715F4641583B4832302C5288
X77737381879BB1F8F8F8F8F8F8B4B7A8BCB69B92CFB2BB89635A88
X787573737376767378777B7776736D6C6D6D686A6A68686B6D6D70
X707073717071706E6E7371716E707172737677727375716719004C
X44461F1C1000000000001D46445F804D5648424655533C27323D57
X707C838088A2D2F8F8F8F8F8F8EAA2C7A6C3B997A0D9AEA9806C7A
X7773767572767773757C78757876706E6C6B686A68676B6D6E6D70
X707672716E6E716E6E6D706E707173727373757572736E704D3F5B
X4C3419242500000000002236514A4D5F4D584F5353384D3C2B2736
X667A808592D1F8F8F8F8F8F8F8F8BF9EC4A2C6B493ABE2D79B926C
X7B78737775777A7B787C7A7A77716E706B6C67686A67676B6E6E70
X717272767275717170706E70717073757575757273736E726C624C
X302D12303A000000001A2F30373C42555F7067454660423B202132
X41727B98D7EEF8F8F8F8F8F8F8F8EFA3A4BD99CAA98BBEF4C89D85
X7877787877787C777C7B777C767571706E68666A6666686C6A716E
X7071726D72716C726E706E72707173717873737576766D6D60312B
X1F121C341C0000000C2C2B2725363C527A50636557413F322F212D
X374F9CC1DCEFF8F8F8F7F8F8F8F8F5CF98A9BB99A86760DAF8ACAE
X7C767773787B7B78777A787B7575756E6E6E6C6B676A6E6D6C6D73
X72737376727571737170717573737A7573767776777376736E3A17
X0C091B1C1D0000002727251F1C20484748786168403B45383B272A
X3A678EC7D2DCE8F3F8F8E9F8F8F8F8D9A49DA68562775C6CEEEFB2
X787A76787D777B777A7A7B7C777770706E6B686B6A6A6C6C707272
X75787675737672736E727272767276787678757A78757373754D14
X0000151B0200001F21201C1914121D3A55615B455C403A45363A2F
X50758392BED2D9E3E5F8EFD2F2DFCCA8967B616C6766765A7ADEC9
X7B787678787A7D7B7C7A7C7A7A7376726E706D6A6B6B6D6C6E7172
X767373757A75767072767371777776767B78777A78777775735F20
X00000F0B000016201C1611101114141F383B525351533F3C484458
X5C6E7D838BBDD4DDE4F1F8C3B3B4B1AC9680636272666A7B6386D4
X7A7B7C7C787C7C7D7B7E807E7C7B7772706B706C706E716E757075
X78767A767577777776727A767A777A7A787A7A78787B7777776B27
X01000200000F1C16140E0E0F15161B191D313C5F50554F4A5C6B6B
X6E68717B8587C1DFE5DEDCE4BDBFB1B3A4897A6560706D938C5D71
X7B7A7B7D7C7B80817D7E807B7C7B767375706C6D6D6D6D70717276
X7677787B7B7A7C787A787A7A77767B7B737B77787A7A77777A7336
X020001000215160E0A07070F161A221C1A24344161538178717870
X77776A77807D81C9D9C1D6F4F8C8B2ACB3A88076666C8D6D807762
X7D7C7A7D7A7B7C7C7D80807D7C7878757572706E70707172737678
X78777A7B7A7A7B7B7678777C76777C7A787C7E7B7B7B787878734D
X000000000F100A060907070A0F1011141F1D24345F9D899E7C6E7E
X6B807C757B7D7883B8D8E2F2F8F8C2C2D7CEA88890755B937E8176
X7D7C7C7D7D7B7C7E7E7E7C7C7C7A777273726E70716E7271737578
X7578787A7A7C7D78767A7A7877767A7B7D7B7C7E7D7A777A7A756B
X1F00000A0B05060A0A0E090C0B0B0F0E111A2131608BA38E9C7767
X7E6B8C817780726A8DCCE1ECF8F8F8C4B3C2C48D787E7A6C787ABC
X7B7B7B78777D7D7D7B817D7B7C7777707573727370707172717677
X777777777C7C777A7B7A7776787A777D7B7C7D7A7C787C7D7A7871
X3A000009020507070907070B0A0F0B0F0E11141B3C618E958C936D
X6B806DA0866C72787C9BD6E2F2F8F8E1CDC6B2989280705F72B0AE
X7B7D7B7C7A7D7D7C7E807E7E7D7B78727272707172727173777776
X77777B78777B777A76767775787678777B7D7B7C7B787B7B7B7A73
X6310090502040601000104060A0A0C0B0E151519173860928D9786
X6C6C8273927A767E7172A9DCEEF7F8F8C6A8AC956D7C7280A1B892
X7E7C7C7E78817C7E8281807E7B7B7B767676767271767173737A77
X787B78807E7A787C7A777A7B7A767C7E7D7D7B7C7E7D7D7E7A7B78
X6B190A0A00000000000000000501090B0E0F141A1B193D6BA08399
X7D70707376AC907C756D76BBE8F4F8F8E1A1B6BB6B779E8BBEA091
X7C7D7B7D7B7B7B808381827E7E7B7677767270717575737573757A
X767A817E7E7C7E7B7B7B7A7B787C7B80827E807E7C7E807C7A7873
X3B0707000000000000000000010404040B0B0F0E121A1B42689780
X9D67637C8B8DB7836E6E6D7AD9EFF4CFB19CA688789DB0B0A1888C
X7B7D807C7D807D817D8380827B7B7B7675757177737377767A7A7C
X7B807B7D7D7E7D7A7C7D787A7C7D7E817D7E817C827C7E7E7A7758
X0F0601000000000000000000000404090E0B0C101011121D4B7386
X71977175909197AB7A6D6B6798D8B69BA2A16C5D77AEAEC79E8C82
X7E7D807D817D85837E837E7E7D7B7A7776777876777A7A77777D7B
X7A7E7D817C80807E7E7D7B7B7B7C80807D7E838182827E7D7D6C22
X0401010000000000040204020506090C0E0B0E14101511111F3D78
X8D8B95787C9E8EA4A9756A615B76939199A29756727EB4A2B2A8A1
X817B7E7B7C7D80837E8682827D7D7B787B7877767677787B7A7C7C
X818182827E807E7D807E7D807E7D7E81828281858082807A773F07
X02020402060706070A07090C090907110E0F121615171617192555
X8C8998908080AC91AD9B725D34458091979EA99B6B62828EADD1C8
X807D7B80807E8285858382867E7D7C7A787777767B76787A787D80
X7D8181818282817D7C818181818282828581838381817D7B560E02
X0202010706090A090A0E0C0F110F10141014141715191A1C211C35
X5D9382A1888386B08DAE7E3F30385B939CABD2C86C6E577295D4F8
X80807E7E7E7E82827E85838385807B777A77777A7A787B7B7C8081
X7E8183818280818085827E828083868081818085817D6D3A0B0500
X0105070906070A0B0E0C0F0F171517141516171B1B1C191A1F201A
X3B679E86A4828289AD776D4130354770B4C7B1C8D160535163A3F8
X827E7E7E828186818586858685817C787E7A78767C777A7A7E8082
X81828286808183828781818082818382838580817B4A190B0B0F15
X1215171211110F100E1211141A1C1B191A1C1D2020241D20242620
X2241759D88A6838073654D5C322A486782A4CFC8B2984856537BC2
X8280818285838385858989878783817D7D7C7C787B7E7D7A7C7D7E
X8186858583808285808283828382818381857B622A1914151D2B32
X312F2C27272525261B191A1A1B1A20191C2122222425222527292D
X25225273918D91564A5D564D4432484D5FA3B2ABB3B793615F87B2
X85827E838581868885888B8B89837E7E7A7A7B7B7B7E7C7E7E807C
X8085858783808581838185818582828380753F1B1A222227304048
X443D3A2F2A2931343029211C25221F222424252625252529292B2C
X2B20264B665B5D604A4A60515055354C575C8CA4B9C4B16C70A8C4
X837E8286838986888B89898B898781828081787E7C827E807E8182
X828585878585818183828582828381805F2A1F262F32363C4A4F50
X4A463C35343535444438312725262125262424262B2C2A2D272C2D
X302A201D305650625B4C4C68635C4541475567ABB7ACCCA48DC2CD
X817D838285868B87888C8B8988878282817D7D807E7E807D808081
X8385838B85868685878283828180713821252B3C40425051585B57
X53534D45474C4A484F4B4A3F2F2729272C2C2A2B2A29272F2D2C2C
X312D271C20355A4D66575768754D663A3F56676AADCAA0958D93B4
X8081858383898988898D8C8B8C8986837E80807D81828283818283
X858385888988858682828182816127212F3B3F4D565D655B62616A
X6C675F575A5D60625A5651574635312A2A373A372C2B2F2B2C2B2C
X2F30312A1D263B5D5A866E525F7D4652484F516C7C978887908CA6
X83838282868285898B8C8C8D8B898987807D807C7D808281808286
X868787898B8686888581857E4F22272F374A4D58676D6A6D778083
X7B7C766E7273726E67635F686550463635383F413735312D2F302F
X2F3132342C2736556E5A70675A485B5557465C5652678B868BC9B1
X818283828787898C898C908B908E8B868583858083858585858787
X8989898C8E89868786827C47252932374856626A737D80868C9699
X9E989698989B918B7C7370757566584A44444442413832302C3231
X34313231363232324F7768764F476356534D42474B51778BC3E1D8
X83828282858686888C8B8C8C8C8C88868181808183828581858688
X898C898C8E898B87827E45202B363C3D4D5C656B7685929893989B
XA4ABA7B3B4A9AD998D81737D7E76685A514C4446443C3732303132
X322C2F3737313B36374A60606A51535C514B3B414A4D5BAEE1CCD9
X8581858286878B8B9092908D88898586828581828381858787878C
X8C8B898C8C898B877D4D2227343648515558676E7A91A19C9D9D97
X99A2A9ACACA8A6A39C9887898D7D77726A554C484B48423B353432
X322D31373A36324234325A67766E4851563B4B3D4C5D7A8BBFC7CE
X858885838786878D8D8E8D8D8C898783838683828582858887868B
X8C8C8C8D8D89898557272B31404B525A666D777C88939992898689
X888389929EA2A6ACA8A99D959585817D70675D524F4F4845373837
X322F353137302F404638405D56716844424142576A83837B86C1D3
X828387858985888D89908D918B898B8685818185838383898C858C
X8E908E8C8C88836B303035404C566571767A888D9190827B716760
X5B53535D758B9CA3AEADA9A2998E867E7868605557554D3F453C37
X362D3834353530364C473546684D604741443F71887D837C70A8CC
X858783858788898C8E908E8D908C88858186868689858587898C8E
X8C8B8E8D8D8B7B42383B404B5A6772787C838C91897A6A584D4241
X424241485261778999A3A3AB9C90887E6C70675C58534C4F483F37
X3A35322F3836312D41523B2A38504862484B72768C80807E7D99AD
X8586868788888B908E91918E8E8B8C858585858585868889898C8D
X8E8D918E8C895A383F444B5D6A768182838C8B8975675A5253514F
X4D4C47444748556C85959DA09D989085756D6A5B565358584C423B
X3832342A34362D2D3D4D48302B4550537680889C7B8E778D93A289
X888988868887908E929291918E8E8B88878785868786888B908D91
X9292918E8D7A44404253616B75818D868B8989776B625D666C6E71
X737068605B55565A6B8195999E9C968578736E665757565D4D4236
X3434362F383731323B4C4C3C2A3F6E7CA7BFB9B0B091A89EB19786
X898686898B8B8B8D92929092918E8E8D8989898987898B8C8B8B92
X9393928E8C5B4548475C687B81878C82777B787067615D66777B86
X8E8C7B7273736C6B66718397A0998E878183806C5556585F51443C
X3A32303234352D3635424D452A4A6B958DC9D1DCEEDDDFD7AD8683
X888B8B8B888C8C8E92959595909090898C89898C878C8B8D8E8B8D
X92939291824D48464F5F737E8B877B716E6B675B504F53607C868E
X9B989785756A6A6E6E6C7687929D9092898C85735B565251514841
X3D352F34353232323142474531305B78888CA7C2E8F8F8D78E8389
X8B888887898B8E9091939695938E8C8C89898B898C8E8E918E9291
X979597926C47474B5063737E7B726C605640291D1C201F2C383D40
X3C4C657C7C7C686A727177818E97968D91958E76655152585B4D41
X423A3634363236342F3F474538292C61837591AED2EFC39B8C8987
X89898B878C8E8C8B9196939796928D8E8B8B8C8B8C8D8D8C8D9397
X959692905B44464A525D656866625A4C424855575652504F536068
X5A443638455A5B63666B75818597968891968C7A66525255605850
X473F3A37313535302D42484436220A4C72A1A8B4A0A4908B888B8B
X8D8B898B8C8D8D93919397939892908E8C8C8D8B8E90908E979393
X9698968B4D464644505253534F4F4A4A53636671706D6D787C807E
X807A68605044362C2F384A6B808789879891897A70565756585D5B
X4F443A3531352D3132474740372200157CACABBEA3918E8D8D8C8C
X8B88908C908C929095959796969C9190918D8C8C92918E91939195
X9593957A4B47464D565A5B4F4244484F5F666B6E625858635D4F4B
X566871777A75715D4B3A2A2C5A7778818E91827A73615C57616A63
X5A4A40363538312D374B474135200000559DC4B2918C8D8C8E8E90
X8C8C8D8D8C91919393969998989B97969090908C8D909293929696
X9597926E585A5D636E706D615348525D656C706D604F413D3D3631
X37465360666C7B827C7B6E5C504F667E8E99938675615B5F636363
X5B4D443B34322D2B3A4B47423114000029ADAC9089898C8D919196
X908D8C9090908E9196969C989C9B9898958E91928E919191969598
X969891676168778088838581715F515B6872706C573D342B1D1719
X2C374257666D777B7D7B736D615A65788392958B7C675A5B666B61
X5C55464037312D2C3D4C423A290F00002073838B888E90909B9897
X8D8C928D8C90929297969B969B9697969392908E95919090939697
X989690666775828899999C978B766258616C6C5F3A272A25262526
X343646555D6D818B867B736C58575B65778E8B8B7C68605B5F666A
X635A4C423631362D3C483F382500000631607B8C898E929196989C
X8D92908D8E8E91959395989B9B9E9796929290919293919597929C
X97998567656C768597A6ABAEA18C7A66626862312236413C3D351F
X363D484F5D6B7E8B959788756A66666B77868C887D6B635D626C6C
X655C50453B36322A3A453F2F1B0000195C73868893939593959798
X8E8D8E8D8E8D9291929697969D9293939192929292939395979899
X9899876A636262686B7D98A4A49C927D6D635237507775665D4A2B
X141C383B41607A909BA6A38D7E756B71787D857D766C68605C6568
X6560554A3C36322B3C443A2C0600004B7A7D8B9093939799929395
X928C8C8E8D8E939392969197969C98959292969295939397969799
X927A90B3A2BDAE8C5A44556B828D8E87716C737899ABA298876346
X2D0F09172C53768CA2A6A4937A70767D81857C7775726C625C616A
X63635348363631313C3C3824000000377D8B8D979699979393928E
X908D8D908D938E9395939693979D99969396979696989596979787
X9C858B767892A0A4A897704A556C757B72688298C1CECDD1C7976C
X6563616665607690958D87767A889395938E8B817A6D6E65635D5F
X615C55473B3C352F2B322A0A0000002A85919298969798968E8D8B
X938D9192928D9392959596989B9B99999596939395989998937787
X9D8C886C7A92A3A7ADAEB8B07D5A727571627195C3DEE4E2D8AE95
X877D7C8B806771908781787E8E9B9D9E9E9B9890807A6D66675F61
X5D5B51443D3D342B161A17000000000E6C9696989C9D9998938D89
X918E908E91909693959696989B9E9B989896959696959B96814F85
X8C87836D788E9DA8ACB8B8BBBCA76E7C765D628DBCD7E7D6BFAC8E
X85898990725C6B76716A63656C7677808E968C8B86806D68615C5C
X58554F443F3B2F2D01010000000011126296969C9E9C9C9B968E89
X969693909195969596969998999D9E99989C979997969593526D85
X8888836A778C9BA0AEB1BCB9B2B79D8777656889B2D4E1CDB7A189
X7C82867B615256576A80836A6B666863625D5D6C7676706B635D58
X57554A47443C34320A150F000000190F6397999B9DA0A09C979390
X939291909092969897999B9BA0999B9D9C9897999896967E477D89
X8D88886B738798A1A9ADABB3AEB3AB91536A5D87ABCADAC4AEA08C
X7876786B4D589BCCDFC8C7CAC6C9CCC6C9CFB48C6676787067615B
X584D4C48414036384553565226000000769E9B9BA1A0A1A09C9B91
X939293939196959797989B9B999DA19C9D999699999892575D8587
X8989836C7782898E96939296A0A3A2956E47567BA8CEDEC2AC9C90
X868B7C5882C1C2C2C6C4C3CED2C6CACDCCC7BBBF87687E7A6D625B
X504B4646443B3847676168706A3A0000899C9BA09EA0A19D9B9798
X8E97969396939697969B9C999E9C9C9C999C9B9797978E4675898C
X8B85766C7C837B716A676E6C7A83928E834D7D78A3D6E2BEA49991
X91805677ACA6B3B6BFC2CACCC7D1D1CACCC6B29C8D5C6D7B6D6658
X52504A4B443D3B516567757C82712010879BA09EA0A2A4A1A19D9B
X9296939593969698999799A29E9C9D9E9C9D9596939582447A8789
X867D5C72877E5F4D50535352576770787D5A536DA4D4DCB89C908C
X7553668797ABB3BCC4C2C2C2BEC3CAC7C4BFAB95827E467D776556
X514F4D4F473F375B68737A8580804F127DA1A4A09DA2A6A6A49E9D
X9296969393969795979C9DA09D9EA09E9C9C9C988D614F3D7E8788
X754B3F7A83704F4D5F656B675B53535B5C533F63AECFD4B99E8B73
X555A8692A2B8BDBBC1BBC3C3C2C4C8C3C1BBA693898347757B6556
X53574F4B443F3F67616883816C7C70428DA3A3A1A6A3A2A3A6A1A1
X989696939691969798A29C9DA1A2A1A19D9998956E1705407E7B68
X3A09346B6C523F455362686B6A6156504B483665B9DCD8BE9B7856
X48708C91A3B1B2B2B1B4B7B9BCC1BDC4BCB7A3988C865B62775F57
X56575347403C407156506D78677E836D9298A4A2A3A0A1A3A6A1A4
X9797959398999B999C999E9EA09EA09BA19E9B95867567415B6547
X100032615D4021273A4A4441565F5B5557502F53B2D6D6C1956042
X56737D83959B9B99989BA3A2A6B1B7BBB9ADA1978E87665A78625A
X555752453A3641766A6B6A6B70737B6D99A4A3A1A6A0A1A0A29EA2
X9896989898979B9998A19DA0A3A3A1A2A0A099988C602A2627111A
X0600355A553D2A1D1F270000000E242F303624418ECCD1C1894C42
X5C67716C6E7378707173787D85969DA7A799938C8886665170615B
X5A58524640354675688B89657387676C9DA6A3A19E9E9DA1A6A0A4
X979695939899999D9C9D9EA0A3A1A3A3A099968B77513724300B00
X0000315157423432240C00000000001117211F2C568EA7905C3F41
X4C5F716C5B5A656C6D686A686C6E788187898D81807E5B566C5B60
X5F5B5746383548626377886D6178776B92A2A1A29E9DA0A7A2A39D
X999796989998999C999E9C9EA0A3A2A2A2A0967741110000202100
X000036465D5B4B464438221711100E10151B383A453F3C2F2A2B44
X3C4A5B6063717C857E81807D766B6166727D8987807C4B5D635C62
X6861574432303C47616E867E5B70826A919EA9A7A4A3A3A2A4A2A1
X9896969599999898999C9D9EA2A2A7A3A19677340B00000000241F
X16153D42676C6A6C5C47463A2921201F1F203A608390815D504848
X3422293836465F655750535F6C6D5D5263778E978776385F535863
X615C4F3C211F263B4760715D57667A678DA8ACA3A4A2A6A3A8A7A1
X979B9697959D9D9B9D9C9EA2A6A4A6A79D83553105000000000000
X1D3246475A677078787065503A2B262A3D4D588099B2BEB17D3446
X3B2224292D2C313F0C06010B214142414F6C95A3975C0B2635525B
X615C46251707152C35403841556D6D6D87A8A9A2A4A6A7A3A9A69E
X979796989B9C99979B9C9C9EA4A6A7A4997D582400000000000000
X10323B6298A0806A5D576B634C3B3C6197737085929EA0A08B423D
X3D2D2D36352D2B1904020700021D243A4F68889C915F2F421F4252
X57533A0F000000170F102B51626D656E81ADA4A4A7A6A7ABA9A2A3
X9899999398989C9C9B99A19DA9ABA4A4A2885D1000000000000000
X193F3F191D2935425044716D7A879DA6B2BDCFC9C4B9AB9C91733D
X373B373B464532373F302A222F38424F6671838C5C4D7D6B3F2F36
X454C26000000000000194C60655F676782A8A7A7A4A7A7A9A9A6A2
X9798969899999899979BA0A2A7A6A7A49C8C460000000000000004
X2C555A45444031201B17192632476083A0AEC3D1E3EAE7D2C3B89D
X5F504F48465D6A68666B66615B5A61666E767D5636737D726B472C
X2A2600000000000000002A525C5265607EA8A1A6A6A7ABA8A8A9A2
X9898989796999C999EA0A4A2ABA6A6A69983300000000000000000
X35576B7786958B7C757C818093A4B3C4C8CDD1D4D6D4C8C6B79C7D
X7D8797AE985A6B7A7B7B7C7C76756C686B71785267727075726A51
X220200000000000000000035514D53567CA4ACAEABABA4A9ABA6A0
X99959299979B999B99A0A0A1A6ABABA6977C1F0000000000000007
X4463728196A9B0B9C4C7D2D7DEDDE5E5E4E8EAE8E9E5DED4C6A181
X6B614738354270929163474A4B5F65AC9C88685B5A6B7178766D60
X3F04000000000000000000193B3B444B80A8ADA8A7A8ABABA7A9A6
X96969895989898979CA0A0A4A4A7A9A697720B0000000000000010
X4D6C8087A2ADB8C1CCD4E1ECEAF3F7F8F8F8F8F8F8F8F1E9E2CAA9
X90896C45201614192B4868858C8D837567574446516A7377726B63
X3A06000000000000000000001C2A2D478BA9A9A9A3A7ABACA8A7A6
X98939895969996999C9EA1A1A1A4A7A28B47000000000000000017
X5272858EA4B2BBC4D1D7E4EEF3F7F8F8F8F8F8F8F8F8F8F8F8F2DE
XD7CDB899623829201D2022384D5650412D24294C68737678706653
X290000000000000000000000000E204B9EADA6ACACABA9A9ACA9A8
X979392969B9899999D9EA4A1A3A4A799700F000000000000000012
X4A728792A2B2BDC7CFD7DDE9F1F3F8F3F8F8F8F8F8F8F8F8F8F8F8
XF8F8EEE2DABC9782756752413C3D372B2B36586C6D707675665F46
X14000000000000000000000000002C509DADA7ACA6ACA9A9ACACA8
X939697979999999C9B9C9EA3A6A0A1863C0000000000000000000E
X3D617B92A6B6C1C6D2D4DCE3F2F1F3F1F7F8F8F8F8F8F8F8F8F8F8
XF8F8F8F8F8EEE1DDD3C6B3A2988B7368707071766D70727062503D
X0B0000000000000000000000000000278CA9A9ACADA9ADAEACB0A8
X98999897989999999B9DA2A4A2A09B711F00000000000000000000
X2240587CA7B9C2C7C9CDD7E1E9E9E7EAF1F8F8F8F8F8F8F8F8F8F8
XF8F8F8F8F8F4EDE8E1D8D6CAC3B8A89B897D7678717070685F502C
X050000000000000000000000000000066CA1ACADABACB0AEAEA9AC
X98969795989898A19B9CA09EA0957E4C0E00000000000000000000
X0114315285ACBEC7CCD1D8D6DDE3E2E9F4F8F8F8F8F8F8F8F7F8F8
XF8F8F8F7F7EDEDE8E2DCD7D1CDC3B8AE9887817B75676C675B411D
X020000000000000000000000000000055196ABAEADA9B1B1ADADA8
X9B97979898999C9B9B9DA09E927A53401200000000000000000000
X0000001B4A81B1BEC8D1D8DEDDE2EAEEF8F8F8F8F8F8F8F7F8F5F8
XF8F8F4F3F3E9ECEAE3E8E3DAD2C2B7AC9B8D817875706B63503512
X000000000000000000000000000000004B8EB2B2B1B1B1B4B2ADAD
X979899979B9898989CA09B98855C58371B00000000000000000000
X00000000105097B6C2D1D8E1E3E7EAF7F8F8F8F8F8F8F8F7F8F5F4
XF7F7EFECEAE5E5E5E3E7DFD6CEBFB2A19C8D8980776D65573C1C04
X00000000000000000000000000000000429EAEB1B6B1B4B2B2ACAD
X9B989696969C9B969E9BA19C7241522A1100000000000000000000
X0000000000257AB3C6D1DCE2E3E9F1F8F8F8F8F8F8F8F8F8F7F8F7
XF7F2EEEDE7E8E8E1DEE2D9D6CEC2B2A89E8C837E71665A41210E00
X0000000000000000000000000000000048A4B2B4B2B1B2B0ADB1B1
X95979799999B9897A0A3A0A0723836291F06000000000000000000
X00000000000C67A8C3D6D8DEEAE7F3F8F8F8F8F8F8F8F8F7F8F8F8
XF8F8F5F8EAEAE7E4DCD9D3C8C6B8ACA99E90877A68513C22110A00
X0000000000000000000000000000000E57A9B4ADB2B2B1B1ADAEA8
X9E9B989699999D9C98A1A39D814A3D271F0B000000000000000000
X0000000000004AA0C2D1D8E2DFE8F1F8F8F8F8F8F8F8F3F1F3F8F8
XF8F8F8F8F3EEE1DAD3D3CECAC3AEA6A2999189775F3A2621110000
X000000000000000000000000000000247CACB3B2AEAEB0AEAEADAE
X9D9D9B9D9D999EA1A09EA2A29B775C2D2212010000000000000000
X000000000004388EBDCFD7DADFE1E7F8F8F8F8F8F8F8F3EFF4F7F8
XF8F8F8F2F1E8DECFCCCCC4C6B1ABA799919288704D37261D0B0000
X0000000000000000000000000000003598B2B4B3ABB0B3AEB1AEAB
X96989B9C9E999EA1A1A3A3A6A09E85522B1A0E0400000000000000
X0000000000123C7DAED1D9E2E5E7E7E7EFF5F8F8F8F8F8F7F5F8F8
XF4F7F8EFEEE1D7C9CDD3D7C8C3AB998C7E7E735D473524120B0100
X00000000000000000000000000000F45B6BBB6B2AEB3B1B1AEA9AC
X95969C989D9E9C9DA2A3A7A6A7A896512417160E00000000000000
X00000000041944769DBBCEDCDFDAD9E1E8E8F3F8F8F8F7F8F3F8F8
XF8F4F8F1E7DAC2CCD1D2D1C7BBAB95877A716858422F1A0F000000
X00000000000000000000000000000A58BEB8B1B6B7B4B2B0AEB1A8
X96969899989D9E9EA3A3A3A7A7A7955D341914140E000000000000
X00000100001A457392A6B9C6C7C4C6CED7DAE3E8EEEFECEFF1F2F5
XF7F5F2ECDCCAC6C9C3C2C1B8ADA389816E634F4237241405000000
X00000000000000000000000000000060BBB4B3B4B0B0AEB0B4ACAC
X9B9998979B999E9DA4A6A6A7ADAB9D71423A1A2A16000000000000
X0000000000053A667E8C92999E9B9EA9ADB7C7C7CDD4D6DCE3E7E5
XECEEEEE9D9C1C9C3BEBBB4AEA9A086685045413D2C201101000000
X00000000000000000000000000001B7EB9B7B9B6B7B4B6B6B0B1A9
X99959798979D9D9EA2A3A8A9ADABA79971522D2D140A0400000000
X0000000000000F354551514D4B484A5562717C8B98A9B1B9C6CFD7
XD6DDDFD7C6B4C1C1BDB4B0ADA18C6C4B3A2C2D2C21121611010000
X000000000000000000000000000660A0B7BBB8B7B3B6B6B4B4B0B0
X9698979798989BA2A1A2A8A9B0ABA8A69E86624B17100F00000000
X0000000000000000040A060B070A09101922313D4B5A6E8592A0B0
XBDC3C7BEB7A3ACB6B1A9A69C836A4A3429211F100E060409040000
X000000000000000000000000002298B8BEB9B6B8B6B6B9B7B6B2B4
X9897959C96989EA29EA3A8A6ABA9ABACA9A08C5B271B0C00000000
X000000000000000000000000000000000000000A101A21364D6177
X8E9CA1ACABA1B3B4A49C8B76583C160C1111110E06000107100A00
X000000000000000000000000002998C1BFB9B4B7B8B7B6B4B4B2B2
X9595969698979D9CA2A6A7ADACACB0B2ACA4997E5D441C00000000
X0000000000000000000000000000000000000000000000040A1730
X456372768885989E92817051361A0609090700000000021114170C
X020000000000000000000000002CA1BCC4B8BCB6B6B8B6B2B6B3B3
X9595969997989E9EA4A6A3A7ADAEB2AEADADA4998B6C3B00000000
X000000000000000000000000000000000000000000000000000000
X061B2D3F485D707B7B6A533A260702050000000002090B0F0C160E
X100000000000000000000000003CA3B7BCBCBCBDB7B8B4B7B7B7B7
X97959698999D9D99A1A0A3A9ACADB0B4B1A6ACA8957D5F15000000
X000000000000000000000000000000000000000000000000000000
X00000007172C3D5055422B21160404000000000000000C120F1517
X110C000000000000000007000C5BA3BEC2BEB9B6BCB7B7B9B4B4B7
X93969797999CA0A0A2A0A6A8ADB0B0B4ACAEACA898817029000000
X000000000000000000000000000000000000000000000000000000
X000000000009141D291D1616120700000000000000050E25342D19
X1912110B0E050500000916102676C6C3C3BCBBB3BBB3B9BBBBB7B4
X9C989B9B9CA09DA1A3A4A4ACB1B1AEB2B2B2B1ACA9977850050000
X00000000000605020A0E0500000200000000000000000000000000
X000000000000050F12120B120E0B06050100070E1B26223F55463A
X1B16140B0A0B1A100B1600002F81BEC2BFB9B7B8B9B8BBBFBCB7B6
X979D999C9B9E9EA1A1A6A8A9B0B4B4B4B1B4B2A9B09E9776350400
X0E0B060114190B050E070000000000000000000000000000000000
X000000000000011217201D292D2D190A06111A161414151B2A2A2C
X2B1B101A1D38261C1F1100001778BFC2BFB9BCBBB9BBB9BCB7B7B2
X9D9D9BA09D9DA1A09EA9A9ADB2B6B6BCBBB2AEACACA3A28D672F12
X16172630403D2A2C14020000000000000000010000020000000000
X000000000000051225452D1A191012111B090600000A274A45472C
X27221C2C35453A37472A00001685BDC1C2BEBDBCB8BBBCBDB8B8B4
X9E9C9E9E9B9CA2A0A2A6ABABB2B2B4B8B1B2B2B2ABA8A79D8B5D2B
X1B2136485151241D010001040B0000040202000409041110020000
X0000010000000C0C1640472C221C17141614110A1216212F387558
X53535B4A4A4244557153150041A2BEC2C1BDBCB9BBBEB7B9BCB6B4
X9C9DA09CA1A2A2A0A6A8A6B1B4B6B8B3B7B7B6B0ACABA9A89E9256
X241D24191D10012101040400000011222A1D2138483F1C07110206
X120C00000000000007224A563D29201C14101414101520221C3545
X60657567536060586267312C8CBBC2C6C1BDBEBDBCBCB9BDBBB9B8
XA19DA19E9D9EA3A2A7A6ACB2B1B3B6B8B8B4B1B0ABACACABADA08B
X5C26050004000C0C0B07000000000010120C010E0B000007141F15
X1200000000000000000E346E6567352C2525252625321A10121117
X453648607789605A61784B5FB8BFC1C1C2C1BDBCBDC1C3BCBBB7B4
XA0A09CA09B9EA2A2A6A7A8B0B3B4B4B7B7B4B2B1B3B3AEAEADA4A1
X886D3D1D2C15000000000000000000101A1D1C141011293B48372B
X0000000000000000000014293D6A5A4541414431171A07090F192C
X2D3D585F86887A86938B6799C9C6C4C6C4BFBDBEBDBDBEBDC1BFB7
X9E9E9E9B9E9DA1A1A3A7A8AEB4B4B7B8B7B4B0B3AEADADB2ACB1AC
XAC9772533C2D21050706000000000A05153A31305288A07C662C09
X0000000000000000000000000F424B70868261441C161C25222422
X2948737A969EA4B2A7A0A1BCCCCDC3CAC4C1BDBFBDBEC1C1C1BBBC
XA29C9D9E9E9EA1A1A9A7A9AEB4B1B6B4B7B4B4B3B1AEB0ADB1B3AE
XADA4977853363A20222F2515060000001222273046688C67383848
X2D14060000000000000000000000245A8290895F51444431271D2B
X50757E93A3AEBCBFB7ADBCC6C9CCCACCC1C4C2BFBFBFBFC3C3BEBB
XA0A09B9D9E9DA0A6A2A1A8B0AEAEB3B7B7B8B7B3B6B6B7B6B3B4B1
XB0B0A490865D71606E6E582C050000111F061D262C3A557C788582
X5A200400040600020000000000000E275F8EA3B190716652422F45
X667B8DA1A4B1B9C2B6BECAC9CDCACEC7C6C4C3BEBFC1C3C3C1C2BE
XA19C9E989E9D9EA1A4A8ABB0ADB6B1B8BBB6B7B4B4B1B3B4B2B6B4
XB2B2AEA19D92977E6A4D36410B00090F020005171F2B414D5C707D
X7B75371B1209141401000004101522304A6383A7AE9C925A4A4F65
X7C7E97A0ABB1B9BFC1C9CDCCCFCACECAC8BEC2BEBFC1C2C4C4BEBF
XA09EA0A19EA1A0A4A7A9A9AEB2B7B8B7B6B6B3B7B7B3B3B7B4B6B3
XB2B1ABA8A39EA197776B4B4B3C0F1B100A00000000152D24245A7B
X827646301C141F0F14100B161C2640607A829BC3CDB4A67E767583
X85939B9DADAEB6BFC4CACACFCFCECCCCC8C3C1C6BDC1BCBEC1C3C3
XA39DA09EA0A39EA2A4A8A8B0B3B3B7B9BDB9B8B9B3B0B6B6B3BBB7
XB7B3B0ABA9A3A29C96987B655C55402A24190B0000001A2C5B97BE
XD7C79C624C372D1A262D221D3738466381A2BBD3E4BFADA18D8B90
X93939D9EA7B4BCC1C4CACDCCD1CECECACEC4C2C1C2C1BFBFC3BEBB
XA2A09E9D9EA0A2A0A6A8A8ADB3B6B9B8B9BCB8B7B4B9B7B7B6B8B8
XB4B3ACABA4A4A4A3A7B09B7E7A4740383D34271A00001229446A93
XC6B8A39B80634B3D323637485A5F678995A8B7D3CEC9B4A39D9992
X959599A2A9B3BCC2C9CDCDD2CECECECAC9C2C4C3C1BFC3BDC3C2BE
X9DA3A39D9EA09DA1A3A7A7ACB0B2B7B8BBBCBCB8B7B8B7BBB6B4B6
XB2B3B1ACA6A8A6ABA7ACA1A38E785536304C372F2F271F22262B40
X75ACF7F1D39B6851465A5A8099A6ADA8BBB8C6D8E2D4BEB2B2A199
X959799A3A6B0BEC2CACDCDD1D1D2CCCACCC7C6BFBFC1BFC3C2BEBC
XA1A09EA19C9D9EA1A4A6A9B0B0B7B8BCBEBBBCB8B7B8B4B3B4B9B9
XB4B4B0ADABA9A4A9A9A49CABAB9E803F100E291B3F727655416180
XA8D9F8F8C6ADADA08873A3BFC8BBCFCFCCCFC8C7C2BBB9B0A6A098
X969397A2A9B1B9C1C8CACFCED1CFCCCAC8C9C4BFC2BEBEBFC2C2BE
XA09EA0A0999E9DA4A6A9A8ACADB6B6B9BEB8B9B7B4B7BCB8B6B9B8
XB4B1ADB0A9A8A2A8A4ABAEA89EA0956E36272B3A4458837E585B86
XCAF8F8F8F5EAD9BEB1B6CDDFCED4DADFD8D1CFC7C1BCB7B0A79999
X959798A4A9B0B9C1C4C9CFD1CDCDCECFC7C9CAC1C1C1BEC1C2BFBE
X9DA1A29C9C9E9CA2A4A3A6A3ACB3B7B4BCBBBDB4B9B6B4B7B2B7B7
XB4B3B3ADA8A3A3A6A3A6ACACA7A8A1987867778989A9CDB7827D9B
XC9F8F8F8EDD8D4D6CFC8D8DCDADCE1DCDAD7D2C6C3C1B7B3A69D95
X929799A2A7B2B8C1C7CACECFCECEC9CDCAC4C2C1BCBCBDBFBEC3BD
X9EA2A1A0A19DA3A2A0A1A4A8ACB2B2B6BBB8BBB8B8B7B8B8B4B4B1
XB7B4B1ADACA8A3A9ABADA4A6A8B8B1A3B3A2A1A8A4B3B7BBAEADB6
XCED7D9D3D1CFD2D4CDD6DFDDDEE5DEE2DED7CCC2C6C4BCB3A29897
X968E969EA7AEB7C1C7D1CDCED1CECDCAC9C8C3C1C3BDBFC3C2BFC1
XA1A6A0A09EA19EA2A4A6A8ADACB0B2B7BBBCBEBDB9B9B4B8B9B8B8
XB4B2ADAEA8A7A3A4ABACACB1BCB4A7ABB0B4AEADBBB6BBBBBCB3BB
XC6BFCFCECCD3D4DCD7D3DDDDE1E8E5DFDDD3D1CFC8C2BCB2A89C99
X979598A0A8B0B6BFC8CACECED3CCD1CFC8C4C6C1C1C2BFC2C1C1C2
XA3A3A09E9DA29EA3A1A4A7ABB0B0B3B9BCBFBBBFBCBFBCB7B9B9B4
XBBB8B1B1A6A7A6A3A8A9ABB1ADB1ADADB1B3B4B0B4BCBDBDBEB7BF
XC7C4C4CDCCD4D4D9DEDADEDFDFE5E7DED9D3CEC6C3C1BBB2A79D95
X95929B9EA7B0BBBDCACACCCED2D1C9CCC8C4C2C1BFBDBEC3BFBEBC
XA3A8A29D9E9EA0A2A1A6A6ACADB6B4B9BCBFC3BFBFBCB9B9B9BCB7
XB7B6B6B1ABA6A4A4A8AEABADB0B1B3B2B0B2B3B4B6BBB8BBBEBEC1
XC2C6C6CDCFD4D9D8DAE1DEE2E4E9E4E1DAD1CAC2BFC2BCB1A9A096
X939B969EA8AEB6C2C7CACDCFD2CDCCCDC8C7C3C1BEC1BDC1BDC2BE
XA3A2A3A29E9CA4A4A3A6ADAEB3B4B4BCC1BEBFBDBEB9B8BCB9BBB9
XB9B4B6ABA9A6A1A9A8ABAEABB3B3B4B4B2B4B6B8B6B8BCBFBCC4B9
XC3C6CCCDD2D6DAD8DDDFDFE1E5E7E5DFD6C9C3BDBCB9B6ADA39D96
X9593979EA3AEB8C1C7CDCCCDCFCECEC8C9C6C4BEC2BFC1C3BCBDBC
XA4A2A4A39EA1A4A7A6A6ABAEB2B6BBB7BFBFBEBCB9BCBBBCB8BBB7
XB8B7B6B1A7A2A4A7ABABADB1B1B2B1B3B6B3B4B8B9BDBBBFC1C1C2
XC4CCD2D2D6DCDCD9D7D9DEDEDFE4DDDDD3CCC3C2BEBBB6ADA79D92
X9293989DA0ACB8C3C4CCCDCFCFCECDCCC4C4C1BFC2BCBDBDBDBBB8
XA4A1A1A29EA2A4A2A7A9B0B0B2B3BBBCBDBFBDBCB9B8B9B7B9B8B9
XBBB3B3B2ABA8A4A4A8A9A9ACB0B0B0B1B2B2B7BBB9BDC4C3C9C3C4
XC7CACCCDD4D7D9D8D9D9D9D6DAD7D9D7D4CCC2C2BEBCB3ADA8A299
X9695919EA3ACB6BCC6C8CDCDC9CFCCC7C8C2C3C1BEC2C3C1BFBCBC
XA4A3A2A4A0A2A1A0A6A9A8B1B2B0B6BCBEBDBCBCBBBDB8B9B9B8BB
XB7B6B4B1A9A3A6A0A8ABACAEABB0B0AEB1B2B6B7B3B9BDC3C3C8C6
XC8C9CDCDD3D3D2D8D4D7CFD2D6D7D6D7CDCDC7C3BDB9B6B2A69E95
X92919599A6ADB6BEC6CAC9CFCDCDCCC8CAC7C1C1BEBFBFBFBEBBB4
XA1A0A2A4A1A3A2A0A4A8B0ADB7B8BBC1B9BFBBBCB9B7B8BDB9BBBB
XBBB4B2AEA9A4A4A1A4ABA8ACACAEAEB0B0B2B3B4BBB9BFC6C6C7C9
XC6C8C9CDD2D2D2D6D6D2D3D6D4D6D7D2D1CACAC6C4BDB9B1A7A396
X908E9399A1ABB8BEC3CAC7CCCDCFD1C9C9C7C6C6C1C1C2C1BFB9B7
XA3A6A4A2A2A0A2A7A4ADACB0B2B8BBBBBDBFC2BCBDBCBCB9BBB9B8
XBCB8B1AEA9A4A0A6A8ABABADADADAEAEB0B4B6B6B6B8BFC3C6C4C4
XC7C8CCCCCECFD3D8D7D8D7D7D2D4D3D7CECAC7C7C3BEB8B6ABA198
X93919598A1ACB7BBC1CECDC8CFCDCCCDCCC3C3C1C4BDC2BFC1BDB7
XA4A2A3A6A3A29EA4A6ACACAEB2B7BDBDBFBEC6BFBFBBBEBCBCBDBB
XBBB7B4B0A9A2A2A0A7A8ABACACB0ACB0B1AEB1B6B4B9BEC1C4C4C3
XC8C7CCCDCFD4D3D8D6DAD9D4CFD6D2D1CDCFC7C6C3BFBFB3ABA19C
X9696969CA2AEB6BEC2C4C9CDCEC8CCCCCAC9C4C2BEBEBCBDBEB9B6
XA3A6A6A1A2A0A2A4A6A9ABB3B4B8B9C3C2C3BFBFBFBFC1BDB9BBC1
XBCB9B8B0ADA6A0A1A7A4ACACA9B0AEB1B2B0AEB3B3BBBFC1C1BFC6
XCCC9CDCECCD6D4D8D8D8D8D4D1CFD3D2D1CEC8C4C1C2BBB4ABA39E
X9795959CA4A9B3BEC6C6CACDCACFCCC7C8C4C1BEBEBFBDBBBEB9B9
XA4A7A8A2A3A2A3A2A4A8A9B0B2B9B9BFBFC3C7C3C2BEBEBBBDBDB8
XB8B7B2AEA8A49EA1A2A8ACABACABB1B1ADACB2B0B3B6BCBEC3C6C7
XCCC7CACFD1D3D4D4D8D2CFD1CAD1D3D1D1CFCAC4C1C1BCB2B1A39B
X9692929B9DA7B4BDC3C3C4C8C9CAC9C9C9C9BFBEC1BEBBB9BEBBB4
XA6A9A7A3A1A29EA6A4A8B1B0B2BDB8BFC4C4C7C4C2C2BDBCBCBDB9
XBBB6B2B1ACA4A4A3A6A8A6ADABABABADB0ADB1B1B6B8BBBFC7C9CC
XCDC9CCCFD3D4D6D2D3D6CFCECFCFD6D6D7D3CAC4C2BEBFB6B0A798
X959193979DABAEB6BEC8C9CCCCCCCCC8C7C2C2C1BBBCB8B8B9BBB6
X
END_OF_gil
if test 28413 -ne `wc -c <gil`; then
    echo shar: \"gil\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 2 \(of 2\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked both archives.
    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